@datagrok/helm 2.1.5 → 2.1.7

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/dist/package.js CHANGED
@@ -1,2498 +1,2 @@
1
- var helm;
2
- /******/ (() => { // webpackBootstrap
3
- /******/ "use strict";
4
- /******/ var __webpack_modules__ = ({
5
-
6
- /***/ "./node_modules/@datagrok-libraries/bio/node_modules/@datagrok-libraries/utils/src/random.js":
7
- /*!***************************************************************************************************!*\
8
- !*** ./node_modules/@datagrok-libraries/bio/node_modules/@datagrok-libraries/utils/src/random.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 */ "randomFloat": () => (/* binding */ randomFloat),
15
- /* harmony export */ "randomInt": () => (/* binding */ randomInt)
16
- /* harmony export */ });
17
- /**
18
- * Generates single random float from 0 to range.
19
- *
20
- * @export
21
- * @param {number} range Max generating value.
22
- * @return {number} A random float generated.
23
- */
24
- function randomFloat(range) {
25
- return Math.random() * range;
26
- }
27
- /**
28
- * Generates single random integer from 0 to range.
29
- *
30
- * @export
31
- * @param {number} range Max generating value.
32
- * @return {number} A random integer generated.
33
- */
34
- function randomInt(range) {
35
- return Math.floor(randomFloat(range));
36
- }
37
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmFuZG9tLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsicmFuZG9tLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7R0FNRztBQUNILE1BQU0sVUFBVSxXQUFXLENBQUMsS0FBYTtJQUN2QyxPQUFPLElBQUksQ0FBQyxNQUFNLEVBQUUsR0FBRyxLQUFLLENBQUM7QUFDL0IsQ0FBQztBQUVEOzs7Ozs7R0FNRztBQUNILE1BQU0sVUFBVSxTQUFTLENBQUMsS0FBYTtJQUNyQyxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7QUFDeEMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogR2VuZXJhdGVzIHNpbmdsZSByYW5kb20gZmxvYXQgZnJvbSAwIHRvIHJhbmdlLlxuICpcbiAqIEBleHBvcnRcbiAqIEBwYXJhbSB7bnVtYmVyfSByYW5nZSBNYXggZ2VuZXJhdGluZyB2YWx1ZS5cbiAqIEByZXR1cm4ge251bWJlcn0gQSByYW5kb20gZmxvYXQgZ2VuZXJhdGVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmFuZG9tRmxvYXQocmFuZ2U6IG51bWJlcik6IG51bWJlciB7XG4gIHJldHVybiBNYXRoLnJhbmRvbSgpICogcmFuZ2U7XG59XG5cbi8qKlxuICogR2VuZXJhdGVzIHNpbmdsZSByYW5kb20gaW50ZWdlciBmcm9tIDAgdG8gcmFuZ2UuXG4gKlxuICogQGV4cG9ydFxuICogQHBhcmFtIHtudW1iZXJ9IHJhbmdlIE1heCBnZW5lcmF0aW5nIHZhbHVlLlxuICogQHJldHVybiB7bnVtYmVyfSBBIHJhbmRvbSBpbnRlZ2VyIGdlbmVyYXRlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJhbmRvbUludChyYW5nZTogbnVtYmVyKTogbnVtYmVyIHtcbiAgcmV0dXJuIE1hdGguZmxvb3IocmFuZG9tRmxvYXQocmFuZ2UpKTtcbn1cbiJdfQ==
38
-
39
- /***/ }),
40
-
41
- /***/ "./node_modules/@datagrok-libraries/bio/node_modules/@datagrok-libraries/utils/src/type-declarations.js":
42
- /*!**************************************************************************************************************!*\
43
- !*** ./node_modules/@datagrok-libraries/bio/node_modules/@datagrok-libraries/utils/src/type-declarations.js ***!
44
- \**************************************************************************************************************/
45
- /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
46
-
47
- __webpack_require__.r(__webpack_exports__);
48
- /* harmony export */ __webpack_require__.d(__webpack_exports__, {
49
- /* harmony export */ "Coordinates": () => (/* binding */ Coordinates),
50
- /* harmony export */ "Matrix": () => (/* binding */ Matrix),
51
- /* harmony export */ "Vector": () => (/* binding */ Vector),
52
- /* harmony export */ "Vectors": () => (/* binding */ Vectors)
53
- /* harmony export */ });
54
- /**
55
- * Denotes a vector of floating poit values.
56
- *
57
- * @export
58
- * @class Vector
59
- * @extends {Float32Array}
60
- */
61
- class Vector extends Float32Array {
62
- }
63
- /**
64
- * Denotes a two-dimensional matrix.
65
- *
66
- * @export
67
- * @class Matrix
68
- * @extends {Array<Vector>}
69
- */
70
- class Matrix extends Array {
71
- }
72
- /**
73
- * Denotes cartesian coordinates.
74
- *
75
- * @export
76
- * @class Coordinates
77
- * @extends {Matrix}
78
- */
79
- class Coordinates extends Matrix {
80
- }
81
- /**
82
- * Denotes an array of arbitrary-typed vectors.
83
- *
84
- * @export
85
- * @class Vectors
86
- * @extends {Array<any>}
87
- */
88
- class Vectors extends Array {
89
- }
90
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZS1kZWNsYXJhdGlvbnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJ0eXBlLWRlY2xhcmF0aW9ucy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7O0dBTUc7QUFDSCxNQUFNLE9BQU8sTUFBTyxTQUFRLFlBQVk7Q0FBRztBQUUzQzs7Ozs7O0dBTUc7QUFDSCxNQUFNLE9BQU8sTUFBTyxTQUFRLEtBQWE7Q0FBRztBQUU1Qzs7Ozs7O0dBTUc7QUFDSCxNQUFNLE9BQU8sV0FBWSxTQUFRLE1BQU07Q0FBRztBQUUxQzs7Ozs7O0dBTUc7QUFDSCxNQUFNLE9BQU8sT0FBUSxTQUFRLEtBQVU7Q0FBRyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogRGVub3RlcyBhIHZlY3RvciBvZiBmbG9hdGluZyBwb2l0IHZhbHVlcy5cbiAqXG4gKiBAZXhwb3J0XG4gKiBAY2xhc3MgVmVjdG9yXG4gKiBAZXh0ZW5kcyB7RmxvYXQzMkFycmF5fVxuICovXG5leHBvcnQgY2xhc3MgVmVjdG9yIGV4dGVuZHMgRmxvYXQzMkFycmF5IHt9XG5cbi8qKlxuICogRGVub3RlcyBhIHR3by1kaW1lbnNpb25hbCBtYXRyaXguXG4gKlxuICogQGV4cG9ydFxuICogQGNsYXNzIE1hdHJpeFxuICogQGV4dGVuZHMge0FycmF5PFZlY3Rvcj59XG4gKi9cbmV4cG9ydCBjbGFzcyBNYXRyaXggZXh0ZW5kcyBBcnJheTxWZWN0b3I+IHt9XG5cbi8qKlxuICogRGVub3RlcyBjYXJ0ZXNpYW4gY29vcmRpbmF0ZXMuXG4gKlxuICogQGV4cG9ydFxuICogQGNsYXNzIENvb3JkaW5hdGVzXG4gKiBAZXh0ZW5kcyB7TWF0cml4fVxuICovXG5leHBvcnQgY2xhc3MgQ29vcmRpbmF0ZXMgZXh0ZW5kcyBNYXRyaXgge31cblxuLyoqXG4gKiBEZW5vdGVzIGFuIGFycmF5IG9mIGFyYml0cmFyeS10eXBlZCB2ZWN0b3JzLlxuICpcbiAqIEBleHBvcnRcbiAqIEBjbGFzcyBWZWN0b3JzXG4gKiBAZXh0ZW5kcyB7QXJyYXk8YW55Pn1cbiAqL1xuZXhwb3J0IGNsYXNzIFZlY3RvcnMgZXh0ZW5kcyBBcnJheTxhbnk+IHt9XG5cbi8qKlxuICogRGVub3RlcyBhIGRpY3Rpb25hcnkgY29udGFpbmluZyBmdW5jdGlvbiBvcHRpb25zLlxuICpcbiAqIEBleHBvcnRcbiAqIEB0eXBlIE9wdGlvbnNcbiAqL1xuZXhwb3J0IHR5cGUgT3B0aW9ucyA9IHtbbmFtZTogc3RyaW5nXTogYW55fTtcblxuLyoqXG4gKiBEZW5vdGVzIGN1c3RvbSBkaXN0YW5jZSBtZXRyaWMgYmV0d2VlbiB0aGUgdHdvIGdpdmVuIHZlY3RvcnMuXG4gKlxuICogQGV4cG9ydFxuICogQHR5cGUgRGlzdGFuY2VNZXRyaWNcbiAqIEBwYXJhbSB7YW55fSB2MSBUaGUgZmlyc3QgdmVjdG9yLlxuICogQHBhcmFtIHthbnl9IHYyIFRoZSBzZWNvbmQgdmVjdG9yLlxuICogQHJldHVybiB7bnVtYmVyfSBEaXN0YW5jZSBiZXR3ZWVuIHRoZXNlIHR3byB2ZWN0b3JzLlxuICovXG5leHBvcnQgdHlwZSBEaXN0YW5jZU1ldHJpYyA9ICh2MTogYW55LCB2MjogYW55KSA9PiAobnVtYmVyKTtcblxuLyoqXG4gKiBEZW5vdGVzIGEgc2ltcGxlIHN0cmluZyB0byBzdHJpbmcgZGljdGlvbmFyeS5cbiAqXG4gKiBAZXhwb3J0XG4gKiBAdHlwZSBTdHJpbmdEaWN0aW9uYXJ5XG4gKi9cbmV4cG9ydCB0eXBlIFN0cmluZ0RpY3Rpb25hcnkgPSB7W2tleTogc3RyaW5nXTogc3RyaW5nfTtcbiJdfQ==
91
-
92
- /***/ }),
93
-
94
- /***/ "./node_modules/@datagrok-libraries/bio/node_modules/@datagrok-libraries/utils/src/vector-operations.js":
95
- /*!**************************************************************************************************************!*\
96
- !*** ./node_modules/@datagrok-libraries/bio/node_modules/@datagrok-libraries/utils/src/vector-operations.js ***!
97
- \**************************************************************************************************************/
98
- /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
99
-
100
- __webpack_require__.r(__webpack_exports__);
101
- /* harmony export */ __webpack_require__.d(__webpack_exports__, {
102
- /* harmony export */ "argSort": () => (/* binding */ argSort),
103
- /* harmony export */ "assert": () => (/* binding */ assert),
104
- /* harmony export */ "calcDistanceMatrix": () => (/* binding */ calcDistanceMatrix),
105
- /* harmony export */ "calculateEuclideanDistance": () => (/* binding */ calculateEuclideanDistance),
106
- /* harmony export */ "fillRandomMatrix": () => (/* binding */ fillRandomMatrix),
107
- /* harmony export */ "genRange": () => (/* binding */ genRange),
108
- /* harmony export */ "getDiverseSubset": () => (/* binding */ getDiverseSubset),
109
- /* harmony export */ "normalize": () => (/* binding */ normalize),
110
- /* harmony export */ "setDifference": () => (/* binding */ setDifference),
111
- /* harmony export */ "transposeMatrix": () => (/* binding */ transposeMatrix),
112
- /* harmony export */ "vectorAdd": () => (/* binding */ vectorAdd),
113
- /* harmony export */ "vectorDotProduct": () => (/* binding */ vectorDotProduct),
114
- /* harmony export */ "vectorLength": () => (/* binding */ vectorLength)
115
- /* harmony export */ });
116
- /* harmony import */ var _type_declarations__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./type-declarations */ "./node_modules/@datagrok-libraries/bio/node_modules/@datagrok-libraries/utils/src/type-declarations.js");
117
- /* harmony import */ var _random__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./random */ "./node_modules/@datagrok-libraries/bio/node_modules/@datagrok-libraries/utils/src/random.js");
118
-
119
-
120
- /**
121
- * Asserts a condition by throwing an Error.
122
- *
123
- * @export
124
- * @param {boolean} [condition=false] Condition to assert.
125
- * @param {string} [message='Assertion error.'] Message to output.
126
- * @throws {Error}
127
- */
128
- function assert(condition = false, message = 'Assertion error.') {
129
- if (!condition)
130
- throw new Error(message);
131
- }
132
- /**
133
- * Creates new two-dimensional array and fills it with the value given.
134
- *
135
- * @param {number} dimension1 The first dimension of the coordinates (number of rows).
136
- * @param {number} dimension2 The second dimension of the coordinates (number of columns).
137
- * @param {number} [fill=0] A value to fill the coordinates with.
138
- * @return {Coordinates} A two-dimensional filled with the value given.
139
- * @todo Might be slow since used Array.map. Probably needs performance revision.
140
- */
141
- function initCoordinates(dimension1, dimension2, fill = 0) {
142
- return new Array(dimension1).fill(fill).map(() => (new _type_declarations__WEBPACK_IMPORTED_MODULE_0__.Vector(dimension2).fill(fill)));
143
- }
144
- /**
145
- * Transpose matrix.
146
- *
147
- * @export
148
- * @param {Matrix} matrix The matrix to be transposed.
149
- * @return {Matrix} Transposed matrix.
150
- * @todo Might be slow since used Array.map. Probably needs performance revision.
151
- */
152
- function transposeMatrix(matrix) {
153
- return new Array(matrix[0].length).fill(0)
154
- .map((_, i) => (new _type_declarations__WEBPACK_IMPORTED_MODULE_0__.Vector(matrix.length).fill(0).map((_, j) => (matrix[j][i]))));
155
- }
156
- /**
157
- * Adds two vectors with the second one to be multiplied by the given ratio.
158
- *
159
- * @export
160
- * @param {Vector} p The first vector to add.
161
- * @param {Vector} q The second vector to add.
162
- * @param {number} [multiplier=1] A multiplier to be used before the second vector is added.
163
- * @return {Vector} New vector contained the result of operation p+multiplier*q.
164
- */
165
- function vectorAdd(p, q, multiplier = 1) {
166
- const nItems = p.length;
167
- assert(nItems == q.length, 'Vector lengths do not match.');
168
- const total = new _type_declarations__WEBPACK_IMPORTED_MODULE_0__.Vector(nItems);
169
- for (let i = 0; i < p.length; ++i)
170
- total[i] = p[i] + multiplier * q[i];
171
- return total;
172
- }
173
- /**
174
- * Sums the vector's items.
175
- *
176
- * @param {Vector} v The vector to be summed.
177
- * @return {number} The vector's items sum.
178
- */
179
- function itemsSum(v) {
180
- let total = 0;
181
- for (let i = 0; i < v.length; ++i)
182
- total += v[i];
183
- return total;
184
- }
185
- /**
186
- * Suqares the vector's items.
187
- *
188
- * @param {Vector} v The vector to square.
189
- * @return {Vector} A new vector containing the original's items squared.
190
- */
191
- function vectorSquare(v) {
192
- const nItems = v.length;
193
- const total = new _type_declarations__WEBPACK_IMPORTED_MODULE_0__.Vector(nItems);
194
- for (let i = 0; i < v.length; ++i)
195
- total[i] = v[i] * v[i];
196
- return total;
197
- }
198
- function vectorLength(v) {
199
- let sqrSum = 0;
200
- for (let i = 0; i < v.length; i++)
201
- sqrSum += v[i] * v[i];
202
- return Math.sqrt(sqrSum);
203
- }
204
- function vectorDotProduct(v1, v2) {
205
- if (v1.length != v2.length)
206
- throw new Error('The dimensionality of the vectors must match');
207
- let prod = 0;
208
- for (let i = 0; i < v1.length; i++)
209
- prod += v1[i] * v2[i];
210
- return prod;
211
- }
212
- /**
213
- * Creates a matrix filled with random floating point values.
214
- *
215
- * @export
216
- * @param {number} dimension1 The first dimension of the matrix.
217
- * @param {number} dimension2 The second dimension of the matrix.
218
- * @param {number} [scale=1.] Max value given by random generator.
219
- * @return {Matrix} A new matrix filled with random floating point values.
220
- */
221
- function fillRandomMatrix(dimension1, dimension2, scale = 1.) {
222
- const matrix = initCoordinates(dimension1, dimension2);
223
- for (let i = 0; i < dimension1; ++i) {
224
- for (let j = 0; j < dimension2; ++j)
225
- matrix[i][j] = (0,_random__WEBPACK_IMPORTED_MODULE_1__.randomFloat)(scale);
226
- }
227
- return matrix;
228
- }
229
- /**
230
- * Calculates Euclidean distance between two vectors.
231
- *
232
- * @export
233
- * @param {Vector} p The first vector.
234
- * @param {Vector} q The second vector.
235
- * @return {number} Euclidean distance between the given vectors.
236
- */
237
- function calculateEuclideanDistance(p, q) {
238
- const diff = vectorAdd(p, q, -1);
239
- const sqdiff = vectorSquare(diff);
240
- const sqdiffSumm = itemsSum(sqdiff);
241
- return Math.sqrt(sqdiffSumm);
242
- }
243
- /**
244
- * Creates a distance matrix using a custom distance function.
245
- *
246
- * @export
247
- * @param {Vectors} data Input vectors to calculate distances.
248
- * @param {DistanceMetric} distance Custom distance function.
249
- * @return {Matrix} Calculated custom distance matrix.
250
- */
251
- function calcDistanceMatrix(data, distance) {
252
- const nItems = data.length;
253
- const matrix = initCoordinates(nItems, nItems, 0);
254
- for (let i = 0; i < nItems; ++i) {
255
- for (let j = i + 1; j < nItems; ++j) {
256
- const d = (data[i] == null) || (data[j] == null) ? 0 : distance(data[i], data[j]);
257
- matrix[i][j] = matrix[j][i] = d;
258
- }
259
- }
260
- return matrix;
261
- }
262
- /** Generates array from a range [begin; end] or [begin; end) if endExclusive. **/
263
- function genRange(begin, end, endExclusive = false) {
264
- const nItems = end - begin + (endExclusive ? 0 : 1);
265
- const series = new Int32Array(nItems);
266
- for (let i = 0; i < nItems; ++i)
267
- series[i] = begin + i;
268
- return series;
269
- }
270
- /**
271
- * Returns order of values as if they are sorted.
272
- *
273
- * @export
274
- * @param {any[]} values Input array.
275
- * @param {boolean} [reverse=false] Whether to return reversed order.
276
- * @return {number[]} The order computed.
277
- */
278
- function argSort(values, reverse = false) {
279
- const sortfn = reverse ? (a, b) => (b[0] - a[0]) : (a, b) => (a[0] - b[0]);
280
- const decor = (v, i) => [v, i]; // set index to value
281
- const undecor = (a) => a[1]; // leave only index
282
- const _argsort = (arr) => arr.map(decor).sort(sortfn).map(undecor);
283
- return _argsort(values);
284
- }
285
- /**
286
- * Returns the indexes of the most diverse objects according to the dist function
287
- * @param {number} length total number of objects
288
- * @param {number} n number of diverse elements to find
289
- * @param {(i1: number, i2: number) => number} dist a function which calculates distance between
290
- * two objects using their indexes
291
- * @returns {number[]} The indexes of the most diverse objects
292
- */
293
- function getDiverseSubset(length, n, dist) {
294
- function maxBy(values, orderBy) {
295
- let maxValue = null;
296
- let maxOrderBy = null;
297
- for (const element of values) {
298
- const elementOrderBy = orderBy(element);
299
- if (maxOrderBy == null || elementOrderBy > maxOrderBy) {
300
- maxValue = element;
301
- maxOrderBy = elementOrderBy;
302
- }
303
- }
304
- return maxValue;
305
- }
306
- const subset = [(0,_random__WEBPACK_IMPORTED_MODULE_1__.randomInt)(length - 1)];
307
- const complement = new Set();
308
- for (let i = 0; i < length; ++i) {
309
- if (!subset.includes(i))
310
- complement.add(i);
311
- }
312
- while (subset.length < n) {
313
- const idx = maxBy(complement.values(), (i) => Math.min.apply(Math, subset.map(function (val, index) {
314
- return dist(i, val);
315
- })));
316
- if (idx) {
317
- subset.push(idx);
318
- complement.delete(idx);
319
- }
320
- }
321
- return subset;
322
- }
323
- /**
324
- * Returns normalized vector
325
- * @param {Vector} data numerical array
326
- */
327
- function normalize(data) {
328
- let mean = 0;
329
- let std = 0;
330
- for (let i = 0; i < data.length; ++i)
331
- mean += data[i];
332
- mean /= data.length;
333
- for (let i = 0; i < data.length; ++i)
334
- std += (data[i] - mean) * (data[i] - mean);
335
- std = Math.sqrt(std / data.length);
336
- for (let i = 0; i < data.length; ++i)
337
- data[i] = (data[i] - mean) / std;
338
- return data;
339
- }
340
- /**
341
- * Finds set difference between two lists.
342
- * @param {any[]} a The first list.
343
- * @param {any[]} b The second list.
344
- * @return {any[]}
345
- */
346
- function setDifference(a, b) {
347
- const bSet = new Set(b);
348
- return Array.from(new Set(a.filter((x) => !bSet.has(x))).values());
349
- }
350
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmVjdG9yLW9wZXJhdGlvbnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJ2ZWN0b3Itb3BlcmF0aW9ucy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQVMsTUFBTSxFQUF1QyxNQUFNLHFCQUFxQixDQUFDO0FBQ3pGLE9BQU8sRUFBQyxXQUFXLEVBQUUsU0FBUyxFQUFDLE1BQU0sVUFBVSxDQUFDO0FBRWhEOzs7Ozs7O0dBT0c7QUFDSCxNQUFNLFVBQVUsTUFBTSxDQUFDLFlBQXFCLEtBQUssRUFBRSxVQUFrQixrQkFBa0I7SUFDckYsSUFBSSxDQUFDLFNBQVM7UUFDWixNQUFNLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0FBQzdCLENBQUM7QUFFRDs7Ozs7Ozs7R0FRRztBQUNILFNBQVMsZUFBZSxDQUFDLFVBQWtCLEVBQUUsVUFBa0IsRUFBRSxPQUFlLENBQUM7SUFDL0UsT0FBTyxJQUFJLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsSUFBSSxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN6RixDQUFDO0FBRUQ7Ozs7Ozs7R0FPRztBQUNILE1BQU0sVUFBVSxlQUFlLENBQUMsTUFBYztJQUM1QyxPQUFPLElBQUksS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1NBQ3ZDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsSUFBSSxNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLE1B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LENBQUM7UUFDbEMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDO0lBRTdDLEdBQUcsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7SUFFbkMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDO1FBQ2xDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxHQUFHLENBQUM7SUFFbkMsT0FBTyxJQUFJLENBQUM7QUFDZCxDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxNQUFNLFVBQVUsYUFBYSxDQUFDLENBQVEsRUFBRSxDQUFRO0lBQzlDLE1BQU0sSUFBSSxHQUFHLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3hCLE9BQU8sS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUM7QUFDckUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7TWF0cml4LCBWZWN0b3IsIENvb3JkaW5hdGVzLCBWZWN0b3JzLCBEaXN0YW5jZU1ldHJpY30gZnJvbSAnLi90eXBlLWRlY2xhcmF0aW9ucyc7XG5pbXBvcnQge3JhbmRvbUZsb2F0LCByYW5kb21JbnR9IGZyb20gJy4vcmFuZG9tJztcblxuLyoqXG4gKiBBc3NlcnRzIGEgY29uZGl0aW9uIGJ5IHRocm93aW5nIGFuIEVycm9yLlxuICpcbiAqIEBleHBvcnRcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW2NvbmRpdGlvbj1mYWxzZV0gQ29uZGl0aW9uIHRvIGFzc2VydC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBbbWVzc2FnZT0nQXNzZXJ0aW9uIGVycm9yLiddIE1lc3NhZ2UgdG8gb3V0cHV0LlxuICogQHRocm93cyB7RXJyb3J9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnQoY29uZGl0aW9uOiBib29sZWFuID0gZmFsc2UsIG1lc3NhZ2U6IHN0cmluZyA9ICdBc3NlcnRpb24gZXJyb3IuJykge1xuICBpZiAoIWNvbmRpdGlvbilcbiAgICB0aHJvdyBuZXcgRXJyb3IobWVzc2FnZSk7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBuZXcgdHdvLWRpbWVuc2lvbmFsIGFycmF5IGFuZCBmaWxscyBpdCB3aXRoIHRoZSB2YWx1ZSBnaXZlbi5cbiAqXG4gKiBAcGFyYW0ge251bWJlcn0gZGltZW5zaW9uMSBUaGUgZmlyc3QgZGltZW5zaW9uIG9mIHRoZSBjb29yZGluYXRlcyAobnVtYmVyIG9mIHJvd3MpLlxuICogQHBhcmFtIHtudW1iZXJ9IGRpbWVuc2lvbjIgVGhlIHNlY29uZCBkaW1lbnNpb24gb2YgdGhlIGNvb3JkaW5hdGVzIChudW1iZXIgb2YgY29sdW1ucykuXG4gKiBAcGFyYW0ge251bWJlcn0gW2ZpbGw9MF0gQSB2YWx1ZSB0byBmaWxsIHRoZSBjb29yZGluYXRlcyB3aXRoLlxuICogQHJldHVybiB7Q29vcmRpbmF0ZXN9IEEgdHdvLWRpbWVuc2lvbmFsIGZpbGxlZCB3aXRoIHRoZSB2YWx1ZSBnaXZlbi5cbiAqIEB0b2RvIE1pZ2h0IGJlIHNsb3cgc2luY2UgdXNlZCBBcnJheS5tYXAuIFByb2JhYmx5IG5lZWRzIHBlcmZvcm1hbmNlIHJldmlzaW9uLlxuICovXG5mdW5jdGlvbiBpbml0Q29vcmRpbmF0ZXMoZGltZW5zaW9uMTogbnVtYmVyLCBkaW1lbnNpb24yOiBudW1iZXIsIGZpbGw6IG51bWJlciA9IDApOiBDb29yZGluYXRlcyB7XG4gIHJldHVybiBuZXcgQXJyYXkoZGltZW5zaW9uMSkuZmlsbChmaWxsKS5tYXAoKCkgPT4gKG5ldyBWZWN0b3IoZGltZW5zaW9uMikuZmlsbChmaWxsKSkpO1xufVxuXG4vKipcbiAqIFRyYW5zcG9zZSBtYXRyaXguXG4gKlxuICogQGV4cG9ydFxuICogQHBhcmFtIHtNYXRyaXh9IG1hdHJpeCBUaGUgbWF0cml4IHRvIGJlIHRyYW5zcG9zZWQuXG4gKiBAcmV0dXJuIHtNYXRyaXh9IFRyYW5zcG9zZWQgbWF0cml4LlxuICogQHRvZG8gTWlnaHQgYmUgc2xvdyBzaW5jZSB1c2VkIEFycmF5Lm1hcC4gUHJvYmFibHkgbmVlZHMgcGVyZm9ybWFuY2UgcmV2aXNpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0cmFuc3Bvc2VNYXRyaXgobWF0cml4OiBNYXRyaXgpOiBNYXRyaXgge1xuICByZXR1cm4gbmV3IEFycmF5KG1hdHJpeFswXS5sZW5ndGgpLmZpbGwoMClcbiAgICAubWFwKChfLCBpKSA9PiAobmV3IFZlY3RvcihtYXRyaXgubGVuZ3RoKS5maWxsKDApLm1hcCgoXywgaikgPT4gKG1hdHJpeFtqXVtpXSkpKSk7XG59XG5cbi8qKlxuICogQWRkcyB0d28gdmVjdG9ycyB3aXRoIHRoZSBzZWNvbmQgb25lIHRvIGJlIG11bHRpcGxpZWQgYnkgdGhlIGdpdmVuIHJhdGlvLlxuICpcbiAqIEBleHBvcnRcbiAqIEBwYXJhbSB7VmVjdG9yfSBwIFRoZSBmaXJzdCB2ZWN0b3IgdG8gYWRkLlxuICogQHBhcmFtIHtWZWN0b3J9IHEgVGhlIHNlY29uZCB2ZWN0b3IgdG8gYWRkLlxuICogQHBhcmFtIHtudW1iZXJ9IFttdWx0aXBsaWVyPTFdIEEgbXVsdGlwbGllciB0byBiZSB1c2VkIGJlZm9yZSB0aGUgc2Vjb25kIHZlY3RvciBpcyBhZGRlZC5cbiAqIEByZXR1cm4ge1ZlY3Rvcn0gTmV3IHZlY3RvciBjb250YWluZWQgdGhlIHJlc3VsdCBvZiBvcGVyYXRpb24gcCttdWx0aXBsaWVyKnEuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB2ZWN0b3JBZGQocDogVmVjdG9yLCBxOiBWZWN0b3IsIG11bHRpcGxpZXI6IG51bWJlciA9IDEpOiBWZWN0b3Ige1xuICBjb25zdCBuSXRlbXMgPSBwLmxlbmd0aDtcblxuICBhc3NlcnQobkl0ZW1zID09IHEubGVuZ3RoLCAnVmVjdG9yIGxlbmd0aHMgZG8gbm90IG1hdGNoLicpO1xuXG4gIGNvbnN0IHRvdGFsID0gbmV3IFZlY3RvcihuSXRlbXMpO1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgcC5sZW5ndGg7ICsraSlcbiAgICB0b3RhbFtpXSA9IHBbaV0gKyBtdWx0aXBsaWVyICogcVtpXTtcblxuICByZXR1cm4gdG90YWw7XG59XG5cbi8qKlxuICogU3VtcyB0aGUgdmVjdG9yJ3MgaXRlbXMuXG4gKlxuICogQHBhcmFtIHtWZWN0b3J9IHYgVGhlIHZlY3RvciB0byBiZSBzdW1tZWQuXG4gKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSB2ZWN0b3IncyBpdGVtcyBzdW0uXG4gKi9cbmZ1bmN0aW9uIGl0ZW1zU3VtKHY6IFZlY3Rvcik6IG51bWJlciB7XG4gIGxldCB0b3RhbCA9IDA7XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCB2Lmxlbmd0aDsgKytpKVxuICAgIHRvdGFsICs9IHZbaV07XG5cbiAgcmV0dXJuIHRvdGFsO1xufVxuXG4vKipcbiAqIFN1cWFyZXMgdGhlIHZlY3RvcidzIGl0ZW1zLlxuICpcbiAqIEBwYXJhbSB7VmVjdG9yfSB2IFRoZSB2ZWN0b3IgdG8gc3F1YXJlLlxuICogQHJldHVybiB7VmVjdG9yfSBBIG5ldyB2ZWN0b3IgY29udGFpbmluZyB0aGUgb3JpZ2luYWwncyBpdGVtcyBzcXVhcmVkLlxuICovXG5mdW5jdGlvbiB2ZWN0b3JTcXVhcmUodjogVmVjdG9yKTogVmVjdG9yIHtcbiAgY29uc3Qgbkl0ZW1zID0gdi5sZW5ndGg7XG4gIGNvbnN0IHRvdGFsID0gbmV3IFZlY3RvcihuSXRlbXMpO1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgdi5sZW5ndGg7ICsraSlcbiAgICB0b3RhbFtpXSA9IHZbaV0gKiB2W2ldO1xuXG4gIHJldHVybiB0b3RhbDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHZlY3Rvckxlbmd0aCh2OiBWZWN0b3IpOiBudW1iZXIge1xuICBsZXQgc3FyU3VtOiBudW1iZXIgPSAwO1xuICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgdi5sZW5ndGg7IGkrKylcbiAgICBzcXJTdW0gKz0gdltpXSAqIHZbaV07XG4gIHJldHVybiBNYXRoLnNxcnQoc3FyU3VtKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHZlY3RvckRvdFByb2R1Y3QodjE6IFZlY3RvciwgdjI6IFZlY3Rvcik6IG51bWJlciB7XG4gIGlmICh2MS5sZW5ndGggIT0gdjIubGVuZ3RoKVxuICAgIHRocm93IG5ldyBFcnJvcignVGhlIGRpbWVuc2lvbmFsaXR5IG9mIHRoZSB2ZWN0b3JzIG11c3QgbWF0Y2gnKTtcbiAgbGV0IHByb2Q6IG51bWJlciA9IDA7XG4gIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCB2MS5sZW5ndGg7IGkrKylcbiAgICBwcm9kICs9IHYxW2ldICogdjJbaV07XG4gIHJldHVybiBwcm9kO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBtYXRyaXggZmlsbGVkIHdpdGggcmFuZG9tIGZsb2F0aW5nIHBvaW50IHZhbHVlcy5cbiAqXG4gKiBAZXhwb3J0XG4gKiBAcGFyYW0ge251bWJlcn0gZGltZW5zaW9uMSBUaGUgZmlyc3QgZGltZW5zaW9uIG9mIHRoZSBtYXRyaXguXG4gKiBAcGFyYW0ge251bWJlcn0gZGltZW5zaW9uMiBUaGUgc2Vjb25kIGRpbWVuc2lvbiBvZiB0aGUgbWF0cml4LlxuICogQHBhcmFtIHtudW1iZXJ9IFtzY2FsZT0xLl0gTWF4IHZhbHVlIGdpdmVuIGJ5IHJhbmRvbSBnZW5lcmF0b3IuXG4gKiBAcmV0dXJuIHtNYXRyaXh9IEEgbmV3IG1hdHJpeCBmaWxsZWQgd2l0aCByYW5kb20gZmxvYXRpbmcgcG9pbnQgIHZhbHVlcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZpbGxSYW5kb21NYXRyaXgoZGltZW5zaW9uMTogbnVtYmVyLCBkaW1lbnNpb24yOiBudW1iZXIsIHNjYWxlOiBudW1iZXIgPSAxLik6IE1hdHJpeCB7XG4gIGNvbnN0IG1hdHJpeCA9IGluaXRDb29yZGluYXRlcyhkaW1lbnNpb24xLCBkaW1lbnNpb24yKTtcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IGRpbWVuc2lvbjE7ICsraSkge1xuICAgIGZvciAobGV0IGogPSAwOyBqIDwgZGltZW5zaW9uMjsgKytqKVxuICAgICAgbWF0cml4W2ldW2pdID0gcmFuZG9tRmxvYXQoc2NhbGUpO1xuICB9XG4gIHJldHVybiBtYXRyaXg7XG59XG5cbi8qKlxuICogQ2FsY3VsYXRlcyBFdWNsaWRlYW4gZGlzdGFuY2UgYmV0d2VlbiB0d28gdmVjdG9ycy5cbiAqXG4gKiBAZXhwb3J0XG4gKiBAcGFyYW0ge1ZlY3Rvcn0gcCBUaGUgZmlyc3QgdmVjdG9yLlxuICogQHBhcmFtIHtWZWN0b3J9IHEgVGhlIHNlY29uZCB2ZWN0b3IuXG4gKiBAcmV0dXJuIHtudW1iZXJ9IEV1Y2xpZGVhbiBkaXN0YW5jZSBiZXR3ZWVuIHRoZSBnaXZlbiB2ZWN0b3JzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY2FsY3VsYXRlRXVjbGlkZWFuRGlzdGFuY2UocDogVmVjdG9yLCBxOiBWZWN0b3IpOiBudW1iZXIge1xuICBjb25zdCBkaWZmID0gdmVjdG9yQWRkKHAsIHEsIC0xKTtcbiAgY29uc3Qgc3FkaWZmID0gdmVjdG9yU3F1YXJlKGRpZmYpO1xuICBjb25zdCBzcWRpZmZTdW1tID0gaXRlbXNTdW0oc3FkaWZmKTtcbiAgcmV0dXJuIE1hdGguc3FydChzcWRpZmZTdW1tKTtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgZGlzdGFuY2UgbWF0cml4IHVzaW5nIGEgY3VzdG9tIGRpc3RhbmNlIGZ1bmN0aW9uLlxuICpcbiAqIEBleHBvcnRcbiAqIEBwYXJhbSB7VmVjdG9yc30gZGF0YSBJbnB1dCB2ZWN0b3JzIHRvIGNhbGN1bGF0ZSBkaXN0YW5jZXMuXG4gKiBAcGFyYW0ge0Rpc3RhbmNlTWV0cmljfSBkaXN0YW5jZSBDdXN0b20gZGlzdGFuY2UgZnVuY3Rpb24uXG4gKiBAcmV0dXJuIHtNYXRyaXh9IENhbGN1bGF0ZWQgY3VzdG9tIGRpc3RhbmNlIG1hdHJpeC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNhbGNEaXN0YW5jZU1hdHJpeChkYXRhOiBWZWN0b3JzLCBkaXN0YW5jZTogRGlzdGFuY2VNZXRyaWMpOiBNYXRyaXgge1xuICBjb25zdCBuSXRlbXMgPSBkYXRhLmxlbmd0aDtcbiAgY29uc3QgbWF0cml4ID0gaW5pdENvb3JkaW5hdGVzKG5JdGVtcywgbkl0ZW1zLCAwKTtcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IG5JdGVtczsgKytpKSB7XG4gICAgZm9yIChsZXQgaiA9IGkgKyAxOyBqIDwgbkl0ZW1zOyArK2opIHtcbiAgICAgIGNvbnN0IGQ6IG51bWJlciA9IChkYXRhW2ldID09IG51bGwpIHx8IChkYXRhW2pdID09IG51bGwpID8gMCA6IGRpc3RhbmNlKGRhdGFbaV0sIGRhdGFbal0pO1xuICAgICAgbWF0cml4W2ldW2pdID0gbWF0cml4W2pdW2ldID0gZDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG1hdHJpeDtcbn1cblxuLyoqIEdlbmVyYXRlcyBhcnJheSBmcm9tIGEgcmFuZ2UgW2JlZ2luOyBlbmRdIG9yIFtiZWdpbjsgZW5kKSBpZiBlbmRFeGNsdXNpdmUuICoqL1xuZXhwb3J0IGZ1bmN0aW9uIGdlblJhbmdlKGJlZ2luOiBudW1iZXIsIGVuZDogbnVtYmVyLCBlbmRFeGNsdXNpdmUgPSBmYWxzZSk6IEludDMyQXJyYXkge1xuICBjb25zdCBuSXRlbXMgPSBlbmQgLSBiZWdpbiArIChlbmRFeGNsdXNpdmUgPyAwIDogMSk7XG4gIGNvbnN0IHNlcmllcyA9IG5ldyBJbnQzMkFycmF5KG5JdGVtcyk7XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBuSXRlbXM7ICsraSlcbiAgICBzZXJpZXNbaV0gPSBiZWdpbiArIGk7XG5cbiAgcmV0dXJuIHNlcmllcztcbn1cblxuLyoqXG4gKiBSZXR1cm5zIG9yZGVyIG9mIHZhbHVlcyBhcyBpZiB0aGV5IGFyZSBzb3J0ZWQuXG4gKlxuICogQGV4cG9ydFxuICogQHBhcmFtIHthbnlbXX0gdmFsdWVzIElucHV0IGFycmF5LlxuICogQHBhcmFtIHtib29sZWFufSBbcmV2ZXJzZT1mYWxzZV0gV2hldGhlciB0byByZXR1cm4gcmV2ZXJzZWQgb3JkZXIuXG4gKiBAcmV0dXJuIHtudW1iZXJbXX0gVGhlIG9yZGVyIGNvbXB1dGVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYXJnU29ydCh2YWx1ZXM6IGFueVtdLCByZXZlcnNlID0gZmFsc2UpOiBudW1iZXJbXSB7XG4gIGNvbnN0IHNvcnRmbiA9IHJldmVyc2UgPyAoYTogYW55W10sIGI6IGFueVtdKSA9PiAoYlswXSAtIGFbMF0pIDogKGE6IGFueVtdLCBiOiBhbnlbXSkgPT4gKGFbMF0gLSBiWzBdKTtcbiAgY29uc3QgZGVjb3IgPSAodjogYW55LCBpOiBudW1iZXIpID0+IFt2LCBpXTsgLy8gc2V0IGluZGV4IHRvIHZhbHVlXG4gIGNvbnN0IHVuZGVjb3IgPSAoYTogYW55W10pID0+IGFbMV07IC8vIGxlYXZlIG9ubHkgaW5kZXhcbiAgY29uc3QgX2FyZ3NvcnQgPSAoYXJyOiBhbnlbXSkgPT4gYXJyLm1hcChkZWNvcikuc29ydChzb3J0Zm4pLm1hcCh1bmRlY29yKTtcbiAgcmV0dXJuIF9hcmdzb3J0KHZhbHVlcyk7XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgaW5kZXhlcyBvZiB0aGUgbW9zdCBkaXZlcnNlIG9iamVjdHMgYWNjb3JkaW5nIHRvIHRoZSBkaXN0IGZ1bmN0aW9uXG4gKiBAcGFyYW0ge251bWJlcn0gbGVuZ3RoIHRvdGFsIG51bWJlciBvZiBvYmplY3RzXG4gKiBAcGFyYW0ge251bWJlcn0gbiBudW1iZXIgb2YgZGl2ZXJzZSBlbGVtZW50cyB0byBmaW5kXG4gKiBAcGFyYW0geyhpMTogbnVtYmVyLCBpMjogbnVtYmVyKSA9PiBudW1iZXJ9IGRpc3QgYSBmdW5jdGlvbiB3aGljaCBjYWxjdWxhdGVzIGRpc3RhbmNlIGJldHdlZW5cbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0d28gb2JqZWN0cyB1c2luZyB0aGVpciBpbmRleGVzXG4gKiBAcmV0dXJucyB7bnVtYmVyW119IFRoZSBpbmRleGVzIG9mIHRoZSBtb3N0IGRpdmVyc2Ugb2JqZWN0c1xuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0RGl2ZXJzZVN1YnNldChsZW5ndGg6IG51bWJlciwgbjogbnVtYmVyLCBkaXN0OiAoaTE6IG51bWJlciwgaTI6IG51bWJlcikgPT4gbnVtYmVyKTogbnVtYmVyW10ge1xuICBmdW5jdGlvbiBtYXhCeSh2YWx1ZXM6IEl0ZXJhYmxlSXRlcmF0b3I8bnVtYmVyPiwgb3JkZXJCeTogKGk6IG51bWJlcikgPT4gbnVtYmVyKSB7XG4gICAgbGV0IG1heFZhbHVlID0gbnVsbDtcbiAgICBsZXQgbWF4T3JkZXJCeSA9IG51bGw7XG5cbiAgICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgdmFsdWVzKSB7XG4gICAgICBjb25zdCBlbGVtZW50T3JkZXJCeSA9IG9yZGVyQnkoZWxlbWVudCk7XG4gICAgICBpZiAobWF4T3JkZXJCeSA9PSBudWxsIHx8IGVsZW1lbnRPcmRlckJ5ID4gbWF4T3JkZXJCeSkge1xuICAgICAgICBtYXhWYWx1ZSA9IGVsZW1lbnQ7XG4gICAgICAgIG1heE9yZGVyQnkgPSBlbGVtZW50T3JkZXJCeTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG1heFZhbHVlO1xuICB9XG5cbiAgY29uc3Qgc3Vic2V0ID0gW3JhbmRvbUludChsZW5ndGggLSAxKV07XG4gIGNvbnN0IGNvbXBsZW1lbnQgPSBuZXcgU2V0KCk7XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkge1xuICAgIGlmICghc3Vic2V0LmluY2x1ZGVzKGkpKVxuICAgICAgY29tcGxlbWVudC5hZGQoaSk7XG4gIH1cblxuICB3aGlsZSAoc3Vic2V0Lmxlbmd0aCA8IG4pIHtcbiAgICBjb25zdCBpZHggPSBtYXhCeShcbiAgICAgIGNvbXBsZW1lbnQudmFsdWVzKCkgYXMgSXRlcmFibGVJdGVyYXRvcjxudW1iZXI+LFxuICAgICAgKGkpID0+IE1hdGgubWluLmFwcGx5KE1hdGgsIHN1YnNldC5tYXAoZnVuY3Rpb24odmFsLCBpbmRleCkge1xuICAgICAgICByZXR1cm4gZGlzdChpLCB2YWwpO1xuICAgICAgfSkpKTtcbiAgICBpZiAoaWR4KSB7XG4gICAgICBzdWJzZXQucHVzaChpZHgpO1xuICAgICAgY29tcGxlbWVudC5kZWxldGUoaWR4KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHN1YnNldDtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIG5vcm1hbGl6ZWQgdmVjdG9yXG4gKiBAcGFyYW0ge1ZlY3Rvcn0gZGF0YSBudW1lcmljYWwgYXJyYXlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZShkYXRhOiBWZWN0b3IpOiBWZWN0b3Ige1xuICBsZXQgbWVhbiA9IDA7XG4gIGxldCBzdGQgPSAwO1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgZGF0YS5sZW5ndGg7ICsraSlcbiAgICBtZWFuICs9IGRhdGFbaV07XG5cbiAgbWVhbiAvPSBkYXRhLmxlbmd0aDtcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IGRhdGEubGVuZ3RoOyArK2kpXG4gICAgc3RkICs9IChkYXRhW2ldIC0gbWVhbikgKiAoZGF0YVtpXSAtIG1lYW4pO1xuXG4gIHN0ZCA9IE1hdGguc3FydChzdGQgLyBkYXRhLmxlbmd0aCk7XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBkYXRhLmxlbmd0aDsgKytpKVxuICAgIGRhdGFbaV0gPSAoZGF0YVtpXSAtIG1lYW4pIC8gc3RkO1xuXG4gIHJldHVybiBkYXRhO1xufVxuXG4vKipcbiAqIEZpbmRzIHNldCBkaWZmZXJlbmNlIGJldHdlZW4gdHdvIGxpc3RzLlxuICogQHBhcmFtIHthbnlbXX0gYSBUaGUgZmlyc3QgbGlzdC5cbiAqIEBwYXJhbSB7YW55W119IGIgVGhlIHNlY29uZCBsaXN0LlxuICogQHJldHVybiB7YW55W119XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXREaWZmZXJlbmNlKGE6IGFueVtdLCBiOiBhbnlbXSk6IGFueVtdIHtcbiAgY29uc3QgYlNldCA9IG5ldyBTZXQoYik7XG4gIHJldHVybiBBcnJheS5mcm9tKG5ldyBTZXQoYS5maWx0ZXIoKHgpID0+ICFiU2V0Lmhhcyh4KSkpLnZhbHVlcygpKTtcbn1cbiJdfQ==
351
-
352
- /***/ }),
353
-
354
- /***/ "./node_modules/@datagrok-libraries/bio/src/aminoacids.js":
355
- /*!****************************************************************!*\
356
- !*** ./node_modules/@datagrok-libraries/bio/src/aminoacids.js ***!
357
- \****************************************************************/
358
- /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
359
-
360
- __webpack_require__.r(__webpack_exports__);
361
- /* harmony export */ __webpack_require__.d(__webpack_exports__, {
362
- /* harmony export */ "Aminoacids": () => (/* binding */ Aminoacids),
363
- /* harmony export */ "AminoacidsPalettes": () => (/* binding */ AminoacidsPalettes)
364
- /* harmony export */ });
365
- /* harmony import */ var _seq_palettes__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./seq-palettes */ "./node_modules/@datagrok-libraries/bio/src/seq-palettes.js");
366
-
367
- class AminoacidsPalettes extends _seq_palettes__WEBPACK_IMPORTED_MODULE_0__.SeqPaletteBase {
368
- static get Lesk() {
369
- if (this.lesk === void 0) {
370
- this.lesk = this.makePalette([
371
- [['G', 'A', 'S', 'T'], 'orange'],
372
- [['C', 'V', 'I', 'L', 'P', 'F', 'Y', 'M', 'W'], 'all_green'],
373
- [['N', 'Q', 'H'], 'magenta'],
374
- [['D', 'E'], 'red'],
375
- [['K', 'R'], 'all_blue'],
376
- ], false, AminoacidsPalettes);
377
- }
378
- return this.lesk;
379
- }
380
- static get GrokGroups() {
381
- if (this.grokGroups === void 0) {
382
- this.grokGroups = this.makePalette([
383
- [['C', 'U'], 'yellow'],
384
- [['G', 'P'], 'red'],
385
- [['A', 'V', 'I', 'L', 'M', 'F', 'Y', 'W'], 'all_green'],
386
- [['R', 'H', 'K'], 'light_blue'],
387
- [['D', 'E'], 'dark_blue'],
388
- [['S', 'T', 'N', 'Q'], 'orange'],
389
- ], false, AminoacidsPalettes);
390
- }
391
- return this.grokGroups;
392
- }
393
- static get RasMol() {
394
- if (this.rasMol === void 0) {
395
- this.rasMol = new AminoacidsPalettes({
396
- // http://acces.ens-lyon.fr/biotic/rastop/help/colour.htm
397
- 'D': '#E60A0A',
398
- 'E': '#E60A0A',
399
- 'C': '#E6E600',
400
- 'M': '#E6E600',
401
- 'K': '#145AFF',
402
- 'R': '#145AFF',
403
- 'S': '#FA9600',
404
- 'T': '#FA9600',
405
- 'F': '#3232AA',
406
- 'Y': '#3232AA',
407
- 'N': '#00DCDC',
408
- 'Q': '#00DCDC',
409
- 'G': '#EBEBEB',
410
- 'L': '#0F820F',
411
- 'V': '#0F820F',
412
- 'I': '#0F820F',
413
- 'A': '#C8C8C8',
414
- 'W': '#B45AB4',
415
- 'H': '#8282D2',
416
- 'P': '#DC9682',
417
- 'others': '#BEA06E',
418
- });
419
- }
420
- return this.rasMol;
421
- }
422
- get(m) {
423
- const resM = m in AminoacidsPalettes.aaSynonyms ? AminoacidsPalettes.aaSynonyms[m] : m;
424
- const res = super.get(resM);
425
- return res;
426
- }
427
- }
428
- /** Only some of the synonyms. These were obtained from the clustered oligopeptide dataset. */
429
- AminoacidsPalettes.aaSynonyms = {
430
- 'MeNle': 'L',
431
- 'MeA': 'A',
432
- 'MeG': 'G',
433
- 'MeF': 'F',
434
- };
435
- class Aminoacids {
436
- static getPalette(scheme = 'grok') {
437
- switch (scheme) {
438
- case 'grok':
439
- return AminoacidsPalettes.GrokGroups;
440
- case 'lesk':
441
- return AminoacidsPalettes.Lesk;
442
- default:
443
- throw new Error(`ChemPalette: scheme \`${scheme}\` does not exist`);
444
- }
445
- }
446
- /**
447
- * Returns divided amino acid with its content in the bracket, if the content is number, then its omitted
448
- *
449
- * @param {string} c raw amino
450
- * @return {[string, string]} outer and inner content
451
- */
452
- static getInnerOuter(c) {
453
- let isInner = 0;
454
- let inner = '';
455
- let outer = '';
456
- for (const char of c) {
457
- if (char == '(')
458
- isInner++;
459
- else if (char == ')')
460
- isInner--;
461
- else if (isInner)
462
- inner += char;
463
- else
464
- outer += char;
465
- }
466
- return !isNaN(parseInt(inner)) ? [outer, ''] : [outer, inner];
467
- }
468
- static getColorAAPivot(monomer = '', scheme = 'grok') {
469
- var _a, _b, _c;
470
- //const chemPaletteInstance = AAPalettes.GrokGroups();
471
- const chemPaletteInstance = this.getPalette(scheme);
472
- let [outerMonomer, innerMonomer] = this.getInnerOuter(monomer);
473
- outerMonomer = (outerMonomer.length > 6 ? `${outerMonomer.slice(0, 3)}...` : outerMonomer);
474
- innerMonomer = (innerMonomer.length > 6 ? `${innerMonomer.slice(0, 3)}...` : innerMonomer);
475
- if (monomer.length == 1 || monomer[1] == '(') {
476
- const amino = (_a = monomer[0]) === null || _a === void 0 ? void 0 : _a.toUpperCase();
477
- return amino in chemPaletteInstance ?
478
- [chemPaletteInstance.get(amino), amino, innerMonomer, 1] :
479
- [this.undefinedColor, outerMonomer, innerMonomer, 1];
480
- }
481
- if (monomer[0] == 'd' && monomer[1] in chemPaletteInstance) {
482
- if (monomer.length == 2 || monomer[2] == '(') {
483
- const amino = (_b = monomer[1]) === null || _b === void 0 ? void 0 : _b.toUpperCase();
484
- return amino in chemPaletteInstance ?
485
- [chemPaletteInstance.get(amino), amino, innerMonomer, 2] :
486
- [this.undefinedColor, outerMonomer, innerMonomer, 2];
487
- }
488
- }
489
- if (monomer.substring(0, 3) in this.AAFullNames) {
490
- if (monomer.length == 3 || monomer[3] == '(') {
491
- const amino = this.AAFullNames[monomer.substring(0, 3)];
492
- return amino in chemPaletteInstance ?
493
- [chemPaletteInstance.get(amino), amino, innerMonomer, 3] :
494
- [this.undefinedColor, outerMonomer, innerMonomer, 3];
495
- }
496
- }
497
- if (((_c = monomer[0]) === null || _c === void 0 ? void 0 : _c.toLowerCase()) == monomer[0]) {
498
- if (monomer.substring(1, 3) in this.AAFullNames) {
499
- if (monomer.length == 4 || monomer[4] == '(') {
500
- const amino = this.AAFullNames[monomer.substring(1, 3)];
501
- return amino in chemPaletteInstance ?
502
- [chemPaletteInstance.get(amino), amino, innerMonomer, 4] :
503
- [this.undefinedColor, outerMonomer, innerMonomer, 4];
504
- }
505
- }
506
- }
507
- return [this.undefinedColor, outerMonomer, innerMonomer, 0];
508
- }
509
- }
510
- Aminoacids.SemType = 'Aminoacids';
511
- Aminoacids.SemTypeMultipleAlignment = 'AminoacidsMultipleAlignment';
512
- Aminoacids.undefinedColor = 'rgb(100,100,100)';
513
- Aminoacids.Names = {
514
- 'G': 'Glycine',
515
- 'L': 'Leucine',
516
- 'Y': 'Tyrosine',
517
- 'S': 'Serine',
518
- 'E': 'Glutamic acid',
519
- 'Q': 'Glutamine',
520
- 'D': 'Aspartic acid',
521
- 'N': 'Asparagine',
522
- 'F': 'Phenylalanine',
523
- 'A': 'Alanine',
524
- 'K': 'Lysine',
525
- 'R': 'Arginine',
526
- 'H': 'Histidine',
527
- 'C': 'Cysteine',
528
- 'V': 'Valine',
529
- 'P': 'Proline',
530
- 'W': 'Tryptophan',
531
- 'I': 'Isoleucine',
532
- 'M': 'Methionine',
533
- 'T': 'Threonine',
534
- };
535
- Aminoacids.AASmiles = {
536
- 'G': 'NCC(=O)O',
537
- 'L': 'N[C@H](CC(C)C)C(=O)O',
538
- 'Y': 'NC(CC1=CC=C(O)C=C1)C(=O)O',
539
- 'S': 'NC(CO)C(=O)O',
540
- 'E': 'N[C@@H](CCC(O)=O)C(=O)O',
541
- 'Q': 'N[C@@H](CCC(N)=O)C(=O)O',
542
- 'D': 'N[C@@H](CC(O)=O)C(=O)O',
543
- 'N': 'N[C@@H](CC(N)=O)C(=O)O',
544
- 'F': 'NC(CC1=CC=CC=C1)C(=O)O',
545
- 'A': 'N[C@H](C)C(=O)O',
546
- 'K': 'NC(CCCCN)C(=O)O',
547
- 'R': 'N[C@H](CCCNC(=N)C)C(=O)O',
548
- 'H': 'NC(CC1=CN=C[N]1)C(=O)O',
549
- 'C': 'N[C@@H](CS)C(=O)O',
550
- 'V': 'NC(C(C)C)C(=O)O',
551
- 'P': 'N(CCC1)C1C(=O)O',
552
- 'W': 'N[C@@H](Cc1c2ccccc2n([H])c1)C(=O)O',
553
- 'I': 'N[C@H]([C@H](C)CC)C(=O)O',
554
- 'M': 'NC(CCSC)C(=O)O',
555
- 'T': 'NC(C(O)C)C(=O)O',
556
- };
557
- Aminoacids.AASmilesTruncated = {
558
- 'G': '*C*',
559
- 'L': 'CC(C)C[C@H](*)*',
560
- 'Y': 'C1=CC(=CC=C1CC(*)*)O',
561
- 'S': 'OCC(*)C*',
562
- 'E': '*[C@@H](CCC(O)=O)*',
563
- 'Q': '*N[C@@H](CCC(N)=O)*',
564
- 'D': '*[C@@H](CC(O)=O)*',
565
- 'N': '*[C@@H](CC(N)=O)*',
566
- 'F': 'C1=CC=C(C=C1)CC(*)*',
567
- 'A': 'C[C@H](*)*',
568
- 'K': 'C(CCN)CC(*)*',
569
- 'R': '*[C@H](CCCNC(=N)C)*',
570
- 'H': 'C1=C(NC=N1)CC(*)*',
571
- 'C': 'C([C@@H](*)*)S',
572
- 'V': 'CC(C)C(*)*',
573
- 'P': 'C1CCN(*)C1*',
574
- 'W': '*[C@@H](Cc1c2ccccc2n([H])c1)*',
575
- 'I': 'CC[C@H](C)[C@H](*)*',
576
- 'M': 'CSCCC(*)*',
577
- 'T': 'CC(O)C(*)*',
578
- };
579
- /** TODO: Full?
580
- */
581
- Aminoacids.AAFullNames = {
582
- 'Ala': 'A',
583
- 'Arg': 'R',
584
- 'Asn': 'N',
585
- 'Asp': 'D',
586
- 'Cys': 'C',
587
- 'Gln': 'Q',
588
- 'Glu': 'E',
589
- 'Gly': 'G',
590
- 'His': 'H',
591
- 'Ile': 'I',
592
- 'Leu': 'L',
593
- 'Lys': 'K',
594
- 'Met': 'M',
595
- 'Phe': 'F',
596
- 'Pro': 'P',
597
- 'Ser': 'S',
598
- 'Thr': 'T',
599
- 'Trp': 'W',
600
- 'Tyr': 'Y',
601
- 'Val': 'V',
602
- };
603
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW1pbm9hY2lkcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImFtaW5vYWNpZHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBS0EsT0FBTyxFQUFhLGNBQWMsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBRTFELE1BQU0sT0FBTyxrQkFBbUIsU0FBUSxjQUFjO0lBRzdDLE1BQU0sS0FBSyxJQUFJO1FBQ3BCLElBQUksSUFBSSxDQUFDLElBQUksS0FBSyxLQUFLLENBQUMsRUFBRTtZQUN4QixJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUM7Z0JBQzNCLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBRSxRQUFRLENBQUM7Z0JBQ2hDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFLFdBQVcsQ0FBQztnQkFDNUQsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsU0FBUyxDQUFDO2dCQUM1QixDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFLEtBQUssQ0FBQztnQkFDbkIsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBRSxVQUFVLENBQUM7YUFDekIsRUFBRSxLQUFLLEVBQUUsa0JBQWtCLENBQUMsQ0FBQztTQUMvQjtRQUNELE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQztJQUNuQixDQUFDO0lBSU0sTUFBTSxLQUFLLFVBQVU7UUFDMUIsSUFBSSxJQUFJLENBQUMsVUFBVSxLQUFLLEtBQUssQ0FBQyxFQUFFO1lBQzlCLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQztnQkFDakMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBRSxRQUFRLENBQUM7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QUFFLEdBQUc7SUFDVixLQUFLLEVBQUUsR0FBRztJQUNWLEtBQUssRUFBRSxHQUFHO0lBQ1YsS0FBSyxFQUFFLEdBQUc7SUFDVixLQUFLLEVBQUUsR0FBRztDQUNYLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBncm9rIGZyb20gJ2RhdGFncm9rLWFwaS9ncm9rJztcbmltcG9ydCAqIGFzIHVpIGZyb20gJ2RhdGFncm9rLWFwaS91aSc7XG5pbXBvcnQgKiBhcyBERyBmcm9tICdkYXRhZ3Jvay1hcGkvZGcnO1xuXG5pbXBvcnQge1N0cmluZ0RpY3Rpb25hcnl9IGZyb20gJ0BkYXRhZ3Jvay1saWJyYXJpZXMvdXRpbHMvc3JjL3R5cGUtZGVjbGFyYXRpb25zJztcbmltcG9ydCB7U2VxUGFsZXR0ZSwgU2VxUGFsZXR0ZUJhc2V9IGZyb20gJy4vc2VxLXBhbGV0dGVzJztcblxuZXhwb3J0IGNsYXNzIEFtaW5vYWNpZHNQYWxldHRlcyBleHRlbmRzIFNlcVBhbGV0dGVCYXNlIHtcbiAgcHJpdmF0ZSBzdGF0aWMgbGVzazogU2VxUGFsZXR0ZTtcblxuICBwdWJsaWMgc3RhdGljIGdldCBMZXNrKCk6IFNlcVBhbGV0dGUge1xuICAgIGlmICh0aGlzLmxlc2sgPT09IHZvaWQgMCkge1xuICAgICAgdGhpcy5sZXNrID0gdGhpcy5tYWtlUGFsZXR0ZShbXG4gICAgICAgIFtbJ0cnLCAnQScsICdTJywgJ1QnXSwgJ29yYW5nZSddLFxuICAgICAgICBbWydDJywgJ1YnLCAnSScsICdMJywgJ1AnLCAnRicsICdZJywgJ00nLCAnVyddLCAnYWxsX2dyZWVuJ10sXG4gICAgICAgIFtbJ04nLCAnUScsICdIJ10sICdtYWdlbnRhJ10sXG4gICAgICAgIFtbJ0QnLCAnRSddLCAncmVkJ10sXG4gICAgICAgIFtbJ0snLCAnUiddLCAnYWxsX2JsdWUnXSxcbiAgICAgIF0sIGZhbHNlLCBBbWlub2FjaWRzUGFsZXR0ZXMpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5sZXNrO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgZ3Jva0dyb3VwczogU2VxUGFsZXR0ZTtcblxuICBwdWJsaWMgc3RhdGljIGdldCBHcm9rR3JvdXBzKCk6IFNlcVBhbGV0dGUge1xuICAgIGlmICh0aGlzLmdyb2tHcm91cHMgPT09IHZvaWQgMCkge1xuICAgICAgdGhpcy5ncm9rR3JvdXBzID0gdGhpcy5tYWtlUGFsZXR0ZShbXG4gICAgICAgIFtbJ0MnLCAnVSddLCAneWVsbG93J10sXG4gICAgICAgIFtbJ0cnLCAnUCddLCAncmVkJ10sXG4gICAgICAgIFtbJ0EnLCAnVicsICdJJywgJ0wnLCAnTScsICdGJywgJ1knLCAnVyddLCAnYWxsX2dyZWVuJ10sXG4gICAgICAgIFtbJ1InLCAnSCcsICdLJ10sICdsaWdodF9ibHVlJ10sXG4gICAgICAgIFtbJ0QnLCAnRSddLCAnZGFya19ibHVlJ10sXG4gICAgICAgIFtbJ1MnLCAnVCcsICdOJywgJ1EnXSwgJ29yYW5nZSddLFxuICAgICAgXSwgZmFsc2UsIEFtaW5vYWNpZHNQYWxldHRlcyk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmdyb2tHcm91cHM7XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyByYXNNb2w6IFNlcVBhbGV0dGU7XG5cbiAgcHVibGljIHN0YXRpYyBnZXQgUmFzTW9sKCk6IFNlcVBhbGV0dGUge1xuICAgIGlmICh0aGlzLnJhc01vbCA9PT0gdm9pZCAwKSB7XG4gICAgICB0aGlzLnJhc01vbCA9IG5ldyBBbWlub2FjaWRzUGFsZXR0ZXMoe1xuICAgICAgICAvLyBodHRwOi8vYWNjZXMuZW5zLWx5b24uZnIvYmlvdGljL3Jhc3RvcC9oZWxwL2NvbG91ci5odG1cbiAgICAgICAgJ0QnOiAnI0U2MEEwQScsIC8vIGFzcCwgYXNwYXJ0aWMgYWNpZCwgYXNwXG4gICAgICAgICdFJzogJyNFNjBBMEEnLCAvLyBnbHUsIGdsdXRhbWljIGFjaWRcbiAgICAgICAgJ0MnOiAnI0U2RTYwMCcsIC8vIGN5cywgY3lzdGVpbmVcbiAgICAgICAgJ00nOiAnI0U2RTYwMCcsIC8vIG1ldCwgbWV0aGlvbmluZVxuICAgICAgICAnSyc6ICcjMTQ1QUZGJywgLy8gbHlzLCBseXNpbmVcbiAgICAgICAgJ1InOiAnIzE0NUFGRicsIC8vIGFyZywgYXJnaW5pbmVcbiAgICAgICAgJ1MnOiAnI0ZBOTYwMCcsIC8vIHNlciwgc2VyaW5lXG4gICAgICAgICdUJzogJyNGQTk2MDAnLCAvLyB0aHIsIHRocmVvbmluZVxuICAgICAgICAnRic6ICcjMzIzMkFBJywgLy8gcGhlLCBwaGVueWxhbGFuaW5lXG4gICAgICAgICdZJzogJyMzMjMyQUEnLCAvLyB0eXIsIHR5cm9zaW5lXG4gICAgICAgICdOJzogJyMwMERDREMnLCAvLyBhc24sIGFzcGFyYWdpbmVcbiAgICAgICAgJ1EnOiAnIzAwRENEQycsIC8vIGdsbiwgZ2x1dGFtaW5lXG4gICAgICAgICdHJzogJyNFQkVCRUInLCAvLyBnbHksIGdseWNpbmVcbiAgICAgICAgJ0wnOiAnIzBGODIwRicsIC8vIGxldSwgbGV1Y2luZVxuICAgICAgICAnVic6ICcjMEY4MjBGJywgLy8gdmFsLCB2YWxpbmVcbiAgICAgICAgJ0knOiAnIzBGODIwRicsIC8vIGlsZSwgaXNvbGV1Y2luZVxuICAgICAgICAnQSc6ICcjQzhDOEM4JywgLy8gYWxhLCBhbGFuaW5lXG4gICAgICAgICdXJzogJyNCNDVBQjQnLCAvLyB0cnAsIHRyeXB0b3BoYW5cbiAgICAgICAgJ0gnOiAnIzgyODJEMicsIC8vIGhpcywgaGlzdGlkaW5lXG4gICAgICAgICdQJzogJyNEQzk2ODInLCAvLyBwcm8sIHByb2xpbmVcbiAgICAgICAgJ290aGVycyc6ICcjQkVBMDZFJyxcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5yYXNNb2w7XG4gIH1cblxuICBwdWJsaWMgb3ZlcnJpZGUgZ2V0KG06IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3QgcmVzTSA9IG0gaW4gQW1pbm9hY2lkc1BhbGV0dGVzLmFhU3lub255bXMgPyBBbWlub2FjaWRzUGFsZXR0ZXMuYWFTeW5vbnltc1ttXSA6IG07XG4gICAgY29uc3QgcmVzID0gc3VwZXIuZ2V0KHJlc00pO1xuICAgIHJldHVybiByZXM7XG4gIH1cblxuICAvKiogT25seSBzb21lIG9mIHRoZSBzeW5vbnltcy4gVGhlc2Ugd2VyZSBvYnRhaW5lZCBmcm9tIHRoZSBjbHVzdGVyZWQgb2xpZ29wZXB0aWRlIGRhdGFzZXQuICovXG4gIHByaXZhdGUgc3RhdGljIGFhU3lub255bXM6IHsgW25hbWU6IHN0cmluZ106IHN0cmluZyB9ID0ge1xuICAgICdNZU5sZSc6ICdMJywgLy8gTmxlIC0gbm9ybGV1Y2luZVxuICAgICdNZUEnOiAnQScsXG4gICAgJ01lRyc6ICdHJyxcbiAgICAnTWVGJzogJ0YnLFxuICB9O1xufVxuXG5leHBvcnQgY2xhc3MgQW1pbm9hY2lkcyB7XG4gIHN0YXRpYyByZWFkb25seSBTZW1UeXBlOiBzdHJpbmcgPSAnQW1pbm9hY2lkcyc7XG5cbiAgc3RhdGljIHJlYWRvbmx5IFNlbVR5cGVNdWx0aXBsZUFsaWdubWVudDogc3RyaW5nID0gJ0FtaW5vYWNpZHNNdWx0aXBsZUFsaWdubWVudCc7XG5cbiAgc3RhdGljIHVuZGVmaW5lZENvbG9yID0gJ3JnYigxMDAsMTAwLDEwMCknO1xuXG4gIHB1YmxpYyBzdGF0aWMgTmFtZXM6IFN0cmluZ0RpY3Rpb25hcnkgPSB7XG4gICAgJ0cnOiAnR2x5Y2luZScsXG4gICAgJ0wnOiAnTGV1Y2luZScsXG4gICAgJ1knOiAnVHlyb3NpbmUnLFxuICAgICdTJzogJ1NlcmluZScsXG4gICAgJ0UnOiAnR2x1dGFtaWMgYWNpZCcsXG4gICAgJ1EnOiAnR2x1dGFtaW5lJyxcbiAgICAnRCc6ICdBc3BhcnRpYyBhY2lkJyxcbiAgICAnTic6ICdBc3BhcmFnaW5lJyxcbiAgICAnRic6ICdQaGVueWxhbGFuaW5lJyxcbiAgICAnQSc6ICdBbGFuaW5lJyxcbiAgICAnSyc6ICdMeXNpbmUnLFxuICAgICdSJzogJ0FyZ2luaW5lJyxcbiAgICAnSCc6ICdIaXN0aWRpbmUnLFxuICAgICdDJzogJ0N5c3RlaW5lJyxcbiAgICAnVic6ICdWYWxpbmUnLFxuICAgICdQJzogJ1Byb2xpbmUnLFxuICAgICdXJzogJ1RyeXB0b3BoYW4nLFxuICAgICdJJzogJ0lzb2xldWNpbmUnLFxuICAgICdNJzogJ01ldGhpb25pbmUnLFxuICAgICdUJzogJ1RocmVvbmluZScsXG4gIH07XG5cbiAgcHVibGljIHN0YXRpYyBBQVNtaWxlczogU3RyaW5nRGljdGlvbmFyeSA9IHtcbiAgICAnRyc6ICdOQ0MoPU8pTycsXG4gICAgJ0wnOiAnTltDQEhdKENDKEMpQylDKD1PKU8nLFxuICAgICdZJzogJ05DKENDMT1DQz1DKE8pQz1DMSlDKD1PKU8nLFxuICAgICdTJzogJ05DKENPKUMoPU8pTycsXG4gICAgJ0UnOiAnTltDQEBIXShDQ0MoTyk9TylDKD1PKU8nLFxuICAgICdRJzogJ05bQ0BASF0oQ0NDKE4pPU8pQyg9TylPJyxcbiAgICAnRCc6ICdOW0NAQEhdKENDKE8pPU8pQyg9TylPJyxcbiAgICAnTic6ICdOW0NAQEhdKENDKE4pPU8pQyg9TylPJyxcbiAgICAnRic6ICdOQyhDQzE9Q0M9Q0M9QzEpQyg9TylPJyxcbiAgICAnQSc6ICdOW0NASF0oQylDKD1PKU8nLFxuICAgICdLJzogJ05DKENDQ0NOKUMoPU8pTycsXG4gICAgJ1InOiAnTltDQEhdKENDQ05DKD1OKUMpQyg9TylPJyxcbiAgICAnSCc6ICdOQyhDQzE9Q049Q1tOXTEpQyg9TylPJyxcbiAgICAnQyc6ICdOW0NAQEhdKENTKUMoPU8pTycsXG4gICAgJ1YnOiAnTkMoQyhDKUMpQyg9TylPJyxcbiAgICAnUCc6ICdOKENDQzEpQzFDKD1PKU8nLFxuICAgICdXJzogJ05bQ0BASF0oQ2MxYzJjY2NjYzJuKFtIXSljMSlDKD1PKU8nLFxuICAgICdJJzogJ05bQ0BIXShbQ0BIXShDKUNDKUMoPU8pTycsXG4gICAgJ00nOiAnTkMoQ0NTQylDKD1PKU8nLFxuICAgICdUJzogJ05DKEMoTylDKUMoPU8pTycsXG4gIH07XG5cbiAgcHVibGljIHN0YXRpYyBBQVNtaWxlc1RydW5jYXRlZDogU3RyaW5nRGljdGlvbmFyeSA9IHtcbiAgICAnRyc6ICcqQyonLFxuICAgICdMJzogJ0NDKEMpQ1tDQEhdKCopKicsXG4gICAgJ1knOiAnQzE9Q0MoPUNDPUMxQ0MoKikqKU8nLFxuICAgICdTJzogJ09DQygqKUMqJyxcbiAgICAnRSc6ICcqW0NAQEhdKENDQyhPKT1PKSonLFxuICAgICdRJzogJypOW0NAQEhdKENDQyhOKT1PKSonLFxuICAgICdEJzogJypbQ0BASF0oQ0MoTyk9TykqJyxcbiAgICAnTic6ICcqW0NAQEhdKENDKE4pPU8pKicsXG4gICAgJ0YnOiAnQzE9Q0M9QyhDPUMxKUNDKCopKicsXG4gICAgJ0EnOiAnQ1tDQEhdKCopKicsXG4gICAgJ0snOiAnQyhDQ04pQ0MoKikqJyxcbiAgICAnUic6ICcqW0NASF0oQ0NDTkMoPU4pQykqJyxcbiAgICAnSCc6ICdDMT1DKE5DPU4xKUNDKCopKicsXG4gICAgJ0MnOiAnQyhbQ0BASF0oKikqKVMnLFxuICAgICdWJzogJ0NDKEMpQygqKSonLFxuICAgICdQJzogJ0MxQ0NOKCopQzEqJyxcbiAgICAnVyc6ICcqW0NAQEhdKENjMWMyY2NjY2MybihbSF0pYzEpKicsXG4gICAgJ0knOiAnQ0NbQ0BIXShDKVtDQEhdKCopKicsXG4gICAgJ00nOiAnQ1NDQ0MoKikqJyxcbiAgICAnVCc6ICdDQyhPKUMoKikqJyxcbiAgfTtcblxuICAvKiogVE9ETzogRnVsbD9cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgQUFGdWxsTmFtZXM6IFN0cmluZ0RpY3Rpb25hcnkgPSB7XG4gICAgJ0FsYSc6ICdBJyxcbiAgICAnQXJnJzogJ1InLFxuICAgICdBc24nOiAnTicsXG4gICAgJ0FzcCc6ICdEJyxcbiAgICAnQ3lzJzogJ0MnLFxuICAgICdHbG4nOiAnUScsXG4gICAgJ0dsdSc6ICdFJyxcbiAgICAnR2x5JzogJ0cnLFxuICAgICdIaXMnOiAnSCcsXG4gICAgJ0lsZSc6ICdJJyxcbiAgICAnTGV1JzogJ0wnLFxuICAgICdMeXMnOiAnSycsXG4gICAgJ01ldCc6ICdNJyxcbiAgICAnUGhlJzogJ0YnLFxuICAgICdQcm8nOiAnUCcsXG4gICAgJ1Nlcic6ICdTJyxcbiAgICAnVGhyJzogJ1QnLFxuICAgICdUcnAnOiAnVycsXG4gICAgJ1R5cic6ICdZJyxcbiAgICAnVmFsJzogJ1YnLFxuICB9O1xuXG4gIHB1YmxpYyBzdGF0aWMgZ2V0UGFsZXR0ZShzY2hlbWU6IHN0cmluZyA9ICdncm9rJyk6IFNlcVBhbGV0dGUge1xuICAgIHN3aXRjaCAoc2NoZW1lKSB7XG4gICAgY2FzZSAnZ3Jvayc6XG4gICAgICByZXR1cm4gQW1pbm9hY2lkc1BhbGV0dGVzLkdyb2tHcm91cHM7XG4gICAgY2FzZSAnbGVzayc6XG4gICAgICByZXR1cm4gQW1pbm9hY2lkc1BhbGV0dGVzLkxlc2s7XG4gICAgZGVmYXVsdDpcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQ2hlbVBhbGV0dGU6IHNjaGVtZSBcXGAke3NjaGVtZX1cXGAgZG9lcyBub3QgZXhpc3RgKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBkaXZpZGVkIGFtaW5vIGFjaWQgd2l0aCBpdHMgY29udGVudCBpbiB0aGUgYnJhY2tldCwgaWYgdGhlIGNvbnRlbnQgaXMgbnVtYmVyLCB0aGVuIGl0cyBvbWl0dGVkXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjIHJhdyBhbWlub1xuICAgKiBAcmV0dXJuIHtbc3RyaW5nLCBzdHJpbmddfSBvdXRlciBhbmQgaW5uZXIgY29udGVudFxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBnZXRJbm5lck91dGVyKGM6IHN0cmluZyk6IFtzdHJpbmcsIHN0cmluZ10ge1xuICAgIGxldCBpc0lubmVyID0gMDtcbiAgICBsZXQgaW5uZXIgPSAnJztcbiAgICBsZXQgb3V0ZXIgPSAnJztcblxuICAgIGZvciAoY29uc3QgY2hhciBvZiBjKSB7XG4gICAgICBpZiAoY2hhciA9PSAnKCcpXG4gICAgICAgIGlzSW5uZXIrKztcbiAgICAgIGVsc2UgaWYgKGNoYXIgPT0gJyknKVxuICAgICAgICBpc0lubmVyLS07XG4gICAgICBlbHNlIGlmIChpc0lubmVyKVxuICAgICAgICBpbm5lciArPSBjaGFyO1xuICAgICAgZWxzZVxuICAgICAgICBvdXRlciArPSBjaGFyO1xuICAgIH1cblxuICAgIHJldHVybiAhaXNOYU4ocGFyc2VJbnQoaW5uZXIpKSA/IFtvdXRlciwgJyddIDogW291dGVyLCBpbm5lcl07XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIGdldENvbG9yQUFQaXZvdChtb25vbWVyOiBzdHJpbmcgPSAnJywgc2NoZW1lOiAnZ3JvaycgPSAnZ3JvaycpOiBbc3RyaW5nLCBzdHJpbmcsIHN0cmluZywgbnVtYmVyXSB7XG4gICAgLy9jb25zdCBjaGVtUGFsZXR0ZUluc3RhbmNlID0gQUFQYWxldHRlcy5Hcm9rR3JvdXBzKCk7XG4gICAgY29uc3QgY2hlbVBhbGV0dGVJbnN0YW5jZSA9IHRoaXMuZ2V0UGFsZXR0ZShzY2hlbWUpO1xuICAgIGxldCBbb3V0ZXJNb25vbWVyLCBpbm5lck1vbm9tZXJdID0gdGhpcy5nZXRJbm5lck91dGVyKG1vbm9tZXIpO1xuICAgIG91dGVyTW9ub21lciA9IChvdXRlck1vbm9tZXIubGVuZ3RoID4gNiA/IGAke291dGVyTW9ub21lci5zbGljZSgwLCAzKX0uLi5gIDogb3V0ZXJNb25vbWVyKTtcbiAgICBpbm5lck1vbm9tZXIgPSAoaW5uZXJNb25vbWVyLmxlbmd0aCA+IDYgPyBgJHtpbm5lck1vbm9tZXIuc2xpY2UoMCwgMyl9Li4uYCA6IGlubmVyTW9ub21lcik7XG5cbiAgICBpZiAobW9ub21lci5sZW5ndGggPT0gMSB8fCBtb25vbWVyWzFdID09ICcoJykge1xuICAgICAgY29uc3QgYW1pbm8gPSBtb25vbWVyWzBdPy50b1VwcGVyQ2FzZSgpITtcbiAgICAgIHJldHVybiBhbWlubyBpbiBjaGVtUGFsZXR0ZUluc3RhbmNlID9cbiAgICAgICAgW2NoZW1QYWxldHRlSW5zdGFuY2UuZ2V0KGFtaW5vKSwgYW1pbm8sIGlubmVyTW9ub21lciwgMV0gOlxuICAgICAgICBbdGhpcy51bmRlZmluZWRDb2xvciwgb3V0ZXJNb25vbWVyLCBpbm5lck1vbm9tZXIsIDFdO1xuICAgIH1cblxuICAgIGlmIChtb25vbWVyWzBdID09ICdkJyAmJiBtb25vbWVyWzFdISBpbiBjaGVtUGFsZXR0ZUluc3RhbmNlKSB7XG4gICAgICBpZiAobW9ub21lci5sZW5ndGggPT0gMiB8fCBtb25vbWVyWzJdID09ICcoJykge1xuICAgICAgICBjb25zdCBhbWlubyA9IG1vbm9tZXJbMV0/LnRvVXBwZXJDYXNlKCkhO1xuICAgICAgICByZXR1cm4gYW1pbm8gaW4gY2hlbVBhbGV0dGVJbnN0YW5jZSA/XG4gICAgICAgICAgW2NoZW1QYWxldHRlSW5zdGFuY2UuZ2V0KGFtaW5vKSwgYW1pbm8sIGlubmVyTW9ub21lciwgMl0gOlxuICAgICAgICAgIFt0aGlzLnVuZGVmaW5lZENvbG9yLCBvdXRlck1vbm9tZXIsIGlubmVyTW9ub21lciwgMl07XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKG1vbm9tZXIuc3Vic3RyaW5nKDAsIDMpIGluIHRoaXMuQUFGdWxsTmFtZXMpIHtcbiAgICAgIGlmIChtb25vbWVyLmxlbmd0aCA9PSAzIHx8IG1vbm9tZXJbM10gPT0gJygnKSB7XG4gICAgICAgIGNvbnN0IGFtaW5vID0gdGhpcy5BQUZ1bGxOYW1lc1ttb25vbWVyLnN1YnN0cmluZygwLCAzKV07XG4gICAgICAgIHJldHVybiBhbWlubyBpbiBjaGVtUGFsZXR0ZUluc3RhbmNlID9cbiAgICAgICAgICBbY2hlbVBhbGV0dGVJbnN0YW5jZS5nZXQoYW1pbm8pLCBhbWlubywgaW5uZXJNb25vbWVyLCAzXSA6XG4gICAgICAgICAgW3RoaXMudW5kZWZpbmVkQ29sb3IsIG91dGVyTW9ub21lciwgaW5uZXJNb25vbWVyLCAzXTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAobW9ub21lclswXT8udG9Mb3dlckNhc2UoKSA9PSBtb25vbWVyWzBdKSB7XG4gICAgICBpZiAobW9ub21lci5zdWJzdHJpbmcoMSwgMykgaW4gdGhpcy5BQUZ1bGxOYW1lcykge1xuICAgICAgICBpZiAobW9ub21lci5sZW5ndGggPT0gNCB8fCBtb25vbWVyWzRdID09ICcoJykge1xuICAgICAgICAgIGNvbnN0IGFtaW5vID0gdGhpcy5BQUZ1bGxOYW1lc1ttb25vbWVyLnN1YnN0cmluZygxLCAzKV07XG4gICAgICAgICAgcmV0dXJuIGFtaW5vIGluIGNoZW1QYWxldHRlSW5zdGFuY2UgP1xuICAgICAgICAgICAgW2NoZW1QYWxldHRlSW5zdGFuY2UuZ2V0KGFtaW5vKSwgYW1pbm8sIGlubmVyTW9ub21lciwgNF0gOlxuICAgICAgICAgICAgW3RoaXMudW5kZWZpbmVkQ29sb3IsIG91dGVyTW9ub21lciwgaW5uZXJNb25vbWVyLCA0XTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBbdGhpcy51bmRlZmluZWRDb2xvciwgb3V0ZXJNb25vbWVyLCBpbm5lck1vbm9tZXIsIDBdO1xuICB9XG59XG4iXX0=
604
-
605
- /***/ }),
606
-
607
- /***/ "./node_modules/@datagrok-libraries/bio/src/nucleotides.js":
608
- /*!*****************************************************************!*\
609
- !*** ./node_modules/@datagrok-libraries/bio/src/nucleotides.js ***!
610
- \*****************************************************************/
611
- /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
612
-
613
- __webpack_require__.r(__webpack_exports__);
614
- /* harmony export */ __webpack_require__.d(__webpack_exports__, {
615
- /* harmony export */ "Nucleotides": () => (/* binding */ Nucleotides),
616
- /* harmony export */ "NucleotidesPalettes": () => (/* binding */ NucleotidesPalettes)
617
- /* harmony export */ });
618
- /* harmony import */ var _seq_palettes__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./seq-palettes */ "./node_modules/@datagrok-libraries/bio/src/seq-palettes.js");
619
-
620
- class NucleotidesPalettes extends _seq_palettes__WEBPACK_IMPORTED_MODULE_0__.SeqPaletteBase {
621
- static get Chromatogram() {
622
- if (this.chromatogram === void 0) {
623
- this.chromatogram = new NucleotidesPalettes({
624
- 'A': 'green',
625
- 'C': 'blue',
626
- 'G': 'black',
627
- 'T': 'red',
628
- 'U': 'red',
629
- 'others': 'gray',
630
- });
631
- }
632
- return this.chromatogram;
633
- }
634
- }
635
- class Nucleotides {
636
- }
637
- Nucleotides.SemType = 'Nucleotides';
638
- Nucleotides.SemTypeMultipleAlignment = 'NucleotidesMultipleAlignment';
639
- Nucleotides.Names = {
640
- 'A': 'Adenine',
641
- 'C': 'Cytosine',
642
- 'G': 'Guanine',
643
- 'T': 'Thymine',
644
- 'U': 'Uracil',
645
- };
646
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibnVjbGVvdGlkZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJudWNsZW90aWRlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFLQSxPQUFPLEVBQWEsY0FBYyxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFFMUQsTUFBTSxPQUFPLG1CQUFvQixTQUFRLGNBQWM7SUFHOUMsTUFBTSxLQUFLLFlBQVk7UUFDNUIsSUFBSSxJQUFJLENBQUMsWUFBWSxLQUFLLEtBQUssQ0FBQyxFQUFFO1lBQ2hDLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxtQkFBbUIsQ0FBQztnQkFDMUMsR0FBRyxFQUFFLE9BQU87Z0JBQ1osR0FBRyxFQUFFLE1BQU07Z0JBQ1gsR0FBRyxFQUFFLE9BQU87Z0JBQ1osR0FBRyxFQUFFLEtBQUs7Z0JBQ1YsR0FBRyxFQUFFLEtBQUs7Z0JBQ1YsUUFBUSxFQUFFLE1BQU07YUFDakIsQ0FBQyxDQUFDO1NBQ0o7UUFDRCxPQUFPLElBQUksQ0FBQyxZQUFZLENBQUM7SUFDM0IsQ0FBQztDQUNGO0FBRUQsTUFBTSxPQUFPLFdBQVc7O0FBQ04sbUJBQU8sR0FBVyxhQUFhLENBQUM7QUFFaEMsb0NBQXdCLEdBQVcsOEJBQThCLENBQUM7QUFFcEUsaUJBQUssR0FBcUI7SUFDdEMsR0FBRyxFQUFFLFNBQVM7SUFDZCxHQUFHLEVBQUUsVUFBVTtJQUNmLEdBQUcsRUFBRSxTQUFTO0lBQ2QsR0FBRyxFQUFFLFNBQVM7SUFDZCxHQUFHLEVBQUUsUUFBUTtDQUNkLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBncm9rIGZyb20gJ2RhdGFncm9rLWFwaS9ncm9rJztcbmltcG9ydCAqIGFzIHVpIGZyb20gJ2RhdGFncm9rLWFwaS91aSc7XG5pbXBvcnQgKiBhcyBERyBmcm9tICdkYXRhZ3Jvay1hcGkvZGcnO1xuXG5pbXBvcnQge1N0cmluZ0RpY3Rpb25hcnl9IGZyb20gJ0BkYXRhZ3Jvay1saWJyYXJpZXMvdXRpbHMvc3JjL3R5cGUtZGVjbGFyYXRpb25zJztcbmltcG9ydCB7U2VxUGFsZXR0ZSwgU2VxUGFsZXR0ZUJhc2V9IGZyb20gJy4vc2VxLXBhbGV0dGVzJztcblxuZXhwb3J0IGNsYXNzIE51Y2xlb3RpZGVzUGFsZXR0ZXMgZXh0ZW5kcyBTZXFQYWxldHRlQmFzZSB7XG4gIHByaXZhdGUgc3RhdGljIGNocm9tYXRvZ3JhbTogU2VxUGFsZXR0ZTtcblxuICBwdWJsaWMgc3RhdGljIGdldCBDaHJvbWF0b2dyYW0oKTogU2VxUGFsZXR0ZSB7XG4gICAgaWYgKHRoaXMuY2hyb21hdG9ncmFtID09PSB2b2lkIDApIHtcbiAgICAgIHRoaXMuY2hyb21hdG9ncmFtID0gbmV3IE51Y2xlb3RpZGVzUGFsZXR0ZXMoe1xuICAgICAgICAnQSc6ICdncmVlbicsXG4gICAgICAgICdDJzogJ2JsdWUnLFxuICAgICAgICAnRyc6ICdibGFjaycsIC8vIG9yYW5nZSA/XG4gICAgICAgICdUJzogJ3JlZCcsXG4gICAgICAgICdVJzogJ3JlZCcsXG4gICAgICAgICdvdGhlcnMnOiAnZ3JheScsXG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuY2hyb21hdG9ncmFtO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBOdWNsZW90aWRlcyB7XG4gIHN0YXRpYyByZWFkb25seSBTZW1UeXBlOiBzdHJpbmcgPSAnTnVjbGVvdGlkZXMnO1xuXG4gIHN0YXRpYyByZWFkb25seSBTZW1UeXBlTXVsdGlwbGVBbGlnbm1lbnQ6IHN0cmluZyA9ICdOdWNsZW90aWRlc011bHRpcGxlQWxpZ25tZW50JztcblxuICBwdWJsaWMgc3RhdGljIE5hbWVzOiBTdHJpbmdEaWN0aW9uYXJ5ID0ge1xuICAgICdBJzogJ0FkZW5pbmUnLFxuICAgICdDJzogJ0N5dG9zaW5lJyxcbiAgICAnRyc6ICdHdWFuaW5lJyxcbiAgICAnVCc6ICdUaHltaW5lJyxcbiAgICAnVSc6ICdVcmFjaWwnLFxuICB9O1xufVxuIl19
647
-
648
- /***/ }),
649
-
650
- /***/ "./node_modules/@datagrok-libraries/bio/src/seq-palettes.js":
651
- /*!******************************************************************!*\
652
- !*** ./node_modules/@datagrok-libraries/bio/src/seq-palettes.js ***!
653
- \******************************************************************/
654
- /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
655
-
656
- __webpack_require__.r(__webpack_exports__);
657
- /* harmony export */ __webpack_require__.d(__webpack_exports__, {
658
- /* harmony export */ "SeqPaletteBase": () => (/* binding */ SeqPaletteBase)
659
- /* harmony export */ });
660
- class SeqPaletteBase {
661
- static makePalette(dt, simplified = false, PaletteType = SeqPaletteBase) {
662
- const palette = {};
663
- dt.forEach((cp) => {
664
- const objList = cp[0];
665
- const colour = cp[1];
666
- objList.forEach((obj, ind) => {
667
- palette[obj] = this.colourPalette[colour][simplified ? 0 : ind];
668
- });
669
- });
670
- return new PaletteType(palette);
671
- }
672
- constructor(palette) {
673
- this._palette = palette;
674
- }
675
- get(m) {
676
- return this._palette[m];
677
- }
678
- }
679
- SeqPaletteBase.undefinedColor = 'rgb(100,100,100)';
680
- /** Palette with shades of primary colors */
681
- SeqPaletteBase.colourPalette = {
682
- 'orange': ['rgb(255,187,120)', 'rgb(245,167,100)', 'rgb(235,137,70)', 'rgb(205, 111, 71)'],
683
- 'all_green': ['rgb(44,160,44)', 'rgb(74,160,74)', 'rgb(23,103,57)', 'rgb(30,110,96)', 'rgb(60,131,95)',
684
- 'rgb(24,110,79)', 'rgb(152,223,138)', 'rgb(182, 223, 138)', 'rgb(152, 193, 138)'],
685
- 'all_blue': ['rgb(31,119,180)', 'rgb(23,190,207)', 'rgb(122, 102, 189)', 'rgb(158,218,229)', 'rgb(141, 124, 217)',
686
- 'rgb(31, 120, 150)'],
687
- 'magenta': ['rgb(162,106,192)', 'rgb(197,165,224)', 'rgb(208,113,218)'],
688
- 'red': ['rgb(214,39,40)', 'rgb(255,152,150)'],
689
- 'st_blue': ['rgb(23,190,207)', 'rgb(158,218,229)', 'rgb(31,119,180)'],
690
- 'dark_blue': ['rgb(31,119,180)', 'rgb(31, 120, 150)'],
691
- 'light_blue': ['rgb(23,190,207)', 'rgb(158,218,229)', 'rgb(108, 218, 229)', 'rgb(23,190,227)'],
692
- 'lilac_blue': ['rgb(124,102,211)', 'rgb(149,134,217)', 'rgb(97, 81, 150)'],
693
- 'dark_green': ['rgb(23,103,57)', 'rgb(30,110,96)', 'rgb(60,131,95)', 'rgb(24,110,79)'],
694
- 'green': ['rgb(44,160,44)', 'rgb(74,160,74)'],
695
- 'light_green': ['rgb(152,223,138)', 'rgb(182, 223, 138)', 'rgb(152, 193, 138)'],
696
- 'st_green': ['rgb(44,160,44)', 'rgb(152,223,138)', 'rgb(39, 174, 96)', 'rgb(74,160,74)'],
697
- 'pink': ['rgb(247,182,210)'],
698
- 'brown': ['rgb(140,86,75)', 'rgb(102, 62, 54)'],
699
- 'gray': ['rgb(127,127,127)', 'rgb(199,199,199)', 'rgb(196,156,148)', 'rgb(222, 222, 180)'],
700
- 'yellow': ['rgb(188,189,34)'],
701
- 'white': ['rgb(230,230,230)'],
702
- };
703
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VxLXBhbGV0dGVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsic2VxLXBhbGV0dGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQWlCQSxNQUFNLE9BQU8sY0FBYztJQTJCZixNQUFNLENBQUMsV0FBVyxDQUFDLEVBQXdCLEVBQ25ELFVBQVUsR0FBRyxLQUFLLEVBQUUsY0FBcUMsY0FBYztRQUV2RSxNQUFNLE9BQU8sR0FBOEIsRUFBRSxDQUFDO1FBQzlDLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRTtZQUNoQixNQUFNLE9BQU8sR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDdEIsTUFBTSxNQUFNLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3JCLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEVBQUU7Z0JBQzNCLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNsRSxDQUFDLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO1FBQ0gsT0FBTyxJQUFJLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUNsQyxDQUFDO0lBSUQsWUFBWSxPQUFnQztRQUMxQyxJQUFJLENBQUMsUUFBUSxHQUFHLE9BQU8sQ0FBQztJQUMxQixDQUFDO0lBRU0sR0FBRyxDQUFDLENBQVM7UUFDbEIsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzFCLENBQUM7O0FBaERhLDZCQUFjLEdBQUcsa0JBQWtCLENBQUM7QUFFbEQsNENBQTRDO0FBQzlCLDRCQUFhLEdBQWdDO0lBQ3pELFFBQVEsRUFBRSxDQUFDLGtCQUFrQixFQUFFLGtCQUFrQixFQUFFLGlCQUFpQixFQUFFLG1CQUFtQixDQUFDO0lBQzFGLFdBQVcsRUFBRSxDQUFDLGdCQUFnQixFQUFFLGdCQUFnQixFQUFFLGdCQUFnQixFQUFFLGdCQUFnQixFQUFFLGdCQUFnQjtRQUNwRyxnQkFBZ0IsRUFBRSxrQkFBa0IsRUFBRSxvQkFBb0IsRUFBRSxvQkFBb0IsQ0FBQztJQUNuRixVQUFVLEVBQUUsQ0FBQyxpQkFBaUIsRUFBRSxpQkFBaUIsRUFBRSxvQkFBb0IsRUFBRSxrQkFBa0IsRUFBRSxvQkFBb0I7UUFDL0csbUJBQW1CLENBQUM7SUFDdEIsU0FBUyxFQUFFLENBQUMsa0JBQWtCLEVBQUUsa0JBQWtCLEVBQUUsa0JBQWtCLENBQUM7SUFDdkUsS0FBSyxFQUFFLENBQUMsZ0JBQWdCLEVBQUUsa0JBQWtCLENBQUM7SUFDN0MsU0FBUyxFQUFFLENBQUMsaUJBQWlCLEVBQUUsa0JBQWtCLEVBQUUsaUJBQWlCLENBQUM7SUFDckUsV0FBVyxFQUFFLENBQUMsaUJBQWlCLEVBQUUsbUJBQW1CLENBQUM7SUFDckQsWUFBWSxFQUFFLENBQUMsaUJBQWlCLEVBQUUsa0JBQWtCLEVBQUUsb0JBQW9CLEVBQUUsaUJBQWlCLENBQUM7SUFDOUYsWUFBWSxFQUFFLENBQUMsa0JBQWtCLEVBQUUsa0JBQWtCLEVBQUUsa0JBQWtCLENBQUM7SUFDMUUsWUFBWSxFQUFFLENBQUMsZ0JBQWdCLEVBQUUsZ0JBQWdCLEVBQUUsZ0JBQWdCLEVBQUUsZ0JBQWdCLENBQUM7SUFDdEYsT0FBTyxFQUFFLENBQUMsZ0JBQWdCLEVBQUUsZ0JBQWdCLENBQUM7SUFDN0MsYUFBYSxFQUFFLENBQUMsa0JBQWtCLEVBQUUsb0JBQW9CLEVBQUUsb0JBQW9CLENBQUM7SUFDL0UsVUFBVSxFQUFFLENBQUMsZ0JBQWdCLEVBQUUsa0JBQWtCLEVBQUUsa0JBQWtCLEVBQUUsZ0JBQWdCLENBQUM7SUFDeEYsTUFBTSxFQUFFLENBQUMsa0JBQWtCLENBQUM7SUFDNUIsT0FBTyxFQUFFLENBQUMsZ0JBQWdCLEVBQUUsa0JBQWtCLENBQUM7SUFDL0MsTUFBTSxFQUFFLENBQUMsa0JBQWtCLEVBQUUsa0JBQWtCLEVBQUUsa0JBQWtCLEVBQUUsb0JBQW9CLENBQUM7SUFDMUYsUUFBUSxFQUFFLENBQUMsaUJBQWlCLENBQUM7SUFDN0IsT0FBTyxFQUFFLENBQUMsa0JBQWtCLENBQUM7Q0FDOUIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIGdyb2sgZnJvbSAnZGF0YWdyb2stYXBpL2dyb2snO1xuaW1wb3J0ICogYXMgdWkgZnJvbSAnZGF0YWdyb2stYXBpL3VpJztcbmltcG9ydCAqIGFzIERHIGZyb20gJ2RhdGFncm9rLWFwaS9kZyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2VxUGFsZXR0ZSB7XG4gIC8vIFRoZXJlIGFyZSB0b28gbXVjaCBwcm9ibGVtIHdpdGggaW5kZXhlciBwcm9wZXJ0eSBpbiB0eXBlc2NyaXB0LlxuICAvLyAvKipcbiAgLy8gICogQHBhcmFtIHtzdHJpbmd9IG0gTW9ub21lciBjaGFyYWN0ZXJcbiAgLy8gICogQHJldHVybiB7c3RyaW5nfSBDb2xvclxuICAvLyAgKi9cbiAgLy8gW206IHN0cmluZ106IHN0cmluZztcbiAgLyoqIE1vbm9tZXIgY29sb3JcbiAgICogQHBhcmFtIHtzdHJpbmd9IG0gTW9ub21lclxuICAgKi9cbiAgZ2V0KG06IHN0cmluZyk6IHN0cmluZztcbn1cblxuZXhwb3J0IGNsYXNzIFNlcVBhbGV0dGVCYXNlIGltcGxlbWVudHMgU2VxUGFsZXR0ZSB7XG4gIHB1YmxpYyBzdGF0aWMgdW5kZWZpbmVkQ29sb3IgPSAncmdiKDEwMCwxMDAsMTAwKSc7XG5cbiAgLyoqIFBhbGV0dGUgd2l0aCBzaGFkZXMgb2YgcHJpbWFyeSBjb2xvcnMgKi9cbiAgcHVibGljIHN0YXRpYyBjb2xvdXJQYWxldHRlOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZ1tdIH0gPSB7XG4gICAgJ29yYW5nZSc6IFsncmdiKDI1NSwxODcsMTIwKScsICdyZ2IoMjQ1LDE2NywxMDApJywgJ3JnYigyMzUsMTM3LDcwKScsICdyZ2IoMjA1LCAxMTEsIDcxKSddLFxuICAgICdhbGxfZ3JlZW4nOiBbJ3JnYig0NCwxNjAsNDQpJywgJ3JnYig3NCwxNjAsNzQpJywgJ3JnYigyMywxMDMsNTcpJywgJ3JnYigzMCwxMTAsOTYpJywgJ3JnYig2MCwxMzEsOTUpJyxcbiAgICAgICdyZ2IoMjQsMTEwLDc5KScsICdyZ2IoMTUyLDIyMywxMzgpJywgJ3JnYigxODIsIDIyMywgMTM4KScsICdyZ2IoMTUyLCAxOTMsIDEzOCknXSxcbiAgICAnYWxsX2JsdWUnOiBbJ3JnYigzMSwxMTksMTgwKScsICdyZ2IoMjMsMTkwLDIwNyknLCAncmdiKDEyMiwgMTAyLCAxODkpJywgJ3JnYigxNTgsMjE4LDIyOSknLCAncmdiKDE0MSwgMTI0LCAyMTcpJyxcbiAgICAgICdyZ2IoMzEsIDEyMCwgMTUwKSddLFxuICAgICdtYWdlbnRhJzogWydyZ2IoMTYyLDEwNiwxOTIpJywgJ3JnYigxOTcsMTY1LDIyNCknLCAncmdiKDIwOCwxMTMsMjE4KSddLFxuICAgICdyZWQnOiBbJ3JnYigyMTQsMzksNDApJywgJ3JnYigyNTUsMTUyLDE1MCknXSxcbiAgICAnc3RfYmx1ZSc6IFsncmdiKDIzLDE5MCwyMDcpJywgJ3JnYigxNTgsMjE4LDIyOSknLCAncmdiKDMxLDExOSwxODApJ10sXG4gICAgJ2RhcmtfYmx1ZSc6IFsncmdiKDMxLDExOSwxODApJywgJ3JnYigzMSwgMTIwLCAxNTApJ10sXG4gICAgJ2xpZ2h0X2JsdWUnOiBbJ3JnYigyMywxOTAsMjA3KScsICdyZ2IoMTU4LDIxOCwyMjkpJywgJ3JnYigxMDgsIDIxOCwgMjI5KScsICdyZ2IoMjMsMTkwLDIyNyknXSxcbiAgICAnbGlsYWNfYmx1ZSc6IFsncmdiKDEyNCwxMDIsMjExKScsICdyZ2IoMTQ5LDEzNCwyMTcpJywgJ3JnYig5NywgODEsIDE1MCknXSxcbiAgICAnZGFya19ncmVlbic6IFsncmdiKDIzLDEwMyw1NyknLCAncmdiKDMwLDExMCw5NiknLCAncmdiKDYwLDEzMSw5NSknLCAncmdiKDI0LDExMCw3OSknXSxcbiAgICAnZ3JlZW4nOiBbJ3JnYig0NCwxNjAsNDQpJywgJ3JnYig3NCwxNjAsNzQpJ10sXG4gICAgJ2xpZ2h0X2dyZWVuJzogWydyZ2IoMTUyLDIyMywxMzgpJywgJ3JnYigxODIsIDIyMywgMTM4KScsICdyZ2IoMTUyLCAxOTMsIDEzOCknXSxcbiAgICAnc3RfZ3JlZW4nOiBbJ3JnYig0NCwxNjAsNDQpJywgJ3JnYigxNTIsMjIzLDEzOCknLCAncmdiKDM5LCAxNzQsIDk2KScsICdyZ2IoNzQsMTYwLDc0KSddLFxuICAgICdwaW5rJzogWydyZ2IoMjQ3LDE4MiwyMTApJ10sXG4gICAgJ2Jyb3duJzogWydyZ2IoMTQwLDg2LDc1KScsICdyZ2IoMTAyLCA2MiwgNTQpJ10sXG4gICAgJ2dyYXknOiBbJ3JnYigxMjcsMTI3LDEyNyknLCAncmdiKDE5OSwxOTksMTk5KScsICdyZ2IoMTk2LDE1NiwxNDgpJywgJ3JnYigyMjIsIDIyMiwgMTgwKSddLFxuICAgICd5ZWxsb3cnOiBbJ3JnYigxODgsMTg5LDM0KSddLFxuICAgICd3aGl0ZSc6IFsncmdiKDIzMCwyMzAsMjMwKSddLFxuICB9O1xuXG4gIHByb3RlY3RlZCBzdGF0aWMgbWFrZVBhbGV0dGUoZHQ6IFtzdHJpbmdbXSwgc3RyaW5nXVtdLFxuICAgIHNpbXBsaWZpZWQgPSBmYWxzZSwgUGFsZXR0ZVR5cGU6IHR5cGVvZiBTZXFQYWxldHRlQmFzZSA9IFNlcVBhbGV0dGVCYXNlXG4gICkge1xuICAgIGNvbnN0IHBhbGV0dGU6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0gPSB7fTtcbiAgICBkdC5mb3JFYWNoKChjcCkgPT4ge1xuICAgICAgY29uc3Qgb2JqTGlzdCA9IGNwWzBdO1xuICAgICAgY29uc3QgY29sb3VyID0gY3BbMV07XG4gICAgICBvYmpMaXN0LmZvckVhY2goKG9iaiwgaW5kKSA9PiB7XG4gICAgICAgIHBhbGV0dGVbb2JqXSA9IHRoaXMuY29sb3VyUGFsZXR0ZVtjb2xvdXJdW3NpbXBsaWZpZWQgPyAwIDogaW5kXTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICAgIHJldHVybiBuZXcgUGFsZXR0ZVR5cGUocGFsZXR0ZSk7XG4gIH1cblxuICBwcml2YXRlIHJlYWRvbmx5IF9wYWxldHRlOiB7IFttOiBzdHJpbmddOiBzdHJpbmcgfTtcblxuICBjb25zdHJ1Y3RvcihwYWxldHRlOiB7IFttOiBzdHJpbmddOiBzdHJpbmcgfSkge1xuICAgIHRoaXMuX3BhbGV0dGUgPSBwYWxldHRlO1xuICB9XG5cbiAgcHVibGljIGdldChtOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9wYWxldHRlW21dO1xuICB9XG59XG4iXX0=
704
-
705
- /***/ }),
706
-
707
- /***/ "./node_modules/@datagrok-libraries/bio/src/unknown.js":
708
- /*!*************************************************************!*\
709
- !*** ./node_modules/@datagrok-libraries/bio/src/unknown.js ***!
710
- \*************************************************************/
711
- /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
712
-
713
- __webpack_require__.r(__webpack_exports__);
714
- /* harmony export */ __webpack_require__.d(__webpack_exports__, {
715
- /* harmony export */ "GrayAllPalette": () => (/* binding */ GrayAllPalette),
716
- /* harmony export */ "StringUtils": () => (/* binding */ StringUtils),
717
- /* harmony export */ "UnknownColorPalette": () => (/* binding */ UnknownColorPalette),
718
- /* harmony export */ "UnknownSeqPalette": () => (/* binding */ UnknownSeqPalette),
719
- /* harmony export */ "UnknownSeqPalettes": () => (/* binding */ UnknownSeqPalettes)
720
- /* harmony export */ });
721
- /* harmony import */ var datagrok_api_dg__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! datagrok-api/dg */ "datagrok-api/dg");
722
- /* harmony import */ var datagrok_api_dg__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(datagrok_api_dg__WEBPACK_IMPORTED_MODULE_0__);
723
- /* harmony import */ var _seq_palettes__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./seq-palettes */ "./node_modules/@datagrok-libraries/bio/src/seq-palettes.js");
724
-
725
- /** makes the color less white, makes the transparency effect always perceptible
726
- * @param {string} color x coordinate.
727
- * */
728
- function correctColor(color) {
729
- if (color == null)
730
- return 'rgb(100,100,100)';
731
- const dgColor = datagrok_api_dg__WEBPACK_IMPORTED_MODULE_0__.Color.fromHtml(color);
732
- const g = datagrok_api_dg__WEBPACK_IMPORTED_MODULE_0__.Color.g(dgColor);
733
- const r = datagrok_api_dg__WEBPACK_IMPORTED_MODULE_0__.Color.r(dgColor);
734
- const b = datagrok_api_dg__WEBPACK_IMPORTED_MODULE_0__.Color.b(dgColor);
735
- // calculate euclidean distance to white
736
- const distToBlack = Math.sqrt(Math.pow(0 - r, 2) + Math.pow(0 - g, 2) + Math.pow(0 - b, 2));
737
- // normalize vector r g b
738
- const normR = r / distToBlack;
739
- const normG = g / distToBlack;
740
- const normB = b / distToBlack;
741
- if (distToBlack > 210) {
742
- return `rgb(${normR * 210},${normG * 210},${normB * 210})`;
743
- }
744
- return datagrok_api_dg__WEBPACK_IMPORTED_MODULE_0__.Color.toRgb(dgColor);
745
- }
746
- class StringUtils {
747
- static hashCode(s) {
748
- let hash = 0;
749
- if (s.length === 0)
750
- return hash;
751
- for (let i = 0; i < s.length; i++) {
752
- const chr = s.charCodeAt(i);
753
- hash = ((hash << 5) - hash) + chr;
754
- hash |= 0; // Convert to 32bit integer
755
- }
756
- return hash;
757
- }
758
- }
759
-
760
- class UnknownSeqPalette {
761
- }
762
- class GrayAllPalette extends UnknownSeqPalette {
763
- get(m) {
764
- return '#666666';
765
- }
766
- }
767
- class UnknownColorPalette extends UnknownSeqPalette {
768
- static buildPalette() {
769
- const res = [].concat(...Object.values(_seq_palettes__WEBPACK_IMPORTED_MODULE_1__.SeqPaletteBase.colourPalette));
770
- return res;
771
- }
772
- get(m) {
773
- const hash = StringUtils.hashCode(m);
774
- const pI = hash % UnknownColorPalette.palette.length;
775
- return correctColor(UnknownColorPalette.palette[pI]);
776
- }
777
- }
778
- UnknownColorPalette.palette = UnknownColorPalette.buildPalette();
779
- class UnknownSeqPalettes extends _seq_palettes__WEBPACK_IMPORTED_MODULE_1__.SeqPaletteBase {
780
- static get Gray() {
781
- if (this.gray === void 0)
782
- this.gray = new GrayAllPalette();
783
- return this.gray;
784
- }
785
- static get Color() {
786
- if (this.color === void 0)
787
- this.color = new UnknownColorPalette();
788
- return this.color;
789
- }
790
- }
791
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidW5rbm93bi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInVua25vd24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsT0FBTyxLQUFLLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUV0Qzs7S0FFSztBQUNMLFNBQVMsWUFBWSxDQUFDLEtBQW9CO0lBQ3hDLElBQUksS0FBSyxJQUFJLElBQUk7UUFDZixPQUFPLGtCQUFrQixDQUFDO0lBRTVCLE1BQU0sT0FBTyxHQUFXLEVBQUUsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ2pELE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQzlCLE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQzlCLE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQzlCLHdDQUF3QztJQUN4QyxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDNUYseUJBQXlCO0lBQ3pCLE1BQU0sS0FBSyxHQUFHLENBQUMsR0FBRyxXQUFXLENBQUM7SUFDOUIsTUFBTSxLQUFLLEdBQUcsQ0FBQyxHQUFHLFdBQVcsQ0FBQztJQUM5QixNQUFNLEtBQUssR0FBRyxDQUFDLEdBQUcsV0FBVyxDQUFDO0lBQzlCLElBQUksV0FBVyxHQUFHLEdBQUcsRUFBRTtRQUNyQixPQUFPLE9BQU8sS0FBSyxHQUFHLEdBQUcsSUFBSSxLQUFLLEdBQUcsR0FBRyxJQUFJLEtBQUssR0FBRyxHQUFHLEdBQUcsQ0FBQztLQUM1RDtJQUNELE9BQU8sRUFBRSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7QUFDakMsQ0FBQztBQUVELE1BQU0sT0FBTyxXQUFXO0lBQ2YsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFTO1FBQzlCLElBQUksSUFBSSxHQUFXLENBQUMsQ0FBQztRQUNyQixJQUFJLENBQUMsQ0FBQyxNQUFNLEtBQUssQ0FBQztZQUNoQixPQUFPLElBQUksQ0FBQztRQUNkLEtBQUssSUFBSSxDQUFDLEdBQVcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQ3pDLE1BQU0sR0FBRyxHQUFXLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDcEMsSUFBSSxHQUFHLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsR0FBRyxDQUFDO1lBQ2xDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQywyQkFBMkI7U0FDdkM7UUFDRCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7Q0FDRjtBQUVELE9BQU8sRUFBYSxjQUFjLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUUxRCxNQUFNLE9BQWdCLGlCQUFpQjtDQUV0QztBQUVELE1BQU0sT0FBTyxjQUFlLFNBQVEsaUJBQWlCO0lBQzVDLEdBQUcsQ0FBQyxDQUFTO1FBQ2xCLE9BQU8sU0FBUyxDQUFDO0lBQ25CLENBQUM7Q0FDRjtBQUdELE1BQU0sT0FBTyxtQkFBb0IsU0FBUSxpQkFBaUI7SUFHaEQsTUFBTSxDQUFDLFlBQVk7UUFDekIsTUFBTSxHQUFHLEdBQUksRUFBZSxDQUFDLE1BQU0sQ0FBQyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUM7UUFDcEYsT0FBTyxHQUFHLENBQUM7SUFDYixDQUFDO0lBRU0sR0FBRyxDQUFDLENBQVM7UUFDbEIsTUFBTSxJQUFJLEdBQVcsV0FBVyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM3QyxNQUFNLEVBQUUsR0FBRyxJQUFJLEdBQUcsbUJBQW1CLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQztRQUNyRCxPQUFPLFlBQVksQ0FBQyxtQkFBbUIsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUN2RCxDQUFDOztBQVhhLDJCQUFPLEdBQWEsbUJBQW1CLENBQUMsWUFBWSxFQUFFLENBQUM7QUFjdkUsTUFBTSxPQUFPLGtCQUFtQixTQUFRLGNBQWM7SUFHN0MsTUFBTSxLQUFLLElBQUk7UUFDcEIsSUFBSSxJQUFJLENBQUMsSUFBSSxLQUFLLEtBQUssQ0FBQztZQUN0QixJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksY0FBYyxFQUFFLENBQUM7UUFDbkMsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDO0lBQ25CLENBQUM7SUFJTSxNQUFNLEtBQUssS0FBSztRQUNyQixJQUFJLElBQUksQ0FBQyxLQUFLLEtBQUssS0FBSyxDQUFDO1lBQ3ZCLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxtQkFBbUIsRUFBRSxDQUFDO1FBQ3pDLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQztJQUNwQixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBncm9rIGZyb20gJ2RhdGFncm9rLWFwaS9ncm9rJztcbmltcG9ydCAqIGFzIHVpIGZyb20gJ2RhdGFncm9rLWFwaS91aSc7XG5pbXBvcnQgKiBhcyBERyBmcm9tICdkYXRhZ3Jvay1hcGkvZGcnO1xuXG4vKiogbWFrZXMgdGhlIGNvbG9yIGxlc3Mgd2hpdGUsIG1ha2VzIHRoZSB0cmFuc3BhcmVuY3kgZWZmZWN0IGFsd2F5cyBwZXJjZXB0aWJsZVxuICogQHBhcmFtIHtzdHJpbmd9IGNvbG9yIHggY29vcmRpbmF0ZS5cbiAqICovXG5mdW5jdGlvbiBjb3JyZWN0Q29sb3IoY29sb3I6IHN0cmluZyB8IG51bGwpOiBzdHJpbmcge1xuICBpZiAoY29sb3IgPT0gbnVsbClcbiAgICByZXR1cm4gJ3JnYigxMDAsMTAwLDEwMCknO1xuXG4gIGNvbnN0IGRnQ29sb3I6IG51bWJlciA9IERHLkNvbG9yLmZyb21IdG1sKGNvbG9yKTtcbiAgY29uc3QgZyA9IERHLkNvbG9yLmcoZGdDb2xvcik7XG4gIGNvbnN0IHIgPSBERy5Db2xvci5yKGRnQ29sb3IpO1xuICBjb25zdCBiID0gREcuQ29sb3IuYihkZ0NvbG9yKTtcbiAgLy8gY2FsY3VsYXRlIGV1Y2xpZGVhbiBkaXN0YW5jZSB0byB3aGl0ZVxuICBjb25zdCBkaXN0VG9CbGFjayA9IE1hdGguc3FydChNYXRoLnBvdygwIC0gciwgMikgKyBNYXRoLnBvdygwIC0gZywgMikgKyBNYXRoLnBvdygwIC0gYiwgMikpO1xuICAvLyBub3JtYWxpemUgdmVjdG9yIHIgZyBiXG4gIGNvbnN0IG5vcm1SID0gciAvIGRpc3RUb0JsYWNrO1xuICBjb25zdCBub3JtRyA9IGcgLyBkaXN0VG9CbGFjaztcbiAgY29uc3Qgbm9ybUIgPSBiIC8gZGlzdFRvQmxhY2s7XG4gIGlmIChkaXN0VG9CbGFjayA+IDIxMCkge1xuICAgIHJldHVybiBgcmdiKCR7bm9ybVIgKiAyMTB9LCR7bm9ybUcgKiAyMTB9LCR7bm9ybUIgKiAyMTB9KWA7XG4gIH1cbiAgcmV0dXJuIERHLkNvbG9yLnRvUmdiKGRnQ29sb3IpO1xufVxuXG5leHBvcnQgY2xhc3MgU3RyaW5nVXRpbHMge1xuICBwdWJsaWMgc3RhdGljIGhhc2hDb2RlKHM6IHN0cmluZyk6IG51bWJlciB7XG4gICAgbGV0IGhhc2g6IG51bWJlciA9IDA7XG4gICAgaWYgKHMubGVuZ3RoID09PSAwKVxuICAgICAgcmV0dXJuIGhhc2g7XG4gICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGNocjogbnVtYmVyID0gcy5jaGFyQ29kZUF0KGkpO1xuICAgICAgaGFzaCA9ICgoaGFzaCA8PCA1KSAtIGhhc2gpICsgY2hyO1xuICAgICAgaGFzaCB8PSAwOyAvLyBDb252ZXJ0IHRvIDMyYml0IGludGVnZXJcbiAgICB9XG4gICAgcmV0dXJuIGhhc2g7XG4gIH1cbn1cblxuaW1wb3J0IHtTZXFQYWxldHRlLCBTZXFQYWxldHRlQmFzZX0gZnJvbSAnLi9zZXEtcGFsZXR0ZXMnO1xuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgVW5rbm93blNlcVBhbGV0dGUgaW1wbGVtZW50cyBTZXFQYWxldHRlIHtcbiAgcHVibGljIGFic3RyYWN0IGdldChtOiBzdHJpbmcpOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBjbGFzcyBHcmF5QWxsUGFsZXR0ZSBleHRlbmRzIFVua25vd25TZXFQYWxldHRlIHtcbiAgcHVibGljIGdldChtOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiAnIzY2NjY2Nic7XG4gIH1cbn1cblxuXG5leHBvcnQgY2xhc3MgVW5rbm93bkNvbG9yUGFsZXR0ZSBleHRlbmRzIFVua25vd25TZXFQYWxldHRlIHtcbiAgcHVibGljIHN0YXRpYyBwYWxldHRlOiBzdHJpbmdbXSA9IFVua25vd25Db2xvclBhbGV0dGUuYnVpbGRQYWxldHRlKCk7XG5cbiAgcHJpdmF0ZSBzdGF0aWMgYnVpbGRQYWxldHRlKCk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCByZXMgPSAoW10gYXMgc3RyaW5nW10pLmNvbmNhdCguLi5PYmplY3QudmFsdWVzKFNlcVBhbGV0dGVCYXNlLmNvbG91clBhbGV0dGUpKTtcbiAgICByZXR1cm4gcmVzO1xuICB9XG5cbiAgcHVibGljIGdldChtOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IGhhc2g6IG51bWJlciA9IFN0cmluZ1V0aWxzLmhhc2hDb2RlKG0pO1xuICAgIGNvbnN0IHBJID0gaGFzaCAlIFVua25vd25Db2xvclBhbGV0dGUucGFsZXR0ZS5sZW5ndGg7XG4gICAgcmV0dXJuIGNvcnJlY3RDb2xvcihVbmtub3duQ29sb3JQYWxldHRlLnBhbGV0dGVbcEldKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgVW5rbm93blNlcVBhbGV0dGVzIGV4dGVuZHMgU2VxUGFsZXR0ZUJhc2Uge1xuICBwcml2YXRlIHN0YXRpYyBncmF5OiBTZXFQYWxldHRlO1xuXG4gIHB1YmxpYyBzdGF0aWMgZ2V0IEdyYXkoKTogU2VxUGFsZXR0ZSB7XG4gICAgaWYgKHRoaXMuZ3JheSA9PT0gdm9pZCAwKVxuICAgICAgdGhpcy5ncmF5ID0gbmV3IEdyYXlBbGxQYWxldHRlKCk7XG4gICAgcmV0dXJuIHRoaXMuZ3JheTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIGNvbG9yOiBTZXFQYWxldHRlO1xuXG4gIHB1YmxpYyBzdGF0aWMgZ2V0IENvbG9yKCk6IFNlcVBhbGV0dGUge1xuICAgIGlmICh0aGlzLmNvbG9yID09PSB2b2lkIDApXG4gICAgICB0aGlzLmNvbG9yID0gbmV3IFVua25vd25Db2xvclBhbGV0dGUoKTtcbiAgICByZXR1cm4gdGhpcy5jb2xvcjtcbiAgfVxufVxuIl19
792
-
793
- /***/ }),
794
-
795
- /***/ "./node_modules/@datagrok-libraries/bio/src/utils/cell-renderer.js":
796
- /*!*************************************************************************!*\
797
- !*** ./node_modules/@datagrok-libraries/bio/src/utils/cell-renderer.js ***!
798
- \*************************************************************************/
799
- /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
800
-
801
- __webpack_require__.r(__webpack_exports__);
802
- /* harmony export */ __webpack_require__.d(__webpack_exports__, {
803
- /* harmony export */ "DrawStyle": () => (/* binding */ DrawStyle),
804
- /* harmony export */ "printLeftOrCentered": () => (/* binding */ printLeftOrCentered)
805
- /* harmony export */ });
806
- /* harmony import */ var _macromolecule__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./macromolecule */ "./node_modules/@datagrok-libraries/bio/src/utils/macromolecule.js");
807
-
808
- const undefinedColor = 'rgb(100,100,100)';
809
- const grayColor = '#808080';
810
- const blackColor = 'rgb(0,0,0)';
811
- const monomerToShortFunction = _macromolecule__WEBPACK_IMPORTED_MODULE_0__.monomerToShort;
812
- var DrawStyle;
813
- (function (DrawStyle) {
814
- DrawStyle["MSA"] = "MSA";
815
- DrawStyle["classic"] = "classic";
816
- })(DrawStyle || (DrawStyle = {}));
817
- /**
818
- * A function that prints a string aligned to left or centered.
819
- *
820
- * @param {number} x x coordinate.
821
- * @param {number} y y coordinate.
822
- * @param {number} w Width.
823
- * @param {number} h Height.
824
- * @param {CanvasRenderingContext2D} g Canvas rendering context.
825
- * @param {string} s String to print.
826
- * @param {string} [color=undefinedColor] String color.
827
- * @param {number} [pivot=0] Pirvot.
828
- * @param {boolean} [left=false] Is left aligned.
829
- * @param {number} [transparencyRate=0.0] Transparency rate where 1.0 is fully transparent
830
- * @param {string} [separator=''] Is separator for sequence.
831
- * @param {boolean} [last=false] Is checker if element last or not.
832
- * @param drawStyle Is draw style. MSA - for multicharSeq, classic - for other seq.
833
- * @param maxWord Is array of max words for each line.
834
- * @param wordIdx Is index of word we currently draw.
835
- * @param gridCell Is grid cell.
836
- * @param referenceSequence Is reference sequence for diff mode.
837
- * @param maxLengthOfMonomer Is max length of monomer.
838
- * @return {number} x coordinate to start printing at.
839
- */
840
- const printLeftOrCentered = (x, y, w, h, g, s, color = undefinedColor, pivot = 0, left = false, transparencyRate = 1.0, separator = '', last = false, drawStyle = DrawStyle.classic, maxWord = {}, wordIdx = 0, gridCell = null, referenceSequence = [], maxLengthOfMonomer = null) => {
841
- var _a, _b, _c;
842
- g.textAlign = 'start';
843
- let colorPart = s.substring(0);
844
- let grayPart = last ? '' : separator;
845
- if (drawStyle === DrawStyle.MSA) {
846
- grayPart = '';
847
- }
848
- let colorCode = true;
849
- let compareWithCurrent = true;
850
- let highlightDifference = 'difference';
851
- if ((gridCell != null) && (gridCell.cell.column != null)) {
852
- colorCode = (_a = gridCell.cell.column.temp['color-code']) !== null && _a !== void 0 ? _a : true;
853
- compareWithCurrent = (_b = gridCell.cell.column.temp['compare-with-current']) !== null && _b !== void 0 ? _b : true;
854
- highlightDifference = (_c = gridCell.cell.column.temp['highlight-difference']) !== null && _c !== void 0 ? _c : 'difference';
855
- }
856
- const currentMonomer = referenceSequence[wordIdx];
857
- if (compareWithCurrent && (referenceSequence.length > 0) && (highlightDifference === 'difference')) {
858
- transparencyRate = (colorPart == currentMonomer) ? 0.3 : transparencyRate;
859
- }
860
- if (compareWithCurrent && (referenceSequence.length > 0) && (highlightDifference === 'equal')) {
861
- transparencyRate = (colorPart != currentMonomer) ? 0.3 : transparencyRate;
862
- }
863
- if (maxLengthOfMonomer != null) {
864
- colorPart = monomerToShortFunction(colorPart, maxLengthOfMonomer);
865
- }
866
- let textSize = g.measureText(colorPart + grayPart);
867
- const indent = 5;
868
- let maxColorTextSize = g.measureText(colorPart).width;
869
- let colorTextSize = g.measureText(colorPart).width;
870
- const dy = h / 2 - (textSize.fontBoundingBoxAscent + textSize.fontBoundingBoxDescent) / 2 + 1;
871
- textSize = textSize.width;
872
- if (drawStyle === DrawStyle.MSA) {
873
- maxColorTextSize = maxWord[wordIdx];
874
- textSize = maxWord[wordIdx];
875
- }
876
- function draw(dx1, dx2) {
877
- const drawColor = colorCode ? color : blackColor;
878
- g.fillStyle = drawColor;
879
- g.globalAlpha = transparencyRate;
880
- if (drawStyle === DrawStyle.classic) {
881
- g.fillText(colorPart, x + dx1, y + dy);
882
- g.fillStyle = grayColor;
883
- g.fillText(grayPart, x + dx2, y + dy);
884
- }
885
- if (drawStyle === DrawStyle.MSA) {
886
- g.fillStyle = drawColor;
887
- g.fillText(colorPart, x + dx1 + ((maxWord[wordIdx] - colorTextSize) / 2), y + dy);
888
- }
889
- }
890
- if (left || textSize > w) {
891
- draw(indent, indent + maxColorTextSize);
892
- return x + maxColorTextSize + g.measureText(grayPart).width;
893
- }
894
- else {
895
- const dx = (w - textSize) / 2;
896
- draw(dx, dx + maxColorTextSize);
897
- return x + dx + maxColorTextSize;
898
- }
899
- };
900
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2VsbC1yZW5kZXJlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImNlbGwtcmVuZGVyZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsT0FBTyxFQUFDLGNBQWMsRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBRS9DLE1BQU0sY0FBYyxHQUFHLGtCQUFrQixDQUFDO0FBQzFDLE1BQU0sU0FBUyxHQUFHLFNBQVMsQ0FBQztBQUM1QixNQUFNLFVBQVUsR0FBRyxZQUFZLENBQUM7QUFDaEMsTUFBTSxzQkFBc0IsR0FBMEQsY0FBYyxDQUFDO0FBRXJHLE1BQU0sQ0FBTixJQUFZLFNBR1g7QUFIRCxXQUFZLFNBQVM7SUFDbkIsd0JBQVcsQ0FBQTtJQUNYLGdDQUFtQixDQUFBO0FBQ3JCLENBQUMsRUFIVyxTQUFTLEtBQVQsU0FBUyxRQUdwQjtBQUVEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBc0JHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sbUJBQW1CLEdBQUcsQ0FDakMsQ0FBUyxFQUFFLENBQVMsRUFBRSxDQUFTLEVBQUUsQ0FBUyxFQUMxQyxDQUEyQixFQUFFLENBQVMsRUFBRSxRQUFnQixjQUFjLEVBQ3RFLFFBQWdCLENBQUMsRUFBRSxJQUFJLEdBQUcsS0FBSyxFQUFFLG1CQUEyQixHQUFHLEVBQy9ELFlBQW9CLEVBQUUsRUFBRSxPQUFnQixLQUFLLEVBQUUsWUFBdUIsU0FBUyxDQUFDLE9BQU8sRUFBRSxVQUF1QyxFQUFFLEVBQUUsVUFBa0IsQ0FBQyxFQUFFLFdBQStCLElBQUksRUFBRSxvQkFBOEIsRUFBRSxFQUFFLHFCQUFvQyxJQUFJLEVBQVUsRUFBRTs7SUFDcFIsQ0FBQyxDQUFDLFNBQVMsR0FBRyxPQUFPLENBQUM7SUFDdEIsSUFBSSxTQUFTLEdBQUcsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUMvQixJQUFJLFFBQVEsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsU0FBUyxD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QyxDQUFDLENBQUMsUUFBUSxDQUFDLFNBQVMsRUFBRSxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQztZQUN2QyxDQUFDLENBQUMsU0FBUyxHQUFHLFNBQVMsQ0FBQztZQUN4QixDQUFDLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQztTQUN2QztRQUNELElBQUksU0FBUyxLQUFLLFNBQVMsQ0FBQyxHQUFHLEVBQUU7WUFDL0IsQ0FBQyxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUM7WUFDeEIsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxHQUFHLGFBQWEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQztTQUNuRjtJQUNILENBQUM7SUFFRCxJQUFJLElBQUksSUFBSSxRQUFRLEdBQUcsQ0FBQyxFQUFFO1FBQ3hCLElBQUksQ0FBQyxNQUFNLEVBQUUsTUFBTSxHQUFHLGdCQUFnQixDQUFDLENBQUM7UUFDeEMsT0FBTyxDQUFDLEdBQUcsZ0JBQWdCLEdBQUcsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsQ0FBQyxLQUFLLENBQUM7S0FFN0Q7U0FBTTtRQUNMLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUM5QixJQUFJLENBQUMsRUFBRSxFQUFFLEVBQUUsR0FBRyxnQkFBZ0IsQ0FBQyxDQUFDO1FBQ2hDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsR0FBRyxnQkFBZ0IsQ0FBQztLQUNsQztBQUNILENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIERHIGZyb20gJ2RhdGFncm9rLWFwaS9kZyc7XG5cbmltcG9ydCB7bW9ub21lclRvU2hvcnR9IGZyb20gJy4vbWFjcm9tb2xlY3VsZSc7XG5cbmNvbnN0IHVuZGVmaW5lZENvbG9yID0gJ3JnYigxMDAsMTAwLDEwMCknO1xuY29uc3QgZ3JheUNvbG9yID0gJyM4MDgwODAnO1xuY29uc3QgYmxhY2tDb2xvciA9ICdyZ2IoMCwwLDApJztcbmNvbnN0IG1vbm9tZXJUb1Nob3J0RnVuY3Rpb246IChhbWlubzogc3RyaW5nLCBtYXhMZW5ndGhPZk1vbm9tZXI6IG51bWJlcikgPT4gc3RyaW5nID0gbW9ub21lclRvU2hvcnQ7XG5cbmV4cG9ydCBlbnVtIERyYXdTdHlsZSB7XG4gIE1TQSA9ICdNU0EnLFxuICBjbGFzc2ljID0gJ2NsYXNzaWMnLFxufVxuXG4vKipcbiAqIEEgZnVuY3Rpb24gdGhhdCBwcmludHMgYSBzdHJpbmcgYWxpZ25lZCB0byBsZWZ0IG9yIGNlbnRlcmVkLlxuICpcbiAqIEBwYXJhbSB7bnVtYmVyfSB4IHggY29vcmRpbmF0ZS5cbiAqIEBwYXJhbSB7bnVtYmVyfSB5IHkgY29vcmRpbmF0ZS5cbiAqIEBwYXJhbSB7bnVtYmVyfSB3IFdpZHRoLlxuICogQHBhcmFtIHtudW1iZXJ9IGggSGVpZ2h0LlxuICogQHBhcmFtIHtDYW52YXNSZW5kZXJpbmdDb250ZXh0MkR9IGcgQ2FudmFzIHJlbmRlcmluZyBjb250ZXh0LlxuICogQHBhcmFtIHtzdHJpbmd9IHMgU3RyaW5nIHRvIHByaW50LlxuICogQHBhcmFtIHtzdHJpbmd9IFtjb2xvcj11bmRlZmluZWRDb2xvcl0gU3RyaW5nIGNvbG9yLlxuICogQHBhcmFtIHtudW1iZXJ9IFtwaXZvdD0wXSBQaXJ2b3QuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtsZWZ0PWZhbHNlXSBJcyBsZWZ0IGFsaWduZWQuXG4gKiBAcGFyYW0ge251bWJlcn0gW3RyYW5zcGFyZW5jeVJhdGU9MC4wXSBUcmFuc3BhcmVuY3kgcmF0ZSB3aGVyZSAxLjAgaXMgZnVsbHkgdHJhbnNwYXJlbnRcbiAqIEBwYXJhbSB7c3RyaW5nfSBbc2VwYXJhdG9yPScnXSBJcyBzZXBhcmF0b3IgZm9yIHNlcXVlbmNlLlxuICogQHBhcmFtIHtib29sZWFufSBbbGFzdD1mYWxzZV0gSXMgY2hlY2tlciBpZiBlbGVtZW50IGxhc3Qgb3Igbm90LlxuICogQHBhcmFtIGRyYXdTdHlsZSBJcyBkcmF3IHN0eWxlLiBNU0EgLSBmb3IgbXVsdGljaGFyU2VxLCBjbGFzc2ljIC0gZm9yIG90aGVyIHNlcS5cbiAqIEBwYXJhbSBtYXhXb3JkIElzIGFycmF5IG9mIG1heCB3b3JkcyBmb3IgZWFjaCBsaW5lLlxuICogQHBhcmFtIHdvcmRJZHggSXMgaW5kZXggb2Ygd29yZCB3ZSBjdXJyZW50bHkgZHJhdy5cbiAqIEBwYXJhbSBncmlkQ2VsbCBJcyBncmlkIGNlbGwuXG4gKiBAcGFyYW0gcmVmZXJlbmNlU2VxdWVuY2UgSXMgcmVmZXJlbmNlIHNlcXVlbmNlIGZvciBkaWZmIG1vZGUuXG4gKiBAcGFyYW0gbWF4TGVuZ3RoT2ZNb25vbWVyIElzIG1heCBsZW5ndGggb2YgbW9ub21lci5cbiAqIEByZXR1cm4ge251bWJlcn0geCBjb29yZGluYXRlIHRvIHN0YXJ0IHByaW50aW5nIGF0LlxuICovXG5leHBvcnQgY29uc3QgcHJpbnRMZWZ0T3JDZW50ZXJlZCA9IChcbiAgeDogbnVtYmVyLCB5OiBudW1iZXIsIHc6IG51bWJlciwgaDogbnVtYmVyLFxuICBnOiBDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQsIHM6IHN0cmluZywgY29sb3I6IHN0cmluZyA9IHVuZGVmaW5lZENvbG9yLFxuICBwaXZvdDogbnVtYmVyID0gMCwgbGVmdCA9IGZhbHNlLCB0cmFuc3BhcmVuY3lSYXRlOiBudW1iZXIgPSAxLjAsXG4gIHNlcGFyYXRvcjogc3RyaW5nID0gJycsIGxhc3Q6IGJvb2xlYW4gPSBmYWxzZSwgZHJhd1N0eWxlOiBEcmF3U3R5bGUgPSBEcmF3U3R5bGUuY2xhc3NpYywgbWF4V29yZDogeyBbaW5kZXg6IHN0cmluZ106IG51bWJlciB9ID0ge30sIHdvcmRJZHg6IG51bWJlciA9IDAsIGdyaWRDZWxsOiBERy5HcmlkQ2VsbCB8IG51bGwgPSBudWxsLCByZWZlcmVuY2VTZXF1ZW5jZTogc3RyaW5nW10gPSBbXSwgbWF4TGVuZ3RoT2ZNb25vbWVyOiBudW1iZXIgfCBudWxsID0gbnVsbCk6IG51bWJlciA9PiB7XG4gIGcudGV4dEFsaWduID0gJ3N0YXJ0JztcbiAgbGV0IGNvbG9yUGFydCA9IHMuc3Vic3RyaW5nKDApO1xuICBsZXQgZ3JheVBhcnQgPSBsYXN0ID8gJycgOiBzZXBhcmF0b3I7XG4gIGlmIChkcmF3U3R5bGUgPT09IERyYXdTdHlsZS5NU0EpIHtcbiAgICBncmF5UGFydCA9ICcnO1xuICB9XG4gIGxldCBjb2xvckNvZGUgPSB0cnVlO1xuICBsZXQgY29tcGFyZVdpdGhDdXJyZW50ID0gdHJ1ZTtcbiAgbGV0IGhpZ2hsaWdodERpZmZlcmVuY2UgPSAnZGlmZmVyZW5jZSc7XG4gIGlmICgoZ3JpZENlbGwgIT0gbnVsbCkgJiYgKGdyaWRDZWxsLmNlbGwuY29sdW1uICE9IG51bGwpKSB7XG4gICAgY29sb3JDb2RlID0gZ3JpZENlbGwuY2VsbC5jb2x1bW4udGVtcFsnY29sb3ItY29kZSddID8/IHRydWU7XG4gICAgY29tcGFyZVdpdGhDdXJyZW50ID0gZ3JpZENlbGwuY2VsbC5jb2x1bW4udGVtcFsnY29tcGFyZS13aXRoLWN1cnJlbnQnXSA/PyB0cnVlO1xuICAgIGhpZ2hsaWdodERpZmZlcmVuY2UgPSBncmlkQ2VsbC5jZWxsLmNvbHVtbi50ZW1wWydoaWdobGlnaHQtZGlmZmVyZW5jZSddID8/ICdkaWZmZXJlbmNlJztcblxuICB9XG4gIGNvbnN0IGN1cnJlbnRNb25vbWVyOiBzdHJpbmcgPSByZWZlcmVuY2VTZXF1ZW5jZVt3b3JkSWR4XTtcbiAgaWYgKGNvbXBhcmVXaXRoQ3VycmVudCAmJiAocmVmZXJlbmNlU2VxdWVuY2UubGVuZ3RoID4gMCkgJiYgKGhpZ2hsaWdodERpZmZlcmVuY2UgPT09ICdkaWZmZXJlbmNlJykpIHtcbiAgICB0cmFuc3BhcmVuY3lSYXRlID0gKGNvbG9yUGFydCA9PSBjdXJyZW50TW9ub21lcikgPyAwLjMgOiB0cmFuc3BhcmVuY3lSYXRlO1xuICB9XG4gIGlmIChjb21wYXJlV2l0aEN1cnJlbnQgJiYgKHJlZmVyZW5jZVNlcXVlbmNlLmxlbmd0aCA+IDApICYmIChoaWdobGlnaHREaWZmZXJlbmNlID09PSAnZXF1YWwnKSkge1xuICAgIHRyYW5zcGFyZW5jeVJhdGUgPSAoY29sb3JQYXJ0ICE9IGN1cnJlbnRNb25vbWVyKSA/IDAuMyA6IHRyYW5zcGFyZW5jeVJhdGU7XG4gIH1cbiAgaWYgKG1heExlbmd0aE9mTW9ub21lciAhPSBudWxsKSB7XG4gICAgY29sb3JQYXJ0ID0gbW9ub21lclRvU2hvcnRGdW5jdGlvbihjb2xvclBhcnQsIG1heExlbmd0aE9mTW9ub21lcik7XG4gIH1cblxuXG4gIGxldCB0ZXh0U2l6ZTogYW55ID0gZy5tZWFzdXJlVGV4dChjb2xvclBhcnQgKyBncmF5UGFydCk7XG4gIGNvbnN0IGluZGVudCA9IDU7XG5cbiAgbGV0IG1heENvbG9yVGV4dFNpemUgPSBnLm1lYXN1cmVUZXh0KGNvbG9yUGFydCkud2lkdGg7XG4gIGxldCBjb2xvclRleHRTaXplID0gZy5tZWFzdXJlVGV4dChjb2xvclBhcnQpLndpZHRoO1xuICBjb25zdCBkeSA9IGggLyAyIC0gKHRleHRTaXplLmZvbnRCb3VuZGluZ0JveEFzY2VudCArIHRleHRTaXplLmZvbnRCb3VuZGluZ0JveERlc2NlbnQpIC8gMiArIDE7XG4gIHRleHRTaXplID0gdGV4dFNpemUud2lkdGg7XG4gIGlmIChkcmF3U3R5bGUgPT09IERyYXdTdHlsZS5NU0EpIHtcbiAgICBtYXhDb2xvclRleHRTaXplID0gbWF4V29yZFt3b3JkSWR4XTtcbiAgICB0ZXh0U2l6ZSA9IG1heFdvcmRbd29yZElkeF07XG4gIH1cblxuICBmdW5jdGlvbiBkcmF3KGR4MTogbnVtYmVyLCBkeDI6IG51bWJlcik6IHZvaWQge1xuICAgIGNvbnN0IGRyYXdDb2xvciA9IGNvbG9yQ29kZSA/IGNvbG9yIDogYmxhY2tDb2xvcjtcbiAgICBnLmZpbGxTdHlsZSA9IGRyYXdDb2xvcjtcbiAgICBnLmdsb2JhbEFscGhhID0gdHJhbnNwYXJlbmN5UmF0ZTtcbiAgICBpZiAoZHJhd1N0eWxlID09PSBEcmF3U3R5bGUuY2xhc3NpYykge1xuICAgICAgZy5maWxsVGV4dChjb2xvclBhcnQsIHggKyBkeDEsIHkgKyBkeSk7XG4gICAgICBnLmZpbGxTdHlsZSA9IGdyYXlDb2xvcjtcbiAgICAgIGcuZmlsbFRleHQoZ3JheVBhcnQsIHggKyBkeDIsIHkgKyBkeSk7XG4gICAgfVxuICAgIGlmIChkcmF3U3R5bGUgPT09IERyYXdTdHlsZS5NU0EpIHtcbiAgICAgIGcuZmlsbFN0eWxlID0gZHJhd0NvbG9yO1xuICAgICAgZy5maWxsVGV4dChjb2xvclBhcnQsIHggKyBkeDEgKyAoKG1heFdvcmRbd29yZElkeF0gLSBjb2xvclRleHRTaXplKSAvIDIpLCB5ICsgZHkpO1xuICAgIH1cbiAgfVxuXG4gIGlmIChsZWZ0IHx8IHRleHRTaXplID4gdykge1xuICAgIGRyYXcoaW5kZW50LCBpbmRlbnQgKyBtYXhDb2xvclRleHRTaXplKTtcbiAgICByZXR1cm4geCArIG1heENvbG9yVGV4dFNpemUgKyBnLm1lYXN1cmVUZXh0KGdyYXlQYXJ0KS53aWR0aDtcblxuICB9IGVsc2Uge1xuICAgIGNvbnN0IGR4ID0gKHcgLSB0ZXh0U2l6ZSkgLyAyO1xuICAgIGRyYXcoZHgsIGR4ICsgbWF4Q29sb3JUZXh0U2l6ZSk7XG4gICAgcmV0dXJuIHggKyBkeCArIG1heENvbG9yVGV4dFNpemU7XG4gIH1cbn07XG5cbiJdfQ==
901
-
902
- /***/ }),
903
-
904
- /***/ "./node_modules/@datagrok-libraries/bio/src/utils/macromolecule.js":
905
- /*!*************************************************************************!*\
906
- !*** ./node_modules/@datagrok-libraries/bio/src/utils/macromolecule.js ***!
907
- \*************************************************************************/
908
- /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
909
-
910
- __webpack_require__.r(__webpack_exports__);
911
- /* harmony export */ __webpack_require__.d(__webpack_exports__, {
912
- /* harmony export */ "detectAlphabet": () => (/* binding */ detectAlphabet),
913
- /* harmony export */ "getAlphabet": () => (/* binding */ getAlphabet),
914
- /* harmony export */ "getAlphabetSimilarity": () => (/* binding */ getAlphabetSimilarity),
915
- /* harmony export */ "getPaletteByType": () => (/* binding */ getPaletteByType),
916
- /* harmony export */ "getSplitter": () => (/* binding */ getSplitter),
917
- /* harmony export */ "getSplitterForColumn": () => (/* binding */ getSplitterForColumn),
918
- /* harmony export */ "getSplitterWithSeparator": () => (/* binding */ getSplitterWithSeparator),
919
- /* harmony export */ "getStats": () => (/* binding */ getStats),
920
- /* harmony export */ "monomerRe": () => (/* binding */ monomerRe),
921
- /* harmony export */ "monomerToShort": () => (/* binding */ monomerToShort),
922
- /* harmony export */ "pickUpPalette": () => (/* binding */ pickUpPalette),
923
- /* harmony export */ "pickUpSeqCol": () => (/* binding */ pickUpSeqCol),
924
- /* harmony export */ "splitterAsFasta": () => (/* binding */ splitterAsFasta),
925
- /* harmony export */ "splitterAsHelm": () => (/* binding */ splitterAsHelm)
926
- /* harmony export */ });
927
- /* harmony import */ var datagrok_api_dg__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! datagrok-api/dg */ "datagrok-api/dg");
928
- /* harmony import */ var datagrok_api_dg__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(datagrok_api_dg__WEBPACK_IMPORTED_MODULE_0__);
929
- /* harmony import */ var wu__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! wu */ "wu");
930
- /* harmony import */ var wu__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(wu__WEBPACK_IMPORTED_MODULE_1__);
931
- /* harmony import */ var _datagrok_libraries_utils_src_type_declarations__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @datagrok-libraries/utils/src/type-declarations */ "./node_modules/@datagrok-libraries/bio/node_modules/@datagrok-libraries/utils/src/type-declarations.js");
932
- /* harmony import */ var _datagrok_libraries_utils_src_vector_operations__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @datagrok-libraries/utils/src/vector-operations */ "./node_modules/@datagrok-libraries/bio/node_modules/@datagrok-libraries/utils/src/vector-operations.js");
933
- /* harmony import */ var _aminoacids__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../aminoacids */ "./node_modules/@datagrok-libraries/bio/src/aminoacids.js");
934
- /* harmony import */ var _nucleotides__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../nucleotides */ "./node_modules/@datagrok-libraries/bio/src/nucleotides.js");
935
- /* harmony import */ var _unknown__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../unknown */ "./node_modules/@datagrok-libraries/bio/src/unknown.js");
936
- /* harmony import */ var _utils_units_handler__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../utils/units-handler */ "./node_modules/@datagrok-libraries/bio/src/utils/units-handler.js");
937
-
938
-
939
-
940
-
941
-
942
-
943
-
944
-
945
- ;
946
- /** Stats of sequences with specified splitter func, returns { freq, sameLength }.
947
- * @param {DG.Column} seqCol
948
- * @param {number} minLength
949
- * @param {SplitterFunc} splitter
950
- * @return { SeqColStats }, sameLength: boolean } stats of column sequences
951
- */
952
- function getStats(seqCol, minLength, splitter) {
953
- const freq = {};
954
- let sameLength = true;
955
- let firstLength = null;
956
- for (const seq of seqCol.categories) {
957
- const mSeq = splitter(seq);
958
- if (firstLength == null)
959
- firstLength = mSeq.length;
960
- else if (mSeq.length !== firstLength)
961
- sameLength = false;
962
- if (mSeq.length >= minLength) {
963
- for (const m of mSeq) {
964
- if (!(m in freq))
965
- freq[m] = 0;
966
- freq[m] += 1;
967
- }
968
- }
969
- }
970
- return { freq: freq, sameLength: sameLength };
971
- }
972
- const monomerRe = /\[(\w+)\]|(\w)|(-)/g;
973
- /** Split sequence for single character monomers, square brackets multichar monomer names or gap symbol.
974
- * @param {any} seq object with sequence
975
- * @return {string[]} array of monomers
976
- */
977
- function splitterAsFasta(seq) {
978
- return wu__WEBPACK_IMPORTED_MODULE_1___default()(seq.toString().matchAll(monomerRe))
979
- .map((ma) => {
980
- let mRes;
981
- const m = ma[0];
982
- if (m.length > 1) {
983
- mRes = ma[1];
984
- }
985
- else {
986
- mRes = m;
987
- }
988
- return mRes;
989
- }).toArray();
990
- }
991
- /** Gets method to split sequence by separator
992
- * @param {string} separator
993
- * @param limit
994
- * @return {SplitterFunc}
995
- */
996
- function getSplitterWithSeparator(separator, limit = undefined) {
997
- return (seq) => {
998
- return seq.split(separator, limit);
999
- };
1000
- }
1001
- const helmRe = /(PEPTIDE1|DNA1|RNA1)\{([^}]+)}/g;
1002
- const helmPp1Re = /\[([^\[\]]+)]/g;
1003
- /** Splits Helm string to monomers, but does not replace monomer names to other notation (e.g. for RNA).
1004
- * Only for linear polymers, does not split RNA for ribose and phosphate monomers.
1005
- * @param {string} seq Source string of HELM notation
1006
- * @return {string[]}
1007
- */
1008
- function splitterAsHelm(seq) {
1009
- helmRe.lastIndex = 0;
1010
- const ea = helmRe.exec(seq.toString());
1011
- const inSeq = ea ? ea[2] : null;
1012
- const mmPostProcess = (mm) => {
1013
- helmPp1Re.lastIndex = 0;
1014
- const pp1M = helmPp1Re.exec(mm);
1015
- if (pp1M && pp1M.length >= 2)
1016
- return pp1M[1];
1017
- else
1018
- return mm;
1019
- };
1020
- const mmList = inSeq ? inSeq.split('.') : [];
1021
- return mmList.map(mmPostProcess);
1022
- }
1023
- /** Get splitter method to split sequences to monomers
1024
- * @param {string} units
1025
- * @param {string} separator
1026
- * @param limit
1027
- * @return {SplitterFunc}
1028
- */
1029
- function getSplitter(units, separator, limit = undefined) {
1030
- if (units.toLowerCase().startsWith("fasta" /* NOTATION.FASTA */))
1031
- return splitterAsFasta;
1032
- else if (units.toLowerCase().startsWith("separator" /* NOTATION.SEPARATOR */))
1033
- return getSplitterWithSeparator(separator, limit);
1034
- else if (units.toLowerCase().startsWith("helm" /* NOTATION.HELM */))
1035
- return splitterAsHelm;
1036
- else
1037
- throw new Error(`Unexpected units ${units} .`);
1038
- // TODO: Splitter for HELM
1039
- }
1040
- /** Generate splitter function for sequence column
1041
- * @param {DG.Column} col
1042
- * @return {SplitterFunc} Splitter function
1043
- */
1044
- function getSplitterForColumn(col) {
1045
- if (col.semType !== datagrok_api_dg__WEBPACK_IMPORTED_MODULE_0__.SEMTYPE.MACROMOLECULE)
1046
- throw new Error(`Get splitter for semType "${datagrok_api_dg__WEBPACK_IMPORTED_MODULE_0__.SEMTYPE.MACROMOLECULE}" only.`);
1047
- const units = col.getTag(datagrok_api_dg__WEBPACK_IMPORTED_MODULE_0__.TAGS.UNITS);
1048
- const separator = col.getTag("separator" /* TAGS.separator */);
1049
- return getSplitter(units, separator);
1050
- }
1051
- const longMonomerPartRe = /(\w+)/g;
1052
- /** Convert long monomer names to short ones */
1053
- function monomerToShort(amino, maxLengthOfMonomer) {
1054
- var _a, _b;
1055
- const shortAminoMatch = amino.match(longMonomerPartRe);
1056
- const needAddDots = amino.length > maxLengthOfMonomer || ((_a = shortAminoMatch === null || shortAminoMatch === void 0 ? void 0 : shortAminoMatch.length) !== null && _a !== void 0 ? _a : 0) > 1;
1057
- const shortAmino = (_b = shortAminoMatch === null || shortAminoMatch === void 0 ? void 0 : shortAminoMatch[0]) !== null && _b !== void 0 ? _b : ' ';
1058
- return !needAddDots ? shortAmino : shortAmino.substring(0, maxLengthOfMonomer) + '…';
1059
- }
1060
- /** */
1061
- function getAlphabet(alphabet) {
1062
- switch (alphabet) {
1063
- case "DNA" /* ALPHABET.DNA */:
1064
- return _utils_units_handler__WEBPACK_IMPORTED_MODULE_7__.UnitsHandler.DnaFastaAlphabet;
1065
- case "RNA" /* ALPHABET.RNA */:
1066
- return _utils_units_handler__WEBPACK_IMPORTED_MODULE_7__.UnitsHandler.RnaFastaAlphabet;
1067
- case "PT" /* ALPHABET.PT */:
1068
- return _utils_units_handler__WEBPACK_IMPORTED_MODULE_7__.UnitsHandler.PeptideFastaAlphabet;
1069
- default:
1070
- throw new Error(`Unsupported alphabet '${alphabet}'.`);
1071
- }
1072
- }
1073
- /** Calculate similarity in current sequence and alphabet.
1074
- * @param {MonomerFreqs} freq
1075
- * @param {Set<string>} alphabet
1076
- * @param {string} gapSymbol
1077
- * @return {number} Cosine similarity
1078
- */
1079
- function getAlphabetSimilarity(freq, alphabet, gapSymbol = '-') {
1080
- const keys = new Set([...new Set(Object.keys(freq)), ...alphabet]);
1081
- keys.delete(gapSymbol);
1082
- const freqA = [];
1083
- const alphabetA = [];
1084
- for (const m of keys) {
1085
- freqA.push(m in freq ? freq[m] : 0);
1086
- alphabetA.push(alphabet.has(m) ? 1 : 0);
1087
- }
1088
- /* There were a few ideas: chi-squared, pearson correlation (variance?), scalar product */
1089
- const freqV = new _datagrok_libraries_utils_src_type_declarations__WEBPACK_IMPORTED_MODULE_2__.Vector(freqA);
1090
- const alphabetV = new _datagrok_libraries_utils_src_type_declarations__WEBPACK_IMPORTED_MODULE_2__.Vector(alphabetA);
1091
- return (0,_datagrok_libraries_utils_src_vector_operations__WEBPACK_IMPORTED_MODULE_3__.vectorDotProduct)(freqV, alphabetV) / ((0,_datagrok_libraries_utils_src_vector_operations__WEBPACK_IMPORTED_MODULE_3__.vectorLength)(freqV) * (0,_datagrok_libraries_utils_src_vector_operations__WEBPACK_IMPORTED_MODULE_3__.vectorLength)(alphabetV));
1092
- }
1093
- function detectAlphabet(stats) {
1094
- const alphabetCandidates = [
1095
- ["PT" /* ALPHABET.PT */, _utils_units_handler__WEBPACK_IMPORTED_MODULE_7__.UnitsHandler.PeptideFastaAlphabet],
1096
- ["DNA" /* ALPHABET.DNA */, _utils_units_handler__WEBPACK_IMPORTED_MODULE_7__.UnitsHandler.DnaFastaAlphabet],
1097
- ["RNA" /* ALPHABET.RNA */, _utils_units_handler__WEBPACK_IMPORTED_MODULE_7__.UnitsHandler.RnaFastaAlphabet],
1098
- ];
1099
- // Calculate likelihoods for alphabet_candidates
1100
- const alphabetCandidatesSim = alphabetCandidates.map((c) => getAlphabetSimilarity(stats.freq, c[1]));
1101
- const maxCos = Math.max(...alphabetCandidatesSim);
1102
- const alphabet = maxCos > 0.65 ? alphabetCandidates[alphabetCandidatesSim.indexOf(maxCos)][0] : 'UN';
1103
- return alphabet;
1104
- }
1105
- /** Selects a suitable palette based on column data
1106
- * @param {DG.Column} seqCol Column to look for a palette
1107
- * @param {number} minLength minimum length of sequence to detect palette (empty strings are allowed)
1108
- * @return {SeqPalette} Palette corresponding to the alphabet of the sequences in the column
1109
- */
1110
- function pickUpPalette(seqCol, minLength = 5) {
1111
- let alphabet;
1112
- if (seqCol.semType == datagrok_api_dg__WEBPACK_IMPORTED_MODULE_0__.SEMTYPE.MACROMOLECULE) {
1113
- const uh = new _utils_units_handler__WEBPACK_IMPORTED_MODULE_7__.UnitsHandler(seqCol);
1114
- alphabet = uh.alphabet;
1115
- }
1116
- else {
1117
- const stats = getStats(seqCol, minLength, splitterAsFasta);
1118
- alphabet = detectAlphabet(stats);
1119
- }
1120
- const res = getPaletteByType(alphabet);
1121
- return res;
1122
- }
1123
- function getPaletteByType(paletteType) {
1124
- switch (paletteType) {
1125
- case 'PT':
1126
- return _aminoacids__WEBPACK_IMPORTED_MODULE_4__.AminoacidsPalettes.GrokGroups;
1127
- case 'NT':
1128
- case 'DNA':
1129
- case 'RNA':
1130
- return _nucleotides__WEBPACK_IMPORTED_MODULE_5__.NucleotidesPalettes.Chromatogram;
1131
- // other
1132
- default:
1133
- return _unknown__WEBPACK_IMPORTED_MODULE_6__.UnknownSeqPalettes.Color;
1134
- }
1135
- }
1136
- function pickUpSeqCol(df) {
1137
- var _a;
1138
- const semTypeColList = df.columns.bySemTypeAll(datagrok_api_dg__WEBPACK_IMPORTED_MODULE_0__.SEMTYPE.MACROMOLECULE);
1139
- let resCol = (_a = semTypeColList.find((col) => {
1140
- const units = col.getTag(datagrok_api_dg__WEBPACK_IMPORTED_MODULE_0__.TAGS.UNITS);
1141
- return units ? units.indexOf('MSA') !== -1 : false;
1142
- })) !== null && _a !== void 0 ? _a : null;
1143
- if (!resCol && semTypeColList.length > 0)
1144
- resCol = semTypeColList[0];
1145
- return resCol;
1146
- }
1147
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFjcm9tb2xlY3VsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIm1hY3JvbW9sZWN1bGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsT0FBTyxLQUFLLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUN0QyxPQUFPLEVBQUUsTUFBTSxJQUFJLENBQUM7QUFFcEIsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLGlEQUFpRCxDQUFDO0FBQ3ZFLE9BQU8sRUFBQyxZQUFZLEVBQUUsZ0JBQWdCLEVBQUMsTUFBTSxpREFBaUQsQ0FBQztBQUUvRixPQUFPLEVBQWEsa0JBQWtCLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDN0QsT0FBTyxFQUFjLG1CQUFtQixFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFDaEUsT0FBTyxFQUFDLGtCQUFrQixFQUFDLE1BQU0sWUFBWSxDQUFDO0FBQzlDLE9BQU8sRUFBQyxZQUFZLEVBQUMsTUFBTSx3QkFBd0IsQ0FBQztBQTRCbkQsQ0FBQztBQU1GOzs7OztHQUtHO0FBQ0gsTUFBTSxVQUFVLFFBQVEsQ0FBQyxNQUFpQixFQUFFLFNBQWlCLEVBQUUsUUFBc0I7SUFDbkYsTUFBTSxJQUFJLEdBQTRCLEVBQUUsQ0FBQztJQUN6QyxJQUFJLFVBQVUsR0FBRyxJQUFJLENBQUM7SUFDdEIsSUFBSSxXQUFXLEdBQUcsSUFBSSxDQUFDO0lBRXZCLEtBQUssTUFBTSxHQUFHLElBQUksTUFBTSxDQUFDLFVBQVUsRUFBRTtRQUNuQyxNQUFNLElBQUksR0FBRyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUM7UUFFM0IsSUFBSSxXQUFXLElBQUksSUFBSTtZQUNyQixXQUFXLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQzthQUN2QixJQUFJLElBQUksQ0FBQyxNQUFNLEtBQUssV0FBVztZQUNsQyxVQUFVLEdBQUcsS0FBSyxDQUFDO1FBRXJCLElBQUksSUFBSSxDQUFDLE1BQU0sSUFBSSxTQUFTLEVBQUU7WUFDNUIsS0FBSyxNQUFNLENBQUMs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QUFDLENBQUMsS0FBSyxDQUFDO0lBQ3JELENBQUMsQ0FBQyxtQ0FBSSxJQUFJLENBQUM7SUFDWCxJQUFJLENBQUMsTUFBTSxJQUFJLGNBQWMsQ0FBQyxNQUFNLEdBQUcsQ0FBQztRQUN0QyxNQUFNLEdBQUcsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzdCLE9BQU8sTUFBTSxDQUFDO0FBQ2hCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBncm9rIGZyb20gJ2RhdGFncm9rLWFwaS9ncm9rJztcbmltcG9ydCAqIGFzIHVpIGZyb20gJ2RhdGFncm9rLWFwaS91aSc7XG5pbXBvcnQgKiBhcyBERyBmcm9tICdkYXRhZ3Jvay1hcGkvZGcnO1xuaW1wb3J0IHd1IGZyb20gJ3d1JztcblxuaW1wb3J0IHtWZWN0b3J9IGZyb20gJ0BkYXRhZ3Jvay1saWJyYXJpZXMvdXRpbHMvc3JjL3R5cGUtZGVjbGFyYXRpb25zJztcbmltcG9ydCB7dmVjdG9yTGVuZ3RoLCB2ZWN0b3JEb3RQcm9kdWN0fSBmcm9tICdAZGF0YWdyb2stbGlicmFyaWVzL3V0aWxzL3NyYy92ZWN0b3Itb3BlcmF0aW9ucyc7XG5pbXBvcnQge1NlcVBhbGV0dGV9IGZyb20gJy4uL3NlcS1wYWxldHRlcyc7XG5pbXBvcnQge0FtaW5vYWNpZHMsIEFtaW5vYWNpZHNQYWxldHRlc30gZnJvbSAnLi4vYW1pbm9hY2lkcyc7XG5pbXBvcnQge051Y2xlb3RpZGVzLCBOdWNsZW90aWRlc1BhbGV0dGVzfSBmcm9tICcuLi9udWNsZW90aWRlcyc7XG5pbXBvcnQge1Vua25vd25TZXFQYWxldHRlc30gZnJvbSAnLi4vdW5rbm93bic7XG5pbXBvcnQge1VuaXRzSGFuZGxlcn0gZnJvbSAnLi4vdXRpbHMvdW5pdHMtaGFuZGxlcic7XG5cblxuLyoqIGVudW0gdHlwZSB0byBzaW1wbGlmeSBzZXR0aW5nIFwidXNlci1mcmllbmRseVwiIG5vdGF0aW9uIGlmIG5lY2Vzc2FyeSAqL1xuZXhwb3J0IGNvbnN0IGVudW0gTk9UQVRJT04ge1xuICBGQVNUQSA9ICdmYXN0YScsXG4gIFNFUEFSQVRPUiA9ICdzZXBhcmF0b3InLFxuICBIRUxNID0gJ2hlbG0nLFxufVxuXG5leHBvcnQgY29uc3QgZW51bSBBTElHTk1FTlQge1xuICBTRVFfTVNBID0gJ1NFUS5NU0EnLFxuICBTRVEgPSAnU0VRJyxcbn1cblxuZXhwb3J0IGNvbnN0IGVudW0gQUxQSEFCRVQge1xuICBETkEgPSAnRE5BJyxcbiAgUk5BID0gJ1JOQScsXG4gIFBUID0gJ1BUJyxcbiAgVU4gPSAnVU4nLFxufVxuXG5leHBvcnQgY29uc3QgZW51bSBUQUdTIHtcbiAgYWxpZ25lZCA9ICdhbGlnbmVkJyxcbiAgYWxwaGFiZXQgPSAnYWxwaGFiZXQnLFxuICBhbHBoYWJldFNpemUgPSAnLmFscGhhYmV0U2l6ZScsXG4gIGFscGhhYmV0SXNNdWx0aWNoYXIgPSAnLmFscGhhYmV0SXNNdWx0aWNoYXInLFxuICBzZXBhcmF0b3IgPSAnc2VwYXJhdG9yJyxcbn07XG5cbmV4cG9ydCB0eXBlIFNlcUNvbFN0YXRzID0geyBmcmVxOiBNb25vbWVyRnJlcXMsIHNhbWVMZW5ndGg6IGJvb2xlYW4gfVxuZXhwb3J0IHR5cGUgU3BsaXR0ZXJGdW5jID0gKHNlcTogc3RyaW5nKSA9PiBzdHJpbmdbXTtcbmV4cG9ydCB0eXBlIE1vbm9tZXJGcmVxcyA9IHsgW206IHN0cmluZ106IG51bWJlciB9O1xuXG4vKiogU3RhdHMgb2Ygc2VxdWVuY2VzIHdpdGggc3BlY2lmaWVkIHNwbGl0dGVyIGZ1bmMsIHJldHVybnMgeyBmcmVxLCBzYW1lTGVuZ3RoIH0uXG4gKiBAcGFyYW0ge0RHLkNvbHVtbn0gc2VxQ29sXG4gKiBAcGFyYW0ge251bWJlcn0gbWluTGVuZ3RoXG4gKiBAcGFyYW0ge1NwbGl0dGVyRnVuY30gc3BsaXR0ZXJcbiAqIEByZXR1cm4geyBTZXFDb2xTdGF0cyB9LCBzYW1lTGVuZ3RoOiBib29sZWFuIH0gc3RhdHMgb2YgY29sdW1uIHNlcXVlbmNlc1xuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0U3RhdHMoc2VxQ29sOiBERy5Db2x1bW4sIG1pbkxlbmd0aDogbnVtYmVyLCBzcGxpdHRlcjogU3BsaXR0ZXJGdW5jKTogU2VxQ29sU3RhdHMge1xuICBjb25zdCBmcmVxOiB7IFttOiBzdHJpbmddOiBudW1iZXIgfSA9IHt9O1xuICBsZXQgc2FtZUxlbmd0aCA9IHRydWU7XG4gIGxldCBmaXJzdExlbmd0aCA9IG51bGw7XG5cbiAgZm9yIChjb25zdCBzZXEgb2Ygc2VxQ29sLmNhdGVnb3JpZXMpIHtcbiAgICBjb25zdCBtU2VxID0gc3BsaXR0ZXIoc2VxKTtcblxuICAgIGlmIChmaXJzdExlbmd0aCA9PSBudWxsKVxuICAgICAgZmlyc3RMZW5ndGggPSBtU2VxLmxlbmd0aDtcbiAgICBlbHNlIGlmIChtU2VxLmxlbmd0aCAhPT0gZmlyc3RMZW5ndGgpXG4gICAgICBzYW1lTGVuZ3RoID0gZmFsc2U7XG5cbiAgICBpZiAobVNlcS5sZW5ndGggPj0gbWluTGVuZ3RoKSB7XG4gICAgICBmb3IgKGNvbnN0IG0gb2YgbVNlcSkge1xuICAgICAgICBpZiAoIShtIGluIGZyZXEpKVxuICAgICAgICAgIGZyZXFbbV0gPSAwO1xuICAgICAgICBmcmVxW21dICs9IDE7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiB7ZnJlcTogZnJlcSwgc2FtZUxlbmd0aDogc2FtZUxlbmd0aH07XG59XG5cbmV4cG9ydCBjb25zdCBtb25vbWVyUmU6IFJlZ0V4cCA9IC9cXFsoXFx3KylcXF18KFxcdyl8KC0pL2c7XG5cbi8qKiBTcGxpdCBzZXF1ZW5jZSBmb3Igc2luZ2xlIGNoYXJhY3RlciBtb25vbWVycywgc3F1YXJlIGJyYWNrZXRzIG11bHRpY2hhciBtb25vbWVyIG5hbWVzIG9yIGdhcCBzeW1ib2wuXG4gKiBAcGFyYW0ge2FueX0gc2VxIG9iamVjdCB3aXRoIHNlcXVlbmNlXG4gKiBAcmV0dXJuIHtzdHJpbmdbXX0gYXJyYXkgb2YgbW9ub21lcnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNwbGl0dGVyQXNGYXN0YShzZXE6IGFueSk6IHN0cmluZ1tdIHtcbiAgcmV0dXJuIHd1PFJlZ0V4cE1hdGNoQXJyYXk+KHNlcS50b1N0cmluZygpLm1hdGNoQWxsKG1vbm9tZXJSZSkpXG4gICAgLm1hcCgobWE6IFJlZ0V4cE1hdGNoQXJyYXkpID0+IHtcbiAgICAgIGxldCBtUmVzOiBzdHJpbmc7XG4gICAgICBjb25zdCBtOiBzdHJpbmcgPSBtYVswXTtcbiAgICAgIGlmIChtLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgbVJlcyA9IG1hWzFdO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbVJlcyA9IG07XG4gICAgICB9XG4gICAgICByZXR1cm4gbVJlcztcbiAgICB9KS50b0FycmF5KCk7XG59XG5cbi8qKiBHZXRzIG1ldGhvZCB0byBzcGxpdCBzZXF1ZW5jZSBieSBzZXBhcmF0b3JcbiAqIEBwYXJhbSB7c3RyaW5nfSBzZXBhcmF0b3JcbiAqIEBwYXJhbSBsaW1pdFxuICogQHJldHVybiB7U3BsaXR0ZXJGdW5jfVxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0U3BsaXR0ZXJXaXRoU2VwYXJhdG9yKHNlcGFyYXRvcjogc3RyaW5nLCBsaW1pdDogbnVtYmVyIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkKTogU3BsaXR0ZXJGdW5jIHtcbiAgcmV0dXJuIChzZXE6IHN0cmluZykgPT4ge1xuICAgIHJldHVybiBzZXEuc3BsaXQoc2VwYXJhdG9yLCBsaW1pdCk7XG4gIH07XG59XG5cbmNvbnN0IGhlbG1SZTogUmVnRXhwID0gLyhQRVBUSURFMXxETkExfFJOQTEpXFx7KFtefV0rKX0vZztcbmNvbnN0IGhlbG1QcDFSZTogUmVnRXhwID0gL1xcWyhbXlxcW1xcXV0rKV0vZztcblxuLyoqIFNwbGl0cyBIZWxtIHN0cmluZyB0byBtb25vbWVycywgYnV0IGRvZXMgbm90IHJlcGxhY2UgbW9ub21lciBuYW1lcyB0byBvdGhlciBub3RhdGlvbiAoZS5nLiBmb3IgUk5BKS5cbiAqIE9ubHkgZm9yIGxpbmVhciBwb2x5bWVycywgZG9lcyBub3Qgc3BsaXQgUk5BIGZvciByaWJvc2UgYW5kIHBob3NwaGF0ZSBtb25vbWVycy5cbiAqIEBwYXJhbSB7c3RyaW5nfSBzZXEgU291cmNlIHN0cmluZyBvZiBIRUxNIG5vdGF0aW9uXG4gKiBAcmV0dXJuIHtzdHJpbmdbXX1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNwbGl0dGVyQXNIZWxtKHNlcTogYW55KTogc3RyaW5nW10ge1xuICBoZWxtUmUubGFzdEluZGV4ID0gMDtcbiAgY29uc3QgZWE6IFJlZ0V4cEV4ZWNBcnJheSB8IG51bGwgPSBoZWxtUmUuZXhlYyhzZXEudG9TdHJpbmcoKSk7XG4gIGNvbnN0IGluU2VxOiBzdHJpbmcgfCBudWxsID0gZWEgPyBlYVsyXSA6IG51bGw7XG5cbiAgY29uc3QgbW1Qb3N0UHJvY2VzcyA9IChtbTogc3RyaW5nKTogc3RyaW5nID0+IHtcbiAgICBoZWxtUHAxUmUubGFzdEluZGV4ID0gMDtcbiAgICBjb25zdCBwcDFNID0gaGVsbVBwMVJlLmV4ZWMobW0pO1xuICAgIGlmIChwcDFNICYmIHBwMU0ubGVuZ3RoID49IDIpXG4gICAgICByZXR1cm4gcHAxTVsxXTtcbiAgICBlbHNlXG4gICAgICByZXR1cm4gbW07XG4gIH07XG5cbiAgY29uc3QgbW1MaXN0OiBzdHJpbmdbXSA9IGluU2VxID8gaW5TZXEuc3BsaXQoJy4nKSA6IFtdO1xuICByZXR1cm4gbW1MaXN0Lm1hcChtbVBvc3RQcm9jZXNzKTtcbn1cblxuLyoqIEdldCBzcGxpdHRlciBtZXRob2QgdG8gc3BsaXQgc2VxdWVuY2VzIHRvIG1vbm9tZXJzXG4gKiBAcGFyYW0ge3N0cmluZ30gdW5pdHNcbiAqIEBwYXJhbSB7c3RyaW5nfSBzZXBhcmF0b3JcbiAqIEBwYXJhbSBsaW1pdFxuICogQHJldHVybiB7U3BsaXR0ZXJGdW5jfVxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0U3BsaXR0ZXIodW5pdHM6IHN0cmluZywgc2VwYXJhdG9yOiBzdHJpbmcsIGxpbWl0OiBudW1iZXIgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQpOiBTcGxpdHRlckZ1bmMge1xuICBpZiAodW5pdHMudG9Mb3dlckNhc2UoKS5zdGFydHNXaXRoKE5PVEFUSU9OLkZBU1RBKSlcbiAgICByZXR1cm4gc3BsaXR0ZXJBc0Zhc3RhO1xuICBlbHNlIGlmICh1bml0cy50b0xvd2VyQ2FzZSgpLnN0YXJ0c1dpdGgoTk9UQVRJT04uU0VQQVJBVE9SKSlcbiAgICByZXR1cm4gZ2V0U3BsaXR0ZXJXaXRoU2VwYXJhdG9yKHNlcGFyYXRvciwgbGltaXQpO1xuICBlbHNlIGlmICh1bml0cy50b0xvd2VyQ2FzZSgpLnN0YXJ0c1dpdGgoTk9UQVRJT04uSEVMTSkpXG4gICAgcmV0dXJuIHNwbGl0dGVyQXNIZWxtO1xuICBlbHNlXG4gICAgdGhyb3cgbmV3IEVycm9yKGBVbmV4cGVjdGVkIHVuaXRzICR7dW5pdHN9IC5gKTtcblxuICAvLyBUT0RPOiBTcGxpdHRlciBmb3IgSEVMTVxufVxuXG4vKiogR2VuZXJhdGUgc3BsaXR0ZXIgZnVuY3Rpb24gZm9yIHNlcXVlbmNlIGNvbHVtblxuICogQHBhcmFtIHtERy5Db2x1bW59IGNvbFxuICogQHJldHVybiB7U3BsaXR0ZXJGdW5jfSBTcGxpdHRlciBmdW5jdGlvblxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0U3BsaXR0ZXJGb3JDb2x1bW4oY29sOiBERy5Db2x1bW4pOiBTcGxpdHRlckZ1bmMge1xuICBpZiAoY29sLnNlbVR5cGUgIT09IERHLlNFTVRZUEUuTUFDUk9NT0xFQ1VMRSlcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEdldCBzcGxpdHRlciBmb3Igc2VtVHlwZSBcIiR7REcuU0VNVFlQRS5NQUNST01PTEVDVUxFfVwiIG9ubHkuYCk7XG5cbiAgY29uc3QgdW5pdHMgPSBjb2wuZ2V0VGFnKERHLlRBR1MuVU5JVFMpO1xuICBjb25zdCBzZXBhcmF0b3IgPSBjb2wuZ2V0VGFnKFRBR1Muc2VwYXJhdG9yKTtcbiAgcmV0dXJuIGdldFNwbGl0dGVyKHVuaXRzLCBzZXBhcmF0b3IpO1xufVxuXG5jb25zdCBsb25nTW9ub21lclBhcnRSZTogUmVnRXhwID0gLyhcXHcrKS9nO1xuXG4vKiogQ29udmVydCBsb25nIG1vbm9tZXIgbmFtZXMgdG8gc2hvcnQgb25lcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1vbm9tZXJUb1Nob3J0KGFtaW5vOiBzdHJpbmcsIG1heExlbmd0aE9mTW9ub21lcjogbnVtYmVyKTogc3RyaW5nIHtcbiAgY29uc3Qgc2hvcnRBbWlub01hdGNoOiBSZWdFeHBNYXRjaEFycmF5IHwgbnVsbCA9IGFtaW5vLm1hdGNoKGxvbmdNb25vbWVyUGFydFJlKTtcbiAgY29uc3QgbmVlZEFkZERvdHM6IGJvb2xlYW4gPSBhbWluby5sZW5ndGggPiBtYXhMZW5ndGhPZk1vbm9tZXIgfHwgKHNob3J0QW1pbm9NYXRjaD8ubGVuZ3RoID8/IDApID4gMTtcbiAgY29uc3Qgc2hvcnRBbWlubyA9IHNob3J0QW1pbm9NYXRjaD8uWzBdID8/ICcgJztcbiAgcmV0dXJuICFuZWVkQWRkRG90cyA/IHNob3J0QW1pbm8gOiBzaG9ydEFtaW5vLnN1YnN0cmluZygwLCBtYXhMZW5ndGhPZk1vbm9tZXIpICsgJ+KApic7XG59XG5cbi8qKiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEFscGhhYmV0KGFscGhhYmV0OiBBTFBIQUJFVCk6IFNldDxzdHJpbmc+IHtcbiAgc3dpdGNoIChhbHBoYWJldCkge1xuICBjYXNlIEFMUEhBQkVULkROQTpcbiAgICByZXR1cm4gVW5pdHNIYW5kbGVyLkRuYUZhc3RhQWxwaGFiZXQ7XG4gIGNhc2UgQUxQSEFCRVQuUk5BOlxuICAgIHJldHVybiBVbml0c0hhbmRsZXIuUm5hRmFzdGFBbHBoYWJldDtcbiAgY2FzZSBBTFBIQUJFVC5QVDpcbiAgICByZXR1cm4gVW5pdHNIYW5kbGVyLlBlcHRpZGVGYXN0YUFscGhhYmV0O1xuICBkZWZhdWx0OlxuICAgIHRocm93IG5ldyBFcnJvcihgVW5zdXBwb3J0ZWQgYWxwaGFiZXQgJyR7YWxwaGFiZXR9Jy5gKTtcbiAgfVxufVxuXG4vKiogQ2FsY3VsYXRlIHNpbWlsYXJpdHkgaW4gY3VycmVudCBzZXF1ZW5jZSBhbmQgYWxwaGFiZXQuXG4gKiBAcGFyYW0ge01vbm9tZXJGcmVxc30gZnJlcVxuICogQHBhcmFtIHtTZXQ8c3RyaW5nPn0gYWxwaGFiZXRcbiAqIEBwYXJhbSB7c3RyaW5nfSBnYXBTeW1ib2xcbiAqIEByZXR1cm4ge251bWJlcn0gQ29zaW5lIHNpbWlsYXJpdHlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEFscGhhYmV0U2ltaWxhcml0eShmcmVxOiBNb25vbWVyRnJlcXMsIGFscGhhYmV0OiBTZXQ8c3RyaW5nPiwgZ2FwU3ltYm9sOiBzdHJpbmcgPSAnLScpOiBudW1iZXIge1xuICBjb25zdCBrZXlzID0gbmV3IFNldDxzdHJpbmc+KFsuLi5uZXcgU2V0KE9iamVjdC5rZXlzKGZyZXEpKSwgLi4uYWxwaGFiZXRdKTtcbiAga2V5cy5kZWxldGUoZ2FwU3ltYm9sKTtcblxuICBjb25zdCBmcmVxQTogbnVtYmVyW10gPSBbXTtcbiAgY29uc3QgYWxwaGFiZXRBOiBudW1iZXJbXSA9IFtdO1xuICBmb3IgKGNvbnN0IG0gb2Yga2V5cykge1xuICAgIGZyZXFBLnB1c2gobSBpbiBmcmVxID8gZnJlcVttXSA6IDApO1xuICAgIGFscGhhYmV0QS5wdXNoKGFscGhhYmV0LmhhcyhtKSA/IDEgOiAwKTtcbiAgfVxuICAvKiBUaGVyZSB3ZXJlIGEgZmV3IGlkZWFzOiBjaGktc3F1YXJlZCwgcGVhcnNvbiBjb3JyZWxhdGlvbiAodmFyaWFuY2U/KSwgc2NhbGFyIHByb2R1Y3QgKi9cbiAgY29uc3QgZnJlcVY6IFZlY3RvciA9IG5ldyBWZWN0b3IoZnJlcUEpO1xuICBjb25zdCBhbHBoYWJldFY6IFZlY3RvciA9IG5ldyBWZWN0b3IoYWxwaGFiZXRBKTtcbiAgcmV0dXJuIHZlY3RvckRvdFByb2R1Y3QoZnJlcVYsIGFscGhhYmV0VikgLyAodmVjdG9yTGVuZ3RoKGZyZXFWKSAqIHZlY3Rvckxlbmd0aChhbHBoYWJldFYpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRldGVjdEFscGhhYmV0KHN0YXRzOiBTZXFDb2xTdGF0cyk6IHN0cmluZyB7XG4gIGNvbnN0IGFscGhhYmV0Q2FuZGlkYXRlczogW3N0cmluZywgU2V0PHN0cmluZz5dW10gPSBbXG4gICAgW0FMUEhBQkVULlBULCBVbml0c0hhbmRsZXIuUGVwdGlkZUZhc3RhQWxwaGFiZXRdLFxuICAgIFtBTFBIQUJFVC5ETkEsIFVuaXRzSGFuZGxlci5EbmFGYXN0YUFscGhhYmV0XSxcbiAgICBbQUxQSEFCRVQuUk5BLCBVbml0c0hhbmRsZXIuUm5hRmFzdGFBbHBoYWJldF0sXG4gIF07XG5cbiAgLy8gQ2FsY3VsYXRlIGxpa2VsaWhvb2RzIGZvciBhbHBoYWJldF9jYW5kaWRhdGVzXG4gIGNvbnN0IGFscGhhYmV0Q2FuZGlkYXRlc1NpbTogbnVtYmVyW10gPSBhbHBoYWJldENhbmRpZGF0ZXMubWFwKFxuICAgIChjKSA9PiBnZXRBbHBoYWJldFNpbWlsYXJpdHkoc3RhdHMuZnJlcSwgY1sxXSkpO1xuICBjb25zdCBtYXhDb3MgPSBNYXRoLm1heCguLi5hbHBoYWJldENhbmRpZGF0ZXNTaW0pO1xuICBjb25zdCBhbHBoYWJldCA9IG1heENvcyA+IDAuNjUgPyBhbHBoYWJldENhbmRpZGF0ZXNbYWxwaGFiZXRDYW5kaWRhdGVzU2ltLmluZGV4T2YobWF4Q29zKV1bMF0gOiAnVU4nO1xuICByZXR1cm4gYWxwaGFiZXQ7XG59XG5cbi8qKiBTZWxlY3RzIGEgc3VpdGFibGUgcGFsZXR0ZSBiYXNlZCBvbiBjb2x1bW4gZGF0YVxuICogQHBhcmFtIHtERy5Db2x1bW59IHNlcUNvbCBDb2x1bW4gdG8gbG9vayBmb3IgYSBwYWxldHRlXG4gKiBAcGFyYW0ge251bWJlcn0gIG1pbkxlbmd0aCBtaW5pbXVtIGxlbmd0aCBvZiBzZXF1ZW5jZSB0byBkZXRlY3QgcGFsZXR0ZSAoZW1wdHkgc3RyaW5ncyBhcmUgYWxsb3dlZClcbiAqIEByZXR1cm4ge1NlcVBhbGV0dGV9IFBhbGV0dGUgY29ycmVzcG9uZGluZyB0byB0aGUgYWxwaGFiZXQgb2YgdGhlIHNlcXVlbmNlcyBpbiB0aGUgY29sdW1uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwaWNrVXBQYWxldHRlKHNlcUNvbDogREcuQ29sdW1uLCBtaW5MZW5ndGg6IG51bWJlciA9IDUpOiBTZXFQYWxldHRlIHtcbiAgbGV0IGFscGhhYmV0OiBzdHJpbmc7XG4gIGlmIChzZXFDb2wuc2VtVHlwZSA9PSBERy5TRU1UWVBFLk1BQ1JPTU9MRUNVTEUpIHtcbiAgICBjb25zdCB1aDogVW5pdHNIYW5kbGVyID0gbmV3IFVuaXRzSGFuZGxlcihzZXFDb2wpO1xuICAgIGFscGhhYmV0ID0gdWguYWxwaGFiZXQ7XG4gIH0gZWxzZSB7XG4gICAgY29uc3Qgc3RhdHM6IFNlcUNvbFN0YXRzID0gZ2V0U3RhdHMoc2VxQ29sLCBtaW5MZW5ndGgsIHNwbGl0dGVyQXNGYXN0YSk7XG4gICAgYWxwaGFiZXQgPSBkZXRlY3RBbHBoYWJldChzdGF0cyk7XG4gIH1cblxuICBjb25zdCByZXMgPSBnZXRQYWxldHRlQnlUeXBlKGFscGhhYmV0KTtcbiAgcmV0dXJuIHJlcztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFBhbGV0dGVCeVR5cGUocGFsZXR0ZVR5cGU6IHN0cmluZyk6IFNlcVBhbGV0dGUge1xuICBzd2l0Y2ggKHBhbGV0dGVUeXBlKSB7XG4gIGNhc2UgJ1BUJzpcbiAgICByZXR1cm4gQW1pbm9hY2lkc1BhbGV0dGVzLkdyb2tHcm91cHM7XG4gIGNhc2UgJ05UJzpcbiAgY2FzZSAnRE5BJzpcbiAgY2FzZSAnUk5BJzpcbiAgICByZXR1cm4gTnVjbGVvdGlkZXNQYWxldHRlcy5DaHJvbWF0b2dyYW07XG4gICAgLy8gb3RoZXJcbiAgZGVmYXVsdDpcbiAgICByZXR1cm4gVW5rbm93blNlcVBhbGV0dGVzLkNvbG9yO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwaWNrVXBTZXFDb2woZGY6IERHLkRhdGFGcmFtZSk6IERHLkNvbHVtbiB8IG51bGwge1xuICBjb25zdCBzZW1UeXBlQ29sTGlzdCA9IGRmLmNvbHVtbnMuYnlTZW1UeXBlQWxsKERHLlNFTVRZUEUuTUFDUk9NT0xFQ1VMRSk7XG4gIGxldCByZXNDb2w6IERHLkNvbHVtbiB8IG51bGwgPSBzZW1UeXBlQ29sTGlzdC5maW5kKChjb2wpID0+IHtcbiAgICBjb25zdCB1bml0cyA9IGNvbC5nZXRUYWcoREcuVEFHUy5VTklUUyk7XG4gICAgcmV0dXJuIHVuaXRzID8gdW5pdHMuaW5kZXhPZignTVNBJykgIT09IC0xIDogZmFsc2U7XG4gIH0pID8/IG51bGw7XG4gIGlmICghcmVzQ29sICYmIHNlbVR5cGVDb2xMaXN0Lmxlbmd0aCA+IDApXG4gICAgcmVzQ29sID0gc2VtVHlwZUNvbExpc3RbMF07XG4gIHJldHVybiByZXNDb2w7XG59XG4iXX0=
1148
-
1149
- /***/ }),
1150
-
1151
- /***/ "./node_modules/@datagrok-libraries/bio/src/utils/notation-converter.js":
1152
- /*!******************************************************************************!*\
1153
- !*** ./node_modules/@datagrok-libraries/bio/src/utils/notation-converter.js ***!
1154
- \******************************************************************************/
1155
- /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
1156
-
1157
- __webpack_require__.r(__webpack_exports__);
1158
- /* harmony export */ __webpack_require__.d(__webpack_exports__, {
1159
- /* harmony export */ "NotationConverter": () => (/* binding */ NotationConverter)
1160
- /* harmony export */ });
1161
- /* harmony import */ var datagrok_api_dg__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! datagrok-api/dg */ "datagrok-api/dg");
1162
- /* harmony import */ var datagrok_api_dg__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(datagrok_api_dg__WEBPACK_IMPORTED_MODULE_0__);
1163
- /* harmony import */ var _units_handler__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./units-handler */ "./node_modules/@datagrok-libraries/bio/src/utils/units-handler.js");
1164
- /* harmony import */ var _macromolecule__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./macromolecule */ "./node_modules/@datagrok-libraries/bio/src/utils/macromolecule.js");
1165
-
1166
-
1167
-
1168
- /** Class for handling conversion of notation systems in Macromolecule columns */
1169
- class NotationConverter extends _units_handler__WEBPACK_IMPORTED_MODULE_1__.UnitsHandler {
1170
- get splitter() {
1171
- if (this._splitter === null)
1172
- this._splitter = (0,_macromolecule__WEBPACK_IMPORTED_MODULE_2__.getSplitterForColumn)(this.column);
1173
- return this._splitter;
1174
- }
1175
- toFasta(targetNotation) { return targetNotation === "fasta" /* NOTATION.FASTA */; }
1176
- toSeparator(targetNotation) { return targetNotation === "separator" /* NOTATION.SEPARATOR */; }
1177
- toHelm(targetNotation) { return targetNotation === "helm" /* NOTATION.HELM */; }
1178
- /**
1179
- * Convert a Macromolecule column from FASTA to SEPARATOR notation
1180
- *
1181
- * @param {string} separator A specific separator to be used
1182
- * @param {string} fastaGapSymbol Gap symbol in FASTA, '-' by default
1183
- * @return {DG.Column} A new column in SEPARATOR notation
1184
- */
1185
- convertFastaToSeparator(separator, fastaGapSymbol = null) {
1186
- if (fastaGapSymbol === null)
1187
- fastaGapSymbol = this.defaultGapSymbol;
1188
- const newColumn = this.getNewColumn("separator" /* NOTATION.SEPARATOR */);
1189
- // assign the values to the newly created empty column
1190
- newColumn.init((idx) => {
1191
- const fastaPolymer = this.column.get(idx);
1192
- const fastaMonomersArray = this.splitter(fastaPolymer);
1193
- for (let i = 0; i < fastaMonomersArray.length; i++) {
1194
- if (fastaMonomersArray[i] === fastaGapSymbol)
1195
- fastaMonomersArray[i] = _units_handler__WEBPACK_IMPORTED_MODULE_1__.UnitsHandler._defaultGapSymbolsDict.SEPARATOR;
1196
- }
1197
- return fastaMonomersArray.join(separator);
1198
- });
1199
- newColumn.setTag(datagrok_api_dg__WEBPACK_IMPORTED_MODULE_0__.TAGS.UNITS, "separator" /* NOTATION.SEPARATOR */);
1200
- newColumn.setTag("separator" /* TAGS.separator */, separator);
1201
- return newColumn;
1202
- }
1203
- /**
1204
- * Get the wrapper strings for HELM, depending on the type of the
1205
- * macromolecule (peptide, DNA, RNA)
1206
- *
1207
- * @return {string[]} Array of wrappers
1208
- */
1209
- getHelmWrappers() {
1210
- const prefix = (this.isDna()) ? 'DNA1{' :
1211
- (this.isRna()) ? 'RNA1{' :
1212
- (this.isPeptide()) ? 'PEPTIDE1{' :
1213
- 'Unknown'; // this case should be handled as exceptional
1214
- if (prefix === 'Unknown')
1215
- throw new Error('Neither peptide, nor nucleotide');
1216
- const postfix = '}$$$';
1217
- const leftWrapper = (this.isDna()) ? 'D(' :
1218
- (this.isRna()) ? 'R(' : ''; // no wrapper for peptides
1219
- const rightWrapper = (this.isDna() || this.isRna()) ? ')P' : ''; // no wrapper for peptides
1220
- return [prefix, leftWrapper, rightWrapper, postfix];
1221
- }
1222
- // A helper function for converting strings to HELM
1223
- convertToHelmHelper(sourcePolymer, sourceGapSymbol, prefix, leftWrapper, rightWrapper, postfix) {
1224
- const monomerArray = this.splitter(sourcePolymer);
1225
- const monomerHelmArray = monomerArray.map((mm) => {
1226
- if (mm === sourceGapSymbol)
1227
- return _units_handler__WEBPACK_IMPORTED_MODULE_1__.UnitsHandler._defaultGapSymbolsDict.HELM;
1228
- else
1229
- return `${leftWrapper}${mm}${rightWrapper}`;
1230
- });
1231
- return `${prefix}${monomerHelmArray.join('.')}${postfix}`;
1232
- }
1233
- /**
1234
- * Convert a string with SEPARATOR/FASTA notation to HELM
1235
- *
1236
- * @param {string} sourcePolymer A string to be converted
1237
- * @param {string | null} sourceGapSymbol An optional gap symbol, set to
1238
- * default values ('-' for FASTA and '' for SEPARATOR) unless specified
1239
- * @return {string} The target HELM string
1240
- */
1241
- convertStringToHelm(sourcePolymer, sourceGapSymbol = null) {
1242
- if (sourceGapSymbol === null)
1243
- sourceGapSymbol = this.defaultGapSymbol;
1244
- const [prefix, leftWrapper, rightWrapper, postfix] = this.getHelmWrappers();
1245
- return this.convertToHelmHelper(sourcePolymer, sourceGapSymbol, prefix, leftWrapper, rightWrapper, postfix);
1246
- }
1247
- /**
1248
- * Convert a column to HELM
1249
- *
1250
- * @param {string | null} sourceGapSymbol
1251
- * @return {DG.Column}
1252
- */
1253
- convertToHelm(sourceGapSymbol = null) {
1254
- if (sourceGapSymbol === null)
1255
- sourceGapSymbol = this.defaultGapSymbol;
1256
- const [prefix, leftWrapper, rightWrapper, postfix] = this.getHelmWrappers();
1257
- const newColumn = this.getNewColumn("helm" /* NOTATION.HELM */);
1258
- // assign the values to the empty column
1259
- newColumn.init((idx) => {
1260
- const sourcePolymer = this.column.get(idx);
1261
- return this.convertToHelmHelper(sourcePolymer, sourceGapSymbol, prefix, leftWrapper, rightWrapper, postfix);
1262
- });
1263
- newColumn.setTag(datagrok_api_dg__WEBPACK_IMPORTED_MODULE_0__.TAGS.UNITS, "helm" /* NOTATION.HELM */);
1264
- return newColumn;
1265
- }
1266
- /**
1267
- * Convert SEPARATOR column to FASTA notation
1268
- *
1269
- * @param {string | null} fastaGapSymbol Optional gap symbol for FASTA
1270
- * @return {DG.Column} Converted column
1271
- */
1272
- convertSeparatorToFasta(fastaGapSymbol = null) {
1273
- if (fastaGapSymbol === null)
1274
- fastaGapSymbol = _units_handler__WEBPACK_IMPORTED_MODULE_1__.UnitsHandler._defaultGapSymbolsDict.FASTA;
1275
- const newColumn = this.getNewColumn("fasta" /* NOTATION.FASTA */);
1276
- // assign the values to the empty column
1277
- newColumn.init((idx) => {
1278
- const separatorPolymer = this.column.get(idx);
1279
- // items can be monomers or separators
1280
- const separatorItemsArray = this.splitter(separatorPolymer);
1281
- const fastaMonomersArray = [];
1282
- for (let i = 0; i < separatorItemsArray.length; i++) {
1283
- const item = separatorItemsArray[i];
1284
- if (item.length === 0) {
1285
- fastaMonomersArray.push(fastaGapSymbol);
1286
- }
1287
- else if (item.length > 1) {
1288
- // the case of a multi-character monomer
1289
- const monomer = '[' + item + ']';
1290
- fastaMonomersArray.push(monomer);
1291
- }
1292
- else {
1293
- fastaMonomersArray.push(item);
1294
- }
1295
- }
1296
- return fastaMonomersArray.join('');
1297
- });
1298
- newColumn.setTag(datagrok_api_dg__WEBPACK_IMPORTED_MODULE_0__.TAGS.UNITS, "fasta" /* NOTATION.FASTA */);
1299
- return newColumn;
1300
- }
1301
- /**
1302
- * Convert HELM column to FASTA/SEPARATOR
1303
- *
1304
- * @param {string} tgtNotation Target notation: FASTA or SEPARATOR
1305
- * @param {string} tgtSeparator Optional target separator (for HELM ->
1306
- * @param {string | null} tgtGapSymbol Optional target gap symbol
1307
- * SEPARATOR)
1308
- * @return {DG.Column} Converted column
1309
- */
1310
- convertHelm(tgtNotation, tgtSeparator, tgtGapSymbol) {
1311
- // This function must not contain calls of isDna() and isRna(), for
1312
- // source helm columns may contain RNA, DNA and PT across different rows
1313
- if (!tgtGapSymbol) {
1314
- tgtGapSymbol = (this.toFasta(tgtNotation)) ?
1315
- _units_handler__WEBPACK_IMPORTED_MODULE_1__.UnitsHandler._defaultGapSymbolsDict.FASTA :
1316
- _units_handler__WEBPACK_IMPORTED_MODULE_1__.UnitsHandler._defaultGapSymbolsDict.SEPARATOR;
1317
- }
1318
- if (!tgtSeparator) {
1319
- tgtSeparator = (this.toFasta(tgtNotation)) ? '' : this.separator;
1320
- }
1321
- const helmWrappersRe = /(R\(|D\(|\)|P)/g;
1322
- const newColumn = this.getNewColumn(tgtNotation);
1323
- // assign the values to the empty column
1324
- newColumn.init((idx) => {
1325
- const helmPolymer = this.column.get(idx);
1326
- // we cannot use isDna() or isRna() because source helm columns can
1327
- // contain DNA, RNA and PT in different cells, so the corresponding
1328
- // tags cannot be set for the whole column
1329
- const isNucleotide = helmPolymer.startsWith('DNA') || helmPolymer.startsWith('RNA');
1330
- // items can be monomers or helms
1331
- const helmItemsArray = this.splitter(helmPolymer);
1332
- const tgtMonomersArray = [];
1333
- for (let i = 0; i < helmItemsArray.length; i++) {
1334
- let item = helmItemsArray[i];
1335
- if (isNucleotide)
1336
- item = item.replace(helmWrappersRe, '');
1337
- if (item === _units_handler__WEBPACK_IMPORTED_MODULE_1__.UnitsHandler._defaultGapSymbolsDict.HELM) {
1338
- tgtMonomersArray.push(tgtGapSymbol);
1339
- }
1340
- else if (this.toFasta(tgtNotation) && item.length > 1) {
1341
- // the case of a multi-character monomer converted to FASTA
1342
- const monomer = '[' + item + ']';
1343
- tgtMonomersArray.push(monomer);
1344
- }
1345
- else {
1346
- tgtMonomersArray.push(item);
1347
- }
1348
- }
1349
- return tgtMonomersArray.join(tgtSeparator);
1350
- });
1351
- // TAGS.aligned is mandatory for columns of NOTATION.FASTA and NOTATION.SEPARATOR
1352
- const splitter = (0,_macromolecule__WEBPACK_IMPORTED_MODULE_2__.getSplitterForColumn)(newColumn);
1353
- const stats = (0,_macromolecule__WEBPACK_IMPORTED_MODULE_2__.getStats)(newColumn, 5, splitter);
1354
- const aligned = stats.sameLength ? 'SEQ.MSA' : 'SEQ';
1355
- newColumn.setTag("aligned" /* TAGS.aligned */, aligned);
1356
- return newColumn;
1357
- }
1358
- convertHelmToSeparator() {
1359
- // TODO: implementatioreturn this.getNewColumn();
1360
- return this.getNewColumn("separator" /* NOTATION.SEPARATOR */);
1361
- }
1362
- /** Dispatcher method for notation conversion
1363
- *
1364
- * @param {NOTATION} tgtNotation Notation we want to convert to
1365
- * @param {string | null} tgtSeparator Possible separator
1366
- * @return {DG.Column} Converted column
1367
- */
1368
- convert(tgtNotation, tgtSeparator = null) {
1369
- // possible exceptions
1370
- if (this.notation === tgtNotation)
1371
- throw new Error('tgt notation is invalid');
1372
- if (this.toSeparator(tgtNotation) && tgtSeparator === null)
1373
- throw new Error('tgt separator is not specified');
1374
- if (this.isFasta() && this.toSeparator(tgtNotation) && tgtSeparator !== null)
1375
- return this.convertFastaToSeparator(tgtSeparator);
1376
- else if ((this.isFasta() || this.isSeparator()) && this.toHelm(tgtNotation))
1377
- return this.convertToHelm();
1378
- else if (this.isSeparator() && this.toFasta(tgtNotation))
1379
- return this.convertSeparatorToFasta();
1380
- else if (this.isHelm() && this.toFasta(tgtNotation)) // the case of HELM
1381
- return this.convertHelm(tgtNotation);
1382
- else if (this.isHelm() && this.toSeparator(tgtNotation))
1383
- return this.convertHelm(tgtNotation, tgtSeparator);
1384
- else
1385
- throw new Error('Not supported conversion ' +
1386
- `from source notation '${this.notation}' to target notation '${tgtNotation}'.`);
1387
- }
1388
- constructor(col) {
1389
- super(col);
1390
- this._splitter = null;
1391
- }
1392
- }
1393
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm90YXRpb24tY29udmVydGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsibm90YXRpb24tY29udmVydGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUdBLE9BQU8sS0FBSyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFFdEMsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBQzdDLE9BQU8sRUFBQyxvQkFBb0IsRUFBRSxRQUFRLEVBQTRDLE1BQU0saUJBQWlCLENBQUM7QUFFMUcsaUZBQWlGO0FBQ2pGLE1BQU0sT0FBTyxpQkFBa0IsU0FBUSxZQUFZO0lBR2pELElBQWMsUUFBUTtRQUNwQixJQUFJLElBQUksQ0FBQyxTQUFTLEtBQUssSUFBSTtZQUN6QixJQUFJLENBQUMsU0FBUyxHQUFHLG9CQUFvQixDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNyRCxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUM7SUFDeEIsQ0FBQztJQUVNLE9BQU8sQ0FBQyxjQUF3QixJQUFhLE9BQU8sY0FBYyxpQ0FBbUIsQ0FBQyxDQUFDLENBQUM7SUFFeEYsV0FBVyxDQUFDLGNBQXdCLElBQWEsT0FBTyxjQUFjLHlDQUF1QixDQUFDLENBQUMsQ0FBQztJQUVoRyxNQUFNLENBQUMsY0FBd0IsSUFBYSxPQUFPLGNBQWMsK0JBQWtCLENBQUMsQ0FBQyxDQUFDO0lBRTdGOzs7Ozs7T0FNRztJQUNLLHVCQUF1QixDQUFDLFNBQWlCLEVBQUUsaUJBQWdDLElBQUk7UUFDckYsSUFBSSxjQUFjLEtBQUssSUFBSTtZQUN6QixjQUFjLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDO1FBRXpDLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxZQUFZLHNDQUFvQixDQUFDO1FBQ3hELHNEQUFzRDtRQUN0RCxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBVyxFQUFFLEVBQUU7WUFDN0IsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FB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TUFBTSxJQUFJLEtBQUssQ0FBQywyQkFBMkI7Z0JBQ3pDLHlCQUF5QixJQUFJLENBQUMsUUFBUSx5QkFBeUIsV0FBVyxJQUFJLENBQUMsQ0FBQztJQUN0RixDQUFDO0lBRUQsWUFBbUIsR0FBYztRQUMvQixLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7UUE3UEwsY0FBUyxHQUF3QixJQUFJLENBQUM7SUE4UDlDLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8qIERvIG5vdCBjaGFuZ2UgdGhlc2UgaW1wb3J0IGxpbmVzIHRvIG1hdGNoIGV4dGVybmFsIG1vZHVsZXMgaW4gd2VicGFjayBjb25maWd1cmF0aW9uICovXG5pbXBvcnQgKiBhcyBncm9rIGZyb20gJ2RhdGFncm9rLWFwaS9ncm9rJztcbmltcG9ydCAqIGFzIHVpIGZyb20gJ2RhdGFncm9rLWFwaS91aSc7XG5pbXBvcnQgKiBhcyBERyBmcm9tICdkYXRhZ3Jvay1hcGkvZGcnO1xuXG5pbXBvcnQge1VuaXRzSGFuZGxlcn0gZnJvbSAnLi91bml0cy1oYW5kbGVyJztcbmltcG9ydCB7Z2V0U3BsaXR0ZXJGb3JDb2x1bW4sIGdldFN0YXRzLCBOT1RBVElPTiwgU2VxQ29sU3RhdHMsIFNwbGl0dGVyRnVuYywgVEFHU30gZnJvbSAnLi9tYWNyb21vbGVjdWxlJztcblxuLyoqIENsYXNzIGZvciBoYW5kbGluZyBjb252ZXJzaW9uIG9mIG5vdGF0aW9uIHN5c3RlbXMgaW4gTWFjcm9tb2xlY3VsZSBjb2x1bW5zICovXG5leHBvcnQgY2xhc3MgTm90YXRpb25Db252ZXJ0ZXIgZXh0ZW5kcyBVbml0c0hhbmRsZXIge1xuICBwcml2YXRlIF9zcGxpdHRlcjogU3BsaXR0ZXJGdW5jIHwgbnVsbCA9IG51bGw7XG5cbiAgcHJvdGVjdGVkIGdldCBzcGxpdHRlcigpOiBTcGxpdHRlckZ1bmMge1xuICAgIGlmICh0aGlzLl9zcGxpdHRlciA9PT0gbnVsbClcbiAgICAgIHRoaXMuX3NwbGl0dGVyID0gZ2V0U3BsaXR0ZXJGb3JDb2x1bW4odGhpcy5jb2x1bW4pO1xuICAgIHJldHVybiB0aGlzLl9zcGxpdHRlcjtcbiAgfVxuXG4gIHB1YmxpYyB0b0Zhc3RhKHRhcmdldE5vdGF0aW9uOiBOT1RBVElPTik6IGJvb2xlYW4geyByZXR1cm4gdGFyZ2V0Tm90YXRpb24gPT09IE5PVEFUSU9OLkZBU1RBOyB9XG5cbiAgcHVibGljIHRvU2VwYXJhdG9yKHRhcmdldE5vdGF0aW9uOiBOT1RBVElPTik6IGJvb2xlYW4geyByZXR1cm4gdGFyZ2V0Tm90YXRpb24gPT09IE5PVEFUSU9OLlNFUEFSQVRPUjsgfVxuXG4gIHB1YmxpYyB0b0hlbG0odGFyZ2V0Tm90YXRpb246IE5PVEFUSU9OKTogYm9vbGVhbiB7IHJldHVybiB0YXJnZXROb3RhdGlvbiA9PT0gTk9UQVRJT04uSEVMTTsgfVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0IGEgTWFjcm9tb2xlY3VsZSBjb2x1bW4gZnJvbSBGQVNUQSB0byBTRVBBUkFUT1Igbm90YXRpb25cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IHNlcGFyYXRvciAgQSBzcGVjaWZpYyBzZXBhcmF0b3IgdG8gYmUgdXNlZFxuICAgKiBAcGFyYW0ge3N0cmluZ30gZmFzdGFHYXBTeW1ib2wgIEdhcCBzeW1ib2wgaW4gRkFTVEEsICctJyBieSBkZWZhdWx0XG4gICAqIEByZXR1cm4ge0RHLkNvbHVtbn0gICAgICAgIEEgbmV3IGNvbHVtbiBpbiBTRVBBUkFUT1Igbm90YXRpb25cbiAgICovXG4gIHByaXZhdGUgY29udmVydEZhc3RhVG9TZXBhcmF0b3Ioc2VwYXJhdG9yOiBzdHJpbmcsIGZhc3RhR2FwU3ltYm9sOiBzdHJpbmcgfCBudWxsID0gbnVsbCk6IERHLkNvbHVtbiB7XG4gICAgaWYgKGZhc3RhR2FwU3ltYm9sID09PSBudWxsKVxuICAgICAgZmFzdGFHYXBTeW1ib2wgPSB0aGlzLmRlZmF1bHRHYXBTeW1ib2w7XG5cbiAgICBjb25zdCBuZXdDb2x1bW4gPSB0aGlzLmdldE5ld0NvbHVtbihOT1RBVElPTi5TRVBBUkFUT1IpO1xuICAgIC8vIGFzc2lnbiB0aGUgdmFsdWVzIHRvIHRoZSBuZXdseSBjcmVhdGVkIGVtcHR5IGNvbHVtblxuICAgIG5ld0NvbHVtbi5pbml0KChpZHg6IG51bWJlcikgPT4ge1xuICAgICAgY29uc3QgZmFzdGFQb2x5bWVyID0gdGhpcy5jb2x1bW4uZ2V0KGlkeCk7XG4gICAgICBjb25zdCBmYXN0YU1vbm9tZXJzQXJyYXkgPSB0aGlzLnNwbGl0dGVyKGZhc3RhUG9seW1lcik7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGZhc3RhTW9ub21lcnNBcnJheS5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAoZmFzdGFNb25vbWVyc0FycmF5W2ldID09PSBmYXN0YUdhcFN5bWJvbClcbiAgICAgICAgICBmYXN0YU1vbm9tZXJzQXJyYXlbaV0gPSBVbml0c0hhbmRsZXIuX2RlZmF1bHRHYXBTeW1ib2xzRGljdC5TRVBBUkFUT1I7XG4gICAgICB9XG4gICAgICByZXR1cm4gZmFzdGFNb25vbWVyc0FycmF5LmpvaW4oc2VwYXJhdG9yKTtcbiAgICB9KTtcbiAgICBuZXdDb2x1bW4uc2V0VGFnKERHLlRBR1MuVU5JVFMsIE5PVEFUSU9OLlNFUEFSQVRPUik7XG4gICAgbmV3Q29sdW1uLnNldFRhZyhUQUdTLnNlcGFyYXRvciwgc2VwYXJhdG9yKTtcbiAgICByZXR1cm4gbmV3Q29sdW1uO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgd3JhcHBlciBzdHJpbmdzIGZvciBIRUxNLCBkZXBlbmRpbmcgb24gdGhlIHR5cGUgb2YgdGhlXG4gICAqIG1hY3JvbW9sZWN1bGUgKHBlcHRpZGUsIEROQSwgUk5BKVxuICAgKlxuICAgKiBAcmV0dXJuIHtzdHJpbmdbXX0gQXJyYXkgb2Ygd3JhcHBlcnNcbiAgICovXG4gIHByaXZhdGUgZ2V0SGVsbVdyYXBwZXJzKCk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCBwcmVmaXggPSAodGhpcy5pc0RuYSgpKSA/ICdETkExeycgOlxuICAgICAgKHRoaXMuaXNSbmEoKSkgPyAnUk5BMXsnIDpcbiAgICAgICAgKHRoaXMuaXNQZXB0aWRlKCkpID8gJ1BFUFRJREUxeycgOlxuICAgICAgICAgICdVbmtub3duJzsgLy8gdGhpcyBjYXNlIHNob3VsZCBiZSBoYW5kbGVkIGFzIGV4Y2VwdGlvbmFsXG5cbiAgICBpZiAocHJlZml4ID09PSAnVW5rbm93bicpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ05laXRoZXIgcGVwdGlkZSwgbm9yIG51Y2xlb3RpZGUnKTtcblxuICAgIGNvbnN0IHBvc3RmaXggPSAnfSQkJCc7XG4gICAgY29uc3QgbGVmdFdyYXBwZXIgPSAodGhpcy5pc0RuYSgpKSA/ICdEKCcgOlxuICAgICAgKHRoaXMuaXNSbmEoKSkgPyAnUignIDogJyc7IC8vIG5vIHdyYXBwZXIgZm9yIHBlcHRpZGVzXG4gICAgY29uc3QgcmlnaHRXcmFwcGVyID0gKHRoaXMuaXNEbmEoKSB8fCB0aGlzLmlzUm5hKCkpID8gJylQJyA6ICcnOyAvLyBubyB3cmFwcGVyIGZvciBwZXB0aWRlc1xuICAgIHJldHVybiBbcHJlZml4LCBsZWZ0V3JhcHBlciwgcmlnaHRXcmFwcGVyLCBwb3N0Zml4XTtcbiAgfVxuXG4gIC8vIEEgaGVscGVyIGZ1bmN0aW9uIGZvciBjb252ZXJ0aW5nIHN0cmluZ3MgdG8gSEVMTVxuICBwcml2YXRlIGNvbnZlcnRUb0hlbG1IZWxwZXIoXG4gICAgc291cmNlUG9seW1lcjogc3RyaW5nLFxuICAgIHNvdXJjZUdhcFN5bWJvbDogc3RyaW5nLFxuICAgIHByZWZpeDogc3RyaW5nLFxuICAgIGxlZnRXcmFwcGVyOiBzdHJpbmcsXG4gICAgcmlnaHRXcmFwcGVyOiBzdHJpbmcsXG4gICAgcG9zdGZpeDogc3RyaW5nXG4gICk6IHN0cmluZyB7XG4gICAgY29uc3QgbW9ub21lckFycmF5ID0gdGhpcy5zcGxpdHRlcihzb3VyY2VQb2x5bWVyKTtcbiAgICBjb25zdCBtb25vbWVySGVsbUFycmF5OiBzdHJpbmdbXSA9IG1vbm9tZXJBcnJheS5tYXAoKG1tOiBzdHJpbmcpID0+IHtcbiAgICAgIGlmIChtbSA9PT0gc291cmNlR2FwU3ltYm9sKVxuICAgICAgICByZXR1cm4gVW5pdHNIYW5kbGVyLl9kZWZhdWx0R2FwU3ltYm9sc0RpY3QuSEVMTTtcbiAgICAgIGVsc2VcbiAgICAgICAgcmV0dXJuIGAke2xlZnRXcmFwcGVyfSR7bW19JHtyaWdodFdyYXBwZXJ9YDtcbiAgICB9KTtcbiAgICByZXR1cm4gYCR7cHJlZml4fSR7bW9ub21lckhlbG1BcnJheS5qb2luKCcuJyl9JHtwb3N0Zml4fWA7XG4gIH1cblxuICAvKipcbiAgICogQ29udmVydCBhIHN0cmluZyB3aXRoIFNFUEFSQVRPUi9GQVNUQSBub3RhdGlvbiB0byBIRUxNXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzb3VyY2VQb2x5bWVyICBBIHN0cmluZyB0byBiZSBjb252ZXJ0ZWRcbiAgICogQHBhcmFtIHtzdHJpbmcgfCBudWxsfSBzb3VyY2VHYXBTeW1ib2wgIEFuIG9wdGlvbmFsIGdhcCBzeW1ib2wsIHNldCB0b1xuICAgKiBkZWZhdWx0IHZhbHVlcyAoJy0nIGZvciBGQVNUQSBhbmQgJycgZm9yIFNFUEFSQVRPUikgdW5sZXNzIHNwZWNpZmllZFxuICAgKiBAcmV0dXJuIHtzdHJpbmd9ICBUaGUgdGFyZ2V0IEhFTE0gc3RyaW5nXG4gICAqL1xuICBwdWJsaWMgY29udmVydFN0cmluZ1RvSGVsbShcbiAgICBzb3VyY2VQb2x5bWVyOiBzdHJpbmcsXG4gICAgc291cmNlR2FwU3ltYm9sOiBzdHJpbmcgfCBudWxsID0gbnVsbFxuICApOiBzdHJpbmcge1xuICAgIGlmIChzb3VyY2VHYXBTeW1ib2wgPT09IG51bGwpXG4gICAgICBzb3VyY2VHYXBTeW1ib2wgPSB0aGlzLmRlZmF1bHRHYXBTeW1ib2w7XG4gICAgY29uc3QgW3ByZWZpeCwgbGVmdFdyYXBwZXIsIHJpZ2h0V3JhcHBlciwgcG9zdGZpeF0gPSB0aGlzLmdldEhlbG1XcmFwcGVycygpO1xuICAgIHJldHVybiB0aGlzLmNvbnZlcnRUb0hlbG1IZWxwZXIoc291cmNlUG9seW1lciwgc291cmNlR2FwU3ltYm9sLCBwcmVmaXgsIGxlZnRXcmFwcGVyLCByaWdodFdyYXBwZXIsIHBvc3RmaXgpO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnQgYSBjb2x1bW4gdG8gSEVMTVxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZyB8IG51bGx9IHNvdXJjZUdhcFN5bWJvbFxuICAgKiBAcmV0dXJuIHtERy5Db2x1bW59XG4gICAqL1xuICBwcml2YXRlIGNvbnZlcnRUb0hlbG0oc291cmNlR2FwU3ltYm9sOiBzdHJpbmcgfCBudWxsID0gbnVsbCk6IERHLkNvbHVtbiB7XG4gICAgaWYgKHNvdXJjZUdhcFN5bWJvbCA9PT0gbnVsbClcbiAgICAgIHNvdXJjZUdhcFN5bWJvbCA9IHRoaXMuZGVmYXVsdEdhcFN5bWJvbDtcblxuICAgIGNvbnN0IFtwcmVmaXgsIGxlZnRXcmFwcGVyLCByaWdodFdyYXBwZXIsIHBvc3RmaXhdID0gdGhpcy5nZXRIZWxtV3JhcHBlcnMoKTtcblxuICAgIGNvbnN0IG5ld0NvbHVtbiA9IHRoaXMuZ2V0TmV3Q29sdW1uKE5PVEFUSU9OLkhFTE0pO1xuICAgIC8vIGFzc2lnbiB0aGUgdmFsdWVzIHRvIHRoZSBlbXB0eSBjb2x1bW5cbiAgICBuZXdDb2x1bW4uaW5pdCgoaWR4OiBudW1iZXIpID0+IHtcbiAgICAgIGNvbnN0IHNvdXJjZVBvbHltZXIgPSB0aGlzLmNvbHVtbi5nZXQoaWR4KTtcbiAgICAgIHJldHVybiB0aGlzLmNvbnZlcnRUb0hlbG1IZWxwZXIoc291cmNlUG9seW1lciwgc291cmNlR2FwU3ltYm9sISwgcHJlZml4LCBsZWZ0V3JhcHBlciwgcmlnaHRXcmFwcGVyLCBwb3N0Zml4KTtcbiAgICB9KTtcbiAgICBuZXdDb2x1bW4uc2V0VGFnKERHLlRBR1MuVU5JVFMsIE5PVEFUSU9OLkhFTE0pO1xuICAgIHJldHVybiBuZXdDb2x1bW47XG4gIH1cblxuICAvKipcbiAgICogQ29udmVydCBTRVBBUkFUT1IgY29sdW1uIHRvIEZBU1RBIG5vdGF0aW9uXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgbnVsbH0gZmFzdGFHYXBTeW1ib2wgT3B0aW9uYWwgZ2FwIHN5bWJvbCBmb3IgRkFTVEFcbiAgICogQHJldHVybiB7REcuQ29sdW1ufSAgQ29udmVydGVkIGNvbHVtblxuICAgKi9cbiAgcHJpdmF0ZSBjb252ZXJ0U2VwYXJhdG9yVG9GYXN0YShmYXN0YUdhcFN5bWJvbDogc3RyaW5nIHwgbnVsbCA9IG51bGwpOiBERy5Db2x1bW4ge1xuICAgIGlmIChmYXN0YUdhcFN5bWJvbCA9PT0gbnVsbClcbiAgICAgIGZhc3RhR2FwU3ltYm9sID0gVW5pdHNIYW5kbGVyLl9kZWZhdWx0R2FwU3ltYm9sc0RpY3QuRkFTVEE7XG5cbiAgICBjb25zdCBuZXdDb2x1bW4gPSB0aGlzLmdldE5ld0NvbHVtbihOT1RBVElPTi5GQVNUQSk7XG4gICAgLy8gYXNzaWduIHRoZSB2YWx1ZXMgdG8gdGhlIGVtcHR5IGNvbHVtblxuICAgIG5ld0NvbHVtbi5pbml0KChpZHg6IG51bWJlcikgPT4ge1xuICAgICAgY29uc3Qgc2VwYXJhdG9yUG9seW1lciA9IHRoaXMuY29sdW1uLmdldChpZHgpO1xuICAgICAgLy8gaXRlbXMgY2FuIGJlIG1vbm9tZXJzIG9yIHNlcGFyYXRvcnNcbiAgICAgIGNvbnN0IHNlcGFyYXRvckl0ZW1zQXJyYXkgPSB0aGlzLnNwbGl0dGVyKHNlcGFyYXRvclBvbHltZXIpO1xuICAgICAgY29uc3QgZmFzdGFNb25vbWVyc0FycmF5OiBzdHJpbmdbXSA9IFtdO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzZXBhcmF0b3JJdGVtc0FycmF5Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGl0ZW0gPSBzZXBhcmF0b3JJdGVtc0FycmF5W2ldO1xuICAgICAgICBpZiAoaXRlbS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICBmYXN0YU1vbm9tZXJzQXJyYXkucHVzaChmYXN0YUdhcFN5bWJvbCEpO1xuICAgICAgICB9IGVsc2UgaWYgKGl0ZW0ubGVuZ3RoID4gMSkge1xuICAgICAgICAgIC8vIHRoZSBjYXNlIG9mIGEgbXVsdGktY2hhcmFjdGVyIG1vbm9tZXJcbiAgICAgICAgICBjb25zdCBtb25vbWVyID0gJ1snICsgaXRlbSArICddJztcbiAgICAgICAgICBmYXN0YU1vbm9tZXJzQXJyYXkucHVzaChtb25vbWVyKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBmYXN0YU1vbm9tZXJzQXJyYXkucHVzaChpdGVtKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGZhc3RhTW9ub21lcnNBcnJheS5qb2luKCcnKTtcbiAgICB9KTtcbiAgICBuZXdDb2x1bW4uc2V0VGFnKERHLlRBR1MuVU5JVFMsIE5PVEFUSU9OLkZBU1RBKTtcbiAgICByZXR1cm4gbmV3Q29sdW1uO1xuICB9XG5cbiAgLyoqXG4gICAqICBDb252ZXJ0IEhFTE0gY29sdW1uIHRvIEZBU1RBL1NFUEFSQVRPUlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGd0Tm90YXRpb24gICAgVGFyZ2V0IG5vdGF0aW9uOiBGQVNUQSBvciBTRVBBUkFUT1JcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRndFNlcGFyYXRvciAgIE9wdGlvbmFsIHRhcmdldCBzZXBhcmF0b3IgKGZvciBIRUxNIC0+XG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgbnVsbH0gdGd0R2FwU3ltYm9sICAgT3B0aW9uYWwgdGFyZ2V0IGdhcCBzeW1ib2xcbiAgICogU0VQQVJBVE9SKVxuICAgKiBAcmV0dXJuIHtERy5Db2x1bW59IENvbnZlcnRlZCBjb2x1bW5cbiAgICovXG4gIHByaXZhdGUgY29udmVydEhlbG0odGd0Tm90YXRpb246IHN0cmluZywgdGd0U2VwYXJhdG9yPzogc3RyaW5nLCB0Z3RHYXBTeW1ib2w/OiBzdHJpbmcpOiBERy5Db2x1bW4ge1xuICAgIC8vIFRoaXMgZnVuY3Rpb24gbXVzdCBub3QgY29udGFpbiBjYWxscyBvZiBpc0RuYSgpIGFuZCBpc1JuYSgpLCBmb3JcbiAgICAvLyBzb3VyY2UgaGVsbSBjb2x1bW5zIG1heSBjb250YWluIFJOQSwgRE5BIGFuZCBQVCBhY3Jvc3MgZGlmZmVyZW50IHJvd3NcbiAgICBpZiAoIXRndEdhcFN5bWJvbCkge1xuICAgICAgdGd0R2FwU3ltYm9sID0gKHRoaXMudG9GYXN0YSh0Z3ROb3RhdGlvbiBhcyBOT1RBVElPTikpID9cbiAgICAgICAgVW5pdHNIYW5kbGVyLl9kZWZhdWx0R2FwU3ltYm9sc0RpY3QuRkFTVEEgOlxuICAgICAgICBVbml0c0hhbmRsZXIuX2RlZmF1bHRHYXBTeW1ib2xzRGljdC5TRVBBUkFUT1I7XG4gICAgfVxuXG4gICAgaWYgKCF0Z3RTZXBhcmF0b3IpIHtcbiAgICAgIHRndFNlcGFyYXRvciA9ICh0aGlzLnRvRmFzdGEodGd0Tm90YXRpb24gYXMgTk9UQVRJT04pKSA/ICcnIDogdGhpcy5zZXBhcmF0b3I7XG4gICAgfVxuXG4gICAgY29uc3QgaGVsbVdyYXBwZXJzUmUgPSAvKFJcXCh8RFxcKHxcXCl8UCkvZztcbiAgICBjb25zdCBuZXdDb2x1bW4gPSB0aGlzLmdldE5ld0NvbHVtbih0Z3ROb3RhdGlvbiBhcyBOT1RBVElPTik7XG4gICAgLy8gYXNzaWduIHRoZSB2YWx1ZXMgdG8gdGhlIGVtcHR5IGNvbHVtblxuICAgIG5ld0NvbHVtbi5pbml0KChpZHg6IG51bWJlcikgPT4ge1xuICAgICAgY29uc3QgaGVsbVBvbHltZXIgPSB0aGlzLmNvbHVtbi5nZXQoaWR4KTtcblxuICAgICAgLy8gd2UgY2Fubm90IHVzZSBpc0RuYSgpIG9yIGlzUm5hKCkgYmVjYXVzZSBzb3VyY2UgaGVsbSBjb2x1bW5zIGNhblxuICAgICAgLy8gY29udGFpbiBETkEsIFJOQSBhbmQgUFQgaW4gZGlmZmVyZW50IGNlbGxzLCBzbyB0aGUgY29ycmVzcG9uZGluZ1xuICAgICAgLy8gdGFncyBjYW5ub3QgYmUgc2V0IGZvciB0aGUgd2hvbGUgY29sdW1uXG4gICAgICBjb25zdCBpc051Y2xlb3RpZGUgPSBoZWxtUG9seW1lci5zdGFydHNXaXRoKCdETkEnKSB8fCBoZWxtUG9seW1lci5zdGFydHNXaXRoKCdSTkEnKTtcblxuICAgICAgLy8gaXRlbXMgY2FuIGJlIG1vbm9tZXJzIG9yIGhlbG1zXG4gICAgICBjb25zdCBoZWxtSXRlbXNBcnJheSA9IHRoaXMuc3BsaXR0ZXIoaGVsbVBvbHltZXIpO1xuICAgICAgY29uc3QgdGd0TW9ub21lcnNBcnJheTogc3RyaW5nW10gPSBbXTtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaGVsbUl0ZW1zQXJyYXkubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgbGV0IGl0ZW0gPSBoZWxtSXRlbXNBcnJheVtpXTtcbiAgICAgICAgaWYgKGlzTnVjbGVvdGlkZSlcbiAgICAgICAgICBpdGVtID0gaXRlbS5yZXBsYWNlKGhlbG1XcmFwcGVyc1JlLCAnJyk7XG4gICAgICAgIGlmIChpdGVtID09PSBVbml0c0hhbmRsZXIuX2RlZmF1bHRHYXBTeW1ib2xzRGljdC5IRUxNKSB7XG4gICAgICAgICAgdGd0TW9ub21lcnNBcnJheS5wdXNoKHRndEdhcFN5bWJvbCEpO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMudG9GYXN0YSh0Z3ROb3RhdGlvbiBhcyBOT1RBVElPTikgJiYgaXRlbS5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgLy8gdGhlIGNhc2Ugb2YgYSBtdWx0aS1jaGFyYWN0ZXIgbW9ub21lciBjb252ZXJ0ZWQgdG8gRkFTVEFcbiAgICAgICAgICBjb25zdCBtb25vbWVyID0gJ1snICsgaXRlbSArICddJztcbiAgICAgICAgICB0Z3RNb25vbWVyc0FycmF5LnB1c2gobW9ub21lcik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGd0TW9ub21lcnNBcnJheS5wdXNoKGl0ZW0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gdGd0TW9ub21lcnNBcnJheS5qb2luKHRndFNlcGFyYXRvcik7XG4gICAgfSk7XG5cbiAgICAvLyBUQUdTLmFsaWduZWQgaXMgbWFuZGF0b3J5IGZvciBjb2x1bW5zIG9mIE5PVEFUSU9OLkZBU1RBIGFuZCBOT1RBVElPTi5TRVBBUkFUT1JcbiAgICBjb25zdCBzcGxpdHRlcjogU3BsaXR0ZXJGdW5jID0gZ2V0U3BsaXR0ZXJGb3JDb2x1bW4obmV3Q29sdW1uKTtcbiAgICBjb25zdCBzdGF0czogU2VxQ29sU3RhdHMgPSBnZXRTdGF0cyhuZXdDb2x1bW4sIDUsIHNwbGl0dGVyKTtcbiAgICBjb25zdCBhbGlnbmVkID0gc3RhdHMuc2FtZUxlbmd0aCA/ICdTRVEuTVNBJyA6ICdTRVEnO1xuICAgIG5ld0NvbHVtbi5zZXRUYWcoVEFHUy5hbGlnbmVkLCBhbGlnbmVkKTtcblxuICAgIHJldHVybiBuZXdDb2x1bW47XG4gIH1cblxuICBwcml2YXRlIGNvbnZlcnRIZWxtVG9TZXBhcmF0b3IoKTogREcuQ29sdW1uIHtcbiAgICAvLyBUT0RPOiBpbXBsZW1lbnRhdGlvcmV0dXJuIHRoaXMuZ2V0TmV3Q29sdW1uKCk7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TmV3Q29sdW1uKE5PVEFUSU9OLlNFUEFSQVRPUik7XG4gIH1cblxuICAvKiogRGlzcGF0Y2hlciBtZXRob2QgZm9yIG5vdGF0aW9uIGNvbnZlcnNpb25cbiAgICpcbiAgICogQHBhcmFtIHtOT1RBVElPTn0gdGd0Tm90YXRpb24gICBOb3RhdGlvbiB3ZSB3YW50IHRvIGNvbnZlcnQgdG9cbiAgICogQHBhcmFtIHtzdHJpbmcgfCBudWxsfSB0Z3RTZXBhcmF0b3IgICBQb3NzaWJsZSBzZXBhcmF0b3JcbiAgICogQHJldHVybiB7REcuQ29sdW1ufSAgICAgICAgICAgICAgICBDb252ZXJ0ZWQgY29sdW1uXG4gICAqL1xuICBwdWJsaWMgY29udmVydCh0Z3ROb3RhdGlvbjogTk9UQVRJT04sIHRndFNlcGFyYXRvcjogc3RyaW5nIHwgbnVsbCA9IG51bGwpOiBERy5Db2x1bW4ge1xuICAgIC8vIHBvc3NpYmxlIGV4Y2VwdGlvbnNcbiAgICBpZiAodGhpcy5ub3RhdGlvbiA9PT0gdGd0Tm90YXRpb24pXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3RndCBub3RhdGlvbiBpcyBpbnZhbGlkJyk7XG4gICAgaWYgKHRoaXMudG9TZXBhcmF0b3IodGd0Tm90YXRpb24pICYmIHRndFNlcGFyYXRvciA9PT0gbnVsbClcbiAgICAgIHRocm93IG5ldyBFcnJvcigndGd0IHNlcGFyYXRvciBpcyBub3Qgc3BlY2lmaWVkJyk7XG5cbiAgICBpZiAodGhpcy5pc0Zhc3RhKCkgJiYgdGhpcy50b1NlcGFyYXRvcih0Z3ROb3RhdGlvbikgJiYgdGd0U2VwYXJhdG9yICE9PSBudWxsKVxuICAgICAgcmV0dXJuIHRoaXMuY29udmVydEZhc3RhVG9TZXBhcmF0b3IodGd0U2VwYXJhdG9yKTtcbiAgICBlbHNlIGlmICgodGhpcy5pc0Zhc3RhKCkgfHwgdGhpcy5pc1NlcGFyYXRvcigpKSAmJiB0aGlzLnRvSGVsbSh0Z3ROb3RhdGlvbikpXG4gICAgICByZXR1cm4gdGhpcy5jb252ZXJ0VG9IZWxtKCk7XG4gICAgZWxzZSBpZiAodGhpcy5pc1NlcGFyYXRvcigpICYmIHRoaXMudG9GYXN0YSh0Z3ROb3RhdGlvbikpXG4gICAgICByZXR1cm4gdGhpcy5jb252ZXJ0U2VwYXJhdG9yVG9GYXN0YSgpO1xuICAgIGVsc2UgaWYgKHRoaXMuaXNIZWxtKCkgJiYgdGhpcy50b0Zhc3RhKHRndE5vdGF0aW9uKSkgLy8gdGhlIGNhc2Ugb2YgSEVMTVxuICAgICAgcmV0dXJuIHRoaXMuY29udmVydEhlbG0odGd0Tm90YXRpb24pO1xuICAgIGVsc2UgaWYgKHRoaXMuaXNIZWxtKCkgJiYgdGhpcy50b1NlcGFyYXRvcih0Z3ROb3RhdGlvbikpXG4gICAgICByZXR1cm4gdGhpcy5jb252ZXJ0SGVsbSh0Z3ROb3RhdGlvbiwgdGd0U2VwYXJhdG9yISk7XG4gICAgZWxzZVxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdOb3Qgc3VwcG9ydGVkIGNvbnZlcnNpb24gJyArXG4gICAgICAgIGBmcm9tIHNvdXJjZSBub3RhdGlvbiAnJHt0aGlzLm5vdGF0aW9ufScgdG8gdGFyZ2V0IG5vdGF0aW9uICcke3RndE5vdGF0aW9ufScuYCk7XG4gIH1cblxuICBwdWJsaWMgY29uc3RydWN0b3IoY29sOiBERy5Db2x1bW4pIHtcbiAgICBzdXBlcihjb2wpO1xuICB9XG59XG4iXX0=
1394
-
1395
- /***/ }),
1396
-
1397
- /***/ "./node_modules/@datagrok-libraries/bio/src/utils/units-handler.js":
1398
- /*!*************************************************************************!*\
1399
- !*** ./node_modules/@datagrok-libraries/bio/src/utils/units-handler.js ***!
1400
- \*************************************************************************/
1401
- /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
1402
-
1403
- __webpack_require__.r(__webpack_exports__);
1404
- /* harmony export */ __webpack_require__.d(__webpack_exports__, {
1405
- /* harmony export */ "UnitsHandler": () => (/* binding */ UnitsHandler)
1406
- /* harmony export */ });
1407
- /* harmony import */ var datagrok_api_dg__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! datagrok-api/dg */ "datagrok-api/dg");
1408
- /* harmony import */ var datagrok_api_dg__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(datagrok_api_dg__WEBPACK_IMPORTED_MODULE_0__);
1409
- /* harmony import */ var _macromolecule__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./macromolecule */ "./node_modules/@datagrok-libraries/bio/src/utils/macromolecule.js");
1410
-
1411
-
1412
- /** Class for handling notation units in Macromolecule columns */
1413
- class UnitsHandler {
1414
- static setUnitsToFastaColumn(col) {
1415
- if (col.semType !== datagrok_api_dg__WEBPACK_IMPORTED_MODULE_0__.SEMTYPE.MACROMOLECULE)
1416
- throw new Error('Fasta column must be MACROMOLECULE');
1417
- const stats = (0,_macromolecule__WEBPACK_IMPORTED_MODULE_1__.getStats)(col, 5, _macromolecule__WEBPACK_IMPORTED_MODULE_1__.splitterAsFasta);
1418
- const aligned = stats.sameLength ? 'SEQ.MSA' : 'SEQ';
1419
- const alphabet = (0,_macromolecule__WEBPACK_IMPORTED_MODULE_1__.detectAlphabet)(stats);
1420
- col.setTag(datagrok_api_dg__WEBPACK_IMPORTED_MODULE_0__.TAGS.UNITS, "fasta" /* NOTATION.FASTA */);
1421
- col.setTag("aligned" /* TAGS.aligned */, aligned);
1422
- col.setTag("alphabet" /* TAGS.alphabet */, alphabet);
1423
- }
1424
- get units() { return this._units; }
1425
- get column() { return this._column; }
1426
- get notation() { return this._notation; }
1427
- get defaultGapSymbol() { return this._defaultGapSymbol; }
1428
- get separator() {
1429
- var _a;
1430
- const separator = (_a = this.column.getTag("separator" /* TAGS.separator */)) !== null && _a !== void 0 ? _a : undefined;
1431
- if (this.notation === "separator" /* NOTATION.SEPARATOR */ && separator === undefined)
1432
- throw new Error(`Separator is mandatory for column '${this.column.name}' of notation '${this.notation}'.`);
1433
- return separator;
1434
- }
1435
- get aligned() {
1436
- const aligned = this.column.getTag("aligned" /* TAGS.aligned */);
1437
- // TAGS.aligned is mandatory for columns of NOTATION.FASTA and NOTATION.SEPARATOR
1438
- if (!aligned && (this.isFasta() || this.isSeparator()))
1439
- throw new Error('Tag aligned not set');
1440
- return aligned;
1441
- }
1442
- /** Alphabet name (upper case) */
1443
- get alphabet() {
1444
- const alphabet = this.column.getTag("alphabet" /* TAGS.alphabet */);
1445
- // TAGS.alphabet is mandatory for columns of NOTATION.FASTA and NOTATION.SEPARATOR
1446
- if (!alphabet && (this.isFasta() || this.isSeparator()))
1447
- throw new Error('Tag alphabet not set');
1448
- return alphabet;
1449
- }
1450
- getAlphabetSize() {
1451
- if (this.notation == "helm" /* NOTATION.HELM */ || this.alphabet == "UN" /* ALPHABET.UN */) {
1452
- const alphabetSizeStr = this.column.getTag(".alphabetSize" /* TAGS.alphabetSize */);
1453
- let alphabetSize;
1454
- if (alphabetSizeStr) {
1455
- alphabetSize = parseInt(alphabetSizeStr);
1456
- }
1457
- else {
1458
- // calculate alphabetSize on demand
1459
- const splitter = (0,_macromolecule__WEBPACK_IMPORTED_MODULE_1__.getSplitterForColumn)(this.column);
1460
- const stats = (0,_macromolecule__WEBPACK_IMPORTED_MODULE_1__.getStats)(this.column, 1, splitter);
1461
- alphabetSize = Object.keys(stats.freq).length;
1462
- }
1463
- return alphabetSize;
1464
- }
1465
- else {
1466
- switch (this.alphabet) {
1467
- case "PT" /* ALPHABET.PT */:
1468
- return 20;
1469
- case "DNA" /* ALPHABET.DNA */:
1470
- case "RNA" /* ALPHABET.RNA */:
1471
- return 4;
1472
- case 'NT':
1473
- console.warn(`Unexpected alphabet 'NT'.`);
1474
- return 4;
1475
- default:
1476
- throw new Error(`Unexpected alphabet '${this.alphabet}'.`);
1477
- }
1478
- }
1479
- }
1480
- getAlphabetIsMultichar() {
1481
- if (this.notation == "helm" /* NOTATION.HELM */ || this.alphabet == "UN" /* ALPHABET.UN */)
1482
- return this.column.getTag(".alphabetIsMultichar" /* TAGS.alphabetIsMultichar */) == 'true';
1483
- else
1484
- return false;
1485
- }
1486
- isFasta() { return this.notation === "fasta" /* NOTATION.FASTA */; }
1487
- isSeparator() { return this.notation === "separator" /* NOTATION.SEPARATOR */; }
1488
- isHelm() { return this.notation === "helm" /* NOTATION.HELM */; }
1489
- isRna() { return this.alphabet === "RNA" /* ALPHABET.RNA */; }
1490
- isDna() { return this.alphabet === "DNA" /* ALPHABET.DNA */; }
1491
- isPeptide() { return this.alphabet === "PT" /* ALPHABET.PT */; }
1492
- isMsa() { return this.aligned ? this.aligned.toUpperCase().includes('MSA') : false; }
1493
- /** Associate notation types with the corresponding units */
1494
- /**
1495
- * @return {NOTATION} Notation associated with the units type
1496
- */
1497
- getNotation() {
1498
- if (this.units.toLowerCase().startsWith("fasta" /* NOTATION.FASTA */))
1499
- return "fasta" /* NOTATION.FASTA */;
1500
- else if (this.units.toLowerCase().startsWith("separator" /* NOTATION.SEPARATOR */))
1501
- return "separator" /* NOTATION.SEPARATOR */;
1502
- else if (this.units.toLowerCase().startsWith("helm" /* NOTATION.HELM */))
1503
- return "helm" /* NOTATION.HELM */;
1504
- else
1505
- throw new Error(`Column '${this.column.name}' has unexpected notation '${this.units}'.`);
1506
- }
1507
- /**
1508
- * Create a new empty column of the specified notation type and the same
1509
- * length as column
1510
- *
1511
- * @param {NOTATION} targetNotation
1512
- * @return {DG.Column}
1513
- */
1514
- getNewColumn(targetNotation) {
1515
- const col = this.column;
1516
- const len = col.length;
1517
- const name = targetNotation.toLowerCase() + '(' + col.name + ')';
1518
- const newColName = col.dataFrame.columns.getUnusedName(name);
1519
- const newColumn = datagrok_api_dg__WEBPACK_IMPORTED_MODULE_0__.Column.fromList('string', newColName, new Array(len).fill(''));
1520
- newColumn.semType = datagrok_api_dg__WEBPACK_IMPORTED_MODULE_0__.SEMTYPE.MACROMOLECULE;
1521
- newColumn.setTag(datagrok_api_dg__WEBPACK_IMPORTED_MODULE_0__.TAGS.UNITS, targetNotation);
1522
- newColumn.setTag(datagrok_api_dg__WEBPACK_IMPORTED_MODULE_0__.TAGS.CELL_RENDERER, 'Macromolecule');
1523
- const srcAligned = col.getTag("aligned" /* TAGS.aligned */);
1524
- if (srcAligned)
1525
- newColumn.setTag("aligned" /* TAGS.aligned */, srcAligned);
1526
- const srcAlphabet = col.getTag("alphabet" /* TAGS.alphabet */);
1527
- if (srcAlphabet)
1528
- newColumn.setTag("alphabet" /* TAGS.alphabet */, srcAlphabet);
1529
- let srcAlphabetSize = col.getTag(".alphabetSize" /* TAGS.alphabetSize */);
1530
- if (srcAlphabetSize)
1531
- newColumn.setTag(".alphabetSize" /* TAGS.alphabetSize */, srcAlphabetSize);
1532
- const srcAlphabetIsMultichar = col.getTag(".alphabetIsMultichar" /* TAGS.alphabetIsMultichar */);
1533
- if (srcAlphabetIsMultichar !== undefined)
1534
- newColumn.setTag(".alphabetIsMultichar" /* TAGS.alphabetIsMultichar */, srcAlphabetIsMultichar);
1535
- if (targetNotation == "helm" /* NOTATION.HELM */) {
1536
- srcAlphabetSize = this.getAlphabetSize().toString();
1537
- newColumn.setTag(".alphabetSize" /* TAGS.alphabetSize */, srcAlphabetSize);
1538
- }
1539
- return newColumn;
1540
- }
1541
- /**
1542
- * Create a new empty column using templateCol as a template
1543
- *
1544
- * @param {DG.Column} templateCol the properties and units of this column are used as a
1545
- * template to build the new one
1546
- * @return {DG.Column}
1547
- */
1548
- static getNewColumn(templateCol) {
1549
- const col = new UnitsHandler(templateCol);
1550
- const targetNotation = col.notation;
1551
- return col.getNewColumn(targetNotation);
1552
- }
1553
- /**
1554
- * A helper function checking the validity of the 'units' string
1555
- *
1556
- * @param {string} units the string to be validated
1557
- * @return {boolean}
1558
- */
1559
- static unitsStringIsValid(units) {
1560
- units = units.toLowerCase();
1561
- const prefixes = ["fasta" /* NOTATION.FASTA */, "separator" /* NOTATION.SEPARATOR */, "helm" /* NOTATION.HELM */];
1562
- const postfixes = ['rna', 'dna', 'pt'];
1563
- const prefixCriterion = prefixes.some((p) => units.startsWith(p.toLowerCase()));
1564
- return prefixCriterion;
1565
- }
1566
- /**
1567
- * Construct a new column of semantic type MACROMOLECULE from the list of
1568
- * specified parameters
1569
- *
1570
- * @param {number} len the length of the new column
1571
- * @param {string} name the name of the new column
1572
- * @param {string} units the units of the new column
1573
- * @return {DG.Column}
1574
- */
1575
- static getNewColumnFromParams(len, name, units) {
1576
- // WARNING: in this implementation is is impossible to verify the uniqueness
1577
- // of the new column's name
1578
- // TODO: verify the validity of units parameter
1579
- if (!UnitsHandler.unitsStringIsValid(units))
1580
- throw new Error('Invalid format of \'units\' parameter');
1581
- const newColumn = datagrok_api_dg__WEBPACK_IMPORTED_MODULE_0__.Column.fromList('string', name, new Array(len).fill(''));
1582
- newColumn.semType = datagrok_api_dg__WEBPACK_IMPORTED_MODULE_0__.SEMTYPE.MACROMOLECULE;
1583
- newColumn.setTag(datagrok_api_dg__WEBPACK_IMPORTED_MODULE_0__.TAGS.UNITS, units);
1584
- return newColumn;
1585
- }
1586
- constructor(col) {
1587
- this._column = col;
1588
- const units = this._column.tags[datagrok_api_dg__WEBPACK_IMPORTED_MODULE_0__.TAGS.UNITS];
1589
- if (units !== null)
1590
- this._units = units;
1591
- else
1592
- throw new Error('Units are not specified in column');
1593
- this._notation = this.getNotation();
1594
- this._defaultGapSymbol = (this.isFasta()) ? UnitsHandler._defaultGapSymbolsDict.FASTA :
1595
- (this.isHelm()) ? UnitsHandler._defaultGapSymbolsDict.HELM :
1596
- UnitsHandler._defaultGapSymbolsDict.SEPARATOR;
1597
- if (!this.column.tags.has("aligned" /* TAGS.aligned */)) {
1598
- if (this.isFasta() || this.isSeparator())
1599
- throw new Error(`For column '${this.column.name}' of notation '${this.notation}' ` +
1600
- `tag '${"aligned" /* TAGS.aligned */}' is mandatory.`);
1601
- }
1602
- // if (!this.column.tags.has(TAGS.alphabetSize)) {
1603
- // if (this.isHelm())
1604
- // throw new Error(`For column '${this.column.name}' of notation '${this.notation}' ` +
1605
- // `tag '${TAGS.alphabetSize}' is mandatory.`);
1606
- // else if (['UN'].includes(this.alphabet))
1607
- // throw new Error(`For column '${this.column.name}' of alphabet '${this.alphabet}' ` +
1608
- // `tag '${TAGS.alphabetSize}' is mandatory.`);
1609
- // }
1610
- if (!this.column.tags.has(".alphabetIsMultichar" /* TAGS.alphabetIsMultichar */)) {
1611
- if (this.isHelm())
1612
- throw new Error(`For column '${this.column.name}' of notation '${this.notation}' ` +
1613
- `tag '${".alphabetIsMultichar" /* TAGS.alphabetIsMultichar */}' is mandatory.`);
1614
- else if (['UN'].includes(this.alphabet))
1615
- throw new Error(`For column '${this.column.name}' of alphabet '${this.alphabet}' ` +
1616
- `tag '${".alphabetIsMultichar" /* TAGS.alphabetIsMultichar */}' is mandatory.`);
1617
- }
1618
- }
1619
- }
1620
- UnitsHandler._defaultGapSymbolsDict = {
1621
- HELM: '*',
1622
- SEPARATOR: '',
1623
- FASTA: '-',
1624
- };
1625
- UnitsHandler.PeptideFastaAlphabet = new Set([
1626
- 'G', 'L', 'Y', 'S', 'E', 'Q', 'D', 'N', 'F', 'A',
1627
- 'K', 'R', 'H', 'C', 'V', 'P', 'W', 'I', 'M', 'T',
1628
- ]);
1629
- UnitsHandler.DnaFastaAlphabet = new Set(['A', 'C', 'G', 'T']);
1630
- UnitsHandler.RnaFastaAlphabet = new Set(['A', 'C', 'G', 'U']);
1631
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidW5pdHMtaGFuZGxlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInVuaXRzLWhhbmRsZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUV0QyxPQUFPLEVBRUwsY0FBYyxFQUNkLG9CQUFvQixFQUNwQixRQUFRLEVBR1IsZUFBZSxFQUdoQixNQUFNLGlCQUFpQixDQUFDO0FBRXpCLGlFQUFpRTtBQUNqRSxNQUFNLE9BQU8sWUFBWTtJQWtCaEIsTUFBTSxDQUFDLHFCQUFxQixDQUFDLEdBQWM7UUFDaEQsSUFBSSxHQUFHLENBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQyxPQUFPLENBQUMsYUFBYTtZQUMxQyxNQUFNLElBQUksS0FBSyxDQUFDLG9DQUFvQyxDQUFDLENBQUM7UUFFeEQsTUFBTSxLQUFLLEdBQWdCLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLGVBQWUsQ0FBQyxDQUFDO1FBQzdELE1BQU0sT0FBTyxHQUFHLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO1FBQ3JELE1BQU0sUUFBUSxHQUFHLGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUV2QyxHQUFHLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSywrQkFBaUIsQ0FBQztRQUMxQyxHQUFHLENBQUMsTUFBTSwrQkFBZSxPQUFPLENBQUMsQ0FBQztRQUNsQyxHQUFHLENBQUMsTUFBTSxpQ0FBZ0IsUUFBUSxDQUFDLENBQUM7SUFDdEMsQ0FBQztJQUVELElBQWMsS0FBSyxLQUFhLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7SUFFckQsSUFBYyxNQUFNLEtBQWdCLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7SUFFMUQsSUFBVyxRQUFRLEtBQWUsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztJQUUxRCxJQUFXLGdCQUFnQixLQUFhLE9BQU8sSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQztJQUV4RSxJQUFXLFNBQVM7O1FBQ2xCLE1BQU0sU0FBUyxHQUF1QixNQUFBLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxrQ0FBZ0IsbUNBQUksU0FBUyxDQUFDO1FBQ3RGLElBQUksSUFBSSxDQUFDLFFBQVEseUNBQXVCLElBQUksU0FBUyxLQUFLLFNBQVM7WUFDakUsTUFBTSxJQUFJLEtBQUssQ0FBQyx1Q0FBdUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLGtCQUFrQixJQUFJLENBQUMsUUFBUSxJQUFJLENBQUMsQ0FBQztRQUM5RyxPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDO0lBRUQsSUFBVyxPQUFPO1FBQ2hCLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSw4QkFBYyxDQUFDO1FBRWpELGlGQUFpRjtRQUNqRixJQUFJLENBQUMsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUNwRCxNQUFNLElBQUksS0FBSyxDQUFDLHFCQUFxQixDQUFDLENBQUM7UUFFekMsT0FBTyxPQUFPLENBQUM7SUFDakIsQ0FBQztJQUVELGlDQUFpQztJQUNqQyxJQUFXLFFBQVE7UUFDakIsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLGdDQUFlLENBQUM7UUFFbkQsa0ZBQWtGO1FBQ2xGLElBQUksQ0FBQyxRQUFRLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ3JELE1BQU0sSUFBSSxLQUFLLENBQUMsc0JBQXNCLENBQUMsQ0FBQztRQUUxQyxPQUFPLFFBQVEsQ0FBQztJQUNsQixDQUFDO0lBRU0sZUFBZTtRQUNwQixJQUFJLElBQUksQ0FBQyxRQUFRLDhCQUFpQixJQUFJLElBQUksQ0FBQyxRQUFRLDBCQUFlLEVBQUU7WUFDbEUsTUFBTSxlQUFlLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLHlDQUFtQixDQUFDO1lBQzlELElBQUksWUFBb0IsQ0FBQztZQUN6QixJQUFJLGVBQWUsRUFBRTtnQkFDbkIsWUFBWSxHQUFHLFFBQVEsQ0FBQyxlQUFlLENBQUMsQ0FBQzthQUMxQztpQkFBTTtnQkFDTCxtQ0FBbUM7Z0JBQ25DLE1BQU0sUUFBUSxHQUFpQixvQkFBb0IsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7Z0JBQ2pFLE1BQU0sS0FBSyxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxRQUFRLENBQUMsQ0FBQztnQkFDakQsWUFBWSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLE1BQU0sQ0FBQzthQUMvQztZQUNELE9BQU8sWUFBWSxDQUFDO1NBQ3JCO2FBQU07WUFDTCxRQUFRLElBQUksQ0FBQyxRQUFRLEVBQUU7Z0JBQ3ZCO29CQUNFLE9BQU8sRUFBRSxDQUFDO2dCQUNaLDhCQUFrQjtnQkFDbEI7b0JBQ0UsT0FBTyxDQUFDLENBQUM7Z0JBQ1gsS0FBSyxJQUFJO29CQUNQLE9BQU8sQ0FBQyxJQUFJLENBQUMsMkJBQTJCLENBQUMsQ0FBQztvQkFDMUMsT0FBTyxDQUFDLENBQUM7Z0JBQ1g7b0JBQ0UsTUFBTSxJQUFJLEtBQUssQ0FBQyx3QkFBd0IsSUFBSSxDQUFDLFFBQVEsSUFBSSxDQUFDLENBQUM7YUFDNUQ7U0FDRjtJQUNILENBQUM7SUFFTSxzQkFBc0I7UUFDM0IsSUFBSSxJQUFJLENBQUMsUUFBUSw4QkFBaUIsSUFBSSxJQUFJLENBQUMsUUFBUSwwQkFBZTtZQUNoRSxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSx1REFBMEIsSUFBSSxNQUFNLENBQUM7O1lBRTlELE9BQU8sS0FBSyxDQUFDO0lBQ2pCLENBQUM7SUFFTSxPQUFPLEtBQWMsT0FBTyxJQUFJLENBQUMsUUFBUSxpQ0FBbUIsQ0FBQyxDQUFDLENBQUM7SUFFL0QsV0FBVyxLQUFjLE9BQU8sSUFBSSxDQUFDLFFBQVEseUNBQXVCLENBQUMsQ0FBQyxDQUFDO0lBRXZFLE1BQU0sS0FBYyxPQUFPLElBQUksQ0FBQyxRQUFRLCtCQUFrQixDQUFDLENBQUMsQ0FBQztJQUU3RCxLQUFLLEtBQWMsT0FBTyxJQUFJLENBQUMsUUFBUSw2QkFBaUIsQ0FBQyxDQUFDLENBQUM7SUFFM0QsS0FBSyxLQUFjLE9BQU8sSUFBSSxDQUFDLFFBQVEsNkJBQWlCLENBQUMsQ0FBQyxDQUFDO0lBRTNELFNBQVMsS0FBYyxPQUFPLElBQUksQ0FBQyxRQUFRLDJCQUFnQixDQUFDLENBQUMsQ0FBQztJQUU5RCxLQUFLLEtBQWMsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsRUFBRSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztJQUVyRyw0REFBNEQ7SUFDNUQ7O09BRUc7SUFDTyxXQUFXO1FBQ25CLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFXLEVBQUUsQ0FBQyxVQUFVLDhCQUFnQjtZQUNyRCxvQ0FBc0I7YUFDbkIsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsRUFBRSxDQUFDLFVBQVUsc0NBQW9CO1lBQzlELDRDQUEwQjthQUN2QixJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxFQUFFLENBQUMsVUFBVSw0QkFBZTtZQUN6RCxrQ0FBcUI7O1lBRXJCLE1BQU0sSUFBSSxLQUFLLENBQUMsV0FBVyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksOEJBQThCLElBQUksQ0FBQyxLQUFLLElBQUksQ0FBQyxDQUFDO0lBQzdGLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDTyxZQUFZLENBQUMsY0FBd0I7UUFDN0MsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQztRQUN4QixNQUFNLEdBQUcsR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDO1FBQ3ZCLE1BQU0sSUFBSSxHQUFHLGNBQWMsQ0FBQyxXQUFXLEVBQUUsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLElBQUksR0FBRyxHQUFHLENBQUM7UUFDakUsTUFBTSxVQUFVLEdBQUcsR0FBRyxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzdELE1BQU0sU0FBUyxHQUFHLEVBQUUsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxVQUFVLEVBQUUsSUFBSSxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDcEYsU0FBUyxDQUFDLE9BQU8sR0FBRyxFQUFFLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQztRQUM3QyxTQUFTLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLGNBQWMsQ0FBQyxDQUFDO1FBQ2hELFNBQVMsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUUsZUFBZSxDQUFDLENBQUM7UUFFekQsTUFBTSxVQUFVLEdBQUcsR0FBRyxDQUFDLE1BQU0sOEJBQWMsQ0FBQztRQUM1QyxJQUFJLFVBQVU7WUFDWixTQUFTLENBQUMsTUFBTSwrQkFBZSxVQUFVLENBQUMsQ0FBQztRQUU3QyxNQUFNLFdBQVcsR0FBRyxHQUFHLENBQUMsTUFBTSxnQ0FBZSxDQUFDO1FBQzlDLElBQUksV0FBVztZQUNiLFNBQVMsQ0FBQyxNQUFNLGlDQUFnQixXQUFXLENBQUMsQ0FBQztRQUUvQyxJQUFJLGVBQWUsR0FBVyxHQUFHLENBQUMsTUFBTSx5Q0FBbUIsQ0FBQztRQUM1RCxJQUFJLGVBQWU7WUFDakIsU0FBUyxDQUFDLE1BQU0sMENBQW9CLGVBQWUsQ0FBQyxDQUFDO1FBRXZELE1BQU0sc0JBQXNCLEdBQVcsR0FBRyxDQUFDLE1BQU0sdURBQTBCLENBQUM7UUFDNUUsSUFBSSxzQkFBc0IsS0FBSyxTQUFTO1lBQ3RDLFNBQVMsQ0FBQyxNQUFNLHdEQUEyQixzQkFBc0IsQ0FBQyxDQUFDO1FBRXJFLElBQUksY0FBYyw4QkFBaUIsRUFBRTtZQUNuQyxlQUFlLEdBQUcsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ3BELFNBQVMsQ0FBQyxNQUFNLDBDQUFvQixlQUFlLENBQUMsQ0FBQztTQUN0RDtRQUVELE9BQU8sU0FBUyxDQUFDO0lBQ25CLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSSxNQUFNLENBQUMsWUFBWSxDQUFDLFdBQXNCO1FBQy9DLE1BQU0sR0FBRyxHQUFpQixJQUFJLFlBQVksQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUN4RCxNQUFNLGNBQWMsR0FBRyxHQUFHLENBQUMsUUFBUSxDQUFDO1FBQ3BDLE9BQU8sR0FBRyxDQUFDLFlBQVksQ0FBQyxjQUFjLENBQUMsQ0FBQztJQUMxQyxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSSxNQUFNLENBQUMsa0JBQWtCLENBQUMsS0FBYTtRQUM1QyxLQUFLLEdBQUcsS0FBSyxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQzVCLE1BQU0sUUFBUSxHQUFHLGdHQUFtRCxDQUFDO1FBQ3JFLE1BQU0sU0FBUyxHQUFHLENBQUMsS0FBSyxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQztRQUV2QyxNQUFNLGVBQWUsR0FBRyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDaEYsT0FBTyxlQUFlLENBQUM7SUFDekIsQ0FBQztJQUVEOzs7Ozs7OztPQVFHO0lBQ0ksTUFBTSxDQUFDLHNCQUFzQixDQUNsQyxHQUFXLEVBQ1gsSUFBWSxFQUNaLEtBQWE7UUFFYiw0RUFBNEU7UUFDNUUsMkJBQTJCO1FBQzNCLCtDQUErQztRQUMvQyxJQUFJLENBQUMsWUFBWSxDQUFDLGtCQUFrQixDQUFDLEtBQUssQ0FBQztZQUN6QyxNQUFNLElBQUksS0FBSyxDQUFDLHVDQUF1QyxDQUFDLENBQUM7UUFDM0QsTUFBTSxTQUFTLEdBQUcsRUFBRSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsUUFBUSxFQUFFLElBQUksRUFBRSxJQUFJLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUM5RSxTQUFTLENBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDO1FBQzdDLFNBQVMsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDdkMsT0FBTyxTQUFTLENBQUM7SUFDbkIsQ0FBQztJQUVELFlBQW1CLEdBQWM7UUFDL0IsSUFBSSxDQUFDLE9BQU8sR0FBRyxHQUFHLENBQUM7UUFDbkIsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUMvQyxJQUFJLEtBQUssS0FBSyxJQUFJO1lBQ2hCLElBQUksQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDOztZQUVwQixNQUFNLElBQUksS0FBSyxDQUFDLG1DQUFtQyxDQUFDLENBQUM7UUFDdkQsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDcEMsSUFBSSxDQUFDLGlCQUFpQixHQUFHLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxzQkFBc0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNyRixDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsc0JBQXNCLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQzFELFlBQVksQ0FBQyxzQkFBc0IsQ0FBQyxTQUFTLENBQUM7UUFFbEQsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsOEJBQWMsRUFBRTtZQUN2QyxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUUsSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFO2dCQUN0QyxNQUFNLElBQUksS0FBSyxDQUFDLGVBQWUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLGtCQUFrQixJQUFJLENBQUMsUUFBUSxJQUFJO29CQUNoRixRQUFRLDRCQUFZLGlCQUFpQixDQUFDLENBQUM7U0FDNUM7UUFFRCxrREFBa0Q7UUFDbEQsdUJBQXVCO1FBQ3ZCLDJGQUEyRjtRQUMzRixxREFBcUQ7UUFDckQsNkNBQTZDO1FBQzdDLDJGQUEyRjtRQUMzRixxREFBcUQ7UUFDckQsSUFBSTtRQUVKLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLHVEQUEwQixFQUFFO1lBQ25ELElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRTtnQkFDZixNQUFNLElBQUksS0FBSyxDQUFDLGVBQWUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLGtCQUFrQixJQUFJLENBQUMsUUFBUSxJQUFJO29CQUNoRixRQUFRLHFEQUF3QixpQkFBaUIsQ0FBQyxDQUFDO2lCQUNsRCxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUM7Z0JBQ3JDLE1BQU0sSUFBSSxLQUFLLENBQUMsZUFBZSxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksa0JBQWtCLElBQUksQ0FBQyxRQUFRLElBQUk7b0JBQ2hGLFFBQVEscURBQXdCLGlCQUFpQixDQUFDLENBQUM7U0FDeEQ7SUFDSCxDQUFDOztBQWhReUIsbUNBQXNCLEdBQUc7SUFDakQsSUFBSSxFQUFFLEdBQUc7SUFDVCxTQUFTLEVBQUUsRUFBRTtJQUNiLEtBQUssRUFBRSxHQUFHO0NBQ1gsQ0FBQztBQUVxQixpQ0FBb0IsR0FBRyxJQUFJLEdBQUcsQ0FBUztJQUM1RCxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHO0lBQ2hELEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUc7Q0FDakQsQ0FBQyxDQUFDO0FBQ29CLDZCQUFnQixHQUFHLElBQUksR0FBRyxDQUFTLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUN6RCw2QkFBZ0IsR0FBRyxJQUFJLEdBQUcsQ0FBUyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBERyBmcm9tICdkYXRhZ3Jvay1hcGkvZGcnO1xuXG5pbXBvcnQge1xuICBBTFBIQUJFVCxcbiAgZGV0ZWN0QWxwaGFiZXQsXG4gIGdldFNwbGl0dGVyRm9yQ29sdW1uLFxuICBnZXRTdGF0cyxcbiAgTk9UQVRJT04sXG4gIFNlcUNvbFN0YXRzLFxuICBzcGxpdHRlckFzRmFzdGEsXG4gIFNwbGl0dGVyRnVuYyxcbiAgVEFHU1xufSBmcm9tICcuL21hY3JvbW9sZWN1bGUnO1xuXG4vKiogQ2xhc3MgZm9yIGhhbmRsaW5nIG5vdGF0aW9uIHVuaXRzIGluIE1hY3JvbW9sZWN1bGUgY29sdW1ucyAqL1xuZXhwb3J0IGNsYXNzIFVuaXRzSGFuZGxlciB7XG4gIHByb3RlY3RlZCByZWFkb25seSBfY29sdW1uOiBERy5Db2x1bW47IC8vIHRoZSBjb2x1bW4gdG8gYmUgY29udmVydGVkXG4gIHByb3RlY3RlZCBfdW5pdHM6IHN0cmluZzsgLy8gdW5pdHMsIG9mIHRoZSBmb3JtIGZhc3RhLCBzZXBhcmF0b3JcbiAgcHJvdGVjdGVkIF9ub3RhdGlvbjogTk9UQVRJT047IC8vIGN1cnJlbnQgbm90YXRpb24gKHdpdGhvdXQgOlNFUTpOVCwgZXRjLilcbiAgcHJvdGVjdGVkIF9kZWZhdWx0R2FwU3ltYm9sOiBzdHJpbmc7XG4gIHByb3RlY3RlZCBzdGF0aWMgcmVhZG9ubHkgX2RlZmF1bHRHYXBTeW1ib2xzRGljdCA9IHtcbiAgICBIRUxNOiAnKicsXG4gICAgU0VQQVJBVE9SOiAnJyxcbiAgICBGQVNUQTogJy0nLFxuICB9O1xuXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgUGVwdGlkZUZhc3RhQWxwaGFiZXQgPSBuZXcgU2V0PHN0cmluZz4oW1xuICAgICdHJywgJ0wnLCAnWScsICdTJywgJ0UnLCAnUScsICdEJywgJ04nLCAnRicsICdBJyxcbiAgICAnSycsICdSJywgJ0gnLCAnQycsICdWJywgJ1AnLCAnVycsICdJJywgJ00nLCAnVCcsXG4gIF0pO1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IERuYUZhc3RhQWxwaGFiZXQgPSBuZXcgU2V0PHN0cmluZz4oWydBJywgJ0MnLCAnRycsICdUJ10pO1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFJuYUZhc3RhQWxwaGFiZXQgPSBuZXcgU2V0PHN0cmluZz4oWydBJywgJ0MnLCAnRycsICdVJ10pO1xuXG4gIHB1YmxpYyBzdGF0aWMgc2V0VW5pdHNUb0Zhc3RhQ29sdW1uKGNvbDogREcuQ29sdW1uKSB7XG4gICAgaWYgKGNvbC5zZW1UeXBlICE9PSBERy5TRU1UWVBFLk1BQ1JPTU9MRUNVTEUpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Zhc3RhIGNvbHVtbiBtdXN0IGJlIE1BQ1JPTU9MRUNVTEUnKTtcblxuICAgIGNvbnN0IHN0YXRzOiBTZXFDb2xTdGF0cyA9IGdldFN0YXRzKGNvbCwgNSwgc3BsaXR0ZXJBc0Zhc3RhKTtcbiAgICBjb25zdCBhbGlnbmVkID0gc3RhdHMuc2FtZUxlbmd0aCA/ICdTRVEuTVNBJyA6ICdTRVEnO1xuICAgIGNvbnN0IGFscGhhYmV0ID0gZGV0ZWN0QWxwaGFiZXQoc3RhdHMpO1xuXG4gICAgY29sLnNldFRhZyhERy5UQUdTLlVOSVRTLCBOT1RBVElPTi5GQVNUQSk7XG4gICAgY29sLnNldFRhZyhUQUdTLmFsaWduZWQsIGFsaWduZWQpO1xuICAgIGNvbC5zZXRUYWcoVEFHUy5hbHBoYWJldCwgYWxwaGFiZXQpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldCB1bml0cygpOiBzdHJpbmcgeyByZXR1cm4gdGhpcy5fdW5pdHM7IH1cblxuICBwcm90ZWN0ZWQgZ2V0IGNvbHVtbigpOiBERy5Db2x1bW4geyByZXR1cm4gdGhpcy5fY29sdW1uOyB9XG5cbiAgcHVibGljIGdldCBub3RhdGlvbigpOiBOT1RBVElPTiB7IHJldHVybiB0aGlzLl9ub3RhdGlvbjsgfVxuXG4gIHB1YmxpYyBnZXQgZGVmYXVsdEdhcFN5bWJvbCgpOiBzdHJpbmcgeyByZXR1cm4gdGhpcy5fZGVmYXVsdEdhcFN5bWJvbDsgfVxuXG4gIHB1YmxpYyBnZXQgc2VwYXJhdG9yKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3Qgc2VwYXJhdG9yOiBzdHJpbmcgfCB1bmRlZmluZWQgPSB0aGlzLmNvbHVtbi5nZXRUYWcoVEFHUy5zZXBhcmF0b3IpID8/IHVuZGVmaW5lZDtcbiAgICBpZiAodGhpcy5ub3RhdGlvbiA9PT0gTk9UQVRJT04uU0VQQVJBVE9SICYmIHNlcGFyYXRvciA9PT0gdW5kZWZpbmVkKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBTZXBhcmF0b3IgaXMgbWFuZGF0b3J5ICBmb3IgY29sdW1uICcke3RoaXMuY29sdW1uLm5hbWV9JyBvZiBub3RhdGlvbiAnJHt0aGlzLm5vdGF0aW9ufScuYCk7XG4gICAgcmV0dXJuIHNlcGFyYXRvcjtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgYWxpZ25lZCgpOiBzdHJpbmcge1xuICAgIGNvbnN0IGFsaWduZWQgPSB0aGlzLmNvbHVtbi5nZXRUYWcoVEFHUy5hbGlnbmVkKTtcblxuICAgIC8vIFRBR1MuYWxpZ25lZCBpcyBtYW5kYXRvcnkgZm9yIGNvbHVtbnMgb2YgTk9UQVRJT04uRkFTVEEgYW5kIE5PVEFUSU9OLlNFUEFSQVRPUlxuICAgIGlmICghYWxpZ25lZCAmJiAodGhpcy5pc0Zhc3RhKCkgfHwgdGhpcy5pc1NlcGFyYXRvcigpKSlcbiAgICAgIHRocm93IG5ldyBFcnJvcignVGFnIGFsaWduZWQgbm90IHNldCcpO1xuXG4gICAgcmV0dXJuIGFsaWduZWQ7XG4gIH1cblxuICAvKiogQWxwaGFiZXQgbmFtZSAodXBwZXIgY2FzZSkgKi9cbiAgcHVibGljIGdldCBhbHBoYWJldCgpOiBzdHJpbmcge1xuICAgIGNvbnN0IGFscGhhYmV0ID0gdGhpcy5jb2x1bW4uZ2V0VGFnKFRBR1MuYWxwaGFiZXQpO1xuXG4gICAgLy8gVEFHUy5hbHBoYWJldCBpcyBtYW5kYXRvcnkgZm9yIGNvbHVtbnMgb2YgTk9UQVRJT04uRkFTVEEgYW5kIE5PVEFUSU9OLlNFUEFSQVRPUlxuICAgIGlmICghYWxwaGFiZXQgJiYgKHRoaXMuaXNGYXN0YSgpIHx8IHRoaXMuaXNTZXBhcmF0b3IoKSkpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RhZyBhbHBoYWJldCBub3Qgc2V0Jyk7XG5cbiAgICByZXR1cm4gYWxwaGFiZXQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0QWxwaGFiZXRTaXplKCk6IG51bWJlciB7XG4gICAgaWYgKHRoaXMubm90YXRpb24gPT0gTk9UQVRJT04uSEVMTSB8fCB0aGlzLmFscGhhYmV0ID09IEFMUEhBQkVULlVOKSB7XG4gICAgICBjb25zdCBhbHBoYWJldFNpemVTdHIgPSB0aGlzLmNvbHVtbi5nZXRUYWcoVEFHUy5hbHBoYWJldFNpemUpO1xuICAgICAgbGV0IGFscGhhYmV0U2l6ZTogbnVtYmVyO1xuICAgICAgaWYgKGFscGhhYmV0U2l6ZVN0cikge1xuICAgICAgICBhbHBoYWJldFNpemUgPSBwYXJzZUludChhbHBoYWJldFNpemVTdHIpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gY2FsY3VsYXRlIGFscGhhYmV0U2l6ZSBvbiBkZW1hbmRcbiAgICAgICAgY29uc3Qgc3BsaXR0ZXI6IFNwbGl0dGVyRnVuYyA9IGdldFNwbGl0dGVyRm9yQ29sdW1uKHRoaXMuY29sdW1uKTtcbiAgICAgICAgY29uc3Qgc3RhdHMgPSBnZXRTdGF0cyh0aGlzLmNvbHVtbiwgMSwgc3BsaXR0ZXIpO1xuICAgICAgICBhbHBoYWJldFNpemUgPSBPYmplY3Qua2V5cyhzdGF0cy5mcmVxKS5sZW5ndGg7XG4gICAgICB9XG4gICAgICByZXR1cm4gYWxwaGFiZXRTaXplO1xuICAgIH0gZWxzZSB7XG4gICAgICBzd2l0Y2ggKHRoaXMuYWxwaGFiZXQpIHtcbiAgICAgIGNhc2UgQUxQSEFCRVQuUFQ6XG4gICAgICAgIHJldHVybiAyMDtcbiAgICAgIGNhc2UgQUxQSEFCRVQuRE5BOlxuICAgICAgY2FzZSBBTFBIQUJFVC5STkE6XG4gICAgICAgIHJldHVybiA0O1xuICAgICAgY2FzZSAnTlQnOlxuICAgICAgICBjb25zb2xlLndhcm4oYFVuZXhwZWN0ZWQgYWxwaGFiZXQgJ05UJy5gKTtcbiAgICAgICAgcmV0dXJuIDQ7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuZXhwZWN0ZWQgYWxwaGFiZXQgJyR7dGhpcy5hbHBoYWJldH0nLmApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBnZXRBbHBoYWJldElzTXVsdGljaGFyKCk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLm5vdGF0aW9uID09IE5PVEFUSU9OLkhFTE0gfHwgdGhpcy5hbHBoYWJldCA9PSBBTFBIQUJFVC5VTilcbiAgICAgIHJldHVybiB0aGlzLmNvbHVtbi5nZXRUYWcoVEFHUy5hbHBoYWJldElzTXVsdGljaGFyKSA9PSAndHJ1ZSc7XG4gICAgZWxzZVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcHVibGljIGlzRmFzdGEoKTogYm9vbGVhbiB7IHJldHVybiB0aGlzLm5vdGF0aW9uID09PSBOT1RBVElPTi5GQVNUQTsgfVxuXG4gIHB1YmxpYyBpc1NlcGFyYXRvcigpOiBib29sZWFuIHsgcmV0dXJuIHRoaXMubm90YXRpb24gPT09IE5PVEFUSU9OLlNFUEFSQVRPUjsgfVxuXG4gIHB1YmxpYyBpc0hlbG0oKTogYm9vbGVhbiB7IHJldHVybiB0aGlzLm5vdGF0aW9uID09PSBOT1RBVElPTi5IRUxNOyB9XG5cbiAgcHVibGljIGlzUm5hKCk6IGJvb2xlYW4geyByZXR1cm4gdGhpcy5hbHBoYWJldCA9PT0gQUxQSEFCRVQuUk5BOyB9XG5cbiAgcHVibGljIGlzRG5hKCk6IGJvb2xlYW4geyByZXR1cm4gdGhpcy5hbHBoYWJldCA9PT0gQUxQSEFCRVQuRE5BOyB9XG5cbiAgcHVibGljIGlzUGVwdGlkZSgpOiBib29sZWFuIHsgcmV0dXJuIHRoaXMuYWxwaGFiZXQgPT09IEFMUEhBQkVULlBUOyB9XG5cbiAgcHVibGljIGlzTXNhKCk6IGJvb2xlYW4geyByZXR1cm4gdGhpcy5hbGlnbmVkID8gdGhpcy5hbGlnbmVkLnRvVXBwZXJDYXNlKCkuaW5jbHVkZXMoJ01TQScpIDogZmFsc2U7IH1cblxuICAvKiogQXNzb2NpYXRlIG5vdGF0aW9uIHR5cGVzIHdpdGggdGhlIGNvcnJlc3BvbmRpbmcgdW5pdHMgKi9cbiAgLyoqXG4gICAqIEByZXR1cm4ge05PVEFUSU9OfSAgICAgTm90YXRpb24gYXNzb2NpYXRlZCB3aXRoIHRoZSB1bml0cyB0eXBlXG4gICAqL1xuICBwcm90ZWN0ZWQgZ2V0Tm90YXRpb24oKTogTk9UQVRJT04ge1xuICAgIGlmICh0aGlzLnVuaXRzLnRvTG93ZXJDYXNlKCkuc3RhcnRzV2l0aChOT1RBVElPTi5GQVNUQSkpXG4gICAgICByZXR1cm4gTk9UQVRJT04uRkFTVEE7XG4gICAgZWxzZSBpZiAodGhpcy51bml0cy50b0xvd2VyQ2FzZSgpLnN0YXJ0c1dpdGgoTk9UQVRJT04uU0VQQVJBVE9SKSlcbiAgICAgIHJldHVybiBOT1RBVElPTi5TRVBBUkFUT1I7XG4gICAgZWxzZSBpZiAodGhpcy51bml0cy50b0xvd2VyQ2FzZSgpLnN0YXJ0c1dpdGgoTk9UQVRJT04uSEVMTSkpXG4gICAgICByZXR1cm4gTk9UQVRJT04uSEVMTTtcbiAgICBlbHNlXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYENvbHVtbiAnJHt0aGlzLmNvbHVtbi5uYW1lfScgaGFzIHVuZXhwZWN0ZWQgbm90YXRpb24gJyR7dGhpcy51bml0c30nLmApO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIG5ldyBlbXB0eSBjb2x1bW4gb2YgdGhlIHNwZWNpZmllZCBub3RhdGlvbiB0eXBlIGFuZCB0aGUgc2FtZVxuICAgKiBsZW5ndGggYXMgY29sdW1uXG4gICAqXG4gICAqIEBwYXJhbSB7Tk9UQVRJT059IHRhcmdldE5vdGF0aW9uXG4gICAqIEByZXR1cm4ge0RHLkNvbHVtbn1cbiAgICovXG4gIHByb3RlY3RlZCBnZXROZXdDb2x1bW4odGFyZ2V0Tm90YXRpb246IE5PVEFUSU9OKTogREcuQ29sdW1uIHtcbiAgICBjb25zdCBjb2wgPSB0aGlzLmNvbHVtbjtcbiAgICBjb25zdCBsZW4gPSBjb2wubGVuZ3RoO1xuICAgIGNvbnN0IG5hbWUgPSB0YXJnZXROb3RhdGlvbi50b0xvd2VyQ2FzZSgpICsgJygnICsgY29sLm5hbWUgKyAnKSc7XG4gICAgY29uc3QgbmV3Q29sTmFtZSA9IGNvbC5kYXRhRnJhbWUuY29sdW1ucy5nZXRVbnVzZWROYW1lKG5hbWUpO1xuICAgIGNvbnN0IG5ld0NvbHVtbiA9IERHLkNvbHVtbi5mcm9tTGlzdCgnc3RyaW5nJywgbmV3Q29sTmFtZSwgbmV3IEFycmF5KGxlbikuZmlsbCgnJykpO1xuICAgIG5ld0NvbHVtbi5zZW1UeXBlID0gREcuU0VNVFlQRS5NQUNST01PTEVDVUxFO1xuICAgIG5ld0NvbHVtbi5zZXRUYWcoREcuVEFHUy5VTklUUywgdGFyZ2V0Tm90YXRpb24pO1xuICAgIG5ld0NvbHVtbi5zZXRUYWcoREcuVEFHUy5DRUxMX1JFTkRFUkVSLCAnTWFjcm9tb2xlY3VsZScpO1xuXG4gICAgY29uc3Qgc3JjQWxpZ25lZCA9IGNvbC5nZXRUYWcoVEFHUy5hbGlnbmVkKTtcbiAgICBpZiAoc3JjQWxpZ25lZClcbiAgICAgIG5ld0NvbHVtbi5zZXRUYWcoVEFHUy5hbGlnbmVkLCBzcmNBbGlnbmVkKTtcblxuICAgIGNvbnN0IHNyY0FscGhhYmV0ID0gY29sLmdldFRhZyhUQUdTLmFscGhhYmV0KTtcbiAgICBpZiAoc3JjQWxwaGFiZXQpXG4gICAgICBuZXdDb2x1bW4uc2V0VGFnKFRBR1MuYWxwaGFiZXQsIHNyY0FscGhhYmV0KTtcblxuICAgIGxldCBzcmNBbHBoYWJldFNpemU6IHN0cmluZyA9IGNvbC5nZXRUYWcoVEFHUy5hbHBoYWJldFNpemUpO1xuICAgIGlmIChzcmNBbHBoYWJldFNpemUpXG4gICAgICBuZXdDb2x1bW4uc2V0VGFnKFRBR1MuYWxwaGFiZXRTaXplLCBzcmNBbHBoYWJldFNpemUpO1xuXG4gICAgY29uc3Qgc3JjQWxwaGFiZXRJc011bHRpY2hhcjogc3RyaW5nID0gY29sLmdldFRhZyhUQUdTLmFscGhhYmV0SXNNdWx0aWNoYXIpO1xuICAgIGlmIChzcmNBbHBoYWJldElzTXVsdGljaGFyICE9PSB1bmRlZmluZWQpXG4gICAgICBuZXdDb2x1bW4uc2V0VGFnKFRBR1MuYWxwaGFiZXRJc011bHRpY2hhciwgc3JjQWxwaGFiZXRJc011bHRpY2hhcik7XG5cbiAgICBpZiAodGFyZ2V0Tm90YXRpb24gPT0gTk9UQVRJT04uSEVMTSkge1xuICAgICAgc3JjQWxwaGFiZXRTaXplID0gdGhpcy5nZXRBbHBoYWJldFNpemUoKS50b1N0cmluZygpO1xuICAgICAgbmV3Q29sdW1uLnNldFRhZyhUQUdTLmFscGhhYmV0U2l6ZSwgc3JjQWxwaGFiZXRTaXplKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3Q29sdW1uO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIG5ldyBlbXB0eSBjb2x1bW4gdXNpbmcgdGVtcGxhdGVDb2wgYXMgYSB0ZW1wbGF0ZVxuICAgKlxuICAgKiBAcGFyYW0ge0RHLkNvbHVtbn0gdGVtcGxhdGVDb2wgIHRoZSBwcm9wZXJ0aWVzIGFuZCB1bml0cyBvZiB0aGlzIGNvbHVtbiBhcmUgdXNlZCBhcyBhXG4gICAqIHRlbXBsYXRlIHRvIGJ1aWxkIHRoZSBuZXcgb25lXG4gICAqIEByZXR1cm4ge0RHLkNvbHVtbn1cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZ2V0TmV3Q29sdW1uKHRlbXBsYXRlQ29sOiBERy5Db2x1bW4pOiBERy5Db2x1bW4ge1xuICAgIGNvbnN0IGNvbDogVW5pdHNIYW5kbGVyID0gbmV3IFVuaXRzSGFuZGxlcih0ZW1wbGF0ZUNvbCk7XG4gICAgY29uc3QgdGFyZ2V0Tm90YXRpb24gPSBjb2wubm90YXRpb247XG4gICAgcmV0dXJuIGNvbC5nZXROZXdDb2x1bW4odGFyZ2V0Tm90YXRpb24pO1xuICB9XG5cbiAgLyoqXG4gICAqIEEgaGVscGVyIGZ1bmN0aW9uIGNoZWNraW5nIHRoZSB2YWxpZGl0eSBvZiB0aGUgJ3VuaXRzJyBzdHJpbmdcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IHVuaXRzICB0aGUgc3RyaW5nIHRvIGJlIHZhbGlkYXRlZFxuICAgKiBAcmV0dXJuIHtib29sZWFufVxuICAgKi9cbiAgcHVibGljIHN0YXRpYyB1bml0c1N0cmluZ0lzVmFsaWQodW5pdHM6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHVuaXRzID0gdW5pdHMudG9Mb3dlckNhc2UoKTtcbiAgICBjb25zdCBwcmVmaXhlcyA9IFtOT1RBVElPTi5GQVNUQSwgTk9UQVRJT04uU0VQQVJBVE9SLCBOT1RBVElPTi5IRUxNXTtcbiAgICBjb25zdCBwb3N0Zml4ZXMgPSBbJ3JuYScsICdkbmEnLCAncHQnXTtcblxuICAgIGNvbnN0IHByZWZpeENyaXRlcmlvbiA9IHByZWZpeGVzLnNvbWUoKHApID0+IHVuaXRzLnN0YXJ0c1dpdGgocC50b0xvd2VyQ2FzZSgpKSk7XG4gICAgcmV0dXJuIHByZWZpeENyaXRlcmlvbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb25zdHJ1Y3QgYSBuZXcgY29sdW1uIG9mIHNlbWFudGljIHR5cGUgTUFDUk9NT0xFQ1VMRSBmcm9tIHRoZSBsaXN0IG9mXG4gICAqIHNwZWNpZmllZCBwYXJhbWV0ZXJzXG4gICAqXG4gICAqIEBwYXJhbSB7bnVtYmVyfSAgICBsZW4gIHRoZSBsZW5ndGggb2YgdGhlIG5ldyBjb2x1bW5cbiAgICogQHBhcmFtIHtzdHJpbmd9ICAgIG5hbWUgIHRoZSBuYW1lIG9mIHRoZSBuZXcgY29sdW1uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSAgICB1bml0cyAgdGhlIHVuaXRzIG9mIHRoZSBuZXcgY29sdW1uXG4gICAqIEByZXR1cm4ge0RHLkNvbHVtbn1cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZ2V0TmV3Q29sdW1uRnJvbVBhcmFtcyhcbiAgICBsZW46IG51bWJlcixcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgdW5pdHM6IHN0cmluZ1xuICApOiBERy5Db2x1bW4ge1xuICAgIC8vIFdBUk5JTkc6IGluIHRoaXMgaW1wbGVtZW50YXRpb24gaXMgaXMgaW1wb3NzaWJsZSB0byB2ZXJpZnkgdGhlIHVuaXF1ZW5lc3NcbiAgICAvLyBvZiB0aGUgbmV3IGNvbHVtbidzIG5hbWVcbiAgICAvLyBUT0RPOiB2ZXJpZnkgdGhlIHZhbGlkaXR5IG9mIHVuaXRzIHBhcmFtZXRlclxuICAgIGlmICghVW5pdHNIYW5kbGVyLnVuaXRzU3RyaW5nSXNWYWxpZCh1bml0cykpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgZm9ybWF0IG9mIFxcJ3VuaXRzXFwnIHBhcmFtZXRlcicpO1xuICAgIGNvbnN0IG5ld0NvbHVtbiA9IERHLkNvbHVtbi5mcm9tTGlzdCgnc3RyaW5nJywgbmFtZSwgbmV3IEFycmF5KGxlbikuZmlsbCgnJykpO1xuICAgIG5ld0NvbHVtbi5zZW1UeXBlID0gREcuU0VNVFlQRS5NQUNST01PTEVDVUxFO1xuICAgIG5ld0NvbHVtbi5zZXRUYWcoREcuVEFHUy5VTklUUywgdW5pdHMpO1xuICAgIHJldHVybiBuZXdDb2x1bW47XG4gIH1cblxuICBwdWJsaWMgY29uc3RydWN0b3IoY29sOiBERy5Db2x1bW4pIHtcbiAgICB0aGlzLl9jb2x1bW4gPSBjb2w7XG4gICAgY29uc3QgdW5pdHMgPSB0aGlzLl9jb2x1bW4udGFnc1tERy5UQUdTLlVOSVRTXTtcbiAgICBpZiAodW5pdHMgIT09IG51bGwpXG4gICAgICB0aGlzLl91bml0cyA9IHVuaXRzO1xuICAgIGVsc2VcbiAgICAgIHRocm93IG5ldyBFcnJvcignVW5pdHMgYXJlIG5vdCBzcGVjaWZpZWQgaW4gY29sdW1uJyk7XG4gICAgdGhpcy5fbm90YXRpb24gPSB0aGlzLmdldE5vdGF0aW9uKCk7XG4gICAgdGhpcy5fZGVmYXVsdEdhcFN5bWJvbCA9ICh0aGlzLmlzRmFzdGEoKSkgPyBVbml0c0hhbmRsZXIuX2RlZmF1bHRHYXBTeW1ib2xzRGljdC5GQVNUQSA6XG4gICAgICAodGhpcy5pc0hlbG0oKSkgPyBVbml0c0hhbmRsZXIuX2RlZmF1bHRHYXBTeW1ib2xzRGljdC5IRUxNIDpcbiAgICAgICAgVW5pdHNIYW5kbGVyLl9kZWZhdWx0R2FwU3ltYm9sc0RpY3QuU0VQQVJBVE9SO1xuXG4gICAgaWYgKCF0aGlzLmNvbHVtbi50YWdzLmhhcyhUQUdTLmFsaWduZWQpKSB7XG4gICAgICBpZiAodGhpcy5pc0Zhc3RhKCkgfHwgdGhpcy5pc1NlcGFyYXRvcigpKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEZvciBjb2x1bW4gJyR7dGhpcy5jb2x1bW4ubmFtZX0nIG9mIG5vdGF0aW9uICcke3RoaXMubm90YXRpb259JyBgICtcbiAgICAgICAgICBgdGFnICcke1RBR1MuYWxpZ25lZH0nIGlzIG1hbmRhdG9yeS5gKTtcbiAgICB9XG5cbiAgICAvLyBpZiAoIXRoaXMuY29sdW1uLnRhZ3MuaGFzKFRBR1MuYWxwaGFiZXRTaXplKSkge1xuICAgIC8vICAgaWYgKHRoaXMuaXNIZWxtKCkpXG4gICAgLy8gICAgIHRocm93IG5ldyBFcnJvcihgRm9yIGNvbHVtbiAnJHt0aGlzLmNvbHVtbi5uYW1lfScgb2Ygbm90YXRpb24gJyR7dGhpcy5ub3RhdGlvbn0nIGAgK1xuICAgIC8vICAgICAgIGB0YWcgJyR7VEFHUy5hbHBoYWJldFNpemV9JyBpcyBtYW5kYXRvcnkuYCk7XG4gICAgLy8gICBlbHNlIGlmIChbJ1VOJ10uaW5jbHVkZXModGhpcy5hbHBoYWJldCkpXG4gICAgLy8gICAgIHRocm93IG5ldyBFcnJvcihgRm9yIGNvbHVtbiAnJHt0aGlzLmNvbHVtbi5uYW1lfScgb2YgYWxwaGFiZXQgJyR7dGhpcy5hbHBoYWJldH0nIGAgK1xuICAgIC8vICAgICAgIGB0YWcgJyR7VEFHUy5hbHBoYWJldFNpemV9JyBpcyBtYW5kYXRvcnkuYCk7XG4gICAgLy8gfVxuXG4gICAgaWYgKCF0aGlzLmNvbHVtbi50YWdzLmhhcyhUQUdTLmFscGhhYmV0SXNNdWx0aWNoYXIpKSB7XG4gICAgICBpZiAodGhpcy5pc0hlbG0oKSlcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBGb3IgY29sdW1uICcke3RoaXMuY29sdW1uLm5hbWV9JyBvZiBub3RhdGlvbiAnJHt0aGlzLm5vdGF0aW9ufScgYCArXG4gICAgICAgICAgYHRhZyAnJHtUQUdTLmFscGhhYmV0SXNNdWx0aWNoYXJ9JyBpcyBtYW5kYXRvcnkuYCk7XG4gICAgICBlbHNlIGlmIChbJ1VOJ10uaW5jbHVkZXModGhpcy5hbHBoYWJldCkpXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgRm9yIGNvbHVtbiAnJHt0aGlzLmNvbHVtbi5uYW1lfScgb2YgYWxwaGFiZXQgJyR7dGhpcy5hbHBoYWJldH0nIGAgK1xuICAgICAgICAgIGB0YWcgJyR7VEFHUy5hbHBoYWJldElzTXVsdGljaGFyfScgaXMgbWFuZGF0b3J5LmApO1xuICAgIH1cbiAgfVxufVxuIl19
1632
-
1633
- /***/ }),
1634
-
1635
- /***/ "./node_modules/@datagrok-libraries/utils/src/to-console.js":
1636
- /*!******************************************************************!*\
1637
- !*** ./node_modules/@datagrok-libraries/utils/src/to-console.js ***!
1638
- \******************************************************************/
1639
- /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
1640
-
1641
- __webpack_require__.r(__webpack_exports__);
1642
- /* harmony export */ __webpack_require__.d(__webpack_exports__, {
1643
- /* harmony export */ "errorToConsole": () => (/* binding */ errorToConsole),
1644
- /* harmony export */ "rectToConsole": () => (/* binding */ rectToConsole)
1645
- /* harmony export */ });
1646
- function errorToConsole(err) {
1647
- var _a;
1648
- if (typeof err === 'string' || err instanceof String) {
1649
- return err;
1650
- }
1651
- else if ('$thrownJsError' in err) {
1652
- return errorToConsole(err['$thrownJsError']);
1653
- }
1654
- else if (err instanceof Error) {
1655
- return (_a = err.stack) !== null && _a !== void 0 ? _a : err.message;
1656
- }
1657
- else {
1658
- return err.toString();
1659
- }
1660
- }
1661
- function rectToConsole(rect) {
1662
- return `(x=${rect.x}, y=${rect.y}, w=${rect.width}, h=${rect.height})`;
1663
- }
1664
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG8tY29uc29sZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInRvLWNvbnNvbGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBS0EsTUFBTSxVQUFVLGNBQWMsQ0FBQyxHQUFROztJQUNyQyxJQUFJLE9BQU8sR0FBRyxLQUFLLFFBQVEsSUFBSSxHQUFHLFlBQVksTUFBTSxFQUFFO1FBQ3BELE9BQU8sR0FBYSxDQUFDO0tBQ3RCO1NBQU0sSUFBSSxnQkFBZ0IsSUFBSSxHQUFHLEVBQUU7UUFDbEMsT0FBTyxjQUFjLENBQUMsR0FBRyxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQztLQUM5QztTQUFNLElBQUksR0FBRyxZQUFZLEtBQUssRUFBRTtRQUMvQixPQUFPLE1BQUMsR0FBYSxDQUFDLEtBQUssbUNBQUssR0FBYSxDQUFDLE9BQU8sQ0FBQztLQUN2RDtTQUFNO1FBQ0wsT0FBTyxHQUFHLENBQUMsUUFBUSxFQUFFLENBQUM7S0FDdkI7QUFDSCxDQUFDO0FBRUQsTUFBTSxVQUFVLGFBQWEsQ0FBQyxJQUFhO0lBQ3pDLE9BQU8sTUFBTSxJQUFJLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLEtBQUssT0FBTyxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUM7QUFDekUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIHVpIGZyb20gJ2RhdGFncm9rLWFwaS91aSc7XG5pbXBvcnQgKiBhcyBncm9rIGZyb20gJ2RhdGFncm9rLWFwaS9ncm9rJztcbmltcG9ydCAqIGFzIERHIGZyb20gJ2RhdGFncm9rLWFwaS9kZyc7XG5cblxuZXhwb3J0IGZ1bmN0aW9uIGVycm9yVG9Db25zb2xlKGVycjogYW55KTogc3RyaW5nIHtcbiAgaWYgKHR5cGVvZiBlcnIgPT09ICdzdHJpbmcnIHx8IGVyciBpbnN0YW5jZW9mIFN0cmluZykge1xuICAgIHJldHVybiBlcnIgYXMgc3RyaW5nO1xuICB9IGVsc2UgaWYgKCckdGhyb3duSnNFcnJvcicgaW4gZXJyKSB7XG4gICAgcmV0dXJuIGVycm9yVG9Db25zb2xlKGVyclsnJHRocm93bkpzRXJyb3InXSk7XG4gIH0gZWxzZSBpZiAoZXJyIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICByZXR1cm4gKGVyciBhcyBFcnJvcikuc3RhY2sgPz8gKGVyciBhcyBFcnJvcikubWVzc2FnZTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gZXJyLnRvU3RyaW5nKCk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlY3RUb0NvbnNvbGUocmVjdDogREcuUmVjdCk6IHN0cmluZyB7XG4gIHJldHVybiBgKHg9JHtyZWN0Lnh9LCB5PSR7cmVjdC55fSwgdz0ke3JlY3Qud2lkdGh9LCBoPSR7cmVjdC5oZWlnaHR9KWA7XG59XG4iXX0=
1665
-
1666
- /***/ }),
1667
-
1668
- /***/ "./src/cell-renderer.ts":
1669
- /*!******************************!*\
1670
- !*** ./src/cell-renderer.ts ***!
1671
- \******************************/
1672
- /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
1673
-
1674
- __webpack_require__.r(__webpack_exports__);
1675
- /* harmony export */ __webpack_require__.d(__webpack_exports__, {
1676
- /* harmony export */ "HelmCellRenderer": () => (/* binding */ HelmCellRenderer)
1677
- /* harmony export */ });
1678
- /* harmony import */ var datagrok_api_ui__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! datagrok-api/ui */ "datagrok-api/ui");
1679
- /* harmony import */ var datagrok_api_ui__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(datagrok_api_ui__WEBPACK_IMPORTED_MODULE_0__);
1680
- /* harmony import */ var datagrok_api_dg__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! datagrok-api/dg */ "datagrok-api/dg");
1681
- /* harmony import */ var datagrok_api_dg__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(datagrok_api_dg__WEBPACK_IMPORTED_MODULE_1__);
1682
- /* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./utils */ "./src/utils.ts");
1683
- /* harmony import */ var _datagrok_libraries_bio_src_utils_cell_renderer__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @datagrok-libraries/bio/src/utils/cell-renderer */ "./node_modules/@datagrok-libraries/bio/src/utils/cell-renderer.js");
1684
- /* harmony import */ var _datagrok_libraries_utils_src_to_console__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @datagrok-libraries/utils/src/to-console */ "./node_modules/@datagrok-libraries/utils/src/to-console.js");
1685
-
1686
-
1687
-
1688
-
1689
-
1690
- class HelmCellRenderer extends datagrok_api_dg__WEBPACK_IMPORTED_MODULE_1__.GridCellRenderer {
1691
- get name() { return 'helm'; }
1692
- get cellType() { return 'helm'; }
1693
- get defaultWidth() { return 400; }
1694
- get defaultHeight() { return 100; }
1695
- onMouseMove(gridCell, e) {
1696
- var _a, _b, _c;
1697
- try {
1698
- const maxLengthWordsSum = gridCell.cell.column.temp['helm-sum-maxLengthWords'];
1699
- const maxIndex = Object.values(gridCell.cell.column.temp['helm-maxLengthWords']).length - 1;
1700
- const argsX = e.offsetX - gridCell.gridColumn.left + (gridCell.gridColumn.left - gridCell.bounds.x);
1701
- let left = 0;
1702
- let right = maxIndex;
1703
- let found = false;
1704
- maxLengthWordsSum[maxIndex + 1] = argsX + 1;
1705
- let mid = 0;
1706
- if (argsX > maxLengthWordsSum[0]) {
1707
- while (!found) {
1708
- mid = Math.floor((right + left) / 2);
1709
- if (argsX >= maxLengthWordsSum[mid] && argsX <= maxLengthWordsSum[mid + 1]) {
1710
- left = mid;
1711
- found = true;
1712
- }
1713
- else if (argsX < maxLengthWordsSum[mid]) {
1714
- right = mid - 1;
1715
- }
1716
- else if (argsX > maxLengthWordsSum[mid + 1]) {
1717
- left = mid + 1;
1718
- }
1719
- if (left == right) {
1720
- found = true;
1721
- }
1722
- }
1723
- }
1724
- left = (argsX >= maxLengthWordsSum[left]) ? left + 1 : left;
1725
- const monomers = (0,_utils__WEBPACK_IMPORTED_MODULE_2__.findMonomers)(gridCell.cell.value);
1726
- let s = (_a = gridCell.cell.value) !== null && _a !== void 0 ? _a : '';
1727
- let subParts = (0,_utils__WEBPACK_IMPORTED_MODULE_2__.parseHelm)(s);
1728
- let allParts = (0,_utils__WEBPACK_IMPORTED_MODULE_2__.getParts)(subParts, s);
1729
- let tooltipMessage = [];
1730
- for (let i = 0; i < allParts.length; ++i) {
1731
- if (monomers.has(allParts[i]))
1732
- tooltipMessage[i] = datagrok_api_ui__WEBPACK_IMPORTED_MODULE_0__.divV([
1733
- datagrok_api_ui__WEBPACK_IMPORTED_MODULE_0__.divText(`Monomer ${allParts[i]} not found.`),
1734
- datagrok_api_ui__WEBPACK_IMPORTED_MODULE_0__.divText('Open the Context Panel, then expand Manage Libraries')
1735
- ]);
1736
- }
1737
- ((((_c = (_b = tooltipMessage[left]) === null || _b === void 0 ? void 0 : _b.childNodes.length) !== null && _c !== void 0 ? _c : 0) > 0))
1738
- ? datagrok_api_ui__WEBPACK_IMPORTED_MODULE_0__.tooltip.show(datagrok_api_ui__WEBPACK_IMPORTED_MODULE_0__.div(tooltipMessage[left]), e.x + 16, e.y + 16)
1739
- : datagrok_api_ui__WEBPACK_IMPORTED_MODULE_0__.tooltip.hide();
1740
- }
1741
- catch (err) {
1742
- const errMsg = (0,_datagrok_libraries_utils_src_to_console__WEBPACK_IMPORTED_MODULE_4__.errorToConsole)(err);
1743
- console.error('Helm: HelmCellRenderer.onMouseMove() error:\n' + errMsg);
1744
- }
1745
- }
1746
- render(g, x, y, w, h, gridCell, cellStyle) {
1747
- var _a;
1748
- const grid = gridCell.gridRow !== -1 ? gridCell.grid : undefined;
1749
- const undefinedColor = 'rgb(100,100,100)';
1750
- const grayColor = '#808080';
1751
- const monomers = (0,_utils__WEBPACK_IMPORTED_MODULE_2__.findMonomers)(gridCell.cell.value);
1752
- let s = (_a = gridCell.cell.value) !== null && _a !== void 0 ? _a : '';
1753
- let subParts = (0,_utils__WEBPACK_IMPORTED_MODULE_2__.parseHelm)(s);
1754
- if (monomers.size == 0) {
1755
- const host = datagrok_api_ui__WEBPACK_IMPORTED_MODULE_0__.div([], { style: { width: `${w}px`, height: `${h}px` } });
1756
- host.setAttribute('dataformat', 'helm');
1757
- host.setAttribute('data', gridCell.cell.value);
1758
- gridCell.element = host;
1759
- //@ts-ignore
1760
- const canvas = new JSDraw2.Editor(host, { width: w, height: h, skin: 'w8', viewonly: true });
1761
- return;
1762
- }
1763
- if (monomers.size > 0) {
1764
- w = grid ? Math.min(grid.canvas.width - x, w) : g.canvas.width - x;
1765
- g.save();
1766
- g.beginPath();
1767
- g.rect(x, y, w, h);
1768
- g.clip();
1769
- g.font = '12px monospace';
1770
- g.textBaseline = 'top';
1771
- let x1 = x;
1772
- let maxLengthWords = {};
1773
- let maxLengthWordSum = {};
1774
- let allParts = (0,_utils__WEBPACK_IMPORTED_MODULE_2__.getParts)(subParts, s);
1775
- for (let i = 0; i < allParts.length; ++i) {
1776
- maxLengthWords[i] = allParts[i].length * 7;
1777
- let color = monomers.has(allParts[i]) ? 'red' : grayColor;
1778
- g.fillStyle = undefinedColor;
1779
- x1 = (0,_datagrok_libraries_bio_src_utils_cell_renderer__WEBPACK_IMPORTED_MODULE_3__.printLeftOrCentered)(x1, y, w, h, g, allParts[i], color, 0, true, 1.0);
1780
- }
1781
- maxLengthWordSum[0] = maxLengthWords[0];
1782
- for (let i = 1; i < allParts.length; i++) {
1783
- maxLengthWordSum[i] = maxLengthWordSum[i - 1] + maxLengthWords[i];
1784
- }
1785
- gridCell.cell.column.temp = {
1786
- 'helm-sum-maxLengthWords': maxLengthWordSum,
1787
- 'helm-maxLengthWords': maxLengthWords
1788
- };
1789
- g.restore();
1790
- return;
1791
- }
1792
- }
1793
- }
1794
-
1795
-
1796
- /***/ }),
1797
-
1798
- /***/ "./src/constants.ts":
1799
- /*!**************************!*\
1800
- !*** ./src/constants.ts ***!
1801
- \**************************/
1802
- /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
1803
-
1804
- __webpack_require__.r(__webpack_exports__);
1805
- /* harmony export */ __webpack_require__.d(__webpack_exports__, {
1806
- /* harmony export */ "MONOMER_SYMBOL": () => (/* binding */ MONOMER_SYMBOL),
1807
- /* harmony export */ "RGROUPS": () => (/* binding */ RGROUPS),
1808
- /* harmony export */ "RGROUP_ALTER_ID": () => (/* binding */ RGROUP_ALTER_ID),
1809
- /* harmony export */ "RGROUP_CAP_GROUP_NAME": () => (/* binding */ RGROUP_CAP_GROUP_NAME),
1810
- /* harmony export */ "RGROUP_CAP_GROUP_SMILES": () => (/* binding */ RGROUP_CAP_GROUP_SMILES),
1811
- /* harmony export */ "RGROUP_LABEL": () => (/* binding */ RGROUP_LABEL),
1812
- /* harmony export */ "SDF_MONOMER_NAME": () => (/* binding */ SDF_MONOMER_NAME),
1813
- /* harmony export */ "SMILES": () => (/* binding */ SMILES),
1814
- /* harmony export */ "jsonSdfMonomerLibDict": () => (/* binding */ jsonSdfMonomerLibDict)
1815
- /* harmony export */ });
1816
- const jsonSdfMonomerLibDict = {
1817
- "monomerType": null,
1818
- "smiles": null,
1819
- "name": "MonomerName",
1820
- "author": null,
1821
- "molfile": "molecule",
1822
- "naturalAnalog": "MonomerNaturalAnalogCode",
1823
- "rgroups": "MonomerCaps",
1824
- "createDate": null,
1825
- "id": null,
1826
- "polymerType": "MonomerType",
1827
- "symbol": "MonomerCode"
1828
- };
1829
- const SMILES = 'smiles';
1830
- const RGROUPS = "rgroups";
1831
- const MONOMER_SYMBOL = "symbol";
1832
- const RGROUP_CAP_GROUP_SMILES = "capGroupSmiles";
1833
- const RGROUP_ALTER_ID = "alternateId";
1834
- const RGROUP_CAP_GROUP_NAME = "capGroupName";
1835
- const RGROUP_LABEL = "label";
1836
- const SDF_MONOMER_NAME = "MonomerName";
1837
-
1838
-
1839
- /***/ }),
1840
-
1841
- /***/ "./src/helm-web-editor.ts":
1842
- /*!********************************!*\
1843
- !*** ./src/helm-web-editor.ts ***!
1844
- \********************************/
1845
- /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
1846
-
1847
- __webpack_require__.r(__webpack_exports__);
1848
- /* harmony export */ __webpack_require__.d(__webpack_exports__, {
1849
- /* harmony export */ "HelmWebEditor": () => (/* binding */ HelmWebEditor)
1850
- /* harmony export */ });
1851
- /* harmony import */ var datagrok_api_ui__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! datagrok-api/ui */ "datagrok-api/ui");
1852
- /* harmony import */ var datagrok_api_ui__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(datagrok_api_ui__WEBPACK_IMPORTED_MODULE_0__);
1853
-
1854
- class HelmWebEditor {
1855
- constructor() {
1856
- this.w = 200;
1857
- this.h = 100;
1858
- this.host = datagrok_api_ui__WEBPACK_IMPORTED_MODULE_0__.div([], { style: { width: `${this.w}px`, height: `${this.h}px` } });
1859
- this.editor = new JSDraw2.Editor(this.host, { width: this.w, height: this.h, viewonly: true });
1860
- }
1861
- resizeEditor(w, h) {
1862
- this.editor.setSize(w, h);
1863
- }
1864
- createWebEditor(value) {
1865
- const editorView = datagrok_api_ui__WEBPACK_IMPORTED_MODULE_0__.div();
1866
- org.helm.webeditor.MolViewer.molscale = 0.8;
1867
- const webEditor = new scil.helm.App(editorView, {
1868
- showabout: false,
1869
- mexfontsize: '90%',
1870
- mexrnapinontab: true,
1871
- topmargin: 20,
1872
- mexmonomerstab: true,
1873
- sequenceviewonly: false,
1874
- mexfavoritefirst: true,
1875
- mexfilter: true
1876
- });
1877
- const sizes = webEditor.calculateSizes();
1878
- webEditor.canvas.resize(sizes.rightwidth - 100, sizes.topheight - 210);
1879
- let s = { width: sizes.rightwidth - 100 + 'px', height: sizes.bottomheight + 'px' };
1880
- //@ts-ignore
1881
- scil.apply(webEditor.sequence.style, s);
1882
- //@ts-ignore
1883
- scil.apply(webEditor.notation.style, s);
1884
- s = { width: sizes.rightwidth + 'px', height: (sizes.bottomheight + webEditor.toolbarheight) + 'px' };
1885
- //@ts-ignore
1886
- scil.apply(webEditor.properties.parent.style, s);
1887
- webEditor.structureview.resize(sizes.rightwidth, sizes.bottomheight + webEditor.toolbarheight);
1888
- webEditor.mex.resize(sizes.topheight - 80);
1889
- setTimeout(function () {
1890
- webEditor.canvas.helm.setSequence(value, 'HELM');
1891
- }, 200);
1892
- return { editorDiv: editorView, webEditor: webEditor };
1893
- }
1894
- }
1895
-
1896
-
1897
- /***/ }),
1898
-
1899
- /***/ "./src/utils.ts":
1900
- /*!**********************!*\
1901
- !*** ./src/utils.ts ***!
1902
- \**********************/
1903
- /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
1904
-
1905
- __webpack_require__.r(__webpack_exports__);
1906
- /* harmony export */ __webpack_require__.d(__webpack_exports__, {
1907
- /* harmony export */ "findMonomers": () => (/* binding */ findMonomers),
1908
- /* harmony export */ "getParts": () => (/* binding */ getParts),
1909
- /* harmony export */ "parseHelm": () => (/* binding */ parseHelm)
1910
- /* harmony export */ });
1911
- function getParts(subParts, s) {
1912
- let j = 0;
1913
- let allParts = [];
1914
- for (let k = 0; k < subParts.length; ++k) {
1915
- let indexOfMonomer = s.indexOf(subParts[k]);
1916
- let helmBeforeMonomer = s.slice(j, indexOfMonomer);
1917
- allParts.push(helmBeforeMonomer);
1918
- allParts.push(subParts[k]);
1919
- s = s.substring(indexOfMonomer + subParts[k].length);
1920
- }
1921
- allParts.push(s);
1922
- return allParts;
1923
- }
1924
- function parseHelm(s) {
1925
- var sections = split(s, '$');
1926
- s = sections[0];
1927
- var monomers = [];
1928
- //@ts-ignore
1929
- if (!scil.Utils.isNullOrEmpty(s)) {
1930
- var seqs = split(s, '|');
1931
- for (var i = 0; i < seqs.length; ++i) {
1932
- var e = detachAnnotation(seqs[i]);
1933
- s = e.str;
1934
- var p = s.indexOf('{');
1935
- s = s.substring(p + 1);
1936
- p = s.indexOf('}');
1937
- s = s.substring(0, p);
1938
- var ss = split(s, '.');
1939
- for (var monomer of ss) {
1940
- if (monomer.includes('(') && monomer.includes(')')) {
1941
- var elements = monomer.replace(/[()]/g, '').split('');
1942
- for (var el of elements) {
1943
- monomers.push(el);
1944
- }
1945
- }
1946
- else if (monomer.includes('[') && monomer.includes(']')) {
1947
- var element = monomer.match(/(?<=\[).*?(?=\])/g, '');
1948
- monomers.push(element[0]);
1949
- }
1950
- else {
1951
- monomers.push(monomer);
1952
- }
1953
- }
1954
- }
1955
- }
1956
- return monomers;
1957
- }
1958
- function findMonomers(helmString) {
1959
- //@ts-ignore
1960
- const types = Object.keys(org.helm.webeditor.monomerTypeList());
1961
- const monomers = [];
1962
- const monomer_names = [];
1963
- for (var i = 0; i < types.length; i++) {
1964
- //@ts-ignore
1965
- monomers.push(new scil.helm.Monomers.getMonomerSet(types[i]));
1966
- Object.keys(monomers[i]).forEach(k => {
1967
- monomer_names.push(monomers[i][k].id);
1968
- });
1969
- }
1970
- const split_string = parseHelm(helmString);
1971
- return new Set(split_string.filter(val => !monomer_names.includes(val)));
1972
- }
1973
- function split(s, sep) {
1974
- var ret = [];
1975
- var frag = '';
1976
- var parentheses = 0;
1977
- var bracket = 0;
1978
- var braces = 0;
1979
- var quote = 0;
1980
- for (var i = 0; i < s.length; ++i) {
1981
- var c = s.substring(i, i + 1);
1982
- if (c == sep && bracket == 0 && parentheses == 0 && braces == 0 && quote == 0) {
1983
- ret.push(frag);
1984
- frag = '';
1985
- }
1986
- else {
1987
- frag += c;
1988
- if (quote > 0) {
1989
- if (c == '\\' && i + 1 < s.length) {
1990
- ++i;
1991
- var c2 = s.substring(i, i + 1);
1992
- frag += c2;
1993
- c += c2;
1994
- }
1995
- }
1996
- if (c == '\"') {
1997
- if (!(i > 0 && s.substring(i - 1, i) == '\\'))
1998
- quote = quote == 0 ? 1 : 0;
1999
- }
2000
- else if (c == '[')
2001
- ++bracket;
2002
- else if (c == ']')
2003
- --bracket;
2004
- else if (c == '(')
2005
- ++parentheses;
2006
- else if (c == ')')
2007
- --parentheses;
2008
- else if (c == '{')
2009
- ++braces;
2010
- else if (c == '}')
2011
- --braces;
2012
- }
2013
- }
2014
- ret.push(frag);
2015
- return ret;
2016
- }
2017
- function detachAnnotation(s) {
2018
- var ret = _detachAppendix(s, '\"');
2019
- if (ret.tag != null)
2020
- return ret;
2021
- var r = _detachAppendix(s, '\'');
2022
- return { tag: ret.tag, repeat: r.tag, str: r.str };
2023
- }
2024
- function _detachAppendix(s, c) {
2025
- var tag = null;
2026
- //@ts-ignore
2027
- if (scil.Utils.endswith(s, c)) {
2028
- var p = s.length - 1;
2029
- while (p > 0) {
2030
- p = s.lastIndexOf(c, p - 1);
2031
- if (p <= 0 || s.substring(p - 1, p) != '\\')
2032
- break;
2033
- }
2034
- if (p > 0 && p < s.length - 1) {
2035
- tag = s.substring(p + 1, s.length - 1);
2036
- s = s.substring(0, p);
2037
- }
2038
- }
2039
- if (tag != null)
2040
- tag = tag.replace(new RegExp('\\' + c, 'g'), c);
2041
- return { tag: unescape(tag), str: s };
2042
- }
2043
- function unescape(s) {
2044
- //@ts-ignore
2045
- if (scil.Utils.isNullOrEmpty(s))
2046
- return s;
2047
- return s.replace(/[\\]./g, function (m) {
2048
- switch (m) {
2049
- case '\\r':
2050
- return '\r';
2051
- case '\\n':
2052
- return '\n';
2053
- case '\\t':
2054
- return '\t';
2055
- default:
2056
- return m.substring(1);
2057
- }
2058
- });
2059
- }
2060
-
2061
-
2062
- /***/ }),
2063
-
2064
- /***/ "datagrok-api/dg":
2065
- /*!*********************!*\
2066
- !*** external "DG" ***!
2067
- \*********************/
2068
- /***/ ((module) => {
2069
-
2070
- module.exports = DG;
2071
-
2072
- /***/ }),
2073
-
2074
- /***/ "datagrok-api/grok":
2075
- /*!***********************!*\
2076
- !*** external "grok" ***!
2077
- \***********************/
2078
- /***/ ((module) => {
2079
-
2080
- module.exports = grok;
2081
-
2082
- /***/ }),
2083
-
2084
- /***/ "datagrok-api/ui":
2085
- /*!*********************!*\
2086
- !*** external "ui" ***!
2087
- \*********************/
2088
- /***/ ((module) => {
2089
-
2090
- module.exports = ui;
2091
-
2092
- /***/ }),
2093
-
2094
- /***/ "wu":
2095
- /*!*********************!*\
2096
- !*** external "wu" ***!
2097
- \*********************/
2098
- /***/ ((module) => {
2099
-
2100
- module.exports = wu;
2101
-
2102
- /***/ })
2103
-
2104
- /******/ });
2105
- /************************************************************************/
2106
- /******/ // The module cache
2107
- /******/ var __webpack_module_cache__ = {};
2108
- /******/
2109
- /******/ // The require function
2110
- /******/ function __webpack_require__(moduleId) {
2111
- /******/ // Check if module is in cache
2112
- /******/ var cachedModule = __webpack_module_cache__[moduleId];
2113
- /******/ if (cachedModule !== undefined) {
2114
- /******/ return cachedModule.exports;
2115
- /******/ }
2116
- /******/ // Create a new module (and put it into the cache)
2117
- /******/ var module = __webpack_module_cache__[moduleId] = {
2118
- /******/ // no module.id needed
2119
- /******/ // no module.loaded needed
2120
- /******/ exports: {}
2121
- /******/ };
2122
- /******/
2123
- /******/ // Execute the module function
2124
- /******/ __webpack_modules__[moduleId](module, module.exports, __webpack_require__);
2125
- /******/
2126
- /******/ // Return the exports of the module
2127
- /******/ return module.exports;
2128
- /******/ }
2129
- /******/
2130
- /************************************************************************/
2131
- /******/ /* webpack/runtime/compat get default export */
2132
- /******/ (() => {
2133
- /******/ // getDefaultExport function for compatibility with non-harmony modules
2134
- /******/ __webpack_require__.n = (module) => {
2135
- /******/ var getter = module && module.__esModule ?
2136
- /******/ () => (module['default']) :
2137
- /******/ () => (module);
2138
- /******/ __webpack_require__.d(getter, { a: getter });
2139
- /******/ return getter;
2140
- /******/ };
2141
- /******/ })();
2142
- /******/
2143
- /******/ /* webpack/runtime/define property getters */
2144
- /******/ (() => {
2145
- /******/ // define getter functions for harmony exports
2146
- /******/ __webpack_require__.d = (exports, definition) => {
2147
- /******/ for(var key in definition) {
2148
- /******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {
2149
- /******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] });
2150
- /******/ }
2151
- /******/ }
2152
- /******/ };
2153
- /******/ })();
2154
- /******/
2155
- /******/ /* webpack/runtime/hasOwnProperty shorthand */
2156
- /******/ (() => {
2157
- /******/ __webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))
2158
- /******/ })();
2159
- /******/
2160
- /******/ /* webpack/runtime/make namespace object */
2161
- /******/ (() => {
2162
- /******/ // define __esModule on exports
2163
- /******/ __webpack_require__.r = (exports) => {
2164
- /******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
2165
- /******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
2166
- /******/ }
2167
- /******/ Object.defineProperty(exports, '__esModule', { value: true });
2168
- /******/ };
2169
- /******/ })();
2170
- /******/
2171
- /************************************************************************/
2172
- var __webpack_exports__ = {};
2173
- // This entry need to be wrapped in an IIFE because it need to be isolated against other modules in the chunk.
2174
- (() => {
2175
- /*!************************!*\
2176
- !*** ./src/package.ts ***!
2177
- \************************/
2178
- __webpack_require__.r(__webpack_exports__);
2179
- /* harmony export */ __webpack_require__.d(__webpack_exports__, {
2180
- /* harmony export */ "_package": () => (/* binding */ _package),
2181
- /* harmony export */ "editMoleculeCell": () => (/* binding */ editMoleculeCell),
2182
- /* harmony export */ "getMolfiles": () => (/* binding */ getMolfiles),
2183
- /* harmony export */ "helmCellRenderer": () => (/* binding */ helmCellRenderer),
2184
- /* harmony export */ "helmToFasta": () => (/* binding */ helmToFasta),
2185
- /* harmony export */ "helmToPeptide": () => (/* binding */ helmToPeptide),
2186
- /* harmony export */ "helmToRNA": () => (/* binding */ helmToRNA),
2187
- /* harmony export */ "helmToSmiles": () => (/* binding */ helmToSmiles),
2188
- /* harmony export */ "helmWebEditor": () => (/* binding */ helmWebEditor),
2189
- /* harmony export */ "initHelm": () => (/* binding */ initHelm),
2190
- /* harmony export */ "openEditor": () => (/* binding */ openEditor),
2191
- /* harmony export */ "propertiesPanel": () => (/* binding */ propertiesPanel)
2192
- /* harmony export */ });
2193
- /* harmony import */ var datagrok_api_grok__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! datagrok-api/grok */ "datagrok-api/grok");
2194
- /* harmony import */ var datagrok_api_grok__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(datagrok_api_grok__WEBPACK_IMPORTED_MODULE_0__);
2195
- /* harmony import */ var datagrok_api_ui__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! datagrok-api/ui */ "datagrok-api/ui");
2196
- /* harmony import */ var datagrok_api_ui__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(datagrok_api_ui__WEBPACK_IMPORTED_MODULE_1__);
2197
- /* harmony import */ var datagrok_api_dg__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! datagrok-api/dg */ "datagrok-api/dg");
2198
- /* harmony import */ var datagrok_api_dg__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(datagrok_api_dg__WEBPACK_IMPORTED_MODULE_2__);
2199
- /* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./constants */ "./src/constants.ts");
2200
- /* harmony import */ var _helm_web_editor__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./helm-web-editor */ "./src/helm-web-editor.ts");
2201
- /* harmony import */ var _cell_renderer__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./cell-renderer */ "./src/cell-renderer.ts");
2202
- /* harmony import */ var _datagrok_libraries_bio_src_utils_notation_converter__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @datagrok-libraries/bio/src/utils/notation-converter */ "./node_modules/@datagrok-libraries/bio/src/utils/notation-converter.js");
2203
- /* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./utils */ "./src/utils.ts");
2204
- /* harmony import */ var _datagrok_libraries_utils_src_to_console__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @datagrok-libraries/utils/src/to-console */ "./node_modules/@datagrok-libraries/utils/src/to-console.js");
2205
- var __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {
2206
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
2207
- return new (P || (P = Promise))(function (resolve, reject) {
2208
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
2209
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
2210
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
2211
- step((generator = generator.apply(thisArg, _arguments || [])).next());
2212
- });
2213
- };
2214
- /* Do not change these import lines to match external modules in webpack configuration */
2215
-
2216
-
2217
-
2218
-
2219
-
2220
-
2221
-
2222
-
2223
-
2224
- const _package = new datagrok_api_dg__WEBPACK_IMPORTED_MODULE_2__.Package();
2225
- let monomerLib = null;
2226
- //tags: init
2227
- function initHelm() {
2228
- return __awaiter(this, void 0, void 0, function* () {
2229
- return Promise.all([new Promise((resolve, reject) => {
2230
- // @ts-ignore
2231
- dojo.ready(function () { resolve(null); });
2232
- }), yield datagrok_api_grok__WEBPACK_IMPORTED_MODULE_0__.functions.call('Bio:getBioLib')]).then(([_, lib]) => {
2233
- monomerLib = lib;
2234
- rewriteLibraries(); // initHelm()
2235
- monomerLib.onChanged.subscribe((_) => {
2236
- try {
2237
- rewriteLibraries(); // initHelm()
2238
- const monTypeList = monomerLib.getTypes();
2239
- const msgStr = 'Monomer lib updated:<br />' + (monTypeList.length == 0 ? 'empty' : monTypeList.map((monType) => {
2240
- return `${monType} ${monomerLib.getMonomerNamesByType(monType).length}`;
2241
- }).join('<br />'));
2242
- datagrok_api_grok__WEBPACK_IMPORTED_MODULE_0__.shell.info(msgStr);
2243
- }
2244
- catch (err) {
2245
- const errMsg = (0,_datagrok_libraries_utils_src_to_console__WEBPACK_IMPORTED_MODULE_8__.errorToConsole)(err);
2246
- console.error('Helm: initHelm monomerLib.onChanged() error:\n' + errMsg);
2247
- // throw err; // Prevent disabling event handler
2248
- }
2249
- });
2250
- });
2251
- });
2252
- }
2253
- function rewriteLibraries() {
2254
- org.helm.webeditor.Monomers.clear();
2255
- monomerLib.getTypes().forEach((type) => {
2256
- const mms = monomerLib.getMonomerNamesByType(type);
2257
- mms.forEach((symbol) => {
2258
- let isBroken = false;
2259
- const monomer = monomerLib.getMonomer(type, symbol);
2260
- const webEditorMonomer = {
2261
- id: symbol,
2262
- m: monomer.molfile,
2263
- n: monomer.name,
2264
- na: monomer.naturalAnalog,
2265
- rs: monomer.rgroups.length,
2266
- type: monomer.polymerType,
2267
- mt: monomer.monomerType,
2268
- at: {}
2269
- };
2270
- if (monomer.rgroups.length > 0) {
2271
- webEditorMonomer.rs = monomer.rgroups.length;
2272
- const at = {};
2273
- monomer.rgroups.forEach(it => {
2274
- at[it[_constants__WEBPACK_IMPORTED_MODULE_3__.RGROUP_LABEL]] = it[_constants__WEBPACK_IMPORTED_MODULE_3__.RGROUP_CAP_GROUP_NAME];
2275
- });
2276
- webEditorMonomer.at = at;
2277
- }
2278
- else if (monomer.data[_constants__WEBPACK_IMPORTED_MODULE_3__.SMILES] != null) {
2279
- webEditorMonomer.rs = Object.keys(getRS(monomer.data[_constants__WEBPACK_IMPORTED_MODULE_3__.SMILES].toString())).length;
2280
- webEditorMonomer.at = getRS(monomer.data[_constants__WEBPACK_IMPORTED_MODULE_3__.SMILES].toString());
2281
- }
2282
- else {
2283
- isBroken = true;
2284
- }
2285
- if (!isBroken)
2286
- org.helm.webeditor.Monomers.addOneMonomer(webEditorMonomer);
2287
- });
2288
- });
2289
- // Obsolete
2290
- let grid = datagrok_api_grok__WEBPACK_IMPORTED_MODULE_0__.shell.tv.grid;
2291
- if (grid)
2292
- grid.invalidate();
2293
- }
2294
- //name: helmCellRenderer
2295
- //tags: cellRenderer
2296
- //meta.cellType: helm
2297
- //meta.columnTags: units=helm
2298
- //output: grid_cell_renderer result
2299
- function helmCellRenderer() {
2300
- return new _cell_renderer__WEBPACK_IMPORTED_MODULE_5__.HelmCellRenderer();
2301
- }
2302
- //tags: cellEditor
2303
- //description: Macromolecule
2304
- //input: grid_cell cell
2305
- function editMoleculeCell(cell) {
2306
- const monomers = (0,_utils__WEBPACK_IMPORTED_MODULE_7__.findMonomers)(cell.cell.value);
2307
- if (cell.gridColumn.column.tags[datagrok_api_dg__WEBPACK_IMPORTED_MODULE_2__.TAGS.UNITS] === 'helm')
2308
- if (monomers.size == 0)
2309
- webEditor(cell);
2310
- else
2311
- datagrok_api_grok__WEBPACK_IMPORTED_MODULE_0__.shell.warning(`Monomers ${Array.from(monomers).join(', ')} are absent!`);
2312
- }
2313
- //name: Open Helm Web Editor
2314
- //description: Adds editor
2315
- //meta.action: Open Helm Web Editor
2316
- //input: string mol { semType: Macromolecule }
2317
- function openEditor(mol) {
2318
- let df = datagrok_api_grok__WEBPACK_IMPORTED_MODULE_0__.shell.tv.grid.dataFrame;
2319
- let converter = new _datagrok_libraries_bio_src_utils_notation_converter__WEBPACK_IMPORTED_MODULE_6__.NotationConverter(df.columns.bySemType('Macromolecule'));
2320
- const resStr = converter.convertStringToHelm(mol, '/');
2321
- const monomers = (0,_utils__WEBPACK_IMPORTED_MODULE_7__.findMonomers)(resStr);
2322
- if (monomers.size == 0)
2323
- webEditor(undefined, resStr);
2324
- else
2325
- datagrok_api_grok__WEBPACK_IMPORTED_MODULE_0__.shell.warning(`Monomers ${Array.from(monomers).join(', ')} are absent!`);
2326
- }
2327
- //name: Properties
2328
- //tags: panel, widgets
2329
- //input: string helmString {semType: Macromolecule}
2330
- //output: widget result
2331
- function propertiesPanel(helmString) {
2332
- return __awaiter(this, void 0, void 0, function* () {
2333
- let grid = datagrok_api_grok__WEBPACK_IMPORTED_MODULE_0__.shell.tv.grid;
2334
- let parent = grid.root.parentElement;
2335
- const host = datagrok_api_ui__WEBPACK_IMPORTED_MODULE_1__.div([]);
2336
- parent.appendChild(host);
2337
- let editor = new JSDraw2.Editor(host, { viewonly: true });
2338
- host.style.width = '0px';
2339
- host.style.height = '0px';
2340
- editor.setHelm(helmString);
2341
- let formula = editor.getFormula(true);
2342
- let molWeight = Math.round(editor.getMolWeight() * 100) / 100;
2343
- let coef = Math.round(editor.getExtinctionCoefficient(true) * 100) / 100;
2344
- parent.lastChild.remove();
2345
- return new datagrok_api_dg__WEBPACK_IMPORTED_MODULE_2__.Widget(datagrok_api_ui__WEBPACK_IMPORTED_MODULE_1__.tableFromMap({
2346
- 'formula': formula.replace(/<sub>/g, '').replace(/<\/sub>/g, ''),
2347
- 'molecular weight': molWeight,
2348
- 'extinction coefficient': coef,
2349
- }));
2350
- });
2351
- }
2352
- function webEditor(cell, value) {
2353
- let view = datagrok_api_ui__WEBPACK_IMPORTED_MODULE_1__.div();
2354
- org.helm.webeditor.MolViewer.molscale = 0.8;
2355
- let app = new scil.helm.App(view, {
2356
- showabout: false,
2357
- mexfontsize: '90%',
2358
- mexrnapinontab: true,
2359
- topmargin: 20,
2360
- mexmonomerstab: true,
2361
- sequenceviewonly: false,
2362
- mexfavoritefirst: true,
2363
- mexfilter: true
2364
- });
2365
- var sizes = app.calculateSizes();
2366
- app.canvas.resize(sizes.rightwidth - 100, sizes.topheight - 210);
2367
- var s = { width: sizes.rightwidth - 100 + 'px', height: sizes.bottomheight + 'px' };
2368
- //@ts-ignore
2369
- scil.apply(app.sequence.style, s);
2370
- //@ts-ignore
2371
- scil.apply(app.notation.style, s);
2372
- s = { width: sizes.rightwidth + 'px', height: (sizes.bottomheight + app.toolbarheight) + 'px' };
2373
- //@ts-ignore
2374
- scil.apply(app.properties.parent.style, s);
2375
- app.structureview.resize(sizes.rightwidth, sizes.bottomheight + app.toolbarheight);
2376
- app.mex.resize(sizes.topheight - 80);
2377
- setTimeout(function () {
2378
- if (typeof cell !== 'undefined') {
2379
- app.canvas.helm.setSequence(cell.cell.value, 'HELM');
2380
- }
2381
- else {
2382
- app.canvas.helm.setSequence(value, 'HELM');
2383
- }
2384
- }, 200);
2385
- //@ts-ignore
2386
- datagrok_api_ui__WEBPACK_IMPORTED_MODULE_1__.dialog({ showHeader: false, showFooter: true })
2387
- .add(view)
2388
- .onOK(() => {
2389
- if (typeof cell !== 'undefined') {
2390
- cell.cell.value = app.canvas.getHelm(true).replace(/<\/span>/g, '').replace(/<span style='background:#bbf;'>/g, '');
2391
- }
2392
- }).show({ modal: true, fullScreen: true });
2393
- }
2394
- function accessServer(url, key) {
2395
- return __awaiter(this, void 0, void 0, function* () {
2396
- const params = {
2397
- method: 'GET',
2398
- headers: {
2399
- 'Accept': 'application/json',
2400
- }
2401
- };
2402
- const response = yield fetch(url, params);
2403
- const json = yield response.json();
2404
- return json[key];
2405
- });
2406
- }
2407
- //name: helmToFasta
2408
- //input: string helmString {semType: Macromolecule}
2409
- //output: string res
2410
- function helmToFasta(helmString) {
2411
- return __awaiter(this, void 0, void 0, function* () {
2412
- const url = `http://localhost:8081/WebService/service/Fasta/Produce/${helmString}`;
2413
- return yield accessServer(url, 'FastaFile');
2414
- });
2415
- }
2416
- //name: helmToRNA
2417
- //description: converts to rna analogue sequence
2418
- //input: string helmString {semType: Macromolecule}
2419
- //output: string res
2420
- function helmToRNA(helmString) {
2421
- return __awaiter(this, void 0, void 0, function* () {
2422
- const url = `http://localhost:8081/WebService/service/Fasta/Convert/RNA/${helmString}`;
2423
- return yield accessServer(url, 'Sequence');
2424
- });
2425
- }
2426
- //name: helmToPeptide
2427
- //description: converts to peptide analogue sequence
2428
- //input: string helmString {semType: Macromolecule}
2429
- //output: string res
2430
- function helmToPeptide(helmString) {
2431
- return __awaiter(this, void 0, void 0, function* () {
2432
- const url = `http://localhost:8081/WebService/service/Fasta/Convert/PEPTIDE/${helmString}`;
2433
- return yield accessServer(url, 'Sequence');
2434
- });
2435
- }
2436
- //name: helmToSmiles
2437
- //description: converts to smiles
2438
- //input: string helmString {semType: Macromolecule}
2439
- //output: string smiles {semType: Molecule}
2440
- function helmToSmiles(helmString) {
2441
- return __awaiter(this, void 0, void 0, function* () {
2442
- const url = `http://localhost:8081/WebService/service/SMILES/${helmString}`;
2443
- return yield accessServer(url, 'SMILES');
2444
- });
2445
- }
2446
- function getRS(smiles) {
2447
- const newS = smiles.match(/(?<=\[)[^\][]*(?=])/gm);
2448
- const res = {};
2449
- let el = '';
2450
- let digit;
2451
- for (let i = 0; i < newS.length; i++) {
2452
- if (newS[i] != null) {
2453
- if (/\d/.test(newS[i])) {
2454
- digit = newS[i][newS[i].length - 1];
2455
- newS[i] = newS[i].replace(/[0-9]/g, '');
2456
- for (let j = 0; j < newS[i].length; j++) {
2457
- if (newS[i][j] != ':')
2458
- el += newS[i][j];
2459
- }
2460
- res['R' + digit] = el;
2461
- el = '';
2462
- }
2463
- }
2464
- }
2465
- return res;
2466
- }
2467
- //name: getMolfiles
2468
- //input: column col {semType: Macromolecule}
2469
- //output: column res
2470
- function getMolfiles(col) {
2471
- let grid = datagrok_api_grok__WEBPACK_IMPORTED_MODULE_0__.shell.tv.grid;
2472
- let parent = grid.root.parentElement;
2473
- let res = datagrok_api_dg__WEBPACK_IMPORTED_MODULE_2__.Column.string('mols', col.length);
2474
- const host = datagrok_api_ui__WEBPACK_IMPORTED_MODULE_1__.div([]);
2475
- parent.appendChild(host);
2476
- let editor = new JSDraw2.Editor(host, { viewonly: true });
2477
- host.style.width = '0px';
2478
- host.style.height = '0px';
2479
- res.init((i) => {
2480
- editor.setHelm(col.get(i));
2481
- let mol = editor.getMolfile();
2482
- return mol;
2483
- });
2484
- parent.lastChild.remove();
2485
- return res;
2486
- }
2487
- //name: helmWebEditor
2488
- //output: object
2489
- function helmWebEditor() {
2490
- return new _helm_web_editor__WEBPACK_IMPORTED_MODULE_4__.HelmWebEditor();
2491
- }
2492
-
2493
- })();
2494
-
2495
- helm = __webpack_exports__;
2496
- /******/ })()
2497
- ;
2498
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,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QUFXO0FBQzdGO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLDRCQUE0QjtBQUM1QjtBQUNPO0FBQ1A7QUFDQSxzRkFBc0YsV0FBVztBQUNqRztBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSw0QkFBNEI7QUFDNUIseUJBQXlCO0FBQ2xCO0FBQ1A7QUFDQSx1RUFBdUUsV0FBVztBQUNsRjtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0IsaUJBQWlCO0FBQ3JDO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0NBQWdDLG9CQUFvQjtBQUNwRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCO0FBQ3JCO0FBQ087QUFDUCxlQUFlLDREQUFrQjtBQUNqQztBQUNBLGNBQWMsMERBQWdCO0FBQzlCLGlCQUFpQixnREFBTTtBQUN2QjtBQUNBLDRDQUE0QyxnQkFBZ0I7QUFDNUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQLGVBQWUsMkRBQWE7QUFDNUIiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9oZWxtLy4vbm9kZV9tb2R1bGVzL0BkYXRhZ3Jvay1saWJyYXJpZXMvYmlvL25vZGVfbW9kdWxlcy9AZGF0YWdyb2stbGlicmFyaWVzL3V0aWxzL3NyYy9yYW5kb20uanMiLCJ3ZWJwYWNrOi8vaGVsbS8uL25vZGVfbW9kdWxlcy9AZGF0YWdyb2stbGlicmFyaWVzL2Jpby9ub2RlX21vZHVsZXMvQGRhdGFncm9rLWxpYnJhcmllcy91dGlscy9zcmMvdHlwZS1kZWNsYXJhdGlvbnMuanMiLCJ3ZWJwYWNrOi8vaGVsbS8uL25vZGVfbW9kdWxlcy9AZGF0YWdyb2stbGlicmFyaWVzL2Jpby9ub2RlX21vZHVsZXMvQGRhdGFncm9rLWxpYnJhcmllcy91dGlscy9zcmMvdmVjdG9yLW9wZXJhdGlvbnMuanMiLCJ3ZWJwYWNrOi8vaGVsbS8uL25vZGVfbW9kdWxlcy9AZGF0YWdyb2stbGlicmFyaWVzL2Jpby9zcmMvYW1pbm9hY2lkcy5qcyIsIndlYnBhY2s6Ly9oZWxtLy4vbm9kZV9tb2R1bGVzL0BkYXRhZ3Jvay1saWJyYXJpZXMvYmlvL3NyYy9udWNsZW90aWRlcy5qcyIsIndlYnBhY2s6Ly9oZWxtLy4vbm9kZV9tb2R1bGVzL0BkYXRhZ3Jvay1saWJyYXJpZXMvYmlvL3NyYy9zZXEtcGFsZXR0ZXMuanMiLCJ3ZWJwYWNrOi8vaGVsbS8uL25vZGVfbW9kdWxlcy9AZGF0YWdyb2stbGlicmFyaWVzL2Jpby9zcmMvdW5rbm93bi5qcyIsIndlYnBhY2s6Ly9oZWxtLy4vbm9kZV9tb2R1bGVzL0BkYXRhZ3Jvay1saWJyYXJpZXMvYmlvL3NyYy91dGlscy9jZWxsLXJlbmRlcmVyLmpzIiwid2VicGFjazovL2hlbG0vLi9ub2RlX21vZHVsZXMvQGRhdGFncm9rLWxpYnJhcmllcy9iaW8vc3JjL3V0aWxzL21hY3JvbW9sZWN1bGUuanMiLCJ3ZWJwYWNrOi8vaGVsbS8uL25vZGVfbW9kdWxlcy9AZGF0YWdyb2stbGlicmFyaWVzL2Jpby9zcmMvdXRpbHMvbm90YXRpb24tY29udmVydGVyLmpzIiwid2VicGFjazovL2hlbG0vLi9ub2RlX21vZHVsZXMvQGRhdGFncm9rLWxpYnJhcmllcy9iaW8vc3JjL3V0aWxzL3VuaXRzLWhhbmRsZXIuanMiLCJ3ZWJwYWNrOi8vaGVsbS8uL25vZGVfbW9kdWxlcy9AZGF0YWdyb2stbGlicmFyaWVzL3V0aWxzL3NyYy90by1jb25zb2xlLmpzIiwid2VicGFjazovL2hlbG0vLi9zcmMvY2VsbC1yZW5kZXJlci50cyIsIndlYnBhY2s6Ly9oZWxtLy4vc3JjL2NvbnN0YW50cy50cyIsIndlYnBhY2s6Ly9oZWxtLy4vc3JjL2hlbG0td2ViLWVkaXRvci50cyIsIndlYnBhY2s6Ly9oZWxtLy4vc3JjL3V0aWxzLnRzIiwid2VicGFjazovL2hlbG0vZXh0ZXJuYWwgdmFyIFwiREdcIiIsIndlYnBhY2s6Ly9oZWxtL2V4dGVybmFsIHZhciBcImdyb2tcIiIsIndlYnBhY2s6Ly9oZWxtL2V4dGVybmFsIHZhciBcInVpXCIiLCJ3ZWJwYWNrOi8vaGVsbS9leHRlcm5hbCB2YXIgXCJ3dVwiIiwid2VicGFjazovL2hlbG0vd2VicGFjay9ib290c3RyYXAiLCJ3ZWJwYWNrOi8vaGVsbS93ZWJwYWNrL3J1bnRpbWUvY29tcGF0IGdldCBkZWZhdWx0IGV4cG9ydCIsIndlYnBhY2s6Ly9oZWxtL3dlYnBhY2svcnVudGltZS9kZWZpbmUgcHJvcGVydHkgZ2V0dGVycyIsIndlYnBhY2s6Ly9oZWxtL3dlYnBhY2svcnVudGltZS9oYXNPd25Qcm9wZXJ0eSBzaG9ydGhhbmQiLCJ3ZWJwYWNrOi8vaGVsbS93ZWJwYWNrL3J1bnRpbWUvbWFrZSBuYW1lc3BhY2Ugb2JqZWN0Iiwid2VicGFjazovL2hlbG0vLi9zcmMvcGFja2FnZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEdlbmVyYXRlcyBzaW5nbGUgcmFuZG9tIGZsb2F0IGZyb20gMCB0byByYW5nZS5cbiAqXG4gKiBAZXhwb3J0XG4gKiBAcGFyYW0ge251bWJlcn0gcmFuZ2UgTWF4IGdlbmVyYXRpbmcgdmFsdWUuXG4gKiBAcmV0dXJuIHtudW1iZXJ9IEEgcmFuZG9tIGZsb2F0IGdlbmVyYXRlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJhbmRvbUZsb2F0KHJhbmdlKSB7XG4gICAgcmV0dXJuIE1hdGgucmFuZG9tKCkgKiByYW5nZTtcbn1cbi8qKlxuICogR2VuZXJhdGVzIHNpbmdsZSByYW5kb20gaW50ZWdlciBmcm9tIDAgdG8gcmFuZ2UuXG4gKlxuICogQGV4cG9ydFxuICogQHBhcmFtIHtudW1iZXJ9IHJhbmdlIE1heCBnZW5lcmF0aW5nIHZhbHVlLlxuICogQHJldHVybiB7bnVtYmVyfSBBIHJhbmRvbSBpbnRlZ2VyIGdlbmVyYXRlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJhbmRvbUludChyYW5nZSkge1xuICAgIHJldHVybiBNYXRoLmZsb29yKHJhbmRvbUZsb2F0KHJhbmdlKSk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1kYXRhOmFwcGxpY2F0aW9uL2pzb247YmFzZTY0LGV5SjJaWEp6YVc5dUlqb3pMQ0ptYVd4bElqb2ljbUZ1Wkc5dExtcHpJaXdpYzI5MWNtTmxVbTl2ZENJNklpSXNJbk52ZFhKalpYTWlPbHNpY21GdVpHOXRMblJ6SWwwc0ltNWhiV1Z6SWpwYlhTd2liV0Z3Y0dsdVozTWlPaUpCUVVGQk96czdPenM3UjBGTlJ6dEJRVU5JTEUxQlFVMHNWVUZCVlN4WFFVRlhMRU5CUVVNc1MwRkJZVHRKUVVOMlF5eFBRVUZQTEVsQlFVa3NRMEZCUXl4TlFVRk5MRVZCUVVVc1IwRkJSeXhMUVVGTExFTkJRVU03UVVGREwwSXNRMEZCUXp0QlFVVkVPenM3T3pzN1IwRk5SenRCUVVOSUxFMUJRVTBzVlVGQlZTeFRRVUZUTEVOQlFVTXNTMEZCWVR0SlFVTnlReXhQUVVGUExFbEJRVWtzUTBGQlF5eExRVUZMTEVOQlFVTXNWMEZCVnl4RFFVRkRMRXRCUVVzc1EwRkJReXhEUVVGRExFTkJRVU03UVVGRGVFTXNRMEZCUXlJc0luTnZkWEpqWlhORGIyNTBaVzUwSWpwYklpOHFLbHh1SUNvZ1IyVnVaWEpoZEdWeklITnBibWRzWlNCeVlXNWtiMjBnWm14dllYUWdabkp2YlNBd0lIUnZJSEpoYm1kbExseHVJQ3BjYmlBcUlFQmxlSEJ2Y25SY2JpQXFJRUJ3WVhKaGJTQjdiblZ0WW1WeWZTQnlZVzVuWlNCTllYZ2daMlZ1WlhKaGRHbHVaeUIyWVd4MVpTNWNiaUFxSUVCeVpYUjFjbTRnZTI1MWJXSmxjbjBnUVNCeVlXNWtiMjBnWm14dllYUWdaMlZ1WlhKaGRHVmtMbHh1SUNvdlhHNWxlSEJ2Y25RZ1puVnVZM1JwYjI0Z2NtRnVaRzl0Um14dllYUW9jbUZ1WjJVNklHNTFiV0psY2lrNklHNTFiV0psY2lCN1hHNGdJSEpsZEhWeWJpQk5ZWFJvTG5KaGJtUnZiU2dwSUNvZ2NtRnVaMlU3WEc1OVhHNWNiaThxS2x4dUlDb2dSMlZ1WlhKaGRHVnpJSE5wYm1kc1pTQnlZVzVrYjIwZ2FXNTBaV2RsY2lCbWNtOXRJREFnZEc4Z2NtRnVaMlV1WEc0Z0tseHVJQ29nUUdWNGNHOXlkRnh1SUNvZ1FIQmhjbUZ0SUh0dWRXMWlaWEo5SUhKaGJtZGxJRTFoZUNCblpXNWxjbUYwYVc1bklIWmhiSFZsTGx4dUlDb2dRSEpsZEhWeWJpQjdiblZ0WW1WeWZTQkJJSEpoYm1SdmJTQnBiblJsWjJWeUlHZGxibVZ5WVhSbFpDNWNiaUFxTDF4dVpYaHdiM0owSUdaMWJtTjBhVzl1SUhKaGJtUnZiVWx1ZENoeVlXNW5aVG9nYm5WdFltVnlLVG9nYm5WdFltVnlJSHRjYmlBZ2NtVjBkWEp1SUUxaGRHZ3VabXh2YjNJb2NtRnVaRzl0Um14dllYUW9jbUZ1WjJVcEtUdGNibjFjYmlKZGZRPT0iLCIvKipcbiAqIERlbm90ZXMgYSB2ZWN0b3Igb2YgZmxvYXRpbmcgcG9pdCB2YWx1ZXMuXG4gKlxuICogQGV4cG9ydFxuICogQGNsYXNzIFZlY3RvclxuICogQGV4dGVuZHMge0Zsb2F0MzJBcnJheX1cbiAqL1xuZXhwb3J0IGNsYXNzIFZlY3RvciBleHRlbmRzIEZsb2F0MzJBcnJheSB7XG59XG4vKipcbiAqIERlbm90ZXMgYSB0d28tZGltZW5zaW9uYWwgbWF0cml4LlxuICpcbiAqIEBleHBvcnRcbiAqIEBjbGFzcyBNYXRyaXhcbiAqIEBleHRlbmRzIHtBcnJheTxWZWN0b3I+fVxuICovXG5leHBvcnQgY2xhc3MgTWF0cml4IGV4dGVuZHMgQXJyYXkge1xufVxuLyoqXG4gKiBEZW5vdGVzIGNhcnRlc2lhbiBjb29yZGluYXRlcy5cbiAqXG4gKiBAZXhwb3J0XG4gKiBAY2xhc3MgQ29vcmRpbmF0ZXNcbiAqIEBleHRlbmRzIHtNYXRyaXh9XG4gKi9cbmV4cG9ydCBjbGFzcyBDb29yZGluYXRlcyBleHRlbmRzIE1hdHJpeCB7XG59XG4vKipcbiAqIERlbm90ZXMgYW4gYXJyYXkgb2YgYXJiaXRyYXJ5LXR5cGVkIHZlY3RvcnMuXG4gKlxuICogQGV4cG9ydFxuICogQGNsYXNzIFZlY3RvcnNcbiAqIEBleHRlbmRzIHtBcnJheTxhbnk+fVxuICovXG5leHBvcnQgY2xhc3MgVmVjdG9ycyBleHRlbmRzIEFycmF5IHtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWRhdGE6YXBwbGljYXRpb24vanNvbjtiYXNlNjQsZXlKMlpYSnphVzl1SWpvekxDSm1hV3hsSWpvaWRIbHdaUzFrWldOc1lYSmhkR2x2Ym5NdWFuTWlMQ0p6YjNWeVkyVlNiMjkwSWpvaUlpd2ljMjkxY21ObGN5STZXeUowZVhCbExXUmxZMnhoY21GMGFXOXVjeTUwY3lKZExDSnVZVzFsY3lJNlcxMHNJbTFoY0hCcGJtZHpJam9pUVVGQlFUczdPenM3TzBkQlRVYzdRVUZEU0N4TlFVRk5MRTlCUVU4c1RVRkJUeXhUUVVGUkxGbEJRVms3UTBGQlJ6dEJRVVV6UXpzN096czdPMGRCVFVjN1FVRkRTQ3hOUVVGTkxFOUJRVThzVFVGQlR5eFRRVUZSTEV0QlFXRTdRMEZCUnp0QlFVVTFRenM3T3pzN08wZEJUVWM3UVVGRFNDeE5RVUZOTEU5QlFVOHNWMEZCV1N4VFFVRlJMRTFCUVUwN1EwRkJSenRCUVVVeFF6czdPenM3TzBkQlRVYzdRVUZEU0N4TlFVRk5MRTlCUVU4c1QwRkJVU3hUUVVGUkxFdEJRVlU3UTBGQlJ5SXNJbk52ZFhKalpYTkRiMjUwWlc1MElqcGJJaThxS2x4dUlDb2dSR1Z1YjNSbGN5QmhJSFpsWTNSdmNpQnZaaUJtYkc5aGRHbHVaeUJ3YjJsMElIWmhiSFZsY3k1Y2JpQXFYRzRnS2lCQVpYaHdiM0owWEc0Z0tpQkFZMnhoYzNNZ1ZtVmpkRzl5WEc0Z0tpQkFaWGgwWlc1a2N5QjdSbXh2WVhRek1rRnljbUY1ZlZ4dUlDb3ZYRzVsZUhCdmNuUWdZMnhoYzNNZ1ZtVmpkRzl5SUdWNGRHVnVaSE1nUm14dllYUXpNa0Z5Y21GNUlIdDlYRzVjYmk4cUtseHVJQ29nUkdWdWIzUmxjeUJoSUhSM2J5MWthVzFsYm5OcGIyNWhiQ0J0WVhSeWFYZ3VYRzRnS2x4dUlDb2dRR1Y0Y0c5eWRGeHVJQ29nUUdOc1lYTnpJRTFoZEhKcGVGeHVJQ29nUUdWNGRHVnVaSE1nZTBGeWNtRjVQRlpsWTNSdmNqNTlYRzRnS2k5Y2JtVjRjRzl5ZENCamJHRnpjeUJOWVhSeWFYZ2daWGgwWlc1a2N5QkJjbkpoZVR4V1pXTjBiM0krSUh0OVhHNWNiaThxS2x4dUlDb2dSR1Z1YjNSbGN5QmpZWEowWlhOcFlXNGdZMjl2Y21ScGJtRjBaWE11WEc0Z0tseHVJQ29nUUdWNGNHOXlkRnh1SUNvZ1FHTnNZWE56SUVOdmIzSmthVzVoZEdWelhHNGdLaUJBWlhoMFpXNWtjeUI3VFdGMGNtbDRmVnh1SUNvdlhHNWxlSEJ2Y25RZ1kyeGhjM01nUTI5dmNtUnBibUYwWlhNZ1pYaDBaVzVrY3lCTllYUnlhWGdnZTMxY2JseHVMeW9xWEc0Z0tpQkVaVzV2ZEdWeklHRnVJR0Z5Y21GNUlHOW1JR0Z5WW1sMGNtRnllUzEwZVhCbFpDQjJaV04wYjNKekxseHVJQ3BjYmlBcUlFQmxlSEJ2Y25SY2JpQXFJRUJqYkdGemN5QldaV04wYjNKelhHNGdLaUJBWlhoMFpXNWtjeUI3UVhKeVlYazhZVzU1UG4xY2JpQXFMMXh1Wlhod2IzSjBJR05zWVhOeklGWmxZM1J2Y25NZ1pYaDBaVzVrY3lCQmNuSmhlVHhoYm5rK0lIdDlYRzVjYmk4cUtseHVJQ29nUkdWdWIzUmxjeUJoSUdScFkzUnBiMjVoY25rZ1kyOXVkR0ZwYm1sdVp5Qm1kVzVqZEdsdmJpQnZjSFJwYjI1ekxseHVJQ3BjYmlBcUlFQmxlSEJ2Y25SY2JpQXFJRUIwZVhCbElFOXdkR2x2Ym5OY2JpQXFMMXh1Wlhod2IzSjBJSFI1Y0dVZ1QzQjBhVzl1Y3lBOUlIdGJibUZ0WlRvZ2MzUnlhVzVuWFRvZ1lXNTVmVHRjYmx4dUx5b3FYRzRnS2lCRVpXNXZkR1Z6SUdOMWMzUnZiU0JrYVhOMFlXNWpaU0J0WlhSeWFXTWdZbVYwZDJWbGJpQjBhR1VnZEhkdklHZHBkbVZ1SUhabFkzUnZjbk11WEc0Z0tseHVJQ29nUUdWNGNHOXlkRnh1SUNvZ1FIUjVjR1VnUkdsemRHRnVZMlZOWlhSeWFXTmNiaUFxSUVCd1lYSmhiU0I3WVc1NWZTQjJNU0JVYUdVZ1ptbHljM1FnZG1WamRHOXlMbHh1SUNvZ1FIQmhjbUZ0SUh0aGJubDlJSFl5SUZSb1pTQnpaV052Ym1RZ2RtVmpkRzl5TGx4dUlDb2dRSEpsZEhWeWJpQjdiblZ0WW1WeWZTQkVhWE4wWVc1alpTQmlaWFIzWldWdUlIUm9aWE5sSUhSM2J5QjJaV04wYjNKekxseHVJQ292WEc1bGVIQnZjblFnZEhsd1pTQkVhWE4wWVc1alpVMWxkSEpwWXlBOUlDaDJNVG9nWVc1NUxDQjJNam9nWVc1NUtTQTlQaUFvYm5WdFltVnlLVHRjYmx4dUx5b3FYRzRnS2lCRVpXNXZkR1Z6SUdFZ2MybHRjR3hsSUhOMGNtbHVaeUIwYnlCemRISnBibWNnWkdsamRHbHZibUZ5ZVM1Y2JpQXFYRzRnS2lCQVpYaHdiM0owWEc0Z0tpQkFkSGx3WlNCVGRISnBibWRFYVdOMGFXOXVZWEo1WEc0Z0tpOWNibVY0Y0c5eWRDQjBlWEJsSUZOMGNtbHVaMFJwWTNScGIyNWhjbmtnUFNCN1cydGxlVG9nYzNSeWFXNW5YVG9nYzNSeWFXNW5mVHRjYmlKZGZRPT0iLCJpbXBvcnQgeyBWZWN0b3IgfSBmcm9tICcuL3R5cGUtZGVjbGFyYXRpb25zJztcbmltcG9ydCB7IHJhbmRvbUZsb2F0LCByYW5kb21JbnQgfSBmcm9tICcuL3JhbmRvbSc7XG4vKipcbiAqIEFzc2VydHMgYSBjb25kaXRpb24gYnkgdGhyb3dpbmcgYW4gRXJyb3IuXG4gKlxuICogQGV4cG9ydFxuICogQHBhcmFtIHtib29sZWFufSBbY29uZGl0aW9uPWZhbHNlXSBDb25kaXRpb24gdG8gYXNzZXJ0LlxuICogQHBhcmFtIHtzdHJpbmd9IFttZXNzYWdlPSdBc3NlcnRpb24gZXJyb3IuJ10gTWVzc2FnZSB0byBvdXRwdXQuXG4gKiBAdGhyb3dzIHtFcnJvcn1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydChjb25kaXRpb24gPSBmYWxzZSwgbWVzc2FnZSA9ICdBc3NlcnRpb24gZXJyb3IuJykge1xuICAgIGlmICghY29uZGl0aW9uKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IobWVzc2FnZSk7XG59XG4vKipcbiAqIENyZWF0ZXMgbmV3IHR3by1kaW1lbnNpb25hbCBhcnJheSBhbmQgZmlsbHMgaXQgd2l0aCB0aGUgdmFsdWUgZ2l2ZW4uXG4gKlxuICogQHBhcmFtIHtudW1iZXJ9IGRpbWVuc2lvbjEgVGhlIGZpcnN0IGRpbWVuc2lvbiBvZiB0aGUgY29vcmRpbmF0ZXMgKG51bWJlciBvZiByb3dzKS5cbiAqIEBwYXJhbSB7bnVtYmVyfSBkaW1lbnNpb24yIFRoZSBzZWNvbmQgZGltZW5zaW9uIG9mIHRoZSBjb29yZGluYXRlcyAobnVtYmVyIG9mIGNvbHVtbnMpLlxuICogQHBhcmFtIHtudW1iZXJ9IFtmaWxsPTBdIEEgdmFsdWUgdG8gZmlsbCB0aGUgY29vcmRpbmF0ZXMgd2l0aC5cbiAqIEByZXR1cm4ge0Nvb3JkaW5hdGVzfSBBIHR3by1kaW1lbnNpb25hbCBmaWxsZWQgd2l0aCB0aGUgdmFsdWUgZ2l2ZW4uXG4gKiBAdG9kbyBNaWdodCBiZSBzbG93IHNpbmNlIHVzZWQgQXJyYXkubWFwLiBQcm9iYWJseSBuZWVkcyBwZXJmb3JtYW5jZSByZXZpc2lvbi5cbiAqL1xuZnVuY3Rpb24gaW5pdENvb3JkaW5hdGVzKGRpbWVuc2lvbjEsIGRpbWVuc2lvbjIsIGZpbGwgPSAwKSB7XG4gICAgcmV0dXJuIG5ldyBBcnJheShkaW1lbnNpb24xKS5maWxsKGZpbGwpLm1hcCgoKSA9PiAobmV3IFZlY3RvcihkaW1lbnNpb24yKS5maWxsKGZpbGwpKSk7XG59XG4vKipcbiAqIFRyYW5zcG9zZSBtYXRyaXguXG4gKlxuICogQGV4cG9ydFxuICogQHBhcmFtIHtNYXRyaXh9IG1hdHJpeCBUaGUgbWF0cml4IHRvIGJlIHRyYW5zcG9zZWQuXG4gKiBAcmV0dXJuIHtNYXRyaXh9IFRyYW5zcG9zZWQgbWF0cml4LlxuICogQHRvZG8gTWlnaHQgYmUgc2xvdyBzaW5jZSB1c2VkIEFycmF5Lm1hcC4gUHJvYmFibHkgbmVlZHMgcGVyZm9ybWFuY2UgcmV2aXNpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0cmFuc3Bvc2VNYXRyaXgobWF0cml4KSB7XG4gICAgcmV0dXJuIG5ldyBBcnJheShtYXRyaXhbMF0ubGVuZ3RoKS5maWxsKDApXG4gICAgICAgIC5tYXAoKF8sIGkpID0+IChuZXcgVmVjdG9yKG1hdHJpeC5sZW5ndGgpLmZpbGwoMCkubWFwKChfLCBqKSA9PiAobWF0cml4W2pdW2ldKSkpKTtcbn1cbi8qKlxuICogQWRkcyB0d28gdmVjdG9ycyB3aXRoIHRoZSBzZWNvbmQgb25lIHRvIGJlIG11bHRpcGxpZWQgYnkgdGhlIGdpdmVuIHJhdGlvLlxuICpcbiAqIEBleHBvcnRcbiAqIEBwYXJhbSB7VmVjdG9yfSBwIFRoZSBmaXJzdCB2ZWN0b3IgdG8gYWRkLlxuICogQHBhcmFtIHtWZWN0b3J9IHEgVGhlIHNlY29uZCB2ZWN0b3IgdG8gYWRkLlxuICogQHBhcmFtIHtudW1iZXJ9IFttdWx0aXBsaWVyPTFdIEEgbXVsdGlwbGllciB0byBiZSB1c2VkIGJlZm9yZSB0aGUgc2Vjb25kIHZlY3RvciBpcyBhZGRlZC5cbiAqIEByZXR1cm4ge1ZlY3Rvcn0gTmV3IHZlY3RvciBjb250YWluZWQgdGhlIHJlc3VsdCBvZiBvcGVyYXRpb24gcCttdWx0aXBsaWVyKnEuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB2ZWN0b3JBZGQocCwgcSwgbXVsdGlwbGllciA9IDEpIHtcbiAgICBjb25zdCBuSXRlbXMgPSBwLmxlbmd0aDtcbiAgICBhc3NlcnQobkl0ZW1zID09IHEubGVuZ3RoLCAnVmVjdG9yIGxlbmd0aHMgZG8gbm90IG1hdGNoLicpO1xuICAgIGNvbnN0IHRvdGFsID0gbmV3IFZlY3RvcihuSXRlbXMpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcC5sZW5ndGg7ICsraSlcbiAgICAgICAgdG90YWxbaV0gPSBwW2ldICsgbXVsdGlwbGllciAqIHFbaV07XG4gICAgcmV0dXJuIHRvdGFsO1xufVxuLyoqXG4gKiBTdW1zIHRoZSB2ZWN0b3IncyBpdGVtcy5cbiAqXG4gKiBAcGFyYW0ge1ZlY3Rvcn0gdiBUaGUgdmVjdG9yIHRvIGJlIHN1bW1lZC5cbiAqIEByZXR1cm4ge251bWJlcn0gVGhlIHZlY3RvcidzIGl0ZW1zIHN1bS5cbiAqL1xuZnVuY3Rpb24gaXRlbXNTdW0odikge1xuICAgIGxldCB0b3RhbCA9IDA7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB2Lmxlbmd0aDsgKytpKVxuICAgICAgICB0b3RhbCArPSB2W2ldO1xuICAgIHJldHVybiB0b3RhbDtcbn1cbi8qKlxuICogU3VxYXJlcyB0aGUgdmVjdG9yJ3MgaXRlbXMuXG4gKlxuICogQHBhcmFtIHtWZWN0b3J9IHYgVGhlIHZlY3RvciB0byBzcXVhcmUuXG4gKiBAcmV0dXJuIHtWZWN0b3J9IEEgbmV3IHZlY3RvciBjb250YWluaW5nIHRoZSBvcmlnaW5hbCdzIGl0ZW1zIHNxdWFyZWQuXG4gKi9cbmZ1bmN0aW9uIHZlY3RvclNxdWFyZSh2KSB7XG4gICAgY29uc3Qgbkl0ZW1zID0gdi5sZW5ndGg7XG4gICAgY29uc3QgdG90YWwgPSBuZXcgVmVjdG9yKG5JdGVtcyk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB2Lmxlbmd0aDsgKytpKVxuICAgICAgICB0b3RhbFtpXSA9IHZbaV0gKiB2W2ldO1xuICAgIHJldHVybiB0b3RhbDtcbn1cbmV4cG9ydCBmdW5jdGlvbiB2ZWN0b3JMZW5ndGgodikge1xuICAgIGxldCBzcXJTdW0gPSAwO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdi5sZW5ndGg7IGkrKylcbiAgICAgICAgc3FyU3VtICs9IHZbaV0gKiB2W2ldO1xuICAgIHJldHVybiBNYXRoLnNxcnQoc3FyU3VtKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiB2ZWN0b3JEb3RQcm9kdWN0KHYxLCB2Mikge1xuICAgIGlmICh2MS5sZW5ndGggIT0gdjIubGVuZ3RoKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoZSBkaW1lbnNpb25hbGl0eSBvZiB0aGUgdmVjdG9ycyBtdXN0IG1hdGNoJyk7XG4gICAgbGV0IHByb2QgPSAwO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdjEubGVuZ3RoOyBpKyspXG4gICAgICAgIHByb2QgKz0gdjFbaV0gKiB2MltpXTtcbiAgICByZXR1cm4gcHJvZDtcbn1cbi8qKlxuICogQ3JlYXRlcyBhIG1hdHJpeCBmaWxsZWQgd2l0aCByYW5kb20gZmxvYXRpbmcgcG9pbnQgdmFsdWVzLlxuICpcbiAqIEBleHBvcnRcbiAqIEBwYXJhbSB7bnVtYmVyfSBkaW1lbnNpb24xIFRoZSBmaXJzdCBkaW1lbnNpb24gb2YgdGhlIG1hdHJpeC5cbiAqIEBwYXJhbSB7bnVtYmVyfSBkaW1lbnNpb24yIFRoZSBzZWNvbmQgZGltZW5zaW9uIG9mIHRoZSBtYXRyaXguXG4gKiBAcGFyYW0ge251bWJlcn0gW3NjYWxlPTEuXSBNYXggdmFsdWUgZ2l2ZW4gYnkgcmFuZG9tIGdlbmVyYXRvci5cbiAqIEByZXR1cm4ge01hdHJpeH0gQSBuZXcgbWF0cml4IGZpbGxlZCB3aXRoIHJhbmRvbSBmbG9hdGluZyBwb2ludCAgdmFsdWVzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZmlsbFJhbmRvbU1hdHJpeChkaW1lbnNpb24xLCBkaW1lbnNpb24yLCBzY2FsZSA9IDEuKSB7XG4gICAgY29uc3QgbWF0cml4ID0gaW5pdENvb3JkaW5hdGVzKGRpbWVuc2lvbjEsIGRpbWVuc2lvbjIpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZGltZW5zaW9uMTsgKytpKSB7XG4gICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgZGltZW5zaW9uMjsgKytqKVxuICAgICAgICAgICAgbWF0cml4W2ldW2pdID0gcmFuZG9tRmxvYXQoc2NhbGUpO1xuICAgIH1cbiAgICByZXR1cm4gbWF0cml4O1xufVxuLyoqXG4gKiBDYWxjdWxhdGVzIEV1Y2xpZGVhbiBkaXN0YW5jZSBiZXR3ZWVuIHR3byB2ZWN0b3JzLlxuICpcbiAqIEBleHBvcnRcbiAqIEBwYXJhbSB7VmVjdG9yfSBwIFRoZSBmaXJzdCB2ZWN0b3IuXG4gKiBAcGFyYW0ge1ZlY3Rvcn0gcSBUaGUgc2Vjb25kIHZlY3Rvci5cbiAqIEByZXR1cm4ge251bWJlcn0gRXVjbGlkZWFuIGRpc3RhbmNlIGJldHdlZW4gdGhlIGdpdmVuIHZlY3RvcnMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjYWxjdWxhdGVFdWNsaWRlYW5EaXN0YW5jZShwLCBxKSB7XG4gICAgY29uc3QgZGlmZiA9IHZlY3RvckFkZChwLCBxLCAtMSk7XG4gICAgY29uc3Qgc3FkaWZmID0gdmVjdG9yU3F1YXJlKGRpZmYpO1xuICAgIGNvbnN0IHNxZGlmZlN1bW0gPSBpdGVtc1N1bShzcWRpZmYpO1xuICAgIHJldHVybiBNYXRoLnNxcnQoc3FkaWZmU3VtbSk7XG59XG4vKipcbiAqIENyZWF0ZXMgYSBkaXN0YW5jZSBtYXRyaXggdXNpbmcgYSBjdXN0b20gZGlzdGFuY2UgZnVuY3Rpb24uXG4gKlxuICogQGV4cG9ydFxuICogQHBhcmFtIHtWZWN0b3JzfSBkYXRhIElucHV0IHZlY3RvcnMgdG8gY2FsY3VsYXRlIGRpc3RhbmNlcy5cbiAqIEBwYXJhbSB7RGlzdGFuY2VNZXRyaWN9IGRpc3RhbmNlIEN1c3RvbSBkaXN0YW5jZSBmdW5jdGlvbi5cbiAqIEByZXR1cm4ge01hdHJpeH0gQ2FsY3VsYXRlZCBjdXN0b20gZGlzdGFuY2UgbWF0cml4LlxuICovXG5leHBvcnQgZnVuY3Rpb24gY2FsY0Rpc3RhbmNlTWF0cml4KGRhdGEsIGRpc3RhbmNlKSB7XG4gICAgY29uc3Qgbkl0ZW1zID0gZGF0YS5sZW5ndGg7XG4gICAgY29uc3QgbWF0cml4ID0gaW5pdENvb3JkaW5hdGVzKG5JdGVtcywgbkl0ZW1zLCAwKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5JdGVtczsgKytpKSB7XG4gICAgICAgIGZvciAobGV0IGogPSBpICsgMTsgaiA8IG5JdGVtczsgKytqKSB7XG4gICAgICAgICAgICBjb25zdCBkID0gKGRhdGFbaV0gPT0gbnVsbCkgfHwgKGRhdGFbal0gPT0gbnVsbCkgPyAwIDogZGlzdGFuY2UoZGF0YVtpXSwgZGF0YVtqXSk7XG4gICAgICAgICAgICBtYXRyaXhbaV1bal0gPSBtYXRyaXhbal1baV0gPSBkO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBtYXRyaXg7XG59XG4vKiogR2VuZXJhdGVzIGFycmF5IGZyb20gYSByYW5nZSBbYmVnaW47IGVuZF0gb3IgW2JlZ2luOyBlbmQpIGlmIGVuZEV4Y2x1c2l2ZS4gKiovXG5leHBvcnQgZnVuY3Rpb24gZ2VuUmFuZ2UoYmVnaW4sIGVuZCwgZW5kRXhjbHVzaXZlID0gZmFsc2UpIHtcbiAgICBjb25zdCBuSXRlbXMgPSBlbmQgLSBiZWdpbiArIChlbmRFeGNsdXNpdmUgPyAwIDogMSk7XG4gICAgY29uc3Qgc2VyaWVzID0gbmV3IEludDMyQXJyYXkobkl0ZW1zKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5JdGVtczsgKytpKVxuICAgICAgICBzZXJpZXNbaV0gPSBiZWdpbiArIGk7XG4gICAgcmV0dXJuIHNlcmllcztcbn1cbi8qKlxuICogUmV0dXJucyBvcmRlciBvZiB2YWx1ZXMgYXMgaWYgdGhleSBhcmUgc29ydGVkLlxuICpcbiAqIEBleHBvcnRcbiAqIEBwYXJhbSB7YW55W119IHZhbHVlcyBJbnB1dCBhcnJheS5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW3JldmVyc2U9ZmFsc2VdIFdoZXRoZXIgdG8gcmV0dXJuIHJldmVyc2VkIG9yZGVyLlxuICogQHJldHVybiB7bnVtYmVyW119IFRoZSBvcmRlciBjb21wdXRlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFyZ1NvcnQodmFsdWVzLCByZXZlcnNlID0gZmFsc2UpIHtcbiAgICBjb25zdCBzb3J0Zm4gPSByZXZlcnNlID8gKGEsIGIpID0+IChiWzBdIC0gYVswXSkgOiAoYSwgYikgPT4gKGFbMF0gLSBiWzBdKTtcbiAgICBjb25zdCBkZWNvciA9ICh2LCBpKSA9PiBbdiwgaV07IC8vIHNldCBpbmRleCB0byB2YWx1ZVxuICAgIGNvbnN0IHVuZGVjb3IgPSAoYSkgPT4gYVsxXTsgLy8gbGVhdmUgb25seSBpbmRleFxuICAgIGNvbnN0IF9hcmdzb3J0ID0gKGFycikgPT4gYXJyLm1hcChkZWNvcikuc29ydChzb3J0Zm4pLm1hcCh1bmRlY29yKTtcbiAgICByZXR1cm4gX2FyZ3NvcnQodmFsdWVzKTtcbn1cbi8qKlxuICogUmV0dXJucyB0aGUgaW5kZXhlcyBvZiB0aGUgbW9zdCBkaXZlcnNlIG9iamVjdHMgYWNjb3JkaW5nIHRvIHRoZSBkaXN0IGZ1bmN0aW9uXG4gKiBAcGFyYW0ge251bWJlcn0gbGVuZ3RoIHRvdGFsIG51bWJlciBvZiBvYmplY3RzXG4gKiBAcGFyYW0ge251bWJlcn0gbiBudW1iZXIgb2YgZGl2ZXJzZSBlbGVtZW50cyB0byBmaW5kXG4gKiBAcGFyYW0geyhpMTogbnVtYmVyLCBpMjogbnVtYmVyKSA9PiBudW1iZXJ9IGRpc3QgYSBmdW5jdGlvbiB3aGljaCBjYWxjdWxhdGVzIGRpc3RhbmNlIGJldHdlZW5cbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0d28gb2JqZWN0cyB1c2luZyB0aGVpciBpbmRleGVzXG4gKiBAcmV0dXJucyB7bnVtYmVyW119IFRoZSBpbmRleGVzIG9mIHRoZSBtb3N0IGRpdmVyc2Ugb2JqZWN0c1xuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0RGl2ZXJzZVN1YnNldChsZW5ndGgsIG4sIGRpc3QpIHtcbiAgICBmdW5jdGlvbiBtYXhCeSh2YWx1ZXMsIG9yZGVyQnkpIHtcbiAgICAgICAgbGV0IG1heFZhbHVlID0gbnVsbDtcbiAgICAgICAgbGV0IG1heE9yZGVyQnkgPSBudWxsO1xuICAgICAgICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgdmFsdWVzKSB7XG4gICAgICAgICAgICBjb25zdCBlbGVtZW50T3JkZXJCeSA9IG9yZGVyQnkoZWxlbWVudCk7XG4gICAgICAgICAgICBpZiAobWF4T3JkZXJCeSA9PSBudWxsIHx8IGVsZW1lbnRPcmRlckJ5ID4gbWF4T3JkZXJCeSkge1xuICAgICAgICAgICAgICAgIG1heFZhbHVlID0gZWxlbWVudDtcbiAgICAgICAgICAgICAgICBtYXhPcmRlckJ5ID0gZWxlbWVudE9yZGVyQnk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1heFZhbHVlO1xuICAgIH1cbiAgICBjb25zdCBzdWJzZXQgPSBbcmFuZG9tSW50KGxlbmd0aCAtIDEpXTtcbiAgICBjb25zdCBjb21wbGVtZW50ID0gbmV3IFNldCgpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpIHtcbiAgICAgICAgaWYgKCFzdWJzZXQuaW5jbHVkZXMoaSkpXG4gICAgICAgICAgICBjb21wbGVtZW50LmFkZChpKTtcbiAgICB9XG4gICAgd2hpbGUgKHN1YnNldC5sZW5ndGggPCBuKSB7XG4gICAgICAgIGNvbnN0IGlkeCA9IG1heEJ5KGNvbXBsZW1lbnQudmFsdWVzKCksIChpKSA9PiBNYXRoLm1pbi5hcHBseShNYXRoLCBzdWJzZXQubWFwKGZ1bmN0aW9uICh2YWwsIGluZGV4KSB7XG4gICAgICAgICAgICByZXR1cm4gZGlzdChpLCB2YWwpO1xuICAgICAgICB9KSkpO1xuICAgICAgICBpZiAoaWR4KSB7XG4gICAgICAgICAgICBzdWJzZXQucHVzaChpZHgpO1xuICAgICAgICAgICAgY29tcGxlbWVudC5kZWxldGUoaWR4KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gc3Vic2V0O1xufVxuLyoqXG4gKiBSZXR1cm5zIG5vcm1hbGl6ZWQgdmVjdG9yXG4gKiBAcGFyYW0ge1ZlY3Rvcn0gZGF0YSBudW1lcmljYWwgYXJyYXlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZShkYXRhKSB7XG4gICAgbGV0IG1lYW4gPSAwO1xuICAgIGxldCBzdGQgPSAwO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZGF0YS5sZW5ndGg7ICsraSlcbiAgICAgICAgbWVhbiArPSBkYXRhW2ldO1xuICAgIG1lYW4gLz0gZGF0YS5sZW5ndGg7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkYXRhLmxlbmd0aDsgKytpKVxuICAgICAgICBzdGQgKz0gKGRhdGFbaV0gLSBtZWFuKSAqIChkYXRhW2ldIC0gbWVhbik7XG4gICAgc3RkID0gTWF0aC5zcXJ0KHN0ZCAvIGRhdGEubGVuZ3RoKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRhdGEubGVuZ3RoOyArK2kpXG4gICAgICAgIGRhdGFbaV0gPSAoZGF0YVtpXSAtIG1lYW4pIC8gc3RkO1xuICAgIHJldHVybiBkYXRhO1xufVxuLyoqXG4gKiBGaW5kcyBzZXQgZGlmZmVyZW5jZSBiZXR3ZWVuIHR3byBsaXN0cy5cbiAqIEBwYXJhbSB7YW55W119IGEgVGhlIGZpcnN0IGxpc3QuXG4gKiBAcGFyYW0ge2FueVtdfSBiIFRoZSBzZWNvbmQgbGlzdC5cbiAqIEByZXR1cm4ge2FueVtdfVxuICovXG5leHBvcnQgZnVuY3Rpb24gc2V0RGlmZmVyZW5jZShhLCBiKSB7XG4gICAgY29uc3QgYlNldCA9IG5ldyBTZXQoYik7XG4gICAgcmV0dXJuIEFycmF5LmZyb20obmV3IFNldChhLmZpbHRlcigoeCkgPT4gIWJTZXQuaGFzKHgpKSkudmFsdWVzKCkpO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZGF0YTphcHBsaWNhdGlvbi9qc29uO2Jhc2U2NCxleUoyWlhKemFXOXVJam96TENKbWFXeGxJam9pZG1WamRHOXlMVzl3WlhKaGRHbHZibk11YW5NaUxDSnpiM1Z5WTJWU2IyOTBJam9pSWl3aWMyOTFjbU5sY3lJNld5SjJaV04wYjNJdGIzQmxjbUYwYVc5dWN5NTBjeUpkTENKdVlXMWxjeUk2VzEwc0ltMWhjSEJwYm1keklqb2lRVUZCUVN4UFFVRlBMRVZCUVZNc1RVRkJUU3hGUVVGMVF5eE5RVUZOTEhGQ1FVRnhRaXhEUVVGRE8wRkJRM3BHTEU5QlFVOHNSVUZCUXl4WFFVRlhMRVZCUVVVc1UwRkJVeXhGUVVGRExFMUJRVTBzVlVGQlZTeERRVUZETzBGQlJXaEVPenM3T3pzN08wZEJUMGM3UVVGRFNDeE5RVUZOTEZWQlFWVXNUVUZCVFN4RFFVRkRMRmxCUVhGQ0xFdEJRVXNzUlVGQlJTeFZRVUZyUWl4clFrRkJhMEk3U1VGRGNrWXNTVUZCU1N4RFFVRkRMRk5CUVZNN1VVRkRXaXhOUVVGTkxFbEJRVWtzUzBGQlN5eERRVUZETEU5QlFVOHNRMEZCUXl4RFFVRkRPMEZCUXpkQ0xFTkJRVU03UVVGRlJEczdPenM3T3pzN1IwRlJSenRCUVVOSUxGTkJRVk1zWlVGQlpTeERRVUZETEZWQlFXdENMRVZCUVVVc1ZVRkJhMElzUlVGQlJTeFBRVUZsTEVOQlFVTTdTVUZETDBVc1QwRkJUeXhKUVVGSkxFdEJRVXNzUTBGQlF5eFZRVUZWTEVOQlFVTXNRMEZCUXl4SlFVRkpMRU5CUVVNc1NVRkJTU3hEUVVGRExFTkJRVU1zUjBGQlJ5eERRVUZETEVkQlFVY3NSVUZCUlN4RFFVRkRMRU5CUVVNc1NVRkJTU3hOUVVGTkxFTkJRVU1zVlVGQlZTeERRVUZETEVOQlFVTXNTVUZCU1N4RFFVRkRMRWxCUVVrc1EwRkJReXhEUVVGRExFTkJRVU1zUTBGQlF6dEJRVU42Uml4RFFVRkRPMEZCUlVRN096czdPenM3UjBGUFJ6dEJRVU5JTEUxQlFVMHNWVUZCVlN4bFFVRmxMRU5CUVVNc1RVRkJZenRKUVVNMVF5eFBRVUZQTEVsQlFVa3NTMEZCU3l4RFFVRkRMRTFCUVUwc1EwRkJReXhEUVVGRExFTkJRVU1zUTBGQlF5eE5RVUZOTEVOQlFVTXNRMEZCUXl4SlFVRkpMRU5CUVVNc1EwRkJReXhEUVVGRE8xTkJRM1pETEVkQlFVY3NRMEZCUXl4RFFVRkRMRU5CUVVNc1JVRkJSU3hEUVVGRExFVkJRVVVzUlVGQlJTeERRVUZETEVOQlFVTXNTVUZCU1N4TlFVRk5MRU5CUVVNc1RVRkJUU3hEUVVGRExFMUJRVTBzUTBGQlF5eERRVUZETEVsQlFVa3NRMEZCUXl4RFFVRkRMRU5CUVVNc1EwRkJReXhIUVVGSExFTkJRVU1zUTBGQlF5eERRVUZETEVWQlFVVXNRMEZCUXl4RlFVRkZMRVZCUVVVc1EwRkJReXhEUVVGRExFMUJRVTBzUTBGQlF5eERRVUZETEVOQlFVTXNRMEZCUXl4RFFVRkRMRU5CUVVNc1EwRkJReXhEUVVGRExFTkJRVU1zUTBGQlF5eERRVUZETzBGQlEzUkdMRU5CUVVNN1FVRkZSRHM3T3pzN096czdSMEZSUnp0QlFVTklMRTFCUVUwc1ZVRkJWU3hUUVVGVExFTkJRVU1zUTBGQlV5eEZRVUZGTEVOQlFWTXNSVUZCUlN4aFFVRnhRaXhEUVVGRE8wbEJRM0JGTEUxQlFVMHNUVUZCVFN4SFFVRkhMRU5CUVVNc1EwRkJReXhOUVVGTkxFTkJRVU03U1VGRmVFSXNUVUZCVFN4RFFVRkRMRTFCUVUwc1NVRkJTU3hEUVVGRExFTkJRVU1zVFVGQlRTeEZRVUZGTERoQ1FVRTRRaXhEUVVGRExFTkJRVU03U1VGRk0wUXNUVUZCVFN4TFFVRkxMRWRCUVVjc1NVRkJTU3hOUVVGTkxFTkJRVU1zVFVGQlRTeERRVUZETEVOQlFVTTdTVUZGYWtNc1MwRkJTeXhKUVVGSkxFTkJRVU1zUjBGQlJ5eERRVUZETEVWQlFVVXNRMEZCUXl4SFFVRkhMRU5CUVVNc1EwRkJReXhOUVVGTkxFVkJRVVVzUlVGQlJTeERRVUZETzFGQlF5OUNMRXRCUVVzc1EwRkJReXhEUVVGRExFTkJRVU1zUjBGQlJ5eERRVUZETEVOQlFVTXNRMEZCUXl4RFFVRkRMRWRCUVVjc1ZVRkJWU3hIUVVGSExFTkJRVU1zUTBGQlF5eERRVUZETEVOQlFVTXNRMEZCUXp0SlFVVjBReXhQUVVGUExFdEJRVXNzUTBGQlF6dEJRVU5tTEVOQlFVTTdRVUZGUkRzN096czdSMEZMUnp0QlFVTklMRk5CUVZNc1VVRkJVU3hEUVVGRExFTkJRVk03U1VGRGVrSXNTVUZCU1N4TFFVRkxMRWRCUVVjc1EwRkJReXhEUVVGRE8wbEJSV1FzUzBGQlN5eEpRVUZKTEVOQlFVTXNSMEZCUnl4RFFVRkRMRVZCUVVVc1EwRkJReXhIUVVGSExFTkJRVU1zUTBGQlF5eE5RVUZOTEVWQlFVVXNSVUZCUlN4RFFVRkRPMUZCUXk5Q0xFdEJRVXNzU1VGQlNTeERRVUZETEVOQlFVTXNRMEZCUXl4RFFVRkRMRU5CUVVNN1NVRkZhRUlzVDBGQlR5eExRVUZMTEVOQlFVTTdRVUZEWml4RFFVRkRPMEZCUlVRN096czdPMGRCUzBjN1FVRkRTQ3hUUVVGVExGbEJRVmtzUTBGQlF5eERRVUZUTzBsQlF6ZENMRTFCUVUwc1RVRkJUU3hIUVVGSExFTkJRVU1zUTBGQlF5eE5RVUZOTEVOQlFVTTdTVUZEZUVJc1RVRkJUU3hMUVVGTExFZEJRVWNzU1VGQlNTeE5RVUZOTEVOQlFVTXNUVUZCVFN4RFFVRkRMRU5CUVVNN1NVRkZha01zUzBGQlN5eEpRVUZKTEVOQlFVTXNSMEZCUnl4RFFVRkRMRVZCUVVVc1EwRkJReXhIUVVGSExFTkJRVU1zUTBGQlF5eE5RVUZOTEVWQlFVVXNSVUZCUlN4RFFVRkRPMUZCUXk5Q0xFdEJRVXNzUTBGQlF5eERRVUZETEVOQlFVTXNSMEZCUnl4RFFVRkRMRU5CUVVNc1EwRkJReXhEUVVGRExFZEJRVWNzUTBGQlF5eERRVUZETEVOQlFVTXNRMEZCUXl4RFFVRkRPMGxCUlhwQ0xFOUJRVThzUzBGQlN5eERRVUZETzBGQlEyWXNRMEZCUXp0QlFVVkVMRTFCUVUwc1ZVRkJWU3haUVVGWkxFTkJRVU1zUTBGQlV6dEpRVU53UXl4SlFVRkpMRTFCUVUwc1IwRkJWeXhEUVVGRExFTkJRVU03U1VGRGRrSXNTMEZCU3l4SlFVRkpMRU5CUVVNc1IwRkJWeXhEUVVGRExFVkJRVVVzUTBGQlF5eEhRVUZITEVOQlFVTXNRMEZCUXl4TlFVRk5MRVZCUVVVc1EwRkJReXhGUVVGRk8xRkJRM1pETEUxQlFVMHNTVUZCU1N4RFFVRkRMRU5CUVVNc1EwRkJReXhEUVVGRExFZEJRVWNzUTBGQlF5eERRVUZETEVOQlFVTXNRMEZCUXl4RFFVRkRPMGxCUTNoQ0xFOUJRVThzU1VGQlNTeERRVUZETEVsQlFVa3NRMEZCUXl4TlFVRk5MRU5CUVVNc1EwRkJRenRCUVVNelFpeERRVUZETzBGQlJVUXNUVUZCVFN4VlFVRlZMR2RDUVVGblFpeERRVUZETEVWQlFWVXNSVUZCUlN4RlFVRlZPMGxCUTNKRUxFbEJRVWtzUlVGQlJTeERRVUZETEUxQlFVMHNTVUZCU1N4RlFVRkZMRU5CUVVNc1RVRkJUVHRSUVVONFFpeE5RVUZOTEVsQlFVa3NTMEZCU3l4RFFVRkRMRGhEUVVFNFF5eERRVUZETEVOQlFVTTdTVUZEYkVVc1NVRkJTU3hKUVVGSkxFZEJRVmNzUTBGQlF5eERRVUZETzBsQlEzSkNMRXRCUVVzc1NVRkJTU3hEUVVGRExFZEJRVmNzUTBGQlF5eEZRVUZGTEVOQlFVTXNSMEZCUnl4RlFVRkZMRU5CUVVNc1RVRkJUU3hGUVVGRkxFTkJRVU1zUlVGQlJUdFJRVU40UXl4SlFVRkpMRWxCUVVrc1JVRkJSU3hEUVVGRExFTkJRVU1zUTBGQlF5eEhRVUZITEVWQlFVVXNRMEZCUXl4RFFVRkRMRU5CUVVNc1EwRkJRenRKUVVONFFpeFBRVUZQTEVsQlFVa3NRMEZCUXp0QlFVTmtMRU5CUVVNN1FVRkZSRHM3T3pzN096czdSMEZSUnp0QlFVTklMRTFCUVUwc1ZVRkJWU3huUWtGQlowSXNRMEZCUXl4VlFVRnJRaXhGUVVGRkxGVkJRV3RDTEVWQlFVVXNVVUZCWjBJc1JVRkJSVHRKUVVONlJpeE5RVUZOTEUxQlFVMHNSMEZCUnl4bFFVRmxMRU5CUVVNc1ZVRkJWU3hGUVVGRkxGVkJRVlVzUTBGQlF5eERRVUZETzBsQlJYWkVMRXRCUVVzc1NVRkJTU3hEUVVGRExFZEJRVWNzUTBGQlF5eEZRVUZGTEVOQlFVTXNSMEZCUnl4VlFVRlZMRVZCUVVVc1JVRkJSU3hEUVVGRExFVkJRVVU3VVVGRGJrTXNTMEZCU3l4SlFVRkpMRU5CUVVNc1IwRkJSeXhEUVVGRExFVkJRVVVzUTBGQlF5eEhRVUZITEZWQlFWVXNSVUZCUlN4RlFVRkZMRU5CUVVNN1dVRkRha01zVFVGQlRTeERRVUZETEVOQlFVTXNRMEZCUXl4RFFVRkRMRU5CUVVNc1EwRkJReXhIUVVGSExGZEJRVmNzUTBGQlF5eExRVUZMTEVOQlFVTXNRMEZCUXp0TFFVTnlRenRKUVVORUxFOUJRVThzVFVGQlRTeERRVUZETzBGQlEyaENMRU5CUVVNN1FVRkZSRHM3T3pzN096dEhRVTlITzBGQlEwZ3NUVUZCVFN4VlFVRlZMREJDUVVFd1FpeERRVUZETEVOQlFWTXNSVUZCUlN4RFFVRlRPMGxCUXpkRUxFMUJRVTBzU1VGQlNTeEhRVUZITEZOQlFWTXNRMEZCUXl4RFFVRkRMRVZCUVVVc1EwRkJReXhGUVVGRkxFTkJRVU1zUTBGQlF5eERRVUZETEVOQlFVTTdTVUZEYWtNc1RVRkJUU3hOUVVGTkxFZEJRVWNzV1VGQldTeERRVUZETEVsQlFVa3NRMEZCUXl4RFFVRkRPMGxCUTJ4RExFMUJRVTBzVlVGQlZTeEhRVUZITEZGQlFWRXNRMEZCUXl4TlFVRk5MRU5CUVVNc1EwRkJRenRKUVVOd1F5eFBRVUZQTEVsQlFVa3NRMEZCUXl4SlFVRkpMRU5CUVVNc1ZVRkJWU3hEUVVGRExFTkJRVU03UVVGREwwSXNRMEZCUXp0QlFVVkVPenM3T3pzN08wZEJUMGM3UVVGRFNDeE5RVUZOTEZWQlFWVXNhMEpCUVd0Q0xFTkJRVU1zU1VGQllTeEZRVUZGTEZGQlFYZENPMGxCUTNoRkxFMUJRVTBzVFVGQlRTeEhRVUZITEVsQlFVa3NRMEZCUXl4TlFVRk5MRU5CUVVNN1NVRkRNMElzVFVGQlRTeE5RVUZOTEVkQlFVY3NaVUZCWlN4RFFVRkRMRTFCUVUwc1JVRkJSU3hOUVVGTkxFVkJRVVVzUTBGQlF5eERRVUZETEVOQlFVTTdTVUZGYkVRc1MwRkJTeXhKUVVGSkxFTkJRVU1zUjBGQlJ5eERRVUZETEVWQlFVVXNRMEZCUXl4SFFVRkhMRTFCUVUwc1JVRkJSU3hGUVVGRkxFTkJRVU1zUlVGQlJUdFJRVU12UWl4TFFVRkxMRWxCUVVrc1EwRkJReXhIUVVGSExFTkJRVU1zUjBGQlJ5eERRVUZETEVWQlFVVXNRMEZCUXl4SFFVRkhMRTFCUVUwc1JVRkJSU3hGUVVGRkxFTkJRVU1zUlVGQlJUdFpRVU51UXl4TlFVRk5MRU5CUVVNc1IwRkJWeXhEUVVGRExFbEJRVWtzUTBGQlF5eERRVUZETEVOQlFVTXNTVUZCU1N4SlFVRkpMRU5CUVVNc1NVRkJTU3hEUVVGRExFbEJRVWtzUTBGQlF5eERRVUZETEVOQlFVTXNTVUZCU1N4SlFVRkpMRU5CUVVNc1EwRkJReXhEUVVGRExFTkJRVU1zUTBGQlF5eERRVUZETEVOQlFVTXNRMEZCUXl4UlFVRlJMRU5CUVVNc1NVRkJTU3hEUVVGRExFTkJRVU1zUTBGQlF5eEZRVUZGTEVsQlFVa3NRMEZCUXl4RFFVRkRMRU5CUVVNc1EwRkJReXhEUVVGRE8xbEJRekZHTEUxQlFVMHNRMEZCUXl4RFFVRkRMRU5CUVVNc1EwRkJReXhEUVVGRExFTkJRVU1zUjBGQlJ5eE5RVUZOTEVOQlFVTXNRMEZCUXl4RFFVRkRMRU5CUVVNc1EwRkJReXhEUVVGRExFZEJRVWNzUTBGQlF5eERRVUZETzFOQlEycERPMHRCUTBZN1NVRkRSQ3hQUVVGUExFMUJRVTBzUTBGQlF6dEJRVU5vUWl4RFFVRkRPMEZCUlVRc2EwWkJRV3RHTzBGQlEyeEdMRTFCUVUwc1ZVRkJWU3hSUVVGUkxFTkJRVU1zUzBGQllTeEZRVUZGTEVkQlFWY3NSVUZCUlN4WlFVRlpMRWRCUVVjc1MwRkJTenRKUVVOMlJTeE5RVUZOTEUxQlFVMHNSMEZCUnl4SFFVRkhMRWRCUVVjc1MwRkJTeXhIUVVGSExFTkJRVU1zV1VGQldTeERRVUZETEVOQlFVTXNRMEZCUXl4RFFVRkRMRU5CUVVNc1EwRkJReXhEUVVGRExFTkJRVU1zUTBGQlF5eERRVUZETzBsQlEzQkVMRTFCUVUwc1RVRkJUU3hIUVVGSExFbEJRVWtzVlVGQlZTeERRVUZETEUxQlFVMHNRMEZCUXl4RFFVRkRPMGxCUlhSRExFdEJRVXNzU1VGQlNTeERRVUZETEVkQlFVY3NRMEZCUXl4RlFVRkZMRU5CUVVNc1IwRkJSeXhOUVVGTkxFVkJRVVVzUlVGQlJTeERRVUZETzFGQlF6ZENMRTFCUVUwc1EwRkJReXhEUVVGRExFTkJRVU1zUjBGQlJ5eExRVUZMTEVkQlFVY3NRMEZCUXl4RFFVRkRPMGxCUlhoQ0xFOUJRVThzVFVGQlRTeERRVUZETzBGQlEyaENMRU5CUVVNN1FVRkZSRHM3T3pzN096dEhRVTlITzBGQlEwZ3NUVUZCVFN4VlFVRlZMRTlCUVU4c1EwRkJReXhOUVVGaExFVkJRVVVzVDBGQlR5eEhRVUZITEV0QlFVczdTVUZEY0VRc1RVRkJUU3hOUVVGTkxFZEJRVWNzVDBGQlR5eERRVUZETEVOQlFVTXNRMEZCUXl4RFFVRkRMRU5CUVZFc1JVRkJSU3hEUVVGUkxFVkJRVVVzUlVGQlJTeERRVUZETEVOQlFVTXNRMEZCUXl4RFFVRkRMRU5CUVVNc1EwRkJReXhIUVVGSExFTkJRVU1zUTBGQlF5eERRVUZETEVOQlFVTXNRMEZCUXl4RFFVRkRMRU5CUVVNc1EwRkJReXhEUVVGRExFTkJRVkVzUlVGQlJTeERRVUZSTEVWQlFVVXNSVUZCUlN4RFFVRkRMRU5CUVVNc1EwRkJReXhEUVVGRExFTkJRVU1zUTBGQlF5eEhRVUZITEVOQlFVTXNRMEZCUXl4RFFVRkRMRU5CUVVNc1EwRkJReXhEUVVGRE8wbEJRM1pITEUxQlFVMHNTMEZCU3l4SFFVRkhMRU5CUVVNc1EwRkJUU3hGUVVGRkxFTkJRVk1zUlVGQlJTeEZRVUZGTEVOQlFVTXNRMEZCUXl4RFFVRkRMRVZCUVVVc1EwRkJReXhEUVVGRExFTkJRVU1zUTBGQlF5eHhRa0ZCY1VJN1NVRkRiRVVzVFVGQlRTeFBRVUZQTEVkQlFVY3NRMEZCUXl4RFFVRlJMRVZCUVVVc1JVRkJSU3hEUVVGRExFTkJRVU1zUTBGQlF5eERRVUZETEVOQlFVTXNRMEZCUXl4RFFVRkRMRzFDUVVGdFFqdEpRVU4yUkN4TlFVRk5MRkZCUVZFc1IwRkJSeXhEUVVGRExFZEJRVlVzUlVGQlJTeEZRVUZGTEVOQlFVTXNSMEZCUnl4RFFVRkRMRWRCUVVjc1EwRkJReXhMUVVGTExFTkJRVU1zUTBGQlF5eEpRVUZKTEVOQlFVTXNUVUZCVFN4RFFVRkRMRU5CUVVNc1IwRkJSeXhEUVVGRExFOUJRVThzUTBGQlF5eERRVUZETzBsQlF6RkZMRTlCUVU4c1VVRkJVU3hEUVVGRExFMUJRVTBzUTBGQlF5eERRVUZETzBGQlF6RkNMRU5CUVVNN1FVRkZSRHM3T3pzN096dEhRVTlITzBGQlEwZ3NUVUZCVFN4VlFVRlZMR2RDUVVGblFpeERRVUZETEUxQlFXTXNSVUZCUlN4RFFVRlRMRVZCUVVVc1NVRkJkME03U1VGRGJFY3NVMEZCVXl4TFFVRkxMRU5CUVVNc1RVRkJaME1zUlVGQlJTeFBRVUU0UWp0UlFVTTNSU3hKUVVGSkxGRkJRVkVzUjBGQlJ5eEpRVUZKTEVOQlFVTTdVVUZEY0VJc1NVRkJTU3hWUVVGVkxFZEJRVWNzU1VGQlNTeERRVUZETzFGQlJYUkNMRXRCUVVzc1RVRkJUU3hQUVVGUExFbEJRVWtzVFVGQlRTeEZRVUZGTzFsQlF6VkNMRTFCUVUwc1kwRkJZeXhIUVVGSExFOUJRVThzUTBGQlF5eFBRVUZQTEVOQlFVTXNRMEZCUXp0WlFVTjRReXhKUVVGSkxGVkJRVlVzU1VGQlNTeEpRVUZKTEVsQlFVa3NZMEZCWXl4SFFVRkhMRlZCUVZVc1JVRkJSVHRuUWtGRGNrUXNVVUZCVVN4SFFVRkhMRTlCUVU4c1EwRkJRenRuUWtGRGJrSXNWVUZCVlN4SFFVRkhMR05CUVdNc1EwRkJRenRoUVVNM1FqdFRRVU5HTzFGQlEwUXNUMEZCVHl4UlFVRlJMRU5CUVVNN1NVRkRiRUlzUTBGQlF6dEpRVVZFTEUxQlFVMHNUVUZCVFN4SFFVRkhMRU5CUVVNc1UwRkJVeXhEUVVGRExFMUJRVTBzUjBGQlJ5eERRVUZETEVOQlFVTXNRMEZCUXl4RFFVRkRPMGxCUTNaRExFMUJRVTBzVlVGQlZTeEhRVUZITEVsQlFVa3NSMEZCUnl4RlFVRkZMRU5CUVVNN1NVRkZOMElzUzBGQlN5eEpRVUZKTEVOQlFVTXNSMEZCUnl4RFFVRkRMRVZCUVVVc1EwRkJReXhIUVVGSExFMUJRVTBzUlVGQlJTeEZRVUZGTEVOQlFVTXNSVUZCUlR0UlFVTXZRaXhKUVVGSkxFTkJRVU1zVFVGQlRTeERRVUZETEZGQlFWRXNRMEZCUXl4RFFVRkRMRU5CUVVNN1dVRkRja0lzVlVGQlZTeERRVUZETEVkQlFVY3NRMEZCUXl4RFFVRkRMRU5CUVVNc1EwRkJRenRMUVVOeVFqdEpRVVZFTEU5QlFVOHNUVUZCVFN4RFFVRkRMRTFCUVUwc1IwRkJSeXhEUVVGRExFVkJRVVU3VVVGRGVFSXNUVUZCVFN4SFFVRkhMRWRCUVVjc1MwRkJTeXhEUVVObUxGVkJRVlVzUTBGQlF5eE5RVUZOTEVWQlFUaENMRVZCUXk5RExFTkJRVU1zUTBGQlF5eEZRVUZGTEVWQlFVVXNRMEZCUXl4SlFVRkpMRU5CUVVNc1IwRkJSeXhEUVVGRExFdEJRVXNzUTBGQlF5eEpRVUZKTEVWQlFVVXNUVUZCVFN4RFFVRkRMRWRCUVVjc1EwRkJReXhWUVVGVExFZEJRVWNzUlVGQlJTeExRVUZMTzFsQlEzaEVMRTlCUVU4c1NVRkJTU3hEUVVGRExFTkJRVU1zUlVGQlJTeEhRVUZITEVOQlFVTXNRMEZCUXp0UlFVTjBRaXhEUVVGRExFTkJRVU1zUTBGQlF5eERRVUZETEVOQlFVTTdVVUZEVUN4SlFVRkpMRWRCUVVjc1JVRkJSVHRaUVVOUUxFMUJRVTBzUTBGQlF5eEpRVUZKTEVOQlFVTXNSMEZCUnl4RFFVRkRMRU5CUVVNN1dVRkRha0lzVlVGQlZTeERRVUZETEUxQlFVMHNRMEZCUXl4SFFVRkhMRU5CUVVNc1EwRkJRenRUUVVONFFqdExRVU5HTzBsQlEwUXNUMEZCVHl4TlFVRk5MRU5CUVVNN1FVRkRhRUlzUTBGQlF6dEJRVVZFT3pzN1IwRkhSenRCUVVOSUxFMUJRVTBzVlVGQlZTeFRRVUZUTEVOQlFVTXNTVUZCV1R0SlFVTndReXhKUVVGSkxFbEJRVWtzUjBGQlJ5eERRVUZETEVOQlFVTTdTVUZEWWl4SlFVRkpMRWRCUVVjc1IwRkJSeXhEUVVGRExFTkJRVU03U1VGRldpeExRVUZMTEVsQlFVa3NRMEZCUXl4SFFVRkhMRU5CUVVNc1JVRkJSU3hEUVVGRExFZEJRVWNzU1VGQlNTeERRVUZETEUxQlFVMHNSVUZCUlN4RlFVRkZMRU5CUVVNN1VVRkRiRU1zU1VGQlNTeEpRVUZKTEVsQlFVa3NRMEZCUXl4RFFVRkRMRU5CUVVNc1EwRkJRenRKUVVWc1FpeEpRVUZKTEVsQlFVa3NTVUZCU1N4RFFVRkRMRTFCUVUwc1EwRkJRenRKUVVWd1FpeExRVUZMTEVsQlFVa3NRMEZCUXl4SFFVRkhMRU5CUVVNc1JVRkJSU3hEUVVGRExFZEJRVWNzU1VGQlNTeERRVUZETEUxQlFVMHNSVUZCUlN4RlFVRkZMRU5CUVVNN1VVRkRiRU1zUjBGQlJ5eEpRVUZKTEVOQlFVTXNTVUZCU1N4RFFVRkRMRU5CUVVNc1EwRkJReXhIUVVGSExFbEJRVWtzUTBGQlF5eEhRVUZITEVOQlFVTXNTVUZCU1N4RFFVRkRMRU5CUVVNc1EwRkJReXhIUVVGSExFbEJRVWtzUTBGQlF5eERRVUZETzBsQlJUZERMRWRCUVVjc1IwRkJSeXhKUVVGSkxFTkJRVU1zU1VGQlNTeERRVUZETEVkQlFVY3NSMEZCUnl4SlFVRkpMRU5CUVVNc1RVRkJUU3hEUVVGRExFTkJRVU03U1VGRmJrTXNTMEZCU3l4SlFVRkpMRU5CUVVNc1IwRkJSeXhEUVVGRExFVkJRVVVzUTBGQlF5eEhRVUZITEVsQlFVa3NRMEZCUXl4TlFVRk5MRVZCUVVVc1JVRkJSU3hEUVVGRE8xRkJRMnhETEVsQlFVa3NRMEZCUXl4RFFVRkRMRU5CUVVNc1IwRkJSeXhEUVVGRExFbEJRVWtzUTBGQlF5eERRVUZETEVOQlFVTXNSMEZCUnl4SlFVRkpMRU5CUVVNc1IwRkJSeXhIUVVGSExFTkJRVU03U1VGRmJrTXNUMEZCVHl4SlFVRkpMRU5CUVVNN1FVRkRaQ3hEUVVGRE8wRkJSVVE3T3pzN08wZEJTMGM3UVVGRFNDeE5RVUZOTEZWQlFWVXNZVUZCWVN4RFFVRkRMRU5CUVZFc1JVRkJSU3hEUVVGUk8wbEJRemxETEUxQlFVMHNTVUZCU1N4SFFVRkhMRWxCUVVrc1IwRkJSeXhEUVVGRExFTkJRVU1zUTBGQlF5eERRVUZETzBsQlEzaENMRTlCUVU4c1MwRkJTeXhEUVVGRExFbEJRVWtzUTBGQlF5eEpRVUZKTEVkQlFVY3NRMEZCUXl4RFFVRkRMRU5CUVVNc1RVRkJUU3hEUVVGRExFTkJRVU1zUTBGQlF5eEZRVUZGTEVWQlFVVXNRMEZCUXl4RFFVRkRMRWxCUVVrc1EwRkJReXhIUVVGSExFTkJRVU1zUTBGQlF5eERRVUZETEVOQlFVTXNRMEZCUXl4RFFVRkRMRTFCUVUwc1JVRkJSU3hEUVVGRExFTkJRVU03UVVGRGNrVXNRMEZCUXlJc0luTnZkWEpqWlhORGIyNTBaVzUwSWpwYkltbHRjRzl5ZENCN1RXRjBjbWw0TENCV1pXTjBiM0lzSUVOdmIzSmthVzVoZEdWekxDQldaV04wYjNKekxDQkVhWE4wWVc1alpVMWxkSEpwWTMwZ1puSnZiU0FuTGk5MGVYQmxMV1JsWTJ4aGNtRjBhVzl1Y3ljN1hHNXBiWEJ2Y25RZ2UzSmhibVJ2YlVac2IyRjBMQ0J5WVc1a2IyMUpiblI5SUdaeWIyMGdKeTR2Y21GdVpHOXRKenRjYmx4dUx5b3FYRzRnS2lCQmMzTmxjblJ6SUdFZ1kyOXVaR2wwYVc5dUlHSjVJSFJvY205M2FXNW5JR0Z1SUVWeWNtOXlMbHh1SUNwY2JpQXFJRUJsZUhCdmNuUmNiaUFxSUVCd1lYSmhiU0I3WW05dmJHVmhibjBnVzJOdmJtUnBkR2x2YmoxbVlXeHpaVjBnUTI5dVpHbDBhVzl1SUhSdklHRnpjMlZ5ZEM1Y2JpQXFJRUJ3WVhKaGJTQjdjM1J5YVc1bmZTQmJiV1Z6YzJGblpUMG5RWE56WlhKMGFXOXVJR1Z5Y205eUxpZGRJRTFsYzNOaFoyVWdkRzhnYjNWMGNIVjBMbHh1SUNvZ1FIUm9jbTkzY3lCN1JYSnliM0o5WEc0Z0tpOWNibVY0Y0c5eWRDQm1kVzVqZEdsdmJpQmhjM05sY25Rb1kyOXVaR2wwYVc5dU9pQmliMjlzWldGdUlEMGdabUZzYzJVc0lHMWxjM05oWjJVNklITjBjbWx1WnlBOUlDZEJjM05sY25ScGIyNGdaWEp5YjNJdUp5a2dlMXh1SUNCcFppQW9JV052Ym1ScGRHbHZiaWxjYmlBZ0lDQjBhSEp2ZHlCdVpYY2dSWEp5YjNJb2JXVnpjMkZuWlNrN1hHNTlYRzVjYmk4cUtseHVJQ29nUTNKbFlYUmxjeUJ1WlhjZ2RIZHZMV1JwYldWdWMybHZibUZzSUdGeWNtRjVJR0Z1WkNCbWFXeHNjeUJwZENCM2FYUm9JSFJvWlNCMllXeDFaU0JuYVhabGJpNWNiaUFxWEc0Z0tpQkFjR0Z5WVcwZ2UyNTFiV0psY24wZ1pHbHRaVzV6YVc5dU1TQlVhR1VnWm1seWMzUWdaR2x0Wlc1emFXOXVJRzltSUhSb1pTQmpiMjl5WkdsdVlYUmxjeUFvYm5WdFltVnlJRzltSUhKdmQzTXBMbHh1SUNvZ1FIQmhjbUZ0SUh0dWRXMWlaWEo5SUdScGJXVnVjMmx2YmpJZ1ZHaGxJSE5sWTI5dVpDQmthVzFsYm5OcGIyNGdiMllnZEdobElHTnZiM0prYVc1aGRHVnpJQ2h1ZFcxaVpYSWdiMllnWTI5c2RXMXVjeWt1WEc0Z0tpQkFjR0Z5WVcwZ2UyNTFiV0psY24wZ1cyWnBiR3c5TUYwZ1FTQjJZV3gxWlNCMGJ5Qm1hV3hzSUhSb1pTQmpiMjl5WkdsdVlYUmxjeUIzYVhSb0xseHVJQ29nUUhKbGRIVnliaUI3UTI5dmNtUnBibUYwWlhOOUlFRWdkSGR2TFdScGJXVnVjMmx2Ym1Gc0lHWnBiR3hsWkNCM2FYUm9JSFJvWlNCMllXeDFaU0JuYVhabGJpNWNiaUFxSUVCMGIyUnZJRTFwWjJoMElHSmxJSE5zYjNjZ2MybHVZMlVnZFhObFpDQkJjbkpoZVM1dFlYQXVJRkJ5YjJKaFlteDVJRzVsWldSeklIQmxjbVp2Y20xaGJtTmxJSEpsZG1semFXOXVMbHh1SUNvdlhHNW1kVzVqZEdsdmJpQnBibWwwUTI5dmNtUnBibUYwWlhNb1pHbHRaVzV6YVc5dU1Ub2diblZ0WW1WeUxDQmthVzFsYm5OcGIyNHlPaUJ1ZFcxaVpYSXNJR1pwYkd3NklHNTFiV0psY2lBOUlEQXBPaUJEYjI5eVpHbHVZWFJsY3lCN1hHNGdJSEpsZEhWeWJpQnVaWGNnUVhKeVlYa29aR2x0Wlc1emFXOXVNU2t1Wm1sc2JDaG1hV3hzS1M1dFlYQW9LQ2tnUFQ0Z0tHNWxkeUJXWldOMGIzSW9aR2x0Wlc1emFXOXVNaWt1Wm1sc2JDaG1hV3hzS1NrcE8xeHVmVnh1WEc0dktpcGNiaUFxSUZSeVlXNXpjRzl6WlNCdFlYUnlhWGd1WEc0Z0tseHVJQ29nUUdWNGNHOXlkRnh1SUNvZ1FIQmhjbUZ0SUh0TllYUnlhWGg5SUcxaGRISnBlQ0JVYUdVZ2JXRjBjbWw0SUhSdklHSmxJSFJ5WVc1emNHOXpaV1F1WEc0Z0tpQkFjbVYwZFhKdUlIdE5ZWFJ5YVhoOUlGUnlZVzV6Y0c5elpXUWdiV0YwY21sNExseHVJQ29nUUhSdlpHOGdUV2xuYUhRZ1ltVWdjMnh2ZHlCemFXNWpaU0IxYzJWa0lFRnljbUY1TG0xaGNDNGdVSEp2WW1GaWJIa2dibVZsWkhNZ2NHVnlabTl5YldGdVkyVWdjbVYyYVhOcGIyNHVYRzRnS2k5Y2JtVjRjRzl5ZENCbWRXNWpkR2x2YmlCMGNtRnVjM0J2YzJWTllYUnlhWGdvYldGMGNtbDRPaUJOWVhSeWFYZ3BPaUJOWVhSeWFYZ2dlMXh1SUNCeVpYUjFjbTRnYm1WM0lFRnljbUY1S0cxaGRISnBlRnN3WFM1c1pXNW5kR2dwTG1acGJHd29NQ2xjYmlBZ0lDQXViV0Z3S0NoZkxDQnBLU0E5UGlBb2JtVjNJRlpsWTNSdmNpaHRZWFJ5YVhndWJHVnVaM1JvS1M1bWFXeHNLREFwTG0xaGNDZ29YeXdnYWlrZ1BUNGdLRzFoZEhKcGVGdHFYVnRwWFNrcEtTazdYRzU5WEc1Y2JpOHFLbHh1SUNvZ1FXUmtjeUIwZDI4Z2RtVmpkRzl5Y3lCM2FYUm9JSFJvWlNCelpXTnZibVFnYjI1bElIUnZJR0psSUcxMWJIUnBjR3hwWldRZ1lua2dkR2hsSUdkcGRtVnVJSEpoZEdsdkxseHVJQ3BjYmlBcUlFQmxlSEJ2Y25SY2JpQXFJRUJ3WVhKaGJTQjdWbVZqZEc5eWZTQndJRlJvWlNCbWFYSnpkQ0IyWldOMGIzSWdkRzhnWVdSa0xseHVJQ29nUUhCaGNtRnRJSHRXWldOMGIzSjlJSEVnVkdobElITmxZMjl1WkNCMlpXTjBiM0lnZEc4Z1lXUmtMbHh1SUNvZ1FIQmhjbUZ0SUh0dWRXMWlaWEo5SUZ0dGRXeDBhWEJzYVdWeVBURmRJRUVnYlhWc2RHbHdiR2xsY2lCMGJ5QmlaU0IxYzJWa0lHSmxabTl5WlNCMGFHVWdjMlZqYjI1a0lIWmxZM1J2Y2lCcGN5QmhaR1JsWkM1Y2JpQXFJRUJ5WlhSMWNtNGdlMVpsWTNSdmNuMGdUbVYzSUhabFkzUnZjaUJqYjI1MFlXbHVaV1FnZEdobElISmxjM1ZzZENCdlppQnZjR1Z5WVhScGIyNGdjQ3R0ZFd4MGFYQnNhV1Z5S25FdVhHNGdLaTljYm1WNGNHOXlkQ0JtZFc1amRHbHZiaUIyWldOMGIzSkJaR1FvY0RvZ1ZtVmpkRzl5TENCeE9pQldaV04wYjNJc0lHMTFiSFJwY0d4cFpYSTZJRzUxYldKbGNpQTlJREVwT2lCV1pXTjBiM0lnZTF4dUlDQmpiMjV6ZENCdVNYUmxiWE1nUFNCd0xteGxibWQwYUR0Y2JseHVJQ0JoYzNObGNuUW9ia2wwWlcxeklEMDlJSEV1YkdWdVozUm9MQ0FuVm1WamRHOXlJR3hsYm1kMGFITWdaRzhnYm05MElHMWhkR05vTGljcE8xeHVYRzRnSUdOdmJuTjBJSFJ2ZEdGc0lEMGdibVYzSUZabFkzUnZjaWh1U1hSbGJYTXBPMXh1WEc0Z0lHWnZjaUFvYkdWMElHa2dQU0F3T3lCcElEd2djQzVzWlc1bmRHZzdJQ3NyYVNsY2JpQWdJQ0IwYjNSaGJGdHBYU0E5SUhCYmFWMGdLeUJ0ZFd4MGFYQnNhV1Z5SUNvZ2NWdHBYVHRjYmx4dUlDQnlaWFIxY200Z2RHOTBZV3c3WEc1OVhHNWNiaThxS2x4dUlDb2dVM1Z0Y3lCMGFHVWdkbVZqZEc5eUozTWdhWFJsYlhNdVhHNGdLbHh1SUNvZ1FIQmhjbUZ0SUh0V1pXTjBiM0o5SUhZZ1ZHaGxJSFpsWTNSdmNpQjBieUJpWlNCemRXMXRaV1F1WEc0Z0tpQkFjbVYwZFhKdUlIdHVkVzFpWlhKOUlGUm9aU0IyWldOMGIzSW5jeUJwZEdWdGN5QnpkVzB1WEc0Z0tpOWNibVoxYm1OMGFXOXVJR2wwWlcxelUzVnRLSFk2SUZabFkzUnZjaWs2SUc1MWJXSmxjaUI3WEc0Z0lHeGxkQ0IwYjNSaGJDQTlJREE3WEc1Y2JpQWdabTl5SUNoc1pYUWdhU0E5SURBN0lHa2dQQ0IyTG14bGJtZDBhRHNnS3l0cEtWeHVJQ0FnSUhSdmRHRnNJQ3M5SUhaYmFWMDdYRzVjYmlBZ2NtVjBkWEp1SUhSdmRHRnNPMXh1ZlZ4dVhHNHZLaXBjYmlBcUlGTjFjV0Z5WlhNZ2RHaGxJSFpsWTNSdmNpZHpJR2wwWlcxekxseHVJQ3BjYmlBcUlFQndZWEpoYlNCN1ZtVmpkRzl5ZlNCMklGUm9aU0IyWldOMGIzSWdkRzhnYzNGMVlYSmxMbHh1SUNvZ1FISmxkSFZ5YmlCN1ZtVmpkRzl5ZlNCQklHNWxkeUIyWldOMGIzSWdZMjl1ZEdGcGJtbHVaeUIwYUdVZ2IzSnBaMmx1WVd3bmN5QnBkR1Z0Y3lCemNYVmhjbVZrTGx4dUlDb3ZYRzVtZFc1amRHbHZiaUIyWldOMGIzSlRjWFZoY21Vb2Rqb2dWbVZqZEc5eUtUb2dWbVZqZEc5eUlIdGNiaUFnWTI5dWMzUWdia2wwWlcxeklEMGdkaTVzWlc1bmRHZzdYRzRnSUdOdmJuTjBJSFJ2ZEdGc0lEMGdibVYzSUZabFkzUnZjaWh1U1hSbGJYTXBPMXh1WEc0Z0lHWnZjaUFvYkdWMElHa2dQU0F3T3lCcElEd2dkaTVzWlc1bmRHZzdJQ3NyYVNsY2JpQWdJQ0IwYjNSaGJGdHBYU0E5SUhaYmFWMGdLaUIyVzJsZE8xeHVYRzRnSUhKbGRIVnliaUIwYjNSaGJEdGNibjFjYmx4dVpYaHdiM0owSUdaMWJtTjBhVzl1SUhabFkzUnZja3hsYm1kMGFDaDJPaUJXWldOMGIzSXBPaUJ1ZFcxaVpYSWdlMXh1SUNCc1pYUWdjM0Z5VTNWdE9pQnVkVzFpWlhJZ1BTQXdPMXh1SUNCbWIzSWdLR3hsZENCcE9pQnVkVzFpWlhJZ1BTQXdPeUJwSUR3Z2RpNXNaVzVuZEdnN0lHa3JLeWxjYmlBZ0lDQnpjWEpUZFcwZ0t6MGdkbHRwWFNBcUlIWmJhVjA3WEc0Z0lISmxkSFZ5YmlCTllYUm9Mbk54Y25Rb2MzRnlVM1Z0S1R0Y2JuMWNibHh1Wlhod2IzSjBJR1oxYm1OMGFXOXVJSFpsWTNSdmNrUnZkRkJ5YjJSMVkzUW9kakU2SUZabFkzUnZjaXdnZGpJNklGWmxZM1J2Y2lrNklHNTFiV0psY2lCN1hHNGdJR2xtSUNoMk1TNXNaVzVuZEdnZ0lUMGdkakl1YkdWdVozUm9LVnh1SUNBZ0lIUm9jbTkzSUc1bGR5QkZjbkp2Y2lnblZHaGxJR1JwYldWdWMybHZibUZzYVhSNUlHOW1JSFJvWlNCMlpXTjBiM0p6SUcxMWMzUWdiV0YwWTJnbktUdGNiaUFnYkdWMElIQnliMlE2SUc1MWJXSmxjaUE5SURBN1hHNGdJR1p2Y2lBb2JHVjBJR2s2SUc1MWJXSmxjaUE5SURBN0lHa2dQQ0IyTVM1c1pXNW5kR2c3SUdrckt5bGNiaUFnSUNCd2NtOWtJQ3M5SUhZeFcybGRJQ29nZGpKYmFWMDdYRzRnSUhKbGRIVnliaUJ3Y205a08xeHVmVnh1WEc0dktpcGNiaUFxSUVOeVpXRjBaWE1nWVNCdFlYUnlhWGdnWm1sc2JHVmtJSGRwZEdnZ2NtRnVaRzl0SUdac2IyRjBhVzVuSUhCdmFXNTBJSFpoYkhWbGN5NWNiaUFxWEc0Z0tpQkFaWGh3YjNKMFhHNGdLaUJBY0dGeVlXMGdlMjUxYldKbGNuMGdaR2x0Wlc1emFXOXVNU0JVYUdVZ1ptbHljM1FnWkdsdFpXNXphVzl1SUc5bUlIUm9aU0J0WVhSeWFYZ3VYRzRnS2lCQWNHRnlZVzBnZTI1MWJXSmxjbjBnWkdsdFpXNXphVzl1TWlCVWFHVWdjMlZqYjI1a0lHUnBiV1Z1YzJsdmJpQnZaaUIwYUdVZ2JXRjBjbWw0TGx4dUlDb2dRSEJoY21GdElIdHVkVzFpWlhKOUlGdHpZMkZzWlQweExsMGdUV0Y0SUhaaGJIVmxJR2RwZG1WdUlHSjVJSEpoYm1SdmJTQm5aVzVsY21GMGIzSXVYRzRnS2lCQWNtVjBkWEp1SUh0TllYUnlhWGg5SUVFZ2JtVjNJRzFoZEhKcGVDQm1hV3hzWldRZ2QybDBhQ0J5WVc1a2IyMGdabXh2WVhScGJtY2djRzlwYm5RZ0lIWmhiSFZsY3k1Y2JpQXFMMXh1Wlhod2IzSjBJR1oxYm1OMGFXOXVJR1pwYkd4U1lXNWtiMjFOWVhSeWFYZ29aR2x0Wlc1emFXOXVNVG9nYm5WdFltVnlMQ0JrYVcxbGJuTnBiMjR5T2lCdWRXMWlaWElzSUhOallXeGxPaUJ1ZFcxaVpYSWdQU0F4TGlrNklFMWhkSEpwZUNCN1hHNGdJR052Ym5OMElHMWhkSEpwZUNBOUlHbHVhWFJEYjI5eVpHbHVZWFJsY3loa2FXMWxibk5wYjI0eExDQmthVzFsYm5OcGIyNHlLVHRjYmx4dUlDQm1iM0lnS0d4bGRDQnBJRDBnTURzZ2FTQThJR1JwYldWdWMybHZiakU3SUNzcmFTa2dlMXh1SUNBZ0lHWnZjaUFvYkdWMElHb2dQU0F3T3lCcUlEd2daR2x0Wlc1emFXOXVNanNnS3l0cUtWeHVJQ0FnSUNBZ2JXRjBjbWw0VzJsZFcycGRJRDBnY21GdVpHOXRSbXh2WVhRb2MyTmhiR1VwTzF4dUlDQjlYRzRnSUhKbGRIVnliaUJ0WVhSeWFYZzdYRzU5WEc1Y2JpOHFLbHh1SUNvZ1EyRnNZM1ZzWVhSbGN5QkZkV05zYVdSbFlXNGdaR2x6ZEdGdVkyVWdZbVYwZDJWbGJpQjBkMjhnZG1WamRHOXljeTVjYmlBcVhHNGdLaUJBWlhod2IzSjBYRzRnS2lCQWNHRnlZVzBnZTFabFkzUnZjbjBnY0NCVWFHVWdabWx5YzNRZ2RtVmpkRzl5TGx4dUlDb2dRSEJoY21GdElIdFdaV04wYjNKOUlIRWdWR2hsSUhObFkyOXVaQ0IyWldOMGIzSXVYRzRnS2lCQWNtVjBkWEp1SUh0dWRXMWlaWEo5SUVWMVkyeHBaR1ZoYmlCa2FYTjBZVzVqWlNCaVpYUjNaV1Z1SUhSb1pTQm5hWFpsYmlCMlpXTjBiM0p6TGx4dUlDb3ZYRzVsZUhCdmNuUWdablZ1WTNScGIyNGdZMkZzWTNWc1lYUmxSWFZqYkdsa1pXRnVSR2x6ZEdGdVkyVW9jRG9nVm1WamRHOXlMQ0J4T2lCV1pXTjBiM0lwT2lCdWRXMWlaWElnZTF4dUlDQmpiMjV6ZENCa2FXWm1JRDBnZG1WamRHOXlRV1JrS0hBc0lIRXNJQzB4S1R0Y2JpQWdZMjl1YzNRZ2MzRmthV1ptSUQwZ2RtVmpkRzl5VTNGMVlYSmxLR1JwWm1ZcE8xeHVJQ0JqYjI1emRDQnpjV1JwWm1aVGRXMXRJRDBnYVhSbGJYTlRkVzBvYzNGa2FXWm1LVHRjYmlBZ2NtVjBkWEp1SUUxaGRHZ3VjM0Z5ZENoemNXUnBabVpUZFcxdEtUdGNibjFjYmx4dUx5b3FYRzRnS2lCRGNtVmhkR1Z6SUdFZ1pHbHpkR0Z1WTJVZ2JXRjBjbWw0SUhWemFXNW5JR0VnWTNWemRHOXRJR1JwYzNSaGJtTmxJR1oxYm1OMGFXOXVMbHh1SUNwY2JpQXFJRUJsZUhCdmNuUmNiaUFxSUVCd1lYSmhiU0I3Vm1WamRHOXljMzBnWkdGMFlTQkpibkIxZENCMlpXTjBiM0p6SUhSdklHTmhiR04xYkdGMFpTQmthWE4wWVc1alpYTXVYRzRnS2lCQWNHRnlZVzBnZTBScGMzUmhibU5sVFdWMGNtbGpmU0JrYVhOMFlXNWpaU0JEZFhOMGIyMGdaR2x6ZEdGdVkyVWdablZ1WTNScGIyNHVYRzRnS2lCQWNtVjBkWEp1SUh0TllYUnlhWGg5SUVOaGJHTjFiR0YwWldRZ1kzVnpkRzl0SUdScGMzUmhibU5sSUcxaGRISnBlQzVjYmlBcUwxeHVaWGh3YjNKMElHWjFibU4wYVc5dUlHTmhiR05FYVhOMFlXNWpaVTFoZEhKcGVDaGtZWFJoT2lCV1pXTjBiM0p6TENCa2FYTjBZVzVqWlRvZ1JHbHpkR0Z1WTJWTlpYUnlhV01wT2lCTllYUnlhWGdnZTF4dUlDQmpiMjV6ZENCdVNYUmxiWE1nUFNCa1lYUmhMbXhsYm1kMGFEdGNiaUFnWTI5dWMzUWdiV0YwY21sNElEMGdhVzVwZEVOdmIzSmthVzVoZEdWektHNUpkR1Z0Y3l3Z2JrbDBaVzF6TENBd0tUdGNibHh1SUNCbWIzSWdLR3hsZENCcElEMGdNRHNnYVNBOElHNUpkR1Z0Y3pzZ0t5dHBLU0I3WEc0Z0lDQWdabTl5SUNoc1pYUWdhaUE5SUdrZ0t5QXhPeUJxSUR3Z2JrbDBaVzF6T3lBcksyb3BJSHRjYmlBZ0lDQWdJR052Ym5OMElHUTZJRzUxYldKbGNpQTlJQ2hrWVhSaFcybGRJRDA5SUc1MWJHd3BJSHg4SUNoa1lYUmhXMnBkSUQwOUlHNTFiR3dwSUQ4Z01DQTZJR1JwYzNSaGJtTmxLR1JoZEdGYmFWMHNJR1JoZEdGYmFsMHBPMXh1SUNBZ0lDQWdiV0YwY21sNFcybGRXMnBkSUQwZ2JXRjBjbWw0VzJwZFcybGRJRDBnWkR0Y2JpQWdJQ0I5WEc0Z0lIMWNiaUFnY21WMGRYSnVJRzFoZEhKcGVEdGNibjFjYmx4dUx5b3FJRWRsYm1WeVlYUmxjeUJoY25KaGVTQm1jbTl0SUdFZ2NtRnVaMlVnVzJKbFoybHVPeUJsYm1SZElHOXlJRnRpWldkcGJqc2daVzVrS1NCcFppQmxibVJGZUdOc2RYTnBkbVV1SUNvcUwxeHVaWGh3YjNKMElHWjFibU4wYVc5dUlHZGxibEpoYm1kbEtHSmxaMmx1T2lCdWRXMWlaWElzSUdWdVpEb2diblZ0WW1WeUxDQmxibVJGZUdOc2RYTnBkbVVnUFNCbVlXeHpaU2s2SUVsdWRETXlRWEp5WVhrZ2UxeHVJQ0JqYjI1emRDQnVTWFJsYlhNZ1BTQmxibVFnTFNCaVpXZHBiaUFySUNobGJtUkZlR05zZFhOcGRtVWdQeUF3SURvZ01TazdYRzRnSUdOdmJuTjBJSE5sY21sbGN5QTlJRzVsZHlCSmJuUXpNa0Z5Y21GNUtHNUpkR1Z0Y3lrN1hHNWNiaUFnWm05eUlDaHNaWFFnYVNBOUlEQTdJR2tnUENCdVNYUmxiWE03SUNzcmFTbGNiaUFnSUNCelpYSnBaWE5iYVYwZ1BTQmlaV2RwYmlBcklHazdYRzVjYmlBZ2NtVjBkWEp1SUhObGNtbGxjenRjYm4xY2JseHVMeW9xWEc0Z0tpQlNaWFIxY201eklHOXlaR1Z5SUc5bUlIWmhiSFZsY3lCaGN5QnBaaUIwYUdWNUlHRnlaU0J6YjNKMFpXUXVYRzRnS2x4dUlDb2dRR1Y0Y0c5eWRGeHVJQ29nUUhCaGNtRnRJSHRoYm5sYlhYMGdkbUZzZFdWeklFbHVjSFYwSUdGeWNtRjVMbHh1SUNvZ1FIQmhjbUZ0SUh0aWIyOXNaV0Z1ZlNCYmNtVjJaWEp6WlQxbVlXeHpaVjBnVjJobGRHaGxjaUIwYnlCeVpYUjFjbTRnY21WMlpYSnpaV1FnYjNKa1pYSXVYRzRnS2lCQWNtVjBkWEp1SUh0dWRXMWlaWEpiWFgwZ1ZHaGxJRzl5WkdWeUlHTnZiWEIxZEdWa0xseHVJQ292WEc1bGVIQnZjblFnWm5WdVkzUnBiMjRnWVhKblUyOXlkQ2gyWVd4MVpYTTZJR0Z1ZVZ0ZExDQnlaWFpsY25ObElEMGdabUZzYzJVcE9pQnVkVzFpWlhKYlhTQjdYRzRnSUdOdmJuTjBJSE52Y25SbWJpQTlJSEpsZG1WeWMyVWdQeUFvWVRvZ1lXNTVXMTBzSUdJNklHRnVlVnRkS1NBOVBpQW9ZbHN3WFNBdElHRmJNRjBwSURvZ0tHRTZJR0Z1ZVZ0ZExDQmlPaUJoYm5sYlhTa2dQVDRnS0dGYk1GMGdMU0JpV3pCZEtUdGNiaUFnWTI5dWMzUWdaR1ZqYjNJZ1BTQW9kam9nWVc1NUxDQnBPaUJ1ZFcxaVpYSXBJRDArSUZ0MkxDQnBYVHNnTHk4Z2MyVjBJR2x1WkdWNElIUnZJSFpoYkhWbFhHNGdJR052Ym5OMElIVnVaR1ZqYjNJZ1BTQW9ZVG9nWVc1NVcxMHBJRDArSUdGYk1WMDdJQzh2SUd4bFlYWmxJRzl1YkhrZ2FXNWtaWGhjYmlBZ1kyOXVjM1FnWDJGeVozTnZjblFnUFNBb1lYSnlPaUJoYm5sYlhTa2dQVDRnWVhKeUxtMWhjQ2hrWldOdmNpa3VjMjl5ZENoemIzSjBabTRwTG0xaGNDaDFibVJsWTI5eUtUdGNiaUFnY21WMGRYSnVJRjloY21kemIzSjBLSFpoYkhWbGN5azdYRzU5WEc1Y2JpOHFLbHh1SUNvZ1VtVjBkWEp1Y3lCMGFHVWdhVzVrWlhobGN5QnZaaUIwYUdVZ2JXOXpkQ0JrYVhabGNuTmxJRzlpYW1WamRITWdZV05qYjNKa2FXNW5JSFJ2SUhSb1pTQmthWE4wSUdaMWJtTjBhVzl1WEc0Z0tpQkFjR0Z5WVcwZ2UyNTFiV0psY24wZ2JHVnVaM1JvSUhSdmRHRnNJRzUxYldKbGNpQnZaaUJ2WW1wbFkzUnpYRzRnS2lCQWNHRnlZVzBnZTI1MWJXSmxjbjBnYmlCdWRXMWlaWElnYjJZZ1pHbDJaWEp6WlNCbGJHVnRaVzUwY3lCMGJ5Qm1hVzVrWEc0Z0tpQkFjR0Z5WVcwZ2V5aHBNVG9nYm5WdFltVnlMQ0JwTWpvZ2JuVnRZbVZ5S1NBOVBpQnVkVzFpWlhKOUlHUnBjM1FnWVNCbWRXNWpkR2x2YmlCM2FHbGphQ0JqWVd4amRXeGhkR1Z6SUdScGMzUmhibU5sSUdKbGRIZGxaVzVjYmlBcUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0IwZDI4Z2IySnFaV04wY3lCMWMybHVaeUIwYUdWcGNpQnBibVJsZUdWelhHNGdLaUJBY21WMGRYSnVjeUI3Ym5WdFltVnlXMTE5SUZSb1pTQnBibVJsZUdWeklHOW1JSFJvWlNCdGIzTjBJR1JwZG1WeWMyVWdiMkpxWldOMGMxeHVJQ292WEc1bGVIQnZjblFnWm5WdVkzUnBiMjRnWjJWMFJHbDJaWEp6WlZOMVluTmxkQ2hzWlc1bmRHZzZJRzUxYldKbGNpd2diam9nYm5WdFltVnlMQ0JrYVhOME9pQW9hVEU2SUc1MWJXSmxjaXdnYVRJNklHNTFiV0psY2lrZ1BUNGdiblZ0WW1WeUtUb2diblZ0WW1WeVcxMGdlMXh1SUNCbWRXNWpkR2x2YmlCdFlYaENlU2gyWVd4MVpYTTZJRWwwWlhKaFlteGxTWFJsY21GMGIzSThiblZ0WW1WeVBpd2diM0prWlhKQ2VUb2dLR2s2SUc1MWJXSmxjaWtnUFQ0Z2JuVnRZbVZ5S1NCN1hHNGdJQ0FnYkdWMElHMWhlRlpoYkhWbElEMGdiblZzYkR0Y2JpQWdJQ0JzWlhRZ2JXRjRUM0prWlhKQ2VTQTlJRzUxYkd3N1hHNWNiaUFnSUNCbWIzSWdLR052Ym5OMElHVnNaVzFsYm5RZ2IyWWdkbUZzZFdWektTQjdYRzRnSUNBZ0lDQmpiMjV6ZENCbGJHVnRaVzUwVDNKa1pYSkNlU0E5SUc5eVpHVnlRbmtvWld4bGJXVnVkQ2s3WEc0Z0lDQWdJQ0JwWmlBb2JXRjRUM0prWlhKQ2VTQTlQU0J1ZFd4c0lIeDhJR1ZzWlcxbGJuUlBjbVJsY2tKNUlENGdiV0Y0VDNKa1pYSkNlU2tnZTF4dUlDQWdJQ0FnSUNCdFlYaFdZV3gxWlNBOUlHVnNaVzFsYm5RN1hHNGdJQ0FnSUNBZ0lHMWhlRTl5WkdWeVFua2dQU0JsYkdWdFpXNTBUM0prWlhKQ2VUdGNiaUFnSUNBZ0lIMWNiaUFnSUNCOVhHNGdJQ0FnY21WMGRYSnVJRzFoZUZaaGJIVmxPMXh1SUNCOVhHNWNiaUFnWTI5dWMzUWdjM1ZpYzJWMElEMGdXM0poYm1SdmJVbHVkQ2hzWlc1bmRHZ2dMU0F4S1YwN1hHNGdJR052Ym5OMElHTnZiWEJzWlcxbGJuUWdQU0J1WlhjZ1UyVjBLQ2s3WEc1Y2JpQWdabTl5SUNoc1pYUWdhU0E5SURBN0lHa2dQQ0JzWlc1bmRHZzdJQ3NyYVNrZ2UxeHVJQ0FnSUdsbUlDZ2hjM1ZpYzJWMExtbHVZMngxWkdWektHa3BLVnh1SUNBZ0lDQWdZMjl0Y0d4bGJXVnVkQzVoWkdRb2FTazdYRzRnSUgxY2JseHVJQ0IzYUdsc1pTQW9jM1ZpYzJWMExteGxibWQwYUNBOElHNHBJSHRjYmlBZ0lDQmpiMjV6ZENCcFpIZ2dQU0J0WVhoQ2VTaGNiaUFnSUNBZ0lHTnZiWEJzWlcxbGJuUXVkbUZzZFdWektDa2dZWE1nU1hSbGNtRmliR1ZKZEdWeVlYUnZjanh1ZFcxaVpYSStMRnh1SUNBZ0lDQWdLR2twSUQwK0lFMWhkR2d1YldsdUxtRndjR3g1S0UxaGRHZ3NJSE4xWW5ObGRDNXRZWEFvWm5WdVkzUnBiMjRvZG1Gc0xDQnBibVJsZUNrZ2UxeHVJQ0FnSUNBZ0lDQnlaWFIxY200Z1pHbHpkQ2hwTENCMllXd3BPMXh1SUNBZ0lDQWdmU2twS1R0Y2JpQWdJQ0JwWmlBb2FXUjRLU0I3WEc0Z0lDQWdJQ0J6ZFdKelpYUXVjSFZ6YUNocFpIZ3BPMXh1SUNBZ0lDQWdZMjl0Y0d4bGJXVnVkQzVrWld4bGRHVW9hV1I0S1R0Y2JpQWdJQ0I5WEc0Z0lIMWNiaUFnY21WMGRYSnVJSE4xWW5ObGREdGNibjFjYmx4dUx5b3FYRzRnS2lCU1pYUjFjbTV6SUc1dmNtMWhiR2w2WldRZ2RtVmpkRzl5WEc0Z0tpQkFjR0Z5WVcwZ2UxWmxZM1J2Y24wZ1pHRjBZU0J1ZFcxbGNtbGpZV3dnWVhKeVlYbGNiaUFxTDF4dVpYaHdiM0owSUdaMWJtTjBhVzl1SUc1dmNtMWhiR2w2WlNoa1lYUmhPaUJXWldOMGIzSXBPaUJXWldOMGIzSWdlMXh1SUNCc1pYUWdiV1ZoYmlBOUlEQTdYRzRnSUd4bGRDQnpkR1FnUFNBd08xeHVYRzRnSUdadmNpQW9iR1YwSUdrZ1BTQXdPeUJwSUR3Z1pHRjBZUzVzWlc1bmRHZzdJQ3NyYVNsY2JpQWdJQ0J0WldGdUlDczlJR1JoZEdGYmFWMDdYRzVjYmlBZ2JXVmhiaUF2UFNCa1lYUmhMbXhsYm1kMGFEdGNibHh1SUNCbWIzSWdLR3hsZENCcElEMGdNRHNnYVNBOElHUmhkR0V1YkdWdVozUm9PeUFySzJrcFhHNGdJQ0FnYzNSa0lDczlJQ2hrWVhSaFcybGRJQzBnYldWaGJpa2dLaUFvWkdGMFlWdHBYU0F0SUcxbFlXNHBPMXh1WEc0Z0lITjBaQ0E5SUUxaGRHZ3VjM0Z5ZENoemRHUWdMeUJrWVhSaExteGxibWQwYUNrN1hHNWNiaUFnWm05eUlDaHNaWFFnYVNBOUlEQTdJR2tnUENCa1lYUmhMbXhsYm1kMGFEc2dLeXRwS1Z4dUlDQWdJR1JoZEdGYmFWMGdQU0FvWkdGMFlWdHBYU0F0SUcxbFlXNHBJQzhnYzNSa08xeHVYRzRnSUhKbGRIVnliaUJrWVhSaE8xeHVmVnh1WEc0dktpcGNiaUFxSUVacGJtUnpJSE5sZENCa2FXWm1aWEpsYm1ObElHSmxkSGRsWlc0Z2RIZHZJR3hwYzNSekxseHVJQ29nUUhCaGNtRnRJSHRoYm5sYlhYMGdZU0JVYUdVZ1ptbHljM1FnYkdsemRDNWNiaUFxSUVCd1lYSmhiU0I3WVc1NVcxMTlJR0lnVkdobElITmxZMjl1WkNCc2FYTjBMbHh1SUNvZ1FISmxkSFZ5YmlCN1lXNTVXMTE5WEc0Z0tpOWNibVY0Y0c5eWRDQm1kVzVqZEdsdmJpQnpaWFJFYVdabVpYSmxibU5sS0dFNklHRnVlVnRkTENCaU9pQmhibmxiWFNrNklHRnVlVnRkSUh0Y2JpQWdZMjl1YzNRZ1lsTmxkQ0E5SUc1bGR5QlRaWFFvWWlrN1hHNGdJSEpsZEhWeWJpQkJjbkpoZVM1bWNtOXRLRzVsZHlCVFpYUW9ZUzVtYVd4MFpYSW9LSGdwSUQwK0lDRmlVMlYwTG1oaGN5aDRLU2twTG5aaGJIVmxjeWdwS1R0Y2JuMWNiaUpkZlE9PSIsImltcG9ydCB7IFNlcVBhbGV0dGVCYXNlIH0gZnJvbSAnLi9zZXEtcGFsZXR0ZXMnO1xuZXhwb3J0IGNsYXNzIEFtaW5vYWNpZHNQYWxldHRlcyBleHRlbmRzIFNlcVBhbGV0dGVCYXNlIHtcbiAgICBzdGF0aWMgZ2V0IExlc2soKSB7XG4gICAgICAgIGlmICh0aGlzLmxlc2sgPT09IHZvaWQgMCkge1xuICAgICAgICAgICAgdGhpcy5sZXNrID0gdGhpcy5tYWtlUGFsZXR0ZShbXG4gICAgICAgICAgICAgICAgW1snRycsICdBJywgJ1MnLCAnVCddLCAnb3JhbmdlJ10sXG4gICAgICAgICAgICAgICAgW1snQycsICdWJywgJ0knLCAnTCcsICdQJywgJ0YnLCAnWScsICdNJywgJ1cnXSwgJ2FsbF9ncmVlbiddLFxuICAgICAgICAgICAgICAgIFtbJ04nLCAnUScsICdIJ10sICdtYWdlbnRhJ10sXG4gICAgICAgICAgICAgICAgW1snRCcsICdFJ10sICdyZWQnXSxcbiAgICAgICAgICAgICAgICBbWydLJywgJ1InXSwgJ2FsbF9ibHVlJ10sXG4gICAgICAgICAgICBdLCBmYWxzZSwgQW1pbm9hY2lkc1BhbGV0dGVzKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5sZXNrO1xuICAgIH1cbiAgICBzdGF0aWMgZ2V0IEdyb2tHcm91cHMoKSB7XG4gICAgICAgIGlmICh0aGlzLmdyb2tHcm91cHMgPT09IHZvaWQgMCkge1xuICAgICAgICAgICAgdGhpcy5ncm9rR3JvdXBzID0gdGhpcy5tYWtlUGFsZXR0ZShbXG4gICAgICAgICAgICAgICAgW1snQycsICdVJ10sICd5ZWxsb3cnXSxcbiAgICAgICAgICAgICAgICBbWydHJywgJ1AnXSwgJ3JlZCddLFxuICAgICAgICAgICAgICAgIFtbJ0EnLCAnVicsICdJJywgJ0wnLCAnTScsICdGJywgJ1knLCAnVyddLCAnYWxsX2dyZWVuJ10sXG4gICAgICAgICAgICAgICAgW1snUicsICdIJywgJ0snXSwgJ2xpZ2h0X2JsdWUnXSxcbiAgICAgICAgICAgICAgICBbWydEJywgJ0UnXSwgJ2RhcmtfYmx1ZSddLFxuICAgICAgICAgICAgICAgIFtbJ1MnLCAnVCcsICdOJywgJ1EnXSwgJ29yYW5nZSddLFxuICAgICAgICAgICAgXSwgZmFsc2UsIEFtaW5vYWNpZHNQYWxldHRlcyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuZ3Jva0dyb3VwcztcbiAgICB9XG4gICAgc3RhdGljIGdldCBSYXNNb2woKSB7XG4gICAgICAgIGlmICh0aGlzLnJhc01vbCA9PT0gdm9pZCAwKSB7XG4gICAgICAgICAgICB0aGlzLnJhc01vbCA9IG5ldyBBbWlub2FjaWRzUGFsZXR0ZXMoe1xuICAgICAgICAgICAgICAgIC8vIGh0dHA6Ly9hY2Nlcy5lbnMtbHlvbi5mci9iaW90aWMvcmFzdG9wL2hlbHAvY29sb3VyLmh0bVxuICAgICAgICAgICAgICAgICdEJzogJyNFNjBBMEEnLFxuICAgICAgICAgICAgICAgICdFJzogJyNFNjBBMEEnLFxuICAgICAgICAgICAgICAgICdDJzogJyNFNkU2MDAnLFxuICAgICAgICAgICAgICAgICdNJzogJyNFNkU2MDAnLFxuICAgICAgICAgICAgICAgICdLJzogJyMxNDVBRkYnLFxuICAgICAgICAgICAgICAgICdSJzogJyMxNDVBRkYnLFxuICAgICAgICAgICAgICAgICdTJzogJyNGQTk2MDAnLFxuICAgICAgICAgICAgICAgICdUJzogJyNGQTk2MDAnLFxuICAgICAgICAgICAgICAgICdGJzogJyMzMjMyQUEnLFxuICAgICAgICAgICAgICAgICdZJzogJyMzMjMyQUEnLFxuICAgICAgICAgICAgICAgICdOJzogJyMwMERDREMnLFxuICAgICAgICAgICAgICAgICdRJzogJyMwMERDREMnLFxuICAgICAgICAgICAgICAgICdHJzogJyNFQkVCRUInLFxuICAgICAgICAgICAgICAgICdMJzogJyMwRjgyMEYnLFxuICAgICAgICAgICAgICAgICdWJzogJyMwRjgyMEYnLFxuICAgICAgICAgICAgICAgICdJJzogJyMwRjgyMEYnLFxuICAgICAgICAgICAgICAgICdBJzogJyNDOEM4QzgnLFxuICAgICAgICAgICAgICAgICdXJzogJyNCNDVBQjQnLFxuICAgICAgICAgICAgICAgICdIJzogJyM4MjgyRDInLFxuICAgICAgICAgICAgICAgICdQJzogJyNEQzk2ODInLFxuICAgICAgICAgICAgICAgICdvdGhlcnMnOiAnI0JFQTA2RScsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5yYXNNb2w7XG4gICAgfVxuICAgIGdldChtKSB7XG4gICAgICAgIGNvbnN0IHJlc00gPSBtIGluIEFtaW5vYWNpZHNQYWxldHRlcy5hYVN5bm9ueW1zID8gQW1pbm9hY2lkc1BhbGV0dGVzLmFhU3lub255bXNbbV0gOiBtO1xuICAgICAgICBjb25zdCByZXMgPSBzdXBlci5nZXQocmVzTSk7XG4gICAgICAgIHJldHVybiByZXM7XG4gICAgfVxufVxuLyoqIE9ubHkgc29tZSBvZiB0aGUgc3lub255bXMuIFRoZXNlIHdlcmUgb2J0YWluZWQgZnJvbSB0aGUgY2x1c3RlcmVkIG9saWdvcGVwdGlkZSBkYXRhc2V0LiAqL1xuQW1pbm9hY2lkc1BhbGV0dGVzLmFhU3lub255bXMgPSB7XG4gICAgJ01lTmxlJzogJ0wnLFxuICAgICdNZUEnOiAnQScsXG4gICAgJ01lRyc6ICdHJyxcbiAgICAnTWVGJzogJ0YnLFxufTtcbmV4cG9ydCBjbGFzcyBBbWlub2FjaWRzIHtcbiAgICBzdGF0aWMgZ2V0UGFsZXR0ZShzY2hlbWUgPSAnZ3JvaycpIHtcbiAgICAgICAgc3dpdGNoIChzY2hlbWUpIHtcbiAgICAgICAgICAgIGNhc2UgJ2dyb2snOlxuICAgICAgICAgICAgICAgIHJldHVybiBBbWlub2FjaWRzUGFsZXR0ZXMuR3Jva0dyb3VwcztcbiAgICAgICAgICAgIGNhc2UgJ2xlc2snOlxuICAgICAgICAgICAgICAgIHJldHVybiBBbWlub2FjaWRzUGFsZXR0ZXMuTGVzaztcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDaGVtUGFsZXR0ZTogc2NoZW1lIFxcYCR7c2NoZW1lfVxcYCBkb2VzIG5vdCBleGlzdGApO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgZGl2aWRlZCBhbWlubyBhY2lkIHdpdGggaXRzIGNvbnRlbnQgaW4gdGhlIGJyYWNrZXQsIGlmIHRoZSBjb250ZW50IGlzIG51bWJlciwgdGhlbiBpdHMgb21pdHRlZFxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGMgcmF3IGFtaW5vXG4gICAgICogQHJldHVybiB7W3N0cmluZywgc3RyaW5nXX0gb3V0ZXIgYW5kIGlubmVyIGNvbnRlbnRcbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0SW5uZXJPdXRlcihjKSB7XG4gICAgICAgIGxldCBpc0lubmVyID0gMDtcbiAgICAgICAgbGV0IGlubmVyID0gJyc7XG4gICAgICAgIGxldCBvdXRlciA9ICcnO1xuICAgICAgICBmb3IgKGNvbnN0IGNoYXIgb2YgYykge1xuICAgICAgICAgICAgaWYgKGNoYXIgPT0gJygnKVxuICAgICAgICAgICAgICAgIGlzSW5uZXIrKztcbiAgICAgICAgICAgIGVsc2UgaWYgKGNoYXIgPT0gJyknKVxuICAgICAgICAgICAgICAgIGlzSW5uZXItLTtcbiAgICAgICAgICAgIGVsc2UgaWYgKGlzSW5uZXIpXG4gICAgICAgICAgICAgICAgaW5uZXIgKz0gY2hhcjtcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICBvdXRlciArPSBjaGFyO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAhaXNOYU4ocGFyc2VJbnQoaW5uZXIpKSA/IFtvdXRlciwgJyddIDogW291dGVyLCBpbm5lcl07XG4gICAgfVxuICAgIHN0YXRpYyBnZXRDb2xvckFBUGl2b3QobW9ub21lciA9ICcnLCBzY2hlbWUgPSAnZ3JvaycpIHtcbiAgICAgICAgdmFyIF9hLCBfYiwgX2M7XG4gICAgICAgIC8vY29uc3QgY2hlbVBhbGV0dGVJbnN0YW5jZSA9IEFBUGFsZXR0ZXMuR3Jva0dyb3VwcygpO1xuICAgICAgICBjb25zdCBjaGVtUGFsZXR0ZUluc3RhbmNlID0gdGhpcy5nZXRQYWxldHRlKHNjaGVtZSk7XG4gICAgICAgIGxldCBbb3V0ZXJNb25vbWVyLCBpbm5lck1vbm9tZXJdID0gdGhpcy5nZXRJbm5lck91dGVyKG1vbm9tZXIpO1xuICAgICAgICBvdXRlck1vbm9tZXIgPSAob3V0ZXJNb25vbWVyLmxlbmd0aCA+IDYgPyBgJHtvdXRlck1vbm9tZXIuc2xpY2UoMCwgMyl9Li4uYCA6IG91dGVyTW9ub21lcik7XG4gICAgICAgIGlubmVyTW9ub21lciA9IChpbm5lck1vbm9tZXIubGVuZ3RoID4gNiA/IGAke2lubmVyTW9ub21lci5zbGljZSgwLCAzKX0uLi5gIDogaW5uZXJNb25vbWVyKTtcbiAgICAgICAgaWYgKG1vbm9tZXIubGVuZ3RoID09IDEgfHwgbW9ub21lclsxXSA9PSAnKCcpIHtcbiAgICAgICAgICAgIGNvbnN0IGFtaW5vID0gKF9hID0gbW9ub21lclswXSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnRvVXBwZXJDYXNlKCk7XG4gICAgICAgICAgICByZXR1cm4gYW1pbm8gaW4gY2hlbVBhbGV0dGVJbnN0YW5jZSA/XG4gICAgICAgICAgICAgICAgW2NoZW1QYWxldHRlSW5zdGFuY2UuZ2V0KGFtaW5vKSwgYW1pbm8sIGlubmVyTW9ub21lciwgMV0gOlxuICAgICAgICAgICAgICAgIFt0aGlzLnVuZGVmaW5lZENvbG9yLCBvdXRlck1vbm9tZXIsIGlubmVyTW9ub21lciwgMV07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1vbm9tZXJbMF0gPT0gJ2QnICYmIG1vbm9tZXJbMV0gaW4gY2hlbVBhbGV0dGVJbnN0YW5jZSkge1xuICAgICAgICAgICAgaWYgKG1vbm9tZXIubGVuZ3RoID09IDIgfHwgbW9ub21lclsyXSA9PSAnKCcpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBhbWlubyA9IChfYiA9IG1vbm9tZXJbMV0pID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi50b1VwcGVyQ2FzZSgpO1xuICAgICAgICAgICAgICAgIHJldHVybiBhbWlubyBpbiBjaGVtUGFsZXR0ZUluc3RhbmNlID9cbiAgICAgICAgICAgICAgICAgICAgW2NoZW1QYWxldHRlSW5zdGFuY2UuZ2V0KGFtaW5vKSwgYW1pbm8sIGlubmVyTW9ub21lciwgMl0gOlxuICAgICAgICAgICAgICAgICAgICBbdGhpcy51bmRlZmluZWRDb2xvciwgb3V0ZXJNb25vbWVyLCBpbm5lck1vbm9tZXIsIDJdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChtb25vbWVyLnN1YnN0cmluZygwLCAzKSBpbiB0aGlzLkFBRnVsbE5hbWVzKSB7XG4gICAgICAgICAgICBpZiAobW9ub21lci5sZW5ndGggPT0gMyB8fCBtb25vbWVyWzNdID09ICcoJykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGFtaW5vID0gdGhpcy5BQUZ1bGxOYW1lc1ttb25vbWVyLnN1YnN0cmluZygwLCAzKV07XG4gICAgICAgICAgICAgICAgcmV0dXJuIGFtaW5vIGluIGNoZW1QYWxldHRlSW5zdGFuY2UgP1xuICAgICAgICAgICAgICAgICAgICBbY2hlbVBhbGV0dGVJbnN0YW5jZS5nZXQoYW1pbm8pLCBhbWlubywgaW5uZXJNb25vbWVyLCAzXSA6XG4gICAgICAgICAgICAgICAgICAgIFt0aGlzLnVuZGVmaW5lZENvbG9yLCBvdXRlck1vbm9tZXIsIGlubmVyTW9ub21lciwgM107XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCgoX2MgPSBtb25vbWVyWzBdKSA9PT0gbnVsbCB8fCBfYyA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2MudG9Mb3dlckNhc2UoKSkgPT0gbW9ub21lclswXSkge1xuICAgICAgICAgICAgaWYgKG1vbm9tZXIuc3Vic3RyaW5nKDEsIDMpIGluIHRoaXMuQUFGdWxsTmFtZXMpIHtcbiAgICAgICAgICAgICAgICBpZiAobW9ub21lci5sZW5ndGggPT0gNCB8fCBtb25vbWVyWzRdID09ICcoJykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBhbWlubyA9IHRoaXMuQUFGdWxsTmFtZXNbbW9ub21lci5zdWJzdHJpbmcoMSwgMyldO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYW1pbm8gaW4gY2hlbVBhbGV0dGVJbnN0YW5jZSA/XG4gICAgICAgICAgICAgICAgICAgICAgICBbY2hlbVBhbGV0dGVJbnN0YW5jZS5nZXQoYW1pbm8pLCBhbWlubywgaW5uZXJNb25vbWVyLCA0XSA6XG4gICAgICAgICAgICAgICAgICAgICAgICBbdGhpcy51bmRlZmluZWRDb2xvciwgb3V0ZXJNb25vbWVyLCBpbm5lck1vbm9tZXIsIDRdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gW3RoaXMudW5kZWZpbmVkQ29sb3IsIG91dGVyTW9ub21lciwgaW5uZXJNb25vbWVyLCAwXTtcbiAgICB9XG59XG5BbWlub2FjaWRzLlNlbVR5cGUgPSAnQW1pbm9hY2lkcyc7XG5BbWlub2FjaWRzLlNlbVR5cGVNdWx0aXBsZUFsaWdubWVudCA9ICdBbWlub2FjaWRzTXVsdGlwbGVBbGlnbm1lbnQnO1xuQW1pbm9hY2lkcy51bmRlZmluZWRDb2xvciA9ICdyZ2IoMTAwLDEwMCwxMDApJztcbkFtaW5vYWNpZHMuTmFtZXMgPSB7XG4gICAgJ0cnOiAnR2x5Y2luZScsXG4gICAgJ0wnOiAnTGV1Y2luZScsXG4gICAgJ1knOiAnVHlyb3NpbmUnLFxuICAgICdTJzogJ1NlcmluZScsXG4gICAgJ0UnOiAnR2x1dGFtaWMgYWNpZCcsXG4gICAgJ1EnOiAnR2x1dGFtaW5lJyxcbiAgICAnRCc6ICdBc3BhcnRpYyBhY2lkJyxcbiAgICAnTic6ICdBc3BhcmFnaW5lJyxcbiAgICAnRic6ICdQaGVueWxhbGFuaW5lJyxcbiAgICAnQSc6ICdBbGFuaW5lJyxcbiAgICAnSyc6ICdMeXNpbmUnLFxuICAgICdSJzogJ0FyZ2luaW5lJyxcbiAgICAnSCc6ICdIaXN0aWRpbmUnLFxuICAgICdDJzogJ0N5c3RlaW5lJyxcbiAgICAnVic6ICdWYWxpbmUnLFxuICAgICdQJzogJ1Byb2xpbmUnLFxuICAgICdXJzogJ1RyeXB0b3BoYW4nLFxuICAgICdJJzogJ0lzb2xldWNpbmUnLFxuICAgICdNJzogJ01ldGhpb25pbmUnLFxuICAgICdUJzogJ1RocmVvbmluZScsXG59O1xuQW1pbm9hY2lkcy5BQVNtaWxlcyA9IHtcbiAgICAnRyc6ICdOQ0MoPU8pTycsXG4gICAgJ0wnOiAnTltDQEhdKENDKEMpQylDKD1PKU8nLFxuICAgICdZJzogJ05DKENDMT1DQz1DKE8pQz1DMSlDKD1PKU8nLFxuICAgICdTJzogJ05DKENPKUMoPU8pTycsXG4gICAgJ0UnOiAnTltDQEBIXShDQ0MoTyk9TylDKD1PKU8nLFxuICAgICdRJzogJ05bQ0BASF0oQ0NDKE4pPU8pQyg9TylPJyxcbiAgICAnRCc6ICdOW0NAQEhdKENDKE8pPU8pQyg9TylPJyxcbiAgICAnTic6ICdOW0NAQEhdKENDKE4pPU8pQyg9TylPJyxcbiAgICAnRic6ICdOQyhDQzE9Q0M9Q0M9QzEpQyg9TylPJyxcbiAgICAnQSc6ICdOW0NASF0oQylDKD1PKU8nLFxuICAgICdLJzogJ05DKENDQ0NOKUMoPU8pTycsXG4gICAgJ1InOiAnTltDQEhdKENDQ05DKD1OKUMpQyg9TylPJyxcbiAgICAnSCc6ICdOQyhDQzE9Q049Q1tOXTEpQyg9TylPJyxcbiAgICAnQyc6ICdOW0NAQEhdKENTKUMoPU8pTycsXG4gICAgJ1YnOiAnTkMoQyhDKUMpQyg9TylPJyxcbiAgICAnUCc6ICdOKENDQzEpQzFDKD1PKU8nLFxuICAgICdXJzogJ05bQ0BASF0oQ2MxYzJjY2NjYzJuKFtIXSljMSlDKD1PKU8nLFxuICAgICdJJzogJ05bQ0BIXShbQ0BIXShDKUNDKUMoPU8pTycsXG4gICAgJ00nOiAnTkMoQ0NTQylDKD1PKU8nLFxuICAgICdUJzogJ05DKEMoTylDKUMoPU8pTycsXG59O1xuQW1pbm9hY2lkcy5BQVNtaWxlc1RydW5jYXRlZCA9IHtcbiAgICAnRyc6ICcqQyonLFxuICAgICdMJzogJ0NDKEMpQ1tDQEhdKCopKicsXG4gICAgJ1knOiAnQzE9Q0MoPUNDPUMxQ0MoKikqKU8nLFxuICAgICdTJzogJ09DQygqKUMqJyxcbiAgICAnRSc6ICcqW0NAQEhdKENDQyhPKT1PKSonLFxuICAgICdRJzogJypOW0NAQEhdKENDQyhOKT1PKSonLFxuICAgICdEJzogJypbQ0BASF0oQ0MoTyk9TykqJyxcbiAgICAnTic6ICcqW0NAQEhdKENDKE4pPU8pKicsXG4gICAgJ0YnOiAnQzE9Q0M9QyhDPUMxKUNDKCopKicsXG4gICAgJ0EnOiAnQ1tDQEhdKCopKicsXG4gICAgJ0snOiAnQyhDQ04pQ0MoKikqJyxcbiAgICAnUic6ICcqW0NASF0oQ0NDTkMoPU4pQykqJyxcbiAgICAnSCc6ICdDMT1DKE5DPU4xKUNDKCopKicsXG4gICAgJ0MnOiAnQyhbQ0BASF0oKikqKVMnLFxuICAgICdWJzogJ0NDKEMpQygqKSonLFxuICAgICdQJzogJ0MxQ0NOKCopQzEqJyxcbiAgICAnVyc6ICcqW0NAQEhdKENjMWMyY2NjY2MybihbSF0pYzEpKicsXG4gICAgJ0knOiAnQ0NbQ0BIXShDKVtDQEhdKCopKicsXG4gICAgJ00nOiAnQ1NDQ0MoKikqJyxcbiAgICAnVCc6ICdDQyhPKUMoKikqJyxcbn07XG4vKiogVE9ETzogRnVsbD9cbiAqL1xuQW1pbm9hY2lkcy5BQUZ1bGxOYW1lcyA9IHtcbiAgICAnQWxhJzogJ0EnLFxuICAgICdBcmcnOiAnUicsXG4gICAgJ0Fzbic6ICdOJyxcbiAgICAnQXNwJzogJ0QnLFxuICAgICdDeXMnOiAnQycsXG4gICAgJ0dsbic6ICdRJyxcbiAgICAnR2x1JzogJ0UnLFxuICAgICdHbHknOiAnRycsXG4gICAgJ0hpcyc6ICdIJyxcbiAgICAnSWxlJzogJ0knLFxuICAgICdMZXUnOiAnTCcsXG4gICAgJ0x5cyc6ICdLJyxcbiAgICAnTWV0JzogJ00nLFxuICAgICdQaGUnOiAnRicsXG4gICAgJ1Bybyc6ICdQJyxcbiAgICAnU2VyJzogJ1MnLFxuICAgICdUaHInOiAnVCcsXG4gICAgJ1RycCc6ICdXJyxcbiAgICAnVHlyJzogJ1knLFxuICAgICdWYWwnOiAnVicsXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZGF0YTphcHBsaWNhdGlvbi9qc29uO2Jhc2U2NCxleUoyWlhKemFXOXVJam96TENKbWFXeGxJam9pWVcxcGJtOWhZMmxrY3k1cWN5SXNJbk52ZFhKalpWSnZiM1FpT2lJaUxDSnpiM1Z5WTJWeklqcGJJbUZ0YVc1dllXTnBaSE11ZEhNaVhTd2libUZ0WlhNaU9sdGRMQ0p0WVhCd2FXNW5jeUk2SWtGQlMwRXNUMEZCVHl4RlFVRmhMR05CUVdNc1JVRkJReXhOUVVGTkxHZENRVUZuUWl4RFFVRkRPMEZCUlRGRUxFMUJRVTBzVDBGQlR5eHJRa0ZCYlVJc1UwRkJVU3hqUVVGak8wbEJSemRETEUxQlFVMHNTMEZCU3l4SlFVRkpPMUZCUTNCQ0xFbEJRVWtzU1VGQlNTeERRVUZETEVsQlFVa3NTMEZCU3l4TFFVRkxMRU5CUVVNc1JVRkJSVHRaUVVONFFpeEpRVUZKTEVOQlFVTXNTVUZCU1N4SFFVRkhMRWxCUVVrc1EwRkJReXhYUVVGWExFTkJRVU03WjBKQlF6TkNMRU5CUVVNc1EwRkJReXhIUVVGSExFVkJRVVVzUjBGQlJ5eEZRVUZGTEVkQlFVY3NSVUZCUlN4SFFVRkhMRU5CUVVNc1JVRkJSU3hSUVVGUkxFTkJRVU03WjBKQlEyaERMRU5CUVVNc1EwRkJReXhIUVVGSExFVkJRVVVzUjBGQlJ5eEZRVUZGTEVkQlFVY3NSVUZCUlN4SFFVRkhMRVZCUVVVc1IwRkJSeXhGUVVGRkxFZEJRVWNzUlVGQlJTeEhRVUZITEVWQlFVVXNSMEZCUnl4RlFVRkZMRWRCUVVjc1EwRkJReXhGUVVGRkxGZEJRVmNzUTBGQlF6dG5Ra0ZETlVRc1EwRkJReXhEUVVGRExFZEJRVWNzUlVGQlJTeEhRVUZITEVWQlFVVXNSMEZCUnl4RFFVRkRMRVZCUVVVc1UwRkJVeXhEUVVGRE8yZENRVU0xUWl4RFFVRkRMRU5CUVVNc1IwRkJSeXhGUVVGRkxFZEJRVWNzUTBGQlF5eEZRVUZGTEV0QlFVc3NRMEZCUXp0blFrRkRia0lzUTBGQlF5eERRVUZETEVkQlFVY3NSVUZCUlN4SFFVRkhMRU5CUVVNc1JVRkJSU3hWUVVGVkxFTkJRVU03WVVGRGVrSXNSVUZCUlN4TFFVRkxMRVZCUVVVc2EwSkJRV3RDTEVOQlFVTXNRMEZCUXp0VFFVTXZRanRSUVVORUxFOUJRVThzU1VGQlNTeERRVUZETEVsQlFVa3NRMEZCUXp0SlFVTnVRaXhEUVVGRE8wbEJTVTBzVFVGQlRTeExRVUZMTEZWQlFWVTdVVUZETVVJc1NVRkJTU3hKUVVGSkxFTkJRVU1zVlVGQlZTeExRVUZMTEV0QlFVc3NRMEZCUXl4RlFVRkZPMWxCUXpsQ0xFbEJRVWtzUTBGQlF5eFZRVUZWTEVkQlFVY3NTVUZCU1N4RFFVRkRMRmRCUVZjc1EwRkJRenRuUWtGRGFrTXNRMEZCUXl4RFFVRkRMRWRCUVVjc1JVRkJSU3hIUVVGSExFTkJRVU1zUlVGQlJTeFJRVUZSTEVOQlFVTTdaMEpCUTNSQ0xFTkJRVU1zUTBGQlF5eEhRVUZITEVWQlFVVXNSMEZCUnl4RFFVRkRMRVZCUVVVc1MwRkJTeXhEUVVGRE8yZENRVU51UWl4RFFVRkRMRU5CUVVNc1IwRkJSeXhGUVVGRkxFZEJRVWNzUlVGQlJTeEhRVUZITEVWQlFVVXNSMEZCUnl4RlFVRkZMRWRCUVVjc1JVRkJSU3hIUVVGSExFVkJRVVVzUjBGQlJ5eEZRVUZGTEVkQlFVY3NRMEZCUXl4RlFVRkZMRmRCUVZjc1EwRkJRenRuUWtGRGRrUXNRMEZCUXl4RFFVRkRMRWRCUVVjc1JVRkJSU3hIUVVGSExFVkJRVVVzUjBGQlJ5eERRVUZETEVWQlFVVXNXVUZCV1N4RFFVRkRPMmRDUVVNdlFpeERRVUZETEVOQlFVTXNSMEZCUnl4RlFVRkZMRWRCUVVjc1EwRkJReXhGUVVGRkxGZEJRVmNzUTBGQlF6dG5Ra0ZEZWtJc1EwRkJReXhEUVVGRExFZEJRVWNzUlVGQlJTeEhRVUZITEVWQlFVVXNSMEZCUnl4RlFVRkZMRWRCUVVjc1EwRkJReXhGUVVGRkxGRkJRVkVzUTBGQlF6dGhRVU5xUXl4RlFVRkZMRXRCUVVzc1JVRkJSU3hyUWtGQmEwSXNRMEZCUXl4RFFVRkRPMU5CUXk5Q08xRkJRMFFzVDBGQlR5eEpRVUZKTEVOQlFVTXNWVUZCVlN4RFFVRkRPMGxCUTNwQ0xFTkJRVU03U1VGSlRTeE5RVUZOTEV0QlFVc3NUVUZCVFR0UlFVTjBRaXhKUVVGSkxFbEJRVWtzUTBGQlF5eE5RVUZOTEV0QlFVc3NTMEZCU3l4RFFVRkRMRVZCUVVVN1dVRkRNVUlzU1VGQlNTeERRVUZETEUxQlFVMHNSMEZCUnl4SlFVRkpMR3RDUVVGclFpeERRVUZETzJkQ1FVTnVReXg1UkVGQmVVUTdaMEpCUTNwRUxFZEJRVWNzUlVGQlJTeFRRVUZUTzJkQ1FVTmtMRWRCUVVjc1JVRkJSU3hUUVVGVE8yZENRVU5rTEVkQlFVY3NSVUZCUlN4VFFVRlRPMmRDUVVOa0xFZEJRVWNzUlVGQlJTeFRRVUZUTzJkQ1FVTmtMRWRCUVVjc1JVRkJSU3hUUVVGVE8yZENRVU5rTEVkQlFVY3NSVUZCUlN4VFFVRlRPMmRDUVVOa0xFZEJRVWNzUlVGQlJTeFRRVUZUTzJkQ1FVTmtMRWRCUVVjc1JVRkJSU3hUUVVGVE8yZENRVU5rTEVkQlFVY3NSVUZCUlN4VFFVRlRPMmRDUVVOa0xFZEJRVWNzUlVGQlJTeFRRVUZUTzJkQ1FVTmtMRWRCUVVjc1JVRkJSU3hUUVVGVE8yZENRVU5rTEVkQlFVY3NSVUZCUlN4VFFVRlRPMmRDUVVOa0xFZEJRVWNzUlVGQlJTeFRRVUZUTzJkQ1FVTmtMRWRCUVVjc1JVRkJSU3hUUVVGVE8yZENRVU5rTEVkQlFVY3NSVUZCUlN4VFFVRlRPMmRDUVVOa0xFZEJRVWNzUlVGQlJTeFRRVUZUTzJkQ1FVTmtMRWRCUVVjc1JVRkJSU3hUUVVGVE8yZENRVU5rTEVkQlFVY3NSVUZCUlN4VFFVRlRPMmRDUVVOa0xFZEJRVWNzUlVGQlJTeFRRVUZUTzJkQ1FVTmtMRWRCUVVjc1JVRkJSU3hUUVVGVE8yZENRVU5rTEZGQlFWRXNSVUZCUlN4VFFVRlRPMkZCUTNCQ0xFTkJRVU1zUTBGQlF6dFRRVU5LTzFGQlEwUXNUMEZCVHl4SlFVRkpMRU5CUVVNc1RVRkJUU3hEUVVGRE8wbEJRM0pDTEVOQlFVTTdTVUZGWlN4SFFVRkhMRU5CUVVNc1EwRkJVenRSUVVNelFpeE5RVUZOTEVsQlFVa3NSMEZCUnl4RFFVRkRMRWxCUVVrc2EwSkJRV3RDTEVOQlFVTXNWVUZCVlN4RFFVRkRMRU5CUVVNc1EwRkJReXhyUWtGQmEwSXNRMEZCUXl4VlFVRlZMRU5CUVVNc1EwRkJReXhEUVVGRExFTkJRVU1zUTBGQlF5eERRVUZETEVOQlFVTXNRMEZCUXp0UlFVTjJSaXhOUVVGTkxFZEJRVWNzUjBGQlJ5eExRVUZMTEVOQlFVTXNSMEZCUnl4RFFVRkRMRWxCUVVrc1EwRkJReXhEUVVGRE8xRkJRelZDTEU5QlFVOHNSMEZCUnl4RFFVRkRPMGxCUTJJc1EwRkJRenM3UVVGRlJDdzRSa0ZCT0VZN1FVRkRMMFVzTmtKQlFWVXNSMEZCSzBJN1NVRkRkRVFzVDBGQlR5eEZRVUZGTEVkQlFVYzdTVUZEV2l4TFFVRkxMRVZCUVVVc1IwRkJSenRKUVVOV0xFdEJRVXNzUlVGQlJTeEhRVUZITzBsQlExWXNTMEZCU3l4RlFVRkZMRWRCUVVjN1EwRkRXQ3hEUVVGRE8wRkJSMG9zVFVGQlRTeFBRVUZQTEZWQlFWVTdTVUZ4UjJRc1RVRkJUU3hEUVVGRExGVkJRVlVzUTBGQlF5eFRRVUZwUWl4TlFVRk5PMUZCUXpsRExGRkJRVkVzVFVGQlRTeEZRVUZGTzFsQlEyaENMRXRCUVVzc1RVRkJUVHRuUWtGRFZDeFBRVUZQTEd0Q1FVRnJRaXhEUVVGRExGVkJRVlVzUTBGQlF6dFpRVU4yUXl4TFFVRkxMRTFCUVUwN1owSkJRMVFzVDBGQlR5eHJRa0ZCYTBJc1EwRkJReXhKUVVGSkxFTkJRVU03V1VGRGFrTTdaMEpCUTBVc1RVRkJUU3hKUVVGSkxFdEJRVXNzUTBGQlF5eDVRa0ZCZVVJc1RVRkJUU3h0UWtGQmJVSXNRMEZCUXl4RFFVRkRPMU5CUTNKRk8wbEJRMGdzUTBGQlF6dEpRVVZFT3pzN096dFBRVXRITzBsQlEwa3NUVUZCVFN4RFFVRkRMR0ZCUVdFc1EwRkJReXhEUVVGVE8xRkJRMjVETEVsQlFVa3NUMEZCVHl4SFFVRkhMRU5CUVVNc1EwRkJRenRSUVVOb1FpeEpRVUZKTEV0QlFVc3NSMEZCUnl4RlFVRkZMRU5CUVVNN1VVRkRaaXhKUVVGSkxFdEJRVXNzUjBGQlJ5eEZRVUZGTEVOQlFVTTdVVUZGWml4TFFVRkxMRTFCUVUwc1NVRkJTU3hKUVVGSkxFTkJRVU1zUlVGQlJUdFpRVU53UWl4SlFVRkpMRWxCUVVrc1NVRkJTU3hIUVVGSE8yZENRVU5pTEU5QlFVOHNSVUZCUlN4RFFVRkRPMmxDUVVOUUxFbEJRVWtzU1VGQlNTeEpRVUZKTEVkQlFVYzdaMEpCUTJ4Q0xFOUJRVThzUlVGQlJTeERRVUZETzJsQ1FVTlFMRWxCUVVrc1QwRkJUenRuUWtGRFpDeExRVUZMTEVsQlFVa3NTVUZCU1N4RFFVRkRPenRuUWtGRlpDeExRVUZMTEVsQlFVa3NTVUZCU1N4RFFVRkRPMU5CUTJwQ08xRkJSVVFzVDBGQlR5eERRVUZETEV0QlFVc3NRMEZCUXl4UlFVRlJMRU5CUVVNc1MwRkJTeXhEUVVGRExFTkJRVU1zUTBGQlF5eERRVUZETEVOQlFVTXNRMEZCUXl4TFFVRkxMRVZCUVVVc1JVRkJSU3hEUVVGRExFTkJRVU1zUTBGQlF5eERRVUZETEVOQlFVTXNTMEZCU3l4RlFVRkZMRXRCUVVzc1EwRkJReXhEUVVGRE8wbEJRMmhGTEVOQlFVTTdTVUZGVFN4TlFVRk5MRU5CUVVNc1pVRkJaU3hEUVVGRExGVkJRV3RDTEVWQlFVVXNSVUZCUlN4VFFVRnBRaXhOUVVGTk96dFJRVU42UlN4elJFRkJjMFE3VVVGRGRFUXNUVUZCVFN4dFFrRkJiVUlzUjBGQlJ5eEpRVUZKTEVOQlFVTXNWVUZCVlN4RFFVRkRMRTFCUVUwc1EwRkJReXhEUVVGRE8xRkJRM0JFTEVsQlFVa3NRMEZCUXl4WlFVRlpMRVZCUVVVc1dVRkJXU3hEUVVGRExFZEJRVWNzU1VGQlNTeERRVUZETEdGQlFXRXNRMEZCUXl4UFFVRlBMRU5CUVVNc1EwRkJRenRSUVVNdlJDeFpRVUZaTEVkQlFVY3NRMEZCUXl4WlFVRlpMRU5CUVVNc1RVRkJUU3hIUVVGSExFTkJRVU1zUTBGQlF5eERRVUZETEVOQlFVTXNSMEZCUnl4WlFVRlpMRU5CUVVNc1MwRkJTeXhEUVVGRExFTkJRVU1zUlVGQlJTeERRVUZETEVOQlFVTXNTMEZCU3l4RFFVRkRMRU5CUVVNc1EwRkJReXhaUVVGWkxFTkJRVU1zUTBGQlF6dFJRVU16Uml4WlFVRlpMRWRCUVVjc1EwRkJReXhaUVVGWkxFTkJRVU1zVFVGQlRTeEhRVUZITEVOQlFVTXNRMEZCUXl4RFFVRkRMRU5CUVVNc1IwRkJSeXhaUVVGWkxFTkJRVU1zUzBGQlN5eERRVUZETEVOQlFVTXNSVUZCUlN4RFFVRkRMRU5CUVVNc1MwRkJTeXhEUVVGRExFTkJRVU1zUTBGQlF5eFpRVUZaTEVOQlFVTXNRMEZCUXp0UlFVVXpSaXhKUVVGSkxFOUJRVThzUTBGQlF5eE5RVUZOTEVsQlFVa3NRMEZCUXl4SlFVRkpMRTlCUVU4c1EwRkJReXhEUVVGRExFTkJRVU1zU1VGQlNTeEhRVUZITEVWQlFVVTdXVUZETlVNc1RVRkJUU3hMUVVGTExFZEJRVWNzVFVGQlFTeFBRVUZQTEVOQlFVTXNRMEZCUXl4RFFVRkRMREJEUVVGRkxGZEJRVmNzUlVGQlJ5eERRVUZETzFsQlEzcERMRTlCUVU4c1MwRkJTeXhKUVVGSkxHMUNRVUZ0UWl4RFFVRkRMRU5CUVVNN1owSkJRMjVETEVOQlFVTXNiVUpCUVcxQ0xFTkJRVU1zUjBGQlJ5eERRVUZETEV0QlFVc3NRMEZCUXl4RlFVRkZMRXRCUVVzc1JVRkJSU3haUVVGWkxFVkJRVVVzUTBGQlF5eERRVUZETEVOQlFVTXNRMEZCUXp0blFrRkRNVVFzUTBGQlF5eEpRVUZKTEVOQlFVTXNZMEZCWXl4RlFVRkZMRmxCUVZrc1JVRkJSU3haUVVGWkxFVkJRVVVzUTBGQlF5eERRVUZETEVOQlFVTTdVMEZEZUVRN1VVRkZSQ3hKUVVGSkxFOUJRVThzUTBGQlF5eERRVUZETEVOQlFVTXNTVUZCU1N4SFFVRkhMRWxCUVVrc1QwRkJUeXhEUVVGRExFTkJRVU1zUTBGQlJTeEpRVUZKTEcxQ1FVRnRRaXhGUVVGRk8xbEJRek5FTEVsQlFVa3NUMEZCVHl4RFFVRkRMRTFCUVUwc1NVRkJTU3hEUVVGRExFbEJRVWtzVDBGQlR5eERRVUZETEVOQlFVTXNRMEZCUXl4SlFVRkpMRWRCUVVjc1JVRkJSVHRuUWtGRE5VTXNUVUZCVFN4TFFVRkxMRWRCUVVjc1RVRkJRU3hQUVVGUExFTkJRVU1zUTBGQlF5eERRVUZETERCRFFVRkZMRmRCUVZjc1JVRkJSeXhEUVVGRE8yZENRVU42UXl4UFFVRlBMRXRCUVVzc1NVRkJTU3h0UWtGQmJVSXNRMEZCUXl4RFFVRkRPMjlDUVVOdVF5eERRVUZETEcxQ1FVRnRRaXhEUVVGRExFZEJRVWNzUTBGQlF5eExRVUZMTEVOQlFVTXNSVUZCUlN4TFFVRkxMRVZCUVVVc1dVRkJXU3hGUVVGRkxFTkJRVU1zUTBGQlF5eERRVUZETEVOQlFVTTdiMEpCUXpGRUxFTkJRVU1zU1VGQlNTeERRVUZETEdOQlFXTXNSVUZCUlN4WlFVRlpMRVZCUVVVc1dVRkJXU3hGUVVGRkxFTkJRVU1zUTBGQlF5eERRVUZETzJGQlEzaEVPMU5CUTBZN1VVRkZSQ3hKUVVGSkxFOUJRVThzUTBGQlF5eFRRVUZUTEVOQlFVTXNRMEZCUXl4RlFVRkZMRU5CUVVNc1EwRkJReXhKUVVGSkxFbEJRVWtzUTBGQlF5eFhRVUZYTEVWQlFVVTdXVUZETDBNc1NVRkJTU3hQUVVGUExFTkJRVU1zVFVGQlRTeEpRVUZKTEVOQlFVTXNTVUZCU1N4UFFVRlBMRU5CUVVNc1EwRkJReXhEUVVGRExFbEJRVWtzUjBGQlJ5eEZRVUZGTzJkQ1FVTTFReXhOUVVGTkxFdEJRVXNzUjBGQlJ5eEpRVUZKTEVOQlFVTXNWMEZCVnl4RFFVRkRMRTlCUVU4c1EwRkJReXhUUVVGVExFTkJRVU1zUTBGQlF5eEZRVUZGTEVOQlFVTXNRMEZCUXl4RFFVRkRMRU5CUVVNN1owSkJRM2hFTEU5QlFVOHNTMEZCU3l4SlFVRkpMRzFDUVVGdFFpeERRVUZETEVOQlFVTTdiMEpCUTI1RExFTkJRVU1zYlVKQlFXMUNMRU5CUVVNc1IwRkJSeXhEUVVGRExFdEJRVXNzUTBGQlF5eEZRVUZGTEV0QlFVc3NSVUZCUlN4WlFVRlpMRVZCUVVVc1EwRkJReXhEUVVGRExFTkJRVU1zUTBGQlF6dHZRa0ZETVVRc1EwRkJReXhKUVVGSkxFTkJRVU1zWTBGQll5eEZRVUZGTEZsQlFWa3NSVUZCUlN4WlFVRlpMRVZCUVVVc1EwRkJReXhEUVVGRExFTkJRVU03WVVGRGVFUTdVMEZEUmp0UlFVVkVMRWxCUVVrc1EwRkJRU3hOUVVGQkxFOUJRVThzUTBGQlF5eERRVUZETEVOQlFVTXNNRU5CUVVVc1YwRkJWeXhGUVVGRkxFdEJRVWtzVDBGQlR5eERRVUZETEVOQlFVTXNRMEZCUXl4RlFVRkZPMWxCUXpORExFbEJRVWtzVDBGQlR5eERRVUZETEZOQlFWTXNRMEZCUXl4RFFVRkRMRVZCUVVVc1EwRkJReXhEUVVGRExFbEJRVWtzU1VGQlNTeERRVUZETEZkQlFWY3NSVUZCUlR0blFrRkRMME1zU1VGQlNTeFBRVUZQTEVOQlFVTXNUVUZCVFN4SlFVRkpMRU5CUVVNc1NVRkJTU3hQUVVGUExFTkJRVU1zUTBGQlF5eERRVUZETEVsQlFVa3NSMEZCUnl4RlFVRkZPMjlDUVVNMVF5eE5RVUZOTEV0QlFVc3NSMEZCUnl4SlFVRkpMRU5CUVVNc1YwRkJWeXhEUVVGRExFOUJRVThzUTBGQlF5eFRRVUZUTEVOQlFVTXNRMEZCUXl4RlFVRkZMRU5CUVVNc1EwRkJReXhEUVVGRExFTkJRVU03YjBKQlEzaEVMRTlCUVU4c1MwRkJTeXhKUVVGSkxHMUNRVUZ0UWl4RFFVRkRMRU5CUVVNN2QwSkJRMjVETEVOQlFVTXNiVUpCUVcxQ0xFTkJRVU1zUjBGQlJ5eERRVUZETEV0QlFVc3NRMEZCUXl4RlFVRkZMRXRCUVVzc1JVRkJSU3haUVVGWkxFVkJRVVVzUTBGQlF5eERRVUZETEVOQlFVTXNRMEZCUXp0M1FrRkRNVVFzUTBGQlF5eEpRVUZKTEVOQlFVTXNZMEZCWXl4RlFVRkZMRmxCUVZrc1JVRkJSU3haUVVGWkxFVkJRVVVzUTBGQlF5eERRVUZETEVOQlFVTTdhVUpCUTNoRU8yRkJRMFk3VTBGRFJqdFJRVVZFTEU5QlFVOHNRMEZCUXl4SlFVRkpMRU5CUVVNc1kwRkJZeXhGUVVGRkxGbEJRVmtzUlVGQlJTeFpRVUZaTEVWQlFVVXNRMEZCUXl4RFFVRkRMRU5CUVVNN1NVRkRPVVFzUTBGQlF6czdRVUZ3VEdVc2EwSkJRVThzUjBGQlZ5eFpRVUZaTEVOQlFVTTdRVUZGTDBJc2JVTkJRWGRDTEVkQlFWY3NOa0pCUVRaQ0xFTkJRVU03UVVGRk1VVXNlVUpCUVdNc1IwRkJSeXhyUWtGQmEwSXNRMEZCUXp0QlFVVTNRaXhuUWtGQlN5eEhRVUZ4UWp0SlFVTjBReXhIUVVGSExFVkJRVVVzVTBGQlV6dEpRVU5rTEVkQlFVY3NSVUZCUlN4VFFVRlRPMGxCUTJRc1IwRkJSeXhGUVVGRkxGVkJRVlU3U1VGRFppeEhRVUZITEVWQlFVVXNVVUZCVVR0SlFVTmlMRWRCUVVjc1JVRkJSU3hsUVVGbE8wbEJRM0JDTEVkQlFVY3NSVUZCUlN4WFFVRlhPMGxCUTJoQ0xFZEJRVWNzUlVGQlJTeGxRVUZsTzBsQlEzQkNMRWRCUVVjc1JVRkJSU3haUVVGWk8wbEJRMnBDTEVkQlFVY3NSVUZCUlN4bFFVRmxPMGxCUTNCQ0xFZEJRVWNzUlVGQlJTeFRRVUZUTzBsQlEyUXNSMEZCUnl4RlFVRkZMRkZCUVZFN1NVRkRZaXhIUVVGSExFVkJRVVVzVlVGQlZUdEpRVU5tTEVkQlFVY3NSVUZCUlN4WFFVRlhPMGxCUTJoQ0xFZEJRVWNzUlVGQlJTeFZRVUZWTzBsQlEyWXNSMEZCUnl4RlFVRkZMRkZCUVZFN1NVRkRZaXhIUVVGSExFVkJRVVVzVTBGQlV6dEpRVU5rTEVkQlFVY3NSVUZCUlN4WlFVRlpPMGxCUTJwQ0xFZEJRVWNzUlVGQlJTeFpRVUZaTzBsQlEycENMRWRCUVVjc1JVRkJSU3haUVVGWk8wbEJRMnBDTEVkQlFVY3NSVUZCUlN4WFFVRlhPME5CUTJwQ0xFTkJRVU03UVVGRldTeHRRa0ZCVVN4SFFVRnhRanRKUVVONlF5eEhRVUZITEVWQlFVVXNWVUZCVlR0SlFVTm1MRWRCUVVjc1JVRkJSU3h6UWtGQmMwSTdTVUZETTBJc1IwRkJSeXhGUVVGRkxESkNRVUV5UWp0SlFVTm9ReXhIUVVGSExFVkJRVVVzWTBGQll6dEpRVU51UWl4SFFVRkhMRVZCUVVVc2VVSkJRWGxDTzBsQlF6bENMRWRCUVVjc1JVRkJSU3g1UWtGQmVVSTdTVUZET1VJc1IwRkJSeXhGUVVGRkxIZENRVUYzUWp0SlFVTTNRaXhIUVVGSExFVkJRVVVzZDBKQlFYZENPMGxCUXpkQ0xFZEJRVWNzUlVGQlJTeDNRa0ZCZDBJN1NVRkROMElzUjBGQlJ5eEZRVUZGTEdsQ1FVRnBRanRKUVVOMFFpeEhRVUZITEVWQlFVVXNhVUpCUVdsQ08wbEJRM1JDTEVkQlFVY3NSVUZCUlN3d1FrRkJNRUk3U1VGREwwSXNSMEZCUnl4RlFVRkZMSGRDUVVGM1FqdEpRVU0zUWl4SFFVRkhMRVZCUVVVc2JVSkJRVzFDTzBsQlEzaENMRWRCUVVjc1JVRkJSU3hwUWtGQmFVSTdTVUZEZEVJc1IwRkJSeXhGUVVGRkxHbENRVUZwUWp0SlFVTjBRaXhIUVVGSExFVkJRVVVzYjBOQlFXOURPMGxCUTNwRExFZEJRVWNzUlVGQlJTd3dRa0ZCTUVJN1NVRkRMMElzUjBGQlJ5eEZRVUZGTEdkQ1FVRm5RanRKUVVOeVFpeEhRVUZITEVWQlFVVXNhVUpCUVdsQ08wTkJRM1pDTEVOQlFVTTdRVUZGV1N3MFFrRkJhVUlzUjBGQmNVSTdTVUZEYkVRc1IwRkJSeXhGUVVGRkxFdEJRVXM3U1VGRFZpeEhRVUZITEVWQlFVVXNhVUpCUVdsQ08wbEJRM1JDTEVkQlFVY3NSVUZCUlN4elFrRkJjMEk3U1VGRE0wSXNSMEZCUnl4RlFVRkZMRlZCUVZVN1NVRkRaaXhIUVVGSExFVkJRVVVzYjBKQlFXOUNPMGxCUTNwQ0xFZEJRVWNzUlVGQlJTeHhRa0ZCY1VJN1NVRkRNVUlzUjBGQlJ5eEZRVUZGTEcxQ1FVRnRRanRKUVVONFFpeEhRVUZITEVWQlFVVXNiVUpCUVcxQ08wbEJRM2hDTEVkQlFVY3NSVUZCUlN4eFFrRkJjVUk3U1VGRE1VSXNSMEZCUnl4RlFVRkZMRmxCUVZrN1NVRkRha0lzUjBGQlJ5eEZRVUZGTEdOQlFXTTdTVUZEYmtJc1IwRkJSeXhGUVVGRkxIRkNRVUZ4UWp0SlFVTXhRaXhIUVVGSExFVkJRVVVzYlVKQlFXMUNPMGxCUTNoQ0xFZEJRVWNzUlVGQlJTeG5Ra0ZCWjBJN1NVRkRja0lzUjBGQlJ5eEZRVUZGTEZsQlFWazdTVUZEYWtJc1IwRkJSeXhGUVVGRkxHRkJRV0U3U1VGRGJFSXNSMEZCUnl4RlFVRkZMQ3RDUVVFclFqdEpRVU53UXl4SFFVRkhMRVZCUVVVc2NVSkJRWEZDTzBsQlF6RkNMRWRCUVVjc1JVRkJSU3hYUVVGWE8wbEJRMmhDTEVkQlFVY3NSVUZCUlN4WlFVRlpPME5CUTJ4Q0xFTkJRVU03UVVGRlJqdEhRVU5ITzBGQlExY3NjMEpCUVZjc1IwRkJjVUk3U1VGRE5VTXNTMEZCU3l4RlFVRkZMRWRCUVVjN1NVRkRWaXhMUVVGTExFVkJRVVVzUjBGQlJ6dEpRVU5XTEV0QlFVc3NSVUZCUlN4SFFVRkhPMGxCUTFZc1MwRkJTeXhGUVVGRkxFZEJRVWM3U1VGRFZpeExRVUZMTEVWQlFVVXNSMEZCUnp0SlFVTldMRXRCUVVzc1JVRkJSU3hIUVVGSE8wbEJRMVlzUzBGQlN5eEZRVUZGTEVkQlFVYzdTVUZEVml4TFFVRkxMRVZCUVVVc1IwRkJSenRKUVVOV0xFdEJRVXNzUlVGQlJTeEhRVUZITzBsQlExWXNTMEZCU3l4RlFVRkZMRWRCUVVjN1NVRkRWaXhMUVVGTExFVkJRVVVzUjBGQlJ6dEpRVU5XTEV0QlFVc3NSVUZCUlN4SFFVRkhPMGxCUTFZc1MwRkJTeXhGUVVGRkxFZEJRVWM3U1VGRFZpeExRVUZMTEVWQlFVVXNSMEZCUnp0SlFVTldMRXRCUVVzc1JVRkJSU3hIUVVGSE8wbEJRMVlzUzBGQlN5eEZRVUZGTEVkQlFVYzdTVUZEVml4TFFVRkxMRVZCUVVVc1IwRkJSenRKUVVOV0xFdEJRVXNzUlVGQlJTeEhRVUZITzBsQlExWXNTMEZCU3l4RlFVRkZMRWRCUVVjN1NVRkRWaXhMUVVGTExFVkJRVVVzUjBGQlJ6dERRVU5ZTEVOQlFVTWlMQ0p6YjNWeVkyVnpRMjl1ZEdWdWRDSTZXeUpwYlhCdmNuUWdLaUJoY3lCbmNtOXJJR1p5YjIwZ0oyUmhkR0ZuY205ckxXRndhUzluY205ckp6dGNibWx0Y0c5eWRDQXFJR0Z6SUhWcElHWnliMjBnSjJSaGRHRm5jbTlyTFdGd2FTOTFhU2M3WEc1cGJYQnZjblFnS2lCaGN5QkVSeUJtY205dElDZGtZWFJoWjNKdmF5MWhjR2t2Wkdjbk8xeHVYRzVwYlhCdmNuUWdlMU4wY21sdVowUnBZM1JwYjI1aGNubDlJR1p5YjIwZ0owQmtZWFJoWjNKdmF5MXNhV0p5WVhKcFpYTXZkWFJwYkhNdmMzSmpMM1I1Y0dVdFpHVmpiR0Z5WVhScGIyNXpKenRjYm1sdGNHOXlkQ0I3VTJWeFVHRnNaWFIwWlN3Z1UyVnhVR0ZzWlhSMFpVSmhjMlY5SUdaeWIyMGdKeTR2YzJWeExYQmhiR1YwZEdWekp6dGNibHh1Wlhod2IzSjBJR05zWVhOeklFRnRhVzV2WVdOcFpITlFZV3hsZEhSbGN5QmxlSFJsYm1SeklGTmxjVkJoYkdWMGRHVkNZWE5sSUh0Y2JpQWdjSEpwZG1GMFpTQnpkR0YwYVdNZ2JHVnphem9nVTJWeFVHRnNaWFIwWlR0Y2JseHVJQ0J3ZFdKc2FXTWdjM1JoZEdsaklHZGxkQ0JNWlhOcktDazZJRk5sY1ZCaGJHVjBkR1VnZTF4dUlDQWdJR2xtSUNoMGFHbHpMbXhsYzJzZ1BUMDlJSFp2YVdRZ01Da2dlMXh1SUNBZ0lDQWdkR2hwY3k1c1pYTnJJRDBnZEdocGN5NXRZV3RsVUdGc1pYUjBaU2hiWEc0Z0lDQWdJQ0FnSUZ0YkowY25MQ0FuUVNjc0lDZFRKeXdnSjFRblhTd2dKMjl5WVc1blpTZGRMRnh1SUNBZ0lDQWdJQ0JiV3lkREp5d2dKMVluTENBblNTY3NJQ2RNSnl3Z0oxQW5MQ0FuUmljc0lDZFpKeXdnSjAwbkxDQW5WeWRkTENBbllXeHNYMmR5WldWdUoxMHNYRzRnSUNBZ0lDQWdJRnRiSjA0bkxDQW5VU2NzSUNkSUoxMHNJQ2R0WVdkbGJuUmhKMTBzWEc0Z0lDQWdJQ0FnSUZ0YkowUW5MQ0FuUlNkZExDQW5jbVZrSjEwc1hHNGdJQ0FnSUNBZ0lGdGJKMHNuTENBblVpZGRMQ0FuWVd4c1gySnNkV1VuWFN4Y2JpQWdJQ0FnSUYwc0lHWmhiSE5sTENCQmJXbHViMkZqYVdSelVHRnNaWFIwWlhNcE8xeHVJQ0FnSUgxY2JpQWdJQ0J5WlhSMWNtNGdkR2hwY3k1c1pYTnJPMXh1SUNCOVhHNWNiaUFnY0hKcGRtRjBaU0J6ZEdGMGFXTWdaM0p2YTBkeWIzVndjem9nVTJWeFVHRnNaWFIwWlR0Y2JseHVJQ0J3ZFdKc2FXTWdjM1JoZEdsaklHZGxkQ0JIY205clIzSnZkWEJ6S0NrNklGTmxjVkJoYkdWMGRHVWdlMXh1SUNBZ0lHbG1JQ2gwYUdsekxtZHliMnRIY205MWNITWdQVDA5SUhadmFXUWdNQ2tnZTF4dUlDQWdJQ0FnZEdocGN5NW5jbTlyUjNKdmRYQnpJRDBnZEdocGN5NXRZV3RsVUdGc1pYUjBaU2hiWEc0Z0lDQWdJQ0FnSUZ0YkowTW5MQ0FuVlNkZExDQW5lV1ZzYkc5M0oxMHNYRzRnSUNBZ0lDQWdJRnRiSjBjbkxDQW5VQ2RkTENBbmNtVmtKMTBzWEc0Z0lDQWdJQ0FnSUZ0YkowRW5MQ0FuVmljc0lDZEpKeXdnSjB3bkxDQW5UU2NzSUNkR0p5d2dKMWtuTENBblZ5ZGRMQ0FuWVd4c1gyZHlaV1Z1SjEwc1hHNGdJQ0FnSUNBZ0lGdGJKMUluTENBblNDY3NJQ2RMSjEwc0lDZHNhV2RvZEY5aWJIVmxKMTBzWEc0Z0lDQWdJQ0FnSUZ0YkowUW5MQ0FuUlNkZExDQW5aR0Z5YTE5aWJIVmxKMTBzWEc0Z0lDQWdJQ0FnSUZ0YkoxTW5MQ0FuVkNjc0lDZE9KeXdnSjFFblhTd2dKMjl5WVc1blpTZGRMRnh1SUNBZ0lDQWdYU3dnWm1Gc2MyVXNJRUZ0YVc1dllXTnBaSE5RWVd4bGRIUmxjeWs3WEc0Z0lDQWdmVnh1SUNBZ0lISmxkSFZ5YmlCMGFHbHpMbWR5YjJ0SGNtOTFjSE03WEc0Z0lIMWNibHh1SUNCd2NtbDJZWFJsSUhOMFlYUnBZeUJ5WVhOTmIydzZJRk5sY1ZCaGJHVjBkR1U3WEc1Y2JpQWdjSFZpYkdsaklITjBZWFJwWXlCblpYUWdVbUZ6VFc5c0tDazZJRk5sY1ZCaGJHVjBkR1VnZTF4dUlDQWdJR2xtSUNoMGFHbHpMbkpoYzAxdmJDQTlQVDBnZG05cFpDQXdLU0I3WEc0Z0lDQWdJQ0IwYUdsekxuSmhjMDF2YkNBOUlHNWxkeUJCYldsdWIyRmphV1J6VUdGc1pYUjBaWE1vZTF4dUlDQWdJQ0FnSUNBdkx5Qm9kSFJ3T2k4dllXTmpaWE11Wlc1ekxXeDViMjR1Wm5JdlltbHZkR2xqTDNKaGMzUnZjQzlvWld4d0wyTnZiRzkxY2k1b2RHMWNiaUFnSUNBZ0lDQWdKMFFuT2lBbkkwVTJNRUV3UVNjc0lDOHZJR0Z6Y0N3Z1lYTndZWEowYVdNZ1lXTnBaQ3dnWVhOd1hHNGdJQ0FnSUNBZ0lDZEZKem9nSnlORk5qQkJNRUVuTENBdkx5Qm5iSFVzSUdkc2RYUmhiV2xqSUdGamFXUmNiaUFnSUNBZ0lDQWdKME1uT2lBbkkwVTJSVFl3TUNjc0lDOHZJR041Y3l3Z1kzbHpkR1ZwYm1WY2JpQWdJQ0FnSUNBZ0owMG5PaUFuSTBVMlJUWXdNQ2NzSUM4dklHMWxkQ3dnYldWMGFHbHZibWx1WlZ4dUlDQWdJQ0FnSUNBblN5YzZJQ2NqTVRRMVFVWkdKeXdnTHk4Z2JIbHpMQ0JzZVhOcGJtVmNiaUFnSUNBZ0lDQWdKMUluT2lBbkl6RTBOVUZHUmljc0lDOHZJR0Z5Wnl3Z1lYSm5hVzVwYm1WY2JpQWdJQ0FnSUNBZ0oxTW5PaUFuSTBaQk9UWXdNQ2NzSUM4dklITmxjaXdnYzJWeWFXNWxYRzRnSUNBZ0lDQWdJQ2RVSnpvZ0p5TkdRVGsyTURBbkxDQXZMeUIwYUhJc0lIUm9jbVZ2Ym1sdVpWeHVJQ0FnSUNBZ0lDQW5SaWM2SUNjak16SXpNa0ZCSnl3Z0x5OGdjR2hsTENCd2FHVnVlV3hoYkdGdWFXNWxYRzRnSUNBZ0lDQWdJQ2RaSnpvZ0p5TXpNak15UVVFbkxDQXZMeUIwZVhJc0lIUjVjbTl6YVc1bFhHNGdJQ0FnSUNBZ0lDZE9Kem9nSnlNd01FUkRSRU1uTENBdkx5QmhjMjRzSUdGemNHRnlZV2RwYm1WY2JpQWdJQ0FnSUNBZ0oxRW5PaUFuSXpBd1JFTkVReWNzSUM4dklHZHNiaXdnWjJ4MWRHRnRhVzVsWEc0Z0lDQWdJQ0FnSUNkSEp6b2dKeU5GUWtWQ1JVSW5MQ0F2THlCbmJIa3NJR2RzZVdOcGJtVmNiaUFnSUNBZ0lDQWdKMHduT2lBbkl6QkdPREl3Umljc0lDOHZJR3hsZFN3Z2JHVjFZMmx1WlZ4dUlDQWdJQ0FnSUNBblZpYzZJQ2NqTUVZNE1qQkdKeXdnTHk4Z2RtRnNMQ0IyWVd4cGJtVmNiaUFnSUNBZ0lDQWdKMGtuT2lBbkl6QkdPREl3Umljc0lDOHZJR2xzWlN3Z2FYTnZiR1YxWTJsdVpWeHVJQ0FnSUNBZ0lDQW5RU2M2SUNjalF6aERPRU00Snl3Z0x5OGdZV3hoTENCaGJHRnVhVzVsWEc0Z0lDQWdJQ0FnSUNkWEp6b2dKeU5DTkRWQlFqUW5MQ0F2THlCMGNuQXNJSFJ5ZVhCMGIzQm9ZVzVjYmlBZ0lDQWdJQ0FnSjBnbk9pQW5Jemd5T0RKRU1pY3NJQzh2SUdocGN5d2dhR2x6ZEdsa2FXNWxYRzRnSUNBZ0lDQWdJQ2RRSnpvZ0p5TkVRemsyT0RJbkxDQXZMeUJ3Y204c0lIQnliMnhwYm1WY2JpQWdJQ0FnSUNBZ0oyOTBhR1Z5Y3ljNklDY2pRa1ZCTURaRkp5eGNiaUFnSUNBZ0lIMHBPMXh1SUNBZ0lIMWNiaUFnSUNCeVpYUjFjbTRnZEdocGN5NXlZWE5OYjJ3N1hHNGdJSDFjYmx4dUlDQndkV0pzYVdNZ2IzWmxjbkpwWkdVZ1oyVjBLRzA2SUhOMGNtbHVaeWs2SUhOMGNtbHVaeUI3WEc0Z0lDQWdZMjl1YzNRZ2NtVnpUU0E5SUcwZ2FXNGdRVzFwYm05aFkybGtjMUJoYkdWMGRHVnpMbUZoVTNsdWIyNTViWE1nUHlCQmJXbHViMkZqYVdSelVHRnNaWFIwWlhNdVlXRlRlVzV2Ym5sdGMxdHRYU0E2SUcwN1hHNGdJQ0FnWTI5dWMzUWdjbVZ6SUQwZ2MzVndaWEl1WjJWMEtISmxjMDBwTzF4dUlDQWdJSEpsZEhWeWJpQnlaWE03WEc0Z0lIMWNibHh1SUNBdktpb2dUMjVzZVNCemIyMWxJRzltSUhSb1pTQnplVzV2Ym5sdGN5NGdWR2hsYzJVZ2QyVnlaU0J2WW5SaGFXNWxaQ0JtY205dElIUm9aU0JqYkhWemRHVnlaV1FnYjJ4cFoyOXdaWEIwYVdSbElHUmhkR0Z6WlhRdUlDb3ZYRzRnSUhCeWFYWmhkR1VnYzNSaGRHbGpJR0ZoVTNsdWIyNTViWE02SUhzZ1cyNWhiV1U2SUhOMGNtbHVaMTA2SUhOMGNtbHVaeUI5SUQwZ2UxeHVJQ0FnSUNkTlpVNXNaU2M2SUNkTUp5d2dMeThnVG14bElDMGdibTl5YkdWMVkybHVaVnh1SUNBZ0lDZE5aVUVuT2lBblFTY3NYRzRnSUNBZ0owMWxSeWM2SUNkSEp5eGNiaUFnSUNBblRXVkdKem9nSjBZbkxGeHVJQ0I5TzF4dWZWeHVYRzVsZUhCdmNuUWdZMnhoYzNNZ1FXMXBibTloWTJsa2N5QjdYRzRnSUhOMFlYUnBZeUJ5WldGa2IyNXNlU0JUWlcxVWVYQmxPaUJ6ZEhKcGJtY2dQU0FuUVcxcGJtOWhZMmxrY3ljN1hHNWNiaUFnYzNSaGRHbGpJSEpsWVdSdmJteDVJRk5sYlZSNWNHVk5kV3gwYVhCc1pVRnNhV2R1YldWdWREb2djM1J5YVc1bklEMGdKMEZ0YVc1dllXTnBaSE5OZFd4MGFYQnNaVUZzYVdkdWJXVnVkQ2M3WEc1Y2JpQWdjM1JoZEdsaklIVnVaR1ZtYVc1bFpFTnZiRzl5SUQwZ0ozSm5ZaWd4TURBc01UQXdMREV3TUNrbk8xeHVYRzRnSUhCMVlteHBZeUJ6ZEdGMGFXTWdUbUZ0WlhNNklGTjBjbWx1WjBScFkzUnBiMjVoY25rZ1BTQjdYRzRnSUNBZ0owY25PaUFuUjJ4NVkybHVaU2NzWEc0Z0lDQWdKMHduT2lBblRHVjFZMmx1WlNjc1hHNGdJQ0FnSjFrbk9pQW5WSGx5YjNOcGJtVW5MRnh1SUNBZ0lDZFRKem9nSjFObGNtbHVaU2NzWEc0Z0lDQWdKMFVuT2lBblIyeDFkR0Z0YVdNZ1lXTnBaQ2NzWEc0Z0lDQWdKMUVuT2lBblIyeDFkR0Z0YVc1bEp5eGNiaUFnSUNBblJDYzZJQ2RCYzNCaGNuUnBZeUJoWTJsa0p5eGNiaUFnSUNBblRpYzZJQ2RCYzNCaGNtRm5hVzVsSnl4Y2JpQWdJQ0FuUmljNklDZFFhR1Z1ZVd4aGJHRnVhVzVsSnl4Y2JpQWdJQ0FuUVNjNklDZEJiR0Z1YVc1bEp5eGNiaUFnSUNBblN5YzZJQ2RNZVhOcGJtVW5MRnh1SUNBZ0lDZFNKem9nSjBGeVoybHVhVzVsSnl4Y2JpQWdJQ0FuU0NjNklDZElhWE4wYVdScGJtVW5MRnh1SUNBZ0lDZERKem9nSjBONWMzUmxhVzVsSnl4Y2JpQWdJQ0FuVmljNklDZFdZV3hwYm1VbkxGeHVJQ0FnSUNkUUp6b2dKMUJ5YjJ4cGJtVW5MRnh1SUNBZ0lDZFhKem9nSjFSeWVYQjBiM0JvWVc0bkxGeHVJQ0FnSUNkSkp6b2dKMGx6YjJ4bGRXTnBibVVuTEZ4dUlDQWdJQ2ROSnpvZ0owMWxkR2hwYjI1cGJtVW5MRnh1SUNBZ0lDZFVKem9nSjFSb2NtVnZibWx1WlNjc1hHNGdJSDA3WEc1Y2JpQWdjSFZpYkdsaklITjBZWFJwWXlCQlFWTnRhV3hsY3pvZ1UzUnlhVzVuUkdsamRHbHZibUZ5ZVNBOUlIdGNiaUFnSUNBblJ5YzZJQ2RPUTBNb1BVOHBUeWNzWEc0Z0lDQWdKMHduT2lBblRsdERRRWhkS0VOREtFTXBReWxES0QxUEtVOG5MRnh1SUNBZ0lDZFpKem9nSjA1REtFTkRNVDFEUXoxREtFOHBRejFETVNsREtEMVBLVThuTEZ4dUlDQWdJQ2RUSnpvZ0owNURLRU5QS1VNb1BVOHBUeWNzWEc0Z0lDQWdKMFVuT2lBblRsdERRRUJJWFNoRFEwTW9UeWs5VHlsREtEMVBLVThuTEZ4dUlDQWdJQ2RSSnpvZ0owNWJRMEJBU0Ywb1EwTkRLRTRwUFU4cFF5ZzlUeWxQSnl4Y2JpQWdJQ0FuUkNjNklDZE9XME5BUUVoZEtFTkRLRThwUFU4cFF5ZzlUeWxQSnl4Y2JpQWdJQ0FuVGljNklDZE9XME5BUUVoZEtFTkRLRTRwUFU4cFF5ZzlUeWxQSnl4Y2JpQWdJQ0FuUmljNklDZE9ReWhEUXpFOVEwTTlRME05UXpFcFF5ZzlUeWxQSnl4Y2JpQWdJQ0FuUVNjNklDZE9XME5BU0Ywb1F5bERLRDFQS1U4bkxGeHVJQ0FnSUNkTEp6b2dKMDVES0VORFEwTk9LVU1vUFU4cFR5Y3NYRzRnSUNBZ0oxSW5PaUFuVGx0RFFFaGRLRU5EUTA1REtEMU9LVU1wUXlnOVR5bFBKeXhjYmlBZ0lDQW5TQ2M2SUNkT1F5aERRekU5UTA0OVExdE9YVEVwUXlnOVR5bFBKeXhjYmlBZ0lDQW5ReWM2SUNkT1cwTkFRRWhkS0VOVEtVTW9QVThwVHljc1hHNGdJQ0FnSjFZbk9pQW5Ua01vUXloREtVTXBReWc5VHlsUEp5eGNiaUFnSUNBblVDYzZJQ2RPS0VORFF6RXBRekZES0QxUEtVOG5MRnh1SUNBZ0lDZFhKem9nSjA1YlEwQkFTRjBvUTJNeFl6SmpZMk5qWXpKdUtGdElYU2xqTVNsREtEMVBLVThuTEZ4dUlDQWdJQ2RKSnpvZ0owNWJRMEJJWFNoYlEwQklYU2hES1VOREtVTW9QVThwVHljc1hHNGdJQ0FnSjAwbk9pQW5Ua01vUTBOVFF5bERLRDFQS1U4bkxGeHVJQ0FnSUNkVUp6b2dKMDVES0VNb1R5bERLVU1vUFU4cFR5Y3NYRzRnSUgwN1hHNWNiaUFnY0hWaWJHbGpJSE4wWVhScFl5QkJRVk50YVd4bGMxUnlkVzVqWVhSbFpEb2dVM1J5YVc1blJHbGpkR2x2Ym1GeWVTQTlJSHRjYmlBZ0lDQW5SeWM2SUNjcVF5b25MRnh1SUNBZ0lDZE1Kem9nSjBOREtFTXBRMXREUUVoZEtDb3BLaWNzWEc0Z0lDQWdKMWtuT2lBblF6RTlRME1vUFVORFBVTXhRME1vS2lrcUtVOG5MRnh1SUNBZ0lDZFRKem9nSjA5RFF5Z3FLVU1xSnl4Y2JpQWdJQ0FuUlNjNklDY3FXME5BUUVoZEtFTkRReWhQS1QxUEtTb25MRnh1SUNBZ0lDZFJKem9nSnlwT1cwTkFRRWhkS0VORFF5aE9LVDFQS1NvbkxGeHVJQ0FnSUNkRUp6b2dKeXBiUTBCQVNGMG9RME1vVHlrOVR5a3FKeXhjYmlBZ0lDQW5UaWM2SUNjcVcwTkFRRWhkS0VOREtFNHBQVThwS2ljc1hHNGdJQ0FnSjBZbk9pQW5RekU5UTBNOVF5aERQVU14S1VOREtDb3BLaWNzWEc0Z0lDQWdKMEVuT2lBblExdERRRWhkS0NvcEtpY3NYRzRnSUNBZ0owc25PaUFuUXloRFEwNHBRME1vS2lrcUp5eGNiaUFnSUNBblVpYzZJQ2NxVzBOQVNGMG9RME5EVGtNb1BVNHBReWtxSnl4Y2JpQWdJQ0FuU0NjNklDZERNVDFES0U1RFBVNHhLVU5ES0NvcEtpY3NYRzRnSUNBZ0owTW5PaUFuUXloYlEwQkFTRjBvS2lrcUtWTW5MRnh1SUNBZ0lDZFdKem9nSjBOREtFTXBReWdxS1NvbkxGeHVJQ0FnSUNkUUp6b2dKME14UTBOT0tDb3BRekVxSnl4Y2JpQWdJQ0FuVnljNklDY3FXME5BUUVoZEtFTmpNV015WTJOalkyTXliaWhiU0YwcFl6RXBLaWNzWEc0Z0lDQWdKMGtuT2lBblEwTmJRMEJJWFNoREtWdERRRWhkS0NvcEtpY3NYRzRnSUNBZ0owMG5PaUFuUTFORFEwTW9LaWtxSnl4Y2JpQWdJQ0FuVkNjNklDZERReWhQS1VNb0tpa3FKeXhjYmlBZ2ZUdGNibHh1SUNBdktpb2dWRTlFVHpvZ1JuVnNiRDljYmlBZ0lDb3ZYRzRnSUhCMVlteHBZeUJ6ZEdGMGFXTWdRVUZHZFd4c1RtRnRaWE02SUZOMGNtbHVaMFJwWTNScGIyNWhjbmtnUFNCN1hHNGdJQ0FnSjBGc1lTYzZJQ2RCSnl4Y2JpQWdJQ0FuUVhKbkp6b2dKMUluTEZ4dUlDQWdJQ2RCYzI0bk9pQW5UaWNzWEc0Z0lDQWdKMEZ6Y0NjNklDZEVKeXhjYmlBZ0lDQW5RM2x6SnpvZ0owTW5MRnh1SUNBZ0lDZEhiRzRuT2lBblVTY3NYRzRnSUNBZ0owZHNkU2M2SUNkRkp5eGNiaUFnSUNBblIyeDVKem9nSjBjbkxGeHVJQ0FnSUNkSWFYTW5PaUFuU0Njc1hHNGdJQ0FnSjBsc1pTYzZJQ2RKSnl4Y2JpQWdJQ0FuVEdWMUp6b2dKMHduTEZ4dUlDQWdJQ2RNZVhNbk9pQW5TeWNzWEc0Z0lDQWdKMDFsZENjNklDZE5KeXhjYmlBZ0lDQW5VR2hsSnpvZ0owWW5MRnh1SUNBZ0lDZFFjbThuT2lBblVDY3NYRzRnSUNBZ0oxTmxjaWM2SUNkVEp5eGNiaUFnSUNBblZHaHlKem9nSjFRbkxGeHVJQ0FnSUNkVWNuQW5PaUFuVnljc1hHNGdJQ0FnSjFSNWNpYzZJQ2RaSnl4Y2JpQWdJQ0FuVm1Gc0p6b2dKMVluTEZ4dUlDQjlPMXh1WEc0Z0lIQjFZbXhwWXlCemRHRjBhV01nWjJWMFVHRnNaWFIwWlNoelkyaGxiV1U2SUhOMGNtbHVaeUE5SUNkbmNtOXJKeWs2SUZObGNWQmhiR1YwZEdVZ2UxeHVJQ0FnSUhOM2FYUmphQ0FvYzJOb1pXMWxLU0I3WEc0Z0lDQWdZMkZ6WlNBblozSnZheWM2WEc0Z0lDQWdJQ0J5WlhSMWNtNGdRVzFwYm05aFkybGtjMUJoYkdWMGRHVnpMa2R5YjJ0SGNtOTFjSE03WEc0Z0lDQWdZMkZ6WlNBbmJHVnpheWM2WEc0Z0lDQWdJQ0J5WlhSMWNtNGdRVzFwYm05aFkybGtjMUJoYkdWMGRHVnpMa3hsYzJzN1hHNGdJQ0FnWkdWbVlYVnNkRHBjYmlBZ0lDQWdJSFJvY205M0lHNWxkeUJGY25KdmNpaGdRMmhsYlZCaGJHVjBkR1U2SUhOamFHVnRaU0JjWEdBa2UzTmphR1Z0WlgxY1hHQWdaRzlsY3lCdWIzUWdaWGhwYzNSZ0tUdGNiaUFnSUNCOVhHNGdJSDFjYmx4dUlDQXZLaXBjYmlBZ0lDb2dVbVYwZFhKdWN5QmthWFpwWkdWa0lHRnRhVzV2SUdGamFXUWdkMmwwYUNCcGRITWdZMjl1ZEdWdWRDQnBiaUIwYUdVZ1luSmhZMnRsZEN3Z2FXWWdkR2hsSUdOdmJuUmxiblFnYVhNZ2JuVnRZbVZ5TENCMGFHVnVJR2wwY3lCdmJXbDBkR1ZrWEc0Z0lDQXFYRzRnSUNBcUlFQndZWEpoYlNCN2MzUnlhVzVuZlNCaklISmhkeUJoYldsdWIxeHVJQ0FnS2lCQWNtVjBkWEp1SUh0YmMzUnlhVzVuTENCemRISnBibWRkZlNCdmRYUmxjaUJoYm1RZ2FXNXVaWElnWTI5dWRHVnVkRnh1SUNBZ0tpOWNiaUFnY0hWaWJHbGpJSE4wWVhScFl5Qm5aWFJKYm01bGNrOTFkR1Z5S0dNNklITjBjbWx1WnlrNklGdHpkSEpwYm1jc0lITjBjbWx1WjEwZ2UxeHVJQ0FnSUd4bGRDQnBjMGx1Ym1WeUlEMGdNRHRjYmlBZ0lDQnNaWFFnYVc1dVpYSWdQU0FuSnp0Y2JpQWdJQ0JzWlhRZ2IzVjBaWElnUFNBbkp6dGNibHh1SUNBZ0lHWnZjaUFvWTI5dWMzUWdZMmhoY2lCdlppQmpLU0I3WEc0Z0lDQWdJQ0JwWmlBb1kyaGhjaUE5UFNBbktDY3BYRzRnSUNBZ0lDQWdJR2x6U1c1dVpYSXJLenRjYmlBZ0lDQWdJR1ZzYzJVZ2FXWWdLR05vWVhJZ1BUMGdKeWtuS1Z4dUlDQWdJQ0FnSUNCcGMwbHVibVZ5TFMwN1hHNGdJQ0FnSUNCbGJITmxJR2xtSUNocGMwbHVibVZ5S1Z4dUlDQWdJQ0FnSUNCcGJtNWxjaUFyUFNCamFHRnlPMXh1SUNBZ0lDQWdaV3h6WlZ4dUlDQWdJQ0FnSUNCdmRYUmxjaUFyUFNCamFHRnlPMXh1SUNBZ0lIMWNibHh1SUNBZ0lISmxkSFZ5YmlBaGFYTk9ZVTRvY0dGeWMyVkpiblFvYVc1dVpYSXBLU0EvSUZ0dmRYUmxjaXdnSnlkZElEb2dXMjkxZEdWeUxDQnBibTVsY2wwN1hHNGdJSDFjYmx4dUlDQndkV0pzYVdNZ2MzUmhkR2xqSUdkbGRFTnZiRzl5UVVGUWFYWnZkQ2h0YjI1dmJXVnlPaUJ6ZEhKcGJtY2dQU0FuSnl3Z2MyTm9aVzFsT2lBblozSnZheWNnUFNBblozSnZheWNwT2lCYmMzUnlhVzVuTENCemRISnBibWNzSUhOMGNtbHVaeXdnYm5WdFltVnlYU0I3WEc0Z0lDQWdMeTlqYjI1emRDQmphR1Z0VUdGc1pYUjBaVWx1YzNSaGJtTmxJRDBnUVVGUVlXeGxkSFJsY3k1SGNtOXJSM0p2ZFhCektDazdYRzRnSUNBZ1kyOXVjM1FnWTJobGJWQmhiR1YwZEdWSmJuTjBZVzVqWlNBOUlIUm9hWE11WjJWMFVHRnNaWFIwWlNoelkyaGxiV1VwTzF4dUlDQWdJR3hsZENCYmIzVjBaWEpOYjI1dmJXVnlMQ0JwYm01bGNrMXZibTl0WlhKZElEMGdkR2hwY3k1blpYUkpibTVsY2s5MWRHVnlLRzF2Ym05dFpYSXBPMXh1SUNBZ0lHOTFkR1Z5VFc5dWIyMWxjaUE5SUNodmRYUmxjazF2Ym05dFpYSXViR1Z1WjNSb0lENGdOaUEvSUdBa2UyOTFkR1Z5VFc5dWIyMWxjaTV6YkdsalpTZ3dMQ0F6S1gwdUxpNWdJRG9nYjNWMFpYSk5iMjV2YldWeUtUdGNiaUFnSUNCcGJtNWxjazF2Ym05dFpYSWdQU0FvYVc1dVpYSk5iMjV2YldWeUxteGxibWQwYUNBK0lEWWdQeUJnSkh0cGJtNWxjazF2Ym05dFpYSXVjMnhwWTJVb01Dd2dNeWw5TGk0dVlDQTZJR2x1Ym1WeVRXOXViMjFsY2lrN1hHNWNiaUFnSUNCcFppQW9iVzl1YjIxbGNpNXNaVzVuZEdnZ1BUMGdNU0I4ZkNCdGIyNXZiV1Z5V3pGZElEMDlJQ2NvSnlrZ2UxeHVJQ0FnSUNBZ1kyOXVjM1FnWVcxcGJtOGdQU0J0YjI1dmJXVnlXekJkUHk1MGIxVndjR1Z5UTJGelpTZ3BJVHRjYmlBZ0lDQWdJSEpsZEhWeWJpQmhiV2x1YnlCcGJpQmphR1Z0VUdGc1pYUjBaVWx1YzNSaGJtTmxJRDljYmlBZ0lDQWdJQ0FnVzJOb1pXMVFZV3hsZEhSbFNXNXpkR0Z1WTJVdVoyVjBLR0Z0YVc1dktTd2dZVzFwYm04c0lHbHVibVZ5VFc5dWIyMWxjaXdnTVYwZ09seHVJQ0FnSUNBZ0lDQmJkR2hwY3k1MWJtUmxabWx1WldSRGIyeHZjaXdnYjNWMFpYSk5iMjV2YldWeUxDQnBibTVsY2sxdmJtOXRaWElzSURGZE8xeHVJQ0FnSUgxY2JseHVJQ0FnSUdsbUlDaHRiMjV2YldWeVd6QmRJRDA5SUNka0p5QW1KaUJ0YjI1dmJXVnlXekZkSVNCcGJpQmphR1Z0VUdGc1pYUjBaVWx1YzNSaGJtTmxLU0I3WEc0Z0lDQWdJQ0JwWmlBb2JXOXViMjFsY2k1c1pXNW5kR2dnUFQwZ01pQjhmQ0J0YjI1dmJXVnlXekpkSUQwOUlDY29KeWtnZTF4dUlDQWdJQ0FnSUNCamIyNXpkQ0JoYldsdWJ5QTlJRzF2Ym05dFpYSmJNVjAvTG5SdlZYQndaWEpEWVhObEtDa2hPMXh1SUNBZ0lDQWdJQ0J5WlhSMWNtNGdZVzFwYm04Z2FXNGdZMmhsYlZCaGJHVjBkR1ZKYm5OMFlXNWpaU0EvWEc0Z0lDQWdJQ0FnSUNBZ1cyTm9aVzFRWVd4bGRIUmxTVzV6ZEdGdVkyVXVaMlYwS0dGdGFXNXZLU3dnWVcxcGJtOHNJR2x1Ym1WeVRXOXViMjFsY2l3Z01sMGdPbHh1SUNBZ0lDQWdJQ0FnSUZ0MGFHbHpMblZ1WkdWbWFXNWxaRU52Ykc5eUxDQnZkWFJsY2sxdmJtOXRaWElzSUdsdWJtVnlUVzl1YjIxbGNpd2dNbDA3WEc0Z0lDQWdJQ0I5WEc0Z0lDQWdmVnh1WEc0Z0lDQWdhV1lnS0cxdmJtOXRaWEl1YzNWaWMzUnlhVzVuS0RBc0lETXBJR2x1SUhSb2FYTXVRVUZHZFd4c1RtRnRaWE1wSUh0Y2JpQWdJQ0FnSUdsbUlDaHRiMjV2YldWeUxteGxibWQwYUNBOVBTQXpJSHg4SUcxdmJtOXRaWEpiTTEwZ1BUMGdKeWduS1NCN1hHNGdJQ0FnSUNBZ0lHTnZibk4wSUdGdGFXNXZJRDBnZEdocGN5NUJRVVoxYkd4T1lXMWxjMXR0YjI1dmJXVnlMbk4xWW5OMGNtbHVaeWd3TENBektWMDdYRzRnSUNBZ0lDQWdJSEpsZEhWeWJpQmhiV2x1YnlCcGJpQmphR1Z0VUdGc1pYUjBaVWx1YzNSaGJtTmxJRDljYmlBZ0lDQWdJQ0FnSUNCYlkyaGxiVkJoYkdWMGRHVkpibk4wWVc1alpTNW5aWFFvWVcxcGJtOHBMQ0JoYldsdWJ5d2dhVzV1WlhKTmIyNXZiV1Z5TENBelhTQTZYRzRnSUNBZ0lDQWdJQ0FnVzNSb2FYTXVkVzVrWldacGJtVmtRMjlzYjNJc0lHOTFkR1Z5VFc5dWIyMWxjaXdnYVc1dVpYSk5iMjV2YldWeUxDQXpYVHRjYmlBZ0lDQWdJSDFjYmlBZ0lDQjlYRzVjYmlBZ0lDQnBaaUFvYlc5dWIyMWxjbHN3WFQ4dWRHOU1iM2RsY2tOaGMyVW9LU0E5UFNCdGIyNXZiV1Z5V3pCZEtTQjdYRzRnSUNBZ0lDQnBaaUFvYlc5dWIyMWxjaTV6ZFdKemRISnBibWNvTVN3Z015a2dhVzRnZEdocGN5NUJRVVoxYkd4T1lXMWxjeWtnZTF4dUlDQWdJQ0FnSUNCcFppQW9iVzl1YjIxbGNpNXNaVzVuZEdnZ1BUMGdOQ0I4ZkNCdGIyNXZiV1Z5V3pSZElEMDlJQ2NvSnlrZ2UxeHVJQ0FnSUNBZ0lDQWdJR052Ym5OMElHRnRhVzV2SUQwZ2RHaHBjeTVCUVVaMWJHeE9ZVzFsYzF0dGIyNXZiV1Z5TG5OMVluTjBjbWx1WnlneExDQXpLVjA3WEc0Z0lDQWdJQ0FnSUNBZ2NtVjBkWEp1SUdGdGFXNXZJR2x1SUdOb1pXMVFZV3hsZEhSbFNXNXpkR0Z1WTJVZ1AxeHVJQ0FnSUNBZ0lDQWdJQ0FnVzJOb1pXMVFZV3hsZEhSbFNXNXpkR0Z1WTJVdVoyVjBLR0Z0YVc1dktTd2dZVzFwYm04c0lHbHVibVZ5VFc5dWIyMWxjaXdnTkYwZ09seHVJQ0FnSUNBZ0lDQWdJQ0FnVzNSb2FYTXVkVzVrWldacGJtVmtRMjlzYjNJc0lHOTFkR1Z5VFc5dWIyMWxjaXdnYVc1dVpYSk5iMjV2YldWeUxDQTBYVHRjYmlBZ0lDQWdJQ0FnZlZ4dUlDQWdJQ0FnZlZ4dUlDQWdJSDFjYmx4dUlDQWdJSEpsZEhWeWJpQmJkR2hwY3k1MWJtUmxabWx1WldSRGIyeHZjaXdnYjNWMFpYSk5iMjV2YldWeUxDQnBibTVsY2sxdmJtOXRaWElzSURCZE8xeHVJQ0I5WEc1OVhHNGlYWDA9IiwiaW1wb3J0IHsgU2VxUGFsZXR0ZUJhc2UgfSBmcm9tICcuL3NlcS1wYWxldHRlcyc7XG5leHBvcnQgY2xhc3MgTnVjbGVvdGlkZXNQYWxldHRlcyBleHRlbmRzIFNlcVBhbGV0dGVCYXNlIHtcbiAgICBzdGF0aWMgZ2V0IENocm9tYXRvZ3JhbSgpIHtcbiAgICAgICAgaWYgKHRoaXMuY2hyb21hdG9ncmFtID09PSB2b2lkIDApIHtcbiAgICAgICAgICAgIHRoaXMuY2hyb21hdG9ncmFtID0gbmV3IE51Y2xlb3RpZGVzUGFsZXR0ZXMoe1xuICAgICAgICAgICAgICAgICdBJzogJ2dyZWVuJyxcbiAgICAgICAgICAgICAgICAnQyc6ICdibHVlJyxcbiAgICAgICAgICAgICAgICAnRyc6ICdibGFjaycsXG4gICAgICAgICAgICAgICAgJ1QnOiAncmVkJyxcbiAgICAgICAgICAgICAgICAnVSc6ICdyZWQnLFxuICAgICAgICAgICAgICAgICdvdGhlcnMnOiAnZ3JheScsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5jaHJvbWF0b2dyYW07XG4gICAgfVxufVxuZXhwb3J0IGNsYXNzIE51Y2xlb3RpZGVzIHtcbn1cbk51Y2xlb3RpZGVzLlNlbVR5cGUgPSAnTnVjbGVvdGlkZXMnO1xuTnVjbGVvdGlkZXMuU2VtVHlwZU11bHRpcGxlQWxpZ25tZW50ID0gJ051Y2xlb3RpZGVzTXVsdGlwbGVBbGlnbm1lbnQnO1xuTnVjbGVvdGlkZXMuTmFtZXMgPSB7XG4gICAgJ0EnOiAnQWRlbmluZScsXG4gICAgJ0MnOiAnQ3l0b3NpbmUnLFxuICAgICdHJzogJ0d1YW5pbmUnLFxuICAgICdUJzogJ1RoeW1pbmUnLFxuICAgICdVJzogJ1VyYWNpbCcsXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZGF0YTphcHBsaWNhdGlvbi9qc29uO2Jhc2U2NCxleUoyWlhKemFXOXVJam96TENKbWFXeGxJam9pYm5WamJHVnZkR2xrWlhNdWFuTWlMQ0p6YjNWeVkyVlNiMjkwSWpvaUlpd2ljMjkxY21ObGN5STZXeUp1ZFdOc1pXOTBhV1JsY3k1MGN5SmRMQ0p1WVcxbGN5STZXMTBzSW0xaGNIQnBibWR6SWpvaVFVRkxRU3hQUVVGUExFVkJRV0VzWTBGQll5eEZRVUZETEUxQlFVMHNaMEpCUVdkQ0xFTkJRVU03UVVGRk1VUXNUVUZCVFN4UFFVRlBMRzFDUVVGdlFpeFRRVUZSTEdOQlFXTTdTVUZIT1VNc1RVRkJUU3hMUVVGTExGbEJRVms3VVVGRE5VSXNTVUZCU1N4SlFVRkpMRU5CUVVNc1dVRkJXU3hMUVVGTExFdEJRVXNzUTBGQlF5eEZRVUZGTzFsQlEyaERMRWxCUVVrc1EwRkJReXhaUVVGWkxFZEJRVWNzU1VGQlNTeHRRa0ZCYlVJc1EwRkJRenRuUWtGRE1VTXNSMEZCUnl4RlFVRkZMRTlCUVU4N1owSkJRMW9zUjBGQlJ5eEZRVUZGTEUxQlFVMDdaMEpCUTFnc1IwRkJSeXhGUVVGRkxFOUJRVTg3WjBKQlExb3NSMEZCUnl4RlFVRkZMRXRCUVVzN1owSkJRMVlzUjBGQlJ5eEZRVUZGTEV0QlFVczdaMEpCUTFZc1VVRkJVU3hGUVVGRkxFMUJRVTA3WVVGRGFrSXNRMEZCUXl4RFFVRkRPMU5CUTBvN1VVRkRSQ3hQUVVGUExFbEJRVWtzUTBGQlF5eFpRVUZaTEVOQlFVTTdTVUZETTBJc1EwRkJRenREUVVOR08wRkJSVVFzVFVGQlRTeFBRVUZQTEZkQlFWYzdPMEZCUTA0c2JVSkJRVThzUjBGQlZ5eGhRVUZoTEVOQlFVTTdRVUZGYUVNc2IwTkJRWGRDTEVkQlFWY3NPRUpCUVRoQ0xFTkJRVU03UVVGRmNFVXNhVUpCUVVzc1IwRkJjVUk3U1VGRGRFTXNSMEZCUnl4RlFVRkZMRk5CUVZNN1NVRkRaQ3hIUVVGSExFVkJRVVVzVlVGQlZUdEpRVU5tTEVkQlFVY3NSVUZCUlN4VFFVRlRPMGxCUTJRc1IwRkJSeXhGUVVGRkxGTkJRVk03U1VGRFpDeEhRVUZITEVWQlFVVXNVVUZCVVR0RFFVTmtMRU5CUVVNaUxDSnpiM1Z5WTJWelEyOXVkR1Z1ZENJNld5SnBiWEJ2Y25RZ0tpQmhjeUJuY205cklHWnliMjBnSjJSaGRHRm5jbTlyTFdGd2FTOW5jbTlySnp0Y2JtbHRjRzl5ZENBcUlHRnpJSFZwSUdaeWIyMGdKMlJoZEdGbmNtOXJMV0Z3YVM5MWFTYzdYRzVwYlhCdmNuUWdLaUJoY3lCRVJ5Qm1jbTl0SUNka1lYUmhaM0p2YXkxaGNHa3ZaR2NuTzF4dVhHNXBiWEJ2Y25RZ2UxTjBjbWx1WjBScFkzUnBiMjVoY25sOUlHWnliMjBnSjBCa1lYUmhaM0p2YXkxc2FXSnlZWEpwWlhNdmRYUnBiSE12YzNKakwzUjVjR1V0WkdWamJHRnlZWFJwYjI1ekp6dGNibWx0Y0c5eWRDQjdVMlZ4VUdGc1pYUjBaU3dnVTJWeFVHRnNaWFIwWlVKaGMyVjlJR1p5YjIwZ0p5NHZjMlZ4TFhCaGJHVjBkR1Z6Snp0Y2JseHVaWGh3YjNKMElHTnNZWE56SUU1MVkyeGxiM1JwWkdWelVHRnNaWFIwWlhNZ1pYaDBaVzVrY3lCVFpYRlFZV3hsZEhSbFFtRnpaU0I3WEc0Z0lIQnlhWFpoZEdVZ2MzUmhkR2xqSUdOb2NtOXRZWFJ2WjNKaGJUb2dVMlZ4VUdGc1pYUjBaVHRjYmx4dUlDQndkV0pzYVdNZ2MzUmhkR2xqSUdkbGRDQkRhSEp2YldGMGIyZHlZVzBvS1RvZ1UyVnhVR0ZzWlhSMFpTQjdYRzRnSUNBZ2FXWWdLSFJvYVhNdVkyaHliMjFoZEc5bmNtRnRJRDA5UFNCMmIybGtJREFwSUh0Y2JpQWdJQ0FnSUhSb2FYTXVZMmh5YjIxaGRHOW5jbUZ0SUQwZ2JtVjNJRTUxWTJ4bGIzUnBaR1Z6VUdGc1pYUjBaWE1vZTF4dUlDQWdJQ0FnSUNBblFTYzZJQ2RuY21WbGJpY3NYRzRnSUNBZ0lDQWdJQ2RESnpvZ0oySnNkV1VuTEZ4dUlDQWdJQ0FnSUNBblJ5YzZJQ2RpYkdGamF5Y3NJQzh2SUc5eVlXNW5aU0EvWEc0Z0lDQWdJQ0FnSUNkVUp6b2dKM0psWkNjc1hHNGdJQ0FnSUNBZ0lDZFZKem9nSjNKbFpDY3NYRzRnSUNBZ0lDQWdJQ2R2ZEdobGNuTW5PaUFuWjNKaGVTY3NYRzRnSUNBZ0lDQjlLVHRjYmlBZ0lDQjlYRzRnSUNBZ2NtVjBkWEp1SUhSb2FYTXVZMmh5YjIxaGRHOW5jbUZ0TzF4dUlDQjlYRzU5WEc1Y2JtVjRjRzl5ZENCamJHRnpjeUJPZFdOc1pXOTBhV1JsY3lCN1hHNGdJSE4wWVhScFl5QnlaV0ZrYjI1c2VTQlRaVzFVZVhCbE9pQnpkSEpwYm1jZ1BTQW5UblZqYkdWdmRHbGtaWE1uTzF4dVhHNGdJSE4wWVhScFl5QnlaV0ZrYjI1c2VTQlRaVzFVZVhCbFRYVnNkR2x3YkdWQmJHbG5ibTFsYm5RNklITjBjbWx1WnlBOUlDZE9kV05zWlc5MGFXUmxjMDExYkhScGNHeGxRV3hwWjI1dFpXNTBKenRjYmx4dUlDQndkV0pzYVdNZ2MzUmhkR2xqSUU1aGJXVnpPaUJUZEhKcGJtZEVhV04wYVc5dVlYSjVJRDBnZTF4dUlDQWdJQ2RCSnpvZ0owRmtaVzVwYm1VbkxGeHVJQ0FnSUNkREp6b2dKME41ZEc5emFXNWxKeXhjYmlBZ0lDQW5SeWM2SUNkSGRXRnVhVzVsSnl4Y2JpQWdJQ0FuVkNjNklDZFVhSGx0YVc1bEp5eGNiaUFnSUNBblZTYzZJQ2RWY21GamFXd25MRnh1SUNCOU8xeHVmVnh1SWwxOSIsImV4cG9ydCBjbGFzcyBTZXFQYWxldHRlQmFzZSB7XG4gICAgc3RhdGljIG1ha2VQYWxldHRlKGR0LCBzaW1wbGlmaWVkID0gZmFsc2UsIFBhbGV0dGVUeXBlID0gU2VxUGFsZXR0ZUJhc2UpIHtcbiAgICAgICAgY29uc3QgcGFsZXR0ZSA9IHt9O1xuICAgICAgICBkdC5mb3JFYWNoKChjcCkgPT4ge1xuICAgICAgICAgICAgY29uc3Qgb2JqTGlzdCA9IGNwWzBdO1xuICAgICAgICAgICAgY29uc3QgY29sb3VyID0gY3BbMV07XG4gICAgICAgICAgICBvYmpMaXN0LmZvckVhY2goKG9iaiwgaW5kKSA9PiB7XG4gICAgICAgICAgICAgICAgcGFsZXR0ZVtvYmpdID0gdGhpcy5jb2xvdXJQYWxldHRlW2NvbG91cl1bc2ltcGxpZmllZCA/IDAgOiBpbmRdO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gbmV3IFBhbGV0dGVUeXBlKHBhbGV0dGUpO1xuICAgIH1cbiAgICBjb25zdHJ1Y3RvcihwYWxldHRlKSB7XG4gICAgICAgIHRoaXMuX3BhbGV0dGUgPSBwYWxldHRlO1xuICAgIH1cbiAgICBnZXQobSkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcGFsZXR0ZVttXTtcbiAgICB9XG59XG5TZXFQYWxldHRlQmFzZS51bmRlZmluZWRDb2xvciA9ICdyZ2IoMTAwLDEwMCwxMDApJztcbi8qKiBQYWxldHRlIHdpdGggc2hhZGVzIG9mIHByaW1hcnkgY29sb3JzICovXG5TZXFQYWxldHRlQmFzZS5jb2xvdXJQYWxldHRlID0ge1xuICAgICdvcmFuZ2UnOiBbJ3JnYigyNTUsMTg3LDEyMCknLCAncmdiKDI0NSwxNjcsMTAwKScsICdyZ2IoMjM1LDEzNyw3MCknLCAncmdiKDIwNSwgMTExLCA3MSknXSxcbiAgICAnYWxsX2dyZWVuJzogWydyZ2IoNDQsMTYwLDQ0KScsICdyZ2IoNzQsMTYwLDc0KScsICdyZ2IoMjMsMTAzLDU3KScsICdyZ2IoMzAsMTEwLDk2KScsICdyZ2IoNjAsMTMxLDk1KScsXG4gICAgICAgICdyZ2IoMjQsMTEwLDc5KScsICdyZ2IoMTUyLDIyMywxMzgpJywgJ3JnYigxODIsIDIyMywgMTM4KScsICdyZ2IoMTUyLCAxOTMsIDEzOCknXSxcbiAgICAnYWxsX2JsdWUnOiBbJ3JnYigzMSwxMTksMTgwKScsICdyZ2IoMjMsMTkwLDIwNyknLCAncmdiKDEyMiwgMTAyLCAxODkpJywgJ3JnYigxNTgsMjE4LDIyOSknLCAncmdiKDE0MSwgMTI0LCAyMTcpJyxcbiAgICAgICAgJ3JnYigzMSwgMTIwLCAxNTApJ10sXG4gICAgJ21hZ2VudGEnOiBbJ3JnYigxNjIsMTA2LDE5MiknLCAncmdiKDE5NywxNjUsMjI0KScsICdyZ2IoMjA4LDExMywyMTgpJ10sXG4gICAgJ3JlZCc6IFsncmdiKDIxNCwzOSw0MCknLCAncmdiKDI1NSwxNTIsMTUwKSddLFxuICAgICdzdF9ibHVlJzogWydyZ2IoMjMsMTkwLDIwNyknLCAncmdiKDE1OCwyMTgsMjI5KScsICdyZ2IoMzEsMTE5LDE4MCknXSxcbiAgICAnZGFya19ibHVlJzogWydyZ2IoMzEsMTE5LDE4MCknLCAncmdiKDMxLCAxMjAsIDE1MCknXSxcbiAgICAnbGlnaHRfYmx1ZSc6IFsncmdiKDIzLDE5MCwyMDcpJywgJ3JnYigxNTgsMjE4LDIyOSknLCAncmdiKDEwOCwgMjE4LCAyMjkpJywgJ3JnYigyMywxOTAsMjI3KSddLFxuICAgICdsaWxhY19ibHVlJzogWydyZ2IoMTI0LDEwMiwyMTEpJywgJ3JnYigxNDksMTM0LDIxNyknLCAncmdiKDk3LCA4MSwgMTUwKSddLFxuICAgICdkYXJrX2dyZWVuJzogWydyZ2IoMjMsMTAzLDU3KScsICdyZ2IoMzAsMTEwLDk2KScsICdyZ2IoNjAsMTMxLDk1KScsICdyZ2IoMjQsMTEwLDc5KSddLFxuICAgICdncmVlbic6IFsncmdiKDQ0LDE2MCw0NCknLCAncmdiKDc0LDE2MCw3NCknXSxcbiAgICAnbGlnaHRfZ3JlZW4nOiBbJ3JnYigxNTIsMjIzLDEzOCknLCAncmdiKDE4MiwgMjIzLCAxMzgpJywgJ3JnYigxNTIsIDE5MywgMTM4KSddLFxuICAgICdzdF9ncmVlbic6IFsncmdiKDQ0LDE2MCw0NCknLCAncmdiKDE1MiwyMjMsMTM4KScsICdyZ2IoMzksIDE3NCwgOTYpJywgJ3JnYig3NCwxNjAsNzQpJ10sXG4gICAgJ3BpbmsnOiBbJ3JnYigyNDcsMTgyLDIxMCknXSxcbiAgICAnYnJvd24nOiBbJ3JnYigxNDAsODYsNzUpJywgJ3JnYigxMDIsIDYyLCA1NCknXSxcbiAgICAnZ3JheSc6IFsncmdiKDEyNywxMjcsMTI3KScsICdyZ2IoMTk5LDE5OSwxOTkpJywgJ3JnYigxOTYsMTU2LDE0OCknLCAncmdiKDIyMiwgMjIyLCAxODApJ10sXG4gICAgJ3llbGxvdyc6IFsncmdiKDE4OCwxODksMzQpJ10sXG4gICAgJ3doaXRlJzogWydyZ2IoMjMwLDIzMCwyMzApJ10sXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZGF0YTphcHBsaWNhdGlvbi9qc29uO2Jhc2U2NCxleUoyWlhKemFXOXVJam96TENKbWFXeGxJam9pYzJWeExYQmhiR1YwZEdWekxtcHpJaXdpYzI5MWNtTmxVbTl2ZENJNklpSXNJbk52ZFhKalpYTWlPbHNpYzJWeExYQmhiR1YwZEdWekxuUnpJbDBzSW01aGJXVnpJanBiWFN3aWJXRndjR2x1WjNNaU9pSkJRV2xDUVN4TlFVRk5MRTlCUVU4c1kwRkJZenRKUVRKQ1ppeE5RVUZOTEVOQlFVTXNWMEZCVnl4RFFVRkRMRVZCUVhkQ0xFVkJRMjVFTEZWQlFWVXNSMEZCUnl4TFFVRkxMRVZCUVVVc1kwRkJjVU1zWTBGQll6dFJRVVYyUlN4TlFVRk5MRTlCUVU4c1IwRkJPRUlzUlVGQlJTeERRVUZETzFGQlF6bERMRVZCUVVVc1EwRkJReXhQUVVGUExFTkJRVU1zUTBGQlF5eEZRVUZGTEVWQlFVVXNSVUZCUlR0WlFVTm9RaXhOUVVGTkxFOUJRVThzUjBGQlJ5eEZRVUZGTEVOQlFVTXNRMEZCUXl4RFFVRkRMRU5CUVVNN1dVRkRkRUlzVFVGQlRTeE5RVUZOTEVkQlFVY3NSVUZCUlN4RFFVRkRMRU5CUVVNc1EwRkJReXhEUVVGRE8xbEJRM0pDTEU5QlFVOHNRMEZCUXl4UFFVRlBMRU5CUVVNc1EwRkJReXhIUVVGSExFVkJRVVVzUjBGQlJ5eEZRVUZGTEVWQlFVVTdaMEpCUXpOQ0xFOUJRVThzUTBGQlF5eEhRVUZITEVOQlFVTXNSMEZCUnl4SlFVRkpMRU5CUVVNc1lVRkJZU3hEUVVGRExFMUJRVTBzUTBGQlF5eERRVUZETEZWQlFWVXNRMEZCUXl4RFFVRkRMRU5CUVVNc1EwRkJReXhEUVVGRExFTkJRVU1zUTBGQlF5eEhRVUZITEVOQlFVTXNRMEZCUXp0WlFVTnNSU3hEUVVGRExFTkJRVU1zUTBGQlF6dFJRVU5NTEVOQlFVTXNRMEZCUXl4RFFVRkRPMUZCUTBnc1QwRkJUeXhKUVVGSkxGZEJRVmNzUTBGQlF5eFBRVUZQTEVOQlFVTXNRMEZCUXp0SlFVTnNReXhEUVVGRE8wbEJTVVFzV1VGQldTeFBRVUZuUXp0UlFVTXhReXhKUVVGSkxFTkJRVU1zVVVGQlVTeEhRVUZITEU5QlFVOHNRMEZCUXp0SlFVTXhRaXhEUVVGRE8wbEJSVTBzUjBGQlJ5eERRVUZETEVOQlFWTTdVVUZEYkVJc1QwRkJUeXhKUVVGSkxFTkJRVU1zVVVGQlVTeERRVUZETEVOQlFVTXNRMEZCUXl4RFFVRkRPMGxCUXpGQ0xFTkJRVU03TzBGQmFFUmhMRFpDUVVGakxFZEJRVWNzYTBKQlFXdENMRU5CUVVNN1FVRkZiRVFzTkVOQlFUUkRPMEZCUXpsQ0xEUkNRVUZoTEVkQlFXZERPMGxCUTNwRUxGRkJRVkVzUlVGQlJTeERRVUZETEd0Q1FVRnJRaXhGUVVGRkxHdENRVUZyUWl4RlFVRkZMR2xDUVVGcFFpeEZRVUZGTEcxQ1FVRnRRaXhEUVVGRE8wbEJRekZHTEZkQlFWY3NSVUZCUlN4RFFVRkRMR2RDUVVGblFpeEZRVUZGTEdkQ1FVRm5RaXhGUVVGRkxHZENRVUZuUWl4RlFVRkZMR2RDUVVGblFpeEZRVUZGTEdkQ1FVRm5RanRSUVVOd1J5eG5Ra0ZCWjBJc1JVRkJSU3hyUWtGQmEwSXNSVUZCUlN4dlFrRkJiMElzUlVGQlJTeHZRa0ZCYjBJc1EwRkJRenRKUVVOdVJpeFZRVUZWTEVWQlFVVXNRMEZCUXl4cFFrRkJhVUlzUlVGQlJTeHBRa0ZCYVVJc1JVRkJSU3h2UWtGQmIwSXNSVUZCUlN4clFrRkJhMElzUlVGQlJTeHZRa0ZCYjBJN1VVRkRMMGNzYlVKQlFXMUNMRU5CUVVNN1NVRkRkRUlzVTBGQlV5eEZRVUZGTEVOQlFVTXNhMEpCUVd0Q0xFVkJRVVVzYTBKQlFXdENMRVZCUVVVc2EwSkJRV3RDTEVOQlFVTTdTVUZEZGtVc1MwRkJTeXhGUVVGRkxFTkJRVU1zWjBKQlFXZENMRVZCUVVVc2EwSkJRV3RDTEVOQlFVTTdTVUZETjBNc1UwRkJVeXhGUVVGRkxFTkJRVU1zYVVKQlFXbENMRVZCUVVVc2EwSkJRV3RDTEVWQlFVVXNhVUpCUVdsQ0xFTkJRVU03U1VGRGNrVXNWMEZCVnl4RlFVRkZMRU5CUVVNc2FVSkJRV2xDTEVWQlFVVXNiVUpCUVcxQ0xFTkJRVU03U1VGRGNrUXNXVUZCV1N4RlFVRkZMRU5CUVVNc2FVSkJRV2xDTEVWQlFVVXNhMEpCUVd0Q0xFVkJRVVVzYjBKQlFXOUNMRVZCUVVVc2FVSkJRV2xDTEVOQlFVTTdTVUZET1VZc1dVRkJXU3hGUVVGRkxFTkJRVU1zYTBKQlFXdENMRVZCUVVVc2EwSkJRV3RDTEVWQlFVVXNhMEpCUVd0Q0xFTkJRVU03U1VGRE1VVXNXVUZCV1N4RlFVRkZMRU5CUVVNc1owSkJRV2RDTEVWQlFVVXNaMEpCUVdkQ0xFVkJRVVVzWjBKQlFXZENMRVZCUVVVc1owSkJRV2RDTEVOQlFVTTdTVUZEZEVZc1QwRkJUeXhGUVVGRkxFTkJRVU1zWjBKQlFXZENMRVZCUVVVc1owSkJRV2RDTEVOQlFVTTdTVUZETjBNc1lVRkJZU3hGUVVGRkxFTkJRVU1zYTBKQlFXdENMRVZCUVVVc2IwSkJRVzlDTEVWQlFVVXNiMEpCUVc5Q0xFTkJRVU03U1VGREwwVXNWVUZCVlN4RlFVRkZMRU5CUVVNc1owSkJRV2RDTEVWQlFVVXNhMEpCUVd0Q0xFVkJRVVVzYTBKQlFXdENMRVZCUVVVc1owSkJRV2RDTEVOQlFVTTdTVUZEZUVZc1RVRkJUU3hGUVVGRkxFTkJRVU1zYTBKQlFXdENMRU5CUVVNN1NVRkROVUlzVDBGQlR5eEZRVUZGTEVOQlFVTXNaMEpCUVdkQ0xFVkJRVVVzYTBKQlFXdENMRU5CUVVNN1NVRkRMME1zVFVGQlRTeEZRVUZGTEVOQlFVTXNhMEpCUVd0Q0xFVkJRVVVzYTBKQlFXdENMRVZCUVVVc2EwSkJRV3RDTEVWQlFVVXNiMEpCUVc5Q0xFTkJRVU03U1VGRE1VWXNVVUZCVVN4RlFVRkZMRU5CUVVNc2FVSkJRV2xDTEVOQlFVTTdTVUZETjBJc1QwRkJUeXhGUVVGRkxFTkJRVU1zYTBKQlFXdENMRU5CUVVNN1EwRkRPVUlzUTBGQlF5SXNJbk52ZFhKalpYTkRiMjUwWlc1MElqcGJJbWx0Y0c5eWRDQXFJR0Z6SUdkeWIyc2dabkp2YlNBblpHRjBZV2R5YjJzdFlYQnBMMmR5YjJzbk8xeHVhVzF3YjNKMElDb2dZWE1nZFdrZ1puSnZiU0FuWkdGMFlXZHliMnN0WVhCcEwzVnBKenRjYm1sdGNHOXlkQ0FxSUdGeklFUkhJR1p5YjIwZ0oyUmhkR0ZuY205ckxXRndhUzlrWnljN1hHNWNibVY0Y0c5eWRDQnBiblJsY21aaFkyVWdVMlZ4VUdGc1pYUjBaU0I3WEc0Z0lDOHZJRlJvWlhKbElHRnlaU0IwYjI4Z2JYVmphQ0J3Y205aWJHVnRJSGRwZEdnZ2FXNWtaWGhsY2lCd2NtOXdaWEowZVNCcGJpQjBlWEJsYzJOeWFYQjBMbHh1SUNBdkx5QXZLaXBjYmlBZ0x5OGdJQ29nUUhCaGNtRnRJSHR6ZEhKcGJtZDlJRzBnVFc5dWIyMWxjaUJqYUdGeVlXTjBaWEpjYmlBZ0x5OGdJQ29nUUhKbGRIVnliaUI3YzNSeWFXNW5mU0JEYjJ4dmNseHVJQ0F2THlBZ0tpOWNiaUFnTHk4Z1cyMDZJSE4wY21sdVoxMDZJSE4wY21sdVp6dGNiaUFnTHlvcUlFMXZibTl0WlhJZ1kyOXNiM0pjYmlBZ0lDb2dRSEJoY21GdElIdHpkSEpwYm1kOUlHMGdUVzl1YjIxbGNseHVJQ0FnS2k5Y2JpQWdaMlYwS0cwNklITjBjbWx1WnlrNklITjBjbWx1Wnp0Y2JuMWNibHh1Wlhod2IzSjBJR05zWVhOeklGTmxjVkJoYkdWMGRHVkNZWE5sSUdsdGNHeGxiV1Z1ZEhNZ1UyVnhVR0ZzWlhSMFpTQjdYRzRnSUhCMVlteHBZeUJ6ZEdGMGFXTWdkVzVrWldacGJtVmtRMjlzYjNJZ1BTQW5jbWRpS0RFd01Dd3hNREFzTVRBd0tTYzdYRzVjYmlBZ0x5b3FJRkJoYkdWMGRHVWdkMmwwYUNCemFHRmtaWE1nYjJZZ2NISnBiV0Z5ZVNCamIyeHZjbk1nS2k5Y2JpQWdjSFZpYkdsaklITjBZWFJwWXlCamIyeHZkWEpRWVd4bGRIUmxPaUI3SUZ0clpYazZJSE4wY21sdVoxMDZJSE4wY21sdVoxdGRJSDBnUFNCN1hHNGdJQ0FnSjI5eVlXNW5aU2M2SUZzbmNtZGlLREkxTlN3eE9EY3NNVEl3S1Njc0lDZHlaMklvTWpRMUxERTJOeXd4TURBcEp5d2dKM0puWWlneU16VXNNVE0zTERjd0tTY3NJQ2R5WjJJb01qQTFMQ0F4TVRFc0lEY3hLU2RkTEZ4dUlDQWdJQ2RoYkd4ZlozSmxaVzRuT2lCYkozSm5ZaWcwTkN3eE5qQXNORFFwSnl3Z0ozSm5ZaWczTkN3eE5qQXNOelFwSnl3Z0ozSm5ZaWd5TXl3eE1ETXNOVGNwSnl3Z0ozSm5ZaWd6TUN3eE1UQXNPVFlwSnl3Z0ozSm5ZaWcyTUN3eE16RXNPVFVwSnl4Y2JpQWdJQ0FnSUNkeVoySW9NalFzTVRFd0xEYzVLU2NzSUNkeVoySW9NVFV5TERJeU15d3hNemdwSnl3Z0ozSm5ZaWd4T0RJc0lESXlNeXdnTVRNNEtTY3NJQ2R5WjJJb01UVXlMQ0F4T1RNc0lERXpPQ2tuWFN4Y2JpQWdJQ0FuWVd4c1gySnNkV1VuT2lCYkozSm5ZaWd6TVN3eE1Ua3NNVGd3S1Njc0lDZHlaMklvTWpNc01Ua3dMREl3TnlrbkxDQW5jbWRpS0RFeU1pd2dNVEF5TENBeE9Ea3BKeXdnSjNKbllpZ3hOVGdzTWpFNExESXlPU2tuTENBbmNtZGlLREUwTVN3Z01USTBMQ0F5TVRjcEp5eGNiaUFnSUNBZ0lDZHlaMklvTXpFc0lERXlNQ3dnTVRVd0tTZGRMRnh1SUNBZ0lDZHRZV2RsYm5SaEp6b2dXeWR5WjJJb01UWXlMREV3Tml3eE9USXBKeXdnSjNKbllpZ3hPVGNzTVRZMUxESXlOQ2tuTENBbmNtZGlLREl3T0N3eE1UTXNNakU0S1NkZExGeHVJQ0FnSUNkeVpXUW5PaUJiSjNKbllpZ3lNVFFzTXprc05EQXBKeXdnSjNKbllpZ3lOVFVzTVRVeUxERTFNQ2tuWFN4Y2JpQWdJQ0FuYzNSZllteDFaU2M2SUZzbmNtZGlLREl6TERFNU1Dd3lNRGNwSnl3Z0ozSm5ZaWd4TlRnc01qRTRMREl5T1NrbkxDQW5jbWRpS0RNeExERXhPU3d4T0RBcEoxMHNYRzRnSUNBZ0oyUmhjbXRmWW14MVpTYzZJRnNuY21kaUtETXhMREV4T1N3eE9EQXBKeXdnSjNKbllpZ3pNU3dnTVRJd0xDQXhOVEFwSjEwc1hHNGdJQ0FnSjJ4cFoyaDBYMkpzZFdVbk9pQmJKM0puWWlneU15d3hPVEFzTWpBM0tTY3NJQ2R5WjJJb01UVTRMREl4T0N3eU1qa3BKeXdnSjNKbllpZ3hNRGdzSURJeE9Dd2dNakk1S1Njc0lDZHlaMklvTWpNc01Ua3dMREl5TnlrblhTeGNiaUFnSUNBbmJHbHNZV05mWW14MVpTYzZJRnNuY21kaUtERXlOQ3d4TURJc01qRXhLU2NzSUNkeVoySW9NVFE1TERFek5Dd3lNVGNwSnl3Z0ozSm5ZaWc1Tnl3Z09ERXNJREUxTUNrblhTeGNiaUFnSUNBblpHRnlhMTluY21WbGJpYzZJRnNuY21kaUtESXpMREV3TXl3MU55a25MQ0FuY21kaUtETXdMREV4TUN3NU5pa25MQ0FuY21kaUtEWXdMREV6TVN3NU5Ta25MQ0FuY21kaUtESTBMREV4TUN3M09Ta25YU3hjYmlBZ0lDQW5aM0psWlc0bk9pQmJKM0puWWlnME5Dd3hOakFzTkRRcEp5d2dKM0puWWlnM05Dd3hOakFzTnpRcEoxMHNYRzRnSUNBZ0oyeHBaMmgwWDJkeVpXVnVKem9nV3lkeVoySW9NVFV5TERJeU15d3hNemdwSnl3Z0ozSm5ZaWd4T0RJc0lESXlNeXdnTVRNNEtTY3NJQ2R5WjJJb01UVXlMQ0F4T1RNc0lERXpPQ2tuWFN4Y2JpQWdJQ0FuYzNSZlozSmxaVzRuT2lCYkozSm5ZaWcwTkN3eE5qQXNORFFwSnl3Z0ozSm5ZaWd4TlRJc01qSXpMREV6T0NrbkxDQW5jbWRpS0RNNUxDQXhOelFzSURrMktTY3NJQ2R5WjJJb056UXNNVFl3TERjMEtTZGRMRnh1SUNBZ0lDZHdhVzVySnpvZ1d5ZHlaMklvTWpRM0xERTRNaXd5TVRBcEoxMHNYRzRnSUNBZ0oySnliM2R1SnpvZ1d5ZHlaMklvTVRRd0xEZzJMRGMxS1Njc0lDZHlaMklvTVRBeUxDQTJNaXdnTlRRcEoxMHNYRzRnSUNBZ0oyZHlZWGtuT2lCYkozSm5ZaWd4TWpjc01USTNMREV5TnlrbkxDQW5jbWRpS0RFNU9Td3hPVGtzTVRrNUtTY3NJQ2R5WjJJb01UazJMREUxTml3eE5EZ3BKeXdnSjNKbllpZ3lNaklzSURJeU1pd2dNVGd3S1NkZExGeHVJQ0FnSUNkNVpXeHNiM2NuT2lCYkozSm5ZaWd4T0Rnc01UZzVMRE0wS1NkZExGeHVJQ0FnSUNkM2FHbDBaU2M2SUZzbmNtZGlLREl6TUN3eU16QXNNak13S1NkZExGeHVJQ0I5TzF4dVhHNGdJSEJ5YjNSbFkzUmxaQ0J6ZEdGMGFXTWdiV0ZyWlZCaGJHVjBkR1VvWkhRNklGdHpkSEpwYm1kYlhTd2djM1J5YVc1blhWdGRMRnh1SUNBZ0lITnBiWEJzYVdacFpXUWdQU0JtWVd4elpTd2dVR0ZzWlhSMFpWUjVjR1U2SUhSNWNHVnZaaUJUWlhGUVlXeGxkSFJsUW1GelpTQTlJRk5sY1ZCaGJHVjBkR1ZDWVhObFhHNGdJQ2tnZTF4dUlDQWdJR052Ym5OMElIQmhiR1YwZEdVNklIc2dXMnRsZVRvZ2MzUnlhVzVuWFRvZ2MzUnlhVzVuSUgwZ1BTQjdmVHRjYmlBZ0lDQmtkQzVtYjNKRllXTm9LQ2hqY0NrZ1BUNGdlMXh1SUNBZ0lDQWdZMjl1YzNRZ2IySnFUR2x6ZENBOUlHTndXekJkTzF4dUlDQWdJQ0FnWTI5dWMzUWdZMjlzYjNWeUlEMGdZM0JiTVYwN1hHNGdJQ0FnSUNCdlltcE1hWE4wTG1admNrVmhZMmdvS0c5aWFpd2dhVzVrS1NBOVBpQjdYRzRnSUNBZ0lDQWdJSEJoYkdWMGRHVmJiMkpxWFNBOUlIUm9hWE11WTI5c2IzVnlVR0ZzWlhSMFpWdGpiMnh2ZFhKZFczTnBiWEJzYVdacFpXUWdQeUF3SURvZ2FXNWtYVHRjYmlBZ0lDQWdJSDBwTzF4dUlDQWdJSDBwTzF4dUlDQWdJSEpsZEhWeWJpQnVaWGNnVUdGc1pYUjBaVlI1Y0dVb2NHRnNaWFIwWlNrN1hHNGdJSDFjYmx4dUlDQndjbWwyWVhSbElISmxZV1J2Ym14NUlGOXdZV3hsZEhSbE9pQjdJRnR0T2lCemRISnBibWRkT2lCemRISnBibWNnZlR0Y2JseHVJQ0JqYjI1emRISjFZM1J2Y2lod1lXeGxkSFJsT2lCN0lGdHRPaUJ6ZEhKcGJtZGRPaUJ6ZEhKcGJtY2dmU2tnZTF4dUlDQWdJSFJvYVhNdVgzQmhiR1YwZEdVZ1BTQndZV3hsZEhSbE8xeHVJQ0I5WEc1Y2JpQWdjSFZpYkdsaklHZGxkQ2h0T2lCemRISnBibWNwT2lCemRISnBibWNnZTF4dUlDQWdJSEpsZEhWeWJpQjBhR2x6TGw5d1lXeGxkSFJsVzIxZE8xeHVJQ0I5WEc1OVhHNGlYWDA9IiwiaW1wb3J0ICogYXMgREcgZnJvbSAnZGF0YWdyb2stYXBpL2RnJztcbi8qKiBtYWtlcyB0aGUgY29sb3IgbGVzcyB3aGl0ZSwgbWFrZXMgdGhlIHRyYW5zcGFyZW5jeSBlZmZlY3QgYWx3YXlzIHBlcmNlcHRpYmxlXG4gKiBAcGFyYW0ge3N0cmluZ30gY29sb3IgeCBjb29yZGluYXRlLlxuICogKi9cbmZ1bmN0aW9uIGNvcnJlY3RDb2xvcihjb2xvcikge1xuICAgIGlmIChjb2xvciA9PSBudWxsKVxuICAgICAgICByZXR1cm4gJ3JnYigxMDAsMTAwLDEwMCknO1xuICAgIGNvbnN0IGRnQ29sb3IgPSBERy5Db2xvci5mcm9tSHRtbChjb2xvcik7XG4gICAgY29uc3QgZyA9IERHLkNvbG9yLmcoZGdDb2xvcik7XG4gICAgY29uc3QgciA9IERHLkNvbG9yLnIoZGdDb2xvcik7XG4gICAgY29uc3QgYiA9IERHLkNvbG9yLmIoZGdDb2xvcik7XG4gICAgLy8gY2FsY3VsYXRlIGV1Y2xpZGVhbiBkaXN0YW5jZSB0byB3aGl0ZVxuICAgIGNvbnN0IGRpc3RUb0JsYWNrID0gTWF0aC5zcXJ0KE1hdGgucG93KDAgLSByLCAyKSArIE1hdGgucG93KDAgLSBnLCAyKSArIE1hdGgucG93KDAgLSBiLCAyKSk7XG4gICAgLy8gbm9ybWFsaXplIHZlY3RvciByIGcgYlxuICAgIGNvbnN0IG5vcm1SID0gciAvIGRpc3RUb0JsYWNrO1xuICAgIGNvbnN0IG5vcm1HID0gZyAvIGRpc3RUb0JsYWNrO1xuICAgIGNvbnN0IG5vcm1CID0gYiAvIGRpc3RUb0JsYWNrO1xuICAgIGlmIChkaXN0VG9CbGFjayA+IDIxMCkge1xuICAgICAgICByZXR1cm4gYHJnYigke25vcm1SICogMjEwfSwke25vcm1HICogMjEwfSwke25vcm1CICogMjEwfSlgO1xuICAgIH1cbiAgICByZXR1cm4gREcuQ29sb3IudG9SZ2IoZGdDb2xvcik7XG59XG5leHBvcnQgY2xhc3MgU3RyaW5nVXRpbHMge1xuICAgIHN0YXRpYyBoYXNoQ29kZShzKSB7XG4gICAgICAgIGxldCBoYXNoID0gMDtcbiAgICAgICAgaWYgKHMubGVuZ3RoID09PSAwKVxuICAgICAgICAgICAgcmV0dXJuIGhhc2g7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgY2hyID0gcy5jaGFyQ29kZUF0KGkpO1xuICAgICAgICAgICAgaGFzaCA9ICgoaGFzaCA8PCA1KSAtIGhhc2gpICsgY2hyO1xuICAgICAgICAgICAgaGFzaCB8PSAwOyAvLyBDb252ZXJ0IHRvIDMyYml0IGludGVnZXJcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaGFzaDtcbiAgICB9XG59XG5pbXBvcnQgeyBTZXFQYWxldHRlQmFzZSB9IGZyb20gJy4vc2VxLXBhbGV0dGVzJztcbmV4cG9ydCBjbGFzcyBVbmtub3duU2VxUGFsZXR0ZSB7XG59XG5leHBvcnQgY2xhc3MgR3JheUFsbFBhbGV0dGUgZXh0ZW5kcyBVbmtub3duU2VxUGFsZXR0ZSB7XG4gICAgZ2V0KG0pIHtcbiAgICAgICAgcmV0dXJuICcjNjY2NjY2JztcbiAgICB9XG59XG5leHBvcnQgY2xhc3MgVW5rbm93bkNvbG9yUGFsZXR0ZSBleHRlbmRzIFVua25vd25TZXFQYWxldHRlIHtcbiAgICBzdGF0aWMgYnVpbGRQYWxldHRlKCkge1xuICAgICAgICBjb25zdCByZXMgPSBbXS5jb25jYXQoLi4uT2JqZWN0LnZhbHVlcyhTZXFQYWxldHRlQmFzZS5jb2xvdXJQYWxldHRlKSk7XG4gICAgICAgIHJldHVybiByZXM7XG4gICAgfVxuICAgIGdldChtKSB7XG4gICAgICAgIGNvbnN0IGhhc2ggPSBTdHJpbmdVdGlscy5oYXNoQ29kZShtKTtcbiAgICAgICAgY29uc3QgcEkgPSBoYXNoICUgVW5rbm93bkNvbG9yUGFsZXR0ZS5wYWxldHRlLmxlbmd0aDtcbiAgICAgICAgcmV0dXJuIGNvcnJlY3RDb2xvcihVbmtub3duQ29sb3JQYWxldHRlLnBhbGV0dGVbcEldKTtcbiAgICB9XG59XG5Vbmtub3duQ29sb3JQYWxldHRlLnBhbGV0dGUgPSBVbmtub3duQ29sb3JQYWxldHRlLmJ1aWxkUGFsZXR0ZSgpO1xuZXhwb3J0IGNsYXNzIFVua25vd25TZXFQYWxldHRlcyBleHRlbmRzIFNlcVBhbGV0dGVCYXNlIHtcbiAgICBzdGF0aWMgZ2V0IEdyYXkoKSB7XG4gICAgICAgIGlmICh0aGlzLmdyYXkgPT09IHZvaWQgMClcbiAgICAgICAgICAgIHRoaXMuZ3JheSA9IG5ldyBHcmF5QWxsUGFsZXR0ZSgpO1xuICAgICAgICByZXR1cm4gdGhpcy5ncmF5O1xuICAgIH1cbiAgICBzdGF0aWMgZ2V0IENvbG9yKCkge1xuICAgICAgICBpZiAodGhpcy5jb2xvciA9PT0gdm9pZCAwKVxuICAgICAgICAgICAgdGhpcy5jb2xvciA9IG5ldyBVbmtub3duQ29sb3JQYWxldHRlKCk7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbG9yO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWRhdGE6YXBwbGljYXRpb24vanNvbjtiYXNlNjQsZXlKMlpYSnphVzl1SWpvekxDSm1hV3hsSWpvaWRXNXJibTkzYmk1cWN5SXNJbk52ZFhKalpWSnZiM1FpT2lJaUxDSnpiM1Z5WTJWeklqcGJJblZ1YTI1dmQyNHVkSE1pWFN3aWJtRnRaWE1pT2x0ZExDSnRZWEJ3YVc1bmN5STZJa0ZCUlVFc1QwRkJUeXhMUVVGTExFVkJRVVVzVFVGQlRTeHBRa0ZCYVVJc1EwRkJRenRCUVVWMFF6czdTMEZGU3p0QlFVTk1MRk5CUVZNc1dVRkJXU3hEUVVGRExFdEJRVzlDTzBsQlEzaERMRWxCUVVrc1MwRkJTeXhKUVVGSkxFbEJRVWs3VVVGRFppeFBRVUZQTEd0Q1FVRnJRaXhEUVVGRE8wbEJSVFZDTEUxQlFVMHNUMEZCVHl4SFFVRlhMRVZCUVVVc1EwRkJReXhMUVVGTExFTkJRVU1zVVVGQlVTeERRVUZETEV0QlFVc3NRMEZCUXl4RFFVRkRPMGxCUTJwRUxFMUJRVTBzUTBGQlF5eEhRVUZITEVWQlFVVXNRMEZCUXl4TFFVRkxMRU5CUVVNc1EwRkJReXhEUVVGRExFOUJRVThzUTBGQlF5eERRVUZETzBsQlF6bENMRTFCUVUwc1EwRkJReXhIUVVGSExFVkJRVVVzUTBGQlF5eExRVUZMTEVOQlFVTXNRMEZCUXl4RFFVRkRMRTlCUVU4c1EwRkJReXhEUVVGRE8wbEJRemxDTEUxQlFVMHNRMEZCUXl4SFFVRkhMRVZCUVVVc1EwRkJReXhMUVVGTExFTkJRVU1zUTBGQlF5eERRVUZETEU5QlFVOHNRMEZCUXl4RFFVRkRPMGxCUXpsQ0xIZERRVUYzUXp0SlFVTjRReXhOUVVGTkxGZEJRVmNzUjBGQlJ5eEpRVUZKTEVOQlFVTXNTVUZCU1N4RFFVRkRMRWxCUVVrc1EwRkJReXhIUVVGSExFTkJRVU1zUTBGQlF5eEhRVUZITEVOQlFVTXNSVUZCUlN4RFFVRkRMRU5CUVVNc1IwRkJSeXhKUVVGSkxFTkJRVU1zUjBGQlJ5eERRVUZETEVOQlFVTXNSMEZCUnl4RFFVRkRMRVZCUVVVc1EwRkJReXhEUVVGRExFZEJRVWNzU1VGQlNTeERRVUZETEVkQlFVY3NRMEZCUXl4RFFVRkRMRWRCUVVjc1EwRkJReXhGUVVGRkxFTkJRVU1zUTBGQlF5eERRVUZETEVOQlFVTTdTVUZETlVZc2VVSkJRWGxDTzBsQlEzcENMRTFCUVUwc1MwRkJTeXhIUVVGSExFTkJRVU1zUjBGQlJ5eFhRVUZYTEVOQlFVTTdTVUZET1VJc1RVRkJUU3hMUVVGTExFZEJRVWNzUTBGQlF5eEhRVUZITEZkQlFWY3NRMEZCUXp0SlFVTTVRaXhOUVVGTkxFdEJRVXNzUjBGQlJ5eERRVUZETEVkQlFVY3NWMEZCVnl4RFFVRkRPMGxCUXpsQ0xFbEJRVWtzVjBGQlZ5eEhRVUZITEVkQlFVY3NSVUZCUlR0UlFVTnlRaXhQUVVGUExFOUJRVThzUzBGQlN5eEhRVUZITEVkQlFVY3NTVUZCU1N4TFFVRkxMRWRCUVVjc1IwRkJSeXhKUVVGSkxFdEJRVXNzUjBGQlJ5eEhRVUZITEVkQlFVY3NRMEZCUXp0TFFVTTFSRHRKUVVORUxFOUJRVThzUlVGQlJTeERRVUZETEV0QlFVc3NRMEZCUXl4TFFVRkxMRU5CUVVNc1QwRkJUeXhEUVVGRExFTkJRVU03UVVGRGFrTXNRMEZCUXp0QlFVVkVMRTFCUVUwc1QwRkJUeXhYUVVGWE8wbEJRMllzVFVGQlRTeERRVUZETEZGQlFWRXNRMEZCUXl4RFFVRlRPMUZCUXpsQ0xFbEJRVWtzU1VGQlNTeEhRVUZYTEVOQlFVTXNRMEZCUXp0UlFVTnlRaXhKUVVGSkxFTkJRVU1zUTBGQlF5eE5RVUZOTEV0QlFVc3NRMEZCUXp0WlFVTm9RaXhQUVVGUExFbEJRVWtzUTBGQlF6dFJRVU5rTEV0QlFVc3NTVUZCU1N4RFFVRkRMRWRCUVZjc1EwRkJReXhGUVVGRkxFTkJRVU1zUjBGQlJ5eERRVUZETEVOQlFVTXNUVUZCVFN4RlFVRkZMRU5CUVVNc1JVRkJSU3hGUVVGRk8xbEJRM3BETEUxQlFVMHNSMEZCUnl4SFFVRlhMRU5CUVVNc1EwRkJReXhWUVVGVkxFTkJRVU1zUTBGQlF5eERRVUZETEVOQlFVTTdXVUZEY0VNc1NVRkJTU3hIUVVGSExFTkJRVU1zUTBGQlF5eEpRVUZKTEVsQlFVa3NRMEZCUXl4RFFVRkRMRWRCUVVjc1NVRkJTU3hEUVVGRExFZEJRVWNzUjBGQlJ5eERRVUZETzFsQlEyeERMRWxCUVVrc1NVRkJTU3hEUVVGRExFTkJRVU1zUTBGQlF5d3lRa0ZCTWtJN1UwRkRka003VVVGRFJDeFBRVUZQTEVsQlFVa3NRMEZCUXp0SlFVTmtMRU5CUVVNN1EwRkRSanRCUVVWRUxFOUJRVThzUlVGQllTeGpRVUZqTEVWQlFVTXNUVUZCVFN4blFrRkJaMElzUTBGQlF6dEJRVVV4UkN4TlFVRk5MRTlCUVdkQ0xHbENRVUZwUWp0RFFVVjBRenRCUVVWRUxFMUJRVTBzVDBGQlR5eGpRVUZsTEZOQlFWRXNhVUpCUVdsQ08wbEJRelZETEVkQlFVY3NRMEZCUXl4RFFVRlRPMUZCUTJ4Q0xFOUJRVThzVTBGQlV5eERRVUZETzBsQlEyNUNMRU5CUVVNN1EwRkRSanRCUVVkRUxFMUJRVTBzVDBGQlR5eHRRa0ZCYjBJc1UwRkJVU3hwUWtGQmFVSTdTVUZIYUVRc1RVRkJUU3hEUVVGRExGbEJRVms3VVVGRGVrSXNUVUZCVFN4SFFVRkhMRWRCUVVrc1JVRkJaU3hEUVVGRExFMUJRVTBzUTBGQlF5eEhRVUZITEUxQlFVMHNRMEZCUXl4TlFVRk5MRU5CUVVNc1kwRkJZeXhEUVVGRExHRkJRV0VzUTBGQlF5eERRVUZETEVOQlFVTTdVVUZEY0VZc1QwRkJUeXhIUVVGSExFTkJRVU03U1VGRFlpeERRVUZETzBsQlJVMHNSMEZCUnl4RFFVRkRMRU5CUVZNN1VVRkRiRUlzVFVGQlRTeEpRVUZKTEVkQlFWY3NWMEZCVnl4RFFVRkRMRkZCUVZFc1EwRkJReXhEUVVGRExFTkJRVU1zUTBGQlF6dFJRVU0zUXl4TlFVRk5MRVZCUVVVc1IwRkJSeXhKUVVGSkxFZEJRVWNzYlVKQlFXMUNMRU5CUVVNc1QwRkJUeXhEUVVGRExFMUJRVTBzUTBGQlF6dFJRVU55UkN4UFFVRlBMRmxCUVZrc1EwRkJReXh0UWtGQmJVSXNRMEZCUXl4UFFVRlBMRU5CUVVNc1JVRkJSU3hEUVVGRExFTkJRVU1zUTBGQlF6dEpRVU4yUkN4RFFVRkRPenRCUVZoaExESkNRVUZQTEVkQlFXRXNiVUpCUVcxQ0xFTkJRVU1zV1VGQldTeEZRVUZGTEVOQlFVTTdRVUZqZGtVc1RVRkJUU3hQUVVGUExHdENRVUZ0UWl4VFFVRlJMR05CUVdNN1NVRkhOME1zVFVGQlRTeExRVUZMTEVsQlFVazdVVUZEY0VJc1NVRkJTU3hKUVVGSkxFTkJRVU1zU1VGQlNTeExRVUZMTEV0QlFVc3NRMEZCUXp0WlFVTjBRaXhKUVVGSkxFTkJRVU1zU1VGQlNTeEhRVUZITEVsQlFVa3NZMEZCWXl4RlFVRkZMRU5CUVVNN1VVRkRia01zVDBGQlR5eEpRVUZKTEVOQlFVTXNTVUZCU1N4RFFVRkRPMGxCUTI1Q0xFTkJRVU03U1VGSlRTeE5RVUZOTEV0QlFVc3NTMEZCU3p0UlFVTnlRaXhKUVVGSkxFbEJRVWtzUTBGQlF5eExRVUZMTEV0QlFVc3NTMEZCU3l4RFFVRkRPMWxCUTNaQ0xFbEJRVWtzUTBGQlF5eExRVUZMTEVkQlFVY3NTVUZCU1N4dFFrRkJiVUlzUlVGQlJTeERRVUZETzFGQlEzcERMRTlCUVU4c1NVRkJTU3hEUVVGRExFdEJRVXNzUTBGQlF6dEpRVU53UWl4RFFVRkRPME5CUTBZaUxDSnpiM1Z5WTJWelEyOXVkR1Z1ZENJNld5SnBiWEJ2Y25RZ0tpQmhjeUJuY205cklHWnliMjBnSjJSaGRHRm5jbTlyTFdGd2FTOW5jbTlySnp0Y2JtbHRjRzl5ZENBcUlHRnpJSFZwSUdaeWIyMGdKMlJoZEdGbmNtOXJMV0Z3YVM5MWFTYzdYRzVwYlhCdmNuUWdLaUJoY3lCRVJ5Qm1jbTl0SUNka1lYUmhaM0p2YXkxaGNHa3ZaR2NuTzF4dVhHNHZLaW9nYldGclpYTWdkR2hsSUdOdmJHOXlJR3hsYzNNZ2QyaHBkR1VzSUcxaGEyVnpJSFJvWlNCMGNtRnVjM0JoY21WdVkza2daV1ptWldOMElHRnNkMkY1Y3lCd1pYSmpaWEIwYVdKc1pWeHVJQ29nUUhCaGNtRnRJSHR6ZEhKcGJtZDlJR052Ykc5eUlIZ2dZMjl2Y21ScGJtRjBaUzVjYmlBcUlDb3ZYRzVtZFc1amRHbHZiaUJqYjNKeVpXTjBRMjlzYjNJb1kyOXNiM0k2SUhOMGNtbHVaeUI4SUc1MWJHd3BPaUJ6ZEhKcGJtY2dlMXh1SUNCcFppQW9ZMjlzYjNJZ1BUMGdiblZzYkNsY2JpQWdJQ0J5WlhSMWNtNGdKM0puWWlneE1EQXNNVEF3TERFd01Da25PMXh1WEc0Z0lHTnZibk4wSUdSblEyOXNiM0k2SUc1MWJXSmxjaUE5SUVSSExrTnZiRzl5TG1aeWIyMUlkRzFzS0dOdmJHOXlLVHRjYmlBZ1kyOXVjM1FnWnlBOUlFUkhMa052Ykc5eUxtY29aR2REYjJ4dmNpazdYRzRnSUdOdmJuTjBJSElnUFNCRVJ5NURiMnh2Y2k1eUtHUm5RMjlzYjNJcE8xeHVJQ0JqYjI1emRDQmlJRDBnUkVjdVEyOXNiM0l1WWloa1owTnZiRzl5S1R0Y2JpQWdMeThnWTJGc1kzVnNZWFJsSUdWMVkyeHBaR1ZoYmlCa2FYTjBZVzVqWlNCMGJ5QjNhR2wwWlZ4dUlDQmpiMjV6ZENCa2FYTjBWRzlDYkdGamF5QTlJRTFoZEdndWMzRnlkQ2hOWVhSb0xuQnZkeWd3SUMwZ2Npd2dNaWtnS3lCTllYUm9MbkJ2ZHlnd0lDMGdaeXdnTWlrZ0t5Qk5ZWFJvTG5CdmR5Z3dJQzBnWWl3Z01pa3BPMXh1SUNBdkx5QnViM0p0WVd4cGVtVWdkbVZqZEc5eUlISWdaeUJpWEc0Z0lHTnZibk4wSUc1dmNtMVNJRDBnY2lBdklHUnBjM1JVYjBKc1lXTnJPMXh1SUNCamIyNXpkQ0J1YjNKdFJ5QTlJR2NnTHlCa2FYTjBWRzlDYkdGamF6dGNiaUFnWTI5dWMzUWdibTl5YlVJZ1BTQmlJQzhnWkdsemRGUnZRbXhoWTJzN1hHNGdJR2xtSUNoa2FYTjBWRzlDYkdGamF5QStJREl4TUNrZ2UxeHVJQ0FnSUhKbGRIVnliaUJnY21kaUtDUjdibTl5YlZJZ0tpQXlNVEI5TENSN2JtOXliVWNnS2lBeU1UQjlMQ1I3Ym05eWJVSWdLaUF5TVRCOUtXQTdYRzRnSUgxY2JpQWdjbVYwZFhKdUlFUkhMa052Ykc5eUxuUnZVbWRpS0dSblEyOXNiM0lwTzF4dWZWeHVYRzVsZUhCdmNuUWdZMnhoYzNNZ1UzUnlhVzVuVlhScGJITWdlMXh1SUNCd2RXSnNhV01nYzNSaGRHbGpJR2hoYzJoRGIyUmxLSE02SUhOMGNtbHVaeWs2SUc1MWJXSmxjaUI3WEc0Z0lDQWdiR1YwSUdoaGMyZzZJRzUxYldKbGNpQTlJREE3WEc0Z0lDQWdhV1lnS0hNdWJHVnVaM1JvSUQwOVBTQXdLVnh1SUNBZ0lDQWdjbVYwZFhKdUlHaGhjMmc3WEc0Z0lDQWdabTl5SUNoc1pYUWdhVG9nYm5WdFltVnlJRDBnTURzZ2FTQThJSE11YkdWdVozUm9PeUJwS3lzcElIdGNiaUFnSUNBZ0lHTnZibk4wSUdOb2Nqb2diblZ0WW1WeUlEMGdjeTVqYUdGeVEyOWtaVUYwS0drcE8xeHVJQ0FnSUNBZ2FHRnphQ0E5SUNnb2FHRnphQ0E4UENBMUtTQXRJR2hoYzJncElDc2dZMmh5TzF4dUlDQWdJQ0FnYUdGemFDQjhQU0F3T3lBdkx5QkRiMjUyWlhKMElIUnZJRE15WW1sMElHbHVkR1ZuWlhKY2JpQWdJQ0I5WEc0Z0lDQWdjbVYwZFhKdUlHaGhjMmc3WEc0Z0lIMWNibjFjYmx4dWFXMXdiM0owSUh0VFpYRlFZV3hsZEhSbExDQlRaWEZRWVd4bGRIUmxRbUZ6WlgwZ1puSnZiU0FuTGk5elpYRXRjR0ZzWlhSMFpYTW5PMXh1WEc1bGVIQnZjblFnWVdKemRISmhZM1FnWTJ4aGMzTWdWVzVyYm05M2JsTmxjVkJoYkdWMGRHVWdhVzF3YkdWdFpXNTBjeUJUWlhGUVlXeGxkSFJsSUh0Y2JpQWdjSFZpYkdsaklHRmljM1J5WVdOMElHZGxkQ2h0T2lCemRISnBibWNwT2lCemRISnBibWM3WEc1OVhHNWNibVY0Y0c5eWRDQmpiR0Z6Y3lCSGNtRjVRV3hzVUdGc1pYUjBaU0JsZUhSbGJtUnpJRlZ1YTI1dmQyNVRaWEZRWVd4bGRIUmxJSHRjYmlBZ2NIVmliR2xqSUdkbGRDaHRPaUJ6ZEhKcGJtY3BPaUJ6ZEhKcGJtY2dlMXh1SUNBZ0lISmxkSFZ5YmlBbkl6WTJOalkyTmljN1hHNGdJSDFjYm4xY2JseHVYRzVsZUhCdmNuUWdZMnhoYzNNZ1ZXNXJibTkzYmtOdmJHOXlVR0ZzWlhSMFpTQmxlSFJsYm1SeklGVnVhMjV2ZDI1VFpYRlFZV3hsZEhSbElIdGNiaUFnY0hWaWJHbGpJSE4wWVhScFl5QndZV3hsZEhSbE9pQnpkSEpwYm1kYlhTQTlJRlZ1YTI1dmQyNURiMnh2Y2xCaGJHVjBkR1V1WW5WcGJHUlFZV3hsZEhSbEtDazdYRzVjYmlBZ2NISnBkbUYwWlNCemRHRjBhV01nWW5WcGJHUlFZV3hsZEhSbEtDazZJSE4wY21sdVoxdGRJSHRjYmlBZ0lDQmpiMjV6ZENCeVpYTWdQU0FvVzEwZ1lYTWdjM1J5YVc1blcxMHBMbU52Ym1OaGRDZ3VMaTVQWW1wbFkzUXVkbUZzZFdWektGTmxjVkJoYkdWMGRHVkNZWE5sTG1OdmJHOTFjbEJoYkdWMGRHVXBLVHRjYmlBZ0lDQnlaWFIxY200Z2NtVnpPMXh1SUNCOVhHNWNiaUFnY0hWaWJHbGpJR2RsZENodE9pQnpkSEpwYm1jcE9pQnpkSEpwYm1jZ2UxeHVJQ0FnSUdOdmJuTjBJR2hoYzJnNklHNTFiV0psY2lBOUlGTjBjbWx1WjFWMGFXeHpMbWhoYzJoRGIyUmxLRzBwTzF4dUlDQWdJR052Ym5OMElIQkpJRDBnYUdGemFDQWxJRlZ1YTI1dmQyNURiMnh2Y2xCaGJHVjBkR1V1Y0dGc1pYUjBaUzVzWlc1bmRHZzdYRzRnSUNBZ2NtVjBkWEp1SUdOdmNuSmxZM1JEYjJ4dmNpaFZibXR1YjNkdVEyOXNiM0pRWVd4bGRIUmxMbkJoYkdWMGRHVmJjRWxkS1R0Y2JpQWdmVnh1ZlZ4dVhHNWxlSEJ2Y25RZ1kyeGhjM01nVlc1cmJtOTNibE5sY1ZCaGJHVjBkR1Z6SUdWNGRHVnVaSE1nVTJWeFVHRnNaWFIwWlVKaGMyVWdlMXh1SUNCd2NtbDJZWFJsSUhOMFlYUnBZeUJuY21GNU9pQlRaWEZRWVd4bGRIUmxPMXh1WEc0Z0lIQjFZbXhwWXlCemRHRjBhV01nWjJWMElFZHlZWGtvS1RvZ1UyVnhVR0ZzWlhSMFpTQjdYRzRnSUNBZ2FXWWdLSFJvYVhNdVozSmhlU0E5UFQwZ2RtOXBaQ0F3S1Z4dUlDQWdJQ0FnZEdocGN5NW5jbUY1SUQwZ2JtVjNJRWR5WVhsQmJHeFFZV3hsZEhSbEtDazdYRzRnSUNBZ2NtVjBkWEp1SUhSb2FYTXVaM0poZVR0Y2JpQWdmVnh1WEc0Z0lIQnlhWFpoZEdVZ2MzUmhkR2xqSUdOdmJHOXlPaUJUWlhGUVlXeGxkSFJsTzF4dVhHNGdJSEIxWW14cFl5QnpkR0YwYVdNZ1oyVjBJRU52Ykc5eUtDazZJRk5sY1ZCaGJHVjBkR1VnZTF4dUlDQWdJR2xtSUNoMGFHbHpMbU52Ykc5eUlEMDlQU0IyYjJsa0lEQXBYRzRnSUNBZ0lDQjBhR2x6TG1OdmJHOXlJRDBnYm1WM0lGVnVhMjV2ZDI1RGIyeHZjbEJoYkdWMGRHVW9LVHRjYmlBZ0lDQnlaWFIxY200Z2RHaHBjeTVqYjJ4dmNqdGNiaUFnZlZ4dWZWeHVJbDE5IiwiaW1wb3J0IHsgbW9ub21lclRvU2hvcnQgfSBmcm9tICcuL21hY3JvbW9sZWN1bGUnO1xuY29uc3QgdW5kZWZpbmVkQ29sb3IgPSAncmdiKDEwMCwxMDAsMTAwKSc7XG5jb25zdCBncmF5Q29sb3IgPSAnIzgwODA4MCc7XG5jb25zdCBibGFja0NvbG9yID0gJ3JnYigwLDAsMCknO1xuY29uc3QgbW9ub21lclRvU2hvcnRGdW5jdGlvbiA9IG1vbm9tZXJUb1Nob3J0O1xuZXhwb3J0IHZhciBEcmF3U3R5bGU7XG4oZnVuY3Rpb24gKERyYXdTdHlsZSkge1xuICAgIERyYXdTdHlsZVtcIk1TQVwiXSA9IFwiTVNBXCI7XG4gICAgRHJhd1N0eWxlW1wiY2xhc3NpY1wiXSA9IFwiY2xhc3NpY1wiO1xufSkoRHJhd1N0eWxlIHx8IChEcmF3U3R5bGUgPSB7fSkpO1xuLyoqXG4gKiBBIGZ1bmN0aW9uIHRoYXQgcHJpbnRzIGEgc3RyaW5nIGFsaWduZWQgdG8gbGVmdCBvciBjZW50ZXJlZC5cbiAqXG4gKiBAcGFyYW0ge251bWJlcn0geCB4IGNvb3JkaW5hdGUuXG4gKiBAcGFyYW0ge251bWJlcn0geSB5IGNvb3JkaW5hdGUuXG4gKiBAcGFyYW0ge251bWJlcn0gdyBXaWR0aC5cbiAqIEBwYXJhbSB7bnVtYmVyfSBoIEhlaWdodC5cbiAqIEBwYXJhbSB7Q2FudmFzUmVuZGVyaW5nQ29udGV4dDJEfSBnIENhbnZhcyByZW5kZXJpbmcgY29udGV4dC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBzIFN0cmluZyB0byBwcmludC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBbY29sb3I9dW5kZWZpbmVkQ29sb3JdIFN0cmluZyBjb2xvci5cbiAqIEBwYXJhbSB7bnVtYmVyfSBbcGl2b3Q9MF0gUGlydm90LlxuICogQHBhcmFtIHtib29sZWFufSBbbGVmdD1mYWxzZV0gSXMgbGVmdCBhbGlnbmVkLlxuICogQHBhcmFtIHtudW1iZXJ9IFt0cmFuc3BhcmVuY3lSYXRlPTAuMF0gVHJhbnNwYXJlbmN5IHJhdGUgd2hlcmUgMS4wIGlzIGZ1bGx5IHRyYW5zcGFyZW50XG4gKiBAcGFyYW0ge3N0cmluZ30gW3NlcGFyYXRvcj0nJ10gSXMgc2VwYXJhdG9yIGZvciBzZXF1ZW5jZS5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW2xhc3Q9ZmFsc2VdIElzIGNoZWNrZXIgaWYgZWxlbWVudCBsYXN0IG9yIG5vdC5cbiAqIEBwYXJhbSBkcmF3U3R5bGUgSXMgZHJhdyBzdHlsZS4gTVNBIC0gZm9yIG11bHRpY2hhclNlcSwgY2xhc3NpYyAtIGZvciBvdGhlciBzZXEuXG4gKiBAcGFyYW0gbWF4V29yZCBJcyBhcnJheSBvZiBtYXggd29yZHMgZm9yIGVhY2ggbGluZS5cbiAqIEBwYXJhbSB3b3JkSWR4IElzIGluZGV4IG9mIHdvcmQgd2UgY3VycmVudGx5IGRyYXcuXG4gKiBAcGFyYW0gZ3JpZENlbGwgSXMgZ3JpZCBjZWxsLlxuICogQHBhcmFtIHJlZmVyZW5jZVNlcXVlbmNlIElzIHJlZmVyZW5jZSBzZXF1ZW5jZSBmb3IgZGlmZiBtb2RlLlxuICogQHBhcmFtIG1heExlbmd0aE9mTW9ub21lciBJcyBtYXggbGVuZ3RoIG9mIG1vbm9tZXIuXG4gKiBAcmV0dXJuIHtudW1iZXJ9IHggY29vcmRpbmF0ZSB0byBzdGFydCBwcmludGluZyBhdC5cbiAqL1xuZXhwb3J0IGNvbnN0IHByaW50TGVmdE9yQ2VudGVyZWQgPSAoeCwgeSwgdywgaCwgZywgcywgY29sb3IgPSB1bmRlZmluZWRDb2xvciwgcGl2b3QgPSAwLCBsZWZ0ID0gZmFsc2UsIHRyYW5zcGFyZW5jeVJhdGUgPSAxLjAsIHNlcGFyYXRvciA9ICcnLCBsYXN0ID0gZmFsc2UsIGRyYXdTdHlsZSA9IERyYXdTdHlsZS5jbGFzc2ljLCBtYXhXb3JkID0ge30sIHdvcmRJZHggPSAwLCBncmlkQ2VsbCA9IG51bGwsIHJlZmVyZW5jZVNlcXVlbmNlID0gW10sIG1heExlbmd0aE9mTW9ub21lciA9IG51bGwpID0+IHtcbiAgICB2YXIgX2EsIF9iLCBfYztcbiAgICBnLnRleHRBbGlnbiA9ICdzdGFydCc7XG4gICAgbGV0IGNvbG9yUGFydCA9IHMuc3Vic3RyaW5nKDApO1xuICAgIGxldCBncmF5UGFydCA9IGxhc3QgPyAnJyA6IHNlcGFyYXRvcjtcbiAgICBpZiAoZHJhd1N0eWxlID09PSBEcmF3U3R5bGUuTVNBKSB7XG4gICAgICAgIGdyYXlQYXJ0ID0gJyc7XG4gICAgfVxuICAgIGxldCBjb2xvckNvZGUgPSB0cnVlO1xuICAgIGxldCBjb21wYXJlV2l0aEN1cnJlbnQgPSB0cnVlO1xuICAgIGxldCBoaWdobGlnaHREaWZmZXJlbmNlID0gJ2RpZmZlcmVuY2UnO1xuICAgIGlmICgoZ3JpZENlbGwgIT0gbnVsbCkgJiYgKGdyaWRDZWxsLmNlbGwuY29sdW1uICE9IG51bGwpKSB7XG4gICAgICAgIGNvbG9yQ29kZSA9IChfYSA9IGdyaWRDZWxsLmNlbGwuY29sdW1uLnRlbXBbJ2NvbG9yLWNvZGUnXSkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogdHJ1ZTtcbiAgICAgICAgY29tcGFyZVdpdGhDdXJyZW50ID0gKF9iID0gZ3JpZENlbGwuY2VsbC5jb2x1bW4udGVtcFsnY29tcGFyZS13aXRoLWN1cnJlbnQnXSkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogdHJ1ZTtcbiAgICAgICAgaGlnaGxpZ2h0RGlmZmVyZW5jZSA9IChfYyA9IGdyaWRDZWxsLmNlbGwuY29sdW1uLnRlbXBbJ2hpZ2hsaWdodC1kaWZmZXJlbmNlJ10pICE9PSBudWxsICYmIF9jICE9PSB2b2lkIDAgPyBfYyA6ICdkaWZmZXJlbmNlJztcbiAgICB9XG4gICAgY29uc3QgY3VycmVudE1vbm9tZXIgPSByZWZlcmVuY2VTZXF1ZW5jZVt3b3JkSWR4XTtcbiAgICBpZiAoY29tcGFyZVdpdGhDdXJyZW50ICYmIChyZWZlcmVuY2VTZXF1ZW5jZS5sZW5ndGggPiAwKSAmJiAoaGlnaGxpZ2h0RGlmZmVyZW5jZSA9PT0gJ2RpZmZlcmVuY2UnKSkge1xuICAgICAgICB0cmFuc3BhcmVuY3lSYXRlID0gKGNvbG9yUGFydCA9PSBjdXJyZW50TW9ub21lcikgPyAwLjMgOiB0cmFuc3BhcmVuY3lSYXRlO1xuICAgIH1cbiAgICBpZiAoY29tcGFyZVdpdGhDdXJyZW50ICYmIChyZWZlcmVuY2VTZXF1ZW5jZS5sZW5ndGggPiAwKSAmJiAoaGlnaGxpZ2h0RGlmZmVyZW5jZSA9PT0gJ2VxdWFsJykpIHtcbiAgICAgICAgdHJhbnNwYXJlbmN5UmF0ZSA9IChjb2xvclBhcnQgIT0gY3VycmVudE1vbm9tZXIpID8gMC4zIDogdHJhbnNwYXJlbmN5UmF0ZTtcbiAgICB9XG4gICAgaWYgKG1heExlbmd0aE9mTW9ub21lciAhPSBudWxsKSB7XG4gICAgICAgIGNvbG9yUGFydCA9IG1vbm9tZXJUb1Nob3J0RnVuY3Rpb24oY29sb3JQYXJ0LCBtYXhMZW5ndGhPZk1vbm9tZXIpO1xuICAgIH1cbiAgICBsZXQgdGV4dFNpemUgPSBnLm1lYXN1cmVUZXh0KGNvbG9yUGFydCArIGdyYXlQYXJ0KTtcbiAgICBjb25zdCBpbmRlbnQgPSA1O1xuICAgIGxldCBtYXhDb2xvclRleHRTaXplID0gZy5tZWFzdXJlVGV4dChjb2xvclBhcnQpLndpZHRoO1xuICAgIGxldCBjb2xvclRleHRTaXplID0gZy5tZWFzdXJlVGV4dChjb2xvclBhcnQpLndpZHRoO1xuICAgIGNvbnN0IGR5ID0gaCAvIDIgLSAodGV4dFNpemUuZm9udEJvdW5kaW5nQm94QXNjZW50ICsgdGV4dFNpemUuZm9udEJvdW5kaW5nQm94RGVzY2VudCkgLyAyICsgMTtcbiAgICB0ZXh0U2l6ZSA9IHRleHRTaXplLndpZHRoO1xuICAgIGlmIChkcmF3U3R5bGUgPT09IERyYXdTdHlsZS5NU0EpIHtcbiAgICAgICAgbWF4Q29sb3JUZXh0U2l6ZSA9IG1heFdvcmRbd29yZElkeF07XG4gICAgICAgIHRleHRTaXplID0gbWF4V29yZFt3b3JkSWR4XTtcbiAgICB9XG4gICAgZnVuY3Rpb24gZHJhdyhkeDEsIGR4Mikge1xuICAgICAgICBjb25zdCBkcmF3Q29sb3IgPSBjb2xvckNvZGUgPyBjb2xvciA6IGJsYWNrQ29sb3I7XG4gICAgICAgIGcuZmlsbFN0eWxlID0gZHJhd0NvbG9yO1xuICAgICAgICBnLmdsb2JhbEFscGhhID0gdHJhbnNwYXJlbmN5UmF0ZTtcbiAgICAgICAgaWYgKGRyYXdTdHlsZSA9PT0gRHJhd1N0eWxlLmNsYXNzaWMpIHtcbiAgICAgICAgICAgIGcuZmlsbFRleHQoY29sb3JQYXJ0LCB4ICsgZHgxLCB5ICsgZHkpO1xuICAgICAgICAgICAgZy5maWxsU3R5bGUgPSBncmF5Q29sb3I7XG4gICAgICAgICAgICBnLmZpbGxUZXh0KGdyYXlQYXJ0LCB4ICsgZHgyLCB5ICsgZHkpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChkcmF3U3R5bGUgPT09IERyYXdTdHlsZS5NU0EpIHtcbiAgICAgICAgICAgIGcuZmlsbFN0eWxlID0gZHJhd0NvbG9yO1xuICAgICAgICAgICAgZy5maWxsVGV4dChjb2xvclBhcnQsIHggKyBkeDEgKyAoKG1heFdvcmRbd29yZElkeF0gLSBjb2xvclRleHRTaXplKSAvIDIpLCB5ICsgZHkpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmIChsZWZ0IHx8IHRleHRTaXplID4gdykge1xuICAgICAgICBkcmF3KGluZGVudCwgaW5kZW50ICsgbWF4Q29sb3JUZXh0U2l6ZSk7XG4gICAgICAgIHJldHVybiB4ICsgbWF4Q29sb3JUZXh0U2l6ZSArIGcubWVhc3VyZVRleHQoZ3JheVBhcnQpLndpZHRoO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgY29uc3QgZHggPSAodyAtIHRleHRTaXplKSAvIDI7XG4gICAgICAgIGRyYXcoZHgsIGR4ICsgbWF4Q29sb3JUZXh0U2l6ZSk7XG4gICAgICAgIHJldHVybiB4ICsgZHggKyBtYXhDb2xvclRleHRTaXplO1xuICAgIH1cbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1kYXRhOmFwcGxpY2F0aW9uL2pzb247YmFzZTY0LGV5SjJaWEp6YVc5dUlqb3pMQ0ptYVd4bElqb2lZMlZzYkMxeVpXNWtaWEpsY2k1cWN5SXNJbk52ZFhKalpWSnZiM1FpT2lJaUxDSnpiM1Z5WTJWeklqcGJJbU5sYkd3dGNtVnVaR1Z5WlhJdWRITWlYU3dpYm1GdFpYTWlPbHRkTENKdFlYQndhVzVuY3lJNklrRkJSVUVzVDBGQlR5eEZRVUZETEdOQlFXTXNSVUZCUXl4TlFVRk5MR2xDUVVGcFFpeERRVUZETzBGQlJTOURMRTFCUVUwc1kwRkJZeXhIUVVGSExHdENRVUZyUWl4RFFVRkRPMEZCUXpGRExFMUJRVTBzVTBGQlV5eEhRVUZITEZOQlFWTXNRMEZCUXp0QlFVTTFRaXhOUVVGTkxGVkJRVlVzUjBGQlJ5eFpRVUZaTEVOQlFVTTdRVUZEYUVNc1RVRkJUU3h6UWtGQmMwSXNSMEZCTUVRc1kwRkJZeXhEUVVGRE8wRkJSWEpITEUxQlFVMHNRMEZCVGl4SlFVRlpMRk5CUjFnN1FVRklSQ3hYUVVGWkxGTkJRVk03U1VGRGJrSXNkMEpCUVZjc1EwRkJRVHRKUVVOWUxHZERRVUZ0UWl4RFFVRkJPMEZCUTNKQ0xFTkJRVU1zUlVGSVZ5eFRRVUZUTEV0QlFWUXNVMEZCVXl4UlFVZHdRanRCUVVWRU96czdPenM3T3pzN096czdPenM3T3pzN096czdPMGRCYzBKSE8wRkJRMGdzVFVGQlRTeERRVUZETEUxQlFVMHNiVUpCUVcxQ0xFZEJRVWNzUTBGRGFrTXNRMEZCVXl4RlFVRkZMRU5CUVZNc1JVRkJSU3hEUVVGVExFVkJRVVVzUTBGQlV5eEZRVU14UXl4RFFVRXlRaXhGUVVGRkxFTkJRVk1zUlVGQlJTeFJRVUZuUWl4alFVRmpMRVZCUTNSRkxGRkJRV2RDTEVOQlFVTXNSVUZCUlN4SlFVRkpMRWRCUVVjc1MwRkJTeXhGUVVGRkxHMUNRVUV5UWl4SFFVRkhMRVZCUXk5RUxGbEJRVzlDTEVWQlFVVXNSVUZCUlN4UFFVRm5RaXhMUVVGTExFVkJRVVVzV1VGQmRVSXNVMEZCVXl4RFFVRkRMRTlCUVU4c1JVRkJSU3hWUVVGMVF5eEZRVUZGTEVWQlFVVXNWVUZCYTBJc1EwRkJReXhGUVVGRkxGZEJRU3RDTEVsQlFVa3NSVUZCUlN4dlFrRkJPRUlzUlVGQlJTeEZRVUZGTEhGQ1FVRnZReXhKUVVGSkxFVkJRVlVzUlVGQlJUczdTVUZEY0ZJc1EwRkJReXhEUVVGRExGTkJRVk1zUjBGQlJ5eFBRVUZQTEVOQlFVTTdTVUZEZEVJc1NVRkJTU3hUUVVGVExFZEJRVWNzUTBGQlF5eERRVUZETEZOQlFWTXNRMEZCUXl4RFFVRkRMRU5CUVVNc1EwRkJRenRKUVVNdlFpeEpRVUZKTEZGQlFWRXNSMEZCUnl4SlFVRkpMRU5CUVVNc1EwRkJReXhEUVVGRExFVkJRVVVzUTBGQlF5eERRVUZETEVOQlFVTXNVMEZCVXl4RFFVRkRPMGxCUTNKRExFbEJRVWtzVTBGQlV5eExRVUZMTEZOQlFWTXNRMEZCUXl4SFFVRkhMRVZCUVVVN1VVRkRMMElzVVVGQlVTeEhRVUZITEVWQlFVVXNRMEZCUXp0TFFVTm1PMGxCUTBRc1NVRkJTU3hUUVVGVExFZEJRVWNzU1VGQlNTeERRVUZETzBsQlEzSkNMRWxCUVVrc2EwSkJRV3RDTEVkQlFVY3NTVUZCU1N4RFFVRkRPMGxCUXpsQ0xFbEJRVWtzYlVKQlFXMUNMRWRCUVVjc1dVRkJXU3hEUVVGRE8wbEJRM1pETEVsQlFVa3NRMEZCUXl4UlFVRlJMRWxCUVVrc1NVRkJTU3hEUVVGRExFbEJRVWtzUTBGQlF5eFJRVUZSTEVOQlFVTXNTVUZCU1N4RFFVRkRMRTFCUVUwc1NVRkJTU3hKUVVGSkxFTkJRVU1zUlVGQlJUdFJRVU40UkN4VFFVRlRMRWRCUVVjc1RVRkJRU3hSUVVGUkxFTkJRVU1zU1VGQlNTeERRVUZETEUxQlFVMHNRMEZCUXl4SlFVRkpMRU5CUVVNc1dVRkJXU3hEUVVGRExHMURRVUZKTEVsQlFVa3NRMEZCUXp0UlFVTTFSQ3hyUWtGQmEwSXNSMEZCUnl4TlFVRkJMRkZCUVZFc1EwRkJReXhKUVVGSkxFTkJRVU1zVFVGQlRTeERRVUZETEVsQlFVa3NRMEZCUXl4elFrRkJjMElzUTBGQlF5eHRRMEZCU1N4SlFVRkpMRU5CUVVNN1VVRkRMMFVzYlVKQlFXMUNMRWRCUVVjc1RVRkJRU3hSUVVGUkxFTkJRVU1zU1VGQlNTeERRVUZETEUxQlFVMHNRMEZCUXl4SlFVRkpMRU5CUVVNc2MwSkJRWE5DTEVOQlFVTXNiVU5CUVVrc1dVRkJXU3hEUVVGRE8wdEJSWHBHTzBsQlEwUXNUVUZCVFN4alFVRmpMRWRCUVZjc2FVSkJRV2xDTEVOQlFVTXNUMEZCVHl4RFFVRkRMRU5CUVVNN1NVRkRNVVFzU1VGQlNTeHJRa0ZCYTBJc1NVRkJTU3hEUVVGRExHbENRVUZwUWl4RFFVRkRMRTFCUVUwc1IwRkJSeXhEUVVGRExFTkJRVU1zU1VGQlNTeERRVUZETEcxQ1FVRnRRaXhMUVVGTExGbEJRVmtzUTBGQlF5eEZRVUZGTzFGQlEyeEhMR2RDUVVGblFpeEhRVUZITEVOQlFVTXNVMEZCVXl4SlFVRkpMR05CUVdNc1EwRkJReXhEUVVGRExFTkJRVU1zUTBGQlF5eEhRVUZITEVOQlFVTXNRMEZCUXl4RFFVRkRMR2RDUVVGblFpeERRVUZETzB0QlF6TkZPMGxCUTBRc1NVRkJTU3hyUWtGQmEwSXNTVUZCU1N4RFFVRkRMR2xDUVVGcFFpeERRVUZETEUxQlFVMHNSMEZCUnl4RFFVRkRMRU5CUVVNc1NVRkJTU3hEUVVGRExHMUNRVUZ0UWl4TFFVRkxMRTlCUVU4c1EwRkJReXhGUVVGRk8xRkJRemRHTEdkQ1FVRm5RaXhIUVVGSExFTkJRVU1zVTBGQlV5eEpRVUZKTEdOQlFXTXNRMEZCUXl4RFFVRkRMRU5CUVVNc1EwRkJReXhIUVVGSExFTkJRVU1zUTBGQlF5eERRVUZETEdkQ1FVRm5RaXhEUVVGRE8wdEJRek5GTzBsQlEwUXNTVUZCU1N4clFrRkJhMElzU1VGQlNTeEpRVUZKTEVWQlFVVTdVVUZET1VJc1UwRkJVeXhIUVVGSExITkNRVUZ6UWl4RFFVRkRMRk5CUVZNc1JVRkJSU3hyUWtGQmEwSXNRMEZCUXl4RFFVRkRPMHRCUTI1Rk8wbEJSMFFzU1VGQlNTeFJRVUZSTEVkQlFWRXNRMEZCUXl4RFFVRkRMRmRCUVZjc1EwRkJReXhUUVVGVExFZEJRVWNzVVVGQlVTeERRVUZETEVOQlFVTTdTVUZEZUVRc1RVRkJUU3hOUVVGTkxFZEJRVWNzUTBGQlF5eERRVUZETzBsQlJXcENMRWxCUVVrc1owSkJRV2RDTEVkQlFVY3NRMEZCUXl4RFFVRkRMRmRCUVZjc1EwRkJReXhUUVVGVExFTkJRVU1zUTBGQlF5eExRVUZMTEVOQlFVTTdTVUZEZEVRc1NVRkJTU3hoUVVGaExFZEJRVWNzUTBGQlF5eERRVUZETEZkQlFWY3NRMEZCUXl4VFFVRlRMRU5CUVVNc1EwRkJReXhMUVVGTExFTkJRVU03U1VGRGJrUXNUVUZCVFN4RlFVRkZMRWRCUVVjc1EwRkJReXhIUVVGSExFTkJRVU1zUjBGQlJ5eERRVUZETEZGQlFWRXNRMEZCUXl4eFFrRkJjVUlzUjBGQlJ5eFJRVUZSTEVOQlFVTXNjMEpCUVhOQ0xFTkJRVU1zUjBGQlJ5eERRVUZETEVkQlFVY3NRMEZCUXl4RFFVRkRPMGxCUXpsR0xGRkJRVkVzUjBGQlJ5eFJRVUZSTEVOQlFVTXNTMEZCU3l4RFFVRkRPMGxCUXpGQ0xFbEJRVWtzVTBGQlV5eExRVUZMTEZOQlFWTXNRMEZCUXl4SFFVRkhMRVZCUVVVN1VVRkRMMElzWjBKQlFXZENMRWRCUVVjc1QwRkJUeXhEUVVGRExFOUJRVThzUTBGQlF5eERRVUZETzFGQlEzQkRMRkZCUVZFc1IwRkJSeXhQUVVGUExFTkJRVU1zVDBGQlR5eERRVUZETEVOQlFVTTdTMEZETjBJN1NVRkZSQ3hUUVVGVExFbEJRVWtzUTBGQlF5eEhRVUZYTEVWQlFVVXNSMEZCVnp0UlFVTndReXhOUVVGTkxGTkJRVk1zUjBGQlJ5eFRRVUZUTEVOQlFVTXNRMEZCUXl4RFFVRkRMRXRCUVVzc1EwRkJReXhEUVVGRExFTkJRVU1zVlVGQlZTeERRVUZETzFGQlEycEVMRU5CUVVNc1EwRkJReXhUUVVGVExFZEJRVWNzVTBGQlV5eERRVUZETzFGQlEzaENMRU5CUVVNc1EwRkJReXhYUVVGWExFZEJRVWNzWjBKQlFXZENMRU5CUVVNN1VVRkRha01zU1VGQlNTeFRRVUZUTEV0QlFVc3NVMEZCVXl4RFFVRkRMRTlCUVU4c1JVRkJSVHRaUVVOdVF5eERRVUZETEVOQlFVTXNVVUZCVVN4RFFVRkRMRk5CUVZNc1JVRkJSU3hEUVVGRExFZEJRVWNzUjBGQlJ5eEZRVUZGTEVOQlFVTXNSMEZCUnl4RlFVRkZMRU5CUVVNc1EwRkJRenRaUVVOMlF5eERRVUZETEVOQlFVTXNVMEZCVXl4SFFVRkhMRk5CUVZNc1EwRkJRenRaUVVONFFpeERRVUZETEVOQlFVTXNVVUZCVVN4RFFVRkRMRkZCUVZFc1JVRkJSU3hEUVVGRExFZEJRVWNzUjBGQlJ5eEZRVUZGTEVOQlFVTXNSMEZCUnl4RlFVRkZMRU5CUVVNc1EwRkJRenRUUVVOMlF6dFJRVU5FTEVsQlFVa3NVMEZCVXl4TFFVRkxMRk5CUVZNc1EwRkJReXhIUVVGSExFVkJRVVU3V1VGREwwSXNRMEZCUXl4RFFVRkRMRk5CUVZNc1IwRkJSeXhUUVVGVExFTkJRVU03V1VGRGVFSXNRMEZCUXl4RFFVRkRMRkZCUVZFc1EwRkJReXhUUVVGVExFVkJRVVVzUTBGQlF5eEhRVUZITEVkQlFVY3NSMEZCUnl4RFFVRkRMRU5CUVVNc1QwRkJUeXhEUVVGRExFOUJRVThzUTBGQlF5eEhRVUZITEdGQlFXRXNRMEZCUXl4SFFVRkhMRU5CUVVNc1EwRkJReXhGUVVGRkxFTkJRVU1zUjBGQlJ5eEZRVUZGTEVOQlFVTXNRMEZCUXp0VFFVTnVSanRKUVVOSUxFTkJRVU03U1VGRlJDeEpRVUZKTEVsQlFVa3NTVUZCU1N4UlFVRlJMRWRCUVVjc1EwRkJReXhGUVVGRk8xRkJRM2hDTEVsQlFVa3NRMEZCUXl4TlFVRk5MRVZCUVVVc1RVRkJUU3hIUVVGSExHZENRVUZuUWl4RFFVRkRMRU5CUVVNN1VVRkRlRU1zVDBGQlR5eERRVUZETEVkQlFVY3NaMEpCUVdkQ0xFZEJRVWNzUTBGQlF5eERRVUZETEZkQlFWY3NRMEZCUXl4UlFVRlJMRU5CUVVNc1EwRkJReXhMUVVGTExFTkJRVU03UzBGRk4wUTdVMEZCVFR0UlFVTk1MRTFCUVUwc1JVRkJSU3hIUVVGSExFTkJRVU1zUTBGQlF5eEhRVUZITEZGQlFWRXNRMEZCUXl4SFFVRkhMRU5CUVVNc1EwRkJRenRSUVVNNVFpeEpRVUZKTEVOQlFVTXNSVUZCUlN4RlFVRkZMRVZCUVVVc1IwRkJSeXhuUWtGQlowSXNRMEZCUXl4RFFVRkRPMUZCUTJoRExFOUJRVThzUTBGQlF5eEhRVUZITEVWQlFVVXNSMEZCUnl4blFrRkJaMElzUTBGQlF6dExRVU5zUXp0QlFVTklMRU5CUVVNc1EwRkJReUlzSW5OdmRYSmpaWE5EYjI1MFpXNTBJanBiSW1sdGNHOXlkQ0FxSUdGeklFUkhJR1p5YjIwZ0oyUmhkR0ZuY205ckxXRndhUzlrWnljN1hHNWNibWx0Y0c5eWRDQjdiVzl1YjIxbGNsUnZVMmh2Y25SOUlHWnliMjBnSnk0dmJXRmpjbTl0YjJ4bFkzVnNaU2M3WEc1Y2JtTnZibk4wSUhWdVpHVm1hVzVsWkVOdmJHOXlJRDBnSjNKbllpZ3hNREFzTVRBd0xERXdNQ2tuTzF4dVkyOXVjM1FnWjNKaGVVTnZiRzl5SUQwZ0p5TTRNRGd3T0RBbk8xeHVZMjl1YzNRZ1lteGhZMnREYjJ4dmNpQTlJQ2R5WjJJb01Dd3dMREFwSnp0Y2JtTnZibk4wSUcxdmJtOXRaWEpVYjFOb2IzSjBSblZ1WTNScGIyNDZJQ2hoYldsdWJ6b2djM1J5YVc1bkxDQnRZWGhNWlc1bmRHaFBaazF2Ym05dFpYSTZJRzUxYldKbGNpa2dQVDRnYzNSeWFXNW5JRDBnYlc5dWIyMWxjbFJ2VTJodmNuUTdYRzVjYm1WNGNHOXlkQ0JsYm5WdElFUnlZWGRUZEhsc1pTQjdYRzRnSUUxVFFTQTlJQ2ROVTBFbkxGeHVJQ0JqYkdGemMybGpJRDBnSjJOc1lYTnphV01uTEZ4dWZWeHVYRzR2S2lwY2JpQXFJRUVnWm5WdVkzUnBiMjRnZEdoaGRDQndjbWx1ZEhNZ1lTQnpkSEpwYm1jZ1lXeHBaMjVsWkNCMGJ5QnNaV1owSUc5eUlHTmxiblJsY21Wa0xseHVJQ3BjYmlBcUlFQndZWEpoYlNCN2JuVnRZbVZ5ZlNCNElIZ2dZMjl2Y21ScGJtRjBaUzVjYmlBcUlFQndZWEpoYlNCN2JuVnRZbVZ5ZlNCNUlIa2dZMjl2Y21ScGJtRjBaUzVjYmlBcUlFQndZWEpoYlNCN2JuVnRZbVZ5ZlNCM0lGZHBaSFJvTGx4dUlDb2dRSEJoY21GdElIdHVkVzFpWlhKOUlHZ2dTR1ZwWjJoMExseHVJQ29nUUhCaGNtRnRJSHREWVc1MllYTlNaVzVrWlhKcGJtZERiMjUwWlhoME1rUjlJR2NnUTJGdWRtRnpJSEpsYm1SbGNtbHVaeUJqYjI1MFpYaDBMbHh1SUNvZ1FIQmhjbUZ0SUh0emRISnBibWQ5SUhNZ1UzUnlhVzVuSUhSdklIQnlhVzUwTGx4dUlDb2dRSEJoY21GdElIdHpkSEpwYm1kOUlGdGpiMnh2Y2oxMWJtUmxabWx1WldSRGIyeHZjbDBnVTNSeWFXNW5JR052Ykc5eUxseHVJQ29nUUhCaGNtRnRJSHR1ZFcxaVpYSjlJRnR3YVhadmREMHdYU0JRYVhKMmIzUXVYRzRnS2lCQWNHRnlZVzBnZTJKdmIyeGxZVzU5SUZ0c1pXWjBQV1poYkhObFhTQkpjeUJzWldaMElHRnNhV2R1WldRdVhHNGdLaUJBY0dGeVlXMGdlMjUxYldKbGNuMGdXM1J5WVc1emNHRnlaVzVqZVZKaGRHVTlNQzR3WFNCVWNtRnVjM0JoY21WdVkza2djbUYwWlNCM2FHVnlaU0F4TGpBZ2FYTWdablZzYkhrZ2RISmhibk53WVhKbGJuUmNiaUFxSUVCd1lYSmhiU0I3YzNSeWFXNW5mU0JiYzJWd1lYSmhkRzl5UFNjblhTQkpjeUJ6WlhCaGNtRjBiM0lnWm05eUlITmxjWFZsYm1ObExseHVJQ29nUUhCaGNtRnRJSHRpYjI5c1pXRnVmU0JiYkdGemREMW1ZV3h6WlYwZ1NYTWdZMmhsWTJ0bGNpQnBaaUJsYkdWdFpXNTBJR3hoYzNRZ2IzSWdibTkwTGx4dUlDb2dRSEJoY21GdElHUnlZWGRUZEhsc1pTQkpjeUJrY21GM0lITjBlV3hsTGlCTlUwRWdMU0JtYjNJZ2JYVnNkR2xqYUdGeVUyVnhMQ0JqYkdGemMybGpJQzBnWm05eUlHOTBhR1Z5SUhObGNTNWNiaUFxSUVCd1lYSmhiU0J0WVhoWGIzSmtJRWx6SUdGeWNtRjVJRzltSUcxaGVDQjNiM0prY3lCbWIzSWdaV0ZqYUNCc2FXNWxMbHh1SUNvZ1FIQmhjbUZ0SUhkdmNtUkpaSGdnU1hNZ2FXNWtaWGdnYjJZZ2QyOXlaQ0IzWlNCamRYSnlaVzUwYkhrZ1pISmhkeTVjYmlBcUlFQndZWEpoYlNCbmNtbGtRMlZzYkNCSmN5Qm5jbWxrSUdObGJHd3VYRzRnS2lCQWNHRnlZVzBnY21WbVpYSmxibU5sVTJWeGRXVnVZMlVnU1hNZ2NtVm1aWEpsYm1ObElITmxjWFZsYm1ObElHWnZjaUJrYVdabUlHMXZaR1V1WEc0Z0tpQkFjR0Z5WVcwZ2JXRjRUR1Z1WjNSb1QyWk5iMjV2YldWeUlFbHpJRzFoZUNCc1pXNW5kR2dnYjJZZ2JXOXViMjFsY2k1Y2JpQXFJRUJ5WlhSMWNtNGdlMjUxYldKbGNuMGdlQ0JqYjI5eVpHbHVZWFJsSUhSdklITjBZWEowSUhCeWFXNTBhVzVuSUdGMExseHVJQ292WEc1bGVIQnZjblFnWTI5dWMzUWdjSEpwYm5STVpXWjBUM0pEWlc1MFpYSmxaQ0E5SUNoY2JpQWdlRG9nYm5WdFltVnlMQ0I1T2lCdWRXMWlaWElzSUhjNklHNTFiV0psY2l3Z2FEb2diblZ0WW1WeUxGeHVJQ0JuT2lCRFlXNTJZWE5TWlc1a1pYSnBibWREYjI1MFpYaDBNa1FzSUhNNklITjBjbWx1Wnl3Z1kyOXNiM0k2SUhOMGNtbHVaeUE5SUhWdVpHVm1hVzVsWkVOdmJHOXlMRnh1SUNCd2FYWnZkRG9nYm5WdFltVnlJRDBnTUN3Z2JHVm1kQ0E5SUdaaGJITmxMQ0IwY21GdWMzQmhjbVZ1WTNsU1lYUmxPaUJ1ZFcxaVpYSWdQU0F4TGpBc1hHNGdJSE5sY0dGeVlYUnZjam9nYzNSeWFXNW5JRDBnSnljc0lHeGhjM1E2SUdKdmIyeGxZVzRnUFNCbVlXeHpaU3dnWkhKaGQxTjBlV3hsT2lCRWNtRjNVM1I1YkdVZ1BTQkVjbUYzVTNSNWJHVXVZMnhoYzNOcFl5d2diV0Y0VjI5eVpEb2dleUJiYVc1a1pYZzZJSE4wY21sdVoxMDZJRzUxYldKbGNpQjlJRDBnZTMwc0lIZHZjbVJKWkhnNklHNTFiV0psY2lBOUlEQXNJR2R5YVdSRFpXeHNPaUJFUnk1SGNtbGtRMlZzYkNCOElHNTFiR3dnUFNCdWRXeHNMQ0J5WldabGNtVnVZMlZUWlhGMVpXNWpaVG9nYzNSeWFXNW5XMTBnUFNCYlhTd2diV0Y0VEdWdVozUm9UMlpOYjI1dmJXVnlPaUJ1ZFcxaVpYSWdmQ0J1ZFd4c0lEMGdiblZzYkNrNklHNTFiV0psY2lBOVBpQjdYRzRnSUdjdWRHVjRkRUZzYVdkdUlEMGdKM04wWVhKMEp6dGNiaUFnYkdWMElHTnZiRzl5VUdGeWRDQTlJSE11YzNWaWMzUnlhVzVuS0RBcE8xeHVJQ0JzWlhRZ1ozSmhlVkJoY25RZ1BTQnNZWE4wSUQ4Z0p5Y2dPaUJ6WlhCaGNtRjBiM0k3WEc0Z0lHbG1JQ2hrY21GM1UzUjViR1VnUFQwOUlFUnlZWGRUZEhsc1pTNU5VMEVwSUh0Y2JpQWdJQ0JuY21GNVVHRnlkQ0E5SUNjbk8xeHVJQ0I5WEc0Z0lHeGxkQ0JqYjJ4dmNrTnZaR1VnUFNCMGNuVmxPMXh1SUNCc1pYUWdZMjl0Y0dGeVpWZHBkR2hEZFhKeVpXNTBJRDBnZEhKMVpUdGNiaUFnYkdWMElHaHBaMmhzYVdkb2RFUnBabVpsY21WdVkyVWdQU0FuWkdsbVptVnlaVzVqWlNjN1hHNGdJR2xtSUNnb1ozSnBaRU5sYkd3Z0lUMGdiblZzYkNrZ0ppWWdLR2R5YVdSRFpXeHNMbU5sYkd3dVkyOXNkVzF1SUNFOUlHNTFiR3dwS1NCN1hHNGdJQ0FnWTI5c2IzSkRiMlJsSUQwZ1ozSnBaRU5sYkd3dVkyVnNiQzVqYjJ4MWJXNHVkR1Z0Y0ZzblkyOXNiM0l0WTI5a1pTZGRJRDgvSUhSeWRXVTdYRzRnSUNBZ1kyOXRjR0Z5WlZkcGRHaERkWEp5Wlc1MElEMGdaM0pwWkVObGJHd3VZMlZzYkM1amIyeDFiVzR1ZEdWdGNGc25ZMjl0Y0dGeVpTMTNhWFJvTFdOMWNuSmxiblFuWFNBL1B5QjBjblZsTzF4dUlDQWdJR2hwWjJoc2FXZG9kRVJwWm1abGNtVnVZMlVnUFNCbmNtbGtRMlZzYkM1alpXeHNMbU52YkhWdGJpNTBaVzF3V3lkb2FXZG9iR2xuYUhRdFpHbG1abVZ5Wlc1alpTZGRJRDgvSUNka2FXWm1aWEpsYm1ObEp6dGNibHh1SUNCOVhHNGdJR052Ym5OMElHTjFjbkpsYm5STmIyNXZiV1Z5T2lCemRISnBibWNnUFNCeVpXWmxjbVZ1WTJWVFpYRjFaVzVqWlZ0M2IzSmtTV1I0WFR0Y2JpQWdhV1lnS0dOdmJYQmhjbVZYYVhSb1EzVnljbVZ1ZENBbUppQW9jbVZtWlhKbGJtTmxVMlZ4ZFdWdVkyVXViR1Z1WjNSb0lENGdNQ2tnSmlZZ0tHaHBaMmhzYVdkb2RFUnBabVpsY21WdVkyVWdQVDA5SUNka2FXWm1aWEpsYm1ObEp5a3BJSHRjYmlBZ0lDQjBjbUZ1YzNCaGNtVnVZM2xTWVhSbElEMGdLR052Ykc5eVVHRnlkQ0E5UFNCamRYSnlaVzUwVFc5dWIyMWxjaWtnUHlBd0xqTWdPaUIwY21GdWMzQmhjbVZ1WTNsU1lYUmxPMXh1SUNCOVhHNGdJR2xtSUNoamIyMXdZWEpsVjJsMGFFTjFjbkpsYm5RZ0ppWWdLSEpsWm1WeVpXNWpaVk5sY1hWbGJtTmxMbXhsYm1kMGFDQStJREFwSUNZbUlDaG9hV2RvYkdsbmFIUkVhV1ptWlhKbGJtTmxJRDA5UFNBblpYRjFZV3duS1NrZ2UxeHVJQ0FnSUhSeVlXNXpjR0Z5Wlc1amVWSmhkR1VnUFNBb1kyOXNiM0pRWVhKMElDRTlJR04xY25KbGJuUk5iMjV2YldWeUtTQS9JREF1TXlBNklIUnlZVzV6Y0dGeVpXNWplVkpoZEdVN1hHNGdJSDFjYmlBZ2FXWWdLRzFoZUV4bGJtZDBhRTltVFc5dWIyMWxjaUFoUFNCdWRXeHNLU0I3WEc0Z0lDQWdZMjlzYjNKUVlYSjBJRDBnYlc5dWIyMWxjbFJ2VTJodmNuUkdkVzVqZEdsdmJpaGpiMnh2Y2xCaGNuUXNJRzFoZUV4bGJtZDBhRTltVFc5dWIyMWxjaWs3WEc0Z0lIMWNibHh1WEc0Z0lHeGxkQ0IwWlhoMFUybDZaVG9nWVc1NUlEMGdaeTV0WldGemRYSmxWR1Y0ZENoamIyeHZjbEJoY25RZ0t5Qm5jbUY1VUdGeWRDazdYRzRnSUdOdmJuTjBJR2x1WkdWdWRDQTlJRFU3WEc1Y2JpQWdiR1YwSUcxaGVFTnZiRzl5VkdWNGRGTnBlbVVnUFNCbkxtMWxZWE4xY21WVVpYaDBLR052Ykc5eVVHRnlkQ2t1ZDJsa2RHZzdYRzRnSUd4bGRDQmpiMnh2Y2xSbGVIUlRhWHBsSUQwZ1p5NXRaV0Z6ZFhKbFZHVjRkQ2hqYjJ4dmNsQmhjblFwTG5kcFpIUm9PMXh1SUNCamIyNXpkQ0JrZVNBOUlHZ2dMeUF5SUMwZ0tIUmxlSFJUYVhwbExtWnZiblJDYjNWdVpHbHVaMEp2ZUVGelkyVnVkQ0FySUhSbGVIUlRhWHBsTG1admJuUkNiM1Z1WkdsdVowSnZlRVJsYzJObGJuUXBJQzhnTWlBcklERTdYRzRnSUhSbGVIUlRhWHBsSUQwZ2RHVjRkRk5wZW1VdWQybGtkR2c3WEc0Z0lHbG1JQ2hrY21GM1UzUjViR1VnUFQwOUlFUnlZWGRUZEhsc1pTNU5VMEVwSUh0Y2JpQWdJQ0J0WVhoRGIyeHZjbFJsZUhSVGFYcGxJRDBnYldGNFYyOXlaRnQzYjNKa1NXUjRYVHRjYmlBZ0lDQjBaWGgwVTJsNlpTQTlJRzFoZUZkdmNtUmJkMjl5WkVsa2VGMDdYRzRnSUgxY2JseHVJQ0JtZFc1amRHbHZiaUJrY21GM0tHUjRNVG9nYm5WdFltVnlMQ0JrZURJNklHNTFiV0psY2lrNklIWnZhV1FnZTF4dUlDQWdJR052Ym5OMElHUnlZWGREYjJ4dmNpQTlJR052Ykc5eVEyOWtaU0EvSUdOdmJHOXlJRG9nWW14aFkydERiMnh2Y2p0Y2JpQWdJQ0JuTG1acGJHeFRkSGxzWlNBOUlHUnlZWGREYjJ4dmNqdGNiaUFnSUNCbkxtZHNiMkpoYkVGc2NHaGhJRDBnZEhKaGJuTndZWEpsYm1ONVVtRjBaVHRjYmlBZ0lDQnBaaUFvWkhKaGQxTjBlV3hsSUQwOVBTQkVjbUYzVTNSNWJHVXVZMnhoYzNOcFl5a2dlMXh1SUNBZ0lDQWdaeTVtYVd4c1ZHVjRkQ2hqYjJ4dmNsQmhjblFzSUhnZ0t5QmtlREVzSUhrZ0t5QmtlU2s3WEc0Z0lDQWdJQ0JuTG1acGJHeFRkSGxzWlNBOUlHZHlZWGxEYjJ4dmNqdGNiaUFnSUNBZ0lHY3VabWxzYkZSbGVIUW9aM0poZVZCaGNuUXNJSGdnS3lCa2VESXNJSGtnS3lCa2VTazdYRzRnSUNBZ2ZWeHVJQ0FnSUdsbUlDaGtjbUYzVTNSNWJHVWdQVDA5SUVSeVlYZFRkSGxzWlM1TlUwRXBJSHRjYmlBZ0lDQWdJR2N1Wm1sc2JGTjBlV3hsSUQwZ1pISmhkME52Ykc5eU8xeHVJQ0FnSUNBZ1p5NW1hV3hzVkdWNGRDaGpiMnh2Y2xCaGNuUXNJSGdnS3lCa2VERWdLeUFvS0cxaGVGZHZjbVJiZDI5eVpFbGtlRjBnTFNCamIyeHZjbFJsZUhSVGFYcGxLU0F2SURJcExDQjVJQ3NnWkhrcE8xeHVJQ0FnSUgxY2JpQWdmVnh1WEc0Z0lHbG1JQ2hzWldaMElIeDhJSFJsZUhSVGFYcGxJRDRnZHlrZ2UxeHVJQ0FnSUdSeVlYY29hVzVrWlc1MExDQnBibVJsYm5RZ0t5QnRZWGhEYjJ4dmNsUmxlSFJUYVhwbEtUdGNiaUFnSUNCeVpYUjFjbTRnZUNBcklHMWhlRU52Ykc5eVZHVjRkRk5wZW1VZ0t5Qm5MbTFsWVhOMWNtVlVaWGgwS0dkeVlYbFFZWEowS1M1M2FXUjBhRHRjYmx4dUlDQjlJR1ZzYzJVZ2UxeHVJQ0FnSUdOdmJuTjBJR1I0SUQwZ0tIY2dMU0IwWlhoMFUybDZaU2tnTHlBeU8xeHVJQ0FnSUdSeVlYY29aSGdzSUdSNElDc2diV0Y0UTI5c2IzSlVaWGgwVTJsNlpTazdYRzRnSUNBZ2NtVjBkWEp1SUhnZ0t5QmtlQ0FySUcxaGVFTnZiRzl5VkdWNGRGTnBlbVU3WEc0Z0lIMWNibjA3WEc1Y2JpSmRmUT09IiwiaW1wb3J0ICogYXMgREcgZnJvbSAnZGF0YWdyb2stYXBpL2RnJztcbmltcG9ydCB3dSBmcm9tICd3dSc7XG5pbXBvcnQgeyBWZWN0b3IgfSBmcm9tICdAZGF0YWdyb2stbGlicmFyaWVzL3V0aWxzL3NyYy90eXBlLWRlY2xhcmF0aW9ucyc7XG5pbXBvcnQgeyB2ZWN0b3JMZW5ndGgsIHZlY3RvckRvdFByb2R1Y3QgfSBmcm9tICdAZGF0YWdyb2stbGlicmFyaWVzL3V0aWxzL3NyYy92ZWN0b3Itb3BlcmF0aW9ucyc7XG5pbXBvcnQgeyBBbWlub2FjaWRzUGFsZXR0ZXMgfSBmcm9tICcuLi9hbWlub2FjaWRzJztcbmltcG9ydCB7IE51Y2xlb3RpZGVzUGFsZXR0ZXMgfSBmcm9tICcuLi9udWNsZW90aWRlcyc7XG5pbXBvcnQgeyBVbmtub3duU2VxUGFsZXR0ZXMgfSBmcm9tICcuLi91bmtub3duJztcbmltcG9ydCB7IFVuaXRzSGFuZGxlciB9IGZyb20gJy4uL3V0aWxzL3VuaXRzLWhhbmRsZXInO1xuO1xuLyoqIFN0YXRzIG9mIHNlcXVlbmNlcyB3aXRoIHNwZWNpZmllZCBzcGxpdHRlciBmdW5jLCByZXR1cm5zIHsgZnJlcSwgc2FtZUxlbmd0aCB9LlxuICogQHBhcmFtIHtERy5Db2x1bW59IHNlcUNvbFxuICogQHBhcmFtIHtudW1iZXJ9IG1pbkxlbmd0aFxuICogQHBhcmFtIHtTcGxpdHRlckZ1bmN9IHNwbGl0dGVyXG4gKiBAcmV0dXJuIHsgU2VxQ29sU3RhdHMgfSwgc2FtZUxlbmd0aDogYm9vbGVhbiB9IHN0YXRzIG9mIGNvbHVtbiBzZXF1ZW5jZXNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFN0YXRzKHNlcUNvbCwgbWluTGVuZ3RoLCBzcGxpdHRlcikge1xuICAgIGNvbnN0IGZyZXEgPSB7fTtcbiAgICBsZXQgc2FtZUxlbmd0aCA9IHRydWU7XG4gICAgbGV0IGZpcnN0TGVuZ3RoID0gbnVsbDtcbiAgICBmb3IgKGNvbnN0IHNlcSBvZiBzZXFDb2wuY2F0ZWdvcmllcykge1xuICAgICAgICBjb25zdCBtU2VxID0gc3BsaXR0ZXIoc2VxKTtcbiAgICAgICAgaWYgKGZpcnN0TGVuZ3RoID09IG51bGwpXG4gICAgICAgICAgICBmaXJzdExlbmd0aCA9IG1TZXEubGVuZ3RoO1xuICAgICAgICBlbHNlIGlmIChtU2VxLmxlbmd0aCAhPT0gZmlyc3RMZW5ndGgpXG4gICAgICAgICAgICBzYW1lTGVuZ3RoID0gZmFsc2U7XG4gICAgICAgIGlmIChtU2VxLmxlbmd0aCA+PSBtaW5MZW5ndGgpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgbSBvZiBtU2VxKSB7XG4gICAgICAgICAgICAgICAgaWYgKCEobSBpbiBmcmVxKSlcbiAgICAgICAgICAgICAgICAgICAgZnJlcVttXSA9IDA7XG4gICAgICAgICAgICAgICAgZnJlcVttXSArPSAxO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB7IGZyZXE6IGZyZXEsIHNhbWVMZW5ndGg6IHNhbWVMZW5ndGggfTtcbn1cbmV4cG9ydCBjb25zdCBtb25vbWVyUmUgPSAvXFxbKFxcdyspXFxdfChcXHcpfCgtKS9nO1xuLyoqIFNwbGl0IHNlcXVlbmNlIGZvciBzaW5nbGUgY2hhcmFjdGVyIG1vbm9tZXJzLCBzcXVhcmUgYnJhY2tldHMgbXVsdGljaGFyIG1vbm9tZXIgbmFtZXMgb3IgZ2FwIHN5bWJvbC5cbiAqIEBwYXJhbSB7YW55fSBzZXEgb2JqZWN0IHdpdGggc2VxdWVuY2VcbiAqIEByZXR1cm4ge3N0cmluZ1tdfSBhcnJheSBvZiBtb25vbWVyc1xuICovXG5leHBvcnQgZnVuY3Rpb24gc3BsaXR0ZXJBc0Zhc3RhKHNlcSkge1xuICAgIHJldHVybiB3dShzZXEudG9TdHJpbmcoKS5tYXRjaEFsbChtb25vbWVyUmUpKVxuICAgICAgICAubWFwKChtYSkgPT4ge1xuICAgICAgICBsZXQgbVJlcztcbiAgICAgICAgY29uc3QgbSA9IG1hWzBdO1xuICAgICAgICBpZiAobS5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgICBtUmVzID0gbWFbMV07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBtUmVzID0gbTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbVJlcztcbiAgICB9KS50b0FycmF5KCk7XG59XG4vKiogR2V0cyBtZXRob2QgdG8gc3BsaXQgc2VxdWVuY2UgYnkgc2VwYXJhdG9yXG4gKiBAcGFyYW0ge3N0cmluZ30gc2VwYXJhdG9yXG4gKiBAcGFyYW0gbGltaXRcbiAqIEByZXR1cm4ge1NwbGl0dGVyRnVuY31cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFNwbGl0dGVyV2l0aFNlcGFyYXRvcihzZXBhcmF0b3IsIGxpbWl0ID0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIChzZXEpID0+IHtcbiAgICAgICAgcmV0dXJuIHNlcS5zcGxpdChzZXBhcmF0b3IsIGxpbWl0KTtcbiAgICB9O1xufVxuY29uc3QgaGVsbVJlID0gLyhQRVBUSURFMXxETkExfFJOQTEpXFx7KFtefV0rKX0vZztcbmNvbnN0IGhlbG1QcDFSZSA9IC9cXFsoW15cXFtcXF1dKyldL2c7XG4vKiogU3BsaXRzIEhlbG0gc3RyaW5nIHRvIG1vbm9tZXJzLCBidXQgZG9lcyBub3QgcmVwbGFjZSBtb25vbWVyIG5hbWVzIHRvIG90aGVyIG5vdGF0aW9uIChlLmcuIGZvciBSTkEpLlxuICogT25seSBmb3IgbGluZWFyIHBvbHltZXJzLCBkb2VzIG5vdCBzcGxpdCBSTkEgZm9yIHJpYm9zZSBhbmQgcGhvc3BoYXRlIG1vbm9tZXJzLlxuICogQHBhcmFtIHtzdHJpbmd9IHNlcSBTb3VyY2Ugc3RyaW5nIG9mIEhFTE0gbm90YXRpb25cbiAqIEByZXR1cm4ge3N0cmluZ1tdfVxuICovXG5leHBvcnQgZnVuY3Rpb24gc3BsaXR0ZXJBc0hlbG0oc2VxKSB7XG4gICAgaGVsbVJlLmxhc3RJbmRleCA9IDA7XG4gICAgY29uc3QgZWEgPSBoZWxtUmUuZXhlYyhzZXEudG9TdHJpbmcoKSk7XG4gICAgY29uc3QgaW5TZXEgPSBlYSA/IGVhWzJdIDogbnVsbDtcbiAgICBjb25zdCBtbVBvc3RQcm9jZXNzID0gKG1tKSA9PiB7XG4gICAgICAgIGhlbG1QcDFSZS5sYXN0SW5kZXggPSAwO1xuICAgICAgICBjb25zdCBwcDFNID0gaGVsbVBwMVJlLmV4ZWMobW0pO1xuICAgICAgICBpZiAocHAxTSAmJiBwcDFNLmxlbmd0aCA+PSAyKVxuICAgICAgICAgICAgcmV0dXJuIHBwMU1bMV07XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIHJldHVybiBtbTtcbiAgICB9O1xuICAgIGNvbnN0IG1tTGlzdCA9IGluU2VxID8gaW5TZXEuc3BsaXQoJy4nKSA6IFtdO1xuICAgIHJldHVybiBtbUxpc3QubWFwKG1tUG9zdFByb2Nlc3MpO1xufVxuLyoqIEdldCBzcGxpdHRlciBtZXRob2QgdG8gc3BsaXQgc2VxdWVuY2VzIHRvIG1vbm9tZXJzXG4gKiBAcGFyYW0ge3N0cmluZ30gdW5pdHNcbiAqIEBwYXJhbSB7c3RyaW5nfSBzZXBhcmF0b3JcbiAqIEBwYXJhbSBsaW1pdFxuICogQHJldHVybiB7U3BsaXR0ZXJGdW5jfVxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0U3BsaXR0ZXIodW5pdHMsIHNlcGFyYXRvciwgbGltaXQgPSB1bmRlZmluZWQpIHtcbiAgICBpZiAodW5pdHMudG9Mb3dlckNhc2UoKS5zdGFydHNXaXRoKFwiZmFzdGFcIiAvKiBOT1RBVElPTi5GQVNUQSAqLykpXG4gICAgICAgIHJldHVybiBzcGxpdHRlckFzRmFzdGE7XG4gICAgZWxzZSBpZiAodW5pdHMudG9Mb3dlckNhc2UoKS5zdGFydHNXaXRoKFwic2VwYXJhdG9yXCIgLyogTk9UQVRJT04uU0VQQVJBVE9SICovKSlcbiAgICAgICAgcmV0dXJuIGdldFNwbGl0dGVyV2l0aFNlcGFyYXRvcihzZXBhcmF0b3IsIGxpbWl0KTtcbiAgICBlbHNlIGlmICh1bml0cy50b0xvd2VyQ2FzZSgpLnN0YXJ0c1dpdGgoXCJoZWxtXCIgLyogTk9UQVRJT04uSEVMTSAqLykpXG4gICAgICAgIHJldHVybiBzcGxpdHRlckFzSGVsbTtcbiAgICBlbHNlXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5leHBlY3RlZCB1bml0cyAke3VuaXRzfSAuYCk7XG4gICAgLy8gVE9ETzogU3BsaXR0ZXIgZm9yIEhFTE1cbn1cbi8qKiBHZW5lcmF0ZSBzcGxpdHRlciBmdW5jdGlvbiBmb3Igc2VxdWVuY2UgY29sdW1uXG4gKiBAcGFyYW0ge0RHLkNvbHVtbn0gY29sXG4gKiBAcmV0dXJuIHtTcGxpdHRlckZ1bmN9IFNwbGl0dGVyIGZ1bmN0aW9uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRTcGxpdHRlckZvckNvbHVtbihjb2wpIHtcbiAgICBpZiAoY29sLnNlbVR5cGUgIT09IERHLlNFTVRZUEUuTUFDUk9NT0xFQ1VMRSlcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBHZXQgc3BsaXR0ZXIgZm9yIHNlbVR5cGUgXCIke0RHLlNFTVRZUEUuTUFDUk9NT0xFQ1VMRX1cIiBvbmx5LmApO1xuICAgIGNvbnN0IHVuaXRzID0gY29sLmdldFRhZyhERy5UQUdTLlVOSVRTKTtcbiAgICBjb25zdCBzZXBhcmF0b3IgPSBjb2wuZ2V0VGFnKFwic2VwYXJhdG9yXCIgLyogVEFHUy5zZXBhcmF0b3IgKi8pO1xuICAgIHJldHVybiBnZXRTcGxpdHRlcih1bml0cywgc2VwYXJhdG9yKTtcbn1cbmNvbnN0IGxvbmdNb25vbWVyUGFydFJlID0gLyhcXHcrKS9nO1xuLyoqIENvbnZlcnQgbG9uZyBtb25vbWVyIG5hbWVzIHRvIHNob3J0IG9uZXMgKi9cbmV4cG9ydCBmdW5jdGlvbiBtb25vbWVyVG9TaG9ydChhbWlubywgbWF4TGVuZ3RoT2ZNb25vbWVyKSB7XG4gICAgdmFyIF9hLCBfYjtcbiAgICBjb25zdCBzaG9ydEFtaW5vTWF0Y2ggPSBhbWluby5tYXRjaChsb25nTW9ub21lclBhcnRSZSk7XG4gICAgY29uc3QgbmVlZEFkZERvdHMgPSBhbWluby5sZW5ndGggPiBtYXhMZW5ndGhPZk1vbm9tZXIgfHwgKChfYSA9IHNob3J0QW1pbm9NYXRjaCA9PT0gbnVsbCB8fCBzaG9ydEFtaW5vTWF0Y2ggPT09IHZvaWQgMCA/IHZvaWQgMCA6IHNob3J0QW1pbm9NYXRjaC5sZW5ndGgpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IDApID4gMTtcbiAgICBjb25zdCBzaG9ydEFtaW5vID0gKF9iID0gc2hvcnRBbWlub01hdGNoID09PSBudWxsIHx8IHNob3J0QW1pbm9NYXRjaCA9PT0gdm9pZCAwID8gdm9pZCAwIDogc2hvcnRBbWlub01hdGNoWzBdKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiAnICc7XG4gICAgcmV0dXJuICFuZWVkQWRkRG90cyA/IHNob3J0QW1pbm8gOiBzaG9ydEFtaW5vLnN1YnN0cmluZygwLCBtYXhMZW5ndGhPZk1vbm9tZXIpICsgJ+KApic7XG59XG4vKiogKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRBbHBoYWJldChhbHBoYWJldCkge1xuICAgIHN3aXRjaCAoYWxwaGFiZXQpIHtcbiAgICAgICAgY2FzZSBcIkROQVwiIC8qIEFMUEhBQkVULkROQSAqLzpcbiAgICAgICAgICAgIHJldHVybiBVbml0c0hhbmRsZXIuRG5hRmFzdGFBbHBoYWJldDtcbiAgICAgICAgY2FzZSBcIlJOQVwiIC8qIEFMUEhBQkVULlJOQSAqLzpcbiAgICAgICAgICAgIHJldHVybiBVbml0c0hhbmRsZXIuUm5hRmFzdGFBbHBoYWJldDtcbiAgICAgICAgY2FzZSBcIlBUXCIgLyogQUxQSEFCRVQuUFQgKi86XG4gICAgICAgICAgICByZXR1cm4gVW5pdHNIYW5kbGVyLlBlcHRpZGVGYXN0YUFscGhhYmV0O1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbnN1cHBvcnRlZCBhbHBoYWJldCAnJHthbHBoYWJldH0nLmApO1xuICAgIH1cbn1cbi8qKiBDYWxjdWxhdGUgc2ltaWxhcml0eSBpbiBjdXJyZW50IHNlcXVlbmNlIGFuZCBhbHBoYWJldC5cbiAqIEBwYXJhbSB7TW9ub21lckZyZXFzfSBmcmVxXG4gKiBAcGFyYW0ge1NldDxzdHJpbmc+fSBhbHBoYWJldFxuICogQHBhcmFtIHtzdHJpbmd9IGdhcFN5bWJvbFxuICogQHJldHVybiB7bnVtYmVyfSBDb3NpbmUgc2ltaWxhcml0eVxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0QWxwaGFiZXRTaW1pbGFyaXR5KGZyZXEsIGFscGhhYmV0LCBnYXBTeW1ib2wgPSAnLScpIHtcbiAgICBjb25zdCBrZXlzID0gbmV3IFNldChbLi4ubmV3IFNldChPYmplY3Qua2V5cyhmcmVxKSksIC4uLmFscGhhYmV0XSk7XG4gICAga2V5cy5kZWxldGUoZ2FwU3ltYm9sKTtcbiAgICBjb25zdCBmcmVxQSA9IFtdO1xuICAgIGNvbnN0IGFscGhhYmV0QSA9IFtdO1xuICAgIGZvciAoY29uc3QgbSBvZiBrZXlzKSB7XG4gICAgICAgIGZyZXFBLnB1c2gobSBpbiBmcmVxID8gZnJlcVttXSA6IDApO1xuICAgICAgICBhbHBoYWJldEEucHVzaChhbHBoYWJldC5oYXMobSkgPyAxIDogMCk7XG4gICAgfVxuICAgIC8qIFRoZXJlIHdlcmUgYSBmZXcgaWRlYXM6IGNoaS1zcXVhcmVkLCBwZWFyc29uIGNvcnJlbGF0aW9uICh2YXJpYW5jZT8pLCBzY2FsYXIgcHJvZHVjdCAqL1xuICAgIGNvbnN0IGZyZXFWID0gbmV3IFZlY3RvcihmcmVxQSk7XG4gICAgY29uc3QgYWxwaGFiZXRWID0gbmV3IFZlY3RvcihhbHBoYWJldEEpO1xuICAgIHJldHVybiB2ZWN0b3JEb3RQcm9kdWN0KGZyZXFWLCBhbHBoYWJldFYpIC8gKHZlY3Rvckxlbmd0aChmcmVxVikgKiB2ZWN0b3JMZW5ndGgoYWxwaGFiZXRWKSk7XG59XG5leHBvcnQgZnVuY3Rpb24gZGV0ZWN0QWxwaGFiZXQoc3RhdHMpIHtcbiAgICBjb25zdCBhbHBoYWJldENhbmRpZGF0ZXMgPSBbXG4gICAgICAgIFtcIlBUXCIgLyogQUxQSEFCRVQuUFQgKi8sIFVuaXRzSGFuZGxlci5QZXB0aWRlRmFzdGFBbHBoYWJldF0sXG4gICAgICAgIFtcIkROQVwiIC8qIEFMUEhBQkVULkROQSAqLywgVW5pdHNIYW5kbGVyLkRuYUZhc3RhQWxwaGFiZXRdLFxuICAgICAgICBbXCJSTkFcIiAvKiBBTFBIQUJFVC5STkEgKi8sIFVuaXRzSGFuZGxlci5SbmFGYXN0YUFscGhhYmV0XSxcbiAgICBdO1xuICAgIC8vIENhbGN1bGF0ZSBsaWtlbGlob29kcyBmb3IgYWxwaGFiZXRfY2FuZGlkYXRlc1xuICAgIGNvbnN0IGFscGhhYmV0Q2FuZGlkYXRlc1NpbSA9IGFscGhhYmV0Q2FuZGlkYXRlcy5tYXAoKGMpID0+IGdldEFscGhhYmV0U2ltaWxhcml0eShzdGF0cy5mcmVxLCBjWzFdKSk7XG4gICAgY29uc3QgbWF4Q29zID0gTWF0aC5tYXgoLi4uYWxwaGFiZXRDYW5kaWRhdGVzU2ltKTtcbiAgICBjb25zdCBhbHBoYWJldCA9IG1heENvcyA+IDAuNjUgPyBhbHBoYWJldENhbmRpZGF0ZXNbYWxwaGFiZXRDYW5kaWRhdGVzU2ltLmluZGV4T2YobWF4Q29zKV1bMF0gOiAnVU4nO1xuICAgIHJldHVybiBhbHBoYWJldDtcbn1cbi8qKiBTZWxlY3RzIGEgc3VpdGFibGUgcGFsZXR0ZSBiYXNlZCBvbiBjb2x1bW4gZGF0YVxuICogQHBhcmFtIHtERy5Db2x1bW59IHNlcUNvbCBDb2x1bW4gdG8gbG9vayBmb3IgYSBwYWxldHRlXG4gKiBAcGFyYW0ge251bWJlcn0gIG1pbkxlbmd0aCBtaW5pbXVtIGxlbmd0aCBvZiBzZXF1ZW5jZSB0byBkZXRlY3QgcGFsZXR0ZSAoZW1wdHkgc3RyaW5ncyBhcmUgYWxsb3dlZClcbiAqIEByZXR1cm4ge1NlcVBhbGV0dGV9IFBhbGV0dGUgY29ycmVzcG9uZGluZyB0byB0aGUgYWxwaGFiZXQgb2YgdGhlIHNlcXVlbmNlcyBpbiB0aGUgY29sdW1uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwaWNrVXBQYWxldHRlKHNlcUNvbCwgbWluTGVuZ3RoID0gNSkge1xuICAgIGxldCBhbHBoYWJldDtcbiAgICBpZiAoc2VxQ29sLnNlbVR5cGUgPT0gREcuU0VNVFlQRS5NQUNST01PTEVDVUxFKSB7XG4gICAgICAgIGNvbnN0IHVoID0gbmV3IFVuaXRzSGFuZGxlcihzZXFDb2wpO1xuICAgICAgICBhbHBoYWJldCA9IHVoLmFscGhhYmV0O1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgY29uc3Qgc3RhdHMgPSBnZXRTdGF0cyhzZXFDb2wsIG1pbkxlbmd0aCwgc3BsaXR0ZXJBc0Zhc3RhKTtcbiAgICAgICAgYWxwaGFiZXQgPSBkZXRlY3RBbHBoYWJldChzdGF0cyk7XG4gICAgfVxuICAgIGNvbnN0IHJlcyA9IGdldFBhbGV0dGVCeVR5cGUoYWxwaGFiZXQpO1xuICAgIHJldHVybiByZXM7XG59XG5leHBvcnQgZnVuY3Rpb24gZ2V0UGFsZXR0ZUJ5VHlwZShwYWxldHRlVHlwZSkge1xuICAgIHN3aXRjaCAocGFsZXR0ZVR5cGUpIHtcbiAgICAgICAgY2FzZSAnUFQnOlxuICAgICAgICAgICAgcmV0dXJuIEFtaW5vYWNpZHNQYWxldHRlcy5Hcm9rR3JvdXBzO1xuICAgICAgICBjYXNlICdOVCc6XG4gICAgICAgIGNhc2UgJ0ROQSc6XG4gICAgICAgIGNhc2UgJ1JOQSc6XG4gICAgICAgICAgICByZXR1cm4gTnVjbGVvdGlkZXNQYWxldHRlcy5DaHJvbWF0b2dyYW07XG4gICAgICAgIC8vIG90aGVyXG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICByZXR1cm4gVW5rbm93blNlcVBhbGV0dGVzLkNvbG9yO1xuICAgIH1cbn1cbmV4cG9ydCBmdW5jdGlvbiBwaWNrVXBTZXFDb2woZGYpIHtcbiAgICB2YXIgX2E7XG4gICAgY29uc3Qgc2VtVHlwZUNvbExpc3QgPSBkZi5jb2x1bW5zLmJ5U2VtVHlwZUFsbChERy5TRU1UWVBFLk1BQ1JPTU9MRUNVTEUpO1xuICAgIGxldCByZXNDb2wgPSAoX2EgPSBzZW1UeXBlQ29sTGlzdC5maW5kKChjb2wpID0+IHtcbiAgICAgICAgY29uc3QgdW5pdHMgPSBjb2wuZ2V0VGFnKERHLlRBR1MuVU5JVFMpO1xuICAgICAgICByZXR1cm4gdW5pdHMgPyB1bml0cy5pbmRleE9mKCdNU0EnKSAhPT0gLTEgOiBmYWxzZTtcbiAgICB9KSkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogbnVsbDtcbiAgICBpZiAoIXJlc0NvbCAmJiBzZW1UeXBlQ29sTGlzdC5sZW5ndGggPiAwKVxuICAgICAgICByZXNDb2wgPSBzZW1UeXBlQ29sTGlzdFswXTtcbiAgICByZXR1cm4gcmVzQ29sO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZGF0YTphcHBsaWNhdGlvbi9qc29uO2Jhc2U2NCxleUoyWlhKemFXOXVJam96TENKbWFXeGxJam9pYldGamNtOXRiMnhsWTNWc1pTNXFjeUlzSW5OdmRYSmpaVkp2YjNRaU9pSWlMQ0p6YjNWeVkyVnpJanBiSW0xaFkzSnZiVzlzWldOMWJHVXVkSE1pWFN3aWJtRnRaWE1pT2x0ZExDSnRZWEJ3YVc1bmN5STZJa0ZCUlVFc1QwRkJUeXhMUVVGTExFVkJRVVVzVFVGQlRTeHBRa0ZCYVVJc1EwRkJRenRCUVVOMFF5eFBRVUZQTEVWQlFVVXNUVUZCVFN4SlFVRkpMRU5CUVVNN1FVRkZjRUlzVDBGQlR5eEZRVUZETEUxQlFVMHNSVUZCUXl4TlFVRk5MR2xFUVVGcFJDeERRVUZETzBGQlEzWkZMRTlCUVU4c1JVRkJReXhaUVVGWkxFVkJRVVVzWjBKQlFXZENMRVZCUVVNc1RVRkJUU3hwUkVGQmFVUXNRMEZCUXp0QlFVVXZSaXhQUVVGUExFVkJRV0VzYTBKQlFXdENMRVZCUVVNc1RVRkJUU3hsUVVGbExFTkJRVU03UVVGRE4wUXNUMEZCVHl4RlFVRmpMRzFDUVVGdFFpeEZRVUZETEUxQlFVMHNaMEpCUVdkQ0xFTkJRVU03UVVGRGFFVXNUMEZCVHl4RlFVRkRMR3RDUVVGclFpeEZRVUZETEUxQlFVMHNXVUZCV1N4RFFVRkRPMEZCUXpsRExFOUJRVThzUlVGQlF5eFpRVUZaTEVWQlFVTXNUVUZCVFN4M1FrRkJkMElzUTBGQlF6dEJRVFJDYmtRc1EwRkJRenRCUVUxR096czdPenRIUVV0SE8wRkJRMGdzVFVGQlRTeFZRVUZWTEZGQlFWRXNRMEZCUXl4TlFVRnBRaXhGUVVGRkxGTkJRV2xDTEVWQlFVVXNVVUZCYzBJN1NVRkRia1lzVFVGQlRTeEpRVUZKTEVkQlFUUkNMRVZCUVVVc1EwRkJRenRKUVVONlF5eEpRVUZKTEZWQlFWVXNSMEZCUnl4SlFVRkpMRU5CUVVNN1NVRkRkRUlzU1VGQlNTeFhRVUZYTEVkQlFVY3NTVUZCU1N4RFFVRkRPMGxCUlhaQ0xFdEJRVXNzVFVGQlRTeEhRVUZITEVsQlFVa3NUVUZCVFN4RFFVRkRMRlZCUVZVc1JVRkJSVHRSUVVOdVF5eE5RVUZOTEVsQlFVa3NSMEZCUnl4UlFVRlJMRU5CUVVNc1IwRkJSeXhEUVVGRExFTkJRVU03VVVGRk0wSXNTVUZCU1N4WFFVRlhMRWxCUVVrc1NVRkJTVHRaUVVOeVFpeFhRVUZYTEVkQlFVY3NTVUZCU1N4RFFVRkRMRTFCUVUwc1EwRkJRenRoUVVOMlFpeEpRVUZKTEVsQlFVa3NRMEZCUXl4TlFVRk5MRXRCUVVzc1YwRkJWenRaUVVOc1F5eFZRVUZWTEVkQlFVY3NTMEZCU3l4RFFVRkRPMUZCUlhKQ0xFbEJRVWtzU1VGQlNTeERRVUZETEUxQlFVMHNTVUZCU1N4VFFVRlRMRVZCUVVVN1dVRkROVUlzUzBGQlN5eE5RVUZOTEVOQlFVTXNTVUZCU1N4SlFVRkpMRVZCUVVVN1owSkJRM0JDTEVsQlFVa3NRMEZCUXl4RFFVRkRMRU5CUVVNc1NVRkJTU3hKUVVGSkxFTkJRVU03YjBKQlEyUXNTVUZCU1N4RFFVRkRMRU5CUVVNc1EwRkJReXhIUVVGSExFTkJRVU1zUTBGQlF6dG5Ra0ZEWkN4SlFVRkpMRU5CUVVNc1EwRkJReXhEUVVGRExFbEJRVWtzUTBGQlF5eERRVUZETzJGQlEyUTdVMEZEUmp0TFFVTkdPMGxCUTBRc1QwRkJUeXhGUVVGRExFbEJRVWtzUlVGQlJTeEpRVUZKTEVWQlFVVXNWVUZCVlN4RlFVRkZMRlZCUVZVc1JVRkJReXhEUVVGRE8wRkJRemxETEVOQlFVTTdRVUZGUkN4TlFVRk5MRU5CUVVNc1RVRkJUU3hUUVVGVExFZEJRVmNzY1VKQlFYRkNMRU5CUVVNN1FVRkZka1E3T3p0SFFVZEhPMEZCUTBnc1RVRkJUU3hWUVVGVkxHVkJRV1VzUTBGQlF5eEhRVUZSTzBsQlEzUkRMRTlCUVU4c1JVRkJSU3hEUVVGdFFpeEhRVUZITEVOQlFVTXNVVUZCVVN4RlFVRkZMRU5CUVVNc1VVRkJVU3hEUVVGRExGTkJRVk1zUTBGQlF5eERRVUZETzFOQlF6VkVMRWRCUVVjc1EwRkJReXhEUVVGRExFVkJRVzlDTEVWQlFVVXNSVUZCUlR0UlFVTTFRaXhKUVVGSkxFbEJRVmtzUTBGQlF6dFJRVU5xUWl4TlFVRk5MRU5CUVVNc1IwRkJWeXhGUVVGRkxFTkJRVU1zUTBGQlF5eERRVUZETEVOQlFVTTdVVUZEZUVJc1NVRkJTU3hEUVVGRExFTkJRVU1zVFVGQlRTeEhRVUZITEVOQlFVTXNSVUZCUlR0WlFVTm9RaXhKUVVGSkxFZEJRVWNzUlVGQlJTeERRVUZETEVOQlFVTXNRMEZCUXl4RFFVRkRPMU5CUTJRN1lVRkJUVHRaUVVOTUxFbEJRVWtzUjBGQlJ5eERRVUZETEVOQlFVTTdVMEZEVmp0UlFVTkVMRTlCUVU4c1NVRkJTU3hEUVVGRE8wbEJRMlFzUTBGQlF5eERRVUZETEVOQlFVTXNUMEZCVHl4RlFVRkZMRU5CUVVNN1FVRkRha0lzUTBGQlF6dEJRVVZFT3pzN08wZEJTVWM3UVVGRFNDeE5RVUZOTEZWQlFWVXNkMEpCUVhkQ0xFTkJRVU1zVTBGQmFVSXNSVUZCUlN4UlFVRTBRaXhUUVVGVE8wbEJReTlHTEU5QlFVOHNRMEZCUXl4SFFVRlhMRVZCUVVVc1JVRkJSVHRSUVVOeVFpeFBRVUZQTEVkQlFVY3NRMEZCUXl4TFFVRkxMRU5CUVVNc1UwRkJVeXhGUVVGRkxFdEJRVXNzUTBGQlF5eERRVUZETzBsQlEzSkRMRU5CUVVNc1EwRkJRenRCUVVOS0xFTkJRVU03UVVGRlJDeE5RVUZOTEUxQlFVMHNSMEZCVnl4cFEwRkJhVU1zUTBGQlF6dEJRVU42UkN4TlFVRk5MRk5CUVZNc1IwRkJWeXhuUWtGQlowSXNRMEZCUXp0QlFVVXpRenM3T3p0SFFVbEhPMEZCUTBnc1RVRkJUU3hWUVVGVkxHTkJRV01zUTBGQlF5eEhRVUZSTzBsQlEzSkRMRTFCUVUwc1EwRkJReXhUUVVGVExFZEJRVWNzUTBGQlF5eERRVUZETzBsQlEzSkNMRTFCUVUwc1JVRkJSU3hIUVVFeVFpeE5RVUZOTEVOQlFVTXNTVUZCU1N4RFFVRkRMRWRCUVVjc1EwRkJReXhSUVVGUkxFVkJRVVVzUTBGQlF5eERRVUZETzBsQlF5OUVMRTFCUVUwc1MwRkJTeXhIUVVGclFpeEZRVUZGTEVOQlFVTXNRMEZCUXl4RFFVRkRMRVZCUVVVc1EwRkJReXhEUVVGRExFTkJRVU1zUTBGQlF5eERRVUZETEVOQlFVTXNTVUZCU1N4RFFVRkRPMGxCUlM5RExFMUJRVTBzWVVGQllTeEhRVUZITEVOQlFVTXNSVUZCVlN4RlFVRlZMRVZCUVVVN1VVRkRNME1zVTBGQlV5eERRVUZETEZOQlFWTXNSMEZCUnl4RFFVRkRMRU5CUVVNN1VVRkRlRUlzVFVGQlRTeEpRVUZKTEVkQlFVY3NVMEZCVXl4RFFVRkRMRWxCUVVrc1EwRkJReXhGUVVGRkxFTkJRVU1zUTBGQlF6dFJRVU5vUXl4SlFVRkpMRWxCUVVrc1NVRkJTU3hKUVVGSkxFTkJRVU1zVFVGQlRTeEpRVUZKTEVOQlFVTTdXVUZETVVJc1QwRkJUeXhKUVVGSkxFTkJRVU1zUTBGQlF5eERRVUZETEVOQlFVTTdPMWxCUldZc1QwRkJUeXhGUVVGRkxFTkJRVU03U1VGRFpDeERRVUZETEVOQlFVTTdTVUZGUml4TlFVRk5MRTFCUVUwc1IwRkJZU3hMUVVGTExFTkJRVU1zUTBGQlF5eERRVUZETEV0QlFVc3NRMEZCUXl4TFFVRkxMRU5CUVVNc1IwRkJSeXhEUVVGRExFTkJRVU1zUTBGQlF5eERRVUZETEVWQlFVVXNRMEZCUXp0SlFVTjJSQ3hQUVVGUExFMUJRVTBzUTBGQlF5eEhRVUZITEVOQlFVTXNZVUZCWVN4RFFVRkRMRU5CUVVNN1FVRkRia01zUTBGQlF6dEJRVVZFT3pzN096dEhRVXRITzBGQlEwZ3NUVUZCVFN4VlFVRlZMRmRCUVZjc1EwRkJReXhMUVVGaExFVkJRVVVzVTBGQmFVSXNSVUZCUlN4UlFVRTBRaXhUUVVGVE8wbEJRMnBITEVsQlFVa3NTMEZCU3l4RFFVRkRMRmRCUVZjc1JVRkJSU3hEUVVGRExGVkJRVlVzT0VKQlFXZENPMUZCUTJoRUxFOUJRVThzWlVGQlpTeERRVUZETzFOQlEzQkNMRWxCUVVrc1MwRkJTeXhEUVVGRExGZEJRVmNzUlVGQlJTeERRVUZETEZWQlFWVXNjME5CUVc5Q08xRkJRM3BFTEU5QlFVOHNkMEpCUVhkQ0xFTkJRVU1zVTBGQlV5eEZRVUZGTEV0QlFVc3NRMEZCUXl4RFFVRkRPMU5CUXk5RExFbEJRVWtzUzBGQlN5eERRVUZETEZkQlFWY3NSVUZCUlN4RFFVRkRMRlZCUVZVc05FSkJRV1U3VVVGRGNFUXNUMEZCVHl4alFVRmpMRU5CUVVNN08xRkJSWFJDTEUxQlFVMHNTVUZCU1N4TFFVRkxMRU5CUVVNc2IwSkJRVzlDTEV0QlFVc3NTVUZCU1N4RFFVRkRMRU5CUVVNN1NVRkZha1FzTUVKQlFUQkNPMEZCUXpWQ0xFTkJRVU03UVVGRlJEczdPMGRCUjBjN1FVRkRTQ3hOUVVGTkxGVkJRVlVzYjBKQlFXOUNMRU5CUVVNc1IwRkJZenRKUVVOcVJDeEpRVUZKTEVkQlFVY3NRMEZCUXl4UFFVRlBMRXRCUVVzc1JVRkJSU3hEUVVGRExFOUJRVThzUTBGQlF5eGhRVUZoTzFGQlF6RkRMRTFCUVUwc1NVRkJTU3hMUVVGTExFTkJRVU1zTmtKQlFUWkNMRVZCUVVVc1EwRkJReXhQUVVGUExFTkJRVU1zWVVGQllTeFRRVUZUTEVOQlFVTXNRMEZCUXp0SlFVVnNSaXhOUVVGTkxFdEJRVXNzUjBGQlJ5eEhRVUZITEVOQlFVTXNUVUZCVFN4RFFVRkRMRVZCUVVVc1EwRkJReXhKUVVGSkxFTkJRVU1zUzBGQlN5eERRVUZETEVOQlFVTTdTVUZEZUVNc1RVRkJUU3hUUVVGVExFZEJRVWNzUjBGQlJ5eERRVUZETEUxQlFVMHNhME5CUVdkQ0xFTkJRVU03U1VGRE4wTXNUMEZCVHl4WFFVRlhMRU5CUVVNc1MwRkJTeXhGUVVGRkxGTkJRVk1zUTBGQlF5eERRVUZETzBGQlEzWkRMRU5CUVVNN1FVRkZSQ3hOUVVGTkxHbENRVUZwUWl4SFFVRlhMRkZCUVZFc1EwRkJRenRCUVVVelF5d3JRMEZCSzBNN1FVRkRMME1zVFVGQlRTeFZRVUZWTEdOQlFXTXNRMEZCUXl4TFFVRmhMRVZCUVVVc2EwSkJRVEJDT3p0SlFVTjBSU3hOUVVGTkxHVkJRV1VzUjBGQk5FSXNTMEZCU3l4RFFVRkRMRXRCUVVzc1EwRkJReXhwUWtGQmFVSXNRMEZCUXl4RFFVRkRPMGxCUTJoR0xFMUJRVTBzVjBGQlZ5eEhRVUZaTEV0QlFVc3NRMEZCUXl4TlFVRk5MRWRCUVVjc2EwSkJRV3RDTEVsQlFVa3NRMEZCUXl4TlFVRkJMR1ZCUVdVc1lVRkJaaXhsUVVGbExIVkNRVUZtTEdWQlFXVXNRMEZCUlN4TlFVRk5MRzFEUVVGSkxFTkJRVU1zUTBGQlF5eEhRVUZITEVOQlFVTXNRMEZCUXp0SlFVTnlSeXhOUVVGTkxGVkJRVlVzUjBGQlJ5eE5RVUZCTEdWQlFXVXNZVUZCWml4bFFVRmxMSFZDUVVGbUxHVkJRV1VzUTBGQlJ5eERRVUZETEVOQlFVTXNiVU5CUVVrc1IwRkJSeXhEUVVGRE8wbEJReTlETEU5QlFVOHNRMEZCUXl4WFFVRlhMRU5CUVVNc1EwRkJReXhEUVVGRExGVkJRVlVzUTBGQlF5eERRVUZETEVOQlFVTXNWVUZCVlN4RFFVRkRMRk5CUVZNc1EwRkJReXhEUVVGRExFVkJRVVVzYTBKQlFXdENMRU5CUVVNc1IwRkJSeXhIUVVGSExFTkJRVU03UVVGRGRrWXNRMEZCUXp0QlFVVkVMRTFCUVUwN1FVRkRUaXhOUVVGTkxGVkJRVlVzVjBGQlZ5eERRVUZETEZGQlFXdENPMGxCUXpWRExGRkJRVkVzVVVGQlVTeEZRVUZGTzFGQlEyeENPMWxCUTBVc1QwRkJUeXhaUVVGWkxFTkJRVU1zWjBKQlFXZENMRU5CUVVNN1VVRkRka003V1VGRFJTeFBRVUZQTEZsQlFWa3NRMEZCUXl4blFrRkJaMElzUTBGQlF6dFJRVU4yUXp0WlFVTkZMRTlCUVU4c1dVRkJXU3hEUVVGRExHOUNRVUZ2UWl4RFFVRkRPMUZCUXpORE8xbEJRMFVzVFVGQlRTeEpRVUZKTEV0QlFVc3NRMEZCUXl4NVFrRkJlVUlzVVVGQlVTeEpRVUZKTEVOQlFVTXNRMEZCUXp0TFFVTjRSRHRCUVVOSUxFTkJRVU03UVVGRlJEczdPenM3UjBGTFJ6dEJRVU5JTEUxQlFVMHNWVUZCVlN4eFFrRkJjVUlzUTBGQlF5eEpRVUZyUWl4RlFVRkZMRkZCUVhGQ0xFVkJRVVVzV1VGQmIwSXNSMEZCUnp0SlFVTjBSeXhOUVVGTkxFbEJRVWtzUjBGQlJ5eEpRVUZKTEVkQlFVY3NRMEZCVXl4RFFVRkRMRWRCUVVjc1NVRkJTU3hIUVVGSExFTkJRVU1zVFVGQlRTeERRVUZETEVsQlFVa3NRMEZCUXl4SlFVRkpMRU5CUVVNc1EwRkJReXhGUVVGRkxFZEJRVWNzVVVGQlVTeERRVUZETEVOQlFVTXNRMEZCUXp0SlFVTXpSU3hKUVVGSkxFTkJRVU1zVFVGQlRTeERRVUZETEZOQlFWTXNRMEZCUXl4RFFVRkRPMGxCUlhaQ0xFMUJRVTBzUzBGQlN5eEhRVUZoTEVWQlFVVXNRMEZCUXp0SlFVTXpRaXhOUVVGTkxGTkJRVk1zUjBGQllTeEZRVUZGTEVOQlFVTTdTVUZETDBJc1MwRkJTeXhOUVVGTkxFTkJRVU1zU1VGQlNTeEpRVUZKTEVWQlFVVTdVVUZEY0VJc1MwRkJTeXhEUVVGRExFbEJRVWtzUTBGQlF5eERRVUZETEVsQlFVa3NTVUZCU1N4RFFVRkRMRU5CUVVNc1EwRkJReXhKUVVGSkxFTkJRVU1zUTBGQlF5eERRVUZETEVOQlFVTXNRMEZCUXl4RFFVRkRMRU5CUVVNc1EwRkJReXhEUVVGRE8xRkJRM0JETEZOQlFWTXNRMEZCUXl4SlFVRkpMRU5CUVVNc1VVRkJVU3hEUVVGRExFZEJRVWNzUTBGQlF5eERRVUZETEVOQlFVTXNRMEZCUXl4RFFVRkRMRU5CUVVNc1EwRkJReXhEUVVGRExFTkJRVU1zUTBGQlF5eERRVUZETEVOQlFVTXNRMEZCUXp0TFFVTjZRenRKUVVORUxEQkdRVUV3Ump0SlFVTXhSaXhOUVVGTkxFdEJRVXNzUjBGQlZ5eEpRVUZKTEUxQlFVMHNRMEZCUXl4TFFVRkxMRU5CUVVNc1EwRkJRenRKUVVONFF5eE5RVUZOTEZOQlFWTXNSMEZCVnl4SlFVRkpMRTFCUVUwc1EwRkJReXhUUVVGVExFTkJRVU1zUTBGQlF6dEpRVU5vUkN4UFFVRlBMR2RDUVVGblFpeERRVUZETEV0QlFVc3NSVUZCUlN4VFFVRlRMRU5CUVVNc1IwRkJSeXhEUVVGRExGbEJRVmtzUTBGQlF5eExRVUZMTEVOQlFVTXNSMEZCUnl4WlFVRlpMRU5CUVVNc1UwRkJVeXhEUVVGRExFTkJRVU1zUTBGQlF6dEJRVU01Uml4RFFVRkRPMEZCUlVRc1RVRkJUU3hWUVVGVkxHTkJRV01zUTBGQlF5eExRVUZyUWp0SlFVTXZReXhOUVVGTkxHdENRVUZyUWl4SFFVRTBRanRSUVVOc1JDeDVRa0ZCWXl4WlFVRlpMRU5CUVVNc2IwSkJRVzlDTEVOQlFVTTdVVUZEYUVRc01rSkJRV1VzV1VGQldTeERRVUZETEdkQ1FVRm5RaXhEUVVGRE8xRkJRemRETERKQ1FVRmxMRmxCUVZrc1EwRkJReXhuUWtGQlowSXNRMEZCUXp0TFFVTTVReXhEUVVGRE8wbEJSVVlzWjBSQlFXZEVPMGxCUTJoRUxFMUJRVTBzY1VKQlFYRkNMRWRCUVdFc2EwSkJRV3RDTEVOQlFVTXNSMEZCUnl4RFFVTTFSQ3hEUVVGRExFTkJRVU1zUlVGQlJTeEZRVUZGTEVOQlFVTXNjVUpCUVhGQ0xFTkJRVU1zUzBGQlN5eERRVUZETEVsQlFVa3NSVUZCUlN4RFFVRkRMRU5CUVVNc1EwRkJReXhEUVVGRExFTkJRVU1zUTBGQlF5eERRVUZETzBsQlEyeEVMRTFCUVUwc1RVRkJUU3hIUVVGSExFbEJRVWtzUTBGQlF5eEhRVUZITEVOQlFVTXNSMEZCUnl4eFFrRkJjVUlzUTBGQlF5eERRVUZETzBsQlEyeEVMRTFCUVUwc1VVRkJVU3hIUVVGSExFMUJRVTBzUjBGQlJ5eEpRVUZKTEVOQlFVTXNRMEZCUXl4RFFVRkRMR3RDUVVGclFpeERRVUZETEhGQ1FVRnhRaXhEUVVGRExFOUJRVThzUTBGQlF5eE5RVUZOTEVOQlFVTXNRMEZCUXl4RFFVRkRMRU5CUVVNc1EwRkJReXhEUVVGRExFTkJRVU1zUTBGQlF5eEpRVUZKTEVOQlFVTTdTVUZEY2tjc1QwRkJUeXhSUVVGUkxFTkJRVU03UVVGRGJFSXNRMEZCUXp0QlFVVkVPenM3TzBkQlNVYzdRVUZEU0N4TlFVRk5MRlZCUVZVc1lVRkJZU3hEUVVGRExFMUJRV2xDTEVWQlFVVXNXVUZCYjBJc1EwRkJRenRKUVVOd1JTeEpRVUZKTEZGQlFXZENMRU5CUVVNN1NVRkRja0lzU1VGQlNTeE5RVUZOTEVOQlFVTXNUMEZCVHl4SlFVRkpMRVZCUVVVc1EwRkJReXhQUVVGUExFTkJRVU1zWVVGQllTeEZRVUZGTzFGQlF6bERMRTFCUVUwc1JVRkJSU3hIUVVGcFFpeEpRVUZKTEZsQlFWa3NRMEZCUXl4TlFVRk5MRU5CUVVNc1EwRkJRenRSUVVOc1JDeFJRVUZSTEVkQlFVY3NSVUZCUlN4RFFVRkRMRkZCUVZFc1EwRkJRenRMUVVONFFqdFRRVUZOTzFGQlEwd3NUVUZCVFN4TFFVRkxMRWRCUVdkQ0xGRkJRVkVzUTBGQlF5eE5RVUZOTEVWQlFVVXNVMEZCVXl4RlFVRkZMR1ZCUVdVc1EwRkJReXhEUVVGRE8xRkJRM2hGTEZGQlFWRXNSMEZCUnl4alFVRmpMRU5CUVVNc1MwRkJTeXhEUVVGRExFTkJRVU03UzBGRGJFTTdTVUZGUkN4TlFVRk5MRWRCUVVjc1IwRkJSeXhuUWtGQlowSXNRMEZCUXl4UlFVRlJMRU5CUVVNc1EwRkJRenRKUVVOMlF5eFBRVUZQTEVkQlFVY3NRMEZCUXp0QlFVTmlMRU5CUVVNN1FVRkZSQ3hOUVVGTkxGVkJRVlVzWjBKQlFXZENMRU5CUVVNc1YwRkJiVUk3U1VGRGJFUXNVVUZCVVN4WFFVRlhMRVZCUVVVN1VVRkRja0lzUzBGQlN5eEpRVUZKTzFsQlExQXNUMEZCVHl4clFrRkJhMElzUTBGQlF5eFZRVUZWTEVOQlFVTTdVVUZEZGtNc1MwRkJTeXhKUVVGSkxFTkJRVU03VVVGRFZpeExRVUZMTEV0QlFVc3NRMEZCUXp0UlFVTllMRXRCUVVzc1MwRkJTenRaUVVOU0xFOUJRVThzYlVKQlFXMUNMRU5CUVVNc1dVRkJXU3hEUVVGRE8xRkJRM2hETEZGQlFWRTdVVUZEVmp0WlFVTkZMRTlCUVU4c2EwSkJRV3RDTEVOQlFVTXNTMEZCU3l4RFFVRkRPMHRCUTJwRE8wRkJRMGdzUTBGQlF6dEJRVVZFTEUxQlFVMHNWVUZCVlN4WlFVRlpMRU5CUVVNc1JVRkJaMEk3TzBsQlF6TkRMRTFCUVUwc1kwRkJZeXhIUVVGSExFVkJRVVVzUTBGQlF5eFBRVUZQTEVOQlFVTXNXVUZCV1N4RFFVRkRMRVZCUVVVc1EwRkJReXhQUVVGUExFTkJRVU1zWVVGQllTeERRVUZETEVOQlFVTTdTVUZEZWtVc1NVRkJTU3hOUVVGTkxFZEJRWEZDTEUxQlFVRXNZMEZCWXl4RFFVRkRMRWxCUVVrc1EwRkJReXhEUVVGRExFZEJRVWNzUlVGQlJTeEZRVUZGTzFGQlEzcEVMRTFCUVUwc1MwRkJTeXhIUVVGSExFZEJRVWNzUTBGQlF5eE5RVUZOTEVOQlFVTXNSVUZCUlN4RFFVRkRMRWxCUVVrc1EwRkJReXhMUVVGTExFTkJRVU1zUTBGQlF6dFJRVU40UXl4UFFVRlBMRXRCUVVzc1EwRkJReXhEUVVGRExFTkJRVU1zUzBGQlN5eERRVUZETEU5QlFVOHNRMEZCUXl4TFFVRkxMRU5CUVVNc1MwRkJTeXhEUVVGRExFTkJRVU1zUTBGQlF5eERRVUZETEVOQlFVTXNTMEZCU3l4RFFVRkRPMGxCUTNKRUxFTkJRVU1zUTBGQlF5eHRRMEZCU1N4SlFVRkpMRU5CUVVNN1NVRkRXQ3hKUVVGSkxFTkJRVU1zVFVGQlRTeEpRVUZKTEdOQlFXTXNRMEZCUXl4TlFVRk5MRWRCUVVjc1EwRkJRenRSUVVOMFF5eE5RVUZOTEVkQlFVY3NZMEZCWXl4RFFVRkRMRU5CUVVNc1EwRkJReXhEUVVGRE8wbEJRemRDTEU5QlFVOHNUVUZCVFN4RFFVRkRPMEZCUTJoQ0xFTkJRVU1pTENKemIzVnlZMlZ6UTI5dWRHVnVkQ0k2V3lKcGJYQnZjblFnS2lCaGN5Qm5jbTlySUdaeWIyMGdKMlJoZEdGbmNtOXJMV0Z3YVM5bmNtOXJKenRjYm1sdGNHOXlkQ0FxSUdGeklIVnBJR1p5YjIwZ0oyUmhkR0ZuY205ckxXRndhUzkxYVNjN1hHNXBiWEJ2Y25RZ0tpQmhjeUJFUnlCbWNtOXRJQ2RrWVhSaFozSnZheTFoY0drdlpHY25PMXh1YVcxd2IzSjBJSGQxSUdaeWIyMGdKM2QxSnp0Y2JseHVhVzF3YjNKMElIdFdaV04wYjNKOUlHWnliMjBnSjBCa1lYUmhaM0p2YXkxc2FXSnlZWEpwWlhNdmRYUnBiSE12YzNKakwzUjVjR1V0WkdWamJHRnlZWFJwYjI1ekp6dGNibWx0Y0c5eWRDQjdkbVZqZEc5eVRHVnVaM1JvTENCMlpXTjBiM0pFYjNSUWNtOWtkV04wZlNCbWNtOXRJQ2RBWkdGMFlXZHliMnN0YkdsaWNtRnlhV1Z6TDNWMGFXeHpMM055WXk5MlpXTjBiM0l0YjNCbGNtRjBhVzl1Y3ljN1hHNXBiWEJ2Y25RZ2UxTmxjVkJoYkdWMGRHVjlJR1p5YjIwZ0p5NHVMM05sY1Mxd1lXeGxkSFJsY3ljN1hHNXBiWEJ2Y25RZ2UwRnRhVzV2WVdOcFpITXNJRUZ0YVc1dllXTnBaSE5RWVd4bGRIUmxjMzBnWm5KdmJTQW5MaTR2WVcxcGJtOWhZMmxrY3ljN1hHNXBiWEJ2Y25RZ2UwNTFZMnhsYjNScFpHVnpMQ0JPZFdOc1pXOTBhV1JsYzFCaGJHVjBkR1Z6ZlNCbWNtOXRJQ2N1TGk5dWRXTnNaVzkwYVdSbGN5YzdYRzVwYlhCdmNuUWdlMVZ1YTI1dmQyNVRaWEZRWVd4bGRIUmxjMzBnWm5KdmJTQW5MaTR2ZFc1cmJtOTNiaWM3WEc1cGJYQnZjblFnZTFWdWFYUnpTR0Z1Wkd4bGNuMGdabkp2YlNBbkxpNHZkWFJwYkhNdmRXNXBkSE10YUdGdVpHeGxjaWM3WEc1Y2JseHVMeW9xSUdWdWRXMGdkSGx3WlNCMGJ5QnphVzF3YkdsbWVTQnpaWFIwYVc1bklGd2lkWE5sY2kxbWNtbGxibVJzZVZ3aUlHNXZkR0YwYVc5dUlHbG1JRzVsWTJWemMyRnllU0FxTDF4dVpYaHdiM0owSUdOdmJuTjBJR1Z1ZFcwZ1RrOVVRVlJKVDA0Z2UxeHVJQ0JHUVZOVVFTQTlJQ2RtWVhOMFlTY3NYRzRnSUZORlVFRlNRVlJQVWlBOUlDZHpaWEJoY21GMGIzSW5MRnh1SUNCSVJVeE5JRDBnSjJobGJHMG5MRnh1ZlZ4dVhHNWxlSEJ2Y25RZ1kyOXVjM1FnWlc1MWJTQkJURWxIVGsxRlRsUWdlMXh1SUNCVFJWRmZUVk5CSUQwZ0oxTkZVUzVOVTBFbkxGeHVJQ0JUUlZFZ1BTQW5VMFZSSnl4Y2JuMWNibHh1Wlhod2IzSjBJR052Ym5OMElHVnVkVzBnUVV4UVNFRkNSVlFnZTF4dUlDQkVUa0VnUFNBblJFNUJKeXhjYmlBZ1VrNUJJRDBnSjFKT1FTY3NYRzRnSUZCVUlEMGdKMUJVSnl4Y2JpQWdWVTRnUFNBblZVNG5MRnh1ZlZ4dVhHNWxlSEJ2Y25RZ1kyOXVjM1FnWlc1MWJTQlVRVWRUSUh0Y2JpQWdZV3hwWjI1bFpDQTlJQ2RoYkdsbmJtVmtKeXhjYmlBZ1lXeHdhR0ZpWlhRZ1BTQW5ZV3h3YUdGaVpYUW5MRnh1SUNCaGJIQm9ZV0psZEZOcGVtVWdQU0FuTG1Gc2NHaGhZbVYwVTJsNlpTY3NYRzRnSUdGc2NHaGhZbVYwU1hOTmRXeDBhV05vWVhJZ1BTQW5MbUZzY0doaFltVjBTWE5OZFd4MGFXTm9ZWEluTEZ4dUlDQnpaWEJoY21GMGIzSWdQU0FuYzJWd1lYSmhkRzl5Snl4Y2JuMDdYRzVjYm1WNGNHOXlkQ0IwZVhCbElGTmxjVU52YkZOMFlYUnpJRDBnZXlCbWNtVnhPaUJOYjI1dmJXVnlSbkpsY1hNc0lITmhiV1ZNWlc1bmRHZzZJR0p2YjJ4bFlXNGdmVnh1Wlhod2IzSjBJSFI1Y0dVZ1UzQnNhWFIwWlhKR2RXNWpJRDBnS0hObGNUb2djM1J5YVc1bktTQTlQaUJ6ZEhKcGJtZGJYVHRjYm1WNGNHOXlkQ0IwZVhCbElFMXZibTl0WlhKR2NtVnhjeUE5SUhzZ1cyMDZJSE4wY21sdVoxMDZJRzUxYldKbGNpQjlPMXh1WEc0dktpb2dVM1JoZEhNZ2IyWWdjMlZ4ZFdWdVkyVnpJSGRwZEdnZ2MzQmxZMmxtYVdWa0lITndiR2wwZEdWeUlHWjFibU1zSUhKbGRIVnlibk1nZXlCbWNtVnhMQ0J6WVcxbFRHVnVaM1JvSUgwdVhHNGdLaUJBY0dGeVlXMGdlMFJITGtOdmJIVnRibjBnYzJWeFEyOXNYRzRnS2lCQWNHRnlZVzBnZTI1MWJXSmxjbjBnYldsdVRHVnVaM1JvWEc0Z0tpQkFjR0Z5WVcwZ2UxTndiR2wwZEdWeVJuVnVZMzBnYzNCc2FYUjBaWEpjYmlBcUlFQnlaWFIxY200Z2V5QlRaWEZEYjJ4VGRHRjBjeUI5TENCellXMWxUR1Z1WjNSb09pQmliMjlzWldGdUlIMGdjM1JoZEhNZ2IyWWdZMjlzZFcxdUlITmxjWFZsYm1ObGMxeHVJQ292WEc1bGVIQnZjblFnWm5WdVkzUnBiMjRnWjJWMFUzUmhkSE1vYzJWeFEyOXNPaUJFUnk1RGIyeDFiVzRzSUcxcGJreGxibWQwYURvZ2JuVnRZbVZ5TENCemNHeHBkSFJsY2pvZ1UzQnNhWFIwWlhKR2RXNWpLVG9nVTJWeFEyOXNVM1JoZEhNZ2UxeHVJQ0JqYjI1emRDQm1jbVZ4T2lCN0lGdHRPaUJ6ZEhKcGJtZGRPaUJ1ZFcxaVpYSWdmU0E5SUh0OU8xeHVJQ0JzWlhRZ2MyRnRaVXhsYm1kMGFDQTlJSFJ5ZFdVN1hHNGdJR3hsZENCbWFYSnpkRXhsYm1kMGFDQTlJRzUxYkd3N1hHNWNiaUFnWm05eUlDaGpiMjV6ZENCelpYRWdiMllnYzJWeFEyOXNMbU5oZEdWbmIzSnBaWE1wSUh0Y2JpQWdJQ0JqYjI1emRDQnRVMlZ4SUQwZ2MzQnNhWFIwWlhJb2MyVnhLVHRjYmx4dUlDQWdJR2xtSUNobWFYSnpkRXhsYm1kMGFDQTlQU0J1ZFd4c0tWeHVJQ0FnSUNBZ1ptbHljM1JNWlc1bmRHZ2dQU0J0VTJWeExteGxibWQwYUR0Y2JpQWdJQ0JsYkhObElHbG1JQ2h0VTJWeExteGxibWQwYUNBaFBUMGdabWx5YzNSTVpXNW5kR2dwWEc0Z0lDQWdJQ0J6WVcxbFRHVnVaM1JvSUQwZ1ptRnNjMlU3WEc1Y2JpQWdJQ0JwWmlBb2JWTmxjUzVzWlc1bmRHZ2dQajBnYldsdVRHVnVaM1JvS1NCN1hHNGdJQ0FnSUNCbWIzSWdLR052Ym5OMElHMGdiMllnYlZObGNTa2dlMXh1SUNBZ0lDQWdJQ0JwWmlBb0lTaHRJR2x1SUdaeVpYRXBLVnh1SUNBZ0lDQWdJQ0FnSUdaeVpYRmJiVjBnUFNBd08xeHVJQ0FnSUNBZ0lDQm1jbVZ4VzIxZElDczlJREU3WEc0Z0lDQWdJQ0I5WEc0Z0lDQWdmVnh1SUNCOVhHNGdJSEpsZEhWeWJpQjdabkpsY1RvZ1puSmxjU3dnYzJGdFpVeGxibWQwYURvZ2MyRnRaVXhsYm1kMGFIMDdYRzU5WEc1Y2JtVjRjRzl5ZENCamIyNXpkQ0J0YjI1dmJXVnlVbVU2SUZKbFowVjRjQ0E5SUM5Y1hGc29YRngzS3lsY1hGMThLRnhjZHlsOEtDMHBMMmM3WEc1Y2JpOHFLaUJUY0d4cGRDQnpaWEYxWlc1alpTQm1iM0lnYzJsdVoyeGxJR05vWVhKaFkzUmxjaUJ0YjI1dmJXVnljeXdnYzNGMVlYSmxJR0p5WVdOclpYUnpJRzExYkhScFkyaGhjaUJ0YjI1dmJXVnlJRzVoYldWeklHOXlJR2RoY0NCemVXMWliMnd1WEc0Z0tpQkFjR0Z5WVcwZ2UyRnVlWDBnYzJWeElHOWlhbVZqZENCM2FYUm9JSE5sY1hWbGJtTmxYRzRnS2lCQWNtVjBkWEp1SUh0emRISnBibWRiWFgwZ1lYSnlZWGtnYjJZZ2JXOXViMjFsY25OY2JpQXFMMXh1Wlhod2IzSjBJR1oxYm1OMGFXOXVJSE53YkdsMGRHVnlRWE5HWVhOMFlTaHpaWEU2SUdGdWVTazZJSE4wY21sdVoxdGRJSHRjYmlBZ2NtVjBkWEp1SUhkMVBGSmxaMFY0Y0UxaGRHTm9RWEp5WVhrK0tITmxjUzUwYjFOMGNtbHVaeWdwTG0xaGRHTm9RV3hzS0cxdmJtOXRaWEpTWlNrcFhHNGdJQ0FnTG0xaGNDZ29iV0U2SUZKbFowVjRjRTFoZEdOb1FYSnlZWGtwSUQwK0lIdGNiaUFnSUNBZ0lHeGxkQ0J0VW1Wek9pQnpkSEpwYm1jN1hHNGdJQ0FnSUNCamIyNXpkQ0J0T2lCemRISnBibWNnUFNCdFlWc3dYVHRjYmlBZ0lDQWdJR2xtSUNodExteGxibWQwYUNBK0lERXBJSHRjYmlBZ0lDQWdJQ0FnYlZKbGN5QTlJRzFoV3pGZE8xeHVJQ0FnSUNBZ2ZTQmxiSE5sSUh0Y2JpQWdJQ0FnSUNBZ2JWSmxjeUE5SUcwN1hHNGdJQ0FnSUNCOVhHNGdJQ0FnSUNCeVpYUjFjbTRnYlZKbGN6dGNiaUFnSUNCOUtTNTBiMEZ5Y21GNUtDazdYRzU5WEc1Y2JpOHFLaUJIWlhSeklHMWxkR2h2WkNCMGJ5QnpjR3hwZENCelpYRjFaVzVqWlNCaWVTQnpaWEJoY21GMGIzSmNiaUFxSUVCd1lYSmhiU0I3YzNSeWFXNW5mU0J6WlhCaGNtRjBiM0pjYmlBcUlFQndZWEpoYlNCc2FXMXBkRnh1SUNvZ1FISmxkSFZ5YmlCN1UzQnNhWFIwWlhKR2RXNWpmVnh1SUNvdlhHNWxlSEJ2Y25RZ1puVnVZM1JwYjI0Z1oyVjBVM0JzYVhSMFpYSlhhWFJvVTJWd1lYSmhkRzl5S0hObGNHRnlZWFJ2Y2pvZ2MzUnlhVzVuTENCc2FXMXBkRG9nYm5WdFltVnlJSHdnZFc1a1pXWnBibVZrSUQwZ2RXNWtaV1pwYm1Wa0tUb2dVM0JzYVhSMFpYSkdkVzVqSUh0Y2JpQWdjbVYwZFhKdUlDaHpaWEU2SUhOMGNtbHVaeWtnUFQ0Z2UxeHVJQ0FnSUhKbGRIVnliaUJ6WlhFdWMzQnNhWFFvYzJWd1lYSmhkRzl5TENCc2FXMXBkQ2s3WEc0Z0lIMDdYRzU5WEc1Y2JtTnZibk4wSUdobGJHMVNaVG9nVW1WblJYaHdJRDBnTHloUVJWQlVTVVJGTVh4RVRrRXhmRkpPUVRFcFhGeDdLRnRlZlYwcktYMHZaenRjYm1OdmJuTjBJR2hsYkcxUWNERlNaVG9nVW1WblJYaHdJRDBnTDF4Y1d5aGJYbHhjVzF4Y1hWMHJLVjB2Wnp0Y2JseHVMeW9xSUZOd2JHbDBjeUJJWld4dElITjBjbWx1WnlCMGJ5QnRiMjV2YldWeWN5d2dZblYwSUdSdlpYTWdibTkwSUhKbGNHeGhZMlVnYlc5dWIyMWxjaUJ1WVcxbGN5QjBieUJ2ZEdobGNpQnViM1JoZEdsdmJpQW9aUzVuTGlCbWIzSWdVazVCS1M1Y2JpQXFJRTl1YkhrZ1ptOXlJR3hwYm1WaGNpQndiMng1YldWeWN5d2daRzlsY3lCdWIzUWdjM0JzYVhRZ1VrNUJJR1p2Y2lCeWFXSnZjMlVnWVc1a0lIQm9iM053YUdGMFpTQnRiMjV2YldWeWN5NWNiaUFxSUVCd1lYSmhiU0I3YzNSeWFXNW5mU0J6WlhFZ1UyOTFjbU5sSUhOMGNtbHVaeUJ2WmlCSVJVeE5JRzV2ZEdGMGFXOXVYRzRnS2lCQWNtVjBkWEp1SUh0emRISnBibWRiWFgxY2JpQXFMMXh1Wlhod2IzSjBJR1oxYm1OMGFXOXVJSE53YkdsMGRHVnlRWE5JWld4dEtITmxjVG9nWVc1NUtUb2djM1J5YVc1blcxMGdlMXh1SUNCb1pXeHRVbVV1YkdGemRFbHVaR1Y0SUQwZ01EdGNiaUFnWTI5dWMzUWdaV0U2SUZKbFowVjRjRVY0WldOQmNuSmhlU0I4SUc1MWJHd2dQU0JvWld4dFVtVXVaWGhsWXloelpYRXVkRzlUZEhKcGJtY29LU2s3WEc0Z0lHTnZibk4wSUdsdVUyVnhPaUJ6ZEhKcGJtY2dmQ0J1ZFd4c0lEMGdaV0VnUHlCbFlWc3lYU0E2SUc1MWJHdzdYRzVjYmlBZ1kyOXVjM1FnYlcxUWIzTjBVSEp2WTJWemN5QTlJQ2h0YlRvZ2MzUnlhVzVuS1RvZ2MzUnlhVzVuSUQwK0lIdGNiaUFnSUNCb1pXeHRVSEF4VW1VdWJHRnpkRWx1WkdWNElEMGdNRHRjYmlBZ0lDQmpiMjV6ZENCd2NERk5JRDBnYUdWc2JWQndNVkpsTG1WNFpXTW9iVzBwTzF4dUlDQWdJR2xtSUNod2NERk5JQ1ltSUhCd01VMHViR1Z1WjNSb0lENDlJRElwWEc0Z0lDQWdJQ0J5WlhSMWNtNGdjSEF4VFZzeFhUdGNiaUFnSUNCbGJITmxYRzRnSUNBZ0lDQnlaWFIxY200Z2JXMDdYRzRnSUgwN1hHNWNiaUFnWTI5dWMzUWdiVzFNYVhOME9pQnpkSEpwYm1kYlhTQTlJR2x1VTJWeElEOGdhVzVUWlhFdWMzQnNhWFFvSnk0bktTQTZJRnRkTzF4dUlDQnlaWFIxY200Z2JXMU1hWE4wTG0xaGNDaHRiVkJ2YzNSUWNtOWpaWE56S1R0Y2JuMWNibHh1THlvcUlFZGxkQ0J6Y0d4cGRIUmxjaUJ0WlhSb2IyUWdkRzhnYzNCc2FYUWdjMlZ4ZFdWdVkyVnpJSFJ2SUcxdmJtOXRaWEp6WEc0Z0tpQkFjR0Z5WVcwZ2UzTjBjbWx1WjMwZ2RXNXBkSE5jYmlBcUlFQndZWEpoYlNCN2MzUnlhVzVuZlNCelpYQmhjbUYwYjNKY2JpQXFJRUJ3WVhKaGJTQnNhVzFwZEZ4dUlDb2dRSEpsZEhWeWJpQjdVM0JzYVhSMFpYSkdkVzVqZlZ4dUlDb3ZYRzVsZUhCdmNuUWdablZ1WTNScGIyNGdaMlYwVTNCc2FYUjBaWElvZFc1cGRITTZJSE4wY21sdVp5d2djMlZ3WVhKaGRHOXlPaUJ6ZEhKcGJtY3NJR3hwYldsME9pQnVkVzFpWlhJZ2ZDQjFibVJsWm1sdVpXUWdQU0IxYm1SbFptbHVaV1FwT2lCVGNHeHBkSFJsY2taMWJtTWdlMXh1SUNCcFppQW9kVzVwZEhNdWRHOU1iM2RsY2tOaGMyVW9LUzV6ZEdGeWRITlhhWFJvS0U1UFZFRlVTVTlPTGtaQlUxUkJLU2xjYmlBZ0lDQnlaWFIxY200Z2MzQnNhWFIwWlhKQmMwWmhjM1JoTzF4dUlDQmxiSE5sSUdsbUlDaDFibWwwY3k1MGIweHZkMlZ5UTJGelpTZ3BMbk4wWVhKMGMxZHBkR2dvVGs5VVFWUkpUMDR1VTBWUVFWSkJWRTlTS1NsY2JpQWdJQ0J5WlhSMWNtNGdaMlYwVTNCc2FYUjBaWEpYYVhSb1UyVndZWEpoZEc5eUtITmxjR0Z5WVhSdmNpd2diR2x0YVhRcE8xeHVJQ0JsYkhObElHbG1JQ2gxYm1sMGN5NTBiMHh2ZDJWeVEyRnpaU2dwTG5OMFlYSjBjMWRwZEdnb1RrOVVRVlJKVDA0dVNFVk1UU2twWEc0Z0lDQWdjbVYwZFhKdUlITndiR2wwZEdWeVFYTklaV3h0TzF4dUlDQmxiSE5sWEc0Z0lDQWdkR2h5YjNjZ2JtVjNJRVZ5Y205eUtHQlZibVY0Y0dWamRHVmtJSFZ1YVhSeklDUjdkVzVwZEhOOUlDNWdLVHRjYmx4dUlDQXZMeUJVVDBSUE9pQlRjR3hwZEhSbGNpQm1iM0lnU0VWTVRWeHVmVnh1WEc0dktpb2dSMlZ1WlhKaGRHVWdjM0JzYVhSMFpYSWdablZ1WTNScGIyNGdabTl5SUhObGNYVmxibU5sSUdOdmJIVnRibHh1SUNvZ1FIQmhjbUZ0SUh0RVJ5NURiMngxYlc1OUlHTnZiRnh1SUNvZ1FISmxkSFZ5YmlCN1UzQnNhWFIwWlhKR2RXNWpmU0JUY0d4cGRIUmxjaUJtZFc1amRHbHZibHh1SUNvdlhHNWxlSEJ2Y25RZ1puVnVZM1JwYjI0Z1oyVjBVM0JzYVhSMFpYSkdiM0pEYjJ4MWJXNG9ZMjlzT2lCRVJ5NURiMngxYlc0cE9pQlRjR3hwZEhSbGNrWjFibU1nZTF4dUlDQnBaaUFvWTI5c0xuTmxiVlI1Y0dVZ0lUMDlJRVJITGxORlRWUlpVRVV1VFVGRFVrOU5UMHhGUTFWTVJTbGNiaUFnSUNCMGFISnZkeUJ1WlhjZ1JYSnliM0lvWUVkbGRDQnpjR3hwZEhSbGNpQm1iM0lnYzJWdFZIbHdaU0JjSWlSN1JFY3VVMFZOVkZsUVJTNU5RVU5TVDAxUFRFVkRWVXhGZlZ3aUlHOXViSGt1WUNrN1hHNWNiaUFnWTI5dWMzUWdkVzVwZEhNZ1BTQmpiMnd1WjJWMFZHRm5LRVJITGxSQlIxTXVWVTVKVkZNcE8xeHVJQ0JqYjI1emRDQnpaWEJoY21GMGIzSWdQU0JqYjJ3dVoyVjBWR0ZuS0ZSQlIxTXVjMlZ3WVhKaGRHOXlLVHRjYmlBZ2NtVjBkWEp1SUdkbGRGTndiR2wwZEdWeUtIVnVhWFJ6TENCelpYQmhjbUYwYjNJcE8xeHVmVnh1WEc1amIyNXpkQ0JzYjI1blRXOXViMjFsY2xCaGNuUlNaVG9nVW1WblJYaHdJRDBnTHloY1hIY3JLUzluTzF4dVhHNHZLaW9nUTI5dWRtVnlkQ0JzYjI1bklHMXZibTl0WlhJZ2JtRnRaWE1nZEc4Z2MyaHZjblFnYjI1bGN5QXFMMXh1Wlhod2IzSjBJR1oxYm1OMGFXOXVJRzF2Ym05dFpYSlViMU5vYjNKMEtHRnRhVzV2T2lCemRISnBibWNzSUcxaGVFeGxibWQwYUU5bVRXOXViMjFsY2pvZ2JuVnRZbVZ5S1RvZ2MzUnlhVzVuSUh0Y2JpQWdZMjl1YzNRZ2MyaHZjblJCYldsdWIwMWhkR05vT2lCU1pXZEZlSEJOWVhSamFFRnljbUY1SUh3Z2JuVnNiQ0E5SUdGdGFXNXZMbTFoZEdOb0tHeHZibWROYjI1dmJXVnlVR0Z5ZEZKbEtUdGNiaUFnWTI5dWMzUWdibVZsWkVGa1pFUnZkSE02SUdKdmIyeGxZVzRnUFNCaGJXbHVieTVzWlc1bmRHZ2dQaUJ0WVhoTVpXNW5kR2hQWmsxdmJtOXRaWElnZkh3Z0tITm9iM0owUVcxcGJtOU5ZWFJqYUQ4dWJHVnVaM1JvSUQ4L0lEQXBJRDRnTVR0Y2JpQWdZMjl1YzNRZ2MyaHZjblJCYldsdWJ5QTlJSE5vYjNKMFFXMXBibTlOWVhSamFEOHVXekJkSUQ4L0lDY2dKenRjYmlBZ2NtVjBkWEp1SUNGdVpXVmtRV1JrUkc5MGN5QS9JSE5vYjNKMFFXMXBibThnT2lCemFHOXlkRUZ0YVc1dkxuTjFZbk4wY21sdVp5Z3dMQ0J0WVhoTVpXNW5kR2hQWmsxdmJtOXRaWElwSUNzZ0orS0FwaWM3WEc1OVhHNWNiaThxS2lBcUwxeHVaWGh3YjNKMElHWjFibU4wYVc5dUlHZGxkRUZzY0doaFltVjBLR0ZzY0doaFltVjBPaUJCVEZCSVFVSkZWQ2s2SUZObGREeHpkSEpwYm1jK0lIdGNiaUFnYzNkcGRHTm9JQ2hoYkhCb1lXSmxkQ2tnZTF4dUlDQmpZWE5sSUVGTVVFaEJRa1ZVTGtST1FUcGNiaUFnSUNCeVpYUjFjbTRnVlc1cGRITklZVzVrYkdWeUxrUnVZVVpoYzNSaFFXeHdhR0ZpWlhRN1hHNGdJR05oYzJVZ1FVeFFTRUZDUlZRdVVrNUJPbHh1SUNBZ0lISmxkSFZ5YmlCVmJtbDBjMGhoYm1Sc1pYSXVVbTVoUm1GemRHRkJiSEJvWVdKbGREdGNiaUFnWTJGelpTQkJURkJJUVVKRlZDNVFWRHBjYmlBZ0lDQnlaWFIxY200Z1ZXNXBkSE5JWVc1a2JHVnlMbEJsY0hScFpHVkdZWE4wWVVGc2NHaGhZbVYwTzF4dUlDQmtaV1poZFd4ME9seHVJQ0FnSUhSb2NtOTNJRzVsZHlCRmNuSnZjaWhnVlc1emRYQndiM0owWldRZ1lXeHdhR0ZpWlhRZ0p5UjdZV3h3YUdGaVpYUjlKeTVnS1R0Y2JpQWdmVnh1ZlZ4dVhHNHZLaW9nUTJGc1kzVnNZWFJsSUhOcGJXbHNZWEpwZEhrZ2FXNGdZM1Z5Y21WdWRDQnpaWEYxWlc1alpTQmhibVFnWVd4d2FHRmlaWFF1WEc0Z0tpQkFjR0Z5WVcwZ2UwMXZibTl0WlhKR2NtVnhjMzBnWm5KbGNWeHVJQ29nUUhCaGNtRnRJSHRUWlhROGMzUnlhVzVuUG4wZ1lXeHdhR0ZpWlhSY2JpQXFJRUJ3WVhKaGJTQjdjM1J5YVc1bmZTQm5ZWEJUZVcxaWIyeGNiaUFxSUVCeVpYUjFjbTRnZTI1MWJXSmxjbjBnUTI5emFXNWxJSE5wYldsc1lYSnBkSGxjYmlBcUwxeHVaWGh3YjNKMElHWjFibU4wYVc5dUlHZGxkRUZzY0doaFltVjBVMmx0YVd4aGNtbDBlU2htY21WeE9pQk5iMjV2YldWeVJuSmxjWE1zSUdGc2NHaGhZbVYwT2lCVFpYUThjM1J5YVc1blBpd2daMkZ3VTNsdFltOXNPaUJ6ZEhKcGJtY2dQU0FuTFNjcE9pQnVkVzFpWlhJZ2UxeHVJQ0JqYjI1emRDQnJaWGx6SUQwZ2JtVjNJRk5sZER4emRISnBibWMrS0ZzdUxpNXVaWGNnVTJWMEtFOWlhbVZqZEM1clpYbHpLR1p5WlhFcEtTd2dMaTR1WVd4d2FHRmlaWFJkS1R0Y2JpQWdhMlY1Y3k1a1pXeGxkR1VvWjJGd1UzbHRZbTlzS1R0Y2JseHVJQ0JqYjI1emRDQm1jbVZ4UVRvZ2JuVnRZbVZ5VzEwZ1BTQmJYVHRjYmlBZ1kyOXVjM1FnWVd4d2FHRmlaWFJCT2lCdWRXMWlaWEpiWFNBOUlGdGRPMXh1SUNCbWIzSWdLR052Ym5OMElHMGdiMllnYTJWNWN5a2dlMXh1SUNBZ0lHWnlaWEZCTG5CMWMyZ29iU0JwYmlCbWNtVnhJRDhnWm5KbGNWdHRYU0E2SURBcE8xeHVJQ0FnSUdGc2NHaGhZbVYwUVM1d2RYTm9LR0ZzY0doaFltVjBMbWhoY3lodEtTQS9JREVnT2lBd0tUdGNiaUFnZlZ4dUlDQXZLaUJVYUdWeVpTQjNaWEpsSUdFZ1ptVjNJR2xrWldGek9pQmphR2t0YzNGMVlYSmxaQ3dnY0dWaGNuTnZiaUJqYjNKeVpXeGhkR2x2YmlBb2RtRnlhV0Z1WTJVL0tTd2djMk5oYkdGeUlIQnliMlIxWTNRZ0tpOWNiaUFnWTI5dWMzUWdabkpsY1ZZNklGWmxZM1J2Y2lBOUlHNWxkeUJXWldOMGIzSW9abkpsY1VFcE8xeHVJQ0JqYjI1emRDQmhiSEJvWVdKbGRGWTZJRlpsWTNSdmNpQTlJRzVsZHlCV1pXTjBiM0lvWVd4d2FHRmlaWFJCS1R0Y2JpQWdjbVYwZFhKdUlIWmxZM1J2Y2tSdmRGQnliMlIxWTNRb1puSmxjVllzSUdGc2NHaGhZbVYwVmlrZ0x5QW9kbVZqZEc5eVRHVnVaM1JvS0daeVpYRldLU0FxSUhabFkzUnZja3hsYm1kMGFDaGhiSEJvWVdKbGRGWXBLVHRjYm4xY2JseHVaWGh3YjNKMElHWjFibU4wYVc5dUlHUmxkR1ZqZEVGc2NHaGhZbVYwS0hOMFlYUnpPaUJUWlhGRGIyeFRkR0YwY3lrNklITjBjbWx1WnlCN1hHNGdJR052Ym5OMElHRnNjR2hoWW1WMFEyRnVaR2xrWVhSbGN6b2dXM04wY21sdVp5d2dVMlYwUEhOMGNtbHVaejVkVzEwZ1BTQmJYRzRnSUNBZ1cwRk1VRWhCUWtWVUxsQlVMQ0JWYm1sMGMwaGhibVJzWlhJdVVHVndkR2xrWlVaaGMzUmhRV3h3YUdGaVpYUmRMRnh1SUNBZ0lGdEJURkJJUVVKRlZDNUVUa0VzSUZWdWFYUnpTR0Z1Wkd4bGNpNUVibUZHWVhOMFlVRnNjR2hoWW1WMFhTeGNiaUFnSUNCYlFVeFFTRUZDUlZRdVVrNUJMQ0JWYm1sMGMwaGhibVJzWlhJdVVtNWhSbUZ6ZEdGQmJIQm9ZV0psZEYwc1hHNGdJRjA3WEc1Y2JpQWdMeThnUTJGc1kzVnNZWFJsSUd4cGEyVnNhV2h2YjJSeklHWnZjaUJoYkhCb1lXSmxkRjlqWVc1a2FXUmhkR1Z6WEc0Z0lHTnZibk4wSUdGc2NHaGhZbVYwUTJGdVpHbGtZWFJsYzFOcGJUb2diblZ0WW1WeVcxMGdQU0JoYkhCb1lXSmxkRU5oYm1ScFpHRjBaWE11YldGd0tGeHVJQ0FnSUNoaktTQTlQaUJuWlhSQmJIQm9ZV0psZEZOcGJXbHNZWEpwZEhrb2MzUmhkSE11Wm5KbGNTd2dZMXN4WFNrcE8xeHVJQ0JqYjI1emRDQnRZWGhEYjNNZ1BTQk5ZWFJvTG0xaGVDZ3VMaTVoYkhCb1lXSmxkRU5oYm1ScFpHRjBaWE5UYVcwcE8xeHVJQ0JqYjI1emRDQmhiSEJvWVdKbGRDQTlJRzFoZUVOdmN5QStJREF1TmpVZ1B5QmhiSEJvWVdKbGRFTmhibVJwWkdGMFpYTmJZV3h3YUdGaVpYUkRZVzVrYVdSaGRHVnpVMmx0TG1sdVpHVjRUMllvYldGNFEyOXpLVjFiTUYwZ09pQW5WVTRuTzF4dUlDQnlaWFIxY200Z1lXeHdhR0ZpWlhRN1hHNTlYRzVjYmk4cUtpQlRaV3hsWTNSeklHRWdjM1ZwZEdGaWJHVWdjR0ZzWlhSMFpTQmlZWE5sWkNCdmJpQmpiMngxYlc0Z1pHRjBZVnh1SUNvZ1FIQmhjbUZ0SUh0RVJ5NURiMngxYlc1OUlITmxjVU52YkNCRGIyeDFiVzRnZEc4Z2JHOXZheUJtYjNJZ1lTQndZV3hsZEhSbFhHNGdLaUJBY0dGeVlXMGdlMjUxYldKbGNuMGdJRzFwYmt4bGJtZDBhQ0J0YVc1cGJYVnRJR3hsYm1kMGFDQnZaaUJ6WlhGMVpXNWpaU0IwYnlCa1pYUmxZM1FnY0dGc1pYUjBaU0FvWlcxd2RIa2djM1J5YVc1bmN5QmhjbVVnWVd4c2IzZGxaQ2xjYmlBcUlFQnlaWFIxY200Z2UxTmxjVkJoYkdWMGRHVjlJRkJoYkdWMGRHVWdZMjl5Y21WemNHOXVaR2x1WnlCMGJ5QjBhR1VnWVd4d2FHRmlaWFFnYjJZZ2RHaGxJSE5sY1hWbGJtTmxjeUJwYmlCMGFHVWdZMjlzZFcxdVhHNGdLaTljYm1WNGNHOXlkQ0JtZFc1amRHbHZiaUJ3YVdOclZYQlFZV3hsZEhSbEtITmxjVU52YkRvZ1JFY3VRMjlzZFcxdUxDQnRhVzVNWlc1bmRHZzZJRzUxYldKbGNpQTlJRFVwT2lCVFpYRlFZV3hsZEhSbElIdGNiaUFnYkdWMElHRnNjR2hoWW1WME9pQnpkSEpwYm1jN1hHNGdJR2xtSUNoelpYRkRiMnd1YzJWdFZIbHdaU0E5UFNCRVJ5NVRSVTFVV1ZCRkxrMUJRMUpQVFU5TVJVTlZURVVwSUh0Y2JpQWdJQ0JqYjI1emRDQjFhRG9nVlc1cGRITklZVzVrYkdWeUlEMGdibVYzSUZWdWFYUnpTR0Z1Wkd4bGNpaHpaWEZEYjJ3cE8xeHVJQ0FnSUdGc2NHaGhZbVYwSUQwZ2RXZ3VZV3h3YUdGaVpYUTdYRzRnSUgwZ1pXeHpaU0I3WEc0Z0lDQWdZMjl1YzNRZ2MzUmhkSE02SUZObGNVTnZiRk4wWVhSeklEMGdaMlYwVTNSaGRITW9jMlZ4UTI5c0xDQnRhVzVNWlc1bmRHZ3NJSE53YkdsMGRHVnlRWE5HWVhOMFlTazdYRzRnSUNBZ1lXeHdhR0ZpWlhRZ1BTQmtaWFJsWTNSQmJIQm9ZV0psZENoemRHRjBjeWs3WEc0Z0lIMWNibHh1SUNCamIyNXpkQ0J5WlhNZ1BTQm5aWFJRWVd4bGRIUmxRbmxVZVhCbEtHRnNjR2hoWW1WMEtUdGNiaUFnY21WMGRYSnVJSEpsY3p0Y2JuMWNibHh1Wlhod2IzSjBJR1oxYm1OMGFXOXVJR2RsZEZCaGJHVjBkR1ZDZVZSNWNHVW9jR0ZzWlhSMFpWUjVjR1U2SUhOMGNtbHVaeWs2SUZObGNWQmhiR1YwZEdVZ2UxeHVJQ0J6ZDJsMFkyZ2dLSEJoYkdWMGRHVlVlWEJsS1NCN1hHNGdJR05oYzJVZ0oxQlVKenBjYmlBZ0lDQnlaWFIxY200Z1FXMXBibTloWTJsa2MxQmhiR1YwZEdWekxrZHliMnRIY205MWNITTdYRzRnSUdOaGMyVWdKMDVVSnpwY2JpQWdZMkZ6WlNBblJFNUJKenBjYmlBZ1kyRnpaU0FuVWs1Qkp6cGNiaUFnSUNCeVpYUjFjbTRnVG5WamJHVnZkR2xrWlhOUVlXeGxkSFJsY3k1RGFISnZiV0YwYjJkeVlXMDdYRzRnSUNBZ0x5OGdiM1JvWlhKY2JpQWdaR1ZtWVhWc2REcGNiaUFnSUNCeVpYUjFjbTRnVlc1cmJtOTNibE5sY1ZCaGJHVjBkR1Z6TGtOdmJHOXlPMXh1SUNCOVhHNTlYRzVjYm1WNGNHOXlkQ0JtZFc1amRHbHZiaUJ3YVdOclZYQlRaWEZEYjJ3b1pHWTZJRVJITGtSaGRHRkdjbUZ0WlNrNklFUkhMa052YkhWdGJpQjhJRzUxYkd3Z2UxeHVJQ0JqYjI1emRDQnpaVzFVZVhCbFEyOXNUR2x6ZENBOUlHUm1MbU52YkhWdGJuTXVZbmxUWlcxVWVYQmxRV3hzS0VSSExsTkZUVlJaVUVVdVRVRkRVazlOVDB4RlExVk1SU2s3WEc0Z0lHeGxkQ0J5WlhORGIydzZJRVJITGtOdmJIVnRiaUI4SUc1MWJHd2dQU0J6WlcxVWVYQmxRMjlzVEdsemRDNW1hVzVrS0NoamIyd3BJRDArSUh0Y2JpQWdJQ0JqYjI1emRDQjFibWwwY3lBOUlHTnZiQzVuWlhSVVlXY29SRWN1VkVGSFV5NVZUa2xVVXlrN1hHNGdJQ0FnY21WMGRYSnVJSFZ1YVhSeklEOGdkVzVwZEhNdWFXNWtaWGhQWmlnblRWTkJKeWtnSVQwOUlDMHhJRG9nWm1Gc2MyVTdYRzRnSUgwcElEOC9JRzUxYkd3N1hHNGdJR2xtSUNnaGNtVnpRMjlzSUNZbUlITmxiVlI1Y0dWRGIyeE1hWE4wTG14bGJtZDBhQ0ErSURBcFhHNGdJQ0FnY21WelEyOXNJRDBnYzJWdFZIbHdaVU52YkV4cGMzUmJNRjA3WEc0Z0lISmxkSFZ5YmlCeVpYTkRiMnc3WEc1OVhHNGlYWDA9IiwiaW1wb3J0ICogYXMgREcgZnJvbSAnZGF0YWdyb2stYXBpL2RnJztcbmltcG9ydCB7IFVuaXRzSGFuZGxlciB9IGZyb20gJy4vdW5pdHMtaGFuZGxlcic7XG5pbXBvcnQgeyBnZXRTcGxpdHRlckZvckNvbHVtbiwgZ2V0U3RhdHMgfSBmcm9tICcuL21hY3JvbW9sZWN1bGUnO1xuLyoqIENsYXNzIGZvciBoYW5kbGluZyBjb252ZXJzaW9uIG9mIG5vdGF0aW9uIHN5c3RlbXMgaW4gTWFjcm9tb2xlY3VsZSBjb2x1bW5zICovXG5leHBvcnQgY2xhc3MgTm90YXRpb25Db252ZXJ0ZXIgZXh0ZW5kcyBVbml0c0hhbmRsZXIge1xuICAgIGdldCBzcGxpdHRlcigpIHtcbiAgICAgICAgaWYgKHRoaXMuX3NwbGl0dGVyID09PSBudWxsKVxuICAgICAgICAgICAgdGhpcy5fc3BsaXR0ZXIgPSBnZXRTcGxpdHRlckZvckNvbHVtbih0aGlzLmNvbHVtbik7XG4gICAgICAgIHJldHVybiB0aGlzLl9zcGxpdHRlcjtcbiAgICB9XG4gICAgdG9GYXN0YSh0YXJnZXROb3RhdGlvbikgeyByZXR1cm4gdGFyZ2V0Tm90YXRpb24gPT09IFwiZmFzdGFcIiAvKiBOT1RBVElPTi5GQVNUQSAqLzsgfVxuICAgIHRvU2VwYXJhdG9yKHRhcmdldE5vdGF0aW9uKSB7IHJldHVybiB0YXJnZXROb3RhdGlvbiA9PT0gXCJzZXBhcmF0b3JcIiAvKiBOT1RBVElPTi5TRVBBUkFUT1IgKi87IH1cbiAgICB0b0hlbG0odGFyZ2V0Tm90YXRpb24pIHsgcmV0dXJuIHRhcmdldE5vdGF0aW9uID09PSBcImhlbG1cIiAvKiBOT1RBVElPTi5IRUxNICovOyB9XG4gICAgLyoqXG4gICAgICogQ29udmVydCBhIE1hY3JvbW9sZWN1bGUgY29sdW1uIGZyb20gRkFTVEEgdG8gU0VQQVJBVE9SIG5vdGF0aW9uXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gc2VwYXJhdG9yICBBIHNwZWNpZmljIHNlcGFyYXRvciB0byBiZSB1c2VkXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGZhc3RhR2FwU3ltYm9sICBHYXAgc3ltYm9sIGluIEZBU1RBLCAnLScgYnkgZGVmYXVsdFxuICAgICAqIEByZXR1cm4ge0RHLkNvbHVtbn0gICAgICAgIEEgbmV3IGNvbHVtbiBpbiBTRVBBUkFUT1Igbm90YXRpb25cbiAgICAgKi9cbiAgICBjb252ZXJ0RmFzdGFUb1NlcGFyYXRvcihzZXBhcmF0b3IsIGZhc3RhR2FwU3ltYm9sID0gbnVsbCkge1xuICAgICAgICBpZiAoZmFzdGFHYXBTeW1ib2wgPT09IG51bGwpXG4gICAgICAgICAgICBmYXN0YUdhcFN5bWJvbCA9IHRoaXMuZGVmYXVsdEdhcFN5bWJvbDtcbiAgICAgICAgY29uc3QgbmV3Q29sdW1uID0gdGhpcy5nZXROZXdDb2x1bW4oXCJzZXBhcmF0b3JcIiAvKiBOT1RBVElPTi5TRVBBUkFUT1IgKi8pO1xuICAgICAgICAvLyBhc3NpZ24gdGhlIHZhbHVlcyB0byB0aGUgbmV3bHkgY3JlYXRlZCBlbXB0eSBjb2x1bW5cbiAgICAgICAgbmV3Q29sdW1uLmluaXQoKGlkeCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgZmFzdGFQb2x5bWVyID0gdGhpcy5jb2x1bW4uZ2V0KGlkeCk7XG4gICAgICAgICAgICBjb25zdCBmYXN0YU1vbm9tZXJzQXJyYXkgPSB0aGlzLnNwbGl0dGVyKGZhc3RhUG9seW1lcik7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGZhc3RhTW9ub21lcnNBcnJheS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGlmIChmYXN0YU1vbm9tZXJzQXJyYXlbaV0gPT09IGZhc3RhR2FwU3ltYm9sKVxuICAgICAgICAgICAgICAgICAgICBmYXN0YU1vbm9tZXJzQXJyYXlbaV0gPSBVbml0c0hhbmRsZXIuX2RlZmF1bHRHYXBTeW1ib2xzRGljdC5TRVBBUkFUT1I7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZmFzdGFNb25vbWVyc0FycmF5LmpvaW4oc2VwYXJhdG9yKTtcbiAgICAgICAgfSk7XG4gICAgICAgIG5ld0NvbHVtbi5zZXRUYWcoREcuVEFHUy5VTklUUywgXCJzZXBhcmF0b3JcIiAvKiBOT1RBVElPTi5TRVBBUkFUT1IgKi8pO1xuICAgICAgICBuZXdDb2x1bW4uc2V0VGFnKFwic2VwYXJhdG9yXCIgLyogVEFHUy5zZXBhcmF0b3IgKi8sIHNlcGFyYXRvcik7XG4gICAgICAgIHJldHVybiBuZXdDb2x1bW47XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgd3JhcHBlciBzdHJpbmdzIGZvciBIRUxNLCBkZXBlbmRpbmcgb24gdGhlIHR5cGUgb2YgdGhlXG4gICAgICogbWFjcm9tb2xlY3VsZSAocGVwdGlkZSwgRE5BLCBSTkEpXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtzdHJpbmdbXX0gQXJyYXkgb2Ygd3JhcHBlcnNcbiAgICAgKi9cbiAgICBnZXRIZWxtV3JhcHBlcnMoKSB7XG4gICAgICAgIGNvbnN0IHByZWZpeCA9ICh0aGlzLmlzRG5hKCkpID8gJ0ROQTF7JyA6XG4gICAgICAgICAgICAodGhpcy5pc1JuYSgpKSA/ICdSTkExeycgOlxuICAgICAgICAgICAgICAgICh0aGlzLmlzUGVwdGlkZSgpKSA/ICdQRVBUSURFMXsnIDpcbiAgICAgICAgICAgICAgICAgICAgJ1Vua25vd24nOyAvLyB0aGlzIGNhc2Ugc2hvdWxkIGJlIGhhbmRsZWQgYXMgZXhjZXB0aW9uYWxcbiAgICAgICAgaWYgKHByZWZpeCA9PT0gJ1Vua25vd24nKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdOZWl0aGVyIHBlcHRpZGUsIG5vciBudWNsZW90aWRlJyk7XG4gICAgICAgIGNvbnN0IHBvc3RmaXggPSAnfSQkJCc7XG4gICAgICAgIGNvbnN0IGxlZnRXcmFwcGVyID0gKHRoaXMuaXNEbmEoKSkgPyAnRCgnIDpcbiAgICAgICAgICAgICh0aGlzLmlzUm5hKCkpID8gJ1IoJyA6ICcnOyAvLyBubyB3cmFwcGVyIGZvciBwZXB0aWRlc1xuICAgICAgICBjb25zdCByaWdodFdyYXBwZXIgPSAodGhpcy5pc0RuYSgpIHx8IHRoaXMuaXNSbmEoKSkgPyAnKVAnIDogJyc7IC8vIG5vIHdyYXBwZXIgZm9yIHBlcHRpZGVzXG4gICAgICAgIHJldHVybiBbcHJlZml4LCBsZWZ0V3JhcHBlciwgcmlnaHRXcmFwcGVyLCBwb3N0Zml4XTtcbiAgICB9XG4gICAgLy8gQSBoZWxwZXIgZnVuY3Rpb24gZm9yIGNvbnZlcnRpbmcgc3RyaW5ncyB0byBIRUxNXG4gICAgY29udmVydFRvSGVsbUhlbHBlcihzb3VyY2VQb2x5bWVyLCBzb3VyY2VHYXBTeW1ib2wsIHByZWZpeCwgbGVmdFdyYXBwZXIsIHJpZ2h0V3JhcHBlciwgcG9zdGZpeCkge1xuICAgICAgICBjb25zdCBtb25vbWVyQXJyYXkgPSB0aGlzLnNwbGl0dGVyKHNvdXJjZVBvbHltZXIpO1xuICAgICAgICBjb25zdCBtb25vbWVySGVsbUFycmF5ID0gbW9ub21lckFycmF5Lm1hcCgobW0pID0+IHtcbiAgICAgICAgICAgIGlmIChtbSA9PT0gc291cmNlR2FwU3ltYm9sKVxuICAgICAgICAgICAgICAgIHJldHVybiBVbml0c0hhbmRsZXIuX2RlZmF1bHRHYXBTeW1ib2xzRGljdC5IRUxNO1xuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIHJldHVybiBgJHtsZWZ0V3JhcHBlcn0ke21tfSR7cmlnaHRXcmFwcGVyfWA7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gYCR7cHJlZml4fSR7bW9ub21lckhlbG1BcnJheS5qb2luKCcuJyl9JHtwb3N0Zml4fWA7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENvbnZlcnQgYSBzdHJpbmcgd2l0aCBTRVBBUkFUT1IvRkFTVEEgbm90YXRpb24gdG8gSEVMTVxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHNvdXJjZVBvbHltZXIgIEEgc3RyaW5nIHRvIGJlIGNvbnZlcnRlZFxuICAgICAqIEBwYXJhbSB7c3RyaW5nIHwgbnVsbH0gc291cmNlR2FwU3ltYm9sICBBbiBvcHRpb25hbCBnYXAgc3ltYm9sLCBzZXQgdG9cbiAgICAgKiBkZWZhdWx0IHZhbHVlcyAoJy0nIGZvciBGQVNUQSBhbmQgJycgZm9yIFNFUEFSQVRPUikgdW5sZXNzIHNwZWNpZmllZFxuICAgICAqIEByZXR1cm4ge3N0cmluZ30gIFRoZSB0YXJnZXQgSEVMTSBzdHJpbmdcbiAgICAgKi9cbiAgICBjb252ZXJ0U3RyaW5nVG9IZWxtKHNvdXJjZVBvbHltZXIsIHNvdXJjZUdhcFN5bWJvbCA9IG51bGwpIHtcbiAgICAgICAgaWYgKHNvdXJjZUdhcFN5bWJvbCA9PT0gbnVsbClcbiAgICAgICAgICAgIHNvdXJjZUdhcFN5bWJvbCA9IHRoaXMuZGVmYXVsdEdhcFN5bWJvbDtcbiAgICAgICAgY29uc3QgW3ByZWZpeCwgbGVmdFdyYXBwZXIsIHJpZ2h0V3JhcHBlciwgcG9zdGZpeF0gPSB0aGlzLmdldEhlbG1XcmFwcGVycygpO1xuICAgICAgICByZXR1cm4gdGhpcy5jb252ZXJ0VG9IZWxtSGVscGVyKHNvdXJjZVBvbHltZXIsIHNvdXJjZUdhcFN5bWJvbCwgcHJlZml4LCBsZWZ0V3JhcHBlciwgcmlnaHRXcmFwcGVyLCBwb3N0Zml4KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ29udmVydCBhIGNvbHVtbiB0byBIRUxNXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZyB8IG51bGx9IHNvdXJjZUdhcFN5bWJvbFxuICAgICAqIEByZXR1cm4ge0RHLkNvbHVtbn1cbiAgICAgKi9cbiAgICBjb252ZXJ0VG9IZWxtKHNvdXJjZUdhcFN5bWJvbCA9IG51bGwpIHtcbiAgICAgICAgaWYgKHNvdXJjZUdhcFN5bWJvbCA9PT0gbnVsbClcbiAgICAgICAgICAgIHNvdXJjZUdhcFN5bWJvbCA9IHRoaXMuZGVmYXVsdEdhcFN5bWJvbDtcbiAgICAgICAgY29uc3QgW3ByZWZpeCwgbGVmdFdyYXBwZXIsIHJpZ2h0V3JhcHBlciwgcG9zdGZpeF0gPSB0aGlzLmdldEhlbG1XcmFwcGVycygpO1xuICAgICAgICBjb25zdCBuZXdDb2x1bW4gPSB0aGlzLmdldE5ld0NvbHVtbihcImhlbG1cIiAvKiBOT1RBVElPTi5IRUxNICovKTtcbiAgICAgICAgLy8gYXNzaWduIHRoZSB2YWx1ZXMgdG8gdGhlIGVtcHR5IGNvbHVtblxuICAgICAgICBuZXdDb2x1bW4uaW5pdCgoaWR4KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBzb3VyY2VQb2x5bWVyID0gdGhpcy5jb2x1bW4uZ2V0KGlkeCk7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jb252ZXJ0VG9IZWxtSGVscGVyKHNvdXJjZVBvbHltZXIsIHNvdXJjZUdhcFN5bWJvbCwgcHJlZml4LCBsZWZ0V3JhcHBlciwgcmlnaHRXcmFwcGVyLCBwb3N0Zml4KTtcbiAgICAgICAgfSk7XG4gICAgICAgIG5ld0NvbHVtbi5zZXRUYWcoREcuVEFHUy5VTklUUywgXCJoZWxtXCIgLyogTk9UQVRJT04uSEVMTSAqLyk7XG4gICAgICAgIHJldHVybiBuZXdDb2x1bW47XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENvbnZlcnQgU0VQQVJBVE9SIGNvbHVtbiB0byBGQVNUQSBub3RhdGlvblxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmcgfCBudWxsfSBmYXN0YUdhcFN5bWJvbCBPcHRpb25hbCBnYXAgc3ltYm9sIGZvciBGQVNUQVxuICAgICAqIEByZXR1cm4ge0RHLkNvbHVtbn0gIENvbnZlcnRlZCBjb2x1bW5cbiAgICAgKi9cbiAgICBjb252ZXJ0U2VwYXJhdG9yVG9GYXN0YShmYXN0YUdhcFN5bWJvbCA9IG51bGwpIHtcbiAgICAgICAgaWYgKGZhc3RhR2FwU3ltYm9sID09PSBudWxsKVxuICAgICAgICAgICAgZmFzdGFHYXBTeW1ib2wgPSBVbml0c0hhbmRsZXIuX2RlZmF1bHRHYXBTeW1ib2xzRGljdC5GQVNUQTtcbiAgICAgICAgY29uc3QgbmV3Q29sdW1uID0gdGhpcy5nZXROZXdDb2x1bW4oXCJmYXN0YVwiIC8qIE5PVEFUSU9OLkZBU1RBICovKTtcbiAgICAgICAgLy8gYXNzaWduIHRoZSB2YWx1ZXMgdG8gdGhlIGVtcHR5IGNvbHVtblxuICAgICAgICBuZXdDb2x1bW4uaW5pdCgoaWR4KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBzZXBhcmF0b3JQb2x5bWVyID0gdGhpcy5jb2x1bW4uZ2V0KGlkeCk7XG4gICAgICAgICAgICAvLyBpdGVtcyBjYW4gYmUgbW9ub21lcnMgb3Igc2VwYXJhdG9yc1xuICAgICAgICAgICAgY29uc3Qgc2VwYXJhdG9ySXRlbXNBcnJheSA9IHRoaXMuc3BsaXR0ZXIoc2VwYXJhdG9yUG9seW1lcik7XG4gICAgICAgICAgICBjb25zdCBmYXN0YU1vbm9tZXJzQXJyYXkgPSBbXTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2VwYXJhdG9ySXRlbXNBcnJheS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGl0ZW0gPSBzZXBhcmF0b3JJdGVtc0FycmF5W2ldO1xuICAgICAgICAgICAgICAgIGlmIChpdGVtLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICBmYXN0YU1vbm9tZXJzQXJyYXkucHVzaChmYXN0YUdhcFN5bWJvbCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGl0ZW0ubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgICAgICAgICAvLyB0aGUgY2FzZSBvZiBhIG11bHRpLWNoYXJhY3RlciBtb25vbWVyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG1vbm9tZXIgPSAnWycgKyBpdGVtICsgJ10nO1xuICAgICAgICAgICAgICAgICAgICBmYXN0YU1vbm9tZXJzQXJyYXkucHVzaChtb25vbWVyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGZhc3RhTW9ub21lcnNBcnJheS5wdXNoKGl0ZW0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBmYXN0YU1vbm9tZXJzQXJyYXkuam9pbignJyk7XG4gICAgICAgIH0pO1xuICAgICAgICBuZXdDb2x1bW4uc2V0VGFnKERHLlRBR1MuVU5JVFMsIFwiZmFzdGFcIiAvKiBOT1RBVElPTi5GQVNUQSAqLyk7XG4gICAgICAgIHJldHVybiBuZXdDb2x1bW47XG4gICAgfVxuICAgIC8qKlxuICAgICAqICBDb252ZXJ0IEhFTE0gY29sdW1uIHRvIEZBU1RBL1NFUEFSQVRPUlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHRndE5vdGF0aW9uICAgIFRhcmdldCBub3RhdGlvbjogRkFTVEEgb3IgU0VQQVJBVE9SXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHRndFNlcGFyYXRvciAgIE9wdGlvbmFsIHRhcmdldCBzZXBhcmF0b3IgKGZvciBIRUxNIC0+XG4gICAgICogQHBhcmFtIHtzdHJpbmcgfCBudWxsfSB0Z3RHYXBTeW1ib2wgICBPcHRpb25hbCB0YXJnZXQgZ2FwIHN5bWJvbFxuICAgICAqIFNFUEFSQVRPUilcbiAgICAgKiBAcmV0dXJuIHtERy5Db2x1bW59IENvbnZlcnRlZCBjb2x1bW5cbiAgICAgKi9cbiAgICBjb252ZXJ0SGVsbSh0Z3ROb3RhdGlvbiwgdGd0U2VwYXJhdG9yLCB0Z3RHYXBTeW1ib2wpIHtcbiAgICAgICAgLy8gVGhpcyBmdW5jdGlvbiBtdXN0IG5vdCBjb250YWluIGNhbGxzIG9mIGlzRG5hKCkgYW5kIGlzUm5hKCksIGZvclxuICAgICAgICAvLyBzb3VyY2UgaGVsbSBjb2x1bW5zIG1heSBjb250YWluIFJOQSwgRE5BIGFuZCBQVCBhY3Jvc3MgZGlmZmVyZW50IHJvd3NcbiAgICAgICAgaWYgKCF0Z3RHYXBTeW1ib2wpIHtcbiAgICAgICAgICAgIHRndEdhcFN5bWJvbCA9ICh0aGlzLnRvRmFzdGEodGd0Tm90YXRpb24pKSA/XG4gICAgICAgICAgICAgICAgVW5pdHNIYW5kbGVyLl9kZWZhdWx0R2FwU3ltYm9sc0RpY3QuRkFTVEEgOlxuICAgICAgICAgICAgICAgIFVuaXRzSGFuZGxlci5fZGVmYXVsdEdhcFN5bWJvbHNEaWN0LlNFUEFSQVRPUjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRndFNlcGFyYXRvcikge1xuICAgICAgICAgICAgdGd0U2VwYXJhdG9yID0gKHRoaXMudG9GYXN0YSh0Z3ROb3RhdGlvbikpID8gJycgOiB0aGlzLnNlcGFyYXRvcjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBoZWxtV3JhcHBlcnNSZSA9IC8oUlxcKHxEXFwofFxcKXxQKS9nO1xuICAgICAgICBjb25zdCBuZXdDb2x1bW4gPSB0aGlzLmdldE5ld0NvbHVtbih0Z3ROb3RhdGlvbik7XG4gICAgICAgIC8vIGFzc2lnbiB0aGUgdmFsdWVzIHRvIHRoZSBlbXB0eSBjb2x1bW5cbiAgICAgICAgbmV3Q29sdW1uLmluaXQoKGlkeCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgaGVsbVBvbHltZXIgPSB0aGlzLmNvbHVtbi5nZXQoaWR4KTtcbiAgICAgICAgICAgIC8vIHdlIGNhbm5vdCB1c2UgaXNEbmEoKSBvciBpc1JuYSgpIGJlY2F1c2Ugc291cmNlIGhlbG0gY29sdW1ucyBjYW5cbiAgICAgICAgICAgIC8vIGNvbnRhaW4gRE5BLCBSTkEgYW5kIFBUIGluIGRpZmZlcmVudCBjZWxscywgc28gdGhlIGNvcnJlc3BvbmRpbmdcbiAgICAgICAgICAgIC8vIHRhZ3MgY2Fubm90IGJlIHNldCBmb3IgdGhlIHdob2xlIGNvbHVtblxuICAgICAgICAgICAgY29uc3QgaXNOdWNsZW90aWRlID0gaGVsbVBvbHltZXIuc3RhcnRzV2l0aCgnRE5BJykgfHwgaGVsbVBvbHltZXIuc3RhcnRzV2l0aCgnUk5BJyk7XG4gICAgICAgICAgICAvLyBpdGVtcyBjYW4gYmUgbW9ub21lcnMgb3IgaGVsbXNcbiAgICAgICAgICAgIGNvbnN0IGhlbG1JdGVtc0FycmF5ID0gdGhpcy5zcGxpdHRlcihoZWxtUG9seW1lcik7XG4gICAgICAgICAgICBjb25zdCB0Z3RNb25vbWVyc0FycmF5ID0gW107XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGhlbG1JdGVtc0FycmF5Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgbGV0IGl0ZW0gPSBoZWxtSXRlbXNBcnJheVtpXTtcbiAgICAgICAgICAgICAgICBpZiAoaXNOdWNsZW90aWRlKVxuICAgICAgICAgICAgICAgICAgICBpdGVtID0gaXRlbS5yZXBsYWNlKGhlbG1XcmFwcGVyc1JlLCAnJyk7XG4gICAgICAgICAgICAgICAgaWYgKGl0ZW0gPT09IFVuaXRzSGFuZGxlci5fZGVmYXVsdEdhcFN5bWJvbHNEaWN0LkhFTE0pIHtcbiAgICAgICAgICAgICAgICAgICAgdGd0TW9ub21lcnNBcnJheS5wdXNoKHRndEdhcFN5bWJvbCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMudG9GYXN0YSh0Z3ROb3RhdGlvbikgJiYgaXRlbS5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIHRoZSBjYXNlIG9mIGEgbXVsdGktY2hhcmFjdGVyIG1vbm9tZXIgY29udmVydGVkIHRvIEZBU1RBXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG1vbm9tZXIgPSAnWycgKyBpdGVtICsgJ10nO1xuICAgICAgICAgICAgICAgICAgICB0Z3RNb25vbWVyc0FycmF5LnB1c2gobW9ub21lcik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0Z3RNb25vbWVyc0FycmF5LnB1c2goaXRlbSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRndE1vbm9tZXJzQXJyYXkuam9pbih0Z3RTZXBhcmF0b3IpO1xuICAgICAgICB9KTtcbiAgICAgICAgLy8gVEFHUy5hbGlnbmVkIGlzIG1hbmRhdG9yeSBmb3IgY29sdW1ucyBvZiBOT1RBVElPTi5GQVNUQSBhbmQgTk9UQVRJT04uU0VQQVJBVE9SXG4gICAgICAgIGNvbnN0IHNwbGl0dGVyID0gZ2V0U3BsaXR0ZXJGb3JDb2x1bW4obmV3Q29sdW1uKTtcbiAgICAgICAgY29uc3Qgc3RhdHMgPSBnZXRTdGF0cyhuZXdDb2x1bW4sIDUsIHNwbGl0dGVyKTtcbiAgICAgICAgY29uc3QgYWxpZ25lZCA9IHN0YXRzLnNhbWVMZW5ndGggPyAnU0VRLk1TQScgOiAnU0VRJztcbiAgICAgICAgbmV3Q29sdW1uLnNldFRhZyhcImFsaWduZWRcIiAvKiBUQUdTLmFsaWduZWQgKi8sIGFsaWduZWQpO1xuICAgICAgICByZXR1cm4gbmV3Q29sdW1uO1xuICAgIH1cbiAgICBjb252ZXJ0SGVsbVRvU2VwYXJhdG9yKCkge1xuICAgICAgICAvLyBUT0RPOiBpbXBsZW1lbnRhdGlvcmV0dXJuIHRoaXMuZ2V0TmV3Q29sdW1uKCk7XG4gICAgICAgIHJldHVybiB0aGlzLmdldE5ld0NvbHVtbihcInNlcGFyYXRvclwiIC8qIE5PVEFUSU9OLlNFUEFSQVRPUiAqLyk7XG4gICAgfVxuICAgIC8qKiBEaXNwYXRjaGVyIG1ldGhvZCBmb3Igbm90YXRpb24gY29udmVyc2lvblxuICAgICAqXG4gICAgICogQHBhcmFtIHtOT1RBVElPTn0gdGd0Tm90YXRpb24gICBOb3RhdGlvbiB3ZSB3YW50IHRvIGNvbnZlcnQgdG9cbiAgICAgKiBAcGFyYW0ge3N0cmluZyB8IG51bGx9IHRndFNlcGFyYXRvciAgIFBvc3NpYmxlIHNlcGFyYXRvclxuICAgICAqIEByZXR1cm4ge0RHLkNvbHVtbn0gICAgICAgICAgICAgICAgQ29udmVydGVkIGNvbHVtblxuICAgICAqL1xuICAgIGNvbnZlcnQodGd0Tm90YXRpb24sIHRndFNlcGFyYXRvciA9IG51bGwpIHtcbiAgICAgICAgLy8gcG9zc2libGUgZXhjZXB0aW9uc1xuICAgICAgICBpZiAodGhpcy5ub3RhdGlvbiA9PT0gdGd0Tm90YXRpb24pXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3RndCBub3RhdGlvbiBpcyBpbnZhbGlkJyk7XG4gICAgICAgIGlmICh0aGlzLnRvU2VwYXJhdG9yKHRndE5vdGF0aW9uKSAmJiB0Z3RTZXBhcmF0b3IgPT09IG51bGwpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3RndCBzZXBhcmF0b3IgaXMgbm90IHNwZWNpZmllZCcpO1xuICAgICAgICBpZiAodGhpcy5pc0Zhc3RhKCkgJiYgdGhpcy50b1NlcGFyYXRvcih0Z3ROb3RhdGlvbikgJiYgdGd0U2VwYXJhdG9yICE9PSBudWxsKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29udmVydEZhc3RhVG9TZXBhcmF0b3IodGd0U2VwYXJhdG9yKTtcbiAgICAgICAgZWxzZSBpZiAoKHRoaXMuaXNGYXN0YSgpIHx8IHRoaXMuaXNTZXBhcmF0b3IoKSkgJiYgdGhpcy50b0hlbG0odGd0Tm90YXRpb24pKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29udmVydFRvSGVsbSgpO1xuICAgICAgICBlbHNlIGlmICh0aGlzLmlzU2VwYXJhdG9yKCkgJiYgdGhpcy50b0Zhc3RhKHRndE5vdGF0aW9uKSlcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbnZlcnRTZXBhcmF0b3JUb0Zhc3RhKCk7XG4gICAgICAgIGVsc2UgaWYgKHRoaXMuaXNIZWxtKCkgJiYgdGhpcy50b0Zhc3RhKHRndE5vdGF0aW9uKSkgLy8gdGhlIGNhc2Ugb2YgSEVMTVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29udmVydEhlbG0odGd0Tm90YXRpb24pO1xuICAgICAgICBlbHNlIGlmICh0aGlzLmlzSGVsbSgpICYmIHRoaXMudG9TZXBhcmF0b3IodGd0Tm90YXRpb24pKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29udmVydEhlbG0odGd0Tm90YXRpb24sIHRndFNlcGFyYXRvcik7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignTm90IHN1cHBvcnRlZCBjb252ZXJzaW9uICcgK1xuICAgICAgICAgICAgICAgIGBmcm9tIHNvdXJjZSBub3RhdGlvbiAnJHt0aGlzLm5vdGF0aW9ufScgdG8gdGFyZ2V0IG5vdGF0aW9uICcke3RndE5vdGF0aW9ufScuYCk7XG4gICAgfVxuICAgIGNvbnN0cnVjdG9yKGNvbCkge1xuICAgICAgICBzdXBlcihjb2wpO1xuICAgICAgICB0aGlzLl9zcGxpdHRlciA9IG51bGw7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZGF0YTphcHBsaWNhdGlvbi9qc29uO2Jhc2U2NCxleUoyWlhKemFXOXVJam96TENKbWFXeGxJam9pYm05MFlYUnBiMjR0WTI5dWRtVnlkR1Z5TG1weklpd2ljMjkxY21ObFVtOXZkQ0k2SWlJc0luTnZkWEpqWlhNaU9sc2libTkwWVhScGIyNHRZMjl1ZG1WeWRHVnlMblJ6SWwwc0ltNWhiV1Z6SWpwYlhTd2liV0Z3Y0dsdVozTWlPaUpCUVVkQkxFOUJRVThzUzBGQlN5eEZRVUZGTEUxQlFVMHNhVUpCUVdsQ0xFTkJRVU03UVVGRmRFTXNUMEZCVHl4RlFVRkRMRmxCUVZrc1JVRkJReXhOUVVGTkxHbENRVUZwUWl4RFFVRkRPMEZCUXpkRExFOUJRVThzUlVGQlF5eHZRa0ZCYjBJc1JVRkJSU3hSUVVGUkxFVkJRVFJETEUxQlFVMHNhVUpCUVdsQ0xFTkJRVU03UVVGRk1VY3NhVVpCUVdsR08wRkJRMnBHTEUxQlFVMHNUMEZCVHl4cFFrRkJhMElzVTBGQlVTeFpRVUZaTzBsQlIycEVMRWxCUVdNc1VVRkJVVHRSUVVOd1FpeEpRVUZKTEVsQlFVa3NRMEZCUXl4VFFVRlRMRXRCUVVzc1NVRkJTVHRaUVVONlFpeEpRVUZKTEVOQlFVTXNVMEZCVXl4SFFVRkhMRzlDUVVGdlFpeERRVUZETEVsQlFVa3NRMEZCUXl4TlFVRk5MRU5CUVVNc1EwRkJRenRSUVVOeVJDeFBRVUZQTEVsQlFVa3NRMEZCUXl4VFFVRlRMRU5CUVVNN1NVRkRlRUlzUTBGQlF6dEpRVVZOTEU5QlFVOHNRMEZCUXl4alFVRjNRaXhKUVVGaExFOUJRVThzWTBGQll5eHBRMEZCYlVJc1EwRkJReXhEUVVGRExFTkJRVU03U1VGRmVFWXNWMEZCVnl4RFFVRkRMR05CUVhkQ0xFbEJRV0VzVDBGQlR5eGpRVUZqTEhsRFFVRjFRaXhEUVVGRExFTkJRVU1zUTBGQlF6dEpRVVZvUnl4TlFVRk5MRU5CUVVNc1kwRkJkMElzU1VGQllTeFBRVUZQTEdOQlFXTXNLMEpCUVd0Q0xFTkJRVU1zUTBGQlF5eERRVUZETzBsQlJUZEdPenM3T3pzN1QwRk5SenRKUVVOTExIVkNRVUYxUWl4RFFVRkRMRk5CUVdsQ0xFVkJRVVVzYVVKQlFXZERMRWxCUVVrN1VVRkRja1lzU1VGQlNTeGpRVUZqTEV0QlFVc3NTVUZCU1R0WlFVTjZRaXhqUVVGakxFZEJRVWNzU1VGQlNTeERRVUZETEdkQ1FVRm5RaXhEUVVGRE8xRkJSWHBETEUxQlFVMHNVMEZCVXl4SFFVRkhMRWxCUVVrc1EwRkJReXhaUVVGWkxITkRRVUZ2UWl4RFFVRkRPMUZCUTNoRUxITkVRVUZ6UkR0UlFVTjBSQ3hUUVVGVExFTkJRVU1zU1VGQlNTeERRVUZETEVOQlFVTXNSMEZCVnl4RlFVRkZMRVZCUVVVN1dVRkROMElzVFVGQlRTeFpRVUZaTEVkQlFVY3NTVUZCU1N4RFFVRkRMRTFCUVUwc1EwRkJReXhIUVVGSExFTkJRVU1zUjBGQlJ5eERRVUZETEVOQlFVTTdXVUZETVVNc1RVRkJUU3hyUWtGQmEwSXNSMEZCUnl4SlFVRkpMRU5CUVVNc1VVRkJVU3hEUVVGRExGbEJRVmtzUTBGQlF5eERRVUZETzFsQlEzWkVMRXRCUVVzc1NVRkJTU3hEUVVGRExFZEJRVWNzUTBGQlF5eEZRVUZGTEVOQlFVTXNSMEZCUnl4clFrRkJhMElzUTBGQlF5eE5RVUZOTEVWQlFVVXNRMEZCUXl4RlFVRkZMRVZCUVVVN1owSkJRMnhFTEVsQlFVa3NhMEpCUVd0Q0xFTkJRVU1zUTBGQlF5eERRVUZETEV0QlFVc3NZMEZCWXp0dlFrRkRNVU1zYTBKQlFXdENMRU5CUVVNc1EwRkJReXhEUVVGRExFZEJRVWNzV1VGQldTeERRVUZETEhOQ1FVRnpRaXhEUVVGRExGTkJRVk1zUTBGQlF6dGhRVU42UlR0WlFVTkVMRTlCUVU4c2EwSkJRV3RDTEVOQlFVTXNTVUZCU1N4RFFVRkRMRk5CUVZNc1EwRkJReXhEUVVGRE8xRkJRelZETEVOQlFVTXNRMEZCUXl4RFFVRkRPMUZCUTBnc1UwRkJVeXhEUVVGRExFMUJRVTBzUTBGQlF5eEZRVUZGTEVOQlFVTXNTVUZCU1N4RFFVRkRMRXRCUVVzc2RVTkJRWEZDTEVOQlFVTTdVVUZEY0VRc1UwRkJVeXhEUVVGRExFMUJRVTBzYlVOQlFXbENMRk5CUVZNc1EwRkJReXhEUVVGRE8xRkJRelZETEU5QlFVOHNVMEZCVXl4RFFVRkRPMGxCUTI1Q0xFTkJRVU03U1VGRlJEczdPenM3VDBGTFJ6dEpRVU5MTEdWQlFXVTdVVUZEY2tJc1RVRkJUU3hOUVVGTkxFZEJRVWNzUTBGQlF5eEpRVUZKTEVOQlFVTXNTMEZCU3l4RlFVRkZMRU5CUVVNc1EwRkJReXhEUVVGRExFTkJRVU1zVDBGQlR5eERRVUZETEVOQlFVTTdXVUZEZGtNc1EwRkJReXhKUVVGSkxFTkJRVU1zUzBGQlN5eEZRVUZGTEVOQlFVTXNRMEZCUXl4RFFVRkRMRU5CUVVNc1QwRkJUeXhEUVVGRExFTkJRVU03WjBKQlEzaENMRU5CUVVNc1NVRkJTU3hEUVVGRExGTkJRVk1zUlVGQlJTeERRVUZETEVOQlFVTXNRMEZCUXl4RFFVRkRMRmRCUVZjc1EwRkJReXhEUVVGRE8yOUNRVU5vUXl4VFFVRlRMRU5CUVVNc1EwRkJReXcyUTBGQk5rTTdVVUZGT1VRc1NVRkJTU3hOUVVGTkxFdEJRVXNzVTBGQlV6dFpRVU4wUWl4TlFVRk5MRWxCUVVrc1MwRkJTeXhEUVVGRExHbERRVUZwUXl4RFFVRkRMRU5CUVVNN1VVRkZja1FzVFVGQlRTeFBRVUZQTEVkQlFVY3NUVUZCVFN4RFFVRkRPMUZCUTNaQ0xFMUJRVTBzVjBGQlZ5eEhRVUZITEVOQlFVTXNTVUZCU1N4RFFVRkRMRXRCUVVzc1JVRkJSU3hEUVVGRExFTkJRVU1zUTBGQlF5eERRVUZETEVsQlFVa3NRMEZCUXl4RFFVRkRPMWxCUTNwRExFTkJRVU1zU1VGQlNTeERRVUZETEV0QlFVc3NSVUZCUlN4RFFVRkRMRU5CUVVNc1EwRkJReXhEUVVGRExFbEJRVWtzUTBGQlF5eERRVUZETEVOQlFVTXNSVUZCUlN4RFFVRkRMRU5CUVVNc01FSkJRVEJDTzFGQlEzaEVMRTFCUVUwc1dVRkJXU3hIUVVGSExFTkJRVU1zU1VGQlNTeERRVUZETEV0QlFVc3NSVUZCUlN4SlFVRkpMRWxCUVVrc1EwRkJReXhMUVVGTExFVkJRVVVzUTBGQlF5eERRVUZETEVOQlFVTXNRMEZCUXl4SlFVRkpMRU5CUVVNc1EwRkJReXhEUVVGRExFVkJRVVVzUTBGQlF5eERRVUZETERCQ1FVRXdRanRSUVVNelJpeFBRVUZQTEVOQlFVTXNUVUZCVFN4RlFVRkZMRmRCUVZjc1JVRkJSU3haUVVGWkxFVkJRVVVzVDBGQlR5eERRVUZETEVOQlFVTTdTVUZEZEVRc1EwRkJRenRKUVVWRUxHMUVRVUZ0UkR0SlFVTXpReXh0UWtGQmJVSXNRMEZEZWtJc1lVRkJjVUlzUlVGRGNrSXNaVUZCZFVJc1JVRkRka0lzVFVGQll5eEZRVU5rTEZkQlFXMUNMRVZCUTI1Q0xGbEJRVzlDTEVWQlEzQkNMRTlCUVdVN1VVRkZaaXhOUVVGTkxGbEJRVmtzUjBGQlJ5eEpRVUZKTEVOQlFVTXNVVUZCVVN4RFFVRkRMR0ZCUVdFc1EwRkJReXhEUVVGRE8xRkJRMnhFTEUxQlFVMHNaMEpCUVdkQ0xFZEJRV0VzV1VGQldTeERRVUZETEVkQlFVY3NRMEZCUXl4RFFVRkRMRVZCUVZVc1JVRkJSU3hGUVVGRk8xbEJRMnBGTEVsQlFVa3NSVUZCUlN4TFFVRkxMR1ZCUVdVN1owSkJRM2hDTEU5QlFVOHNXVUZCV1N4RFFVRkRMSE5DUVVGelFpeERRVUZETEVsQlFVa3NRMEZCUXpzN1owSkJSV2hFTEU5QlFVOHNSMEZCUnl4WFFVRlhMRWRCUVVjc1JVRkJSU3hIUVVGSExGbEJRVmtzUlVGQlJTeERRVUZETzFGQlEyaEVMRU5CUVVNc1EwRkJReXhEUVVGRE8xRkJRMGdzVDBGQlR5eEhRVUZITEUxQlFVMHNSMEZCUnl4blFrRkJaMElzUTBGQlF5eEpRVUZKTEVOQlFVTXNSMEZCUnl4RFFVRkRMRWRCUVVjc1QwRkJUeXhGUVVGRkxFTkJRVU03U1VGRE5VUXNRMEZCUXp0SlFVVkVPenM3T3pzN08wOUJUMGM3U1VGRFNTeHRRa0ZCYlVJc1EwRkRlRUlzWVVGQmNVSXNSVUZEY2tJc2EwSkJRV2xETEVsQlFVazdVVUZGY2tNc1NVRkJTU3hsUVVGbExFdEJRVXNzU1VGQlNUdFpRVU14UWl4bFFVRmxMRWRCUVVjc1NVRkJTU3hEUVVGRExHZENRVUZuUWl4RFFVRkRPMUZCUXpGRExFMUJRVTBzUTBGQlF5eE5RVUZOTEVWQlFVVXNWMEZCVnl4RlFVRkZMRmxCUVZrc1JVRkJSU3hQUVVGUExFTkJRVU1zUjBGQlJ5eEpRVUZKTEVOQlFVTXNaVUZCWlN4RlFVRkZMRU5CUVVNN1VVRkROVVVzVDBGQlR5eEpRVUZKTEVOQlFVTXNiVUpCUVcxQ0xFTkJRVU1zWVVGQllTeEZRVUZGTEdWQlFXVXNSVUZCUlN4TlFVRk5MRVZCUVVVc1YwRkJWeXhGUVVGRkxGbEJRVmtzUlVGQlJTeFBRVUZQTEVOQlFVTXNRMEZCUXp0SlFVTTVSeXhEUVVGRE8wbEJSVVE3T3pzN08wOUJTMGM3U1VGRFN5eGhRVUZoTEVOQlFVTXNhMEpCUVdsRExFbEJRVWs3VVVGRGVrUXNTVUZCU1N4bFFVRmxMRXRCUVVzc1NVRkJTVHRaUVVNeFFpeGxRVUZsTEVkQlFVY3NTVUZCU1N4RFFVRkRMR2RDUVVGblFpeERRVUZETzFGQlJURkRMRTFCUVUwc1EwRkJReXhOUVVGTkxFVkJRVVVzVjBGQlZ5eEZRVUZGTEZsQlFWa3NSVUZCUlN4UFFVRlBMRU5CUVVNc1IwRkJSeXhKUVVGSkxFTkJRVU1zWlVGQlpTeEZRVUZGTEVOQlFVTTdVVUZGTlVVc1RVRkJUU3hUUVVGVExFZEJRVWNzU1VGQlNTeERRVUZETEZsQlFWa3NORUpCUVdVc1EwRkJRenRSUVVOdVJDeDNRMEZCZDBNN1VVRkRlRU1zVTBGQlV5eERRVUZETEVsQlFVa3NRMEZCUXl4RFFVRkRMRWRCUVZjc1JVRkJSU3hGUVVGRk8xbEJRemRDTEUxQlFVMHNZVUZCWVN4SFFVRkhMRWxCUVVrc1EwRkJReXhOUVVGTkxFTkJRVU1zUjBGQlJ5eERRVUZETEVkQlFVY3NRMEZCUXl4RFFVRkRPMWxCUXpORExFOUJRVThzU1VGQlNTeERRVUZETEcxQ1FVRnRRaXhEUVVGRExHRkJRV0VzUlVGQlJTeGxRVUZuUWl4RlFVRkZMRTFCUVUwc1JVRkJSU3hYUVVGWExFVkJRVVVzV1VGQldTeEZRVUZGTEU5QlFVOHNRMEZCUXl4RFFVRkRPMUZCUXk5SExFTkJRVU1zUTBGQlF5eERRVUZETzFGQlEwZ3NVMEZCVXl4RFFVRkRMRTFCUVUwc1EwRkJReXhGUVVGRkxFTkJRVU1zU1VGQlNTeERRVUZETEV0QlFVc3NOa0pCUVdkQ0xFTkJRVU03VVVGREwwTXNUMEZCVHl4VFFVRlRMRU5CUVVNN1NVRkRia0lzUTBGQlF6dEpRVVZFT3pzN096dFBRVXRITzBsQlEwc3NkVUpCUVhWQ0xFTkJRVU1zYVVKQlFXZERMRWxCUVVrN1VVRkRiRVVzU1VGQlNTeGpRVUZqTEV0QlFVc3NTVUZCU1R0WlFVTjZRaXhqUVVGakxFZEJRVWNzV1VGQldTeERRVUZETEhOQ1FVRnpRaXhEUVVGRExFdEJRVXNzUTBGQlF6dFJRVVUzUkN4TlFVRk5MRk5CUVZNc1IwRkJSeXhKUVVGSkxFTkJRVU1zV1VGQldTdzRRa0ZCWjBJc1EwRkJRenRSUVVOd1JDeDNRMEZCZDBNN1VVRkRlRU1zVTBGQlV5eERRVUZETEVsQlFVa3NRMEZCUXl4RFFVRkRMRWRCUVZjc1JVRkJSU3hGUVVGRk8xbEJRemRDTEUxQlFVMHNaMEpCUVdkQ0xFZEJRVWNzU1VGQlNTeERRVUZETEUxQlFVMHNRMEZCUXl4SFFVRkhMRU5CUVVNc1IwRkJSeXhEUVVGRExFTkJRVU03V1VGRE9VTXNjME5CUVhORE8xbEJRM1JETEUxQlFVMHNiVUpCUVcxQ0xFZEJRVWNzU1VGQlNTeERRVUZETEZGQlFWRXNRMEZCUXl4blFrRkJaMElzUTBGQlF5eERRVUZETzFsQlF6VkVMRTFCUVUwc2EwSkJRV3RDTEVkQlFXRXNSVUZCUlN4RFFVRkRPMWxCUTNoRExFdEJRVXNzU1VGQlNTeERRVUZETEVkQlFVY3NRMEZCUXl4RlFVRkZMRU5CUVVNc1IwRkJSeXh0UWtGQmJVSXNRMEZCUXl4TlFVRk5MRVZCUVVVc1EwRkJReXhGUVVGRkxFVkJRVVU3WjBKQlEyNUVMRTFCUVUwc1NVRkJTU3hIUVVGSExHMUNRVUZ0UWl4RFFVRkRMRU5CUVVNc1EwRkJReXhEUVVGRE8yZENRVU53UXl4SlFVRkpMRWxCUVVrc1EwRkJReXhOUVVGTkxFdEJRVXNzUTBGQlF5eEZRVUZGTzI5Q1FVTnlRaXhyUWtGQmEwSXNRMEZCUXl4SlFVRkpMRU5CUVVNc1kwRkJaU3hEUVVGRExFTkJRVU03YVVKQlF6RkRPM0ZDUVVGTkxFbEJRVWtzU1VGQlNTeERRVUZETEUxQlFVMHNSMEZCUnl4RFFVRkRMRVZCUVVVN2IwSkJRekZDTEhkRFFVRjNRenR2UWtGRGVFTXNUVUZCVFN4UFFVRlBMRWRCUVVjc1IwRkJSeXhIUVVGSExFbEJRVWtzUjBGQlJ5eEhRVUZITEVOQlFVTTdiMEpCUTJwRExHdENRVUZyUWl4RFFVRkRMRWxCUVVrc1EwRkJReXhQUVVGUExFTkJRVU1zUTBGQlF6dHBRa0ZEYkVNN2NVSkJRVTA3YjBKQlEwd3NhMEpCUVd0Q0xFTkJRVU1zU1VGQlNTeERRVUZETEVsQlFVa3NRMEZCUXl4RFFVRkRPMmxDUVVNdlFqdGhRVU5HTzFsQlEwUXNUMEZCVHl4clFrRkJhMElzUTBGQlF5eEpRVUZKTEVOQlFVTXNSVUZCUlN4RFFVRkRMRU5CUVVNN1VVRkRja01zUTBGQlF5eERRVUZETEVOQlFVTTdVVUZEU0N4VFFVRlRMRU5CUVVNc1RVRkJUU3hEUVVGRExFVkJRVVVzUTBGQlF5eEpRVUZKTEVOQlFVTXNTMEZCU3l3clFrRkJhVUlzUTBGQlF6dFJRVU5vUkN4UFFVRlBMRk5CUVZNc1EwRkJRenRKUVVOdVFpeERRVUZETzBsQlJVUTdPenM3T3pzN08wOUJVVWM3U1VGRFN5eFhRVUZYTEVOQlFVTXNWMEZCYlVJc1JVRkJSU3haUVVGeFFpeEZRVUZGTEZsQlFYRkNPMUZCUTI1R0xHMUZRVUZ0UlR0UlFVTnVSU3gzUlVGQmQwVTdVVUZEZUVVc1NVRkJTU3hEUVVGRExGbEJRVmtzUlVGQlJUdFpRVU5xUWl4WlFVRlpMRWRCUVVjc1EwRkJReXhKUVVGSkxFTkJRVU1zVDBGQlR5eERRVUZETEZkQlFYVkNMRU5CUVVNc1EwRkJReXhEUVVGRExFTkJRVU03WjBKQlEzUkVMRmxCUVZrc1EwRkJReXh6UWtGQmMwSXNRMEZCUXl4TFFVRkxMRU5CUVVNc1EwRkJRenRuUWtGRE0wTXNXVUZCV1N4RFFVRkRMSE5DUVVGelFpeERRVUZETEZOQlFWTXNRMEZCUXp0VFFVTnFSRHRSUVVWRUxFbEJRVWtzUTBGQlF5eFpRVUZaTEVWQlFVVTdXVUZEYWtJc1dVRkJXU3hIUVVGSExFTkJRVU1zU1VGQlNTeERRVUZETEU5QlFVOHNRMEZCUXl4WFFVRjFRaXhEUVVGRExFTkJRVU1zUTBGQlF5eERRVUZETEVOQlFVTXNSVUZCUlN4RFFVRkRMRU5CUVVNc1EwRkJReXhKUVVGSkxFTkJRVU1zVTBGQlV5eERRVUZETzFOQlF6bEZPMUZCUlVRc1RVRkJUU3hqUVVGakxFZEJRVWNzYVVKQlFXbENMRU5CUVVNN1VVRkRla01zVFVGQlRTeFRRVUZUTEVkQlFVY3NTVUZCU1N4RFFVRkRMRmxCUVZrc1EwRkJReXhYUVVGMVFpeERRVUZETEVOQlFVTTdVVUZETjBRc2QwTkJRWGRETzFGQlEzaERMRk5CUVZNc1EwRkJReXhKUVVGSkxFTkJRVU1zUTBGQlF5eEhRVUZYTEVWQlFVVXNSVUZCUlR0WlFVTTNRaXhOUVVGTkxGZEJRVmNzUjBGQlJ5eEpRVUZKTEVOQlFVTXNUVUZCVFN4RFFVRkRMRWRCUVVjc1EwRkJReXhIUVVGSExFTkJRVU1zUTBGQlF6dFpRVVY2UXl4dFJVRkJiVVU3V1VGRGJrVXNiVVZCUVcxRk8xbEJRMjVGTERCRFFVRXdRenRaUVVNeFF5eE5RVUZOTEZsQlFWa3NSMEZCUnl4WFFVRlhMRU5CUVVNc1ZVRkJWU3hEUVVGRExFdEJRVXNzUTBGQlF5eEpRVUZKTEZkQlFWY3NRMEZCUXl4VlFVRlZMRU5CUVVNc1MwRkJTeXhEUVVGRExFTkJRVU03V1VGRmNFWXNhVU5CUVdsRE8xbEJRMnBETEUxQlFVMHNZMEZCWXl4SFFVRkhMRWxCUVVrc1EwRkJReXhSUVVGUkxFTkJRVU1zVjBGQlZ5eERRVUZETEVOQlFVTTdXVUZEYkVRc1RVRkJUU3huUWtGQlowSXNSMEZCWVN4RlFVRkZMRU5CUVVNN1dVRkRkRU1zUzBGQlN5eEpRVUZKTEVOQlFVTXNSMEZCUnl4RFFVRkRMRVZCUVVVc1EwRkJReXhIUVVGSExHTkJRV01zUTBGQlF5eE5RVUZOTEVWQlFVVXNRMEZCUXl4RlFVRkZMRVZCUVVVN1owSkJRemxETEVsQlFVa3NTVUZCU1N4SFFVRkhMR05CUVdNc1EwRkJReXhEUVVGRExFTkJRVU1zUTBGQlF6dG5Ra0ZETjBJc1NVRkJTU3haUVVGWk8yOUNRVU5rTEVsQlFVa3NSMEZCUnl4SlFVRkpMRU5CUVVNc1QwRkJUeXhEUVVGRExHTkJRV01zUlVGQlJTeEZRVUZGTEVOQlFVTXNRMEZCUXp0blFrRkRNVU1zU1VGQlNTeEpRVUZKTEV0QlFVc3NXVUZCV1N4RFFVRkRMSE5DUVVGelFpeERRVUZETEVsQlFVa3NSVUZCUlR0dlFrRkRja1FzWjBKQlFXZENMRU5CUVVNc1NVRkJTU3hEUVVGRExGbEJRV0VzUTBGQlF5eERRVUZETzJsQ1FVTjBRenR4UWtGQlRTeEpRVUZKTEVsQlFVa3NRMEZCUXl4UFFVRlBMRU5CUVVNc1YwRkJkVUlzUTBGQlF5eEpRVUZKTEVsQlFVa3NRMEZCUXl4TlFVRk5MRWRCUVVjc1EwRkJReXhGUVVGRk8yOUNRVU51UlN3eVJFRkJNa1E3YjBKQlF6TkVMRTFCUVUwc1QwRkJUeXhIUVVGSExFZEJRVWNzUjBGQlJ5eEpRVUZKTEVkQlFVY3NSMEZCUnl4RFFVRkRPMjlDUVVOcVF5eG5Ra0ZCWjBJc1EwRkJReXhKUVVGSkxFTkJRVU1zVDBGQlR5eERRVUZETEVOQlFVTTdhVUpCUTJoRE8zRkNRVUZOTzI5Q1FVTk1MR2RDUVVGblFpeERRVUZETEVsQlFVa3NRMEZCUXl4SlFVRkpMRU5CUVVNc1EwRkJRenRwUWtGRE4wSTdZVUZEUmp0WlFVTkVMRTlCUVU4c1owSkJRV2RDTEVOQlFVTXNTVUZCU1N4RFFVRkRMRmxCUVZrc1EwRkJReXhEUVVGRE8xRkJRemRETEVOQlFVTXNRMEZCUXl4RFFVRkRPMUZCUlVnc2FVWkJRV2xHTzFGQlEycEdMRTFCUVUwc1VVRkJVU3hIUVVGcFFpeHZRa0ZCYjBJc1EwRkJReXhUUVVGVExFTkJRVU1zUTBGQlF6dFJRVU12UkN4TlFVRk5MRXRCUVVzc1IwRkJaMElzVVVGQlVTeERRVUZETEZOQlFWTXNSVUZCUlN4RFFVRkRMRVZCUVVVc1VVRkJVU3hEUVVGRExFTkJRVU03VVVGRE5VUXNUVUZCVFN4UFFVRlBMRWRCUVVjc1MwRkJTeXhEUVVGRExGVkJRVlVzUTBGQlF5eERRVUZETEVOQlFVTXNVMEZCVXl4RFFVRkRMRU5CUVVNc1EwRkJReXhMUVVGTExFTkJRVU03VVVGRGNrUXNVMEZCVXl4RFFVRkRMRTFCUVUwc0swSkJRV1VzVDBGQlR5eERRVUZETEVOQlFVTTdVVUZGZUVNc1QwRkJUeXhUUVVGVExFTkJRVU03U1VGRGJrSXNRMEZCUXp0SlFVVlBMSE5DUVVGelFqdFJRVU0xUWl4cFJFRkJhVVE3VVVGRGFrUXNUMEZCVHl4SlFVRkpMRU5CUVVNc1dVRkJXU3h6UTBGQmIwSXNRMEZCUXp0SlFVTXZReXhEUVVGRE8wbEJSVVE3T3pzN08wOUJTMGM3U1VGRFNTeFBRVUZQTEVOQlFVTXNWMEZCY1VJc1JVRkJSU3hsUVVFNFFpeEpRVUZKTzFGQlEzUkZMSE5DUVVGelFqdFJRVU4wUWl4SlFVRkpMRWxCUVVrc1EwRkJReXhSUVVGUkxFdEJRVXNzVjBGQlZ6dFpRVU12UWl4TlFVRk5MRWxCUVVrc1MwRkJTeXhEUVVGRExIbENRVUY1UWl4RFFVRkRMRU5CUVVNN1VVRkROME1zU1VGQlNTeEpRVUZKTEVOQlFVTXNWMEZCVnl4RFFVRkRMRmRCUVZjc1EwRkJReXhKUVVGSkxGbEJRVmtzUzBGQlN5eEpRVUZKTzFsQlEzaEVMRTFCUVUwc1NVRkJTU3hMUVVGTExFTkJRVU1zWjBOQlFXZERMRU5CUVVNc1EwRkJRenRSUVVWd1JDeEpRVUZKTEVsQlFVa3NRMEZCUXl4UFFVRlBMRVZCUVVVc1NVRkJTU3hKUVVGSkxFTkJRVU1zVjBGQlZ5eERRVUZETEZkQlFWY3NRMEZCUXl4SlFVRkpMRmxCUVZrc1MwRkJTeXhKUVVGSk8xbEJRekZGTEU5QlFVOHNTVUZCU1N4RFFVRkRMSFZDUVVGMVFpeERRVUZETEZsQlFWa3NRMEZCUXl4RFFVRkRPMkZCUXk5RExFbEJRVWtzUTBGQlF5eEpRVUZKTEVOQlFVTXNUMEZCVHl4RlFVRkZMRWxCUVVrc1NVRkJTU3hEUVVGRExGZEJRVmNzUlVGQlJTeERRVUZETEVsQlFVa3NTVUZCU1N4RFFVRkRMRTFCUVUwc1EwRkJReXhYUVVGWExFTkJRVU03V1VGRGVrVXNUMEZCVHl4SlFVRkpMRU5CUVVNc1lVRkJZU3hGUVVGRkxFTkJRVU03WVVGRGVrSXNTVUZCU1N4SlFVRkpMRU5CUVVNc1YwRkJWeXhGUVVGRkxFbEJRVWtzU1VGQlNTeERRVUZETEU5QlFVOHNRMEZCUXl4WFFVRlhMRU5CUVVNN1dVRkRkRVFzVDBGQlR5eEpRVUZKTEVOQlFVTXNkVUpCUVhWQ0xFVkJRVVVzUTBGQlF6dGhRVU51UXl4SlFVRkpMRWxCUVVrc1EwRkJReXhOUVVGTkxFVkJRVVVzU1VGQlNTeEpRVUZKTEVOQlFVTXNUMEZCVHl4RFFVRkRMRmRCUVZjc1EwRkJReXhGUVVGRkxHMUNRVUZ0UWp0WlFVTjBSU3hQUVVGUExFbEJRVWtzUTBGQlF5eFhRVUZYTEVOQlFVTXNWMEZCVnl4RFFVRkRMRU5CUVVNN1lVRkRiRU1zU1VGQlNTeEpRVUZKTEVOQlFVTXNUVUZCVFN4RlFVRkZMRWxCUVVrc1NVRkJTU3hEUVVGRExGZEJRVmNzUTBGQlF5eFhRVUZYTEVOQlFVTTdXVUZEY2tRc1QwRkJUeXhKUVVGSkxFTkJRVU1zVjBGQlZ5eERRVUZETEZkQlFWY3NSVUZCUlN4WlFVRmhMRU5CUVVNc1EwRkJRenM3V1VGRmNFUXNUVUZCVFN4SlFVRkpMRXRCUVVzc1EwRkJReXd5UWtGQk1rSTdaMEpCUTNwRExIbENRVUY1UWl4SlFVRkpMRU5CUVVNc1VVRkJVU3g1UWtGQmVVSXNWMEZCVnl4SlFVRkpMRU5CUVVNc1EwRkJRenRKUVVOMFJpeERRVUZETzBsQlJVUXNXVUZCYlVJc1IwRkJZenRSUVVNdlFpeExRVUZMTEVOQlFVTXNSMEZCUnl4RFFVRkRMRU5CUVVNN1VVRTNVRXdzWTBGQlV5eEhRVUYzUWl4SlFVRkpMRU5CUVVNN1NVRTRVRGxETEVOQlFVTTdRMEZEUmlJc0luTnZkWEpqWlhORGIyNTBaVzUwSWpwYklpOHFJRVJ2SUc1dmRDQmphR0Z1WjJVZ2RHaGxjMlVnYVcxd2IzSjBJR3hwYm1WeklIUnZJRzFoZEdOb0lHVjRkR1Z5Ym1Gc0lHMXZaSFZzWlhNZ2FXNGdkMlZpY0dGamF5QmpiMjVtYVdkMWNtRjBhVzl1SUNvdlhHNXBiWEJ2Y25RZ0tpQmhjeUJuY205cklHWnliMjBnSjJSaGRHRm5jbTlyTFdGd2FTOW5jbTlySnp0Y2JtbHRjRzl5ZENBcUlHRnpJSFZwSUdaeWIyMGdKMlJoZEdGbmNtOXJMV0Z3YVM5MWFTYzdYRzVwYlhCdmNuUWdLaUJoY3lCRVJ5Qm1jbTl0SUNka1lYUmhaM0p2YXkxaGNHa3ZaR2NuTzF4dVhHNXBiWEJ2Y25RZ2UxVnVhWFJ6U0dGdVpHeGxjbjBnWm5KdmJTQW5MaTkxYm1sMGN5MW9ZVzVrYkdWeUp6dGNibWx0Y0c5eWRDQjdaMlYwVTNCc2FYUjBaWEpHYjNKRGIyeDFiVzRzSUdkbGRGTjBZWFJ6TENCT1QxUkJWRWxQVGl3Z1UyVnhRMjlzVTNSaGRITXNJRk53YkdsMGRHVnlSblZ1WXl3Z1ZFRkhVMzBnWm5KdmJTQW5MaTl0WVdOeWIyMXZiR1ZqZFd4bEp6dGNibHh1THlvcUlFTnNZWE56SUdadmNpQm9ZVzVrYkdsdVp5QmpiMjUyWlhKemFXOXVJRzltSUc1dmRHRjBhVzl1SUhONWMzUmxiWE1nYVc0Z1RXRmpjbTl0YjJ4bFkzVnNaU0JqYjJ4MWJXNXpJQ292WEc1bGVIQnZjblFnWTJ4aGMzTWdUbTkwWVhScGIyNURiMjUyWlhKMFpYSWdaWGgwWlc1a2N5QlZibWwwYzBoaGJtUnNaWElnZTF4dUlDQndjbWwyWVhSbElGOXpjR3hwZEhSbGNqb2dVM0JzYVhSMFpYSkdkVzVqSUh3Z2JuVnNiQ0E5SUc1MWJHdzdYRzVjYmlBZ2NISnZkR1ZqZEdWa0lHZGxkQ0J6Y0d4cGRIUmxjaWdwT2lCVGNHeHBkSFJsY2taMWJtTWdlMXh1SUNBZ0lHbG1JQ2gwYUdsekxsOXpjR3hwZEhSbGNpQTlQVDBnYm5Wc2JDbGNiaUFnSUNBZ0lIUm9hWE11WDNOd2JHbDBkR1Z5SUQwZ1oyVjBVM0JzYVhSMFpYSkdiM0pEYjJ4MWJXNG9kR2hwY3k1amIyeDFiVzRwTzF4dUlDQWdJSEpsZEhWeWJpQjBhR2x6TGw5emNHeHBkSFJsY2p0Y2JpQWdmVnh1WEc0Z0lIQjFZbXhwWXlCMGIwWmhjM1JoS0hSaGNtZGxkRTV2ZEdGMGFXOXVPaUJPVDFSQlZFbFBUaWs2SUdKdmIyeGxZVzRnZXlCeVpYUjFjbTRnZEdGeVoyVjBUbTkwWVhScGIyNGdQVDA5SUU1UFZFRlVTVTlPTGtaQlUxUkJPeUI5WEc1Y2JpQWdjSFZpYkdsaklIUnZVMlZ3WVhKaGRHOXlLSFJoY21kbGRFNXZkR0YwYVc5dU9pQk9UMVJCVkVsUFRpazZJR0p2YjJ4bFlXNGdleUJ5WlhSMWNtNGdkR0Z5WjJWMFRtOTBZWFJwYjI0Z1BUMDlJRTVQVkVGVVNVOU9MbE5GVUVGU1FWUlBVanNnZlZ4dVhHNGdJSEIxWW14cFl5QjBiMGhsYkcwb2RHRnlaMlYwVG05MFlYUnBiMjQ2SUU1UFZFRlVTVTlPS1RvZ1ltOXZiR1ZoYmlCN0lISmxkSFZ5YmlCMFlYSm5aWFJPYjNSaGRHbHZiaUE5UFQwZ1RrOVVRVlJKVDA0dVNFVk1UVHNnZlZ4dVhHNGdJQzhxS2x4dUlDQWdLaUJEYjI1MlpYSjBJR0VnVFdGamNtOXRiMnhsWTNWc1pTQmpiMngxYlc0Z1puSnZiU0JHUVZOVVFTQjBieUJUUlZCQlVrRlVUMUlnYm05MFlYUnBiMjVjYmlBZ0lDcGNiaUFnSUNvZ1FIQmhjbUZ0SUh0emRISnBibWQ5SUhObGNHRnlZWFJ2Y2lBZ1FTQnpjR1ZqYVdacFl5QnpaWEJoY21GMGIzSWdkRzhnWW1VZ2RYTmxaRnh1SUNBZ0tpQkFjR0Z5WVcwZ2UzTjBjbWx1WjMwZ1ptRnpkR0ZIWVhCVGVXMWliMndnSUVkaGNDQnplVzFpYjJ3Z2FXNGdSa0ZUVkVFc0lDY3RKeUJpZVNCa1pXWmhkV3gwWEc0Z0lDQXFJRUJ5WlhSMWNtNGdlMFJITGtOdmJIVnRibjBnSUNBZ0lDQWdJRUVnYm1WM0lHTnZiSFZ0YmlCcGJpQlRSVkJCVWtGVVQxSWdibTkwWVhScGIyNWNiaUFnSUNvdlhHNGdJSEJ5YVhaaGRHVWdZMjl1ZG1WeWRFWmhjM1JoVkc5VFpYQmhjbUYwYjNJb2MyVndZWEpoZEc5eU9pQnpkSEpwYm1jc0lHWmhjM1JoUjJGd1UzbHRZbTlzT2lCemRISnBibWNnZkNCdWRXeHNJRDBnYm5Wc2JDazZJRVJITGtOdmJIVnRiaUI3WEc0Z0lDQWdhV1lnS0daaGMzUmhSMkZ3VTNsdFltOXNJRDA5UFNCdWRXeHNLVnh1SUNBZ0lDQWdabUZ6ZEdGSFlYQlRlVzFpYjJ3Z1BTQjBhR2x6TG1SbFptRjFiSFJIWVhCVGVXMWliMnc3WEc1Y2JpQWdJQ0JqYjI1emRDQnVaWGREYjJ4MWJXNGdQU0IwYUdsekxtZGxkRTVsZDBOdmJIVnRiaWhPVDFSQlZFbFBUaTVUUlZCQlVrRlVUMUlwTzF4dUlDQWdJQzh2SUdGemMybG5iaUIwYUdVZ2RtRnNkV1Z6SUhSdklIUm9aU0J1Wlhkc2VTQmpjbVZoZEdWa0lHVnRjSFI1SUdOdmJIVnRibHh1SUNBZ0lHNWxkME52YkhWdGJpNXBibWwwS0NocFpIZzZJRzUxYldKbGNpa2dQVDRnZTF4dUlDQWdJQ0FnWTI5dWMzUWdabUZ6ZEdGUWIyeDViV1Z5SUQwZ2RHaHBjeTVqYjJ4MWJXNHVaMlYwS0dsa2VDazdYRzRnSUNBZ0lDQmpiMjV6ZENCbVlYTjBZVTF2Ym05dFpYSnpRWEp5WVhrZ1BTQjBhR2x6TG5Od2JHbDBkR1Z5S0daaGMzUmhVRzlzZVcxbGNpazdYRzRnSUNBZ0lDQm1iM0lnS0d4bGRDQnBJRDBnTURzZ2FTQThJR1poYzNSaFRXOXViMjFsY25OQmNuSmhlUzVzWlc1bmRHZzdJR2tyS3lrZ2UxeHVJQ0FnSUNBZ0lDQnBaaUFvWm1GemRHRk5iMjV2YldWeWMwRnljbUY1VzJsZElEMDlQU0JtWVhOMFlVZGhjRk41YldKdmJDbGNiaUFnSUNBZ0lDQWdJQ0JtWVhOMFlVMXZibTl0WlhKelFYSnlZWGxiYVYwZ1BTQlZibWwwYzBoaGJtUnNaWEl1WDJSbFptRjFiSFJIWVhCVGVXMWliMnh6UkdsamRDNVRSVkJCVWtGVVQxSTdYRzRnSUNBZ0lDQjlYRzRnSUNBZ0lDQnlaWFIxY200Z1ptRnpkR0ZOYjI1dmJXVnljMEZ5Y21GNUxtcHZhVzRvYzJWd1lYSmhkRzl5S1R0Y2JpQWdJQ0I5S1R0Y2JpQWdJQ0J1WlhkRGIyeDFiVzR1YzJWMFZHRm5LRVJITGxSQlIxTXVWVTVKVkZNc0lFNVBWRUZVU1U5T0xsTkZVRUZTUVZSUFVpazdYRzRnSUNBZ2JtVjNRMjlzZFcxdUxuTmxkRlJoWnloVVFVZFRMbk5sY0dGeVlYUnZjaXdnYzJWd1lYSmhkRzl5S1R0Y2JpQWdJQ0J5WlhSMWNtNGdibVYzUTI5c2RXMXVPMXh1SUNCOVhHNWNiaUFnTHlvcVhHNGdJQ0FxSUVkbGRDQjBhR1VnZDNKaGNIQmxjaUJ6ZEhKcGJtZHpJR1p2Y2lCSVJVeE5MQ0JrWlhCbGJtUnBibWNnYjI0Z2RHaGxJSFI1Y0dVZ2IyWWdkR2hsWEc0Z0lDQXFJRzFoWTNKdmJXOXNaV04xYkdVZ0tIQmxjSFJwWkdVc0lFUk9RU3dnVWs1QktWeHVJQ0FnS2x4dUlDQWdLaUJBY21WMGRYSnVJSHR6ZEhKcGJtZGJYWDBnUVhKeVlYa2diMllnZDNKaGNIQmxjbk5jYmlBZ0lDb3ZYRzRnSUhCeWFYWmhkR1VnWjJWMFNHVnNiVmR5WVhCd1pYSnpLQ2s2SUhOMGNtbHVaMXRkSUh0Y2JpQWdJQ0JqYjI1emRDQndjbVZtYVhnZ1BTQW9kR2hwY3k1cGMwUnVZU2dwS1NBL0lDZEVUa0V4ZXljZ09seHVJQ0FnSUNBZ0tIUm9hWE11YVhOU2JtRW9LU2tnUHlBblVrNUJNWHNuSURwY2JpQWdJQ0FnSUNBZ0tIUm9hWE11YVhOUVpYQjBhV1JsS0NrcElEOGdKMUJGVUZSSlJFVXhleWNnT2x4dUlDQWdJQ0FnSUNBZ0lDZFZibXR1YjNkdUp6c2dMeThnZEdocGN5QmpZWE5sSUhOb2IzVnNaQ0JpWlNCb1lXNWtiR1ZrSUdGeklHVjRZMlZ3ZEdsdmJtRnNYRzVjYmlBZ0lDQnBaaUFvY0hKbFptbDRJRDA5UFNBblZXNXJibTkzYmljcFhHNGdJQ0FnSUNCMGFISnZkeUJ1WlhjZ1JYSnliM0lvSjA1bGFYUm9aWElnY0dWd2RHbGtaU3dnYm05eUlHNTFZMnhsYjNScFpHVW5LVHRjYmx4dUlDQWdJR052Ym5OMElIQnZjM1JtYVhnZ1BTQW5mU1FrSkNjN1hHNGdJQ0FnWTI5dWMzUWdiR1ZtZEZkeVlYQndaWElnUFNBb2RHaHBjeTVwYzBSdVlTZ3BLU0EvSUNkRUtDY2dPbHh1SUNBZ0lDQWdLSFJvYVhNdWFYTlNibUVvS1NrZ1B5QW5VaWduSURvZ0p5YzdJQzh2SUc1dklIZHlZWEJ3WlhJZ1ptOXlJSEJsY0hScFpHVnpYRzRnSUNBZ1kyOXVjM1FnY21sbmFIUlhjbUZ3Y0dWeUlEMGdLSFJvYVhNdWFYTkVibUVvS1NCOGZDQjBhR2x6TG1selVtNWhLQ2twSUQ4Z0p5bFFKeUE2SUNjbk95QXZMeUJ1YnlCM2NtRndjR1Z5SUdadmNpQndaWEIwYVdSbGMxeHVJQ0FnSUhKbGRIVnliaUJiY0hKbFptbDRMQ0JzWldaMFYzSmhjSEJsY2l3Z2NtbG5hSFJYY21Gd2NHVnlMQ0J3YjNOMFptbDRYVHRjYmlBZ2ZWeHVYRzRnSUM4dklFRWdhR1ZzY0dWeUlHWjFibU4wYVc5dUlHWnZjaUJqYjI1MlpYSjBhVzVuSUhOMGNtbHVaM01nZEc4Z1NFVk1UVnh1SUNCd2NtbDJZWFJsSUdOdmJuWmxjblJVYjBobGJHMUlaV3h3WlhJb1hHNGdJQ0FnYzI5MWNtTmxVRzlzZVcxbGNqb2djM1J5YVc1bkxGeHVJQ0FnSUhOdmRYSmpaVWRoY0ZONWJXSnZiRG9nYzNSeWFXNW5MRnh1SUNBZ0lIQnlaV1pwZURvZ2MzUnlhVzVuTEZ4dUlDQWdJR3hsWm5SWGNtRndjR1Z5T2lCemRISnBibWNzWEc0Z0lDQWdjbWxuYUhSWGNtRndjR1Z5T2lCemRISnBibWNzWEc0Z0lDQWdjRzl6ZEdacGVEb2djM1J5YVc1blhHNGdJQ2s2SUhOMGNtbHVaeUI3WEc0Z0lDQWdZMjl1YzNRZ2JXOXViMjFsY2tGeWNtRjVJRDBnZEdocGN5NXpjR3hwZEhSbGNpaHpiM1Z5WTJWUWIyeDViV1Z5S1R0Y2JpQWdJQ0JqYjI1emRDQnRiMjV2YldWeVNHVnNiVUZ5Y21GNU9pQnpkSEpwYm1kYlhTQTlJRzF2Ym05dFpYSkJjbkpoZVM1dFlYQW9LRzF0T2lCemRISnBibWNwSUQwK0lIdGNiaUFnSUNBZ0lHbG1JQ2h0YlNBOVBUMGdjMjkxY21ObFIyRndVM2x0WW05c0tWeHVJQ0FnSUNBZ0lDQnlaWFIxY200Z1ZXNXBkSE5JWVc1a2JHVnlMbDlrWldaaGRXeDBSMkZ3VTNsdFltOXNjMFJwWTNRdVNFVk1UVHRjYmlBZ0lDQWdJR1ZzYzJWY2JpQWdJQ0FnSUNBZ2NtVjBkWEp1SUdBa2UyeGxablJYY21Gd2NHVnlmU1I3YlcxOUpIdHlhV2RvZEZkeVlYQndaWEo5WUR0Y2JpQWdJQ0I5S1R0Y2JpQWdJQ0J5WlhSMWNtNGdZQ1I3Y0hKbFptbDRmU1I3Ylc5dWIyMWxja2hsYkcxQmNuSmhlUzVxYjJsdUtDY3VKeWw5Skh0d2IzTjBabWw0ZldBN1hHNGdJSDFjYmx4dUlDQXZLaXBjYmlBZ0lDb2dRMjl1ZG1WeWRDQmhJSE4wY21sdVp5QjNhWFJvSUZORlVFRlNRVlJQVWk5R1FWTlVRU0J1YjNSaGRHbHZiaUIwYnlCSVJVeE5YRzRnSUNBcVhHNGdJQ0FxSUVCd1lYSmhiU0I3YzNSeWFXNW5mU0J6YjNWeVkyVlFiMng1YldWeUlDQkJJSE4wY21sdVp5QjBieUJpWlNCamIyNTJaWEowWldSY2JpQWdJQ29nUUhCaGNtRnRJSHR6ZEhKcGJtY2dmQ0J1ZFd4c2ZTQnpiM1Z5WTJWSFlYQlRlVzFpYjJ3Z0lFRnVJRzl3ZEdsdmJtRnNJR2RoY0NCemVXMWliMndzSUhObGRDQjBiMXh1SUNBZ0tpQmtaV1poZFd4MElIWmhiSFZsY3lBb0p5MG5JR1p2Y2lCR1FWTlVRU0JoYm1RZ0p5Y2dabTl5SUZORlVFRlNRVlJQVWlrZ2RXNXNaWE56SUhOd1pXTnBabWxsWkZ4dUlDQWdLaUJBY21WMGRYSnVJSHR6ZEhKcGJtZDlJQ0JVYUdVZ2RHRnlaMlYwSUVoRlRFMGdjM1J5YVc1blhHNGdJQ0FxTDF4dUlDQndkV0pzYVdNZ1kyOXVkbVZ5ZEZOMGNtbHVaMVJ2U0dWc2JTaGNiaUFnSUNCemIzVnlZMlZRYjJ4NWJXVnlPaUJ6ZEhKcGJtY3NYRzRnSUNBZ2MyOTFjbU5sUjJGd1UzbHRZbTlzT2lCemRISnBibWNnZkNCdWRXeHNJRDBnYm5Wc2JGeHVJQ0FwT2lCemRISnBibWNnZTF4dUlDQWdJR2xtSUNoemIzVnlZMlZIWVhCVGVXMWliMndnUFQwOUlHNTFiR3dwWEc0Z0lDQWdJQ0J6YjNWeVkyVkhZWEJUZVcxaWIyd2dQU0IwYUdsekxtUmxabUYxYkhSSFlYQlRlVzFpYjJ3N1hHNGdJQ0FnWTI5dWMzUWdXM0J5WldacGVDd2diR1ZtZEZkeVlYQndaWElzSUhKcFoyaDBWM0poY0hCbGNpd2djRzl6ZEdacGVGMGdQU0IwYUdsekxtZGxkRWhsYkcxWGNtRndjR1Z5Y3lncE8xeHVJQ0FnSUhKbGRIVnliaUIwYUdsekxtTnZiblpsY25SVWIwaGxiRzFJWld4d1pYSW9jMjkxY21ObFVHOXNlVzFsY2l3Z2MyOTFjbU5sUjJGd1UzbHRZbTlzTENCd2NtVm1hWGdzSUd4bFpuUlhjbUZ3Y0dWeUxDQnlhV2RvZEZkeVlYQndaWElzSUhCdmMzUm1hWGdwTzF4dUlDQjlYRzVjYmlBZ0x5b3FYRzRnSUNBcUlFTnZiblpsY25RZ1lTQmpiMngxYlc0Z2RHOGdTRVZNVFZ4dUlDQWdLbHh1SUNBZ0tpQkFjR0Z5WVcwZ2UzTjBjbWx1WnlCOElHNTFiR3g5SUhOdmRYSmpaVWRoY0ZONWJXSnZiRnh1SUNBZ0tpQkFjbVYwZFhKdUlIdEVSeTVEYjJ4MWJXNTlYRzRnSUNBcUwxeHVJQ0J3Y21sMllYUmxJR052Ym5abGNuUlViMGhsYkcwb2MyOTFjbU5sUjJGd1UzbHRZbTlzT2lCemRISnBibWNnZkNCdWRXeHNJRDBnYm5Wc2JDazZJRVJITGtOdmJIVnRiaUI3WEc0Z0lDQWdhV1lnS0hOdmRYSmpaVWRoY0ZONWJXSnZiQ0E5UFQwZ2JuVnNiQ2xjYmlBZ0lDQWdJSE52ZFhKalpVZGhjRk41YldKdmJDQTlJSFJvYVhNdVpHVm1ZWFZzZEVkaGNGTjViV0p2YkR0Y2JseHVJQ0FnSUdOdmJuTjBJRnR3Y21WbWFYZ3NJR3hsWm5SWGNtRndjR1Z5TENCeWFXZG9kRmR5WVhCd1pYSXNJSEJ2YzNSbWFYaGRJRDBnZEdocGN5NW5aWFJJWld4dFYzSmhjSEJsY25Nb0tUdGNibHh1SUNBZ0lHTnZibk4wSUc1bGQwTnZiSFZ0YmlBOUlIUm9hWE11WjJWMFRtVjNRMjlzZFcxdUtFNVBWRUZVU1U5T0xraEZURTBwTzF4dUlDQWdJQzh2SUdGemMybG5iaUIwYUdVZ2RtRnNkV1Z6SUhSdklIUm9aU0JsYlhCMGVTQmpiMngxYlc1Y2JpQWdJQ0J1WlhkRGIyeDFiVzR1YVc1cGRDZ29hV1I0T2lCdWRXMWlaWElwSUQwK0lIdGNiaUFnSUNBZ0lHTnZibk4wSUhOdmRYSmpaVkJ2YkhsdFpYSWdQU0IwYUdsekxtTnZiSFZ0Ymk1blpYUW9hV1I0S1R0Y2JpQWdJQ0FnSUhKbGRIVnliaUIwYUdsekxtTnZiblpsY25SVWIwaGxiRzFJWld4d1pYSW9jMjkxY21ObFVHOXNlVzFsY2l3Z2MyOTFjbU5sUjJGd1UzbHRZbTlzSVN3Z2NISmxabWw0TENCc1pXWjBWM0poY0hCbGNpd2djbWxuYUhSWGNtRndjR1Z5TENCd2IzTjBabWw0S1R0Y2JpQWdJQ0I5S1R0Y2JpQWdJQ0J1WlhkRGIyeDFiVzR1YzJWMFZHRm5LRVJITGxSQlIxTXVWVTVKVkZNc0lFNVBWRUZVU1U5T0xraEZURTBwTzF4dUlDQWdJSEpsZEhWeWJpQnVaWGREYjJ4MWJXNDdYRzRnSUgxY2JseHVJQ0F2S2lwY2JpQWdJQ29nUTI5dWRtVnlkQ0JUUlZCQlVrRlVUMUlnWTI5c2RXMXVJSFJ2SUVaQlUxUkJJRzV2ZEdGMGFXOXVYRzRnSUNBcVhHNGdJQ0FxSUVCd1lYSmhiU0I3YzNSeWFXNW5JSHdnYm5Wc2JIMGdabUZ6ZEdGSFlYQlRlVzFpYjJ3Z1QzQjBhVzl1WVd3Z1oyRndJSE41YldKdmJDQm1iM0lnUmtGVFZFRmNiaUFnSUNvZ1FISmxkSFZ5YmlCN1JFY3VRMjlzZFcxdWZTQWdRMjl1ZG1WeWRHVmtJR052YkhWdGJseHVJQ0FnS2k5Y2JpQWdjSEpwZG1GMFpTQmpiMjUyWlhKMFUyVndZWEpoZEc5eVZHOUdZWE4wWVNobVlYTjBZVWRoY0ZONWJXSnZiRG9nYzNSeWFXNW5JSHdnYm5Wc2JDQTlJRzUxYkd3cE9pQkVSeTVEYjJ4MWJXNGdlMXh1SUNBZ0lHbG1JQ2htWVhOMFlVZGhjRk41YldKdmJDQTlQVDBnYm5Wc2JDbGNiaUFnSUNBZ0lHWmhjM1JoUjJGd1UzbHRZbTlzSUQwZ1ZXNXBkSE5JWVc1a2JHVnlMbDlrWldaaGRXeDBSMkZ3VTNsdFltOXNjMFJwWTNRdVJrRlRWRUU3WEc1Y2JpQWdJQ0JqYjI1emRDQnVaWGREYjJ4MWJXNGdQU0IwYUdsekxtZGxkRTVsZDBOdmJIVnRiaWhPVDFSQlZFbFBUaTVHUVZOVVFTazdYRzRnSUNBZ0x5OGdZWE56YVdkdUlIUm9aU0IyWVd4MVpYTWdkRzhnZEdobElHVnRjSFI1SUdOdmJIVnRibHh1SUNBZ0lHNWxkME52YkhWdGJpNXBibWwwS0NocFpIZzZJRzUxYldKbGNpa2dQVDRnZTF4dUlDQWdJQ0FnWTI5dWMzUWdjMlZ3WVhKaGRHOXlVRzlzZVcxbGNpQTlJSFJvYVhNdVkyOXNkVzF1TG1kbGRDaHBaSGdwTzF4dUlDQWdJQ0FnTHk4Z2FYUmxiWE1nWTJGdUlHSmxJRzF2Ym05dFpYSnpJRzl5SUhObGNHRnlZWFJ2Y25OY2JpQWdJQ0FnSUdOdmJuTjBJSE5sY0dGeVlYUnZja2wwWlcxelFYSnlZWGtnUFNCMGFHbHpMbk53YkdsMGRHVnlLSE5sY0dGeVlYUnZjbEJ2YkhsdFpYSXBPMXh1SUNBZ0lDQWdZMjl1YzNRZ1ptRnpkR0ZOYjI1dmJXVnljMEZ5Y21GNU9pQnpkSEpwYm1kYlhTQTlJRnRkTzF4dUlDQWdJQ0FnWm05eUlDaHNaWFFnYVNBOUlEQTdJR2tnUENCelpYQmhjbUYwYjNKSmRHVnRjMEZ5Y21GNUxteGxibWQwYURzZ2FTc3JLU0I3WEc0Z0lDQWdJQ0FnSUdOdmJuTjBJR2wwWlcwZ1BTQnpaWEJoY21GMGIzSkpkR1Z0YzBGeWNtRjVXMmxkTzF4dUlDQWdJQ0FnSUNCcFppQW9hWFJsYlM1c1pXNW5kR2dnUFQwOUlEQXBJSHRjYmlBZ0lDQWdJQ0FnSUNCbVlYTjBZVTF2Ym05dFpYSnpRWEp5WVhrdWNIVnphQ2htWVhOMFlVZGhjRk41YldKdmJDRXBPMXh1SUNBZ0lDQWdJQ0I5SUdWc2MyVWdhV1lnS0dsMFpXMHViR1Z1WjNSb0lENGdNU2tnZTF4dUlDQWdJQ0FnSUNBZ0lDOHZJSFJvWlNCallYTmxJRzltSUdFZ2JYVnNkR2t0WTJoaGNtRmpkR1Z5SUcxdmJtOXRaWEpjYmlBZ0lDQWdJQ0FnSUNCamIyNXpkQ0J0YjI1dmJXVnlJRDBnSjFzbklDc2dhWFJsYlNBcklDZGRKenRjYmlBZ0lDQWdJQ0FnSUNCbVlYTjBZVTF2Ym05dFpYSnpRWEp5WVhrdWNIVnphQ2h0YjI1dmJXVnlLVHRjYmlBZ0lDQWdJQ0FnZlNCbGJITmxJSHRjYmlBZ0lDQWdJQ0FnSUNCbVlYTjBZVTF2Ym05dFpYSnpRWEp5WVhrdWNIVnphQ2hwZEdWdEtUdGNiaUFnSUNBZ0lDQWdmVnh1SUNBZ0lDQWdmVnh1SUNBZ0lDQWdjbVYwZFhKdUlHWmhjM1JoVFc5dWIyMWxjbk5CY25KaGVTNXFiMmx1S0NjbktUdGNiaUFnSUNCOUtUdGNiaUFnSUNCdVpYZERiMngxYlc0dWMyVjBWR0ZuS0VSSExsUkJSMU11VlU1SlZGTXNJRTVQVkVGVVNVOU9Ma1pCVTFSQktUdGNiaUFnSUNCeVpYUjFjbTRnYm1WM1EyOXNkVzF1TzF4dUlDQjlYRzVjYmlBZ0x5b3FYRzRnSUNBcUlDQkRiMjUyWlhKMElFaEZURTBnWTI5c2RXMXVJSFJ2SUVaQlUxUkJMMU5GVUVGU1FWUlBVbHh1SUNBZ0tseHVJQ0FnS2lCQWNHRnlZVzBnZTNOMGNtbHVaMzBnZEdkMFRtOTBZWFJwYjI0Z0lDQWdWR0Z5WjJWMElHNXZkR0YwYVc5dU9pQkdRVk5VUVNCdmNpQlRSVkJCVWtGVVQxSmNiaUFnSUNvZ1FIQmhjbUZ0SUh0emRISnBibWQ5SUhSbmRGTmxjR0Z5WVhSdmNpQWdJRTl3ZEdsdmJtRnNJSFJoY21kbGRDQnpaWEJoY21GMGIzSWdLR1p2Y2lCSVJVeE5JQzArWEc0Z0lDQXFJRUJ3WVhKaGJTQjdjM1J5YVc1bklId2diblZzYkgwZ2RHZDBSMkZ3VTNsdFltOXNJQ0FnVDNCMGFXOXVZV3dnZEdGeVoyVjBJR2RoY0NCemVXMWliMnhjYmlBZ0lDb2dVMFZRUVZKQlZFOVNLVnh1SUNBZ0tpQkFjbVYwZFhKdUlIdEVSeTVEYjJ4MWJXNTlJRU52Ym5abGNuUmxaQ0JqYjJ4MWJXNWNiaUFnSUNvdlhHNGdJSEJ5YVhaaGRHVWdZMjl1ZG1WeWRFaGxiRzBvZEdkMFRtOTBZWFJwYjI0NklITjBjbWx1Wnl3Z2RHZDBVMlZ3WVhKaGRHOXlQem9nYzNSeWFXNW5MQ0IwWjNSSFlYQlRlVzFpYjJ3L09pQnpkSEpwYm1jcE9pQkVSeTVEYjJ4MWJXNGdlMXh1SUNBZ0lDOHZJRlJvYVhNZ1puVnVZM1JwYjI0Z2JYVnpkQ0J1YjNRZ1kyOXVkR0ZwYmlCallXeHNjeUJ2WmlCcGMwUnVZU2dwSUdGdVpDQnBjMUp1WVNncExDQm1iM0pjYmlBZ0lDQXZMeUJ6YjNWeVkyVWdhR1ZzYlNCamIyeDFiVzV6SUcxaGVTQmpiMjUwWVdsdUlGSk9RU3dnUkU1QklHRnVaQ0JRVkNCaFkzSnZjM01nWkdsbVptVnlaVzUwSUhKdmQzTmNiaUFnSUNCcFppQW9JWFJuZEVkaGNGTjViV0p2YkNrZ2UxeHVJQ0FnSUNBZ2RHZDBSMkZ3VTNsdFltOXNJRDBnS0hSb2FYTXVkRzlHWVhOMFlTaDBaM1JPYjNSaGRHbHZiaUJoY3lCT1QxUkJWRWxQVGlrcElEOWNiaUFnSUNBZ0lDQWdWVzVwZEhOSVlXNWtiR1Z5TGw5a1pXWmhkV3gwUjJGd1UzbHRZbTlzYzBScFkzUXVSa0ZUVkVFZ09seHVJQ0FnSUNBZ0lDQlZibWwwYzBoaGJtUnNaWEl1WDJSbFptRjFiSFJIWVhCVGVXMWliMnh6UkdsamRDNVRSVkJCVWtGVVQxSTdYRzRnSUNBZ2ZWeHVYRzRnSUNBZ2FXWWdLQ0YwWjNSVFpYQmhjbUYwYjNJcElIdGNiaUFnSUNBZ0lIUm5kRk5sY0dGeVlYUnZjaUE5SUNoMGFHbHpMblJ2Um1GemRHRW9kR2QwVG05MFlYUnBiMjRnWVhNZ1RrOVVRVlJKVDA0cEtTQS9JQ2NuSURvZ2RHaHBjeTV6WlhCaGNtRjBiM0k3WEc0Z0lDQWdmVnh1WEc0Z0lDQWdZMjl1YzNRZ2FHVnNiVmR5WVhCd1pYSnpVbVVnUFNBdktGSmNYQ2g4UkZ4Y0tIeGNYQ2w4VUNrdlp6dGNiaUFnSUNCamIyNXpkQ0J1WlhkRGIyeDFiVzRnUFNCMGFHbHpMbWRsZEU1bGQwTnZiSFZ0YmloMFozUk9iM1JoZEdsdmJpQmhjeUJPVDFSQlZFbFBUaWs3WEc0Z0lDQWdMeThnWVhOemFXZHVJSFJvWlNCMllXeDFaWE1nZEc4Z2RHaGxJR1Z0Y0hSNUlHTnZiSFZ0Ymx4dUlDQWdJRzVsZDBOdmJIVnRiaTVwYm1sMEtDaHBaSGc2SUc1MWJXSmxjaWtnUFQ0Z2UxeHVJQ0FnSUNBZ1kyOXVjM1FnYUdWc2JWQnZiSGx0WlhJZ1BTQjBhR2x6TG1OdmJIVnRiaTVuWlhRb2FXUjRLVHRjYmx4dUlDQWdJQ0FnTHk4Z2QyVWdZMkZ1Ym05MElIVnpaU0JwYzBSdVlTZ3BJRzl5SUdselVtNWhLQ2tnWW1WallYVnpaU0J6YjNWeVkyVWdhR1ZzYlNCamIyeDFiVzV6SUdOaGJseHVJQ0FnSUNBZ0x5OGdZMjl1ZEdGcGJpQkVUa0VzSUZKT1FTQmhibVFnVUZRZ2FXNGdaR2xtWm1WeVpXNTBJR05sYkd4ekxDQnpieUIwYUdVZ1kyOXljbVZ6Y0c5dVpHbHVaMXh1SUNBZ0lDQWdMeThnZEdGbmN5QmpZVzV1YjNRZ1ltVWdjMlYwSUdadmNpQjBhR1VnZDJodmJHVWdZMjlzZFcxdVhHNGdJQ0FnSUNCamIyNXpkQ0JwYzA1MVkyeGxiM1JwWkdVZ1BTQm9aV3h0VUc5c2VXMWxjaTV6ZEdGeWRITlhhWFJvS0NkRVRrRW5LU0I4ZkNCb1pXeHRVRzlzZVcxbGNpNXpkR0Z5ZEhOWGFYUm9LQ2RTVGtFbktUdGNibHh1SUNBZ0lDQWdMeThnYVhSbGJYTWdZMkZ1SUdKbElHMXZibTl0WlhKeklHOXlJR2hsYkcxelhHNGdJQ0FnSUNCamIyNXpkQ0JvWld4dFNYUmxiWE5CY25KaGVTQTlJSFJvYVhNdWMzQnNhWFIwWlhJb2FHVnNiVkJ2YkhsdFpYSXBPMXh1SUNBZ0lDQWdZMjl1YzNRZ2RHZDBUVzl1YjIxbGNuTkJjbkpoZVRvZ2MzUnlhVzVuVzEwZ1BTQmJYVHRjYmlBZ0lDQWdJR1p2Y2lBb2JHVjBJR2tnUFNBd095QnBJRHdnYUdWc2JVbDBaVzF6UVhKeVlYa3ViR1Z1WjNSb095QnBLeXNwSUh0Y2JpQWdJQ0FnSUNBZ2JHVjBJR2wwWlcwZ1BTQm9aV3h0U1hSbGJYTkJjbkpoZVZ0cFhUdGNiaUFnSUNBZ0lDQWdhV1lnS0dselRuVmpiR1Z2ZEdsa1pTbGNiaUFnSUNBZ0lDQWdJQ0JwZEdWdElEMGdhWFJsYlM1eVpYQnNZV05sS0dobGJHMVhjbUZ3Y0dWeWMxSmxMQ0FuSnlrN1hHNGdJQ0FnSUNBZ0lHbG1JQ2hwZEdWdElEMDlQU0JWYm1sMGMwaGhibVJzWlhJdVgyUmxabUYxYkhSSFlYQlRlVzFpYjJ4elJHbGpkQzVJUlV4TktTQjdYRzRnSUNBZ0lDQWdJQ0FnZEdkMFRXOXViMjFsY25OQmNuSmhlUzV3ZFhOb0tIUm5kRWRoY0ZONWJXSnZiQ0VwTzF4dUlDQWdJQ0FnSUNCOUlHVnNjMlVnYVdZZ0tIUm9hWE11ZEc5R1lYTjBZU2gwWjNST2IzUmhkR2x2YmlCaGN5Qk9UMVJCVkVsUFRpa2dKaVlnYVhSbGJTNXNaVzVuZEdnZ1BpQXhLU0I3WEc0Z0lDQWdJQ0FnSUNBZ0x5OGdkR2hsSUdOaGMyVWdiMllnWVNCdGRXeDBhUzFqYUdGeVlXTjBaWElnYlc5dWIyMWxjaUJqYjI1MlpYSjBaV1FnZEc4Z1JrRlRWRUZjYmlBZ0lDQWdJQ0FnSUNCamIyNXpkQ0J0YjI1dmJXVnlJRDBnSjFzbklDc2dhWFJsYlNBcklDZGRKenRjYmlBZ0lDQWdJQ0FnSUNCMFozUk5iMjV2YldWeWMwRnljbUY1TG5CMWMyZ29iVzl1YjIxbGNpazdYRzRnSUNBZ0lDQWdJSDBnWld4elpTQjdYRzRnSUNBZ0lDQWdJQ0FnZEdkMFRXOXViMjFsY25OQmNuSmhlUzV3ZFhOb0tHbDBaVzBwTzF4dUlDQWdJQ0FnSUNCOVhHNGdJQ0FnSUNCOVhHNGdJQ0FnSUNCeVpYUjFjbTRnZEdkMFRXOXViMjFsY25OQmNuSmhlUzVxYjJsdUtIUm5kRk5sY0dGeVlYUnZjaWs3WEc0Z0lDQWdmU2s3WEc1Y2JpQWdJQ0F2THlCVVFVZFRMbUZzYVdkdVpXUWdhWE1nYldGdVpHRjBiM0o1SUdadmNpQmpiMngxYlc1eklHOW1JRTVQVkVGVVNVOU9Ma1pCVTFSQklHRnVaQ0JPVDFSQlZFbFBUaTVUUlZCQlVrRlVUMUpjYmlBZ0lDQmpiMjV6ZENCemNHeHBkSFJsY2pvZ1UzQnNhWFIwWlhKR2RXNWpJRDBnWjJWMFUzQnNhWFIwWlhKR2IzSkRiMngxYlc0b2JtVjNRMjlzZFcxdUtUdGNiaUFnSUNCamIyNXpkQ0J6ZEdGMGN6b2dVMlZ4UTI5c1UzUmhkSE1nUFNCblpYUlRkR0YwY3lodVpYZERiMngxYlc0c0lEVXNJSE53YkdsMGRHVnlLVHRjYmlBZ0lDQmpiMjV6ZENCaGJHbG5ibVZrSUQwZ2MzUmhkSE11YzJGdFpVeGxibWQwYUNBL0lDZFRSVkV1VFZOQkp5QTZJQ2RUUlZFbk8xeHVJQ0FnSUc1bGQwTnZiSFZ0Ymk1elpYUlVZV2NvVkVGSFV5NWhiR2xuYm1Wa0xDQmhiR2xuYm1Wa0tUdGNibHh1SUNBZ0lISmxkSFZ5YmlCdVpYZERiMngxYlc0N1hHNGdJSDFjYmx4dUlDQndjbWwyWVhSbElHTnZiblpsY25SSVpXeHRWRzlUWlhCaGNtRjBiM0lvS1RvZ1JFY3VRMjlzZFcxdUlIdGNiaUFnSUNBdkx5QlVUMFJQT2lCcGJYQnNaVzFsYm5SaGRHbHZjbVYwZFhKdUlIUm9hWE11WjJWMFRtVjNRMjlzZFcxdUtDazdYRzRnSUNBZ2NtVjBkWEp1SUhSb2FYTXVaMlYwVG1WM1EyOXNkVzF1S0U1UFZFRlVTVTlPTGxORlVFRlNRVlJQVWlrN1hHNGdJSDFjYmx4dUlDQXZLaW9nUkdsemNHRjBZMmhsY2lCdFpYUm9iMlFnWm05eUlHNXZkR0YwYVc5dUlHTnZiblpsY25OcGIyNWNiaUFnSUNwY2JpQWdJQ29nUUhCaGNtRnRJSHRPVDFSQlZFbFBUbjBnZEdkMFRtOTBZWFJwYjI0Z0lDQk9iM1JoZEdsdmJpQjNaU0IzWVc1MElIUnZJR052Ym5abGNuUWdkRzljYmlBZ0lDb2dRSEJoY21GdElIdHpkSEpwYm1jZ2ZDQnVkV3hzZlNCMFozUlRaWEJoY21GMGIzSWdJQ0JRYjNOemFXSnNaU0J6WlhCaGNtRjBiM0pjYmlBZ0lDb2dRSEpsZEhWeWJpQjdSRWN1UTI5c2RXMXVmU0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQkRiMjUyWlhKMFpXUWdZMjlzZFcxdVhHNGdJQ0FxTDF4dUlDQndkV0pzYVdNZ1kyOXVkbVZ5ZENoMFozUk9iM1JoZEdsdmJqb2dUazlVUVZSSlQwNHNJSFJuZEZObGNHRnlZWFJ2Y2pvZ2MzUnlhVzVuSUh3Z2JuVnNiQ0E5SUc1MWJHd3BPaUJFUnk1RGIyeDFiVzRnZTF4dUlDQWdJQzh2SUhCdmMzTnBZbXhsSUdWNFkyVndkR2x2Ym5OY2JpQWdJQ0JwWmlBb2RHaHBjeTV1YjNSaGRHbHZiaUE5UFQwZ2RHZDBUbTkwWVhScGIyNHBYRzRnSUNBZ0lDQjBhSEp2ZHlCdVpYY2dSWEp5YjNJb0ozUm5kQ0J1YjNSaGRHbHZiaUJwY3lCcGJuWmhiR2xrSnlrN1hHNGdJQ0FnYVdZZ0tIUm9hWE11ZEc5VFpYQmhjbUYwYjNJb2RHZDBUbTkwWVhScGIyNHBJQ1ltSUhSbmRGTmxjR0Z5WVhSdmNpQTlQVDBnYm5Wc2JDbGNiaUFnSUNBZ0lIUm9jbTkzSUc1bGR5QkZjbkp2Y2lnbmRHZDBJSE5sY0dGeVlYUnZjaUJwY3lCdWIzUWdjM0JsWTJsbWFXVmtKeWs3WEc1Y2JpQWdJQ0JwWmlBb2RHaHBjeTVwYzBaaGMzUmhLQ2tnSmlZZ2RHaHBjeTUwYjFObGNHRnlZWFJ2Y2loMFozUk9iM1JoZEdsdmJpa2dKaVlnZEdkMFUyVndZWEpoZEc5eUlDRTlQU0J1ZFd4c0tWeHVJQ0FnSUNBZ2NtVjBkWEp1SUhSb2FYTXVZMjl1ZG1WeWRFWmhjM1JoVkc5VFpYQmhjbUYwYjNJb2RHZDBVMlZ3WVhKaGRHOXlLVHRjYmlBZ0lDQmxiSE5sSUdsbUlDZ29kR2hwY3k1cGMwWmhjM1JoS0NrZ2ZId2dkR2hwY3k1cGMxTmxjR0Z5WVhSdmNpZ3BLU0FtSmlCMGFHbHpMblJ2U0dWc2JTaDBaM1JPYjNSaGRHbHZiaWtwWEc0Z0lDQWdJQ0J5WlhSMWNtNGdkR2hwY3k1amIyNTJaWEowVkc5SVpXeHRLQ2s3WEc0Z0lDQWdaV3h6WlNCcFppQW9kR2hwY3k1cGMxTmxjR0Z5WVhSdmNpZ3BJQ1ltSUhSb2FYTXVkRzlHWVhOMFlTaDBaM1JPYjNSaGRHbHZiaWtwWEc0Z0lDQWdJQ0J5WlhSMWNtNGdkR2hwY3k1amIyNTJaWEowVTJWd1lYSmhkRzl5Vkc5R1lYTjBZU2dwTzF4dUlDQWdJR1ZzYzJVZ2FXWWdLSFJvYVhNdWFYTklaV3h0S0NrZ0ppWWdkR2hwY3k1MGIwWmhjM1JoS0hSbmRFNXZkR0YwYVc5dUtTa2dMeThnZEdobElHTmhjMlVnYjJZZ1NFVk1UVnh1SUNBZ0lDQWdjbVYwZFhKdUlIUm9hWE11WTI5dWRtVnlkRWhsYkcwb2RHZDBUbTkwWVhScGIyNHBPMXh1SUNBZ0lHVnNjMlVnYVdZZ0tIUm9hWE11YVhOSVpXeHRLQ2tnSmlZZ2RHaHBjeTUwYjFObGNHRnlZWFJ2Y2loMFozUk9iM1JoZEdsdmJpa3BYRzRnSUNBZ0lDQnlaWFIxY200Z2RHaHBjeTVqYjI1MlpYSjBTR1ZzYlNoMFozUk9iM1JoZEdsdmJpd2dkR2QwVTJWd1lYSmhkRzl5SVNrN1hHNGdJQ0FnWld4elpWeHVJQ0FnSUNBZ2RHaHliM2NnYm1WM0lFVnljbTl5S0NkT2IzUWdjM1Z3Y0c5eWRHVmtJR052Ym5abGNuTnBiMjRnSnlBclhHNGdJQ0FnSUNBZ0lHQm1jbTl0SUhOdmRYSmpaU0J1YjNSaGRHbHZiaUFuSkh0MGFHbHpMbTV2ZEdGMGFXOXVmU2NnZEc4Z2RHRnlaMlYwSUc1dmRHRjBhVzl1SUNja2UzUm5kRTV2ZEdGMGFXOXVmU2N1WUNrN1hHNGdJSDFjYmx4dUlDQndkV0pzYVdNZ1kyOXVjM1J5ZFdOMGIzSW9ZMjlzT2lCRVJ5NURiMngxYlc0cElIdGNiaUFnSUNCemRYQmxjaWhqYjJ3cE8xeHVJQ0I5WEc1OVhHNGlYWDA9IiwiaW1wb3J0ICogYXMgREcgZnJvbSAnZGF0YWdyb2stYXBpL2RnJztcbmltcG9ydCB7IGRldGVjdEFscGhhYmV0LCBnZXRTcGxpdHRlckZvckNvbHVtbiwgZ2V0U3RhdHMsIHNwbGl0dGVyQXNGYXN0YSB9IGZyb20gJy4vbWFjcm9tb2xlY3VsZSc7XG4vKiogQ2xhc3MgZm9yIGhhbmRsaW5nIG5vdGF0aW9uIHVuaXRzIGluIE1hY3JvbW9sZWN1bGUgY29sdW1ucyAqL1xuZXhwb3J0IGNsYXNzIFVuaXRzSGFuZGxlciB7XG4gICAgc3RhdGljIHNldFVuaXRzVG9GYXN0YUNvbHVtbihjb2wpIHtcbiAgICAgICAgaWYgKGNvbC5zZW1UeXBlICE9PSBERy5TRU1UWVBFLk1BQ1JPTU9MRUNVTEUpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Zhc3RhIGNvbHVtbiBtdXN0IGJlIE1BQ1JPTU9MRUNVTEUnKTtcbiAgICAgICAgY29uc3Qgc3RhdHMgPSBnZXRTdGF0cyhjb2wsIDUsIHNwbGl0dGVyQXNGYXN0YSk7XG4gICAgICAgIGNvbnN0IGFsaWduZWQgPSBzdGF0cy5zYW1lTGVuZ3RoID8gJ1NFUS5NU0EnIDogJ1NFUSc7XG4gICAgICAgIGNvbnN0IGFscGhhYmV0ID0gZGV0ZWN0QWxwaGFiZXQoc3RhdHMpO1xuICAgICAgICBjb2wuc2V0VGFnKERHLlRBR1MuVU5JVFMsIFwiZmFzdGFcIiAvKiBOT1RBVElPTi5GQVNUQSAqLyk7XG4gICAgICAgIGNvbC5zZXRUYWcoXCJhbGlnbmVkXCIgLyogVEFHUy5hbGlnbmVkICovLCBhbGlnbmVkKTtcbiAgICAgICAgY29sLnNldFRhZyhcImFscGhhYmV0XCIgLyogVEFHUy5hbHBoYWJldCAqLywgYWxwaGFiZXQpO1xuICAgIH1cbiAgICBnZXQgdW5pdHMoKSB7IHJldHVybiB0aGlzLl91bml0czsgfVxuICAgIGdldCBjb2x1bW4oKSB7IHJldHVybiB0aGlzLl9jb2x1bW47IH1cbiAgICBnZXQgbm90YXRpb24oKSB7IHJldHVybiB0aGlzLl9ub3RhdGlvbjsgfVxuICAgIGdldCBkZWZhdWx0R2FwU3ltYm9sKCkgeyByZXR1cm4gdGhpcy5fZGVmYXVsdEdhcFN5bWJvbDsgfVxuICAgIGdldCBzZXBhcmF0b3IoKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgY29uc3Qgc2VwYXJhdG9yID0gKF9hID0gdGhpcy5jb2x1bW4uZ2V0VGFnKFwic2VwYXJhdG9yXCIgLyogVEFHUy5zZXBhcmF0b3IgKi8pKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiB1bmRlZmluZWQ7XG4gICAgICAgIGlmICh0aGlzLm5vdGF0aW9uID09PSBcInNlcGFyYXRvclwiIC8qIE5PVEFUSU9OLlNFUEFSQVRPUiAqLyAmJiBzZXBhcmF0b3IgPT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgU2VwYXJhdG9yIGlzIG1hbmRhdG9yeSAgZm9yIGNvbHVtbiAnJHt0aGlzLmNvbHVtbi5uYW1lfScgb2Ygbm90YXRpb24gJyR7dGhpcy5ub3RhdGlvbn0nLmApO1xuICAgICAgICByZXR1cm4gc2VwYXJhdG9yO1xuICAgIH1cbiAgICBnZXQgYWxpZ25lZCgpIHtcbiAgICAgICAgY29uc3QgYWxpZ25lZCA9IHRoaXMuY29sdW1uLmdldFRhZyhcImFsaWduZWRcIiAvKiBUQUdTLmFsaWduZWQgKi8pO1xuICAgICAgICAvLyBUQUdTLmFsaWduZWQgaXMgbWFuZGF0b3J5IGZvciBjb2x1bW5zIG9mIE5PVEFUSU9OLkZBU1RBIGFuZCBOT1RBVElPTi5TRVBBUkFUT1JcbiAgICAgICAgaWYgKCFhbGlnbmVkICYmICh0aGlzLmlzRmFzdGEoKSB8fCB0aGlzLmlzU2VwYXJhdG9yKCkpKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdUYWcgYWxpZ25lZCBub3Qgc2V0Jyk7XG4gICAgICAgIHJldHVybiBhbGlnbmVkO1xuICAgIH1cbiAgICAvKiogQWxwaGFiZXQgbmFtZSAodXBwZXIgY2FzZSkgKi9cbiAgICBnZXQgYWxwaGFiZXQoKSB7XG4gICAgICAgIGNvbnN0IGFscGhhYmV0ID0gdGhpcy5jb2x1bW4uZ2V0VGFnKFwiYWxwaGFiZXRcIiAvKiBUQUdTLmFscGhhYmV0ICovKTtcbiAgICAgICAgLy8gVEFHUy5hbHBoYWJldCBpcyBtYW5kYXRvcnkgZm9yIGNvbHVtbnMgb2YgTk9UQVRJT04uRkFTVEEgYW5kIE5PVEFUSU9OLlNFUEFSQVRPUlxuICAgICAgICBpZiAoIWFscGhhYmV0ICYmICh0aGlzLmlzRmFzdGEoKSB8fCB0aGlzLmlzU2VwYXJhdG9yKCkpKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdUYWcgYWxwaGFiZXQgbm90IHNldCcpO1xuICAgICAgICByZXR1cm4gYWxwaGFiZXQ7XG4gICAgfVxuICAgIGdldEFscGhhYmV0U2l6ZSgpIHtcbiAgICAgICAgaWYgKHRoaXMubm90YXRpb24gPT0gXCJoZWxtXCIgLyogTk9UQVRJT04uSEVMTSAqLyB8fCB0aGlzLmFscGhhYmV0ID09IFwiVU5cIiAvKiBBTFBIQUJFVC5VTiAqLykge1xuICAgICAgICAgICAgY29uc3QgYWxwaGFiZXRTaXplU3RyID0gdGhpcy5jb2x1bW4uZ2V0VGFnKFwiLmFscGhhYmV0U2l6ZVwiIC8qIFRBR1MuYWxwaGFiZXRTaXplICovKTtcbiAgICAgICAgICAgIGxldCBhbHBoYWJldFNpemU7XG4gICAgICAgICAgICBpZiAoYWxwaGFiZXRTaXplU3RyKSB7XG4gICAgICAgICAgICAgICAgYWxwaGFiZXRTaXplID0gcGFyc2VJbnQoYWxwaGFiZXRTaXplU3RyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIGNhbGN1bGF0ZSBhbHBoYWJldFNpemUgb24gZGVtYW5kXG4gICAgICAgICAgICAgICAgY29uc3Qgc3BsaXR0ZXIgPSBnZXRTcGxpdHRlckZvckNvbHVtbih0aGlzLmNvbHVtbik7XG4gICAgICAgICAgICAgICAgY29uc3Qgc3RhdHMgPSBnZXRTdGF0cyh0aGlzLmNvbHVtbiwgMSwgc3BsaXR0ZXIpO1xuICAgICAgICAgICAgICAgIGFscGhhYmV0U2l6ZSA9IE9iamVjdC5rZXlzKHN0YXRzLmZyZXEpLmxlbmd0aDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBhbHBoYWJldFNpemU7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBzd2l0Y2ggKHRoaXMuYWxwaGFiZXQpIHtcbiAgICAgICAgICAgICAgICBjYXNlIFwiUFRcIiAvKiBBTFBIQUJFVC5QVCAqLzpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDIwO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJETkFcIiAvKiBBTFBIQUJFVC5ETkEgKi86XG4gICAgICAgICAgICAgICAgY2FzZSBcIlJOQVwiIC8qIEFMUEhBQkVULlJOQSAqLzpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDQ7XG4gICAgICAgICAgICAgICAgY2FzZSAnTlQnOlxuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oYFVuZXhwZWN0ZWQgYWxwaGFiZXQgJ05UJy5gKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDQ7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmV4cGVjdGVkIGFscGhhYmV0ICcke3RoaXMuYWxwaGFiZXR9Jy5gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBnZXRBbHBoYWJldElzTXVsdGljaGFyKCkge1xuICAgICAgICBpZiAodGhpcy5ub3RhdGlvbiA9PSBcImhlbG1cIiAvKiBOT1RBVElPTi5IRUxNICovIHx8IHRoaXMuYWxwaGFiZXQgPT0gXCJVTlwiIC8qIEFMUEhBQkVULlVOICovKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29sdW1uLmdldFRhZyhcIi5hbHBoYWJldElzTXVsdGljaGFyXCIgLyogVEFHUy5hbHBoYWJldElzTXVsdGljaGFyICovKSA9PSAndHJ1ZSc7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaXNGYXN0YSgpIHsgcmV0dXJuIHRoaXMubm90YXRpb24gPT09IFwiZmFzdGFcIiAvKiBOT1RBVElPTi5GQVNUQSAqLzsgfVxuICAgIGlzU2VwYXJhdG9yKCkgeyByZXR1cm4gdGhpcy5ub3RhdGlvbiA9PT0gXCJzZXBhcmF0b3JcIiAvKiBOT1RBVElPTi5TRVBBUkFUT1IgKi87IH1cbiAgICBpc0hlbG0oKSB7IHJldHVybiB0aGlzLm5vdGF0aW9uID09PSBcImhlbG1cIiAvKiBOT1RBVElPTi5IRUxNICovOyB9XG4gICAgaXNSbmEoKSB7IHJldHVybiB0aGlzLmFscGhhYmV0ID09PSBcIlJOQVwiIC8qIEFMUEhBQkVULlJOQSAqLzsgfVxuICAgIGlzRG5hKCkgeyByZXR1cm4gdGhpcy5hbHBoYWJldCA9PT0gXCJETkFcIiAvKiBBTFBIQUJFVC5ETkEgKi87IH1cbiAgICBpc1BlcHRpZGUoKSB7IHJldHVybiB0aGlzLmFscGhhYmV0ID09PSBcIlBUXCIgLyogQUxQSEFCRVQuUFQgKi87IH1cbiAgICBpc01zYSgpIHsgcmV0dXJuIHRoaXMuYWxpZ25lZCA/IHRoaXMuYWxpZ25lZC50b1VwcGVyQ2FzZSgpLmluY2x1ZGVzKCdNU0EnKSA6IGZhbHNlOyB9XG4gICAgLyoqIEFzc29jaWF0ZSBub3RhdGlvbiB0eXBlcyB3aXRoIHRoZSBjb3JyZXNwb25kaW5nIHVuaXRzICovXG4gICAgLyoqXG4gICAgICogQHJldHVybiB7Tk9UQVRJT059ICAgICBOb3RhdGlvbiBhc3NvY2lhdGVkIHdpdGggdGhlIHVuaXRzIHR5cGVcbiAgICAgKi9cbiAgICBnZXROb3RhdGlvbigpIHtcbiAgICAgICAgaWYgKHRoaXMudW5pdHMudG9Mb3dlckNhc2UoKS5zdGFydHNXaXRoKFwiZmFzdGFcIiAvKiBOT1RBVElPTi5GQVNUQSAqLykpXG4gICAgICAgICAgICByZXR1cm4gXCJmYXN0YVwiIC8qIE5PVEFUSU9OLkZBU1RBICovO1xuICAgICAgICBlbHNlIGlmICh0aGlzLnVuaXRzLnRvTG93ZXJDYXNlKCkuc3RhcnRzV2l0aChcInNlcGFyYXRvclwiIC8qIE5PVEFUSU9OLlNFUEFSQVRPUiAqLykpXG4gICAgICAgICAgICByZXR1cm4gXCJzZXBhcmF0b3JcIiAvKiBOT1RBVElPTi5TRVBBUkFUT1IgKi87XG4gICAgICAgIGVsc2UgaWYgKHRoaXMudW5pdHMudG9Mb3dlckNhc2UoKS5zdGFydHNXaXRoKFwiaGVsbVwiIC8qIE5PVEFUSU9OLkhFTE0gKi8pKVxuICAgICAgICAgICAgcmV0dXJuIFwiaGVsbVwiIC8qIE5PVEFUSU9OLkhFTE0gKi87XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQ29sdW1uICcke3RoaXMuY29sdW1uLm5hbWV9JyBoYXMgdW5leHBlY3RlZCBub3RhdGlvbiAnJHt0aGlzLnVuaXRzfScuYCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENyZWF0ZSBhIG5ldyBlbXB0eSBjb2x1bW4gb2YgdGhlIHNwZWNpZmllZCBub3RhdGlvbiB0eXBlIGFuZCB0aGUgc2FtZVxuICAgICAqIGxlbmd0aCBhcyBjb2x1bW5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7Tk9UQVRJT059IHRhcmdldE5vdGF0aW9uXG4gICAgICogQHJldHVybiB7REcuQ29sdW1ufVxuICAgICAqL1xuICAgIGdldE5ld0NvbHVtbih0YXJnZXROb3RhdGlvbikge1xuICAgICAgICBjb25zdCBjb2wgPSB0aGlzLmNvbHVtbjtcbiAgICAgICAgY29uc3QgbGVuID0gY29sLmxlbmd0aDtcbiAgICAgICAgY29uc3QgbmFtZSA9IHRhcmdldE5vdGF0aW9uLnRvTG93ZXJDYXNlKCkgKyAnKCcgKyBjb2wubmFtZSArICcpJztcbiAgICAgICAgY29uc3QgbmV3Q29sTmFtZSA9IGNvbC5kYXRhRnJhbWUuY29sdW1ucy5nZXRVbnVzZWROYW1lKG5hbWUpO1xuICAgICAgICBjb25zdCBuZXdDb2x1bW4gPSBERy5Db2x1bW4uZnJvbUxpc3QoJ3N0cmluZycsIG5ld0NvbE5hbWUsIG5ldyBBcnJheShsZW4pLmZpbGwoJycpKTtcbiAgICAgICAgbmV3Q29sdW1uLnNlbVR5cGUgPSBERy5TRU1UWVBFLk1BQ1JPTU9MRUNVTEU7XG4gICAgICAgIG5ld0NvbHVtbi5zZXRUYWcoREcuVEFHUy5VTklUUywgdGFyZ2V0Tm90YXRpb24pO1xuICAgICAgICBuZXdDb2x1bW4uc2V0VGFnKERHLlRBR1MuQ0VMTF9SRU5ERVJFUiwgJ01hY3JvbW9sZWN1bGUnKTtcbiAgICAgICAgY29uc3Qgc3JjQWxpZ25lZCA9IGNvbC5nZXRUYWcoXCJhbGlnbmVkXCIgLyogVEFHUy5hbGlnbmVkICovKTtcbiAgICAgICAgaWYgKHNyY0FsaWduZWQpXG4gICAgICAgICAgICBuZXdDb2x1bW4uc2V0VGFnKFwiYWxpZ25lZFwiIC8qIFRBR1MuYWxpZ25lZCAqLywgc3JjQWxpZ25lZCk7XG4gICAgICAgIGNvbnN0IHNyY0FscGhhYmV0ID0gY29sLmdldFRhZyhcImFscGhhYmV0XCIgLyogVEFHUy5hbHBoYWJldCAqLyk7XG4gICAgICAgIGlmIChzcmNBbHBoYWJldClcbiAgICAgICAgICAgIG5ld0NvbHVtbi5zZXRUYWcoXCJhbHBoYWJldFwiIC8qIFRBR1MuYWxwaGFiZXQgKi8sIHNyY0FscGhhYmV0KTtcbiAgICAgICAgbGV0IHNyY0FscGhhYmV0U2l6ZSA9IGNvbC5nZXRUYWcoXCIuYWxwaGFiZXRTaXplXCIgLyogVEFHUy5hbHBoYWJldFNpemUgKi8pO1xuICAgICAgICBpZiAoc3JjQWxwaGFiZXRTaXplKVxuICAgICAgICAgICAgbmV3Q29sdW1uLnNldFRhZyhcIi5hbHBoYWJldFNpemVcIiAvKiBUQUdTLmFscGhhYmV0U2l6ZSAqLywgc3JjQWxwaGFiZXRTaXplKTtcbiAgICAgICAgY29uc3Qgc3JjQWxwaGFiZXRJc011bHRpY2hhciA9IGNvbC5nZXRUYWcoXCIuYWxwaGFiZXRJc011bHRpY2hhclwiIC8qIFRBR1MuYWxwaGFiZXRJc011bHRpY2hhciAqLyk7XG4gICAgICAgIGlmIChzcmNBbHBoYWJldElzTXVsdGljaGFyICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICBuZXdDb2x1bW4uc2V0VGFnKFwiLmFscGhhYmV0SXNNdWx0aWNoYXJcIiAvKiBUQUdTLmFscGhhYmV0SXNNdWx0aWNoYXIgKi8sIHNyY0FscGhhYmV0SXNNdWx0aWNoYXIpO1xuICAgICAgICBpZiAodGFyZ2V0Tm90YXRpb24gPT0gXCJoZWxtXCIgLyogTk9UQVRJT04uSEVMTSAqLykge1xuICAgICAgICAgICAgc3JjQWxwaGFiZXRTaXplID0gdGhpcy5nZXRBbHBoYWJldFNpemUoKS50b1N0cmluZygpO1xuICAgICAgICAgICAgbmV3Q29sdW1uLnNldFRhZyhcIi5hbHBoYWJldFNpemVcIiAvKiBUQUdTLmFscGhhYmV0U2l6ZSAqLywgc3JjQWxwaGFiZXRTaXplKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3Q29sdW1uO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDcmVhdGUgYSBuZXcgZW1wdHkgY29sdW1uIHVzaW5nIHRlbXBsYXRlQ29sIGFzIGEgdGVtcGxhdGVcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7REcuQ29sdW1ufSB0ZW1wbGF0ZUNvbCAgdGhlIHByb3BlcnRpZXMgYW5kIHVuaXRzIG9mIHRoaXMgY29sdW1uIGFyZSB1c2VkIGFzIGFcbiAgICAgKiB0ZW1wbGF0ZSB0byBidWlsZCB0aGUgbmV3IG9uZVxuICAgICAqIEByZXR1cm4ge0RHLkNvbHVtbn1cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0TmV3Q29sdW1uKHRlbXBsYXRlQ29sKSB7XG4gICAgICAgIGNvbnN0IGNvbCA9IG5ldyBVbml0c0hhbmRsZXIodGVtcGxhdGVDb2wpO1xuICAgICAgICBjb25zdCB0YXJnZXROb3RhdGlvbiA9IGNvbC5ub3RhdGlvbjtcbiAgICAgICAgcmV0dXJuIGNvbC5nZXROZXdDb2x1bW4odGFyZ2V0Tm90YXRpb24pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBIGhlbHBlciBmdW5jdGlvbiBjaGVja2luZyB0aGUgdmFsaWRpdHkgb2YgdGhlICd1bml0cycgc3RyaW5nXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdW5pdHMgIHRoZSBzdHJpbmcgdG8gYmUgdmFsaWRhdGVkXG4gICAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICAgKi9cbiAgICBzdGF0aWMgdW5pdHNTdHJpbmdJc1ZhbGlkKHVuaXRzKSB7XG4gICAgICAgIHVuaXRzID0gdW5pdHMudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgY29uc3QgcHJlZml4ZXMgPSBbXCJmYXN0YVwiIC8qIE5PVEFUSU9OLkZBU1RBICovLCBcInNlcGFyYXRvclwiIC8qIE5PVEFUSU9OLlNFUEFSQVRPUiAqLywgXCJoZWxtXCIgLyogTk9UQVRJT04uSEVMTSAqL107XG4gICAgICAgIGNvbnN0IHBvc3RmaXhlcyA9IFsncm5hJywgJ2RuYScsICdwdCddO1xuICAgICAgICBjb25zdCBwcmVmaXhDcml0ZXJpb24gPSBwcmVmaXhlcy5zb21lKChwKSA9PiB1bml0cy5zdGFydHNXaXRoKHAudG9Mb3dlckNhc2UoKSkpO1xuICAgICAgICByZXR1cm4gcHJlZml4Q3JpdGVyaW9uO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDb25zdHJ1Y3QgYSBuZXcgY29sdW1uIG9mIHNlbWFudGljIHR5cGUgTUFDUk9NT0xFQ1VMRSBmcm9tIHRoZSBsaXN0IG9mXG4gICAgICogc3BlY2lmaWVkIHBhcmFtZXRlcnNcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSAgICBsZW4gIHRoZSBsZW5ndGggb2YgdGhlIG5ldyBjb2x1bW5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gICAgbmFtZSAgdGhlIG5hbWUgb2YgdGhlIG5ldyBjb2x1bW5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gICAgdW5pdHMgIHRoZSB1bml0cyBvZiB0aGUgbmV3IGNvbHVtblxuICAgICAqIEByZXR1cm4ge0RHLkNvbHVtbn1cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0TmV3Q29sdW1uRnJvbVBhcmFtcyhsZW4sIG5hbWUsIHVuaXRzKSB7XG4gICAgICAgIC8vIFdBUk5JTkc6IGluIHRoaXMgaW1wbGVtZW50YXRpb24gaXMgaXMgaW1wb3NzaWJsZSB0byB2ZXJpZnkgdGhlIHVuaXF1ZW5lc3NcbiAgICAgICAgLy8gb2YgdGhlIG5ldyBjb2x1bW4ncyBuYW1lXG4gICAgICAgIC8vIFRPRE86IHZlcmlmeSB0aGUgdmFsaWRpdHkgb2YgdW5pdHMgcGFyYW1ldGVyXG4gICAgICAgIGlmICghVW5pdHNIYW5kbGVyLnVuaXRzU3RyaW5nSXNWYWxpZCh1bml0cykpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgZm9ybWF0IG9mIFxcJ3VuaXRzXFwnIHBhcmFtZXRlcicpO1xuICAgICAgICBjb25zdCBuZXdDb2x1bW4gPSBERy5Db2x1bW4uZnJvbUxpc3QoJ3N0cmluZycsIG5hbWUsIG5ldyBBcnJheShsZW4pLmZpbGwoJycpKTtcbiAgICAgICAgbmV3Q29sdW1uLnNlbVR5cGUgPSBERy5TRU1UWVBFLk1BQ1JPTU9MRUNVTEU7XG4gICAgICAgIG5ld0NvbHVtbi5zZXRUYWcoREcuVEFHUy5VTklUUywgdW5pdHMpO1xuICAgICAgICByZXR1cm4gbmV3Q29sdW1uO1xuICAgIH1cbiAgICBjb25zdHJ1Y3Rvcihjb2wpIHtcbiAgICAgICAgdGhpcy5fY29sdW1uID0gY29sO1xuICAgICAgICBjb25zdCB1bml0cyA9IHRoaXMuX2NvbHVtbi50YWdzW0RHLlRBR1MuVU5JVFNdO1xuICAgICAgICBpZiAodW5pdHMgIT09IG51bGwpXG4gICAgICAgICAgICB0aGlzLl91bml0cyA9IHVuaXRzO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VuaXRzIGFyZSBub3Qgc3BlY2lmaWVkIGluIGNvbHVtbicpO1xuICAgICAgICB0aGlzLl9ub3RhdGlvbiA9IHRoaXMuZ2V0Tm90YXRpb24oKTtcbiAgICAgICAgdGhpcy5fZGVmYXVsdEdhcFN5bWJvbCA9ICh0aGlzLmlzRmFzdGEoKSkgPyBVbml0c0hhbmRsZXIuX2RlZmF1bHRHYXBTeW1ib2xzRGljdC5GQVNUQSA6XG4gICAgICAgICAgICAodGhpcy5pc0hlbG0oKSkgPyBVbml0c0hhbmRsZXIuX2RlZmF1bHRHYXBTeW1ib2xzRGljdC5IRUxNIDpcbiAgICAgICAgICAgICAgICBVbml0c0hhbmRsZXIuX2RlZmF1bHRHYXBTeW1ib2xzRGljdC5TRVBBUkFUT1I7XG4gICAgICAgIGlmICghdGhpcy5jb2x1bW4udGFncy5oYXMoXCJhbGlnbmVkXCIgLyogVEFHUy5hbGlnbmVkICovKSkge1xuICAgICAgICAgICAgaWYgKHRoaXMuaXNGYXN0YSgpIHx8IHRoaXMuaXNTZXBhcmF0b3IoKSlcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEZvciBjb2x1bW4gJyR7dGhpcy5jb2x1bW4ubmFtZX0nIG9mIG5vdGF0aW9uICcke3RoaXMubm90YXRpb259JyBgICtcbiAgICAgICAgICAgICAgICAgICAgYHRhZyAnJHtcImFsaWduZWRcIiAvKiBUQUdTLmFsaWduZWQgKi99JyBpcyBtYW5kYXRvcnkuYCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gaWYgKCF0aGlzLmNvbHVtbi50YWdzLmhhcyhUQUdTLmFscGhhYmV0U2l6ZSkpIHtcbiAgICAgICAgLy8gICBpZiAodGhpcy5pc0hlbG0oKSlcbiAgICAgICAgLy8gICAgIHRocm93IG5ldyBFcnJvcihgRm9yIGNvbHVtbiAnJHt0aGlzLmNvbHVtbi5uYW1lfScgb2Ygbm90YXRpb24gJyR7dGhpcy5ub3RhdGlvbn0nIGAgK1xuICAgICAgICAvLyAgICAgICBgdGFnICcke1RBR1MuYWxwaGFiZXRTaXplfScgaXMgbWFuZGF0b3J5LmApO1xuICAgICAgICAvLyAgIGVsc2UgaWYgKFsnVU4nXS5pbmNsdWRlcyh0aGlzLmFscGhhYmV0KSlcbiAgICAgICAgLy8gICAgIHRocm93IG5ldyBFcnJvcihgRm9yIGNvbHVtbiAnJHt0aGlzLmNvbHVtbi5uYW1lfScgb2YgYWxwaGFiZXQgJyR7dGhpcy5hbHBoYWJldH0nIGAgK1xuICAgICAgICAvLyAgICAgICBgdGFnICcke1RBR1MuYWxwaGFiZXRTaXplfScgaXMgbWFuZGF0b3J5LmApO1xuICAgICAgICAvLyB9XG4gICAgICAgIGlmICghdGhpcy5jb2x1bW4udGFncy5oYXMoXCIuYWxwaGFiZXRJc011bHRpY2hhclwiIC8qIFRBR1MuYWxwaGFiZXRJc011bHRpY2hhciAqLykpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmlzSGVsbSgpKVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRm9yIGNvbHVtbiAnJHt0aGlzLmNvbHVtbi5uYW1lfScgb2Ygbm90YXRpb24gJyR7dGhpcy5ub3RhdGlvbn0nIGAgK1xuICAgICAgICAgICAgICAgICAgICBgdGFnICcke1wiLmFscGhhYmV0SXNNdWx0aWNoYXJcIiAvKiBUQUdTLmFscGhhYmV0SXNNdWx0aWNoYXIgKi99JyBpcyBtYW5kYXRvcnkuYCk7XG4gICAgICAgICAgICBlbHNlIGlmIChbJ1VOJ10uaW5jbHVkZXModGhpcy5hbHBoYWJldCkpXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBGb3IgY29sdW1uICcke3RoaXMuY29sdW1uLm5hbWV9JyBvZiBhbHBoYWJldCAnJHt0aGlzLmFscGhhYmV0fScgYCArXG4gICAgICAgICAgICAgICAgICAgIGB0YWcgJyR7XCIuYWxwaGFiZXRJc011bHRpY2hhclwiIC8qIFRBR1MuYWxwaGFiZXRJc011bHRpY2hhciAqL30nIGlzIG1hbmRhdG9yeS5gKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblVuaXRzSGFuZGxlci5fZGVmYXVsdEdhcFN5bWJvbHNEaWN0ID0ge1xuICAgIEhFTE06ICcqJyxcbiAgICBTRVBBUkFUT1I6ICcnLFxuICAgIEZBU1RBOiAnLScsXG59O1xuVW5pdHNIYW5kbGVyLlBlcHRpZGVGYXN0YUFscGhhYmV0ID0gbmV3IFNldChbXG4gICAgJ0cnLCAnTCcsICdZJywgJ1MnLCAnRScsICdRJywgJ0QnLCAnTicsICdGJywgJ0EnLFxuICAgICdLJywgJ1InLCAnSCcsICdDJywgJ1YnLCAnUCcsICdXJywgJ0knLCAnTScsICdUJyxcbl0pO1xuVW5pdHNIYW5kbGVyLkRuYUZhc3RhQWxwaGFiZXQgPSBuZXcgU2V0KFsnQScsICdDJywgJ0cnLCAnVCddKTtcblVuaXRzSGFuZGxlci5SbmFGYXN0YUFscGhhYmV0ID0gbmV3IFNldChbJ0EnLCAnQycsICdHJywgJ1UnXSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1kYXRhOmFwcGxpY2F0aW9uL2pzb247YmFzZTY0LGV5SjJaWEp6YVc5dUlqb3pMQ0ptYVd4bElqb2lkVzVwZEhNdGFHRnVaR3hsY2k1cWN5SXNJbk52ZFhKalpWSnZiM1FpT2lJaUxDSnpiM1Z5WTJWeklqcGJJblZ1YVhSekxXaGhibVJzWlhJdWRITWlYU3dpYm1GdFpYTWlPbHRkTENKdFlYQndhVzVuY3lJNklrRkJRVUVzVDBGQlR5eExRVUZMTEVWQlFVVXNUVUZCVFN4cFFrRkJhVUlzUTBGQlF6dEJRVVYwUXl4UFFVRlBMRVZCUlV3c1kwRkJZeXhGUVVOa0xHOUNRVUZ2UWl4RlFVTndRaXhSUVVGUkxFVkJSMUlzWlVGQlpTeEZRVWRvUWl4TlFVRk5MR2xDUVVGcFFpeERRVUZETzBGQlJYcENMR2xGUVVGcFJUdEJRVU5xUlN4TlFVRk5MRTlCUVU4c1dVRkJXVHRKUVd0Q2FFSXNUVUZCVFN4RFFVRkRMSEZDUVVGeFFpeERRVUZETEVkQlFXTTdVVUZEYUVRc1NVRkJTU3hIUVVGSExFTkJRVU1zVDBGQlR5eExRVUZMTEVWQlFVVXNRMEZCUXl4UFFVRlBMRU5CUVVNc1lVRkJZVHRaUVVNeFF5eE5RVUZOTEVsQlFVa3NTMEZCU3l4RFFVRkRMRzlEUVVGdlF5eERRVUZETEVOQlFVTTdVVUZGZUVRc1RVRkJUU3hMUVVGTExFZEJRV2RDTEZGQlFWRXNRMEZCUXl4SFFVRkhMRVZCUVVVc1EwRkJReXhGUVVGRkxHVkJRV1VzUTBGQlF5eERRVUZETzFGQlF6ZEVMRTFCUVUwc1QwRkJUeXhIUVVGSExFdEJRVXNzUTBGQlF5eFZRVUZWTEVOQlFVTXNRMEZCUXl4RFFVRkRMRk5CUVZNc1EwRkJReXhEUVVGRExFTkJRVU1zUzBGQlN5eERRVUZETzFGQlEzSkVMRTFCUVUwc1VVRkJVU3hIUVVGSExHTkJRV01zUTBGQlF5eExRVUZMTEVOQlFVTXNRMEZCUXp0UlFVVjJReXhIUVVGSExFTkJRVU1zVFVGQlRTeERRVUZETEVWQlFVVXNRMEZCUXl4SlFVRkpMRU5CUVVNc1MwRkJTeXdyUWtGQmFVSXNRMEZCUXp0UlFVTXhReXhIUVVGSExFTkJRVU1zVFVGQlRTd3JRa0ZCWlN4UFFVRlBMRU5CUVVNc1EwRkJRenRSUVVOc1F5eEhRVUZITEVOQlFVTXNUVUZCVFN4cFEwRkJaMElzVVVGQlVTeERRVUZETEVOQlFVTTdTVUZEZEVNc1EwRkJRenRKUVVWRUxFbEJRV01zUzBGQlN5eExRVUZoTEU5QlFVOHNTVUZCU1N4RFFVRkRMRTFCUVUwc1EwRkJReXhEUVVGRExFTkJRVU03U1VGRmNrUXNTVUZCWXl4TlFVRk5MRXRCUVdkQ0xFOUJRVThzU1VGQlNTeERRVUZETEU5QlFVOHNRMEZCUXl4RFFVRkRMRU5CUVVNN1NVRkZNVVFzU1VGQlZ5eFJRVUZSTEV0QlFXVXNUMEZCVHl4SlFVRkpMRU5CUVVNc1UwRkJVeXhEUVVGRExFTkJRVU1zUTBGQlF6dEpRVVV4UkN4SlFVRlhMR2RDUVVGblFpeExRVUZoTEU5QlFVOHNTVUZCU1N4RFFVRkRMR2xDUVVGcFFpeERRVUZETEVOQlFVTXNRMEZCUXp0SlFVVjRSU3hKUVVGWExGTkJRVk03TzFGQlEyeENMRTFCUVUwc1UwRkJVeXhIUVVGMVFpeE5RVUZCTEVsQlFVa3NRMEZCUXl4TlFVRk5MRU5CUVVNc1RVRkJUU3hyUTBGQlowSXNiVU5CUVVrc1UwRkJVeXhEUVVGRE8xRkJRM1JHTEVsQlFVa3NTVUZCU1N4RFFVRkRMRkZCUVZFc2VVTkJRWFZDTEVsQlFVa3NVMEZCVXl4TFFVRkxMRk5CUVZNN1dVRkRha1VzVFVGQlRTeEpRVUZKTEV0QlFVc3NRMEZCUXl4MVEwRkJkVU1zU1VGQlNTeERRVUZETEUxQlFVMHNRMEZCUXl4SlFVRkpMR3RDUVVGclFpeEpRVUZKTEVOQlFVTXNVVUZCVVN4SlFVRkpMRU5CUVVNc1EwRkJRenRSUVVNNVJ5eFBRVUZQTEZOQlFWTXNRMEZCUXp0SlFVTnVRaXhEUVVGRE8wbEJSVVFzU1VGQlZ5eFBRVUZQTzFGQlEyaENMRTFCUVUwc1QwRkJUeXhIUVVGSExFbEJRVWtzUTBGQlF5eE5RVUZOTEVOQlFVTXNUVUZCVFN3NFFrRkJZeXhEUVVGRE8xRkJSV3BFTEdsR1FVRnBSanRSUVVOcVJpeEpRVUZKTEVOQlFVTXNUMEZCVHl4SlFVRkpMRU5CUVVNc1NVRkJTU3hEUVVGRExFOUJRVThzUlVGQlJTeEpRVUZKTEVsQlFVa3NRMEZCUXl4WFFVRlhMRVZCUVVVc1EwRkJRenRaUVVOd1JDeE5RVUZOTEVsQlFVa3NTMEZCU3l4RFFVRkRMSEZDUVVGeFFpeERRVUZETEVOQlFVTTdVVUZGZWtNc1QwRkJUeXhQUVVGUExFTkJRVU03U1VGRGFrSXNRMEZCUXp0SlFVVkVMR2xEUVVGcFF6dEpRVU5xUXl4SlFVRlhMRkZCUVZFN1VVRkRha0lzVFVGQlRTeFJRVUZSTEVkQlFVY3NTVUZCU1N4RFFVRkRMRTFCUVUwc1EwRkJReXhOUVVGTkxHZERRVUZsTEVOQlFVTTdVVUZGYmtRc2EwWkJRV3RHTzFGQlEyeEdMRWxCUVVrc1EwRkJReXhSUVVGUkxFbEJRVWtzUTBGQlF5eEpRVUZKTEVOQlFVTXNUMEZCVHl4RlFVRkZMRWxCUVVrc1NVRkJTU3hEUVVGRExGZEJRVmNzUlVGQlJTeERRVUZETzFsQlEzSkVMRTFCUVUwc1NVRkJTU3hMUVVGTExFTkJRVU1zYzBKQlFYTkNMRU5CUVVNc1EwRkJRenRSUVVVeFF5eFBRVUZQTEZGQlFWRXNRMEZCUXp0SlFVTnNRaXhEUVVGRE8wbEJSVTBzWlVGQlpUdFJRVU53UWl4SlFVRkpMRWxCUVVrc1EwRkJReXhSUVVGUkxEaENRVUZwUWl4SlFVRkpMRWxCUVVrc1EwRkJReXhSUVVGUkxEQkNRVUZsTEVWQlFVVTdXVUZEYkVVc1RVRkJUU3hsUVVGbExFZEJRVWNzU1VGQlNTeERRVUZETEUxQlFVMHNRMEZCUXl4TlFVRk5MSGxEUVVGdFFpeERRVUZETzFsQlF6bEVMRWxCUVVrc1dVRkJiMElzUTBGQlF6dFpRVU42UWl4SlFVRkpMR1ZCUVdVc1JVRkJSVHRuUWtGRGJrSXNXVUZCV1N4SFFVRkhMRkZCUVZFc1EwRkJReXhsUVVGbExFTkJRVU1zUTBGQlF6dGhRVU14UXp0cFFrRkJUVHRuUWtGRFRDeHRRMEZCYlVNN1owSkJRMjVETEUxQlFVMHNVVUZCVVN4SFFVRnBRaXh2UWtGQmIwSXNRMEZCUXl4SlFVRkpMRU5CUVVNc1RVRkJUU3hEUVVGRExFTkJRVU03WjBKQlEycEZMRTFCUVUwc1MwRkJTeXhIUVVGSExGRkJRVkVzUTBGQlF5eEpRVUZKTEVOQlFVTXNUVUZCVFN4RlFVRkZMRU5CUVVNc1JVRkJSU3hSUVVGUkxFTkJRVU1zUTBGQlF6dG5Ra0ZEYWtRc1dVRkJXU3hIUVVGSExFMUJRVTBzUTBGQlF5eEpRVUZKTEVOQlFVTXNTMEZCU3l4RFFVRkRMRWxCUVVrc1EwRkJReXhEUVVGRExFMUJRVTBzUTBGQlF6dGhRVU12UXp0WlFVTkVMRTlCUVU4c1dVRkJXU3hEUVVGRE8xTkJRM0pDTzJGQlFVMDdXVUZEVEN4UlFVRlJMRWxCUVVrc1EwRkJReXhSUVVGUkxFVkJRVVU3WjBKQlEzWkNPMjlDUVVORkxFOUJRVThzUlVGQlJTeERRVUZETzJkQ1FVTmFMRGhDUVVGclFqdG5Ra0ZEYkVJN2IwSkJRMFVzVDBGQlR5eERRVUZETEVOQlFVTTdaMEpCUTFnc1MwRkJTeXhKUVVGSk8yOUNRVU5RTEU5QlFVOHNRMEZCUXl4SlFVRkpMRU5CUVVNc01rSkJRVEpDTEVOQlFVTXNRMEZCUXp0dlFrRkRNVU1zVDBGQlR5eERRVUZETEVOQlFVTTdaMEpCUTFnN2IwSkJRMFVzVFVGQlRTeEpRVUZKTEV0QlFVc3NRMEZCUXl4M1FrRkJkMElzU1VGQlNTeERRVUZETEZGQlFWRXNTVUZCU1N4RFFVRkRMRU5CUVVNN1lVRkROVVE3VTBGRFJqdEpRVU5JTEVOQlFVTTdTVUZGVFN4elFrRkJjMEk3VVVGRE0wSXNTVUZCU1N4SlFVRkpMRU5CUVVNc1VVRkJVU3c0UWtGQmFVSXNTVUZCU1N4SlFVRkpMRU5CUVVNc1VVRkJVU3d3UWtGQlpUdFpRVU5vUlN4UFFVRlBMRWxCUVVrc1EwRkJReXhOUVVGTkxFTkJRVU1zVFVGQlRTeDFSRUZCTUVJc1NVRkJTU3hOUVVGTkxFTkJRVU03TzFsQlJUbEVMRTlCUVU4c1MwRkJTeXhEUVVGRE8wbEJRMnBDTEVOQlFVTTdTVUZGVFN4UFFVRlBMRXRCUVdNc1QwRkJUeXhKUVVGSkxFTkJRVU1zVVVGQlVTeHBRMEZCYlVJc1EwRkJReXhEUVVGRExFTkJRVU03U1VGRkwwUXNWMEZCVnl4TFFVRmpMRTlCUVU4c1NVRkJTU3hEUVVGRExGRkJRVkVzZVVOQlFYVkNMRU5CUVVNc1EwRkJReXhEUVVGRE8wbEJSWFpGTEUxQlFVMHNTMEZCWXl4UFFVRlBMRWxCUVVrc1EwRkJReXhSUVVGUkxDdENRVUZyUWl4RFFVRkRMRU5CUVVNc1EwRkJRenRKUVVVM1JDeExRVUZMTEV0QlFXTXNUMEZCVHl4SlFVRkpMRU5CUVVNc1VVRkJVU3cyUWtGQmFVSXNRMEZCUXl4RFFVRkRMRU5CUVVNN1NVRkZNMFFzUzBGQlN5eExRVUZqTEU5QlFVOHNTVUZCU1N4RFFVRkRMRkZCUVZFc05rSkJRV2xDTEVOQlFVTXNRMEZCUXl4RFFVRkRPMGxCUlRORUxGTkJRVk1zUzBGQll5eFBRVUZQTEVsQlFVa3NRMEZCUXl4UlFVRlJMREpDUVVGblFpeERRVUZETEVOQlFVTXNRMEZCUXp0SlFVVTVSQ3hMUVVGTExFdEJRV01zVDBGQlR5eEpRVUZKTEVOQlFVTXNUMEZCVHl4RFFVRkRMRU5CUVVNc1EwRkJReXhKUVVGSkxFTkJRVU1zVDBGQlR5eERRVUZETEZkQlFWY3NSVUZCUlN4RFFVRkRMRkZCUVZFc1EwRkJReXhMUVVGTExFTkJRVU1zUTBGQlF5eERRVUZETEVOQlFVTXNTMEZCU3l4RFFVRkRMRU5CUVVNc1EwRkJRenRKUVVWeVJ5dzBSRUZCTkVRN1NVRkROVVE3TzA5QlJVYzdTVUZEVHl4WFFVRlhPMUZCUTI1Q0xFbEJRVWtzU1VGQlNTeERRVUZETEV0QlFVc3NRMEZCUXl4WFFVRlhMRVZCUVVVc1EwRkJReXhWUVVGVkxEaENRVUZuUWp0WlFVTnlSQ3h2UTBGQmMwSTdZVUZEYmtJc1NVRkJTU3hKUVVGSkxFTkJRVU1zUzBGQlN5eERRVUZETEZkQlFWY3NSVUZCUlN4RFFVRkRMRlZCUVZVc2MwTkJRVzlDTzFsQlF6bEVMRFJEUVVFd1FqdGhRVU4yUWl4SlFVRkpMRWxCUVVrc1EwRkJReXhMUVVGTExFTkJRVU1zVjBGQlZ5eEZRVUZGTEVOQlFVTXNWVUZCVlN3MFFrRkJaVHRaUVVONlJDeHJRMEZCY1VJN08xbEJSWEpDTEUxQlFVMHNTVUZCU1N4TFFVRkxMRU5CUVVNc1YwRkJWeXhKUVVGSkxFTkJRVU1zVFVGQlRTeERRVUZETEVsQlFVa3NPRUpCUVRoQ0xFbEJRVWtzUTBGQlF5eExRVUZMTEVsQlFVa3NRMEZCUXl4RFFVRkRPMGxCUXpkR0xFTkJRVU03U1VGRlJEczdPenM3TzA5QlRVYzdTVUZEVHl4WlFVRlpMRU5CUVVNc1kwRkJkMEk3VVVGRE4wTXNUVUZCVFN4SFFVRkhMRWRCUVVjc1NVRkJTU3hEUVVGRExFMUJRVTBzUTBGQlF6dFJRVU40UWl4TlFVRk5MRWRCUVVjc1IwRkJSeXhIUVVGSExFTkJRVU1zVFVGQlRTeERRVUZETzFGQlEzWkNMRTFCUVUwc1NVRkJTU3hIUVVGSExHTkJRV01zUTBGQlF5eFhRVUZYTEVWQlFVVXNSMEZCUnl4SFFVRkhMRWRCUVVjc1IwRkJSeXhEUVVGRExFbEJRVWtzUjBGQlJ5eEhRVUZITEVOQlFVTTdVVUZEYWtVc1RVRkJUU3hWUVVGVkxFZEJRVWNzUjBGQlJ5eERRVUZETEZOQlFWTXNRMEZCUXl4UFFVRlBMRU5CUVVNc1lVRkJZU3hEUVVGRExFbEJRVWtzUTBGQlF5eERRVUZETzFGQlF6ZEVMRTFCUVUwc1UwRkJVeXhIUVVGSExFVkJRVVVzUTBGQlF5eE5RVUZOTEVOQlFVTXNVVUZCVVN4RFFVRkRMRkZCUVZFc1JVRkJSU3hWUVVGVkxFVkJRVVVzU1VGQlNTeExRVUZMTEVOQlFVTXNSMEZCUnl4RFFVRkRMRU5CUVVNc1NVRkJTU3hEUVVGRExFVkJRVVVzUTBGQlF5eERRVUZETEVOQlFVTTdVVUZEY0VZc1UwRkJVeXhEUVVGRExFOUJRVThzUjBGQlJ5eEZRVUZGTEVOQlFVTXNUMEZCVHl4RFFVRkRMR0ZCUVdFc1EwRkJRenRSUVVNM1F5eFRRVUZUTEVOQlFVTXNUVUZCVFN4RFFVRkRMRVZCUVVVc1EwRkJReXhKUVVGSkxFTkJRVU1zUzBGQlN5eEZRVUZGTEdOQlFXTXNRMEZCUXl4RFFVRkRPMUZCUTJoRUxGTkJRVk1zUTBGQlF5eE5RVUZOTEVOQlFVTXNSVUZCUlN4RFFVRkRMRWxCUVVrc1EwRkJReXhoUVVGaExFVkJRVVVzWlVGQlpTeERRVUZETEVOQlFVTTdVVUZGZWtRc1RVRkJUU3hWUVVGVkxFZEJRVWNzUjBGQlJ5eERRVUZETEUxQlFVMHNPRUpCUVdNc1EwRkJRenRSUVVNMVF5eEpRVUZKTEZWQlFWVTdXVUZEV2l4VFFVRlRMRU5CUVVNc1RVRkJUU3dyUWtGQlpTeFZRVUZWTEVOQlFVTXNRMEZCUXp0UlFVVTNReXhOUVVGTkxGZEJRVmNzUjBGQlJ5eEhRVUZITEVOQlFVTXNUVUZCVFN4blEwRkJaU3hEUVVGRE8xRkJRemxETEVsQlFVa3NWMEZCVnp0WlFVTmlMRk5CUVZNc1EwRkJReXhOUVVGTkxHbERRVUZuUWl4WFFVRlhMRU5CUVVNc1EwRkJRenRSUVVVdlF5eEpRVUZKTEdWQlFXVXNSMEZCVnl4SFFVRkhMRU5CUVVNc1RVRkJUU3g1UTBGQmJVSXNRMEZCUXp0UlFVTTFSQ3hKUVVGSkxHVkJRV1U3V1VGRGFrSXNVMEZCVXl4RFFVRkRMRTFCUVUwc01FTkJRVzlDTEdWQlFXVXNRMEZCUXl4RFFVRkRPMUZCUlhaRUxFMUJRVTBzYzBKQlFYTkNMRWRCUVZjc1IwRkJSeXhEUVVGRExFMUJRVTBzZFVSQlFUQkNMRU5CUVVNN1VVRkROVVVzU1VGQlNTeHpRa0ZCYzBJc1MwRkJTeXhUUVVGVE8xbEJRM1JETEZOQlFWTXNRMEZCUXl4TlFVRk5MSGRFUVVFeVFpeHpRa0ZCYzBJc1EwRkJReXhEUVVGRE8xRkJSWEpGTEVsQlFVa3NZMEZCWXl3NFFrRkJhVUlzUlVGQlJUdFpRVU51UXl4bFFVRmxMRWRCUVVjc1NVRkJTU3hEUVVGRExHVkJRV1VzUlVGQlJTeERRVUZETEZGQlFWRXNSVUZCUlN4RFFVRkRPMWxCUTNCRUxGTkJRVk1zUTBGQlF5eE5RVUZOTERCRFFVRnZRaXhsUVVGbExFTkJRVU1zUTBGQlF6dFRRVU4wUkR0UlFVVkVMRTlCUVU4c1UwRkJVeXhEUVVGRE8wbEJRMjVDTEVOQlFVTTdTVUZGUkRzN096czdPMDlCVFVjN1NVRkRTU3hOUVVGTkxFTkJRVU1zV1VGQldTeERRVUZETEZkQlFYTkNPMUZCUXk5RExFMUJRVTBzUjBGQlJ5eEhRVUZwUWl4SlFVRkpMRmxCUVZrc1EwRkJReXhYUVVGWExFTkJRVU1zUTBGQlF6dFJRVU40UkN4TlFVRk5MR05CUVdNc1IwRkJSeXhIUVVGSExFTkJRVU1zVVVGQlVTeERRVUZETzFGQlEzQkRMRTlCUVU4c1IwRkJSeXhEUVVGRExGbEJRVmtzUTBGQlF5eGpRVUZqTEVOQlFVTXNRMEZCUXp0SlFVTXhReXhEUVVGRE8wbEJSVVE3T3pzN08wOUJTMGM3U1VGRFNTeE5RVUZOTEVOQlFVTXNhMEpCUVd0Q0xFTkJRVU1zUzBGQllUdFJRVU0xUXl4TFFVRkxMRWRCUVVjc1MwRkJTeXhEUVVGRExGZEJRVmNzUlVGQlJTeERRVUZETzFGQlF6VkNMRTFCUVUwc1VVRkJVU3hIUVVGSExHZEhRVUZ0UkN4RFFVRkRPMUZCUTNKRkxFMUJRVTBzVTBGQlV5eEhRVUZITEVOQlFVTXNTMEZCU3l4RlFVRkZMRXRCUVVzc1JVRkJSU3hKUVVGSkxFTkJRVU1zUTBGQlF6dFJRVVYyUXl4TlFVRk5MR1ZCUVdVc1IwRkJSeXhSUVVGUkxFTkJRVU1zU1VGQlNTeERRVUZETEVOQlFVTXNRMEZCUXl4RlFVRkZMRVZCUVVVc1EwRkJReXhMUVVGTExFTkJRVU1zVlVGQlZTeERRVUZETEVOQlFVTXNRMEZCUXl4WFFVRlhMRVZCUVVVc1EwRkJReXhEUVVGRExFTkJRVU03VVVGRGFFWXNUMEZCVHl4bFFVRmxMRU5CUVVNN1NVRkRla0lzUTBGQlF6dEpRVVZFT3pzN096czdPenRQUVZGSE8wbEJRMGtzVFVGQlRTeERRVUZETEhOQ1FVRnpRaXhEUVVOc1F5eEhRVUZYTEVWQlExZ3NTVUZCV1N4RlFVTmFMRXRCUVdFN1VVRkZZaXcwUlVGQk5FVTdVVUZETlVVc01rSkJRVEpDTzFGQlF6TkNMQ3REUVVFclF6dFJRVU12UXl4SlFVRkpMRU5CUVVNc1dVRkJXU3hEUVVGRExHdENRVUZyUWl4RFFVRkRMRXRCUVVzc1EwRkJRenRaUVVONlF5eE5RVUZOTEVsQlFVa3NTMEZCU3l4RFFVRkRMSFZEUVVGMVF5eERRVUZETEVOQlFVTTdVVUZETTBRc1RVRkJUU3hUUVVGVExFZEJRVWNzUlVGQlJTeERRVUZETEUxQlFVMHNRMEZCUXl4UlFVRlJMRU5CUVVNc1VVRkJVU3hGUVVGRkxFbEJRVWtzUlVGQlJTeEpRVUZKTEV0QlFVc3NRMEZCUXl4SFFVRkhMRU5CUVVNc1EwRkJReXhKUVVGSkxFTkJRVU1zUlVGQlJTeERRVUZETEVOQlFVTXNRMEZCUXp0UlFVTTVSU3hUUVVGVExFTkJRVU1zVDBGQlR5eEhRVUZITEVWQlFVVXNRMEZCUXl4UFFVRlBMRU5CUVVNc1lVRkJZU3hEUVVGRE8xRkJRemRETEZOQlFWTXNRMEZCUXl4TlFVRk5MRU5CUVVNc1JVRkJSU3hEUVVGRExFbEJRVWtzUTBGQlF5eExRVUZMTEVWQlFVVXNTMEZCU3l4RFFVRkRMRU5CUVVNN1VVRkRka01zVDBGQlR5eFRRVUZUTEVOQlFVTTdTVUZEYmtJc1EwRkJRenRKUVVWRUxGbEJRVzFDTEVkQlFXTTdVVUZETDBJc1NVRkJTU3hEUVVGRExFOUJRVThzUjBGQlJ5eEhRVUZITEVOQlFVTTdVVUZEYmtJc1RVRkJUU3hMUVVGTExFZEJRVWNzU1VGQlNTeERRVUZETEU5QlFVOHNRMEZCUXl4SlFVRkpMRU5CUVVNc1JVRkJSU3hEUVVGRExFbEJRVWtzUTBGQlF5eExRVUZMTEVOQlFVTXNRMEZCUXp0UlFVTXZReXhKUVVGSkxFdEJRVXNzUzBGQlN5eEpRVUZKTzFsQlEyaENMRWxCUVVrc1EwRkJReXhOUVVGTkxFZEJRVWNzUzBGQlN5eERRVUZET3p0WlFVVndRaXhOUVVGTkxFbEJRVWtzUzBGQlN5eERRVUZETEcxRFFVRnRReXhEUVVGRExFTkJRVU03VVVGRGRrUXNTVUZCU1N4RFFVRkRMRk5CUVZNc1IwRkJSeXhKUVVGSkxFTkJRVU1zVjBGQlZ5eEZRVUZGTEVOQlFVTTdVVUZEY0VNc1NVRkJTU3hEUVVGRExHbENRVUZwUWl4SFFVRkhMRU5CUVVNc1NVRkJTU3hEUVVGRExFOUJRVThzUlVGQlJTeERRVUZETEVOQlFVTXNRMEZCUXl4RFFVRkRMRmxCUVZrc1EwRkJReXh6UWtGQmMwSXNRMEZCUXl4TFFVRkxMRU5CUVVNc1EwRkJRenRaUVVOeVJpeERRVUZETEVsQlFVa3NRMEZCUXl4TlFVRk5MRVZCUVVVc1EwRkJReXhEUVVGRExFTkJRVU1zUTBGQlF5eFpRVUZaTEVOQlFVTXNjMEpCUVhOQ0xFTkJRVU1zU1VGQlNTeERRVUZETEVOQlFVTTdaMEpCUXpGRUxGbEJRVmtzUTBGQlF5eHpRa0ZCYzBJc1EwRkJReXhUUVVGVExFTkJRVU03VVVGRmJFUXNTVUZCU1N4RFFVRkRMRWxCUVVrc1EwRkJReXhOUVVGTkxFTkJRVU1zU1VGQlNTeERRVUZETEVkQlFVY3NPRUpCUVdNc1JVRkJSVHRaUVVOMlF5eEpRVUZKTEVsQlFVa3NRMEZCUXl4UFFVRlBMRVZCUVVVc1NVRkJTU3hKUVVGSkxFTkJRVU1zVjBGQlZ5eEZRVUZGTzJkQ1FVTjBReXhOUVVGTkxFbEJRVWtzUzBGQlN5eERRVUZETEdWQlFXVXNTVUZCU1N4RFFVRkRMRTFCUVUwc1EwRkJReXhKUVVGSkxHdENRVUZyUWl4SlFVRkpMRU5CUVVNc1VVRkJVU3hKUVVGSk8yOUNRVU5vUml4UlFVRlJMRFJDUVVGWkxHbENRVUZwUWl4RFFVRkRMRU5CUVVNN1UwRkROVU03VVVGRlJDeHJSRUZCYTBRN1VVRkRiRVFzZFVKQlFYVkNPMUZCUTNaQ0xESkdRVUV5Ump0UlFVTXpSaXh4UkVGQmNVUTdVVUZEY2tRc05rTkJRVFpETzFGQlF6ZERMREpHUVVFeVJqdFJRVU16Uml4eFJFRkJjVVE3VVVGRGNrUXNTVUZCU1R0UlFVVktMRWxCUVVrc1EwRkJReXhKUVVGSkxFTkJRVU1zVFVGQlRTeERRVUZETEVsQlFVa3NRMEZCUXl4SFFVRkhMSFZFUVVFd1FpeEZRVUZGTzFsQlEyNUVMRWxCUVVrc1NVRkJTU3hEUVVGRExFMUJRVTBzUlVGQlJUdG5Ra0ZEWml4TlFVRk5MRWxCUVVrc1MwRkJTeXhEUVVGRExHVkJRV1VzU1VGQlNTeERRVUZETEUxQlFVMHNRMEZCUXl4SlFVRkpMR3RDUVVGclFpeEpRVUZKTEVOQlFVTXNVVUZCVVN4SlFVRkpPMjlDUVVOb1JpeFJRVUZSTEhGRVFVRjNRaXhwUWtGQmFVSXNRMEZCUXl4RFFVRkRPMmxDUVVOc1JDeEpRVUZKTEVOQlFVTXNTVUZCU1N4RFFVRkRMRU5CUVVNc1VVRkJVU3hEUVVGRExFbEJRVWtzUTBGQlF5eFJRVUZSTEVOQlFVTTdaMEpCUTNKRExFMUJRVTBzU1VGQlNTeExRVUZMTEVOQlFVTXNaVUZCWlN4SlFVRkpMRU5CUVVNc1RVRkJUU3hEUVVGRExFbEJRVWtzYTBKQlFXdENMRWxCUVVrc1EwRkJReXhSUVVGUkxFbEJRVWs3YjBKQlEyaEdMRkZCUVZFc2NVUkJRWGRDTEdsQ1FVRnBRaXhEUVVGRExFTkJRVU03VTBGRGVFUTdTVUZEU0N4RFFVRkRPenRCUVdoUmVVSXNiVU5CUVhOQ0xFZEJRVWM3U1VGRGFrUXNTVUZCU1N4RlFVRkZMRWRCUVVjN1NVRkRWQ3hUUVVGVExFVkJRVVVzUlVGQlJUdEpRVU5pTEV0QlFVc3NSVUZCUlN4SFFVRkhPME5CUTFnc1EwRkJRenRCUVVWeFFpeHBRMEZCYjBJc1IwRkJSeXhKUVVGSkxFZEJRVWNzUTBGQlV6dEpRVU0xUkN4SFFVRkhMRVZCUVVVc1IwRkJSeXhGUVVGRkxFZEJRVWNzUlVGQlJTeEhRVUZITEVWQlFVVXNSMEZCUnl4RlFVRkZMRWRCUVVjc1JVRkJSU3hIUVVGSExFVkJRVVVzUjBGQlJ5eEZRVUZGTEVkQlFVY3NSVUZCUlN4SFFVRkhPMGxCUTJoRUxFZEJRVWNzUlVGQlJTeEhRVUZITEVWQlFVVXNSMEZCUnl4RlFVRkZMRWRCUVVjc1JVRkJSU3hIUVVGSExFVkJRVVVzUjBGQlJ5eEZRVUZGTEVkQlFVY3NSVUZCUlN4SFFVRkhMRVZCUVVVc1IwRkJSeXhGUVVGRkxFZEJRVWM3UTBGRGFrUXNRMEZCUXl4RFFVRkRPMEZCUTI5Q0xEWkNRVUZuUWl4SFFVRkhMRWxCUVVrc1IwRkJSeXhEUVVGVExFTkJRVU1zUjBGQlJ5eEZRVUZGTEVkQlFVY3NSVUZCUlN4SFFVRkhMRVZCUVVVc1IwRkJSeXhEUVVGRExFTkJRVU1zUTBGQlF6dEJRVU42UkN3MlFrRkJaMElzUjBGQlJ5eEpRVUZKTEVkQlFVY3NRMEZCVXl4RFFVRkRMRWRCUVVjc1JVRkJSU3hIUVVGSExFVkJRVVVzUjBGQlJ5eEZRVUZGTEVkQlFVY3NRMEZCUXl4RFFVRkRMRU5CUVVNaUxDSnpiM1Z5WTJWelEyOXVkR1Z1ZENJNld5SnBiWEJ2Y25RZ0tpQmhjeUJFUnlCbWNtOXRJQ2RrWVhSaFozSnZheTFoY0drdlpHY25PMXh1WEc1cGJYQnZjblFnZTF4dUlDQkJURkJJUVVKRlZDeGNiaUFnWkdWMFpXTjBRV3h3YUdGaVpYUXNYRzRnSUdkbGRGTndiR2wwZEdWeVJtOXlRMjlzZFcxdUxGeHVJQ0JuWlhSVGRHRjBjeXhjYmlBZ1RrOVVRVlJKVDA0c1hHNGdJRk5sY1VOdmJGTjBZWFJ6TEZ4dUlDQnpjR3hwZEhSbGNrRnpSbUZ6ZEdFc1hHNGdJRk53YkdsMGRHVnlSblZ1WXl4Y2JpQWdWRUZIVTF4dWZTQm1jbTl0SUNjdUwyMWhZM0p2Ylc5c1pXTjFiR1VuTzF4dVhHNHZLaW9nUTJ4aGMzTWdabTl5SUdoaGJtUnNhVzVuSUc1dmRHRjBhVzl1SUhWdWFYUnpJR2x1SUUxaFkzSnZiVzlzWldOMWJHVWdZMjlzZFcxdWN5QXFMMXh1Wlhod2IzSjBJR05zWVhOeklGVnVhWFJ6U0dGdVpHeGxjaUI3WEc0Z0lIQnliM1JsWTNSbFpDQnlaV0ZrYjI1c2VTQmZZMjlzZFcxdU9pQkVSeTVEYjJ4MWJXNDdJQzh2SUhSb1pTQmpiMngxYlc0Z2RHOGdZbVVnWTI5dWRtVnlkR1ZrWEc0Z0lIQnliM1JsWTNSbFpDQmZkVzVwZEhNNklITjBjbWx1WnpzZ0x5OGdkVzVwZEhNc0lHOW1JSFJvWlNCbWIzSnRJR1poYzNSaExDQnpaWEJoY21GMGIzSmNiaUFnY0hKdmRHVmpkR1ZrSUY5dWIzUmhkR2x2YmpvZ1RrOVVRVlJKVDA0N0lDOHZJR04xY25KbGJuUWdibTkwWVhScGIyNGdLSGRwZEdodmRYUWdPbE5GVVRwT1ZDd2daWFJqTGlsY2JpQWdjSEp2ZEdWamRHVmtJRjlrWldaaGRXeDBSMkZ3VTNsdFltOXNPaUJ6ZEhKcGJtYzdYRzRnSUhCeWIzUmxZM1JsWkNCemRHRjBhV01nY21WaFpHOXViSGtnWDJSbFptRjFiSFJIWVhCVGVXMWliMnh6UkdsamRDQTlJSHRjYmlBZ0lDQklSVXhOT2lBbktpY3NYRzRnSUNBZ1UwVlFRVkpCVkU5U09pQW5KeXhjYmlBZ0lDQkdRVk5VUVRvZ0p5MG5MRnh1SUNCOU8xeHVYRzRnSUhCMVlteHBZeUJ6ZEdGMGFXTWdjbVZoWkc5dWJIa2dVR1Z3ZEdsa1pVWmhjM1JoUVd4d2FHRmlaWFFnUFNCdVpYY2dVMlYwUEhOMGNtbHVaejRvVzF4dUlDQWdJQ2RISnl3Z0owd25MQ0FuV1Njc0lDZFRKeXdnSjBVbkxDQW5VU2NzSUNkRUp5d2dKMDRuTENBblJpY3NJQ2RCSnl4Y2JpQWdJQ0FuU3ljc0lDZFNKeXdnSjBnbkxDQW5ReWNzSUNkV0p5d2dKMUFuTENBblZ5Y3NJQ2RKSnl3Z0owMG5MQ0FuVkNjc1hHNGdJRjBwTzF4dUlDQndkV0pzYVdNZ2MzUmhkR2xqSUhKbFlXUnZibXg1SUVSdVlVWmhjM1JoUVd4d2FHRmlaWFFnUFNCdVpYY2dVMlYwUEhOMGNtbHVaejRvV3lkQkp5d2dKME1uTENBblJ5Y3NJQ2RVSjEwcE8xeHVJQ0J3ZFdKc2FXTWdjM1JoZEdsaklISmxZV1J2Ym14NUlGSnVZVVpoYzNSaFFXeHdhR0ZpWlhRZ1BTQnVaWGNnVTJWMFBITjBjbWx1Wno0b1d5ZEJKeXdnSjBNbkxDQW5SeWNzSUNkVkoxMHBPMXh1WEc0Z0lIQjFZbXhwWXlCemRHRjBhV01nYzJWMFZXNXBkSE5VYjBaaGMzUmhRMjlzZFcxdUtHTnZiRG9nUkVjdVEyOXNkVzF1S1NCN1hHNGdJQ0FnYVdZZ0tHTnZiQzV6WlcxVWVYQmxJQ0U5UFNCRVJ5NVRSVTFVV1ZCRkxrMUJRMUpQVFU5TVJVTlZURVVwWEc0Z0lDQWdJQ0IwYUhKdmR5QnVaWGNnUlhKeWIzSW9KMFpoYzNSaElHTnZiSFZ0YmlCdGRYTjBJR0psSUUxQlExSlBUVTlNUlVOVlRFVW5LVHRjYmx4dUlDQWdJR052Ym5OMElITjBZWFJ6T2lCVFpYRkRiMnhUZEdGMGN5QTlJR2RsZEZOMFlYUnpLR052YkN3Z05Td2djM0JzYVhSMFpYSkJjMFpoYzNSaEtUdGNiaUFnSUNCamIyNXpkQ0JoYkdsbmJtVmtJRDBnYzNSaGRITXVjMkZ0WlV4bGJtZDBhQ0EvSUNkVFJWRXVUVk5CSnlBNklDZFRSVkVuTzF4dUlDQWdJR052Ym5OMElHRnNjR2hoWW1WMElEMGdaR1YwWldOMFFXeHdhR0ZpWlhRb2MzUmhkSE1wTzF4dVhHNGdJQ0FnWTI5c0xuTmxkRlJoWnloRVJ5NVVRVWRUTGxWT1NWUlRMQ0JPVDFSQlZFbFBUaTVHUVZOVVFTazdYRzRnSUNBZ1kyOXNMbk5sZEZSaFp5aFVRVWRUTG1Gc2FXZHVaV1FzSUdGc2FXZHVaV1FwTzF4dUlDQWdJR052YkM1elpYUlVZV2NvVkVGSFV5NWhiSEJvWVdKbGRDd2dZV3h3YUdGaVpYUXBPMXh1SUNCOVhHNWNiaUFnY0hKdmRHVmpkR1ZrSUdkbGRDQjFibWwwY3lncE9pQnpkSEpwYm1jZ2V5QnlaWFIxY200Z2RHaHBjeTVmZFc1cGRITTdJSDFjYmx4dUlDQndjbTkwWldOMFpXUWdaMlYwSUdOdmJIVnRiaWdwT2lCRVJ5NURiMngxYlc0Z2V5QnlaWFIxY200Z2RHaHBjeTVmWTI5c2RXMXVPeUI5WEc1Y2JpQWdjSFZpYkdsaklHZGxkQ0J1YjNSaGRHbHZiaWdwT2lCT1QxUkJWRWxQVGlCN0lISmxkSFZ5YmlCMGFHbHpMbDl1YjNSaGRHbHZianNnZlZ4dVhHNGdJSEIxWW14cFl5Qm5aWFFnWkdWbVlYVnNkRWRoY0ZONWJXSnZiQ2dwT2lCemRISnBibWNnZXlCeVpYUjFjbTRnZEdocGN5NWZaR1ZtWVhWc2RFZGhjRk41YldKdmJEc2dmVnh1WEc0Z0lIQjFZbXhwWXlCblpYUWdjMlZ3WVhKaGRHOXlLQ2s2SUhOMGNtbHVaeUI4SUhWdVpHVm1hVzVsWkNCN1hHNGdJQ0FnWTI5dWMzUWdjMlZ3WVhKaGRHOXlPaUJ6ZEhKcGJtY2dmQ0IxYm1SbFptbHVaV1FnUFNCMGFHbHpMbU52YkhWdGJpNW5aWFJVWVdjb1ZFRkhVeTV6WlhCaGNtRjBiM0lwSUQ4L0lIVnVaR1ZtYVc1bFpEdGNiaUFnSUNCcFppQW9kR2hwY3k1dWIzUmhkR2x2YmlBOVBUMGdUazlVUVZSSlQwNHVVMFZRUVZKQlZFOVNJQ1ltSUhObGNHRnlZWFJ2Y2lBOVBUMGdkVzVrWldacGJtVmtLVnh1SUNBZ0lDQWdkR2h5YjNjZ2JtVjNJRVZ5Y205eUtHQlRaWEJoY21GMGIzSWdhWE1nYldGdVpHRjBiM0o1SUNCbWIzSWdZMjlzZFcxdUlDY2tlM1JvYVhNdVkyOXNkVzF1TG01aGJXVjlKeUJ2WmlCdWIzUmhkR2x2YmlBbkpIdDBhR2x6TG01dmRHRjBhVzl1ZlNjdVlDazdYRzRnSUNBZ2NtVjBkWEp1SUhObGNHRnlZWFJ2Y2p0Y2JpQWdmVnh1WEc0Z0lIQjFZbXhwWXlCblpYUWdZV3hwWjI1bFpDZ3BPaUJ6ZEhKcGJtY2dlMXh1SUNBZ0lHTnZibk4wSUdGc2FXZHVaV1FnUFNCMGFHbHpMbU52YkhWdGJpNW5aWFJVWVdjb1ZFRkhVeTVoYkdsbmJtVmtLVHRjYmx4dUlDQWdJQzh2SUZSQlIxTXVZV3hwWjI1bFpDQnBjeUJ0WVc1a1lYUnZjbmtnWm05eUlHTnZiSFZ0Ym5NZ2IyWWdUazlVUVZSSlQwNHVSa0ZUVkVFZ1lXNWtJRTVQVkVGVVNVOU9MbE5GVUVGU1FWUlBVbHh1SUNBZ0lHbG1JQ2doWVd4cFoyNWxaQ0FtSmlBb2RHaHBjeTVwYzBaaGMzUmhLQ2tnZkh3Z2RHaHBjeTVwYzFObGNHRnlZWFJ2Y2lncEtTbGNiaUFnSUNBZ0lIUm9jbTkzSUc1bGR5QkZjbkp2Y2lnblZHRm5JR0ZzYVdkdVpXUWdibTkwSUhObGRDY3BPMXh1WEc0Z0lDQWdjbVYwZFhKdUlHRnNhV2R1WldRN1hHNGdJSDFjYmx4dUlDQXZLaW9nUVd4d2FHRmlaWFFnYm1GdFpTQW9kWEJ3WlhJZ1kyRnpaU2tnS2k5Y2JpQWdjSFZpYkdsaklHZGxkQ0JoYkhCb1lXSmxkQ2dwT2lCemRISnBibWNnZTF4dUlDQWdJR052Ym5OMElHRnNjR2hoWW1WMElEMGdkR2hwY3k1amIyeDFiVzR1WjJWMFZHRm5LRlJCUjFNdVlXeHdhR0ZpWlhRcE8xeHVYRzRnSUNBZ0x5OGdWRUZIVXk1aGJIQm9ZV0psZENCcGN5QnRZVzVrWVhSdmNua2dabTl5SUdOdmJIVnRibk1nYjJZZ1RrOVVRVlJKVDA0dVJrRlRWRUVnWVc1a0lFNVBWRUZVU1U5T0xsTkZVRUZTUVZSUFVseHVJQ0FnSUdsbUlDZ2hZV3h3YUdGaVpYUWdKaVlnS0hSb2FYTXVhWE5HWVhOMFlTZ3BJSHg4SUhSb2FYTXVhWE5UWlhCaGNtRjBiM0lvS1NrcFhHNGdJQ0FnSUNCMGFISnZkeUJ1WlhjZ1JYSnliM0lvSjFSaFp5QmhiSEJvWVdKbGRDQnViM1FnYzJWMEp5azdYRzVjYmlBZ0lDQnlaWFIxY200Z1lXeHdhR0ZpWlhRN1hHNGdJSDFjYmx4dUlDQndkV0pzYVdNZ1oyVjBRV3h3YUdGaVpYUlRhWHBsS0NrNklHNTFiV0psY2lCN1hHNGdJQ0FnYVdZZ0tIUm9hWE11Ym05MFlYUnBiMjRnUFQwZ1RrOVVRVlJKVDA0dVNFVk1UU0I4ZkNCMGFHbHpMbUZzY0doaFltVjBJRDA5SUVGTVVFaEJRa1ZVTGxWT0tTQjdYRzRnSUNBZ0lDQmpiMjV6ZENCaGJIQm9ZV0psZEZOcGVtVlRkSElnUFNCMGFHbHpMbU52YkhWdGJpNW5aWFJVWVdjb1ZFRkhVeTVoYkhCb1lXSmxkRk5wZW1VcE8xeHVJQ0FnSUNBZ2JHVjBJR0ZzY0doaFltVjBVMmw2WlRvZ2JuVnRZbVZ5TzF4dUlDQWdJQ0FnYVdZZ0tHRnNjR2hoWW1WMFUybDZaVk4wY2lrZ2UxeHVJQ0FnSUNBZ0lDQmhiSEJvWVdKbGRGTnBlbVVnUFNCd1lYSnpaVWx1ZENoaGJIQm9ZV0psZEZOcGVtVlRkSElwTzF4dUlDQWdJQ0FnZlNCbGJITmxJSHRjYmlBZ0lDQWdJQ0FnTHk4Z1kyRnNZM1ZzWVhSbElHRnNjR2hoWW1WMFUybDZaU0J2YmlCa1pXMWhibVJjYmlBZ0lDQWdJQ0FnWTI5dWMzUWdjM0JzYVhSMFpYSTZJRk53YkdsMGRHVnlSblZ1WXlBOUlHZGxkRk53YkdsMGRHVnlSbTl5UTI5c2RXMXVLSFJvYVhNdVkyOXNkVzF1S1R0Y2JpQWdJQ0FnSUNBZ1kyOXVjM1FnYzNSaGRITWdQU0JuWlhSVGRHRjBjeWgwYUdsekxtTnZiSFZ0Yml3Z01Td2djM0JzYVhSMFpYSXBPMXh1SUNBZ0lDQWdJQ0JoYkhCb1lXSmxkRk5wZW1VZ1BTQlBZbXBsWTNRdWEyVjVjeWh6ZEdGMGN5NW1jbVZ4S1M1c1pXNW5kR2c3WEc0Z0lDQWdJQ0I5WEc0Z0lDQWdJQ0J5WlhSMWNtNGdZV3h3YUdGaVpYUlRhWHBsTzF4dUlDQWdJSDBnWld4elpTQjdYRzRnSUNBZ0lDQnpkMmwwWTJnZ0tIUm9hWE11WVd4d2FHRmlaWFFwSUh0Y2JpQWdJQ0FnSUdOaGMyVWdRVXhRU0VGQ1JWUXVVRlE2WEc0Z0lDQWdJQ0FnSUhKbGRIVnliaUF5TUR0Y2JpQWdJQ0FnSUdOaGMyVWdRVXhRU0VGQ1JWUXVSRTVCT2x4dUlDQWdJQ0FnWTJGelpTQkJURkJJUVVKRlZDNVNUa0U2WEc0Z0lDQWdJQ0FnSUhKbGRIVnliaUEwTzF4dUlDQWdJQ0FnWTJGelpTQW5UbFFuT2x4dUlDQWdJQ0FnSUNCamIyNXpiMnhsTG5kaGNtNG9ZRlZ1Wlhod1pXTjBaV1FnWVd4d2FHRmlaWFFnSjA1VUp5NWdLVHRjYmlBZ0lDQWdJQ0FnY21WMGRYSnVJRFE3WEc0Z0lDQWdJQ0JrWldaaGRXeDBPbHh1SUNBZ0lDQWdJQ0IwYUhKdmR5QnVaWGNnUlhKeWIzSW9ZRlZ1Wlhod1pXTjBaV1FnWVd4d2FHRmlaWFFnSnlSN2RHaHBjeTVoYkhCb1lXSmxkSDBuTG1BcE8xeHVJQ0FnSUNBZ2ZWeHVJQ0FnSUgxY2JpQWdmVnh1WEc0Z0lIQjFZbXhwWXlCblpYUkJiSEJvWVdKbGRFbHpUWFZzZEdsamFHRnlLQ2s2SUdKdmIyeGxZVzRnZTF4dUlDQWdJR2xtSUNoMGFHbHpMbTV2ZEdGMGFXOXVJRDA5SUU1UFZFRlVTVTlPTGtoRlRFMGdmSHdnZEdocGN5NWhiSEJvWVdKbGRDQTlQU0JCVEZCSVFVSkZWQzVWVGlsY2JpQWdJQ0FnSUhKbGRIVnliaUIwYUdsekxtTnZiSFZ0Ymk1blpYUlVZV2NvVkVGSFV5NWhiSEJvWVdKbGRFbHpUWFZzZEdsamFHRnlLU0E5UFNBbmRISjFaU2M3WEc0Z0lDQWdaV3h6WlZ4dUlDQWdJQ0FnY21WMGRYSnVJR1poYkhObE8xeHVJQ0I5WEc1Y2JpQWdjSFZpYkdsaklHbHpSbUZ6ZEdFb0tUb2dZbTl2YkdWaGJpQjdJSEpsZEhWeWJpQjBhR2x6TG01dmRHRjBhVzl1SUQwOVBTQk9UMVJCVkVsUFRpNUdRVk5VUVRzZ2ZWeHVYRzRnSUhCMVlteHBZeUJwYzFObGNHRnlZWFJ2Y2lncE9pQmliMjlzWldGdUlIc2djbVYwZFhKdUlIUm9hWE11Ym05MFlYUnBiMjRnUFQwOUlFNVBWRUZVU1U5T0xsTkZVRUZTUVZSUFVqc2dmVnh1WEc0Z0lIQjFZbXhwWXlCcGMwaGxiRzBvS1RvZ1ltOXZiR1ZoYmlCN0lISmxkSFZ5YmlCMGFHbHpMbTV2ZEdGMGFXOXVJRDA5UFNCT1QxUkJWRWxQVGk1SVJVeE5PeUI5WEc1Y2JpQWdjSFZpYkdsaklHbHpVbTVoS0NrNklHSnZiMnhsWVc0Z2V5QnlaWFIxY200Z2RHaHBjeTVoYkhCb1lXSmxkQ0E5UFQwZ1FVeFFTRUZDUlZRdVVrNUJPeUI5WEc1Y2JpQWdjSFZpYkdsaklHbHpSRzVoS0NrNklHSnZiMnhsWVc0Z2V5QnlaWFIxY200Z2RHaHBjeTVoYkhCb1lXSmxkQ0E5UFQwZ1FVeFFTRUZDUlZRdVJFNUJPeUI5WEc1Y2JpQWdjSFZpYkdsaklHbHpVR1Z3ZEdsa1pTZ3BPaUJpYjI5c1pXRnVJSHNnY21WMGRYSnVJSFJvYVhNdVlXeHdhR0ZpWlhRZ1BUMDlJRUZNVUVoQlFrVlVMbEJVT3lCOVhHNWNiaUFnY0hWaWJHbGpJR2x6VFhOaEtDazZJR0p2YjJ4bFlXNGdleUJ5WlhSMWNtNGdkR2hwY3k1aGJHbG5ibVZrSUQ4Z2RHaHBjeTVoYkdsbmJtVmtMblJ2VlhCd1pYSkRZWE5sS0NrdWFXNWpiSFZrWlhNb0owMVRRU2NwSURvZ1ptRnNjMlU3SUgxY2JseHVJQ0F2S2lvZ1FYTnpiMk5wWVhSbElHNXZkR0YwYVc5dUlIUjVjR1Z6SUhkcGRHZ2dkR2hsSUdOdmNuSmxjM0J2Ym1ScGJtY2dkVzVwZEhNZ0tpOWNiaUFnTHlvcVhHNGdJQ0FxSUVCeVpYUjFjbTRnZTA1UFZFRlVTVTlPZlNBZ0lDQWdUbTkwWVhScGIyNGdZWE56YjJOcFlYUmxaQ0IzYVhSb0lIUm9aU0IxYm1sMGN5QjBlWEJsWEc0Z0lDQXFMMXh1SUNCd2NtOTBaV04wWldRZ1oyVjBUbTkwWVhScGIyNG9LVG9nVGs5VVFWUkpUMDRnZTF4dUlDQWdJR2xtSUNoMGFHbHpMblZ1YVhSekxuUnZURzkzWlhKRFlYTmxLQ2t1YzNSaGNuUnpWMmwwYUNoT1QxUkJWRWxQVGk1R1FWTlVRU2twWEc0Z0lDQWdJQ0J5WlhSMWNtNGdUazlVUVZSSlQwNHVSa0ZUVkVFN1hHNGdJQ0FnWld4elpTQnBaaUFvZEdocGN5NTFibWwwY3k1MGIweHZkMlZ5UTJGelpTZ3BMbk4wWVhKMGMxZHBkR2dvVGs5VVFWUkpUMDR1VTBWUVFWSkJWRTlTS1NsY2JpQWdJQ0FnSUhKbGRIVnliaUJPVDFSQlZFbFBUaTVUUlZCQlVrRlVUMUk3WEc0Z0lDQWdaV3h6WlNCcFppQW9kR2hwY3k1MWJtbDBjeTUwYjB4dmQyVnlRMkZ6WlNncExuTjBZWEowYzFkcGRHZ29UazlVUVZSSlQwNHVTRVZNVFNrcFhHNGdJQ0FnSUNCeVpYUjFjbTRnVGs5VVFWUkpUMDR1U0VWTVRUdGNiaUFnSUNCbGJITmxYRzRnSUNBZ0lDQjBhSEp2ZHlCdVpYY2dSWEp5YjNJb1lFTnZiSFZ0YmlBbkpIdDBhR2x6TG1OdmJIVnRiaTV1WVcxbGZTY2dhR0Z6SUhWdVpYaHdaV04wWldRZ2JtOTBZWFJwYjI0Z0p5UjdkR2hwY3k1MWJtbDBjMzBuTG1BcE8xeHVJQ0I5WEc1Y2JpQWdMeW9xWEc0Z0lDQXFJRU55WldGMFpTQmhJRzVsZHlCbGJYQjBlU0JqYjJ4MWJXNGdiMllnZEdobElITndaV05wWm1sbFpDQnViM1JoZEdsdmJpQjBlWEJsSUdGdVpDQjBhR1VnYzJGdFpWeHVJQ0FnS2lCc1pXNW5kR2dnWVhNZ1kyOXNkVzF1WEc0Z0lDQXFYRzRnSUNBcUlFQndZWEpoYlNCN1RrOVVRVlJKVDA1OUlIUmhjbWRsZEU1dmRHRjBhVzl1WEc0Z0lDQXFJRUJ5WlhSMWNtNGdlMFJITGtOdmJIVnRibjFjYmlBZ0lDb3ZYRzRnSUhCeWIzUmxZM1JsWkNCblpYUk9aWGREYjJ4MWJXNG9kR0Z5WjJWMFRtOTBZWFJwYjI0NklFNVBWRUZVU1U5T0tUb2dSRWN1UTI5c2RXMXVJSHRjYmlBZ0lDQmpiMjV6ZENCamIyd2dQU0IwYUdsekxtTnZiSFZ0Ymp0Y2JpQWdJQ0JqYjI1emRDQnNaVzRnUFNCamIyd3ViR1Z1WjNSb08xeHVJQ0FnSUdOdmJuTjBJRzVoYldVZ1BTQjBZWEpuWlhST2IzUmhkR2x2Ymk1MGIweHZkMlZ5UTJGelpTZ3BJQ3NnSnlnbklDc2dZMjlzTG01aGJXVWdLeUFuS1NjN1hHNGdJQ0FnWTI5dWMzUWdibVYzUTI5c1RtRnRaU0E5SUdOdmJDNWtZWFJoUm5KaGJXVXVZMjlzZFcxdWN5NW5aWFJWYm5WelpXUk9ZVzFsS0c1aGJXVXBPMXh1SUNBZ0lHTnZibk4wSUc1bGQwTnZiSFZ0YmlBOUlFUkhMa052YkhWdGJpNW1jbTl0VEdsemRDZ25jM1J5YVc1bkp5d2dibVYzUTI5c1RtRnRaU3dnYm1WM0lFRnljbUY1S0d4bGJpa3VabWxzYkNnbkp5a3BPMXh1SUNBZ0lHNWxkME52YkhWdGJpNXpaVzFVZVhCbElEMGdSRWN1VTBWTlZGbFFSUzVOUVVOU1QwMVBURVZEVlV4Rk8xeHVJQ0FnSUc1bGQwTnZiSFZ0Ymk1elpYUlVZV2NvUkVjdVZFRkhVeTVWVGtsVVV5d2dkR0Z5WjJWMFRtOTBZWFJwYjI0cE8xeHVJQ0FnSUc1bGQwTnZiSFZ0Ymk1elpYUlVZV2NvUkVjdVZFRkhVeTVEUlV4TVgxSkZUa1JGVWtWU0xDQW5UV0ZqY205dGIyeGxZM1ZzWlNjcE8xeHVYRzRnSUNBZ1kyOXVjM1FnYzNKalFXeHBaMjVsWkNBOUlHTnZiQzVuWlhSVVlXY29WRUZIVXk1aGJHbG5ibVZrS1R0Y2JpQWdJQ0JwWmlBb2MzSmpRV3hwWjI1bFpDbGNiaUFnSUNBZ0lHNWxkME52YkhWdGJpNXpaWFJVWVdjb1ZFRkhVeTVoYkdsbmJtVmtMQ0J6Y21OQmJHbG5ibVZrS1R0Y2JseHVJQ0FnSUdOdmJuTjBJSE55WTBGc2NHaGhZbVYwSUQwZ1kyOXNMbWRsZEZSaFp5aFVRVWRUTG1Gc2NHaGhZbVYwS1R0Y2JpQWdJQ0JwWmlBb2MzSmpRV3h3YUdGaVpYUXBYRzRnSUNBZ0lDQnVaWGREYjJ4MWJXNHVjMlYwVkdGbktGUkJSMU11WVd4d2FHRmlaWFFzSUhOeVkwRnNjR2hoWW1WMEtUdGNibHh1SUNBZ0lHeGxkQ0J6Y21OQmJIQm9ZV0psZEZOcGVtVTZJSE4wY21sdVp5QTlJR052YkM1blpYUlVZV2NvVkVGSFV5NWhiSEJvWVdKbGRGTnBlbVVwTzF4dUlDQWdJR2xtSUNoemNtTkJiSEJvWVdKbGRGTnBlbVVwWEc0Z0lDQWdJQ0J1WlhkRGIyeDFiVzR1YzJWMFZHRm5LRlJCUjFNdVlXeHdhR0ZpWlhSVGFYcGxMQ0J6Y21OQmJIQm9ZV0psZEZOcGVtVXBPMXh1WEc0Z0lDQWdZMjl1YzNRZ2MzSmpRV3h3YUdGaVpYUkpjMDExYkhScFkyaGhjam9nYzNSeWFXNW5JRDBnWTI5c0xtZGxkRlJoWnloVVFVZFRMbUZzY0doaFltVjBTWE5OZFd4MGFXTm9ZWElwTzF4dUlDQWdJR2xtSUNoemNtTkJiSEJvWVdKbGRFbHpUWFZzZEdsamFHRnlJQ0U5UFNCMWJtUmxabWx1WldRcFhHNGdJQ0FnSUNCdVpYZERiMngxYlc0dWMyVjBWR0ZuS0ZSQlIxTXVZV3h3YUdGaVpYUkpjMDExYkhScFkyaGhjaXdnYzNKalFXeHdhR0ZpWlhSSmMwMTFiSFJwWTJoaGNpazdYRzVjYmlBZ0lDQnBaaUFvZEdGeVoyVjBUbTkwWVhScGIyNGdQVDBnVGs5VVFWUkpUMDR1U0VWTVRTa2dlMXh1SUNBZ0lDQWdjM0pqUVd4d2FHRmlaWFJUYVhwbElEMGdkR2hwY3k1blpYUkJiSEJvWVdKbGRGTnBlbVVvS1M1MGIxTjBjbWx1WnlncE8xeHVJQ0FnSUNBZ2JtVjNRMjlzZFcxdUxuTmxkRlJoWnloVVFVZFRMbUZzY0doaFltVjBVMmw2WlN3Z2MzSmpRV3h3YUdGaVpYUlRhWHBsS1R0Y2JpQWdJQ0I5WEc1Y2JpQWdJQ0J5WlhSMWNtNGdibVYzUTI5c2RXMXVPMXh1SUNCOVhHNWNiaUFnTHlvcVhHNGdJQ0FxSUVOeVpXRjBaU0JoSUc1bGR5QmxiWEIwZVNCamIyeDFiVzRnZFhOcGJtY2dkR1Z0Y0d4aGRHVkRiMndnWVhNZ1lTQjBaVzF3YkdGMFpWeHVJQ0FnS2x4dUlDQWdLaUJBY0dGeVlXMGdlMFJITGtOdmJIVnRibjBnZEdWdGNHeGhkR1ZEYjJ3Z0lIUm9aU0J3Y205d1pYSjBhV1Z6SUdGdVpDQjFibWwwY3lCdlppQjBhR2x6SUdOdmJIVnRiaUJoY21VZ2RYTmxaQ0JoY3lCaFhHNGdJQ0FxSUhSbGJYQnNZWFJsSUhSdklHSjFhV3hrSUhSb1pTQnVaWGNnYjI1bFhHNGdJQ0FxSUVCeVpYUjFjbTRnZTBSSExrTnZiSFZ0Ym4xY2JpQWdJQ292WEc0Z0lIQjFZbXhwWXlCemRHRjBhV01nWjJWMFRtVjNRMjlzZFcxdUtIUmxiWEJzWVhSbFEyOXNPaUJFUnk1RGIyeDFiVzRwT2lCRVJ5NURiMngxYlc0Z2UxeHVJQ0FnSUdOdmJuTjBJR052YkRvZ1ZXNXBkSE5JWVc1a2JHVnlJRDBnYm1WM0lGVnVhWFJ6U0dGdVpHeGxjaWgwWlcxd2JHRjBaVU52YkNrN1hHNGdJQ0FnWTI5dWMzUWdkR0Z5WjJWMFRtOTBZWFJwYjI0Z1BTQmpiMnd1Ym05MFlYUnBiMjQ3WEc0Z0lDQWdjbVYwZFhKdUlHTnZiQzVuWlhST1pYZERiMngxYlc0b2RHRnlaMlYwVG05MFlYUnBiMjRwTzF4dUlDQjlYRzVjYmlBZ0x5b3FYRzRnSUNBcUlFRWdhR1ZzY0dWeUlHWjFibU4wYVc5dUlHTm9aV05yYVc1bklIUm9aU0IyWVd4cFpHbDBlU0J2WmlCMGFHVWdKM1Z1YVhSekp5QnpkSEpwYm1kY2JpQWdJQ3BjYmlBZ0lDb2dRSEJoY21GdElIdHpkSEpwYm1kOUlIVnVhWFJ6SUNCMGFHVWdjM1J5YVc1bklIUnZJR0psSUhaaGJHbGtZWFJsWkZ4dUlDQWdLaUJBY21WMGRYSnVJSHRpYjI5c1pXRnVmVnh1SUNBZ0tpOWNiaUFnY0hWaWJHbGpJSE4wWVhScFl5QjFibWwwYzFOMGNtbHVaMGx6Vm1Gc2FXUW9kVzVwZEhNNklITjBjbWx1WnlrNklHSnZiMnhsWVc0Z2UxeHVJQ0FnSUhWdWFYUnpJRDBnZFc1cGRITXVkRzlNYjNkbGNrTmhjMlVvS1R0Y2JpQWdJQ0JqYjI1emRDQndjbVZtYVhobGN5QTlJRnRPVDFSQlZFbFBUaTVHUVZOVVFTd2dUazlVUVZSSlQwNHVVMFZRUVZKQlZFOVNMQ0JPVDFSQlZFbFBUaTVJUlV4TlhUdGNiaUFnSUNCamIyNXpkQ0J3YjNOMFptbDRaWE1nUFNCYkozSnVZU2NzSUNka2JtRW5MQ0FuY0hRblhUdGNibHh1SUNBZ0lHTnZibk4wSUhCeVpXWnBlRU55YVhSbGNtbHZiaUE5SUhCeVpXWnBlR1Z6TG5OdmJXVW9LSEFwSUQwK0lIVnVhWFJ6TG5OMFlYSjBjMWRwZEdnb2NDNTBiMHh2ZDJWeVEyRnpaU2dwS1NrN1hHNGdJQ0FnY21WMGRYSnVJSEJ5WldacGVFTnlhWFJsY21sdmJqdGNiaUFnZlZ4dVhHNGdJQzhxS2x4dUlDQWdLaUJEYjI1emRISjFZM1FnWVNCdVpYY2dZMjlzZFcxdUlHOW1JSE5sYldGdWRHbGpJSFI1Y0dVZ1RVRkRVazlOVDB4RlExVk1SU0JtY205dElIUm9aU0JzYVhOMElHOW1YRzRnSUNBcUlITndaV05wWm1sbFpDQndZWEpoYldWMFpYSnpYRzRnSUNBcVhHNGdJQ0FxSUVCd1lYSmhiU0I3Ym5WdFltVnlmU0FnSUNCc1pXNGdJSFJvWlNCc1pXNW5kR2dnYjJZZ2RHaGxJRzVsZHlCamIyeDFiVzVjYmlBZ0lDb2dRSEJoY21GdElIdHpkSEpwYm1kOUlDQWdJRzVoYldVZ0lIUm9aU0J1WVcxbElHOW1JSFJvWlNCdVpYY2dZMjlzZFcxdVhHNGdJQ0FxSUVCd1lYSmhiU0I3YzNSeWFXNW5mU0FnSUNCMWJtbDBjeUFnZEdobElIVnVhWFJ6SUc5bUlIUm9aU0J1WlhjZ1kyOXNkVzF1WEc0Z0lDQXFJRUJ5WlhSMWNtNGdlMFJITGtOdmJIVnRibjFjYmlBZ0lDb3ZYRzRnSUhCMVlteHBZeUJ6ZEdGMGFXTWdaMlYwVG1WM1EyOXNkVzF1Um5KdmJWQmhjbUZ0Y3loY2JpQWdJQ0JzWlc0NklHNTFiV0psY2l4Y2JpQWdJQ0J1WVcxbE9pQnpkSEpwYm1jc1hHNGdJQ0FnZFc1cGRITTZJSE4wY21sdVoxeHVJQ0FwT2lCRVJ5NURiMngxYlc0Z2UxeHVJQ0FnSUM4dklGZEJVazVKVGtjNklHbHVJSFJvYVhNZ2FXMXdiR1Z0Wlc1MFlYUnBiMjRnYVhNZ2FYTWdhVzF3YjNOemFXSnNaU0IwYnlCMlpYSnBabmtnZEdobElIVnVhWEYxWlc1bGMzTmNiaUFnSUNBdkx5QnZaaUIwYUdVZ2JtVjNJR052YkhWdGJpZHpJRzVoYldWY2JpQWdJQ0F2THlCVVQwUlBPaUIyWlhKcFpua2dkR2hsSUhaaGJHbGthWFI1SUc5bUlIVnVhWFJ6SUhCaGNtRnRaWFJsY2x4dUlDQWdJR2xtSUNnaFZXNXBkSE5JWVc1a2JHVnlMblZ1YVhSelUzUnlhVzVuU1hOV1lXeHBaQ2gxYm1sMGN5a3BYRzRnSUNBZ0lDQjBhSEp2ZHlCdVpYY2dSWEp5YjNJb0owbHVkbUZzYVdRZ1ptOXliV0YwSUc5bUlGeGNKM1Z1YVhSelhGd25JSEJoY21GdFpYUmxjaWNwTzF4dUlDQWdJR052Ym5OMElHNWxkME52YkhWdGJpQTlJRVJITGtOdmJIVnRiaTVtY205dFRHbHpkQ2duYzNSeWFXNW5KeXdnYm1GdFpTd2dibVYzSUVGeWNtRjVLR3hsYmlrdVptbHNiQ2duSnlrcE8xeHVJQ0FnSUc1bGQwTnZiSFZ0Ymk1elpXMVVlWEJsSUQwZ1JFY3VVMFZOVkZsUVJTNU5RVU5TVDAxUFRFVkRWVXhGTzF4dUlDQWdJRzVsZDBOdmJIVnRiaTV6WlhSVVlXY29SRWN1VkVGSFV5NVZUa2xVVXl3Z2RXNXBkSE1wTzF4dUlDQWdJSEpsZEhWeWJpQnVaWGREYjJ4MWJXNDdYRzRnSUgxY2JseHVJQ0J3ZFdKc2FXTWdZMjl1YzNSeWRXTjBiM0lvWTI5c09pQkVSeTVEYjJ4MWJXNHBJSHRjYmlBZ0lDQjBhR2x6TGw5amIyeDFiVzRnUFNCamIydzdYRzRnSUNBZ1kyOXVjM1FnZFc1cGRITWdQU0IwYUdsekxsOWpiMngxYlc0dWRHRm5jMXRFUnk1VVFVZFRMbFZPU1ZSVFhUdGNiaUFnSUNCcFppQW9kVzVwZEhNZ0lUMDlJRzUxYkd3cFhHNGdJQ0FnSUNCMGFHbHpMbDkxYm1sMGN5QTlJSFZ1YVhSek8xeHVJQ0FnSUdWc2MyVmNiaUFnSUNBZ0lIUm9jbTkzSUc1bGR5QkZjbkp2Y2lnblZXNXBkSE1nWVhKbElHNXZkQ0J6Y0dWamFXWnBaV1FnYVc0Z1kyOXNkVzF1SnlrN1hHNGdJQ0FnZEdocGN5NWZibTkwWVhScGIyNGdQU0IwYUdsekxtZGxkRTV2ZEdGMGFXOXVLQ2s3WEc0Z0lDQWdkR2hwY3k1ZlpHVm1ZWFZzZEVkaGNGTjViV0p2YkNBOUlDaDBhR2x6TG1selJtRnpkR0VvS1NrZ1B5QlZibWwwYzBoaGJtUnNaWEl1WDJSbFptRjFiSFJIWVhCVGVXMWliMnh6UkdsamRDNUdRVk5VUVNBNlhHNGdJQ0FnSUNBb2RHaHBjeTVwYzBobGJHMG9LU2tnUHlCVmJtbDBjMGhoYm1Sc1pYSXVYMlJsWm1GMWJIUkhZWEJUZVcxaWIyeHpSR2xqZEM1SVJVeE5JRHBjYmlBZ0lDQWdJQ0FnVlc1cGRITklZVzVrYkdWeUxsOWtaV1poZFd4MFIyRndVM2x0WW05c2MwUnBZM1F1VTBWUVFWSkJWRTlTTzF4dVhHNGdJQ0FnYVdZZ0tDRjBhR2x6TG1OdmJIVnRiaTUwWVdkekxtaGhjeWhVUVVkVExtRnNhV2R1WldRcEtTQjdYRzRnSUNBZ0lDQnBaaUFvZEdocGN5NXBjMFpoYzNSaEtDa2dmSHdnZEdocGN5NXBjMU5sY0dGeVlYUnZjaWdwS1Z4dUlDQWdJQ0FnSUNCMGFISnZkeUJ1WlhjZ1JYSnliM0lvWUVadmNpQmpiMngxYlc0Z0p5UjdkR2hwY3k1amIyeDFiVzR1Ym1GdFpYMG5JRzltSUc1dmRHRjBhVzl1SUNja2UzUm9hWE11Ym05MFlYUnBiMjU5SnlCZ0lDdGNiaUFnSUNBZ0lDQWdJQ0JnZEdGbklDY2tlMVJCUjFNdVlXeHBaMjVsWkgwbklHbHpJRzFoYm1SaGRHOXllUzVnS1R0Y2JpQWdJQ0I5WEc1Y2JpQWdJQ0F2THlCcFppQW9JWFJvYVhNdVkyOXNkVzF1TG5SaFozTXVhR0Z6S0ZSQlIxTXVZV3h3YUdGaVpYUlRhWHBsS1NrZ2UxeHVJQ0FnSUM4dklDQWdhV1lnS0hSb2FYTXVhWE5JWld4dEtDa3BYRzRnSUNBZ0x5OGdJQ0FnSUhSb2NtOTNJRzVsZHlCRmNuSnZjaWhnUm05eUlHTnZiSFZ0YmlBbkpIdDBhR2x6TG1OdmJIVnRiaTV1WVcxbGZTY2diMllnYm05MFlYUnBiMjRnSnlSN2RHaHBjeTV1YjNSaGRHbHZibjBuSUdBZ0sxeHVJQ0FnSUM4dklDQWdJQ0FnSUdCMFlXY2dKeVI3VkVGSFV5NWhiSEJvWVdKbGRGTnBlbVY5SnlCcGN5QnRZVzVrWVhSdmNua3VZQ2s3WEc0Z0lDQWdMeThnSUNCbGJITmxJR2xtSUNoYkoxVk9KMTB1YVc1amJIVmtaWE1vZEdocGN5NWhiSEJvWVdKbGRDa3BYRzRnSUNBZ0x5OGdJQ0FnSUhSb2NtOTNJRzVsZHlCRmNuSnZjaWhnUm05eUlHTnZiSFZ0YmlBbkpIdDBhR2x6TG1OdmJIVnRiaTV1WVcxbGZTY2diMllnWVd4d2FHRmlaWFFnSnlSN2RHaHBjeTVoYkhCb1lXSmxkSDBuSUdBZ0sxeHVJQ0FnSUM4dklDQWdJQ0FnSUdCMFlXY2dKeVI3VkVGSFV5NWhiSEJvWVdKbGRGTnBlbVY5SnlCcGN5QnRZVzVrWVhSdmNua3VZQ2s3WEc0Z0lDQWdMeThnZlZ4dVhHNGdJQ0FnYVdZZ0tDRjBhR2x6TG1OdmJIVnRiaTUwWVdkekxtaGhjeWhVUVVkVExtRnNjR2hoWW1WMFNYTk5kV3gwYVdOb1lYSXBLU0I3WEc0Z0lDQWdJQ0JwWmlBb2RHaHBjeTVwYzBobGJHMG9LU2xjYmlBZ0lDQWdJQ0FnZEdoeWIzY2dibVYzSUVWeWNtOXlLR0JHYjNJZ1kyOXNkVzF1SUNja2UzUm9hWE11WTI5c2RXMXVMbTVoYldWOUp5QnZaaUJ1YjNSaGRHbHZiaUFuSkh0MGFHbHpMbTV2ZEdGMGFXOXVmU2NnWUNBclhHNGdJQ0FnSUNBZ0lDQWdZSFJoWnlBbkpIdFVRVWRUTG1Gc2NHaGhZbVYwU1hOTmRXeDBhV05vWVhKOUp5QnBjeUJ0WVc1a1lYUnZjbmt1WUNrN1hHNGdJQ0FnSUNCbGJITmxJR2xtSUNoYkoxVk9KMTB1YVc1amJIVmtaWE1vZEdocGN5NWhiSEJvWVdKbGRDa3BYRzRnSUNBZ0lDQWdJSFJvY205M0lHNWxkeUJGY25KdmNpaGdSbTl5SUdOdmJIVnRiaUFuSkh0MGFHbHpMbU52YkhWdGJpNXVZVzFsZlNjZ2IyWWdZV3h3YUdGaVpYUWdKeVI3ZEdocGN5NWhiSEJvWVdKbGRIMG5JR0FnSzF4dUlDQWdJQ0FnSUNBZ0lHQjBZV2NnSnlSN1ZFRkhVeTVoYkhCb1lXSmxkRWx6VFhWc2RHbGphR0Z5ZlNjZ2FYTWdiV0Z1WkdGMGIzSjVMbUFwTzF4dUlDQWdJSDFjYmlBZ2ZWeHVmVnh1SWwxOSIsImV4cG9ydCBmdW5jdGlvbiBlcnJvclRvQ29uc29sZShlcnIpIHtcbiAgICB2YXIgX2E7XG4gICAgaWYgKHR5cGVvZiBlcnIgPT09ICdzdHJpbmcnIHx8IGVyciBpbnN0YW5jZW9mIFN0cmluZykge1xuICAgICAgICByZXR1cm4gZXJyO1xuICAgIH1cbiAgICBlbHNlIGlmICgnJHRocm93bkpzRXJyb3InIGluIGVycikge1xuICAgICAgICByZXR1cm4gZXJyb3JUb0NvbnNvbGUoZXJyWyckdGhyb3duSnNFcnJvciddKTtcbiAgICB9XG4gICAgZWxzZSBpZiAoZXJyIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgcmV0dXJuIChfYSA9IGVyci5zdGFjaykgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogZXJyLm1lc3NhZ2U7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICByZXR1cm4gZXJyLnRvU3RyaW5nKCk7XG4gICAgfVxufVxuZXhwb3J0IGZ1bmN0aW9uIHJlY3RUb0NvbnNvbGUocmVjdCkge1xuICAgIHJldHVybiBgKHg9JHtyZWN0Lnh9LCB5PSR7cmVjdC55fSwgdz0ke3JlY3Qud2lkdGh9LCBoPSR7cmVjdC5oZWlnaHR9KWA7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1kYXRhOmFwcGxpY2F0aW9uL2pzb247YmFzZTY0LGV5SjJaWEp6YVc5dUlqb3pMQ0ptYVd4bElqb2lkRzh0WTI5dWMyOXNaUzVxY3lJc0luTnZkWEpqWlZKdmIzUWlPaUlpTENKemIzVnlZMlZ6SWpwYkluUnZMV052Ym5OdmJHVXVkSE1pWFN3aWJtRnRaWE1pT2x0ZExDSnRZWEJ3YVc1bmN5STZJa0ZCUzBFc1RVRkJUU3hWUVVGVkxHTkJRV01zUTBGQlF5eEhRVUZST3p0SlFVTnlReXhKUVVGSkxFOUJRVThzUjBGQlJ5eExRVUZMTEZGQlFWRXNTVUZCU1N4SFFVRkhMRmxCUVZrc1RVRkJUU3hGUVVGRk8xRkJRM0JFTEU5QlFVOHNSMEZCWVN4RFFVRkRPMHRCUTNSQ08xTkJRVTBzU1VGQlNTeG5Ra0ZCWjBJc1NVRkJTU3hIUVVGSExFVkJRVVU3VVVGRGJFTXNUMEZCVHl4alFVRmpMRU5CUVVNc1IwRkJSeXhEUVVGRExHZENRVUZuUWl4RFFVRkRMRU5CUVVNc1EwRkJRenRMUVVNNVF6dFRRVUZOTEVsQlFVa3NSMEZCUnl4WlFVRlpMRXRCUVVzc1JVRkJSVHRSUVVNdlFpeFBRVUZQTEUxQlFVTXNSMEZCWVN4RFFVRkRMRXRCUVVzc2JVTkJRVXNzUjBGQllTeERRVUZETEU5QlFVOHNRMEZCUXp0TFFVTjJSRHRUUVVGTk8xRkJRMHdzVDBGQlR5eEhRVUZITEVOQlFVTXNVVUZCVVN4RlFVRkZMRU5CUVVNN1MwRkRka0k3UVVGRFNDeERRVUZETzBGQlJVUXNUVUZCVFN4VlFVRlZMR0ZCUVdFc1EwRkJReXhKUVVGaE8wbEJRM3BETEU5QlFVOHNUVUZCVFN4SlFVRkpMRU5CUVVNc1EwRkJReXhQUVVGUExFbEJRVWtzUTBGQlF5eERRVUZETEU5QlFVOHNTVUZCU1N4RFFVRkRMRXRCUVVzc1QwRkJUeXhKUVVGSkxFTkJRVU1zVFVGQlRTeEhRVUZITEVOQlFVTTdRVUZEZWtVc1EwRkJReUlzSW5OdmRYSmpaWE5EYjI1MFpXNTBJanBiSW1sdGNHOXlkQ0FxSUdGeklIVnBJR1p5YjIwZ0oyUmhkR0ZuY205ckxXRndhUzkxYVNjN1hHNXBiWEJ2Y25RZ0tpQmhjeUJuY205cklHWnliMjBnSjJSaGRHRm5jbTlyTFdGd2FTOW5jbTlySnp0Y2JtbHRjRzl5ZENBcUlHRnpJRVJISUdaeWIyMGdKMlJoZEdGbmNtOXJMV0Z3YVM5a1p5YzdYRzVjYmx4dVpYaHdiM0owSUdaMWJtTjBhVzl1SUdWeWNtOXlWRzlEYjI1emIyeGxLR1Z5Y2pvZ1lXNTVLVG9nYzNSeWFXNW5JSHRjYmlBZ2FXWWdLSFI1Y0dWdlppQmxjbklnUFQwOUlDZHpkSEpwYm1jbklIeDhJR1Z5Y2lCcGJuTjBZVzVqWlc5bUlGTjBjbWx1WnlrZ2UxeHVJQ0FnSUhKbGRIVnliaUJsY25JZ1lYTWdjM1J5YVc1bk8xeHVJQ0I5SUdWc2MyVWdhV1lnS0Nja2RHaHliM2R1U25ORmNuSnZjaWNnYVc0Z1pYSnlLU0I3WEc0Z0lDQWdjbVYwZFhKdUlHVnljbTl5Vkc5RGIyNXpiMnhsS0dWeWNsc25KSFJvY205M2JrcHpSWEp5YjNJblhTazdYRzRnSUgwZ1pXeHpaU0JwWmlBb1pYSnlJR2x1YzNSaGJtTmxiMllnUlhKeWIzSXBJSHRjYmlBZ0lDQnlaWFIxY200Z0tHVnljaUJoY3lCRmNuSnZjaWt1YzNSaFkyc2dQejhnS0dWeWNpQmhjeUJGY25KdmNpa3ViV1Z6YzJGblpUdGNiaUFnZlNCbGJITmxJSHRjYmlBZ0lDQnlaWFIxY200Z1pYSnlMblJ2VTNSeWFXNW5LQ2s3WEc0Z0lIMWNibjFjYmx4dVpYaHdiM0owSUdaMWJtTjBhVzl1SUhKbFkzUlViME52Ym5OdmJHVW9jbVZqZERvZ1JFY3VVbVZqZENrNklITjBjbWx1WnlCN1hHNGdJSEpsZEhWeWJpQmdLSGc5Skh0eVpXTjBMbmg5TENCNVBTUjdjbVZqZEM1NWZTd2dkejBrZTNKbFkzUXVkMmxrZEdoOUxDQm9QU1I3Y21WamRDNW9aV2xuYUhSOUtXQTdYRzU5WEc0aVhYMD0iLCJpbXBvcnQgKiBhcyB1aSBmcm9tICdkYXRhZ3Jvay1hcGkvdWknO1xuaW1wb3J0ICogYXMgREcgZnJvbSAnZGF0YWdyb2stYXBpL2RnJztcbmltcG9ydCB7IGZpbmRNb25vbWVycywgcGFyc2VIZWxtLCBnZXRQYXJ0cyB9IGZyb20gJy4vdXRpbHMnO1xuaW1wb3J0IHsgcHJpbnRMZWZ0T3JDZW50ZXJlZCB9IGZyb20gJ0BkYXRhZ3Jvay1saWJyYXJpZXMvYmlvL3NyYy91dGlscy9jZWxsLXJlbmRlcmVyJztcbmltcG9ydCB7IGVycm9yVG9Db25zb2xlIH0gZnJvbSAnQGRhdGFncm9rLWxpYnJhcmllcy91dGlscy9zcmMvdG8tY29uc29sZSc7XG5leHBvcnQgY2xhc3MgSGVsbUNlbGxSZW5kZXJlciBleHRlbmRzIERHLkdyaWRDZWxsUmVuZGVyZXIge1xuICAgIGdldCBuYW1lKCkgeyByZXR1cm4gJ2hlbG0nOyB9XG4gICAgZ2V0IGNlbGxUeXBlKCkgeyByZXR1cm4gJ2hlbG0nOyB9XG4gICAgZ2V0IGRlZmF1bHRXaWR0aCgpIHsgcmV0dXJuIDQwMDsgfVxuICAgIGdldCBkZWZhdWx0SGVpZ2h0KCkgeyByZXR1cm4gMTAwOyB9XG4gICAgb25Nb3VzZU1vdmUoZ3JpZENlbGwsIGUpIHtcbiAgICAgICAgdmFyIF9hLCBfYiwgX2M7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBtYXhMZW5ndGhXb3Jkc1N1bSA9IGdyaWRDZWxsLmNlbGwuY29sdW1uLnRlbXBbJ2hlbG0tc3VtLW1heExlbmd0aFdvcmRzJ107XG4gICAgICAgICAgICBjb25zdCBtYXhJbmRleCA9IE9iamVjdC52YWx1ZXMoZ3JpZENlbGwuY2VsbC5jb2x1bW4udGVtcFsnaGVsbS1tYXhMZW5ndGhXb3JkcyddKS5sZW5ndGggLSAxO1xuICAgICAgICAgICAgY29uc3QgYXJnc1ggPSBlLm9mZnNldFggLSBncmlkQ2VsbC5ncmlkQ29sdW1uLmxlZnQgKyAoZ3JpZENlbGwuZ3JpZENvbHVtbi5sZWZ0IC0gZ3JpZENlbGwuYm91bmRzLngpO1xuICAgICAgICAgICAgbGV0IGxlZnQgPSAwO1xuICAgICAgICAgICAgbGV0IHJpZ2h0ID0gbWF4SW5kZXg7XG4gICAgICAgICAgICBsZXQgZm91bmQgPSBmYWxzZTtcbiAgICAgICAgICAgIG1heExlbmd0aFdvcmRzU3VtW21heEluZGV4ICsgMV0gPSBhcmdzWCArIDE7XG4gICAgICAgICAgICBsZXQgbWlkID0gMDtcbiAgICAgICAgICAgIGlmIChhcmdzWCA+IG1heExlbmd0aFdvcmRzU3VtWzBdKSB7XG4gICAgICAgICAgICAgICAgd2hpbGUgKCFmb3VuZCkge1xuICAgICAgICAgICAgICAgICAgICBtaWQgPSBNYXRoLmZsb29yKChyaWdodCArIGxlZnQpIC8gMik7XG4gICAgICAgICAgICAgICAgICAgIGlmIChhcmdzWCA+PSBtYXhMZW5ndGhXb3Jkc1N1bVttaWRdICYmIGFyZ3NYIDw9IG1heExlbmd0aFdvcmRzU3VtW21pZCArIDFdKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZWZ0ID0gbWlkO1xuICAgICAgICAgICAgICAgICAgICAgICAgZm91bmQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGFyZ3NYIDwgbWF4TGVuZ3RoV29yZHNTdW1bbWlkXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmlnaHQgPSBtaWQgLSAxO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGFyZ3NYID4gbWF4TGVuZ3RoV29yZHNTdW1bbWlkICsgMV0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxlZnQgPSBtaWQgKyAxO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChsZWZ0ID09IHJpZ2h0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZWZ0ID0gKGFyZ3NYID49IG1heExlbmd0aFdvcmRzU3VtW2xlZnRdKSA/IGxlZnQgKyAxIDogbGVmdDtcbiAgICAgICAgICAgIGNvbnN0IG1vbm9tZXJzID0gZmluZE1vbm9tZXJzKGdyaWRDZWxsLmNlbGwudmFsdWUpO1xuICAgICAgICAgICAgbGV0IHMgPSAoX2EgPSBncmlkQ2VsbC5jZWxsLnZhbHVlKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiAnJztcbiAgICAgICAgICAgIGxldCBzdWJQYXJ0cyA9IHBhcnNlSGVsbShzKTtcbiAgICAgICAgICAgIGxldCBhbGxQYXJ0cyA9IGdldFBhcnRzKHN1YlBhcnRzLCBzKTtcbiAgICAgICAgICAgIGxldCB0b29sdGlwTWVzc2FnZSA9IFtdO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhbGxQYXJ0cy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgICAgIGlmIChtb25vbWVycy5oYXMoYWxsUGFydHNbaV0pKVxuICAgICAgICAgICAgICAgICAgICB0b29sdGlwTWVzc2FnZVtpXSA9IHVpLmRpdlYoW1xuICAgICAgICAgICAgICAgICAgICAgICAgdWkuZGl2VGV4dChgTW9ub21lciAke2FsbFBhcnRzW2ldfSBub3QgZm91bmQuYCksXG4gICAgICAgICAgICAgICAgICAgICAgICB1aS5kaXZUZXh0KCdPcGVuIHRoZSBDb250ZXh0IFBhbmVsLCB0aGVuIGV4cGFuZCBNYW5hZ2UgTGlicmFyaWVzJylcbiAgICAgICAgICAgICAgICAgICAgXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAoKCgoX2MgPSAoX2IgPSB0b29sdGlwTWVzc2FnZVtsZWZ0XSkgPT09IG51bGwgfHwgX2IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9iLmNoaWxkTm9kZXMubGVuZ3RoKSAhPT0gbnVsbCAmJiBfYyAhPT0gdm9pZCAwID8gX2MgOiAwKSA+IDApKVxuICAgICAgICAgICAgICAgID8gdWkudG9vbHRpcC5zaG93KHVpLmRpdih0b29sdGlwTWVzc2FnZVtsZWZ0XSksIGUueCArIDE2LCBlLnkgKyAxNilcbiAgICAgICAgICAgICAgICA6IHVpLnRvb2x0aXAuaGlkZSgpO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgIGNvbnN0IGVyck1zZyA9IGVycm9yVG9Db25zb2xlKGVycik7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdIZWxtOiBIZWxtQ2VsbFJlbmRlcmVyLm9uTW91c2VNb3ZlKCkgZXJyb3I6XFxuJyArIGVyck1zZyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmVuZGVyKGcsIHgsIHksIHcsIGgsIGdyaWRDZWxsLCBjZWxsU3R5bGUpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICBjb25zdCBncmlkID0gZ3JpZENlbGwuZ3JpZFJvdyAhPT0gLTEgPyBncmlkQ2VsbC5ncmlkIDogdW5kZWZpbmVkO1xuICAgICAgICBjb25zdCB1bmRlZmluZWRDb2xvciA9ICdyZ2IoMTAwLDEwMCwxMDApJztcbiAgICAgICAgY29uc3QgZ3JheUNvbG9yID0gJyM4MDgwODAnO1xuICAgICAgICBjb25zdCBtb25vbWVycyA9IGZpbmRNb25vbWVycyhncmlkQ2VsbC5jZWxsLnZhbHVlKTtcbiAgICAgICAgbGV0IHMgPSAoX2EgPSBncmlkQ2VsbC5jZWxsLnZhbHVlKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiAnJztcbiAgICAgICAgbGV0IHN1YlBhcnRzID0gcGFyc2VIZWxtKHMpO1xuICAgICAgICBpZiAobW9ub21lcnMuc2l6ZSA9PSAwKSB7XG4gICAgICAgICAgICBjb25zdCBob3N0ID0gdWkuZGl2KFtdLCB7IHN0eWxlOiB7IHdpZHRoOiBgJHt3fXB4YCwgaGVpZ2h0OiBgJHtofXB4YCB9IH0pO1xuICAgICAgICAgICAgaG9zdC5zZXRBdHRyaWJ1dGUoJ2RhdGFmb3JtYXQnLCAnaGVsbScpO1xuICAgICAgICAgICAgaG9zdC5zZXRBdHRyaWJ1dGUoJ2RhdGEnLCBncmlkQ2VsbC5jZWxsLnZhbHVlKTtcbiAgICAgICAgICAgIGdyaWRDZWxsLmVsZW1lbnQgPSBob3N0O1xuICAgICAgICAgICAgLy9AdHMtaWdub3JlXG4gICAgICAgICAgICBjb25zdCBjYW52YXMgPSBuZXcgSlNEcmF3Mi5FZGl0b3IoaG9zdCwgeyB3aWR0aDogdywgaGVpZ2h0OiBoLCBza2luOiAndzgnLCB2aWV3b25seTogdHJ1ZSB9KTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAobW9ub21lcnMuc2l6ZSA+IDApIHtcbiAgICAgICAgICAgIHcgPSBncmlkID8gTWF0aC5taW4oZ3JpZC5jYW52YXMud2lkdGggLSB4LCB3KSA6IGcuY2FudmFzLndpZHRoIC0geDtcbiAgICAgICAgICAgIGcuc2F2ZSgpO1xuICAgICAgICAgICAgZy5iZWdpblBhdGgoKTtcbiAgICAgICAgICAgIGcucmVjdCh4LCB5LCB3LCBoKTtcbiAgICAgICAgICAgIGcuY2xpcCgpO1xuICAgICAgICAgICAgZy5mb250ID0gJzEycHggbW9ub3NwYWNlJztcbiAgICAgICAgICAgIGcudGV4dEJhc2VsaW5lID0gJ3RvcCc7XG4gICAgICAgICAgICBsZXQgeDEgPSB4O1xuICAgICAgICAgICAgbGV0IG1heExlbmd0aFdvcmRzID0ge307XG4gICAgICAgICAgICBsZXQgbWF4TGVuZ3RoV29yZFN1bSA9IHt9O1xuICAgICAgICAgICAgbGV0IGFsbFBhcnRzID0gZ2V0UGFydHMoc3ViUGFydHMsIHMpO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhbGxQYXJ0cy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgICAgIG1heExlbmd0aFdvcmRzW2ldID0gYWxsUGFydHNbaV0ubGVuZ3RoICogNztcbiAgICAgICAgICAgICAgICBsZXQgY29sb3IgPSBtb25vbWVycy5oYXMoYWxsUGFydHNbaV0pID8gJ3JlZCcgOiBncmF5Q29sb3I7XG4gICAgICAgICAgICAgICAgZy5maWxsU3R5bGUgPSB1bmRlZmluZWRDb2xvcjtcbiAgICAgICAgICAgICAgICB4MSA9IHByaW50TGVmdE9yQ2VudGVyZWQoeDEsIHksIHcsIGgsIGcsIGFsbFBhcnRzW2ldLCBjb2xvciwgMCwgdHJ1ZSwgMS4wKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG1heExlbmd0aFdvcmRTdW1bMF0gPSBtYXhMZW5ndGhXb3Jkc1swXTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAxOyBpIDwgYWxsUGFydHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBtYXhMZW5ndGhXb3JkU3VtW2ldID0gbWF4TGVuZ3RoV29yZFN1bVtpIC0gMV0gKyBtYXhMZW5ndGhXb3Jkc1tpXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGdyaWRDZWxsLmNlbGwuY29sdW1uLnRlbXAgPSB7XG4gICAgICAgICAgICAgICAgJ2hlbG0tc3VtLW1heExlbmd0aFdvcmRzJzogbWF4TGVuZ3RoV29yZFN1bSxcbiAgICAgICAgICAgICAgICAnaGVsbS1tYXhMZW5ndGhXb3Jkcyc6IG1heExlbmd0aFdvcmRzXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgZy5yZXN0b3JlKCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCJleHBvcnQgY29uc3QganNvblNkZk1vbm9tZXJMaWJEaWN0ID0ge1xuICAgIFwibW9ub21lclR5cGVcIjogbnVsbCxcbiAgICBcInNtaWxlc1wiOiBudWxsLFxuICAgIFwibmFtZVwiOiBcIk1vbm9tZXJOYW1lXCIsXG4gICAgXCJhdXRob3JcIjogbnVsbCxcbiAgICBcIm1vbGZpbGVcIjogXCJtb2xlY3VsZVwiLFxuICAgIFwibmF0dXJhbEFuYWxvZ1wiOiBcIk1vbm9tZXJOYXR1cmFsQW5hbG9nQ29kZVwiLFxuICAgIFwicmdyb3Vwc1wiOiBcIk1vbm9tZXJDYXBzXCIsXG4gICAgXCJjcmVhdGVEYXRlXCI6IG51bGwsXG4gICAgXCJpZFwiOiBudWxsLFxuICAgIFwicG9seW1lclR5cGVcIjogXCJNb25vbWVyVHlwZVwiLFxuICAgIFwic3ltYm9sXCI6IFwiTW9ub21lckNvZGVcIlxufTtcbmV4cG9ydCBjb25zdCBTTUlMRVMgPSAnc21pbGVzJztcbmV4cG9ydCBjb25zdCBSR1JPVVBTID0gXCJyZ3JvdXBzXCI7XG5leHBvcnQgY29uc3QgTU9OT01FUl9TWU1CT0wgPSBcInN5bWJvbFwiO1xuZXhwb3J0IGNvbnN0IFJHUk9VUF9DQVBfR1JPVVBfU01JTEVTID0gXCJjYXBHcm91cFNtaWxlc1wiO1xuZXhwb3J0IGNvbnN0IFJHUk9VUF9BTFRFUl9JRCA9IFwiYWx0ZXJuYXRlSWRcIjtcbmV4cG9ydCBjb25zdCBSR1JPVVBfQ0FQX0dST1VQX05BTUUgPSBcImNhcEdyb3VwTmFtZVwiO1xuZXhwb3J0IGNvbnN0IFJHUk9VUF9MQUJFTCA9IFwibGFiZWxcIjtcbmV4cG9ydCBjb25zdCBTREZfTU9OT01FUl9OQU1FID0gXCJNb25vbWVyTmFtZVwiO1xuIiwiaW1wb3J0ICogYXMgdWkgZnJvbSAnZGF0YWdyb2stYXBpL3VpJztcbmV4cG9ydCBjbGFzcyBIZWxtV2ViRWRpdG9yIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy53ID0gMjAwO1xuICAgICAgICB0aGlzLmggPSAxMDA7XG4gICAgICAgIHRoaXMuaG9zdCA9IHVpLmRpdihbXSwgeyBzdHlsZTogeyB3aWR0aDogYCR7dGhpcy53fXB4YCwgaGVpZ2h0OiBgJHt0aGlzLmh9cHhgIH0gfSk7XG4gICAgICAgIHRoaXMuZWRpdG9yID0gbmV3IEpTRHJhdzIuRWRpdG9yKHRoaXMuaG9zdCwgeyB3aWR0aDogdGhpcy53LCBoZWlnaHQ6IHRoaXMuaCwgdmlld29ubHk6IHRydWUgfSk7XG4gICAgfVxuICAgIHJlc2l6ZUVkaXRvcih3LCBoKSB7XG4gICAgICAgIHRoaXMuZWRpdG9yLnNldFNpemUodywgaCk7XG4gICAgfVxuICAgIGNyZWF0ZVdlYkVkaXRvcih2YWx1ZSkge1xuICAgICAgICBjb25zdCBlZGl0b3JWaWV3ID0gdWkuZGl2KCk7XG4gICAgICAgIG9yZy5oZWxtLndlYmVkaXRvci5Nb2xWaWV3ZXIubW9sc2NhbGUgPSAwLjg7XG4gICAgICAgIGNvbnN0IHdlYkVkaXRvciA9IG5ldyBzY2lsLmhlbG0uQXBwKGVkaXRvclZpZXcsIHtcbiAgICAgICAgICAgIHNob3dhYm91dDogZmFsc2UsXG4gICAgICAgICAgICBtZXhmb250c2l6ZTogJzkwJScsXG4gICAgICAgICAgICBtZXhybmFwaW5vbnRhYjogdHJ1ZSxcbiAgICAgICAgICAgIHRvcG1hcmdpbjogMjAsXG4gICAgICAgICAgICBtZXhtb25vbWVyc3RhYjogdHJ1ZSxcbiAgICAgICAgICAgIHNlcXVlbmNldmlld29ubHk6IGZhbHNlLFxuICAgICAgICAgICAgbWV4ZmF2b3JpdGVmaXJzdDogdHJ1ZSxcbiAgICAgICAgICAgIG1leGZpbHRlcjogdHJ1ZVxuICAgICAgICB9KTtcbiAgICAgICAgY29uc3Qgc2l6ZXMgPSB3ZWJFZGl0b3IuY2FsY3VsYXRlU2l6ZXMoKTtcbiAgICAgICAgd2ViRWRpdG9yLmNhbnZhcy5yZXNpemUoc2l6ZXMucmlnaHR3aWR0aCAtIDEwMCwgc2l6ZXMudG9waGVpZ2h0IC0gMjEwKTtcbiAgICAgICAgbGV0IHMgPSB7IHdpZHRoOiBzaXplcy5yaWdodHdpZHRoIC0gMTAwICsgJ3B4JywgaGVpZ2h0OiBzaXplcy5ib3R0b21oZWlnaHQgKyAncHgnIH07XG4gICAgICAgIC8vQHRzLWlnbm9yZVxuICAgICAgICBzY2lsLmFwcGx5KHdlYkVkaXRvci5zZXF1ZW5jZS5zdHlsZSwgcyk7XG4gICAgICAgIC8vQHRzLWlnbm9yZVxuICAgICAgICBzY2lsLmFwcGx5KHdlYkVkaXRvci5ub3RhdGlvbi5zdHlsZSwgcyk7XG4gICAgICAgIHMgPSB7IHdpZHRoOiBzaXplcy5yaWdodHdpZHRoICsgJ3B4JywgaGVpZ2h0OiAoc2l6ZXMuYm90dG9taGVpZ2h0ICsgd2ViRWRpdG9yLnRvb2xiYXJoZWlnaHQpICsgJ3B4JyB9O1xuICAgICAgICAvL0B0cy1pZ25vcmVcbiAgICAgICAgc2NpbC5hcHBseSh3ZWJFZGl0b3IucHJvcGVydGllcy5wYXJlbnQuc3R5bGUsIHMpO1xuICAgICAgICB3ZWJFZGl0b3Iuc3RydWN0dXJldmlldy5yZXNpemUoc2l6ZXMucmlnaHR3aWR0aCwgc2l6ZXMuYm90dG9taGVpZ2h0ICsgd2ViRWRpdG9yLnRvb2xiYXJoZWlnaHQpO1xuICAgICAgICB3ZWJFZGl0b3IubWV4LnJlc2l6ZShzaXplcy50b3BoZWlnaHQgLSA4MCk7XG4gICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgd2ViRWRpdG9yLmNhbnZhcy5oZWxtLnNldFNlcXVlbmNlKHZhbHVlLCAnSEVMTScpO1xuICAgICAgICB9LCAyMDApO1xuICAgICAgICByZXR1cm4geyBlZGl0b3JEaXY6IGVkaXRvclZpZXcsIHdlYkVkaXRvcjogd2ViRWRpdG9yIH07XG4gICAgfVxufVxuIiwiZXhwb3J0IGZ1bmN0aW9uIGdldFBhcnRzKHN1YlBhcnRzLCBzKSB7XG4gICAgbGV0IGogPSAwO1xuICAgIGxldCBhbGxQYXJ0cyA9IFtdO1xuICAgIGZvciAobGV0IGsgPSAwOyBrIDwgc3ViUGFydHMubGVuZ3RoOyArK2spIHtcbiAgICAgICAgbGV0IGluZGV4T2ZNb25vbWVyID0gcy5pbmRleE9mKHN1YlBhcnRzW2tdKTtcbiAgICAgICAgbGV0IGhlbG1CZWZvcmVNb25vbWVyID0gcy5zbGljZShqLCBpbmRleE9mTW9ub21lcik7XG4gICAgICAgIGFsbFBhcnRzLnB1c2goaGVsbUJlZm9yZU1vbm9tZXIpO1xuICAgICAgICBhbGxQYXJ0cy5wdXNoKHN1YlBhcnRzW2tdKTtcbiAgICAgICAgcyA9IHMuc3Vic3RyaW5nKGluZGV4T2ZNb25vbWVyICsgc3ViUGFydHNba10ubGVuZ3RoKTtcbiAgICB9XG4gICAgYWxsUGFydHMucHVzaChzKTtcbiAgICByZXR1cm4gYWxsUGFydHM7XG59XG5leHBvcnQgZnVuY3Rpb24gcGFyc2VIZWxtKHMpIHtcbiAgICB2YXIgc2VjdGlvbnMgPSBzcGxpdChzLCAnJCcpO1xuICAgIHMgPSBzZWN0aW9uc1swXTtcbiAgICB2YXIgbW9ub21lcnMgPSBbXTtcbiAgICAvL0B0cy1pZ25vcmVcbiAgICBpZiAoIXNjaWwuVXRpbHMuaXNOdWxsT3JFbXB0eShzKSkge1xuICAgICAgICB2YXIgc2VxcyA9IHNwbGl0KHMsICd8Jyk7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2Vxcy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgdmFyIGUgPSBkZXRhY2hBbm5vdGF0aW9uKHNlcXNbaV0pO1xuICAgICAgICAgICAgcyA9IGUuc3RyO1xuICAgICAgICAgICAgdmFyIHAgPSBzLmluZGV4T2YoJ3snKTtcbiAgICAgICAgICAgIHMgPSBzLnN1YnN0cmluZyhwICsgMSk7XG4gICAgICAgICAgICBwID0gcy5pbmRleE9mKCd9Jyk7XG4gICAgICAgICAgICBzID0gcy5zdWJzdHJpbmcoMCwgcCk7XG4gICAgICAgICAgICB2YXIgc3MgPSBzcGxpdChzLCAnLicpO1xuICAgICAgICAgICAgZm9yICh2YXIgbW9ub21lciBvZiBzcykge1xuICAgICAgICAgICAgICAgIGlmIChtb25vbWVyLmluY2x1ZGVzKCcoJykgJiYgbW9ub21lci5pbmNsdWRlcygnKScpKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBlbGVtZW50cyA9IG1vbm9tZXIucmVwbGFjZSgvWygpXS9nLCAnJykuc3BsaXQoJycpO1xuICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBlbCBvZiBlbGVtZW50cykge1xuICAgICAgICAgICAgICAgICAgICAgICAgbW9ub21lcnMucHVzaChlbCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAobW9ub21lci5pbmNsdWRlcygnWycpICYmIG1vbm9tZXIuaW5jbHVkZXMoJ10nKSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgZWxlbWVudCA9IG1vbm9tZXIubWF0Y2goLyg/PD1cXFspLio/KD89XFxdKS9nLCAnJyk7XG4gICAgICAgICAgICAgICAgICAgIG1vbm9tZXJzLnB1c2goZWxlbWVudFswXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBtb25vbWVycy5wdXNoKG1vbm9tZXIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbW9ub21lcnM7XG59XG5leHBvcnQgZnVuY3Rpb24gZmluZE1vbm9tZXJzKGhlbG1TdHJpbmcpIHtcbiAgICAvL0B0cy1pZ25vcmVcbiAgICBjb25zdCB0eXBlcyA9IE9iamVjdC5rZXlzKG9yZy5oZWxtLndlYmVkaXRvci5tb25vbWVyVHlwZUxpc3QoKSk7XG4gICAgY29uc3QgbW9ub21lcnMgPSBbXTtcbiAgICBjb25zdCBtb25vbWVyX25hbWVzID0gW107XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0eXBlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAvL0B0cy1pZ25vcmVcbiAgICAgICAgbW9ub21lcnMucHVzaChuZXcgc2NpbC5oZWxtLk1vbm9tZXJzLmdldE1vbm9tZXJTZXQodHlwZXNbaV0pKTtcbiAgICAgICAgT2JqZWN0LmtleXMobW9ub21lcnNbaV0pLmZvckVhY2goayA9PiB7XG4gICAgICAgICAgICBtb25vbWVyX25hbWVzLnB1c2gobW9ub21lcnNbaV1ba10uaWQpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgY29uc3Qgc3BsaXRfc3RyaW5nID0gcGFyc2VIZWxtKGhlbG1TdHJpbmcpO1xuICAgIHJldHVybiBuZXcgU2V0KHNwbGl0X3N0cmluZy5maWx0ZXIodmFsID0+ICFtb25vbWVyX25hbWVzLmluY2x1ZGVzKHZhbCkpKTtcbn1cbmZ1bmN0aW9uIHNwbGl0KHMsIHNlcCkge1xuICAgIHZhciByZXQgPSBbXTtcbiAgICB2YXIgZnJhZyA9ICcnO1xuICAgIHZhciBwYXJlbnRoZXNlcyA9IDA7XG4gICAgdmFyIGJyYWNrZXQgPSAwO1xuICAgIHZhciBicmFjZXMgPSAwO1xuICAgIHZhciBxdW90ZSA9IDA7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgIHZhciBjID0gcy5zdWJzdHJpbmcoaSwgaSArIDEpO1xuICAgICAgICBpZiAoYyA9PSBzZXAgJiYgYnJhY2tldCA9PSAwICYmIHBhcmVudGhlc2VzID09IDAgJiYgYnJhY2VzID09IDAgJiYgcXVvdGUgPT0gMCkge1xuICAgICAgICAgICAgcmV0LnB1c2goZnJhZyk7XG4gICAgICAgICAgICBmcmFnID0gJyc7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBmcmFnICs9IGM7XG4gICAgICAgICAgICBpZiAocXVvdGUgPiAwKSB7XG4gICAgICAgICAgICAgICAgaWYgKGMgPT0gJ1xcXFwnICYmIGkgKyAxIDwgcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgKytpO1xuICAgICAgICAgICAgICAgICAgICB2YXIgYzIgPSBzLnN1YnN0cmluZyhpLCBpICsgMSk7XG4gICAgICAgICAgICAgICAgICAgIGZyYWcgKz0gYzI7XG4gICAgICAgICAgICAgICAgICAgIGMgKz0gYzI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGMgPT0gJ1xcXCInKSB7XG4gICAgICAgICAgICAgICAgaWYgKCEoaSA+IDAgJiYgcy5zdWJzdHJpbmcoaSAtIDEsIGkpID09ICdcXFxcJykpXG4gICAgICAgICAgICAgICAgICAgIHF1b3RlID0gcXVvdGUgPT0gMCA/IDEgOiAwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoYyA9PSAnWycpXG4gICAgICAgICAgICAgICAgKyticmFja2V0O1xuICAgICAgICAgICAgZWxzZSBpZiAoYyA9PSAnXScpXG4gICAgICAgICAgICAgICAgLS1icmFja2V0O1xuICAgICAgICAgICAgZWxzZSBpZiAoYyA9PSAnKCcpXG4gICAgICAgICAgICAgICAgKytwYXJlbnRoZXNlcztcbiAgICAgICAgICAgIGVsc2UgaWYgKGMgPT0gJyknKVxuICAgICAgICAgICAgICAgIC0tcGFyZW50aGVzZXM7XG4gICAgICAgICAgICBlbHNlIGlmIChjID09ICd7JylcbiAgICAgICAgICAgICAgICArK2JyYWNlcztcbiAgICAgICAgICAgIGVsc2UgaWYgKGMgPT0gJ30nKVxuICAgICAgICAgICAgICAgIC0tYnJhY2VzO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldC5wdXNoKGZyYWcpO1xuICAgIHJldHVybiByZXQ7XG59XG5mdW5jdGlvbiBkZXRhY2hBbm5vdGF0aW9uKHMpIHtcbiAgICB2YXIgcmV0ID0gX2RldGFjaEFwcGVuZGl4KHMsICdcXFwiJyk7XG4gICAgaWYgKHJldC50YWcgIT0gbnVsbClcbiAgICAgICAgcmV0dXJuIHJldDtcbiAgICB2YXIgciA9IF9kZXRhY2hBcHBlbmRpeChzLCAnXFwnJyk7XG4gICAgcmV0dXJuIHsgdGFnOiByZXQudGFnLCByZXBlYXQ6IHIudGFnLCBzdHI6IHIuc3RyIH07XG59XG5mdW5jdGlvbiBfZGV0YWNoQXBwZW5kaXgocywgYykge1xuICAgIHZhciB0YWcgPSBudWxsO1xuICAgIC8vQHRzLWlnbm9yZVxuICAgIGlmIChzY2lsLlV0aWxzLmVuZHN3aXRoKHMsIGMpKSB7XG4gICAgICAgIHZhciBwID0gcy5sZW5ndGggLSAxO1xuICAgICAgICB3aGlsZSAocCA+IDApIHtcbiAgICAgICAgICAgIHAgPSBzLmxhc3RJbmRleE9mKGMsIHAgLSAxKTtcbiAgICAgICAgICAgIGlmIChwIDw9IDAgfHwgcy5zdWJzdHJpbmcocCAtIDEsIHApICE9ICdcXFxcJylcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBpZiAocCA+IDAgJiYgcCA8IHMubGVuZ3RoIC0gMSkge1xuICAgICAgICAgICAgdGFnID0gcy5zdWJzdHJpbmcocCArIDEsIHMubGVuZ3RoIC0gMSk7XG4gICAgICAgICAgICBzID0gcy5zdWJzdHJpbmcoMCwgcCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKHRhZyAhPSBudWxsKVxuICAgICAgICB0YWcgPSB0YWcucmVwbGFjZShuZXcgUmVnRXhwKCdcXFxcJyArIGMsICdnJyksIGMpO1xuICAgIHJldHVybiB7IHRhZzogdW5lc2NhcGUodGFnKSwgc3RyOiBzIH07XG59XG5mdW5jdGlvbiB1bmVzY2FwZShzKSB7XG4gICAgLy9AdHMtaWdub3JlXG4gICAgaWYgKHNjaWwuVXRpbHMuaXNOdWxsT3JFbXB0eShzKSlcbiAgICAgICAgcmV0dXJuIHM7XG4gICAgcmV0dXJuIHMucmVwbGFjZSgvW1xcXFxdLi9nLCBmdW5jdGlvbiAobSkge1xuICAgICAgICBzd2l0Y2ggKG0pIHtcbiAgICAgICAgICAgIGNhc2UgJ1xcXFxyJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gJ1xccic7XG4gICAgICAgICAgICBjYXNlICdcXFxcbic6XG4gICAgICAgICAgICAgICAgcmV0dXJuICdcXG4nO1xuICAgICAgICAgICAgY2FzZSAnXFxcXHQnOlxuICAgICAgICAgICAgICAgIHJldHVybiAnXFx0JztcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgcmV0dXJuIG0uc3Vic3RyaW5nKDEpO1xuICAgICAgICB9XG4gICAgfSk7XG59XG4iLCJtb2R1bGUuZXhwb3J0cyA9IERHOyIsIm1vZHVsZS5leHBvcnRzID0gZ3JvazsiLCJtb2R1bGUuZXhwb3J0cyA9IHVpOyIsIm1vZHVsZS5leHBvcnRzID0gd3U7IiwiLy8gVGhlIG1vZHVsZSBjYWNoZVxudmFyIF9fd2VicGFja19tb2R1bGVfY2FjaGVfXyA9IHt9O1xuXG4vLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuXHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcblx0dmFyIGNhY2hlZE1vZHVsZSA9IF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF07XG5cdGlmIChjYWNoZWRNb2R1bGUgIT09IHVuZGVmaW5lZCkge1xuXHRcdHJldHVybiBjYWNoZWRNb2R1bGUuZXhwb3J0cztcblx0fVxuXHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuXHR2YXIgbW9kdWxlID0gX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXSA9IHtcblx0XHQvLyBubyBtb2R1bGUuaWQgbmVlZGVkXG5cdFx0Ly8gbm8gbW9kdWxlLmxvYWRlZCBuZWVkZWRcblx0XHRleHBvcnRzOiB7fVxuXHR9O1xuXG5cdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuXHRfX3dlYnBhY2tfbW9kdWxlc19fW21vZHVsZUlkXShtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcblxuXHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuXHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG59XG5cbiIsIi8vIGdldERlZmF1bHRFeHBvcnQgZnVuY3Rpb24gZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBub24taGFybW9ueSBtb2R1bGVzXG5fX3dlYnBhY2tfcmVxdWlyZV9fLm4gPSAobW9kdWxlKSA9PiB7XG5cdHZhciBnZXR0ZXIgPSBtb2R1bGUgJiYgbW9kdWxlLl9fZXNNb2R1bGUgP1xuXHRcdCgpID0+IChtb2R1bGVbJ2RlZmF1bHQnXSkgOlxuXHRcdCgpID0+IChtb2R1bGUpO1xuXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQoZ2V0dGVyLCB7IGE6IGdldHRlciB9KTtcblx0cmV0dXJuIGdldHRlcjtcbn07IiwiLy8gZGVmaW5lIGdldHRlciBmdW5jdGlvbnMgZm9yIGhhcm1vbnkgZXhwb3J0c1xuX193ZWJwYWNrX3JlcXVpcmVfXy5kID0gKGV4cG9ydHMsIGRlZmluaXRpb24pID0+IHtcblx0Zm9yKHZhciBrZXkgaW4gZGVmaW5pdGlvbikge1xuXHRcdGlmKF9fd2VicGFja19yZXF1aXJlX18ubyhkZWZpbml0aW9uLCBrZXkpICYmICFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZXhwb3J0cywga2V5KSkge1xuXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIGtleSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGRlZmluaXRpb25ba2V5XSB9KTtcblx0XHR9XG5cdH1cbn07IiwiX193ZWJwYWNrX3JlcXVpcmVfXy5vID0gKG9iaiwgcHJvcCkgPT4gKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIHByb3ApKSIsIi8vIGRlZmluZSBfX2VzTW9kdWxlIG9uIGV4cG9ydHNcbl9fd2VicGFja19yZXF1aXJlX18uciA9IChleHBvcnRzKSA9PiB7XG5cdGlmKHR5cGVvZiBTeW1ib2wgIT09ICd1bmRlZmluZWQnICYmIFN5bWJvbC50b1N0cmluZ1RhZykge1xuXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBTeW1ib2wudG9TdHJpbmdUYWcsIHsgdmFsdWU6ICdNb2R1bGUnIH0pO1xuXHR9XG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7XG59OyIsInZhciBfX2F3YWl0ZXIgPSAodGhpcyAmJiB0aGlzLl9fYXdhaXRlcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gICAgfSk7XG59O1xuLyogRG8gbm90IGNoYW5nZSB0aGVzZSBpbXBvcnQgbGluZXMgdG8gbWF0Y2ggZXh0ZXJuYWwgbW9kdWxlcyBpbiB3ZWJwYWNrIGNvbmZpZ3VyYXRpb24gKi9cbmltcG9ydCAqIGFzIGdyb2sgZnJvbSAnZGF0YWdyb2stYXBpL2dyb2snO1xuaW1wb3J0ICogYXMgdWkgZnJvbSAnZGF0YWdyb2stYXBpL3VpJztcbmltcG9ydCAqIGFzIERHIGZyb20gJ2RhdGFncm9rLWFwaS9kZyc7XG5pbXBvcnQgeyBSR1JPVVBfQ0FQX0dST1VQX05BTUUsIFJHUk9VUF9MQUJFTCwgU01JTEVTIH0gZnJvbSAnLi9jb25zdGFudHMnO1xuaW1wb3J0IHsgSGVsbVdlYkVkaXRvciB9IGZyb20gJy4vaGVsbS13ZWItZWRpdG9yJztcbmltcG9ydCB7IEhlbG1DZWxsUmVuZGVyZXIgfSBmcm9tICcuL2NlbGwtcmVuZGVyZXInO1xuaW1wb3J0IHsgTm90YXRpb25Db252ZXJ0ZXIgfSBmcm9tICdAZGF0YWdyb2stbGlicmFyaWVzL2Jpby9zcmMvdXRpbHMvbm90YXRpb24tY29udmVydGVyJztcbmltcG9ydCB7IGZpbmRNb25vbWVycyB9IGZyb20gJy4vdXRpbHMnO1xuaW1wb3J0IHsgZXJyb3JUb0NvbnNvbGUgfSBmcm9tICdAZGF0YWdyb2stbGlicmFyaWVzL3V0aWxzL3NyYy90by1jb25zb2xlJztcbmV4cG9ydCBjb25zdCBfcGFja2FnZSA9IG5ldyBERy5QYWNrYWdlKCk7XG5sZXQgbW9ub21lckxpYiA9IG51bGw7XG4vL3RhZ3M6IGluaXRcbmV4cG9ydCBmdW5jdGlvbiBpbml0SGVsbSgpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5hbGwoW25ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgZG9qby5yZWFkeShmdW5jdGlvbiAoKSB7IHJlc29sdmUobnVsbCk7IH0pO1xuICAgICAgICAgICAgfSksIHlpZWxkIGdyb2suZnVuY3Rpb25zLmNhbGwoJ0JpbzpnZXRCaW9MaWInKV0pLnRoZW4oKFtfLCBsaWJdKSA9PiB7XG4gICAgICAgICAgICBtb25vbWVyTGliID0gbGliO1xuICAgICAgICAgICAgcmV3cml0ZUxpYnJhcmllcygpOyAvLyBpbml0SGVsbSgpXG4gICAgICAgICAgICBtb25vbWVyTGliLm9uQ2hhbmdlZC5zdWJzY3JpYmUoKF8pID0+IHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICByZXdyaXRlTGlicmFyaWVzKCk7IC8vIGluaXRIZWxtKClcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbW9uVHlwZUxpc3QgPSBtb25vbWVyTGliLmdldFR5cGVzKCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG1zZ1N0ciA9ICdNb25vbWVyIGxpYiB1cGRhdGVkOjxiciAvPicgKyAobW9uVHlwZUxpc3QubGVuZ3RoID09IDAgPyAnZW1wdHknIDogbW9uVHlwZUxpc3QubWFwKChtb25UeXBlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYCR7bW9uVHlwZX0gJHttb25vbWVyTGliLmdldE1vbm9tZXJOYW1lc0J5VHlwZShtb25UeXBlKS5sZW5ndGh9YDtcbiAgICAgICAgICAgICAgICAgICAgfSkuam9pbignPGJyIC8+JykpO1xuICAgICAgICAgICAgICAgICAgICBncm9rLnNoZWxsLmluZm8obXNnU3RyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBlcnJNc2cgPSBlcnJvclRvQ29uc29sZShlcnIpO1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCdIZWxtOiBpbml0SGVsbSBtb25vbWVyTGliLm9uQ2hhbmdlZCgpIGVycm9yOlxcbicgKyBlcnJNc2cpO1xuICAgICAgICAgICAgICAgICAgICAvLyB0aHJvdyBlcnI7IC8vIFByZXZlbnQgZGlzYWJsaW5nIGV2ZW50IGhhbmRsZXJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG59XG5mdW5jdGlvbiByZXdyaXRlTGlicmFyaWVzKCkge1xuICAgIG9yZy5oZWxtLndlYmVkaXRvci5Nb25vbWVycy5jbGVhcigpO1xuICAgIG1vbm9tZXJMaWIuZ2V0VHlwZXMoKS5mb3JFYWNoKCh0eXBlKSA9PiB7XG4gICAgICAgIGNvbnN0IG1tcyA9IG1vbm9tZXJMaWIuZ2V0TW9ub21lck5hbWVzQnlUeXBlKHR5cGUpO1xuICAgICAgICBtbXMuZm9yRWFjaCgoc3ltYm9sKSA9PiB7XG4gICAgICAgICAgICBsZXQgaXNCcm9rZW4gPSBmYWxzZTtcbiAgICAgICAgICAgIGNvbnN0IG1vbm9tZXIgPSBtb25vbWVyTGliLmdldE1vbm9tZXIodHlwZSwgc3ltYm9sKTtcbiAgICAgICAgICAgIGNvbnN0IHdlYkVkaXRvck1vbm9tZXIgPSB7XG4gICAgICAgICAgICAgICAgaWQ6IHN5bWJvbCxcbiAgICAgICAgICAgICAgICBtOiBtb25vbWVyLm1vbGZpbGUsXG4gICAgICAgICAgICAgICAgbjogbW9ub21lci5uYW1lLFxuICAgICAgICAgICAgICAgIG5hOiBtb25vbWVyLm5hdHVyYWxBbmFsb2csXG4gICAgICAgICAgICAgICAgcnM6IG1vbm9tZXIucmdyb3Vwcy5sZW5ndGgsXG4gICAgICAgICAgICAgICAgdHlwZTogbW9ub21lci5wb2x5bWVyVHlwZSxcbiAgICAgICAgICAgICAgICBtdDogbW9ub21lci5tb25vbWVyVHlwZSxcbiAgICAgICAgICAgICAgICBhdDoge31cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBpZiAobW9ub21lci5yZ3JvdXBzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICB3ZWJFZGl0b3JNb25vbWVyLnJzID0gbW9ub21lci5yZ3JvdXBzLmxlbmd0aDtcbiAgICAgICAgICAgICAgICBjb25zdCBhdCA9IHt9O1xuICAgICAgICAgICAgICAgIG1vbm9tZXIucmdyb3Vwcy5mb3JFYWNoKGl0ID0+IHtcbiAgICAgICAgICAgICAgICAgICAgYXRbaXRbUkdST1VQX0xBQkVMXV0gPSBpdFtSR1JPVVBfQ0FQX0dST1VQX05BTUVdO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHdlYkVkaXRvck1vbm9tZXIuYXQgPSBhdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKG1vbm9tZXIuZGF0YVtTTUlMRVNdICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICB3ZWJFZGl0b3JNb25vbWVyLnJzID0gT2JqZWN0LmtleXMoZ2V0UlMobW9ub21lci5kYXRhW1NNSUxFU10udG9TdHJpbmcoKSkpLmxlbmd0aDtcbiAgICAgICAgICAgICAgICB3ZWJFZGl0b3JNb25vbWVyLmF0ID0gZ2V0UlMobW9ub21lci5kYXRhW1NNSUxFU10udG9TdHJpbmcoKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBpc0Jyb2tlbiA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIWlzQnJva2VuKVxuICAgICAgICAgICAgICAgIG9yZy5oZWxtLndlYmVkaXRvci5Nb25vbWVycy5hZGRPbmVNb25vbWVyKHdlYkVkaXRvck1vbm9tZXIpO1xuICAgICAgICB9KTtcbiAgICB9KTtcbiAgICAvLyBPYnNvbGV0ZVxuICAgIGxldCBncmlkID0gZ3Jvay5zaGVsbC50di5ncmlkO1xuICAgIGlmIChncmlkKVxuICAgICAgICBncmlkLmludmFsaWRhdGUoKTtcbn1cbi8vbmFtZTogaGVsbUNlbGxSZW5kZXJlclxuLy90YWdzOiBjZWxsUmVuZGVyZXJcbi8vbWV0YS5jZWxsVHlwZTogaGVsbVxuLy9tZXRhLmNvbHVtblRhZ3M6IHVuaXRzPWhlbG1cbi8vb3V0cHV0OiBncmlkX2NlbGxfcmVuZGVyZXIgcmVzdWx0XG5leHBvcnQgZnVuY3Rpb24gaGVsbUNlbGxSZW5kZXJlcigpIHtcbiAgICByZXR1cm4gbmV3IEhlbG1DZWxsUmVuZGVyZXIoKTtcbn1cbi8vdGFnczogY2VsbEVkaXRvclxuLy9kZXNjcmlwdGlvbjogTWFjcm9tb2xlY3VsZSAgXG4vL2lucHV0OiBncmlkX2NlbGwgY2VsbFxuZXhwb3J0IGZ1bmN0aW9uIGVkaXRNb2xlY3VsZUNlbGwoY2VsbCkge1xuICAgIGNvbnN0IG1vbm9tZXJzID0gZmluZE1vbm9tZXJzKGNlbGwuY2VsbC52YWx1ZSk7XG4gICAgaWYgKGNlbGwuZ3JpZENvbHVtbi5jb2x1bW4udGFnc1tERy5UQUdTLlVOSVRTXSA9PT0gJ2hlbG0nKVxuICAgICAgICBpZiAobW9ub21lcnMuc2l6ZSA9PSAwKVxuICAgICAgICAgICAgd2ViRWRpdG9yKGNlbGwpO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICBncm9rLnNoZWxsLndhcm5pbmcoYE1vbm9tZXJzICR7QXJyYXkuZnJvbShtb25vbWVycykuam9pbignLCAnKX0gYXJlIGFic2VudCFgKTtcbn1cbi8vbmFtZTogT3BlbiBIZWxtIFdlYiBFZGl0b3Jcbi8vZGVzY3JpcHRpb246IEFkZHMgZWRpdG9yXG4vL21ldGEuYWN0aW9uOiBPcGVuIEhlbG0gV2ViIEVkaXRvclxuLy9pbnB1dDogc3RyaW5nIG1vbCB7IHNlbVR5cGU6IE1hY3JvbW9sZWN1bGUgfVxuZXhwb3J0IGZ1bmN0aW9uIG9wZW5FZGl0b3IobW9sKSB7XG4gICAgbGV0IGRmID0gZ3Jvay5zaGVsbC50di5ncmlkLmRhdGFGcmFtZTtcbiAgICBsZXQgY29udmVydGVyID0gbmV3IE5vdGF0aW9uQ29udmVydGVyKGRmLmNvbHVtbnMuYnlTZW1UeXBlKCdNYWNyb21vbGVjdWxlJykpO1xuICAgIGNvbnN0IHJlc1N0ciA9IGNvbnZlcnRlci5jb252ZXJ0U3RyaW5nVG9IZWxtKG1vbCwgJy8nKTtcbiAgICBjb25zdCBtb25vbWVycyA9IGZpbmRNb25vbWVycyhyZXNTdHIpO1xuICAgIGlmIChtb25vbWVycy5zaXplID09IDApXG4gICAgICAgIHdlYkVkaXRvcih1bmRlZmluZWQsIHJlc1N0cik7XG4gICAgZWxzZVxuICAgICAgICBncm9rLnNoZWxsLndhcm5pbmcoYE1vbm9tZXJzICR7QXJyYXkuZnJvbShtb25vbWVycykuam9pbignLCAnKX0gYXJlIGFic2VudCFgKTtcbn1cbi8vbmFtZTogUHJvcGVydGllc1xuLy90YWdzOiBwYW5lbCwgd2lkZ2V0c1xuLy9pbnB1dDogc3RyaW5nIGhlbG1TdHJpbmcge3NlbVR5cGU6IE1hY3JvbW9sZWN1bGV9XG4vL291dHB1dDogd2lkZ2V0IHJlc3VsdFxuZXhwb3J0IGZ1bmN0aW9uIHByb3BlcnRpZXNQYW5lbChoZWxtU3RyaW5nKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgbGV0IGdyaWQgPSBncm9rLnNoZWxsLnR2LmdyaWQ7XG4gICAgICAgIGxldCBwYXJlbnQgPSBncmlkLnJvb3QucGFyZW50RWxlbWVudDtcbiAgICAgICAgY29uc3QgaG9zdCA9IHVpLmRpdihbXSk7XG4gICAgICAgIHBhcmVudC5hcHBlbmRDaGlsZChob3N0KTtcbiAgICAgICAgbGV0IGVkaXRvciA9IG5ldyBKU0RyYXcyLkVkaXRvcihob3N0LCB7IHZpZXdvbmx5OiB0cnVlIH0pO1xuICAgICAgICBob3N0LnN0eWxlLndpZHRoID0gJzBweCc7XG4gICAgICAgIGhvc3Quc3R5bGUuaGVpZ2h0ID0gJzBweCc7XG4gICAgICAgIGVkaXRvci5zZXRIZWxtKGhlbG1TdHJpbmcpO1xuICAgICAgICBsZXQgZm9ybXVsYSA9IGVkaXRvci5nZXRGb3JtdWxhKHRydWUpO1xuICAgICAgICBsZXQgbW9sV2VpZ2h0ID0gTWF0aC5yb3VuZChlZGl0b3IuZ2V0TW9sV2VpZ2h0KCkgKiAxMDApIC8gMTAwO1xuICAgICAgICBsZXQgY29lZiA9IE1hdGgucm91bmQoZWRpdG9yLmdldEV4dGluY3Rpb25Db2VmZmljaWVudCh0cnVlKSAqIDEwMCkgLyAxMDA7XG4gICAgICAgIHBhcmVudC5sYXN0Q2hpbGQucmVtb3ZlKCk7XG4gICAgICAgIHJldHVybiBuZXcgREcuV2lkZ2V0KHVpLnRhYmxlRnJvbU1hcCh7XG4gICAgICAgICAgICAnZm9ybXVsYSc6IGZvcm11bGEucmVwbGFjZSgvPHN1Yj4vZywgJycpLnJlcGxhY2UoLzxcXC9zdWI+L2csICcnKSxcbiAgICAgICAgICAgICdtb2xlY3VsYXIgd2VpZ2h0JzogbW9sV2VpZ2h0LFxuICAgICAgICAgICAgJ2V4dGluY3Rpb24gY29lZmZpY2llbnQnOiBjb2VmLFxuICAgICAgICB9KSk7XG4gICAgfSk7XG59XG5mdW5jdGlvbiB3ZWJFZGl0b3IoY2VsbCwgdmFsdWUpIHtcbiAgICBsZXQgdmlldyA9IHVpLmRpdigpO1xuICAgIG9yZy5oZWxtLndlYmVkaXRvci5Nb2xWaWV3ZXIubW9sc2NhbGUgPSAwLjg7XG4gICAgbGV0IGFwcCA9IG5ldyBzY2lsLmhlbG0uQXBwKHZpZXcsIHtcbiAgICAgICAgc2hvd2Fib3V0OiBmYWxzZSxcbiAgICAgICAgbWV4Zm9udHNpemU6ICc5MCUnLFxuICAgICAgICBtZXhybmFwaW5vbnRhYjogdHJ1ZSxcbiAgICAgICAgdG9wbWFyZ2luOiAyMCxcbiAgICAgICAgbWV4bW9ub21lcnN0YWI6IHRydWUsXG4gICAgICAgIHNlcXVlbmNldmlld29ubHk6IGZhbHNlLFxuICAgICAgICBtZXhmYXZvcml0ZWZpcnN0OiB0cnVlLFxuICAgICAgICBtZXhmaWx0ZXI6IHRydWVcbiAgICB9KTtcbiAgICB2YXIgc2l6ZXMgPSBhcHAuY2FsY3VsYXRlU2l6ZXMoKTtcbiAgICBhcHAuY2FudmFzLnJlc2l6ZShzaXplcy5yaWdodHdpZHRoIC0gMTAwLCBzaXplcy50b3BoZWlnaHQgLSAyMTApO1xuICAgIHZhciBzID0geyB3aWR0aDogc2l6ZXMucmlnaHR3aWR0aCAtIDEwMCArICdweCcsIGhlaWdodDogc2l6ZXMuYm90dG9taGVpZ2h0ICsgJ3B4JyB9O1xuICAgIC8vQHRzLWlnbm9yZVxuICAgIHNjaWwuYXBwbHkoYXBwLnNlcXVlbmNlLnN0eWxlLCBzKTtcbiAgICAvL0B0cy1pZ25vcmVcbiAgICBzY2lsLmFwcGx5KGFwcC5ub3RhdGlvbi5zdHlsZSwgcyk7XG4gICAgcyA9IHsgd2lkdGg6IHNpemVzLnJpZ2h0d2lkdGggKyAncHgnLCBoZWlnaHQ6IChzaXplcy5ib3R0b21oZWlnaHQgKyBhcHAudG9vbGJhcmhlaWdodCkgKyAncHgnIH07XG4gICAgLy9AdHMtaWdub3JlXG4gICAgc2NpbC5hcHBseShhcHAucHJvcGVydGllcy5wYXJlbnQuc3R5bGUsIHMpO1xuICAgIGFwcC5zdHJ1Y3R1cmV2aWV3LnJlc2l6ZShzaXplcy5yaWdodHdpZHRoLCBzaXplcy5ib3R0b21oZWlnaHQgKyBhcHAudG9vbGJhcmhlaWdodCk7XG4gICAgYXBwLm1leC5yZXNpemUoc2l6ZXMudG9waGVpZ2h0IC0gODApO1xuICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodHlwZW9mIGNlbGwgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBhcHAuY2FudmFzLmhlbG0uc2V0U2VxdWVuY2UoY2VsbC5jZWxsLnZhbHVlLCAnSEVMTScpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgYXBwLmNhbnZhcy5oZWxtLnNldFNlcXVlbmNlKHZhbHVlLCAnSEVMTScpO1xuICAgICAgICB9XG4gICAgfSwgMjAwKTtcbiAgICAvL0B0cy1pZ25vcmVcbiAgICB1aS5kaWFsb2coeyBzaG93SGVhZGVyOiBmYWxzZSwgc2hvd0Zvb3RlcjogdHJ1ZSB9KVxuICAgICAgICAuYWRkKHZpZXcpXG4gICAgICAgIC5vbk9LKCgpID0+IHtcbiAgICAgICAgaWYgKHR5cGVvZiBjZWxsICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgY2VsbC5jZWxsLnZhbHVlID0gYXBwLmNhbnZhcy5nZXRIZWxtKHRydWUpLnJlcGxhY2UoLzxcXC9zcGFuPi9nLCAnJykucmVwbGFjZSgvPHNwYW4gc3R5bGU9J2JhY2tncm91bmQ6I2JiZjsnPi9nLCAnJyk7XG4gICAgICAgIH1cbiAgICB9KS5zaG93KHsgbW9kYWw6IHRydWUsIGZ1bGxTY3JlZW46IHRydWUgfSk7XG59XG5mdW5jdGlvbiBhY2Nlc3NTZXJ2ZXIodXJsLCBrZXkpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBjb25zdCBwYXJhbXMgPSB7XG4gICAgICAgICAgICBtZXRob2Q6ICdHRVQnLFxuICAgICAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgICAgICAgICdBY2NlcHQnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0geWllbGQgZmV0Y2godXJsLCBwYXJhbXMpO1xuICAgICAgICBjb25zdCBqc29uID0geWllbGQgcmVzcG9uc2UuanNvbigpO1xuICAgICAgICByZXR1cm4ganNvbltrZXldO1xuICAgIH0pO1xufVxuLy9uYW1lOiBoZWxtVG9GYXN0YVxuLy9pbnB1dDogc3RyaW5nIGhlbG1TdHJpbmcge3NlbVR5cGU6IE1hY3JvbW9sZWN1bGV9XG4vL291dHB1dDogc3RyaW5nIHJlc1xuZXhwb3J0IGZ1bmN0aW9uIGhlbG1Ub0Zhc3RhKGhlbG1TdHJpbmcpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBjb25zdCB1cmwgPSBgaHR0cDovL2xvY2FsaG9zdDo4MDgxL1dlYlNlcnZpY2Uvc2VydmljZS9GYXN0YS9Qcm9kdWNlLyR7aGVsbVN0cmluZ31gO1xuICAgICAgICByZXR1cm4geWllbGQgYWNjZXNzU2VydmVyKHVybCwgJ0Zhc3RhRmlsZScpO1xuICAgIH0pO1xufVxuLy9uYW1lOiBoZWxtVG9STkFcbi8vZGVzY3JpcHRpb246IGNvbnZlcnRzIHRvIHJuYSBhbmFsb2d1ZSBzZXF1ZW5jZVxuLy9pbnB1dDogc3RyaW5nIGhlbG1TdHJpbmcge3NlbVR5cGU6IE1hY3JvbW9sZWN1bGV9XG4vL291dHB1dDogc3RyaW5nIHJlc1xuZXhwb3J0IGZ1bmN0aW9uIGhlbG1Ub1JOQShoZWxtU3RyaW5nKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgY29uc3QgdXJsID0gYGh0dHA6Ly9sb2NhbGhvc3Q6ODA4MS9XZWJTZXJ2aWNlL3NlcnZpY2UvRmFzdGEvQ29udmVydC9STkEvJHtoZWxtU3RyaW5nfWA7XG4gICAgICAgIHJldHVybiB5aWVsZCBhY2Nlc3NTZXJ2ZXIodXJsLCAnU2VxdWVuY2UnKTtcbiAgICB9KTtcbn1cbi8vbmFtZTogaGVsbVRvUGVwdGlkZVxuLy9kZXNjcmlwdGlvbjogY29udmVydHMgdG8gcGVwdGlkZSBhbmFsb2d1ZSBzZXF1ZW5jZVxuLy9pbnB1dDogc3RyaW5nIGhlbG1TdHJpbmcge3NlbVR5cGU6IE1hY3JvbW9sZWN1bGV9XG4vL291dHB1dDogc3RyaW5nIHJlc1xuZXhwb3J0IGZ1bmN0aW9uIGhlbG1Ub1BlcHRpZGUoaGVsbVN0cmluZykge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIGNvbnN0IHVybCA9IGBodHRwOi8vbG9jYWxob3N0OjgwODEvV2ViU2VydmljZS9zZXJ2aWNlL0Zhc3RhL0NvbnZlcnQvUEVQVElERS8ke2hlbG1TdHJpbmd9YDtcbiAgICAgICAgcmV0dXJuIHlpZWxkIGFjY2Vzc1NlcnZlcih1cmwsICdTZXF1ZW5jZScpO1xuICAgIH0pO1xufVxuLy9uYW1lOiBoZWxtVG9TbWlsZXNcbi8vZGVzY3JpcHRpb246IGNvbnZlcnRzIHRvIHNtaWxlc1xuLy9pbnB1dDogc3RyaW5nIGhlbG1TdHJpbmcge3NlbVR5cGU6IE1hY3JvbW9sZWN1bGV9XG4vL291dHB1dDogc3RyaW5nIHNtaWxlcyB7c2VtVHlwZTogTW9sZWN1bGV9XG5leHBvcnQgZnVuY3Rpb24gaGVsbVRvU21pbGVzKGhlbG1TdHJpbmcpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBjb25zdCB1cmwgPSBgaHR0cDovL2xvY2FsaG9zdDo4MDgxL1dlYlNlcnZpY2Uvc2VydmljZS9TTUlMRVMvJHtoZWxtU3RyaW5nfWA7XG4gICAgICAgIHJldHVybiB5aWVsZCBhY2Nlc3NTZXJ2ZXIodXJsLCAnU01JTEVTJyk7XG4gICAgfSk7XG59XG5mdW5jdGlvbiBnZXRSUyhzbWlsZXMpIHtcbiAgICBjb25zdCBuZXdTID0gc21pbGVzLm1hdGNoKC8oPzw9XFxbKVteXFxdW10qKD89XSkvZ20pO1xuICAgIGNvbnN0IHJlcyA9IHt9O1xuICAgIGxldCBlbCA9ICcnO1xuICAgIGxldCBkaWdpdDtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5ld1MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKG5ld1NbaV0gIT0gbnVsbCkge1xuICAgICAgICAgICAgaWYgKC9cXGQvLnRlc3QobmV3U1tpXSkpIHtcbiAgICAgICAgICAgICAgICBkaWdpdCA9IG5ld1NbaV1bbmV3U1tpXS5sZW5ndGggLSAxXTtcbiAgICAgICAgICAgICAgICBuZXdTW2ldID0gbmV3U1tpXS5yZXBsYWNlKC9bMC05XS9nLCAnJyk7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBuZXdTW2ldLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChuZXdTW2ldW2pdICE9ICc6JylcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsICs9IG5ld1NbaV1bal07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJlc1snUicgKyBkaWdpdF0gPSBlbDtcbiAgICAgICAgICAgICAgICBlbCA9ICcnO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXM7XG59XG4vL25hbWU6IGdldE1vbGZpbGVzXG4vL2lucHV0OiBjb2x1bW4gY29sIHtzZW1UeXBlOiBNYWNyb21vbGVjdWxlfVxuLy9vdXRwdXQ6IGNvbHVtbiByZXMgXG5leHBvcnQgZnVuY3Rpb24gZ2V0TW9sZmlsZXMoY29sKSB7XG4gICAgbGV0IGdyaWQgPSBncm9rLnNoZWxsLnR2LmdyaWQ7XG4gICAgbGV0IHBhcmVudCA9IGdyaWQucm9vdC5wYXJlbnRFbGVtZW50O1xuICAgIGxldCByZXMgPSBERy5Db2x1bW4uc3RyaW5nKCdtb2xzJywgY29sLmxlbmd0aCk7XG4gICAgY29uc3QgaG9zdCA9IHVpLmRpdihbXSk7XG4gICAgcGFyZW50LmFwcGVuZENoaWxkKGhvc3QpO1xuICAgIGxldCBlZGl0b3IgPSBuZXcgSlNEcmF3Mi5FZGl0b3IoaG9zdCwgeyB2aWV3b25seTogdHJ1ZSB9KTtcbiAgICBob3N0LnN0eWxlLndpZHRoID0gJzBweCc7XG4gICAgaG9zdC5zdHlsZS5oZWlnaHQgPSAnMHB4JztcbiAgICByZXMuaW5pdCgoaSkgPT4ge1xuICAgICAgICBlZGl0b3Iuc2V0SGVsbShjb2wuZ2V0KGkpKTtcbiAgICAgICAgbGV0IG1vbCA9IGVkaXRvci5nZXRNb2xmaWxlKCk7XG4gICAgICAgIHJldHVybiBtb2w7XG4gICAgfSk7XG4gICAgcGFyZW50Lmxhc3RDaGlsZC5yZW1vdmUoKTtcbiAgICByZXR1cm4gcmVzO1xufVxuLy9uYW1lOiBoZWxtV2ViRWRpdG9yXG4vL291dHB1dDogb2JqZWN0XG5leHBvcnQgZnVuY3Rpb24gaGVsbVdlYkVkaXRvcigpIHtcbiAgICByZXR1cm4gbmV3IEhlbG1XZWJFZGl0b3IoKTtcbn1cbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==
1
+ var helm;(()=>{"use strict";var t={n:e=>{var r=e&&e.__esModule?()=>e.default:()=>e;return t.d(r,{a:r}),r},d:(e,r)=>{for(var n in r)t.o(r,n)&&!t.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:r[n]})},o:(t,e)=>Object.prototype.hasOwnProperty.call(t,e),r:t=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})}},e={};t.r(e),t.d(e,{_package:()=>_,editMoleculeCell:()=>z,getMolfiles:()=>q,helmCellRenderer:()=>k,helmWebEditor:()=>Y,initHelm:()=>I,openEditor:()=>j,propertiesPanel:()=>B});const r=grok,n=ui,o=DG;class i{constructor(){this.w=200,this.h=100,this.host=n.div([],{style:{width:`${this.w}px`,height:`${this.h}px`}}),this.editor=new JSDraw2.Editor(this.host,{width:this.w,height:this.h,viewonly:!0})}resizeEditor(t,e){this.editor.setSize(t,e)}createWebEditor(t){const e=n.div();org.helm.webeditor.MolViewer.molscale=.8;const r=new scil.helm.App(e,{showabout:!1,mexfontsize:"90%",mexrnapinontab:!0,topmargin:20,mexmonomerstab:!0,sequenceviewonly:!1,mexfavoritefirst:!0,mexfilter:!0}),o=r.calculateSizes();r.canvas.resize(o.rightwidth-100,o.topheight-210);let i={width:o.rightwidth-100+"px",height:o.bottomheight+"px"};return scil.apply(r.sequence.style,i),scil.apply(r.notation.style,i),i={width:o.rightwidth+"px",height:o.bottomheight+r.toolbarheight+"px"},scil.apply(r.properties.parent.style,i),r.structureview.resize(o.rightwidth,o.bottomheight+r.toolbarheight),r.mex.resize(o.topheight-80),setTimeout((function(){r.canvas.helm.setSequence(t,"HELM")}),200),{editorDiv:e,webEditor:r}}}function s(t,e){let r=[];for(let n=0;n<t.length;++n){let o=e.indexOf(t[n]),i=e.slice(0,o);r.push(i),r.push(t[n]),e=e.substring(o+t[n].length)}return r.push(e),r}function l(t){t=h(t,"$")[0];var e=[];if(!scil.Utils.isNullOrEmpty(t))for(var r=h(t,"|"),n=0;n<r.length;++n){var o=(t=u(r[n]).str).indexOf("{");o=(t=t.substring(o+1)).indexOf("}");var i=h(t=t.substring(0,o),".");for(var s of i)if(s.includes("(")&&s.includes(")")){var l=s.replace(/[()]/g,"").split("");for(var a of l)e.push(a)}else if(s.includes("[")&&s.includes("]")){var c=s.match(/(?<=\[).*?(?=\])/g,"");e.push(c[0])}else e.push(s)}return e}function a(t){const e=Object.keys(org.helm.webeditor.monomerTypeList()),r=[],n=[];for(var o=0;o<e.length;o++)r.push(new scil.helm.Monomers.getMonomerSet(e[o])),Object.keys(r[o]).forEach((t=>{n.push(r[o][t].id)}));const i=l(t);return new Set(i.filter((t=>!n.includes(t))))}function h(t,e){for(var r=[],n="",o=0,i=0,s=0,l=0,a=0;a<t.length;++a){var h=t.substring(a,a+1);if(h==e&&0==i&&0==o&&0==s&&0==l)r.push(n),n="";else{if(n+=h,l>0&&"\\"==h&&a+1<t.length){++a;var u=t.substring(a,a+1);n+=u,h+=u}'"'==h?a>0&&"\\"==t.substring(a-1,a)||(l=0==l?1:0):"["==h?++i:"]"==h?--i:"("==h?++o:")"==h?--o:"{"==h?++s:"}"==h&&--s}}return r.push(n),r}function u(t){var e=c(t,'"');if(null!=e.tag)return e;var r=c(t,"'");return{tag:e.tag,repeat:r.tag,str:r.str}}function c(t,e){var r=null;if(scil.Utils.endswith(t,e)){for(var n=t.length-1;n>0&&!((n=t.lastIndexOf(e,n-1))<=0||"\\"!=t.substring(n-1,n)););n>0&&n<t.length-1&&(r=t.substring(n+1,t.length-1),t=t.substring(0,n))}return null!=r&&(r=r.replace(new RegExp("\\"+e,"g"),e)),{tag:g(r),str:t}}function g(t){return scil.Utils.isNullOrEmpty(t)?t:t.replace(/[\\]./g,(function(t){switch(t){case"\\r":return"\r";case"\\n":return"\n";case"\\t":return"\t";default:return t.substring(1)}}))}const m=wu;var p=t.n(m);class d extends Float32Array{}function C(t){let e=0;for(let r=0;r<t.length;r++)e+=t[r]*t[r];return Math.sqrt(e)}class f{static makePalette(t,e=!1,r=f){const n={};return t.forEach((t=>{const r=t[0],o=t[1];r.forEach(((t,r)=>{n[t]=this.colourPalette[o][e?0:r]}))})),new r(n)}constructor(t){this._palette=t}get(t){return this._palette[t]}}f.undefinedColor="rgb(100,100,100)",f.colourPalette={orange:["rgb(255,187,120)","rgb(245,167,100)","rgb(235,137,70)","rgb(205, 111, 71)"],all_green:["rgb(44,160,44)","rgb(74,160,74)","rgb(23,103,57)","rgb(30,110,96)","rgb(60,131,95)","rgb(24,110,79)","rgb(152,223,138)","rgb(182, 223, 138)","rgb(152, 193, 138)"],all_blue:["rgb(31,119,180)","rgb(23,190,207)","rgb(122, 102, 189)","rgb(158,218,229)","rgb(141, 124, 217)","rgb(31, 120, 150)"],magenta:["rgb(162,106,192)","rgb(197,165,224)","rgb(208,113,218)"],red:["rgb(214,39,40)","rgb(255,152,150)"],st_blue:["rgb(23,190,207)","rgb(158,218,229)","rgb(31,119,180)"],dark_blue:["rgb(31,119,180)","rgb(31, 120, 150)"],light_blue:["rgb(23,190,207)","rgb(158,218,229)","rgb(108, 218, 229)","rgb(23,190,227)"],lilac_blue:["rgb(124,102,211)","rgb(149,134,217)","rgb(97, 81, 150)"],dark_green:["rgb(23,103,57)","rgb(30,110,96)","rgb(60,131,95)","rgb(24,110,79)"],green:["rgb(44,160,44)","rgb(74,160,74)"],light_green:["rgb(152,223,138)","rgb(182, 223, 138)","rgb(152, 193, 138)"],st_green:["rgb(44,160,44)","rgb(152,223,138)","rgb(39, 174, 96)","rgb(74,160,74)"],pink:["rgb(247,182,210)"],brown:["rgb(140,86,75)","rgb(102, 62, 54)"],gray:["rgb(127,127,127)","rgb(199,199,199)","rgb(196,156,148)","rgb(222, 222, 180)"],yellow:["rgb(188,189,34)"],white:["rgb(230,230,230)"]};class b extends f{static get Lesk(){return void 0===this.lesk&&(this.lesk=this.makePalette([[["G","A","S","T"],"orange"],[["C","V","I","L","P","F","Y","M","W"],"all_green"],[["N","Q","H"],"magenta"],[["D","E"],"red"],[["K","R"],"all_blue"]],!1,b)),this.lesk}static get GrokGroups(){return void 0===this.grokGroups&&(this.grokGroups=this.makePalette([[["C","U"],"yellow"],[["G","P"],"red"],[["A","V","I","L","M","F","Y","W"],"all_green"],[["R","H","K"],"light_blue"],[["D","E"],"dark_blue"],[["S","T","N","Q"],"orange"]],!1,b)),this.grokGroups}static get RasMol(){return void 0===this.rasMol&&(this.rasMol=new b({D:"#E60A0A",E:"#E60A0A",C:"#E6E600",M:"#E6E600",K:"#145AFF",R:"#145AFF",S:"#FA9600",T:"#FA9600",F:"#3232AA",Y:"#3232AA",N:"#00DCDC",Q:"#00DCDC",G:"#EBEBEB",L:"#0F820F",V:"#0F820F",I:"#0F820F",A:"#C8C8C8",W:"#B45AB4",H:"#8282D2",P:"#DC9682",others:"#BEA06E"})),this.rasMol}get(t){const e=t in b.aaSynonyms?b.aaSynonyms[t]:t;return super.get(e)}}b.aaSynonyms={MeNle:"L",MeA:"A",MeG:"G",MeF:"F"};class w{static getPalette(t="grok"){switch(t){case"grok":return b.GrokGroups;case"lesk":return b.Lesk;default:throw new Error(`ChemPalette: scheme \`${t}\` does not exist`)}}static getInnerOuter(t){let e=0,r="",n="";for(const o of t)"("==o?e++:")"==o?e--:e?r+=o:n+=o;return isNaN(parseInt(r))?[n,r]:[n,""]}static getColorAAPivot(t="",e="grok"){var r,n,o;const i=this.getPalette(e);let[s,l]=this.getInnerOuter(t);if(s=s.length>6?`${s.slice(0,3)}...`:s,l=l.length>6?`${l.slice(0,3)}...`:l,1==t.length||"("==t[1]){const e=null===(r=t[0])||void 0===r?void 0:r.toUpperCase();return e in i?[i.get(e),e,l,1]:[this.undefinedColor,s,l,1]}if("d"==t[0]&&t[1]in i&&(2==t.length||"("==t[2])){const e=null===(n=t[1])||void 0===n?void 0:n.toUpperCase();return e in i?[i.get(e),e,l,2]:[this.undefinedColor,s,l,2]}if(t.substring(0,3)in this.AAFullNames&&(3==t.length||"("==t[3])){const e=this.AAFullNames[t.substring(0,3)];return e in i?[i.get(e),e,l,3]:[this.undefinedColor,s,l,3]}if((null===(o=t[0])||void 0===o?void 0:o.toLowerCase())==t[0]&&t.substring(1,3)in this.AAFullNames&&(4==t.length||"("==t[4])){const e=this.AAFullNames[t.substring(1,3)];return e in i?[i.get(e),e,l,4]:[this.undefinedColor,s,l,4]}return[this.undefinedColor,s,l,0]}}w.SemType="Aminoacids",w.SemTypeMultipleAlignment="AminoacidsMultipleAlignment",w.undefinedColor="rgb(100,100,100)",w.Names={G:"Glycine",L:"Leucine",Y:"Tyrosine",S:"Serine",E:"Glutamic acid",Q:"Glutamine",D:"Aspartic acid",N:"Asparagine",F:"Phenylalanine",A:"Alanine",K:"Lysine",R:"Arginine",H:"Histidine",C:"Cysteine",V:"Valine",P:"Proline",W:"Tryptophan",I:"Isoleucine",M:"Methionine",T:"Threonine"},w.AASmiles={G:"NCC(=O)O",L:"N[C@H](CC(C)C)C(=O)O",Y:"NC(CC1=CC=C(O)C=C1)C(=O)O",S:"NC(CO)C(=O)O",E:"N[C@@H](CCC(O)=O)C(=O)O",Q:"N[C@@H](CCC(N)=O)C(=O)O",D:"N[C@@H](CC(O)=O)C(=O)O",N:"N[C@@H](CC(N)=O)C(=O)O",F:"NC(CC1=CC=CC=C1)C(=O)O",A:"N[C@H](C)C(=O)O",K:"NC(CCCCN)C(=O)O",R:"N[C@H](CCCNC(=N)C)C(=O)O",H:"NC(CC1=CN=C[N]1)C(=O)O",C:"N[C@@H](CS)C(=O)O",V:"NC(C(C)C)C(=O)O",P:"N(CCC1)C1C(=O)O",W:"N[C@@H](Cc1c2ccccc2n([H])c1)C(=O)O",I:"N[C@H]([C@H](C)CC)C(=O)O",M:"NC(CCSC)C(=O)O",T:"NC(C(O)C)C(=O)O"},w.AASmilesTruncated={G:"*C*",L:"CC(C)C[C@H](*)*",Y:"C1=CC(=CC=C1CC(*)*)O",S:"OCC(*)C*",E:"*[C@@H](CCC(O)=O)*",Q:"*N[C@@H](CCC(N)=O)*",D:"*[C@@H](CC(O)=O)*",N:"*[C@@H](CC(N)=O)*",F:"C1=CC=C(C=C1)CC(*)*",A:"C[C@H](*)*",K:"C(CCN)CC(*)*",R:"*[C@H](CCCNC(=N)C)*",H:"C1=C(NC=N1)CC(*)*",C:"C([C@@H](*)*)S",V:"CC(C)C(*)*",P:"C1CCN(*)C1*",W:"*[C@@H](Cc1c2ccccc2n([H])c1)*",I:"CC[C@H](C)[C@H](*)*",M:"CSCCC(*)*",T:"CC(O)C(*)*"},w.AAFullNames={Ala:"A",Arg:"R",Asn:"N",Asp:"D",Cys:"C",Gln:"Q",Glu:"E",Gly:"G",His:"H",Ile:"I",Leu:"L",Lys:"K",Met:"M",Phe:"F",Pro:"P",Ser:"S",Thr:"T",Trp:"W",Tyr:"Y",Val:"V"};class v{}v.SemType="Nucleotides",v.SemTypeMultipleAlignment="NucleotidesMultipleAlignment",v.Names={A:"Adenine",C:"Cytosine",G:"Guanine",T:"Thymine",U:"Uracil"};class S extends class{}{static buildPalette(){return[].concat(...Object.values(f.colourPalette))}get(t){const e=class{static hashCode(t){let e=0;if(0===t.length)return e;for(let r=0;r<t.length;r++)e=(e<<5)-e+t.charCodeAt(r),e|=0;return e}}.hashCode(t)%S.palette.length;return function(t){if(null==t)return"rgb(100,100,100)";const e=o.Color.fromHtml(t),r=o.Color.g(e),n=o.Color.r(e),i=o.Color.b(e),s=Math.sqrt(Math.pow(0-n,2)+Math.pow(0-r,2)+Math.pow(0-i,2));return s>210?`rgb(${n/s*210},${r/s*210},${i/s*210})`:o.Color.toRgb(e)}(S.palette[e])}}S.palette=S.buildPalette();class T{static setUnitsToFastaColumn(t){if(t.semType!==o.SEMTYPE.MACROMOLECULE)throw new Error("Fasta column must be MACROMOLECULE");const e=A(t,5,E),r=e.sameLength?"SEQ.MSA":"SEQ",n=function(t){const e=[["PT",T.PeptideFastaAlphabet],["DNA",T.DnaFastaAlphabet],["RNA",T.RnaFastaAlphabet]],r=e.map((e=>function(t,e,r="-"){const n=new Set([...new Set(Object.keys(t)),...e]);n.delete(r);const o=[],i=[];for(const r of n)o.push(r in t?t[r]:0),i.push(e.has(r)?1:0);const s=new d(o),l=new d(i);return function(t,e){if(t.length!=e.length)throw new Error("The dimensionality of the vectors must match");let r=0;for(let n=0;n<t.length;n++)r+=t[n]*e[n];return r}(s,l)/(C(s)*C(l))}(t.freq,e[1]))),n=Math.max(...r);return n>.65?e[r.indexOf(n)][0]:"UN"}(e);t.setTag(o.TAGS.UNITS,"fasta"),t.setTag("aligned",r),t.setTag("alphabet",n)}get units(){return this._units}get column(){return this._column}get notation(){return this._notation}get defaultGapSymbol(){return this._defaultGapSymbol}get separator(){var t;const e=null!==(t=this.column.getTag("separator"))&&void 0!==t?t:void 0;if("separator"===this.notation&&void 0===e)throw new Error(`Separator is mandatory for column '${this.column.name}' of notation '${this.notation}'.`);return e}get aligned(){const t=this.column.getTag("aligned");if(!t&&(this.isFasta()||this.isSeparator()))throw new Error("Tag aligned not set");return t}get alphabet(){const t=this.column.getTag("alphabet");if(!t&&(this.isFasta()||this.isSeparator()))throw new Error("Tag alphabet not set");return t}getAlphabetSize(){if("helm"==this.notation||"UN"==this.alphabet){const t=this.column.getTag(".alphabetSize");let e;if(t)e=parseInt(t);else{const t=H(this.column),r=A(this.column,1,t);e=Object.keys(r.freq).length}return e}switch(this.alphabet){case"PT":return 20;case"DNA":case"RNA":return 4;case"NT":return console.warn("Unexpected alphabet 'NT'."),4;default:throw new Error(`Unexpected alphabet '${this.alphabet}'.`)}}getAlphabetIsMultichar(){return("helm"==this.notation||"UN"==this.alphabet)&&"true"==this.column.getTag(".alphabetIsMultichar")}isFasta(){return"fasta"===this.notation}isSeparator(){return"separator"===this.notation}isHelm(){return"helm"===this.notation}isRna(){return"RNA"===this.alphabet}isDna(){return"DNA"===this.alphabet}isPeptide(){return"PT"===this.alphabet}isMsa(){return!!this.aligned&&this.aligned.toUpperCase().includes("MSA")}getNotation(){if(this.units.toLowerCase().startsWith("fasta"))return"fasta";if(this.units.toLowerCase().startsWith("separator"))return"separator";if(this.units.toLowerCase().startsWith("helm"))return"helm";throw new Error(`Column '${this.column.name}' has unexpected notation '${this.units}'.`)}getNewColumn(t){const e=this.column,r=e.length,n=t.toLowerCase()+"("+e.name+")",i=e.dataFrame.columns.getUnusedName(n),s=o.Column.fromList("string",i,new Array(r).fill(""));s.semType=o.SEMTYPE.MACROMOLECULE,s.setTag(o.TAGS.UNITS,t),s.setTag(o.TAGS.CELL_RENDERER,"Macromolecule");const l=e.getTag("aligned");l&&s.setTag("aligned",l);const a=e.getTag("alphabet");a&&s.setTag("alphabet",a);let h=e.getTag(".alphabetSize");h&&s.setTag(".alphabetSize",h);const u=e.getTag(".alphabetIsMultichar");return void 0!==u&&s.setTag(".alphabetIsMultichar",u),"helm"==t&&(h=this.getAlphabetSize().toString(),s.setTag(".alphabetSize",h)),s}static getNewColumn(t){const e=new T(t),r=e.notation;return e.getNewColumn(r)}static unitsStringIsValid(t){return t=t.toLowerCase(),["fasta","separator","helm"].some((e=>t.startsWith(e.toLowerCase())))}static getNewColumnFromParams(t,e,r){if(!T.unitsStringIsValid(r))throw new Error("Invalid format of 'units' parameter");const n=o.Column.fromList("string",e,new Array(t).fill(""));return n.semType=o.SEMTYPE.MACROMOLECULE,n.setTag(o.TAGS.UNITS,r),n}constructor(t){this._column=t;const e=this._column.tags[o.TAGS.UNITS];if(null===e)throw new Error("Units are not specified in column");if(this._units=e,this._notation=this.getNotation(),this._defaultGapSymbol=this.isFasta()?T._defaultGapSymbolsDict.FASTA:this.isHelm()?T._defaultGapSymbolsDict.HELM:T._defaultGapSymbolsDict.SEPARATOR,!this.column.tags.has("aligned")&&(this.isFasta()||this.isSeparator()))throw new Error(`For column '${this.column.name}' of notation '${this.notation}' tag 'aligned' is mandatory.`);if(!this.column.tags.has(".alphabetIsMultichar")){if(this.isHelm())throw new Error(`For column '${this.column.name}' of notation '${this.notation}' tag '.alphabetIsMultichar' is mandatory.`);if(["UN"].includes(this.alphabet))throw new Error(`For column '${this.column.name}' of alphabet '${this.alphabet}' tag '.alphabetIsMultichar' is mandatory.`)}}}function A(t,e,r){const n={};let o=!0,i=null;for(const s of t.categories){const t=r(s);if(null==i?i=t.length:t.length!==i&&(o=!1),t.length>=e)for(const e of t)e in n||(n[e]=0),n[e]+=1}return{freq:n,sameLength:o}}T._defaultGapSymbolsDict={HELM:"*",SEPARATOR:"",FASTA:"-"},T.PeptideFastaAlphabet=new Set(["G","L","Y","S","E","Q","D","N","F","A","K","R","H","C","V","P","W","I","M","T"]),T.DnaFastaAlphabet=new Set(["A","C","G","T"]),T.RnaFastaAlphabet=new Set(["A","C","G","U"]);const y=/\[(\w+)\]|(\w)|(-)/g;function E(t){return p()(t.toString().matchAll(y)).map((t=>{let e;const r=t[0];return e=r.length>1?t[1]:r,e})).toArray()}const N=/(PEPTIDE1|DNA1|RNA1)\{([^}]+)}/g,M=/\[([^\[\]]+)]/g;function O(t){N.lastIndex=0;const e=N.exec(t.toString()),r=e?e[2]:null;return(r?r.split("."):[]).map((t=>{M.lastIndex=0;const e=M.exec(t);return e&&e.length>=2?e[1]:t}))}function H(t){if(t.semType!==o.SEMTYPE.MACROMOLECULE)throw new Error(`Get splitter for semType "${o.SEMTYPE.MACROMOLECULE}" only.`);return function(t,e,r){if(t.toLowerCase().startsWith("fasta"))return E;if(t.toLowerCase().startsWith("separator"))return function(t,e){return e=>e.split(t,undefined)}(e);if(t.toLowerCase().startsWith("helm"))return O;throw new Error(`Unexpected units ${t} .`)}(t.getTag(o.TAGS.UNITS),t.getTag("separator"))}const x=/(\w+)/g;var F;!function(t){t.MSA="MSA",t.classic="classic"}(F||(F={}));const L=(t,e,r,n,o,i,s="rgb(100,100,100)",l=0,a=!1,h=1,u="",c=!1,g=F.classic,m={},p=0,d=null,C=[],f=null)=>{var b,w,v;o.textAlign="start";let S=i.substring(0),T=c?"":u;g===F.MSA&&(T="");let A=!0,y=!0,E="difference";null!=d&&null!=d.cell.column&&(A=null===(b=d.cell.column.temp["color-code"])||void 0===b||b,y=null===(w=d.cell.column.temp["compare-with-current"])||void 0===w||w,E=null!==(v=d.cell.column.temp["highlight-difference"])&&void 0!==v?v:"difference");const N=C[p];y&&C.length>0&&"difference"===E&&(h=S==N?.3:h),y&&C.length>0&&"equal"===E&&(h=S!=N?.3:h),null!=f&&(S=function(t,e){var r,n;const o=t.match(x),i=t.length>e||(null!==(r=null==o?void 0:o.length)&&void 0!==r?r:0)>1,s=null!==(n=null==o?void 0:o[0])&&void 0!==n?n:" ";return i?s.substring(0,e)+"…":s}(S,f));let M=o.measureText(S+T),O=o.measureText(S).width,H=o.measureText(S).width;const L=n/2-(M.fontBoundingBoxAscent+M.fontBoundingBoxDescent)/2+1;function P(r,n){const i=A?s:"rgb(0,0,0)";o.fillStyle=i,o.globalAlpha=h,g===F.classic&&(o.fillText(S,t+r,e+L),o.fillStyle="#808080",o.fillText(T,t+n,e+L)),g===F.MSA&&(o.fillStyle=i,o.fillText(S,t+r+(m[p]-H)/2,e+L))}if(M=M.width,g===F.MSA&&(O=m[p],M=m[p]),a||M>r)return P(5,5+O),t+O+o.measureText(T).width;{const e=(r-M)/2;return P(e,e+O),t+e+O}};function P(t){var e;return"string"==typeof t||t instanceof String?t:"$thrownJsError"in t?P(t.$thrownJsError):t instanceof Error?null!==(e=t.stack)&&void 0!==e?e:t.message:t.toString()}class G extends o.GridCellRenderer{get name(){return"helm"}get cellType(){return"helm"}get defaultWidth(){return 400}get defaultHeight(){return 100}onMouseMove(t,e){var r,o,i;try{const h=t.cell.column.temp["helm-sum-maxLengthWords"],u=Object.values(t.cell.column.temp["helm-maxLengthWords"]).length-1,c=e.offsetX-t.gridColumn.left+(t.gridColumn.left-t.bounds.x);let g=0,m=u,p=!1;h[u+1]=c+1;let d=0;if(c>h[0])for(;!p;)d=Math.floor((m+g)/2),c>=h[d]&&c<=h[d+1]?(g=d,p=!0):c<h[d]?m=d-1:c>h[d+1]&&(g=d+1),g==m&&(p=!0);g=c>=h[g]?g+1:g;const C=a(t.cell.value);let f=null!==(r=t.cell.value)&&void 0!==r?r:"",b=s(l(f),f),w=[];for(let t=0;t<b.length;++t)C.has(b[t])&&(w[t]=n.divV([n.divText(`Monomer ${b[t]} not found.`),n.divText("Open the Context Panel, then expand Manage Libraries")]));(null!==(i=null===(o=w[g])||void 0===o?void 0:o.childNodes.length)&&void 0!==i?i:0)>0?n.tooltip.show(n.div(w[g]),e.x+16,e.y+16):n.tooltip.hide()}catch(t){const e=P(t);console.error("Helm: HelmCellRenderer.onMouseMove() error:\n"+e)}}render(t,e,r,o,i,h,u){var c;const g=-1!==h.gridRow?h.grid:void 0,m=a(h.cell.value);let p=null!==(c=h.cell.value)&&void 0!==c?c:"",d=l(p);if(0!=m.size){if(m.size>0){o=g?Math.min(g.canvas.width-e,o):t.canvas.width-e,t.save(),t.beginPath(),t.rect(e,r,o,i),t.clip(),t.font="12px monospace",t.textBaseline="top";let n=e,l={},a={},u=s(d,p);for(let e=0;e<u.length;++e){l[e]=7*u[e].length;let s=m.has(u[e])?"red":"#808080";t.fillStyle="rgb(100,100,100)",n=L(n,r,o,i,t,u[e],s,0,!0,1)}a[0]=l[0];for(let t=1;t<u.length;t++)a[t]=a[t-1]+l[t];return h.cell.column.temp={"helm-sum-maxLengthWords":a,"helm-maxLengthWords":l},void t.restore()}}else{const t=n.div([],{style:{width:`${o}px`,height:`${i}px`}});t.setAttribute("dataformat","helm"),t.setAttribute("data",h.cell.value),h.element=t,new JSDraw2.Editor(t,{width:o,height:i,skin:"w8",viewonly:!0})}}}class D extends T{get splitter(){return null===this._splitter&&(this._splitter=H(this.column)),this._splitter}toFasta(t){return"fasta"===t}toSeparator(t){return"separator"===t}toHelm(t){return"helm"===t}convertFastaToSeparator(t,e=null){null===e&&(e=this.defaultGapSymbol);const r=this.getNewColumn("separator");return r.init((r=>{const n=this.column.get(r),o=this.splitter(n);for(let t=0;t<o.length;t++)o[t]===e&&(o[t]=T._defaultGapSymbolsDict.SEPARATOR);return o.join(t)})),r.setTag(o.TAGS.UNITS,"separator"),r.setTag("separator",t),r}getHelmWrappers(){const t=this.isDna()?"DNA1{":this.isRna()?"RNA1{":this.isPeptide()?"PEPTIDE1{":"Unknown";if("Unknown"===t)throw new Error("Neither peptide, nor nucleotide");return[t,this.isDna()?"D(":this.isRna()?"R(":"",this.isDna()||this.isRna()?")P":"","}$$$"]}convertToHelmHelper(t,e,r,n,o,i){return`${r}${this.splitter(t).map((t=>t===e?T._defaultGapSymbolsDict.HELM:`${n}${t}${o}`)).join(".")}${i}`}convertStringToHelm(t,e=null){null===e&&(e=this.defaultGapSymbol);const[r,n,o,i]=this.getHelmWrappers();return this.convertToHelmHelper(t,e,r,n,o,i)}convertToHelm(t=null){null===t&&(t=this.defaultGapSymbol);const[e,r,n,i]=this.getHelmWrappers(),s=this.getNewColumn("helm");return s.init((o=>{const s=this.column.get(o);return this.convertToHelmHelper(s,t,e,r,n,i)})),s.setTag(o.TAGS.UNITS,"helm"),s}convertSeparatorToFasta(t=null){null===t&&(t=T._defaultGapSymbolsDict.FASTA);const e=this.getNewColumn("fasta");return e.init((e=>{const r=this.column.get(e),n=this.splitter(r),o=[];for(let e=0;e<n.length;e++){const r=n[e];if(0===r.length)o.push(t);else if(r.length>1){const t="["+r+"]";o.push(t)}else o.push(r)}return o.join("")})),e.setTag(o.TAGS.UNITS,"fasta"),e}convertHelmToFastaSeparator(t,e,r,n){n||(n=this.toFasta(e)?T._defaultGapSymbolsDict.FASTA:T._defaultGapSymbolsDict.SEPARATOR),r||(r=this.toFasta(e)?"":this.separator);const o=/(R\(|D\(|\)|P)/g,i=t.startsWith("DNA")||t.startsWith("RNA"),s=this.splitter(t),l=[];for(let t=0;t<s.length;t++){let r=s[t];if(i&&(r=r.replace(o,"")),r===T._defaultGapSymbolsDict.HELM)l.push(n);else if(this.toFasta(e)&&r.length>1){const t="["+r+"]";l.push(t)}else l.push(r)}return l.join(r)}convertHelm(t,e,r){const n=this.getNewColumn(t);n.init((n=>{const o=this.column.get(n);return this.convertHelmToFastaSeparator(o,t,e,r)}));const o=A(n,5,H(n)).sameLength?"SEQ.MSA":"SEQ";return n.setTag("aligned",o),n}convertHelmToSeparator(){return this.getNewColumn("separator")}convert(t,e=null){if(this.notation===t)throw new Error("tgt notation is invalid");if(this.toSeparator(t)&&null===e)throw new Error("tgt separator is not specified");if(this.isFasta()&&this.toSeparator(t)&&null!==e)return this.convertFastaToSeparator(e);if((this.isFasta()||this.isSeparator())&&this.toHelm(t))return this.convertToHelm();if(this.isSeparator()&&this.toFasta(t))return this.convertSeparatorToFasta();if(this.isHelm()&&this.toFasta(t))return this.convertHelm(t);if(this.isHelm()&&this.toSeparator(t))return this.convertHelm(t,e);throw new Error(`Not supported conversion from source notation '${this.notation}' to target notation '${t}'.`)}constructor(t){super(t),this._splitter=null}}var R=function(t,e,r,n){return new(r||(r=Promise))((function(o,i){function s(t){try{a(n.next(t))}catch(t){i(t)}}function l(t){try{a(n.throw(t))}catch(t){i(t)}}function a(t){var e;t.done?o(t.value):(e=t.value,e instanceof r?e:new r((function(t){t(e)}))).then(s,l)}a((n=n.apply(t,e||[])).next())}))};const _=new o.Package;let $=null;function I(){return R(this,void 0,void 0,(function*(){return Promise.all([new Promise(((t,e)=>{dojo.ready((function(){t(null)}))})),yield r.functions.call("Bio:getBioLib")]).then((([t,e])=>{$=e,U(),$.onChanged.subscribe((t=>{try{U();const t=$.getTypes(),e="Monomer lib updated:<br />"+(0==t.length?"empty":t.map((t=>`${t} ${$.getMonomerNamesByType(t).length}`)).join("<br />"));r.shell.info(e)}catch(t){const e=P(t);console.error("Helm: initHelm monomerLib.onChanged() error:\n"+e)}}))}))}))}function U(){org.helm.webeditor.Monomers.clear(),$.getTypes().forEach((t=>{$.getMonomerNamesByType(t).forEach((e=>{let r=!1;const n=$.getMonomer(t,e),o={id:e,m:n.molfile,n:n.name,na:n.naturalAnalog,rs:n.rgroups.length,type:n.polymerType,mt:n.monomerType,at:{}};if(n.rgroups.length>0){o.rs=n.rgroups.length;const t={};n.rgroups.forEach((e=>{t[e.label]=e.capGroupName})),o.at=t}else null!=n.data.smiles?(o.rs=Object.keys(V(n.data.smiles.toString())).length,o.at=V(n.data.smiles.toString())):r=!0;r||org.helm.webeditor.Monomers.addOneMonomer(o)}))}));let t=r.shell.tv.grid;t&&t.invalidate()}function k(){return new G}function W(t,e,o){const i=a(void 0===o?t.value:e);0==i.size?function(t,e,o){let i=n.div(),s=r.shell.tv.grid.dataFrame,l=new D(s.columns.bySemType("Macromolecule"));org.helm.webeditor.MolViewer.molscale=.8;let a=new scil.helm.App(i,{showabout:!1,mexfontsize:"90%",mexrnapinontab:!0,topmargin:20,mexmonomerstab:!0,sequenceviewonly:!1,mexfavoritefirst:!0,mexfilter:!0});var h=a.calculateSizes();a.canvas.resize(h.rightwidth-100,h.topheight-210);var u={width:h.rightwidth-100+"px",height:h.bottomheight+"px"};scil.apply(a.sequence.style,u),scil.apply(a.notation.style,u),u={width:h.rightwidth+"px",height:h.bottomheight+a.toolbarheight+"px"},scil.apply(a.properties.parent.style,u),a.structureview.resize(h.rightwidth,h.bottomheight+a.toolbarheight),a.mex.resize(h.topheight-80),setTimeout((function(){void 0===o?a.canvas.helm.setSequence(t.value,"HELM"):a.canvas.helm.setSequence(e,"HELM")}),200),n.dialog({showHeader:!1,showFooter:!0}).add(i).onOK((()=>{let e=a.canvas.getHelm(!0).replace(/<\/span>/g,"").replace(/<span style='background:#bbf;'>/g,"");if(void 0===o)t.value=e;else{let r=l.convertHelmToFastaSeparator(e,o);t.value=r}})).show({modal:!0,fullScreen:!0})}(t,e,o):r.shell.warning(`Monomers ${Array.from(i).join(", ")} are absent! <br/>Please, upload the monomer library! <br/><a href="https://datagrok.ai/help/domains/bio/macromolecules" target="_blank">Learn more</a>`)}function z(t){W(t.cell,void 0,void 0)}function j(t){let e=r.shell.tv.grid.dataFrame,n=e.columns.bySemType("Macromolecule");"helm"===n.getTag(o.TAGS.UNITS)&&W(e.currentCell,void 0,void 0);const i=new D(n).convertStringToHelm(t,"/");W(e.currentCell,i,n.getTag(o.TAGS.UNITS))}function B(t){return R(this,void 0,void 0,(function*(){let e=r.shell.tv.grid.root.parentElement;const i=n.div([]);e.appendChild(i);let s=new JSDraw2.Editor(i,{viewonly:!0});i.style.width="0px",i.style.height="0px",s.setHelm(t);let l=s.getFormula(!0),a=Math.round(100*s.getMolWeight())/100,h=Math.round(100*s.getExtinctionCoefficient(!0))/100;return e.lastChild.remove(),new o.Widget(n.tableFromMap({formula:l.replace(/<sub>/g,"").replace(/<\/sub>/g,""),"molecular weight":a,"extinction coefficient":h}))}))}function V(t){const e=t.match(/(?<=\[)[^\][]*(?=])/gm),r={};let n,o="";for(let t=0;t<e.length;t++)if(null!=e[t]&&/\d/.test(e[t])){n=e[t][e[t].length-1],e[t]=e[t].replace(/[0-9]/g,"");for(let r=0;r<e[t].length;r++)":"!=e[t][r]&&(o+=e[t][r]);r["R"+n]=o,o=""}return r}function q(t){let e=r.shell.tv.grid.root.parentElement,i=o.Column.string("mols",t.length);const s=n.div([]);e.appendChild(s);let l=new JSDraw2.Editor(s,{viewonly:!0});return s.style.width="0px",s.style.height="0px",i.init((e=>(l.setHelm(t.get(e)),l.getMolfile()))),e.lastChild.remove(),i}function Y(){return new i}helm=e})();
2
+ //# sourceMappingURL=package.js.map