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 / multi.step.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
multi.step.js
723 lines
1 /******/ (() => { // webpackBootstrap
2 /******/ "use strict";
3 /******/ var __webpack_modules__ = ({
4
5 /***/ "./frontend/multi.step/ConditionPageStateItem.js"
6 /*!*******************************************************!*\
7 !*** ./frontend/multi.step/ConditionPageStateItem.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 ConditionItem
17 } = JetFormBuilderAbstract;
18 function ConditionPageStateItem() {
19 ConditionItem.call(this);
20 this.isSupported = function (options) {
21 return !!options?.page_state?.length;
22 };
23 this.setOptions = function ({
24 page_state: pageState
25 }) {
26 this.pageState = pageState;
27 };
28 this.isPassed = function () {
29 const canSwitch = this.list?.block?.page?.canSwitch?.current;
30 switch (this.pageState) {
31 case 'active':
32 return !canSwitch;
33 default:
34 return false;
35 }
36 };
37 }
38 ConditionPageStateItem.prototype = Object.create(ConditionItem.prototype);
39 /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (ConditionPageStateItem);
40
41 /***/ },
42
43 /***/ "./frontend/multi.step/MultiStepState.js"
44 /*!***********************************************!*\
45 !*** ./frontend/multi.step/MultiStepState.js ***!
46 \***********************************************/
47 (__unused_webpack_module, __webpack_exports__, __webpack_require__) {
48
49 __webpack_require__.r(__webpack_exports__);
50 /* harmony export */ __webpack_require__.d(__webpack_exports__, {
51 /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
52 /* harmony export */ });
53 /* harmony import */ var _PageState__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./PageState */ "./frontend/multi.step/PageState.js");
54 /* harmony import */ var _ProgressBar__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./ProgressBar */ "./frontend/multi.step/ProgressBar.js");
55
56
57 const {
58 ConditionalBlock,
59 ReactiveVar
60 } = JetFormBuilderAbstract;
61 const {
62 doAction
63 } = JetPlugins.hooks;
64
65 // eslint-disable-next-line max-lines-per-function
66 function MultiStepState() {
67 /**
68 * @type {Observable}
69 */
70 this.root = null;
71
72 /**
73 * @type {ConditionalBlock}
74 */
75 this.block = null;
76
77 /**
78 * Current page index
79 * @type {ReactiveVar}
80 */
81 this.index = null;
82
83 /**
84 * Node elements of pages
85 * @type {Array<PageState> | *}
86 */
87 this.elements = [];
88 this.setScope = function (rootOrBlock) {
89 if (rootOrBlock instanceof ConditionalBlock) {
90 this.block = rootOrBlock;
91 } else {
92 this.root = rootOrBlock;
93 }
94 };
95 this.setProgress = function () {
96 this.index = new ReactiveVar(1);
97 this.index.make();
98 this.index.watch(this.onChangeIndex.bind(this));
99 for (const child of this.getScopeNode().children) {
100 if (!child.matches('.jet-form-builder-progress-pages')) {
101 continue;
102 }
103 this.progress = new _ProgressBar__WEBPACK_IMPORTED_MODULE_1__["default"](child, this);
104 }
105 };
106 /**
107 * @param pages {Element[]}
108 */
109 this.setPages = function (pages) {
110 /**
111 * Multistep is initializing for all form or
112 * specific conditional block.
113 *
114 * We need to separate global & block multistep
115 */
116 this.elements = pages.map(page => new _PageState__WEBPACK_IMPORTED_MODULE_0__["default"](page, this));
117 this.elements.forEach(page => page.observe());
118 /**
119 * We should run this method separately, because it initializes
120 * conditional blocks, which could remove some part of nodes from DOM
121 *
122 * And this breaks logic of the other modules
123 * (switch-page-on-change for example)
124 */
125 this.elements.forEach(page => page.observeConditionalBlocks());
126 const {
127 submitter
128 } = this.getRoot().getSubmit();
129 // is ajax
130 if (!submitter.hasOwnProperty('status')) {
131 return;
132 }
133 submitter.watchReset(() => {
134 this.index.current = 1;
135 });
136 };
137 this.onChangeIndex = function () {
138 for (const page of this.getPages()) {
139 page.isShow.current = page.index === this.index.current;
140 }
141 window?.jQuery(document)?.trigger('jet-form-builder/switch-page');
142 };
143 this.getCurrentPage = function () {
144 for (const page of this.getPages()) {
145 if (page.isShow.current) {
146 return page;
147 }
148 }
149 return false;
150 };
151 /**
152 * @return {Array<PageState>}
153 */
154 this.getPages = function () {
155 return this.elements;
156 };
157 /**
158 * @return {HTMLElement|HTMLFormElement}
159 */
160 this.getScopeNode = function () {
161 var _this$block$node;
162 return (_this$block$node = this.block?.node) !== null && _this$block$node !== void 0 ? _this$block$node : this.root.rootNode;
163 };
164 /**
165 * @return {Observable}
166 */
167 this.getRoot = function () {
168 var _this$block$root;
169 return (_this$block$root = this.block?.root) !== null && _this$block$root !== void 0 ? _this$block$root : this.root;
170 };
171
172 /**
173 * @param page {PageState}
174 */
175 this.isLastPage = function (page) {
176 return this.elements.at(-1) === page;
177 };
178
179 /**
180 * @since 3.0.5
181 *
182 * @param page
183 * @return {boolean}
184 */
185 this.isFirstPage = function (page) {
186 return this.elements[0] === page;
187 };
188 this.onReady = function () {
189 doAction('jet.fb.multistep.init', this);
190 };
191 }
192 /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (MultiStepState);
193
194 /***/ },
195
196 /***/ "./frontend/multi.step/PageState.js"
197 /*!******************************************!*\
198 !*** ./frontend/multi.step/PageState.js ***!
199 \******************************************/
200 (__unused_webpack_module, __webpack_exports__, __webpack_require__) {
201
202 __webpack_require__.r(__webpack_exports__);
203 /* harmony export */ __webpack_require__.d(__webpack_exports__, {
204 /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
205 /* harmony export */ });
206 /* harmony import */ var _ConditionPageStateItem__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./ConditionPageStateItem */ "./frontend/multi.step/ConditionPageStateItem.js");
207
208 const {
209 ReactiveVar,
210 createConditionalBlock
211 } = JetFormBuilderAbstract;
212 const {
213 validateInputs,
214 getOffsetTop,
215 focusOnInvalidInput,
216 populateInputs
217 } = JetFormBuilderFunctions;
218 const {
219 addAction,
220 doAction
221 } = JetPlugins.hooks;
222
223 /**
224 * @property {InputData[]} inputs Inner inputs
225 * @property {MultiStepState} state Multistep state
226 * @property {Element} node Related node, element
227 * @param {Element} node Related node, element
228 * @param {MultiStepState} state Multistep state
229 */
230 function PageState(node, state) {
231 this.node = node;
232 this.index = +node.dataset.page;
233 this.offset = +node.dataset.pageOffset;
234 this.state = state;
235 this.inputs = [];
236 this.inputBindings = new Map();
237 this.canSwitch = new ReactiveVar(null);
238 this.isShow = new ReactiveVar(1 === this.index);
239
240 /**
241 * @since 3.0.1
242 */
243 this.autoFocus = window.JetFormBuilderSettings?.auto_focus;
244
245 /**
246 * @since 3.0.5
247 * @type {boolean}
248 */
249 this.initialObserveState = false;
250 }
251 PageState.prototype.observe = function () {
252 if (!this.isLast()) {
253 this.observeInputs();
254 }
255 this.canSwitch.make();
256 this.isShow.make();
257 this.isShow.watch(() => {
258 // eslint-disable-next-line no-unused-expressions
259 this.isShow.current ? this.onShow() : this.onHide();
260 });
261 this.addButtonsListeners();
262
263 /**
264 * We check the fields only for the first page.
265 * And for the following, we do it when switching pages
266 * (in the `onShow` method)
267 *
268 * We do this because on other pages the fields are always
269 * checked with a successful result due to the check on `isVisible`
270 *
271 * @since 3.0.5
272 *
273 * @see https://github.com/Crocoblock/issues-tracker/issues/2781#issuecomment-1517928213
274 * @see PageState.onShow
275 * @see InputData.isVisible
276 */
277 if (this.isFirst()) {
278 this.initialObserveState = true;
279 this.updateStateAsync().then(() => {}).catch(() => {});
280 }
281 this.updateOffsetByProgress();
282 addAction('jet.fb.observe.input.manual', 'jet-form-builder/page-state', input => this.observeInput(input.nodes[0]));
283 doAction('jet.fb.multistep.page.init', this);
284 };
285 PageState.prototype.observeInputs = function () {
286 for (const node of this.node.querySelectorAll('[data-jfb-sync]')) {
287 const input = this.observeInput(node);
288
289 // eslint-disable-next-line no-unused-expressions
290 input && doAction('jet.fb.multistep.page.observed.input', input, this);
291 }
292 };
293
294 /**
295 * @param node {Element}
296 */
297 PageState.prototype.observeInput = function (node) {
298 if (!this.isNodeBelongThis(node) || !node.hasOwnProperty('jfbSync') || node.jfbSync.hasParent()) {
299 return false;
300 }
301
302 /**
303 * @type {InputData}
304 */
305 const input = node.jfbSync;
306 return this.registerInput(input);
307 };
308 /**
309 * Buttons for switching between pages are hidden conditional blocks
310 * that perform their function (disable)
311 * if all required fields are filled in the page.
312 */
313 PageState.prototype.observeConditionalBlocks = function () {
314 if (this.isLast()) {
315 return;
316 }
317 for (const node of this.node.querySelectorAll('[data-jfb-conditional]')) {
318 if (!this.isNodeBelongThis(node)) {
319 continue;
320 }
321 const block = createConditionalBlock(node, this.state.getRoot());
322 for (const condition of block.list.getConditions()) {
323 // eslint-disable-next-line max-depth
324 if (condition instanceof _ConditionPageStateItem__WEBPACK_IMPORTED_MODULE_0__["default"]) {
325 block.page = this;
326 this.canSwitch.watch(() => block.list.onChangeRelated());
327 break;
328 }
329 }
330 }
331 };
332
333 /**
334 * @since 3.0.5 We check the fields if this is done for the first time
335 * @since 3.0.0 Introduced
336 */
337 PageState.prototype.onShow = function () {
338 this.node.classList.remove('jet-form-builder-page--hidden');
339 if (this.initialObserveState) {
340 return;
341 }
342 this.initialObserveState = true;
343 this.updateStateAsync().then(() => {}).catch(() => {});
344 };
345 PageState.prototype.onHide = function () {
346 this.node.classList.add('jet-form-builder-page--hidden');
347 };
348 PageState.prototype.updateState = function () {
349 for (const input of this.getInputs()) {
350 if (input.reporting.validityState.current || null === input.reporting.validityState.current) {
351 continue;
352 }
353 this.canSwitch.current = false;
354 return;
355 }
356 this.canSwitch.current = true;
357 };
358 PageState.prototype.updateStateAsync = async function (silence = true) {
359 try {
360 await validateInputs(this.getInputs(), silence);
361 this.canSwitch.current = true;
362 } catch (error) {
363 this.canSwitch.current = false;
364 }
365 };
366 PageState.prototype.addButtonsListeners = function () {
367 const switchButtons = this.node.querySelectorAll('.jet-form-builder__next-page, .jet-form-builder__prev-page');
368 for (const switchButton of switchButtons) {
369 if (!this.isNodeBelongThis(switchButton)) {
370 continue;
371 }
372 const isPrev = switchButton.classList.contains('jet-form-builder__prev-page');
373 switchButton.addEventListener('click', () => this.changePage(isPrev));
374 }
375 };
376 PageState.prototype.changePage = async function (isBack) {
377 if (isBack) {
378 this.state.index.current = this.index - 1;
379 return;
380 }
381 if (this.isLast()) {
382 return;
383 }
384 if (this.getLockState().current) {
385 return;
386 }
387 await this.updateStateAsync(false);
388 if (this.canSwitch.current) {
389 this.state.index.current = this.index + 1;
390 return;
391 }
392
393 // eslint-disable-next-line no-unused-expressions
394 this.autoFocus && focusOnInvalidInput(this.getInputs());
395 };
396 PageState.prototype.isNodeBelongThis = function (node) {
397 const parentPage = node.closest('.jet-form-builder-page');
398 return parentPage ? parentPage.isEqualNode(this.node) : false;
399 };
400 /**
401 * @return {Array<InputData> | *}
402 */
403 PageState.prototype.getInputs = function () {
404 return populateInputs(this.inputs);
405 };
406
407 /**
408 * @return {LoadingReactiveVar}
409 */
410 PageState.prototype.getLockState = function () {
411 var _root$parent$root$for;
412 /**
413 * @type {Observable}
414 */
415 const root = this.state.getRoot();
416 const form = (_root$parent$root$for = root?.parent?.root?.form) !== null && _root$parent$root$for !== void 0 ? _root$parent$root$for : root.form;
417 return form.lockState;
418 };
419 PageState.prototype.isLast = function () {
420 return this.state.isLastPage(this);
421 };
422
423 /**
424 * @since 3.0.5
425 *
426 * @return {boolean}
427 */
428 PageState.prototype.isFirst = function () {
429 return this.state.isFirstPage(this);
430 };
431
432 /**
433 * @param input {InputData|RepeaterData}
434 */
435 PageState.prototype.handleInputEnter = function (input) {
436 input?.enterKey?.addFilter(() => {
437 const form = input.root.form;
438 if (form) {
439 if (true === form.canTriggerEnterSubmit) {
440 this.changePage().then(() => {}).catch(() => {});
441 }
442 } else {
443 this.changePage().then(() => {}).catch(() => {});
444 }
445
446 // prevent submit
447 return false;
448 });
449 };
450 PageState.prototype.registerInput = function (input, {
451 includeInValidation = true
452 } = {}) {
453 if (!input || this.inputBindings.has(input)) {
454 return input;
455 }
456 this.handleInputEnter(input);
457 const clearLoadingWatch = input.loading.watch(() => {
458 if (input.loading.current) {
459 this.canSwitch.current = false;
460 } else {
461 this.updateState();
462 }
463 });
464 const binding = {
465 clearLoadingWatch,
466 clearValidityWatch: null
467 };
468 if (input.reporting.restrictions.length) {
469 this.inputs.push(input);
470 binding.clearValidityWatch = input.watchValidity(() => this.updateState());
471 if (!includeInValidation) {
472 this.inputs = this.inputs.filter(current => current !== input);
473 }
474 }
475 this.inputBindings.set(input, binding);
476 return input;
477 };
478 PageState.prototype.unregisterInput = function (input) {
479 if (!this.inputBindings.has(input)) {
480 return;
481 }
482 const binding = this.inputBindings.get(input);
483 binding?.clearLoadingWatch?.();
484 binding?.clearValidityWatch?.();
485 this.inputBindings.delete(input);
486 this.inputs = this.inputs.filter(current => current !== input);
487 };
488 PageState.prototype.getTrackedInputs = function () {
489 return Array.from(this.inputBindings.keys());
490 };
491 PageState.prototype.getOffsetTop = function () {
492 return getOffsetTop(this.node) - this.offset;
493 };
494
495 /**
496 * @since 3.2.3
497 */
498 PageState.prototype.updateOffsetByProgress = function () {
499 if (!this.state?.progress?.node) {
500 return;
501 }
502 this.offset += +this.state.progress.node.clientHeight;
503 };
504 /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (PageState);
505
506 /***/ },
507
508 /***/ "./frontend/multi.step/ProgressBar.js"
509 /*!********************************************!*\
510 !*** ./frontend/multi.step/ProgressBar.js ***!
511 \********************************************/
512 (__unused_webpack_module, __webpack_exports__, __webpack_require__) {
513
514 __webpack_require__.r(__webpack_exports__);
515 /* harmony export */ __webpack_require__.d(__webpack_exports__, {
516 /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
517 /* harmony export */ });
518 function ProgressBar(node, state) {
519 /**
520 * @param node {HTMLElement}
521 * @param state {MultiStepState}
522 */
523 this.node = node;
524 this.state = state;
525 this.state.index.watch(() => this.updateItems());
526 this.updateItems = function () {
527 const {
528 current
529 } = this.state.index;
530 for (const item of this.node.children) {
531 const pageIndex = +item.dataset.page;
532 if (pageIndex < current) {
533 this.makePassed(item);
534 } else if (current === pageIndex) {
535 this.makeActive(item);
536 } else {
537 this.makeNotPassed(item);
538 }
539 }
540 };
541
542 /**
543 * @param element {HTMLElement}
544 */
545 this.makeActive = function (element) {
546 element.classList.remove('passed-page');
547 element.classList.add('active-page');
548 };
549
550 /**
551 * @param element {HTMLElement}
552 */
553 this.makePassed = function (element) {
554 element.classList.add('passed-page');
555 element.classList.remove('active-page');
556 };
557 this.makeNotPassed = function (element) {
558 element.classList.remove('active-page', 'passed-page');
559 };
560 }
561 /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (ProgressBar);
562
563 /***/ },
564
565 /***/ "./frontend/multi.step/functions.js"
566 /*!******************************************!*\
567 !*** ./frontend/multi.step/functions.js ***!
568 \******************************************/
569 (__unused_webpack_module, __webpack_exports__, __webpack_require__) {
570
571 __webpack_require__.r(__webpack_exports__);
572 /* harmony export */ __webpack_require__.d(__webpack_exports__, {
573 /* harmony export */ createMultiStep: () => (/* binding */ createMultiStep)
574 /* harmony export */ });
575 /* harmony import */ var _MultiStepState__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./MultiStepState */ "./frontend/multi.step/MultiStepState.js");
576
577 function createMultiStep(rootOrBlock) {
578 const multistep = new _MultiStepState__WEBPACK_IMPORTED_MODULE_0__["default"]();
579 multistep.setScope(rootOrBlock);
580 const pages = [];
581 for (const child of multistep.getScopeNode().childNodes) {
582 if (!child?.classList?.contains('jet-form-builder-page')) {
583 continue;
584 }
585 pages.push(child);
586 }
587 if (!pages.length) {
588 return multistep;
589 }
590 multistep.setProgress();
591 multistep.setPages(pages);
592 return multistep;
593 }
594
595
596 /***/ }
597
598 /******/ });
599 /************************************************************************/
600 /******/ // The module cache
601 /******/ var __webpack_module_cache__ = {};
602 /******/
603 /******/ // The require function
604 /******/ function __webpack_require__(moduleId) {
605 /******/ // Check if module is in cache
606 /******/ var cachedModule = __webpack_module_cache__[moduleId];
607 /******/ if (cachedModule !== undefined) {
608 /******/ return cachedModule.exports;
609 /******/ }
610 /******/ // Create a new module (and put it into the cache)
611 /******/ var module = __webpack_module_cache__[moduleId] = {
612 /******/ // no module.id needed
613 /******/ // no module.loaded needed
614 /******/ exports: {}
615 /******/ };
616 /******/
617 /******/ // Execute the module function
618 /******/ if (!(moduleId in __webpack_modules__)) {
619 /******/ delete __webpack_module_cache__[moduleId];
620 /******/ var e = new Error("Cannot find module '" + moduleId + "'");
621 /******/ e.code = 'MODULE_NOT_FOUND';
622 /******/ throw e;
623 /******/ }
624 /******/ __webpack_modules__[moduleId](module, module.exports, __webpack_require__);
625 /******/
626 /******/ // Return the exports of the module
627 /******/ return module.exports;
628 /******/ }
629 /******/
630 /************************************************************************/
631 /******/ /* webpack/runtime/define property getters */
632 /******/ (() => {
633 /******/ // define getter functions for harmony exports
634 /******/ __webpack_require__.d = (exports, definition) => {
635 /******/ for(var key in definition) {
636 /******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {
637 /******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] });
638 /******/ }
639 /******/ }
640 /******/ };
641 /******/ })();
642 /******/
643 /******/ /* webpack/runtime/hasOwnProperty shorthand */
644 /******/ (() => {
645 /******/ __webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))
646 /******/ })();
647 /******/
648 /******/ /* webpack/runtime/make namespace object */
649 /******/ (() => {
650 /******/ // define __esModule on exports
651 /******/ __webpack_require__.r = (exports) => {
652 /******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
653 /******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
654 /******/ }
655 /******/ Object.defineProperty(exports, '__esModule', { value: true });
656 /******/ };
657 /******/ })();
658 /******/
659 /************************************************************************/
660 var __webpack_exports__ = {};
661 // This entry needs to be wrapped in an IIFE because it needs to be isolated against other modules in the chunk.
662 (() => {
663 /*!*************************************!*\
664 !*** ./frontend/multi.step/main.js ***!
665 \*************************************/
666 __webpack_require__.r(__webpack_exports__);
667 /* harmony import */ var _functions__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./functions */ "./frontend/multi.step/functions.js");
668 /* harmony import */ var _ConditionPageStateItem__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./ConditionPageStateItem */ "./frontend/multi.step/ConditionPageStateItem.js");
669
670
671 const {
672 addAction,
673 addFilter
674 } = JetPlugins.hooks;
675 const {
676 getScrollParent
677 } = JetFormBuilderFunctions;
678 addAction('jet.fb.observe.after', 'jet-form-builder/multi-step', function (observable) {
679 const multistep = (0,_functions__WEBPACK_IMPORTED_MODULE_0__.createMultiStep)(observable);
680 if (!multistep.getPages()?.length) {
681 return;
682 }
683 observable.multistep = multistep;
684 multistep.onReady();
685 }, 15);
686 addAction('jet.fb.conditional.init', 'jet-form-builder/multi-step', function (block) {
687 const multistep = (0,_functions__WEBPACK_IMPORTED_MODULE_0__.createMultiStep)(block);
688 if (!multistep.getPages()?.length) {
689 return;
690 }
691 block.multistep = multistep;
692 multistep.onReady();
693 });
694 addFilter('jet.fb.conditional.types', 'jet-form-builder/multi-step', function (items) {
695 items = [_ConditionPageStateItem__WEBPACK_IMPORTED_MODULE_1__["default"], ...items];
696 return items;
697 });
698 addAction('jet.fb.multistep.init', 'jet-form-builder/multi-step/autoscroll',
699 /**
700 * @param multistep {MultiStepState}
701 */
702 function (multistep) {
703 if (!window?.JetFormBuilderSettings?.scroll_on_next) {
704 return;
705 }
706 multistep.index.watch(() => {
707 /**
708 * @type {PageState|boolean}
709 */
710 const page = multistep.getCurrentPage();
711 const parent = getScrollParent(page.node);
712 const top = page.getOffsetTop();
713 parent?.scrollTo?.({
714 top,
715 behavior: 'smooth'
716 });
717 });
718 });
719 })();
720
721 /******/ })()
722 ;
723 //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnJvbnRlbmQvbXVsdGkuc3RlcC5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBOzs7Ozs7Ozs7Ozs7Ozs7O0FDekJBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUlBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUlBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7Ozs7Ozs7Ozs7O0FDMUpBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUFBO0FBQUE7QUFBQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFNQTtBQUNBO0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFLQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFLQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUlBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7Ozs7Ozs7Ozs7QUNsWEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFBQTtBQUFBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7Ozs7Ozs7Ozs7OztBQ2pEQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7Ozs7Ozs7QUN2QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FDN0JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7O0FDUEE7Ozs7O0FDQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7QUNOQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUlBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBSUE7QUFJQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUdBO0FBSUE7QUFFQTtBQUNBO0FBR0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vamZiLy4vZnJvbnRlbmQvbXVsdGkuc3RlcC9Db25kaXRpb25QYWdlU3RhdGVJdGVtLmpzIiwid2VicGFjazovL2pmYi8uL2Zyb250ZW5kL211bHRpLnN0ZXAvTXVsdGlTdGVwU3RhdGUuanMiLCJ3ZWJwYWNrOi8vamZiLy4vZnJvbnRlbmQvbXVsdGkuc3RlcC9QYWdlU3RhdGUuanMiLCJ3ZWJwYWNrOi8vamZiLy4vZnJvbnRlbmQvbXVsdGkuc3RlcC9Qcm9ncmVzc0Jhci5qcyIsIndlYnBhY2s6Ly9qZmIvLi9mcm9udGVuZC9tdWx0aS5zdGVwL2Z1bmN0aW9ucy5qcyIsIndlYnBhY2s6Ly9qZmIvd2VicGFjay9ib290c3RyYXAiLCJ3ZWJwYWNrOi8vamZiL3dlYnBhY2svcnVudGltZS9kZWZpbmUgcHJvcGVydHkgZ2V0dGVycyIsIndlYnBhY2s6Ly9qZmIvd2VicGFjay9ydW50aW1lL2hhc093blByb3BlcnR5IHNob3J0aGFuZCIsIndlYnBhY2s6Ly9qZmIvd2VicGFjay9ydW50aW1lL21ha2UgbmFtZXNwYWNlIG9iamVjdCIsIndlYnBhY2s6Ly9qZmIvLi9mcm9udGVuZC9tdWx0aS5zdGVwL21haW4uanMiXSwic291cmNlc0NvbnRlbnQiOlsiY29uc3QgeyBDb25kaXRpb25JdGVtIH0gPSBKZXRGb3JtQnVpbGRlckFic3RyYWN0O1xuXG5mdW5jdGlvbiBDb25kaXRpb25QYWdlU3RhdGVJdGVtKCkge1xuXHRDb25kaXRpb25JdGVtLmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLmlzU3VwcG9ydGVkID0gZnVuY3Rpb24gKCBvcHRpb25zICkge1xuXHRcdHJldHVybiAhIW9wdGlvbnM/LnBhZ2Vfc3RhdGU/Lmxlbmd0aDtcblx0fTtcblx0dGhpcy5zZXRPcHRpb25zICA9IGZ1bmN0aW9uICggeyBwYWdlX3N0YXRlOiBwYWdlU3RhdGUgfSApIHtcblx0XHR0aGlzLnBhZ2VTdGF0ZSA9IHBhZ2VTdGF0ZTtcblx0fTtcblx0dGhpcy5pc1Bhc3NlZCAgICA9IGZ1bmN0aW9uICgpIHtcblx0XHRjb25zdCBjYW5Td2l0Y2ggPSB0aGlzLmxpc3Q/LmJsb2NrPy5wYWdlPy5jYW5Td2l0Y2g/LmN1cnJlbnQ7XG5cblx0XHRzd2l0Y2ggKCB0aGlzLnBhZ2VTdGF0ZSApIHtcblx0XHRcdGNhc2UgJ2FjdGl2ZSc6XG5cdFx0XHRcdHJldHVybiAhY2FuU3dpdGNoO1xuXHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblx0fTtcbn1cblxuQ29uZGl0aW9uUGFnZVN0YXRlSXRlbS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBDb25kaXRpb25JdGVtLnByb3RvdHlwZSApO1xuXG5leHBvcnQgZGVmYXVsdCBDb25kaXRpb25QYWdlU3RhdGVJdGVtOyIsImltcG9ydCBQYWdlU3RhdGUgZnJvbSAnLi9QYWdlU3RhdGUnO1xuaW1wb3J0IFByb2dyZXNzQmFyIGZyb20gJy4vUHJvZ3Jlc3NCYXInO1xuXG5jb25zdCB7XG5cdCAgICAgIENvbmRpdGlvbmFsQmxvY2ssXG5cdCAgICAgIFJlYWN0aXZlVmFyLFxuICAgICAgfSA9IEpldEZvcm1CdWlsZGVyQWJzdHJhY3Q7XG5cbmNvbnN0IHtcblx0ICAgICAgZG9BY3Rpb24sXG4gICAgICB9ID0gSmV0UGx1Z2lucy5ob29rcztcblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG1heC1saW5lcy1wZXItZnVuY3Rpb25cbmZ1bmN0aW9uIE11bHRpU3RlcFN0YXRlKCkge1xuXG5cdC8qKlxuXHQgKiBAdHlwZSB7T2JzZXJ2YWJsZX1cblx0ICovXG5cdHRoaXMucm9vdCA9IG51bGw7XG5cblx0LyoqXG5cdCAqIEB0eXBlIHtDb25kaXRpb25hbEJsb2NrfVxuXHQgKi9cblx0dGhpcy5ibG9jayA9IG51bGw7XG5cblx0LyoqXG5cdCAqIEN1cnJlbnQgcGFnZSBpbmRleFxuXHQgKiBAdHlwZSB7UmVhY3RpdmVWYXJ9XG5cdCAqL1xuXHR0aGlzLmluZGV4ID0gbnVsbDtcblxuXHQvKipcblx0ICogTm9kZSBlbGVtZW50cyBvZiBwYWdlc1xuXHQgKiBAdHlwZSB7QXJyYXk8UGFnZVN0YXRlPiB8ICp9XG5cdCAqL1xuXHR0aGlzLmVsZW1lbnRzID0gW107XG5cblx0dGhpcy5zZXRTY29wZSAgICA9IGZ1bmN0aW9uICggcm9vdE9yQmxvY2sgKSB7XG5cdFx0aWYgKCByb290T3JCbG9jayBpbnN0YW5jZW9mIENvbmRpdGlvbmFsQmxvY2sgKSB7XG5cdFx0XHR0aGlzLmJsb2NrID0gcm9vdE9yQmxvY2s7XG5cdFx0fVxuXHRcdGVsc2Uge1xuXHRcdFx0dGhpcy5yb290ID0gcm9vdE9yQmxvY2s7XG5cdFx0fVxuXHR9O1xuXHR0aGlzLnNldFByb2dyZXNzID0gZnVuY3Rpb24gKCkge1xuXHRcdHRoaXMuaW5kZXggPSBuZXcgUmVhY3RpdmVWYXIoIDEgKTtcblx0XHR0aGlzLmluZGV4Lm1ha2UoKTtcblx0XHR0aGlzLmluZGV4LndhdGNoKCB0aGlzLm9uQ2hhbmdlSW5kZXguYmluZCggdGhpcyApICk7XG5cblx0XHRmb3IgKCBjb25zdCBjaGlsZCBvZiB0aGlzLmdldFNjb3BlTm9kZSgpLmNoaWxkcmVuICkge1xuXHRcdFx0aWYgKCAhY2hpbGQubWF0Y2hlcyggJy5qZXQtZm9ybS1idWlsZGVyLXByb2dyZXNzLXBhZ2VzJyApICkge1xuXHRcdFx0XHRjb250aW51ZTtcblx0XHRcdH1cblx0XHRcdHRoaXMucHJvZ3Jlc3MgPSBuZXcgUHJvZ3Jlc3NCYXIoIGNoaWxkLCB0aGlzICk7XG5cdFx0fVxuXHR9O1xuXHQvKipcblx0ICogQHBhcmFtIHBhZ2VzIHtFbGVtZW50W119XG5cdCAqL1xuXHR0aGlzLnNldFBhZ2VzID0gZnVuY3Rpb24gKCBwYWdlcyApIHtcblx0XHQvKipcblx0XHQgKiBNdWx0aXN0ZXAgaXMgaW5pdGlhbGl6aW5nIGZvciBhbGwgZm9ybSBvclxuXHRcdCAqIHNwZWNpZmljIGNvbmRpdGlvbmFsIGJsb2NrLlxuXHRcdCAqXG5cdFx0ICogV2UgbmVlZCB0byBzZXBhcmF0ZSBnbG9iYWwgJiBibG9jayBtdWx0aXN0ZXBcblx0XHQgKi9cblx0XHR0aGlzLmVsZW1lbnRzID0gcGFnZXMubWFwKFxuXHRcdFx0cGFnZSA9PiBuZXcgUGFnZVN0YXRlKCBwYWdlLCB0aGlzICksXG5cdFx0KTtcblxuXHRcdHRoaXMuZWxlbWVudHMuZm9yRWFjaChcblx0XHRcdHBhZ2UgPT4gcGFnZS5vYnNlcnZlKCksXG5cdFx0KTtcblx0XHQvKipcblx0XHQgKiBXZSBzaG91bGQgcnVuIHRoaXMgbWV0aG9kIHNlcGFyYXRlbHksIGJlY2F1c2UgaXQgaW5pdGlhbGl6ZXNcblx0XHQgKiBjb25kaXRpb25hbCBibG9ja3MsIHdoaWNoIGNvdWxkIHJlbW92ZSBzb21lIHBhcnQgb2Ygbm9kZXMgZnJvbSBET01cblx0XHQgKlxuXHRcdCAqIEFuZCB0aGlzIGJyZWFrcyBsb2dpYyBvZiB0aGUgb3RoZXIgbW9kdWxlc1xuXHRcdCAqIChzd2l0Y2gtcGFnZS1vbi1jaGFuZ2UgZm9yIGV4YW1wbGUpXG5cdFx0ICovXG5cdFx0dGhpcy5lbGVtZW50cy5mb3JFYWNoKFxuXHRcdFx0cGFnZSA9PiBwYWdlLm9ic2VydmVDb25kaXRpb25hbEJsb2NrcygpLFxuXHRcdCk7XG5cblx0XHRjb25zdCB7IHN1Ym1pdHRlciB9ID0gdGhpcy5nZXRSb290KCkuZ2V0U3VibWl0KCk7XG5cdFx0Ly8gaXMgYWpheFxuXHRcdGlmICggIXN1Ym1pdHRlci5oYXNPd25Qcm9wZXJ0eSggJ3N0YXR1cycgKSApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRzdWJtaXR0ZXIud2F0Y2hSZXNldCggKCkgPT4ge1xuXHRcdFx0dGhpcy5pbmRleC5jdXJyZW50ID0gMTtcblx0XHR9ICk7XG5cdH07XG5cdHRoaXMub25DaGFuZ2VJbmRleCAgPSBmdW5jdGlvbiAoKSB7XG5cdFx0Zm9yICggY29uc3QgcGFnZSBvZiB0aGlzLmdldFBhZ2VzKCkgKSB7XG5cdFx0XHRwYWdlLmlzU2hvdy5jdXJyZW50ID0gcGFnZS5pbmRleCA9PT0gdGhpcy5pbmRleC5jdXJyZW50O1xuXHRcdH1cblxuXHRcdHdpbmRvdz8ualF1ZXJ5KCBkb2N1bWVudCApPy50cmlnZ2VyKFxuXHRcdFx0J2pldC1mb3JtLWJ1aWxkZXIvc3dpdGNoLXBhZ2UnLFxuXHRcdCk7XG5cdH07XG5cdHRoaXMuZ2V0Q3VycmVudFBhZ2UgPSBmdW5jdGlvbiAoKSB7XG5cdFx0Zm9yICggY29uc3QgcGFnZSBvZiB0aGlzLmdldFBhZ2VzKCkgKSB7XG5cdFx0XHRpZiAoIHBhZ2UuaXNTaG93LmN1cnJlbnQgKSB7XG5cdFx0XHRcdHJldHVybiBwYWdlO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiBmYWxzZTtcblx0fTtcblx0LyoqXG5cdCAqIEByZXR1cm4ge0FycmF5PFBhZ2VTdGF0ZT59XG5cdCAqL1xuXHR0aGlzLmdldFBhZ2VzID0gZnVuY3Rpb24gKCkge1xuXHRcdHJldHVybiB0aGlzLmVsZW1lbnRzO1xuXHR9O1xuXHQvKipcblx0ICogQHJldHVybiB7SFRNTEVsZW1lbnR8SFRNTEZvcm1FbGVtZW50fVxuXHQgKi9cblx0dGhpcy5nZXRTY29wZU5vZGUgPSBmdW5jdGlvbiAoKSB7XG5cdFx0cmV0dXJuIHRoaXMuYmxvY2s/Lm5vZGUgPz8gdGhpcy5yb290LnJvb3ROb2RlO1xuXHR9O1xuXHQvKipcblx0ICogQHJldHVybiB7T2JzZXJ2YWJsZX1cblx0ICovXG5cdHRoaXMuZ2V0Um9vdCA9IGZ1bmN0aW9uICgpIHtcblx0XHRyZXR1cm4gdGhpcy5ibG9jaz8ucm9vdCA/PyB0aGlzLnJvb3Q7XG5cdH07XG5cblx0LyoqXG5cdCAqIEBwYXJhbSBwYWdlIHtQYWdlU3RhdGV9XG5cdCAqL1xuXHR0aGlzLmlzTGFzdFBhZ2UgPSBmdW5jdGlvbiAoIHBhZ2UgKSB7XG5cdFx0cmV0dXJuIHRoaXMuZWxlbWVudHMuYXQoIC0xICkgPT09IHBhZ2U7XG5cdH07XG5cblx0LyoqXG5cdCAqIEBzaW5jZSAzLjAuNVxuXHQgKlxuXHQgKiBAcGFyYW0gIHBhZ2Vcblx0ICogQHJldHVybiB7Ym9vbGVhbn1cblx0ICovXG5cdHRoaXMuaXNGaXJzdFBhZ2UgPSBmdW5jdGlvbiAoIHBhZ2UgKSB7XG5cdFx0cmV0dXJuIHRoaXMuZWxlbWVudHNbIDAgXSA9PT0gcGFnZTtcblx0fTtcblxuXHR0aGlzLm9uUmVhZHkgPSBmdW5jdGlvbiAoKSB7XG5cdFx0ZG9BY3Rpb24oICdqZXQuZmIubXVsdGlzdGVwLmluaXQnLCB0aGlzICk7XG5cdH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IE11bHRpU3RlcFN0YXRlOyIsImltcG9ydCBDb25kaXRpb25QYWdlU3RhdGVJdGVtIGZyb20gJy4vQ29uZGl0aW9uUGFnZVN0YXRlSXRlbSc7XG5cbmNvbnN0IHtcblx0ICAgICAgUmVhY3RpdmVWYXIsXG5cdCAgICAgIGNyZWF0ZUNvbmRpdGlvbmFsQmxvY2ssXG4gICAgICB9ID0gSmV0Rm9ybUJ1aWxkZXJBYnN0cmFjdDtcblxuY29uc3Qge1xuXHQgICAgICB2YWxpZGF0ZUlucHV0cyxcblx0ICAgICAgZ2V0T2Zmc2V0VG9wLFxuXHQgICAgICBmb2N1c09uSW52YWxpZElucHV0LFxuXHQgICAgICBwb3B1bGF0ZUlucHV0cyxcbiAgICAgIH0gPSBKZXRGb3JtQnVpbGRlckZ1bmN0aW9ucztcblxuY29uc3QgeyBhZGRBY3Rpb24sIGRvQWN0aW9uIH0gPSBKZXRQbHVnaW5zLmhvb2tzO1xuXG4vKipcbiAqIEBwcm9wZXJ0eSB7SW5wdXREYXRhW119ICAgIGlucHV0cyBJbm5lciBpbnB1dHNcbiAqIEBwcm9wZXJ0eSB7TXVsdGlTdGVwU3RhdGV9IHN0YXRlICBNdWx0aXN0ZXAgc3RhdGVcbiAqIEBwcm9wZXJ0eSB7RWxlbWVudH0gICAgICAgIG5vZGUgICBSZWxhdGVkIG5vZGUsIGVsZW1lbnRcbiAqIEBwYXJhbSAgICB7RWxlbWVudH0gICAgICAgIG5vZGUgICBSZWxhdGVkIG5vZGUsIGVsZW1lbnRcbiAqIEBwYXJhbSAgICB7TXVsdGlTdGVwU3RhdGV9IHN0YXRlICBNdWx0aXN0ZXAgc3RhdGVcbiAqL1xuZnVuY3Rpb24gUGFnZVN0YXRlKCBub2RlLCBzdGF0ZSApIHtcblx0dGhpcy5ub2RlICAgICAgPSBub2RlO1xuXHR0aGlzLmluZGV4ICAgICA9ICtub2RlLmRhdGFzZXQucGFnZTtcblx0dGhpcy5vZmZzZXQgICAgPSArbm9kZS5kYXRhc2V0LnBhZ2VPZmZzZXQ7XG5cdHRoaXMuc3RhdGUgICAgID0gc3RhdGU7XG5cdHRoaXMuaW5wdXRzICAgID0gW107XG5cdHRoaXMuaW5wdXRCaW5kaW5ncyA9IG5ldyBNYXAoKTtcblx0dGhpcy5jYW5Td2l0Y2ggPSBuZXcgUmVhY3RpdmVWYXIoIG51bGwgKTtcblx0dGhpcy5pc1Nob3cgICAgPSBuZXcgUmVhY3RpdmVWYXIoIDEgPT09IHRoaXMuaW5kZXggKTtcblxuXHQvKipcblx0ICogQHNpbmNlIDMuMC4xXG5cdCAqL1xuXHR0aGlzLmF1dG9Gb2N1cyA9IHdpbmRvdy5KZXRGb3JtQnVpbGRlclNldHRpbmdzPy5hdXRvX2ZvY3VzO1xuXG5cdC8qKlxuXHQgKiBAc2luY2UgMy4wLjVcblx0ICogQHR5cGUge2Jvb2xlYW59XG5cdCAqL1xuXHR0aGlzLmluaXRpYWxPYnNlcnZlU3RhdGUgPSBmYWxzZTtcbn1cblxuUGFnZVN0YXRlLnByb3RvdHlwZS5vYnNlcnZlID0gZnVuY3Rpb24gKCkge1xuXG5cdGlmICggIXRoaXMuaXNMYXN0KCkgKSB7XG5cdFx0dGhpcy5vYnNlcnZlSW5wdXRzKCk7XG5cdH1cblxuXHR0aGlzLmNhblN3aXRjaC5tYWtlKCk7XG5cdHRoaXMuaXNTaG93Lm1ha2UoKTtcblx0dGhpcy5pc1Nob3cud2F0Y2goICgpID0+IHtcblx0XHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkLWV4cHJlc3Npb25zXG5cdFx0dGhpcy5pc1Nob3cuY3VycmVudCA/IHRoaXMub25TaG93KCkgOiB0aGlzLm9uSGlkZSgpO1xuXHR9ICk7XG5cblx0dGhpcy5hZGRCdXR0b25zTGlzdGVuZXJzKCk7XG5cblx0LyoqXG5cdCAqIFdlIGNoZWNrIHRoZSBmaWVsZHMgb25seSBmb3IgdGhlIGZpcnN0IHBhZ2UuXG5cdCAqIEFuZCBmb3IgdGhlIGZvbGxvd2luZywgd2UgZG8gaXQgd2hlbiBzd2l0Y2hpbmcgcGFnZXNcblx0ICogKGluIHRoZSBgb25TaG93YCBtZXRob2QpXG5cdCAqXG5cdCAqIFdlIGRvIHRoaXMgYmVjYXVzZSBvbiBvdGhlciBwYWdlcyB0aGUgZmllbGRzIGFyZSBhbHdheXNcblx0ICogY2hlY2tlZCB3aXRoIGEgc3VjY2Vzc2Z1bCByZXN1bHQgZHVlIHRvIHRoZSBjaGVjayBvbiBgaXNWaXNpYmxlYFxuXHQgKlxuXHQgKiBAc2luY2UgMy4wLjVcblx0ICpcblx0ICogQHNlZSBodHRwczovL2dpdGh1Yi5jb20vQ3JvY29ibG9jay9pc3N1ZXMtdHJhY2tlci9pc3N1ZXMvMjc4MSNpc3N1ZWNvbW1lbnQtMTUxNzkyODIxM1xuXHQgKiBAc2VlIFBhZ2VTdGF0ZS5vblNob3dcblx0ICogQHNlZSBJbnB1dERhdGEuaXNWaXNpYmxlXG5cdCAqL1xuXHRpZiAoIHRoaXMuaXNGaXJzdCgpICkge1xuXHRcdHRoaXMuaW5pdGlhbE9ic2VydmVTdGF0ZSA9IHRydWU7XG5cdFx0dGhpcy51cGRhdGVTdGF0ZUFzeW5jKCkudGhlbiggKCkgPT4ge30gKS5jYXRjaCggKCkgPT4ge30gKTtcblx0fVxuXG5cdHRoaXMudXBkYXRlT2Zmc2V0QnlQcm9ncmVzcygpO1xuXG5cdGFkZEFjdGlvbihcblx0XHQnamV0LmZiLm9ic2VydmUuaW5wdXQubWFudWFsJyxcblx0XHQnamV0LWZvcm0tYnVpbGRlci9wYWdlLXN0YXRlJyxcblx0XHRpbnB1dCA9PiB0aGlzLm9ic2VydmVJbnB1dCggaW5wdXQubm9kZXNbIDAgXSApLFxuXHQpO1xuXG5cdGRvQWN0aW9uKCAnamV0LmZiLm11bHRpc3RlcC5wYWdlLmluaXQnLCB0aGlzICk7XG59O1xuXG5QYWdlU3RhdGUucHJvdG90eXBlLm9ic2VydmVJbnB1dHMgPSBmdW5jdGlvbiAoKSB7XG5cdGZvciAoIGNvbnN0IG5vZGUgb2YgdGhpcy5ub2RlLnF1ZXJ5U2VsZWN0b3JBbGwoICdbZGF0YS1qZmItc3luY10nICkgKSB7XG5cdFx0Y29uc3QgaW5wdXQgPSB0aGlzLm9ic2VydmVJbnB1dCggbm9kZSApO1xuXG5cdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC1leHByZXNzaW9uc1xuXHRcdGlucHV0ICYmIGRvQWN0aW9uKFxuXHRcdFx0J2pldC5mYi5tdWx0aXN0ZXAucGFnZS5vYnNlcnZlZC5pbnB1dCcsXG5cdFx0XHRpbnB1dCxcblx0XHRcdHRoaXMsXG5cdFx0KTtcblx0fVxufTtcblxuLyoqXG4gKiBAcGFyYW0gbm9kZSB7RWxlbWVudH1cbiAqL1xuUGFnZVN0YXRlLnByb3RvdHlwZS5vYnNlcnZlSW5wdXQgPSBmdW5jdGlvbiAoIG5vZGUgKSB7XG5cdGlmIChcblx0XHQhdGhpcy5pc05vZGVCZWxvbmdUaGlzKCBub2RlICkgfHxcblx0XHQhbm9kZS5oYXNPd25Qcm9wZXJ0eSggJ2pmYlN5bmMnICkgfHxcblx0XHRub2RlLmpmYlN5bmMuaGFzUGFyZW50KClcblx0KSB7XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cblx0LyoqXG5cdCAqIEB0eXBlIHtJbnB1dERhdGF9XG5cdCAqL1xuXHRjb25zdCBpbnB1dCA9IG5vZGUuamZiU3luYztcblxuXHRyZXR1cm4gdGhpcy5yZWdpc3RlcklucHV0KCBpbnB1dCApO1xufTtcbi8qKlxuICogQnV0dG9ucyBmb3Igc3dpdGNoaW5nIGJldHdlZW4gcGFnZXMgYXJlIGhpZGRlbiBjb25kaXRpb25hbCBibG9ja3NcbiAqIHRoYXQgcGVyZm9ybSB0aGVpciBmdW5jdGlvbiAoZGlzYWJsZSlcbiAqIGlmIGFsbCByZXF1aXJlZCBmaWVsZHMgYXJlIGZpbGxlZCBpbiB0aGUgcGFnZS5cbiAqL1xuUGFnZVN0YXRlLnByb3RvdHlwZS5vYnNlcnZlQ29uZGl0aW9uYWxCbG9ja3MgPSBmdW5jdGlvbiAoKSB7XG5cdGlmICggdGhpcy5pc0xhc3QoKSApIHtcblx0XHRyZXR1cm47XG5cdH1cblx0Zm9yICggY29uc3Qgbm9kZSBvZiB0aGlzLm5vZGUucXVlcnlTZWxlY3RvckFsbChcblx0XHQnW2RhdGEtamZiLWNvbmRpdGlvbmFsXScsXG5cdCkgKSB7XG5cdFx0aWYgKCAhdGhpcy5pc05vZGVCZWxvbmdUaGlzKCBub2RlICkgKSB7XG5cdFx0XHRjb250aW51ZTtcblx0XHR9XG5cdFx0Y29uc3QgYmxvY2sgPSBjcmVhdGVDb25kaXRpb25hbEJsb2NrKFxuXHRcdFx0bm9kZSxcblx0XHRcdHRoaXMuc3RhdGUuZ2V0Um9vdCgpLFxuXHRcdCk7XG5cblx0XHRmb3IgKCBjb25zdCBjb25kaXRpb24gb2YgYmxvY2subGlzdC5nZXRDb25kaXRpb25zKCkgKSB7XG5cdFx0XHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbWF4LWRlcHRoXG5cdFx0XHRpZiAoIGNvbmRpdGlvbiBpbnN0YW5jZW9mIENvbmRpdGlvblBhZ2VTdGF0ZUl0ZW0gKSB7XG5cdFx0XHRcdGJsb2NrLnBhZ2UgPSB0aGlzO1xuXHRcdFx0XHR0aGlzLmNhblN3aXRjaC53YXRjaCggKCkgPT4gYmxvY2subGlzdC5vbkNoYW5nZVJlbGF0ZWQoKSApO1xuXG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxufTtcblxuLyoqXG4gKiBAc2luY2UgMy4wLjUgV2UgY2hlY2sgdGhlIGZpZWxkcyBpZiB0aGlzIGlzIGRvbmUgZm9yIHRoZSBmaXJzdCB0aW1lXG4gKiBAc2luY2UgMy4wLjAgSW50cm9kdWNlZFxuICovXG5QYWdlU3RhdGUucHJvdG90eXBlLm9uU2hvdyA9IGZ1bmN0aW9uICgpIHtcblx0dGhpcy5ub2RlLmNsYXNzTGlzdC5yZW1vdmUoICdqZXQtZm9ybS1idWlsZGVyLXBhZ2UtLWhpZGRlbicgKTtcblxuXHRpZiAoIHRoaXMuaW5pdGlhbE9ic2VydmVTdGF0ZSApIHtcblx0XHRyZXR1cm47XG5cdH1cblxuXHR0aGlzLmluaXRpYWxPYnNlcnZlU3RhdGUgPSB0cnVlO1xuXHR0aGlzLnVwZGF0ZVN0YXRlQXN5bmMoKS50aGVuKCAoKSA9PiB7fSApLmNhdGNoKCAoKSA9PiB7fSApO1xufTtcblBhZ2VTdGF0ZS5wcm90b3R5cGUub25IaWRlICAgICAgPSBmdW5jdGlvbiAoKSB7XG5cdHRoaXMubm9kZS5jbGFzc0xpc3QuYWRkKCAnamV0LWZvcm0tYnVpbGRlci1wYWdlLS1oaWRkZW4nICk7XG59O1xuUGFnZVN0YXRlLnByb3RvdHlwZS51cGRhdGVTdGF0ZSA9IGZ1bmN0aW9uICgpIHtcblx0Zm9yICggY29uc3QgaW5wdXQgb2YgdGhpcy5nZXRJbnB1dHMoKSApIHtcblx0XHRpZiAoIGlucHV0LnJlcG9ydGluZy52YWxpZGl0eVN0YXRlLmN1cnJlbnQgfHxcblx0XHRcdG51bGwgPT09IGlucHV0LnJlcG9ydGluZy52YWxpZGl0eVN0YXRlLmN1cnJlbnRcblx0XHQpIHtcblx0XHRcdGNvbnRpbnVlO1xuXHRcdH1cblx0XHR0aGlzLmNhblN3aXRjaC5jdXJyZW50ID0gZmFsc2U7XG5cdFx0cmV0dXJuO1xuXHR9XG5cblx0dGhpcy5jYW5Td2l0Y2guY3VycmVudCA9IHRydWU7XG59O1xuXG5QYWdlU3RhdGUucHJvdG90eXBlLnVwZGF0ZVN0YXRlQXN5bmMgICAgPSBhc3luYyBmdW5jdGlvbiAoIHNpbGVuY2UgPSB0cnVlICkge1xuXHR0cnkge1xuXHRcdGF3YWl0IHZhbGlkYXRlSW5wdXRzKCB0aGlzLmdldElucHV0cygpLCBzaWxlbmNlICk7XG5cblx0XHR0aGlzLmNhblN3aXRjaC5jdXJyZW50ID0gdHJ1ZTtcblx0fVxuXHRjYXRjaCAoIGVycm9yICkge1xuXHRcdHRoaXMuY2FuU3dpdGNoLmN1cnJlbnQgPSBmYWxzZTtcblx0fVxufTtcblBhZ2VTdGF0ZS5wcm90b3R5cGUuYWRkQnV0dG9uc0xpc3RlbmVycyA9IGZ1bmN0aW9uICgpIHtcblx0Y29uc3Qgc3dpdGNoQnV0dG9ucyA9IHRoaXMubm9kZS5xdWVyeVNlbGVjdG9yQWxsKFxuXHRcdCcuamV0LWZvcm0tYnVpbGRlcl9fbmV4dC1wYWdlLCAuamV0LWZvcm0tYnVpbGRlcl9fcHJldi1wYWdlJyxcblx0KTtcblxuXHRmb3IgKCBjb25zdCBzd2l0Y2hCdXR0b24gb2Ygc3dpdGNoQnV0dG9ucyApIHtcblx0XHRpZiAoICF0aGlzLmlzTm9kZUJlbG9uZ1RoaXMoIHN3aXRjaEJ1dHRvbiApICkge1xuXHRcdFx0Y29udGludWU7XG5cdFx0fVxuXHRcdGNvbnN0IGlzUHJldiA9IHN3aXRjaEJ1dHRvbi5jbGFzc0xpc3QuY29udGFpbnMoXG5cdFx0XHQnamV0LWZvcm0tYnVpbGRlcl9fcHJldi1wYWdlJyxcblx0XHQpO1xuXG5cdFx0c3dpdGNoQnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoXG5cdFx0XHQnY2xpY2snLFxuXHRcdFx0KCkgPT4gdGhpcy5jaGFuZ2VQYWdlKCBpc1ByZXYgKSxcblx0XHQpO1xuXHR9XG59O1xuUGFnZVN0YXRlLnByb3RvdHlwZS5jaGFuZ2VQYWdlICAgICAgICAgID0gYXN5bmMgZnVuY3Rpb24gKCBpc0JhY2sgKSB7XG5cdGlmICggaXNCYWNrICkge1xuXHRcdHRoaXMuc3RhdGUuaW5kZXguY3VycmVudCA9IHRoaXMuaW5kZXggLSAxO1xuXG5cdFx0cmV0dXJuO1xuXHR9XG5cblx0aWYgKCB0aGlzLmlzTGFzdCgpICkge1xuXHRcdHJldHVybjtcblx0fVxuXG5cdGlmICggdGhpcy5nZXRMb2NrU3RhdGUoKS5jdXJyZW50ICkge1xuXHRcdHJldHVybjtcblx0fVxuXG5cdGF3YWl0IHRoaXMudXBkYXRlU3RhdGVBc3luYyggZmFsc2UgKTtcblxuXHRpZiAoIHRoaXMuY2FuU3dpdGNoLmN1cnJlbnQgKSB7XG5cdFx0dGhpcy5zdGF0ZS5pbmRleC5jdXJyZW50ID0gdGhpcy5pbmRleCArIDE7XG5cblx0XHRyZXR1cm47XG5cdH1cblxuXHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkLWV4cHJlc3Npb25zXG5cdHRoaXMuYXV0b0ZvY3VzICYmIGZvY3VzT25JbnZhbGlkSW5wdXQoIHRoaXMuZ2V0SW5wdXRzKCkgKTtcbn07XG5QYWdlU3RhdGUucHJvdG90eXBlLmlzTm9kZUJlbG9uZ1RoaXMgICAgPSBmdW5jdGlvbiAoIG5vZGUgKSB7XG5cdGNvbnN0IHBhcmVudFBhZ2UgPSBub2RlLmNsb3Nlc3QoICcuamV0LWZvcm0tYnVpbGRlci1wYWdlJyApO1xuXG5cdHJldHVybiBwYXJlbnRQYWdlID8gcGFyZW50UGFnZS5pc0VxdWFsTm9kZSggdGhpcy5ub2RlICkgOiBmYWxzZTtcbn07XG4vKipcbiAqIEByZXR1cm4ge0FycmF5PElucHV0RGF0YT4gfCAqfVxuICovXG5QYWdlU3RhdGUucHJvdG90eXBlLmdldElucHV0cyA9IGZ1bmN0aW9uICgpIHtcblx0cmV0dXJuIHBvcHVsYXRlSW5wdXRzKCB0aGlzLmlucHV0cyApO1xufTtcblxuLyoqXG4gKiBAcmV0dXJuIHtMb2FkaW5nUmVhY3RpdmVWYXJ9XG4gKi9cblBhZ2VTdGF0ZS5wcm90b3R5cGUuZ2V0TG9ja1N0YXRlID0gZnVuY3Rpb24gKCkge1xuXHQvKipcblx0ICogQHR5cGUge09ic2VydmFibGV9XG5cdCAqL1xuXHRjb25zdCByb290ID0gdGhpcy5zdGF0ZS5nZXRSb290KCk7XG5cdGNvbnN0IGZvcm0gPSByb290Py5wYXJlbnQ/LnJvb3Q/LmZvcm0gPz8gcm9vdC5mb3JtO1xuXG5cdHJldHVybiBmb3JtLmxvY2tTdGF0ZTtcbn07XG5cblBhZ2VTdGF0ZS5wcm90b3R5cGUuaXNMYXN0ID0gZnVuY3Rpb24gKCkge1xuXHRyZXR1cm4gdGhpcy5zdGF0ZS5pc0xhc3RQYWdlKCB0aGlzICk7XG59O1xuXG4vKipcbiAqIEBzaW5jZSAzLjAuNVxuICpcbiAqIEByZXR1cm4ge2Jvb2xlYW59XG4gKi9cblBhZ2VTdGF0ZS5wcm90b3R5cGUuaXNGaXJzdCA9IGZ1bmN0aW9uICgpIHtcblx0cmV0dXJuIHRoaXMuc3RhdGUuaXNGaXJzdFBhZ2UoIHRoaXMgKTtcbn07XG5cbi8qKlxuICogQHBhcmFtIGlucHV0IHtJbnB1dERhdGF8UmVwZWF0ZXJEYXRhfVxuICovXG5QYWdlU3RhdGUucHJvdG90eXBlLmhhbmRsZUlucHV0RW50ZXIgPSBmdW5jdGlvbiAoIGlucHV0ICkge1xuXHRpbnB1dD8uZW50ZXJLZXk/LmFkZEZpbHRlciggKCkgPT4ge1xuXHRcdGNvbnN0IGZvcm0gPSBpbnB1dC5yb290LmZvcm07XG5cblx0XHRpZiAoIGZvcm0gKSB7XG5cdFx0XHRpZiAoIHRydWUgPT09IGZvcm0uY2FuVHJpZ2dlckVudGVyU3VibWl0ICkge1xuXHRcdFx0XHR0aGlzLmNoYW5nZVBhZ2UoKS50aGVuKCAoKSA9PiB7fSApLmNhdGNoKCAoKSA9PiB7fSApO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHR0aGlzLmNoYW5nZVBhZ2UoKS50aGVuKCAoKSA9PiB7fSApLmNhdGNoKCAoKSA9PiB7fSApO1xuXHRcdH1cblxuXHRcdC8vIHByZXZlbnQgc3VibWl0XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9ICk7XG59O1xuXG5QYWdlU3RhdGUucHJvdG90eXBlLnJlZ2lzdGVySW5wdXQgPSBmdW5jdGlvbiAoXG5cdGlucHV0LFxuXHR7IGluY2x1ZGVJblZhbGlkYXRpb24gPSB0cnVlIH0gPSB7fSxcbikge1xuXHRpZiAoICFpbnB1dCB8fCB0aGlzLmlucHV0QmluZGluZ3MuaGFzKCBpbnB1dCApICkge1xuXHRcdHJldHVybiBpbnB1dDtcblx0fVxuXG5cdHRoaXMuaGFuZGxlSW5wdXRFbnRlciggaW5wdXQgKTtcblxuXHRjb25zdCBjbGVhckxvYWRpbmdXYXRjaCA9IGlucHV0LmxvYWRpbmcud2F0Y2goICgpID0+IHtcblx0XHRpZiAoIGlucHV0LmxvYWRpbmcuY3VycmVudCApIHtcblx0XHRcdHRoaXMuY2FuU3dpdGNoLmN1cnJlbnQgPSBmYWxzZTtcblx0XHR9XG5cdFx0ZWxzZSB7XG5cdFx0XHR0aGlzLnVwZGF0ZVN0YXRlKCk7XG5cdFx0fVxuXHR9ICk7XG5cblx0Y29uc3QgYmluZGluZyA9IHtcblx0XHRjbGVhckxvYWRpbmdXYXRjaCxcblx0XHRjbGVhclZhbGlkaXR5V2F0Y2g6IG51bGwsXG5cdH07XG5cblx0aWYgKCBpbnB1dC5yZXBvcnRpbmcucmVzdHJpY3Rpb25zLmxlbmd0aCApIHtcblx0XHR0aGlzLmlucHV0cy5wdXNoKCBpbnB1dCApO1xuXHRcdGJpbmRpbmcuY2xlYXJWYWxpZGl0eVdhdGNoID0gaW5wdXQud2F0Y2hWYWxpZGl0eShcblx0XHRcdCgpID0+IHRoaXMudXBkYXRlU3RhdGUoKSxcblx0XHQpO1xuXG5cdFx0aWYgKCAhaW5jbHVkZUluVmFsaWRhdGlvbiApIHtcblx0XHRcdHRoaXMuaW5wdXRzID0gdGhpcy5pbnB1dHMuZmlsdGVyKCBjdXJyZW50ID0+IGN1cnJlbnQgIT09IGlucHV0ICk7XG5cdFx0fVxuXHR9XG5cblx0dGhpcy5pbnB1dEJpbmRpbmdzLnNldCggaW5wdXQsIGJpbmRpbmcgKTtcblxuXHRyZXR1cm4gaW5wdXQ7XG59O1xuXG5QYWdlU3RhdGUucHJvdG90eXBlLnVucmVnaXN0ZXJJbnB1dCA9IGZ1bmN0aW9uICggaW5wdXQgKSB7XG5cdGlmICggIXRoaXMuaW5wdXRCaW5kaW5ncy5oYXMoIGlucHV0ICkgKSB7XG5cdFx0cmV0dXJuO1xuXHR9XG5cblx0Y29uc3QgYmluZGluZyA9IHRoaXMuaW5wdXRCaW5kaW5ncy5nZXQoIGlucHV0ICk7XG5cblx0YmluZGluZz8uY2xlYXJMb2FkaW5nV2F0Y2g/LigpO1xuXHRiaW5kaW5nPy5jbGVhclZhbGlkaXR5V2F0Y2g/LigpO1xuXG5cdHRoaXMuaW5wdXRCaW5kaW5ncy5kZWxldGUoIGlucHV0ICk7XG5cdHRoaXMuaW5wdXRzID0gdGhpcy5pbnB1dHMuZmlsdGVyKCBjdXJyZW50ID0+IGN1cnJlbnQgIT09IGlucHV0ICk7XG59O1xuXG5QYWdlU3RhdGUucHJvdG90eXBlLmdldFRyYWNrZWRJbnB1dHMgPSBmdW5jdGlvbiAoKSB7XG5cdHJldHVybiBBcnJheS5mcm9tKCB0aGlzLmlucHV0QmluZGluZ3Mua2V5cygpICk7XG59O1xuXG5QYWdlU3RhdGUucHJvdG90eXBlLmdldE9mZnNldFRvcCA9IGZ1bmN0aW9uICgpIHtcblx0cmV0dXJuIGdldE9mZnNldFRvcCggdGhpcy5ub2RlICkgLSB0aGlzLm9mZnNldDtcbn07XG5cbi8qKlxuICogQHNpbmNlIDMuMi4zXG4gKi9cblBhZ2VTdGF0ZS5wcm90b3R5cGUudXBkYXRlT2Zmc2V0QnlQcm9ncmVzcyA9IGZ1bmN0aW9uICgpIHtcblx0aWYgKCAhdGhpcy5zdGF0ZT8ucHJvZ3Jlc3M/Lm5vZGUgKSB7XG5cdFx0cmV0dXJuO1xuXHR9XG5cdHRoaXMub2Zmc2V0ICs9ICt0aGlzLnN0YXRlLnByb2dyZXNzLm5vZGUuY2xpZW50SGVpZ2h0O1xufTtcblxuZXhwb3J0IGRlZmF1bHQgUGFnZVN0YXRlO1xuIiwiZnVuY3Rpb24gUHJvZ3Jlc3NCYXIoIG5vZGUsIHN0YXRlICkge1xuXHQvKipcblx0ICogQHBhcmFtIG5vZGUgIHtIVE1MRWxlbWVudH1cblx0ICogQHBhcmFtIHN0YXRlIHtNdWx0aVN0ZXBTdGF0ZX1cblx0ICovXG5cdHRoaXMubm9kZSA9IG5vZGU7XG5cdHRoaXMuc3RhdGUgPSBzdGF0ZTtcblxuXHR0aGlzLnN0YXRlLmluZGV4LndhdGNoKCAoKSA9PiB0aGlzLnVwZGF0ZUl0ZW1zKCkgKTtcblxuXHR0aGlzLnVwZGF0ZUl0ZW1zID0gZnVuY3Rpb24gKCkge1xuXHRcdGNvbnN0IHsgY3VycmVudCB9ID0gdGhpcy5zdGF0ZS5pbmRleDtcblxuXHRcdGZvciAoIGNvbnN0IGl0ZW0gb2YgdGhpcy5ub2RlLmNoaWxkcmVuICkge1xuXHRcdFx0Y29uc3QgcGFnZUluZGV4ID0gK2l0ZW0uZGF0YXNldC5wYWdlO1xuXG5cdFx0XHRpZiAoIHBhZ2VJbmRleCA8IGN1cnJlbnQgKSB7XG5cdFx0XHRcdHRoaXMubWFrZVBhc3NlZCggaXRlbSApO1xuXHRcdFx0fVxuXHRcdFx0ZWxzZSBpZiAoIGN1cnJlbnQgPT09IHBhZ2VJbmRleCApIHtcblx0XHRcdFx0dGhpcy5tYWtlQWN0aXZlKCBpdGVtICk7XG5cdFx0XHR9XG5cdFx0XHRlbHNlIHtcblx0XHRcdFx0dGhpcy5tYWtlTm90UGFzc2VkKCBpdGVtICk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9O1xuXG5cdC8qKlxuXHQgKiBAcGFyYW0gZWxlbWVudCB7SFRNTEVsZW1lbnR9XG5cdCAqL1xuXHR0aGlzLm1ha2VBY3RpdmUgPSBmdW5jdGlvbiAoIGVsZW1lbnQgKSB7XG5cdFx0ZWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKCAncGFzc2VkLXBhZ2UnICk7XG5cdFx0ZWxlbWVudC5jbGFzc0xpc3QuYWRkKCAnYWN0aXZlLXBhZ2UnICk7XG5cdH07XG5cblx0LyoqXG5cdCAqIEBwYXJhbSBlbGVtZW50IHtIVE1MRWxlbWVudH1cblx0ICovXG5cdHRoaXMubWFrZVBhc3NlZCA9IGZ1bmN0aW9uICggZWxlbWVudCApIHtcblx0XHRlbGVtZW50LmNsYXNzTGlzdC5hZGQoICdwYXNzZWQtcGFnZScgKTtcblx0XHRlbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoICdhY3RpdmUtcGFnZScgKTtcblx0fTtcblxuXHR0aGlzLm1ha2VOb3RQYXNzZWQgPSBmdW5jdGlvbiAoIGVsZW1lbnQgKSB7XG5cdFx0ZWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKCAnYWN0aXZlLXBhZ2UnLCAncGFzc2VkLXBhZ2UnICk7XG5cdH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IFByb2dyZXNzQmFyOyIsImltcG9ydCBNdWx0aVN0ZXBTdGF0ZSBmcm9tICcuL011bHRpU3RlcFN0YXRlJztcblxuZnVuY3Rpb24gY3JlYXRlTXVsdGlTdGVwKCByb290T3JCbG9jayApIHtcblx0Y29uc3QgbXVsdGlzdGVwID0gbmV3IE11bHRpU3RlcFN0YXRlKCk7XG5cdG11bHRpc3RlcC5zZXRTY29wZSggcm9vdE9yQmxvY2sgKTtcblxuXHRjb25zdCBwYWdlcyA9IFtdO1xuXG5cdGZvciAoIGNvbnN0IGNoaWxkIG9mIG11bHRpc3RlcC5nZXRTY29wZU5vZGUoKS5jaGlsZE5vZGVzICkge1xuXHRcdGlmICggIWNoaWxkPy5jbGFzc0xpc3Q/LmNvbnRhaW5zKCAnamV0LWZvcm0tYnVpbGRlci1wYWdlJyApICkge1xuXHRcdFx0Y29udGludWU7XG5cdFx0fVxuXHRcdHBhZ2VzLnB1c2goIGNoaWxkICk7XG5cdH1cblxuXHRpZiAoICFwYWdlcy5sZW5ndGggKSB7XG5cdFx0cmV0dXJuIG11bHRpc3RlcDtcblx0fVxuXG5cdG11bHRpc3RlcC5zZXRQcm9ncmVzcygpO1xuXHRtdWx0aXN0ZXAuc2V0UGFnZXMoIHBhZ2VzICk7XG5cblx0cmV0dXJuIG11bHRpc3RlcDtcbn1cblxuZXhwb3J0IHsgY3JlYXRlTXVsdGlTdGVwIH07IiwiLy8gVGhlIG1vZHVsZSBjYWNoZVxudmFyIF9fd2VicGFja19tb2R1bGVfY2FjaGVfXyA9IHt9O1xuXG4vLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuXHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcblx0dmFyIGNhY2hlZE1vZHVsZSA9IF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF07XG5cdGlmIChjYWNoZWRNb2R1bGUgIT09IHVuZGVmaW5lZCkge1xuXHRcdHJldHVybiBjYWNoZWRNb2R1bGUuZXhwb3J0cztcblx0fVxuXHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuXHR2YXIgbW9kdWxlID0gX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXSA9IHtcblx0XHQvLyBubyBtb2R1bGUuaWQgbmVlZGVkXG5cdFx0Ly8gbm8gbW9kdWxlLmxvYWRlZCBuZWVkZWRcblx0XHRleHBvcnRzOiB7fVxuXHR9O1xuXG5cdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuXHRpZiAoIShtb2R1bGVJZCBpbiBfX3dlYnBhY2tfbW9kdWxlc19fKSkge1xuXHRcdGRlbGV0ZSBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdO1xuXHRcdHZhciBlID0gbmV3IEVycm9yKFwiQ2Fubm90IGZpbmQgbW9kdWxlICdcIiArIG1vZHVsZUlkICsgXCInXCIpO1xuXHRcdGUuY29kZSA9ICdNT0RVTEVfTk9UX0ZPVU5EJztcblx0XHR0aHJvdyBlO1xuXHR9XG5cdF9fd2VicGFja19tb2R1bGVzX19bbW9kdWxlSWRdKG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuXG5cdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG5cdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbn1cblxuIiwiLy8gZGVmaW5lIGdldHRlciBmdW5jdGlvbnMgZm9yIGhhcm1vbnkgZXhwb3J0c1xuX193ZWJwYWNrX3JlcXVpcmVfXy5kID0gKGV4cG9ydHMsIGRlZmluaXRpb24pID0+IHtcblx0Zm9yKHZhciBrZXkgaW4gZGVmaW5pdGlvbikge1xuXHRcdGlmKF9fd2VicGFja19yZXF1aXJlX18ubyhkZWZpbml0aW9uLCBrZXkpICYmICFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZXhwb3J0cywga2V5KSkge1xuXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIGtleSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGRlZmluaXRpb25ba2V5XSB9KTtcblx0XHR9XG5cdH1cbn07IiwiX193ZWJwYWNrX3JlcXVpcmVfXy5vID0gKG9iaiwgcHJvcCkgPT4gKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIHByb3ApKSIsIi8vIGRlZmluZSBfX2VzTW9kdWxlIG9uIGV4cG9ydHNcbl9fd2VicGFja19yZXF1aXJlX18uciA9IChleHBvcnRzKSA9PiB7XG5cdGlmKHR5cGVvZiBTeW1ib2wgIT09ICd1bmRlZmluZWQnICYmIFN5bWJvbC50b1N0cmluZ1RhZykge1xuXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBTeW1ib2wudG9TdHJpbmdUYWcsIHsgdmFsdWU6ICdNb2R1bGUnIH0pO1xuXHR9XG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7XG59OyIsImltcG9ydCB7IGNyZWF0ZU11bHRpU3RlcCB9IGZyb20gJy4vZnVuY3Rpb25zJztcbmltcG9ydCBDb25kaXRpb25QYWdlU3RhdGVJdGVtIGZyb20gJy4vQ29uZGl0aW9uUGFnZVN0YXRlSXRlbSc7XG5cbmNvbnN0IHtcblx0ICAgICAgYWRkQWN0aW9uLFxuXHQgICAgICBhZGRGaWx0ZXIsXG4gICAgICB9ID0gSmV0UGx1Z2lucy5ob29rcztcblxuY29uc3Qge1xuXHQgICAgICBnZXRTY3JvbGxQYXJlbnQsXG4gICAgICB9ID0gSmV0Rm9ybUJ1aWxkZXJGdW5jdGlvbnM7XG5cbmFkZEFjdGlvbihcblx0J2pldC5mYi5vYnNlcnZlLmFmdGVyJyxcblx0J2pldC1mb3JtLWJ1aWxkZXIvbXVsdGktc3RlcCcsXG5cdGZ1bmN0aW9uICggb2JzZXJ2YWJsZSApIHtcblx0XHRjb25zdCBtdWx0aXN0ZXAgPSBjcmVhdGVNdWx0aVN0ZXAoIG9ic2VydmFibGUgKTtcblxuXHRcdGlmICggIW11bHRpc3RlcC5nZXRQYWdlcygpPy5sZW5ndGggKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0b2JzZXJ2YWJsZS5tdWx0aXN0ZXAgPSBtdWx0aXN0ZXA7XG5cdFx0bXVsdGlzdGVwLm9uUmVhZHkoKTtcblx0fSxcblx0MTUsXG4pO1xuXG5hZGRBY3Rpb24oXG5cdCdqZXQuZmIuY29uZGl0aW9uYWwuaW5pdCcsXG5cdCdqZXQtZm9ybS1idWlsZGVyL211bHRpLXN0ZXAnLFxuXHRmdW5jdGlvbiAoIGJsb2NrICkge1xuXHRcdGNvbnN0IG11bHRpc3RlcCA9IGNyZWF0ZU11bHRpU3RlcCggYmxvY2sgKTtcblxuXHRcdGlmICggIW11bHRpc3RlcC5nZXRQYWdlcygpPy5sZW5ndGggKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0YmxvY2subXVsdGlzdGVwID0gbXVsdGlzdGVwO1xuXHRcdG11bHRpc3RlcC5vblJlYWR5KCk7XG5cdH0sXG4pO1xuXG5hZGRGaWx0ZXIoXG5cdCdqZXQuZmIuY29uZGl0aW9uYWwudHlwZXMnLFxuXHQnamV0LWZvcm0tYnVpbGRlci9tdWx0aS1zdGVwJyxcblx0ZnVuY3Rpb24gKCBpdGVtcyApIHtcblx0XHRpdGVtcyA9IFsgQ29uZGl0aW9uUGFnZVN0YXRlSXRlbSwgLi4uaXRlbXMgXTtcblxuXHRcdHJldHVybiBpdGVtcztcblx0fSxcbik7XG5cbmFkZEFjdGlvbihcblx0J2pldC5mYi5tdWx0aXN0ZXAuaW5pdCcsXG5cdCdqZXQtZm9ybS1idWlsZGVyL211bHRpLXN0ZXAvYXV0b3Njcm9sbCcsXG5cdC8qKlxuXHQgKiBAcGFyYW0gbXVsdGlzdGVwIHtNdWx0aVN0ZXBTdGF0ZX1cblx0ICovXG5cdGZ1bmN0aW9uICggbXVsdGlzdGVwICkge1xuXHRcdGlmICggIXdpbmRvdz8uSmV0Rm9ybUJ1aWxkZXJTZXR0aW5ncz8uc2Nyb2xsX29uX25leHQgKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdG11bHRpc3RlcC5pbmRleC53YXRjaCggKCkgPT4ge1xuXHRcdFx0LyoqXG5cdFx0XHQgKiBAdHlwZSB7UGFnZVN0YXRlfGJvb2xlYW59XG5cdFx0XHQgKi9cblx0XHRcdGNvbnN0IHBhZ2UgPSBtdWx0aXN0ZXAuZ2V0Q3VycmVudFBhZ2UoKTtcblxuXHRcdFx0Y29uc3QgcGFyZW50ID0gZ2V0U2Nyb2xsUGFyZW50KCBwYWdlLm5vZGUgKTtcblx0XHRcdGNvbnN0IHRvcCAgICA9IHBhZ2UuZ2V0T2Zmc2V0VG9wKCk7XG5cblx0XHRcdHBhcmVudD8uc2Nyb2xsVG8/LiggeyB0b3AsIGJlaGF2aW9yOiAnc21vb3RoJyB9ICk7XG5cdFx0fSApO1xuXHR9LFxuKTsiXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=