@appius-fr/apx 2.6.1 → 2.7.0
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/APX.mjs +2 -0
- package/README.md +207 -203
- package/dist/2ab50e700c8fbddb45e0.svg +10 -0
- package/dist/2e967d8dd752e0bed703.svg +10 -0
- package/dist/5ddaeefe5dfbc8e09652.svg +7 -0
- package/dist/6dc2907ba3bbb232601d.svg +10 -0
- package/dist/6e1e61dfca176a885b8d.svg +3 -0
- package/dist/6f3a0a27a260bb2c221b.svg +9 -0
- package/dist/8b07a8bf719a38262b7d.svg +10 -0
- package/dist/APX.dev.mjs +843 -245
- package/dist/APX.mjs +1 -1
- package/dist/APX.prod.mjs +1 -1
- package/dist/APX.standalone.js +744 -92
- package/dist/APX.standalone.js.map +1 -1
- package/dist/bdfa755a1cdb872368c7.svg +3 -0
- package/dist/c9da177f7663f9fcd023.svg +10 -0
- package/dist/ce9ef5fceb78e17e68c9.svg +8 -0
- package/dist/ed5af5163957b04bc6cc.svg +7 -0
- package/modules/listen/README.md +242 -235
- package/modules/listen/listen.mjs +1 -3
- package/modules/scrollableTable/README.md +52 -0
- package/modules/scrollableTable/css/scrollableTable.css +60 -0
- package/modules/scrollableTable/scrollableTable.mjs +198 -0
- package/modules/toast/README.md +186 -153
- package/modules/tools/form-packer/README.md +12 -14
- package/modules/tools/form-packer/augment-apx.mjs +4 -2
- package/modules/tools/form-packer/packToJson.mjs +58 -16
- package/modules/tristate/CHANGELOG.md +34 -0
- package/modules/tristate/README.md +157 -94
- package/modules/tristate/assets/tristate-checked.svg +3 -0
- package/modules/tristate/assets/tristate-cross.svg +10 -0
- package/modules/tristate/assets/tristate-crossed.svg +3 -0
- package/modules/tristate/assets/tristate-indeterminate-dash.svg +9 -0
- package/modules/tristate/assets/tristate-tick.svg +10 -0
- package/modules/tristate/assets/tristate-unchecked.svg +7 -0
- package/modules/tristate/css/tristate.css +91 -24
- package/modules/tristate/tristate.mjs +292 -171
- package/package.json +5 -1
package/dist/APX.dev.mjs
CHANGED
|
@@ -170,6 +170,92 @@ h2.APX-dialog-title{
|
|
|
170
170
|
/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___CSS_LOADER_EXPORT___);
|
|
171
171
|
|
|
172
172
|
|
|
173
|
+
/***/ }),
|
|
174
|
+
|
|
175
|
+
/***/ "./node_modules/css-loader/dist/cjs.js!./modules/scrollableTable/css/scrollableTable.css":
|
|
176
|
+
/*!***********************************************************************************************!*\
|
|
177
|
+
!*** ./node_modules/css-loader/dist/cjs.js!./modules/scrollableTable/css/scrollableTable.css ***!
|
|
178
|
+
\***********************************************************************************************/
|
|
179
|
+
/***/ ((module, __webpack_exports__, __webpack_require__) => {
|
|
180
|
+
|
|
181
|
+
__webpack_require__.r(__webpack_exports__);
|
|
182
|
+
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
|
183
|
+
/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
|
|
184
|
+
/* harmony export */ });
|
|
185
|
+
/* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../node_modules/css-loader/dist/runtime/sourceMaps.js */ "./node_modules/css-loader/dist/runtime/sourceMaps.js");
|
|
186
|
+
/* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__);
|
|
187
|
+
/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../node_modules/css-loader/dist/runtime/api.js */ "./node_modules/css-loader/dist/runtime/api.js");
|
|
188
|
+
/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__);
|
|
189
|
+
// Imports
|
|
190
|
+
|
|
191
|
+
|
|
192
|
+
var ___CSS_LOADER_EXPORT___ = _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default()((_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default()));
|
|
193
|
+
// Module
|
|
194
|
+
___CSS_LOADER_EXPORT___.push([module.id, `/* APX Scrollable Table: scrollable tbody with fixed thead/tfoot and aligned columns (CSS Grid + subgrid) */
|
|
195
|
+
|
|
196
|
+
.apx-scrollable-table {
|
|
197
|
+
display: grid;
|
|
198
|
+
grid-template-columns: repeat(var(--apx-scrollable-cols, 3), minmax(0, 1fr));
|
|
199
|
+
grid-template-rows: auto fit-content(var(--apx-scrollable-body-max-height, 200px)) auto;
|
|
200
|
+
width: 100%;
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
/* Table with no tfoot: thead + tbody only */
|
|
204
|
+
.apx-scrollable-table:not(.apx-scrollable-table--has-tfoot) {
|
|
205
|
+
grid-template-rows: auto fit-content(var(--apx-scrollable-body-max-height, 200px));
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
/* Table with no thead: tbody + tfoot only */
|
|
209
|
+
.apx-scrollable-table.apx-scrollable-table--no-thead {
|
|
210
|
+
grid-template-rows: fit-content(var(--apx-scrollable-body-max-height, 200px)) auto;
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
/* Table with neither thead nor tfoot: tbody only */
|
|
214
|
+
.apx-scrollable-table.apx-scrollable-table--no-thead:not(.apx-scrollable-table--has-tfoot) {
|
|
215
|
+
grid-template-rows: fit-content(var(--apx-scrollable-body-max-height, 200px));
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
.apx-scrollable-table > thead,
|
|
219
|
+
.apx-scrollable-table > tbody,
|
|
220
|
+
.apx-scrollable-table > tfoot {
|
|
221
|
+
display: grid;
|
|
222
|
+
grid-template-columns: subgrid;
|
|
223
|
+
grid-column: 1 / -1;
|
|
224
|
+
grid-template-rows: repeat(var(--apx-scrollable-thead-rows, 1), auto);
|
|
225
|
+
min-height: 0;
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
.apx-scrollable-table > thead {
|
|
229
|
+
grid-template-rows: repeat(var(--apx-scrollable-thead-rows, 1), auto);
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
.apx-scrollable-table > tbody {
|
|
233
|
+
grid-template-rows: repeat(var(--apx-scrollable-tbody-rows, 1), auto);
|
|
234
|
+
overflow: auto;
|
|
235
|
+
/* Reserve space for the vertical scrollbar so it doesn't shrink content width and trigger a horizontal scrollbar */
|
|
236
|
+
scrollbar-gutter: stable;
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
.apx-scrollable-table > tfoot {
|
|
240
|
+
grid-template-rows: repeat(var(--apx-scrollable-tfoot-rows, 1), auto);
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
.apx-scrollable-table > thead > tr,
|
|
244
|
+
.apx-scrollable-table > tbody > tr,
|
|
245
|
+
.apx-scrollable-table > tfoot > tr {
|
|
246
|
+
display: contents;
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
.apx-scrollable-table th,
|
|
250
|
+
.apx-scrollable-table td {
|
|
251
|
+
/* Grid placement set by JS (grid-row, grid-column) for colspan/rowspan */
|
|
252
|
+
min-width: 0;
|
|
253
|
+
}
|
|
254
|
+
`, "",{"version":3,"sources":["webpack://./modules/scrollableTable/css/scrollableTable.css"],"names":[],"mappings":"AAAA,2GAA2G;;AAE3G;IACI,aAAa;IACb,4EAA4E;IAC5E,uFAAuF;IACvF,WAAW;AACf;;AAEA,4CAA4C;AAC5C;IACI,kFAAkF;AACtF;;AAEA,4CAA4C;AAC5C;IACI,kFAAkF;AACtF;;AAEA,mDAAmD;AACnD;IACI,6EAA6E;AACjF;;AAEA;;;IAGI,aAAa;IACb,8BAA8B;IAC9B,mBAAmB;IACnB,qEAAqE;IACrE,aAAa;AACjB;;AAEA;IACI,qEAAqE;AACzE;;AAEA;IACI,qEAAqE;IACrE,cAAc;IACd,mHAAmH;IACnH,wBAAwB;AAC5B;;AAEA;IACI,qEAAqE;AACzE;;AAEA;;;IAGI,iBAAiB;AACrB;;AAEA;;IAEI,yEAAyE;IACzE,YAAY;AAChB","sourcesContent":["/* APX Scrollable Table: scrollable tbody with fixed thead/tfoot and aligned columns (CSS Grid + subgrid) */\r\n\r\n.apx-scrollable-table {\r\n display: grid;\r\n grid-template-columns: repeat(var(--apx-scrollable-cols, 3), minmax(0, 1fr));\r\n grid-template-rows: auto fit-content(var(--apx-scrollable-body-max-height, 200px)) auto;\r\n width: 100%;\r\n}\r\n\r\n/* Table with no tfoot: thead + tbody only */\r\n.apx-scrollable-table:not(.apx-scrollable-table--has-tfoot) {\r\n grid-template-rows: auto fit-content(var(--apx-scrollable-body-max-height, 200px));\r\n}\r\n\r\n/* Table with no thead: tbody + tfoot only */\r\n.apx-scrollable-table.apx-scrollable-table--no-thead {\r\n grid-template-rows: fit-content(var(--apx-scrollable-body-max-height, 200px)) auto;\r\n}\r\n\r\n/* Table with neither thead nor tfoot: tbody only */\r\n.apx-scrollable-table.apx-scrollable-table--no-thead:not(.apx-scrollable-table--has-tfoot) {\r\n grid-template-rows: fit-content(var(--apx-scrollable-body-max-height, 200px));\r\n}\r\n\r\n.apx-scrollable-table > thead,\r\n.apx-scrollable-table > tbody,\r\n.apx-scrollable-table > tfoot {\r\n display: grid;\r\n grid-template-columns: subgrid;\r\n grid-column: 1 / -1;\r\n grid-template-rows: repeat(var(--apx-scrollable-thead-rows, 1), auto);\r\n min-height: 0;\r\n}\r\n\r\n.apx-scrollable-table > thead {\r\n grid-template-rows: repeat(var(--apx-scrollable-thead-rows, 1), auto);\r\n}\r\n\r\n.apx-scrollable-table > tbody {\r\n grid-template-rows: repeat(var(--apx-scrollable-tbody-rows, 1), auto);\r\n overflow: auto;\r\n /* Reserve space for the vertical scrollbar so it doesn't shrink content width and trigger a horizontal scrollbar */\r\n scrollbar-gutter: stable;\r\n}\r\n\r\n.apx-scrollable-table > tfoot {\r\n grid-template-rows: repeat(var(--apx-scrollable-tfoot-rows, 1), auto);\r\n}\r\n\r\n.apx-scrollable-table > thead > tr,\r\n.apx-scrollable-table > tbody > tr,\r\n.apx-scrollable-table > tfoot > tr {\r\n display: contents;\r\n}\r\n\r\n.apx-scrollable-table th,\r\n.apx-scrollable-table td {\r\n /* Grid placement set by JS (grid-row, grid-column) for colspan/rowspan */\r\n min-width: 0;\r\n}\r\n"],"sourceRoot":""}]);
|
|
255
|
+
// Exports
|
|
256
|
+
/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___CSS_LOADER_EXPORT___);
|
|
257
|
+
|
|
258
|
+
|
|
173
259
|
/***/ }),
|
|
174
260
|
|
|
175
261
|
/***/ "./node_modules/css-loader/dist/cjs.js!./modules/toast/css/toast.css":
|
|
@@ -363,39 +449,108 @@ __webpack_require__.r(__webpack_exports__);
|
|
|
363
449
|
|
|
364
450
|
|
|
365
451
|
|
|
366
|
-
var ___CSS_LOADER_URL_IMPORT_0___ = new URL(/* asset import */ __webpack_require__(/*! data:image/svg+xml,%3Csvg
|
|
367
|
-
var ___CSS_LOADER_URL_IMPORT_1___ = new URL(/* asset import */ __webpack_require__(/*! data:image/svg+xml,%3Csvg
|
|
368
|
-
var ___CSS_LOADER_URL_IMPORT_2___ = new URL(/* asset import */ __webpack_require__(/*! data:image/svg+xml,%
|
|
452
|
+
var ___CSS_LOADER_URL_IMPORT_0___ = new URL(/* asset import */ __webpack_require__(/*! data:image/svg+xml,%3Csvg xmlns=%27http://www.w3.org/2000/svg%27 width=%2732%27 height=%2732%27 viewBox=%270 0 32 32%27%3E%3Cmask id=%27frame-cutout%27%3E%3Crect width=%2732%27 height=%2732%27 fill=%27%23fff%27/%3E%3Crect x=%273%27 y=%273%27 width=%2726%27 height=%2726%27 rx=%274%27 ry=%274%27 fill=%27%23000%27/%3E%3C/mask%3E%3Crect width=%2732%27 height=%2732%27 fill=%27%23cccccc%27 mask=%27url%28%23frame-cutout%29%27/%3E%3C/svg%3E */ "data:image/svg+xml,%3Csvg xmlns=%27http://www.w3.org/2000/svg%27 width=%2732%27 height=%2732%27 viewBox=%270 0 32 32%27%3E%3Cmask id=%27frame-cutout%27%3E%3Crect width=%2732%27 height=%2732%27 fill=%27%23fff%27/%3E%3Crect x=%273%27 y=%273%27 width=%2726%27 height=%2726%27 rx=%274%27 ry=%274%27 fill=%27%23000%27/%3E%3C/mask%3E%3Crect width=%2732%27 height=%2732%27 fill=%27%23cccccc%27 mask=%27url%28%23frame-cutout%29%27/%3E%3C/svg%3E"), __webpack_require__.b);
|
|
453
|
+
var ___CSS_LOADER_URL_IMPORT_1___ = new URL(/* asset import */ __webpack_require__(/*! data:image/svg+xml,%3Csvg xmlns=%27http://www.w3.org/2000/svg%27 width=%2732%27 height=%2732%27 viewBox=%270 0 32 32%27%3E%3Cpath d=%27M8 16h16%27 fill=%27none%27 stroke=%27%23fff%27 stroke-width=%273%27 stroke-linecap=%27round%27/%3E%3C/svg%3E */ "data:image/svg+xml,%3Csvg xmlns=%27http://www.w3.org/2000/svg%27 width=%2732%27 height=%2732%27 viewBox=%270 0 32 32%27%3E%3Cpath d=%27M8 16h16%27 fill=%27none%27 stroke=%27%23fff%27 stroke-width=%273%27 stroke-linecap=%27round%27/%3E%3C/svg%3E"), __webpack_require__.b);
|
|
454
|
+
var ___CSS_LOADER_URL_IMPORT_2___ = new URL(/* asset import */ __webpack_require__(/*! data:image/svg+xml,%3Csvg xmlns=%27http://www.w3.org/2000/svg%27 width=%2732%27 height=%2732%27 viewBox=%270 0 32 32%27%3E%3Cpath d=%27M6 17L12 23L26 9%27 fill=%27none%27 stroke=%27%23fff%27 stroke-width=%273%27 stroke-linecap=%27round%27 stroke-linejoin=%27round%27/%3E%3C/svg%3E */ "data:image/svg+xml,%3Csvg xmlns=%27http://www.w3.org/2000/svg%27 width=%2732%27 height=%2732%27 viewBox=%270 0 32 32%27%3E%3Cpath d=%27M6 17L12 23L26 9%27 fill=%27none%27 stroke=%27%23fff%27 stroke-width=%273%27 stroke-linecap=%27round%27 stroke-linejoin=%27round%27/%3E%3C/svg%3E"), __webpack_require__.b);
|
|
455
|
+
var ___CSS_LOADER_URL_IMPORT_3___ = new URL(/* asset import */ __webpack_require__(/*! data:image/svg+xml,%3Csvg xmlns=%27http://www.w3.org/2000/svg%27 width=%2732%27 height=%2732%27 viewBox=%270 0 32 32%27%3E%3Cpath d=%27M8 8L24 24M24 8L8 24%27 fill=%27none%27 stroke=%27%23fff%27 stroke-width=%273%27 stroke-linecap=%27round%27 stroke-linejoin=%27round%27/%3E%3C/svg%3E */ "data:image/svg+xml,%3Csvg xmlns=%27http://www.w3.org/2000/svg%27 width=%2732%27 height=%2732%27 viewBox=%270 0 32 32%27%3E%3Cpath d=%27M8 8L24 24M24 8L8 24%27 fill=%27none%27 stroke=%27%23fff%27 stroke-width=%273%27 stroke-linecap=%27round%27 stroke-linejoin=%27round%27/%3E%3C/svg%3E"), __webpack_require__.b);
|
|
369
456
|
var ___CSS_LOADER_EXPORT___ = _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default()((_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default()));
|
|
370
457
|
var ___CSS_LOADER_URL_REPLACEMENT_0___ = _node_modules_css_loader_dist_runtime_getUrl_js__WEBPACK_IMPORTED_MODULE_2___default()(___CSS_LOADER_URL_IMPORT_0___);
|
|
371
458
|
var ___CSS_LOADER_URL_REPLACEMENT_1___ = _node_modules_css_loader_dist_runtime_getUrl_js__WEBPACK_IMPORTED_MODULE_2___default()(___CSS_LOADER_URL_IMPORT_1___);
|
|
372
459
|
var ___CSS_LOADER_URL_REPLACEMENT_2___ = _node_modules_css_loader_dist_runtime_getUrl_js__WEBPACK_IMPORTED_MODULE_2___default()(___CSS_LOADER_URL_IMPORT_2___);
|
|
460
|
+
var ___CSS_LOADER_URL_REPLACEMENT_3___ = _node_modules_css_loader_dist_runtime_getUrl_js__WEBPACK_IMPORTED_MODULE_2___default()(___CSS_LOADER_URL_IMPORT_3___);
|
|
373
461
|
// Module
|
|
374
|
-
___CSS_LOADER_EXPORT___.push([module.id, `.apx-tristate {
|
|
375
|
-
display: inline-block;
|
|
376
|
-
vertical-align: middle;
|
|
377
|
-
text-align: center;
|
|
378
|
-
cursor: pointer;
|
|
379
|
-
position: relative;
|
|
380
|
-
min-width:13px;
|
|
381
|
-
min-height:13px;
|
|
382
|
-
background-size: contain;
|
|
383
|
-
background-color:
|
|
384
|
-
border-radius:3px;
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
}
|
|
389
|
-
.apx-tristate.
|
|
390
|
-
background-image: url(${
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
}
|
|
462
|
+
___CSS_LOADER_EXPORT___.push([module.id, `.apx-tristate {
|
|
463
|
+
display: inline-block;
|
|
464
|
+
vertical-align: middle;
|
|
465
|
+
text-align: center;
|
|
466
|
+
cursor: pointer;
|
|
467
|
+
position: relative;
|
|
468
|
+
min-width:13px;
|
|
469
|
+
min-height:13px;
|
|
470
|
+
background-size: contain;
|
|
471
|
+
background-color: transparent;
|
|
472
|
+
border-radius:3px;
|
|
473
|
+
--apx-tristate-tick-color: transparent;
|
|
474
|
+
--apx-tristate-checked-color: #0654ba;
|
|
475
|
+
--apx-tristate-crossed-color: #f00;
|
|
476
|
+
}
|
|
477
|
+
.apx-tristate.unchecked {
|
|
478
|
+
background-image: url(${___CSS_LOADER_URL_REPLACEMENT_0___});
|
|
479
|
+
}
|
|
480
|
+
.apx-tristate.unchecked.apx-tristate--unchecked-indeterminate::after {
|
|
481
|
+
content: '';
|
|
482
|
+
position: absolute;
|
|
483
|
+
inset: 0;
|
|
484
|
+
display: block;
|
|
485
|
+
pointer-events: none;
|
|
486
|
+
}
|
|
487
|
+
/* When --mixed is used (e.g. parent + sub-checkboxes), dash shows only when children are mixed */
|
|
488
|
+
.apx-tristate.unchecked.apx-tristate--indeterminate-dash:not(.apx-tristate--mixed)::before,
|
|
489
|
+
.apx-tristate.unchecked.apx-tristate--indeterminate-dash:not(.apx-tristate--mixed)::after {
|
|
490
|
+
display: none;
|
|
491
|
+
}
|
|
492
|
+
.apx-tristate.unchecked.apx-tristate--indeterminate-dash::before {
|
|
493
|
+
content: '';
|
|
494
|
+
position: absolute;
|
|
495
|
+
inset: 0;
|
|
496
|
+
display: block;
|
|
497
|
+
pointer-events: none;
|
|
498
|
+
background-color: var(--apx-tristate-checked-color);
|
|
499
|
+
border-radius: inherit;
|
|
500
|
+
}
|
|
501
|
+
.apx-tristate.unchecked.apx-tristate--indeterminate-dash::after {
|
|
502
|
+
background-color: var(--apx-tristate-tick-color);
|
|
503
|
+
-webkit-mask-repeat: no-repeat;
|
|
504
|
+
-webkit-mask-position: center;
|
|
505
|
+
-webkit-mask-size: 100% 100%;
|
|
506
|
+
-webkit-mask-mode: alpha;
|
|
507
|
+
mask-repeat: no-repeat;
|
|
508
|
+
mask-position: center;
|
|
509
|
+
mask-size: 100% 100%;
|
|
510
|
+
mask-mode: alpha;
|
|
511
|
+
-webkit-mask-image: url(${___CSS_LOADER_URL_REPLACEMENT_1___});
|
|
512
|
+
mask-image: url(${___CSS_LOADER_URL_REPLACEMENT_1___});
|
|
513
|
+
}
|
|
514
|
+
.apx-tristate.unchecked.apx-tristate--indeterminate-filled-check::after {
|
|
515
|
+
background-color: var(--apx-tristate-checked-color);
|
|
516
|
+
border-radius: inherit;
|
|
517
|
+
}
|
|
518
|
+
.apx-tristate.checked {
|
|
519
|
+
background-image: none;
|
|
520
|
+
background-color: var(--apx-tristate-checked-color);
|
|
521
|
+
}
|
|
522
|
+
.apx-tristate.crossed {
|
|
523
|
+
background-image: none;
|
|
524
|
+
background-color: var(--apx-tristate-crossed-color);
|
|
525
|
+
}
|
|
526
|
+
|
|
527
|
+
.apx-tristate.checked::after,
|
|
528
|
+
.apx-tristate.crossed::after {
|
|
529
|
+
content: '';
|
|
530
|
+
position: absolute;
|
|
531
|
+
inset: 0;
|
|
532
|
+
display: block;
|
|
533
|
+
background-color: var(--apx-tristate-tick-color);
|
|
534
|
+
-webkit-mask-repeat: no-repeat;
|
|
535
|
+
-webkit-mask-position: center;
|
|
536
|
+
-webkit-mask-size: 100% 100%;
|
|
537
|
+
-webkit-mask-mode: alpha;
|
|
538
|
+
mask-repeat: no-repeat;
|
|
539
|
+
mask-position: center;
|
|
540
|
+
mask-size: 100% 100%;
|
|
541
|
+
mask-mode: alpha;
|
|
542
|
+
pointer-events: none;
|
|
543
|
+
}
|
|
544
|
+
|
|
545
|
+
.apx-tristate.checked::after {
|
|
546
|
+
-webkit-mask-image: url(${___CSS_LOADER_URL_REPLACEMENT_2___});
|
|
547
|
+
mask-image: url(${___CSS_LOADER_URL_REPLACEMENT_2___});
|
|
548
|
+
}
|
|
549
|
+
|
|
550
|
+
.apx-tristate.crossed::after {
|
|
551
|
+
-webkit-mask-image: url(${___CSS_LOADER_URL_REPLACEMENT_3___});
|
|
552
|
+
mask-image: url(${___CSS_LOADER_URL_REPLACEMENT_3___});
|
|
553
|
+
}`, "",{"version":3,"sources":["webpack://./modules/tristate/css/tristate.css"],"names":[],"mappings":"AAAA;IACI,qBAAqB;IACrB,sBAAsB;IACtB,kBAAkB;IAClB,eAAe;IACf,kBAAkB;IAClB,cAAc;IACd,eAAe;IACf,wBAAwB;IACxB,6BAA6B;IAC7B,iBAAiB;IACjB,sCAAsC;IACtC,qCAAqC;IACrC,kCAAkC;AACtC;AACA;IACI,yDAA6X;AACjY;AACA;IACI,WAAW;IACX,kBAAkB;IAClB,QAAQ;IACR,cAAc;IACd,oBAAoB;AACxB;AACA,iGAAiG;AACjG;;IAEI,aAAa;AACjB;AACA;IACI,WAAW;IACX,kBAAkB;IAClB,QAAQ;IACR,cAAc;IACd,oBAAoB;IACpB,mDAAmD;IACnD,sBAAsB;AAC1B;AACA;IACI,gDAAgD;IAChD,8BAA8B;IAC9B,6BAA6B;IAC7B,4BAA4B;IAC5B,wBAAwB;IACxB,sBAAsB;IACtB,qBAAqB;IACrB,oBAAoB;IACpB,gBAAgB;IAChB,2DAA2O;IAC3O,mDAAmO;AACvO;AACA;IACI,mDAAmD;IACnD,sBAAsB;AAC1B;AACA;IACI,sBAAsB;IACtB,mDAAmD;AACvD;AACA;IACI,sBAAsB;IACtB,mDAAmD;AACvD;;AAEA;;IAEI,WAAW;IACX,kBAAkB;IAClB,QAAQ;IACR,cAAc;IACd,gDAAgD;IAChD,8BAA8B;IAC9B,6BAA6B;IAC7B,4BAA4B;IAC5B,wBAAwB;IACxB,sBAAsB;IACtB,qBAAqB;IACrB,oBAAoB;IACpB,gBAAgB;IAChB,oBAAoB;AACxB;;AAEA;IACI,2DAA2Q;IAC3Q,mDAAmQ;AACvQ;;AAEA;IACI,2DAA+Q;IAC/Q,mDAAuQ;AAC3Q","sourcesContent":[".apx-tristate {\n display: inline-block;\n vertical-align: middle;\n text-align: center;\n cursor: pointer;\n position: relative;\n min-width:13px;\n min-height:13px;\n background-size: contain;\n background-color: transparent;\n border-radius:3px;\n --apx-tristate-tick-color: transparent;\n --apx-tristate-checked-color: #0654ba;\n --apx-tristate-crossed-color: #f00;\n}\n.apx-tristate.unchecked {\n background-image: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='32' height='32' viewBox='0 0 32 32'%3E%3Cmask id='frame-cutout'%3E%3Crect width='32' height='32' fill='%23fff'/%3E%3Crect x='3' y='3' width='26' height='26' rx='4' ry='4' fill='%23000'/%3E%3C/mask%3E%3Crect width='32' height='32' fill='%23cccccc' mask='url(%23frame-cutout)'/%3E%3C/svg%3E\");\n}\n.apx-tristate.unchecked.apx-tristate--unchecked-indeterminate::after {\n content: '';\n position: absolute;\n inset: 0;\n display: block;\n pointer-events: none;\n}\n/* When --mixed is used (e.g. parent + sub-checkboxes), dash shows only when children are mixed */\n.apx-tristate.unchecked.apx-tristate--indeterminate-dash:not(.apx-tristate--mixed)::before,\n.apx-tristate.unchecked.apx-tristate--indeterminate-dash:not(.apx-tristate--mixed)::after {\n display: none;\n}\n.apx-tristate.unchecked.apx-tristate--indeterminate-dash::before {\n content: '';\n position: absolute;\n inset: 0;\n display: block;\n pointer-events: none;\n background-color: var(--apx-tristate-checked-color);\n border-radius: inherit;\n}\n.apx-tristate.unchecked.apx-tristate--indeterminate-dash::after {\n background-color: var(--apx-tristate-tick-color);\n -webkit-mask-repeat: no-repeat;\n -webkit-mask-position: center;\n -webkit-mask-size: 100% 100%;\n -webkit-mask-mode: alpha;\n mask-repeat: no-repeat;\n mask-position: center;\n mask-size: 100% 100%;\n mask-mode: alpha;\n -webkit-mask-image: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='32' height='32' viewBox='0 0 32 32'%3E%3Cpath d='M8 16h16' fill='none' stroke='%23fff' stroke-width='3' stroke-linecap='round'/%3E%3C/svg%3E\");\n mask-image: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='32' height='32' viewBox='0 0 32 32'%3E%3Cpath d='M8 16h16' fill='none' stroke='%23fff' stroke-width='3' stroke-linecap='round'/%3E%3C/svg%3E\");\n}\n.apx-tristate.unchecked.apx-tristate--indeterminate-filled-check::after {\n background-color: var(--apx-tristate-checked-color);\n border-radius: inherit;\n}\n.apx-tristate.checked {\n background-image: none;\n background-color: var(--apx-tristate-checked-color);\n}\n.apx-tristate.crossed {\n background-image: none;\n background-color: var(--apx-tristate-crossed-color);\n}\n\n.apx-tristate.checked::after,\n.apx-tristate.crossed::after {\n content: '';\n position: absolute;\n inset: 0;\n display: block;\n background-color: var(--apx-tristate-tick-color);\n -webkit-mask-repeat: no-repeat;\n -webkit-mask-position: center;\n -webkit-mask-size: 100% 100%;\n -webkit-mask-mode: alpha;\n mask-repeat: no-repeat;\n mask-position: center;\n mask-size: 100% 100%;\n mask-mode: alpha;\n pointer-events: none;\n}\n\n.apx-tristate.checked::after {\n -webkit-mask-image: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='32' height='32' viewBox='0 0 32 32'%3E%3Cpath d='M6 17L12 23L26 9' fill='none' stroke='%23fff' stroke-width='3' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E\");\n mask-image: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='32' height='32' viewBox='0 0 32 32'%3E%3Cpath d='M6 17L12 23L26 9' fill='none' stroke='%23fff' stroke-width='3' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E\");\n}\n\n.apx-tristate.crossed::after {\n -webkit-mask-image: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='32' height='32' viewBox='0 0 32 32'%3E%3Cpath d='M8 8L24 24M24 8L8 24' fill='none' stroke='%23fff' stroke-width='3' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E\");\n mask-image: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='32' height='32' viewBox='0 0 32 32'%3E%3Cpath d='M8 8L24 24M24 8L8 24' fill='none' stroke='%23fff' stroke-width='3' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E\");\n}"],"sourceRoot":""}]);
|
|
399
554
|
// Exports
|
|
400
555
|
/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___CSS_LOADER_EXPORT___);
|
|
401
556
|
|
|
@@ -621,6 +776,60 @@ var update = _node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js
|
|
|
621
776
|
/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (_node_modules_css_loader_dist_cjs_js_dialog_css__WEBPACK_IMPORTED_MODULE_6__["default"] && _node_modules_css_loader_dist_cjs_js_dialog_css__WEBPACK_IMPORTED_MODULE_6__["default"].locals ? _node_modules_css_loader_dist_cjs_js_dialog_css__WEBPACK_IMPORTED_MODULE_6__["default"].locals : undefined);
|
|
622
777
|
|
|
623
778
|
|
|
779
|
+
/***/ }),
|
|
780
|
+
|
|
781
|
+
/***/ "./modules/scrollableTable/css/scrollableTable.css":
|
|
782
|
+
/*!*********************************************************!*\
|
|
783
|
+
!*** ./modules/scrollableTable/css/scrollableTable.css ***!
|
|
784
|
+
\*********************************************************/
|
|
785
|
+
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|
786
|
+
|
|
787
|
+
__webpack_require__.r(__webpack_exports__);
|
|
788
|
+
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
|
789
|
+
/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
|
|
790
|
+
/* harmony export */ });
|
|
791
|
+
/* harmony import */ var _node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! !../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js */ "./node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js");
|
|
792
|
+
/* harmony import */ var _node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0__);
|
|
793
|
+
/* harmony import */ var _node_modules_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! !../../../node_modules/style-loader/dist/runtime/styleDomAPI.js */ "./node_modules/style-loader/dist/runtime/styleDomAPI.js");
|
|
794
|
+
/* harmony import */ var _node_modules_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1__);
|
|
795
|
+
/* harmony import */ var _node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! !../../../node_modules/style-loader/dist/runtime/insertBySelector.js */ "./node_modules/style-loader/dist/runtime/insertBySelector.js");
|
|
796
|
+
/* harmony import */ var _node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2__);
|
|
797
|
+
/* harmony import */ var _node_modules_style_loader_dist_runtime_setAttributesWithoutAttributes_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! !../../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js */ "./node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js");
|
|
798
|
+
/* harmony import */ var _node_modules_style_loader_dist_runtime_setAttributesWithoutAttributes_js__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_setAttributesWithoutAttributes_js__WEBPACK_IMPORTED_MODULE_3__);
|
|
799
|
+
/* harmony import */ var _node_modules_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! !../../../node_modules/style-loader/dist/runtime/insertStyleElement.js */ "./node_modules/style-loader/dist/runtime/insertStyleElement.js");
|
|
800
|
+
/* harmony import */ var _node_modules_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4__);
|
|
801
|
+
/* harmony import */ var _node_modules_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! !../../../node_modules/style-loader/dist/runtime/styleTagTransform.js */ "./node_modules/style-loader/dist/runtime/styleTagTransform.js");
|
|
802
|
+
/* harmony import */ var _node_modules_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5__);
|
|
803
|
+
/* harmony import */ var _node_modules_css_loader_dist_cjs_js_scrollableTable_css__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! !!../../../node_modules/css-loader/dist/cjs.js!./scrollableTable.css */ "./node_modules/css-loader/dist/cjs.js!./modules/scrollableTable/css/scrollableTable.css");
|
|
804
|
+
|
|
805
|
+
|
|
806
|
+
|
|
807
|
+
|
|
808
|
+
|
|
809
|
+
|
|
810
|
+
|
|
811
|
+
|
|
812
|
+
|
|
813
|
+
|
|
814
|
+
|
|
815
|
+
var options = {};
|
|
816
|
+
|
|
817
|
+
options.styleTagTransform = (_node_modules_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5___default());
|
|
818
|
+
options.setAttributes = (_node_modules_style_loader_dist_runtime_setAttributesWithoutAttributes_js__WEBPACK_IMPORTED_MODULE_3___default());
|
|
819
|
+
|
|
820
|
+
options.insert = _node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2___default().bind(null, "head");
|
|
821
|
+
|
|
822
|
+
options.domAPI = (_node_modules_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1___default());
|
|
823
|
+
options.insertStyleElement = (_node_modules_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4___default());
|
|
824
|
+
|
|
825
|
+
var update = _node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0___default()(_node_modules_css_loader_dist_cjs_js_scrollableTable_css__WEBPACK_IMPORTED_MODULE_6__["default"], options);
|
|
826
|
+
|
|
827
|
+
|
|
828
|
+
|
|
829
|
+
|
|
830
|
+
/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (_node_modules_css_loader_dist_cjs_js_scrollableTable_css__WEBPACK_IMPORTED_MODULE_6__["default"] && _node_modules_css_loader_dist_cjs_js_scrollableTable_css__WEBPACK_IMPORTED_MODULE_6__["default"].locals ? _node_modules_css_loader_dist_cjs_js_scrollableTable_css__WEBPACK_IMPORTED_MODULE_6__["default"].locals : undefined);
|
|
831
|
+
|
|
832
|
+
|
|
624
833
|
/***/ }),
|
|
625
834
|
|
|
626
835
|
/***/ "./modules/toast/css/toast.css":
|
|
@@ -998,33 +1207,43 @@ module.exports = styleTagTransform;
|
|
|
998
1207
|
|
|
999
1208
|
/***/ }),
|
|
1000
1209
|
|
|
1001
|
-
/***/ "data:image/svg+xml,%
|
|
1002
|
-
|
|
1003
|
-
!*** data:image/svg+xml,%
|
|
1004
|
-
|
|
1210
|
+
/***/ "data:image/svg+xml,%3Csvg xmlns=%27http://www.w3.org/2000/svg%27 width=%2732%27 height=%2732%27 viewBox=%270 0 32 32%27%3E%3Cmask id=%27frame-cutout%27%3E%3Crect width=%2732%27 height=%2732%27 fill=%27%23fff%27/%3E%3Crect x=%273%27 y=%273%27 width=%2726%27 height=%2726%27 rx=%274%27 ry=%274%27 fill=%27%23000%27/%3E%3C/mask%3E%3Crect width=%2732%27 height=%2732%27 fill=%27%23cccccc%27 mask=%27url%28%23frame-cutout%29%27/%3E%3C/svg%3E":
|
|
1211
|
+
/*!************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************!*\
|
|
1212
|
+
!*** data:image/svg+xml,%3Csvg xmlns=%27http://www.w3.org/2000/svg%27 width=%2732%27 height=%2732%27 viewBox=%270 0 32 32%27%3E%3Cmask id=%27frame-cutout%27%3E%3Crect width=%2732%27 height=%2732%27 fill=%27%23fff%27/%3E%3Crect x=%273%27 y=%273%27 width=%2726%27 height=%2726%27 rx=%274%27 ry=%274%27 fill=%27%23000%27/%3E%3C/mask%3E%3Crect width=%2732%27 height=%2732%27 fill=%27%23cccccc%27 mask=%27url%28%23frame-cutout%29%27/%3E%3C/svg%3E ***!
|
|
1213
|
+
\************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************/
|
|
1005
1214
|
/***/ ((module) => {
|
|
1006
1215
|
|
|
1007
|
-
module.exports = "data:image/svg+xml,%
|
|
1216
|
+
module.exports = "data:image/svg+xml,%3Csvg xmlns=%27http://www.w3.org/2000/svg%27 width=%2732%27 height=%2732%27 viewBox=%270 0 32 32%27%3E%3Cmask id=%27frame-cutout%27%3E%3Crect width=%2732%27 height=%2732%27 fill=%27%23fff%27/%3E%3Crect x=%273%27 y=%273%27 width=%2726%27 height=%2726%27 rx=%274%27 ry=%274%27 fill=%27%23000%27/%3E%3C/mask%3E%3Crect width=%2732%27 height=%2732%27 fill=%27%23cccccc%27 mask=%27url%28%23frame-cutout%29%27/%3E%3C/svg%3E";
|
|
1008
1217
|
|
|
1009
1218
|
/***/ }),
|
|
1010
1219
|
|
|
1011
|
-
/***/ "data:image/svg+xml,%3Csvg
|
|
1012
|
-
|
|
1013
|
-
!*** data:image/svg+xml,%3Csvg
|
|
1014
|
-
|
|
1220
|
+
/***/ "data:image/svg+xml,%3Csvg xmlns=%27http://www.w3.org/2000/svg%27 width=%2732%27 height=%2732%27 viewBox=%270 0 32 32%27%3E%3Cpath d=%27M6 17L12 23L26 9%27 fill=%27none%27 stroke=%27%23fff%27 stroke-width=%273%27 stroke-linecap=%27round%27 stroke-linejoin=%27round%27/%3E%3C/svg%3E":
|
|
1221
|
+
/*!************************************************************************************************************************************************************************************************************************************************************************************************!*\
|
|
1222
|
+
!*** data:image/svg+xml,%3Csvg xmlns=%27http://www.w3.org/2000/svg%27 width=%2732%27 height=%2732%27 viewBox=%270 0 32 32%27%3E%3Cpath d=%27M6 17L12 23L26 9%27 fill=%27none%27 stroke=%27%23fff%27 stroke-width=%273%27 stroke-linecap=%27round%27 stroke-linejoin=%27round%27/%3E%3C/svg%3E ***!
|
|
1223
|
+
\************************************************************************************************************************************************************************************************************************************************************************************************/
|
|
1015
1224
|
/***/ ((module) => {
|
|
1016
1225
|
|
|
1017
|
-
module.exports = "data:image/svg+xml,%3Csvg
|
|
1226
|
+
module.exports = "data:image/svg+xml,%3Csvg xmlns=%27http://www.w3.org/2000/svg%27 width=%2732%27 height=%2732%27 viewBox=%270 0 32 32%27%3E%3Cpath d=%27M6 17L12 23L26 9%27 fill=%27none%27 stroke=%27%23fff%27 stroke-width=%273%27 stroke-linecap=%27round%27 stroke-linejoin=%27round%27/%3E%3C/svg%3E";
|
|
1018
1227
|
|
|
1019
1228
|
/***/ }),
|
|
1020
1229
|
|
|
1021
|
-
/***/ "data:image/svg+xml,%3Csvg
|
|
1022
|
-
|
|
1023
|
-
!*** data:image/svg+xml,%3Csvg
|
|
1024
|
-
|
|
1230
|
+
/***/ "data:image/svg+xml,%3Csvg xmlns=%27http://www.w3.org/2000/svg%27 width=%2732%27 height=%2732%27 viewBox=%270 0 32 32%27%3E%3Cpath d=%27M8 16h16%27 fill=%27none%27 stroke=%27%23fff%27 stroke-width=%273%27 stroke-linecap=%27round%27/%3E%3C/svg%3E":
|
|
1231
|
+
/*!************************************************************************************************************************************************************************************************************************************************************!*\
|
|
1232
|
+
!*** data:image/svg+xml,%3Csvg xmlns=%27http://www.w3.org/2000/svg%27 width=%2732%27 height=%2732%27 viewBox=%270 0 32 32%27%3E%3Cpath d=%27M8 16h16%27 fill=%27none%27 stroke=%27%23fff%27 stroke-width=%273%27 stroke-linecap=%27round%27/%3E%3C/svg%3E ***!
|
|
1233
|
+
\************************************************************************************************************************************************************************************************************************************************************/
|
|
1025
1234
|
/***/ ((module) => {
|
|
1026
1235
|
|
|
1027
|
-
module.exports = "data:image/svg+xml,%3Csvg
|
|
1236
|
+
module.exports = "data:image/svg+xml,%3Csvg xmlns=%27http://www.w3.org/2000/svg%27 width=%2732%27 height=%2732%27 viewBox=%270 0 32 32%27%3E%3Cpath d=%27M8 16h16%27 fill=%27none%27 stroke=%27%23fff%27 stroke-width=%273%27 stroke-linecap=%27round%27/%3E%3C/svg%3E";
|
|
1237
|
+
|
|
1238
|
+
/***/ }),
|
|
1239
|
+
|
|
1240
|
+
/***/ "data:image/svg+xml,%3Csvg xmlns=%27http://www.w3.org/2000/svg%27 width=%2732%27 height=%2732%27 viewBox=%270 0 32 32%27%3E%3Cpath d=%27M8 8L24 24M24 8L8 24%27 fill=%27none%27 stroke=%27%23fff%27 stroke-width=%273%27 stroke-linecap=%27round%27 stroke-linejoin=%27round%27/%3E%3C/svg%3E":
|
|
1241
|
+
/*!****************************************************************************************************************************************************************************************************************************************************************************************************!*\
|
|
1242
|
+
!*** data:image/svg+xml,%3Csvg xmlns=%27http://www.w3.org/2000/svg%27 width=%2732%27 height=%2732%27 viewBox=%270 0 32 32%27%3E%3Cpath d=%27M8 8L24 24M24 8L8 24%27 fill=%27none%27 stroke=%27%23fff%27 stroke-width=%273%27 stroke-linecap=%27round%27 stroke-linejoin=%27round%27/%3E%3C/svg%3E ***!
|
|
1243
|
+
\****************************************************************************************************************************************************************************************************************************************************************************************************/
|
|
1244
|
+
/***/ ((module) => {
|
|
1245
|
+
|
|
1246
|
+
module.exports = "data:image/svg+xml,%3Csvg xmlns=%27http://www.w3.org/2000/svg%27 width=%2732%27 height=%2732%27 viewBox=%270 0 32 32%27%3E%3Cpath d=%27M8 8L24 24M24 8L8 24%27 fill=%27none%27 stroke=%27%23fff%27 stroke-width=%273%27 stroke-linecap=%27round%27 stroke-linejoin=%27round%27/%3E%3C/svg%3E";
|
|
1028
1247
|
|
|
1029
1248
|
/***/ }),
|
|
1030
1249
|
|
|
@@ -1511,9 +1730,7 @@ function executeCallbacks(event, uniqueId, timeoutDuration, selector = '', eleme
|
|
|
1511
1730
|
}
|
|
1512
1731
|
});
|
|
1513
1732
|
});
|
|
1514
|
-
}, Promise.resolve()).catch(
|
|
1515
|
-
console.error('Error in callback chain:', error);
|
|
1516
|
-
});
|
|
1733
|
+
}, Promise.resolve()).catch(() => {});
|
|
1517
1734
|
}
|
|
1518
1735
|
}
|
|
1519
1736
|
|
|
@@ -1545,6 +1762,219 @@ function closest(element, selector) {
|
|
|
1545
1762
|
}
|
|
1546
1763
|
|
|
1547
1764
|
|
|
1765
|
+
/***/ }),
|
|
1766
|
+
|
|
1767
|
+
/***/ "./modules/scrollableTable/scrollableTable.mjs":
|
|
1768
|
+
/*!*****************************************************!*\
|
|
1769
|
+
!*** ./modules/scrollableTable/scrollableTable.mjs ***!
|
|
1770
|
+
\*****************************************************/
|
|
1771
|
+
/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
|
|
1772
|
+
|
|
1773
|
+
__webpack_require__.r(__webpack_exports__);
|
|
1774
|
+
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
|
1775
|
+
/* harmony export */ "default": () => (/* binding */ augmentWithScrollableTable)
|
|
1776
|
+
/* harmony export */ });
|
|
1777
|
+
/* harmony import */ var _css_scrollableTable_css__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./css/scrollableTable.css */ "./modules/scrollableTable/css/scrollableTable.css");
|
|
1778
|
+
|
|
1779
|
+
|
|
1780
|
+
const DATA_KEY = '_apxScrollableTable';
|
|
1781
|
+
const CLASS_TABLE = 'apx-scrollable-table';
|
|
1782
|
+
|
|
1783
|
+
const DEFAULT_MAX_HEIGHT = '200px';
|
|
1784
|
+
|
|
1785
|
+
/**
|
|
1786
|
+
* Get number of columns from the first row that has cells (sum of colspan).
|
|
1787
|
+
* @param {HTMLTableSectionElement} section - thead, tbody, or tfoot
|
|
1788
|
+
* @returns {number}
|
|
1789
|
+
*/
|
|
1790
|
+
function getColumnCountFromSection(section) {
|
|
1791
|
+
const firstRow = section?.querySelector(':scope > tr');
|
|
1792
|
+
if (!firstRow) return 0;
|
|
1793
|
+
let cols = 0;
|
|
1794
|
+
firstRow.querySelectorAll(':scope > th, :scope > td').forEach((cell) => {
|
|
1795
|
+
cols += parseInt(cell.getAttribute('colspan'), 10) || 1;
|
|
1796
|
+
});
|
|
1797
|
+
return cols;
|
|
1798
|
+
}
|
|
1799
|
+
|
|
1800
|
+
/**
|
|
1801
|
+
* Get total column count for the table (from thead or tbody first row).
|
|
1802
|
+
* @param {HTMLTableElement} table
|
|
1803
|
+
* @returns {number}
|
|
1804
|
+
*/
|
|
1805
|
+
function getTableColumnCount(table) {
|
|
1806
|
+
const thead = table.querySelector('thead');
|
|
1807
|
+
const tbody = table.querySelector('tbody');
|
|
1808
|
+
const countFromThead = thead ? getColumnCountFromSection(thead) : 0;
|
|
1809
|
+
const countFromTbody = tbody ? getColumnCountFromSection(tbody) : 0;
|
|
1810
|
+
return countFromThead || countFromTbody || 1;
|
|
1811
|
+
}
|
|
1812
|
+
|
|
1813
|
+
/**
|
|
1814
|
+
* Count direct tr children in a section.
|
|
1815
|
+
* @param {HTMLTableSectionElement} section
|
|
1816
|
+
* @returns {number}
|
|
1817
|
+
*/
|
|
1818
|
+
function getRowCount(section) {
|
|
1819
|
+
if (!section) return 0;
|
|
1820
|
+
return section.querySelectorAll(':scope > tr').length;
|
|
1821
|
+
}
|
|
1822
|
+
|
|
1823
|
+
/**
|
|
1824
|
+
* Build a 2D grid of occupied slots for a section (for rowspan/colspan placement).
|
|
1825
|
+
* Place each cell in DOM order; return a list of { cell, row, col, colspan, rowspan }.
|
|
1826
|
+
* @param {HTMLTableSectionElement} section
|
|
1827
|
+
* @param {number} numRows
|
|
1828
|
+
* @param {number} numCols
|
|
1829
|
+
* @returns {{ cell: HTMLTableCellElement, row: number, col: number, colspan: number, rowspan: number }[]}
|
|
1830
|
+
*/
|
|
1831
|
+
function computeCellPlacements(section, numRows, numCols) {
|
|
1832
|
+
if (!section || numRows === 0 || numCols === 0) return [];
|
|
1833
|
+
const occupied = Array.from({ length: numRows }, () => Array(numCols).fill(false));
|
|
1834
|
+
const placements = [];
|
|
1835
|
+
const rows = section.querySelectorAll(':scope > tr');
|
|
1836
|
+
|
|
1837
|
+
for (let r = 0; r < rows.length; r++) {
|
|
1838
|
+
const tr = rows[r];
|
|
1839
|
+
const cells = tr.querySelectorAll(':scope > th, :scope > td');
|
|
1840
|
+
for (const cell of cells) {
|
|
1841
|
+
const colspan = Math.min(parseInt(cell.getAttribute('colspan'), 10) || 1, numCols);
|
|
1842
|
+
const rowspan = Math.min(parseInt(cell.getAttribute('rowspan'), 10) || 1, numRows - r);
|
|
1843
|
+
let col = 0;
|
|
1844
|
+
while (col < numCols) {
|
|
1845
|
+
let free = true;
|
|
1846
|
+
for (let rr = r; rr < r + rowspan && free; rr++) {
|
|
1847
|
+
for (let cc = col; cc < col + colspan && free; cc++) {
|
|
1848
|
+
if (occupied[rr]?.[cc]) free = false;
|
|
1849
|
+
}
|
|
1850
|
+
}
|
|
1851
|
+
if (free) break;
|
|
1852
|
+
col++;
|
|
1853
|
+
}
|
|
1854
|
+
if (col + colspan > numCols) continue;
|
|
1855
|
+
for (let rr = r; rr < r + rowspan; rr++) {
|
|
1856
|
+
for (let cc = col; cc < col + colspan; cc++) {
|
|
1857
|
+
if (occupied[rr]) occupied[rr][cc] = true;
|
|
1858
|
+
}
|
|
1859
|
+
}
|
|
1860
|
+
placements.push({ cell, row: r, col, colspan, rowspan });
|
|
1861
|
+
}
|
|
1862
|
+
}
|
|
1863
|
+
return placements;
|
|
1864
|
+
}
|
|
1865
|
+
|
|
1866
|
+
/**
|
|
1867
|
+
* Apply grid placement styles to a list of placements (1-based line numbers for CSS Grid).
|
|
1868
|
+
*/
|
|
1869
|
+
function applyPlacements(placements) {
|
|
1870
|
+
placements.forEach(({ cell, row, col, colspan, rowspan }) => {
|
|
1871
|
+
cell.style.gridRow = `${row + 1} / span ${rowspan}`;
|
|
1872
|
+
cell.style.gridColumn = `${col + 1} / span ${colspan}`;
|
|
1873
|
+
});
|
|
1874
|
+
}
|
|
1875
|
+
|
|
1876
|
+
/**
|
|
1877
|
+
* Clear grid placement styles from all th/td in a table (for refresh).
|
|
1878
|
+
* @param {HTMLTableElement} table
|
|
1879
|
+
*/
|
|
1880
|
+
function clearPlacements(table) {
|
|
1881
|
+
table.querySelectorAll('th, td').forEach((cell) => {
|
|
1882
|
+
cell.style.gridRow = '';
|
|
1883
|
+
cell.style.gridColumn = '';
|
|
1884
|
+
});
|
|
1885
|
+
}
|
|
1886
|
+
|
|
1887
|
+
/**
|
|
1888
|
+
* Normalize maxHeight option to a CSS length string.
|
|
1889
|
+
* @param {number|string} value
|
|
1890
|
+
* @returns {string}
|
|
1891
|
+
*/
|
|
1892
|
+
function normalizeMaxHeight(value) {
|
|
1893
|
+
if (value == null) return DEFAULT_MAX_HEIGHT;
|
|
1894
|
+
if (typeof value === 'number') return `${value}px`;
|
|
1895
|
+
return String(value);
|
|
1896
|
+
}
|
|
1897
|
+
|
|
1898
|
+
/**
|
|
1899
|
+
* Apply scrollable table layout to a single table.
|
|
1900
|
+
* @param {HTMLTableElement} table
|
|
1901
|
+
* @param {{ maxHeight?: number|string }} options
|
|
1902
|
+
*/
|
|
1903
|
+
function applyScrollableTable(table, options) {
|
|
1904
|
+
const thead = table.querySelector('thead');
|
|
1905
|
+
const tbody = table.querySelector('tbody');
|
|
1906
|
+
const tfoot = table.querySelector('tfoot');
|
|
1907
|
+
|
|
1908
|
+
const numCols = getTableColumnCount(table);
|
|
1909
|
+
if (numCols === 0) return;
|
|
1910
|
+
|
|
1911
|
+
const theadRows = getRowCount(thead);
|
|
1912
|
+
const tbodyRows = getRowCount(tbody);
|
|
1913
|
+
const tfootRows = getRowCount(tfoot);
|
|
1914
|
+
|
|
1915
|
+
table.style.setProperty('--apx-scrollable-cols', String(numCols));
|
|
1916
|
+
table.style.setProperty('--apx-scrollable-thead-rows', String(Math.max(1, theadRows)));
|
|
1917
|
+
table.style.setProperty('--apx-scrollable-tbody-rows', String(Math.max(1, tbodyRows)));
|
|
1918
|
+
table.style.setProperty('--apx-scrollable-tfoot-rows', String(Math.max(1, tfootRows)));
|
|
1919
|
+
table.style.setProperty('--apx-scrollable-body-max-height', normalizeMaxHeight(options.maxHeight));
|
|
1920
|
+
|
|
1921
|
+
table.classList.add(CLASS_TABLE);
|
|
1922
|
+
table.classList.toggle('apx-scrollable-table--has-tfoot', !!(tfoot && tfootRows > 0));
|
|
1923
|
+
table.classList.toggle('apx-scrollable-table--no-thead', !(thead && theadRows > 0));
|
|
1924
|
+
|
|
1925
|
+
clearPlacements(table);
|
|
1926
|
+
|
|
1927
|
+
const sections = [
|
|
1928
|
+
{ section: thead, rows: Math.max(1, theadRows) },
|
|
1929
|
+
{ section: tbody, rows: Math.max(1, tbodyRows) },
|
|
1930
|
+
{ section: tfoot, rows: Math.max(1, tfootRows) }
|
|
1931
|
+
];
|
|
1932
|
+
sections.forEach(({ section, rows }) => {
|
|
1933
|
+
if (!section) return;
|
|
1934
|
+
const placements = computeCellPlacements(section, rows, numCols);
|
|
1935
|
+
applyPlacements(placements);
|
|
1936
|
+
});
|
|
1937
|
+
}
|
|
1938
|
+
|
|
1939
|
+
/**
|
|
1940
|
+
* Augments the APX object with scrollableTable(options | 'refresh').
|
|
1941
|
+
* Makes the tbody of a table scrollable while keeping thead/tfoot fixed and columns aligned (CSS Grid + subgrid).
|
|
1942
|
+
*
|
|
1943
|
+
* @param {Object} apx - The APX object to augment.
|
|
1944
|
+
* @example
|
|
1945
|
+
* APX('table.data-grid').scrollableTable({ maxHeight: 300 });
|
|
1946
|
+
* APX('table.data-grid').scrollableTable('refresh');
|
|
1947
|
+
*/
|
|
1948
|
+
function augmentWithScrollableTable(apx) {
|
|
1949
|
+
apx.scrollableTable = function (optionsOrAction) {
|
|
1950
|
+
const isRefresh = optionsOrAction === 'refresh';
|
|
1951
|
+
const options = isRefresh ? null : (optionsOrAction && typeof optionsOrAction === 'object' ? optionsOrAction : {});
|
|
1952
|
+
|
|
1953
|
+
apx.elements.forEach((element) => {
|
|
1954
|
+
if (element.tagName !== 'TABLE') return;
|
|
1955
|
+
const table = /** @type {HTMLTableElement} */ (element);
|
|
1956
|
+
|
|
1957
|
+
const ref = table[DATA_KEY];
|
|
1958
|
+
if (ref) {
|
|
1959
|
+
if (isRefresh) {
|
|
1960
|
+
applyScrollableTable(table, ref.options);
|
|
1961
|
+
} else if (options && Object.keys(options).length > 0) {
|
|
1962
|
+
ref.options = { ...ref.options, ...options };
|
|
1963
|
+
applyScrollableTable(table, ref.options);
|
|
1964
|
+
}
|
|
1965
|
+
return;
|
|
1966
|
+
}
|
|
1967
|
+
if (isRefresh) return;
|
|
1968
|
+
|
|
1969
|
+
applyScrollableTable(table, options);
|
|
1970
|
+
table[DATA_KEY] = { options: { ...options } };
|
|
1971
|
+
});
|
|
1972
|
+
|
|
1973
|
+
return apx;
|
|
1974
|
+
};
|
|
1975
|
+
}
|
|
1976
|
+
|
|
1977
|
+
|
|
1548
1978
|
/***/ }),
|
|
1549
1979
|
|
|
1550
1980
|
/***/ "./modules/toast/toast.mjs":
|
|
@@ -2818,12 +3248,14 @@ __webpack_require__.r(__webpack_exports__);
|
|
|
2818
3248
|
/* harmony default export */ function __WEBPACK_DEFAULT_EXPORT__(apx) {
|
|
2819
3249
|
/**
|
|
2820
3250
|
* Convertit le premier formulaire sélectionné en objet JSON
|
|
3251
|
+
* @param {Object} [options] - Options passées à packFormToJSON (ex. { numericKeysAlwaysArray: true })
|
|
2821
3252
|
* @returns {Object} L'objet JSON résultant
|
|
2822
3253
|
* @throws {Error} Si aucun formulaire n'est trouvé ou si le premier élément n'est pas un formulaire
|
|
2823
3254
|
* @example
|
|
2824
3255
|
* const data = APX('form.myformclass').pack();
|
|
3256
|
+
* const dataLegacy = APX('form').pack({ numericKeysAlwaysArray: true });
|
|
2825
3257
|
*/
|
|
2826
|
-
apx.pack = function () {
|
|
3258
|
+
apx.pack = function (options) {
|
|
2827
3259
|
const firstElement = this.first();
|
|
2828
3260
|
if (!firstElement) {
|
|
2829
3261
|
throw new Error('No element found');
|
|
@@ -2831,7 +3263,7 @@ __webpack_require__.r(__webpack_exports__);
|
|
|
2831
3263
|
if (firstElement.tagName !== 'FORM') {
|
|
2832
3264
|
throw new Error('Element is not a form');
|
|
2833
3265
|
}
|
|
2834
|
-
return (0,_packToJson_mjs__WEBPACK_IMPORTED_MODULE_0__.packFormToJSON)(firstElement);
|
|
3266
|
+
return (0,_packToJson_mjs__WEBPACK_IMPORTED_MODULE_0__.packFormToJSON)(firstElement, options);
|
|
2835
3267
|
};
|
|
2836
3268
|
|
|
2837
3269
|
return apx;
|
|
@@ -2855,15 +3287,19 @@ __webpack_require__.r(__webpack_exports__);
|
|
|
2855
3287
|
/**
|
|
2856
3288
|
* Convertit un formulaire HTML en objet JSON
|
|
2857
3289
|
* @param {HTMLFormElement} form - Le formulaire à convertir
|
|
3290
|
+
* @param {Object} [options] - Options de conversion
|
|
3291
|
+
* @param {boolean} [options.numericKeysAlwaysArray=false] - Si true, toute clé numérique est traitée comme index de tableau (comportement d'avant 2.6.2). Sinon, heuristique : tableau seulement si indices denses 0,1,2,…,n.
|
|
2858
3292
|
* @returns {Object} L'objet JSON résultant
|
|
2859
3293
|
* @throws {TypeError} Si form n'est pas un HTMLFormElement
|
|
2860
3294
|
*/
|
|
2861
|
-
const packFormToJSON = (form) => {
|
|
3295
|
+
const packFormToJSON = (form, options = {}) => {
|
|
2862
3296
|
// Validation de l'entrée
|
|
2863
3297
|
if (!form || !(form instanceof HTMLFormElement)) {
|
|
2864
3298
|
throw new TypeError('packFormToJSON expects an HTMLFormElement');
|
|
2865
3299
|
}
|
|
2866
3300
|
|
|
3301
|
+
const numericKeysAlwaysArray = options.numericKeysAlwaysArray === true;
|
|
3302
|
+
|
|
2867
3303
|
const formData = new FormData(form);
|
|
2868
3304
|
const jsonData = {};
|
|
2869
3305
|
|
|
@@ -2902,6 +3338,7 @@ const packFormToJSON = (form) => {
|
|
|
2902
3338
|
|
|
2903
3339
|
const pathUsage = new Map(); // Map<pathString, PathUsage>
|
|
2904
3340
|
const keyAnalysis = new Map(); // Map<basePath, {hasNumeric: boolean, hasString: boolean}>
|
|
3341
|
+
const numericIndicesByPath = new Map(); // Map<pathString, Set<number>> — indices under each parent path
|
|
2905
3342
|
const allEntries = [];
|
|
2906
3343
|
|
|
2907
3344
|
/**
|
|
@@ -2954,6 +3391,13 @@ const packFormToJSON = (form) => {
|
|
|
2954
3391
|
if (part.type === 'key') {
|
|
2955
3392
|
currentPath = currentPath ? `${currentPath}[${part.name}]` : part.name;
|
|
2956
3393
|
} else if (part.type === 'numeric') {
|
|
3394
|
+
const parentPath = currentPath;
|
|
3395
|
+
let set = numericIndicesByPath.get(parentPath);
|
|
3396
|
+
if (!set) {
|
|
3397
|
+
set = new Set();
|
|
3398
|
+
numericIndicesByPath.set(parentPath, set);
|
|
3399
|
+
}
|
|
3400
|
+
set.add(part.index);
|
|
2957
3401
|
currentPath = `${currentPath}[${part.index}]`;
|
|
2958
3402
|
} else if (part.type === 'array') {
|
|
2959
3403
|
currentPath = `${currentPath}[]`;
|
|
@@ -3044,6 +3488,34 @@ const packFormToJSON = (form) => {
|
|
|
3044
3488
|
return analysis?.hasNumeric && analysis?.hasString;
|
|
3045
3489
|
};
|
|
3046
3490
|
|
|
3491
|
+
/**
|
|
3492
|
+
* True if indices are exactly 0, 1, 2, ..., n (dense, sequential from 0).
|
|
3493
|
+
* @param {number[]} indices - Sorted array of indices
|
|
3494
|
+
* @returns {boolean}
|
|
3495
|
+
*/
|
|
3496
|
+
const isDenseSequential = (indices) => {
|
|
3497
|
+
if (indices.length === 0) return false;
|
|
3498
|
+
const sorted = [...indices].sort((a, b) => a - b);
|
|
3499
|
+
for (let j = 0; j < sorted.length; j++) {
|
|
3500
|
+
if (sorted[j] !== j) return false;
|
|
3501
|
+
}
|
|
3502
|
+
return true;
|
|
3503
|
+
};
|
|
3504
|
+
|
|
3505
|
+
/**
|
|
3506
|
+
* True if numeric keys under this path should be treated as array indices.
|
|
3507
|
+
* With numericKeysAlwaysArray: always true when path has numeric children.
|
|
3508
|
+
* Otherwise: true only when indices are dense 0..n.
|
|
3509
|
+
* @param {string} parentPath - Path to the container that has numeric children
|
|
3510
|
+
* @returns {boolean}
|
|
3511
|
+
*/
|
|
3512
|
+
const useArrayForNumericPath = (parentPath) => {
|
|
3513
|
+
const set = numericIndicesByPath.get(parentPath);
|
|
3514
|
+
if (!set || set.size === 0) return true;
|
|
3515
|
+
if (numericKeysAlwaysArray) return true;
|
|
3516
|
+
return isDenseSequential([...set]);
|
|
3517
|
+
};
|
|
3518
|
+
|
|
3047
3519
|
/**
|
|
3048
3520
|
* Convertit un tableau en objet en préservant les indices numériques comme propriétés
|
|
3049
3521
|
* @param {Array} arr - Le tableau à convertir
|
|
@@ -3139,8 +3611,9 @@ const packFormToJSON = (form) => {
|
|
|
3139
3611
|
* @param {*} value - La valeur à assigner
|
|
3140
3612
|
* @param {Object} parent - Le conteneur parent
|
|
3141
3613
|
* @param {string} basePath - Le chemin de base pour la détection de conflit
|
|
3614
|
+
* @param {string} parentPath - Chemin du conteneur actuel (pour heuristique numeric)
|
|
3142
3615
|
*/
|
|
3143
|
-
const processFinalValue = (container, part, value, parent, basePath) => {
|
|
3616
|
+
const processFinalValue = (container, part, value, parent, basePath, parentPath) => {
|
|
3144
3617
|
if (part.type === 'array') {
|
|
3145
3618
|
// Tableau explicite avec []
|
|
3146
3619
|
container[part.name] ??= [];
|
|
@@ -3150,13 +3623,18 @@ const packFormToJSON = (form) => {
|
|
|
3150
3623
|
container[part.name] = [container[part.name], value];
|
|
3151
3624
|
}
|
|
3152
3625
|
} else if (part.type === 'numeric') {
|
|
3153
|
-
// Indice numérique final
|
|
3154
3626
|
const { index } = part;
|
|
3155
|
-
|
|
3156
|
-
|
|
3157
|
-
container.
|
|
3627
|
+
const useArray = useArrayForNumericPath(parentPath);
|
|
3628
|
+
if (useArray) {
|
|
3629
|
+
container = ensureArray(container, parent.key, parent.container);
|
|
3630
|
+
while (container.length <= index) {
|
|
3631
|
+
container.push(undefined);
|
|
3632
|
+
}
|
|
3633
|
+
container[index] = value;
|
|
3634
|
+
} else {
|
|
3635
|
+
container = ensureObject(container, parent.key, parent.container, true);
|
|
3636
|
+
container[index] = value;
|
|
3158
3637
|
}
|
|
3159
|
-
container[index] = value;
|
|
3160
3638
|
} else {
|
|
3161
3639
|
// Clé simple finale
|
|
3162
3640
|
const conflict = hasConflict(basePath);
|
|
@@ -3202,16 +3680,14 @@ const packFormToJSON = (form) => {
|
|
|
3202
3680
|
*/
|
|
3203
3681
|
const processIntermediatePart = (container, part, nextPart, parent, basePath, parts, i, key) => {
|
|
3204
3682
|
if (part.type === 'numeric') {
|
|
3205
|
-
// Indice numérique : le container doit être un tableau ou un objet (selon conflit)
|
|
3206
3683
|
const { index } = part;
|
|
3207
|
-
const
|
|
3684
|
+
const parentPath = buildPathString(parts.slice(0, i));
|
|
3685
|
+
const useArray = useArrayForNumericPath(parentPath) && !hasConflict(basePath);
|
|
3208
3686
|
|
|
3209
|
-
if (
|
|
3210
|
-
// Conflit : utiliser un objet (les indices seront des propriétés)
|
|
3687
|
+
if (!useArray) {
|
|
3211
3688
|
container = ensureObject(container, parent.key, parent.container, true);
|
|
3212
3689
|
container[index] ??= {};
|
|
3213
3690
|
if (typeof container[index] !== 'object' || container[index] === null) {
|
|
3214
|
-
// Cette erreur ne devrait jamais se produire si la détection fonctionne correctement
|
|
3215
3691
|
const pathParts = parts.slice(0, i + 1);
|
|
3216
3692
|
const currentPath = buildPathString(pathParts);
|
|
3217
3693
|
throw new Error(
|
|
@@ -3221,14 +3697,12 @@ const packFormToJSON = (form) => {
|
|
|
3221
3697
|
);
|
|
3222
3698
|
}
|
|
3223
3699
|
} else {
|
|
3224
|
-
// Pas de conflit : utiliser un tableau
|
|
3225
3700
|
container = ensureArray(container, parent.key, parent.container);
|
|
3226
3701
|
while (container.length <= index) {
|
|
3227
3702
|
container.push(undefined);
|
|
3228
3703
|
}
|
|
3229
3704
|
container[index] ??= {};
|
|
3230
3705
|
if (typeof container[index] !== 'object' || container[index] === null) {
|
|
3231
|
-
// Cette erreur ne devrait jamais se produire si la détection fonctionne correctement
|
|
3232
3706
|
const pathParts = parts.slice(0, i + 1);
|
|
3233
3707
|
const currentPath = buildPathString(pathParts);
|
|
3234
3708
|
throw new Error(
|
|
@@ -3313,8 +3787,8 @@ const packFormToJSON = (form) => {
|
|
|
3313
3787
|
const parent = path[path.length - 1];
|
|
3314
3788
|
|
|
3315
3789
|
if (isLast) {
|
|
3316
|
-
|
|
3317
|
-
processFinalValue(container, part, value, parent, basePath);
|
|
3790
|
+
const parentPath = buildPathString(parts.slice(0, i));
|
|
3791
|
+
processFinalValue(container, part, value, parent, basePath, parentPath);
|
|
3318
3792
|
} else {
|
|
3319
3793
|
// Partie intermédiaire : créer la structure
|
|
3320
3794
|
const newContainer = processIntermediatePart(container, part, nextPart, parent, basePath, parts, i, key);
|
|
@@ -3416,177 +3890,298 @@ __webpack_require__.r(__webpack_exports__);
|
|
|
3416
3890
|
/* harmony export */ "default": () => (/* export default binding */ __WEBPACK_DEFAULT_EXPORT__)
|
|
3417
3891
|
/* harmony export */ });
|
|
3418
3892
|
/* harmony import */ var _css_tristate_css__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./css/tristate.css */ "./modules/tristate/css/tristate.css");
|
|
3419
|
-
|
|
3420
|
-
|
|
3421
|
-
/**
|
|
3422
|
-
* Creates a tri-state checkbox for each checkbox element in the apx.elements array.
|
|
3423
|
-
* @param {Array<HTMLElement>} apx - An array of HTMLElements which is returned by APX()
|
|
3424
|
-
* @example
|
|
3425
|
-
* // Call the tristate function on an array of checkbox elements
|
|
3426
|
-
* apx.tristate();
|
|
3427
|
-
*/
|
|
3428
|
-
/* harmony default export */ function __WEBPACK_DEFAULT_EXPORT__(apx) {
|
|
3429
|
-
apx.tristate = function (options = {}){
|
|
3430
|
-
apx.elements.forEach((element) => {
|
|
3431
|
-
if (element.type === 'checkbox') {
|
|
3432
|
-
const [originalCheckbox, tristateDom, hiddenInput] = createTriStateCheckbox(element,options);
|
|
3433
|
-
|
|
3434
|
-
if(options.callbacks && options.callbacks.after && typeof options.callbacks.after === 'function') {
|
|
3435
|
-
options.callbacks.after(originalCheckbox, tristateDom, hiddenInput);
|
|
3436
|
-
}
|
|
3437
|
-
}
|
|
3438
|
-
});
|
|
3439
|
-
|
|
3440
|
-
|
|
3441
|
-
|
|
3442
|
-
|
|
3443
|
-
|
|
3444
|
-
|
|
3445
|
-
|
|
3446
|
-
|
|
3447
|
-
|
|
3448
|
-
|
|
3449
|
-
|
|
3450
|
-
|
|
3451
|
-
|
|
3452
|
-
|
|
3453
|
-
|
|
3454
|
-
|
|
3455
|
-
|
|
3456
|
-
|
|
3457
|
-
|
|
3458
|
-
|
|
3459
|
-
}
|
|
3460
|
-
|
|
3461
|
-
|
|
3462
|
-
|
|
3463
|
-
|
|
3464
|
-
|
|
3465
|
-
const
|
|
3466
|
-
|
|
3467
|
-
|
|
3468
|
-
|
|
3469
|
-
|
|
3470
|
-
const
|
|
3471
|
-
|
|
3472
|
-
|
|
3473
|
-
|
|
3474
|
-
|
|
3475
|
-
|
|
3476
|
-
|
|
3477
|
-
|
|
3478
|
-
|
|
3479
|
-
|
|
3480
|
-
|
|
3481
|
-
|
|
3482
|
-
|
|
3483
|
-
|
|
3484
|
-
|
|
3485
|
-
|
|
3486
|
-
|
|
3487
|
-
|
|
3488
|
-
|
|
3489
|
-
|
|
3490
|
-
|
|
3491
|
-
|
|
3492
|
-
|
|
3493
|
-
|
|
3494
|
-
|
|
3495
|
-
|
|
3496
|
-
|
|
3497
|
-
|
|
3498
|
-
|
|
3499
|
-
|
|
3500
|
-
|
|
3501
|
-
|
|
3502
|
-
|
|
3503
|
-
|
|
3504
|
-
|
|
3505
|
-
|
|
3506
|
-
|
|
3507
|
-
|
|
3508
|
-
|
|
3509
|
-
|
|
3510
|
-
|
|
3511
|
-
|
|
3512
|
-
|
|
3513
|
-
|
|
3514
|
-
|
|
3515
|
-
|
|
3516
|
-
|
|
3517
|
-
|
|
3518
|
-
|
|
3519
|
-
|
|
3520
|
-
|
|
3521
|
-
|
|
3522
|
-
|
|
3523
|
-
|
|
3524
|
-
|
|
3525
|
-
|
|
3526
|
-
|
|
3527
|
-
|
|
3528
|
-
|
|
3529
|
-
if (
|
|
3530
|
-
|
|
3531
|
-
|
|
3532
|
-
|
|
3533
|
-
}
|
|
3534
|
-
|
|
3535
|
-
|
|
3536
|
-
|
|
3537
|
-
|
|
3538
|
-
hiddenInput.removeAttribute('
|
|
3539
|
-
|
|
3540
|
-
|
|
3541
|
-
|
|
3542
|
-
|
|
3543
|
-
|
|
3544
|
-
|
|
3545
|
-
|
|
3546
|
-
|
|
3547
|
-
|
|
3548
|
-
|
|
3549
|
-
|
|
3550
|
-
|
|
3551
|
-
|
|
3552
|
-
|
|
3553
|
-
|
|
3554
|
-
|
|
3555
|
-
|
|
3556
|
-
|
|
3557
|
-
|
|
3558
|
-
|
|
3559
|
-
|
|
3560
|
-
|
|
3561
|
-
}
|
|
3562
|
-
|
|
3563
|
-
|
|
3564
|
-
|
|
3565
|
-
|
|
3566
|
-
//
|
|
3567
|
-
|
|
3568
|
-
|
|
3569
|
-
|
|
3570
|
-
|
|
3571
|
-
|
|
3572
|
-
|
|
3573
|
-
|
|
3574
|
-
|
|
3575
|
-
|
|
3576
|
-
|
|
3577
|
-
|
|
3578
|
-
|
|
3579
|
-
|
|
3580
|
-
|
|
3581
|
-
|
|
3582
|
-
|
|
3583
|
-
|
|
3584
|
-
|
|
3585
|
-
|
|
3586
|
-
|
|
3587
|
-
|
|
3588
|
-
|
|
3589
|
-
}
|
|
3893
|
+
|
|
3894
|
+
|
|
3895
|
+
/**
|
|
3896
|
+
* Creates a tri-state checkbox for each checkbox element in the apx.elements array.
|
|
3897
|
+
* @param {Array<HTMLElement>} apx - An array of HTMLElements which is returned by APX()
|
|
3898
|
+
* @example
|
|
3899
|
+
* // Call the tristate function on an array of checkbox elements
|
|
3900
|
+
* apx.tristate();
|
|
3901
|
+
*/
|
|
3902
|
+
/* harmony default export */ function __WEBPACK_DEFAULT_EXPORT__(apx) {
|
|
3903
|
+
apx.tristate = function (options = {}){
|
|
3904
|
+
apx.elements.forEach((element) => {
|
|
3905
|
+
if (element.type === 'checkbox') {
|
|
3906
|
+
const [originalCheckbox, tristateDom, hiddenInput] = createTriStateCheckbox(element, options);
|
|
3907
|
+
originalCheckbox._apxTristate = { dom: tristateDom, hiddenInput };
|
|
3908
|
+
if (options.callbacks && options.callbacks.after && typeof options.callbacks.after === 'function') {
|
|
3909
|
+
options.callbacks.after(originalCheckbox, tristateDom, hiddenInput);
|
|
3910
|
+
}
|
|
3911
|
+
}
|
|
3912
|
+
});
|
|
3913
|
+
return {
|
|
3914
|
+
setChildren(childrenApx) {
|
|
3915
|
+
return setChildren(apx, childrenApx, options);
|
|
3916
|
+
}
|
|
3917
|
+
};
|
|
3918
|
+
};
|
|
3919
|
+
}
|
|
3920
|
+
|
|
3921
|
+
/**
|
|
3922
|
+
* Link parent tristate(s) to child checkboxes. When exactly one parent: that parent gets
|
|
3923
|
+
* indeterminate-dash automatically and shows dash when children are mixed; click parent to apply its state to all children.
|
|
3924
|
+
* @param {Object} parentApx - APX instance whose elements are the parent checkbox(es)
|
|
3925
|
+
* @param {Object} childrenApx - APX instance whose elements are the child checkbox(es)
|
|
3926
|
+
* @param {Object} options - Options used for the parent (and applied to children when initializing them)
|
|
3927
|
+
*/
|
|
3928
|
+
function setChildren(parentApx, childrenApx, options) {
|
|
3929
|
+
const parents = parentApx.all().filter((el) => el.type === 'checkbox');
|
|
3930
|
+
if (parents.length === 0) return;
|
|
3931
|
+
if (parents.length > 1) {
|
|
3932
|
+
console.warn('APX tristate setChildren: only the first parent is linked to all children.');
|
|
3933
|
+
}
|
|
3934
|
+
const parentCheckbox = parents[0];
|
|
3935
|
+
const parentRef = parentCheckbox._apxTristate;
|
|
3936
|
+
if (!parentRef) return;
|
|
3937
|
+
|
|
3938
|
+
const parentDom = parentRef.dom;
|
|
3939
|
+
const parentHiddenInput = parentRef.hiddenInput;
|
|
3940
|
+
|
|
3941
|
+
// Automatically enable indeterminate (dash) on parent when it has children: dash shows only when children are mixed (--mixed)
|
|
3942
|
+
parentDom.classList.add('apx-tristate--unchecked-indeterminate', 'apx-tristate--indeterminate-dash');
|
|
3943
|
+
|
|
3944
|
+
const childCheckboxes = childrenApx.all().filter((el) => el.type === 'checkbox');
|
|
3945
|
+
const childRefs = [];
|
|
3946
|
+
|
|
3947
|
+
function syncParentFromChildren() {
|
|
3948
|
+
if (childRefs.length === 0) return;
|
|
3949
|
+
const states = childRefs.map((ref) => getTristateState(ref.dom));
|
|
3950
|
+
const allChecked = states.every((s) => s === 'checked');
|
|
3951
|
+
const allCrossed = states.every((s) => s === 'crossed');
|
|
3952
|
+
const allUnchecked = states.every((s) => s === 'unchecked');
|
|
3953
|
+
const mixed = !allChecked && !allCrossed && !allUnchecked;
|
|
3954
|
+
|
|
3955
|
+
parentDom.classList.remove('unchecked', 'checked', 'crossed');
|
|
3956
|
+
if (mixed) parentDom.classList.add('apx-tristate--mixed');
|
|
3957
|
+
else parentDom.classList.remove('apx-tristate--mixed');
|
|
3958
|
+
|
|
3959
|
+
if (allChecked) {
|
|
3960
|
+
parentDom.classList.add('checked');
|
|
3961
|
+
parentHiddenInput.value = 'true';
|
|
3962
|
+
} else if (allCrossed) {
|
|
3963
|
+
parentDom.classList.add('crossed');
|
|
3964
|
+
parentHiddenInput.value = 'false';
|
|
3965
|
+
} else {
|
|
3966
|
+
parentDom.classList.add('unchecked');
|
|
3967
|
+
parentHiddenInput.removeAttribute('name');
|
|
3968
|
+
parentHiddenInput.removeAttribute('value');
|
|
3969
|
+
}
|
|
3970
|
+
}
|
|
3971
|
+
|
|
3972
|
+
function applyParentToChildren() {
|
|
3973
|
+
const parentState = getTristateState(parentDom);
|
|
3974
|
+
childRefs.forEach((ref) => setTristateState(ref.checkbox, ref.dom, ref.hiddenInput, parentState));
|
|
3975
|
+
}
|
|
3976
|
+
|
|
3977
|
+
const childOptions = {
|
|
3978
|
+
...options,
|
|
3979
|
+
callbacks: {
|
|
3980
|
+
after(checkbox, dom, hiddenInput) {
|
|
3981
|
+
childRefs.push({ checkbox, dom, hiddenInput });
|
|
3982
|
+
},
|
|
3983
|
+
change: syncParentFromChildren
|
|
3984
|
+
}
|
|
3985
|
+
};
|
|
3986
|
+
|
|
3987
|
+
childrenApx.tristate(childOptions);
|
|
3988
|
+
|
|
3989
|
+
syncParentFromChildren();
|
|
3990
|
+
parentDom.addEventListener('click', () => setTimeout(applyParentToChildren, 0));
|
|
3991
|
+
}
|
|
3992
|
+
|
|
3993
|
+
function getTristateState(dom) {
|
|
3994
|
+
if (dom.classList.contains('checked')) return 'checked';
|
|
3995
|
+
if (dom.classList.contains('crossed')) return 'crossed';
|
|
3996
|
+
return 'unchecked';
|
|
3997
|
+
}
|
|
3998
|
+
|
|
3999
|
+
function setTristateState(checkbox, dom, hiddenInput, state) {
|
|
4000
|
+
dom.classList.remove('unchecked', 'checked', 'crossed');
|
|
4001
|
+
dom.classList.add(state);
|
|
4002
|
+
const name = checkbox.dataset.name || checkbox.getAttribute('data-name') || checkbox.name || '';
|
|
4003
|
+
if (state === 'checked') {
|
|
4004
|
+
hiddenInput.value = 'true';
|
|
4005
|
+
if (name) hiddenInput.setAttribute('name', name);
|
|
4006
|
+
checkbox.checked = true;
|
|
4007
|
+
} else if (state === 'crossed') {
|
|
4008
|
+
hiddenInput.value = 'false';
|
|
4009
|
+
if (name) hiddenInput.setAttribute('name', name);
|
|
4010
|
+
checkbox.checked = false;
|
|
4011
|
+
} else {
|
|
4012
|
+
hiddenInput.removeAttribute('name');
|
|
4013
|
+
hiddenInput.removeAttribute('value');
|
|
4014
|
+
checkbox.checked = false;
|
|
4015
|
+
}
|
|
4016
|
+
}
|
|
4017
|
+
|
|
4018
|
+
function toggleTriStateCheckboxState(customCheckbox, actualCheckbox, hiddenInput) {
|
|
4019
|
+
const wasChecked = customCheckbox.classList.contains('checked');
|
|
4020
|
+
const wasCrossed = customCheckbox.classList.contains('crossed');
|
|
4021
|
+
customCheckbox.classList.remove('unchecked', 'checked', 'crossed');
|
|
4022
|
+
if (wasChecked) {
|
|
4023
|
+
customCheckbox.classList.add('crossed');
|
|
4024
|
+
actualCheckbox.checked = false;
|
|
4025
|
+
hiddenInput.value = 'false';
|
|
4026
|
+
} else if (wasCrossed) {
|
|
4027
|
+
customCheckbox.classList.add('unchecked');
|
|
4028
|
+
hiddenInput.removeAttribute('name'); // Ensure the hidden input doesn't post any value
|
|
4029
|
+
hiddenInput.removeAttribute('value'); // Ensure the hidden input doesn't post any value
|
|
4030
|
+
} else {
|
|
4031
|
+
customCheckbox.classList.add('checked');
|
|
4032
|
+
actualCheckbox.checked = true;
|
|
4033
|
+
hiddenInput.value = 'true';
|
|
4034
|
+
hiddenInput.setAttribute('name', actualCheckbox.dataset.name); // Restore the name for posting
|
|
4035
|
+
}
|
|
4036
|
+
}
|
|
4037
|
+
|
|
4038
|
+
function createTriStateCheckbox(checkboxElement, options) {
|
|
4039
|
+
|
|
4040
|
+
//get the checkbox margins including browser default
|
|
4041
|
+
const checkboxStyle = window.getComputedStyle(checkboxElement);
|
|
4042
|
+
// Hide the original checkbox
|
|
4043
|
+
checkboxElement.style.display = 'none';
|
|
4044
|
+
|
|
4045
|
+
// Create the custom checkbox div and set its initial state
|
|
4046
|
+
const tristateDom = document.createElement('div');
|
|
4047
|
+
tristateDom.classList.add('apx-tristate');
|
|
4048
|
+
if (options.size) {
|
|
4049
|
+
if (options.size.width != null) {
|
|
4050
|
+
const w = options.size.width;
|
|
4051
|
+
if (typeof w !== 'number' && typeof w !== 'string') {
|
|
4052
|
+
throw new TypeError('tristate size.width must be a number (px) or a string (CSS length).');
|
|
4053
|
+
}
|
|
4054
|
+
tristateDom.style.width = typeof w === 'number' ? w + 'px' : String(w);
|
|
4055
|
+
}
|
|
4056
|
+
if (options.size.height != null) {
|
|
4057
|
+
const h = options.size.height;
|
|
4058
|
+
if (typeof h !== 'number' && typeof h !== 'string') {
|
|
4059
|
+
throw new TypeError('tristate size.height must be a number (px) or a string (CSS length).');
|
|
4060
|
+
}
|
|
4061
|
+
tristateDom.style.height = typeof h === 'number' ? h + 'px' : String(h);
|
|
4062
|
+
}
|
|
4063
|
+
}
|
|
4064
|
+
if(options.classes) tristateDom.classList.add(...computeClasses(options.classes));
|
|
4065
|
+
const colors = resolveColors(options);
|
|
4066
|
+
if (colors.tick != null) tristateDom.style.setProperty('--apx-tristate-tick-color', String(colors.tick));
|
|
4067
|
+
if (colors.checked != null) tristateDom.style.setProperty('--apx-tristate-checked-color', String(colors.checked));
|
|
4068
|
+
if (colors.crossed != null) tristateDom.style.setProperty('--apx-tristate-crossed-color', String(colors.crossed));
|
|
4069
|
+
|
|
4070
|
+
tristateDom.style.margin = checkboxStyle.margin;
|
|
4071
|
+
|
|
4072
|
+
if (checkboxElement.checked) {
|
|
4073
|
+
tristateDom.classList.add('checked');
|
|
4074
|
+
} else {
|
|
4075
|
+
tristateDom.classList.add('unchecked');
|
|
4076
|
+
}
|
|
4077
|
+
|
|
4078
|
+
// Create the hidden input field
|
|
4079
|
+
const hiddenInput = document.createElement('input');
|
|
4080
|
+
hiddenInput.type = 'hidden';
|
|
4081
|
+
hiddenInput.name = checkboxElement.name; // Copy the name from the original checkbox
|
|
4082
|
+
checkboxElement.dataset.name = checkboxElement.name; // Store the name in a data attribute for later use
|
|
4083
|
+
checkboxElement.removeAttribute('name'); // Remove the name from the original checkbox to avoid double posting
|
|
4084
|
+
|
|
4085
|
+
if (options.defaultState) setDefaultState(options, tristateDom, hiddenInput);
|
|
4086
|
+
else{
|
|
4087
|
+
// Set the initial value for the hidden input based on the checkbox's state
|
|
4088
|
+
if (checkboxElement.checked) {
|
|
4089
|
+
hiddenInput.value = 'true';
|
|
4090
|
+
} else {
|
|
4091
|
+
hiddenInput.name = ''; // Ensure the hidden input doesn't post any value
|
|
4092
|
+
hiddenInput.value = '';
|
|
4093
|
+
}
|
|
4094
|
+
}
|
|
4095
|
+
|
|
4096
|
+
//handle accessibility, set the tabindex to the same as the checkbox
|
|
4097
|
+
tristateDom.tabIndex = checkboxElement.tabIndex;
|
|
4098
|
+
|
|
4099
|
+
// Insert the hidden input inside the custom checkbox div
|
|
4100
|
+
tristateDom.appendChild(hiddenInput);
|
|
4101
|
+
|
|
4102
|
+
// Insert it next to the actual checkbox
|
|
4103
|
+
checkboxElement.parentNode.insertBefore(tristateDom, checkboxElement.nextSibling);
|
|
4104
|
+
|
|
4105
|
+
// Add event listener
|
|
4106
|
+
tristateDom.addEventListener('click', function (e) {
|
|
4107
|
+
toggleTriStateCheckboxState(tristateDom, checkboxElement, hiddenInput);
|
|
4108
|
+
bubbleEventsToOriginalCheckbox(options, checkboxElement, tristateDom, hiddenInput, e);
|
|
4109
|
+
});
|
|
4110
|
+
tristateDom.addEventListener('keyup', onkeyup.bind(null, checkboxElement));
|
|
4111
|
+
|
|
4112
|
+
return [checkboxElement, tristateDom, hiddenInput];
|
|
4113
|
+
}
|
|
4114
|
+
|
|
4115
|
+
function setDefaultState(options, tristateDom, hiddenInput) {
|
|
4116
|
+
// Ensure only one state class is set (uncheckedAppearance modifiers must not affect checked/crossed)
|
|
4117
|
+
tristateDom.classList.remove('unchecked', 'checked', 'crossed');
|
|
4118
|
+
if (options.defaultState === 'checked') {
|
|
4119
|
+
tristateDom.classList.add('checked');
|
|
4120
|
+
hiddenInput.value = 'true';
|
|
4121
|
+
}
|
|
4122
|
+
else if (options.defaultState === 'unchecked') {
|
|
4123
|
+
tristateDom.classList.add('unchecked');
|
|
4124
|
+
hiddenInput.removeAttribute('name'); // Ensure the hidden input doesn't post any value
|
|
4125
|
+
hiddenInput.removeAttribute('value'); // Ensure the hidden input doesn't post any value
|
|
4126
|
+
}
|
|
4127
|
+
else if (options.defaultState === 'crossed') {
|
|
4128
|
+
tristateDom.classList.add('crossed');
|
|
4129
|
+
hiddenInput.value = 'false';
|
|
4130
|
+
}
|
|
4131
|
+
}
|
|
4132
|
+
|
|
4133
|
+
function computeClasses(classes) {
|
|
4134
|
+
let computedClasses = [];
|
|
4135
|
+
if(typeof classes === 'string') {
|
|
4136
|
+
//replace multiple white spaces with a single space
|
|
4137
|
+
classes = classes.replace(/\s\s+/g, ' ');
|
|
4138
|
+
if(classes.indexOf(' ') > -1)
|
|
4139
|
+
computedClasses = classes.split(' ');
|
|
4140
|
+
else if(classes.indexOf(',') > -1)
|
|
4141
|
+
computedClasses = classes.split(',');
|
|
4142
|
+
else
|
|
4143
|
+
computedClasses = [classes];
|
|
4144
|
+
}
|
|
4145
|
+
else if(Array.isArray(classes)) {
|
|
4146
|
+
computedClasses = classes;
|
|
4147
|
+
}
|
|
4148
|
+
return computedClasses;
|
|
4149
|
+
}
|
|
4150
|
+
|
|
4151
|
+
function resolveColors(options) {
|
|
4152
|
+
const c = options.colors || {};
|
|
4153
|
+
return {
|
|
4154
|
+
tick: c.tick != null ? c.tick : options.tickColor,
|
|
4155
|
+
checked: c.checked != null ? c.checked : options.checkedColor,
|
|
4156
|
+
crossed: c.crossed != null ? c.crossed : options.crossedColor
|
|
4157
|
+
};
|
|
4158
|
+
}
|
|
4159
|
+
|
|
4160
|
+
function bubbleEventsToOriginalCheckbox(options, checkboxElement, tristateDom, hiddenInput, event) {
|
|
4161
|
+
//if options.callbacks.change is set, call it
|
|
4162
|
+
if(options.callbacks && options.callbacks.change && typeof options.callbacks.change === 'function') {
|
|
4163
|
+
options.callbacks.change(checkboxElement, tristateDom, hiddenInput);
|
|
4164
|
+
}
|
|
4165
|
+
|
|
4166
|
+
if(!options.bubbleEvents) return;
|
|
4167
|
+
|
|
4168
|
+
if(event.type === 'click') {
|
|
4169
|
+
checkboxElement.dispatchEvent(new MouseEvent('click', { bubbles: true, cancelable: true }));
|
|
4170
|
+
}
|
|
4171
|
+
else if(event.type === 'keyup') {
|
|
4172
|
+
checkboxElement.dispatchEvent(new KeyboardEvent('keyup', { key: ' ', bubbles: true, cancelable: true }));
|
|
4173
|
+
}
|
|
4174
|
+
else if(event.type === 'change') {
|
|
4175
|
+
checkboxElement.dispatchEvent(new Event('change', { bubbles: true, cancelable: true }));
|
|
4176
|
+
}
|
|
4177
|
+
}
|
|
4178
|
+
|
|
4179
|
+
function onkeyup(checkboxElement, event) {
|
|
4180
|
+
if (event.keyCode === 32) {
|
|
4181
|
+
bubbleEventsToOriginalCheckbox(checkboxElement, event);
|
|
4182
|
+
event.preventDefault();
|
|
4183
|
+
event.target.click();
|
|
4184
|
+
}
|
|
3590
4185
|
}
|
|
3591
4186
|
|
|
3592
4187
|
/***/ })
|
|
@@ -3705,10 +4300,12 @@ __webpack_require__.r(__webpack_exports__);
|
|
|
3705
4300
|
/* harmony export */ });
|
|
3706
4301
|
/* harmony import */ var _modules_listen_listen_mjs__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./modules/listen/listen.mjs */ "./modules/listen/listen.mjs");
|
|
3707
4302
|
/* harmony import */ var _modules_tristate_tristate_mjs__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./modules/tristate/tristate.mjs */ "./modules/tristate/tristate.mjs");
|
|
3708
|
-
/* harmony import */ var
|
|
3709
|
-
/* harmony import */ var
|
|
3710
|
-
/* harmony import */ var
|
|
3711
|
-
/* harmony import */ var
|
|
4303
|
+
/* harmony import */ var _modules_scrollableTable_scrollableTable_mjs__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./modules/scrollableTable/scrollableTable.mjs */ "./modules/scrollableTable/scrollableTable.mjs");
|
|
4304
|
+
/* harmony import */ var _modules_dialog_dialog_mjs__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./modules/dialog/dialog.mjs */ "./modules/dialog/dialog.mjs");
|
|
4305
|
+
/* harmony import */ var _modules_toast_toast_mjs__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./modules/toast/toast.mjs */ "./modules/toast/toast.mjs");
|
|
4306
|
+
/* harmony import */ var _modules_common_mjs__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./modules/common.mjs */ "./modules/common.mjs");
|
|
4307
|
+
/* harmony import */ var _modules_tools_exports_mjs__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./modules/tools/exports.mjs */ "./modules/tools/exports.mjs");
|
|
4308
|
+
|
|
3712
4309
|
|
|
3713
4310
|
|
|
3714
4311
|
|
|
@@ -3815,14 +4412,15 @@ const APX = function (input, context = document) {
|
|
|
3815
4412
|
};
|
|
3816
4413
|
(0,_modules_listen_listen_mjs__WEBPACK_IMPORTED_MODULE_0__["default"])(apx);
|
|
3817
4414
|
(0,_modules_tristate_tristate_mjs__WEBPACK_IMPORTED_MODULE_1__["default"])(apx);
|
|
3818
|
-
(0,
|
|
4415
|
+
(0,_modules_scrollableTable_scrollableTable_mjs__WEBPACK_IMPORTED_MODULE_2__["default"])(apx);
|
|
4416
|
+
(0,_modules_tools_exports_mjs__WEBPACK_IMPORTED_MODULE_6__.augmentWithPack)(apx);
|
|
3819
4417
|
return apx;
|
|
3820
4418
|
};
|
|
3821
4419
|
|
|
3822
|
-
APX.loadCss =
|
|
3823
|
-
APX.dialog =
|
|
3824
|
-
APX.toast =
|
|
3825
|
-
APX.tools =
|
|
4420
|
+
APX.loadCss = _modules_common_mjs__WEBPACK_IMPORTED_MODULE_5__.loadCss;
|
|
4421
|
+
APX.dialog = _modules_dialog_dialog_mjs__WEBPACK_IMPORTED_MODULE_3__["default"];
|
|
4422
|
+
APX.toast = _modules_toast_toast_mjs__WEBPACK_IMPORTED_MODULE_4__["default"];
|
|
4423
|
+
APX.tools = _modules_tools_exports_mjs__WEBPACK_IMPORTED_MODULE_6__.tools;
|
|
3826
4424
|
APX.isAPXObject = function (obj) {
|
|
3827
4425
|
return obj && obj._isAPXObject === true;
|
|
3828
4426
|
}
|
|
@@ -3836,4 +4434,4 @@ APX.is_numeric = (n) => {
|
|
|
3836
4434
|
var __webpack_exports__default = __webpack_exports__["default"];
|
|
3837
4435
|
export { __webpack_exports__default as default };
|
|
3838
4436
|
|
|
3839
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,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SUFBSSwyRUFBZTtBQUNuQjtBQUNBOztBQUVBLGNBQWMsd0RBQU87QUFDckIsYUFBYSxrRUFBTTtBQUNuQixZQUFZLGdFQUFLO0FBQ2pCLFlBQVksNkRBQUs7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLGlFQUFlLEdBQUcsRSIsInNvdXJjZXMiOlsid2VicGFjazovL0BhcHBpdXMtZnIvYXB4Ly4vbW9kdWxlcy9kaWFsb2cvY3NzL2RpYWxvZy5jc3MiLCJ3ZWJwYWNrOi8vQGFwcGl1cy1mci9hcHgvLi9tb2R1bGVzL3RvYXN0L2Nzcy90b2FzdC5jc3MiLCJ3ZWJwYWNrOi8vQGFwcGl1cy1mci9hcHgvLi9tb2R1bGVzL3RyaXN0YXRlL2Nzcy90cmlzdGF0ZS5jc3MiLCJ3ZWJwYWNrOi8vQGFwcGl1cy1mci9hcHgvLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L3J1bnRpbWUvYXBpLmpzIiwid2VicGFjazovL0BhcHBpdXMtZnIvYXB4Ly4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL2dldFVybC5qcyIsIndlYnBhY2s6Ly9AYXBwaXVzLWZyL2FweC8uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9zb3VyY2VNYXBzLmpzIiwid2VicGFjazovL0BhcHBpdXMtZnIvYXB4Ly4vbW9kdWxlcy9kaWFsb2cvaHRtbC9kaWFsb2cuaHRtbCIsIndlYnBhY2s6Ly9AYXBwaXVzLWZyL2FweC8uL21vZHVsZXMvZGlhbG9nL2Nzcy9kaWFsb2cuY3NzP2E1NjciLCJ3ZWJwYWNrOi8vQGFwcGl1cy1mci9hcHgvLi9tb2R1bGVzL3RvYXN0L2Nzcy90b2FzdC5jc3M/OGE0OCIsIndlYnBhY2s6Ly9AYXBwaXVzLWZyL2FweC8uL21vZHVsZXMvdHJpc3RhdGUvY3NzL3RyaXN0YXRlLmNzcz9hMDk0Iiwid2VicGFjazovL0BhcHBpdXMtZnIvYXB4Ly4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5qZWN0U3R5bGVzSW50b1N0eWxlVGFnLmpzIiwid2VicGFjazovL0BhcHBpdXMtZnIvYXB4Ly4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5zZXJ0QnlTZWxlY3Rvci5qcyIsIndlYnBhY2s6Ly9AYXBwaXVzLWZyL2FweC8uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luc2VydFN0eWxlRWxlbWVudC5qcyIsIndlYnBhY2s6Ly9AYXBwaXVzLWZyL2FweC8uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL3NldEF0dHJpYnV0ZXNXaXRob3V0QXR0cmlidXRlcy5qcyIsIndlYnBhY2s6Ly9AYXBwaXVzLWZyL2FweC8uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL3N0eWxlRG9tQVBJLmpzIiwid2VicGFjazovL0BhcHBpdXMtZnIvYXB4Ly4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvc3R5bGVUYWdUcmFuc2Zvcm0uanMiLCJ3ZWJwYWNrOi8vQGFwcGl1cy1mci9hcHgvLi9tb2R1bGVzL2NvbW1vbi5tanMiLCJ3ZWJwYWNrOi8vQGFwcGl1cy1mci9hcHgvLi9tb2R1bGVzL2RpYWxvZy9kaWFsb2cubWpzIiwid2VicGFjazovL0BhcHBpdXMtZnIvYXB4Ly4vbW9kdWxlcy9saXN0ZW4vbGlzdGVuLm1qcyIsIndlYnBhY2s6Ly9AYXBwaXVzLWZyL2FweC8uL21vZHVsZXMvdG9hc3QvdG9hc3QubWpzIiwid2VicGFjazovL0BhcHBpdXMtZnIvYXB4Ly4vbW9kdWxlcy90b29scy9leHBvcnRzLm1qcyIsIndlYnBhY2s6Ly9AYXBwaXVzLWZyL2FweC8uL21vZHVsZXMvdG9vbHMvZm9ybS1wYWNrZXIvYXVnbWVudC1hcHgubWpzIiwid2VicGFjazovL0BhcHBpdXMtZnIvYXB4Ly4vbW9kdWxlcy90b29scy9mb3JtLXBhY2tlci9wYWNrVG9Kc29uLm1qcyIsIndlYnBhY2s6Ly9AYXBwaXVzLWZyL2FweC8uL21vZHVsZXMvdHJpc3RhdGUvdHJpc3RhdGUubWpzIiwid2VicGFjazovL0BhcHBpdXMtZnIvYXB4L3dlYnBhY2svYm9vdHN0cmFwIiwid2VicGFjazovL0BhcHBpdXMtZnIvYXB4L3dlYnBhY2svcnVudGltZS9jb21wYXQgZ2V0IGRlZmF1bHQgZXhwb3J0Iiwid2VicGFjazovL0BhcHBpdXMtZnIvYXB4L3dlYnBhY2svcnVudGltZS9kZWZpbmUgcHJvcGVydHkgZ2V0dGVycyIsIndlYnBhY2s6Ly9AYXBwaXVzLWZyL2FweC93ZWJwYWNrL3J1bnRpbWUvaGFzT3duUHJvcGVydHkgc2hvcnRoYW5kIiwid2VicGFjazovL0BhcHBpdXMtZnIvYXB4L3dlYnBhY2svcnVudGltZS9tYWtlIG5hbWVzcGFjZSBvYmplY3QiLCJ3ZWJwYWNrOi8vQGFwcGl1cy1mci9hcHgvd2VicGFjay9ydW50aW1lL2pzb25wIGNodW5rIGxvYWRpbmciLCJ3ZWJwYWNrOi8vQGFwcGl1cy1mci9hcHgvd2VicGFjay9ydW50aW1lL25vbmNlIiwid2VicGFjazovL0BhcHBpdXMtZnIvYXB4Ly4vQVBYLm1qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBJbXBvcnRzXG5pbXBvcnQgX19fQ1NTX0xPQURFUl9BUElfU09VUkNFTUFQX0lNUE9SVF9fXyBmcm9tIFwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL3NvdXJjZU1hcHMuanNcIjtcbmltcG9ydCBfX19DU1NfTE9BREVSX0FQSV9JTVBPUlRfX18gZnJvbSBcIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9hcGkuanNcIjtcbnZhciBfX19DU1NfTE9BREVSX0VYUE9SVF9fXyA9IF9fX0NTU19MT0FERVJfQVBJX0lNUE9SVF9fXyhfX19DU1NfTE9BREVSX0FQSV9TT1VSQ0VNQVBfSU1QT1JUX19fKTtcbi8vIE1vZHVsZVxuX19fQ1NTX0xPQURFUl9FWFBPUlRfX18ucHVzaChbbW9kdWxlLmlkLCBgLyogRGlhbG9nIHN0eWxpbmcgKi9cclxuLkFQWC1kaWFsb2cge1xyXG4gICAgZGlzcGxheTogbm9uZTtcclxuICAgIHBvc2l0aW9uOiBmaXhlZDtcclxuICAgIHotaW5kZXg6IDEwMDI7XHJcbiAgICBsZWZ0OiAwO1xyXG4gICAgdG9wOiAwO1xyXG4gICAgd2lkdGg6IDEwMCU7XHJcbiAgICBoZWlnaHQ6IDEwMCU7XHJcbiAgICBvdmVyZmxvdzogYXV0bztcclxuICAgIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMCwgMCwgMCwgMC40KTtcclxuICAgIC8qIERpbW1lZCBiYWNrZ3JvdW5kIGZvciBmb2N1cyBvbiBkaWFsb2cgKi9cclxufVxyXG5cclxuLkFQWC1kaWFsb2ctY29udGVudCB7XHJcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmVmZWZlO1xyXG4gICAgcGFkZGluZzogNDBweDtcclxuICAgIGJvcmRlcjogbm9uZTtcclxuICAgIHdpZHRoOiBhdXRvO1xyXG4gICAgbWluLXdpZHRoOiAzMDBweDtcclxuICAgIG1heC13aWR0aDogODAlO1xyXG4gICAgbWFyZ2luOiBhdXRvO1xyXG4gICAgYm9yZGVyLXJhZGl1czogOHB4O1xyXG4gICAgYm94LXNoYWRvdzogMHB4IDZweCAyMHB4IHJnYmEoMCwgMCwgMCwgMC4xKTtcclxuICAgIGZvbnQtZmFtaWx5OiAnSGVsdmV0aWNhIE5ldWUnLCBBcmlhbCwgc2Fucy1zZXJpZjtcclxufVxyXG5cclxuaDIuQVBYLWRpYWxvZy10aXRsZXtcclxuICAgIG1hcmdpbi10b3A6MDtcclxufVxyXG5cclxuLkFQWC1jbG9zZS1kaWFsb2cge1xyXG4gICAgY29sb3I6ICNhYWE7XHJcbiAgICBmbG9hdDogcmlnaHQ7XHJcbiAgICBmb250LXNpemU6IDI0cHg7XHJcbiAgICBtYXJnaW4tdG9wOiAtMTBweDtcclxuICAgIC8qIEFkanVzdCBwb3NpdGlvbmluZyAqL1xyXG4gICAgbWFyZ2luLXJpZ2h0OiAtMTBweDtcclxufVxyXG5cclxuLkFQWC1jbG9zZS1kaWFsb2c6aG92ZXIsXHJcbi5BUFgtY2xvc2UtZGlhbG9nOmZvY3VzIHtcclxuICAgIGNvbG9yOiAjMzMzO1xyXG4gICAgLyogRGFya2VyIGNvbG9yIG9uIGhvdmVyL2ZvY3VzICovXHJcbiAgICBjdXJzb3I6IHBvaW50ZXI7XHJcbn1cclxuXHJcbi8qIElucHV0IGZpZWxkcyBzdHlsaW5nICovXHJcbi5BUFgtZGlhbG9nLWNvbnRlbnQgaW5wdXRbdHlwZT1cInRleHRcIl0sXHJcbi5BUFgtZGlhbG9nLWNvbnRlbnQgaW5wdXRbdHlwZT1cIm51bWJlclwiXSxcclxuLkFQWC1kaWFsb2ctY29udGVudCBpbnB1dFt0eXBlPVwiZGF0ZVwiXSxcclxuLkFQWC1kaWFsb2ctY29udGVudCBpbnB1dFt0eXBlPVwiZGF0ZXRpbWUtbG9jYWxcIl0ge1xyXG4gICAgd2lkdGg6IDEwMCU7XHJcbiAgICBwYWRkaW5nOiAxMHB4O1xyXG4gICAgbWFyZ2luLWJvdHRvbTogMjBweDtcclxuICAgIGJvcmRlcjogMXB4IHNvbGlkICNjY2M7XHJcbiAgICBib3JkZXItcmFkaXVzOiA0cHg7XHJcbiAgICBmb250LWZhbWlseTogJ0hlbHZldGljYSBOZXVlJywgQXJpYWwsIHNhbnMtc2VyaWY7XHJcbiAgICBmb250LXNpemU6IDE2cHg7XHJcbiAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xyXG4gICAgdHJhbnNpdGlvbjogYm9yZGVyLWNvbG9yIDAuM3M7XHJcbn1cclxuXHJcbi5BUFgtZGlhbG9nLWNvbnRlbnQgaW5wdXRbdHlwZT1cInRleHRcIl06Zm9jdXMsXHJcbi5BUFgtZGlhbG9nLWNvbnRlbnQgaW5wdXRbdHlwZT1cIm51bWJlclwiXTpmb2N1cyxcclxuLkFQWC1kaWFsb2ctY29udGVudCBpbnB1dFt0eXBlPVwiZGF0ZVwiXTpmb2N1cyxcclxuLkFQWC1kaWFsb2ctY29udGVudCBpbnB1dFt0eXBlPVwiZGF0ZXRpbWUtbG9jYWxcIl06Zm9jdXMge1xyXG4gICAgYm9yZGVyLWNvbG9yOiAjMkMzRTUwO1xyXG4gICAgLyogRGVlcCBCbHVlIENvbG9yICovXHJcbiAgICBvdXRsaW5lOiBub25lO1xyXG59XHJcblxyXG4vKiBCdXR0b24gaW4gdGhlIGRpYWxvZyAqL1xyXG4uQVBYLWRpYWxvZy1idXR0b24tY29udGFpbmVyIGJ1dHRvbiB7XHJcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XHJcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjMkMzRTUwO1xyXG4gICAgY29sb3I6ICNFQ0YwRjE7XHJcbiAgICBib3JkZXI6IG5vbmU7XHJcbiAgICBwYWRkaW5nOiAxMHB4IDIwcHg7XHJcbiAgICBib3JkZXItcmFkaXVzOiA1cHg7XHJcbiAgICBmb250LXNpemU6IDE2cHg7XHJcbiAgICBjdXJzb3I6IHBvaW50ZXI7XHJcbiAgICB0cmFuc2l0aW9uOiBhbGwgMC4zcyBlYXNlO1xyXG4gICAgYm94LXNoYWRvdzogMCAycHggNHB4IHJnYmEoMCwgMCwgMCwgMC4xKTtcclxufVxyXG5cclxuLkFQWC1kaWFsb2ctYnV0dG9uLWNvbnRhaW5lciBidXR0b246aG92ZXIge1xyXG4gICAgYmFja2dyb3VuZC1jb2xvcjogIzM0NDk1RTtcclxuICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtMXB4KTtcclxuICAgIGJveC1zaGFkb3c6IDAgNHB4IDhweCByZ2JhKDAsIDAsIDAsIDAuMTUpO1xyXG59XHJcblxyXG4uQVBYLWRpYWxvZy1idXR0b24tY29udGFpbmVyIHtcclxuICAgIGRpc3BsYXk6IGZsZXg7XHJcbiAgICBnYXA6IDEwcHg7XHJcbiAgICBtYXJnaW4tdG9wOjFlbTtcclxuICAgIC8qIHNwYWNpbmcgYmV0d2VlbiBidXR0b25zICovXHJcbn1cclxuXHJcbi8qIExvYWRpbmcgaW5kaWNhdG9yICovXHJcbi5BUFgtZGlhbG9nLWxvYWRpbmctaW5kaWNhdG9yIHtcclxuICAgIGRpc3BsYXk6IGZsZXg7XHJcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcclxuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XHJcbiAgICBoZWlnaHQ6IDEwMHB4O1xyXG4gICAgd2lkdGg6IDEwMCU7XHJcbn1cclxuXHJcbi5BUFgtZGlhbG9nLWxvYWRpbmctaW5kaWNhdG9yOjpiZWZvcmUge1xyXG4gICAgY29udGVudDogJyc7XHJcbiAgICB3aWR0aDogNDBweDtcclxuICAgIGhlaWdodDogNDBweDtcclxuICAgIGJvcmRlcjogNHB4IHNvbGlkICNmM2YzZjM7XHJcbiAgICBib3JkZXItdG9wOiA0cHggc29saWQgIzJDM0U1MDtcclxuICAgIGJvcmRlci1yYWRpdXM6IDUwJTtcclxuICAgIGFuaW1hdGlvbjogQVBYLWRpYWxvZy1zcGluIDFzIGxpbmVhciBpbmZpbml0ZTtcclxufVxyXG5cclxuQGtleWZyYW1lcyBBUFgtZGlhbG9nLXNwaW4ge1xyXG4gICAgMCUgeyB0cmFuc2Zvcm06IHJvdGF0ZSgwZGVnKTsgfVxyXG4gICAgMTAwJSB7IHRyYW5zZm9ybTogcm90YXRlKDM2MGRlZyk7IH1cclxufVxyXG4uQVBYLWRpYWxvZy1idXR0b24tZGlzYWJsZWQge1xyXG4gICAgb3BhY2l0eTogMC41O1xyXG4gICAgY3Vyc29yOiBub3QtYWxsb3dlZCAhaW1wb3J0YW50O1xyXG4gICAgYmFja2dyb3VuZC1jb2xvcjogIzk1YTVhNiAhaW1wb3J0YW50OyAvKiBHcmF5ZWQgb3V0IGNvbG9yICovXHJcbiAgICBib3gtc2hhZG93OiBub25lICFpbXBvcnRhbnQ7XHJcbiAgICB0cmFuc2l0aW9uOiBhbGwgMC4ycyBlYXNlO1xyXG4gICAgdHJhbnNmb3JtOiBub25lICFpbXBvcnRhbnQ7XHJcbn1cclxuXHJcbi5BUFgtZGlhbG9nLWJ1dHRvbi1kaXNhYmxlZDpob3ZlciB7XHJcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjOTVhNWE2ICFpbXBvcnRhbnQ7IC8qIEtlZXAgZ3JheSBvbiBob3ZlciAqL1xyXG4gICAgdHJhbnNmb3JtOiBub25lICFpbXBvcnRhbnQ7XHJcbn1cclxuXHJcbi8qIEFkZCBhIHN1YnRsZSBzdHJpa2V0aHJvdWdoIGVmZmVjdCAqL1xyXG4uQVBYLWRpYWxvZy1idXR0b24tZGlzYWJsZWQ6OmFmdGVyIHtcclxuICAgIGNvbnRlbnQ6ICcnO1xyXG4gICAgcG9zaXRpb246IGFic29sdXRlO1xyXG4gICAgdG9wOiA1MCU7XHJcbiAgICBsZWZ0OiAwO1xyXG4gICAgd2lkdGg6IDEwMCU7XHJcbiAgICBoZWlnaHQ6IDFweDtcclxuICAgIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMCwgMCwgMCwgMC4yKTtcclxuICAgIHRyYW5zZm9ybTogcm90YXRlKC01ZGVnKTtcclxufWAsIFwiXCIse1widmVyc2lvblwiOjMsXCJzb3VyY2VzXCI6W1wid2VicGFjazovLy4vbW9kdWxlcy9kaWFsb2cvY3NzL2RpYWxvZy5jc3NcIl0sXCJuYW1lc1wiOltdLFwibWFwcGluZ3NcIjpcIkFBQUEsbUJBQW1CO0FBQ25CO0lBQ0ksYUFBYTtJQUNiLGVBQWU7SUFDZixhQUFhO0lBQ2IsT0FBTztJQUNQLE1BQU07SUFDTixXQUFXO0lBQ1gsWUFBWTtJQUNaLGNBQWM7SUFDZCxvQ0FBb0M7SUFDcEMsMENBQTBDO0FBQzlDOztBQUVBO0lBQ0kseUJBQXlCO0lBQ3pCLGFBQWE7SUFDYixZQUFZO0lBQ1osV0FBVztJQUNYLGdCQUFnQjtJQUNoQixjQUFjO0lBQ2QsWUFBWTtJQUNaLGtCQUFrQjtJQUNsQiwyQ0FBMkM7SUFDM0MsZ0RBQWdEO0FBQ3BEOztBQUVBO0lBQ0ksWUFBWTtBQUNoQjs7QUFFQTtJQUNJLFdBQVc7SUFDWCxZQUFZO0lBQ1osZUFBZTtJQUNmLGlCQUFpQjtJQUNqQix1QkFBdUI7SUFDdkIsbUJBQW1CO0FBQ3ZCOztBQUVBOztJQUVJLFdBQVc7SUFDWCxnQ0FBZ0M7SUFDaEMsZUFBZTtBQUNuQjs7QUFFQSx5QkFBeUI7QUFDekI7Ozs7SUFJSSxXQUFXO0lBQ1gsYUFBYTtJQUNiLG1CQUFtQjtJQUNuQixzQkFBc0I7SUFDdEIsa0JBQWtCO0lBQ2xCLGdEQUFnRDtJQUNoRCxlQUFlO0lBQ2Ysc0JBQXNCO0lBQ3RCLDZCQUE2QjtBQUNqQzs7QUFFQTs7OztJQUlJLHFCQUFxQjtJQUNyQixvQkFBb0I7SUFDcEIsYUFBYTtBQUNqQjs7QUFFQSx5QkFBeUI7QUFDekI7SUFDSSxrQkFBa0I7SUFDbEIseUJBQXlCO0lBQ3pCLGNBQWM7SUFDZCxZQUFZO0lBQ1osa0JBQWtCO0lBQ2xCLGtCQUFrQjtJQUNsQixlQUFlO0lBQ2YsZUFBZTtJQUNmLHlCQUF5QjtJQUN6Qix3Q0FBd0M7QUFDNUM7O0FBRUE7SUFDSSx5QkFBeUI7SUFDekIsMkJBQTJCO0lBQzNCLHlDQUF5QztBQUM3Qzs7QUFFQTtJQUNJLGFBQWE7SUFDYixTQUFTO0lBQ1QsY0FBYztJQUNkLDRCQUE0QjtBQUNoQzs7QUFFQSxzQkFBc0I7QUFDdEI7SUFDSSxhQUFhO0lBQ2IsdUJBQXVCO0lBQ3ZCLG1CQUFtQjtJQUNuQixhQUFhO0lBQ2IsV0FBVztBQUNmOztBQUVBO0lBQ0ksV0FBVztJQUNYLFdBQVc7SUFDWCxZQUFZO0lBQ1oseUJBQXlCO0lBQ3pCLDZCQUE2QjtJQUM3QixrQkFBa0I7SUFDbEIsNkNBQTZDO0FBQ2pEOztBQUVBO0lBQ0ksS0FBSyx1QkFBdUIsRUFBRTtJQUM5QixPQUFPLHlCQUF5QixFQUFFO0FBQ3RDO0FBQ0E7SUFDSSxZQUFZO0lBQ1osOEJBQThCO0lBQzlCLG9DQUFvQyxFQUFFLHFCQUFxQjtJQUMzRCwyQkFBMkI7SUFDM0IseUJBQXlCO0lBQ3pCLDBCQUEwQjtBQUM5Qjs7QUFFQTtJQUNJLG9DQUFvQyxFQUFFLHVCQUF1QjtJQUM3RCwwQkFBMEI7QUFDOUI7O0FBRUEsc0NBQXNDO0FBQ3RDO0lBQ0ksV0FBVztJQUNYLGtCQUFrQjtJQUNsQixRQUFRO0lBQ1IsT0FBTztJQUNQLFdBQVc7SUFDWCxXQUFXO0lBQ1gsb0NBQW9DO0lBQ3BDLHdCQUF3QjtBQUM1QlwiLFwic291cmNlc0NvbnRlbnRcIjpbXCIvKiBEaWFsb2cgc3R5bGluZyAqL1xcclxcbi5BUFgtZGlhbG9nIHtcXHJcXG4gICAgZGlzcGxheTogbm9uZTtcXHJcXG4gICAgcG9zaXRpb246IGZpeGVkO1xcclxcbiAgICB6LWluZGV4OiAxMDAyO1xcclxcbiAgICBsZWZ0OiAwO1xcclxcbiAgICB0b3A6IDA7XFxyXFxuICAgIHdpZHRoOiAxMDAlO1xcclxcbiAgICBoZWlnaHQ6IDEwMCU7XFxyXFxuICAgIG92ZXJmbG93OiBhdXRvO1xcclxcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuNCk7XFxyXFxuICAgIC8qIERpbW1lZCBiYWNrZ3JvdW5kIGZvciBmb2N1cyBvbiBkaWFsb2cgKi9cXHJcXG59XFxyXFxuXFxyXFxuLkFQWC1kaWFsb2ctY29udGVudCB7XFxyXFxuICAgIGJhY2tncm91bmQtY29sb3I6ICNmZWZlZmU7XFxyXFxuICAgIHBhZGRpbmc6IDQwcHg7XFxyXFxuICAgIGJvcmRlcjogbm9uZTtcXHJcXG4gICAgd2lkdGg6IGF1dG87XFxyXFxuICAgIG1pbi13aWR0aDogMzAwcHg7XFxyXFxuICAgIG1heC13aWR0aDogODAlO1xcclxcbiAgICBtYXJnaW46IGF1dG87XFxyXFxuICAgIGJvcmRlci1yYWRpdXM6IDhweDtcXHJcXG4gICAgYm94LXNoYWRvdzogMHB4IDZweCAyMHB4IHJnYmEoMCwgMCwgMCwgMC4xKTtcXHJcXG4gICAgZm9udC1mYW1pbHk6ICdIZWx2ZXRpY2EgTmV1ZScsIEFyaWFsLCBzYW5zLXNlcmlmO1xcclxcbn1cXHJcXG5cXHJcXG5oMi5BUFgtZGlhbG9nLXRpdGxle1xcclxcbiAgICBtYXJnaW4tdG9wOjA7XFxyXFxufVxcclxcblxcclxcbi5BUFgtY2xvc2UtZGlhbG9nIHtcXHJcXG4gICAgY29sb3I6ICNhYWE7XFxyXFxuICAgIGZsb2F0OiByaWdodDtcXHJcXG4gICAgZm9udC1zaXplOiAyNHB4O1xcclxcbiAgICBtYXJnaW4tdG9wOiAtMTBweDtcXHJcXG4gICAgLyogQWRqdXN0IHBvc2l0aW9uaW5nICovXFxyXFxuICAgIG1hcmdpbi1yaWdodDogLTEwcHg7XFxyXFxufVxcclxcblxcclxcbi5BUFgtY2xvc2UtZGlhbG9nOmhvdmVyLFxcclxcbi5BUFgtY2xvc2UtZGlhbG9nOmZvY3VzIHtcXHJcXG4gICAgY29sb3I6ICMzMzM7XFxyXFxuICAgIC8qIERhcmtlciBjb2xvciBvbiBob3Zlci9mb2N1cyAqL1xcclxcbiAgICBjdXJzb3I6IHBvaW50ZXI7XFxyXFxufVxcclxcblxcclxcbi8qIElucHV0IGZpZWxkcyBzdHlsaW5nICovXFxyXFxuLkFQWC1kaWFsb2ctY29udGVudCBpbnB1dFt0eXBlPVxcXCJ0ZXh0XFxcIl0sXFxyXFxuLkFQWC1kaWFsb2ctY29udGVudCBpbnB1dFt0eXBlPVxcXCJudW1iZXJcXFwiXSxcXHJcXG4uQVBYLWRpYWxvZy1jb250ZW50IGlucHV0W3R5cGU9XFxcImRhdGVcXFwiXSxcXHJcXG4uQVBYLWRpYWxvZy1jb250ZW50IGlucHV0W3R5cGU9XFxcImRhdGV0aW1lLWxvY2FsXFxcIl0ge1xcclxcbiAgICB3aWR0aDogMTAwJTtcXHJcXG4gICAgcGFkZGluZzogMTBweDtcXHJcXG4gICAgbWFyZ2luLWJvdHRvbTogMjBweDtcXHJcXG4gICAgYm9yZGVyOiAxcHggc29saWQgI2NjYztcXHJcXG4gICAgYm9yZGVyLXJhZGl1czogNHB4O1xcclxcbiAgICBmb250LWZhbWlseTogJ0hlbHZldGljYSBOZXVlJywgQXJpYWwsIHNhbnMtc2VyaWY7XFxyXFxuICAgIGZvbnQtc2l6ZTogMTZweDtcXHJcXG4gICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcXHJcXG4gICAgdHJhbnNpdGlvbjogYm9yZGVyLWNvbG9yIDAuM3M7XFxyXFxufVxcclxcblxcclxcbi5BUFgtZGlhbG9nLWNvbnRlbnQgaW5wdXRbdHlwZT1cXFwidGV4dFxcXCJdOmZvY3VzLFxcclxcbi5BUFgtZGlhbG9nLWNvbnRlbnQgaW5wdXRbdHlwZT1cXFwibnVtYmVyXFxcIl06Zm9jdXMsXFxyXFxuLkFQWC1kaWFsb2ctY29udGVudCBpbnB1dFt0eXBlPVxcXCJkYXRlXFxcIl06Zm9jdXMsXFxyXFxuLkFQWC1kaWFsb2ctY29udGVudCBpbnB1dFt0eXBlPVxcXCJkYXRldGltZS1sb2NhbFxcXCJdOmZvY3VzIHtcXHJcXG4gICAgYm9yZGVyLWNvbG9yOiAjMkMzRTUwO1xcclxcbiAgICAvKiBEZWVwIEJsdWUgQ29sb3IgKi9cXHJcXG4gICAgb3V0bGluZTogbm9uZTtcXHJcXG59XFxyXFxuXFxyXFxuLyogQnV0dG9uIGluIHRoZSBkaWFsb2cgKi9cXHJcXG4uQVBYLWRpYWxvZy1idXR0b24tY29udGFpbmVyIGJ1dHRvbiB7XFxyXFxuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcXHJcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogIzJDM0U1MDtcXHJcXG4gICAgY29sb3I6ICNFQ0YwRjE7XFxyXFxuICAgIGJvcmRlcjogbm9uZTtcXHJcXG4gICAgcGFkZGluZzogMTBweCAyMHB4O1xcclxcbiAgICBib3JkZXItcmFkaXVzOiA1cHg7XFxyXFxuICAgIGZvbnQtc2l6ZTogMTZweDtcXHJcXG4gICAgY3Vyc29yOiBwb2ludGVyO1xcclxcbiAgICB0cmFuc2l0aW9uOiBhbGwgMC4zcyBlYXNlO1xcclxcbiAgICBib3gtc2hhZG93OiAwIDJweCA0cHggcmdiYSgwLCAwLCAwLCAwLjEpO1xcclxcbn1cXHJcXG5cXHJcXG4uQVBYLWRpYWxvZy1idXR0b24tY29udGFpbmVyIGJ1dHRvbjpob3ZlciB7XFxyXFxuICAgIGJhY2tncm91bmQtY29sb3I6ICMzNDQ5NUU7XFxyXFxuICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtMXB4KTtcXHJcXG4gICAgYm94LXNoYWRvdzogMCA0cHggOHB4IHJnYmEoMCwgMCwgMCwgMC4xNSk7XFxyXFxufVxcclxcblxcclxcbi5BUFgtZGlhbG9nLWJ1dHRvbi1jb250YWluZXIge1xcclxcbiAgICBkaXNwbGF5OiBmbGV4O1xcclxcbiAgICBnYXA6IDEwcHg7XFxyXFxuICAgIG1hcmdpbi10b3A6MWVtO1xcclxcbiAgICAvKiBzcGFjaW5nIGJldHdlZW4gYnV0dG9ucyAqL1xcclxcbn1cXHJcXG5cXHJcXG4vKiBMb2FkaW5nIGluZGljYXRvciAqL1xcclxcbi5BUFgtZGlhbG9nLWxvYWRpbmctaW5kaWNhdG9yIHtcXHJcXG4gICAgZGlzcGxheTogZmxleDtcXHJcXG4gICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XFxyXFxuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XFxyXFxuICAgIGhlaWdodDogMTAwcHg7XFxyXFxuICAgIHdpZHRoOiAxMDAlO1xcclxcbn1cXHJcXG5cXHJcXG4uQVBYLWRpYWxvZy1sb2FkaW5nLWluZGljYXRvcjo6YmVmb3JlIHtcXHJcXG4gICAgY29udGVudDogJyc7XFxyXFxuICAgIHdpZHRoOiA0MHB4O1xcclxcbiAgICBoZWlnaHQ6IDQwcHg7XFxyXFxuICAgIGJvcmRlcjogNHB4IHNvbGlkICNmM2YzZjM7XFxyXFxuICAgIGJvcmRlci10b3A6IDRweCBzb2xpZCAjMkMzRTUwO1xcclxcbiAgICBib3JkZXItcmFkaXVzOiA1MCU7XFxyXFxuICAgIGFuaW1hdGlvbjogQVBYLWRpYWxvZy1zcGluIDFzIGxpbmVhciBpbmZpbml0ZTtcXHJcXG59XFxyXFxuXFxyXFxuQGtleWZyYW1lcyBBUFgtZGlhbG9nLXNwaW4ge1xcclxcbiAgICAwJSB7IHRyYW5zZm9ybTogcm90YXRlKDBkZWcpOyB9XFxyXFxuICAgIDEwMCUgeyB0cmFuc2Zvcm06IHJvdGF0ZSgzNjBkZWcpOyB9XFxyXFxufVxcclxcbi5BUFgtZGlhbG9nLWJ1dHRvbi1kaXNhYmxlZCB7XFxyXFxuICAgIG9wYWNpdHk6IDAuNTtcXHJcXG4gICAgY3Vyc29yOiBub3QtYWxsb3dlZCAhaW1wb3J0YW50O1xcclxcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjOTVhNWE2ICFpbXBvcnRhbnQ7IC8qIEdyYXllZCBvdXQgY29sb3IgKi9cXHJcXG4gICAgYm94LXNoYWRvdzogbm9uZSAhaW1wb3J0YW50O1xcclxcbiAgICB0cmFuc2l0aW9uOiBhbGwgMC4ycyBlYXNlO1xcclxcbiAgICB0cmFuc2Zvcm06IG5vbmUgIWltcG9ydGFudDtcXHJcXG59XFxyXFxuXFxyXFxuLkFQWC1kaWFsb2ctYnV0dG9uLWRpc2FibGVkOmhvdmVyIHtcXHJcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogIzk1YTVhNiAhaW1wb3J0YW50OyAvKiBLZWVwIGdyYXkgb24gaG92ZXIgKi9cXHJcXG4gICAgdHJhbnNmb3JtOiBub25lICFpbXBvcnRhbnQ7XFxyXFxufVxcclxcblxcclxcbi8qIEFkZCBhIHN1YnRsZSBzdHJpa2V0aHJvdWdoIGVmZmVjdCAqL1xcclxcbi5BUFgtZGlhbG9nLWJ1dHRvbi1kaXNhYmxlZDo6YWZ0ZXIge1xcclxcbiAgICBjb250ZW50OiAnJztcXHJcXG4gICAgcG9zaXRpb246IGFic29sdXRlO1xcclxcbiAgICB0b3A6IDUwJTtcXHJcXG4gICAgbGVmdDogMDtcXHJcXG4gICAgd2lkdGg6IDEwMCU7XFxyXFxuICAgIGhlaWdodDogMXB4O1xcclxcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuMik7XFxyXFxuICAgIHRyYW5zZm9ybTogcm90YXRlKC01ZGVnKTtcXHJcXG59XCJdLFwic291cmNlUm9vdFwiOlwiXCJ9XSk7XG4vLyBFeHBvcnRzXG5leHBvcnQgZGVmYXVsdCBfX19DU1NfTE9BREVSX0VYUE9SVF9fXztcbiIsIi8vIEltcG9ydHNcbmltcG9ydCBfX19DU1NfTE9BREVSX0FQSV9TT1VSQ0VNQVBfSU1QT1JUX19fIGZyb20gXCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L3J1bnRpbWUvc291cmNlTWFwcy5qc1wiO1xuaW1wb3J0IF9fX0NTU19MT0FERVJfQVBJX0lNUE9SVF9fXyBmcm9tIFwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL2FwaS5qc1wiO1xudmFyIF9fX0NTU19MT0FERVJfRVhQT1JUX19fID0gX19fQ1NTX0xPQURFUl9BUElfSU1QT1JUX19fKF9fX0NTU19MT0FERVJfQVBJX1NPVVJDRU1BUF9JTVBPUlRfX18pO1xuLy8gTW9kdWxlXG5fX19DU1NfTE9BREVSX0VYUE9SVF9fXy5wdXNoKFttb2R1bGUuaWQsIGAuQVBYLXRvYXN0LWNvbnRhaW5lciB7XHJcbiAgICBwb3NpdGlvbjogZml4ZWQ7XHJcbiAgICBkaXNwbGF5OiBmbGV4O1xyXG4gICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcclxuICAgIGdhcDogdmFyKC0tYXB4LXRvYXN0LWdhcCwgOHB4KTtcclxuICAgIHotaW5kZXg6IHZhcigtLWFweC10b2FzdC16LWluZGV4LCAxMTAwMCk7XHJcbiAgICBwb2ludGVyLWV2ZW50czogbm9uZTtcclxufVxyXG5cclxuLkFQWC10b2FzdC1jb250YWluZXItLWJvdHRvbS1yaWdodCB7IHJpZ2h0OiAxMnB4OyBib3R0b206IDEycHg7IGFsaWduLWl0ZW1zOiBmbGV4LWVuZDsgfVxyXG4uQVBYLXRvYXN0LWNvbnRhaW5lci0tYm90dG9tLWxlZnQgeyBsZWZ0OiAxMnB4OyBib3R0b206IDEycHg7IGFsaWduLWl0ZW1zOiBmbGV4LXN0YXJ0OyB9XHJcbi5BUFgtdG9hc3QtY29udGFpbmVyLS10b3AtcmlnaHQgeyByaWdodDogMTJweDsgdG9wOiAxMnB4OyBhbGlnbi1pdGVtczogZmxleC1lbmQ7IH1cclxuLkFQWC10b2FzdC1jb250YWluZXItLXRvcC1sZWZ0IHsgbGVmdDogMTJweDsgdG9wOiAxMnB4OyBhbGlnbi1pdGVtczogZmxleC1zdGFydDsgfVxyXG5cclxuLkFQWC10b2FzdCB7XHJcbiAgICBtaW4td2lkdGg6IHZhcigtLWFweC10b2FzdC1taW4td2lkdGgsIDI2MHB4KTtcclxuICAgIG1heC13aWR0aDogdmFyKC0tYXB4LXRvYXN0LW1heC13aWR0aCwgNDIwcHgpO1xyXG4gICAgZm9udC1zaXplOiB2YXIoLS1hcHgtdG9hc3QtZm9udC1zaXplLCAxNHB4KTtcclxuICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLWFweC10b2FzdC1yYWRpdXMsIDZweCk7XHJcbiAgICBib3gtc2hhZG93OiB2YXIoLS1hcHgtdG9hc3Qtc2hhZG93LCAwIDZweCAyNHB4IHJnYmEoMCwwLDAsMC4yKSk7XHJcbiAgICBwYWRkaW5nOiB2YXIoLS1hcHgtdG9hc3QtcGFkZGluZywgMTBweCA0MnB4IDEwcHggMTRweCk7XHJcbiAgICBjb2xvcjogIzExMTtcclxuICAgIGJhY2tncm91bmQ6ICNlZWU7XHJcbiAgICBwb2ludGVyLWV2ZW50czogYXV0bztcclxuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcclxuICAgIHRyYW5zaXRpb246IG9wYWNpdHkgMTgwbXMgZWFzZSwgdHJhbnNmb3JtIDE4MG1zIGVhc2U7XHJcbn1cclxuXHJcbi5BUFgtdG9hc3QtLWluZm8geyBiYWNrZ3JvdW5kOiB2YXIoLS1hcHgtdG9hc3QtaW5mby1iZywgIzBkY2FmMCk7IGNvbG9yOiB2YXIoLS1hcHgtdG9hc3QtaW5mby1mZywgIzA1MmM2NSk7IH1cclxuLkFQWC10b2FzdC0tc3VjY2VzcyB7IGJhY2tncm91bmQ6IHZhcigtLWFweC10b2FzdC1zdWNjZXNzLWJnLCAjMTk4NzU0KTsgY29sb3I6IHZhcigtLWFweC10b2FzdC1zdWNjZXNzLWZnLCAjZmZmZmZmKTsgfVxyXG4uQVBYLXRvYXN0LS13YXJuaW5nIHsgYmFja2dyb3VuZDogdmFyKC0tYXB4LXRvYXN0LXdhcm5pbmctYmcsICNmZmMxMDcpOyBjb2xvcjogdmFyKC0tYXB4LXRvYXN0LXdhcm5pbmctZmcsICM2NjRkMDMpOyB9XHJcbi5BUFgtdG9hc3QtLWRhbmdlciB7IGJhY2tncm91bmQ6IHZhcigtLWFweC10b2FzdC1kYW5nZXItYmcsICNkYzM1NDUpOyBjb2xvcjogdmFyKC0tYXB4LXRvYXN0LWRhbmdlci1mZywgI2ZmZmZmZik7IH1cclxuXHJcbi5BUFgtdG9hc3RfX2NvbnRlbnQgeyBsaW5lLWhlaWdodDogMS4zNTsgfVxyXG5cclxuLkFQWC10b2FzdF9fY2xvc2Uge1xyXG4gICAgcG9zaXRpb246IGFic29sdXRlO1xyXG4gICAgdG9wOiA1MCU7IHJpZ2h0OiAxMHB4O1xyXG4gICAgd2lkdGg6IDI0cHg7IGhlaWdodDogMjRweDtcclxuICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtNTAlKTtcclxuICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OyBhbGlnbi1pdGVtczogY2VudGVyOyBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcclxuICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50OyBjb2xvcjogY3VycmVudENvbG9yO1xyXG4gICAgYm9yZGVyOiAwOyBib3JkZXItcmFkaXVzOiA0cHg7IHBhZGRpbmc6IDA7IG1hcmdpbjogMDtcclxuICAgIGN1cnNvcjogcG9pbnRlcjsgYXBwZWFyYW5jZTogbm9uZTsgLXdlYmtpdC1hcHBlYXJhbmNlOiBub25lO1xyXG4gICAgb3BhY2l0eTogLjc1OyB0cmFuc2l0aW9uOiBvcGFjaXR5IDEyMG1zIGVhc2U7XHJcbn1cclxuLkFQWC10b2FzdF9fY2xvc2U6aG92ZXIgeyBvcGFjaXR5OiAxOyB9XHJcbi5BUFgtdG9hc3RfX2Nsb3NlOmZvY3VzIHsgb3V0bGluZTogMnB4IHNvbGlkIHJnYmEoMCwwLDAsLjIpOyBvdXRsaW5lLW9mZnNldDogMnB4OyB9XHJcbi5BUFgtdG9hc3RfX2Nsb3NlOjpiZWZvcmUge1xyXG4gICAgY29udGVudDogJ8OXJztcclxuICAgIGZvbnQtc2l6ZTogMTZweDsgbGluZS1oZWlnaHQ6IDE7IHRleHQtYWxpZ246IGNlbnRlcjtcclxufVxyXG5cclxuLyogUHJvZ3Jlc3MgYmFyIChvdXRzaWRlIGNvbnRlbnQsIGZsdXNoIHRvIHRvYXN0IGVkZ2VzKSAqL1xyXG4uQVBYLXRvYXN0X19wcm9ncmVzcyB7XHJcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XHJcbiAgICBsZWZ0OiAwO1xyXG4gICAgcmlnaHQ6IDA7XHJcbiAgICBoZWlnaHQ6IHZhcigtLWFweC10b2FzdC1wcm9ncmVzcy1oZWlnaHQsIDRweCk7XHJcbiAgICBkaXNwbGF5OiBmbGV4O1xyXG4gICAgZmxleC1kaXJlY3Rpb246IHJvdztcclxuICAgIGFsaWduLWl0ZW1zOiBzdHJldGNoO1xyXG4gICAgZmxleC1zaHJpbms6IDA7XHJcbiAgICBib3JkZXItcmFkaXVzOiBpbmhlcml0O1xyXG4gICAgb3ZlcmZsb3c6IHZpc2libGU7XHJcbn1cclxuLkFQWC10b2FzdF9fcHJvZ3Jlc3MtLXRvcCB7XHJcbiAgICB0b3A6IDA7XHJcbiAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1hcHgtdG9hc3QtcmFkaXVzLCA2cHgpIHZhcigtLWFweC10b2FzdC1yYWRpdXMsIDZweCkgMCAwO1xyXG59XHJcbi5BUFgtdG9hc3RfX3Byb2dyZXNzLS1ib3R0b20ge1xyXG4gICAgYm90dG9tOiAwO1xyXG4gICAgYm9yZGVyLXJhZGl1czogMCAwIHZhcigtLWFweC10b2FzdC1yYWRpdXMsIDZweCkgdmFyKC0tYXB4LXRvYXN0LXJhZGl1cywgNnB4KTtcclxufVxyXG4vKiBUcmFjayBjb250YWlucyB0aGUgYmFyOyBubyBtYXJnaW4gKHBhdXNlIGJ1dHRvbiBpcyBvbiB0aGUgY29ybmVyLCBvdmVybGFwcGluZykgKi9cclxuLkFQWC10b2FzdF9fcHJvZ3Jlc3MtdHJhY2sge1xyXG4gICAgZmxleDogMTtcclxuICAgIG1pbi13aWR0aDogMDtcclxuICAgIG92ZXJmbG93OiBoaWRkZW47XHJcbn1cclxuLkFQWC10b2FzdF9fcHJvZ3Jlc3MtYmFyIHtcclxuICAgIGhlaWdodDogMTAwJTtcclxuICAgIHdpZHRoOiAxMDAlO1xyXG4gICAgbWF4LXdpZHRoOiAxMDAlO1xyXG4gICAgdHJhbnNpdGlvbjogd2lkdGggODBtcyBsaW5lYXI7XHJcbiAgICBiYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDAsIDAuMjUpO1xyXG59XHJcbi5BUFgtdG9hc3QtLWluZm8gLkFQWC10b2FzdF9fcHJvZ3Jlc3MtYmFyIHsgYmFja2dyb3VuZDogcmdiYSg1LCA0NCwgMTAxLCAwLjUpOyB9XHJcbi5BUFgtdG9hc3QtLXN1Y2Nlc3MgLkFQWC10b2FzdF9fcHJvZ3Jlc3MtYmFyIHsgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjI1KTsgfVxyXG4uQVBYLXRvYXN0LS13YXJuaW5nIC5BUFgtdG9hc3RfX3Byb2dyZXNzLWJhciB7IGJhY2tncm91bmQ6IHJnYmEoMTAyLCA3NywgMywgMC41KTsgfVxyXG4uQVBYLXRvYXN0LS1kYW5nZXIgLkFQWC10b2FzdF9fcHJvZ3Jlc3MtYmFyIHsgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjI1KTsgfVxyXG4vKiBQYXVzZS9SZXN1bWUgYnV0dG9uOiByb3VuZCwgY2VudGVyIGV4YWN0bHkgb24gdG9hc3QgY29ybmVyICh0b3AtbGVmdCBvciBib3R0b20tbGVmdCkgKi9cclxuLkFQWC10b2FzdF9fcHJvZ3Jlc3MtcGF1c2Uge1xyXG4gICAgcG9zaXRpb246IGFic29sdXRlO1xyXG4gICAgd2lkdGg6IHZhcigtLWFweC10b2FzdC1wcm9ncmVzcy1wYXVzZS1zaXplLCAxOHB4KTtcclxuICAgIGhlaWdodDogdmFyKC0tYXB4LXRvYXN0LXByb2dyZXNzLXBhdXNlLXNpemUsIDE4cHgpO1xyXG4gICAgbGVmdDogMDtcclxuICAgIGRpc3BsYXk6IGlubGluZS1mbGV4O1xyXG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcclxuICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xyXG4gICAgYmFja2dyb3VuZDogI2VlZTtcclxuICAgIGNvbG9yOiBjdXJyZW50Q29sb3I7XHJcbiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDAsIDAsIDAsIDAuMzUpO1xyXG4gICAgYm9yZGVyLXJhZGl1czogNTAlO1xyXG4gICAgcGFkZGluZzogMDtcclxuICAgIG1hcmdpbjogMDtcclxuICAgIGN1cnNvcjogcG9pbnRlcjtcclxuICAgIGxpbmUtaGVpZ2h0OiAxO1xyXG4gICAgb3BhY2l0eTogMC45NTtcclxuICAgIHRyYW5zaXRpb246IG9wYWNpdHkgMTIwbXMgZWFzZTtcclxuICAgIGZsZXgtc2hyaW5rOiAwO1xyXG59XHJcbi5BUFgtdG9hc3RfX3Byb2dyZXNzLS10b3AgLkFQWC10b2FzdF9fcHJvZ3Jlc3MtcGF1c2Uge1xyXG4gICAgdG9wOiAwO1xyXG4gICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTUwJSwgLTUwJSk7XHJcbn1cclxuLkFQWC10b2FzdF9fcHJvZ3Jlc3MtLWJvdHRvbSAuQVBYLXRvYXN0X19wcm9ncmVzcy1wYXVzZSB7XHJcbiAgICBib3R0b206IDA7XHJcbiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSgtNTAlLCA1MCUpO1xyXG59XHJcbi5BUFgtdG9hc3QtLWluZm8gLkFQWC10b2FzdF9fcHJvZ3Jlc3MtcGF1c2UgeyBiYWNrZ3JvdW5kOiB2YXIoLS1hcHgtdG9hc3QtaW5mby1iZywgIzBkY2FmMCk7IGJvcmRlci1jb2xvcjogcmdiYSg1LCA0NCwgMTAxLCAwLjU1KTsgfVxyXG4uQVBYLXRvYXN0LS1zdWNjZXNzIC5BUFgtdG9hc3RfX3Byb2dyZXNzLXBhdXNlIHsgYmFja2dyb3VuZDogdmFyKC0tYXB4LXRvYXN0LXN1Y2Nlc3MtYmcsICMxOTg3NTQpOyBib3JkZXItY29sb3I6IHJnYmEoMCwgMCwgMCwgMC4zKTsgfVxyXG4uQVBYLXRvYXN0LS13YXJuaW5nIC5BUFgtdG9hc3RfX3Byb2dyZXNzLXBhdXNlIHsgYmFja2dyb3VuZDogdmFyKC0tYXB4LXRvYXN0LXdhcm5pbmctYmcsICNmZmMxMDcpOyBib3JkZXItY29sb3I6IHJnYmEoMTAyLCA3NywgMywgMC42KTsgfVxyXG4uQVBYLXRvYXN0LS1kYW5nZXIgLkFQWC10b2FzdF9fcHJvZ3Jlc3MtcGF1c2UgeyBiYWNrZ3JvdW5kOiB2YXIoLS1hcHgtdG9hc3QtZGFuZ2VyLWJnLCAjZGMzNTQ1KTsgYm9yZGVyLWNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuMzUpOyB9XHJcbi5BUFgtdG9hc3RfX3Byb2dyZXNzLXBhdXNlOmhvdmVyIHsgb3BhY2l0eTogMTsgfVxyXG4uQVBYLXRvYXN0X19wcm9ncmVzcy1wYXVzZTpmb2N1cyB7IG91dGxpbmU6IDJweCBzb2xpZCByZ2JhKDAsMCwwLC40KTsgb3V0bGluZS1vZmZzZXQ6IC0ycHg7IH1cclxuLkFQWC10b2FzdF9fcHJvZ3Jlc3MtcGF1c2Ugc3ZnIHtcclxuICAgIHdpZHRoOiAxMHB4O1xyXG4gICAgaGVpZ2h0OiAxMHB4O1xyXG4gICAgZGlzcGxheTogYmxvY2s7XHJcbn1cclxuLyogRXh0cmEgdG9wL2JvdHRvbSBwYWRkaW5nIHdoZW4gcHJvZ3Jlc3MgYmFyIGlzIHByZXNlbnQgKGRlZmF1bHQgY29udGVudCBwYWRkaW5nIDEwcHggKyBiYXIgaGVpZ2h0KSAqL1xyXG4uQVBYLXRvYXN0LS1oYXMtcHJvZ3Jlc3MtdG9wIHsgcGFkZGluZy10b3A6IGNhbGMoMTBweCArIHZhcigtLWFweC10b2FzdC1wcm9ncmVzcy1oZWlnaHQsIDRweCkpOyB9XHJcbi5BUFgtdG9hc3QtLWhhcy1wcm9ncmVzcy1ib3R0b20geyBwYWRkaW5nLWJvdHRvbTogY2FsYygxMHB4ICsgdmFyKC0tYXB4LXRvYXN0LXByb2dyZXNzLWhlaWdodCwgNHB4KSk7IH1cclxuLyogUmVzZXJ2ZSBzcGFjZSBmb3Igc3RhY2tpbmcgd2hlbiBwYXVzZSBidXR0b24gaXMgcHJlc2VudCAoYnV0dG9uIGV4dGVuZHMgb3V0c2lkZSB0b2FzdCBjb3JuZXIpICovXHJcbi5BUFgtdG9hc3QtLWhhcy1wcm9ncmVzcy10b3AuQVBYLXRvYXN0LS1oYXMtcHJvZ3Jlc3MtcGF1c2UgeyBtYXJnaW4tdG9wOiBjYWxjKHZhcigtLWFweC10b2FzdC1wcm9ncmVzcy1wYXVzZS1zaXplLCAxOHB4KSAvIDIpOyB9XHJcbi5BUFgtdG9hc3QtLWhhcy1wcm9ncmVzcy1ib3R0b20uQVBYLXRvYXN0LS1oYXMtcHJvZ3Jlc3MtcGF1c2UgeyBtYXJnaW4tYm90dG9tOiBjYWxjKHZhcigtLWFweC10b2FzdC1wcm9ncmVzcy1wYXVzZS1zaXplLCAxOHB4KSAvIDIpOyB9XHJcblxyXG4vKiBBbmltYXRpb25zICovXHJcbi5BUFgtdG9hc3QtLWVudGVyIHsgb3BhY2l0eTogMDsgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKDhweCk7IH1cclxuLkFQWC10b2FzdC0tZW50ZXIuQVBYLXRvYXN0LS1lbnRlci1hY3RpdmUgeyBvcGFjaXR5OiAxOyB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoMCk7IH1cclxuLkFQWC10b2FzdC0tZXhpdCB7IG9wYWNpdHk6IDE7IHRyYW5zZm9ybTogdHJhbnNsYXRlWSgwKTsgfVxyXG4uQVBYLXRvYXN0LS1leGl0LkFQWC10b2FzdC0tZXhpdC1hY3RpdmUgeyBvcGFjaXR5OiAwOyB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoOHB4KTsgfVxyXG5cclxuXHJcbmAsIFwiXCIse1widmVyc2lvblwiOjMsXCJzb3VyY2VzXCI6W1wid2VicGFjazovLy4vbW9kdWxlcy90b2FzdC9jc3MvdG9hc3QuY3NzXCJdLFwibmFtZXNcIjpbXSxcIm1hcHBpbmdzXCI6XCJBQUFBO0lBQ0ksZUFBZTtJQUNmLGFBQWE7SUFDYixzQkFBc0I7SUFDdEIsOEJBQThCO0lBQzlCLHdDQUF3QztJQUN4QyxvQkFBb0I7QUFDeEI7O0FBRUEscUNBQXFDLFdBQVcsRUFBRSxZQUFZLEVBQUUscUJBQXFCLEVBQUU7QUFDdkYsb0NBQW9DLFVBQVUsRUFBRSxZQUFZLEVBQUUsdUJBQXVCLEVBQUU7QUFDdkYsa0NBQWtDLFdBQVcsRUFBRSxTQUFTLEVBQUUscUJBQXFCLEVBQUU7QUFDakYsaUNBQWlDLFVBQVUsRUFBRSxTQUFTLEVBQUUsdUJBQXVCLEVBQUU7O0FBRWpGO0lBQ0ksNENBQTRDO0lBQzVDLDRDQUE0QztJQUM1QywyQ0FBMkM7SUFDM0MsMkNBQTJDO0lBQzNDLCtEQUErRDtJQUMvRCxzREFBc0Q7SUFDdEQsV0FBVztJQUNYLGdCQUFnQjtJQUNoQixvQkFBb0I7SUFDcEIsa0JBQWtCO0lBQ2xCLG9EQUFvRDtBQUN4RDs7QUFFQSxtQkFBbUIsNkNBQTZDLEVBQUUsd0NBQXdDLEVBQUU7QUFDNUcsc0JBQXNCLGdEQUFnRCxFQUFFLDJDQUEyQyxFQUFFO0FBQ3JILHNCQUFzQixnREFBZ0QsRUFBRSwyQ0FBMkMsRUFBRTtBQUNySCxxQkFBcUIsK0NBQStDLEVBQUUsMENBQTBDLEVBQUU7O0FBRWxILHNCQUFzQixpQkFBaUIsRUFBRTs7QUFFekM7SUFDSSxrQkFBa0I7SUFDbEIsUUFBUSxFQUFFLFdBQVc7SUFDckIsV0FBVyxFQUFFLFlBQVk7SUFDekIsMkJBQTJCO0lBQzNCLG9CQUFvQixFQUFFLG1CQUFtQixFQUFFLHVCQUF1QjtJQUNsRSx1QkFBdUIsRUFBRSxtQkFBbUI7SUFDNUMsU0FBUyxFQUFFLGtCQUFrQixFQUFFLFVBQVUsRUFBRSxTQUFTO0lBQ3BELGVBQWUsRUFBRSxnQkFBZ0IsRUFBRSx3QkFBd0I7SUFDM0QsWUFBWSxFQUFFLDhCQUE4QjtBQUNoRDtBQUNBLDBCQUEwQixVQUFVLEVBQUU7QUFDdEMsMEJBQTBCLGlDQUFpQyxFQUFFLG1CQUFtQixFQUFFO0FBQ2xGO0lBQ0ksWUFBWTtJQUNaLGVBQWUsRUFBRSxjQUFjLEVBQUUsa0JBQWtCO0FBQ3ZEOztBQUVBLHlEQUF5RDtBQUN6RDtJQUNJLGtCQUFrQjtJQUNsQixPQUFPO0lBQ1AsUUFBUTtJQUNSLDZDQUE2QztJQUM3QyxhQUFhO0lBQ2IsbUJBQW1CO0lBQ25CLG9CQUFvQjtJQUNwQixjQUFjO0lBQ2Qsc0JBQXNCO0lBQ3RCLGlCQUFpQjtBQUNyQjtBQUNBO0lBQ0ksTUFBTTtJQUNOLDRFQUE0RTtBQUNoRjtBQUNBO0lBQ0ksU0FBUztJQUNULDRFQUE0RTtBQUNoRjtBQUNBLG1GQUFtRjtBQUNuRjtJQUNJLE9BQU87SUFDUCxZQUFZO0lBQ1osZ0JBQWdCO0FBQ3BCO0FBQ0E7SUFDSSxZQUFZO0lBQ1osV0FBVztJQUNYLGVBQWU7SUFDZiw2QkFBNkI7SUFDN0IsK0JBQStCO0FBQ25DO0FBQ0EsNENBQTRDLGlDQUFpQyxFQUFFO0FBQy9FLCtDQUErQywrQkFBK0IsRUFBRTtBQUNoRiwrQ0FBK0MsaUNBQWlDLEVBQUU7QUFDbEYsOENBQThDLCtCQUErQixFQUFFO0FBQy9FLHlGQUF5RjtBQUN6RjtJQUNJLGtCQUFrQjtJQUNsQixpREFBaUQ7SUFDakQsa0RBQWtEO0lBQ2xELE9BQU87SUFDUCxvQkFBb0I7SUFDcEIsbUJBQW1CO0lBQ25CLHVCQUF1QjtJQUN2QixnQkFBZ0I7SUFDaEIsbUJBQW1CO0lBQ25CLHFDQUFxQztJQUNyQyxrQkFBa0I7SUFDbEIsVUFBVTtJQUNWLFNBQVM7SUFDVCxlQUFlO0lBQ2YsY0FBYztJQUNkLGFBQWE7SUFDYiw4QkFBOEI7SUFDOUIsY0FBYztBQUNsQjtBQUNBO0lBQ0ksTUFBTTtJQUNOLGdDQUFnQztBQUNwQztBQUNBO0lBQ0ksU0FBUztJQUNULCtCQUErQjtBQUNuQztBQUNBLDhDQUE4Qyw2Q0FBNkMsRUFBRSxvQ0FBb0MsRUFBRTtBQUNuSSxpREFBaUQsZ0RBQWdELEVBQUUsZ0NBQWdDLEVBQUU7QUFDckksaURBQWlELGdEQUFnRCxFQUFFLG1DQUFtQyxFQUFFO0FBQ3hJLGdEQUFnRCwrQ0FBK0MsRUFBRSxpQ0FBaUMsRUFBRTtBQUNwSSxtQ0FBbUMsVUFBVSxFQUFFO0FBQy9DLG1DQUFtQyxpQ0FBaUMsRUFBRSxvQkFBb0IsRUFBRTtBQUM1RjtJQUNJLFdBQVc7SUFDWCxZQUFZO0lBQ1osY0FBYztBQUNsQjtBQUNBLHNHQUFzRztBQUN0RywrQkFBK0IsK0RBQStELEVBQUU7QUFDaEcsa0NBQWtDLGtFQUFrRSxFQUFFO0FBQ3RHLGtHQUFrRztBQUNsRyw2REFBNkQsZ0VBQWdFLEVBQUU7QUFDL0gsZ0VBQWdFLG1FQUFtRSxFQUFFOztBQUVySSxlQUFlO0FBQ2Ysb0JBQW9CLFVBQVUsRUFBRSwwQkFBMEIsRUFBRTtBQUM1RCw0Q0FBNEMsVUFBVSxFQUFFLHdCQUF3QixFQUFFO0FBQ2xGLG1CQUFtQixVQUFVLEVBQUUsd0JBQXdCLEVBQUU7QUFDekQsMENBQTBDLFVBQVUsRUFBRSwwQkFBMEIsRUFBRVwiLFwic291cmNlc0NvbnRlbnRcIjpbXCIuQVBYLXRvYXN0LWNvbnRhaW5lciB7XFxyXFxuICAgIHBvc2l0aW9uOiBmaXhlZDtcXHJcXG4gICAgZGlzcGxheTogZmxleDtcXHJcXG4gICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcXHJcXG4gICAgZ2FwOiB2YXIoLS1hcHgtdG9hc3QtZ2FwLCA4cHgpO1xcclxcbiAgICB6LWluZGV4OiB2YXIoLS1hcHgtdG9hc3Qtei1pbmRleCwgMTEwMDApO1xcclxcbiAgICBwb2ludGVyLWV2ZW50czogbm9uZTtcXHJcXG59XFxyXFxuXFxyXFxuLkFQWC10b2FzdC1jb250YWluZXItLWJvdHRvbS1yaWdodCB7IHJpZ2h0OiAxMnB4OyBib3R0b206IDEycHg7IGFsaWduLWl0ZW1zOiBmbGV4LWVuZDsgfVxcclxcbi5BUFgtdG9hc3QtY29udGFpbmVyLS1ib3R0b20tbGVmdCB7IGxlZnQ6IDEycHg7IGJvdHRvbTogMTJweDsgYWxpZ24taXRlbXM6IGZsZXgtc3RhcnQ7IH1cXHJcXG4uQVBYLXRvYXN0LWNvbnRhaW5lci0tdG9wLXJpZ2h0IHsgcmlnaHQ6IDEycHg7IHRvcDogMTJweDsgYWxpZ24taXRlbXM6IGZsZXgtZW5kOyB9XFxyXFxuLkFQWC10b2FzdC1jb250YWluZXItLXRvcC1sZWZ0IHsgbGVmdDogMTJweDsgdG9wOiAxMnB4OyBhbGlnbi1pdGVtczogZmxleC1zdGFydDsgfVxcclxcblxcclxcbi5BUFgtdG9hc3Qge1xcclxcbiAgICBtaW4td2lkdGg6IHZhcigtLWFweC10b2FzdC1taW4td2lkdGgsIDI2MHB4KTtcXHJcXG4gICAgbWF4LXdpZHRoOiB2YXIoLS1hcHgtdG9hc3QtbWF4LXdpZHRoLCA0MjBweCk7XFxyXFxuICAgIGZvbnQtc2l6ZTogdmFyKC0tYXB4LXRvYXN0LWZvbnQtc2l6ZSwgMTRweCk7XFxyXFxuICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLWFweC10b2FzdC1yYWRpdXMsIDZweCk7XFxyXFxuICAgIGJveC1zaGFkb3c6IHZhcigtLWFweC10b2FzdC1zaGFkb3csIDAgNnB4IDI0cHggcmdiYSgwLDAsMCwwLjIpKTtcXHJcXG4gICAgcGFkZGluZzogdmFyKC0tYXB4LXRvYXN0LXBhZGRpbmcsIDEwcHggNDJweCAxMHB4IDE0cHgpO1xcclxcbiAgICBjb2xvcjogIzExMTtcXHJcXG4gICAgYmFja2dyb3VuZDogI2VlZTtcXHJcXG4gICAgcG9pbnRlci1ldmVudHM6IGF1dG87XFxyXFxuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcXHJcXG4gICAgdHJhbnNpdGlvbjogb3BhY2l0eSAxODBtcyBlYXNlLCB0cmFuc2Zvcm0gMTgwbXMgZWFzZTtcXHJcXG59XFxyXFxuXFxyXFxuLkFQWC10b2FzdC0taW5mbyB7IGJhY2tncm91bmQ6IHZhcigtLWFweC10b2FzdC1pbmZvLWJnLCAjMGRjYWYwKTsgY29sb3I6IHZhcigtLWFweC10b2FzdC1pbmZvLWZnLCAjMDUyYzY1KTsgfVxcclxcbi5BUFgtdG9hc3QtLXN1Y2Nlc3MgeyBiYWNrZ3JvdW5kOiB2YXIoLS1hcHgtdG9hc3Qtc3VjY2Vzcy1iZywgIzE5ODc1NCk7IGNvbG9yOiB2YXIoLS1hcHgtdG9hc3Qtc3VjY2Vzcy1mZywgI2ZmZmZmZik7IH1cXHJcXG4uQVBYLXRvYXN0LS13YXJuaW5nIHsgYmFja2dyb3VuZDogdmFyKC0tYXB4LXRvYXN0LXdhcm5pbmctYmcsICNmZmMxMDcpOyBjb2xvcjogdmFyKC0tYXB4LXRvYXN0LXdhcm5pbmctZmcsICM2NjRkMDMpOyB9XFxyXFxuLkFQWC10b2FzdC0tZGFuZ2VyIHsgYmFja2dyb3VuZDogdmFyKC0tYXB4LXRvYXN0LWRhbmdlci1iZywgI2RjMzU0NSk7IGNvbG9yOiB2YXIoLS1hcHgtdG9hc3QtZGFuZ2VyLWZnLCAjZmZmZmZmKTsgfVxcclxcblxcclxcbi5BUFgtdG9hc3RfX2NvbnRlbnQgeyBsaW5lLWhlaWdodDogMS4zNTsgfVxcclxcblxcclxcbi5BUFgtdG9hc3RfX2Nsb3NlIHtcXHJcXG4gICAgcG9zaXRpb246IGFic29sdXRlO1xcclxcbiAgICB0b3A6IDUwJTsgcmlnaHQ6IDEwcHg7XFxyXFxuICAgIHdpZHRoOiAyNHB4OyBoZWlnaHQ6IDI0cHg7XFxyXFxuICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtNTAlKTtcXHJcXG4gICAgZGlzcGxheTogaW5saW5lLWZsZXg7IGFsaWduLWl0ZW1zOiBjZW50ZXI7IGp1c3RpZnktY29udGVudDogY2VudGVyO1xcclxcbiAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsgY29sb3I6IGN1cnJlbnRDb2xvcjtcXHJcXG4gICAgYm9yZGVyOiAwOyBib3JkZXItcmFkaXVzOiA0cHg7IHBhZGRpbmc6IDA7IG1hcmdpbjogMDtcXHJcXG4gICAgY3Vyc29yOiBwb2ludGVyOyBhcHBlYXJhbmNlOiBub25lOyAtd2Via2l0LWFwcGVhcmFuY2U6IG5vbmU7XFxyXFxuICAgIG9wYWNpdHk6IC43NTsgdHJhbnNpdGlvbjogb3BhY2l0eSAxMjBtcyBlYXNlO1xcclxcbn1cXHJcXG4uQVBYLXRvYXN0X19jbG9zZTpob3ZlciB7IG9wYWNpdHk6IDE7IH1cXHJcXG4uQVBYLXRvYXN0X19jbG9zZTpmb2N1cyB7IG91dGxpbmU6IDJweCBzb2xpZCByZ2JhKDAsMCwwLC4yKTsgb3V0bGluZS1vZmZzZXQ6IDJweDsgfVxcclxcbi5BUFgtdG9hc3RfX2Nsb3NlOjpiZWZvcmUge1xcclxcbiAgICBjb250ZW50OiAnw5cnO1xcclxcbiAgICBmb250LXNpemU6IDE2cHg7IGxpbmUtaGVpZ2h0OiAxOyB0ZXh0LWFsaWduOiBjZW50ZXI7XFxyXFxufVxcclxcblxcclxcbi8qIFByb2dyZXNzIGJhciAob3V0c2lkZSBjb250ZW50LCBmbHVzaCB0byB0b2FzdCBlZGdlcykgKi9cXHJcXG4uQVBYLXRvYXN0X19wcm9ncmVzcyB7XFxyXFxuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXHJcXG4gICAgbGVmdDogMDtcXHJcXG4gICAgcmlnaHQ6IDA7XFxyXFxuICAgIGhlaWdodDogdmFyKC0tYXB4LXRvYXN0LXByb2dyZXNzLWhlaWdodCwgNHB4KTtcXHJcXG4gICAgZGlzcGxheTogZmxleDtcXHJcXG4gICAgZmxleC1kaXJlY3Rpb246IHJvdztcXHJcXG4gICAgYWxpZ24taXRlbXM6IHN0cmV0Y2g7XFxyXFxuICAgIGZsZXgtc2hyaW5rOiAwO1xcclxcbiAgICBib3JkZXItcmFkaXVzOiBpbmhlcml0O1xcclxcbiAgICBvdmVyZmxvdzogdmlzaWJsZTtcXHJcXG59XFxyXFxuLkFQWC10b2FzdF9fcHJvZ3Jlc3MtLXRvcCB7XFxyXFxuICAgIHRvcDogMDtcXHJcXG4gICAgYm9yZGVyLXJhZGl1czogdmFyKC0tYXB4LXRvYXN0LXJhZGl1cywgNnB4KSB2YXIoLS1hcHgtdG9hc3QtcmFkaXVzLCA2cHgpIDAgMDtcXHJcXG59XFxyXFxuLkFQWC10b2FzdF9fcHJvZ3Jlc3MtLWJvdHRvbSB7XFxyXFxuICAgIGJvdHRvbTogMDtcXHJcXG4gICAgYm9yZGVyLXJhZGl1czogMCAwIHZhcigtLWFweC10b2FzdC1yYWRpdXMsIDZweCkgdmFyKC0tYXB4LXRvYXN0LXJhZGl1cywgNnB4KTtcXHJcXG59XFxyXFxuLyogVHJhY2sgY29udGFpbnMgdGhlIGJhcjsgbm8gbWFyZ2luIChwYXVzZSBidXR0b24gaXMgb24gdGhlIGNvcm5lciwgb3ZlcmxhcHBpbmcpICovXFxyXFxuLkFQWC10b2FzdF9fcHJvZ3Jlc3MtdHJhY2sge1xcclxcbiAgICBmbGV4OiAxO1xcclxcbiAgICBtaW4td2lkdGg6IDA7XFxyXFxuICAgIG92ZXJmbG93OiBoaWRkZW47XFxyXFxufVxcclxcbi5BUFgtdG9hc3RfX3Byb2dyZXNzLWJhciB7XFxyXFxuICAgIGhlaWdodDogMTAwJTtcXHJcXG4gICAgd2lkdGg6IDEwMCU7XFxyXFxuICAgIG1heC13aWR0aDogMTAwJTtcXHJcXG4gICAgdHJhbnNpdGlvbjogd2lkdGggODBtcyBsaW5lYXI7XFxyXFxuICAgIGJhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwgMC4yNSk7XFxyXFxufVxcclxcbi5BUFgtdG9hc3QtLWluZm8gLkFQWC10b2FzdF9fcHJvZ3Jlc3MtYmFyIHsgYmFja2dyb3VuZDogcmdiYSg1LCA0NCwgMTAxLCAwLjUpOyB9XFxyXFxuLkFQWC10b2FzdC0tc3VjY2VzcyAuQVBYLXRvYXN0X19wcm9ncmVzcy1iYXIgeyBiYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDAsIDAuMjUpOyB9XFxyXFxuLkFQWC10b2FzdC0td2FybmluZyAuQVBYLXRvYXN0X19wcm9ncmVzcy1iYXIgeyBiYWNrZ3JvdW5kOiByZ2JhKDEwMiwgNzcsIDMsIDAuNSk7IH1cXHJcXG4uQVBYLXRvYXN0LS1kYW5nZXIgLkFQWC10b2FzdF9fcHJvZ3Jlc3MtYmFyIHsgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjI1KTsgfVxcclxcbi8qIFBhdXNlL1Jlc3VtZSBidXR0b246IHJvdW5kLCBjZW50ZXIgZXhhY3RseSBvbiB0b2FzdCBjb3JuZXIgKHRvcC1sZWZ0IG9yIGJvdHRvbS1sZWZ0KSAqL1xcclxcbi5BUFgtdG9hc3RfX3Byb2dyZXNzLXBhdXNlIHtcXHJcXG4gICAgcG9zaXRpb246IGFic29sdXRlO1xcclxcbiAgICB3aWR0aDogdmFyKC0tYXB4LXRvYXN0LXByb2dyZXNzLXBhdXNlLXNpemUsIDE4cHgpO1xcclxcbiAgICBoZWlnaHQ6IHZhcigtLWFweC10b2FzdC1wcm9ncmVzcy1wYXVzZS1zaXplLCAxOHB4KTtcXHJcXG4gICAgbGVmdDogMDtcXHJcXG4gICAgZGlzcGxheTogaW5saW5lLWZsZXg7XFxyXFxuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XFxyXFxuICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xcclxcbiAgICBiYWNrZ3JvdW5kOiAjZWVlO1xcclxcbiAgICBjb2xvcjogY3VycmVudENvbG9yO1xcclxcbiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDAsIDAsIDAsIDAuMzUpO1xcclxcbiAgICBib3JkZXItcmFkaXVzOiA1MCU7XFxyXFxuICAgIHBhZGRpbmc6IDA7XFxyXFxuICAgIG1hcmdpbjogMDtcXHJcXG4gICAgY3Vyc29yOiBwb2ludGVyO1xcclxcbiAgICBsaW5lLWhlaWdodDogMTtcXHJcXG4gICAgb3BhY2l0eTogMC45NTtcXHJcXG4gICAgdHJhbnNpdGlvbjogb3BhY2l0eSAxMjBtcyBlYXNlO1xcclxcbiAgICBmbGV4LXNocmluazogMDtcXHJcXG59XFxyXFxuLkFQWC10b2FzdF9fcHJvZ3Jlc3MtLXRvcCAuQVBYLXRvYXN0X19wcm9ncmVzcy1wYXVzZSB7XFxyXFxuICAgIHRvcDogMDtcXHJcXG4gICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTUwJSwgLTUwJSk7XFxyXFxufVxcclxcbi5BUFgtdG9hc3RfX3Byb2dyZXNzLS1ib3R0b20gLkFQWC10b2FzdF9fcHJvZ3Jlc3MtcGF1c2Uge1xcclxcbiAgICBib3R0b206IDA7XFxyXFxuICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlKC01MCUsIDUwJSk7XFxyXFxufVxcclxcbi5BUFgtdG9hc3QtLWluZm8gLkFQWC10b2FzdF9fcHJvZ3Jlc3MtcGF1c2UgeyBiYWNrZ3JvdW5kOiB2YXIoLS1hcHgtdG9hc3QtaW5mby1iZywgIzBkY2FmMCk7IGJvcmRlci1jb2xvcjogcmdiYSg1LCA0NCwgMTAxLCAwLjU1KTsgfVxcclxcbi5BUFgtdG9hc3QtLXN1Y2Nlc3MgLkFQWC10b2FzdF9fcHJvZ3Jlc3MtcGF1c2UgeyBiYWNrZ3JvdW5kOiB2YXIoLS1hcHgtdG9hc3Qtc3VjY2Vzcy1iZywgIzE5ODc1NCk7IGJvcmRlci1jb2xvcjogcmdiYSgwLCAwLCAwLCAwLjMpOyB9XFxyXFxuLkFQWC10b2FzdC0td2FybmluZyAuQVBYLXRvYXN0X19wcm9ncmVzcy1wYXVzZSB7IGJhY2tncm91bmQ6IHZhcigtLWFweC10b2FzdC13YXJuaW5nLWJnLCAjZmZjMTA3KTsgYm9yZGVyLWNvbG9yOiByZ2JhKDEwMiwgNzcsIDMsIDAuNik7IH1cXHJcXG4uQVBYLXRvYXN0LS1kYW5nZXIgLkFQWC10b2FzdF9fcHJvZ3Jlc3MtcGF1c2UgeyBiYWNrZ3JvdW5kOiB2YXIoLS1hcHgtdG9hc3QtZGFuZ2VyLWJnLCAjZGMzNTQ1KTsgYm9yZGVyLWNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuMzUpOyB9XFxyXFxuLkFQWC10b2FzdF9fcHJvZ3Jlc3MtcGF1c2U6aG92ZXIgeyBvcGFjaXR5OiAxOyB9XFxyXFxuLkFQWC10b2FzdF9fcHJvZ3Jlc3MtcGF1c2U6Zm9jdXMgeyBvdXRsaW5lOiAycHggc29saWQgcmdiYSgwLDAsMCwuNCk7IG91dGxpbmUtb2Zmc2V0OiAtMnB4OyB9XFxyXFxuLkFQWC10b2FzdF9fcHJvZ3Jlc3MtcGF1c2Ugc3ZnIHtcXHJcXG4gICAgd2lkdGg6IDEwcHg7XFxyXFxuICAgIGhlaWdodDogMTBweDtcXHJcXG4gICAgZGlzcGxheTogYmxvY2s7XFxyXFxufVxcclxcbi8qIEV4dHJhIHRvcC9ib3R0b20gcGFkZGluZyB3aGVuIHByb2dyZXNzIGJhciBpcyBwcmVzZW50IChkZWZhdWx0IGNvbnRlbnQgcGFkZGluZyAxMHB4ICsgYmFyIGhlaWdodCkgKi9cXHJcXG4uQVBYLXRvYXN0LS1oYXMtcHJvZ3Jlc3MtdG9wIHsgcGFkZGluZy10b3A6IGNhbGMoMTBweCArIHZhcigtLWFweC10b2FzdC1wcm9ncmVzcy1oZWlnaHQsIDRweCkpOyB9XFxyXFxuLkFQWC10b2FzdC0taGFzLXByb2dyZXNzLWJvdHRvbSB7IHBhZGRpbmctYm90dG9tOiBjYWxjKDEwcHggKyB2YXIoLS1hcHgtdG9hc3QtcHJvZ3Jlc3MtaGVpZ2h0LCA0cHgpKTsgfVxcclxcbi8qIFJlc2VydmUgc3BhY2UgZm9yIHN0YWNraW5nIHdoZW4gcGF1c2UgYnV0dG9uIGlzIHByZXNlbnQgKGJ1dHRvbiBleHRlbmRzIG91dHNpZGUgdG9hc3QgY29ybmVyKSAqL1xcclxcbi5BUFgtdG9hc3QtLWhhcy1wcm9ncmVzcy10b3AuQVBYLXRvYXN0LS1oYXMtcHJvZ3Jlc3MtcGF1c2UgeyBtYXJnaW4tdG9wOiBjYWxjKHZhcigtLWFweC10b2FzdC1wcm9ncmVzcy1wYXVzZS1zaXplLCAxOHB4KSAvIDIpOyB9XFxyXFxuLkFQWC10b2FzdC0taGFzLXByb2dyZXNzLWJvdHRvbS5BUFgtdG9hc3QtLWhhcy1wcm9ncmVzcy1wYXVzZSB7IG1hcmdpbi1ib3R0b206IGNhbGModmFyKC0tYXB4LXRvYXN0LXByb2dyZXNzLXBhdXNlLXNpemUsIDE4cHgpIC8gMik7IH1cXHJcXG5cXHJcXG4vKiBBbmltYXRpb25zICovXFxyXFxuLkFQWC10b2FzdC0tZW50ZXIgeyBvcGFjaXR5OiAwOyB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoOHB4KTsgfVxcclxcbi5BUFgtdG9hc3QtLWVudGVyLkFQWC10b2FzdC0tZW50ZXItYWN0aXZlIHsgb3BhY2l0eTogMTsgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKDApOyB9XFxyXFxuLkFQWC10b2FzdC0tZXhpdCB7IG9wYWNpdHk6IDE7IHRyYW5zZm9ybTogdHJhbnNsYXRlWSgwKTsgfVxcclxcbi5BUFgtdG9hc3QtLWV4aXQuQVBYLXRvYXN0LS1leGl0LWFjdGl2ZSB7IG9wYWNpdHk6IDA7IHRyYW5zZm9ybTogdHJhbnNsYXRlWSg4cHgpOyB9XFxyXFxuXFxyXFxuXFxyXFxuXCJdLFwic291cmNlUm9vdFwiOlwiXCJ9XSk7XG4vLyBFeHBvcnRzXG5leHBvcnQgZGVmYXVsdCBfX19DU1NfTE9BREVSX0VYUE9SVF9fXztcbiIsIi8vIEltcG9ydHNcbmltcG9ydCBfX19DU1NfTE9BREVSX0FQSV9TT1VSQ0VNQVBfSU1QT1JUX19fIGZyb20gXCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L3J1bnRpbWUvc291cmNlTWFwcy5qc1wiO1xuaW1wb3J0IF9fX0NTU19MT0FERVJfQVBJX0lNUE9SVF9fXyBmcm9tIFwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL2FwaS5qc1wiO1xuaW1wb3J0IF9fX0NTU19MT0FERVJfR0VUX1VSTF9JTVBPUlRfX18gZnJvbSBcIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9nZXRVcmwuanNcIjtcbnZhciBfX19DU1NfTE9BREVSX1VSTF9JTVBPUlRfMF9fXyA9IG5ldyBVUkwoXCJkYXRhOmltYWdlL3N2Zyt4bWwsJTNDc3ZnJTIweG1sbnMlM0QlMjdodHRwJTNBLy93d3cudzMub3JnLzIwMDAvc3ZnJTI3JTIwd2lkdGglM0QlMjczMiUyNyUyMGhlaWdodCUzRCUyNzMyJTI3JTNFJTNDcGF0aCUyMCUyMGZpbGwlM0QlMjIlMjNjY2NjY2MlMjIlMjBkJTNEJTIyTTI1LjEwNyUyMDMyLjAzMGgtMTguMjE0Yy0zLjQ1NiUyMDAtNi4yNjgtMi44MS02LjI2OC02LjI2NHYtMTkuNTI5YzAtMy40NTYlMjAyLjgxMi02LjI2OCUyMDYuMjY4LTYuMjY4aDE4LjIxNGMzLjQ1NiUyMDAlMjA2LjI2OCUyMDIuODEyJTIwNi4yNjglMjA2LjI2OHYxOS41MjljMCUyMDMuNDUyLTIuODEyJTIwNi4yNjQtNi4yNjglMjA2LjI2NHpNNi44OTMlMjAxLjg1Yy0yLjQxOSUyMDAtNC4zODYlMjAxLjk2Ny00LjM4NiUyMDQuMzg2djE5LjUyOWMwJTIwMi40MTclMjAxLjk2NyUyMDQuMzgyJTIwNC4zODYlMjA0LjM4MmgxOC4yMTRjMi40MTklMjAwJTIwNC4zODYtMS45NjUlMjA0LjM4Ni00LjM4MnYtMTkuNTI5YzAtMi40MTktMS45NjctNC4zODYtNC4zODYtNC4zODZoLTE4LjIxNHolMjIlM0UlM0MvcGF0aCUzRSUzQy9zdmclM0VcIiwgaW1wb3J0Lm1ldGEudXJsKTtcbnZhciBfX19DU1NfTE9BREVSX1VSTF9JTVBPUlRfMV9fXyA9IG5ldyBVUkwoXCJkYXRhOmltYWdlL3N2Zyt4bWwsJTNDc3ZnJTIweG1sbnMlM0QlMjdodHRwJTNBLy93d3cudzMub3JnLzIwMDAvc3ZnJTI3JTIwd2lkdGglM0QlMjczMiUyNyUyMGhlaWdodCUzRCUyNzMyJTI3JTNFJTNDcGF0aCUyMGZpbGwlM0QlMjIlMjMwNjU0YmElMjIlMjBkJTNEJTIyTTAuNTQzJTIwNS42NDdjMC0zLjExOSUyMDIuNTMxLTUuNjQ3JTIwNS42NS01LjY0N2gxOS4zMDljMy4xMiUyMDAlMjA1LjY1JTIwMi41MTElMjA1LjY1JTIwNS42NDd2MjAuNzA1YzAlMjAzLjExOS0yLjUzMSUyMDUuNjQ3LTUuNjUlMjA1LjY0N2gtMTkuMzA5Yy0zLjEyJTIwMC01LjY1LTIuNTExLTUuNjUtNS42NDd2LTIwLjcwNXpNNS4zMTMlMjAxNy41ODdsNy4wMzklMjA2LjgzOSUyMDEzLjgzMS0xMy40MzktMi42MzYtMi41NjEtMTAuOTI5JTIwMTAuNjItNC40NDItNC4zMTctMi44NjIlMjAyLjg1OHolMjIlM0UlM0MvcGF0aCUzRSUzQy9zdmclM0VcIiwgaW1wb3J0Lm1ldGEudXJsKTtcbnZhciBfX19DU1NfTE9BREVSX1VSTF9JTVBPUlRfMl9fXyA9IG5ldyBVUkwoXCJkYXRhOmltYWdlL3N2Zyt4bWwsJTNDJTNGeG1sJTIwdmVyc2lvbiUzRCUyMjEuMCUyMiUyMGVuY29kaW5nJTNEJTIyVVRGLTglMjIlM0YlM0UlM0NzdmclMjB2aWV3Qm94JTNEJTIyMCUyMDAlMjAzMiUyMDMyJTIyJTIweG1sbnMlM0QlMjJodHRwJTNBJTJGJTJGd3d3LnczLm9yZyUyRjIwMDAlMkZzdmclMjIlM0UlM0NwYXRoJTIwZCUzRCUyMm0wLjU0MyUyMDUuNjQ3YzAtMy4xMTklMjAyLjUzMS01LjY0NyUyMDUuNjUtNS42NDdoMTkuMzA5YzMuMTIlMjAwJTIwNS42NSUyMDIuNTExJTIwNS42NSUyMDUuNjQ3djIwLjcwNWMwJTIwMy4xMTktMi41MzElMjA1LjY0Ny01LjY1JTIwNS42NDdoLTE5LjMwOWMtMy4xMiUyMDAtNS42NS0yLjUxMS01LjY1LTUuNjQ3di0yMC43MDV6JTIyJTIwZmlsbCUzRCUyMiUyM2YwMCUyMiUyRiUzRSUzQ3BhdGglMjBkJTNEJTIybTglMjA4JTIwMTYlMjAxNiUyMiUyMHN0cm9rZSUzRCUyMiUyM2ZmZiUyMiUyMHN0cm9rZS13aWR0aCUzRCUyMjIlMjIlMkYlM0UlM0NwYXRoJTIwZCUzRCUyMk0yNCUyMDhMOCUyMDI0JTIyJTIwc3Ryb2tlJTNEJTIyJTIzZmZmJTIyJTIwc3Ryb2tlLXdpZHRoJTNEJTIyMiUyMiUyRiUzRSUzQyUyRnN2ZyUzRVwiLCBpbXBvcnQubWV0YS51cmwpO1xudmFyIF9fX0NTU19MT0FERVJfRVhQT1JUX19fID0gX19fQ1NTX0xPQURFUl9BUElfSU1QT1JUX19fKF9fX0NTU19MT0FERVJfQVBJX1NPVVJDRU1BUF9JTVBPUlRfX18pO1xudmFyIF9fX0NTU19MT0FERVJfVVJMX1JFUExBQ0VNRU5UXzBfX18gPSBfX19DU1NfTE9BREVSX0dFVF9VUkxfSU1QT1JUX19fKF9fX0NTU19MT0FERVJfVVJMX0lNUE9SVF8wX19fKTtcbnZhciBfX19DU1NfTE9BREVSX1VSTF9SRVBMQUNFTUVOVF8xX19fID0gX19fQ1NTX0xPQURFUl9HRVRfVVJMX0lNUE9SVF9fXyhfX19DU1NfTE9BREVSX1VSTF9JTVBPUlRfMV9fXyk7XG52YXIgX19fQ1NTX0xPQURFUl9VUkxfUkVQTEFDRU1FTlRfMl9fXyA9IF9fX0NTU19MT0FERVJfR0VUX1VSTF9JTVBPUlRfX18oX19fQ1NTX0xPQURFUl9VUkxfSU1QT1JUXzJfX18pO1xuLy8gTW9kdWxlXG5fX19DU1NfTE9BREVSX0VYUE9SVF9fXy5wdXNoKFttb2R1bGUuaWQsIGAuYXB4LXRyaXN0YXRlIHtcclxuICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcclxuICAgIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7XHJcbiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XHJcbiAgICBjdXJzb3I6IHBvaW50ZXI7XHJcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XHJcbiAgICBtaW4td2lkdGg6MTNweDtcclxuICAgIG1pbi1oZWlnaHQ6MTNweDtcclxuICAgIGJhY2tncm91bmQtc2l6ZTogY29udGFpbjtcclxuICAgIGJhY2tncm91bmQtY29sb3I6IHdoaXRlO1xyXG4gICAgYm9yZGVyLXJhZGl1czozcHg7XHJcbn1cclxuLmFweC10cmlzdGF0ZS51bmNoZWNrZWQge1xyXG4gICAgYmFja2dyb3VuZC1pbWFnZTogdXJsKCR7X19fQ1NTX0xPQURFUl9VUkxfUkVQTEFDRU1FTlRfMF9fX30pO1xyXG59XHJcbi5hcHgtdHJpc3RhdGUuY2hlY2tlZCB7XHJcbiAgICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoJHtfX19DU1NfTE9BREVSX1VSTF9SRVBMQUNFTUVOVF8xX19ffSk7XHJcbiAgICBiYWNrZ3JvdW5kLXJlcGVhdDogbm8tcmVwZWF0O1xyXG4gICAgYmFja2dyb3VuZC1wb3NpdGlvbjogY2VudGVyO1xyXG59XHJcbi5hcHgtdHJpc3RhdGUuY3Jvc3NlZCB7XHJcbiAgICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoJHtfX19DU1NfTE9BREVSX1VSTF9SRVBMQUNFTUVOVF8yX19ffSk7XHJcbiAgICBiYWNrZ3JvdW5kLXJlcGVhdDogbm8tcmVwZWF0O1xyXG4gICAgYmFja2dyb3VuZC1wb3NpdGlvbjogY2VudGVyO1xyXG59YCwgXCJcIix7XCJ2ZXJzaW9uXCI6MyxcInNvdXJjZXNcIjpbXCJ3ZWJwYWNrOi8vLi9tb2R1bGVzL3RyaXN0YXRlL2Nzcy90cmlzdGF0ZS5jc3NcIl0sXCJuYW1lc1wiOltdLFwibWFwcGluZ3NcIjpcIkFBQUE7SUFDSSxxQkFBcUI7SUFDckIsc0JBQXNCO0lBQ3RCLGtCQUFrQjtJQUNsQixlQUFlO0lBQ2Ysa0JBQWtCO0lBQ2xCLGNBQWM7SUFDZCxlQUFlO0lBQ2Ysd0JBQXdCO0lBQ3hCLHVCQUF1QjtJQUN2QixpQkFBaUI7QUFDckI7QUFDQTtJQUNJLHlEQUF5bEI7QUFDN2xCO0FBQ0E7SUFDSSx5REFBNmU7SUFDN2UsNEJBQTRCO0lBQzVCLDJCQUEyQjtBQUMvQjtBQUNBO0lBQ0kseURBQXNuQjtJQUN0bkIsNEJBQTRCO0lBQzVCLDJCQUEyQjtBQUMvQlwiLFwic291cmNlc0NvbnRlbnRcIjpbXCIuYXB4LXRyaXN0YXRlIHtcXHJcXG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xcclxcbiAgICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO1xcclxcbiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XFxyXFxuICAgIGN1cnNvcjogcG9pbnRlcjtcXHJcXG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xcclxcbiAgICBtaW4td2lkdGg6MTNweDtcXHJcXG4gICAgbWluLWhlaWdodDoxM3B4O1xcclxcbiAgICBiYWNrZ3JvdW5kLXNpemU6IGNvbnRhaW47XFxyXFxuICAgIGJhY2tncm91bmQtY29sb3I6IHdoaXRlO1xcclxcbiAgICBib3JkZXItcmFkaXVzOjNweDtcXHJcXG59XFxyXFxuLmFweC10cmlzdGF0ZS51bmNoZWNrZWQge1xcclxcbiAgICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoJ2RhdGE6aW1hZ2Uvc3ZnK3htbCwlM0NzdmclMjB4bWxucyUzRCUyN2h0dHAlM0EvL3d3dy53My5vcmcvMjAwMC9zdmclMjclMjB3aWR0aCUzRCUyNzMyJTI3JTIwaGVpZ2h0JTNEJTI3MzIlMjclM0UlM0NwYXRoJTIwJTIwZmlsbCUzRCUyMiUyM2NjY2NjYyUyMiUyMGQlM0QlMjJNMjUuMTA3JTIwMzIuMDMwaC0xOC4yMTRjLTMuNDU2JTIwMC02LjI2OC0yLjgxLTYuMjY4LTYuMjY0di0xOS41MjljMC0zLjQ1NiUyMDIuODEyLTYuMjY4JTIwNi4yNjgtNi4yNjhoMTguMjE0YzMuNDU2JTIwMCUyMDYuMjY4JTIwMi44MTIlMjA2LjI2OCUyMDYuMjY4djE5LjUyOWMwJTIwMy40NTItMi44MTIlMjA2LjI2NC02LjI2OCUyMDYuMjY0ek02Ljg5MyUyMDEuODVjLTIuNDE5JTIwMC00LjM4NiUyMDEuOTY3LTQuMzg2JTIwNC4zODZ2MTkuNTI5YzAlMjAyLjQxNyUyMDEuOTY3JTIwNC4zODIlMjA0LjM4NiUyMDQuMzgyaDE4LjIxNGMyLjQxOSUyMDAlMjA0LjM4Ni0xLjk2NSUyMDQuMzg2LTQuMzgydi0xOS41MjljMC0yLjQxOS0xLjk2Ny00LjM4Ni00LjM4Ni00LjM4NmgtMTguMjE0eiUyMiUzRSUzQy9wYXRoJTNFJTNDL3N2ZyUzRScpO1xcclxcbn1cXHJcXG4uYXB4LXRyaXN0YXRlLmNoZWNrZWQge1xcclxcbiAgICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoJ2RhdGE6aW1hZ2Uvc3ZnK3htbCwlM0NzdmclMjB4bWxucyUzRCUyN2h0dHAlM0EvL3d3dy53My5vcmcvMjAwMC9zdmclMjclMjB3aWR0aCUzRCUyNzMyJTI3JTIwaGVpZ2h0JTNEJTI3MzIlMjclM0UlM0NwYXRoJTIwZmlsbCUzRCUyMiUyMzA2NTRiYSUyMiUyMGQlM0QlMjJNMC41NDMlMjA1LjY0N2MwLTMuMTE5JTIwMi41MzEtNS42NDclMjA1LjY1LTUuNjQ3aDE5LjMwOWMzLjEyJTIwMCUyMDUuNjUlMjAyLjUxMSUyMDUuNjUlMjA1LjY0N3YyMC43MDVjMCUyMDMuMTE5LTIuNTMxJTIwNS42NDctNS42NSUyMDUuNjQ3aC0xOS4zMDljLTMuMTIlMjAwLTUuNjUtMi41MTEtNS42NS01LjY0N3YtMjAuNzA1ek01LjMxMyUyMDE3LjU4N2w3LjAzOSUyMDYuODM5JTIwMTMuODMxLTEzLjQzOS0yLjYzNi0yLjU2MS0xMC45MjklMjAxMC42Mi00LjQ0Mi00LjMxNy0yLjg2MiUyMDIuODU4eiUyMiUzRSUzQy9wYXRoJTNFJTNDL3N2ZyUzRScpO1xcclxcbiAgICBiYWNrZ3JvdW5kLXJlcGVhdDogbm8tcmVwZWF0O1xcclxcbiAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiBjZW50ZXI7XFxyXFxufVxcclxcbi5hcHgtdHJpc3RhdGUuY3Jvc3NlZCB7XFxyXFxuICAgIGJhY2tncm91bmQtaW1hZ2U6IHVybCgnZGF0YTppbWFnZS9zdmcreG1sLCUzQyUzRnhtbCUyMHZlcnNpb24lM0QlMjIxLjAlMjIlMjBlbmNvZGluZyUzRCUyMlVURi04JTIyJTNGJTNFJTNDc3ZnJTIwdmlld0JveCUzRCUyMjAlMjAwJTIwMzIlMjAzMiUyMiUyMHhtbG5zJTNEJTIyaHR0cCUzQSUyRiUyRnd3dy53My5vcmclMkYyMDAwJTJGc3ZnJTIyJTNFJTNDcGF0aCUyMGQlM0QlMjJtMC41NDMlMjA1LjY0N2MwLTMuMTE5JTIwMi41MzEtNS42NDclMjA1LjY1LTUuNjQ3aDE5LjMwOWMzLjEyJTIwMCUyMDUuNjUlMjAyLjUxMSUyMDUuNjUlMjA1LjY0N3YyMC43MDVjMCUyMDMuMTE5LTIuNTMxJTIwNS42NDctNS42NSUyMDUuNjQ3aC0xOS4zMDljLTMuMTIlMjAwLTUuNjUtMi41MTEtNS42NS01LjY0N3YtMjAuNzA1eiUyMiUyMGZpbGwlM0QlMjIlMjNmMDAlMjIlMkYlM0UlM0NwYXRoJTIwZCUzRCUyMm04JTIwOCUyMDE2JTIwMTYlMjIlMjBzdHJva2UlM0QlMjIlMjNmZmYlMjIlMjBzdHJva2Utd2lkdGglM0QlMjIyJTIyJTJGJTNFJTNDcGF0aCUyMGQlM0QlMjJNMjQlMjA4TDglMjAyNCUyMiUyMHN0cm9rZSUzRCUyMiUyM2ZmZiUyMiUyMHN0cm9rZS13aWR0aCUzRCUyMjIlMjIlMkYlM0UlM0MlMkZzdmclM0UnKTtcXHJcXG4gICAgYmFja2dyb3VuZC1yZXBlYXQ6IG5vLXJlcGVhdDtcXHJcXG4gICAgYmFja2dyb3VuZC1wb3NpdGlvbjogY2VudGVyO1xcclxcbn1cIl0sXCJzb3VyY2VSb290XCI6XCJcIn1dKTtcbi8vIEV4cG9ydHNcbmV4cG9ydCBkZWZhdWx0IF9fX0NTU19MT0FERVJfRVhQT1JUX19fO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbi8qXG4gIE1JVCBMaWNlbnNlIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbWl0LWxpY2Vuc2UucGhwXG4gIEF1dGhvciBUb2JpYXMgS29wcGVycyBAc29rcmFcbiovXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChjc3NXaXRoTWFwcGluZ1RvU3RyaW5nKSB7XG4gIHZhciBsaXN0ID0gW107XG5cbiAgLy8gcmV0dXJuIHRoZSBsaXN0IG9mIG1vZHVsZXMgYXMgY3NzIHN0cmluZ1xuICBsaXN0LnRvU3RyaW5nID0gZnVuY3Rpb24gdG9TdHJpbmcoKSB7XG4gICAgcmV0dXJuIHRoaXMubWFwKGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgICB2YXIgY29udGVudCA9IFwiXCI7XG4gICAgICB2YXIgbmVlZExheWVyID0gdHlwZW9mIGl0ZW1bNV0gIT09IFwidW5kZWZpbmVkXCI7XG4gICAgICBpZiAoaXRlbVs0XSkge1xuICAgICAgICBjb250ZW50ICs9IFwiQHN1cHBvcnRzIChcIi5jb25jYXQoaXRlbVs0XSwgXCIpIHtcIik7XG4gICAgICB9XG4gICAgICBpZiAoaXRlbVsyXSkge1xuICAgICAgICBjb250ZW50ICs9IFwiQG1lZGlhIFwiLmNvbmNhdChpdGVtWzJdLCBcIiB7XCIpO1xuICAgICAgfVxuICAgICAgaWYgKG5lZWRMYXllcikge1xuICAgICAgICBjb250ZW50ICs9IFwiQGxheWVyXCIuY29uY2F0KGl0ZW1bNV0ubGVuZ3RoID4gMCA/IFwiIFwiLmNvbmNhdChpdGVtWzVdKSA6IFwiXCIsIFwiIHtcIik7XG4gICAgICB9XG4gICAgICBjb250ZW50ICs9IGNzc1dpdGhNYXBwaW5nVG9TdHJpbmcoaXRlbSk7XG4gICAgICBpZiAobmVlZExheWVyKSB7XG4gICAgICAgIGNvbnRlbnQgKz0gXCJ9XCI7XG4gICAgICB9XG4gICAgICBpZiAoaXRlbVsyXSkge1xuICAgICAgICBjb250ZW50ICs9IFwifVwiO1xuICAgICAgfVxuICAgICAgaWYgKGl0ZW1bNF0pIHtcbiAgICAgICAgY29udGVudCArPSBcIn1cIjtcbiAgICAgIH1cbiAgICAgIHJldHVybiBjb250ZW50O1xuICAgIH0pLmpvaW4oXCJcIik7XG4gIH07XG5cbiAgLy8gaW1wb3J0IGEgbGlzdCBvZiBtb2R1bGVzIGludG8gdGhlIGxpc3RcbiAgbGlzdC5pID0gZnVuY3Rpb24gaShtb2R1bGVzLCBtZWRpYSwgZGVkdXBlLCBzdXBwb3J0cywgbGF5ZXIpIHtcbiAgICBpZiAodHlwZW9mIG1vZHVsZXMgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgIG1vZHVsZXMgPSBbW251bGwsIG1vZHVsZXMsIHVuZGVmaW5lZF1dO1xuICAgIH1cbiAgICB2YXIgYWxyZWFkeUltcG9ydGVkTW9kdWxlcyA9IHt9O1xuICAgIGlmIChkZWR1cGUpIHtcbiAgICAgIGZvciAodmFyIGsgPSAwOyBrIDwgdGhpcy5sZW5ndGg7IGsrKykge1xuICAgICAgICB2YXIgaWQgPSB0aGlzW2tdWzBdO1xuICAgICAgICBpZiAoaWQgIT0gbnVsbCkge1xuICAgICAgICAgIGFscmVhZHlJbXBvcnRlZE1vZHVsZXNbaWRdID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBmb3IgKHZhciBfayA9IDA7IF9rIDwgbW9kdWxlcy5sZW5ndGg7IF9rKyspIHtcbiAgICAgIHZhciBpdGVtID0gW10uY29uY2F0KG1vZHVsZXNbX2tdKTtcbiAgICAgIGlmIChkZWR1cGUgJiYgYWxyZWFkeUltcG9ydGVkTW9kdWxlc1tpdGVtWzBdXSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGlmICh0eXBlb2YgbGF5ZXIgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBpdGVtWzVdID09PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgICAgaXRlbVs1XSA9IGxheWVyO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGl0ZW1bMV0gPSBcIkBsYXllclwiLmNvbmNhdChpdGVtWzVdLmxlbmd0aCA+IDAgPyBcIiBcIi5jb25jYXQoaXRlbVs1XSkgOiBcIlwiLCBcIiB7XCIpLmNvbmNhdChpdGVtWzFdLCBcIn1cIik7XG4gICAgICAgICAgaXRlbVs1XSA9IGxheWVyO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAobWVkaWEpIHtcbiAgICAgICAgaWYgKCFpdGVtWzJdKSB7XG4gICAgICAgICAgaXRlbVsyXSA9IG1lZGlhO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGl0ZW1bMV0gPSBcIkBtZWRpYSBcIi5jb25jYXQoaXRlbVsyXSwgXCIge1wiKS5jb25jYXQoaXRlbVsxXSwgXCJ9XCIpO1xuICAgICAgICAgIGl0ZW1bMl0gPSBtZWRpYTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHN1cHBvcnRzKSB7XG4gICAgICAgIGlmICghaXRlbVs0XSkge1xuICAgICAgICAgIGl0ZW1bNF0gPSBcIlwiLmNvbmNhdChzdXBwb3J0cyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaXRlbVsxXSA9IFwiQHN1cHBvcnRzIChcIi5jb25jYXQoaXRlbVs0XSwgXCIpIHtcIikuY29uY2F0KGl0ZW1bMV0sIFwifVwiKTtcbiAgICAgICAgICBpdGVtWzRdID0gc3VwcG9ydHM7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGxpc3QucHVzaChpdGVtKTtcbiAgICB9XG4gIH07XG4gIHJldHVybiBsaXN0O1xufTsiLCJcInVzZSBzdHJpY3RcIjtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAodXJsLCBvcHRpb25zKSB7XG4gIGlmICghb3B0aW9ucykge1xuICAgIG9wdGlvbnMgPSB7fTtcbiAgfVxuICBpZiAoIXVybCkge1xuICAgIHJldHVybiB1cmw7XG4gIH1cbiAgdXJsID0gU3RyaW5nKHVybC5fX2VzTW9kdWxlID8gdXJsLmRlZmF1bHQgOiB1cmwpO1xuXG4gIC8vIElmIHVybCBpcyBhbHJlYWR5IHdyYXBwZWQgaW4gcXVvdGVzLCByZW1vdmUgdGhlbVxuICBpZiAoL15bJ1wiXS4qWydcIl0kLy50ZXN0KHVybCkpIHtcbiAgICB1cmwgPSB1cmwuc2xpY2UoMSwgLTEpO1xuICB9XG4gIGlmIChvcHRpb25zLmhhc2gpIHtcbiAgICB1cmwgKz0gb3B0aW9ucy5oYXNoO1xuICB9XG5cbiAgLy8gU2hvdWxkIHVybCBiZSB3cmFwcGVkP1xuICAvLyBTZWUgaHR0cHM6Ly9kcmFmdHMuY3Nzd2cub3JnL2Nzcy12YWx1ZXMtMy8jdXJsc1xuICBpZiAoL1tcIicoKSBcXHRcXG5dfCglMjApLy50ZXN0KHVybCkgfHwgb3B0aW9ucy5uZWVkUXVvdGVzKSB7XG4gICAgcmV0dXJuIFwiXFxcIlwiLmNvbmNhdCh1cmwucmVwbGFjZSgvXCIvZywgJ1xcXFxcIicpLnJlcGxhY2UoL1xcbi9nLCBcIlxcXFxuXCIpLCBcIlxcXCJcIik7XG4gIH1cbiAgcmV0dXJuIHVybDtcbn07IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0ZW0pIHtcbiAgdmFyIGNvbnRlbnQgPSBpdGVtWzFdO1xuICB2YXIgY3NzTWFwcGluZyA9IGl0ZW1bM107XG4gIGlmICghY3NzTWFwcGluZykge1xuICAgIHJldHVybiBjb250ZW50O1xuICB9XG4gIGlmICh0eXBlb2YgYnRvYSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgdmFyIGJhc2U2NCA9IGJ0b2EodW5lc2NhcGUoZW5jb2RlVVJJQ29tcG9uZW50KEpTT04uc3RyaW5naWZ5KGNzc01hcHBpbmcpKSkpO1xuICAgIHZhciBkYXRhID0gXCJzb3VyY2VNYXBwaW5nVVJMPWRhdGE6YXBwbGljYXRpb24vanNvbjtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxcIi5jb25jYXQoYmFzZTY0KTtcbiAgICB2YXIgc291cmNlTWFwcGluZyA9IFwiLyojIFwiLmNvbmNhdChkYXRhLCBcIiAqL1wiKTtcbiAgICByZXR1cm4gW2NvbnRlbnRdLmNvbmNhdChbc291cmNlTWFwcGluZ10pLmpvaW4oXCJcXG5cIik7XG4gIH1cbiAgcmV0dXJuIFtjb250ZW50XS5qb2luKFwiXFxuXCIpO1xufTsiLCIvLyBNb2R1bGVcbnZhciBjb2RlID0gXCI8ZGl2IGNsYXNzPVxcXCJBUFgtZGlhbG9nXFxcIj5cXHJcXG4gICAgPGRpdiBjbGFzcz1cXFwiQVBYLWRpYWxvZy1jb250ZW50XFxcIj5cXHJcXG4gICAgICAgIDxzcGFuIGNsYXNzPVxcXCJBUFgtY2xvc2UtZGlhbG9nXFxcIj4mdGltZXM7PC9zcGFuPlxcclxcbiAgICAgICAgPGgyIGNsYXNzPVxcXCJBUFgtZGlhbG9nLXRpdGxlXFxcIj48L2gyPlxcclxcbiAgICAgICAgPGRpdiBjbGFzcz1cXFwiQVBYLWRpYWxvZy1keW5hbWljLWNvbnRlbnRcXFwiPjwvZGl2PlxcclxcbiAgICAgICAgPGRpdiBjbGFzcz1cXFwiQVBYLWRpYWxvZy1idXR0b24tY29udGFpbmVyXFxcIj48L2Rpdj5cXHJcXG4gICAgPC9kaXY+XFxyXFxuPC9kaXY+XCI7XG4vLyBFeHBvcnRzXG5tb2R1bGUuZXhwb3J0cyA9IGNvZGU7IiwiXG4gICAgICBpbXBvcnQgQVBJIGZyb20gXCIhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5qZWN0U3R5bGVzSW50b1N0eWxlVGFnLmpzXCI7XG4gICAgICBpbXBvcnQgZG9tQVBJIGZyb20gXCIhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvc3R5bGVEb21BUEkuanNcIjtcbiAgICAgIGltcG9ydCBpbnNlcnRGbiBmcm9tIFwiIS4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luc2VydEJ5U2VsZWN0b3IuanNcIjtcbiAgICAgIGltcG9ydCBzZXRBdHRyaWJ1dGVzIGZyb20gXCIhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvc2V0QXR0cmlidXRlc1dpdGhvdXRBdHRyaWJ1dGVzLmpzXCI7XG4gICAgICBpbXBvcnQgaW5zZXJ0U3R5bGVFbGVtZW50IGZyb20gXCIhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5zZXJ0U3R5bGVFbGVtZW50LmpzXCI7XG4gICAgICBpbXBvcnQgc3R5bGVUYWdUcmFuc2Zvcm1GbiBmcm9tIFwiIS4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL3N0eWxlVGFnVHJhbnNmb3JtLmpzXCI7XG4gICAgICBpbXBvcnQgY29udGVudCwgKiBhcyBuYW1lZEV4cG9ydCBmcm9tIFwiISEuLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L2Nqcy5qcyEuL2RpYWxvZy5jc3NcIjtcbiAgICAgIFxuICAgICAgXG5cbnZhciBvcHRpb25zID0ge307XG5cbm9wdGlvbnMuc3R5bGVUYWdUcmFuc2Zvcm0gPSBzdHlsZVRhZ1RyYW5zZm9ybUZuO1xub3B0aW9ucy5zZXRBdHRyaWJ1dGVzID0gc2V0QXR0cmlidXRlcztcblxuICAgICAgb3B0aW9ucy5pbnNlcnQgPSBpbnNlcnRGbi5iaW5kKG51bGwsIFwiaGVhZFwiKTtcbiAgICBcbm9wdGlvbnMuZG9tQVBJID0gZG9tQVBJO1xub3B0aW9ucy5pbnNlcnRTdHlsZUVsZW1lbnQgPSBpbnNlcnRTdHlsZUVsZW1lbnQ7XG5cbnZhciB1cGRhdGUgPSBBUEkoY29udGVudCwgb3B0aW9ucyk7XG5cblxuXG5leHBvcnQgKiBmcm9tIFwiISEuLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L2Nqcy5qcyEuL2RpYWxvZy5jc3NcIjtcbiAgICAgICBleHBvcnQgZGVmYXVsdCBjb250ZW50ICYmIGNvbnRlbnQubG9jYWxzID8gY29udGVudC5sb2NhbHMgOiB1bmRlZmluZWQ7XG4iLCJcbiAgICAgIGltcG9ydCBBUEkgZnJvbSBcIiEuLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbmplY3RTdHlsZXNJbnRvU3R5bGVUYWcuanNcIjtcbiAgICAgIGltcG9ydCBkb21BUEkgZnJvbSBcIiEuLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9zdHlsZURvbUFQSS5qc1wiO1xuICAgICAgaW1wb3J0IGluc2VydEZuIGZyb20gXCIhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5zZXJ0QnlTZWxlY3Rvci5qc1wiO1xuICAgICAgaW1wb3J0IHNldEF0dHJpYnV0ZXMgZnJvbSBcIiEuLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9zZXRBdHRyaWJ1dGVzV2l0aG91dEF0dHJpYnV0ZXMuanNcIjtcbiAgICAgIGltcG9ydCBpbnNlcnRTdHlsZUVsZW1lbnQgZnJvbSBcIiEuLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbnNlcnRTdHlsZUVsZW1lbnQuanNcIjtcbiAgICAgIGltcG9ydCBzdHlsZVRhZ1RyYW5zZm9ybUZuIGZyb20gXCIhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvc3R5bGVUYWdUcmFuc2Zvcm0uanNcIjtcbiAgICAgIGltcG9ydCBjb250ZW50LCAqIGFzIG5hbWVkRXhwb3J0IGZyb20gXCIhIS4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvY2pzLmpzIS4vdG9hc3QuY3NzXCI7XG4gICAgICBcbiAgICAgIFxuXG52YXIgb3B0aW9ucyA9IHt9O1xuXG5vcHRpb25zLnN0eWxlVGFnVHJhbnNmb3JtID0gc3R5bGVUYWdUcmFuc2Zvcm1Gbjtcbm9wdGlvbnMuc2V0QXR0cmlidXRlcyA9IHNldEF0dHJpYnV0ZXM7XG5cbiAgICAgIG9wdGlvbnMuaW5zZXJ0ID0gaW5zZXJ0Rm4uYmluZChudWxsLCBcImhlYWRcIik7XG4gICAgXG5vcHRpb25zLmRvbUFQSSA9IGRvbUFQSTtcbm9wdGlvbnMuaW5zZXJ0U3R5bGVFbGVtZW50ID0gaW5zZXJ0U3R5bGVFbGVtZW50O1xuXG52YXIgdXBkYXRlID0gQVBJKGNvbnRlbnQsIG9wdGlvbnMpO1xuXG5cblxuZXhwb3J0ICogZnJvbSBcIiEhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9janMuanMhLi90b2FzdC5jc3NcIjtcbiAgICAgICBleHBvcnQgZGVmYXVsdCBjb250ZW50ICYmIGNvbnRlbnQubG9jYWxzID8gY29udGVudC5sb2NhbHMgOiB1bmRlZmluZWQ7XG4iLCJcbiAgICAgIGltcG9ydCBBUEkgZnJvbSBcIiEuLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbmplY3RTdHlsZXNJbnRvU3R5bGVUYWcuanNcIjtcbiAgICAgIGltcG9ydCBkb21BUEkgZnJvbSBcIiEuLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9zdHlsZURvbUFQSS5qc1wiO1xuICAgICAgaW1wb3J0IGluc2VydEZuIGZyb20gXCIhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5zZXJ0QnlTZWxlY3Rvci5qc1wiO1xuICAgICAgaW1wb3J0IHNldEF0dHJpYnV0ZXMgZnJvbSBcIiEuLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9zZXRBdHRyaWJ1dGVzV2l0aG91dEF0dHJpYnV0ZXMuanNcIjtcbiAgICAgIGltcG9ydCBpbnNlcnRTdHlsZUVsZW1lbnQgZnJvbSBcIiEuLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbnNlcnRTdHlsZUVsZW1lbnQuanNcIjtcbiAgICAgIGltcG9ydCBzdHlsZVRhZ1RyYW5zZm9ybUZuIGZyb20gXCIhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvc3R5bGVUYWdUcmFuc2Zvcm0uanNcIjtcbiAgICAgIGltcG9ydCBjb250ZW50LCAqIGFzIG5hbWVkRXhwb3J0IGZyb20gXCIhIS4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvY2pzLmpzIS4vdHJpc3RhdGUuY3NzXCI7XG4gICAgICBcbiAgICAgIFxuXG52YXIgb3B0aW9ucyA9IHt9O1xuXG5vcHRpb25zLnN0eWxlVGFnVHJhbnNmb3JtID0gc3R5bGVUYWdUcmFuc2Zvcm1Gbjtcbm9wdGlvbnMuc2V0QXR0cmlidXRlcyA9IHNldEF0dHJpYnV0ZXM7XG5cbiAgICAgIG9wdGlvbnMuaW5zZXJ0ID0gaW5zZXJ0Rm4uYmluZChudWxsLCBcImhlYWRcIik7XG4gICAgXG5vcHRpb25zLmRvbUFQSSA9IGRvbUFQSTtcbm9wdGlvbnMuaW5zZXJ0U3R5bGVFbGVtZW50ID0gaW5zZXJ0U3R5bGVFbGVtZW50O1xuXG52YXIgdXBkYXRlID0gQVBJKGNvbnRlbnQsIG9wdGlvbnMpO1xuXG5cblxuZXhwb3J0ICogZnJvbSBcIiEhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9janMuanMhLi90cmlzdGF0ZS5jc3NcIjtcbiAgICAgICBleHBvcnQgZGVmYXVsdCBjb250ZW50ICYmIGNvbnRlbnQubG9jYWxzID8gY29udGVudC5sb2NhbHMgOiB1bmRlZmluZWQ7XG4iLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIHN0eWxlc0luRE9NID0gW107XG5mdW5jdGlvbiBnZXRJbmRleEJ5SWRlbnRpZmllcihpZGVudGlmaWVyKSB7XG4gIHZhciByZXN1bHQgPSAtMTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdHlsZXNJbkRPTS5sZW5ndGg7IGkrKykge1xuICAgIGlmIChzdHlsZXNJbkRPTVtpXS5pZGVudGlmaWVyID09PSBpZGVudGlmaWVyKSB7XG4gICAgICByZXN1bHQgPSBpO1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5mdW5jdGlvbiBtb2R1bGVzVG9Eb20obGlzdCwgb3B0aW9ucykge1xuICB2YXIgaWRDb3VudE1hcCA9IHt9O1xuICB2YXIgaWRlbnRpZmllcnMgPSBbXTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGl0ZW0gPSBsaXN0W2ldO1xuICAgIHZhciBpZCA9IG9wdGlvbnMuYmFzZSA/IGl0ZW1bMF0gKyBvcHRpb25zLmJhc2UgOiBpdGVtWzBdO1xuICAgIHZhciBjb3VudCA9IGlkQ291bnRNYXBbaWRdIHx8IDA7XG4gICAgdmFyIGlkZW50aWZpZXIgPSBcIlwiLmNvbmNhdChpZCwgXCIgXCIpLmNvbmNhdChjb3VudCk7XG4gICAgaWRDb3VudE1hcFtpZF0gPSBjb3VudCArIDE7XG4gICAgdmFyIGluZGV4QnlJZGVudGlmaWVyID0gZ2V0SW5kZXhCeUlkZW50aWZpZXIoaWRlbnRpZmllcik7XG4gICAgdmFyIG9iaiA9IHtcbiAgICAgIGNzczogaXRlbVsxXSxcbiAgICAgIG1lZGlhOiBpdGVtWzJdLFxuICAgICAgc291cmNlTWFwOiBpdGVtWzNdLFxuICAgICAgc3VwcG9ydHM6IGl0ZW1bNF0sXG4gICAgICBsYXllcjogaXRlbVs1XVxuICAgIH07XG4gICAgaWYgKGluZGV4QnlJZGVudGlmaWVyICE9PSAtMSkge1xuICAgICAgc3R5bGVzSW5ET01baW5kZXhCeUlkZW50aWZpZXJdLnJlZmVyZW5jZXMrKztcbiAgICAgIHN0eWxlc0luRE9NW2luZGV4QnlJZGVudGlmaWVyXS51cGRhdGVyKG9iaik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciB1cGRhdGVyID0gYWRkRWxlbWVudFN0eWxlKG9iaiwgb3B0aW9ucyk7XG4gICAgICBvcHRpb25zLmJ5SW5kZXggPSBpO1xuICAgICAgc3R5bGVzSW5ET00uc3BsaWNlKGksIDAsIHtcbiAgICAgICAgaWRlbnRpZmllcjogaWRlbnRpZmllcixcbiAgICAgICAgdXBkYXRlcjogdXBkYXRlcixcbiAgICAgICAgcmVmZXJlbmNlczogMVxuICAgICAgfSk7XG4gICAgfVxuICAgIGlkZW50aWZpZXJzLnB1c2goaWRlbnRpZmllcik7XG4gIH1cbiAgcmV0dXJuIGlkZW50aWZpZXJzO1xufVxuZnVuY3Rpb24gYWRkRWxlbWVudFN0eWxlKG9iaiwgb3B0aW9ucykge1xuICB2YXIgYXBpID0gb3B0aW9ucy5kb21BUEkob3B0aW9ucyk7XG4gIGFwaS51cGRhdGUob2JqKTtcbiAgdmFyIHVwZGF0ZXIgPSBmdW5jdGlvbiB1cGRhdGVyKG5ld09iaikge1xuICAgIGlmIChuZXdPYmopIHtcbiAgICAgIGlmIChuZXdPYmouY3NzID09PSBvYmouY3NzICYmIG5ld09iai5tZWRpYSA9PT0gb2JqLm1lZGlhICYmIG5ld09iai5zb3VyY2VNYXAgPT09IG9iai5zb3VyY2VNYXAgJiYgbmV3T2JqLnN1cHBvcnRzID09PSBvYmouc3VwcG9ydHMgJiYgbmV3T2JqLmxheWVyID09PSBvYmoubGF5ZXIpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgYXBpLnVwZGF0ZShvYmogPSBuZXdPYmopO1xuICAgIH0gZWxzZSB7XG4gICAgICBhcGkucmVtb3ZlKCk7XG4gICAgfVxuICB9O1xuICByZXR1cm4gdXBkYXRlcjtcbn1cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGxpc3QsIG9wdGlvbnMpIHtcbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gIGxpc3QgPSBsaXN0IHx8IFtdO1xuICB2YXIgbGFzdElkZW50aWZpZXJzID0gbW9kdWxlc1RvRG9tKGxpc3QsIG9wdGlvbnMpO1xuICByZXR1cm4gZnVuY3Rpb24gdXBkYXRlKG5ld0xpc3QpIHtcbiAgICBuZXdMaXN0ID0gbmV3TGlzdCB8fCBbXTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxhc3RJZGVudGlmaWVycy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGlkZW50aWZpZXIgPSBsYXN0SWRlbnRpZmllcnNbaV07XG4gICAgICB2YXIgaW5kZXggPSBnZXRJbmRleEJ5SWRlbnRpZmllcihpZGVudGlmaWVyKTtcbiAgICAgIHN0eWxlc0luRE9NW2luZGV4XS5yZWZlcmVuY2VzLS07XG4gICAgfVxuICAgIHZhciBuZXdMYXN0SWRlbnRpZmllcnMgPSBtb2R1bGVzVG9Eb20obmV3TGlzdCwgb3B0aW9ucyk7XG4gICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGxhc3RJZGVudGlmaWVycy5sZW5ndGg7IF9pKyspIHtcbiAgICAgIHZhciBfaWRlbnRpZmllciA9IGxhc3RJZGVudGlmaWVyc1tfaV07XG4gICAgICB2YXIgX2luZGV4ID0gZ2V0SW5kZXhCeUlkZW50aWZpZXIoX2lkZW50aWZpZXIpO1xuICAgICAgaWYgKHN0eWxlc0luRE9NW19pbmRleF0ucmVmZXJlbmNlcyA9PT0gMCkge1xuICAgICAgICBzdHlsZXNJbkRPTVtfaW5kZXhdLnVwZGF0ZXIoKTtcbiAgICAgICAgc3R5bGVzSW5ET00uc3BsaWNlKF9pbmRleCwgMSk7XG4gICAgICB9XG4gICAgfVxuICAgIGxhc3RJZGVudGlmaWVycyA9IG5ld0xhc3RJZGVudGlmaWVycztcbiAgfTtcbn07IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBtZW1vID0ge307XG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICAqL1xuZnVuY3Rpb24gZ2V0VGFyZ2V0KHRhcmdldCkge1xuICBpZiAodHlwZW9mIG1lbW9bdGFyZ2V0XSA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgIHZhciBzdHlsZVRhcmdldCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IodGFyZ2V0KTtcblxuICAgIC8vIFNwZWNpYWwgY2FzZSB0byByZXR1cm4gaGVhZCBvZiBpZnJhbWUgaW5zdGVhZCBvZiBpZnJhbWUgaXRzZWxmXG4gICAgaWYgKHdpbmRvdy5IVE1MSUZyYW1lRWxlbWVudCAmJiBzdHlsZVRhcmdldCBpbnN0YW5jZW9mIHdpbmRvdy5IVE1MSUZyYW1lRWxlbWVudCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gVGhpcyB3aWxsIHRocm93IGFuIGV4Y2VwdGlvbiBpZiBhY2Nlc3MgdG8gaWZyYW1lIGlzIGJsb2NrZWRcbiAgICAgICAgLy8gZHVlIHRvIGNyb3NzLW9yaWdpbiByZXN0cmljdGlvbnNcbiAgICAgICAgc3R5bGVUYXJnZXQgPSBzdHlsZVRhcmdldC5jb250ZW50RG9jdW1lbnQuaGVhZDtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgLy8gaXN0YW5idWwgaWdub3JlIG5leHRcbiAgICAgICAgc3R5bGVUYXJnZXQgPSBudWxsO1xuICAgICAgfVxuICAgIH1cbiAgICBtZW1vW3RhcmdldF0gPSBzdHlsZVRhcmdldDtcbiAgfVxuICByZXR1cm4gbWVtb1t0YXJnZXRdO1xufVxuXG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAgKi9cbmZ1bmN0aW9uIGluc2VydEJ5U2VsZWN0b3IoaW5zZXJ0LCBzdHlsZSkge1xuICB2YXIgdGFyZ2V0ID0gZ2V0VGFyZ2V0KGluc2VydCk7XG4gIGlmICghdGFyZ2V0KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiQ291bGRuJ3QgZmluZCBhIHN0eWxlIHRhcmdldC4gVGhpcyBwcm9iYWJseSBtZWFucyB0aGF0IHRoZSB2YWx1ZSBmb3IgdGhlICdpbnNlcnQnIHBhcmFtZXRlciBpcyBpbnZhbGlkLlwiKTtcbiAgfVxuICB0YXJnZXQuYXBwZW5kQ2hpbGQoc3R5bGUpO1xufVxubW9kdWxlLmV4cG9ydHMgPSBpbnNlcnRCeVNlbGVjdG9yOyIsIlwidXNlIHN0cmljdFwiO1xuXG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAgKi9cbmZ1bmN0aW9uIGluc2VydFN0eWxlRWxlbWVudChvcHRpb25zKSB7XG4gIHZhciBlbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInN0eWxlXCIpO1xuICBvcHRpb25zLnNldEF0dHJpYnV0ZXMoZWxlbWVudCwgb3B0aW9ucy5hdHRyaWJ1dGVzKTtcbiAgb3B0aW9ucy5pbnNlcnQoZWxlbWVudCwgb3B0aW9ucy5vcHRpb25zKTtcbiAgcmV0dXJuIGVsZW1lbnQ7XG59XG5tb2R1bGUuZXhwb3J0cyA9IGluc2VydFN0eWxlRWxlbWVudDsiLCJcInVzZSBzdHJpY3RcIjtcblxuLyogaXN0YW5idWwgaWdub3JlIG5leHQgICovXG5mdW5jdGlvbiBzZXRBdHRyaWJ1dGVzV2l0aG91dEF0dHJpYnV0ZXMoc3R5bGVFbGVtZW50KSB7XG4gIHZhciBub25jZSA9IHR5cGVvZiBfX3dlYnBhY2tfbm9uY2VfXyAhPT0gXCJ1bmRlZmluZWRcIiA/IF9fd2VicGFja19ub25jZV9fIDogbnVsbDtcbiAgaWYgKG5vbmNlKSB7XG4gICAgc3R5bGVFbGVtZW50LnNldEF0dHJpYnV0ZShcIm5vbmNlXCIsIG5vbmNlKTtcbiAgfVxufVxubW9kdWxlLmV4cG9ydHMgPSBzZXRBdHRyaWJ1dGVzV2l0aG91dEF0dHJpYnV0ZXM7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICAqL1xuZnVuY3Rpb24gYXBwbHkoc3R5bGVFbGVtZW50LCBvcHRpb25zLCBvYmopIHtcbiAgdmFyIGNzcyA9IFwiXCI7XG4gIGlmIChvYmouc3VwcG9ydHMpIHtcbiAgICBjc3MgKz0gXCJAc3VwcG9ydHMgKFwiLmNvbmNhdChvYmouc3VwcG9ydHMsIFwiKSB7XCIpO1xuICB9XG4gIGlmIChvYmoubWVkaWEpIHtcbiAgICBjc3MgKz0gXCJAbWVkaWEgXCIuY29uY2F0KG9iai5tZWRpYSwgXCIge1wiKTtcbiAgfVxuICB2YXIgbmVlZExheWVyID0gdHlwZW9mIG9iai5sYXllciAhPT0gXCJ1bmRlZmluZWRcIjtcbiAgaWYgKG5lZWRMYXllcikge1xuICAgIGNzcyArPSBcIkBsYXllclwiLmNvbmNhdChvYmoubGF5ZXIubGVuZ3RoID4gMCA/IFwiIFwiLmNvbmNhdChvYmoubGF5ZXIpIDogXCJcIiwgXCIge1wiKTtcbiAgfVxuICBjc3MgKz0gb2JqLmNzcztcbiAgaWYgKG5lZWRMYXllcikge1xuICAgIGNzcyArPSBcIn1cIjtcbiAgfVxuICBpZiAob2JqLm1lZGlhKSB7XG4gICAgY3NzICs9IFwifVwiO1xuICB9XG4gIGlmIChvYmouc3VwcG9ydHMpIHtcbiAgICBjc3MgKz0gXCJ9XCI7XG4gIH1cbiAgdmFyIHNvdXJjZU1hcCA9IG9iai5zb3VyY2VNYXA7XG4gIGlmIChzb3VyY2VNYXAgJiYgdHlwZW9mIGJ0b2EgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICBjc3MgKz0gXCJcXG4vKiMgc291cmNlTWFwcGluZ1VSTD1kYXRhOmFwcGxpY2F0aW9uL2pzb247YmFzZTY0LFwiLmNvbmNhdChidG9hKHVuZXNjYXBlKGVuY29kZVVSSUNvbXBvbmVudChKU09OLnN0cmluZ2lmeShzb3VyY2VNYXApKSkpLCBcIiAqL1wiKTtcbiAgfVxuXG4gIC8vIEZvciBvbGQgSUVcbiAgLyogaXN0YW5idWwgaWdub3JlIGlmICAqL1xuICBvcHRpb25zLnN0eWxlVGFnVHJhbnNmb3JtKGNzcywgc3R5bGVFbGVtZW50LCBvcHRpb25zLm9wdGlvbnMpO1xufVxuZnVuY3Rpb24gcmVtb3ZlU3R5bGVFbGVtZW50KHN0eWxlRWxlbWVudCkge1xuICAvLyBpc3RhbmJ1bCBpZ25vcmUgaWZcbiAgaWYgKHN0eWxlRWxlbWVudC5wYXJlbnROb2RlID09PSBudWxsKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHN0eWxlRWxlbWVudC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHN0eWxlRWxlbWVudCk7XG59XG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICAqL1xuZnVuY3Rpb24gZG9tQVBJKG9wdGlvbnMpIHtcbiAgaWYgKHR5cGVvZiBkb2N1bWVudCA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgIHJldHVybiB7XG4gICAgICB1cGRhdGU6IGZ1bmN0aW9uIHVwZGF0ZSgpIHt9LFxuICAgICAgcmVtb3ZlOiBmdW5jdGlvbiByZW1vdmUoKSB7fVxuICAgIH07XG4gIH1cbiAgdmFyIHN0eWxlRWxlbWVudCA9IG9wdGlvbnMuaW5zZXJ0U3R5bGVFbGVtZW50KG9wdGlvbnMpO1xuICByZXR1cm4ge1xuICAgIHVwZGF0ZTogZnVuY3Rpb24gdXBkYXRlKG9iaikge1xuICAgICAgYXBwbHkoc3R5bGVFbGVtZW50LCBvcHRpb25zLCBvYmopO1xuICAgIH0sXG4gICAgcmVtb3ZlOiBmdW5jdGlvbiByZW1vdmUoKSB7XG4gICAgICByZW1vdmVTdHlsZUVsZW1lbnQoc3R5bGVFbGVtZW50KTtcbiAgICB9XG4gIH07XG59XG5tb2R1bGUuZXhwb3J0cyA9IGRvbUFQSTsiLCJcInVzZSBzdHJpY3RcIjtcblxuLyogaXN0YW5idWwgaWdub3JlIG5leHQgICovXG5mdW5jdGlvbiBzdHlsZVRhZ1RyYW5zZm9ybShjc3MsIHN0eWxlRWxlbWVudCkge1xuICBpZiAoc3R5bGVFbGVtZW50LnN0eWxlU2hlZXQpIHtcbiAgICBzdHlsZUVsZW1lbnQuc3R5bGVTaGVldC5jc3NUZXh0ID0gY3NzO1xuICB9IGVsc2Uge1xuICAgIHdoaWxlIChzdHlsZUVsZW1lbnQuZmlyc3RDaGlsZCkge1xuICAgICAgc3R5bGVFbGVtZW50LnJlbW92ZUNoaWxkKHN0eWxlRWxlbWVudC5maXJzdENoaWxkKTtcbiAgICB9XG4gICAgc3R5bGVFbGVtZW50LmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGNzcykpO1xuICB9XG59XG5tb2R1bGUuZXhwb3J0cyA9IHN0eWxlVGFnVHJhbnNmb3JtOyIsIi8vIEZ1bmN0aW9uIHRvIGxvYWQgdGhlIENTUyBmcm9tIGEgZ2l2ZW4gVVJMXHJcbmZ1bmN0aW9uIGxvYWRDc3ModXJsKSB7XHJcbiAgICByZXR1cm4gZmV0Y2godXJsKVxyXG4gICAgICAgIC50aGVuKHJlc3BvbnNlID0+IHJlc3BvbnNlLnRleHQoKSlcclxuICAgICAgICAudGhlbihjc3MgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBzdHlsZVNoZWV0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInN0eWxlXCIpO1xyXG4gICAgICAgICAgICBzdHlsZVNoZWV0LnR5cGUgPSBcInRleHQvY3NzXCI7XHJcbiAgICAgICAgICAgIHN0eWxlU2hlZXQudGV4dENvbnRlbnQgPSBjc3M7ICAvLyBVc2UgdGV4dENvbnRlbnQgaW5zdGVhZCBvZiBpbm5lclRleHRcclxuICAgICAgICAgICAgZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChzdHlsZVNoZWV0KTtcclxuICAgICAgICB9KVxyXG4gICAgICAgIC5jYXRjaChlcnJvciA9PiB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJGYWlsZWQgdG8gbG9hZCBDU1M6XCIsIGVycm9yKTtcclxuICAgICAgICB9KTtcclxufVxyXG5cclxuZXhwb3J0IHtcclxuICAgIGxvYWRDc3NcclxufSIsIi8vIEltcG9ydGluZyB0aGUgQ1NTIGFuZCBIVE1MIHRlbXBsYXRlc1xyXG5pbXBvcnQgJy4vY3NzL2RpYWxvZy5jc3MnO1xyXG5pbXBvcnQgZGlhbG9nVGVtcGxhdGUgZnJvbSAnLi9odG1sL2RpYWxvZy5odG1sP3Jhdyc7XHJcblxyXG5jb25zdCBjcmVhdGVEaWFsb2cgPSAob3B0aW9ucykgPT4ge1xyXG4gICAgY29uc3QgZGlhbG9nRGVmYXVsdHMgPSB7XHJcbiAgICAgICAgdGl0bGU6ICcnLFxyXG4gICAgICAgIGNvbnRlbnQ6ICcnLFxyXG4gICAgICAgIGNvbnRlbnRVUkk6ICcnLFxyXG4gICAgICAgIGJ1dHRvbnM6IFtdLFxyXG4gICAgICAgIHNpemU6ICdtZWRpdW0nLFxyXG4gICAgICAgIHNob3dMb2FkaW5nSW5kaWNhdG9yOiBmYWxzZSxcclxuICAgICAgICBjb250ZW50TWV0aG9kOiAnR0VUJyxcclxuICAgICAgICBjb250ZW50RGF0YTogbnVsbCxcclxuICAgICAgICBjb250ZW50SGVhZGVyczogdW5kZWZpbmVkXHJcbiAgICB9O1xyXG5cclxuICAgIGNvbnN0IHsgdGl0bGUsIGNvbnRlbnQsIGNvbnRlbnRVUkksIGJ1dHRvbnMsIHNpemUsIHNob3dMb2FkaW5nSW5kaWNhdG9yLCBjb250ZW50TWV0aG9kLCBjb250ZW50RGF0YSwgY29udGVudEhlYWRlcnMgfSA9IHsgLi4uZGlhbG9nRGVmYXVsdHMsIC4uLm9wdGlvbnMgfTtcclxuXHJcbiAgICBjb25zdCB3cmFwcGVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XHJcbiAgICB3cmFwcGVyLmlubmVySFRNTCA9IGRpYWxvZ1RlbXBsYXRlLnRyaW0oKTtcclxuICAgIGNvbnN0IGRpYWxvZ0VsZW1lbnQgPSB3cmFwcGVyLmZpcnN0Q2hpbGQ7XHJcblxyXG4gICAgLy8gTGlmZWN5Y2xlIGV2ZW50IG1hbmFnZW1lbnRcclxuICAgIGNvbnN0IGxpZmVjeWNsZVJlc29sdmVycyA9IHt9O1xyXG4gICAgY29uc3QgbGlmZWN5Y2xlRXZlbnRzID0ge307XHJcblxyXG4gICAgLy8gRGVmaW5lIGxpZmVjeWNsZSBwcm9taXNlcyBhcyBwcm9wZXJ0aWVzXHJcbiAgICBbJ29wZW5pbmcnLCAnb3BlbmVkJywgJ2Nsb3NpbmcnLCAnY2xvc2VkJywgJ2NvbnRlbnRMb2FkaW5nJywgJ2NvbnRlbnRMb2FkZWQnXS5mb3JFYWNoKChldmVudCkgPT4ge1xyXG4gICAgICAgIGxpZmVjeWNsZUV2ZW50c1tldmVudF0gPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xyXG4gICAgICAgICAgICBsaWZlY3ljbGVSZXNvbHZlcnNbZXZlbnRdID0gcmVzb2x2ZTtcclxuICAgICAgICB9KTtcclxuICAgIH0pO1xyXG5cclxuICAgIGNvbnN0IHRyaWdnZXJFdmVudCA9IChldmVudCkgPT4ge1xyXG4gICAgICAgIGlmIChsaWZlY3ljbGVSZXNvbHZlcnNbZXZlbnRdKSB7XHJcbiAgICAgICAgICAgIGxpZmVjeWNsZVJlc29sdmVyc1tldmVudF0oKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBjb25zb2xlLndhcm4oYE5vIHJlc29sdmVyIGZvdW5kIGZvciBsaWZlY3ljbGUgZXZlbnQ6ICR7ZXZlbnR9YCk7XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuXHJcbiAgICBjb25zdCBkaWFsb2cgPSB7XHJcbiAgICAgICAgZWxlbWVudDogZGlhbG9nRWxlbWVudCxcclxuICAgICAgICBidXR0b25zOiB7fSxcclxuICAgICAgICBpc0Nsb3NlZDogZmFsc2UsXHJcbiAgICAgICAgbGlmZWN5Y2xlOiBsaWZlY3ljbGVFdmVudHMsIC8vIExpZmVjeWNsZSBwcm9taXNlcyBkaXJlY3RseSBleHBvc2VkIGhlcmVcclxuICAgICAgICBkaXNhYmxlQnV0dG9uOiAoa2V5KSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IGJ1dHRvbiA9IGRpYWxvZ0VsZW1lbnQucXVlcnlTZWxlY3RvcihgLkFQWC1kaWFsb2ctYnV0dG9uW2RhdGEta2V5PVwiJHtrZXl9XCJdYCk7XHJcbiAgICAgICAgICAgIGlmIChidXR0b24pIHtcclxuICAgICAgICAgICAgICAgIGJ1dHRvbi5kaXNhYmxlZCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICBidXR0b24uY2xhc3NMaXN0LmFkZCgnQVBYLWRpYWxvZy1idXR0b24tZGlzYWJsZWQnKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgZW5hYmxlQnV0dG9uOiAoa2V5KSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IGJ1dHRvbiA9IGRpYWxvZ0VsZW1lbnQucXVlcnlTZWxlY3RvcihgLkFQWC1kaWFsb2ctYnV0dG9uW2RhdGEta2V5PVwiJHtrZXl9XCJdYCk7XHJcbiAgICAgICAgICAgIGlmIChidXR0b24pIHtcclxuICAgICAgICAgICAgICAgIGJ1dHRvbi5kaXNhYmxlZCA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgYnV0dG9uLmNsYXNzTGlzdC5yZW1vdmUoJ0FQWC1kaWFsb2ctYnV0dG9uLWRpc2FibGVkJyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgICAgIG9wZW46IGFzeW5jICgpID0+IHtcclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIHRyaWdnZXJFdmVudCgnb3BlbmluZycpO1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgZGlhbG9nLmxpZmVjeWNsZS5vcGVuaW5nO1xyXG5cclxuICAgICAgICAgICAgICAgIC8vIElmIGxvYWRpbmcgaW5kaWNhdG9yIGlzIGVuYWJsZWQgYW5kIHdlJ3JlIGZldGNoaW5nIGNvbnRlbnQsIHNob3cgZGlhbG9nIGZpcnN0XHJcbiAgICAgICAgICAgICAgICBpZiAoc2hvd0xvYWRpbmdJbmRpY2F0b3IgJiYgY29udGVudFVSSSkge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIEFwcGVuZCBkaWFsb2cgdG8gdGhlIERPTSBhbmQgZGlzcGxheSBpdCBmaXJzdFxyXG4gICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZGlhbG9nRWxlbWVudCk7XHJcbiAgICAgICAgICAgICAgICAgICAgZGlhbG9nRWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gXCJmbGV4XCI7XHJcbiAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gU2hvdyBsb2FkaW5nIGluZGljYXRvclxyXG4gICAgICAgICAgICAgICAgICAgIGRpYWxvZ0VsZW1lbnQucXVlcnlTZWxlY3RvcihcIi5BUFgtZGlhbG9nLWR5bmFtaWMtY29udGVudFwiKS5pbm5lckhUTUwgPSAnPGRpdiBjbGFzcz1cIkFQWC1kaWFsb2ctbG9hZGluZy1pbmRpY2F0b3JcIj48L2Rpdj4nO1xyXG4gICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgIC8vIExvYWQgY29udGVudCBhZnRlciBkaWFsb2cgaXMgdmlzaWJsZVxyXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IGZldGNoQW5kSW5zZXJ0Q29udGVudCgpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyBEZWZhdWx0IGJlaGF2aW9yOiBsb2FkIGNvbnRlbnQgZmlyc3QsIHRoZW4gc2hvdyBkaWFsb2dcclxuICAgICAgICAgICAgICAgICAgICBhd2FpdCBmZXRjaEFuZEluc2VydENvbnRlbnQoKTtcclxuICAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICAvLyBBcHBlbmQgZGlhbG9nIHRvIHRoZSBET00gYW5kIGRpc3BsYXkgaXRcclxuICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGRpYWxvZ0VsZW1lbnQpO1xyXG4gICAgICAgICAgICAgICAgICAgIGRpYWxvZ0VsZW1lbnQuc3R5bGUuZGlzcGxheSA9IFwiZmxleFwiO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIHRyaWdnZXJFdmVudCgnb3BlbmVkJyk7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCBkaWFsb2cubGlmZWN5Y2xlLm9wZW5lZDtcclxuICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIG9wZW5pbmcgZGlhbG9nOicsIGVycm9yKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gZGlhbG9nOyAvLyBSZXR1cm4gZm9yIGRhaXN5LWNoYWluaW5nXHJcbiAgICAgICAgfSxcclxuICAgICAgICBjbG9zZTogYXN5bmMgKCkgPT4ge1xyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgdHJpZ2dlckV2ZW50KCdjbG9zaW5nJyk7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCBkaWFsb2cubGlmZWN5Y2xlLmNsb3Npbmc7XHJcblxyXG4gICAgICAgICAgICAgICAgLy8gQ2xlYW51cCBhbmQgcmVtb3ZlIGRpYWxvZ1xyXG4gICAgICAgICAgICAgICAgY2xvc2VEaWFsb2dBbmRDbGVhbnVwKCk7XHJcblxyXG4gICAgICAgICAgICAgICAgdHJpZ2dlckV2ZW50KCdjbG9zZWQnKTtcclxuICAgICAgICAgICAgICAgIGF3YWl0IGRpYWxvZy5saWZlY3ljbGUuY2xvc2VkO1xyXG4gICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgZHVyaW5nIGRpYWxvZyBjbG9zaW5nOicsIGVycm9yKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gZGlhbG9nOyAvLyBSZXR1cm4gZm9yIGRhaXN5LWNoYWluaW5nXHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuXHJcbiAgICBjb25zdCBjbG9zZURpYWxvZ0FuZENsZWFudXAgPSAoKSA9PiB7XHJcbiAgICAgICAgaWYgKGRpYWxvZy5pc0Nsb3NlZCkgcmV0dXJuO1xyXG5cclxuICAgICAgICBkaWFsb2cuaXNDbG9zZWQgPSB0cnVlO1xyXG4gICAgICAgIGRpYWxvZ0VsZW1lbnQuc3R5bGUuZGlzcGxheSA9IFwibm9uZVwiO1xyXG4gICAgICAgIGlmIChkb2N1bWVudC5ib2R5LmNvbnRhaW5zKGRpYWxvZ0VsZW1lbnQpKSB7XHJcbiAgICAgICAgICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoZGlhbG9nRWxlbWVudCk7XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuXHJcbiAgICBjb25zdCBzZXREaWFsb2dTaXplID0gKCkgPT4ge1xyXG4gICAgICAgIGNvbnN0IGRpYWxvZ0NvbnRlbnQgPSBkaWFsb2dFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoXCIuQVBYLWRpYWxvZy1jb250ZW50XCIpO1xyXG4gICAgICAgIGNvbnN0IHNpemVzID0ge1xyXG4gICAgICAgICAgICBzbWFsbDogeyB3aWR0aDogJzMwMHB4JywgaGVpZ2h0OiAnMjAwcHgnIH0sXHJcbiAgICAgICAgICAgIG1lZGl1bTogeyB3aWR0aDogJzUwMHB4JywgaGVpZ2h0OiAnNDAwcHgnIH0sXHJcbiAgICAgICAgICAgIGxhcmdlOiB7IHdpZHRoOiAnODAwcHgnLCBoZWlnaHQ6ICc2MDBweCcgfVxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIGlmIChzaXplID09PSAnYXV0bycpIHJldHVybjtcclxuXHJcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWRTaXplID0gc2l6ZXNbc2l6ZV0gfHwgKHR5cGVvZiBzaXplID09PSAnb2JqZWN0JyAmJiBzaXplKTtcclxuICAgICAgICBpZiAoc2VsZWN0ZWRTaXplKSB7XHJcbiAgICAgICAgICAgIGRpYWxvZ0NvbnRlbnQuc3R5bGUubWluV2lkdGggPSBzZWxlY3RlZFNpemUud2lkdGggfHwgJzUwMHB4JztcclxuICAgICAgICAgICAgZGlhbG9nQ29udGVudC5zdHlsZS5taW5IZWlnaHQgPSBzZWxlY3RlZFNpemUuaGVpZ2h0IHx8ICc0MDBweCc7XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuXHJcbiAgICBjb25zdCBhZGRCdXR0b25zID0gKCkgPT4ge1xyXG4gICAgICAgIGNvbnN0IGJ1dHRvbkNvbnRhaW5lciA9IGRpYWxvZ0VsZW1lbnQucXVlcnlTZWxlY3RvcihcIi5BUFgtZGlhbG9nLWJ1dHRvbi1jb250YWluZXJcIik7XHJcblxyXG4gICAgICAgIGJ1dHRvbnMuZm9yRWFjaCgoeyBrZXksIGxhYmVsLCBvcmRlciA9IDAsIGFsaWduID0gJ2ZsZXgtZW5kJywgY2xvc2VPbkNsaWNrID0gdHJ1ZSB9KSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IGJ1dHRvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2J1dHRvbicpO1xyXG4gICAgICAgICAgICBidXR0b24uY2xhc3NMaXN0LmFkZCgnQVBYLWRpYWxvZy1idXR0b24nKTtcclxuICAgICAgICAgICAgYnV0dG9uLnRleHRDb250ZW50ID0gbGFiZWw7XHJcbiAgICAgICAgICAgIGJ1dHRvbi5zdHlsZS5vcmRlciA9IG9yZGVyO1xyXG4gICAgICAgICAgICBidXR0b24uc2V0QXR0cmlidXRlKCdkYXRhLWtleScsIGtleSk7XHJcblxyXG4gICAgICAgICAgICAvLyBDcmVhdGUgYnV0dG9uIGNvbnRleHQgd2l0aCBkaXNhYmxlL2VuYWJsZSBtZXRob2RzXHJcbiAgICAgICAgICAgIGNvbnN0IGJ1dHRvbkNvbnRleHQgPSB7XHJcbiAgICAgICAgICAgICAgICBkaXNhYmxlOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgYnV0dG9uLmRpc2FibGVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICBidXR0b24uY2xhc3NMaXN0LmFkZCgnQVBYLWRpYWxvZy1idXR0b24tZGlzYWJsZWQnKTtcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICBlbmFibGU6ICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBidXR0b24uZGlzYWJsZWQgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICBidXR0b24uY2xhc3NMaXN0LnJlbW92ZSgnQVBYLWRpYWxvZy1idXR0b24tZGlzYWJsZWQnKTtcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICBrZXksXHJcbiAgICAgICAgICAgICAgICBlbGVtZW50OiBidXR0b25cclxuICAgICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICAgIGlmIChjbG9zZU9uQ2xpY2spIHtcclxuICAgICAgICAgICAgICAgIC8vIEhhbmRsZSBhcyBhIG9uZS10aW1lIFByb21pc2VcclxuICAgICAgICAgICAgICAgIGxldCBmaXJzdENsaWNrUmVzb2x2ZWQgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgICAgICAgICBjb25zdCBmaXJzdENsaWNrUHJvbWlzZSA9IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgYnV0dG9uLm9uY2xpY2sgPSAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZmlyc3RDbGlja1Jlc29sdmVkICYmICFidXR0b24uZGlzYWJsZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0Q2xpY2tSZXNvbHZlZCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHsgZGlhbG9nLCBidXR0b246IGJ1dHRvbkNvbnRleHQgfSk7IC8vIFBhc3MgYm90aCBkaWFsb2cgYW5kIGJ1dHRvbiBjb250ZXh0XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWFsb2cuY2xvc2UoKTsgLy8gQ2xvc2UgdGhlIGRpYWxvZ1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgICAgIC8vIEFzc2lnbiB0aGUgcHJvbWlzZSBmb3IgY2hhaW5pbmcgd2l0aCBgLnRoZW5gXHJcbiAgICAgICAgICAgICAgICBkaWFsb2cuYnV0dG9uc1trZXldID0gZmlyc3RDbGlja1Byb21pc2U7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAvLyBIYW5kbGUgYXMgYSByZXBlYXRlZCBldmVudCBoYW5kbGVyXHJcbiAgICAgICAgICAgICAgICBsZXQgaGFuZGxlcnMgPSBbXTsgLy8gU3RvcmUgaGFuZGxlcnMgZm9yIGAudGhlbigpYFxyXG5cclxuICAgICAgICAgICAgICAgIGNvbnN0IGNsaWNrUHJvbWlzZSA9IHtcclxuICAgICAgICAgICAgICAgICAgICB0aGVuOiAoY2FsbGJhY2spID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBjYWxsYmFjayA9PT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlcnMucHVzaChjYWxsYmFjayk7IC8vIEFkZCB0byBoYW5kbGVyc1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjbGlja1Byb21pc2U7IC8vIEFsbG93IGNoYWluaW5nXHJcbiAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgICAgICAgYnV0dG9uLm9uY2xpY2sgPSAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFidXR0b24uZGlzYWJsZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlcnMuZm9yRWFjaCgoaGFuZGxlcikgPT4gaGFuZGxlcih7IGRpYWxvZywgYnV0dG9uOiBidXR0b25Db250ZXh0IH0pKTsgLy8gUGFzcyBib3RoIGRpYWxvZyBhbmQgYnV0dG9uIGNvbnRleHRcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgICAgIGRpYWxvZy5idXR0b25zW2tleV0gPSBjbGlja1Byb21pc2U7IC8vIEFzc2lnbiB0aGUgXCJmYWtlXCIgcHJvbWlzZVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBidXR0b25Db250YWluZXIuYXBwZW5kQ2hpbGQoYnV0dG9uKTtcclxuICAgICAgICAgICAgYnV0dG9uQ29udGFpbmVyLnN0eWxlLmp1c3RpZnlDb250ZW50ID0gYWxpZ247XHJcbiAgICAgICAgfSk7XHJcbiAgICB9O1xyXG5cclxuICAgIGNvbnN0IGZldGNoQW5kSW5zZXJ0Q29udGVudCA9IGFzeW5jICgpID0+IHtcclxuICAgICAgICBjb25zdCBvcmlnaW5hbEN1cnNvciA9IGRvY3VtZW50LmJvZHkuc3R5bGUuY3Vyc29yO1xyXG4gICAgICAgIGRvY3VtZW50LmJvZHkuc3R5bGUuY3Vyc29yID0gJ3dhaXQnO1xyXG4gICAgICAgIGNvbnN0IGR5bmFtaWNDb250ZW50ID0gZGlhbG9nRWxlbWVudC5xdWVyeVNlbGVjdG9yKFwiLkFQWC1kaWFsb2ctZHluYW1pYy1jb250ZW50XCIpO1xyXG4gICAgICAgIFxyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHRyaWdnZXJFdmVudCgnY29udGVudExvYWRpbmcnKTtcclxuICAgICAgICAgICAgYXdhaXQgZGlhbG9nLmxpZmVjeWNsZS5jb250ZW50TG9hZGluZztcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IGNvbnRlbnRIdG1sID0gY29udGVudFVSSVxyXG4gICAgICAgICAgICAgICAgPyBhd2FpdCBmZXRjaENvbnRlbnQoY29udGVudFVSSSlcclxuICAgICAgICAgICAgICAgIDogY29udGVudDtcclxuXHJcbiAgICAgICAgICAgIGR5bmFtaWNDb250ZW50LmlubmVySFRNTCA9IGNvbnRlbnRIdG1sO1xyXG5cclxuICAgICAgICAgICAgdHJpZ2dlckV2ZW50KCdjb250ZW50TG9hZGVkJyk7XHJcbiAgICAgICAgICAgIGF3YWl0IGRpYWxvZy5saWZlY3ljbGUuY29udGVudExvYWRlZDtcclxuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBsb2FkaW5nIGNvbnRlbnQ6JywgZXJyb3IpO1xyXG4gICAgICAgIH0gZmluYWxseSB7XHJcbiAgICAgICAgICAgIGRvY3VtZW50LmJvZHkuc3R5bGUuY3Vyc29yID0gb3JpZ2luYWxDdXJzb3I7XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuXHJcbiAgICBjb25zdCBmZXRjaENvbnRlbnQgPSBhc3luYyAodXJpKSA9PiB7XHJcbiAgICAgICAgY29uc3QgbWV0aG9kID0gKGNvbnRlbnRNZXRob2QgfHwgJ0dFVCcpLnRvVXBwZXJDYXNlKCk7XHJcblxyXG4gICAgICAgIC8vIEFsd2F5cyBhbGxvdyBjdXN0b20gaGVhZGVyczsgd2Ugb25seSBhZGQgQ29udGVudC1UeXBlIHdoZW4gd2UgY2FuIGluZmVyIGl0XHJcbiAgICAgICAgY29uc3QgaGVhZGVycyA9IHsgLi4uKGNvbnRlbnRIZWFkZXJzIHx8IHt9KSB9O1xyXG4gICAgICAgIGNvbnN0IGhhc0NvbnRlbnRUeXBlID0gT2JqZWN0LmtleXMoaGVhZGVycykuc29tZSgoaykgPT4gay50b0xvd2VyQ2FzZSgpID09PSAnY29udGVudC10eXBlJyk7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEJ1aWxkIFJlcXVlc3RJbml0IGRlcGVuZGluZyBvbiBtZXRob2QgYW5kIGNvbnRlbnREYXRhIHR5cGUuXHJcbiAgICAgICAgICogV2UgYXZvaWQgc2V0dGluZyBDb250ZW50LVR5cGUgZm9yIEZvcm1EYXRhIGFuZCByYXcgc3RyaW5nL0Jsb2IgcGF5bG9hZHMsXHJcbiAgICAgICAgICogdW5sZXNzIHRoZSBjYWxsZXIgZXhwbGljaXRseSBwcm92aWRlZCBpdCB2aWEgY29udGVudEhlYWRlcnMuXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgY29uc3QgaW5pdCA9IHsgbWV0aG9kIH07XHJcblxyXG4gICAgICAgIGlmIChtZXRob2QgPT09ICdQT1NUJykge1xyXG4gICAgICAgICAgICBsZXQgYm9keSA9IHVuZGVmaW5lZDtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IGlzRm9ybURhdGEgPSB0eXBlb2YgRm9ybURhdGEgIT09ICd1bmRlZmluZWQnICYmIGNvbnRlbnREYXRhIGluc3RhbmNlb2YgRm9ybURhdGE7XHJcbiAgICAgICAgICAgIGNvbnN0IGlzVVJMU2VhcmNoUGFyYW1zID0gdHlwZW9mIFVSTFNlYXJjaFBhcmFtcyAhPT0gJ3VuZGVmaW5lZCcgJiYgY29udGVudERhdGEgaW5zdGFuY2VvZiBVUkxTZWFyY2hQYXJhbXM7XHJcbiAgICAgICAgICAgIGNvbnN0IGlzQmxvYiA9IHR5cGVvZiBCbG9iICE9PSAndW5kZWZpbmVkJyAmJiBjb250ZW50RGF0YSBpbnN0YW5jZW9mIEJsb2I7XHJcbiAgICAgICAgICAgIGNvbnN0IGlzU3RyaW5nID0gdHlwZW9mIGNvbnRlbnREYXRhID09PSAnc3RyaW5nJztcclxuICAgICAgICAgICAgY29uc3QgaXNQbGFpbk9iamVjdCA9IGNvbnRlbnREYXRhICYmIHR5cGVvZiBjb250ZW50RGF0YSA9PT0gJ29iamVjdCcgJiYgIWlzRm9ybURhdGEgJiYgIWlzVVJMU2VhcmNoUGFyYW1zICYmICFpc0Jsb2I7XHJcblxyXG4gICAgICAgICAgICBpZiAoaXNGb3JtRGF0YSkge1xyXG4gICAgICAgICAgICAgICAgYm9keSA9IGNvbnRlbnREYXRhO1xyXG4gICAgICAgICAgICAgICAgLy8gRG8gbm90IHNldCBDb250ZW50LVR5cGUgZm9yIEZvcm1EYXRhOyBicm93c2VyIHdpbGwgc2V0IHRoZSBib3VuZGFyeVxyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGlzVVJMU2VhcmNoUGFyYW1zKSB7XHJcbiAgICAgICAgICAgICAgICBib2R5ID0gY29udGVudERhdGE7XHJcbiAgICAgICAgICAgICAgICBpZiAoIWhhc0NvbnRlbnRUeXBlKSBoZWFkZXJzWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQ7Y2hhcnNldD1VVEYtOCc7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaXNQbGFpbk9iamVjdCkge1xyXG4gICAgICAgICAgICAgICAgYm9keSA9IEpTT04uc3RyaW5naWZ5KGNvbnRlbnREYXRhKTtcclxuICAgICAgICAgICAgICAgIGlmICghaGFzQ29udGVudFR5cGUpIGhlYWRlcnNbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGlzU3RyaW5nIHx8IGlzQmxvYikge1xyXG4gICAgICAgICAgICAgICAgYm9keSA9IGNvbnRlbnREYXRhO1xyXG4gICAgICAgICAgICAgICAgLy8gQ29udGVudC1UeXBlIGxlZnQgdG8gY2FsbGVyIGlmIG5lZWRlZFxyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGNvbnRlbnREYXRhICE9IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIC8vIEZhbGxiYWNrOiB0cnkgc2VuZCBhcy1pc1xyXG4gICAgICAgICAgICAgICAgYm9keSA9IGNvbnRlbnREYXRhO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoYm9keSAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICBpbml0LmJvZHkgPSBib2R5O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoT2JqZWN0LmtleXMoaGVhZGVycykubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICBpbml0LmhlYWRlcnMgPSBoZWFkZXJzO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCh1cmksIGluaXQpO1xyXG4gICAgICAgIGlmICghcmVzcG9uc2Uub2spIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIGZldGNoIGNvbnRlbnQ6ICR7cmVzcG9uc2Uuc3RhdHVzVGV4dH1gKTtcclxuICAgICAgICByZXR1cm4gcmVzcG9uc2UudGV4dCgpO1xyXG4gICAgfTtcclxuXHJcbiAgICAvLyBJbml0aWFsaXplIGRpYWxvZ1xyXG4gICAgc2V0RGlhbG9nU2l6ZSgpO1xyXG4gICAgYWRkQnV0dG9ucygpO1xyXG5cclxuICAgIC8vIFNldCB0aXRsZSBhbmQgY2xvc2UgYnV0dG9uIGhhbmRsZXJcclxuICAgIGRpYWxvZ0VsZW1lbnQucXVlcnlTZWxlY3RvcihcIi5BUFgtZGlhbG9nLXRpdGxlXCIpLnRleHRDb250ZW50ID0gdGl0bGU7XHJcbiAgICBkaWFsb2dFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJy5BUFgtY2xvc2UtZGlhbG9nJykub25jbGljayA9IGRpYWxvZy5jbG9zZTtcclxuXHJcbiAgICByZXR1cm4gZGlhbG9nO1xyXG59O1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY3JlYXRlRGlhbG9nO1xyXG4iLCJsZXQgY291bnRlciA9IDA7XHJcbmNvbnN0IGRvQ2FsbGJhY2tzID0ge307XHJcbmNvbnN0IHRpbWVvdXRzID0ge307XHJcblxyXG4vKipcclxuICogVGhpcyBmdW5jdGlvbiBhZGRzIGFuIGV2ZW50IGxpc3RlbmVyIHRvIHRoZSBlbGVtZW50cyBhbmQgcmV0dXJucyBhbiBvYmplY3Qgd2l0aCBhIGRvIG1ldGhvZCB0byBhZGQgY2FsbGJhY2sgZnVuY3Rpb25zLlxyXG4gKiBAcGFyYW0ge09iamVjdH0gYXB4IC0gVGhlIGFweCBvYmplY3QgdG8gYXVnbWVudCB3aXRoIHRoZSBsaXN0ZW4gZnVuY3Rpb24uXHJcbiAqIEByZXR1cm5zIHtPYmplY3R9IC0gVGhlIGF1Z21lbnRlZCBhcHggb2JqZWN0LlxyXG4gKi9cclxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gKGFweCkge1xyXG4gICAgbGV0IGVsZW1lbnRzID0gYXB4LmVsZW1lbnRzO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQWRkcyBhbiBldmVudCBsaXN0ZW5lciB0byB0aGUgZWxlbWVudHMgYW5kIHJldHVybnMgYW4gb2JqZWN0IHdpdGggYSBkbyBtZXRob2QgdG8gYWRkIGNhbGxiYWNrIGZ1bmN0aW9ucy5cclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBldmVudFR5cGUgLSBUaGUgdHlwZSBvZiBldmVudCB0byBsaXN0ZW4gZm9yIChlLmcuICdjbGljaycsICdrZXlkb3duJywgZXRjLikuXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3NlbGVjdG9yXSAtIFRoZSBDU1Mgc2VsZWN0b3IgdG8gdXNlIGZvciBldmVudCBkZWxlZ2F0aW9uIChvcHRpb25hbCkuXHJcbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSAtIEFuIG9iamVjdCB3aXRoIGEgZG8gbWV0aG9kIHRvIGFkZCBjYWxsYmFjayBmdW5jdGlvbnMuXHJcbiAgICAgKiBAZXhhbXBsZVxyXG4gICAgICogYXB4Lmxpc3RlbignY2xpY2snLCAnLm15LWJ1dHRvbicpLmRvKChldmVudCkgPT4ge1xyXG4gICAgICogICBjb25zb2xlLmxvZygnQnV0dG9uIGNsaWNrZWQhJywgZXZlbnQudGFyZ2V0KTtcclxuICAgICAqIH0pO1xyXG4gICAgICovXHJcbiAgICBhcHgubGlzdGVuID0gZnVuY3Rpb24gKGV2ZW50VHlwZXMsIHNlY29uZEFyZ3VtZW50LCB0aGlyZEFyZ3VtZW50KSB7XHJcbiAgICAgICAgbGV0IHNlbGVjdG9yO1xyXG4gICAgICAgIGxldCBvcHRpb25zID0ge307XHJcbiAgICAgICAgLy8gRGV0ZXJtaW5lIGlmIHRoZSBzZWNvbmQgYXJndW1lbnQgaXMgYSBzZWxlY3RvciBvciBvcHRpb25zXHJcbiAgICAgICAgaWYgKHR5cGVvZiBzZWNvbmRBcmd1bWVudCA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgICAgICAgc2VsZWN0b3IgPSBzZWNvbmRBcmd1bWVudDtcclxuICAgICAgICAgICAgb3B0aW9ucyA9IHRoaXJkQXJndW1lbnQgfHwge307XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgb3B0aW9ucyA9IHNlY29uZEFyZ3VtZW50IHx8IHt9O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgdW5pcXVlSWQgPSBnZW5lcmF0ZVVuaXF1ZUlkKCk7XHJcbiAgICAgICAgY29uc3QgdGltZW91dER1cmF0aW9uID0gb3B0aW9ucy50aW1lb3V0IHx8IDA7XHJcbiAgICAgICAgXHJcbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGV2ZW50VHlwZXMpKSB7XHJcbiAgICAgICAgICAgIGV2ZW50VHlwZXMgPSBbZXZlbnRUeXBlc107IC8vIEVuc3VyZSBldmVudFR5cGVzIGlzIGFuIGFycmF5XHJcbiAgICAgICAgfVxyXG4gICAgICAgIFxyXG4gICAgICAgIGV2ZW50VHlwZXMuZm9yRWFjaCgoZXZlbnRUeXBlKSA9PiB7XHJcbiAgICAgICAgICAgIGVsZW1lbnRzLmZvckVhY2goKGVsZW1lbnQpID0+IHtcclxuICAgICAgICAgICAgICAgIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihldmVudFR5cGUsIChldmVudCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVDYWxsYmFja3MoZXZlbnQsIHVuaXF1ZUlkLCB0aW1lb3V0RHVyYXRpb24sIHNlbGVjdG9yLCBlbGVtZW50KTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgLyoqXHJcbiAgICAgICAgICAgICAqIEFkZHMgYSBjYWxsYmFjayBmdW5jdGlvbiB0byB0aGUgZG9DYWxsYmFja3Mgb2JqZWN0IGZvciB0aGUgY3VycmVudCBldmVudCBsaXN0ZW5lci5cclxuICAgICAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZG9DYWxsYmFjayAtIFRoZSBjYWxsYmFjayBmdW5jdGlvbiB0byBleGVjdXRlIHdoZW4gdGhlIGV2ZW50IGlzIHRyaWdnZXJlZC5cclxuICAgICAgICAgICAgICogQHJldHVybnMge09iamVjdH0gLSBSZXR1cm5zIHRoZSBjdXJyZW50IG9iamVjdCB0byBhbGxvdyBmb3IgY2hhaW5lZCBjYWxscy5cclxuICAgICAgICAgICAgICogQGV4YW1wbGVcclxuICAgICAgICAgICAgICogYXB4Lmxpc3RlbignY2xpY2snLCAnLm15LWJ1dHRvbicpLmRvKChldmVudCkgPT4ge1xyXG4gICAgICAgICAgICAgKiAgIGNvbnNvbGUubG9nKCdCdXR0b24gY2xpY2tlZCEnLCBldmVudC50YXJnZXQpO1xyXG4gICAgICAgICAgICAgKiB9KS5kbygoZXZlbnQpID0+IHtcclxuICAgICAgICAgICAgICogICBjb25zb2xlLmxvZygnQW5vdGhlciBjYWxsYmFjayBmdW5jdGlvbiEnKTtcclxuICAgICAgICAgICAgICogfSk7XHJcbiAgICAgICAgICAgICAqL1xyXG4gICAgICAgICAgICBkbzogZnVuY3Rpb24gKGRvQ2FsbGJhY2spIHtcclxuICAgICAgICAgICAgICAgIGlmICghZG9DYWxsYmFja3NbdW5pcXVlSWRdKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZG9DYWxsYmFja3NbdW5pcXVlSWRdID0gW107XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBkb0NhbGxiYWNrc1t1bmlxdWVJZF0ucHVzaChkb0NhbGxiYWNrKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOyAvLyBSZXR1cm4gdGhlIG9iamVjdCB0byBhbGxvdyBmb3IgY2hhaW5lZCBjYWxsc1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgIH07XHJcbiAgICB9O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogTWFudWFsbHkgdHJpZ2dlcnMgdGhlIHJlZ2lzdGVyZWQgY2FsbGJhY2tzIGZvciBhIGdpdmVuIGV2ZW50IHR5cGUgb24gYWxsIGVsZW1lbnRzIG9yIGNyZWF0ZXMgYSBuZXcgZXZlbnQgaWYgYSBzdHJpbmcgaXMgcHJvdmlkZWQuXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ3xFdmVudH0gZXZlbnQgLSBUaGUgZXZlbnQgdG8gdHJpZ2dlci4gVGhpcyBjYW4gYmUgYW4gZXZlbnQgdHlwZSBzdHJpbmcgKGxpa2UgJ2NsaWNrJykgb3IgYW4gYWN0dWFsIEV2ZW50IG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgYXB4LnRyaWdnZXIgPSBmdW5jdGlvbiAoZXZlbnQpIHtcclxuICAgICAgICBsZXQgZXZlbnRUeXBlO1xyXG4gICAgICAgIGlmICh0eXBlb2YgZXZlbnQgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgICAgIGV2ZW50VHlwZSA9IGV2ZW50O1xyXG4gICAgICAgICAgICBldmVudCA9IG5ldyBFdmVudChldmVudCwgeyBidWJibGVzOiB0cnVlLCBjYW5jZWxhYmxlOiB0cnVlIH0pO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoZXZlbnQgaW5zdGFuY2VvZiBFdmVudCkge1xyXG4gICAgICAgICAgICBldmVudFR5cGUgPSBldmVudC50eXBlO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0ludmFsaWQgZXZlbnQgdHlwZSBwcm92aWRlZCB0byBhcHgudHJpZ2dlci4gSXQgbXVzdCBiZSBlaXRoZXIgYSBzdHJpbmcgb3IgRXZlbnQgb2JqZWN0LicpO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBhcHguZWxlbWVudHMuZm9yRWFjaCgoZWxlbWVudCkgPT4ge1xyXG4gICAgICAgICAgICBlbGVtZW50LmRpc3BhdGNoRXZlbnQoZXZlbnQpOyAgLy8gVGhpcyB3aWxsIGFsbG93IHRoZSBldmVudCB0byBidWJibGUgdXAgbmF0dXJhbGx5LlxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICAvLyBIYW5kbGUgZXZlbnQgZGVsZWdhdGlvbiBtYW51YWxseSBieSBleGVjdXRpbmcgY2FsbGJhY2tzIGlmIHRoZSB0YXJnZXQgbWF0Y2hlcyB0aGUgc2VsZWN0b3JcclxuICAgICAgICBPYmplY3Qua2V5cyhkb0NhbGxiYWNrcykuZm9yRWFjaCgodW5pcXVlSWQpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgY2FsbGJhY2tEZXRhaWxzID0gZG9DYWxsYmFja3NbdW5pcXVlSWRdO1xyXG4gICAgICAgICAgICBpZiAoY2FsbGJhY2tEZXRhaWxzICYmIGNhbGxiYWNrRGV0YWlscy5ldmVudFR5cGUgPT09IGV2ZW50VHlwZSkge1xyXG4gICAgICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIGV2ZW50IHRhcmdldCBtYXRjaGVzIHRoZSBzZWxlY3RvciB1c2VkIGR1cmluZyBsaXN0ZW5lciByZWdpc3RyYXRpb25cclxuICAgICAgICAgICAgICAgIGNvbnN0IHsgc2VsZWN0b3IgfSA9IGNhbGxiYWNrRGV0YWlscztcclxuICAgICAgICAgICAgICAgIGlmICghc2VsZWN0b3IgfHwgZXZlbnQudGFyZ2V0Lm1hdGNoZXMoc2VsZWN0b3IpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZUNhbGxiYWNrcyhldmVudCwgdW5pcXVlSWQsIDAsIHNlbGVjdG9yLCBldmVudC50YXJnZXQpOyAgLy8gSW1tZWRpYXRlIGV4ZWN1dGlvbiwgbm8gdGltZW91dFxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9O1xyXG4gICAgXHJcbiAgICByZXR1cm4gYXB4O1xyXG59O1xyXG5cclxuXHJcbmZ1bmN0aW9uIGV4ZWN1dGVDYWxsYmFja3MoZXZlbnQsIHVuaXF1ZUlkLCB0aW1lb3V0RHVyYXRpb24sIHNlbGVjdG9yID0gJycsIGVsZW1lbnQpIHtcclxuICAgIGNvbnN0IG1hdGNoZWRFbGVtZW50ID0gc2VsZWN0b3IgPyBjbG9zZXN0KGV2ZW50LnRhcmdldCwgc2VsZWN0b3IpIDogZWxlbWVudDtcclxuICAgIGlmICghbWF0Y2hlZEVsZW1lbnQpIHtcclxuICAgICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgLy8gQ2xlYXIgYW55IHByZXZpb3VzIHRpbWVvdXQgZm9yIHRoaXMgdW5pcXVlSWQgdG8gcHJldmVudCB1bmludGVuZGVkIGJlaGF2aW9yXHJcbiAgICBjbGVhclRpbWVvdXQodGltZW91dHNbdW5pcXVlSWRdKTtcclxuXHJcbiAgICAvLyBGdW5jdGlvbiB0byBoYW5kbGUgdGhlIGV4ZWN1dGlvbiBvZiBjYWxsYmFja3NcclxuICAgIGZ1bmN0aW9uIGhhbmRsZUNhbGxiYWNrRXhlY3V0aW9uKCkge1xyXG4gICAgICAgIGlmIChkb0NhbGxiYWNrc1t1bmlxdWVJZF0pIHtcclxuICAgICAgICAgICAgZG9DYWxsYmFja3NbdW5pcXVlSWRdLnJlZHVjZSgocHJldlByb21pc2UsIGRvQ2FsbGJhY2spID0+IHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBwcmV2UHJvbWlzZS50aGVuKCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gZG9DYWxsYmFjay5iaW5kKG1hdGNoZWRFbGVtZW50KShldmVudCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgUHJvbWlzZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC50aGVuKHJlc29sdmUpLmNhdGNoKHJlamVjdCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUocmVzdWx0KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChlcnJvcik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9LCBQcm9taXNlLnJlc29sdmUoKSkuY2F0Y2goZXJyb3IgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgaW4gY2FsbGJhY2sgY2hhaW46JywgZXJyb3IpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8gQ2hlY2sgaWYgdGltZW91dER1cmF0aW9uIGlzIHplcm8gdG8gZGVjaWRlIHdoZXRoZXIgdG8gZGVsYXkgdGhlIGNhbGxiYWNrIGV4ZWN1dGlvbiBvciBub3RcclxuICAgIGlmICh0aW1lb3V0RHVyYXRpb24gPT09IDApIHtcclxuICAgICAgICBoYW5kbGVDYWxsYmFja0V4ZWN1dGlvbigpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgICB0aW1lb3V0c1t1bmlxdWVJZF0gPSBzZXRUaW1lb3V0KGhhbmRsZUNhbGxiYWNrRXhlY3V0aW9uLCB0aW1lb3V0RHVyYXRpb24pO1xyXG4gICAgfVxyXG59XHJcblxyXG5cclxuZnVuY3Rpb24gZ2VuZXJhdGVVbmlxdWVJZCgpIHtcclxuICAgIGNvbnN0IHJhbmRvbVBhcnQgPSBNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5zdWJzdHIoMiwgOSk7IC8vIE1vcmUgcmFuZG9tbmVzc1xyXG4gICAgY29uc3QgdW5pcXVlSWQgPSBgJHtEYXRlLm5vdygpfV8ke3JhbmRvbVBhcnR9XyR7Y291bnRlcn1gO1xyXG4gICAgY291bnRlciA9IChjb3VudGVyICsgMSkgJSAxMDAwOyAvLyBSZXNldCBjb3VudGVyIHRvIGF2b2lkIG92ZXJmbG93XHJcblxyXG4gICAgcmV0dXJuIHVuaXF1ZUlkO1xyXG59XHJcblxyXG5mdW5jdGlvbiBjbG9zZXN0KGVsZW1lbnQsIHNlbGVjdG9yKSB7XHJcbiAgICB3aGlsZSAoZWxlbWVudCAmJiBlbGVtZW50Lm5vZGVUeXBlID09PSAxKSB7XHJcbiAgICAgICAgaWYgKGVsZW1lbnQubWF0Y2hlcyhzZWxlY3RvcikpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsZW1lbnQgPSBlbGVtZW50LnBhcmVudE5vZGU7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbnVsbDtcclxufVxyXG4iLCIvLyBNaW5pbWFsLCBmcmFtZXdvcmstYWdub3N0aWMgVG9hc3RNYW5hZ2VyIGZvciBBUFhcclxuLy8gRVNNLWZpcnN0LCBubyBzaWRlIGVmZmVjdHMgb24gaW1wb3J0LiBET00gb25seSB3aGVuIHVzZWQuXHJcbmltcG9ydCAnLi9jc3MvdG9hc3QuY3NzJztcclxuXHJcbi8qKlxyXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBQb3NpdGlvbk9iamVjdFxyXG4gKiBAcHJvcGVydHkgeydzdGlja3knfCdyZWxhdGl2ZSd8J2FuY2hvcmVkJ30gW3R5cGVdXHJcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbeF1cclxuICogQHByb3BlcnR5IHtzdHJpbmd9IFt5XVxyXG4gKiBAcHJvcGVydHkge0hUTUxFbGVtZW50fSBbZWxlbWVudF1cclxuICogQHByb3BlcnR5IHsndG9wJ3wncmlnaHQnfCdib3R0b20nfCdsZWZ0J3wnYWJvdmUnfCdiZWxvdyd8J2JlZm9yZSd8J2FmdGVyJ30gW3BsYWNlbWVudF1cclxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtnYXBdXHJcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW3VzZU5hdGl2ZUNTU11cclxuICovXHJcblxyXG4vKipcclxuICogQHR5cGVkZWYge3N0cmluZ3xQb3NpdGlvbk9iamVjdH0gUG9zaXRpb25cclxuICovXHJcblxyXG4vKipcclxuICogQHR5cGVkZWYge09iamVjdH0gVG9hc3RDb25maWdcclxuICogQHByb3BlcnR5IHtQb3NpdGlvbn0gW3Bvc2l0aW9uXVxyXG4gKiBAcHJvcGVydHkgeyd1cCd8J2Rvd24nfCdhdXRvJ30gW2Zsb3ddIEZsb3cgZGlyZWN0aW9uIGZvciBzdGFja2luZyB0b2FzdHMuICdhdXRvJyBkZXRlcm1pbmVzIGJhc2VkIG9uIHBvc2l0aW9uLiBEZWZhdWx0OiAnYXV0bydcclxuICogQHByb3BlcnR5IHtudW1iZXJ9IFttYXhUb2FzdHNdXHJcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbZGVmYXVsdER1cmF0aW9uTXNdXHJcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbekluZGV4XVxyXG4gKiBAcHJvcGVydHkgeydwb2xpdGUnfCdhc3NlcnRpdmUnfCdvZmYnfSBbYXJpYUxpdmVdXHJcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbZ2FwXVxyXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtkZWR1cGVdXHJcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbY29udGFpbmVyQ2xhc3NdXHJcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbb2Zmc2V0XVxyXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2lkXVxyXG4gKiBAcHJvcGVydHkge2Jvb2xlYW58e2VuYWJsZTogYm9vbGVhbiwgcG9zaXRpb246ICd0b3AnfCdib3R0b20nfX0gW3Byb2dyZXNzXSBEZWZhdWx0OiBmYWxzZS4gU2hvdyBwcm9ncmVzcyBiYXIgd2hlbiB0cnVlIG9yIHsgZW5hYmxlOiB0cnVlLCBwb3NpdGlvbjogJ3RvcCd8J2JvdHRvbScgfS5cclxuICovXHJcblxyXG4vKipcclxuICogQHR5cGVkZWYge3tlbmFibGU6IGJvb2xlYW4sIHBvc2l0aW9uOiAndG9wJ3wnYm90dG9tJywgcGF1c2VCdXR0b246IGJvb2xlYW59fSBQcm9ncmVzc09wdFxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBUb2FzdE9wdGlvbnNcclxuICogQHByb3BlcnR5IHtzdHJpbmd8Tm9kZX0gbWVzc2FnZVxyXG4gKiBAcHJvcGVydHkgeydpbmZvJ3wnc3VjY2Vzcyd8J3dhcm5pbmcnfCdkYW5nZXInfSBbdHlwZV1cclxuICogQHByb3BlcnR5IHtudW1iZXJ9IFtkdXJhdGlvbk1zXVxyXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtkaXNtaXNzaWJsZV1cclxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtpZF1cclxuICogQHByb3BlcnR5IHsocmVmOiBUb2FzdFJlZiwgZXY6IE1vdXNlRXZlbnQpID0+IHZvaWR9IFtvbkNsaWNrXVxyXG4gKiBAcHJvcGVydHkgeyhyZWY6IFRvYXN0UmVmLCByZWFzb246ICd0aW1lb3V0J3wnY2xvc2UnfCdhcGknfCdvdmVyZmxvdycpID0+IHZvaWR9IFtvbkNsb3NlXVxyXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2NsYXNzTmFtZV1cclxuICogQHByb3BlcnR5IHtQb3NpdGlvbn0gW3Bvc2l0aW9uXVxyXG4gKiBAcHJvcGVydHkgeyd1cCd8J2Rvd24nfCdhdXRvJ30gW2Zsb3ddIEZsb3cgZGlyZWN0aW9uIGZvciBzdGFja2luZyB0b2FzdHMuICdhdXRvJyBkZXRlcm1pbmVzIGJhc2VkIG9uIHBvc2l0aW9uLiBEZWZhdWx0OiAnYXV0bydcclxuICogQHByb3BlcnR5IHtib29sZWFufHtlbmFibGU6IGJvb2xlYW4sIHBvc2l0aW9uOiAndG9wJ3wnYm90dG9tJywgcGF1c2VCdXR0b24/OiBib29sZWFufX0gW3Byb2dyZXNzXSBTaG93IHByb2dyZXNzIGJhcjogdHJ1ZSA9IHRvcCwgb3IgeyBlbmFibGUsIHBvc2l0aW9uLCBwYXVzZUJ1dHRvbiB9IChwYXVzZUJ1dHRvbiBkZWZhdWx0IGZhbHNlKS5cclxuICovXHJcblxyXG4vKipcclxuICogQHR5cGVkZWYge09iamVjdH0gVG9hc3RSZWZcclxuICogQHByb3BlcnR5IHtzdHJpbmd9IGlkXHJcbiAqIEBwcm9wZXJ0eSB7SFRNTEVsZW1lbnR9IGVsXHJcbiAqIEBwcm9wZXJ0eSB7KHJlYXNvbj86ICdhcGknfCdjbG9zZScpID0+IHZvaWR9IGNsb3NlXHJcbiAqIEBwcm9wZXJ0eSB7KHBhcnRpYWw6IFBhcnRpYWw8VG9hc3RPcHRpb25zPikgPT4gdm9pZH0gdXBkYXRlXHJcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gUHJvbWlzZTx2b2lkPn0gd2hlbkNsb3NlZFxyXG4gKiBAcHJvcGVydHkgeyhldmVudDogJ2Nsb3NlJ3wnY2xpY2snLCBoYW5kbGVyOiBGdW5jdGlvbikgPT4gKCkgPT4gdm9pZH0gb25cclxuICogQHByb3BlcnR5IHsoZXZlbnQ6ICdjbG9zZSd8J2NsaWNrJywgaGFuZGxlcjogRnVuY3Rpb24pID0+IHZvaWR9IG9mZlxyXG4gKi9cclxuXHJcbmNvbnN0IGlzQnJvd3NlciA9IHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBkb2N1bWVudCAhPT0gJ3VuZGVmaW5lZCc7XHJcblxyXG4vLyBTaGFyZWQgY29udGFpbmVyIGNhY2hlOiBNYXA8cG9zaXRpb24sIEhUTUxFbGVtZW50PlxyXG4vLyBDb250YWluZXJzIGFyZSBzaGFyZWQgYmV0d2VlbiBtYW5hZ2VycyB3aXRoIHRoZSBzYW1lIHBvc2l0aW9uXHJcbmNvbnN0IF9jb250YWluZXJDYWNoZSA9IG5ldyBNYXAoKTtcclxuXHJcbi8vIEdhcmJhZ2UgY29sbGVjdGlvbjogY2xlYW51cCBlbXB0eSB1bm1hbmFnZWQgY29udGFpbmVycyBhZnRlciBhIGRlbGF5XHJcbmNvbnN0IEdDX0RFTEFZX01TID0gMjAwMDA7IC8vIDIwIHNlY29uZHNcclxubGV0IF9nY1RpbWVvdXRJZCA9IG51bGw7XHJcblxyXG4vLyBXcmFwcGVyIGZvciBhbGwgdG9hc3QgY29udGFpbmVycyAoa2VlcHMgRE9NIGNsZWFuKVxyXG5sZXQgX3RvYXN0V3JhcHBlciA9IG51bGw7XHJcblxyXG4vKipcclxuICogR2V0IG9yIGNyZWF0ZSB0aGUgdG9hc3QgY29udGFpbmVycyB3cmFwcGVyXHJcbiAqIEByZXR1cm5zIHtIVE1MRWxlbWVudHxudWxsfVxyXG4gKi9cclxuZnVuY3Rpb24gZ2V0VG9hc3RXcmFwcGVyKCkge1xyXG4gICAgaWYgKCFpc0Jyb3dzZXIpIHJldHVybiBudWxsO1xyXG4gICAgXHJcbiAgICBpZiAoIV90b2FzdFdyYXBwZXIpIHtcclxuICAgICAgICBfdG9hc3RXcmFwcGVyID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLkFQWC10b2FzdC13cmFwcGVyJyk7XHJcbiAgICAgICAgaWYgKCFfdG9hc3RXcmFwcGVyKSB7XHJcbiAgICAgICAgICAgIF90b2FzdFdyYXBwZXIgPSBjcmVhdGVFbCgnZGl2JywgJ0FQWC10b2FzdC13cmFwcGVyJyk7XHJcbiAgICAgICAgICAgIF90b2FzdFdyYXBwZXIuc3R5bGUucG9zaXRpb24gPSAnZml4ZWQnO1xyXG4gICAgICAgICAgICBfdG9hc3RXcmFwcGVyLnN0eWxlLnRvcCA9ICcwJztcclxuICAgICAgICAgICAgX3RvYXN0V3JhcHBlci5zdHlsZS5sZWZ0ID0gJzAnO1xyXG4gICAgICAgICAgICBfdG9hc3RXcmFwcGVyLnN0eWxlLndpZHRoID0gJzAnO1xyXG4gICAgICAgICAgICBfdG9hc3RXcmFwcGVyLnN0eWxlLmhlaWdodCA9ICcwJztcclxuICAgICAgICAgICAgX3RvYXN0V3JhcHBlci5zdHlsZS5wb2ludGVyRXZlbnRzID0gJ25vbmUnO1xyXG4gICAgICAgICAgICBfdG9hc3RXcmFwcGVyLnN0eWxlLnpJbmRleCA9ICcxMDAwMCc7IC8vIEJlbG93IGNvbnRhaW5lcnMgYnV0IGFib3ZlIG1vc3QgY29udGVudFxyXG4gICAgICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKF90b2FzdFdyYXBwZXIpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIFxyXG4gICAgcmV0dXJuIF90b2FzdFdyYXBwZXI7XHJcbn1cclxuXHJcbmNvbnN0IERFRkFVTFRfQ09ORklHID0ge1xyXG4gICAgcG9zaXRpb246ICdib3R0b20tcmlnaHQnLFxyXG4gICAgbWF4VG9hc3RzOiA1LFxyXG4gICAgZGVmYXVsdER1cmF0aW9uTXM6IDUwMDAsXHJcbiAgICB6SW5kZXg6IDExMDAwLFxyXG4gICAgYXJpYUxpdmU6ICdwb2xpdGUnLFxyXG4gICAgZ2FwOiA4LFxyXG4gICAgZGVkdXBlOiBmYWxzZSxcclxuICAgIGNvbnRhaW5lckNsYXNzOiAnJyxcclxuICAgIG9mZnNldDogMCxcclxuICAgIHByb2dyZXNzOiBmYWxzZVxyXG59O1xyXG5cclxuLyoqXHJcbiAqIENyZWF0ZSBhbiBlbGVtZW50IHdpdGggY2xhc3Nlc1xyXG4gKi9cclxuZnVuY3Rpb24gY3JlYXRlRWwodGFnLCBjbGFzc05hbWVzKSB7XHJcbiAgICBjb25zdCBlbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQodGFnKTtcclxuICAgIGlmIChjbGFzc05hbWVzKSB7XHJcbiAgICAgICAgY2xhc3NOYW1lcy5zcGxpdCgnICcpLmZpbHRlcihCb29sZWFuKS5mb3JFYWNoKGMgPT4gZWwuY2xhc3NMaXN0LmFkZChjKSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZWw7XHJcbn1cclxuXHJcbi8qKiBNaW5pbWFsIGxpbmUtYmFzZWQgcGF1c2UgKHR3byBiYXJzKSAvIHJlc3VtZSAodHJpYW5nbGUgcmlnaHQpIGljb24gU1ZHLiBVc2VzIGN1cnJlbnRDb2xvci4gKi9cclxuZnVuY3Rpb24gZ2V0UHJvZ3Jlc3NQYXVzZVJlc3VtZUljb25TVkcocGF1c2VkKSB7XHJcbiAgICBpZiAocGF1c2VkKSB7XHJcbiAgICAgICAgcmV0dXJuIGA8c3ZnIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjJcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PHBhdGggZD1cIk04IDZMOCAxOEwxNyAxMlpcIi8+PC9zdmc+YDtcclxuICAgIH1cclxuICAgIHJldHVybiBgPHN2ZyB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIyXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjxsaW5lIHgxPVwiOVwiIHkxPVwiNlwiIHgyPVwiOVwiIHkyPVwiMThcIi8+PGxpbmUgeDE9XCIxNVwiIHkxPVwiNlwiIHgyPVwiMTVcIiB5Mj1cIjE4XCIvPjwvc3ZnPmA7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBDcmVhdGUgYW5kIGluc2VydCBwcm9ncmVzcyBibG9jayAodHJhY2sgKyBiYXIsIG9wdGlvbmFsIHBhdXNlIGJ1dHRvbikgaW50byB0b2FzdC4gQnV0dG9uIGlzIGZpeGVkIGF0IGxlZnQgdmlhIHRyYWNrIGxheW91dC5cclxuICogQHBhcmFtIHtIVE1MRWxlbWVudH0gdG9hc3RFbFxyXG4gKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBjb250ZW50RWxcclxuICogQHBhcmFtIHtIVE1MRWxlbWVudHxudWxsfSBjbG9zZUJ0blxyXG4gKiBAcGFyYW0ge1Byb2dyZXNzT3B0fSBwcm9ncmVzc09wdFxyXG4gKiBAcmV0dXJucyB7eyB3cmFwOiBIVE1MRWxlbWVudCwgYmFyOiBIVE1MRWxlbWVudCwgcGF1c2VCdG46IEhUTUxFbGVtZW50fG51bGwgfX1cclxuICovXHJcbmZ1bmN0aW9uIGNyZWF0ZVByb2dyZXNzQmxvY2sodG9hc3RFbCwgY29udGVudEVsLCBjbG9zZUJ0biwgcHJvZ3Jlc3NPcHQpIHtcclxuICAgIGNvbnN0IHBvcyA9IHByb2dyZXNzT3B0LnBvc2l0aW9uO1xyXG4gICAgY29uc3Qgc2hvd1BhdXNlQnV0dG9uID0gcHJvZ3Jlc3NPcHQucGF1c2VCdXR0b24gPT09IHRydWU7XHJcbiAgICBjb25zdCB3cmFwID0gY3JlYXRlRWwoJ2RpdicsIGBBUFgtdG9hc3RfX3Byb2dyZXNzIEFQWC10b2FzdF9fcHJvZ3Jlc3MtLSR7cG9zfWApO1xyXG4gICAgY29uc3QgdHJhY2sgPSBjcmVhdGVFbCgnZGl2JywgJ0FQWC10b2FzdF9fcHJvZ3Jlc3MtdHJhY2snKTtcclxuICAgIGNvbnN0IGJhciA9IGNyZWF0ZUVsKCdkaXYnLCAnQVBYLXRvYXN0X19wcm9ncmVzcy1iYXInKTtcclxuICAgIGJhci5zZXRBdHRyaWJ1dGUoJ3JvbGUnLCAncHJvZ3Jlc3NiYXInKTtcclxuICAgIGJhci5zZXRBdHRyaWJ1dGUoJ2FyaWEtdmFsdWVtaW4nLCAnMCcpO1xyXG4gICAgYmFyLnNldEF0dHJpYnV0ZSgnYXJpYS12YWx1ZW1heCcsICcxMDAnKTtcclxuICAgIGJhci5zZXRBdHRyaWJ1dGUoJ2FyaWEtbGFiZWwnLCAnVGVtcHMgcmVzdGFudCcpO1xyXG4gICAgYmFyLnNldEF0dHJpYnV0ZSgnYXJpYS12YWx1ZW5vdycsICcxMDAnKTtcclxuICAgIGJhci5zdHlsZS53aWR0aCA9ICcxMDAlJztcclxuICAgIHRyYWNrLmFwcGVuZENoaWxkKGJhcik7XHJcbiAgICB3cmFwLmFwcGVuZENoaWxkKHRyYWNrKTtcclxuICAgIGxldCBwYXVzZUJ0biA9IG51bGw7XHJcbiAgICBpZiAoc2hvd1BhdXNlQnV0dG9uKSB7XHJcbiAgICAgICAgcGF1c2VCdG4gPSBjcmVhdGVFbCgnYnV0dG9uJywgJ0FQWC10b2FzdF9fcHJvZ3Jlc3MtcGF1c2UnKTtcclxuICAgICAgICBwYXVzZUJ0bi50eXBlID0gJ2J1dHRvbic7XHJcbiAgICAgICAgcGF1c2VCdG4uc2V0QXR0cmlidXRlKCdhcmlhLWxhYmVsJywgJ1BhdXNlJyk7XHJcbiAgICAgICAgcGF1c2VCdG4uc2V0QXR0cmlidXRlKCd0aXRsZScsICdQYXVzZScpO1xyXG4gICAgICAgIHBhdXNlQnRuLmlubmVySFRNTCA9IGdldFByb2dyZXNzUGF1c2VSZXN1bWVJY29uU1ZHKGZhbHNlKTsgLy8gcnVubmluZyA9IHNob3cgcGF1c2UgaWNvblxyXG4gICAgICAgIHdyYXAuaW5zZXJ0QmVmb3JlKHBhdXNlQnRuLCB0cmFjayk7XHJcbiAgICB9XHJcbiAgICBpZiAocG9zID09PSAndG9wJykge1xyXG4gICAgICAgIHRvYXN0RWwuaW5zZXJ0QmVmb3JlKHdyYXAsIGNvbnRlbnRFbCk7XHJcbiAgICAgICAgdG9hc3RFbC5jbGFzc0xpc3QuYWRkKCdBUFgtdG9hc3QtLWhhcy1wcm9ncmVzcy10b3AnKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdG9hc3RFbC5pbnNlcnRCZWZvcmUod3JhcCwgY2xvc2VCdG4pO1xyXG4gICAgICAgIHRvYXN0RWwuY2xhc3NMaXN0LmFkZCgnQVBYLXRvYXN0LS1oYXMtcHJvZ3Jlc3MtYm90dG9tJyk7XHJcbiAgICB9XHJcbiAgICBpZiAoc2hvd1BhdXNlQnV0dG9uKSB0b2FzdEVsLmNsYXNzTGlzdC5hZGQoJ0FQWC10b2FzdC0taGFzLXByb2dyZXNzLXBhdXNlJyk7XHJcbiAgICByZXR1cm4geyB3cmFwLCBiYXIsIHBhdXNlQnRuIH07XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBVcGRhdGUgcHJvZ3Jlc3MgYmxvY2sgcG9zaXRpb24gKGNsYXNzZXMgKyBET00gb3JkZXIpXHJcbiAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IHRvYXN0RWxcclxuICogQHBhcmFtIHtIVE1MRWxlbWVudH0gcHJvZ3Jlc3NXcmFwXHJcbiAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGNvbnRlbnRFbFxyXG4gKiBAcGFyYW0ge0hUTUxFbGVtZW50fG51bGx9IGNsb3NlQnRuXHJcbiAqIEBwYXJhbSB7J3RvcCd8J2JvdHRvbSd9IHBvc1xyXG4gKi9cclxuZnVuY3Rpb24gYXBwbHlQcm9ncmVzc1Bvc2l0aW9uKHRvYXN0RWwsIHByb2dyZXNzV3JhcCwgY29udGVudEVsLCBjbG9zZUJ0biwgcG9zKSB7XHJcbiAgICB0b2FzdEVsLmNsYXNzTGlzdC5yZW1vdmUoJ0FQWC10b2FzdC0taGFzLXByb2dyZXNzLXRvcCcsICdBUFgtdG9hc3QtLWhhcy1wcm9ncmVzcy1ib3R0b20nKTtcclxuICAgIHRvYXN0RWwuY2xhc3NMaXN0LmFkZChwb3MgPT09ICd0b3AnID8gJ0FQWC10b2FzdC0taGFzLXByb2dyZXNzLXRvcCcgOiAnQVBYLXRvYXN0LS1oYXMtcHJvZ3Jlc3MtYm90dG9tJyk7XHJcbiAgICBwcm9ncmVzc1dyYXAuY2xhc3NMaXN0LnJlbW92ZSgnQVBYLXRvYXN0X19wcm9ncmVzcy0tdG9wJywgJ0FQWC10b2FzdF9fcHJvZ3Jlc3MtLWJvdHRvbScpO1xyXG4gICAgcHJvZ3Jlc3NXcmFwLmNsYXNzTGlzdC5hZGQoYEFQWC10b2FzdF9fcHJvZ3Jlc3MtLSR7cG9zfWApO1xyXG4gICAgY29uc3QgdGFyZ2V0ID0gcG9zID09PSAndG9wJyA/IGNvbnRlbnRFbCA6IGNsb3NlQnRuO1xyXG4gICAgaWYgKHByb2dyZXNzV3JhcC5uZXh0RWxlbWVudFNpYmxpbmcgIT09IHRhcmdldCkgdG9hc3RFbC5pbnNlcnRCZWZvcmUocHJvZ3Jlc3NXcmFwLCB0YXJnZXQpO1xyXG59XHJcblxyXG4vKipcclxuICogUmVzb2x2ZSBwcm9ncmVzcyBvcHRpb24gZnJvbSBwZXItY2FsbCBvcHRpb24gYW5kIGNvbmZpZyBkZWZhdWx0XHJcbiAqIEBwYXJhbSB7Ym9vbGVhbnx7ZW5hYmxlOiBib29sZWFuLCBwb3NpdGlvbjogJ3RvcCd8J2JvdHRvbSd9fHVuZGVmaW5lZH0gb3B0aW9uXHJcbiAqIEBwYXJhbSB7Ym9vbGVhbnx7ZW5hYmxlOiBib29sZWFuLCBwb3NpdGlvbjogJ3RvcCd8J2JvdHRvbSd9fHVuZGVmaW5lZH0gY29uZmlnRGVmYXVsdFxyXG4gKiBAcmV0dXJucyB7UHJvZ3Jlc3NPcHR9XHJcbiAqL1xyXG5mdW5jdGlvbiByZXNvbHZlUHJvZ3Jlc3Mob3B0aW9uLCBjb25maWdEZWZhdWx0KSB7XHJcbiAgICBjb25zdCBmcm9tQ29uZmlnID0gY29uZmlnRGVmYXVsdCA9PT0gdHJ1ZVxyXG4gICAgICAgID8geyBlbmFibGU6IHRydWUsIHBvc2l0aW9uOiAndG9wJywgcGF1c2VCdXR0b246IGZhbHNlIH1cclxuICAgICAgICA6IChjb25maWdEZWZhdWx0ICYmIHR5cGVvZiBjb25maWdEZWZhdWx0ID09PSAnb2JqZWN0J1xyXG4gICAgICAgICAgICA/IHtcclxuICAgICAgICAgICAgICAgIGVuYWJsZTogISFjb25maWdEZWZhdWx0LmVuYWJsZSxcclxuICAgICAgICAgICAgICAgIHBvc2l0aW9uOiBjb25maWdEZWZhdWx0LnBvc2l0aW9uID09PSAnYm90dG9tJyA/ICdib3R0b20nIDogJ3RvcCcsXHJcbiAgICAgICAgICAgICAgICBwYXVzZUJ1dHRvbjogY29uZmlnRGVmYXVsdC5wYXVzZUJ1dHRvbiA9PT0gdHJ1ZVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIDogeyBlbmFibGU6IGZhbHNlLCBwb3NpdGlvbjogJ3RvcCcsIHBhdXNlQnV0dG9uOiBmYWxzZSB9KTtcclxuICAgIGlmIChvcHRpb24gPT09IHVuZGVmaW5lZCB8fCBvcHRpb24gPT09IG51bGwpIHJldHVybiBmcm9tQ29uZmlnO1xyXG4gICAgaWYgKG9wdGlvbiA9PT0gdHJ1ZSkgcmV0dXJuIHsgZW5hYmxlOiB0cnVlLCBwb3NpdGlvbjogJ3RvcCcsIHBhdXNlQnV0dG9uOiBmYWxzZSB9O1xyXG4gICAgaWYgKHR5cGVvZiBvcHRpb24gPT09ICdvYmplY3QnKSB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgZW5hYmxlOiAhIW9wdGlvbi5lbmFibGUsXHJcbiAgICAgICAgICAgIHBvc2l0aW9uOiBvcHRpb24ucG9zaXRpb24gPT09ICdib3R0b20nID8gJ2JvdHRvbScgOiAndG9wJyxcclxuICAgICAgICAgICAgcGF1c2VCdXR0b246IG9wdGlvbi5wYXVzZUJ1dHRvbiA9PT0gdHJ1ZVxyXG4gICAgICAgIH07XHJcbiAgICB9XHJcbiAgICByZXR1cm4geyBlbmFibGU6IGZhbHNlLCBwb3NpdGlvbjogJ3RvcCcsIHBhdXNlQnV0dG9uOiBmYWxzZSB9O1xyXG59XHJcblxyXG4vKipcclxuICogTm9ybWFsaXplIHBsYWNlbWVudCBzeW5vbnltcyB0byBDU1MgdmFsdWVzXHJcbiAqIEBwYXJhbSB7c3RyaW5nfSBwbGFjZW1lbnRcclxuICogQHJldHVybnMgeyd0b3AnfCdyaWdodCd8J2JvdHRvbSd8J2xlZnQnfVxyXG4gKi9cclxuZnVuY3Rpb24gbm9ybWFsaXplUGxhY2VtZW50KHBsYWNlbWVudCkge1xyXG4gICAgY29uc3Qgc3lub255bXMgPSB7XHJcbiAgICAgICAgJ2Fib3ZlJzogJ3RvcCcsXHJcbiAgICAgICAgJ2JlbG93JzogJ2JvdHRvbScsXHJcbiAgICAgICAgJ2JlZm9yZSc6ICdsZWZ0JyxcclxuICAgICAgICAnYWZ0ZXInOiAncmlnaHQnXHJcbiAgICB9O1xyXG4gICAgcmV0dXJuIHN5bm9ueW1zW3BsYWNlbWVudF0gfHwgcGxhY2VtZW50O1xyXG59XHJcblxyXG4vKipcclxuICogRGV0ZXJtaW5lIGZsb3cgZGlyZWN0aW9uIGJhc2VkIG9uIHBvc2l0aW9uXHJcbiAqIEBwYXJhbSB7UG9zaXRpb259IHBvc2l0aW9uXHJcbiAqIEByZXR1cm5zIHsndXAnfCdkb3duJ31cclxuICovXHJcbmZ1bmN0aW9uIGRldGVybWluZUZsb3cocG9zaXRpb24pIHtcclxuICAgIGlmICh0eXBlb2YgcG9zaXRpb24gPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgLy8gU3RyaW5nIHBvc2l0aW9uczogdG9wID0gdXAsIGJvdHRvbSA9IGRvd25cclxuICAgICAgICBpZiAocG9zaXRpb24uaW5jbHVkZXMoJ3RvcCcpKSByZXR1cm4gJ3VwJztcclxuICAgICAgICBpZiAocG9zaXRpb24uaW5jbHVkZXMoJ2JvdHRvbScpKSByZXR1cm4gJ2Rvd24nO1xyXG4gICAgICAgIHJldHVybiAnZG93bic7IC8vIGRlZmF1bHRcclxuICAgIH1cclxuICAgIFxyXG4gICAgaWYgKHR5cGVvZiBwb3NpdGlvbiA9PT0gJ29iamVjdCcgJiYgcG9zaXRpb24gIT09IG51bGwpIHtcclxuICAgICAgICBjb25zdCB0eXBlID0gcG9zaXRpb24udHlwZSB8fCAocG9zaXRpb24ueCB8fCBwb3NpdGlvbi55ID8gJ3N0aWNreScgOiBudWxsKTtcclxuICAgICAgICBcclxuICAgICAgICBpZiAodHlwZSA9PT0gJ3N0aWNreScgfHwgKCF0eXBlICYmIChwb3NpdGlvbi54IHx8IHBvc2l0aW9uLnkpKSkge1xyXG4gICAgICAgICAgICAvLyBTdGlja3k6IGRldGVybWluZSBiYXNlZCBvbiB5IGNvb3JkaW5hdGVcclxuICAgICAgICAgICAgaWYgKHBvc2l0aW9uLnkgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgLy8gSWYgeSBzdGFydHMgd2l0aCAnLScgb3IgaXMgYSBzbWFsbCB2YWx1ZSwgbGlrZWx5IHRvcCAodXApXHJcbiAgICAgICAgICAgICAgICAvLyBJZiB5IGlzIGEgbGFyZ2UgdmFsdWUgb3IgcGVyY2VudGFnZSwgbGlrZWx5IGJvdHRvbSAoZG93bilcclxuICAgICAgICAgICAgICAgIGlmIChwb3NpdGlvbi55LnN0YXJ0c1dpdGgoJy0nKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIE5lZ2F0aXZlID0gZnJvbSBib3R0b20sIHNvIGZsb3cgZG93blxyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAnZG93bic7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBjb25zdCBudW0gPSBwYXJzZUZsb2F0KHBvc2l0aW9uLnkpO1xyXG4gICAgICAgICAgICAgICAgaWYgKCFpc05hTihudW0pKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gSWYgeSA8IDUwJSBvZiB2aWV3cG9ydCBoZWlnaHQsIGxpa2VseSB0b3AgKHVwKVxyXG4gICAgICAgICAgICAgICAgICAgIC8vIE90aGVyd2lzZSBsaWtlbHkgYm90dG9tIChkb3duKVxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChwb3NpdGlvbi55LmluY2x1ZGVzKCclJykpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bSA8IDUwID8gJ3VwJyA6ICdkb3duJztcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gRm9yIHB4IHZhbHVlcywgYXNzdW1lIDwgNDAwcHggaXMgdG9wICh1cClcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVtIDwgNDAwID8gJ3VwJyA6ICdkb3duJztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gJ2Rvd24nOyAvLyBkZWZhdWx0XHJcbiAgICAgICAgfVxyXG4gICAgICAgIFxyXG4gICAgICAgIGlmICh0eXBlID09PSAnYW5jaG9yZWQnICYmIHBvc2l0aW9uLnBsYWNlbWVudCkge1xyXG4gICAgICAgICAgICAvLyBBbmNob3JlZDogcGxhY2VtZW50IGRldGVybWluZXMgZmxvd1xyXG4gICAgICAgICAgICBjb25zdCBwbGFjZW1lbnQgPSBub3JtYWxpemVQbGFjZW1lbnQocG9zaXRpb24ucGxhY2VtZW50KTtcclxuICAgICAgICAgICAgaWYgKHBsYWNlbWVudCA9PT0gJ3RvcCcgfHwgcGxhY2VtZW50ID09PSAnYWJvdmUnKSByZXR1cm4gJ3VwJztcclxuICAgICAgICAgICAgaWYgKHBsYWNlbWVudCA9PT0gJ2JvdHRvbScgfHwgcGxhY2VtZW50ID09PSAnYmVsb3cnKSByZXR1cm4gJ2Rvd24nO1xyXG4gICAgICAgICAgICAvLyBGb3IgbGVmdC9yaWdodCwgZGVmYXVsdCB0byBkb3duXHJcbiAgICAgICAgICAgIHJldHVybiAnZG93bic7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIFxyXG4gICAgICAgIGlmICh0eXBlID09PSAncmVsYXRpdmUnKSB7XHJcbiAgICAgICAgICAgIC8vIFJlbGF0aXZlOiBkZXRlcm1pbmUgYmFzZWQgb24geSBvZmZzZXRcclxuICAgICAgICAgICAgaWYgKHBvc2l0aW9uLnkgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbnVtID0gcGFyc2VGbG9hdChwb3NpdGlvbi55KTtcclxuICAgICAgICAgICAgICAgIGlmICghaXNOYU4obnVtKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIE5lZ2F0aXZlIHkgPSBhYm92ZSBlbGVtZW50ID0gZmxvdyB1cFxyXG4gICAgICAgICAgICAgICAgICAgIC8vIFBvc2l0aXZlIHkgPSBiZWxvdyBlbGVtZW50ID0gZmxvdyBkb3duXHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bSA8IDAgPyAndXAnIDogJ2Rvd24nO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiAnZG93bic7IC8vIGRlZmF1bHRcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBcclxuICAgIHJldHVybiAnZG93bic7IC8vIGRlZmF1bHRcclxufVxyXG5cclxuLyoqXHJcbiAqIEdhcmJhZ2UgY29sbGVjdGlvbjogcmVtb3ZlIGVtcHR5IHVubWFuYWdlZCBjb250YWluZXJzXHJcbiAqL1xyXG5mdW5jdGlvbiBjbGVhbnVwRW1wdHlDb250YWluZXJzKCkge1xyXG4gICAgaWYgKCFpc0Jyb3dzZXIpIHJldHVybjtcclxuICAgIFxyXG4gICAgY29uc3QgY29udGFpbmVycyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5BUFgtdG9hc3QtY29udGFpbmVyOm5vdChbZGF0YS1hcHgtdG9hc3QtbWFuYWdlZD1cInRydWVcIl0pJyk7XHJcbiAgICBjb250YWluZXJzLmZvckVhY2goY29udGFpbmVyID0+IHtcclxuICAgICAgICAvLyBDaGVjayBpZiBjb250YWluZXIgaXMgZW1wdHkgKG5vIHRvYXN0cylcclxuICAgICAgICBpZiAoY29udGFpbmVyLmNoaWxkcmVuLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICAgICAgICBjb25zdCBwb3NpdGlvbktleSA9IGNvbnRhaW5lci5nZXRBdHRyaWJ1dGUoJ2RhdGEtYXB4LXRvYXN0LXBvc2l0aW9uJyk7XHJcbiAgICAgICAgICAgIGlmIChwb3NpdGlvbktleSkge1xyXG4gICAgICAgICAgICAgICAgX2NvbnRhaW5lckNhY2hlLmRlbGV0ZShwb3NpdGlvbktleSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY29udGFpbmVyLnJlbW92ZSgpO1xyXG4gICAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgXHJcbiAgICAvLyBDbGVhbiB1cCB3cmFwcGVyIGlmIGl0J3MgZW1wdHkgKGFsbCBjb250YWluZXJzIHJlbW92ZWQpXHJcbiAgICBpZiAoX3RvYXN0V3JhcHBlciAmJiBfdG9hc3RXcmFwcGVyLmNoaWxkcmVuLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICAgIF90b2FzdFdyYXBwZXIucmVtb3ZlKCk7XHJcbiAgICAgICAgX3RvYXN0V3JhcHBlciA9IG51bGw7XHJcbiAgICB9XHJcbiAgICBcclxuICAgIF9nY1RpbWVvdXRJZCA9IG51bGw7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBTY2hlZHVsZSBnYXJiYWdlIGNvbGxlY3Rpb24gZm9yIGVtcHR5IHVubWFuYWdlZCBjb250YWluZXJzXHJcbiAqL1xyXG5mdW5jdGlvbiBzY2hlZHVsZUdhcmJhZ2VDb2xsZWN0aW9uKCkge1xyXG4gICAgaWYgKF9nY1RpbWVvdXRJZCkge1xyXG4gICAgICAgIGNsZWFyVGltZW91dChfZ2NUaW1lb3V0SWQpO1xyXG4gICAgfVxyXG4gICAgX2djVGltZW91dElkID0gc2V0VGltZW91dChjbGVhbnVwRW1wdHlDb250YWluZXJzLCBHQ19ERUxBWV9NUyk7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBGaW5kIGFsbCBzY3JvbGxhYmxlIHBhcmVudCBlbGVtZW50c1xyXG4gKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbGVtZW50XHJcbiAqIEByZXR1cm5zIHtIVE1MRWxlbWVudFtdfVxyXG4gKi9cclxuZnVuY3Rpb24gZmluZFNjcm9sbGFibGVQYXJlbnRzKGVsZW1lbnQpIHtcclxuICAgIGNvbnN0IHNjcm9sbGFibGVzID0gW107XHJcbiAgICBsZXQgY3VycmVudCA9IGVsZW1lbnQucGFyZW50RWxlbWVudDtcclxuICAgIFxyXG4gICAgd2hpbGUgKGN1cnJlbnQgJiYgY3VycmVudCAhPT0gZG9jdW1lbnQuYm9keSAmJiBjdXJyZW50ICE9PSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpIHtcclxuICAgICAgICBjb25zdCBzdHlsZSA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGN1cnJlbnQpO1xyXG4gICAgICAgIGNvbnN0IG92ZXJmbG93ID0gc3R5bGUub3ZlcmZsb3cgKyBzdHlsZS5vdmVyZmxvd1kgKyBzdHlsZS5vdmVyZmxvd1g7XHJcbiAgICAgICAgXHJcbiAgICAgICAgaWYgKG92ZXJmbG93LmluY2x1ZGVzKCdzY3JvbGwnKSB8fCBvdmVyZmxvdy5pbmNsdWRlcygnYXV0bycpKSB7XHJcbiAgICAgICAgICAgIHNjcm9sbGFibGVzLnB1c2goY3VycmVudCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIFxyXG4gICAgICAgIGN1cnJlbnQgPSBjdXJyZW50LnBhcmVudEVsZW1lbnQ7XHJcbiAgICB9XHJcbiAgICBcclxuICAgIHJldHVybiBzY3JvbGxhYmxlcztcclxufVxyXG5cclxuLyoqXHJcbiAqIEhhc2ggYW4gZWxlbWVudCB0byBjcmVhdGUgYSB1bmlxdWUgaWRlbnRpZmllclxyXG4gKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbFxyXG4gKiBAcmV0dXJucyB7c3RyaW5nfVxyXG4gKi9cclxuZnVuY3Rpb24gaGFzaEVsZW1lbnQoZWwpIHtcclxuICAgIGNvbnN0IHJlY3QgPSBlbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcclxuICAgIGNvbnN0IHN0ciA9IGAke2VsLnRhZ05hbWV9XyR7cmVjdC5sZWZ0fV8ke3JlY3QudG9wfV8ke3JlY3Qud2lkdGh9XyR7cmVjdC5oZWlnaHR9YDtcclxuICAgIGxldCBoYXNoID0gMDtcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc3RyLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgY29uc3QgY2hhciA9IHN0ci5jaGFyQ29kZUF0KGkpO1xyXG4gICAgICAgIGhhc2ggPSAoKGhhc2ggPDwgNSkgLSBoYXNoKSArIGNoYXI7XHJcbiAgICAgICAgaGFzaCA9IGhhc2ggJiBoYXNoOyAvLyBDb252ZXJ0IHRvIDMyYml0IGludGVnZXJcclxuICAgIH1cclxuICAgIHJldHVybiBNYXRoLmFicyhoYXNoKS50b1N0cmluZygzNik7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBTZXJpYWxpemUgcG9zaXRpb24gb3B0aW9ucyBpbnRvIGEgdW5pcXVlIGtleVxyXG4gKiBAcGFyYW0ge1Bvc2l0aW9ufSBwb3NpdGlvblxyXG4gKiBAcmV0dXJucyB7c3RyaW5nfVxyXG4gKi9cclxuZnVuY3Rpb24gc2VyaWFsaXplUG9zaXRpb24ocG9zaXRpb24pIHtcclxuICAgIGlmICh0eXBlb2YgcG9zaXRpb24gPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgcmV0dXJuIGBzOiR7cG9zaXRpb259YDtcclxuICAgIH1cclxuICAgIFxyXG4gICAgaWYgKHR5cGVvZiBwb3NpdGlvbiA9PT0gJ29iamVjdCcgJiYgcG9zaXRpb24gIT09IG51bGwpIHtcclxuICAgICAgICBjb25zdCBwYXJ0cyA9IFtdO1xyXG4gICAgICAgIFxyXG4gICAgICAgIC8vIFR5cGUgKGRlZmF1bHQ6IHN0aWNreSBpZiB4L3kgcHJvdmlkZWQpXHJcbiAgICAgICAgY29uc3QgdHlwZSA9IHBvc2l0aW9uLnR5cGUgfHwgKHBvc2l0aW9uLnggfHwgcG9zaXRpb24ueSA/ICdzdGlja3knIDogbnVsbCk7XHJcbiAgICAgICAgaWYgKHR5cGUpIHBhcnRzLnB1c2goYHQ6JHt0eXBlfWApO1xyXG4gICAgICAgIFxyXG4gICAgICAgIC8vIENvb3JkaW5hdGVzXHJcbiAgICAgICAgaWYgKHBvc2l0aW9uLnggIT09IHVuZGVmaW5lZCkgcGFydHMucHVzaChgeDoke3Bvc2l0aW9uLnh9YCk7XHJcbiAgICAgICAgaWYgKHBvc2l0aW9uLnkgIT09IHVuZGVmaW5lZCkgcGFydHMucHVzaChgeToke3Bvc2l0aW9uLnl9YCk7XHJcbiAgICAgICAgXHJcbiAgICAgICAgLy8gRm9yIHJlbGF0aXZlL2FuY2hvcmVkOiB1c2UgZWxlbWVudCBJRCBvciBoYXNoXHJcbiAgICAgICAgaWYgKHBvc2l0aW9uLmVsZW1lbnQpIHtcclxuICAgICAgICAgICAgY29uc3QgZWxlbWVudElkID0gcG9zaXRpb24uZWxlbWVudC5pZCB8fCBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbi5lbGVtZW50LmRhdGFzZXQ/LmFweFRvYXN0QW5jaG9ySWQgfHxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgZWxfJHtoYXNoRWxlbWVudChwb3NpdGlvbi5lbGVtZW50KX1gO1xyXG4gICAgICAgICAgICBwYXJ0cy5wdXNoKGBlbDoke2VsZW1lbnRJZH1gKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgXHJcbiAgICAgICAgaWYgKHBvc2l0aW9uLnBsYWNlbWVudCkge1xyXG4gICAgICAgICAgICAvLyBOb3JtYWxpemUgcGxhY2VtZW50IGZvciBzZXJpYWxpemF0aW9uICh1c2UgQ1NTIHZhbHVlcylcclxuICAgICAgICAgICAgY29uc3Qgbm9ybWFsaXplZCA9IG5vcm1hbGl6ZVBsYWNlbWVudChwb3NpdGlvbi5wbGFjZW1lbnQpO1xyXG4gICAgICAgICAgICBwYXJ0cy5wdXNoKGBwOiR7bm9ybWFsaXplZH1gKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHBvc2l0aW9uLmdhcCAhPT0gdW5kZWZpbmVkKSBwYXJ0cy5wdXNoKGBnOiR7cG9zaXRpb24uZ2FwfWApO1xyXG4gICAgICAgIGlmIChwb3NpdGlvbi51c2VOYXRpdmVDU1MpIHBhcnRzLnB1c2goYG5hdGl2ZTp0cnVlYCk7XHJcbiAgICAgICAgXHJcbiAgICAgICAgcmV0dXJuIGBvOiR7cGFydHMuam9pbignfCcpfWA7XHJcbiAgICB9XHJcbiAgICBcclxuICAgIHJldHVybiAnczpib3R0b20tcmlnaHQnO1xyXG59XHJcblxyXG4vKipcclxuICogVG9hc3RNYW5hZ2VyIGNsYXNzXHJcbiAqL1xyXG5jbGFzcyBUb2FzdE1hbmFnZXIge1xyXG4gICAgLyoqIEBwYXJhbSB7UGFydGlhbDxUb2FzdENvbmZpZz49fSBjb25maWcgKi9cclxuICAgIGNvbnN0cnVjdG9yKGNvbmZpZykge1xyXG4gICAgICAgIC8qKiBAdHlwZSB7VG9hc3RDb25maWd9ICovXHJcbiAgICAgICAgdGhpcy5jb25maWcgPSB7IC4uLkRFRkFVTFRfQ09ORklHLCAuLi4oY29uZmlnIHx8IHt9KSB9O1xyXG4gICAgICAgIC8qKiBAdHlwZSB7SFRNTEVsZW1lbnR8bnVsbH0gKi9cclxuICAgICAgICB0aGlzLmNvbnRhaW5lciA9IG51bGw7XHJcbiAgICAgICAgLyoqIEB0eXBlIHtNYXA8c3RyaW5nLCBUb2FzdFJlZj59ICovXHJcbiAgICAgICAgdGhpcy5pZFRvUmVmID0gbmV3IE1hcCgpO1xyXG4gICAgICAgIC8qKiBAdHlwZSB7VG9hc3RSZWZbXX0gKi9cclxuICAgICAgICB0aGlzLm9wZW4gPSBbXTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogQHBhcmFtIHtQYXJ0aWFsPFRvYXN0Q29uZmlnPn0gY29uZmlnICovXHJcbiAgICBjb25maWd1cmUoY29uZmlnKSB7XHJcbiAgICAgICAgdGhpcy5jb25maWcgPSB7IC4uLnRoaXMuY29uZmlnLCAuLi4oY29uZmlnIHx8IHt9KSB9O1xyXG4gICAgICAgIGlmICh0aGlzLmNvbnRhaW5lcikgdGhpcy5hcHBseUNvbnRhaW5lckNvbmZpZygpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAcGFyYW0geydwb2xpdGUnfCdhc3NlcnRpdmUnfCdvZmYnfSBtb2RlICovXHJcbiAgICBzZXRBcmlhTGl2ZShtb2RlKSB7IHRoaXMuY29uZmlndXJlKHsgYXJpYUxpdmU6IG1vZGUgfSk7IH1cclxuXHJcbiAgICAvKiogQHJldHVybnMge1RvYXN0UmVmW119ICovXHJcbiAgICBnZXRPcGVuVG9hc3RzKCkgeyByZXR1cm4gdGhpcy5vcGVuLnNsaWNlKCk7IH1cclxuXHJcbiAgICAvKiogQHBhcmFtIHtUb2FzdE9wdGlvbnN9IG9wdHMgKi9cclxuICAgIHNob3cob3B0cykge1xyXG4gICAgICAgIGlmICghaXNCcm93c2VyKSByZXR1cm4gLyoqIEB0eXBlIHthbnl9ICovKG51bGwpO1xyXG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB0aGlzLm5vcm1hbGl6ZU9wdGlvbnMob3B0cyk7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmNvbmZpZy5kZWR1cGUgJiYgb3B0aW9ucy5pZCAmJiB0aGlzLmlkVG9SZWYuaGFzKG9wdGlvbnMuaWQpKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHJlZiA9IHRoaXMuaWRUb1JlZi5nZXQob3B0aW9ucy5pZCk7XHJcbiAgICAgICAgICAgIHJlZi51cGRhdGUob3B0aW9ucyk7XHJcbiAgICAgICAgICAgIHJldHVybiByZWY7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBEZXRlcm1pbmUgcG9zaXRpb24gYW5kIGZsb3cgZm9yIHRoaXMgdG9hc3QgKG9wdGlvbnMgdGFrZSBwcmVjZWRlbmNlIG92ZXIgY29uZmlnKVxyXG4gICAgICAgIGNvbnN0IHBvc2l0aW9uID0gb3B0aW9ucy5wb3NpdGlvbiB8fCB0aGlzLmNvbmZpZy5wb3NpdGlvbiB8fCAnYm90dG9tLXJpZ2h0JztcclxuICAgICAgICBjb25zdCBmbG93ID0gb3B0aW9ucy5mbG93ICE9PSB1bmRlZmluZWQgPyBvcHRpb25zLmZsb3cgOiAodGhpcy5jb25maWcuZmxvdyAhPT0gdW5kZWZpbmVkID8gdGhpcy5jb25maWcuZmxvdyA6ICdhdXRvJyk7XHJcbiAgICAgICAgY29uc3QgZmluYWxGbG93ID0gZmxvdyA9PT0gJ2F1dG8nID8gZGV0ZXJtaW5lRmxvdyhwb3NpdGlvbikgOiBmbG93O1xyXG4gICAgICAgIFxyXG4gICAgICAgIC8vIEVuc3VyZSBkZWZhdWx0IGNvbnRhaW5lciBpcyBzZXQgKGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5KVxyXG4gICAgICAgIHRoaXMuZW5zdXJlQ29udGFpbmVyKCk7XHJcblxyXG4gICAgICAgIGNvbnN0IHRvYXN0RWwgPSBjcmVhdGVFbCgnZGl2JywgYEFQWC10b2FzdCBBUFgtdG9hc3QtLSR7b3B0aW9ucy50eXBlfWApO1xyXG4gICAgICAgIHRvYXN0RWwuc2V0QXR0cmlidXRlKCdyb2xlJywgJ3N0YXR1cycpO1xyXG4gICAgICAgIC8vIFByaW9yaXR5OiBvcHRpb25zLmlkID4gY29uZmlnLmlkID4gYXV0by1nZW5lcmF0ZWRcclxuICAgICAgICBjb25zdCB0b2FzdElkID0gb3B0aW9ucy5pZCB8fCBgdF8ke0RhdGUubm93KCl9XyR7TWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc2xpY2UoMiwgOCl9YDtcclxuICAgICAgICB0b2FzdEVsLmRhdGFzZXQudG9hc3RJZCA9IHRvYXN0SWQ7XHJcbiAgICAgICAgaWYgKG9wdGlvbnMuY2xhc3NOYW1lKSB0b2FzdEVsLmNsYXNzTmFtZSArPSBgICR7b3B0aW9ucy5jbGFzc05hbWV9YDtcclxuXHJcbiAgICAgICAgY29uc3QgY29udGVudEVsID0gY3JlYXRlRWwoJ2RpdicsICdBUFgtdG9hc3RfX2NvbnRlbnQnKTtcclxuICAgICAgICBpZiAodHlwZW9mIG9wdGlvbnMubWVzc2FnZSA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgICAgICAgY29udGVudEVsLnRleHRDb250ZW50ID0gb3B0aW9ucy5tZXNzYWdlO1xyXG4gICAgICAgIH0gZWxzZSBpZiAob3B0aW9ucy5tZXNzYWdlKSB7XHJcbiAgICAgICAgICAgIGNvbnRlbnRFbC5hcHBlbmRDaGlsZChvcHRpb25zLm1lc3NhZ2UpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0b2FzdEVsLmFwcGVuZENoaWxkKGNvbnRlbnRFbCk7XHJcblxyXG4gICAgICAgIGxldCBjbG9zZUJ0biA9IG51bGw7XHJcbiAgICAgICAgaWYgKG9wdGlvbnMuZGlzbWlzc2libGUgIT09IGZhbHNlKSB7XHJcbiAgICAgICAgICAgIGNsb3NlQnRuID0gY3JlYXRlRWwoJ2J1dHRvbicsICdBUFgtdG9hc3RfX2Nsb3NlJyk7XHJcbiAgICAgICAgICAgIGNsb3NlQnRuLnNldEF0dHJpYnV0ZSgnYXJpYS1sYWJlbCcsICdDbG9zZScpO1xyXG4gICAgICAgICAgICBjbG9zZUJ0bi50eXBlID0gJ2J1dHRvbic7XHJcbiAgICAgICAgICAgIHRvYXN0RWwuYXBwZW5kQ2hpbGQoY2xvc2VCdG4pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbGV0IHByb2dyZXNzV3JhcCA9IG51bGw7XHJcbiAgICAgICAgbGV0IHByb2dyZXNzQmFyRWwgPSBudWxsO1xyXG4gICAgICAgIGxldCBwcm9ncmVzc1BhdXNlQnRuID0gbnVsbDtcclxuICAgICAgICBpZiAob3B0aW9ucy5wcm9ncmVzcy5lbmFibGUgJiYgb3B0aW9ucy5kdXJhdGlvbk1zID4gMCkge1xyXG4gICAgICAgICAgICBjb25zdCBjcmVhdGVkID0gY3JlYXRlUHJvZ3Jlc3NCbG9jayh0b2FzdEVsLCBjb250ZW50RWwsIGNsb3NlQnRuLCBvcHRpb25zLnByb2dyZXNzKTtcclxuICAgICAgICAgICAgcHJvZ3Jlc3NXcmFwID0gY3JlYXRlZC53cmFwO1xyXG4gICAgICAgICAgICBwcm9ncmVzc0JhckVsID0gY3JlYXRlZC5iYXI7XHJcbiAgICAgICAgICAgIHByb2dyZXNzUGF1c2VCdG4gPSBjcmVhdGVkLnBhdXNlQnRuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gR2V0IG9yIGNyZWF0ZSBjb250YWluZXIgZm9yIHRoaXMgc3BlY2lmaWMgcG9zaXRpb25cclxuICAgICAgICBsZXQgY29udGFpbmVyID0gbnVsbDtcclxuICAgICAgICBsZXQgcG9zaXRpb25VcGRhdGVGbiA9IG51bGw7XHJcbiAgICAgICAgbGV0IHBvc2l0aW9uQ2xlYW51cCA9IG51bGw7XHJcbiAgICAgICAgbGV0IG9yaWdpbmFsRWxlbWVudFN0eWxlID0gbnVsbDtcclxuICAgICAgICBcclxuICAgICAgICBpZiAocG9zaXRpb24gJiYgdHlwZW9mIHBvc2l0aW9uID09PSAnb2JqZWN0JyAmJiBwb3NpdGlvbiAhPT0gbnVsbCkge1xyXG4gICAgICAgICAgICBjb25zdCB0eXBlID0gcG9zaXRpb24udHlwZSB8fCAocG9zaXRpb24ueCB8fCBwb3NpdGlvbi55ID8gJ3N0aWNreScgOiBudWxsKTtcclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIGlmIChwb3NpdGlvbi51c2VOYXRpdmVDU1MgJiYgKHR5cGUgPT09ICdyZWxhdGl2ZScgfHwgdHlwZSA9PT0gJ2FuY2hvcmVkJykgJiYgcG9zaXRpb24uZWxlbWVudCkge1xyXG4gICAgICAgICAgICAgICAgLy8gdXNlTmF0aXZlQ1NTOiB0cnVlIC0gY3JlYXRlIGNvbnRhaW5lciBpbiB0YXJnZXQgZWxlbWVudCB1c2luZyBuYXRpdmUgQ1NTXHJcbiAgICAgICAgICAgICAgICBjb25zdCB0YXJnZXRFbCA9IHBvc2l0aW9uLmVsZW1lbnQ7XHJcbiAgICAgICAgICAgICAgICBvcmlnaW5hbEVsZW1lbnRTdHlsZSA9IHRhcmdldEVsLnN0eWxlLnBvc2l0aW9uO1xyXG4gICAgICAgICAgICAgICAgdGFyZ2V0RWwuc3R5bGUucG9zaXRpb24gPSAncmVsYXRpdmUnO1xyXG4gICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAvLyBDcmVhdGUgYSBjb250YWluZXIgZm9yIHN0YWNraW5nIHRvYXN0cyAocmV1c2UgaWYgZXhpc3RzKVxyXG4gICAgICAgICAgICAgICAgY29uc3QgcG9zaXRpb25LZXkgPSBzZXJpYWxpemVQb3NpdGlvbihwb3NpdGlvbik7XHJcbiAgICAgICAgICAgICAgICBsZXQgbmF0aXZlQ29udGFpbmVyID0gdGFyZ2V0RWwucXVlcnlTZWxlY3RvcihgW2RhdGEtYXB4LXRvYXN0LXBvc2l0aW9uPVwiJHtwb3NpdGlvbktleX1cIl1gKTtcclxuICAgICAgICAgICAgICAgIGlmICghbmF0aXZlQ29udGFpbmVyKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbmF0aXZlQ29udGFpbmVyID0gY3JlYXRlRWwoJ2RpdicsICdBUFgtdG9hc3QtY29udGFpbmVyIEFQWC10b2FzdC1jb250YWluZXItbmF0aXZlJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgbmF0aXZlQ29udGFpbmVyLnNldEF0dHJpYnV0ZSgnZGF0YS1hcHgtdG9hc3QtcG9zaXRpb24nLCBwb3NpdGlvbktleSk7XHJcbiAgICAgICAgICAgICAgICAgICAgbmF0aXZlQ29udGFpbmVyLnN0eWxlLnBvc2l0aW9uID0gJ2Fic29sdXRlJztcclxuICAgICAgICAgICAgICAgICAgICBuYXRpdmVDb250YWluZXIuc3R5bGUuekluZGV4ID0gU3RyaW5nKHRoaXMuY29uZmlnLnpJbmRleCk7XHJcbiAgICAgICAgICAgICAgICAgICAgbmF0aXZlQ29udGFpbmVyLnN0eWxlLmdhcCA9IGAke3RoaXMuY29uZmlnLmdhcH1weGA7XHJcbiAgICAgICAgICAgICAgICAgICAgbmF0aXZlQ29udGFpbmVyLnNldEF0dHJpYnV0ZSgnYXJpYS1saXZlJywgU3RyaW5nKHRoaXMuY29uZmlnLmFyaWFMaXZlKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgbmF0aXZlQ29udGFpbmVyLnN0eWxlLmZsZXhEaXJlY3Rpb24gPSBmaW5hbEZsb3cgPT09ICd1cCcgPyAnY29sdW1uLXJldmVyc2UnIDogJ2NvbHVtbic7XHJcbiAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gQXBwbHkgcG9zaXRpb25pbmcgdG8gY29udGFpbmVyXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGUgPT09ICdyZWxhdGl2ZScpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gUmVsYXRpdmU6IHVzZSB4L3kgZGlyZWN0bHlcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBvc2l0aW9uLnggIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBvc2l0aW9uLnguc3RhcnRzV2l0aCgnLScpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmF0aXZlQ29udGFpbmVyLnN0eWxlLnJpZ2h0ID0gcG9zaXRpb24ueC5zdWJzdHJpbmcoMSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hdGl2ZUNvbnRhaW5lci5zdHlsZS5sZWZ0ID0gcG9zaXRpb24ueDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocG9zaXRpb24ueSAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocG9zaXRpb24ueS5zdGFydHNXaXRoKCctJykpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYXRpdmVDb250YWluZXIuc3R5bGUuYm90dG9tID0gcG9zaXRpb24ueS5zdWJzdHJpbmcoMSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hdGl2ZUNvbnRhaW5lci5zdHlsZS50b3AgPSBwb3NpdGlvbi55O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlID09PSAnYW5jaG9yZWQnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFuY2hvcmVkOiBwb3NpdGlvbiBvdXRzaWRlIHRoZSBlbGVtZW50IHVzaW5nIDEwMCUgKGVsZW1lbnQgc2l6ZSkgKyBnYXBcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGxhY2VtZW50ID0gbm9ybWFsaXplUGxhY2VtZW50KHBvc2l0aW9uLnBsYWNlbWVudCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdhcCA9IHBvc2l0aW9uLmdhcCB8fCAnMWVtJztcclxuICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAocGxhY2VtZW50KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICd0b3AnOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hdGl2ZUNvbnRhaW5lci5zdHlsZS5ib3R0b20gPSBgY2FsYygxMDAlICsgJHtnYXB9KWA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmF0aXZlQ29udGFpbmVyLnN0eWxlLmxlZnQgPSAnMCc7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdib3R0b20nOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hdGl2ZUNvbnRhaW5lci5zdHlsZS50b3AgPSBgY2FsYygxMDAlICsgJHtnYXB9KWA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmF0aXZlQ29udGFpbmVyLnN0eWxlLmxlZnQgPSAnMCc7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdsZWZ0JzpcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYXRpdmVDb250YWluZXIuc3R5bGUucmlnaHQgPSBgY2FsYygxMDAlICsgJHtnYXB9KWA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmF0aXZlQ29udGFpbmVyLnN0eWxlLnRvcCA9ICcwJztcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ3JpZ2h0JzpcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYXRpdmVDb250YWluZXIuc3R5bGUubGVmdCA9IGBjYWxjKDEwMCUgKyAke2dhcH0pYDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYXRpdmVDb250YWluZXIuc3R5bGUudG9wID0gJzAnO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgIHRhcmdldEVsLmFwcGVuZENoaWxkKG5hdGl2ZUNvbnRhaW5lcik7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIFVwZGF0ZSBmbG93IGRpcmVjdGlvbiBpZiBjb250YWluZXIgZXhpc3RzXHJcbiAgICAgICAgICAgICAgICAgICAgbmF0aXZlQ29udGFpbmVyLnN0eWxlLmZsZXhEaXJlY3Rpb24gPSBmaW5hbEZsb3cgPT09ICd1cCcgPyAnY29sdW1uLXJldmVyc2UnIDogJ2NvbHVtbic7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgIGNvbnRhaW5lciA9IG5hdGl2ZUNvbnRhaW5lcjtcclxuICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgcG9zaXRpb25DbGVhbnVwID0gKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0YXJnZXRFbCAmJiB0YXJnZXRFbC5wYXJlbnRFbGVtZW50KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldEVsLnN0eWxlLnBvc2l0aW9uID0gb3JpZ2luYWxFbGVtZW50U3R5bGUgfHwgJyc7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJlbW92ZSBuYXRpdmUgY29udGFpbmVyIGlmIGVtcHR5XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYXRpdmVDb250YWluZXIgJiYgbmF0aXZlQ29udGFpbmVyLmNoaWxkcmVuLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcG9zaXRpb25LZXkgPSBuYXRpdmVDb250YWluZXIuZ2V0QXR0cmlidXRlKCdkYXRhLWFweC10b2FzdC1wb3NpdGlvbicpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBvc2l0aW9uS2V5KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2NvbnRhaW5lckNhY2hlLmRlbGV0ZShwb3NpdGlvbktleSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYXRpdmVDb250YWluZXIucmVtb3ZlKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgLy8gRGVmYXVsdDogZ2V0IG9yIGNyZWF0ZSBjb250YWluZXIgZm9yIHRoaXMgcG9zaXRpb25cclxuICAgICAgICAgICAgICAgIGNvbnRhaW5lciA9IHRoaXMuZ2V0Q29udGFpbmVyRm9yUG9zaXRpb24ocG9zaXRpb24sIGZpbmFsRmxvdyk7XHJcbiAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgIGNvbnN0IHVwZGF0ZUNvbnRhaW5lclBvc2l0aW9uID0gKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0eWxlcyA9IHRoaXMuY2FsY3VsYXRlUG9zaXRpb24ocG9zaXRpb24sIGNvbnRhaW5lcik7XHJcbiAgICAgICAgICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihjb250YWluZXIuc3R5bGUsIHN0eWxlcyk7XHJcbiAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICB1cGRhdGVDb250YWluZXJQb3NpdGlvbigpO1xyXG4gICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAvLyBGb3IgcmVsYXRpdmUvYW5jaG9yZWQsIGxpc3RlbiB0byBzY3JvbGwvcmVzaXplXHJcbiAgICAgICAgICAgICAgICBpZiAoKHR5cGUgPT09ICdyZWxhdGl2ZScgfHwgdHlwZSA9PT0gJ2FuY2hvcmVkJykgJiYgcG9zaXRpb24uZWxlbWVudCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCByYWZJZCA9IG51bGw7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IGxhc3RVcGRhdGUgPSAwO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHRocm90dGxlTXMgPSAxNjsgLy8gfjYwZnBzXHJcbiAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdGhyb3R0bGVkVXBkYXRlID0gKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobm93IC0gbGFzdFVwZGF0ZSA8IHRocm90dGxlTXMpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyYWZJZCkgY2FuY2VsQW5pbWF0aW9uRnJhbWUocmFmSWQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFmSWQgPSByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZUNvbnRhaW5lclBvc2l0aW9uKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFzdFVwZGF0ZSA9IERhdGUubm93KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZUNvbnRhaW5lclBvc2l0aW9uKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXN0VXBkYXRlID0gbm93O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICAvLyBGaW5kIGFsbCBzY3JvbGxhYmxlIHBhcmVudHNcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBzY3JvbGxhYmxlUGFyZW50cyA9IGZpbmRTY3JvbGxhYmxlUGFyZW50cyhwb3NpdGlvbi5lbGVtZW50KTtcclxuICAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICAvLyBMaXN0ZW4gdG8gc2Nyb2xsIG9uIHdpbmRvdyBhbmQgYWxsIHNjcm9sbGFibGUgcGFyZW50c1xyXG4gICAgICAgICAgICAgICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdzY3JvbGwnLCB0aHJvdHRsZWRVcGRhdGUsIHsgcGFzc2l2ZTogdHJ1ZSB9KTtcclxuICAgICAgICAgICAgICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigncmVzaXplJywgdGhyb3R0bGVkVXBkYXRlLCB7IHBhc3NpdmU6IHRydWUgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gTGlzdGVuIHRvIHNjcm9sbCBvbiBhbGwgc2Nyb2xsYWJsZSBwYXJlbnQgZWxlbWVudHNcclxuICAgICAgICAgICAgICAgICAgICBzY3JvbGxhYmxlUGFyZW50cy5mb3JFYWNoKHBhcmVudCA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudC5hZGRFdmVudExpc3RlbmVyKCdzY3JvbGwnLCB0aHJvdHRsZWRVcGRhdGUsIHsgcGFzc2l2ZTogdHJ1ZSB9KTtcclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICAvLyBXYXRjaCBmb3IgZWxlbWVudCByZW1vdmFsXHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgb2JzZXJ2ZXIgPSBuZXcgTXV0YXRpb25PYnNlcnZlcigoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcG9zaXRpb24uZWxlbWVudC5wYXJlbnRFbGVtZW50KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWYuY2xvc2UoJ2FwaScpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgb2JzZXJ2ZXIub2JzZXJ2ZShkb2N1bWVudC5ib2R5LCB7IGNoaWxkTGlzdDogdHJ1ZSwgc3VidHJlZTogdHJ1ZSB9KTtcclxuICAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICBwb3NpdGlvblVwZGF0ZUZuID0gdXBkYXRlQ29udGFpbmVyUG9zaXRpb247XHJcbiAgICAgICAgICAgICAgICAgICAgcG9zaXRpb25DbGVhbnVwID0gKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgdGhyb3R0bGVkVXBkYXRlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIHRocm90dGxlZFVwZGF0ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNjcm9sbGFibGVQYXJlbnRzLmZvckVhY2gocGFyZW50ID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdzY3JvbGwnLCB0aHJvdHRsZWRVcGRhdGUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgb2JzZXJ2ZXIuZGlzY29ubmVjdCgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmFmSWQpIGNhbmNlbEFuaW1hdGlvbkZyYW1lKHJhZklkKTtcclxuICAgICAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgLy8gU3RyaW5nIHBvc2l0aW9uIC0gZ2V0IG9yIGNyZWF0ZSBjb250YWluZXIgZm9yIHRoaXMgcG9zaXRpb25cclxuICAgICAgICAgICAgY29udGFpbmVyID0gdGhpcy5nZXRDb250YWluZXJGb3JQb3NpdGlvbihwb3NpdGlvbiwgZmluYWxGbG93KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgXHJcbiAgICAgICAgLy8gQXBwZW5kIHRvYXN0IHRvIHRoZSBhcHByb3ByaWF0ZSBjb250YWluZXJcclxuICAgICAgICBpZiAoY29udGFpbmVyKSB7XHJcbiAgICAgICAgICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZCh0b2FzdEVsKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAvLyBGYWxsYmFjayB0byBkZWZhdWx0IGNvbnRhaW5lclxyXG4gICAgICAgICAgICB0aGlzLmNvbnRhaW5lci5hcHBlbmRDaGlsZCh0b2FzdEVsKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIEVudGVyIGFuaW1hdGlvblxyXG4gICAgICAgIHRvYXN0RWwuY2xhc3NMaXN0LmFkZCgnQVBYLXRvYXN0LS1lbnRlcicpO1xyXG4gICAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XHJcbiAgICAgICAgICAgIHRvYXN0RWwuY2xhc3NMaXN0LmFkZCgnQVBYLXRvYXN0LS1lbnRlci1hY3RpdmUnKTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgLy8gRXZlbnQgaGFuZGxpbmcgYW5kIHRpbWVyc1xyXG4gICAgICAgIGxldCByZW1haW5pbmcgPSBvcHRpb25zLmR1cmF0aW9uTXM7XHJcbiAgICAgICAgbGV0IHRpbWVySWQgPSBudWxsO1xyXG4gICAgICAgIGxldCBzdGFydFRzID0gbnVsbDtcclxuICAgICAgICBsZXQgdXNlclBhdXNlZCA9IGZhbHNlO1xyXG4gICAgICAgIGxldCBwcm9ncmVzc1JhZklkID0gbnVsbDtcclxuICAgICAgICBjb25zdCBoYW5kbGVycyA9IHsgY2xpY2s6IG5ldyBTZXQoKSwgY2xvc2U6IG5ldyBTZXQoKSB9O1xyXG5cclxuICAgICAgICBjb25zdCBzdGFydFRpbWVyID0gKCkgPT4ge1xyXG4gICAgICAgICAgICBpZiAoIXJlbWFpbmluZyB8fCByZW1haW5pbmcgPD0gMCkgcmV0dXJuOyAvLyBzdGlja3lcclxuICAgICAgICAgICAgc3RhcnRUcyA9IERhdGUubm93KCk7XHJcbiAgICAgICAgICAgIHRpbWVySWQgPSB3aW5kb3cuc2V0VGltZW91dCgoKSA9PiByZWYuY2xvc2UoJ3RpbWVvdXQnKSwgcmVtYWluaW5nKTtcclxuICAgICAgICAgICAgaWYgKHByb2dyZXNzQmFyRWwpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHRpY2sgPSAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRpbWVySWQgPT0gbnVsbCB8fCBzdGFydFRzID09IG51bGwpIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBlbGFwc2VkID0gRGF0ZS5ub3coKSAtIHN0YXJ0VHM7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVtYWluaW5nTXMgPSBNYXRoLm1heCgwLCByZW1haW5pbmcgLSBlbGFwc2VkKTtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBkdXJhdGlvbk1zID0gb3B0aW9ucy5kdXJhdGlvbk1zO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHBjdCA9IGR1cmF0aW9uTXMgPiAwID8gTWF0aC5tYXgoMCwgTWF0aC5taW4oMTAwLCAocmVtYWluaW5nTXMgLyBkdXJhdGlvbk1zKSAqIDEwMCkpIDogMDtcclxuICAgICAgICAgICAgICAgICAgICBwcm9ncmVzc0JhckVsLnN0eWxlLndpZHRoID0gYCR7cGN0fSVgO1xyXG4gICAgICAgICAgICAgICAgICAgIHByb2dyZXNzQmFyRWwuc2V0QXR0cmlidXRlKCdhcmlhLXZhbHVlbm93JywgU3RyaW5nKE1hdGgucm91bmQocGN0KSkpO1xyXG4gICAgICAgICAgICAgICAgICAgIHByb2dyZXNzUmFmSWQgPSByZXF1ZXN0QW5pbWF0aW9uRnJhbWUodGljayk7XHJcbiAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgICAgcHJvZ3Jlc3NSYWZJZCA9IHJlcXVlc3RBbmltYXRpb25GcmFtZSh0aWNrKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH07XHJcbiAgICAgICAgY29uc3QgcGF1c2VUaW1lciA9ICgpID0+IHtcclxuICAgICAgICAgICAgaWYgKHRpbWVySWQgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgd2luZG93LmNsZWFyVGltZW91dCh0aW1lcklkKTtcclxuICAgICAgICAgICAgICAgIHRpbWVySWQgPSBudWxsO1xyXG4gICAgICAgICAgICAgICAgaWYgKHN0YXJ0VHMgIT0gbnVsbCkgcmVtYWluaW5nIC09IChEYXRlLm5vdygpIC0gc3RhcnRUcyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKHByb2dyZXNzUmFmSWQgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgY2FuY2VsQW5pbWF0aW9uRnJhbWUocHJvZ3Jlc3NSYWZJZCk7XHJcbiAgICAgICAgICAgICAgICBwcm9ncmVzc1JhZklkID0gbnVsbDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIGNvbnN0IGF0dGFjaFByb2dyZXNzUGF1c2VIYW5kbGVyID0gKGJ0bikgPT4ge1xyXG4gICAgICAgICAgICBidG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoZXYpID0+IHtcclxuICAgICAgICAgICAgICAgIGV2LnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgICAgICAgICAgICAgdXNlclBhdXNlZCA9ICF1c2VyUGF1c2VkO1xyXG4gICAgICAgICAgICAgICAgaWYgKHVzZXJQYXVzZWQpIHBhdXNlVGltZXIoKTsgZWxzZSBzdGFydFRpbWVyKCk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBsYWJlbCA9IHVzZXJQYXVzZWQgPyAnUmVwcmVuZHJlJyA6ICdQYXVzZSc7XHJcbiAgICAgICAgICAgICAgICBidG4uc2V0QXR0cmlidXRlKCdhcmlhLWxhYmVsJywgbGFiZWwpO1xyXG4gICAgICAgICAgICAgICAgYnRuLnNldEF0dHJpYnV0ZSgndGl0bGUnLCBsYWJlbCk7XHJcbiAgICAgICAgICAgICAgICBidG4uaW5uZXJIVE1MID0gZ2V0UHJvZ3Jlc3NQYXVzZVJlc3VtZUljb25TVkcodXNlclBhdXNlZCk7IC8vIHBhdXNlZCA9IHJlc3VtZSAodHJpYW5nbGUpXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIC8qKiBAdHlwZSB7VG9hc3RSZWZ9ICovXHJcbiAgICAgICAgY29uc3QgcmVmID0ge1xyXG4gICAgICAgICAgICBpZDogdG9hc3RJZCxcclxuICAgICAgICAgICAgZWw6IHRvYXN0RWwsXHJcbiAgICAgICAgICAgIGNsb3NlOiAocmVhc29uKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBjbGVhbnVwKHJlYXNvbiB8fCAnYXBpJyk7XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHVwZGF0ZTogKHBhcnRpYWwpID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IG1lcmdlZCA9IHRoaXMubm9ybWFsaXplT3B0aW9ucyh7IC4uLm9wdGlvbnMsIC4uLnBhcnRpYWwgfSk7XHJcbiAgICAgICAgICAgICAgICAvLyB1cGRhdGUgY29udGVudFxyXG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBtZXJnZWQubWVzc2FnZSA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb250ZW50RWwudGV4dENvbnRlbnQgPSBtZXJnZWQubWVzc2FnZTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobWVyZ2VkLm1lc3NhZ2UpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb250ZW50RWwuaW5uZXJIVE1MID0gJyc7XHJcbiAgICAgICAgICAgICAgICAgICAgY29udGVudEVsLmFwcGVuZENoaWxkKG1lcmdlZC5tZXNzYWdlKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIC8vIHVwZGF0ZSB0eXBlIGNsYXNzXHJcbiAgICAgICAgICAgICAgICBbJ2luZm8nLCdzdWNjZXNzJywnd2FybmluZycsJ2RhbmdlciddLmZvckVhY2godCA9PiB0b2FzdEVsLmNsYXNzTGlzdC5yZW1vdmUoYEFQWC10b2FzdC0tJHt0fWApKTtcclxuICAgICAgICAgICAgICAgIHRvYXN0RWwuY2xhc3NMaXN0LmFkZChgQVBYLXRvYXN0LS0ke21lcmdlZC50eXBlfWApO1xyXG4gICAgICAgICAgICAgICAgLy8gdXBkYXRlIGNsYXNzZXNcclxuICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLmNsYXNzTmFtZSAhPT0gbWVyZ2VkLmNsYXNzTmFtZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLmNsYXNzTmFtZSkgdG9hc3RFbC5jbGFzc0xpc3QucmVtb3ZlKC4uLm9wdGlvbnMuY2xhc3NOYW1lLnNwbGl0KCcgJykuZmlsdGVyKEJvb2xlYW4pKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAobWVyZ2VkLmNsYXNzTmFtZSkgdG9hc3RFbC5jbGFzc0xpc3QuYWRkKC4uLm1lcmdlZC5jbGFzc05hbWUuc3BsaXQoJyAnKS5maWx0ZXIoQm9vbGVhbikpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgLy8gdXBkYXRlIHByb2dyZXNzIHZpc2liaWxpdHkvcG9zaXRpb25cclxuICAgICAgICAgICAgICAgIG9wdGlvbnMucHJvZ3Jlc3MgPSBtZXJnZWQucHJvZ3Jlc3M7XHJcbiAgICAgICAgICAgICAgICBpZiAocHJvZ3Jlc3NXcmFwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFtZXJnZWQucHJvZ3Jlc3MuZW5hYmxlIHx8IG1lcmdlZC5kdXJhdGlvbk1zIDw9IDApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcHJvZ3Jlc3NXcmFwLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcHJvZ3Jlc3NXcmFwLnN0eWxlLmRpc3BsYXkgPSAnJztcclxuICAgICAgICAgICAgICAgICAgICAgICAgYXBwbHlQcm9ncmVzc1Bvc2l0aW9uKHRvYXN0RWwsIHByb2dyZXNzV3JhcCwgY29udGVudEVsLCBjbG9zZUJ0biwgbWVyZ2VkLnByb2dyZXNzLnBvc2l0aW9uKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1lcmdlZC5wcm9ncmVzcy5lbmFibGUgJiYgbWVyZ2VkLmR1cmF0aW9uTXMgPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY3JlYXRlZCA9IGNyZWF0ZVByb2dyZXNzQmxvY2sodG9hc3RFbCwgY29udGVudEVsLCBjbG9zZUJ0biwgbWVyZ2VkLnByb2dyZXNzKTtcclxuICAgICAgICAgICAgICAgICAgICBwcm9ncmVzc1dyYXAgPSBjcmVhdGVkLndyYXA7XHJcbiAgICAgICAgICAgICAgICAgICAgcHJvZ3Jlc3NCYXJFbCA9IGNyZWF0ZWQuYmFyO1xyXG4gICAgICAgICAgICAgICAgICAgIHByb2dyZXNzUGF1c2VCdG4gPSBjcmVhdGVkLnBhdXNlQnRuO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChwcm9ncmVzc1BhdXNlQnRuKSBhdHRhY2hQcm9ncmVzc1BhdXNlSGFuZGxlcihwcm9ncmVzc1BhdXNlQnRuKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmIChwcm9ncmVzc1dyYXAgJiYgcHJvZ3Jlc3NXcmFwLnN0eWxlLmRpc3BsYXkgIT09ICdub25lJyAmJiBtZXJnZWQucHJvZ3Jlc3MucGF1c2VCdXR0b24gPT09IHRydWUpIHtcclxuICAgICAgICAgICAgICAgICAgICB0b2FzdEVsLmNsYXNzTGlzdC5hZGQoJ0FQWC10b2FzdC0taGFzLXByb2dyZXNzLXBhdXNlJyk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHRvYXN0RWwuY2xhc3NMaXN0LnJlbW92ZSgnQVBYLXRvYXN0LS1oYXMtcHJvZ3Jlc3MtcGF1c2UnKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIC8vIHVwZGF0ZSBkdXJhdGlvbiBsb2dpY1xyXG4gICAgICAgICAgICAgICAgb3B0aW9ucy5kdXJhdGlvbk1zID0gbWVyZ2VkLmR1cmF0aW9uTXM7XHJcbiAgICAgICAgICAgICAgICByZW1haW5pbmcgPSBtZXJnZWQuZHVyYXRpb25NcztcclxuICAgICAgICAgICAgICAgIGlmIChwcm9ncmVzc0JhckVsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcHJvZ3Jlc3NCYXJFbC5zdHlsZS53aWR0aCA9ICcxMDAlJztcclxuICAgICAgICAgICAgICAgICAgICBwcm9ncmVzc0JhckVsLnNldEF0dHJpYnV0ZSgnYXJpYS12YWx1ZW5vdycsICcxMDAnKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHBhdXNlVGltZXIoKTtcclxuICAgICAgICAgICAgICAgIHN0YXJ0VGltZXIoKTtcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgd2hlbkNsb3NlZDogKCkgPT4gY2xvc2VkUHJvbWlzZSxcclxuICAgICAgICAgICAgb246IChldmVudCwgaGFuZGxlcikgPT4geyBoYW5kbGVyc1tldmVudF0uYWRkKGhhbmRsZXIpOyByZXR1cm4gKCkgPT4gcmVmLm9mZihldmVudCwgaGFuZGxlcik7IH0sXHJcbiAgICAgICAgICAgIG9mZjogKGV2ZW50LCBoYW5kbGVyKSA9PiB7IGhhbmRsZXJzW2V2ZW50XS5kZWxldGUoaGFuZGxlcik7IH1cclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICBjb25zdCBub3RpZnkgPSAoZXZlbnQsIGFyZykgPT4gaGFuZGxlcnNbZXZlbnRdLmZvckVhY2goZm4gPT4geyB0cnkgeyBmbihhcmcpOyB9IGNhdGNoIChfKSB7fSB9KTtcclxuXHJcbiAgICAgICAgY29uc3QgY2xvc2VkUHJvbWlzZSA9IG5ldyBQcm9taXNlKHJlc29sdmUgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBmaW5pc2ggPSAocmVhc29uKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBub3RpZnkoJ2Nsb3NlJywgcmVhc29uKTtcclxuICAgICAgICAgICAgICAgIGlmICh0eXBlb2Ygb3B0aW9ucy5vbkNsb3NlID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHsgb3B0aW9ucy5vbkNsb3NlKHJlZiwgcmVhc29uKTsgfSBjYXRjaChfKXt9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICByZXNvbHZlKCk7XHJcbiAgICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgICBjb25zdCBjbGVhbnVwID0gKHJlYXNvbikgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKCF0b2FzdEVsKSByZXR1cm47XHJcbiAgICAgICAgICAgICAgICBwYXVzZVRpbWVyKCk7XHJcbiAgICAgICAgICAgICAgICBpZiAocHJvZ3Jlc3NSYWZJZCAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FuY2VsQW5pbWF0aW9uRnJhbWUocHJvZ3Jlc3NSYWZJZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgcHJvZ3Jlc3NSYWZJZCA9IG51bGw7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAvLyBDbGVhbnVwIHBvc2l0aW9uIGxpc3RlbmVycyBhbmQgcmVzdG9yZSBzdHlsZXNcclxuICAgICAgICAgICAgICAgIGlmIChwb3NpdGlvbkNsZWFudXApIHtcclxuICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbkNsZWFudXAoKTtcclxuICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbkNsZWFudXAgPSBudWxsO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAvLyBJZiBvdmVyZmxvdywgcmVtb3ZlIGltbWVkaWF0ZWx5IHRvIGVuZm9yY2UgaGFyZCBjYXBcclxuICAgICAgICAgICAgICAgIGlmIChyZWFzb24gPT09ICdvdmVyZmxvdycpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodG9hc3RFbC5wYXJlbnRFbGVtZW50KSB0b2FzdEVsLnBhcmVudEVsZW1lbnQucmVtb3ZlQ2hpbGQodG9hc3RFbCk7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaWR4ID0gdGhpcy5vcGVuLmluZGV4T2YocmVmKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoaWR4ID49IDApIHRoaXMub3Blbi5zcGxpY2UoaWR4LCAxKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmlkVG9SZWYuZGVsZXRlKHRvYXN0SWQpO1xyXG4gICAgICAgICAgICAgICAgICAgIGZpbmlzaChyZWFzb24pO1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAvLyBPdGhlcndpc2UsIGFuaW1hdGUgb3V0XHJcbiAgICAgICAgICAgICAgICB0b2FzdEVsLmNsYXNzTGlzdC5hZGQoJ0FQWC10b2FzdC0tZXhpdCcpO1xyXG4gICAgICAgICAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHRvYXN0RWwuY2xhc3NMaXN0LmFkZCgnQVBYLXRvYXN0LS1leGl0LWFjdGl2ZScpKTtcclxuXHJcbiAgICAgICAgICAgICAgICBjb25zdCByZW1vdmVFbCA9ICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICB0b2FzdEVsLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3RyYW5zaXRpb25lbmQnLCByZW1vdmVFbCk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRvYXN0RWwucGFyZW50RWxlbWVudCkgdG9hc3RFbC5wYXJlbnRFbGVtZW50LnJlbW92ZUNoaWxkKHRvYXN0RWwpO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGlkeCA9IHRoaXMub3Blbi5pbmRleE9mKHJlZik7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlkeCA+PSAwKSB0aGlzLm9wZW4uc3BsaWNlKGlkeCwgMSk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pZFRvUmVmLmRlbGV0ZSh0b2FzdElkKTtcclxuICAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICAvLyBTY2hlZHVsZSBnYXJiYWdlIGNvbGxlY3Rpb24gZm9yIHVubWFuYWdlZCBjb250YWluZXJzXHJcbiAgICAgICAgICAgICAgICAgICAgc2NoZWR1bGVHYXJiYWdlQ29sbGVjdGlvbigpO1xyXG4gICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgIGZpbmlzaChyZWFzb24pO1xyXG4gICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICAgIHRvYXN0RWwuYWRkRXZlbnRMaXN0ZW5lcigndHJhbnNpdGlvbmVuZCcsIHJlbW92ZUVsKTtcclxuICAgICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICAgIC8vIGF0dGFjaCBjbG9zZSBiZWhhdmlvclxyXG4gICAgICAgICAgICByZWYuY2xvc2UgPSAocmVhc29uKSA9PiBjbGVhbnVwKHJlYXNvbiB8fCAnYXBpJyk7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIC8vIENsaWNrIGhhbmRsaW5nXHJcbiAgICAgICAgdG9hc3RFbC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChldikgPT4ge1xyXG4gICAgICAgICAgICBub3RpZnkoJ2NsaWNrJywgZXYpO1xyXG4gICAgICAgICAgICBpZiAodHlwZW9mIG9wdGlvbnMub25DbGljayA9PT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICAgICAgICAgICAgdHJ5IHsgb3B0aW9ucy5vbkNsaWNrKHJlZiwgZXYpOyB9IGNhdGNoKF8pe31cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICAvLyBIb3ZlciBwYXVzZVxyXG4gICAgICAgIHRvYXN0RWwuYWRkRXZlbnRMaXN0ZW5lcignbW91c2VlbnRlcicsIHBhdXNlVGltZXIpO1xyXG4gICAgICAgIHRvYXN0RWwuYWRkRXZlbnRMaXN0ZW5lcignbW91c2VsZWF2ZScsICgpID0+IHsgaWYgKCF1c2VyUGF1c2VkKSBzdGFydFRpbWVyKCk7IH0pO1xyXG5cclxuICAgICAgICBpZiAoY2xvc2VCdG4pIGNsb3NlQnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGV2KSA9PiB7IGV2LnN0b3BQcm9wYWdhdGlvbigpOyByZWYuY2xvc2UoJ2Nsb3NlJyk7IH0pO1xyXG4gICAgICAgIGlmIChwcm9ncmVzc1BhdXNlQnRuKSBhdHRhY2hQcm9ncmVzc1BhdXNlSGFuZGxlcihwcm9ncmVzc1BhdXNlQnRuKTtcclxuXHJcbiAgICAgICAgLy8gVHJhY2tcclxuICAgICAgICB0aGlzLm9wZW4ucHVzaChyZWYpO1xyXG4gICAgICAgIHRoaXMuaWRUb1JlZi5zZXQodG9hc3RJZCwgcmVmKTtcclxuXHJcbiAgICAgICAgLy8gT3ZlcmZsb3cgcG9saWN5XHJcbiAgICAgICAgaWYgKHRoaXMub3Blbi5sZW5ndGggPiB0aGlzLmNvbmZpZy5tYXhUb2FzdHMpIHtcclxuICAgICAgICAgICAgY29uc3Qgb2xkZXN0ID0gdGhpcy5vcGVuWzBdO1xyXG4gICAgICAgICAgICBvbGRlc3QuY2xvc2UoJ292ZXJmbG93Jyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBzdGFydFRpbWVyKCk7XHJcbiAgICAgICAgcmV0dXJuIHJlZjtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENvbnZlbmllbmNlIGhlbHBlcnNcclxuICAgICAqL1xyXG4gICAgaW5mbyhtZXNzYWdlLCBvcHRzKSB7IHJldHVybiB0aGlzLnNob3coeyAuLi4ob3B0c3x8e30pLCBtZXNzYWdlLCB0eXBlOiAnaW5mbycgfSk7IH1cclxuICAgIHN1Y2Nlc3MobWVzc2FnZSwgb3B0cykgeyByZXR1cm4gdGhpcy5zaG93KHsgLi4uKG9wdHN8fHt9KSwgbWVzc2FnZSwgdHlwZTogJ3N1Y2Nlc3MnIH0pOyB9XHJcbiAgICB3YXJuaW5nKG1lc3NhZ2UsIG9wdHMpIHsgcmV0dXJuIHRoaXMuc2hvdyh7IC4uLihvcHRzfHx7fSksIG1lc3NhZ2UsIHR5cGU6ICd3YXJuaW5nJyB9KTsgfVxyXG4gICAgZGFuZ2VyKG1lc3NhZ2UsIG9wdHMpIHsgcmV0dXJuIHRoaXMuc2hvdyh7IC4uLihvcHRzfHx7fSksIG1lc3NhZ2UsIHR5cGU6ICdkYW5nZXInIH0pOyB9XHJcblxyXG4gICAgLyoqIEBwYXJhbSB7J2FwaSd8J292ZXJmbG93J30gW3JlYXNvbl0gKi9cclxuICAgIGNsb3NlQWxsKHJlYXNvbikge1xyXG4gICAgICAgIC8vIGNvcHkgdG8gYXZvaWQgbXV0YXRpb24gZHVyaW5nIGl0ZXJhdGlvblxyXG4gICAgICAgIGNvbnN0IGFsbCA9IHRoaXMub3Blbi5zbGljZSgpO1xyXG4gICAgICAgIGFsbC5mb3JFYWNoKHIgPT4gci5jbG9zZShyZWFzb24gfHwgJ2FwaScpKTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogQHBhcmFtIHtUb2FzdE9wdGlvbnN9IG9wdHMgKi9cclxuICAgIG5vcm1hbGl6ZU9wdGlvbnMob3B0cykge1xyXG4gICAgICAgIGNvbnN0IG8gPSB7IC4uLm9wdHMgfTtcclxuICAgICAgICBpZiAoIW8udHlwZSkgby50eXBlID0gJ2luZm8nO1xyXG4gICAgICAgIGlmICh0eXBlb2Ygby5kaXNtaXNzaWJsZSAhPT0gJ2Jvb2xlYW4nKSBvLmRpc21pc3NpYmxlID0gdHJ1ZTtcclxuICAgICAgICBpZiAodHlwZW9mIG8uZHVyYXRpb25NcyAhPT0gJ251bWJlcicpIG8uZHVyYXRpb25NcyA9IHRoaXMuY29uZmlnLmRlZmF1bHREdXJhdGlvbk1zO1xyXG4gICAgICAgIC8vIFVzZSBpZCBmcm9tIG9wdGlvbnMgaWYgcHJvdmlkZWQsIG90aGVyd2lzZSB1c2UgaWQgZnJvbSBjb25maWcsIG90aGVyd2lzZSB1bmRlZmluZWQgKHdpbGwgYmUgYXV0by1nZW5lcmF0ZWQpXHJcbiAgICAgICAgaWYgKCFvLmlkICYmIHRoaXMuY29uZmlnLmlkKSBvLmlkID0gdGhpcy5jb25maWcuaWQ7XHJcbiAgICAgICAgby5wcm9ncmVzcyA9IHJlc29sdmVQcm9ncmVzcyhvcHRzLnByb2dyZXNzLCB0aGlzLmNvbmZpZy5wcm9ncmVzcyk7XHJcbiAgICAgICAgcmV0dXJuIG87XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBGaW5kIG9yIGNyZWF0ZSBhIGNvbnRhaW5lciBmb3IgYSBzcGVjaWZpYyBwb3NpdGlvblxyXG4gICAgICogQHBhcmFtIHtQb3NpdGlvbn0gcG9zaXRpb25cclxuICAgICAqIEBwYXJhbSB7J3VwJ3wnZG93bid9IFtmbG93XSBGbG93IGRpcmVjdGlvbiAoYWxyZWFkeSBkZXRlcm1pbmVkLCBub3QgJ2F1dG8nKVxyXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbbWFuYWdlZF0gV2hldGhlciB0aGlzIGNvbnRhaW5lciBpcyBtYW5hZ2VkIGJ5IGEgbWFuYWdlciAoZGVmYXVsdDogZmFsc2UpXHJcbiAgICAgKiBAcmV0dXJucyB7SFRNTEVsZW1lbnR8bnVsbH1cclxuICAgICAqL1xyXG4gICAgZ2V0Q29udGFpbmVyRm9yUG9zaXRpb24ocG9zaXRpb24sIGZsb3csIG1hbmFnZWQgPSBmYWxzZSkge1xyXG4gICAgICAgIGlmICghaXNCcm93c2VyKSByZXR1cm4gbnVsbDtcclxuICAgICAgICBcclxuICAgICAgICBjb25zdCBwb3NpdGlvbktleSA9IHNlcmlhbGl6ZVBvc2l0aW9uKHBvc2l0aW9uKTtcclxuICAgICAgICBcclxuICAgICAgICAvLyBGbG93IHNob3VsZCBhbHJlYWR5IGJlIGRldGVybWluZWQgKCd1cCcgb3IgJ2Rvd24nKSwgYnV0IGZhbGxiYWNrIHRvIGF1dG8gaWYgbmVlZGVkXHJcbiAgICAgICAgY29uc3QgZmluYWxGbG93ID0gZmxvdyAmJiBmbG93ICE9PSAnYXV0bycgPyBmbG93IDogZGV0ZXJtaW5lRmxvdyhwb3NpdGlvbik7XHJcbiAgICAgICAgXHJcbiAgICAgICAgLy8gMS4gQ2hlY2sgbWVtb3J5IGNhY2hlXHJcbiAgICAgICAgbGV0IGMgPSBfY29udGFpbmVyQ2FjaGUuZ2V0KHBvc2l0aW9uS2V5KTtcclxuICAgICAgICBcclxuICAgICAgICAvLyAyLiBJZiBub3QgaW4gY2FjaGUsIHNlYXJjaCBpbiBET00gYnkgZGF0YSBhdHRyaWJ1dGVcclxuICAgICAgICBpZiAoIWMgJiYgaXNCcm93c2VyKSB7XHJcbiAgICAgICAgICAgIGMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGBbZGF0YS1hcHgtdG9hc3QtcG9zaXRpb249XCIke3Bvc2l0aW9uS2V5fVwiXWApO1xyXG4gICAgICAgICAgICBpZiAoYykge1xyXG4gICAgICAgICAgICAgICAgX2NvbnRhaW5lckNhY2hlLnNldChwb3NpdGlvbktleSwgYyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgXHJcbiAgICAgICAgLy8gMy4gSWYgc3RpbGwgbm90IGZvdW5kLCBjcmVhdGUgbmV3IGNvbnRhaW5lclxyXG4gICAgICAgIGlmICghYykge1xyXG4gICAgICAgICAgICBjID0gY3JlYXRlRWwoJ2RpdicsICdBUFgtdG9hc3QtY29udGFpbmVyJyk7XHJcbiAgICAgICAgICAgIGMuc2V0QXR0cmlidXRlKCdkYXRhLWFweC10b2FzdC1wb3NpdGlvbicsIHBvc2l0aW9uS2V5KTtcclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIC8vIE1hcmsgYXMgbWFuYWdlZCBpZiBjcmVhdGVkIGJ5IGEgbWFuYWdlclxyXG4gICAgICAgICAgICBpZiAobWFuYWdlZCkge1xyXG4gICAgICAgICAgICAgICAgYy5zZXRBdHRyaWJ1dGUoJ2RhdGEtYXB4LXRvYXN0LW1hbmFnZWQnLCAndHJ1ZScpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAvLyBEZXRlcm1pbmUgcG9zaXRpb24gY2xhc3MgKGZvciBDU1MpXHJcbiAgICAgICAgICAgIGNvbnN0IHBvc0NsYXNzID0gdHlwZW9mIHBvc2l0aW9uID09PSAnc3RyaW5nJyBcclxuICAgICAgICAgICAgICAgID8gcG9zaXRpb24gXHJcbiAgICAgICAgICAgICAgICA6IChwb3NpdGlvbi50eXBlIHx8ICdib3R0b20tcmlnaHQnKTtcclxuICAgICAgICAgICAgYy5jbGFzc0xpc3QuYWRkKGBBUFgtdG9hc3QtY29udGFpbmVyLS0ke3Bvc0NsYXNzfWApO1xyXG4gICAgICAgICAgICBjLnNldEF0dHJpYnV0ZSgnYXJpYS1saXZlJywgU3RyaW5nKHRoaXMuY29uZmlnLmFyaWFMaXZlKSk7XHJcbiAgICAgICAgICAgIGMuc3R5bGUuekluZGV4ID0gU3RyaW5nKHRoaXMuY29uZmlnLnpJbmRleCk7XHJcbiAgICAgICAgICAgIGMuc3R5bGUuZ2FwID0gYCR7dGhpcy5jb25maWcuZ2FwfXB4YDtcclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIC8vIEFwcGx5IGZsb3cgZGlyZWN0aW9uXHJcbiAgICAgICAgICAgIGMuc3R5bGUuZmxleERpcmVjdGlvbiA9IGZpbmFsRmxvdyA9PT0gJ3VwJyA/ICdjb2x1bW4tcmV2ZXJzZScgOiAnY29sdW1uJztcclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIC8vIEFwcGx5IHBvc2l0aW9uIHN0eWxlcyBpZiBvYmplY3QgcG9zaXRpb25cclxuICAgICAgICAgICAgaWYgKHR5cGVvZiBwb3NpdGlvbiA9PT0gJ29iamVjdCcgJiYgcG9zaXRpb24gIT09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIGMuc3R5bGUucG9zaXRpb24gPSAnZml4ZWQnO1xyXG4gICAgICAgICAgICAgICAgY29uc3Qgc3R5bGVzID0gdGhpcy5jYWxjdWxhdGVQb3NpdGlvbihwb3NpdGlvbiwgYyk7XHJcbiAgICAgICAgICAgICAgICBPYmplY3QuYXNzaWduKGMuc3R5bGUsIHN0eWxlcyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIC8vIEFwcGVuZCB0byB3cmFwcGVyIGZvciBjbGVhbiBET00gb3JnYW5pemF0aW9uXHJcbiAgICAgICAgICAgIGNvbnN0IHdyYXBwZXIgPSBnZXRUb2FzdFdyYXBwZXIoKTtcclxuICAgICAgICAgICAgaWYgKHdyYXBwZXIpIHtcclxuICAgICAgICAgICAgICAgIHdyYXBwZXIuYXBwZW5kQ2hpbGQoYyk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGMpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIF9jb250YWluZXJDYWNoZS5zZXQocG9zaXRpb25LZXksIGMpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIC8vIFVwZGF0ZSBmbG93IGRpcmVjdGlvbiBpZiBjb250YWluZXIgZXhpc3RzIChtYXkgYmUgc2hhcmVkKVxyXG4gICAgICAgICAgICBjLnN0eWxlLmZsZXhEaXJlY3Rpb24gPSBmaW5hbEZsb3cgPT09ICd1cCcgPyAnY29sdW1uLXJldmVyc2UnIDogJ2NvbHVtbic7XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAvLyBJZiBjb250YWluZXIgZXhpc3RzIGFuZCBpcyBub3cgbWFuYWdlZCwgbWFyayBpdFxyXG4gICAgICAgICAgICBpZiAobWFuYWdlZCAmJiAhYy5oYXNBdHRyaWJ1dGUoJ2RhdGEtYXB4LXRvYXN0LW1hbmFnZWQnKSkge1xyXG4gICAgICAgICAgICAgICAgYy5zZXRBdHRyaWJ1dGUoJ2RhdGEtYXB4LXRvYXN0LW1hbmFnZWQnLCAndHJ1ZScpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIFxyXG4gICAgICAgIHJldHVybiBjO1xyXG4gICAgfVxyXG5cclxuICAgIGVuc3VyZUNvbnRhaW5lcigpIHtcclxuICAgICAgICBpZiAodGhpcy5jb250YWluZXIgfHwgIWlzQnJvd3NlcikgcmV0dXJuO1xyXG4gICAgICAgIFxyXG4gICAgICAgIGNvbnN0IHBvc2l0aW9uID0gdGhpcy5jb25maWcucG9zaXRpb24gfHwgJ2JvdHRvbS1yaWdodCc7XHJcbiAgICAgICAgY29uc3QgZmxvdyA9IHRoaXMuY29uZmlnLmZsb3cgIT09IHVuZGVmaW5lZCA/IHRoaXMuY29uZmlnLmZsb3cgOiAnYXV0byc7XHJcbiAgICAgICAgLy8gQ29udGFpbmVycyBjcmVhdGVkIGJ5IGVuc3VyZUNvbnRhaW5lciBhcmUgbWFuYWdlZFxyXG4gICAgICAgIHRoaXMuY29udGFpbmVyID0gdGhpcy5nZXRDb250YWluZXJGb3JQb3NpdGlvbihwb3NpdGlvbiwgZmxvdywgdHJ1ZSk7XHJcbiAgICAgICAgdGhpcy5hcHBseUNvbnRhaW5lckNvbmZpZygpO1xyXG4gICAgfVxyXG5cclxuICAgIGFwcGx5Q29udGFpbmVyQ29uZmlnKCkge1xyXG4gICAgICAgIGlmICghdGhpcy5jb250YWluZXIpIHJldHVybjtcclxuICAgICAgICBjb25zdCBwb3NpdGlvbiA9IHRoaXMuY29uZmlnLnBvc2l0aW9uIHx8ICdib3R0b20tcmlnaHQnO1xyXG4gICAgICAgIGNvbnN0IHBvcyA9IHR5cGVvZiBwb3NpdGlvbiA9PT0gJ3N0cmluZycgPyBwb3NpdGlvbiA6IChwb3NpdGlvbi50eXBlIHx8ICdib3R0b20tcmlnaHQnKTtcclxuICAgICAgICBcclxuICAgICAgICAvLyBBcHBseSBzdHlsZXMgKHRoZXNlIG1heSBiZSBvdmVycmlkZGVuIGJ5IG90aGVyIG1hbmFnZXJzIHNoYXJpbmcgdGhlIGNvbnRhaW5lcilcclxuICAgICAgICB0aGlzLmNvbnRhaW5lci5zdHlsZS56SW5kZXggPSBTdHJpbmcodGhpcy5jb25maWcuekluZGV4KTtcclxuICAgICAgICB0aGlzLmNvbnRhaW5lci5zdHlsZS5nYXAgPSBgJHt0aGlzLmNvbmZpZy5nYXB9cHhgO1xyXG4gICAgICAgIHRoaXMuY29udGFpbmVyLnNldEF0dHJpYnV0ZSgnYXJpYS1saXZlJywgU3RyaW5nKHRoaXMuY29uZmlnLmFyaWFMaXZlKSk7XHJcbiAgICAgICAgXHJcbiAgICAgICAgLy8gVXBkYXRlIHBvc2l0aW9uIGNsYXNzIChvbmx5IGZvciBzdHJpbmcgcG9zaXRpb25zKVxyXG4gICAgICAgIGlmICh0eXBlb2YgcG9zaXRpb24gPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHBvc0NsYXNzZXMgPSBbJ2JvdHRvbS1yaWdodCcsJ2JvdHRvbS1sZWZ0JywndG9wLXJpZ2h0JywndG9wLWxlZnQnXS5tYXAocCA9PiBgQVBYLXRvYXN0LWNvbnRhaW5lci0tJHtwfWApO1xyXG4gICAgICAgICAgICB0aGlzLmNvbnRhaW5lci5jbGFzc0xpc3QucmVtb3ZlKC4uLnBvc0NsYXNzZXMpO1xyXG4gICAgICAgICAgICB0aGlzLmNvbnRhaW5lci5jbGFzc0xpc3QuYWRkKGBBUFgtdG9hc3QtY29udGFpbmVyLS0ke3Bvc31gKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgXHJcbiAgICAgICAgLy8gQXBwbHkgY29udGFpbmVyIGNsYXNzIGlmIHNwZWNpZmllZFxyXG4gICAgICAgIGlmICh0aGlzLmNvbmZpZy5jb250YWluZXJDbGFzcykge1xyXG4gICAgICAgICAgICB0aGlzLmNvbmZpZy5jb250YWluZXJDbGFzcy5zcGxpdCgnICcpLmZpbHRlcihCb29sZWFuKS5mb3JFYWNoKGNscyA9PiB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRhaW5lci5jbGFzc0xpc3QuYWRkKGNscyk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBcclxuICAgICAgICAvLyBBcHBseSBvZmZzZXQgKG9ubHkgZm9yIHN0cmluZyBwb3NpdGlvbnMpXHJcbiAgICAgICAgaWYgKHR5cGVvZiBwb3NpdGlvbiA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuY29uZmlnLm9mZnNldCkge1xyXG4gICAgICAgICAgICAgICAgY29uc3Qgb2Zmc2V0ID0gYCR7dGhpcy5jb25maWcub2Zmc2V0fXB4YDtcclxuICAgICAgICAgICAgICAgIGlmIChwb3MuaW5jbHVkZXMoJ2JvdHRvbScpKSB0aGlzLmNvbnRhaW5lci5zdHlsZS5ib3R0b20gPSBvZmZzZXQ7XHJcbiAgICAgICAgICAgICAgICBlbHNlIHRoaXMuY29udGFpbmVyLnN0eWxlLnRvcCA9IG9mZnNldDtcclxuICAgICAgICAgICAgICAgIGlmIChwb3MuaW5jbHVkZXMoJ3JpZ2h0JykpIHRoaXMuY29udGFpbmVyLnN0eWxlLnJpZ2h0ID0gb2Zmc2V0O1xyXG4gICAgICAgICAgICAgICAgZWxzZSB0aGlzLmNvbnRhaW5lci5zdHlsZS5sZWZ0ID0gb2Zmc2V0O1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgLy8gUmVzZXQgb2Zmc2V0IGlmIG5vdCBzcGVjaWZpZWRcclxuICAgICAgICAgICAgICAgIGlmIChwb3MuaW5jbHVkZXMoJ2JvdHRvbScpKSB0aGlzLmNvbnRhaW5lci5zdHlsZS5ib3R0b20gPSAnJztcclxuICAgICAgICAgICAgICAgIGVsc2UgdGhpcy5jb250YWluZXIuc3R5bGUudG9wID0gJyc7XHJcbiAgICAgICAgICAgICAgICBpZiAocG9zLmluY2x1ZGVzKCdyaWdodCcpKSB0aGlzLmNvbnRhaW5lci5zdHlsZS5yaWdodCA9ICcnO1xyXG4gICAgICAgICAgICAgICAgZWxzZSB0aGlzLmNvbnRhaW5lci5zdHlsZS5sZWZ0ID0gJyc7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBwb3NpdGlvbiA9PT0gJ29iamVjdCcgJiYgcG9zaXRpb24gIT09IG51bGwpIHtcclxuICAgICAgICAgICAgLy8gRm9yIG9iamVjdCBwb3NpdGlvbnMsIGVuc3VyZSBjb250YWluZXIgaGFzIHBvc2l0aW9uOiBmaXhlZFxyXG4gICAgICAgICAgICB0aGlzLmNvbnRhaW5lci5zdHlsZS5wb3NpdGlvbiA9ICdmaXhlZCc7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ2FsY3VsYXRlIHBvc2l0aW9uIGZvciBhIGNvbnRhaW5lciBiYXNlZCBvbiBwb3NpdGlvbiBjb25maWdcclxuICAgICAqIEBwYXJhbSB7UG9zaXRpb259IHBvc2l0aW9uXHJcbiAgICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBjb250YWluZXJFbFxyXG4gICAgICogQHJldHVybnMge3tsZWZ0Pzogc3RyaW5nLCB0b3A/OiBzdHJpbmcsIHJpZ2h0Pzogc3RyaW5nLCBib3R0b20/OiBzdHJpbmd9fVxyXG4gICAgICovXHJcbiAgICBjYWxjdWxhdGVQb3NpdGlvbihwb3NpdGlvbiwgY29udGFpbmVyRWwpIHtcclxuICAgICAgICBpZiAodHlwZW9mIHBvc2l0aW9uID09PSAnc3RyaW5nJykge1xyXG4gICAgICAgICAgICAvLyBTdHJpbmcgcG9zaXRpb25zIGFyZSBoYW5kbGVkIGJ5IGNvbnRhaW5lciBDU1NcclxuICAgICAgICAgICAgcmV0dXJuIHt9O1xyXG4gICAgICAgIH1cclxuICAgICAgICBcclxuICAgICAgICBpZiAodHlwZW9mIHBvc2l0aW9uID09PSAnb2JqZWN0JyAmJiBwb3NpdGlvbiAhPT0gbnVsbCkge1xyXG4gICAgICAgICAgICBjb25zdCB0eXBlID0gcG9zaXRpb24udHlwZSB8fCAocG9zaXRpb24ueCB8fCBwb3NpdGlvbi55ID8gJ3N0aWNreScgOiBudWxsKTtcclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIGlmICh0eXBlID09PSAnc3RpY2t5JyB8fCAoIXR5cGUgJiYgKHBvc2l0aW9uLnggfHwgcG9zaXRpb24ueSkpKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBTdGlja3k6IGZpeGVkIHBvc2l0aW9uIHJlbGF0aXZlIHRvIHZpZXdwb3J0XHJcbiAgICAgICAgICAgICAgICBjb25zdCBzdHlsZXMgPSB7fTtcclxuICAgICAgICAgICAgICAgIGlmIChwb3NpdGlvbi54ICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAocG9zaXRpb24ueC5zdGFydHNXaXRoKCctJykpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGVzLnJpZ2h0ID0gcG9zaXRpb24ueC5zdWJzdHJpbmcoMSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGVzLmxlZnQgPSBwb3NpdGlvbi54O1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmIChwb3NpdGlvbi55ICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAocG9zaXRpb24ueS5zdGFydHNXaXRoKCctJykpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGVzLmJvdHRvbSA9IHBvc2l0aW9uLnkuc3Vic3RyaW5nKDEpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlcy50b3AgPSBwb3NpdGlvbi55O1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHJldHVybiBzdHlsZXM7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIGlmICh0eXBlID09PSAncmVsYXRpdmUnICYmIHBvc2l0aW9uLmVsZW1lbnQpIHtcclxuICAgICAgICAgICAgICAgIC8vIFJlbGF0aXZlOiBwb3NpdGlvbiByZWxhdGl2ZSB0byBlbGVtZW50IHdpdGggeC95IG9mZnNldFxyXG4gICAgICAgICAgICAgICAgLy8gVXNlIGZpeGVkIHBvc2l0aW9uaW5nLCBzbyBnZXRCb3VuZGluZ0NsaWVudFJlY3QoKSBpcyByZWxhdGl2ZSB0byB2aWV3cG9ydFxyXG4gICAgICAgICAgICAgICAgY29uc3QgcmVjdCA9IHBvc2l0aW9uLmVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XHJcbiAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgIC8vIFBhcnNlIHgveSBvZmZzZXRzIChjYW4gYmUgcHgsIGVtLCBldGMuKVxyXG4gICAgICAgICAgICAgICAgY29uc3QgcGFyc2VPZmZzZXQgPSAodmFsKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCF2YWwpIHJldHVybiAwO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG51bSA9IHBhcnNlRmxvYXQodmFsKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodmFsLmluY2x1ZGVzKCdlbScpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIENvbnZlcnQgZW0gdG8gcHggKGFwcHJveGltYXRlOiAxZW0gPSAxNnB4KVxyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVtICogMTY7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudW07XHJcbiAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICBjb25zdCBvZmZzZXRYID0gcGFyc2VPZmZzZXQocG9zaXRpb24ueCB8fCAnMCcpO1xyXG4gICAgICAgICAgICAgICAgY29uc3Qgb2Zmc2V0WSA9IHBhcnNlT2Zmc2V0KHBvc2l0aW9uLnkgfHwgJzAnKTtcclxuICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgY29uc3Qgc3R5bGVzID0ge1xyXG4gICAgICAgICAgICAgICAgICAgIGxlZnQ6IGAke3JlY3QubGVmdCArIG9mZnNldFh9cHhgLFxyXG4gICAgICAgICAgICAgICAgICAgIHRvcDogYCR7cmVjdC50b3AgKyBvZmZzZXRZfXB4YFxyXG4gICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBzdHlsZXM7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIGlmICh0eXBlID09PSAnYW5jaG9yZWQnICYmIHBvc2l0aW9uLmVsZW1lbnQpIHtcclxuICAgICAgICAgICAgICAgIC8vIEFuY2hvcmVkOiBwb3NpdGlvbiByZWxhdGl2ZSB0byBlbGVtZW50IHdpdGggcGxhY2VtZW50XHJcbiAgICAgICAgICAgICAgICBjb25zdCByZWN0ID0gcG9zaXRpb24uZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGdhcCA9IHBvc2l0aW9uLmdhcCB8fCAnMWVtJztcclxuICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgLy8gUGFyc2UgZ2FwIChjYW4gYmUgcHgsIGVtLCBldGMuKVxyXG4gICAgICAgICAgICAgICAgY29uc3QgcGFyc2VHYXAgPSAodmFsKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbnVtID0gcGFyc2VGbG9hdCh2YWwpO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh2YWwuaW5jbHVkZXMoJ2VtJykpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bSAqIDE2OyAvLyBBcHByb3hpbWF0ZTogMWVtID0gMTZweFxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVtO1xyXG4gICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgY29uc3QgZ2FwUHggPSBwYXJzZUdhcChnYXApO1xyXG4gICAgICAgICAgICAgICAgY29uc3Qgc3R5bGVzID0ge307XHJcbiAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgIC8vIE5vcm1hbGl6ZSBwbGFjZW1lbnQgc3lub255bXMgKGFib3ZlL2JlbG93L2JlZm9yZS9hZnRlcikgdG8gQ1NTIHZhbHVlc1xyXG4gICAgICAgICAgICAgICAgY29uc3QgcGxhY2VtZW50ID0gbm9ybWFsaXplUGxhY2VtZW50KHBvc2l0aW9uLnBsYWNlbWVudCk7XHJcbiAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgIHN3aXRjaCAocGxhY2VtZW50KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAndG9wJzpcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVG9hc3QgYWJvdmUgZWxlbWVudDogYm90dG9tIG9mIHRvYXN0ID0gdG9wIG9mIGVsZW1lbnQgLSBnYXBcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYm90dG9tID0gdmlld3BvcnQgaGVpZ2h0IC0gKGVsZW1lbnQgdG9wIC0gZ2FwKSA9IHZpZXdwb3J0IGhlaWdodCAtIGVsZW1lbnQgdG9wICsgZ2FwXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlcy5ib3R0b20gPSBgJHt3aW5kb3cuaW5uZXJIZWlnaHQgLSByZWN0LnRvcCArIGdhcFB4fXB4YDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGVzLmxlZnQgPSBgJHtyZWN0LmxlZnR9cHhgO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICBjYXNlICdib3R0b20nOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBUb2FzdCBiZWxvdyBlbGVtZW50OiB0b3Agb2YgdG9hc3QgPSBib3R0b20gb2YgZWxlbWVudCArIGdhcFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzdHlsZXMudG9wID0gYCR7cmVjdC5ib3R0b20gKyBnYXBQeH1weGA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlcy5sZWZ0ID0gYCR7cmVjdC5sZWZ0fXB4YDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnbGVmdCc6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRvYXN0IHRvIHRoZSBsZWZ0OiByaWdodCBvZiB0b2FzdCA9IGxlZnQgb2YgZWxlbWVudCAtIGdhcFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzdHlsZXMucmlnaHQgPSBgJHt3aW5kb3cuaW5uZXJXaWR0aCAtIHJlY3QubGVmdCArIGdhcFB4fXB4YDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGVzLnRvcCA9IGAke3JlY3QudG9wfXB4YDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAncmlnaHQnOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBUb2FzdCB0byB0aGUgcmlnaHQ6IGxlZnQgb2YgdG9hc3QgPSByaWdodCBvZiBlbGVtZW50ICsgZ2FwXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlcy5sZWZ0ID0gYCR7cmVjdC5yaWdodCArIGdhcFB4fXB4YDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGVzLnRvcCA9IGAke3JlY3QudG9wfXB4YDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gc3R5bGVzO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIFxyXG4gICAgICAgIHJldHVybiB7fTtcclxuICAgIH1cclxufVxyXG5cclxuLyoqXHJcbiAqIEBwYXJhbSB7UGFydGlhbDxUb2FzdENvbmZpZz49fSBjb25maWdcclxuICogQHJldHVybnMge1RvYXN0TWFuYWdlcn1cclxuICovXHJcbmZ1bmN0aW9uIGNyZWF0ZVRvYXN0TWFuYWdlcihjb25maWcpIHtcclxuICAgIHJldHVybiBuZXcgVG9hc3RNYW5hZ2VyKGNvbmZpZyk7XHJcbn1cclxuXHJcbi8vIEhpZ2gtbGV2ZWwgQVBYLnRvYXN0IEFQSSAoZGVmYXVsdCAmIG5hbWVkIG1hbmFnZXJzKVxyXG5sZXQgX2RlZmF1bHRNYW5hZ2VyID0gbnVsbDtcclxuY29uc3QgX2dldERlZmF1bHQgPSAoKSA9PiB7XHJcbiAgICBpZiAoIV9kZWZhdWx0TWFuYWdlcikgX2RlZmF1bHRNYW5hZ2VyID0gY3JlYXRlVG9hc3RNYW5hZ2VyKCk7XHJcbiAgICByZXR1cm4gX2RlZmF1bHRNYW5hZ2VyO1xyXG59O1xyXG5cclxuLyoqXHJcbiAqIFRvYXN0IEFQSSBzdXJmYWNlIHRvIGJlIGF0dGFjaGVkIGFzIEFQWC50b2FzdC5cclxuICogQ2FsbGFibGUgZm9ybSBwcm94aWVzIHRvIGRlZmF1bHRNYW5hZ2VyLnNob3cob3B0cyk6IEFQWC50b2FzdCh7Li4ufSlcclxuICovXHJcbmZ1bmN0aW9uIHRvYXN0KG9wdHMpIHtcclxuICAgIHJldHVybiBfZ2V0RGVmYXVsdCgpLnNob3cob3B0cyk7XHJcbn1cclxuXHJcbk9iamVjdC5hc3NpZ24odG9hc3QsIHtcclxuICAgIC8qKlxyXG4gICAgICogQ3JlYXRlIGEgbWFuYWdlci4gSWYgZmlyc3QgYXJnIGlzIHN0cmluZywgcmVnaXN0ZXIgYXMgbmFtZWQgdW5kZXIgdG9hc3QuY3VzdG9tW25hbWVdXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ3xQYXJ0aWFsPFRvYXN0Q29uZmlnPn0gbmFtZU9yQ29uZmlnXHJcbiAgICAgKiBAcGFyYW0ge1BhcnRpYWw8VG9hc3RDb25maWc+PX0gbWF5YmVDb25maWdcclxuICAgICAqIEByZXR1cm5zIHtUb2FzdE1hbmFnZXJ9XHJcbiAgICAgKi9cclxuICAgIGNyZWF0ZTogKG5hbWVPckNvbmZpZywgbWF5YmVDb25maWcpID0+IHtcclxuICAgICAgICBpZiAodHlwZW9mIG5hbWVPckNvbmZpZyA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgICAgICAgY29uc3QgbmFtZSA9IG5hbWVPckNvbmZpZztcclxuICAgICAgICAgICAgY29uc3QgbWFuYWdlciA9IG5ldyBUb2FzdE1hbmFnZXIoeyAuLi4obWF5YmVDb25maWcgfHwge30pIH0pO1xyXG4gICAgICAgICAgICBpZiAoIXRvYXN0LmN1c3RvbSkgdG9hc3QuY3VzdG9tID0ge307XHJcbiAgICAgICAgICAgIHRvYXN0LmN1c3RvbVtuYW1lXSA9IG1hbmFnZXI7XHJcbiAgICAgICAgICAgIHJldHVybiBtYW5hZ2VyO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gbmV3IFRvYXN0TWFuYWdlcih7IC4uLihuYW1lT3JDb25maWcgfHwge30pIH0pO1xyXG4gICAgfSxcclxuICAgIC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgVG9hc3RNYW5hZ2VyPn0gKi9cclxuICAgIGN1c3RvbToge30sXHJcbiAgICAvKiogQHBhcmFtIHtzdHJpbmd9IG5hbWUgKi9cclxuICAgIHVzZTogKG5hbWUpID0+ICh0b2FzdC5jdXN0b20gJiYgdG9hc3QuY3VzdG9tW25hbWVdKSB8fCBudWxsLFxyXG4gICAgTWFuYWdlcjogVG9hc3RNYW5hZ2VyLFxyXG4gICAgc2hvdzogKG9wdHMpID0+IF9nZXREZWZhdWx0KCkuc2hvdyhvcHRzKSxcclxuICAgIGluZm86IChtZXNzYWdlLCBvcHRzKSA9PiBfZ2V0RGVmYXVsdCgpLmluZm8obWVzc2FnZSwgb3B0cyksXHJcbiAgICBzdWNjZXNzOiAobWVzc2FnZSwgb3B0cykgPT4gX2dldERlZmF1bHQoKS5zdWNjZXNzKG1lc3NhZ2UsIG9wdHMpLFxyXG4gICAgd2FybmluZzogKG1lc3NhZ2UsIG9wdHMpID0+IF9nZXREZWZhdWx0KCkud2FybmluZyhtZXNzYWdlLCBvcHRzKSxcclxuICAgIGRhbmdlcjogKG1lc3NhZ2UsIG9wdHMpID0+IF9nZXREZWZhdWx0KCkuZGFuZ2VyKG1lc3NhZ2UsIG9wdHMpLFxyXG4gICAgY29uZmlndXJlOiAoY29uZmlnKSA9PiBfZ2V0RGVmYXVsdCgpLmNvbmZpZ3VyZShjb25maWcpLFxyXG4gICAgc2V0QXJpYUxpdmU6IChtb2RlKSA9PiBfZ2V0RGVmYXVsdCgpLnNldEFyaWFMaXZlKG1vZGUpLFxyXG4gICAgY2xvc2VBbGw6IChyZWFzb24pID0+IF9nZXREZWZhdWx0KCkuY2xvc2VBbGwocmVhc29uKSxcclxuICAgIGdldE9wZW5Ub2FzdHM6ICgpID0+IF9nZXREZWZhdWx0KCkuZ2V0T3BlblRvYXN0cygpXHJcbn0pO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgdG9hc3Q7XHJcbmV4cG9ydCB7IFRvYXN0TWFuYWdlciwgY3JlYXRlVG9hc3RNYW5hZ2VyLCB0b2FzdCB9O1xyXG4iLCIvLyBJbXBvcnQgZGVzIGZvbmN0aW9ucyBldCBtb2R1bGVzIGRlcyBzb3VzLW1vZHVsZXNcclxuaW1wb3J0IGF1Z21lbnRXaXRoUGFjayBmcm9tICcuL2Zvcm0tcGFja2VyL2F1Z21lbnQtYXB4Lm1qcyc7XHJcbmltcG9ydCB7IHBhY2tGb3JtVG9KU09OIH0gZnJvbSAnLi9mb3JtLXBhY2tlci9wYWNrVG9Kc29uLm1qcyc7XHJcblxyXG4vLyBFeHBvcnQgZGUgbGEgZm9uY3Rpb24gZCdhdWdtZW50YXRpb25cclxuZXhwb3J0IHsgYXVnbWVudFdpdGhQYWNrIH07XHJcblxyXG4vLyBFeHBvcnQgZGVzIGZvbmN0aW9ucyB1dGlsaXRhaXJlc1xyXG5leHBvcnQgeyBwYWNrRm9ybVRvSlNPTiB9O1xyXG5cclxuLy8gRXhwb3J0IGQndW4gb2JqZXQgdG9vbHMgcG91ciBmYWNpbGl0ZXIgbCd1dGlsaXNhdGlvblxyXG5leHBvcnQgY29uc3QgdG9vbHMgPSB7XHJcbiAgICBwYWNrRm9ybVRvSlNPTjogcGFja0Zvcm1Ub0pTT05cclxufTtcclxuXHJcblxyXG4iLCJpbXBvcnQgeyBwYWNrRm9ybVRvSlNPTiB9IGZyb20gJy4vcGFja1RvSnNvbi5tanMnO1xyXG5cclxuLyoqXHJcbiAqIEFqb3V0ZSBsYSBtw6l0aG9kZSBwYWNrKCkgYXV4IG9iamV0cyBBUFggcG91ciBjb252ZXJ0aXIgbGVzIGZvcm11bGFpcmVzIGVuIEpTT05cclxuICogQHBhcmFtIHtPYmplY3R9IGFweCAtIEwnb2JqZXQgQVBYIMOgIGF1Z21lbnRlclxyXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBMJ29iamV0IEFQWCBhdWdtZW50w6lcclxuICovXHJcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIChhcHgpIHtcclxuICAgIC8qKlxyXG4gICAgICogQ29udmVydGl0IGxlIHByZW1pZXIgZm9ybXVsYWlyZSBzw6lsZWN0aW9ubsOpIGVuIG9iamV0IEpTT05cclxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IEwnb2JqZXQgSlNPTiByw6lzdWx0YW50XHJcbiAgICAgKiBAdGhyb3dzIHtFcnJvcn0gU2kgYXVjdW4gZm9ybXVsYWlyZSBuJ2VzdCB0cm91dsOpIG91IHNpIGxlIHByZW1pZXIgw6lsw6ltZW50IG4nZXN0IHBhcyB1biBmb3JtdWxhaXJlXHJcbiAgICAgKiBAZXhhbXBsZVxyXG4gICAgICogY29uc3QgZGF0YSA9IEFQWCgnZm9ybS5teWZvcm1jbGFzcycpLnBhY2soKTtcclxuICAgICAqL1xyXG4gICAgYXB4LnBhY2sgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgY29uc3QgZmlyc3RFbGVtZW50ID0gdGhpcy5maXJzdCgpO1xyXG4gICAgICAgIGlmICghZmlyc3RFbGVtZW50KSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignTm8gZWxlbWVudCBmb3VuZCcpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoZmlyc3RFbGVtZW50LnRhZ05hbWUgIT09ICdGT1JNJykge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0VsZW1lbnQgaXMgbm90IGEgZm9ybScpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gcGFja0Zvcm1Ub0pTT04oZmlyc3RFbGVtZW50KTtcclxuICAgIH07XHJcbiAgICBcclxuICAgIHJldHVybiBhcHg7XHJcbn1cclxuXHJcblxyXG4iLCIvKipcclxuICogQ29udmVydGl0IHVuIGZvcm11bGFpcmUgSFRNTCBlbiBvYmpldCBKU09OXHJcbiAqIEBwYXJhbSB7SFRNTEZvcm1FbGVtZW50fSBmb3JtIC0gTGUgZm9ybXVsYWlyZSDDoCBjb252ZXJ0aXJcclxuICogQHJldHVybnMge09iamVjdH0gTCdvYmpldCBKU09OIHLDqXN1bHRhbnRcclxuICogQHRocm93cyB7VHlwZUVycm9yfSBTaSBmb3JtIG4nZXN0IHBhcyB1biBIVE1MRm9ybUVsZW1lbnRcclxuICovXHJcbmV4cG9ydCBjb25zdCBwYWNrRm9ybVRvSlNPTiA9IChmb3JtKSA9PiB7XHJcbiAgICAvLyBWYWxpZGF0aW9uIGRlIGwnZW50csOpZVxyXG4gICAgaWYgKCFmb3JtIHx8ICEoZm9ybSBpbnN0YW5jZW9mIEhUTUxGb3JtRWxlbWVudCkpIHtcclxuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdwYWNrRm9ybVRvSlNPTiBleHBlY3RzIGFuIEhUTUxGb3JtRWxlbWVudCcpO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKGZvcm0pO1xyXG4gICAgY29uc3QganNvbkRhdGEgPSB7fTtcclxuICAgIFxyXG4gICAgLyoqXHJcbiAgICAgKiBDb25zdHJ1aXQgdW5lIHJlcHLDqXNlbnRhdGlvbiBzdHJpbmcgZHUgY2hlbWluIHBvdXIgbGVzIG1lc3NhZ2VzIGQnZXJyZXVyXHJcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBwYXJ0cyAtIExlcyBwYXJ0aWVzIGR1IGNoZW1pblxyXG4gICAgICogQHJldHVybnMge3N0cmluZ30gTGUgY2hlbWluIGZvcm1hdMOpXHJcbiAgICAgKi9cclxuICAgIGNvbnN0IGJ1aWxkUGF0aFN0cmluZyA9IChwYXJ0cykgPT4ge1xyXG4gICAgICAgIHJldHVybiBwYXJ0cy5yZWR1Y2UoKHBhdGgsIHBhcnQpID0+IHtcclxuICAgICAgICAgICAgaWYgKHBhcnQudHlwZSA9PT0gJ2tleScpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBwYXRoID8gYCR7cGF0aH1bJHtwYXJ0Lm5hbWV9XWAgOiBwYXJ0Lm5hbWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKHBhcnQudHlwZSA9PT0gJ251bWVyaWMnKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gYCR7cGF0aH1bJHtwYXJ0LmluZGV4fV1gO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChwYXJ0LnR5cGUgPT09ICdhcnJheScpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBgJHtwYXRofVtdYDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gcGF0aDtcclxuICAgICAgICB9LCAnJyk7XHJcbiAgICB9O1xyXG4gICAgXHJcbiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XHJcbiAgICAvLyBQSEFTRSAxIDogQU5BTFlTRSBFVCBEw4lURUNUSU9OIERFUyBDT05GTElUU1xyXG4gICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxyXG4gICAgXHJcbiAgICAvKipcclxuICAgICAqIFN0cnVjdHVyZSBwb3VyIHN0b2NrZXIgbCd1dGlsaXNhdGlvbiBkJ3VuIGNoZW1pblxyXG4gICAgICogQHR5cGVkZWYge09iamVjdH0gUGF0aFVzYWdlXHJcbiAgICAgKiBAcHJvcGVydHkge2Jvb2xlYW59IGlzRmluYWwgLSBMZSBjaGVtaW4gZXN0IHV0aWxpc8OpIGNvbW1lIHZhbGV1ciBmaW5hbGVcclxuICAgICAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gaXNJbnRlcm1lZGlhdGUgLSBMZSBjaGVtaW4gZXN0IHV0aWxpc8OpIGNvbW1lIGNoZW1pbiBpbnRlcm3DqWRpYWlyZVxyXG4gICAgICogQHByb3BlcnR5IHtib29sZWFufSBoYXNBcnJheVN1ZmZpeCAtIExlIGNoZW1pbiBzZSB0ZXJtaW5lIHBhciBbXSAoY3LDqWUgZGVzIHZhbGV1cnMgcHJpbWl0aXZlcylcclxuICAgICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBrZXkgLSBMYSBjbMOpIGR1IGZvcm11bGFpcmUgcXVpIHV0aWxpc2UgY2UgY2hlbWluXHJcbiAgICAgKi9cclxuICAgIFxyXG4gICAgY29uc3QgcGF0aFVzYWdlID0gbmV3IE1hcCgpOyAvLyBNYXA8cGF0aFN0cmluZywgUGF0aFVzYWdlPlxyXG4gICAgY29uc3Qga2V5QW5hbHlzaXMgPSBuZXcgTWFwKCk7IC8vIE1hcDxiYXNlUGF0aCwge2hhc051bWVyaWM6IGJvb2xlYW4sIGhhc1N0cmluZzogYm9vbGVhbn0+XHJcbiAgICBjb25zdCBhbGxFbnRyaWVzID0gW107XHJcbiAgICBcclxuICAgIC8qKlxyXG4gICAgICogRW5yZWdpc3RyZSBsJ3V0aWxpc2F0aW9uIGQndW4gY2hlbWluIGRhbnMgcGF0aFVzYWdlXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gY3VycmVudFBhdGggLSBMZSBjaGVtaW4gw6AgZW5yZWdpc3RyZXJcclxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gaXNGaW5hbCAtIFNpIGMnZXN0IHVuZSB2YWxldXIgZmluYWxlXHJcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGlzQXJyYXlTdWZmaXggLSBTaSBsZSBjaGVtaW4gc2UgdGVybWluZSBwYXIgW11cclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgLSBMYSBjbMOpIGR1IGZvcm11bGFpcmVcclxuICAgICAqL1xyXG4gICAgY29uc3QgcmVjb3JkUGF0aFVzYWdlID0gKGN1cnJlbnRQYXRoLCBpc0ZpbmFsLCBpc0FycmF5U3VmZml4LCBrZXkpID0+IHtcclxuICAgICAgICBjb25zdCB1c2FnZSA9IHBhdGhVc2FnZS5nZXQoY3VycmVudFBhdGgpID8/IHtcclxuICAgICAgICAgICAgaXNGaW5hbDogZmFsc2UsXHJcbiAgICAgICAgICAgIGlzSW50ZXJtZWRpYXRlOiBmYWxzZSxcclxuICAgICAgICAgICAgaGFzQXJyYXlTdWZmaXg6IGZhbHNlLFxyXG4gICAgICAgICAgICBrZXlcclxuICAgICAgICB9O1xyXG4gICAgICAgIFxyXG4gICAgICAgIGlmICghcGF0aFVzYWdlLmhhcyhjdXJyZW50UGF0aCkpIHtcclxuICAgICAgICAgICAgcGF0aFVzYWdlLnNldChjdXJyZW50UGF0aCwgdXNhZ2UpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBcclxuICAgICAgICBpZiAoaXNGaW5hbCkge1xyXG4gICAgICAgICAgICB1c2FnZS5pc0ZpbmFsID0gdHJ1ZTtcclxuICAgICAgICAgICAgdXNhZ2Uua2V5ID0ga2V5O1xyXG4gICAgICAgICAgICBpZiAoaXNBcnJheVN1ZmZpeCkge1xyXG4gICAgICAgICAgICAgICAgdXNhZ2UuaGFzQXJyYXlTdWZmaXggPSB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdXNhZ2UuaXNJbnRlcm1lZGlhdGUgPSB0cnVlO1xyXG4gICAgICAgICAgICB1c2FnZS5rZXkgPz89IGtleTtcclxuICAgICAgICB9XHJcbiAgICB9O1xyXG4gICAgXHJcbiAgICAvLyBQcmVtacOocmUgcGFzc2UgOiBhbmFseXNlciB0b3V0ZXMgbGVzIGNsw6lzIGV0IGVucmVnaXN0cmVyIGxlcyBjaGVtaW5zXHJcbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBmb3JtRGF0YS5lbnRyaWVzKCkpIHtcclxuICAgICAgICBpZiAoIWtleSkgY29udGludWU7XHJcbiAgICAgICAgXHJcbiAgICAgICAgYWxsRW50cmllcy5wdXNoKHsga2V5LCB2YWx1ZSB9KTtcclxuICAgICAgICBjb25zdCBwYXJ0cyA9IHBhcnNlS2V5KGtleSk7XHJcbiAgICAgICAgXHJcbiAgICAgICAgLy8gQ29uc3RydWlyZSB0b3VzIGxlcyBjaGVtaW5zIGludGVybcOpZGlhaXJlcyBldCBsZSBjaGVtaW4gZmluYWxcclxuICAgICAgICBsZXQgY3VycmVudFBhdGggPSAnJztcclxuICAgICAgICBcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBhcnRzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHBhcnQgPSBwYXJ0c1tpXTtcclxuICAgICAgICAgICAgY29uc3QgaXNMYXN0ID0gaSA9PT0gcGFydHMubGVuZ3RoIC0gMTtcclxuICAgICAgICAgICAgY29uc3QgaXNBcnJheVN1ZmZpeCA9IHBhcnQudHlwZSA9PT0gJ2FycmF5JztcclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIC8vIENvbnN0cnVpcmUgbGUgY2hlbWluIGp1c3F1J8OgIGNlIG5pdmVhdVxyXG4gICAgICAgICAgICBpZiAocGFydC50eXBlID09PSAna2V5Jykge1xyXG4gICAgICAgICAgICAgICAgY3VycmVudFBhdGggPSBjdXJyZW50UGF0aCA/IGAke2N1cnJlbnRQYXRofVske3BhcnQubmFtZX1dYCA6IHBhcnQubmFtZTtcclxuICAgICAgICAgICAgfSBlbHNlIGlmIChwYXJ0LnR5cGUgPT09ICdudW1lcmljJykge1xyXG4gICAgICAgICAgICAgICAgY3VycmVudFBhdGggPSBgJHtjdXJyZW50UGF0aH1bJHtwYXJ0LmluZGV4fV1gO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHBhcnQudHlwZSA9PT0gJ2FycmF5Jykge1xyXG4gICAgICAgICAgICAgICAgY3VycmVudFBhdGggPSBgJHtjdXJyZW50UGF0aH1bXWA7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIC8vIEVucmVnaXN0cmVyIGwndXRpbGlzYXRpb24gZHUgY2hlbWluXHJcbiAgICAgICAgICAgIHJlY29yZFBhdGhVc2FnZShjdXJyZW50UGF0aCwgaXNMYXN0LCBpc0FycmF5U3VmZml4ICYmIGlzTGFzdCwga2V5KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgXHJcbiAgICAgICAgLy8gQW5hbHlzZXIgY2hhcXVlIG5pdmVhdSBkZSBsYSBoacOpcmFyY2hpZSBwb3VyIGTDqXRlY3RlciBsZXMgY29uZmxpdHMgKGluZGljZXMgbnVtw6lyaXF1ZXMgdnMgY2zDqXMgZGUgY2hhw65uZSlcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBhcnRzLmxlbmd0aCAtIDE7IGkrKykge1xyXG4gICAgICAgICAgICBjb25zdCBwYXJ0ID0gcGFydHNbaV07XHJcbiAgICAgICAgICAgIGNvbnN0IG5leHRQYXJ0ID0gcGFydHNbaSArIDFdO1xyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgLy8gQW5hbHlzZXIgc2V1bGVtZW50IGxlcyBjbMOpcyAocGFzIGxlcyBpbmRpY2VzIG51bcOpcmlxdWVzKVxyXG4gICAgICAgICAgICBpZiAocGFydC50eXBlID09PSAna2V5Jykge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgYmFzZVBhdGggPSBwYXJ0Lm5hbWU7IC8vIExlIG5vbSBkZSBsYSBwcmVtacOocmUgY2zDqSBkYW5zIGxlIGNoZW1pblxyXG4gICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICBjb25zdCBhbmFseXNpcyA9IGtleUFuYWx5c2lzLmdldChiYXNlUGF0aCkgPz8geyBoYXNOdW1lcmljOiBmYWxzZSwgaGFzU3RyaW5nOiBmYWxzZSB9O1xyXG4gICAgICAgICAgICAgICAgaWYgKCFrZXlBbmFseXNpcy5oYXMoYmFzZVBhdGgpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAga2V5QW5hbHlzaXMuc2V0KGJhc2VQYXRoLCBhbmFseXNpcyk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgIGlmIChuZXh0UGFydCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChuZXh0UGFydC50eXBlID09PSAnbnVtZXJpYycpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYW5hbHlzaXMuaGFzTnVtZXJpYyA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChuZXh0UGFydC50eXBlID09PSAna2V5JyB8fCBuZXh0UGFydC50eXBlID09PSAnYXJyYXknKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGFuYWx5c2lzLmhhc1N0cmluZyA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgXHJcbiAgICAvKipcclxuICAgICAqIETDqXRlY3RlIGV0IGzDqHZlIHVuZSBleGNlcHRpb24gcG91ciB0b3VzIGxlcyBjb25mbGl0cyBkZSBjaGVtaW5zXHJcbiAgICAgKiBcclxuICAgICAqIFByaW5jaXBlIHNpbXBsZSA6IHBvdXIgY2hhcXVlIGNoZW1pbiBmaW5hbCAodmFsZXVyIHByaW1pdGl2ZSksIHbDqXJpZmllciBzaSB1biBjaGVtaW5cclxuICAgICAqIGludGVybcOpZGlhaXJlIGNvbW1lbmNlIHBhciBjZSBjaGVtaW4gc3VpdmkgZGUgJ1snLiBTaSBjJ2VzdCBsZSBjYXMsIGMnZXN0IHVuIGNvbmZsaXQuXHJcbiAgICAgKiBcclxuICAgICAqIENldHRlIGFwcHJvY2hlIHVuaWZpw6llIGNvdXZyZSB0b3VzIGxlcyBjYXMgOlxyXG4gICAgICogLSBpdGVtc1tdIChmaW5hbCkgdnMgaXRlbXNbMF1bbmFtZV0gKGludGVybcOpZGlhaXJlKVxyXG4gICAgICogLSBhcnJheVszXSAoZmluYWwpIHZzIGFycmF5WzNdW25lc3RlZF0gKGludGVybcOpZGlhaXJlKVxyXG4gICAgICogLSBkYXRhW2tleV0gKGZpbmFsKSB2cyBkYXRhW2tleV1bc3ViXSAoaW50ZXJtw6lkaWFpcmUpXHJcbiAgICAgKi9cclxuICAgIGNvbnN0IGRldGVjdFBhdGhDb25mbGljdHMgPSAoKSA9PiB7XHJcbiAgICAgICAgLy8gMS4gQ29sbGVjdGVyIHRvdXMgbGVzIGNoZW1pbnMgZmluYXV4ICh2YWxldXJzIHByaW1pdGl2ZXMpXHJcbiAgICAgICAgY29uc3QgZmluYWxQYXRocyA9IG5ldyBTZXQoKTtcclxuICAgICAgICBjb25zdCBmaW5hbFBhdGhLZXlzID0gbmV3IE1hcCgpOyAvLyBQb3VyIGxlcyBtZXNzYWdlcyBkJ2VycmV1clxyXG4gICAgICAgIFxyXG4gICAgICAgIGZvciAoY29uc3QgW3BhdGgsIHVzYWdlXSBvZiBwYXRoVXNhZ2UuZW50cmllcygpKSB7XHJcbiAgICAgICAgICAgIGlmICh1c2FnZS5pc0ZpbmFsKSB7XHJcbiAgICAgICAgICAgICAgICBmaW5hbFBhdGhzLmFkZChwYXRoKTtcclxuICAgICAgICAgICAgICAgIGZpbmFsUGF0aEtleXMuc2V0KHBhdGgsIHVzYWdlLmtleSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgXHJcbiAgICAgICAgLy8gMi4gUG91ciBjaGFxdWUgY2hlbWluIGludGVybcOpZGlhaXJlLCB2w6lyaWZpZXIgcydpbCBjb21tZW5jZSBwYXIgdW4gY2hlbWluIGZpbmFsXHJcbiAgICAgICAgZm9yIChjb25zdCBbcGF0aCwgdXNhZ2VdIG9mIHBhdGhVc2FnZS5lbnRyaWVzKCkpIHtcclxuICAgICAgICAgICAgaWYgKHVzYWdlLmlzSW50ZXJtZWRpYXRlKSB7XHJcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGZpbmFsUGF0aCBvZiBmaW5hbFBhdGhzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gVsOpcmlmaWVyIHNpIGNlIGNoZW1pbiBpbnRlcm3DqWRpYWlyZSBjb21tZW5jZSBwYXIgdW4gY2hlbWluIGZpbmFsIHN1aXZpIGRlICdbJ1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIEV4ZW1wbGU6IGZpbmFsUGF0aCA9IFwiYXJyYXlbM11cIiwgcGF0aCA9IFwiYXJyYXlbM11bbmVzdGVkXVwiIOKGkiBjb25mbGl0XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHBhdGguc3RhcnRzV2l0aChgJHtmaW5hbFBhdGh9W2ApKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBQYXRoIGNvbmZsaWN0OiBcIiR7ZmluYWxQYXRofVwiIGlzIHVzZWQgYXMgYSBmaW5hbCB2YWx1ZSAoaW4gZmllbGQgXCIke2ZpbmFsUGF0aEtleXMuZ2V0KGZpbmFsUGF0aCl9XCIpLCBgICtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBidXQgXCIke3BhdGh9XCIgdHJpZXMgdG8gdXNlIGl0IGFzIGFuIGludGVybWVkaWF0ZSBwYXRoIChpbiBmaWVsZCBcIiR7dXNhZ2Uua2V5fVwiKS4gYCArXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBgVGhpcyBjcmVhdGVzIGluY29tcGF0aWJsZSBkYXRhIHN0cnVjdHVyZXMuIGAgK1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYFlvdSBjYW5ub3QgdXNlIFwiJHtmaW5hbFBhdGh9XCIgYXMgYSBwcmltaXRpdmUgdmFsdWUgYW5kIHRoZW4gYWNjZXNzIGl0IGFzIGFuIG9iamVjdC5gXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuICAgIFxyXG4gICAgLy8gRXjDqWN1dGVyIGxhIGTDqXRlY3Rpb24gZGVzIGNvbmZsaXRzXHJcbiAgICBkZXRlY3RQYXRoQ29uZmxpY3RzKCk7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBWw6lyaWZpZSBzaSB1biBjaGVtaW4gZGUgYmFzZSBhIHVuIGNvbmZsaXQgKGluZGljZXMgbnVtw6lyaXF1ZXMgRVQgY2zDqXMgZGUgY2hhw65uZSlcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBiYXNlUGF0aCAtIExlIGNoZW1pbiBkZSBiYXNlIMOgIHbDqXJpZmllclxyXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59XHJcbiAgICAgKi9cclxuICAgIGNvbnN0IGhhc0NvbmZsaWN0ID0gKGJhc2VQYXRoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFiYXNlUGF0aCkgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIGNvbnN0IGFuYWx5c2lzID0ga2V5QW5hbHlzaXMuZ2V0KGJhc2VQYXRoKTtcclxuICAgICAgICByZXR1cm4gYW5hbHlzaXM/Lmhhc051bWVyaWMgJiYgYW5hbHlzaXM/Lmhhc1N0cmluZztcclxuICAgIH07XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDb252ZXJ0aXQgdW4gdGFibGVhdSBlbiBvYmpldCBlbiBwcsOpc2VydmFudCBsZXMgaW5kaWNlcyBudW3DqXJpcXVlcyBjb21tZSBwcm9wcmnDqXTDqXNcclxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFyciAtIExlIHRhYmxlYXUgw6AgY29udmVydGlyXHJcbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBMJ29iamV0IHLDqXN1bHRhbnRcclxuICAgICAqL1xyXG4gICAgY29uc3QgYXJyYXlUb09iamVjdCA9IChhcnIpID0+IHtcclxuICAgICAgICBjb25zdCBvYmogPSB7fTtcclxuICAgICAgICAvLyBDb3BpZXIgbGVzIGluZGljZXMgbnVtw6lyaXF1ZXNcclxuICAgICAgICBmb3IgKGxldCBpZHggPSAwOyBpZHggPCBhcnIubGVuZ3RoOyBpZHgrKykge1xyXG4gICAgICAgICAgICBvYmpbaWR4XSA9IGFycltpZHhdO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBDb3BpZXIgbGVzIHByb3ByacOpdMOpcyBub24tbnVtw6lyaXF1ZXNcclxuICAgICAgICBmb3IgKGNvbnN0IFtrLCB2XSBvZiBPYmplY3QuZW50cmllcyhhcnIpKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IG51bUtleSA9IE51bWJlci5wYXJzZUludChrLCAxMCk7XHJcbiAgICAgICAgICAgIGlmIChOdW1iZXIuaXNOYU4obnVtS2V5KSB8fCBrICE9PSBTdHJpbmcobnVtS2V5KSkge1xyXG4gICAgICAgICAgICAgICAgb2JqW2tdID0gdjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gb2JqO1xyXG4gICAgfTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIENvbnZlcnRpdCB1biBvYmpldCBlbiB0YWJsZWF1IGVuIHByw6lzZXJ2YW50IGxlcyBpbmRpY2VzIG51bcOpcmlxdWVzXHJcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqIC0gTCdvYmpldCDDoCBjb252ZXJ0aXJcclxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gTGUgdGFibGVhdSByw6lzdWx0YW50XHJcbiAgICAgKi9cclxuICAgIGNvbnN0IG9iamVjdFRvQXJyYXkgPSAob2JqKSA9PiB7XHJcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkob2JqKSkgcmV0dXJuIG9iajtcclxuICAgICAgICBjb25zdCBhcnIgPSBbXTtcclxuICAgICAgICBpZiAodHlwZW9mIG9iaiA9PT0gJ29iamVjdCcgJiYgb2JqICE9PSBudWxsKSB7XHJcbiAgICAgICAgICAgIGZvciAoY29uc3QgW2ssIHZdIG9mIE9iamVjdC5lbnRyaWVzKG9iaikpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IG51bUtleSA9IE51bWJlci5wYXJzZUludChrLCAxMCk7XHJcbiAgICAgICAgICAgICAgICBpZiAoIU51bWJlci5pc05hTihudW1LZXkpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgYXJyW251bUtleV0gPSB2O1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBhcnI7XHJcbiAgICB9O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQXNzdXJlIHF1J3VuIGNvbnRlbmV1ciBlc3QgdW4gb2JqZXQsIGVuIGNvbnZlcnRpc3NhbnQgc2kgbsOpY2Vzc2FpcmVcclxuICAgICAqIEBwYXJhbSB7Kn0gY29udGFpbmVyIC0gTGUgY29udGVuZXVyIMOgIHbDqXJpZmllclxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd8bnVsbH0ga2V5IC0gTGEgY2zDqSBkYW5zIGxlIGNvbnRlbmV1ciBwYXJlbnRcclxuICAgICAqIEBwYXJhbSB7T2JqZWN0fG51bGx9IHBhcmVudCAtIExlIGNvbnRlbmV1ciBwYXJlbnRcclxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gZm9yY2VPYmplY3QgLSBGb3JjZXIgbGEgY29udmVyc2lvbiBlbiBvYmpldCBtw6ptZSBzJ2lsIG4neSBhIHBhcyBkZSBjb25mbGl0XHJcbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBMZSBjb250ZW5ldXIgKGNvbnZlcnRpIGVuIG9iamV0IHNpIG7DqWNlc3NhaXJlKVxyXG4gICAgICovXHJcbiAgICBjb25zdCBlbnN1cmVPYmplY3QgPSAoY29udGFpbmVyLCBrZXksIHBhcmVudCwgZm9yY2VPYmplY3QgPSBmYWxzZSkgPT4ge1xyXG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KGNvbnRhaW5lcikpIHtcclxuICAgICAgICAgICAgY29uc3Qgb2JqID0gYXJyYXlUb09iamVjdChjb250YWluZXIpO1xyXG4gICAgICAgICAgICBpZiAocGFyZW50ICYmIGtleSAhPT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgcGFyZW50W2tleV0gPSBvYmo7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIG9iajtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHR5cGVvZiBjb250YWluZXIgIT09ICdvYmplY3QnIHx8IGNvbnRhaW5lciA9PT0gbnVsbCkge1xyXG4gICAgICAgICAgICBjb25zdCBvYmogPSB7fTtcclxuICAgICAgICAgICAgaWYgKHBhcmVudCAmJiBrZXkgIT09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIHBhcmVudFtrZXldID0gb2JqO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiBvYmo7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBjb250YWluZXI7XHJcbiAgICB9O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQXNzdXJlIHF1J3VuIGNvbnRlbmV1ciBlc3QgdW4gdGFibGVhdSwgZW4gY29udmVydGlzc2FudCBzaSBuw6ljZXNzYWlyZVxyXG4gICAgICogQHBhcmFtIHsqfSBjb250YWluZXIgLSBMZSBjb250ZW5ldXIgw6AgdsOpcmlmaWVyXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ3xudWxsfSBrZXkgLSBMYSBjbMOpIGRhbnMgbGUgY29udGVuZXVyIHBhcmVudFxyXG4gICAgICogQHBhcmFtIHtPYmplY3R8bnVsbH0gcGFyZW50IC0gTGUgY29udGVuZXVyIHBhcmVudFxyXG4gICAgICogQHJldHVybnMge0FycmF5fSBMZSBjb250ZW5ldXIgKGNvbnZlcnRpIGVuIHRhYmxlYXUgc2kgbsOpY2Vzc2FpcmUpXHJcbiAgICAgKi9cclxuICAgIGNvbnN0IGVuc3VyZUFycmF5ID0gKGNvbnRhaW5lciwga2V5LCBwYXJlbnQpID0+IHtcclxuICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkoY29udGFpbmVyKSkge1xyXG4gICAgICAgICAgICBjb25zdCBhcnIgPSBvYmplY3RUb0FycmF5KGNvbnRhaW5lcik7XHJcbiAgICAgICAgICAgIGlmIChwYXJlbnQgJiYga2V5ICE9PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICBwYXJlbnRba2V5XSA9IGFycjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gYXJyO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gY29udGFpbmVyO1xyXG4gICAgfTtcclxuXHJcbiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XHJcbiAgICAvLyBQSEFTRSAyIDogVFJBSVRFTUVOVCBERVMgVkFMRVVSU1xyXG4gICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxyXG4gICAgXHJcbiAgICAvKipcclxuICAgICAqIFRyYWl0ZSB1bmUgdmFsZXVyIGZpbmFsZSAoZGVybmnDqHJlIHBhcnRpZSBkdSBjaGVtaW4pXHJcbiAgICAgKiBAcGFyYW0geyp9IGNvbnRhaW5lciAtIExlIGNvbnRlbmV1ciBhY3R1ZWxcclxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBwYXJ0IC0gTGEgcGFydGllIMOgIHRyYWl0ZXJcclxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgLSBMYSB2YWxldXIgw6AgYXNzaWduZXJcclxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBwYXJlbnQgLSBMZSBjb250ZW5ldXIgcGFyZW50XHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gYmFzZVBhdGggLSBMZSBjaGVtaW4gZGUgYmFzZSBwb3VyIGxhIGTDqXRlY3Rpb24gZGUgY29uZmxpdFxyXG4gICAgICovXHJcbiAgICBjb25zdCBwcm9jZXNzRmluYWxWYWx1ZSA9IChjb250YWluZXIsIHBhcnQsIHZhbHVlLCBwYXJlbnQsIGJhc2VQYXRoKSA9PiB7XHJcbiAgICAgICAgaWYgKHBhcnQudHlwZSA9PT0gJ2FycmF5Jykge1xyXG4gICAgICAgICAgICAvLyBUYWJsZWF1IGV4cGxpY2l0ZSBhdmVjIFtdXHJcbiAgICAgICAgICAgIGNvbnRhaW5lcltwYXJ0Lm5hbWVdID8/PSBbXTtcclxuICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoY29udGFpbmVyW3BhcnQubmFtZV0pKSB7XHJcbiAgICAgICAgICAgICAgICBjb250YWluZXJbcGFydC5uYW1lXS5wdXNoKHZhbHVlKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGNvbnRhaW5lcltwYXJ0Lm5hbWVdID0gW2NvbnRhaW5lcltwYXJ0Lm5hbWVdLCB2YWx1ZV07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2UgaWYgKHBhcnQudHlwZSA9PT0gJ251bWVyaWMnKSB7XHJcbiAgICAgICAgICAgIC8vIEluZGljZSBudW3DqXJpcXVlIGZpbmFsXHJcbiAgICAgICAgICAgIGNvbnN0IHsgaW5kZXggfSA9IHBhcnQ7XHJcbiAgICAgICAgICAgIGNvbnRhaW5lciA9IGVuc3VyZUFycmF5KGNvbnRhaW5lciwgcGFyZW50LmtleSwgcGFyZW50LmNvbnRhaW5lcik7XHJcbiAgICAgICAgICAgIHdoaWxlIChjb250YWluZXIubGVuZ3RoIDw9IGluZGV4KSB7XHJcbiAgICAgICAgICAgICAgICBjb250YWluZXIucHVzaCh1bmRlZmluZWQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNvbnRhaW5lcltpbmRleF0gPSB2YWx1ZTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAvLyBDbMOpIHNpbXBsZSBmaW5hbGVcclxuICAgICAgICAgICAgY29uc3QgY29uZmxpY3QgPSBoYXNDb25mbGljdChiYXNlUGF0aCk7XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICBpZiAoY29uZmxpY3QpIHtcclxuICAgICAgICAgICAgICAgIGNvbnRhaW5lciA9IGVuc3VyZU9iamVjdChjb250YWluZXIsIHBhcmVudC5rZXksIHBhcmVudC5jb250YWluZXIsIHRydWUpO1xyXG4gICAgICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoY29udGFpbmVyW3BhcnQubmFtZV0pKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyW3BhcnQubmFtZV0gPSBhcnJheVRvT2JqZWN0KGNvbnRhaW5lcltwYXJ0Lm5hbWVdKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmIChjb250YWluZXJbcGFydC5uYW1lXSAhPT0gdW5kZWZpbmVkICYmIFxyXG4gICAgICAgICAgICAgICAgICAgICh0eXBlb2YgY29udGFpbmVyW3BhcnQubmFtZV0gIT09ICdvYmplY3QnIHx8IGNvbnRhaW5lcltwYXJ0Lm5hbWVdID09PSBudWxsKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lcltwYXJ0Lm5hbWVdID0gdmFsdWU7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNvbnRhaW5lcltwYXJ0Lm5hbWVdID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb250YWluZXJbcGFydC5uYW1lXSA9IHZhbHVlO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KGNvbnRhaW5lcltwYXJ0Lm5hbWVdKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lcltwYXJ0Lm5hbWVdLnB1c2godmFsdWUpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBjb250YWluZXJbcGFydC5uYW1lXSA9IFtjb250YWluZXJbcGFydC5uYW1lXSwgdmFsdWVdO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgaWYgKGNvbnRhaW5lcltwYXJ0Lm5hbWVdID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb250YWluZXJbcGFydC5uYW1lXSA9IHZhbHVlO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KGNvbnRhaW5lcltwYXJ0Lm5hbWVdKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lcltwYXJ0Lm5hbWVdLnB1c2godmFsdWUpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBjb250YWluZXJbcGFydC5uYW1lXSA9IFtjb250YWluZXJbcGFydC5uYW1lXSwgdmFsdWVdO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuICAgIFxyXG4gICAgLyoqXHJcbiAgICAgKiBUcmFpdGUgdW5lIHBhcnRpZSBpbnRlcm3DqWRpYWlyZSAoY3LDqWUgbGEgc3RydWN0dXJlKVxyXG4gICAgICogQHBhcmFtIHsqfSBjb250YWluZXIgLSBMZSBjb250ZW5ldXIgYWN0dWVsXHJcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gcGFydCAtIExhIHBhcnRpZSDDoCB0cmFpdGVyXHJcbiAgICAgKiBAcGFyYW0ge09iamVjdHxudWxsfSBuZXh0UGFydCAtIExhIHBhcnRpZSBzdWl2YW50ZSAocGV1dCDDqnRyZSBudWxsKVxyXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHBhcmVudCAtIExlIGNvbnRlbmV1ciBwYXJlbnRcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBiYXNlUGF0aCAtIExlIGNoZW1pbiBkZSBiYXNlIHBvdXIgbGEgZMOpdGVjdGlvbiBkZSBjb25mbGl0XHJcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBwYXJ0cyAtIFRvdXRlcyBsZXMgcGFydGllcyBkdSBjaGVtaW4gKHBvdXIgY29uc3RydWlyZSBsZSBjaGVtaW4gY29tcGxldCBkYW5zIGxlcyBlcnJldXJzKVxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGkgLSBMJ2luZGV4IGRlIGxhIHBhcnRpZSBhY3R1ZWxsZSAocG91ciBjb25zdHJ1aXJlIGxlIGNoZW1pbiBjb21wbGV0IGRhbnMgbGVzIGVycmV1cnMpXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IC0gTGEgY2zDqSBkdSBmb3JtdWxhaXJlIChwb3VyIGxlcyBtZXNzYWdlcyBkJ2VycmV1cilcclxuICAgICAqIEByZXR1cm5zIHsqfSBMZSBub3V2ZWF1IGNvbnRlbmV1ciBhcHLDqHMgdHJhaXRlbWVudFxyXG4gICAgICovXHJcbiAgICBjb25zdCBwcm9jZXNzSW50ZXJtZWRpYXRlUGFydCA9IChjb250YWluZXIsIHBhcnQsIG5leHRQYXJ0LCBwYXJlbnQsIGJhc2VQYXRoLCBwYXJ0cywgaSwga2V5KSA9PiB7XHJcbiAgICAgICAgaWYgKHBhcnQudHlwZSA9PT0gJ251bWVyaWMnKSB7XHJcbiAgICAgICAgICAgIC8vIEluZGljZSBudW3DqXJpcXVlIDogbGUgY29udGFpbmVyIGRvaXQgw6p0cmUgdW4gdGFibGVhdSBvdSB1biBvYmpldCAoc2Vsb24gY29uZmxpdClcclxuICAgICAgICAgICAgY29uc3QgeyBpbmRleCB9ID0gcGFydDtcclxuICAgICAgICAgICAgY29uc3QgY29uZmxpY3QgPSBoYXNDb25mbGljdChiYXNlUGF0aCk7XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICBpZiAoY29uZmxpY3QpIHtcclxuICAgICAgICAgICAgICAgIC8vIENvbmZsaXQgOiB1dGlsaXNlciB1biBvYmpldCAobGVzIGluZGljZXMgc2Vyb250IGRlcyBwcm9wcmnDqXTDqXMpXHJcbiAgICAgICAgICAgICAgICBjb250YWluZXIgPSBlbnN1cmVPYmplY3QoY29udGFpbmVyLCBwYXJlbnQua2V5LCBwYXJlbnQuY29udGFpbmVyLCB0cnVlKTtcclxuICAgICAgICAgICAgICAgIGNvbnRhaW5lcltpbmRleF0gPz89IHt9O1xyXG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBjb250YWluZXJbaW5kZXhdICE9PSAnb2JqZWN0JyB8fCBjb250YWluZXJbaW5kZXhdID09PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gQ2V0dGUgZXJyZXVyIG5lIGRldnJhaXQgamFtYWlzIHNlIHByb2R1aXJlIHNpIGxhIGTDqXRlY3Rpb24gZm9uY3Rpb25uZSBjb3JyZWN0ZW1lbnRcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBwYXRoUGFydHMgPSBwYXJ0cy5zbGljZSgwLCBpICsgMSk7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY3VycmVudFBhdGggPSBidWlsZFBhdGhTdHJpbmcocGF0aFBhcnRzKTtcclxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGBDYW5ub3QgYWNjZXNzIHByb3BlcnR5IG9uIHByaW1pdGl2ZSB2YWx1ZS4gYCArXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGBLZXkgXCIke2tleX1cIiB0cmllcyB0byBhY2Nlc3MgXCIke2N1cnJlbnRQYXRofVwiIGJ1dCBpdCBpcyBhbHJlYWR5IGEgJHt0eXBlb2YgY29udGFpbmVyW2luZGV4XX0gdmFsdWU6ICR7SlNPTi5zdHJpbmdpZnkoY29udGFpbmVyW2luZGV4XSl9LiBgICtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYFRoaXMgc2hvdWxkIGhhdmUgYmVlbiBkZXRlY3RlZCBkdXJpbmcgY29uZmxpY3QgZGV0ZWN0aW9uIHBoYXNlLmBcclxuICAgICAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgLy8gUGFzIGRlIGNvbmZsaXQgOiB1dGlsaXNlciB1biB0YWJsZWF1XHJcbiAgICAgICAgICAgICAgICBjb250YWluZXIgPSBlbnN1cmVBcnJheShjb250YWluZXIsIHBhcmVudC5rZXksIHBhcmVudC5jb250YWluZXIpO1xyXG4gICAgICAgICAgICAgICAgd2hpbGUgKGNvbnRhaW5lci5sZW5ndGggPD0gaW5kZXgpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb250YWluZXIucHVzaCh1bmRlZmluZWQpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgY29udGFpbmVyW2luZGV4XSA/Pz0ge307XHJcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGNvbnRhaW5lcltpbmRleF0gIT09ICdvYmplY3QnIHx8IGNvbnRhaW5lcltpbmRleF0gPT09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyBDZXR0ZSBlcnJldXIgbmUgZGV2cmFpdCBqYW1haXMgc2UgcHJvZHVpcmUgc2kgbGEgZMOpdGVjdGlvbiBmb25jdGlvbm5lIGNvcnJlY3RlbWVudFxyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhdGhQYXJ0cyA9IHBhcnRzLnNsaWNlKDAsIGkgKyAxKTtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBjdXJyZW50UGF0aCA9IGJ1aWxkUGF0aFN0cmluZyhwYXRoUGFydHMpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcclxuICAgICAgICAgICAgICAgICAgICAgICAgYENhbm5vdCBhY2Nlc3MgcHJvcGVydHkgb24gcHJpbWl0aXZlIHZhbHVlLiBgICtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYEtleSBcIiR7a2V5fVwiIHRyaWVzIHRvIGFjY2VzcyBcIiR7Y3VycmVudFBhdGh9XCIgYnV0IGl0IGlzIGFscmVhZHkgYSAke3R5cGVvZiBjb250YWluZXJbaW5kZXhdfSB2YWx1ZTogJHtKU09OLnN0cmluZ2lmeShjb250YWluZXJbaW5kZXhdKX0uIGAgK1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBgVGhpcyBzaG91bGQgaGF2ZSBiZWVuIGRldGVjdGVkIGR1cmluZyBjb25mbGljdCBkZXRlY3Rpb24gcGhhc2UuYFxyXG4gICAgICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIGNvbnRhaW5lcltpbmRleF07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIFxyXG4gICAgICAgIC8vIENsw6kgbm9ybWFsZSA6IGNyw6llciBvYmpldCBvdSB0YWJsZWF1IHNlbG9uIGxhIHBhcnRpZSBzdWl2YW50ZVxyXG4gICAgICAgIGNvbnN0IG5leHRJc051bWVyaWMgPSBuZXh0UGFydD8udHlwZSA9PT0gJ251bWVyaWMnO1xyXG4gICAgICAgIGNvbnN0IGNvbmZsaWN0ID0gaGFzQ29uZmxpY3QoYmFzZVBhdGgpO1xyXG4gICAgICAgIFxyXG4gICAgICAgIGlmIChjb25mbGljdCkge1xyXG4gICAgICAgICAgICAvLyBDb25mbGl0IDogdG91am91cnMgdXRpbGlzZXIgdW4gb2JqZXRcclxuICAgICAgICAgICAgY29udGFpbmVyID0gZW5zdXJlT2JqZWN0KGNvbnRhaW5lciwgcGFyZW50LmtleSwgcGFyZW50LmNvbnRhaW5lciwgdHJ1ZSk7XHJcbiAgICAgICAgICAgIGNvbnRhaW5lcltwYXJ0Lm5hbWVdID8/PSB7fTtcclxuICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoY29udGFpbmVyW3BhcnQubmFtZV0pKSB7XHJcbiAgICAgICAgICAgICAgICBjb250YWluZXJbcGFydC5uYW1lXSA9IGFycmF5VG9PYmplY3QoY29udGFpbmVyW3BhcnQubmFtZV0pO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBjb250YWluZXJbcGFydC5uYW1lXSAhPT0gJ29iamVjdCcgfHwgY29udGFpbmVyW3BhcnQubmFtZV0gPT09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIC8vIENldHRlIGVycmV1ciBuZSBkZXZyYWl0IGphbWFpcyBzZSBwcm9kdWlyZSBzaSBsYSBkw6l0ZWN0aW9uIGZvbmN0aW9ubmUgY29ycmVjdGVtZW50XHJcbiAgICAgICAgICAgICAgICBjb25zdCBwYXRoUGFydHMgPSBwYXJ0cy5zbGljZSgwLCBpICsgMSk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBjdXJyZW50UGF0aCA9IGJ1aWxkUGF0aFN0cmluZyhwYXRoUGFydHMpO1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxyXG4gICAgICAgICAgICAgICAgICAgIGBDYW5ub3QgYWNjZXNzIHByb3BlcnR5IG9uIHByaW1pdGl2ZSB2YWx1ZS4gYCArXHJcbiAgICAgICAgICAgICAgICAgICAgYEtleSBcIiR7a2V5fVwiIHRyaWVzIHRvIGFjY2VzcyBcIiR7Y3VycmVudFBhdGh9XCIgYnV0IGl0IGlzIGFscmVhZHkgYSAke3R5cGVvZiBjb250YWluZXJbcGFydC5uYW1lXX0gdmFsdWU6ICR7SlNPTi5zdHJpbmdpZnkoY29udGFpbmVyW3BhcnQubmFtZV0pfS4gYCArXHJcbiAgICAgICAgICAgICAgICAgICAgYFRoaXMgc2hvdWxkIGhhdmUgYmVlbiBkZXRlY3RlZCBkdXJpbmcgY29uZmxpY3QgZGV0ZWN0aW9uIHBoYXNlLmBcclxuICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2UgaWYgKGNvbnRhaW5lcltwYXJ0Lm5hbWVdID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgLy8gUGFzIGRlIGNvbmZsaXQsIGNyw6llciBzZWxvbiBsYSBwYXJ0aWUgc3VpdmFudGVcclxuICAgICAgICAgICAgY29udGFpbmVyW3BhcnQubmFtZV0gPSBuZXh0SXNOdW1lcmljID8gW10gOiB7fTtcclxuICAgICAgICB9IGVsc2UgaWYgKG5leHRJc051bWVyaWMgJiYgIUFycmF5LmlzQXJyYXkoY29udGFpbmVyW3BhcnQubmFtZV0pKSB7XHJcbiAgICAgICAgICAgIC8vIE9uIGEgYmVzb2luIGQndW4gdGFibGVhdSBtYWlzIGMnZXN0IHVuIG9iamV0XHJcbiAgICAgICAgICAgIGNvbnN0IGhhc1N0cmluZ0tleXMgPSBPYmplY3Qua2V5cyhjb250YWluZXJbcGFydC5uYW1lXSkuc29tZShrID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IG51bUtleSA9IE51bWJlci5wYXJzZUludChrLCAxMCk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gTnVtYmVyLmlzTmFOKG51bUtleSkgfHwgayAhPT0gU3RyaW5nKG51bUtleSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICBpZiAoIWhhc1N0cmluZ0tleXMpIHtcclxuICAgICAgICAgICAgICAgIGNvbnRhaW5lcltwYXJ0Lm5hbWVdID0gb2JqZWN0VG9BcnJheShjb250YWluZXJbcGFydC5uYW1lXSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2UgaWYgKCFuZXh0SXNOdW1lcmljICYmICFpc1BsYWluT2JqZWN0KGNvbnRhaW5lcltwYXJ0Lm5hbWVdKSkge1xyXG4gICAgICAgICAgICAvLyBPbiBhIGJlc29pbiBkJ3VuIG9iamV0IG1haXMgYydlc3QgdW4gdGFibGVhdVxyXG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShjb250YWluZXJbcGFydC5uYW1lXSkpIHtcclxuICAgICAgICAgICAgICAgIGNvbnRhaW5lcltwYXJ0Lm5hbWVdID0gYXJyYXlUb09iamVjdChjb250YWluZXJbcGFydC5uYW1lXSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBjb250YWluZXJbcGFydC5uYW1lXSA9IHt9O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIFxyXG4gICAgICAgIC8vIFMnYXNzdXJlciBxdWUgY29udGFpbmVyW3BhcnQubmFtZV0gZXN0IGJpZW4gdW4gb2JqZXQgYXByw6hzIHRvdXRlcyBsZXMgY29udmVyc2lvbnNcclxuICAgICAgICBpZiAoY29udGFpbmVyW3BhcnQubmFtZV0gIT09IHVuZGVmaW5lZCAmJiBcclxuICAgICAgICAgICAgKHR5cGVvZiBjb250YWluZXJbcGFydC5uYW1lXSAhPT0gJ29iamVjdCcgfHwgY29udGFpbmVyW3BhcnQubmFtZV0gPT09IG51bGwpKSB7XHJcbiAgICAgICAgICAgIC8vIENldHRlIGVycmV1ciBuZSBkZXZyYWl0IGphbWFpcyBzZSBwcm9kdWlyZSBzaSBsYSBkw6l0ZWN0aW9uIGZvbmN0aW9ubmUgY29ycmVjdGVtZW50XHJcbiAgICAgICAgICAgIGNvbnN0IHBhdGhQYXJ0cyA9IHBhcnRzLnNsaWNlKDAsIGkgKyAxKTtcclxuICAgICAgICAgICAgY29uc3QgY3VycmVudFBhdGggPSBidWlsZFBhdGhTdHJpbmcocGF0aFBhcnRzKTtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxyXG4gICAgICAgICAgICAgICAgYENhbm5vdCBhY2Nlc3MgcHJvcGVydHkgb24gcHJpbWl0aXZlIHZhbHVlLiBgICtcclxuICAgICAgICAgICAgICAgIGBLZXkgXCIke2tleX1cIiB0cmllcyB0byBhY2Nlc3MgXCIke2N1cnJlbnRQYXRofVwiIGJ1dCBpdCBpcyBhbHJlYWR5IGEgJHt0eXBlb2YgY29udGFpbmVyW3BhcnQubmFtZV19IHZhbHVlOiAke0pTT04uc3RyaW5naWZ5KGNvbnRhaW5lcltwYXJ0Lm5hbWVdKX0uIGAgK1xyXG4gICAgICAgICAgICAgICAgYFRoaXMgc2hvdWxkIGhhdmUgYmVlbiBkZXRlY3RlZCBkdXJpbmcgY29uZmxpY3QgZGV0ZWN0aW9uIHBoYXNlLmBcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGNvbnRhaW5lcltwYXJ0Lm5hbWVdO1xyXG4gICAgfTtcclxuICAgIFxyXG4gICAgLy8gVHJhaXRlciB0b3V0ZXMgbGVzIGVudHLDqWVzXHJcbiAgICBmb3IgKGNvbnN0IHsgdmFsdWUsIGtleSB9IG9mIGFsbEVudHJpZXMpIHtcclxuICAgICAgICBpZiAoIWtleSkgY29udGludWU7XHJcblxyXG4gICAgICAgIGNvbnN0IHBhcnRzID0gcGFyc2VLZXkoa2V5KTtcclxuICAgICAgICBjb25zdCBwYXRoID0gW3sgY29udGFpbmVyOiBqc29uRGF0YSwga2V5OiBudWxsIH1dO1xyXG4gICAgICAgIGxldCBjb250YWluZXIgPSBqc29uRGF0YTtcclxuICAgICAgICBjb25zdCBiYXNlUGF0aCA9IHBhcnRzWzBdPy50eXBlID09PSAna2V5JyA/IHBhcnRzWzBdLm5hbWUgOiAnJztcclxuXHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYXJ0cy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBjb25zdCBwYXJ0ID0gcGFydHNbaV07XHJcbiAgICAgICAgICAgIGNvbnN0IGlzTGFzdCA9IGkgPT09IHBhcnRzLmxlbmd0aCAtIDE7XHJcbiAgICAgICAgICAgIGNvbnN0IG5leHRQYXJ0ID0gaSArIDEgPCBwYXJ0cy5sZW5ndGggPyBwYXJ0c1tpICsgMV0gOiBudWxsO1xyXG4gICAgICAgICAgICBjb25zdCBwYXJlbnQgPSBwYXRoW3BhdGgubGVuZ3RoIC0gMV07XHJcblxyXG4gICAgICAgICAgICBpZiAoaXNMYXN0KSB7XHJcbiAgICAgICAgICAgICAgICAvLyBEZXJuacOocmUgcGFydGllIDogYXNzaWduZXIgbGEgdmFsZXVyXHJcbiAgICAgICAgICAgICAgICBwcm9jZXNzRmluYWxWYWx1ZShjb250YWluZXIsIHBhcnQsIHZhbHVlLCBwYXJlbnQsIGJhc2VQYXRoKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIC8vIFBhcnRpZSBpbnRlcm3DqWRpYWlyZSA6IGNyw6llciBsYSBzdHJ1Y3R1cmVcclxuICAgICAgICAgICAgICAgIGNvbnN0IG5ld0NvbnRhaW5lciA9IHByb2Nlc3NJbnRlcm1lZGlhdGVQYXJ0KGNvbnRhaW5lciwgcGFydCwgbmV4dFBhcnQsIHBhcmVudCwgYmFzZVBhdGgsIHBhcnRzLCBpLCBrZXkpO1xyXG4gICAgICAgICAgICAgICAgcGF0aC5wdXNoKHsgY29udGFpbmVyLCBrZXk6IHBhcnQudHlwZSA9PT0gJ251bWVyaWMnID8gcGFydC5pbmRleCA6IHBhcnQubmFtZSB9KTtcclxuICAgICAgICAgICAgICAgIGNvbnRhaW5lciA9IG5ld0NvbnRhaW5lcjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4ganNvbkRhdGE7XHJcbn07XHJcblxyXG4vKipcclxuICogUGFyc2UgdW5lIGNsw6kgZGUgZm9ybXVsYWlyZSBwb3VyIGV4dHJhaXJlIGxlcyBwYXJ0aWVzIChub20sIGluZGljZXMsIGV0Yy4pXHJcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgLSBMYSBjbMOpIMOgIHBhcnNlciAoZXg6IFwidXNlcltlbWFpbF1cIiwgXCJ0YWdzW11cIiwgXCJpdGVtc1swXVtuYW1lXVwiKVxyXG4gKiBAcmV0dXJucyB7QXJyYXk8e25hbWU6IHN0cmluZywgdHlwZTogc3RyaW5nLCBpbmRleD86IG51bWJlcn0+fSBUYWJsZWF1IGRlcyBwYXJ0aWVzIHBhcnPDqWVzXHJcbiAqIEBwcml2YXRlXHJcbiAqL1xyXG5jb25zdCBwYXJzZUtleSA9IChrZXkpID0+IHtcclxuICAgIGNvbnN0IHBhcnRzID0gW107XHJcbiAgICBsZXQgY3VycmVudCA9ICcnO1xyXG4gICAgbGV0IGkgPSAwO1xyXG4gICAgY29uc3QgbGVuID0ga2V5Lmxlbmd0aDtcclxuXHJcbiAgICB3aGlsZSAoaSA8IGxlbikge1xyXG4gICAgICAgIGNvbnN0IGNoYXIgPSBrZXlbaV07XHJcbiAgICAgICAgXHJcbiAgICAgICAgaWYgKGNoYXIgPT09ICdbJykge1xyXG4gICAgICAgICAgICAvLyBTYXV2ZWdhcmRlciBsYSBwYXJ0aWUgcHLDqWPDqWRlbnRlIHNpIGVsbGUgZXhpc3RlXHJcbiAgICAgICAgICAgIGlmIChjdXJyZW50KSB7XHJcbiAgICAgICAgICAgICAgICBwYXJ0cy5wdXNoKHsgbmFtZTogY3VycmVudCwgdHlwZTogJ2tleScgfSk7XHJcbiAgICAgICAgICAgICAgICBjdXJyZW50ID0gJyc7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIC8vIFRyb3V2ZXIgbGEgZmluIGR1IGNyb2NoZXRcclxuICAgICAgICAgICAgaSsrO1xyXG4gICAgICAgICAgICBsZXQgYnJhY2tldENvbnRlbnQgPSAnJztcclxuICAgICAgICAgICAgd2hpbGUgKGkgPCBsZW4gJiYga2V5W2ldICE9PSAnXScpIHtcclxuICAgICAgICAgICAgICAgIGJyYWNrZXRDb250ZW50ICs9IGtleVtpXTtcclxuICAgICAgICAgICAgICAgIGkrKztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgaWYgKGJyYWNrZXRDb250ZW50ID09PSAnJykge1xyXG4gICAgICAgICAgICAgICAgLy8gW10gdmlkZSA9IHRhYmxlYXVcclxuICAgICAgICAgICAgICAgIGNvbnN0IGxhc3RQYXJ0ID0gcGFydHNbcGFydHMubGVuZ3RoIC0gMV07XHJcbiAgICAgICAgICAgICAgICBpZiAobGFzdFBhcnQpIHtcclxuICAgICAgICAgICAgICAgICAgICBsYXN0UGFydC50eXBlID0gJ2FycmF5JztcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gW10gYXUgZMOpYnV0LCBjcsOpZXIgdW5lIHBhcnRpZSBzcMOpY2lhbGVcclxuICAgICAgICAgICAgICAgICAgICBwYXJ0cy5wdXNoKHsgbmFtZTogJycsIHR5cGU6ICdhcnJheScgfSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAvLyBDb250ZW51IGRhbnMgbGVzIGNyb2NoZXRzXHJcbiAgICAgICAgICAgICAgICBjb25zdCBudW1JbmRleCA9IE51bWJlci5wYXJzZUludChicmFja2V0Q29udGVudCwgMTApO1xyXG4gICAgICAgICAgICAgICAgaWYgKCFOdW1iZXIuaXNOYU4obnVtSW5kZXgpICYmIGJyYWNrZXRDb250ZW50ID09PSBTdHJpbmcobnVtSW5kZXgpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gSW5kaWNlIG51bcOpcmlxdWVcclxuICAgICAgICAgICAgICAgICAgICBwYXJ0cy5wdXNoKHsgbmFtZTogU3RyaW5nKG51bUluZGV4KSwgdHlwZTogJ251bWVyaWMnLCBpbmRleDogbnVtSW5kZXggfSk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIE5vbSBkZSBwcm9wcmnDqXTDqVxyXG4gICAgICAgICAgICAgICAgICAgIHBhcnRzLnB1c2goeyBuYW1lOiBicmFja2V0Q29udGVudCwgdHlwZTogJ2tleScgfSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaSsrOyAvLyBQYXNzZXIgbGUgJ10nXHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgY3VycmVudCArPSBjaGFyO1xyXG4gICAgICAgICAgICBpKys7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgXHJcbiAgICAvLyBBam91dGVyIGxhIGRlcm5pw6hyZSBwYXJ0aWUgc2kgZWxsZSBleGlzdGVcclxuICAgIGlmIChjdXJyZW50KSB7XHJcbiAgICAgICAgcGFydHMucHVzaCh7IG5hbWU6IGN1cnJlbnQsIHR5cGU6ICdrZXknIH0pO1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICByZXR1cm4gcGFydHM7XHJcbn07XHJcblxyXG4vKipcclxuICogVsOpcmlmaWUgc2kgdW5lIHZhbGV1ciBlc3QgdW4gb2JqZXQgc2ltcGxlIChwYXMgdW4gdGFibGVhdSwgcGFzIG51bGwpXHJcbiAqIEBwYXJhbSB7Kn0gb2JqIC0gTGEgdmFsZXVyIMOgIHbDqXJpZmllclxyXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cclxuICogQHByaXZhdGVcclxuICovXHJcbmNvbnN0IGlzUGxhaW5PYmplY3QgPSAob2JqKSA9PiB7XHJcbiAgICByZXR1cm4gdHlwZW9mIG9iaiA9PT0gJ29iamVjdCcgJiYgb2JqICE9PSBudWxsICYmICFBcnJheS5pc0FycmF5KG9iaik7XHJcbn07XHJcbiIsImltcG9ydCAnLi9jc3MvdHJpc3RhdGUuY3NzJztcclxuXHJcbi8qKlxyXG4gKiBDcmVhdGVzIGEgdHJpLXN0YXRlIGNoZWNrYm94IGZvciBlYWNoIGNoZWNrYm94IGVsZW1lbnQgaW4gdGhlIGFweC5lbGVtZW50cyBhcnJheS5cclxuICogQHBhcmFtIHtBcnJheTxIVE1MRWxlbWVudD59IGFweCAtIEFuIGFycmF5IG9mIEhUTUxFbGVtZW50cyB3aGljaCBpcyByZXR1cm5lZCBieSBBUFgoKVxyXG4gKiBAZXhhbXBsZVxyXG4gKiAvLyBDYWxsIHRoZSB0cmlzdGF0ZSBmdW5jdGlvbiBvbiBhbiBhcnJheSBvZiBjaGVja2JveCBlbGVtZW50c1xyXG4gKiBhcHgudHJpc3RhdGUoKTtcclxuICovXHJcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIChhcHgpIHtcclxuICAgIGFweC50cmlzdGF0ZSA9IGZ1bmN0aW9uIChvcHRpb25zID0ge30pe1xyXG4gICAgICAgIGFweC5lbGVtZW50cy5mb3JFYWNoKChlbGVtZW50KSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChlbGVtZW50LnR5cGUgPT09ICdjaGVja2JveCcpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IFtvcmlnaW5hbENoZWNrYm94LCB0cmlzdGF0ZURvbSwgaGlkZGVuSW5wdXRdID0gY3JlYXRlVHJpU3RhdGVDaGVja2JveChlbGVtZW50LG9wdGlvbnMpO1xyXG4gICAgICAgICAgICAgICAgLy9JZiB0aGVyZSBpcyBhIFwib3B0aW9ucy5jYWxsYmFja3MuYWZ0ZXJcIiBjYWxsYmFjayBpbiBvcHRpb25zIGNhbGwgaXRcclxuICAgICAgICAgICAgICAgIGlmKG9wdGlvbnMuY2FsbGJhY2tzICYmIG9wdGlvbnMuY2FsbGJhY2tzLmFmdGVyICYmIHR5cGVvZiBvcHRpb25zLmNhbGxiYWNrcy5hZnRlciA9PT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuY2FsbGJhY2tzLmFmdGVyKG9yaWdpbmFsQ2hlY2tib3gsIHRyaXN0YXRlRG9tLCBoaWRkZW5JbnB1dCk7XHJcbiAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxufVxyXG5cclxuZnVuY3Rpb24gdG9nZ2xlVHJpU3RhdGVDaGVja2JveFN0YXRlKGN1c3RvbUNoZWNrYm94LCBhY3R1YWxDaGVja2JveCwgaGlkZGVuSW5wdXQpIHtcclxuICAgIGlmIChjdXN0b21DaGVja2JveC5jbGFzc0xpc3QuY29udGFpbnMoJ2NoZWNrZWQnKSkge1xyXG4gICAgICAgIGN1c3RvbUNoZWNrYm94LmNsYXNzTGlzdC5yZW1vdmUoJ2NoZWNrZWQnKTtcclxuICAgICAgICBjdXN0b21DaGVja2JveC5jbGFzc0xpc3QuYWRkKCdjcm9zc2VkJyk7XHJcbiAgICAgICAgYWN0dWFsQ2hlY2tib3guY2hlY2tlZCA9IGZhbHNlO1xyXG4gICAgICAgIGhpZGRlbklucHV0LnZhbHVlID0gJ2ZhbHNlJztcclxuICAgIH0gZWxzZSBpZiAoY3VzdG9tQ2hlY2tib3guY2xhc3NMaXN0LmNvbnRhaW5zKCdjcm9zc2VkJykpIHtcclxuICAgICAgICBjdXN0b21DaGVja2JveC5jbGFzc0xpc3QucmVtb3ZlKCdjcm9zc2VkJyk7XHJcbiAgICAgICAgY3VzdG9tQ2hlY2tib3guY2xhc3NMaXN0LmFkZCgndW5jaGVja2VkJyk7XHJcbiAgICAgICAgaGlkZGVuSW5wdXQucmVtb3ZlQXR0cmlidXRlKCduYW1lJyk7IC8vIEVuc3VyZSB0aGUgaGlkZGVuIGlucHV0IGRvZXNuJ3QgcG9zdCBhbnkgdmFsdWVcclxuICAgICAgICBoaWRkZW5JbnB1dC5yZW1vdmVBdHRyaWJ1dGUoJ3ZhbHVlJyk7IC8vIEVuc3VyZSB0aGUgaGlkZGVuIGlucHV0IGRvZXNuJ3QgcG9zdCBhbnkgdmFsdWVcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgICAgY3VzdG9tQ2hlY2tib3guY2xhc3NMaXN0LnJlbW92ZSgndW5jaGVja2VkJyk7XHJcbiAgICAgICAgY3VzdG9tQ2hlY2tib3guY2xhc3NMaXN0LmFkZCgnY2hlY2tlZCcpO1xyXG4gICAgICAgIGFjdHVhbENoZWNrYm94LmNoZWNrZWQgPSB0cnVlO1xyXG4gICAgICAgIGhpZGRlbklucHV0LnZhbHVlID0gJ3RydWUnO1xyXG4gICAgICAgIGhpZGRlbklucHV0LnNldEF0dHJpYnV0ZSgnbmFtZScsIGFjdHVhbENoZWNrYm94LmRhdGFzZXQubmFtZSk7IC8vIFJlc3RvcmUgdGhlIG5hbWUgZm9yIHBvc3RpbmdcclxuICAgIH1cclxufVxyXG5cclxuZnVuY3Rpb24gY3JlYXRlVHJpU3RhdGVDaGVja2JveChjaGVja2JveEVsZW1lbnQsIG9wdGlvbnMpIHtcclxuICAgIFxyXG4gICAgLy9nZXQgdGhlIGNoZWNrYm94IG1hcmdpbnMgaW5jbHVkaW5nIGJyb3dzZXIgZGVmYXVsdFxyXG4gICAgY29uc3QgY2hlY2tib3hTdHlsZSA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGNoZWNrYm94RWxlbWVudCk7XHJcbiAgICAvLyBIaWRlIHRoZSBvcmlnaW5hbCBjaGVja2JveFxyXG4gICAgY2hlY2tib3hFbGVtZW50LnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XHJcblxyXG4gICAgLy8gQ3JlYXRlIHRoZSBjdXN0b20gY2hlY2tib3ggZGl2IGFuZCBzZXQgaXRzIGluaXRpYWwgc3RhdGVcclxuICAgIGNvbnN0IHRyaXN0YXRlRG9tID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XHJcbiAgICB0cmlzdGF0ZURvbS5jbGFzc0xpc3QuYWRkKCdhcHgtdHJpc3RhdGUnKTtcclxuICAgIGlmIChvcHRpb25zLnNpemUpIHtcclxuICAgICAgICBpZiAob3B0aW9ucy5zaXplLndpZHRoKSB7XHJcbiAgICAgICAgICAgIHRyaXN0YXRlRG9tLnN0eWxlLndpZHRoID0gb3B0aW9ucy5zaXplLndpZHRoICsgJ3B4JztcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKG9wdGlvbnMuc2l6ZS5oZWlnaHQpIHtcclxuICAgICAgICAgICAgdHJpc3RhdGVEb20uc3R5bGUuaGVpZ2h0ID0gb3B0aW9ucy5zaXplLmhlaWdodCArICdweCc7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgaWYob3B0aW9ucy5jbGFzc2VzKSB0cmlzdGF0ZURvbS5jbGFzc0xpc3QuYWRkKC4uLmNvbXB1dGVDbGFzc2VzKG9wdGlvbnMuY2xhc3NlcykpO1xyXG5cclxuICAgIHRyaXN0YXRlRG9tLnN0eWxlLm1hcmdpbiA9IGNoZWNrYm94U3R5bGUubWFyZ2luO1xyXG5cclxuICAgIGlmIChjaGVja2JveEVsZW1lbnQuY2hlY2tlZCkge1xyXG4gICAgICAgIHRyaXN0YXRlRG9tLmNsYXNzTGlzdC5hZGQoJ2NoZWNrZWQnKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdHJpc3RhdGVEb20uY2xhc3NMaXN0LmFkZCgndW5jaGVja2VkJyk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gQ3JlYXRlIHRoZSBoaWRkZW4gaW5wdXQgZmllbGRcclxuICAgIGNvbnN0IGhpZGRlbklucHV0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW5wdXQnKTtcclxuICAgIGhpZGRlbklucHV0LnR5cGUgPSAnaGlkZGVuJztcclxuICAgIGhpZGRlbklucHV0Lm5hbWUgPSBjaGVja2JveEVsZW1lbnQubmFtZTsgLy8gQ29weSB0aGUgbmFtZSBmcm9tIHRoZSBvcmlnaW5hbCBjaGVja2JveFxyXG4gICAgY2hlY2tib3hFbGVtZW50LmRhdGFzZXQubmFtZSA9IGNoZWNrYm94RWxlbWVudC5uYW1lOyAvLyBTdG9yZSB0aGUgbmFtZSBpbiBhIGRhdGEgYXR0cmlidXRlIGZvciBsYXRlciB1c2VcclxuICAgIGNoZWNrYm94RWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoJ25hbWUnKTsgLy8gUmVtb3ZlIHRoZSBuYW1lIGZyb20gdGhlIG9yaWdpbmFsIGNoZWNrYm94IHRvIGF2b2lkIGRvdWJsZSBwb3N0aW5nXHJcblxyXG4gICAgaWYgKG9wdGlvbnMuZGVmYXVsdFN0YXRlKSBzZXREZWZhdWx0U3RhdGUob3B0aW9ucywgdHJpc3RhdGVEb20sIGhpZGRlbklucHV0KTtcclxuICAgIGVsc2V7XHJcbiAgICAgICAgLy8gU2V0IHRoZSBpbml0aWFsIHZhbHVlIGZvciB0aGUgaGlkZGVuIGlucHV0IGJhc2VkIG9uIHRoZSBjaGVja2JveCdzIHN0YXRlXHJcbiAgICAgICAgaWYgKGNoZWNrYm94RWxlbWVudC5jaGVja2VkKSB7XHJcbiAgICAgICAgICAgIGhpZGRlbklucHV0LnZhbHVlID0gJ3RydWUnO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGhpZGRlbklucHV0Lm5hbWUgPSAnJzsgLy8gRW5zdXJlIHRoZSBoaWRkZW4gaW5wdXQgZG9lc24ndCBwb3N0IGFueSB2YWx1ZVxyXG4gICAgICAgICAgICBoaWRkZW5JbnB1dC52YWx1ZSA9ICcnO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvL2hhbmRsZSBhY2Nlc3NpYmlsaXR5LCBzZXQgdGhlIHRhYmluZGV4IHRvIHRoZSBzYW1lIGFzIHRoZSBjaGVja2JveFxyXG4gICAgdHJpc3RhdGVEb20udGFiSW5kZXggPSBjaGVja2JveEVsZW1lbnQudGFiSW5kZXg7XHJcblxyXG4gICAgLy8gSW5zZXJ0IHRoZSBoaWRkZW4gaW5wdXQgaW5zaWRlIHRoZSBjdXN0b20gY2hlY2tib3ggZGl2XHJcbiAgICB0cmlzdGF0ZURvbS5hcHBlbmRDaGlsZChoaWRkZW5JbnB1dCk7XHJcblxyXG4gICAgLy8gSW5zZXJ0IGl0IG5leHQgdG8gdGhlIGFjdHVhbCBjaGVja2JveFxyXG4gICAgY2hlY2tib3hFbGVtZW50LnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKHRyaXN0YXRlRG9tLCBjaGVja2JveEVsZW1lbnQubmV4dFNpYmxpbmcpO1xyXG5cclxuICAgIC8vIEFkZCBldmVudCBsaXN0ZW5lclxyXG4gICAgdHJpc3RhdGVEb20uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmdW5jdGlvbiAoZSkge1xyXG4gICAgICAgIHRvZ2dsZVRyaVN0YXRlQ2hlY2tib3hTdGF0ZSh0cmlzdGF0ZURvbSwgY2hlY2tib3hFbGVtZW50LCBoaWRkZW5JbnB1dCk7XHJcbiAgICAgICAgYnViYmxlRXZlbnRzVG9PcmlnaW5hbENoZWNrYm94KG9wdGlvbnMsIGNoZWNrYm94RWxlbWVudCwgdHJpc3RhdGVEb20sIGhpZGRlbklucHV0LCBlKTtcclxuICAgIH0pO1xyXG4gICAgdHJpc3RhdGVEb20uYWRkRXZlbnRMaXN0ZW5lcigna2V5dXAnLCBvbmtleXVwLmJpbmQobnVsbCwgY2hlY2tib3hFbGVtZW50KSk7XHJcblxyXG4gICAgcmV0dXJuIFtjaGVja2JveEVsZW1lbnQsIHRyaXN0YXRlRG9tLCBoaWRkZW5JbnB1dF07XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHNldERlZmF1bHRTdGF0ZShvcHRpb25zLCB0cmlzdGF0ZURvbSwgaGlkZGVuSW5wdXQpIHtcclxuICAgIC8vZm9yIGFsbCB2YWx1ZXMgcG9zc2libGUgZm9yIGRlZmF1bHRTdGF0ZSwgc2V0IHRoZSBpbml0aWFsIHN0YXRlIG9mIHRoZSBjaGVja2JveFxyXG4gICAgaWYgKG9wdGlvbnMuZGVmYXVsdFN0YXRlID09PSAnY2hlY2tlZCcpIHtcclxuICAgICAgICB0cmlzdGF0ZURvbS5jbGFzc0xpc3QucmVtb3ZlKCd1bmNoZWNrZWQnKTtcclxuICAgICAgICB0cmlzdGF0ZURvbS5jbGFzc0xpc3QuYWRkKCdjaGVja2VkJyk7XHJcbiAgICAgICAgaGlkZGVuSW5wdXQudmFsdWUgPSAndHJ1ZSc7XHJcbiAgICB9XHJcbiAgICBlbHNlIGlmIChvcHRpb25zLmRlZmF1bHRTdGF0ZSA9PT0gJ3VuY2hlY2tlZCcpIHtcclxuICAgICAgICB0cmlzdGF0ZURvbS5jbGFzc0xpc3QucmVtb3ZlKCdjaGVja2VkJyk7XHJcbiAgICAgICAgdHJpc3RhdGVEb20uY2xhc3NMaXN0LmFkZCgndW5jaGVja2VkJyk7XHJcbiAgICAgICAgaGlkZGVuSW5wdXQucmVtb3ZlQXR0cmlidXRlKCduYW1lJyk7IC8vIEVuc3VyZSB0aGUgaGlkZGVuIGlucHV0IGRvZXNuJ3QgcG9zdCBhbnkgdmFsdWVcclxuICAgICAgICBoaWRkZW5JbnB1dC5yZW1vdmVBdHRyaWJ1dGUoJ3ZhbHVlJyk7IC8vIEVuc3VyZSB0aGUgaGlkZGVuIGlucHV0IGRvZXNuJ3QgcG9zdCBhbnkgdmFsdWVcclxuICAgIH1cclxuICAgIGVsc2UgaWYgKG9wdGlvbnMuZGVmYXVsdFN0YXRlID09PSAnY3Jvc3NlZCcpIHtcclxuICAgICAgICB0cmlzdGF0ZURvbS5jbGFzc0xpc3QucmVtb3ZlKCdjaGVja2VkJyk7XHJcbiAgICAgICAgdHJpc3RhdGVEb20uY2xhc3NMaXN0LmFkZCgnY3Jvc3NlZCcpO1xyXG4gICAgICAgIGhpZGRlbklucHV0LnZhbHVlID0gJ2ZhbHNlJztcclxuICAgIH1cclxufVxyXG5cclxuZnVuY3Rpb24gY29tcHV0ZUNsYXNzZXMoY2xhc3Nlcykge1xyXG4gICAgbGV0IGNvbXB1dGVkQ2xhc3NlcyA9IFtdO1xyXG4gICAgaWYodHlwZW9mIGNsYXNzZXMgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgLy9yZXBsYWNlIG11bHRpcGxlIHdoaXRlIHNwYWNlcyB3aXRoIGEgc2luZ2xlIHNwYWNlXHJcbiAgICAgICAgY2xhc3NlcyA9IGNsYXNzZXMucmVwbGFjZSgvXFxzXFxzKy9nLCAnICcpO1xyXG4gICAgICAgIGlmKGNsYXNzZXMuaW5kZXhPZignICcpID4gLTEpXHJcbiAgICAgICAgICAgIGNvbXB1dGVkQ2xhc3NlcyA9IGNsYXNzZXMuc3BsaXQoJyAnKTtcclxuICAgICAgICBlbHNlIGlmKGNsYXNzZXMuaW5kZXhPZignLCcpID4gLTEpXHJcbiAgICAgICAgICAgIGNvbXB1dGVkQ2xhc3NlcyA9IGNsYXNzZXMuc3BsaXQoJywnKTtcclxuICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIGNvbXB1dGVkQ2xhc3NlcyA9IFtjbGFzc2VzXTtcclxuICAgIH1cclxuICAgIGVsc2UgaWYoQXJyYXkuaXNBcnJheShjbGFzc2VzKSkge1xyXG4gICAgICAgIGNvbXB1dGVkQ2xhc3NlcyA9IGNsYXNzZXM7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gY29tcHV0ZWRDbGFzc2VzO1xyXG59XHJcblxyXG5mdW5jdGlvbiBidWJibGVFdmVudHNUb09yaWdpbmFsQ2hlY2tib3gob3B0aW9ucywgY2hlY2tib3hFbGVtZW50LCB0cmlzdGF0ZURvbSwgaGlkZGVuSW5wdXQsIGV2ZW50KSB7XHJcbiAgICAvL2lmIG9wdGlvbnMuY2FsbGJhY2tzLmNoYW5nZSBpcyBzZXQsIGNhbGwgaXRcclxuICAgIGlmKG9wdGlvbnMuY2FsbGJhY2tzICYmIG9wdGlvbnMuY2FsbGJhY2tzLmNoYW5nZSAmJiB0eXBlb2Ygb3B0aW9ucy5jYWxsYmFja3MuY2hhbmdlID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgICAgb3B0aW9ucy5jYWxsYmFja3MuY2hhbmdlKGNoZWNrYm94RWxlbWVudCwgdHJpc3RhdGVEb20sIGhpZGRlbklucHV0KTtcclxuICAgIH1cclxuXHJcbiAgICBpZighb3B0aW9ucy5idWJibGVFdmVudHMpIHJldHVybjtcclxuXHJcbiAgICBpZihldmVudC50eXBlID09PSAnY2xpY2snKSB7XHJcbiAgICAgICAgY2hlY2tib3hFbGVtZW50LmRpc3BhdGNoRXZlbnQobmV3IE1vdXNlRXZlbnQoJ2NsaWNrJywgeyBidWJibGVzOiB0cnVlLCBjYW5jZWxhYmxlOiB0cnVlIH0pKTtcclxuICAgIH1cclxuICAgIGVsc2UgaWYoZXZlbnQudHlwZSA9PT0gJ2tleXVwJykge1xyXG4gICAgICAgIGNoZWNrYm94RWxlbWVudC5kaXNwYXRjaEV2ZW50KG5ldyBLZXlib2FyZEV2ZW50KCdrZXl1cCcsIHsga2V5OiAnICcsIGJ1YmJsZXM6IHRydWUsIGNhbmNlbGFibGU6IHRydWUgfSkpO1xyXG4gICAgfVxyXG4gICAgZWxzZSBpZihldmVudC50eXBlID09PSAnY2hhbmdlJykge1xyXG4gICAgICAgIGNoZWNrYm94RWxlbWVudC5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudCgnY2hhbmdlJywgeyBidWJibGVzOiB0cnVlLCBjYW5jZWxhYmxlOiB0cnVlIH0pKTtcclxuICAgIH1cclxufVxyXG5cclxuZnVuY3Rpb24gb25rZXl1cChjaGVja2JveEVsZW1lbnQsIGV2ZW50KSB7XHJcbiAgICBpZiAoZXZlbnQua2V5Q29kZSA9PT0gMzIpIHtcclxuICAgICAgICBidWJibGVFdmVudHNUb09yaWdpbmFsQ2hlY2tib3goY2hlY2tib3hFbGVtZW50LCBldmVudCk7XHJcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICBldmVudC50YXJnZXQuY2xpY2soKTtcclxuICAgIH1cclxufSIsIi8vIFRoZSBtb2R1bGUgY2FjaGVcbnZhciBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX18gPSB7fTtcblxuLy8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbmZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcblx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG5cdHZhciBjYWNoZWRNb2R1bGUgPSBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdO1xuXHRpZiAoY2FjaGVkTW9kdWxlICE9PSB1bmRlZmluZWQpIHtcblx0XHRyZXR1cm4gY2FjaGVkTW9kdWxlLmV4cG9ydHM7XG5cdH1cblx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcblx0dmFyIG1vZHVsZSA9IF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF0gPSB7XG5cdFx0aWQ6IG1vZHVsZUlkLFxuXHRcdC8vIG5vIG1vZHVsZS5sb2FkZWQgbmVlZGVkXG5cdFx0ZXhwb3J0czoge31cblx0fTtcblxuXHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cblx0X193ZWJwYWNrX21vZHVsZXNfX1ttb2R1bGVJZF0obW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cblx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcblx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xufVxuXG4vLyBleHBvc2UgdGhlIG1vZHVsZXMgb2JqZWN0IChfX3dlYnBhY2tfbW9kdWxlc19fKVxuX193ZWJwYWNrX3JlcXVpcmVfXy5tID0gX193ZWJwYWNrX21vZHVsZXNfXztcblxuIiwiLy8gZ2V0RGVmYXVsdEV4cG9ydCBmdW5jdGlvbiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG5vbi1oYXJtb255IG1vZHVsZXNcbl9fd2VicGFja19yZXF1aXJlX18ubiA9IChtb2R1bGUpID0+IHtcblx0dmFyIGdldHRlciA9IG1vZHVsZSAmJiBtb2R1bGUuX19lc01vZHVsZSA/XG5cdFx0KCkgPT4gKG1vZHVsZVsnZGVmYXVsdCddKSA6XG5cdFx0KCkgPT4gKG1vZHVsZSk7XG5cdF9fd2VicGFja19yZXF1aXJlX18uZChnZXR0ZXIsIHsgYTogZ2V0dGVyIH0pO1xuXHRyZXR1cm4gZ2V0dGVyO1xufTsiLCIvLyBkZWZpbmUgZ2V0dGVyIGZ1bmN0aW9ucyBmb3IgaGFybW9ueSBleHBvcnRzXG5fX3dlYnBhY2tfcmVxdWlyZV9fLmQgPSAoZXhwb3J0cywgZGVmaW5pdGlvbikgPT4ge1xuXHRmb3IodmFyIGtleSBpbiBkZWZpbml0aW9uKSB7XG5cdFx0aWYoX193ZWJwYWNrX3JlcXVpcmVfXy5vKGRlZmluaXRpb24sIGtleSkgJiYgIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBrZXkpKSB7XG5cdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywga2V5LCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZGVmaW5pdGlvbltrZXldIH0pO1xuXHRcdH1cblx0fVxufTsiLCJfX3dlYnBhY2tfcmVxdWlyZV9fLm8gPSAob2JqLCBwcm9wKSA9PiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwgcHJvcCkpIiwiLy8gZGVmaW5lIF9fZXNNb2R1bGUgb24gZXhwb3J0c1xuX193ZWJwYWNrX3JlcXVpcmVfXy5yID0gKGV4cG9ydHMpID0+IHtcblx0aWYodHlwZW9mIFN5bWJvbCAhPT0gJ3VuZGVmaW5lZCcgJiYgU3ltYm9sLnRvU3RyaW5nVGFnKSB7XG5cdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFN5bWJvbC50b1N0cmluZ1RhZywgeyB2YWx1ZTogJ01vZHVsZScgfSk7XG5cdH1cblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogdHJ1ZSB9KTtcbn07IiwiX193ZWJwYWNrX3JlcXVpcmVfXy5iID0gZG9jdW1lbnQuYmFzZVVSSSB8fCBzZWxmLmxvY2F0aW9uLmhyZWY7XG5cbi8vIG9iamVjdCB0byBzdG9yZSBsb2FkZWQgYW5kIGxvYWRpbmcgY2h1bmtzXG4vLyB1bmRlZmluZWQgPSBjaHVuayBub3QgbG9hZGVkLCBudWxsID0gY2h1bmsgcHJlbG9hZGVkL3ByZWZldGNoZWRcbi8vIFtyZXNvbHZlLCByZWplY3QsIFByb21pc2VdID0gY2h1bmsgbG9hZGluZywgMCA9IGNodW5rIGxvYWRlZFxudmFyIGluc3RhbGxlZENodW5rcyA9IHtcblx0XCJtYWluXCI6IDBcbn07XG5cbi8vIG5vIGNodW5rIG9uIGRlbWFuZCBsb2FkaW5nXG5cbi8vIG5vIHByZWZldGNoaW5nXG5cbi8vIG5vIHByZWxvYWRlZFxuXG4vLyBubyBITVJcblxuLy8gbm8gSE1SIG1hbmlmZXN0XG5cbi8vIG5vIG9uIGNodW5rcyBsb2FkZWRcblxuLy8gbm8ganNvbnAgZnVuY3Rpb24iLCJfX3dlYnBhY2tfcmVxdWlyZV9fLm5jID0gdW5kZWZpbmVkOyIsImltcG9ydCBhdWdtZW50V2l0aExpc3RlbiBmcm9tICcuL21vZHVsZXMvbGlzdGVuL2xpc3Rlbi5tanMnO1xuaW1wb3J0IGF1Z21lbnRXaXRoVHJpc3RhdGUgZnJvbSAnLi9tb2R1bGVzL3RyaXN0YXRlL3RyaXN0YXRlLm1qcyc7XG5pbXBvcnQgZGlhbG9nIGZyb20gJy4vbW9kdWxlcy9kaWFsb2cvZGlhbG9nLm1qcyc7XG5pbXBvcnQgdG9hc3QgZnJvbSAnLi9tb2R1bGVzL3RvYXN0L3RvYXN0Lm1qcyc7XG5pbXBvcnQgeyBsb2FkQ3NzIH0gZnJvbSAnLi9tb2R1bGVzL2NvbW1vbi5tanMnO1xuaW1wb3J0IHsgYXVnbWVudFdpdGhQYWNrLCB0b29scyB9IGZyb20gJy4vbW9kdWxlcy90b29scy9leHBvcnRzLm1qcyc7XG5cbi8qKlxuICogQ3JlYXRlcyBhbiBBUFggb2JqZWN0IHRoYXQgd3JhcHMgb25lIG9yIG1vcmUgSFRNTCBlbGVtZW50cy5cbiAqIEBwYXJhbSB7c3RyaW5nfEhUTUxFbGVtZW50fE5vZGVMaXN0fEhUTUxDb2xsZWN0aW9ufEFycmF5PEhUTUxFbGVtZW50PnxqUXVlcnl8RnVuY3Rpb259IGlucHV0IC0gVGhlIGlucHV0IHRvIGNyZWF0ZSB0aGUgQVBYIG9iamVjdCBmcm9tLlxuICogQHJldHVybnMge09iamVjdH0gVGhlIEFQWCBvYmplY3QuXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlIGlucHV0IHR5cGUgaXMgaW52YWxpZC5cbiAqIEBleGFtcGxlXG4gKiAvLyBYUGF0aFxuICogY29uc3QgYXB4MSA9IEFQWCgnLy9kaXZbQGNsYXNzPVwiZXhhbXBsZVwiXScpO1xuICpcbiAqIC8vIENTUyBzZWxlY3RvclxuICogY29uc3QgYXB4MiA9IEFQWCgnLmV4YW1wbGUnKTtcbiAqXG4gKiAvLyBTaW5nbGUgZWxlbWVudFxuICogY29uc3QgZWxlbWVudCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5leGFtcGxlJyk7XG4gKiBjb25zdCBhcHgzID0gQVBYKGVsZW1lbnQpO1xuICpcbiAqIC8vIE5vZGVMaXN0IG9yIEhUTUxDb2xsZWN0aW9uXG4gKiBjb25zdCBub2RlTGlzdCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5leGFtcGxlJyk7XG4gKiBjb25zdCBhcHg0ID0gQVBYKG5vZGVMaXN0KTtcbiAqXG4gKiAvLyBBcnJheSBvZiBlbGVtZW50c1xuICogY29uc3QgZWxlbWVudHMgPSBbZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmV4YW1wbGUxJyksIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5leGFtcGxlMicpXTtcbiAqIGNvbnN0IGFweDUgPSBBUFgoZWxlbWVudHMpO1xuICpcbiAqIC8vIGpRdWVyeSBvYmplY3RcbiAqIGNvbnN0ICRleGFtcGxlID0gJCgnLmV4YW1wbGUnKTtcbiAqIGNvbnN0IGFweDYgPSBBUFgoJGV4YW1wbGUpO1xuICpcbiAqIC8vIEZ1bmN0aW9uIHJldHVybmluZyBhbiBBUFggb2JqZWN0XG4gKiBjb25zdCBhcHg3ID0gQVBYKCgpID0+IEFQWCgnLmV4YW1wbGUnKSk7XG4gKi9cbmNvbnN0IEFQWCA9IGZ1bmN0aW9uIChpbnB1dCwgY29udGV4dCA9IGRvY3VtZW50KSB7XG4gICAgbGV0IGVsZW1lbnRzO1xuXG4gICAgLy8gVmFsaWRhdGUgY29udGV4dFxuICAgIGlmICh0eXBlb2YgY29udGV4dCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgY29udGV4dCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoY29udGV4dCk7XG4gICAgfVxuICAgIGVsc2UgaWYgKEFQWC5pc0FQWE9iamVjdChjb250ZXh0KSkge1xuICAgICAgICBjb250ZXh0ID0gY29udGV4dC5maXJzdCgpO1xuICAgIH0gZWxzZSBpZiAoIShjb250ZXh0IGluc3RhbmNlb2YgSFRNTEVsZW1lbnQgfHwgY29udGV4dCBpbnN0YW5jZW9mIERvY3VtZW50KSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgY29udGV4dCBmb3IgQVBYJyk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBpbnB1dCA9PT0gJ3N0cmluZycgJiYgaW5wdXQuc3RhcnRzV2l0aCgnLy8nKSkge1xuICAgICAgICAvLyBYUGF0aCB3aXRoIGNvbnRleHRcbiAgICAgICAgZWxlbWVudHMgPSBkb2N1bWVudC5ldmFsdWF0ZShpbnB1dCwgY29udGV4dCwgbnVsbCwgWFBhdGhSZXN1bHQuQU5ZX1RZUEUsIG51bGwpO1xuICAgICAgICBsZXQgbm9kZXMgPSBbXTtcbiAgICAgICAgbGV0IG5vZGUgPSBlbGVtZW50cy5pdGVyYXRlTmV4dCgpO1xuICAgICAgICB3aGlsZSAobm9kZSkge1xuICAgICAgICAgICAgbm9kZXMucHVzaChub2RlKTtcbiAgICAgICAgICAgIG5vZGUgPSBlbGVtZW50cy5pdGVyYXRlTmV4dCgpO1xuICAgICAgICB9XG4gICAgICAgIGVsZW1lbnRzID0gbm9kZXM7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgaW5wdXQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIC8vIENTUyBzZWxlY3RvciB3aXRoIGNvbnRleHRcbiAgICAgICAgZWxlbWVudHMgPSBjb250ZXh0LnF1ZXJ5U2VsZWN0b3JBbGwoaW5wdXQpO1xuICAgIH0gZWxzZSBpZiAoaW5wdXQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCkge1xuICAgICAgICAvLyBTaW5nbGUgZWxlbWVudCB3aXRoaW4gY29udGV4dFxuICAgICAgICBlbGVtZW50cyA9IGNvbnRleHQuY29udGFpbnMoaW5wdXQpID8gW2lucHV0XSA6IFtdO1xuICAgIH0gZWxzZSBpZiAoaW5wdXQgaW5zdGFuY2VvZiBOb2RlTGlzdCB8fCBpbnB1dCBpbnN0YW5jZW9mIEhUTUxDb2xsZWN0aW9uKSB7XG4gICAgICAgIC8vIE5vZGVMaXN0IG9yIEhUTUxDb2xsZWN0aW9uIHdpdGhpbiBjb250ZXh0XG4gICAgICAgIGVsZW1lbnRzID0gQXJyYXkuZnJvbShpbnB1dCkuZmlsdGVyKGVsID0+IGNvbnRleHQuY29udGFpbnMoZWwpKTtcbiAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoaW5wdXQpICYmIGlucHV0LmV2ZXJ5KGVsID0+IGVsIGluc3RhbmNlb2YgSFRNTEVsZW1lbnQpKSB7XG4gICAgICAgIC8vIEFycmF5IG9mIGVsZW1lbnRzIHdpdGhpbiBjb250ZXh0XG4gICAgICAgIGVsZW1lbnRzID0gaW5wdXQuZmlsdGVyKGVsID0+IGNvbnRleHQuY29udGFpbnMoZWwpKTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBqUXVlcnkgIT0gJ3VuZGVmaW5lZCcgJiYgaW5wdXQgaW5zdGFuY2VvZiBqUXVlcnkpIHtcbiAgICAgICAgLy8galF1ZXJ5IG9iamVjdCB3aXRoaW4gY29udGV4dFxuICAgICAgICBlbGVtZW50cyA9IEFycmF5LmZyb20oaW5wdXQuZ2V0KCkpLmZpbHRlcihlbCA9PiBjb250ZXh0LmNvbnRhaW5zKGVsKSk7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgaW5wdXQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgLy8gRnVuY3Rpb24gcmV0dXJuaW5nIGFuIEFQWCBvYmplY3Qgd2l0aCBjb250ZXh0XG4gICAgICAgIGVsZW1lbnRzID0gQVBYKGlucHV0KCksIGNvbnRleHQpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBpbnB1dCB0eXBlIGZvciBBUFgnKTtcbiAgICB9XG5cbiAgICB2YXIgYXB4ID0ge1xuICAgICAgICBlbGVtZW50czogZWxlbWVudHMsXG4gICAgICAgIF9pc0FQWE9iamVjdDogdHJ1ZVxuICAgIH07XG4gICAgYXB4Lmxlbmd0aCA9IGVsZW1lbnRzLmxlbmd0aDtcbiAgICBhcHguZWFjaCA9IGZ1bmN0aW9uIChjYWxsYmFjaykge1xuICAgICAgICBpZiAodGhpcy5lbGVtZW50cyBpbnN0YW5jZW9mIEFycmF5KSB0aGlzLmVsZW1lbnRzLmZvckVhY2goY2FsbGJhY2spO1xuICAgICAgICBpZiAodGhpcy5lbGVtZW50cyBpbnN0YW5jZW9mIE5vZGVMaXN0KSBBcnJheS5mcm9tKHRoaXMuZWxlbWVudHMpLmZvckVhY2goY2FsbGJhY2spO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuICAgIGFweC5nZXQgPSBmdW5jdGlvbiAoaW5kZXgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZWxlbWVudHNbaW5kZXhdO1xuICAgIH07XG4gICAgYXB4LmFsbCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKHRoaXMuZWxlbWVudHMgaW5zdGFuY2VvZiBBcnJheSkgcmV0dXJuIHRoaXMuZWxlbWVudHM7XG4gICAgICAgIGlmICh0aGlzLmVsZW1lbnRzIGluc3RhbmNlb2YgTm9kZUxpc3QpIHJldHVybiBBcnJheS5mcm9tKHRoaXMuZWxlbWVudHMpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuICAgIGFweC5maXJzdCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0KDApO1xuICAgIH07XG4gICAgYXVnbWVudFdpdGhMaXN0ZW4oYXB4KTtcbiAgICBhdWdtZW50V2l0aFRyaXN0YXRlKGFweCk7XG4gICAgYXVnbWVudFdpdGhQYWNrKGFweCk7XG4gICAgcmV0dXJuIGFweDtcbn07XG5cbkFQWC5sb2FkQ3NzID0gbG9hZENzcztcbkFQWC5kaWFsb2cgPSBkaWFsb2c7XG5BUFgudG9hc3QgPSB0b2FzdDtcbkFQWC50b29scyA9IHRvb2xzO1xuQVBYLmlzQVBYT2JqZWN0ID0gZnVuY3Rpb24gKG9iaikge1xuICAgIHJldHVybiBvYmogJiYgb2JqLl9pc0FQWE9iamVjdCA9PT0gdHJ1ZTtcbn1cbkFQWC5pc19udW1lcmljID0gKG4pID0+IHtcbiAgICByZXR1cm4gIWlzTmFOKG4gLSBwYXJzZUZsb2F0KG4pKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgQVBYOyJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==
|
|
4437
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,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QUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBLDZDQUE2QztBQUM3Qyw4Q0FBOEM7QUFDOUMsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBLHVFQUF1RTtBQUN2RTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLDZDQUE2QztBQUM3Qyx5REFBeUQ7QUFDekQsNkNBQTZDOztBQUU3QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWLG1DQUFtQztBQUNuQztBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw2Q0FBNkM7QUFDN0MsOENBQThDO0FBQzlDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBLGdFQUFnRSxpQ0FBaUM7QUFDakc7QUFDQTtBQUNBLG1FQUFtRSwyQ0FBMkM7QUFDOUc7QUFDQTtBQUNBLDREQUE0RCxpQ0FBaUM7QUFDN0Y7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7O1NDcFNBO1NBQ0E7O1NBRUE7U0FDQTtTQUNBO1NBQ0E7U0FDQTtTQUNBO1NBQ0E7U0FDQTtTQUNBO1NBQ0E7U0FDQTtTQUNBO1NBQ0E7O1NBRUE7U0FDQTs7U0FFQTtTQUNBO1NBQ0E7O1NBRUE7U0FDQTs7Ozs7VUN6QkE7VUFDQTtVQUNBO1VBQ0E7VUFDQTtVQUNBLGlDQUFpQyxXQUFXO1VBQzVDO1VBQ0E7Ozs7O1VDUEE7VUFDQTtVQUNBO1VBQ0E7VUFDQSx5Q0FBeUMsd0NBQXdDO1VBQ2pGO1VBQ0E7VUFDQTs7Ozs7VUNQQTs7Ozs7VUNBQTtVQUNBO1VBQ0E7VUFDQSx1REFBdUQsaUJBQWlCO1VBQ3hFO1VBQ0EsZ0RBQWdELGFBQWE7VUFDN0Q7Ozs7O1VDTkE7O1VBRUE7VUFDQTtVQUNBO1VBQ0E7VUFDQTtVQUNBOztVQUVBOztVQUVBOztVQUVBOztVQUVBOztVQUVBOztVQUVBOztVQUVBOzs7OztVQ3JCQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDQTREO0FBQ007QUFDcUI7QUFDdEM7QUFDSDtBQUNDO0FBQ3NCOztBQUVyRTtBQUNBO0FBQ0EsV0FBVywrRUFBK0U7QUFDMUYsYUFBYSxRQUFRO0FBQ3JCLFlBQVksT0FBTztBQUNuQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUksc0VBQWlCO0FBQ3JCLElBQUksMEVBQW1CO0FBQ3ZCLElBQUksd0ZBQTBCO0FBQzlCLElBQUksMkVBQWU7QUFDbkI7QUFDQTs7QUFFQSxjQUFjLHdEQUFPO0FBQ3JCLGFBQWEsa0VBQU07QUFDbkIsWUFBWSxnRUFBSztBQUNqQixZQUFZLDZEQUFLO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxpRUFBZSxHQUFHLEUiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9AYXBwaXVzLWZyL2FweC8uL21vZHVsZXMvZGlhbG9nL2Nzcy9kaWFsb2cuY3NzIiwid2VicGFjazovL0BhcHBpdXMtZnIvYXB4Ly4vbW9kdWxlcy9zY3JvbGxhYmxlVGFibGUvY3NzL3Njcm9sbGFibGVUYWJsZS5jc3MiLCJ3ZWJwYWNrOi8vQGFwcGl1cy1mci9hcHgvLi9tb2R1bGVzL3RvYXN0L2Nzcy90b2FzdC5jc3MiLCJ3ZWJwYWNrOi8vQGFwcGl1cy1mci9hcHgvLi9tb2R1bGVzL3RyaXN0YXRlL2Nzcy90cmlzdGF0ZS5jc3MiLCJ3ZWJwYWNrOi8vQGFwcGl1cy1mci9hcHgvLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L3J1bnRpbWUvYXBpLmpzIiwid2VicGFjazovL0BhcHBpdXMtZnIvYXB4Ly4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL2dldFVybC5qcyIsIndlYnBhY2s6Ly9AYXBwaXVzLWZyL2FweC8uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9zb3VyY2VNYXBzLmpzIiwid2VicGFjazovL0BhcHBpdXMtZnIvYXB4Ly4vbW9kdWxlcy9kaWFsb2cvaHRtbC9kaWFsb2cuaHRtbCIsIndlYnBhY2s6Ly9AYXBwaXVzLWZyL2FweC8uL21vZHVsZXMvZGlhbG9nL2Nzcy9kaWFsb2cuY3NzP2E1NjciLCJ3ZWJwYWNrOi8vQGFwcGl1cy1mci9hcHgvLi9tb2R1bGVzL3Njcm9sbGFibGVUYWJsZS9jc3Mvc2Nyb2xsYWJsZVRhYmxlLmNzcz85MmZkIiwid2VicGFjazovL0BhcHBpdXMtZnIvYXB4Ly4vbW9kdWxlcy90b2FzdC9jc3MvdG9hc3QuY3NzPzhhNDgiLCJ3ZWJwYWNrOi8vQGFwcGl1cy1mci9hcHgvLi9tb2R1bGVzL3RyaXN0YXRlL2Nzcy90cmlzdGF0ZS5jc3M/YTA5NCIsIndlYnBhY2s6Ly9AYXBwaXVzLWZyL2FweC8uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luamVjdFN0eWxlc0ludG9TdHlsZVRhZy5qcyIsIndlYnBhY2s6Ly9AYXBwaXVzLWZyL2FweC8uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luc2VydEJ5U2VsZWN0b3IuanMiLCJ3ZWJwYWNrOi8vQGFwcGl1cy1mci9hcHgvLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbnNlcnRTdHlsZUVsZW1lbnQuanMiLCJ3ZWJwYWNrOi8vQGFwcGl1cy1mci9hcHgvLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9zZXRBdHRyaWJ1dGVzV2l0aG91dEF0dHJpYnV0ZXMuanMiLCJ3ZWJwYWNrOi8vQGFwcGl1cy1mci9hcHgvLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9zdHlsZURvbUFQSS5qcyIsIndlYnBhY2s6Ly9AYXBwaXVzLWZyL2FweC8uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL3N0eWxlVGFnVHJhbnNmb3JtLmpzIiwid2VicGFjazovL0BhcHBpdXMtZnIvYXB4Ly4vbW9kdWxlcy9jb21tb24ubWpzIiwid2VicGFjazovL0BhcHBpdXMtZnIvYXB4Ly4vbW9kdWxlcy9kaWFsb2cvZGlhbG9nLm1qcyIsIndlYnBhY2s6Ly9AYXBwaXVzLWZyL2FweC8uL21vZHVsZXMvbGlzdGVuL2xpc3Rlbi5tanMiLCJ3ZWJwYWNrOi8vQGFwcGl1cy1mci9hcHgvLi9tb2R1bGVzL3Njcm9sbGFibGVUYWJsZS9zY3JvbGxhYmxlVGFibGUubWpzIiwid2VicGFjazovL0BhcHBpdXMtZnIvYXB4Ly4vbW9kdWxlcy90b2FzdC90b2FzdC5tanMiLCJ3ZWJwYWNrOi8vQGFwcGl1cy1mci9hcHgvLi9tb2R1bGVzL3Rvb2xzL2V4cG9ydHMubWpzIiwid2VicGFjazovL0BhcHBpdXMtZnIvYXB4Ly4vbW9kdWxlcy90b29scy9mb3JtLXBhY2tlci9hdWdtZW50LWFweC5tanMiLCJ3ZWJwYWNrOi8vQGFwcGl1cy1mci9hcHgvLi9tb2R1bGVzL3Rvb2xzL2Zvcm0tcGFja2VyL3BhY2tUb0pzb24ubWpzIiwid2VicGFjazovL0BhcHBpdXMtZnIvYXB4Ly4vbW9kdWxlcy90cmlzdGF0ZS90cmlzdGF0ZS5tanMiLCJ3ZWJwYWNrOi8vQGFwcGl1cy1mci9hcHgvd2VicGFjay9ib290c3RyYXAiLCJ3ZWJwYWNrOi8vQGFwcGl1cy1mci9hcHgvd2VicGFjay9ydW50aW1lL2NvbXBhdCBnZXQgZGVmYXVsdCBleHBvcnQiLCJ3ZWJwYWNrOi8vQGFwcGl1cy1mci9hcHgvd2VicGFjay9ydW50aW1lL2RlZmluZSBwcm9wZXJ0eSBnZXR0ZXJzIiwid2VicGFjazovL0BhcHBpdXMtZnIvYXB4L3dlYnBhY2svcnVudGltZS9oYXNPd25Qcm9wZXJ0eSBzaG9ydGhhbmQiLCJ3ZWJwYWNrOi8vQGFwcGl1cy1mci9hcHgvd2VicGFjay9ydW50aW1lL21ha2UgbmFtZXNwYWNlIG9iamVjdCIsIndlYnBhY2s6Ly9AYXBwaXVzLWZyL2FweC93ZWJwYWNrL3J1bnRpbWUvanNvbnAgY2h1bmsgbG9hZGluZyIsIndlYnBhY2s6Ly9AYXBwaXVzLWZyL2FweC93ZWJwYWNrL3J1bnRpbWUvbm9uY2UiLCJ3ZWJwYWNrOi8vQGFwcGl1cy1mci9hcHgvLi9BUFgubWpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIEltcG9ydHNcbmltcG9ydCBfX19DU1NfTE9BREVSX0FQSV9TT1VSQ0VNQVBfSU1QT1JUX19fIGZyb20gXCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L3J1bnRpbWUvc291cmNlTWFwcy5qc1wiO1xuaW1wb3J0IF9fX0NTU19MT0FERVJfQVBJX0lNUE9SVF9fXyBmcm9tIFwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL2FwaS5qc1wiO1xudmFyIF9fX0NTU19MT0FERVJfRVhQT1JUX19fID0gX19fQ1NTX0xPQURFUl9BUElfSU1QT1JUX19fKF9fX0NTU19MT0FERVJfQVBJX1NPVVJDRU1BUF9JTVBPUlRfX18pO1xuLy8gTW9kdWxlXG5fX19DU1NfTE9BREVSX0VYUE9SVF9fXy5wdXNoKFttb2R1bGUuaWQsIGAvKiBEaWFsb2cgc3R5bGluZyAqL1xyXG4uQVBYLWRpYWxvZyB7XHJcbiAgICBkaXNwbGF5OiBub25lO1xyXG4gICAgcG9zaXRpb246IGZpeGVkO1xyXG4gICAgei1pbmRleDogMTAwMjtcclxuICAgIGxlZnQ6IDA7XHJcbiAgICB0b3A6IDA7XHJcbiAgICB3aWR0aDogMTAwJTtcclxuICAgIGhlaWdodDogMTAwJTtcclxuICAgIG92ZXJmbG93OiBhdXRvO1xyXG4gICAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgwLCAwLCAwLCAwLjQpO1xyXG4gICAgLyogRGltbWVkIGJhY2tncm91bmQgZm9yIGZvY3VzIG9uIGRpYWxvZyAqL1xyXG59XHJcblxyXG4uQVBYLWRpYWxvZy1jb250ZW50IHtcclxuICAgIGJhY2tncm91bmQtY29sb3I6ICNmZWZlZmU7XHJcbiAgICBwYWRkaW5nOiA0MHB4O1xyXG4gICAgYm9yZGVyOiBub25lO1xyXG4gICAgd2lkdGg6IGF1dG87XHJcbiAgICBtaW4td2lkdGg6IDMwMHB4O1xyXG4gICAgbWF4LXdpZHRoOiA4MCU7XHJcbiAgICBtYXJnaW46IGF1dG87XHJcbiAgICBib3JkZXItcmFkaXVzOiA4cHg7XHJcbiAgICBib3gtc2hhZG93OiAwcHggNnB4IDIwcHggcmdiYSgwLCAwLCAwLCAwLjEpO1xyXG4gICAgZm9udC1mYW1pbHk6ICdIZWx2ZXRpY2EgTmV1ZScsIEFyaWFsLCBzYW5zLXNlcmlmO1xyXG59XHJcblxyXG5oMi5BUFgtZGlhbG9nLXRpdGxle1xyXG4gICAgbWFyZ2luLXRvcDowO1xyXG59XHJcblxyXG4uQVBYLWNsb3NlLWRpYWxvZyB7XHJcbiAgICBjb2xvcjogI2FhYTtcclxuICAgIGZsb2F0OiByaWdodDtcclxuICAgIGZvbnQtc2l6ZTogMjRweDtcclxuICAgIG1hcmdpbi10b3A6IC0xMHB4O1xyXG4gICAgLyogQWRqdXN0IHBvc2l0aW9uaW5nICovXHJcbiAgICBtYXJnaW4tcmlnaHQ6IC0xMHB4O1xyXG59XHJcblxyXG4uQVBYLWNsb3NlLWRpYWxvZzpob3ZlcixcclxuLkFQWC1jbG9zZS1kaWFsb2c6Zm9jdXMge1xyXG4gICAgY29sb3I6ICMzMzM7XHJcbiAgICAvKiBEYXJrZXIgY29sb3Igb24gaG92ZXIvZm9jdXMgKi9cclxuICAgIGN1cnNvcjogcG9pbnRlcjtcclxufVxyXG5cclxuLyogSW5wdXQgZmllbGRzIHN0eWxpbmcgKi9cclxuLkFQWC1kaWFsb2ctY29udGVudCBpbnB1dFt0eXBlPVwidGV4dFwiXSxcclxuLkFQWC1kaWFsb2ctY29udGVudCBpbnB1dFt0eXBlPVwibnVtYmVyXCJdLFxyXG4uQVBYLWRpYWxvZy1jb250ZW50IGlucHV0W3R5cGU9XCJkYXRlXCJdLFxyXG4uQVBYLWRpYWxvZy1jb250ZW50IGlucHV0W3R5cGU9XCJkYXRldGltZS1sb2NhbFwiXSB7XHJcbiAgICB3aWR0aDogMTAwJTtcclxuICAgIHBhZGRpbmc6IDEwcHg7XHJcbiAgICBtYXJnaW4tYm90dG9tOiAyMHB4O1xyXG4gICAgYm9yZGVyOiAxcHggc29saWQgI2NjYztcclxuICAgIGJvcmRlci1yYWRpdXM6IDRweDtcclxuICAgIGZvbnQtZmFtaWx5OiAnSGVsdmV0aWNhIE5ldWUnLCBBcmlhbCwgc2Fucy1zZXJpZjtcclxuICAgIGZvbnQtc2l6ZTogMTZweDtcclxuICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XHJcbiAgICB0cmFuc2l0aW9uOiBib3JkZXItY29sb3IgMC4zcztcclxufVxyXG5cclxuLkFQWC1kaWFsb2ctY29udGVudCBpbnB1dFt0eXBlPVwidGV4dFwiXTpmb2N1cyxcclxuLkFQWC1kaWFsb2ctY29udGVudCBpbnB1dFt0eXBlPVwibnVtYmVyXCJdOmZvY3VzLFxyXG4uQVBYLWRpYWxvZy1jb250ZW50IGlucHV0W3R5cGU9XCJkYXRlXCJdOmZvY3VzLFxyXG4uQVBYLWRpYWxvZy1jb250ZW50IGlucHV0W3R5cGU9XCJkYXRldGltZS1sb2NhbFwiXTpmb2N1cyB7XHJcbiAgICBib3JkZXItY29sb3I6ICMyQzNFNTA7XHJcbiAgICAvKiBEZWVwIEJsdWUgQ29sb3IgKi9cclxuICAgIG91dGxpbmU6IG5vbmU7XHJcbn1cclxuXHJcbi8qIEJ1dHRvbiBpbiB0aGUgZGlhbG9nICovXHJcbi5BUFgtZGlhbG9nLWJ1dHRvbi1jb250YWluZXIgYnV0dG9uIHtcclxuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcclxuICAgIGJhY2tncm91bmQtY29sb3I6ICMyQzNFNTA7XHJcbiAgICBjb2xvcjogI0VDRjBGMTtcclxuICAgIGJvcmRlcjogbm9uZTtcclxuICAgIHBhZGRpbmc6IDEwcHggMjBweDtcclxuICAgIGJvcmRlci1yYWRpdXM6IDVweDtcclxuICAgIGZvbnQtc2l6ZTogMTZweDtcclxuICAgIGN1cnNvcjogcG9pbnRlcjtcclxuICAgIHRyYW5zaXRpb246IGFsbCAwLjNzIGVhc2U7XHJcbiAgICBib3gtc2hhZG93OiAwIDJweCA0cHggcmdiYSgwLCAwLCAwLCAwLjEpO1xyXG59XHJcblxyXG4uQVBYLWRpYWxvZy1idXR0b24tY29udGFpbmVyIGJ1dHRvbjpob3ZlciB7XHJcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjMzQ0OTVFO1xyXG4gICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC0xcHgpO1xyXG4gICAgYm94LXNoYWRvdzogMCA0cHggOHB4IHJnYmEoMCwgMCwgMCwgMC4xNSk7XHJcbn1cclxuXHJcbi5BUFgtZGlhbG9nLWJ1dHRvbi1jb250YWluZXIge1xyXG4gICAgZGlzcGxheTogZmxleDtcclxuICAgIGdhcDogMTBweDtcclxuICAgIG1hcmdpbi10b3A6MWVtO1xyXG4gICAgLyogc3BhY2luZyBiZXR3ZWVuIGJ1dHRvbnMgKi9cclxufVxyXG5cclxuLyogTG9hZGluZyBpbmRpY2F0b3IgKi9cclxuLkFQWC1kaWFsb2ctbG9hZGluZy1pbmRpY2F0b3Ige1xyXG4gICAgZGlzcGxheTogZmxleDtcclxuICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xyXG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcclxuICAgIGhlaWdodDogMTAwcHg7XHJcbiAgICB3aWR0aDogMTAwJTtcclxufVxyXG5cclxuLkFQWC1kaWFsb2ctbG9hZGluZy1pbmRpY2F0b3I6OmJlZm9yZSB7XHJcbiAgICBjb250ZW50OiAnJztcclxuICAgIHdpZHRoOiA0MHB4O1xyXG4gICAgaGVpZ2h0OiA0MHB4O1xyXG4gICAgYm9yZGVyOiA0cHggc29saWQgI2YzZjNmMztcclxuICAgIGJvcmRlci10b3A6IDRweCBzb2xpZCAjMkMzRTUwO1xyXG4gICAgYm9yZGVyLXJhZGl1czogNTAlO1xyXG4gICAgYW5pbWF0aW9uOiBBUFgtZGlhbG9nLXNwaW4gMXMgbGluZWFyIGluZmluaXRlO1xyXG59XHJcblxyXG5Aa2V5ZnJhbWVzIEFQWC1kaWFsb2ctc3BpbiB7XHJcbiAgICAwJSB7IHRyYW5zZm9ybTogcm90YXRlKDBkZWcpOyB9XHJcbiAgICAxMDAlIHsgdHJhbnNmb3JtOiByb3RhdGUoMzYwZGVnKTsgfVxyXG59XHJcbi5BUFgtZGlhbG9nLWJ1dHRvbi1kaXNhYmxlZCB7XHJcbiAgICBvcGFjaXR5OiAwLjU7XHJcbiAgICBjdXJzb3I6IG5vdC1hbGxvd2VkICFpbXBvcnRhbnQ7XHJcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjOTVhNWE2ICFpbXBvcnRhbnQ7IC8qIEdyYXllZCBvdXQgY29sb3IgKi9cclxuICAgIGJveC1zaGFkb3c6IG5vbmUgIWltcG9ydGFudDtcclxuICAgIHRyYW5zaXRpb246IGFsbCAwLjJzIGVhc2U7XHJcbiAgICB0cmFuc2Zvcm06IG5vbmUgIWltcG9ydGFudDtcclxufVxyXG5cclxuLkFQWC1kaWFsb2ctYnV0dG9uLWRpc2FibGVkOmhvdmVyIHtcclxuICAgIGJhY2tncm91bmQtY29sb3I6ICM5NWE1YTYgIWltcG9ydGFudDsgLyogS2VlcCBncmF5IG9uIGhvdmVyICovXHJcbiAgICB0cmFuc2Zvcm06IG5vbmUgIWltcG9ydGFudDtcclxufVxyXG5cclxuLyogQWRkIGEgc3VidGxlIHN0cmlrZXRocm91Z2ggZWZmZWN0ICovXHJcbi5BUFgtZGlhbG9nLWJ1dHRvbi1kaXNhYmxlZDo6YWZ0ZXIge1xyXG4gICAgY29udGVudDogJyc7XHJcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XHJcbiAgICB0b3A6IDUwJTtcclxuICAgIGxlZnQ6IDA7XHJcbiAgICB3aWR0aDogMTAwJTtcclxuICAgIGhlaWdodDogMXB4O1xyXG4gICAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgwLCAwLCAwLCAwLjIpO1xyXG4gICAgdHJhbnNmb3JtOiByb3RhdGUoLTVkZWcpO1xyXG59YCwgXCJcIix7XCJ2ZXJzaW9uXCI6MyxcInNvdXJjZXNcIjpbXCJ3ZWJwYWNrOi8vLi9tb2R1bGVzL2RpYWxvZy9jc3MvZGlhbG9nLmNzc1wiXSxcIm5hbWVzXCI6W10sXCJtYXBwaW5nc1wiOlwiQUFBQSxtQkFBbUI7QUFDbkI7SUFDSSxhQUFhO0lBQ2IsZUFBZTtJQUNmLGFBQWE7SUFDYixPQUFPO0lBQ1AsTUFBTTtJQUNOLFdBQVc7SUFDWCxZQUFZO0lBQ1osY0FBYztJQUNkLG9DQUFvQztJQUNwQywwQ0FBMEM7QUFDOUM7O0FBRUE7SUFDSSx5QkFBeUI7SUFDekIsYUFBYTtJQUNiLFlBQVk7SUFDWixXQUFXO0lBQ1gsZ0JBQWdCO0lBQ2hCLGNBQWM7SUFDZCxZQUFZO0lBQ1osa0JBQWtCO0lBQ2xCLDJDQUEyQztJQUMzQyxnREFBZ0Q7QUFDcEQ7O0FBRUE7SUFDSSxZQUFZO0FBQ2hCOztBQUVBO0lBQ0ksV0FBVztJQUNYLFlBQVk7SUFDWixlQUFlO0lBQ2YsaUJBQWlCO0lBQ2pCLHVCQUF1QjtJQUN2QixtQkFBbUI7QUFDdkI7O0FBRUE7O0lBRUksV0FBVztJQUNYLGdDQUFnQztJQUNoQyxlQUFlO0FBQ25COztBQUVBLHlCQUF5QjtBQUN6Qjs7OztJQUlJLFdBQVc7SUFDWCxhQUFhO0lBQ2IsbUJBQW1CO0lBQ25CLHNCQUFzQjtJQUN0QixrQkFBa0I7SUFDbEIsZ0RBQWdEO0lBQ2hELGVBQWU7SUFDZixzQkFBc0I7SUFDdEIsNkJBQTZCO0FBQ2pDOztBQUVBOzs7O0lBSUkscUJBQXFCO0lBQ3JCLG9CQUFvQjtJQUNwQixhQUFhO0FBQ2pCOztBQUVBLHlCQUF5QjtBQUN6QjtJQUNJLGtCQUFrQjtJQUNsQix5QkFBeUI7SUFDekIsY0FBYztJQUNkLFlBQVk7SUFDWixrQkFBa0I7SUFDbEIsa0JBQWtCO0lBQ2xCLGVBQWU7SUFDZixlQUFlO0lBQ2YseUJBQXlCO0lBQ3pCLHdDQUF3QztBQUM1Qzs7QUFFQTtJQUNJLHlCQUF5QjtJQUN6QiwyQkFBMkI7SUFDM0IseUNBQXlDO0FBQzdDOztBQUVBO0lBQ0ksYUFBYTtJQUNiLFNBQVM7SUFDVCxjQUFjO0lBQ2QsNEJBQTRCO0FBQ2hDOztBQUVBLHNCQUFzQjtBQUN0QjtJQUNJLGFBQWE7SUFDYix1QkFBdUI7SUFDdkIsbUJBQW1CO0lBQ25CLGFBQWE7SUFDYixXQUFXO0FBQ2Y7O0FBRUE7SUFDSSxXQUFXO0lBQ1gsV0FBVztJQUNYLFlBQVk7SUFDWix5QkFBeUI7SUFDekIsNkJBQTZCO0lBQzdCLGtCQUFrQjtJQUNsQiw2Q0FBNkM7QUFDakQ7O0FBRUE7SUFDSSxLQUFLLHVCQUF1QixFQUFFO0lBQzlCLE9BQU8seUJBQXlCLEVBQUU7QUFDdEM7QUFDQTtJQUNJLFlBQVk7SUFDWiw4QkFBOEI7SUFDOUIsb0NBQW9DLEVBQUUscUJBQXFCO0lBQzNELDJCQUEyQjtJQUMzQix5QkFBeUI7SUFDekIsMEJBQTBCO0FBQzlCOztBQUVBO0lBQ0ksb0NBQW9DLEVBQUUsdUJBQXVCO0lBQzdELDBCQUEwQjtBQUM5Qjs7QUFFQSxzQ0FBc0M7QUFDdEM7SUFDSSxXQUFXO0lBQ1gsa0JBQWtCO0lBQ2xCLFFBQVE7SUFDUixPQUFPO0lBQ1AsV0FBVztJQUNYLFdBQVc7SUFDWCxvQ0FBb0M7SUFDcEMsd0JBQXdCO0FBQzVCXCIsXCJzb3VyY2VzQ29udGVudFwiOltcIi8qIERpYWxvZyBzdHlsaW5nICovXFxyXFxuLkFQWC1kaWFsb2cge1xcclxcbiAgICBkaXNwbGF5OiBub25lO1xcclxcbiAgICBwb3NpdGlvbjogZml4ZWQ7XFxyXFxuICAgIHotaW5kZXg6IDEwMDI7XFxyXFxuICAgIGxlZnQ6IDA7XFxyXFxuICAgIHRvcDogMDtcXHJcXG4gICAgd2lkdGg6IDEwMCU7XFxyXFxuICAgIGhlaWdodDogMTAwJTtcXHJcXG4gICAgb3ZlcmZsb3c6IGF1dG87XFxyXFxuICAgIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMCwgMCwgMCwgMC40KTtcXHJcXG4gICAgLyogRGltbWVkIGJhY2tncm91bmQgZm9yIGZvY3VzIG9uIGRpYWxvZyAqL1xcclxcbn1cXHJcXG5cXHJcXG4uQVBYLWRpYWxvZy1jb250ZW50IHtcXHJcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2ZlZmVmZTtcXHJcXG4gICAgcGFkZGluZzogNDBweDtcXHJcXG4gICAgYm9yZGVyOiBub25lO1xcclxcbiAgICB3aWR0aDogYXV0bztcXHJcXG4gICAgbWluLXdpZHRoOiAzMDBweDtcXHJcXG4gICAgbWF4LXdpZHRoOiA4MCU7XFxyXFxuICAgIG1hcmdpbjogYXV0bztcXHJcXG4gICAgYm9yZGVyLXJhZGl1czogOHB4O1xcclxcbiAgICBib3gtc2hhZG93OiAwcHggNnB4IDIwcHggcmdiYSgwLCAwLCAwLCAwLjEpO1xcclxcbiAgICBmb250LWZhbWlseTogJ0hlbHZldGljYSBOZXVlJywgQXJpYWwsIHNhbnMtc2VyaWY7XFxyXFxufVxcclxcblxcclxcbmgyLkFQWC1kaWFsb2ctdGl0bGV7XFxyXFxuICAgIG1hcmdpbi10b3A6MDtcXHJcXG59XFxyXFxuXFxyXFxuLkFQWC1jbG9zZS1kaWFsb2cge1xcclxcbiAgICBjb2xvcjogI2FhYTtcXHJcXG4gICAgZmxvYXQ6IHJpZ2h0O1xcclxcbiAgICBmb250LXNpemU6IDI0cHg7XFxyXFxuICAgIG1hcmdpbi10b3A6IC0xMHB4O1xcclxcbiAgICAvKiBBZGp1c3QgcG9zaXRpb25pbmcgKi9cXHJcXG4gICAgbWFyZ2luLXJpZ2h0OiAtMTBweDtcXHJcXG59XFxyXFxuXFxyXFxuLkFQWC1jbG9zZS1kaWFsb2c6aG92ZXIsXFxyXFxuLkFQWC1jbG9zZS1kaWFsb2c6Zm9jdXMge1xcclxcbiAgICBjb2xvcjogIzMzMztcXHJcXG4gICAgLyogRGFya2VyIGNvbG9yIG9uIGhvdmVyL2ZvY3VzICovXFxyXFxuICAgIGN1cnNvcjogcG9pbnRlcjtcXHJcXG59XFxyXFxuXFxyXFxuLyogSW5wdXQgZmllbGRzIHN0eWxpbmcgKi9cXHJcXG4uQVBYLWRpYWxvZy1jb250ZW50IGlucHV0W3R5cGU9XFxcInRleHRcXFwiXSxcXHJcXG4uQVBYLWRpYWxvZy1jb250ZW50IGlucHV0W3R5cGU9XFxcIm51bWJlclxcXCJdLFxcclxcbi5BUFgtZGlhbG9nLWNvbnRlbnQgaW5wdXRbdHlwZT1cXFwiZGF0ZVxcXCJdLFxcclxcbi5BUFgtZGlhbG9nLWNvbnRlbnQgaW5wdXRbdHlwZT1cXFwiZGF0ZXRpbWUtbG9jYWxcXFwiXSB7XFxyXFxuICAgIHdpZHRoOiAxMDAlO1xcclxcbiAgICBwYWRkaW5nOiAxMHB4O1xcclxcbiAgICBtYXJnaW4tYm90dG9tOiAyMHB4O1xcclxcbiAgICBib3JkZXI6IDFweCBzb2xpZCAjY2NjO1xcclxcbiAgICBib3JkZXItcmFkaXVzOiA0cHg7XFxyXFxuICAgIGZvbnQtZmFtaWx5OiAnSGVsdmV0aWNhIE5ldWUnLCBBcmlhbCwgc2Fucy1zZXJpZjtcXHJcXG4gICAgZm9udC1zaXplOiAxNnB4O1xcclxcbiAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xcclxcbiAgICB0cmFuc2l0aW9uOiBib3JkZXItY29sb3IgMC4zcztcXHJcXG59XFxyXFxuXFxyXFxuLkFQWC1kaWFsb2ctY29udGVudCBpbnB1dFt0eXBlPVxcXCJ0ZXh0XFxcIl06Zm9jdXMsXFxyXFxuLkFQWC1kaWFsb2ctY29udGVudCBpbnB1dFt0eXBlPVxcXCJudW1iZXJcXFwiXTpmb2N1cyxcXHJcXG4uQVBYLWRpYWxvZy1jb250ZW50IGlucHV0W3R5cGU9XFxcImRhdGVcXFwiXTpmb2N1cyxcXHJcXG4uQVBYLWRpYWxvZy1jb250ZW50IGlucHV0W3R5cGU9XFxcImRhdGV0aW1lLWxvY2FsXFxcIl06Zm9jdXMge1xcclxcbiAgICBib3JkZXItY29sb3I6ICMyQzNFNTA7XFxyXFxuICAgIC8qIERlZXAgQmx1ZSBDb2xvciAqL1xcclxcbiAgICBvdXRsaW5lOiBub25lO1xcclxcbn1cXHJcXG5cXHJcXG4vKiBCdXR0b24gaW4gdGhlIGRpYWxvZyAqL1xcclxcbi5BUFgtZGlhbG9nLWJ1dHRvbi1jb250YWluZXIgYnV0dG9uIHtcXHJcXG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xcclxcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjMkMzRTUwO1xcclxcbiAgICBjb2xvcjogI0VDRjBGMTtcXHJcXG4gICAgYm9yZGVyOiBub25lO1xcclxcbiAgICBwYWRkaW5nOiAxMHB4IDIwcHg7XFxyXFxuICAgIGJvcmRlci1yYWRpdXM6IDVweDtcXHJcXG4gICAgZm9udC1zaXplOiAxNnB4O1xcclxcbiAgICBjdXJzb3I6IHBvaW50ZXI7XFxyXFxuICAgIHRyYW5zaXRpb246IGFsbCAwLjNzIGVhc2U7XFxyXFxuICAgIGJveC1zaGFkb3c6IDAgMnB4IDRweCByZ2JhKDAsIDAsIDAsIDAuMSk7XFxyXFxufVxcclxcblxcclxcbi5BUFgtZGlhbG9nLWJ1dHRvbi1jb250YWluZXIgYnV0dG9uOmhvdmVyIHtcXHJcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogIzM0NDk1RTtcXHJcXG4gICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC0xcHgpO1xcclxcbiAgICBib3gtc2hhZG93OiAwIDRweCA4cHggcmdiYSgwLCAwLCAwLCAwLjE1KTtcXHJcXG59XFxyXFxuXFxyXFxuLkFQWC1kaWFsb2ctYnV0dG9uLWNvbnRhaW5lciB7XFxyXFxuICAgIGRpc3BsYXk6IGZsZXg7XFxyXFxuICAgIGdhcDogMTBweDtcXHJcXG4gICAgbWFyZ2luLXRvcDoxZW07XFxyXFxuICAgIC8qIHNwYWNpbmcgYmV0d2VlbiBidXR0b25zICovXFxyXFxufVxcclxcblxcclxcbi8qIExvYWRpbmcgaW5kaWNhdG9yICovXFxyXFxuLkFQWC1kaWFsb2ctbG9hZGluZy1pbmRpY2F0b3Ige1xcclxcbiAgICBkaXNwbGF5OiBmbGV4O1xcclxcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcXHJcXG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcXHJcXG4gICAgaGVpZ2h0OiAxMDBweDtcXHJcXG4gICAgd2lkdGg6IDEwMCU7XFxyXFxufVxcclxcblxcclxcbi5BUFgtZGlhbG9nLWxvYWRpbmctaW5kaWNhdG9yOjpiZWZvcmUge1xcclxcbiAgICBjb250ZW50OiAnJztcXHJcXG4gICAgd2lkdGg6IDQwcHg7XFxyXFxuICAgIGhlaWdodDogNDBweDtcXHJcXG4gICAgYm9yZGVyOiA0cHggc29saWQgI2YzZjNmMztcXHJcXG4gICAgYm9yZGVyLXRvcDogNHB4IHNvbGlkICMyQzNFNTA7XFxyXFxuICAgIGJvcmRlci1yYWRpdXM6IDUwJTtcXHJcXG4gICAgYW5pbWF0aW9uOiBBUFgtZGlhbG9nLXNwaW4gMXMgbGluZWFyIGluZmluaXRlO1xcclxcbn1cXHJcXG5cXHJcXG5Aa2V5ZnJhbWVzIEFQWC1kaWFsb2ctc3BpbiB7XFxyXFxuICAgIDAlIHsgdHJhbnNmb3JtOiByb3RhdGUoMGRlZyk7IH1cXHJcXG4gICAgMTAwJSB7IHRyYW5zZm9ybTogcm90YXRlKDM2MGRlZyk7IH1cXHJcXG59XFxyXFxuLkFQWC1kaWFsb2ctYnV0dG9uLWRpc2FibGVkIHtcXHJcXG4gICAgb3BhY2l0eTogMC41O1xcclxcbiAgICBjdXJzb3I6IG5vdC1hbGxvd2VkICFpbXBvcnRhbnQ7XFxyXFxuICAgIGJhY2tncm91bmQtY29sb3I6ICM5NWE1YTYgIWltcG9ydGFudDsgLyogR3JheWVkIG91dCBjb2xvciAqL1xcclxcbiAgICBib3gtc2hhZG93OiBub25lICFpbXBvcnRhbnQ7XFxyXFxuICAgIHRyYW5zaXRpb246IGFsbCAwLjJzIGVhc2U7XFxyXFxuICAgIHRyYW5zZm9ybTogbm9uZSAhaW1wb3J0YW50O1xcclxcbn1cXHJcXG5cXHJcXG4uQVBYLWRpYWxvZy1idXR0b24tZGlzYWJsZWQ6aG92ZXIge1xcclxcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjOTVhNWE2ICFpbXBvcnRhbnQ7IC8qIEtlZXAgZ3JheSBvbiBob3ZlciAqL1xcclxcbiAgICB0cmFuc2Zvcm06IG5vbmUgIWltcG9ydGFudDtcXHJcXG59XFxyXFxuXFxyXFxuLyogQWRkIGEgc3VidGxlIHN0cmlrZXRocm91Z2ggZWZmZWN0ICovXFxyXFxuLkFQWC1kaWFsb2ctYnV0dG9uLWRpc2FibGVkOjphZnRlciB7XFxyXFxuICAgIGNvbnRlbnQ6ICcnO1xcclxcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XFxyXFxuICAgIHRvcDogNTAlO1xcclxcbiAgICBsZWZ0OiAwO1xcclxcbiAgICB3aWR0aDogMTAwJTtcXHJcXG4gICAgaGVpZ2h0OiAxcHg7XFxyXFxuICAgIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMCwgMCwgMCwgMC4yKTtcXHJcXG4gICAgdHJhbnNmb3JtOiByb3RhdGUoLTVkZWcpO1xcclxcbn1cIl0sXCJzb3VyY2VSb290XCI6XCJcIn1dKTtcbi8vIEV4cG9ydHNcbmV4cG9ydCBkZWZhdWx0IF9fX0NTU19MT0FERVJfRVhQT1JUX19fO1xuIiwiLy8gSW1wb3J0c1xuaW1wb3J0IF9fX0NTU19MT0FERVJfQVBJX1NPVVJDRU1BUF9JTVBPUlRfX18gZnJvbSBcIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9zb3VyY2VNYXBzLmpzXCI7XG5pbXBvcnQgX19fQ1NTX0xPQURFUl9BUElfSU1QT1JUX19fIGZyb20gXCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L3J1bnRpbWUvYXBpLmpzXCI7XG52YXIgX19fQ1NTX0xPQURFUl9FWFBPUlRfX18gPSBfX19DU1NfTE9BREVSX0FQSV9JTVBPUlRfX18oX19fQ1NTX0xPQURFUl9BUElfU09VUkNFTUFQX0lNUE9SVF9fXyk7XG4vLyBNb2R1bGVcbl9fX0NTU19MT0FERVJfRVhQT1JUX19fLnB1c2goW21vZHVsZS5pZCwgYC8qIEFQWCBTY3JvbGxhYmxlIFRhYmxlOiBzY3JvbGxhYmxlIHRib2R5IHdpdGggZml4ZWQgdGhlYWQvdGZvb3QgYW5kIGFsaWduZWQgY29sdW1ucyAoQ1NTIEdyaWQgKyBzdWJncmlkKSAqL1xyXG5cclxuLmFweC1zY3JvbGxhYmxlLXRhYmxlIHtcclxuICAgIGRpc3BsYXk6IGdyaWQ7XHJcbiAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IHJlcGVhdCh2YXIoLS1hcHgtc2Nyb2xsYWJsZS1jb2xzLCAzKSwgbWlubWF4KDAsIDFmcikpO1xyXG4gICAgZ3JpZC10ZW1wbGF0ZS1yb3dzOiBhdXRvIGZpdC1jb250ZW50KHZhcigtLWFweC1zY3JvbGxhYmxlLWJvZHktbWF4LWhlaWdodCwgMjAwcHgpKSBhdXRvO1xyXG4gICAgd2lkdGg6IDEwMCU7XHJcbn1cclxuXHJcbi8qIFRhYmxlIHdpdGggbm8gdGZvb3Q6IHRoZWFkICsgdGJvZHkgb25seSAqL1xyXG4uYXB4LXNjcm9sbGFibGUtdGFibGU6bm90KC5hcHgtc2Nyb2xsYWJsZS10YWJsZS0taGFzLXRmb290KSB7XHJcbiAgICBncmlkLXRlbXBsYXRlLXJvd3M6IGF1dG8gZml0LWNvbnRlbnQodmFyKC0tYXB4LXNjcm9sbGFibGUtYm9keS1tYXgtaGVpZ2h0LCAyMDBweCkpO1xyXG59XHJcblxyXG4vKiBUYWJsZSB3aXRoIG5vIHRoZWFkOiB0Ym9keSArIHRmb290IG9ubHkgKi9cclxuLmFweC1zY3JvbGxhYmxlLXRhYmxlLmFweC1zY3JvbGxhYmxlLXRhYmxlLS1uby10aGVhZCB7XHJcbiAgICBncmlkLXRlbXBsYXRlLXJvd3M6IGZpdC1jb250ZW50KHZhcigtLWFweC1zY3JvbGxhYmxlLWJvZHktbWF4LWhlaWdodCwgMjAwcHgpKSBhdXRvO1xyXG59XHJcblxyXG4vKiBUYWJsZSB3aXRoIG5laXRoZXIgdGhlYWQgbm9yIHRmb290OiB0Ym9keSBvbmx5ICovXHJcbi5hcHgtc2Nyb2xsYWJsZS10YWJsZS5hcHgtc2Nyb2xsYWJsZS10YWJsZS0tbm8tdGhlYWQ6bm90KC5hcHgtc2Nyb2xsYWJsZS10YWJsZS0taGFzLXRmb290KSB7XHJcbiAgICBncmlkLXRlbXBsYXRlLXJvd3M6IGZpdC1jb250ZW50KHZhcigtLWFweC1zY3JvbGxhYmxlLWJvZHktbWF4LWhlaWdodCwgMjAwcHgpKTtcclxufVxyXG5cclxuLmFweC1zY3JvbGxhYmxlLXRhYmxlID4gdGhlYWQsXHJcbi5hcHgtc2Nyb2xsYWJsZS10YWJsZSA+IHRib2R5LFxyXG4uYXB4LXNjcm9sbGFibGUtdGFibGUgPiB0Zm9vdCB7XHJcbiAgICBkaXNwbGF5OiBncmlkO1xyXG4gICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiBzdWJncmlkO1xyXG4gICAgZ3JpZC1jb2x1bW46IDEgLyAtMTtcclxuICAgIGdyaWQtdGVtcGxhdGUtcm93czogcmVwZWF0KHZhcigtLWFweC1zY3JvbGxhYmxlLXRoZWFkLXJvd3MsIDEpLCBhdXRvKTtcclxuICAgIG1pbi1oZWlnaHQ6IDA7XHJcbn1cclxuXHJcbi5hcHgtc2Nyb2xsYWJsZS10YWJsZSA+IHRoZWFkIHtcclxuICAgIGdyaWQtdGVtcGxhdGUtcm93czogcmVwZWF0KHZhcigtLWFweC1zY3JvbGxhYmxlLXRoZWFkLXJvd3MsIDEpLCBhdXRvKTtcclxufVxyXG5cclxuLmFweC1zY3JvbGxhYmxlLXRhYmxlID4gdGJvZHkge1xyXG4gICAgZ3JpZC10ZW1wbGF0ZS1yb3dzOiByZXBlYXQodmFyKC0tYXB4LXNjcm9sbGFibGUtdGJvZHktcm93cywgMSksIGF1dG8pO1xyXG4gICAgb3ZlcmZsb3c6IGF1dG87XHJcbiAgICAvKiBSZXNlcnZlIHNwYWNlIGZvciB0aGUgdmVydGljYWwgc2Nyb2xsYmFyIHNvIGl0IGRvZXNuJ3Qgc2hyaW5rIGNvbnRlbnQgd2lkdGggYW5kIHRyaWdnZXIgYSBob3Jpem9udGFsIHNjcm9sbGJhciAqL1xyXG4gICAgc2Nyb2xsYmFyLWd1dHRlcjogc3RhYmxlO1xyXG59XHJcblxyXG4uYXB4LXNjcm9sbGFibGUtdGFibGUgPiB0Zm9vdCB7XHJcbiAgICBncmlkLXRlbXBsYXRlLXJvd3M6IHJlcGVhdCh2YXIoLS1hcHgtc2Nyb2xsYWJsZS10Zm9vdC1yb3dzLCAxKSwgYXV0byk7XHJcbn1cclxuXHJcbi5hcHgtc2Nyb2xsYWJsZS10YWJsZSA+IHRoZWFkID4gdHIsXHJcbi5hcHgtc2Nyb2xsYWJsZS10YWJsZSA+IHRib2R5ID4gdHIsXHJcbi5hcHgtc2Nyb2xsYWJsZS10YWJsZSA+IHRmb290ID4gdHIge1xyXG4gICAgZGlzcGxheTogY29udGVudHM7XHJcbn1cclxuXHJcbi5hcHgtc2Nyb2xsYWJsZS10YWJsZSB0aCxcclxuLmFweC1zY3JvbGxhYmxlLXRhYmxlIHRkIHtcclxuICAgIC8qIEdyaWQgcGxhY2VtZW50IHNldCBieSBKUyAoZ3JpZC1yb3csIGdyaWQtY29sdW1uKSBmb3IgY29sc3Bhbi9yb3dzcGFuICovXHJcbiAgICBtaW4td2lkdGg6IDA7XHJcbn1cclxuYCwgXCJcIix7XCJ2ZXJzaW9uXCI6MyxcInNvdXJjZXNcIjpbXCJ3ZWJwYWNrOi8vLi9tb2R1bGVzL3Njcm9sbGFibGVUYWJsZS9jc3Mvc2Nyb2xsYWJsZVRhYmxlLmNzc1wiXSxcIm5hbWVzXCI6W10sXCJtYXBwaW5nc1wiOlwiQUFBQSwyR0FBMkc7O0FBRTNHO0lBQ0ksYUFBYTtJQUNiLDRFQUE0RTtJQUM1RSx1RkFBdUY7SUFDdkYsV0FBVztBQUNmOztBQUVBLDRDQUE0QztBQUM1QztJQUNJLGtGQUFrRjtBQUN0Rjs7QUFFQSw0Q0FBNEM7QUFDNUM7SUFDSSxrRkFBa0Y7QUFDdEY7O0FBRUEsbURBQW1EO0FBQ25EO0lBQ0ksNkVBQTZFO0FBQ2pGOztBQUVBOzs7SUFHSSxhQUFhO0lBQ2IsOEJBQThCO0lBQzlCLG1CQUFtQjtJQUNuQixxRUFBcUU7SUFDckUsYUFBYTtBQUNqQjs7QUFFQTtJQUNJLHFFQUFxRTtBQUN6RTs7QUFFQTtJQUNJLHFFQUFxRTtJQUNyRSxjQUFjO0lBQ2QsbUhBQW1IO0lBQ25ILHdCQUF3QjtBQUM1Qjs7QUFFQTtJQUNJLHFFQUFxRTtBQUN6RTs7QUFFQTs7O0lBR0ksaUJBQWlCO0FBQ3JCOztBQUVBOztJQUVJLHlFQUF5RTtJQUN6RSxZQUFZO0FBQ2hCXCIsXCJzb3VyY2VzQ29udGVudFwiOltcIi8qIEFQWCBTY3JvbGxhYmxlIFRhYmxlOiBzY3JvbGxhYmxlIHRib2R5IHdpdGggZml4ZWQgdGhlYWQvdGZvb3QgYW5kIGFsaWduZWQgY29sdW1ucyAoQ1NTIEdyaWQgKyBzdWJncmlkKSAqL1xcclxcblxcclxcbi5hcHgtc2Nyb2xsYWJsZS10YWJsZSB7XFxyXFxuICAgIGRpc3BsYXk6IGdyaWQ7XFxyXFxuICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogcmVwZWF0KHZhcigtLWFweC1zY3JvbGxhYmxlLWNvbHMsIDMpLCBtaW5tYXgoMCwgMWZyKSk7XFxyXFxuICAgIGdyaWQtdGVtcGxhdGUtcm93czogYXV0byBmaXQtY29udGVudCh2YXIoLS1hcHgtc2Nyb2xsYWJsZS1ib2R5LW1heC1oZWlnaHQsIDIwMHB4KSkgYXV0bztcXHJcXG4gICAgd2lkdGg6IDEwMCU7XFxyXFxufVxcclxcblxcclxcbi8qIFRhYmxlIHdpdGggbm8gdGZvb3Q6IHRoZWFkICsgdGJvZHkgb25seSAqL1xcclxcbi5hcHgtc2Nyb2xsYWJsZS10YWJsZTpub3QoLmFweC1zY3JvbGxhYmxlLXRhYmxlLS1oYXMtdGZvb3QpIHtcXHJcXG4gICAgZ3JpZC10ZW1wbGF0ZS1yb3dzOiBhdXRvIGZpdC1jb250ZW50KHZhcigtLWFweC1zY3JvbGxhYmxlLWJvZHktbWF4LWhlaWdodCwgMjAwcHgpKTtcXHJcXG59XFxyXFxuXFxyXFxuLyogVGFibGUgd2l0aCBubyB0aGVhZDogdGJvZHkgKyB0Zm9vdCBvbmx5ICovXFxyXFxuLmFweC1zY3JvbGxhYmxlLXRhYmxlLmFweC1zY3JvbGxhYmxlLXRhYmxlLS1uby10aGVhZCB7XFxyXFxuICAgIGdyaWQtdGVtcGxhdGUtcm93czogZml0LWNvbnRlbnQodmFyKC0tYXB4LXNjcm9sbGFibGUtYm9keS1tYXgtaGVpZ2h0LCAyMDBweCkpIGF1dG87XFxyXFxufVxcclxcblxcclxcbi8qIFRhYmxlIHdpdGggbmVpdGhlciB0aGVhZCBub3IgdGZvb3Q6IHRib2R5IG9ubHkgKi9cXHJcXG4uYXB4LXNjcm9sbGFibGUtdGFibGUuYXB4LXNjcm9sbGFibGUtdGFibGUtLW5vLXRoZWFkOm5vdCguYXB4LXNjcm9sbGFibGUtdGFibGUtLWhhcy10Zm9vdCkge1xcclxcbiAgICBncmlkLXRlbXBsYXRlLXJvd3M6IGZpdC1jb250ZW50KHZhcigtLWFweC1zY3JvbGxhYmxlLWJvZHktbWF4LWhlaWdodCwgMjAwcHgpKTtcXHJcXG59XFxyXFxuXFxyXFxuLmFweC1zY3JvbGxhYmxlLXRhYmxlID4gdGhlYWQsXFxyXFxuLmFweC1zY3JvbGxhYmxlLXRhYmxlID4gdGJvZHksXFxyXFxuLmFweC1zY3JvbGxhYmxlLXRhYmxlID4gdGZvb3Qge1xcclxcbiAgICBkaXNwbGF5OiBncmlkO1xcclxcbiAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IHN1YmdyaWQ7XFxyXFxuICAgIGdyaWQtY29sdW1uOiAxIC8gLTE7XFxyXFxuICAgIGdyaWQtdGVtcGxhdGUtcm93czogcmVwZWF0KHZhcigtLWFweC1zY3JvbGxhYmxlLXRoZWFkLXJvd3MsIDEpLCBhdXRvKTtcXHJcXG4gICAgbWluLWhlaWdodDogMDtcXHJcXG59XFxyXFxuXFxyXFxuLmFweC1zY3JvbGxhYmxlLXRhYmxlID4gdGhlYWQge1xcclxcbiAgICBncmlkLXRlbXBsYXRlLXJvd3M6IHJlcGVhdCh2YXIoLS1hcHgtc2Nyb2xsYWJsZS10aGVhZC1yb3dzLCAxKSwgYXV0byk7XFxyXFxufVxcclxcblxcclxcbi5hcHgtc2Nyb2xsYWJsZS10YWJsZSA+IHRib2R5IHtcXHJcXG4gICAgZ3JpZC10ZW1wbGF0ZS1yb3dzOiByZXBlYXQodmFyKC0tYXB4LXNjcm9sbGFibGUtdGJvZHktcm93cywgMSksIGF1dG8pO1xcclxcbiAgICBvdmVyZmxvdzogYXV0bztcXHJcXG4gICAgLyogUmVzZXJ2ZSBzcGFjZSBmb3IgdGhlIHZlcnRpY2FsIHNjcm9sbGJhciBzbyBpdCBkb2Vzbid0IHNocmluayBjb250ZW50IHdpZHRoIGFuZCB0cmlnZ2VyIGEgaG9yaXpvbnRhbCBzY3JvbGxiYXIgKi9cXHJcXG4gICAgc2Nyb2xsYmFyLWd1dHRlcjogc3RhYmxlO1xcclxcbn1cXHJcXG5cXHJcXG4uYXB4LXNjcm9sbGFibGUtdGFibGUgPiB0Zm9vdCB7XFxyXFxuICAgIGdyaWQtdGVtcGxhdGUtcm93czogcmVwZWF0KHZhcigtLWFweC1zY3JvbGxhYmxlLXRmb290LXJvd3MsIDEpLCBhdXRvKTtcXHJcXG59XFxyXFxuXFxyXFxuLmFweC1zY3JvbGxhYmxlLXRhYmxlID4gdGhlYWQgPiB0cixcXHJcXG4uYXB4LXNjcm9sbGFibGUtdGFibGUgPiB0Ym9keSA+IHRyLFxcclxcbi5hcHgtc2Nyb2xsYWJsZS10YWJsZSA+IHRmb290ID4gdHIge1xcclxcbiAgICBkaXNwbGF5OiBjb250ZW50cztcXHJcXG59XFxyXFxuXFxyXFxuLmFweC1zY3JvbGxhYmxlLXRhYmxlIHRoLFxcclxcbi5hcHgtc2Nyb2xsYWJsZS10YWJsZSB0ZCB7XFxyXFxuICAgIC8qIEdyaWQgcGxhY2VtZW50IHNldCBieSBKUyAoZ3JpZC1yb3csIGdyaWQtY29sdW1uKSBmb3IgY29sc3Bhbi9yb3dzcGFuICovXFxyXFxuICAgIG1pbi13aWR0aDogMDtcXHJcXG59XFxyXFxuXCJdLFwic291cmNlUm9vdFwiOlwiXCJ9XSk7XG4vLyBFeHBvcnRzXG5leHBvcnQgZGVmYXVsdCBfX19DU1NfTE9BREVSX0VYUE9SVF9fXztcbiIsIi8vIEltcG9ydHNcbmltcG9ydCBfX19DU1NfTE9BREVSX0FQSV9TT1VSQ0VNQVBfSU1QT1JUX19fIGZyb20gXCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L3J1bnRpbWUvc291cmNlTWFwcy5qc1wiO1xuaW1wb3J0IF9fX0NTU19MT0FERVJfQVBJX0lNUE9SVF9fXyBmcm9tIFwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL2FwaS5qc1wiO1xudmFyIF9fX0NTU19MT0FERVJfRVhQT1JUX19fID0gX19fQ1NTX0xPQURFUl9BUElfSU1QT1JUX19fKF9fX0NTU19MT0FERVJfQVBJX1NPVVJDRU1BUF9JTVBPUlRfX18pO1xuLy8gTW9kdWxlXG5fX19DU1NfTE9BREVSX0VYUE9SVF9fXy5wdXNoKFttb2R1bGUuaWQsIGAuQVBYLXRvYXN0LWNvbnRhaW5lciB7XHJcbiAgICBwb3NpdGlvbjogZml4ZWQ7XHJcbiAgICBkaXNwbGF5OiBmbGV4O1xyXG4gICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcclxuICAgIGdhcDogdmFyKC0tYXB4LXRvYXN0LWdhcCwgOHB4KTtcclxuICAgIHotaW5kZXg6IHZhcigtLWFweC10b2FzdC16LWluZGV4LCAxMTAwMCk7XHJcbiAgICBwb2ludGVyLWV2ZW50czogbm9uZTtcclxufVxyXG5cclxuLkFQWC10b2FzdC1jb250YWluZXItLWJvdHRvbS1yaWdodCB7IHJpZ2h0OiAxMnB4OyBib3R0b206IDEycHg7IGFsaWduLWl0ZW1zOiBmbGV4LWVuZDsgfVxyXG4uQVBYLXRvYXN0LWNvbnRhaW5lci0tYm90dG9tLWxlZnQgeyBsZWZ0OiAxMnB4OyBib3R0b206IDEycHg7IGFsaWduLWl0ZW1zOiBmbGV4LXN0YXJ0OyB9XHJcbi5BUFgtdG9hc3QtY29udGFpbmVyLS10b3AtcmlnaHQgeyByaWdodDogMTJweDsgdG9wOiAxMnB4OyBhbGlnbi1pdGVtczogZmxleC1lbmQ7IH1cclxuLkFQWC10b2FzdC1jb250YWluZXItLXRvcC1sZWZ0IHsgbGVmdDogMTJweDsgdG9wOiAxMnB4OyBhbGlnbi1pdGVtczogZmxleC1zdGFydDsgfVxyXG5cclxuLkFQWC10b2FzdCB7XHJcbiAgICBtaW4td2lkdGg6IHZhcigtLWFweC10b2FzdC1taW4td2lkdGgsIDI2MHB4KTtcclxuICAgIG1heC13aWR0aDogdmFyKC0tYXB4LXRvYXN0LW1heC13aWR0aCwgNDIwcHgpO1xyXG4gICAgZm9udC1zaXplOiB2YXIoLS1hcHgtdG9hc3QtZm9udC1zaXplLCAxNHB4KTtcclxuICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLWFweC10b2FzdC1yYWRpdXMsIDZweCk7XHJcbiAgICBib3gtc2hhZG93OiB2YXIoLS1hcHgtdG9hc3Qtc2hhZG93LCAwIDZweCAyNHB4IHJnYmEoMCwwLDAsMC4yKSk7XHJcbiAgICBwYWRkaW5nOiB2YXIoLS1hcHgtdG9hc3QtcGFkZGluZywgMTBweCA0MnB4IDEwcHggMTRweCk7XHJcbiAgICBjb2xvcjogIzExMTtcclxuICAgIGJhY2tncm91bmQ6ICNlZWU7XHJcbiAgICBwb2ludGVyLWV2ZW50czogYXV0bztcclxuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcclxuICAgIHRyYW5zaXRpb246IG9wYWNpdHkgMTgwbXMgZWFzZSwgdHJhbnNmb3JtIDE4MG1zIGVhc2U7XHJcbn1cclxuXHJcbi5BUFgtdG9hc3QtLWluZm8geyBiYWNrZ3JvdW5kOiB2YXIoLS1hcHgtdG9hc3QtaW5mby1iZywgIzBkY2FmMCk7IGNvbG9yOiB2YXIoLS1hcHgtdG9hc3QtaW5mby1mZywgIzA1MmM2NSk7IH1cclxuLkFQWC10b2FzdC0tc3VjY2VzcyB7IGJhY2tncm91bmQ6IHZhcigtLWFweC10b2FzdC1zdWNjZXNzLWJnLCAjMTk4NzU0KTsgY29sb3I6IHZhcigtLWFweC10b2FzdC1zdWNjZXNzLWZnLCAjZmZmZmZmKTsgfVxyXG4uQVBYLXRvYXN0LS13YXJuaW5nIHsgYmFja2dyb3VuZDogdmFyKC0tYXB4LXRvYXN0LXdhcm5pbmctYmcsICNmZmMxMDcpOyBjb2xvcjogdmFyKC0tYXB4LXRvYXN0LXdhcm5pbmctZmcsICM2NjRkMDMpOyB9XHJcbi5BUFgtdG9hc3QtLWRhbmdlciB7IGJhY2tncm91bmQ6IHZhcigtLWFweC10b2FzdC1kYW5nZXItYmcsICNkYzM1NDUpOyBjb2xvcjogdmFyKC0tYXB4LXRvYXN0LWRhbmdlci1mZywgI2ZmZmZmZik7IH1cclxuXHJcbi5BUFgtdG9hc3RfX2NvbnRlbnQgeyBsaW5lLWhlaWdodDogMS4zNTsgfVxyXG5cclxuLkFQWC10b2FzdF9fY2xvc2Uge1xyXG4gICAgcG9zaXRpb246IGFic29sdXRlO1xyXG4gICAgdG9wOiA1MCU7IHJpZ2h0OiAxMHB4O1xyXG4gICAgd2lkdGg6IDI0cHg7IGhlaWdodDogMjRweDtcclxuICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtNTAlKTtcclxuICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OyBhbGlnbi1pdGVtczogY2VudGVyOyBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcclxuICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50OyBjb2xvcjogY3VycmVudENvbG9yO1xyXG4gICAgYm9yZGVyOiAwOyBib3JkZXItcmFkaXVzOiA0cHg7IHBhZGRpbmc6IDA7IG1hcmdpbjogMDtcclxuICAgIGN1cnNvcjogcG9pbnRlcjsgYXBwZWFyYW5jZTogbm9uZTsgLXdlYmtpdC1hcHBlYXJhbmNlOiBub25lO1xyXG4gICAgb3BhY2l0eTogLjc1OyB0cmFuc2l0aW9uOiBvcGFjaXR5IDEyMG1zIGVhc2U7XHJcbn1cclxuLkFQWC10b2FzdF9fY2xvc2U6aG92ZXIgeyBvcGFjaXR5OiAxOyB9XHJcbi5BUFgtdG9hc3RfX2Nsb3NlOmZvY3VzIHsgb3V0bGluZTogMnB4IHNvbGlkIHJnYmEoMCwwLDAsLjIpOyBvdXRsaW5lLW9mZnNldDogMnB4OyB9XHJcbi5BUFgtdG9hc3RfX2Nsb3NlOjpiZWZvcmUge1xyXG4gICAgY29udGVudDogJ8OXJztcclxuICAgIGZvbnQtc2l6ZTogMTZweDsgbGluZS1oZWlnaHQ6IDE7IHRleHQtYWxpZ246IGNlbnRlcjtcclxufVxyXG5cclxuLyogUHJvZ3Jlc3MgYmFyIChvdXRzaWRlIGNvbnRlbnQsIGZsdXNoIHRvIHRvYXN0IGVkZ2VzKSAqL1xyXG4uQVBYLXRvYXN0X19wcm9ncmVzcyB7XHJcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XHJcbiAgICBsZWZ0OiAwO1xyXG4gICAgcmlnaHQ6IDA7XHJcbiAgICBoZWlnaHQ6IHZhcigtLWFweC10b2FzdC1wcm9ncmVzcy1oZWlnaHQsIDRweCk7XHJcbiAgICBkaXNwbGF5OiBmbGV4O1xyXG4gICAgZmxleC1kaXJlY3Rpb246IHJvdztcclxuICAgIGFsaWduLWl0ZW1zOiBzdHJldGNoO1xyXG4gICAgZmxleC1zaHJpbms6IDA7XHJcbiAgICBib3JkZXItcmFkaXVzOiBpbmhlcml0O1xyXG4gICAgb3ZlcmZsb3c6IHZpc2libGU7XHJcbn1cclxuLkFQWC10b2FzdF9fcHJvZ3Jlc3MtLXRvcCB7XHJcbiAgICB0b3A6IDA7XHJcbiAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1hcHgtdG9hc3QtcmFkaXVzLCA2cHgpIHZhcigtLWFweC10b2FzdC1yYWRpdXMsIDZweCkgMCAwO1xyXG59XHJcbi5BUFgtdG9hc3RfX3Byb2dyZXNzLS1ib3R0b20ge1xyXG4gICAgYm90dG9tOiAwO1xyXG4gICAgYm9yZGVyLXJhZGl1czogMCAwIHZhcigtLWFweC10b2FzdC1yYWRpdXMsIDZweCkgdmFyKC0tYXB4LXRvYXN0LXJhZGl1cywgNnB4KTtcclxufVxyXG4vKiBUcmFjayBjb250YWlucyB0aGUgYmFyOyBubyBtYXJnaW4gKHBhdXNlIGJ1dHRvbiBpcyBvbiB0aGUgY29ybmVyLCBvdmVybGFwcGluZykgKi9cclxuLkFQWC10b2FzdF9fcHJvZ3Jlc3MtdHJhY2sge1xyXG4gICAgZmxleDogMTtcclxuICAgIG1pbi13aWR0aDogMDtcclxuICAgIG92ZXJmbG93OiBoaWRkZW47XHJcbn1cclxuLkFQWC10b2FzdF9fcHJvZ3Jlc3MtYmFyIHtcclxuICAgIGhlaWdodDogMTAwJTtcclxuICAgIHdpZHRoOiAxMDAlO1xyXG4gICAgbWF4LXdpZHRoOiAxMDAlO1xyXG4gICAgdHJhbnNpdGlvbjogd2lkdGggODBtcyBsaW5lYXI7XHJcbiAgICBiYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDAsIDAuMjUpO1xyXG59XHJcbi5BUFgtdG9hc3QtLWluZm8gLkFQWC10b2FzdF9fcHJvZ3Jlc3MtYmFyIHsgYmFja2dyb3VuZDogcmdiYSg1LCA0NCwgMTAxLCAwLjUpOyB9XHJcbi5BUFgtdG9hc3QtLXN1Y2Nlc3MgLkFQWC10b2FzdF9fcHJvZ3Jlc3MtYmFyIHsgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjI1KTsgfVxyXG4uQVBYLXRvYXN0LS13YXJuaW5nIC5BUFgtdG9hc3RfX3Byb2dyZXNzLWJhciB7IGJhY2tncm91bmQ6IHJnYmEoMTAyLCA3NywgMywgMC41KTsgfVxyXG4uQVBYLXRvYXN0LS1kYW5nZXIgLkFQWC10b2FzdF9fcHJvZ3Jlc3MtYmFyIHsgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjI1KTsgfVxyXG4vKiBQYXVzZS9SZXN1bWUgYnV0dG9uOiByb3VuZCwgY2VudGVyIGV4YWN0bHkgb24gdG9hc3QgY29ybmVyICh0b3AtbGVmdCBvciBib3R0b20tbGVmdCkgKi9cclxuLkFQWC10b2FzdF9fcHJvZ3Jlc3MtcGF1c2Uge1xyXG4gICAgcG9zaXRpb246IGFic29sdXRlO1xyXG4gICAgd2lkdGg6IHZhcigtLWFweC10b2FzdC1wcm9ncmVzcy1wYXVzZS1zaXplLCAxOHB4KTtcclxuICAgIGhlaWdodDogdmFyKC0tYXB4LXRvYXN0LXByb2dyZXNzLXBhdXNlLXNpemUsIDE4cHgpO1xyXG4gICAgbGVmdDogMDtcclxuICAgIGRpc3BsYXk6IGlubGluZS1mbGV4O1xyXG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcclxuICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xyXG4gICAgYmFja2dyb3VuZDogI2VlZTtcclxuICAgIGNvbG9yOiBjdXJyZW50Q29sb3I7XHJcbiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDAsIDAsIDAsIDAuMzUpO1xyXG4gICAgYm9yZGVyLXJhZGl1czogNTAlO1xyXG4gICAgcGFkZGluZzogMDtcclxuICAgIG1hcmdpbjogMDtcclxuICAgIGN1cnNvcjogcG9pbnRlcjtcclxuICAgIGxpbmUtaGVpZ2h0OiAxO1xyXG4gICAgb3BhY2l0eTogMC45NTtcclxuICAgIHRyYW5zaXRpb246IG9wYWNpdHkgMTIwbXMgZWFzZTtcclxuICAgIGZsZXgtc2hyaW5rOiAwO1xyXG59XHJcbi5BUFgtdG9hc3RfX3Byb2dyZXNzLS10b3AgLkFQWC10b2FzdF9fcHJvZ3Jlc3MtcGF1c2Uge1xyXG4gICAgdG9wOiAwO1xyXG4gICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTUwJSwgLTUwJSk7XHJcbn1cclxuLkFQWC10b2FzdF9fcHJvZ3Jlc3MtLWJvdHRvbSAuQVBYLXRvYXN0X19wcm9ncmVzcy1wYXVzZSB7XHJcbiAgICBib3R0b206IDA7XHJcbiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSgtNTAlLCA1MCUpO1xyXG59XHJcbi5BUFgtdG9hc3QtLWluZm8gLkFQWC10b2FzdF9fcHJvZ3Jlc3MtcGF1c2UgeyBiYWNrZ3JvdW5kOiB2YXIoLS1hcHgtdG9hc3QtaW5mby1iZywgIzBkY2FmMCk7IGJvcmRlci1jb2xvcjogcmdiYSg1LCA0NCwgMTAxLCAwLjU1KTsgfVxyXG4uQVBYLXRvYXN0LS1zdWNjZXNzIC5BUFgtdG9hc3RfX3Byb2dyZXNzLXBhdXNlIHsgYmFja2dyb3VuZDogdmFyKC0tYXB4LXRvYXN0LXN1Y2Nlc3MtYmcsICMxOTg3NTQpOyBib3JkZXItY29sb3I6IHJnYmEoMCwgMCwgMCwgMC4zKTsgfVxyXG4uQVBYLXRvYXN0LS13YXJuaW5nIC5BUFgtdG9hc3RfX3Byb2dyZXNzLXBhdXNlIHsgYmFja2dyb3VuZDogdmFyKC0tYXB4LXRvYXN0LXdhcm5pbmctYmcsICNmZmMxMDcpOyBib3JkZXItY29sb3I6IHJnYmEoMTAyLCA3NywgMywgMC42KTsgfVxyXG4uQVBYLXRvYXN0LS1kYW5nZXIgLkFQWC10b2FzdF9fcHJvZ3Jlc3MtcGF1c2UgeyBiYWNrZ3JvdW5kOiB2YXIoLS1hcHgtdG9hc3QtZGFuZ2VyLWJnLCAjZGMzNTQ1KTsgYm9yZGVyLWNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuMzUpOyB9XHJcbi5BUFgtdG9hc3RfX3Byb2dyZXNzLXBhdXNlOmhvdmVyIHsgb3BhY2l0eTogMTsgfVxyXG4uQVBYLXRvYXN0X19wcm9ncmVzcy1wYXVzZTpmb2N1cyB7IG91dGxpbmU6IDJweCBzb2xpZCByZ2JhKDAsMCwwLC40KTsgb3V0bGluZS1vZmZzZXQ6IC0ycHg7IH1cclxuLkFQWC10b2FzdF9fcHJvZ3Jlc3MtcGF1c2Ugc3ZnIHtcclxuICAgIHdpZHRoOiAxMHB4O1xyXG4gICAgaGVpZ2h0OiAxMHB4O1xyXG4gICAgZGlzcGxheTogYmxvY2s7XHJcbn1cclxuLyogRXh0cmEgdG9wL2JvdHRvbSBwYWRkaW5nIHdoZW4gcHJvZ3Jlc3MgYmFyIGlzIHByZXNlbnQgKGRlZmF1bHQgY29udGVudCBwYWRkaW5nIDEwcHggKyBiYXIgaGVpZ2h0KSAqL1xyXG4uQVBYLXRvYXN0LS1oYXMtcHJvZ3Jlc3MtdG9wIHsgcGFkZGluZy10b3A6IGNhbGMoMTBweCArIHZhcigtLWFweC10b2FzdC1wcm9ncmVzcy1oZWlnaHQsIDRweCkpOyB9XHJcbi5BUFgtdG9hc3QtLWhhcy1wcm9ncmVzcy1ib3R0b20geyBwYWRkaW5nLWJvdHRvbTogY2FsYygxMHB4ICsgdmFyKC0tYXB4LXRvYXN0LXByb2dyZXNzLWhlaWdodCwgNHB4KSk7IH1cclxuLyogUmVzZXJ2ZSBzcGFjZSBmb3Igc3RhY2tpbmcgd2hlbiBwYXVzZSBidXR0b24gaXMgcHJlc2VudCAoYnV0dG9uIGV4dGVuZHMgb3V0c2lkZSB0b2FzdCBjb3JuZXIpICovXHJcbi5BUFgtdG9hc3QtLWhhcy1wcm9ncmVzcy10b3AuQVBYLXRvYXN0LS1oYXMtcHJvZ3Jlc3MtcGF1c2UgeyBtYXJnaW4tdG9wOiBjYWxjKHZhcigtLWFweC10b2FzdC1wcm9ncmVzcy1wYXVzZS1zaXplLCAxOHB4KSAvIDIpOyB9XHJcbi5BUFgtdG9hc3QtLWhhcy1wcm9ncmVzcy1ib3R0b20uQVBYLXRvYXN0LS1oYXMtcHJvZ3Jlc3MtcGF1c2UgeyBtYXJnaW4tYm90dG9tOiBjYWxjKHZhcigtLWFweC10b2FzdC1wcm9ncmVzcy1wYXVzZS1zaXplLCAxOHB4KSAvIDIpOyB9XHJcblxyXG4vKiBBbmltYXRpb25zICovXHJcbi5BUFgtdG9hc3QtLWVudGVyIHsgb3BhY2l0eTogMDsgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKDhweCk7IH1cclxuLkFQWC10b2FzdC0tZW50ZXIuQVBYLXRvYXN0LS1lbnRlci1hY3RpdmUgeyBvcGFjaXR5OiAxOyB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoMCk7IH1cclxuLkFQWC10b2FzdC0tZXhpdCB7IG9wYWNpdHk6IDE7IHRyYW5zZm9ybTogdHJhbnNsYXRlWSgwKTsgfVxyXG4uQVBYLXRvYXN0LS1leGl0LkFQWC10b2FzdC0tZXhpdC1hY3RpdmUgeyBvcGFjaXR5OiAwOyB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoOHB4KTsgfVxyXG5cclxuXHJcbmAsIFwiXCIse1widmVyc2lvblwiOjMsXCJzb3VyY2VzXCI6W1wid2VicGFjazovLy4vbW9kdWxlcy90b2FzdC9jc3MvdG9hc3QuY3NzXCJdLFwibmFtZXNcIjpbXSxcIm1hcHBpbmdzXCI6XCJBQUFBO0lBQ0ksZUFBZTtJQUNmLGFBQWE7SUFDYixzQkFBc0I7SUFDdEIsOEJBQThCO0lBQzlCLHdDQUF3QztJQUN4QyxvQkFBb0I7QUFDeEI7O0FBRUEscUNBQXFDLFdBQVcsRUFBRSxZQUFZLEVBQUUscUJBQXFCLEVBQUU7QUFDdkYsb0NBQW9DLFVBQVUsRUFBRSxZQUFZLEVBQUUsdUJBQXVCLEVBQUU7QUFDdkYsa0NBQWtDLFdBQVcsRUFBRSxTQUFTLEVBQUUscUJBQXFCLEVBQUU7QUFDakYsaUNBQWlDLFVBQVUsRUFBRSxTQUFTLEVBQUUsdUJBQXVCLEVBQUU7O0FBRWpGO0lBQ0ksNENBQTRDO0lBQzVDLDRDQUE0QztJQUM1QywyQ0FBMkM7SUFDM0MsMkNBQTJDO0lBQzNDLCtEQUErRDtJQUMvRCxzREFBc0Q7SUFDdEQsV0FBVztJQUNYLGdCQUFnQjtJQUNoQixvQkFBb0I7SUFDcEIsa0JBQWtCO0lBQ2xCLG9EQUFvRDtBQUN4RDs7QUFFQSxtQkFBbUIsNkNBQTZDLEVBQUUsd0NBQXdDLEVBQUU7QUFDNUcsc0JBQXNCLGdEQUFnRCxFQUFFLDJDQUEyQyxFQUFFO0FBQ3JILHNCQUFzQixnREFBZ0QsRUFBRSwyQ0FBMkMsRUFBRTtBQUNySCxxQkFBcUIsK0NBQStDLEVBQUUsMENBQTBDLEVBQUU7O0FBRWxILHNCQUFzQixpQkFBaUIsRUFBRTs7QUFFekM7SUFDSSxrQkFBa0I7SUFDbEIsUUFBUSxFQUFFLFdBQVc7SUFDckIsV0FBVyxFQUFFLFlBQVk7SUFDekIsMkJBQTJCO0lBQzNCLG9CQUFvQixFQUFFLG1CQUFtQixFQUFFLHVCQUF1QjtJQUNsRSx1QkFBdUIsRUFBRSxtQkFBbUI7SUFDNUMsU0FBUyxFQUFFLGtCQUFrQixFQUFFLFVBQVUsRUFBRSxTQUFTO0lBQ3BELGVBQWUsRUFBRSxnQkFBZ0IsRUFBRSx3QkFBd0I7SUFDM0QsWUFBWSxFQUFFLDhCQUE4QjtBQUNoRDtBQUNBLDBCQUEwQixVQUFVLEVBQUU7QUFDdEMsMEJBQTBCLGlDQUFpQyxFQUFFLG1CQUFtQixFQUFFO0FBQ2xGO0lBQ0ksWUFBWTtJQUNaLGVBQWUsRUFBRSxjQUFjLEVBQUUsa0JBQWtCO0FBQ3ZEOztBQUVBLHlEQUF5RDtBQUN6RDtJQUNJLGtCQUFrQjtJQUNsQixPQUFPO0lBQ1AsUUFBUTtJQUNSLDZDQUE2QztJQUM3QyxhQUFhO0lBQ2IsbUJBQW1CO0lBQ25CLG9CQUFvQjtJQUNwQixjQUFjO0lBQ2Qsc0JBQXNCO0lBQ3RCLGlCQUFpQjtBQUNyQjtBQUNBO0lBQ0ksTUFBTTtJQUNOLDRFQUE0RTtBQUNoRjtBQUNBO0lBQ0ksU0FBUztJQUNULDRFQUE0RTtBQUNoRjtBQUNBLG1GQUFtRjtBQUNuRjtJQUNJLE9BQU87SUFDUCxZQUFZO0lBQ1osZ0JBQWdCO0FBQ3BCO0FBQ0E7SUFDSSxZQUFZO0lBQ1osV0FBVztJQUNYLGVBQWU7SUFDZiw2QkFBNkI7SUFDN0IsK0JBQStCO0FBQ25DO0FBQ0EsNENBQTRDLGlDQUFpQyxFQUFFO0FBQy9FLCtDQUErQywrQkFBK0IsRUFBRTtBQUNoRiwrQ0FBK0MsaUNBQWlDLEVBQUU7QUFDbEYsOENBQThDLCtCQUErQixFQUFFO0FBQy9FLHlGQUF5RjtBQUN6RjtJQUNJLGtCQUFrQjtJQUNsQixpREFBaUQ7SUFDakQsa0RBQWtEO0lBQ2xELE9BQU87SUFDUCxvQkFBb0I7SUFDcEIsbUJBQW1CO0lBQ25CLHVCQUF1QjtJQUN2QixnQkFBZ0I7SUFDaEIsbUJBQW1CO0lBQ25CLHFDQUFxQztJQUNyQyxrQkFBa0I7SUFDbEIsVUFBVTtJQUNWLFNBQVM7SUFDVCxlQUFlO0lBQ2YsY0FBYztJQUNkLGFBQWE7SUFDYiw4QkFBOEI7SUFDOUIsY0FBYztBQUNsQjtBQUNBO0lBQ0ksTUFBTTtJQUNOLGdDQUFnQztBQUNwQztBQUNBO0lBQ0ksU0FBUztJQUNULCtCQUErQjtBQUNuQztBQUNBLDhDQUE4Qyw2Q0FBNkMsRUFBRSxvQ0FBb0MsRUFBRTtBQUNuSSxpREFBaUQsZ0RBQWdELEVBQUUsZ0NBQWdDLEVBQUU7QUFDckksaURBQWlELGdEQUFnRCxFQUFFLG1DQUFtQyxFQUFFO0FBQ3hJLGdEQUFnRCwrQ0FBK0MsRUFBRSxpQ0FBaUMsRUFBRTtBQUNwSSxtQ0FBbUMsVUFBVSxFQUFFO0FBQy9DLG1DQUFtQyxpQ0FBaUMsRUFBRSxvQkFBb0IsRUFBRTtBQUM1RjtJQUNJLFdBQVc7SUFDWCxZQUFZO0lBQ1osY0FBYztBQUNsQjtBQUNBLHNHQUFzRztBQUN0RywrQkFBK0IsK0RBQStELEVBQUU7QUFDaEcsa0NBQWtDLGtFQUFrRSxFQUFFO0FBQ3RHLGtHQUFrRztBQUNsRyw2REFBNkQsZ0VBQWdFLEVBQUU7QUFDL0gsZ0VBQWdFLG1FQUFtRSxFQUFFOztBQUVySSxlQUFlO0FBQ2Ysb0JBQW9CLFVBQVUsRUFBRSwwQkFBMEIsRUFBRTtBQUM1RCw0Q0FBNEMsVUFBVSxFQUFFLHdCQUF3QixFQUFFO0FBQ2xGLG1CQUFtQixVQUFVLEVBQUUsd0JBQXdCLEVBQUU7QUFDekQsMENBQTBDLFVBQVUsRUFBRSwwQkFBMEIsRUFBRVwiLFwic291cmNlc0NvbnRlbnRcIjpbXCIuQVBYLXRvYXN0LWNvbnRhaW5lciB7XFxyXFxuICAgIHBvc2l0aW9uOiBmaXhlZDtcXHJcXG4gICAgZGlzcGxheTogZmxleDtcXHJcXG4gICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcXHJcXG4gICAgZ2FwOiB2YXIoLS1hcHgtdG9hc3QtZ2FwLCA4cHgpO1xcclxcbiAgICB6LWluZGV4OiB2YXIoLS1hcHgtdG9hc3Qtei1pbmRleCwgMTEwMDApO1xcclxcbiAgICBwb2ludGVyLWV2ZW50czogbm9uZTtcXHJcXG59XFxyXFxuXFxyXFxuLkFQWC10b2FzdC1jb250YWluZXItLWJvdHRvbS1yaWdodCB7IHJpZ2h0OiAxMnB4OyBib3R0b206IDEycHg7IGFsaWduLWl0ZW1zOiBmbGV4LWVuZDsgfVxcclxcbi5BUFgtdG9hc3QtY29udGFpbmVyLS1ib3R0b20tbGVmdCB7IGxlZnQ6IDEycHg7IGJvdHRvbTogMTJweDsgYWxpZ24taXRlbXM6IGZsZXgtc3RhcnQ7IH1cXHJcXG4uQVBYLXRvYXN0LWNvbnRhaW5lci0tdG9wLXJpZ2h0IHsgcmlnaHQ6IDEycHg7IHRvcDogMTJweDsgYWxpZ24taXRlbXM6IGZsZXgtZW5kOyB9XFxyXFxuLkFQWC10b2FzdC1jb250YWluZXItLXRvcC1sZWZ0IHsgbGVmdDogMTJweDsgdG9wOiAxMnB4OyBhbGlnbi1pdGVtczogZmxleC1zdGFydDsgfVxcclxcblxcclxcbi5BUFgtdG9hc3Qge1xcclxcbiAgICBtaW4td2lkdGg6IHZhcigtLWFweC10b2FzdC1taW4td2lkdGgsIDI2MHB4KTtcXHJcXG4gICAgbWF4LXdpZHRoOiB2YXIoLS1hcHgtdG9hc3QtbWF4LXdpZHRoLCA0MjBweCk7XFxyXFxuICAgIGZvbnQtc2l6ZTogdmFyKC0tYXB4LXRvYXN0LWZvbnQtc2l6ZSwgMTRweCk7XFxyXFxuICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLWFweC10b2FzdC1yYWRpdXMsIDZweCk7XFxyXFxuICAgIGJveC1zaGFkb3c6IHZhcigtLWFweC10b2FzdC1zaGFkb3csIDAgNnB4IDI0cHggcmdiYSgwLDAsMCwwLjIpKTtcXHJcXG4gICAgcGFkZGluZzogdmFyKC0tYXB4LXRvYXN0LXBhZGRpbmcsIDEwcHggNDJweCAxMHB4IDE0cHgpO1xcclxcbiAgICBjb2xvcjogIzExMTtcXHJcXG4gICAgYmFja2dyb3VuZDogI2VlZTtcXHJcXG4gICAgcG9pbnRlci1ldmVudHM6IGF1dG87XFxyXFxuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcXHJcXG4gICAgdHJhbnNpdGlvbjogb3BhY2l0eSAxODBtcyBlYXNlLCB0cmFuc2Zvcm0gMTgwbXMgZWFzZTtcXHJcXG59XFxyXFxuXFxyXFxuLkFQWC10b2FzdC0taW5mbyB7IGJhY2tncm91bmQ6IHZhcigtLWFweC10b2FzdC1pbmZvLWJnLCAjMGRjYWYwKTsgY29sb3I6IHZhcigtLWFweC10b2FzdC1pbmZvLWZnLCAjMDUyYzY1KTsgfVxcclxcbi5BUFgtdG9hc3QtLXN1Y2Nlc3MgeyBiYWNrZ3JvdW5kOiB2YXIoLS1hcHgtdG9hc3Qtc3VjY2Vzcy1iZywgIzE5ODc1NCk7IGNvbG9yOiB2YXIoLS1hcHgtdG9hc3Qtc3VjY2Vzcy1mZywgI2ZmZmZmZik7IH1cXHJcXG4uQVBYLXRvYXN0LS13YXJuaW5nIHsgYmFja2dyb3VuZDogdmFyKC0tYXB4LXRvYXN0LXdhcm5pbmctYmcsICNmZmMxMDcpOyBjb2xvcjogdmFyKC0tYXB4LXRvYXN0LXdhcm5pbmctZmcsICM2NjRkMDMpOyB9XFxyXFxuLkFQWC10b2FzdC0tZGFuZ2VyIHsgYmFja2dyb3VuZDogdmFyKC0tYXB4LXRvYXN0LWRhbmdlci1iZywgI2RjMzU0NSk7IGNvbG9yOiB2YXIoLS1hcHgtdG9hc3QtZGFuZ2VyLWZnLCAjZmZmZmZmKTsgfVxcclxcblxcclxcbi5BUFgtdG9hc3RfX2NvbnRlbnQgeyBsaW5lLWhlaWdodDogMS4zNTsgfVxcclxcblxcclxcbi5BUFgtdG9hc3RfX2Nsb3NlIHtcXHJcXG4gICAgcG9zaXRpb246IGFic29sdXRlO1xcclxcbiAgICB0b3A6IDUwJTsgcmlnaHQ6IDEwcHg7XFxyXFxuICAgIHdpZHRoOiAyNHB4OyBoZWlnaHQ6IDI0cHg7XFxyXFxuICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtNTAlKTtcXHJcXG4gICAgZGlzcGxheTogaW5saW5lLWZsZXg7IGFsaWduLWl0ZW1zOiBjZW50ZXI7IGp1c3RpZnktY29udGVudDogY2VudGVyO1xcclxcbiAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsgY29sb3I6IGN1cnJlbnRDb2xvcjtcXHJcXG4gICAgYm9yZGVyOiAwOyBib3JkZXItcmFkaXVzOiA0cHg7IHBhZGRpbmc6IDA7IG1hcmdpbjogMDtcXHJcXG4gICAgY3Vyc29yOiBwb2ludGVyOyBhcHBlYXJhbmNlOiBub25lOyAtd2Via2l0LWFwcGVhcmFuY2U6IG5vbmU7XFxyXFxuICAgIG9wYWNpdHk6IC43NTsgdHJhbnNpdGlvbjogb3BhY2l0eSAxMjBtcyBlYXNlO1xcclxcbn1cXHJcXG4uQVBYLXRvYXN0X19jbG9zZTpob3ZlciB7IG9wYWNpdHk6IDE7IH1cXHJcXG4uQVBYLXRvYXN0X19jbG9zZTpmb2N1cyB7IG91dGxpbmU6IDJweCBzb2xpZCByZ2JhKDAsMCwwLC4yKTsgb3V0bGluZS1vZmZzZXQ6IDJweDsgfVxcclxcbi5BUFgtdG9hc3RfX2Nsb3NlOjpiZWZvcmUge1xcclxcbiAgICBjb250ZW50OiAnw5cnO1xcclxcbiAgICBmb250LXNpemU6IDE2cHg7IGxpbmUtaGVpZ2h0OiAxOyB0ZXh0LWFsaWduOiBjZW50ZXI7XFxyXFxufVxcclxcblxcclxcbi8qIFByb2dyZXNzIGJhciAob3V0c2lkZSBjb250ZW50LCBmbHVzaCB0byB0b2FzdCBlZGdlcykgKi9cXHJcXG4uQVBYLXRvYXN0X19wcm9ncmVzcyB7XFxyXFxuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXHJcXG4gICAgbGVmdDogMDtcXHJcXG4gICAgcmlnaHQ6IDA7XFxyXFxuICAgIGhlaWdodDogdmFyKC0tYXB4LXRvYXN0LXByb2dyZXNzLWhlaWdodCwgNHB4KTtcXHJcXG4gICAgZGlzcGxheTogZmxleDtcXHJcXG4gICAgZmxleC1kaXJlY3Rpb246IHJvdztcXHJcXG4gICAgYWxpZ24taXRlbXM6IHN0cmV0Y2g7XFxyXFxuICAgIGZsZXgtc2hyaW5rOiAwO1xcclxcbiAgICBib3JkZXItcmFkaXVzOiBpbmhlcml0O1xcclxcbiAgICBvdmVyZmxvdzogdmlzaWJsZTtcXHJcXG59XFxyXFxuLkFQWC10b2FzdF9fcHJvZ3Jlc3MtLXRvcCB7XFxyXFxuICAgIHRvcDogMDtcXHJcXG4gICAgYm9yZGVyLXJhZGl1czogdmFyKC0tYXB4LXRvYXN0LXJhZGl1cywgNnB4KSB2YXIoLS1hcHgtdG9hc3QtcmFkaXVzLCA2cHgpIDAgMDtcXHJcXG59XFxyXFxuLkFQWC10b2FzdF9fcHJvZ3Jlc3MtLWJvdHRvbSB7XFxyXFxuICAgIGJvdHRvbTogMDtcXHJcXG4gICAgYm9yZGVyLXJhZGl1czogMCAwIHZhcigtLWFweC10b2FzdC1yYWRpdXMsIDZweCkgdmFyKC0tYXB4LXRvYXN0LXJhZGl1cywgNnB4KTtcXHJcXG59XFxyXFxuLyogVHJhY2sgY29udGFpbnMgdGhlIGJhcjsgbm8gbWFyZ2luIChwYXVzZSBidXR0b24gaXMgb24gdGhlIGNvcm5lciwgb3ZlcmxhcHBpbmcpICovXFxyXFxuLkFQWC10b2FzdF9fcHJvZ3Jlc3MtdHJhY2sge1xcclxcbiAgICBmbGV4OiAxO1xcclxcbiAgICBtaW4td2lkdGg6IDA7XFxyXFxuICAgIG92ZXJmbG93OiBoaWRkZW47XFxyXFxufVxcclxcbi5BUFgtdG9hc3RfX3Byb2dyZXNzLWJhciB7XFxyXFxuICAgIGhlaWdodDogMTAwJTtcXHJcXG4gICAgd2lkdGg6IDEwMCU7XFxyXFxuICAgIG1heC13aWR0aDogMTAwJTtcXHJcXG4gICAgdHJhbnNpdGlvbjogd2lkdGggODBtcyBsaW5lYXI7XFxyXFxuICAgIGJhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwgMC4yNSk7XFxyXFxufVxcclxcbi5BUFgtdG9hc3QtLWluZm8gLkFQWC10b2FzdF9fcHJvZ3Jlc3MtYmFyIHsgYmFja2dyb3VuZDogcmdiYSg1LCA0NCwgMTAxLCAwLjUpOyB9XFxyXFxuLkFQWC10b2FzdC0tc3VjY2VzcyAuQVBYLXRvYXN0X19wcm9ncmVzcy1iYXIgeyBiYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDAsIDAuMjUpOyB9XFxyXFxuLkFQWC10b2FzdC0td2FybmluZyAuQVBYLXRvYXN0X19wcm9ncmVzcy1iYXIgeyBiYWNrZ3JvdW5kOiByZ2JhKDEwMiwgNzcsIDMsIDAuNSk7IH1cXHJcXG4uQVBYLXRvYXN0LS1kYW5nZXIgLkFQWC10b2FzdF9fcHJvZ3Jlc3MtYmFyIHsgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjI1KTsgfVxcclxcbi8qIFBhdXNlL1Jlc3VtZSBidXR0b246IHJvdW5kLCBjZW50ZXIgZXhhY3RseSBvbiB0b2FzdCBjb3JuZXIgKHRvcC1sZWZ0IG9yIGJvdHRvbS1sZWZ0KSAqL1xcclxcbi5BUFgtdG9hc3RfX3Byb2dyZXNzLXBhdXNlIHtcXHJcXG4gICAgcG9zaXRpb246IGFic29sdXRlO1xcclxcbiAgICB3aWR0aDogdmFyKC0tYXB4LXRvYXN0LXByb2dyZXNzLXBhdXNlLXNpemUsIDE4cHgpO1xcclxcbiAgICBoZWlnaHQ6IHZhcigtLWFweC10b2FzdC1wcm9ncmVzcy1wYXVzZS1zaXplLCAxOHB4KTtcXHJcXG4gICAgbGVmdDogMDtcXHJcXG4gICAgZGlzcGxheTogaW5saW5lLWZsZXg7XFxyXFxuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XFxyXFxuICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xcclxcbiAgICBiYWNrZ3JvdW5kOiAjZWVlO1xcclxcbiAgICBjb2xvcjogY3VycmVudENvbG9yO1xcclxcbiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDAsIDAsIDAsIDAuMzUpO1xcclxcbiAgICBib3JkZXItcmFkaXVzOiA1MCU7XFxyXFxuICAgIHBhZGRpbmc6IDA7XFxyXFxuICAgIG1hcmdpbjogMDtcXHJcXG4gICAgY3Vyc29yOiBwb2ludGVyO1xcclxcbiAgICBsaW5lLWhlaWdodDogMTtcXHJcXG4gICAgb3BhY2l0eTogMC45NTtcXHJcXG4gICAgdHJhbnNpdGlvbjogb3BhY2l0eSAxMjBtcyBlYXNlO1xcclxcbiAgICBmbGV4LXNocmluazogMDtcXHJcXG59XFxyXFxuLkFQWC10b2FzdF9fcHJvZ3Jlc3MtLXRvcCAuQVBYLXRvYXN0X19wcm9ncmVzcy1wYXVzZSB7XFxyXFxuICAgIHRvcDogMDtcXHJcXG4gICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTUwJSwgLTUwJSk7XFxyXFxufVxcclxcbi5BUFgtdG9hc3RfX3Byb2dyZXNzLS1ib3R0b20gLkFQWC10b2FzdF9fcHJvZ3Jlc3MtcGF1c2Uge1xcclxcbiAgICBib3R0b206IDA7XFxyXFxuICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlKC01MCUsIDUwJSk7XFxyXFxufVxcclxcbi5BUFgtdG9hc3QtLWluZm8gLkFQWC10b2FzdF9fcHJvZ3Jlc3MtcGF1c2UgeyBiYWNrZ3JvdW5kOiB2YXIoLS1hcHgtdG9hc3QtaW5mby1iZywgIzBkY2FmMCk7IGJvcmRlci1jb2xvcjogcmdiYSg1LCA0NCwgMTAxLCAwLjU1KTsgfVxcclxcbi5BUFgtdG9hc3QtLXN1Y2Nlc3MgLkFQWC10b2FzdF9fcHJvZ3Jlc3MtcGF1c2UgeyBiYWNrZ3JvdW5kOiB2YXIoLS1hcHgtdG9hc3Qtc3VjY2Vzcy1iZywgIzE5ODc1NCk7IGJvcmRlci1jb2xvcjogcmdiYSgwLCAwLCAwLCAwLjMpOyB9XFxyXFxuLkFQWC10b2FzdC0td2FybmluZyAuQVBYLXRvYXN0X19wcm9ncmVzcy1wYXVzZSB7IGJhY2tncm91bmQ6IHZhcigtLWFweC10b2FzdC13YXJuaW5nLWJnLCAjZmZjMTA3KTsgYm9yZGVyLWNvbG9yOiByZ2JhKDEwMiwgNzcsIDMsIDAuNik7IH1cXHJcXG4uQVBYLXRvYXN0LS1kYW5nZXIgLkFQWC10b2FzdF9fcHJvZ3Jlc3MtcGF1c2UgeyBiYWNrZ3JvdW5kOiB2YXIoLS1hcHgtdG9hc3QtZGFuZ2VyLWJnLCAjZGMzNTQ1KTsgYm9yZGVyLWNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuMzUpOyB9XFxyXFxuLkFQWC10b2FzdF9fcHJvZ3Jlc3MtcGF1c2U6aG92ZXIgeyBvcGFjaXR5OiAxOyB9XFxyXFxuLkFQWC10b2FzdF9fcHJvZ3Jlc3MtcGF1c2U6Zm9jdXMgeyBvdXRsaW5lOiAycHggc29saWQgcmdiYSgwLDAsMCwuNCk7IG91dGxpbmUtb2Zmc2V0OiAtMnB4OyB9XFxyXFxuLkFQWC10b2FzdF9fcHJvZ3Jlc3MtcGF1c2Ugc3ZnIHtcXHJcXG4gICAgd2lkdGg6IDEwcHg7XFxyXFxuICAgIGhlaWdodDogMTBweDtcXHJcXG4gICAgZGlzcGxheTogYmxvY2s7XFxyXFxufVxcclxcbi8qIEV4dHJhIHRvcC9ib3R0b20gcGFkZGluZyB3aGVuIHByb2dyZXNzIGJhciBpcyBwcmVzZW50IChkZWZhdWx0IGNvbnRlbnQgcGFkZGluZyAxMHB4ICsgYmFyIGhlaWdodCkgKi9cXHJcXG4uQVBYLXRvYXN0LS1oYXMtcHJvZ3Jlc3MtdG9wIHsgcGFkZGluZy10b3A6IGNhbGMoMTBweCArIHZhcigtLWFweC10b2FzdC1wcm9ncmVzcy1oZWlnaHQsIDRweCkpOyB9XFxyXFxuLkFQWC10b2FzdC0taGFzLXByb2dyZXNzLWJvdHRvbSB7IHBhZGRpbmctYm90dG9tOiBjYWxjKDEwcHggKyB2YXIoLS1hcHgtdG9hc3QtcHJvZ3Jlc3MtaGVpZ2h0LCA0cHgpKTsgfVxcclxcbi8qIFJlc2VydmUgc3BhY2UgZm9yIHN0YWNraW5nIHdoZW4gcGF1c2UgYnV0dG9uIGlzIHByZXNlbnQgKGJ1dHRvbiBleHRlbmRzIG91dHNpZGUgdG9hc3QgY29ybmVyKSAqL1xcclxcbi5BUFgtdG9hc3QtLWhhcy1wcm9ncmVzcy10b3AuQVBYLXRvYXN0LS1oYXMtcHJvZ3Jlc3MtcGF1c2UgeyBtYXJnaW4tdG9wOiBjYWxjKHZhcigtLWFweC10b2FzdC1wcm9ncmVzcy1wYXVzZS1zaXplLCAxOHB4KSAvIDIpOyB9XFxyXFxuLkFQWC10b2FzdC0taGFzLXByb2dyZXNzLWJvdHRvbS5BUFgtdG9hc3QtLWhhcy1wcm9ncmVzcy1wYXVzZSB7IG1hcmdpbi1ib3R0b206IGNhbGModmFyKC0tYXB4LXRvYXN0LXByb2dyZXNzLXBhdXNlLXNpemUsIDE4cHgpIC8gMik7IH1cXHJcXG5cXHJcXG4vKiBBbmltYXRpb25zICovXFxyXFxuLkFQWC10b2FzdC0tZW50ZXIgeyBvcGFjaXR5OiAwOyB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoOHB4KTsgfVxcclxcbi5BUFgtdG9hc3QtLWVudGVyLkFQWC10b2FzdC0tZW50ZXItYWN0aXZlIHsgb3BhY2l0eTogMTsgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKDApOyB9XFxyXFxuLkFQWC10b2FzdC0tZXhpdCB7IG9wYWNpdHk6IDE7IHRyYW5zZm9ybTogdHJhbnNsYXRlWSgwKTsgfVxcclxcbi5BUFgtdG9hc3QtLWV4aXQuQVBYLXRvYXN0LS1leGl0LWFjdGl2ZSB7IG9wYWNpdHk6IDA7IHRyYW5zZm9ybTogdHJhbnNsYXRlWSg4cHgpOyB9XFxyXFxuXFxyXFxuXFxyXFxuXCJdLFwic291cmNlUm9vdFwiOlwiXCJ9XSk7XG4vLyBFeHBvcnRzXG5leHBvcnQgZGVmYXVsdCBfX19DU1NfTE9BREVSX0VYUE9SVF9fXztcbiIsIi8vIEltcG9ydHNcbmltcG9ydCBfX19DU1NfTE9BREVSX0FQSV9TT1VSQ0VNQVBfSU1QT1JUX19fIGZyb20gXCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L3J1bnRpbWUvc291cmNlTWFwcy5qc1wiO1xuaW1wb3J0IF9fX0NTU19MT0FERVJfQVBJX0lNUE9SVF9fXyBmcm9tIFwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL2FwaS5qc1wiO1xuaW1wb3J0IF9fX0NTU19MT0FERVJfR0VUX1VSTF9JTVBPUlRfX18gZnJvbSBcIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9nZXRVcmwuanNcIjtcbnZhciBfX19DU1NfTE9BREVSX1VSTF9JTVBPUlRfMF9fXyA9IG5ldyBVUkwoXCJkYXRhOmltYWdlL3N2Zyt4bWwsJTNDc3ZnIHhtbG5zPSUyN2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJTI3IHdpZHRoPSUyNzMyJTI3IGhlaWdodD0lMjczMiUyNyB2aWV3Qm94PSUyNzAgMCAzMiAzMiUyNyUzRSUzQ21hc2sgaWQ9JTI3ZnJhbWUtY3V0b3V0JTI3JTNFJTNDcmVjdCB3aWR0aD0lMjczMiUyNyBoZWlnaHQ9JTI3MzIlMjcgZmlsbD0lMjclMjNmZmYlMjcvJTNFJTNDcmVjdCB4PSUyNzMlMjcgeT0lMjczJTI3IHdpZHRoPSUyNzI2JTI3IGhlaWdodD0lMjcyNiUyNyByeD0lMjc0JTI3IHJ5PSUyNzQlMjcgZmlsbD0lMjclMjMwMDAlMjcvJTNFJTNDL21hc2slM0UlM0NyZWN0IHdpZHRoPSUyNzMyJTI3IGhlaWdodD0lMjczMiUyNyBmaWxsPSUyNyUyM2NjY2NjYyUyNyBtYXNrPSUyN3VybCUyOCUyM2ZyYW1lLWN1dG91dCUyOSUyNy8lM0UlM0Mvc3ZnJTNFXCIsIGltcG9ydC5tZXRhLnVybCk7XG52YXIgX19fQ1NTX0xPQURFUl9VUkxfSU1QT1JUXzFfX18gPSBuZXcgVVJMKFwiZGF0YTppbWFnZS9zdmcreG1sLCUzQ3N2ZyB4bWxucz0lMjdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyUyNyB3aWR0aD0lMjczMiUyNyBoZWlnaHQ9JTI3MzIlMjcgdmlld0JveD0lMjcwIDAgMzIgMzIlMjclM0UlM0NwYXRoIGQ9JTI3TTggMTZoMTYlMjcgZmlsbD0lMjdub25lJTI3IHN0cm9rZT0lMjclMjNmZmYlMjcgc3Ryb2tlLXdpZHRoPSUyNzMlMjcgc3Ryb2tlLWxpbmVjYXA9JTI3cm91bmQlMjcvJTNFJTNDL3N2ZyUzRVwiLCBpbXBvcnQubWV0YS51cmwpO1xudmFyIF9fX0NTU19MT0FERVJfVVJMX0lNUE9SVF8yX19fID0gbmV3IFVSTChcImRhdGE6aW1hZ2Uvc3ZnK3htbCwlM0NzdmcgeG1sbnM9JTI3aHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmclMjcgd2lkdGg9JTI3MzIlMjcgaGVpZ2h0PSUyNzMyJTI3IHZpZXdCb3g9JTI3MCAwIDMyIDMyJTI3JTNFJTNDcGF0aCBkPSUyN002IDE3TDEyIDIzTDI2IDklMjcgZmlsbD0lMjdub25lJTI3IHN0cm9rZT0lMjclMjNmZmYlMjcgc3Ryb2tlLXdpZHRoPSUyNzMlMjcgc3Ryb2tlLWxpbmVjYXA9JTI3cm91bmQlMjcgc3Ryb2tlLWxpbmVqb2luPSUyN3JvdW5kJTI3LyUzRSUzQy9zdmclM0VcIiwgaW1wb3J0Lm1ldGEudXJsKTtcbnZhciBfX19DU1NfTE9BREVSX1VSTF9JTVBPUlRfM19fXyA9IG5ldyBVUkwoXCJkYXRhOmltYWdlL3N2Zyt4bWwsJTNDc3ZnIHhtbG5zPSUyN2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJTI3IHdpZHRoPSUyNzMyJTI3IGhlaWdodD0lMjczMiUyNyB2aWV3Qm94PSUyNzAgMCAzMiAzMiUyNyUzRSUzQ3BhdGggZD0lMjdNOCA4TDI0IDI0TTI0IDhMOCAyNCUyNyBmaWxsPSUyN25vbmUlMjcgc3Ryb2tlPSUyNyUyM2ZmZiUyNyBzdHJva2Utd2lkdGg9JTI3MyUyNyBzdHJva2UtbGluZWNhcD0lMjdyb3VuZCUyNyBzdHJva2UtbGluZWpvaW49JTI3cm91bmQlMjcvJTNFJTNDL3N2ZyUzRVwiLCBpbXBvcnQubWV0YS51cmwpO1xudmFyIF9fX0NTU19MT0FERVJfRVhQT1JUX19fID0gX19fQ1NTX0xPQURFUl9BUElfSU1QT1JUX19fKF9fX0NTU19MT0FERVJfQVBJX1NPVVJDRU1BUF9JTVBPUlRfX18pO1xudmFyIF9fX0NTU19MT0FERVJfVVJMX1JFUExBQ0VNRU5UXzBfX18gPSBfX19DU1NfTE9BREVSX0dFVF9VUkxfSU1QT1JUX19fKF9fX0NTU19MT0FERVJfVVJMX0lNUE9SVF8wX19fKTtcbnZhciBfX19DU1NfTE9BREVSX1VSTF9SRVBMQUNFTUVOVF8xX19fID0gX19fQ1NTX0xPQURFUl9HRVRfVVJMX0lNUE9SVF9fXyhfX19DU1NfTE9BREVSX1VSTF9JTVBPUlRfMV9fXyk7XG52YXIgX19fQ1NTX0xPQURFUl9VUkxfUkVQTEFDRU1FTlRfMl9fXyA9IF9fX0NTU19MT0FERVJfR0VUX1VSTF9JTVBPUlRfX18oX19fQ1NTX0xPQURFUl9VUkxfSU1QT1JUXzJfX18pO1xudmFyIF9fX0NTU19MT0FERVJfVVJMX1JFUExBQ0VNRU5UXzNfX18gPSBfX19DU1NfTE9BREVSX0dFVF9VUkxfSU1QT1JUX19fKF9fX0NTU19MT0FERVJfVVJMX0lNUE9SVF8zX19fKTtcbi8vIE1vZHVsZVxuX19fQ1NTX0xPQURFUl9FWFBPUlRfX18ucHVzaChbbW9kdWxlLmlkLCBgLmFweC10cmlzdGF0ZSB7XG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICAgIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7XG4gICAgdGV4dC1hbGlnbjogY2VudGVyO1xuICAgIGN1cnNvcjogcG9pbnRlcjtcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgbWluLXdpZHRoOjEzcHg7XG4gICAgbWluLWhlaWdodDoxM3B4O1xuICAgIGJhY2tncm91bmQtc2l6ZTogY29udGFpbjtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDtcbiAgICBib3JkZXItcmFkaXVzOjNweDtcbiAgICAtLWFweC10cmlzdGF0ZS10aWNrLWNvbG9yOiB0cmFuc3BhcmVudDtcbiAgICAtLWFweC10cmlzdGF0ZS1jaGVja2VkLWNvbG9yOiAjMDY1NGJhO1xuICAgIC0tYXB4LXRyaXN0YXRlLWNyb3NzZWQtY29sb3I6ICNmMDA7XG59XG4uYXB4LXRyaXN0YXRlLnVuY2hlY2tlZCB7XG4gICAgYmFja2dyb3VuZC1pbWFnZTogdXJsKCR7X19fQ1NTX0xPQURFUl9VUkxfUkVQTEFDRU1FTlRfMF9fX30pO1xufVxuLmFweC10cmlzdGF0ZS51bmNoZWNrZWQuYXB4LXRyaXN0YXRlLS11bmNoZWNrZWQtaW5kZXRlcm1pbmF0ZTo6YWZ0ZXIge1xuICAgIGNvbnRlbnQ6ICcnO1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICBpbnNldDogMDtcbiAgICBkaXNwbGF5OiBibG9jaztcbiAgICBwb2ludGVyLWV2ZW50czogbm9uZTtcbn1cbi8qIFdoZW4gLS1taXhlZCBpcyB1c2VkIChlLmcuIHBhcmVudCArIHN1Yi1jaGVja2JveGVzKSwgZGFzaCBzaG93cyBvbmx5IHdoZW4gY2hpbGRyZW4gYXJlIG1peGVkICovXG4uYXB4LXRyaXN0YXRlLnVuY2hlY2tlZC5hcHgtdHJpc3RhdGUtLWluZGV0ZXJtaW5hdGUtZGFzaDpub3QoLmFweC10cmlzdGF0ZS0tbWl4ZWQpOjpiZWZvcmUsXG4uYXB4LXRyaXN0YXRlLnVuY2hlY2tlZC5hcHgtdHJpc3RhdGUtLWluZGV0ZXJtaW5hdGUtZGFzaDpub3QoLmFweC10cmlzdGF0ZS0tbWl4ZWQpOjphZnRlciB7XG4gICAgZGlzcGxheTogbm9uZTtcbn1cbi5hcHgtdHJpc3RhdGUudW5jaGVja2VkLmFweC10cmlzdGF0ZS0taW5kZXRlcm1pbmF0ZS1kYXNoOjpiZWZvcmUge1xuICAgIGNvbnRlbnQ6ICcnO1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICBpbnNldDogMDtcbiAgICBkaXNwbGF5OiBibG9jaztcbiAgICBwb2ludGVyLWV2ZW50czogbm9uZTtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1hcHgtdHJpc3RhdGUtY2hlY2tlZC1jb2xvcik7XG4gICAgYm9yZGVyLXJhZGl1czogaW5oZXJpdDtcbn1cbi5hcHgtdHJpc3RhdGUudW5jaGVja2VkLmFweC10cmlzdGF0ZS0taW5kZXRlcm1pbmF0ZS1kYXNoOjphZnRlciB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tYXB4LXRyaXN0YXRlLXRpY2stY29sb3IpO1xuICAgIC13ZWJraXQtbWFzay1yZXBlYXQ6IG5vLXJlcGVhdDtcbiAgICAtd2Via2l0LW1hc2stcG9zaXRpb246IGNlbnRlcjtcbiAgICAtd2Via2l0LW1hc2stc2l6ZTogMTAwJSAxMDAlO1xuICAgIC13ZWJraXQtbWFzay1tb2RlOiBhbHBoYTtcbiAgICBtYXNrLXJlcGVhdDogbm8tcmVwZWF0O1xuICAgIG1hc2stcG9zaXRpb246IGNlbnRlcjtcbiAgICBtYXNrLXNpemU6IDEwMCUgMTAwJTtcbiAgICBtYXNrLW1vZGU6IGFscGhhO1xuICAgIC13ZWJraXQtbWFzay1pbWFnZTogdXJsKCR7X19fQ1NTX0xPQURFUl9VUkxfUkVQTEFDRU1FTlRfMV9fX30pO1xuICAgIG1hc2staW1hZ2U6IHVybCgke19fX0NTU19MT0FERVJfVVJMX1JFUExBQ0VNRU5UXzFfX199KTtcbn1cbi5hcHgtdHJpc3RhdGUudW5jaGVja2VkLmFweC10cmlzdGF0ZS0taW5kZXRlcm1pbmF0ZS1maWxsZWQtY2hlY2s6OmFmdGVyIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1hcHgtdHJpc3RhdGUtY2hlY2tlZC1jb2xvcik7XG4gICAgYm9yZGVyLXJhZGl1czogaW5oZXJpdDtcbn1cbi5hcHgtdHJpc3RhdGUuY2hlY2tlZCB7XG4gICAgYmFja2dyb3VuZC1pbWFnZTogbm9uZTtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1hcHgtdHJpc3RhdGUtY2hlY2tlZC1jb2xvcik7XG59XG4uYXB4LXRyaXN0YXRlLmNyb3NzZWQge1xuICAgIGJhY2tncm91bmQtaW1hZ2U6IG5vbmU7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tYXB4LXRyaXN0YXRlLWNyb3NzZWQtY29sb3IpO1xufVxuXG4uYXB4LXRyaXN0YXRlLmNoZWNrZWQ6OmFmdGVyLFxuLmFweC10cmlzdGF0ZS5jcm9zc2VkOjphZnRlciB7XG4gICAgY29udGVudDogJyc7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIGluc2V0OiAwO1xuICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWFweC10cmlzdGF0ZS10aWNrLWNvbG9yKTtcbiAgICAtd2Via2l0LW1hc2stcmVwZWF0OiBuby1yZXBlYXQ7XG4gICAgLXdlYmtpdC1tYXNrLXBvc2l0aW9uOiBjZW50ZXI7XG4gICAgLXdlYmtpdC1tYXNrLXNpemU6IDEwMCUgMTAwJTtcbiAgICAtd2Via2l0LW1hc2stbW9kZTogYWxwaGE7XG4gICAgbWFzay1yZXBlYXQ6IG5vLXJlcGVhdDtcbiAgICBtYXNrLXBvc2l0aW9uOiBjZW50ZXI7XG4gICAgbWFzay1zaXplOiAxMDAlIDEwMCU7XG4gICAgbWFzay1tb2RlOiBhbHBoYTtcbiAgICBwb2ludGVyLWV2ZW50czogbm9uZTtcbn1cblxuLmFweC10cmlzdGF0ZS5jaGVja2VkOjphZnRlciB7XG4gICAgLXdlYmtpdC1tYXNrLWltYWdlOiB1cmwoJHtfX19DU1NfTE9BREVSX1VSTF9SRVBMQUNFTUVOVF8yX19ffSk7XG4gICAgbWFzay1pbWFnZTogdXJsKCR7X19fQ1NTX0xPQURFUl9VUkxfUkVQTEFDRU1FTlRfMl9fX30pO1xufVxuXG4uYXB4LXRyaXN0YXRlLmNyb3NzZWQ6OmFmdGVyIHtcbiAgICAtd2Via2l0LW1hc2staW1hZ2U6IHVybCgke19fX0NTU19MT0FERVJfVVJMX1JFUExBQ0VNRU5UXzNfX199KTtcbiAgICBtYXNrLWltYWdlOiB1cmwoJHtfX19DU1NfTE9BREVSX1VSTF9SRVBMQUNFTUVOVF8zX19ffSk7XG59YCwgXCJcIix7XCJ2ZXJzaW9uXCI6MyxcInNvdXJjZXNcIjpbXCJ3ZWJwYWNrOi8vLi9tb2R1bGVzL3RyaXN0YXRlL2Nzcy90cmlzdGF0ZS5jc3NcIl0sXCJuYW1lc1wiOltdLFwibWFwcGluZ3NcIjpcIkFBQUE7SUFDSSxxQkFBcUI7SUFDckIsc0JBQXNCO0lBQ3RCLGtCQUFrQjtJQUNsQixlQUFlO0lBQ2Ysa0JBQWtCO0lBQ2xCLGNBQWM7SUFDZCxlQUFlO0lBQ2Ysd0JBQXdCO0lBQ3hCLDZCQUE2QjtJQUM3QixpQkFBaUI7SUFDakIsc0NBQXNDO0lBQ3RDLHFDQUFxQztJQUNyQyxrQ0FBa0M7QUFDdEM7QUFDQTtJQUNJLHlEQUE2WDtBQUNqWTtBQUNBO0lBQ0ksV0FBVztJQUNYLGtCQUFrQjtJQUNsQixRQUFRO0lBQ1IsY0FBYztJQUNkLG9CQUFvQjtBQUN4QjtBQUNBLGlHQUFpRztBQUNqRzs7SUFFSSxhQUFhO0FBQ2pCO0FBQ0E7SUFDSSxXQUFXO0lBQ1gsa0JBQWtCO0lBQ2xCLFFBQVE7SUFDUixjQUFjO0lBQ2Qsb0JBQW9CO0lBQ3BCLG1EQUFtRDtJQUNuRCxzQkFBc0I7QUFDMUI7QUFDQTtJQUNJLGdEQUFnRDtJQUNoRCw4QkFBOEI7SUFDOUIsNkJBQTZCO0lBQzdCLDRCQUE0QjtJQUM1Qix3QkFBd0I7SUFDeEIsc0JBQXNCO0lBQ3RCLHFCQUFxQjtJQUNyQixvQkFBb0I7SUFDcEIsZ0JBQWdCO0lBQ2hCLDJEQUEyTztJQUMzTyxtREFBbU87QUFDdk87QUFDQTtJQUNJLG1EQUFtRDtJQUNuRCxzQkFBc0I7QUFDMUI7QUFDQTtJQUNJLHNCQUFzQjtJQUN0QixtREFBbUQ7QUFDdkQ7QUFDQTtJQUNJLHNCQUFzQjtJQUN0QixtREFBbUQ7QUFDdkQ7O0FBRUE7O0lBRUksV0FBVztJQUNYLGtCQUFrQjtJQUNsQixRQUFRO0lBQ1IsY0FBYztJQUNkLGdEQUFnRDtJQUNoRCw4QkFBOEI7SUFDOUIsNkJBQTZCO0lBQzdCLDRCQUE0QjtJQUM1Qix3QkFBd0I7SUFDeEIsc0JBQXNCO0lBQ3RCLHFCQUFxQjtJQUNyQixvQkFBb0I7SUFDcEIsZ0JBQWdCO0lBQ2hCLG9CQUFvQjtBQUN4Qjs7QUFFQTtJQUNJLDJEQUEyUTtJQUMzUSxtREFBbVE7QUFDdlE7O0FBRUE7SUFDSSwyREFBK1E7SUFDL1EsbURBQXVRO0FBQzNRXCIsXCJzb3VyY2VzQ29udGVudFwiOltcIi5hcHgtdHJpc3RhdGUge1xcbiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XFxuICAgIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7XFxuICAgIHRleHQtYWxpZ246IGNlbnRlcjtcXG4gICAgY3Vyc29yOiBwb2ludGVyO1xcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XFxuICAgIG1pbi13aWR0aDoxM3B4O1xcbiAgICBtaW4taGVpZ2h0OjEzcHg7XFxuICAgIGJhY2tncm91bmQtc2l6ZTogY29udGFpbjtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7XFxuICAgIGJvcmRlci1yYWRpdXM6M3B4O1xcbiAgICAtLWFweC10cmlzdGF0ZS10aWNrLWNvbG9yOiB0cmFuc3BhcmVudDtcXG4gICAgLS1hcHgtdHJpc3RhdGUtY2hlY2tlZC1jb2xvcjogIzA2NTRiYTtcXG4gICAgLS1hcHgtdHJpc3RhdGUtY3Jvc3NlZC1jb2xvcjogI2YwMDtcXG59XFxuLmFweC10cmlzdGF0ZS51bmNoZWNrZWQge1xcbiAgICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoXFxcImRhdGE6aW1hZ2Uvc3ZnK3htbCwlM0NzdmcgeG1sbnM9J2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJyB3aWR0aD0nMzInIGhlaWdodD0nMzInIHZpZXdCb3g9JzAgMCAzMiAzMiclM0UlM0NtYXNrIGlkPSdmcmFtZS1jdXRvdXQnJTNFJTNDcmVjdCB3aWR0aD0nMzInIGhlaWdodD0nMzInIGZpbGw9JyUyM2ZmZicvJTNFJTNDcmVjdCB4PSczJyB5PSczJyB3aWR0aD0nMjYnIGhlaWdodD0nMjYnIHJ4PSc0JyByeT0nNCcgZmlsbD0nJTIzMDAwJy8lM0UlM0MvbWFzayUzRSUzQ3JlY3Qgd2lkdGg9JzMyJyBoZWlnaHQ9JzMyJyBmaWxsPSclMjNjY2NjY2MnIG1hc2s9J3VybCglMjNmcmFtZS1jdXRvdXQpJy8lM0UlM0Mvc3ZnJTNFXFxcIik7XFxufVxcbi5hcHgtdHJpc3RhdGUudW5jaGVja2VkLmFweC10cmlzdGF0ZS0tdW5jaGVja2VkLWluZGV0ZXJtaW5hdGU6OmFmdGVyIHtcXG4gICAgY29udGVudDogJyc7XFxuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXG4gICAgaW5zZXQ6IDA7XFxuICAgIGRpc3BsYXk6IGJsb2NrO1xcbiAgICBwb2ludGVyLWV2ZW50czogbm9uZTtcXG59XFxuLyogV2hlbiAtLW1peGVkIGlzIHVzZWQgKGUuZy4gcGFyZW50ICsgc3ViLWNoZWNrYm94ZXMpLCBkYXNoIHNob3dzIG9ubHkgd2hlbiBjaGlsZHJlbiBhcmUgbWl4ZWQgKi9cXG4uYXB4LXRyaXN0YXRlLnVuY2hlY2tlZC5hcHgtdHJpc3RhdGUtLWluZGV0ZXJtaW5hdGUtZGFzaDpub3QoLmFweC10cmlzdGF0ZS0tbWl4ZWQpOjpiZWZvcmUsXFxuLmFweC10cmlzdGF0ZS51bmNoZWNrZWQuYXB4LXRyaXN0YXRlLS1pbmRldGVybWluYXRlLWRhc2g6bm90KC5hcHgtdHJpc3RhdGUtLW1peGVkKTo6YWZ0ZXIge1xcbiAgICBkaXNwbGF5OiBub25lO1xcbn1cXG4uYXB4LXRyaXN0YXRlLnVuY2hlY2tlZC5hcHgtdHJpc3RhdGUtLWluZGV0ZXJtaW5hdGUtZGFzaDo6YmVmb3JlIHtcXG4gICAgY29udGVudDogJyc7XFxuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXG4gICAgaW5zZXQ6IDA7XFxuICAgIGRpc3BsYXk6IGJsb2NrO1xcbiAgICBwb2ludGVyLWV2ZW50czogbm9uZTtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tYXB4LXRyaXN0YXRlLWNoZWNrZWQtY29sb3IpO1xcbiAgICBib3JkZXItcmFkaXVzOiBpbmhlcml0O1xcbn1cXG4uYXB4LXRyaXN0YXRlLnVuY2hlY2tlZC5hcHgtdHJpc3RhdGUtLWluZGV0ZXJtaW5hdGUtZGFzaDo6YWZ0ZXIge1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1hcHgtdHJpc3RhdGUtdGljay1jb2xvcik7XFxuICAgIC13ZWJraXQtbWFzay1yZXBlYXQ6IG5vLXJlcGVhdDtcXG4gICAgLXdlYmtpdC1tYXNrLXBvc2l0aW9uOiBjZW50ZXI7XFxuICAgIC13ZWJraXQtbWFzay1zaXplOiAxMDAlIDEwMCU7XFxuICAgIC13ZWJraXQtbWFzay1tb2RlOiBhbHBoYTtcXG4gICAgbWFzay1yZXBlYXQ6IG5vLXJlcGVhdDtcXG4gICAgbWFzay1wb3NpdGlvbjogY2VudGVyO1xcbiAgICBtYXNrLXNpemU6IDEwMCUgMTAwJTtcXG4gICAgbWFzay1tb2RlOiBhbHBoYTtcXG4gICAgLXdlYmtpdC1tYXNrLWltYWdlOiB1cmwoXFxcImRhdGE6aW1hZ2Uvc3ZnK3htbCwlM0NzdmcgeG1sbnM9J2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJyB3aWR0aD0nMzInIGhlaWdodD0nMzInIHZpZXdCb3g9JzAgMCAzMiAzMiclM0UlM0NwYXRoIGQ9J004IDE2aDE2JyBmaWxsPSdub25lJyBzdHJva2U9JyUyM2ZmZicgc3Ryb2tlLXdpZHRoPSczJyBzdHJva2UtbGluZWNhcD0ncm91bmQnLyUzRSUzQy9zdmclM0VcXFwiKTtcXG4gICAgbWFzay1pbWFnZTogdXJsKFxcXCJkYXRhOmltYWdlL3N2Zyt4bWwsJTNDc3ZnIHhtbG5zPSdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Zycgd2lkdGg9JzMyJyBoZWlnaHQ9JzMyJyB2aWV3Qm94PScwIDAgMzIgMzInJTNFJTNDcGF0aCBkPSdNOCAxNmgxNicgZmlsbD0nbm9uZScgc3Ryb2tlPSclMjNmZmYnIHN0cm9rZS13aWR0aD0nMycgc3Ryb2tlLWxpbmVjYXA9J3JvdW5kJy8lM0UlM0Mvc3ZnJTNFXFxcIik7XFxufVxcbi5hcHgtdHJpc3RhdGUudW5jaGVja2VkLmFweC10cmlzdGF0ZS0taW5kZXRlcm1pbmF0ZS1maWxsZWQtY2hlY2s6OmFmdGVyIHtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tYXB4LXRyaXN0YXRlLWNoZWNrZWQtY29sb3IpO1xcbiAgICBib3JkZXItcmFkaXVzOiBpbmhlcml0O1xcbn1cXG4uYXB4LXRyaXN0YXRlLmNoZWNrZWQge1xcbiAgICBiYWNrZ3JvdW5kLWltYWdlOiBub25lO1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1hcHgtdHJpc3RhdGUtY2hlY2tlZC1jb2xvcik7XFxufVxcbi5hcHgtdHJpc3RhdGUuY3Jvc3NlZCB7XFxuICAgIGJhY2tncm91bmQtaW1hZ2U6IG5vbmU7XFxuICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWFweC10cmlzdGF0ZS1jcm9zc2VkLWNvbG9yKTtcXG59XFxuXFxuLmFweC10cmlzdGF0ZS5jaGVja2VkOjphZnRlcixcXG4uYXB4LXRyaXN0YXRlLmNyb3NzZWQ6OmFmdGVyIHtcXG4gICAgY29udGVudDogJyc7XFxuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXG4gICAgaW5zZXQ6IDA7XFxuICAgIGRpc3BsYXk6IGJsb2NrO1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1hcHgtdHJpc3RhdGUtdGljay1jb2xvcik7XFxuICAgIC13ZWJraXQtbWFzay1yZXBlYXQ6IG5vLXJlcGVhdDtcXG4gICAgLXdlYmtpdC1tYXNrLXBvc2l0aW9uOiBjZW50ZXI7XFxuICAgIC13ZWJraXQtbWFzay1zaXplOiAxMDAlIDEwMCU7XFxuICAgIC13ZWJraXQtbWFzay1tb2RlOiBhbHBoYTtcXG4gICAgbWFzay1yZXBlYXQ6IG5vLXJlcGVhdDtcXG4gICAgbWFzay1wb3NpdGlvbjogY2VudGVyO1xcbiAgICBtYXNrLXNpemU6IDEwMCUgMTAwJTtcXG4gICAgbWFzay1tb2RlOiBhbHBoYTtcXG4gICAgcG9pbnRlci1ldmVudHM6IG5vbmU7XFxufVxcblxcbi5hcHgtdHJpc3RhdGUuY2hlY2tlZDo6YWZ0ZXIge1xcbiAgICAtd2Via2l0LW1hc2staW1hZ2U6IHVybChcXFwiZGF0YTppbWFnZS9zdmcreG1sLCUzQ3N2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHdpZHRoPSczMicgaGVpZ2h0PSczMicgdmlld0JveD0nMCAwIDMyIDMyJyUzRSUzQ3BhdGggZD0nTTYgMTdMMTIgMjNMMjYgOScgZmlsbD0nbm9uZScgc3Ryb2tlPSclMjNmZmYnIHN0cm9rZS13aWR0aD0nMycgc3Ryb2tlLWxpbmVjYXA9J3JvdW5kJyBzdHJva2UtbGluZWpvaW49J3JvdW5kJy8lM0UlM0Mvc3ZnJTNFXFxcIik7XFxuICAgIG1hc2staW1hZ2U6IHVybChcXFwiZGF0YTppbWFnZS9zdmcreG1sLCUzQ3N2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHdpZHRoPSczMicgaGVpZ2h0PSczMicgdmlld0JveD0nMCAwIDMyIDMyJyUzRSUzQ3BhdGggZD0nTTYgMTdMMTIgMjNMMjYgOScgZmlsbD0nbm9uZScgc3Ryb2tlPSclMjNmZmYnIHN0cm9rZS13aWR0aD0nMycgc3Ryb2tlLWxpbmVjYXA9J3JvdW5kJyBzdHJva2UtbGluZWpvaW49J3JvdW5kJy8lM0UlM0Mvc3ZnJTNFXFxcIik7XFxufVxcblxcbi5hcHgtdHJpc3RhdGUuY3Jvc3NlZDo6YWZ0ZXIge1xcbiAgICAtd2Via2l0LW1hc2staW1hZ2U6IHVybChcXFwiZGF0YTppbWFnZS9zdmcreG1sLCUzQ3N2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHdpZHRoPSczMicgaGVpZ2h0PSczMicgdmlld0JveD0nMCAwIDMyIDMyJyUzRSUzQ3BhdGggZD0nTTggOEwyNCAyNE0yNCA4TDggMjQnIGZpbGw9J25vbmUnIHN0cm9rZT0nJTIzZmZmJyBzdHJva2Utd2lkdGg9JzMnIHN0cm9rZS1saW5lY2FwPSdyb3VuZCcgc3Ryb2tlLWxpbmVqb2luPSdyb3VuZCcvJTNFJTNDL3N2ZyUzRVxcXCIpO1xcbiAgICBtYXNrLWltYWdlOiB1cmwoXFxcImRhdGE6aW1hZ2Uvc3ZnK3htbCwlM0NzdmcgeG1sbnM9J2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJyB3aWR0aD0nMzInIGhlaWdodD0nMzInIHZpZXdCb3g9JzAgMCAzMiAzMiclM0UlM0NwYXRoIGQ9J004IDhMMjQgMjRNMjQgOEw4IDI0JyBmaWxsPSdub25lJyBzdHJva2U9JyUyM2ZmZicgc3Ryb2tlLXdpZHRoPSczJyBzdHJva2UtbGluZWNhcD0ncm91bmQnIHN0cm9rZS1saW5lam9pbj0ncm91bmQnLyUzRSUzQy9zdmclM0VcXFwiKTtcXG59XCJdLFwic291cmNlUm9vdFwiOlwiXCJ9XSk7XG4vLyBFeHBvcnRzXG5leHBvcnQgZGVmYXVsdCBfX19DU1NfTE9BREVSX0VYUE9SVF9fXztcbiIsIlwidXNlIHN0cmljdFwiO1xuXG4vKlxuICBNSVQgTGljZW5zZSBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL21pdC1saWNlbnNlLnBocFxuICBBdXRob3IgVG9iaWFzIEtvcHBlcnMgQHNva3JhXG4qL1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoY3NzV2l0aE1hcHBpbmdUb1N0cmluZykge1xuICB2YXIgbGlzdCA9IFtdO1xuXG4gIC8vIHJldHVybiB0aGUgbGlzdCBvZiBtb2R1bGVzIGFzIGNzcyBzdHJpbmdcbiAgbGlzdC50b1N0cmluZyA9IGZ1bmN0aW9uIHRvU3RyaW5nKCkge1xuICAgIHJldHVybiB0aGlzLm1hcChmdW5jdGlvbiAoaXRlbSkge1xuICAgICAgdmFyIGNvbnRlbnQgPSBcIlwiO1xuICAgICAgdmFyIG5lZWRMYXllciA9IHR5cGVvZiBpdGVtWzVdICE9PSBcInVuZGVmaW5lZFwiO1xuICAgICAgaWYgKGl0ZW1bNF0pIHtcbiAgICAgICAgY29udGVudCArPSBcIkBzdXBwb3J0cyAoXCIuY29uY2F0KGl0ZW1bNF0sIFwiKSB7XCIpO1xuICAgICAgfVxuICAgICAgaWYgKGl0ZW1bMl0pIHtcbiAgICAgICAgY29udGVudCArPSBcIkBtZWRpYSBcIi5jb25jYXQoaXRlbVsyXSwgXCIge1wiKTtcbiAgICAgIH1cbiAgICAgIGlmIChuZWVkTGF5ZXIpIHtcbiAgICAgICAgY29udGVudCArPSBcIkBsYXllclwiLmNvbmNhdChpdGVtWzVdLmxlbmd0aCA+IDAgPyBcIiBcIi5jb25jYXQoaXRlbVs1XSkgOiBcIlwiLCBcIiB7XCIpO1xuICAgICAgfVxuICAgICAgY29udGVudCArPSBjc3NXaXRoTWFwcGluZ1RvU3RyaW5nKGl0ZW0pO1xuICAgICAgaWYgKG5lZWRMYXllcikge1xuICAgICAgICBjb250ZW50ICs9IFwifVwiO1xuICAgICAgfVxuICAgICAgaWYgKGl0ZW1bMl0pIHtcbiAgICAgICAgY29udGVudCArPSBcIn1cIjtcbiAgICAgIH1cbiAgICAgIGlmIChpdGVtWzRdKSB7XG4gICAgICAgIGNvbnRlbnQgKz0gXCJ9XCI7XG4gICAgICB9XG4gICAgICByZXR1cm4gY29udGVudDtcbiAgICB9KS5qb2luKFwiXCIpO1xuICB9O1xuXG4gIC8vIGltcG9ydCBhIGxpc3Qgb2YgbW9kdWxlcyBpbnRvIHRoZSBsaXN0XG4gIGxpc3QuaSA9IGZ1bmN0aW9uIGkobW9kdWxlcywgbWVkaWEsIGRlZHVwZSwgc3VwcG9ydHMsIGxheWVyKSB7XG4gICAgaWYgKHR5cGVvZiBtb2R1bGVzID09PSBcInN0cmluZ1wiKSB7XG4gICAgICBtb2R1bGVzID0gW1tudWxsLCBtb2R1bGVzLCB1bmRlZmluZWRdXTtcbiAgICB9XG4gICAgdmFyIGFscmVhZHlJbXBvcnRlZE1vZHVsZXMgPSB7fTtcbiAgICBpZiAoZGVkdXBlKSB7XG4gICAgICBmb3IgKHZhciBrID0gMDsgayA8IHRoaXMubGVuZ3RoOyBrKyspIHtcbiAgICAgICAgdmFyIGlkID0gdGhpc1trXVswXTtcbiAgICAgICAgaWYgKGlkICE9IG51bGwpIHtcbiAgICAgICAgICBhbHJlYWR5SW1wb3J0ZWRNb2R1bGVzW2lkXSA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgZm9yICh2YXIgX2sgPSAwOyBfayA8IG1vZHVsZXMubGVuZ3RoOyBfaysrKSB7XG4gICAgICB2YXIgaXRlbSA9IFtdLmNvbmNhdChtb2R1bGVzW19rXSk7XG4gICAgICBpZiAoZGVkdXBlICYmIGFscmVhZHlJbXBvcnRlZE1vZHVsZXNbaXRlbVswXV0pIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBpZiAodHlwZW9mIGxheWVyICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgIGlmICh0eXBlb2YgaXRlbVs1XSA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICAgIGl0ZW1bNV0gPSBsYXllcjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpdGVtWzFdID0gXCJAbGF5ZXJcIi5jb25jYXQoaXRlbVs1XS5sZW5ndGggPiAwID8gXCIgXCIuY29uY2F0KGl0ZW1bNV0pIDogXCJcIiwgXCIge1wiKS5jb25jYXQoaXRlbVsxXSwgXCJ9XCIpO1xuICAgICAgICAgIGl0ZW1bNV0gPSBsYXllcjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKG1lZGlhKSB7XG4gICAgICAgIGlmICghaXRlbVsyXSkge1xuICAgICAgICAgIGl0ZW1bMl0gPSBtZWRpYTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpdGVtWzFdID0gXCJAbWVkaWEgXCIuY29uY2F0KGl0ZW1bMl0sIFwiIHtcIikuY29uY2F0KGl0ZW1bMV0sIFwifVwiKTtcbiAgICAgICAgICBpdGVtWzJdID0gbWVkaWE7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChzdXBwb3J0cykge1xuICAgICAgICBpZiAoIWl0ZW1bNF0pIHtcbiAgICAgICAgICBpdGVtWzRdID0gXCJcIi5jb25jYXQoc3VwcG9ydHMpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGl0ZW1bMV0gPSBcIkBzdXBwb3J0cyAoXCIuY29uY2F0KGl0ZW1bNF0sIFwiKSB7XCIpLmNvbmNhdChpdGVtWzFdLCBcIn1cIik7XG4gICAgICAgICAgaXRlbVs0XSA9IHN1cHBvcnRzO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBsaXN0LnB1c2goaXRlbSk7XG4gICAgfVxuICB9O1xuICByZXR1cm4gbGlzdDtcbn07IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKHVybCwgb3B0aW9ucykge1xuICBpZiAoIW9wdGlvbnMpIHtcbiAgICBvcHRpb25zID0ge307XG4gIH1cbiAgaWYgKCF1cmwpIHtcbiAgICByZXR1cm4gdXJsO1xuICB9XG4gIHVybCA9IFN0cmluZyh1cmwuX19lc01vZHVsZSA/IHVybC5kZWZhdWx0IDogdXJsKTtcblxuICAvLyBJZiB1cmwgaXMgYWxyZWFkeSB3cmFwcGVkIGluIHF1b3RlcywgcmVtb3ZlIHRoZW1cbiAgaWYgKC9eWydcIl0uKlsnXCJdJC8udGVzdCh1cmwpKSB7XG4gICAgdXJsID0gdXJsLnNsaWNlKDEsIC0xKTtcbiAgfVxuICBpZiAob3B0aW9ucy5oYXNoKSB7XG4gICAgdXJsICs9IG9wdGlvbnMuaGFzaDtcbiAgfVxuXG4gIC8vIFNob3VsZCB1cmwgYmUgd3JhcHBlZD9cbiAgLy8gU2VlIGh0dHBzOi8vZHJhZnRzLmNzc3dnLm9yZy9jc3MtdmFsdWVzLTMvI3VybHNcbiAgaWYgKC9bXCInKCkgXFx0XFxuXXwoJTIwKS8udGVzdCh1cmwpIHx8IG9wdGlvbnMubmVlZFF1b3Rlcykge1xuICAgIHJldHVybiBcIlxcXCJcIi5jb25jYXQodXJsLnJlcGxhY2UoL1wiL2csICdcXFxcXCInKS5yZXBsYWNlKC9cXG4vZywgXCJcXFxcblwiKSwgXCJcXFwiXCIpO1xuICB9XG4gIHJldHVybiB1cmw7XG59OyIsIlwidXNlIHN0cmljdFwiO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdGVtKSB7XG4gIHZhciBjb250ZW50ID0gaXRlbVsxXTtcbiAgdmFyIGNzc01hcHBpbmcgPSBpdGVtWzNdO1xuICBpZiAoIWNzc01hcHBpbmcpIHtcbiAgICByZXR1cm4gY29udGVudDtcbiAgfVxuICBpZiAodHlwZW9mIGJ0b2EgPT09IFwiZnVuY3Rpb25cIikge1xuICAgIHZhciBiYXNlNjQgPSBidG9hKHVuZXNjYXBlKGVuY29kZVVSSUNvbXBvbmVudChKU09OLnN0cmluZ2lmeShjc3NNYXBwaW5nKSkpKTtcbiAgICB2YXIgZGF0YSA9IFwic291cmNlTWFwcGluZ1VSTD1kYXRhOmFwcGxpY2F0aW9uL2pzb247Y2hhcnNldD11dGYtODtiYXNlNjQsXCIuY29uY2F0KGJhc2U2NCk7XG4gICAgdmFyIHNvdXJjZU1hcHBpbmcgPSBcIi8qIyBcIi5jb25jYXQoZGF0YSwgXCIgKi9cIik7XG4gICAgcmV0dXJuIFtjb250ZW50XS5jb25jYXQoW3NvdXJjZU1hcHBpbmddKS5qb2luKFwiXFxuXCIpO1xuICB9XG4gIHJldHVybiBbY29udGVudF0uam9pbihcIlxcblwiKTtcbn07IiwiLy8gTW9kdWxlXG52YXIgY29kZSA9IFwiPGRpdiBjbGFzcz1cXFwiQVBYLWRpYWxvZ1xcXCI+XFxyXFxuICAgIDxkaXYgY2xhc3M9XFxcIkFQWC1kaWFsb2ctY29udGVudFxcXCI+XFxyXFxuICAgICAgICA8c3BhbiBjbGFzcz1cXFwiQVBYLWNsb3NlLWRpYWxvZ1xcXCI+JnRpbWVzOzwvc3Bhbj5cXHJcXG4gICAgICAgIDxoMiBjbGFzcz1cXFwiQVBYLWRpYWxvZy10aXRsZVxcXCI+PC9oMj5cXHJcXG4gICAgICAgIDxkaXYgY2xhc3M9XFxcIkFQWC1kaWFsb2ctZHluYW1pYy1jb250ZW50XFxcIj48L2Rpdj5cXHJcXG4gICAgICAgIDxkaXYgY2xhc3M9XFxcIkFQWC1kaWFsb2ctYnV0dG9uLWNvbnRhaW5lclxcXCI+PC9kaXY+XFxyXFxuICAgIDwvZGl2PlxcclxcbjwvZGl2PlwiO1xuLy8gRXhwb3J0c1xubW9kdWxlLmV4cG9ydHMgPSBjb2RlOyIsIlxuICAgICAgaW1wb3J0IEFQSSBmcm9tIFwiIS4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luamVjdFN0eWxlc0ludG9TdHlsZVRhZy5qc1wiO1xuICAgICAgaW1wb3J0IGRvbUFQSSBmcm9tIFwiIS4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL3N0eWxlRG9tQVBJLmpzXCI7XG4gICAgICBpbXBvcnQgaW5zZXJ0Rm4gZnJvbSBcIiEuLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbnNlcnRCeVNlbGVjdG9yLmpzXCI7XG4gICAgICBpbXBvcnQgc2V0QXR0cmlidXRlcyBmcm9tIFwiIS4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL3NldEF0dHJpYnV0ZXNXaXRob3V0QXR0cmlidXRlcy5qc1wiO1xuICAgICAgaW1wb3J0IGluc2VydFN0eWxlRWxlbWVudCBmcm9tIFwiIS4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luc2VydFN0eWxlRWxlbWVudC5qc1wiO1xuICAgICAgaW1wb3J0IHN0eWxlVGFnVHJhbnNmb3JtRm4gZnJvbSBcIiEuLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9zdHlsZVRhZ1RyYW5zZm9ybS5qc1wiO1xuICAgICAgaW1wb3J0IGNvbnRlbnQsICogYXMgbmFtZWRFeHBvcnQgZnJvbSBcIiEhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9janMuanMhLi9kaWFsb2cuY3NzXCI7XG4gICAgICBcbiAgICAgIFxuXG52YXIgb3B0aW9ucyA9IHt9O1xuXG5vcHRpb25zLnN0eWxlVGFnVHJhbnNmb3JtID0gc3R5bGVUYWdUcmFuc2Zvcm1Gbjtcbm9wdGlvbnMuc2V0QXR0cmlidXRlcyA9IHNldEF0dHJpYnV0ZXM7XG5cbiAgICAgIG9wdGlvbnMuaW5zZXJ0ID0gaW5zZXJ0Rm4uYmluZChudWxsLCBcImhlYWRcIik7XG4gICAgXG5vcHRpb25zLmRvbUFQSSA9IGRvbUFQSTtcbm9wdGlvbnMuaW5zZXJ0U3R5bGVFbGVtZW50ID0gaW5zZXJ0U3R5bGVFbGVtZW50O1xuXG52YXIgdXBkYXRlID0gQVBJKGNvbnRlbnQsIG9wdGlvbnMpO1xuXG5cblxuZXhwb3J0ICogZnJvbSBcIiEhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9janMuanMhLi9kaWFsb2cuY3NzXCI7XG4gICAgICAgZXhwb3J0IGRlZmF1bHQgY29udGVudCAmJiBjb250ZW50LmxvY2FscyA/IGNvbnRlbnQubG9jYWxzIDogdW5kZWZpbmVkO1xuIiwiXG4gICAgICBpbXBvcnQgQVBJIGZyb20gXCIhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5qZWN0U3R5bGVzSW50b1N0eWxlVGFnLmpzXCI7XG4gICAgICBpbXBvcnQgZG9tQVBJIGZyb20gXCIhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvc3R5bGVEb21BUEkuanNcIjtcbiAgICAgIGltcG9ydCBpbnNlcnRGbiBmcm9tIFwiIS4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luc2VydEJ5U2VsZWN0b3IuanNcIjtcbiAgICAgIGltcG9ydCBzZXRBdHRyaWJ1dGVzIGZyb20gXCIhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvc2V0QXR0cmlidXRlc1dpdGhvdXRBdHRyaWJ1dGVzLmpzXCI7XG4gICAgICBpbXBvcnQgaW5zZXJ0U3R5bGVFbGVtZW50IGZyb20gXCIhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5zZXJ0U3R5bGVFbGVtZW50LmpzXCI7XG4gICAgICBpbXBvcnQgc3R5bGVUYWdUcmFuc2Zvcm1GbiBmcm9tIFwiIS4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL3N0eWxlVGFnVHJhbnNmb3JtLmpzXCI7XG4gICAgICBpbXBvcnQgY29udGVudCwgKiBhcyBuYW1lZEV4cG9ydCBmcm9tIFwiISEuLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L2Nqcy5qcyEuL3Njcm9sbGFibGVUYWJsZS5jc3NcIjtcbiAgICAgIFxuICAgICAgXG5cbnZhciBvcHRpb25zID0ge307XG5cbm9wdGlvbnMuc3R5bGVUYWdUcmFuc2Zvcm0gPSBzdHlsZVRhZ1RyYW5zZm9ybUZuO1xub3B0aW9ucy5zZXRBdHRyaWJ1dGVzID0gc2V0QXR0cmlidXRlcztcblxuICAgICAgb3B0aW9ucy5pbnNlcnQgPSBpbnNlcnRGbi5iaW5kKG51bGwsIFwiaGVhZFwiKTtcbiAgICBcbm9wdGlvbnMuZG9tQVBJID0gZG9tQVBJO1xub3B0aW9ucy5pbnNlcnRTdHlsZUVsZW1lbnQgPSBpbnNlcnRTdHlsZUVsZW1lbnQ7XG5cbnZhciB1cGRhdGUgPSBBUEkoY29udGVudCwgb3B0aW9ucyk7XG5cblxuXG5leHBvcnQgKiBmcm9tIFwiISEuLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L2Nqcy5qcyEuL3Njcm9sbGFibGVUYWJsZS5jc3NcIjtcbiAgICAgICBleHBvcnQgZGVmYXVsdCBjb250ZW50ICYmIGNvbnRlbnQubG9jYWxzID8gY29udGVudC5sb2NhbHMgOiB1bmRlZmluZWQ7XG4iLCJcbiAgICAgIGltcG9ydCBBUEkgZnJvbSBcIiEuLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbmplY3RTdHlsZXNJbnRvU3R5bGVUYWcuanNcIjtcbiAgICAgIGltcG9ydCBkb21BUEkgZnJvbSBcIiEuLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9zdHlsZURvbUFQSS5qc1wiO1xuICAgICAgaW1wb3J0IGluc2VydEZuIGZyb20gXCIhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5zZXJ0QnlTZWxlY3Rvci5qc1wiO1xuICAgICAgaW1wb3J0IHNldEF0dHJpYnV0ZXMgZnJvbSBcIiEuLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9zZXRBdHRyaWJ1dGVzV2l0aG91dEF0dHJpYnV0ZXMuanNcIjtcbiAgICAgIGltcG9ydCBpbnNlcnRTdHlsZUVsZW1lbnQgZnJvbSBcIiEuLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbnNlcnRTdHlsZUVsZW1lbnQuanNcIjtcbiAgICAgIGltcG9ydCBzdHlsZVRhZ1RyYW5zZm9ybUZuIGZyb20gXCIhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvc3R5bGVUYWdUcmFuc2Zvcm0uanNcIjtcbiAgICAgIGltcG9ydCBjb250ZW50LCAqIGFzIG5hbWVkRXhwb3J0IGZyb20gXCIhIS4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvY2pzLmpzIS4vdG9hc3QuY3NzXCI7XG4gICAgICBcbiAgICAgIFxuXG52YXIgb3B0aW9ucyA9IHt9O1xuXG5vcHRpb25zLnN0eWxlVGFnVHJhbnNmb3JtID0gc3R5bGVUYWdUcmFuc2Zvcm1Gbjtcbm9wdGlvbnMuc2V0QXR0cmlidXRlcyA9IHNldEF0dHJpYnV0ZXM7XG5cbiAgICAgIG9wdGlvbnMuaW5zZXJ0ID0gaW5zZXJ0Rm4uYmluZChudWxsLCBcImhlYWRcIik7XG4gICAgXG5vcHRpb25zLmRvbUFQSSA9IGRvbUFQSTtcbm9wdGlvbnMuaW5zZXJ0U3R5bGVFbGVtZW50ID0gaW5zZXJ0U3R5bGVFbGVtZW50O1xuXG52YXIgdXBkYXRlID0gQVBJKGNvbnRlbnQsIG9wdGlvbnMpO1xuXG5cblxuZXhwb3J0ICogZnJvbSBcIiEhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9janMuanMhLi90b2FzdC5jc3NcIjtcbiAgICAgICBleHBvcnQgZGVmYXVsdCBjb250ZW50ICYmIGNvbnRlbnQubG9jYWxzID8gY29udGVudC5sb2NhbHMgOiB1bmRlZmluZWQ7XG4iLCJcbiAgICAgIGltcG9ydCBBUEkgZnJvbSBcIiEuLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbmplY3RTdHlsZXNJbnRvU3R5bGVUYWcuanNcIjtcbiAgICAgIGltcG9ydCBkb21BUEkgZnJvbSBcIiEuLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9zdHlsZURvbUFQSS5qc1wiO1xuICAgICAgaW1wb3J0IGluc2VydEZuIGZyb20gXCIhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5zZXJ0QnlTZWxlY3Rvci5qc1wiO1xuICAgICAgaW1wb3J0IHNldEF0dHJpYnV0ZXMgZnJvbSBcIiEuLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9zZXRBdHRyaWJ1dGVzV2l0aG91dEF0dHJpYnV0ZXMuanNcIjtcbiAgICAgIGltcG9ydCBpbnNlcnRTdHlsZUVsZW1lbnQgZnJvbSBcIiEuLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbnNlcnRTdHlsZUVsZW1lbnQuanNcIjtcbiAgICAgIGltcG9ydCBzdHlsZVRhZ1RyYW5zZm9ybUZuIGZyb20gXCIhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvc3R5bGVUYWdUcmFuc2Zvcm0uanNcIjtcbiAgICAgIGltcG9ydCBjb250ZW50LCAqIGFzIG5hbWVkRXhwb3J0IGZyb20gXCIhIS4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvY2pzLmpzIS4vdHJpc3RhdGUuY3NzXCI7XG4gICAgICBcbiAgICAgIFxuXG52YXIgb3B0aW9ucyA9IHt9O1xuXG5vcHRpb25zLnN0eWxlVGFnVHJhbnNmb3JtID0gc3R5bGVUYWdUcmFuc2Zvcm1Gbjtcbm9wdGlvbnMuc2V0QXR0cmlidXRlcyA9IHNldEF0dHJpYnV0ZXM7XG5cbiAgICAgIG9wdGlvbnMuaW5zZXJ0ID0gaW5zZXJ0Rm4uYmluZChudWxsLCBcImhlYWRcIik7XG4gICAgXG5vcHRpb25zLmRvbUFQSSA9IGRvbUFQSTtcbm9wdGlvbnMuaW5zZXJ0U3R5bGVFbGVtZW50ID0gaW5zZXJ0U3R5bGVFbGVtZW50O1xuXG52YXIgdXBkYXRlID0gQVBJKGNvbnRlbnQsIG9wdGlvbnMpO1xuXG5cblxuZXhwb3J0ICogZnJvbSBcIiEhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9janMuanMhLi90cmlzdGF0ZS5jc3NcIjtcbiAgICAgICBleHBvcnQgZGVmYXVsdCBjb250ZW50ICYmIGNvbnRlbnQubG9jYWxzID8gY29udGVudC5sb2NhbHMgOiB1bmRlZmluZWQ7XG4iLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIHN0eWxlc0luRE9NID0gW107XG5mdW5jdGlvbiBnZXRJbmRleEJ5SWRlbnRpZmllcihpZGVudGlmaWVyKSB7XG4gIHZhciByZXN1bHQgPSAtMTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdHlsZXNJbkRPTS5sZW5ndGg7IGkrKykge1xuICAgIGlmIChzdHlsZXNJbkRPTVtpXS5pZGVudGlmaWVyID09PSBpZGVudGlmaWVyKSB7XG4gICAgICByZXN1bHQgPSBpO1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5mdW5jdGlvbiBtb2R1bGVzVG9Eb20obGlzdCwgb3B0aW9ucykge1xuICB2YXIgaWRDb3VudE1hcCA9IHt9O1xuICB2YXIgaWRlbnRpZmllcnMgPSBbXTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGl0ZW0gPSBsaXN0W2ldO1xuICAgIHZhciBpZCA9IG9wdGlvbnMuYmFzZSA/IGl0ZW1bMF0gKyBvcHRpb25zLmJhc2UgOiBpdGVtWzBdO1xuICAgIHZhciBjb3VudCA9IGlkQ291bnRNYXBbaWRdIHx8IDA7XG4gICAgdmFyIGlkZW50aWZpZXIgPSBcIlwiLmNvbmNhdChpZCwgXCIgXCIpLmNvbmNhdChjb3VudCk7XG4gICAgaWRDb3VudE1hcFtpZF0gPSBjb3VudCArIDE7XG4gICAgdmFyIGluZGV4QnlJZGVudGlmaWVyID0gZ2V0SW5kZXhCeUlkZW50aWZpZXIoaWRlbnRpZmllcik7XG4gICAgdmFyIG9iaiA9IHtcbiAgICAgIGNzczogaXRlbVsxXSxcbiAgICAgIG1lZGlhOiBpdGVtWzJdLFxuICAgICAgc291cmNlTWFwOiBpdGVtWzNdLFxuICAgICAgc3VwcG9ydHM6IGl0ZW1bNF0sXG4gICAgICBsYXllcjogaXRlbVs1XVxuICAgIH07XG4gICAgaWYgKGluZGV4QnlJZGVudGlmaWVyICE9PSAtMSkge1xuICAgICAgc3R5bGVzSW5ET01baW5kZXhCeUlkZW50aWZpZXJdLnJlZmVyZW5jZXMrKztcbiAgICAgIHN0eWxlc0luRE9NW2luZGV4QnlJZGVudGlmaWVyXS51cGRhdGVyKG9iaik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciB1cGRhdGVyID0gYWRkRWxlbWVudFN0eWxlKG9iaiwgb3B0aW9ucyk7XG4gICAgICBvcHRpb25zLmJ5SW5kZXggPSBpO1xuICAgICAgc3R5bGVzSW5ET00uc3BsaWNlKGksIDAsIHtcbiAgICAgICAgaWRlbnRpZmllcjogaWRlbnRpZmllcixcbiAgICAgICAgdXBkYXRlcjogdXBkYXRlcixcbiAgICAgICAgcmVmZXJlbmNlczogMVxuICAgICAgfSk7XG4gICAgfVxuICAgIGlkZW50aWZpZXJzLnB1c2goaWRlbnRpZmllcik7XG4gIH1cbiAgcmV0dXJuIGlkZW50aWZpZXJzO1xufVxuZnVuY3Rpb24gYWRkRWxlbWVudFN0eWxlKG9iaiwgb3B0aW9ucykge1xuICB2YXIgYXBpID0gb3B0aW9ucy5kb21BUEkob3B0aW9ucyk7XG4gIGFwaS51cGRhdGUob2JqKTtcbiAgdmFyIHVwZGF0ZXIgPSBmdW5jdGlvbiB1cGRhdGVyKG5ld09iaikge1xuICAgIGlmIChuZXdPYmopIHtcbiAgICAgIGlmIChuZXdPYmouY3NzID09PSBvYmouY3NzICYmIG5ld09iai5tZWRpYSA9PT0gb2JqLm1lZGlhICYmIG5ld09iai5zb3VyY2VNYXAgPT09IG9iai5zb3VyY2VNYXAgJiYgbmV3T2JqLnN1cHBvcnRzID09PSBvYmouc3VwcG9ydHMgJiYgbmV3T2JqLmxheWVyID09PSBvYmoubGF5ZXIpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgYXBpLnVwZGF0ZShvYmogPSBuZXdPYmopO1xuICAgIH0gZWxzZSB7XG4gICAgICBhcGkucmVtb3ZlKCk7XG4gICAgfVxuICB9O1xuICByZXR1cm4gdXBkYXRlcjtcbn1cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGxpc3QsIG9wdGlvbnMpIHtcbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gIGxpc3QgPSBsaXN0IHx8IFtdO1xuICB2YXIgbGFzdElkZW50aWZpZXJzID0gbW9kdWxlc1RvRG9tKGxpc3QsIG9wdGlvbnMpO1xuICByZXR1cm4gZnVuY3Rpb24gdXBkYXRlKG5ld0xpc3QpIHtcbiAgICBuZXdMaXN0ID0gbmV3TGlzdCB8fCBbXTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxhc3RJZGVudGlmaWVycy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGlkZW50aWZpZXIgPSBsYXN0SWRlbnRpZmllcnNbaV07XG4gICAgICB2YXIgaW5kZXggPSBnZXRJbmRleEJ5SWRlbnRpZmllcihpZGVudGlmaWVyKTtcbiAgICAgIHN0eWxlc0luRE9NW2luZGV4XS5yZWZlcmVuY2VzLS07XG4gICAgfVxuICAgIHZhciBuZXdMYXN0SWRlbnRpZmllcnMgPSBtb2R1bGVzVG9Eb20obmV3TGlzdCwgb3B0aW9ucyk7XG4gICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGxhc3RJZGVudGlmaWVycy5sZW5ndGg7IF9pKyspIHtcbiAgICAgIHZhciBfaWRlbnRpZmllciA9IGxhc3RJZGVudGlmaWVyc1tfaV07XG4gICAgICB2YXIgX2luZGV4ID0gZ2V0SW5kZXhCeUlkZW50aWZpZXIoX2lkZW50aWZpZXIpO1xuICAgICAgaWYgKHN0eWxlc0luRE9NW19pbmRleF0ucmVmZXJlbmNlcyA9PT0gMCkge1xuICAgICAgICBzdHlsZXNJbkRPTVtfaW5kZXhdLnVwZGF0ZXIoKTtcbiAgICAgICAgc3R5bGVzSW5ET00uc3BsaWNlKF9pbmRleCwgMSk7XG4gICAgICB9XG4gICAgfVxuICAgIGxhc3RJZGVudGlmaWVycyA9IG5ld0xhc3RJZGVudGlmaWVycztcbiAgfTtcbn07IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBtZW1vID0ge307XG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICAqL1xuZnVuY3Rpb24gZ2V0VGFyZ2V0KHRhcmdldCkge1xuICBpZiAodHlwZW9mIG1lbW9bdGFyZ2V0XSA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgIHZhciBzdHlsZVRhcmdldCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IodGFyZ2V0KTtcblxuICAgIC8vIFNwZWNpYWwgY2FzZSB0byByZXR1cm4gaGVhZCBvZiBpZnJhbWUgaW5zdGVhZCBvZiBpZnJhbWUgaXRzZWxmXG4gICAgaWYgKHdpbmRvdy5IVE1MSUZyYW1lRWxlbWVudCAmJiBzdHlsZVRhcmdldCBpbnN0YW5jZW9mIHdpbmRvdy5IVE1MSUZyYW1lRWxlbWVudCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gVGhpcyB3aWxsIHRocm93IGFuIGV4Y2VwdGlvbiBpZiBhY2Nlc3MgdG8gaWZyYW1lIGlzIGJsb2NrZWRcbiAgICAgICAgLy8gZHVlIHRvIGNyb3NzLW9yaWdpbiByZXN0cmljdGlvbnNcbiAgICAgICAgc3R5bGVUYXJnZXQgPSBzdHlsZVRhcmdldC5jb250ZW50RG9jdW1lbnQuaGVhZDtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgLy8gaXN0YW5idWwgaWdub3JlIG5leHRcbiAgICAgICAgc3R5bGVUYXJnZXQgPSBudWxsO1xuICAgICAgfVxuICAgIH1cbiAgICBtZW1vW3RhcmdldF0gPSBzdHlsZVRhcmdldDtcbiAgfVxuICByZXR1cm4gbWVtb1t0YXJnZXRdO1xufVxuXG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAgKi9cbmZ1bmN0aW9uIGluc2VydEJ5U2VsZWN0b3IoaW5zZXJ0LCBzdHlsZSkge1xuICB2YXIgdGFyZ2V0ID0gZ2V0VGFyZ2V0KGluc2VydCk7XG4gIGlmICghdGFyZ2V0KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiQ291bGRuJ3QgZmluZCBhIHN0eWxlIHRhcmdldC4gVGhpcyBwcm9iYWJseSBtZWFucyB0aGF0IHRoZSB2YWx1ZSBmb3IgdGhlICdpbnNlcnQnIHBhcmFtZXRlciBpcyBpbnZhbGlkLlwiKTtcbiAgfVxuICB0YXJnZXQuYXBwZW5kQ2hpbGQoc3R5bGUpO1xufVxubW9kdWxlLmV4cG9ydHMgPSBpbnNlcnRCeVNlbGVjdG9yOyIsIlwidXNlIHN0cmljdFwiO1xuXG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAgKi9cbmZ1bmN0aW9uIGluc2VydFN0eWxlRWxlbWVudChvcHRpb25zKSB7XG4gIHZhciBlbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInN0eWxlXCIpO1xuICBvcHRpb25zLnNldEF0dHJpYnV0ZXMoZWxlbWVudCwgb3B0aW9ucy5hdHRyaWJ1dGVzKTtcbiAgb3B0aW9ucy5pbnNlcnQoZWxlbWVudCwgb3B0aW9ucy5vcHRpb25zKTtcbiAgcmV0dXJuIGVsZW1lbnQ7XG59XG5tb2R1bGUuZXhwb3J0cyA9IGluc2VydFN0eWxlRWxlbWVudDsiLCJcInVzZSBzdHJpY3RcIjtcblxuLyogaXN0YW5idWwgaWdub3JlIG5leHQgICovXG5mdW5jdGlvbiBzZXRBdHRyaWJ1dGVzV2l0aG91dEF0dHJpYnV0ZXMoc3R5bGVFbGVtZW50KSB7XG4gIHZhciBub25jZSA9IHR5cGVvZiBfX3dlYnBhY2tfbm9uY2VfXyAhPT0gXCJ1bmRlZmluZWRcIiA/IF9fd2VicGFja19ub25jZV9fIDogbnVsbDtcbiAgaWYgKG5vbmNlKSB7XG4gICAgc3R5bGVFbGVtZW50LnNldEF0dHJpYnV0ZShcIm5vbmNlXCIsIG5vbmNlKTtcbiAgfVxufVxubW9kdWxlLmV4cG9ydHMgPSBzZXRBdHRyaWJ1dGVzV2l0aG91dEF0dHJpYnV0ZXM7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICAqL1xuZnVuY3Rpb24gYXBwbHkoc3R5bGVFbGVtZW50LCBvcHRpb25zLCBvYmopIHtcbiAgdmFyIGNzcyA9IFwiXCI7XG4gIGlmIChvYmouc3VwcG9ydHMpIHtcbiAgICBjc3MgKz0gXCJAc3VwcG9ydHMgKFwiLmNvbmNhdChvYmouc3VwcG9ydHMsIFwiKSB7XCIpO1xuICB9XG4gIGlmIChvYmoubWVkaWEpIHtcbiAgICBjc3MgKz0gXCJAbWVkaWEgXCIuY29uY2F0KG9iai5tZWRpYSwgXCIge1wiKTtcbiAgfVxuICB2YXIgbmVlZExheWVyID0gdHlwZW9mIG9iai5sYXllciAhPT0gXCJ1bmRlZmluZWRcIjtcbiAgaWYgKG5lZWRMYXllcikge1xuICAgIGNzcyArPSBcIkBsYXllclwiLmNvbmNhdChvYmoubGF5ZXIubGVuZ3RoID4gMCA/IFwiIFwiLmNvbmNhdChvYmoubGF5ZXIpIDogXCJcIiwgXCIge1wiKTtcbiAgfVxuICBjc3MgKz0gb2JqLmNzcztcbiAgaWYgKG5lZWRMYXllcikge1xuICAgIGNzcyArPSBcIn1cIjtcbiAgfVxuICBpZiAob2JqLm1lZGlhKSB7XG4gICAgY3NzICs9IFwifVwiO1xuICB9XG4gIGlmIChvYmouc3VwcG9ydHMpIHtcbiAgICBjc3MgKz0gXCJ9XCI7XG4gIH1cbiAgdmFyIHNvdXJjZU1hcCA9IG9iai5zb3VyY2VNYXA7XG4gIGlmIChzb3VyY2VNYXAgJiYgdHlwZW9mIGJ0b2EgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICBjc3MgKz0gXCJcXG4vKiMgc291cmNlTWFwcGluZ1VSTD1kYXRhOmFwcGxpY2F0aW9uL2pzb247YmFzZTY0LFwiLmNvbmNhdChidG9hKHVuZXNjYXBlKGVuY29kZVVSSUNvbXBvbmVudChKU09OLnN0cmluZ2lmeShzb3VyY2VNYXApKSkpLCBcIiAqL1wiKTtcbiAgfVxuXG4gIC8vIEZvciBvbGQgSUVcbiAgLyogaXN0YW5idWwgaWdub3JlIGlmICAqL1xuICBvcHRpb25zLnN0eWxlVGFnVHJhbnNmb3JtKGNzcywgc3R5bGVFbGVtZW50LCBvcHRpb25zLm9wdGlvbnMpO1xufVxuZnVuY3Rpb24gcmVtb3ZlU3R5bGVFbGVtZW50KHN0eWxlRWxlbWVudCkge1xuICAvLyBpc3RhbmJ1bCBpZ25vcmUgaWZcbiAgaWYgKHN0eWxlRWxlbWVudC5wYXJlbnROb2RlID09PSBudWxsKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHN0eWxlRWxlbWVudC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHN0eWxlRWxlbWVudCk7XG59XG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICAqL1xuZnVuY3Rpb24gZG9tQVBJKG9wdGlvbnMpIHtcbiAgaWYgKHR5cGVvZiBkb2N1bWVudCA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgIHJldHVybiB7XG4gICAgICB1cGRhdGU6IGZ1bmN0aW9uIHVwZGF0ZSgpIHt9LFxuICAgICAgcmVtb3ZlOiBmdW5jdGlvbiByZW1vdmUoKSB7fVxuICAgIH07XG4gIH1cbiAgdmFyIHN0eWxlRWxlbWVudCA9IG9wdGlvbnMuaW5zZXJ0U3R5bGVFbGVtZW50KG9wdGlvbnMpO1xuICByZXR1cm4ge1xuICAgIHVwZGF0ZTogZnVuY3Rpb24gdXBkYXRlKG9iaikge1xuICAgICAgYXBwbHkoc3R5bGVFbGVtZW50LCBvcHRpb25zLCBvYmopO1xuICAgIH0sXG4gICAgcmVtb3ZlOiBmdW5jdGlvbiByZW1vdmUoKSB7XG4gICAgICByZW1vdmVTdHlsZUVsZW1lbnQoc3R5bGVFbGVtZW50KTtcbiAgICB9XG4gIH07XG59XG5tb2R1bGUuZXhwb3J0cyA9IGRvbUFQSTsiLCJcInVzZSBzdHJpY3RcIjtcblxuLyogaXN0YW5idWwgaWdub3JlIG5leHQgICovXG5mdW5jdGlvbiBzdHlsZVRhZ1RyYW5zZm9ybShjc3MsIHN0eWxlRWxlbWVudCkge1xuICBpZiAoc3R5bGVFbGVtZW50LnN0eWxlU2hlZXQpIHtcbiAgICBzdHlsZUVsZW1lbnQuc3R5bGVTaGVldC5jc3NUZXh0ID0gY3NzO1xuICB9IGVsc2Uge1xuICAgIHdoaWxlIChzdHlsZUVsZW1lbnQuZmlyc3RDaGlsZCkge1xuICAgICAgc3R5bGVFbGVtZW50LnJlbW92ZUNoaWxkKHN0eWxlRWxlbWVudC5maXJzdENoaWxkKTtcbiAgICB9XG4gICAgc3R5bGVFbGVtZW50LmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGNzcykpO1xuICB9XG59XG5tb2R1bGUuZXhwb3J0cyA9IHN0eWxlVGFnVHJhbnNmb3JtOyIsIi8vIEZ1bmN0aW9uIHRvIGxvYWQgdGhlIENTUyBmcm9tIGEgZ2l2ZW4gVVJMXHJcbmZ1bmN0aW9uIGxvYWRDc3ModXJsKSB7XHJcbiAgICByZXR1cm4gZmV0Y2godXJsKVxyXG4gICAgICAgIC50aGVuKHJlc3BvbnNlID0+IHJlc3BvbnNlLnRleHQoKSlcclxuICAgICAgICAudGhlbihjc3MgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBzdHlsZVNoZWV0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInN0eWxlXCIpO1xyXG4gICAgICAgICAgICBzdHlsZVNoZWV0LnR5cGUgPSBcInRleHQvY3NzXCI7XHJcbiAgICAgICAgICAgIHN0eWxlU2hlZXQudGV4dENvbnRlbnQgPSBjc3M7ICAvLyBVc2UgdGV4dENvbnRlbnQgaW5zdGVhZCBvZiBpbm5lclRleHRcclxuICAgICAgICAgICAgZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChzdHlsZVNoZWV0KTtcclxuICAgICAgICB9KVxyXG4gICAgICAgIC5jYXRjaChlcnJvciA9PiB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJGYWlsZWQgdG8gbG9hZCBDU1M6XCIsIGVycm9yKTtcclxuICAgICAgICB9KTtcclxufVxyXG5cclxuZXhwb3J0IHtcclxuICAgIGxvYWRDc3NcclxufSIsIi8vIEltcG9ydGluZyB0aGUgQ1NTIGFuZCBIVE1MIHRlbXBsYXRlc1xyXG5pbXBvcnQgJy4vY3NzL2RpYWxvZy5jc3MnO1xyXG5pbXBvcnQgZGlhbG9nVGVtcGxhdGUgZnJvbSAnLi9odG1sL2RpYWxvZy5odG1sP3Jhdyc7XHJcblxyXG5jb25zdCBjcmVhdGVEaWFsb2cgPSAob3B0aW9ucykgPT4ge1xyXG4gICAgY29uc3QgZGlhbG9nRGVmYXVsdHMgPSB7XHJcbiAgICAgICAgdGl0bGU6ICcnLFxyXG4gICAgICAgIGNvbnRlbnQ6ICcnLFxyXG4gICAgICAgIGNvbnRlbnRVUkk6ICcnLFxyXG4gICAgICAgIGJ1dHRvbnM6IFtdLFxyXG4gICAgICAgIHNpemU6ICdtZWRpdW0nLFxyXG4gICAgICAgIHNob3dMb2FkaW5nSW5kaWNhdG9yOiBmYWxzZSxcclxuICAgICAgICBjb250ZW50TWV0aG9kOiAnR0VUJyxcclxuICAgICAgICBjb250ZW50RGF0YTogbnVsbCxcclxuICAgICAgICBjb250ZW50SGVhZGVyczogdW5kZWZpbmVkXHJcbiAgICB9O1xyXG5cclxuICAgIGNvbnN0IHsgdGl0bGUsIGNvbnRlbnQsIGNvbnRlbnRVUkksIGJ1dHRvbnMsIHNpemUsIHNob3dMb2FkaW5nSW5kaWNhdG9yLCBjb250ZW50TWV0aG9kLCBjb250ZW50RGF0YSwgY29udGVudEhlYWRlcnMgfSA9IHsgLi4uZGlhbG9nRGVmYXVsdHMsIC4uLm9wdGlvbnMgfTtcclxuXHJcbiAgICBjb25zdCB3cmFwcGVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XHJcbiAgICB3cmFwcGVyLmlubmVySFRNTCA9IGRpYWxvZ1RlbXBsYXRlLnRyaW0oKTtcclxuICAgIGNvbnN0IGRpYWxvZ0VsZW1lbnQgPSB3cmFwcGVyLmZpcnN0Q2hpbGQ7XHJcblxyXG4gICAgLy8gTGlmZWN5Y2xlIGV2ZW50IG1hbmFnZW1lbnRcclxuICAgIGNvbnN0IGxpZmVjeWNsZVJlc29sdmVycyA9IHt9O1xyXG4gICAgY29uc3QgbGlmZWN5Y2xlRXZlbnRzID0ge307XHJcblxyXG4gICAgLy8gRGVmaW5lIGxpZmVjeWNsZSBwcm9taXNlcyBhcyBwcm9wZXJ0aWVzXHJcbiAgICBbJ29wZW5pbmcnLCAnb3BlbmVkJywgJ2Nsb3NpbmcnLCAnY2xvc2VkJywgJ2NvbnRlbnRMb2FkaW5nJywgJ2NvbnRlbnRMb2FkZWQnXS5mb3JFYWNoKChldmVudCkgPT4ge1xyXG4gICAgICAgIGxpZmVjeWNsZUV2ZW50c1tldmVudF0gPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xyXG4gICAgICAgICAgICBsaWZlY3ljbGVSZXNvbHZlcnNbZXZlbnRdID0gcmVzb2x2ZTtcclxuICAgICAgICB9KTtcclxuICAgIH0pO1xyXG5cclxuICAgIGNvbnN0IHRyaWdnZXJFdmVudCA9IChldmVudCkgPT4ge1xyXG4gICAgICAgIGlmIChsaWZlY3ljbGVSZXNvbHZlcnNbZXZlbnRdKSB7XHJcbiAgICAgICAgICAgIGxpZmVjeWNsZVJlc29sdmVyc1tldmVudF0oKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBjb25zb2xlLndhcm4oYE5vIHJlc29sdmVyIGZvdW5kIGZvciBsaWZlY3ljbGUgZXZlbnQ6ICR7ZXZlbnR9YCk7XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuXHJcbiAgICBjb25zdCBkaWFsb2cgPSB7XHJcbiAgICAgICAgZWxlbWVudDogZGlhbG9nRWxlbWVudCxcclxuICAgICAgICBidXR0b25zOiB7fSxcclxuICAgICAgICBpc0Nsb3NlZDogZmFsc2UsXHJcbiAgICAgICAgbGlmZWN5Y2xlOiBsaWZlY3ljbGVFdmVudHMsIC8vIExpZmVjeWNsZSBwcm9taXNlcyBkaXJlY3RseSBleHBvc2VkIGhlcmVcclxuICAgICAgICBkaXNhYmxlQnV0dG9uOiAoa2V5KSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IGJ1dHRvbiA9IGRpYWxvZ0VsZW1lbnQucXVlcnlTZWxlY3RvcihgLkFQWC1kaWFsb2ctYnV0dG9uW2RhdGEta2V5PVwiJHtrZXl9XCJdYCk7XHJcbiAgICAgICAgICAgIGlmIChidXR0b24pIHtcclxuICAgICAgICAgICAgICAgIGJ1dHRvbi5kaXNhYmxlZCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICBidXR0b24uY2xhc3NMaXN0LmFkZCgnQVBYLWRpYWxvZy1idXR0b24tZGlzYWJsZWQnKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgZW5hYmxlQnV0dG9uOiAoa2V5KSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IGJ1dHRvbiA9IGRpYWxvZ0VsZW1lbnQucXVlcnlTZWxlY3RvcihgLkFQWC1kaWFsb2ctYnV0dG9uW2RhdGEta2V5PVwiJHtrZXl9XCJdYCk7XHJcbiAgICAgICAgICAgIGlmIChidXR0b24pIHtcclxuICAgICAgICAgICAgICAgIGJ1dHRvbi5kaXNhYmxlZCA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgYnV0dG9uLmNsYXNzTGlzdC5yZW1vdmUoJ0FQWC1kaWFsb2ctYnV0dG9uLWRpc2FibGVkJyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgICAgIG9wZW46IGFzeW5jICgpID0+IHtcclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIHRyaWdnZXJFdmVudCgnb3BlbmluZycpO1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgZGlhbG9nLmxpZmVjeWNsZS5vcGVuaW5nO1xyXG5cclxuICAgICAgICAgICAgICAgIC8vIElmIGxvYWRpbmcgaW5kaWNhdG9yIGlzIGVuYWJsZWQgYW5kIHdlJ3JlIGZldGNoaW5nIGNvbnRlbnQsIHNob3cgZGlhbG9nIGZpcnN0XHJcbiAgICAgICAgICAgICAgICBpZiAoc2hvd0xvYWRpbmdJbmRpY2F0b3IgJiYgY29udGVudFVSSSkge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIEFwcGVuZCBkaWFsb2cgdG8gdGhlIERPTSBhbmQgZGlzcGxheSBpdCBmaXJzdFxyXG4gICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZGlhbG9nRWxlbWVudCk7XHJcbiAgICAgICAgICAgICAgICAgICAgZGlhbG9nRWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gXCJmbGV4XCI7XHJcbiAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gU2hvdyBsb2FkaW5nIGluZGljYXRvclxyXG4gICAgICAgICAgICAgICAgICAgIGRpYWxvZ0VsZW1lbnQucXVlcnlTZWxlY3RvcihcIi5BUFgtZGlhbG9nLWR5bmFtaWMtY29udGVudFwiKS5pbm5lckhUTUwgPSAnPGRpdiBjbGFzcz1cIkFQWC1kaWFsb2ctbG9hZGluZy1pbmRpY2F0b3JcIj48L2Rpdj4nO1xyXG4gICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgIC8vIExvYWQgY29udGVudCBhZnRlciBkaWFsb2cgaXMgdmlzaWJsZVxyXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IGZldGNoQW5kSW5zZXJ0Q29udGVudCgpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyBEZWZhdWx0IGJlaGF2aW9yOiBsb2FkIGNvbnRlbnQgZmlyc3QsIHRoZW4gc2hvdyBkaWFsb2dcclxuICAgICAgICAgICAgICAgICAgICBhd2FpdCBmZXRjaEFuZEluc2VydENvbnRlbnQoKTtcclxuICAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICAvLyBBcHBlbmQgZGlhbG9nIHRvIHRoZSBET00gYW5kIGRpc3BsYXkgaXRcclxuICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGRpYWxvZ0VsZW1lbnQpO1xyXG4gICAgICAgICAgICAgICAgICAgIGRpYWxvZ0VsZW1lbnQuc3R5bGUuZGlzcGxheSA9IFwiZmxleFwiO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIHRyaWdnZXJFdmVudCgnb3BlbmVkJyk7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCBkaWFsb2cubGlmZWN5Y2xlLm9wZW5lZDtcclxuICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIG9wZW5pbmcgZGlhbG9nOicsIGVycm9yKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gZGlhbG9nOyAvLyBSZXR1cm4gZm9yIGRhaXN5LWNoYWluaW5nXHJcbiAgICAgICAgfSxcclxuICAgICAgICBjbG9zZTogYXN5bmMgKCkgPT4ge1xyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgdHJpZ2dlckV2ZW50KCdjbG9zaW5nJyk7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCBkaWFsb2cubGlmZWN5Y2xlLmNsb3Npbmc7XHJcblxyXG4gICAgICAgICAgICAgICAgLy8gQ2xlYW51cCBhbmQgcmVtb3ZlIGRpYWxvZ1xyXG4gICAgICAgICAgICAgICAgY2xvc2VEaWFsb2dBbmRDbGVhbnVwKCk7XHJcblxyXG4gICAgICAgICAgICAgICAgdHJpZ2dlckV2ZW50KCdjbG9zZWQnKTtcclxuICAgICAgICAgICAgICAgIGF3YWl0IGRpYWxvZy5saWZlY3ljbGUuY2xvc2VkO1xyXG4gICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgZHVyaW5nIGRpYWxvZyBjbG9zaW5nOicsIGVycm9yKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gZGlhbG9nOyAvLyBSZXR1cm4gZm9yIGRhaXN5LWNoYWluaW5nXHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuXHJcbiAgICBjb25zdCBjbG9zZURpYWxvZ0FuZENsZWFudXAgPSAoKSA9PiB7XHJcbiAgICAgICAgaWYgKGRpYWxvZy5pc0Nsb3NlZCkgcmV0dXJuO1xyXG5cclxuICAgICAgICBkaWFsb2cuaXNDbG9zZWQgPSB0cnVlO1xyXG4gICAgICAgIGRpYWxvZ0VsZW1lbnQuc3R5bGUuZGlzcGxheSA9IFwibm9uZVwiO1xyXG4gICAgICAgIGlmIChkb2N1bWVudC5ib2R5LmNvbnRhaW5zKGRpYWxvZ0VsZW1lbnQpKSB7XHJcbiAgICAgICAgICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoZGlhbG9nRWxlbWVudCk7XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuXHJcbiAgICBjb25zdCBzZXREaWFsb2dTaXplID0gKCkgPT4ge1xyXG4gICAgICAgIGNvbnN0IGRpYWxvZ0NvbnRlbnQgPSBkaWFsb2dFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoXCIuQVBYLWRpYWxvZy1jb250ZW50XCIpO1xyXG4gICAgICAgIGNvbnN0IHNpemVzID0ge1xyXG4gICAgICAgICAgICBzbWFsbDogeyB3aWR0aDogJzMwMHB4JywgaGVpZ2h0OiAnMjAwcHgnIH0sXHJcbiAgICAgICAgICAgIG1lZGl1bTogeyB3aWR0aDogJzUwMHB4JywgaGVpZ2h0OiAnNDAwcHgnIH0sXHJcbiAgICAgICAgICAgIGxhcmdlOiB7IHdpZHRoOiAnODAwcHgnLCBoZWlnaHQ6ICc2MDBweCcgfVxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIGlmIChzaXplID09PSAnYXV0bycpIHJldHVybjtcclxuXHJcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWRTaXplID0gc2l6ZXNbc2l6ZV0gfHwgKHR5cGVvZiBzaXplID09PSAnb2JqZWN0JyAmJiBzaXplKTtcclxuICAgICAgICBpZiAoc2VsZWN0ZWRTaXplKSB7XHJcbiAgICAgICAgICAgIGRpYWxvZ0NvbnRlbnQuc3R5bGUubWluV2lkdGggPSBzZWxlY3RlZFNpemUud2lkdGggfHwgJzUwMHB4JztcclxuICAgICAgICAgICAgZGlhbG9nQ29udGVudC5zdHlsZS5taW5IZWlnaHQgPSBzZWxlY3RlZFNpemUuaGVpZ2h0IHx8ICc0MDBweCc7XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuXHJcbiAgICBjb25zdCBhZGRCdXR0b25zID0gKCkgPT4ge1xyXG4gICAgICAgIGNvbnN0IGJ1dHRvbkNvbnRhaW5lciA9IGRpYWxvZ0VsZW1lbnQucXVlcnlTZWxlY3RvcihcIi5BUFgtZGlhbG9nLWJ1dHRvbi1jb250YWluZXJcIik7XHJcblxyXG4gICAgICAgIGJ1dHRvbnMuZm9yRWFjaCgoeyBrZXksIGxhYmVsLCBvcmRlciA9IDAsIGFsaWduID0gJ2ZsZXgtZW5kJywgY2xvc2VPbkNsaWNrID0gdHJ1ZSB9KSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IGJ1dHRvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2J1dHRvbicpO1xyXG4gICAgICAgICAgICBidXR0b24uY2xhc3NMaXN0LmFkZCgnQVBYLWRpYWxvZy1idXR0b24nKTtcclxuICAgICAgICAgICAgYnV0dG9uLnRleHRDb250ZW50ID0gbGFiZWw7XHJcbiAgICAgICAgICAgIGJ1dHRvbi5zdHlsZS5vcmRlciA9IG9yZGVyO1xyXG4gICAgICAgICAgICBidXR0b24uc2V0QXR0cmlidXRlKCdkYXRhLWtleScsIGtleSk7XHJcblxyXG4gICAgICAgICAgICAvLyBDcmVhdGUgYnV0dG9uIGNvbnRleHQgd2l0aCBkaXNhYmxlL2VuYWJsZSBtZXRob2RzXHJcbiAgICAgICAgICAgIGNvbnN0IGJ1dHRvbkNvbnRleHQgPSB7XHJcbiAgICAgICAgICAgICAgICBkaXNhYmxlOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgYnV0dG9uLmRpc2FibGVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICBidXR0b24uY2xhc3NMaXN0LmFkZCgnQVBYLWRpYWxvZy1idXR0b24tZGlzYWJsZWQnKTtcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICBlbmFibGU6ICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBidXR0b24uZGlzYWJsZWQgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICBidXR0b24uY2xhc3NMaXN0LnJlbW92ZSgnQVBYLWRpYWxvZy1idXR0b24tZGlzYWJsZWQnKTtcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICBrZXksXHJcbiAgICAgICAgICAgICAgICBlbGVtZW50OiBidXR0b25cclxuICAgICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICAgIGlmIChjbG9zZU9uQ2xpY2spIHtcclxuICAgICAgICAgICAgICAgIC8vIEhhbmRsZSBhcyBhIG9uZS10aW1lIFByb21pc2VcclxuICAgICAgICAgICAgICAgIGxldCBmaXJzdENsaWNrUmVzb2x2ZWQgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgICAgICAgICBjb25zdCBmaXJzdENsaWNrUHJvbWlzZSA9IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgYnV0dG9uLm9uY2xpY2sgPSAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZmlyc3RDbGlja1Jlc29sdmVkICYmICFidXR0b24uZGlzYWJsZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0Q2xpY2tSZXNvbHZlZCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHsgZGlhbG9nLCBidXR0b246IGJ1dHRvbkNvbnRleHQgfSk7IC8vIFBhc3MgYm90aCBkaWFsb2cgYW5kIGJ1dHRvbiBjb250ZXh0XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWFsb2cuY2xvc2UoKTsgLy8gQ2xvc2UgdGhlIGRpYWxvZ1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgICAgIC8vIEFzc2lnbiB0aGUgcHJvbWlzZSBmb3IgY2hhaW5pbmcgd2l0aCBgLnRoZW5gXHJcbiAgICAgICAgICAgICAgICBkaWFsb2cuYnV0dG9uc1trZXldID0gZmlyc3RDbGlja1Byb21pc2U7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAvLyBIYW5kbGUgYXMgYSByZXBlYXRlZCBldmVudCBoYW5kbGVyXHJcbiAgICAgICAgICAgICAgICBsZXQgaGFuZGxlcnMgPSBbXTsgLy8gU3RvcmUgaGFuZGxlcnMgZm9yIGAudGhlbigpYFxyXG5cclxuICAgICAgICAgICAgICAgIGNvbnN0IGNsaWNrUHJvbWlzZSA9IHtcclxuICAgICAgICAgICAgICAgICAgICB0aGVuOiAoY2FsbGJhY2spID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBjYWxsYmFjayA9PT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlcnMucHVzaChjYWxsYmFjayk7IC8vIEFkZCB0byBoYW5kbGVyc1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjbGlja1Byb21pc2U7IC8vIEFsbG93IGNoYWluaW5nXHJcbiAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgICAgICAgYnV0dG9uLm9uY2xpY2sgPSAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFidXR0b24uZGlzYWJsZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlcnMuZm9yRWFjaCgoaGFuZGxlcikgPT4gaGFuZGxlcih7IGRpYWxvZywgYnV0dG9uOiBidXR0b25Db250ZXh0IH0pKTsgLy8gUGFzcyBib3RoIGRpYWxvZyBhbmQgYnV0dG9uIGNvbnRleHRcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgICAgIGRpYWxvZy5idXR0b25zW2tleV0gPSBjbGlja1Byb21pc2U7IC8vIEFzc2lnbiB0aGUgXCJmYWtlXCIgcHJvbWlzZVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBidXR0b25Db250YWluZXIuYXBwZW5kQ2hpbGQoYnV0dG9uKTtcclxuICAgICAgICAgICAgYnV0dG9uQ29udGFpbmVyLnN0eWxlLmp1c3RpZnlDb250ZW50ID0gYWxpZ247XHJcbiAgICAgICAgfSk7XHJcbiAgICB9O1xyXG5cclxuICAgIGNvbnN0IGZldGNoQW5kSW5zZXJ0Q29udGVudCA9IGFzeW5jICgpID0+IHtcclxuICAgICAgICBjb25zdCBvcmlnaW5hbEN1cnNvciA9IGRvY3VtZW50LmJvZHkuc3R5bGUuY3Vyc29yO1xyXG4gICAgICAgIGRvY3VtZW50LmJvZHkuc3R5bGUuY3Vyc29yID0gJ3dhaXQnO1xyXG4gICAgICAgIGNvbnN0IGR5bmFtaWNDb250ZW50ID0gZGlhbG9nRWxlbWVudC5xdWVyeVNlbGVjdG9yKFwiLkFQWC1kaWFsb2ctZHluYW1pYy1jb250ZW50XCIpO1xyXG4gICAgICAgIFxyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHRyaWdnZXJFdmVudCgnY29udGVudExvYWRpbmcnKTtcclxuICAgICAgICAgICAgYXdhaXQgZGlhbG9nLmxpZmVjeWNsZS5jb250ZW50TG9hZGluZztcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IGNvbnRlbnRIdG1sID0gY29udGVudFVSSVxyXG4gICAgICAgICAgICAgICAgPyBhd2FpdCBmZXRjaENvbnRlbnQoY29udGVudFVSSSlcclxuICAgICAgICAgICAgICAgIDogY29udGVudDtcclxuXHJcbiAgICAgICAgICAgIGR5bmFtaWNDb250ZW50LmlubmVySFRNTCA9IGNvbnRlbnRIdG1sO1xyXG5cclxuICAgICAgICAgICAgdHJpZ2dlckV2ZW50KCdjb250ZW50TG9hZGVkJyk7XHJcbiAgICAgICAgICAgIGF3YWl0IGRpYWxvZy5saWZlY3ljbGUuY29udGVudExvYWRlZDtcclxuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBsb2FkaW5nIGNvbnRlbnQ6JywgZXJyb3IpO1xyXG4gICAgICAgIH0gZmluYWxseSB7XHJcbiAgICAgICAgICAgIGRvY3VtZW50LmJvZHkuc3R5bGUuY3Vyc29yID0gb3JpZ2luYWxDdXJzb3I7XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuXHJcbiAgICBjb25zdCBmZXRjaENvbnRlbnQgPSBhc3luYyAodXJpKSA9PiB7XHJcbiAgICAgICAgY29uc3QgbWV0aG9kID0gKGNvbnRlbnRNZXRob2QgfHwgJ0dFVCcpLnRvVXBwZXJDYXNlKCk7XHJcblxyXG4gICAgICAgIC8vIEFsd2F5cyBhbGxvdyBjdXN0b20gaGVhZGVyczsgd2Ugb25seSBhZGQgQ29udGVudC1UeXBlIHdoZW4gd2UgY2FuIGluZmVyIGl0XHJcbiAgICAgICAgY29uc3QgaGVhZGVycyA9IHsgLi4uKGNvbnRlbnRIZWFkZXJzIHx8IHt9KSB9O1xyXG4gICAgICAgIGNvbnN0IGhhc0NvbnRlbnRUeXBlID0gT2JqZWN0LmtleXMoaGVhZGVycykuc29tZSgoaykgPT4gay50b0xvd2VyQ2FzZSgpID09PSAnY29udGVudC10eXBlJyk7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEJ1aWxkIFJlcXVlc3RJbml0IGRlcGVuZGluZyBvbiBtZXRob2QgYW5kIGNvbnRlbnREYXRhIHR5cGUuXHJcbiAgICAgICAgICogV2UgYXZvaWQgc2V0dGluZyBDb250ZW50LVR5cGUgZm9yIEZvcm1EYXRhIGFuZCByYXcgc3RyaW5nL0Jsb2IgcGF5bG9hZHMsXHJcbiAgICAgICAgICogdW5sZXNzIHRoZSBjYWxsZXIgZXhwbGljaXRseSBwcm92aWRlZCBpdCB2aWEgY29udGVudEhlYWRlcnMuXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgY29uc3QgaW5pdCA9IHsgbWV0aG9kIH07XHJcblxyXG4gICAgICAgIGlmIChtZXRob2QgPT09ICdQT1NUJykge1xyXG4gICAgICAgICAgICBsZXQgYm9keSA9IHVuZGVmaW5lZDtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IGlzRm9ybURhdGEgPSB0eXBlb2YgRm9ybURhdGEgIT09ICd1bmRlZmluZWQnICYmIGNvbnRlbnREYXRhIGluc3RhbmNlb2YgRm9ybURhdGE7XHJcbiAgICAgICAgICAgIGNvbnN0IGlzVVJMU2VhcmNoUGFyYW1zID0gdHlwZW9mIFVSTFNlYXJjaFBhcmFtcyAhPT0gJ3VuZGVmaW5lZCcgJiYgY29udGVudERhdGEgaW5zdGFuY2VvZiBVUkxTZWFyY2hQYXJhbXM7XHJcbiAgICAgICAgICAgIGNvbnN0IGlzQmxvYiA9IHR5cGVvZiBCbG9iICE9PSAndW5kZWZpbmVkJyAmJiBjb250ZW50RGF0YSBpbnN0YW5jZW9mIEJsb2I7XHJcbiAgICAgICAgICAgIGNvbnN0IGlzU3RyaW5nID0gdHlwZW9mIGNvbnRlbnREYXRhID09PSAnc3RyaW5nJztcclxuICAgICAgICAgICAgY29uc3QgaXNQbGFpbk9iamVjdCA9IGNvbnRlbnREYXRhICYmIHR5cGVvZiBjb250ZW50RGF0YSA9PT0gJ29iamVjdCcgJiYgIWlzRm9ybURhdGEgJiYgIWlzVVJMU2VhcmNoUGFyYW1zICYmICFpc0Jsb2I7XHJcblxyXG4gICAgICAgICAgICBpZiAoaXNGb3JtRGF0YSkge1xyXG4gICAgICAgICAgICAgICAgYm9keSA9IGNvbnRlbnREYXRhO1xyXG4gICAgICAgICAgICAgICAgLy8gRG8gbm90IHNldCBDb250ZW50LVR5cGUgZm9yIEZvcm1EYXRhOyBicm93c2VyIHdpbGwgc2V0IHRoZSBib3VuZGFyeVxyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGlzVVJMU2VhcmNoUGFyYW1zKSB7XHJcbiAgICAgICAgICAgICAgICBib2R5ID0gY29udGVudERhdGE7XHJcbiAgICAgICAgICAgICAgICBpZiAoIWhhc0NvbnRlbnRUeXBlKSBoZWFkZXJzWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQ7Y2hhcnNldD1VVEYtOCc7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaXNQbGFpbk9iamVjdCkge1xyXG4gICAgICAgICAgICAgICAgYm9keSA9IEpTT04uc3RyaW5naWZ5KGNvbnRlbnREYXRhKTtcclxuICAgICAgICAgICAgICAgIGlmICghaGFzQ29udGVudFR5cGUpIGhlYWRlcnNbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGlzU3RyaW5nIHx8IGlzQmxvYikge1xyXG4gICAgICAgICAgICAgICAgYm9keSA9IGNvbnRlbnREYXRhO1xyXG4gICAgICAgICAgICAgICAgLy8gQ29udGVudC1UeXBlIGxlZnQgdG8gY2FsbGVyIGlmIG5lZWRlZFxyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGNvbnRlbnREYXRhICE9IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIC8vIEZhbGxiYWNrOiB0cnkgc2VuZCBhcy1pc1xyXG4gICAgICAgICAgICAgICAgYm9keSA9IGNvbnRlbnREYXRhO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoYm9keSAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICBpbml0LmJvZHkgPSBib2R5O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoT2JqZWN0LmtleXMoaGVhZGVycykubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICBpbml0LmhlYWRlcnMgPSBoZWFkZXJzO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCh1cmksIGluaXQpO1xyXG4gICAgICAgIGlmICghcmVzcG9uc2Uub2spIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIGZldGNoIGNvbnRlbnQ6ICR7cmVzcG9uc2Uuc3RhdHVzVGV4dH1gKTtcclxuICAgICAgICByZXR1cm4gcmVzcG9uc2UudGV4dCgpO1xyXG4gICAgfTtcclxuXHJcbiAgICAvLyBJbml0aWFsaXplIGRpYWxvZ1xyXG4gICAgc2V0RGlhbG9nU2l6ZSgpO1xyXG4gICAgYWRkQnV0dG9ucygpO1xyXG5cclxuICAgIC8vIFNldCB0aXRsZSBhbmQgY2xvc2UgYnV0dG9uIGhhbmRsZXJcclxuICAgIGRpYWxvZ0VsZW1lbnQucXVlcnlTZWxlY3RvcihcIi5BUFgtZGlhbG9nLXRpdGxlXCIpLnRleHRDb250ZW50ID0gdGl0bGU7XHJcbiAgICBkaWFsb2dFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJy5BUFgtY2xvc2UtZGlhbG9nJykub25jbGljayA9IGRpYWxvZy5jbG9zZTtcclxuXHJcbiAgICByZXR1cm4gZGlhbG9nO1xyXG59O1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY3JlYXRlRGlhbG9nO1xyXG4iLCJsZXQgY291bnRlciA9IDA7XHJcbmNvbnN0IGRvQ2FsbGJhY2tzID0ge307XHJcbmNvbnN0IHRpbWVvdXRzID0ge307XHJcblxyXG4vKipcclxuICogVGhpcyBmdW5jdGlvbiBhZGRzIGFuIGV2ZW50IGxpc3RlbmVyIHRvIHRoZSBlbGVtZW50cyBhbmQgcmV0dXJucyBhbiBvYmplY3Qgd2l0aCBhIGRvIG1ldGhvZCB0byBhZGQgY2FsbGJhY2sgZnVuY3Rpb25zLlxyXG4gKiBAcGFyYW0ge09iamVjdH0gYXB4IC0gVGhlIGFweCBvYmplY3QgdG8gYXVnbWVudCB3aXRoIHRoZSBsaXN0ZW4gZnVuY3Rpb24uXHJcbiAqIEByZXR1cm5zIHtPYmplY3R9IC0gVGhlIGF1Z21lbnRlZCBhcHggb2JqZWN0LlxyXG4gKi9cclxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gKGFweCkge1xyXG4gICAgbGV0IGVsZW1lbnRzID0gYXB4LmVsZW1lbnRzO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQWRkcyBhbiBldmVudCBsaXN0ZW5lciB0byB0aGUgZWxlbWVudHMgYW5kIHJldHVybnMgYW4gb2JqZWN0IHdpdGggYSBkbyBtZXRob2QgdG8gYWRkIGNhbGxiYWNrIGZ1bmN0aW9ucy5cclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBldmVudFR5cGUgLSBUaGUgdHlwZSBvZiBldmVudCB0byBsaXN0ZW4gZm9yIChlLmcuICdjbGljaycsICdrZXlkb3duJywgZXRjLikuXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3NlbGVjdG9yXSAtIFRoZSBDU1Mgc2VsZWN0b3IgdG8gdXNlIGZvciBldmVudCBkZWxlZ2F0aW9uIChvcHRpb25hbCkuXHJcbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSAtIEFuIG9iamVjdCB3aXRoIGEgZG8gbWV0aG9kIHRvIGFkZCBjYWxsYmFjayBmdW5jdGlvbnMuXHJcbiAgICAgKiBAZXhhbXBsZVxyXG4gICAgICogYXB4Lmxpc3RlbignY2xpY2snLCAnLm15LWJ1dHRvbicpLmRvKChldmVudCkgPT4ge1xyXG4gICAgICogICBjb25zb2xlLmxvZygnQnV0dG9uIGNsaWNrZWQhJywgZXZlbnQudGFyZ2V0KTtcclxuICAgICAqIH0pO1xyXG4gICAgICovXHJcbiAgICBhcHgubGlzdGVuID0gZnVuY3Rpb24gKGV2ZW50VHlwZXMsIHNlY29uZEFyZ3VtZW50LCB0aGlyZEFyZ3VtZW50KSB7XHJcbiAgICAgICAgbGV0IHNlbGVjdG9yO1xyXG4gICAgICAgIGxldCBvcHRpb25zID0ge307XHJcbiAgICAgICAgLy8gRGV0ZXJtaW5lIGlmIHRoZSBzZWNvbmQgYXJndW1lbnQgaXMgYSBzZWxlY3RvciBvciBvcHRpb25zXHJcbiAgICAgICAgaWYgKHR5cGVvZiBzZWNvbmRBcmd1bWVudCA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgICAgICAgc2VsZWN0b3IgPSBzZWNvbmRBcmd1bWVudDtcclxuICAgICAgICAgICAgb3B0aW9ucyA9IHRoaXJkQXJndW1lbnQgfHwge307XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgb3B0aW9ucyA9IHNlY29uZEFyZ3VtZW50IHx8IHt9O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgdW5pcXVlSWQgPSBnZW5lcmF0ZVVuaXF1ZUlkKCk7XHJcbiAgICAgICAgY29uc3QgdGltZW91dER1cmF0aW9uID0gb3B0aW9ucy50aW1lb3V0IHx8IDA7XHJcbiAgICAgICAgXHJcbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGV2ZW50VHlwZXMpKSB7XHJcbiAgICAgICAgICAgIGV2ZW50VHlwZXMgPSBbZXZlbnRUeXBlc107IC8vIEVuc3VyZSBldmVudFR5cGVzIGlzIGFuIGFycmF5XHJcbiAgICAgICAgfVxyXG4gICAgICAgIFxyXG4gICAgICAgIGV2ZW50VHlwZXMuZm9yRWFjaCgoZXZlbnRUeXBlKSA9PiB7XHJcbiAgICAgICAgICAgIGVsZW1lbnRzLmZvckVhY2goKGVsZW1lbnQpID0+IHtcclxuICAgICAgICAgICAgICAgIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihldmVudFR5cGUsIChldmVudCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVDYWxsYmFja3MoZXZlbnQsIHVuaXF1ZUlkLCB0aW1lb3V0RHVyYXRpb24sIHNlbGVjdG9yLCBlbGVtZW50KTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgLyoqXHJcbiAgICAgICAgICAgICAqIEFkZHMgYSBjYWxsYmFjayBmdW5jdGlvbiB0byB0aGUgZG9DYWxsYmFja3Mgb2JqZWN0IGZvciB0aGUgY3VycmVudCBldmVudCBsaXN0ZW5lci5cclxuICAgICAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZG9DYWxsYmFjayAtIFRoZSBjYWxsYmFjayBmdW5jdGlvbiB0byBleGVjdXRlIHdoZW4gdGhlIGV2ZW50IGlzIHRyaWdnZXJlZC5cclxuICAgICAgICAgICAgICogQHJldHVybnMge09iamVjdH0gLSBSZXR1cm5zIHRoZSBjdXJyZW50IG9iamVjdCB0byBhbGxvdyBmb3IgY2hhaW5lZCBjYWxscy5cclxuICAgICAgICAgICAgICogQGV4YW1wbGVcclxuICAgICAgICAgICAgICogYXB4Lmxpc3RlbignY2xpY2snLCAnLm15LWJ1dHRvbicpLmRvKChldmVudCkgPT4ge1xyXG4gICAgICAgICAgICAgKiAgIGNvbnNvbGUubG9nKCdCdXR0b24gY2xpY2tlZCEnLCBldmVudC50YXJnZXQpO1xyXG4gICAgICAgICAgICAgKiB9KS5kbygoZXZlbnQpID0+IHtcclxuICAgICAgICAgICAgICogICBjb25zb2xlLmxvZygnQW5vdGhlciBjYWxsYmFjayBmdW5jdGlvbiEnKTtcclxuICAgICAgICAgICAgICogfSk7XHJcbiAgICAgICAgICAgICAqL1xyXG4gICAgICAgICAgICBkbzogZnVuY3Rpb24gKGRvQ2FsbGJhY2spIHtcclxuICAgICAgICAgICAgICAgIGlmICghZG9DYWxsYmFja3NbdW5pcXVlSWRdKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZG9DYWxsYmFja3NbdW5pcXVlSWRdID0gW107XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBkb0NhbGxiYWNrc1t1bmlxdWVJZF0ucHVzaChkb0NhbGxiYWNrKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOyAvLyBSZXR1cm4gdGhlIG9iamVjdCB0byBhbGxvdyBmb3IgY2hhaW5lZCBjYWxsc1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgIH07XHJcbiAgICB9O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogTWFudWFsbHkgdHJpZ2dlcnMgdGhlIHJlZ2lzdGVyZWQgY2FsbGJhY2tzIGZvciBhIGdpdmVuIGV2ZW50IHR5cGUgb24gYWxsIGVsZW1lbnRzIG9yIGNyZWF0ZXMgYSBuZXcgZXZlbnQgaWYgYSBzdHJpbmcgaXMgcHJvdmlkZWQuXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ3xFdmVudH0gZXZlbnQgLSBUaGUgZXZlbnQgdG8gdHJpZ2dlci4gVGhpcyBjYW4gYmUgYW4gZXZlbnQgdHlwZSBzdHJpbmcgKGxpa2UgJ2NsaWNrJykgb3IgYW4gYWN0dWFsIEV2ZW50IG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgYXB4LnRyaWdnZXIgPSBmdW5jdGlvbiAoZXZlbnQpIHtcclxuICAgICAgICBsZXQgZXZlbnRUeXBlO1xyXG4gICAgICAgIGlmICh0eXBlb2YgZXZlbnQgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgICAgIGV2ZW50VHlwZSA9IGV2ZW50O1xyXG4gICAgICAgICAgICBldmVudCA9IG5ldyBFdmVudChldmVudCwgeyBidWJibGVzOiB0cnVlLCBjYW5jZWxhYmxlOiB0cnVlIH0pO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoZXZlbnQgaW5zdGFuY2VvZiBFdmVudCkge1xyXG4gICAgICAgICAgICBldmVudFR5cGUgPSBldmVudC50eXBlO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0ludmFsaWQgZXZlbnQgdHlwZSBwcm92aWRlZCB0byBhcHgudHJpZ2dlci4gSXQgbXVzdCBiZSBlaXRoZXIgYSBzdHJpbmcgb3IgRXZlbnQgb2JqZWN0LicpO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBhcHguZWxlbWVudHMuZm9yRWFjaCgoZWxlbWVudCkgPT4ge1xyXG4gICAgICAgICAgICBlbGVtZW50LmRpc3BhdGNoRXZlbnQoZXZlbnQpOyAgLy8gVGhpcyB3aWxsIGFsbG93IHRoZSBldmVudCB0byBidWJibGUgdXAgbmF0dXJhbGx5LlxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICAvLyBIYW5kbGUgZXZlbnQgZGVsZWdhdGlvbiBtYW51YWxseSBieSBleGVjdXRpbmcgY2FsbGJhY2tzIGlmIHRoZSB0YXJnZXQgbWF0Y2hlcyB0aGUgc2VsZWN0b3JcclxuICAgICAgICBPYmplY3Qua2V5cyhkb0NhbGxiYWNrcykuZm9yRWFjaCgodW5pcXVlSWQpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgY2FsbGJhY2tEZXRhaWxzID0gZG9DYWxsYmFja3NbdW5pcXVlSWRdO1xyXG4gICAgICAgICAgICBpZiAoY2FsbGJhY2tEZXRhaWxzICYmIGNhbGxiYWNrRGV0YWlscy5ldmVudFR5cGUgPT09IGV2ZW50VHlwZSkge1xyXG4gICAgICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIGV2ZW50IHRhcmdldCBtYXRjaGVzIHRoZSBzZWxlY3RvciB1c2VkIGR1cmluZyBsaXN0ZW5lciByZWdpc3RyYXRpb25cclxuICAgICAgICAgICAgICAgIGNvbnN0IHsgc2VsZWN0b3IgfSA9IGNhbGxiYWNrRGV0YWlscztcclxuICAgICAgICAgICAgICAgIGlmICghc2VsZWN0b3IgfHwgZXZlbnQudGFyZ2V0Lm1hdGNoZXMoc2VsZWN0b3IpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZUNhbGxiYWNrcyhldmVudCwgdW5pcXVlSWQsIDAsIHNlbGVjdG9yLCBldmVudC50YXJnZXQpOyAgLy8gSW1tZWRpYXRlIGV4ZWN1dGlvbiwgbm8gdGltZW91dFxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9O1xyXG4gICAgXHJcbiAgICByZXR1cm4gYXB4O1xyXG59O1xyXG5cclxuXHJcbmZ1bmN0aW9uIGV4ZWN1dGVDYWxsYmFja3MoZXZlbnQsIHVuaXF1ZUlkLCB0aW1lb3V0RHVyYXRpb24sIHNlbGVjdG9yID0gJycsIGVsZW1lbnQpIHtcclxuICAgIGNvbnN0IG1hdGNoZWRFbGVtZW50ID0gc2VsZWN0b3IgPyBjbG9zZXN0KGV2ZW50LnRhcmdldCwgc2VsZWN0b3IpIDogZWxlbWVudDtcclxuICAgIGlmICghbWF0Y2hlZEVsZW1lbnQpIHtcclxuICAgICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgLy8gQ2xlYXIgYW55IHByZXZpb3VzIHRpbWVvdXQgZm9yIHRoaXMgdW5pcXVlSWQgdG8gcHJldmVudCB1bmludGVuZGVkIGJlaGF2aW9yXHJcbiAgICBjbGVhclRpbWVvdXQodGltZW91dHNbdW5pcXVlSWRdKTtcclxuXHJcbiAgICAvLyBGdW5jdGlvbiB0byBoYW5kbGUgdGhlIGV4ZWN1dGlvbiBvZiBjYWxsYmFja3NcclxuICAgIGZ1bmN0aW9uIGhhbmRsZUNhbGxiYWNrRXhlY3V0aW9uKCkge1xyXG4gICAgICAgIGlmIChkb0NhbGxiYWNrc1t1bmlxdWVJZF0pIHtcclxuICAgICAgICAgICAgZG9DYWxsYmFja3NbdW5pcXVlSWRdLnJlZHVjZSgocHJldlByb21pc2UsIGRvQ2FsbGJhY2spID0+IHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBwcmV2UHJvbWlzZS50aGVuKCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gZG9DYWxsYmFjay5iaW5kKG1hdGNoZWRFbGVtZW50KShldmVudCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgUHJvbWlzZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC50aGVuKHJlc29sdmUpLmNhdGNoKHJlamVjdCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUocmVzdWx0KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChlcnJvcik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9LCBQcm9taXNlLnJlc29sdmUoKSkuY2F0Y2goKCkgPT4ge30pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyBDaGVjayBpZiB0aW1lb3V0RHVyYXRpb24gaXMgemVybyB0byBkZWNpZGUgd2hldGhlciB0byBkZWxheSB0aGUgY2FsbGJhY2sgZXhlY3V0aW9uIG9yIG5vdFxyXG4gICAgaWYgKHRpbWVvdXREdXJhdGlvbiA9PT0gMCkge1xyXG4gICAgICAgIGhhbmRsZUNhbGxiYWNrRXhlY3V0aW9uKCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRpbWVvdXRzW3VuaXF1ZUlkXSA9IHNldFRpbWVvdXQoaGFuZGxlQ2FsbGJhY2tFeGVjdXRpb24sIHRpbWVvdXREdXJhdGlvbik7XHJcbiAgICB9XHJcbn1cclxuXHJcblxyXG5mdW5jdGlvbiBnZW5lcmF0ZVVuaXF1ZUlkKCkge1xyXG4gICAgY29uc3QgcmFuZG9tUGFydCA9IE1hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnN1YnN0cigyLCA5KTsgLy8gTW9yZSByYW5kb21uZXNzXHJcbiAgICBjb25zdCB1bmlxdWVJZCA9IGAke0RhdGUubm93KCl9XyR7cmFuZG9tUGFydH1fJHtjb3VudGVyfWA7XHJcbiAgICBjb3VudGVyID0gKGNvdW50ZXIgKyAxKSAlIDEwMDA7IC8vIFJlc2V0IGNvdW50ZXIgdG8gYXZvaWQgb3ZlcmZsb3dcclxuXHJcbiAgICByZXR1cm4gdW5pcXVlSWQ7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGNsb3Nlc3QoZWxlbWVudCwgc2VsZWN0b3IpIHtcclxuICAgIHdoaWxlIChlbGVtZW50ICYmIGVsZW1lbnQubm9kZVR5cGUgPT09IDEpIHtcclxuICAgICAgICBpZiAoZWxlbWVudC5tYXRjaGVzKHNlbGVjdG9yKSkge1xyXG4gICAgICAgICAgICByZXR1cm4gZWxlbWVudDtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxlbWVudCA9IGVsZW1lbnQucGFyZW50Tm9kZTtcclxuICAgIH1cclxuICAgIHJldHVybiBudWxsO1xyXG59XHJcbiIsImltcG9ydCAnLi9jc3Mvc2Nyb2xsYWJsZVRhYmxlLmNzcyc7XHJcblxyXG5jb25zdCBEQVRBX0tFWSA9ICdfYXB4U2Nyb2xsYWJsZVRhYmxlJztcclxuY29uc3QgQ0xBU1NfVEFCTEUgPSAnYXB4LXNjcm9sbGFibGUtdGFibGUnO1xyXG5cclxuY29uc3QgREVGQVVMVF9NQVhfSEVJR0hUID0gJzIwMHB4JztcclxuXHJcbi8qKlxyXG4gKiBHZXQgbnVtYmVyIG9mIGNvbHVtbnMgZnJvbSB0aGUgZmlyc3Qgcm93IHRoYXQgaGFzIGNlbGxzIChzdW0gb2YgY29sc3BhbikuXHJcbiAqIEBwYXJhbSB7SFRNTFRhYmxlU2VjdGlvbkVsZW1lbnR9IHNlY3Rpb24gLSB0aGVhZCwgdGJvZHksIG9yIHRmb290XHJcbiAqIEByZXR1cm5zIHtudW1iZXJ9XHJcbiAqL1xyXG5mdW5jdGlvbiBnZXRDb2x1bW5Db3VudEZyb21TZWN0aW9uKHNlY3Rpb24pIHtcclxuICAgIGNvbnN0IGZpcnN0Um93ID0gc2VjdGlvbj8ucXVlcnlTZWxlY3RvcignOnNjb3BlID4gdHInKTtcclxuICAgIGlmICghZmlyc3RSb3cpIHJldHVybiAwO1xyXG4gICAgbGV0IGNvbHMgPSAwO1xyXG4gICAgZmlyc3RSb3cucXVlcnlTZWxlY3RvckFsbCgnOnNjb3BlID4gdGgsIDpzY29wZSA+IHRkJykuZm9yRWFjaCgoY2VsbCkgPT4ge1xyXG4gICAgICAgIGNvbHMgKz0gcGFyc2VJbnQoY2VsbC5nZXRBdHRyaWJ1dGUoJ2NvbHNwYW4nKSwgMTApIHx8IDE7XHJcbiAgICB9KTtcclxuICAgIHJldHVybiBjb2xzO1xyXG59XHJcblxyXG4vKipcclxuICogR2V0IHRvdGFsIGNvbHVtbiBjb3VudCBmb3IgdGhlIHRhYmxlIChmcm9tIHRoZWFkIG9yIHRib2R5IGZpcnN0IHJvdykuXHJcbiAqIEBwYXJhbSB7SFRNTFRhYmxlRWxlbWVudH0gdGFibGVcclxuICogQHJldHVybnMge251bWJlcn1cclxuICovXHJcbmZ1bmN0aW9uIGdldFRhYmxlQ29sdW1uQ291bnQodGFibGUpIHtcclxuICAgIGNvbnN0IHRoZWFkID0gdGFibGUucXVlcnlTZWxlY3RvcigndGhlYWQnKTtcclxuICAgIGNvbnN0IHRib2R5ID0gdGFibGUucXVlcnlTZWxlY3RvcigndGJvZHknKTtcclxuICAgIGNvbnN0IGNvdW50RnJvbVRoZWFkID0gdGhlYWQgPyBnZXRDb2x1bW5Db3VudEZyb21TZWN0aW9uKHRoZWFkKSA6IDA7XHJcbiAgICBjb25zdCBjb3VudEZyb21UYm9keSA9IHRib2R5ID8gZ2V0Q29sdW1uQ291bnRGcm9tU2VjdGlvbih0Ym9keSkgOiAwO1xyXG4gICAgcmV0dXJuIGNvdW50RnJvbVRoZWFkIHx8IGNvdW50RnJvbVRib2R5IHx8IDE7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBDb3VudCBkaXJlY3QgdHIgY2hpbGRyZW4gaW4gYSBzZWN0aW9uLlxyXG4gKiBAcGFyYW0ge0hUTUxUYWJsZVNlY3Rpb25FbGVtZW50fSBzZWN0aW9uXHJcbiAqIEByZXR1cm5zIHtudW1iZXJ9XHJcbiAqL1xyXG5mdW5jdGlvbiBnZXRSb3dDb3VudChzZWN0aW9uKSB7XHJcbiAgICBpZiAoIXNlY3Rpb24pIHJldHVybiAwO1xyXG4gICAgcmV0dXJuIHNlY3Rpb24ucXVlcnlTZWxlY3RvckFsbCgnOnNjb3BlID4gdHInKS5sZW5ndGg7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBCdWlsZCBhIDJEIGdyaWQgb2Ygb2NjdXBpZWQgc2xvdHMgZm9yIGEgc2VjdGlvbiAoZm9yIHJvd3NwYW4vY29sc3BhbiBwbGFjZW1lbnQpLlxyXG4gKiBQbGFjZSBlYWNoIGNlbGwgaW4gRE9NIG9yZGVyOyByZXR1cm4gYSBsaXN0IG9mIHsgY2VsbCwgcm93LCBjb2wsIGNvbHNwYW4sIHJvd3NwYW4gfS5cclxuICogQHBhcmFtIHtIVE1MVGFibGVTZWN0aW9uRWxlbWVudH0gc2VjdGlvblxyXG4gKiBAcGFyYW0ge251bWJlcn0gbnVtUm93c1xyXG4gKiBAcGFyYW0ge251bWJlcn0gbnVtQ29sc1xyXG4gKiBAcmV0dXJucyB7eyBjZWxsOiBIVE1MVGFibGVDZWxsRWxlbWVudCwgcm93OiBudW1iZXIsIGNvbDogbnVtYmVyLCBjb2xzcGFuOiBudW1iZXIsIHJvd3NwYW46IG51bWJlciB9W119XHJcbiAqL1xyXG5mdW5jdGlvbiBjb21wdXRlQ2VsbFBsYWNlbWVudHMoc2VjdGlvbiwgbnVtUm93cywgbnVtQ29scykge1xyXG4gICAgaWYgKCFzZWN0aW9uIHx8IG51bVJvd3MgPT09IDAgfHwgbnVtQ29scyA9PT0gMCkgcmV0dXJuIFtdO1xyXG4gICAgY29uc3Qgb2NjdXBpZWQgPSBBcnJheS5mcm9tKHsgbGVuZ3RoOiBudW1Sb3dzIH0sICgpID0+IEFycmF5KG51bUNvbHMpLmZpbGwoZmFsc2UpKTtcclxuICAgIGNvbnN0IHBsYWNlbWVudHMgPSBbXTtcclxuICAgIGNvbnN0IHJvd3MgPSBzZWN0aW9uLnF1ZXJ5U2VsZWN0b3JBbGwoJzpzY29wZSA+IHRyJyk7XHJcblxyXG4gICAgZm9yIChsZXQgciA9IDA7IHIgPCByb3dzLmxlbmd0aDsgcisrKSB7XHJcbiAgICAgICAgY29uc3QgdHIgPSByb3dzW3JdO1xyXG4gICAgICAgIGNvbnN0IGNlbGxzID0gdHIucXVlcnlTZWxlY3RvckFsbCgnOnNjb3BlID4gdGgsIDpzY29wZSA+IHRkJyk7XHJcbiAgICAgICAgZm9yIChjb25zdCBjZWxsIG9mIGNlbGxzKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGNvbHNwYW4gPSBNYXRoLm1pbihwYXJzZUludChjZWxsLmdldEF0dHJpYnV0ZSgnY29sc3BhbicpLCAxMCkgfHwgMSwgbnVtQ29scyk7XHJcbiAgICAgICAgICAgIGNvbnN0IHJvd3NwYW4gPSBNYXRoLm1pbihwYXJzZUludChjZWxsLmdldEF0dHJpYnV0ZSgncm93c3BhbicpLCAxMCkgfHwgMSwgbnVtUm93cyAtIHIpO1xyXG4gICAgICAgICAgICBsZXQgY29sID0gMDtcclxuICAgICAgICAgICAgd2hpbGUgKGNvbCA8IG51bUNvbHMpIHtcclxuICAgICAgICAgICAgICAgIGxldCBmcmVlID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIGZvciAobGV0IHJyID0gcjsgcnIgPCByICsgcm93c3BhbiAmJiBmcmVlOyBycisrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgY2MgPSBjb2w7IGNjIDwgY29sICsgY29sc3BhbiAmJiBmcmVlOyBjYysrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvY2N1cGllZFtycl0/LltjY10pIGZyZWUgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBpZiAoZnJlZSkgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjb2wrKztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoY29sICsgY29sc3BhbiA+IG51bUNvbHMpIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICBmb3IgKGxldCByciA9IHI7IHJyIDwgciArIHJvd3NwYW47IHJyKyspIHtcclxuICAgICAgICAgICAgICAgIGZvciAobGV0IGNjID0gY29sOyBjYyA8IGNvbCArIGNvbHNwYW47IGNjKyspIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAob2NjdXBpZWRbcnJdKSBvY2N1cGllZFtycl1bY2NdID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBwbGFjZW1lbnRzLnB1c2goeyBjZWxsLCByb3c6IHIsIGNvbCwgY29sc3Bhbiwgcm93c3BhbiB9KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcGxhY2VtZW50cztcclxufVxyXG5cclxuLyoqXHJcbiAqIEFwcGx5IGdyaWQgcGxhY2VtZW50IHN0eWxlcyB0byBhIGxpc3Qgb2YgcGxhY2VtZW50cyAoMS1iYXNlZCBsaW5lIG51bWJlcnMgZm9yIENTUyBHcmlkKS5cclxuICovXHJcbmZ1bmN0aW9uIGFwcGx5UGxhY2VtZW50cyhwbGFjZW1lbnRzKSB7XHJcbiAgICBwbGFjZW1lbnRzLmZvckVhY2goKHsgY2VsbCwgcm93LCBjb2wsIGNvbHNwYW4sIHJvd3NwYW4gfSkgPT4ge1xyXG4gICAgICAgIGNlbGwuc3R5bGUuZ3JpZFJvdyA9IGAke3JvdyArIDF9IC8gc3BhbiAke3Jvd3NwYW59YDtcclxuICAgICAgICBjZWxsLnN0eWxlLmdyaWRDb2x1bW4gPSBgJHtjb2wgKyAxfSAvIHNwYW4gJHtjb2xzcGFufWA7XHJcbiAgICB9KTtcclxufVxyXG5cclxuLyoqXHJcbiAqIENsZWFyIGdyaWQgcGxhY2VtZW50IHN0eWxlcyBmcm9tIGFsbCB0aC90ZCBpbiBhIHRhYmxlIChmb3IgcmVmcmVzaCkuXHJcbiAqIEBwYXJhbSB7SFRNTFRhYmxlRWxlbWVudH0gdGFibGVcclxuICovXHJcbmZ1bmN0aW9uIGNsZWFyUGxhY2VtZW50cyh0YWJsZSkge1xyXG4gICAgdGFibGUucXVlcnlTZWxlY3RvckFsbCgndGgsIHRkJykuZm9yRWFjaCgoY2VsbCkgPT4ge1xyXG4gICAgICAgIGNlbGwuc3R5bGUuZ3JpZFJvdyA9ICcnO1xyXG4gICAgICAgIGNlbGwuc3R5bGUuZ3JpZENvbHVtbiA9ICcnO1xyXG4gICAgfSk7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBOb3JtYWxpemUgbWF4SGVpZ2h0IG9wdGlvbiB0byBhIENTUyBsZW5ndGggc3RyaW5nLlxyXG4gKiBAcGFyYW0ge251bWJlcnxzdHJpbmd9IHZhbHVlXHJcbiAqIEByZXR1cm5zIHtzdHJpbmd9XHJcbiAqL1xyXG5mdW5jdGlvbiBub3JtYWxpemVNYXhIZWlnaHQodmFsdWUpIHtcclxuICAgIGlmICh2YWx1ZSA9PSBudWxsKSByZXR1cm4gREVGQVVMVF9NQVhfSEVJR0hUO1xyXG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHJldHVybiBgJHt2YWx1ZX1weGA7XHJcbiAgICByZXR1cm4gU3RyaW5nKHZhbHVlKTtcclxufVxyXG5cclxuLyoqXHJcbiAqIEFwcGx5IHNjcm9sbGFibGUgdGFibGUgbGF5b3V0IHRvIGEgc2luZ2xlIHRhYmxlLlxyXG4gKiBAcGFyYW0ge0hUTUxUYWJsZUVsZW1lbnR9IHRhYmxlXHJcbiAqIEBwYXJhbSB7eyBtYXhIZWlnaHQ/OiBudW1iZXJ8c3RyaW5nIH19IG9wdGlvbnNcclxuICovXHJcbmZ1bmN0aW9uIGFwcGx5U2Nyb2xsYWJsZVRhYmxlKHRhYmxlLCBvcHRpb25zKSB7XHJcbiAgICBjb25zdCB0aGVhZCA9IHRhYmxlLnF1ZXJ5U2VsZWN0b3IoJ3RoZWFkJyk7XHJcbiAgICBjb25zdCB0Ym9keSA9IHRhYmxlLnF1ZXJ5U2VsZWN0b3IoJ3Rib2R5Jyk7XHJcbiAgICBjb25zdCB0Zm9vdCA9IHRhYmxlLnF1ZXJ5U2VsZWN0b3IoJ3Rmb290Jyk7XHJcblxyXG4gICAgY29uc3QgbnVtQ29scyA9IGdldFRhYmxlQ29sdW1uQ291bnQodGFibGUpO1xyXG4gICAgaWYgKG51bUNvbHMgPT09IDApIHJldHVybjtcclxuXHJcbiAgICBjb25zdCB0aGVhZFJvd3MgPSBnZXRSb3dDb3VudCh0aGVhZCk7XHJcbiAgICBjb25zdCB0Ym9keVJvd3MgPSBnZXRSb3dDb3VudCh0Ym9keSk7XHJcbiAgICBjb25zdCB0Zm9vdFJvd3MgPSBnZXRSb3dDb3VudCh0Zm9vdCk7XHJcblxyXG4gICAgdGFibGUuc3R5bGUuc2V0UHJvcGVydHkoJy0tYXB4LXNjcm9sbGFibGUtY29scycsIFN0cmluZyhudW1Db2xzKSk7XHJcbiAgICB0YWJsZS5zdHlsZS5zZXRQcm9wZXJ0eSgnLS1hcHgtc2Nyb2xsYWJsZS10aGVhZC1yb3dzJywgU3RyaW5nKE1hdGgubWF4KDEsIHRoZWFkUm93cykpKTtcclxuICAgIHRhYmxlLnN0eWxlLnNldFByb3BlcnR5KCctLWFweC1zY3JvbGxhYmxlLXRib2R5LXJvd3MnLCBTdHJpbmcoTWF0aC5tYXgoMSwgdGJvZHlSb3dzKSkpO1xyXG4gICAgdGFibGUuc3R5bGUuc2V0UHJvcGVydHkoJy0tYXB4LXNjcm9sbGFibGUtdGZvb3Qtcm93cycsIFN0cmluZyhNYXRoLm1heCgxLCB0Zm9vdFJvd3MpKSk7XHJcbiAgICB0YWJsZS5zdHlsZS5zZXRQcm9wZXJ0eSgnLS1hcHgtc2Nyb2xsYWJsZS1ib2R5LW1heC1oZWlnaHQnLCBub3JtYWxpemVNYXhIZWlnaHQob3B0aW9ucy5tYXhIZWlnaHQpKTtcclxuXHJcbiAgICB0YWJsZS5jbGFzc0xpc3QuYWRkKENMQVNTX1RBQkxFKTtcclxuICAgIHRhYmxlLmNsYXNzTGlzdC50b2dnbGUoJ2FweC1zY3JvbGxhYmxlLXRhYmxlLS1oYXMtdGZvb3QnLCAhISh0Zm9vdCAmJiB0Zm9vdFJvd3MgPiAwKSk7XHJcbiAgICB0YWJsZS5jbGFzc0xpc3QudG9nZ2xlKCdhcHgtc2Nyb2xsYWJsZS10YWJsZS0tbm8tdGhlYWQnLCAhKHRoZWFkICYmIHRoZWFkUm93cyA+IDApKTtcclxuXHJcbiAgICBjbGVhclBsYWNlbWVudHModGFibGUpO1xyXG5cclxuICAgIGNvbnN0IHNlY3Rpb25zID0gW1xyXG4gICAgICAgIHsgc2VjdGlvbjogdGhlYWQsIHJvd3M6IE1hdGgubWF4KDEsIHRoZWFkUm93cykgfSxcclxuICAgICAgICB7IHNlY3Rpb246IHRib2R5LCByb3dzOiBNYXRoLm1heCgxLCB0Ym9keVJvd3MpIH0sXHJcbiAgICAgICAgeyBzZWN0aW9uOiB0Zm9vdCwgcm93czogTWF0aC5tYXgoMSwgdGZvb3RSb3dzKSB9XHJcbiAgICBdO1xyXG4gICAgc2VjdGlvbnMuZm9yRWFjaCgoeyBzZWN0aW9uLCByb3dzIH0pID0+IHtcclxuICAgICAgICBpZiAoIXNlY3Rpb24pIHJldHVybjtcclxuICAgICAgICBjb25zdCBwbGFjZW1lbnRzID0gY29tcHV0ZUNlbGxQbGFjZW1lbnRzKHNlY3Rpb24sIHJvd3MsIG51bUNvbHMpO1xyXG4gICAgICAgIGFwcGx5UGxhY2VtZW50cyhwbGFjZW1lbnRzKTtcclxuICAgIH0pO1xyXG59XHJcblxyXG4vKipcclxuICogQXVnbWVudHMgdGhlIEFQWCBvYmplY3Qgd2l0aCBzY3JvbGxhYmxlVGFibGUob3B0aW9ucyB8ICdyZWZyZXNoJykuXHJcbiAqIE1ha2VzIHRoZSB0Ym9keSBvZiBhIHRhYmxlIHNjcm9sbGFibGUgd2hpbGUga2VlcGluZyB0aGVhZC90Zm9vdCBmaXhlZCBhbmQgY29sdW1ucyBhbGlnbmVkIChDU1MgR3JpZCArIHN1YmdyaWQpLlxyXG4gKlxyXG4gKiBAcGFyYW0ge09iamVjdH0gYXB4IC0gVGhlIEFQWCBvYmplY3QgdG8gYXVnbWVudC5cclxuICogQGV4YW1wbGVcclxuICogQVBYKCd0YWJsZS5kYXRhLWdyaWQnKS5zY3JvbGxhYmxlVGFibGUoeyBtYXhIZWlnaHQ6IDMwMCB9KTtcclxuICogQVBYKCd0YWJsZS5kYXRhLWdyaWQnKS5zY3JvbGxhYmxlVGFibGUoJ3JlZnJlc2gnKTtcclxuICovXHJcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGF1Z21lbnRXaXRoU2Nyb2xsYWJsZVRhYmxlKGFweCkge1xyXG4gICAgYXB4LnNjcm9sbGFibGVUYWJsZSA9IGZ1bmN0aW9uIChvcHRpb25zT3JBY3Rpb24pIHtcclxuICAgICAgICBjb25zdCBpc1JlZnJlc2ggPSBvcHRpb25zT3JBY3Rpb24gPT09ICdyZWZyZXNoJztcclxuICAgICAgICBjb25zdCBvcHRpb25zID0gaXNSZWZyZXNoID8gbnVsbCA6IChvcHRpb25zT3JBY3Rpb24gJiYgdHlwZW9mIG9wdGlvbnNPckFjdGlvbiA9PT0gJ29iamVjdCcgPyBvcHRpb25zT3JBY3Rpb24gOiB7fSk7XHJcblxyXG4gICAgICAgIGFweC5lbGVtZW50cy5mb3JFYWNoKChlbGVtZW50KSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChlbGVtZW50LnRhZ05hbWUgIT09ICdUQUJMRScpIHJldHVybjtcclxuICAgICAgICAgICAgY29uc3QgdGFibGUgPSAvKiogQHR5cGUge0hUTUxUYWJsZUVsZW1lbnR9ICovIChlbGVtZW50KTtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IHJlZiA9IHRhYmxlW0RBVEFfS0VZXTtcclxuICAgICAgICAgICAgaWYgKHJlZikge1xyXG4gICAgICAgICAgICAgICAgaWYgKGlzUmVmcmVzaCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGFwcGx5U2Nyb2xsYWJsZVRhYmxlKHRhYmxlLCByZWYub3B0aW9ucyk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG9wdGlvbnMgJiYgT2JqZWN0LmtleXMob3B0aW9ucykubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJlZi5vcHRpb25zID0geyAuLi5yZWYub3B0aW9ucywgLi4ub3B0aW9ucyB9O1xyXG4gICAgICAgICAgICAgICAgICAgIGFwcGx5U2Nyb2xsYWJsZVRhYmxlKHRhYmxlLCByZWYub3B0aW9ucyk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKGlzUmVmcmVzaCkgcmV0dXJuO1xyXG5cclxuICAgICAgICAgICAgYXBwbHlTY3JvbGxhYmxlVGFibGUodGFibGUsIG9wdGlvbnMpO1xyXG4gICAgICAgICAgICB0YWJsZVtEQVRBX0tFWV0gPSB7IG9wdGlvbnM6IHsgLi4ub3B0aW9ucyB9IH07XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHJldHVybiBhcHg7XHJcbiAgICB9O1xyXG59XHJcbiIsIi8vIE1pbmltYWwsIGZyYW1ld29yay1hZ25vc3RpYyBUb2FzdE1hbmFnZXIgZm9yIEFQWFxyXG4vLyBFU00tZmlyc3QsIG5vIHNpZGUgZWZmZWN0cyBvbiBpbXBvcnQuIERPTSBvbmx5IHdoZW4gdXNlZC5cclxuaW1wb3J0ICcuL2Nzcy90b2FzdC5jc3MnO1xyXG5cclxuLyoqXHJcbiAqIEB0eXBlZGVmIHtPYmplY3R9IFBvc2l0aW9uT2JqZWN0XHJcbiAqIEBwcm9wZXJ0eSB7J3N0aWNreSd8J3JlbGF0aXZlJ3wnYW5jaG9yZWQnfSBbdHlwZV1cclxuICogQHByb3BlcnR5IHtzdHJpbmd9IFt4XVxyXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3ldXHJcbiAqIEBwcm9wZXJ0eSB7SFRNTEVsZW1lbnR9IFtlbGVtZW50XVxyXG4gKiBAcHJvcGVydHkgeyd0b3AnfCdyaWdodCd8J2JvdHRvbSd8J2xlZnQnfCdhYm92ZSd8J2JlbG93J3wnYmVmb3JlJ3wnYWZ0ZXInfSBbcGxhY2VtZW50XVxyXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2dhcF1cclxuICogQHByb3BlcnR5IHtib29sZWFufSBbdXNlTmF0aXZlQ1NTXVxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBAdHlwZWRlZiB7c3RyaW5nfFBvc2l0aW9uT2JqZWN0fSBQb3NpdGlvblxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBUb2FzdENvbmZpZ1xyXG4gKiBAcHJvcGVydHkge1Bvc2l0aW9ufSBbcG9zaXRpb25dXHJcbiAqIEBwcm9wZXJ0eSB7J3VwJ3wnZG93bid8J2F1dG8nfSBbZmxvd10gRmxvdyBkaXJlY3Rpb24gZm9yIHN0YWNraW5nIHRvYXN0cy4gJ2F1dG8nIGRldGVybWluZXMgYmFzZWQgb24gcG9zaXRpb24uIERlZmF1bHQ6ICdhdXRvJ1xyXG4gKiBAcHJvcGVydHkge251bWJlcn0gW21heFRvYXN0c11cclxuICogQHByb3BlcnR5IHtudW1iZXJ9IFtkZWZhdWx0RHVyYXRpb25Nc11cclxuICogQHByb3BlcnR5IHtudW1iZXJ9IFt6SW5kZXhdXHJcbiAqIEBwcm9wZXJ0eSB7J3BvbGl0ZSd8J2Fzc2VydGl2ZSd8J29mZid9IFthcmlhTGl2ZV1cclxuICogQHByb3BlcnR5IHtudW1iZXJ9IFtnYXBdXHJcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2RlZHVwZV1cclxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtjb250YWluZXJDbGFzc11cclxuICogQHByb3BlcnR5IHtudW1iZXJ9IFtvZmZzZXRdXHJcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbaWRdXHJcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbnx7ZW5hYmxlOiBib29sZWFuLCBwb3NpdGlvbjogJ3RvcCd8J2JvdHRvbSd9fSBbcHJvZ3Jlc3NdIERlZmF1bHQ6IGZhbHNlLiBTaG93IHByb2dyZXNzIGJhciB3aGVuIHRydWUgb3IgeyBlbmFibGU6IHRydWUsIHBvc2l0aW9uOiAndG9wJ3wnYm90dG9tJyB9LlxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBAdHlwZWRlZiB7e2VuYWJsZTogYm9vbGVhbiwgcG9zaXRpb246ICd0b3AnfCdib3R0b20nLCBwYXVzZUJ1dHRvbjogYm9vbGVhbn19IFByb2dyZXNzT3B0XHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIEB0eXBlZGVmIHtPYmplY3R9IFRvYXN0T3B0aW9uc1xyXG4gKiBAcHJvcGVydHkge3N0cmluZ3xOb2RlfSBtZXNzYWdlXHJcbiAqIEBwcm9wZXJ0eSB7J2luZm8nfCdzdWNjZXNzJ3wnd2FybmluZyd8J2Rhbmdlcid9IFt0eXBlXVxyXG4gKiBAcHJvcGVydHkge251bWJlcn0gW2R1cmF0aW9uTXNdXHJcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2Rpc21pc3NpYmxlXVxyXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2lkXVxyXG4gKiBAcHJvcGVydHkgeyhyZWY6IFRvYXN0UmVmLCBldjogTW91c2VFdmVudCkgPT4gdm9pZH0gW29uQ2xpY2tdXHJcbiAqIEBwcm9wZXJ0eSB7KHJlZjogVG9hc3RSZWYsIHJlYXNvbjogJ3RpbWVvdXQnfCdjbG9zZSd8J2FwaSd8J292ZXJmbG93JykgPT4gdm9pZH0gW29uQ2xvc2VdXHJcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbY2xhc3NOYW1lXVxyXG4gKiBAcHJvcGVydHkge1Bvc2l0aW9ufSBbcG9zaXRpb25dXHJcbiAqIEBwcm9wZXJ0eSB7J3VwJ3wnZG93bid8J2F1dG8nfSBbZmxvd10gRmxvdyBkaXJlY3Rpb24gZm9yIHN0YWNraW5nIHRvYXN0cy4gJ2F1dG8nIGRldGVybWluZXMgYmFzZWQgb24gcG9zaXRpb24uIERlZmF1bHQ6ICdhdXRvJ1xyXG4gKiBAcHJvcGVydHkge2Jvb2xlYW58e2VuYWJsZTogYm9vbGVhbiwgcG9zaXRpb246ICd0b3AnfCdib3R0b20nLCBwYXVzZUJ1dHRvbj86IGJvb2xlYW59fSBbcHJvZ3Jlc3NdIFNob3cgcHJvZ3Jlc3MgYmFyOiB0cnVlID0gdG9wLCBvciB7IGVuYWJsZSwgcG9zaXRpb24sIHBhdXNlQnV0dG9uIH0gKHBhdXNlQnV0dG9uIGRlZmF1bHQgZmFsc2UpLlxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBUb2FzdFJlZlxyXG4gKiBAcHJvcGVydHkge3N0cmluZ30gaWRcclxuICogQHByb3BlcnR5IHtIVE1MRWxlbWVudH0gZWxcclxuICogQHByb3BlcnR5IHsocmVhc29uPzogJ2FwaSd8J2Nsb3NlJykgPT4gdm9pZH0gY2xvc2VcclxuICogQHByb3BlcnR5IHsocGFydGlhbDogUGFydGlhbDxUb2FzdE9wdGlvbnM+KSA9PiB2b2lkfSB1cGRhdGVcclxuICogQHByb3BlcnR5IHsoKSA9PiBQcm9taXNlPHZvaWQ+fSB3aGVuQ2xvc2VkXHJcbiAqIEBwcm9wZXJ0eSB7KGV2ZW50OiAnY2xvc2UnfCdjbGljaycsIGhhbmRsZXI6IEZ1bmN0aW9uKSA9PiAoKSA9PiB2b2lkfSBvblxyXG4gKiBAcHJvcGVydHkgeyhldmVudDogJ2Nsb3NlJ3wnY2xpY2snLCBoYW5kbGVyOiBGdW5jdGlvbikgPT4gdm9pZH0gb2ZmXHJcbiAqL1xyXG5cclxuY29uc3QgaXNCcm93c2VyID0gdHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIGRvY3VtZW50ICE9PSAndW5kZWZpbmVkJztcclxuXHJcbi8vIFNoYXJlZCBjb250YWluZXIgY2FjaGU6IE1hcDxwb3NpdGlvbiwgSFRNTEVsZW1lbnQ+XHJcbi8vIENvbnRhaW5lcnMgYXJlIHNoYXJlZCBiZXR3ZWVuIG1hbmFnZXJzIHdpdGggdGhlIHNhbWUgcG9zaXRpb25cclxuY29uc3QgX2NvbnRhaW5lckNhY2hlID0gbmV3IE1hcCgpO1xyXG5cclxuLy8gR2FyYmFnZSBjb2xsZWN0aW9uOiBjbGVhbnVwIGVtcHR5IHVubWFuYWdlZCBjb250YWluZXJzIGFmdGVyIGEgZGVsYXlcclxuY29uc3QgR0NfREVMQVlfTVMgPSAyMDAwMDsgLy8gMjAgc2Vjb25kc1xyXG5sZXQgX2djVGltZW91dElkID0gbnVsbDtcclxuXHJcbi8vIFdyYXBwZXIgZm9yIGFsbCB0b2FzdCBjb250YWluZXJzIChrZWVwcyBET00gY2xlYW4pXHJcbmxldCBfdG9hc3RXcmFwcGVyID0gbnVsbDtcclxuXHJcbi8qKlxyXG4gKiBHZXQgb3IgY3JlYXRlIHRoZSB0b2FzdCBjb250YWluZXJzIHdyYXBwZXJcclxuICogQHJldHVybnMge0hUTUxFbGVtZW50fG51bGx9XHJcbiAqL1xyXG5mdW5jdGlvbiBnZXRUb2FzdFdyYXBwZXIoKSB7XHJcbiAgICBpZiAoIWlzQnJvd3NlcikgcmV0dXJuIG51bGw7XHJcbiAgICBcclxuICAgIGlmICghX3RvYXN0V3JhcHBlcikge1xyXG4gICAgICAgIF90b2FzdFdyYXBwZXIgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuQVBYLXRvYXN0LXdyYXBwZXInKTtcclxuICAgICAgICBpZiAoIV90b2FzdFdyYXBwZXIpIHtcclxuICAgICAgICAgICAgX3RvYXN0V3JhcHBlciA9IGNyZWF0ZUVsKCdkaXYnLCAnQVBYLXRvYXN0LXdyYXBwZXInKTtcclxuICAgICAgICAgICAgX3RvYXN0V3JhcHBlci5zdHlsZS5wb3NpdGlvbiA9ICdmaXhlZCc7XHJcbiAgICAgICAgICAgIF90b2FzdFdyYXBwZXIuc3R5bGUudG9wID0gJzAnO1xyXG4gICAgICAgICAgICBfdG9hc3RXcmFwcGVyLnN0eWxlLmxlZnQgPSAnMCc7XHJcbiAgICAgICAgICAgIF90b2FzdFdyYXBwZXIuc3R5bGUud2lkdGggPSAnMCc7XHJcbiAgICAgICAgICAgIF90b2FzdFdyYXBwZXIuc3R5bGUuaGVpZ2h0ID0gJzAnO1xyXG4gICAgICAgICAgICBfdG9hc3RXcmFwcGVyLnN0eWxlLnBvaW50ZXJFdmVudHMgPSAnbm9uZSc7XHJcbiAgICAgICAgICAgIF90b2FzdFdyYXBwZXIuc3R5bGUuekluZGV4ID0gJzEwMDAwJzsgLy8gQmVsb3cgY29udGFpbmVycyBidXQgYWJvdmUgbW9zdCBjb250ZW50XHJcbiAgICAgICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoX3RvYXN0V3JhcHBlcik7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgXHJcbiAgICByZXR1cm4gX3RvYXN0V3JhcHBlcjtcclxufVxyXG5cclxuY29uc3QgREVGQVVMVF9DT05GSUcgPSB7XHJcbiAgICBwb3NpdGlvbjogJ2JvdHRvbS1yaWdodCcsXHJcbiAgICBtYXhUb2FzdHM6IDUsXHJcbiAgICBkZWZhdWx0RHVyYXRpb25NczogNTAwMCxcclxuICAgIHpJbmRleDogMTEwMDAsXHJcbiAgICBhcmlhTGl2ZTogJ3BvbGl0ZScsXHJcbiAgICBnYXA6IDgsXHJcbiAgICBkZWR1cGU6IGZhbHNlLFxyXG4gICAgY29udGFpbmVyQ2xhc3M6ICcnLFxyXG4gICAgb2Zmc2V0OiAwLFxyXG4gICAgcHJvZ3Jlc3M6IGZhbHNlXHJcbn07XHJcblxyXG4vKipcclxuICogQ3JlYXRlIGFuIGVsZW1lbnQgd2l0aCBjbGFzc2VzXHJcbiAqL1xyXG5mdW5jdGlvbiBjcmVhdGVFbCh0YWcsIGNsYXNzTmFtZXMpIHtcclxuICAgIGNvbnN0IGVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCh0YWcpO1xyXG4gICAgaWYgKGNsYXNzTmFtZXMpIHtcclxuICAgICAgICBjbGFzc05hbWVzLnNwbGl0KCcgJykuZmlsdGVyKEJvb2xlYW4pLmZvckVhY2goYyA9PiBlbC5jbGFzc0xpc3QuYWRkKGMpKTtcclxuICAgIH1cclxuICAgIHJldHVybiBlbDtcclxufVxyXG5cclxuLyoqIE1pbmltYWwgbGluZS1iYXNlZCBwYXVzZSAodHdvIGJhcnMpIC8gcmVzdW1lICh0cmlhbmdsZSByaWdodCkgaWNvbiBTVkcuIFVzZXMgY3VycmVudENvbG9yLiAqL1xyXG5mdW5jdGlvbiBnZXRQcm9ncmVzc1BhdXNlUmVzdW1lSWNvblNWRyhwYXVzZWQpIHtcclxuICAgIGlmIChwYXVzZWQpIHtcclxuICAgICAgICByZXR1cm4gYDxzdmcgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMlwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48cGF0aCBkPVwiTTggNkw4IDE4TDE3IDEyWlwiLz48L3N2Zz5gO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGA8c3ZnIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjJcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PGxpbmUgeDE9XCI5XCIgeTE9XCI2XCIgeDI9XCI5XCIgeTI9XCIxOFwiLz48bGluZSB4MT1cIjE1XCIgeTE9XCI2XCIgeDI9XCIxNVwiIHkyPVwiMThcIi8+PC9zdmc+YDtcclxufVxyXG5cclxuLyoqXHJcbiAqIENyZWF0ZSBhbmQgaW5zZXJ0IHByb2dyZXNzIGJsb2NrICh0cmFjayArIGJhciwgb3B0aW9uYWwgcGF1c2UgYnV0dG9uKSBpbnRvIHRvYXN0LiBCdXR0b24gaXMgZml4ZWQgYXQgbGVmdCB2aWEgdHJhY2sgbGF5b3V0LlxyXG4gKiBAcGFyYW0ge0hUTUxFbGVtZW50fSB0b2FzdEVsXHJcbiAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGNvbnRlbnRFbFxyXG4gKiBAcGFyYW0ge0hUTUxFbGVtZW50fG51bGx9IGNsb3NlQnRuXHJcbiAqIEBwYXJhbSB7UHJvZ3Jlc3NPcHR9IHByb2dyZXNzT3B0XHJcbiAqIEByZXR1cm5zIHt7IHdyYXA6IEhUTUxFbGVtZW50LCBiYXI6IEhUTUxFbGVtZW50LCBwYXVzZUJ0bjogSFRNTEVsZW1lbnR8bnVsbCB9fVxyXG4gKi9cclxuZnVuY3Rpb24gY3JlYXRlUHJvZ3Jlc3NCbG9jayh0b2FzdEVsLCBjb250ZW50RWwsIGNsb3NlQnRuLCBwcm9ncmVzc09wdCkge1xyXG4gICAgY29uc3QgcG9zID0gcHJvZ3Jlc3NPcHQucG9zaXRpb247XHJcbiAgICBjb25zdCBzaG93UGF1c2VCdXR0b24gPSBwcm9ncmVzc09wdC5wYXVzZUJ1dHRvbiA9PT0gdHJ1ZTtcclxuICAgIGNvbnN0IHdyYXAgPSBjcmVhdGVFbCgnZGl2JywgYEFQWC10b2FzdF9fcHJvZ3Jlc3MgQVBYLXRvYXN0X19wcm9ncmVzcy0tJHtwb3N9YCk7XHJcbiAgICBjb25zdCB0cmFjayA9IGNyZWF0ZUVsKCdkaXYnLCAnQVBYLXRvYXN0X19wcm9ncmVzcy10cmFjaycpO1xyXG4gICAgY29uc3QgYmFyID0gY3JlYXRlRWwoJ2RpdicsICdBUFgtdG9hc3RfX3Byb2dyZXNzLWJhcicpO1xyXG4gICAgYmFyLnNldEF0dHJpYnV0ZSgncm9sZScsICdwcm9ncmVzc2JhcicpO1xyXG4gICAgYmFyLnNldEF0dHJpYnV0ZSgnYXJpYS12YWx1ZW1pbicsICcwJyk7XHJcbiAgICBiYXIuc2V0QXR0cmlidXRlKCdhcmlhLXZhbHVlbWF4JywgJzEwMCcpO1xyXG4gICAgYmFyLnNldEF0dHJpYnV0ZSgnYXJpYS1sYWJlbCcsICdUZW1wcyByZXN0YW50Jyk7XHJcbiAgICBiYXIuc2V0QXR0cmlidXRlKCdhcmlhLXZhbHVlbm93JywgJzEwMCcpO1xyXG4gICAgYmFyLnN0eWxlLndpZHRoID0gJzEwMCUnO1xyXG4gICAgdHJhY2suYXBwZW5kQ2hpbGQoYmFyKTtcclxuICAgIHdyYXAuYXBwZW5kQ2hpbGQodHJhY2spO1xyXG4gICAgbGV0IHBhdXNlQnRuID0gbnVsbDtcclxuICAgIGlmIChzaG93UGF1c2VCdXR0b24pIHtcclxuICAgICAgICBwYXVzZUJ0biA9IGNyZWF0ZUVsKCdidXR0b24nLCAnQVBYLXRvYXN0X19wcm9ncmVzcy1wYXVzZScpO1xyXG4gICAgICAgIHBhdXNlQnRuLnR5cGUgPSAnYnV0dG9uJztcclxuICAgICAgICBwYXVzZUJ0bi5zZXRBdHRyaWJ1dGUoJ2FyaWEtbGFiZWwnLCAnUGF1c2UnKTtcclxuICAgICAgICBwYXVzZUJ0bi5zZXRBdHRyaWJ1dGUoJ3RpdGxlJywgJ1BhdXNlJyk7XHJcbiAgICAgICAgcGF1c2VCdG4uaW5uZXJIVE1MID0gZ2V0UHJvZ3Jlc3NQYXVzZVJlc3VtZUljb25TVkcoZmFsc2UpOyAvLyBydW5uaW5nID0gc2hvdyBwYXVzZSBpY29uXHJcbiAgICAgICAgd3JhcC5pbnNlcnRCZWZvcmUocGF1c2VCdG4sIHRyYWNrKTtcclxuICAgIH1cclxuICAgIGlmIChwb3MgPT09ICd0b3AnKSB7XHJcbiAgICAgICAgdG9hc3RFbC5pbnNlcnRCZWZvcmUod3JhcCwgY29udGVudEVsKTtcclxuICAgICAgICB0b2FzdEVsLmNsYXNzTGlzdC5hZGQoJ0FQWC10b2FzdC0taGFzLXByb2dyZXNzLXRvcCcpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgICB0b2FzdEVsLmluc2VydEJlZm9yZSh3cmFwLCBjbG9zZUJ0bik7XHJcbiAgICAgICAgdG9hc3RFbC5jbGFzc0xpc3QuYWRkKCdBUFgtdG9hc3QtLWhhcy1wcm9ncmVzcy1ib3R0b20nKTtcclxuICAgIH1cclxuICAgIGlmIChzaG93UGF1c2VCdXR0b24pIHRvYXN0RWwuY2xhc3NMaXN0LmFkZCgnQVBYLXRvYXN0LS1oYXMtcHJvZ3Jlc3MtcGF1c2UnKTtcclxuICAgIHJldHVybiB7IHdyYXAsIGJhciwgcGF1c2VCdG4gfTtcclxufVxyXG5cclxuLyoqXHJcbiAqIFVwZGF0ZSBwcm9ncmVzcyBibG9jayBwb3NpdGlvbiAoY2xhc3NlcyArIERPTSBvcmRlcilcclxuICogQHBhcmFtIHtIVE1MRWxlbWVudH0gdG9hc3RFbFxyXG4gKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBwcm9ncmVzc1dyYXBcclxuICogQHBhcmFtIHtIVE1MRWxlbWVudH0gY29udGVudEVsXHJcbiAqIEBwYXJhbSB7SFRNTEVsZW1lbnR8bnVsbH0gY2xvc2VCdG5cclxuICogQHBhcmFtIHsndG9wJ3wnYm90dG9tJ30gcG9zXHJcbiAqL1xyXG5mdW5jdGlvbiBhcHBseVByb2dyZXNzUG9zaXRpb24odG9hc3RFbCwgcHJvZ3Jlc3NXcmFwLCBjb250ZW50RWwsIGNsb3NlQnRuLCBwb3MpIHtcclxuICAgIHRvYXN0RWwuY2xhc3NMaXN0LnJlbW92ZSgnQVBYLXRvYXN0LS1oYXMtcHJvZ3Jlc3MtdG9wJywgJ0FQWC10b2FzdC0taGFzLXByb2dyZXNzLWJvdHRvbScpO1xyXG4gICAgdG9hc3RFbC5jbGFzc0xpc3QuYWRkKHBvcyA9PT0gJ3RvcCcgPyAnQVBYLXRvYXN0LS1oYXMtcHJvZ3Jlc3MtdG9wJyA6ICdBUFgtdG9hc3QtLWhhcy1wcm9ncmVzcy1ib3R0b20nKTtcclxuICAgIHByb2dyZXNzV3JhcC5jbGFzc0xpc3QucmVtb3ZlKCdBUFgtdG9hc3RfX3Byb2dyZXNzLS10b3AnLCAnQVBYLXRvYXN0X19wcm9ncmVzcy0tYm90dG9tJyk7XHJcbiAgICBwcm9ncmVzc1dyYXAuY2xhc3NMaXN0LmFkZChgQVBYLXRvYXN0X19wcm9ncmVzcy0tJHtwb3N9YCk7XHJcbiAgICBjb25zdCB0YXJnZXQgPSBwb3MgPT09ICd0b3AnID8gY29udGVudEVsIDogY2xvc2VCdG47XHJcbiAgICBpZiAocHJvZ3Jlc3NXcmFwLm5leHRFbGVtZW50U2libGluZyAhPT0gdGFyZ2V0KSB0b2FzdEVsLmluc2VydEJlZm9yZShwcm9ncmVzc1dyYXAsIHRhcmdldCk7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBSZXNvbHZlIHByb2dyZXNzIG9wdGlvbiBmcm9tIHBlci1jYWxsIG9wdGlvbiBhbmQgY29uZmlnIGRlZmF1bHRcclxuICogQHBhcmFtIHtib29sZWFufHtlbmFibGU6IGJvb2xlYW4sIHBvc2l0aW9uOiAndG9wJ3wnYm90dG9tJ318dW5kZWZpbmVkfSBvcHRpb25cclxuICogQHBhcmFtIHtib29sZWFufHtlbmFibGU6IGJvb2xlYW4sIHBvc2l0aW9uOiAndG9wJ3wnYm90dG9tJ318dW5kZWZpbmVkfSBjb25maWdEZWZhdWx0XHJcbiAqIEByZXR1cm5zIHtQcm9ncmVzc09wdH1cclxuICovXHJcbmZ1bmN0aW9uIHJlc29sdmVQcm9ncmVzcyhvcHRpb24sIGNvbmZpZ0RlZmF1bHQpIHtcclxuICAgIGNvbnN0IGZyb21Db25maWcgPSBjb25maWdEZWZhdWx0ID09PSB0cnVlXHJcbiAgICAgICAgPyB7IGVuYWJsZTogdHJ1ZSwgcG9zaXRpb246ICd0b3AnLCBwYXVzZUJ1dHRvbjogZmFsc2UgfVxyXG4gICAgICAgIDogKGNvbmZpZ0RlZmF1bHQgJiYgdHlwZW9mIGNvbmZpZ0RlZmF1bHQgPT09ICdvYmplY3QnXHJcbiAgICAgICAgICAgID8ge1xyXG4gICAgICAgICAgICAgICAgZW5hYmxlOiAhIWNvbmZpZ0RlZmF1bHQuZW5hYmxlLFxyXG4gICAgICAgICAgICAgICAgcG9zaXRpb246IGNvbmZpZ0RlZmF1bHQucG9zaXRpb24gPT09ICdib3R0b20nID8gJ2JvdHRvbScgOiAndG9wJyxcclxuICAgICAgICAgICAgICAgIHBhdXNlQnV0dG9uOiBjb25maWdEZWZhdWx0LnBhdXNlQnV0dG9uID09PSB0cnVlXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgOiB7IGVuYWJsZTogZmFsc2UsIHBvc2l0aW9uOiAndG9wJywgcGF1c2VCdXR0b246IGZhbHNlIH0pO1xyXG4gICAgaWYgKG9wdGlvbiA9PT0gdW5kZWZpbmVkIHx8IG9wdGlvbiA9PT0gbnVsbCkgcmV0dXJuIGZyb21Db25maWc7XHJcbiAgICBpZiAob3B0aW9uID09PSB0cnVlKSByZXR1cm4geyBlbmFibGU6IHRydWUsIHBvc2l0aW9uOiAndG9wJywgcGF1c2VCdXR0b246IGZhbHNlIH07XHJcbiAgICBpZiAodHlwZW9mIG9wdGlvbiA9PT0gJ29iamVjdCcpIHtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICBlbmFibGU6ICEhb3B0aW9uLmVuYWJsZSxcclxuICAgICAgICAgICAgcG9zaXRpb246IG9wdGlvbi5wb3NpdGlvbiA9PT0gJ2JvdHRvbScgPyAnYm90dG9tJyA6ICd0b3AnLFxyXG4gICAgICAgICAgICBwYXVzZUJ1dHRvbjogb3B0aW9uLnBhdXNlQnV0dG9uID09PSB0cnVlXHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuICAgIHJldHVybiB7IGVuYWJsZTogZmFsc2UsIHBvc2l0aW9uOiAndG9wJywgcGF1c2VCdXR0b246IGZhbHNlIH07XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBOb3JtYWxpemUgcGxhY2VtZW50IHN5bm9ueW1zIHRvIENTUyB2YWx1ZXNcclxuICogQHBhcmFtIHtzdHJpbmd9IHBsYWNlbWVudFxyXG4gKiBAcmV0dXJucyB7J3RvcCd8J3JpZ2h0J3wnYm90dG9tJ3wnbGVmdCd9XHJcbiAqL1xyXG5mdW5jdGlvbiBub3JtYWxpemVQbGFjZW1lbnQocGxhY2VtZW50KSB7XHJcbiAgICBjb25zdCBzeW5vbnltcyA9IHtcclxuICAgICAgICAnYWJvdmUnOiAndG9wJyxcclxuICAgICAgICAnYmVsb3cnOiAnYm90dG9tJyxcclxuICAgICAgICAnYmVmb3JlJzogJ2xlZnQnLFxyXG4gICAgICAgICdhZnRlcic6ICdyaWdodCdcclxuICAgIH07XHJcbiAgICByZXR1cm4gc3lub255bXNbcGxhY2VtZW50XSB8fCBwbGFjZW1lbnQ7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBEZXRlcm1pbmUgZmxvdyBkaXJlY3Rpb24gYmFzZWQgb24gcG9zaXRpb25cclxuICogQHBhcmFtIHtQb3NpdGlvbn0gcG9zaXRpb25cclxuICogQHJldHVybnMgeyd1cCd8J2Rvd24nfVxyXG4gKi9cclxuZnVuY3Rpb24gZGV0ZXJtaW5lRmxvdyhwb3NpdGlvbikge1xyXG4gICAgaWYgKHR5cGVvZiBwb3NpdGlvbiA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgICAvLyBTdHJpbmcgcG9zaXRpb25zOiB0b3AgPSB1cCwgYm90dG9tID0gZG93blxyXG4gICAgICAgIGlmIChwb3NpdGlvbi5pbmNsdWRlcygndG9wJykpIHJldHVybiAndXAnO1xyXG4gICAgICAgIGlmIChwb3NpdGlvbi5pbmNsdWRlcygnYm90dG9tJykpIHJldHVybiAnZG93bic7XHJcbiAgICAgICAgcmV0dXJuICdkb3duJzsgLy8gZGVmYXVsdFxyXG4gICAgfVxyXG4gICAgXHJcbiAgICBpZiAodHlwZW9mIHBvc2l0aW9uID09PSAnb2JqZWN0JyAmJiBwb3NpdGlvbiAhPT0gbnVsbCkge1xyXG4gICAgICAgIGNvbnN0IHR5cGUgPSBwb3NpdGlvbi50eXBlIHx8IChwb3NpdGlvbi54IHx8IHBvc2l0aW9uLnkgPyAnc3RpY2t5JyA6IG51bGwpO1xyXG4gICAgICAgIFxyXG4gICAgICAgIGlmICh0eXBlID09PSAnc3RpY2t5JyB8fCAoIXR5cGUgJiYgKHBvc2l0aW9uLnggfHwgcG9zaXRpb24ueSkpKSB7XHJcbiAgICAgICAgICAgIC8vIFN0aWNreTogZGV0ZXJtaW5lIGJhc2VkIG9uIHkgY29vcmRpbmF0ZVxyXG4gICAgICAgICAgICBpZiAocG9zaXRpb24ueSAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBJZiB5IHN0YXJ0cyB3aXRoICctJyBvciBpcyBhIHNtYWxsIHZhbHVlLCBsaWtlbHkgdG9wICh1cClcclxuICAgICAgICAgICAgICAgIC8vIElmIHkgaXMgYSBsYXJnZSB2YWx1ZSBvciBwZXJjZW50YWdlLCBsaWtlbHkgYm90dG9tIChkb3duKVxyXG4gICAgICAgICAgICAgICAgaWYgKHBvc2l0aW9uLnkuc3RhcnRzV2l0aCgnLScpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gTmVnYXRpdmUgPSBmcm9tIGJvdHRvbSwgc28gZmxvdyBkb3duXHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdkb3duJztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGNvbnN0IG51bSA9IHBhcnNlRmxvYXQocG9zaXRpb24ueSk7XHJcbiAgICAgICAgICAgICAgICBpZiAoIWlzTmFOKG51bSkpIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyBJZiB5IDwgNTAlIG9mIHZpZXdwb3J0IGhlaWdodCwgbGlrZWx5IHRvcCAodXApXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gT3RoZXJ3aXNlIGxpa2VseSBib3R0b20gKGRvd24pXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHBvc2l0aW9uLnkuaW5jbHVkZXMoJyUnKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVtIDwgNTAgPyAndXAnIDogJ2Rvd24nO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAvLyBGb3IgcHggdmFsdWVzLCBhc3N1bWUgPCA0MDBweCBpcyB0b3AgKHVwKVxyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudW0gPCA0MDAgPyAndXAnIDogJ2Rvd24nO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiAnZG93bic7IC8vIGRlZmF1bHRcclxuICAgICAgICB9XHJcbiAgICAgICAgXHJcbiAgICAgICAgaWYgKHR5cGUgPT09ICdhbmNob3JlZCcgJiYgcG9zaXRpb24ucGxhY2VtZW50KSB7XHJcbiAgICAgICAgICAgIC8vIEFuY2hvcmVkOiBwbGFjZW1lbnQgZGV0ZXJtaW5lcyBmbG93XHJcbiAgICAgICAgICAgIGNvbnN0IHBsYWNlbWVudCA9IG5vcm1hbGl6ZVBsYWNlbWVudChwb3NpdGlvbi5wbGFjZW1lbnQpO1xyXG4gICAgICAgICAgICBpZiAocGxhY2VtZW50ID09PSAndG9wJyB8fCBwbGFjZW1lbnQgPT09ICdhYm92ZScpIHJldHVybiAndXAnO1xyXG4gICAgICAgICAgICBpZiAocGxhY2VtZW50ID09PSAnYm90dG9tJyB8fCBwbGFjZW1lbnQgPT09ICdiZWxvdycpIHJldHVybiAnZG93bic7XHJcbiAgICAgICAgICAgIC8vIEZvciBsZWZ0L3JpZ2h0LCBkZWZhdWx0IHRvIGRvd25cclxuICAgICAgICAgICAgcmV0dXJuICdkb3duJztcclxuICAgICAgICB9XHJcbiAgICAgICAgXHJcbiAgICAgICAgaWYgKHR5cGUgPT09ICdyZWxhdGl2ZScpIHtcclxuICAgICAgICAgICAgLy8gUmVsYXRpdmU6IGRldGVybWluZSBiYXNlZCBvbiB5IG9mZnNldFxyXG4gICAgICAgICAgICBpZiAocG9zaXRpb24ueSAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBudW0gPSBwYXJzZUZsb2F0KHBvc2l0aW9uLnkpO1xyXG4gICAgICAgICAgICAgICAgaWYgKCFpc05hTihudW0pKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gTmVnYXRpdmUgeSA9IGFib3ZlIGVsZW1lbnQgPSBmbG93IHVwXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gUG9zaXRpdmUgeSA9IGJlbG93IGVsZW1lbnQgPSBmbG93IGRvd25cclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVtIDwgMCA/ICd1cCcgOiAnZG93bic7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuICdkb3duJzsgLy8gZGVmYXVsdFxyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIFxyXG4gICAgcmV0dXJuICdkb3duJzsgLy8gZGVmYXVsdFxyXG59XHJcblxyXG4vKipcclxuICogR2FyYmFnZSBjb2xsZWN0aW9uOiByZW1vdmUgZW1wdHkgdW5tYW5hZ2VkIGNvbnRhaW5lcnNcclxuICovXHJcbmZ1bmN0aW9uIGNsZWFudXBFbXB0eUNvbnRhaW5lcnMoKSB7XHJcbiAgICBpZiAoIWlzQnJvd3NlcikgcmV0dXJuO1xyXG4gICAgXHJcbiAgICBjb25zdCBjb250YWluZXJzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLkFQWC10b2FzdC1jb250YWluZXI6bm90KFtkYXRhLWFweC10b2FzdC1tYW5hZ2VkPVwidHJ1ZVwiXSknKTtcclxuICAgIGNvbnRhaW5lcnMuZm9yRWFjaChjb250YWluZXIgPT4ge1xyXG4gICAgICAgIC8vIENoZWNrIGlmIGNvbnRhaW5lciBpcyBlbXB0eSAobm8gdG9hc3RzKVxyXG4gICAgICAgIGlmIChjb250YWluZXIuY2hpbGRyZW4ubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHBvc2l0aW9uS2V5ID0gY29udGFpbmVyLmdldEF0dHJpYnV0ZSgnZGF0YS1hcHgtdG9hc3QtcG9zaXRpb24nKTtcclxuICAgICAgICAgICAgaWYgKHBvc2l0aW9uS2V5KSB7XHJcbiAgICAgICAgICAgICAgICBfY29udGFpbmVyQ2FjaGUuZGVsZXRlKHBvc2l0aW9uS2V5KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjb250YWluZXIucmVtb3ZlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICBcclxuICAgIC8vIENsZWFuIHVwIHdyYXBwZXIgaWYgaXQncyBlbXB0eSAoYWxsIGNvbnRhaW5lcnMgcmVtb3ZlZClcclxuICAgIGlmIChfdG9hc3RXcmFwcGVyICYmIF90b2FzdFdyYXBwZXIuY2hpbGRyZW4ubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgICAgX3RvYXN0V3JhcHBlci5yZW1vdmUoKTtcclxuICAgICAgICBfdG9hc3RXcmFwcGVyID0gbnVsbDtcclxuICAgIH1cclxuICAgIFxyXG4gICAgX2djVGltZW91dElkID0gbnVsbDtcclxufVxyXG5cclxuLyoqXHJcbiAqIFNjaGVkdWxlIGdhcmJhZ2UgY29sbGVjdGlvbiBmb3IgZW1wdHkgdW5tYW5hZ2VkIGNvbnRhaW5lcnNcclxuICovXHJcbmZ1bmN0aW9uIHNjaGVkdWxlR2FyYmFnZUNvbGxlY3Rpb24oKSB7XHJcbiAgICBpZiAoX2djVGltZW91dElkKSB7XHJcbiAgICAgICAgY2xlYXJUaW1lb3V0KF9nY1RpbWVvdXRJZCk7XHJcbiAgICB9XHJcbiAgICBfZ2NUaW1lb3V0SWQgPSBzZXRUaW1lb3V0KGNsZWFudXBFbXB0eUNvbnRhaW5lcnMsIEdDX0RFTEFZX01TKTtcclxufVxyXG5cclxuLyoqXHJcbiAqIEZpbmQgYWxsIHNjcm9sbGFibGUgcGFyZW50IGVsZW1lbnRzXHJcbiAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsZW1lbnRcclxuICogQHJldHVybnMge0hUTUxFbGVtZW50W119XHJcbiAqL1xyXG5mdW5jdGlvbiBmaW5kU2Nyb2xsYWJsZVBhcmVudHMoZWxlbWVudCkge1xyXG4gICAgY29uc3Qgc2Nyb2xsYWJsZXMgPSBbXTtcclxuICAgIGxldCBjdXJyZW50ID0gZWxlbWVudC5wYXJlbnRFbGVtZW50O1xyXG4gICAgXHJcbiAgICB3aGlsZSAoY3VycmVudCAmJiBjdXJyZW50ICE9PSBkb2N1bWVudC5ib2R5ICYmIGN1cnJlbnQgIT09IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCkge1xyXG4gICAgICAgIGNvbnN0IHN0eWxlID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUoY3VycmVudCk7XHJcbiAgICAgICAgY29uc3Qgb3ZlcmZsb3cgPSBzdHlsZS5vdmVyZmxvdyArIHN0eWxlLm92ZXJmbG93WSArIHN0eWxlLm92ZXJmbG93WDtcclxuICAgICAgICBcclxuICAgICAgICBpZiAob3ZlcmZsb3cuaW5jbHVkZXMoJ3Njcm9sbCcpIHx8IG92ZXJmbG93LmluY2x1ZGVzKCdhdXRvJykpIHtcclxuICAgICAgICAgICAgc2Nyb2xsYWJsZXMucHVzaChjdXJyZW50KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgXHJcbiAgICAgICAgY3VycmVudCA9IGN1cnJlbnQucGFyZW50RWxlbWVudDtcclxuICAgIH1cclxuICAgIFxyXG4gICAgcmV0dXJuIHNjcm9sbGFibGVzO1xyXG59XHJcblxyXG4vKipcclxuICogSGFzaCBhbiBlbGVtZW50IHRvIGNyZWF0ZSBhIHVuaXF1ZSBpZGVudGlmaWVyXHJcbiAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsXHJcbiAqIEByZXR1cm5zIHtzdHJpbmd9XHJcbiAqL1xyXG5mdW5jdGlvbiBoYXNoRWxlbWVudChlbCkge1xyXG4gICAgY29uc3QgcmVjdCA9IGVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xyXG4gICAgY29uc3Qgc3RyID0gYCR7ZWwudGFnTmFtZX1fJHtyZWN0LmxlZnR9XyR7cmVjdC50b3B9XyR7cmVjdC53aWR0aH1fJHtyZWN0LmhlaWdodH1gO1xyXG4gICAgbGV0IGhhc2ggPSAwO1xyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzdHIubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICBjb25zdCBjaGFyID0gc3RyLmNoYXJDb2RlQXQoaSk7XHJcbiAgICAgICAgaGFzaCA9ICgoaGFzaCA8PCA1KSAtIGhhc2gpICsgY2hhcjtcclxuICAgICAgICBoYXNoID0gaGFzaCAmIGhhc2g7IC8vIENvbnZlcnQgdG8gMzJiaXQgaW50ZWdlclxyXG4gICAgfVxyXG4gICAgcmV0dXJuIE1hdGguYWJzKGhhc2gpLnRvU3RyaW5nKDM2KTtcclxufVxyXG5cclxuLyoqXHJcbiAqIFNlcmlhbGl6ZSBwb3NpdGlvbiBvcHRpb25zIGludG8gYSB1bmlxdWUga2V5XHJcbiAqIEBwYXJhbSB7UG9zaXRpb259IHBvc2l0aW9uXHJcbiAqIEByZXR1cm5zIHtzdHJpbmd9XHJcbiAqL1xyXG5mdW5jdGlvbiBzZXJpYWxpemVQb3NpdGlvbihwb3NpdGlvbikge1xyXG4gICAgaWYgKHR5cGVvZiBwb3NpdGlvbiA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgICByZXR1cm4gYHM6JHtwb3NpdGlvbn1gO1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICBpZiAodHlwZW9mIHBvc2l0aW9uID09PSAnb2JqZWN0JyAmJiBwb3NpdGlvbiAhPT0gbnVsbCkge1xyXG4gICAgICAgIGNvbnN0IHBhcnRzID0gW107XHJcbiAgICAgICAgXHJcbiAgICAgICAgLy8gVHlwZSAoZGVmYXVsdDogc3RpY2t5IGlmIHgveSBwcm92aWRlZClcclxuICAgICAgICBjb25zdCB0eXBlID0gcG9zaXRpb24udHlwZSB8fCAocG9zaXRpb24ueCB8fCBwb3NpdGlvbi55ID8gJ3N0aWNreScgOiBudWxsKTtcclxuICAgICAgICBpZiAodHlwZSkgcGFydHMucHVzaChgdDoke3R5cGV9YCk7XHJcbiAgICAgICAgXHJcbiAgICAgICAgLy8gQ29vcmRpbmF0ZXNcclxuICAgICAgICBpZiAocG9zaXRpb24ueCAhPT0gdW5kZWZpbmVkKSBwYXJ0cy5wdXNoKGB4OiR7cG9zaXRpb24ueH1gKTtcclxuICAgICAgICBpZiAocG9zaXRpb24ueSAhPT0gdW5kZWZpbmVkKSBwYXJ0cy5wdXNoKGB5OiR7cG9zaXRpb24ueX1gKTtcclxuICAgICAgICBcclxuICAgICAgICAvLyBGb3IgcmVsYXRpdmUvYW5jaG9yZWQ6IHVzZSBlbGVtZW50IElEIG9yIGhhc2hcclxuICAgICAgICBpZiAocG9zaXRpb24uZWxlbWVudCkge1xyXG4gICAgICAgICAgICBjb25zdCBlbGVtZW50SWQgPSBwb3NpdGlvbi5lbGVtZW50LmlkIHx8IFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uLmVsZW1lbnQuZGF0YXNldD8uYXB4VG9hc3RBbmNob3JJZCB8fFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBlbF8ke2hhc2hFbGVtZW50KHBvc2l0aW9uLmVsZW1lbnQpfWA7XHJcbiAgICAgICAgICAgIHBhcnRzLnB1c2goYGVsOiR7ZWxlbWVudElkfWApO1xyXG4gICAgICAgIH1cclxuICAgICAgICBcclxuICAgICAgICBpZiAocG9zaXRpb24ucGxhY2VtZW50KSB7XHJcbiAgICAgICAgICAgIC8vIE5vcm1hbGl6ZSBwbGFjZW1lbnQgZm9yIHNlcmlhbGl6YXRpb24gKHVzZSBDU1MgdmFsdWVzKVxyXG4gICAgICAgICAgICBjb25zdCBub3JtYWxpemVkID0gbm9ybWFsaXplUGxhY2VtZW50KHBvc2l0aW9uLnBsYWNlbWVudCk7XHJcbiAgICAgICAgICAgIHBhcnRzLnB1c2goYHA6JHtub3JtYWxpemVkfWApO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAocG9zaXRpb24uZ2FwICE9PSB1bmRlZmluZWQpIHBhcnRzLnB1c2goYGc6JHtwb3NpdGlvbi5nYXB9YCk7XHJcbiAgICAgICAgaWYgKHBvc2l0aW9uLnVzZU5hdGl2ZUNTUykgcGFydHMucHVzaChgbmF0aXZlOnRydWVgKTtcclxuICAgICAgICBcclxuICAgICAgICByZXR1cm4gYG86JHtwYXJ0cy5qb2luKCd8Jyl9YDtcclxuICAgIH1cclxuICAgIFxyXG4gICAgcmV0dXJuICdzOmJvdHRvbS1yaWdodCc7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBUb2FzdE1hbmFnZXIgY2xhc3NcclxuICovXHJcbmNsYXNzIFRvYXN0TWFuYWdlciB7XHJcbiAgICAvKiogQHBhcmFtIHtQYXJ0aWFsPFRvYXN0Q29uZmlnPj19IGNvbmZpZyAqL1xyXG4gICAgY29uc3RydWN0b3IoY29uZmlnKSB7XHJcbiAgICAgICAgLyoqIEB0eXBlIHtUb2FzdENvbmZpZ30gKi9cclxuICAgICAgICB0aGlzLmNvbmZpZyA9IHsgLi4uREVGQVVMVF9DT05GSUcsIC4uLihjb25maWcgfHwge30pIH07XHJcbiAgICAgICAgLyoqIEB0eXBlIHtIVE1MRWxlbWVudHxudWxsfSAqL1xyXG4gICAgICAgIHRoaXMuY29udGFpbmVyID0gbnVsbDtcclxuICAgICAgICAvKiogQHR5cGUge01hcDxzdHJpbmcsIFRvYXN0UmVmPn0gKi9cclxuICAgICAgICB0aGlzLmlkVG9SZWYgPSBuZXcgTWFwKCk7XHJcbiAgICAgICAgLyoqIEB0eXBlIHtUb2FzdFJlZltdfSAqL1xyXG4gICAgICAgIHRoaXMub3BlbiA9IFtdO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAcGFyYW0ge1BhcnRpYWw8VG9hc3RDb25maWc+fSBjb25maWcgKi9cclxuICAgIGNvbmZpZ3VyZShjb25maWcpIHtcclxuICAgICAgICB0aGlzLmNvbmZpZyA9IHsgLi4udGhpcy5jb25maWcsIC4uLihjb25maWcgfHwge30pIH07XHJcbiAgICAgICAgaWYgKHRoaXMuY29udGFpbmVyKSB0aGlzLmFwcGx5Q29udGFpbmVyQ29uZmlnKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBwYXJhbSB7J3BvbGl0ZSd8J2Fzc2VydGl2ZSd8J29mZid9IG1vZGUgKi9cclxuICAgIHNldEFyaWFMaXZlKG1vZGUpIHsgdGhpcy5jb25maWd1cmUoeyBhcmlhTGl2ZTogbW9kZSB9KTsgfVxyXG5cclxuICAgIC8qKiBAcmV0dXJucyB7VG9hc3RSZWZbXX0gKi9cclxuICAgIGdldE9wZW5Ub2FzdHMoKSB7IHJldHVybiB0aGlzLm9wZW4uc2xpY2UoKTsgfVxyXG5cclxuICAgIC8qKiBAcGFyYW0ge1RvYXN0T3B0aW9uc30gb3B0cyAqL1xyXG4gICAgc2hvdyhvcHRzKSB7XHJcbiAgICAgICAgaWYgKCFpc0Jyb3dzZXIpIHJldHVybiAvKiogQHR5cGUge2FueX0gKi8obnVsbCk7XHJcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHRoaXMubm9ybWFsaXplT3B0aW9ucyhvcHRzKTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuY29uZmlnLmRlZHVwZSAmJiBvcHRpb25zLmlkICYmIHRoaXMuaWRUb1JlZi5oYXMob3B0aW9ucy5pZCkpIHtcclxuICAgICAgICAgICAgY29uc3QgcmVmID0gdGhpcy5pZFRvUmVmLmdldChvcHRpb25zLmlkKTtcclxuICAgICAgICAgICAgcmVmLnVwZGF0ZShvcHRpb25zKTtcclxuICAgICAgICAgICAgcmV0dXJuIHJlZjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIERldGVybWluZSBwb3NpdGlvbiBhbmQgZmxvdyBmb3IgdGhpcyB0b2FzdCAob3B0aW9ucyB0YWtlIHByZWNlZGVuY2Ugb3ZlciBjb25maWcpXHJcbiAgICAgICAgY29uc3QgcG9zaXRpb24gPSBvcHRpb25zLnBvc2l0aW9uIHx8IHRoaXMuY29uZmlnLnBvc2l0aW9uIHx8ICdib3R0b20tcmlnaHQnO1xyXG4gICAgICAgIGNvbnN0IGZsb3cgPSBvcHRpb25zLmZsb3cgIT09IHVuZGVmaW5lZCA/IG9wdGlvbnMuZmxvdyA6ICh0aGlzLmNvbmZpZy5mbG93ICE9PSB1bmRlZmluZWQgPyB0aGlzLmNvbmZpZy5mbG93IDogJ2F1dG8nKTtcclxuICAgICAgICBjb25zdCBmaW5hbEZsb3cgPSBmbG93ID09PSAnYXV0bycgPyBkZXRlcm1pbmVGbG93KHBvc2l0aW9uKSA6IGZsb3c7XHJcbiAgICAgICAgXHJcbiAgICAgICAgLy8gRW5zdXJlIGRlZmF1bHQgY29udGFpbmVyIGlzIHNldCAoZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkpXHJcbiAgICAgICAgdGhpcy5lbnN1cmVDb250YWluZXIoKTtcclxuXHJcbiAgICAgICAgY29uc3QgdG9hc3RFbCA9IGNyZWF0ZUVsKCdkaXYnLCBgQVBYLXRvYXN0IEFQWC10b2FzdC0tJHtvcHRpb25zLnR5cGV9YCk7XHJcbiAgICAgICAgdG9hc3RFbC5zZXRBdHRyaWJ1dGUoJ3JvbGUnLCAnc3RhdHVzJyk7XHJcbiAgICAgICAgLy8gUHJpb3JpdHk6IG9wdGlvbnMuaWQgPiBjb25maWcuaWQgPiBhdXRvLWdlbmVyYXRlZFxyXG4gICAgICAgIGNvbnN0IHRvYXN0SWQgPSBvcHRpb25zLmlkIHx8IGB0XyR7RGF0ZS5ub3coKX1fJHtNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5zbGljZSgyLCA4KX1gO1xyXG4gICAgICAgIHRvYXN0RWwuZGF0YXNldC50b2FzdElkID0gdG9hc3RJZDtcclxuICAgICAgICBpZiAob3B0aW9ucy5jbGFzc05hbWUpIHRvYXN0RWwuY2xhc3NOYW1lICs9IGAgJHtvcHRpb25zLmNsYXNzTmFtZX1gO1xyXG5cclxuICAgICAgICBjb25zdCBjb250ZW50RWwgPSBjcmVhdGVFbCgnZGl2JywgJ0FQWC10b2FzdF9fY29udGVudCcpO1xyXG4gICAgICAgIGlmICh0eXBlb2Ygb3B0aW9ucy5tZXNzYWdlID09PSAnc3RyaW5nJykge1xyXG4gICAgICAgICAgICBjb250ZW50RWwudGV4dENvbnRlbnQgPSBvcHRpb25zLm1lc3NhZ2U7XHJcbiAgICAgICAgfSBlbHNlIGlmIChvcHRpb25zLm1lc3NhZ2UpIHtcclxuICAgICAgICAgICAgY29udGVudEVsLmFwcGVuZENoaWxkKG9wdGlvbnMubWVzc2FnZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRvYXN0RWwuYXBwZW5kQ2hpbGQoY29udGVudEVsKTtcclxuXHJcbiAgICAgICAgbGV0IGNsb3NlQnRuID0gbnVsbDtcclxuICAgICAgICBpZiAob3B0aW9ucy5kaXNtaXNzaWJsZSAhPT0gZmFsc2UpIHtcclxuICAgICAgICAgICAgY2xvc2VCdG4gPSBjcmVhdGVFbCgnYnV0dG9uJywgJ0FQWC10b2FzdF9fY2xvc2UnKTtcclxuICAgICAgICAgICAgY2xvc2VCdG4uc2V0QXR0cmlidXRlKCdhcmlhLWxhYmVsJywgJ0Nsb3NlJyk7XHJcbiAgICAgICAgICAgIGNsb3NlQnRuLnR5cGUgPSAnYnV0dG9uJztcclxuICAgICAgICAgICAgdG9hc3RFbC5hcHBlbmRDaGlsZChjbG9zZUJ0bik7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBsZXQgcHJvZ3Jlc3NXcmFwID0gbnVsbDtcclxuICAgICAgICBsZXQgcHJvZ3Jlc3NCYXJFbCA9IG51bGw7XHJcbiAgICAgICAgbGV0IHByb2dyZXNzUGF1c2VCdG4gPSBudWxsO1xyXG4gICAgICAgIGlmIChvcHRpb25zLnByb2dyZXNzLmVuYWJsZSAmJiBvcHRpb25zLmR1cmF0aW9uTXMgPiAwKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGNyZWF0ZWQgPSBjcmVhdGVQcm9ncmVzc0Jsb2NrKHRvYXN0RWwsIGNvbnRlbnRFbCwgY2xvc2VCdG4sIG9wdGlvbnMucHJvZ3Jlc3MpO1xyXG4gICAgICAgICAgICBwcm9ncmVzc1dyYXAgPSBjcmVhdGVkLndyYXA7XHJcbiAgICAgICAgICAgIHByb2dyZXNzQmFyRWwgPSBjcmVhdGVkLmJhcjtcclxuICAgICAgICAgICAgcHJvZ3Jlc3NQYXVzZUJ0biA9IGNyZWF0ZWQucGF1c2VCdG47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBHZXQgb3IgY3JlYXRlIGNvbnRhaW5lciBmb3IgdGhpcyBzcGVjaWZpYyBwb3NpdGlvblxyXG4gICAgICAgIGxldCBjb250YWluZXIgPSBudWxsO1xyXG4gICAgICAgIGxldCBwb3NpdGlvblVwZGF0ZUZuID0gbnVsbDtcclxuICAgICAgICBsZXQgcG9zaXRpb25DbGVhbnVwID0gbnVsbDtcclxuICAgICAgICBsZXQgb3JpZ2luYWxFbGVtZW50U3R5bGUgPSBudWxsO1xyXG4gICAgICAgIFxyXG4gICAgICAgIGlmIChwb3NpdGlvbiAmJiB0eXBlb2YgcG9zaXRpb24gPT09ICdvYmplY3QnICYmIHBvc2l0aW9uICE9PSBudWxsKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHR5cGUgPSBwb3NpdGlvbi50eXBlIHx8IChwb3NpdGlvbi54IHx8IHBvc2l0aW9uLnkgPyAnc3RpY2t5JyA6IG51bGwpO1xyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgaWYgKHBvc2l0aW9uLnVzZU5hdGl2ZUNTUyAmJiAodHlwZSA9PT0gJ3JlbGF0aXZlJyB8fCB0eXBlID09PSAnYW5jaG9yZWQnKSAmJiBwb3NpdGlvbi5lbGVtZW50KSB7XHJcbiAgICAgICAgICAgICAgICAvLyB1c2VOYXRpdmVDU1M6IHRydWUgLSBjcmVhdGUgY29udGFpbmVyIGluIHRhcmdldCBlbGVtZW50IHVzaW5nIG5hdGl2ZSBDU1NcclxuICAgICAgICAgICAgICAgIGNvbnN0IHRhcmdldEVsID0gcG9zaXRpb24uZWxlbWVudDtcclxuICAgICAgICAgICAgICAgIG9yaWdpbmFsRWxlbWVudFN0eWxlID0gdGFyZ2V0RWwuc3R5bGUucG9zaXRpb247XHJcbiAgICAgICAgICAgICAgICB0YXJnZXRFbC5zdHlsZS5wb3NpdGlvbiA9ICdyZWxhdGl2ZSc7XHJcbiAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgIC8vIENyZWF0ZSBhIGNvbnRhaW5lciBmb3Igc3RhY2tpbmcgdG9hc3RzIChyZXVzZSBpZiBleGlzdHMpXHJcbiAgICAgICAgICAgICAgICBjb25zdCBwb3NpdGlvbktleSA9IHNlcmlhbGl6ZVBvc2l0aW9uKHBvc2l0aW9uKTtcclxuICAgICAgICAgICAgICAgIGxldCBuYXRpdmVDb250YWluZXIgPSB0YXJnZXRFbC5xdWVyeVNlbGVjdG9yKGBbZGF0YS1hcHgtdG9hc3QtcG9zaXRpb249XCIke3Bvc2l0aW9uS2V5fVwiXWApO1xyXG4gICAgICAgICAgICAgICAgaWYgKCFuYXRpdmVDb250YWluZXIpIHtcclxuICAgICAgICAgICAgICAgICAgICBuYXRpdmVDb250YWluZXIgPSBjcmVhdGVFbCgnZGl2JywgJ0FQWC10b2FzdC1jb250YWluZXIgQVBYLXRvYXN0LWNvbnRhaW5lci1uYXRpdmUnKTtcclxuICAgICAgICAgICAgICAgICAgICBuYXRpdmVDb250YWluZXIuc2V0QXR0cmlidXRlKCdkYXRhLWFweC10b2FzdC1wb3NpdGlvbicsIHBvc2l0aW9uS2V5KTtcclxuICAgICAgICAgICAgICAgICAgICBuYXRpdmVDb250YWluZXIuc3R5bGUucG9zaXRpb24gPSAnYWJzb2x1dGUnO1xyXG4gICAgICAgICAgICAgICAgICAgIG5hdGl2ZUNvbnRhaW5lci5zdHlsZS56SW5kZXggPSBTdHJpbmcodGhpcy5jb25maWcuekluZGV4KTtcclxuICAgICAgICAgICAgICAgICAgICBuYXRpdmVDb250YWluZXIuc3R5bGUuZ2FwID0gYCR7dGhpcy5jb25maWcuZ2FwfXB4YDtcclxuICAgICAgICAgICAgICAgICAgICBuYXRpdmVDb250YWluZXIuc2V0QXR0cmlidXRlKCdhcmlhLWxpdmUnLCBTdHJpbmcodGhpcy5jb25maWcuYXJpYUxpdmUpKTtcclxuICAgICAgICAgICAgICAgICAgICBuYXRpdmVDb250YWluZXIuc3R5bGUuZmxleERpcmVjdGlvbiA9IGZpbmFsRmxvdyA9PT0gJ3VwJyA/ICdjb2x1bW4tcmV2ZXJzZScgOiAnY29sdW1uJztcclxuICAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICAvLyBBcHBseSBwb3NpdGlvbmluZyB0byBjb250YWluZXJcclxuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZSA9PT0gJ3JlbGF0aXZlJykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBSZWxhdGl2ZTogdXNlIHgveSBkaXJlY3RseVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocG9zaXRpb24ueCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocG9zaXRpb24ueC5zdGFydHNXaXRoKCctJykpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYXRpdmVDb250YWluZXIuc3R5bGUucmlnaHQgPSBwb3NpdGlvbi54LnN1YnN0cmluZygxKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmF0aXZlQ29udGFpbmVyLnN0eWxlLmxlZnQgPSBwb3NpdGlvbi54O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwb3NpdGlvbi55ICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwb3NpdGlvbi55LnN0YXJ0c1dpdGgoJy0nKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hdGl2ZUNvbnRhaW5lci5zdHlsZS5ib3R0b20gPSBwb3NpdGlvbi55LnN1YnN0cmluZygxKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmF0aXZlQ29udGFpbmVyLnN0eWxlLnRvcCA9IHBvc2l0aW9uLnk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdhbmNob3JlZCcpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQW5jaG9yZWQ6IHBvc2l0aW9uIG91dHNpZGUgdGhlIGVsZW1lbnQgdXNpbmcgMTAwJSAoZWxlbWVudCBzaXplKSArIGdhcFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwbGFjZW1lbnQgPSBub3JtYWxpemVQbGFjZW1lbnQocG9zaXRpb24ucGxhY2VtZW50KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ2FwID0gcG9zaXRpb24uZ2FwIHx8ICcxZW0nO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChwbGFjZW1lbnQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ3RvcCc6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmF0aXZlQ29udGFpbmVyLnN0eWxlLmJvdHRvbSA9IGBjYWxjKDEwMCUgKyAke2dhcH0pYDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYXRpdmVDb250YWluZXIuc3R5bGUubGVmdCA9ICcwJztcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2JvdHRvbSc6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmF0aXZlQ29udGFpbmVyLnN0eWxlLnRvcCA9IGBjYWxjKDEwMCUgKyAke2dhcH0pYDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYXRpdmVDb250YWluZXIuc3R5bGUubGVmdCA9ICcwJztcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2xlZnQnOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hdGl2ZUNvbnRhaW5lci5zdHlsZS5yaWdodCA9IGBjYWxjKDEwMCUgKyAke2dhcH0pYDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYXRpdmVDb250YWluZXIuc3R5bGUudG9wID0gJzAnO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAncmlnaHQnOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hdGl2ZUNvbnRhaW5lci5zdHlsZS5sZWZ0ID0gYGNhbGMoMTAwJSArICR7Z2FwfSlgO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hdGl2ZUNvbnRhaW5lci5zdHlsZS50b3AgPSAnMCc7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0RWwuYXBwZW5kQ2hpbGQobmF0aXZlQ29udGFpbmVyKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gVXBkYXRlIGZsb3cgZGlyZWN0aW9uIGlmIGNvbnRhaW5lciBleGlzdHNcclxuICAgICAgICAgICAgICAgICAgICBuYXRpdmVDb250YWluZXIuc3R5bGUuZmxleERpcmVjdGlvbiA9IGZpbmFsRmxvdyA9PT0gJ3VwJyA/ICdjb2x1bW4tcmV2ZXJzZScgOiAnY29sdW1uJztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgY29udGFpbmVyID0gbmF0aXZlQ29udGFpbmVyO1xyXG4gICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICBwb3NpdGlvbkNsZWFudXAgPSAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRhcmdldEVsICYmIHRhcmdldEVsLnBhcmVudEVsZW1lbnQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0RWwuc3R5bGUucG9zaXRpb24gPSBvcmlnaW5hbEVsZW1lbnRTdHlsZSB8fCAnJztcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gUmVtb3ZlIG5hdGl2ZSBjb250YWluZXIgaWYgZW1wdHlcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hdGl2ZUNvbnRhaW5lciAmJiBuYXRpdmVDb250YWluZXIuY2hpbGRyZW4ubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwb3NpdGlvbktleSA9IG5hdGl2ZUNvbnRhaW5lci5nZXRBdHRyaWJ1dGUoJ2RhdGEtYXB4LXRvYXN0LXBvc2l0aW9uJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocG9zaXRpb25LZXkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfY29udGFpbmVyQ2FjaGUuZGVsZXRlKHBvc2l0aW9uS2V5KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hdGl2ZUNvbnRhaW5lci5yZW1vdmUoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAvLyBEZWZhdWx0OiBnZXQgb3IgY3JlYXRlIGNvbnRhaW5lciBmb3IgdGhpcyBwb3NpdGlvblxyXG4gICAgICAgICAgICAgICAgY29udGFpbmVyID0gdGhpcy5nZXRDb250YWluZXJGb3JQb3NpdGlvbihwb3NpdGlvbiwgZmluYWxGbG93KTtcclxuICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgY29uc3QgdXBkYXRlQ29udGFpbmVyUG9zaXRpb24gPSAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3R5bGVzID0gdGhpcy5jYWxjdWxhdGVQb3NpdGlvbihwb3NpdGlvbiwgY29udGFpbmVyKTtcclxuICAgICAgICAgICAgICAgICAgICBPYmplY3QuYXNzaWduKGNvbnRhaW5lci5zdHlsZSwgc3R5bGVzKTtcclxuICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgIHVwZGF0ZUNvbnRhaW5lclBvc2l0aW9uKCk7XHJcbiAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgIC8vIEZvciByZWxhdGl2ZS9hbmNob3JlZCwgbGlzdGVuIHRvIHNjcm9sbC9yZXNpemVcclxuICAgICAgICAgICAgICAgIGlmICgodHlwZSA9PT0gJ3JlbGF0aXZlJyB8fCB0eXBlID09PSAnYW5jaG9yZWQnKSAmJiBwb3NpdGlvbi5lbGVtZW50KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IHJhZklkID0gbnVsbDtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgbGFzdFVwZGF0ZSA9IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdGhyb3R0bGVNcyA9IDE2OyAvLyB+NjBmcHNcclxuICAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCB0aHJvdHRsZWRVcGRhdGUgPSAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChub3cgLSBsYXN0VXBkYXRlIDwgdGhyb3R0bGVNcykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJhZklkKSBjYW5jZWxBbmltYXRpb25GcmFtZShyYWZJZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByYWZJZCA9IHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlQ29udGFpbmVyUG9zaXRpb24oKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXN0VXBkYXRlID0gRGF0ZS5ub3coKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlQ29udGFpbmVyUG9zaXRpb24oKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RVcGRhdGUgPSBub3c7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgIC8vIEZpbmQgYWxsIHNjcm9sbGFibGUgcGFyZW50c1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHNjcm9sbGFibGVQYXJlbnRzID0gZmluZFNjcm9sbGFibGVQYXJlbnRzKHBvc2l0aW9uLmVsZW1lbnQpO1xyXG4gICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgIC8vIExpc3RlbiB0byBzY3JvbGwgb24gd2luZG93IGFuZCBhbGwgc2Nyb2xsYWJsZSBwYXJlbnRzXHJcbiAgICAgICAgICAgICAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsIHRocm90dGxlZFVwZGF0ZSwgeyBwYXNzaXZlOiB0cnVlIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdyZXNpemUnLCB0aHJvdHRsZWRVcGRhdGUsIHsgcGFzc2l2ZTogdHJ1ZSB9KTtcclxuICAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICAvLyBMaXN0ZW4gdG8gc2Nyb2xsIG9uIGFsbCBzY3JvbGxhYmxlIHBhcmVudCBlbGVtZW50c1xyXG4gICAgICAgICAgICAgICAgICAgIHNjcm9sbGFibGVQYXJlbnRzLmZvckVhY2gocGFyZW50ID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsIHRocm90dGxlZFVwZGF0ZSwgeyBwYXNzaXZlOiB0cnVlIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgIC8vIFdhdGNoIGZvciBlbGVtZW50IHJlbW92YWxcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBvYnNlcnZlciA9IG5ldyBNdXRhdGlvbk9ic2VydmVyKCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFwb3NpdGlvbi5lbGVtZW50LnBhcmVudEVsZW1lbnQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZi5jbG9zZSgnYXBpJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICBvYnNlcnZlci5vYnNlcnZlKGRvY3VtZW50LmJvZHksIHsgY2hpbGRMaXN0OiB0cnVlLCBzdWJ0cmVlOiB0cnVlIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uVXBkYXRlRm4gPSB1cGRhdGVDb250YWluZXJQb3NpdGlvbjtcclxuICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbkNsZWFudXAgPSAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdzY3JvbGwnLCB0aHJvdHRsZWRVcGRhdGUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigncmVzaXplJywgdGhyb3R0bGVkVXBkYXRlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2Nyb2xsYWJsZVBhcmVudHMuZm9yRWFjaChwYXJlbnQgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsIHRocm90dGxlZFVwZGF0ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBvYnNlcnZlci5kaXNjb25uZWN0KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyYWZJZCkgY2FuY2VsQW5pbWF0aW9uRnJhbWUocmFmSWQpO1xyXG4gICAgICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAvLyBTdHJpbmcgcG9zaXRpb24gLSBnZXQgb3IgY3JlYXRlIGNvbnRhaW5lciBmb3IgdGhpcyBwb3NpdGlvblxyXG4gICAgICAgICAgICBjb250YWluZXIgPSB0aGlzLmdldENvbnRhaW5lckZvclBvc2l0aW9uKHBvc2l0aW9uLCBmaW5hbEZsb3cpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBcclxuICAgICAgICAvLyBBcHBlbmQgdG9hc3QgdG8gdGhlIGFwcHJvcHJpYXRlIGNvbnRhaW5lclxyXG4gICAgICAgIGlmIChjb250YWluZXIpIHtcclxuICAgICAgICAgICAgY29udGFpbmVyLmFwcGVuZENoaWxkKHRvYXN0RWwpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIC8vIEZhbGxiYWNrIHRvIGRlZmF1bHQgY29udGFpbmVyXHJcbiAgICAgICAgICAgIHRoaXMuY29udGFpbmVyLmFwcGVuZENoaWxkKHRvYXN0RWwpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gRW50ZXIgYW5pbWF0aW9uXHJcbiAgICAgICAgdG9hc3RFbC5jbGFzc0xpc3QuYWRkKCdBUFgtdG9hc3QtLWVudGVyJyk7XHJcbiAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcclxuICAgICAgICAgICAgdG9hc3RFbC5jbGFzc0xpc3QuYWRkKCdBUFgtdG9hc3QtLWVudGVyLWFjdGl2ZScpO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICAvLyBFdmVudCBoYW5kbGluZyBhbmQgdGltZXJzXHJcbiAgICAgICAgbGV0IHJlbWFpbmluZyA9IG9wdGlvbnMuZHVyYXRpb25NcztcclxuICAgICAgICBsZXQgdGltZXJJZCA9IG51bGw7XHJcbiAgICAgICAgbGV0IHN0YXJ0VHMgPSBudWxsO1xyXG4gICAgICAgIGxldCB1c2VyUGF1c2VkID0gZmFsc2U7XHJcbiAgICAgICAgbGV0IHByb2dyZXNzUmFmSWQgPSBudWxsO1xyXG4gICAgICAgIGNvbnN0IGhhbmRsZXJzID0geyBjbGljazogbmV3IFNldCgpLCBjbG9zZTogbmV3IFNldCgpIH07XHJcblxyXG4gICAgICAgIGNvbnN0IHN0YXJ0VGltZXIgPSAoKSA9PiB7XHJcbiAgICAgICAgICAgIGlmICghcmVtYWluaW5nIHx8IHJlbWFpbmluZyA8PSAwKSByZXR1cm47IC8vIHN0aWNreVxyXG4gICAgICAgICAgICBzdGFydFRzID0gRGF0ZS5ub3coKTtcclxuICAgICAgICAgICAgdGltZXJJZCA9IHdpbmRvdy5zZXRUaW1lb3V0KCgpID0+IHJlZi5jbG9zZSgndGltZW91dCcpLCByZW1haW5pbmcpO1xyXG4gICAgICAgICAgICBpZiAocHJvZ3Jlc3NCYXJFbCkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgdGljayA9ICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodGltZXJJZCA9PSBudWxsIHx8IHN0YXJ0VHMgPT0gbnVsbCkgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGVsYXBzZWQgPSBEYXRlLm5vdygpIC0gc3RhcnRUcztcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCByZW1haW5pbmdNcyA9IE1hdGgubWF4KDAsIHJlbWFpbmluZyAtIGVsYXBzZWQpO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGR1cmF0aW9uTXMgPSBvcHRpb25zLmR1cmF0aW9uTXM7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcGN0ID0gZHVyYXRpb25NcyA+IDAgPyBNYXRoLm1heCgwLCBNYXRoLm1pbigxMDAsIChyZW1haW5pbmdNcyAvIGR1cmF0aW9uTXMpICogMTAwKSkgOiAwO1xyXG4gICAgICAgICAgICAgICAgICAgIHByb2dyZXNzQmFyRWwuc3R5bGUud2lkdGggPSBgJHtwY3R9JWA7XHJcbiAgICAgICAgICAgICAgICAgICAgcHJvZ3Jlc3NCYXJFbC5zZXRBdHRyaWJ1dGUoJ2FyaWEtdmFsdWVub3cnLCBTdHJpbmcoTWF0aC5yb3VuZChwY3QpKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgcHJvZ3Jlc3NSYWZJZCA9IHJlcXVlc3RBbmltYXRpb25GcmFtZSh0aWNrKTtcclxuICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgICAgICBwcm9ncmVzc1JhZklkID0gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKHRpY2spO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfTtcclxuICAgICAgICBjb25zdCBwYXVzZVRpbWVyID0gKCkgPT4ge1xyXG4gICAgICAgICAgICBpZiAodGltZXJJZCAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICB3aW5kb3cuY2xlYXJUaW1lb3V0KHRpbWVySWQpO1xyXG4gICAgICAgICAgICAgICAgdGltZXJJZCA9IG51bGw7XHJcbiAgICAgICAgICAgICAgICBpZiAoc3RhcnRUcyAhPSBudWxsKSByZW1haW5pbmcgLT0gKERhdGUubm93KCkgLSBzdGFydFRzKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAocHJvZ3Jlc3NSYWZJZCAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICBjYW5jZWxBbmltYXRpb25GcmFtZShwcm9ncmVzc1JhZklkKTtcclxuICAgICAgICAgICAgICAgIHByb2dyZXNzUmFmSWQgPSBudWxsO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgY29uc3QgYXR0YWNoUHJvZ3Jlc3NQYXVzZUhhbmRsZXIgPSAoYnRuKSA9PiB7XHJcbiAgICAgICAgICAgIGJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChldikgPT4ge1xyXG4gICAgICAgICAgICAgICAgZXYuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICAgICAgICAgICAgICB1c2VyUGF1c2VkID0gIXVzZXJQYXVzZWQ7XHJcbiAgICAgICAgICAgICAgICBpZiAodXNlclBhdXNlZCkgcGF1c2VUaW1lcigpOyBlbHNlIHN0YXJ0VGltZXIoKTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGxhYmVsID0gdXNlclBhdXNlZCA/ICdSZXByZW5kcmUnIDogJ1BhdXNlJztcclxuICAgICAgICAgICAgICAgIGJ0bi5zZXRBdHRyaWJ1dGUoJ2FyaWEtbGFiZWwnLCBsYWJlbCk7XHJcbiAgICAgICAgICAgICAgICBidG4uc2V0QXR0cmlidXRlKCd0aXRsZScsIGxhYmVsKTtcclxuICAgICAgICAgICAgICAgIGJ0bi5pbm5lckhUTUwgPSBnZXRQcm9ncmVzc1BhdXNlUmVzdW1lSWNvblNWRyh1c2VyUGF1c2VkKTsgLy8gcGF1c2VkID0gcmVzdW1lICh0cmlhbmdsZSlcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgLyoqIEB0eXBlIHtUb2FzdFJlZn0gKi9cclxuICAgICAgICBjb25zdCByZWYgPSB7XHJcbiAgICAgICAgICAgIGlkOiB0b2FzdElkLFxyXG4gICAgICAgICAgICBlbDogdG9hc3RFbCxcclxuICAgICAgICAgICAgY2xvc2U6IChyZWFzb24pID0+IHtcclxuICAgICAgICAgICAgICAgIGNsZWFudXAocmVhc29uIHx8ICdhcGknKTtcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgdXBkYXRlOiAocGFydGlhbCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbWVyZ2VkID0gdGhpcy5ub3JtYWxpemVPcHRpb25zKHsgLi4ub3B0aW9ucywgLi4ucGFydGlhbCB9KTtcclxuICAgICAgICAgICAgICAgIC8vIHVwZGF0ZSBjb250ZW50XHJcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIG1lcmdlZC5tZXNzYWdlID09PSAnc3RyaW5nJykge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnRlbnRFbC50ZXh0Q29udGVudCA9IG1lcmdlZC5tZXNzYWdlO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtZXJnZWQubWVzc2FnZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnRlbnRFbC5pbm5lckhUTUwgPSAnJztcclxuICAgICAgICAgICAgICAgICAgICBjb250ZW50RWwuYXBwZW5kQ2hpbGQobWVyZ2VkLm1lc3NhZ2UpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgLy8gdXBkYXRlIHR5cGUgY2xhc3NcclxuICAgICAgICAgICAgICAgIFsnaW5mbycsJ3N1Y2Nlc3MnLCd3YXJuaW5nJywnZGFuZ2VyJ10uZm9yRWFjaCh0ID0+IHRvYXN0RWwuY2xhc3NMaXN0LnJlbW92ZShgQVBYLXRvYXN0LS0ke3R9YCkpO1xyXG4gICAgICAgICAgICAgICAgdG9hc3RFbC5jbGFzc0xpc3QuYWRkKGBBUFgtdG9hc3QtLSR7bWVyZ2VkLnR5cGV9YCk7XHJcbiAgICAgICAgICAgICAgICAvLyB1cGRhdGUgY2xhc3Nlc1xyXG4gICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMuY2xhc3NOYW1lICE9PSBtZXJnZWQuY2xhc3NOYW1lKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMuY2xhc3NOYW1lKSB0b2FzdEVsLmNsYXNzTGlzdC5yZW1vdmUoLi4ub3B0aW9ucy5jbGFzc05hbWUuc3BsaXQoJyAnKS5maWx0ZXIoQm9vbGVhbikpO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChtZXJnZWQuY2xhc3NOYW1lKSB0b2FzdEVsLmNsYXNzTGlzdC5hZGQoLi4ubWVyZ2VkLmNsYXNzTmFtZS5zcGxpdCgnICcpLmZpbHRlcihCb29sZWFuKSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAvLyB1cGRhdGUgcHJvZ3Jlc3MgdmlzaWJpbGl0eS9wb3NpdGlvblxyXG4gICAgICAgICAgICAgICAgb3B0aW9ucy5wcm9ncmVzcyA9IG1lcmdlZC5wcm9ncmVzcztcclxuICAgICAgICAgICAgICAgIGlmIChwcm9ncmVzc1dyYXApIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoIW1lcmdlZC5wcm9ncmVzcy5lbmFibGUgfHwgbWVyZ2VkLmR1cmF0aW9uTXMgPD0gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBwcm9ncmVzc1dyYXAuc3R5bGUuZGlzcGxheSA9ICdub25lJztcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBwcm9ncmVzc1dyYXAuc3R5bGUuZGlzcGxheSA9ICcnO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBhcHBseVByb2dyZXNzUG9zaXRpb24odG9hc3RFbCwgcHJvZ3Jlc3NXcmFwLCBjb250ZW50RWwsIGNsb3NlQnRuLCBtZXJnZWQucHJvZ3Jlc3MucG9zaXRpb24pO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobWVyZ2VkLnByb2dyZXNzLmVuYWJsZSAmJiBtZXJnZWQuZHVyYXRpb25NcyA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBjcmVhdGVkID0gY3JlYXRlUHJvZ3Jlc3NCbG9jayh0b2FzdEVsLCBjb250ZW50RWwsIGNsb3NlQnRuLCBtZXJnZWQucHJvZ3Jlc3MpO1xyXG4gICAgICAgICAgICAgICAgICAgIHByb2dyZXNzV3JhcCA9IGNyZWF0ZWQud3JhcDtcclxuICAgICAgICAgICAgICAgICAgICBwcm9ncmVzc0JhckVsID0gY3JlYXRlZC5iYXI7XHJcbiAgICAgICAgICAgICAgICAgICAgcHJvZ3Jlc3NQYXVzZUJ0biA9IGNyZWF0ZWQucGF1c2VCdG47XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHByb2dyZXNzUGF1c2VCdG4pIGF0dGFjaFByb2dyZXNzUGF1c2VIYW5kbGVyKHByb2dyZXNzUGF1c2VCdG4pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYgKHByb2dyZXNzV3JhcCAmJiBwcm9ncmVzc1dyYXAuc3R5bGUuZGlzcGxheSAhPT0gJ25vbmUnICYmIG1lcmdlZC5wcm9ncmVzcy5wYXVzZUJ1dHRvbiA9PT0gdHJ1ZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRvYXN0RWwuY2xhc3NMaXN0LmFkZCgnQVBYLXRvYXN0LS1oYXMtcHJvZ3Jlc3MtcGF1c2UnKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdG9hc3RFbC5jbGFzc0xpc3QucmVtb3ZlKCdBUFgtdG9hc3QtLWhhcy1wcm9ncmVzcy1wYXVzZScpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgLy8gdXBkYXRlIGR1cmF0aW9uIGxvZ2ljXHJcbiAgICAgICAgICAgICAgICBvcHRpb25zLmR1cmF0aW9uTXMgPSBtZXJnZWQuZHVyYXRpb25NcztcclxuICAgICAgICAgICAgICAgIHJlbWFpbmluZyA9IG1lcmdlZC5kdXJhdGlvbk1zO1xyXG4gICAgICAgICAgICAgICAgaWYgKHByb2dyZXNzQmFyRWwpIHtcclxuICAgICAgICAgICAgICAgICAgICBwcm9ncmVzc0JhckVsLnN0eWxlLndpZHRoID0gJzEwMCUnO1xyXG4gICAgICAgICAgICAgICAgICAgIHByb2dyZXNzQmFyRWwuc2V0QXR0cmlidXRlKCdhcmlhLXZhbHVlbm93JywgJzEwMCcpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgcGF1c2VUaW1lcigpO1xyXG4gICAgICAgICAgICAgICAgc3RhcnRUaW1lcigpO1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB3aGVuQ2xvc2VkOiAoKSA9PiBjbG9zZWRQcm9taXNlLFxyXG4gICAgICAgICAgICBvbjogKGV2ZW50LCBoYW5kbGVyKSA9PiB7IGhhbmRsZXJzW2V2ZW50XS5hZGQoaGFuZGxlcik7IHJldHVybiAoKSA9PiByZWYub2ZmKGV2ZW50LCBoYW5kbGVyKTsgfSxcclxuICAgICAgICAgICAgb2ZmOiAoZXZlbnQsIGhhbmRsZXIpID0+IHsgaGFuZGxlcnNbZXZlbnRdLmRlbGV0ZShoYW5kbGVyKTsgfVxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIGNvbnN0IG5vdGlmeSA9IChldmVudCwgYXJnKSA9PiBoYW5kbGVyc1tldmVudF0uZm9yRWFjaChmbiA9PiB7IHRyeSB7IGZuKGFyZyk7IH0gY2F0Y2ggKF8pIHt9IH0pO1xyXG5cclxuICAgICAgICBjb25zdCBjbG9zZWRQcm9taXNlID0gbmV3IFByb21pc2UocmVzb2x2ZSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IGZpbmlzaCA9IChyZWFzb24pID0+IHtcclxuICAgICAgICAgICAgICAgIG5vdGlmeSgnY2xvc2UnLCByZWFzb24pO1xyXG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBvcHRpb25zLm9uQ2xvc2UgPT09ICdmdW5jdGlvbicpIHtcclxuICAgICAgICAgICAgICAgICAgICB0cnkgeyBvcHRpb25zLm9uQ2xvc2UocmVmLCByZWFzb24pOyB9IGNhdGNoKF8pe31cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcclxuICAgICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IGNsZWFudXAgPSAocmVhc29uKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAoIXRvYXN0RWwpIHJldHVybjtcclxuICAgICAgICAgICAgICAgIHBhdXNlVGltZXIoKTtcclxuICAgICAgICAgICAgICAgIGlmIChwcm9ncmVzc1JhZklkICE9IG51bGwpIHtcclxuICAgICAgICAgICAgICAgICAgICBjYW5jZWxBbmltYXRpb25GcmFtZShwcm9ncmVzc1JhZklkKTtcclxuICAgICAgICAgICAgICAgICAgICBwcm9ncmVzc1JhZklkID0gbnVsbDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIC8vIENsZWFudXAgcG9zaXRpb24gbGlzdGVuZXJzIGFuZCByZXN0b3JlIHN0eWxlc1xyXG4gICAgICAgICAgICAgICAgaWYgKHBvc2l0aW9uQ2xlYW51cCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uQ2xlYW51cCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uQ2xlYW51cCA9IG51bGw7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgIC8vIElmIG92ZXJmbG93LCByZW1vdmUgaW1tZWRpYXRlbHkgdG8gZW5mb3JjZSBoYXJkIGNhcFxyXG4gICAgICAgICAgICAgICAgaWYgKHJlYXNvbiA9PT0gJ292ZXJmbG93Jykge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0b2FzdEVsLnBhcmVudEVsZW1lbnQpIHRvYXN0RWwucGFyZW50RWxlbWVudC5yZW1vdmVDaGlsZCh0b2FzdEVsKTtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBpZHggPSB0aGlzLm9wZW4uaW5kZXhPZihyZWYpO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChpZHggPj0gMCkgdGhpcy5vcGVuLnNwbGljZShpZHgsIDEpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaWRUb1JlZi5kZWxldGUodG9hc3RJZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgZmluaXNoKHJlYXNvbik7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIC8vIE90aGVyd2lzZSwgYW5pbWF0ZSBvdXRcclxuICAgICAgICAgICAgICAgIHRvYXN0RWwuY2xhc3NMaXN0LmFkZCgnQVBYLXRvYXN0LS1leGl0Jyk7XHJcbiAgICAgICAgICAgICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4gdG9hc3RFbC5jbGFzc0xpc3QuYWRkKCdBUFgtdG9hc3QtLWV4aXQtYWN0aXZlJykpO1xyXG5cclxuICAgICAgICAgICAgICAgIGNvbnN0IHJlbW92ZUVsID0gKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHRvYXN0RWwucmVtb3ZlRXZlbnRMaXN0ZW5lcigndHJhbnNpdGlvbmVuZCcsIHJlbW92ZUVsKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodG9hc3RFbC5wYXJlbnRFbGVtZW50KSB0b2FzdEVsLnBhcmVudEVsZW1lbnQucmVtb3ZlQ2hpbGQodG9hc3RFbCk7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaWR4ID0gdGhpcy5vcGVuLmluZGV4T2YocmVmKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoaWR4ID49IDApIHRoaXMub3Blbi5zcGxpY2UoaWR4LCAxKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmlkVG9SZWYuZGVsZXRlKHRvYXN0SWQpO1xyXG4gICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgIC8vIFNjaGVkdWxlIGdhcmJhZ2UgY29sbGVjdGlvbiBmb3IgdW5tYW5hZ2VkIGNvbnRhaW5lcnNcclxuICAgICAgICAgICAgICAgICAgICBzY2hlZHVsZUdhcmJhZ2VDb2xsZWN0aW9uKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgZmluaXNoKHJlYXNvbik7XHJcbiAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgICAgdG9hc3RFbC5hZGRFdmVudExpc3RlbmVyKCd0cmFuc2l0aW9uZW5kJywgcmVtb3ZlRWwpO1xyXG4gICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgLy8gYXR0YWNoIGNsb3NlIGJlaGF2aW9yXHJcbiAgICAgICAgICAgIHJlZi5jbG9zZSA9IChyZWFzb24pID0+IGNsZWFudXAocmVhc29uIHx8ICdhcGknKTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgLy8gQ2xpY2sgaGFuZGxpbmdcclxuICAgICAgICB0b2FzdEVsLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGV2KSA9PiB7XHJcbiAgICAgICAgICAgIG5vdGlmeSgnY2xpY2snLCBldik7XHJcbiAgICAgICAgICAgIGlmICh0eXBlb2Ygb3B0aW9ucy5vbkNsaWNrID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgICAgICAgICAgICB0cnkgeyBvcHRpb25zLm9uQ2xpY2socmVmLCBldik7IH0gY2F0Y2goXyl7fVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIC8vIEhvdmVyIHBhdXNlXHJcbiAgICAgICAgdG9hc3RFbC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWVudGVyJywgcGF1c2VUaW1lcik7XHJcbiAgICAgICAgdG9hc3RFbC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWxlYXZlJywgKCkgPT4geyBpZiAoIXVzZXJQYXVzZWQpIHN0YXJ0VGltZXIoKTsgfSk7XHJcblxyXG4gICAgICAgIGlmIChjbG9zZUJ0bikgY2xvc2VCdG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoZXYpID0+IHsgZXYuc3RvcFByb3BhZ2F0aW9uKCk7IHJlZi5jbG9zZSgnY2xvc2UnKTsgfSk7XHJcbiAgICAgICAgaWYgKHByb2dyZXNzUGF1c2VCdG4pIGF0dGFjaFByb2dyZXNzUGF1c2VIYW5kbGVyKHByb2dyZXNzUGF1c2VCdG4pO1xyXG5cclxuICAgICAgICAvLyBUcmFja1xyXG4gICAgICAgIHRoaXMub3Blbi5wdXNoKHJlZik7XHJcbiAgICAgICAgdGhpcy5pZFRvUmVmLnNldCh0b2FzdElkLCByZWYpO1xyXG5cclxuICAgICAgICAvLyBPdmVyZmxvdyBwb2xpY3lcclxuICAgICAgICBpZiAodGhpcy5vcGVuLmxlbmd0aCA+IHRoaXMuY29uZmlnLm1heFRvYXN0cykge1xyXG4gICAgICAgICAgICBjb25zdCBvbGRlc3QgPSB0aGlzLm9wZW5bMF07XHJcbiAgICAgICAgICAgIG9sZGVzdC5jbG9zZSgnb3ZlcmZsb3cnKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHN0YXJ0VGltZXIoKTtcclxuICAgICAgICByZXR1cm4gcmVmO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ29udmVuaWVuY2UgaGVscGVyc1xyXG4gICAgICovXHJcbiAgICBpbmZvKG1lc3NhZ2UsIG9wdHMpIHsgcmV0dXJuIHRoaXMuc2hvdyh7IC4uLihvcHRzfHx7fSksIG1lc3NhZ2UsIHR5cGU6ICdpbmZvJyB9KTsgfVxyXG4gICAgc3VjY2VzcyhtZXNzYWdlLCBvcHRzKSB7IHJldHVybiB0aGlzLnNob3coeyAuLi4ob3B0c3x8e30pLCBtZXNzYWdlLCB0eXBlOiAnc3VjY2VzcycgfSk7IH1cclxuICAgIHdhcm5pbmcobWVzc2FnZSwgb3B0cykgeyByZXR1cm4gdGhpcy5zaG93KHsgLi4uKG9wdHN8fHt9KSwgbWVzc2FnZSwgdHlwZTogJ3dhcm5pbmcnIH0pOyB9XHJcbiAgICBkYW5nZXIobWVzc2FnZSwgb3B0cykgeyByZXR1cm4gdGhpcy5zaG93KHsgLi4uKG9wdHN8fHt9KSwgbWVzc2FnZSwgdHlwZTogJ2RhbmdlcicgfSk7IH1cclxuXHJcbiAgICAvKiogQHBhcmFtIHsnYXBpJ3wnb3ZlcmZsb3cnfSBbcmVhc29uXSAqL1xyXG4gICAgY2xvc2VBbGwocmVhc29uKSB7XHJcbiAgICAgICAgLy8gY29weSB0byBhdm9pZCBtdXRhdGlvbiBkdXJpbmcgaXRlcmF0aW9uXHJcbiAgICAgICAgY29uc3QgYWxsID0gdGhpcy5vcGVuLnNsaWNlKCk7XHJcbiAgICAgICAgYWxsLmZvckVhY2gociA9PiByLmNsb3NlKHJlYXNvbiB8fCAnYXBpJykpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAcGFyYW0ge1RvYXN0T3B0aW9uc30gb3B0cyAqL1xyXG4gICAgbm9ybWFsaXplT3B0aW9ucyhvcHRzKSB7XHJcbiAgICAgICAgY29uc3QgbyA9IHsgLi4ub3B0cyB9O1xyXG4gICAgICAgIGlmICghby50eXBlKSBvLnR5cGUgPSAnaW5mbyc7XHJcbiAgICAgICAgaWYgKHR5cGVvZiBvLmRpc21pc3NpYmxlICE9PSAnYm9vbGVhbicpIG8uZGlzbWlzc2libGUgPSB0cnVlO1xyXG4gICAgICAgIGlmICh0eXBlb2Ygby5kdXJhdGlvbk1zICE9PSAnbnVtYmVyJykgby5kdXJhdGlvbk1zID0gdGhpcy5jb25maWcuZGVmYXVsdER1cmF0aW9uTXM7XHJcbiAgICAgICAgLy8gVXNlIGlkIGZyb20gb3B0aW9ucyBpZiBwcm92aWRlZCwgb3RoZXJ3aXNlIHVzZSBpZCBmcm9tIGNvbmZpZywgb3RoZXJ3aXNlIHVuZGVmaW5lZCAod2lsbCBiZSBhdXRvLWdlbmVyYXRlZClcclxuICAgICAgICBpZiAoIW8uaWQgJiYgdGhpcy5jb25maWcuaWQpIG8uaWQgPSB0aGlzLmNvbmZpZy5pZDtcclxuICAgICAgICBvLnByb2dyZXNzID0gcmVzb2x2ZVByb2dyZXNzKG9wdHMucHJvZ3Jlc3MsIHRoaXMuY29uZmlnLnByb2dyZXNzKTtcclxuICAgICAgICByZXR1cm4gbztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEZpbmQgb3IgY3JlYXRlIGEgY29udGFpbmVyIGZvciBhIHNwZWNpZmljIHBvc2l0aW9uXHJcbiAgICAgKiBAcGFyYW0ge1Bvc2l0aW9ufSBwb3NpdGlvblxyXG4gICAgICogQHBhcmFtIHsndXAnfCdkb3duJ30gW2Zsb3ddIEZsb3cgZGlyZWN0aW9uIChhbHJlYWR5IGRldGVybWluZWQsIG5vdCAnYXV0bycpXHJcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFttYW5hZ2VkXSBXaGV0aGVyIHRoaXMgY29udGFpbmVyIGlzIG1hbmFnZWQgYnkgYSBtYW5hZ2VyIChkZWZhdWx0OiBmYWxzZSlcclxuICAgICAqIEByZXR1cm5zIHtIVE1MRWxlbWVudHxudWxsfVxyXG4gICAgICovXHJcbiAgICBnZXRDb250YWluZXJGb3JQb3NpdGlvbihwb3NpdGlvbiwgZmxvdywgbWFuYWdlZCA9IGZhbHNlKSB7XHJcbiAgICAgICAgaWYgKCFpc0Jyb3dzZXIpIHJldHVybiBudWxsO1xyXG4gICAgICAgIFxyXG4gICAgICAgIGNvbnN0IHBvc2l0aW9uS2V5ID0gc2VyaWFsaXplUG9zaXRpb24ocG9zaXRpb24pO1xyXG4gICAgICAgIFxyXG4gICAgICAgIC8vIEZsb3cgc2hvdWxkIGFscmVhZHkgYmUgZGV0ZXJtaW5lZCAoJ3VwJyBvciAnZG93bicpLCBidXQgZmFsbGJhY2sgdG8gYXV0byBpZiBuZWVkZWRcclxuICAgICAgICBjb25zdCBmaW5hbEZsb3cgPSBmbG93ICYmIGZsb3cgIT09ICdhdXRvJyA/IGZsb3cgOiBkZXRlcm1pbmVGbG93KHBvc2l0aW9uKTtcclxuICAgICAgICBcclxuICAgICAgICAvLyAxLiBDaGVjayBtZW1vcnkgY2FjaGVcclxuICAgICAgICBsZXQgYyA9IF9jb250YWluZXJDYWNoZS5nZXQocG9zaXRpb25LZXkpO1xyXG4gICAgICAgIFxyXG4gICAgICAgIC8vIDIuIElmIG5vdCBpbiBjYWNoZSwgc2VhcmNoIGluIERPTSBieSBkYXRhIGF0dHJpYnV0ZVxyXG4gICAgICAgIGlmICghYyAmJiBpc0Jyb3dzZXIpIHtcclxuICAgICAgICAgICAgYyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYFtkYXRhLWFweC10b2FzdC1wb3NpdGlvbj1cIiR7cG9zaXRpb25LZXl9XCJdYCk7XHJcbiAgICAgICAgICAgIGlmIChjKSB7XHJcbiAgICAgICAgICAgICAgICBfY29udGFpbmVyQ2FjaGUuc2V0KHBvc2l0aW9uS2V5LCBjKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBcclxuICAgICAgICAvLyAzLiBJZiBzdGlsbCBub3QgZm91bmQsIGNyZWF0ZSBuZXcgY29udGFpbmVyXHJcbiAgICAgICAgaWYgKCFjKSB7XHJcbiAgICAgICAgICAgIGMgPSBjcmVhdGVFbCgnZGl2JywgJ0FQWC10b2FzdC1jb250YWluZXInKTtcclxuICAgICAgICAgICAgYy5zZXRBdHRyaWJ1dGUoJ2RhdGEtYXB4LXRvYXN0LXBvc2l0aW9uJywgcG9zaXRpb25LZXkpO1xyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgLy8gTWFyayBhcyBtYW5hZ2VkIGlmIGNyZWF0ZWQgYnkgYSBtYW5hZ2VyXHJcbiAgICAgICAgICAgIGlmIChtYW5hZ2VkKSB7XHJcbiAgICAgICAgICAgICAgICBjLnNldEF0dHJpYnV0ZSgnZGF0YS1hcHgtdG9hc3QtbWFuYWdlZCcsICd0cnVlJyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIC8vIERldGVybWluZSBwb3NpdGlvbiBjbGFzcyAoZm9yIENTUylcclxuICAgICAgICAgICAgY29uc3QgcG9zQ2xhc3MgPSB0eXBlb2YgcG9zaXRpb24gPT09ICdzdHJpbmcnIFxyXG4gICAgICAgICAgICAgICAgPyBwb3NpdGlvbiBcclxuICAgICAgICAgICAgICAgIDogKHBvc2l0aW9uLnR5cGUgfHwgJ2JvdHRvbS1yaWdodCcpO1xyXG4gICAgICAgICAgICBjLmNsYXNzTGlzdC5hZGQoYEFQWC10b2FzdC1jb250YWluZXItLSR7cG9zQ2xhc3N9YCk7XHJcbiAgICAgICAgICAgIGMuc2V0QXR0cmlidXRlKCdhcmlhLWxpdmUnLCBTdHJpbmcodGhpcy5jb25maWcuYXJpYUxpdmUpKTtcclxuICAgICAgICAgICAgYy5zdHlsZS56SW5kZXggPSBTdHJpbmcodGhpcy5jb25maWcuekluZGV4KTtcclxuICAgICAgICAgICAgYy5zdHlsZS5nYXAgPSBgJHt0aGlzLmNvbmZpZy5nYXB9cHhgO1xyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgLy8gQXBwbHkgZmxvdyBkaXJlY3Rpb25cclxuICAgICAgICAgICAgYy5zdHlsZS5mbGV4RGlyZWN0aW9uID0gZmluYWxGbG93ID09PSAndXAnID8gJ2NvbHVtbi1yZXZlcnNlJyA6ICdjb2x1bW4nO1xyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgLy8gQXBwbHkgcG9zaXRpb24gc3R5bGVzIGlmIG9iamVjdCBwb3NpdGlvblxyXG4gICAgICAgICAgICBpZiAodHlwZW9mIHBvc2l0aW9uID09PSAnb2JqZWN0JyAmJiBwb3NpdGlvbiAhPT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgYy5zdHlsZS5wb3NpdGlvbiA9ICdmaXhlZCc7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBzdHlsZXMgPSB0aGlzLmNhbGN1bGF0ZVBvc2l0aW9uKHBvc2l0aW9uLCBjKTtcclxuICAgICAgICAgICAgICAgIE9iamVjdC5hc3NpZ24oYy5zdHlsZSwgc3R5bGVzKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgLy8gQXBwZW5kIHRvIHdyYXBwZXIgZm9yIGNsZWFuIERPTSBvcmdhbml6YXRpb25cclxuICAgICAgICAgICAgY29uc3Qgd3JhcHBlciA9IGdldFRvYXN0V3JhcHBlcigpO1xyXG4gICAgICAgICAgICBpZiAod3JhcHBlcikge1xyXG4gICAgICAgICAgICAgICAgd3JhcHBlci5hcHBlbmRDaGlsZChjKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgX2NvbnRhaW5lckNhY2hlLnNldChwb3NpdGlvbktleSwgYyk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgLy8gVXBkYXRlIGZsb3cgZGlyZWN0aW9uIGlmIGNvbnRhaW5lciBleGlzdHMgKG1heSBiZSBzaGFyZWQpXHJcbiAgICAgICAgICAgIGMuc3R5bGUuZmxleERpcmVjdGlvbiA9IGZpbmFsRmxvdyA9PT0gJ3VwJyA/ICdjb2x1bW4tcmV2ZXJzZScgOiAnY29sdW1uJztcclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIC8vIElmIGNvbnRhaW5lciBleGlzdHMgYW5kIGlzIG5vdyBtYW5hZ2VkLCBtYXJrIGl0XHJcbiAgICAgICAgICAgIGlmIChtYW5hZ2VkICYmICFjLmhhc0F0dHJpYnV0ZSgnZGF0YS1hcHgtdG9hc3QtbWFuYWdlZCcpKSB7XHJcbiAgICAgICAgICAgICAgICBjLnNldEF0dHJpYnV0ZSgnZGF0YS1hcHgtdG9hc3QtbWFuYWdlZCcsICd0cnVlJyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgXHJcbiAgICAgICAgcmV0dXJuIGM7XHJcbiAgICB9XHJcblxyXG4gICAgZW5zdXJlQ29udGFpbmVyKCkge1xyXG4gICAgICAgIGlmICh0aGlzLmNvbnRhaW5lciB8fCAhaXNCcm93c2VyKSByZXR1cm47XHJcbiAgICAgICAgXHJcbiAgICAgICAgY29uc3QgcG9zaXRpb24gPSB0aGlzLmNvbmZpZy5wb3NpdGlvbiB8fCAnYm90dG9tLXJpZ2h0JztcclxuICAgICAgICBjb25zdCBmbG93ID0gdGhpcy5jb25maWcuZmxvdyAhPT0gdW5kZWZpbmVkID8gdGhpcy5jb25maWcuZmxvdyA6ICdhdXRvJztcclxuICAgICAgICAvLyBDb250YWluZXJzIGNyZWF0ZWQgYnkgZW5zdXJlQ29udGFpbmVyIGFyZSBtYW5hZ2VkXHJcbiAgICAgICAgdGhpcy5jb250YWluZXIgPSB0aGlzLmdldENvbnRhaW5lckZvclBvc2l0aW9uKHBvc2l0aW9uLCBmbG93LCB0cnVlKTtcclxuICAgICAgICB0aGlzLmFwcGx5Q29udGFpbmVyQ29uZmlnKCk7XHJcbiAgICB9XHJcblxyXG4gICAgYXBwbHlDb250YWluZXJDb25maWcoKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLmNvbnRhaW5lcikgcmV0dXJuO1xyXG4gICAgICAgIGNvbnN0IHBvc2l0aW9uID0gdGhpcy5jb25maWcucG9zaXRpb24gfHwgJ2JvdHRvbS1yaWdodCc7XHJcbiAgICAgICAgY29uc3QgcG9zID0gdHlwZW9mIHBvc2l0aW9uID09PSAnc3RyaW5nJyA/IHBvc2l0aW9uIDogKHBvc2l0aW9uLnR5cGUgfHwgJ2JvdHRvbS1yaWdodCcpO1xyXG4gICAgICAgIFxyXG4gICAgICAgIC8vIEFwcGx5IHN0eWxlcyAodGhlc2UgbWF5IGJlIG92ZXJyaWRkZW4gYnkgb3RoZXIgbWFuYWdlcnMgc2hhcmluZyB0aGUgY29udGFpbmVyKVxyXG4gICAgICAgIHRoaXMuY29udGFpbmVyLnN0eWxlLnpJbmRleCA9IFN0cmluZyh0aGlzLmNvbmZpZy56SW5kZXgpO1xyXG4gICAgICAgIHRoaXMuY29udGFpbmVyLnN0eWxlLmdhcCA9IGAke3RoaXMuY29uZmlnLmdhcH1weGA7XHJcbiAgICAgICAgdGhpcy5jb250YWluZXIuc2V0QXR0cmlidXRlKCdhcmlhLWxpdmUnLCBTdHJpbmcodGhpcy5jb25maWcuYXJpYUxpdmUpKTtcclxuICAgICAgICBcclxuICAgICAgICAvLyBVcGRhdGUgcG9zaXRpb24gY2xhc3MgKG9ubHkgZm9yIHN0cmluZyBwb3NpdGlvbnMpXHJcbiAgICAgICAgaWYgKHR5cGVvZiBwb3NpdGlvbiA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgICAgICAgY29uc3QgcG9zQ2xhc3NlcyA9IFsnYm90dG9tLXJpZ2h0JywnYm90dG9tLWxlZnQnLCd0b3AtcmlnaHQnLCd0b3AtbGVmdCddLm1hcChwID0+IGBBUFgtdG9hc3QtY29udGFpbmVyLS0ke3B9YCk7XHJcbiAgICAgICAgICAgIHRoaXMuY29udGFpbmVyLmNsYXNzTGlzdC5yZW1vdmUoLi4ucG9zQ2xhc3Nlcyk7XHJcbiAgICAgICAgICAgIHRoaXMuY29udGFpbmVyLmNsYXNzTGlzdC5hZGQoYEFQWC10b2FzdC1jb250YWluZXItLSR7cG9zfWApO1xyXG4gICAgICAgIH1cclxuICAgICAgICBcclxuICAgICAgICAvLyBBcHBseSBjb250YWluZXIgY2xhc3MgaWYgc3BlY2lmaWVkXHJcbiAgICAgICAgaWYgKHRoaXMuY29uZmlnLmNvbnRhaW5lckNsYXNzKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY29uZmlnLmNvbnRhaW5lckNsYXNzLnNwbGl0KCcgJykuZmlsdGVyKEJvb2xlYW4pLmZvckVhY2goY2xzID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMuY29udGFpbmVyLmNsYXNzTGlzdC5hZGQoY2xzKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIFxyXG4gICAgICAgIC8vIEFwcGx5IG9mZnNldCAob25seSBmb3Igc3RyaW5nIHBvc2l0aW9ucylcclxuICAgICAgICBpZiAodHlwZW9mIHBvc2l0aW9uID09PSAnc3RyaW5nJykge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5jb25maWcub2Zmc2V0KSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBvZmZzZXQgPSBgJHt0aGlzLmNvbmZpZy5vZmZzZXR9cHhgO1xyXG4gICAgICAgICAgICAgICAgaWYgKHBvcy5pbmNsdWRlcygnYm90dG9tJykpIHRoaXMuY29udGFpbmVyLnN0eWxlLmJvdHRvbSA9IG9mZnNldDtcclxuICAgICAgICAgICAgICAgIGVsc2UgdGhpcy5jb250YWluZXIuc3R5bGUudG9wID0gb2Zmc2V0O1xyXG4gICAgICAgICAgICAgICAgaWYgKHBvcy5pbmNsdWRlcygncmlnaHQnKSkgdGhpcy5jb250YWluZXIuc3R5bGUucmlnaHQgPSBvZmZzZXQ7XHJcbiAgICAgICAgICAgICAgICBlbHNlIHRoaXMuY29udGFpbmVyLnN0eWxlLmxlZnQgPSBvZmZzZXQ7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAvLyBSZXNldCBvZmZzZXQgaWYgbm90IHNwZWNpZmllZFxyXG4gICAgICAgICAgICAgICAgaWYgKHBvcy5pbmNsdWRlcygnYm90dG9tJykpIHRoaXMuY29udGFpbmVyLnN0eWxlLmJvdHRvbSA9ICcnO1xyXG4gICAgICAgICAgICAgICAgZWxzZSB0aGlzLmNvbnRhaW5lci5zdHlsZS50b3AgPSAnJztcclxuICAgICAgICAgICAgICAgIGlmIChwb3MuaW5jbHVkZXMoJ3JpZ2h0JykpIHRoaXMuY29udGFpbmVyLnN0eWxlLnJpZ2h0ID0gJyc7XHJcbiAgICAgICAgICAgICAgICBlbHNlIHRoaXMuY29udGFpbmVyLnN0eWxlLmxlZnQgPSAnJztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHBvc2l0aW9uID09PSAnb2JqZWN0JyAmJiBwb3NpdGlvbiAhPT0gbnVsbCkge1xyXG4gICAgICAgICAgICAvLyBGb3Igb2JqZWN0IHBvc2l0aW9ucywgZW5zdXJlIGNvbnRhaW5lciBoYXMgcG9zaXRpb246IGZpeGVkXHJcbiAgICAgICAgICAgIHRoaXMuY29udGFpbmVyLnN0eWxlLnBvc2l0aW9uID0gJ2ZpeGVkJztcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDYWxjdWxhdGUgcG9zaXRpb24gZm9yIGEgY29udGFpbmVyIGJhc2VkIG9uIHBvc2l0aW9uIGNvbmZpZ1xyXG4gICAgICogQHBhcmFtIHtQb3NpdGlvbn0gcG9zaXRpb25cclxuICAgICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGNvbnRhaW5lckVsXHJcbiAgICAgKiBAcmV0dXJucyB7e2xlZnQ/OiBzdHJpbmcsIHRvcD86IHN0cmluZywgcmlnaHQ/OiBzdHJpbmcsIGJvdHRvbT86IHN0cmluZ319XHJcbiAgICAgKi9cclxuICAgIGNhbGN1bGF0ZVBvc2l0aW9uKHBvc2l0aW9uLCBjb250YWluZXJFbCkge1xyXG4gICAgICAgIGlmICh0eXBlb2YgcG9zaXRpb24gPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgICAgIC8vIFN0cmluZyBwb3NpdGlvbnMgYXJlIGhhbmRsZWQgYnkgY29udGFpbmVyIENTU1xyXG4gICAgICAgICAgICByZXR1cm4ge307XHJcbiAgICAgICAgfVxyXG4gICAgICAgIFxyXG4gICAgICAgIGlmICh0eXBlb2YgcG9zaXRpb24gPT09ICdvYmplY3QnICYmIHBvc2l0aW9uICE9PSBudWxsKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHR5cGUgPSBwb3NpdGlvbi50eXBlIHx8IChwb3NpdGlvbi54IHx8IHBvc2l0aW9uLnkgPyAnc3RpY2t5JyA6IG51bGwpO1xyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgaWYgKHR5cGUgPT09ICdzdGlja3knIHx8ICghdHlwZSAmJiAocG9zaXRpb24ueCB8fCBwb3NpdGlvbi55KSkpIHtcclxuICAgICAgICAgICAgICAgIC8vIFN0aWNreTogZml4ZWQgcG9zaXRpb24gcmVsYXRpdmUgdG8gdmlld3BvcnRcclxuICAgICAgICAgICAgICAgIGNvbnN0IHN0eWxlcyA9IHt9O1xyXG4gICAgICAgICAgICAgICAgaWYgKHBvc2l0aW9uLnggIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChwb3NpdGlvbi54LnN0YXJ0c1dpdGgoJy0nKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzdHlsZXMucmlnaHQgPSBwb3NpdGlvbi54LnN1YnN0cmluZygxKTtcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzdHlsZXMubGVmdCA9IHBvc2l0aW9uLng7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYgKHBvc2l0aW9uLnkgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChwb3NpdGlvbi55LnN0YXJ0c1dpdGgoJy0nKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzdHlsZXMuYm90dG9tID0gcG9zaXRpb24ueS5zdWJzdHJpbmcoMSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGVzLnRvcCA9IHBvc2l0aW9uLnk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHN0eWxlcztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgaWYgKHR5cGUgPT09ICdyZWxhdGl2ZScgJiYgcG9zaXRpb24uZWxlbWVudCkge1xyXG4gICAgICAgICAgICAgICAgLy8gUmVsYXRpdmU6IHBvc2l0aW9uIHJlbGF0aXZlIHRvIGVsZW1lbnQgd2l0aCB4L3kgb2Zmc2V0XHJcbiAgICAgICAgICAgICAgICAvLyBVc2UgZml4ZWQgcG9zaXRpb25pbmcsIHNvIGdldEJvdW5kaW5nQ2xpZW50UmVjdCgpIGlzIHJlbGF0aXZlIHRvIHZpZXdwb3J0XHJcbiAgICAgICAgICAgICAgICBjb25zdCByZWN0ID0gcG9zaXRpb24uZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcclxuICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgLy8gUGFyc2UgeC95IG9mZnNldHMgKGNhbiBiZSBweCwgZW0sIGV0Yy4pXHJcbiAgICAgICAgICAgICAgICBjb25zdCBwYXJzZU9mZnNldCA9ICh2YWwpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoIXZhbCkgcmV0dXJuIDA7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbnVtID0gcGFyc2VGbG9hdCh2YWwpO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh2YWwuaW5jbHVkZXMoJ2VtJykpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ29udmVydCBlbSB0byBweCAoYXBwcm94aW1hdGU6IDFlbSA9IDE2cHgpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudW0gKiAxNjtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bTtcclxuICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgIGNvbnN0IG9mZnNldFggPSBwYXJzZU9mZnNldChwb3NpdGlvbi54IHx8ICcwJyk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBvZmZzZXRZID0gcGFyc2VPZmZzZXQocG9zaXRpb24ueSB8fCAnMCcpO1xyXG4gICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICBjb25zdCBzdHlsZXMgPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbGVmdDogYCR7cmVjdC5sZWZ0ICsgb2Zmc2V0WH1weGAsXHJcbiAgICAgICAgICAgICAgICAgICAgdG9wOiBgJHtyZWN0LnRvcCArIG9mZnNldFl9cHhgXHJcbiAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHN0eWxlcztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgaWYgKHR5cGUgPT09ICdhbmNob3JlZCcgJiYgcG9zaXRpb24uZWxlbWVudCkge1xyXG4gICAgICAgICAgICAgICAgLy8gQW5jaG9yZWQ6IHBvc2l0aW9uIHJlbGF0aXZlIHRvIGVsZW1lbnQgd2l0aCBwbGFjZW1lbnRcclxuICAgICAgICAgICAgICAgIGNvbnN0IHJlY3QgPSBwb3NpdGlvbi5lbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZ2FwID0gcG9zaXRpb24uZ2FwIHx8ICcxZW0nO1xyXG4gICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAvLyBQYXJzZSBnYXAgKGNhbiBiZSBweCwgZW0sIGV0Yy4pXHJcbiAgICAgICAgICAgICAgICBjb25zdCBwYXJzZUdhcCA9ICh2YWwpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBudW0gPSBwYXJzZUZsb2F0KHZhbCk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbC5pbmNsdWRlcygnZW0nKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVtICogMTY7IC8vIEFwcHJveGltYXRlOiAxZW0gPSAxNnB4XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudW07XHJcbiAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICBjb25zdCBnYXBQeCA9IHBhcnNlR2FwKGdhcCk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBzdHlsZXMgPSB7fTtcclxuICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgLy8gTm9ybWFsaXplIHBsYWNlbWVudCBzeW5vbnltcyAoYWJvdmUvYmVsb3cvYmVmb3JlL2FmdGVyKSB0byBDU1MgdmFsdWVzXHJcbiAgICAgICAgICAgICAgICBjb25zdCBwbGFjZW1lbnQgPSBub3JtYWxpemVQbGFjZW1lbnQocG9zaXRpb24ucGxhY2VtZW50KTtcclxuICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgc3dpdGNoIChwbGFjZW1lbnQpIHtcclxuICAgICAgICAgICAgICAgICAgICBjYXNlICd0b3AnOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBUb2FzdCBhYm92ZSBlbGVtZW50OiBib3R0b20gb2YgdG9hc3QgPSB0b3Agb2YgZWxlbWVudCAtIGdhcFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBib3R0b20gPSB2aWV3cG9ydCBoZWlnaHQgLSAoZWxlbWVudCB0b3AgLSBnYXApID0gdmlld3BvcnQgaGVpZ2h0IC0gZWxlbWVudCB0b3AgKyBnYXBcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGVzLmJvdHRvbSA9IGAke3dpbmRvdy5pbm5lckhlaWdodCAtIHJlY3QudG9wICsgZ2FwUHh9cHhgO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzdHlsZXMubGVmdCA9IGAke3JlY3QubGVmdH1weGA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ2JvdHRvbSc6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRvYXN0IGJlbG93IGVsZW1lbnQ6IHRvcCBvZiB0b2FzdCA9IGJvdHRvbSBvZiBlbGVtZW50ICsgZ2FwXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlcy50b3AgPSBgJHtyZWN0LmJvdHRvbSArIGdhcFB4fXB4YDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGVzLmxlZnQgPSBgJHtyZWN0LmxlZnR9cHhgO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICBjYXNlICdsZWZ0JzpcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVG9hc3QgdG8gdGhlIGxlZnQ6IHJpZ2h0IG9mIHRvYXN0ID0gbGVmdCBvZiBlbGVtZW50IC0gZ2FwXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlcy5yaWdodCA9IGAke3dpbmRvdy5pbm5lcldpZHRoIC0gcmVjdC5sZWZ0ICsgZ2FwUHh9cHhgO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzdHlsZXMudG9wID0gYCR7cmVjdC50b3B9cHhgO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICBjYXNlICdyaWdodCc6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRvYXN0IHRvIHRoZSByaWdodDogbGVmdCBvZiB0b2FzdCA9IHJpZ2h0IG9mIGVsZW1lbnQgKyBnYXBcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGVzLmxlZnQgPSBgJHtyZWN0LnJpZ2h0ICsgZ2FwUHh9cHhgO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzdHlsZXMudG9wID0gYCR7cmVjdC50b3B9cHhgO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHJldHVybiBzdHlsZXM7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgXHJcbiAgICAgICAgcmV0dXJuIHt9O1xyXG4gICAgfVxyXG59XHJcblxyXG4vKipcclxuICogQHBhcmFtIHtQYXJ0aWFsPFRvYXN0Q29uZmlnPj19IGNvbmZpZ1xyXG4gKiBAcmV0dXJucyB7VG9hc3RNYW5hZ2VyfVxyXG4gKi9cclxuZnVuY3Rpb24gY3JlYXRlVG9hc3RNYW5hZ2VyKGNvbmZpZykge1xyXG4gICAgcmV0dXJuIG5ldyBUb2FzdE1hbmFnZXIoY29uZmlnKTtcclxufVxyXG5cclxuLy8gSGlnaC1sZXZlbCBBUFgudG9hc3QgQVBJIChkZWZhdWx0ICYgbmFtZWQgbWFuYWdlcnMpXHJcbmxldCBfZGVmYXVsdE1hbmFnZXIgPSBudWxsO1xyXG5jb25zdCBfZ2V0RGVmYXVsdCA9ICgpID0+IHtcclxuICAgIGlmICghX2RlZmF1bHRNYW5hZ2VyKSBfZGVmYXVsdE1hbmFnZXIgPSBjcmVhdGVUb2FzdE1hbmFnZXIoKTtcclxuICAgIHJldHVybiBfZGVmYXVsdE1hbmFnZXI7XHJcbn07XHJcblxyXG4vKipcclxuICogVG9hc3QgQVBJIHN1cmZhY2UgdG8gYmUgYXR0YWNoZWQgYXMgQVBYLnRvYXN0LlxyXG4gKiBDYWxsYWJsZSBmb3JtIHByb3hpZXMgdG8gZGVmYXVsdE1hbmFnZXIuc2hvdyhvcHRzKTogQVBYLnRvYXN0KHsuLi59KVxyXG4gKi9cclxuZnVuY3Rpb24gdG9hc3Qob3B0cykge1xyXG4gICAgcmV0dXJuIF9nZXREZWZhdWx0KCkuc2hvdyhvcHRzKTtcclxufVxyXG5cclxuT2JqZWN0LmFzc2lnbih0b2FzdCwge1xyXG4gICAgLyoqXHJcbiAgICAgKiBDcmVhdGUgYSBtYW5hZ2VyLiBJZiBmaXJzdCBhcmcgaXMgc3RyaW5nLCByZWdpc3RlciBhcyBuYW1lZCB1bmRlciB0b2FzdC5jdXN0b21bbmFtZV1cclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfFBhcnRpYWw8VG9hc3RDb25maWc+fSBuYW1lT3JDb25maWdcclxuICAgICAqIEBwYXJhbSB7UGFydGlhbDxUb2FzdENvbmZpZz49fSBtYXliZUNvbmZpZ1xyXG4gICAgICogQHJldHVybnMge1RvYXN0TWFuYWdlcn1cclxuICAgICAqL1xyXG4gICAgY3JlYXRlOiAobmFtZU9yQ29uZmlnLCBtYXliZUNvbmZpZykgPT4ge1xyXG4gICAgICAgIGlmICh0eXBlb2YgbmFtZU9yQ29uZmlnID09PSAnc3RyaW5nJykge1xyXG4gICAgICAgICAgICBjb25zdCBuYW1lID0gbmFtZU9yQ29uZmlnO1xyXG4gICAgICAgICAgICBjb25zdCBtYW5hZ2VyID0gbmV3IFRvYXN0TWFuYWdlcih7IC4uLihtYXliZUNvbmZpZyB8fCB7fSkgfSk7XHJcbiAgICAgICAgICAgIGlmICghdG9hc3QuY3VzdG9tKSB0b2FzdC5jdXN0b20gPSB7fTtcclxuICAgICAgICAgICAgdG9hc3QuY3VzdG9tW25hbWVdID0gbWFuYWdlcjtcclxuICAgICAgICAgICAgcmV0dXJuIG1hbmFnZXI7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBuZXcgVG9hc3RNYW5hZ2VyKHsgLi4uKG5hbWVPckNvbmZpZyB8fCB7fSkgfSk7XHJcbiAgICB9LFxyXG4gICAgLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBUb2FzdE1hbmFnZXI+fSAqL1xyXG4gICAgY3VzdG9tOiB7fSxcclxuICAgIC8qKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAqL1xyXG4gICAgdXNlOiAobmFtZSkgPT4gKHRvYXN0LmN1c3RvbSAmJiB0b2FzdC5jdXN0b21bbmFtZV0pIHx8IG51bGwsXHJcbiAgICBNYW5hZ2VyOiBUb2FzdE1hbmFnZXIsXHJcbiAgICBzaG93OiAob3B0cykgPT4gX2dldERlZmF1bHQoKS5zaG93KG9wdHMpLFxyXG4gICAgaW5mbzogKG1lc3NhZ2UsIG9wdHMpID0+IF9nZXREZWZhdWx0KCkuaW5mbyhtZXNzYWdlLCBvcHRzKSxcclxuICAgIHN1Y2Nlc3M6IChtZXNzYWdlLCBvcHRzKSA9PiBfZ2V0RGVmYXVsdCgpLnN1Y2Nlc3MobWVzc2FnZSwgb3B0cyksXHJcbiAgICB3YXJuaW5nOiAobWVzc2FnZSwgb3B0cykgPT4gX2dldERlZmF1bHQoKS53YXJuaW5nKG1lc3NhZ2UsIG9wdHMpLFxyXG4gICAgZGFuZ2VyOiAobWVzc2FnZSwgb3B0cykgPT4gX2dldERlZmF1bHQoKS5kYW5nZXIobWVzc2FnZSwgb3B0cyksXHJcbiAgICBjb25maWd1cmU6IChjb25maWcpID0+IF9nZXREZWZhdWx0KCkuY29uZmlndXJlKGNvbmZpZyksXHJcbiAgICBzZXRBcmlhTGl2ZTogKG1vZGUpID0+IF9nZXREZWZhdWx0KCkuc2V0QXJpYUxpdmUobW9kZSksXHJcbiAgICBjbG9zZUFsbDogKHJlYXNvbikgPT4gX2dldERlZmF1bHQoKS5jbG9zZUFsbChyZWFzb24pLFxyXG4gICAgZ2V0T3BlblRvYXN0czogKCkgPT4gX2dldERlZmF1bHQoKS5nZXRPcGVuVG9hc3RzKClcclxufSk7XHJcblxyXG5leHBvcnQgZGVmYXVsdCB0b2FzdDtcclxuZXhwb3J0IHsgVG9hc3RNYW5hZ2VyLCBjcmVhdGVUb2FzdE1hbmFnZXIsIHRvYXN0IH07XHJcbiIsIi8vIEltcG9ydCBkZXMgZm9uY3Rpb25zIGV0IG1vZHVsZXMgZGVzIHNvdXMtbW9kdWxlc1xyXG5pbXBvcnQgYXVnbWVudFdpdGhQYWNrIGZyb20gJy4vZm9ybS1wYWNrZXIvYXVnbWVudC1hcHgubWpzJztcclxuaW1wb3J0IHsgcGFja0Zvcm1Ub0pTT04gfSBmcm9tICcuL2Zvcm0tcGFja2VyL3BhY2tUb0pzb24ubWpzJztcclxuXHJcbi8vIEV4cG9ydCBkZSBsYSBmb25jdGlvbiBkJ2F1Z21lbnRhdGlvblxyXG5leHBvcnQgeyBhdWdtZW50V2l0aFBhY2sgfTtcclxuXHJcbi8vIEV4cG9ydCBkZXMgZm9uY3Rpb25zIHV0aWxpdGFpcmVzXHJcbmV4cG9ydCB7IHBhY2tGb3JtVG9KU09OIH07XHJcblxyXG4vLyBFeHBvcnQgZCd1biBvYmpldCB0b29scyBwb3VyIGZhY2lsaXRlciBsJ3V0aWxpc2F0aW9uXHJcbmV4cG9ydCBjb25zdCB0b29scyA9IHtcclxuICAgIHBhY2tGb3JtVG9KU09OOiBwYWNrRm9ybVRvSlNPTlxyXG59O1xyXG5cclxuXHJcbiIsImltcG9ydCB7IHBhY2tGb3JtVG9KU09OIH0gZnJvbSAnLi9wYWNrVG9Kc29uLm1qcyc7XHJcblxyXG4vKipcclxuICogQWpvdXRlIGxhIG3DqXRob2RlIHBhY2soKSBhdXggb2JqZXRzIEFQWCBwb3VyIGNvbnZlcnRpciBsZXMgZm9ybXVsYWlyZXMgZW4gSlNPTlxyXG4gKiBAcGFyYW0ge09iamVjdH0gYXB4IC0gTCdvYmpldCBBUFggw6AgYXVnbWVudGVyXHJcbiAqIEByZXR1cm5zIHtPYmplY3R9IEwnb2JqZXQgQVBYIGF1Z21lbnTDqVxyXG4gKi9cclxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gKGFweCkge1xyXG4gICAgLyoqXHJcbiAgICAgKiBDb252ZXJ0aXQgbGUgcHJlbWllciBmb3JtdWxhaXJlIHPDqWxlY3Rpb25uw6kgZW4gb2JqZXQgSlNPTlxyXG4gICAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXSAtIE9wdGlvbnMgcGFzc8OpZXMgw6AgcGFja0Zvcm1Ub0pTT04gKGV4LiB7IG51bWVyaWNLZXlzQWx3YXlzQXJyYXk6IHRydWUgfSlcclxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IEwnb2JqZXQgSlNPTiByw6lzdWx0YW50XHJcbiAgICAgKiBAdGhyb3dzIHtFcnJvcn0gU2kgYXVjdW4gZm9ybXVsYWlyZSBuJ2VzdCB0cm91dsOpIG91IHNpIGxlIHByZW1pZXIgw6lsw6ltZW50IG4nZXN0IHBhcyB1biBmb3JtdWxhaXJlXHJcbiAgICAgKiBAZXhhbXBsZVxyXG4gICAgICogY29uc3QgZGF0YSA9IEFQWCgnZm9ybS5teWZvcm1jbGFzcycpLnBhY2soKTtcclxuICAgICAqIGNvbnN0IGRhdGFMZWdhY3kgPSBBUFgoJ2Zvcm0nKS5wYWNrKHsgbnVtZXJpY0tleXNBbHdheXNBcnJheTogdHJ1ZSB9KTtcclxuICAgICAqL1xyXG4gICAgYXB4LnBhY2sgPSBmdW5jdGlvbiAob3B0aW9ucykge1xyXG4gICAgICAgIGNvbnN0IGZpcnN0RWxlbWVudCA9IHRoaXMuZmlyc3QoKTtcclxuICAgICAgICBpZiAoIWZpcnN0RWxlbWVudCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIGVsZW1lbnQgZm91bmQnKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGZpcnN0RWxlbWVudC50YWdOYW1lICE9PSAnRk9STScpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdFbGVtZW50IGlzIG5vdCBhIGZvcm0nKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHBhY2tGb3JtVG9KU09OKGZpcnN0RWxlbWVudCwgb3B0aW9ucyk7XHJcbiAgICB9O1xyXG4gICAgXHJcbiAgICByZXR1cm4gYXB4O1xyXG59XHJcblxyXG5cclxuIiwiLyoqXHJcbiAqIENvbnZlcnRpdCB1biBmb3JtdWxhaXJlIEhUTUwgZW4gb2JqZXQgSlNPTlxyXG4gKiBAcGFyYW0ge0hUTUxGb3JtRWxlbWVudH0gZm9ybSAtIExlIGZvcm11bGFpcmUgw6AgY29udmVydGlyXHJcbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc10gLSBPcHRpb25zIGRlIGNvbnZlcnNpb25cclxuICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy5udW1lcmljS2V5c0Fsd2F5c0FycmF5PWZhbHNlXSAtIFNpIHRydWUsIHRvdXRlIGNsw6kgbnVtw6lyaXF1ZSBlc3QgdHJhaXTDqWUgY29tbWUgaW5kZXggZGUgdGFibGVhdSAoY29tcG9ydGVtZW50IGQnYXZhbnQgMi42LjIpLiBTaW5vbiwgaGV1cmlzdGlxdWUgOiB0YWJsZWF1IHNldWxlbWVudCBzaSBpbmRpY2VzIGRlbnNlcyAwLDEsMizigKYsbi5cclxuICogQHJldHVybnMge09iamVjdH0gTCdvYmpldCBKU09OIHLDqXN1bHRhbnRcclxuICogQHRocm93cyB7VHlwZUVycm9yfSBTaSBmb3JtIG4nZXN0IHBhcyB1biBIVE1MRm9ybUVsZW1lbnRcclxuICovXHJcbmV4cG9ydCBjb25zdCBwYWNrRm9ybVRvSlNPTiA9IChmb3JtLCBvcHRpb25zID0ge30pID0+IHtcclxuICAgIC8vIFZhbGlkYXRpb24gZGUgbCdlbnRyw6llXHJcbiAgICBpZiAoIWZvcm0gfHwgIShmb3JtIGluc3RhbmNlb2YgSFRNTEZvcm1FbGVtZW50KSkge1xyXG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ3BhY2tGb3JtVG9KU09OIGV4cGVjdHMgYW4gSFRNTEZvcm1FbGVtZW50Jyk7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgbnVtZXJpY0tleXNBbHdheXNBcnJheSA9IG9wdGlvbnMubnVtZXJpY0tleXNBbHdheXNBcnJheSA9PT0gdHJ1ZTtcclxuXHJcbiAgICBjb25zdCBmb3JtRGF0YSA9IG5ldyBGb3JtRGF0YShmb3JtKTtcclxuICAgIGNvbnN0IGpzb25EYXRhID0ge307XHJcbiAgICBcclxuICAgIC8qKlxyXG4gICAgICogQ29uc3RydWl0IHVuZSByZXByw6lzZW50YXRpb24gc3RyaW5nIGR1IGNoZW1pbiBwb3VyIGxlcyBtZXNzYWdlcyBkJ2VycmV1clxyXG4gICAgICogQHBhcmFtIHtBcnJheX0gcGFydHMgLSBMZXMgcGFydGllcyBkdSBjaGVtaW5cclxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IExlIGNoZW1pbiBmb3JtYXTDqVxyXG4gICAgICovXHJcbiAgICBjb25zdCBidWlsZFBhdGhTdHJpbmcgPSAocGFydHMpID0+IHtcclxuICAgICAgICByZXR1cm4gcGFydHMucmVkdWNlKChwYXRoLCBwYXJ0KSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChwYXJ0LnR5cGUgPT09ICdrZXknKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gcGF0aCA/IGAke3BhdGh9WyR7cGFydC5uYW1lfV1gIDogcGFydC5uYW1lO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChwYXJ0LnR5cGUgPT09ICdudW1lcmljJykge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGAke3BhdGh9WyR7cGFydC5pbmRleH1dYDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAocGFydC50eXBlID09PSAnYXJyYXknKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gYCR7cGF0aH1bXWA7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIHBhdGg7XHJcbiAgICAgICAgfSwgJycpO1xyXG4gICAgfTtcclxuICAgIFxyXG4gICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxyXG4gICAgLy8gUEhBU0UgMSA6IEFOQUxZU0UgRVQgRMOJVEVDVElPTiBERVMgQ09ORkxJVFNcclxuICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cclxuICAgIFxyXG4gICAgLyoqXHJcbiAgICAgKiBTdHJ1Y3R1cmUgcG91ciBzdG9ja2VyIGwndXRpbGlzYXRpb24gZCd1biBjaGVtaW5cclxuICAgICAqIEB0eXBlZGVmIHtPYmplY3R9IFBhdGhVc2FnZVxyXG4gICAgICogQHByb3BlcnR5IHtib29sZWFufSBpc0ZpbmFsIC0gTGUgY2hlbWluIGVzdCB1dGlsaXPDqSBjb21tZSB2YWxldXIgZmluYWxlXHJcbiAgICAgKiBAcHJvcGVydHkge2Jvb2xlYW59IGlzSW50ZXJtZWRpYXRlIC0gTGUgY2hlbWluIGVzdCB1dGlsaXPDqSBjb21tZSBjaGVtaW4gaW50ZXJtw6lkaWFpcmVcclxuICAgICAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gaGFzQXJyYXlTdWZmaXggLSBMZSBjaGVtaW4gc2UgdGVybWluZSBwYXIgW10gKGNyw6llIGRlcyB2YWxldXJzIHByaW1pdGl2ZXMpXHJcbiAgICAgKiBAcHJvcGVydHkge3N0cmluZ30ga2V5IC0gTGEgY2zDqSBkdSBmb3JtdWxhaXJlIHF1aSB1dGlsaXNlIGNlIGNoZW1pblxyXG4gICAgICovXHJcbiAgICBcclxuICAgIGNvbnN0IHBhdGhVc2FnZSA9IG5ldyBNYXAoKTsgLy8gTWFwPHBhdGhTdHJpbmcsIFBhdGhVc2FnZT5cclxuICAgIGNvbnN0IGtleUFuYWx5c2lzID0gbmV3IE1hcCgpOyAvLyBNYXA8YmFzZVBhdGgsIHtoYXNOdW1lcmljOiBib29sZWFuLCBoYXNTdHJpbmc6IGJvb2xlYW59PlxyXG4gICAgY29uc3QgbnVtZXJpY0luZGljZXNCeVBhdGggPSBuZXcgTWFwKCk7IC8vIE1hcDxwYXRoU3RyaW5nLCBTZXQ8bnVtYmVyPj4g4oCUIGluZGljZXMgdW5kZXIgZWFjaCBwYXJlbnQgcGF0aFxyXG4gICAgY29uc3QgYWxsRW50cmllcyA9IFtdO1xyXG4gICAgXHJcbiAgICAvKipcclxuICAgICAqIEVucmVnaXN0cmUgbCd1dGlsaXNhdGlvbiBkJ3VuIGNoZW1pbiBkYW5zIHBhdGhVc2FnZVxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGN1cnJlbnRQYXRoIC0gTGUgY2hlbWluIMOgIGVucmVnaXN0cmVyXHJcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGlzRmluYWwgLSBTaSBjJ2VzdCB1bmUgdmFsZXVyIGZpbmFsZVxyXG4gICAgICogQHBhcmFtIHtib29sZWFufSBpc0FycmF5U3VmZml4IC0gU2kgbGUgY2hlbWluIHNlIHRlcm1pbmUgcGFyIFtdXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IC0gTGEgY2zDqSBkdSBmb3JtdWxhaXJlXHJcbiAgICAgKi9cclxuICAgIGNvbnN0IHJlY29yZFBhdGhVc2FnZSA9IChjdXJyZW50UGF0aCwgaXNGaW5hbCwgaXNBcnJheVN1ZmZpeCwga2V5KSA9PiB7XHJcbiAgICAgICAgY29uc3QgdXNhZ2UgPSBwYXRoVXNhZ2UuZ2V0KGN1cnJlbnRQYXRoKSA/PyB7XHJcbiAgICAgICAgICAgIGlzRmluYWw6IGZhbHNlLFxyXG4gICAgICAgICAgICBpc0ludGVybWVkaWF0ZTogZmFsc2UsXHJcbiAgICAgICAgICAgIGhhc0FycmF5U3VmZml4OiBmYWxzZSxcclxuICAgICAgICAgICAga2V5XHJcbiAgICAgICAgfTtcclxuICAgICAgICBcclxuICAgICAgICBpZiAoIXBhdGhVc2FnZS5oYXMoY3VycmVudFBhdGgpKSB7XHJcbiAgICAgICAgICAgIHBhdGhVc2FnZS5zZXQoY3VycmVudFBhdGgsIHVzYWdlKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgXHJcbiAgICAgICAgaWYgKGlzRmluYWwpIHtcclxuICAgICAgICAgICAgdXNhZ2UuaXNGaW5hbCA9IHRydWU7XHJcbiAgICAgICAgICAgIHVzYWdlLmtleSA9IGtleTtcclxuICAgICAgICAgICAgaWYgKGlzQXJyYXlTdWZmaXgpIHtcclxuICAgICAgICAgICAgICAgIHVzYWdlLmhhc0FycmF5U3VmZml4ID0gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHVzYWdlLmlzSW50ZXJtZWRpYXRlID0gdHJ1ZTtcclxuICAgICAgICAgICAgdXNhZ2Uua2V5ID8/PSBrZXk7XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuICAgIFxyXG4gICAgLy8gUHJlbWnDqHJlIHBhc3NlIDogYW5hbHlzZXIgdG91dGVzIGxlcyBjbMOpcyBldCBlbnJlZ2lzdHJlciBsZXMgY2hlbWluc1xyXG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgZm9ybURhdGEuZW50cmllcygpKSB7XHJcbiAgICAgICAgaWYgKCFrZXkpIGNvbnRpbnVlO1xyXG4gICAgICAgIFxyXG4gICAgICAgIGFsbEVudHJpZXMucHVzaCh7IGtleSwgdmFsdWUgfSk7XHJcbiAgICAgICAgY29uc3QgcGFydHMgPSBwYXJzZUtleShrZXkpO1xyXG4gICAgICAgIFxyXG4gICAgICAgIC8vIENvbnN0cnVpcmUgdG91cyBsZXMgY2hlbWlucyBpbnRlcm3DqWRpYWlyZXMgZXQgbGUgY2hlbWluIGZpbmFsXHJcbiAgICAgICAgbGV0IGN1cnJlbnRQYXRoID0gJyc7XHJcbiAgICAgICAgXHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYXJ0cy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBjb25zdCBwYXJ0ID0gcGFydHNbaV07XHJcbiAgICAgICAgICAgIGNvbnN0IGlzTGFzdCA9IGkgPT09IHBhcnRzLmxlbmd0aCAtIDE7XHJcbiAgICAgICAgICAgIGNvbnN0IGlzQXJyYXlTdWZmaXggPSBwYXJ0LnR5cGUgPT09ICdhcnJheSc7XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAvLyBDb25zdHJ1aXJlIGxlIGNoZW1pbiBqdXNxdSfDoCBjZSBuaXZlYXVcclxuICAgICAgICAgICAgaWYgKHBhcnQudHlwZSA9PT0gJ2tleScpIHtcclxuICAgICAgICAgICAgICAgIGN1cnJlbnRQYXRoID0gY3VycmVudFBhdGggPyBgJHtjdXJyZW50UGF0aH1bJHtwYXJ0Lm5hbWV9XWAgOiBwYXJ0Lm5hbWU7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAocGFydC50eXBlID09PSAnbnVtZXJpYycpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHBhcmVudFBhdGggPSBjdXJyZW50UGF0aDtcclxuICAgICAgICAgICAgICAgIGxldCBzZXQgPSBudW1lcmljSW5kaWNlc0J5UGF0aC5nZXQocGFyZW50UGF0aCk7XHJcbiAgICAgICAgICAgICAgICBpZiAoIXNldCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHNldCA9IG5ldyBTZXQoKTtcclxuICAgICAgICAgICAgICAgICAgICBudW1lcmljSW5kaWNlc0J5UGF0aC5zZXQocGFyZW50UGF0aCwgc2V0KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHNldC5hZGQocGFydC5pbmRleCk7XHJcbiAgICAgICAgICAgICAgICBjdXJyZW50UGF0aCA9IGAke2N1cnJlbnRQYXRofVske3BhcnQuaW5kZXh9XWA7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAocGFydC50eXBlID09PSAnYXJyYXknKSB7XHJcbiAgICAgICAgICAgICAgICBjdXJyZW50UGF0aCA9IGAke2N1cnJlbnRQYXRofVtdYDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgLy8gRW5yZWdpc3RyZXIgbCd1dGlsaXNhdGlvbiBkdSBjaGVtaW5cclxuICAgICAgICAgICAgcmVjb3JkUGF0aFVzYWdlKGN1cnJlbnRQYXRoLCBpc0xhc3QsIGlzQXJyYXlTdWZmaXggJiYgaXNMYXN0LCBrZXkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBcclxuICAgICAgICAvLyBBbmFseXNlciBjaGFxdWUgbml2ZWF1IGRlIGxhIGhpw6lyYXJjaGllIHBvdXIgZMOpdGVjdGVyIGxlcyBjb25mbGl0cyAoaW5kaWNlcyBudW3DqXJpcXVlcyB2cyBjbMOpcyBkZSBjaGHDrm5lKVxyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGFydHMubGVuZ3RoIC0gMTsgaSsrKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHBhcnQgPSBwYXJ0c1tpXTtcclxuICAgICAgICAgICAgY29uc3QgbmV4dFBhcnQgPSBwYXJ0c1tpICsgMV07XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAvLyBBbmFseXNlciBzZXVsZW1lbnQgbGVzIGNsw6lzIChwYXMgbGVzIGluZGljZXMgbnVtw6lyaXF1ZXMpXHJcbiAgICAgICAgICAgIGlmIChwYXJ0LnR5cGUgPT09ICdrZXknKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBiYXNlUGF0aCA9IHBhcnQubmFtZTsgLy8gTGUgbm9tIGRlIGxhIHByZW1pw6hyZSBjbMOpIGRhbnMgbGUgY2hlbWluXHJcbiAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgIGNvbnN0IGFuYWx5c2lzID0ga2V5QW5hbHlzaXMuZ2V0KGJhc2VQYXRoKSA/PyB7IGhhc051bWVyaWM6IGZhbHNlLCBoYXNTdHJpbmc6IGZhbHNlIH07XHJcbiAgICAgICAgICAgICAgICBpZiAoIWtleUFuYWx5c2lzLmhhcyhiYXNlUGF0aCkpIHtcclxuICAgICAgICAgICAgICAgICAgICBrZXlBbmFseXNpcy5zZXQoYmFzZVBhdGgsIGFuYWx5c2lzKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgaWYgKG5leHRQYXJ0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKG5leHRQYXJ0LnR5cGUgPT09ICdudW1lcmljJykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBhbmFseXNpcy5oYXNOdW1lcmljID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG5leHRQYXJ0LnR5cGUgPT09ICdrZXknIHx8IG5leHRQYXJ0LnR5cGUgPT09ICdhcnJheScpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYW5hbHlzaXMuaGFzU3RyaW5nID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBcclxuICAgIC8qKlxyXG4gICAgICogRMOpdGVjdGUgZXQgbMOodmUgdW5lIGV4Y2VwdGlvbiBwb3VyIHRvdXMgbGVzIGNvbmZsaXRzIGRlIGNoZW1pbnNcclxuICAgICAqIFxyXG4gICAgICogUHJpbmNpcGUgc2ltcGxlIDogcG91ciBjaGFxdWUgY2hlbWluIGZpbmFsICh2YWxldXIgcHJpbWl0aXZlKSwgdsOpcmlmaWVyIHNpIHVuIGNoZW1pblxyXG4gICAgICogaW50ZXJtw6lkaWFpcmUgY29tbWVuY2UgcGFyIGNlIGNoZW1pbiBzdWl2aSBkZSAnWycuIFNpIGMnZXN0IGxlIGNhcywgYydlc3QgdW4gY29uZmxpdC5cclxuICAgICAqIFxyXG4gICAgICogQ2V0dGUgYXBwcm9jaGUgdW5pZmnDqWUgY291dnJlIHRvdXMgbGVzIGNhcyA6XHJcbiAgICAgKiAtIGl0ZW1zW10gKGZpbmFsKSB2cyBpdGVtc1swXVtuYW1lXSAoaW50ZXJtw6lkaWFpcmUpXHJcbiAgICAgKiAtIGFycmF5WzNdIChmaW5hbCkgdnMgYXJyYXlbM11bbmVzdGVkXSAoaW50ZXJtw6lkaWFpcmUpXHJcbiAgICAgKiAtIGRhdGFba2V5XSAoZmluYWwpIHZzIGRhdGFba2V5XVtzdWJdIChpbnRlcm3DqWRpYWlyZSlcclxuICAgICAqL1xyXG4gICAgY29uc3QgZGV0ZWN0UGF0aENvbmZsaWN0cyA9ICgpID0+IHtcclxuICAgICAgICAvLyAxLiBDb2xsZWN0ZXIgdG91cyBsZXMgY2hlbWlucyBmaW5hdXggKHZhbGV1cnMgcHJpbWl0aXZlcylcclxuICAgICAgICBjb25zdCBmaW5hbFBhdGhzID0gbmV3IFNldCgpO1xyXG4gICAgICAgIGNvbnN0IGZpbmFsUGF0aEtleXMgPSBuZXcgTWFwKCk7IC8vIFBvdXIgbGVzIG1lc3NhZ2VzIGQnZXJyZXVyXHJcbiAgICAgICAgXHJcbiAgICAgICAgZm9yIChjb25zdCBbcGF0aCwgdXNhZ2VdIG9mIHBhdGhVc2FnZS5lbnRyaWVzKCkpIHtcclxuICAgICAgICAgICAgaWYgKHVzYWdlLmlzRmluYWwpIHtcclxuICAgICAgICAgICAgICAgIGZpbmFsUGF0aHMuYWRkKHBhdGgpO1xyXG4gICAgICAgICAgICAgICAgZmluYWxQYXRoS2V5cy5zZXQocGF0aCwgdXNhZ2Uua2V5KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBcclxuICAgICAgICAvLyAyLiBQb3VyIGNoYXF1ZSBjaGVtaW4gaW50ZXJtw6lkaWFpcmUsIHbDqXJpZmllciBzJ2lsIGNvbW1lbmNlIHBhciB1biBjaGVtaW4gZmluYWxcclxuICAgICAgICBmb3IgKGNvbnN0IFtwYXRoLCB1c2FnZV0gb2YgcGF0aFVzYWdlLmVudHJpZXMoKSkge1xyXG4gICAgICAgICAgICBpZiAodXNhZ2UuaXNJbnRlcm1lZGlhdGUpIHtcclxuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgZmluYWxQYXRoIG9mIGZpbmFsUGF0aHMpIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyBWw6lyaWZpZXIgc2kgY2UgY2hlbWluIGludGVybcOpZGlhaXJlIGNvbW1lbmNlIHBhciB1biBjaGVtaW4gZmluYWwgc3VpdmkgZGUgJ1snXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gRXhlbXBsZTogZmluYWxQYXRoID0gXCJhcnJheVszXVwiLCBwYXRoID0gXCJhcnJheVszXVtuZXN0ZWRdXCIg4oaSIGNvbmZsaXRcclxuICAgICAgICAgICAgICAgICAgICBpZiAocGF0aC5zdGFydHNXaXRoKGAke2ZpbmFsUGF0aH1bYCkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYFBhdGggY29uZmxpY3Q6IFwiJHtmaW5hbFBhdGh9XCIgaXMgdXNlZCBhcyBhIGZpbmFsIHZhbHVlIChpbiBmaWVsZCBcIiR7ZmluYWxQYXRoS2V5cy5nZXQoZmluYWxQYXRoKX1cIiksIGAgK1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYGJ1dCBcIiR7cGF0aH1cIiB0cmllcyB0byB1c2UgaXQgYXMgYW4gaW50ZXJtZWRpYXRlIHBhdGggKGluIGZpZWxkIFwiJHt1c2FnZS5rZXl9XCIpLiBgICtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBUaGlzIGNyZWF0ZXMgaW5jb21wYXRpYmxlIGRhdGEgc3RydWN0dXJlcy4gYCArXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBgWW91IGNhbm5vdCB1c2UgXCIke2ZpbmFsUGF0aH1cIiBhcyBhIHByaW1pdGl2ZSB2YWx1ZSBhbmQgdGhlbiBhY2Nlc3MgaXQgYXMgYW4gb2JqZWN0LmBcclxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9O1xyXG4gICAgXHJcbiAgICAvLyBFeMOpY3V0ZXIgbGEgZMOpdGVjdGlvbiBkZXMgY29uZmxpdHNcclxuICAgIGRldGVjdFBhdGhDb25mbGljdHMoKTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFbDqXJpZmllIHNpIHVuIGNoZW1pbiBkZSBiYXNlIGEgdW4gY29uZmxpdCAoaW5kaWNlcyBudW3DqXJpcXVlcyBFVCBjbMOpcyBkZSBjaGHDrm5lKVxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGJhc2VQYXRoIC0gTGUgY2hlbWluIGRlIGJhc2Ugw6AgdsOpcmlmaWVyXHJcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cclxuICAgICAqL1xyXG4gICAgY29uc3QgaGFzQ29uZmxpY3QgPSAoYmFzZVBhdGgpID0+IHtcclxuICAgICAgICBpZiAoIWJhc2VQYXRoKSByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgY29uc3QgYW5hbHlzaXMgPSBrZXlBbmFseXNpcy5nZXQoYmFzZVBhdGgpO1xyXG4gICAgICAgIHJldHVybiBhbmFseXNpcz8uaGFzTnVtZXJpYyAmJiBhbmFseXNpcz8uaGFzU3RyaW5nO1xyXG4gICAgfTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRydWUgaWYgaW5kaWNlcyBhcmUgZXhhY3RseSAwLCAxLCAyLCAuLi4sIG4gKGRlbnNlLCBzZXF1ZW50aWFsIGZyb20gMCkuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcltdfSBpbmRpY2VzIC0gU29ydGVkIGFycmF5IG9mIGluZGljZXNcclxuICAgICAqIEByZXR1cm5zIHtib29sZWFufVxyXG4gICAgICovXHJcbiAgICBjb25zdCBpc0RlbnNlU2VxdWVudGlhbCA9IChpbmRpY2VzKSA9PiB7XHJcbiAgICAgICAgaWYgKGluZGljZXMubGVuZ3RoID09PSAwKSByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgY29uc3Qgc29ydGVkID0gWy4uLmluZGljZXNdLnNvcnQoKGEsIGIpID0+IGEgLSBiKTtcclxuICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IHNvcnRlZC5sZW5ndGg7IGorKykge1xyXG4gICAgICAgICAgICBpZiAoc29ydGVkW2pdICE9PSBqKSByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRydWUgaWYgbnVtZXJpYyBrZXlzIHVuZGVyIHRoaXMgcGF0aCBzaG91bGQgYmUgdHJlYXRlZCBhcyBhcnJheSBpbmRpY2VzLlxyXG4gICAgICogV2l0aCBudW1lcmljS2V5c0Fsd2F5c0FycmF5OiBhbHdheXMgdHJ1ZSB3aGVuIHBhdGggaGFzIG51bWVyaWMgY2hpbGRyZW4uXHJcbiAgICAgKiBPdGhlcndpc2U6IHRydWUgb25seSB3aGVuIGluZGljZXMgYXJlIGRlbnNlIDAuLm4uXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gcGFyZW50UGF0aCAtIFBhdGggdG8gdGhlIGNvbnRhaW5lciB0aGF0IGhhcyBudW1lcmljIGNoaWxkcmVuXHJcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cclxuICAgICAqL1xyXG4gICAgY29uc3QgdXNlQXJyYXlGb3JOdW1lcmljUGF0aCA9IChwYXJlbnRQYXRoKSA9PiB7XHJcbiAgICAgICAgY29uc3Qgc2V0ID0gbnVtZXJpY0luZGljZXNCeVBhdGguZ2V0KHBhcmVudFBhdGgpO1xyXG4gICAgICAgIGlmICghc2V0IHx8IHNldC5zaXplID09PSAwKSByZXR1cm4gdHJ1ZTtcclxuICAgICAgICBpZiAobnVtZXJpY0tleXNBbHdheXNBcnJheSkgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgcmV0dXJuIGlzRGVuc2VTZXF1ZW50aWFsKFsuLi5zZXRdKTtcclxuICAgIH07XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDb252ZXJ0aXQgdW4gdGFibGVhdSBlbiBvYmpldCBlbiBwcsOpc2VydmFudCBsZXMgaW5kaWNlcyBudW3DqXJpcXVlcyBjb21tZSBwcm9wcmnDqXTDqXNcclxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFyciAtIExlIHRhYmxlYXUgw6AgY29udmVydGlyXHJcbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBMJ29iamV0IHLDqXN1bHRhbnRcclxuICAgICAqL1xyXG4gICAgY29uc3QgYXJyYXlUb09iamVjdCA9IChhcnIpID0+IHtcclxuICAgICAgICBjb25zdCBvYmogPSB7fTtcclxuICAgICAgICAvLyBDb3BpZXIgbGVzIGluZGljZXMgbnVtw6lyaXF1ZXNcclxuICAgICAgICBmb3IgKGxldCBpZHggPSAwOyBpZHggPCBhcnIubGVuZ3RoOyBpZHgrKykge1xyXG4gICAgICAgICAgICBvYmpbaWR4XSA9IGFycltpZHhdO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBDb3BpZXIgbGVzIHByb3ByacOpdMOpcyBub24tbnVtw6lyaXF1ZXNcclxuICAgICAgICBmb3IgKGNvbnN0IFtrLCB2XSBvZiBPYmplY3QuZW50cmllcyhhcnIpKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IG51bUtleSA9IE51bWJlci5wYXJzZUludChrLCAxMCk7XHJcbiAgICAgICAgICAgIGlmIChOdW1iZXIuaXNOYU4obnVtS2V5KSB8fCBrICE9PSBTdHJpbmcobnVtS2V5KSkge1xyXG4gICAgICAgICAgICAgICAgb2JqW2tdID0gdjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gb2JqO1xyXG4gICAgfTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIENvbnZlcnRpdCB1biBvYmpldCBlbiB0YWJsZWF1IGVuIHByw6lzZXJ2YW50IGxlcyBpbmRpY2VzIG51bcOpcmlxdWVzXHJcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqIC0gTCdvYmpldCDDoCBjb252ZXJ0aXJcclxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gTGUgdGFibGVhdSByw6lzdWx0YW50XHJcbiAgICAgKi9cclxuICAgIGNvbnN0IG9iamVjdFRvQXJyYXkgPSAob2JqKSA9PiB7XHJcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkob2JqKSkgcmV0dXJuIG9iajtcclxuICAgICAgICBjb25zdCBhcnIgPSBbXTtcclxuICAgICAgICBpZiAodHlwZW9mIG9iaiA9PT0gJ29iamVjdCcgJiYgb2JqICE9PSBudWxsKSB7XHJcbiAgICAgICAgICAgIGZvciAoY29uc3QgW2ssIHZdIG9mIE9iamVjdC5lbnRyaWVzKG9iaikpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IG51bUtleSA9IE51bWJlci5wYXJzZUludChrLCAxMCk7XHJcbiAgICAgICAgICAgICAgICBpZiAoIU51bWJlci5pc05hTihudW1LZXkpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgYXJyW251bUtleV0gPSB2O1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBhcnI7XHJcbiAgICB9O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQXNzdXJlIHF1J3VuIGNvbnRlbmV1ciBlc3QgdW4gb2JqZXQsIGVuIGNvbnZlcnRpc3NhbnQgc2kgbsOpY2Vzc2FpcmVcclxuICAgICAqIEBwYXJhbSB7Kn0gY29udGFpbmVyIC0gTGUgY29udGVuZXVyIMOgIHbDqXJpZmllclxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd8bnVsbH0ga2V5IC0gTGEgY2zDqSBkYW5zIGxlIGNvbnRlbmV1ciBwYXJlbnRcclxuICAgICAqIEBwYXJhbSB7T2JqZWN0fG51bGx9IHBhcmVudCAtIExlIGNvbnRlbmV1ciBwYXJlbnRcclxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gZm9yY2VPYmplY3QgLSBGb3JjZXIgbGEgY29udmVyc2lvbiBlbiBvYmpldCBtw6ptZSBzJ2lsIG4neSBhIHBhcyBkZSBjb25mbGl0XHJcbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBMZSBjb250ZW5ldXIgKGNvbnZlcnRpIGVuIG9iamV0IHNpIG7DqWNlc3NhaXJlKVxyXG4gICAgICovXHJcbiAgICBjb25zdCBlbnN1cmVPYmplY3QgPSAoY29udGFpbmVyLCBrZXksIHBhcmVudCwgZm9yY2VPYmplY3QgPSBmYWxzZSkgPT4ge1xyXG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KGNvbnRhaW5lcikpIHtcclxuICAgICAgICAgICAgY29uc3Qgb2JqID0gYXJyYXlUb09iamVjdChjb250YWluZXIpO1xyXG4gICAgICAgICAgICBpZiAocGFyZW50ICYmIGtleSAhPT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgcGFyZW50W2tleV0gPSBvYmo7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIG9iajtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHR5cGVvZiBjb250YWluZXIgIT09ICdvYmplY3QnIHx8IGNvbnRhaW5lciA9PT0gbnVsbCkge1xyXG4gICAgICAgICAgICBjb25zdCBvYmogPSB7fTtcclxuICAgICAgICAgICAgaWYgKHBhcmVudCAmJiBrZXkgIT09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIHBhcmVudFtrZXldID0gb2JqO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiBvYmo7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBjb250YWluZXI7XHJcbiAgICB9O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQXNzdXJlIHF1J3VuIGNvbnRlbmV1ciBlc3QgdW4gdGFibGVhdSwgZW4gY29udmVydGlzc2FudCBzaSBuw6ljZXNzYWlyZVxyXG4gICAgICogQHBhcmFtIHsqfSBjb250YWluZXIgLSBMZSBjb250ZW5ldXIgw6AgdsOpcmlmaWVyXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ3xudWxsfSBrZXkgLSBMYSBjbMOpIGRhbnMgbGUgY29udGVuZXVyIHBhcmVudFxyXG4gICAgICogQHBhcmFtIHtPYmplY3R8bnVsbH0gcGFyZW50IC0gTGUgY29udGVuZXVyIHBhcmVudFxyXG4gICAgICogQHJldHVybnMge0FycmF5fSBMZSBjb250ZW5ldXIgKGNvbnZlcnRpIGVuIHRhYmxlYXUgc2kgbsOpY2Vzc2FpcmUpXHJcbiAgICAgKi9cclxuICAgIGNvbnN0IGVuc3VyZUFycmF5ID0gKGNvbnRhaW5lciwga2V5LCBwYXJlbnQpID0+IHtcclxuICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkoY29udGFpbmVyKSkge1xyXG4gICAgICAgICAgICBjb25zdCBhcnIgPSBvYmplY3RUb0FycmF5KGNvbnRhaW5lcik7XHJcbiAgICAgICAgICAgIGlmIChwYXJlbnQgJiYga2V5ICE9PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICBwYXJlbnRba2V5XSA9IGFycjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gYXJyO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gY29udGFpbmVyO1xyXG4gICAgfTtcclxuXHJcbiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XHJcbiAgICAvLyBQSEFTRSAyIDogVFJBSVRFTUVOVCBERVMgVkFMRVVSU1xyXG4gICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxyXG4gICAgXHJcbiAgICAvKipcclxuICAgICAqIFRyYWl0ZSB1bmUgdmFsZXVyIGZpbmFsZSAoZGVybmnDqHJlIHBhcnRpZSBkdSBjaGVtaW4pXHJcbiAgICAgKiBAcGFyYW0geyp9IGNvbnRhaW5lciAtIExlIGNvbnRlbmV1ciBhY3R1ZWxcclxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBwYXJ0IC0gTGEgcGFydGllIMOgIHRyYWl0ZXJcclxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgLSBMYSB2YWxldXIgw6AgYXNzaWduZXJcclxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBwYXJlbnQgLSBMZSBjb250ZW5ldXIgcGFyZW50XHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gYmFzZVBhdGggLSBMZSBjaGVtaW4gZGUgYmFzZSBwb3VyIGxhIGTDqXRlY3Rpb24gZGUgY29uZmxpdFxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHBhcmVudFBhdGggLSBDaGVtaW4gZHUgY29udGVuZXVyIGFjdHVlbCAocG91ciBoZXVyaXN0aXF1ZSBudW1lcmljKVxyXG4gICAgICovXHJcbiAgICBjb25zdCBwcm9jZXNzRmluYWxWYWx1ZSA9IChjb250YWluZXIsIHBhcnQsIHZhbHVlLCBwYXJlbnQsIGJhc2VQYXRoLCBwYXJlbnRQYXRoKSA9PiB7XHJcbiAgICAgICAgaWYgKHBhcnQudHlwZSA9PT0gJ2FycmF5Jykge1xyXG4gICAgICAgICAgICAvLyBUYWJsZWF1IGV4cGxpY2l0ZSBhdmVjIFtdXHJcbiAgICAgICAgICAgIGNvbnRhaW5lcltwYXJ0Lm5hbWVdID8/PSBbXTtcclxuICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoY29udGFpbmVyW3BhcnQubmFtZV0pKSB7XHJcbiAgICAgICAgICAgICAgICBjb250YWluZXJbcGFydC5uYW1lXS5wdXNoKHZhbHVlKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGNvbnRhaW5lcltwYXJ0Lm5hbWVdID0gW2NvbnRhaW5lcltwYXJ0Lm5hbWVdLCB2YWx1ZV07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2UgaWYgKHBhcnQudHlwZSA9PT0gJ251bWVyaWMnKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHsgaW5kZXggfSA9IHBhcnQ7XHJcbiAgICAgICAgICAgIGNvbnN0IHVzZUFycmF5ID0gdXNlQXJyYXlGb3JOdW1lcmljUGF0aChwYXJlbnRQYXRoKTtcclxuICAgICAgICAgICAgaWYgKHVzZUFycmF5KSB7XHJcbiAgICAgICAgICAgICAgICBjb250YWluZXIgPSBlbnN1cmVBcnJheShjb250YWluZXIsIHBhcmVudC5rZXksIHBhcmVudC5jb250YWluZXIpO1xyXG4gICAgICAgICAgICAgICAgd2hpbGUgKGNvbnRhaW5lci5sZW5ndGggPD0gaW5kZXgpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb250YWluZXIucHVzaCh1bmRlZmluZWQpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgY29udGFpbmVyW2luZGV4XSA9IHZhbHVlO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgY29udGFpbmVyID0gZW5zdXJlT2JqZWN0KGNvbnRhaW5lciwgcGFyZW50LmtleSwgcGFyZW50LmNvbnRhaW5lciwgdHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICBjb250YWluZXJbaW5kZXhdID0gdmFsdWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAvLyBDbMOpIHNpbXBsZSBmaW5hbGVcclxuICAgICAgICAgICAgY29uc3QgY29uZmxpY3QgPSBoYXNDb25mbGljdChiYXNlUGF0aCk7XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICBpZiAoY29uZmxpY3QpIHtcclxuICAgICAgICAgICAgICAgIGNvbnRhaW5lciA9IGVuc3VyZU9iamVjdChjb250YWluZXIsIHBhcmVudC5rZXksIHBhcmVudC5jb250YWluZXIsIHRydWUpO1xyXG4gICAgICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoY29udGFpbmVyW3BhcnQubmFtZV0pKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyW3BhcnQubmFtZV0gPSBhcnJheVRvT2JqZWN0KGNvbnRhaW5lcltwYXJ0Lm5hbWVdKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmIChjb250YWluZXJbcGFydC5uYW1lXSAhPT0gdW5kZWZpbmVkICYmIFxyXG4gICAgICAgICAgICAgICAgICAgICh0eXBlb2YgY29udGFpbmVyW3BhcnQubmFtZV0gIT09ICdvYmplY3QnIHx8IGNvbnRhaW5lcltwYXJ0Lm5hbWVdID09PSBudWxsKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lcltwYXJ0Lm5hbWVdID0gdmFsdWU7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNvbnRhaW5lcltwYXJ0Lm5hbWVdID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb250YWluZXJbcGFydC5uYW1lXSA9IHZhbHVlO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KGNvbnRhaW5lcltwYXJ0Lm5hbWVdKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lcltwYXJ0Lm5hbWVdLnB1c2godmFsdWUpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBjb250YWluZXJbcGFydC5uYW1lXSA9IFtjb250YWluZXJbcGFydC5uYW1lXSwgdmFsdWVdO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgaWYgKGNvbnRhaW5lcltwYXJ0Lm5hbWVdID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb250YWluZXJbcGFydC5uYW1lXSA9IHZhbHVlO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KGNvbnRhaW5lcltwYXJ0Lm5hbWVdKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lcltwYXJ0Lm5hbWVdLnB1c2godmFsdWUpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBjb250YWluZXJbcGFydC5uYW1lXSA9IFtjb250YWluZXJbcGFydC5uYW1lXSwgdmFsdWVdO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuICAgIFxyXG4gICAgLyoqXHJcbiAgICAgKiBUcmFpdGUgdW5lIHBhcnRpZSBpbnRlcm3DqWRpYWlyZSAoY3LDqWUgbGEgc3RydWN0dXJlKVxyXG4gICAgICogQHBhcmFtIHsqfSBjb250YWluZXIgLSBMZSBjb250ZW5ldXIgYWN0dWVsXHJcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gcGFydCAtIExhIHBhcnRpZSDDoCB0cmFpdGVyXHJcbiAgICAgKiBAcGFyYW0ge09iamVjdHxudWxsfSBuZXh0UGFydCAtIExhIHBhcnRpZSBzdWl2YW50ZSAocGV1dCDDqnRyZSBudWxsKVxyXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHBhcmVudCAtIExlIGNvbnRlbmV1ciBwYXJlbnRcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBiYXNlUGF0aCAtIExlIGNoZW1pbiBkZSBiYXNlIHBvdXIgbGEgZMOpdGVjdGlvbiBkZSBjb25mbGl0XHJcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBwYXJ0cyAtIFRvdXRlcyBsZXMgcGFydGllcyBkdSBjaGVtaW4gKHBvdXIgY29uc3RydWlyZSBsZSBjaGVtaW4gY29tcGxldCBkYW5zIGxlcyBlcnJldXJzKVxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGkgLSBMJ2luZGV4IGRlIGxhIHBhcnRpZSBhY3R1ZWxsZSAocG91ciBjb25zdHJ1aXJlIGxlIGNoZW1pbiBjb21wbGV0IGRhbnMgbGVzIGVycmV1cnMpXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IC0gTGEgY2zDqSBkdSBmb3JtdWxhaXJlIChwb3VyIGxlcyBtZXNzYWdlcyBkJ2VycmV1cilcclxuICAgICAqIEByZXR1cm5zIHsqfSBMZSBub3V2ZWF1IGNvbnRlbmV1ciBhcHLDqHMgdHJhaXRlbWVudFxyXG4gICAgICovXHJcbiAgICBjb25zdCBwcm9jZXNzSW50ZXJtZWRpYXRlUGFydCA9IChjb250YWluZXIsIHBhcnQsIG5leHRQYXJ0LCBwYXJlbnQsIGJhc2VQYXRoLCBwYXJ0cywgaSwga2V5KSA9PiB7XHJcbiAgICAgICAgaWYgKHBhcnQudHlwZSA9PT0gJ251bWVyaWMnKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHsgaW5kZXggfSA9IHBhcnQ7XHJcbiAgICAgICAgICAgIGNvbnN0IHBhcmVudFBhdGggPSBidWlsZFBhdGhTdHJpbmcocGFydHMuc2xpY2UoMCwgaSkpO1xyXG4gICAgICAgICAgICBjb25zdCB1c2VBcnJheSA9IHVzZUFycmF5Rm9yTnVtZXJpY1BhdGgocGFyZW50UGF0aCkgJiYgIWhhc0NvbmZsaWN0KGJhc2VQYXRoKTtcclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIGlmICghdXNlQXJyYXkpIHtcclxuICAgICAgICAgICAgICAgIGNvbnRhaW5lciA9IGVuc3VyZU9iamVjdChjb250YWluZXIsIHBhcmVudC5rZXksIHBhcmVudC5jb250YWluZXIsIHRydWUpO1xyXG4gICAgICAgICAgICAgICAgY29udGFpbmVyW2luZGV4XSA/Pz0ge307XHJcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGNvbnRhaW5lcltpbmRleF0gIT09ICdvYmplY3QnIHx8IGNvbnRhaW5lcltpbmRleF0gPT09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBwYXRoUGFydHMgPSBwYXJ0cy5zbGljZSgwLCBpICsgMSk7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY3VycmVudFBhdGggPSBidWlsZFBhdGhTdHJpbmcocGF0aFBhcnRzKTtcclxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGBDYW5ub3QgYWNjZXNzIHByb3BlcnR5IG9uIHByaW1pdGl2ZSB2YWx1ZS4gYCArXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGBLZXkgXCIke2tleX1cIiB0cmllcyB0byBhY2Nlc3MgXCIke2N1cnJlbnRQYXRofVwiIGJ1dCBpdCBpcyBhbHJlYWR5IGEgJHt0eXBlb2YgY29udGFpbmVyW2luZGV4XX0gdmFsdWU6ICR7SlNPTi5zdHJpbmdpZnkoY29udGFpbmVyW2luZGV4XSl9LiBgICtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYFRoaXMgc2hvdWxkIGhhdmUgYmVlbiBkZXRlY3RlZCBkdXJpbmcgY29uZmxpY3QgZGV0ZWN0aW9uIHBoYXNlLmBcclxuICAgICAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgY29udGFpbmVyID0gZW5zdXJlQXJyYXkoY29udGFpbmVyLCBwYXJlbnQua2V5LCBwYXJlbnQuY29udGFpbmVyKTtcclxuICAgICAgICAgICAgICAgIHdoaWxlIChjb250YWluZXIubGVuZ3RoIDw9IGluZGV4KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyLnB1c2godW5kZWZpbmVkKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGNvbnRhaW5lcltpbmRleF0gPz89IHt9O1xyXG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBjb250YWluZXJbaW5kZXhdICE9PSAnb2JqZWN0JyB8fCBjb250YWluZXJbaW5kZXhdID09PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcGF0aFBhcnRzID0gcGFydHMuc2xpY2UoMCwgaSArIDEpO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRQYXRoID0gYnVpbGRQYXRoU3RyaW5nKHBhdGhQYXJ0cyk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBgQ2Fubm90IGFjY2VzcyBwcm9wZXJ0eSBvbiBwcmltaXRpdmUgdmFsdWUuIGAgK1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBgS2V5IFwiJHtrZXl9XCIgdHJpZXMgdG8gYWNjZXNzIFwiJHtjdXJyZW50UGF0aH1cIiBidXQgaXQgaXMgYWxyZWFkeSBhICR7dHlwZW9mIGNvbnRhaW5lcltpbmRleF19IHZhbHVlOiAke0pTT04uc3RyaW5naWZ5KGNvbnRhaW5lcltpbmRleF0pfS4gYCArXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGBUaGlzIHNob3VsZCBoYXZlIGJlZW4gZGV0ZWN0ZWQgZHVyaW5nIGNvbmZsaWN0IGRldGVjdGlvbiBwaGFzZS5gXHJcbiAgICAgICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gY29udGFpbmVyW2luZGV4XTtcclxuICAgICAgICB9XHJcbiAgICAgICAgXHJcbiAgICAgICAgLy8gQ2zDqSBub3JtYWxlIDogY3LDqWVyIG9iamV0IG91IHRhYmxlYXUgc2Vsb24gbGEgcGFydGllIHN1aXZhbnRlXHJcbiAgICAgICAgY29uc3QgbmV4dElzTnVtZXJpYyA9IG5leHRQYXJ0Py50eXBlID09PSAnbnVtZXJpYyc7XHJcbiAgICAgICAgY29uc3QgY29uZmxpY3QgPSBoYXNDb25mbGljdChiYXNlUGF0aCk7XHJcbiAgICAgICAgXHJcbiAgICAgICAgaWYgKGNvbmZsaWN0KSB7XHJcbiAgICAgICAgICAgIC8vIENvbmZsaXQgOiB0b3Vqb3VycyB1dGlsaXNlciB1biBvYmpldFxyXG4gICAgICAgICAgICBjb250YWluZXIgPSBlbnN1cmVPYmplY3QoY29udGFpbmVyLCBwYXJlbnQua2V5LCBwYXJlbnQuY29udGFpbmVyLCB0cnVlKTtcclxuICAgICAgICAgICAgY29udGFpbmVyW3BhcnQubmFtZV0gPz89IHt9O1xyXG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShjb250YWluZXJbcGFydC5uYW1lXSkpIHtcclxuICAgICAgICAgICAgICAgIGNvbnRhaW5lcltwYXJ0Lm5hbWVdID0gYXJyYXlUb09iamVjdChjb250YWluZXJbcGFydC5uYW1lXSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGNvbnRhaW5lcltwYXJ0Lm5hbWVdICE9PSAnb2JqZWN0JyB8fCBjb250YWluZXJbcGFydC5uYW1lXSA9PT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgLy8gQ2V0dGUgZXJyZXVyIG5lIGRldnJhaXQgamFtYWlzIHNlIHByb2R1aXJlIHNpIGxhIGTDqXRlY3Rpb24gZm9uY3Rpb25uZSBjb3JyZWN0ZW1lbnRcclxuICAgICAgICAgICAgICAgIGNvbnN0IHBhdGhQYXJ0cyA9IHBhcnRzLnNsaWNlKDAsIGkgKyAxKTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRQYXRoID0gYnVpbGRQYXRoU3RyaW5nKHBhdGhQYXJ0cyk7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXHJcbiAgICAgICAgICAgICAgICAgICAgYENhbm5vdCBhY2Nlc3MgcHJvcGVydHkgb24gcHJpbWl0aXZlIHZhbHVlLiBgICtcclxuICAgICAgICAgICAgICAgICAgICBgS2V5IFwiJHtrZXl9XCIgdHJpZXMgdG8gYWNjZXNzIFwiJHtjdXJyZW50UGF0aH1cIiBidXQgaXQgaXMgYWxyZWFkeSBhICR7dHlwZW9mIGNvbnRhaW5lcltwYXJ0Lm5hbWVdfSB2YWx1ZTogJHtKU09OLnN0cmluZ2lmeShjb250YWluZXJbcGFydC5uYW1lXSl9LiBgICtcclxuICAgICAgICAgICAgICAgICAgICBgVGhpcyBzaG91bGQgaGF2ZSBiZWVuIGRldGVjdGVkIGR1cmluZyBjb25mbGljdCBkZXRlY3Rpb24gcGhhc2UuYFxyXG4gICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSBpZiAoY29udGFpbmVyW3BhcnQubmFtZV0gPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAvLyBQYXMgZGUgY29uZmxpdCwgY3LDqWVyIHNlbG9uIGxhIHBhcnRpZSBzdWl2YW50ZVxyXG4gICAgICAgICAgICBjb250YWluZXJbcGFydC5uYW1lXSA9IG5leHRJc051bWVyaWMgPyBbXSA6IHt9O1xyXG4gICAgICAgIH0gZWxzZSBpZiAobmV4dElzTnVtZXJpYyAmJiAhQXJyYXkuaXNBcnJheShjb250YWluZXJbcGFydC5uYW1lXSkpIHtcclxuICAgICAgICAgICAgLy8gT24gYSBiZXNvaW4gZCd1biB0YWJsZWF1IG1haXMgYydlc3QgdW4gb2JqZXRcclxuICAgICAgICAgICAgY29uc3QgaGFzU3RyaW5nS2V5cyA9IE9iamVjdC5rZXlzKGNvbnRhaW5lcltwYXJ0Lm5hbWVdKS5zb21lKGsgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbnVtS2V5ID0gTnVtYmVyLnBhcnNlSW50KGssIDEwKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBOdW1iZXIuaXNOYU4obnVtS2V5KSB8fCBrICE9PSBTdHJpbmcobnVtS2V5KTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIGlmICghaGFzU3RyaW5nS2V5cykge1xyXG4gICAgICAgICAgICAgICAgY29udGFpbmVyW3BhcnQubmFtZV0gPSBvYmplY3RUb0FycmF5KGNvbnRhaW5lcltwYXJ0Lm5hbWVdKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSBpZiAoIW5leHRJc051bWVyaWMgJiYgIWlzUGxhaW5PYmplY3QoY29udGFpbmVyW3BhcnQubmFtZV0pKSB7XHJcbiAgICAgICAgICAgIC8vIE9uIGEgYmVzb2luIGQndW4gb2JqZXQgbWFpcyBjJ2VzdCB1biB0YWJsZWF1XHJcbiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGNvbnRhaW5lcltwYXJ0Lm5hbWVdKSkge1xyXG4gICAgICAgICAgICAgICAgY29udGFpbmVyW3BhcnQubmFtZV0gPSBhcnJheVRvT2JqZWN0KGNvbnRhaW5lcltwYXJ0Lm5hbWVdKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGNvbnRhaW5lcltwYXJ0Lm5hbWVdID0ge307XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgXHJcbiAgICAgICAgLy8gUydhc3N1cmVyIHF1ZSBjb250YWluZXJbcGFydC5uYW1lXSBlc3QgYmllbiB1biBvYmpldCBhcHLDqHMgdG91dGVzIGxlcyBjb252ZXJzaW9uc1xyXG4gICAgICAgIGlmIChjb250YWluZXJbcGFydC5uYW1lXSAhPT0gdW5kZWZpbmVkICYmIFxyXG4gICAgICAgICAgICAodHlwZW9mIGNvbnRhaW5lcltwYXJ0Lm5hbWVdICE9PSAnb2JqZWN0JyB8fCBjb250YWluZXJbcGFydC5uYW1lXSA9PT0gbnVsbCkpIHtcclxuICAgICAgICAgICAgLy8gQ2V0dGUgZXJyZXVyIG5lIGRldnJhaXQgamFtYWlzIHNlIHByb2R1aXJlIHNpIGxhIGTDqXRlY3Rpb24gZm9uY3Rpb25uZSBjb3JyZWN0ZW1lbnRcclxuICAgICAgICAgICAgY29uc3QgcGF0aFBhcnRzID0gcGFydHMuc2xpY2UoMCwgaSArIDEpO1xyXG4gICAgICAgICAgICBjb25zdCBjdXJyZW50UGF0aCA9IGJ1aWxkUGF0aFN0cmluZyhwYXRoUGFydHMpO1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXHJcbiAgICAgICAgICAgICAgICBgQ2Fubm90IGFjY2VzcyBwcm9wZXJ0eSBvbiBwcmltaXRpdmUgdmFsdWUuIGAgK1xyXG4gICAgICAgICAgICAgICAgYEtleSBcIiR7a2V5fVwiIHRyaWVzIHRvIGFjY2VzcyBcIiR7Y3VycmVudFBhdGh9XCIgYnV0IGl0IGlzIGFscmVhZHkgYSAke3R5cGVvZiBjb250YWluZXJbcGFydC5uYW1lXX0gdmFsdWU6ICR7SlNPTi5zdHJpbmdpZnkoY29udGFpbmVyW3BhcnQubmFtZV0pfS4gYCArXHJcbiAgICAgICAgICAgICAgICBgVGhpcyBzaG91bGQgaGF2ZSBiZWVuIGRldGVjdGVkIGR1cmluZyBjb25mbGljdCBkZXRlY3Rpb24gcGhhc2UuYFxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gY29udGFpbmVyW3BhcnQubmFtZV07XHJcbiAgICB9O1xyXG4gICAgXHJcbiAgICAvLyBUcmFpdGVyIHRvdXRlcyBsZXMgZW50csOpZXNcclxuICAgIGZvciAoY29uc3QgeyB2YWx1ZSwga2V5IH0gb2YgYWxsRW50cmllcykge1xyXG4gICAgICAgIGlmICgha2V5KSBjb250aW51ZTtcclxuXHJcbiAgICAgICAgY29uc3QgcGFydHMgPSBwYXJzZUtleShrZXkpO1xyXG4gICAgICAgIGNvbnN0IHBhdGggPSBbeyBjb250YWluZXI6IGpzb25EYXRhLCBrZXk6IG51bGwgfV07XHJcbiAgICAgICAgbGV0IGNvbnRhaW5lciA9IGpzb25EYXRhO1xyXG4gICAgICAgIGNvbnN0IGJhc2VQYXRoID0gcGFydHNbMF0/LnR5cGUgPT09ICdrZXknID8gcGFydHNbMF0ubmFtZSA6ICcnO1xyXG5cclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBhcnRzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHBhcnQgPSBwYXJ0c1tpXTtcclxuICAgICAgICAgICAgY29uc3QgaXNMYXN0ID0gaSA9PT0gcGFydHMubGVuZ3RoIC0gMTtcclxuICAgICAgICAgICAgY29uc3QgbmV4dFBhcnQgPSBpICsgMSA8IHBhcnRzLmxlbmd0aCA/IHBhcnRzW2kgKyAxXSA6IG51bGw7XHJcbiAgICAgICAgICAgIGNvbnN0IHBhcmVudCA9IHBhdGhbcGF0aC5sZW5ndGggLSAxXTtcclxuXHJcbiAgICAgICAgICAgIGlmIChpc0xhc3QpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHBhcmVudFBhdGggPSBidWlsZFBhdGhTdHJpbmcocGFydHMuc2xpY2UoMCwgaSkpO1xyXG4gICAgICAgICAgICAgICAgcHJvY2Vzc0ZpbmFsVmFsdWUoY29udGFpbmVyLCBwYXJ0LCB2YWx1ZSwgcGFyZW50LCBiYXNlUGF0aCwgcGFyZW50UGF0aCk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAvLyBQYXJ0aWUgaW50ZXJtw6lkaWFpcmUgOiBjcsOpZXIgbGEgc3RydWN0dXJlXHJcbiAgICAgICAgICAgICAgICBjb25zdCBuZXdDb250YWluZXIgPSBwcm9jZXNzSW50ZXJtZWRpYXRlUGFydChjb250YWluZXIsIHBhcnQsIG5leHRQYXJ0LCBwYXJlbnQsIGJhc2VQYXRoLCBwYXJ0cywgaSwga2V5KTtcclxuICAgICAgICAgICAgICAgIHBhdGgucHVzaCh7IGNvbnRhaW5lciwga2V5OiBwYXJ0LnR5cGUgPT09ICdudW1lcmljJyA/IHBhcnQuaW5kZXggOiBwYXJ0Lm5hbWUgfSk7XHJcbiAgICAgICAgICAgICAgICBjb250YWluZXIgPSBuZXdDb250YWluZXI7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGpzb25EYXRhO1xyXG59O1xyXG5cclxuLyoqXHJcbiAqIFBhcnNlIHVuZSBjbMOpIGRlIGZvcm11bGFpcmUgcG91ciBleHRyYWlyZSBsZXMgcGFydGllcyAobm9tLCBpbmRpY2VzLCBldGMuKVxyXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IC0gTGEgY2zDqSDDoCBwYXJzZXIgKGV4OiBcInVzZXJbZW1haWxdXCIsIFwidGFnc1tdXCIsIFwiaXRlbXNbMF1bbmFtZV1cIilcclxuICogQHJldHVybnMge0FycmF5PHtuYW1lOiBzdHJpbmcsIHR5cGU6IHN0cmluZywgaW5kZXg/OiBudW1iZXJ9Pn0gVGFibGVhdSBkZXMgcGFydGllcyBwYXJzw6llc1xyXG4gKiBAcHJpdmF0ZVxyXG4gKi9cclxuY29uc3QgcGFyc2VLZXkgPSAoa2V5KSA9PiB7XHJcbiAgICBjb25zdCBwYXJ0cyA9IFtdO1xyXG4gICAgbGV0IGN1cnJlbnQgPSAnJztcclxuICAgIGxldCBpID0gMDtcclxuICAgIGNvbnN0IGxlbiA9IGtleS5sZW5ndGg7XHJcblxyXG4gICAgd2hpbGUgKGkgPCBsZW4pIHtcclxuICAgICAgICBjb25zdCBjaGFyID0ga2V5W2ldO1xyXG4gICAgICAgIFxyXG4gICAgICAgIGlmIChjaGFyID09PSAnWycpIHtcclxuICAgICAgICAgICAgLy8gU2F1dmVnYXJkZXIgbGEgcGFydGllIHByw6ljw6lkZW50ZSBzaSBlbGxlIGV4aXN0ZVxyXG4gICAgICAgICAgICBpZiAoY3VycmVudCkge1xyXG4gICAgICAgICAgICAgICAgcGFydHMucHVzaCh7IG5hbWU6IGN1cnJlbnQsIHR5cGU6ICdrZXknIH0pO1xyXG4gICAgICAgICAgICAgICAgY3VycmVudCA9ICcnO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAvLyBUcm91dmVyIGxhIGZpbiBkdSBjcm9jaGV0XHJcbiAgICAgICAgICAgIGkrKztcclxuICAgICAgICAgICAgbGV0IGJyYWNrZXRDb250ZW50ID0gJyc7XHJcbiAgICAgICAgICAgIHdoaWxlIChpIDwgbGVuICYmIGtleVtpXSAhPT0gJ10nKSB7XHJcbiAgICAgICAgICAgICAgICBicmFja2V0Q29udGVudCArPSBrZXlbaV07XHJcbiAgICAgICAgICAgICAgICBpKys7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIGlmIChicmFja2V0Q29udGVudCA9PT0gJycpIHtcclxuICAgICAgICAgICAgICAgIC8vIFtdIHZpZGUgPSB0YWJsZWF1XHJcbiAgICAgICAgICAgICAgICBjb25zdCBsYXN0UGFydCA9IHBhcnRzW3BhcnRzLmxlbmd0aCAtIDFdO1xyXG4gICAgICAgICAgICAgICAgaWYgKGxhc3RQYXJ0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbGFzdFBhcnQudHlwZSA9ICdhcnJheSc7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIFtdIGF1IGTDqWJ1dCwgY3LDqWVyIHVuZSBwYXJ0aWUgc3DDqWNpYWxlXHJcbiAgICAgICAgICAgICAgICAgICAgcGFydHMucHVzaCh7IG5hbWU6ICcnLCB0eXBlOiAnYXJyYXknIH0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgLy8gQ29udGVudSBkYW5zIGxlcyBjcm9jaGV0c1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbnVtSW5kZXggPSBOdW1iZXIucGFyc2VJbnQoYnJhY2tldENvbnRlbnQsIDEwKTtcclxuICAgICAgICAgICAgICAgIGlmICghTnVtYmVyLmlzTmFOKG51bUluZGV4KSAmJiBicmFja2V0Q29udGVudCA9PT0gU3RyaW5nKG51bUluZGV4KSkge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIEluZGljZSBudW3DqXJpcXVlXHJcbiAgICAgICAgICAgICAgICAgICAgcGFydHMucHVzaCh7IG5hbWU6IFN0cmluZyhudW1JbmRleCksIHR5cGU6ICdudW1lcmljJywgaW5kZXg6IG51bUluZGV4IH0pO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyBOb20gZGUgcHJvcHJpw6l0w6lcclxuICAgICAgICAgICAgICAgICAgICBwYXJ0cy5wdXNoKHsgbmFtZTogYnJhY2tldENvbnRlbnQsIHR5cGU6ICdrZXknIH0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGkrKzsgLy8gUGFzc2VyIGxlICddJ1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGN1cnJlbnQgKz0gY2hhcjtcclxuICAgICAgICAgICAgaSsrO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIFxyXG4gICAgLy8gQWpvdXRlciBsYSBkZXJuacOocmUgcGFydGllIHNpIGVsbGUgZXhpc3RlXHJcbiAgICBpZiAoY3VycmVudCkge1xyXG4gICAgICAgIHBhcnRzLnB1c2goeyBuYW1lOiBjdXJyZW50LCB0eXBlOiAna2V5JyB9KTtcclxuICAgIH1cclxuICAgIFxyXG4gICAgcmV0dXJuIHBhcnRzO1xyXG59O1xyXG5cclxuLyoqXHJcbiAqIFbDqXJpZmllIHNpIHVuZSB2YWxldXIgZXN0IHVuIG9iamV0IHNpbXBsZSAocGFzIHVuIHRhYmxlYXUsIHBhcyBudWxsKVxyXG4gKiBAcGFyYW0geyp9IG9iaiAtIExhIHZhbGV1ciDDoCB2w6lyaWZpZXJcclxuICogQHJldHVybnMge2Jvb2xlYW59XHJcbiAqIEBwcml2YXRlXHJcbiAqL1xyXG5jb25zdCBpc1BsYWluT2JqZWN0ID0gKG9iaikgPT4ge1xyXG4gICAgcmV0dXJuIHR5cGVvZiBvYmogPT09ICdvYmplY3QnICYmIG9iaiAhPT0gbnVsbCAmJiAhQXJyYXkuaXNBcnJheShvYmopO1xyXG59O1xyXG4iLCJpbXBvcnQgJy4vY3NzL3RyaXN0YXRlLmNzcyc7XG5cbi8qKlxuICogQ3JlYXRlcyBhIHRyaS1zdGF0ZSBjaGVja2JveCBmb3IgZWFjaCBjaGVja2JveCBlbGVtZW50IGluIHRoZSBhcHguZWxlbWVudHMgYXJyYXkuXG4gKiBAcGFyYW0ge0FycmF5PEhUTUxFbGVtZW50Pn0gYXB4IC0gQW4gYXJyYXkgb2YgSFRNTEVsZW1lbnRzIHdoaWNoIGlzIHJldHVybmVkIGJ5IEFQWCgpXG4gKiBAZXhhbXBsZVxuICogLy8gQ2FsbCB0aGUgdHJpc3RhdGUgZnVuY3Rpb24gb24gYW4gYXJyYXkgb2YgY2hlY2tib3ggZWxlbWVudHNcbiAqIGFweC50cmlzdGF0ZSgpO1xuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiAoYXB4KSB7XG4gICAgYXB4LnRyaXN0YXRlID0gZnVuY3Rpb24gKG9wdGlvbnMgPSB7fSl7XG4gICAgICAgIGFweC5lbGVtZW50cy5mb3JFYWNoKChlbGVtZW50KSA9PiB7XG4gICAgICAgICAgICBpZiAoZWxlbWVudC50eXBlID09PSAnY2hlY2tib3gnKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgW29yaWdpbmFsQ2hlY2tib3gsIHRyaXN0YXRlRG9tLCBoaWRkZW5JbnB1dF0gPSBjcmVhdGVUcmlTdGF0ZUNoZWNrYm94KGVsZW1lbnQsIG9wdGlvbnMpO1xuICAgICAgICAgICAgICAgIG9yaWdpbmFsQ2hlY2tib3guX2FweFRyaXN0YXRlID0geyBkb206IHRyaXN0YXRlRG9tLCBoaWRkZW5JbnB1dCB9O1xuICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLmNhbGxiYWNrcyAmJiBvcHRpb25zLmNhbGxiYWNrcy5hZnRlciAmJiB0eXBlb2Ygb3B0aW9ucy5jYWxsYmFja3MuYWZ0ZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5jYWxsYmFja3MuYWZ0ZXIob3JpZ2luYWxDaGVja2JveCwgdHJpc3RhdGVEb20sIGhpZGRlbklucHV0KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgc2V0Q2hpbGRyZW4oY2hpbGRyZW5BcHgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gc2V0Q2hpbGRyZW4oYXB4LCBjaGlsZHJlbkFweCwgb3B0aW9ucyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgfTtcbn1cblxuLyoqXG4gKiBMaW5rIHBhcmVudCB0cmlzdGF0ZShzKSB0byBjaGlsZCBjaGVja2JveGVzLiBXaGVuIGV4YWN0bHkgb25lIHBhcmVudDogdGhhdCBwYXJlbnQgZ2V0c1xuICogaW5kZXRlcm1pbmF0ZS1kYXNoIGF1dG9tYXRpY2FsbHkgYW5kIHNob3dzIGRhc2ggd2hlbiBjaGlsZHJlbiBhcmUgbWl4ZWQ7IGNsaWNrIHBhcmVudCB0byBhcHBseSBpdHMgc3RhdGUgdG8gYWxsIGNoaWxkcmVuLlxuICogQHBhcmFtIHtPYmplY3R9IHBhcmVudEFweCAtIEFQWCBpbnN0YW5jZSB3aG9zZSBlbGVtZW50cyBhcmUgdGhlIHBhcmVudCBjaGVja2JveChlcylcbiAqIEBwYXJhbSB7T2JqZWN0fSBjaGlsZHJlbkFweCAtIEFQWCBpbnN0YW5jZSB3aG9zZSBlbGVtZW50cyBhcmUgdGhlIGNoaWxkIGNoZWNrYm94KGVzKVxuICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgLSBPcHRpb25zIHVzZWQgZm9yIHRoZSBwYXJlbnQgKGFuZCBhcHBsaWVkIHRvIGNoaWxkcmVuIHdoZW4gaW5pdGlhbGl6aW5nIHRoZW0pXG4gKi9cbmZ1bmN0aW9uIHNldENoaWxkcmVuKHBhcmVudEFweCwgY2hpbGRyZW5BcHgsIG9wdGlvbnMpIHtcbiAgICBjb25zdCBwYXJlbnRzID0gcGFyZW50QXB4LmFsbCgpLmZpbHRlcigoZWwpID0+IGVsLnR5cGUgPT09ICdjaGVja2JveCcpO1xuICAgIGlmIChwYXJlbnRzLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuICAgIGlmIChwYXJlbnRzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgY29uc29sZS53YXJuKCdBUFggdHJpc3RhdGUgc2V0Q2hpbGRyZW46IG9ubHkgdGhlIGZpcnN0IHBhcmVudCBpcyBsaW5rZWQgdG8gYWxsIGNoaWxkcmVuLicpO1xuICAgIH1cbiAgICBjb25zdCBwYXJlbnRDaGVja2JveCA9IHBhcmVudHNbMF07XG4gICAgY29uc3QgcGFyZW50UmVmID0gcGFyZW50Q2hlY2tib3guX2FweFRyaXN0YXRlO1xuICAgIGlmICghcGFyZW50UmVmKSByZXR1cm47XG5cbiAgICBjb25zdCBwYXJlbnREb20gPSBwYXJlbnRSZWYuZG9tO1xuICAgIGNvbnN0IHBhcmVudEhpZGRlbklucHV0ID0gcGFyZW50UmVmLmhpZGRlbklucHV0O1xuXG4gICAgLy8gQXV0b21hdGljYWxseSBlbmFibGUgaW5kZXRlcm1pbmF0ZSAoZGFzaCkgb24gcGFyZW50IHdoZW4gaXQgaGFzIGNoaWxkcmVuOiBkYXNoIHNob3dzIG9ubHkgd2hlbiBjaGlsZHJlbiBhcmUgbWl4ZWQgKC0tbWl4ZWQpXG4gICAgcGFyZW50RG9tLmNsYXNzTGlzdC5hZGQoJ2FweC10cmlzdGF0ZS0tdW5jaGVja2VkLWluZGV0ZXJtaW5hdGUnLCAnYXB4LXRyaXN0YXRlLS1pbmRldGVybWluYXRlLWRhc2gnKTtcblxuICAgIGNvbnN0IGNoaWxkQ2hlY2tib3hlcyA9IGNoaWxkcmVuQXB4LmFsbCgpLmZpbHRlcigoZWwpID0+IGVsLnR5cGUgPT09ICdjaGVja2JveCcpO1xuICAgIGNvbnN0IGNoaWxkUmVmcyA9IFtdO1xuXG4gICAgZnVuY3Rpb24gc3luY1BhcmVudEZyb21DaGlsZHJlbigpIHtcbiAgICAgICAgaWYgKGNoaWxkUmVmcy5sZW5ndGggPT09IDApIHJldHVybjtcbiAgICAgICAgY29uc3Qgc3RhdGVzID0gY2hpbGRSZWZzLm1hcCgocmVmKSA9PiBnZXRUcmlzdGF0ZVN0YXRlKHJlZi5kb20pKTtcbiAgICAgICAgY29uc3QgYWxsQ2hlY2tlZCA9IHN0YXRlcy5ldmVyeSgocykgPT4gcyA9PT0gJ2NoZWNrZWQnKTtcbiAgICAgICAgY29uc3QgYWxsQ3Jvc3NlZCA9IHN0YXRlcy5ldmVyeSgocykgPT4gcyA9PT0gJ2Nyb3NzZWQnKTtcbiAgICAgICAgY29uc3QgYWxsVW5jaGVja2VkID0gc3RhdGVzLmV2ZXJ5KChzKSA9PiBzID09PSAndW5jaGVja2VkJyk7XG4gICAgICAgIGNvbnN0IG1peGVkID0gIWFsbENoZWNrZWQgJiYgIWFsbENyb3NzZWQgJiYgIWFsbFVuY2hlY2tlZDtcblxuICAgICAgICBwYXJlbnREb20uY2xhc3NMaXN0LnJlbW92ZSgndW5jaGVja2VkJywgJ2NoZWNrZWQnLCAnY3Jvc3NlZCcpO1xuICAgICAgICBpZiAobWl4ZWQpIHBhcmVudERvbS5jbGFzc0xpc3QuYWRkKCdhcHgtdHJpc3RhdGUtLW1peGVkJyk7XG4gICAgICAgIGVsc2UgcGFyZW50RG9tLmNsYXNzTGlzdC5yZW1vdmUoJ2FweC10cmlzdGF0ZS0tbWl4ZWQnKTtcblxuICAgICAgICBpZiAoYWxsQ2hlY2tlZCkge1xuICAgICAgICAgICAgcGFyZW50RG9tLmNsYXNzTGlzdC5hZGQoJ2NoZWNrZWQnKTtcbiAgICAgICAgICAgIHBhcmVudEhpZGRlbklucHV0LnZhbHVlID0gJ3RydWUnO1xuICAgICAgICB9IGVsc2UgaWYgKGFsbENyb3NzZWQpIHtcbiAgICAgICAgICAgIHBhcmVudERvbS5jbGFzc0xpc3QuYWRkKCdjcm9zc2VkJyk7XG4gICAgICAgICAgICBwYXJlbnRIaWRkZW5JbnB1dC52YWx1ZSA9ICdmYWxzZSc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBwYXJlbnREb20uY2xhc3NMaXN0LmFkZCgndW5jaGVja2VkJyk7XG4gICAgICAgICAgICBwYXJlbnRIaWRkZW5JbnB1dC5yZW1vdmVBdHRyaWJ1dGUoJ25hbWUnKTtcbiAgICAgICAgICAgIHBhcmVudEhpZGRlbklucHV0LnJlbW92ZUF0dHJpYnV0ZSgndmFsdWUnKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGFwcGx5UGFyZW50VG9DaGlsZHJlbigpIHtcbiAgICAgICAgY29uc3QgcGFyZW50U3RhdGUgPSBnZXRUcmlzdGF0ZVN0YXRlKHBhcmVudERvbSk7XG4gICAgICAgIGNoaWxkUmVmcy5mb3JFYWNoKChyZWYpID0+IHNldFRyaXN0YXRlU3RhdGUocmVmLmNoZWNrYm94LCByZWYuZG9tLCByZWYuaGlkZGVuSW5wdXQsIHBhcmVudFN0YXRlKSk7XG4gICAgfVxuXG4gICAgY29uc3QgY2hpbGRPcHRpb25zID0ge1xuICAgICAgICAuLi5vcHRpb25zLFxuICAgICAgICBjYWxsYmFja3M6IHtcbiAgICAgICAgICAgIGFmdGVyKGNoZWNrYm94LCBkb20sIGhpZGRlbklucHV0KSB7XG4gICAgICAgICAgICAgICAgY2hpbGRSZWZzLnB1c2goeyBjaGVja2JveCwgZG9tLCBoaWRkZW5JbnB1dCB9KTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjaGFuZ2U6IHN5bmNQYXJlbnRGcm9tQ2hpbGRyZW5cbiAgICAgICAgfVxuICAgIH07XG5cbiAgICBjaGlsZHJlbkFweC50cmlzdGF0ZShjaGlsZE9wdGlvbnMpO1xuXG4gICAgc3luY1BhcmVudEZyb21DaGlsZHJlbigpO1xuICAgIHBhcmVudERvbS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHNldFRpbWVvdXQoYXBwbHlQYXJlbnRUb0NoaWxkcmVuLCAwKSk7XG59XG5cbmZ1bmN0aW9uIGdldFRyaXN0YXRlU3RhdGUoZG9tKSB7XG4gICAgaWYgKGRvbS5jbGFzc0xpc3QuY29udGFpbnMoJ2NoZWNrZWQnKSkgcmV0dXJuICdjaGVja2VkJztcbiAgICBpZiAoZG9tLmNsYXNzTGlzdC5jb250YWlucygnY3Jvc3NlZCcpKSByZXR1cm4gJ2Nyb3NzZWQnO1xuICAgIHJldHVybiAndW5jaGVja2VkJztcbn1cblxuZnVuY3Rpb24gc2V0VHJpc3RhdGVTdGF0ZShjaGVja2JveCwgZG9tLCBoaWRkZW5JbnB1dCwgc3RhdGUpIHtcbiAgICBkb20uY2xhc3NMaXN0LnJlbW92ZSgndW5jaGVja2VkJywgJ2NoZWNrZWQnLCAnY3Jvc3NlZCcpO1xuICAgIGRvbS5jbGFzc0xpc3QuYWRkKHN0YXRlKTtcbiAgICBjb25zdCBuYW1lID0gY2hlY2tib3guZGF0YXNldC5uYW1lIHx8IGNoZWNrYm94LmdldEF0dHJpYnV0ZSgnZGF0YS1uYW1lJykgfHwgY2hlY2tib3gubmFtZSB8fCAnJztcbiAgICBpZiAoc3RhdGUgPT09ICdjaGVja2VkJykge1xuICAgICAgICBoaWRkZW5JbnB1dC52YWx1ZSA9ICd0cnVlJztcbiAgICAgICAgaWYgKG5hbWUpIGhpZGRlbklucHV0LnNldEF0dHJpYnV0ZSgnbmFtZScsIG5hbWUpO1xuICAgICAgICBjaGVja2JveC5jaGVja2VkID0gdHJ1ZTtcbiAgICB9IGVsc2UgaWYgKHN0YXRlID09PSAnY3Jvc3NlZCcpIHtcbiAgICAgICAgaGlkZGVuSW5wdXQudmFsdWUgPSAnZmFsc2UnO1xuICAgICAgICBpZiAobmFtZSkgaGlkZGVuSW5wdXQuc2V0QXR0cmlidXRlKCduYW1lJywgbmFtZSk7XG4gICAgICAgIGNoZWNrYm94LmNoZWNrZWQgPSBmYWxzZTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBoaWRkZW5JbnB1dC5yZW1vdmVBdHRyaWJ1dGUoJ25hbWUnKTtcbiAgICAgICAgaGlkZGVuSW5wdXQucmVtb3ZlQXR0cmlidXRlKCd2YWx1ZScpO1xuICAgICAgICBjaGVja2JveC5jaGVja2VkID0gZmFsc2U7XG4gICAgfVxufVxuXG5mdW5jdGlvbiB0b2dnbGVUcmlTdGF0ZUNoZWNrYm94U3RhdGUoY3VzdG9tQ2hlY2tib3gsIGFjdHVhbENoZWNrYm94LCBoaWRkZW5JbnB1dCkge1xuICAgIGNvbnN0IHdhc0NoZWNrZWQgPSBjdXN0b21DaGVja2JveC5jbGFzc0xpc3QuY29udGFpbnMoJ2NoZWNrZWQnKTtcbiAgICBjb25zdCB3YXNDcm9zc2VkID0gY3VzdG9tQ2hlY2tib3guY2xhc3NMaXN0LmNvbnRhaW5zKCdjcm9zc2VkJyk7XG4gICAgY3VzdG9tQ2hlY2tib3guY2xhc3NMaXN0LnJlbW92ZSgndW5jaGVja2VkJywgJ2NoZWNrZWQnLCAnY3Jvc3NlZCcpO1xuICAgIGlmICh3YXNDaGVja2VkKSB7XG4gICAgICAgIGN1c3RvbUNoZWNrYm94LmNsYXNzTGlzdC5hZGQoJ2Nyb3NzZWQnKTtcbiAgICAgICAgYWN0dWFsQ2hlY2tib3guY2hlY2tlZCA9IGZhbHNlO1xuICAgICAgICBoaWRkZW5JbnB1dC52YWx1ZSA9ICdmYWxzZSc7XG4gICAgfSBlbHNlIGlmICh3YXNDcm9zc2VkKSB7XG4gICAgICAgIGN1c3RvbUNoZWNrYm94LmNsYXNzTGlzdC5hZGQoJ3VuY2hlY2tlZCcpO1xuICAgICAgICBoaWRkZW5JbnB1dC5yZW1vdmVBdHRyaWJ1dGUoJ25hbWUnKTsgLy8gRW5zdXJlIHRoZSBoaWRkZW4gaW5wdXQgZG9lc24ndCBwb3N0IGFueSB2YWx1ZVxuICAgICAgICBoaWRkZW5JbnB1dC5yZW1vdmVBdHRyaWJ1dGUoJ3ZhbHVlJyk7IC8vIEVuc3VyZSB0aGUgaGlkZGVuIGlucHV0IGRvZXNuJ3QgcG9zdCBhbnkgdmFsdWVcbiAgICB9IGVsc2Uge1xuICAgICAgICBjdXN0b21DaGVja2JveC5jbGFzc0xpc3QuYWRkKCdjaGVja2VkJyk7XG4gICAgICAgIGFjdHVhbENoZWNrYm94LmNoZWNrZWQgPSB0cnVlO1xuICAgICAgICBoaWRkZW5JbnB1dC52YWx1ZSA9ICd0cnVlJztcbiAgICAgICAgaGlkZGVuSW5wdXQuc2V0QXR0cmlidXRlKCduYW1lJywgYWN0dWFsQ2hlY2tib3guZGF0YXNldC5uYW1lKTsgLy8gUmVzdG9yZSB0aGUgbmFtZSBmb3IgcG9zdGluZ1xuICAgIH1cbn1cblxuZnVuY3Rpb24gY3JlYXRlVHJpU3RhdGVDaGVja2JveChjaGVja2JveEVsZW1lbnQsIG9wdGlvbnMpIHtcbiAgICBcbiAgICAvL2dldCB0aGUgY2hlY2tib3ggbWFyZ2lucyBpbmNsdWRpbmcgYnJvd3NlciBkZWZhdWx0XG4gICAgY29uc3QgY2hlY2tib3hTdHlsZSA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGNoZWNrYm94RWxlbWVudCk7XG4gICAgLy8gSGlkZSB0aGUgb3JpZ2luYWwgY2hlY2tib3hcbiAgICBjaGVja2JveEVsZW1lbnQuc3R5bGUuZGlzcGxheSA9ICdub25lJztcblxuICAgIC8vIENyZWF0ZSB0aGUgY3VzdG9tIGNoZWNrYm94IGRpdiBhbmQgc2V0IGl0cyBpbml0aWFsIHN0YXRlXG4gICAgY29uc3QgdHJpc3RhdGVEb20gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICB0cmlzdGF0ZURvbS5jbGFzc0xpc3QuYWRkKCdhcHgtdHJpc3RhdGUnKTtcbiAgICBpZiAob3B0aW9ucy5zaXplKSB7XG4gICAgICAgIGlmIChvcHRpb25zLnNpemUud2lkdGggIT0gbnVsbCkge1xuICAgICAgICAgICAgY29uc3QgdyA9IG9wdGlvbnMuc2l6ZS53aWR0aDtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgdyAhPT0gJ251bWJlcicgJiYgdHlwZW9mIHcgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigndHJpc3RhdGUgc2l6ZS53aWR0aCBtdXN0IGJlIGEgbnVtYmVyIChweCkgb3IgYSBzdHJpbmcgKENTUyBsZW5ndGgpLicpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdHJpc3RhdGVEb20uc3R5bGUud2lkdGggPSB0eXBlb2YgdyA9PT0gJ251bWJlcicgPyB3ICsgJ3B4JyA6IFN0cmluZyh3KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAob3B0aW9ucy5zaXplLmhlaWdodCAhPSBudWxsKSB7XG4gICAgICAgICAgICBjb25zdCBoID0gb3B0aW9ucy5zaXplLmhlaWdodDtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgaCAhPT0gJ251bWJlcicgJiYgdHlwZW9mIGggIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigndHJpc3RhdGUgc2l6ZS5oZWlnaHQgbXVzdCBiZSBhIG51bWJlciAocHgpIG9yIGEgc3RyaW5nIChDU1MgbGVuZ3RoKS4nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRyaXN0YXRlRG9tLnN0eWxlLmhlaWdodCA9IHR5cGVvZiBoID09PSAnbnVtYmVyJyA/IGggKyAncHgnIDogU3RyaW5nKGgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmKG9wdGlvbnMuY2xhc3NlcykgdHJpc3RhdGVEb20uY2xhc3NMaXN0LmFkZCguLi5jb21wdXRlQ2xhc3NlcyhvcHRpb25zLmNsYXNzZXMpKTtcbiAgICBjb25zdCBjb2xvcnMgPSByZXNvbHZlQ29sb3JzKG9wdGlvbnMpO1xuICAgIGlmIChjb2xvcnMudGljayAhPSBudWxsKSB0cmlzdGF0ZURvbS5zdHlsZS5zZXRQcm9wZXJ0eSgnLS1hcHgtdHJpc3RhdGUtdGljay1jb2xvcicsIFN0cmluZyhjb2xvcnMudGljaykpO1xuICAgIGlmIChjb2xvcnMuY2hlY2tlZCAhPSBudWxsKSB0cmlzdGF0ZURvbS5zdHlsZS5zZXRQcm9wZXJ0eSgnLS1hcHgtdHJpc3RhdGUtY2hlY2tlZC1jb2xvcicsIFN0cmluZyhjb2xvcnMuY2hlY2tlZCkpO1xuICAgIGlmIChjb2xvcnMuY3Jvc3NlZCAhPSBudWxsKSB0cmlzdGF0ZURvbS5zdHlsZS5zZXRQcm9wZXJ0eSgnLS1hcHgtdHJpc3RhdGUtY3Jvc3NlZC1jb2xvcicsIFN0cmluZyhjb2xvcnMuY3Jvc3NlZCkpO1xuXG4gICAgdHJpc3RhdGVEb20uc3R5bGUubWFyZ2luID0gY2hlY2tib3hTdHlsZS5tYXJnaW47XG5cbiAgICBpZiAoY2hlY2tib3hFbGVtZW50LmNoZWNrZWQpIHtcbiAgICAgICAgdHJpc3RhdGVEb20uY2xhc3NMaXN0LmFkZCgnY2hlY2tlZCcpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHRyaXN0YXRlRG9tLmNsYXNzTGlzdC5hZGQoJ3VuY2hlY2tlZCcpO1xuICAgIH1cblxuICAgIC8vIENyZWF0ZSB0aGUgaGlkZGVuIGlucHV0IGZpZWxkXG4gICAgY29uc3QgaGlkZGVuSW5wdXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbnB1dCcpO1xuICAgIGhpZGRlbklucHV0LnR5cGUgPSAnaGlkZGVuJztcbiAgICBoaWRkZW5JbnB1dC5uYW1lID0gY2hlY2tib3hFbGVtZW50Lm5hbWU7IC8vIENvcHkgdGhlIG5hbWUgZnJvbSB0aGUgb3JpZ2luYWwgY2hlY2tib3hcbiAgICBjaGVja2JveEVsZW1lbnQuZGF0YXNldC5uYW1lID0gY2hlY2tib3hFbGVtZW50Lm5hbWU7IC8vIFN0b3JlIHRoZSBuYW1lIGluIGEgZGF0YSBhdHRyaWJ1dGUgZm9yIGxhdGVyIHVzZVxuICAgIGNoZWNrYm94RWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoJ25hbWUnKTsgLy8gUmVtb3ZlIHRoZSBuYW1lIGZyb20gdGhlIG9yaWdpbmFsIGNoZWNrYm94IHRvIGF2b2lkIGRvdWJsZSBwb3N0aW5nXG5cbiAgICBpZiAob3B0aW9ucy5kZWZhdWx0U3RhdGUpIHNldERlZmF1bHRTdGF0ZShvcHRpb25zLCB0cmlzdGF0ZURvbSwgaGlkZGVuSW5wdXQpO1xuICAgIGVsc2V7XG4gICAgICAgIC8vIFNldCB0aGUgaW5pdGlhbCB2YWx1ZSBmb3IgdGhlIGhpZGRlbiBpbnB1dCBiYXNlZCBvbiB0aGUgY2hlY2tib3gncyBzdGF0ZVxuICAgICAgICBpZiAoY2hlY2tib3hFbGVtZW50LmNoZWNrZWQpIHtcbiAgICAgICAgICAgIGhpZGRlbklucHV0LnZhbHVlID0gJ3RydWUnO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaGlkZGVuSW5wdXQubmFtZSA9ICcnOyAvLyBFbnN1cmUgdGhlIGhpZGRlbiBpbnB1dCBkb2Vzbid0IHBvc3QgYW55IHZhbHVlXG4gICAgICAgICAgICBoaWRkZW5JbnB1dC52YWx1ZSA9ICcnO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy9oYW5kbGUgYWNjZXNzaWJpbGl0eSwgc2V0IHRoZSB0YWJpbmRleCB0byB0aGUgc2FtZSBhcyB0aGUgY2hlY2tib3hcbiAgICB0cmlzdGF0ZURvbS50YWJJbmRleCA9IGNoZWNrYm94RWxlbWVudC50YWJJbmRleDtcblxuICAgIC8vIEluc2VydCB0aGUgaGlkZGVuIGlucHV0IGluc2lkZSB0aGUgY3VzdG9tIGNoZWNrYm94IGRpdlxuICAgIHRyaXN0YXRlRG9tLmFwcGVuZENoaWxkKGhpZGRlbklucHV0KTtcblxuICAgIC8vIEluc2VydCBpdCBuZXh0IHRvIHRoZSBhY3R1YWwgY2hlY2tib3hcbiAgICBjaGVja2JveEVsZW1lbnQucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUodHJpc3RhdGVEb20sIGNoZWNrYm94RWxlbWVudC5uZXh0U2libGluZyk7XG5cbiAgICAvLyBBZGQgZXZlbnQgbGlzdGVuZXJcbiAgICB0cmlzdGF0ZURvbS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIHRvZ2dsZVRyaVN0YXRlQ2hlY2tib3hTdGF0ZSh0cmlzdGF0ZURvbSwgY2hlY2tib3hFbGVtZW50LCBoaWRkZW5JbnB1dCk7XG4gICAgICAgIGJ1YmJsZUV2ZW50c1RvT3JpZ2luYWxDaGVja2JveChvcHRpb25zLCBjaGVja2JveEVsZW1lbnQsIHRyaXN0YXRlRG9tLCBoaWRkZW5JbnB1dCwgZSk7XG4gICAgfSk7XG4gICAgdHJpc3RhdGVEb20uYWRkRXZlbnRMaXN0ZW5lcigna2V5dXAnLCBvbmtleXVwLmJpbmQobnVsbCwgY2hlY2tib3hFbGVtZW50KSk7XG5cbiAgICByZXR1cm4gW2NoZWNrYm94RWxlbWVudCwgdHJpc3RhdGVEb20sIGhpZGRlbklucHV0XTtcbn1cblxuZnVuY3Rpb24gc2V0RGVmYXVsdFN0YXRlKG9wdGlvbnMsIHRyaXN0YXRlRG9tLCBoaWRkZW5JbnB1dCkge1xuICAgIC8vIEVuc3VyZSBvbmx5IG9uZSBzdGF0ZSBjbGFzcyBpcyBzZXQgKHVuY2hlY2tlZEFwcGVhcmFuY2UgbW9kaWZpZXJzIG11c3Qgbm90IGFmZmVjdCBjaGVja2VkL2Nyb3NzZWQpXG4gICAgdHJpc3RhdGVEb20uY2xhc3NMaXN0LnJlbW92ZSgndW5jaGVja2VkJywgJ2NoZWNrZWQnLCAnY3Jvc3NlZCcpO1xuICAgIGlmIChvcHRpb25zLmRlZmF1bHRTdGF0ZSA9PT0gJ2NoZWNrZWQnKSB7XG4gICAgICAgIHRyaXN0YXRlRG9tLmNsYXNzTGlzdC5hZGQoJ2NoZWNrZWQnKTtcbiAgICAgICAgaGlkZGVuSW5wdXQudmFsdWUgPSAndHJ1ZSc7XG4gICAgfVxuICAgIGVsc2UgaWYgKG9wdGlvbnMuZGVmYXVsdFN0YXRlID09PSAndW5jaGVja2VkJykge1xuICAgICAgICB0cmlzdGF0ZURvbS5jbGFzc0xpc3QuYWRkKCd1bmNoZWNrZWQnKTtcbiAgICAgICAgaGlkZGVuSW5wdXQucmVtb3ZlQXR0cmlidXRlKCduYW1lJyk7IC8vIEVuc3VyZSB0aGUgaGlkZGVuIGlucHV0IGRvZXNuJ3QgcG9zdCBhbnkgdmFsdWVcbiAgICAgICAgaGlkZGVuSW5wdXQucmVtb3ZlQXR0cmlidXRlKCd2YWx1ZScpOyAvLyBFbnN1cmUgdGhlIGhpZGRlbiBpbnB1dCBkb2Vzbid0IHBvc3QgYW55IHZhbHVlXG4gICAgfVxuICAgIGVsc2UgaWYgKG9wdGlvbnMuZGVmYXVsdFN0YXRlID09PSAnY3Jvc3NlZCcpIHtcbiAgICAgICAgdHJpc3RhdGVEb20uY2xhc3NMaXN0LmFkZCgnY3Jvc3NlZCcpO1xuICAgICAgICBoaWRkZW5JbnB1dC52YWx1ZSA9ICdmYWxzZSc7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBjb21wdXRlQ2xhc3NlcyhjbGFzc2VzKSB7XG4gICAgbGV0IGNvbXB1dGVkQ2xhc3NlcyA9IFtdO1xuICAgIGlmKHR5cGVvZiBjbGFzc2VzID09PSAnc3RyaW5nJykge1xuICAgICAgICAvL3JlcGxhY2UgbXVsdGlwbGUgd2hpdGUgc3BhY2VzIHdpdGggYSBzaW5nbGUgc3BhY2VcbiAgICAgICAgY2xhc3NlcyA9IGNsYXNzZXMucmVwbGFjZSgvXFxzXFxzKy9nLCAnICcpO1xuICAgICAgICBpZihjbGFzc2VzLmluZGV4T2YoJyAnKSA+IC0xKVxuICAgICAgICAgICAgY29tcHV0ZWRDbGFzc2VzID0gY2xhc3Nlcy5zcGxpdCgnICcpO1xuICAgICAgICBlbHNlIGlmKGNsYXNzZXMuaW5kZXhPZignLCcpID4gLTEpXG4gICAgICAgICAgICBjb21wdXRlZENsYXNzZXMgPSBjbGFzc2VzLnNwbGl0KCcsJyk7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIGNvbXB1dGVkQ2xhc3NlcyA9IFtjbGFzc2VzXTtcbiAgICB9XG4gICAgZWxzZSBpZihBcnJheS5pc0FycmF5KGNsYXNzZXMpKSB7XG4gICAgICAgIGNvbXB1dGVkQ2xhc3NlcyA9IGNsYXNzZXM7XG4gICAgfVxuICAgIHJldHVybiBjb21wdXRlZENsYXNzZXM7XG59XG5cbmZ1bmN0aW9uIHJlc29sdmVDb2xvcnMob3B0aW9ucykge1xuICAgIGNvbnN0IGMgPSBvcHRpb25zLmNvbG9ycyB8fCB7fTtcbiAgICByZXR1cm4ge1xuICAgICAgICB0aWNrOiBjLnRpY2sgIT0gbnVsbCA/IGMudGljayA6IG9wdGlvbnMudGlja0NvbG9yLFxuICAgICAgICBjaGVja2VkOiBjLmNoZWNrZWQgIT0gbnVsbCA/IGMuY2hlY2tlZCA6IG9wdGlvbnMuY2hlY2tlZENvbG9yLFxuICAgICAgICBjcm9zc2VkOiBjLmNyb3NzZWQgIT0gbnVsbCA/IGMuY3Jvc3NlZCA6IG9wdGlvbnMuY3Jvc3NlZENvbG9yXG4gICAgfTtcbn1cblxuZnVuY3Rpb24gYnViYmxlRXZlbnRzVG9PcmlnaW5hbENoZWNrYm94KG9wdGlvbnMsIGNoZWNrYm94RWxlbWVudCwgdHJpc3RhdGVEb20sIGhpZGRlbklucHV0LCBldmVudCkge1xuICAgIC8vaWYgb3B0aW9ucy5jYWxsYmFja3MuY2hhbmdlIGlzIHNldCwgY2FsbCBpdFxuICAgIGlmKG9wdGlvbnMuY2FsbGJhY2tzICYmIG9wdGlvbnMuY2FsbGJhY2tzLmNoYW5nZSAmJiB0eXBlb2Ygb3B0aW9ucy5jYWxsYmFja3MuY2hhbmdlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIG9wdGlvbnMuY2FsbGJhY2tzLmNoYW5nZShjaGVja2JveEVsZW1lbnQsIHRyaXN0YXRlRG9tLCBoaWRkZW5JbnB1dCk7XG4gICAgfVxuXG4gICAgaWYoIW9wdGlvbnMuYnViYmxlRXZlbnRzKSByZXR1cm47XG5cbiAgICBpZihldmVudC50eXBlID09PSAnY2xpY2snKSB7XG4gICAgICAgIGNoZWNrYm94RWxlbWVudC5kaXNwYXRjaEV2ZW50KG5ldyBNb3VzZUV2ZW50KCdjbGljaycsIHsgYnViYmxlczogdHJ1ZSwgY2FuY2VsYWJsZTogdHJ1ZSB9KSk7XG4gICAgfVxuICAgIGVsc2UgaWYoZXZlbnQudHlwZSA9PT0gJ2tleXVwJykge1xuICAgICAgICBjaGVja2JveEVsZW1lbnQuZGlzcGF0Y2hFdmVudChuZXcgS2V5Ym9hcmRFdmVudCgna2V5dXAnLCB7IGtleTogJyAnLCBidWJibGVzOiB0cnVlLCBjYW5jZWxhYmxlOiB0cnVlIH0pKTtcbiAgICB9XG4gICAgZWxzZSBpZihldmVudC50eXBlID09PSAnY2hhbmdlJykge1xuICAgICAgICBjaGVja2JveEVsZW1lbnQuZGlzcGF0Y2hFdmVudChuZXcgRXZlbnQoJ2NoYW5nZScsIHsgYnViYmxlczogdHJ1ZSwgY2FuY2VsYWJsZTogdHJ1ZSB9KSk7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBvbmtleXVwKGNoZWNrYm94RWxlbWVudCwgZXZlbnQpIHtcbiAgICBpZiAoZXZlbnQua2V5Q29kZSA9PT0gMzIpIHtcbiAgICAgICAgYnViYmxlRXZlbnRzVG9PcmlnaW5hbENoZWNrYm94KGNoZWNrYm94RWxlbWVudCwgZXZlbnQpO1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBldmVudC50YXJnZXQuY2xpY2soKTtcbiAgICB9XG59IiwiLy8gVGhlIG1vZHVsZSBjYWNoZVxudmFyIF9fd2VicGFja19tb2R1bGVfY2FjaGVfXyA9IHt9O1xuXG4vLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuXHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcblx0dmFyIGNhY2hlZE1vZHVsZSA9IF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF07XG5cdGlmIChjYWNoZWRNb2R1bGUgIT09IHVuZGVmaW5lZCkge1xuXHRcdHJldHVybiBjYWNoZWRNb2R1bGUuZXhwb3J0cztcblx0fVxuXHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuXHR2YXIgbW9kdWxlID0gX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXSA9IHtcblx0XHRpZDogbW9kdWxlSWQsXG5cdFx0Ly8gbm8gbW9kdWxlLmxvYWRlZCBuZWVkZWRcblx0XHRleHBvcnRzOiB7fVxuXHR9O1xuXG5cdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuXHRfX3dlYnBhY2tfbW9kdWxlc19fW21vZHVsZUlkXShtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcblxuXHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuXHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG59XG5cbi8vIGV4cG9zZSB0aGUgbW9kdWxlcyBvYmplY3QgKF9fd2VicGFja19tb2R1bGVzX18pXG5fX3dlYnBhY2tfcmVxdWlyZV9fLm0gPSBfX3dlYnBhY2tfbW9kdWxlc19fO1xuXG4iLCIvLyBnZXREZWZhdWx0RXhwb3J0IGZ1bmN0aW9uIGZvciBjb21wYXRpYmlsaXR5IHdpdGggbm9uLWhhcm1vbnkgbW9kdWxlc1xuX193ZWJwYWNrX3JlcXVpcmVfXy5uID0gKG1vZHVsZSkgPT4ge1xuXHR2YXIgZ2V0dGVyID0gbW9kdWxlICYmIG1vZHVsZS5fX2VzTW9kdWxlID9cblx0XHQoKSA9PiAobW9kdWxlWydkZWZhdWx0J10pIDpcblx0XHQoKSA9PiAobW9kdWxlKTtcblx0X193ZWJwYWNrX3JlcXVpcmVfXy5kKGdldHRlciwgeyBhOiBnZXR0ZXIgfSk7XG5cdHJldHVybiBnZXR0ZXI7XG59OyIsIi8vIGRlZmluZSBnZXR0ZXIgZnVuY3Rpb25zIGZvciBoYXJtb255IGV4cG9ydHNcbl9fd2VicGFja19yZXF1aXJlX18uZCA9IChleHBvcnRzLCBkZWZpbml0aW9uKSA9PiB7XG5cdGZvcih2YXIga2V5IGluIGRlZmluaXRpb24pIHtcblx0XHRpZihfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZGVmaW5pdGlvbiwga2V5KSAmJiAhX193ZWJwYWNrX3JlcXVpcmVfXy5vKGV4cG9ydHMsIGtleSkpIHtcblx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBrZXksIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBkZWZpbml0aW9uW2tleV0gfSk7XG5cdFx0fVxuXHR9XG59OyIsIl9fd2VicGFja19yZXF1aXJlX18ubyA9IChvYmosIHByb3ApID0+IChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBwcm9wKSkiLCIvLyBkZWZpbmUgX19lc01vZHVsZSBvbiBleHBvcnRzXG5fX3dlYnBhY2tfcmVxdWlyZV9fLnIgPSAoZXhwb3J0cykgPT4ge1xuXHRpZih0eXBlb2YgU3ltYm9sICE9PSAndW5kZWZpbmVkJyAmJiBTeW1ib2wudG9TdHJpbmdUYWcpIHtcblx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgU3ltYm9sLnRvU3RyaW5nVGFnLCB7IHZhbHVlOiAnTW9kdWxlJyB9KTtcblx0fVxuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pO1xufTsiLCJfX3dlYnBhY2tfcmVxdWlyZV9fLmIgPSBkb2N1bWVudC5iYXNlVVJJIHx8IHNlbGYubG9jYXRpb24uaHJlZjtcblxuLy8gb2JqZWN0IHRvIHN0b3JlIGxvYWRlZCBhbmQgbG9hZGluZyBjaHVua3Ncbi8vIHVuZGVmaW5lZCA9IGNodW5rIG5vdCBsb2FkZWQsIG51bGwgPSBjaHVuayBwcmVsb2FkZWQvcHJlZmV0Y2hlZFxuLy8gW3Jlc29sdmUsIHJlamVjdCwgUHJvbWlzZV0gPSBjaHVuayBsb2FkaW5nLCAwID0gY2h1bmsgbG9hZGVkXG52YXIgaW5zdGFsbGVkQ2h1bmtzID0ge1xuXHRcIm1haW5cIjogMFxufTtcblxuLy8gbm8gY2h1bmsgb24gZGVtYW5kIGxvYWRpbmdcblxuLy8gbm8gcHJlZmV0Y2hpbmdcblxuLy8gbm8gcHJlbG9hZGVkXG5cbi8vIG5vIEhNUlxuXG4vLyBubyBITVIgbWFuaWZlc3RcblxuLy8gbm8gb24gY2h1bmtzIGxvYWRlZFxuXG4vLyBubyBqc29ucCBmdW5jdGlvbiIsIl9fd2VicGFja19yZXF1aXJlX18ubmMgPSB1bmRlZmluZWQ7IiwiaW1wb3J0IGF1Z21lbnRXaXRoTGlzdGVuIGZyb20gJy4vbW9kdWxlcy9saXN0ZW4vbGlzdGVuLm1qcyc7XG5pbXBvcnQgYXVnbWVudFdpdGhUcmlzdGF0ZSBmcm9tICcuL21vZHVsZXMvdHJpc3RhdGUvdHJpc3RhdGUubWpzJztcbmltcG9ydCBhdWdtZW50V2l0aFNjcm9sbGFibGVUYWJsZSBmcm9tICcuL21vZHVsZXMvc2Nyb2xsYWJsZVRhYmxlL3Njcm9sbGFibGVUYWJsZS5tanMnO1xuaW1wb3J0IGRpYWxvZyBmcm9tICcuL21vZHVsZXMvZGlhbG9nL2RpYWxvZy5tanMnO1xuaW1wb3J0IHRvYXN0IGZyb20gJy4vbW9kdWxlcy90b2FzdC90b2FzdC5tanMnO1xuaW1wb3J0IHsgbG9hZENzcyB9IGZyb20gJy4vbW9kdWxlcy9jb21tb24ubWpzJztcbmltcG9ydCB7IGF1Z21lbnRXaXRoUGFjaywgdG9vbHMgfSBmcm9tICcuL21vZHVsZXMvdG9vbHMvZXhwb3J0cy5tanMnO1xuXG4vKipcbiAqIENyZWF0ZXMgYW4gQVBYIG9iamVjdCB0aGF0IHdyYXBzIG9uZSBvciBtb3JlIEhUTUwgZWxlbWVudHMuXG4gKiBAcGFyYW0ge3N0cmluZ3xIVE1MRWxlbWVudHxOb2RlTGlzdHxIVE1MQ29sbGVjdGlvbnxBcnJheTxIVE1MRWxlbWVudD58alF1ZXJ5fEZ1bmN0aW9ufSBpbnB1dCAtIFRoZSBpbnB1dCB0byBjcmVhdGUgdGhlIEFQWCBvYmplY3QgZnJvbS5cbiAqIEByZXR1cm5zIHtPYmplY3R9IFRoZSBBUFggb2JqZWN0LlxuICogQHRocm93cyB7RXJyb3J9IElmIHRoZSBpbnB1dCB0eXBlIGlzIGludmFsaWQuXG4gKiBAZXhhbXBsZVxuICogLy8gWFBhdGhcbiAqIGNvbnN0IGFweDEgPSBBUFgoJy8vZGl2W0BjbGFzcz1cImV4YW1wbGVcIl0nKTtcbiAqXG4gKiAvLyBDU1Mgc2VsZWN0b3JcbiAqIGNvbnN0IGFweDIgPSBBUFgoJy5leGFtcGxlJyk7XG4gKlxuICogLy8gU2luZ2xlIGVsZW1lbnRcbiAqIGNvbnN0IGVsZW1lbnQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuZXhhbXBsZScpO1xuICogY29uc3QgYXB4MyA9IEFQWChlbGVtZW50KTtcbiAqXG4gKiAvLyBOb2RlTGlzdCBvciBIVE1MQ29sbGVjdGlvblxuICogY29uc3Qgbm9kZUxpc3QgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuZXhhbXBsZScpO1xuICogY29uc3QgYXB4NCA9IEFQWChub2RlTGlzdCk7XG4gKlxuICogLy8gQXJyYXkgb2YgZWxlbWVudHNcbiAqIGNvbnN0IGVsZW1lbnRzID0gW2RvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5leGFtcGxlMScpLCBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuZXhhbXBsZTInKV07XG4gKiBjb25zdCBhcHg1ID0gQVBYKGVsZW1lbnRzKTtcbiAqXG4gKiAvLyBqUXVlcnkgb2JqZWN0XG4gKiBjb25zdCAkZXhhbXBsZSA9ICQoJy5leGFtcGxlJyk7XG4gKiBjb25zdCBhcHg2ID0gQVBYKCRleGFtcGxlKTtcbiAqXG4gKiAvLyBGdW5jdGlvbiByZXR1cm5pbmcgYW4gQVBYIG9iamVjdFxuICogY29uc3QgYXB4NyA9IEFQWCgoKSA9PiBBUFgoJy5leGFtcGxlJykpO1xuICovXG5jb25zdCBBUFggPSBmdW5jdGlvbiAoaW5wdXQsIGNvbnRleHQgPSBkb2N1bWVudCkge1xuICAgIGxldCBlbGVtZW50cztcblxuICAgIC8vIFZhbGlkYXRlIGNvbnRleHRcbiAgICBpZiAodHlwZW9mIGNvbnRleHQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIGNvbnRleHQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGNvbnRleHQpO1xuICAgIH1cbiAgICBlbHNlIGlmIChBUFguaXNBUFhPYmplY3QoY29udGV4dCkpIHtcbiAgICAgICAgY29udGV4dCA9IGNvbnRleHQuZmlyc3QoKTtcbiAgICB9IGVsc2UgaWYgKCEoY29udGV4dCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50IHx8IGNvbnRleHQgaW5zdGFuY2VvZiBEb2N1bWVudCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGNvbnRleHQgZm9yIEFQWCcpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgaW5wdXQgPT09ICdzdHJpbmcnICYmIGlucHV0LnN0YXJ0c1dpdGgoJy8vJykpIHtcbiAgICAgICAgLy8gWFBhdGggd2l0aCBjb250ZXh0XG4gICAgICAgIGVsZW1lbnRzID0gZG9jdW1lbnQuZXZhbHVhdGUoaW5wdXQsIGNvbnRleHQsIG51bGwsIFhQYXRoUmVzdWx0LkFOWV9UWVBFLCBudWxsKTtcbiAgICAgICAgbGV0IG5vZGVzID0gW107XG4gICAgICAgIGxldCBub2RlID0gZWxlbWVudHMuaXRlcmF0ZU5leHQoKTtcbiAgICAgICAgd2hpbGUgKG5vZGUpIHtcbiAgICAgICAgICAgIG5vZGVzLnB1c2gobm9kZSk7XG4gICAgICAgICAgICBub2RlID0gZWxlbWVudHMuaXRlcmF0ZU5leHQoKTtcbiAgICAgICAgfVxuICAgICAgICBlbGVtZW50cyA9IG5vZGVzO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIGlucHV0ID09PSAnc3RyaW5nJykge1xuICAgICAgICAvLyBDU1Mgc2VsZWN0b3Igd2l0aCBjb250ZXh0XG4gICAgICAgIGVsZW1lbnRzID0gY29udGV4dC5xdWVyeVNlbGVjdG9yQWxsKGlucHV0KTtcbiAgICB9IGVsc2UgaWYgKGlucHV0IGluc3RhbmNlb2YgSFRNTEVsZW1lbnQpIHtcbiAgICAgICAgLy8gU2luZ2xlIGVsZW1lbnQgd2l0aGluIGNvbnRleHRcbiAgICAgICAgZWxlbWVudHMgPSBjb250ZXh0LmNvbnRhaW5zKGlucHV0KSA/IFtpbnB1dF0gOiBbXTtcbiAgICB9IGVsc2UgaWYgKGlucHV0IGluc3RhbmNlb2YgTm9kZUxpc3QgfHwgaW5wdXQgaW5zdGFuY2VvZiBIVE1MQ29sbGVjdGlvbikge1xuICAgICAgICAvLyBOb2RlTGlzdCBvciBIVE1MQ29sbGVjdGlvbiB3aXRoaW4gY29udGV4dFxuICAgICAgICBlbGVtZW50cyA9IEFycmF5LmZyb20oaW5wdXQpLmZpbHRlcihlbCA9PiBjb250ZXh0LmNvbnRhaW5zKGVsKSk7XG4gICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KGlucHV0KSAmJiBpbnB1dC5ldmVyeShlbCA9PiBlbCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KSkge1xuICAgICAgICAvLyBBcnJheSBvZiBlbGVtZW50cyB3aXRoaW4gY29udGV4dFxuICAgICAgICBlbGVtZW50cyA9IGlucHV0LmZpbHRlcihlbCA9PiBjb250ZXh0LmNvbnRhaW5zKGVsKSk7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgalF1ZXJ5ICE9ICd1bmRlZmluZWQnICYmIGlucHV0IGluc3RhbmNlb2YgalF1ZXJ5KSB7XG4gICAgICAgIC8vIGpRdWVyeSBvYmplY3Qgd2l0aGluIGNvbnRleHRcbiAgICAgICAgZWxlbWVudHMgPSBBcnJheS5mcm9tKGlucHV0LmdldCgpKS5maWx0ZXIoZWwgPT4gY29udGV4dC5jb250YWlucyhlbCkpO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIGlucHV0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIC8vIEZ1bmN0aW9uIHJldHVybmluZyBhbiBBUFggb2JqZWN0IHdpdGggY29udGV4dFxuICAgICAgICBlbGVtZW50cyA9IEFQWChpbnB1dCgpLCBjb250ZXh0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgaW5wdXQgdHlwZSBmb3IgQVBYJyk7XG4gICAgfVxuXG4gICAgdmFyIGFweCA9IHtcbiAgICAgICAgZWxlbWVudHM6IGVsZW1lbnRzLFxuICAgICAgICBfaXNBUFhPYmplY3Q6IHRydWVcbiAgICB9O1xuICAgIGFweC5sZW5ndGggPSBlbGVtZW50cy5sZW5ndGg7XG4gICAgYXB4LmVhY2ggPSBmdW5jdGlvbiAoY2FsbGJhY2spIHtcbiAgICAgICAgaWYgKHRoaXMuZWxlbWVudHMgaW5zdGFuY2VvZiBBcnJheSkgdGhpcy5lbGVtZW50cy5mb3JFYWNoKGNhbGxiYWNrKTtcbiAgICAgICAgaWYgKHRoaXMuZWxlbWVudHMgaW5zdGFuY2VvZiBOb2RlTGlzdCkgQXJyYXkuZnJvbSh0aGlzLmVsZW1lbnRzKS5mb3JFYWNoKGNhbGxiYWNrKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcbiAgICBhcHguZ2V0ID0gZnVuY3Rpb24gKGluZGV4KSB7XG4gICAgICAgIHJldHVybiB0aGlzLmVsZW1lbnRzW2luZGV4XTtcbiAgICB9O1xuICAgIGFweC5hbGwgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICh0aGlzLmVsZW1lbnRzIGluc3RhbmNlb2YgQXJyYXkpIHJldHVybiB0aGlzLmVsZW1lbnRzO1xuICAgICAgICBpZiAodGhpcy5lbGVtZW50cyBpbnN0YW5jZW9mIE5vZGVMaXN0KSByZXR1cm4gQXJyYXkuZnJvbSh0aGlzLmVsZW1lbnRzKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcbiAgICBhcHguZmlyc3QgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldCgwKTtcbiAgICB9O1xuICAgIGF1Z21lbnRXaXRoTGlzdGVuKGFweCk7XG4gICAgYXVnbWVudFdpdGhUcmlzdGF0ZShhcHgpO1xuICAgIGF1Z21lbnRXaXRoU2Nyb2xsYWJsZVRhYmxlKGFweCk7XG4gICAgYXVnbWVudFdpdGhQYWNrKGFweCk7XG4gICAgcmV0dXJuIGFweDtcbn07XG5cbkFQWC5sb2FkQ3NzID0gbG9hZENzcztcbkFQWC5kaWFsb2cgPSBkaWFsb2c7XG5BUFgudG9hc3QgPSB0b2FzdDtcbkFQWC50b29scyA9IHRvb2xzO1xuQVBYLmlzQVBYT2JqZWN0ID0gZnVuY3Rpb24gKG9iaikge1xuICAgIHJldHVybiBvYmogJiYgb2JqLl9pc0FQWE9iamVjdCA9PT0gdHJ1ZTtcbn1cbkFQWC5pc19udW1lcmljID0gKG4pID0+IHtcbiAgICByZXR1cm4gIWlzTmFOKG4gLSBwYXJzZUZsb2F0KG4pKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgQVBYOyJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==
|