@appius-fr/apx 2.4.0 → 2.5.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/APX.mjs +2 -0
- package/README.md +35 -0
- package/dist/APX.dev.mjs +1189 -3
- package/dist/APX.mjs +1 -1
- package/dist/APX.prod.mjs +1 -1
- package/dist/APX.standalone.js +3170 -0
- package/dist/APX.standalone.js.map +1 -0
- package/modules/toast/README.md +127 -0
- package/modules/toast/css/toast.css +60 -0
- package/modules/toast/toast.mjs +1025 -0
- package/package.json +3 -2
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/toast/css/toast.css":
|
|
176
|
+
/*!***************************************************************************!*\
|
|
177
|
+
!*** ./node_modules/css-loader/dist/cjs.js!./modules/toast/css/toast.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-toast-container {
|
|
195
|
+
position: fixed;
|
|
196
|
+
display: flex;
|
|
197
|
+
flex-direction: column;
|
|
198
|
+
gap: var(--apx-toast-gap, 8px);
|
|
199
|
+
z-index: var(--apx-toast-z-index, 11000);
|
|
200
|
+
pointer-events: none;
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
.APX-toast-container--bottom-right { right: 12px; bottom: 12px; align-items: flex-end; }
|
|
204
|
+
.APX-toast-container--bottom-left { left: 12px; bottom: 12px; align-items: flex-start; }
|
|
205
|
+
.APX-toast-container--top-right { right: 12px; top: 12px; align-items: flex-end; }
|
|
206
|
+
.APX-toast-container--top-left { left: 12px; top: 12px; align-items: flex-start; }
|
|
207
|
+
|
|
208
|
+
.APX-toast {
|
|
209
|
+
min-width: var(--apx-toast-min-width, 260px);
|
|
210
|
+
max-width: var(--apx-toast-max-width, 420px);
|
|
211
|
+
font-size: var(--apx-toast-font-size, 14px);
|
|
212
|
+
border-radius: var(--apx-toast-radius, 6px);
|
|
213
|
+
box-shadow: var(--apx-toast-shadow, 0 6px 24px rgba(0,0,0,0.2));
|
|
214
|
+
padding: var(--apx-toast-padding, 10px 42px 10px 14px);
|
|
215
|
+
color: #111;
|
|
216
|
+
background: #eee;
|
|
217
|
+
pointer-events: auto;
|
|
218
|
+
position: relative;
|
|
219
|
+
transition: opacity 180ms ease, transform 180ms ease;
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
.APX-toast--info { background: var(--apx-toast-info-bg, #0dcaf0); color: var(--apx-toast-info-fg, #052c65); }
|
|
223
|
+
.APX-toast--success { background: var(--apx-toast-success-bg, #198754); color: var(--apx-toast-success-fg, #ffffff); }
|
|
224
|
+
.APX-toast--warning { background: var(--apx-toast-warning-bg, #ffc107); color: var(--apx-toast-warning-fg, #664d03); }
|
|
225
|
+
.APX-toast--danger { background: var(--apx-toast-danger-bg, #dc3545); color: var(--apx-toast-danger-fg, #ffffff); }
|
|
226
|
+
|
|
227
|
+
.APX-toast__content { line-height: 1.35; }
|
|
228
|
+
|
|
229
|
+
.APX-toast__close {
|
|
230
|
+
position: absolute;
|
|
231
|
+
top: 50%; right: 10px;
|
|
232
|
+
width: 24px; height: 24px;
|
|
233
|
+
transform: translateY(-50%);
|
|
234
|
+
display: inline-flex; align-items: center; justify-content: center;
|
|
235
|
+
background: transparent; color: currentColor;
|
|
236
|
+
border: 0; border-radius: 4px; padding: 0; margin: 0;
|
|
237
|
+
cursor: pointer; appearance: none; -webkit-appearance: none;
|
|
238
|
+
opacity: .75; transition: opacity 120ms ease;
|
|
239
|
+
}
|
|
240
|
+
.APX-toast__close:hover { opacity: 1; }
|
|
241
|
+
.APX-toast__close:focus { outline: 2px solid rgba(0,0,0,.2); outline-offset: 2px; }
|
|
242
|
+
.APX-toast__close::before {
|
|
243
|
+
content: '×';
|
|
244
|
+
font-size: 16px; line-height: 1; text-align: center;
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
/* Animations */
|
|
248
|
+
.APX-toast--enter { opacity: 0; transform: translateY(8px); }
|
|
249
|
+
.APX-toast--enter.APX-toast--enter-active { opacity: 1; transform: translateY(0); }
|
|
250
|
+
.APX-toast--exit { opacity: 1; transform: translateY(0); }
|
|
251
|
+
.APX-toast--exit.APX-toast--exit-active { opacity: 0; transform: translateY(8px); }
|
|
252
|
+
|
|
253
|
+
|
|
254
|
+
`, "",{"version":3,"sources":["webpack://./modules/toast/css/toast.css"],"names":[],"mappings":"AAAA;IACI,eAAe;IACf,aAAa;IACb,sBAAsB;IACtB,8BAA8B;IAC9B,wCAAwC;IACxC,oBAAoB;AACxB;;AAEA,qCAAqC,WAAW,EAAE,YAAY,EAAE,qBAAqB,EAAE;AACvF,oCAAoC,UAAU,EAAE,YAAY,EAAE,uBAAuB,EAAE;AACvF,kCAAkC,WAAW,EAAE,SAAS,EAAE,qBAAqB,EAAE;AACjF,iCAAiC,UAAU,EAAE,SAAS,EAAE,uBAAuB,EAAE;;AAEjF;IACI,4CAA4C;IAC5C,4CAA4C;IAC5C,2CAA2C;IAC3C,2CAA2C;IAC3C,+DAA+D;IAC/D,sDAAsD;IACtD,WAAW;IACX,gBAAgB;IAChB,oBAAoB;IACpB,kBAAkB;IAClB,oDAAoD;AACxD;;AAEA,mBAAmB,6CAA6C,EAAE,wCAAwC,EAAE;AAC5G,sBAAsB,gDAAgD,EAAE,2CAA2C,EAAE;AACrH,sBAAsB,gDAAgD,EAAE,2CAA2C,EAAE;AACrH,qBAAqB,+CAA+C,EAAE,0CAA0C,EAAE;;AAElH,sBAAsB,iBAAiB,EAAE;;AAEzC;IACI,kBAAkB;IAClB,QAAQ,EAAE,WAAW;IACrB,WAAW,EAAE,YAAY;IACzB,2BAA2B;IAC3B,oBAAoB,EAAE,mBAAmB,EAAE,uBAAuB;IAClE,uBAAuB,EAAE,mBAAmB;IAC5C,SAAS,EAAE,kBAAkB,EAAE,UAAU,EAAE,SAAS;IACpD,eAAe,EAAE,gBAAgB,EAAE,wBAAwB;IAC3D,YAAY,EAAE,8BAA8B;AAChD;AACA,0BAA0B,UAAU,EAAE;AACtC,0BAA0B,iCAAiC,EAAE,mBAAmB,EAAE;AAClF;IACI,YAAY;IACZ,eAAe,EAAE,cAAc,EAAE,kBAAkB;AACvD;;AAEA,eAAe;AACf,oBAAoB,UAAU,EAAE,0BAA0B,EAAE;AAC5D,4CAA4C,UAAU,EAAE,wBAAwB,EAAE;AAClF,mBAAmB,UAAU,EAAE,wBAAwB,EAAE;AACzD,0CAA0C,UAAU,EAAE,0BAA0B,EAAE","sourcesContent":[".APX-toast-container {\r\n position: fixed;\r\n display: flex;\r\n flex-direction: column;\r\n gap: var(--apx-toast-gap, 8px);\r\n z-index: var(--apx-toast-z-index, 11000);\r\n pointer-events: none;\r\n}\r\n\r\n.APX-toast-container--bottom-right { right: 12px; bottom: 12px; align-items: flex-end; }\r\n.APX-toast-container--bottom-left { left: 12px; bottom: 12px; align-items: flex-start; }\r\n.APX-toast-container--top-right { right: 12px; top: 12px; align-items: flex-end; }\r\n.APX-toast-container--top-left { left: 12px; top: 12px; align-items: flex-start; }\r\n\r\n.APX-toast {\r\n min-width: var(--apx-toast-min-width, 260px);\r\n max-width: var(--apx-toast-max-width, 420px);\r\n font-size: var(--apx-toast-font-size, 14px);\r\n border-radius: var(--apx-toast-radius, 6px);\r\n box-shadow: var(--apx-toast-shadow, 0 6px 24px rgba(0,0,0,0.2));\r\n padding: var(--apx-toast-padding, 10px 42px 10px 14px);\r\n color: #111;\r\n background: #eee;\r\n pointer-events: auto;\r\n position: relative;\r\n transition: opacity 180ms ease, transform 180ms ease;\r\n}\r\n\r\n.APX-toast--info { background: var(--apx-toast-info-bg, #0dcaf0); color: var(--apx-toast-info-fg, #052c65); }\r\n.APX-toast--success { background: var(--apx-toast-success-bg, #198754); color: var(--apx-toast-success-fg, #ffffff); }\r\n.APX-toast--warning { background: var(--apx-toast-warning-bg, #ffc107); color: var(--apx-toast-warning-fg, #664d03); }\r\n.APX-toast--danger { background: var(--apx-toast-danger-bg, #dc3545); color: var(--apx-toast-danger-fg, #ffffff); }\r\n\r\n.APX-toast__content { line-height: 1.35; }\r\n\r\n.APX-toast__close {\r\n position: absolute;\r\n top: 50%; right: 10px;\r\n width: 24px; height: 24px;\r\n transform: translateY(-50%);\r\n display: inline-flex; align-items: center; justify-content: center;\r\n background: transparent; color: currentColor;\r\n border: 0; border-radius: 4px; padding: 0; margin: 0;\r\n cursor: pointer; appearance: none; -webkit-appearance: none;\r\n opacity: .75; transition: opacity 120ms ease;\r\n}\r\n.APX-toast__close:hover { opacity: 1; }\r\n.APX-toast__close:focus { outline: 2px solid rgba(0,0,0,.2); outline-offset: 2px; }\r\n.APX-toast__close::before {\r\n content: '×';\r\n font-size: 16px; line-height: 1; text-align: center;\r\n}\r\n\r\n/* Animations */\r\n.APX-toast--enter { opacity: 0; transform: translateY(8px); }\r\n.APX-toast--enter.APX-toast--enter-active { opacity: 1; transform: translateY(0); }\r\n.APX-toast--exit { opacity: 1; transform: translateY(0); }\r\n.APX-toast--exit.APX-toast--exit-active { opacity: 0; transform: translateY(8px); }\r\n\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/tristate/css/tristate.css":
|
|
@@ -450,6 +536,60 @@ var update = _node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js
|
|
|
450
536
|
/* 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);
|
|
451
537
|
|
|
452
538
|
|
|
539
|
+
/***/ }),
|
|
540
|
+
|
|
541
|
+
/***/ "./modules/toast/css/toast.css":
|
|
542
|
+
/*!*************************************!*\
|
|
543
|
+
!*** ./modules/toast/css/toast.css ***!
|
|
544
|
+
\*************************************/
|
|
545
|
+
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|
546
|
+
|
|
547
|
+
__webpack_require__.r(__webpack_exports__);
|
|
548
|
+
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
|
549
|
+
/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
|
|
550
|
+
/* harmony export */ });
|
|
551
|
+
/* 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");
|
|
552
|
+
/* 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__);
|
|
553
|
+
/* 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");
|
|
554
|
+
/* 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__);
|
|
555
|
+
/* 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");
|
|
556
|
+
/* 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__);
|
|
557
|
+
/* 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");
|
|
558
|
+
/* 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__);
|
|
559
|
+
/* 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");
|
|
560
|
+
/* 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__);
|
|
561
|
+
/* 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");
|
|
562
|
+
/* 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__);
|
|
563
|
+
/* harmony import */ var _node_modules_css_loader_dist_cjs_js_toast_css__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! !!../../../node_modules/css-loader/dist/cjs.js!./toast.css */ "./node_modules/css-loader/dist/cjs.js!./modules/toast/css/toast.css");
|
|
564
|
+
|
|
565
|
+
|
|
566
|
+
|
|
567
|
+
|
|
568
|
+
|
|
569
|
+
|
|
570
|
+
|
|
571
|
+
|
|
572
|
+
|
|
573
|
+
|
|
574
|
+
|
|
575
|
+
var options = {};
|
|
576
|
+
|
|
577
|
+
options.styleTagTransform = (_node_modules_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5___default());
|
|
578
|
+
options.setAttributes = (_node_modules_style_loader_dist_runtime_setAttributesWithoutAttributes_js__WEBPACK_IMPORTED_MODULE_3___default());
|
|
579
|
+
|
|
580
|
+
options.insert = _node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2___default().bind(null, "head");
|
|
581
|
+
|
|
582
|
+
options.domAPI = (_node_modules_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1___default());
|
|
583
|
+
options.insertStyleElement = (_node_modules_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4___default());
|
|
584
|
+
|
|
585
|
+
var update = _node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0___default()(_node_modules_css_loader_dist_cjs_js_toast_css__WEBPACK_IMPORTED_MODULE_6__["default"], options);
|
|
586
|
+
|
|
587
|
+
|
|
588
|
+
|
|
589
|
+
|
|
590
|
+
/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (_node_modules_css_loader_dist_cjs_js_toast_css__WEBPACK_IMPORTED_MODULE_6__["default"] && _node_modules_css_loader_dist_cjs_js_toast_css__WEBPACK_IMPORTED_MODULE_6__["default"].locals ? _node_modules_css_loader_dist_cjs_js_toast_css__WEBPACK_IMPORTED_MODULE_6__["default"].locals : undefined);
|
|
591
|
+
|
|
592
|
+
|
|
453
593
|
/***/ }),
|
|
454
594
|
|
|
455
595
|
/***/ "./modules/tristate/css/tristate.css":
|
|
@@ -1320,6 +1460,1049 @@ function closest(element, selector) {
|
|
|
1320
1460
|
}
|
|
1321
1461
|
|
|
1322
1462
|
|
|
1463
|
+
/***/ }),
|
|
1464
|
+
|
|
1465
|
+
/***/ "./modules/toast/toast.mjs":
|
|
1466
|
+
/*!*********************************!*\
|
|
1467
|
+
!*** ./modules/toast/toast.mjs ***!
|
|
1468
|
+
\*********************************/
|
|
1469
|
+
/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
|
|
1470
|
+
|
|
1471
|
+
__webpack_require__.r(__webpack_exports__);
|
|
1472
|
+
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
|
1473
|
+
/* harmony export */ ToastManager: () => (/* binding */ ToastManager),
|
|
1474
|
+
/* harmony export */ createToastManager: () => (/* binding */ createToastManager),
|
|
1475
|
+
/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__),
|
|
1476
|
+
/* harmony export */ toast: () => (/* binding */ toast)
|
|
1477
|
+
/* harmony export */ });
|
|
1478
|
+
/* harmony import */ var _css_toast_css__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./css/toast.css */ "./modules/toast/css/toast.css");
|
|
1479
|
+
// Minimal, framework-agnostic ToastManager for APX
|
|
1480
|
+
// ESM-first, no side effects on import. DOM only when used.
|
|
1481
|
+
|
|
1482
|
+
|
|
1483
|
+
/**
|
|
1484
|
+
* @typedef {Object} PositionObject
|
|
1485
|
+
* @property {'sticky'|'relative'|'anchored'} [type]
|
|
1486
|
+
* @property {string} [x]
|
|
1487
|
+
* @property {string} [y]
|
|
1488
|
+
* @property {HTMLElement} [element]
|
|
1489
|
+
* @property {'top'|'right'|'bottom'|'left'|'above'|'below'|'before'|'after'} [placement]
|
|
1490
|
+
* @property {string} [gap]
|
|
1491
|
+
* @property {boolean} [useNativeCSS]
|
|
1492
|
+
*/
|
|
1493
|
+
|
|
1494
|
+
/**
|
|
1495
|
+
* @typedef {string|PositionObject} Position
|
|
1496
|
+
*/
|
|
1497
|
+
|
|
1498
|
+
/**
|
|
1499
|
+
* @typedef {Object} ToastConfig
|
|
1500
|
+
* @property {Position} [position]
|
|
1501
|
+
* @property {'up'|'down'|'auto'} [flow] Flow direction for stacking toasts. 'auto' determines based on position. Default: 'auto'
|
|
1502
|
+
* @property {number} [maxToasts]
|
|
1503
|
+
* @property {number} [defaultDurationMs]
|
|
1504
|
+
* @property {number} [zIndex]
|
|
1505
|
+
* @property {'polite'|'assertive'|'off'} [ariaLive]
|
|
1506
|
+
* @property {number} [gap]
|
|
1507
|
+
* @property {boolean} [dedupe]
|
|
1508
|
+
* @property {string} [containerClass]
|
|
1509
|
+
* @property {number} [offset]
|
|
1510
|
+
* @property {string} [id]
|
|
1511
|
+
*/
|
|
1512
|
+
|
|
1513
|
+
/**
|
|
1514
|
+
* @typedef {Object} ToastOptions
|
|
1515
|
+
* @property {string|Node} message
|
|
1516
|
+
* @property {'info'|'success'|'warning'|'danger'} [type]
|
|
1517
|
+
* @property {number} [durationMs]
|
|
1518
|
+
* @property {boolean} [dismissible]
|
|
1519
|
+
* @property {string} [id]
|
|
1520
|
+
* @property {(ref: ToastRef, ev: MouseEvent) => void} [onClick]
|
|
1521
|
+
* @property {(ref: ToastRef, reason: 'timeout'|'close'|'api'|'overflow') => void} [onClose]
|
|
1522
|
+
* @property {string} [className]
|
|
1523
|
+
* @property {Position} [position]
|
|
1524
|
+
* @property {'up'|'down'|'auto'} [flow] Flow direction for stacking toasts. 'auto' determines based on position. Default: 'auto'
|
|
1525
|
+
*/
|
|
1526
|
+
|
|
1527
|
+
/**
|
|
1528
|
+
* @typedef {Object} ToastRef
|
|
1529
|
+
* @property {string} id
|
|
1530
|
+
* @property {HTMLElement} el
|
|
1531
|
+
* @property {(reason?: 'api'|'close') => void} close
|
|
1532
|
+
* @property {(partial: Partial<ToastOptions>) => void} update
|
|
1533
|
+
* @property {() => Promise<void>} whenClosed
|
|
1534
|
+
* @property {(event: 'close'|'click', handler: Function) => () => void} on
|
|
1535
|
+
* @property {(event: 'close'|'click', handler: Function) => void} off
|
|
1536
|
+
*/
|
|
1537
|
+
|
|
1538
|
+
const isBrowser = typeof window !== 'undefined' && typeof document !== 'undefined';
|
|
1539
|
+
|
|
1540
|
+
// Shared container cache: Map<position, HTMLElement>
|
|
1541
|
+
// Containers are shared between managers with the same position
|
|
1542
|
+
const _containerCache = new Map();
|
|
1543
|
+
|
|
1544
|
+
// Garbage collection: cleanup empty unmanaged containers after a delay
|
|
1545
|
+
const GC_DELAY_MS = 20000; // 20 seconds
|
|
1546
|
+
let _gcTimeoutId = null;
|
|
1547
|
+
|
|
1548
|
+
// Wrapper for all toast containers (keeps DOM clean)
|
|
1549
|
+
let _toastWrapper = null;
|
|
1550
|
+
|
|
1551
|
+
/**
|
|
1552
|
+
* Get or create the toast containers wrapper
|
|
1553
|
+
* @returns {HTMLElement|null}
|
|
1554
|
+
*/
|
|
1555
|
+
function getToastWrapper() {
|
|
1556
|
+
if (!isBrowser) return null;
|
|
1557
|
+
|
|
1558
|
+
if (!_toastWrapper) {
|
|
1559
|
+
_toastWrapper = document.querySelector('.APX-toast-wrapper');
|
|
1560
|
+
if (!_toastWrapper) {
|
|
1561
|
+
_toastWrapper = createEl('div', 'APX-toast-wrapper');
|
|
1562
|
+
_toastWrapper.style.position = 'fixed';
|
|
1563
|
+
_toastWrapper.style.top = '0';
|
|
1564
|
+
_toastWrapper.style.left = '0';
|
|
1565
|
+
_toastWrapper.style.width = '0';
|
|
1566
|
+
_toastWrapper.style.height = '0';
|
|
1567
|
+
_toastWrapper.style.pointerEvents = 'none';
|
|
1568
|
+
_toastWrapper.style.zIndex = '10000'; // Below containers but above most content
|
|
1569
|
+
document.body.appendChild(_toastWrapper);
|
|
1570
|
+
}
|
|
1571
|
+
}
|
|
1572
|
+
|
|
1573
|
+
return _toastWrapper;
|
|
1574
|
+
}
|
|
1575
|
+
|
|
1576
|
+
const DEFAULT_CONFIG = {
|
|
1577
|
+
position: 'bottom-right',
|
|
1578
|
+
maxToasts: 5,
|
|
1579
|
+
defaultDurationMs: 5000,
|
|
1580
|
+
zIndex: 11000,
|
|
1581
|
+
ariaLive: 'polite',
|
|
1582
|
+
gap: 8,
|
|
1583
|
+
dedupe: false,
|
|
1584
|
+
containerClass: '',
|
|
1585
|
+
offset: 0
|
|
1586
|
+
};
|
|
1587
|
+
|
|
1588
|
+
/**
|
|
1589
|
+
* Create an element with classes
|
|
1590
|
+
*/
|
|
1591
|
+
function createEl(tag, classNames) {
|
|
1592
|
+
const el = document.createElement(tag);
|
|
1593
|
+
if (classNames) {
|
|
1594
|
+
classNames.split(' ').filter(Boolean).forEach(c => el.classList.add(c));
|
|
1595
|
+
}
|
|
1596
|
+
return el;
|
|
1597
|
+
}
|
|
1598
|
+
|
|
1599
|
+
/**
|
|
1600
|
+
* Normalize placement synonyms to CSS values
|
|
1601
|
+
* @param {string} placement
|
|
1602
|
+
* @returns {'top'|'right'|'bottom'|'left'}
|
|
1603
|
+
*/
|
|
1604
|
+
function normalizePlacement(placement) {
|
|
1605
|
+
const synonyms = {
|
|
1606
|
+
'above': 'top',
|
|
1607
|
+
'below': 'bottom',
|
|
1608
|
+
'before': 'left',
|
|
1609
|
+
'after': 'right'
|
|
1610
|
+
};
|
|
1611
|
+
return synonyms[placement] || placement;
|
|
1612
|
+
}
|
|
1613
|
+
|
|
1614
|
+
/**
|
|
1615
|
+
* Determine flow direction based on position
|
|
1616
|
+
* @param {Position} position
|
|
1617
|
+
* @returns {'up'|'down'}
|
|
1618
|
+
*/
|
|
1619
|
+
function determineFlow(position) {
|
|
1620
|
+
if (typeof position === 'string') {
|
|
1621
|
+
// String positions: top = up, bottom = down
|
|
1622
|
+
if (position.includes('top')) return 'up';
|
|
1623
|
+
if (position.includes('bottom')) return 'down';
|
|
1624
|
+
return 'down'; // default
|
|
1625
|
+
}
|
|
1626
|
+
|
|
1627
|
+
if (typeof position === 'object' && position !== null) {
|
|
1628
|
+
const type = position.type || (position.x || position.y ? 'sticky' : null);
|
|
1629
|
+
|
|
1630
|
+
if (type === 'sticky' || (!type && (position.x || position.y))) {
|
|
1631
|
+
// Sticky: determine based on y coordinate
|
|
1632
|
+
if (position.y !== undefined) {
|
|
1633
|
+
// If y starts with '-' or is a small value, likely top (up)
|
|
1634
|
+
// If y is a large value or percentage, likely bottom (down)
|
|
1635
|
+
if (position.y.startsWith('-')) {
|
|
1636
|
+
// Negative = from bottom, so flow down
|
|
1637
|
+
return 'down';
|
|
1638
|
+
}
|
|
1639
|
+
const num = parseFloat(position.y);
|
|
1640
|
+
if (!isNaN(num)) {
|
|
1641
|
+
// If y < 50% of viewport height, likely top (up)
|
|
1642
|
+
// Otherwise likely bottom (down)
|
|
1643
|
+
if (position.y.includes('%')) {
|
|
1644
|
+
return num < 50 ? 'up' : 'down';
|
|
1645
|
+
}
|
|
1646
|
+
// For px values, assume < 400px is top (up)
|
|
1647
|
+
return num < 400 ? 'up' : 'down';
|
|
1648
|
+
}
|
|
1649
|
+
}
|
|
1650
|
+
return 'down'; // default
|
|
1651
|
+
}
|
|
1652
|
+
|
|
1653
|
+
if (type === 'anchored' && position.placement) {
|
|
1654
|
+
// Anchored: placement determines flow
|
|
1655
|
+
const placement = normalizePlacement(position.placement);
|
|
1656
|
+
if (placement === 'top' || placement === 'above') return 'up';
|
|
1657
|
+
if (placement === 'bottom' || placement === 'below') return 'down';
|
|
1658
|
+
// For left/right, default to down
|
|
1659
|
+
return 'down';
|
|
1660
|
+
}
|
|
1661
|
+
|
|
1662
|
+
if (type === 'relative') {
|
|
1663
|
+
// Relative: determine based on y offset
|
|
1664
|
+
if (position.y !== undefined) {
|
|
1665
|
+
const num = parseFloat(position.y);
|
|
1666
|
+
if (!isNaN(num)) {
|
|
1667
|
+
// Negative y = above element = flow up
|
|
1668
|
+
// Positive y = below element = flow down
|
|
1669
|
+
return num < 0 ? 'up' : 'down';
|
|
1670
|
+
}
|
|
1671
|
+
}
|
|
1672
|
+
return 'down'; // default
|
|
1673
|
+
}
|
|
1674
|
+
}
|
|
1675
|
+
|
|
1676
|
+
return 'down'; // default
|
|
1677
|
+
}
|
|
1678
|
+
|
|
1679
|
+
/**
|
|
1680
|
+
* Garbage collection: remove empty unmanaged containers
|
|
1681
|
+
*/
|
|
1682
|
+
function cleanupEmptyContainers() {
|
|
1683
|
+
if (!isBrowser) return;
|
|
1684
|
+
|
|
1685
|
+
const containers = document.querySelectorAll('.APX-toast-container:not([data-apx-toast-managed="true"])');
|
|
1686
|
+
containers.forEach(container => {
|
|
1687
|
+
// Check if container is empty (no toasts)
|
|
1688
|
+
if (container.children.length === 0) {
|
|
1689
|
+
const positionKey = container.getAttribute('data-apx-toast-position');
|
|
1690
|
+
if (positionKey) {
|
|
1691
|
+
_containerCache.delete(positionKey);
|
|
1692
|
+
}
|
|
1693
|
+
container.remove();
|
|
1694
|
+
}
|
|
1695
|
+
});
|
|
1696
|
+
|
|
1697
|
+
// Clean up wrapper if it's empty (all containers removed)
|
|
1698
|
+
if (_toastWrapper && _toastWrapper.children.length === 0) {
|
|
1699
|
+
_toastWrapper.remove();
|
|
1700
|
+
_toastWrapper = null;
|
|
1701
|
+
}
|
|
1702
|
+
|
|
1703
|
+
_gcTimeoutId = null;
|
|
1704
|
+
}
|
|
1705
|
+
|
|
1706
|
+
/**
|
|
1707
|
+
* Schedule garbage collection for empty unmanaged containers
|
|
1708
|
+
*/
|
|
1709
|
+
function scheduleGarbageCollection() {
|
|
1710
|
+
if (_gcTimeoutId) {
|
|
1711
|
+
clearTimeout(_gcTimeoutId);
|
|
1712
|
+
}
|
|
1713
|
+
_gcTimeoutId = setTimeout(cleanupEmptyContainers, GC_DELAY_MS);
|
|
1714
|
+
}
|
|
1715
|
+
|
|
1716
|
+
/**
|
|
1717
|
+
* Find all scrollable parent elements
|
|
1718
|
+
* @param {HTMLElement} element
|
|
1719
|
+
* @returns {HTMLElement[]}
|
|
1720
|
+
*/
|
|
1721
|
+
function findScrollableParents(element) {
|
|
1722
|
+
const scrollables = [];
|
|
1723
|
+
let current = element.parentElement;
|
|
1724
|
+
|
|
1725
|
+
while (current && current !== document.body && current !== document.documentElement) {
|
|
1726
|
+
const style = window.getComputedStyle(current);
|
|
1727
|
+
const overflow = style.overflow + style.overflowY + style.overflowX;
|
|
1728
|
+
|
|
1729
|
+
if (overflow.includes('scroll') || overflow.includes('auto')) {
|
|
1730
|
+
scrollables.push(current);
|
|
1731
|
+
}
|
|
1732
|
+
|
|
1733
|
+
current = current.parentElement;
|
|
1734
|
+
}
|
|
1735
|
+
|
|
1736
|
+
return scrollables;
|
|
1737
|
+
}
|
|
1738
|
+
|
|
1739
|
+
/**
|
|
1740
|
+
* Hash an element to create a unique identifier
|
|
1741
|
+
* @param {HTMLElement} el
|
|
1742
|
+
* @returns {string}
|
|
1743
|
+
*/
|
|
1744
|
+
function hashElement(el) {
|
|
1745
|
+
const rect = el.getBoundingClientRect();
|
|
1746
|
+
const str = `${el.tagName}_${rect.left}_${rect.top}_${rect.width}_${rect.height}`;
|
|
1747
|
+
let hash = 0;
|
|
1748
|
+
for (let i = 0; i < str.length; i++) {
|
|
1749
|
+
const char = str.charCodeAt(i);
|
|
1750
|
+
hash = ((hash << 5) - hash) + char;
|
|
1751
|
+
hash = hash & hash; // Convert to 32bit integer
|
|
1752
|
+
}
|
|
1753
|
+
return Math.abs(hash).toString(36);
|
|
1754
|
+
}
|
|
1755
|
+
|
|
1756
|
+
/**
|
|
1757
|
+
* Serialize position options into a unique key
|
|
1758
|
+
* @param {Position} position
|
|
1759
|
+
* @returns {string}
|
|
1760
|
+
*/
|
|
1761
|
+
function serializePosition(position) {
|
|
1762
|
+
if (typeof position === 'string') {
|
|
1763
|
+
return `s:${position}`;
|
|
1764
|
+
}
|
|
1765
|
+
|
|
1766
|
+
if (typeof position === 'object' && position !== null) {
|
|
1767
|
+
const parts = [];
|
|
1768
|
+
|
|
1769
|
+
// Type (default: sticky if x/y provided)
|
|
1770
|
+
const type = position.type || (position.x || position.y ? 'sticky' : null);
|
|
1771
|
+
if (type) parts.push(`t:${type}`);
|
|
1772
|
+
|
|
1773
|
+
// Coordinates
|
|
1774
|
+
if (position.x !== undefined) parts.push(`x:${position.x}`);
|
|
1775
|
+
if (position.y !== undefined) parts.push(`y:${position.y}`);
|
|
1776
|
+
|
|
1777
|
+
// For relative/anchored: use element ID or hash
|
|
1778
|
+
if (position.element) {
|
|
1779
|
+
const elementId = position.element.id ||
|
|
1780
|
+
position.element.dataset?.apxToastAnchorId ||
|
|
1781
|
+
`el_${hashElement(position.element)}`;
|
|
1782
|
+
parts.push(`el:${elementId}`);
|
|
1783
|
+
}
|
|
1784
|
+
|
|
1785
|
+
if (position.placement) {
|
|
1786
|
+
// Normalize placement for serialization (use CSS values)
|
|
1787
|
+
const normalized = normalizePlacement(position.placement);
|
|
1788
|
+
parts.push(`p:${normalized}`);
|
|
1789
|
+
}
|
|
1790
|
+
if (position.gap !== undefined) parts.push(`g:${position.gap}`);
|
|
1791
|
+
if (position.useNativeCSS) parts.push(`native:true`);
|
|
1792
|
+
|
|
1793
|
+
return `o:${parts.join('|')}`;
|
|
1794
|
+
}
|
|
1795
|
+
|
|
1796
|
+
return 's:bottom-right';
|
|
1797
|
+
}
|
|
1798
|
+
|
|
1799
|
+
/**
|
|
1800
|
+
* ToastManager class
|
|
1801
|
+
*/
|
|
1802
|
+
class ToastManager {
|
|
1803
|
+
/** @param {Partial<ToastConfig>=} config */
|
|
1804
|
+
constructor(config) {
|
|
1805
|
+
/** @type {ToastConfig} */
|
|
1806
|
+
this.config = { ...DEFAULT_CONFIG, ...(config || {}) };
|
|
1807
|
+
/** @type {HTMLElement|null} */
|
|
1808
|
+
this.container = null;
|
|
1809
|
+
/** @type {Map<string, ToastRef>} */
|
|
1810
|
+
this.idToRef = new Map();
|
|
1811
|
+
/** @type {ToastRef[]} */
|
|
1812
|
+
this.open = [];
|
|
1813
|
+
}
|
|
1814
|
+
|
|
1815
|
+
/** @param {Partial<ToastConfig>} config */
|
|
1816
|
+
configure(config) {
|
|
1817
|
+
this.config = { ...this.config, ...(config || {}) };
|
|
1818
|
+
if (this.container) this.applyContainerConfig();
|
|
1819
|
+
}
|
|
1820
|
+
|
|
1821
|
+
/** @param {'polite'|'assertive'|'off'} mode */
|
|
1822
|
+
setAriaLive(mode) { this.configure({ ariaLive: mode }); }
|
|
1823
|
+
|
|
1824
|
+
/** @returns {ToastRef[]} */
|
|
1825
|
+
getOpenToasts() { return this.open.slice(); }
|
|
1826
|
+
|
|
1827
|
+
/** @param {ToastOptions} opts */
|
|
1828
|
+
show(opts) {
|
|
1829
|
+
if (!isBrowser) return /** @type {any} */(null);
|
|
1830
|
+
const options = this.normalizeOptions(opts);
|
|
1831
|
+
|
|
1832
|
+
if (this.config.dedupe && options.id && this.idToRef.has(options.id)) {
|
|
1833
|
+
const ref = this.idToRef.get(options.id);
|
|
1834
|
+
ref.update(options);
|
|
1835
|
+
return ref;
|
|
1836
|
+
}
|
|
1837
|
+
|
|
1838
|
+
// Determine position and flow for this toast (options take precedence over config)
|
|
1839
|
+
const position = options.position || this.config.position || 'bottom-right';
|
|
1840
|
+
const flow = options.flow !== undefined ? options.flow : (this.config.flow !== undefined ? this.config.flow : 'auto');
|
|
1841
|
+
const finalFlow = flow === 'auto' ? determineFlow(position) : flow;
|
|
1842
|
+
|
|
1843
|
+
// Ensure default container is set (for backward compatibility)
|
|
1844
|
+
this.ensureContainer();
|
|
1845
|
+
|
|
1846
|
+
const toastEl = createEl('div', `APX-toast APX-toast--${options.type}`);
|
|
1847
|
+
toastEl.setAttribute('role', 'status');
|
|
1848
|
+
// Priority: options.id > config.id > auto-generated
|
|
1849
|
+
const toastId = options.id || `t_${Date.now()}_${Math.random().toString(36).slice(2, 8)}`;
|
|
1850
|
+
toastEl.dataset.toastId = toastId;
|
|
1851
|
+
if (options.className) toastEl.className += ` ${options.className}`;
|
|
1852
|
+
|
|
1853
|
+
const contentEl = createEl('div', 'APX-toast__content');
|
|
1854
|
+
if (typeof options.message === 'string') {
|
|
1855
|
+
contentEl.textContent = options.message;
|
|
1856
|
+
} else if (options.message) {
|
|
1857
|
+
contentEl.appendChild(options.message);
|
|
1858
|
+
}
|
|
1859
|
+
toastEl.appendChild(contentEl);
|
|
1860
|
+
|
|
1861
|
+
let closeBtn = null;
|
|
1862
|
+
if (options.dismissible !== false) {
|
|
1863
|
+
closeBtn = createEl('button', 'APX-toast__close');
|
|
1864
|
+
closeBtn.setAttribute('aria-label', 'Close');
|
|
1865
|
+
closeBtn.type = 'button';
|
|
1866
|
+
toastEl.appendChild(closeBtn);
|
|
1867
|
+
}
|
|
1868
|
+
|
|
1869
|
+
// Get or create container for this specific position
|
|
1870
|
+
let container = null;
|
|
1871
|
+
let positionUpdateFn = null;
|
|
1872
|
+
let positionCleanup = null;
|
|
1873
|
+
let originalElementStyle = null;
|
|
1874
|
+
|
|
1875
|
+
if (position && typeof position === 'object' && position !== null) {
|
|
1876
|
+
const type = position.type || (position.x || position.y ? 'sticky' : null);
|
|
1877
|
+
|
|
1878
|
+
if (position.useNativeCSS && (type === 'relative' || type === 'anchored') && position.element) {
|
|
1879
|
+
// useNativeCSS: true - create container in target element using native CSS
|
|
1880
|
+
const targetEl = position.element;
|
|
1881
|
+
originalElementStyle = targetEl.style.position;
|
|
1882
|
+
targetEl.style.position = 'relative';
|
|
1883
|
+
|
|
1884
|
+
// Create a container for stacking toasts (reuse if exists)
|
|
1885
|
+
const positionKey = serializePosition(position);
|
|
1886
|
+
let nativeContainer = targetEl.querySelector(`[data-apx-toast-position="${positionKey}"]`);
|
|
1887
|
+
if (!nativeContainer) {
|
|
1888
|
+
nativeContainer = createEl('div', 'APX-toast-container APX-toast-container-native');
|
|
1889
|
+
nativeContainer.setAttribute('data-apx-toast-position', positionKey);
|
|
1890
|
+
nativeContainer.style.position = 'absolute';
|
|
1891
|
+
nativeContainer.style.zIndex = String(this.config.zIndex);
|
|
1892
|
+
nativeContainer.style.gap = `${this.config.gap}px`;
|
|
1893
|
+
nativeContainer.setAttribute('aria-live', String(this.config.ariaLive));
|
|
1894
|
+
nativeContainer.style.flexDirection = finalFlow === 'up' ? 'column-reverse' : 'column';
|
|
1895
|
+
|
|
1896
|
+
// Apply positioning to container
|
|
1897
|
+
if (type === 'relative') {
|
|
1898
|
+
// Relative: use x/y directly
|
|
1899
|
+
if (position.x !== undefined) {
|
|
1900
|
+
if (position.x.startsWith('-')) {
|
|
1901
|
+
nativeContainer.style.right = position.x.substring(1);
|
|
1902
|
+
} else {
|
|
1903
|
+
nativeContainer.style.left = position.x;
|
|
1904
|
+
}
|
|
1905
|
+
}
|
|
1906
|
+
if (position.y !== undefined) {
|
|
1907
|
+
if (position.y.startsWith('-')) {
|
|
1908
|
+
nativeContainer.style.bottom = position.y.substring(1);
|
|
1909
|
+
} else {
|
|
1910
|
+
nativeContainer.style.top = position.y;
|
|
1911
|
+
}
|
|
1912
|
+
}
|
|
1913
|
+
} else if (type === 'anchored') {
|
|
1914
|
+
// Anchored: position outside the element using 100% (element size) + gap
|
|
1915
|
+
const placement = normalizePlacement(position.placement);
|
|
1916
|
+
const gap = position.gap || '1em';
|
|
1917
|
+
|
|
1918
|
+
switch (placement) {
|
|
1919
|
+
case 'top':
|
|
1920
|
+
nativeContainer.style.bottom = `calc(100% + ${gap})`;
|
|
1921
|
+
nativeContainer.style.left = '0';
|
|
1922
|
+
break;
|
|
1923
|
+
case 'bottom':
|
|
1924
|
+
nativeContainer.style.top = `calc(100% + ${gap})`;
|
|
1925
|
+
nativeContainer.style.left = '0';
|
|
1926
|
+
break;
|
|
1927
|
+
case 'left':
|
|
1928
|
+
nativeContainer.style.right = `calc(100% + ${gap})`;
|
|
1929
|
+
nativeContainer.style.top = '0';
|
|
1930
|
+
break;
|
|
1931
|
+
case 'right':
|
|
1932
|
+
nativeContainer.style.left = `calc(100% + ${gap})`;
|
|
1933
|
+
nativeContainer.style.top = '0';
|
|
1934
|
+
break;
|
|
1935
|
+
}
|
|
1936
|
+
}
|
|
1937
|
+
|
|
1938
|
+
targetEl.appendChild(nativeContainer);
|
|
1939
|
+
} else {
|
|
1940
|
+
// Update flow direction if container exists
|
|
1941
|
+
nativeContainer.style.flexDirection = finalFlow === 'up' ? 'column-reverse' : 'column';
|
|
1942
|
+
}
|
|
1943
|
+
|
|
1944
|
+
container = nativeContainer;
|
|
1945
|
+
|
|
1946
|
+
positionCleanup = () => {
|
|
1947
|
+
if (targetEl && targetEl.parentElement) {
|
|
1948
|
+
targetEl.style.position = originalElementStyle || '';
|
|
1949
|
+
// Remove native container if empty
|
|
1950
|
+
if (nativeContainer && nativeContainer.children.length === 0) {
|
|
1951
|
+
const positionKey = nativeContainer.getAttribute('data-apx-toast-position');
|
|
1952
|
+
if (positionKey) {
|
|
1953
|
+
_containerCache.delete(positionKey);
|
|
1954
|
+
}
|
|
1955
|
+
nativeContainer.remove();
|
|
1956
|
+
}
|
|
1957
|
+
}
|
|
1958
|
+
};
|
|
1959
|
+
} else {
|
|
1960
|
+
// Default: get or create container for this position
|
|
1961
|
+
container = this.getContainerForPosition(position, finalFlow);
|
|
1962
|
+
|
|
1963
|
+
const updateContainerPosition = () => {
|
|
1964
|
+
const styles = this.calculatePosition(position, container);
|
|
1965
|
+
Object.assign(container.style, styles);
|
|
1966
|
+
};
|
|
1967
|
+
|
|
1968
|
+
updateContainerPosition();
|
|
1969
|
+
|
|
1970
|
+
// For relative/anchored, listen to scroll/resize
|
|
1971
|
+
if ((type === 'relative' || type === 'anchored') && position.element) {
|
|
1972
|
+
let rafId = null;
|
|
1973
|
+
let lastUpdate = 0;
|
|
1974
|
+
const throttleMs = 16; // ~60fps
|
|
1975
|
+
|
|
1976
|
+
const throttledUpdate = () => {
|
|
1977
|
+
const now = Date.now();
|
|
1978
|
+
if (now - lastUpdate < throttleMs) {
|
|
1979
|
+
if (rafId) cancelAnimationFrame(rafId);
|
|
1980
|
+
rafId = requestAnimationFrame(() => {
|
|
1981
|
+
updateContainerPosition();
|
|
1982
|
+
lastUpdate = Date.now();
|
|
1983
|
+
});
|
|
1984
|
+
} else {
|
|
1985
|
+
updateContainerPosition();
|
|
1986
|
+
lastUpdate = now;
|
|
1987
|
+
}
|
|
1988
|
+
};
|
|
1989
|
+
|
|
1990
|
+
// Find all scrollable parents
|
|
1991
|
+
const scrollableParents = findScrollableParents(position.element);
|
|
1992
|
+
|
|
1993
|
+
// Listen to scroll on window and all scrollable parents
|
|
1994
|
+
window.addEventListener('scroll', throttledUpdate, { passive: true });
|
|
1995
|
+
window.addEventListener('resize', throttledUpdate, { passive: true });
|
|
1996
|
+
|
|
1997
|
+
// Listen to scroll on all scrollable parent elements
|
|
1998
|
+
scrollableParents.forEach(parent => {
|
|
1999
|
+
parent.addEventListener('scroll', throttledUpdate, { passive: true });
|
|
2000
|
+
});
|
|
2001
|
+
|
|
2002
|
+
// Watch for element removal
|
|
2003
|
+
const observer = new MutationObserver(() => {
|
|
2004
|
+
if (!position.element.parentElement) {
|
|
2005
|
+
ref.close('api');
|
|
2006
|
+
}
|
|
2007
|
+
});
|
|
2008
|
+
observer.observe(document.body, { childList: true, subtree: true });
|
|
2009
|
+
|
|
2010
|
+
positionUpdateFn = updateContainerPosition;
|
|
2011
|
+
positionCleanup = () => {
|
|
2012
|
+
window.removeEventListener('scroll', throttledUpdate);
|
|
2013
|
+
window.removeEventListener('resize', throttledUpdate);
|
|
2014
|
+
scrollableParents.forEach(parent => {
|
|
2015
|
+
parent.removeEventListener('scroll', throttledUpdate);
|
|
2016
|
+
});
|
|
2017
|
+
observer.disconnect();
|
|
2018
|
+
if (rafId) cancelAnimationFrame(rafId);
|
|
2019
|
+
};
|
|
2020
|
+
}
|
|
2021
|
+
}
|
|
2022
|
+
} else {
|
|
2023
|
+
// String position - get or create container for this position
|
|
2024
|
+
container = this.getContainerForPosition(position, finalFlow);
|
|
2025
|
+
}
|
|
2026
|
+
|
|
2027
|
+
// Append toast to the appropriate container
|
|
2028
|
+
if (container) {
|
|
2029
|
+
container.appendChild(toastEl);
|
|
2030
|
+
} else {
|
|
2031
|
+
// Fallback to default container
|
|
2032
|
+
this.container.appendChild(toastEl);
|
|
2033
|
+
}
|
|
2034
|
+
|
|
2035
|
+
// Enter animation
|
|
2036
|
+
toastEl.classList.add('APX-toast--enter');
|
|
2037
|
+
requestAnimationFrame(() => {
|
|
2038
|
+
toastEl.classList.add('APX-toast--enter-active');
|
|
2039
|
+
});
|
|
2040
|
+
|
|
2041
|
+
// Event handling and timers
|
|
2042
|
+
let remaining = options.durationMs;
|
|
2043
|
+
let timerId = null;
|
|
2044
|
+
let startTs = null;
|
|
2045
|
+
const handlers = { click: new Set(), close: new Set() };
|
|
2046
|
+
|
|
2047
|
+
const startTimer = () => {
|
|
2048
|
+
if (!remaining || remaining <= 0) return; // sticky
|
|
2049
|
+
startTs = Date.now();
|
|
2050
|
+
timerId = window.setTimeout(() => ref.close('timeout'), remaining);
|
|
2051
|
+
};
|
|
2052
|
+
const pauseTimer = () => {
|
|
2053
|
+
if (timerId != null) {
|
|
2054
|
+
window.clearTimeout(timerId);
|
|
2055
|
+
timerId = null;
|
|
2056
|
+
if (startTs != null) remaining -= (Date.now() - startTs);
|
|
2057
|
+
}
|
|
2058
|
+
};
|
|
2059
|
+
|
|
2060
|
+
/** @type {ToastRef} */
|
|
2061
|
+
const ref = {
|
|
2062
|
+
id: toastId,
|
|
2063
|
+
el: toastEl,
|
|
2064
|
+
close: (reason) => {
|
|
2065
|
+
cleanup(reason || 'api');
|
|
2066
|
+
},
|
|
2067
|
+
update: (partial) => {
|
|
2068
|
+
const merged = this.normalizeOptions({ ...options, ...partial });
|
|
2069
|
+
// update content
|
|
2070
|
+
if (typeof merged.message === 'string') {
|
|
2071
|
+
contentEl.textContent = merged.message;
|
|
2072
|
+
} else if (merged.message) {
|
|
2073
|
+
contentEl.innerHTML = '';
|
|
2074
|
+
contentEl.appendChild(merged.message);
|
|
2075
|
+
}
|
|
2076
|
+
// update type class
|
|
2077
|
+
['info','success','warning','danger'].forEach(t => toastEl.classList.remove(`APX-toast--${t}`));
|
|
2078
|
+
toastEl.classList.add(`APX-toast--${merged.type}`);
|
|
2079
|
+
// update classes
|
|
2080
|
+
if (options.className !== merged.className) {
|
|
2081
|
+
if (options.className) toastEl.classList.remove(...options.className.split(' ').filter(Boolean));
|
|
2082
|
+
if (merged.className) toastEl.classList.add(...merged.className.split(' ').filter(Boolean));
|
|
2083
|
+
}
|
|
2084
|
+
// update duration logic
|
|
2085
|
+
options.durationMs = merged.durationMs;
|
|
2086
|
+
remaining = merged.durationMs;
|
|
2087
|
+
pauseTimer();
|
|
2088
|
+
startTimer();
|
|
2089
|
+
},
|
|
2090
|
+
whenClosed: () => closedPromise,
|
|
2091
|
+
on: (event, handler) => { handlers[event].add(handler); return () => ref.off(event, handler); },
|
|
2092
|
+
off: (event, handler) => { handlers[event].delete(handler); }
|
|
2093
|
+
};
|
|
2094
|
+
|
|
2095
|
+
const notify = (event, arg) => handlers[event].forEach(fn => { try { fn(arg); } catch (_) {} });
|
|
2096
|
+
|
|
2097
|
+
const closedPromise = new Promise(resolve => {
|
|
2098
|
+
const finish = (reason) => {
|
|
2099
|
+
notify('close', reason);
|
|
2100
|
+
if (typeof options.onClose === 'function') {
|
|
2101
|
+
try { options.onClose(ref, reason); } catch(_){}
|
|
2102
|
+
}
|
|
2103
|
+
resolve();
|
|
2104
|
+
};
|
|
2105
|
+
|
|
2106
|
+
const cleanup = (reason) => {
|
|
2107
|
+
if (!toastEl) return;
|
|
2108
|
+
pauseTimer();
|
|
2109
|
+
|
|
2110
|
+
// Cleanup position listeners and restore styles
|
|
2111
|
+
if (positionCleanup) {
|
|
2112
|
+
positionCleanup();
|
|
2113
|
+
positionCleanup = null;
|
|
2114
|
+
}
|
|
2115
|
+
|
|
2116
|
+
// If overflow, remove immediately to enforce hard cap
|
|
2117
|
+
if (reason === 'overflow') {
|
|
2118
|
+
if (toastEl.parentElement) toastEl.parentElement.removeChild(toastEl);
|
|
2119
|
+
const idx = this.open.indexOf(ref);
|
|
2120
|
+
if (idx >= 0) this.open.splice(idx, 1);
|
|
2121
|
+
this.idToRef.delete(toastId);
|
|
2122
|
+
finish(reason);
|
|
2123
|
+
return;
|
|
2124
|
+
}
|
|
2125
|
+
|
|
2126
|
+
// Otherwise, animate out
|
|
2127
|
+
toastEl.classList.add('APX-toast--exit');
|
|
2128
|
+
requestAnimationFrame(() => toastEl.classList.add('APX-toast--exit-active'));
|
|
2129
|
+
|
|
2130
|
+
const removeEl = () => {
|
|
2131
|
+
toastEl.removeEventListener('transitionend', removeEl);
|
|
2132
|
+
if (toastEl.parentElement) toastEl.parentElement.removeChild(toastEl);
|
|
2133
|
+
const idx = this.open.indexOf(ref);
|
|
2134
|
+
if (idx >= 0) this.open.splice(idx, 1);
|
|
2135
|
+
this.idToRef.delete(toastId);
|
|
2136
|
+
|
|
2137
|
+
// Schedule garbage collection for unmanaged containers
|
|
2138
|
+
scheduleGarbageCollection();
|
|
2139
|
+
|
|
2140
|
+
finish(reason);
|
|
2141
|
+
};
|
|
2142
|
+
toastEl.addEventListener('transitionend', removeEl);
|
|
2143
|
+
};
|
|
2144
|
+
|
|
2145
|
+
// attach close behavior
|
|
2146
|
+
ref.close = (reason) => cleanup(reason || 'api');
|
|
2147
|
+
});
|
|
2148
|
+
|
|
2149
|
+
// Click handling
|
|
2150
|
+
toastEl.addEventListener('click', (ev) => {
|
|
2151
|
+
notify('click', ev);
|
|
2152
|
+
if (typeof options.onClick === 'function') {
|
|
2153
|
+
try { options.onClick(ref, ev); } catch(_){}
|
|
2154
|
+
}
|
|
2155
|
+
});
|
|
2156
|
+
|
|
2157
|
+
// Hover pause
|
|
2158
|
+
toastEl.addEventListener('mouseenter', pauseTimer);
|
|
2159
|
+
toastEl.addEventListener('mouseleave', () => startTimer());
|
|
2160
|
+
|
|
2161
|
+
if (closeBtn) closeBtn.addEventListener('click', (ev) => { ev.stopPropagation(); ref.close('close'); });
|
|
2162
|
+
|
|
2163
|
+
// Track
|
|
2164
|
+
this.open.push(ref);
|
|
2165
|
+
this.idToRef.set(toastId, ref);
|
|
2166
|
+
|
|
2167
|
+
// Overflow policy
|
|
2168
|
+
if (this.open.length > this.config.maxToasts) {
|
|
2169
|
+
const oldest = this.open[0];
|
|
2170
|
+
oldest.close('overflow');
|
|
2171
|
+
}
|
|
2172
|
+
|
|
2173
|
+
startTimer();
|
|
2174
|
+
return ref;
|
|
2175
|
+
}
|
|
2176
|
+
|
|
2177
|
+
/**
|
|
2178
|
+
* Convenience helpers
|
|
2179
|
+
*/
|
|
2180
|
+
info(message, opts) { return this.show({ ...(opts||{}), message, type: 'info' }); }
|
|
2181
|
+
success(message, opts) { return this.show({ ...(opts||{}), message, type: 'success' }); }
|
|
2182
|
+
warning(message, opts) { return this.show({ ...(opts||{}), message, type: 'warning' }); }
|
|
2183
|
+
danger(message, opts) { return this.show({ ...(opts||{}), message, type: 'danger' }); }
|
|
2184
|
+
|
|
2185
|
+
/** @param {'api'|'overflow'} [reason] */
|
|
2186
|
+
closeAll(reason) {
|
|
2187
|
+
// copy to avoid mutation during iteration
|
|
2188
|
+
const all = this.open.slice();
|
|
2189
|
+
all.forEach(r => r.close(reason || 'api'));
|
|
2190
|
+
}
|
|
2191
|
+
|
|
2192
|
+
/** @param {ToastOptions} opts */
|
|
2193
|
+
normalizeOptions(opts) {
|
|
2194
|
+
const o = { ...opts };
|
|
2195
|
+
if (!o.type) o.type = 'info';
|
|
2196
|
+
if (typeof o.dismissible !== 'boolean') o.dismissible = true;
|
|
2197
|
+
if (typeof o.durationMs !== 'number') o.durationMs = this.config.defaultDurationMs;
|
|
2198
|
+
// Use id from options if provided, otherwise use id from config, otherwise undefined (will be auto-generated)
|
|
2199
|
+
if (!o.id && this.config.id) o.id = this.config.id;
|
|
2200
|
+
return o;
|
|
2201
|
+
}
|
|
2202
|
+
|
|
2203
|
+
/**
|
|
2204
|
+
* Find or create a container for a specific position
|
|
2205
|
+
* @param {Position} position
|
|
2206
|
+
* @param {'up'|'down'} [flow] Flow direction (already determined, not 'auto')
|
|
2207
|
+
* @param {boolean} [managed] Whether this container is managed by a manager (default: false)
|
|
2208
|
+
* @returns {HTMLElement|null}
|
|
2209
|
+
*/
|
|
2210
|
+
getContainerForPosition(position, flow, managed = false) {
|
|
2211
|
+
if (!isBrowser) return null;
|
|
2212
|
+
|
|
2213
|
+
const positionKey = serializePosition(position);
|
|
2214
|
+
|
|
2215
|
+
// Flow should already be determined ('up' or 'down'), but fallback to auto if needed
|
|
2216
|
+
const finalFlow = flow && flow !== 'auto' ? flow : determineFlow(position);
|
|
2217
|
+
|
|
2218
|
+
// 1. Check memory cache
|
|
2219
|
+
let c = _containerCache.get(positionKey);
|
|
2220
|
+
|
|
2221
|
+
// 2. If not in cache, search in DOM by data attribute
|
|
2222
|
+
if (!c && isBrowser) {
|
|
2223
|
+
c = document.querySelector(`[data-apx-toast-position="${positionKey}"]`);
|
|
2224
|
+
if (c) {
|
|
2225
|
+
_containerCache.set(positionKey, c);
|
|
2226
|
+
}
|
|
2227
|
+
}
|
|
2228
|
+
|
|
2229
|
+
// 3. If still not found, create new container
|
|
2230
|
+
if (!c) {
|
|
2231
|
+
c = createEl('div', 'APX-toast-container');
|
|
2232
|
+
c.setAttribute('data-apx-toast-position', positionKey);
|
|
2233
|
+
|
|
2234
|
+
// Mark as managed if created by a manager
|
|
2235
|
+
if (managed) {
|
|
2236
|
+
c.setAttribute('data-apx-toast-managed', 'true');
|
|
2237
|
+
}
|
|
2238
|
+
|
|
2239
|
+
// Determine position class (for CSS)
|
|
2240
|
+
const posClass = typeof position === 'string'
|
|
2241
|
+
? position
|
|
2242
|
+
: (position.type || 'bottom-right');
|
|
2243
|
+
c.classList.add(`APX-toast-container--${posClass}`);
|
|
2244
|
+
c.setAttribute('aria-live', String(this.config.ariaLive));
|
|
2245
|
+
c.style.zIndex = String(this.config.zIndex);
|
|
2246
|
+
c.style.gap = `${this.config.gap}px`;
|
|
2247
|
+
|
|
2248
|
+
// Apply flow direction
|
|
2249
|
+
c.style.flexDirection = finalFlow === 'up' ? 'column-reverse' : 'column';
|
|
2250
|
+
|
|
2251
|
+
// Apply position styles if object position
|
|
2252
|
+
if (typeof position === 'object' && position !== null) {
|
|
2253
|
+
c.style.position = 'fixed';
|
|
2254
|
+
const styles = this.calculatePosition(position, c);
|
|
2255
|
+
Object.assign(c.style, styles);
|
|
2256
|
+
}
|
|
2257
|
+
|
|
2258
|
+
// Append to wrapper for clean DOM organization
|
|
2259
|
+
const wrapper = getToastWrapper();
|
|
2260
|
+
if (wrapper) {
|
|
2261
|
+
wrapper.appendChild(c);
|
|
2262
|
+
} else {
|
|
2263
|
+
document.body.appendChild(c);
|
|
2264
|
+
}
|
|
2265
|
+
_containerCache.set(positionKey, c);
|
|
2266
|
+
} else {
|
|
2267
|
+
// Update flow direction if container exists (may be shared)
|
|
2268
|
+
c.style.flexDirection = finalFlow === 'up' ? 'column-reverse' : 'column';
|
|
2269
|
+
|
|
2270
|
+
// If container exists and is now managed, mark it
|
|
2271
|
+
if (managed && !c.hasAttribute('data-apx-toast-managed')) {
|
|
2272
|
+
c.setAttribute('data-apx-toast-managed', 'true');
|
|
2273
|
+
}
|
|
2274
|
+
}
|
|
2275
|
+
|
|
2276
|
+
return c;
|
|
2277
|
+
}
|
|
2278
|
+
|
|
2279
|
+
ensureContainer() {
|
|
2280
|
+
if (this.container || !isBrowser) return;
|
|
2281
|
+
|
|
2282
|
+
const position = this.config.position || 'bottom-right';
|
|
2283
|
+
const flow = this.config.flow !== undefined ? this.config.flow : 'auto';
|
|
2284
|
+
// Containers created by ensureContainer are managed
|
|
2285
|
+
this.container = this.getContainerForPosition(position, flow, true);
|
|
2286
|
+
this.applyContainerConfig();
|
|
2287
|
+
}
|
|
2288
|
+
|
|
2289
|
+
applyContainerConfig() {
|
|
2290
|
+
if (!this.container) return;
|
|
2291
|
+
const position = this.config.position || 'bottom-right';
|
|
2292
|
+
const pos = typeof position === 'string' ? position : (position.type || 'bottom-right');
|
|
2293
|
+
|
|
2294
|
+
// Apply styles (these may be overridden by other managers sharing the container)
|
|
2295
|
+
this.container.style.zIndex = String(this.config.zIndex);
|
|
2296
|
+
this.container.style.gap = `${this.config.gap}px`;
|
|
2297
|
+
this.container.setAttribute('aria-live', String(this.config.ariaLive));
|
|
2298
|
+
|
|
2299
|
+
// Update position class (only for string positions)
|
|
2300
|
+
if (typeof position === 'string') {
|
|
2301
|
+
const posClasses = ['bottom-right','bottom-left','top-right','top-left'].map(p => `APX-toast-container--${p}`);
|
|
2302
|
+
this.container.classList.remove(...posClasses);
|
|
2303
|
+
this.container.classList.add(`APX-toast-container--${pos}`);
|
|
2304
|
+
}
|
|
2305
|
+
|
|
2306
|
+
// Apply container class if specified
|
|
2307
|
+
if (this.config.containerClass) {
|
|
2308
|
+
this.config.containerClass.split(' ').filter(Boolean).forEach(cls => {
|
|
2309
|
+
this.container.classList.add(cls);
|
|
2310
|
+
});
|
|
2311
|
+
}
|
|
2312
|
+
|
|
2313
|
+
// Apply offset (only for string positions)
|
|
2314
|
+
if (typeof position === 'string') {
|
|
2315
|
+
if (this.config.offset) {
|
|
2316
|
+
const offset = `${this.config.offset}px`;
|
|
2317
|
+
if (pos.includes('bottom')) this.container.style.bottom = offset;
|
|
2318
|
+
else this.container.style.top = offset;
|
|
2319
|
+
if (pos.includes('right')) this.container.style.right = offset;
|
|
2320
|
+
else this.container.style.left = offset;
|
|
2321
|
+
} else {
|
|
2322
|
+
// Reset offset if not specified
|
|
2323
|
+
if (pos.includes('bottom')) this.container.style.bottom = '';
|
|
2324
|
+
else this.container.style.top = '';
|
|
2325
|
+
if (pos.includes('right')) this.container.style.right = '';
|
|
2326
|
+
else this.container.style.left = '';
|
|
2327
|
+
}
|
|
2328
|
+
} else if (typeof position === 'object' && position !== null) {
|
|
2329
|
+
// For object positions, ensure container has position: fixed
|
|
2330
|
+
this.container.style.position = 'fixed';
|
|
2331
|
+
}
|
|
2332
|
+
}
|
|
2333
|
+
|
|
2334
|
+
/**
|
|
2335
|
+
* Calculate position for a container based on position config
|
|
2336
|
+
* @param {Position} position
|
|
2337
|
+
* @param {HTMLElement} containerEl
|
|
2338
|
+
* @returns {{left?: string, top?: string, right?: string, bottom?: string}}
|
|
2339
|
+
*/
|
|
2340
|
+
calculatePosition(position, containerEl) {
|
|
2341
|
+
if (typeof position === 'string') {
|
|
2342
|
+
// String positions are handled by container CSS
|
|
2343
|
+
return {};
|
|
2344
|
+
}
|
|
2345
|
+
|
|
2346
|
+
if (typeof position === 'object' && position !== null) {
|
|
2347
|
+
const type = position.type || (position.x || position.y ? 'sticky' : null);
|
|
2348
|
+
|
|
2349
|
+
if (type === 'sticky' || (!type && (position.x || position.y))) {
|
|
2350
|
+
// Sticky: fixed position relative to viewport
|
|
2351
|
+
const styles = {};
|
|
2352
|
+
if (position.x !== undefined) {
|
|
2353
|
+
if (position.x.startsWith('-')) {
|
|
2354
|
+
styles.right = position.x.substring(1);
|
|
2355
|
+
} else {
|
|
2356
|
+
styles.left = position.x;
|
|
2357
|
+
}
|
|
2358
|
+
}
|
|
2359
|
+
if (position.y !== undefined) {
|
|
2360
|
+
if (position.y.startsWith('-')) {
|
|
2361
|
+
styles.bottom = position.y.substring(1);
|
|
2362
|
+
} else {
|
|
2363
|
+
styles.top = position.y;
|
|
2364
|
+
}
|
|
2365
|
+
}
|
|
2366
|
+
return styles;
|
|
2367
|
+
}
|
|
2368
|
+
|
|
2369
|
+
if (type === 'relative' && position.element) {
|
|
2370
|
+
// Relative: position relative to element with x/y offset
|
|
2371
|
+
// Use fixed positioning, so getBoundingClientRect() is relative to viewport
|
|
2372
|
+
const rect = position.element.getBoundingClientRect();
|
|
2373
|
+
|
|
2374
|
+
// Parse x/y offsets (can be px, em, etc.)
|
|
2375
|
+
const parseOffset = (val) => {
|
|
2376
|
+
if (!val) return 0;
|
|
2377
|
+
const num = parseFloat(val);
|
|
2378
|
+
if (val.includes('em')) {
|
|
2379
|
+
// Convert em to px (approximate: 1em = 16px)
|
|
2380
|
+
return num * 16;
|
|
2381
|
+
}
|
|
2382
|
+
return num;
|
|
2383
|
+
};
|
|
2384
|
+
|
|
2385
|
+
const offsetX = parseOffset(position.x || '0');
|
|
2386
|
+
const offsetY = parseOffset(position.y || '0');
|
|
2387
|
+
|
|
2388
|
+
const styles = {
|
|
2389
|
+
left: `${rect.left + offsetX}px`,
|
|
2390
|
+
top: `${rect.top + offsetY}px`
|
|
2391
|
+
};
|
|
2392
|
+
return styles;
|
|
2393
|
+
}
|
|
2394
|
+
|
|
2395
|
+
if (type === 'anchored' && position.element) {
|
|
2396
|
+
// Anchored: position relative to element with placement
|
|
2397
|
+
const rect = position.element.getBoundingClientRect();
|
|
2398
|
+
const gap = position.gap || '1em';
|
|
2399
|
+
|
|
2400
|
+
// Parse gap (can be px, em, etc.)
|
|
2401
|
+
const parseGap = (val) => {
|
|
2402
|
+
const num = parseFloat(val);
|
|
2403
|
+
if (val.includes('em')) {
|
|
2404
|
+
return num * 16; // Approximate: 1em = 16px
|
|
2405
|
+
}
|
|
2406
|
+
return num;
|
|
2407
|
+
};
|
|
2408
|
+
|
|
2409
|
+
const gapPx = parseGap(gap);
|
|
2410
|
+
const styles = {};
|
|
2411
|
+
|
|
2412
|
+
// Normalize placement synonyms (above/below/before/after) to CSS values
|
|
2413
|
+
const placement = normalizePlacement(position.placement);
|
|
2414
|
+
|
|
2415
|
+
switch (placement) {
|
|
2416
|
+
case 'top':
|
|
2417
|
+
// Toast above element: bottom of toast = top of element - gap
|
|
2418
|
+
// bottom = viewport height - (element top - gap) = viewport height - element top + gap
|
|
2419
|
+
styles.bottom = `${window.innerHeight - rect.top + gapPx}px`;
|
|
2420
|
+
styles.left = `${rect.left}px`;
|
|
2421
|
+
break;
|
|
2422
|
+
case 'bottom':
|
|
2423
|
+
// Toast below element: top of toast = bottom of element + gap
|
|
2424
|
+
styles.top = `${rect.bottom + gapPx}px`;
|
|
2425
|
+
styles.left = `${rect.left}px`;
|
|
2426
|
+
break;
|
|
2427
|
+
case 'left':
|
|
2428
|
+
// Toast to the left: right of toast = left of element - gap
|
|
2429
|
+
styles.right = `${window.innerWidth - rect.left + gapPx}px`;
|
|
2430
|
+
styles.top = `${rect.top}px`;
|
|
2431
|
+
break;
|
|
2432
|
+
case 'right':
|
|
2433
|
+
// Toast to the right: left of toast = right of element + gap
|
|
2434
|
+
styles.left = `${rect.right + gapPx}px`;
|
|
2435
|
+
styles.top = `${rect.top}px`;
|
|
2436
|
+
break;
|
|
2437
|
+
}
|
|
2438
|
+
return styles;
|
|
2439
|
+
}
|
|
2440
|
+
}
|
|
2441
|
+
|
|
2442
|
+
return {};
|
|
2443
|
+
}
|
|
2444
|
+
}
|
|
2445
|
+
|
|
2446
|
+
/**
|
|
2447
|
+
* @param {Partial<ToastConfig>=} config
|
|
2448
|
+
* @returns {ToastManager}
|
|
2449
|
+
*/
|
|
2450
|
+
function createToastManager(config) {
|
|
2451
|
+
return new ToastManager(config);
|
|
2452
|
+
}
|
|
2453
|
+
|
|
2454
|
+
// High-level APX.toast API (default & named managers)
|
|
2455
|
+
let _defaultManager = null;
|
|
2456
|
+
const _getDefault = () => {
|
|
2457
|
+
if (!_defaultManager) _defaultManager = createToastManager();
|
|
2458
|
+
return _defaultManager;
|
|
2459
|
+
};
|
|
2460
|
+
|
|
2461
|
+
/**
|
|
2462
|
+
* Toast API surface to be attached as APX.toast.
|
|
2463
|
+
* Callable form proxies to defaultManager.show(opts): APX.toast({...})
|
|
2464
|
+
*/
|
|
2465
|
+
function toast(opts) {
|
|
2466
|
+
return _getDefault().show(opts);
|
|
2467
|
+
}
|
|
2468
|
+
|
|
2469
|
+
Object.assign(toast, {
|
|
2470
|
+
/**
|
|
2471
|
+
* Create a manager. If first arg is string, register as named under toast.custom[name]
|
|
2472
|
+
* @param {string|Partial<ToastConfig>} nameOrConfig
|
|
2473
|
+
* @param {Partial<ToastConfig>=} maybeConfig
|
|
2474
|
+
* @returns {ToastManager}
|
|
2475
|
+
*/
|
|
2476
|
+
create: (nameOrConfig, maybeConfig) => {
|
|
2477
|
+
if (typeof nameOrConfig === 'string') {
|
|
2478
|
+
const name = nameOrConfig;
|
|
2479
|
+
const manager = new ToastManager({ ...(maybeConfig || {}) });
|
|
2480
|
+
if (!toast.custom) toast.custom = {};
|
|
2481
|
+
toast.custom[name] = manager;
|
|
2482
|
+
return manager;
|
|
2483
|
+
}
|
|
2484
|
+
return new ToastManager({ ...(nameOrConfig || {}) });
|
|
2485
|
+
},
|
|
2486
|
+
/** @type {Record<string, ToastManager>} */
|
|
2487
|
+
custom: {},
|
|
2488
|
+
/** @param {string} name */
|
|
2489
|
+
use: (name) => (toast.custom && toast.custom[name]) || null,
|
|
2490
|
+
Manager: ToastManager,
|
|
2491
|
+
show: (opts) => _getDefault().show(opts),
|
|
2492
|
+
info: (message, opts) => _getDefault().info(message, opts),
|
|
2493
|
+
success: (message, opts) => _getDefault().success(message, opts),
|
|
2494
|
+
warning: (message, opts) => _getDefault().warning(message, opts),
|
|
2495
|
+
danger: (message, opts) => _getDefault().danger(message, opts),
|
|
2496
|
+
configure: (config) => _getDefault().configure(config),
|
|
2497
|
+
setAriaLive: (mode) => _getDefault().setAriaLive(mode),
|
|
2498
|
+
closeAll: (reason) => _getDefault().closeAll(reason),
|
|
2499
|
+
getOpenToasts: () => _getDefault().getOpenToasts()
|
|
2500
|
+
});
|
|
2501
|
+
|
|
2502
|
+
/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (toast);
|
|
2503
|
+
|
|
2504
|
+
|
|
2505
|
+
|
|
1323
2506
|
/***/ }),
|
|
1324
2507
|
|
|
1325
2508
|
/***/ "./modules/tristate/tristate.mjs":
|
|
@@ -1623,7 +2806,9 @@ __webpack_require__.r(__webpack_exports__);
|
|
|
1623
2806
|
/* harmony import */ var _modules_listen_listen_mjs__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./modules/listen/listen.mjs */ "./modules/listen/listen.mjs");
|
|
1624
2807
|
/* harmony import */ var _modules_tristate_tristate_mjs__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./modules/tristate/tristate.mjs */ "./modules/tristate/tristate.mjs");
|
|
1625
2808
|
/* harmony import */ var _modules_dialog_dialog_mjs__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./modules/dialog/dialog.mjs */ "./modules/dialog/dialog.mjs");
|
|
1626
|
-
/* harmony import */ var
|
|
2809
|
+
/* harmony import */ var _modules_toast_toast_mjs__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./modules/toast/toast.mjs */ "./modules/toast/toast.mjs");
|
|
2810
|
+
/* harmony import */ var _modules_common_mjs__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./modules/common.mjs */ "./modules/common.mjs");
|
|
2811
|
+
|
|
1627
2812
|
|
|
1628
2813
|
|
|
1629
2814
|
|
|
@@ -1731,8 +2916,9 @@ const APX = function (input, context = document) {
|
|
|
1731
2916
|
return apx;
|
|
1732
2917
|
};
|
|
1733
2918
|
|
|
1734
|
-
APX.loadCss =
|
|
2919
|
+
APX.loadCss = _modules_common_mjs__WEBPACK_IMPORTED_MODULE_4__.loadCss;
|
|
1735
2920
|
APX.dialog = _modules_dialog_dialog_mjs__WEBPACK_IMPORTED_MODULE_2__["default"];
|
|
2921
|
+
APX.toast = _modules_toast_toast_mjs__WEBPACK_IMPORTED_MODULE_3__["default"];
|
|
1736
2922
|
APX.isAPXObject = function (obj) {
|
|
1737
2923
|
return obj && obj._isAPXObject === true;
|
|
1738
2924
|
}
|
|
@@ -1746,4 +2932,4 @@ APX.is_numeric = (n) => {
|
|
|
1746
2932
|
var __webpack_exports__default = __webpack_exports__["default"];
|
|
1747
2933
|
export { __webpack_exports__default as default };
|
|
1748
2934
|
|
|
1749
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,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O0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSSxzRUFBaUI7QUFDckIsSUFBSSwwRUFBbUI7QUFDdkI7QUFDQTtBQUNBO0FBQ0EsY0FBYyx3REFBTztBQUNyQixhQUFhLGtFQUFNO0FBQ25CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUVBQWUsR0FBRyxFIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vQGFwcGl1cy1mci9hcHgvLi9tb2R1bGVzL2RpYWxvZy9jc3MvZGlhbG9nLmNzcyIsIndlYnBhY2s6Ly9AYXBwaXVzLWZyL2FweC8uL21vZHVsZXMvdHJpc3RhdGUvY3NzL3RyaXN0YXRlLmNzcyIsIndlYnBhY2s6Ly9AYXBwaXVzLWZyL2FweC8uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9hcGkuanMiLCJ3ZWJwYWNrOi8vQGFwcGl1cy1mci9hcHgvLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L3J1bnRpbWUvZ2V0VXJsLmpzIiwid2VicGFjazovL0BhcHBpdXMtZnIvYXB4Ly4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL3NvdXJjZU1hcHMuanMiLCJ3ZWJwYWNrOi8vQGFwcGl1cy1mci9hcHgvLi9tb2R1bGVzL2RpYWxvZy9odG1sL2RpYWxvZy5odG1sIiwid2VicGFjazovL0BhcHBpdXMtZnIvYXB4Ly4vbW9kdWxlcy9kaWFsb2cvY3NzL2RpYWxvZy5jc3M/YTU2NyIsIndlYnBhY2s6Ly9AYXBwaXVzLWZyL2FweC8uL21vZHVsZXMvdHJpc3RhdGUvY3NzL3RyaXN0YXRlLmNzcz9hMDk0Iiwid2VicGFjazovL0BhcHBpdXMtZnIvYXB4Ly4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5qZWN0U3R5bGVzSW50b1N0eWxlVGFnLmpzIiwid2VicGFjazovL0BhcHBpdXMtZnIvYXB4Ly4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5zZXJ0QnlTZWxlY3Rvci5qcyIsIndlYnBhY2s6Ly9AYXBwaXVzLWZyL2FweC8uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luc2VydFN0eWxlRWxlbWVudC5qcyIsIndlYnBhY2s6Ly9AYXBwaXVzLWZyL2FweC8uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL3NldEF0dHJpYnV0ZXNXaXRob3V0QXR0cmlidXRlcy5qcyIsIndlYnBhY2s6Ly9AYXBwaXVzLWZyL2FweC8uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL3N0eWxlRG9tQVBJLmpzIiwid2VicGFjazovL0BhcHBpdXMtZnIvYXB4Ly4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvc3R5bGVUYWdUcmFuc2Zvcm0uanMiLCJ3ZWJwYWNrOi8vQGFwcGl1cy1mci9hcHgvLi9tb2R1bGVzL2NvbW1vbi5tanMiLCJ3ZWJwYWNrOi8vQGFwcGl1cy1mci9hcHgvLi9tb2R1bGVzL2RpYWxvZy9kaWFsb2cubWpzIiwid2VicGFjazovL0BhcHBpdXMtZnIvYXB4Ly4vbW9kdWxlcy9saXN0ZW4vbGlzdGVuLm1qcyIsIndlYnBhY2s6Ly9AYXBwaXVzLWZyL2FweC8uL21vZHVsZXMvdHJpc3RhdGUvdHJpc3RhdGUubWpzIiwid2VicGFjazovL0BhcHBpdXMtZnIvYXB4L3dlYnBhY2svYm9vdHN0cmFwIiwid2VicGFjazovL0BhcHBpdXMtZnIvYXB4L3dlYnBhY2svcnVudGltZS9jb21wYXQgZ2V0IGRlZmF1bHQgZXhwb3J0Iiwid2VicGFjazovL0BhcHBpdXMtZnIvYXB4L3dlYnBhY2svcnVudGltZS9kZWZpbmUgcHJvcGVydHkgZ2V0dGVycyIsIndlYnBhY2s6Ly9AYXBwaXVzLWZyL2FweC93ZWJwYWNrL3J1bnRpbWUvaGFzT3duUHJvcGVydHkgc2hvcnRoYW5kIiwid2VicGFjazovL0BhcHBpdXMtZnIvYXB4L3dlYnBhY2svcnVudGltZS9tYWtlIG5hbWVzcGFjZSBvYmplY3QiLCJ3ZWJwYWNrOi8vQGFwcGl1cy1mci9hcHgvd2VicGFjay9ydW50aW1lL2pzb25wIGNodW5rIGxvYWRpbmciLCJ3ZWJwYWNrOi8vQGFwcGl1cy1mci9hcHgvd2VicGFjay9ydW50aW1lL25vbmNlIiwid2VicGFjazovL0BhcHBpdXMtZnIvYXB4Ly4vQVBYLm1qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBJbXBvcnRzXG5pbXBvcnQgX19fQ1NTX0xPQURFUl9BUElfU09VUkNFTUFQX0lNUE9SVF9fXyBmcm9tIFwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL3NvdXJjZU1hcHMuanNcIjtcbmltcG9ydCBfX19DU1NfTE9BREVSX0FQSV9JTVBPUlRfX18gZnJvbSBcIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9hcGkuanNcIjtcbnZhciBfX19DU1NfTE9BREVSX0VYUE9SVF9fXyA9IF9fX0NTU19MT0FERVJfQVBJX0lNUE9SVF9fXyhfX19DU1NfTE9BREVSX0FQSV9TT1VSQ0VNQVBfSU1QT1JUX19fKTtcbi8vIE1vZHVsZVxuX19fQ1NTX0xPQURFUl9FWFBPUlRfX18ucHVzaChbbW9kdWxlLmlkLCBgLyogRGlhbG9nIHN0eWxpbmcgKi9cclxuLkFQWC1kaWFsb2cge1xyXG4gICAgZGlzcGxheTogbm9uZTtcclxuICAgIHBvc2l0aW9uOiBmaXhlZDtcclxuICAgIHotaW5kZXg6IDEwMDI7XHJcbiAgICBsZWZ0OiAwO1xyXG4gICAgdG9wOiAwO1xyXG4gICAgd2lkdGg6IDEwMCU7XHJcbiAgICBoZWlnaHQ6IDEwMCU7XHJcbiAgICBvdmVyZmxvdzogYXV0bztcclxuICAgIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMCwgMCwgMCwgMC40KTtcclxuICAgIC8qIERpbW1lZCBiYWNrZ3JvdW5kIGZvciBmb2N1cyBvbiBkaWFsb2cgKi9cclxufVxyXG5cclxuLkFQWC1kaWFsb2ctY29udGVudCB7XHJcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmVmZWZlO1xyXG4gICAgcGFkZGluZzogNDBweDtcclxuICAgIGJvcmRlcjogbm9uZTtcclxuICAgIHdpZHRoOiBhdXRvO1xyXG4gICAgbWluLXdpZHRoOiAzMDBweDtcclxuICAgIG1heC13aWR0aDogODAlO1xyXG4gICAgbWFyZ2luOiBhdXRvO1xyXG4gICAgYm9yZGVyLXJhZGl1czogOHB4O1xyXG4gICAgYm94LXNoYWRvdzogMHB4IDZweCAyMHB4IHJnYmEoMCwgMCwgMCwgMC4xKTtcclxuICAgIGZvbnQtZmFtaWx5OiAnSGVsdmV0aWNhIE5ldWUnLCBBcmlhbCwgc2Fucy1zZXJpZjtcclxufVxyXG5cclxuaDIuQVBYLWRpYWxvZy10aXRsZXtcclxuICAgIG1hcmdpbi10b3A6MDtcclxufVxyXG5cclxuLkFQWC1jbG9zZS1kaWFsb2cge1xyXG4gICAgY29sb3I6ICNhYWE7XHJcbiAgICBmbG9hdDogcmlnaHQ7XHJcbiAgICBmb250LXNpemU6IDI0cHg7XHJcbiAgICBtYXJnaW4tdG9wOiAtMTBweDtcclxuICAgIC8qIEFkanVzdCBwb3NpdGlvbmluZyAqL1xyXG4gICAgbWFyZ2luLXJpZ2h0OiAtMTBweDtcclxufVxyXG5cclxuLkFQWC1jbG9zZS1kaWFsb2c6aG92ZXIsXHJcbi5BUFgtY2xvc2UtZGlhbG9nOmZvY3VzIHtcclxuICAgIGNvbG9yOiAjMzMzO1xyXG4gICAgLyogRGFya2VyIGNvbG9yIG9uIGhvdmVyL2ZvY3VzICovXHJcbiAgICBjdXJzb3I6IHBvaW50ZXI7XHJcbn1cclxuXHJcbi8qIElucHV0IGZpZWxkcyBzdHlsaW5nICovXHJcbi5BUFgtZGlhbG9nLWNvbnRlbnQgaW5wdXRbdHlwZT1cInRleHRcIl0sXHJcbi5BUFgtZGlhbG9nLWNvbnRlbnQgaW5wdXRbdHlwZT1cIm51bWJlclwiXSxcclxuLkFQWC1kaWFsb2ctY29udGVudCBpbnB1dFt0eXBlPVwiZGF0ZVwiXSxcclxuLkFQWC1kaWFsb2ctY29udGVudCBpbnB1dFt0eXBlPVwiZGF0ZXRpbWUtbG9jYWxcIl0ge1xyXG4gICAgd2lkdGg6IDEwMCU7XHJcbiAgICBwYWRkaW5nOiAxMHB4O1xyXG4gICAgbWFyZ2luLWJvdHRvbTogMjBweDtcclxuICAgIGJvcmRlcjogMXB4IHNvbGlkICNjY2M7XHJcbiAgICBib3JkZXItcmFkaXVzOiA0cHg7XHJcbiAgICBmb250LWZhbWlseTogJ0hlbHZldGljYSBOZXVlJywgQXJpYWwsIHNhbnMtc2VyaWY7XHJcbiAgICBmb250LXNpemU6IDE2cHg7XHJcbiAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xyXG4gICAgdHJhbnNpdGlvbjogYm9yZGVyLWNvbG9yIDAuM3M7XHJcbn1cclxuXHJcbi5BUFgtZGlhbG9nLWNvbnRlbnQgaW5wdXRbdHlwZT1cInRleHRcIl06Zm9jdXMsXHJcbi5BUFgtZGlhbG9nLWNvbnRlbnQgaW5wdXRbdHlwZT1cIm51bWJlclwiXTpmb2N1cyxcclxuLkFQWC1kaWFsb2ctY29udGVudCBpbnB1dFt0eXBlPVwiZGF0ZVwiXTpmb2N1cyxcclxuLkFQWC1kaWFsb2ctY29udGVudCBpbnB1dFt0eXBlPVwiZGF0ZXRpbWUtbG9jYWxcIl06Zm9jdXMge1xyXG4gICAgYm9yZGVyLWNvbG9yOiAjMkMzRTUwO1xyXG4gICAgLyogRGVlcCBCbHVlIENvbG9yICovXHJcbiAgICBvdXRsaW5lOiBub25lO1xyXG59XHJcblxyXG4vKiBCdXR0b24gaW4gdGhlIGRpYWxvZyAqL1xyXG4uQVBYLWRpYWxvZy1idXR0b24tY29udGFpbmVyIGJ1dHRvbiB7XHJcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XHJcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjMkMzRTUwO1xyXG4gICAgY29sb3I6ICNFQ0YwRjE7XHJcbiAgICBib3JkZXI6IG5vbmU7XHJcbiAgICBwYWRkaW5nOiAxMHB4IDIwcHg7XHJcbiAgICBib3JkZXItcmFkaXVzOiA1cHg7XHJcbiAgICBmb250LXNpemU6IDE2cHg7XHJcbiAgICBjdXJzb3I6IHBvaW50ZXI7XHJcbiAgICB0cmFuc2l0aW9uOiBhbGwgMC4zcyBlYXNlO1xyXG4gICAgYm94LXNoYWRvdzogMCAycHggNHB4IHJnYmEoMCwgMCwgMCwgMC4xKTtcclxufVxyXG5cclxuLkFQWC1kaWFsb2ctYnV0dG9uLWNvbnRhaW5lciBidXR0b246aG92ZXIge1xyXG4gICAgYmFja2dyb3VuZC1jb2xvcjogIzM0NDk1RTtcclxuICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtMXB4KTtcclxuICAgIGJveC1zaGFkb3c6IDAgNHB4IDhweCByZ2JhKDAsIDAsIDAsIDAuMTUpO1xyXG59XHJcblxyXG4uQVBYLWRpYWxvZy1idXR0b24tY29udGFpbmVyIHtcclxuICAgIGRpc3BsYXk6IGZsZXg7XHJcbiAgICBnYXA6IDEwcHg7XHJcbiAgICBtYXJnaW4tdG9wOjFlbTtcclxuICAgIC8qIHNwYWNpbmcgYmV0d2VlbiBidXR0b25zICovXHJcbn1cclxuXHJcbi8qIExvYWRpbmcgaW5kaWNhdG9yICovXHJcbi5BUFgtZGlhbG9nLWxvYWRpbmctaW5kaWNhdG9yIHtcclxuICAgIGRpc3BsYXk6IGZsZXg7XHJcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcclxuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XHJcbiAgICBoZWlnaHQ6IDEwMHB4O1xyXG4gICAgd2lkdGg6IDEwMCU7XHJcbn1cclxuXHJcbi5BUFgtZGlhbG9nLWxvYWRpbmctaW5kaWNhdG9yOjpiZWZvcmUge1xyXG4gICAgY29udGVudDogJyc7XHJcbiAgICB3aWR0aDogNDBweDtcclxuICAgIGhlaWdodDogNDBweDtcclxuICAgIGJvcmRlcjogNHB4IHNvbGlkICNmM2YzZjM7XHJcbiAgICBib3JkZXItdG9wOiA0cHggc29saWQgIzJDM0U1MDtcclxuICAgIGJvcmRlci1yYWRpdXM6IDUwJTtcclxuICAgIGFuaW1hdGlvbjogQVBYLWRpYWxvZy1zcGluIDFzIGxpbmVhciBpbmZpbml0ZTtcclxufVxyXG5cclxuQGtleWZyYW1lcyBBUFgtZGlhbG9nLXNwaW4ge1xyXG4gICAgMCUgeyB0cmFuc2Zvcm06IHJvdGF0ZSgwZGVnKTsgfVxyXG4gICAgMTAwJSB7IHRyYW5zZm9ybTogcm90YXRlKDM2MGRlZyk7IH1cclxufVxyXG4uQVBYLWRpYWxvZy1idXR0b24tZGlzYWJsZWQge1xyXG4gICAgb3BhY2l0eTogMC41O1xyXG4gICAgY3Vyc29yOiBub3QtYWxsb3dlZCAhaW1wb3J0YW50O1xyXG4gICAgYmFja2dyb3VuZC1jb2xvcjogIzk1YTVhNiAhaW1wb3J0YW50OyAvKiBHcmF5ZWQgb3V0IGNvbG9yICovXHJcbiAgICBib3gtc2hhZG93OiBub25lICFpbXBvcnRhbnQ7XHJcbiAgICB0cmFuc2l0aW9uOiBhbGwgMC4ycyBlYXNlO1xyXG4gICAgdHJhbnNmb3JtOiBub25lICFpbXBvcnRhbnQ7XHJcbn1cclxuXHJcbi5BUFgtZGlhbG9nLWJ1dHRvbi1kaXNhYmxlZDpob3ZlciB7XHJcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjOTVhNWE2ICFpbXBvcnRhbnQ7IC8qIEtlZXAgZ3JheSBvbiBob3ZlciAqL1xyXG4gICAgdHJhbnNmb3JtOiBub25lICFpbXBvcnRhbnQ7XHJcbn1cclxuXHJcbi8qIEFkZCBhIHN1YnRsZSBzdHJpa2V0aHJvdWdoIGVmZmVjdCAqL1xyXG4uQVBYLWRpYWxvZy1idXR0b24tZGlzYWJsZWQ6OmFmdGVyIHtcclxuICAgIGNvbnRlbnQ6ICcnO1xyXG4gICAgcG9zaXRpb246IGFic29sdXRlO1xyXG4gICAgdG9wOiA1MCU7XHJcbiAgICBsZWZ0OiAwO1xyXG4gICAgd2lkdGg6IDEwMCU7XHJcbiAgICBoZWlnaHQ6IDFweDtcclxuICAgIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMCwgMCwgMCwgMC4yKTtcclxuICAgIHRyYW5zZm9ybTogcm90YXRlKC01ZGVnKTtcclxufWAsIFwiXCIse1widmVyc2lvblwiOjMsXCJzb3VyY2VzXCI6W1wid2VicGFjazovLy4vbW9kdWxlcy9kaWFsb2cvY3NzL2RpYWxvZy5jc3NcIl0sXCJuYW1lc1wiOltdLFwibWFwcGluZ3NcIjpcIkFBQUEsbUJBQW1CO0FBQ25CO0lBQ0ksYUFBYTtJQUNiLGVBQWU7SUFDZixhQUFhO0lBQ2IsT0FBTztJQUNQLE1BQU07SUFDTixXQUFXO0lBQ1gsWUFBWTtJQUNaLGNBQWM7SUFDZCxvQ0FBb0M7SUFDcEMsMENBQTBDO0FBQzlDOztBQUVBO0lBQ0kseUJBQXlCO0lBQ3pCLGFBQWE7SUFDYixZQUFZO0lBQ1osV0FBVztJQUNYLGdCQUFnQjtJQUNoQixjQUFjO0lBQ2QsWUFBWTtJQUNaLGtCQUFrQjtJQUNsQiwyQ0FBMkM7SUFDM0MsZ0RBQWdEO0FBQ3BEOztBQUVBO0lBQ0ksWUFBWTtBQUNoQjs7QUFFQTtJQUNJLFdBQVc7SUFDWCxZQUFZO0lBQ1osZUFBZTtJQUNmLGlCQUFpQjtJQUNqQix1QkFBdUI7SUFDdkIsbUJBQW1CO0FBQ3ZCOztBQUVBOztJQUVJLFdBQVc7SUFDWCxnQ0FBZ0M7SUFDaEMsZUFBZTtBQUNuQjs7QUFFQSx5QkFBeUI7QUFDekI7Ozs7SUFJSSxXQUFXO0lBQ1gsYUFBYTtJQUNiLG1CQUFtQjtJQUNuQixzQkFBc0I7SUFDdEIsa0JBQWtCO0lBQ2xCLGdEQUFnRDtJQUNoRCxlQUFlO0lBQ2Ysc0JBQXNCO0lBQ3RCLDZCQUE2QjtBQUNqQzs7QUFFQTs7OztJQUlJLHFCQUFxQjtJQUNyQixvQkFBb0I7SUFDcEIsYUFBYTtBQUNqQjs7QUFFQSx5QkFBeUI7QUFDekI7SUFDSSxrQkFBa0I7SUFDbEIseUJBQXlCO0lBQ3pCLGNBQWM7SUFDZCxZQUFZO0lBQ1osa0JBQWtCO0lBQ2xCLGtCQUFrQjtJQUNsQixlQUFlO0lBQ2YsZUFBZTtJQUNmLHlCQUF5QjtJQUN6Qix3Q0FBd0M7QUFDNUM7O0FBRUE7SUFDSSx5QkFBeUI7SUFDekIsMkJBQTJCO0lBQzNCLHlDQUF5QztBQUM3Qzs7QUFFQTtJQUNJLGFBQWE7SUFDYixTQUFTO0lBQ1QsY0FBYztJQUNkLDRCQUE0QjtBQUNoQzs7QUFFQSxzQkFBc0I7QUFDdEI7SUFDSSxhQUFhO0lBQ2IsdUJBQXVCO0lBQ3ZCLG1CQUFtQjtJQUNuQixhQUFhO0lBQ2IsV0FBVztBQUNmOztBQUVBO0lBQ0ksV0FBVztJQUNYLFdBQVc7SUFDWCxZQUFZO0lBQ1oseUJBQXlCO0lBQ3pCLDZCQUE2QjtJQUM3QixrQkFBa0I7SUFDbEIsNkNBQTZDO0FBQ2pEOztBQUVBO0lBQ0ksS0FBSyx1QkFBdUIsRUFBRTtJQUM5QixPQUFPLHlCQUF5QixFQUFFO0FBQ3RDO0FBQ0E7SUFDSSxZQUFZO0lBQ1osOEJBQThCO0lBQzlCLG9DQUFvQyxFQUFFLHFCQUFxQjtJQUMzRCwyQkFBMkI7SUFDM0IseUJBQXlCO0lBQ3pCLDBCQUEwQjtBQUM5Qjs7QUFFQTtJQUNJLG9DQUFvQyxFQUFFLHVCQUF1QjtJQUM3RCwwQkFBMEI7QUFDOUI7O0FBRUEsc0NBQXNDO0FBQ3RDO0lBQ0ksV0FBVztJQUNYLGtCQUFrQjtJQUNsQixRQUFRO0lBQ1IsT0FBTztJQUNQLFdBQVc7SUFDWCxXQUFXO0lBQ1gsb0NBQW9DO0lBQ3BDLHdCQUF3QjtBQUM1QlwiLFwic291cmNlc0NvbnRlbnRcIjpbXCIvKiBEaWFsb2cgc3R5bGluZyAqL1xcclxcbi5BUFgtZGlhbG9nIHtcXHJcXG4gICAgZGlzcGxheTogbm9uZTtcXHJcXG4gICAgcG9zaXRpb246IGZpeGVkO1xcclxcbiAgICB6LWluZGV4OiAxMDAyO1xcclxcbiAgICBsZWZ0OiAwO1xcclxcbiAgICB0b3A6IDA7XFxyXFxuICAgIHdpZHRoOiAxMDAlO1xcclxcbiAgICBoZWlnaHQ6IDEwMCU7XFxyXFxuICAgIG92ZXJmbG93OiBhdXRvO1xcclxcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuNCk7XFxyXFxuICAgIC8qIERpbW1lZCBiYWNrZ3JvdW5kIGZvciBmb2N1cyBvbiBkaWFsb2cgKi9cXHJcXG59XFxyXFxuXFxyXFxuLkFQWC1kaWFsb2ctY29udGVudCB7XFxyXFxuICAgIGJhY2tncm91bmQtY29sb3I6ICNmZWZlZmU7XFxyXFxuICAgIHBhZGRpbmc6IDQwcHg7XFxyXFxuICAgIGJvcmRlcjogbm9uZTtcXHJcXG4gICAgd2lkdGg6IGF1dG87XFxyXFxuICAgIG1pbi13aWR0aDogMzAwcHg7XFxyXFxuICAgIG1heC13aWR0aDogODAlO1xcclxcbiAgICBtYXJnaW46IGF1dG87XFxyXFxuICAgIGJvcmRlci1yYWRpdXM6IDhweDtcXHJcXG4gICAgYm94LXNoYWRvdzogMHB4IDZweCAyMHB4IHJnYmEoMCwgMCwgMCwgMC4xKTtcXHJcXG4gICAgZm9udC1mYW1pbHk6ICdIZWx2ZXRpY2EgTmV1ZScsIEFyaWFsLCBzYW5zLXNlcmlmO1xcclxcbn1cXHJcXG5cXHJcXG5oMi5BUFgtZGlhbG9nLXRpdGxle1xcclxcbiAgICBtYXJnaW4tdG9wOjA7XFxyXFxufVxcclxcblxcclxcbi5BUFgtY2xvc2UtZGlhbG9nIHtcXHJcXG4gICAgY29sb3I6ICNhYWE7XFxyXFxuICAgIGZsb2F0OiByaWdodDtcXHJcXG4gICAgZm9udC1zaXplOiAyNHB4O1xcclxcbiAgICBtYXJnaW4tdG9wOiAtMTBweDtcXHJcXG4gICAgLyogQWRqdXN0IHBvc2l0aW9uaW5nICovXFxyXFxuICAgIG1hcmdpbi1yaWdodDogLTEwcHg7XFxyXFxufVxcclxcblxcclxcbi5BUFgtY2xvc2UtZGlhbG9nOmhvdmVyLFxcclxcbi5BUFgtY2xvc2UtZGlhbG9nOmZvY3VzIHtcXHJcXG4gICAgY29sb3I6ICMzMzM7XFxyXFxuICAgIC8qIERhcmtlciBjb2xvciBvbiBob3Zlci9mb2N1cyAqL1xcclxcbiAgICBjdXJzb3I6IHBvaW50ZXI7XFxyXFxufVxcclxcblxcclxcbi8qIElucHV0IGZpZWxkcyBzdHlsaW5nICovXFxyXFxuLkFQWC1kaWFsb2ctY29udGVudCBpbnB1dFt0eXBlPVxcXCJ0ZXh0XFxcIl0sXFxyXFxuLkFQWC1kaWFsb2ctY29udGVudCBpbnB1dFt0eXBlPVxcXCJudW1iZXJcXFwiXSxcXHJcXG4uQVBYLWRpYWxvZy1jb250ZW50IGlucHV0W3R5cGU9XFxcImRhdGVcXFwiXSxcXHJcXG4uQVBYLWRpYWxvZy1jb250ZW50IGlucHV0W3R5cGU9XFxcImRhdGV0aW1lLWxvY2FsXFxcIl0ge1xcclxcbiAgICB3aWR0aDogMTAwJTtcXHJcXG4gICAgcGFkZGluZzogMTBweDtcXHJcXG4gICAgbWFyZ2luLWJvdHRvbTogMjBweDtcXHJcXG4gICAgYm9yZGVyOiAxcHggc29saWQgI2NjYztcXHJcXG4gICAgYm9yZGVyLXJhZGl1czogNHB4O1xcclxcbiAgICBmb250LWZhbWlseTogJ0hlbHZldGljYSBOZXVlJywgQXJpYWwsIHNhbnMtc2VyaWY7XFxyXFxuICAgIGZvbnQtc2l6ZTogMTZweDtcXHJcXG4gICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcXHJcXG4gICAgdHJhbnNpdGlvbjogYm9yZGVyLWNvbG9yIDAuM3M7XFxyXFxufVxcclxcblxcclxcbi5BUFgtZGlhbG9nLWNvbnRlbnQgaW5wdXRbdHlwZT1cXFwidGV4dFxcXCJdOmZvY3VzLFxcclxcbi5BUFgtZGlhbG9nLWNvbnRlbnQgaW5wdXRbdHlwZT1cXFwibnVtYmVyXFxcIl06Zm9jdXMsXFxyXFxuLkFQWC1kaWFsb2ctY29udGVudCBpbnB1dFt0eXBlPVxcXCJkYXRlXFxcIl06Zm9jdXMsXFxyXFxuLkFQWC1kaWFsb2ctY29udGVudCBpbnB1dFt0eXBlPVxcXCJkYXRldGltZS1sb2NhbFxcXCJdOmZvY3VzIHtcXHJcXG4gICAgYm9yZGVyLWNvbG9yOiAjMkMzRTUwO1xcclxcbiAgICAvKiBEZWVwIEJsdWUgQ29sb3IgKi9cXHJcXG4gICAgb3V0bGluZTogbm9uZTtcXHJcXG59XFxyXFxuXFxyXFxuLyogQnV0dG9uIGluIHRoZSBkaWFsb2cgKi9cXHJcXG4uQVBYLWRpYWxvZy1idXR0b24tY29udGFpbmVyIGJ1dHRvbiB7XFxyXFxuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcXHJcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogIzJDM0U1MDtcXHJcXG4gICAgY29sb3I6ICNFQ0YwRjE7XFxyXFxuICAgIGJvcmRlcjogbm9uZTtcXHJcXG4gICAgcGFkZGluZzogMTBweCAyMHB4O1xcclxcbiAgICBib3JkZXItcmFkaXVzOiA1cHg7XFxyXFxuICAgIGZvbnQtc2l6ZTogMTZweDtcXHJcXG4gICAgY3Vyc29yOiBwb2ludGVyO1xcclxcbiAgICB0cmFuc2l0aW9uOiBhbGwgMC4zcyBlYXNlO1xcclxcbiAgICBib3gtc2hhZG93OiAwIDJweCA0cHggcmdiYSgwLCAwLCAwLCAwLjEpO1xcclxcbn1cXHJcXG5cXHJcXG4uQVBYLWRpYWxvZy1idXR0b24tY29udGFpbmVyIGJ1dHRvbjpob3ZlciB7XFxyXFxuICAgIGJhY2tncm91bmQtY29sb3I6ICMzNDQ5NUU7XFxyXFxuICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtMXB4KTtcXHJcXG4gICAgYm94LXNoYWRvdzogMCA0cHggOHB4IHJnYmEoMCwgMCwgMCwgMC4xNSk7XFxyXFxufVxcclxcblxcclxcbi5BUFgtZGlhbG9nLWJ1dHRvbi1jb250YWluZXIge1xcclxcbiAgICBkaXNwbGF5OiBmbGV4O1xcclxcbiAgICBnYXA6IDEwcHg7XFxyXFxuICAgIG1hcmdpbi10b3A6MWVtO1xcclxcbiAgICAvKiBzcGFjaW5nIGJldHdlZW4gYnV0dG9ucyAqL1xcclxcbn1cXHJcXG5cXHJcXG4vKiBMb2FkaW5nIGluZGljYXRvciAqL1xcclxcbi5BUFgtZGlhbG9nLWxvYWRpbmctaW5kaWNhdG9yIHtcXHJcXG4gICAgZGlzcGxheTogZmxleDtcXHJcXG4gICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XFxyXFxuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XFxyXFxuICAgIGhlaWdodDogMTAwcHg7XFxyXFxuICAgIHdpZHRoOiAxMDAlO1xcclxcbn1cXHJcXG5cXHJcXG4uQVBYLWRpYWxvZy1sb2FkaW5nLWluZGljYXRvcjo6YmVmb3JlIHtcXHJcXG4gICAgY29udGVudDogJyc7XFxyXFxuICAgIHdpZHRoOiA0MHB4O1xcclxcbiAgICBoZWlnaHQ6IDQwcHg7XFxyXFxuICAgIGJvcmRlcjogNHB4IHNvbGlkICNmM2YzZjM7XFxyXFxuICAgIGJvcmRlci10b3A6IDRweCBzb2xpZCAjMkMzRTUwO1xcclxcbiAgICBib3JkZXItcmFkaXVzOiA1MCU7XFxyXFxuICAgIGFuaW1hdGlvbjogQVBYLWRpYWxvZy1zcGluIDFzIGxpbmVhciBpbmZpbml0ZTtcXHJcXG59XFxyXFxuXFxyXFxuQGtleWZyYW1lcyBBUFgtZGlhbG9nLXNwaW4ge1xcclxcbiAgICAwJSB7IHRyYW5zZm9ybTogcm90YXRlKDBkZWcpOyB9XFxyXFxuICAgIDEwMCUgeyB0cmFuc2Zvcm06IHJvdGF0ZSgzNjBkZWcpOyB9XFxyXFxufVxcclxcbi5BUFgtZGlhbG9nLWJ1dHRvbi1kaXNhYmxlZCB7XFxyXFxuICAgIG9wYWNpdHk6IDAuNTtcXHJcXG4gICAgY3Vyc29yOiBub3QtYWxsb3dlZCAhaW1wb3J0YW50O1xcclxcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjOTVhNWE2ICFpbXBvcnRhbnQ7IC8qIEdyYXllZCBvdXQgY29sb3IgKi9cXHJcXG4gICAgYm94LXNoYWRvdzogbm9uZSAhaW1wb3J0YW50O1xcclxcbiAgICB0cmFuc2l0aW9uOiBhbGwgMC4ycyBlYXNlO1xcclxcbiAgICB0cmFuc2Zvcm06IG5vbmUgIWltcG9ydGFudDtcXHJcXG59XFxyXFxuXFxyXFxuLkFQWC1kaWFsb2ctYnV0dG9uLWRpc2FibGVkOmhvdmVyIHtcXHJcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogIzk1YTVhNiAhaW1wb3J0YW50OyAvKiBLZWVwIGdyYXkgb24gaG92ZXIgKi9cXHJcXG4gICAgdHJhbnNmb3JtOiBub25lICFpbXBvcnRhbnQ7XFxyXFxufVxcclxcblxcclxcbi8qIEFkZCBhIHN1YnRsZSBzdHJpa2V0aHJvdWdoIGVmZmVjdCAqL1xcclxcbi5BUFgtZGlhbG9nLWJ1dHRvbi1kaXNhYmxlZDo6YWZ0ZXIge1xcclxcbiAgICBjb250ZW50OiAnJztcXHJcXG4gICAgcG9zaXRpb246IGFic29sdXRlO1xcclxcbiAgICB0b3A6IDUwJTtcXHJcXG4gICAgbGVmdDogMDtcXHJcXG4gICAgd2lkdGg6IDEwMCU7XFxyXFxuICAgIGhlaWdodDogMXB4O1xcclxcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuMik7XFxyXFxuICAgIHRyYW5zZm9ybTogcm90YXRlKC01ZGVnKTtcXHJcXG59XCJdLFwic291cmNlUm9vdFwiOlwiXCJ9XSk7XG4vLyBFeHBvcnRzXG5leHBvcnQgZGVmYXVsdCBfX19DU1NfTE9BREVSX0VYUE9SVF9fXztcbiIsIi8vIEltcG9ydHNcbmltcG9ydCBfX19DU1NfTE9BREVSX0FQSV9TT1VSQ0VNQVBfSU1QT1JUX19fIGZyb20gXCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L3J1bnRpbWUvc291cmNlTWFwcy5qc1wiO1xuaW1wb3J0IF9fX0NTU19MT0FERVJfQVBJX0lNUE9SVF9fXyBmcm9tIFwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL2FwaS5qc1wiO1xuaW1wb3J0IF9fX0NTU19MT0FERVJfR0VUX1VSTF9JTVBPUlRfX18gZnJvbSBcIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9nZXRVcmwuanNcIjtcbnZhciBfX19DU1NfTE9BREVSX1VSTF9JTVBPUlRfMF9fXyA9IG5ldyBVUkwoXCJkYXRhOmltYWdlL3N2Zyt4bWwsJTNDc3ZnJTIweG1sbnMlM0QlMjdodHRwJTNBLy93d3cudzMub3JnLzIwMDAvc3ZnJTI3JTIwd2lkdGglM0QlMjczMiUyNyUyMGhlaWdodCUzRCUyNzMyJTI3JTNFJTNDcGF0aCUyMCUyMGZpbGwlM0QlMjIlMjNjY2NjY2MlMjIlMjBkJTNEJTIyTTI1LjEwNyUyMDMyLjAzMGgtMTguMjE0Yy0zLjQ1NiUyMDAtNi4yNjgtMi44MS02LjI2OC02LjI2NHYtMTkuNTI5YzAtMy40NTYlMjAyLjgxMi02LjI2OCUyMDYuMjY4LTYuMjY4aDE4LjIxNGMzLjQ1NiUyMDAlMjA2LjI2OCUyMDIuODEyJTIwNi4yNjglMjA2LjI2OHYxOS41MjljMCUyMDMuNDUyLTIuODEyJTIwNi4yNjQtNi4yNjglMjA2LjI2NHpNNi44OTMlMjAxLjg1Yy0yLjQxOSUyMDAtNC4zODYlMjAxLjk2Ny00LjM4NiUyMDQuMzg2djE5LjUyOWMwJTIwMi40MTclMjAxLjk2NyUyMDQuMzgyJTIwNC4zODYlMjA0LjM4MmgxOC4yMTRjMi40MTklMjAwJTIwNC4zODYtMS45NjUlMjA0LjM4Ni00LjM4MnYtMTkuNTI5YzAtMi40MTktMS45NjctNC4zODYtNC4zODYtNC4zODZoLTE4LjIxNHolMjIlM0UlM0MvcGF0aCUzRSUzQy9zdmclM0VcIiwgaW1wb3J0Lm1ldGEudXJsKTtcbnZhciBfX19DU1NfTE9BREVSX1VSTF9JTVBPUlRfMV9fXyA9IG5ldyBVUkwoXCJkYXRhOmltYWdlL3N2Zyt4bWwsJTNDc3ZnJTIweG1sbnMlM0QlMjdodHRwJTNBLy93d3cudzMub3JnLzIwMDAvc3ZnJTI3JTIwd2lkdGglM0QlMjczMiUyNyUyMGhlaWdodCUzRCUyNzMyJTI3JTNFJTNDcGF0aCUyMGZpbGwlM0QlMjIlMjMwNjU0YmElMjIlMjBkJTNEJTIyTTAuNTQzJTIwNS42NDdjMC0zLjExOSUyMDIuNTMxLTUuNjQ3JTIwNS42NS01LjY0N2gxOS4zMDljMy4xMiUyMDAlMjA1LjY1JTIwMi41MTElMjA1LjY1JTIwNS42NDd2MjAuNzA1YzAlMjAzLjExOS0yLjUzMSUyMDUuNjQ3LTUuNjUlMjA1LjY0N2gtMTkuMzA5Yy0zLjEyJTIwMC01LjY1LTIuNTExLTUuNjUtNS42NDd2LTIwLjcwNXpNNS4zMTMlMjAxNy41ODdsNy4wMzklMjA2LjgzOSUyMDEzLjgzMS0xMy40MzktMi42MzYtMi41NjEtMTAuOTI5JTIwMTAuNjItNC40NDItNC4zMTctMi44NjIlMjAyLjg1OHolMjIlM0UlM0MvcGF0aCUzRSUzQy9zdmclM0VcIiwgaW1wb3J0Lm1ldGEudXJsKTtcbnZhciBfX19DU1NfTE9BREVSX1VSTF9JTVBPUlRfMl9fXyA9IG5ldyBVUkwoXCJkYXRhOmltYWdlL3N2Zyt4bWwsJTNDJTNGeG1sJTIwdmVyc2lvbiUzRCUyMjEuMCUyMiUyMGVuY29kaW5nJTNEJTIyVVRGLTglMjIlM0YlM0UlM0NzdmclMjB2aWV3Qm94JTNEJTIyMCUyMDAlMjAzMiUyMDMyJTIyJTIweG1sbnMlM0QlMjJodHRwJTNBJTJGJTJGd3d3LnczLm9yZyUyRjIwMDAlMkZzdmclMjIlM0UlM0NwYXRoJTIwZCUzRCUyMm0wLjU0MyUyMDUuNjQ3YzAtMy4xMTklMjAyLjUzMS01LjY0NyUyMDUuNjUtNS42NDdoMTkuMzA5YzMuMTIlMjAwJTIwNS42NSUyMDIuNTExJTIwNS42NSUyMDUuNjQ3djIwLjcwNWMwJTIwMy4xMTktMi41MzElMjA1LjY0Ny01LjY1JTIwNS42NDdoLTE5LjMwOWMtMy4xMiUyMDAtNS42NS0yLjUxMS01LjY1LTUuNjQ3di0yMC43MDV6JTIyJTIwZmlsbCUzRCUyMiUyM2YwMCUyMiUyRiUzRSUzQ3BhdGglMjBkJTNEJTIybTglMjA4JTIwMTYlMjAxNiUyMiUyMHN0cm9rZSUzRCUyMiUyM2ZmZiUyMiUyMHN0cm9rZS13aWR0aCUzRCUyMjIlMjIlMkYlM0UlM0NwYXRoJTIwZCUzRCUyMk0yNCUyMDhMOCUyMDI0JTIyJTIwc3Ryb2tlJTNEJTIyJTIzZmZmJTIyJTIwc3Ryb2tlLXdpZHRoJTNEJTIyMiUyMiUyRiUzRSUzQyUyRnN2ZyUzRVwiLCBpbXBvcnQubWV0YS51cmwpO1xudmFyIF9fX0NTU19MT0FERVJfRVhQT1JUX19fID0gX19fQ1NTX0xPQURFUl9BUElfSU1QT1JUX19fKF9fX0NTU19MT0FERVJfQVBJX1NPVVJDRU1BUF9JTVBPUlRfX18pO1xudmFyIF9fX0NTU19MT0FERVJfVVJMX1JFUExBQ0VNRU5UXzBfX18gPSBfX19DU1NfTE9BREVSX0dFVF9VUkxfSU1QT1JUX19fKF9fX0NTU19MT0FERVJfVVJMX0lNUE9SVF8wX19fKTtcbnZhciBfX19DU1NfTE9BREVSX1VSTF9SRVBMQUNFTUVOVF8xX19fID0gX19fQ1NTX0xPQURFUl9HRVRfVVJMX0lNUE9SVF9fXyhfX19DU1NfTE9BREVSX1VSTF9JTVBPUlRfMV9fXyk7XG52YXIgX19fQ1NTX0xPQURFUl9VUkxfUkVQTEFDRU1FTlRfMl9fXyA9IF9fX0NTU19MT0FERVJfR0VUX1VSTF9JTVBPUlRfX18oX19fQ1NTX0xPQURFUl9VUkxfSU1QT1JUXzJfX18pO1xuLy8gTW9kdWxlXG5fX19DU1NfTE9BREVSX0VYUE9SVF9fXy5wdXNoKFttb2R1bGUuaWQsIGAuYXB4LXRyaXN0YXRlIHtcclxuICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcclxuICAgIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7XHJcbiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XHJcbiAgICBjdXJzb3I6IHBvaW50ZXI7XHJcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XHJcbiAgICBtaW4td2lkdGg6MTNweDtcclxuICAgIG1pbi1oZWlnaHQ6MTNweDtcclxuICAgIGJhY2tncm91bmQtc2l6ZTogY29udGFpbjtcclxuICAgIGJhY2tncm91bmQtY29sb3I6IHdoaXRlO1xyXG4gICAgYm9yZGVyLXJhZGl1czozcHg7XHJcbn1cclxuLmFweC10cmlzdGF0ZS51bmNoZWNrZWQge1xyXG4gICAgYmFja2dyb3VuZC1pbWFnZTogdXJsKCR7X19fQ1NTX0xPQURFUl9VUkxfUkVQTEFDRU1FTlRfMF9fX30pO1xyXG59XHJcbi5hcHgtdHJpc3RhdGUuY2hlY2tlZCB7XHJcbiAgICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoJHtfX19DU1NfTE9BREVSX1VSTF9SRVBMQUNFTUVOVF8xX19ffSk7XHJcbiAgICBiYWNrZ3JvdW5kLXJlcGVhdDogbm8tcmVwZWF0O1xyXG4gICAgYmFja2dyb3VuZC1wb3NpdGlvbjogY2VudGVyO1xyXG59XHJcbi5hcHgtdHJpc3RhdGUuY3Jvc3NlZCB7XHJcbiAgICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoJHtfX19DU1NfTE9BREVSX1VSTF9SRVBMQUNFTUVOVF8yX19ffSk7XHJcbiAgICBiYWNrZ3JvdW5kLXJlcGVhdDogbm8tcmVwZWF0O1xyXG4gICAgYmFja2dyb3VuZC1wb3NpdGlvbjogY2VudGVyO1xyXG59YCwgXCJcIix7XCJ2ZXJzaW9uXCI6MyxcInNvdXJjZXNcIjpbXCJ3ZWJwYWNrOi8vLi9tb2R1bGVzL3RyaXN0YXRlL2Nzcy90cmlzdGF0ZS5jc3NcIl0sXCJuYW1lc1wiOltdLFwibWFwcGluZ3NcIjpcIkFBQUE7SUFDSSxxQkFBcUI7SUFDckIsc0JBQXNCO0lBQ3RCLGtCQUFrQjtJQUNsQixlQUFlO0lBQ2Ysa0JBQWtCO0lBQ2xCLGNBQWM7SUFDZCxlQUFlO0lBQ2Ysd0JBQXdCO0lBQ3hCLHVCQUF1QjtJQUN2QixpQkFBaUI7QUFDckI7QUFDQTtJQUNJLHlEQUF5bEI7QUFDN2xCO0FBQ0E7SUFDSSx5REFBNmU7SUFDN2UsNEJBQTRCO0lBQzVCLDJCQUEyQjtBQUMvQjtBQUNBO0lBQ0kseURBQXNuQjtJQUN0bkIsNEJBQTRCO0lBQzVCLDJCQUEyQjtBQUMvQlwiLFwic291cmNlc0NvbnRlbnRcIjpbXCIuYXB4LXRyaXN0YXRlIHtcXHJcXG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xcclxcbiAgICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO1xcclxcbiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XFxyXFxuICAgIGN1cnNvcjogcG9pbnRlcjtcXHJcXG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xcclxcbiAgICBtaW4td2lkdGg6MTNweDtcXHJcXG4gICAgbWluLWhlaWdodDoxM3B4O1xcclxcbiAgICBiYWNrZ3JvdW5kLXNpemU6IGNvbnRhaW47XFxyXFxuICAgIGJhY2tncm91bmQtY29sb3I6IHdoaXRlO1xcclxcbiAgICBib3JkZXItcmFkaXVzOjNweDtcXHJcXG59XFxyXFxuLmFweC10cmlzdGF0ZS51bmNoZWNrZWQge1xcclxcbiAgICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoJ2RhdGE6aW1hZ2Uvc3ZnK3htbCwlM0NzdmclMjB4bWxucyUzRCUyN2h0dHAlM0EvL3d3dy53My5vcmcvMjAwMC9zdmclMjclMjB3aWR0aCUzRCUyNzMyJTI3JTIwaGVpZ2h0JTNEJTI3MzIlMjclM0UlM0NwYXRoJTIwJTIwZmlsbCUzRCUyMiUyM2NjY2NjYyUyMiUyMGQlM0QlMjJNMjUuMTA3JTIwMzIuMDMwaC0xOC4yMTRjLTMuNDU2JTIwMC02LjI2OC0yLjgxLTYuMjY4LTYuMjY0di0xOS41MjljMC0zLjQ1NiUyMDIuODEyLTYuMjY4JTIwNi4yNjgtNi4yNjhoMTguMjE0YzMuNDU2JTIwMCUyMDYuMjY4JTIwMi44MTIlMjA2LjI2OCUyMDYuMjY4djE5LjUyOWMwJTIwMy40NTItMi44MTIlMjA2LjI2NC02LjI2OCUyMDYuMjY0ek02Ljg5MyUyMDEuODVjLTIuNDE5JTIwMC00LjM4NiUyMDEuOTY3LTQuMzg2JTIwNC4zODZ2MTkuNTI5YzAlMjAyLjQxNyUyMDEuOTY3JTIwNC4zODIlMjA0LjM4NiUyMDQuMzgyaDE4LjIxNGMyLjQxOSUyMDAlMjA0LjM4Ni0xLjk2NSUyMDQuMzg2LTQuMzgydi0xOS41MjljMC0yLjQxOS0xLjk2Ny00LjM4Ni00LjM4Ni00LjM4NmgtMTguMjE0eiUyMiUzRSUzQy9wYXRoJTNFJTNDL3N2ZyUzRScpO1xcclxcbn1cXHJcXG4uYXB4LXRyaXN0YXRlLmNoZWNrZWQge1xcclxcbiAgICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoJ2RhdGE6aW1hZ2Uvc3ZnK3htbCwlM0NzdmclMjB4bWxucyUzRCUyN2h0dHAlM0EvL3d3dy53My5vcmcvMjAwMC9zdmclMjclMjB3aWR0aCUzRCUyNzMyJTI3JTIwaGVpZ2h0JTNEJTI3MzIlMjclM0UlM0NwYXRoJTIwZmlsbCUzRCUyMiUyMzA2NTRiYSUyMiUyMGQlM0QlMjJNMC41NDMlMjA1LjY0N2MwLTMuMTE5JTIwMi41MzEtNS42NDclMjA1LjY1LTUuNjQ3aDE5LjMwOWMzLjEyJTIwMCUyMDUuNjUlMjAyLjUxMSUyMDUuNjUlMjA1LjY0N3YyMC43MDVjMCUyMDMuMTE5LTIuNTMxJTIwNS42NDctNS42NSUyMDUuNjQ3aC0xOS4zMDljLTMuMTIlMjAwLTUuNjUtMi41MTEtNS42NS01LjY0N3YtMjAuNzA1ek01LjMxMyUyMDE3LjU4N2w3LjAzOSUyMDYuODM5JTIwMTMuODMxLTEzLjQzOS0yLjYzNi0yLjU2MS0xMC45MjklMjAxMC42Mi00LjQ0Mi00LjMxNy0yLjg2MiUyMDIuODU4eiUyMiUzRSUzQy9wYXRoJTNFJTNDL3N2ZyUzRScpO1xcclxcbiAgICBiYWNrZ3JvdW5kLXJlcGVhdDogbm8tcmVwZWF0O1xcclxcbiAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiBjZW50ZXI7XFxyXFxufVxcclxcbi5hcHgtdHJpc3RhdGUuY3Jvc3NlZCB7XFxyXFxuICAgIGJhY2tncm91bmQtaW1hZ2U6IHVybCgnZGF0YTppbWFnZS9zdmcreG1sLCUzQyUzRnhtbCUyMHZlcnNpb24lM0QlMjIxLjAlMjIlMjBlbmNvZGluZyUzRCUyMlVURi04JTIyJTNGJTNFJTNDc3ZnJTIwdmlld0JveCUzRCUyMjAlMjAwJTIwMzIlMjAzMiUyMiUyMHhtbG5zJTNEJTIyaHR0cCUzQSUyRiUyRnd3dy53My5vcmclMkYyMDAwJTJGc3ZnJTIyJTNFJTNDcGF0aCUyMGQlM0QlMjJtMC41NDMlMjA1LjY0N2MwLTMuMTE5JTIwMi41MzEtNS42NDclMjA1LjY1LTUuNjQ3aDE5LjMwOWMzLjEyJTIwMCUyMDUuNjUlMjAyLjUxMSUyMDUuNjUlMjA1LjY0N3YyMC43MDVjMCUyMDMuMTE5LTIuNTMxJTIwNS42NDctNS42NSUyMDUuNjQ3aC0xOS4zMDljLTMuMTIlMjAwLTUuNjUtMi41MTEtNS42NS01LjY0N3YtMjAuNzA1eiUyMiUyMGZpbGwlM0QlMjIlMjNmMDAlMjIlMkYlM0UlM0NwYXRoJTIwZCUzRCUyMm04JTIwOCUyMDE2JTIwMTYlMjIlMjBzdHJva2UlM0QlMjIlMjNmZmYlMjIlMjBzdHJva2Utd2lkdGglM0QlMjIyJTIyJTJGJTNFJTNDcGF0aCUyMGQlM0QlMjJNMjQlMjA4TDglMjAyNCUyMiUyMHN0cm9rZSUzRCUyMiUyM2ZmZiUyMiUyMHN0cm9rZS13aWR0aCUzRCUyMjIlMjIlMkYlM0UlM0MlMkZzdmclM0UnKTtcXHJcXG4gICAgYmFja2dyb3VuZC1yZXBlYXQ6IG5vLXJlcGVhdDtcXHJcXG4gICAgYmFja2dyb3VuZC1wb3NpdGlvbjogY2VudGVyO1xcclxcbn1cIl0sXCJzb3VyY2VSb290XCI6XCJcIn1dKTtcbi8vIEV4cG9ydHNcbmV4cG9ydCBkZWZhdWx0IF9fX0NTU19MT0FERVJfRVhQT1JUX19fO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbi8qXG4gIE1JVCBMaWNlbnNlIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbWl0LWxpY2Vuc2UucGhwXG4gIEF1dGhvciBUb2JpYXMgS29wcGVycyBAc29rcmFcbiovXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChjc3NXaXRoTWFwcGluZ1RvU3RyaW5nKSB7XG4gIHZhciBsaXN0ID0gW107XG5cbiAgLy8gcmV0dXJuIHRoZSBsaXN0IG9mIG1vZHVsZXMgYXMgY3NzIHN0cmluZ1xuICBsaXN0LnRvU3RyaW5nID0gZnVuY3Rpb24gdG9TdHJpbmcoKSB7XG4gICAgcmV0dXJuIHRoaXMubWFwKGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgICB2YXIgY29udGVudCA9IFwiXCI7XG4gICAgICB2YXIgbmVlZExheWVyID0gdHlwZW9mIGl0ZW1bNV0gIT09IFwidW5kZWZpbmVkXCI7XG4gICAgICBpZiAoaXRlbVs0XSkge1xuICAgICAgICBjb250ZW50ICs9IFwiQHN1cHBvcnRzIChcIi5jb25jYXQoaXRlbVs0XSwgXCIpIHtcIik7XG4gICAgICB9XG4gICAgICBpZiAoaXRlbVsyXSkge1xuICAgICAgICBjb250ZW50ICs9IFwiQG1lZGlhIFwiLmNvbmNhdChpdGVtWzJdLCBcIiB7XCIpO1xuICAgICAgfVxuICAgICAgaWYgKG5lZWRMYXllcikge1xuICAgICAgICBjb250ZW50ICs9IFwiQGxheWVyXCIuY29uY2F0KGl0ZW1bNV0ubGVuZ3RoID4gMCA/IFwiIFwiLmNvbmNhdChpdGVtWzVdKSA6IFwiXCIsIFwiIHtcIik7XG4gICAgICB9XG4gICAgICBjb250ZW50ICs9IGNzc1dpdGhNYXBwaW5nVG9TdHJpbmcoaXRlbSk7XG4gICAgICBpZiAobmVlZExheWVyKSB7XG4gICAgICAgIGNvbnRlbnQgKz0gXCJ9XCI7XG4gICAgICB9XG4gICAgICBpZiAoaXRlbVsyXSkge1xuICAgICAgICBjb250ZW50ICs9IFwifVwiO1xuICAgICAgfVxuICAgICAgaWYgKGl0ZW1bNF0pIHtcbiAgICAgICAgY29udGVudCArPSBcIn1cIjtcbiAgICAgIH1cbiAgICAgIHJldHVybiBjb250ZW50O1xuICAgIH0pLmpvaW4oXCJcIik7XG4gIH07XG5cbiAgLy8gaW1wb3J0IGEgbGlzdCBvZiBtb2R1bGVzIGludG8gdGhlIGxpc3RcbiAgbGlzdC5pID0gZnVuY3Rpb24gaShtb2R1bGVzLCBtZWRpYSwgZGVkdXBlLCBzdXBwb3J0cywgbGF5ZXIpIHtcbiAgICBpZiAodHlwZW9mIG1vZHVsZXMgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgIG1vZHVsZXMgPSBbW251bGwsIG1vZHVsZXMsIHVuZGVmaW5lZF1dO1xuICAgIH1cbiAgICB2YXIgYWxyZWFkeUltcG9ydGVkTW9kdWxlcyA9IHt9O1xuICAgIGlmIChkZWR1cGUpIHtcbiAgICAgIGZvciAodmFyIGsgPSAwOyBrIDwgdGhpcy5sZW5ndGg7IGsrKykge1xuICAgICAgICB2YXIgaWQgPSB0aGlzW2tdWzBdO1xuICAgICAgICBpZiAoaWQgIT0gbnVsbCkge1xuICAgICAgICAgIGFscmVhZHlJbXBvcnRlZE1vZHVsZXNbaWRdID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBmb3IgKHZhciBfayA9IDA7IF9rIDwgbW9kdWxlcy5sZW5ndGg7IF9rKyspIHtcbiAgICAgIHZhciBpdGVtID0gW10uY29uY2F0KG1vZHVsZXNbX2tdKTtcbiAgICAgIGlmIChkZWR1cGUgJiYgYWxyZWFkeUltcG9ydGVkTW9kdWxlc1tpdGVtWzBdXSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGlmICh0eXBlb2YgbGF5ZXIgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBpdGVtWzVdID09PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgICAgaXRlbVs1XSA9IGxheWVyO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGl0ZW1bMV0gPSBcIkBsYXllclwiLmNvbmNhdChpdGVtWzVdLmxlbmd0aCA+IDAgPyBcIiBcIi5jb25jYXQoaXRlbVs1XSkgOiBcIlwiLCBcIiB7XCIpLmNvbmNhdChpdGVtWzFdLCBcIn1cIik7XG4gICAgICAgICAgaXRlbVs1XSA9IGxheWVyO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAobWVkaWEpIHtcbiAgICAgICAgaWYgKCFpdGVtWzJdKSB7XG4gICAgICAgICAgaXRlbVsyXSA9IG1lZGlhO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGl0ZW1bMV0gPSBcIkBtZWRpYSBcIi5jb25jYXQoaXRlbVsyXSwgXCIge1wiKS5jb25jYXQoaXRlbVsxXSwgXCJ9XCIpO1xuICAgICAgICAgIGl0ZW1bMl0gPSBtZWRpYTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHN1cHBvcnRzKSB7XG4gICAgICAgIGlmICghaXRlbVs0XSkge1xuICAgICAgICAgIGl0ZW1bNF0gPSBcIlwiLmNvbmNhdChzdXBwb3J0cyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaXRlbVsxXSA9IFwiQHN1cHBvcnRzIChcIi5jb25jYXQoaXRlbVs0XSwgXCIpIHtcIikuY29uY2F0KGl0ZW1bMV0sIFwifVwiKTtcbiAgICAgICAgICBpdGVtWzRdID0gc3VwcG9ydHM7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGxpc3QucHVzaChpdGVtKTtcbiAgICB9XG4gIH07XG4gIHJldHVybiBsaXN0O1xufTsiLCJcInVzZSBzdHJpY3RcIjtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAodXJsLCBvcHRpb25zKSB7XG4gIGlmICghb3B0aW9ucykge1xuICAgIG9wdGlvbnMgPSB7fTtcbiAgfVxuICBpZiAoIXVybCkge1xuICAgIHJldHVybiB1cmw7XG4gIH1cbiAgdXJsID0gU3RyaW5nKHVybC5fX2VzTW9kdWxlID8gdXJsLmRlZmF1bHQgOiB1cmwpO1xuXG4gIC8vIElmIHVybCBpcyBhbHJlYWR5IHdyYXBwZWQgaW4gcXVvdGVzLCByZW1vdmUgdGhlbVxuICBpZiAoL15bJ1wiXS4qWydcIl0kLy50ZXN0KHVybCkpIHtcbiAgICB1cmwgPSB1cmwuc2xpY2UoMSwgLTEpO1xuICB9XG4gIGlmIChvcHRpb25zLmhhc2gpIHtcbiAgICB1cmwgKz0gb3B0aW9ucy5oYXNoO1xuICB9XG5cbiAgLy8gU2hvdWxkIHVybCBiZSB3cmFwcGVkP1xuICAvLyBTZWUgaHR0cHM6Ly9kcmFmdHMuY3Nzd2cub3JnL2Nzcy12YWx1ZXMtMy8jdXJsc1xuICBpZiAoL1tcIicoKSBcXHRcXG5dfCglMjApLy50ZXN0KHVybCkgfHwgb3B0aW9ucy5uZWVkUXVvdGVzKSB7XG4gICAgcmV0dXJuIFwiXFxcIlwiLmNvbmNhdCh1cmwucmVwbGFjZSgvXCIvZywgJ1xcXFxcIicpLnJlcGxhY2UoL1xcbi9nLCBcIlxcXFxuXCIpLCBcIlxcXCJcIik7XG4gIH1cbiAgcmV0dXJuIHVybDtcbn07IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0ZW0pIHtcbiAgdmFyIGNvbnRlbnQgPSBpdGVtWzFdO1xuICB2YXIgY3NzTWFwcGluZyA9IGl0ZW1bM107XG4gIGlmICghY3NzTWFwcGluZykge1xuICAgIHJldHVybiBjb250ZW50O1xuICB9XG4gIGlmICh0eXBlb2YgYnRvYSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgdmFyIGJhc2U2NCA9IGJ0b2EodW5lc2NhcGUoZW5jb2RlVVJJQ29tcG9uZW50KEpTT04uc3RyaW5naWZ5KGNzc01hcHBpbmcpKSkpO1xuICAgIHZhciBkYXRhID0gXCJzb3VyY2VNYXBwaW5nVVJMPWRhdGE6YXBwbGljYXRpb24vanNvbjtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxcIi5jb25jYXQoYmFzZTY0KTtcbiAgICB2YXIgc291cmNlTWFwcGluZyA9IFwiLyojIFwiLmNvbmNhdChkYXRhLCBcIiAqL1wiKTtcbiAgICByZXR1cm4gW2NvbnRlbnRdLmNvbmNhdChbc291cmNlTWFwcGluZ10pLmpvaW4oXCJcXG5cIik7XG4gIH1cbiAgcmV0dXJuIFtjb250ZW50XS5qb2luKFwiXFxuXCIpO1xufTsiLCIvLyBNb2R1bGVcbnZhciBjb2RlID0gXCI8ZGl2IGNsYXNzPVxcXCJBUFgtZGlhbG9nXFxcIj5cXHJcXG4gICAgPGRpdiBjbGFzcz1cXFwiQVBYLWRpYWxvZy1jb250ZW50XFxcIj5cXHJcXG4gICAgICAgIDxzcGFuIGNsYXNzPVxcXCJBUFgtY2xvc2UtZGlhbG9nXFxcIj4mdGltZXM7PC9zcGFuPlxcclxcbiAgICAgICAgPGgyIGNsYXNzPVxcXCJBUFgtZGlhbG9nLXRpdGxlXFxcIj48L2gyPlxcclxcbiAgICAgICAgPGRpdiBjbGFzcz1cXFwiQVBYLWRpYWxvZy1keW5hbWljLWNvbnRlbnRcXFwiPjwvZGl2PlxcclxcbiAgICAgICAgPGRpdiBjbGFzcz1cXFwiQVBYLWRpYWxvZy1idXR0b24tY29udGFpbmVyXFxcIj48L2Rpdj5cXHJcXG4gICAgPC9kaXY+XFxyXFxuPC9kaXY+XCI7XG4vLyBFeHBvcnRzXG5tb2R1bGUuZXhwb3J0cyA9IGNvZGU7IiwiXG4gICAgICBpbXBvcnQgQVBJIGZyb20gXCIhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5qZWN0U3R5bGVzSW50b1N0eWxlVGFnLmpzXCI7XG4gICAgICBpbXBvcnQgZG9tQVBJIGZyb20gXCIhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvc3R5bGVEb21BUEkuanNcIjtcbiAgICAgIGltcG9ydCBpbnNlcnRGbiBmcm9tIFwiIS4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luc2VydEJ5U2VsZWN0b3IuanNcIjtcbiAgICAgIGltcG9ydCBzZXRBdHRyaWJ1dGVzIGZyb20gXCIhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvc2V0QXR0cmlidXRlc1dpdGhvdXRBdHRyaWJ1dGVzLmpzXCI7XG4gICAgICBpbXBvcnQgaW5zZXJ0U3R5bGVFbGVtZW50IGZyb20gXCIhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5zZXJ0U3R5bGVFbGVtZW50LmpzXCI7XG4gICAgICBpbXBvcnQgc3R5bGVUYWdUcmFuc2Zvcm1GbiBmcm9tIFwiIS4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL3N0eWxlVGFnVHJhbnNmb3JtLmpzXCI7XG4gICAgICBpbXBvcnQgY29udGVudCwgKiBhcyBuYW1lZEV4cG9ydCBmcm9tIFwiISEuLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L2Nqcy5qcyEuL2RpYWxvZy5jc3NcIjtcbiAgICAgIFxuICAgICAgXG5cbnZhciBvcHRpb25zID0ge307XG5cbm9wdGlvbnMuc3R5bGVUYWdUcmFuc2Zvcm0gPSBzdHlsZVRhZ1RyYW5zZm9ybUZuO1xub3B0aW9ucy5zZXRBdHRyaWJ1dGVzID0gc2V0QXR0cmlidXRlcztcblxuICAgICAgb3B0aW9ucy5pbnNlcnQgPSBpbnNlcnRGbi5iaW5kKG51bGwsIFwiaGVhZFwiKTtcbiAgICBcbm9wdGlvbnMuZG9tQVBJID0gZG9tQVBJO1xub3B0aW9ucy5pbnNlcnRTdHlsZUVsZW1lbnQgPSBpbnNlcnRTdHlsZUVsZW1lbnQ7XG5cbnZhciB1cGRhdGUgPSBBUEkoY29udGVudCwgb3B0aW9ucyk7XG5cblxuXG5leHBvcnQgKiBmcm9tIFwiISEuLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L2Nqcy5qcyEuL2RpYWxvZy5jc3NcIjtcbiAgICAgICBleHBvcnQgZGVmYXVsdCBjb250ZW50ICYmIGNvbnRlbnQubG9jYWxzID8gY29udGVudC5sb2NhbHMgOiB1bmRlZmluZWQ7XG4iLCJcbiAgICAgIGltcG9ydCBBUEkgZnJvbSBcIiEuLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbmplY3RTdHlsZXNJbnRvU3R5bGVUYWcuanNcIjtcbiAgICAgIGltcG9ydCBkb21BUEkgZnJvbSBcIiEuLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9zdHlsZURvbUFQSS5qc1wiO1xuICAgICAgaW1wb3J0IGluc2VydEZuIGZyb20gXCIhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5zZXJ0QnlTZWxlY3Rvci5qc1wiO1xuICAgICAgaW1wb3J0IHNldEF0dHJpYnV0ZXMgZnJvbSBcIiEuLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9zZXRBdHRyaWJ1dGVzV2l0aG91dEF0dHJpYnV0ZXMuanNcIjtcbiAgICAgIGltcG9ydCBpbnNlcnRTdHlsZUVsZW1lbnQgZnJvbSBcIiEuLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbnNlcnRTdHlsZUVsZW1lbnQuanNcIjtcbiAgICAgIGltcG9ydCBzdHlsZVRhZ1RyYW5zZm9ybUZuIGZyb20gXCIhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvc3R5bGVUYWdUcmFuc2Zvcm0uanNcIjtcbiAgICAgIGltcG9ydCBjb250ZW50LCAqIGFzIG5hbWVkRXhwb3J0IGZyb20gXCIhIS4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvY2pzLmpzIS4vdHJpc3RhdGUuY3NzXCI7XG4gICAgICBcbiAgICAgIFxuXG52YXIgb3B0aW9ucyA9IHt9O1xuXG5vcHRpb25zLnN0eWxlVGFnVHJhbnNmb3JtID0gc3R5bGVUYWdUcmFuc2Zvcm1Gbjtcbm9wdGlvbnMuc2V0QXR0cmlidXRlcyA9IHNldEF0dHJpYnV0ZXM7XG5cbiAgICAgIG9wdGlvbnMuaW5zZXJ0ID0gaW5zZXJ0Rm4uYmluZChudWxsLCBcImhlYWRcIik7XG4gICAgXG5vcHRpb25zLmRvbUFQSSA9IGRvbUFQSTtcbm9wdGlvbnMuaW5zZXJ0U3R5bGVFbGVtZW50ID0gaW5zZXJ0U3R5bGVFbGVtZW50O1xuXG52YXIgdXBkYXRlID0gQVBJKGNvbnRlbnQsIG9wdGlvbnMpO1xuXG5cblxuZXhwb3J0ICogZnJvbSBcIiEhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9janMuanMhLi90cmlzdGF0ZS5jc3NcIjtcbiAgICAgICBleHBvcnQgZGVmYXVsdCBjb250ZW50ICYmIGNvbnRlbnQubG9jYWxzID8gY29udGVudC5sb2NhbHMgOiB1bmRlZmluZWQ7XG4iLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIHN0eWxlc0luRE9NID0gW107XG5mdW5jdGlvbiBnZXRJbmRleEJ5SWRlbnRpZmllcihpZGVudGlmaWVyKSB7XG4gIHZhciByZXN1bHQgPSAtMTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdHlsZXNJbkRPTS5sZW5ndGg7IGkrKykge1xuICAgIGlmIChzdHlsZXNJbkRPTVtpXS5pZGVudGlmaWVyID09PSBpZGVudGlmaWVyKSB7XG4gICAgICByZXN1bHQgPSBpO1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5mdW5jdGlvbiBtb2R1bGVzVG9Eb20obGlzdCwgb3B0aW9ucykge1xuICB2YXIgaWRDb3VudE1hcCA9IHt9O1xuICB2YXIgaWRlbnRpZmllcnMgPSBbXTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGl0ZW0gPSBsaXN0W2ldO1xuICAgIHZhciBpZCA9IG9wdGlvbnMuYmFzZSA/IGl0ZW1bMF0gKyBvcHRpb25zLmJhc2UgOiBpdGVtWzBdO1xuICAgIHZhciBjb3VudCA9IGlkQ291bnRNYXBbaWRdIHx8IDA7XG4gICAgdmFyIGlkZW50aWZpZXIgPSBcIlwiLmNvbmNhdChpZCwgXCIgXCIpLmNvbmNhdChjb3VudCk7XG4gICAgaWRDb3VudE1hcFtpZF0gPSBjb3VudCArIDE7XG4gICAgdmFyIGluZGV4QnlJZGVudGlmaWVyID0gZ2V0SW5kZXhCeUlkZW50aWZpZXIoaWRlbnRpZmllcik7XG4gICAgdmFyIG9iaiA9IHtcbiAgICAgIGNzczogaXRlbVsxXSxcbiAgICAgIG1lZGlhOiBpdGVtWzJdLFxuICAgICAgc291cmNlTWFwOiBpdGVtWzNdLFxuICAgICAgc3VwcG9ydHM6IGl0ZW1bNF0sXG4gICAgICBsYXllcjogaXRlbVs1XVxuICAgIH07XG4gICAgaWYgKGluZGV4QnlJZGVudGlmaWVyICE9PSAtMSkge1xuICAgICAgc3R5bGVzSW5ET01baW5kZXhCeUlkZW50aWZpZXJdLnJlZmVyZW5jZXMrKztcbiAgICAgIHN0eWxlc0luRE9NW2luZGV4QnlJZGVudGlmaWVyXS51cGRhdGVyKG9iaik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciB1cGRhdGVyID0gYWRkRWxlbWVudFN0eWxlKG9iaiwgb3B0aW9ucyk7XG4gICAgICBvcHRpb25zLmJ5SW5kZXggPSBpO1xuICAgICAgc3R5bGVzSW5ET00uc3BsaWNlKGksIDAsIHtcbiAgICAgICAgaWRlbnRpZmllcjogaWRlbnRpZmllcixcbiAgICAgICAgdXBkYXRlcjogdXBkYXRlcixcbiAgICAgICAgcmVmZXJlbmNlczogMVxuICAgICAgfSk7XG4gICAgfVxuICAgIGlkZW50aWZpZXJzLnB1c2goaWRlbnRpZmllcik7XG4gIH1cbiAgcmV0dXJuIGlkZW50aWZpZXJzO1xufVxuZnVuY3Rpb24gYWRkRWxlbWVudFN0eWxlKG9iaiwgb3B0aW9ucykge1xuICB2YXIgYXBpID0gb3B0aW9ucy5kb21BUEkob3B0aW9ucyk7XG4gIGFwaS51cGRhdGUob2JqKTtcbiAgdmFyIHVwZGF0ZXIgPSBmdW5jdGlvbiB1cGRhdGVyKG5ld09iaikge1xuICAgIGlmIChuZXdPYmopIHtcbiAgICAgIGlmIChuZXdPYmouY3NzID09PSBvYmouY3NzICYmIG5ld09iai5tZWRpYSA9PT0gb2JqLm1lZGlhICYmIG5ld09iai5zb3VyY2VNYXAgPT09IG9iai5zb3VyY2VNYXAgJiYgbmV3T2JqLnN1cHBvcnRzID09PSBvYmouc3VwcG9ydHMgJiYgbmV3T2JqLmxheWVyID09PSBvYmoubGF5ZXIpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgYXBpLnVwZGF0ZShvYmogPSBuZXdPYmopO1xuICAgIH0gZWxzZSB7XG4gICAgICBhcGkucmVtb3ZlKCk7XG4gICAgfVxuICB9O1xuICByZXR1cm4gdXBkYXRlcjtcbn1cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGxpc3QsIG9wdGlvbnMpIHtcbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gIGxpc3QgPSBsaXN0IHx8IFtdO1xuICB2YXIgbGFzdElkZW50aWZpZXJzID0gbW9kdWxlc1RvRG9tKGxpc3QsIG9wdGlvbnMpO1xuICByZXR1cm4gZnVuY3Rpb24gdXBkYXRlKG5ld0xpc3QpIHtcbiAgICBuZXdMaXN0ID0gbmV3TGlzdCB8fCBbXTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxhc3RJZGVudGlmaWVycy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGlkZW50aWZpZXIgPSBsYXN0SWRlbnRpZmllcnNbaV07XG4gICAgICB2YXIgaW5kZXggPSBnZXRJbmRleEJ5SWRlbnRpZmllcihpZGVudGlmaWVyKTtcbiAgICAgIHN0eWxlc0luRE9NW2luZGV4XS5yZWZlcmVuY2VzLS07XG4gICAgfVxuICAgIHZhciBuZXdMYXN0SWRlbnRpZmllcnMgPSBtb2R1bGVzVG9Eb20obmV3TGlzdCwgb3B0aW9ucyk7XG4gICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGxhc3RJZGVudGlmaWVycy5sZW5ndGg7IF9pKyspIHtcbiAgICAgIHZhciBfaWRlbnRpZmllciA9IGxhc3RJZGVudGlmaWVyc1tfaV07XG4gICAgICB2YXIgX2luZGV4ID0gZ2V0SW5kZXhCeUlkZW50aWZpZXIoX2lkZW50aWZpZXIpO1xuICAgICAgaWYgKHN0eWxlc0luRE9NW19pbmRleF0ucmVmZXJlbmNlcyA9PT0gMCkge1xuICAgICAgICBzdHlsZXNJbkRPTVtfaW5kZXhdLnVwZGF0ZXIoKTtcbiAgICAgICAgc3R5bGVzSW5ET00uc3BsaWNlKF9pbmRleCwgMSk7XG4gICAgICB9XG4gICAgfVxuICAgIGxhc3RJZGVudGlmaWVycyA9IG5ld0xhc3RJZGVudGlmaWVycztcbiAgfTtcbn07IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBtZW1vID0ge307XG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICAqL1xuZnVuY3Rpb24gZ2V0VGFyZ2V0KHRhcmdldCkge1xuICBpZiAodHlwZW9mIG1lbW9bdGFyZ2V0XSA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgIHZhciBzdHlsZVRhcmdldCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IodGFyZ2V0KTtcblxuICAgIC8vIFNwZWNpYWwgY2FzZSB0byByZXR1cm4gaGVhZCBvZiBpZnJhbWUgaW5zdGVhZCBvZiBpZnJhbWUgaXRzZWxmXG4gICAgaWYgKHdpbmRvdy5IVE1MSUZyYW1lRWxlbWVudCAmJiBzdHlsZVRhcmdldCBpbnN0YW5jZW9mIHdpbmRvdy5IVE1MSUZyYW1lRWxlbWVudCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gVGhpcyB3aWxsIHRocm93IGFuIGV4Y2VwdGlvbiBpZiBhY2Nlc3MgdG8gaWZyYW1lIGlzIGJsb2NrZWRcbiAgICAgICAgLy8gZHVlIHRvIGNyb3NzLW9yaWdpbiByZXN0cmljdGlvbnNcbiAgICAgICAgc3R5bGVUYXJnZXQgPSBzdHlsZVRhcmdldC5jb250ZW50RG9jdW1lbnQuaGVhZDtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgLy8gaXN0YW5idWwgaWdub3JlIG5leHRcbiAgICAgICAgc3R5bGVUYXJnZXQgPSBudWxsO1xuICAgICAgfVxuICAgIH1cbiAgICBtZW1vW3RhcmdldF0gPSBzdHlsZVRhcmdldDtcbiAgfVxuICByZXR1cm4gbWVtb1t0YXJnZXRdO1xufVxuXG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAgKi9cbmZ1bmN0aW9uIGluc2VydEJ5U2VsZWN0b3IoaW5zZXJ0LCBzdHlsZSkge1xuICB2YXIgdGFyZ2V0ID0gZ2V0VGFyZ2V0KGluc2VydCk7XG4gIGlmICghdGFyZ2V0KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiQ291bGRuJ3QgZmluZCBhIHN0eWxlIHRhcmdldC4gVGhpcyBwcm9iYWJseSBtZWFucyB0aGF0IHRoZSB2YWx1ZSBmb3IgdGhlICdpbnNlcnQnIHBhcmFtZXRlciBpcyBpbnZhbGlkLlwiKTtcbiAgfVxuICB0YXJnZXQuYXBwZW5kQ2hpbGQoc3R5bGUpO1xufVxubW9kdWxlLmV4cG9ydHMgPSBpbnNlcnRCeVNlbGVjdG9yOyIsIlwidXNlIHN0cmljdFwiO1xuXG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAgKi9cbmZ1bmN0aW9uIGluc2VydFN0eWxlRWxlbWVudChvcHRpb25zKSB7XG4gIHZhciBlbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInN0eWxlXCIpO1xuICBvcHRpb25zLnNldEF0dHJpYnV0ZXMoZWxlbWVudCwgb3B0aW9ucy5hdHRyaWJ1dGVzKTtcbiAgb3B0aW9ucy5pbnNlcnQoZWxlbWVudCwgb3B0aW9ucy5vcHRpb25zKTtcbiAgcmV0dXJuIGVsZW1lbnQ7XG59XG5tb2R1bGUuZXhwb3J0cyA9IGluc2VydFN0eWxlRWxlbWVudDsiLCJcInVzZSBzdHJpY3RcIjtcblxuLyogaXN0YW5idWwgaWdub3JlIG5leHQgICovXG5mdW5jdGlvbiBzZXRBdHRyaWJ1dGVzV2l0aG91dEF0dHJpYnV0ZXMoc3R5bGVFbGVtZW50KSB7XG4gIHZhciBub25jZSA9IHR5cGVvZiBfX3dlYnBhY2tfbm9uY2VfXyAhPT0gXCJ1bmRlZmluZWRcIiA/IF9fd2VicGFja19ub25jZV9fIDogbnVsbDtcbiAgaWYgKG5vbmNlKSB7XG4gICAgc3R5bGVFbGVtZW50LnNldEF0dHJpYnV0ZShcIm5vbmNlXCIsIG5vbmNlKTtcbiAgfVxufVxubW9kdWxlLmV4cG9ydHMgPSBzZXRBdHRyaWJ1dGVzV2l0aG91dEF0dHJpYnV0ZXM7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICAqL1xuZnVuY3Rpb24gYXBwbHkoc3R5bGVFbGVtZW50LCBvcHRpb25zLCBvYmopIHtcbiAgdmFyIGNzcyA9IFwiXCI7XG4gIGlmIChvYmouc3VwcG9ydHMpIHtcbiAgICBjc3MgKz0gXCJAc3VwcG9ydHMgKFwiLmNvbmNhdChvYmouc3VwcG9ydHMsIFwiKSB7XCIpO1xuICB9XG4gIGlmIChvYmoubWVkaWEpIHtcbiAgICBjc3MgKz0gXCJAbWVkaWEgXCIuY29uY2F0KG9iai5tZWRpYSwgXCIge1wiKTtcbiAgfVxuICB2YXIgbmVlZExheWVyID0gdHlwZW9mIG9iai5sYXllciAhPT0gXCJ1bmRlZmluZWRcIjtcbiAgaWYgKG5lZWRMYXllcikge1xuICAgIGNzcyArPSBcIkBsYXllclwiLmNvbmNhdChvYmoubGF5ZXIubGVuZ3RoID4gMCA/IFwiIFwiLmNvbmNhdChvYmoubGF5ZXIpIDogXCJcIiwgXCIge1wiKTtcbiAgfVxuICBjc3MgKz0gb2JqLmNzcztcbiAgaWYgKG5lZWRMYXllcikge1xuICAgIGNzcyArPSBcIn1cIjtcbiAgfVxuICBpZiAob2JqLm1lZGlhKSB7XG4gICAgY3NzICs9IFwifVwiO1xuICB9XG4gIGlmIChvYmouc3VwcG9ydHMpIHtcbiAgICBjc3MgKz0gXCJ9XCI7XG4gIH1cbiAgdmFyIHNvdXJjZU1hcCA9IG9iai5zb3VyY2VNYXA7XG4gIGlmIChzb3VyY2VNYXAgJiYgdHlwZW9mIGJ0b2EgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICBjc3MgKz0gXCJcXG4vKiMgc291cmNlTWFwcGluZ1VSTD1kYXRhOmFwcGxpY2F0aW9uL2pzb247YmFzZTY0LFwiLmNvbmNhdChidG9hKHVuZXNjYXBlKGVuY29kZVVSSUNvbXBvbmVudChKU09OLnN0cmluZ2lmeShzb3VyY2VNYXApKSkpLCBcIiAqL1wiKTtcbiAgfVxuXG4gIC8vIEZvciBvbGQgSUVcbiAgLyogaXN0YW5idWwgaWdub3JlIGlmICAqL1xuICBvcHRpb25zLnN0eWxlVGFnVHJhbnNmb3JtKGNzcywgc3R5bGVFbGVtZW50LCBvcHRpb25zLm9wdGlvbnMpO1xufVxuZnVuY3Rpb24gcmVtb3ZlU3R5bGVFbGVtZW50KHN0eWxlRWxlbWVudCkge1xuICAvLyBpc3RhbmJ1bCBpZ25vcmUgaWZcbiAgaWYgKHN0eWxlRWxlbWVudC5wYXJlbnROb2RlID09PSBudWxsKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHN0eWxlRWxlbWVudC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHN0eWxlRWxlbWVudCk7XG59XG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICAqL1xuZnVuY3Rpb24gZG9tQVBJKG9wdGlvbnMpIHtcbiAgaWYgKHR5cGVvZiBkb2N1bWVudCA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgIHJldHVybiB7XG4gICAgICB1cGRhdGU6IGZ1bmN0aW9uIHVwZGF0ZSgpIHt9LFxuICAgICAgcmVtb3ZlOiBmdW5jdGlvbiByZW1vdmUoKSB7fVxuICAgIH07XG4gIH1cbiAgdmFyIHN0eWxlRWxlbWVudCA9IG9wdGlvbnMuaW5zZXJ0U3R5bGVFbGVtZW50KG9wdGlvbnMpO1xuICByZXR1cm4ge1xuICAgIHVwZGF0ZTogZnVuY3Rpb24gdXBkYXRlKG9iaikge1xuICAgICAgYXBwbHkoc3R5bGVFbGVtZW50LCBvcHRpb25zLCBvYmopO1xuICAgIH0sXG4gICAgcmVtb3ZlOiBmdW5jdGlvbiByZW1vdmUoKSB7XG4gICAgICByZW1vdmVTdHlsZUVsZW1lbnQoc3R5bGVFbGVtZW50KTtcbiAgICB9XG4gIH07XG59XG5tb2R1bGUuZXhwb3J0cyA9IGRvbUFQSTsiLCJcInVzZSBzdHJpY3RcIjtcblxuLyogaXN0YW5idWwgaWdub3JlIG5leHQgICovXG5mdW5jdGlvbiBzdHlsZVRhZ1RyYW5zZm9ybShjc3MsIHN0eWxlRWxlbWVudCkge1xuICBpZiAoc3R5bGVFbGVtZW50LnN0eWxlU2hlZXQpIHtcbiAgICBzdHlsZUVsZW1lbnQuc3R5bGVTaGVldC5jc3NUZXh0ID0gY3NzO1xuICB9IGVsc2Uge1xuICAgIHdoaWxlIChzdHlsZUVsZW1lbnQuZmlyc3RDaGlsZCkge1xuICAgICAgc3R5bGVFbGVtZW50LnJlbW92ZUNoaWxkKHN0eWxlRWxlbWVudC5maXJzdENoaWxkKTtcbiAgICB9XG4gICAgc3R5bGVFbGVtZW50LmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGNzcykpO1xuICB9XG59XG5tb2R1bGUuZXhwb3J0cyA9IHN0eWxlVGFnVHJhbnNmb3JtOyIsIi8vIEZ1bmN0aW9uIHRvIGxvYWQgdGhlIENTUyBmcm9tIGEgZ2l2ZW4gVVJMXHJcbmZ1bmN0aW9uIGxvYWRDc3ModXJsKSB7XHJcbiAgICByZXR1cm4gZmV0Y2godXJsKVxyXG4gICAgICAgIC50aGVuKHJlc3BvbnNlID0+IHJlc3BvbnNlLnRleHQoKSlcclxuICAgICAgICAudGhlbihjc3MgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBzdHlsZVNoZWV0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInN0eWxlXCIpO1xyXG4gICAgICAgICAgICBzdHlsZVNoZWV0LnR5cGUgPSBcInRleHQvY3NzXCI7XHJcbiAgICAgICAgICAgIHN0eWxlU2hlZXQudGV4dENvbnRlbnQgPSBjc3M7ICAvLyBVc2UgdGV4dENvbnRlbnQgaW5zdGVhZCBvZiBpbm5lclRleHRcclxuICAgICAgICAgICAgZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChzdHlsZVNoZWV0KTtcclxuICAgICAgICB9KVxyXG4gICAgICAgIC5jYXRjaChlcnJvciA9PiB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJGYWlsZWQgdG8gbG9hZCBDU1M6XCIsIGVycm9yKTtcclxuICAgICAgICB9KTtcclxufVxyXG5cclxuZXhwb3J0IHtcclxuICAgIGxvYWRDc3NcclxufSIsIi8vIEltcG9ydGluZyB0aGUgQ1NTIGFuZCBIVE1MIHRlbXBsYXRlc1xyXG5pbXBvcnQgJy4vY3NzL2RpYWxvZy5jc3MnO1xyXG5pbXBvcnQgZGlhbG9nVGVtcGxhdGUgZnJvbSAnLi9odG1sL2RpYWxvZy5odG1sP3Jhdyc7XHJcblxyXG5jb25zdCBjcmVhdGVEaWFsb2cgPSAob3B0aW9ucykgPT4ge1xyXG4gICAgY29uc3QgZGlhbG9nRGVmYXVsdHMgPSB7XHJcbiAgICAgICAgdGl0bGU6ICcnLFxyXG4gICAgICAgIGNvbnRlbnQ6ICcnLFxyXG4gICAgICAgIGNvbnRlbnRVUkk6ICcnLFxyXG4gICAgICAgIGJ1dHRvbnM6IFtdLFxyXG4gICAgICAgIHNpemU6ICdtZWRpdW0nLFxyXG4gICAgICAgIHNob3dMb2FkaW5nSW5kaWNhdG9yOiBmYWxzZSxcclxuICAgICAgICBjb250ZW50TWV0aG9kOiAnR0VUJyxcclxuICAgICAgICBjb250ZW50RGF0YTogbnVsbCxcclxuICAgICAgICBjb250ZW50SGVhZGVyczogdW5kZWZpbmVkXHJcbiAgICB9O1xyXG5cclxuICAgIGNvbnN0IHsgdGl0bGUsIGNvbnRlbnQsIGNvbnRlbnRVUkksIGJ1dHRvbnMsIHNpemUsIHNob3dMb2FkaW5nSW5kaWNhdG9yLCBjb250ZW50TWV0aG9kLCBjb250ZW50RGF0YSwgY29udGVudEhlYWRlcnMgfSA9IHsgLi4uZGlhbG9nRGVmYXVsdHMsIC4uLm9wdGlvbnMgfTtcclxuXHJcbiAgICBjb25zdCB3cmFwcGVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XHJcbiAgICB3cmFwcGVyLmlubmVySFRNTCA9IGRpYWxvZ1RlbXBsYXRlLnRyaW0oKTtcclxuICAgIGNvbnN0IGRpYWxvZ0VsZW1lbnQgPSB3cmFwcGVyLmZpcnN0Q2hpbGQ7XHJcblxyXG4gICAgLy8gTGlmZWN5Y2xlIGV2ZW50IG1hbmFnZW1lbnRcclxuICAgIGNvbnN0IGxpZmVjeWNsZVJlc29sdmVycyA9IHt9O1xyXG4gICAgY29uc3QgbGlmZWN5Y2xlRXZlbnRzID0ge307XHJcblxyXG4gICAgLy8gRGVmaW5lIGxpZmVjeWNsZSBwcm9taXNlcyBhcyBwcm9wZXJ0aWVzXHJcbiAgICBbJ29wZW5pbmcnLCAnb3BlbmVkJywgJ2Nsb3NpbmcnLCAnY2xvc2VkJywgJ2NvbnRlbnRMb2FkaW5nJywgJ2NvbnRlbnRMb2FkZWQnXS5mb3JFYWNoKChldmVudCkgPT4ge1xyXG4gICAgICAgIGxpZmVjeWNsZUV2ZW50c1tldmVudF0gPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xyXG4gICAgICAgICAgICBsaWZlY3ljbGVSZXNvbHZlcnNbZXZlbnRdID0gcmVzb2x2ZTtcclxuICAgICAgICB9KTtcclxuICAgIH0pO1xyXG5cclxuICAgIGNvbnN0IHRyaWdnZXJFdmVudCA9IChldmVudCkgPT4ge1xyXG4gICAgICAgIGlmIChsaWZlY3ljbGVSZXNvbHZlcnNbZXZlbnRdKSB7XHJcbiAgICAgICAgICAgIGxpZmVjeWNsZVJlc29sdmVyc1tldmVudF0oKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBjb25zb2xlLndhcm4oYE5vIHJlc29sdmVyIGZvdW5kIGZvciBsaWZlY3ljbGUgZXZlbnQ6ICR7ZXZlbnR9YCk7XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuXHJcbiAgICBjb25zdCBkaWFsb2cgPSB7XHJcbiAgICAgICAgZWxlbWVudDogZGlhbG9nRWxlbWVudCxcclxuICAgICAgICBidXR0b25zOiB7fSxcclxuICAgICAgICBpc0Nsb3NlZDogZmFsc2UsXHJcbiAgICAgICAgbGlmZWN5Y2xlOiBsaWZlY3ljbGVFdmVudHMsIC8vIExpZmVjeWNsZSBwcm9taXNlcyBkaXJlY3RseSBleHBvc2VkIGhlcmVcclxuICAgICAgICBkaXNhYmxlQnV0dG9uOiAoa2V5KSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IGJ1dHRvbiA9IGRpYWxvZ0VsZW1lbnQucXVlcnlTZWxlY3RvcihgLkFQWC1kaWFsb2ctYnV0dG9uW2RhdGEta2V5PVwiJHtrZXl9XCJdYCk7XHJcbiAgICAgICAgICAgIGlmIChidXR0b24pIHtcclxuICAgICAgICAgICAgICAgIGJ1dHRvbi5kaXNhYmxlZCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICBidXR0b24uY2xhc3NMaXN0LmFkZCgnQVBYLWRpYWxvZy1idXR0b24tZGlzYWJsZWQnKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgZW5hYmxlQnV0dG9uOiAoa2V5KSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IGJ1dHRvbiA9IGRpYWxvZ0VsZW1lbnQucXVlcnlTZWxlY3RvcihgLkFQWC1kaWFsb2ctYnV0dG9uW2RhdGEta2V5PVwiJHtrZXl9XCJdYCk7XHJcbiAgICAgICAgICAgIGlmIChidXR0b24pIHtcclxuICAgICAgICAgICAgICAgIGJ1dHRvbi5kaXNhYmxlZCA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgYnV0dG9uLmNsYXNzTGlzdC5yZW1vdmUoJ0FQWC1kaWFsb2ctYnV0dG9uLWRpc2FibGVkJyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgICAgIG9wZW46IGFzeW5jICgpID0+IHtcclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIHRyaWdnZXJFdmVudCgnb3BlbmluZycpO1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgZGlhbG9nLmxpZmVjeWNsZS5vcGVuaW5nO1xyXG5cclxuICAgICAgICAgICAgICAgIC8vIElmIGxvYWRpbmcgaW5kaWNhdG9yIGlzIGVuYWJsZWQgYW5kIHdlJ3JlIGZldGNoaW5nIGNvbnRlbnQsIHNob3cgZGlhbG9nIGZpcnN0XHJcbiAgICAgICAgICAgICAgICBpZiAoc2hvd0xvYWRpbmdJbmRpY2F0b3IgJiYgY29udGVudFVSSSkge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIEFwcGVuZCBkaWFsb2cgdG8gdGhlIERPTSBhbmQgZGlzcGxheSBpdCBmaXJzdFxyXG4gICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZGlhbG9nRWxlbWVudCk7XHJcbiAgICAgICAgICAgICAgICAgICAgZGlhbG9nRWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gXCJmbGV4XCI7XHJcbiAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gU2hvdyBsb2FkaW5nIGluZGljYXRvclxyXG4gICAgICAgICAgICAgICAgICAgIGRpYWxvZ0VsZW1lbnQucXVlcnlTZWxlY3RvcihcIi5BUFgtZGlhbG9nLWR5bmFtaWMtY29udGVudFwiKS5pbm5lckhUTUwgPSAnPGRpdiBjbGFzcz1cIkFQWC1kaWFsb2ctbG9hZGluZy1pbmRpY2F0b3JcIj48L2Rpdj4nO1xyXG4gICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgIC8vIExvYWQgY29udGVudCBhZnRlciBkaWFsb2cgaXMgdmlzaWJsZVxyXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IGZldGNoQW5kSW5zZXJ0Q29udGVudCgpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyBEZWZhdWx0IGJlaGF2aW9yOiBsb2FkIGNvbnRlbnQgZmlyc3QsIHRoZW4gc2hvdyBkaWFsb2dcclxuICAgICAgICAgICAgICAgICAgICBhd2FpdCBmZXRjaEFuZEluc2VydENvbnRlbnQoKTtcclxuICAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICAvLyBBcHBlbmQgZGlhbG9nIHRvIHRoZSBET00gYW5kIGRpc3BsYXkgaXRcclxuICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGRpYWxvZ0VsZW1lbnQpO1xyXG4gICAgICAgICAgICAgICAgICAgIGRpYWxvZ0VsZW1lbnQuc3R5bGUuZGlzcGxheSA9IFwiZmxleFwiO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIHRyaWdnZXJFdmVudCgnb3BlbmVkJyk7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCBkaWFsb2cubGlmZWN5Y2xlLm9wZW5lZDtcclxuICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIG9wZW5pbmcgZGlhbG9nOicsIGVycm9yKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gZGlhbG9nOyAvLyBSZXR1cm4gZm9yIGRhaXN5LWNoYWluaW5nXHJcbiAgICAgICAgfSxcclxuICAgICAgICBjbG9zZTogYXN5bmMgKCkgPT4ge1xyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgdHJpZ2dlckV2ZW50KCdjbG9zaW5nJyk7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCBkaWFsb2cubGlmZWN5Y2xlLmNsb3Npbmc7XHJcblxyXG4gICAgICAgICAgICAgICAgLy8gQ2xlYW51cCBhbmQgcmVtb3ZlIGRpYWxvZ1xyXG4gICAgICAgICAgICAgICAgY2xvc2VEaWFsb2dBbmRDbGVhbnVwKCk7XHJcblxyXG4gICAgICAgICAgICAgICAgdHJpZ2dlckV2ZW50KCdjbG9zZWQnKTtcclxuICAgICAgICAgICAgICAgIGF3YWl0IGRpYWxvZy5saWZlY3ljbGUuY2xvc2VkO1xyXG4gICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgZHVyaW5nIGRpYWxvZyBjbG9zaW5nOicsIGVycm9yKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gZGlhbG9nOyAvLyBSZXR1cm4gZm9yIGRhaXN5LWNoYWluaW5nXHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuXHJcbiAgICBjb25zdCBjbG9zZURpYWxvZ0FuZENsZWFudXAgPSAoKSA9PiB7XHJcbiAgICAgICAgaWYgKGRpYWxvZy5pc0Nsb3NlZCkgcmV0dXJuO1xyXG5cclxuICAgICAgICBkaWFsb2cuaXNDbG9zZWQgPSB0cnVlO1xyXG4gICAgICAgIGRpYWxvZ0VsZW1lbnQuc3R5bGUuZGlzcGxheSA9IFwibm9uZVwiO1xyXG4gICAgICAgIGlmIChkb2N1bWVudC5ib2R5LmNvbnRhaW5zKGRpYWxvZ0VsZW1lbnQpKSB7XHJcbiAgICAgICAgICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoZGlhbG9nRWxlbWVudCk7XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuXHJcbiAgICBjb25zdCBzZXREaWFsb2dTaXplID0gKCkgPT4ge1xyXG4gICAgICAgIGNvbnN0IGRpYWxvZ0NvbnRlbnQgPSBkaWFsb2dFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoXCIuQVBYLWRpYWxvZy1jb250ZW50XCIpO1xyXG4gICAgICAgIGNvbnN0IHNpemVzID0ge1xyXG4gICAgICAgICAgICBzbWFsbDogeyB3aWR0aDogJzMwMHB4JywgaGVpZ2h0OiAnMjAwcHgnIH0sXHJcbiAgICAgICAgICAgIG1lZGl1bTogeyB3aWR0aDogJzUwMHB4JywgaGVpZ2h0OiAnNDAwcHgnIH0sXHJcbiAgICAgICAgICAgIGxhcmdlOiB7IHdpZHRoOiAnODAwcHgnLCBoZWlnaHQ6ICc2MDBweCcgfVxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIGlmIChzaXplID09PSAnYXV0bycpIHJldHVybjtcclxuXHJcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWRTaXplID0gc2l6ZXNbc2l6ZV0gfHwgKHR5cGVvZiBzaXplID09PSAnb2JqZWN0JyAmJiBzaXplKTtcclxuICAgICAgICBpZiAoc2VsZWN0ZWRTaXplKSB7XHJcbiAgICAgICAgICAgIGRpYWxvZ0NvbnRlbnQuc3R5bGUubWluV2lkdGggPSBzZWxlY3RlZFNpemUud2lkdGggfHwgJzUwMHB4JztcclxuICAgICAgICAgICAgZGlhbG9nQ29udGVudC5zdHlsZS5taW5IZWlnaHQgPSBzZWxlY3RlZFNpemUuaGVpZ2h0IHx8ICc0MDBweCc7XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuXHJcbiAgICBjb25zdCBhZGRCdXR0b25zID0gKCkgPT4ge1xyXG4gICAgICAgIGNvbnN0IGJ1dHRvbkNvbnRhaW5lciA9IGRpYWxvZ0VsZW1lbnQucXVlcnlTZWxlY3RvcihcIi5BUFgtZGlhbG9nLWJ1dHRvbi1jb250YWluZXJcIik7XHJcblxyXG4gICAgICAgIGJ1dHRvbnMuZm9yRWFjaCgoeyBrZXksIGxhYmVsLCBvcmRlciA9IDAsIGFsaWduID0gJ2ZsZXgtZW5kJywgY2xvc2VPbkNsaWNrID0gdHJ1ZSB9KSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IGJ1dHRvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2J1dHRvbicpO1xyXG4gICAgICAgICAgICBidXR0b24uY2xhc3NMaXN0LmFkZCgnQVBYLWRpYWxvZy1idXR0b24nKTtcclxuICAgICAgICAgICAgYnV0dG9uLnRleHRDb250ZW50ID0gbGFiZWw7XHJcbiAgICAgICAgICAgIGJ1dHRvbi5zdHlsZS5vcmRlciA9IG9yZGVyO1xyXG4gICAgICAgICAgICBidXR0b24uc2V0QXR0cmlidXRlKCdkYXRhLWtleScsIGtleSk7XHJcblxyXG4gICAgICAgICAgICAvLyBDcmVhdGUgYnV0dG9uIGNvbnRleHQgd2l0aCBkaXNhYmxlL2VuYWJsZSBtZXRob2RzXHJcbiAgICAgICAgICAgIGNvbnN0IGJ1dHRvbkNvbnRleHQgPSB7XHJcbiAgICAgICAgICAgICAgICBkaXNhYmxlOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgYnV0dG9uLmRpc2FibGVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICBidXR0b24uY2xhc3NMaXN0LmFkZCgnQVBYLWRpYWxvZy1idXR0b24tZGlzYWJsZWQnKTtcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICBlbmFibGU6ICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBidXR0b24uZGlzYWJsZWQgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICBidXR0b24uY2xhc3NMaXN0LnJlbW92ZSgnQVBYLWRpYWxvZy1idXR0b24tZGlzYWJsZWQnKTtcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICBrZXksXHJcbiAgICAgICAgICAgICAgICBlbGVtZW50OiBidXR0b25cclxuICAgICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICAgIGlmIChjbG9zZU9uQ2xpY2spIHtcclxuICAgICAgICAgICAgICAgIC8vIEhhbmRsZSBhcyBhIG9uZS10aW1lIFByb21pc2VcclxuICAgICAgICAgICAgICAgIGxldCBmaXJzdENsaWNrUmVzb2x2ZWQgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgICAgICAgICBjb25zdCBmaXJzdENsaWNrUHJvbWlzZSA9IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgYnV0dG9uLm9uY2xpY2sgPSAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZmlyc3RDbGlja1Jlc29sdmVkICYmICFidXR0b24uZGlzYWJsZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0Q2xpY2tSZXNvbHZlZCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHsgZGlhbG9nLCBidXR0b246IGJ1dHRvbkNvbnRleHQgfSk7IC8vIFBhc3MgYm90aCBkaWFsb2cgYW5kIGJ1dHRvbiBjb250ZXh0XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWFsb2cuY2xvc2UoKTsgLy8gQ2xvc2UgdGhlIGRpYWxvZ1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgICAgIC8vIEFzc2lnbiB0aGUgcHJvbWlzZSBmb3IgY2hhaW5pbmcgd2l0aCBgLnRoZW5gXHJcbiAgICAgICAgICAgICAgICBkaWFsb2cuYnV0dG9uc1trZXldID0gZmlyc3RDbGlja1Byb21pc2U7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAvLyBIYW5kbGUgYXMgYSByZXBlYXRlZCBldmVudCBoYW5kbGVyXHJcbiAgICAgICAgICAgICAgICBsZXQgaGFuZGxlcnMgPSBbXTsgLy8gU3RvcmUgaGFuZGxlcnMgZm9yIGAudGhlbigpYFxyXG5cclxuICAgICAgICAgICAgICAgIGNvbnN0IGNsaWNrUHJvbWlzZSA9IHtcclxuICAgICAgICAgICAgICAgICAgICB0aGVuOiAoY2FsbGJhY2spID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBjYWxsYmFjayA9PT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlcnMucHVzaChjYWxsYmFjayk7IC8vIEFkZCB0byBoYW5kbGVyc1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjbGlja1Byb21pc2U7IC8vIEFsbG93IGNoYWluaW5nXHJcbiAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgICAgICAgYnV0dG9uLm9uY2xpY2sgPSAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFidXR0b24uZGlzYWJsZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlcnMuZm9yRWFjaCgoaGFuZGxlcikgPT4gaGFuZGxlcih7IGRpYWxvZywgYnV0dG9uOiBidXR0b25Db250ZXh0IH0pKTsgLy8gUGFzcyBib3RoIGRpYWxvZyBhbmQgYnV0dG9uIGNvbnRleHRcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgICAgIGRpYWxvZy5idXR0b25zW2tleV0gPSBjbGlja1Byb21pc2U7IC8vIEFzc2lnbiB0aGUgXCJmYWtlXCIgcHJvbWlzZVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBidXR0b25Db250YWluZXIuYXBwZW5kQ2hpbGQoYnV0dG9uKTtcclxuICAgICAgICAgICAgYnV0dG9uQ29udGFpbmVyLnN0eWxlLmp1c3RpZnlDb250ZW50ID0gYWxpZ247XHJcbiAgICAgICAgfSk7XHJcbiAgICB9O1xyXG5cclxuICAgIGNvbnN0IGZldGNoQW5kSW5zZXJ0Q29udGVudCA9IGFzeW5jICgpID0+IHtcclxuICAgICAgICBjb25zdCBvcmlnaW5hbEN1cnNvciA9IGRvY3VtZW50LmJvZHkuc3R5bGUuY3Vyc29yO1xyXG4gICAgICAgIGRvY3VtZW50LmJvZHkuc3R5bGUuY3Vyc29yID0gJ3dhaXQnO1xyXG4gICAgICAgIGNvbnN0IGR5bmFtaWNDb250ZW50ID0gZGlhbG9nRWxlbWVudC5xdWVyeVNlbGVjdG9yKFwiLkFQWC1kaWFsb2ctZHluYW1pYy1jb250ZW50XCIpO1xyXG4gICAgICAgIFxyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHRyaWdnZXJFdmVudCgnY29udGVudExvYWRpbmcnKTtcclxuICAgICAgICAgICAgYXdhaXQgZGlhbG9nLmxpZmVjeWNsZS5jb250ZW50TG9hZGluZztcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IGNvbnRlbnRIdG1sID0gY29udGVudFVSSVxyXG4gICAgICAgICAgICAgICAgPyBhd2FpdCBmZXRjaENvbnRlbnQoY29udGVudFVSSSlcclxuICAgICAgICAgICAgICAgIDogY29udGVudDtcclxuXHJcbiAgICAgICAgICAgIGR5bmFtaWNDb250ZW50LmlubmVySFRNTCA9IGNvbnRlbnRIdG1sO1xyXG5cclxuICAgICAgICAgICAgdHJpZ2dlckV2ZW50KCdjb250ZW50TG9hZGVkJyk7XHJcbiAgICAgICAgICAgIGF3YWl0IGRpYWxvZy5saWZlY3ljbGUuY29udGVudExvYWRlZDtcclxuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBsb2FkaW5nIGNvbnRlbnQ6JywgZXJyb3IpO1xyXG4gICAgICAgIH0gZmluYWxseSB7XHJcbiAgICAgICAgICAgIGRvY3VtZW50LmJvZHkuc3R5bGUuY3Vyc29yID0gb3JpZ2luYWxDdXJzb3I7XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuXHJcbiAgICBjb25zdCBmZXRjaENvbnRlbnQgPSBhc3luYyAodXJpKSA9PiB7XHJcbiAgICAgICAgY29uc3QgbWV0aG9kID0gKGNvbnRlbnRNZXRob2QgfHwgJ0dFVCcpLnRvVXBwZXJDYXNlKCk7XHJcblxyXG4gICAgICAgIC8vIEFsd2F5cyBhbGxvdyBjdXN0b20gaGVhZGVyczsgd2Ugb25seSBhZGQgQ29udGVudC1UeXBlIHdoZW4gd2UgY2FuIGluZmVyIGl0XHJcbiAgICAgICAgY29uc3QgaGVhZGVycyA9IHsgLi4uKGNvbnRlbnRIZWFkZXJzIHx8IHt9KSB9O1xyXG4gICAgICAgIGNvbnN0IGhhc0NvbnRlbnRUeXBlID0gT2JqZWN0LmtleXMoaGVhZGVycykuc29tZSgoaykgPT4gay50b0xvd2VyQ2FzZSgpID09PSAnY29udGVudC10eXBlJyk7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEJ1aWxkIFJlcXVlc3RJbml0IGRlcGVuZGluZyBvbiBtZXRob2QgYW5kIGNvbnRlbnREYXRhIHR5cGUuXHJcbiAgICAgICAgICogV2UgYXZvaWQgc2V0dGluZyBDb250ZW50LVR5cGUgZm9yIEZvcm1EYXRhIGFuZCByYXcgc3RyaW5nL0Jsb2IgcGF5bG9hZHMsXHJcbiAgICAgICAgICogdW5sZXNzIHRoZSBjYWxsZXIgZXhwbGljaXRseSBwcm92aWRlZCBpdCB2aWEgY29udGVudEhlYWRlcnMuXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgY29uc3QgaW5pdCA9IHsgbWV0aG9kIH07XHJcblxyXG4gICAgICAgIGlmIChtZXRob2QgPT09ICdQT1NUJykge1xyXG4gICAgICAgICAgICBsZXQgYm9keSA9IHVuZGVmaW5lZDtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IGlzRm9ybURhdGEgPSB0eXBlb2YgRm9ybURhdGEgIT09ICd1bmRlZmluZWQnICYmIGNvbnRlbnREYXRhIGluc3RhbmNlb2YgRm9ybURhdGE7XHJcbiAgICAgICAgICAgIGNvbnN0IGlzVVJMU2VhcmNoUGFyYW1zID0gdHlwZW9mIFVSTFNlYXJjaFBhcmFtcyAhPT0gJ3VuZGVmaW5lZCcgJiYgY29udGVudERhdGEgaW5zdGFuY2VvZiBVUkxTZWFyY2hQYXJhbXM7XHJcbiAgICAgICAgICAgIGNvbnN0IGlzQmxvYiA9IHR5cGVvZiBCbG9iICE9PSAndW5kZWZpbmVkJyAmJiBjb250ZW50RGF0YSBpbnN0YW5jZW9mIEJsb2I7XHJcbiAgICAgICAgICAgIGNvbnN0IGlzU3RyaW5nID0gdHlwZW9mIGNvbnRlbnREYXRhID09PSAnc3RyaW5nJztcclxuICAgICAgICAgICAgY29uc3QgaXNQbGFpbk9iamVjdCA9IGNvbnRlbnREYXRhICYmIHR5cGVvZiBjb250ZW50RGF0YSA9PT0gJ29iamVjdCcgJiYgIWlzRm9ybURhdGEgJiYgIWlzVVJMU2VhcmNoUGFyYW1zICYmICFpc0Jsb2I7XHJcblxyXG4gICAgICAgICAgICBpZiAoaXNGb3JtRGF0YSkge1xyXG4gICAgICAgICAgICAgICAgYm9keSA9IGNvbnRlbnREYXRhO1xyXG4gICAgICAgICAgICAgICAgLy8gRG8gbm90IHNldCBDb250ZW50LVR5cGUgZm9yIEZvcm1EYXRhOyBicm93c2VyIHdpbGwgc2V0IHRoZSBib3VuZGFyeVxyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGlzVVJMU2VhcmNoUGFyYW1zKSB7XHJcbiAgICAgICAgICAgICAgICBib2R5ID0gY29udGVudERhdGE7XHJcbiAgICAgICAgICAgICAgICBpZiAoIWhhc0NvbnRlbnRUeXBlKSBoZWFkZXJzWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQ7Y2hhcnNldD1VVEYtOCc7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaXNQbGFpbk9iamVjdCkge1xyXG4gICAgICAgICAgICAgICAgYm9keSA9IEpTT04uc3RyaW5naWZ5KGNvbnRlbnREYXRhKTtcclxuICAgICAgICAgICAgICAgIGlmICghaGFzQ29udGVudFR5cGUpIGhlYWRlcnNbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGlzU3RyaW5nIHx8IGlzQmxvYikge1xyXG4gICAgICAgICAgICAgICAgYm9keSA9IGNvbnRlbnREYXRhO1xyXG4gICAgICAgICAgICAgICAgLy8gQ29udGVudC1UeXBlIGxlZnQgdG8gY2FsbGVyIGlmIG5lZWRlZFxyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGNvbnRlbnREYXRhICE9IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIC8vIEZhbGxiYWNrOiB0cnkgc2VuZCBhcy1pc1xyXG4gICAgICAgICAgICAgICAgYm9keSA9IGNvbnRlbnREYXRhO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoYm9keSAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICBpbml0LmJvZHkgPSBib2R5O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoT2JqZWN0LmtleXMoaGVhZGVycykubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICBpbml0LmhlYWRlcnMgPSBoZWFkZXJzO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCh1cmksIGluaXQpO1xyXG4gICAgICAgIGlmICghcmVzcG9uc2Uub2spIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIGZldGNoIGNvbnRlbnQ6ICR7cmVzcG9uc2Uuc3RhdHVzVGV4dH1gKTtcclxuICAgICAgICByZXR1cm4gcmVzcG9uc2UudGV4dCgpO1xyXG4gICAgfTtcclxuXHJcbiAgICAvLyBJbml0aWFsaXplIGRpYWxvZ1xyXG4gICAgc2V0RGlhbG9nU2l6ZSgpO1xyXG4gICAgYWRkQnV0dG9ucygpO1xyXG5cclxuICAgIC8vIFNldCB0aXRsZSBhbmQgY2xvc2UgYnV0dG9uIGhhbmRsZXJcclxuICAgIGRpYWxvZ0VsZW1lbnQucXVlcnlTZWxlY3RvcihcIi5BUFgtZGlhbG9nLXRpdGxlXCIpLnRleHRDb250ZW50ID0gdGl0bGU7XHJcbiAgICBkaWFsb2dFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJy5BUFgtY2xvc2UtZGlhbG9nJykub25jbGljayA9IGRpYWxvZy5jbG9zZTtcclxuXHJcbiAgICByZXR1cm4gZGlhbG9nO1xyXG59O1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY3JlYXRlRGlhbG9nO1xyXG4iLCJsZXQgY291bnRlciA9IDA7XHJcbmNvbnN0IGRvQ2FsbGJhY2tzID0ge307XHJcbmNvbnN0IHRpbWVvdXRzID0ge307XHJcblxyXG4vKipcclxuICogVGhpcyBmdW5jdGlvbiBhZGRzIGFuIGV2ZW50IGxpc3RlbmVyIHRvIHRoZSBlbGVtZW50cyBhbmQgcmV0dXJucyBhbiBvYmplY3Qgd2l0aCBhIGRvIG1ldGhvZCB0byBhZGQgY2FsbGJhY2sgZnVuY3Rpb25zLlxyXG4gKiBAcGFyYW0ge09iamVjdH0gYXB4IC0gVGhlIGFweCBvYmplY3QgdG8gYXVnbWVudCB3aXRoIHRoZSBsaXN0ZW4gZnVuY3Rpb24uXHJcbiAqIEByZXR1cm5zIHtPYmplY3R9IC0gVGhlIGF1Z21lbnRlZCBhcHggb2JqZWN0LlxyXG4gKi9cclxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gKGFweCkge1xyXG4gICAgbGV0IGVsZW1lbnRzID0gYXB4LmVsZW1lbnRzO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQWRkcyBhbiBldmVudCBsaXN0ZW5lciB0byB0aGUgZWxlbWVudHMgYW5kIHJldHVybnMgYW4gb2JqZWN0IHdpdGggYSBkbyBtZXRob2QgdG8gYWRkIGNhbGxiYWNrIGZ1bmN0aW9ucy5cclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBldmVudFR5cGUgLSBUaGUgdHlwZSBvZiBldmVudCB0byBsaXN0ZW4gZm9yIChlLmcuICdjbGljaycsICdrZXlkb3duJywgZXRjLikuXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3NlbGVjdG9yXSAtIFRoZSBDU1Mgc2VsZWN0b3IgdG8gdXNlIGZvciBldmVudCBkZWxlZ2F0aW9uIChvcHRpb25hbCkuXHJcbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSAtIEFuIG9iamVjdCB3aXRoIGEgZG8gbWV0aG9kIHRvIGFkZCBjYWxsYmFjayBmdW5jdGlvbnMuXHJcbiAgICAgKiBAZXhhbXBsZVxyXG4gICAgICogYXB4Lmxpc3RlbignY2xpY2snLCAnLm15LWJ1dHRvbicpLmRvKChldmVudCkgPT4ge1xyXG4gICAgICogICBjb25zb2xlLmxvZygnQnV0dG9uIGNsaWNrZWQhJywgZXZlbnQudGFyZ2V0KTtcclxuICAgICAqIH0pO1xyXG4gICAgICovXHJcbiAgICBhcHgubGlzdGVuID0gZnVuY3Rpb24gKGV2ZW50VHlwZXMsIHNlY29uZEFyZ3VtZW50LCB0aGlyZEFyZ3VtZW50KSB7XHJcbiAgICAgICAgbGV0IHNlbGVjdG9yO1xyXG4gICAgICAgIGxldCBvcHRpb25zID0ge307XHJcbiAgICAgICAgLy8gRGV0ZXJtaW5lIGlmIHRoZSBzZWNvbmQgYXJndW1lbnQgaXMgYSBzZWxlY3RvciBvciBvcHRpb25zXHJcbiAgICAgICAgaWYgKHR5cGVvZiBzZWNvbmRBcmd1bWVudCA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgICAgICAgc2VsZWN0b3IgPSBzZWNvbmRBcmd1bWVudDtcclxuICAgICAgICAgICAgb3B0aW9ucyA9IHRoaXJkQXJndW1lbnQgfHwge307XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgb3B0aW9ucyA9IHNlY29uZEFyZ3VtZW50IHx8IHt9O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgdW5pcXVlSWQgPSBnZW5lcmF0ZVVuaXF1ZUlkKCk7XHJcbiAgICAgICAgY29uc3QgdGltZW91dER1cmF0aW9uID0gb3B0aW9ucy50aW1lb3V0IHx8IDA7XHJcbiAgICAgICAgXHJcbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGV2ZW50VHlwZXMpKSB7XHJcbiAgICAgICAgICAgIGV2ZW50VHlwZXMgPSBbZXZlbnRUeXBlc107IC8vIEVuc3VyZSBldmVudFR5cGVzIGlzIGFuIGFycmF5XHJcbiAgICAgICAgfVxyXG4gICAgICAgIFxyXG4gICAgICAgIGV2ZW50VHlwZXMuZm9yRWFjaCgoZXZlbnRUeXBlKSA9PiB7XHJcbiAgICAgICAgICAgIGVsZW1lbnRzLmZvckVhY2goKGVsZW1lbnQpID0+IHtcclxuICAgICAgICAgICAgICAgIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihldmVudFR5cGUsIChldmVudCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVDYWxsYmFja3MoZXZlbnQsIHVuaXF1ZUlkLCB0aW1lb3V0RHVyYXRpb24sIHNlbGVjdG9yLCBlbGVtZW50KTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgLyoqXHJcbiAgICAgICAgICAgICAqIEFkZHMgYSBjYWxsYmFjayBmdW5jdGlvbiB0byB0aGUgZG9DYWxsYmFja3Mgb2JqZWN0IGZvciB0aGUgY3VycmVudCBldmVudCBsaXN0ZW5lci5cclxuICAgICAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZG9DYWxsYmFjayAtIFRoZSBjYWxsYmFjayBmdW5jdGlvbiB0byBleGVjdXRlIHdoZW4gdGhlIGV2ZW50IGlzIHRyaWdnZXJlZC5cclxuICAgICAgICAgICAgICogQHJldHVybnMge09iamVjdH0gLSBSZXR1cm5zIHRoZSBjdXJyZW50IG9iamVjdCB0byBhbGxvdyBmb3IgY2hhaW5lZCBjYWxscy5cclxuICAgICAgICAgICAgICogQGV4YW1wbGVcclxuICAgICAgICAgICAgICogYXB4Lmxpc3RlbignY2xpY2snLCAnLm15LWJ1dHRvbicpLmRvKChldmVudCkgPT4ge1xyXG4gICAgICAgICAgICAgKiAgIGNvbnNvbGUubG9nKCdCdXR0b24gY2xpY2tlZCEnLCBldmVudC50YXJnZXQpO1xyXG4gICAgICAgICAgICAgKiB9KS5kbygoZXZlbnQpID0+IHtcclxuICAgICAgICAgICAgICogICBjb25zb2xlLmxvZygnQW5vdGhlciBjYWxsYmFjayBmdW5jdGlvbiEnKTtcclxuICAgICAgICAgICAgICogfSk7XHJcbiAgICAgICAgICAgICAqL1xyXG4gICAgICAgICAgICBkbzogZnVuY3Rpb24gKGRvQ2FsbGJhY2spIHtcclxuICAgICAgICAgICAgICAgIGlmICghZG9DYWxsYmFja3NbdW5pcXVlSWRdKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZG9DYWxsYmFja3NbdW5pcXVlSWRdID0gW107XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBkb0NhbGxiYWNrc1t1bmlxdWVJZF0ucHVzaChkb0NhbGxiYWNrKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOyAvLyBSZXR1cm4gdGhlIG9iamVjdCB0byBhbGxvdyBmb3IgY2hhaW5lZCBjYWxsc1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgIH07XHJcbiAgICB9O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogTWFudWFsbHkgdHJpZ2dlcnMgdGhlIHJlZ2lzdGVyZWQgY2FsbGJhY2tzIGZvciBhIGdpdmVuIGV2ZW50IHR5cGUgb24gYWxsIGVsZW1lbnRzIG9yIGNyZWF0ZXMgYSBuZXcgZXZlbnQgaWYgYSBzdHJpbmcgaXMgcHJvdmlkZWQuXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ3xFdmVudH0gZXZlbnQgLSBUaGUgZXZlbnQgdG8gdHJpZ2dlci4gVGhpcyBjYW4gYmUgYW4gZXZlbnQgdHlwZSBzdHJpbmcgKGxpa2UgJ2NsaWNrJykgb3IgYW4gYWN0dWFsIEV2ZW50IG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgYXB4LnRyaWdnZXIgPSBmdW5jdGlvbiAoZXZlbnQpIHtcclxuICAgICAgICBsZXQgZXZlbnRUeXBlO1xyXG4gICAgICAgIGlmICh0eXBlb2YgZXZlbnQgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgICAgIGV2ZW50VHlwZSA9IGV2ZW50O1xyXG4gICAgICAgICAgICBldmVudCA9IG5ldyBFdmVudChldmVudCwgeyBidWJibGVzOiB0cnVlLCBjYW5jZWxhYmxlOiB0cnVlIH0pO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoZXZlbnQgaW5zdGFuY2VvZiBFdmVudCkge1xyXG4gICAgICAgICAgICBldmVudFR5cGUgPSBldmVudC50eXBlO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0ludmFsaWQgZXZlbnQgdHlwZSBwcm92aWRlZCB0byBhcHgudHJpZ2dlci4gSXQgbXVzdCBiZSBlaXRoZXIgYSBzdHJpbmcgb3IgRXZlbnQgb2JqZWN0LicpO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBhcHguZWxlbWVudHMuZm9yRWFjaCgoZWxlbWVudCkgPT4ge1xyXG4gICAgICAgICAgICBlbGVtZW50LmRpc3BhdGNoRXZlbnQoZXZlbnQpOyAgLy8gVGhpcyB3aWxsIGFsbG93IHRoZSBldmVudCB0byBidWJibGUgdXAgbmF0dXJhbGx5LlxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICAvLyBIYW5kbGUgZXZlbnQgZGVsZWdhdGlvbiBtYW51YWxseSBieSBleGVjdXRpbmcgY2FsbGJhY2tzIGlmIHRoZSB0YXJnZXQgbWF0Y2hlcyB0aGUgc2VsZWN0b3JcclxuICAgICAgICBPYmplY3Qua2V5cyhkb0NhbGxiYWNrcykuZm9yRWFjaCgodW5pcXVlSWQpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgY2FsbGJhY2tEZXRhaWxzID0gZG9DYWxsYmFja3NbdW5pcXVlSWRdO1xyXG4gICAgICAgICAgICBpZiAoY2FsbGJhY2tEZXRhaWxzICYmIGNhbGxiYWNrRGV0YWlscy5ldmVudFR5cGUgPT09IGV2ZW50VHlwZSkge1xyXG4gICAgICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIGV2ZW50IHRhcmdldCBtYXRjaGVzIHRoZSBzZWxlY3RvciB1c2VkIGR1cmluZyBsaXN0ZW5lciByZWdpc3RyYXRpb25cclxuICAgICAgICAgICAgICAgIGNvbnN0IHsgc2VsZWN0b3IgfSA9IGNhbGxiYWNrRGV0YWlscztcclxuICAgICAgICAgICAgICAgIGlmICghc2VsZWN0b3IgfHwgZXZlbnQudGFyZ2V0Lm1hdGNoZXMoc2VsZWN0b3IpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZUNhbGxiYWNrcyhldmVudCwgdW5pcXVlSWQsIDAsIHNlbGVjdG9yLCBldmVudC50YXJnZXQpOyAgLy8gSW1tZWRpYXRlIGV4ZWN1dGlvbiwgbm8gdGltZW91dFxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9O1xyXG4gICAgXHJcbiAgICByZXR1cm4gYXB4O1xyXG59O1xyXG5cclxuXHJcbmZ1bmN0aW9uIGV4ZWN1dGVDYWxsYmFja3MoZXZlbnQsIHVuaXF1ZUlkLCB0aW1lb3V0RHVyYXRpb24sIHNlbGVjdG9yID0gJycsIGVsZW1lbnQpIHtcclxuICAgIGNvbnN0IG1hdGNoZWRFbGVtZW50ID0gc2VsZWN0b3IgPyBjbG9zZXN0KGV2ZW50LnRhcmdldCwgc2VsZWN0b3IpIDogZWxlbWVudDtcclxuICAgIGlmICghbWF0Y2hlZEVsZW1lbnQpIHtcclxuICAgICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgLy8gQ2xlYXIgYW55IHByZXZpb3VzIHRpbWVvdXQgZm9yIHRoaXMgdW5pcXVlSWQgdG8gcHJldmVudCB1bmludGVuZGVkIGJlaGF2aW9yXHJcbiAgICBjbGVhclRpbWVvdXQodGltZW91dHNbdW5pcXVlSWRdKTtcclxuXHJcbiAgICAvLyBGdW5jdGlvbiB0byBoYW5kbGUgdGhlIGV4ZWN1dGlvbiBvZiBjYWxsYmFja3NcclxuICAgIGZ1bmN0aW9uIGhhbmRsZUNhbGxiYWNrRXhlY3V0aW9uKCkge1xyXG4gICAgICAgIGlmIChkb0NhbGxiYWNrc1t1bmlxdWVJZF0pIHtcclxuICAgICAgICAgICAgZG9DYWxsYmFja3NbdW5pcXVlSWRdLnJlZHVjZSgocHJldlByb21pc2UsIGRvQ2FsbGJhY2spID0+IHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBwcmV2UHJvbWlzZS50aGVuKCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gZG9DYWxsYmFjay5iaW5kKG1hdGNoZWRFbGVtZW50KShldmVudCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgUHJvbWlzZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC50aGVuKHJlc29sdmUpLmNhdGNoKHJlamVjdCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUocmVzdWx0KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChlcnJvcik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9LCBQcm9taXNlLnJlc29sdmUoKSkuY2F0Y2goZXJyb3IgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgaW4gY2FsbGJhY2sgY2hhaW46JywgZXJyb3IpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8gQ2hlY2sgaWYgdGltZW91dER1cmF0aW9uIGlzIHplcm8gdG8gZGVjaWRlIHdoZXRoZXIgdG8gZGVsYXkgdGhlIGNhbGxiYWNrIGV4ZWN1dGlvbiBvciBub3RcclxuICAgIGlmICh0aW1lb3V0RHVyYXRpb24gPT09IDApIHtcclxuICAgICAgICBoYW5kbGVDYWxsYmFja0V4ZWN1dGlvbigpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgICB0aW1lb3V0c1t1bmlxdWVJZF0gPSBzZXRUaW1lb3V0KGhhbmRsZUNhbGxiYWNrRXhlY3V0aW9uLCB0aW1lb3V0RHVyYXRpb24pO1xyXG4gICAgfVxyXG59XHJcblxyXG5cclxuZnVuY3Rpb24gZ2VuZXJhdGVVbmlxdWVJZCgpIHtcclxuICAgIGNvbnN0IHJhbmRvbVBhcnQgPSBNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5zdWJzdHIoMiwgOSk7IC8vIE1vcmUgcmFuZG9tbmVzc1xyXG4gICAgY29uc3QgdW5pcXVlSWQgPSBgJHtEYXRlLm5vdygpfV8ke3JhbmRvbVBhcnR9XyR7Y291bnRlcn1gO1xyXG4gICAgY291bnRlciA9IChjb3VudGVyICsgMSkgJSAxMDAwOyAvLyBSZXNldCBjb3VudGVyIHRvIGF2b2lkIG92ZXJmbG93XHJcblxyXG4gICAgcmV0dXJuIHVuaXF1ZUlkO1xyXG59XHJcblxyXG5mdW5jdGlvbiBjbG9zZXN0KGVsZW1lbnQsIHNlbGVjdG9yKSB7XHJcbiAgICB3aGlsZSAoZWxlbWVudCAmJiBlbGVtZW50Lm5vZGVUeXBlID09PSAxKSB7XHJcbiAgICAgICAgaWYgKGVsZW1lbnQubWF0Y2hlcyhzZWxlY3RvcikpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsZW1lbnQgPSBlbGVtZW50LnBhcmVudE5vZGU7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbnVsbDtcclxufVxyXG4iLCJpbXBvcnQgJy4vY3NzL3RyaXN0YXRlLmNzcyc7XHJcblxyXG4vKipcclxuICogQ3JlYXRlcyBhIHRyaS1zdGF0ZSBjaGVja2JveCBmb3IgZWFjaCBjaGVja2JveCBlbGVtZW50IGluIHRoZSBhcHguZWxlbWVudHMgYXJyYXkuXHJcbiAqIEBwYXJhbSB7QXJyYXk8SFRNTEVsZW1lbnQ+fSBhcHggLSBBbiBhcnJheSBvZiBIVE1MRWxlbWVudHMgd2hpY2ggaXMgcmV0dXJuZWQgYnkgQVBYKClcclxuICogQGV4YW1wbGVcclxuICogLy8gQ2FsbCB0aGUgdHJpc3RhdGUgZnVuY3Rpb24gb24gYW4gYXJyYXkgb2YgY2hlY2tib3ggZWxlbWVudHNcclxuICogYXB4LnRyaXN0YXRlKCk7XHJcbiAqL1xyXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiAoYXB4KSB7XHJcbiAgICBhcHgudHJpc3RhdGUgPSBmdW5jdGlvbiAob3B0aW9ucyA9IHt9KXtcclxuICAgICAgICBhcHguZWxlbWVudHMuZm9yRWFjaCgoZWxlbWVudCkgPT4ge1xyXG4gICAgICAgICAgICBpZiAoZWxlbWVudC50eXBlID09PSAnY2hlY2tib3gnKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBbb3JpZ2luYWxDaGVja2JveCwgdHJpc3RhdGVEb20sIGhpZGRlbklucHV0XSA9IGNyZWF0ZVRyaVN0YXRlQ2hlY2tib3goZWxlbWVudCxvcHRpb25zKTtcclxuICAgICAgICAgICAgICAgIC8vSWYgdGhlcmUgaXMgYSBcIm9wdGlvbnMuY2FsbGJhY2tzLmFmdGVyXCIgY2FsbGJhY2sgaW4gb3B0aW9ucyBjYWxsIGl0XHJcbiAgICAgICAgICAgICAgICBpZihvcHRpb25zLmNhbGxiYWNrcyAmJiBvcHRpb25zLmNhbGxiYWNrcy5hZnRlciAmJiB0eXBlb2Ygb3B0aW9ucy5jYWxsYmFja3MuYWZ0ZXIgPT09ICdmdW5jdGlvbicpIHtcclxuICAgICAgICAgICAgICAgICAgICBvcHRpb25zLmNhbGxiYWNrcy5hZnRlcihvcmlnaW5hbENoZWNrYm94LCB0cmlzdGF0ZURvbSwgaGlkZGVuSW5wdXQpO1xyXG4gICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHRvZ2dsZVRyaVN0YXRlQ2hlY2tib3hTdGF0ZShjdXN0b21DaGVja2JveCwgYWN0dWFsQ2hlY2tib3gsIGhpZGRlbklucHV0KSB7XHJcbiAgICBpZiAoY3VzdG9tQ2hlY2tib3guY2xhc3NMaXN0LmNvbnRhaW5zKCdjaGVja2VkJykpIHtcclxuICAgICAgICBjdXN0b21DaGVja2JveC5jbGFzc0xpc3QucmVtb3ZlKCdjaGVja2VkJyk7XHJcbiAgICAgICAgY3VzdG9tQ2hlY2tib3guY2xhc3NMaXN0LmFkZCgnY3Jvc3NlZCcpO1xyXG4gICAgICAgIGFjdHVhbENoZWNrYm94LmNoZWNrZWQgPSBmYWxzZTtcclxuICAgICAgICBoaWRkZW5JbnB1dC52YWx1ZSA9ICdmYWxzZSc7XHJcbiAgICB9IGVsc2UgaWYgKGN1c3RvbUNoZWNrYm94LmNsYXNzTGlzdC5jb250YWlucygnY3Jvc3NlZCcpKSB7XHJcbiAgICAgICAgY3VzdG9tQ2hlY2tib3guY2xhc3NMaXN0LnJlbW92ZSgnY3Jvc3NlZCcpO1xyXG4gICAgICAgIGN1c3RvbUNoZWNrYm94LmNsYXNzTGlzdC5hZGQoJ3VuY2hlY2tlZCcpO1xyXG4gICAgICAgIGhpZGRlbklucHV0LnJlbW92ZUF0dHJpYnV0ZSgnbmFtZScpOyAvLyBFbnN1cmUgdGhlIGhpZGRlbiBpbnB1dCBkb2Vzbid0IHBvc3QgYW55IHZhbHVlXHJcbiAgICAgICAgaGlkZGVuSW5wdXQucmVtb3ZlQXR0cmlidXRlKCd2YWx1ZScpOyAvLyBFbnN1cmUgdGhlIGhpZGRlbiBpbnB1dCBkb2Vzbid0IHBvc3QgYW55IHZhbHVlXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAgIGN1c3RvbUNoZWNrYm94LmNsYXNzTGlzdC5yZW1vdmUoJ3VuY2hlY2tlZCcpO1xyXG4gICAgICAgIGN1c3RvbUNoZWNrYm94LmNsYXNzTGlzdC5hZGQoJ2NoZWNrZWQnKTtcclxuICAgICAgICBhY3R1YWxDaGVja2JveC5jaGVja2VkID0gdHJ1ZTtcclxuICAgICAgICBoaWRkZW5JbnB1dC52YWx1ZSA9ICd0cnVlJztcclxuICAgICAgICBoaWRkZW5JbnB1dC5zZXRBdHRyaWJ1dGUoJ25hbWUnLCBhY3R1YWxDaGVja2JveC5kYXRhc2V0Lm5hbWUpOyAvLyBSZXN0b3JlIHRoZSBuYW1lIGZvciBwb3N0aW5nXHJcbiAgICB9XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGNyZWF0ZVRyaVN0YXRlQ2hlY2tib3goY2hlY2tib3hFbGVtZW50LCBvcHRpb25zKSB7XHJcbiAgICBcclxuICAgIC8vZ2V0IHRoZSBjaGVja2JveCBtYXJnaW5zIGluY2x1ZGluZyBicm93c2VyIGRlZmF1bHRcclxuICAgIGNvbnN0IGNoZWNrYm94U3R5bGUgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShjaGVja2JveEVsZW1lbnQpO1xyXG4gICAgLy8gSGlkZSB0aGUgb3JpZ2luYWwgY2hlY2tib3hcclxuICAgIGNoZWNrYm94RWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xyXG5cclxuICAgIC8vIENyZWF0ZSB0aGUgY3VzdG9tIGNoZWNrYm94IGRpdiBhbmQgc2V0IGl0cyBpbml0aWFsIHN0YXRlXHJcbiAgICBjb25zdCB0cmlzdGF0ZURvbSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xyXG4gICAgdHJpc3RhdGVEb20uY2xhc3NMaXN0LmFkZCgnYXB4LXRyaXN0YXRlJyk7XHJcbiAgICBpZiAob3B0aW9ucy5zaXplKSB7XHJcbiAgICAgICAgaWYgKG9wdGlvbnMuc2l6ZS53aWR0aCkge1xyXG4gICAgICAgICAgICB0cmlzdGF0ZURvbS5zdHlsZS53aWR0aCA9IG9wdGlvbnMuc2l6ZS53aWR0aCArICdweCc7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChvcHRpb25zLnNpemUuaGVpZ2h0KSB7XHJcbiAgICAgICAgICAgIHRyaXN0YXRlRG9tLnN0eWxlLmhlaWdodCA9IG9wdGlvbnMuc2l6ZS5oZWlnaHQgKyAncHgnO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGlmKG9wdGlvbnMuY2xhc3NlcykgdHJpc3RhdGVEb20uY2xhc3NMaXN0LmFkZCguLi5jb21wdXRlQ2xhc3NlcyhvcHRpb25zLmNsYXNzZXMpKTtcclxuXHJcbiAgICB0cmlzdGF0ZURvbS5zdHlsZS5tYXJnaW4gPSBjaGVja2JveFN0eWxlLm1hcmdpbjtcclxuXHJcbiAgICBpZiAoY2hlY2tib3hFbGVtZW50LmNoZWNrZWQpIHtcclxuICAgICAgICB0cmlzdGF0ZURvbS5jbGFzc0xpc3QuYWRkKCdjaGVja2VkJyk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRyaXN0YXRlRG9tLmNsYXNzTGlzdC5hZGQoJ3VuY2hlY2tlZCcpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIENyZWF0ZSB0aGUgaGlkZGVuIGlucHV0IGZpZWxkXHJcbiAgICBjb25zdCBoaWRkZW5JbnB1dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2lucHV0Jyk7XHJcbiAgICBoaWRkZW5JbnB1dC50eXBlID0gJ2hpZGRlbic7XHJcbiAgICBoaWRkZW5JbnB1dC5uYW1lID0gY2hlY2tib3hFbGVtZW50Lm5hbWU7IC8vIENvcHkgdGhlIG5hbWUgZnJvbSB0aGUgb3JpZ2luYWwgY2hlY2tib3hcclxuICAgIGNoZWNrYm94RWxlbWVudC5kYXRhc2V0Lm5hbWUgPSBjaGVja2JveEVsZW1lbnQubmFtZTsgLy8gU3RvcmUgdGhlIG5hbWUgaW4gYSBkYXRhIGF0dHJpYnV0ZSBmb3IgbGF0ZXIgdXNlXHJcbiAgICBjaGVja2JveEVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKCduYW1lJyk7IC8vIFJlbW92ZSB0aGUgbmFtZSBmcm9tIHRoZSBvcmlnaW5hbCBjaGVja2JveCB0byBhdm9pZCBkb3VibGUgcG9zdGluZ1xyXG5cclxuICAgIGlmIChvcHRpb25zLmRlZmF1bHRTdGF0ZSkgc2V0RGVmYXVsdFN0YXRlKG9wdGlvbnMsIHRyaXN0YXRlRG9tLCBoaWRkZW5JbnB1dCk7XHJcbiAgICBlbHNle1xyXG4gICAgICAgIC8vIFNldCB0aGUgaW5pdGlhbCB2YWx1ZSBmb3IgdGhlIGhpZGRlbiBpbnB1dCBiYXNlZCBvbiB0aGUgY2hlY2tib3gncyBzdGF0ZVxyXG4gICAgICAgIGlmIChjaGVja2JveEVsZW1lbnQuY2hlY2tlZCkge1xyXG4gICAgICAgICAgICBoaWRkZW5JbnB1dC52YWx1ZSA9ICd0cnVlJztcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBoaWRkZW5JbnB1dC5uYW1lID0gJyc7IC8vIEVuc3VyZSB0aGUgaGlkZGVuIGlucHV0IGRvZXNuJ3QgcG9zdCBhbnkgdmFsdWVcclxuICAgICAgICAgICAgaGlkZGVuSW5wdXQudmFsdWUgPSAnJztcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy9oYW5kbGUgYWNjZXNzaWJpbGl0eSwgc2V0IHRoZSB0YWJpbmRleCB0byB0aGUgc2FtZSBhcyB0aGUgY2hlY2tib3hcclxuICAgIHRyaXN0YXRlRG9tLnRhYkluZGV4ID0gY2hlY2tib3hFbGVtZW50LnRhYkluZGV4O1xyXG5cclxuICAgIC8vIEluc2VydCB0aGUgaGlkZGVuIGlucHV0IGluc2lkZSB0aGUgY3VzdG9tIGNoZWNrYm94IGRpdlxyXG4gICAgdHJpc3RhdGVEb20uYXBwZW5kQ2hpbGQoaGlkZGVuSW5wdXQpO1xyXG5cclxuICAgIC8vIEluc2VydCBpdCBuZXh0IHRvIHRoZSBhY3R1YWwgY2hlY2tib3hcclxuICAgIGNoZWNrYm94RWxlbWVudC5wYXJlbnROb2RlLmluc2VydEJlZm9yZSh0cmlzdGF0ZURvbSwgY2hlY2tib3hFbGVtZW50Lm5leHRTaWJsaW5nKTtcclxuXHJcbiAgICAvLyBBZGQgZXZlbnQgbGlzdGVuZXJcclxuICAgIHRyaXN0YXRlRG9tLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24gKGUpIHtcclxuICAgICAgICB0b2dnbGVUcmlTdGF0ZUNoZWNrYm94U3RhdGUodHJpc3RhdGVEb20sIGNoZWNrYm94RWxlbWVudCwgaGlkZGVuSW5wdXQpO1xyXG4gICAgICAgIGJ1YmJsZUV2ZW50c1RvT3JpZ2luYWxDaGVja2JveChvcHRpb25zLCBjaGVja2JveEVsZW1lbnQsIHRyaXN0YXRlRG9tLCBoaWRkZW5JbnB1dCwgZSk7XHJcbiAgICB9KTtcclxuICAgIHRyaXN0YXRlRG9tLmFkZEV2ZW50TGlzdGVuZXIoJ2tleXVwJywgb25rZXl1cC5iaW5kKG51bGwsIGNoZWNrYm94RWxlbWVudCkpO1xyXG5cclxuICAgIHJldHVybiBbY2hlY2tib3hFbGVtZW50LCB0cmlzdGF0ZURvbSwgaGlkZGVuSW5wdXRdO1xyXG59XHJcblxyXG5mdW5jdGlvbiBzZXREZWZhdWx0U3RhdGUob3B0aW9ucywgdHJpc3RhdGVEb20sIGhpZGRlbklucHV0KSB7XHJcbiAgICAvL2ZvciBhbGwgdmFsdWVzIHBvc3NpYmxlIGZvciBkZWZhdWx0U3RhdGUsIHNldCB0aGUgaW5pdGlhbCBzdGF0ZSBvZiB0aGUgY2hlY2tib3hcclxuICAgIGlmIChvcHRpb25zLmRlZmF1bHRTdGF0ZSA9PT0gJ2NoZWNrZWQnKSB7XHJcbiAgICAgICAgdHJpc3RhdGVEb20uY2xhc3NMaXN0LnJlbW92ZSgndW5jaGVja2VkJyk7XHJcbiAgICAgICAgdHJpc3RhdGVEb20uY2xhc3NMaXN0LmFkZCgnY2hlY2tlZCcpO1xyXG4gICAgICAgIGhpZGRlbklucHV0LnZhbHVlID0gJ3RydWUnO1xyXG4gICAgfVxyXG4gICAgZWxzZSBpZiAob3B0aW9ucy5kZWZhdWx0U3RhdGUgPT09ICd1bmNoZWNrZWQnKSB7XHJcbiAgICAgICAgdHJpc3RhdGVEb20uY2xhc3NMaXN0LnJlbW92ZSgnY2hlY2tlZCcpO1xyXG4gICAgICAgIHRyaXN0YXRlRG9tLmNsYXNzTGlzdC5hZGQoJ3VuY2hlY2tlZCcpO1xyXG4gICAgICAgIGhpZGRlbklucHV0LnJlbW92ZUF0dHJpYnV0ZSgnbmFtZScpOyAvLyBFbnN1cmUgdGhlIGhpZGRlbiBpbnB1dCBkb2Vzbid0IHBvc3QgYW55IHZhbHVlXHJcbiAgICAgICAgaGlkZGVuSW5wdXQucmVtb3ZlQXR0cmlidXRlKCd2YWx1ZScpOyAvLyBFbnN1cmUgdGhlIGhpZGRlbiBpbnB1dCBkb2Vzbid0IHBvc3QgYW55IHZhbHVlXHJcbiAgICB9XHJcbiAgICBlbHNlIGlmIChvcHRpb25zLmRlZmF1bHRTdGF0ZSA9PT0gJ2Nyb3NzZWQnKSB7XHJcbiAgICAgICAgdHJpc3RhdGVEb20uY2xhc3NMaXN0LnJlbW92ZSgnY2hlY2tlZCcpO1xyXG4gICAgICAgIHRyaXN0YXRlRG9tLmNsYXNzTGlzdC5hZGQoJ2Nyb3NzZWQnKTtcclxuICAgICAgICBoaWRkZW5JbnB1dC52YWx1ZSA9ICdmYWxzZSc7XHJcbiAgICB9XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGNvbXB1dGVDbGFzc2VzKGNsYXNzZXMpIHtcclxuICAgIGxldCBjb21wdXRlZENsYXNzZXMgPSBbXTtcclxuICAgIGlmKHR5cGVvZiBjbGFzc2VzID09PSAnc3RyaW5nJykge1xyXG4gICAgICAgIC8vcmVwbGFjZSBtdWx0aXBsZSB3aGl0ZSBzcGFjZXMgd2l0aCBhIHNpbmdsZSBzcGFjZVxyXG4gICAgICAgIGNsYXNzZXMgPSBjbGFzc2VzLnJlcGxhY2UoL1xcc1xccysvZywgJyAnKTtcclxuICAgICAgICBpZihjbGFzc2VzLmluZGV4T2YoJyAnKSA+IC0xKVxyXG4gICAgICAgICAgICBjb21wdXRlZENsYXNzZXMgPSBjbGFzc2VzLnNwbGl0KCcgJyk7XHJcbiAgICAgICAgZWxzZSBpZihjbGFzc2VzLmluZGV4T2YoJywnKSA+IC0xKVxyXG4gICAgICAgICAgICBjb21wdXRlZENsYXNzZXMgPSBjbGFzc2VzLnNwbGl0KCcsJyk7XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICBjb21wdXRlZENsYXNzZXMgPSBbY2xhc3Nlc107XHJcbiAgICB9XHJcbiAgICBlbHNlIGlmKEFycmF5LmlzQXJyYXkoY2xhc3NlcykpIHtcclxuICAgICAgICBjb21wdXRlZENsYXNzZXMgPSBjbGFzc2VzO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGNvbXB1dGVkQ2xhc3NlcztcclxufVxyXG5cclxuZnVuY3Rpb24gYnViYmxlRXZlbnRzVG9PcmlnaW5hbENoZWNrYm94KG9wdGlvbnMsIGNoZWNrYm94RWxlbWVudCwgdHJpc3RhdGVEb20sIGhpZGRlbklucHV0LCBldmVudCkge1xyXG4gICAgLy9pZiBvcHRpb25zLmNhbGxiYWNrcy5jaGFuZ2UgaXMgc2V0LCBjYWxsIGl0XHJcbiAgICBpZihvcHRpb25zLmNhbGxiYWNrcyAmJiBvcHRpb25zLmNhbGxiYWNrcy5jaGFuZ2UgJiYgdHlwZW9mIG9wdGlvbnMuY2FsbGJhY2tzLmNoYW5nZSA9PT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICAgIG9wdGlvbnMuY2FsbGJhY2tzLmNoYW5nZShjaGVja2JveEVsZW1lbnQsIHRyaXN0YXRlRG9tLCBoaWRkZW5JbnB1dCk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYoIW9wdGlvbnMuYnViYmxlRXZlbnRzKSByZXR1cm47XHJcblxyXG4gICAgaWYoZXZlbnQudHlwZSA9PT0gJ2NsaWNrJykge1xyXG4gICAgICAgIGNoZWNrYm94RWxlbWVudC5kaXNwYXRjaEV2ZW50KG5ldyBNb3VzZUV2ZW50KCdjbGljaycsIHsgYnViYmxlczogdHJ1ZSwgY2FuY2VsYWJsZTogdHJ1ZSB9KSk7XHJcbiAgICB9XHJcbiAgICBlbHNlIGlmKGV2ZW50LnR5cGUgPT09ICdrZXl1cCcpIHtcclxuICAgICAgICBjaGVja2JveEVsZW1lbnQuZGlzcGF0Y2hFdmVudChuZXcgS2V5Ym9hcmRFdmVudCgna2V5dXAnLCB7IGtleTogJyAnLCBidWJibGVzOiB0cnVlLCBjYW5jZWxhYmxlOiB0cnVlIH0pKTtcclxuICAgIH1cclxuICAgIGVsc2UgaWYoZXZlbnQudHlwZSA9PT0gJ2NoYW5nZScpIHtcclxuICAgICAgICBjaGVja2JveEVsZW1lbnQuZGlzcGF0Y2hFdmVudChuZXcgRXZlbnQoJ2NoYW5nZScsIHsgYnViYmxlczogdHJ1ZSwgY2FuY2VsYWJsZTogdHJ1ZSB9KSk7XHJcbiAgICB9XHJcbn1cclxuXHJcbmZ1bmN0aW9uIG9ua2V5dXAoY2hlY2tib3hFbGVtZW50LCBldmVudCkge1xyXG4gICAgaWYgKGV2ZW50LmtleUNvZGUgPT09IDMyKSB7XHJcbiAgICAgICAgYnViYmxlRXZlbnRzVG9PcmlnaW5hbENoZWNrYm94KGNoZWNrYm94RWxlbWVudCwgZXZlbnQpO1xyXG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgZXZlbnQudGFyZ2V0LmNsaWNrKCk7XHJcbiAgICB9XHJcbn0iLCIvLyBUaGUgbW9kdWxlIGNhY2hlXG52YXIgX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fID0ge307XG5cbi8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG5mdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG5cdC8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZVxuXHR2YXIgY2FjaGVkTW9kdWxlID0gX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXTtcblx0aWYgKGNhY2hlZE1vZHVsZSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0cmV0dXJuIGNhY2hlZE1vZHVsZS5leHBvcnRzO1xuXHR9XG5cdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG5cdHZhciBtb2R1bGUgPSBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdID0ge1xuXHRcdGlkOiBtb2R1bGVJZCxcblx0XHQvLyBubyBtb2R1bGUubG9hZGVkIG5lZWRlZFxuXHRcdGV4cG9ydHM6IHt9XG5cdH07XG5cblx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG5cdF9fd2VicGFja19tb2R1bGVzX19bbW9kdWxlSWRdKG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuXG5cdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG5cdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbn1cblxuLy8gZXhwb3NlIHRoZSBtb2R1bGVzIG9iamVjdCAoX193ZWJwYWNrX21vZHVsZXNfXylcbl9fd2VicGFja19yZXF1aXJlX18ubSA9IF9fd2VicGFja19tb2R1bGVzX187XG5cbiIsIi8vIGdldERlZmF1bHRFeHBvcnQgZnVuY3Rpb24gZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBub24taGFybW9ueSBtb2R1bGVzXG5fX3dlYnBhY2tfcmVxdWlyZV9fLm4gPSAobW9kdWxlKSA9PiB7XG5cdHZhciBnZXR0ZXIgPSBtb2R1bGUgJiYgbW9kdWxlLl9fZXNNb2R1bGUgP1xuXHRcdCgpID0+IChtb2R1bGVbJ2RlZmF1bHQnXSkgOlxuXHRcdCgpID0+IChtb2R1bGUpO1xuXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQoZ2V0dGVyLCB7IGE6IGdldHRlciB9KTtcblx0cmV0dXJuIGdldHRlcjtcbn07IiwiLy8gZGVmaW5lIGdldHRlciBmdW5jdGlvbnMgZm9yIGhhcm1vbnkgZXhwb3J0c1xuX193ZWJwYWNrX3JlcXVpcmVfXy5kID0gKGV4cG9ydHMsIGRlZmluaXRpb24pID0+IHtcblx0Zm9yKHZhciBrZXkgaW4gZGVmaW5pdGlvbikge1xuXHRcdGlmKF9fd2VicGFja19yZXF1aXJlX18ubyhkZWZpbml0aW9uLCBrZXkpICYmICFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZXhwb3J0cywga2V5KSkge1xuXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIGtleSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGRlZmluaXRpb25ba2V5XSB9KTtcblx0XHR9XG5cdH1cbn07IiwiX193ZWJwYWNrX3JlcXVpcmVfXy5vID0gKG9iaiwgcHJvcCkgPT4gKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIHByb3ApKSIsIi8vIGRlZmluZSBfX2VzTW9kdWxlIG9uIGV4cG9ydHNcbl9fd2VicGFja19yZXF1aXJlX18uciA9IChleHBvcnRzKSA9PiB7XG5cdGlmKHR5cGVvZiBTeW1ib2wgIT09ICd1bmRlZmluZWQnICYmIFN5bWJvbC50b1N0cmluZ1RhZykge1xuXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBTeW1ib2wudG9TdHJpbmdUYWcsIHsgdmFsdWU6ICdNb2R1bGUnIH0pO1xuXHR9XG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7XG59OyIsIl9fd2VicGFja19yZXF1aXJlX18uYiA9IGRvY3VtZW50LmJhc2VVUkkgfHwgc2VsZi5sb2NhdGlvbi5ocmVmO1xuXG4vLyBvYmplY3QgdG8gc3RvcmUgbG9hZGVkIGFuZCBsb2FkaW5nIGNodW5rc1xuLy8gdW5kZWZpbmVkID0gY2h1bmsgbm90IGxvYWRlZCwgbnVsbCA9IGNodW5rIHByZWxvYWRlZC9wcmVmZXRjaGVkXG4vLyBbcmVzb2x2ZSwgcmVqZWN0LCBQcm9taXNlXSA9IGNodW5rIGxvYWRpbmcsIDAgPSBjaHVuayBsb2FkZWRcbnZhciBpbnN0YWxsZWRDaHVua3MgPSB7XG5cdFwibWFpblwiOiAwXG59O1xuXG4vLyBubyBjaHVuayBvbiBkZW1hbmQgbG9hZGluZ1xuXG4vLyBubyBwcmVmZXRjaGluZ1xuXG4vLyBubyBwcmVsb2FkZWRcblxuLy8gbm8gSE1SXG5cbi8vIG5vIEhNUiBtYW5pZmVzdFxuXG4vLyBubyBvbiBjaHVua3MgbG9hZGVkXG5cbi8vIG5vIGpzb25wIGZ1bmN0aW9uIiwiX193ZWJwYWNrX3JlcXVpcmVfXy5uYyA9IHVuZGVmaW5lZDsiLCJpbXBvcnQgYXVnbWVudFdpdGhMaXN0ZW4gZnJvbSAnLi9tb2R1bGVzL2xpc3Rlbi9saXN0ZW4ubWpzJztcclxuaW1wb3J0IGF1Z21lbnRXaXRoVHJpc3RhdGUgZnJvbSAnLi9tb2R1bGVzL3RyaXN0YXRlL3RyaXN0YXRlLm1qcyc7XHJcbmltcG9ydCBkaWFsb2cgZnJvbSAnLi9tb2R1bGVzL2RpYWxvZy9kaWFsb2cubWpzJztcclxuaW1wb3J0IHsgbG9hZENzcyB9IGZyb20gJy4vbW9kdWxlcy9jb21tb24ubWpzJztcclxuXHJcbi8qKlxyXG4gKiBDcmVhdGVzIGFuIEFQWCBvYmplY3QgdGhhdCB3cmFwcyBvbmUgb3IgbW9yZSBIVE1MIGVsZW1lbnRzLlxyXG4gKiBAcGFyYW0ge3N0cmluZ3xIVE1MRWxlbWVudHxOb2RlTGlzdHxIVE1MQ29sbGVjdGlvbnxBcnJheTxIVE1MRWxlbWVudD58alF1ZXJ5fEZ1bmN0aW9ufSBpbnB1dCAtIFRoZSBpbnB1dCB0byBjcmVhdGUgdGhlIEFQWCBvYmplY3QgZnJvbS5cclxuICogQHJldHVybnMge09iamVjdH0gVGhlIEFQWCBvYmplY3QuXHJcbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGUgaW5wdXQgdHlwZSBpcyBpbnZhbGlkLlxyXG4gKiBAZXhhbXBsZVxyXG4gKiAvLyBYUGF0aFxyXG4gKiBjb25zdCBhcHgxID0gQVBYKCcvL2RpdltAY2xhc3M9XCJleGFtcGxlXCJdJyk7XHJcbiAqXHJcbiAqIC8vIENTUyBzZWxlY3RvclxyXG4gKiBjb25zdCBhcHgyID0gQVBYKCcuZXhhbXBsZScpO1xyXG4gKlxyXG4gKiAvLyBTaW5nbGUgZWxlbWVudFxyXG4gKiBjb25zdCBlbGVtZW50ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmV4YW1wbGUnKTtcclxuICogY29uc3QgYXB4MyA9IEFQWChlbGVtZW50KTtcclxuICpcclxuICogLy8gTm9kZUxpc3Qgb3IgSFRNTENvbGxlY3Rpb25cclxuICogY29uc3Qgbm9kZUxpc3QgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuZXhhbXBsZScpO1xyXG4gKiBjb25zdCBhcHg0ID0gQVBYKG5vZGVMaXN0KTtcclxuICpcclxuICogLy8gQXJyYXkgb2YgZWxlbWVudHNcclxuICogY29uc3QgZWxlbWVudHMgPSBbZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmV4YW1wbGUxJyksIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5leGFtcGxlMicpXTtcclxuICogY29uc3QgYXB4NSA9IEFQWChlbGVtZW50cyk7XHJcbiAqXHJcbiAqIC8vIGpRdWVyeSBvYmplY3RcclxuICogY29uc3QgJGV4YW1wbGUgPSAkKCcuZXhhbXBsZScpO1xyXG4gKiBjb25zdCBhcHg2ID0gQVBYKCRleGFtcGxlKTtcclxuICpcclxuICogLy8gRnVuY3Rpb24gcmV0dXJuaW5nIGFuIEFQWCBvYmplY3RcclxuICogY29uc3QgYXB4NyA9IEFQWCgoKSA9PiBBUFgoJy5leGFtcGxlJykpO1xyXG4gKi9cclxuY29uc3QgQVBYID0gZnVuY3Rpb24gKGlucHV0LCBjb250ZXh0ID0gZG9jdW1lbnQpIHtcclxuICAgIGxldCBlbGVtZW50cztcclxuXHJcbiAgICAvLyBWYWxpZGF0ZSBjb250ZXh0XHJcbiAgICBpZiAodHlwZW9mIGNvbnRleHQgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgY29udGV4dCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoY29udGV4dCk7XHJcbiAgICB9XHJcbiAgICBlbHNlIGlmIChBUFguaXNBUFhPYmplY3QoY29udGV4dCkpIHtcclxuICAgICAgICBjb250ZXh0ID0gY29udGV4dC5maXJzdCgpO1xyXG4gICAgfSBlbHNlIGlmICghKGNvbnRleHQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCB8fCBjb250ZXh0IGluc3RhbmNlb2YgRG9jdW1lbnQpKSB7XHJcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGNvbnRleHQgZm9yIEFQWCcpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0eXBlb2YgaW5wdXQgPT09ICdzdHJpbmcnICYmIGlucHV0LnN0YXJ0c1dpdGgoJy8vJykpIHtcclxuICAgICAgICAvLyBYUGF0aCB3aXRoIGNvbnRleHRcclxuICAgICAgICBlbGVtZW50cyA9IGRvY3VtZW50LmV2YWx1YXRlKGlucHV0LCBjb250ZXh0LCBudWxsLCBYUGF0aFJlc3VsdC5BTllfVFlQRSwgbnVsbCk7XHJcbiAgICAgICAgbGV0IG5vZGVzID0gW107XHJcbiAgICAgICAgbGV0IG5vZGUgPSBlbGVtZW50cy5pdGVyYXRlTmV4dCgpO1xyXG4gICAgICAgIHdoaWxlIChub2RlKSB7XHJcbiAgICAgICAgICAgIG5vZGVzLnB1c2gobm9kZSk7XHJcbiAgICAgICAgICAgIG5vZGUgPSBlbGVtZW50cy5pdGVyYXRlTmV4dCgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbGVtZW50cyA9IG5vZGVzO1xyXG4gICAgfSBlbHNlIGlmICh0eXBlb2YgaW5wdXQgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgLy8gQ1NTIHNlbGVjdG9yIHdpdGggY29udGV4dFxyXG4gICAgICAgIGVsZW1lbnRzID0gY29udGV4dC5xdWVyeVNlbGVjdG9yQWxsKGlucHV0KTtcclxuICAgIH0gZWxzZSBpZiAoaW5wdXQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCkge1xyXG4gICAgICAgIC8vIFNpbmdsZSBlbGVtZW50IHdpdGhpbiBjb250ZXh0XHJcbiAgICAgICAgZWxlbWVudHMgPSBjb250ZXh0LmNvbnRhaW5zKGlucHV0KSA/IFtpbnB1dF0gOiBbXTtcclxuICAgIH0gZWxzZSBpZiAoaW5wdXQgaW5zdGFuY2VvZiBOb2RlTGlzdCB8fCBpbnB1dCBpbnN0YW5jZW9mIEhUTUxDb2xsZWN0aW9uKSB7XHJcbiAgICAgICAgLy8gTm9kZUxpc3Qgb3IgSFRNTENvbGxlY3Rpb24gd2l0aGluIGNvbnRleHRcclxuICAgICAgICBlbGVtZW50cyA9IEFycmF5LmZyb20oaW5wdXQpLmZpbHRlcihlbCA9PiBjb250ZXh0LmNvbnRhaW5zKGVsKSk7XHJcbiAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoaW5wdXQpICYmIGlucHV0LmV2ZXJ5KGVsID0+IGVsIGluc3RhbmNlb2YgSFRNTEVsZW1lbnQpKSB7XHJcbiAgICAgICAgLy8gQXJyYXkgb2YgZWxlbWVudHMgd2l0aGluIGNvbnRleHRcclxuICAgICAgICBlbGVtZW50cyA9IGlucHV0LmZpbHRlcihlbCA9PiBjb250ZXh0LmNvbnRhaW5zKGVsKSk7XHJcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBqUXVlcnkgIT0gJ3VuZGVmaW5lZCcgJiYgaW5wdXQgaW5zdGFuY2VvZiBqUXVlcnkpIHtcclxuICAgICAgICAvLyBqUXVlcnkgb2JqZWN0IHdpdGhpbiBjb250ZXh0XHJcbiAgICAgICAgZWxlbWVudHMgPSBBcnJheS5mcm9tKGlucHV0LmdldCgpKS5maWx0ZXIoZWwgPT4gY29udGV4dC5jb250YWlucyhlbCkpO1xyXG4gICAgfSBlbHNlIGlmICh0eXBlb2YgaW5wdXQgPT09ICdmdW5jdGlvbicpIHtcclxuICAgICAgICAvLyBGdW5jdGlvbiByZXR1cm5pbmcgYW4gQVBYIG9iamVjdCB3aXRoIGNvbnRleHRcclxuICAgICAgICBlbGVtZW50cyA9IEFQWChpbnB1dCgpLCBjb250ZXh0KTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGlucHV0IHR5cGUgZm9yIEFQWCcpO1xyXG4gICAgfVxyXG5cclxuICAgIHZhciBhcHggPSB7XHJcbiAgICAgICAgZWxlbWVudHM6IGVsZW1lbnRzLFxyXG4gICAgICAgIF9pc0FQWE9iamVjdDogdHJ1ZVxyXG4gICAgfTtcclxuICAgIGFweC5sZW5ndGggPSBlbGVtZW50cy5sZW5ndGg7XHJcbiAgICBhcHguZWFjaCA9IGZ1bmN0aW9uIChjYWxsYmFjaykge1xyXG4gICAgICAgIGlmICh0aGlzLmVsZW1lbnRzIGluc3RhbmNlb2YgQXJyYXkpIHRoaXMuZWxlbWVudHMuZm9yRWFjaChjYWxsYmFjayk7XHJcbiAgICAgICAgaWYgKHRoaXMuZWxlbWVudHMgaW5zdGFuY2VvZiBOb2RlTGlzdCkgQXJyYXkuZnJvbSh0aGlzLmVsZW1lbnRzKS5mb3JFYWNoKGNhbGxiYWNrKTtcclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH07XHJcbiAgICBhcHguZ2V0ID0gZnVuY3Rpb24gKGluZGV4KSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZWxlbWVudHNbaW5kZXhdO1xyXG4gICAgfTtcclxuICAgIGFweC5hbGwgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuZWxlbWVudHMgaW5zdGFuY2VvZiBBcnJheSkgcmV0dXJuIHRoaXMuZWxlbWVudHM7XHJcbiAgICAgICAgaWYgKHRoaXMuZWxlbWVudHMgaW5zdGFuY2VvZiBOb2RlTGlzdCkgcmV0dXJuIEFycmF5LmZyb20odGhpcy5lbGVtZW50cyk7XHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9O1xyXG4gICAgYXB4LmZpcnN0ID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmdldCgwKTtcclxuICAgIH07XHJcbiAgICBhdWdtZW50V2l0aExpc3RlbihhcHgpO1xyXG4gICAgYXVnbWVudFdpdGhUcmlzdGF0ZShhcHgpO1xyXG4gICAgcmV0dXJuIGFweDtcclxufTtcclxuXHJcbkFQWC5sb2FkQ3NzID0gbG9hZENzcztcclxuQVBYLmRpYWxvZyA9IGRpYWxvZztcclxuQVBYLmlzQVBYT2JqZWN0ID0gZnVuY3Rpb24gKG9iaikge1xyXG4gICAgcmV0dXJuIG9iaiAmJiBvYmouX2lzQVBYT2JqZWN0ID09PSB0cnVlO1xyXG59XHJcbkFQWC5pc19udW1lcmljID0gKG4pID0+IHtcclxuICAgIHJldHVybiAhaXNOYU4obiAtIHBhcnNlRmxvYXQobikpO1xyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBBUFg7Il0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9
|
|
2935
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,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Ozs7O1VDckJBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDQTREO0FBQ007QUFDakI7QUFDSDtBQUNDO0FBQy9DO0FBQ0E7QUFDQTtBQUNBLFdBQVcsK0VBQStFO0FBQzFGLGFBQWEsUUFBUTtBQUNyQixZQUFZLE9BQU87QUFDbkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJLHNFQUFpQjtBQUNyQixJQUFJLDBFQUFtQjtBQUN2QjtBQUNBO0FBQ0E7QUFDQSxjQUFjLHdEQUFPO0FBQ3JCLGFBQWEsa0VBQU07QUFDbkIsWUFBWSxnRUFBSztBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlFQUFlLEdBQUcsRSIsInNvdXJjZXMiOlsid2VicGFjazovL0BhcHBpdXMtZnIvYXB4Ly4vbW9kdWxlcy9kaWFsb2cvY3NzL2RpYWxvZy5jc3MiLCJ3ZWJwYWNrOi8vQGFwcGl1cy1mci9hcHgvLi9tb2R1bGVzL3RvYXN0L2Nzcy90b2FzdC5jc3MiLCJ3ZWJwYWNrOi8vQGFwcGl1cy1mci9hcHgvLi9tb2R1bGVzL3RyaXN0YXRlL2Nzcy90cmlzdGF0ZS5jc3MiLCJ3ZWJwYWNrOi8vQGFwcGl1cy1mci9hcHgvLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L3J1bnRpbWUvYXBpLmpzIiwid2VicGFjazovL0BhcHBpdXMtZnIvYXB4Ly4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL2dldFVybC5qcyIsIndlYnBhY2s6Ly9AYXBwaXVzLWZyL2FweC8uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9zb3VyY2VNYXBzLmpzIiwid2VicGFjazovL0BhcHBpdXMtZnIvYXB4Ly4vbW9kdWxlcy9kaWFsb2cvaHRtbC9kaWFsb2cuaHRtbCIsIndlYnBhY2s6Ly9AYXBwaXVzLWZyL2FweC8uL21vZHVsZXMvZGlhbG9nL2Nzcy9kaWFsb2cuY3NzP2E1NjciLCJ3ZWJwYWNrOi8vQGFwcGl1cy1mci9hcHgvLi9tb2R1bGVzL3RvYXN0L2Nzcy90b2FzdC5jc3M/OGE0OCIsIndlYnBhY2s6Ly9AYXBwaXVzLWZyL2FweC8uL21vZHVsZXMvdHJpc3RhdGUvY3NzL3RyaXN0YXRlLmNzcz9hMDk0Iiwid2VicGFjazovL0BhcHBpdXMtZnIvYXB4Ly4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5qZWN0U3R5bGVzSW50b1N0eWxlVGFnLmpzIiwid2VicGFjazovL0BhcHBpdXMtZnIvYXB4Ly4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5zZXJ0QnlTZWxlY3Rvci5qcyIsIndlYnBhY2s6Ly9AYXBwaXVzLWZyL2FweC8uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luc2VydFN0eWxlRWxlbWVudC5qcyIsIndlYnBhY2s6Ly9AYXBwaXVzLWZyL2FweC8uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL3NldEF0dHJpYnV0ZXNXaXRob3V0QXR0cmlidXRlcy5qcyIsIndlYnBhY2s6Ly9AYXBwaXVzLWZyL2FweC8uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL3N0eWxlRG9tQVBJLmpzIiwid2VicGFjazovL0BhcHBpdXMtZnIvYXB4Ly4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvc3R5bGVUYWdUcmFuc2Zvcm0uanMiLCJ3ZWJwYWNrOi8vQGFwcGl1cy1mci9hcHgvLi9tb2R1bGVzL2NvbW1vbi5tanMiLCJ3ZWJwYWNrOi8vQGFwcGl1cy1mci9hcHgvLi9tb2R1bGVzL2RpYWxvZy9kaWFsb2cubWpzIiwid2VicGFjazovL0BhcHBpdXMtZnIvYXB4Ly4vbW9kdWxlcy9saXN0ZW4vbGlzdGVuLm1qcyIsIndlYnBhY2s6Ly9AYXBwaXVzLWZyL2FweC8uL21vZHVsZXMvdG9hc3QvdG9hc3QubWpzIiwid2VicGFjazovL0BhcHBpdXMtZnIvYXB4Ly4vbW9kdWxlcy90cmlzdGF0ZS90cmlzdGF0ZS5tanMiLCJ3ZWJwYWNrOi8vQGFwcGl1cy1mci9hcHgvd2VicGFjay9ib290c3RyYXAiLCJ3ZWJwYWNrOi8vQGFwcGl1cy1mci9hcHgvd2VicGFjay9ydW50aW1lL2NvbXBhdCBnZXQgZGVmYXVsdCBleHBvcnQiLCJ3ZWJwYWNrOi8vQGFwcGl1cy1mci9hcHgvd2VicGFjay9ydW50aW1lL2RlZmluZSBwcm9wZXJ0eSBnZXR0ZXJzIiwid2VicGFjazovL0BhcHBpdXMtZnIvYXB4L3dlYnBhY2svcnVudGltZS9oYXNPd25Qcm9wZXJ0eSBzaG9ydGhhbmQiLCJ3ZWJwYWNrOi8vQGFwcGl1cy1mci9hcHgvd2VicGFjay9ydW50aW1lL21ha2UgbmFtZXNwYWNlIG9iamVjdCIsIndlYnBhY2s6Ly9AYXBwaXVzLWZyL2FweC93ZWJwYWNrL3J1bnRpbWUvanNvbnAgY2h1bmsgbG9hZGluZyIsIndlYnBhY2s6Ly9AYXBwaXVzLWZyL2FweC93ZWJwYWNrL3J1bnRpbWUvbm9uY2UiLCJ3ZWJwYWNrOi8vQGFwcGl1cy1mci9hcHgvLi9BUFgubWpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIEltcG9ydHNcbmltcG9ydCBfX19DU1NfTE9BREVSX0FQSV9TT1VSQ0VNQVBfSU1QT1JUX19fIGZyb20gXCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L3J1bnRpbWUvc291cmNlTWFwcy5qc1wiO1xuaW1wb3J0IF9fX0NTU19MT0FERVJfQVBJX0lNUE9SVF9fXyBmcm9tIFwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL2FwaS5qc1wiO1xudmFyIF9fX0NTU19MT0FERVJfRVhQT1JUX19fID0gX19fQ1NTX0xPQURFUl9BUElfSU1QT1JUX19fKF9fX0NTU19MT0FERVJfQVBJX1NPVVJDRU1BUF9JTVBPUlRfX18pO1xuLy8gTW9kdWxlXG5fX19DU1NfTE9BREVSX0VYUE9SVF9fXy5wdXNoKFttb2R1bGUuaWQsIGAvKiBEaWFsb2cgc3R5bGluZyAqL1xyXG4uQVBYLWRpYWxvZyB7XHJcbiAgICBkaXNwbGF5OiBub25lO1xyXG4gICAgcG9zaXRpb246IGZpeGVkO1xyXG4gICAgei1pbmRleDogMTAwMjtcclxuICAgIGxlZnQ6IDA7XHJcbiAgICB0b3A6IDA7XHJcbiAgICB3aWR0aDogMTAwJTtcclxuICAgIGhlaWdodDogMTAwJTtcclxuICAgIG92ZXJmbG93OiBhdXRvO1xyXG4gICAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgwLCAwLCAwLCAwLjQpO1xyXG4gICAgLyogRGltbWVkIGJhY2tncm91bmQgZm9yIGZvY3VzIG9uIGRpYWxvZyAqL1xyXG59XHJcblxyXG4uQVBYLWRpYWxvZy1jb250ZW50IHtcclxuICAgIGJhY2tncm91bmQtY29sb3I6ICNmZWZlZmU7XHJcbiAgICBwYWRkaW5nOiA0MHB4O1xyXG4gICAgYm9yZGVyOiBub25lO1xyXG4gICAgd2lkdGg6IGF1dG87XHJcbiAgICBtaW4td2lkdGg6IDMwMHB4O1xyXG4gICAgbWF4LXdpZHRoOiA4MCU7XHJcbiAgICBtYXJnaW46IGF1dG87XHJcbiAgICBib3JkZXItcmFkaXVzOiA4cHg7XHJcbiAgICBib3gtc2hhZG93OiAwcHggNnB4IDIwcHggcmdiYSgwLCAwLCAwLCAwLjEpO1xyXG4gICAgZm9udC1mYW1pbHk6ICdIZWx2ZXRpY2EgTmV1ZScsIEFyaWFsLCBzYW5zLXNlcmlmO1xyXG59XHJcblxyXG5oMi5BUFgtZGlhbG9nLXRpdGxle1xyXG4gICAgbWFyZ2luLXRvcDowO1xyXG59XHJcblxyXG4uQVBYLWNsb3NlLWRpYWxvZyB7XHJcbiAgICBjb2xvcjogI2FhYTtcclxuICAgIGZsb2F0OiByaWdodDtcclxuICAgIGZvbnQtc2l6ZTogMjRweDtcclxuICAgIG1hcmdpbi10b3A6IC0xMHB4O1xyXG4gICAgLyogQWRqdXN0IHBvc2l0aW9uaW5nICovXHJcbiAgICBtYXJnaW4tcmlnaHQ6IC0xMHB4O1xyXG59XHJcblxyXG4uQVBYLWNsb3NlLWRpYWxvZzpob3ZlcixcclxuLkFQWC1jbG9zZS1kaWFsb2c6Zm9jdXMge1xyXG4gICAgY29sb3I6ICMzMzM7XHJcbiAgICAvKiBEYXJrZXIgY29sb3Igb24gaG92ZXIvZm9jdXMgKi9cclxuICAgIGN1cnNvcjogcG9pbnRlcjtcclxufVxyXG5cclxuLyogSW5wdXQgZmllbGRzIHN0eWxpbmcgKi9cclxuLkFQWC1kaWFsb2ctY29udGVudCBpbnB1dFt0eXBlPVwidGV4dFwiXSxcclxuLkFQWC1kaWFsb2ctY29udGVudCBpbnB1dFt0eXBlPVwibnVtYmVyXCJdLFxyXG4uQVBYLWRpYWxvZy1jb250ZW50IGlucHV0W3R5cGU9XCJkYXRlXCJdLFxyXG4uQVBYLWRpYWxvZy1jb250ZW50IGlucHV0W3R5cGU9XCJkYXRldGltZS1sb2NhbFwiXSB7XHJcbiAgICB3aWR0aDogMTAwJTtcclxuICAgIHBhZGRpbmc6IDEwcHg7XHJcbiAgICBtYXJnaW4tYm90dG9tOiAyMHB4O1xyXG4gICAgYm9yZGVyOiAxcHggc29saWQgI2NjYztcclxuICAgIGJvcmRlci1yYWRpdXM6IDRweDtcclxuICAgIGZvbnQtZmFtaWx5OiAnSGVsdmV0aWNhIE5ldWUnLCBBcmlhbCwgc2Fucy1zZXJpZjtcclxuICAgIGZvbnQtc2l6ZTogMTZweDtcclxuICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XHJcbiAgICB0cmFuc2l0aW9uOiBib3JkZXItY29sb3IgMC4zcztcclxufVxyXG5cclxuLkFQWC1kaWFsb2ctY29udGVudCBpbnB1dFt0eXBlPVwidGV4dFwiXTpmb2N1cyxcclxuLkFQWC1kaWFsb2ctY29udGVudCBpbnB1dFt0eXBlPVwibnVtYmVyXCJdOmZvY3VzLFxyXG4uQVBYLWRpYWxvZy1jb250ZW50IGlucHV0W3R5cGU9XCJkYXRlXCJdOmZvY3VzLFxyXG4uQVBYLWRpYWxvZy1jb250ZW50IGlucHV0W3R5cGU9XCJkYXRldGltZS1sb2NhbFwiXTpmb2N1cyB7XHJcbiAgICBib3JkZXItY29sb3I6ICMyQzNFNTA7XHJcbiAgICAvKiBEZWVwIEJsdWUgQ29sb3IgKi9cclxuICAgIG91dGxpbmU6IG5vbmU7XHJcbn1cclxuXHJcbi8qIEJ1dHRvbiBpbiB0aGUgZGlhbG9nICovXHJcbi5BUFgtZGlhbG9nLWJ1dHRvbi1jb250YWluZXIgYnV0dG9uIHtcclxuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcclxuICAgIGJhY2tncm91bmQtY29sb3I6ICMyQzNFNTA7XHJcbiAgICBjb2xvcjogI0VDRjBGMTtcclxuICAgIGJvcmRlcjogbm9uZTtcclxuICAgIHBhZGRpbmc6IDEwcHggMjBweDtcclxuICAgIGJvcmRlci1yYWRpdXM6IDVweDtcclxuICAgIGZvbnQtc2l6ZTogMTZweDtcclxuICAgIGN1cnNvcjogcG9pbnRlcjtcclxuICAgIHRyYW5zaXRpb246IGFsbCAwLjNzIGVhc2U7XHJcbiAgICBib3gtc2hhZG93OiAwIDJweCA0cHggcmdiYSgwLCAwLCAwLCAwLjEpO1xyXG59XHJcblxyXG4uQVBYLWRpYWxvZy1idXR0b24tY29udGFpbmVyIGJ1dHRvbjpob3ZlciB7XHJcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjMzQ0OTVFO1xyXG4gICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC0xcHgpO1xyXG4gICAgYm94LXNoYWRvdzogMCA0cHggOHB4IHJnYmEoMCwgMCwgMCwgMC4xNSk7XHJcbn1cclxuXHJcbi5BUFgtZGlhbG9nLWJ1dHRvbi1jb250YWluZXIge1xyXG4gICAgZGlzcGxheTogZmxleDtcclxuICAgIGdhcDogMTBweDtcclxuICAgIG1hcmdpbi10b3A6MWVtO1xyXG4gICAgLyogc3BhY2luZyBiZXR3ZWVuIGJ1dHRvbnMgKi9cclxufVxyXG5cclxuLyogTG9hZGluZyBpbmRpY2F0b3IgKi9cclxuLkFQWC1kaWFsb2ctbG9hZGluZy1pbmRpY2F0b3Ige1xyXG4gICAgZGlzcGxheTogZmxleDtcclxuICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xyXG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcclxuICAgIGhlaWdodDogMTAwcHg7XHJcbiAgICB3aWR0aDogMTAwJTtcclxufVxyXG5cclxuLkFQWC1kaWFsb2ctbG9hZGluZy1pbmRpY2F0b3I6OmJlZm9yZSB7XHJcbiAgICBjb250ZW50OiAnJztcclxuICAgIHdpZHRoOiA0MHB4O1xyXG4gICAgaGVpZ2h0OiA0MHB4O1xyXG4gICAgYm9yZGVyOiA0cHggc29saWQgI2YzZjNmMztcclxuICAgIGJvcmRlci10b3A6IDRweCBzb2xpZCAjMkMzRTUwO1xyXG4gICAgYm9yZGVyLXJhZGl1czogNTAlO1xyXG4gICAgYW5pbWF0aW9uOiBBUFgtZGlhbG9nLXNwaW4gMXMgbGluZWFyIGluZmluaXRlO1xyXG59XHJcblxyXG5Aa2V5ZnJhbWVzIEFQWC1kaWFsb2ctc3BpbiB7XHJcbiAgICAwJSB7IHRyYW5zZm9ybTogcm90YXRlKDBkZWcpOyB9XHJcbiAgICAxMDAlIHsgdHJhbnNmb3JtOiByb3RhdGUoMzYwZGVnKTsgfVxyXG59XHJcbi5BUFgtZGlhbG9nLWJ1dHRvbi1kaXNhYmxlZCB7XHJcbiAgICBvcGFjaXR5OiAwLjU7XHJcbiAgICBjdXJzb3I6IG5vdC1hbGxvd2VkICFpbXBvcnRhbnQ7XHJcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjOTVhNWE2ICFpbXBvcnRhbnQ7IC8qIEdyYXllZCBvdXQgY29sb3IgKi9cclxuICAgIGJveC1zaGFkb3c6IG5vbmUgIWltcG9ydGFudDtcclxuICAgIHRyYW5zaXRpb246IGFsbCAwLjJzIGVhc2U7XHJcbiAgICB0cmFuc2Zvcm06IG5vbmUgIWltcG9ydGFudDtcclxufVxyXG5cclxuLkFQWC1kaWFsb2ctYnV0dG9uLWRpc2FibGVkOmhvdmVyIHtcclxuICAgIGJhY2tncm91bmQtY29sb3I6ICM5NWE1YTYgIWltcG9ydGFudDsgLyogS2VlcCBncmF5IG9uIGhvdmVyICovXHJcbiAgICB0cmFuc2Zvcm06IG5vbmUgIWltcG9ydGFudDtcclxufVxyXG5cclxuLyogQWRkIGEgc3VidGxlIHN0cmlrZXRocm91Z2ggZWZmZWN0ICovXHJcbi5BUFgtZGlhbG9nLWJ1dHRvbi1kaXNhYmxlZDo6YWZ0ZXIge1xyXG4gICAgY29udGVudDogJyc7XHJcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XHJcbiAgICB0b3A6IDUwJTtcclxuICAgIGxlZnQ6IDA7XHJcbiAgICB3aWR0aDogMTAwJTtcclxuICAgIGhlaWdodDogMXB4O1xyXG4gICAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgwLCAwLCAwLCAwLjIpO1xyXG4gICAgdHJhbnNmb3JtOiByb3RhdGUoLTVkZWcpO1xyXG59YCwgXCJcIix7XCJ2ZXJzaW9uXCI6MyxcInNvdXJjZXNcIjpbXCJ3ZWJwYWNrOi8vLi9tb2R1bGVzL2RpYWxvZy9jc3MvZGlhbG9nLmNzc1wiXSxcIm5hbWVzXCI6W10sXCJtYXBwaW5nc1wiOlwiQUFBQSxtQkFBbUI7QUFDbkI7SUFDSSxhQUFhO0lBQ2IsZUFBZTtJQUNmLGFBQWE7SUFDYixPQUFPO0lBQ1AsTUFBTTtJQUNOLFdBQVc7SUFDWCxZQUFZO0lBQ1osY0FBYztJQUNkLG9DQUFvQztJQUNwQywwQ0FBMEM7QUFDOUM7O0FBRUE7SUFDSSx5QkFBeUI7SUFDekIsYUFBYTtJQUNiLFlBQVk7SUFDWixXQUFXO0lBQ1gsZ0JBQWdCO0lBQ2hCLGNBQWM7SUFDZCxZQUFZO0lBQ1osa0JBQWtCO0lBQ2xCLDJDQUEyQztJQUMzQyxnREFBZ0Q7QUFDcEQ7O0FBRUE7SUFDSSxZQUFZO0FBQ2hCOztBQUVBO0lBQ0ksV0FBVztJQUNYLFlBQVk7SUFDWixlQUFlO0lBQ2YsaUJBQWlCO0lBQ2pCLHVCQUF1QjtJQUN2QixtQkFBbUI7QUFDdkI7O0FBRUE7O0lBRUksV0FBVztJQUNYLGdDQUFnQztJQUNoQyxlQUFlO0FBQ25COztBQUVBLHlCQUF5QjtBQUN6Qjs7OztJQUlJLFdBQVc7SUFDWCxhQUFhO0lBQ2IsbUJBQW1CO0lBQ25CLHNCQUFzQjtJQUN0QixrQkFBa0I7SUFDbEIsZ0RBQWdEO0lBQ2hELGVBQWU7SUFDZixzQkFBc0I7SUFDdEIsNkJBQTZCO0FBQ2pDOztBQUVBOzs7O0lBSUkscUJBQXFCO0lBQ3JCLG9CQUFvQjtJQUNwQixhQUFhO0FBQ2pCOztBQUVBLHlCQUF5QjtBQUN6QjtJQUNJLGtCQUFrQjtJQUNsQix5QkFBeUI7SUFDekIsY0FBYztJQUNkLFlBQVk7SUFDWixrQkFBa0I7SUFDbEIsa0JBQWtCO0lBQ2xCLGVBQWU7SUFDZixlQUFlO0lBQ2YseUJBQXlCO0lBQ3pCLHdDQUF3QztBQUM1Qzs7QUFFQTtJQUNJLHlCQUF5QjtJQUN6QiwyQkFBMkI7SUFDM0IseUNBQXlDO0FBQzdDOztBQUVBO0lBQ0ksYUFBYTtJQUNiLFNBQVM7SUFDVCxjQUFjO0lBQ2QsNEJBQTRCO0FBQ2hDOztBQUVBLHNCQUFzQjtBQUN0QjtJQUNJLGFBQWE7SUFDYix1QkFBdUI7SUFDdkIsbUJBQW1CO0lBQ25CLGFBQWE7SUFDYixXQUFXO0FBQ2Y7O0FBRUE7SUFDSSxXQUFXO0lBQ1gsV0FBVztJQUNYLFlBQVk7SUFDWix5QkFBeUI7SUFDekIsNkJBQTZCO0lBQzdCLGtCQUFrQjtJQUNsQiw2Q0FBNkM7QUFDakQ7O0FBRUE7SUFDSSxLQUFLLHVCQUF1QixFQUFFO0lBQzlCLE9BQU8seUJBQXlCLEVBQUU7QUFDdEM7QUFDQTtJQUNJLFlBQVk7SUFDWiw4QkFBOEI7SUFDOUIsb0NBQW9DLEVBQUUscUJBQXFCO0lBQzNELDJCQUEyQjtJQUMzQix5QkFBeUI7SUFDekIsMEJBQTBCO0FBQzlCOztBQUVBO0lBQ0ksb0NBQW9DLEVBQUUsdUJBQXVCO0lBQzdELDBCQUEwQjtBQUM5Qjs7QUFFQSxzQ0FBc0M7QUFDdEM7SUFDSSxXQUFXO0lBQ1gsa0JBQWtCO0lBQ2xCLFFBQVE7SUFDUixPQUFPO0lBQ1AsV0FBVztJQUNYLFdBQVc7SUFDWCxvQ0FBb0M7SUFDcEMsd0JBQXdCO0FBQzVCXCIsXCJzb3VyY2VzQ29udGVudFwiOltcIi8qIERpYWxvZyBzdHlsaW5nICovXFxyXFxuLkFQWC1kaWFsb2cge1xcclxcbiAgICBkaXNwbGF5OiBub25lO1xcclxcbiAgICBwb3NpdGlvbjogZml4ZWQ7XFxyXFxuICAgIHotaW5kZXg6IDEwMDI7XFxyXFxuICAgIGxlZnQ6IDA7XFxyXFxuICAgIHRvcDogMDtcXHJcXG4gICAgd2lkdGg6IDEwMCU7XFxyXFxuICAgIGhlaWdodDogMTAwJTtcXHJcXG4gICAgb3ZlcmZsb3c6IGF1dG87XFxyXFxuICAgIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMCwgMCwgMCwgMC40KTtcXHJcXG4gICAgLyogRGltbWVkIGJhY2tncm91bmQgZm9yIGZvY3VzIG9uIGRpYWxvZyAqL1xcclxcbn1cXHJcXG5cXHJcXG4uQVBYLWRpYWxvZy1jb250ZW50IHtcXHJcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2ZlZmVmZTtcXHJcXG4gICAgcGFkZGluZzogNDBweDtcXHJcXG4gICAgYm9yZGVyOiBub25lO1xcclxcbiAgICB3aWR0aDogYXV0bztcXHJcXG4gICAgbWluLXdpZHRoOiAzMDBweDtcXHJcXG4gICAgbWF4LXdpZHRoOiA4MCU7XFxyXFxuICAgIG1hcmdpbjogYXV0bztcXHJcXG4gICAgYm9yZGVyLXJhZGl1czogOHB4O1xcclxcbiAgICBib3gtc2hhZG93OiAwcHggNnB4IDIwcHggcmdiYSgwLCAwLCAwLCAwLjEpO1xcclxcbiAgICBmb250LWZhbWlseTogJ0hlbHZldGljYSBOZXVlJywgQXJpYWwsIHNhbnMtc2VyaWY7XFxyXFxufVxcclxcblxcclxcbmgyLkFQWC1kaWFsb2ctdGl0bGV7XFxyXFxuICAgIG1hcmdpbi10b3A6MDtcXHJcXG59XFxyXFxuXFxyXFxuLkFQWC1jbG9zZS1kaWFsb2cge1xcclxcbiAgICBjb2xvcjogI2FhYTtcXHJcXG4gICAgZmxvYXQ6IHJpZ2h0O1xcclxcbiAgICBmb250LXNpemU6IDI0cHg7XFxyXFxuICAgIG1hcmdpbi10b3A6IC0xMHB4O1xcclxcbiAgICAvKiBBZGp1c3QgcG9zaXRpb25pbmcgKi9cXHJcXG4gICAgbWFyZ2luLXJpZ2h0OiAtMTBweDtcXHJcXG59XFxyXFxuXFxyXFxuLkFQWC1jbG9zZS1kaWFsb2c6aG92ZXIsXFxyXFxuLkFQWC1jbG9zZS1kaWFsb2c6Zm9jdXMge1xcclxcbiAgICBjb2xvcjogIzMzMztcXHJcXG4gICAgLyogRGFya2VyIGNvbG9yIG9uIGhvdmVyL2ZvY3VzICovXFxyXFxuICAgIGN1cnNvcjogcG9pbnRlcjtcXHJcXG59XFxyXFxuXFxyXFxuLyogSW5wdXQgZmllbGRzIHN0eWxpbmcgKi9cXHJcXG4uQVBYLWRpYWxvZy1jb250ZW50IGlucHV0W3R5cGU9XFxcInRleHRcXFwiXSxcXHJcXG4uQVBYLWRpYWxvZy1jb250ZW50IGlucHV0W3R5cGU9XFxcIm51bWJlclxcXCJdLFxcclxcbi5BUFgtZGlhbG9nLWNvbnRlbnQgaW5wdXRbdHlwZT1cXFwiZGF0ZVxcXCJdLFxcclxcbi5BUFgtZGlhbG9nLWNvbnRlbnQgaW5wdXRbdHlwZT1cXFwiZGF0ZXRpbWUtbG9jYWxcXFwiXSB7XFxyXFxuICAgIHdpZHRoOiAxMDAlO1xcclxcbiAgICBwYWRkaW5nOiAxMHB4O1xcclxcbiAgICBtYXJnaW4tYm90dG9tOiAyMHB4O1xcclxcbiAgICBib3JkZXI6IDFweCBzb2xpZCAjY2NjO1xcclxcbiAgICBib3JkZXItcmFkaXVzOiA0cHg7XFxyXFxuICAgIGZvbnQtZmFtaWx5OiAnSGVsdmV0aWNhIE5ldWUnLCBBcmlhbCwgc2Fucy1zZXJpZjtcXHJcXG4gICAgZm9udC1zaXplOiAxNnB4O1xcclxcbiAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xcclxcbiAgICB0cmFuc2l0aW9uOiBib3JkZXItY29sb3IgMC4zcztcXHJcXG59XFxyXFxuXFxyXFxuLkFQWC1kaWFsb2ctY29udGVudCBpbnB1dFt0eXBlPVxcXCJ0ZXh0XFxcIl06Zm9jdXMsXFxyXFxuLkFQWC1kaWFsb2ctY29udGVudCBpbnB1dFt0eXBlPVxcXCJudW1iZXJcXFwiXTpmb2N1cyxcXHJcXG4uQVBYLWRpYWxvZy1jb250ZW50IGlucHV0W3R5cGU9XFxcImRhdGVcXFwiXTpmb2N1cyxcXHJcXG4uQVBYLWRpYWxvZy1jb250ZW50IGlucHV0W3R5cGU9XFxcImRhdGV0aW1lLWxvY2FsXFxcIl06Zm9jdXMge1xcclxcbiAgICBib3JkZXItY29sb3I6ICMyQzNFNTA7XFxyXFxuICAgIC8qIERlZXAgQmx1ZSBDb2xvciAqL1xcclxcbiAgICBvdXRsaW5lOiBub25lO1xcclxcbn1cXHJcXG5cXHJcXG4vKiBCdXR0b24gaW4gdGhlIGRpYWxvZyAqL1xcclxcbi5BUFgtZGlhbG9nLWJ1dHRvbi1jb250YWluZXIgYnV0dG9uIHtcXHJcXG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xcclxcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjMkMzRTUwO1xcclxcbiAgICBjb2xvcjogI0VDRjBGMTtcXHJcXG4gICAgYm9yZGVyOiBub25lO1xcclxcbiAgICBwYWRkaW5nOiAxMHB4IDIwcHg7XFxyXFxuICAgIGJvcmRlci1yYWRpdXM6IDVweDtcXHJcXG4gICAgZm9udC1zaXplOiAxNnB4O1xcclxcbiAgICBjdXJzb3I6IHBvaW50ZXI7XFxyXFxuICAgIHRyYW5zaXRpb246IGFsbCAwLjNzIGVhc2U7XFxyXFxuICAgIGJveC1zaGFkb3c6IDAgMnB4IDRweCByZ2JhKDAsIDAsIDAsIDAuMSk7XFxyXFxufVxcclxcblxcclxcbi5BUFgtZGlhbG9nLWJ1dHRvbi1jb250YWluZXIgYnV0dG9uOmhvdmVyIHtcXHJcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogIzM0NDk1RTtcXHJcXG4gICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC0xcHgpO1xcclxcbiAgICBib3gtc2hhZG93OiAwIDRweCA4cHggcmdiYSgwLCAwLCAwLCAwLjE1KTtcXHJcXG59XFxyXFxuXFxyXFxuLkFQWC1kaWFsb2ctYnV0dG9uLWNvbnRhaW5lciB7XFxyXFxuICAgIGRpc3BsYXk6IGZsZXg7XFxyXFxuICAgIGdhcDogMTBweDtcXHJcXG4gICAgbWFyZ2luLXRvcDoxZW07XFxyXFxuICAgIC8qIHNwYWNpbmcgYmV0d2VlbiBidXR0b25zICovXFxyXFxufVxcclxcblxcclxcbi8qIExvYWRpbmcgaW5kaWNhdG9yICovXFxyXFxuLkFQWC1kaWFsb2ctbG9hZGluZy1pbmRpY2F0b3Ige1xcclxcbiAgICBkaXNwbGF5OiBmbGV4O1xcclxcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcXHJcXG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcXHJcXG4gICAgaGVpZ2h0OiAxMDBweDtcXHJcXG4gICAgd2lkdGg6IDEwMCU7XFxyXFxufVxcclxcblxcclxcbi5BUFgtZGlhbG9nLWxvYWRpbmctaW5kaWNhdG9yOjpiZWZvcmUge1xcclxcbiAgICBjb250ZW50OiAnJztcXHJcXG4gICAgd2lkdGg6IDQwcHg7XFxyXFxuICAgIGhlaWdodDogNDBweDtcXHJcXG4gICAgYm9yZGVyOiA0cHggc29saWQgI2YzZjNmMztcXHJcXG4gICAgYm9yZGVyLXRvcDogNHB4IHNvbGlkICMyQzNFNTA7XFxyXFxuICAgIGJvcmRlci1yYWRpdXM6IDUwJTtcXHJcXG4gICAgYW5pbWF0aW9uOiBBUFgtZGlhbG9nLXNwaW4gMXMgbGluZWFyIGluZmluaXRlO1xcclxcbn1cXHJcXG5cXHJcXG5Aa2V5ZnJhbWVzIEFQWC1kaWFsb2ctc3BpbiB7XFxyXFxuICAgIDAlIHsgdHJhbnNmb3JtOiByb3RhdGUoMGRlZyk7IH1cXHJcXG4gICAgMTAwJSB7IHRyYW5zZm9ybTogcm90YXRlKDM2MGRlZyk7IH1cXHJcXG59XFxyXFxuLkFQWC1kaWFsb2ctYnV0dG9uLWRpc2FibGVkIHtcXHJcXG4gICAgb3BhY2l0eTogMC41O1xcclxcbiAgICBjdXJzb3I6IG5vdC1hbGxvd2VkICFpbXBvcnRhbnQ7XFxyXFxuICAgIGJhY2tncm91bmQtY29sb3I6ICM5NWE1YTYgIWltcG9ydGFudDsgLyogR3JheWVkIG91dCBjb2xvciAqL1xcclxcbiAgICBib3gtc2hhZG93OiBub25lICFpbXBvcnRhbnQ7XFxyXFxuICAgIHRyYW5zaXRpb246IGFsbCAwLjJzIGVhc2U7XFxyXFxuICAgIHRyYW5zZm9ybTogbm9uZSAhaW1wb3J0YW50O1xcclxcbn1cXHJcXG5cXHJcXG4uQVBYLWRpYWxvZy1idXR0b24tZGlzYWJsZWQ6aG92ZXIge1xcclxcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjOTVhNWE2ICFpbXBvcnRhbnQ7IC8qIEtlZXAgZ3JheSBvbiBob3ZlciAqL1xcclxcbiAgICB0cmFuc2Zvcm06IG5vbmUgIWltcG9ydGFudDtcXHJcXG59XFxyXFxuXFxyXFxuLyogQWRkIGEgc3VidGxlIHN0cmlrZXRocm91Z2ggZWZmZWN0ICovXFxyXFxuLkFQWC1kaWFsb2ctYnV0dG9uLWRpc2FibGVkOjphZnRlciB7XFxyXFxuICAgIGNvbnRlbnQ6ICcnO1xcclxcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XFxyXFxuICAgIHRvcDogNTAlO1xcclxcbiAgICBsZWZ0OiAwO1xcclxcbiAgICB3aWR0aDogMTAwJTtcXHJcXG4gICAgaGVpZ2h0OiAxcHg7XFxyXFxuICAgIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMCwgMCwgMCwgMC4yKTtcXHJcXG4gICAgdHJhbnNmb3JtOiByb3RhdGUoLTVkZWcpO1xcclxcbn1cIl0sXCJzb3VyY2VSb290XCI6XCJcIn1dKTtcbi8vIEV4cG9ydHNcbmV4cG9ydCBkZWZhdWx0IF9fX0NTU19MT0FERVJfRVhQT1JUX19fO1xuIiwiLy8gSW1wb3J0c1xuaW1wb3J0IF9fX0NTU19MT0FERVJfQVBJX1NPVVJDRU1BUF9JTVBPUlRfX18gZnJvbSBcIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9zb3VyY2VNYXBzLmpzXCI7XG5pbXBvcnQgX19fQ1NTX0xPQURFUl9BUElfSU1QT1JUX19fIGZyb20gXCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L3J1bnRpbWUvYXBpLmpzXCI7XG52YXIgX19fQ1NTX0xPQURFUl9FWFBPUlRfX18gPSBfX19DU1NfTE9BREVSX0FQSV9JTVBPUlRfX18oX19fQ1NTX0xPQURFUl9BUElfU09VUkNFTUFQX0lNUE9SVF9fXyk7XG4vLyBNb2R1bGVcbl9fX0NTU19MT0FERVJfRVhQT1JUX19fLnB1c2goW21vZHVsZS5pZCwgYC5BUFgtdG9hc3QtY29udGFpbmVyIHtcclxuICAgIHBvc2l0aW9uOiBmaXhlZDtcclxuICAgIGRpc3BsYXk6IGZsZXg7XHJcbiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xyXG4gICAgZ2FwOiB2YXIoLS1hcHgtdG9hc3QtZ2FwLCA4cHgpO1xyXG4gICAgei1pbmRleDogdmFyKC0tYXB4LXRvYXN0LXotaW5kZXgsIDExMDAwKTtcclxuICAgIHBvaW50ZXItZXZlbnRzOiBub25lO1xyXG59XHJcblxyXG4uQVBYLXRvYXN0LWNvbnRhaW5lci0tYm90dG9tLXJpZ2h0IHsgcmlnaHQ6IDEycHg7IGJvdHRvbTogMTJweDsgYWxpZ24taXRlbXM6IGZsZXgtZW5kOyB9XHJcbi5BUFgtdG9hc3QtY29udGFpbmVyLS1ib3R0b20tbGVmdCB7IGxlZnQ6IDEycHg7IGJvdHRvbTogMTJweDsgYWxpZ24taXRlbXM6IGZsZXgtc3RhcnQ7IH1cclxuLkFQWC10b2FzdC1jb250YWluZXItLXRvcC1yaWdodCB7IHJpZ2h0OiAxMnB4OyB0b3A6IDEycHg7IGFsaWduLWl0ZW1zOiBmbGV4LWVuZDsgfVxyXG4uQVBYLXRvYXN0LWNvbnRhaW5lci0tdG9wLWxlZnQgeyBsZWZ0OiAxMnB4OyB0b3A6IDEycHg7IGFsaWduLWl0ZW1zOiBmbGV4LXN0YXJ0OyB9XHJcblxyXG4uQVBYLXRvYXN0IHtcclxuICAgIG1pbi13aWR0aDogdmFyKC0tYXB4LXRvYXN0LW1pbi13aWR0aCwgMjYwcHgpO1xyXG4gICAgbWF4LXdpZHRoOiB2YXIoLS1hcHgtdG9hc3QtbWF4LXdpZHRoLCA0MjBweCk7XHJcbiAgICBmb250LXNpemU6IHZhcigtLWFweC10b2FzdC1mb250LXNpemUsIDE0cHgpO1xyXG4gICAgYm9yZGVyLXJhZGl1czogdmFyKC0tYXB4LXRvYXN0LXJhZGl1cywgNnB4KTtcclxuICAgIGJveC1zaGFkb3c6IHZhcigtLWFweC10b2FzdC1zaGFkb3csIDAgNnB4IDI0cHggcmdiYSgwLDAsMCwwLjIpKTtcclxuICAgIHBhZGRpbmc6IHZhcigtLWFweC10b2FzdC1wYWRkaW5nLCAxMHB4IDQycHggMTBweCAxNHB4KTtcclxuICAgIGNvbG9yOiAjMTExO1xyXG4gICAgYmFja2dyb3VuZDogI2VlZTtcclxuICAgIHBvaW50ZXItZXZlbnRzOiBhdXRvO1xyXG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xyXG4gICAgdHJhbnNpdGlvbjogb3BhY2l0eSAxODBtcyBlYXNlLCB0cmFuc2Zvcm0gMTgwbXMgZWFzZTtcclxufVxyXG5cclxuLkFQWC10b2FzdC0taW5mbyB7IGJhY2tncm91bmQ6IHZhcigtLWFweC10b2FzdC1pbmZvLWJnLCAjMGRjYWYwKTsgY29sb3I6IHZhcigtLWFweC10b2FzdC1pbmZvLWZnLCAjMDUyYzY1KTsgfVxyXG4uQVBYLXRvYXN0LS1zdWNjZXNzIHsgYmFja2dyb3VuZDogdmFyKC0tYXB4LXRvYXN0LXN1Y2Nlc3MtYmcsICMxOTg3NTQpOyBjb2xvcjogdmFyKC0tYXB4LXRvYXN0LXN1Y2Nlc3MtZmcsICNmZmZmZmYpOyB9XHJcbi5BUFgtdG9hc3QtLXdhcm5pbmcgeyBiYWNrZ3JvdW5kOiB2YXIoLS1hcHgtdG9hc3Qtd2FybmluZy1iZywgI2ZmYzEwNyk7IGNvbG9yOiB2YXIoLS1hcHgtdG9hc3Qtd2FybmluZy1mZywgIzY2NGQwMyk7IH1cclxuLkFQWC10b2FzdC0tZGFuZ2VyIHsgYmFja2dyb3VuZDogdmFyKC0tYXB4LXRvYXN0LWRhbmdlci1iZywgI2RjMzU0NSk7IGNvbG9yOiB2YXIoLS1hcHgtdG9hc3QtZGFuZ2VyLWZnLCAjZmZmZmZmKTsgfVxyXG5cclxuLkFQWC10b2FzdF9fY29udGVudCB7IGxpbmUtaGVpZ2h0OiAxLjM1OyB9XHJcblxyXG4uQVBYLXRvYXN0X19jbG9zZSB7XHJcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XHJcbiAgICB0b3A6IDUwJTsgcmlnaHQ6IDEwcHg7XHJcbiAgICB3aWR0aDogMjRweDsgaGVpZ2h0OiAyNHB4O1xyXG4gICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC01MCUpO1xyXG4gICAgZGlzcGxheTogaW5saW5lLWZsZXg7IGFsaWduLWl0ZW1zOiBjZW50ZXI7IGp1c3RpZnktY29udGVudDogY2VudGVyO1xyXG4gICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7IGNvbG9yOiBjdXJyZW50Q29sb3I7XHJcbiAgICBib3JkZXI6IDA7IGJvcmRlci1yYWRpdXM6IDRweDsgcGFkZGluZzogMDsgbWFyZ2luOiAwO1xyXG4gICAgY3Vyc29yOiBwb2ludGVyOyBhcHBlYXJhbmNlOiBub25lOyAtd2Via2l0LWFwcGVhcmFuY2U6IG5vbmU7XHJcbiAgICBvcGFjaXR5OiAuNzU7IHRyYW5zaXRpb246IG9wYWNpdHkgMTIwbXMgZWFzZTtcclxufVxyXG4uQVBYLXRvYXN0X19jbG9zZTpob3ZlciB7IG9wYWNpdHk6IDE7IH1cclxuLkFQWC10b2FzdF9fY2xvc2U6Zm9jdXMgeyBvdXRsaW5lOiAycHggc29saWQgcmdiYSgwLDAsMCwuMik7IG91dGxpbmUtb2Zmc2V0OiAycHg7IH1cclxuLkFQWC10b2FzdF9fY2xvc2U6OmJlZm9yZSB7XHJcbiAgICBjb250ZW50OiAnw5cnO1xyXG4gICAgZm9udC1zaXplOiAxNnB4OyBsaW5lLWhlaWdodDogMTsgdGV4dC1hbGlnbjogY2VudGVyO1xyXG59XHJcblxyXG4vKiBBbmltYXRpb25zICovXHJcbi5BUFgtdG9hc3QtLWVudGVyIHsgb3BhY2l0eTogMDsgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKDhweCk7IH1cclxuLkFQWC10b2FzdC0tZW50ZXIuQVBYLXRvYXN0LS1lbnRlci1hY3RpdmUgeyBvcGFjaXR5OiAxOyB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoMCk7IH1cclxuLkFQWC10b2FzdC0tZXhpdCB7IG9wYWNpdHk6IDE7IHRyYW5zZm9ybTogdHJhbnNsYXRlWSgwKTsgfVxyXG4uQVBYLXRvYXN0LS1leGl0LkFQWC10b2FzdC0tZXhpdC1hY3RpdmUgeyBvcGFjaXR5OiAwOyB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoOHB4KTsgfVxyXG5cclxuXHJcbmAsIFwiXCIse1widmVyc2lvblwiOjMsXCJzb3VyY2VzXCI6W1wid2VicGFjazovLy4vbW9kdWxlcy90b2FzdC9jc3MvdG9hc3QuY3NzXCJdLFwibmFtZXNcIjpbXSxcIm1hcHBpbmdzXCI6XCJBQUFBO0lBQ0ksZUFBZTtJQUNmLGFBQWE7SUFDYixzQkFBc0I7SUFDdEIsOEJBQThCO0lBQzlCLHdDQUF3QztJQUN4QyxvQkFBb0I7QUFDeEI7O0FBRUEscUNBQXFDLFdBQVcsRUFBRSxZQUFZLEVBQUUscUJBQXFCLEVBQUU7QUFDdkYsb0NBQW9DLFVBQVUsRUFBRSxZQUFZLEVBQUUsdUJBQXVCLEVBQUU7QUFDdkYsa0NBQWtDLFdBQVcsRUFBRSxTQUFTLEVBQUUscUJBQXFCLEVBQUU7QUFDakYsaUNBQWlDLFVBQVUsRUFBRSxTQUFTLEVBQUUsdUJBQXVCLEVBQUU7O0FBRWpGO0lBQ0ksNENBQTRDO0lBQzVDLDRDQUE0QztJQUM1QywyQ0FBMkM7SUFDM0MsMkNBQTJDO0lBQzNDLCtEQUErRDtJQUMvRCxzREFBc0Q7SUFDdEQsV0FBVztJQUNYLGdCQUFnQjtJQUNoQixvQkFBb0I7SUFDcEIsa0JBQWtCO0lBQ2xCLG9EQUFvRDtBQUN4RDs7QUFFQSxtQkFBbUIsNkNBQTZDLEVBQUUsd0NBQXdDLEVBQUU7QUFDNUcsc0JBQXNCLGdEQUFnRCxFQUFFLDJDQUEyQyxFQUFFO0FBQ3JILHNCQUFzQixnREFBZ0QsRUFBRSwyQ0FBMkMsRUFBRTtBQUNySCxxQkFBcUIsK0NBQStDLEVBQUUsMENBQTBDLEVBQUU7O0FBRWxILHNCQUFzQixpQkFBaUIsRUFBRTs7QUFFekM7SUFDSSxrQkFBa0I7SUFDbEIsUUFBUSxFQUFFLFdBQVc7SUFDckIsV0FBVyxFQUFFLFlBQVk7SUFDekIsMkJBQTJCO0lBQzNCLG9CQUFvQixFQUFFLG1CQUFtQixFQUFFLHVCQUF1QjtJQUNsRSx1QkFBdUIsRUFBRSxtQkFBbUI7SUFDNUMsU0FBUyxFQUFFLGtCQUFrQixFQUFFLFVBQVUsRUFBRSxTQUFTO0lBQ3BELGVBQWUsRUFBRSxnQkFBZ0IsRUFBRSx3QkFBd0I7SUFDM0QsWUFBWSxFQUFFLDhCQUE4QjtBQUNoRDtBQUNBLDBCQUEwQixVQUFVLEVBQUU7QUFDdEMsMEJBQTBCLGlDQUFpQyxFQUFFLG1CQUFtQixFQUFFO0FBQ2xGO0lBQ0ksWUFBWTtJQUNaLGVBQWUsRUFBRSxjQUFjLEVBQUUsa0JBQWtCO0FBQ3ZEOztBQUVBLGVBQWU7QUFDZixvQkFBb0IsVUFBVSxFQUFFLDBCQUEwQixFQUFFO0FBQzVELDRDQUE0QyxVQUFVLEVBQUUsd0JBQXdCLEVBQUU7QUFDbEYsbUJBQW1CLFVBQVUsRUFBRSx3QkFBd0IsRUFBRTtBQUN6RCwwQ0FBMEMsVUFBVSxFQUFFLDBCQUEwQixFQUFFXCIsXCJzb3VyY2VzQ29udGVudFwiOltcIi5BUFgtdG9hc3QtY29udGFpbmVyIHtcXHJcXG4gICAgcG9zaXRpb246IGZpeGVkO1xcclxcbiAgICBkaXNwbGF5OiBmbGV4O1xcclxcbiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xcclxcbiAgICBnYXA6IHZhcigtLWFweC10b2FzdC1nYXAsIDhweCk7XFxyXFxuICAgIHotaW5kZXg6IHZhcigtLWFweC10b2FzdC16LWluZGV4LCAxMTAwMCk7XFxyXFxuICAgIHBvaW50ZXItZXZlbnRzOiBub25lO1xcclxcbn1cXHJcXG5cXHJcXG4uQVBYLXRvYXN0LWNvbnRhaW5lci0tYm90dG9tLXJpZ2h0IHsgcmlnaHQ6IDEycHg7IGJvdHRvbTogMTJweDsgYWxpZ24taXRlbXM6IGZsZXgtZW5kOyB9XFxyXFxuLkFQWC10b2FzdC1jb250YWluZXItLWJvdHRvbS1sZWZ0IHsgbGVmdDogMTJweDsgYm90dG9tOiAxMnB4OyBhbGlnbi1pdGVtczogZmxleC1zdGFydDsgfVxcclxcbi5BUFgtdG9hc3QtY29udGFpbmVyLS10b3AtcmlnaHQgeyByaWdodDogMTJweDsgdG9wOiAxMnB4OyBhbGlnbi1pdGVtczogZmxleC1lbmQ7IH1cXHJcXG4uQVBYLXRvYXN0LWNvbnRhaW5lci0tdG9wLWxlZnQgeyBsZWZ0OiAxMnB4OyB0b3A6IDEycHg7IGFsaWduLWl0ZW1zOiBmbGV4LXN0YXJ0OyB9XFxyXFxuXFxyXFxuLkFQWC10b2FzdCB7XFxyXFxuICAgIG1pbi13aWR0aDogdmFyKC0tYXB4LXRvYXN0LW1pbi13aWR0aCwgMjYwcHgpO1xcclxcbiAgICBtYXgtd2lkdGg6IHZhcigtLWFweC10b2FzdC1tYXgtd2lkdGgsIDQyMHB4KTtcXHJcXG4gICAgZm9udC1zaXplOiB2YXIoLS1hcHgtdG9hc3QtZm9udC1zaXplLCAxNHB4KTtcXHJcXG4gICAgYm9yZGVyLXJhZGl1czogdmFyKC0tYXB4LXRvYXN0LXJhZGl1cywgNnB4KTtcXHJcXG4gICAgYm94LXNoYWRvdzogdmFyKC0tYXB4LXRvYXN0LXNoYWRvdywgMCA2cHggMjRweCByZ2JhKDAsMCwwLDAuMikpO1xcclxcbiAgICBwYWRkaW5nOiB2YXIoLS1hcHgtdG9hc3QtcGFkZGluZywgMTBweCA0MnB4IDEwcHggMTRweCk7XFxyXFxuICAgIGNvbG9yOiAjMTExO1xcclxcbiAgICBiYWNrZ3JvdW5kOiAjZWVlO1xcclxcbiAgICBwb2ludGVyLWV2ZW50czogYXV0bztcXHJcXG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xcclxcbiAgICB0cmFuc2l0aW9uOiBvcGFjaXR5IDE4MG1zIGVhc2UsIHRyYW5zZm9ybSAxODBtcyBlYXNlO1xcclxcbn1cXHJcXG5cXHJcXG4uQVBYLXRvYXN0LS1pbmZvIHsgYmFja2dyb3VuZDogdmFyKC0tYXB4LXRvYXN0LWluZm8tYmcsICMwZGNhZjApOyBjb2xvcjogdmFyKC0tYXB4LXRvYXN0LWluZm8tZmcsICMwNTJjNjUpOyB9XFxyXFxuLkFQWC10b2FzdC0tc3VjY2VzcyB7IGJhY2tncm91bmQ6IHZhcigtLWFweC10b2FzdC1zdWNjZXNzLWJnLCAjMTk4NzU0KTsgY29sb3I6IHZhcigtLWFweC10b2FzdC1zdWNjZXNzLWZnLCAjZmZmZmZmKTsgfVxcclxcbi5BUFgtdG9hc3QtLXdhcm5pbmcgeyBiYWNrZ3JvdW5kOiB2YXIoLS1hcHgtdG9hc3Qtd2FybmluZy1iZywgI2ZmYzEwNyk7IGNvbG9yOiB2YXIoLS1hcHgtdG9hc3Qtd2FybmluZy1mZywgIzY2NGQwMyk7IH1cXHJcXG4uQVBYLXRvYXN0LS1kYW5nZXIgeyBiYWNrZ3JvdW5kOiB2YXIoLS1hcHgtdG9hc3QtZGFuZ2VyLWJnLCAjZGMzNTQ1KTsgY29sb3I6IHZhcigtLWFweC10b2FzdC1kYW5nZXItZmcsICNmZmZmZmYpOyB9XFxyXFxuXFxyXFxuLkFQWC10b2FzdF9fY29udGVudCB7IGxpbmUtaGVpZ2h0OiAxLjM1OyB9XFxyXFxuXFxyXFxuLkFQWC10b2FzdF9fY2xvc2Uge1xcclxcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XFxyXFxuICAgIHRvcDogNTAlOyByaWdodDogMTBweDtcXHJcXG4gICAgd2lkdGg6IDI0cHg7IGhlaWdodDogMjRweDtcXHJcXG4gICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC01MCUpO1xcclxcbiAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsgYWxpZ24taXRlbXM6IGNlbnRlcjsganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XFxyXFxuICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50OyBjb2xvcjogY3VycmVudENvbG9yO1xcclxcbiAgICBib3JkZXI6IDA7IGJvcmRlci1yYWRpdXM6IDRweDsgcGFkZGluZzogMDsgbWFyZ2luOiAwO1xcclxcbiAgICBjdXJzb3I6IHBvaW50ZXI7IGFwcGVhcmFuY2U6IG5vbmU7IC13ZWJraXQtYXBwZWFyYW5jZTogbm9uZTtcXHJcXG4gICAgb3BhY2l0eTogLjc1OyB0cmFuc2l0aW9uOiBvcGFjaXR5IDEyMG1zIGVhc2U7XFxyXFxufVxcclxcbi5BUFgtdG9hc3RfX2Nsb3NlOmhvdmVyIHsgb3BhY2l0eTogMTsgfVxcclxcbi5BUFgtdG9hc3RfX2Nsb3NlOmZvY3VzIHsgb3V0bGluZTogMnB4IHNvbGlkIHJnYmEoMCwwLDAsLjIpOyBvdXRsaW5lLW9mZnNldDogMnB4OyB9XFxyXFxuLkFQWC10b2FzdF9fY2xvc2U6OmJlZm9yZSB7XFxyXFxuICAgIGNvbnRlbnQ6ICfDlyc7XFxyXFxuICAgIGZvbnQtc2l6ZTogMTZweDsgbGluZS1oZWlnaHQ6IDE7IHRleHQtYWxpZ246IGNlbnRlcjtcXHJcXG59XFxyXFxuXFxyXFxuLyogQW5pbWF0aW9ucyAqL1xcclxcbi5BUFgtdG9hc3QtLWVudGVyIHsgb3BhY2l0eTogMDsgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKDhweCk7IH1cXHJcXG4uQVBYLXRvYXN0LS1lbnRlci5BUFgtdG9hc3QtLWVudGVyLWFjdGl2ZSB7IG9wYWNpdHk6IDE7IHRyYW5zZm9ybTogdHJhbnNsYXRlWSgwKTsgfVxcclxcbi5BUFgtdG9hc3QtLWV4aXQgeyBvcGFjaXR5OiAxOyB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoMCk7IH1cXHJcXG4uQVBYLXRvYXN0LS1leGl0LkFQWC10b2FzdC0tZXhpdC1hY3RpdmUgeyBvcGFjaXR5OiAwOyB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoOHB4KTsgfVxcclxcblxcclxcblxcclxcblwiXSxcInNvdXJjZVJvb3RcIjpcIlwifV0pO1xuLy8gRXhwb3J0c1xuZXhwb3J0IGRlZmF1bHQgX19fQ1NTX0xPQURFUl9FWFBPUlRfX187XG4iLCIvLyBJbXBvcnRzXG5pbXBvcnQgX19fQ1NTX0xPQURFUl9BUElfU09VUkNFTUFQX0lNUE9SVF9fXyBmcm9tIFwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL3NvdXJjZU1hcHMuanNcIjtcbmltcG9ydCBfX19DU1NfTE9BREVSX0FQSV9JTVBPUlRfX18gZnJvbSBcIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9hcGkuanNcIjtcbmltcG9ydCBfX19DU1NfTE9BREVSX0dFVF9VUkxfSU1QT1JUX19fIGZyb20gXCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L3J1bnRpbWUvZ2V0VXJsLmpzXCI7XG52YXIgX19fQ1NTX0xPQURFUl9VUkxfSU1QT1JUXzBfX18gPSBuZXcgVVJMKFwiZGF0YTppbWFnZS9zdmcreG1sLCUzQ3N2ZyUyMHhtbG5zJTNEJTI3aHR0cCUzQS8vd3d3LnczLm9yZy8yMDAwL3N2ZyUyNyUyMHdpZHRoJTNEJTI3MzIlMjclMjBoZWlnaHQlM0QlMjczMiUyNyUzRSUzQ3BhdGglMjAlMjBmaWxsJTNEJTIyJTIzY2NjY2NjJTIyJTIwZCUzRCUyMk0yNS4xMDclMjAzMi4wMzBoLTE4LjIxNGMtMy40NTYlMjAwLTYuMjY4LTIuODEtNi4yNjgtNi4yNjR2LTE5LjUyOWMwLTMuNDU2JTIwMi44MTItNi4yNjglMjA2LjI2OC02LjI2OGgxOC4yMTRjMy40NTYlMjAwJTIwNi4yNjglMjAyLjgxMiUyMDYuMjY4JTIwNi4yNjh2MTkuNTI5YzAlMjAzLjQ1Mi0yLjgxMiUyMDYuMjY0LTYuMjY4JTIwNi4yNjR6TTYuODkzJTIwMS44NWMtMi40MTklMjAwLTQuMzg2JTIwMS45NjctNC4zODYlMjA0LjM4NnYxOS41MjljMCUyMDIuNDE3JTIwMS45NjclMjA0LjM4MiUyMDQuMzg2JTIwNC4zODJoMTguMjE0YzIuNDE5JTIwMCUyMDQuMzg2LTEuOTY1JTIwNC4zODYtNC4zODJ2LTE5LjUyOWMwLTIuNDE5LTEuOTY3LTQuMzg2LTQuMzg2LTQuMzg2aC0xOC4yMTR6JTIyJTNFJTNDL3BhdGglM0UlM0Mvc3ZnJTNFXCIsIGltcG9ydC5tZXRhLnVybCk7XG52YXIgX19fQ1NTX0xPQURFUl9VUkxfSU1QT1JUXzFfX18gPSBuZXcgVVJMKFwiZGF0YTppbWFnZS9zdmcreG1sLCUzQ3N2ZyUyMHhtbG5zJTNEJTI3aHR0cCUzQS8vd3d3LnczLm9yZy8yMDAwL3N2ZyUyNyUyMHdpZHRoJTNEJTI3MzIlMjclMjBoZWlnaHQlM0QlMjczMiUyNyUzRSUzQ3BhdGglMjBmaWxsJTNEJTIyJTIzMDY1NGJhJTIyJTIwZCUzRCUyMk0wLjU0MyUyMDUuNjQ3YzAtMy4xMTklMjAyLjUzMS01LjY0NyUyMDUuNjUtNS42NDdoMTkuMzA5YzMuMTIlMjAwJTIwNS42NSUyMDIuNTExJTIwNS42NSUyMDUuNjQ3djIwLjcwNWMwJTIwMy4xMTktMi41MzElMjA1LjY0Ny01LjY1JTIwNS42NDdoLTE5LjMwOWMtMy4xMiUyMDAtNS42NS0yLjUxMS01LjY1LTUuNjQ3di0yMC43MDV6TTUuMzEzJTIwMTcuNTg3bDcuMDM5JTIwNi44MzklMjAxMy44MzEtMTMuNDM5LTIuNjM2LTIuNTYxLTEwLjkyOSUyMDEwLjYyLTQuNDQyLTQuMzE3LTIuODYyJTIwMi44NTh6JTIyJTNFJTNDL3BhdGglM0UlM0Mvc3ZnJTNFXCIsIGltcG9ydC5tZXRhLnVybCk7XG52YXIgX19fQ1NTX0xPQURFUl9VUkxfSU1QT1JUXzJfX18gPSBuZXcgVVJMKFwiZGF0YTppbWFnZS9zdmcreG1sLCUzQyUzRnhtbCUyMHZlcnNpb24lM0QlMjIxLjAlMjIlMjBlbmNvZGluZyUzRCUyMlVURi04JTIyJTNGJTNFJTNDc3ZnJTIwdmlld0JveCUzRCUyMjAlMjAwJTIwMzIlMjAzMiUyMiUyMHhtbG5zJTNEJTIyaHR0cCUzQSUyRiUyRnd3dy53My5vcmclMkYyMDAwJTJGc3ZnJTIyJTNFJTNDcGF0aCUyMGQlM0QlMjJtMC41NDMlMjA1LjY0N2MwLTMuMTE5JTIwMi41MzEtNS42NDclMjA1LjY1LTUuNjQ3aDE5LjMwOWMzLjEyJTIwMCUyMDUuNjUlMjAyLjUxMSUyMDUuNjUlMjA1LjY0N3YyMC43MDVjMCUyMDMuMTE5LTIuNTMxJTIwNS42NDctNS42NSUyMDUuNjQ3aC0xOS4zMDljLTMuMTIlMjAwLTUuNjUtMi41MTEtNS42NS01LjY0N3YtMjAuNzA1eiUyMiUyMGZpbGwlM0QlMjIlMjNmMDAlMjIlMkYlM0UlM0NwYXRoJTIwZCUzRCUyMm04JTIwOCUyMDE2JTIwMTYlMjIlMjBzdHJva2UlM0QlMjIlMjNmZmYlMjIlMjBzdHJva2Utd2lkdGglM0QlMjIyJTIyJTJGJTNFJTNDcGF0aCUyMGQlM0QlMjJNMjQlMjA4TDglMjAyNCUyMiUyMHN0cm9rZSUzRCUyMiUyM2ZmZiUyMiUyMHN0cm9rZS13aWR0aCUzRCUyMjIlMjIlMkYlM0UlM0MlMkZzdmclM0VcIiwgaW1wb3J0Lm1ldGEudXJsKTtcbnZhciBfX19DU1NfTE9BREVSX0VYUE9SVF9fXyA9IF9fX0NTU19MT0FERVJfQVBJX0lNUE9SVF9fXyhfX19DU1NfTE9BREVSX0FQSV9TT1VSQ0VNQVBfSU1QT1JUX19fKTtcbnZhciBfX19DU1NfTE9BREVSX1VSTF9SRVBMQUNFTUVOVF8wX19fID0gX19fQ1NTX0xPQURFUl9HRVRfVVJMX0lNUE9SVF9fXyhfX19DU1NfTE9BREVSX1VSTF9JTVBPUlRfMF9fXyk7XG52YXIgX19fQ1NTX0xPQURFUl9VUkxfUkVQTEFDRU1FTlRfMV9fXyA9IF9fX0NTU19MT0FERVJfR0VUX1VSTF9JTVBPUlRfX18oX19fQ1NTX0xPQURFUl9VUkxfSU1QT1JUXzFfX18pO1xudmFyIF9fX0NTU19MT0FERVJfVVJMX1JFUExBQ0VNRU5UXzJfX18gPSBfX19DU1NfTE9BREVSX0dFVF9VUkxfSU1QT1JUX19fKF9fX0NTU19MT0FERVJfVVJMX0lNUE9SVF8yX19fKTtcbi8vIE1vZHVsZVxuX19fQ1NTX0xPQURFUl9FWFBPUlRfX18ucHVzaChbbW9kdWxlLmlkLCBgLmFweC10cmlzdGF0ZSB7XHJcbiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XHJcbiAgICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO1xyXG4gICAgdGV4dC1hbGlnbjogY2VudGVyO1xyXG4gICAgY3Vyc29yOiBwb2ludGVyO1xyXG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xyXG4gICAgbWluLXdpZHRoOjEzcHg7XHJcbiAgICBtaW4taGVpZ2h0OjEzcHg7XHJcbiAgICBiYWNrZ3JvdW5kLXNpemU6IGNvbnRhaW47XHJcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTtcclxuICAgIGJvcmRlci1yYWRpdXM6M3B4O1xyXG59XHJcbi5hcHgtdHJpc3RhdGUudW5jaGVja2VkIHtcclxuICAgIGJhY2tncm91bmQtaW1hZ2U6IHVybCgke19fX0NTU19MT0FERVJfVVJMX1JFUExBQ0VNRU5UXzBfX199KTtcclxufVxyXG4uYXB4LXRyaXN0YXRlLmNoZWNrZWQge1xyXG4gICAgYmFja2dyb3VuZC1pbWFnZTogdXJsKCR7X19fQ1NTX0xPQURFUl9VUkxfUkVQTEFDRU1FTlRfMV9fX30pO1xyXG4gICAgYmFja2dyb3VuZC1yZXBlYXQ6IG5vLXJlcGVhdDtcclxuICAgIGJhY2tncm91bmQtcG9zaXRpb246IGNlbnRlcjtcclxufVxyXG4uYXB4LXRyaXN0YXRlLmNyb3NzZWQge1xyXG4gICAgYmFja2dyb3VuZC1pbWFnZTogdXJsKCR7X19fQ1NTX0xPQURFUl9VUkxfUkVQTEFDRU1FTlRfMl9fX30pO1xyXG4gICAgYmFja2dyb3VuZC1yZXBlYXQ6IG5vLXJlcGVhdDtcclxuICAgIGJhY2tncm91bmQtcG9zaXRpb246IGNlbnRlcjtcclxufWAsIFwiXCIse1widmVyc2lvblwiOjMsXCJzb3VyY2VzXCI6W1wid2VicGFjazovLy4vbW9kdWxlcy90cmlzdGF0ZS9jc3MvdHJpc3RhdGUuY3NzXCJdLFwibmFtZXNcIjpbXSxcIm1hcHBpbmdzXCI6XCJBQUFBO0lBQ0kscUJBQXFCO0lBQ3JCLHNCQUFzQjtJQUN0QixrQkFBa0I7SUFDbEIsZUFBZTtJQUNmLGtCQUFrQjtJQUNsQixjQUFjO0lBQ2QsZUFBZTtJQUNmLHdCQUF3QjtJQUN4Qix1QkFBdUI7SUFDdkIsaUJBQWlCO0FBQ3JCO0FBQ0E7SUFDSSx5REFBeWxCO0FBQzdsQjtBQUNBO0lBQ0kseURBQTZlO0lBQzdlLDRCQUE0QjtJQUM1QiwyQkFBMkI7QUFDL0I7QUFDQTtJQUNJLHlEQUFzbkI7SUFDdG5CLDRCQUE0QjtJQUM1QiwyQkFBMkI7QUFDL0JcIixcInNvdXJjZXNDb250ZW50XCI6W1wiLmFweC10cmlzdGF0ZSB7XFxyXFxuICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcXHJcXG4gICAgdmVydGljYWwtYWxpZ246IG1pZGRsZTtcXHJcXG4gICAgdGV4dC1hbGlnbjogY2VudGVyO1xcclxcbiAgICBjdXJzb3I6IHBvaW50ZXI7XFxyXFxuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcXHJcXG4gICAgbWluLXdpZHRoOjEzcHg7XFxyXFxuICAgIG1pbi1oZWlnaHQ6MTNweDtcXHJcXG4gICAgYmFja2dyb3VuZC1zaXplOiBjb250YWluO1xcclxcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTtcXHJcXG4gICAgYm9yZGVyLXJhZGl1czozcHg7XFxyXFxufVxcclxcbi5hcHgtdHJpc3RhdGUudW5jaGVja2VkIHtcXHJcXG4gICAgYmFja2dyb3VuZC1pbWFnZTogdXJsKCdkYXRhOmltYWdlL3N2Zyt4bWwsJTNDc3ZnJTIweG1sbnMlM0QlMjdodHRwJTNBLy93d3cudzMub3JnLzIwMDAvc3ZnJTI3JTIwd2lkdGglM0QlMjczMiUyNyUyMGhlaWdodCUzRCUyNzMyJTI3JTNFJTNDcGF0aCUyMCUyMGZpbGwlM0QlMjIlMjNjY2NjY2MlMjIlMjBkJTNEJTIyTTI1LjEwNyUyMDMyLjAzMGgtMTguMjE0Yy0zLjQ1NiUyMDAtNi4yNjgtMi44MS02LjI2OC02LjI2NHYtMTkuNTI5YzAtMy40NTYlMjAyLjgxMi02LjI2OCUyMDYuMjY4LTYuMjY4aDE4LjIxNGMzLjQ1NiUyMDAlMjA2LjI2OCUyMDIuODEyJTIwNi4yNjglMjA2LjI2OHYxOS41MjljMCUyMDMuNDUyLTIuODEyJTIwNi4yNjQtNi4yNjglMjA2LjI2NHpNNi44OTMlMjAxLjg1Yy0yLjQxOSUyMDAtNC4zODYlMjAxLjk2Ny00LjM4NiUyMDQuMzg2djE5LjUyOWMwJTIwMi40MTclMjAxLjk2NyUyMDQuMzgyJTIwNC4zODYlMjA0LjM4MmgxOC4yMTRjMi40MTklMjAwJTIwNC4zODYtMS45NjUlMjA0LjM4Ni00LjM4MnYtMTkuNTI5YzAtMi40MTktMS45NjctNC4zODYtNC4zODYtNC4zODZoLTE4LjIxNHolMjIlM0UlM0MvcGF0aCUzRSUzQy9zdmclM0UnKTtcXHJcXG59XFxyXFxuLmFweC10cmlzdGF0ZS5jaGVja2VkIHtcXHJcXG4gICAgYmFja2dyb3VuZC1pbWFnZTogdXJsKCdkYXRhOmltYWdlL3N2Zyt4bWwsJTNDc3ZnJTIweG1sbnMlM0QlMjdodHRwJTNBLy93d3cudzMub3JnLzIwMDAvc3ZnJTI3JTIwd2lkdGglM0QlMjczMiUyNyUyMGhlaWdodCUzRCUyNzMyJTI3JTNFJTNDcGF0aCUyMGZpbGwlM0QlMjIlMjMwNjU0YmElMjIlMjBkJTNEJTIyTTAuNTQzJTIwNS42NDdjMC0zLjExOSUyMDIuNTMxLTUuNjQ3JTIwNS42NS01LjY0N2gxOS4zMDljMy4xMiUyMDAlMjA1LjY1JTIwMi41MTElMjA1LjY1JTIwNS42NDd2MjAuNzA1YzAlMjAzLjExOS0yLjUzMSUyMDUuNjQ3LTUuNjUlMjA1LjY0N2gtMTkuMzA5Yy0zLjEyJTIwMC01LjY1LTIuNTExLTUuNjUtNS42NDd2LTIwLjcwNXpNNS4zMTMlMjAxNy41ODdsNy4wMzklMjA2LjgzOSUyMDEzLjgzMS0xMy40MzktMi42MzYtMi41NjEtMTAuOTI5JTIwMTAuNjItNC40NDItNC4zMTctMi44NjIlMjAyLjg1OHolMjIlM0UlM0MvcGF0aCUzRSUzQy9zdmclM0UnKTtcXHJcXG4gICAgYmFja2dyb3VuZC1yZXBlYXQ6IG5vLXJlcGVhdDtcXHJcXG4gICAgYmFja2dyb3VuZC1wb3NpdGlvbjogY2VudGVyO1xcclxcbn1cXHJcXG4uYXB4LXRyaXN0YXRlLmNyb3NzZWQge1xcclxcbiAgICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoJ2RhdGE6aW1hZ2Uvc3ZnK3htbCwlM0MlM0Z4bWwlMjB2ZXJzaW9uJTNEJTIyMS4wJTIyJTIwZW5jb2RpbmclM0QlMjJVVEYtOCUyMiUzRiUzRSUzQ3N2ZyUyMHZpZXdCb3glM0QlMjIwJTIwMCUyMDMyJTIwMzIlMjIlMjB4bWxucyUzRCUyMmh0dHAlM0ElMkYlMkZ3d3cudzMub3JnJTJGMjAwMCUyRnN2ZyUyMiUzRSUzQ3BhdGglMjBkJTNEJTIybTAuNTQzJTIwNS42NDdjMC0zLjExOSUyMDIuNTMxLTUuNjQ3JTIwNS42NS01LjY0N2gxOS4zMDljMy4xMiUyMDAlMjA1LjY1JTIwMi41MTElMjA1LjY1JTIwNS42NDd2MjAuNzA1YzAlMjAzLjExOS0yLjUzMSUyMDUuNjQ3LTUuNjUlMjA1LjY0N2gtMTkuMzA5Yy0zLjEyJTIwMC01LjY1LTIuNTExLTUuNjUtNS42NDd2LTIwLjcwNXolMjIlMjBmaWxsJTNEJTIyJTIzZjAwJTIyJTJGJTNFJTNDcGF0aCUyMGQlM0QlMjJtOCUyMDglMjAxNiUyMDE2JTIyJTIwc3Ryb2tlJTNEJTIyJTIzZmZmJTIyJTIwc3Ryb2tlLXdpZHRoJTNEJTIyMiUyMiUyRiUzRSUzQ3BhdGglMjBkJTNEJTIyTTI0JTIwOEw4JTIwMjQlMjIlMjBzdHJva2UlM0QlMjIlMjNmZmYlMjIlMjBzdHJva2Utd2lkdGglM0QlMjIyJTIyJTJGJTNFJTNDJTJGc3ZnJTNFJyk7XFxyXFxuICAgIGJhY2tncm91bmQtcmVwZWF0OiBuby1yZXBlYXQ7XFxyXFxuICAgIGJhY2tncm91bmQtcG9zaXRpb246IGNlbnRlcjtcXHJcXG59XCJdLFwic291cmNlUm9vdFwiOlwiXCJ9XSk7XG4vLyBFeHBvcnRzXG5leHBvcnQgZGVmYXVsdCBfX19DU1NfTE9BREVSX0VYUE9SVF9fXztcbiIsIlwidXNlIHN0cmljdFwiO1xuXG4vKlxuICBNSVQgTGljZW5zZSBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL21pdC1saWNlbnNlLnBocFxuICBBdXRob3IgVG9iaWFzIEtvcHBlcnMgQHNva3JhXG4qL1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoY3NzV2l0aE1hcHBpbmdUb1N0cmluZykge1xuICB2YXIgbGlzdCA9IFtdO1xuXG4gIC8vIHJldHVybiB0aGUgbGlzdCBvZiBtb2R1bGVzIGFzIGNzcyBzdHJpbmdcbiAgbGlzdC50b1N0cmluZyA9IGZ1bmN0aW9uIHRvU3RyaW5nKCkge1xuICAgIHJldHVybiB0aGlzLm1hcChmdW5jdGlvbiAoaXRlbSkge1xuICAgICAgdmFyIGNvbnRlbnQgPSBcIlwiO1xuICAgICAgdmFyIG5lZWRMYXllciA9IHR5cGVvZiBpdGVtWzVdICE9PSBcInVuZGVmaW5lZFwiO1xuICAgICAgaWYgKGl0ZW1bNF0pIHtcbiAgICAgICAgY29udGVudCArPSBcIkBzdXBwb3J0cyAoXCIuY29uY2F0KGl0ZW1bNF0sIFwiKSB7XCIpO1xuICAgICAgfVxuICAgICAgaWYgKGl0ZW1bMl0pIHtcbiAgICAgICAgY29udGVudCArPSBcIkBtZWRpYSBcIi5jb25jYXQoaXRlbVsyXSwgXCIge1wiKTtcbiAgICAgIH1cbiAgICAgIGlmIChuZWVkTGF5ZXIpIHtcbiAgICAgICAgY29udGVudCArPSBcIkBsYXllclwiLmNvbmNhdChpdGVtWzVdLmxlbmd0aCA+IDAgPyBcIiBcIi5jb25jYXQoaXRlbVs1XSkgOiBcIlwiLCBcIiB7XCIpO1xuICAgICAgfVxuICAgICAgY29udGVudCArPSBjc3NXaXRoTWFwcGluZ1RvU3RyaW5nKGl0ZW0pO1xuICAgICAgaWYgKG5lZWRMYXllcikge1xuICAgICAgICBjb250ZW50ICs9IFwifVwiO1xuICAgICAgfVxuICAgICAgaWYgKGl0ZW1bMl0pIHtcbiAgICAgICAgY29udGVudCArPSBcIn1cIjtcbiAgICAgIH1cbiAgICAgIGlmIChpdGVtWzRdKSB7XG4gICAgICAgIGNvbnRlbnQgKz0gXCJ9XCI7XG4gICAgICB9XG4gICAgICByZXR1cm4gY29udGVudDtcbiAgICB9KS5qb2luKFwiXCIpO1xuICB9O1xuXG4gIC8vIGltcG9ydCBhIGxpc3Qgb2YgbW9kdWxlcyBpbnRvIHRoZSBsaXN0XG4gIGxpc3QuaSA9IGZ1bmN0aW9uIGkobW9kdWxlcywgbWVkaWEsIGRlZHVwZSwgc3VwcG9ydHMsIGxheWVyKSB7XG4gICAgaWYgKHR5cGVvZiBtb2R1bGVzID09PSBcInN0cmluZ1wiKSB7XG4gICAgICBtb2R1bGVzID0gW1tudWxsLCBtb2R1bGVzLCB1bmRlZmluZWRdXTtcbiAgICB9XG4gICAgdmFyIGFscmVhZHlJbXBvcnRlZE1vZHVsZXMgPSB7fTtcbiAgICBpZiAoZGVkdXBlKSB7XG4gICAgICBmb3IgKHZhciBrID0gMDsgayA8IHRoaXMubGVuZ3RoOyBrKyspIHtcbiAgICAgICAgdmFyIGlkID0gdGhpc1trXVswXTtcbiAgICAgICAgaWYgKGlkICE9IG51bGwpIHtcbiAgICAgICAgICBhbHJlYWR5SW1wb3J0ZWRNb2R1bGVzW2lkXSA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgZm9yICh2YXIgX2sgPSAwOyBfayA8IG1vZHVsZXMubGVuZ3RoOyBfaysrKSB7XG4gICAgICB2YXIgaXRlbSA9IFtdLmNvbmNhdChtb2R1bGVzW19rXSk7XG4gICAgICBpZiAoZGVkdXBlICYmIGFscmVhZHlJbXBvcnRlZE1vZHVsZXNbaXRlbVswXV0pIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBpZiAodHlwZW9mIGxheWVyICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgIGlmICh0eXBlb2YgaXRlbVs1XSA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICAgIGl0ZW1bNV0gPSBsYXllcjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpdGVtWzFdID0gXCJAbGF5ZXJcIi5jb25jYXQoaXRlbVs1XS5sZW5ndGggPiAwID8gXCIgXCIuY29uY2F0KGl0ZW1bNV0pIDogXCJcIiwgXCIge1wiKS5jb25jYXQoaXRlbVsxXSwgXCJ9XCIpO1xuICAgICAgICAgIGl0ZW1bNV0gPSBsYXllcjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKG1lZGlhKSB7XG4gICAgICAgIGlmICghaXRlbVsyXSkge1xuICAgICAgICAgIGl0ZW1bMl0gPSBtZWRpYTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpdGVtWzFdID0gXCJAbWVkaWEgXCIuY29uY2F0KGl0ZW1bMl0sIFwiIHtcIikuY29uY2F0KGl0ZW1bMV0sIFwifVwiKTtcbiAgICAgICAgICBpdGVtWzJdID0gbWVkaWE7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChzdXBwb3J0cykge1xuICAgICAgICBpZiAoIWl0ZW1bNF0pIHtcbiAgICAgICAgICBpdGVtWzRdID0gXCJcIi5jb25jYXQoc3VwcG9ydHMpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGl0ZW1bMV0gPSBcIkBzdXBwb3J0cyAoXCIuY29uY2F0KGl0ZW1bNF0sIFwiKSB7XCIpLmNvbmNhdChpdGVtWzFdLCBcIn1cIik7XG4gICAgICAgICAgaXRlbVs0XSA9IHN1cHBvcnRzO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBsaXN0LnB1c2goaXRlbSk7XG4gICAgfVxuICB9O1xuICByZXR1cm4gbGlzdDtcbn07IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKHVybCwgb3B0aW9ucykge1xuICBpZiAoIW9wdGlvbnMpIHtcbiAgICBvcHRpb25zID0ge307XG4gIH1cbiAgaWYgKCF1cmwpIHtcbiAgICByZXR1cm4gdXJsO1xuICB9XG4gIHVybCA9IFN0cmluZyh1cmwuX19lc01vZHVsZSA/IHVybC5kZWZhdWx0IDogdXJsKTtcblxuICAvLyBJZiB1cmwgaXMgYWxyZWFkeSB3cmFwcGVkIGluIHF1b3RlcywgcmVtb3ZlIHRoZW1cbiAgaWYgKC9eWydcIl0uKlsnXCJdJC8udGVzdCh1cmwpKSB7XG4gICAgdXJsID0gdXJsLnNsaWNlKDEsIC0xKTtcbiAgfVxuICBpZiAob3B0aW9ucy5oYXNoKSB7XG4gICAgdXJsICs9IG9wdGlvbnMuaGFzaDtcbiAgfVxuXG4gIC8vIFNob3VsZCB1cmwgYmUgd3JhcHBlZD9cbiAgLy8gU2VlIGh0dHBzOi8vZHJhZnRzLmNzc3dnLm9yZy9jc3MtdmFsdWVzLTMvI3VybHNcbiAgaWYgKC9bXCInKCkgXFx0XFxuXXwoJTIwKS8udGVzdCh1cmwpIHx8IG9wdGlvbnMubmVlZFF1b3Rlcykge1xuICAgIHJldHVybiBcIlxcXCJcIi5jb25jYXQodXJsLnJlcGxhY2UoL1wiL2csICdcXFxcXCInKS5yZXBsYWNlKC9cXG4vZywgXCJcXFxcblwiKSwgXCJcXFwiXCIpO1xuICB9XG4gIHJldHVybiB1cmw7XG59OyIsIlwidXNlIHN0cmljdFwiO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdGVtKSB7XG4gIHZhciBjb250ZW50ID0gaXRlbVsxXTtcbiAgdmFyIGNzc01hcHBpbmcgPSBpdGVtWzNdO1xuICBpZiAoIWNzc01hcHBpbmcpIHtcbiAgICByZXR1cm4gY29udGVudDtcbiAgfVxuICBpZiAodHlwZW9mIGJ0b2EgPT09IFwiZnVuY3Rpb25cIikge1xuICAgIHZhciBiYXNlNjQgPSBidG9hKHVuZXNjYXBlKGVuY29kZVVSSUNvbXBvbmVudChKU09OLnN0cmluZ2lmeShjc3NNYXBwaW5nKSkpKTtcbiAgICB2YXIgZGF0YSA9IFwic291cmNlTWFwcGluZ1VSTD1kYXRhOmFwcGxpY2F0aW9uL2pzb247Y2hhcnNldD11dGYtODtiYXNlNjQsXCIuY29uY2F0KGJhc2U2NCk7XG4gICAgdmFyIHNvdXJjZU1hcHBpbmcgPSBcIi8qIyBcIi5jb25jYXQoZGF0YSwgXCIgKi9cIik7XG4gICAgcmV0dXJuIFtjb250ZW50XS5jb25jYXQoW3NvdXJjZU1hcHBpbmddKS5qb2luKFwiXFxuXCIpO1xuICB9XG4gIHJldHVybiBbY29udGVudF0uam9pbihcIlxcblwiKTtcbn07IiwiLy8gTW9kdWxlXG52YXIgY29kZSA9IFwiPGRpdiBjbGFzcz1cXFwiQVBYLWRpYWxvZ1xcXCI+XFxyXFxuICAgIDxkaXYgY2xhc3M9XFxcIkFQWC1kaWFsb2ctY29udGVudFxcXCI+XFxyXFxuICAgICAgICA8c3BhbiBjbGFzcz1cXFwiQVBYLWNsb3NlLWRpYWxvZ1xcXCI+JnRpbWVzOzwvc3Bhbj5cXHJcXG4gICAgICAgIDxoMiBjbGFzcz1cXFwiQVBYLWRpYWxvZy10aXRsZVxcXCI+PC9oMj5cXHJcXG4gICAgICAgIDxkaXYgY2xhc3M9XFxcIkFQWC1kaWFsb2ctZHluYW1pYy1jb250ZW50XFxcIj48L2Rpdj5cXHJcXG4gICAgICAgIDxkaXYgY2xhc3M9XFxcIkFQWC1kaWFsb2ctYnV0dG9uLWNvbnRhaW5lclxcXCI+PC9kaXY+XFxyXFxuICAgIDwvZGl2PlxcclxcbjwvZGl2PlwiO1xuLy8gRXhwb3J0c1xubW9kdWxlLmV4cG9ydHMgPSBjb2RlOyIsIlxuICAgICAgaW1wb3J0IEFQSSBmcm9tIFwiIS4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luamVjdFN0eWxlc0ludG9TdHlsZVRhZy5qc1wiO1xuICAgICAgaW1wb3J0IGRvbUFQSSBmcm9tIFwiIS4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL3N0eWxlRG9tQVBJLmpzXCI7XG4gICAgICBpbXBvcnQgaW5zZXJ0Rm4gZnJvbSBcIiEuLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbnNlcnRCeVNlbGVjdG9yLmpzXCI7XG4gICAgICBpbXBvcnQgc2V0QXR0cmlidXRlcyBmcm9tIFwiIS4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL3NldEF0dHJpYnV0ZXNXaXRob3V0QXR0cmlidXRlcy5qc1wiO1xuICAgICAgaW1wb3J0IGluc2VydFN0eWxlRWxlbWVudCBmcm9tIFwiIS4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luc2VydFN0eWxlRWxlbWVudC5qc1wiO1xuICAgICAgaW1wb3J0IHN0eWxlVGFnVHJhbnNmb3JtRm4gZnJvbSBcIiEuLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9zdHlsZVRhZ1RyYW5zZm9ybS5qc1wiO1xuICAgICAgaW1wb3J0IGNvbnRlbnQsICogYXMgbmFtZWRFeHBvcnQgZnJvbSBcIiEhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9janMuanMhLi9kaWFsb2cuY3NzXCI7XG4gICAgICBcbiAgICAgIFxuXG52YXIgb3B0aW9ucyA9IHt9O1xuXG5vcHRpb25zLnN0eWxlVGFnVHJhbnNmb3JtID0gc3R5bGVUYWdUcmFuc2Zvcm1Gbjtcbm9wdGlvbnMuc2V0QXR0cmlidXRlcyA9IHNldEF0dHJpYnV0ZXM7XG5cbiAgICAgIG9wdGlvbnMuaW5zZXJ0ID0gaW5zZXJ0Rm4uYmluZChudWxsLCBcImhlYWRcIik7XG4gICAgXG5vcHRpb25zLmRvbUFQSSA9IGRvbUFQSTtcbm9wdGlvbnMuaW5zZXJ0U3R5bGVFbGVtZW50ID0gaW5zZXJ0U3R5bGVFbGVtZW50O1xuXG52YXIgdXBkYXRlID0gQVBJKGNvbnRlbnQsIG9wdGlvbnMpO1xuXG5cblxuZXhwb3J0ICogZnJvbSBcIiEhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9janMuanMhLi9kaWFsb2cuY3NzXCI7XG4gICAgICAgZXhwb3J0IGRlZmF1bHQgY29udGVudCAmJiBjb250ZW50LmxvY2FscyA/IGNvbnRlbnQubG9jYWxzIDogdW5kZWZpbmVkO1xuIiwiXG4gICAgICBpbXBvcnQgQVBJIGZyb20gXCIhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5qZWN0U3R5bGVzSW50b1N0eWxlVGFnLmpzXCI7XG4gICAgICBpbXBvcnQgZG9tQVBJIGZyb20gXCIhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvc3R5bGVEb21BUEkuanNcIjtcbiAgICAgIGltcG9ydCBpbnNlcnRGbiBmcm9tIFwiIS4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luc2VydEJ5U2VsZWN0b3IuanNcIjtcbiAgICAgIGltcG9ydCBzZXRBdHRyaWJ1dGVzIGZyb20gXCIhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvc2V0QXR0cmlidXRlc1dpdGhvdXRBdHRyaWJ1dGVzLmpzXCI7XG4gICAgICBpbXBvcnQgaW5zZXJ0U3R5bGVFbGVtZW50IGZyb20gXCIhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5zZXJ0U3R5bGVFbGVtZW50LmpzXCI7XG4gICAgICBpbXBvcnQgc3R5bGVUYWdUcmFuc2Zvcm1GbiBmcm9tIFwiIS4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL3N0eWxlVGFnVHJhbnNmb3JtLmpzXCI7XG4gICAgICBpbXBvcnQgY29udGVudCwgKiBhcyBuYW1lZEV4cG9ydCBmcm9tIFwiISEuLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L2Nqcy5qcyEuL3RvYXN0LmNzc1wiO1xuICAgICAgXG4gICAgICBcblxudmFyIG9wdGlvbnMgPSB7fTtcblxub3B0aW9ucy5zdHlsZVRhZ1RyYW5zZm9ybSA9IHN0eWxlVGFnVHJhbnNmb3JtRm47XG5vcHRpb25zLnNldEF0dHJpYnV0ZXMgPSBzZXRBdHRyaWJ1dGVzO1xuXG4gICAgICBvcHRpb25zLmluc2VydCA9IGluc2VydEZuLmJpbmQobnVsbCwgXCJoZWFkXCIpO1xuICAgIFxub3B0aW9ucy5kb21BUEkgPSBkb21BUEk7XG5vcHRpb25zLmluc2VydFN0eWxlRWxlbWVudCA9IGluc2VydFN0eWxlRWxlbWVudDtcblxudmFyIHVwZGF0ZSA9IEFQSShjb250ZW50LCBvcHRpb25zKTtcblxuXG5cbmV4cG9ydCAqIGZyb20gXCIhIS4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvY2pzLmpzIS4vdG9hc3QuY3NzXCI7XG4gICAgICAgZXhwb3J0IGRlZmF1bHQgY29udGVudCAmJiBjb250ZW50LmxvY2FscyA/IGNvbnRlbnQubG9jYWxzIDogdW5kZWZpbmVkO1xuIiwiXG4gICAgICBpbXBvcnQgQVBJIGZyb20gXCIhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5qZWN0U3R5bGVzSW50b1N0eWxlVGFnLmpzXCI7XG4gICAgICBpbXBvcnQgZG9tQVBJIGZyb20gXCIhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvc3R5bGVEb21BUEkuanNcIjtcbiAgICAgIGltcG9ydCBpbnNlcnRGbiBmcm9tIFwiIS4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luc2VydEJ5U2VsZWN0b3IuanNcIjtcbiAgICAgIGltcG9ydCBzZXRBdHRyaWJ1dGVzIGZyb20gXCIhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvc2V0QXR0cmlidXRlc1dpdGhvdXRBdHRyaWJ1dGVzLmpzXCI7XG4gICAgICBpbXBvcnQgaW5zZXJ0U3R5bGVFbGVtZW50IGZyb20gXCIhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5zZXJ0U3R5bGVFbGVtZW50LmpzXCI7XG4gICAgICBpbXBvcnQgc3R5bGVUYWdUcmFuc2Zvcm1GbiBmcm9tIFwiIS4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL3N0eWxlVGFnVHJhbnNmb3JtLmpzXCI7XG4gICAgICBpbXBvcnQgY29udGVudCwgKiBhcyBuYW1lZEV4cG9ydCBmcm9tIFwiISEuLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L2Nqcy5qcyEuL3RyaXN0YXRlLmNzc1wiO1xuICAgICAgXG4gICAgICBcblxudmFyIG9wdGlvbnMgPSB7fTtcblxub3B0aW9ucy5zdHlsZVRhZ1RyYW5zZm9ybSA9IHN0eWxlVGFnVHJhbnNmb3JtRm47XG5vcHRpb25zLnNldEF0dHJpYnV0ZXMgPSBzZXRBdHRyaWJ1dGVzO1xuXG4gICAgICBvcHRpb25zLmluc2VydCA9IGluc2VydEZuLmJpbmQobnVsbCwgXCJoZWFkXCIpO1xuICAgIFxub3B0aW9ucy5kb21BUEkgPSBkb21BUEk7XG5vcHRpb25zLmluc2VydFN0eWxlRWxlbWVudCA9IGluc2VydFN0eWxlRWxlbWVudDtcblxudmFyIHVwZGF0ZSA9IEFQSShjb250ZW50LCBvcHRpb25zKTtcblxuXG5cbmV4cG9ydCAqIGZyb20gXCIhIS4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvY2pzLmpzIS4vdHJpc3RhdGUuY3NzXCI7XG4gICAgICAgZXhwb3J0IGRlZmF1bHQgY29udGVudCAmJiBjb250ZW50LmxvY2FscyA/IGNvbnRlbnQubG9jYWxzIDogdW5kZWZpbmVkO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBzdHlsZXNJbkRPTSA9IFtdO1xuZnVuY3Rpb24gZ2V0SW5kZXhCeUlkZW50aWZpZXIoaWRlbnRpZmllcikge1xuICB2YXIgcmVzdWx0ID0gLTE7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgc3R5bGVzSW5ET00ubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoc3R5bGVzSW5ET01baV0uaWRlbnRpZmllciA9PT0gaWRlbnRpZmllcikge1xuICAgICAgcmVzdWx0ID0gaTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuZnVuY3Rpb24gbW9kdWxlc1RvRG9tKGxpc3QsIG9wdGlvbnMpIHtcbiAgdmFyIGlkQ291bnRNYXAgPSB7fTtcbiAgdmFyIGlkZW50aWZpZXJzID0gW107XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGlzdC5sZW5ndGg7IGkrKykge1xuICAgIHZhciBpdGVtID0gbGlzdFtpXTtcbiAgICB2YXIgaWQgPSBvcHRpb25zLmJhc2UgPyBpdGVtWzBdICsgb3B0aW9ucy5iYXNlIDogaXRlbVswXTtcbiAgICB2YXIgY291bnQgPSBpZENvdW50TWFwW2lkXSB8fCAwO1xuICAgIHZhciBpZGVudGlmaWVyID0gXCJcIi5jb25jYXQoaWQsIFwiIFwiKS5jb25jYXQoY291bnQpO1xuICAgIGlkQ291bnRNYXBbaWRdID0gY291bnQgKyAxO1xuICAgIHZhciBpbmRleEJ5SWRlbnRpZmllciA9IGdldEluZGV4QnlJZGVudGlmaWVyKGlkZW50aWZpZXIpO1xuICAgIHZhciBvYmogPSB7XG4gICAgICBjc3M6IGl0ZW1bMV0sXG4gICAgICBtZWRpYTogaXRlbVsyXSxcbiAgICAgIHNvdXJjZU1hcDogaXRlbVszXSxcbiAgICAgIHN1cHBvcnRzOiBpdGVtWzRdLFxuICAgICAgbGF5ZXI6IGl0ZW1bNV1cbiAgICB9O1xuICAgIGlmIChpbmRleEJ5SWRlbnRpZmllciAhPT0gLTEpIHtcbiAgICAgIHN0eWxlc0luRE9NW2luZGV4QnlJZGVudGlmaWVyXS5yZWZlcmVuY2VzKys7XG4gICAgICBzdHlsZXNJbkRPTVtpbmRleEJ5SWRlbnRpZmllcl0udXBkYXRlcihvYmopO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgdXBkYXRlciA9IGFkZEVsZW1lbnRTdHlsZShvYmosIG9wdGlvbnMpO1xuICAgICAgb3B0aW9ucy5ieUluZGV4ID0gaTtcbiAgICAgIHN0eWxlc0luRE9NLnNwbGljZShpLCAwLCB7XG4gICAgICAgIGlkZW50aWZpZXI6IGlkZW50aWZpZXIsXG4gICAgICAgIHVwZGF0ZXI6IHVwZGF0ZXIsXG4gICAgICAgIHJlZmVyZW5jZXM6IDFcbiAgICAgIH0pO1xuICAgIH1cbiAgICBpZGVudGlmaWVycy5wdXNoKGlkZW50aWZpZXIpO1xuICB9XG4gIHJldHVybiBpZGVudGlmaWVycztcbn1cbmZ1bmN0aW9uIGFkZEVsZW1lbnRTdHlsZShvYmosIG9wdGlvbnMpIHtcbiAgdmFyIGFwaSA9IG9wdGlvbnMuZG9tQVBJKG9wdGlvbnMpO1xuICBhcGkudXBkYXRlKG9iaik7XG4gIHZhciB1cGRhdGVyID0gZnVuY3Rpb24gdXBkYXRlcihuZXdPYmopIHtcbiAgICBpZiAobmV3T2JqKSB7XG4gICAgICBpZiAobmV3T2JqLmNzcyA9PT0gb2JqLmNzcyAmJiBuZXdPYmoubWVkaWEgPT09IG9iai5tZWRpYSAmJiBuZXdPYmouc291cmNlTWFwID09PSBvYmouc291cmNlTWFwICYmIG5ld09iai5zdXBwb3J0cyA9PT0gb2JqLnN1cHBvcnRzICYmIG5ld09iai5sYXllciA9PT0gb2JqLmxheWVyKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGFwaS51cGRhdGUob2JqID0gbmV3T2JqKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYXBpLnJlbW92ZSgpO1xuICAgIH1cbiAgfTtcbiAgcmV0dXJuIHVwZGF0ZXI7XG59XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChsaXN0LCBvcHRpb25zKSB7XG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICBsaXN0ID0gbGlzdCB8fCBbXTtcbiAgdmFyIGxhc3RJZGVudGlmaWVycyA9IG1vZHVsZXNUb0RvbShsaXN0LCBvcHRpb25zKTtcbiAgcmV0dXJuIGZ1bmN0aW9uIHVwZGF0ZShuZXdMaXN0KSB7XG4gICAgbmV3TGlzdCA9IG5ld0xpc3QgfHwgW107XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsYXN0SWRlbnRpZmllcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBpZGVudGlmaWVyID0gbGFzdElkZW50aWZpZXJzW2ldO1xuICAgICAgdmFyIGluZGV4ID0gZ2V0SW5kZXhCeUlkZW50aWZpZXIoaWRlbnRpZmllcik7XG4gICAgICBzdHlsZXNJbkRPTVtpbmRleF0ucmVmZXJlbmNlcy0tO1xuICAgIH1cbiAgICB2YXIgbmV3TGFzdElkZW50aWZpZXJzID0gbW9kdWxlc1RvRG9tKG5ld0xpc3QsIG9wdGlvbnMpO1xuICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBsYXN0SWRlbnRpZmllcnMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICB2YXIgX2lkZW50aWZpZXIgPSBsYXN0SWRlbnRpZmllcnNbX2ldO1xuICAgICAgdmFyIF9pbmRleCA9IGdldEluZGV4QnlJZGVudGlmaWVyKF9pZGVudGlmaWVyKTtcbiAgICAgIGlmIChzdHlsZXNJbkRPTVtfaW5kZXhdLnJlZmVyZW5jZXMgPT09IDApIHtcbiAgICAgICAgc3R5bGVzSW5ET01bX2luZGV4XS51cGRhdGVyKCk7XG4gICAgICAgIHN0eWxlc0luRE9NLnNwbGljZShfaW5kZXgsIDEpO1xuICAgICAgfVxuICAgIH1cbiAgICBsYXN0SWRlbnRpZmllcnMgPSBuZXdMYXN0SWRlbnRpZmllcnM7XG4gIH07XG59OyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgbWVtbyA9IHt9O1xuXG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAgKi9cbmZ1bmN0aW9uIGdldFRhcmdldCh0YXJnZXQpIHtcbiAgaWYgKHR5cGVvZiBtZW1vW3RhcmdldF0gPT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICB2YXIgc3R5bGVUYXJnZXQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKHRhcmdldCk7XG5cbiAgICAvLyBTcGVjaWFsIGNhc2UgdG8gcmV0dXJuIGhlYWQgb2YgaWZyYW1lIGluc3RlYWQgb2YgaWZyYW1lIGl0c2VsZlxuICAgIGlmICh3aW5kb3cuSFRNTElGcmFtZUVsZW1lbnQgJiYgc3R5bGVUYXJnZXQgaW5zdGFuY2VvZiB3aW5kb3cuSFRNTElGcmFtZUVsZW1lbnQpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIC8vIFRoaXMgd2lsbCB0aHJvdyBhbiBleGNlcHRpb24gaWYgYWNjZXNzIHRvIGlmcmFtZSBpcyBibG9ja2VkXG4gICAgICAgIC8vIGR1ZSB0byBjcm9zcy1vcmlnaW4gcmVzdHJpY3Rpb25zXG4gICAgICAgIHN0eWxlVGFyZ2V0ID0gc3R5bGVUYXJnZXQuY29udGVudERvY3VtZW50LmhlYWQ7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIC8vIGlzdGFuYnVsIGlnbm9yZSBuZXh0XG4gICAgICAgIHN0eWxlVGFyZ2V0ID0gbnVsbDtcbiAgICAgIH1cbiAgICB9XG4gICAgbWVtb1t0YXJnZXRdID0gc3R5bGVUYXJnZXQ7XG4gIH1cbiAgcmV0dXJuIG1lbW9bdGFyZ2V0XTtcbn1cblxuLyogaXN0YW5idWwgaWdub3JlIG5leHQgICovXG5mdW5jdGlvbiBpbnNlcnRCeVNlbGVjdG9yKGluc2VydCwgc3R5bGUpIHtcbiAgdmFyIHRhcmdldCA9IGdldFRhcmdldChpbnNlcnQpO1xuICBpZiAoIXRhcmdldCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIkNvdWxkbid0IGZpbmQgYSBzdHlsZSB0YXJnZXQuIFRoaXMgcHJvYmFibHkgbWVhbnMgdGhhdCB0aGUgdmFsdWUgZm9yIHRoZSAnaW5zZXJ0JyBwYXJhbWV0ZXIgaXMgaW52YWxpZC5cIik7XG4gIH1cbiAgdGFyZ2V0LmFwcGVuZENoaWxkKHN0eWxlKTtcbn1cbm1vZHVsZS5leHBvcnRzID0gaW5zZXJ0QnlTZWxlY3RvcjsiLCJcInVzZSBzdHJpY3RcIjtcblxuLyogaXN0YW5idWwgaWdub3JlIG5leHQgICovXG5mdW5jdGlvbiBpbnNlcnRTdHlsZUVsZW1lbnQob3B0aW9ucykge1xuICB2YXIgZWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzdHlsZVwiKTtcbiAgb3B0aW9ucy5zZXRBdHRyaWJ1dGVzKGVsZW1lbnQsIG9wdGlvbnMuYXR0cmlidXRlcyk7XG4gIG9wdGlvbnMuaW5zZXJ0KGVsZW1lbnQsIG9wdGlvbnMub3B0aW9ucyk7XG4gIHJldHVybiBlbGVtZW50O1xufVxubW9kdWxlLmV4cG9ydHMgPSBpbnNlcnRTdHlsZUVsZW1lbnQ7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICAqL1xuZnVuY3Rpb24gc2V0QXR0cmlidXRlc1dpdGhvdXRBdHRyaWJ1dGVzKHN0eWxlRWxlbWVudCkge1xuICB2YXIgbm9uY2UgPSB0eXBlb2YgX193ZWJwYWNrX25vbmNlX18gIT09IFwidW5kZWZpbmVkXCIgPyBfX3dlYnBhY2tfbm9uY2VfXyA6IG51bGw7XG4gIGlmIChub25jZSkge1xuICAgIHN0eWxlRWxlbWVudC5zZXRBdHRyaWJ1dGUoXCJub25jZVwiLCBub25jZSk7XG4gIH1cbn1cbm1vZHVsZS5leHBvcnRzID0gc2V0QXR0cmlidXRlc1dpdGhvdXRBdHRyaWJ1dGVzOyIsIlwidXNlIHN0cmljdFwiO1xuXG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAgKi9cbmZ1bmN0aW9uIGFwcGx5KHN0eWxlRWxlbWVudCwgb3B0aW9ucywgb2JqKSB7XG4gIHZhciBjc3MgPSBcIlwiO1xuICBpZiAob2JqLnN1cHBvcnRzKSB7XG4gICAgY3NzICs9IFwiQHN1cHBvcnRzIChcIi5jb25jYXQob2JqLnN1cHBvcnRzLCBcIikge1wiKTtcbiAgfVxuICBpZiAob2JqLm1lZGlhKSB7XG4gICAgY3NzICs9IFwiQG1lZGlhIFwiLmNvbmNhdChvYmoubWVkaWEsIFwiIHtcIik7XG4gIH1cbiAgdmFyIG5lZWRMYXllciA9IHR5cGVvZiBvYmoubGF5ZXIgIT09IFwidW5kZWZpbmVkXCI7XG4gIGlmIChuZWVkTGF5ZXIpIHtcbiAgICBjc3MgKz0gXCJAbGF5ZXJcIi5jb25jYXQob2JqLmxheWVyLmxlbmd0aCA+IDAgPyBcIiBcIi5jb25jYXQob2JqLmxheWVyKSA6IFwiXCIsIFwiIHtcIik7XG4gIH1cbiAgY3NzICs9IG9iai5jc3M7XG4gIGlmIChuZWVkTGF5ZXIpIHtcbiAgICBjc3MgKz0gXCJ9XCI7XG4gIH1cbiAgaWYgKG9iai5tZWRpYSkge1xuICAgIGNzcyArPSBcIn1cIjtcbiAgfVxuICBpZiAob2JqLnN1cHBvcnRzKSB7XG4gICAgY3NzICs9IFwifVwiO1xuICB9XG4gIHZhciBzb3VyY2VNYXAgPSBvYmouc291cmNlTWFwO1xuICBpZiAoc291cmNlTWFwICYmIHR5cGVvZiBidG9hICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgY3NzICs9IFwiXFxuLyojIHNvdXJjZU1hcHBpbmdVUkw9ZGF0YTphcHBsaWNhdGlvbi9qc29uO2Jhc2U2NCxcIi5jb25jYXQoYnRvYSh1bmVzY2FwZShlbmNvZGVVUklDb21wb25lbnQoSlNPTi5zdHJpbmdpZnkoc291cmNlTWFwKSkpKSwgXCIgKi9cIik7XG4gIH1cblxuICAvLyBGb3Igb2xkIElFXG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAgKi9cbiAgb3B0aW9ucy5zdHlsZVRhZ1RyYW5zZm9ybShjc3MsIHN0eWxlRWxlbWVudCwgb3B0aW9ucy5vcHRpb25zKTtcbn1cbmZ1bmN0aW9uIHJlbW92ZVN0eWxlRWxlbWVudChzdHlsZUVsZW1lbnQpIHtcbiAgLy8gaXN0YW5idWwgaWdub3JlIGlmXG4gIGlmIChzdHlsZUVsZW1lbnQucGFyZW50Tm9kZSA9PT0gbnVsbCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBzdHlsZUVsZW1lbnQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChzdHlsZUVsZW1lbnQpO1xufVxuXG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAgKi9cbmZ1bmN0aW9uIGRvbUFQSShvcHRpb25zKSB7XG4gIGlmICh0eXBlb2YgZG9jdW1lbnQgPT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICByZXR1cm4ge1xuICAgICAgdXBkYXRlOiBmdW5jdGlvbiB1cGRhdGUoKSB7fSxcbiAgICAgIHJlbW92ZTogZnVuY3Rpb24gcmVtb3ZlKCkge31cbiAgICB9O1xuICB9XG4gIHZhciBzdHlsZUVsZW1lbnQgPSBvcHRpb25zLmluc2VydFN0eWxlRWxlbWVudChvcHRpb25zKTtcbiAgcmV0dXJuIHtcbiAgICB1cGRhdGU6IGZ1bmN0aW9uIHVwZGF0ZShvYmopIHtcbiAgICAgIGFwcGx5KHN0eWxlRWxlbWVudCwgb3B0aW9ucywgb2JqKTtcbiAgICB9LFxuICAgIHJlbW92ZTogZnVuY3Rpb24gcmVtb3ZlKCkge1xuICAgICAgcmVtb3ZlU3R5bGVFbGVtZW50KHN0eWxlRWxlbWVudCk7XG4gICAgfVxuICB9O1xufVxubW9kdWxlLmV4cG9ydHMgPSBkb21BUEk7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICAqL1xuZnVuY3Rpb24gc3R5bGVUYWdUcmFuc2Zvcm0oY3NzLCBzdHlsZUVsZW1lbnQpIHtcbiAgaWYgKHN0eWxlRWxlbWVudC5zdHlsZVNoZWV0KSB7XG4gICAgc3R5bGVFbGVtZW50LnN0eWxlU2hlZXQuY3NzVGV4dCA9IGNzcztcbiAgfSBlbHNlIHtcbiAgICB3aGlsZSAoc3R5bGVFbGVtZW50LmZpcnN0Q2hpbGQpIHtcbiAgICAgIHN0eWxlRWxlbWVudC5yZW1vdmVDaGlsZChzdHlsZUVsZW1lbnQuZmlyc3RDaGlsZCk7XG4gICAgfVxuICAgIHN0eWxlRWxlbWVudC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShjc3MpKTtcbiAgfVxufVxubW9kdWxlLmV4cG9ydHMgPSBzdHlsZVRhZ1RyYW5zZm9ybTsiLCIvLyBGdW5jdGlvbiB0byBsb2FkIHRoZSBDU1MgZnJvbSBhIGdpdmVuIFVSTFxyXG5mdW5jdGlvbiBsb2FkQ3NzKHVybCkge1xyXG4gICAgcmV0dXJuIGZldGNoKHVybClcclxuICAgICAgICAudGhlbihyZXNwb25zZSA9PiByZXNwb25zZS50ZXh0KCkpXHJcbiAgICAgICAgLnRoZW4oY3NzID0+IHtcclxuICAgICAgICAgICAgY29uc3Qgc3R5bGVTaGVldCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzdHlsZVwiKTtcclxuICAgICAgICAgICAgc3R5bGVTaGVldC50eXBlID0gXCJ0ZXh0L2Nzc1wiO1xyXG4gICAgICAgICAgICBzdHlsZVNoZWV0LnRleHRDb250ZW50ID0gY3NzOyAgLy8gVXNlIHRleHRDb250ZW50IGluc3RlYWQgb2YgaW5uZXJUZXh0XHJcbiAgICAgICAgICAgIGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoc3R5bGVTaGVldCk7XHJcbiAgICAgICAgfSlcclxuICAgICAgICAuY2F0Y2goZXJyb3IgPT4ge1xyXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKFwiRmFpbGVkIHRvIGxvYWQgQ1NTOlwiLCBlcnJvcik7XHJcbiAgICAgICAgfSk7XHJcbn1cclxuXHJcbmV4cG9ydCB7XHJcbiAgICBsb2FkQ3NzXHJcbn0iLCIvLyBJbXBvcnRpbmcgdGhlIENTUyBhbmQgSFRNTCB0ZW1wbGF0ZXNcclxuaW1wb3J0ICcuL2Nzcy9kaWFsb2cuY3NzJztcclxuaW1wb3J0IGRpYWxvZ1RlbXBsYXRlIGZyb20gJy4vaHRtbC9kaWFsb2cuaHRtbD9yYXcnO1xyXG5cclxuY29uc3QgY3JlYXRlRGlhbG9nID0gKG9wdGlvbnMpID0+IHtcclxuICAgIGNvbnN0IGRpYWxvZ0RlZmF1bHRzID0ge1xyXG4gICAgICAgIHRpdGxlOiAnJyxcclxuICAgICAgICBjb250ZW50OiAnJyxcclxuICAgICAgICBjb250ZW50VVJJOiAnJyxcclxuICAgICAgICBidXR0b25zOiBbXSxcclxuICAgICAgICBzaXplOiAnbWVkaXVtJyxcclxuICAgICAgICBzaG93TG9hZGluZ0luZGljYXRvcjogZmFsc2UsXHJcbiAgICAgICAgY29udGVudE1ldGhvZDogJ0dFVCcsXHJcbiAgICAgICAgY29udGVudERhdGE6IG51bGwsXHJcbiAgICAgICAgY29udGVudEhlYWRlcnM6IHVuZGVmaW5lZFxyXG4gICAgfTtcclxuXHJcbiAgICBjb25zdCB7IHRpdGxlLCBjb250ZW50LCBjb250ZW50VVJJLCBidXR0b25zLCBzaXplLCBzaG93TG9hZGluZ0luZGljYXRvciwgY29udGVudE1ldGhvZCwgY29udGVudERhdGEsIGNvbnRlbnRIZWFkZXJzIH0gPSB7IC4uLmRpYWxvZ0RlZmF1bHRzLCAuLi5vcHRpb25zIH07XHJcblxyXG4gICAgY29uc3Qgd3JhcHBlciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xyXG4gICAgd3JhcHBlci5pbm5lckhUTUwgPSBkaWFsb2dUZW1wbGF0ZS50cmltKCk7XHJcbiAgICBjb25zdCBkaWFsb2dFbGVtZW50ID0gd3JhcHBlci5maXJzdENoaWxkO1xyXG5cclxuICAgIC8vIExpZmVjeWNsZSBldmVudCBtYW5hZ2VtZW50XHJcbiAgICBjb25zdCBsaWZlY3ljbGVSZXNvbHZlcnMgPSB7fTtcclxuICAgIGNvbnN0IGxpZmVjeWNsZUV2ZW50cyA9IHt9O1xyXG5cclxuICAgIC8vIERlZmluZSBsaWZlY3ljbGUgcHJvbWlzZXMgYXMgcHJvcGVydGllc1xyXG4gICAgWydvcGVuaW5nJywgJ29wZW5lZCcsICdjbG9zaW5nJywgJ2Nsb3NlZCcsICdjb250ZW50TG9hZGluZycsICdjb250ZW50TG9hZGVkJ10uZm9yRWFjaCgoZXZlbnQpID0+IHtcclxuICAgICAgICBsaWZlY3ljbGVFdmVudHNbZXZlbnRdID0gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcclxuICAgICAgICAgICAgbGlmZWN5Y2xlUmVzb2x2ZXJzW2V2ZW50XSA9IHJlc29sdmU7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9KTtcclxuXHJcbiAgICBjb25zdCB0cmlnZ2VyRXZlbnQgPSAoZXZlbnQpID0+IHtcclxuICAgICAgICBpZiAobGlmZWN5Y2xlUmVzb2x2ZXJzW2V2ZW50XSkge1xyXG4gICAgICAgICAgICBsaWZlY3ljbGVSZXNvbHZlcnNbZXZlbnRdKCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgY29uc29sZS53YXJuKGBObyByZXNvbHZlciBmb3VuZCBmb3IgbGlmZWN5Y2xlIGV2ZW50OiAke2V2ZW50fWApO1xyXG4gICAgICAgIH1cclxuICAgIH07XHJcblxyXG4gICAgY29uc3QgZGlhbG9nID0ge1xyXG4gICAgICAgIGVsZW1lbnQ6IGRpYWxvZ0VsZW1lbnQsXHJcbiAgICAgICAgYnV0dG9uczoge30sXHJcbiAgICAgICAgaXNDbG9zZWQ6IGZhbHNlLFxyXG4gICAgICAgIGxpZmVjeWNsZTogbGlmZWN5Y2xlRXZlbnRzLCAvLyBMaWZlY3ljbGUgcHJvbWlzZXMgZGlyZWN0bHkgZXhwb3NlZCBoZXJlXHJcbiAgICAgICAgZGlzYWJsZUJ1dHRvbjogKGtleSkgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBidXR0b24gPSBkaWFsb2dFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoYC5BUFgtZGlhbG9nLWJ1dHRvbltkYXRhLWtleT1cIiR7a2V5fVwiXWApO1xyXG4gICAgICAgICAgICBpZiAoYnV0dG9uKSB7XHJcbiAgICAgICAgICAgICAgICBidXR0b24uZGlzYWJsZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgYnV0dG9uLmNsYXNzTGlzdC5hZGQoJ0FQWC1kaWFsb2ctYnV0dG9uLWRpc2FibGVkJyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgICAgIGVuYWJsZUJ1dHRvbjogKGtleSkgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBidXR0b24gPSBkaWFsb2dFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoYC5BUFgtZGlhbG9nLWJ1dHRvbltkYXRhLWtleT1cIiR7a2V5fVwiXWApO1xyXG4gICAgICAgICAgICBpZiAoYnV0dG9uKSB7XHJcbiAgICAgICAgICAgICAgICBidXR0b24uZGlzYWJsZWQgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIGJ1dHRvbi5jbGFzc0xpc3QucmVtb3ZlKCdBUFgtZGlhbG9nLWJ1dHRvbi1kaXNhYmxlZCcpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuICAgICAgICBvcGVuOiBhc3luYyAoKSA9PiB7XHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICB0cmlnZ2VyRXZlbnQoJ29wZW5pbmcnKTtcclxuICAgICAgICAgICAgICAgIGF3YWl0IGRpYWxvZy5saWZlY3ljbGUub3BlbmluZztcclxuXHJcbiAgICAgICAgICAgICAgICAvLyBJZiBsb2FkaW5nIGluZGljYXRvciBpcyBlbmFibGVkIGFuZCB3ZSdyZSBmZXRjaGluZyBjb250ZW50LCBzaG93IGRpYWxvZyBmaXJzdFxyXG4gICAgICAgICAgICAgICAgaWYgKHNob3dMb2FkaW5nSW5kaWNhdG9yICYmIGNvbnRlbnRVUkkpIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyBBcHBlbmQgZGlhbG9nIHRvIHRoZSBET00gYW5kIGRpc3BsYXkgaXQgZmlyc3RcclxuICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGRpYWxvZ0VsZW1lbnQpO1xyXG4gICAgICAgICAgICAgICAgICAgIGRpYWxvZ0VsZW1lbnQuc3R5bGUuZGlzcGxheSA9IFwiZmxleFwiO1xyXG4gICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgIC8vIFNob3cgbG9hZGluZyBpbmRpY2F0b3JcclxuICAgICAgICAgICAgICAgICAgICBkaWFsb2dFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoXCIuQVBYLWRpYWxvZy1keW5hbWljLWNvbnRlbnRcIikuaW5uZXJIVE1MID0gJzxkaXYgY2xhc3M9XCJBUFgtZGlhbG9nLWxvYWRpbmctaW5kaWNhdG9yXCI+PC9kaXY+JztcclxuICAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICAvLyBMb2FkIGNvbnRlbnQgYWZ0ZXIgZGlhbG9nIGlzIHZpc2libGVcclxuICAgICAgICAgICAgICAgICAgICBhd2FpdCBmZXRjaEFuZEluc2VydENvbnRlbnQoKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gRGVmYXVsdCBiZWhhdmlvcjogbG9hZCBjb250ZW50IGZpcnN0LCB0aGVuIHNob3cgZGlhbG9nXHJcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgZmV0Y2hBbmRJbnNlcnRDb250ZW50KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gQXBwZW5kIGRpYWxvZyB0byB0aGUgRE9NIGFuZCBkaXNwbGF5IGl0XHJcbiAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChkaWFsb2dFbGVtZW50KTtcclxuICAgICAgICAgICAgICAgICAgICBkaWFsb2dFbGVtZW50LnN0eWxlLmRpc3BsYXkgPSBcImZsZXhcIjtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICB0cmlnZ2VyRXZlbnQoJ29wZW5lZCcpO1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgZGlhbG9nLmxpZmVjeWNsZS5vcGVuZWQ7XHJcbiAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBvcGVuaW5nIGRpYWxvZzonLCBlcnJvcik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIGRpYWxvZzsgLy8gUmV0dXJuIGZvciBkYWlzeS1jaGFpbmluZ1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgY2xvc2U6IGFzeW5jICgpID0+IHtcclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIHRyaWdnZXJFdmVudCgnY2xvc2luZycpO1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgZGlhbG9nLmxpZmVjeWNsZS5jbG9zaW5nO1xyXG5cclxuICAgICAgICAgICAgICAgIC8vIENsZWFudXAgYW5kIHJlbW92ZSBkaWFsb2dcclxuICAgICAgICAgICAgICAgIGNsb3NlRGlhbG9nQW5kQ2xlYW51cCgpO1xyXG5cclxuICAgICAgICAgICAgICAgIHRyaWdnZXJFdmVudCgnY2xvc2VkJyk7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCBkaWFsb2cubGlmZWN5Y2xlLmNsb3NlZDtcclxuICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIGR1cmluZyBkaWFsb2cgY2xvc2luZzonLCBlcnJvcik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIGRpYWxvZzsgLy8gUmV0dXJuIGZvciBkYWlzeS1jaGFpbmluZ1xyXG4gICAgICAgIH1cclxuICAgIH07XHJcblxyXG4gICAgY29uc3QgY2xvc2VEaWFsb2dBbmRDbGVhbnVwID0gKCkgPT4ge1xyXG4gICAgICAgIGlmIChkaWFsb2cuaXNDbG9zZWQpIHJldHVybjtcclxuXHJcbiAgICAgICAgZGlhbG9nLmlzQ2xvc2VkID0gdHJ1ZTtcclxuICAgICAgICBkaWFsb2dFbGVtZW50LnN0eWxlLmRpc3BsYXkgPSBcIm5vbmVcIjtcclxuICAgICAgICBpZiAoZG9jdW1lbnQuYm9keS5jb250YWlucyhkaWFsb2dFbGVtZW50KSkge1xyXG4gICAgICAgICAgICBkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGRpYWxvZ0VsZW1lbnQpO1xyXG4gICAgICAgIH1cclxuICAgIH07XHJcblxyXG4gICAgY29uc3Qgc2V0RGlhbG9nU2l6ZSA9ICgpID0+IHtcclxuICAgICAgICBjb25zdCBkaWFsb2dDb250ZW50ID0gZGlhbG9nRWxlbWVudC5xdWVyeVNlbGVjdG9yKFwiLkFQWC1kaWFsb2ctY29udGVudFwiKTtcclxuICAgICAgICBjb25zdCBzaXplcyA9IHtcclxuICAgICAgICAgICAgc21hbGw6IHsgd2lkdGg6ICczMDBweCcsIGhlaWdodDogJzIwMHB4JyB9LFxyXG4gICAgICAgICAgICBtZWRpdW06IHsgd2lkdGg6ICc1MDBweCcsIGhlaWdodDogJzQwMHB4JyB9LFxyXG4gICAgICAgICAgICBsYXJnZTogeyB3aWR0aDogJzgwMHB4JywgaGVpZ2h0OiAnNjAwcHgnIH1cclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICBpZiAoc2l6ZSA9PT0gJ2F1dG8nKSByZXR1cm47XHJcblxyXG4gICAgICAgIGNvbnN0IHNlbGVjdGVkU2l6ZSA9IHNpemVzW3NpemVdIHx8ICh0eXBlb2Ygc2l6ZSA9PT0gJ29iamVjdCcgJiYgc2l6ZSk7XHJcbiAgICAgICAgaWYgKHNlbGVjdGVkU2l6ZSkge1xyXG4gICAgICAgICAgICBkaWFsb2dDb250ZW50LnN0eWxlLm1pbldpZHRoID0gc2VsZWN0ZWRTaXplLndpZHRoIHx8ICc1MDBweCc7XHJcbiAgICAgICAgICAgIGRpYWxvZ0NvbnRlbnQuc3R5bGUubWluSGVpZ2h0ID0gc2VsZWN0ZWRTaXplLmhlaWdodCB8fCAnNDAwcHgnO1xyXG4gICAgICAgIH1cclxuICAgIH07XHJcblxyXG4gICAgY29uc3QgYWRkQnV0dG9ucyA9ICgpID0+IHtcclxuICAgICAgICBjb25zdCBidXR0b25Db250YWluZXIgPSBkaWFsb2dFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoXCIuQVBYLWRpYWxvZy1idXR0b24tY29udGFpbmVyXCIpO1xyXG5cclxuICAgICAgICBidXR0b25zLmZvckVhY2goKHsga2V5LCBsYWJlbCwgb3JkZXIgPSAwLCBhbGlnbiA9ICdmbGV4LWVuZCcsIGNsb3NlT25DbGljayA9IHRydWUgfSkgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBidXR0b24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdidXR0b24nKTtcclxuICAgICAgICAgICAgYnV0dG9uLmNsYXNzTGlzdC5hZGQoJ0FQWC1kaWFsb2ctYnV0dG9uJyk7XHJcbiAgICAgICAgICAgIGJ1dHRvbi50ZXh0Q29udGVudCA9IGxhYmVsO1xyXG4gICAgICAgICAgICBidXR0b24uc3R5bGUub3JkZXIgPSBvcmRlcjtcclxuICAgICAgICAgICAgYnV0dG9uLnNldEF0dHJpYnV0ZSgnZGF0YS1rZXknLCBrZXkpO1xyXG5cclxuICAgICAgICAgICAgLy8gQ3JlYXRlIGJ1dHRvbiBjb250ZXh0IHdpdGggZGlzYWJsZS9lbmFibGUgbWV0aG9kc1xyXG4gICAgICAgICAgICBjb25zdCBidXR0b25Db250ZXh0ID0ge1xyXG4gICAgICAgICAgICAgICAgZGlzYWJsZTogKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGJ1dHRvbi5kaXNhYmxlZCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgYnV0dG9uLmNsYXNzTGlzdC5hZGQoJ0FQWC1kaWFsb2ctYnV0dG9uLWRpc2FibGVkJyk7XHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgZW5hYmxlOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgYnV0dG9uLmRpc2FibGVkID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgYnV0dG9uLmNsYXNzTGlzdC5yZW1vdmUoJ0FQWC1kaWFsb2ctYnV0dG9uLWRpc2FibGVkJyk7XHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAga2V5LFxyXG4gICAgICAgICAgICAgICAgZWxlbWVudDogYnV0dG9uXHJcbiAgICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgICBpZiAoY2xvc2VPbkNsaWNrKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBIYW5kbGUgYXMgYSBvbmUtdGltZSBQcm9taXNlXHJcbiAgICAgICAgICAgICAgICBsZXQgZmlyc3RDbGlja1Jlc29sdmVkID0gZmFsc2U7XHJcblxyXG4gICAgICAgICAgICAgICAgY29uc3QgZmlyc3RDbGlja1Byb21pc2UgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGJ1dHRvbi5vbmNsaWNrID0gKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWZpcnN0Q2xpY2tSZXNvbHZlZCAmJiAhYnV0dG9uLmRpc2FibGVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdENsaWNrUmVzb2x2ZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSh7IGRpYWxvZywgYnV0dG9uOiBidXR0b25Db250ZXh0IH0pOyAvLyBQYXNzIGJvdGggZGlhbG9nIGFuZCBidXR0b24gY29udGV4dFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlhbG9nLmNsb3NlKCk7IC8vIENsb3NlIHRoZSBkaWFsb2dcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgICAgICAvLyBBc3NpZ24gdGhlIHByb21pc2UgZm9yIGNoYWluaW5nIHdpdGggYC50aGVuYFxyXG4gICAgICAgICAgICAgICAgZGlhbG9nLmJ1dHRvbnNba2V5XSA9IGZpcnN0Q2xpY2tQcm9taXNlO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgLy8gSGFuZGxlIGFzIGEgcmVwZWF0ZWQgZXZlbnQgaGFuZGxlclxyXG4gICAgICAgICAgICAgICAgbGV0IGhhbmRsZXJzID0gW107IC8vIFN0b3JlIGhhbmRsZXJzIGZvciBgLnRoZW4oKWBcclxuXHJcbiAgICAgICAgICAgICAgICBjb25zdCBjbGlja1Byb21pc2UgPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhlbjogKGNhbGxiYWNrKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgY2FsbGJhY2sgPT09ICdmdW5jdGlvbicpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZXJzLnB1c2goY2FsbGJhY2spOyAvLyBBZGQgdG8gaGFuZGxlcnNcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2xpY2tQcm9taXNlOyAvLyBBbGxvdyBjaGFpbmluZ1xyXG4gICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgICAgIGJ1dHRvbi5vbmNsaWNrID0gKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICghYnV0dG9uLmRpc2FibGVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZXJzLmZvckVhY2goKGhhbmRsZXIpID0+IGhhbmRsZXIoeyBkaWFsb2csIGJ1dHRvbjogYnV0dG9uQ29udGV4dCB9KSk7IC8vIFBhc3MgYm90aCBkaWFsb2cgYW5kIGJ1dHRvbiBjb250ZXh0XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICAgICAgICBkaWFsb2cuYnV0dG9uc1trZXldID0gY2xpY2tQcm9taXNlOyAvLyBBc3NpZ24gdGhlIFwiZmFrZVwiIHByb21pc2VcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgYnV0dG9uQ29udGFpbmVyLmFwcGVuZENoaWxkKGJ1dHRvbik7XHJcbiAgICAgICAgICAgIGJ1dHRvbkNvbnRhaW5lci5zdHlsZS5qdXN0aWZ5Q29udGVudCA9IGFsaWduO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfTtcclxuXHJcbiAgICBjb25zdCBmZXRjaEFuZEluc2VydENvbnRlbnQgPSBhc3luYyAoKSA9PiB7XHJcbiAgICAgICAgY29uc3Qgb3JpZ2luYWxDdXJzb3IgPSBkb2N1bWVudC5ib2R5LnN0eWxlLmN1cnNvcjtcclxuICAgICAgICBkb2N1bWVudC5ib2R5LnN0eWxlLmN1cnNvciA9ICd3YWl0JztcclxuICAgICAgICBjb25zdCBkeW5hbWljQ29udGVudCA9IGRpYWxvZ0VsZW1lbnQucXVlcnlTZWxlY3RvcihcIi5BUFgtZGlhbG9nLWR5bmFtaWMtY29udGVudFwiKTtcclxuICAgICAgICBcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICB0cmlnZ2VyRXZlbnQoJ2NvbnRlbnRMb2FkaW5nJyk7XHJcbiAgICAgICAgICAgIGF3YWl0IGRpYWxvZy5saWZlY3ljbGUuY29udGVudExvYWRpbmc7XHJcblxyXG4gICAgICAgICAgICBjb25zdCBjb250ZW50SHRtbCA9IGNvbnRlbnRVUklcclxuICAgICAgICAgICAgICAgID8gYXdhaXQgZmV0Y2hDb250ZW50KGNvbnRlbnRVUkkpXHJcbiAgICAgICAgICAgICAgICA6IGNvbnRlbnQ7XHJcblxyXG4gICAgICAgICAgICBkeW5hbWljQ29udGVudC5pbm5lckhUTUwgPSBjb250ZW50SHRtbDtcclxuXHJcbiAgICAgICAgICAgIHRyaWdnZXJFdmVudCgnY29udGVudExvYWRlZCcpO1xyXG4gICAgICAgICAgICBhd2FpdCBkaWFsb2cubGlmZWN5Y2xlLmNvbnRlbnRMb2FkZWQ7XHJcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgbG9hZGluZyBjb250ZW50OicsIGVycm9yKTtcclxuICAgICAgICB9IGZpbmFsbHkge1xyXG4gICAgICAgICAgICBkb2N1bWVudC5ib2R5LnN0eWxlLmN1cnNvciA9IG9yaWdpbmFsQ3Vyc29yO1xyXG4gICAgICAgIH1cclxuICAgIH07XHJcblxyXG4gICAgY29uc3QgZmV0Y2hDb250ZW50ID0gYXN5bmMgKHVyaSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IG1ldGhvZCA9IChjb250ZW50TWV0aG9kIHx8ICdHRVQnKS50b1VwcGVyQ2FzZSgpO1xyXG5cclxuICAgICAgICAvLyBBbHdheXMgYWxsb3cgY3VzdG9tIGhlYWRlcnM7IHdlIG9ubHkgYWRkIENvbnRlbnQtVHlwZSB3aGVuIHdlIGNhbiBpbmZlciBpdFxyXG4gICAgICAgIGNvbnN0IGhlYWRlcnMgPSB7IC4uLihjb250ZW50SGVhZGVycyB8fCB7fSkgfTtcclxuICAgICAgICBjb25zdCBoYXNDb250ZW50VHlwZSA9IE9iamVjdC5rZXlzKGhlYWRlcnMpLnNvbWUoKGspID0+IGsudG9Mb3dlckNhc2UoKSA9PT0gJ2NvbnRlbnQtdHlwZScpO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBCdWlsZCBSZXF1ZXN0SW5pdCBkZXBlbmRpbmcgb24gbWV0aG9kIGFuZCBjb250ZW50RGF0YSB0eXBlLlxyXG4gICAgICAgICAqIFdlIGF2b2lkIHNldHRpbmcgQ29udGVudC1UeXBlIGZvciBGb3JtRGF0YSBhbmQgcmF3IHN0cmluZy9CbG9iIHBheWxvYWRzLFxyXG4gICAgICAgICAqIHVubGVzcyB0aGUgY2FsbGVyIGV4cGxpY2l0bHkgcHJvdmlkZWQgaXQgdmlhIGNvbnRlbnRIZWFkZXJzLlxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIGNvbnN0IGluaXQgPSB7IG1ldGhvZCB9O1xyXG5cclxuICAgICAgICBpZiAobWV0aG9kID09PSAnUE9TVCcpIHtcclxuICAgICAgICAgICAgbGV0IGJvZHkgPSB1bmRlZmluZWQ7XHJcblxyXG4gICAgICAgICAgICBjb25zdCBpc0Zvcm1EYXRhID0gdHlwZW9mIEZvcm1EYXRhICE9PSAndW5kZWZpbmVkJyAmJiBjb250ZW50RGF0YSBpbnN0YW5jZW9mIEZvcm1EYXRhO1xyXG4gICAgICAgICAgICBjb25zdCBpc1VSTFNlYXJjaFBhcmFtcyA9IHR5cGVvZiBVUkxTZWFyY2hQYXJhbXMgIT09ICd1bmRlZmluZWQnICYmIGNvbnRlbnREYXRhIGluc3RhbmNlb2YgVVJMU2VhcmNoUGFyYW1zO1xyXG4gICAgICAgICAgICBjb25zdCBpc0Jsb2IgPSB0eXBlb2YgQmxvYiAhPT0gJ3VuZGVmaW5lZCcgJiYgY29udGVudERhdGEgaW5zdGFuY2VvZiBCbG9iO1xyXG4gICAgICAgICAgICBjb25zdCBpc1N0cmluZyA9IHR5cGVvZiBjb250ZW50RGF0YSA9PT0gJ3N0cmluZyc7XHJcbiAgICAgICAgICAgIGNvbnN0IGlzUGxhaW5PYmplY3QgPSBjb250ZW50RGF0YSAmJiB0eXBlb2YgY29udGVudERhdGEgPT09ICdvYmplY3QnICYmICFpc0Zvcm1EYXRhICYmICFpc1VSTFNlYXJjaFBhcmFtcyAmJiAhaXNCbG9iO1xyXG5cclxuICAgICAgICAgICAgaWYgKGlzRm9ybURhdGEpIHtcclxuICAgICAgICAgICAgICAgIGJvZHkgPSBjb250ZW50RGF0YTtcclxuICAgICAgICAgICAgICAgIC8vIERvIG5vdCBzZXQgQ29udGVudC1UeXBlIGZvciBGb3JtRGF0YTsgYnJvd3NlciB3aWxsIHNldCB0aGUgYm91bmRhcnlcclxuICAgICAgICAgICAgfSBlbHNlIGlmIChpc1VSTFNlYXJjaFBhcmFtcykge1xyXG4gICAgICAgICAgICAgICAgYm9keSA9IGNvbnRlbnREYXRhO1xyXG4gICAgICAgICAgICAgICAgaWYgKCFoYXNDb250ZW50VHlwZSkgaGVhZGVyc1snQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkO2NoYXJzZXQ9VVRGLTgnO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGlzUGxhaW5PYmplY3QpIHtcclxuICAgICAgICAgICAgICAgIGJvZHkgPSBKU09OLnN0cmluZ2lmeShjb250ZW50RGF0YSk7XHJcbiAgICAgICAgICAgICAgICBpZiAoIWhhc0NvbnRlbnRUeXBlKSBoZWFkZXJzWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcclxuICAgICAgICAgICAgfSBlbHNlIGlmIChpc1N0cmluZyB8fCBpc0Jsb2IpIHtcclxuICAgICAgICAgICAgICAgIGJvZHkgPSBjb250ZW50RGF0YTtcclxuICAgICAgICAgICAgICAgIC8vIENvbnRlbnQtVHlwZSBsZWZ0IHRvIGNhbGxlciBpZiBuZWVkZWRcclxuICAgICAgICAgICAgfSBlbHNlIGlmIChjb250ZW50RGF0YSAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBGYWxsYmFjazogdHJ5IHNlbmQgYXMtaXNcclxuICAgICAgICAgICAgICAgIGJvZHkgPSBjb250ZW50RGF0YTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKGJvZHkgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgaW5pdC5ib2R5ID0gYm9keTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKE9iamVjdC5rZXlzKGhlYWRlcnMpLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgaW5pdC5oZWFkZXJzID0gaGVhZGVycztcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2godXJpLCBpbml0KTtcclxuICAgICAgICBpZiAoIXJlc3BvbnNlLm9rKSB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byBmZXRjaCBjb250ZW50OiAke3Jlc3BvbnNlLnN0YXR1c1RleHR9YCk7XHJcbiAgICAgICAgcmV0dXJuIHJlc3BvbnNlLnRleHQoKTtcclxuICAgIH07XHJcblxyXG4gICAgLy8gSW5pdGlhbGl6ZSBkaWFsb2dcclxuICAgIHNldERpYWxvZ1NpemUoKTtcclxuICAgIGFkZEJ1dHRvbnMoKTtcclxuXHJcbiAgICAvLyBTZXQgdGl0bGUgYW5kIGNsb3NlIGJ1dHRvbiBoYW5kbGVyXHJcbiAgICBkaWFsb2dFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoXCIuQVBYLWRpYWxvZy10aXRsZVwiKS50ZXh0Q29udGVudCA9IHRpdGxlO1xyXG4gICAgZGlhbG9nRWxlbWVudC5xdWVyeVNlbGVjdG9yKCcuQVBYLWNsb3NlLWRpYWxvZycpLm9uY2xpY2sgPSBkaWFsb2cuY2xvc2U7XHJcblxyXG4gICAgcmV0dXJuIGRpYWxvZztcclxufTtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNyZWF0ZURpYWxvZztcclxuIiwibGV0IGNvdW50ZXIgPSAwO1xyXG5jb25zdCBkb0NhbGxiYWNrcyA9IHt9O1xyXG5jb25zdCB0aW1lb3V0cyA9IHt9O1xyXG5cclxuLyoqXHJcbiAqIFRoaXMgZnVuY3Rpb24gYWRkcyBhbiBldmVudCBsaXN0ZW5lciB0byB0aGUgZWxlbWVudHMgYW5kIHJldHVybnMgYW4gb2JqZWN0IHdpdGggYSBkbyBtZXRob2QgdG8gYWRkIGNhbGxiYWNrIGZ1bmN0aW9ucy5cclxuICogQHBhcmFtIHtPYmplY3R9IGFweCAtIFRoZSBhcHggb2JqZWN0IHRvIGF1Z21lbnQgd2l0aCB0aGUgbGlzdGVuIGZ1bmN0aW9uLlxyXG4gKiBAcmV0dXJucyB7T2JqZWN0fSAtIFRoZSBhdWdtZW50ZWQgYXB4IG9iamVjdC5cclxuICovXHJcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIChhcHgpIHtcclxuICAgIGxldCBlbGVtZW50cyA9IGFweC5lbGVtZW50cztcclxuXHJcbiAgICAvKipcclxuICAgICAqIEFkZHMgYW4gZXZlbnQgbGlzdGVuZXIgdG8gdGhlIGVsZW1lbnRzIGFuZCByZXR1cm5zIGFuIG9iamVjdCB3aXRoIGEgZG8gbWV0aG9kIHRvIGFkZCBjYWxsYmFjayBmdW5jdGlvbnMuXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZXZlbnRUeXBlIC0gVGhlIHR5cGUgb2YgZXZlbnQgdG8gbGlzdGVuIGZvciAoZS5nLiAnY2xpY2snLCAna2V5ZG93bicsIGV0Yy4pLlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtzZWxlY3Rvcl0gLSBUaGUgQ1NTIHNlbGVjdG9yIHRvIHVzZSBmb3IgZXZlbnQgZGVsZWdhdGlvbiAob3B0aW9uYWwpLlxyXG4gICAgICogQHJldHVybnMge09iamVjdH0gLSBBbiBvYmplY3Qgd2l0aCBhIGRvIG1ldGhvZCB0byBhZGQgY2FsbGJhY2sgZnVuY3Rpb25zLlxyXG4gICAgICogQGV4YW1wbGVcclxuICAgICAqIGFweC5saXN0ZW4oJ2NsaWNrJywgJy5teS1idXR0b24nKS5kbygoZXZlbnQpID0+IHtcclxuICAgICAqICAgY29uc29sZS5sb2coJ0J1dHRvbiBjbGlja2VkIScsIGV2ZW50LnRhcmdldCk7XHJcbiAgICAgKiB9KTtcclxuICAgICAqL1xyXG4gICAgYXB4Lmxpc3RlbiA9IGZ1bmN0aW9uIChldmVudFR5cGVzLCBzZWNvbmRBcmd1bWVudCwgdGhpcmRBcmd1bWVudCkge1xyXG4gICAgICAgIGxldCBzZWxlY3RvcjtcclxuICAgICAgICBsZXQgb3B0aW9ucyA9IHt9O1xyXG4gICAgICAgIC8vIERldGVybWluZSBpZiB0aGUgc2Vjb25kIGFyZ3VtZW50IGlzIGEgc2VsZWN0b3Igb3Igb3B0aW9uc1xyXG4gICAgICAgIGlmICh0eXBlb2Ygc2Vjb25kQXJndW1lbnQgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgICAgIHNlbGVjdG9yID0gc2Vjb25kQXJndW1lbnQ7XHJcbiAgICAgICAgICAgIG9wdGlvbnMgPSB0aGlyZEFyZ3VtZW50IHx8IHt9O1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIG9wdGlvbnMgPSBzZWNvbmRBcmd1bWVudCB8fCB7fTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IHVuaXF1ZUlkID0gZ2VuZXJhdGVVbmlxdWVJZCgpO1xyXG4gICAgICAgIGNvbnN0IHRpbWVvdXREdXJhdGlvbiA9IG9wdGlvbnMudGltZW91dCB8fCAwO1xyXG4gICAgICAgIFxyXG4gICAgICAgIGlmICghQXJyYXkuaXNBcnJheShldmVudFR5cGVzKSkge1xyXG4gICAgICAgICAgICBldmVudFR5cGVzID0gW2V2ZW50VHlwZXNdOyAvLyBFbnN1cmUgZXZlbnRUeXBlcyBpcyBhbiBhcnJheVxyXG4gICAgICAgIH1cclxuICAgICAgICBcclxuICAgICAgICBldmVudFR5cGVzLmZvckVhY2goKGV2ZW50VHlwZSkgPT4ge1xyXG4gICAgICAgICAgICBlbGVtZW50cy5mb3JFYWNoKChlbGVtZW50KSA9PiB7XHJcbiAgICAgICAgICAgICAgICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoZXZlbnRUeXBlLCAoZXZlbnQpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBleGVjdXRlQ2FsbGJhY2tzKGV2ZW50LCB1bmlxdWVJZCwgdGltZW91dER1cmF0aW9uLCBzZWxlY3RvciwgZWxlbWVudCk7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIC8qKlxyXG4gICAgICAgICAgICAgKiBBZGRzIGEgY2FsbGJhY2sgZnVuY3Rpb24gdG8gdGhlIGRvQ2FsbGJhY2tzIG9iamVjdCBmb3IgdGhlIGN1cnJlbnQgZXZlbnQgbGlzdGVuZXIuXHJcbiAgICAgICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGRvQ2FsbGJhY2sgLSBUaGUgY2FsbGJhY2sgZnVuY3Rpb24gdG8gZXhlY3V0ZSB3aGVuIHRoZSBldmVudCBpcyB0cmlnZ2VyZWQuXHJcbiAgICAgICAgICAgICAqIEByZXR1cm5zIHtPYmplY3R9IC0gUmV0dXJucyB0aGUgY3VycmVudCBvYmplY3QgdG8gYWxsb3cgZm9yIGNoYWluZWQgY2FsbHMuXHJcbiAgICAgICAgICAgICAqIEBleGFtcGxlXHJcbiAgICAgICAgICAgICAqIGFweC5saXN0ZW4oJ2NsaWNrJywgJy5teS1idXR0b24nKS5kbygoZXZlbnQpID0+IHtcclxuICAgICAgICAgICAgICogICBjb25zb2xlLmxvZygnQnV0dG9uIGNsaWNrZWQhJywgZXZlbnQudGFyZ2V0KTtcclxuICAgICAgICAgICAgICogfSkuZG8oKGV2ZW50KSA9PiB7XHJcbiAgICAgICAgICAgICAqICAgY29uc29sZS5sb2coJ0Fub3RoZXIgY2FsbGJhY2sgZnVuY3Rpb24hJyk7XHJcbiAgICAgICAgICAgICAqIH0pO1xyXG4gICAgICAgICAgICAgKi9cclxuICAgICAgICAgICAgZG86IGZ1bmN0aW9uIChkb0NhbGxiYWNrKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoIWRvQ2FsbGJhY2tzW3VuaXF1ZUlkXSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGRvQ2FsbGJhY2tzW3VuaXF1ZUlkXSA9IFtdO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZG9DYWxsYmFja3NbdW5pcXVlSWRdLnB1c2goZG9DYWxsYmFjayk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsgLy8gUmV0dXJuIHRoZSBvYmplY3QgdG8gYWxsb3cgZm9yIGNoYWluZWQgY2FsbHNcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICB9O1xyXG4gICAgfTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIE1hbnVhbGx5IHRyaWdnZXJzIHRoZSByZWdpc3RlcmVkIGNhbGxiYWNrcyBmb3IgYSBnaXZlbiBldmVudCB0eXBlIG9uIGFsbCBlbGVtZW50cyBvciBjcmVhdGVzIGEgbmV3IGV2ZW50IGlmIGEgc3RyaW5nIGlzIHByb3ZpZGVkLlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd8RXZlbnR9IGV2ZW50IC0gVGhlIGV2ZW50IHRvIHRyaWdnZXIuIFRoaXMgY2FuIGJlIGFuIGV2ZW50IHR5cGUgc3RyaW5nIChsaWtlICdjbGljaycpIG9yIGFuIGFjdHVhbCBFdmVudCBvYmplY3QuXHJcbiAgICAgKi9cclxuICAgIGFweC50cmlnZ2VyID0gZnVuY3Rpb24gKGV2ZW50KSB7XHJcbiAgICAgICAgbGV0IGV2ZW50VHlwZTtcclxuICAgICAgICBpZiAodHlwZW9mIGV2ZW50ID09PSAnc3RyaW5nJykge1xyXG4gICAgICAgICAgICBldmVudFR5cGUgPSBldmVudDtcclxuICAgICAgICAgICAgZXZlbnQgPSBuZXcgRXZlbnQoZXZlbnQsIHsgYnViYmxlczogdHJ1ZSwgY2FuY2VsYWJsZTogdHJ1ZSB9KTtcclxuICAgICAgICB9IGVsc2UgaWYgKGV2ZW50IGluc3RhbmNlb2YgRXZlbnQpIHtcclxuICAgICAgICAgICAgZXZlbnRUeXBlID0gZXZlbnQudHlwZTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdJbnZhbGlkIGV2ZW50IHR5cGUgcHJvdmlkZWQgdG8gYXB4LnRyaWdnZXIuIEl0IG11c3QgYmUgZWl0aGVyIGEgc3RyaW5nIG9yIEV2ZW50IG9iamVjdC4nKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgYXB4LmVsZW1lbnRzLmZvckVhY2goKGVsZW1lbnQpID0+IHtcclxuICAgICAgICAgICAgZWxlbWVudC5kaXNwYXRjaEV2ZW50KGV2ZW50KTsgIC8vIFRoaXMgd2lsbCBhbGxvdyB0aGUgZXZlbnQgdG8gYnViYmxlIHVwIG5hdHVyYWxseS5cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgLy8gSGFuZGxlIGV2ZW50IGRlbGVnYXRpb24gbWFudWFsbHkgYnkgZXhlY3V0aW5nIGNhbGxiYWNrcyBpZiB0aGUgdGFyZ2V0IG1hdGNoZXMgdGhlIHNlbGVjdG9yXHJcbiAgICAgICAgT2JqZWN0LmtleXMoZG9DYWxsYmFja3MpLmZvckVhY2goKHVuaXF1ZUlkKSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IGNhbGxiYWNrRGV0YWlscyA9IGRvQ2FsbGJhY2tzW3VuaXF1ZUlkXTtcclxuICAgICAgICAgICAgaWYgKGNhbGxiYWNrRGV0YWlscyAmJiBjYWxsYmFja0RldGFpbHMuZXZlbnRUeXBlID09PSBldmVudFR5cGUpIHtcclxuICAgICAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSBldmVudCB0YXJnZXQgbWF0Y2hlcyB0aGUgc2VsZWN0b3IgdXNlZCBkdXJpbmcgbGlzdGVuZXIgcmVnaXN0cmF0aW9uXHJcbiAgICAgICAgICAgICAgICBjb25zdCB7IHNlbGVjdG9yIH0gPSBjYWxsYmFja0RldGFpbHM7XHJcbiAgICAgICAgICAgICAgICBpZiAoIXNlbGVjdG9yIHx8IGV2ZW50LnRhcmdldC5tYXRjaGVzKHNlbGVjdG9yKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVDYWxsYmFja3MoZXZlbnQsIHVuaXF1ZUlkLCAwLCBzZWxlY3RvciwgZXZlbnQudGFyZ2V0KTsgIC8vIEltbWVkaWF0ZSBleGVjdXRpb24sIG5vIHRpbWVvdXRcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfTtcclxuICAgIFxyXG4gICAgcmV0dXJuIGFweDtcclxufTtcclxuXHJcblxyXG5mdW5jdGlvbiBleGVjdXRlQ2FsbGJhY2tzKGV2ZW50LCB1bmlxdWVJZCwgdGltZW91dER1cmF0aW9uLCBzZWxlY3RvciA9ICcnLCBlbGVtZW50KSB7XHJcbiAgICBjb25zdCBtYXRjaGVkRWxlbWVudCA9IHNlbGVjdG9yID8gY2xvc2VzdChldmVudC50YXJnZXQsIHNlbGVjdG9yKSA6IGVsZW1lbnQ7XHJcbiAgICBpZiAoIW1hdGNoZWRFbGVtZW50KSB7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIENsZWFyIGFueSBwcmV2aW91cyB0aW1lb3V0IGZvciB0aGlzIHVuaXF1ZUlkIHRvIHByZXZlbnQgdW5pbnRlbmRlZCBiZWhhdmlvclxyXG4gICAgY2xlYXJUaW1lb3V0KHRpbWVvdXRzW3VuaXF1ZUlkXSk7XHJcblxyXG4gICAgLy8gRnVuY3Rpb24gdG8gaGFuZGxlIHRoZSBleGVjdXRpb24gb2YgY2FsbGJhY2tzXHJcbiAgICBmdW5jdGlvbiBoYW5kbGVDYWxsYmFja0V4ZWN1dGlvbigpIHtcclxuICAgICAgICBpZiAoZG9DYWxsYmFja3NbdW5pcXVlSWRdKSB7XHJcbiAgICAgICAgICAgIGRvQ2FsbGJhY2tzW3VuaXF1ZUlkXS5yZWR1Y2UoKHByZXZQcm9taXNlLCBkb0NhbGxiYWNrKSA9PiB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gcHJldlByb21pc2UudGhlbigoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGRvQ2FsbGJhY2suYmluZChtYXRjaGVkRWxlbWVudCkoZXZlbnQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdCBpbnN0YW5jZW9mIFByb21pc2UpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQudGhlbihyZXNvbHZlKS5jYXRjaChyZWplY3QpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHJlc3VsdCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWplY3QoZXJyb3IpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfSwgUHJvbWlzZS5yZXNvbHZlKCkpLmNhdGNoKGVycm9yID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIGluIGNhbGxiYWNrIGNoYWluOicsIGVycm9yKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIENoZWNrIGlmIHRpbWVvdXREdXJhdGlvbiBpcyB6ZXJvIHRvIGRlY2lkZSB3aGV0aGVyIHRvIGRlbGF5IHRoZSBjYWxsYmFjayBleGVjdXRpb24gb3Igbm90XHJcbiAgICBpZiAodGltZW91dER1cmF0aW9uID09PSAwKSB7XHJcbiAgICAgICAgaGFuZGxlQ2FsbGJhY2tFeGVjdXRpb24oKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGltZW91dHNbdW5pcXVlSWRdID0gc2V0VGltZW91dChoYW5kbGVDYWxsYmFja0V4ZWN1dGlvbiwgdGltZW91dER1cmF0aW9uKTtcclxuICAgIH1cclxufVxyXG5cclxuXHJcbmZ1bmN0aW9uIGdlbmVyYXRlVW5pcXVlSWQoKSB7XHJcbiAgICBjb25zdCByYW5kb21QYXJ0ID0gTWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc3Vic3RyKDIsIDkpOyAvLyBNb3JlIHJhbmRvbW5lc3NcclxuICAgIGNvbnN0IHVuaXF1ZUlkID0gYCR7RGF0ZS5ub3coKX1fJHtyYW5kb21QYXJ0fV8ke2NvdW50ZXJ9YDtcclxuICAgIGNvdW50ZXIgPSAoY291bnRlciArIDEpICUgMTAwMDsgLy8gUmVzZXQgY291bnRlciB0byBhdm9pZCBvdmVyZmxvd1xyXG5cclxuICAgIHJldHVybiB1bmlxdWVJZDtcclxufVxyXG5cclxuZnVuY3Rpb24gY2xvc2VzdChlbGVtZW50LCBzZWxlY3Rvcikge1xyXG4gICAgd2hpbGUgKGVsZW1lbnQgJiYgZWxlbWVudC5ub2RlVHlwZSA9PT0gMSkge1xyXG4gICAgICAgIGlmIChlbGVtZW50Lm1hdGNoZXMoc2VsZWN0b3IpKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBlbGVtZW50O1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbGVtZW50ID0gZWxlbWVudC5wYXJlbnROb2RlO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIG51bGw7XHJcbn1cclxuIiwiLy8gTWluaW1hbCwgZnJhbWV3b3JrLWFnbm9zdGljIFRvYXN0TWFuYWdlciBmb3IgQVBYXHJcbi8vIEVTTS1maXJzdCwgbm8gc2lkZSBlZmZlY3RzIG9uIGltcG9ydC4gRE9NIG9ubHkgd2hlbiB1c2VkLlxyXG5pbXBvcnQgJy4vY3NzL3RvYXN0LmNzcyc7XHJcblxyXG4vKipcclxuICogQHR5cGVkZWYge09iamVjdH0gUG9zaXRpb25PYmplY3RcclxuICogQHByb3BlcnR5IHsnc3RpY2t5J3wncmVsYXRpdmUnfCdhbmNob3JlZCd9IFt0eXBlXVxyXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3hdXHJcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbeV1cclxuICogQHByb3BlcnR5IHtIVE1MRWxlbWVudH0gW2VsZW1lbnRdXHJcbiAqIEBwcm9wZXJ0eSB7J3RvcCd8J3JpZ2h0J3wnYm90dG9tJ3wnbGVmdCd8J2Fib3ZlJ3wnYmVsb3cnfCdiZWZvcmUnfCdhZnRlcid9IFtwbGFjZW1lbnRdXHJcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbZ2FwXVxyXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFt1c2VOYXRpdmVDU1NdXHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIEB0eXBlZGVmIHtzdHJpbmd8UG9zaXRpb25PYmplY3R9IFBvc2l0aW9uXHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIEB0eXBlZGVmIHtPYmplY3R9IFRvYXN0Q29uZmlnXHJcbiAqIEBwcm9wZXJ0eSB7UG9zaXRpb259IFtwb3NpdGlvbl1cclxuICogQHByb3BlcnR5IHsndXAnfCdkb3duJ3wnYXV0byd9IFtmbG93XSBGbG93IGRpcmVjdGlvbiBmb3Igc3RhY2tpbmcgdG9hc3RzLiAnYXV0bycgZGV0ZXJtaW5lcyBiYXNlZCBvbiBwb3NpdGlvbi4gRGVmYXVsdDogJ2F1dG8nXHJcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbbWF4VG9hc3RzXVxyXG4gKiBAcHJvcGVydHkge251bWJlcn0gW2RlZmF1bHREdXJhdGlvbk1zXVxyXG4gKiBAcHJvcGVydHkge251bWJlcn0gW3pJbmRleF1cclxuICogQHByb3BlcnR5IHsncG9saXRlJ3wnYXNzZXJ0aXZlJ3wnb2ZmJ30gW2FyaWFMaXZlXVxyXG4gKiBAcHJvcGVydHkge251bWJlcn0gW2dhcF1cclxuICogQHByb3BlcnR5IHtib29sZWFufSBbZGVkdXBlXVxyXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2NvbnRhaW5lckNsYXNzXVxyXG4gKiBAcHJvcGVydHkge251bWJlcn0gW29mZnNldF1cclxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtpZF1cclxuICovXHJcblxyXG4vKipcclxuICogQHR5cGVkZWYge09iamVjdH0gVG9hc3RPcHRpb25zXHJcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfE5vZGV9IG1lc3NhZ2VcclxuICogQHByb3BlcnR5IHsnaW5mbyd8J3N1Y2Nlc3MnfCd3YXJuaW5nJ3wnZGFuZ2VyJ30gW3R5cGVdXHJcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbZHVyYXRpb25Nc11cclxuICogQHByb3BlcnR5IHtib29sZWFufSBbZGlzbWlzc2libGVdXHJcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbaWRdXHJcbiAqIEBwcm9wZXJ0eSB7KHJlZjogVG9hc3RSZWYsIGV2OiBNb3VzZUV2ZW50KSA9PiB2b2lkfSBbb25DbGlja11cclxuICogQHByb3BlcnR5IHsocmVmOiBUb2FzdFJlZiwgcmVhc29uOiAndGltZW91dCd8J2Nsb3NlJ3wnYXBpJ3wnb3ZlcmZsb3cnKSA9PiB2b2lkfSBbb25DbG9zZV1cclxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtjbGFzc05hbWVdXHJcbiAqIEBwcm9wZXJ0eSB7UG9zaXRpb259IFtwb3NpdGlvbl1cclxuICogQHByb3BlcnR5IHsndXAnfCdkb3duJ3wnYXV0byd9IFtmbG93XSBGbG93IGRpcmVjdGlvbiBmb3Igc3RhY2tpbmcgdG9hc3RzLiAnYXV0bycgZGV0ZXJtaW5lcyBiYXNlZCBvbiBwb3NpdGlvbi4gRGVmYXVsdDogJ2F1dG8nXHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIEB0eXBlZGVmIHtPYmplY3R9IFRvYXN0UmVmXHJcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBpZFxyXG4gKiBAcHJvcGVydHkge0hUTUxFbGVtZW50fSBlbFxyXG4gKiBAcHJvcGVydHkgeyhyZWFzb24/OiAnYXBpJ3wnY2xvc2UnKSA9PiB2b2lkfSBjbG9zZVxyXG4gKiBAcHJvcGVydHkgeyhwYXJ0aWFsOiBQYXJ0aWFsPFRvYXN0T3B0aW9ucz4pID0+IHZvaWR9IHVwZGF0ZVxyXG4gKiBAcHJvcGVydHkgeygpID0+IFByb21pc2U8dm9pZD59IHdoZW5DbG9zZWRcclxuICogQHByb3BlcnR5IHsoZXZlbnQ6ICdjbG9zZSd8J2NsaWNrJywgaGFuZGxlcjogRnVuY3Rpb24pID0+ICgpID0+IHZvaWR9IG9uXHJcbiAqIEBwcm9wZXJ0eSB7KGV2ZW50OiAnY2xvc2UnfCdjbGljaycsIGhhbmRsZXI6IEZ1bmN0aW9uKSA9PiB2b2lkfSBvZmZcclxuICovXHJcblxyXG5jb25zdCBpc0Jyb3dzZXIgPSB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2YgZG9jdW1lbnQgIT09ICd1bmRlZmluZWQnO1xyXG5cclxuLy8gU2hhcmVkIGNvbnRhaW5lciBjYWNoZTogTWFwPHBvc2l0aW9uLCBIVE1MRWxlbWVudD5cclxuLy8gQ29udGFpbmVycyBhcmUgc2hhcmVkIGJldHdlZW4gbWFuYWdlcnMgd2l0aCB0aGUgc2FtZSBwb3NpdGlvblxyXG5jb25zdCBfY29udGFpbmVyQ2FjaGUgPSBuZXcgTWFwKCk7XHJcblxyXG4vLyBHYXJiYWdlIGNvbGxlY3Rpb246IGNsZWFudXAgZW1wdHkgdW5tYW5hZ2VkIGNvbnRhaW5lcnMgYWZ0ZXIgYSBkZWxheVxyXG5jb25zdCBHQ19ERUxBWV9NUyA9IDIwMDAwOyAvLyAyMCBzZWNvbmRzXHJcbmxldCBfZ2NUaW1lb3V0SWQgPSBudWxsO1xyXG5cclxuLy8gV3JhcHBlciBmb3IgYWxsIHRvYXN0IGNvbnRhaW5lcnMgKGtlZXBzIERPTSBjbGVhbilcclxubGV0IF90b2FzdFdyYXBwZXIgPSBudWxsO1xyXG5cclxuLyoqXHJcbiAqIEdldCBvciBjcmVhdGUgdGhlIHRvYXN0IGNvbnRhaW5lcnMgd3JhcHBlclxyXG4gKiBAcmV0dXJucyB7SFRNTEVsZW1lbnR8bnVsbH1cclxuICovXHJcbmZ1bmN0aW9uIGdldFRvYXN0V3JhcHBlcigpIHtcclxuICAgIGlmICghaXNCcm93c2VyKSByZXR1cm4gbnVsbDtcclxuICAgIFxyXG4gICAgaWYgKCFfdG9hc3RXcmFwcGVyKSB7XHJcbiAgICAgICAgX3RvYXN0V3JhcHBlciA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5BUFgtdG9hc3Qtd3JhcHBlcicpO1xyXG4gICAgICAgIGlmICghX3RvYXN0V3JhcHBlcikge1xyXG4gICAgICAgICAgICBfdG9hc3RXcmFwcGVyID0gY3JlYXRlRWwoJ2RpdicsICdBUFgtdG9hc3Qtd3JhcHBlcicpO1xyXG4gICAgICAgICAgICBfdG9hc3RXcmFwcGVyLnN0eWxlLnBvc2l0aW9uID0gJ2ZpeGVkJztcclxuICAgICAgICAgICAgX3RvYXN0V3JhcHBlci5zdHlsZS50b3AgPSAnMCc7XHJcbiAgICAgICAgICAgIF90b2FzdFdyYXBwZXIuc3R5bGUubGVmdCA9ICcwJztcclxuICAgICAgICAgICAgX3RvYXN0V3JhcHBlci5zdHlsZS53aWR0aCA9ICcwJztcclxuICAgICAgICAgICAgX3RvYXN0V3JhcHBlci5zdHlsZS5oZWlnaHQgPSAnMCc7XHJcbiAgICAgICAgICAgIF90b2FzdFdyYXBwZXIuc3R5bGUucG9pbnRlckV2ZW50cyA9ICdub25lJztcclxuICAgICAgICAgICAgX3RvYXN0V3JhcHBlci5zdHlsZS56SW5kZXggPSAnMTAwMDAnOyAvLyBCZWxvdyBjb250YWluZXJzIGJ1dCBhYm92ZSBtb3N0IGNvbnRlbnRcclxuICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChfdG9hc3RXcmFwcGVyKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBcclxuICAgIHJldHVybiBfdG9hc3RXcmFwcGVyO1xyXG59XHJcblxyXG5jb25zdCBERUZBVUxUX0NPTkZJRyA9IHtcclxuICAgIHBvc2l0aW9uOiAnYm90dG9tLXJpZ2h0JyxcclxuICAgIG1heFRvYXN0czogNSxcclxuICAgIGRlZmF1bHREdXJhdGlvbk1zOiA1MDAwLFxyXG4gICAgekluZGV4OiAxMTAwMCxcclxuICAgIGFyaWFMaXZlOiAncG9saXRlJyxcclxuICAgIGdhcDogOCxcclxuICAgIGRlZHVwZTogZmFsc2UsXHJcbiAgICBjb250YWluZXJDbGFzczogJycsXHJcbiAgICBvZmZzZXQ6IDBcclxufTtcclxuXHJcbi8qKlxyXG4gKiBDcmVhdGUgYW4gZWxlbWVudCB3aXRoIGNsYXNzZXNcclxuICovXHJcbmZ1bmN0aW9uIGNyZWF0ZUVsKHRhZywgY2xhc3NOYW1lcykge1xyXG4gICAgY29uc3QgZWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KHRhZyk7XHJcbiAgICBpZiAoY2xhc3NOYW1lcykge1xyXG4gICAgICAgIGNsYXNzTmFtZXMuc3BsaXQoJyAnKS5maWx0ZXIoQm9vbGVhbikuZm9yRWFjaChjID0+IGVsLmNsYXNzTGlzdC5hZGQoYykpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGVsO1xyXG59XHJcblxyXG4vKipcclxuICogTm9ybWFsaXplIHBsYWNlbWVudCBzeW5vbnltcyB0byBDU1MgdmFsdWVzXHJcbiAqIEBwYXJhbSB7c3RyaW5nfSBwbGFjZW1lbnRcclxuICogQHJldHVybnMgeyd0b3AnfCdyaWdodCd8J2JvdHRvbSd8J2xlZnQnfVxyXG4gKi9cclxuZnVuY3Rpb24gbm9ybWFsaXplUGxhY2VtZW50KHBsYWNlbWVudCkge1xyXG4gICAgY29uc3Qgc3lub255bXMgPSB7XHJcbiAgICAgICAgJ2Fib3ZlJzogJ3RvcCcsXHJcbiAgICAgICAgJ2JlbG93JzogJ2JvdHRvbScsXHJcbiAgICAgICAgJ2JlZm9yZSc6ICdsZWZ0JyxcclxuICAgICAgICAnYWZ0ZXInOiAncmlnaHQnXHJcbiAgICB9O1xyXG4gICAgcmV0dXJuIHN5bm9ueW1zW3BsYWNlbWVudF0gfHwgcGxhY2VtZW50O1xyXG59XHJcblxyXG4vKipcclxuICogRGV0ZXJtaW5lIGZsb3cgZGlyZWN0aW9uIGJhc2VkIG9uIHBvc2l0aW9uXHJcbiAqIEBwYXJhbSB7UG9zaXRpb259IHBvc2l0aW9uXHJcbiAqIEByZXR1cm5zIHsndXAnfCdkb3duJ31cclxuICovXHJcbmZ1bmN0aW9uIGRldGVybWluZUZsb3cocG9zaXRpb24pIHtcclxuICAgIGlmICh0eXBlb2YgcG9zaXRpb24gPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgLy8gU3RyaW5nIHBvc2l0aW9uczogdG9wID0gdXAsIGJvdHRvbSA9IGRvd25cclxuICAgICAgICBpZiAocG9zaXRpb24uaW5jbHVkZXMoJ3RvcCcpKSByZXR1cm4gJ3VwJztcclxuICAgICAgICBpZiAocG9zaXRpb24uaW5jbHVkZXMoJ2JvdHRvbScpKSByZXR1cm4gJ2Rvd24nO1xyXG4gICAgICAgIHJldHVybiAnZG93bic7IC8vIGRlZmF1bHRcclxuICAgIH1cclxuICAgIFxyXG4gICAgaWYgKHR5cGVvZiBwb3NpdGlvbiA9PT0gJ29iamVjdCcgJiYgcG9zaXRpb24gIT09IG51bGwpIHtcclxuICAgICAgICBjb25zdCB0eXBlID0gcG9zaXRpb24udHlwZSB8fCAocG9zaXRpb24ueCB8fCBwb3NpdGlvbi55ID8gJ3N0aWNreScgOiBudWxsKTtcclxuICAgICAgICBcclxuICAgICAgICBpZiAodHlwZSA9PT0gJ3N0aWNreScgfHwgKCF0eXBlICYmIChwb3NpdGlvbi54IHx8IHBvc2l0aW9uLnkpKSkge1xyXG4gICAgICAgICAgICAvLyBTdGlja3k6IGRldGVybWluZSBiYXNlZCBvbiB5IGNvb3JkaW5hdGVcclxuICAgICAgICAgICAgaWYgKHBvc2l0aW9uLnkgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgLy8gSWYgeSBzdGFydHMgd2l0aCAnLScgb3IgaXMgYSBzbWFsbCB2YWx1ZSwgbGlrZWx5IHRvcCAodXApXHJcbiAgICAgICAgICAgICAgICAvLyBJZiB5IGlzIGEgbGFyZ2UgdmFsdWUgb3IgcGVyY2VudGFnZSwgbGlrZWx5IGJvdHRvbSAoZG93bilcclxuICAgICAgICAgICAgICAgIGlmIChwb3NpdGlvbi55LnN0YXJ0c1dpdGgoJy0nKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIE5lZ2F0aXZlID0gZnJvbSBib3R0b20sIHNvIGZsb3cgZG93blxyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAnZG93bic7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBjb25zdCBudW0gPSBwYXJzZUZsb2F0KHBvc2l0aW9uLnkpO1xyXG4gICAgICAgICAgICAgICAgaWYgKCFpc05hTihudW0pKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gSWYgeSA8IDUwJSBvZiB2aWV3cG9ydCBoZWlnaHQsIGxpa2VseSB0b3AgKHVwKVxyXG4gICAgICAgICAgICAgICAgICAgIC8vIE90aGVyd2lzZSBsaWtlbHkgYm90dG9tIChkb3duKVxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChwb3NpdGlvbi55LmluY2x1ZGVzKCclJykpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bSA8IDUwID8gJ3VwJyA6ICdkb3duJztcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gRm9yIHB4IHZhbHVlcywgYXNzdW1lIDwgNDAwcHggaXMgdG9wICh1cClcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVtIDwgNDAwID8gJ3VwJyA6ICdkb3duJztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gJ2Rvd24nOyAvLyBkZWZhdWx0XHJcbiAgICAgICAgfVxyXG4gICAgICAgIFxyXG4gICAgICAgIGlmICh0eXBlID09PSAnYW5jaG9yZWQnICYmIHBvc2l0aW9uLnBsYWNlbWVudCkge1xyXG4gICAgICAgICAgICAvLyBBbmNob3JlZDogcGxhY2VtZW50IGRldGVybWluZXMgZmxvd1xyXG4gICAgICAgICAgICBjb25zdCBwbGFjZW1lbnQgPSBub3JtYWxpemVQbGFjZW1lbnQocG9zaXRpb24ucGxhY2VtZW50KTtcclxuICAgICAgICAgICAgaWYgKHBsYWNlbWVudCA9PT0gJ3RvcCcgfHwgcGxhY2VtZW50ID09PSAnYWJvdmUnKSByZXR1cm4gJ3VwJztcclxuICAgICAgICAgICAgaWYgKHBsYWNlbWVudCA9PT0gJ2JvdHRvbScgfHwgcGxhY2VtZW50ID09PSAnYmVsb3cnKSByZXR1cm4gJ2Rvd24nO1xyXG4gICAgICAgICAgICAvLyBGb3IgbGVmdC9yaWdodCwgZGVmYXVsdCB0byBkb3duXHJcbiAgICAgICAgICAgIHJldHVybiAnZG93bic7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIFxyXG4gICAgICAgIGlmICh0eXBlID09PSAncmVsYXRpdmUnKSB7XHJcbiAgICAgICAgICAgIC8vIFJlbGF0aXZlOiBkZXRlcm1pbmUgYmFzZWQgb24geSBvZmZzZXRcclxuICAgICAgICAgICAgaWYgKHBvc2l0aW9uLnkgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbnVtID0gcGFyc2VGbG9hdChwb3NpdGlvbi55KTtcclxuICAgICAgICAgICAgICAgIGlmICghaXNOYU4obnVtKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIE5lZ2F0aXZlIHkgPSBhYm92ZSBlbGVtZW50ID0gZmxvdyB1cFxyXG4gICAgICAgICAgICAgICAgICAgIC8vIFBvc2l0aXZlIHkgPSBiZWxvdyBlbGVtZW50ID0gZmxvdyBkb3duXHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bSA8IDAgPyAndXAnIDogJ2Rvd24nO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiAnZG93bic7IC8vIGRlZmF1bHRcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBcclxuICAgIHJldHVybiAnZG93bic7IC8vIGRlZmF1bHRcclxufVxyXG5cclxuLyoqXHJcbiAqIEdhcmJhZ2UgY29sbGVjdGlvbjogcmVtb3ZlIGVtcHR5IHVubWFuYWdlZCBjb250YWluZXJzXHJcbiAqL1xyXG5mdW5jdGlvbiBjbGVhbnVwRW1wdHlDb250YWluZXJzKCkge1xyXG4gICAgaWYgKCFpc0Jyb3dzZXIpIHJldHVybjtcclxuICAgIFxyXG4gICAgY29uc3QgY29udGFpbmVycyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5BUFgtdG9hc3QtY29udGFpbmVyOm5vdChbZGF0YS1hcHgtdG9hc3QtbWFuYWdlZD1cInRydWVcIl0pJyk7XHJcbiAgICBjb250YWluZXJzLmZvckVhY2goY29udGFpbmVyID0+IHtcclxuICAgICAgICAvLyBDaGVjayBpZiBjb250YWluZXIgaXMgZW1wdHkgKG5vIHRvYXN0cylcclxuICAgICAgICBpZiAoY29udGFpbmVyLmNoaWxkcmVuLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICAgICAgICBjb25zdCBwb3NpdGlvbktleSA9IGNvbnRhaW5lci5nZXRBdHRyaWJ1dGUoJ2RhdGEtYXB4LXRvYXN0LXBvc2l0aW9uJyk7XHJcbiAgICAgICAgICAgIGlmIChwb3NpdGlvbktleSkge1xyXG4gICAgICAgICAgICAgICAgX2NvbnRhaW5lckNhY2hlLmRlbGV0ZShwb3NpdGlvbktleSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY29udGFpbmVyLnJlbW92ZSgpO1xyXG4gICAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgXHJcbiAgICAvLyBDbGVhbiB1cCB3cmFwcGVyIGlmIGl0J3MgZW1wdHkgKGFsbCBjb250YWluZXJzIHJlbW92ZWQpXHJcbiAgICBpZiAoX3RvYXN0V3JhcHBlciAmJiBfdG9hc3RXcmFwcGVyLmNoaWxkcmVuLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICAgIF90b2FzdFdyYXBwZXIucmVtb3ZlKCk7XHJcbiAgICAgICAgX3RvYXN0V3JhcHBlciA9IG51bGw7XHJcbiAgICB9XHJcbiAgICBcclxuICAgIF9nY1RpbWVvdXRJZCA9IG51bGw7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBTY2hlZHVsZSBnYXJiYWdlIGNvbGxlY3Rpb24gZm9yIGVtcHR5IHVubWFuYWdlZCBjb250YWluZXJzXHJcbiAqL1xyXG5mdW5jdGlvbiBzY2hlZHVsZUdhcmJhZ2VDb2xsZWN0aW9uKCkge1xyXG4gICAgaWYgKF9nY1RpbWVvdXRJZCkge1xyXG4gICAgICAgIGNsZWFyVGltZW91dChfZ2NUaW1lb3V0SWQpO1xyXG4gICAgfVxyXG4gICAgX2djVGltZW91dElkID0gc2V0VGltZW91dChjbGVhbnVwRW1wdHlDb250YWluZXJzLCBHQ19ERUxBWV9NUyk7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBGaW5kIGFsbCBzY3JvbGxhYmxlIHBhcmVudCBlbGVtZW50c1xyXG4gKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbGVtZW50XHJcbiAqIEByZXR1cm5zIHtIVE1MRWxlbWVudFtdfVxyXG4gKi9cclxuZnVuY3Rpb24gZmluZFNjcm9sbGFibGVQYXJlbnRzKGVsZW1lbnQpIHtcclxuICAgIGNvbnN0IHNjcm9sbGFibGVzID0gW107XHJcbiAgICBsZXQgY3VycmVudCA9IGVsZW1lbnQucGFyZW50RWxlbWVudDtcclxuICAgIFxyXG4gICAgd2hpbGUgKGN1cnJlbnQgJiYgY3VycmVudCAhPT0gZG9jdW1lbnQuYm9keSAmJiBjdXJyZW50ICE9PSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpIHtcclxuICAgICAgICBjb25zdCBzdHlsZSA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGN1cnJlbnQpO1xyXG4gICAgICAgIGNvbnN0IG92ZXJmbG93ID0gc3R5bGUub3ZlcmZsb3cgKyBzdHlsZS5vdmVyZmxvd1kgKyBzdHlsZS5vdmVyZmxvd1g7XHJcbiAgICAgICAgXHJcbiAgICAgICAgaWYgKG92ZXJmbG93LmluY2x1ZGVzKCdzY3JvbGwnKSB8fCBvdmVyZmxvdy5pbmNsdWRlcygnYXV0bycpKSB7XHJcbiAgICAgICAgICAgIHNjcm9sbGFibGVzLnB1c2goY3VycmVudCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIFxyXG4gICAgICAgIGN1cnJlbnQgPSBjdXJyZW50LnBhcmVudEVsZW1lbnQ7XHJcbiAgICB9XHJcbiAgICBcclxuICAgIHJldHVybiBzY3JvbGxhYmxlcztcclxufVxyXG5cclxuLyoqXHJcbiAqIEhhc2ggYW4gZWxlbWVudCB0byBjcmVhdGUgYSB1bmlxdWUgaWRlbnRpZmllclxyXG4gKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbFxyXG4gKiBAcmV0dXJucyB7c3RyaW5nfVxyXG4gKi9cclxuZnVuY3Rpb24gaGFzaEVsZW1lbnQoZWwpIHtcclxuICAgIGNvbnN0IHJlY3QgPSBlbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcclxuICAgIGNvbnN0IHN0ciA9IGAke2VsLnRhZ05hbWV9XyR7cmVjdC5sZWZ0fV8ke3JlY3QudG9wfV8ke3JlY3Qud2lkdGh9XyR7cmVjdC5oZWlnaHR9YDtcclxuICAgIGxldCBoYXNoID0gMDtcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc3RyLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgY29uc3QgY2hhciA9IHN0ci5jaGFyQ29kZUF0KGkpO1xyXG4gICAgICAgIGhhc2ggPSAoKGhhc2ggPDwgNSkgLSBoYXNoKSArIGNoYXI7XHJcbiAgICAgICAgaGFzaCA9IGhhc2ggJiBoYXNoOyAvLyBDb252ZXJ0IHRvIDMyYml0IGludGVnZXJcclxuICAgIH1cclxuICAgIHJldHVybiBNYXRoLmFicyhoYXNoKS50b1N0cmluZygzNik7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBTZXJpYWxpemUgcG9zaXRpb24gb3B0aW9ucyBpbnRvIGEgdW5pcXVlIGtleVxyXG4gKiBAcGFyYW0ge1Bvc2l0aW9ufSBwb3NpdGlvblxyXG4gKiBAcmV0dXJucyB7c3RyaW5nfVxyXG4gKi9cclxuZnVuY3Rpb24gc2VyaWFsaXplUG9zaXRpb24ocG9zaXRpb24pIHtcclxuICAgIGlmICh0eXBlb2YgcG9zaXRpb24gPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgcmV0dXJuIGBzOiR7cG9zaXRpb259YDtcclxuICAgIH1cclxuICAgIFxyXG4gICAgaWYgKHR5cGVvZiBwb3NpdGlvbiA9PT0gJ29iamVjdCcgJiYgcG9zaXRpb24gIT09IG51bGwpIHtcclxuICAgICAgICBjb25zdCBwYXJ0cyA9IFtdO1xyXG4gICAgICAgIFxyXG4gICAgICAgIC8vIFR5cGUgKGRlZmF1bHQ6IHN0aWNreSBpZiB4L3kgcHJvdmlkZWQpXHJcbiAgICAgICAgY29uc3QgdHlwZSA9IHBvc2l0aW9uLnR5cGUgfHwgKHBvc2l0aW9uLnggfHwgcG9zaXRpb24ueSA/ICdzdGlja3knIDogbnVsbCk7XHJcbiAgICAgICAgaWYgKHR5cGUpIHBhcnRzLnB1c2goYHQ6JHt0eXBlfWApO1xyXG4gICAgICAgIFxyXG4gICAgICAgIC8vIENvb3JkaW5hdGVzXHJcbiAgICAgICAgaWYgKHBvc2l0aW9uLnggIT09IHVuZGVmaW5lZCkgcGFydHMucHVzaChgeDoke3Bvc2l0aW9uLnh9YCk7XHJcbiAgICAgICAgaWYgKHBvc2l0aW9uLnkgIT09IHVuZGVmaW5lZCkgcGFydHMucHVzaChgeToke3Bvc2l0aW9uLnl9YCk7XHJcbiAgICAgICAgXHJcbiAgICAgICAgLy8gRm9yIHJlbGF0aXZlL2FuY2hvcmVkOiB1c2UgZWxlbWVudCBJRCBvciBoYXNoXHJcbiAgICAgICAgaWYgKHBvc2l0aW9uLmVsZW1lbnQpIHtcclxuICAgICAgICAgICAgY29uc3QgZWxlbWVudElkID0gcG9zaXRpb24uZWxlbWVudC5pZCB8fCBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbi5lbGVtZW50LmRhdGFzZXQ/LmFweFRvYXN0QW5jaG9ySWQgfHxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgZWxfJHtoYXNoRWxlbWVudChwb3NpdGlvbi5lbGVtZW50KX1gO1xyXG4gICAgICAgICAgICBwYXJ0cy5wdXNoKGBlbDoke2VsZW1lbnRJZH1gKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgXHJcbiAgICAgICAgaWYgKHBvc2l0aW9uLnBsYWNlbWVudCkge1xyXG4gICAgICAgICAgICAvLyBOb3JtYWxpemUgcGxhY2VtZW50IGZvciBzZXJpYWxpemF0aW9uICh1c2UgQ1NTIHZhbHVlcylcclxuICAgICAgICAgICAgY29uc3Qgbm9ybWFsaXplZCA9IG5vcm1hbGl6ZVBsYWNlbWVudChwb3NpdGlvbi5wbGFjZW1lbnQpO1xyXG4gICAgICAgICAgICBwYXJ0cy5wdXNoKGBwOiR7bm9ybWFsaXplZH1gKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHBvc2l0aW9uLmdhcCAhPT0gdW5kZWZpbmVkKSBwYXJ0cy5wdXNoKGBnOiR7cG9zaXRpb24uZ2FwfWApO1xyXG4gICAgICAgIGlmIChwb3NpdGlvbi51c2VOYXRpdmVDU1MpIHBhcnRzLnB1c2goYG5hdGl2ZTp0cnVlYCk7XHJcbiAgICAgICAgXHJcbiAgICAgICAgcmV0dXJuIGBvOiR7cGFydHMuam9pbignfCcpfWA7XHJcbiAgICB9XHJcbiAgICBcclxuICAgIHJldHVybiAnczpib3R0b20tcmlnaHQnO1xyXG59XHJcblxyXG4vKipcclxuICogVG9hc3RNYW5hZ2VyIGNsYXNzXHJcbiAqL1xyXG5jbGFzcyBUb2FzdE1hbmFnZXIge1xyXG4gICAgLyoqIEBwYXJhbSB7UGFydGlhbDxUb2FzdENvbmZpZz49fSBjb25maWcgKi9cclxuICAgIGNvbnN0cnVjdG9yKGNvbmZpZykge1xyXG4gICAgICAgIC8qKiBAdHlwZSB7VG9hc3RDb25maWd9ICovXHJcbiAgICAgICAgdGhpcy5jb25maWcgPSB7IC4uLkRFRkFVTFRfQ09ORklHLCAuLi4oY29uZmlnIHx8IHt9KSB9O1xyXG4gICAgICAgIC8qKiBAdHlwZSB7SFRNTEVsZW1lbnR8bnVsbH0gKi9cclxuICAgICAgICB0aGlzLmNvbnRhaW5lciA9IG51bGw7XHJcbiAgICAgICAgLyoqIEB0eXBlIHtNYXA8c3RyaW5nLCBUb2FzdFJlZj59ICovXHJcbiAgICAgICAgdGhpcy5pZFRvUmVmID0gbmV3IE1hcCgpO1xyXG4gICAgICAgIC8qKiBAdHlwZSB7VG9hc3RSZWZbXX0gKi9cclxuICAgICAgICB0aGlzLm9wZW4gPSBbXTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogQHBhcmFtIHtQYXJ0aWFsPFRvYXN0Q29uZmlnPn0gY29uZmlnICovXHJcbiAgICBjb25maWd1cmUoY29uZmlnKSB7XHJcbiAgICAgICAgdGhpcy5jb25maWcgPSB7IC4uLnRoaXMuY29uZmlnLCAuLi4oY29uZmlnIHx8IHt9KSB9O1xyXG4gICAgICAgIGlmICh0aGlzLmNvbnRhaW5lcikgdGhpcy5hcHBseUNvbnRhaW5lckNvbmZpZygpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAcGFyYW0geydwb2xpdGUnfCdhc3NlcnRpdmUnfCdvZmYnfSBtb2RlICovXHJcbiAgICBzZXRBcmlhTGl2ZShtb2RlKSB7IHRoaXMuY29uZmlndXJlKHsgYXJpYUxpdmU6IG1vZGUgfSk7IH1cclxuXHJcbiAgICAvKiogQHJldHVybnMge1RvYXN0UmVmW119ICovXHJcbiAgICBnZXRPcGVuVG9hc3RzKCkgeyByZXR1cm4gdGhpcy5vcGVuLnNsaWNlKCk7IH1cclxuXHJcbiAgICAvKiogQHBhcmFtIHtUb2FzdE9wdGlvbnN9IG9wdHMgKi9cclxuICAgIHNob3cob3B0cykge1xyXG4gICAgICAgIGlmICghaXNCcm93c2VyKSByZXR1cm4gLyoqIEB0eXBlIHthbnl9ICovKG51bGwpO1xyXG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB0aGlzLm5vcm1hbGl6ZU9wdGlvbnMob3B0cyk7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmNvbmZpZy5kZWR1cGUgJiYgb3B0aW9ucy5pZCAmJiB0aGlzLmlkVG9SZWYuaGFzKG9wdGlvbnMuaWQpKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHJlZiA9IHRoaXMuaWRUb1JlZi5nZXQob3B0aW9ucy5pZCk7XHJcbiAgICAgICAgICAgIHJlZi51cGRhdGUob3B0aW9ucyk7XHJcbiAgICAgICAgICAgIHJldHVybiByZWY7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBEZXRlcm1pbmUgcG9zaXRpb24gYW5kIGZsb3cgZm9yIHRoaXMgdG9hc3QgKG9wdGlvbnMgdGFrZSBwcmVjZWRlbmNlIG92ZXIgY29uZmlnKVxyXG4gICAgICAgIGNvbnN0IHBvc2l0aW9uID0gb3B0aW9ucy5wb3NpdGlvbiB8fCB0aGlzLmNvbmZpZy5wb3NpdGlvbiB8fCAnYm90dG9tLXJpZ2h0JztcclxuICAgICAgICBjb25zdCBmbG93ID0gb3B0aW9ucy5mbG93ICE9PSB1bmRlZmluZWQgPyBvcHRpb25zLmZsb3cgOiAodGhpcy5jb25maWcuZmxvdyAhPT0gdW5kZWZpbmVkID8gdGhpcy5jb25maWcuZmxvdyA6ICdhdXRvJyk7XHJcbiAgICAgICAgY29uc3QgZmluYWxGbG93ID0gZmxvdyA9PT0gJ2F1dG8nID8gZGV0ZXJtaW5lRmxvdyhwb3NpdGlvbikgOiBmbG93O1xyXG4gICAgICAgIFxyXG4gICAgICAgIC8vIEVuc3VyZSBkZWZhdWx0IGNvbnRhaW5lciBpcyBzZXQgKGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5KVxyXG4gICAgICAgIHRoaXMuZW5zdXJlQ29udGFpbmVyKCk7XHJcblxyXG4gICAgICAgIGNvbnN0IHRvYXN0RWwgPSBjcmVhdGVFbCgnZGl2JywgYEFQWC10b2FzdCBBUFgtdG9hc3QtLSR7b3B0aW9ucy50eXBlfWApO1xyXG4gICAgICAgIHRvYXN0RWwuc2V0QXR0cmlidXRlKCdyb2xlJywgJ3N0YXR1cycpO1xyXG4gICAgICAgIC8vIFByaW9yaXR5OiBvcHRpb25zLmlkID4gY29uZmlnLmlkID4gYXV0by1nZW5lcmF0ZWRcclxuICAgICAgICBjb25zdCB0b2FzdElkID0gb3B0aW9ucy5pZCB8fCBgdF8ke0RhdGUubm93KCl9XyR7TWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc2xpY2UoMiwgOCl9YDtcclxuICAgICAgICB0b2FzdEVsLmRhdGFzZXQudG9hc3RJZCA9IHRvYXN0SWQ7XHJcbiAgICAgICAgaWYgKG9wdGlvbnMuY2xhc3NOYW1lKSB0b2FzdEVsLmNsYXNzTmFtZSArPSBgICR7b3B0aW9ucy5jbGFzc05hbWV9YDtcclxuXHJcbiAgICAgICAgY29uc3QgY29udGVudEVsID0gY3JlYXRlRWwoJ2RpdicsICdBUFgtdG9hc3RfX2NvbnRlbnQnKTtcclxuICAgICAgICBpZiAodHlwZW9mIG9wdGlvbnMubWVzc2FnZSA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgICAgICAgY29udGVudEVsLnRleHRDb250ZW50ID0gb3B0aW9ucy5tZXNzYWdlO1xyXG4gICAgICAgIH0gZWxzZSBpZiAob3B0aW9ucy5tZXNzYWdlKSB7XHJcbiAgICAgICAgICAgIGNvbnRlbnRFbC5hcHBlbmRDaGlsZChvcHRpb25zLm1lc3NhZ2UpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0b2FzdEVsLmFwcGVuZENoaWxkKGNvbnRlbnRFbCk7XHJcblxyXG4gICAgICAgIGxldCBjbG9zZUJ0biA9IG51bGw7XHJcbiAgICAgICAgaWYgKG9wdGlvbnMuZGlzbWlzc2libGUgIT09IGZhbHNlKSB7XHJcbiAgICAgICAgICAgIGNsb3NlQnRuID0gY3JlYXRlRWwoJ2J1dHRvbicsICdBUFgtdG9hc3RfX2Nsb3NlJyk7XHJcbiAgICAgICAgICAgIGNsb3NlQnRuLnNldEF0dHJpYnV0ZSgnYXJpYS1sYWJlbCcsICdDbG9zZScpO1xyXG4gICAgICAgICAgICBjbG9zZUJ0bi50eXBlID0gJ2J1dHRvbic7XHJcbiAgICAgICAgICAgIHRvYXN0RWwuYXBwZW5kQ2hpbGQoY2xvc2VCdG4pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gR2V0IG9yIGNyZWF0ZSBjb250YWluZXIgZm9yIHRoaXMgc3BlY2lmaWMgcG9zaXRpb25cclxuICAgICAgICBsZXQgY29udGFpbmVyID0gbnVsbDtcclxuICAgICAgICBsZXQgcG9zaXRpb25VcGRhdGVGbiA9IG51bGw7XHJcbiAgICAgICAgbGV0IHBvc2l0aW9uQ2xlYW51cCA9IG51bGw7XHJcbiAgICAgICAgbGV0IG9yaWdpbmFsRWxlbWVudFN0eWxlID0gbnVsbDtcclxuICAgICAgICBcclxuICAgICAgICBpZiAocG9zaXRpb24gJiYgdHlwZW9mIHBvc2l0aW9uID09PSAnb2JqZWN0JyAmJiBwb3NpdGlvbiAhPT0gbnVsbCkge1xyXG4gICAgICAgICAgICBjb25zdCB0eXBlID0gcG9zaXRpb24udHlwZSB8fCAocG9zaXRpb24ueCB8fCBwb3NpdGlvbi55ID8gJ3N0aWNreScgOiBudWxsKTtcclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIGlmIChwb3NpdGlvbi51c2VOYXRpdmVDU1MgJiYgKHR5cGUgPT09ICdyZWxhdGl2ZScgfHwgdHlwZSA9PT0gJ2FuY2hvcmVkJykgJiYgcG9zaXRpb24uZWxlbWVudCkge1xyXG4gICAgICAgICAgICAgICAgLy8gdXNlTmF0aXZlQ1NTOiB0cnVlIC0gY3JlYXRlIGNvbnRhaW5lciBpbiB0YXJnZXQgZWxlbWVudCB1c2luZyBuYXRpdmUgQ1NTXHJcbiAgICAgICAgICAgICAgICBjb25zdCB0YXJnZXRFbCA9IHBvc2l0aW9uLmVsZW1lbnQ7XHJcbiAgICAgICAgICAgICAgICBvcmlnaW5hbEVsZW1lbnRTdHlsZSA9IHRhcmdldEVsLnN0eWxlLnBvc2l0aW9uO1xyXG4gICAgICAgICAgICAgICAgdGFyZ2V0RWwuc3R5bGUucG9zaXRpb24gPSAncmVsYXRpdmUnO1xyXG4gICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAvLyBDcmVhdGUgYSBjb250YWluZXIgZm9yIHN0YWNraW5nIHRvYXN0cyAocmV1c2UgaWYgZXhpc3RzKVxyXG4gICAgICAgICAgICAgICAgY29uc3QgcG9zaXRpb25LZXkgPSBzZXJpYWxpemVQb3NpdGlvbihwb3NpdGlvbik7XHJcbiAgICAgICAgICAgICAgICBsZXQgbmF0aXZlQ29udGFpbmVyID0gdGFyZ2V0RWwucXVlcnlTZWxlY3RvcihgW2RhdGEtYXB4LXRvYXN0LXBvc2l0aW9uPVwiJHtwb3NpdGlvbktleX1cIl1gKTtcclxuICAgICAgICAgICAgICAgIGlmICghbmF0aXZlQ29udGFpbmVyKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbmF0aXZlQ29udGFpbmVyID0gY3JlYXRlRWwoJ2RpdicsICdBUFgtdG9hc3QtY29udGFpbmVyIEFQWC10b2FzdC1jb250YWluZXItbmF0aXZlJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgbmF0aXZlQ29udGFpbmVyLnNldEF0dHJpYnV0ZSgnZGF0YS1hcHgtdG9hc3QtcG9zaXRpb24nLCBwb3NpdGlvbktleSk7XHJcbiAgICAgICAgICAgICAgICAgICAgbmF0aXZlQ29udGFpbmVyLnN0eWxlLnBvc2l0aW9uID0gJ2Fic29sdXRlJztcclxuICAgICAgICAgICAgICAgICAgICBuYXRpdmVDb250YWluZXIuc3R5bGUuekluZGV4ID0gU3RyaW5nKHRoaXMuY29uZmlnLnpJbmRleCk7XHJcbiAgICAgICAgICAgICAgICAgICAgbmF0aXZlQ29udGFpbmVyLnN0eWxlLmdhcCA9IGAke3RoaXMuY29uZmlnLmdhcH1weGA7XHJcbiAgICAgICAgICAgICAgICAgICAgbmF0aXZlQ29udGFpbmVyLnNldEF0dHJpYnV0ZSgnYXJpYS1saXZlJywgU3RyaW5nKHRoaXMuY29uZmlnLmFyaWFMaXZlKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgbmF0aXZlQ29udGFpbmVyLnN0eWxlLmZsZXhEaXJlY3Rpb24gPSBmaW5hbEZsb3cgPT09ICd1cCcgPyAnY29sdW1uLXJldmVyc2UnIDogJ2NvbHVtbic7XHJcbiAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gQXBwbHkgcG9zaXRpb25pbmcgdG8gY29udGFpbmVyXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGUgPT09ICdyZWxhdGl2ZScpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gUmVsYXRpdmU6IHVzZSB4L3kgZGlyZWN0bHlcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBvc2l0aW9uLnggIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBvc2l0aW9uLnguc3RhcnRzV2l0aCgnLScpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmF0aXZlQ29udGFpbmVyLnN0eWxlLnJpZ2h0ID0gcG9zaXRpb24ueC5zdWJzdHJpbmcoMSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hdGl2ZUNvbnRhaW5lci5zdHlsZS5sZWZ0ID0gcG9zaXRpb24ueDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocG9zaXRpb24ueSAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocG9zaXRpb24ueS5zdGFydHNXaXRoKCctJykpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYXRpdmVDb250YWluZXIuc3R5bGUuYm90dG9tID0gcG9zaXRpb24ueS5zdWJzdHJpbmcoMSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hdGl2ZUNvbnRhaW5lci5zdHlsZS50b3AgPSBwb3NpdGlvbi55O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlID09PSAnYW5jaG9yZWQnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFuY2hvcmVkOiBwb3NpdGlvbiBvdXRzaWRlIHRoZSBlbGVtZW50IHVzaW5nIDEwMCUgKGVsZW1lbnQgc2l6ZSkgKyBnYXBcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGxhY2VtZW50ID0gbm9ybWFsaXplUGxhY2VtZW50KHBvc2l0aW9uLnBsYWNlbWVudCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdhcCA9IHBvc2l0aW9uLmdhcCB8fCAnMWVtJztcclxuICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAocGxhY2VtZW50KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICd0b3AnOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hdGl2ZUNvbnRhaW5lci5zdHlsZS5ib3R0b20gPSBgY2FsYygxMDAlICsgJHtnYXB9KWA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmF0aXZlQ29udGFpbmVyLnN0eWxlLmxlZnQgPSAnMCc7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdib3R0b20nOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hdGl2ZUNvbnRhaW5lci5zdHlsZS50b3AgPSBgY2FsYygxMDAlICsgJHtnYXB9KWA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmF0aXZlQ29udGFpbmVyLnN0eWxlLmxlZnQgPSAnMCc7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdsZWZ0JzpcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYXRpdmVDb250YWluZXIuc3R5bGUucmlnaHQgPSBgY2FsYygxMDAlICsgJHtnYXB9KWA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmF0aXZlQ29udGFpbmVyLnN0eWxlLnRvcCA9ICcwJztcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ3JpZ2h0JzpcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYXRpdmVDb250YWluZXIuc3R5bGUubGVmdCA9IGBjYWxjKDEwMCUgKyAke2dhcH0pYDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYXRpdmVDb250YWluZXIuc3R5bGUudG9wID0gJzAnO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgIHRhcmdldEVsLmFwcGVuZENoaWxkKG5hdGl2ZUNvbnRhaW5lcik7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIFVwZGF0ZSBmbG93IGRpcmVjdGlvbiBpZiBjb250YWluZXIgZXhpc3RzXHJcbiAgICAgICAgICAgICAgICAgICAgbmF0aXZlQ29udGFpbmVyLnN0eWxlLmZsZXhEaXJlY3Rpb24gPSBmaW5hbEZsb3cgPT09ICd1cCcgPyAnY29sdW1uLXJldmVyc2UnIDogJ2NvbHVtbic7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgIGNvbnRhaW5lciA9IG5hdGl2ZUNvbnRhaW5lcjtcclxuICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgcG9zaXRpb25DbGVhbnVwID0gKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0YXJnZXRFbCAmJiB0YXJnZXRFbC5wYXJlbnRFbGVtZW50KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldEVsLnN0eWxlLnBvc2l0aW9uID0gb3JpZ2luYWxFbGVtZW50U3R5bGUgfHwgJyc7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJlbW92ZSBuYXRpdmUgY29udGFpbmVyIGlmIGVtcHR5XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYXRpdmVDb250YWluZXIgJiYgbmF0aXZlQ29udGFpbmVyLmNoaWxkcmVuLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcG9zaXRpb25LZXkgPSBuYXRpdmVDb250YWluZXIuZ2V0QXR0cmlidXRlKCdkYXRhLWFweC10b2FzdC1wb3NpdGlvbicpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBvc2l0aW9uS2V5KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2NvbnRhaW5lckNhY2hlLmRlbGV0ZShwb3NpdGlvbktleSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYXRpdmVDb250YWluZXIucmVtb3ZlKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgLy8gRGVmYXVsdDogZ2V0IG9yIGNyZWF0ZSBjb250YWluZXIgZm9yIHRoaXMgcG9zaXRpb25cclxuICAgICAgICAgICAgICAgIGNvbnRhaW5lciA9IHRoaXMuZ2V0Q29udGFpbmVyRm9yUG9zaXRpb24ocG9zaXRpb24sIGZpbmFsRmxvdyk7XHJcbiAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgIGNvbnN0IHVwZGF0ZUNvbnRhaW5lclBvc2l0aW9uID0gKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0eWxlcyA9IHRoaXMuY2FsY3VsYXRlUG9zaXRpb24ocG9zaXRpb24sIGNvbnRhaW5lcik7XHJcbiAgICAgICAgICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihjb250YWluZXIuc3R5bGUsIHN0eWxlcyk7XHJcbiAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICB1cGRhdGVDb250YWluZXJQb3NpdGlvbigpO1xyXG4gICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAvLyBGb3IgcmVsYXRpdmUvYW5jaG9yZWQsIGxpc3RlbiB0byBzY3JvbGwvcmVzaXplXHJcbiAgICAgICAgICAgICAgICBpZiAoKHR5cGUgPT09ICdyZWxhdGl2ZScgfHwgdHlwZSA9PT0gJ2FuY2hvcmVkJykgJiYgcG9zaXRpb24uZWxlbWVudCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCByYWZJZCA9IG51bGw7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IGxhc3RVcGRhdGUgPSAwO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHRocm90dGxlTXMgPSAxNjsgLy8gfjYwZnBzXHJcbiAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdGhyb3R0bGVkVXBkYXRlID0gKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobm93IC0gbGFzdFVwZGF0ZSA8IHRocm90dGxlTXMpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyYWZJZCkgY2FuY2VsQW5pbWF0aW9uRnJhbWUocmFmSWQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFmSWQgPSByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZUNvbnRhaW5lclBvc2l0aW9uKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFzdFVwZGF0ZSA9IERhdGUubm93KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZUNvbnRhaW5lclBvc2l0aW9uKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXN0VXBkYXRlID0gbm93O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICAvLyBGaW5kIGFsbCBzY3JvbGxhYmxlIHBhcmVudHNcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBzY3JvbGxhYmxlUGFyZW50cyA9IGZpbmRTY3JvbGxhYmxlUGFyZW50cyhwb3NpdGlvbi5lbGVtZW50KTtcclxuICAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICAvLyBMaXN0ZW4gdG8gc2Nyb2xsIG9uIHdpbmRvdyBhbmQgYWxsIHNjcm9sbGFibGUgcGFyZW50c1xyXG4gICAgICAgICAgICAgICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdzY3JvbGwnLCB0aHJvdHRsZWRVcGRhdGUsIHsgcGFzc2l2ZTogdHJ1ZSB9KTtcclxuICAgICAgICAgICAgICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigncmVzaXplJywgdGhyb3R0bGVkVXBkYXRlLCB7IHBhc3NpdmU6IHRydWUgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gTGlzdGVuIHRvIHNjcm9sbCBvbiBhbGwgc2Nyb2xsYWJsZSBwYXJlbnQgZWxlbWVudHNcclxuICAgICAgICAgICAgICAgICAgICBzY3JvbGxhYmxlUGFyZW50cy5mb3JFYWNoKHBhcmVudCA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudC5hZGRFdmVudExpc3RlbmVyKCdzY3JvbGwnLCB0aHJvdHRsZWRVcGRhdGUsIHsgcGFzc2l2ZTogdHJ1ZSB9KTtcclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICAvLyBXYXRjaCBmb3IgZWxlbWVudCByZW1vdmFsXHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgb2JzZXJ2ZXIgPSBuZXcgTXV0YXRpb25PYnNlcnZlcigoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcG9zaXRpb24uZWxlbWVudC5wYXJlbnRFbGVtZW50KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWYuY2xvc2UoJ2FwaScpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgb2JzZXJ2ZXIub2JzZXJ2ZShkb2N1bWVudC5ib2R5LCB7IGNoaWxkTGlzdDogdHJ1ZSwgc3VidHJlZTogdHJ1ZSB9KTtcclxuICAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICBwb3NpdGlvblVwZGF0ZUZuID0gdXBkYXRlQ29udGFpbmVyUG9zaXRpb247XHJcbiAgICAgICAgICAgICAgICAgICAgcG9zaXRpb25DbGVhbnVwID0gKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgdGhyb3R0bGVkVXBkYXRlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIHRocm90dGxlZFVwZGF0ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNjcm9sbGFibGVQYXJlbnRzLmZvckVhY2gocGFyZW50ID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdzY3JvbGwnLCB0aHJvdHRsZWRVcGRhdGUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgb2JzZXJ2ZXIuZGlzY29ubmVjdCgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmFmSWQpIGNhbmNlbEFuaW1hdGlvbkZyYW1lKHJhZklkKTtcclxuICAgICAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgLy8gU3RyaW5nIHBvc2l0aW9uIC0gZ2V0IG9yIGNyZWF0ZSBjb250YWluZXIgZm9yIHRoaXMgcG9zaXRpb25cclxuICAgICAgICAgICAgY29udGFpbmVyID0gdGhpcy5nZXRDb250YWluZXJGb3JQb3NpdGlvbihwb3NpdGlvbiwgZmluYWxGbG93KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgXHJcbiAgICAgICAgLy8gQXBwZW5kIHRvYXN0IHRvIHRoZSBhcHByb3ByaWF0ZSBjb250YWluZXJcclxuICAgICAgICBpZiAoY29udGFpbmVyKSB7XHJcbiAgICAgICAgICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZCh0b2FzdEVsKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAvLyBGYWxsYmFjayB0byBkZWZhdWx0IGNvbnRhaW5lclxyXG4gICAgICAgICAgICB0aGlzLmNvbnRhaW5lci5hcHBlbmRDaGlsZCh0b2FzdEVsKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIEVudGVyIGFuaW1hdGlvblxyXG4gICAgICAgIHRvYXN0RWwuY2xhc3NMaXN0LmFkZCgnQVBYLXRvYXN0LS1lbnRlcicpO1xyXG4gICAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XHJcbiAgICAgICAgICAgIHRvYXN0RWwuY2xhc3NMaXN0LmFkZCgnQVBYLXRvYXN0LS1lbnRlci1hY3RpdmUnKTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgLy8gRXZlbnQgaGFuZGxpbmcgYW5kIHRpbWVyc1xyXG4gICAgICAgIGxldCByZW1haW5pbmcgPSBvcHRpb25zLmR1cmF0aW9uTXM7XHJcbiAgICAgICAgbGV0IHRpbWVySWQgPSBudWxsO1xyXG4gICAgICAgIGxldCBzdGFydFRzID0gbnVsbDtcclxuICAgICAgICBjb25zdCBoYW5kbGVycyA9IHsgY2xpY2s6IG5ldyBTZXQoKSwgY2xvc2U6IG5ldyBTZXQoKSB9O1xyXG5cclxuICAgICAgICBjb25zdCBzdGFydFRpbWVyID0gKCkgPT4ge1xyXG4gICAgICAgICAgICBpZiAoIXJlbWFpbmluZyB8fCByZW1haW5pbmcgPD0gMCkgcmV0dXJuOyAvLyBzdGlja3lcclxuICAgICAgICAgICAgc3RhcnRUcyA9IERhdGUubm93KCk7XHJcbiAgICAgICAgICAgIHRpbWVySWQgPSB3aW5kb3cuc2V0VGltZW91dCgoKSA9PiByZWYuY2xvc2UoJ3RpbWVvdXQnKSwgcmVtYWluaW5nKTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIGNvbnN0IHBhdXNlVGltZXIgPSAoKSA9PiB7XHJcbiAgICAgICAgICAgIGlmICh0aW1lcklkICE9IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIHdpbmRvdy5jbGVhclRpbWVvdXQodGltZXJJZCk7XHJcbiAgICAgICAgICAgICAgICB0aW1lcklkID0gbnVsbDtcclxuICAgICAgICAgICAgICAgIGlmIChzdGFydFRzICE9IG51bGwpIHJlbWFpbmluZyAtPSAoRGF0ZS5ub3coKSAtIHN0YXJ0VHMpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgLyoqIEB0eXBlIHtUb2FzdFJlZn0gKi9cclxuICAgICAgICBjb25zdCByZWYgPSB7XHJcbiAgICAgICAgICAgIGlkOiB0b2FzdElkLFxyXG4gICAgICAgICAgICBlbDogdG9hc3RFbCxcclxuICAgICAgICAgICAgY2xvc2U6IChyZWFzb24pID0+IHtcclxuICAgICAgICAgICAgICAgIGNsZWFudXAocmVhc29uIHx8ICdhcGknKTtcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgdXBkYXRlOiAocGFydGlhbCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbWVyZ2VkID0gdGhpcy5ub3JtYWxpemVPcHRpb25zKHsgLi4ub3B0aW9ucywgLi4ucGFydGlhbCB9KTtcclxuICAgICAgICAgICAgICAgIC8vIHVwZGF0ZSBjb250ZW50XHJcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIG1lcmdlZC5tZXNzYWdlID09PSAnc3RyaW5nJykge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnRlbnRFbC50ZXh0Q29udGVudCA9IG1lcmdlZC5tZXNzYWdlO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtZXJnZWQubWVzc2FnZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnRlbnRFbC5pbm5lckhUTUwgPSAnJztcclxuICAgICAgICAgICAgICAgICAgICBjb250ZW50RWwuYXBwZW5kQ2hpbGQobWVyZ2VkLm1lc3NhZ2UpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgLy8gdXBkYXRlIHR5cGUgY2xhc3NcclxuICAgICAgICAgICAgICAgIFsnaW5mbycsJ3N1Y2Nlc3MnLCd3YXJuaW5nJywnZGFuZ2VyJ10uZm9yRWFjaCh0ID0+IHRvYXN0RWwuY2xhc3NMaXN0LnJlbW92ZShgQVBYLXRvYXN0LS0ke3R9YCkpO1xyXG4gICAgICAgICAgICAgICAgdG9hc3RFbC5jbGFzc0xpc3QuYWRkKGBBUFgtdG9hc3QtLSR7bWVyZ2VkLnR5cGV9YCk7XHJcbiAgICAgICAgICAgICAgICAvLyB1cGRhdGUgY2xhc3Nlc1xyXG4gICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMuY2xhc3NOYW1lICE9PSBtZXJnZWQuY2xhc3NOYW1lKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMuY2xhc3NOYW1lKSB0b2FzdEVsLmNsYXNzTGlzdC5yZW1vdmUoLi4ub3B0aW9ucy5jbGFzc05hbWUuc3BsaXQoJyAnKS5maWx0ZXIoQm9vbGVhbikpO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChtZXJnZWQuY2xhc3NOYW1lKSB0b2FzdEVsLmNsYXNzTGlzdC5hZGQoLi4ubWVyZ2VkLmNsYXNzTmFtZS5zcGxpdCgnICcpLmZpbHRlcihCb29sZWFuKSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAvLyB1cGRhdGUgZHVyYXRpb24gbG9naWNcclxuICAgICAgICAgICAgICAgIG9wdGlvbnMuZHVyYXRpb25NcyA9IG1lcmdlZC5kdXJhdGlvbk1zO1xyXG4gICAgICAgICAgICAgICAgcmVtYWluaW5nID0gbWVyZ2VkLmR1cmF0aW9uTXM7XHJcbiAgICAgICAgICAgICAgICBwYXVzZVRpbWVyKCk7XHJcbiAgICAgICAgICAgICAgICBzdGFydFRpbWVyKCk7XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHdoZW5DbG9zZWQ6ICgpID0+IGNsb3NlZFByb21pc2UsXHJcbiAgICAgICAgICAgIG9uOiAoZXZlbnQsIGhhbmRsZXIpID0+IHsgaGFuZGxlcnNbZXZlbnRdLmFkZChoYW5kbGVyKTsgcmV0dXJuICgpID0+IHJlZi5vZmYoZXZlbnQsIGhhbmRsZXIpOyB9LFxyXG4gICAgICAgICAgICBvZmY6IChldmVudCwgaGFuZGxlcikgPT4geyBoYW5kbGVyc1tldmVudF0uZGVsZXRlKGhhbmRsZXIpOyB9XHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgY29uc3Qgbm90aWZ5ID0gKGV2ZW50LCBhcmcpID0+IGhhbmRsZXJzW2V2ZW50XS5mb3JFYWNoKGZuID0+IHsgdHJ5IHsgZm4oYXJnKTsgfSBjYXRjaCAoXykge30gfSk7XHJcblxyXG4gICAgICAgIGNvbnN0IGNsb3NlZFByb21pc2UgPSBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcclxuICAgICAgICAgICAgY29uc3QgZmluaXNoID0gKHJlYXNvbikgPT4ge1xyXG4gICAgICAgICAgICAgICAgbm90aWZ5KCdjbG9zZScsIHJlYXNvbik7XHJcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIG9wdGlvbnMub25DbG9zZSA9PT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICAgICAgICAgICAgICAgIHRyeSB7IG9wdGlvbnMub25DbG9zZShyZWYsIHJlYXNvbik7IH0gY2F0Y2goXyl7fVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xyXG4gICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgY29uc3QgY2xlYW51cCA9IChyZWFzb24pID0+IHtcclxuICAgICAgICAgICAgICAgIGlmICghdG9hc3RFbCkgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgcGF1c2VUaW1lcigpO1xyXG4gICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAvLyBDbGVhbnVwIHBvc2l0aW9uIGxpc3RlbmVycyBhbmQgcmVzdG9yZSBzdHlsZXNcclxuICAgICAgICAgICAgICAgIGlmIChwb3NpdGlvbkNsZWFudXApIHtcclxuICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbkNsZWFudXAoKTtcclxuICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbkNsZWFudXAgPSBudWxsO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAvLyBJZiBvdmVyZmxvdywgcmVtb3ZlIGltbWVkaWF0ZWx5IHRvIGVuZm9yY2UgaGFyZCBjYXBcclxuICAgICAgICAgICAgICAgIGlmIChyZWFzb24gPT09ICdvdmVyZmxvdycpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodG9hc3RFbC5wYXJlbnRFbGVtZW50KSB0b2FzdEVsLnBhcmVudEVsZW1lbnQucmVtb3ZlQ2hpbGQodG9hc3RFbCk7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaWR4ID0gdGhpcy5vcGVuLmluZGV4T2YocmVmKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoaWR4ID49IDApIHRoaXMub3Blbi5zcGxpY2UoaWR4LCAxKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmlkVG9SZWYuZGVsZXRlKHRvYXN0SWQpO1xyXG4gICAgICAgICAgICAgICAgICAgIGZpbmlzaChyZWFzb24pO1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAvLyBPdGhlcndpc2UsIGFuaW1hdGUgb3V0XHJcbiAgICAgICAgICAgICAgICB0b2FzdEVsLmNsYXNzTGlzdC5hZGQoJ0FQWC10b2FzdC0tZXhpdCcpO1xyXG4gICAgICAgICAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHRvYXN0RWwuY2xhc3NMaXN0LmFkZCgnQVBYLXRvYXN0LS1leGl0LWFjdGl2ZScpKTtcclxuXHJcbiAgICAgICAgICAgICAgICBjb25zdCByZW1vdmVFbCA9ICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICB0b2FzdEVsLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3RyYW5zaXRpb25lbmQnLCByZW1vdmVFbCk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRvYXN0RWwucGFyZW50RWxlbWVudCkgdG9hc3RFbC5wYXJlbnRFbGVtZW50LnJlbW92ZUNoaWxkKHRvYXN0RWwpO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGlkeCA9IHRoaXMub3Blbi5pbmRleE9mKHJlZik7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlkeCA+PSAwKSB0aGlzLm9wZW4uc3BsaWNlKGlkeCwgMSk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pZFRvUmVmLmRlbGV0ZSh0b2FzdElkKTtcclxuICAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICAvLyBTY2hlZHVsZSBnYXJiYWdlIGNvbGxlY3Rpb24gZm9yIHVubWFuYWdlZCBjb250YWluZXJzXHJcbiAgICAgICAgICAgICAgICAgICAgc2NoZWR1bGVHYXJiYWdlQ29sbGVjdGlvbigpO1xyXG4gICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgIGZpbmlzaChyZWFzb24pO1xyXG4gICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICAgIHRvYXN0RWwuYWRkRXZlbnRMaXN0ZW5lcigndHJhbnNpdGlvbmVuZCcsIHJlbW92ZUVsKTtcclxuICAgICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICAgIC8vIGF0dGFjaCBjbG9zZSBiZWhhdmlvclxyXG4gICAgICAgICAgICByZWYuY2xvc2UgPSAocmVhc29uKSA9PiBjbGVhbnVwKHJlYXNvbiB8fCAnYXBpJyk7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIC8vIENsaWNrIGhhbmRsaW5nXHJcbiAgICAgICAgdG9hc3RFbC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChldikgPT4ge1xyXG4gICAgICAgICAgICBub3RpZnkoJ2NsaWNrJywgZXYpO1xyXG4gICAgICAgICAgICBpZiAodHlwZW9mIG9wdGlvbnMub25DbGljayA9PT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICAgICAgICAgICAgdHJ5IHsgb3B0aW9ucy5vbkNsaWNrKHJlZiwgZXYpOyB9IGNhdGNoKF8pe31cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICAvLyBIb3ZlciBwYXVzZVxyXG4gICAgICAgIHRvYXN0RWwuYWRkRXZlbnRMaXN0ZW5lcignbW91c2VlbnRlcicsIHBhdXNlVGltZXIpO1xyXG4gICAgICAgIHRvYXN0RWwuYWRkRXZlbnRMaXN0ZW5lcignbW91c2VsZWF2ZScsICgpID0+IHN0YXJ0VGltZXIoKSk7XHJcblxyXG4gICAgICAgIGlmIChjbG9zZUJ0bikgY2xvc2VCdG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoZXYpID0+IHsgZXYuc3RvcFByb3BhZ2F0aW9uKCk7IHJlZi5jbG9zZSgnY2xvc2UnKTsgfSk7XHJcblxyXG4gICAgICAgIC8vIFRyYWNrXHJcbiAgICAgICAgdGhpcy5vcGVuLnB1c2gocmVmKTtcclxuICAgICAgICB0aGlzLmlkVG9SZWYuc2V0KHRvYXN0SWQsIHJlZik7XHJcblxyXG4gICAgICAgIC8vIE92ZXJmbG93IHBvbGljeVxyXG4gICAgICAgIGlmICh0aGlzLm9wZW4ubGVuZ3RoID4gdGhpcy5jb25maWcubWF4VG9hc3RzKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IG9sZGVzdCA9IHRoaXMub3BlblswXTtcclxuICAgICAgICAgICAgb2xkZXN0LmNsb3NlKCdvdmVyZmxvdycpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgc3RhcnRUaW1lcigpO1xyXG4gICAgICAgIHJldHVybiByZWY7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDb252ZW5pZW5jZSBoZWxwZXJzXHJcbiAgICAgKi9cclxuICAgIGluZm8obWVzc2FnZSwgb3B0cykgeyByZXR1cm4gdGhpcy5zaG93KHsgLi4uKG9wdHN8fHt9KSwgbWVzc2FnZSwgdHlwZTogJ2luZm8nIH0pOyB9XHJcbiAgICBzdWNjZXNzKG1lc3NhZ2UsIG9wdHMpIHsgcmV0dXJuIHRoaXMuc2hvdyh7IC4uLihvcHRzfHx7fSksIG1lc3NhZ2UsIHR5cGU6ICdzdWNjZXNzJyB9KTsgfVxyXG4gICAgd2FybmluZyhtZXNzYWdlLCBvcHRzKSB7IHJldHVybiB0aGlzLnNob3coeyAuLi4ob3B0c3x8e30pLCBtZXNzYWdlLCB0eXBlOiAnd2FybmluZycgfSk7IH1cclxuICAgIGRhbmdlcihtZXNzYWdlLCBvcHRzKSB7IHJldHVybiB0aGlzLnNob3coeyAuLi4ob3B0c3x8e30pLCBtZXNzYWdlLCB0eXBlOiAnZGFuZ2VyJyB9KTsgfVxyXG5cclxuICAgIC8qKiBAcGFyYW0geydhcGknfCdvdmVyZmxvdyd9IFtyZWFzb25dICovXHJcbiAgICBjbG9zZUFsbChyZWFzb24pIHtcclxuICAgICAgICAvLyBjb3B5IHRvIGF2b2lkIG11dGF0aW9uIGR1cmluZyBpdGVyYXRpb25cclxuICAgICAgICBjb25zdCBhbGwgPSB0aGlzLm9wZW4uc2xpY2UoKTtcclxuICAgICAgICBhbGwuZm9yRWFjaChyID0+IHIuY2xvc2UocmVhc29uIHx8ICdhcGknKSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBwYXJhbSB7VG9hc3RPcHRpb25zfSBvcHRzICovXHJcbiAgICBub3JtYWxpemVPcHRpb25zKG9wdHMpIHtcclxuICAgICAgICBjb25zdCBvID0geyAuLi5vcHRzIH07XHJcbiAgICAgICAgaWYgKCFvLnR5cGUpIG8udHlwZSA9ICdpbmZvJztcclxuICAgICAgICBpZiAodHlwZW9mIG8uZGlzbWlzc2libGUgIT09ICdib29sZWFuJykgby5kaXNtaXNzaWJsZSA9IHRydWU7XHJcbiAgICAgICAgaWYgKHR5cGVvZiBvLmR1cmF0aW9uTXMgIT09ICdudW1iZXInKSBvLmR1cmF0aW9uTXMgPSB0aGlzLmNvbmZpZy5kZWZhdWx0RHVyYXRpb25NcztcclxuICAgICAgICAvLyBVc2UgaWQgZnJvbSBvcHRpb25zIGlmIHByb3ZpZGVkLCBvdGhlcndpc2UgdXNlIGlkIGZyb20gY29uZmlnLCBvdGhlcndpc2UgdW5kZWZpbmVkICh3aWxsIGJlIGF1dG8tZ2VuZXJhdGVkKVxyXG4gICAgICAgIGlmICghby5pZCAmJiB0aGlzLmNvbmZpZy5pZCkgby5pZCA9IHRoaXMuY29uZmlnLmlkO1xyXG4gICAgICAgIHJldHVybiBvO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRmluZCBvciBjcmVhdGUgYSBjb250YWluZXIgZm9yIGEgc3BlY2lmaWMgcG9zaXRpb25cclxuICAgICAqIEBwYXJhbSB7UG9zaXRpb259IHBvc2l0aW9uXHJcbiAgICAgKiBAcGFyYW0geyd1cCd8J2Rvd24nfSBbZmxvd10gRmxvdyBkaXJlY3Rpb24gKGFscmVhZHkgZGV0ZXJtaW5lZCwgbm90ICdhdXRvJylcclxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW21hbmFnZWRdIFdoZXRoZXIgdGhpcyBjb250YWluZXIgaXMgbWFuYWdlZCBieSBhIG1hbmFnZXIgKGRlZmF1bHQ6IGZhbHNlKVxyXG4gICAgICogQHJldHVybnMge0hUTUxFbGVtZW50fG51bGx9XHJcbiAgICAgKi9cclxuICAgIGdldENvbnRhaW5lckZvclBvc2l0aW9uKHBvc2l0aW9uLCBmbG93LCBtYW5hZ2VkID0gZmFsc2UpIHtcclxuICAgICAgICBpZiAoIWlzQnJvd3NlcikgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgXHJcbiAgICAgICAgY29uc3QgcG9zaXRpb25LZXkgPSBzZXJpYWxpemVQb3NpdGlvbihwb3NpdGlvbik7XHJcbiAgICAgICAgXHJcbiAgICAgICAgLy8gRmxvdyBzaG91bGQgYWxyZWFkeSBiZSBkZXRlcm1pbmVkICgndXAnIG9yICdkb3duJyksIGJ1dCBmYWxsYmFjayB0byBhdXRvIGlmIG5lZWRlZFxyXG4gICAgICAgIGNvbnN0IGZpbmFsRmxvdyA9IGZsb3cgJiYgZmxvdyAhPT0gJ2F1dG8nID8gZmxvdyA6IGRldGVybWluZUZsb3cocG9zaXRpb24pO1xyXG4gICAgICAgIFxyXG4gICAgICAgIC8vIDEuIENoZWNrIG1lbW9yeSBjYWNoZVxyXG4gICAgICAgIGxldCBjID0gX2NvbnRhaW5lckNhY2hlLmdldChwb3NpdGlvbktleSk7XHJcbiAgICAgICAgXHJcbiAgICAgICAgLy8gMi4gSWYgbm90IGluIGNhY2hlLCBzZWFyY2ggaW4gRE9NIGJ5IGRhdGEgYXR0cmlidXRlXHJcbiAgICAgICAgaWYgKCFjICYmIGlzQnJvd3Nlcikge1xyXG4gICAgICAgICAgICBjID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihgW2RhdGEtYXB4LXRvYXN0LXBvc2l0aW9uPVwiJHtwb3NpdGlvbktleX1cIl1gKTtcclxuICAgICAgICAgICAgaWYgKGMpIHtcclxuICAgICAgICAgICAgICAgIF9jb250YWluZXJDYWNoZS5zZXQocG9zaXRpb25LZXksIGMpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIFxyXG4gICAgICAgIC8vIDMuIElmIHN0aWxsIG5vdCBmb3VuZCwgY3JlYXRlIG5ldyBjb250YWluZXJcclxuICAgICAgICBpZiAoIWMpIHtcclxuICAgICAgICAgICAgYyA9IGNyZWF0ZUVsKCdkaXYnLCAnQVBYLXRvYXN0LWNvbnRhaW5lcicpO1xyXG4gICAgICAgICAgICBjLnNldEF0dHJpYnV0ZSgnZGF0YS1hcHgtdG9hc3QtcG9zaXRpb24nLCBwb3NpdGlvbktleSk7XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAvLyBNYXJrIGFzIG1hbmFnZWQgaWYgY3JlYXRlZCBieSBhIG1hbmFnZXJcclxuICAgICAgICAgICAgaWYgKG1hbmFnZWQpIHtcclxuICAgICAgICAgICAgICAgIGMuc2V0QXR0cmlidXRlKCdkYXRhLWFweC10b2FzdC1tYW5hZ2VkJywgJ3RydWUnKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgLy8gRGV0ZXJtaW5lIHBvc2l0aW9uIGNsYXNzIChmb3IgQ1NTKVxyXG4gICAgICAgICAgICBjb25zdCBwb3NDbGFzcyA9IHR5cGVvZiBwb3NpdGlvbiA9PT0gJ3N0cmluZycgXHJcbiAgICAgICAgICAgICAgICA/IHBvc2l0aW9uIFxyXG4gICAgICAgICAgICAgICAgOiAocG9zaXRpb24udHlwZSB8fCAnYm90dG9tLXJpZ2h0Jyk7XHJcbiAgICAgICAgICAgIGMuY2xhc3NMaXN0LmFkZChgQVBYLXRvYXN0LWNvbnRhaW5lci0tJHtwb3NDbGFzc31gKTtcclxuICAgICAgICAgICAgYy5zZXRBdHRyaWJ1dGUoJ2FyaWEtbGl2ZScsIFN0cmluZyh0aGlzLmNvbmZpZy5hcmlhTGl2ZSkpO1xyXG4gICAgICAgICAgICBjLnN0eWxlLnpJbmRleCA9IFN0cmluZyh0aGlzLmNvbmZpZy56SW5kZXgpO1xyXG4gICAgICAgICAgICBjLnN0eWxlLmdhcCA9IGAke3RoaXMuY29uZmlnLmdhcH1weGA7XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAvLyBBcHBseSBmbG93IGRpcmVjdGlvblxyXG4gICAgICAgICAgICBjLnN0eWxlLmZsZXhEaXJlY3Rpb24gPSBmaW5hbEZsb3cgPT09ICd1cCcgPyAnY29sdW1uLXJldmVyc2UnIDogJ2NvbHVtbic7XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAvLyBBcHBseSBwb3NpdGlvbiBzdHlsZXMgaWYgb2JqZWN0IHBvc2l0aW9uXHJcbiAgICAgICAgICAgIGlmICh0eXBlb2YgcG9zaXRpb24gPT09ICdvYmplY3QnICYmIHBvc2l0aW9uICE9PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICBjLnN0eWxlLnBvc2l0aW9uID0gJ2ZpeGVkJztcclxuICAgICAgICAgICAgICAgIGNvbnN0IHN0eWxlcyA9IHRoaXMuY2FsY3VsYXRlUG9zaXRpb24ocG9zaXRpb24sIGMpO1xyXG4gICAgICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihjLnN0eWxlLCBzdHlsZXMpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAvLyBBcHBlbmQgdG8gd3JhcHBlciBmb3IgY2xlYW4gRE9NIG9yZ2FuaXphdGlvblxyXG4gICAgICAgICAgICBjb25zdCB3cmFwcGVyID0gZ2V0VG9hc3RXcmFwcGVyKCk7XHJcbiAgICAgICAgICAgIGlmICh3cmFwcGVyKSB7XHJcbiAgICAgICAgICAgICAgICB3cmFwcGVyLmFwcGVuZENoaWxkKGMpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChjKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBfY29udGFpbmVyQ2FjaGUuc2V0KHBvc2l0aW9uS2V5LCBjKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAvLyBVcGRhdGUgZmxvdyBkaXJlY3Rpb24gaWYgY29udGFpbmVyIGV4aXN0cyAobWF5IGJlIHNoYXJlZClcclxuICAgICAgICAgICAgYy5zdHlsZS5mbGV4RGlyZWN0aW9uID0gZmluYWxGbG93ID09PSAndXAnID8gJ2NvbHVtbi1yZXZlcnNlJyA6ICdjb2x1bW4nO1xyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgLy8gSWYgY29udGFpbmVyIGV4aXN0cyBhbmQgaXMgbm93IG1hbmFnZWQsIG1hcmsgaXRcclxuICAgICAgICAgICAgaWYgKG1hbmFnZWQgJiYgIWMuaGFzQXR0cmlidXRlKCdkYXRhLWFweC10b2FzdC1tYW5hZ2VkJykpIHtcclxuICAgICAgICAgICAgICAgIGMuc2V0QXR0cmlidXRlKCdkYXRhLWFweC10b2FzdC1tYW5hZ2VkJywgJ3RydWUnKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBcclxuICAgICAgICByZXR1cm4gYztcclxuICAgIH1cclxuXHJcbiAgICBlbnN1cmVDb250YWluZXIoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuY29udGFpbmVyIHx8ICFpc0Jyb3dzZXIpIHJldHVybjtcclxuICAgICAgICBcclxuICAgICAgICBjb25zdCBwb3NpdGlvbiA9IHRoaXMuY29uZmlnLnBvc2l0aW9uIHx8ICdib3R0b20tcmlnaHQnO1xyXG4gICAgICAgIGNvbnN0IGZsb3cgPSB0aGlzLmNvbmZpZy5mbG93ICE9PSB1bmRlZmluZWQgPyB0aGlzLmNvbmZpZy5mbG93IDogJ2F1dG8nO1xyXG4gICAgICAgIC8vIENvbnRhaW5lcnMgY3JlYXRlZCBieSBlbnN1cmVDb250YWluZXIgYXJlIG1hbmFnZWRcclxuICAgICAgICB0aGlzLmNvbnRhaW5lciA9IHRoaXMuZ2V0Q29udGFpbmVyRm9yUG9zaXRpb24ocG9zaXRpb24sIGZsb3csIHRydWUpO1xyXG4gICAgICAgIHRoaXMuYXBwbHlDb250YWluZXJDb25maWcoKTtcclxuICAgIH1cclxuXHJcbiAgICBhcHBseUNvbnRhaW5lckNvbmZpZygpIHtcclxuICAgICAgICBpZiAoIXRoaXMuY29udGFpbmVyKSByZXR1cm47XHJcbiAgICAgICAgY29uc3QgcG9zaXRpb24gPSB0aGlzLmNvbmZpZy5wb3NpdGlvbiB8fCAnYm90dG9tLXJpZ2h0JztcclxuICAgICAgICBjb25zdCBwb3MgPSB0eXBlb2YgcG9zaXRpb24gPT09ICdzdHJpbmcnID8gcG9zaXRpb24gOiAocG9zaXRpb24udHlwZSB8fCAnYm90dG9tLXJpZ2h0Jyk7XHJcbiAgICAgICAgXHJcbiAgICAgICAgLy8gQXBwbHkgc3R5bGVzICh0aGVzZSBtYXkgYmUgb3ZlcnJpZGRlbiBieSBvdGhlciBtYW5hZ2VycyBzaGFyaW5nIHRoZSBjb250YWluZXIpXHJcbiAgICAgICAgdGhpcy5jb250YWluZXIuc3R5bGUuekluZGV4ID0gU3RyaW5nKHRoaXMuY29uZmlnLnpJbmRleCk7XHJcbiAgICAgICAgdGhpcy5jb250YWluZXIuc3R5bGUuZ2FwID0gYCR7dGhpcy5jb25maWcuZ2FwfXB4YDtcclxuICAgICAgICB0aGlzLmNvbnRhaW5lci5zZXRBdHRyaWJ1dGUoJ2FyaWEtbGl2ZScsIFN0cmluZyh0aGlzLmNvbmZpZy5hcmlhTGl2ZSkpO1xyXG4gICAgICAgIFxyXG4gICAgICAgIC8vIFVwZGF0ZSBwb3NpdGlvbiBjbGFzcyAob25seSBmb3Igc3RyaW5nIHBvc2l0aW9ucylcclxuICAgICAgICBpZiAodHlwZW9mIHBvc2l0aW9uID09PSAnc3RyaW5nJykge1xyXG4gICAgICAgICAgICBjb25zdCBwb3NDbGFzc2VzID0gWydib3R0b20tcmlnaHQnLCdib3R0b20tbGVmdCcsJ3RvcC1yaWdodCcsJ3RvcC1sZWZ0J10ubWFwKHAgPT4gYEFQWC10b2FzdC1jb250YWluZXItLSR7cH1gKTtcclxuICAgICAgICAgICAgdGhpcy5jb250YWluZXIuY2xhc3NMaXN0LnJlbW92ZSguLi5wb3NDbGFzc2VzKTtcclxuICAgICAgICAgICAgdGhpcy5jb250YWluZXIuY2xhc3NMaXN0LmFkZChgQVBYLXRvYXN0LWNvbnRhaW5lci0tJHtwb3N9YCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIFxyXG4gICAgICAgIC8vIEFwcGx5IGNvbnRhaW5lciBjbGFzcyBpZiBzcGVjaWZpZWRcclxuICAgICAgICBpZiAodGhpcy5jb25maWcuY29udGFpbmVyQ2xhc3MpIHtcclxuICAgICAgICAgICAgdGhpcy5jb25maWcuY29udGFpbmVyQ2xhc3Muc3BsaXQoJyAnKS5maWx0ZXIoQm9vbGVhbikuZm9yRWFjaChjbHMgPT4ge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jb250YWluZXIuY2xhc3NMaXN0LmFkZChjbHMpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgXHJcbiAgICAgICAgLy8gQXBwbHkgb2Zmc2V0IChvbmx5IGZvciBzdHJpbmcgcG9zaXRpb25zKVxyXG4gICAgICAgIGlmICh0eXBlb2YgcG9zaXRpb24gPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmNvbmZpZy5vZmZzZXQpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IG9mZnNldCA9IGAke3RoaXMuY29uZmlnLm9mZnNldH1weGA7XHJcbiAgICAgICAgICAgICAgICBpZiAocG9zLmluY2x1ZGVzKCdib3R0b20nKSkgdGhpcy5jb250YWluZXIuc3R5bGUuYm90dG9tID0gb2Zmc2V0O1xyXG4gICAgICAgICAgICAgICAgZWxzZSB0aGlzLmNvbnRhaW5lci5zdHlsZS50b3AgPSBvZmZzZXQ7XHJcbiAgICAgICAgICAgICAgICBpZiAocG9zLmluY2x1ZGVzKCdyaWdodCcpKSB0aGlzLmNvbnRhaW5lci5zdHlsZS5yaWdodCA9IG9mZnNldDtcclxuICAgICAgICAgICAgICAgIGVsc2UgdGhpcy5jb250YWluZXIuc3R5bGUubGVmdCA9IG9mZnNldDtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIC8vIFJlc2V0IG9mZnNldCBpZiBub3Qgc3BlY2lmaWVkXHJcbiAgICAgICAgICAgICAgICBpZiAocG9zLmluY2x1ZGVzKCdib3R0b20nKSkgdGhpcy5jb250YWluZXIuc3R5bGUuYm90dG9tID0gJyc7XHJcbiAgICAgICAgICAgICAgICBlbHNlIHRoaXMuY29udGFpbmVyLnN0eWxlLnRvcCA9ICcnO1xyXG4gICAgICAgICAgICAgICAgaWYgKHBvcy5pbmNsdWRlcygncmlnaHQnKSkgdGhpcy5jb250YWluZXIuc3R5bGUucmlnaHQgPSAnJztcclxuICAgICAgICAgICAgICAgIGVsc2UgdGhpcy5jb250YWluZXIuc3R5bGUubGVmdCA9ICcnO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgcG9zaXRpb24gPT09ICdvYmplY3QnICYmIHBvc2l0aW9uICE9PSBudWxsKSB7XHJcbiAgICAgICAgICAgIC8vIEZvciBvYmplY3QgcG9zaXRpb25zLCBlbnN1cmUgY29udGFpbmVyIGhhcyBwb3NpdGlvbjogZml4ZWRcclxuICAgICAgICAgICAgdGhpcy5jb250YWluZXIuc3R5bGUucG9zaXRpb24gPSAnZml4ZWQnO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENhbGN1bGF0ZSBwb3NpdGlvbiBmb3IgYSBjb250YWluZXIgYmFzZWQgb24gcG9zaXRpb24gY29uZmlnXHJcbiAgICAgKiBAcGFyYW0ge1Bvc2l0aW9ufSBwb3NpdGlvblxyXG4gICAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gY29udGFpbmVyRWxcclxuICAgICAqIEByZXR1cm5zIHt7bGVmdD86IHN0cmluZywgdG9wPzogc3RyaW5nLCByaWdodD86IHN0cmluZywgYm90dG9tPzogc3RyaW5nfX1cclxuICAgICAqL1xyXG4gICAgY2FsY3VsYXRlUG9zaXRpb24ocG9zaXRpb24sIGNvbnRhaW5lckVsKSB7XHJcbiAgICAgICAgaWYgKHR5cGVvZiBwb3NpdGlvbiA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgICAgICAgLy8gU3RyaW5nIHBvc2l0aW9ucyBhcmUgaGFuZGxlZCBieSBjb250YWluZXIgQ1NTXHJcbiAgICAgICAgICAgIHJldHVybiB7fTtcclxuICAgICAgICB9XHJcbiAgICAgICAgXHJcbiAgICAgICAgaWYgKHR5cGVvZiBwb3NpdGlvbiA9PT0gJ29iamVjdCcgJiYgcG9zaXRpb24gIT09IG51bGwpIHtcclxuICAgICAgICAgICAgY29uc3QgdHlwZSA9IHBvc2l0aW9uLnR5cGUgfHwgKHBvc2l0aW9uLnggfHwgcG9zaXRpb24ueSA/ICdzdGlja3knIDogbnVsbCk7XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICBpZiAodHlwZSA9PT0gJ3N0aWNreScgfHwgKCF0eXBlICYmIChwb3NpdGlvbi54IHx8IHBvc2l0aW9uLnkpKSkge1xyXG4gICAgICAgICAgICAgICAgLy8gU3RpY2t5OiBmaXhlZCBwb3NpdGlvbiByZWxhdGl2ZSB0byB2aWV3cG9ydFxyXG4gICAgICAgICAgICAgICAgY29uc3Qgc3R5bGVzID0ge307XHJcbiAgICAgICAgICAgICAgICBpZiAocG9zaXRpb24ueCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHBvc2l0aW9uLnguc3RhcnRzV2l0aCgnLScpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlcy5yaWdodCA9IHBvc2l0aW9uLnguc3Vic3RyaW5nKDEpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlcy5sZWZ0ID0gcG9zaXRpb24ueDtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBpZiAocG9zaXRpb24ueSAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHBvc2l0aW9uLnkuc3RhcnRzV2l0aCgnLScpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlcy5ib3R0b20gPSBwb3NpdGlvbi55LnN1YnN0cmluZygxKTtcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzdHlsZXMudG9wID0gcG9zaXRpb24ueTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gc3R5bGVzO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICBpZiAodHlwZSA9PT0gJ3JlbGF0aXZlJyAmJiBwb3NpdGlvbi5lbGVtZW50KSB7XHJcbiAgICAgICAgICAgICAgICAvLyBSZWxhdGl2ZTogcG9zaXRpb24gcmVsYXRpdmUgdG8gZWxlbWVudCB3aXRoIHgveSBvZmZzZXRcclxuICAgICAgICAgICAgICAgIC8vIFVzZSBmaXhlZCBwb3NpdGlvbmluZywgc28gZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkgaXMgcmVsYXRpdmUgdG8gdmlld3BvcnRcclxuICAgICAgICAgICAgICAgIGNvbnN0IHJlY3QgPSBwb3NpdGlvbi5lbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xyXG4gICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAvLyBQYXJzZSB4L3kgb2Zmc2V0cyAoY2FuIGJlIHB4LCBlbSwgZXRjLilcclxuICAgICAgICAgICAgICAgIGNvbnN0IHBhcnNlT2Zmc2V0ID0gKHZhbCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICghdmFsKSByZXR1cm4gMDtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBudW0gPSBwYXJzZUZsb2F0KHZhbCk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbC5pbmNsdWRlcygnZW0nKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBDb252ZXJ0IGVtIHRvIHB4IChhcHByb3hpbWF0ZTogMWVtID0gMTZweClcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bSAqIDE2O1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVtO1xyXG4gICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgY29uc3Qgb2Zmc2V0WCA9IHBhcnNlT2Zmc2V0KHBvc2l0aW9uLnggfHwgJzAnKTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IG9mZnNldFkgPSBwYXJzZU9mZnNldChwb3NpdGlvbi55IHx8ICcwJyk7XHJcbiAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgIGNvbnN0IHN0eWxlcyA9IHtcclxuICAgICAgICAgICAgICAgICAgICBsZWZ0OiBgJHtyZWN0LmxlZnQgKyBvZmZzZXRYfXB4YCxcclxuICAgICAgICAgICAgICAgICAgICB0b3A6IGAke3JlY3QudG9wICsgb2Zmc2V0WX1weGBcclxuICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gc3R5bGVzO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICBpZiAodHlwZSA9PT0gJ2FuY2hvcmVkJyAmJiBwb3NpdGlvbi5lbGVtZW50KSB7XHJcbiAgICAgICAgICAgICAgICAvLyBBbmNob3JlZDogcG9zaXRpb24gcmVsYXRpdmUgdG8gZWxlbWVudCB3aXRoIHBsYWNlbWVudFxyXG4gICAgICAgICAgICAgICAgY29uc3QgcmVjdCA9IHBvc2l0aW9uLmVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBnYXAgPSBwb3NpdGlvbi5nYXAgfHwgJzFlbSc7XHJcbiAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgIC8vIFBhcnNlIGdhcCAoY2FuIGJlIHB4LCBlbSwgZXRjLilcclxuICAgICAgICAgICAgICAgIGNvbnN0IHBhcnNlR2FwID0gKHZhbCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG51bSA9IHBhcnNlRmxvYXQodmFsKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodmFsLmluY2x1ZGVzKCdlbScpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudW0gKiAxNjsgLy8gQXBwcm94aW1hdGU6IDFlbSA9IDE2cHhcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bTtcclxuICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgIGNvbnN0IGdhcFB4ID0gcGFyc2VHYXAoZ2FwKTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHN0eWxlcyA9IHt9O1xyXG4gICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAvLyBOb3JtYWxpemUgcGxhY2VtZW50IHN5bm9ueW1zIChhYm92ZS9iZWxvdy9iZWZvcmUvYWZ0ZXIpIHRvIENTUyB2YWx1ZXNcclxuICAgICAgICAgICAgICAgIGNvbnN0IHBsYWNlbWVudCA9IG5vcm1hbGl6ZVBsYWNlbWVudChwb3NpdGlvbi5wbGFjZW1lbnQpO1xyXG4gICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKHBsYWNlbWVudCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ3RvcCc6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRvYXN0IGFib3ZlIGVsZW1lbnQ6IGJvdHRvbSBvZiB0b2FzdCA9IHRvcCBvZiBlbGVtZW50IC0gZ2FwXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJvdHRvbSA9IHZpZXdwb3J0IGhlaWdodCAtIChlbGVtZW50IHRvcCAtIGdhcCkgPSB2aWV3cG9ydCBoZWlnaHQgLSBlbGVtZW50IHRvcCArIGdhcFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzdHlsZXMuYm90dG9tID0gYCR7d2luZG93LmlubmVySGVpZ2h0IC0gcmVjdC50b3AgKyBnYXBQeH1weGA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlcy5sZWZ0ID0gYCR7cmVjdC5sZWZ0fXB4YDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnYm90dG9tJzpcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVG9hc3QgYmVsb3cgZWxlbWVudDogdG9wIG9mIHRvYXN0ID0gYm90dG9tIG9mIGVsZW1lbnQgKyBnYXBcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGVzLnRvcCA9IGAke3JlY3QuYm90dG9tICsgZ2FwUHh9cHhgO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzdHlsZXMubGVmdCA9IGAke3JlY3QubGVmdH1weGA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ2xlZnQnOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBUb2FzdCB0byB0aGUgbGVmdDogcmlnaHQgb2YgdG9hc3QgPSBsZWZ0IG9mIGVsZW1lbnQgLSBnYXBcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGVzLnJpZ2h0ID0gYCR7d2luZG93LmlubmVyV2lkdGggLSByZWN0LmxlZnQgKyBnYXBQeH1weGA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlcy50b3AgPSBgJHtyZWN0LnRvcH1weGA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ3JpZ2h0JzpcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVG9hc3QgdG8gdGhlIHJpZ2h0OiBsZWZ0IG9mIHRvYXN0ID0gcmlnaHQgb2YgZWxlbWVudCArIGdhcFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzdHlsZXMubGVmdCA9IGAke3JlY3QucmlnaHQgKyBnYXBQeH1weGA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlcy50b3AgPSBgJHtyZWN0LnRvcH1weGA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHN0eWxlcztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBcclxuICAgICAgICByZXR1cm4ge307XHJcbiAgICB9XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBAcGFyYW0ge1BhcnRpYWw8VG9hc3RDb25maWc+PX0gY29uZmlnXHJcbiAqIEByZXR1cm5zIHtUb2FzdE1hbmFnZXJ9XHJcbiAqL1xyXG5mdW5jdGlvbiBjcmVhdGVUb2FzdE1hbmFnZXIoY29uZmlnKSB7XHJcbiAgICByZXR1cm4gbmV3IFRvYXN0TWFuYWdlcihjb25maWcpO1xyXG59XHJcblxyXG4vLyBIaWdoLWxldmVsIEFQWC50b2FzdCBBUEkgKGRlZmF1bHQgJiBuYW1lZCBtYW5hZ2VycylcclxubGV0IF9kZWZhdWx0TWFuYWdlciA9IG51bGw7XHJcbmNvbnN0IF9nZXREZWZhdWx0ID0gKCkgPT4ge1xyXG4gICAgaWYgKCFfZGVmYXVsdE1hbmFnZXIpIF9kZWZhdWx0TWFuYWdlciA9IGNyZWF0ZVRvYXN0TWFuYWdlcigpO1xyXG4gICAgcmV0dXJuIF9kZWZhdWx0TWFuYWdlcjtcclxufTtcclxuXHJcbi8qKlxyXG4gKiBUb2FzdCBBUEkgc3VyZmFjZSB0byBiZSBhdHRhY2hlZCBhcyBBUFgudG9hc3QuXHJcbiAqIENhbGxhYmxlIGZvcm0gcHJveGllcyB0byBkZWZhdWx0TWFuYWdlci5zaG93KG9wdHMpOiBBUFgudG9hc3Qoey4uLn0pXHJcbiAqL1xyXG5mdW5jdGlvbiB0b2FzdChvcHRzKSB7XHJcbiAgICByZXR1cm4gX2dldERlZmF1bHQoKS5zaG93KG9wdHMpO1xyXG59XHJcblxyXG5PYmplY3QuYXNzaWduKHRvYXN0LCB7XHJcbiAgICAvKipcclxuICAgICAqIENyZWF0ZSBhIG1hbmFnZXIuIElmIGZpcnN0IGFyZyBpcyBzdHJpbmcsIHJlZ2lzdGVyIGFzIG5hbWVkIHVuZGVyIHRvYXN0LmN1c3RvbVtuYW1lXVxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd8UGFydGlhbDxUb2FzdENvbmZpZz59IG5hbWVPckNvbmZpZ1xyXG4gICAgICogQHBhcmFtIHtQYXJ0aWFsPFRvYXN0Q29uZmlnPj19IG1heWJlQ29uZmlnXHJcbiAgICAgKiBAcmV0dXJucyB7VG9hc3RNYW5hZ2VyfVxyXG4gICAgICovXHJcbiAgICBjcmVhdGU6IChuYW1lT3JDb25maWcsIG1heWJlQ29uZmlnKSA9PiB7XHJcbiAgICAgICAgaWYgKHR5cGVvZiBuYW1lT3JDb25maWcgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IG5hbWUgPSBuYW1lT3JDb25maWc7XHJcbiAgICAgICAgICAgIGNvbnN0IG1hbmFnZXIgPSBuZXcgVG9hc3RNYW5hZ2VyKHsgLi4uKG1heWJlQ29uZmlnIHx8IHt9KSB9KTtcclxuICAgICAgICAgICAgaWYgKCF0b2FzdC5jdXN0b20pIHRvYXN0LmN1c3RvbSA9IHt9O1xyXG4gICAgICAgICAgICB0b2FzdC5jdXN0b21bbmFtZV0gPSBtYW5hZ2VyO1xyXG4gICAgICAgICAgICByZXR1cm4gbWFuYWdlcjtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG5ldyBUb2FzdE1hbmFnZXIoeyAuLi4obmFtZU9yQ29uZmlnIHx8IHt9KSB9KTtcclxuICAgIH0sXHJcbiAgICAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIFRvYXN0TWFuYWdlcj59ICovXHJcbiAgICBjdXN0b206IHt9LFxyXG4gICAgLyoqIEBwYXJhbSB7c3RyaW5nfSBuYW1lICovXHJcbiAgICB1c2U6IChuYW1lKSA9PiAodG9hc3QuY3VzdG9tICYmIHRvYXN0LmN1c3RvbVtuYW1lXSkgfHwgbnVsbCxcclxuICAgIE1hbmFnZXI6IFRvYXN0TWFuYWdlcixcclxuICAgIHNob3c6IChvcHRzKSA9PiBfZ2V0RGVmYXVsdCgpLnNob3cob3B0cyksXHJcbiAgICBpbmZvOiAobWVzc2FnZSwgb3B0cykgPT4gX2dldERlZmF1bHQoKS5pbmZvKG1lc3NhZ2UsIG9wdHMpLFxyXG4gICAgc3VjY2VzczogKG1lc3NhZ2UsIG9wdHMpID0+IF9nZXREZWZhdWx0KCkuc3VjY2VzcyhtZXNzYWdlLCBvcHRzKSxcclxuICAgIHdhcm5pbmc6IChtZXNzYWdlLCBvcHRzKSA9PiBfZ2V0RGVmYXVsdCgpLndhcm5pbmcobWVzc2FnZSwgb3B0cyksXHJcbiAgICBkYW5nZXI6IChtZXNzYWdlLCBvcHRzKSA9PiBfZ2V0RGVmYXVsdCgpLmRhbmdlcihtZXNzYWdlLCBvcHRzKSxcclxuICAgIGNvbmZpZ3VyZTogKGNvbmZpZykgPT4gX2dldERlZmF1bHQoKS5jb25maWd1cmUoY29uZmlnKSxcclxuICAgIHNldEFyaWFMaXZlOiAobW9kZSkgPT4gX2dldERlZmF1bHQoKS5zZXRBcmlhTGl2ZShtb2RlKSxcclxuICAgIGNsb3NlQWxsOiAocmVhc29uKSA9PiBfZ2V0RGVmYXVsdCgpLmNsb3NlQWxsKHJlYXNvbiksXHJcbiAgICBnZXRPcGVuVG9hc3RzOiAoKSA9PiBfZ2V0RGVmYXVsdCgpLmdldE9wZW5Ub2FzdHMoKVxyXG59KTtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IHRvYXN0O1xyXG5leHBvcnQgeyBUb2FzdE1hbmFnZXIsIGNyZWF0ZVRvYXN0TWFuYWdlciwgdG9hc3QgfTtcclxuIiwiaW1wb3J0ICcuL2Nzcy90cmlzdGF0ZS5jc3MnO1xyXG5cclxuLyoqXHJcbiAqIENyZWF0ZXMgYSB0cmktc3RhdGUgY2hlY2tib3ggZm9yIGVhY2ggY2hlY2tib3ggZWxlbWVudCBpbiB0aGUgYXB4LmVsZW1lbnRzIGFycmF5LlxyXG4gKiBAcGFyYW0ge0FycmF5PEhUTUxFbGVtZW50Pn0gYXB4IC0gQW4gYXJyYXkgb2YgSFRNTEVsZW1lbnRzIHdoaWNoIGlzIHJldHVybmVkIGJ5IEFQWCgpXHJcbiAqIEBleGFtcGxlXHJcbiAqIC8vIENhbGwgdGhlIHRyaXN0YXRlIGZ1bmN0aW9uIG9uIGFuIGFycmF5IG9mIGNoZWNrYm94IGVsZW1lbnRzXHJcbiAqIGFweC50cmlzdGF0ZSgpO1xyXG4gKi9cclxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gKGFweCkge1xyXG4gICAgYXB4LnRyaXN0YXRlID0gZnVuY3Rpb24gKG9wdGlvbnMgPSB7fSl7XHJcbiAgICAgICAgYXB4LmVsZW1lbnRzLmZvckVhY2goKGVsZW1lbnQpID0+IHtcclxuICAgICAgICAgICAgaWYgKGVsZW1lbnQudHlwZSA9PT0gJ2NoZWNrYm94Jykge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgW29yaWdpbmFsQ2hlY2tib3gsIHRyaXN0YXRlRG9tLCBoaWRkZW5JbnB1dF0gPSBjcmVhdGVUcmlTdGF0ZUNoZWNrYm94KGVsZW1lbnQsb3B0aW9ucyk7XHJcbiAgICAgICAgICAgICAgICAvL0lmIHRoZXJlIGlzIGEgXCJvcHRpb25zLmNhbGxiYWNrcy5hZnRlclwiIGNhbGxiYWNrIGluIG9wdGlvbnMgY2FsbCBpdFxyXG4gICAgICAgICAgICAgICAgaWYob3B0aW9ucy5jYWxsYmFja3MgJiYgb3B0aW9ucy5jYWxsYmFja3MuYWZ0ZXIgJiYgdHlwZW9mIG9wdGlvbnMuY2FsbGJhY2tzLmFmdGVyID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5jYWxsYmFja3MuYWZ0ZXIob3JpZ2luYWxDaGVja2JveCwgdHJpc3RhdGVEb20sIGhpZGRlbklucHV0KTtcclxuICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG59XHJcblxyXG5mdW5jdGlvbiB0b2dnbGVUcmlTdGF0ZUNoZWNrYm94U3RhdGUoY3VzdG9tQ2hlY2tib3gsIGFjdHVhbENoZWNrYm94LCBoaWRkZW5JbnB1dCkge1xyXG4gICAgaWYgKGN1c3RvbUNoZWNrYm94LmNsYXNzTGlzdC5jb250YWlucygnY2hlY2tlZCcpKSB7XHJcbiAgICAgICAgY3VzdG9tQ2hlY2tib3guY2xhc3NMaXN0LnJlbW92ZSgnY2hlY2tlZCcpO1xyXG4gICAgICAgIGN1c3RvbUNoZWNrYm94LmNsYXNzTGlzdC5hZGQoJ2Nyb3NzZWQnKTtcclxuICAgICAgICBhY3R1YWxDaGVja2JveC5jaGVja2VkID0gZmFsc2U7XHJcbiAgICAgICAgaGlkZGVuSW5wdXQudmFsdWUgPSAnZmFsc2UnO1xyXG4gICAgfSBlbHNlIGlmIChjdXN0b21DaGVja2JveC5jbGFzc0xpc3QuY29udGFpbnMoJ2Nyb3NzZWQnKSkge1xyXG4gICAgICAgIGN1c3RvbUNoZWNrYm94LmNsYXNzTGlzdC5yZW1vdmUoJ2Nyb3NzZWQnKTtcclxuICAgICAgICBjdXN0b21DaGVja2JveC5jbGFzc0xpc3QuYWRkKCd1bmNoZWNrZWQnKTtcclxuICAgICAgICBoaWRkZW5JbnB1dC5yZW1vdmVBdHRyaWJ1dGUoJ25hbWUnKTsgLy8gRW5zdXJlIHRoZSBoaWRkZW4gaW5wdXQgZG9lc24ndCBwb3N0IGFueSB2YWx1ZVxyXG4gICAgICAgIGhpZGRlbklucHV0LnJlbW92ZUF0dHJpYnV0ZSgndmFsdWUnKTsgLy8gRW5zdXJlIHRoZSBoaWRkZW4gaW5wdXQgZG9lc24ndCBwb3N0IGFueSB2YWx1ZVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgICBjdXN0b21DaGVja2JveC5jbGFzc0xpc3QucmVtb3ZlKCd1bmNoZWNrZWQnKTtcclxuICAgICAgICBjdXN0b21DaGVja2JveC5jbGFzc0xpc3QuYWRkKCdjaGVja2VkJyk7XHJcbiAgICAgICAgYWN0dWFsQ2hlY2tib3guY2hlY2tlZCA9IHRydWU7XHJcbiAgICAgICAgaGlkZGVuSW5wdXQudmFsdWUgPSAndHJ1ZSc7XHJcbiAgICAgICAgaGlkZGVuSW5wdXQuc2V0QXR0cmlidXRlKCduYW1lJywgYWN0dWFsQ2hlY2tib3guZGF0YXNldC5uYW1lKTsgLy8gUmVzdG9yZSB0aGUgbmFtZSBmb3IgcG9zdGluZ1xyXG4gICAgfVxyXG59XHJcblxyXG5mdW5jdGlvbiBjcmVhdGVUcmlTdGF0ZUNoZWNrYm94KGNoZWNrYm94RWxlbWVudCwgb3B0aW9ucykge1xyXG4gICAgXHJcbiAgICAvL2dldCB0aGUgY2hlY2tib3ggbWFyZ2lucyBpbmNsdWRpbmcgYnJvd3NlciBkZWZhdWx0XHJcbiAgICBjb25zdCBjaGVja2JveFN0eWxlID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUoY2hlY2tib3hFbGVtZW50KTtcclxuICAgIC8vIEhpZGUgdGhlIG9yaWdpbmFsIGNoZWNrYm94XHJcbiAgICBjaGVja2JveEVsZW1lbnQuc3R5bGUuZGlzcGxheSA9ICdub25lJztcclxuXHJcbiAgICAvLyBDcmVhdGUgdGhlIGN1c3RvbSBjaGVja2JveCBkaXYgYW5kIHNldCBpdHMgaW5pdGlhbCBzdGF0ZVxyXG4gICAgY29uc3QgdHJpc3RhdGVEb20gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcclxuICAgIHRyaXN0YXRlRG9tLmNsYXNzTGlzdC5hZGQoJ2FweC10cmlzdGF0ZScpO1xyXG4gICAgaWYgKG9wdGlvbnMuc2l6ZSkge1xyXG4gICAgICAgIGlmIChvcHRpb25zLnNpemUud2lkdGgpIHtcclxuICAgICAgICAgICAgdHJpc3RhdGVEb20uc3R5bGUud2lkdGggPSBvcHRpb25zLnNpemUud2lkdGggKyAncHgnO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAob3B0aW9ucy5zaXplLmhlaWdodCkge1xyXG4gICAgICAgICAgICB0cmlzdGF0ZURvbS5zdHlsZS5oZWlnaHQgPSBvcHRpb25zLnNpemUuaGVpZ2h0ICsgJ3B4JztcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBpZihvcHRpb25zLmNsYXNzZXMpIHRyaXN0YXRlRG9tLmNsYXNzTGlzdC5hZGQoLi4uY29tcHV0ZUNsYXNzZXMob3B0aW9ucy5jbGFzc2VzKSk7XHJcblxyXG4gICAgdHJpc3RhdGVEb20uc3R5bGUubWFyZ2luID0gY2hlY2tib3hTdHlsZS5tYXJnaW47XHJcblxyXG4gICAgaWYgKGNoZWNrYm94RWxlbWVudC5jaGVja2VkKSB7XHJcbiAgICAgICAgdHJpc3RhdGVEb20uY2xhc3NMaXN0LmFkZCgnY2hlY2tlZCcpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgICB0cmlzdGF0ZURvbS5jbGFzc0xpc3QuYWRkKCd1bmNoZWNrZWQnKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBDcmVhdGUgdGhlIGhpZGRlbiBpbnB1dCBmaWVsZFxyXG4gICAgY29uc3QgaGlkZGVuSW5wdXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbnB1dCcpO1xyXG4gICAgaGlkZGVuSW5wdXQudHlwZSA9ICdoaWRkZW4nO1xyXG4gICAgaGlkZGVuSW5wdXQubmFtZSA9IGNoZWNrYm94RWxlbWVudC5uYW1lOyAvLyBDb3B5IHRoZSBuYW1lIGZyb20gdGhlIG9yaWdpbmFsIGNoZWNrYm94XHJcbiAgICBjaGVja2JveEVsZW1lbnQuZGF0YXNldC5uYW1lID0gY2hlY2tib3hFbGVtZW50Lm5hbWU7IC8vIFN0b3JlIHRoZSBuYW1lIGluIGEgZGF0YSBhdHRyaWJ1dGUgZm9yIGxhdGVyIHVzZVxyXG4gICAgY2hlY2tib3hFbGVtZW50LnJlbW92ZUF0dHJpYnV0ZSgnbmFtZScpOyAvLyBSZW1vdmUgdGhlIG5hbWUgZnJvbSB0aGUgb3JpZ2luYWwgY2hlY2tib3ggdG8gYXZvaWQgZG91YmxlIHBvc3RpbmdcclxuXHJcbiAgICBpZiAob3B0aW9ucy5kZWZhdWx0U3RhdGUpIHNldERlZmF1bHRTdGF0ZShvcHRpb25zLCB0cmlzdGF0ZURvbSwgaGlkZGVuSW5wdXQpO1xyXG4gICAgZWxzZXtcclxuICAgICAgICAvLyBTZXQgdGhlIGluaXRpYWwgdmFsdWUgZm9yIHRoZSBoaWRkZW4gaW5wdXQgYmFzZWQgb24gdGhlIGNoZWNrYm94J3Mgc3RhdGVcclxuICAgICAgICBpZiAoY2hlY2tib3hFbGVtZW50LmNoZWNrZWQpIHtcclxuICAgICAgICAgICAgaGlkZGVuSW5wdXQudmFsdWUgPSAndHJ1ZSc7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgaGlkZGVuSW5wdXQubmFtZSA9ICcnOyAvLyBFbnN1cmUgdGhlIGhpZGRlbiBpbnB1dCBkb2Vzbid0IHBvc3QgYW55IHZhbHVlXHJcbiAgICAgICAgICAgIGhpZGRlbklucHV0LnZhbHVlID0gJyc7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vaGFuZGxlIGFjY2Vzc2liaWxpdHksIHNldCB0aGUgdGFiaW5kZXggdG8gdGhlIHNhbWUgYXMgdGhlIGNoZWNrYm94XHJcbiAgICB0cmlzdGF0ZURvbS50YWJJbmRleCA9IGNoZWNrYm94RWxlbWVudC50YWJJbmRleDtcclxuXHJcbiAgICAvLyBJbnNlcnQgdGhlIGhpZGRlbiBpbnB1dCBpbnNpZGUgdGhlIGN1c3RvbSBjaGVja2JveCBkaXZcclxuICAgIHRyaXN0YXRlRG9tLmFwcGVuZENoaWxkKGhpZGRlbklucHV0KTtcclxuXHJcbiAgICAvLyBJbnNlcnQgaXQgbmV4dCB0byB0aGUgYWN0dWFsIGNoZWNrYm94XHJcbiAgICBjaGVja2JveEVsZW1lbnQucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUodHJpc3RhdGVEb20sIGNoZWNrYm94RWxlbWVudC5uZXh0U2libGluZyk7XHJcblxyXG4gICAgLy8gQWRkIGV2ZW50IGxpc3RlbmVyXHJcbiAgICB0cmlzdGF0ZURvbS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGZ1bmN0aW9uIChlKSB7XHJcbiAgICAgICAgdG9nZ2xlVHJpU3RhdGVDaGVja2JveFN0YXRlKHRyaXN0YXRlRG9tLCBjaGVja2JveEVsZW1lbnQsIGhpZGRlbklucHV0KTtcclxuICAgICAgICBidWJibGVFdmVudHNUb09yaWdpbmFsQ2hlY2tib3gob3B0aW9ucywgY2hlY2tib3hFbGVtZW50LCB0cmlzdGF0ZURvbSwgaGlkZGVuSW5wdXQsIGUpO1xyXG4gICAgfSk7XHJcbiAgICB0cmlzdGF0ZURvbS5hZGRFdmVudExpc3RlbmVyKCdrZXl1cCcsIG9ua2V5dXAuYmluZChudWxsLCBjaGVja2JveEVsZW1lbnQpKTtcclxuXHJcbiAgICByZXR1cm4gW2NoZWNrYm94RWxlbWVudCwgdHJpc3RhdGVEb20sIGhpZGRlbklucHV0XTtcclxufVxyXG5cclxuZnVuY3Rpb24gc2V0RGVmYXVsdFN0YXRlKG9wdGlvbnMsIHRyaXN0YXRlRG9tLCBoaWRkZW5JbnB1dCkge1xyXG4gICAgLy9mb3IgYWxsIHZhbHVlcyBwb3NzaWJsZSBmb3IgZGVmYXVsdFN0YXRlLCBzZXQgdGhlIGluaXRpYWwgc3RhdGUgb2YgdGhlIGNoZWNrYm94XHJcbiAgICBpZiAob3B0aW9ucy5kZWZhdWx0U3RhdGUgPT09ICdjaGVja2VkJykge1xyXG4gICAgICAgIHRyaXN0YXRlRG9tLmNsYXNzTGlzdC5yZW1vdmUoJ3VuY2hlY2tlZCcpO1xyXG4gICAgICAgIHRyaXN0YXRlRG9tLmNsYXNzTGlzdC5hZGQoJ2NoZWNrZWQnKTtcclxuICAgICAgICBoaWRkZW5JbnB1dC52YWx1ZSA9ICd0cnVlJztcclxuICAgIH1cclxuICAgIGVsc2UgaWYgKG9wdGlvbnMuZGVmYXVsdFN0YXRlID09PSAndW5jaGVja2VkJykge1xyXG4gICAgICAgIHRyaXN0YXRlRG9tLmNsYXNzTGlzdC5yZW1vdmUoJ2NoZWNrZWQnKTtcclxuICAgICAgICB0cmlzdGF0ZURvbS5jbGFzc0xpc3QuYWRkKCd1bmNoZWNrZWQnKTtcclxuICAgICAgICBoaWRkZW5JbnB1dC5yZW1vdmVBdHRyaWJ1dGUoJ25hbWUnKTsgLy8gRW5zdXJlIHRoZSBoaWRkZW4gaW5wdXQgZG9lc24ndCBwb3N0IGFueSB2YWx1ZVxyXG4gICAgICAgIGhpZGRlbklucHV0LnJlbW92ZUF0dHJpYnV0ZSgndmFsdWUnKTsgLy8gRW5zdXJlIHRoZSBoaWRkZW4gaW5wdXQgZG9lc24ndCBwb3N0IGFueSB2YWx1ZVxyXG4gICAgfVxyXG4gICAgZWxzZSBpZiAob3B0aW9ucy5kZWZhdWx0U3RhdGUgPT09ICdjcm9zc2VkJykge1xyXG4gICAgICAgIHRyaXN0YXRlRG9tLmNsYXNzTGlzdC5yZW1vdmUoJ2NoZWNrZWQnKTtcclxuICAgICAgICB0cmlzdGF0ZURvbS5jbGFzc0xpc3QuYWRkKCdjcm9zc2VkJyk7XHJcbiAgICAgICAgaGlkZGVuSW5wdXQudmFsdWUgPSAnZmFsc2UnO1xyXG4gICAgfVxyXG59XHJcblxyXG5mdW5jdGlvbiBjb21wdXRlQ2xhc3NlcyhjbGFzc2VzKSB7XHJcbiAgICBsZXQgY29tcHV0ZWRDbGFzc2VzID0gW107XHJcbiAgICBpZih0eXBlb2YgY2xhc3NlcyA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgICAvL3JlcGxhY2UgbXVsdGlwbGUgd2hpdGUgc3BhY2VzIHdpdGggYSBzaW5nbGUgc3BhY2VcclxuICAgICAgICBjbGFzc2VzID0gY2xhc3Nlcy5yZXBsYWNlKC9cXHNcXHMrL2csICcgJyk7XHJcbiAgICAgICAgaWYoY2xhc3Nlcy5pbmRleE9mKCcgJykgPiAtMSlcclxuICAgICAgICAgICAgY29tcHV0ZWRDbGFzc2VzID0gY2xhc3Nlcy5zcGxpdCgnICcpO1xyXG4gICAgICAgIGVsc2UgaWYoY2xhc3Nlcy5pbmRleE9mKCcsJykgPiAtMSlcclxuICAgICAgICAgICAgY29tcHV0ZWRDbGFzc2VzID0gY2xhc3Nlcy5zcGxpdCgnLCcpO1xyXG4gICAgICAgIGVsc2VcclxuICAgICAgICAgICAgY29tcHV0ZWRDbGFzc2VzID0gW2NsYXNzZXNdO1xyXG4gICAgfVxyXG4gICAgZWxzZSBpZihBcnJheS5pc0FycmF5KGNsYXNzZXMpKSB7XHJcbiAgICAgICAgY29tcHV0ZWRDbGFzc2VzID0gY2xhc3NlcztcclxuICAgIH1cclxuICAgIHJldHVybiBjb21wdXRlZENsYXNzZXM7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGJ1YmJsZUV2ZW50c1RvT3JpZ2luYWxDaGVja2JveChvcHRpb25zLCBjaGVja2JveEVsZW1lbnQsIHRyaXN0YXRlRG9tLCBoaWRkZW5JbnB1dCwgZXZlbnQpIHtcclxuICAgIC8vaWYgb3B0aW9ucy5jYWxsYmFja3MuY2hhbmdlIGlzIHNldCwgY2FsbCBpdFxyXG4gICAgaWYob3B0aW9ucy5jYWxsYmFja3MgJiYgb3B0aW9ucy5jYWxsYmFja3MuY2hhbmdlICYmIHR5cGVvZiBvcHRpb25zLmNhbGxiYWNrcy5jaGFuZ2UgPT09ICdmdW5jdGlvbicpIHtcclxuICAgICAgICBvcHRpb25zLmNhbGxiYWNrcy5jaGFuZ2UoY2hlY2tib3hFbGVtZW50LCB0cmlzdGF0ZURvbSwgaGlkZGVuSW5wdXQpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmKCFvcHRpb25zLmJ1YmJsZUV2ZW50cykgcmV0dXJuO1xyXG5cclxuICAgIGlmKGV2ZW50LnR5cGUgPT09ICdjbGljaycpIHtcclxuICAgICAgICBjaGVja2JveEVsZW1lbnQuZGlzcGF0Y2hFdmVudChuZXcgTW91c2VFdmVudCgnY2xpY2snLCB7IGJ1YmJsZXM6IHRydWUsIGNhbmNlbGFibGU6IHRydWUgfSkpO1xyXG4gICAgfVxyXG4gICAgZWxzZSBpZihldmVudC50eXBlID09PSAna2V5dXAnKSB7XHJcbiAgICAgICAgY2hlY2tib3hFbGVtZW50LmRpc3BhdGNoRXZlbnQobmV3IEtleWJvYXJkRXZlbnQoJ2tleXVwJywgeyBrZXk6ICcgJywgYnViYmxlczogdHJ1ZSwgY2FuY2VsYWJsZTogdHJ1ZSB9KSk7XHJcbiAgICB9XHJcbiAgICBlbHNlIGlmKGV2ZW50LnR5cGUgPT09ICdjaGFuZ2UnKSB7XHJcbiAgICAgICAgY2hlY2tib3hFbGVtZW50LmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KCdjaGFuZ2UnLCB7IGJ1YmJsZXM6IHRydWUsIGNhbmNlbGFibGU6IHRydWUgfSkpO1xyXG4gICAgfVxyXG59XHJcblxyXG5mdW5jdGlvbiBvbmtleXVwKGNoZWNrYm94RWxlbWVudCwgZXZlbnQpIHtcclxuICAgIGlmIChldmVudC5rZXlDb2RlID09PSAzMikge1xyXG4gICAgICAgIGJ1YmJsZUV2ZW50c1RvT3JpZ2luYWxDaGVja2JveChjaGVja2JveEVsZW1lbnQsIGV2ZW50KTtcclxuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgIGV2ZW50LnRhcmdldC5jbGljaygpO1xyXG4gICAgfVxyXG59IiwiLy8gVGhlIG1vZHVsZSBjYWNoZVxudmFyIF9fd2VicGFja19tb2R1bGVfY2FjaGVfXyA9IHt9O1xuXG4vLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuXHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcblx0dmFyIGNhY2hlZE1vZHVsZSA9IF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF07XG5cdGlmIChjYWNoZWRNb2R1bGUgIT09IHVuZGVmaW5lZCkge1xuXHRcdHJldHVybiBjYWNoZWRNb2R1bGUuZXhwb3J0cztcblx0fVxuXHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuXHR2YXIgbW9kdWxlID0gX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXSA9IHtcblx0XHRpZDogbW9kdWxlSWQsXG5cdFx0Ly8gbm8gbW9kdWxlLmxvYWRlZCBuZWVkZWRcblx0XHRleHBvcnRzOiB7fVxuXHR9O1xuXG5cdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuXHRfX3dlYnBhY2tfbW9kdWxlc19fW21vZHVsZUlkXShtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcblxuXHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuXHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG59XG5cbi8vIGV4cG9zZSB0aGUgbW9kdWxlcyBvYmplY3QgKF9fd2VicGFja19tb2R1bGVzX18pXG5fX3dlYnBhY2tfcmVxdWlyZV9fLm0gPSBfX3dlYnBhY2tfbW9kdWxlc19fO1xuXG4iLCIvLyBnZXREZWZhdWx0RXhwb3J0IGZ1bmN0aW9uIGZvciBjb21wYXRpYmlsaXR5IHdpdGggbm9uLWhhcm1vbnkgbW9kdWxlc1xuX193ZWJwYWNrX3JlcXVpcmVfXy5uID0gKG1vZHVsZSkgPT4ge1xuXHR2YXIgZ2V0dGVyID0gbW9kdWxlICYmIG1vZHVsZS5fX2VzTW9kdWxlID9cblx0XHQoKSA9PiAobW9kdWxlWydkZWZhdWx0J10pIDpcblx0XHQoKSA9PiAobW9kdWxlKTtcblx0X193ZWJwYWNrX3JlcXVpcmVfXy5kKGdldHRlciwgeyBhOiBnZXR0ZXIgfSk7XG5cdHJldHVybiBnZXR0ZXI7XG59OyIsIi8vIGRlZmluZSBnZXR0ZXIgZnVuY3Rpb25zIGZvciBoYXJtb255IGV4cG9ydHNcbl9fd2VicGFja19yZXF1aXJlX18uZCA9IChleHBvcnRzLCBkZWZpbml0aW9uKSA9PiB7XG5cdGZvcih2YXIga2V5IGluIGRlZmluaXRpb24pIHtcblx0XHRpZihfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZGVmaW5pdGlvbiwga2V5KSAmJiAhX193ZWJwYWNrX3JlcXVpcmVfXy5vKGV4cG9ydHMsIGtleSkpIHtcblx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBrZXksIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBkZWZpbml0aW9uW2tleV0gfSk7XG5cdFx0fVxuXHR9XG59OyIsIl9fd2VicGFja19yZXF1aXJlX18ubyA9IChvYmosIHByb3ApID0+IChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBwcm9wKSkiLCIvLyBkZWZpbmUgX19lc01vZHVsZSBvbiBleHBvcnRzXG5fX3dlYnBhY2tfcmVxdWlyZV9fLnIgPSAoZXhwb3J0cykgPT4ge1xuXHRpZih0eXBlb2YgU3ltYm9sICE9PSAndW5kZWZpbmVkJyAmJiBTeW1ib2wudG9TdHJpbmdUYWcpIHtcblx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgU3ltYm9sLnRvU3RyaW5nVGFnLCB7IHZhbHVlOiAnTW9kdWxlJyB9KTtcblx0fVxuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pO1xufTsiLCJfX3dlYnBhY2tfcmVxdWlyZV9fLmIgPSBkb2N1bWVudC5iYXNlVVJJIHx8IHNlbGYubG9jYXRpb24uaHJlZjtcblxuLy8gb2JqZWN0IHRvIHN0b3JlIGxvYWRlZCBhbmQgbG9hZGluZyBjaHVua3Ncbi8vIHVuZGVmaW5lZCA9IGNodW5rIG5vdCBsb2FkZWQsIG51bGwgPSBjaHVuayBwcmVsb2FkZWQvcHJlZmV0Y2hlZFxuLy8gW3Jlc29sdmUsIHJlamVjdCwgUHJvbWlzZV0gPSBjaHVuayBsb2FkaW5nLCAwID0gY2h1bmsgbG9hZGVkXG52YXIgaW5zdGFsbGVkQ2h1bmtzID0ge1xuXHRcIm1haW5cIjogMFxufTtcblxuLy8gbm8gY2h1bmsgb24gZGVtYW5kIGxvYWRpbmdcblxuLy8gbm8gcHJlZmV0Y2hpbmdcblxuLy8gbm8gcHJlbG9hZGVkXG5cbi8vIG5vIEhNUlxuXG4vLyBubyBITVIgbWFuaWZlc3RcblxuLy8gbm8gb24gY2h1bmtzIGxvYWRlZFxuXG4vLyBubyBqc29ucCBmdW5jdGlvbiIsIl9fd2VicGFja19yZXF1aXJlX18ubmMgPSB1bmRlZmluZWQ7IiwiaW1wb3J0IGF1Z21lbnRXaXRoTGlzdGVuIGZyb20gJy4vbW9kdWxlcy9saXN0ZW4vbGlzdGVuLm1qcyc7XHJcbmltcG9ydCBhdWdtZW50V2l0aFRyaXN0YXRlIGZyb20gJy4vbW9kdWxlcy90cmlzdGF0ZS90cmlzdGF0ZS5tanMnO1xyXG5pbXBvcnQgZGlhbG9nIGZyb20gJy4vbW9kdWxlcy9kaWFsb2cvZGlhbG9nLm1qcyc7XHJcbmltcG9ydCB0b2FzdCBmcm9tICcuL21vZHVsZXMvdG9hc3QvdG9hc3QubWpzJztcclxuaW1wb3J0IHsgbG9hZENzcyB9IGZyb20gJy4vbW9kdWxlcy9jb21tb24ubWpzJztcclxuXHJcbi8qKlxyXG4gKiBDcmVhdGVzIGFuIEFQWCBvYmplY3QgdGhhdCB3cmFwcyBvbmUgb3IgbW9yZSBIVE1MIGVsZW1lbnRzLlxyXG4gKiBAcGFyYW0ge3N0cmluZ3xIVE1MRWxlbWVudHxOb2RlTGlzdHxIVE1MQ29sbGVjdGlvbnxBcnJheTxIVE1MRWxlbWVudD58alF1ZXJ5fEZ1bmN0aW9ufSBpbnB1dCAtIFRoZSBpbnB1dCB0byBjcmVhdGUgdGhlIEFQWCBvYmplY3QgZnJvbS5cclxuICogQHJldHVybnMge09iamVjdH0gVGhlIEFQWCBvYmplY3QuXHJcbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGUgaW5wdXQgdHlwZSBpcyBpbnZhbGlkLlxyXG4gKiBAZXhhbXBsZVxyXG4gKiAvLyBYUGF0aFxyXG4gKiBjb25zdCBhcHgxID0gQVBYKCcvL2RpdltAY2xhc3M9XCJleGFtcGxlXCJdJyk7XHJcbiAqXHJcbiAqIC8vIENTUyBzZWxlY3RvclxyXG4gKiBjb25zdCBhcHgyID0gQVBYKCcuZXhhbXBsZScpO1xyXG4gKlxyXG4gKiAvLyBTaW5nbGUgZWxlbWVudFxyXG4gKiBjb25zdCBlbGVtZW50ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmV4YW1wbGUnKTtcclxuICogY29uc3QgYXB4MyA9IEFQWChlbGVtZW50KTtcclxuICpcclxuICogLy8gTm9kZUxpc3Qgb3IgSFRNTENvbGxlY3Rpb25cclxuICogY29uc3Qgbm9kZUxpc3QgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuZXhhbXBsZScpO1xyXG4gKiBjb25zdCBhcHg0ID0gQVBYKG5vZGVMaXN0KTtcclxuICpcclxuICogLy8gQXJyYXkgb2YgZWxlbWVudHNcclxuICogY29uc3QgZWxlbWVudHMgPSBbZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmV4YW1wbGUxJyksIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5leGFtcGxlMicpXTtcclxuICogY29uc3QgYXB4NSA9IEFQWChlbGVtZW50cyk7XHJcbiAqXHJcbiAqIC8vIGpRdWVyeSBvYmplY3RcclxuICogY29uc3QgJGV4YW1wbGUgPSAkKCcuZXhhbXBsZScpO1xyXG4gKiBjb25zdCBhcHg2ID0gQVBYKCRleGFtcGxlKTtcclxuICpcclxuICogLy8gRnVuY3Rpb24gcmV0dXJuaW5nIGFuIEFQWCBvYmplY3RcclxuICogY29uc3QgYXB4NyA9IEFQWCgoKSA9PiBBUFgoJy5leGFtcGxlJykpO1xyXG4gKi9cclxuY29uc3QgQVBYID0gZnVuY3Rpb24gKGlucHV0LCBjb250ZXh0ID0gZG9jdW1lbnQpIHtcclxuICAgIGxldCBlbGVtZW50cztcclxuXHJcbiAgICAvLyBWYWxpZGF0ZSBjb250ZXh0XHJcbiAgICBpZiAodHlwZW9mIGNvbnRleHQgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgY29udGV4dCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoY29udGV4dCk7XHJcbiAgICB9XHJcbiAgICBlbHNlIGlmIChBUFguaXNBUFhPYmplY3QoY29udGV4dCkpIHtcclxuICAgICAgICBjb250ZXh0ID0gY29udGV4dC5maXJzdCgpO1xyXG4gICAgfSBlbHNlIGlmICghKGNvbnRleHQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCB8fCBjb250ZXh0IGluc3RhbmNlb2YgRG9jdW1lbnQpKSB7XHJcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGNvbnRleHQgZm9yIEFQWCcpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0eXBlb2YgaW5wdXQgPT09ICdzdHJpbmcnICYmIGlucHV0LnN0YXJ0c1dpdGgoJy8vJykpIHtcclxuICAgICAgICAvLyBYUGF0aCB3aXRoIGNvbnRleHRcclxuICAgICAgICBlbGVtZW50cyA9IGRvY3VtZW50LmV2YWx1YXRlKGlucHV0LCBjb250ZXh0LCBudWxsLCBYUGF0aFJlc3VsdC5BTllfVFlQRSwgbnVsbCk7XHJcbiAgICAgICAgbGV0IG5vZGVzID0gW107XHJcbiAgICAgICAgbGV0IG5vZGUgPSBlbGVtZW50cy5pdGVyYXRlTmV4dCgpO1xyXG4gICAgICAgIHdoaWxlIChub2RlKSB7XHJcbiAgICAgICAgICAgIG5vZGVzLnB1c2gobm9kZSk7XHJcbiAgICAgICAgICAgIG5vZGUgPSBlbGVtZW50cy5pdGVyYXRlTmV4dCgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbGVtZW50cyA9IG5vZGVzO1xyXG4gICAgfSBlbHNlIGlmICh0eXBlb2YgaW5wdXQgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgLy8gQ1NTIHNlbGVjdG9yIHdpdGggY29udGV4dFxyXG4gICAgICAgIGVsZW1lbnRzID0gY29udGV4dC5xdWVyeVNlbGVjdG9yQWxsKGlucHV0KTtcclxuICAgIH0gZWxzZSBpZiAoaW5wdXQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCkge1xyXG4gICAgICAgIC8vIFNpbmdsZSBlbGVtZW50IHdpdGhpbiBjb250ZXh0XHJcbiAgICAgICAgZWxlbWVudHMgPSBjb250ZXh0LmNvbnRhaW5zKGlucHV0KSA/IFtpbnB1dF0gOiBbXTtcclxuICAgIH0gZWxzZSBpZiAoaW5wdXQgaW5zdGFuY2VvZiBOb2RlTGlzdCB8fCBpbnB1dCBpbnN0YW5jZW9mIEhUTUxDb2xsZWN0aW9uKSB7XHJcbiAgICAgICAgLy8gTm9kZUxpc3Qgb3IgSFRNTENvbGxlY3Rpb24gd2l0aGluIGNvbnRleHRcclxuICAgICAgICBlbGVtZW50cyA9IEFycmF5LmZyb20oaW5wdXQpLmZpbHRlcihlbCA9PiBjb250ZXh0LmNvbnRhaW5zKGVsKSk7XHJcbiAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoaW5wdXQpICYmIGlucHV0LmV2ZXJ5KGVsID0+IGVsIGluc3RhbmNlb2YgSFRNTEVsZW1lbnQpKSB7XHJcbiAgICAgICAgLy8gQXJyYXkgb2YgZWxlbWVudHMgd2l0aGluIGNvbnRleHRcclxuICAgICAgICBlbGVtZW50cyA9IGlucHV0LmZpbHRlcihlbCA9PiBjb250ZXh0LmNvbnRhaW5zKGVsKSk7XHJcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBqUXVlcnkgIT0gJ3VuZGVmaW5lZCcgJiYgaW5wdXQgaW5zdGFuY2VvZiBqUXVlcnkpIHtcclxuICAgICAgICAvLyBqUXVlcnkgb2JqZWN0IHdpdGhpbiBjb250ZXh0XHJcbiAgICAgICAgZWxlbWVudHMgPSBBcnJheS5mcm9tKGlucHV0LmdldCgpKS5maWx0ZXIoZWwgPT4gY29udGV4dC5jb250YWlucyhlbCkpO1xyXG4gICAgfSBlbHNlIGlmICh0eXBlb2YgaW5wdXQgPT09ICdmdW5jdGlvbicpIHtcclxuICAgICAgICAvLyBGdW5jdGlvbiByZXR1cm5pbmcgYW4gQVBYIG9iamVjdCB3aXRoIGNvbnRleHRcclxuICAgICAgICBlbGVtZW50cyA9IEFQWChpbnB1dCgpLCBjb250ZXh0KTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGlucHV0IHR5cGUgZm9yIEFQWCcpO1xyXG4gICAgfVxyXG5cclxuICAgIHZhciBhcHggPSB7XHJcbiAgICAgICAgZWxlbWVudHM6IGVsZW1lbnRzLFxyXG4gICAgICAgIF9pc0FQWE9iamVjdDogdHJ1ZVxyXG4gICAgfTtcclxuICAgIGFweC5sZW5ndGggPSBlbGVtZW50cy5sZW5ndGg7XHJcbiAgICBhcHguZWFjaCA9IGZ1bmN0aW9uIChjYWxsYmFjaykge1xyXG4gICAgICAgIGlmICh0aGlzLmVsZW1lbnRzIGluc3RhbmNlb2YgQXJyYXkpIHRoaXMuZWxlbWVudHMuZm9yRWFjaChjYWxsYmFjayk7XHJcbiAgICAgICAgaWYgKHRoaXMuZWxlbWVudHMgaW5zdGFuY2VvZiBOb2RlTGlzdCkgQXJyYXkuZnJvbSh0aGlzLmVsZW1lbnRzKS5mb3JFYWNoKGNhbGxiYWNrKTtcclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH07XHJcbiAgICBhcHguZ2V0ID0gZnVuY3Rpb24gKGluZGV4KSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZWxlbWVudHNbaW5kZXhdO1xyXG4gICAgfTtcclxuICAgIGFweC5hbGwgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuZWxlbWVudHMgaW5zdGFuY2VvZiBBcnJheSkgcmV0dXJuIHRoaXMuZWxlbWVudHM7XHJcbiAgICAgICAgaWYgKHRoaXMuZWxlbWVudHMgaW5zdGFuY2VvZiBOb2RlTGlzdCkgcmV0dXJuIEFycmF5LmZyb20odGhpcy5lbGVtZW50cyk7XHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9O1xyXG4gICAgYXB4LmZpcnN0ID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmdldCgwKTtcclxuICAgIH07XHJcbiAgICBhdWdtZW50V2l0aExpc3RlbihhcHgpO1xyXG4gICAgYXVnbWVudFdpdGhUcmlzdGF0ZShhcHgpO1xyXG4gICAgcmV0dXJuIGFweDtcclxufTtcclxuXHJcbkFQWC5sb2FkQ3NzID0gbG9hZENzcztcclxuQVBYLmRpYWxvZyA9IGRpYWxvZztcclxuQVBYLnRvYXN0ID0gdG9hc3Q7XHJcbkFQWC5pc0FQWE9iamVjdCA9IGZ1bmN0aW9uIChvYmopIHtcclxuICAgIHJldHVybiBvYmogJiYgb2JqLl9pc0FQWE9iamVjdCA9PT0gdHJ1ZTtcclxufVxyXG5BUFguaXNfbnVtZXJpYyA9IChuKSA9PiB7XHJcbiAgICByZXR1cm4gIWlzTmFOKG4gLSBwYXJzZUZsb2F0KG4pKTtcclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgQVBYOyJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==
|