PluginProbe ʕ •ᴥ•ʔ
JetFormBuilder — Dynamic Blocks Form Builder / 3.6.2
JetFormBuilder — Dynamic Blocks Form Builder v3.6.2
3.6.3.1 3.6.3 3.6.2.2 3.6.2.1 3.6.2 3.6.1.1 3.6.1 3.6.0.1 trunk 1.0.0 1.0.1 1.0.2 1.0.3 1.1.0 1.1.1 1.1.2 1.1.3 1.1.4 1.1.5 1.1.6 1.1.7 1.2.0 1.2.1 1.2.2 1.2.3 1.2.4 1.2.5 1.2.6 1.2.7 1.3.0 1.3.1 1.3.2 1.3.3 1.4.0 1.4.1 1.4.2 1.4.3 1.5.0 1.5.1 1.5.2 1.5.3 1.5.4 1.5.5 2.0.0 2.0.1 2.0.2 2.0.3 2.0.4 2.0.5 2.0.6 2.1.0 2.1.1 2.1.10 2.1.11 2.1.2 2.1.3 2.1.4 2.1.5 2.1.6 2.1.7 2.1.8 2.1.9 3.0.0 3.0.0.1 3.0.0.2 3.0.0.3 3.0.1 3.0.1.1 3.0.2 3.0.3 3.0.4 3.0.5 3.0.6 3.0.7 3.0.8 3.0.9 3.1.0 3.1.0.1 3.1.1 3.1.2 3.1.3 3.1.4 3.1.5 3.1.6 3.1.7 3.1.8 3.1.9 3.2.0 3.2.1 3.2.2 3.2.3 3.3.0 3.3.1 3.3.2 3.3.3 3.3.3.1 3.3.4 3.3.4.1 3.3.4.2 3.4.0 3.4.1 3.4.2 3.4.3 3.4.4 3.4.5 3.4.5.1 3.4.5.2 3.4.6 3.4.7 3.4.7.1 3.5.0 3.5.1 3.5.1.1 3.5.1.2 3.5.2 3.5.2.1 3.5.3 3.5.4 3.5.5 3.5.6 3.5.6.1 3.5.6.2 3.5.6.3 3.6.0
jetformbuilder / assets / build / frontend / dynamic.value.js
jetformbuilder / assets / build / frontend Last commit date
advanced.reporting.asset.php 1 month ago advanced.reporting.js 1 month ago calculated.field.asset.php 1 month ago calculated.field.js 1 month ago conditional.block.asset.php 1 month ago conditional.block.js 1 month ago dynamic.value.asset.php 1 month ago dynamic.value.js 1 month ago main.asset.php 1 month ago main.css 1 month ago main.js 1 month ago media.field.asset.php 1 month ago media.field.js 1 month ago media.field.restrictions.asset.php 1 month ago media.field.restrictions.js 1 month ago multi.step.asset.php 1 month ago multi.step.js 1 month ago
dynamic.value.js
444 lines
1 /******/ (() => { // webpackBootstrap
2 /******/ "use strict";
3 /******/ var __webpack_modules__ = ({
4
5 /***/ "./frontend/dynamic.value/BaseReactiveProperty.js"
6 /*!********************************************************!*\
7 !*** ./frontend/dynamic.value/BaseReactiveProperty.js ***!
8 \********************************************************/
9 (__unused_webpack_module, __webpack_exports__, __webpack_require__) {
10
11 __webpack_require__.r(__webpack_exports__);
12 /* harmony export */ __webpack_require__.d(__webpack_exports__, {
13 /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
14 /* harmony export */ });
15 const {
16 CalculatedFormula
17 } = JetFormBuilderAbstract;
18 function BaseReactiveProperty(name = '') {
19 this.attrName = name;
20 }
21 BaseReactiveProperty.prototype = {
22 /**
23 * Name of data attribute
24 */
25 attrName: '',
26 /**
27 * If you need specific check,
28 * you can rewrite this function
29 *
30 * @param input {InputData}
31 * @return {boolean}
32 */
33 isSupported(input) {
34 return input.attrs.hasOwnProperty(this.attrName);
35 },
36 /**
37 * @param input {InputData}
38 */
39 runObserve(input) {
40 /**
41 * @type {BaseHtmlAttr}
42 */
43 const htmlAttr = input.attrs[this.attrName];
44 const formula = new CalculatedFormula(input);
45 formula.observe(htmlAttr.initial);
46 this.observe(htmlAttr, formula);
47 },
48 /**
49 * @param attr {BaseHtmlAttr}
50 * @param formula {CalculatedFormula}
51 */
52 observe(attr, formula) {
53 formula.setResult = () => {
54 attr.value.current = formula.calculate();
55 };
56 formula.setResult();
57 }
58 };
59 /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (BaseReactiveProperty);
60
61 /***/ },
62
63 /***/ "./frontend/dynamic.value/MultipleValueItem.js"
64 /*!*****************************************************!*\
65 !*** ./frontend/dynamic.value/MultipleValueItem.js ***!
66 \*****************************************************/
67 (__unused_webpack_module, __webpack_exports__, __webpack_require__) {
68
69 __webpack_require__.r(__webpack_exports__);
70 /* harmony export */ __webpack_require__.d(__webpack_exports__, {
71 /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
72 /* harmony export */ });
73 /* harmony import */ var _ValueItem__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./ValueItem */ "./frontend/dynamic.value/ValueItem.js");
74
75 const {
76 CalculatedFormula
77 } = JetFormBuilderAbstract;
78 function MultipleValueItem(...props) {
79 _ValueItem__WEBPACK_IMPORTED_MODULE_0__["default"].call(this, ...props);
80 }
81 MultipleValueItem.prototype = Object.create(_ValueItem__WEBPACK_IMPORTED_MODULE_0__["default"].prototype);
82 MultipleValueItem.prototype.isSupported = function (input) {
83 return input.isArray();
84 };
85 MultipleValueItem.prototype.observeSetValue = function (conditions, input) {
86 let toSet = [];
87 if (!Array.isArray(this.to_set)) {
88 toSet = this.to_set.split(',').map(item => item.trim());
89 }
90 this.to_set = {};
91 for (const [index, toSetElement] of Object.entries(toSet)) {
92 const formula = new CalculatedFormula(input);
93 formula.observe(toSetElement);
94 formula.setResult = () => {
95 this.to_set[index] = '' + formula.calculate();
96 this.to_set = Object.values(this.to_set).filter(Boolean);
97 };
98 formula.setResult();
99 this.formulas.push(formula);
100 }
101 };
102 /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (MultipleValueItem);
103
104 /***/ },
105
106 /***/ "./frontend/dynamic.value/ReactiveValue.js"
107 /*!*************************************************!*\
108 !*** ./frontend/dynamic.value/ReactiveValue.js ***!
109 \*************************************************/
110 (__unused_webpack_module, __webpack_exports__, __webpack_require__) {
111
112 __webpack_require__.r(__webpack_exports__);
113 /* harmony export */ __webpack_require__.d(__webpack_exports__, {
114 /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
115 /* harmony export */ });
116 /* harmony import */ var _BaseReactiveProperty__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./BaseReactiveProperty */ "./frontend/dynamic.value/BaseReactiveProperty.js");
117
118 const {
119 CalculatedFormula
120 } = JetFormBuilderAbstract;
121 function ReactiveValue() {
122 this.isSupported = function (input) {
123 const [node] = input.nodes;
124 return node.dataset.hasOwnProperty('value');
125 };
126 this.runObserve = function (input) {
127 const [node] = input.nodes;
128 const formula = new CalculatedFormula(input);
129 formula.observe(node.dataset.value);
130 formula.setResult = () => {
131 input.value.current = formula.calculate();
132 };
133 formula.setResult();
134 };
135 }
136 ReactiveValue.prototype = Object.create(_BaseReactiveProperty__WEBPACK_IMPORTED_MODULE_0__["default"].prototype);
137 /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (ReactiveValue);
138
139 /***/ },
140
141 /***/ "./frontend/dynamic.value/ValueItem.js"
142 /*!*********************************************!*\
143 !*** ./frontend/dynamic.value/ValueItem.js ***!
144 \*********************************************/
145 (__unused_webpack_module, __webpack_exports__, __webpack_require__) {
146
147 __webpack_require__.r(__webpack_exports__);
148 /* harmony export */ __webpack_require__.d(__webpack_exports__, {
149 /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
150 /* harmony export */ });
151 const {
152 CalculatedFormula,
153 ConditionsList
154 } = JetFormBuilderAbstract;
155
156 /**
157 * @type {Function}
158 * @class
159 */
160 function ValueItem() {}
161 ValueItem.prototype = {
162 to_set: '',
163 prevResult: null,
164 prevValue: null,
165 /**
166 * @type {InputData}
167 */
168 input: null,
169 frequency: '',
170 set_on_empty: false,
171 /**
172 * @type {CalculatedFormula[]}
173 */
174 formulas: [],
175 /**
176 * @param input {InputData}
177 * @return {boolean}
178 */
179 // eslint-disable-next-line no-unused-vars
180 isSupported(input) {
181 return true;
182 },
183 observe({
184 to_set: toSet,
185 conditions = [],
186 set_on_empty: setOnEmpty = false,
187 frequency = 'on_change'
188 }, input) {
189 this.input = input;
190 this.frequency = frequency;
191 this.set_on_empty = setOnEmpty;
192 this.prevResult = null;
193 this.prevValue = null;
194 this.to_set = toSet;
195 this.formulas = [];
196 this.observeSetValue(conditions, input);
197 const list = new ConditionsList(conditions, input.root);
198 if (list.conditions?.length) {
199 list.onChangeRelated = () => this.applyValue(list);
200 list.observe();
201 list.onChangeRelated();
202 return;
203 }
204 for (const formula of this.formulas) {
205 const resultCallback = formula.setResult.bind(formula);
206 formula.setResult = () => {
207 resultCallback();
208 this.applyValue(false, true);
209 };
210 formula.setResult();
211 }
212 },
213 observeSetValue(conditions, input) {
214 const formula = new CalculatedFormula(input);
215 formula.observe(this.to_set);
216 formula.setResult = () => {
217 this.to_set = '' + formula.calculate();
218 };
219 formula.setResult();
220 this.formulas.push(formula);
221 },
222 /**
223 * @param list {ConditionsList|boolean}
224 * @param forceResult {boolean|null}
225 */
226 applyValue(list, forceResult = null) {
227 let result = false;
228 if (list) {
229 result = list.getResult();
230 } else {
231 result = forceResult;
232 }
233 switch (this.frequency) {
234 case 'always':
235 this.setValue(result);
236 break;
237 case 'on_change':
238 if (this.prevResult === result) {
239 break;
240 }
241 this.prevResult = result;
242 this.setValue(result);
243 break;
244 case 'once':
245 if (!result) {
246 break;
247 }
248 this.setValue();
249 if (list) {
250 list.onChangeRelated = () => {};
251 }
252 this.formulas.forEach(current => current.clearWatchers());
253 break;
254 }
255 },
256 setValue(result = true) {
257 if (!result) {
258 return;
259 }
260 if (this.set_on_empty) {
261 this.input.value.setIfEmpty(this.to_set);
262 } else {
263 this.input.value.current = this.to_set;
264 }
265 }
266 };
267 /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (ValueItem);
268
269 /***/ },
270
271 /***/ "./frontend/dynamic.value/functions.js"
272 /*!*********************************************!*\
273 !*** ./frontend/dynamic.value/functions.js ***!
274 \*********************************************/
275 (__unused_webpack_module, __webpack_exports__, __webpack_require__) {
276
277 __webpack_require__.r(__webpack_exports__);
278 /* harmony export */ __webpack_require__.d(__webpack_exports__, {
279 /* harmony export */ getProperties: () => (/* binding */ getProperties),
280 /* harmony export */ parseInput: () => (/* binding */ parseInput)
281 /* harmony export */ });
282 /* harmony import */ var _ValueItem__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./ValueItem */ "./frontend/dynamic.value/ValueItem.js");
283 /* harmony import */ var _MultipleValueItem__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./MultipleValueItem */ "./frontend/dynamic.value/MultipleValueItem.js");
284 /* harmony import */ var _ReactiveValue__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./ReactiveValue */ "./frontend/dynamic.value/ReactiveValue.js");
285 /* harmony import */ var _BaseReactiveProperty__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./BaseReactiveProperty */ "./frontend/dynamic.value/BaseReactiveProperty.js");
286
287
288
289 const {
290 applyFilters
291 } = JetPlugins.hooks;
292 const getValues = () => applyFilters('jet.fb.dynamic.value.types', [_MultipleValueItem__WEBPACK_IMPORTED_MODULE_1__["default"], _ValueItem__WEBPACK_IMPORTED_MODULE_0__["default"]]);
293 /**
294 * @type {ValueItem[]}
295 */
296 let values = [];
297
298 /**
299 * @param input
300 * @return {ValueItem}
301 */
302 const getValue = input => {
303 if (!values.length) {
304 values = getValues();
305 }
306 for (const value of values) {
307 const current = new value();
308 if (!current.isSupported(input)) {
309 continue;
310 }
311 return current;
312 }
313 };
314 function createValues(json, input) {
315 const groups = JSON.parse(json);
316 for (const group of groups) {
317 const value = getValue(input);
318 value.observe(group, input);
319 }
320 }
321 function parseInput(input) {
322 const [node] = input.nodes;
323 const wrapper = node.closest('.jet-form-builder-row');
324 if (wrapper && wrapper.dataset.hasOwnProperty('value')) {
325 createValues(wrapper.dataset.value, input);
326 }
327 // for hidden-field case
328 else if (node.dataset.hasOwnProperty('dynamicValue')) {
329 createValues(node.dataset.dynamicValue, input);
330 }
331 for (const property of getProperties(input)) {
332 property.runObserve(input);
333 }
334 }
335
336
337 /**
338 * @type {BaseReactiveProperty[]}
339 */
340 const reactProperties = [new _BaseReactiveProperty__WEBPACK_IMPORTED_MODULE_3__["default"]('min'), new _BaseReactiveProperty__WEBPACK_IMPORTED_MODULE_3__["default"]('max'), new _ReactiveValue__WEBPACK_IMPORTED_MODULE_2__["default"]()];
341
342 /**
343 * @param input {InputData}
344 * @return {Generator<BaseReactiveProperty>}
345 */
346 function* getProperties(input) {
347 for (const reactProperty of reactProperties) {
348 if (reactProperty.isSupported(input)) {
349 yield reactProperty;
350 }
351 }
352 }
353
354
355 /***/ }
356
357 /******/ });
358 /************************************************************************/
359 /******/ // The module cache
360 /******/ var __webpack_module_cache__ = {};
361 /******/
362 /******/ // The require function
363 /******/ function __webpack_require__(moduleId) {
364 /******/ // Check if module is in cache
365 /******/ var cachedModule = __webpack_module_cache__[moduleId];
366 /******/ if (cachedModule !== undefined) {
367 /******/ return cachedModule.exports;
368 /******/ }
369 /******/ // Create a new module (and put it into the cache)
370 /******/ var module = __webpack_module_cache__[moduleId] = {
371 /******/ // no module.id needed
372 /******/ // no module.loaded needed
373 /******/ exports: {}
374 /******/ };
375 /******/
376 /******/ // Execute the module function
377 /******/ if (!(moduleId in __webpack_modules__)) {
378 /******/ delete __webpack_module_cache__[moduleId];
379 /******/ var e = new Error("Cannot find module '" + moduleId + "'");
380 /******/ e.code = 'MODULE_NOT_FOUND';
381 /******/ throw e;
382 /******/ }
383 /******/ __webpack_modules__[moduleId](module, module.exports, __webpack_require__);
384 /******/
385 /******/ // Return the exports of the module
386 /******/ return module.exports;
387 /******/ }
388 /******/
389 /************************************************************************/
390 /******/ /* webpack/runtime/define property getters */
391 /******/ (() => {
392 /******/ // define getter functions for harmony exports
393 /******/ __webpack_require__.d = (exports, definition) => {
394 /******/ for(var key in definition) {
395 /******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {
396 /******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] });
397 /******/ }
398 /******/ }
399 /******/ };
400 /******/ })();
401 /******/
402 /******/ /* webpack/runtime/hasOwnProperty shorthand */
403 /******/ (() => {
404 /******/ __webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))
405 /******/ })();
406 /******/
407 /******/ /* webpack/runtime/make namespace object */
408 /******/ (() => {
409 /******/ // define __esModule on exports
410 /******/ __webpack_require__.r = (exports) => {
411 /******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
412 /******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
413 /******/ }
414 /******/ Object.defineProperty(exports, '__esModule', { value: true });
415 /******/ };
416 /******/ })();
417 /******/
418 /************************************************************************/
419 var __webpack_exports__ = {};
420 // This entry needs to be wrapped in an IIFE because it needs to be isolated against other modules in the chunk.
421 (() => {
422 /*!****************************************!*\
423 !*** ./frontend/dynamic.value/main.js ***!
424 \****************************************/
425 __webpack_require__.r(__webpack_exports__);
426 /* harmony import */ var _functions__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./functions */ "./frontend/dynamic.value/functions.js");
427
428 const {
429 addAction
430 } = JetPlugins.hooks;
431 addAction('jet.fb.observe.after', 'jet-form-builder/dynamic-value',
432 /**
433 * @param observable {Observable}
434 */
435 function (observable) {
436 for (const dataInput of observable.getInputs()) {
437 (0,_functions__WEBPACK_IMPORTED_MODULE_0__.parseInput)(dataInput);
438 }
439 });
440 })();
441
442 /******/ })()
443 ;
444 //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnJvbnRlbmQvZHluYW1pYy52YWx1ZS5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7Ozs7Ozs7Ozs7O0FDaERBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBRUE7Ozs7Ozs7Ozs7Ozs7OztBQ3ZDQTtBQUVBO0FBQUE7QUFBQTtBQUVBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7Ozs7Ozs7Ozs7Ozs7O0FDM0JBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDeklBO0FBQ0E7QUFDQTtBQUVBO0FBQUE7QUFBQTtBQUVBO0FBT0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFNQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7O0FDekZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQzdCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7OztBQ1BBOzs7OztBQ0FBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7QUNOQTtBQUVBO0FBQUE7QUFBQTtBQUVBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL2pmYi8uL2Zyb250ZW5kL2R5bmFtaWMudmFsdWUvQmFzZVJlYWN0aXZlUHJvcGVydHkuanMiLCJ3ZWJwYWNrOi8vamZiLy4vZnJvbnRlbmQvZHluYW1pYy52YWx1ZS9NdWx0aXBsZVZhbHVlSXRlbS5qcyIsIndlYnBhY2s6Ly9qZmIvLi9mcm9udGVuZC9keW5hbWljLnZhbHVlL1JlYWN0aXZlVmFsdWUuanMiLCJ3ZWJwYWNrOi8vamZiLy4vZnJvbnRlbmQvZHluYW1pYy52YWx1ZS9WYWx1ZUl0ZW0uanMiLCJ3ZWJwYWNrOi8vamZiLy4vZnJvbnRlbmQvZHluYW1pYy52YWx1ZS9mdW5jdGlvbnMuanMiLCJ3ZWJwYWNrOi8vamZiL3dlYnBhY2svYm9vdHN0cmFwIiwid2VicGFjazovL2pmYi93ZWJwYWNrL3J1bnRpbWUvZGVmaW5lIHByb3BlcnR5IGdldHRlcnMiLCJ3ZWJwYWNrOi8vamZiL3dlYnBhY2svcnVudGltZS9oYXNPd25Qcm9wZXJ0eSBzaG9ydGhhbmQiLCJ3ZWJwYWNrOi8vamZiL3dlYnBhY2svcnVudGltZS9tYWtlIG5hbWVzcGFjZSBvYmplY3QiLCJ3ZWJwYWNrOi8vamZiLy4vZnJvbnRlbmQvZHluYW1pYy52YWx1ZS9tYWluLmpzIl0sInNvdXJjZXNDb250ZW50IjpbImNvbnN0IHsgQ2FsY3VsYXRlZEZvcm11bGEgfSA9IEpldEZvcm1CdWlsZGVyQWJzdHJhY3Q7XG5cbmZ1bmN0aW9uIEJhc2VSZWFjdGl2ZVByb3BlcnR5KCBuYW1lID0gJycgKSB7XG5cdHRoaXMuYXR0ck5hbWUgPSBuYW1lO1xufVxuXG5CYXNlUmVhY3RpdmVQcm9wZXJ0eS5wcm90b3R5cGUgPSB7XG5cdC8qKlxuXHQgKiBOYW1lIG9mIGRhdGEgYXR0cmlidXRlXG5cdCAqL1xuXHRhdHRyTmFtZTogJycsXG5cdC8qKlxuXHQgKiBJZiB5b3UgbmVlZCBzcGVjaWZpYyBjaGVjayxcblx0ICogeW91IGNhbiByZXdyaXRlIHRoaXMgZnVuY3Rpb25cblx0ICpcblx0ICogQHBhcmFtICBpbnB1dCB7SW5wdXREYXRhfVxuXHQgKiBAcmV0dXJuIHtib29sZWFufVxuXHQgKi9cblx0aXNTdXBwb3J0ZWQoIGlucHV0ICkge1xuXHRcdHJldHVybiBpbnB1dC5hdHRycy5oYXNPd25Qcm9wZXJ0eSggdGhpcy5hdHRyTmFtZSApO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBAcGFyYW0gaW5wdXQge0lucHV0RGF0YX1cblx0ICovXG5cdHJ1bk9ic2VydmUoIGlucHV0ICkge1xuXHRcdC8qKlxuXHRcdCAqIEB0eXBlIHtCYXNlSHRtbEF0dHJ9XG5cdFx0ICovXG5cdFx0Y29uc3QgaHRtbEF0dHIgPSBpbnB1dC5hdHRyc1sgdGhpcy5hdHRyTmFtZSBdO1xuXG5cdFx0Y29uc3QgZm9ybXVsYSA9IG5ldyBDYWxjdWxhdGVkRm9ybXVsYSggaW5wdXQgKTtcblx0XHRmb3JtdWxhLm9ic2VydmUoIGh0bWxBdHRyLmluaXRpYWwgKTtcblxuXHRcdHRoaXMub2JzZXJ2ZSggaHRtbEF0dHIsIGZvcm11bGEgKTtcblx0fSxcblx0LyoqXG5cdCAqIEBwYXJhbSBhdHRyICAgIHtCYXNlSHRtbEF0dHJ9XG5cdCAqIEBwYXJhbSBmb3JtdWxhIHtDYWxjdWxhdGVkRm9ybXVsYX1cblx0ICovXG5cdG9ic2VydmUoIGF0dHIsIGZvcm11bGEgKSB7XG5cdFx0Zm9ybXVsYS5zZXRSZXN1bHQgPSAoKSA9PiB7XG5cdFx0XHRhdHRyLnZhbHVlLmN1cnJlbnQgPSBmb3JtdWxhLmNhbGN1bGF0ZSgpO1xuXHRcdH07XG5cdFx0Zm9ybXVsYS5zZXRSZXN1bHQoKTtcblx0fSxcbn07XG5cbmV4cG9ydCBkZWZhdWx0IEJhc2VSZWFjdGl2ZVByb3BlcnR5OyIsImltcG9ydCBWYWx1ZUl0ZW0gZnJvbSAnLi9WYWx1ZUl0ZW0nO1xuXG5jb25zdCB7XG5cdCAgICAgIENhbGN1bGF0ZWRGb3JtdWxhLFxuICAgICAgfSA9IEpldEZvcm1CdWlsZGVyQWJzdHJhY3Q7XG5cbmZ1bmN0aW9uIE11bHRpcGxlVmFsdWVJdGVtKCAuLi5wcm9wcyApIHtcblx0VmFsdWVJdGVtLmNhbGwoIHRoaXMsIC4uLnByb3BzICk7XG59XG5cbk11bHRpcGxlVmFsdWVJdGVtLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIFZhbHVlSXRlbS5wcm90b3R5cGUgKTtcblxuTXVsdGlwbGVWYWx1ZUl0ZW0ucHJvdG90eXBlLmlzU3VwcG9ydGVkICAgICA9IGZ1bmN0aW9uICggaW5wdXQgKSB7XG5cdHJldHVybiBpbnB1dC5pc0FycmF5KCk7XG59O1xuTXVsdGlwbGVWYWx1ZUl0ZW0ucHJvdG90eXBlLm9ic2VydmVTZXRWYWx1ZSA9IGZ1bmN0aW9uICggY29uZGl0aW9ucywgaW5wdXQgKSB7XG5cdGxldCB0b1NldCA9IFtdO1xuXG5cdGlmICggIUFycmF5LmlzQXJyYXkoIHRoaXMudG9fc2V0ICkgKSB7XG5cdFx0dG9TZXQgPSB0aGlzLnRvX3NldC5zcGxpdCggJywnICkubWFwKCBpdGVtID0+IGl0ZW0udHJpbSgpICk7XG5cdH1cblx0dGhpcy50b19zZXQgPSB7fTtcblxuXHRmb3IgKCBjb25zdCBbIGluZGV4LCB0b1NldEVsZW1lbnQgXSBvZiBPYmplY3QuZW50cmllcyggdG9TZXQgKSApIHtcblx0XHRjb25zdCBmb3JtdWxhID0gbmV3IENhbGN1bGF0ZWRGb3JtdWxhKCBpbnB1dCApO1xuXG5cdFx0Zm9ybXVsYS5vYnNlcnZlKCB0b1NldEVsZW1lbnQgKTtcblx0XHRmb3JtdWxhLnNldFJlc3VsdCA9ICgpID0+IHtcblx0XHRcdHRoaXMudG9fc2V0WyBpbmRleCBdID0gJycgKyBmb3JtdWxhLmNhbGN1bGF0ZSgpO1xuXG5cdFx0XHR0aGlzLnRvX3NldCA9IE9iamVjdC52YWx1ZXMoIHRoaXMudG9fc2V0ICkuZmlsdGVyKCBCb29sZWFuICk7XG5cdFx0fTtcblxuXHRcdGZvcm11bGEuc2V0UmVzdWx0KCk7XG5cblx0XHR0aGlzLmZvcm11bGFzLnB1c2goIGZvcm11bGEgKTtcblx0fVxufTtcblxuZXhwb3J0IGRlZmF1bHQgTXVsdGlwbGVWYWx1ZUl0ZW07IiwiaW1wb3J0IEJhc2VSZWFjdGl2ZVByb3BlcnR5IGZyb20gJy4vQmFzZVJlYWN0aXZlUHJvcGVydHknO1xuXG5jb25zdCB7IENhbGN1bGF0ZWRGb3JtdWxhIH0gPSBKZXRGb3JtQnVpbGRlckFic3RyYWN0O1xuXG5mdW5jdGlvbiBSZWFjdGl2ZVZhbHVlKCkge1xuXG5cdHRoaXMuaXNTdXBwb3J0ZWQgPSBmdW5jdGlvbiAoIGlucHV0ICkge1xuXHRcdGNvbnN0IFsgbm9kZSBdID0gaW5wdXQubm9kZXM7XG5cblx0XHRyZXR1cm4gbm9kZS5kYXRhc2V0Lmhhc093blByb3BlcnR5KCAndmFsdWUnICk7XG5cdH07XG5cblx0dGhpcy5ydW5PYnNlcnZlID0gZnVuY3Rpb24gKCBpbnB1dCApIHtcblx0XHRjb25zdCBbIG5vZGUgXSA9IGlucHV0Lm5vZGVzO1xuXG5cdFx0Y29uc3QgZm9ybXVsYSA9IG5ldyBDYWxjdWxhdGVkRm9ybXVsYSggaW5wdXQgKTtcblxuXHRcdGZvcm11bGEub2JzZXJ2ZSggbm9kZS5kYXRhc2V0LnZhbHVlICk7XG5cdFx0Zm9ybXVsYS5zZXRSZXN1bHQgPSAoKSA9PiB7XG5cdFx0XHRpbnB1dC52YWx1ZS5jdXJyZW50ID0gZm9ybXVsYS5jYWxjdWxhdGUoKTtcblx0XHR9O1xuXHRcdGZvcm11bGEuc2V0UmVzdWx0KCk7XG5cdH07XG59XG5cblJlYWN0aXZlVmFsdWUucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggQmFzZVJlYWN0aXZlUHJvcGVydHkucHJvdG90eXBlICk7XG5cbmV4cG9ydCBkZWZhdWx0IFJlYWN0aXZlVmFsdWU7IiwiY29uc3Qge1xuXHQgICAgICBDYWxjdWxhdGVkRm9ybXVsYSxcblx0ICAgICAgQ29uZGl0aW9uc0xpc3QsXG4gICAgICB9ID0gSmV0Rm9ybUJ1aWxkZXJBYnN0cmFjdDtcblxuLyoqXG4gKiBAdHlwZSB7RnVuY3Rpb259XG4gKiBAY2xhc3NcbiAqL1xuZnVuY3Rpb24gVmFsdWVJdGVtKCkge1xufVxuXG5WYWx1ZUl0ZW0ucHJvdG90eXBlID0ge1xuXHR0b19zZXQ6ICcnLFxuXHRwcmV2UmVzdWx0OiBudWxsLFxuXHRwcmV2VmFsdWU6IG51bGwsXG5cdC8qKlxuXHQgKiBAdHlwZSB7SW5wdXREYXRhfVxuXHQgKi9cblx0aW5wdXQ6IG51bGwsXG5cdGZyZXF1ZW5jeTogJycsXG5cdHNldF9vbl9lbXB0eTogZmFsc2UsXG5cdC8qKlxuXHQgKiBAdHlwZSB7Q2FsY3VsYXRlZEZvcm11bGFbXX1cblx0ICovXG5cdGZvcm11bGFzOiBbXSxcblx0LyoqXG5cdCAqIEBwYXJhbSAgaW5wdXQge0lucHV0RGF0YX1cblx0ICogQHJldHVybiB7Ym9vbGVhbn1cblx0ICovXG5cdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtdmFyc1xuXHRpc1N1cHBvcnRlZCggaW5wdXQgKSB7XG5cdFx0cmV0dXJuIHRydWU7XG5cdH0sXG5cdG9ic2VydmUoXG5cdFx0e1xuXHRcdFx0dG9fc2V0OiB0b1NldCxcblx0XHRcdGNvbmRpdGlvbnMgPSBbXSxcblx0XHRcdHNldF9vbl9lbXB0eTogc2V0T25FbXB0eSA9IGZhbHNlLFxuXHRcdFx0ZnJlcXVlbmN5ID0gJ29uX2NoYW5nZScsXG5cdFx0fSxcblx0XHRpbnB1dCxcblx0KSB7XG5cdFx0dGhpcy5pbnB1dCAgICAgICAgPSBpbnB1dDtcblx0XHR0aGlzLmZyZXF1ZW5jeSAgICA9IGZyZXF1ZW5jeTtcblx0XHR0aGlzLnNldF9vbl9lbXB0eSA9IHNldE9uRW1wdHk7XG5cdFx0dGhpcy5wcmV2UmVzdWx0ICAgPSBudWxsO1xuXHRcdHRoaXMucHJldlZhbHVlICAgID0gbnVsbDtcblx0XHR0aGlzLnRvX3NldCAgICAgICA9IHRvU2V0O1xuXHRcdHRoaXMuZm9ybXVsYXMgICAgID0gW107XG5cblx0XHR0aGlzLm9ic2VydmVTZXRWYWx1ZSggY29uZGl0aW9ucywgaW5wdXQgKTtcblxuXHRcdGNvbnN0IGxpc3QgPSBuZXcgQ29uZGl0aW9uc0xpc3QoIGNvbmRpdGlvbnMsIGlucHV0LnJvb3QgKTtcblxuXHRcdGlmICggbGlzdC5jb25kaXRpb25zPy5sZW5ndGggKSB7XG5cdFx0XHRsaXN0Lm9uQ2hhbmdlUmVsYXRlZCA9ICgpID0+IHRoaXMuYXBwbHlWYWx1ZSggbGlzdCApO1xuXHRcdFx0bGlzdC5vYnNlcnZlKCk7XG5cdFx0XHRsaXN0Lm9uQ2hhbmdlUmVsYXRlZCgpO1xuXG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Zm9yICggY29uc3QgZm9ybXVsYSBvZiB0aGlzLmZvcm11bGFzICkge1xuXHRcdFx0Y29uc3QgcmVzdWx0Q2FsbGJhY2sgPSBmb3JtdWxhLnNldFJlc3VsdC5iaW5kKCBmb3JtdWxhICk7XG5cblx0XHRcdGZvcm11bGEuc2V0UmVzdWx0ID0gKCkgPT4ge1xuXHRcdFx0XHRyZXN1bHRDYWxsYmFjaygpO1xuXHRcdFx0XHR0aGlzLmFwcGx5VmFsdWUoIGZhbHNlLCB0cnVlICk7XG5cdFx0XHR9O1xuXHRcdFx0Zm9ybXVsYS5zZXRSZXN1bHQoKTtcblx0XHR9XG5cdH0sXG5cdG9ic2VydmVTZXRWYWx1ZSggY29uZGl0aW9ucywgaW5wdXQgKSB7XG5cdFx0Y29uc3QgZm9ybXVsYSA9IG5ldyBDYWxjdWxhdGVkRm9ybXVsYSggaW5wdXQgKTtcblxuXHRcdGZvcm11bGEub2JzZXJ2ZSggdGhpcy50b19zZXQgKTtcblx0XHRmb3JtdWxhLnNldFJlc3VsdCA9ICgpID0+IHtcblx0XHRcdHRoaXMudG9fc2V0ID0gJycgKyBmb3JtdWxhLmNhbGN1bGF0ZSgpO1xuXHRcdH07XG5cdFx0Zm9ybXVsYS5zZXRSZXN1bHQoKTtcblxuXHRcdHRoaXMuZm9ybXVsYXMucHVzaCggZm9ybXVsYSApO1xuXHR9LFxuXHQvKipcblx0ICogQHBhcmFtIGxpc3QgICAgICAgIHtDb25kaXRpb25zTGlzdHxib29sZWFufVxuXHQgKiBAcGFyYW0gZm9yY2VSZXN1bHQge2Jvb2xlYW58bnVsbH1cblx0ICovXG5cdGFwcGx5VmFsdWUoIGxpc3QsIGZvcmNlUmVzdWx0ID0gbnVsbCApIHtcblx0XHRsZXQgcmVzdWx0ID0gZmFsc2U7XG5cblx0XHRpZiAoIGxpc3QgKSB7XG5cdFx0XHRyZXN1bHQgPSBsaXN0LmdldFJlc3VsdCgpO1xuXHRcdH1cblx0XHRlbHNlIHtcblx0XHRcdHJlc3VsdCA9IGZvcmNlUmVzdWx0O1xuXHRcdH1cblxuXHRcdHN3aXRjaCAoIHRoaXMuZnJlcXVlbmN5ICkge1xuXHRcdFx0Y2FzZSAnYWx3YXlzJzpcblx0XHRcdFx0dGhpcy5zZXRWYWx1ZSggcmVzdWx0ICk7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSAnb25fY2hhbmdlJzpcblx0XHRcdFx0aWYgKCB0aGlzLnByZXZSZXN1bHQgPT09IHJlc3VsdCApIHtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0fVxuXHRcdFx0XHR0aGlzLnByZXZSZXN1bHQgPSByZXN1bHQ7XG5cdFx0XHRcdHRoaXMuc2V0VmFsdWUoIHJlc3VsdCApO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgJ29uY2UnOlxuXHRcdFx0XHRpZiAoICFyZXN1bHQgKSB7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdH1cblx0XHRcdFx0dGhpcy5zZXRWYWx1ZSgpO1xuXG5cdFx0XHRcdGlmICggbGlzdCApIHtcblx0XHRcdFx0XHRsaXN0Lm9uQ2hhbmdlUmVsYXRlZCA9ICgpID0+IHt9O1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0dGhpcy5mb3JtdWxhcy5mb3JFYWNoKCBjdXJyZW50ID0+IGN1cnJlbnQuY2xlYXJXYXRjaGVycygpICk7XG5cblx0XHRcdFx0YnJlYWs7XG5cdFx0fVxuXHR9LFxuXHRzZXRWYWx1ZSggcmVzdWx0ID0gdHJ1ZSApIHtcblx0XHRpZiAoICFyZXN1bHQgKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdGlmICggdGhpcy5zZXRfb25fZW1wdHkgKSB7XG5cdFx0XHR0aGlzLmlucHV0LnZhbHVlLnNldElmRW1wdHkoIHRoaXMudG9fc2V0ICk7XG5cdFx0fVxuXHRcdGVsc2Uge1xuXHRcdFx0dGhpcy5pbnB1dC52YWx1ZS5jdXJyZW50ID0gdGhpcy50b19zZXQ7XG5cdFx0fVxuXHR9LFxufTtcblxuZXhwb3J0IGRlZmF1bHQgVmFsdWVJdGVtOyIsImltcG9ydCBWYWx1ZUl0ZW0gZnJvbSAnLi9WYWx1ZUl0ZW0nO1xuaW1wb3J0IE11bHRpcGxlVmFsdWVJdGVtIGZyb20gJy4vTXVsdGlwbGVWYWx1ZUl0ZW0nO1xuaW1wb3J0IFJlYWN0aXZlVmFsdWUgZnJvbSAnLi9SZWFjdGl2ZVZhbHVlJztcblxuY29uc3QgeyBhcHBseUZpbHRlcnMgfSA9IEpldFBsdWdpbnMuaG9va3M7XG5cbmNvbnN0IGdldFZhbHVlcyA9ICgpID0+IGFwcGx5RmlsdGVycyhcblx0J2pldC5mYi5keW5hbWljLnZhbHVlLnR5cGVzJyxcblx0W1xuXHRcdE11bHRpcGxlVmFsdWVJdGVtLFxuXHRcdFZhbHVlSXRlbSxcblx0XSxcbik7XG4vKipcbiAqIEB0eXBlIHtWYWx1ZUl0ZW1bXX1cbiAqL1xubGV0IHZhbHVlcyAgICAgID0gW107XG5cbi8qKlxuICogQHBhcmFtICBpbnB1dFxuICogQHJldHVybiB7VmFsdWVJdGVtfVxuICovXG5jb25zdCBnZXRWYWx1ZSA9ICggaW5wdXQgKSA9PiB7XG5cdGlmICggIXZhbHVlcy5sZW5ndGggKSB7XG5cdFx0dmFsdWVzID0gZ2V0VmFsdWVzKCk7XG5cdH1cblxuXHRmb3IgKCBjb25zdCB2YWx1ZSBvZiB2YWx1ZXMgKSB7XG5cdFx0Y29uc3QgY3VycmVudCA9IG5ldyB2YWx1ZSgpO1xuXG5cdFx0aWYgKCAhY3VycmVudC5pc1N1cHBvcnRlZCggaW5wdXQgKSApIHtcblx0XHRcdGNvbnRpbnVlO1xuXHRcdH1cblx0XHRyZXR1cm4gY3VycmVudDtcblx0fVxufTtcblxuZnVuY3Rpb24gY3JlYXRlVmFsdWVzKCBqc29uLCBpbnB1dCApIHtcblx0Y29uc3QgZ3JvdXBzID0gSlNPTi5wYXJzZSgganNvbiApO1x0XG5cblx0Zm9yICggY29uc3QgZ3JvdXAgb2YgZ3JvdXBzICkge1xuXHRcdGNvbnN0IHZhbHVlID0gZ2V0VmFsdWUoIGlucHV0ICk7XG5cblx0XHR2YWx1ZS5vYnNlcnZlKCBncm91cCwgaW5wdXQgKTtcblx0fVxufVxuXG5mdW5jdGlvbiBwYXJzZUlucHV0KCBpbnB1dCApIHtcblx0Y29uc3QgWyBub2RlIF0gPSBpbnB1dC5ub2Rlcztcblx0Y29uc3Qgd3JhcHBlciAgPSBub2RlLmNsb3Nlc3QoICcuamV0LWZvcm0tYnVpbGRlci1yb3cnICk7XG5cblx0aWYgKCB3cmFwcGVyICYmIHdyYXBwZXIuZGF0YXNldC5oYXNPd25Qcm9wZXJ0eSggJ3ZhbHVlJyApICkge1xuXHRcdGNyZWF0ZVZhbHVlcyggd3JhcHBlci5kYXRhc2V0LnZhbHVlLCBpbnB1dCApO1xuXHR9XG5cdC8vIGZvciBoaWRkZW4tZmllbGQgY2FzZVxuXHRlbHNlIGlmICggbm9kZS5kYXRhc2V0Lmhhc093blByb3BlcnR5KCAnZHluYW1pY1ZhbHVlJyApICkge1xuXHRcdGNyZWF0ZVZhbHVlcyggbm9kZS5kYXRhc2V0LmR5bmFtaWNWYWx1ZSwgaW5wdXQgKTtcblx0fVxuXG5cdGZvciAoIGNvbnN0IHByb3BlcnR5IG9mIGdldFByb3BlcnRpZXMoIGlucHV0ICkgKSB7XG5cdFx0cHJvcGVydHkucnVuT2JzZXJ2ZSggaW5wdXQgKTtcblx0fVxuXG59XG5cbmltcG9ydCBCYXNlUmVhY3RpdmVQcm9wZXJ0eSBmcm9tICcuL0Jhc2VSZWFjdGl2ZVByb3BlcnR5JztcblxuLyoqXG4gKiBAdHlwZSB7QmFzZVJlYWN0aXZlUHJvcGVydHlbXX1cbiAqL1xuY29uc3QgcmVhY3RQcm9wZXJ0aWVzID0gW1xuXHRuZXcgQmFzZVJlYWN0aXZlUHJvcGVydHkoICdtaW4nICksXG5cdG5ldyBCYXNlUmVhY3RpdmVQcm9wZXJ0eSggJ21heCcgKSxcblx0bmV3IFJlYWN0aXZlVmFsdWUoKSxcbl07XG5cbi8qKlxuICogQHBhcmFtICBpbnB1dCB7SW5wdXREYXRhfVxuICogQHJldHVybiB7R2VuZXJhdG9yPEJhc2VSZWFjdGl2ZVByb3BlcnR5Pn1cbiAqL1xuZnVuY3Rpb24qIGdldFByb3BlcnRpZXMoIGlucHV0ICkge1xuXHRmb3IgKCBjb25zdCByZWFjdFByb3BlcnR5IG9mIHJlYWN0UHJvcGVydGllcyApIHtcblx0XHRpZiAoXG5cdFx0XHRyZWFjdFByb3BlcnR5LmlzU3VwcG9ydGVkKCBpbnB1dCApXG5cdFx0KSB7XG5cdFx0XHR5aWVsZCByZWFjdFByb3BlcnR5O1xuXHRcdH1cblx0fVxuXG59XG5cbmV4cG9ydCB7IHBhcnNlSW5wdXQsIGdldFByb3BlcnRpZXMgfTsiLCIvLyBUaGUgbW9kdWxlIGNhY2hlXG52YXIgX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fID0ge307XG5cbi8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG5mdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG5cdC8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZVxuXHR2YXIgY2FjaGVkTW9kdWxlID0gX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXTtcblx0aWYgKGNhY2hlZE1vZHVsZSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0cmV0dXJuIGNhY2hlZE1vZHVsZS5leHBvcnRzO1xuXHR9XG5cdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG5cdHZhciBtb2R1bGUgPSBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdID0ge1xuXHRcdC8vIG5vIG1vZHVsZS5pZCBuZWVkZWRcblx0XHQvLyBubyBtb2R1bGUubG9hZGVkIG5lZWRlZFxuXHRcdGV4cG9ydHM6IHt9XG5cdH07XG5cblx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG5cdGlmICghKG1vZHVsZUlkIGluIF9fd2VicGFja19tb2R1bGVzX18pKSB7XG5cdFx0ZGVsZXRlIF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF07XG5cdFx0dmFyIGUgPSBuZXcgRXJyb3IoXCJDYW5ub3QgZmluZCBtb2R1bGUgJ1wiICsgbW9kdWxlSWQgKyBcIidcIik7XG5cdFx0ZS5jb2RlID0gJ01PRFVMRV9OT1RfRk9VTkQnO1xuXHRcdHRocm93IGU7XG5cdH1cblx0X193ZWJwYWNrX21vZHVsZXNfX1ttb2R1bGVJZF0obW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cblx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcblx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xufVxuXG4iLCIvLyBkZWZpbmUgZ2V0dGVyIGZ1bmN0aW9ucyBmb3IgaGFybW9ueSBleHBvcnRzXG5fX3dlYnBhY2tfcmVxdWlyZV9fLmQgPSAoZXhwb3J0cywgZGVmaW5pdGlvbikgPT4ge1xuXHRmb3IodmFyIGtleSBpbiBkZWZpbml0aW9uKSB7XG5cdFx0aWYoX193ZWJwYWNrX3JlcXVpcmVfXy5vKGRlZmluaXRpb24sIGtleSkgJiYgIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBrZXkpKSB7XG5cdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywga2V5LCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZGVmaW5pdGlvbltrZXldIH0pO1xuXHRcdH1cblx0fVxufTsiLCJfX3dlYnBhY2tfcmVxdWlyZV9fLm8gPSAob2JqLCBwcm9wKSA9PiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwgcHJvcCkpIiwiLy8gZGVmaW5lIF9fZXNNb2R1bGUgb24gZXhwb3J0c1xuX193ZWJwYWNrX3JlcXVpcmVfXy5yID0gKGV4cG9ydHMpID0+IHtcblx0aWYodHlwZW9mIFN5bWJvbCAhPT0gJ3VuZGVmaW5lZCcgJiYgU3ltYm9sLnRvU3RyaW5nVGFnKSB7XG5cdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFN5bWJvbC50b1N0cmluZ1RhZywgeyB2YWx1ZTogJ01vZHVsZScgfSk7XG5cdH1cblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogdHJ1ZSB9KTtcbn07IiwiaW1wb3J0IHsgcGFyc2VJbnB1dCB9IGZyb20gJy4vZnVuY3Rpb25zJztcblxuY29uc3QgeyBhZGRBY3Rpb24gfSA9IEpldFBsdWdpbnMuaG9va3M7XG5cbmFkZEFjdGlvbihcblx0J2pldC5mYi5vYnNlcnZlLmFmdGVyJyxcblx0J2pldC1mb3JtLWJ1aWxkZXIvZHluYW1pYy12YWx1ZScsXG5cdC8qKlxuXHQgKiBAcGFyYW0gb2JzZXJ2YWJsZSB7T2JzZXJ2YWJsZX1cblx0ICovXG5cdGZ1bmN0aW9uICggb2JzZXJ2YWJsZSApIHtcblx0XHRmb3IgKCBjb25zdCBkYXRhSW5wdXQgb2Ygb2JzZXJ2YWJsZS5nZXRJbnB1dHMoKSApIHtcblx0XHRcdHBhcnNlSW5wdXQoIGRhdGFJbnB1dCApO1xuXHRcdH1cblx0fVxuKTtcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==