PageSourceSearch

https://spotlight.vegas/wp-content/plugins/rwb-events/assets/js/rwb-events.js?ver=260714-135154

js spotlight.vegas collected 2026-09-24 13:08:18 UTC 990,264 bytes, 8,443 lines download raw bytes

1/******/ (function(modules) { // webpackBootstrap
2/******/ 	// The module cache
3/******/ 	var installedModules = {};
4/******/
5/******/ 	// The require function
6/******/ 	function __webpack_require__(moduleId) {
7/******/
8/******/ 		// Check if module is in cache
9/******/ 		if(installedModules[moduleId]) {
10/******/ 			return installedModules[moduleId].exports;
11/******/ 		}
12/******/ 		// Create a new module (and put it into the cache)
13/******/ 		var module = installedModules[moduleId] = {
14/******/ 			i: moduleId,
15/******/ 			l: false,
16/******/ 			exports: {}
17/******/ 		};
18/******/
19/******/ 		// Execute the module function
20/******/ 		modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
21/******/
22/******/ 		// Flag the module as loaded
23/******/ 		module.l = true;
24/******/
25/******/ 		// Return the exports of the module
26/******/ 		return module.exports;
27/******/ 	}
28/******/
29/******/
30/******/ 	// expose the modules object (__webpack_modules__)
31/******/ 	__webpack_require__.m = modules;
32/******/
33/******/ 	// expose the module cache
34/******/ 	__webpack_require__.c = installedModules;
35/******/
36/******/ 	// define getter function for harmony exports
37/******/ 	__webpack_require__.d = function(exports, name, getter) {
38/******/ 		if(!__webpack_require__.o(exports, name)) {
39/******/ 			Object.defineProperty(exports, name, {
40/******/ 				configurable: false,
41/******/ 				enumerable: true,
42/******/ 				get: getter
43/******/ 			});
44/******/ 		}
45/******/ 	};
46/******/
47/******/ 	// getDefaultExport function for compatibility with non-harmony modules
48/******/ 	__webpack_require__.n = function(module) {
49/******/ 		var getter = module && module.__esModule ?
50/******/ 			function getDefault() { return module['default']; } :
51/******/ 			function getModuleExports() { return module; };
52/******/ 		__webpack_require__.d(getter, 'a', getter);
53/******/ 		return getter;
54/******/ 	};
55/******/
56/******/ 	// Object.prototype.hasOwnProperty.call
57/******/ 	__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
58/******/
59/******/ 	// __webpack_public_path__
60/******/ 	__webpack_require__.p = "/assets/js";
61/******/
62/******/ 	// Load entry module and return exports
63/******/ 	return __webpack_require__(__webpack_require__.s = 0);
64/******/ })
65/************************************************************************/
66/******/ ([
67/* 0 */
68/***/ (function(module, exports, __webpack_require__) {
69
70module.exports = __webpack_require__(1);
71
72
73/***/ }),
74/* 1 */
75/***/ (function(module, __webpack_exports__, __webpack_require__) {
76
77"use strict";
78Object.defineProperty(__webpack_exports__, "__esModule", { value: true });
79/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__frontend_framework_RwbEventsFormController__ = __webpack_require__(2);
80
81
82(function ($, undefined) {
83  const rwbEventsFormController = new __WEBPACK_IMPORTED_MODULE_0__frontend_framework_RwbEventsFormController__["a" /* default */]();
84  rwbEventsFormController.init();
85})(window.jQuery);
86
87/***/ }),
88/* 2 */
89/***/ (function(module, __webpack_exports__, __webpack_require__) {
90
91"use strict";
92/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__RwbEventsFormView__ = __webpack_require__(3);
93/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_sweetalert2_dist_sweetalert2_js__ = __webpack_require__(6);
94/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_sweetalert2_dist_sweetalert2_js___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_sweetalert2_dist_sweetalert2_js__);
95
96
97/**
98 * Controller takes care to attach and execute any actions triggered on the element and its children
99 */
100
101class RwbEventsFormController extends __WEBPACK_IMPORTED_MODULE_0__RwbEventsFormView__["a" /* default */] {
102  constructor() {
103    super();
104  }
105
106  scrollWindow() {
107    if (this.isMobile()) {
108      //seamless.elementScrollBy(window, {left: 0, top: -50});
109      seamless.windowScrollBy(0, -50);
110    } else {
111      seamless.windowScrollBy(0, -130); //window.scrollBy(0, -130);
112    }
113  }
114
115  scrollWindow2() {
116    if (this.isMobile()) {
117      //seamless.elementScrollBy(window, {left: 0, top: -50});
118      seamless.windowScrollBy(0, -70);
119    } else {
120      seamless.windowScrollBy(0, -150); //window.scrollBy(0, -130);
121    }
122  }
123
124  fixFullScreen() {
125    // Select the node that will be observed for mutations
126    //const targetNode = document.getElementById('some-id');
127    if (jQuery('.carousel').length > 0) {
128      const targetNode = document.querySelector('.carousel'); // Options for the observer (which mutations to observe)
129      //const config = { attributes: true, childList: true, subtree: true };
130
131      const config = {
132        attributes: true,
133        attributeFilter: ['class']
134      }; // Callback function to execute when mutations are observed
135
136      const callback = function (mutationsList, observer) {
137        // Use traditional 'for loops' for IE 11
138        for (const mutation of mutationsList) {
139          //if (mutation.type === 'attributes') {
140          //console.log('The ' + mutation.attributeName + ' attribute was modified.');
141          if (mutation.attributeName === 'class' && mutation.target.classList.contains('is-fullscreen')) {
142            jQuery('#header.sticky-header .header-main.sticky').css('z-index', '1');
143            jQuery('.mapcolumn').css('z-index', '-1');
144            jQuery('.bprodsearchh').css('z-index', '-1');
145          } else {
146            jQuery('#header.sticky-header .header-main.sticky').css('z-index', '1001');
147            jQuery('.bprodsearchh').css('z-index', '4');
148            jQuery('.mapcolumn').css('z-index', '10000000');
149          } // }
150
151        }
152      }; // Create an observer instance linked to the callback function
153
154
155      const observer = new MutationObserver(callback); // Start observing the target node for configured mutations
156
157      observer.observe(targetNode, config);
158    }
159  }
160
161  dateRange(startDate, steps = 1) {
162    const dateArray = [];
163    let self = this;
164    let currentDate = new Date(startDate);
165    let maxSteps = 7;
166
167    if (self.isMobile()) {
168      maxSteps = 5;
169    }
170
171    let p = 1; //while (currentDate <= new Date(endDate)) {
172
173    while (true) {
174      dateArray.push(new Date(currentDate)); // Use UTC date to prevent problems with time zones and DST
175
176      currentDate.setUTCDate(currentDate.getUTCDate() + steps);
177
178      if (p >= maxSteps) {
179        break;
180      }
181
182      p++;
183    }
184
185    return dateArray;
186  }
187
188  dateRangePrev(startDate, steps = 1) {
189    const dateArray = [];
190    let self = this;
191    let currentDate = new Date(startDate);
192    let maxSteps = 7;
193
194    if (self.isMobile()) {
195      maxSteps = 5;
196    }
197
198    let p = 1; //while (currentDate <= new Date(endDate)) {
199
200    while (true) {
201      dateArray.push(new Date(currentDate)); // Use UTC date to prevent problems with time zones and DST
202
203      currentDate.setUTCDate(currentDate.getUTCDate() - steps);
204
205      if (p >= maxSteps) {
206        break;
207      }
208
209      p++;
210    }
211
212    return dateArray.reverse();
213  }
214
215  init() {
216    const self = this;
217
218    if (jQuery('.hotelmapcolumn')) {
219      this.fixFullScreen();
220    }
221
222    jQuery('.battraction_link').on('click', function () {
223      seamless.elementScrollIntoView(document.querySelector('.bpsmc_wrapper'), {
224        behavior: 'smooth',
225        inline: 'center',
226        block: 'center'
227      });
228      self.scrollWindow();
229    });
230
231    if (this.JBuyTickets().length > 0) {
232      this.hideQtyAddToCart();
233      this.buyTicketsAction();
234    } else if (this.JFlatCalendar().length > 0) {
235      if (this.JIsAttraction()) {
236        if (jQuery('.navailable').length > 0) {
237          jQuery('.bpsm_wrapper').closest('.wp-block-qubely-row').remove();
238          return;
239        }
240      } else {
241        jQuery(window).on('resize scroll', function () {
242          if (jQuery('#tickets_selected').length > 0) {
243            if (self.isInViewport(jQuery('#tickets_selected'))) {
244              // do something
245              jQuery('.bproceed_tickets').hide();
246            } else {
247              //if (self.isMobile()) {
248              jQuery('.bproceed_tickets').show(); //}
249            }
250          }
251        });
252      }
253
254      this.JTicketsCart().hide();
255      this.JPriceMap().hide();
256      this.JPriceMapSeats().hide();
257      this.JPriceMapExplanation().hide();
258      this.JEventsPerDate().hide();
259      this.JEventSelection().hide();
260      this.JEventsPerDateBeforeText().hide();
261      this.JTicketsButtonsCart().hide();
262      this.JTicketsSelectedCart().hide();
263      jQuery('body').append(jQuery('<a href="#0" class="bproceed_tickets">Proceed With Tickets<i class="slv slv-arrow-right"></i></a>'));
264      jQuery('.bproceed_tickets').hide();
265      jQuery('.bproceed_tickets').on('click', function () {
266        jQuery('html,body').animate({
267          scrollTop: 0
268        }, 'slow');
269      });
270      jQuery('.return_to_calendar').on('click', function () {
271        seamless.elementScrollIntoView(document.querySelector('.bpsmc_wrapper'), {
272          behavior: 'smooth',
273          inline: 'center',
274          block: 'center'
275        });
276        self.scrollWindow();
277      });
278
279      if (this.JTheme() === 'light') {
280        this.JBlankSeatsMap().html('<img style="padding:80px;" src="/wp-content/themes/porto/images/no_selection_date_time_light.png"/><h4>Pick a date to see the available tickets</h4>');
281      } else {
282        this.JBlankSeatsMap().html('<h4>Select a date from the Calendar</h4><img style="padding:80px;" src="/wp-content/themes/porto/images/no_selection_date_time.png"/>');
283      }
284
285      this.pods = [];
286      this.fromDelete = false;
287      this.initSeatsMap();
288    }
289
290    this.showPageActions();
291    this.hotelRoomActions();
292
293    if (jQuery("#periods").length > 0) {
294      self.fpsearchS = jQuery("#periods").flatpickr({
295        minDate: "today",
296        disableMobile: true,
297        dateFormat: "D, M d",
298        showMonths: 2
299      });
300
301      if (self.isMobile()) {
302        self.fpsearchS.set('showMonths', 1);
303      }
304
305      if (self.getParameterByName('searchcalb') !== null) {
306        if (self.JSearchButtonCalendar().length > 0) {
307          let start_date = self.getParameterByName('calstart_date'); //let end_date = self.getParameterByName('calend_date');
308
309          let scaltype = self.scaltype;
310          let scalcat = self.scalcat;
311
312          if (start_date !== null) {
313            let cDate = new Date(start_date);
314            cDate.setTime(cDate.getTime() + self.getTimezoneInMiliseconds(cDate)); //let cDatee = new Date(end_date);
315            //cDatee.setTime(cDatee.getTime() + self.getTimezoneInMiliseconds(cDatee));
316
317            self.fpsearchS.setDate(cDate, true);
318            const datesR = self.dateRange(start_date, 1);
319            let today = Date.now();
320            today = today + new Date().getTimezoneOffset() * 60 * 1000 - today % (3600 * 1000 * 24);
321
322            for (let i = 0; i < datesR.length; i++) {
323              if (self.compare_asc(datesR[i].getTime(), today) < 0) {
324                jQuery('#bcalendar-section').append(jQuery('<div class="cal-card bdisabled" bbdate="' + flatpickr.formatDate(datesR[i], 'Y-m-d') + '"><span class="month">' + flatpickr.formatDate(datesR[i], 'M') + '</span><span class="day">' + flatpickr.formatDate(datesR[i], 'd') + '</span><span class="weekd">' + flatpickr.formatDate(datesR[i], 'D') + '</span></div>'));
325              } else {
326                jQuery('#bcalendar-section').append(jQuery('<div class="cal-card" bbdate="' + flatpickr.formatDate(datesR[i], 'Y-m-d') + '"><span class="month">' + flatpickr.formatDate(datesR[i], 'M') + '</span><span class="day">' + flatpickr.formatDate(datesR[i], 'd') + '</span><span class="weekd">' + flatpickr.formatDate(datesR[i], 'D') + '</span></div>'));
327              }
328            }
329
330            self.cstart_date = start_date;
331            self.cend_date = flatpickr.formatDate(datesR[datesR.length - 1], 'Y-m-d');
332            jQuery('#cprev_but').on('click', function () {
333              jQuery('#bcalendar-section').html('');
334              let today = Date.now();
335              today = today + new Date().getTimezoneOffset() * 60 * 1000 - today % (3600 * 1000 * 24);
336              const datesR1 = self.dateRangePrev(self.cstart_date, 1);
337              self.cstart_date = flatpickr.formatDate(datesR1[0], 'Y-m-d');
338              self.cend_date = flatpickr.formatDate(datesR1[datesR1.length - 1], 'Y-m-d');
339
340              for (let i = 0; i < datesR1.length; i++) {
341                if (self.compare_asc(datesR1[i].getTime(), today) < 0) {
342                  jQuery('#bcalendar-section').append(jQuery('<div class="cal-card bdisabled" bbdate="' + flatpickr.formatDate(datesR1[i], 'Y-m-d') + '"><span class="month">' + flatpickr.formatDate(datesR1[i], 'M') + '</span><span class="day">' + flatpickr.formatDate(datesR1[i], 'd') + '</span><span class="weekd">' + flatpickr.formatDate(datesR1[i], 'D') + '</span></div>'));
343                } else {
344                  jQuery('#bcalendar-section').append(jQuery('<div class="cal-card" bbdate="' + flatpickr.formatDate(datesR1[i], 'Y-m-d') + '"><span class="month">' + flatpickr.formatDate(datesR1[i], 'M') + '</span><span class="day">' + flatpickr.formatDate(datesR1[i], 'd') + '</span><span class="weekd">' + flatpickr.formatDate(datesR1[i], 'D') + '</span></div>'));
345                }
346              }
347
348              jQuery('.cal-card').removeClass('dselected');
349              jQuery('[bbdate="' + self.dselected + '"]').addClass('dselected');
350            });
351            jQuery('#cnext_but').on('click', function () {
352              jQuery('#bcalendar-section').html('');
353              let today = Date.now();
354              today = today + new Date().getTimezoneOffset() * 60 * 1000 - today % (3600 * 1000 * 24);
355              const datesR1 = self.dateRange(self.cend_date, 1);
356              self.cstart_date = flatpickr.formatDate(datesR1[0], 'Y-m-d');
357              self.cend_date = flatpickr.formatDate(datesR1[datesR1.length - 1], 'Y-m-d');
358
359              for (let i = 0; i < datesR1.length; i++) {
360                if (self.compare_asc(datesR1[i].getTime(), today) < 0) {
361                  jQuery('#bcalendar-section').append(jQuery('<div class="cal-card bdisabled" bbdate="' + flatpickr.formatDate(datesR1[i], 'Y-m-d') + '"><span class="month">' + flatpickr.formatDate(datesR1[i], 'M') + '</span><span class="day">' + flatpickr.formatDate(datesR1[i], 'd') + '</span><span class="weekd">' + flatpickr.formatDate(datesR1[i], 'D') + '</span></div>'));
362                } else {
363                  jQuery('#bcalendar-section').append(jQuery('<div class="cal-card" bbdate="' + flatpickr.formatDate(datesR1[i], 'Y-m-d') + '"><span class="month">' + flatpickr.formatDate(datesR1[i], 'M') + '</span><span class="day">' + flatpickr.formatDate(datesR1[i], 'd') + '</span><span class="weekd">' + flatpickr.formatDate(datesR1[i], 'D') + '</span></div>'));
364                }
365              }
366
367              jQuery('.cal-card').removeClass('dselected');
368              jQuery('[bbdate="' + self.dselected + '"]').addClass('dselected');
369            });
370          }
371
372          if (start_date !== null) {
373            jQuery('body').on('change', '#scaltype', function () {
374              self.scaltype = jQuery(this).val();
375              const data = {
376                action: 'cal_selected',
377                start_date: jQuery(this).attr('dddate'),
378                scaltype: self.scaltype,
379                scalcat: self.scalcat,
380                security: jQuery('#rwb_cal_selected_nonce').val()
381              };
382              jQuery('#bcalendar-section-wrapper').LoadingOverlay("show");
383              jQuery.ajax({
384                type: 'POST',
385                dataType: 'json',
386                url: bbLocal.ajax_url,
387                data: data,
388                success: jQuery.proxy(self.calCompleted, self)
389              });
390            });
391            jQuery('body').on('change', '#scalcat', function () {
392              self.scalcat = jQuery(this).val();
393              const data = {
394                action: 'cal_selected',
395                start_date: jQuery(this).attr('dddate'),
396                scaltype: self.scaltype,
397                scalcat: self.scalcat,
398                security: jQuery('#rwb_cal_selected_nonce').val()
399              };
400              jQuery('#bcalendar-section-wrapper').LoadingOverlay("show");
401              jQuery.ajax({
402                type: 'POST',
403                dataType: 'json',
404                url: bbLocal.ajax_url,
405                data: data,
406                success: jQuery.proxy(self.calCompleted, self)
407              });
408            });
409            jQuery('body').on('click', '.cal-card', function () {
410              jQuery('#bcalendar-section-wrapper').LoadingOverlay("show");
411              jQuery('.cal-card').removeClass('dselected');
412              jQuery(this).addClass('dselected');
413              self.dselected = jQuery(this).attr('bbdate');
414              const data = {
415                action: 'cal_selected',
416                start_date: jQuery(this).attr('bbdate'),
417                scaltype: self.scaltype,
418                scalcat: self.scalcat,
419                security: jQuery('#rwb_cal_selected_nonce').val()
420              };
421              jQuery.ajax({
422                type: 'POST',
423                dataType: 'json',
424                url: bbLocal.ajax_url,
425                data: data,
426                success: jQuery.proxy(self.calCompleted, self)
427              });
428            });
429
430            if (self.dselected == '') {
431              jQuery('[bbdate="' + start_date + '"]').trigger('click');
432            }
433
434            jQuery('#bcalendar-section-wrapper').css('display', 'grid');
435          }
436        }
437      }
438
439      if (self.JSearchButtonCalendar().length > 0) {
440        self.JSearchButtonCalendar().on('click', jQuery.proxy(self.searchCalendarButton, self));
441      }
442    }
443
444    if (jQuery("#period").length > 0) {
445      self.fpsearch = jQuery("#period").flatpickr({
446        mode: "range",
447        minDate: "today",
448        disableMobile: true,
449        dateFormat: "D, M d",
450        onChange: function (selectedDates, dateStr, instance) {
451          instance.element.value = dateStr.replace('to', '-');
452
453          if (selectedDates.length === 2) {
454            let diffTime = Math.abs(selectedDates[1] - selectedDates[0]);
455            let diffDays = Math.ceil(diffTime / (1000 * 60 * 60 * 24));
456            let addDays = Math.max(0, 1 - diffDays);
457
458            if (addDays > 0) {
459              selectedDates[1].setDate(selectedDates[1].getDate() + addDays);
460              instance.setDate(selectedDates);
461              setTimeout(() => {
462                instance.jumpToDate(selectedDates[0]);
463                instance.open();
464              });
465            }
466          }
467        },
468        showMonths: 2
469      });
470
471      if (self.isMobile()) {
472        self.fpsearch.set('showMonths', 1);
473      }
474
475      if (self.getParameterByName('searchhb') !== null) {
476        jQuery('.hotel-card').on('click', function () {
477          window.location.href = jQuery(this).attr('purl');
478        });
479
480        if (self.JSearchButton().length > 0) {
481          let start_date = self.getParameterByName('hstart_date');
482          let end_date = self.getParameterByName('hend_date');
483          let adults = self.getParameterByName('hadults');
484          let children = self.getParameterByName('hchildren');
485          let childrenagesa = self.getParameterByName('hchildrenages');
486          let rooms = self.getParameterByName('hrooms');
487
488          if (start_date !== null && end_date !== null) {
489            let cDate = new Date(start_date);
490            cDate.setTime(cDate.getTime() + self.getTimezoneInMiliseconds(cDate));
491            let cDatee = new Date(end_date);
492            cDatee.setTime(cDatee.getTime() + self.getTimezoneInMiliseconds(cDatee));
493            self.fpsearch.setDate([cDate, cDatee], true);
494          }
495
496          if (adults !== null) {
497            jQuery('#selectAdults').val(adults).trigger('change');
498          }
499
500          if (rooms !== null) {
501            jQuery('#selectRooms').val(rooms).trigger('change');
502          }
503
504          if (children !== null) {
505            jQuery('#selectChildren').val(children).trigger('change');
506          }
507
508          if (childrenagesa !== null) {
509            let childrenages = childrenagesa.split('-');
510
511            for (let i = 0; i < childrenages.length; i++) {
512              jQuery('#children-guests-section .guestc:eq(' + i + ')').val(childrenages[i]);
513            }
514          }
515
516          let scroll = self.getParameterByName('scroll');
517
518          if (scroll == '1') {
519            if (jQuery('.bpcs_wrapper').length > 0) {
520              jQuery('.bpcs_wrapper').closest('.qubely-column-inner').css('padding', '8px');
521              setTimeout(function () {
522                seamless.elementScrollIntoView(document.querySelector('.bpcs_wrapper'), {
523                  behavior: 'smooth',
524                  inline: 'top',
525                  block: 'top'
526                });
527                self.scrollWindow2();
528              }, 600);
529            }
530          }
531        }
532      }
533
534      if (self.JSearchButton().length > 0) {
535        self.JSearchButton().on('click', jQuery.proxy(self.searchHotelsButton, self));
536      }
537
538      if (self.JPackButton().length > 0) {
539        self.JPackButton().on('click', jQuery.proxy(self.startPackButton, self));
540      }
541
542      jQuery('.pack_price').each(function () {
543        jQuery(this).html('Please wait as we calculate the value');
544        let fontsize = jQuery(this).css('font-size');
545        jQuery(this).css('font-size', '15px');
546        self.calculatePackPrice(jQuery(this), fontsize);
547      });
548    }
549  }
550
551  showPageActions() {
552    jQuery('body').on('click', '.bbvid', function () {
553      //jQuery('.bbvid').on('click', function () {
554      jQuery.magnificPopup.open({
555        items: {
556          src: jQuery('.lightb_video').html(),
557          type: 'inline'
558        },
559        mainClass: 'blocks-cont-b mfp-fade',
560        //removalDelay: 160,
561        preloader: true,
562        overflowY: 'auto',
563        fixedContentPos: true,
564        callbacks: {
565          open: function () {}
566        }
567      });
568    });
569  }
570
571  hotelRoomActions() {
572    jQuery('.roomdetails').appendTo('#content');
573    jQuery('.room-card .image-wrapper, .room-card .hotel-title').on('click', function () {
574      let rid = jQuery(this).attr('rId');
575      jQuery.magnificPopup.open({
576        items: {
577          src: jQuery('.roomdetails[rId=' + rid + ']').html(),
578          type: 'inline'
579        },
580        mainClass: 'blocks-cont-b mfp-fade',
581        //removalDelay: 160,
582        preloader: true,
583        overflowY: 'auto',
584        fixedContentPos: true,
585        callbacks: {
586          open: function () {
587            jQuery('.mfp-content').find('.carouselr').flickity({
588              // options
589              cellAlign: 'left',
590              contain: true,
591              fullscreen: true,
592              wrapAround: true,
593              groupCells: 1,
594              lazyLoad: 1,
595              hash: true,
596              cellSelector: '.carouselr-cell',
597              //wrapAround: true,
598              freeScroll: true,
599              draggable: true,
600              pageDots: false
601            });
602          }
603        }
604      });
605      jQuery('.roomback .backbtn').on('click', function () {
606        jQuery.magnificPopup.close();
607      }); //jQuery('#content .porto-block:eq(0)').hide();
608    });
609    this.JRoomReserveButton().off('click').on('click', jQuery.proxy(this.roomReserveAction, this));
610  }
611
612  roomReserveAction(event) {
613    let self = this;
614    let rID, pID, rRate, el, isp;
615
616    if (jQuery(event.target).attr('rid')) {
617      el = jQuery(event.target);
618    } else {
619      el = jQuery(event.target).parent();
620    }
621
622    isp = el.attr('ispack');
623
624    if (typeof isp === 'undefined' || isp === false) {
625      isp = 0;
626    }
627
628    rID = el.attr('rid');
629    pID = el.attr('pid');
630    rRate = el.attr('rrate');
631    let start_date = self.getParameterByName('hstart_date');
632    let end_date = self.getParameterByName('hend_date');
633    let adults = self.getParameterByName('hadults');
634    let children = self.getParameterByName('hchildren');
635    let childrenagesa = self.getParameterByName('hchildrenages');
636    let rooms = self.getParameterByName('hrooms');
637    const data = {
638      action: 'reserve_room',
639      pid: pID,
640      rid: rID,
641      isp: isp,
642      rrate: rRate,
643      start_date: start_date,
644      end_date: end_date,
645      adults: adults,
646      rooms: rooms,
647      children: children,
648      childrenages: childrenagesa,
649      security: jQuery('#rwb_reserve_room_nonce').val()
650    };
651    el.LoadingOverlay("show");
652    jQuery.ajax({
653      type: 'POST',
654      dataType: 'json',
655      url: bbLocal.ajax_url,
656      data: data,
657      success: jQuery.proxy(self.roomReserveCompleted, self)
658    });
659    /*else {
660        Swal.fire({
661            title: 'Error!',
662            text: 'Please select at least one ticket',
663            icon: 'error',
664            confirmButtonText: 'Ok'
665        });
666    } */
667  }
668
669  roomReserveCompleted(response) {
670    if (response.success === false) {
671      const self = this;
672      __WEBPACK_IMPORTED_MODULE_1_sweetalert2_dist_sweetalert2_js___default.a.fire({
673        title: 'Information',
674        text: response.message,
675        icon: 'info',
676        confirmButtonText: 'OK',
677        closeOnConfirm: true
678      }).then(result => {
679        /* Read more about isConfirmed, isDenied below */
680        if (result.isConfirmed) {
681          self.JRoomReserveButton().LoadingOverlay("hide", true); //self.JBuyButton().hide();
682        } else if (result.isDenied) {//Swal.fire('Changes are not saved', '', 'info')
683        }
684      });
685    } else {
686      if (response.isp === 0) {
687        window.location.href = response.url;
688      } else {
689        window.location.href = window.location.href;
690      }
691    }
692  }
693
694  calculatePackPrice(elp, fontsize) {
695    let self = this;
696    let hID, el, pairID;
697    el = elp.parent().find('.startpack-button').first();
698    hID = el.attr('hid');
699    pairID = el.attr('pairid');
700    let start_date = self.getParameterByName('hstart_date');
701    let end_date = self.getParameterByName('hend_date');
702    let adults = self.getParameterByName('hadults');
703    let children = self.getParameterByName('hchildren');
704    let childrenagesa = self.getParameterByName('hchildrenages');
705    let rooms = self.getParameterByName('hrooms');
706    const data = {
707      action: 'price_package',
708      hid: hID,
709      pairid: pairID,
710      start_date: start_date,
711      end_date: end_date,
712      adults: adults,
713      rooms: rooms,
714      children: children,
715      childrenages: childrenagesa,
716      security: jQuery('#rwb_price_package_nonce').val()
717    };
718    elp.LoadingOverlay("show");
719    jQuery.ajax({
720      type: 'POST',
721      dataType: 'json',
722      url: bbLocal.ajax_url,
723      data: data,
724      success: function (response) {
725        elp.LoadingOverlay("hide");
726
727        if (response.html !== 'Not Available') {
728          elp.css('font-size', fontsize);
729        } else {
730          el.remove();
731        }
732
733        elp.html(response.html);
734      }
735    });
736  }
737
738  startPackButton() {
739    let self = this;
740    let hID, el, pairID;
741    el = jQuery(event.target);
742    hID = el.attr('hid');
743    pairID = el.attr('pairid');
744    let start_date = self.getParameterByName('hstart_date');
745    let end_date = self.getParameterByName('hend_date');
746    let adults = self.getParameterByName('hadults');
747    let children = self.getParameterByName('hchildren');
748    let childrenagesa = self.getParameterByName('hchildrenages');
749    let rooms = self.getParameterByName('hrooms');
750    const data = {
751      action: 'start_package',
752      hid: hID,
753      pairid: pairID,
754      start_date: start_date,
755      end_date: end_date,
756      adults: adults,
757      rooms: rooms,
758      children: children,
759      childrenages: childrenagesa,
760      security: jQuery('#rwb_start_package_nonce').val()
761    };
762    el.LoadingOverlay("show");
763    jQuery.ajax({
764      type: 'POST',
765      dataType: 'json',
766      url: bbLocal.ajax_url,
767      data: data,
768      success: jQuery.proxy(self.startPackageCompleted, self)
769    });
770  }
771
772  calCompleted(response) {
773    let self = this;
774    jQuery('#bcalendar-section-wrapper').LoadingOverlay("hide");
775
776    if (response.success === true) {
777      jQuery('#cal-card-result').html(response.html);
778    }
779  }
780
781  startPackageCompleted(response) {
782    jQuery('body').LoadingOverlay("hide");
783
784    if (response.success === true) {
785      let url = window.location.href;
786      url = url.replace('&ispack=1', '');
787      window.location.href = url;
788    }
789  }
790
791  searchHotelsButton() {
792    let self = this;
793
794    if (self.fpsearch !== false) {
795      let dates = self.fpsearch.selectedDates; //alert(dates[0] + '-' + dates[1]);
796
797      const start_date = self.fpsearch.formatDate(dates[0], 'Y-m-d');
798      const end_date = self.fpsearch.formatDate(dates[1], 'Y-m-d');
799      const adults = jQuery('#selectAdults').val();
800      const rooms = jQuery('#selectRooms').val();
801      const children = jQuery('#selectChildren').val();
802      let childrenages = '';
803      jQuery('#children-guests-section .guestc').each(function () {
804        childrenages += jQuery(this).val() + '-';
805      });
806      childrenages = childrenages.substring(0, childrenages.length - 1);
807      let params = '';
808
809      if (start_date !== '' && end_date !== '' && adults !== '' && adults !== '0' && rooms !== '' && rooms !== '0') {
810        params = '?searchhb=1&hstart_date=' + start_date + '&hend_date=' + end_date + '&hadults=' + adults + '&hrooms=' + rooms;
811
812        if (children !== '' && children !== '0' && childrenages !== '') {
813          params += '&hchildren=' + children + '&hchildrenages=' + childrenages;
814        }
815
816        if (window.location.href.indexOf('packages') !== -1) {
817          params += '&ispack=1';
818        }
819      }
820
821      if (params !== '') {
822        params += '&scroll=1';
823
824        if (jQuery('body').hasClass('single-product')) {
825          let bb = window.location.href;
826
827          if (bb.indexOf('?') > 0) {
828            bb = bb.split("?")[0];
829          }
830
831          window.location.href = bb + params;
832        } else {
833          window.location.href = window.location.origin + '/hotels/' + params;
834        }
835      }
836    }
837  }
838
839  searchCalendarButton() {
840    let self = this;
841
842    if (self.fpsearchS !== false) {
843      let dates = self.fpsearchS.selectedDates; //alert(dates[0] + '-' + dates[1]);
844
845      const start_date = self.fpsearchS.formatDate(dates[0], 'Y-m-d'); //const end_date = self.fpsearchS.formatDate(dates[1], 'Y-m-d');
846
847      let params = '';
848
849      if (start_date !== '') {
850        params += '?searchcalb=1&calstart_date=' + start_date;
851      }
852
853      if (params !== '') {
854        if (window.location.href.indexOf('aaa.spotlight.vegas') === -1) {
855          window.location.href = 'https://spotlight.vegas/shows/calendar/' + params;
856        } else {
857          window.location.href = 'https://aaa.spotlight.vegas/shows-calendar/' + params;
858        }
859      }
860    }
861  }
862
863  getParameterByName(name, url = window.location.href) {
864    name = name.replace(/[\[\]]/g, '\\$&');
865    var regex = new RegExp('[?&]' + name + '(=([^&#]*)|&|#|$)'),
866        results = regex.exec(url);
867    if (!results) return null;
868    if (!results[2]) return '';
869    return decodeURIComponent(results[2].replace(/\+/g, ' '));
870  }
871
872  isPack() {
873    if (jQuery('#pack_discounts').length > 0) {
874      return true;
875    }
876
877    return false;
878  }
879
880  packStartDate() {
881    let start_date = false;
882
883    if (jQuery('#pack_discounts').length > 0) {
884      start_date = new Date(jQuery('#pack_discounts').attr('start_date'));
885    }
886
887    return start_date;
888  }
889
890  packEndDate() {
891    let end_date = false;
892
893    if (jQuery('#pack_discounts').length > 0) {
894      end_date = new Date(jQuery('#pack_discounts').attr('end_date'));
895    }
896
897    return end_date;
898  }
899
900  renderEvents() {
901    let self = this;
902    let pID;
903
904    if (self.JIsAttraction()) {
905      pID = jQuery('#attraction_id').attr('pid');
906    } else {
907      pID = self.getParameterByName('product_id');
908    }
909
910    const data = {
911      action: 'seat_selection_map',
912      product_id: pID,
913      security: jQuery('#rwb_seat_selection_map_nonce').val()
914    };
915    jQuery('body').LoadingOverlay("show");
916    jQuery.ajax({
917      type: 'POST',
918      dataType: 'json',
919      url: bbLocal.ajax_url,
920      data: data,
921      success: jQuery.proxy(self.renderEventsCompleted, self)
922    });
923  }
924
925  renderSeatChart(event_id) {
926    let self = this;
927    this.createDestroySeatChart();
928    this.JTicketsCart().hide();
929    const data = {
930      action: 'event_seats',
931      product_id: self.getParameterByName('product_id'),
932      event_id: event_id,
933      security: jQuery('#rwb_event_seats_nonce').val()
934    };
935    jQuery('body').LoadingOverlay("show");
936    jQuery.ajax({
937      type: 'POST',
938      dataType: 'json',
939      url: bbLocal.ajax_url,
940      data: data,
941      success: jQuery.proxy(self.renderSeatChartCompleted, self)
942    });
943  }
944
945  clearCart() {
946    this.pods = [];
947    let selectedLabel = jQuery(this).attr('label'); //it will clear the whole cart because the seats are auto added
948
949    let sellab = [];
950
951    for (const k in this.selectedLabels) {
952      sellab.push(this.selectedLabels[k]['label']);
953    }
954
955    if (typeof this.seatChart.deselectObjects !== 'undefined') {
956      this.seatChart.deselectObjects(sellab);
957    }
958  }
959
960  selectBasedOnDropDown(selectedSeats) {
961    //update tickets_cart with buttons and all
962    let c;
963    let p;
964    let labels = [];
965    let self = this;
966    let totalPrice = 0;
967    let hasType = false;
968    let typesSeat = [];
969    let selectSeatsLabelOnly = [];
970    let existingSeats = [];
971    let totalTickets = 0;
972
973    for (c = 0; c < selectedSeats.length; c++) {
974      let label = {};
975      label.label = selectedSeats[c].label;
976      label.qty = 1;
977
978      if (typeof existingSeats[selectedSeats[c].uuid] !== 'undefined') {
979        continue;
980      }
981
982      if (typeof selectedSeats[c].numSelected !== 'undefined') {
983        label.qty = selectedSeats[c].numSelected;
984        label.labelorig = label.label;
985        label.label += '(' + selectedSeats[c].numSelected + ')';
986
987        if (typeof existingSeats[selectedSeats[c].uuid] === 'undefined') {
988          existingSeats[selectedSeats[c].uuid] = 1;
989        }
990      }
991
992      totalTickets += label.qty;
993      selectSeatsLabelOnly.push(label.label);
994
995      if (typeof selectedSeats[c].pricing !== "undefined" && typeof selectedSeats[c].pricing.ticketTypes !== "undefined") {
996        for (p = 0; p < selectedSeats[c].pricing.ticketTypes.length; p++) {
997          if (selectedSeats[c].pricing.ticketTypes[p]['ticketType'] === selectedSeats[c].selectedTicketType) {
998            label.price = label.qty * selectedSeats[c].pricing.ticketTypes[p]['price'];
999            label.type = selectedSeats[c].pricing.ticketTypes[p]['ticketType'];
1000            label.typen = label.type;
1001
1002            if (self.inArray(typesSeat, label.type) !== false) {
1003              hasType = true;
1004            }
1005
1006            typesSeat.push(label.type);
1007            totalPrice += label.qty * parseFloat(label.price);
1008          }
1009        }
1010      } else {
1011        label.typen = self.ticketTypeAll;
1012        label.price = label.qty * selectedSeats[c].pricing['price'];
1013        totalPrice += parseFloat(label.price);
1014      }
1015
1016      labels.push(label);
1017    }
1018
1019    self.selectedLabels = labels;
1020    let numberOfSelectedSeats = self.selectedLabels.length;
1021    let ScrollFromBottom = jQuery(document).height() - jQuery(window).scrollTop();
1022    let tableHeight = jQuery('#tickets_selected').height();
1023    self.JTicketsSelectedCart().html('');
1024    self.JTicketsButtonsCart().html('');
1025
1026    if (numberOfSelectedSeats === 0) {
1027      self.JTicketsSelectedCart().html('');
1028      self.JTicketsButtonsCart().hide();
1029      self.createPricingMap();
1030      jQuery('.bproceed_tickets').hide();
1031    } else {
1032      self.JTicketsSelectedCart().show();
1033      self.JTicketsButtonsCart().show();
1034      let headers = [];
1035      headers.push({
1036        'label': ''
1037      });
1038      headers.push({
1039        'label': 'Section'
1040      });
1041      headers.push({
1042        'label': 'Row'
1043      });
1044      headers.push({
1045        'label': 'Seat'
1046      });
1047
1048      if (hasType) {
1049        headers.push({
1050          'label': 'Type'
1051        });
1052      }
1053
1054      headers.push({
1055        'label': 'Price'
1056      });
1057      let rows = [];
1058
1059      for (const k in self.selectedLabels) {
1060        let row = [];
1061        const curLabel = self.selectedLabels[k];
1062        let label = curLabel['label'].split('-');
1063        row['columns'] = [];
1064        row['columns'].push('<i style="cursor:pointer" class="far fa-trash-alt deleteTicket" label="' + curLabel['label'] + '"></i>');
1065        row['columns'].push(label[0]);
1066
1067        if (typeof label[1] !== 'undefined') {
1068          row['columns'].push(label[1]);
1069        } else {
1070          row['columns'].push('');
1071        }
1072
1073        if (typeof label[2] !== 'undefined') {
1074          row['columns'].push(label[2]);
1075        } else {
1076          row['columns'].push('');
1077        }
1078
1079        if (hasType) {
1080          row['columns'].push(curLabel['type']);
1081        }
1082
1083        if (!self.isPack()) {
1084          row['columns'].push('$' + parseFloat(curLabel['price']).toFixed(2));
1085        } else {
1086          let pp = parseFloat(curLabel['price']).toFixed(2) - self.initPackPrice;
1087
1088          if (pp == 0) {
1089            row['columns'].push('INCLUDED');
1090          } else {
1091            row['columns'].push('+$' + pp.toFixed(2));
1092          }
1093        }
1094
1095        rows.push(row);
1096      }
1097
1098      let footers = [];
1099      footers.push({
1100        'label': totalTickets + ' Tickets',
1101        'colspan': 3
1102      });
1103
1104      if (!self.isPack()) {
1105        if (hasType) {
1106          footers.push({
1107            'label': 'Subtotal: $' + parseFloat(totalPrice).toFixed(2),
1108            'colspan': 3
1109          });
1110        } else {
1111          footers.push({
1112            'label': 'Subtotal: $' + parseFloat(totalPrice).toFixed(2),
1113            'colspan': 2
1114          });
1115        }
1116      } else {
1117        let pp = parseFloat(totalPrice).toFixed(2) - self.initPackPrice;
1118
1119        if (pp == 0) {
1120          if (hasType) {
1121            footers.push({
1122              'label': 'Subtotal: INCLUDED',
1123              'colspan': 3
1124            });
1125          } else {
1126            footers.push({
1127              'label': 'Subtotal: INCLUDED',
1128              'colspan': 2
1129            });
1130          }
1131        } else {
1132          if (hasType) {
1133            footers.push({
1134              'label': 'Subtotal: +$' + pp.toFixed(2),
1135              'colspan': 3
1136            });
1137          } else {
1138            footers.push({
1139              'label': 'Subtotal: +$' + pp.toFixed(2),
1140              'colspan': 2
1141            });
1142          }
1143        }
1144      }
1145
1146      self.JTicketsSelectedCart().append(self.createHtmlTable('tickets_selected', headers, rows, footers));
1147      self.JTicketsSelectedTable().find('.deleteTicket').on('click', function () {
1148        //self.clearCart();
1149        self.fromDelete = self.selectedLabels.length;
1150        let label = jQuery(this).attr('label');
1151
1152        for (const k1 in self.selectedLabels) {
1153          const curLabel = self.selectedLabels[k1];
1154
1155          if (curLabel['label'] === label && typeof curLabel['labelorig'] !== 'undefined') {
1156            label = curLabel['labelorig'];
1157            break;
1158          }
1159        }
1160
1161        if (!self.JFreeSeating()) {
1162          let pods = [];
1163
1164          for (const kp in self.pods) {
1165            for (const kpp in self.pods[kp]) {
1166              if (self.pods[kp][kpp] === label) {
1167                pods = self.pods[kp];
1168                break;
1169              }
1170            }
1171          }
1172
1173          if (typeof self.seatChart.deselectObjects !== 'undefined') {
1174            self.seatChart.deselectObjects(pods);
1175          } else {
1176            for (let io1 = 1; io1 < pods.length; io1++) {
1177              self.updateObjQuantity(pods[io1], 0);
1178            }
1179          }
1180        } else {
1181          if (typeof self.seatChart.deselectObjects !== 'undefined') {
1182            self.seatChart.deselectObjects([label]);
1183          } else {
1184            self.updateObjQuantity(label, 0);
1185          }
1186        }
1187
1188        if (typeof self.seatChart.listSelectedObjects !== 'undefined') {
1189          self.seatChart.listSelectedObjects(function (selectedObjects) {
1190            //check the selected seats and if the number is smaller select based on rank, and nearest
1191            self.selectBasedOnDropDown(selectedObjects);
1192          });
1193        } else {
1194          self.selectBasedOnDropDown(self.myselectedObjects);
1195        }
1196      });
1197      /*if (self.JIsAttraction() || self.JZoneImage().length > 0) {
1198          if (!self.isMobile()) {
1199              self.JTicketsButtonsCart().append(jQuery('<div class="best_price_guaranteed"> <span class="slv slv-check-circle"></span><span class="bb_link_product_text">Best price guaranteed</span> </div>'));
1200          } else {
1201              self.JTicketsButtonsCart().parent().append(jQuery('<div class="best_price_guaranteed"> <span class="slv slv-check-circle"></span><span class="bb_link_product_text">Best price guaranteed</span> </div>'));
1202          }
1203      }*/
1204
1205      self.JTicketsButtonsCart().append(jQuery('<a href="#0" class="saddcart">
1205Add To Cart</a>')).append(jQuery('<a href="#0" class="sbuynow">Buy Now</a>')); //.append(jQuery('<a href="#0" class="button btn sadd_to_cart_btn">Add To Cart</a>'))
1206      //jQuery('html,body').animate({scrollTop: 0}, 'slow');
1207
1208      if (self.JIsAttraction() || self.JZoneImage().length > 0) {
1209        this.JBuyButton().off('click').on('click', jQuery.proxy(this.buyNowActionA, this));
1210        this.JAddToCartButton().off('click').on('click', jQuery.proxy(this.addToCartActionA, this));
1211      } else {
1212        this.JBuyButton().off('click').on('click', jQuery.proxy(this.buyNowAction, this));
1213        this.JAddToCartButton().off('click').on('click', jQuery.proxy(this.addToCartAction, this));
1214      }
1215
1216      if (jQuery('#tickets_selected').length > 0) {
1217        if (self.isInViewport(jQuery('#tickets_selected'))) {
1218          // do something
1219          jQuery('.bproceed_tickets').hide();
1220        } else {
1221          jQuery('.bproceed_tickets').show();
1222        }
1223      }
1224
1225      if (self.isMobile()) {
1226        jQuery(window).scrollTop(jQuery(document).height() - ScrollFromBottom - 20);
1227      }
1228
1229      if (!self.JFreeSeating()) {
1230        if (self.selectedNumberOfTickets - numberOfSelectedSeats % self.selectedNumberOfTickets !== self.selectedNumberOfTickets) {
1231          let difference = self.selectedNumberOfTickets - numberOfSelectedSeats % self.selectedNumberOfTickets;
1232          let lastLabel = self.selectedLabels[self.selectedLabels.length - 1];
1233          let mypod = [];
1234          mypod.push(lastLabel['label']);
1235          let start = 0;
1236          let seatsByPosition = [];
1237          let lastSeatSelected = self.eventSeats[lastLabel['label']];
1238          let findPos = false;
1239          let autoSelectedSeats = [];
1240
1241          for (const k in self.eventSeats) {
1242            if (k === lastLabel['label']) {
1243              findPos = start;
1244            }
1245
1246            seatsByPosition.push(self.eventSeats[k]);
1247            start++;
1248          }
1249
1250          let p = 1;
1251          const spatialSeat = parseInt(lastSeatSelected['spatialSeatId']);
1252
1253          while (p < self.selectedNumberOfTickets) {
1254            if (typeof seatsByPosition[findPos - p] !== 'undefined' && seatsByPosition[findPos - p]['spatialRow'] === lastSeatSelected['spatialRow']) {
1255              const selSeat = parseInt(seatsByPosition[findPos - p]['spatialSeatId']);
1256
1257              if (selSeat + p === spatialSeat) {
1258                let iexist = false;
1259
1260                for (const kp in self.selectedLabels) {
1261                  if (self.selectedLabels[kp]['label'] === seatsByPosition[findPos - p]['key']) {
1262                    iexist = true;
1263                    break;
1264                  }
1265                }
1266
1267                if (iexist === false) {
1268                  mypod.push(seatsByPosition[findPos - p]['key']);
1269                  autoSelectedSeats.push(seatsByPosition[findPos - p]['key']);
1270                  difference--;
1271                }
1272              }
1273            }
1274
1275            if (difference === 0) {
1276              break;
1277            }
1278
1279            if (typeof seatsByPosition[findPos + p] !== 'undefined' && seatsByPosition[findPos + p]['spatialRow'] === lastSeatSelected['spatialRow']) {
1280              const selSeat = parseInt(seatsByPosition[findPos + p]['spatialSeatId']);
1281
1282              if (Math.abs(selSeat - p) === spatialSeat) {
1283                let iexist = false;
1284
1285                for (const kp in self.selectedLabels) {
1286                  if (self.selectedLabels[kp]['label'] === seatsByPosition[findPos + p]['key']) {
1287                    iexist = true;
1288                    break;
1289                  }
1290                }
1291
1292                if (iexist === false) {
1293                  mypod.push(seatsByPosition[findPos + p]['key']);
1294                  autoSelectedSeats.push(seatsByPosition[findPos + p]['key']);
1295                  difference--;
1296                }
1297              }
1298            }
1299
1300            if (difference === 0) {
1301              break;
1302            }
1303
1304            p++;
1305          }
1306
1307          if (difference === 0 && autoSelectedSeats.length > 0) {
1308            self.pods.push(mypod);
1309            self.seatChart.selectObjects(autoSelectedSeats);
1310          }
1311
1312          if (difference > 0) {
1313            __WEBPACK_IMPORTED_MODULE_1_sweetalert2_dist_sweetalert2_js___default.a.fire({
1314              title: 'Error!',
1315              text: 'Cannot select the rest of the tickets because there are no seats available on the same row',
1316              icon: 'error',
1317              confirmButtonText: 'Ok'
1318            });
1319            self.seatChart.deselectObjects([selectSeatsLabelOnly[selectSeatsLabelOnly.length - 1]]);
1320            self.seatChart.listSelectedObjects(function (selectedObjects) {
1321              //check the selected seats and if the number is smaller select based on rank, and nearest
1322              self.selectBasedOnDropDown(selectedObjects);
1323            });
1324          }
1325        }
1326      }
1327    }
1328  }
1329
1330  addToCartAction() {
1331    let self = this;
1332    let labels = Object.assign({}, self.selectedLabels);
1333    let usedBlocksToSend = {};
1334
1335    for (const i in self.usedBlocks) {
1336      usedBlocksToSend[i] = {};
1337      usedBlocksToSend[i]['promo'] = {};
1338      usedBlocksToSend[i]['promo']['promotionCode'] = self.usedBlocks[i]['promo']['promotionCode'];
1339    }
1340
1341    const data = {
1342      action: 'hold_seats',
1343      productid: self.getParameterByName('product_id'),
1344      seatlabels: labels,
1345      pods: self.pods,
1346      eventkey: self.selectedEventId,
1347      eventData: self.selectedEventData,
1348      usedBlocks: usedBlocksToSend,
1349      qty: labels.length,
1350      isp: self.isPack(),
1351      is_add_to_cart: true,
1352      security: jQuery('#rwb_hold_seats_nonce').val()
1353    };
1354    self.JAddToCartButton().LoadingOverlay("show");
1355    jQuery.ajax({
1356      type: 'POST',
1357      dataType: 'json',
1358      url: bbLocal.ajax_url,
1359      data: data,
1360      success: jQuery.proxy(self.addToCartCompleted, self)
1361    });
1362  }
1363
1364  onBtnClicked(btnId) {
1365    __WEBPACK_IMPORTED_MODULE_1_sweetalert2_dist_sweetalert2_js___default.a.close();
1366
1367    if (btnId != "cancel") {
1368      __WEBPACK_IMPORTED_MODULE_1_sweetalert2_dist_sweetalert2_js___default.a.fire("you choosed: " + btnId);
1369    }
1370  }
1371
1372  createButton(text, cb) {
1373    return jQuery('<button class="btn btn-info">
1373' + text + '</button>').on('click', cb);
1374  }
1375
1376  addToCartCompleted(response) {
1377    const self = this;
1378
1379    if (response.success === false) {
1380      if (typeof this.seatChart.rerender !== 'undefined') {
1381        this.seatChart.rerender();
1382      } //this.seatChart = false;
1383      //this.selectedObjectChart = null;
1384      //this.selectedEvent = null;
1385
1386
1387      __WEBPACK_IMPORTED_MODULE_1_sweetalert2_dist_sweetalert2_js___default.a.fire({
1388        title: 'Information',
1389        text: response.message,
1390        icon: 'info',
1391        confirmButtonText: 'OK',
1392        closeOnConfirm: true,
1393        allowOutsideClick: false,
1394        allowEscapeKey: false
1395      }).then(result => {
1396        /* Read more about isConfirmed, isDenied below */
1397        if (result.isConfirmed) {
1398          self.JAddToCartButton().LoadingOverlay("hide", true); //window.location.href = window.location.href;
1399          //self.JBuyButton().LoadingOverlay("hide", true);
1400
1401          self.clearCart();
1402          self.selectBasedOnDropDown([]); //self.JAddToCartButton().hide();
1403          //refresh map
1404
1405          if (response.reload) {
1406            if (self.JIsAttraction() || self.JZoneImage().length > 0) {} else {
1407              self.renderSeatChart(self.selectedEventId);
1408            }
1409          }
1410        } else if (result.isDenied) {//Swal.fire('Changes are not saved', '', 'info')
1411        }
1412      });
1413    } else {
1414      window.location.href = response.url;
1415      /*
1416      self.clearCart();
1417      jQuery('.around_icons_shopping').removeClass('been_refreshed');
1418      Swal.fire({
1419          title: 'Information',
1420          text: 'Your tickets have been added to the cart. If you want to buy more tickets please select them from the seating chart and add them to the cart. If you have finished Go To Checkout.',
1421          icon: 'info',
1422          confirmButtonText: 'Continue',
1423          showConfirmButton: true,
1424          showDenyButton: true,
1425          denyButtonText: `Go To Checkout`,
1426          closeOnConfirm: true
1427      }).then((result) => {
1428          if (result.isConfirmed) {
1429              //self.JAddToCartButton().LoadingOverlay("hide", true);
1430              //window.location.href = window.location.href;
1431              //self.JAddToCartButton().hide();
1432          } else if (result.isDenied) {
1433              window.location.href = response.checkout_url;
1434              //Swal.fire('Changes are not saved', '', 'info')
1435          }
1436      });
1437         */
1438    }
1439  }
1440
1441  buyNowActionA() {
1442    let self = this;
1443    let pID;
1444
1445    if (self.JIsAttraction()) {
1446      pID = jQuery('#attraction_id').attr('pid');
1447    } else {
1448      pID = self.getParameterByName('product_id');
1449    }
1450
1451    let ticketData = [];
1452    let stop = false;
1453    jQuery('.attraction_mint_maxt').each(function () {
1454      let attr = {};
1455
1456      if (parseInt(jQuery(this).val()) > 0) {
1457        attr.qty = jQuery(this).val();
1458        attr.promo_code = jQuery(this).attr('i');
1459        attr.priceLevelId = jQuery(this).attr('j');
1460
1461        if (jQuery(this).parent().parent().parent().parent().find('.attraction_pickuploc').length > 0) {
1462          attr.pickuploc = jQuery(this).parent().parent().parent().parent().find('.attraction_pickuploc').last().val();
1463        }
1464
1465        if (jQuery(this).parent().hasClass('hasnw')) {
1466          let bbfname = [];
1467          jQuery(this).parent().parent().parent().parent().find('.nwdata .bbfname').each(function () {
1468            if (jQuery(this).val() !== '') {
1469              bbfname.push(jQuery(this).val());
1470            } else {
1471              stop = true;
1472            }
1473          });
1474          attr.bbfname = bbfname;
1475          let bblname = [];
1476          jQuery(this).parent().parent().parent().parent().find('.nwdata .bblname').each(function () {
1477            if (jQuery(this).val() !== '') {
1478              bblname.push(jQuery(this).val());
1479            } else {
1480              stop = true;
1481            }
1482          });
1483          attr.bblname = bblname;
1484          let bbweight = [];
1485          jQuery(this).parent().parent().parent().parent().find('.nwdata .bbweight').each(function () {
1486            if (jQuery(this).val() !== '') {
1487              bbweight.push(jQuery(this).val());
1488            } else {
1489              stop = true;
1490            }
1491          });
1492          attr.bbweight = bbweight;
1493        }
1494
1495        ticketData.push(attr);
1496      }
1497    });
1498
1499    if (stop) {
1500      __WEBPACK_IMPORTED_MODULE_1_sweetalert2_dist_sweetalert2_js___default.a.fire({
1501        title: 'Hold Up!',
1502        text: 'Please provide all information',
1503        icon: 'error',
1504        confirmButtonText: 'Ok'
1505      });
1506      return false;
1507    }
1508
1509    if (ticketData.length > 0) {
1510      let usedBlocksToSend = {};
1511
1512      for (const i in self.usedBlocks) {
1513        usedBlocksToSend[i] = {};
1514        usedBlocksToSend[i]['promo'] = {};
1515        usedBlocksToSend[i]['promo']['promotionCode'] = self.usedBlocks[i]['promo']['promotionCode'];
1516      }
1517
1518      const data = {
1519        action: 'hold_attraction',
1520        productid: pID,
1521        eventkey: self.selectedEventId,
1522        eventData: self.selectedEventData,
1523        usedBlocks: usedBlocksToSend,
1524        isp: self.isPack(),
1525        //qty: self.selectedNumberOfTickets,
1526        ticket_data: ticketData,
1527        security: jQuery('#rwb_hold_attraction_nonce').val()
1528      };
1529      self.JBuyButton().LoadingOverlay("show");
1530      jQuery.ajax({
1531        type: 'POST',
1532        dataType: 'json',
1533        url: bbLocal.ajax_url,
1534        data: data,
1535        success: jQuery.proxy(self.buyNowCompletedA, self)
1536      });
1537    } else {
1538      __WEBPACK_IMPORTED_MODULE_1_sweetalert2_dist_sweetalert2_js___default.a.fire({
1539        title: 'Hold Up!',
1540        text: 'Please provide all information',
1541        icon: 'error',
1542        confirmButtonText: 'Ok'
1543      });
1544    }
1545  }
1546
1547  buyNowCompletedA(response) {
1548    if (response.success === false) {
1549      this.selectedEvent = null;
1550      const self = this;
1551      __WEBPACK_IMPORTED_MODULE_1_sweetalert2_dist_sweetalert2_js___default.a.fire({
1552        title: 'Information',
1553        text: response.message,
1554        icon: 'info',
1555        confirmButtonText: 'OK',
1556        closeOnConfirm: true
1557      }).then(result => {
1558        /* Read more about isConfirmed, isDenied below */
1559        if (result.isConfirmed) {
1560          self.JBuyButton().LoadingOverlay("hide", true); //self.JBuyButton().hide();
1561        } else if (result.isDenied) {//Swal.fire('Changes are not saved', '', 'info')
1562        }
1563      });
1564    } else {
1565      window.location.href = response.url;
1566    }
1567  }
1568
1569  addToCartActionA() {
1570    let self = this;
1571    let pID;
1572
1573    if (self.JIsAttraction()) {
1574      pID = jQuery('#attraction_id').attr('pid');
1575    } else {
1576      pID = self.getParameterByName('product_id');
1577    }
1578
1579    let ticketData = [];
1580    let stop = false;
1581    jQuery('.attraction_mint_maxt').each(function () {
1582      let attr = {};
1583
1584      if (parseInt(jQuery(this).val()) > 0) {
1585        attr.qty = jQuery(this).val();
1586        attr.promo_code = jQuery(this).attr('i');
1587        attr.priceLevelId = jQuery(this).attr('j');
1588
1589        if (jQuery(this).parent().hasClass('hasnw')) {
1590          attr.pickuploc = jQuery(this).parent().parent().parent().parent().find('.attraction_pickuploc').val();
1591          let bbfname = [];
1592          jQuery(this).parent().parent().parent().parent().find('.nwdata .bbfname').each(function () {
1593            if (jQuery(this).val() !== '') {
1594              bbfname.push(jQuery(this).val());
1595            } else {
1596              stop = true;
1597            }
1598          });
1599          attr.bbfname = bbfname;
1600          let bblname = [];
1601          jQuery(this).parent().parent().parent().parent().find('.nwdata .bblname').each(function () {
1602            if (jQuery(this).val() !== '') {
1603              bblname.push(jQuery(this).val());
1604            } else {
1605              stop = true;
1606            }
1607          });
1608          attr.bblname = bblname;
1609          let bbweight = [];
1610          jQuery(this).parent().parent().parent().parent().find('.nwdata .bbweight').each(function () {
1611            if (jQuery(this).val() !== '') {
1612              bbweight.push(jQuery(this).val());
1613            } else {
1614              stop = true;
1615            }
1616          });
1617          attr.bbweight = bbweight;
1618        }
1619
1620        ticketData.push(attr);
1621      }
1622    });
1623
1624    if (stop) {
1625      __WEBPACK_IMPORTED_MODULE_1_sweetalert2_dist_sweetalert2_js___default.a.fire({
1626        title: 'Hold Up!',
1627        text: 'Please provide all information',
1628        icon: 'error',
1629        confirmButtonText: 'Ok'
1630      });
1631      return false;
1632    }
1633
1634    if (ticketData.length > 0) {
1635      let usedBlocksToSend = {};
1636
1637      for (const i in self.usedBlocks) {
1638        usedBlocksToSend[i] = {};
1639        usedBlocksToSend[i]['promo'] = {};
1640        usedBlocksToSend[i]['promo']['promotionCode'] = self.usedBlocks[i]['promo']['promotionCode'];
1641      }
1642
1643      const data = {
1644        action: 'hold_attraction',
1645        productid: pID,
1646        eventkey: self.selectedEventId,
1647        eventData: self.selectedEventData,
1648        usedBlocks: usedBlocksToSend,
1649        //qty: self.selectedNumberOfTickets,
1650        ticket_data: ticketData,
1651        isp: self.isPack(),
1652        is_add_to_cart: true,
1653        security: jQuery('#rwb_hold_attraction_nonce').val()
1654      };
1655      self.JAddToCartButton().LoadingOverlay("show");
1656      jQuery.ajax({
1657        type: 'POST',
1658        dataType: 'json',
1659        url: bbLocal.ajax_url,
1660        data: data,
1661        success: jQuery.proxy(self.addToCartCompletedA, self)
1662      });
1663    } else {
1664      __WEBPACK_IMPORTED_MODULE_1_sweetalert2_dist_sweetalert2_js___default.a.fire({
1665        title: 'Error!',
1666        text: 'Please Select at least one ticket',
1667        icon: 'error',
1668        confirmButtonText: 'OK'
1669      });
1670    }
1671  }
1672
1673  addToCartCompletedA(response) {
1674    if (response.success === false) {
1675      this.selectedEvent = null;
1676      const self = this;
1677      __WEBPACK_IMPORTED_MODULE_1_sweetalert2_dist_sweetalert2_js___default.a.fire({
1678        title: 'Information',
1679        text: response.message,
1680        icon: 'info',
1681        confirmButtonText: 'OK',
1682        closeOnConfirm: true
1683      }).then(result => {
1684        /* Read more about isConfirmed, isDenied below */
1685        if (result.isConfirmed) {
1686          self.JAddToCartButton().LoadingOverlay("hide", true); //self.JAddToCartButton().hide();
1687        } else if (result.isDenied) {//Swal.fire('Changes are not saved', '', 'info')
1688        }
1689      });
1690    } else {
1691      window.location.href = response.url;
1692    }
1693  }
1694
1695  buyNowAction() {
1696    let self = this;
1697    let labels = Object.assign({}, self.selectedLabels);
1698    let usedBlocksToSend = {};
1699
1700    for (const i in self.usedBlocks) {
1701      usedBlocksToSend[i] = {};
1702      usedBlocksToSend[i]['promo'] = {};
1703      usedBlocksToSend[i]['promo']['promotionCode'] = self.usedBlocks[i]['promo']['promotionCode'];
1704    }
1705
1706    const data = {
1707      action: 'hold_seats',
1708      productid: self.getParameterByName('product_id'),
1709      seatlabels: labels,
1710      eventkey: self.selectedEventId,
1711      eventData: self.selectedEventData,
1712      usedBlocks: usedBlocksToSend,
1713      qty: labels.length,
1714      isp: self.isPack(),
1715      security: jQuery('#rwb_hold_seats_nonce').val()
1716    };
1717    self.JBuyButton().LoadingOverlay("show");
1718    jQuery.ajax({
1719      type: 'POST',
1720      dataType: 'json',
1721      url: bbLocal.ajax_url,
1722      data: data,
1723      success: jQuery.proxy(self.buyNowCompleted, self)
1724    });
1725  }
1726
1727  buyNowCompleted(response) {
1728    if (response.success === false) {
1729      if (typeof this.seatChart.rerender !== 'undefined') {
1730        this.seatChart.rerender();
1731      } //this.seatChart = false;
1732      //this.selectedObjectChart = null;
1733      //this.selectedEvent = null;
1734      //this.clearCart();
1735
1736
1737      const self = this;
1738      __WEBPACK_IMPORTED_MODULE_1_sweetalert2_dist_sweetalert2_js___default.a.fire({
1739        title: 'Information',
1740        text: response.message,
1741        icon: 'info',
1742        confirmButtonText: 'OK',
1743        closeOnConfirm: true,
1744        allowOutsideClick: false,
1745        allowEscapeKey: false
1746      }).then(result => {
1747        /* Read more about isConfirmed, isDenied below */
1748        if (result.isConfirmed) {
1749          self.JBuyButton().LoadingOverlay("hide", true);
1750          self.clearCart();
1751          self.selectBasedOnDropDown([]); //self.JBuyButton().hide();
1752          //refresh map
1753
1754          if (response.reload) {
1755            if (self.JIsAttraction() || self.JZoneImage().length > 0) {} else {
1756              self.renderSeatChart(self.selectedEventId);
1757            }
1758          }
1759        } else if (result.isDenied) {//Swal.fire('Changes are not saved', '', 'info')
1760        }
1761      });
1762    } else {
1763      window.location.href = response.url;
1764    }
1765  }
1766
1767  comparePriceBlocks(a1, b1) {
1768    const a = a1[1];
1769    const b = b1[1];
1770
1771    if (a['fullRetailPrice'] < b['fullRetailPrice']) {
1772      return 1;
1773    }
1774
1775    if (a['fullRetailPrice'] > b['fullRetailPrice']) {
1776      return -1;
1777    }
1778
1779    return 0;
1780  }
1781
1782  comparePriceBlocksPack(a1, b1) {
1783    const a = a1[1];
1784    const b = b1[1];
1785
1786    if (a['fullRetailPrice'] > b['fullRetailPrice']) {
1787      return 1;
1788    }
1789
1790    if (a['fullRetailPrice'] < b['fullRetailPrice']) {
1791      return -1;
1792    }
1793
1794    return 0;
1795  }
1796
1797  objectToArray(obj) {
1798    let _arr = [];
1799
1800    for (let key in obj) {
1801      _arr.push([key, obj[key]]);
1802    }
1803
1804    return _arr;
1805  }
1806
1807  getPriceBlocksAndUsedBlocksAttraction() {
1808    let priceBlocks = [];
1809    let self = this;
1810    let usedBlocks = {};
1811
1812    for (const key in self.eventPromotions) {
1813      for (const keyP in self.eventPromotions[key]['priceBlocks']) {
1814        for (const tmpkey in self.eventPromotions) {
1815          if (self.selectedPromoCode !== false) {
1816            if (self.eventPromotions[tmpkey]['promotionCode'] !== self.selectedPromoCode['promotionCode']) {
1817              continue;
1818            }
1819          }
1820
1821          let mykeyP = false;
1822
1823          for (const tmpkeyP in self.eventPromotions[tmpkey]['priceBlocks']) {
1824            if (self.eventPromotions[key]['priceBlocks'][keyP]['priceLevelId'] === self.eventPromotions[tmpkey]['priceBlocks'][tmpkeyP]['priceLevelId']) {
1825              mykeyP = tmpkeyP;
1826              break;
1827            }
1828          }
1829
1830          if (mykeyP !== false) {
1831            if (!self.eventPromotions[tmpkey]['priceBlocks'][mykeyP]['is_excluded']) {
1832              if (parseFloat(self.eventPromotions[key]['priceBlocks'][keyP]['fullRetailPrice']) < parseFloat(self.eventPromotions[tmpkey]['priceBlocks'][mykeyP]['fullRetailPrice'])) {
1833                if (typeof self.eventPromotions[key]['priceBlocks'][keyP].bigPrice === 'undefined') {
1834                  self.eventPromotions[key]['priceBlocks'][keyP].bigPrice = self.eventPromotions[tmpkey]['priceBlocks'][mykeyP]['fullRetailPrice'];
1835                } else {
1836                  if (parseFloat(self.eventPromotions[key]['priceBlocks'][keyP].bigPrice) < parseFloat(self.eventPromotions[tmpkey]['priceBlocks'][mykeyP]['fullRetailPrice'])) {
1837                    self.eventPromotions[key]['priceBlocks'][keyP].bigPrice = self.eventPromotions[tmpkey]['priceBlocks'][mykeyP]['fullRetailPrice'];
1838                  }
1839                }
1840              }
1841            }
1842
1843            if (self.eventPromotions[tmpkey]['priceBlocks'][mykeyP]['is_closedloop']) {
1844              if (parseFloat(self.eventPromotions[key]['priceBlocks'][keyP]['fullRetailPrice']) > parseFloat(self.eventPromotions[tmpkey]['priceBlocks'][mykeyP]['fullRetailPrice'])) {
1845                if (typeof self.eventPromotions[key]['priceBlocks'][keyP].smallPrice === 'undefined') {
1846                  self.eventPromotions[key]['priceBlocks'][keyP].smallPrice = self.eventPromotions[tmpkey]['priceBlocks'][mykeyP]['fullRetailPrice'];
1847                  self.eventPromotions[key]['priceBlocks'][keyP].mustlogin = self.eventPromotions[tmpkey]['priceBlocks'][mykeyP]['is_closedloop'];
1848                } else {
1849                  if (parseFloat(self.eventPromotions[key]['priceBlocks'][keyP].smallPrice) > parseFloat(self.eventPromotions[tmpkey]['priceBlocks'][mykeyP]['fullRetailPrice'])) {
1850                    self.eventPromotions[key]['priceBlocks'][keyP].smallPrice = self.eventPromotions[tmpkey]['priceBlocks'][mykeyP]['fullRetailPrice'];
1851                    self.eventPromotions[key]['priceBlocks'][keyP].mustlogin = self.eventPromotions[tmpkey]['priceBlocks'][mykeyP]['is_closedloop'];
1852                  }
1853                }
1854              }
1855            }
1856          }
1857        }
1858
1859        if (!self.eventPromotions[key]['priceBlocks'][keyP]['is_excluded']) {
1860          if (typeof usedBlocks[self.eventPromotions[key]['priceBlocks'][keyP]['priceLevelId']] === "undefined") {
1861            priceBlocks.push(self.eventPromotions[key]['priceBlocks'][keyP]);
1862            usedBlocks[self.eventPromotions[key]['priceBlocks'][keyP]['priceLevelId'] + ''] = {
1863              'promo': [self.eventPromotions[key]],
1864              'position': priceBlocks.length - 1
1865            };
1866          } else {
1867            //let promo = usedBlocks[self.eventPromotions[key]['priceBlocks'][keyP]['priceLevelId']].promo;
1868            //let position = usedBlocks[self.eventPromotions[key]['priceBlocks'][keyP]['priceLevelId']].position;
1869            //if (parseFloat(self.eventPromotions[key]['priceBlocks'][keyP]['fullRetailPrice']) < parseFloat(priceBlocks[position]['fullRetailPrice'])) {
1870            //priceBlocks[position] = self.eventPromotions[key]['priceBlocks'][keyP];
1871            priceBlocks.push(self.eventPromotions[key]['priceBlocks'][keyP]);
1872            usedBlocks[self.eventPromotions[key]['priceBlocks'][keyP]['priceLevelId'] + ''].promo.push(self.eventPromotions[key]); //}
1873          }
1874        }
1875      }
1876    }
1877
1878    return {
1879      'priceBlock': priceBlocks,
1880      'useBlock': usedBlocks
1881    };
1882  }
1883
1884  getPriceBlocksAndUsedBlocksZones() {
1885    let priceBlocks = [];
1886    let self = this;
1887    let usedBlocks = {};
1888
1889    for (const key in self.eventPromotions) {
1890      if (self.selectedPromoCode !== false) {
1891        if (self.eventPromotions[key]['promotionCode'] !== self.selectedPromoCode['promotionCode']) {
1892          continue;
1893        }
1894      }
1895
1896      for (const keyP in self.eventPromotions[key]['priceBlocks']) {
1897        for (const tmpkey in self.eventPromotions) {
1898          /*if (self.selectedPromoCode !== false) {
1899              if (self.eventPromotions[tmpkey]['promotionCode'] !== self.selectedPromoCode) {
1900                  continue;
1901              }
1902          }*/
1903          let mykeyP = false;
1904
1905          for (const tmpkeyP in self.eventPromotions[tmpkey]['priceBlocks']) {
1906            if (self.eventPromotions[key]['priceBlocks'][keyP]['priceLevelId'] === self.eventPromotions[tmpkey]['priceBlocks'][tmpkeyP]['priceLevelId']) {
1907              mykeyP = tmpkeyP;
1908              break;
1909            }
1910          }
1911
1912          if (mykeyP !== false) {
1913            if (!self.eventPromotions[tmpkey]['priceBlocks'][mykeyP]['is_excluded']) {
1914              if (parseFloat(self.eventPromotions[key]['priceBlocks'][keyP]['fullRetailPrice']) < parseFloat(self.eventPromotions[tmpkey]['priceBlocks'][mykeyP]['fullRetailPrice'])) {
1915                if (typeof self.eventPromotions[key]['priceBlocks'][keyP].bigPrice === 'undefined') {
1916                  self.eventPromotions[key]['priceBlocks'][keyP].bigPrice = self.eventPromotions[tmpkey]['priceBlocks'][mykeyP]['fullRetailPrice'];
1917                } else {
1918                  if (parseFloat(self.eventPromotions[key]['priceBlocks'][keyP].bigPrice) < parseFloat(self.eventPromotions[tmpkey]['priceBlocks'][mykeyP]['fullRetailPrice'])) {
1919                    self.eventPromotions[key]['priceBlocks'][keyP].bigPrice = self.eventPromotions[tmpkey]['priceBlocks'][mykeyP]['fullRetailPrice'];
1920                  }
1921                }
1922              }
1923            }
1924
1925            if (self.eventPromotions[tmpkey]['priceBlocks'][mykeyP]['is_closedloop']) {
1926              if (parseFloat(self.eventPromotions[key]['priceBlocks'][keyP]['fullRetailPrice']) > parseFloat(self.eventPromotions[tmpkey]['priceBlocks'][mykeyP]['fullRetailPrice'])) {
1927                if (typeof self.eventPromotions[key]['priceBlocks'][keyP].smallPrice === 'undefined') {
1928                  self.eventPromotions[key]['priceBlocks'][keyP].smallPrice = self.eventPromotions[tmpkey]['priceBlocks'][mykeyP]['fullRetailPrice'];
1929                  self.eventPromotions[key]['priceBlocks'][keyP].mustlogin = self.eventPromotions[tmpkey]['priceBlocks'][mykeyP]['is_closedloop'];
1930                } else {
1931                  if (parseFloat(self.eventPromotions[key]['priceBlocks'][keyP].smallPrice) > parseFloat(self.eventPromotions[tmpkey]['priceBlocks'][mykeyP]['fullRetailPrice'])) {
1932                    self.eventPromotions[key]['priceBlocks'][keyP].smallPrice = self.eventPromotions[tmpkey]['priceBlocks'][mykeyP]['fullRetailPrice'];
1933                    self.eventPromotions[key]['priceBlocks'][keyP].mustlogin = self.eventPromotions[tmpkey]['priceBlocks'][mykeyP]['is_closedloop'];
1934                  }
1935                }
1936              }
1937            }
1938          }
1939        }
1940
1941        if (!self.eventPromotions[key]['priceBlocks'][keyP]['is_excluded']) {
1942          if (typeof usedBlocks[self.eventPromotions[key]['priceBlocks'][keyP]['priceLevelId']] === "undefined") {
1943            priceBlocks.push(self.eventPromotions[key]['priceBlocks'][keyP]);
1944            usedBlocks[self.eventPromotions[key]['priceBlocks'][keyP]['priceLevelId'] + ''] = {
1945              'promo': self.eventPromotions[key],
1946              'position': priceBlocks.length - 1
1947            };
1948          } else {
1949            let promo = usedBlocks[self.eventPromotions[key]['priceBlocks'][keyP]['priceLevelId']].promo;
1950            let position = usedBlocks[self.eventPromotions[key]['priceBlocks'][keyP]['priceLevelId']].position;
1951
1952            if (parseFloat(self.eventPromotions[key]['priceBlocks'][keyP]['fullRetailPrice']) < parseFloat(priceBlocks[position]['fullRetailPrice'])) {
1953              priceBlocks[position] = self.eventPromotions[key]['priceBlocks'][keyP];
1954              usedBlocks[self.eventPromotions[key]['priceBlocks'][keyP]['priceLevelId'] + ''].promo = self.eventPromotions[key];
1955            }
1956          }
1957        }
1958      }
1959    }
1960
1961    return {
1962      'priceBlock': priceBlocks,
1963      'useBlock': usedBlocks
1964    };
1965  }
1966
1967  getPriceBlocksAndUsedBlocks() {
1968    let priceBlocks = [];
1969    let self = this;
1970    let usedBlocks = {};
1971
1972    for (const key in self.eventPromotions) {
1973      if (self.selectedPromoCode !== false) {
1974        if (self.eventPromotions[key]['promotionCode'] !== self.selectedPromoCode['promotionCode']) {
1975          continue;
1976        }
1977      }
1978
1979      for (const keyP in self.eventPromotions[key]['priceBlocks']) {
1980        for (const tmpkey in self.eventPromotions) {
1981          if (self.selectedPromoCode !== false) {
1982            if (self.eventPromotions[tmpkey]['promotionCode'] !== self.selectedPromoCode['promotionCode']) {
1983              continue;
1984            }
1985          }
1986
1987          let mykeyP = false;
1988
1989          for (const tmpkeyP in self.eventPromotions[tmpkey]['priceBlocks']) {
1990            if (self.eventPromotions[key]['priceBlocks'][keyP]['priceLevelId'] === self.eventPromotions[tmpkey]['priceBlocks'][tmpkeyP]['priceLevelId']) {
1991              mykeyP = tmpkeyP;
1992              break;
1993            }
1994          }
1995
1996          if (mykeyP !== false) {
1997            if (!self.eventPromotions[tmpkey]['priceBlocks'][mykeyP]['is_excluded']) {
1998              if (parseFloat(self.eventPromotions[key]['priceBlocks'][keyP]['fullRetailPrice']) < parseFloat(self.eventPromotions[tmpkey]['priceBlocks'][mykeyP]['fullRetailPrice'])) {
1999                if (typeof self.eventPromotions[key]['priceBlocks'][keyP].bigPrice === 'undefined') {
2000                  self.eventPromotions[key]['priceBlocks'][keyP].bigPrice = self.eventPromotions[tmpkey]['priceBlocks'][mykeyP]['fullRetailPrice'];
2001                } else {
2002                  if (parseFloat(self.eventPromotions[key]['priceBlocks'][keyP].bigPrice) < parseFloat(self.eventPromotions[tmpkey]['priceBlocks'][mykeyP]['fullRetailPrice'])) {
2003                    self.eventPromotions[key]['priceBlocks'][keyP].bigPrice = self.eventPromotions[tmpkey]['priceBlocks'][mykeyP]['fullRetailPrice'];
2004                  }
2005                }
2006              }
2007            }
2008
2009            if (self.eventPromotions[tmpkey]['priceBlocks'][mykeyP]['is_closedloop']) {
2010              if (parseFloat(self.eventPromotions[key]['priceBlocks'][keyP]['fullRetailPrice']) > parseFloat(self.eventPromotions[tmpkey]['priceBlocks'][mykeyP]['fullRetailPrice'])) {
2011                if (typeof self.eventPromotions[key]['priceBlocks'][keyP].smallPrice === 'undefined') {
2012                  self.eventPromotions[key]['priceBlocks'][keyP].smallPrice = self.eventPromotions[tmpkey]['priceBlocks'][mykeyP]['fullRetailPrice'];
2013                  self.eventPromotions[key]['priceBlocks'][keyP].mustlogin = self.eventPromotions[tmpkey]['priceBlocks'][mykeyP]['is_closedloop'];
2014                } else {
2015                  if (parseFloat(self.eventPromotions[key]['priceBlocks'][keyP].smallPrice) > parseFloat(self.eventPromotions[tmpkey]['priceBlocks'][mykeyP]['fullRetailPrice'])) {
2016                    self.eventPromotions[key]['priceBlocks'][keyP].smallPrice = self.eventPromotions[tmpkey]['priceBlocks'][mykeyP]['fullRetailPrice'];
2017                    self.eventPromotions[key]['priceBlocks'][keyP].mustlogin = self.eventPromotions[tmpkey]['priceBlocks'][mykeyP]['is_closedloop'];
2018                  }
2019                }
2020              }
2021            }
2022          }
2023        }
2024
2025        if (!self.eventPromotions[key]['priceBlocks'][keyP]['is_excluded']) {
2026          if (typeof usedBlocks[self.eventPromotions[key]['priceBlocks'][keyP]['priceLevelId']] === "undefined") {
2027            priceBlocks.push(self.eventPromotions[key]['priceBlocks'][keyP]);
2028            usedBlocks[self.eventPromotions[key]['priceBlocks'][keyP]['priceLevelId'] + ''] = {
2029              'promo': self.eventPromotions[key],
2030              'position': priceBlocks.length - 1
2031            };
2032          } else {
2033            let promo = usedBlocks[self.eventPromotions[key]['priceBlocks'][keyP]['priceLevelId']].promo;
2034            let position = usedBlocks[self.eventPromotions[key]['priceBlocks'][keyP]['priceLevelId']].position;
2035
2036            if (parseFloat(self.eventPromotions[key]['priceBlocks'][keyP]['fullRetailPrice']) < parseFloat(priceBlocks[position]['fullRetailPrice'])) {
2037              priceBlocks[position] = self.eventPromotions[key]['priceBlocks'][keyP];
2038              usedBlocks[self.eventPromotions[key]['priceBlocks'][keyP]['priceLevelId'] + ''].promo = self.eventPromotions[key];
2039            }
2040          }
2041        }
2042      }
2043    }
2044
2045    return {
2046      'priceBlock': priceBlocks,
2047      'useBlock': usedBlocks
2048    };
2049  }
2050
2051  getPriceLevelIds() {
2052    let priceLevelIds = [];
2053    let self = this;
2054
2055    for (const key in self.eventPromotions) {
2056      for (const keyP in self.eventPromotions[key]['priceLevelIds']) {
2057        priceLevelIds.push(self.eventPromotions[key]['priceLevelIds'][keyP]);
2058      }
2059    }
2060
2061    return priceLevelIds;
2062  }
2063
2064  getTagIds() {
2065    let tagIds = [];
2066    let self = this;
2067
2068    for (const key in self.eventPromotions) {
2069      for (const keyP in self.eventPromotions[key]['tagIds']) {
2070        tagIds.push(self.eventPromotions[key]['tagIds'][keyP]);
2071      }
2072    }
2073
2074    return tagIds;
2075  }
2076
2077  getSubholdIds() {
2078    let subholdsIds = [];
2079    let self = this;
2080
2081    for (const key in self.eventPromotions) {
2082      //for (const keyP in self.eventPromotions[key]['priceBlocks']) {
2083      subholdsIds.push(self.eventPromotions[key]['holdSubclassId']); //}
2084    }
2085
2086    return subholdsIds;
2087  }
2088
2089  createPricingMap() {
2090    let self = this;
2091    let priceBlocks;
2092    let priceBlocksAndUsedBlocks = self.getPriceBlocksAndUsedBlocks();
2093    priceBlocks = priceBlocksAndUsedBlocks.priceBlock;
2094    self.JPriceMap().html('');
2095    self.JPriceMap().show();
2096    self.JPriceMapExplanation().show();
2097    self.JPriceBestSeats().remove();
2098    self.selectedFilteredCategories = [];
2099    let priceArr = [];
2100    let priceBlockArr = self.objectToArray(priceBlocks);
2101    priceBlockArr.sort(self.comparePriceBlocks);
2102    let po = 0;
2103    jQuery('#price_login_signup').hide();
2104
2105    for (let i1 = priceBlockArr.length - 1; i1 >= 0; i1--) {
2106      const key = priceBlockArr[i1][0]; //const value = priceBlockArr[i1][1];
2107
2108      if (self.usedPriceLevelIds !== false && self.inArray(self.usedPriceLevelIds, priceBlocks[key]['priceLevelId'])) {
2109        let bigpricecut = '';
2110
2111        if (typeof priceBlocks[key].bigPrice !== 'undefined' && priceBlocks[key]['fullRetailPrice'] !== priceBlocks[key].bigPrice) {
2112          bigpricecut = '<span class="bigpricecut">' + parseFloat(priceBlocks[key].bigPrice).toFixed(2) + '</span>';
2113        }
2114
2115        if (priceBlocks[key].mustlogin && typeof priceBlocks[key].smallPrice !== 'undefined' && priceBlocks[key]['fullRetailPrice'] !== priceBlocks[key].smallPrice) {
2116          jQuery('#price_login_signup').show();
2117        }
2118
2119        let priceDiv = '<div class="price_block" price_level_id="' + priceBlocks[key]['priceLevelId'] + '"><i class="slv slv-radio-unchecked" style="color:' + self.codeArray()[po] + '"></i><span class="price_block_pricing">$' + parseFloat(priceBlocks[key]['fullRetailPrice']).toFixed(2) + bigpricecut + '</span></div>';
2120
2121        if (self.isPack()) {
2122          if (po === 0) {
2123            priceDiv = '<div class="price_block" price_level_id="' + priceBlocks[key]['priceLevelId'] + '"><i class="slv slv-radio-unchecked" style="color:' + self.codeArray()[po] + '"></i><span class="price_block_pricing">INCLUDED</span></div>';
2124            self.initPackPrice = parseFloat(priceBlocks[key]['fullRetailPrice']).toFixed(2);
2125          } else {
2126            priceDiv = '<div class="price_block" price_level_id="' + priceBlocks[key]['priceLevelId'] + '"><i class="slv slv-radio-unchecked" style="color:' + self.codeArray()[po] + '"></i><span class="price_block_pricing">+$' + (parseFloat(priceBlocks[key]['fullRetailPrice']).toFixed(2) - self.initPackPrice).toFixed(2) + '</span></div>';
2127          }
2128        } //priceArr can be sorted
2129
2130
2131        priceArr.push(priceDiv);
2132        po++;
2133      }
2134    }
2135    /*for (let k1 = priceArr.length - 1; k1 >= 0; k1--) {
2136        self.JPriceMap().append(jQuery(priceArr[k1]));
2137    }*/
2138
2139
2140    for (let k1 = 0; k1 < priceArr.length; k1++) {
2141      self.JPriceMap().append(jQuery(priceArr[k1]));
2142    }
2143
2144    let optionsbest = '';
2145    let step = 1;
2146
2147    if (!this.JFreeSeating()) {
2148      step = parseInt(this.JTicketsChooser().val());
2149    }
2150
2151    if (step === 0) {
2152      step = 1;
2153    }
2154
2155    for (let oo = 0; oo <= 30; oo += step) {
2156      optionsbest += '<option value="' + oo.toString() + '">' + oo.toString() + '</option>';
2157    }
2158
2159    let dropdownBestSeats = 'Select # of Seats:<select class="ticket_number_best">' + optionsbest + '</select>'; //self.JPriceMapSeats().append(jQuery('<div class="price_best_seats" style="display:none"><div class="best_seats_button">FIND BEST SEATS</div><div class="best_seats_text">This option will find the the best seats for your selected category. You can also manually select seats by clicking on them.' + dropdownBestSeats + '</div></div>'));
2160
2161    jQuery('.price_block').off('click').on('click', function () {
2162      const levelId = jQuery(this).attr('price_level_id');
2163      const indexOfItem = self.selectedFilteredCategories.indexOf(levelId);
2164
2165      if (indexOfItem === -1) {
2166        self.selectedFilteredCategories.push(levelId);
2167        jQuery(this).addClass('price_block_selected');
2168      } else {
2169        self.selectedFilteredCategories.splice(indexOfItem, 1);
2170        jQuery(this).removeClass('price_block_selected');
2171      }
2172
2173      if (self.selectedFilteredCategories.length === 1) {
2174        jQuery('.price_best_seats').show();
2175      } else {
2176        jQuery('.price_best_seats').hide();
2177      }
2178
2179      if (typeof self.seatChart.changeConfig !== 'undefined') {
2180        self.seatChart.changeConfig({
2181          filteredCategories: self.selectedFilteredCategories
2182        });
2183      } else {
2184        self.seatChart.toggleCategoriesHighlightRender(self.selectedFilteredCategories);
2185      }
2186    });
2187    jQuery('.best_seats_button:not(.bbrun)').off('click').on('click', function () {
2188      self.seatChart.selectBestAvailable({
2189        'number': parseInt(jQuery('.ticket_number_best').val()),
2190        'category': self.selectedFilteredCategories[0]
2191      });
2192      jQuery('.best_seats_button').addClass('bbrun');
2193      self.JPriceMapSeats().find('.best_seats_text').html('<i class="slv slv-check-circle" style="color:#BC5AFF"></i> You\'ve got the best seats');
2194    });
2195  }
2196
2197  renderSeatChartCompleted(response) {
2198    jQuery('body').LoadingOverlay("hide");
2199
2200    if (response.success === true) {
2201      let self = this;
2202      this.eventSeats = response.event_seats;
2203      this.eventPromotions = response.event_promotions;
2204      this.eventSections = response.event_sections;
2205      this.seatAlertsAndTooltipsPerLabel = response.seat_alerts;
2206
2207      if (!self.JFreeSeating()) {
2208        self.createDropDownSelect(response.dropdown_select, response.workspacekey, response.event);
2209      } else {
2210        self.selectedNumberOfTickets = 0;
2211        self.selectedPromoCode = false;
2212        self.renderSeatMap(response.workspacekey, response.event);
2213        self.createPricingMap();
2214      }
2215    } else {
2216      __WEBPACK_IMPORTED_MODULE_1_sweetalert2_dist_sweetalert2_js___default.a.fire({
2217        title: 'Error!',
2218        text: 'There was an error rendering the seats chart. The page will now refresh',
2219        icon: 'error',
2220        confirmButtonText: 'OK',
2221        closeOnConfirm: true
2222      }).then(result => {
2223        /* Read more about isConfirmed, isDenied below */
2224        if (result.isConfirmed) {
2225          window.location.href = window.location.href;
2226        } else if (result.isDenied) {//Swal.fire('Changes are not saved', '', 'info')
2227        }
2228      });
2229    }
2230  }
2231
2232  createCalendar() {
2233    this.calendar = this.JFlatCalendar().flatpickr({
2234      mode: 'single',
2235      disableMobile: true,
2236      inline: true,
2237      //locale: bbLocal.current_language,
2238      //dateFormat: this.getDateFormat(),
2239      altInput: false,
2240      clickOpens: false,
2241      allowInput: false,
2242      //static: true,
2243      onChange: jQuery.proxy(this.dateChanged, this),
2244      onMonthChange: jQuery.proxy(this.monthChanged, this),
2245      onDayCreate: jQuery.proxy(this.dayCreate, this)
2246    });
2247
2248    if (this.JTheme() === 'light') {
2249      this.JBlankSeatsMap().html('<img src="/wp-content/themes/porto/images/no_selection_date_time_light.png"/><h4>Pick a date to see the available tickets</h4>');
2250    } else {
2251      this.JBlankSeatsMap().html('<h4>Select a date from the Calendar</h4><img style="padding:80px;" src="/wp-content/themes/porto/images/no_selection_date_time.png"/>');
2252    } //jQuery('<span>,</span>').insertAfter(jQuery('.flatpickr-monthDropdown-months'));
2253
2254
2255    jQuery('.flatpickr-monthDropdown-months').prop('disabled', 'disabled');
2256    jQuery('.flatpickr-current-month input').prop('disabled', 'disabled');
2257
2258    if (this.JGoToMonth() !== false) {
2259      this.calendar.jumpToDate(this.getEndOfMonths(this.JGoToMonth()['year'], this.JGoToMonth()['month'] - 1));
2260    } else {
2261      if (this.firstDateWithEvent !== false) {
2262        this.calendar.jumpToDate(this.getEndOfMonth(this.firstDateWithEvent));
2263      }
2264    }
2265  }
2266
2267  monthChanged(selectedDates, dateStr, instance) {
2268    //console.log(instance.currentMonth);
2269    let self = this;
2270    let curMonth = parseInt(instance.currentMonth) + 1;
2271    let curYear = parseInt(instance.currentYear);
2272
2273    if (self.JDualDates()) {
2274      let dyear = parseInt(self.JDualDates().attr('dyear'));
2275      let dmonth = parseInt(self.JDualDates().attr('dmonth'));
2276      let dtype = self.JDualDates().attr('dtype');
2277      let durl = self.JDualDates().attr('durl');
2278
2279      if (dtype === 'a') {
2280        if (dmonth <= curMonth && curYear === dyear || curYear > dyear) {
2281          window.location.href = durl + '&dmonth=' + curMonth + '&dyear=' + curYear;
2282        }
2283      } else if (dtype === 'b') {
2284        if (dmonth > curMonth && curYear === dyear || curYear < dyear) {
2285          window.location.href = durl + '&dmonth=' + curMonth + '&dyear=' + curYear;
2286        }
2287      }
2288    }
2289  }
2290
2291  getLastDay(y, m) {
2292    return 30 + (m <= 7 ? m % 2 ? 1 : 0 : !(m % 2) ? 1 : 0) - (m == 2) - (m == 2 && y % 4 != 0 || !(y % 100 == 0 && y % 400 == 0));
2293  }
2294
2295  getLastTrueDay(y, m) {
2296    return new Date(y, m + 1, 0).getDate();
2297  }
2298
2299  getEndOfMonth(date) {
2300    let nextMonth = new Date(date.getFullYear(), date.getMonth(), this.getLastTrueDay(date.getFullYear(), date.getMonth()));
2301    return nextMonth;
2302  }
2303
2304  getEndOfMonths(dateYear, dateMonth) {
2305    let nextMonth = new Date(dateYear, dateMonth, this.getLastDay(dateYear, dateMonth));
2306    return nextMonth;
2307  }
2308
2309  dayCreate(dObj, dStr, fp, dayElem) {
2310    if (jQuery(dayElem).hasClass('prevMonthDay') || jQuery(dayElem).hasClass('nextMonthDay')) {
2311      jQuery(dayElem).addClass('disabled').css('visibility', 'hidden');
2312    }
2313
2314    let self = this;
2315    let found = false;
2316    let today = new Date(); //if (!self.JIsAttraction()) {
2317
2318    today = new Date(today.getFullYear(), today.getMonth(), today.getDate()); //}
2319
2320    if (self.compare_asc(dayElem.dateObj, today.getTime()) >= 0) {
2321      for (const key in self.eventList) {
2322        let cDate = self.createDateAsUTC(dayElem.dateObj);
2323        cDate.setTime(cDate.getTime() + self.getTimezoneInMiliseconds(cDate));
2324
2325        if (key === flatpickr.formatDate(cDate, 'Y-m-d')) {
2326          found = true;
2327          break;
2328        }
2329      }
2330    }
2331
2332    let start_date = self.packStartDate();
2333    let end_date = self.packEndDate();
2334
2335    if (start_date !== false && end_date !== false) {
2336      if (self.compare_asc(dayElem.dateObj, start_date.getTime() + self.getTimezoneInMiliseconds(start_date)) < 0) {
2337        jQuery(dayElem).addClass('flatpickr-disabled');
2338      }
2339
2340      if (self.compare_asc(dayElem.dateObj, end_date.getTime() + self.getTimezoneInMiliseconds(end_date)) > 0) {
2341        jQuery(dayElem).addClass('flatpickr-disabled');
2342      }
2343    }
2344
2345    if (found) {
2346      dayElem.innerHTML += "<span class='bbevent'></span>";
2347    } else {
2348      jQuery(dayElem).addClass('flatpickr-disabled');
2349    }
2350  }
2351
2352  createDropDownAttraction(mint, maxt, reqev, i, j) {
2353    let dropd = '<select i="' + i + '" j="' + j + '" name="attraction_select_' + i + '_' + j + '" class="attraction_mint_maxt">';
2354    let step = 1; //this needs to be a setting but because only brad garreth has zones and is from 2 +2 then we leave like this
2355
2356    dropd += '<option value="' + 0 + '">' + 0 + '</option>';
2357
2358    for (let p = mint + 1; p < maxt; p = p + step) {
2359      dropd += '<option value="' + p + '">' + p + '</option>';
2360    }
2361
2362    dropd += '</select>';
2363    return dropd;
2364  }
2365
2366  renderTicketSelector(event_id) {
2367    let self = this;
2368    let pID;
2369
2370    if (self.JIsAttraction()) {
2371      pID = jQuery('#attraction_id').attr('pid');
2372    } else {
2373      pID = self.getParameterByName('product_id');
2374    }
2375
2376    const data = {
2377      action: 'event_seats',
2378      product_id: pID,
2379      event_id: event_id,
2380      security: jQuery('#rwb_event_seats_nonce').val()
2381    };
2382    jQuery('body').LoadingOverlay("show");
2383    jQuery.ajax({
2384      type: 'POST',
2385      dataType: 'json',
2386      url: bbLocal.ajax_url,
2387      data: data,
2388      success: jQuery.proxy(self.renderTicketSelectorCompleted, self)
2389    });
2390  }
2391
2392  renderTicketSelectorCompleted(response) {
2393    jQuery('body').LoadingOverlay("hide");
2394
2395    if (response.success === true) {
2396      this.eventPromotions = response.event_promotions;
2397      this.eventSections = response.event_sections;
2398      this.renderTicketSelectorAction();
2399    } else {
2400      __WEBPACK_IMPORTED_MODULE_1_sweetalert2_dist_sweetalert2_js___default.a.fire({
2401        title: 'Error!',
2402        text: 'There was an error rendering the seats chart. The page will now refresh',
2403        icon: 'error',
2404        confirmButtonText: 'OK',
2405        closeOnConfirm: true
2406      }).then(result => {
2407        /* Read more about isConfirmed, isDenied below */
2408        if (result.isConfirmed) {
2409          window.location.href = window.location.href;
2410        } else if (result.isDenied) {//Swal.fire('Changes are not saved', '', 'info')
2411        }
2412      });
2413    }
2414  }
2415
2416  sortUsingNestedText(parent, childSelector, keySelector) {
2417    var items = parent.children(childSelector).sort(function (a, b) {
2418      var vA = parseFloat(jQuery(keySelector, a).text().substring(1));
2419      var vB = parseFloat(jQuery(keySelector, b).text().substring(1));
2420      return vA > vB ? -1 : vA < vB ? 1 : 0;
2421    });
2422    parent.append(items);
2423  }
2424
2425  renderTicketSelectorAction() {
2426    let self = this;
2427    this.JBlankSeatsMap().hide();
2428    this.JPriceMapSeats().show();
2429    this.JPriceMapSeats().html('');
2430
2431    if (this.JZoneImage().length > 0) {
2432      let zimage = this.JZoneImage().clone();
2433      zimage.removeClass('is_first');
2434      zimage.show();
2435      this.JPriceMapSeats().append(zimage);
2436    }
2437
2438    let selectedPriceLevelIds = self.getPriceLevelIds();
2439    let priceBlocksAll;
2440
2441    if (this.JZoneImage().length > 0) {
2442      priceBlocksAll = self.getPriceBlocksAndUsedBlocksZones();
2443    } else {
2444      priceBlocksAll = self.getPriceBlocksAndUsedBlocksAttraction();
2445    }
2446
2447    let priceBlocksArr = priceBlocksAll['priceBlock'];
2448    let priceBlocks = self.objectToArray(priceBlocksArr);
2449    priceBlocks.sort(self.comparePriceBlocks);
2450    let usedBlocks = priceBlocksAll['useBlock'];
2451    let nBlocks = [];
2452
2453    for (const keySeats in self.eventSections) {
2454      if (selectedPriceLevelIds !== false) {
2455        let isCat = false;
2456
2457        for (const i in selectedPriceLevelIds) {
2458          if (self.eventSections[keySeats]['priceLevelID'] === selectedPriceLevelIds[i]) {
2459            isCat = true;
2460            break;
2461          }
2462        }
2463
2464        if (isCat) {
2465          let maxt = parseInt(self.eventSections[keySeats]['availableQuantity']) + 1;
2466          let mint = 0;
2467
2468          if (typeof self.eventSections[keySeats]['minTickets'] !== 'undefined') {
2469            mint = parseInt(self.eventSections[keySeats]['minTickets']) - 1;
2470          }
2471
2472          if (typeof self.eventSections[keySeats]['maxTickets'] !== 'undefined') {
2473            if (parseInt(self.eventSections[keySeats]['maxTickets']) + 1 < maxt) {
2474              maxt = parseInt(self.eventSections[keySeats]['maxTickets']) + 1;
2475            }
2476          }
2477
2478          if (maxt > 0) {
2479            let priceLeveId = self.eventSections[keySeats]['priceLevelID'];
2480
2481            if (this.JZoneImage().length === 0) {
2482              if (self.inArray(nBlocks, priceLeveId)) {
2483                continue;
2484              }
2485
2486              nBlocks.push(priceLeveId);
2487            }
2488
2489            for (const j in priceBlocks) {
2490              const key = priceBlocks[j][0];
2491
2492              if (priceBlocksArr[key]['priceLevelId'] === priceLeveId) {
2493                if (!Array.isArray(usedBlocks[priceLeveId]['promo'])) {
2494                  let p = JSON.parse(JSON.stringify(usedBlocks[priceLeveId]['promo']));
2495                  usedBlocks[priceLeveId]['promo'][key] = p;
2496                }
2497
2498                for (const p1 in usedBlocks[priceLeveId]['promo']) {
2499                  if (p1 === key || this.JZoneImage().length > 0 || this.JIsRedeam()) {
2500                    let title = priceBlocksArr[key]['attraction_title_price'];
2501                    let desc = priceBlocksArr[key]['attraction_desc_price'];
2502                    let hasNameWeight = priceBlocksArr[key]['attraction_has_nw'];
2503                    let pickupLocations = priceBlocksArr[key]['attraction_pickup_loc'];
2504                    let pickupLocationsNonApi = priceBlocksArr[key]['attraction_pickupl'];
2505                    let iPrice = '$' + parseFloat(priceBlocksArr[key]['fullRetailPrice']).toFixed(2);
2506                    let reqev = priceBlocksArr[key]['require_even_number'];
2507                    let promoCode = usedBlocks[priceLeveId]['promo'][p1]['promotionCode'];
2508                    let dropdown = self.createDropDownAttraction(mint, maxt, reqev, promoCode, priceLeveId);
2509                    let bigpricecut = '';
2510
2511                    if (promoCode.indexOf('ADULT') === -1 && promoCode.indexOf('CHILD') === -1) {
2512                      if (typeof usedBlocks[priceLeveId]['promo'][p1]['priceBlocks'][priceLeveId].bigPrice !== 'undefined' && usedBlocks[priceLeveId]['promo'][p1]['priceBlocks'][priceLeveId]['fullRetailPrice'] !== usedBlocks[priceLeveId]['promo'][p1]['priceBlocks'][priceLeveId].bigPrice) {
2513                        bigpricecut = '<span class="bigpricecut">' + parseFloat(usedBlocks[priceLeveId]['promo'][p1]['priceBlocks'][priceLeveId].bigPrice).toFixed(2) + '</span>';
2514                      }
2515                    }
2516
2517                    if (usedBlocks[priceLeveId]['promo'][p1]['priceBlocks'][priceLeveId].mustlogin && typeof usedBlocks[priceLeveId]['promo'][p1]['priceBlocks'][priceLeveId].smallPrice !== 'undefined' && usedBlocks[priceLeveId]['promo'][p1]['priceBlocks'][priceLeveId]['fullRetailPrice'] !== usedBlocks[priceLeveId]['promo'][p1]['priceBlocks'][priceLeveId].smallPrice) {
2518                      jQuery('#price_login_signup').show();
2519                    }
2520
2521                    let hasnw = '';
2522
2523                    if (hasNameWeight) {
2524                      hasnw = ' hasnw';
2525                    }
2526
2527                    let haspp = '';
2528                    let withDescDiv = '<div class="attraction_box wdesc"><div class="attraction_box_title_price"><div class="attraction_box_title">' + title + '</div><div class="attraction_box_price">' + iPrice + bigpricecut + '</div></div><div class="attraction_box_desc_dropdown"><div class="attraction_box_desc">' + desc + '</div><div class="attraction_box_dropdown' + hasnw + '">' + dropdown + '</div></div></div>';
2529                    let withoutDescDiv = '<div class="attraction_box"><div class="attraction_box_title_price"><div class="attraction_box_title">' + title + '</div></div><div class="attraction_box_price_dropdown"><div class="attraction_box_price">' + iPrice + bigpricecut + '</div><div class="attraction_box_dropdown' + hasnw + '">' + dropdown + '</div></div></div>';
2530
2531                    if (desc !== '') {
2532                      this.JPriceMapSeats().append(jQuery(withDescDiv));
2533                    } else {
2534                      this.JPriceMapSeats().append(jQuery(withoutDescDiv));
2535                    }
2536
2537                    if (pickupLocations && pickupLocations.length > 1) {
2538                      let pickuploc = '<div class="pikkloc">Select pickup location: <select name="pickuploc" class="attraction_pickuploc">'; //pickuploc += '<option value="' + 0 + '">' + 0 + '</option>';
2539
2540                      for (const i in pickupLocations) {
2541                        pickuploc += '<option value="' + pickupLocations[i]['hotelLocationId'] + '">' + pickupLocations[i]['locationName'] + '</option>';
2542                      }
2543
2544                      pickuploc += '</select></div>';
2545                      this.JPriceMapSeats().append(pickuploc);
2546                      jQuery('.pikkloc').hide();
2547                    }
2548
2549                    if (pickupLocationsNonApi && pickupLocationsNonApi.length > 1) {
2550                      let pickuploc = '<div class="pikkloc">Select pickup location: <select name="pickuploc" class="attraction_pickuploc">'; //pickuploc += '<option value="' + 0 + '">' + 0 + '</option>';
2551
2552                      for (const i in pickupLocationsNonApi) {
2553                        pickuploc += '<option value="' + i + '">' + pickupLocationsNonApi[i] + '</option>';
2554                      }
2555
2556                      pickuploc += '</select></div>';
2557                      this.JPriceMapSeats().append(pickuploc);
2558                      jQuery('.pikkloc').hide();
2559                    }
2560
2561                    break;
2562                  }
2563                }
2564              }
2565            }
2566          } //seat_labels_categories[self.eventSections[keySeats]['key']] = "" + self.eventSections[keySeats]['priceLevelID'];//self.selectedPromoCode['priceBlocks'][self.eventSeats[keySeats]['priceLevelId']]['priceLevelName'];
2567          //object_categories[self.eventSections[keySeats]['key']] = self.eventSections[keySeats]['availableQuantity'];
2568          //self.usedPriceLevelIds.push(self.eventSections[keySeats]['priceLevelID']);
2569
2570        }
2571      }
2572    }
2573
2574    self.sortUsingNestedText(jQuery('#price_map_seats'), '.attraction_box', '.attraction_box_price');
2575    self.JTicketsButtonsCart().html('');
2576    self.JTicketsButtonsCart().parent().find('.best_price_guaranteed').remove();
2577
2578    if (self.JIsAttraction() || self.JZoneImage().length > 0) {
2579      if (!self.isMobile()) {
2580        self.JTicketsButtonsCart().append(jQuery('<div class="best_price_guaranteed"> <span class="slv slv-check-circle"></span><span class="bb_link_product_text">Best price guaranteed</span> </div>'));
2581      } else {
2582        self.JTicketsButtonsCart().parent().append(jQuery('<div class="best_price_guaranteed"> <span class="slv slv-check-circle"></span><span class="bb_link_product_text">Best price guaranteed</span> </div>'));
2583      }
2584    }
2585
2586    self.JTicketsButtonsCart().append(jQuery('<a href="#0" class="saddcart">
2586Add To Cart</a>')).append(jQuery('<a href="#0" class="sbuynow">Buy Now</a>')); //.append(jQuery('<a href="#0" class="button btn sadd_to_cart_btn">Add To Cart</a>'))
2587
2588    this.JBuyButton().off('click').on('click', jQuery.proxy(this.buyNowActionA, this));
2589    this.JAddToCartButton().off('click').on('click', jQuery.proxy(this.addToCartActionA, this));
2590    jQuery('.attraction_box_dropdown select').off('change').on('change', function () {
2591      let hasBig = false;
2592      let sVal = 0;
2593      jQuery('.attraction_box_dropdown select').each(function () {
2594        if (parseInt(jQuery(this).val()) > 0) {
2595          hasBig = true;
2596          sVal = parseInt(jQuery(this).val());
2597        }
2598      });
2599      jQuery('.nwdata').remove();
2600
2601      if (hasBig) {
2602        if (jQuery(this).parent().hasClass('hasnw')) {
2603          self.JPriceMapSeats().append(jQuery('<div class="nwdata"></div>'));
2604
2605          if (jQuery('.pikkloc').length > 0) {
2606            jQuery('.pikkloc').show();
2607            jQuery('.pikkloc').appendTo(self.JPriceMapSeats().find('.nwdata'));
2608          }
2609
2610          for (let i1 = 0; i1 < sVal; i1++) {
2611            self.JPriceMapSeats().find('.nwdata').append(jQuery('<div class="bdwlh">Guest ' + (i1 + 1) + ' Details</div>'));
2612            self.JPriceMapSeats().find('.nwdata').append(jQuery('<div class="bdwl bdwl' + i1 + '"></div>'));
2613            let vv = ".nwdata .bdwl" + i1;
2614            self.JPriceMapSeats().find(vv).append(jQuery('<div class="bwdli"> <label class="nwcbb">First Name:</label> <input name="fname[]" class="nwcbb bbfname" type="text"></div>'));
2615            self.JPriceMapSeats().find(vv).append(jQuery('<div class="bwdli"> <label class="nwcbb">Last Name:</label> <input name="lname[]" class="nwcbb bblname" type="text"></div>'));
2616            self.JPriceMapSeats().find(vv).append(jQuery('<div class="bwdli"> <label class="nwcbb">Weight:</label> <input name="weight[]" class="nwcbb bbweight" type="number"> <span class="bbwlb">LB</span></div>'));
2617          }
2618        } else {
2619          if (jQuery('.pikkloc').length > 0 && !self.JPriceMapSeats().data('pikkloc')) {
2620            jQuery('.pikkloc').first().show();
2621            jQuery('.pikkloc').first().appendTo(self.JPriceMapSeats());
2622            self.JPriceMapSeats().data('pikkloc', 1);
2623          }
2624        }
2625
2626        jQuery('.tickets_cart').insertAfter(self.JPriceMapSeats());
2627        self.JTicketsCart().show();
2628        self.JTicketsButtonsCart().show();
2629
2630        if (!self.JTicketsButtonsCart().hasClass('tb_attraction')) {
2631          self.JTicketsButtonsCart().addClass('tb_attraction');
2632        }
2633
2634        jQuery('.rwb_is_attraction').animate({
2635          scrollTop: 0
2636        }, 'slow');
2637      } else {
2638        self.JTicketsCart().hide();
2639        self.JTicketsButtonsCart().hide();
2640      }
2641    });
2642  }
2643
2644  dateChanged(selectedDates, dateStr, instance) {
2645    let self = this;
2646    let eventTimes = this.eventList[dateStr]['event_times'];
2647    let eventIds = this.eventList[dateStr]['id'];
2648    /*if (this.JEventsPerDate().flickity().length) {
2649        this.JEventsPerDate().flickity('destroy');
2650    }*/
2651
2652    self.createDestroySeatChart();
2653    this.JTicketsCart().hide();
2654    this.JEventsPerDate().html('');
2655    this.JEventsPerDateBeforeText().find('.number_of_tickets_text').html('');
2656    this.JEventsPerDate().show();
2657    this.JEventSelection().show();
2658    this.JEventsPerDateBeforeText().show();
2659
2660    if (eventTimes.length > 0) {
2661      this.JEventsPerDateBeforeText().prepend('<div class="number_of_tickets_text">Select Time:</div>');
2662    }
2663
2664    let p = 0;
2665    const c = 1;
2666
2667    for (const i in eventTimes) {
2668      this.JEventsPerDate().append(this.JTimeElem(eventIds[i], eventTimes[i], dateStr, i)); //this.JEventsPerDate().append(this.JTimeElem(eventIds[i], eventTimes[i], dateStr, i));
2669
2670      p += c; //this.JEventsPerDate().append(this.JTimeElem(eventIds[i], eventTimes[i], dateStr, i));
2671    }
2672
2673    if (self.JIsAttraction() && p > 1) {
2674      /*this.JEventsPerDate().flickity({
2675          // options
2676          cellAlign: 'left',
2677          contain: true,
2678          groupCells: 1,
2679          cellSelector: '.time_elem',
2680          //wrapAround: true,
2681          freeScroll: true,
2682          draggable: true,
2683          pageDots: false
2684      });*/
2685    }
2686
2687    seamless.elementScrollIntoView(document.querySelector('.event_selection_ticket'), {
2688      behavior: 'smooth',
2689      inline: 'center',
2690      block: 'center'
2691    });
2692    self.scrollWindow();
2693    jQuery('.time_elem').on('click', function () {
2694      self.selectedEventId = jQuery(this).attr('event_id');
2695      self.selectedeventPromotionsIds = self.eventList[jQuery(this).attr('event_date')]['event_promotions'][parseInt(j
2695Query(this).attr('ev_pos'))];
2696      let eviHour;
2697      eviHour = jQuery(this).attr('event_hour');
2698
2699      if (jQuery('.time_elem').length === 1 && self.JIsAttraction()) {
2700        eviHour = 'none';
2701      }
2702
2703      self.selectedEventData = {
2704        'event_date': jQuery(this).attr('event_date'),
2705        'event_location': jQuery('.show_location').html(),
2706        'event_time': eviHour
2707      };
2708      jQuery('.time_elem').removeClass('time_elem_active');
2709      jQuery(this).addClass('time_elem_active');
2710
2711      if (jQuery('.time_elem').length === 1) {
2712        seamless.elementScrollIntoView(document.querySelector('.event_selection_ticket'), {
2713          behavior: 'smooth',
2714          inline: 'center',
2715          block: 'center'
2716        });
2717      } else {
2718        seamless.elementScrollIntoView(document.querySelector('.bpsm_wrapper'), {
2719          behavior: 'smooth',
2720          inline: 'center',
2721          block: 'center'
2722        });
2723      }
2724
2725      self.scrollWindow();
2726
2727      if (self.JIsAttraction() || self.JZoneImage().length > 0) {
2728        self.renderTicketSelector(self.selectedEventId);
2729      } else {
2730        self.renderSeatChart(self.selectedEventId);
2731      }
2732    });
2733    let def_ev = self.getParameterByName('def_ev') || self.getParameterByName('event_id');
2734
2735    if (def_ev !== null && def_ev !== '') {
2736      jQuery('.time_elem[event_id="' + def_ev + '"]').trigger('click');
2737    } else {
2738      if ((self.JIsAttraction() || self.JZoneImage().length > 0) && p === 1) {
2739        jQuery('.time_elem').trigger('click');
2740        jQuery('.event_selection_ticket:not(.riszone)').hide();
2741      }
2742
2743      if (!self.JIsAttraction() && p === 1) {
2744        jQuery('.time_elem').trigger('click');
2745      }
2746    }
2747  }
2748
2749  updatePageDesign(data) {
2750    //jQuery('.show_image_tickets').html(data.seat_image);
2751    //jQuery('.show_description_tickets').html(data.seat_text);
2752    //jQuery('.flat_calendar').html('<input type="text" name="flat_calendar" id="flat_calendar" style="display:none">');
2753    //jQuery('.show_btn_tickets').html('<a href="' + data.event_url + '" class="button btn">' + data.event_url_text + '</a>');
2754    this.firstDateWithEvent = false;
2755    let self = this;
2756    let today = Date.now();
2757    today = today + new Date().getTimezoneOffset() * 60 * 1000 - today % (3600 * 1000 * 24);
2758    let minTime = 10000000000000000000000000000; //today.setTime(today.getTime() + today.getTimezoneInMiliseconds(today));
2759
2760    for (const key in this.eventList) {
2761      let start_date = self.packStartDate();
2762      let end_date = self.packEndDate();
2763      let cDate = self.createDateAsUTC(new Date(key.replace(/-/g, "/") + " 00:00:00"));
2764      cDate.setTime(cDate.getTime() + self.getTimezoneInMiliseconds(cDate));
2765
2766      if (self.compare_asc(cDate.getTime(), today) >= 0 && minTime > cDate.getTime()) {
2767        if (start_date !== false && end_date !== false) {
2768          if (self.compare_asc(cDate.getTime(), start_date.getTime() + self.getTimezoneInMiliseconds(start_date)) >= 0 && self.compare_asc(cDate.getTime(), end_date.getTime() + self.getTimezoneInMiliseconds(end_date)) <= 0) {
2769            minTime = cDate.getTime();
2770            self.firstDateWithEvent = cDate; //break;
2771          }
2772        } else {
2773          minTime = cDate.getTime();
2774          self.firstDateWithEvent = cDate; //break;
2775        }
2776      }
2777    }
2778
2779    this.createCalendar();
2780
2781    if (self.isPack()) {
2782      jQuery('.bpackseats').show();
2783    }
2784
2785    let def_date = self.getParameterByName('def_date') || self.getParameterByName('start_date');
2786
2787    if (def_date !== null && def_date !== '') {
2788      this.calendar.setDate(def_date, true);
2789    }
2790  }
2791
2792  renderEventsCompleted(response) {
2793    if (response.success === true) {
2794      jQuery('body').LoadingOverlay("hide");
2795      this.eventList = response.events;
2796      this.updatePageDesign(response);
2797    } else {
2798      __WEBPACK_IMPORTED_MODULE_1_sweetalert2_dist_sweetalert2_js___default.a.fire({
2799        title: 'Error!',
2800        text: 'There was an error rendering the events. The page will now refresh',
2801        icon: 'error',
2802        confirmButtonText: 'OK',
2803        closeOnConfirm: true
2804      }).then(result => {
2805        /* Read more about isConfirmed, isDenied below */
2806        if (result.isConfirmed) {
2807          window.location.href = window.location.href;
2808        } else if (result.isDenied) {//Swal.fire('Changes are not saved', '', 'info')
2809        }
2810      });
2811    }
2812  }
2813
2814  initSeatsMap() {
2815    this.renderEvents();
2816  }
2817
2818  buyTicketsAction() {
2819    this.JBuyTickets().attr('href', jQuery('#url_seats').attr('url'));
2820  }
2821
2822  hideQtyAddToCart() {
2823    this.JForm().find('.single_add_to_cart_button ').hide();
2824    this.JForm().find('.single_add_to_cart_button ').prev().hide();
2825  }
2826  /*[
2827          {
2828              'category': 'red', 'ticketTypes': [
2829                  {
2830                      'ticketType': 'adult',
2831                      'price': 30,
2832                      'label': 'For adults',
2833                      'description': 'Includes hot meal and a drink'
2834                  },
2835                  {
2836                      'ticketType': 'child',
2837                      'price': 20,
2838                      'label': 'For children',
2839                      'description': 'Includes burger and fries'
2840                  }
2841              ]
2842          }
2843      ]
2844          [
2845          {key: 'red', color: 'red', label: 'Category 1', accessible: true},
2846              {key: 'blue', color: 'blue', label: 'Category 2'}
2847          ]
2848          ['red']
2849          */
2850
2851  /*
2852  {
2853             '101-A-1': 'red',
2854             '101-A-2': 'red',
2855         }
2856  */
2857
2858
2859  opacityToHex(hexCode) {//return hexCode + '4D';
2860  }
2861
2862  codeArray() {
2863    return [
2864
2865      '#6495ED', '#DE3163', '#FFBF00', '#680093', '#9FE2BF', '#FF7F50', '#CCCCFF', '#ffb6c1',
2866      '#fa8072', '#800080', '#20b2aa', '#088da5', '#e68abc', '#bf4974', '#f821f6', '#e2de82',
2867
2868      '#e6194b', '#3cb44b', '#ffe119', '#4363d8', '#f58231', '#911eb4', '#46f0f0', '#f032e6',
2869      '#bcf60c', '#fabebe', '#008080', '#e6beff', '#9a6324', '#fffac8', '#800000', '#aaffc3',
2870      '#808000', '#ffd8b1', '#000075', '#808080', '#000000', '#1abc9c', '#2ecc71', '#3498db',
2871      '#9b59b6', '#34495e', '#16a085', '#27ae60', '#2980b9', '#8e44ad', '#2c3e50', '#f1c40f',
2872      '#e67e22', '#e74c3c', '#ecf0f1', '#95a5a6', '#f39c12', '#d35400', '#c0392b', '#bdc3c7',
2873      '#7f8c8d', '#ff9ff3', '#feca57', '#ff6b6b', '#48dbfb', '#1dd1a1', '#5f27cd', '#54a0ff',
2874      '#00d2d3', '#01a3a4', '#00b894', '#00cec9', '#0984e3', '#6c5ce7', '#fdcb6e', '#e17055',
2875      '#d63031', '#e84393', '#2d3436', '#74b9ff', '#a29bfe', '#81ecec', '#55efc4', '#ffeaa7',
2876      '#fab1a0', '#ff7675', '#fd79a8', '#636e72', '#833471', '#ff3838', '#ffb8b8', '#ff9f1a',
2877      '#fffa65', '#32ff7e', '#7efff5', '#18dcff', '#7d5fff', '#7158e2', '#3ae374', '#f7f1e3',
2878      '#c4e538', '#12cbc4', '#5758bb', '#1289a7', '#b53471', '#833471', '#009432', '#006266',
2879      '#1e3799', '#6a89cc', '#4a69bd', '#82ccdd', '#60a3bc', '#78e08f', '#38ada9', '#079992'
2880    ];
2881  }
2882
2883  getPricingCategoriesAndCategoriesLabelsAndUnavailableCategoriesAndSeatLabelsCategoriesAzure() {
2884    let categories = [];
2885    let self = this;
2886    self.usedPriceLevelIds = [];
2887    categories['unavailable_categories'] = []; //categories['available_categories'] = [];
2888
2889    categories['categories_labels'] = [];
2890    categories['seat_labels_categories'] = [];
2891    categories['pricing_categories'] = [];
2892    let selectedPriceLevelIds = false;
2893    let selectedHoldSubclassId = false;
2894    let selectedTagsId = false;
2895
2896    if (self.selectedPromoCode !== false) {
2897      const type = self.selectedPromoCode['limitType'];
2898
2899      if (type === 'PriceLevel') {
2900        selectedPriceLevelIds = self.selectedPromoCode['priceLevelIds'];
2901      }
2902
2903      if (type === 'Hold') {
2904        selectedHoldSubclassId = self.selectedPromoCode['holdSubclassId'];
2905      }
2906
2907      if (type === 'Tag') {
2908        selectedTagsId = self.selectedPromoCode['tagIds'];
2909      }
2910    } else {
2911      selectedPriceLevelIds = self.getPriceLevelIds();
2912      selectedHoldSubclassId = self.getSubholdIds();
2913      selectedTagsId = self.getTagIds();
2914    }
2915
2916    let categories_pricing = [];
2917    let categories_labels = [];
2918    self.ticketTypeAll = false;
2919    let ticketTypes = [];
2920    let selectedPromoCodeElementAndUsedBlocks = self.getPriceBlocksAndUsedBlocks();
2921    let selectedPromoCodeElement = selectedPromoCodeElementAndUsedBlocks.priceBlock;
2922    self.usedBlocks = selectedPromoCodeElementAndUsedBlocks.useBlock;
2923    let po = 0;
2924    let priceBlockArr = self.objectToArray(selectedPromoCodeElement); //if (!self.isPack()) {
2925
2926    priceBlockArr.sort(self.comparePriceBlocksPack); //} else {
2927    //priceBlockArr.sort(self.comparePriceBlocks);
2928    //}
2929
2930    let seat_labels_categories = [];
2931    let object_categories = [];
2932
2933    for (const keySeats in self.eventSeats) {
2934      if (selectedPriceLevelIds !== false) {
2935        let isCat = false;
2936
2937        for (const i in selectedPriceLevelIds) {
2938          if (self.eventSeats[keySeats]['priceLevelId'] === selectedPriceLevelIds[i]) {
2939            isCat = true;
2940            break;
2941          }
2942        }
2943
2944        if (isCat) {
2945          //seat_labels_categories[keySeats] = "" + self.eventSeats[keySeats]['priceLevelId'];//self.selectedPromoCode['priceBlocks'][self.eventSeats[keySeats]['priceLevelId']]['priceLevelName'];
2946          seat_labels_categories.push({
2947            id: keySeats,
2948            categoryId: "" + self.eventSeats[keySeats]['priceLevelId'],
2949            label: keySeats,
2950            statusId: 'active',
2951            disability: false,
2952            alert: '',
2953            ga: {
2954              max: 0,
2955              current: 0
2956            }
2957          });
2958          self.usedPriceLevelIds.push(self.eventSeats[keySeats]['priceLevelId']);
2959        } else {}
2960      }
2961
2962      if (selectedTagsId !== false) {
2963        let isCat = false;
2964
2965        for (const i in selectedTagsId) {
2966          if (self.eventSeats[keySeats]['tagId'] === selectedTagsId[i]) {
2967            isCat = true;
2968            break;
2969          }
2970        }
2971
2972        if (isCat) {
2973          //seat_labels_categories[keySeats] = "" + self.eventSeats[keySeats]['priceLevelId'];//self.selectedPromoCode['priceBlocks'][self.eventSeats[keySeats]['priceLevelId']]['priceLevelName'];
2974          seat_labels_categories.push({
2975            id: keySeats,
2976            categoryId: "" + self.eventSeats[keySeats]['priceLevelId'],
2977            label: keySeats,
2978            statusId: 'active',
2979            disability: false,
2980            alert: '',
2981            ga: {
2982              max: 0,
2983              current: 0
2984            }
2985          });
2986          self.usedPriceLevelIds.push(self.eventSeats[keySeats]['priceLevelId']);
2987        } else {}
2988      }
2989
2990      if (selectedHoldSubclassId !== false) {
2991        let isCat = false;
2992
2993        if (self.eventSeats[keySeats]['holdSubclassId'] === selectedHoldSubclassId) {
2994          isCat = true;
2995        }
2996
2997        if (isCat) {
2998          //seat_labels_categories[keySeats] = "" + self.eventSeats[keySeats]['priceLevelId'];//self.selectedPromoCode['priceBlocks'][self.eventSeats[keySeats]['priceLevelId']]['priceLevelName'];
2999          seat_labels_categories.push({
3000            id: keySeats,
3001            categoryId: "" + self.eventSeats[keySeats]['priceLevelId'],
3002            label: keySeats,
3003            statusId: 'active',
3004            disability: false,
3005            alert: '',
3006            ga: {
3007              max: 0,
3008              current: 0
3009            }
3010          });
3011          self.usedPriceLevelIds.push(self.eventSeats[keySeats]['priceLevelId']);
3012        } else {}
3013      }
3014    } //gaSections
3015
3016
3017    for (const keySeats in self.eventSections) {
3018      if (selectedPriceLevelIds !== false) {
3019        let isCat = false;
3020
3021        for (const i in selectedPriceLevelIds) {
3022          if (self.eventSections[keySeats]['priceLevelID'] === selectedPriceLevelIds[i]) {
3023            isCat = true;
3024            break;
3025          }
3026        }
3027
3028        if (isCat) {
3029          //seat_labels_categories[self.eventSections[keySeats]['key']] = "" + self.eventSections[keySeats]['priceLevelID'];//self.selectedPromoCode['priceBlocks'][self.eventSeats[keySeats]['priceLevelId']]['priceLevelName'];
3030          seat_labels_categories.push({
3031            id: self.eventSections[keySeats]['key'],
3032            categoryId: "" + self.eventSections[keySeats]['priceLevelID'],
3033            label: self.eventSections[keySeats]['key'],
3034            statusId: 'active',
3035            disability: false,
3036            alert: '',
3037            ga: {
3038              max: self.eventSections[keySeats]['availableQuantity'],
3039              current: 0
3040            }
3041          });
3042          object_categories[self.eventSections[keySeats]['key']] = self.eventSections[keySeats]['availableQuantity'];
3043          self.usedPriceLevelIds.push(self.eventSections[keySeats]['priceLevelID']);
3044        } else {}
3045      }
3046
3047      if (selectedTagsId !== false) {
3048        let isCat = false;
3049
3050        for (const i in selectedTagsId) {
3051          if (self.eventSections[keySeats]['tagId'] === selectedTagsId[i]) {
3052            isCat = true;
3053            break;
3054          }
3055        }
3056
3057        if (isCat) {
3058          //seat_labels_categories[self.eventSections[keySeats]['key']] = "" + self.eventSections[keySeats]['priceLevelID'];//self.selectedPromoCode['priceBlocks'][self.eventSections[keySeats]['priceLevelId']]['priceLevelName'];
3059          seat_labels_categories.push({
3060            id: self.eventSections[keySeats]['key'],
3061            categoryId: "" + self.eventSections[keySeats]['priceLevelID'],
3062            label: self.eventSections[keySeats]['key'],
3063            statusId: 'active',
3064            disability: false,
3065            alert: '',
3066            ga: {
3067              max: self.eventSections[keySeats]['availableQuantity'],
3068              current: 0
3069            }
3070          });
3071          object_categories[self.eventSections[keySeats]['key']] = self.eventSections[keySeats]['availableQuantity'];
3072          self.usedPriceLevelIds.push(self.eventSections[keySeats]['priceLevelID']);
3073        } else {}
3074      }
3075
3076      if (selectedHoldSubclassId !== false) {
3077        let isCat = false;
3078
3079        if (self.eventSections[keySeats]['holdSubclassId'] === selectedHoldSubclassId) {
3080          isCat = true;
3081        }
3082
3083        if (isCat) {
3084          //seat_labels_categories[self.eventSections[keySeats]['key']] = "" + self.eventSections[keySeats]['priceLevelID'];//self.selectedPromoCode['priceBlocks'][self.eventSections[keySeats]['priceLevelId']]['priceLevelName'];
3085          seat_labels_categories.push({
3086            id: self.eventSections[keySeats]['key'],
3087            categoryId: "" + self.eventSections[keySeats]['priceLevelID'],
3088            label: self.eventSections[keySeats]['key'],
3089            statusId: 'active',
3090            disability: false,
3091            alert: '',
3092            ga: {
3093              max: self.eventSections[keySeats]['availableQuantity'],
3094              current: 0
3095            }
3096          });
3097          object_categories[self.eventSections[keySeats]['key']] = self.eventSections[keySeats]['availableQuantity'];
3098          self.usedPriceLevelIds.push(self.eventSections[keySeats]['priceLevelID']);
3099        } else {}
3100      }
3101    }
3102
3103    for (let i1 = 0; i1 < priceBlockArr.length; i1++) {
3104      const keyPrice = priceBlockArr[i1][0]; //const value = priceBlockArr[i1][1];
3105
3106      if (self.usedPriceLevelIds !== false && self.inArray(self.usedPriceLevelIds, selectedPromoCodeElement[keyPrice]['priceLevelId'])) {
3107        let ticketType = [];
3108
3109        if (typeof ticketTypes[selectedPromoCodeElement[keyPrice]['priceLevelId']] !== 'undefined') {
3110          ticketType = ticketTypes[selectedPromoCodeElement[keyPrice]['priceLevelId']];
3111        }
3112
3113        let ticketTypeSingular = {};
3114        ticketTypeSingular['ticketType'] = selectedPromoCodeElement[keyPrice]['priceTypeName'];
3115        ticketTypeSingular['label'] = selectedPromoCodeElement[keyPrice]['priceTypeName'];
3116        ticketTypeSingular['price'] = selectedPromoCodeElement[keyPrice]['fullRetailPrice'];
3117        ticketType.push(ticketTypeSingular);
3118        ticketTypes[selectedPromoCodeElement[keyPrice]['priceLevelId']] = ticketType;
3119      }
3120    }
3121
3122    for (let i1 = 0; i1 < priceBlockArr.length; i1++) {
3123      const keyPrice = priceBlockArr[i1][0]; //const value = priceBlockArr[i1][1];
3124
3125      if (self.usedPriceLevelIds !== false && self.inArray(self.usedPriceLevelIds, selectedPromoCodeElement[keyPrice]['priceLevelId'])) {
3126        let category_pricing = {};
3127
3128        if (typeof ticketTypes[selectedPromoCodeElement[keyPrice]['priceLevelId']] !== 'undefined' && ticketTypes[selectedPromoCodeElement[keyPrice]['priceLevelId']].length > 1) {
3129          category_pricing['categoryId'] = "" + selectedPromoCodeElement[keyPrice]['priceLevelId'];
3130          category_pricing['ticketTypes'] = ticketTypes[selectedPromoCodeElement[keyPrice]['priceLevelId']];
3131        } else if (typeof ticketTypes[selectedPromoCodeElement[keyPrice]['priceLevelId']] !== 'undefined' && ticketTypes[selectedPromoCodeElement[keyPrice]['priceLevelId']].length === 1) {
3132          //let ticketTypeSingular = {};
3133          self.ticketTypeAll = ticketTypes[selectedPromoCodeElement[keyPrice]['priceLevelId']][0]['ticketType'];
3134          category_pricing['name'] = ticketTypes[selectedPromoCodeElement[keyPrice]['priceLevelId']][0]['label'];
3135          category_pricing['price'] = ticketTypes[selectedPromoCodeElement[keyPrice]['priceLevelId']][0]['price'];
3136          category_pricing['categoryId'] = "" + selectedPromoCodeElement[keyPrice]['priceLevelId']; //category_pricing['category'] = ticketTypeSingular;
3137        }
3138
3139        categories_pricing.push(category_pricing);
3140        let category_label = {};
3141        category_label['categoryId'] = "" + selectedPromoCodeElement[keyPrice]['priceLevelId']; //create a new cat based on adaTypes
3142
3143        category_label['color'] = "" + self.codeArray()[po];
3144        category_label['name'] = "" + selectedPromoCodeElement[keyPrice]['priceLevelName'];
3145        category_label['status'] = 'active';
3146        categories_labels.push(category_label); //categories['available_categories'].push(category_label['key']);
3147
3148        let category_label_not = {};
3149        category_label_not['key'] = "not_available" + selectedPromoCodeElement[keyPrice]['priceLevelId']; //create a new cat based on adaTypes
3150
3151        category_label_not['color'] = "" + self.convertHex(self.codeArray()[po], 32);
3152        category_label_not['label'] = "Not Available";
3153        categories['unavailable_categories'].push(category_label_not['key']); //categories_labels.push(category_label_not);
3154
3155        po++;
3156      }
3157    }
3158
3159    categories['seat_labels_categories'] = seat_labels_categories;
3160    self.eventSectionsCapacity = object_categories;
3161    categories['object_categories'] = object_categories;
3162    categories['pricing_categories'] = categories_pricing;
3163    categories['categories_labels'] = categories_labels;
3164    return categories;
3165  }
3166
3167  getPricingCategoriesAndCategoriesLabelsAndUnavailableCategoriesAndSeatLabelsCategories() {
3168    let categories = [];
3169    let self = this;
3170    self.usedPriceLevelIds = [];
3171    categories['unavailable_categories'] = []; //categories['available_categories'] = [];
3172
3173    categories['categories_labels'] = [];
3174    categories['seat_labels_categories'] = {};
3175    categories['pricing_categories'] = [];
3176    let selectedPriceLevelIds = false;
3177    let selectedHoldSubclassId = false;
3178    let selectedTagsId = false;
3179
3180    if (self.selectedPromoCode !== false) {
3181      const type = self.selectedPromoCode['limitType'];
3182
3183      if (type === 'PriceLevel') {
3184        selectedPriceLevelIds = self.selectedPromoCode['priceLevelIds'];
3185      }
3186
3187      if (type === 'Hold') {
3188        selectedHoldSubclassId = self.selectedPromoCode['holdSubclassId'];
3189      }
3190
3191      if (type === 'Tag') {
3192        selectedTagsId = self.selectedPromoCode['tagIds'];
3193      }
3194    } else {
3195      selectedPriceLevelIds = self.getPriceLevelIds();
3196      selectedHoldSubclassId = self.getSubholdIds();
3197      selectedTagsId = self.getTagIds();
3198    }
3199
3200    let categories_pricing = [];
3201    let categories_labels = [];
3202    self.ticketTypeAll = false;
3203    let ticketTypes = [];
3204    let selectedPromoCodeElementAndUsedBlocks = self.getPriceBlocksAndUsedBlocks();
3205    let selectedPromoCodeElement = selectedPromoCodeElementAndUsedBlocks.priceBlock;
3206    self.usedBlocks = selectedPromoCodeElementAndUsedBlocks.useBlock;
3207    let po = 0;
3208    let priceBlockArr = self.objectToArray(selectedPromoCodeElement); //if (!self.isPack()) {
3209
3210    priceBlockArr.sort(self.comparePriceBlocksPack); //} else {
3211    //priceBlockArr.sort(self.comparePriceBlocks);
3212    //}
3213
3214    let seat_labels_categories = {};
3215    let object_categories = [];
3216
3217    for (const keySeats in self.eventSeats) {
3218      if (selectedPriceLevelIds !== false) {
3219        let isCat = false;
3220
3221        for (const i in selectedPriceLevelIds) {
3222          if (self.eventSeats[keySeats]['priceLevelId'] === selectedPriceLevelIds[i]) {
3223            isCat = true;
3224            break;
3225          }
3226        }
3227
3228        if (isCat) {
3229          seat_labels_categories[keySeats] = "" + self.eventSeats[keySeats]['priceLevelId']; //self.selectedPromoCode['priceBlocks'][self.eventSeats[keySeats]['priceLevelId']]['priceLevelName'];
3230
3231          self.usedPriceLevelIds.push(self.eventSeats[keySeats]['priceLevelId']);
3232        } else {//seat_labels_categories[keySeats] = 'not_available' + self.eventSeats[keySeats]['priceLevelId'];
3233        }
3234      }
3235
3236      if (selectedTagsId !== false) {
3237        let isCat = false;
3238
3239        for (const i in selectedTagsId) {
3240          if (self.eventSeats[keySeats]['tagId'] === selectedTagsId[i]) {
3241            isCat = true;
3242            break;
3243          }
3244        }
3245
3246        if (isCat) {
3247          seat_labels_categories[keySeats] = "" + self.eventSeats[keySeats]['priceLevelId']; //self.selectedPromoCode['priceBlocks'][self.eventSeats[keySeats]['priceLevelId']]['priceLevelName'];
3248
3249          self.usedPriceLevelIds.push(self.eventSeats[keySeats]['priceLevelId']);
3250        } else {//seat_labels_categories[keySeats] = "not_available" + self.eventSeats[keySeats]['priceLevelId'];
3251        }
3252      }
3253
3254      if (selectedHoldSubclassId !== false) {
3255        let isCat = false;
3256
3257        if (self.eventSeats[keySeats]['holdSubclassId'] === selectedHoldSubclassId) {
3258          isCat = true;
3259        }
3260
3261        if (isCat) {
3262          seat_labels_categories[keySeats] = "" + self.eventSeats[keySeats]['priceLevelId']; //self.selectedPromoCode['priceBlocks'][self.eventSeats[keySeats]['priceLevelId']]['priceLevelName'];
3263
3264          self.usedPriceLevelIds.push(self.eventSeats[keySeats]['priceLevelId']);
3265        } else {//seat_labels_categories[keySeats] = "not_available" + self.eventSeats[keySeats]['priceLevelId'];
3266        }
3267      }
3268    } //gaSections
3269
3270
3271    for (const keySeats in self.eventSections) {
3272      if (selectedPriceLevelIds !== false) {
3273        let isCat = false;
3274
3275        for (const i in selectedPriceLevelIds) {
3276          if (self.eventSections[keySeats]['priceLevelID'] === selectedPriceLevelIds[i]) {
3277            isCat = true;
3278            break;
3279          }
3280        }
3281
3282        if (isCat) {
3283          seat_labels_categories[self.eventSections[keySeats]['key']] = "" + self.eventSections[keySeats]['priceLevelID']; //self.selectedPromoCode['priceBlocks'][self.eventSeats[keySeats]['priceLevelId']]['priceLevelName'];
3284
3285          object_categories[self.eventSections[keySeats]['key']] = self.eventSections[keySeats]['availableQuantity'];
3286          self.usedPriceLevelIds.push(self.eventSections[keySeats]['priceLevelID']);
3287        } else {//seat_labels_categories[keySeats] = 'not_available' + self.eventSections[keySeats]['priceLevelId'];
3288        }
3289      }
3290
3291      if (selectedTagsId !== false) {
3292        let isCat = false;
3293
3294        for (const i in selectedTagsId) {
3295          if (self.eventSections[keySeats]['tagId'] === selectedTagsId[i]) {
3296            isCat = true;
3297            break;
3298          }
3299        }
3300
3301        if (isCat) {
3302          seat_labels_categories[self.eventSections[keySeats]['key']] = "" + self.eventSections[keySeats]['priceLevelID']; //self.selectedPromoCode['priceBlocks'][self.eventSections[keySeats]['priceLevelId']]['priceLevelName'];
3303
3304          object_categories[self.eventSections[keySeats]['key']] = self.eventSections[keySeats]['availableQuantity'];
3305          self.usedPriceLevelIds.push(self.eventSections[keySeats]['priceLevelID']);
3306        } else {//seat_labels_categories[keySeats] = "not_available" + self.eventSections[keySeats]['priceLevelId'];
3307        }
3308      }
3309
3310      if (selectedHoldSubclassId !== false) {
3311        let isCat = false;
3312
3313        if (self.eventSections[keySeats]['holdSubclassId'] === selectedHoldSubclassId) {
3314          isCat = true;
3315        }
3316
3317        if (isCat) {
3318          seat_labels_categories[self.eventSections[keySeats]['key']] = "" + self.eventSections[keySeats]['priceLevelID']; //self.selectedPromoCode['priceBlocks'][self.eventSections[keySeats]['priceLevelId']]['priceLevelName'];
3319
3320          object_categories[self.eventSections[keySeats]['key']] = self.eventSections[keySeats]['availableQuantity'];
3321          self.usedPriceLevelIds.push(self.eventSections[keySeats]['priceLevelID']);
3322        } else {//seat_labels_categories[keySeats] = "not_available" + self.eventSections[keySeats]['priceLevelId'];
3323        }
3324      }
3325    }
3326
3327    for (let i1 = 0; i1 < priceBlockArr.length; i1++) {
3328      const keyPrice = priceBlockArr[i1][0]; //const value = priceBlockArr[i1][1];
3329
3330      if (self.usedPriceLevelIds !== false && self.inArray(self.usedPriceLevelIds, selectedPromoCodeElement[keyPrice]['priceLevelId'])) {
3331        let ticketType = [];
3332
3333        if (typeof ticketTypes[selectedPromoCodeElement[keyPrice]['priceLevelId']] !== 'undefined') {
3334          ticketType = ticketTypes[selectedPromoCodeElement[keyPrice]['priceLevelId']];
3335        }
3336
3337        let ticketTypeSingular = {};
3338        ticketTypeSingular['ticketType'] = selectedPromoCodeElement[keyPrice]['priceTypeName'];
3339        ticketTypeSingular['label'] = selectedPromoCodeElement[keyPrice]['priceTypeName'];
3340        ticketTypeSingular['price'] = selectedPromoCodeElement[keyPrice]['fullRetailPrice'];
3341        ticketType.push(ticketTypeSingular);
3342        ticketTypes[selectedPromoCodeElement[keyPrice]['priceLevelId']] = ticketType;
3343      }
3344    }
3345
3346    for (let i1 = 0; i1 < priceBlockArr.length; i1++) {
3347      const keyPrice = priceBlockArr[i1][0]; //const value = priceBlockArr[i1][1];
3348
3349      if (self.usedPriceLevelIds !== false && self.inArray(self.usedPriceLevelIds, selectedPromoCodeElement[keyPrice]['priceLevelId'])) {
3350        let category_pricing = {};
3351
3352        if (typeof ticketTypes[selectedPromoCodeElement[keyPrice]['priceLevelId']] !== 'undefined' && ticketTypes[selectedPromoCodeElement[keyPrice]['priceLevelId']].length > 1) {
3353          category_pricing['category'] = selectedPromoCodeElement[keyPrice]['priceLevelId'];
3354          category_pricing['ticketTypes'] = ticketTypes[selectedPromoCodeElement[keyPrice]['priceLevelId']];
3355        } else if (typeof ticketTypes[selectedPromoCodeElement[keyPrice]['priceLevelId']] !== 'undefined' && ticketTypes[selectedPromoCodeElement[keyPrice]['priceLevelId']].length === 1) {
3356          //let ticketTypeSingular = {};
3357          self.ticketTypeAll = ticketTypes[selectedPromoCodeElement[keyPrice]['priceLevelId']][0]['ticketType'];
3358          category_pricing['label'] = ticketTypes[selectedPromoCodeElement[keyPrice]['priceLevelId']][0]['label'];
3359          category_pricing['price'] = ticketTypes[selectedPromoCodeElement[keyPrice]['priceLevelId']][0]['price'];
3360          category_pricing['category'] = selectedPromoCodeElement[keyPrice]['priceLevelId']; //category_pricing['category'] = ticketTypeSingular;
3361        }
3362
3363        categories_pricing.push(category_pricing);
3364        let category_label = {};
3365        category_label['key'] = "" + selectedPromoCodeElement[keyPrice]['priceLevelId']; //create a new cat based on adaTypes
3366
3367        category_label['color'] = "" + self.codeArray()[po];
3368        category_label['label'] = "" + selectedPromoCodeElement[keyPrice]['priceLevelName'];
3369        categories_labels.push(category_label); //categories['available_categories'].push(category_label['key']);
3370
3371        let category_label_not = {};
3372        category_label_not['key'] = "not_available" + selectedPromoCodeElement[keyPrice]['priceLevelId']; //create a new cat based on adaTypes
3373
3374        category_label_not['color'] = "" + self.convertHex(self.codeArray()[po], 32);
3375        category_label_not['label'] = "Not Available";
3376        categories['unavailable_categories'].push(category_label_not['key']);
3377        categories_labels.push(category_label_not);
3378        po++;
3379      }
3380    }
3381
3382    categories['seat_labels_categories'] = seat_labels_categories;
3383    self.eventSectionsCapacity = object_categories;
3384    categories['object_categories'] = Object.assign({}, object_categories);
3385    categories['pricing_categories'] = categories_pricing;
3386    categories['categories_labels'] = categories_labels;
3387    return categories;
3388  }
3389
3390  createDestroySeatChart() {
3391    if (this.seatChart !== false) {
3392      this.clearCart();
3393
3394      if (typeof this.seatChart.destroy !== 'undefined') {
3395        this.seatChart.destroy();
3396      } else {
3397        jQuery('#seats_map').html('');
3398      }
3399
3400      this.JBuyButton().LoadingOverlay('hide');
3401      this.selectedObjectChart = null;
3402      this.selectedEvent = null;
3403    }
3404
3405    this.seatChart = false;
3406    this.JPriceMap().hide();
3407    this.JPriceMapSeats().hide();
3408    this.JPriceMapExplanation().hide();
3409    this.JBlankSeatsMap().show();
3410
3411    if (this.JTheme() === 'light') {
3412      this.JBlankSeatsMap().html('<img style="padding:80px;" src="/wp-content/themes/porto/images/no_selection_date_time_light.png"/><h4>Select a time</h4>');
3413    } else {
3414      this.JBlankSeatsMap().html('<h4>Select a time</h4><img style="padding:80px;" src="/wp-content/themes/porto/images/no_selection_date_time.png"/>');
3415    }
3416
3417    this.JTicketsSelectedCart().html('');
3418    this.JTicketsButtonsCart().hide();
3419    jQuery('.bproceed_tickets').hide();
3420  }
3421
3422  convertHex(hexCode, opacity) {
3423    var hex = hexCode.replace('#', '');
3424
3425    if (hex.length === 3) {
3426      hex = hex[0] + hex[0] + hex[1] + hex[1] + hex[2] + hex[2];
3427    }
3428
3429    var r = parseInt(hex.substring(0, 2), 16),
3430        g = parseInt(hex.substring(2, 4), 16),
3431        b = parseInt(hex.substring(4, 6), 16);
3432    return 'rgba(' + r + ',' + g + ',' + b + ',' + opacity / 100 + ')';
3433  }
3434  /**
3435   * Create a ASCII table based on a bi-dimensional array of strings
3436   * @param  {Array}   m                                   bi-dimensional array of strings
3437   * @param  {Object}  [options]                           Options object
3438   * @param  {Object}  [options.row]                       Row options
3439   * @param  {String}  [options.row.paddingLeft="|"]       String added before the first column
3440   * @param  {String}  [options.row.paddingRight="|"]      String added after the last column
3441   * @param  {String}  [options.row.colSeparator="|"]      String added between columns
3442   * @param  {String}  [options.row.lineBreak="\n"]        String used to break rows
3443   * @param  {Object}  [options.cell]                      Cell options
3444   * @param  {String}  [options.cell.paddingLeft=" "]      String added before the cell content
3445   * @param  {String}  [options.cell.paddingRight=" "]     String added after the cell content
3446   * @param  {Number}  [options.cell.defaultAlignDir="1"]  Define the default alignment when not specified (-1=left, 0=center, 1=right)
3447   * @param  {Object}  [options.hr]                        Horizontal Line options
3448   * @param  {String}  [options.hr.str="—"]                String that will be repeated to make the Horizontal Line
3449   * @param  {String}  [options.hr.colSeparator="|"]       String added between columns
3450   * @return {string}                                      The final ASCII table
3451   * @author Victor N. wwww.victorborges.com
3452   * @date   2016-12-28
3453   */
3454
3455
3456  matrixToAsciiTable(m, options) {
3457    options = defaults({
3458      row: {
3459        paddingLeft: " ",
3460        //before first column
3461        paddingRight: " ",
3462        //after last column
3463        colSeparator: " ",
3464        //between each column
3465        lineBreak: "[br/]"
3466      },
3467      cell: {
3468        paddingLeft: " ",
3469        paddingRight: " ",
3470        defaultAlignDir: 0 //left=-1 center=0 right=1
3471
3472      },
3473      hr: {
3474        str: " ",
3475        colSeparator: " "
3476      }
3477    }, options);
3478
3479    function defaults(defaultObj, options) {
3480      let isObj = function (x) {
3481        return x !== null && typeof x === "object";
3482      };
3483
3484      if (isObj(options)) for (let prop in defaultObj) {
3485        if (Object.prototype.hasOwnProperty.call(defaultObj, prop) && Object.prototype.hasOwnProperty.call(options, prop)) {
3486          if (isObj(defaultObj[prop])) defaults(defaultObj[prop], options[prop]);else defaultObj[prop] = options[prop];
3487        }
3488      }
3489      return defaultObj;
3490    }
3491
3492    function repeatStr(width, str) {
3493      str = str || " ";
3494      let result = width > 0 ? Array(Math.ceil(width / str.length) + 1).join(str) : "";
3495      return result.length > width ? result.substr(0, width) : result;
3496    }
3497
3498    function alignText(txt, width) {
3499      function pad(txt, width, dir) {
3500        let p = width - txt.length;
3501        let pL = dir > 0 ? p : p / 2 << 0;
3502        let pR = dir < 0 ? p : pL + (p - pL * 2);
3503        return p > 0 ? (dir >= 0 ? Array(pL + 1).join(" ") : '') + txt + (dir <= 0 ? Array(pR + 1).join(" ") : '') : txt;
3504      }
3505
3506      txt = "" + txt; //toString
3507
3508      switch (txt.charAt(0)) {
3509        case '<':
3510          return pad(txt.substr(1), width, -1);
3511        //align left
3512
3513        case '^':
3514          return pad(txt.substr(1), width, 0);
3515        //align center
3516
3517        case '>':
3518          return pad(txt.substr(1), width, 1);
3519        //align right
3520
3521        default:
3522          return pad(txt, width, options.cell.defaultAlignDir);
3523      }
3524    }
3525
3526    function calcColumnsWidth(matrix) {
3527      //calculate columns width
3528      let colsWidth = [];
3529
3530      rows: for (let r = 0, rLen = matrix.length; r < rLen; r++) {
3531        if (!matrix[r]) continue; //separator
3532
3533        cols: for (let c = 0, cLen = matrix[r].length; c < cLen;
3533 c++) {
3534          if (!colsWidth[c]) colsWidth[c] = 0;
3535          colsWidth[c] = Math.max(colsWidth[c], ("" + matrix[r][c]).length);
3536        }
3537      }
3538
3539      return colsWidth;
3540    }
3541
3542    let paddingLength = options.cell.paddingLeft.length + options.cell.paddingRight.length;
3543    let hrSeparator = repeatStr(options.row.colSeparator.length, options.hr.colSeparator || options.hr.str);
3544    let colsWidth = calcColumnsWidth(m); //create table
3545
3546    let table = [];
3547
3548    for (let r = 0, rLen = m.length; r < rLen; r++) {
3549      let cols = [];
3550
3551      if (m[r]) {
3552        //create columns
3553        for (let c = 0; c < colsWidth.length; c++) {
3554          cols.push(options.cell.paddingLeft + alignText(m[r][c], colsWidth[c]) + options.cell.paddingRight);
3555        }
3556
3557        table.push([options.row.paddingLeft, cols.join(options.row.colSeparator), options.row.paddingRight].join(''));
3558      } else {
3559        //create horizontal line
3560        for (let c = 0; c < colsWidth.length; c++) {
3561          cols.push(repeatStr(colsWidth[c] + paddingLength, options.hr.str));
3562        }
3563
3564        table.push([options.row.paddingLeft, cols.join(hrSeparator), options.row.paddingRight].join(''));
3565      }
3566    }
3567
3568    return table.join(options.row.lineBreak);
3569  }
3570
3571  alignText(txt, width) {
3572    function pad(txt, width, dir) {
3573      let p = width - txt.length;
3574      let pL = dir > 0 ? p : p / 2 << 0;
3575      let pR = dir < 0 ? p : pL + (p - pL * 2);
3576      return p > 0 ? (dir >= 0 ? Array(pL + 1).join(" ") : '') + txt + (dir <= 0 ? Array(pR + 1).join(" ") : '') : txt;
3577    }
3578
3579    txt = "" + txt; //toString
3580
3581    switch (txt.charAt(0)) {
3582      case '<':
3583        return pad(txt.substr(1), width, -1);
3584      //align left
3585
3586      case '^':
3587        return pad(txt.substr(1), width, 0);
3588      //align center
3589
3590      case '>':
3591        return pad(txt.substr(1), width, 1);
3592      //align right
3593
3594      default:
3595        return pad(txt, width, 0);
3596    }
3597  }
3598
3599  renderSeatMap(workspacekey, event) {
3600    let self = this;
3601    let useAzure = false;
3602    let eventArr;
3603    let chartkey = '';
3604    let eventid = '';
3605
3606    if (workspacekey.indexOf('azure;') !== -1) {
3607      useAzure = true;
3608      workspacekey = workspacekey.replace('azure;', '');
3609      eventArr = event.split(';');
3610      chartkey = eventArr[0];
3611      eventid = eventArr[1];
3612    }
3613
3614    let pricingAll;
3615    this.createDestroySeatChart();
3616    this.JPriceMap().show();
3617    this.JPriceMapSeats().show();
3618    this.JPriceMapExplanation().show();
3619    this.JBlankSeatsMap().hide();
3620    let orphanSeat = true;
3621
3622    if (self.JFreeSeating()) {
3623      orphanSeat = true;
3624    }
3625
3626    let colorScheme = 'dark';
3627    let bgcolor;
3628    let stcolor;
3629    let ntcolor;
3630    self.color1 = '#252525';
3631    self.color2 = '#333333';
3632    bgcolor = '#1E1E1E';
3633    stcolor = '#000000';
3634    ntcolor = '#444444';
3635
3636    if (self.JTheme() === 'light') {
3637      colorScheme = 'light';
3638      self.color1 = '#EEF0F2';
3639      self.color2 = '#ffffff';
3640      bgcolor = '#ffffff';
3641      stcolor = '#EEF0F2';
3642      ntcolor = '#E8E8E8';
3643    }
3644
3645    if (!useAzure) {
3646      pricingAll = self.getPricingCategoriesAndCategoriesLabelsAndUnavailableCategoriesAndSeatLabelsCategories();
3647      this.seatChart = new seatsio.SeatingChart({
3648        divId: 'seats_map',
3649        workspaceKey: workspacekey,
3650        colorScheme: colorScheme,
3651        showFullScreenButton: false,
3652        allowOrphanSeats: orphanSeat,
3653        extraConfig: {
3654          //pricingAllCategoryLabels: pricingAll['category_labels'],
3655          //pricingAllCategoryPricing: pricingAll['category_pricing'],
3656          eventSectionsCapacity: pricingAll['object_categories'],
3657          pricingAllSeatLabels: pricingAll['seat_labels_categories'],
3658          unavailableCategoriesSeatLabels: pricingAll['unavailable_categories']
3659        },
3660        pricing: pricingAll['pricing_categories'],
3661        categories: pricingAll['categories_labels'],
3662        objectCategories: pricingAll['seat_labels_categories'],
3663        unavailableCategories: pricingAll['unavailable_categories'],
3664        objectColor: function (object, defaultColor, extraConfig) {
3665          //because we don't have a full seatmap by category, there is no way to know which one from the seats are assigned to which categories.
3666          //we get from api only available seats
3667          //console.log(object);
3668          if (typeof object.category !== 'undefined') {
3669            if (object.category.label === 'Not Available') {
3670              return object.category.color;
3671            }
3672          }
3673
3674          if (extraConfig.pricingAllSeatLabels[object.label]) {
3675            return defaultColor;
3676          }
3677
3678          return self.color1;
3679        },
3680        canGASelectionBeIncreased: function (gaArea, defaultValue, extraConfig) {
3681          if (typeof extraConfig.eventSectionsCapacity[gaArea.label] !== 'undefined') {
3682            return gaArea.numBooked + gaArea.numSelected < extraConfig.eventSectionsCapacity[gaArea.label];
3683          }
3684
3685          return defaultValue;
3686        },
3687        objectIcon: function (object, defaultIcon, extraConfig) {
3688          if (defaultIcon === 'check') {
3689            return 'user';
3690          }
3691
3692          return defaultIcon;
3693        },
3694        objectWithoutCategorySelectable: false,
3695        objectTooltip: {
3696          showActionHint: false,
3697          showAvailability: false,
3698          showCategory: false,
3699          showLabel: false,
3700          showPricing: false,
3701          showUnavailableNotice: true,
3702          stylizedLabel: true,
3703          confirmSelectionOnMobile: false
3704        },
3705        colors: {
3706          cursorTooltipBackgroundColor: self.color2
3707        },
3708        tooltipInfo: function (object) {
3709          if (typeof self.eventSeats[object.label] !== "undefined" && typeof object.pricing !== "undefined" && typeof object.pricing.formattedPrice !== "undefined") {
3710            // if (object.objectType === 'Seat') {
3711            const seatSection = object.labels.section;
3712            const seatRow = object.labels.parent;
3713            const seatLabel = object.labels.own; //const seatPrice = parseFloat(object.pricing.formattedPrice).toFixed(2);
3714
3715            let seatPrice = object.pricing.formattedPrice;
3716            let seatPriceF = object.pricing.price.toFixed(2);
3717
3718            if (self.isPack()) {
3719              if (seatPriceF - self.initPackPrice == 0) {
3720                seatPrice = 'INCLUDED';
3721              } else {
3722                seatPrice = '+$' + (seatPriceF - self.initPackPrice).toFixed(2);
3723              }
3724            }
3725
3726            const seatNotice = 'Ticket prices excludes all fees';
3727            let seatAlert = '';
3728
3729            if (typeof self.eventSeats[object.label]["seatAlertId"] !== "undefined" && typeof self.seatAlertsAndTooltipsPerLabel[self.eventSeats[object.label]["seatAlertId"]] !== 'undefined') {
3730              seatAlert = '[br/]' + self.seatAlertsAndTooltipsPerLabel[self.eventSeats[object.label]["seatAlertId"]]['display_name'] + '[br/]';
3731            }
3732
3733            let m = [['^Section', '^Row', '^Seat'], ['^' + seatSection, '^' + seatRow, '^' + seatLabel]]; //return '[pre]' + self.matrixToAsciiTable(m) + '[/pre]' + '[pre]' + self.matrixToAsciiTable(m1) + '[/pre]' + '[br/]' + '[br/]' + seatNotice + '[br/]' + '[br/]' + seatAlert;
3734
3735            return '[pre]' + self.matrixToAsciiTable(m) + '[/pre]' + '[br/]' + '[pre]' + "——————————————————————————" + '[/pre]' + '[br/]' + '[br/]' + '[pre]' + self.alignText('' + seatPrice, 25) + '[/pre]' + '[br/]' + '[br/]' + self.alignText(seatNotice, 25) + '[br/]' + '[br/]' + self.alignText(seatAlert, 25);
3736          } else if (typeof self.eventSectionsCapacity[object.label] !== "undefined" && typeof object.pricing !== "undefined" && typeof object.pricing.formattedPrice !== "undefined") {
3737            // if (object.objectType === 'Seat') {
3738            const seatSection = object.label;
3739            const seatNotice = 'Ticket prices excludes all fees'; //const seatPrice = parseFloat(object.pricing.formattedPrice).toFixed(2);
3740
3741            let seatPrice = object.pricing.formattedPrice;
3742            let seatPriceF = object.pricing.price.toFixed(2);
3743
3744            if (seatPriceF - self.initPackPrice == 0) {
3745              seatPrice = 'INCLUDED';
3746            } else {
3747              seatPrice = '+$' + (seatPriceF - self.initPackPrice).toFixed(2);
3748            }
3749
3750            let m = [['^Section'], ['^' + seatSection]]; //return '[pre]' + self.matrixToAsciiTable(m) + '[/pre]' + '[pre]' + self.matrixToAsciiTable(m1) + '[/pre]' + '[br/]' + '[br/]' + seatNotice + '[br/]' + '[br/]' + seatAlert;
3751
3752            return '[pre]' + self.matrixToAsciiTable(m) + '[/pre]' + '[br/]' + '[pre]' + "——————————————————————————" + '[/pre]' + '[br/]' + '[br/]' + '[pre]' + self.alignText('' + seatPrice, 25) + '[/pre]' + '[br/]' + '[br/]' + self.alignText(seatNotice, 25) + '[br/]' + '[br/]';
3753          } else {
3754            return 'Not Available';
3755          } //}
3756          //check if object label has seat alert
3757
3758        },
3759        event: event,
3760        onChartRendered: function (chart) {},
3761        onObjectDeselected: function (object, deselectedTicketType) {
3762          if (!self.JFreeSeating()) {
3763            let pods = [];
3764
3765            for (const kp in self.pods) {
3766              for (const kpp in self.pods[kp]) {
3767                if (self.pods[kp][kpp] === object.label) {
3768                  pods = self.pods[kp];
3769                  break;
3770                }
3771              }
3772            }
3773
3774            self.seatChart.deselectObjects(pods);
3775          }
3776
3777          self.seatChart.listSelectedObjects(function (selectedObjects) {
3778            for (let c = 0; c < selectedObjects.length; c++) {
3779              if (selectedObjects[c].label === object.label && typeof selectedObjects[c].numSelected === 'undefined') {
3780                selectedObjects.splice(c, 1);
3781                break;
3782              }
3783            }
3784
3785            if (!self.JFreeSeating()) {
3786              if (self.fromDelete !== false && selectedObjects.length < self.fromDelete - 2 && self.fromDelete > 1 || self.fromDelete === false && selectedObjects.length < self.selectedLabels.length - 1) {
3787                __WEBPACK_IMPORTED_MODULE_1_sweetalert2_dist_sweetalert2_js___default.a.fire({
3788                  title: 'Information',
3789                  text: 'You selected seats have been removed because you cannot have orphan seats',
3790                  icon: 'warning',
3791                  confirmButtonText: 'Ok'
3792                });
3793              }
3794
3795              self.fromDelete = false;
3796            }
3797
3798            self.selectBasedOnDropDown(selectedObjects);
3799          });
3800        },
3801        onObjectSelected: function (object, selectedTicketType) {
3802          let deselected = false;
3803
3804          if (typeof self.eventSeats[object.label] !== 'undefined' && typeof self.eventSeats[object.label]["seatAlertId"] !== "undefined") {
3805            if (typeof self.seatAlertsAndTooltipsPerLabel[self.eventSeats[object.label]["seatAlertId"]] !== 'undefined') {
3806              if (self.seatAlertsAndTooltipsPerLabel[self.eventSeats[object.label]["seatAlertId"]]['require_acknowledgement']) {
3807                if (!confirm(self.seatAlertsAndTooltipsPerLabel[self.eventSeats[object.label]["seatAlertId"]]['display_name'])) {
3808                  object.deselect();
3809                  deselected = true;
3810                }
3811              }
3812            }
3813          }
3814
3815          if (!deselected) {
3816            self.seatChart.listSelectedObjects(function (selectedObjects) {
3817              self.selectBasedOnDropDown(selectedObjects);
3818            });
3819          }
3820        },
3821        priceFormatter: function (price) {
3822          return '$' + parseFloat(price).toFixed(2);
3823        }
3824      }).render();
3825    } else {
3826      pricingAll = self.getPricingCategoriesAndCategoriesLabelsAndUnavailableCategoriesAndSeatLabelsCategoriesAzure();
3827      let style = {
3828        bgColor: bgcolor,
3829        strokeColor: stcolor,
3830        notAvailableColor: ntcolor,
3831        bgColorSelected: '#000000',
3832        font: {
3833          color: '#000000',
3834          fontFamily: 'Arial',
3835          fontWeight: 'normal' //normal, bold, italic
3836
3837        }
3838      };
3839      let notAvailablePopoverHtml = `<div style='
3840                            width: 250px;                                 
3841                            background-color: #3e3e3e; 
3842                            border-radius: 4px;
3843                            padding: 5px 10px 5px 10px;                            
3844                            color: #fff;
3845                            font-size: 12px;
3846                            box-shadow: 1px 0px 25px -3px #3e3e3e;
3847                            '>
3848
3849                            <p style='color: rgba(255, 255, 255, 0.80); font-size: 14px; font-style: normal; font-weight: 500; line-height: 22px;text-align: center;  margin-top: 10px;'>Not availabe </p>
3850
3851                            <div style='color: rgba(255, 255, 255, 0.80); text-align: center; font-size: 12px; font-style: normal; font-weight: 500; line-height: 20px; background-color:#000; width:100%; padding:0 5px;'>
3852                                Not available
3853                                
3854                            </div>
3855                       </div>`;
3856      let attributes = {
3857        showZoomOutButton: true,
3858        allowOrphanSeats: true,
3859        pods: false,
3860        notAvailablePopoverHtml: notAvailablePopoverHtml
3861      }; //            this.toggleCategories = [];
3862      //token: "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJyb2xlIjoiU2VhdGluZyIsIm5hbWUiOiIzIiwiZW1haWwiOiJzZWF0aW5nQHJvd2ViLnJvIiwiRnVsbE5hbWUiOiJTZWF0aW5nIEFwcCIsImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzLzIwMDUvMDUvaWRlbnRpdHkvY2xhaW1zL3N5c3RlbSI6IjEyMzIzMjMyIiwiRmlyc3ROYW1lIjoiU2VhdGluZyIsIkxhc3ROYW1lIjoiQXBwIiwibmJmIjoxNjc2MjgxMTMxLCJleHAiOjE2NzY1NDAzMzEsImlhdCI6MTY3NjI4MTEzMX0.BpHssIAknLqEiMIwTgj8oy4x9EmOK-jhtPhkpOJB4SY",
3863      //chartId: "e7e29205-41b0-47e2-a836-6537d37c6a7e",
3864      //eventId: "e7e29205-41b0-47e2-a836-6537d37c6a7e",
3865
3866      this.seatChart = new _as.chartLayout({
3867        token: workspacekey + "",
3868        chartId: chartkey + "",
3869        containerId: "seats_map",
3870        eventId: eventid + "",
3871        prices: pricingAll['pricing_categories'],
3872        categories: pricingAll['categories_labels'],
3873        objects: pricingAll['seat_labels_categories'],
3874        //prices: prices,
3875        //categories: categories,
3876        //objects: objects,
3877        style: style,
3878        theme: self.JTheme(),
3879        attributes: attributes
3880      });
3881      this.seatChart.render(this.onObjectClick, this.onObjectHover, self, pricingAll);
3882    }
3883  }
3884
3885  onObjectHover(obj, main, self) {
3886    let seat = obj.object;
3887    const split = seat.label.split('-');
3888    let footer = ``;
3889    let seatAlert = '';
3890
3891    if (typeof self.eventSeats !== 'undefined' && typeof self.eventSeats[seat.label] !== 'undefined' && typeof self.seatAlertsAndTooltipsPerLabel !== 'undefined' && typeof self.eventSeats[seat.label]["seatAlertId"] !== "undefined" && typeof self.seatAlertsAndTooltipsPerLabel[self.eventSeats[seat.label]["seatAlertId"]] !== 'undefined') {
3892      seatAlert = '<p style="margin-top: 10px; color: rgba(255, 255, 255, 0.80); text-align:center;font-size: 12px; font-style: normal; font-weight: 500; line-height: 20px; ">' + self.seatAlertsAndTooltipsPerLabel[self.eventSeats[seat.label]["seatAlertId"]]['display_name'] + '</p>';
3893    }
3894
3895    if (seat.statusId === 'selected') {
3896      footer = `
3897                        <div style='background-color:#0ca3d6; width:100%; padding:0 5px;'>
3898                            Selected 
3899                        </div>
3900                        `;
3901    }
3902
3903    let priceBlocksAndUsedBlocks = self.getPriceBlocksAndUsedBlocks();
3904    let priceBlocks = priceBlocksAndUsedBlocks.priceBlock;
3905    let bigpricecut = '';
3906
3907    for (let i1 = priceBlocks.length - 1; i1 >= 0; i1--) {
3908      if (priceBlocks[i1].priceLevelId == seat.categoryId) {
3909        let fullRetailPrice = priceBlocks[i1].fullRetailPrice;
3910        if (priceBlocks[i1].bigPrice && seat.prices[0].price == fullRetailPrice) bigpricecut = '<span style="position:relative; color: rgba(255, 255, 255, 0.8);font-weight: 400;">' + priceBlocks[i1].bigPrice.toFixed(2) + '<div style=" border-bottom: 0.075em solid rgba(255, 255, 255, 0.8); margin-top: 2px;left: 0;position: absolute;right: 0;top: 50%;"></div></span>';
3911      }
3912    }
3913
3914    let html = `<div style='
3915                            width: 250px;                              
3916                            background-color: #3e3e3e; 
3917                            border-radius: 4px;
3918                            padding: 5px 10px 5px 10px;                            
3919                            color: #fff;     
3920                            font-size: 12px;
3921                            text-align:center;
3922                            box-shadow: 1px 0px 25px -3px #3e3e3e;
3923                            '>
3924                            <table style='width: 100%;table-layout: fixed'>
3925                                <tr style='color: rgba(255, 255, 255, 0.80); font-size: 14px; font-style: normal; font-weight: 500; line-height: 22px;'>`;
3926
3927    if (split[0]) {
3928      html += `<td style='text-align:center; padding:2px;'>Section</td>`;
3929    }
3930
3931    if (split[1]) {
3932      html += `<td style='text-align:center;padding:2px;'>Row</td>`;
3933    }
3934
3935    if (split[2]) {
3936      html += `<td style='text-align:center;  padding:2px;'>Seat</td>`;
3937    }
3938
3939    if (seat.ga && seat.ga.max > 0 && typeof seat.ga.current !== 'undefined') {
3940      html += `<td style="text-align:center; background-color: #242121; padding:2px;">Selected Tickets</td>`;
3941    }
3942
3943    html += `</tr>
3944                                <tr style='font-size: 18px; font-style: normal; font-weight: 600; line-height: 26px; '>`;
3945
3946    if (split[0]) {
3947      html += `<td style='text-align:center; padding:2px;'>` + split[0] + `</td>`;
3948    }
3949
3950    if (split[1]) {
3951      html += `<td style='text-align:center;  padding:2px;'>` + split[1] + `</td>`;
3952    }
3953
3954    if (split[2]) {
3955      html += `<td style='text-align:center; padding:2px;'>` + split[2] + `</td>`;
3956    }
3957
3958    if (seat.ga && seat.ga.max > 0 && typeof seat.ga.current !== 'undefined') {
3959      html += `<td style="text-align:center; background-color: #242121; padding:2px;">` + seat.ga.current + `</td>`;
3960    }
3961
3962    let pricet = seat.prices[0].price;
3963
3964    if (seat.ga && seat.ga.max > 0 && typeof seat.ga.current !== 'undefined') {
3965      if (seat.ga.current === 0) {
3966        pricet = seat.prices[0].price;
3967      } else {
3968        pricet = seat.prices[0].price * seat.ga.current;
3969      }
3970    }
3971
3972    html += `</tr>
3973                               
3974                            </table>
3975                           
3976                            <table style='width: 100%;'>
3977                                <tr>
3978                                    <td colspan='3' style='text-align:center; color: #BC5AFF; font-weight: 600;font-size: 24px; font-style: normal; line-height: 32px; padding:2px;'>
3979                                         ` + bigpricecut + ` $` + pricet.toFixed(2) + `
3980                                    </td>`;
3981    html += `</tr>
3982                            </table>`; // if (window.location.href.indexOf('aaa.spotlight.vegas') === -1) {
3983    //     html += seatAlert + `
3984    //                     <p style='margin-top: 10px; color: rgba(255, 255, 255, 0.80); text-align:center;font-size: 12px; font-style: normal; font-weight: 500; line-height: 20px; '>Price excludes all fees</p>
3985    //
3986    //                     ` + footer + `
3987    //                </div>`;
3988    // } else {
3989
3990    html += seatAlert + footer + `
3991                       </div>`; //}
3992
3993    main.showPopover(html);
3994  }
3995
3996  onObjectClick(obj, main, self, pricingAll) {
3997    let mySelectdObject = [];
3998
3999    for (let i1 = 0; i1 < obj.selectedObjects.length; i1++) {
4000      let price = 0;
4001
4002      for (let i = 0; i < pricingAll['seat_labels_categories'].length; i++) {
4003        let label = pricingAll['seat_labels_categories'][i]['label'];
4004        let catId = pricingAll['seat_labels_categories'][i]['categoryId'];
4005
4006        if (obj.selectedObjects[i1].id === label) {
4007          for (let i2 = 0; i2 < pricingAll['pricing_categories'].length; i2++) {
4008            if (catId === pricingAll['pricing_categories'][i2]['categoryId']) {
4009              price = pricingAll['pricing_categories'][i2]['price'];
4010              let ooobj = {
4011                label: obj.selectedObjects[i1].id,
4012                uuid: obj.selectedObjects[i1].id,
4013                pricing: {
4014                  price: price
4015                }
4016              };
4017
4018              if (obj.selectedObjects[i1].id.indexOf('-') === -1) {
4019                ooobj.numSelected = obj.selectedObjects[i1].qty;
4020              }
4021
4022              mySelectdObject.push(ooobj);
4023            }
4024          }
4025        }
4026      }
4027    }
4028
4029    self.selectBasedOnDropDown(mySelectdObject);
4030    self.myselectedObjects = mySelectdObject;
4031  }
4032
4033  updateObjQuantity(objId, qty) {
4034    let newMyselectedObject = [];
4035
4036    if (qty === 0) {
4037      for (let i3 = 0; i3 < this.myselectedObjects.length; i3++) {
4038        if (this.myselectedObjects[i3]['label'] === objId) {
4039          continue;
4040        }
4041
4042        newMyselectedObject.push(this.myselectedObjects[i3]);
4043      }
4044
4045      this.myselectedObjects = newMyselectedObject;
4046    }
4047
4048    this.seatChart.updateObjQuantity(objId, qty);
4049  }
4050
4051  toggleCategory(category) {
4052    let temp = [];
4053    let newCategory = true;
4054
4055    for (let i = 0; i < toggleCategories.length; i++) {
4056      let element = toggleCategories[i];
4057
4058      if (category === element) {
4059        newCategory = false;
4060      } else {
4061        temp.push(element);
4062      }
4063    }
4064
4065    if (newCategory) {
4066      temp.push(category);
4067    }
4068
4069    this.toggleCategories = temp;
4070    this.seatChart.toggleCategoriesHighlightRender(temp);
4071  }
4072
4073  createDropDownSelect(dropdown, workspacekey, event) {
4074    let self = this;
4075    this.JTicketsCart().html('');
4076    this.JTicketsCart().show();
4077    this.JTicketsCart().append('<div class="number_of_tickets_text">Number of tickets: </div>' + dropdown);
4078    this.JTicketsChooser().off('change').on('change', function () {
4079      const selectedVal = parseInt(jQuery(this).val()); //            if (selectedVal === 0) return false;
4080
4081      self.selectedNumberOfTickets = selectedVal;
4082      self.selectedPromoCode = false;
4083
4084      for (const key in self.eventPromotions) {
4085        let priceB = self.eventPromotions[key]['priceBlocks'];
4086
4087        for (const keyp in self.eventPromotions[key]['priceBlocks']) {
4088          let minTick, maxTick;
4089
4090          if (typeof self.eventPromotions[key]['priceBlocks'][keyp]['min_tickets'] === 'undefined') {
4091            minTick = 0;
4092          } else {
4093            minTick = self.eventPromotions[key]['priceBlocks'][keyp]['min_tickets'];
4094          }
4095
4096          if (typeof self.eventPromotions[key]['priceBlocks'][keyp]['max_tickets'] === 'undefined') {
4097            maxTick = 30;
4098          } else {
4099            maxTick = self.eventPromotions[key]['priceBlocks'][keyp]['max_tickets'];
4100          }
4101
4102          if (minTick <= selectedVal && maxTick >= selectedVal && self.eventPromotions[key]['ispods']) {
4103            self.selectedPromoCode = self.eventPromotions[key];
4104            break;
4105          }
4106        }
4107
4108        if (self.selectedPromoCode !== false) {
4109          break;
4110        }
4111      }
4112
4113      if (self.selectedPromoCode !== false) {
4114        self.renderSeatMap(workspacekey, event);
4115        self.createPricingMap();
4116      }
4117    });
4118    this.JTicketsChooser().trigger('change');
4119  }
4120
4121}
4122
4123/* harmony default export */ __webpack_exports__["a"] = (RwbEventsFormController);
4124/*gActions() {
4125        this.JBuyButton().hide();
4126        this.JBuyButton().off('click').on('click', jQuery.proxy(this.buyNowAction, this));
4127        this.JQty().on('change', jQuery.proxy(this.changeQtyAction, this));
4128    }
4129
4130    cartActions() {
4131        this.JBtn().on('click', jQuery.proxy(this.buyTicketBtn, this));
4132    }
4133    changeQtyAction() {
4134        const qty = this.JQty().val();
4135        this.seatChart.changeConfig({
4136            numberOfPlacesToSelect: qty,
4137            maxSelectedObjects: qty
4138        });
4139    }
4140
4141    buyNowAction() {
4142        let labels = [];
4143        let self = this;
4144        this.seatChart.listSelectedObjects(
4145            function (selectedObjects) {
4146                self.selectedObjectChart = selectedObjects;
4147                let c;
4148                let p;
4149                for (c = 0; c < self.selectedObjectChart.length; c++) {
4150                    let label = {};
4151                    label.label = self.selectedObjectChart[c].label;
4152                    for (p = 0; p < self.selectedObjectChart[c].pricing.ticketTypes.length; p++) {
4153                        if (self.selectedObjectChart[c].pricing.ticketTypes[p]['ticketType'] === self.selectedObjectChart[c].selectedTicketType) {
4154                            label.price = self.selectedObjectChart[c].pricing.ticketTypes[p]['price'];
4155                            label.type = self.selectedObjectChart[c].pricing.ticketTypes[p]['ticketType'];
4156                        }
4157                    }
4158                    labels.push(label);
4159                }
4160                labels = Object.assign({}, labels);
4161                let maxQty = self.JQty().val();
4162                const data = {
4163                    action: 'hold_seats',
4164                    productid: self.JProductId(),
4165                    seatlabels: labels,
4166                    eventkey: self.selectedEvent,
4167                    qty: maxQty,
4168                    security: jQuery('#rwb_hold_seats_nonce').val()
4169                };
4170
4171
4172                //if (JSON.stringify(self.oldDataSent) === JSON.stringify(data)) {
4173                //return false;
4174                //}
4175
4176                //self.oldDataSent = data;
4177
4178                self.JBuyButton().LoadingOverlay("show");
4179                jQuery.ajax({
4180                    type: 'POST',
4181                    dataType: 'json',
4182                    url: bbLocal.ajax_url,
4183                    data: data,
4184                    success: jQuery.proxy(self.buyNowCompleted, self)
4185                });
4186            }
4187        );
4188    }
4189
4190    buyNowCompleted(response) {
4191
4192        if (response.success === false) {
4193            this.seatChart.rerender();
4194            this.seatChart = false;
4195            this.selectedObjectChart = null;
4196            this.selectedEvent = null;
4197            alert(response.message);
4198            this.JBuyButton().LoadingOverlay("hide", true);
4199            this.JBuyButton().hide();
4200        } else {
4201            window.location.href = response.url;
4202        }
4203    }
4204
4205    buyTicketBtn(event) {
4206        //this is needed because event.target does not have the element can be a span inside the button
4207        let btn = jQuery(event.target);
4208        let obj = btn.data();
4209        if (Object.keys(obj).length === 0 && obj.constructor === Object) {
4210            btn = btn.parent();
4211        }
4212        this.createDestroySeatChart();
4213
4214        this.gActions();
4215        let self = this;
4216
4217        this.seatChart = new seatsio.SeatingChart({
4218            divId: 'divSeatsio',
4219            workspaceKey: this.getWorkspace(btn),
4220            event: this.getEventKey(btn),
4221            pricing: pricingJson,
4222            onChartRendered: function (chart) {
4223            },
4224            onObjectDeselected: function (object, deselectedTicketType) {
4225                self.seatChart.listSelectedObjects(
4226                    function (selectedObjects) {
4227                        if (selectedObjects.length > 0) {
4228                            self.JBuyButton().show();
4229                        } else {
4230                            self.JBuyButton().hide();
4231                        }
4232                    }
4233                );
4234
4235            },
4236            onObjectSelected: function (object, selectedTicketType) {
4237                self.seatChart.listSelectedObjects(
4238                    function (selectedObjects) {
4239                        if (selectedObjects.length > 0) {
4240                            self.JBuyButton().show();
4241                        } else {
4242                            self.JBuyButton().hide();
4243                        }
4244                    }
4245                );
4246            },
4247            //numberOfPlacesToSelect: 1,
4248            priceFormatter: function (price) {
4249                return '$' + price;
4250            }
4251        }).render();
4252
4253        const maxS = this.getMaxSelectedSeats(btn);
4254        if (maxS.length > 0) {
4255            let maxSeats = Function('"use strict";return (' + '[' + maxS + ']' + ')')();
4256            this.seatChart.changeConfig({
4257                maxSelectedObjects: maxSeats
4258            });
4259        } else {
4260            this.seatChart.changeConfig({
4261                numberOfPlacesToSelect: 1,
4262                maxSelectedObjects: 1
4263            });
4264        }
4265    }
4266
4267    createDestroySeatChart() {
4268        if (this.seatChart !== false) {
4269            this.seatChart.destroy();
4270            this.JBuyButton().LoadingOverlay('hide');
4271            this.seatChart = false;
4272            this.selectedObjectChart = null;
4273            this.selectedEvent = null;
4274        }
4275    }
4276    */
4277
4278/***/ }),
4279/* 3 */
4280/***/ (function(module, __webpack_exports__, __webpack_require__) {
4281
4282"use strict";
4283/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__RwbEventsFormModel__ = __webpack_require__(4);
4284
4285/**
4286 * View takes care to any html rendering and anything related to showing on the element and its children
4287 */
4288
4289class RwbEventsFormView extends __WEBPACK_IMPORTED_MODULE_0__RwbEventsFormModel__["a" /* default */] {
4290  constructor() {
4291    super();
4292  }
4293
4294  getWarningDiv(msg) {
4295    return '<div class="bb-warning">' + msg + '</div>';
4296  }
4297
4298  showLoading() {
4299    swal(bbLocal.loading_text);
4300    swal.showLoading();
4301  }
4302
4303  showSuccess(html) {
4304    swal('Good job!', html, 'success');
4305  }
4306
4307  showError(html) {
4308    swal('Oops!', html, 'error');
4309  }
4310
4311  closeModal() {
4312    swal.closeModal(); //swal.close();
4313  }
4314
4315}
4316
4317/* harmony default export */ __webpack_exports__["a"] = (RwbEventsFormView);
4318
4319/***/ }),
4320/* 4 */
4321/***/ (function(module, __webpack_exports__, __webpack_require__) {
4322
4323"use strict";
4324/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__RwbEventsFormSpine__ = __webpack_require__(5);
4325
4326/**
4327 * Model takes care to the data-attributes attached to the element/read-write and trigger events on change of it.
4328 */
4329
4330class RwbEventsFormModel extends __WEBPACK_IMPORTED_MODULE_0__RwbEventsFormSpine__["a" /* default */] {
4331  constructor() {
4332    super();
4333  }
4334
4335  createDateAsUTC(date) {
4336    return new Date(Date.UTC(date.getFullYear(), date.getMonth(), date.getDate(), date.getHours(), date.getMinutes(), date.getSeconds()));
4337  }
4338
4339  getTimezoneInMiliseconds(datei) {
4340    let dateInput;
4341
4342    if (!datei) {
4343      dateInput = new Date();
4344    } else {
4345      dateInput = new Date(datei);
4346    }
4347
4348    let fullYear = dateInput.getFullYear() | 0; // "Leap Years are any year that can be exactly divided by 4 (2012, 2016, etc)
4349    //   except if it can be exactly divided by 100, then it isn't (2100,2200,etc)
4350    //	  except if it can be exactly divided by 400, then it is (2000, 2400)"
4351    // (https://www.mathsisfun.com/leap-years.html).
4352
4353    let isLeapYear = (fullYear & 3 | fullYear / 100 & 3) === 0 ? 1 : 0; // (fullYear & 3) = (fullYear % 4), but faster
4354    //Alternative:var isLeapYear=(new Date(currentYear,1,29,12)).getDate()===29?1:0
4355
4356    let fullMonth = dateInput.getMonth() | 0;
4357    let offsetDst = 0;
4358    /* offsetDst = (
4359        // 1. We know what the time since the Epoch really is
4360        (+dateInput) // same as the dateInput.getTime() method
4361        // 2. We know what the time since the Epoch at the start of the year is
4362        - (+new Date(fullYear, 0, 0)) // day defaults to 1 if not explicitly zeroed
4363        // 3. Now, subtract what we would expect the time to be if daylight savings
4364        //      did not exist. This yields the time-offset due to daylight savings.
4365        - ((
4366            ((
4367                // Calculate the day of the year in the Gregorian calendar
4368                // The code below works based upon the facts of signed right shifts
4369                //    • (x) >> n: shifts n and fills in the n highest bits with 0s
4370                //    • (-x) >> n: shifts n and fills in the n highest bits with 1s
4371                // (This assumes that x is a positive integer)
4372                (31 & ((-fullMonth) >> 4)) + // January // (-11)>>4 = -1
4373                ((28 + isLeapYear) & ((1 - fullMonth) >> 4)) + // February
4374                (31 & ((2 - fullMonth) >> 4)) + // March
4375                (30 & ((3 - fullMonth) >> 4)) + // April
4376                (31 & ((4 - fullMonth) >> 4)) + // May
4377                (30 & ((5 - fullMonth) >> 4)) + // June
4378                (31 & ((6 - fullMonth) >> 4)) + // July
4379                (31 & ((7 - fullMonth) >> 4)) + // August
4380                (30 & ((8 - fullMonth) >> 4)) + // September
4381                (31 & ((9 - fullMonth) >> 4)) + // October
4382                (30 & ((10 - fullMonth) >> 4)) + // November
4383                // There are no months past December: the year rolls into the next.
4384                // Thus, fullMonth is 0-based, so it will never be 12 in Javascript
4385                  (dateInput.getDate() | 0) // get day of the month
4386              ) & 0xffff) * 24 * 60 // 24 hours in a day, 60 minutes in an hour
4387            + (dateInput.getHours() & 0xff) * 60 // 60 minutes in an hour
4388            + (dateInput.getMinutes() & 0xff)
4389        ) | 0) * 60 * 1000 // 60 seconds in a minute * 1000 milliseconds in a second
4390        - (dateInput.getSeconds() & 0xff) * 1000 // 1000 milliseconds in a second
4391        - dateInput.getMilliseconds()
4392    );
4393     */
4394
4395    if (dateInput.isDST()) {
4396      offsetDst = 60 * 60 * 1000;
4397    }
4398
4399    let tzOffset = dateInput.getTimezoneOffset() * 60 * 1000;
4400    /*if (tzOffset < 0) {
4401        tzOffset = tzOffset + offsetDst;
4402    } else {
4403        tzOffset = tzOffset - offsetDst;
4404    }*/
4405
4406    return tzOffset;
4407  }
4408
4409  isMobile() {
4410    let check = false;
4411
4412    (function (a) {
4413      if (/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino/i.test(a) || /1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test(a.substr(0, 4))) check = true;
4414    })(navigator.userAgent || navigator.vendor || window.opera);
4415
4416    return check;
4417  }
4418
4419  inArray(arr, elem) {
4420    for (const key in arr) {
4421      if (arr[key] + "" === "" + elem) {
4422        return key;
4423      }
4424    }
4425
4426    return false;
4427  }
4428
4429  createHtmlTable(id, head, rows, footer) {
4430    let table = jQuery('<table id="' + id + '"></table>');
4431    let headTable = jQuery('<thead></thead>');
4432    let bodyTable = jQuery('<tbody></tbody>');
4433    let footerTable = jQuery('<tfoot></tfoot>');
4434    let rowHtml = jQuery('<tr></tr>');
4435
4436    for (const key in head) {
4437      let colspan = 1;
4438
4439      if (typeof head[key]['colspan'] !== 'undefined') {
4440        colspan = head[key]['colspan'];
4441      }
4442
4443      rowHtml.append(jQuery('<th colspan="' + colspan + '">' + head[key]['label'] + '</th>'));
4444    }
4445
4446    headTable.append(rowHtml);
4447
4448    for (const key in rows) {
4449      let rowHtml = jQuery('<tr></tr>');
4450
4451      for (const col in rows[key]['columns']) {
4452        rowHtml.append(jQuery('<td>' + rows[key]['columns'][col] + '</td>'));
4453      }
4454
4455      bodyTable.append(rowHtml);
4456    }
4457
4458    let rowHtml1 = jQuery('<tr></tr>');
4459
4460    for (const key in footer) {
4461      let colspan = 1;
4462
4463      if (typeof footer[key]['colspan'] !== 'undefined') {
4464        colspan = footer[key]['colspan'];
4465      }
4466
4467      rowHtml1.append(jQuery('<td colspan="' + colspan + '">' + footer[key]['label'] + '</td>'));
4468    }
4469
4470    footerTable.append(rowHtml1);
4471    table.append(headTable).append(bodyTable).append(footerTable);
4472    return table;
4473  }
4474
4475  getTime(sDate, withTime = true) {
4476    //const d = getNormalDate(sDate);
4477    if (typeof sDate === 'object') {
4478      //sDate = this.createDateAsUTC(sDate).getTime();
4479      sDate = sDate.getTime();
4480    }
4481
4482    if (!withTime) {
4483      return sDate - sDate % 86400000;
4484    }
4485
4486    return sDate;
4487  }
4488
4489  isInViewport(elem) {
4490    let elementTop = elem.offset().top;
4491    let elementBottom = elementTop + elem.outerHeight();
4492    let viewportTop = jQuery(window).scrollTop();
4493    let viewportBottom = viewportTop + jQuery(window).height();
4494    return elementBottom > viewportTop && elementTop < viewportBottom;
4495  }
4496
4497  compare_asc(d1, d2) {
4498    if (typeof d1 === 'object') {
4499      d1 = this.getTime(d1);
4500    }
4501
4502    if (typeof d2 === 'object') {
4503      d2 = this.getTime(d2);
4504    }
4505
4506    if (d1 > d2) {
4507      return 1;
4508    }
4509
4510    if (d1 === d2) {
4511      return 0;
4512    }
4513
4514    if (d1 < d2) {
4515      return -1;
4516    }
4517  }
4518
4519  getPricing(el) {
4520    let pricing = el.data('pricing');
4521
4522    if (!pricing) {
4523      pricing = [];
4524    }
4525
4526    return pricing.slice(1, -1);
4527  }
4528
4529  getMaxSelectedSeats(el) {
4530    let maxSelected = el.data('maxselectedobjects');
4531
4532    if (!maxSelected) {
4533      maxSelected = [];
4534    }
4535
4536    return maxSelected.slice(1, -1);
4537  }
4538
4539  getNumberOfPlacesToSelect(el) {
4540    const qty = parseInt(el.data('numberofplacestoselect').slice(1, -1));
4541
4542    if (isNaN(qty)) {
4543      return 1;
4544    }
4545
4546    return qty;
4547  }
4548
4549  getWorkspace(el) {
4550    return el.data('workspacekey').slice(1, -1);
4551  }
4552
4553  getEventKey(el) {
4554    return el.data('eventkey').slice(1, -1);
4555  }
4556
4557}
4558
4559/* harmony default export */ __webpack_exports__["a"] = (RwbEventsFormModel);
4560
4561/***/ }),
4562/* 5 */
4563/***/ (function(module, __webpack_exports__, __webpack_require__) {
4564
4565"use strict";
4566class RwbEventsFormSpine {
4567  constructor() {
4568    this.btn = '.rwb-tickets-btn';
4569    this.seatChart = false;
4570    this.currentForm = null;
4571    this.selectedObjectChart = null;
4572    this.selectedEvent = null;
4573    this.eventList = null;
4574    this.calendar = null;
4575    this.selectedEventId = false;
4576    this.selectedeventPromotionsIds = false;
4577    this.selectedEventData = false;
4578    this.firstDateWithEvent = false;
4579    this.initPackPrice = false;
4580    this.ownPricingData = null;
4581    this.eventSeats = null;
4582    this.eventPromotions = null;
4583    this.seatAlertsAndTooltipsPerLabel = null;
4584    this.selectedPromoCode = false;
4585    this.selectedNumberOfTickets = 0;
4586    this.selectedLabels = false;
4587    this.fpsearch = false;
4588    this.myselectedObjects = [];
4589    this.scaltype = 'scalpop';
4590    this.scalcat = '0';
4591    this.cstart_date = '';
4592    this.cend_date = '';
4593    this.dselected = '';
4594  }
4595
4596  JDocument() {
4597    return $(document);
4598  }
4599
4600  JBtn() {
4601    return this.JForm().find(this.btn);
4602  }
4603
4604  JSeatQty() {
4605    return '<div id="divSeatsio"></div><div id="qtyTickets"></div><div id="cartButton"><a href="#" class="button btn buynow">Buy Now</a></div>';
4606  }
4607
4608  JSeatDiv() {
4609    return jQuery('#divSeatsio');
4610  }
4611
4612  JProductId() {
4613    return jQuery('button.single_add_to_cart_button').val();
4614  }
4615
4616  JBuyButton() {
4617    return jQuery('.tickets_cart .sbuynow');
4618  }
4619
4620  JRoomReserveButton() {
4621    return jQuery('.reserve-button');
4622  }
4623
4624  JIsAttraction() {
4625    if (jQuery('#has_attraction').length > 0) {
4626      return true;
4627    }
4628
4629    return false;
4630  }
4631
4632  JFreeSeating() {
4633    if (jQuery('#ris_free_seating').length > 0) {
4634      return true;
4635    }
4636
4637    return false;
4638  }
4639
4640  JAddToCartButton() {
4641    return jQuery('.tickets_cart .saddcart');
4642  }
4643
4644  JPriceBestSeats() {
4645    return jQuery('.price_best_seats');
4646  }
4647
4648  JZoneImage() {
4649    return jQuery('.attraction_zone_image.is_first');
4650  }
4651
4652  JIsRedeam() {
4653    return jQuery('.rwb_redeam').length > 0;
4654  }
4655
4656  JQtyTickets() {
4657    return jQuery('#qtyTickets');
4658  }
4659
4660  JQty() {
4661    return jQuery('#qtyTickets .qty_select');
4662  }
4663
4664  JBuyTickets() {
4665    return jQuery('.buy_tickets_seats').find('a');
4666  }
4667
4668  JFlatCalendar() {
4669    return jQuery('.flat_calendar');
4670  }
4671
4672  JFlatCalendarInput() {
4673    return jQuery('.flat_calendar').find('input');
4674  }
4675
4676  JEventsPerDate() {
4677    return jQuery('.events_per_date');
4678  }
4679
4680  JEventsPerDateBeforeText() {
4681    return jQuery('.event_selection_ticket_text');
4682  }
4683
4684  JEventSelection() {
4685    return jQuery('.event_selection_ticket');
4686  }
4687
4688  JPriceMapExplanation() {
4689    return jQuery('#price_map_explanation');
4690  }
4691
4692  JTicketsCart() {
4693    return jQuery('.event_selection_ticket .ticket_before_table_selected');
4694  }
4695
4696  JTicketsSelectedCart() {
4697    return jQuery('.tickets_cart .ticket_selected_cart');
4698  }
4699
4700  JTicketsButtonsCart() {
4701    return jQuery('.tickets_cart .ticket_buttons_cart');
4702  }
4703
4704  JTicketsChooser() {
4705    return jQuery('#ticket_chooser');
4706  }
4707
4708  JTicketsSelectedTable() {
4709    return jQuery('#tickets_selected');
4710  }
4711
4712  JTimeElem(event_id, time_val, dateStr, i) {
4713    return jQuery('<div class="time_elem" ev_pos="' + i + '" event_date="' + dateStr + '" event_hour="' + time_val + '" event_id="' + event_id + '">' + '<i class="slv slv-radio-unchecked"></i>' + time_val + '</div>');
4714  }
4715
4716  JSeatsMap() {
4717    return jQuery('#seats_map');
4718  }
4719
4720  JSearchButton() {
4721    return jQuery('.search-controls .search-button').first();
4722  }
4723
4724  JSearchButtonCalendar() {
4725    return jQuery('.search-controls .search-button-calendar').first();
4726  }
4727
4728  JPackButton() {
4729    return jQuery('.startpack-button');
4730  }
4731
4732  JDualDates() {
4733    if (jQuery('#ddualdates').length > 0) {
4734      return jQuery('#ddualdates');
4735    }
4736
4737    return false;
4738  }
4739
4740  JTheme() {
4741    if (jQuery('#spottheme').length > 0) {
4742      return jQuery('#spottheme').attr('theme');
4743    }
4744
4745    return 'dark';
4746  }
4747
4748  JGoToMonth() {
4749    if (jQuery('#gtmonth').length > 0) {
4750      return {
4751        'year': parseInt(jQuery('#gtmonth').attr('dyear')),
4752        'month': parseInt(jQuery('#gtmonth').attr('dmonth'))
4753      };
4754    }
4755
4756    return false;
4757  }
4758
4759  JBlankSeatsMap() {
4760    return jQuery('#blank_seats_map');
4761  }
4762
4763  JPriceMap() {
4764    return jQuery('#price_map');
4765  }
4766
4767  JPriceMapSeats() {
4768    return jQuery('#price_map_seats');
4769  }
4770
4771  JForm() {
4772    if (this.currentForm === null) {
4773      if (jQuery(this.form).parent().is('form')) {
4774        this.currentForm = jQuery(this.form).parent();
4775        return jQuery(this.form).parent();
4776      }
4777
4778      let mainForm = jQuery(this.form).nextAll('form').first();
4779
4780      if (mainForm.length > 0) {
4781        jQuery(this.form).prependTo(mainForm);
4782      } else {
4783        mainForm = jQuery('form.cart').first();
4784      }
4785
4786      this.currentForm = mainForm;
4787      return mainForm;
4788    } else {
4789      return this.currentForm;
4790    }
4791  }
4792
4793}
4794
4795/* harmony default export */ __webpack_exports__["a"] = (RwbEventsFormSpine);
4796
4797/***/ }),
4798/* 6 */
4799/***/ (function(module, exports, __webpack_require__) {
4800
4801/*!
4802* sweetalert2 v10.14.0
4803* Released under the MIT License.
4804*/
4805(function (global, factory) {
4806   true ? module.exports = factory() :
4807  typeof define === 'function' && define.amd ? define(factory) :
4808  (global = global || self, global.Sweetalert2 = factory());
4809}(this, function () { 'use strict';
4810
4811  function _typeof(obj) {
4812    "@babel/helpers - typeof";
4813
4814    if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") {
4815      _typeof = function (obj) {
4816        return typeof obj;
4817      };
4818    } else {
4819      _typeof = function (obj) {
4820        return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj;
4821      };
4822    }
4823
4824    return _typeof(obj);
4825  }
4826
4827  function _classCallCheck(instance, Constructor) {
4828    if (!(instance instanceof Constructor)) {
4829      throw new TypeError("Cannot call a class as a function");
4830    }
4831  }
4832
4833  function _defineProperties(target, props) {
4834    for (var i = 0; i < props.length; i++) {
4835      var descriptor = props[i];
4836      descriptor.enumerable = descriptor.enumerable || false;
4837      descriptor.configurable = true;
4838      if ("value" in descriptor) descriptor.writable = true;
4839      Object.defineProperty(target, descriptor.key, descriptor);
4840    }
4841  }
4842
4843  function _createClass(Constructor, protoProps, staticProps) {
4844    if (protoProps) _defineProperties(Constructor.prototype, protoProps);
4845    if (staticProps) _defineProperties(Constructor, staticProps);
4846    return Constructor;
4847  }
4848
4849  function _extends() {
4850    _extends = Object.assign || function (target) {
4851      for (var i = 1; i < arguments.length; i++) {
4852        var source = arguments[i];
4853
4854        for (var key in source) {
4855          if (Object.prototype.hasOwnProperty.call(source, key)) {
4856            target[key] = source[key];
4857          }
4858        }
4859      }
4860
4861      return target;
4862    };
4863
4864    return _extends.apply(this, arguments);
4865  }
4866
4867  function _inherits(subClass, superClass) {
4868    if (typeof superClass !== "function" && superClass !== null) {
4869      throw new TypeError("Super expression must either be null or a function");
4870    }
4871
4872    subClass.prototype = Object.create(superClass && superClass.prototype, {
4873      constructor: {
4874        value: subClass,
4875        writable: true,
4876        configurable: true
4877      }
4878    });
4879    if (superClass) _setPrototypeOf(subClass, superClass);
4880  }
4881
4882  function _getPrototypeOf(o) {
4883    _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) {
4884      return o.__proto__ || Object.getPrototypeOf(o);
4885    };
4886    return _getPrototypeOf(o);
4887  }
4888
4889  function _setPrototypeOf(o, p) {
4890    _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) {
4891      o.__proto__ = p;
4892      return o;
4893    };
4894
4895    return _setPrototypeOf(o, p);
4896  }
4897
4898  function _isNativeReflectConstruct() {
4899    if (typeof Reflect === "undefined" || !Reflect.construct) return false;
4900    if (Reflect.construct.sham) return false;
4901    if (typeof Proxy === "function") return true;
4902
4903    try {
4904      Date.prototype.toString.call(Reflect.construct(Date, [], function () {}));
4905      return true;
4906    } catch (e) {
4907      return false;
4908    }
4909  }
4910
4911  function _construct(Parent, args, Class) {
4912    if (_isNativeReflectConstruct()) {
4913      _construct = Reflect.construct;
4914    } else {
4915      _construct = function _construct(Parent, args, Class) {
4916        var a = [null];
4917        a.push.apply(a, args);
4918        var Constructor = Function.bind.apply(Parent, a);
4919        var instance = new Constructor();
4920        if (Class) _setPrototypeOf(instance, Class.prototype);
4921        return instance;
4922      };
4923    }
4924
4925    return _construct.apply(null, arguments);
4926  }
4927
4928  function _assertThisInitialized(self) {
4929    if (self === void 0) {
4930      throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
4931    }
4932
4933    return self;
4934  }
4935
4936  function _possibleConstructorReturn(self, call) {
4937    if (call && (typeof call === "object" || typeof call === "function")) {
4938      return call;
4939    }
4940
4941    return _assertThisInitialized(self);
4942  }
4943
4944  function _createSuper(Derived) {
4945    var hasNativeReflectConstruct = _isNativeReflectConstruct();
4946
4947    return function _createSuperInternal() {
4948      var Super = _getPrototypeOf(Derived),
4949          result;
4950
4951      if (hasNativeReflectConstruct) {
4952        var NewTarget = _getPrototypeOf(this).constructor;
4953
4954        result = Reflect.construct(Super, arguments, NewTarget);
4955      } else {
4956        result = Super.apply(this, arguments);
4957      }
4958
4959      return _possibleConstructorReturn(this, result);
4960    };
4961  }
4962
4963  function _superPropBase(object, property) {
4964    while (!Object.prototype.hasOwnProperty.call(object, property)) {
4965      object = _getPrototypeOf(object);
4966      if (object === null) break;
4967    }
4968
4969    return object;
4970  }
4971
4972  function _get(target, property, receiver) {
4973    if (typeof Reflect !== "undefined" && Reflect.get) {
4974      _get = Reflect.get;
4975    } else {
4976      _get = function _get(target, property, receiver) {
4977        var base = _superPropBase(target, property);
4978
4979        if (!base) return;
4980        var desc = Object.getOwnPropertyDescriptor(base, property);
4981
4982        if (desc.get) {
4983          return desc.get.call(receiver);
4984        }
4985
4986        return desc.value;
4987      };
4988    }
4989
4990    return _get(target, property, receiver || target);
4991  }
4992
4993  var consolePrefix = 'SweetAlert2:';
4994  /**
4995   * Filter the unique values into a new array
4996   * @param arr
4997   */
4998
4999  var uniqueArray = function uniqueArray(arr) {
5000    var result = [];
5001
5002    for (var i = 0; i < arr.length; i++) {
5003      if (result.indexOf(arr[i]) === -1) {
5004        result.push(arr[i]);
5005      }
5006    }
5007
5008    return result;
5009  };
5010  /**
5011   * Capitalize the first letter of a string
5012   * @param str
5013   */
5014
5015  var capitalizeFirstLetter = function capitalizeFirstLetter(str) {
5016    return str.charAt(0).toUpperCase() + str.slice(1);
5017  };
5018  /**
5019   * Returns the array of object values (Object.values isn't supported in IE11)
5020   * @param obj
5021   */
5022
5023  var objectValues = function objectValues(obj) {
5024    return Object.keys(obj).map(function (key) {
5025      return obj[key];
5026    });
5027  };
5028  /**
5029   * Convert NodeList to Array
5030   * @param nodeList
5031   */
5032
5033  var toArray = function toArray(nodeList) {
5034    return Array.prototype.slice.call(nodeList);
5035  };
5036  /**
5037   * Standardise console warnings
5038   * @param message
5039   */
5040
5041  var warn = function warn(message) {
5042    console.warn("".concat(consolePrefix, " ").concat(_typeof(message) === 'object' ? message.join(' ') : message));
5043  };
5044  /**
5045   * Standardise console errors
5046   * @param message
5047   */
5048
5049  var error = function error(message) {
5050    console.error("".concat(consolePrefix, " ").concat(message));
5051  };
5052  /**
5053   * Private global state for `warnOnce`
5054   * @type {Array}
5055   * @private
5056   */
5057
5058  var previousWarnOnceMessages = [];
5059  /**
5060   * Show a console warning, but only if it hasn't already been shown
5061   * @param message
5062   */
5063
5064  var warnOnce = function warnOnce(message) {
5065    if (!(previousWarnOnceMessages.indexOf(message) !== -1)) {
5066      previousWarnOnceMessages.push(message);
5067      warn(message);
5068    }
5069  };
5070  /**
5071   * Show a one-time console warning about deprecated params/methods
5072   */
5073
5074  var warnAboutDeprecation = function warnAboutDeprecation(deprecatedParam, useInstead) {
5075    warnOnce("\"".concat(deprecatedParam, "\" is deprecated and will be removed in the next major release. Please use \"").concat(useInstead, "\" instead."));
5076  };
5077  /**
5078   * If `arg` is a function, call it (with no arguments or context) and return the result.
5079   * Otherwise, just pass the value through
5080   * @param arg
5081   */
5082
5083  var callIfFunction = function callIfFunction(arg) {
5084    return typeof arg === 'function' ? arg() : arg;
5085  };
5086  var hasToPromiseFn = function hasToPromiseFn(arg) {
5087    return arg && typeof arg.toPromise === 'function';
5088  };
5089  var asPromise = function asPromise(arg) {
5090    return hasToPromiseFn(arg) ? arg.toPromise() : Promise.resolve(arg);
5091  };
5092  var isPromise = function isPromise(arg) {
5093    return arg && Promise.resolve(arg) === arg;
5094  };
5095
5096  var DismissReason = Object.freeze({
5097    cancel: 'cancel',
5098    backdrop: 'backdrop',
5099    close: 'close',
5100    esc: 'esc',
5101    timer: 'timer'
5102  });
5103
5104  var isJqueryElement = function isJqueryElement(elem) {
5105    return _typeof(elem) === 'object' && elem.jquery;
5106  };
5107
5108  var isElement = function isElement(elem) {
5109    return elem instanceof Element || isJqueryElement(elem);
5110  };
5111
5112  var argsToParams = function argsToParams(args) {
5113    var params = {};
5114
5115    if (_typeof(args[0]) === 'object' && !isElement(args[0])) {
5116      _extends(params, args[0]);
5117    } else {
5118      ['title', 'html', 'icon'].forEach(function (name, index) {
5119        var arg = args[index];
5120
5121        if (typeof arg === 'string' || isElement(arg)) {
5122          params[name] = arg;
5123        } else if (arg !== undefined) {
5124          error("Unexpected type of ".concat(name, "! Expected \"string\" or \"Element\", got ").concat(_typeof(arg)));
5125        }
5126      });
5127    }
5128
5129    return params;
5130  };
5131
5132  var swalPrefix = 'swal2-';
5133  var prefix = function prefix(items) {
5134    var result = {};
5135
5136    for (var i in items) {
5137      result[items[i]] = swalPrefix + items[i];
5138    }
5139
5140    return result;
5141  };
5142  var swalClasses = prefix(['container', 'shown', 'height-auto', 'iosfix', 'popup', 'modal', 'no-backdrop', 'no-transition', 'toast', 'toast-shown', 'toast-column', 'show', 'hide', 'close', 'title', 'header', 'content', 'html-container', 'actions', 'confirm', 'deny', 'cancel', 'footer', 'icon', 'icon-content', 'image', 'input', 'file', 'range', 'select', 'radio', 'checkbox', 'label', 'textarea', 'inputerror', 'input-label', 'validation-message', 'progress-steps', 'active-progress-step', 'progress-step', 'progress-step-line', 'loader', 'loading', 'styled', 'top', 'top-start', 'top-end', 'top-left', 'top-right', 'center', 'center-start', 'center-end', 'center-left', 'center-right', 'bottom', 'bottom-start', 'bottom-end', 'bottom-left', 'bottom-right', 'grow-row', 'grow-column', 'grow-fullscreen', 'rtl', 'timer-progress-bar', 'timer-progress-bar-container', 'scrollbar-measure', 'icon-success', 'icon-warning', 'icon-info', 'icon-question', 'icon-error']);
5143  var iconTypes = prefix(['success', 'warning', 'info', 'question', 'error']);
5144
5145  var getContainer = function getContainer() {
5146    return document.body.querySelector(".".concat(swalClasses.container));
5147  };
5148  var elementBySelector = function elementBySelector(selectorString) {
5149    var container = getContainer();
5150    return container ? container.querySelector(selectorString) : null;
5151  };
5152
5153  var elementByClass = function elementByClass(className) {
5154    return elementBySelector(".".concat(className));
5155  };
5156
5157  var getPopup = function getPopup() {
5158    return elementByClass(swalClasses.popup);
5159  };
5160  var getIcons = function getIcons() {
5161    var popup = getPopup();
5162    return toArray(popup.querySelectorAll(".".concat(swalClasses.icon)));
5163  };
5164  var getIcon = function getIcon() {
5165    var visibleIcon = getIcons().filter(function (icon) {
5166      return isVisible(icon);
5167    });
5168    return visibleIcon.length ? visibleIcon[0] : null;
5169  };
5170  var getTitle = function getTitle() {
5171    return elementByClass(swalClasses.title);
5172  };
5173  var getContent = function getContent() {
5174    return elementByClass(swalClasses.content);
5175  };
5176  var getHtmlContainer = function getHtmlContainer() {
5177    return elementByClass(swalClasses['html-container']);
5178  };
5179  var getImage = function getImage() {
5180    return elementByClass(swalClasses.image);
5181  };
5182  var getProgressSteps = function getProgressSteps() {
5183    return elementByClass(swalClasses['progress-steps']);
5184  };
5185  var getValidationMessage = function getValidationMessage() {
5186    return elementByClass(swalClasses['validation-message']);
5187  };
5188  var getConfirmButton = function getConfirmButton() {
5189    return elementBySelector(".".concat(swalClasses.actions, " .").concat(swalClasses.confirm));
5190  };
5191  var getDenyButton = function getDenyButton() {
5192    return elementBySelector(".".concat(swalClasses.actions, " .").concat(swalClasses.deny));
5193  };
5194  var getInputLabel = function getInputLabel() {
5195    return elementByClass(swalClasses['input-label']);
5196  };
5197  var getLoader = function getLoader() {
5198    return elementBySelector(".".concat(swalClasses.loader));
5199  };
5200  var getCancelButton = function getCancelButton() {
5201    return elementBySelector(".".concat(swalClasses.actions, " .").concat(swalClasses.cancel));
5202  };
5203  var getActions = function getActions() {
5204    return elementByClass(swalClasses.actions);
5205  };
5206  var getHeader = function getHeader() {
5207    return elementByClass(swalClasses.header);
5208  };
5209  var getFooter = function getFooter() {
5210    return elementByClass(swalClasses.footer);
5211  };
5212  var getTimerProgressBar = function getTimerProgressBar() {
5213    return elementByClass(swalClasses['timer-progress-bar']);
5214  };
5215  var getCloseButton = function getCloseButton() {
5216    return elementByClass(swalClasses.close);
5217  }; // https://github.com/jkup/focusable/blob/master/index.js
5218
5219  var focusable = "\n  a[href],\n  area[href],\n  input:not([disabled]),\n  select:not([disabled]),\n  textarea:not([disabled]),\n  button:not([disabled]),\n  iframe,\n  object,\n  embed,\n  [tabindex=\"0\"],\n  [contenteditable],\n  audio[controls],\n  video[controls],\n  summary\n";
5220  var getFocusableElements = function getFocusableElements() {
5221    var focusableElementsWithTabindex = toArray(getPopup().querySelectorAll('[tabindex]:not
5221([tabindex="-1"]):not([tabindex="0"])')) // sort according to tabindex
5222    .sort(function (a, b) {
5223      a = parseInt(a.getAttribute('tabindex'));
5224      b = parseInt(b.getAttribute('tabindex'));
5225
5226      if (a > b) {
5227        return 1;
5228      } else if (a < b) {
5229        return -1;
5230      }
5231
5232      return 0;
5233    });
5234    var otherFocusableElements = toArray(getPopup().querySelectorAll(focusable)).filter(function (el) {
5235      return el.getAttribute('tabindex') !== '-1';
5236    });
5237    return uniqueArray(focusableElementsWithTabindex.concat(otherFocusableElements)).filter(function (el) {
5238      return isVisible(el);
5239    });
5240  };
5241  var isModal = function isModal() {
5242    return !isToast() && !document.body.classList.contains(swalClasses['no-backdrop']);
5243  };
5244  var isToast = function isToast() {
5245    return document.body.classList.contains(swalClasses['toast-shown']);
5246  };
5247  var isLoading = function isLoading() {
5248    return getPopup().hasAttribute('data-loading');
5249  };
5250
5251  var states = {
5252    previousBodyPadding: null
5253  };
5254  var setInnerHtml = function setInnerHtml(elem, html) {
5255    // #1926
5256    elem.textContent = '';
5257
5258    if (html) {
5259      var parser = new DOMParser();
5260      var parsed = parser.parseFromString(html, "text/html");
5261      toArray(parsed.querySelector('head').childNodes).forEach(function (child) {
5262        elem.appendChild(child);
5263      });
5264      toArray(parsed.querySelector('body').childNodes).forEach(function (child) {
5265        elem.appendChild(child);
5266      });
5267    }
5268  };
5269  var hasClass = function hasClass(elem, className) {
5270    if (!className) {
5271      return false;
5272    }
5273
5274    var classList = className.split(/\s+/);
5275
5276    for (var i = 0; i < classList.length; i++) {
5277      if (!elem.classList.contains(classList[i])) {
5278        return false;
5279      }
5280    }
5281
5282    return true;
5283  };
5284
5285  var removeCustomClasses = function removeCustomClasses(elem, params) {
5286    toArray(elem.classList).forEach(function (className) {
5287      if (!(objectValues(swalClasses).indexOf(className) !== -1) && !(objectValues(iconTypes).indexOf(className) !== -1) && !(objectValues(params.showClass).indexOf(className) !== -1)) {
5288        elem.classList.remove(className);
5289      }
5290    });
5291  };
5292
5293  var applyCustomClass = function applyCustomClass(elem, params, className) {
5294    removeCustomClasses(elem, params);
5295
5296    if (params.customClass && params.customClass[className]) {
5297      if (typeof params.customClass[className] !== 'string' && !params.customClass[className].forEach) {
5298        return warn("Invalid type of customClass.".concat(className, "! Expected string or iterable object, got \"").concat(_typeof(params.customClass[className]), "\""));
5299      }
5300
5301      addClass(elem, params.customClass[className]);
5302    }
5303  };
5304  function getInput(content, inputType) {
5305    if (!inputType) {
5306      return null;
5307    }
5308
5309    switch (inputType) {
5310      case 'select':
5311      case 'textarea':
5312      case 'file':
5313        return getChildByClass(content, swalClasses[inputType]);
5314
5315      case 'checkbox':
5316        return content.querySelector(".".concat(swalClasses.checkbox, " input"));
5317
5318      case 'radio':
5319        return content.querySelector(".".concat(swalClasses.radio, " input:checked")) || content.querySelector(".".concat(swalClasses.radio, " input:first-child"));
5320
5321      case 'range':
5322        return content.querySelector(".".concat(swalClasses.range, " input"));
5323
5324      default:
5325        return getChildByClass(content, swalClasses.input);
5326    }
5327  }
5328  var focusInput = function focusInput(input) {
5329    input.focus(); // place cursor at end of text in text input
5330
5331    if (input.type !== 'file') {
5332      // http://stackoverflow.com/a/2345915
5333      var val = input.value;
5334      input.value = '';
5335      input.value = val;
5336    }
5337  };
5338  var toggleClass = function toggleClass(target, classList, condition) {
5339    if (!target || !classList) {
5340      return;
5341    }
5342
5343    if (typeof classList === 'string') {
5344      classList = classList.split(/\s+/).filter(Boolean);
5345    }
5346
5347    classList.forEach(function (className) {
5348      if (target.forEach) {
5349        target.forEach(function (elem) {
5350          condition ? elem.classList.add(className) : elem.classList.remove(className);
5351        });
5352      } else {
5353        condition ? target.classList.add(className) : target.classList.remove(className);
5354      }
5355    });
5356  };
5357  var addClass = function addClass(target, classList) {
5358    toggleClass(target, classList, true);
5359  };
5360  var removeClass = function removeClass(target, classList) {
5361    toggleClass(target, classList, false);
5362  };
5363  var getChildByClass = function getChildByClass(elem, className) {
5364    for (var i = 0; i < elem.childNodes.length; i++) {
5365      if (hasClass(elem.childNodes[i], className)) {
5366        return elem.childNodes[i];
5367      }
5368    }
5369  };
5370  var applyNumericalStyle = function applyNumericalStyle(elem, property, value) {
5371    if (value === "".concat(parseInt(value))) {
5372      value = parseInt(value);
5373    }
5374
5375    if (value || parseInt(value) === 0) {
5376      elem.style[property] = typeof value === 'number' ? "".concat(value, "px") : value;
5377    } else {
5378      elem.style.removeProperty(property);
5379    }
5380  };
5381  var show = function show(elem) {
5382    var display = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'flex';
5383    elem.style.display = display;
5384  };
5385  var hide = function hide(elem) {
5386    elem.style.display = 'none';
5387  };
5388  var setStyle = function setStyle(parent, selector, property, value) {
5389    var el = parent.querySelector(selector);
5390
5391    if (el) {
5392      el.style[property] = value;
5393    }
5394  };
5395  var toggle = function toggle(elem, condition, display) {
5396    condition ? show(elem, display) : hide(elem);
5397  }; // borrowed from jquery $(elem).is(':visible') implementation
5398
5399  var isVisible = function isVisible(elem) {
5400    return !!(elem && (elem.offsetWidth || elem.offsetHeight || elem.getClientRects().length));
5401  };
5402  var allButtonsAreHidden = function allButtonsAreHidden() {
5403    return !isVisible(getConfirmButton()) && !isVisible(getDenyButton()) && !isVisible(getCancelButton());
5404  };
5405  var isScrollable = function isScrollable(elem) {
5406    return !!(elem.scrollHeight > elem.clientHeight);
5407  }; // borrowed from https://stackoverflow.com/a/46352119
5408
5409  var hasCssAnimation = function hasCssAnimation(elem) {
5410    var style = window.getComputedStyle(elem);
5411    var animDuration = parseFloat(style.getPropertyValue('animation-duration') || '0');
5412    var transDuration = parseFloat(style.getPropertyValue('transition-duration') || '0');
5413    return animDuration > 0 || transDuration > 0;
5414  };
5415  var contains = function contains(haystack, needle) {
5416    if (typeof haystack.contains === 'function') {
5417      return haystack.contains(needle);
5418    }
5419  };
5420  var animateTimerProgressBar = function animateTimerProgressBar(timer) {
5421    var reset = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
5422    var timerProgressBar = getTimerProgressBar();
5423
5424    if (isVisible(timerProgressBar)) {
5425      if (reset) {
5426        timerProgressBar.style.transition = 'none';
5427        timerProgressBar.style.width = '100%';
5428      }
5429
5430      setTimeout(function () {
5431        timerProgressBar.style.transition = "width ".concat(timer / 1000, "s linear");
5432        timerProgressBar.style.width = '0%';
5433      }, 10);
5434    }
5435  };
5436  var stopTimerProgressBar = function stopTimerProgressBar() {
5437    var timerProgressBar = getTimerProgressBar();
5438    var timerProgressBarWidth = parseInt(window.getComputedStyle(timerProgressBar).width);
5439    timerProgressBar.style.removeProperty('transition');
5440    timerProgressBar.style.width = '100%';
5441    var timerProgressBarFullWidth = parseInt(window.getComputedStyle(timerProgressBar).width);
5442    var timerProgressBarPercent = parseInt(timerProgressBarWidth / timerProgressBarFullWidth * 100);
5443    timerProgressBar.style.removeProperty('transition');
5444    timerProgressBar.style.width = "".concat(timerProgressBarPercent, "%");
5445  };
5446
5447  // Detect Node env
5448  var isNodeEnv = function isNodeEnv() {
5449    return typeof window === 'undefined' || typeof document === 'undefined';
5450  };
5451
5452  var sweetHTML = "\n <div aria-labelledby=\"".concat(swalClasses.title, "\" aria-describedby=\"").concat(swalClasses.content, "\" class=\"").concat(swalClasses.popup, "\" tabindex=\"-1\">\n   <div class=\"").concat(swalClasses.header, "\">\n     <ul class=\"").concat(swalClasses['progress-steps'], "\"></ul>\n     <div class=\"").concat(swalClasses.icon, " ").concat(iconTypes.error, "\"></div>\n     <div class=\"").concat(swalClasses.icon, " ").concat(iconTypes.question, "\"></div>\n     <div class=\"").concat(swalClasses.icon, " ").concat(iconTypes.warning, "\"></div>\n     <div class=\"").concat(swalClasses.icon, " ").concat(iconTypes.info, "\"></div>\n     <div class=\"").concat(swalClasses.icon, " ").concat(iconTypes.success, "\"></div>\n     <img class=\"").concat(swalClasses.image, "\" />\n     <h2 class=\"").concat(swalClasses.title, "\" id=\"").concat(swalClasses.title, "\"></h2>\n     <button type=\"button\" class=\"").concat(swalClasses.close, "\"></button>\n   </div>\n   <div class=\"").concat(swalClasses.content, "\">\n     <div id=\"").concat(swalClasses.content, "\" class=\"").concat(swalClasses['html-container'], "\"></div>\n     <input class=\"").concat(swalClasses.input, "\" />\n     <input type=\"file\" class=\"").concat(swalClasses.file, "\" />\n     <div class=\"").concat(swalClasses.range, "\">\n       <input type=\"range\" />\n       <output></output>\n     </div>\n     <select class=\"").concat(swalClasses.select, "\"></select>\n     <div class=\"").concat(swalClasses.radio, "\"></div>\n     <label for=\"").concat(swalClasses.checkbox, "\" class=\"").concat(swalClasses.checkbox, "\">\n       <input type=\"checkbox\" />\n       <span class=\"").concat(swalClasses.label, "\"></span>\n     </label>\n     <textarea class=\"").concat(swalClasses.textarea, "\"></textarea>\n     <div class=\"").concat(swalClasses['validation-message'], "\" id=\"").concat(swalClasses['validation-message'], "\"></div>\n   </div>\n   <div class=\"").concat(swalClasses.actions, "\">\n     <div class=\"").concat(swalClasses.loader, "\"></div>\n     <button type=\"button\" class=\"").concat(swalClasses.confirm, "\"></button>\n     <button type=\"button\" class=\"").concat(swalClasses.deny, "\"></button>\n     <button type=\"button\" class=\"").concat(swalClasses.cancel, "\"></button>\n   </div>\n   <div class=\"").concat(swalClasses.footer, "\"></div>\n   <div class=\"").concat(swalClasses['timer-progress-bar-container'], "\">\n     <div class=\"").concat(swalClasses['timer-progress-bar'], "\"></div>\n   </div>\n </div>\n").replace(/(^|\n)\s*/g, '');
5453
5454  var resetOldContainer = function resetOldContainer() {
5455    var oldContainer = getContainer();
5456
5457    if (!oldContainer) {
5458      return false;
5459    }
5460
5461    oldContainer.parentNode.removeChild(oldContainer);
5462    removeClass([document.documentElement, document.body], [swalClasses['no-backdrop'], swalClasses['toast-shown'], swalClasses['has-column']]);
5463    return true;
5464  };
5465
5466  var oldInputVal; // IE11 workaround, see #1109 for details
5467
5468  var resetValidationMessage = function resetValidationMessage(e) {
5469    if (Swal.isVisible() && oldInputVal !== e.target.value) {
5470      Swal.resetValidationMessage();
5471    }
5472
5473    oldInputVal = e.target.value;
5474  };
5475
5476  var addInputChangeListeners = function addInputChangeListeners() {
5477    var content = getContent();
5478    var input = getChildByClass(content, swalClasses.input);
5479    var file = getChildByClass(content, swalClasses.file);
5480    var range = content.querySelector(".".concat(swalClasses.range, " input"));
5481    var rangeOutput = content.querySelector(".".concat(swalClasses.range, " output"));
5482    var select = getChildByClass(content, swalClasses.select);
5483    var checkbox = content.querySelector(".".concat(swalClasses.checkbox, " input"));
5484    var textarea = getChildByClass(content, swalClasses.textarea);
5485    input.oninput = resetValidationMessage;
5486    file.onchange = resetValidationMessage;
5487    select.onchange = resetValidationMessage;
5488    checkbox.onchange = resetValidationMessage;
5489    textarea.oninput = resetValidationMessage;
5490
5491    range.oninput = function (e) {
5492      resetValidationMessage(e);
5493      rangeOutput.value = range.value;
5494    };
5495
5496    range.onchange = function (e) {
5497      resetValidationMessage(e);
5498      range.nextSibling.value = range.value;
5499    };
5500  };
5501
5502  var getTarget = function getTarget(target) {
5503    return typeof target === 'string' ? document.querySelector(target) : target;
5504  };
5505
5506  var setupAccessibility = function setupAccessibility(params) {
5507    var popup = getPopup();
5508    popup.setAttribute('role', params.toast ? 'alert' : 'dialog');
5509    popup.setAttribute('aria-live', params.toast ? 'polite' : 'assertive');
5510
5511    if (!params.toast) {
5512      popup.setAttribute('aria-modal', 'true');
5513    }
5514  };
5515
5516  var setupRTL = function setupRTL(targetElement) {
5517    if (window.getComputedStyle(targetElement).direction === 'rtl') {
5518      addClass(getContainer(), swalClasses.rtl);
5519    }
5520  };
5521  /*
5522   * Add modal + backdrop to DOM
5523   */
5524
5525
5526  var init = function init(params) {
5527    // Clean up the old popup container if it exists
5528    var oldContainerExisted = resetOldContainer();
5529    /* istanbul ignore if */
5530
5531    if (isNodeEnv()) {
5532      error('SweetAlert2 requires document to initialize');
5533      return;
5534    }
5535
5536    var container = document.createElement('div');
5537    container.className = swalClasses.container;
5538
5539    if (oldContainerExisted) {
5540      addClass(container, swalClasses['no-transition']);
5541    }
5542
5543    setInnerHtml(container, sweetHTML);
5544    var targetElement = getTarget(params.target);
5545    targetElement.appendChild(container);
5546    setupAccessibility(params);
5547    setupRTL(targetElement);
5548    addInputChangeListeners();
5549  };
5550
5551  var parseHtmlToContainer = function parseHtmlToContainer(param, target) {
5552    // DOM element
5553    if (param instanceof HTMLElement) {
5554      target.appendChild(param); // Object
5555    } else if (_typeof(param) === 'object') {
5556      handleObject(param, target); // Plain string
5557    } else if (param) {
5558      setInnerHtml(target, param);
5559    }
5560  };
5561
5562  var handleObject = function handleObject(param, target) {
5563    // JQuery element(s)
5564    if (param.jquery) {
5565      handleJqueryElem(target, param); // For other objects use their string representation
5566    } else {
5567      setInnerHtml(target, param.toString());
5568    }
5569  };
5570
5571  var handleJqueryElem = function handleJqueryElem(target, elem) {
5572    target.textContent = '';
5573
5574    if (0 in elem) {
5575      for (var i = 0; (i in elem); i++) {
5576        target.appendChild(elem[i].cloneNode(true));
5577      }
5578    } else {
5579      target.appendChild(elem.cloneNode(true));
5580    }
5581  };
5582
5583  var animationEndEvent = function () {
5584    // Prevent run in Node env
5585
5586    /* istanbul ignore if */
5587    if (isNodeEnv()) {
5588      return false;
5589    }
5590
5591    var testEl = document.createElement('div');
5592    var transEndEventNames = {
5593      WebkitAnimation: 'webkitAnimationEnd',
5594      OAnimation: 'oAnimationEnd oanimationend',
5595      animation: 'animationend'
5596    };
5597
5598    for (var i in transEndEventNames) {
5599      if (Object.prototype.hasOwnProperty.call(transEndEventNames, i) && typeof testEl.style[i] !== 'undefined') {
5600        return transEndEventNames[i];
5601      }
5602    }
5603
5604    return false;
5605  }();
5606
5607  // https://github.com/twbs/bootstrap/blob/master/js/src/modal.js
5608
5609  var measureScrollbar = function measureScrollbar() {
5610    var scrollDiv = document.createElement('div');
5611    scrollDiv.className = swalClasses['scrollbar-measure'];
5612    document.body.appendChild(scrollDiv);
5613    var scrollbarWidth = scrollDiv.getBoundingClientRect().width - scrollDiv.clientWidth;
5614    document.body.removeChild(scrollDiv);
5615    return scrollbarWidth;
5616  };
5617
5618  var renderActions = function renderActions(instance, params) {
5619    var actions = getActions();
5620    var loader = getLoader();
5621    var confirmButton = getConfirmButton();
5622    var denyButton = getDenyButton();
5623    var cancelButton = getCancelButton(); // Actions (buttons) wrapper
5624
5625    if (!params.showConfirmButton && !params.showDenyButton && !params.showCancelButton) {
5626      hide(actions);
5627    } // Custom class
5628
5629
5630    applyCustomClass(actions, params, 'actions'); // Render buttons
5631
5632    renderButton(confirmButton, 'confirm', params);
5633    renderButton(denyButton, 'deny', params);
5634    renderButton(cancelButton, 'cancel', params);
5635    handleButtonsStyling(confirmButton, denyButton, cancelButton, params);
5636
5637    if (params.reverseButtons) {
5638      actions.insertBefore(cancelButton, loader);
5639      actions.insertBefore(denyButton, loader);
5640      actions.insertBefore(confirmButton, loader);
5641    } // Loader
5642
5643
5644    setInnerHtml(loader, params.loaderHtml);
5645    applyCustomClass(loader, params, 'loader');
5646  };
5647
5648  function handleButtonsStyling(confirmButton, denyButton, cancelButton, params) {
5649    if (!params.buttonsStyling) {
5650      return removeClass([confirmButton, denyButton, cancelButton], swalClasses.styled);
5651    }
5652
5653    addClass([confirmButton, denyButton, cancelButton], swalClasses.styled); // Buttons background colors
5654
5655    if (params.confirmButtonColor) {
5656      confirmButton.style.backgroundColor = params.confirmButtonColor;
5657    }
5658
5659    if (params.denyButtonColor) {
5660      denyButton.style.backgroundColor = params.denyButtonColor;
5661    }
5662
5663    if (params.cancelButtonColor) {
5664      cancelButton.style.backgroundColor = params.cancelButtonColor;
5665    }
5666  }
5667
5668  function renderButton(button, buttonType, params) {
5669    toggle(button, params["show".concat(capitalizeFirstLetter(buttonType), "Button")], 'inline-block');
5670    setInnerHtml(button, params["".concat(buttonType, "ButtonText")]); // Set caption text
5671
5672    button.setAttribute('aria-label', params["".concat(buttonType, "ButtonAriaLabel")]); // ARIA label
5673    // Add buttons custom classes
5674
5675    button.className = swalClasses[buttonType];
5676    applyCustomClass(button, params, "".concat(buttonType, "Button"));
5677    addClass(button, params["".concat(buttonType, "ButtonClass")]);
5678  }
5679
5680  function handleBackdropParam(container, backdrop) {
5681    if (typeof backdrop === 'string') {
5682      container.style.background = backdrop;
5683    } else if (!backdrop) {
5684      addClass([document.documentElement, document.body], swalClasses['no-backdrop']);
5685    }
5686  }
5687
5688  function handlePositionParam(container, position) {
5689    if (position in swalClasses) {
5690      addClass(container, swalClasses[position]);
5691    } else {
5692      warn('The "position" parameter is not valid, defaulting to "center"');
5693      addClass(container, swalClasses.center);
5694    }
5695  }
5696
5697  function handleGrowParam(container, grow) {
5698    if (grow && typeof grow === 'string') {
5699      var growClass = "grow-".concat(grow);
5700
5701      if (growClass in swalClasses) {
5702        addClass(container, swalClasses[growClass]);
5703      }
5704    }
5705  }
5706
5707  var renderContainer = function renderContainer(instance, params) {
5708    var container = getContainer();
5709
5710    if (!container) {
5711      return;
5712    }
5713
5714    handleBackdropParam(container, params.backdrop);
5715
5716    if (!params.backdrop && params.allowOutsideClick) {
5717      warn('"allowOutsideClick" parameter requires `backdrop` parameter to be set to `true`');
5718    }
5719
5720    handlePositionParam(container, params.position);
5721    handleGrowParam(container, params.grow); // Custom class
5722
5723    applyCustomClass(container, params, 'container'); // Set queue step attribute for getQueueStep() method
5724
5725    var queueStep = document.body.getAttribute('data-swal2-queue-step');
5726
5727    if (queueStep) {
5728      container.setAttribute('data-queue-step', queueStep);
5729      document.body.removeAttribute('data-swal2-queue-step');
5730    }
5731  };
5732
5733  /**
5734   * This module containts `WeakMap`s for each effectively-"private  property" that a `Swal` has.
5735   * For example, to set the private property "foo" of `this` to "bar", you can `privateProps.foo.set(this, 'bar')`
5736   * This is the approach that Babel will probably take to implement private methods/fields
5737   *   https://github.com/tc39/proposal-private-methods
5738   *   https://github.com/babel/babel/pull/7555
5739   * Once we have the changes from that PR in Babel, and our core class fits reasonable in *one module*
5740   *   then we can use that language feature.
5741   */
5742  var privateProps = {
5743    promise: new WeakMap(),
5744    innerParams: new WeakMap(),
5745    domCache: new WeakMap()
5746  };
5747
5748  var inputTypes = ['input', 'file', 'range', 'select', 'radio', 'checkbox', 'textarea'];
5749  var renderInput = function renderInput(instance, params) {
5750    var content = getContent();
5751    var innerParams = privateProps.innerParams.get(instance);
5752    var rerender = !innerParams || params.input !== innerParams.input;
5753    inputTypes.forEach(function (inputType) {
5754      var inputClass = swalClasses[inputType];
5755      var inputContainer = getChildByClass(content, inputClass); // set attributes
5756
5757      setAttributes(inputType, params.inputAttributes); // set class
5758
5759      inputContainer.className = inputClass;
5760
5761      if (rerender) {
5762        hide(inputContainer);
5763      }
5764    });
5765
5766    if (params.input) {
5767      if (rerender) {
5768        showInput(params);
5769      } // set custom class
5770
5771
5772      setCustomClass(params);
5773    }
5774  };
5775
5776  var showInput = function showInput(params) {
5777    if (!renderInputType[params.input]) {
5778      return error("Unexpected type of input! Expected \"text\", \"email\", \"password\", \"number\", \"tel\", \"select\", \"radio\", \"checkbox\", \"textarea\", \"file\" or \"url\", got \"".concat(params.input, "\""));
5779    }
5780
5781    var inputContainer = getInputContainer(params.input);
5782    var input = renderInputType[params.input](inputContainer, params);
5783    show(input); // input autofocus
5784
5785    setTimeout(function () {
5786      focusInput(input);
5787    });
5788  };
5789
5790  var removeAttributes = function removeAttributes(input) {
5791    for (var i = 0; i < input.attributes.length; i++) {
5792      var attrName = input.attributes[i].name;
5793
5794      if (!(['type', 'value', 'style'].indexOf(attrName) !== -1)) {
5795        input.removeAttribute(attrName);
5796      }
5797    }
5798  };
5799
5800  var setAttributes = function setAttributes(inputType, inputAttributes) {
5801    var input = getInput(getContent(), inputType);
5802
5803    if (!input) {
5804      return;
5805    }
5806
5807    removeAttributes(input);
5808
5809    for (var attr in inputAttributes) {
5810      // Do not set a placeholder for <input type="range">
5811      // it'll crash Edge, #1298
5812      if (inputType === 'range' && attr === 'placeholder') {
5813        continue;
5814      }
5815
5816      input.setAttribute(attr, inputAttributes[attr]);
5817    }
5818  };
5819
5820  var setCustomClass = function setCustomClass(params) {
5821    var inputContainer = getInputContainer(params.input);
5822
5823    if (params.customClass) {
5824      addClass(inputContainer, params.customClass.input);
5825    }
5826  };
5827
5828  var setInputPlaceholder = function setInputPlaceholder(input, params) {
5829    if (!input.placeholder || params.inputPlaceholder) {
5830      input.placeholder = params.inputPlaceholder;
5831    }
5832  };
5833
5834  var setInputLabel = function setInputLabel(input, prependTo, params) {
5835    if (params.inputLabel) {
5836      input.id = swalClasses.input;
5837      var label = document.createElement('label');
5838      var labelClass = swalClasses['input-label'];
5839      label.setAttribute('for', input.id);
5840      label.className = labelClass;
5841      addClass(label, params.customClass.inputLabel);
5842      label.innerText = params.inputLabel;
5843      prependTo.insertAdjacentElement('beforebegin', label);
5844    }
5845  };
5846
5847  var getInputContainer = function getInputContainer(inputType) {
5848    var inputClass = swalClasses[inputType] ? swalClasses[inputType] : swalClasses.input;
5849    return getChildByClass(getContent(), inputClass);
5850  };
5851
5852  var renderInputType = {};
5853
5854  renderInputType.text = renderInputType.email = renderInputType.password = renderInputType.number = renderInputType.tel = renderInputType.url = function (input, params) {
5855    if (typeof params.inputValue === 'string' || typeof params.inputValue === 'number') {
5856      input.value = params.inputValue;
5857    } else if (!isPromise(params.inputValue)) {
5858      warn("Unexpected type of inputValue! Expected \"string\", \"number\" or \"Promise\", got \"".concat(_typeof(params.inputValue), "\""));
5859    }
5860
5861    setInputLabel(input, input, params);
5862    setInputPlaceholder(input, params);
5863    input.type = params.input;
5864    return input;
5865  };
5866
5867  renderInputType.file = function (input, params) {
5868    setInputLabel(input, input, params);
5869    setInputPlaceholder(input, params);
5870    return input;
5871  };
5872
5873  renderInputType.range = function (range, params) {
5874    var rangeInput = range.querySelector('input');
5875    var rangeOutput = range.querySelector('output');
5876    rangeInput.value = params.inputValue;
5877    rangeInput.type = params.input;
5878    rangeOutput.value = params.inputValue;
5879    setInputLabel(rangeInput, range, params);
5880    return range;
5881  };
5882
5883  renderInputType.select = function (select, params) {
5884    select.textContent = '';
5885
5886    if (params.inputPlaceholder) {
5887      var placeholder = document.createElement('option');
5888      setInnerHtml(placeholder, params.inputPlaceholder);
5889      placeholder.value = '';
5890      placeholder.disabled = true;
5891      placeholder.selected = true;
5892      select.appendChild(placeholder);
5893    }
5894
5895    setInputLabel(select, select, params);
5896    return select;
5897  };
5898
5899  renderInputType.radio = function (radio) {
5900    radio.textContent = '';
5901    return radio;
5902  };
5903
5904  renderInputType.checkbox = function (checkboxContainer, params) {
5905    var checkbox = getInput(getContent(), 'checkbox');
5906    checkbox.value = 1;
5907    checkbox.id = swalClasses.checkbox;
5908    checkbox.checked = Boolean(params.inputValue);
5909    var label = checkboxContainer.querySelector('span');
5910    setInnerHtml(label, params.inputPlaceholder);
5911    return checkboxContainer;
5912  };
5913
5914  renderInputType.textarea = function (textarea, params) {
5915    textarea.value = params.inputValue;
5916    setInputPlaceholder(textarea, params);
5917    setInputLabel(textarea, textarea, params);
5918
5919    var getPadding = function getPadding(el) {
5920      return parseInt(window.getComputedStyle(el).paddingLeft) + parseInt(window.getComputedStyle(el).paddingRight);
5921    };
5922
5923    if ('MutationObserver' in window) {
5924      // #1699
5925      var initialPopupWidth = parseInt(window.getComputedStyle(getPopup()).width);
5926
5927      var outputsize = function outputsize() {
5928        var contentWidth = textarea.offsetWidth + getPadding(getPopup()) + getPadding(getContent());
5929
5930        if (contentWidth > initialPopupWidth) {
5931          getPopup().style.width = "".concat(contentWidth, "px");
5932        } else {
5933          getPopup().style.width = null;
5934        }
5935      };
5936
5937      new MutationObserver(outputsize).observe(textarea, {
5938        attributes: true,
5939        attributeFilter: ['style']
5940      });
5941    }
5942
5943    return textarea;
5944  };
5945
5946  var renderContent = function renderContent(instance, params) {
5947    var content = getContent().querySelector("#".concat(swalClasses.content)); // Content as HTML
5948
5949    if (params.html) {
5950      parseHtmlToContainer(params.html, content);
5951      show(content, 'block'); // Content as plain text
5952    } else if (params.text) {
5953      content.textContent = params.text;
5954      show(content, 'block'); // No content
5955    } else {
5956      hide(content);
5957    }
5958
5959    renderInput(instance, params); // Custom class
5960
5961    applyCustomClass(getContent(), params, 'content');
5962  };
5963
5964  var renderFooter = function renderFooter(instance, params) {
5965    var footer = getFooter();
5966    toggle(footer, params.footer);
5967
5968    if (params.footer) {
5969      parseHtmlToContainer(params.footer, footer);
5970    } // Custom class
5971
5972
5973    applyCustomClass(footer, params, 'footer');
5974  };
5975
5976  var renderCloseButton = function renderCloseButton(instance, params) {
5977    var closeButton = getCloseButton();
5978    setInnerHtml(closeButton, params.closeButtonHtml); // Custom class
5979
5980    applyCustomClass(closeButton, params, 'closeButton');
5981    toggle(closeButton, params.showCloseButton);
5982    closeButton.setAttribute('aria-label', params.closeButtonAriaLabel);
5983  };
5984
5985  var renderIcon = function renderIcon(instance, params) {
5986    var innerParams = privateProps.innerParams.get(instance); // if the given icon already rendered, apply the styling without re-rendering the icon
5987
5988    if (innerParams && params.icon === innerParams.icon && getIcon()) {
5989      applyStyles(getIcon(), params);
5990      return;
5991    }
5992
5993    hideAllIcons();
5994
5995    if (!params.icon) {
5996      return;
5997    }
5998
5999    if (Object.keys(iconTypes).indexOf(params.icon) !== -1) {
6000      var icon = elementBySelector(".".concat(swalClasses.icon, ".").concat(iconTypes[params.icon]));
6001      show(icon); // Custom or default content
6002
6003      setContent(icon, params);
6004      applyStyles(icon, params); // Animate icon
6005
6006      addClass(icon, params.showClass.icon);
6007    } else {
6008      error("Unknown icon! Expected \"success\", \"error\", \"warning\", \"info\" or \"question\", got \"".concat(params.icon, "\""));
6009    }
6010  };
6011
6012  var hideAllIcons = function hideAllIcons() {
6013    var icons = getIcons();
6014
6015    for (var i = 0; i < icons.length; i++) {
6016      hide(icons[i]);
6017    }
6018  };
6019
6020  var applyStyles = function applyStyles(icon, params) {
6021    // Icon color
6022    setColor(icon, params); // Success icon background color
6023
6024    adjustSuccessIconBackgoundColor(); // Custom class
6025
6026    applyCustomClass(icon, params, 'icon');
6027  }; // Adjust success icon background color to match the popup background color
6028
6029
6030  var adjustSuccessIconBackgoundColor = function adjustSuccessIconBackgoundColor() {
6031    var popup = getPopup();
6032    var popupBackgroundColor = window.getComputedStyle(popup).getPropertyValue('background-color');
6033    var successIconParts = popup.querySelectorAll('[class^=swal2-success-circular-line], .swal2-success-fix');
6034
6035    for (var i = 0; i < successIconParts.length; i++) {
6036      successIconParts[i].style.backgroundColor = popupBackgroundColor;
6037    }
6038  };
6039
6040  var setContent = function setContent(icon, params) {
6041    icon.textContent = '';
6042
6043    if (params.iconHtml) {
6044      setInnerHtml(icon, iconContent(params.iconHtml));
6045    } else if (params.icon === 'success') {
6046      setInnerHtml(icon, "\n      <div class=\"swal2-success-circular-line-left\"></div>\n      <span class=\"swal2-success-line-tip\"></span> <span class=\"swal2-success-line-long\"></span>\n      <div class=\"swal2-success-ring\"></div> <div class=\"swal2-success-fix\"></div>\n      <div class=\"swal2-success-circular-line-right\"></div>\n    ");
6047    } else if (params.icon === 'error') {
6048      setInnerHtml(icon, "\n      <span class=\"swal2-x-mark\">\n        <span class=\"swal2-x-mark-line-left\"></span>\n        <span class=\"swal2-x-mark-line-right\"></span>\n      </span>\n    ");
6049    } else {
6050      var defaultIconHtml = {
6051        question: '?',
6052        warning: '!',
6053        info: 'i'
6054      };
6055      setInnerHtml(icon, iconContent(defaultIconHtml[params.icon]));
6056    }
6057  };
6058
6059  var setColor = function setColor(icon, params) {
6060    if (!params.iconColor) {
6061      return;
6062    }
6063
6064    icon.style.color = params.iconColor;
6065    icon.style.borderColor = params.iconColor;
6066
6067    for (var _i = 0, _arr = ['.swal2-success-line-tip', '.swal2-success-line-long', '.swal2-x-mark-line-left', '.swal2-x-mark-line-right']; _i < _arr.length; _i++) {
6068      var sel = _arr[_i];
6069      setStyle(icon, sel, 'backgroundColor', params.iconColor);
6070    }
6071
6072    setStyle(icon, '.swal2-success-ring', 'borderColor', params.iconColor);
6073  };
6074
6075  var iconContent = function iconContent(content) {
6076    return "<div class=\"".concat(swalClasses['icon-content'], "\">").concat(content, "</div>");
6077  };
6078
6079  var renderImage = function renderImage(instance, params) {
6080    var image = getImage();
6081
6082    if (!params.imageUrl) {
6083      return hide(image);
6084    }
6085
6086    show(image, ''); // Src, alt
6087
6088    image.setAttribute('src', params.imageUrl);
6089    image.setAttribute('alt', params.imageAlt); // Width, height
6090
6091    applyNumericalStyle(image, 'width', params.imageWidth);
6092    applyNumericalStyle(image, 'height', params.imageHeight); // Class
6093
6094    image.className = swalClasses.image;
6095    applyCustomClass(image, params, 'image');
6096  };
6097
6098  var currentSteps = [];
6099  /*
6100   * Global function for chaining sweetAlert popups
6101   */
6102
6103  var queue = function queue(steps) {
6104    var Swal = this;
6105    currentSteps = steps;
6106
6107    var resetAndResolve = function resetAndResolve(resolve, value) {
6108      currentSteps = [];
6109      resolve(value);
6110    };
6111
6112    var queueResult = [];
6113    return new Promise(function (resolve) {
6114      (function step(i, callback) {
6115        if (i < currentSteps.length) {
6116          document.body.setAttribute('data-swal2-queue-step', i);
6117          Swal.fire(currentSteps[i]).then(function (result) {
6118            if (typeof result.value !== 'undefined') {
6119              queueResult.push(result.value);
6120              step(i + 1, callback);
6121            } else {
6122              resetAndResolve(resolve, {
6123                dismiss: result.dismiss
6124              });
6125            }
6126          });
6127        } else {
6128          resetAndResolve(resolve, {
6129            value: queueResult
6130          });
6131        }
6132      })(0);
6133    });
6134  };
6135  /*
6136   * Global function for getting the index of current popup in queue
6137   */
6138
6139  var getQueueStep = function getQueueStep() {
6140    return getContainer() && getContainer().getAttribute('data-queue-step');
6141  };
6142  /*
6143   * Global function for inserting a popup to the queue
6144   */
6145
6146  var insertQueueStep = function insertQueueStep(step, index) {
6147    if (index && index < currentSteps.length) {
6148      return currentSteps.splice(index, 0, step);
6149    }
6150
6151    return currentSteps.push(step);
6152  };
6153  /*
6154   * Global function for deleting a popup from the queue
6155   */
6156
6157  var deleteQueueStep = function deleteQueueStep(index) {
6158    if (typeof currentSteps[index] !== 'undefined') {
6159      currentSteps.splice(index, 1);
6160    }
6161  };
6162
6163  var createStepElement = function createStepElement(step) {
6164    var stepEl = document.createElement('li');
6165    addClass(stepEl, swalClasses['progress-step']);
6166    setInnerHtml(stepEl, step);
6167    return stepEl;
6168  };
6169
6170  var createLineElement = function createLineElement(params) {
6171    var lineEl = document.createElement('li');
6172    addClass(lineEl, swalClasses['progress-step-line']);
6173
6174    if (params.progressStepsDistance) {
6175      lineEl.style.width = params.progressStepsDistance;
6176    }
6177
6178    return lineEl;
6179  };
6180
6181  var renderProgressSteps = function renderProgressSteps(instance, params) {
6182    var progressStepsContainer = getProgressSteps();
6183
6184    if (!params.progressSteps || params.progressSteps.length === 0) {
6185      return hide(progressStepsContainer);
6186    }
6187
6188    show(progressStepsContainer);
6189    progressStepsContainer.textContent = '';
6190    var currentProgressStep = parseInt(params.currentProgressStep === undefined ? getQueueStep() : params.currentProgressStep);
6191
6192    if (currentProgressStep >= params.progressSteps.length) {
6193      warn('Invalid currentProgressStep parameter, it should be less than progressSteps.length ' + '(currentProgressStep like JS arrays starts from 0)');
6194    }
6195
6196    params.progressSteps.forEach(function (step, index) {
6197      var stepEl = createStepElement(step);
6198      progressStepsContainer.appendChild(stepEl);
6199
6200      if (index === currentProgressStep) {
6201        addClass(stepEl, swalClasses['active-progress-step']);
6202      }
6203
6204      if (index !== params.progressSteps.length - 1) {
6205        var lineEl = createLineElement(params);
6206        progressStepsContainer.appendChild(lineEl);
6207      }
6208    });
6209  };
6210
6211  var renderTitle = function renderTitle(instance, params) {
6212    var title = getTitle();
6213    toggle(title, params.title || params.titleText);
6214
6215    if (params.title) {
6216      parseHtmlToContainer(params.title, title);
6217    }
6218
6219    if (params.titleText) {
6220      title.innerText = params.titleText;
6221    } // Custom class
6222
6223
6224    applyCustomClass(title, params, 'title');
6225  };
6226
6227  var renderHeader = function renderHeader(instance, params) {
6228    var header = getHeader(); // Custom class
6229
6230    applyCustomClass(header, params, 'header'); // Progress steps
6231
6232    renderProgressSteps(instance, params); // Icon
6233
6234    renderIcon(instance, params); // Image
6235
6236    renderImage(instance, params); // Title
6237
6238    renderTitle(instance, params); // Close button
6239
6240    renderCloseButton(instance, params);
6241  };
6242
6243  var renderPopup = function renderPopup(instance, params) {
6244    var popup = getPopup(); // Width
6245
6246    applyNumericalStyle(popup, 'width', params.width); // Padding
6247
6248    applyNumericalStyle(popup, 'padding', params.padding);
6248 // Background
6249
6250    if (params.background) {
6251      popup.style.background = params.background;
6252    } // Classes
6253
6254
6255    addClasses(popup, params);
6256  };
6257
6258  var addClasses = function addClasses(popup, params) {
6259    // Default Class + showClass when updating Swal.update({})
6260    popup.className = "".concat(swalClasses.popup, " ").concat(isVisible(popup) ? params.showClass.popup : '');
6261
6262    if (params.toast) {
6263      addClass([document.documentElement, document.body], swalClasses['toast-shown']);
6264      addClass(popup, swalClasses.toast);
6265    } else {
6266      addClass(popup, swalClasses.modal);
6267    } // Custom class
6268
6269
6270    applyCustomClass(popup, params, 'popup');
6271
6272    if (typeof params.customClass === 'string') {
6273      addClass(popup, params.customClass);
6274    } // Icon class (#1842)
6275
6276
6277    if (params.icon) {
6278      addClass(popup, swalClasses["icon-".concat(params.icon)]);
6279    }
6280  };
6281
6282  var render = function render(instance, params) {
6283    renderPopup(instance, params);
6284    renderContainer(instance, params);
6285    renderHeader(instance, params);
6286    renderContent(instance, params);
6287    renderActions(instance, params);
6288    renderFooter(instance, params);
6289
6290    if (typeof params.didRender === 'function') {
6291      params.didRender(getPopup());
6292    } else if (typeof params.onRender === 'function') {
6293      params.onRender(getPopup()); // @deprecated
6294    }
6295  };
6296
6297  /*
6298   * Global function to determine if SweetAlert2 popup is shown
6299   */
6300
6301  var isVisible$1 = function isVisible$$1() {
6302    return isVisible(getPopup());
6303  };
6304  /*
6305   * Global function to click 'Confirm' button
6306   */
6307
6308  var clickConfirm = function clickConfirm() {
6309    return getConfirmButton() && getConfirmButton().click();
6310  };
6311  /*
6312   * Global function to click 'Deny' button
6313   */
6314
6315  var clickDeny = function clickDeny() {
6316    return getDenyButton() && getDenyButton().click();
6317  };
6318  /*
6319   * Global function to click 'Cancel' button
6320   */
6321
6322  var clickCancel = function clickCancel() {
6323    return getCancelButton() && getCancelButton().click();
6324  };
6325
6326  function fire() {
6327    var Swal = this;
6328
6329    for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
6330      args[_key] = arguments[_key];
6331    }
6332
6333    return _construct(Swal, args);
6334  }
6335
6336  /**
6337   * Returns an extended version of `Swal` containing `params` as defaults.
6338   * Useful for reusing Swal configuration.
6339   *
6340   * For example:
6341   *
6342   * Before:
6343   * const textPromptOptions = { input: 'text', showCancelButton: true }
6344   * const {value: firstName} = await Swal.fire({ ...textPromptOptions, title: 'What is your first name?' })
6345   * const {value: lastName} = await Swal.fire({ ...textPromptOptions, title: 'What is your last name?' })
6346   *
6347   * After:
6348   * const TextPrompt = Swal.mixin({ input: 'text', showCancelButton: true })
6349   * const {value: firstName} = await TextPrompt('What is your first name?')
6350   * const {value: lastName} = await TextPrompt('What is your last name?')
6351   *
6352   * @param mixinParams
6353   */
6354  function mixin(mixinParams) {
6355    var MixinSwal = /*#__PURE__*/function (_this) {
6356      _inherits(MixinSwal, _this);
6357
6358      var _super = _createSuper(MixinSwal);
6359
6360      function MixinSwal() {
6361        _classCallCheck(this, MixinSwal);
6362
6363        return _super.apply(this, arguments);
6364      }
6365
6366      _createClass(MixinSwal, [{
6367        key: "_main",
6368        value: function _main(params, prevMixinParams) {
6369          return _get(_getPrototypeOf(MixinSwal.prototype), "_main", this).call(this, params, _extends({}, prevMixinParams, mixinParams));
6370        }
6371      }]);
6372
6373      return MixinSwal;
6374    }(this);
6375
6376    return MixinSwal;
6377  }
6378
6379  /**
6380   * Shows loader (spinner), this is useful with AJAX requests.
6381   * By default the loader be shown instead of the "Confirm" button.
6382   */
6383
6384  var showLoading = function showLoading(buttonToReplace) {
6385    var popup = getPopup();
6386
6387    if (!popup) {
6388      Swal.fire();
6389    }
6390
6391    popup = getPopup();
6392    var actions = getActions();
6393    var loader = getLoader();
6394
6395    if (!buttonToReplace && isVisible(getConfirmButton())) {
6396      buttonToReplace = getConfirmButton();
6397    }
6398
6399    show(actions);
6400
6401    if (buttonToReplace) {
6402      hide(buttonToReplace);
6403      loader.setAttribute('data-button-to-replace', buttonToReplace.className);
6404    }
6405
6406    loader.parentNode.insertBefore(loader, buttonToReplace);
6407    addClass([popup, actions], swalClasses.loading);
6408    show(loader);
6409    popup.setAttribute('data-loading', true);
6410    popup.setAttribute('aria-busy', true);
6411    popup.focus();
6412  };
6413
6414  var RESTORE_FOCUS_TIMEOUT = 100;
6415
6416  var globalState = {};
6417
6418  var focusPreviousActiveElement = function focusPreviousActiveElement() {
6419    if (globalState.previousActiveElement && globalState.previousActiveElement.focus) {
6420      globalState.previousActiveElement.focus();
6421      globalState.previousActiveElement = null;
6422    } else if (document.body) {
6423      document.body.focus();
6424    }
6425  }; // Restore previous active (focused) element
6426
6427
6428  var restoreActiveElement = function restoreActiveElement() {
6429    return new Promise(function (resolve) {
6430      var x = window.scrollX;
6431      var y = window.scrollY;
6432      globalState.restoreFocusTimeout = setTimeout(function () {
6433        focusPreviousActiveElement();
6434        resolve();
6435      }, RESTORE_FOCUS_TIMEOUT); // issues/900
6436
6437      /* istanbul ignore if */
6438
6439      if (typeof x !== 'undefined' && typeof y !== 'undefined') {
6440        // IE doesn't have scrollX/scrollY support
6441        window.scrollTo(x, y);
6442      }
6443    });
6444  };
6445
6446  /**
6447   * If `timer` parameter is set, returns number of milliseconds of timer remained.
6448   * Otherwise, returns undefined.
6449   */
6450
6451  var getTimerLeft = function getTimerLeft() {
6452    return globalState.timeout && globalState.timeout.getTimerLeft();
6453  };
6454  /**
6455   * Stop timer. Returns number of milliseconds of timer remained.
6456   * If `timer` parameter isn't set, returns undefined.
6457   */
6458
6459  var stopTimer = function stopTimer() {
6460    if (globalState.timeout) {
6461      stopTimerProgressBar();
6462      return globalState.timeout.stop();
6463    }
6464  };
6465  /**
6466   * Resume timer. Returns number of milliseconds of timer remained.
6467   * If `timer` parameter isn't set, returns undefined.
6468   */
6469
6470  var resumeTimer = function resumeTimer() {
6471    if (globalState.timeout) {
6472      var remaining = globalState.timeout.start();
6473      animateTimerProgressBar(remaining);
6474      return remaining;
6475    }
6476  };
6477  /**
6478   * Resume timer. Returns number of milliseconds of timer remained.
6479   * If `timer` parameter isn't set, returns undefined.
6480   */
6481
6482  var toggleTimer = function toggleTimer() {
6483    var timer = globalState.timeout;
6484    return timer && (timer.running ? stopTimer() : resumeTimer());
6485  };
6486  /**
6487   * Increase timer. Returns number of milliseconds of an updated timer.
6488   * If `timer` parameter isn't set, returns undefined.
6489   */
6490
6491  var increaseTimer = function increaseTimer(n) {
6492    if (globalState.timeout) {
6493      var remaining = globalState.timeout.increase(n);
6494      animateTimerProgressBar(remaining, true);
6495      return remaining;
6496    }
6497  };
6498  /**
6499   * Check if timer is running. Returns true if timer is running
6500   * or false if timer is paused or stopped.
6501   * If `timer` parameter isn't set, returns undefined
6502   */
6503
6504  var isTimerRunning = function isTimerRunning() {
6505    return globalState.timeout && globalState.timeout.isRunning();
6506  };
6507
6508  var bodyClickListenerAdded = false;
6509  var clickHandlers = {};
6510  function bindClickHandler() {
6511    var attr = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 'data-swal-template';
6512    clickHandlers[attr] = this;
6513
6514    if (!bodyClickListenerAdded) {
6515      document.body.addEventListener('click', bodyClickListener);
6516      bodyClickListenerAdded = true;
6517    }
6518  }
6519
6520  var bodyClickListener = function bodyClickListener(event) {
6521    // 1. using .parentNode instead of event.path because of better support by old browsers https://stackoverflow.com/a/39245638
6522    // 2. using .parentNode instead of .parentElement because of IE11 + SVG https://stackoverflow.com/a/36270354
6523    for (var el = event.target; el && el !== document; el = el.parentNode) {
6524      for (var attr in clickHandlers) {
6525        var template = el.getAttribute(attr);
6526
6527        if (template) {
6528          clickHandlers[attr].fire({
6529            template: template
6530          });
6531          return;
6532        }
6533      }
6534    }
6535  };
6536
6537  var defaultParams = {
6538    title: '',
6539    titleText: '',
6540    text: '',
6541    html: '',
6542    footer: '',
6543    icon: undefined,
6544    iconColor: undefined,
6545    iconHtml: undefined,
6546    template: undefined,
6547    toast: false,
6548    animation: true,
6549    showClass: {
6550      popup: 'swal2-show',
6551      backdrop: 'swal2-backdrop-show',
6552      icon: 'swal2-icon-show'
6553    },
6554    hideClass: {
6555      popup: 'swal2-hide',
6556      backdrop: 'swal2-backdrop-hide',
6557      icon: 'swal2-icon-hide'
6558    },
6559    customClass: {},
6560    target: 'body',
6561    backdrop: true,
6562    heightAuto: true,
6563    allowOutsideClick: true,
6564    allowEscapeKey: true,
6565    allowEnterKey: true,
6566    stopKeydownPropagation: true,
6567    keydownListenerCapture: false,
6568    showConfirmButton: true,
6569    showDenyButton: false,
6570    showCancelButton: false,
6571    preConfirm: undefined,
6572    preDeny: undefined,
6573    confirmButtonText: 'OK',
6574    confirmButtonAriaLabel: '',
6575    confirmButtonColor: undefined,
6576    denyButtonText: 'No',
6577    denyButtonAriaLabel: '',
6578    denyButtonColor: undefined,
6579    cancelButtonText: 'Cancel',
6580    cancelButtonAriaLabel: '',
6581    cancelButtonColor: undefined,
6582    buttonsStyling: true,
6583    reverseButtons: false,
6584    focusConfirm: true,
6585    focusDeny: false,
6586    focusCancel: false,
6587    showCloseButton: false,
6588    closeButtonHtml: '&times;',
6589    closeButtonAriaLabel: 'Close this dialog',
6590    loaderHtml: '',
6591    showLoaderOnConfirm: false,
6592    showLoaderOnDeny: false,
6593    imageUrl: undefined,
6594    imageWidth: undefined,
6595    imageHeight: undefined,
6596    imageAlt: '',
6597    timer: undefined,
6598    timerProgressBar: false,
6599    width: undefined,
6600    padding: undefined,
6601    background: undefined,
6602    input: undefined,
6603    inputPlaceholder: '',
6604    inputLabel: '',
6605    inputValue: '',
6606    inputOptions: {},
6607    inputAutoTrim: true,
6608    inputAttributes: {},
6609    inputValidator: undefined,
6610    returnInputValueOnDeny: false,
6611    validationMessage: undefined,
6612    grow: false,
6613    position: 'center',
6614    progressSteps: [],
6615    currentProgressStep: undefined,
6616    progressStepsDistance: undefined,
6617    onBeforeOpen: undefined,
6618    onOpen: undefined,
6619    willOpen: undefined,
6620    didOpen: undefined,
6621    onRender: undefined,
6622    didRender: undefined,
6623    onClose: undefined,
6624    onAfterClose: undefined,
6625    willClose: undefined,
6626    didClose: undefined,
6627    onDestroy: undefined,
6628    didDestroy: undefined,
6629    scrollbarPadding: true
6630  };
6631  var updatableParams = ['allowEscapeKey', 'allowOutsideClick', 'background', 'buttonsStyling', 'cancelButtonAriaLabel', 'cancelButtonColor', 'cancelButtonText', 'closeButtonAriaLabel', 'closeButtonHtml', 'confirmButtonAriaLabel', 'confirmButtonColor', 'confirmButtonText', 'currentProgressStep', 'customClass', 'denyButtonAriaLabel', 'denyButtonColor', 'denyButtonText', 'didClose', 'didDestroy', 'footer', 'hideClass', 'html', 'icon', 'iconColor', 'imageAlt', 'imageHeight', 'imageUrl', 'imageWidth', 'onAfterClose', 'onClose', 'onDestroy', 'progressSteps', 'reverseButtons', 'showCancelButton', 'showCloseButton', 'showConfirmButton', 'showDenyButton', 'text', 'title', 'titleText', 'willClose'];
6632  var deprecatedParams = {
6633    animation: 'showClass" and "hideClass',
6634    onBeforeOpen: 'willOpen',
6635    onOpen: 'didOpen',
6636    onRender: 'didRender',
6637    onClose: 'willClose',
6638    onAfterClose: 'didClose',
6639    onDestroy: 'didDestroy'
6640  };
6641  var toastIncompatibleParams = ['allowOutsideClick', 'allowEnterKey', 'backdrop', 'focusConfirm', 'focusDeny', 'focusCancel', 'he
6641ightAuto', 'keydownListenerCapture'];
6642  /**
6643   * Is valid parameter
6644   * @param {String} paramName
6645   */
6646
6647  var isValidParameter = function isValidParameter(paramName) {
6648    return Object.prototype.hasOwnProperty.call(defaultParams, paramName);
6649  };
6650  /**
6651   * Is valid parameter for Swal.update() method
6652   * @param {String} paramName
6653   */
6654
6655  var isUpdatableParameter = function isUpdatableParameter(paramName) {
6656    return updatableParams.indexOf(paramName) !== -1;
6657  };
6658  /**
6659   * Is deprecated parameter
6660   * @param {String} paramName
6661   */
6662
6663  var isDeprecatedParameter = function isDeprecatedParameter(paramName) {
6664    return deprecatedParams[paramName];
6665  };
6666
6667  var checkIfParamIsValid = function checkIfParamIsValid(param) {
6668    if (!isValidParameter(param)) {
6669      warn("Unknown parameter \"".concat(param, "\""));
6670    }
6671  };
6672
6673  var checkIfToastParamIsValid = function checkIfToastParamIsValid(param) {
6674    if (toastIncompatibleParams.indexOf(param) !== -1) {
6675      warn("The parameter \"".concat(param, "\" is incompatible with toasts"));
6676    }
6677  };
6678
6679  var checkIfParamIsDeprecated = function checkIfParamIsDeprecated(param) {
6680    if (isDeprecatedParameter(param)) {
6681      warnAboutDeprecation(param, isDeprecatedParameter(param));
6682    }
6683  };
6684  /**
6685   * Show relevant warnings for given params
6686   *
6687   * @param params
6688   */
6689
6690
6691  var showWarningsForParams = function showWarningsForParams(params) {
6692    for (var param in params) {
6693      checkIfParamIsValid(param);
6694
6695      if (params.toast) {
6696        checkIfToastParamIsValid(param);
6697      }
6698
6699      checkIfParamIsDeprecated(param);
6700    }
6701  };
6702
6703
6704
6705  var staticMethods = /*#__PURE__*/Object.freeze({
6706    isValidParameter: isValidParameter,
6707    isUpdatableParameter: isUpdatableParameter,
6708    isDeprecatedParameter: isDeprecatedParameter,
6709    argsToParams: argsToParams,
6710    isVisible: isVisible$1,
6711    clickConfirm: clickConfirm,
6712    clickDeny: clickDeny,
6713    clickCancel: clickCancel,
6714    getContainer: getContainer,
6715    getPopup: getPopup,
6716    getTitle: getTitle,
6717    getContent: getContent,
6718    getHtmlContainer: getHtmlContainer,
6719    getImage: getImage,
6720    getIcon: getIcon,
6721    getIcons: getIcons,
6722    getInputLabel: getInputLabel,
6723    getCloseButton: getCloseButton,
6724    getActions: getActions,
6725    getConfirmButton: getConfirmButton,
6726    getDenyButton: getDenyButton,
6727    getCancelButton: getCancelButton,
6728    getLoader: getLoader,
6729    getHeader: getHeader,
6730    getFooter: getFooter,
6731    getTimerProgressBar: getTimerProgressBar,
6732    getFocusableElements: getFocusableElements,
6733    getValidationMessage: getValidationMessage,
6734    isLoading: isLoading,
6735    fire: fire,
6736    mixin: mixin,
6737    queue: queue,
6738    getQueueStep: getQueueStep,
6739    insertQueueStep: insertQueueStep,
6740    deleteQueueStep: deleteQueueStep,
6741    showLoading: showLoading,
6742    enableLoading: showLoading,
6743    getTimerLeft: getTimerLeft,
6744    stopTimer: stopTimer,
6745    resumeTimer: resumeTimer,
6746    toggleTimer: toggleTimer,
6747    increaseTimer: increaseTimer,
6748    isTimerRunning: isTimerRunning,
6749    bindClickHandler: bindClickHandler
6750  });
6751
6752  /**
6753   * Hides loader and shows back the button which was hidden by .showLoading()
6754   */
6755
6756  function hideLoading() {
6757    // do nothing if popup is closed
6758    var innerParams = privateProps.innerParams.get(this);
6759
6760    if (!innerParams) {
6761      return;
6762    }
6763
6764    var domCache = privateProps.domCache.get(this);
6765    hide(domCache.loader);
6766    var buttonToReplace = domCache.popup.getElementsByClassName(domCache.loader.getAttribute('data-button-to-replace'));
6767
6768    if (buttonToReplace.length) {
6769      show(buttonToReplace[0], 'inline-block');
6770    } else if (allButtonsAreHidden()) {
6771      hide(domCache.actions);
6772    }
6773
6774    removeClass([domCache.popup, domCache.actions], swalClasses.loading);
6775    domCache.popup.removeAttribute('aria-busy');
6776    domCache.popup.removeAttribute('data-loading');
6777    domCache.confirmButton.disabled = false;
6778    domCache.denyButton.disabled = false;
6779    domCache.cancelButton.disabled = false;
6780  }
6781
6782  function getInput$1(instance) {
6783    var innerParams = privateProps.innerParams.get(instance || this);
6784    var domCache = privateProps.domCache.get(instance || this);
6785
6786    if (!domCache) {
6787      return null;
6788    }
6789
6790    return getInput(domCache.content, innerParams.input);
6791  }
6792
6793  var fixScrollbar = function fixScrollbar() {
6794    // for queues, do not do this more than once
6795    if (states.previousBodyPadding !== null) {
6796      return;
6797    } // if the body has overflow
6798
6799
6800    if (document.body.scrollHeight > window.innerHeight) {
6801      // add padding so the content doesn't shift after removal of scrollbar
6802      states.previousBodyPadding = parseInt(window.getComputedStyle(document.body).getPropertyValue('padding-right'));
6803      document.body.style.paddingRight = "".concat(states.previousBodyPadding + measureScrollbar(), "px");
6804    }
6805  };
6806  var undoScrollbar = function undoScrollbar() {
6807    if (states.previousBodyPadding !== null) {
6808      document.body.style.paddingRight = "".concat(states.previousBodyPadding, "px");
6809      states.previousBodyPadding = null;
6810    }
6811  };
6812
6813  /* istanbul ignore file */
6814
6815  var iOSfix = function iOSfix() {
6816    var iOS = /iPad|iPhone|iPod/.test(navigator.userAgent) && !window.MSStream || navigator.platform === 'MacIntel' && navigator.maxTouchPoints > 1;
6817
6818    if (iOS && !hasClass(document.body, swalClasses.iosfix)) {
6819      var offset = document.body.scrollTop;
6820      document.body.style.top = "".concat(offset * -1, "px");
6821      addClass(document.body, swalClasses.iosfix);
6822      lockBodyScroll();
6823      addBottomPaddingForTallPopups(); // #1948
6824    }
6825  };
6826
6827  var addBottomPaddingForTallPopups = function addBottomPaddingForTallPopups() {
6828    var safari = !navigator.userAgent.match(/(CriOS|FxiOS|EdgiOS|YaBrowser|UCBrowser)/i);
6829
6830    if (safari) {
6831      var bottomPanelHeight = 44;
6832
6833      if (getPopup().scrollHeight > window.innerHeight - bottomPanelHeight) {
6834        getContainer().style.paddingBottom = "".concat(bottomPanelHeight, "px");
6835      }
6836    }
6837  };
6838
6839  var lockBodyScroll = function lockBodyScroll() {
6840    // #1246
6841    var container = getContainer();
6842    var preventTouchMove;
6843
6844    container.ontouchstart = function (e) {
6845      preventTouchMove = shouldPreventTouchMove(e);
6846    };
6847
6848    container.ontouchmove = function (e) {
6849      if (preventTouchMove) {
6850        e.preventDefault();
6851        e.stopPropagation();
6852      }
6853    };
6854  };
6855
6856  var shouldPreventTouchMove = function shouldPreventTouchMove(event) {
6857    var target = event.target;
6858    var container = getContainer();
6859
6860    if (isStylys(event) || isZoom(event)) {
6861      return false;
6862    }
6863
6864    if (target === container) {
6865      return true;
6866    }
6867
6868    if (!isScrollable(container) && target.tagName !== 'INPUT' && // #1603
6869    !(isScrollable(getContent()) && // #1944
6870    getContent().contains(target))) {
6871      return true;
6872    }
6873
6874    return false;
6875  };
6876
6877  var isStylys = function isStylys(event) {
6878    // #1786
6879    return event.touches && event.touches.length && event.touches[0].touchType === 'stylus';
6880  };
6881
6882  var isZoom = function isZoom(event) {
6883    // #1891
6884    return event.touches && event.touches.length > 1;
6885  };
6886
6887  var undoIOSfix = function undoIOSfix() {
6888    if (hasClass(document.body, swalClasses.iosfix)) {
6889      var offset = parseInt(document.body.style.top, 10);
6890      removeClass(document.body, swalClasses.iosfix);
6891      document.body.style.top = '';
6892      document.body.scrollTop = offset * -1;
6893    }
6894  };
6895
6896  /* istanbul ignore file */
6897
6898  var isIE11 = function isIE11() {
6899    return !!window.MSInputMethodContext && !!document.documentMode;
6900  }; // Fix IE11 centering sweetalert2/issues/933
6901
6902
6903  var fixVerticalPositionIE = function fixVerticalPositionIE() {
6904    var container = getContainer();
6905    var popup = getPopup();
6906    container.style.removeProperty('align-items');
6907
6908    if (popup.offsetTop < 0) {
6909      container.style.alignItems = 'flex-start';
6910    }
6911  };
6912
6913  var IEfix = function IEfix() {
6914    if (typeof window !== 'undefined' && isIE11()) {
6915      fixVerticalPositionIE();
6916      window.addEventListener('resize', fixVerticalPositionIE);
6917    }
6918  };
6919  var undoIEfix = function undoIEfix() {
6920    if (typeof window !== 'undefined' && isIE11()) {
6921      window.removeEventListener('resize', fixVerticalPositionIE);
6922    }
6923  };
6924
6925  // Adding aria-hidden="true" to elements outside of the active modal dialog ensures that
6926  // elements not within the active modal dialog will not be surfaced if a user opens a screen
6927  // reader’s list of elements (headings, form controls, landmarks, etc.) in the document.
6928
6929  var setAriaHidden = function setAriaHidden() {
6930    var bodyChildren = toArray(document.body.children);
6931    bodyChildren.forEach(function (el) {
6932      if (el === getContainer() || contains(el, getContainer())) {
6933        return;
6934      }
6935
6936      if (el.hasAttribute('aria-hidden')) {
6937        el.setAttribute('data-previous-aria-hidden', el.getAttribute('aria-hidden'));
6938      }
6939
6940      el.setAttribute('aria-hidden', 'true');
6941    });
6942  };
6943  var unsetAriaHidden = function unsetAriaHidden() {
6944    var bodyChildren = toArray(document.body.children);
6945    bodyChildren.forEach(function (el) {
6946      if (el.hasAttribute('data-previous-aria-hidden')) {
6947        el.setAttribute('aria-hidden', el.getAttribute('data-previous-aria-hidden'));
6948        el.removeAttribute('data-previous-aria-hidden');
6949      } else {
6950        el.removeAttribute('aria-hidden');
6951      }
6952    });
6953  };
6954
6955  /**
6956   * This module containts `WeakMap`s for each effectively-"private  property" that a `Swal` has.
6957   * For example, to set the private property "foo" of `this` to "bar", you can `privateProps.foo.set(this, 'bar')`
6958   * This is the approach that Babel will probably take to implement private methods/fields
6959   *   https://github.com/tc39/proposal-private-methods
6960   *   https://github.com/babel/babel/pull/7555
6961   * Once we have the changes from that PR in Babel, and our core class fits reasonable in *one module*
6962   *   then we can use that language feature.
6963   */
6964  var privateMethods = {
6965    swalPromiseResolve: new WeakMap()
6966  };
6967
6968  /*
6969   * Instance method to close sweetAlert
6970   */
6971
6972  function removePopupAndResetState(instance, container, isToast$$1, didClose) {
6973    if (isToast$$1) {
6974      triggerDidCloseAndDispose(instance, didClose);
6975    } else {
6976      restoreActiveElement().then(function () {
6977        return triggerDidCloseAndDispose(instance, didClose);
6978      });
6979      globalState.keydownTarget.removeEventListener('keydown', globalState.keydownHandler, {
6980        capture: globalState.keydownListenerCapture
6981      });
6982      globalState.keydownHandlerAdded = false;
6983    }
6984
6985    if (container.parentNode && !document.body.getAttribute('data-swal2-queue-step')) {
6986      container.parentNode.removeChild(container);
6987    }
6988
6989    if (isModal()) {
6990      undoScrollbar();
6991      undoIOSfix();
6992      undoIEfix();
6993      unsetAriaHidden();
6994    }
6995
6996    removeBodyClasses();
6997  }
6998
6999  function removeBodyClasses() {
7000    removeClass([document.documentElement, document.body], [swalClasses.shown, swalClasses['he
7000ight-auto'], swalClasses['no-backdrop'], swalClasses['toast-shown'], swalClasses['toast-column']]);
7001  }
7002
7003  function close(resolveValue) {
7004    var popup = getPopup();
7005
7006    if (!popup) {
7007      return;
7008    }
7009
7010    resolveValue = prepareResolveValue(resolveValue);
7011    var innerParams = privateProps.innerParams.get(this);
7012
7013    if (!innerParams || hasClass(popup, innerParams.hideClass.popup)) {
7014      return;
7015    }
7016
7017    var swalPromiseResolve = privateMethods.swalPromiseResolve.get(this);
7018    removeClass(popup, innerParams.showClass.popup);
7019    addClass(popup, innerParams.hideClass.popup);
7020    var backdrop = getContainer();
7021    removeClass(backdrop, innerParams.showClass.backdrop);
7022    addClass(backdrop, innerParams.hideClass.backdrop);
7023    handlePopupAnimation(this, popup, innerParams); // Resolve Swal promise
7024
7025    swalPromiseResolve(resolveValue);
7026  }
7027
7028  var prepareResolveValue = function prepareResolveValue(resolveValue) {
7029    // When user calls Swal.close()
7030    if (typeof resolveValue === 'undefined') {
7031      return {
7032        isConfirmed: false,
7033        isDenied: false,
7034        isDismissed: true
7035      };
7036    }
7037
7038    return _extends({
7039      isConfirmed: false,
7040      isDenied: false,
7041      isDismissed: false
7042    }, resolveValue);
7043  };
7044
7045  var handlePopupAnimation = function handlePopupAnimation(instance, popup, innerParams) {
7046    var container = getContainer(); // If animation is supported, animate
7047
7048    var animationIsSupported = animationEndEvent && hasCssAnimation(popup);
7049    var onClose = innerParams.onClose,
7050        onAfterClose = innerParams.onAfterClose,
7051        willClose = innerParams.willClose,
7052        didClose = innerParams.didClose;
7053    runDidClose(popup, willClose, onClose);
7054
7055    if (animationIsSupported) {
7056      animatePopup(instance, popup, container, didClose || onAfterClose);
7057    } else {
7058      // Otherwise, remove immediately
7059      removePopupAndResetState(instance, container, isToast(), didClose || onAfterClose);
7060    }
7061  };
7062
7063  var runDidClose = function runDidClose(popup, willClose, onClose) {
7064    if (willClose !== null && typeof willClose === 'function') {
7065      willClose(popup);
7066    } else if (onClose !== null && typeof onClose === 'function') {
7067      onClose(popup); // @deprecated
7068    }
7069  };
7070
7071  var animatePopup = function animatePopup(instance, popup, container, didClose) {
7072    globalState.swalCloseEventFinishedCallback = removePopupAndResetState.bind(null, instance, container, isToast(), didClose);
7073    popup.addEventListener(animationEndEvent, function (e) {
7074      if (e.target === popup) {
7075        globalState.swalCloseEventFinishedCallback();
7076        delete globalState.swalCloseEventFinishedCallback;
7077      }
7078    });
7079  };
7080
7081  var triggerDidCloseAndDispose = function triggerDidCloseAndDispose(instance, didClose) {
7082    setTimeout(function () {
7083      if (typeof didClose === 'function') {
7084        didClose();
7085      }
7086
7087      instance._destroy();
7088    });
7089  };
7090
7091  function setButtonsDisabled(instance, buttons, disabled) {
7092    var domCache = privateProps.domCache.get(instance);
7093    buttons.forEach(function (button) {
7094      domCache[button].disabled = disabled;
7095    });
7096  }
7097
7098  function setInputDisabled(input, disabled) {
7099    if (!input) {
7100      return false;
7101    }
7102
7103    if (input.type === 'radio') {
7104      var radiosContainer = input.parentNode.parentNode;
7105      var radios = radiosContainer.querySelectorAll('input');
7106
7107      for (var i = 0; i < radios.length; i++) {
7108        radios[i].disabled = disabled;
7109      }
7110    } else {
7111      input.disabled = disabled;
7112    }
7113  }
7114
7115  function enableButtons() {
7116    setButtonsDisabled(this, ['confirmButton', 'denyButton', 'cancelButton'], false);
7117  }
7118  function disableButtons() {
7119    setButtonsDisabled(this, ['confirmButton', 'denyButton', 'cancelButton'], true);
7120  }
7121  function enableInput() {
7122    return setInputDisabled(this.getInput(), false);
7123  }
7124  function disableInput() {
7125    return setInputDisabled(this.getInput(), true);
7126  }
7127
7128  function showValidationMessage(error) {
7129    var domCache = privateProps.domCache.get(this);
7130    var params = privateProps.innerParams.get(this);
7131    setInnerHtml(domCache.validationMessage, error);
7132    domCache.validationMessage.className = swalClasses['validation-message'];
7133
7134    if (params.customClass && params.customClass.validationMessage) {
7135      addClass(domCache.validationMessage, params.customClass.validationMessage);
7136    }
7137
7138    show(domCache.validationMessage);
7139    var input = this.getInput();
7140
7141    if (input) {
7142      input.setAttribute('aria-invalid', true);
7143      input.setAttribute('aria-describedBy', swalClasses['validation-message']);
7144      focusInput(input);
7145      addClass(input, swalClasses.inputerror);
7146    }
7147  } // Hide block with validation message
7148
7149  function resetValidationMessage$1() {
7150    var domCache = privateProps.domCache.get(this);
7151
7152    if (domCache.validationMessage) {
7153      hide(domCache.validationMessage);
7154    }
7155
7156    var input = this.getInput();
7157
7158    if (input) {
7159      input.removeAttribute('aria-invalid');
7160      input.removeAttribute('aria-describedBy');
7161      removeClass(input, swalClasses.inputerror);
7162    }
7163  }
7164
7165  function getProgressSteps$1() {
7166    var domCache = privateProps.domCache.get(this);
7167    return domCache.progressSteps;
7168  }
7169
7170  var Timer = /*#__PURE__*/function () {
7171    function Timer(callback, delay) {
7172      _classCallCheck(this, Timer);
7173
7174      this.callback = callback;
7175      this.remaining = delay;
7176      this.running = false;
7177      this.start();
7178    }
7179
7180    _createClass(Timer, [{
7181      key: "start",
7182      value: function start() {
7183        if (!this.running) {
7184          this.running = true;
7185          this.started = new Date();
7186          this.id = setTimeout(this.callback, this.remaining);
7187        }
7188
7189        return this.remaining;
7190      }
7191    }, {
7192      key: "stop",
7193      value: function stop() {
7194        if (this.running) {
7195          this.running = false;
7196          clearTimeout(this.id);
7197          this.remaining -= new Date() - this.started;
7198        }
7199
7200        return this.remaining;
7201      }
7202    }, {
7203      key: "increase",
7204      value: function increase(n) {
7205        var running = this.running;
7206
7207        if (running) {
7208          this.stop();
7209        }
7210
7211        this.remaining += n;
7212
7213        if (running) {
7214          this.start();
7215        }
7216
7217        return this.remaining;
7218      }
7219    }, {
7220      key: "getTimerLeft",
7221      value: function getTimerLeft() {
7222        if (this.running) {
7223          this.stop();
7224          this.start();
7225        }
7226
7227        return this.remaining;
7228      }
7229    }, {
7230      key: "isRunning",
7231      value: function isRunning() {
7232        return this.running;
7233      }
7234    }]);
7235
7236    return Timer;
7237  }();
7238
7239  var defaultInputValidators = {
7240    email: function email(string, validationMessage) {
7241      return /^[a-zA-Z0-9.+_-]+@[a-zA-Z0-9.-]+\.[a-zA-Z0-9-]{2,24}$/.test(string) ? Promise.resolve() : Promise.resolve(validationMessage || 'Invalid email address');
7242    },
7243    url: function url(string, validationMessage) {
7244      // taken from https://stackoverflow.com/a/3809435 with a small change from #1306 and #2013
7245      return /^https?:\/\/(www\.)?[-a-zA-Z0-9@:%._+~#=]{1,256}\.[a-z]{2,63}\b([-a-zA-Z0-9@:%_+.~#?&/=]*)$/.test(string) ? Promise.resolve() : Promise.resolve(validationMessage || 'Invalid URL');
7246    }
7247  };
7248
7249  function setDefaultInputValidators(params) {
7250    // Use default `inputValidator` for supported input types if not provided
7251    if (!params.inputValidator) {
7252      Object.keys(defaultInputValidators).forEach(function (key) {
7253        if (params.input === key) {
7254          params.inputValidator = defaultInputValidators[key];
7255        }
7256      });
7257    }
7258  }
7259
7260  function validateCustomTargetElement(params) {
7261    // Determine if the custom target element is valid
7262    if (!params.target || typeof params.target === 'string' && !document.querySelector(params.target) || typeof params.target !== 'string' && !params.target.appendChild) {
7263      warn('Target parameter is not valid, defaulting to "body"');
7264      params.target = 'body';
7265    }
7266  }
7267  /**
7268   * Set type, text and actions on popup
7269   *
7270   * @param params
7271   * @returns {boolean}
7272   */
7273
7274
7275  function setParameters(params) {
7276    setDefaultInputValidators(params); // showLoaderOnConfirm && preConfirm
7277
7278    if (params.showLoaderOnConfirm && !params.preConfirm) {
7279      warn('showLoaderOnConfirm is set to true, but preConfirm is not defined.\n' + 'showLoaderOnConfirm should be used together with preConfirm, see usage example:\n' + 'https://sweetalert2.github.io/#ajax-request');
7280    } // params.animation will be actually used in renderPopup.js
7281    // but in case when params.animation is a function, we need to call that function
7282    // before popup (re)initialization, so it'll be possible to check Swal.isVisible()
7283    // inside the params.animation function
7284
7285
7286    params.animation = callIfFunction(params.animation);
7287    validateCustomTargetElement(params); // Replace newlines with <br> in title
7288
7289    if (typeof params.title === 'string') {
7290      params.title = params.title.split('\n').join('<br />');
7291    }
7292
7293    init(params);
7294  }
7295
7296  var swalStringParams = ['swal-title', 'swal-html', 'swal-footer'];
7297  var getTemplateParams = function getTemplateParams(params) {
7298    var template = typeof params.template === 'string' ? document.querySelector(params.template) : params.template;
7299
7300    if (!template) {
7301      return {};
7302    }
7303
7304    var templateContent = template.content || template; // IE11
7305
7306    showWarningsForElements(templateContent);
7307
7308    var result = _extends(getSwalParams(templateContent), getSwalButtons(templateContent), getSwalImage(templateContent), getSwalIcon(templateContent), getSwalInput(templateContent), getSwalStringParams(templateContent, swalStringParams));
7309
7310    return result;
7311  };
7312
7313  var getSwalParams = function getSwalParams(templateContent) {
7314    var result = {};
7315    toArray(templateContent.querySelectorAll('swal-param')).forEac
7315h(function (param) {
7316      showWarningsForAttributes(param, ['name', 'value']);
7317      var paramName = param.getAttribute('name');
7318      var value = param.getAttribute('value');
7319
7320      if (typeof defaultParams[paramName] === 'boolean' && value === 'false') {
7321        value = false;
7322      }
7323
7324      if (_typeof(defaultParams[paramName]) === 'object') {
7325        value = JSON.parse(value);
7326      }
7327
7328      result[paramName] = value;
7329    });
7330    return result;
7331  };
7332
7333  var getSwalButtons = function getSwalButtons(templateContent) {
7334    var result = {};
7335    toArray(templateContent.querySelectorAll('swal-button')).forEach(function (button) {
7336      showWarningsForAttributes(button, ['type', 'color', 'aria-label']);
7337      var type = button.getAttribute('type');
7338      result["".concat(type, "ButtonText")] = button.innerHTML;
7339      result["show".concat(capitalizeFirstLetter(type), "Button")] = true;
7340
7341      if (button.hasAttribute('color')) {
7342        result["".concat(type, "ButtonColor")] = button.getAttribute('color');
7343      }
7344
7345      if (button.hasAttribute('aria-label')) {
7346        result["".concat(type, "ButtonAriaLabel")] = button.getAttribute('aria-label');
7347      }
7348    });
7349    return result;
7350  };
7351
7352  var getSwalImage = function getSwalImage(templateContent) {
7353    var result = {};
7354    var image = templateContent.querySelector('swal-image');
7355
7356    if (image) {
7357      showWarningsForAttributes(image, ['src', 'width', 'height', 'alt']);
7358
7359      if (image.hasAttribute('src')) {
7360        result.imageUrl = image.getAttribute('src');
7361      }
7362
7363      if (image.hasAttribute('width')) {
7364        result.imageWidth = image.getAttribute('width');
7365      }
7366
7367      if (image.hasAttribute('height')) {
7368        result.imageHeight = image.getAttribute('height');
7369      }
7370
7371      if (image.hasAttribute('alt')) {
7372        result.imageAlt = image.getAttribute('alt');
7373      }
7374    }
7375
7376    return result;
7377  };
7378
7379  var getSwalIcon = function getSwalIcon(templateContent) {
7380    var result = {};
7381    var icon = templateContent.querySelector('swal-icon');
7382
7383    if (icon) {
7384      showWarningsForAttributes(icon, ['type', 'color']);
7385
7386      if (icon.hasAttribute('type')) {
7387        result.icon = icon.getAttribute('type');
7388      }
7389
7390      if (icon.hasAttribute('color')) {
7391        result.iconColor = icon.getAttribute('color');
7392      }
7393
7394      result.iconHtml = icon.innerHTML;
7395    }
7396
7397    return result;
7398  };
7399
7400  var getSwalInput = function getSwalInput(templateContent) {
7401    var result = {};
7402    var input = templateContent.querySelector('swal-input');
7403
7404    if (input) {
7405      showWarningsForAttributes(input, ['type', 'label', 'placeholder', 'value']);
7406      result.input = input.getAttribute('type') || 'text';
7407
7408      if (input.hasAttribute('label')) {
7409        result.inputLabel = input.getAttribute('label');
7410      }
7411
7412      if (input.hasAttribute('placeholder')) {
7413        result.inputPlaceholder = input.getAttribute('placeholder');
7414      }
7415
7416      if (input.hasAttribute('value')) {
7417        result.inputValue = input.getAttribute('value');
7418      }
7419    }
7420
7421    var inputOptions = templateContent.querySelectorAll('swal-input-option');
7422
7423    if (inputOptions.length) {
7424      result.inputOptions = {};
7425      toArray(inputOptions).forEach(function (option) {
7426        showWarningsForAttributes(option, ['value']);
7427        var optionValue = option.getAttribute('value');
7428        var optionName = option.innerHTML;
7429        result.inputOptions[optionValue] = optionName;
7430      });
7431    }
7432
7433    return result;
7434  };
7435
7436  var getSwalStringParams = function getSwalStringParams(templateContent, paramNames) {
7437    var result = {};
7438
7439    for (var i in paramNames) {
7440      var paramName = paramNames[i];
7441      var tag = templateContent.querySelector(paramName);
7442
7443      if (tag) {
7444        showWarningsForAttributes(tag, []);
7445        result[paramName.replace(/^swal-/, '')] = tag.innerHTML;
7446      }
7447    }
7448
7449    return result;
7450  };
7451
7452  var showWarningsForElements = function showWarningsForElements(template) {
7453    var allowedElements = swalStringParams.concat(['swal-param', 'swal-button', 'swal-image', 'swal-icon', 'swal-input', 'swal-input-option']);
7454    toArray(template.querySelectorAll('*')).forEach(function (el) {
7455      if (el.parentNode !== template) {
7456        // can't use template.children because of IE11
7457        return;
7458      }
7459
7460      var tagName = el.tagName.toLowerCase();
7461
7462      if (allowedElements.indexOf(tagName) === -1) {
7463        warn("Unrecognized element <".concat(tagName, ">"));
7464      }
7465    });
7466  };
7467
7468  var showWarningsForAttributes = function showWarningsForAttributes(el, allowedAttributes) {
7469    toArray(el.attributes).forEach(function (attribute) {
7470      if (allowedAttributes.indexOf(attribute.name) === -1) {
7471        warn(["Unrecognized attribute \"".concat(attribute.name, "\" on <").concat(el.tagName.toLowerCase(), ">."), "".concat(allowedAttributes.length ? "Allowed attributes are: ".concat(allowedAttributes.join(', ')) : 'To set the value, use HTML within the element.')]);
7472      }
7473    });
7474  };
7475
7476  var SHOW_CLASS_TIMEOUT = 10;
7477  /**
7478   * Open popup, add necessary classes and styles, fix scrollbar
7479   *
7480   * @param params
7481   */
7482
7483  var openPopup = function openPopup(params) {
7484    var container = getContainer();
7485    var popup = getPopup();
7486
7487    if (typeof params.willOpen === 'function') {
7488      params.willOpen(popup);
7489    } else if (typeof params.onBeforeOpen === 'function') {
7490      params.onBeforeOpen(popup); // @deprecated
7491    }
7492
7493    var bodyStyles = window.getComputedStyle(document.body);
7494    var initialBodyOverflow = bodyStyles.overflowY;
7495    addClasses$1(container, popup, params); // scrolling is 'hidden' until animation is done, after that 'auto'
7496
7497    setTimeout(function () {
7498      setScrollingVisibility(container, popup);
7499    }, SHOW_CLASS_TIMEOUT);
7500
7501    if (isModal()) {
7502      fixScrollContainer(container, params.scrollbarPadding, initialBodyOverflow);
7503      setAriaHidden();
7504    }
7505
7506    if (!isToast() && !globalState.previousActiveElement) {
7507      globalState.previousActiveElement = document.activeElement;
7508    }
7509
7510    runDidOpen(popup, params);
7511    removeClass(container, swalClasses['no-transition']);
7512  };
7513
7514  var runDidOpen = function runDidOpen(popup, params) {
7515    if (typeof params.didOpen === 'function') {
7516      setTimeout(function () {
7517        return params.didOpen(popup);
7518      });
7519    } else if (typeof params.onOpen === 'function') {
7520      setTimeout(function () {
7521        return params.onOpen(popup);
7522      }); // @deprecated
7523    }
7524  };
7525
7526  var swalOpenAnimationFinished = function swalOpenAnimationFinished(event) {
7527    var popup = getPopup();
7528
7529    if (event.target !== popup) {
7530      return;
7531    }
7532
7533    var container = getContainer();
7534    popup.removeEventListener(animationEndEvent, swalOpenAnimationFinished);
7535    container.style.overflowY = 'auto';
7536  };
7537
7538  var setScrollingVisibility = function setScrollingVisibility(container, popup) {
7539    if (animationEndEvent && hasCssAnimation(popup)) {
7540      container.style.overflowY = 'hidden';
7541      popup.addEventListener(animationEndEvent, swalOpenAnimationFinished);
7542    } else {
7543      container.style.overflowY = 'auto';
7544    }
7545  };
7546
7547  var fixScrollContainer = function fixScrollContainer(container, scrollbarPadding, initialBodyOverflow) {
7548    iOSfix();
7549    IEfix();
7550
7551    if (scrollbarPadding && initialBodyOverflow !== 'hidden') {
7552      fixScrollbar();
7553    } // sweetalert2/issues/1247
7554
7555
7556    setTimeout(function () {
7557      container.scrollTop = 0;
7558    });
7559  };
7560
7561  var addClasses$1 = function addClasses(container, popup, params) {
7562    addClass(container, params.showClass.backdrop); // the workaround with setting/unsetting opacity is needed for #2019 and 2059
7563
7564    popup.style.setProperty('opacity', '0', 'important');
7565    show(popup);
7566    setTimeout(function () {
7567      // Animate popup right after showing it
7568      addClass(popup, params.showClass.popup); // and remove the opacity workaround
7569
7570      popup.style.removeProperty('opacity');
7571    }, SHOW_CLASS_TIMEOUT); // 10ms in order to fix #2062
7572
7573    addClass([document.documentElement, document.body], swalClasses.shown);
7574
7575    if (params.heightAuto && params.backdrop && !params.toast) {
7576      addClass([document.documentElement, document.body], swalClasses['height-auto']);
7577    }
7578  };
7579
7580  var handleInputOptionsAndValue = function handleInputOptionsAndValue(instance, params) {
7581    if (params.input === 'select' || params.input === 'radio') {
7582      handleInputOptions(instance, params);
7583    } else if (['text', 'email', 'number', 'tel', 'textarea'].indexOf(params.input) !== -1 && (hasToPromiseFn(params.inputValue) || isPromise(params.inputValue))) {
7584      handleInputValue(instance, params);
7585    }
7586  };
7587  var getInputValue = function getInputValue(instance, innerParams) {
7588    var input = instance.getInput();
7589
7590    if (!input) {
7591      return null;
7592    }
7593
7594    switch (innerParams.input) {
7595      case 'checkbox':
7596        return getCheckboxValue(input);
7597
7598      case 'radio':
7599        return getRadioValue(input);
7600
7601      case 'file':
7602        return getFileValue(input);
7603
7604      default:
7605        return innerParams.inputAutoTrim ? input.value.trim() : input.value;
7606    }
7607  };
7608
7609  var getCheckboxValue = function getCheckboxValue(input) {
7610    return input.checked ? 1 : 0;
7611  };
7612
7613  var getRadioValue = function getRadioValue(input) {
7614    return input.checked ? input.value : null;
7615  };
7616
7617  var getFileValue = function getFileValue(input) {
7618    return input.files.length ? input.getAttribute('multiple') !== null ? input.files : input.files[0] : null;
7619  };
7620
7621  var handleInputOptions = function handleInputOptions(instance, params) {
7622    var content = getContent();
7623
7624    var processInputOptions = function processInputOptions(inputOptions) {
7625      return populateInputOptions[params.input](content, formatInputOptions(inputOptions), params);
7626    };
7627
7628    if (hasToPromiseFn(params.inputOptions) || isPromise(params.inputOptions)) {
7629      showLoading();
7630      asPromise(params.inputOptions).then(function (inputOptions) {
7631        instance.hideLoading();
7632        processInputOptions(inputOptions);
7633      });
7634    } else if (_typeof(params.inputOptions) === 'object') {
7635      processInputOptions(params.inputOptions);
7636    } else {
7637      error("Unexpected type of inputOptions! Expected object, Map or Promise, got ".concat(_typeof(params.inputOptions)));
7638    }
7639  };
7640
7641  var handleInputValue = function handleInputValue(instance, params) {
7642    var input = instance.getInput();
7643    hide(input);
7644    asPromise(params.inputValue).then(function (inputValue) {
7645      input.value = params.input === 'number' ? parseFloat(inputValue) || 0 : "".concat(inputValue);
7646      show(input);
7647      input.focus();
7648      instance.hideLoading();
7649    })["catch"](function (err) {
7650      error("Error in inputValue promise: ".concat(err));
7651      input.value = '';
7652      show(input);
7653      input.focus();
7654      instance.hideLoading();
7655    });
7656  };
7657
7658  var populateInputOptions = {
7659    select: function select(content, inputOptions, params) {
7660      var select = getChildByClass(content, swalClasses.select);
7661
7662      var renderOption = function renderOption(parent, optionLabel, optionValue) {
7663        var option = document.createElement('option');
7664        option.value = optionValue;
7665        setInnerHtml(option, optionLabel);
7666        option.selected = isSelected(optionValue, params.inputValue);
7667        parent.appendChild(option);
7668      };
7669
7670      inputOptions.forEach(function (inputOption) {
7671        var optionValue = inputOption[0];
7672        var optionLabel = inputOption[1]; // <optgroup> spec:
7673        // https://www.w3.org/TR/html401/interact/forms.html#h-17.6
7674        // "...all OPTGROUP elements must be specified directly within a SELECT element (i.e., groups may not be nested)..."
7675        // check whether this is a <optgroup>
7676
7677        if (Array.isArray(optionLabel)) {
7678          // if it is an array, then it is an <optgroup>
7679          var optgroup = document.createElement('optgroup');
7680          optgroup.label = optionValue;
7681          optgroup.disabled = false; // not configurable for now
7682
7683          select.appendChild(optgroup);
7684          optionLabel.forEach(function (o) {
7685            return renderOption(optgroup, o[1], o[0]);
7686          });
7687        } else {
7688          // case of <option>
7689          renderOption(select, optionLabel, optionValue);
7690        }
7691      });
7692      select.focus();
7693    },
7694    radio: function radio(content, inputOptions, params) {
7695      var radio = getChildByClass(content, swalClasses.radio);
7696      inputOptions.forEach(function (inputOption) {
7697        var radioValue = inputOption[0];
7698        var radioLabel = inputOption[1];
7699        var radioInput = document.createElement('input');
7700        var radioLabelElement = document.createElement('label');
7701        radioInput.type = 'radio';
7702        radioInput.name = swalClasses.radio;
7703        radioInput.value = radioValue;
7704
7705        if (isSelected(radioValue, params.inputValue)) {
7706          radioInput.checked = true;
7707        }
7708
7709        var label = document.createElement('span');
7710        setInnerHtml(label, radioLabel);
7711        label.className = swalClasses.label;
7712        radioLabelElement.appendChild(radioInput);
7713        radioLabelElement.appendChild(label);
7714        radio.appendChild(radioLabelElement);
7715      });
7716      var radios = radio.querySelectorAll('input');
7717
7718      if (radios.length) {
7719        radios[0].focus();
7720      }
7721    }
7722  };
7723  /**
7724   * Converts `inputOptions` into an array of `[value, label]`s
7725   * @param inputOptions
7726   */
7727
7728  var formatInputOptions = function formatInputOptions(inputOptions) {
7729    var result = [];
7730
7731    if (typeof Map !== 'undefined' && inputOptions instanceof Map) {
7732      inputOptions.forEach(function (value, key) {
7733        var valueFormatted = value;
7734
7735        if (_typeof(valueFormatted) === 'object') {
7736          // case of <optgroup>
7737          valueFormatted = formatInputOptions(valueFormatted);
7738        }
7739
7740        result.push([key, valueFormatted]);
7741      });
7742    } else {
7743      Object.keys(inputOptions).forEach(function (key) {
7744        var valueFormatted = inputOptions[key];
7745
7746        if (_typeof(valueFormatted) === 'object') {
7747          // case of <optgroup>
7748          valueFormatted = formatInputOptions(valueFormatted);
7749        }
7750
7751        result.push([key, valueFormatted]);
7752      });
7753    }
7754
7755    return result;
7756  };
7757
7758  var isSelected = function isSelected(optionValue, inputValue) {
7759    return inputValue && inputValue.toString() === optionValue.toString();
7760  };
7761
7762  var handleConfirmButtonClick = function handleConfirmButtonClick(instance, innerParams) {
7763    instance.disableButtons();
7764
7765    if (innerParams.input) {
7766      handleConfirmOrDenyWithInput(instance, innerParams, 'confirm');
7767    } else {
7768      confirm(instance, innerParams, true);
7769    }
7770  };
7771  var handleDenyButtonClick = function handleDenyButtonClick(instance, innerParams) {
7772    instance.disableButtons();
7773
7774    if (innerParams.returnInputValueOnDeny) {
7775      handleConfirmOrDenyWithInput(instance, innerParams, 'deny');
7776    } else {
7777      deny(instance, innerParams, false);
7778    }
7779  };
7780  var handleCancelButtonClick = function handleCancelButtonClick(instance, dismissWith) {
7781    instance.disableButtons();
7782    dismissWith(DismissReason.cancel);
7783  };
7784
7785  var handleConfirmOrDenyWithInput = function handleConfirmOrDenyWithInput(instance, innerParams, type
7786  /* type is either 'confirm' or 'deny' */
7787  ) {
7788    var inputValue = getInputValue(instance, innerParams);
7789
7790    if (innerParams.inputValidator) {
7791      handleInputValidator(instance, innerParams, inputValue);
7792    } else if (!instance.getInput().checkValidity()) {
7793      instance.enableButtons();
7794      instance.showValidationMessage(innerParams.validationMessage);
7795    } else if (type === 'deny') {
7796      deny(instance, innerParams, inputValue);
7797    } else {
7798      confirm(instance, innerParams, inputValue);
7799    }
7800  };
7801
7802  var handleInputValidator = function handleInputValidator(instance, innerParams, inputValue) {
7803    instance.disableInput();
7804    var validationPromise = Promise.resolve().then(function () {
7805      return asPromise(innerParams.inputValidator(inputValue, innerParams.validationMessage));
7806    });
7807    validationPromise.then(function (validationMessage) {
7808      instance.enableButtons();
7809      instance.enableInput();
7810
7811      if (validationMessage) {
7812        instance.showValidationMessage(validationMessage);
7813      } else {
7814        confirm(instance, innerParams, inputValue);
7815      }
7816    });
7817  };
7818
7819  var deny = function deny(instance, innerParams, value) {
7820    if (innerParams.showLoaderOnDeny) {
7821      showLoading(getDenyButton());
7822    }
7823
7824    if (innerParams.preDeny) {
7825      var preDenyPromise = Promise.resolve().then(function () {
7826        return asPromise(innerParams.preDeny(value, innerParams.validationMessage));
7827      });
7828      preDenyPromise.then(function (preDenyValue) {
7829        if (preDenyValue === false) {
7830          instance.hideLoading();
7831        } else {
7832          instance.closePopup({
7833            isDenied: true,
7834            value: typeof preDenyValue === 'undefined' ? value : preDenyValue
7835          });
7836        }
7837      });
7838    } else {
7839      instance.closePopup({
7840        isDenied: true,
7841        value: value
7842      });
7843    }
7844  };
7845
7846  var succeedWith = function succeedWith(instance, value) {
7847    instance.closePopup({
7848      isConfirmed: true,
7849      value: value
7850    });
7851  };
7852
7853  var confirm = function confirm(instance, innerParams, value) {
7854    if (innerParams.showLoaderOnConfirm) {
7855      showLoading(); // TODO: make showLoading an *instance* method
7856    }
7857
7858    if (innerParams.preConfirm) {
7859      instance.resetValidationMessage();
7860      var preConfirmPromise = Promise.resolve().then(function () {
7861        return asPromise(innerParams.preConfirm(value, innerParams.validationMessage));
7862      });
7863      preConfirmPromise.then(function (preConfirmValue) {
7864        if (isVisible(getValidationMessage()) || preConfirmValue === false) {
7865          instance.hideLoading();
7866        } else {
7867          succeedWith(instance, typeof preConfirmValue === 'undefined' ? value : preConfirmValue);
7868        }
7869      });
7870    } else {
7871      succeedWith(instance, value);
7872    }
7873  };
7874
7875  var addKeydownHandler = function addKeydownHandler(instance, globalState, innerParams, dismissWith) {
7876    if (globalState.keydownTarget && globalState.keydownHandlerAdded) {
7877      globalState.keydownTarget.removeEventListener('keydown', globalState.keydownHandler, {
7878        capture: globalState.keydownListenerCapture
7879      });
7880      globalState.keydownHandlerAdded = false;
7881    }
7882
7883    if (!innerParams.toast) {
7884      globalState.keydownHandler = function (e) {
7885        return keydownHandler(instance, e, dismissWith);
7886      };
7887
7888      globalState.keydownTarget = innerParams.keydownListenerCapture ? window : getPopup();
7889      globalState.keydownListenerCapture = innerParams.keydownListenerCapture;
7890      globalState.keydownTarget.addEventListener('keydown', globalState.keydownHandler, {
7891        capture: globalState.keydownListenerCapture
7892      });
7893      globalState.keydownHandlerAdded = true;
7894    }
7895  }; // Focus handling
7896
7897  var setFocus = function setFocus(innerParams, index, increment) {
7898    var focusableElements = getFocusableElements(); // search for visible elements and select the next possible match
7899
7900    if (focusableElements.length) {
7901      index = index + increment; // rollover to first item
7902
7903      if (index === focusableElements.length) {
7904        index = 0; // go to last item
7905      } else if (index === -1) {
7906        index = focusableElements.length - 1;
7907      }
7908
7909      return focusableElements[index].focus();
7910    } // no visible focusable elements, focus the popup
7911
7912
7913    getPopup().focus();
7914  };
7915  var arrowKeysNextButton = ['ArrowRight', 'ArrowDown', 'Right', 'Down' // IE11
7916  ];
7917  var arrowKeysPreviousButton = ['ArrowLeft', 'ArrowUp', 'Left', 'Up' // IE11
7918  ];
7919  var escKeys = ['Escape', 'Esc' // IE11
7920  ];
7921
7922  var keydownHandler = function keydownHandler(instance, e, dismissWith) {
7923    var innerParams = privateProps.innerParams.get(instance);
7924
7925    if (innerParams.stopKeydownPropagation) {
7926      e.stopPropagation();
7927    } // ENTER
7928
7929
7930    if (e.key === 'Enter') {
7931      handleEnter(instance, e, innerParams); // TAB
7932    } else if (e.key === 'Tab') {
7933      handleTab(e, innerParams); // ARROWS - switch focus between buttons
7934    } else if ([].concat(arrowKeysNextButton, arrowKeysPreviousButton).indexOf(e.key) !== -1) {
7935      handleArrows(e.key); // ESC
7936    } else if (escKeys.indexOf(e.key) !== -1) {
7937      handleEsc(e, innerParams, dismissWith);
7938    }
7939  };
7940
7941  var handleEnter = function handleEnter(instance, e, innerParams) {
7942    // #720 #721
7943    if (e.isComposing) {
7944      return;
7945    }
7946
7947    if (e.target && instance.getInput() && e.target.outerHTML === instance.getInput().outerHTML) {
7948      if (['textarea', 'file'].indexOf(innerParams.input) !== -1) {
7949        return; // do not submit
7950      }
7951
7952      clickConfirm();
7953      e.preventDefault();
7954    }
7955  };
7956
7957  var handleTab = function handleTab(e, innerParams) {
7958    var targetElement = e.target;
7959    var focusableElements = getFocusableElements();
7960    var btnIndex = -1;
7961
7962    for (var i = 0; i < focusableElements.length; i++) {
7963      if (targetElement === focusableElements[i]) {
7964        btnIndex = i;
7965        break;
7966      }
7967    }
7968
7969    if (!e.shiftKey) {
7970      // Cycle to the next button
7971      setFocus(innerParams, btnIndex, 1);
7972    } else {
7973      // Cycle to the prev button
7974      setFocus(innerParams, btnIndex, -1);
7975    }
7976
7977    e.stopPropagation();
7978    e.preventDefault();
7979  };
7980
7981  var handleArrows = function handleArrows(key) {
7982    var confirmButton = getConfirmButton();
7983    var denyButton = getDenyButton();
7984    var cancelButton = getCancelButton();
7985
7986    if (!([confirmButton, denyButton, cancelButton].indexOf(document.activeElement) !== -1)) {
7987      return;
7988    }
7989
7990    var sibling = arrowKeysNextButton.indexOf(key) !== -1 ? 'nextElementSibling' : 'previousElementSibling';
7991    var buttonToFocus = document.activeElement[sibling];
7992
7993    if (buttonToFocus) {
7994      buttonToFocus.focus();
7995    }
7996  };
7997
7998  var handleEsc = function handleEsc(e, innerParams, dismissWith) {
7999    if (callIfFunction(innerParams.allowEscapeKey)) {
8000      e.preventDefault();
8001      dismissWith(DismissReason.esc);
8002    }
8003  };
8004
8005  var handlePopupClick = function handlePopupClick(instance, domCache, dismissWith) {
8006    var innerParams = privateProps.innerParams.get(instance);
8007
8008    if (innerParams.toast) {
8009      handleToastClick(instance, domCache, dismissWith);
8010    } else {
8011      // Ignore click events that had mousedown on the popup but mouseup on the container
8012      // This can happen when the user drags a slider
8013      handleModalMousedown(domCache); // Ignore click events that had mousedown on the container but mouseup on the popup
8014
8015      handleContainerMousedown(domCache);
8016      handleModalClick(instance, domCache, dismissWith);
8017    }
8018  };
8019
8020  var handleToastClick = function handleToastClick(instance, domCache, dismissWith) {
8021    // Closing toast by internal click
8022    domCache.popup.onclick = function () {
8023      var innerParams = privateProps.innerParams.get(instance);
8024
8025      if (innerParams.showConfirmButton || innerParams.showDenyButton || innerParams.showCancelButton || innerParams.showCloseButton || innerParams.timer || innerParams.input) {
8026        return;
8027      }
8028
8029      dismissWith(DismissReason.close);
8030    };
8031  };
8032
8033  var ignoreOutsideClick = false;
8034
8035  var handleModalMousedown = function handleModalMousedown(domCache) {
8036    domCache.popup.onmousedown = function () {
8037      domCache.container.onmouseup = function (e) {
8038        domCache.container.onmouseup = undefined; // We only check if the mouseup target is the container because usually it doesn't
8039        // have any other direct children aside of the popup
8040
8041        if (e.target === domCache.container) {
8042          ignoreOutsideClick = true;
8043        }
8044      };
8045    };
8046  };
8047
8048  var handleContainerMousedown = function handleContainerMousedown(domCache) {
8049    domCache.container.onmousedown = function () {
8050      domCache.popup.onmouseup = function (e) {
8051        domCache.popup.onmouseup = undefined; // We also need to check if the mouseup target is a child of the popup
8052
8053        if (e.target === domCache.popup || domCache.popup.contains(e.target)) {
8054          ignoreOutsideClick = true;
8055        }
8056      };
8057    };
8058  };
8059
8060  var handleModalClick = function handleModalClick(instance, domCache, dismissWith) {
8061    domCache.container.onclick = function (e) {
8062      var innerParams = privateProps.innerParams.get(instance);
8063
8064      if (ignoreOutsideClick) {
8065        ignoreOutsideClick = false;
8066        return;
8067      }
8068
8069      if (e.target === domCache.container && callIfFunction(innerParams.allowOutsideClick)) {
8070        dismissWith(DismissReason.backdrop);
8071      }
8072    };
8073  };
8074
8075  function _main(userParams) {
8076    var mixinParams = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
8077    showWarningsForParams(_extends({}, mixinParams, userParams));
8078
8079    if (globalState.currentInstance) {
8080      globalState.currentInstance._destroy();
8081    }
8082
8083    globalState.currentInstance = this;
8084    var innerParams = prepareParams(userParams, mixinParams);
8085    setParameters(innerParams);
8086    Object.freeze(innerParams); // clear the previous timer
8087
8088    if (globalState.timeout) {
8089      globalState.timeout.stop();
8090      delete globalState.timeout;
8091    } // clear the restore focus timeout
8092
8093
8094    clearTimeout(globalState.restoreFocusTimeout);
8095    var domCache = populateDomCache(this);
8096    render(this, innerParams);
8097    privateProps.innerParams.set(this, innerParams);
8098    return swalPromise(this, domCache, innerParams);
8099  }
8100
8101  var prepareParams = function prepareParams(userParams, mixinParams) {
8102    var templateParams = getTemplateParams(userParams);
8103
8104    var showClass = _extends({}, defaultParams.showClass, mixinParams.showClass, templateParams.showClass, userParams.showClass);
8105
8106    var hideClass = _extends({}, defaultParams.hideClass, mixinParams.hideClass, templateParams.hideClass, userParams.hideClass);
8107
8108    var params = _extends({}, defaultParams, mixinParams, templateParams, userParams); // precedence is described in #2131
8109
8110
8111    params.showClass = showClass;
8112    params.hideClass = hideClass; // @deprecated
8113
8114    if (userParams.animation === false) {
8115      params.showClass = {
8116        popup: 'swal2-noanimation',
8117        backdrop: 'swal2-noanimation'
8118      };
8119      params.hideClass = {};
8120    }
8121
8122    return params;
8123  };
8124
8125  var swalPromise = function swalPromise(instance, domCache, innerParams) {
8126    return new Promise(function (resolve) {
8127      // functions to handle all closings/dismissals
8128      var dismissWith = function dismissWith(dismiss) {
8129        instance.closePopup({
8130          isDismissed: true,
8131          dismiss: dismiss
8132        });
8133      };
8134
8135      privateMethods.swalPromiseResolve.set(instance, resolve);
8136
8137      domCache.confirmButton.onclick = function () {
8138        return handleConfirmButtonClick(instance, innerParams);
8139      };
8140
8141      domCache.denyButton.onclick = function () {
8142        return handleDenyButtonClick(instance, innerParams);
8143      };
8144
8145      domCache.cancelButton.onclick = function () {
8146        return handleCancelButtonClick(instance, dismissWith);
8147      };
8148
8149      domCache.closeButton.onclick = function () {
8150        return dismissWith(DismissReason.close);
8151      };
8152
8153      handlePopupClick(instance, domCache, dismissWith);
8154      addKeydownHandler(instance, globalState, innerParams, dismissWith);
8155
8156      if (innerParams.toast && (innerParams.input || innerParams.footer || innerParams.showCloseButton)) {
8157        addClass(document.body, swalClasses['toast-column']);
8158      } else {
8159        removeClass(document.body, swalClasses['toast-column']);
8160      }
8161
8162      handleInputOptionsAndValue(instance, innerParams);
8163      openPopup(innerParams);
8164      setupTimer(globalState, innerParams, dismissWith);
8165      initFocus(domCache, innerParams); // Scroll container to top on open (#1247, #1946)
8166
8167      setTimeout(function () {
8168        domCache.container.scrollTop = 0;
8169      });
8170    });
8171  };
8172
8173  var populateDomCache = function populateDomCache(instance) {
8174    var domCache = {
8175      popup: getPopup(),
8176      container: getContainer(),
8177      content: getContent(),
8178      actions: getActions(),
8179      confirmButton: getConfirmButton(),
8180      denyButton: getDenyButton(),
8181      cancelButton: getCancelButton(),
8182      loader: getLoader(),
8183      closeButton: getCloseButton(),
8184      validationMessage: getValidationMessage(),
8185      progressSteps: getProgressSteps()
8186    };
8187    privateProps.domCache.set(instance, domCache);
8188    return domCache;
8189  };
8190
8191  var setupTimer = function setupTimer(globalState$$1, innerParams, dismissWith) {
8192    var timerProgressBar = getTimerProgressBar();
8193    hide(timerProgressBar);
8194
8195    if (innerParams.timer) {
8196      globalState$$1.timeout = new Timer(function () {
8197        dismissWith('timer');
8198        delete globalState$$1.timeout;
8199      }, innerParams.timer);
8200
8201      if (innerParams.timerProgressBar) {
8202        show(timerProgressBar);
8203        setTimeout(function () {
8204          if (globalState$$1.timeout && globalState$$1.timeout.running) {
8205            // timer can be already stopped or unset at this point
8206            animateTimerProgressBar(innerParams.timer);
8207          }
8208        });
8209      }
8210    }
8211  };
8212
8213  var initFocus = function initFocus(domCache, innerParams) {
8214    if (innerParams.toast) {
8215      return;
8216    }
8217
8218    if (!callIfFunction(innerParams.allowEnterKey)) {
8219      return blurActiveElement();
8220    }
8221
8222    if (!focusButton(domCache, innerParams)) {
8223      setFocus(innerParams, -1, 1);
8224    }
8225  };
8226
8227  var focusButton = function focusButton(domCache, innerParams) {
8228    if (innerParams.focusDeny && isVisible(domCache.denyButton)) {
8229      domCache.denyButton.focus();
8230      return true;
8231    }
8232
8233    if (innerParams.focusCancel && isVisible(domCache.cancelButton)) {
8234      domCache.cancelButton.focus();
8235      return true;
8236    }
8237
8238    if (innerParams.focusConfirm && isVisible(domCache.confirmButton)) {
8239      domCache.confirmButton.focus();
8240      return true;
8241    }
8242
8243    return false;
8244  };
8245
8246  var blurActiveElement = function blurActiveElement() {
8247    if (document.activeElement && typeof document.activeElement.blur === 'function') {
8248      document.activeElement.blur();
8249    }
8250  };
8251
8252  /**
8253   * Updates popup parameters.
8254   */
8255
8256  function update(params) {
8257    var popup = getPopup();
8258    var innerParams = privateProps.innerParams.get(this);
8259
8260    if (!popup || hasClass(popup, innerParams.hideClass.popup)) {
8261      return warn("You're trying to update the closed or closing popup, that won't work. Use the update() method in preConfirm parameter or show a new popup.");
8262    }
8263
8264    var validUpdatableParams = {}; // assign valid params from `params` to `defaults`
8265
8266    Object.keys(params).forEach(function (param) {
8267      if (Swal.isUpdatableParameter(param)) {
8268        validUpdatableParams[param] = params[param];
8269      } else {
8270        warn("Invalid parameter to update: \"".concat(param, "\". Updatable params are listed here: https://github.com/sweetalert2/sweetalert2/blob/master/src/utils/params.js\n\nIf you think this parameter should be updatable, request it here: https://github.com/sweetalert2/sweetalert2/issues/new?template=02_feature_request.md"));
8271      }
8272    });
8273
8274    var updatedParams = _extends({}, innerParams, validUpdatableParams);
8275
8276    render(this, updatedParams);
8277    privateProps.innerParams.set(this, updatedParams);
8278    Object.defineProperties(this, {
8279      params: {
8280        value: _extends({}, this.params, params),
8281        writable: false,
8282        enumerable: true
8283      }
8284    });
8285  }
8286
8287  function _destroy() {
8288    var domCache = privateProps.domCache.get(this);
8289    var innerParams = privateProps.innerParams.get(this);
8290
8291    if (!innerParams) {
8292      return; // This instance has already been destroyed
8293    } // Check if there is another Swal closing
8294
8295
8296    if (domCache.popup && globalState.swalCloseEventFinishedCallback) {
8297      globalState.swalCloseEventFinishedCallback();
8298      delete globalState.swalCloseEventFinishedCallback;
8299    } // Check if there is a swal disposal defer timer
8300
8301
8302    if (globalState.deferDisposalTimer) {
8303      clearTimeout(globalState.deferDisposalTimer);
8304      delete globalState.deferDisposalTimer;
8305    }
8306
8307    runDidDestroy(innerParams);
8308    disposeSwal(this);
8309  }
8310
8311  var runDidDestroy = function runDidDestroy(innerParams) {
8312    if (typeof innerParams.didDestroy === 'function') {
8313      innerParams.didDestroy();
8314    } else if (typeof innerParams.onDestroy === 'function') {
8315      innerParams.onDestroy(); // @deprecated
8316    }
8317  };
8318
8319  var disposeSwal = function disposeSwal(instance) {
8320    // Unset this.params so GC will dispose it (#1569)
8321    delete instance.params; // Unset globalState props so GC will dispose globalState (#1569)
8322
8323    delete globalState.keydownHandler;
8324    delete globalState.keydownTarget; // Unset WeakMaps so GC will be able to dispose them (#1569)
8325
8326    unsetWeakMaps(privateProps);
8327    unsetWeakMaps(privateMethods);
8328  };
8329
8330  var unsetWeakMaps = function unsetWeakMaps(obj) {
8331    for (var i in obj) {
8332      obj[i] = new WeakMap();
8333    }
8334  };
8335
8336
8337
8338  var instanceMethods = /*#__PURE__*/Object.freeze({
8339    hideLoading: hideLoading,
8340    disableLoading: hideLoading,
8341    getInput: getInput$1,
8342    close: close,
8343    closePopup: close,
8344    closeModal: close,
8345    closeToast: close,
8346    enableButtons: enableButtons,
8347    disableButtons: disableButtons,
8348    enableInput: enableInput,
8349    disableInput: disableInput,
8350    showValidationMessage: showValidationMessage,
8351    resetValidationMessage: resetValidationMessage$1,
8352    getProgressSteps: getProgressSteps$1,
8353    _main: _main,
8354    update: update,
8355    _destroy: _destroy
8356  });
8357
8358  var currentInstance;
8359
8360  var SweetAlert = /*#__PURE__*/function () {
8361    function SweetAlert() {
8362      _classCallCheck(this, SweetAlert);
8363
8364      // Prevent run in Node env
8365      if (typeof window === 'undefined') {
8366        return;
8367      } // Check for the existence of Promise
8368
8369
8370      if (typeof Promise === 'undefined') {
8371        error('This package requires a Promise library, please include a shim to enable it in this browser (See: https://github.com/sweetalert2/sweetalert2/wiki/Migration-from-SweetAlert-to-SweetAlert2#1-ie-support)');
8372      }
8373
8374      currentInstance = this;
8375
8376      for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
8377        args[_key] = arguments[_key];
8378      }
8379
8380      var outerParams = Object.freeze(this.constructor.argsToParams(args));
8381      Object.defineProperties(this, {
8382        params: {
8383          value: outerParams,
8384          writable: false,
8385          enumerable: true,
8386          configurable: true
8387        }
8388      });
8389
8390      var promise = this._main(this.params);
8391
8392      privateProps.promise.set(this, promise);
8393    } // `catch` cannot be the name of a module export, so we define our thenable methods here instead
8394
8395
8396    _createClass(SweetAlert, [{
8397      key: "then",
8398      value: function then(onFulfilled) {
8399        var promise = privateProps.promise.get(this);
8400        return promise.then(onFulfilled);
8401      }
8402    }, {
8403      key: "finally",
8404      value: function _finally(onFinally) {
8405        var promise = privateProps.promise.get(this);
8406        return promise["finally"](onFinally);
8407      }
8408    }]);
8409
8410    return SweetAlert;
8411  }(); // Assign instance methods from src/instanceMethods/*.js to prototype
8412
8413
8414  _extends(SweetAlert.prototype, instanceMethods); // Assign static methods from src/staticMethods/*.js to constructor
8415
8416
8417  _extends(SweetAlert, staticMethods); // Proxy to instance methods to constructor, for now, for backwards compatibility
8418
8419
8420  Object.keys(instanceMethods).forEach(function (key) {
8421    SweetAlert[key] = function () {
8422      if (currentInstance) {
8423        var _currentInstance;
8424
8425        return (_currentInstance = currentInstance)[key].apply(_currentInstance, arguments);
8426      }
8427    };
8428  });
8429  SweetAlert.DismissReason = DismissReason;
8430  SweetAlert.version = '10.14.0';
8431
8432  var Swal = SweetAlert;
8433  Swal["default"] = Swal;
8434
8435  return Swal;
8436
8437}));
8438if (typeof this !== 'undefined' && this.Sweetalert2){  this.swal = this.sweetAlert = this.Swal = this.SweetAlert = this.Sweetalert2}
8439
8440
8441/***/ })
8442/******/ ]);
8443//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay9ib290c3RyYXAgNjIwMmU3ZWExNTUyMTMwNWNkOGMiLCJ3ZWJwYWNrOi8vLy4vbWFpbl9mcm9udGVuZC5qcyIsIndlYnBhY2s6Ly8vLi9mcm9udGVuZC9mcmFtZXdvcmsvUndiRXZlbnRzRm9ybUNvbnRyb2xsZXIuanMiLCJ3ZWJwYWNrOi8vLy4vZnJvbnRlbmQvZnJhbWV3b3JrL1J3YkV2ZW50c0Zvcm1WaWV3LmpzIiwid2VicGFjazovLy8uL2Zyb250ZW5kL2ZyYW1ld29yay9Sd2JFdmVudHNGb3JtTW9kZWwuanMiLCJ3ZWJwYWNrOi8vLy4vZnJvbnRlbmQvZnJhbWV3b3JrL1J3YkV2ZW50c0Zvcm1TcGluZS5qcyIsIndlYnBhY2s6Ly8vL3Zhci93d3cvdmVnYXMudGVzdC93cC1jb250ZW50L3BsdWdpbnMvbm9kZV9tb2R1bGVzL3N3ZWV0YWxlcnQyL2Rpc3Qvc3dlZXRhbGVydDIuanMiXSwibmFtZXMiOlsiJCIsInVuZGVmaW5lZCIsInJ3YkV2ZW50c0Zvcm1Db250cm9sbGVyIiwiUndiRXZlbnRzRm9ybUNvbnRyb2xsZXIiLCJpbml0Iiwid2luZG93IiwialF1ZXJ5IiwiUndiRXZlbnRzRm9ybVZpZXciLCJjb25zdHJ1Y3RvciIsInNjcm9sbFdpbmRvdyIsImlzTW9iaWxlIiwic2VhbWxlc3MiLCJ3aW5kb3dTY3JvbGxCeSIsInNjcm9sbFdpbmRvdzIiLCJmaXhGdWxsU2NyZWVuIiwibGVuZ3RoIiwidGFyZ2V0Tm9kZSIsImRvY3VtZW50IiwicXVlcnlTZWxlY3RvciIsImNvbmZpZyIsImF0dHJpYnV0ZXMiLCJhdHRyaWJ1dGVGaWx0ZXIiLCJjYWxsYmFjayIsIm11dGF0aW9uc0xpc3QiLCJvYnNlcnZlciIsIm11dGF0aW9uIiwiYXR0cmlidXRlTmFtZSIsInRhcmdldCIsImNsYXNzTGlzdCIsImNvbnRhaW5zIiwiY3NzIiwiTXV0YXRpb25PYnNlcnZlciIsIm9ic2VydmUiLCJkYXRlUmFuZ2UiLCJzdGFydERhdGUiLCJzdGVwcyIsImRhdGVBcnJheSIsInNlbGYiLCJjdXJyZW50RGF0ZSIsIkRhdGUiLCJtYXhTdGVwcyIsInAiLCJwdXNoIiwic2V0VVRDRGF0ZSIsImdldFVUQ0RhdGUiLCJkYXRlUmFuZ2VQcmV2IiwicmV2ZXJzZSIsIm9uIiwiZWxlbWVudFNjcm9sbEludG9WaWV3IiwiYmVoYXZpb3IiLCJpbmxpbmUiLCJibG9jayIsIkpCdXlUaWNrZXRzIiwiaGlkZVF0eUFkZFRvQ2FydCIsImJ1eVRpY2tldHNBY3Rpb24iLCJKRmxhdENhbGVuZGFyIiwiSklzQXR0cmFjdGlvbiIsImNsb3Nlc3QiLCJyZW1vdmUiLCJpc0luVmlld3BvcnQiLCJoaWRlIiwic2hvdyIsIkpUaWNrZXRzQ2FydCIsIkpQcmljZU1hcCIsIkpQcmljZU1hcFNlYXRzIiwiSlByaWNlTWFwRXhwbGFuYXRpb24iLCJKRXZlbnRzUGVyRGF0ZSIsIkpFdmVudFNlbGVjdGlvbiIsIkpFdmVudHNQZXJEYXRlQmVmb3JlVGV4dCIsIkpUaWNrZXRzQnV0dG9uc0NhcnQiLCJKVGlja2V0c1NlbGVjdGVkQ2FydCIsImFwcGVuZCIsImFuaW1hdGUiLCJzY3JvbGxUb3AiLCJKVGhlbWUiLCJKQmxhbmtTZWF0c01hcCIsImh0bWwiLCJwb2RzIiwiZnJvbURlbGV0ZSIsImluaXRTZWF0c01hcCIsInNob3dQYWdlQWN0aW9ucyIsImhvdGVsUm9vbUFjdGlvbnMiLCJmcHNlYXJjaFMiLCJmbGF0cGlja3IiLCJtaW5EYXRlIiwiZGlzYWJsZU1vYmlsZSIsImRhdGVGb3JtYXQiLCJzaG93TW9udGhzIiwic2V0IiwiZ2V0UGFyYW1ldGVyQnlOYW1lIiwiSlNlYXJjaEJ1dHRvbkNhbGVuZGFyIiwic3RhcnRfZGF0ZSIsInNjYWx0eXBlIiwic2NhbGNhdCIsImNEYXRlIiwic2V0VGltZSIsImdldFRpbWUiLCJnZXRUaW1lem9uZUluTWlsaXNlY29uZHMiLCJzZXREYXRlIiwiZGF0ZXNSIiwidG9kYXkiLCJub3ciLCJnZXRUaW1lem9uZU9mZnNldCIsImkiLCJjb21wYXJlX2FzYyIsImZvcm1hdERhdGUiLCJjc3RhcnRfZGF0ZSIsImNlbmRfZGF0ZSIsImRhdGVzUjEiLCJyZW1vdmVDbGFzcyIsImRzZWxlY3RlZCIsImFkZENsYXNzIiwidmFsIiwiZGF0YSIsImFjdGlvbiIsImF0dHIiLCJzZWN1cml0eSIsIkxvYWRpbmdPdmVybGF5IiwiYWpheCIsInR5cGUiLCJkYXRhVHlwZSIsInVybCIsImJiTG9jYWwiLCJhamF4X3VybCIsInN1Y2Nlc3MiLCJwcm94eSIsImNhbENvbXBsZXRlZCIsInRyaWdnZXIiLCJzZWFyY2hDYWxlbmRhckJ1dHRvbiIsImZwc2VhcmNoIiwibW9kZSIsIm9uQ2hhbmdlIiwic2VsZWN0ZWREYXRlcyIsImRhdGVTdHIiLCJpbnN0YW5jZSIsImVsZW1lbnQiLCJ2YWx1ZSIsInJlcGxhY2UiLCJkaWZmVGltZSIsIk1hdGgiLCJhYnMiLCJkaWZmRGF5cyIsImNlaWwiLCJhZGREYXlzIiwibWF4IiwiZ2V0RGF0ZSIsInNldFRpbWVvdXQiLCJqdW1wVG9EYXRlIiwib3BlbiIsImxvY2F0aW9uIiwiaHJlZiIsIkpTZWFyY2hCdXR0b24iLCJlbmRfZGF0ZSIsImFkdWx0cyIsImNoaWxkcmVuIiwiY2hpbGRyZW5hZ2VzYSIsInJvb21zIiwiY0RhdGVlIiwiY2hpbGRyZW5hZ2VzIiwic3BsaXQiLCJzY3JvbGwiLCJzZWFyY2hIb3RlbHNCdXR0b24iLCJKUGFja0J1dHRvbiIsInN0YXJ0UGFja0J1dHRvbiIsImVhY2giLCJmb250c2l6ZSIsImNhbGN1bGF0ZVBhY2tQcmljZSIsIm1hZ25pZmljUG9wdXAiLCJpdGVtcyIsInNyYyIsIm1haW5DbGFzcyIsInByZWxvYWRlciIsIm92ZXJmbG93WSIsImZpeGVkQ29udGVudFBvcyIsImNhbGxiYWNrcyIsImFwcGVuZFRvIiwicmlkIiwiZmluZCIsImZsaWNraXR5IiwiY2VsbEFsaWduIiwiY29udGFpbiIsImZ1bGxzY3JlZW4iLCJ3cmFwQXJvdW5kIiwiZ3JvdXBDZWxscyIsImxhenlMb2FkIiwiaGFzaCIsImNlbGxTZWxlY3RvciIsImZyZW
8443VTY3JvbGwiLCJkcmFnZ2FibGUiLCJwYWdlRG90cyIsImNsb3NlIiwiSlJvb21SZXNlcnZlQnV0dG9uIiwib2ZmIiwicm9vbVJlc2VydmVBY3Rpb24iLCJldmVudCIsInJJRCIsInBJRCIsInJSYXRlIiwiZWwiLCJpc3AiLCJwYXJlbnQiLCJwaWQiLCJycmF0ZSIsInJvb21SZXNlcnZlQ29tcGxldGVkIiwicmVzcG9uc2UiLCJTd2FsIiwiZmlyZSIsInRpdGxlIiwidGV4dCIsIm1lc3NhZ2UiLCJpY29uIiwiY29uZmlybUJ1dHRvblRleHQiLCJjbG9zZU9uQ29uZmlybSIsInRoZW4iLCJyZXN1bHQiLCJpc0NvbmZpcm1lZCIsImlzRGVuaWVkIiwiZWxwIiwiaElEIiwicGFpcklEIiwiZmlyc3QiLCJoaWQiLCJwYWlyaWQiLCJzdGFydFBhY2thZ2VDb21wbGV0ZWQiLCJkYXRlcyIsInN1YnN0cmluZyIsInBhcmFtcyIsImluZGV4T2YiLCJoYXNDbGFzcyIsImJiIiwib3JpZ2luIiwibmFtZSIsInJlZ2V4IiwiUmVnRXhwIiwicmVzdWx0cyIsImV4ZWMiLCJkZWNvZGVVUklDb21wb25lbnQiLCJpc1BhY2siLCJwYWNrU3RhcnREYXRlIiwicGFja0VuZERhdGUiLCJyZW5kZXJFdmVudHMiLCJwcm9kdWN0X2lkIiwicmVuZGVyRXZlbnRzQ29tcGxldGVkIiwicmVuZGVyU2VhdENoYXJ0IiwiZXZlbnRfaWQiLCJjcmVhdGVEZXN0cm95U2VhdENoYXJ0IiwicmVuZGVyU2VhdENoYXJ0Q29tcGxldGVkIiwiY2xlYXJDYXJ0Iiwic2VsZWN0ZWRMYWJlbCIsInNlbGxhYiIsImsiLCJzZWxlY3RlZExhYmVscyIsInNlYXRDaGFydCIsImRlc2VsZWN0T2JqZWN0cyIsInNlbGVjdEJhc2VkT25Ecm9wRG93biIsInNlbGVjdGVkU2VhdHMiLCJjIiwibGFiZWxzIiwidG90YWxQcmljZSIsImhhc1R5cGUiLCJ0eXBlc1NlYXQiLCJzZWxlY3RTZWF0c0xhYmVsT25seSIsImV4aXN0aW5nU2VhdHMiLCJ0b3RhbFRpY2tldHMiLCJsYWJlbCIsInF0eSIsInV1aWQiLCJudW1TZWxlY3RlZCIsImxhYmVsb3JpZyIsInByaWNpbmciLCJ0aWNrZXRUeXBlcyIsInNlbGVjdGVkVGlja2V0VHlwZSIsInByaWNlIiwidHlwZW4iLCJpbkFycmF5IiwicGFyc2VGbG9hdCIsInRpY2tldFR5cGVBbGwiLCJudW1iZXJPZlNlbGVjdGVkU2VhdHMiLCJTY3JvbGxGcm9tQm90dG9tIiwiaGVpZ2h0IiwidGFibGVIZWlnaHQiLCJjcmVhdGVQcmljaW5nTWFwIiwiaGVhZGVycyIsInJvd3MiLCJyb3ciLCJjdXJMYWJlbCIsInRvRml4ZWQiLCJwcCIsImluaXRQYWNrUHJpY2UiLCJmb290ZXJzIiwiY3JlYXRlSHRtbFRhYmxlIiwiSlRpY2tldHNTZWxlY3RlZFRhYmxlIiwiazEiLCJKRnJlZVNlYXRpbmciLCJrcCIsImtwcCIsImlvMSIsInVwZGF0ZU9ialF1YW50aXR5IiwibGlzdFNlbGVjdGVkT2JqZWN0cyIsInNlbGVjdGVkT2JqZWN0cyIsIm15c2VsZWN0ZWRPYmplY3RzIiwiSlpvbmVJbWFnZSIsIkpCdXlCdXR0b24iLCJidXlOb3dBY3Rpb25BIiwiSkFkZFRvQ2FydEJ1dHRvbiIsImFkZFRvQ2FydEFjdGlvbkEiLCJidXlOb3dBY3Rpb24iLCJhZGRUb0NhcnRBY3Rpb24iLCJzZWxlY3RlZE51bWJlck9mVGlja2V0cyIsImRpZmZlcmVuY2UiLCJsYXN0TGFiZWwiLCJteXBvZCIsInN0YXJ0Iiwic2VhdHNCeVBvc2l0aW9uIiwibGFzdFNlYXRTZWxlY3RlZCIsImV2ZW50U2VhdHMiLCJmaW5kUG9zIiwiYXV0b1NlbGVjdGVkU2VhdHMiLCJzcGF0aWFsU2VhdCIsInBhcnNlSW50Iiwic2VsU2VhdCIsImlleGlzdCIsInNlbGVjdE9iamVjdHMiLCJPYmplY3QiLCJhc3NpZ24iLCJ1c2VkQmxvY2tzVG9TZW5kIiwidXNlZEJsb2NrcyIsInByb2R1Y3RpZCIsInNlYXRsYWJlbHMiLCJldmVudGtleSIsInNlbGVjdGVkRXZlbnRJZCIsImV2ZW50RGF0YSIsInNlbGVjdGVkRXZlbnREYXRhIiwiaXNfYWRkX3RvX2NhcnQiLCJhZGRUb0NhcnRDb21wbGV0ZWQiLCJvbkJ0bkNsaWNrZWQiLCJidG5JZCIsImNyZWF0ZUJ1dHRvbiIsImNiIiwicmVyZW5kZXIiLCJhbGxvd091dHNpZGVDbGljayIsImFsbG93RXNjYXBlS2V5IiwicmVsb2FkIiwidGlja2V0RGF0YSIsInN0b3AiLCJwcm9tb19jb2RlIiwicHJpY2VMZXZlbElkIiwicGlja3VwbG9jIiwiYmJmbmFtZSIsImJibG5hbWUiLCJiYndlaWdodCIsInRpY2tldF9kYXRhIiwiYnV5Tm93Q29tcGxldGVkQSIsInNlbGVjdGVkRXZlbnQiLCJhZGRUb0NhcnRDb21wbGV0ZWRB
8443IiwiYnV5Tm93Q29tcGxldGVkIiwiY29tcGFyZVByaWNlQmxvY2tzIiwiYTEiLCJiMSIsImEiLCJiIiwiY29tcGFyZVByaWNlQmxvY2tzUGFjayIsIm9iamVjdFRvQXJyYXkiLCJvYmoiLCJfYXJyIiwia2V5IiwiZ2V0UHJpY2VCbG9ja3NBbmRVc2VkQmxvY2tzQXR0cmFjdGlvbiIsInByaWNlQmxvY2tzIiwiZXZlbnRQcm9tb3Rpb25zIiwia2V5UCIsInRtcGtleSIsInNlbGVjdGVkUHJvbW9Db2RlIiwibXlrZXlQIiwidG1wa2V5UCIsImJpZ1ByaWNlIiwic21hbGxQcmljZSIsIm11c3Rsb2dpbiIsInByb21vIiwiZ2V0UHJpY2VCbG9ja3NBbmRVc2VkQmxvY2tzWm9uZXMiLCJwb3NpdGlvbiIsImdldFByaWNlQmxvY2tzQW5kVXNlZEJsb2NrcyIsImdldFByaWNlTGV2ZWxJZHMiLCJwcmljZUxldmVsSWRzIiwiZ2V0VGFnSWRzIiwidGFnSWRzIiwiZ2V0U3ViaG9sZElkcyIsInN1YmhvbGRzSWRzIiwicHJpY2VCbG9ja3NBbmRVc2VkQmxvY2tzIiwicHJpY2VCbG9jayIsIkpQcmljZUJlc3RTZWF0cyIsInNlbGVjdGVkRmlsdGVyZWRDYXRlZ29yaWVzIiwicHJpY2VBcnIiLCJwcmljZUJsb2NrQXJyIiwic29ydCIsInBvIiwiaTEiLCJ1c2VkUHJpY2VMZXZlbElkcyIsImJpZ3ByaWNlY3V0IiwicHJpY2VEaXYiLCJjb2RlQXJyYXkiLCJvcHRpb25zYmVzdCIsInN0ZXAiLCJKVGlja2V0c0Nob29zZXIiLCJvbyIsInRvU3RyaW5nIiwiZHJvcGRvd25CZXN0U2VhdHMiLCJsZXZlbElkIiwiaW5kZXhPZkl0ZW0iLCJzcGxpY2UiLCJjaGFuZ2VDb25maWciLCJmaWx0ZXJlZENhdGVnb3JpZXMiLCJ0b2dnbGVDYXRlZ29yaWVzSGlnaGxpZ2h0UmVuZGVyIiwic2VsZWN0QmVzdEF2YWlsYWJsZSIsImV2ZW50X3NlYXRzIiwiZXZlbnRfcHJvbW90aW9ucyIsImV2ZW50U2VjdGlvbnMiLCJldmVudF9zZWN0aW9ucyIsInNlYXRBbGVydHNBbmRUb29sdGlwc1BlckxhYmVsIiwic2VhdF9hbGVydHMiLCJjcmVhdGVEcm9wRG93blNlbGVjdCIsImRyb3Bkb3duX3NlbGVjdCIsIndvcmtzcGFjZWtleSIsInJlbmRlclNlYXRNYXAiLCJjcmVhdGVDYWxlbmRhciIsImNhbGVuZGFyIiwiYWx0SW5wdXQiLCJjbGlja09wZW5zIiwiYWxsb3dJbnB1dCIsImRhdGVDaGFuZ2VkIiwib25Nb250aENoYW5nZSIsIm1vbnRoQ2hhbmdlZCIsIm9uRGF5Q3JlYXRlIiwiZGF5Q3JlYXRlIiwicHJvcCIsIkpHb1RvTW9udGgiLCJnZXRFbmRPZk1vbnRocyIsImZpcnN0RGF0ZVdpdGhFdmVudCIsImdldEVuZE9mTW9udGgiLCJjdXJNb250aCIsImN1cnJlbnRNb250aCIsIm
8443N1clllYXIiLCJjdXJyZW50WWVhciIsIkpEdWFsRGF0ZXMiLCJkeWVhciIsImRtb250aCIsImR0eXBlIiwiZHVybCIsImdldExhc3REYXkiLCJ5IiwibSIsImdldExhc3RUcnVlRGF5IiwiZGF0ZSIsIm5leHRNb250aCIsImdldEZ1bGxZZWFyIiwiZ2V0TW9udGgiLCJkYXRlWWVhciIsImRhdGVNb250aCIsImRPYmoiLCJkU3RyIiwiZnAiLCJkYXlFbGVtIiwiZm91bmQiLCJkYXRlT2JqIiwiZXZlbnRMaXN0IiwiY3JlYXRlRGF0ZUFzVVRDIiwiaW5uZXJIVE1MIiwiY3JlYXRlRHJvcERvd25BdHRyYWN0aW9uIiwibWludCIsIm1heHQiLCJyZXFldiIsImoiLCJkcm9wZCIsInJlbmRlclRpY2tldFNlbGVjdG9yIiwicmVuZGVyVGlja2V0U2VsZWN0b3JDb21wbGV0ZWQiLCJyZW5kZXJUaWNrZXRTZWxlY3RvckFjdGlvbiIsInNvcnRVc2luZ05lc3RlZFRleHQiLCJjaGlsZFNlbGVjdG9yIiwia2V5U2VsZWN0b3IiLCJ2QSIsInZCIiwiemltYWdlIiwiY2xvbmUiLCJzZWxlY3RlZFByaWNlTGV2ZWxJZHMiLCJwcmljZUJsb2Nrc0FsbCIsInByaWNlQmxvY2tzQXJyIiwibkJsb2NrcyIsImtleVNlYXRzIiwiaXNDYXQiLCJwcmljZUxldmVJZCIsIkFycmF5IiwiaXNBcnJheSIsIkpTT04iLCJwYXJzZSIsInN0cmluZ2lmeSIsInAxIiwiSklzUmVkZWFtIiwiZGVzYyIsImhhc05hbWVXZWlnaHQiLCJwaWNrdXBMb2NhdGlvbnMiLCJwaWNrdXBMb2NhdGlvbnNOb25BcGkiLCJpUHJpY2UiLCJwcm9tb0NvZGUiLCJkcm9wZG93biIsImhhc253IiwiaGFzcHAiLCJ3aXRoRGVzY0RpdiIsIndpdGhvdXREZXNjRGl2IiwiaGFzQmlnIiwic1ZhbCIsInZ2IiwiaW5zZXJ0QWZ0ZXIiLCJldmVudFRpbWVzIiwiZXZlbnRJZHMiLCJwcmVwZW5kIiwiSlRpbWVFbGVtIiwic2VsZWN0ZWRldmVudFByb21vdGlvbnNJZHMiLCJldmlIb3VyIiwiZGVmX2V2IiwidXBkYXRlUGFnZURlc2lnbiIsIm1pblRpbWUiLCJkZWZfZGF0ZSIsImV2ZW50cyIsIkpGb3JtIiwicHJldiIsIm9wYWNpdHlUb0hleCIsImhleENvZGUiLCJnZXRQcmljaW5nQ2F0ZWdvcmllc0FuZENhdGVnb3JpZXNMYWJlbHNBbmRVbmF2YWlsYWJsZUNhdGVnb3JpZXNBbmRTZWF0TGFiZWxzQ2F0ZWdvcmllc0F6dXJlIiwiY2F0ZWdvcmllcyIsInNlbGVjdGVkSG9sZFN1YmNsYXNzSWQiLCJzZWxlY3RlZFRhZ3NJZCIsImNhdGVnb3JpZXNfcHJpY2luZyIsImNhdGVnb3JpZXNfbGFiZWxzIiwic2VsZWN0ZWRQcm9tb0NvZGVFbGVtZW50QW5kVXNlZEJsb2NrcyIsInNlbGVjdGVkUHJvbW9Db2RlRWxlbWVudCIsInVzZUJsb2NrIiwic2VhdF9sYWJlbHNfY2F0ZWdvcmllcyIsIm9iamVjdF9jYXRlZ29yaWVzIiwiaWQiLCJjYXRlZ29yeUlkIiwic3RhdHVzSWQiLCJkaXNhYmlsaXR5IiwiYWxlcnQiLCJnYSIsImN1cnJlbnQiLCJrZXlQcmljZSIsInRpY2tldFR5cGUiLCJ0aWNrZXRUeXBlU2luZ3VsYXIiLCJjYXRlZ29yeV9wcmljaW5nIiwiY2F0ZWdvcnlfbGFiZWwiLCJjYXRlZ29yeV9sYWJlbF9ub3QiLCJjb252ZXJ0SGV4IiwiZXZlbnRTZWN0aW9uc0NhcGFjaXR5IiwiZ2V0UHJpY2luZ0NhdGVnb3JpZXNBbmRDYXRlZ29yaWVzTGFiZWxzQW5kVW5hdmFpbGFibGVDYXRlZ29yaWVzQW5kU2VhdExhYmVsc0NhdGVnb3JpZXMiLCJkZXN0cm95Iiwic2VsZWN0ZWRPYmplY3RDaGFydCIsIm9wYWNpdHkiLCJoZXgiLCJyIiwiZyIsIm1hdHJpeFRvQXNjaWlUYWJsZSIsIm9wdGlvbnMiLCJkZWZhdWx0cyIsInBhZGRpbmdMZWZ0IiwicGFkZGluZ1JpZ2h0IiwiY29sU2VwYXJhdG9yIiwibGluZUJyZWFrIiwiY2VsbCIsImRlZmF1bHRBbGlnbkRpciIsImhyIiwic3RyIiwiZGVmYXVsdE9iaiIsImlzT2JqIiwieCIsInByb3RvdHlwZSIsImhhc093blByb3BlcnR5IiwiY2FsbCIsInJlcGVhdFN0ciIsIndpZHRoIiwiam9pbiIsInN1YnN0ciIsImFsaWduVGV4dCIsInR4dCIsInBhZCIsImRpciIsInBMIiwicFIiLCJjaGFyQXQiLCJjYWxjQ29sdW1uc1dpZHRoIiwibWF0cml4IiwiY29sc1dpZHRoIiwickxlbiIsImNvbHMiLCJjTGVuIiwicGFkZGluZ0xlbmd0aCIsImhyU2VwYXJhdG9yIiwidGFibGUiLCJ1c2VBenVyZSIsImV2ZW50QXJyIiwiY2hhcnRrZXkiLCJldmVudGlkIiwicHJpY2luZ0FsbCIsIm9ycGhhblNlYXQiLCJjb2xvclNjaGVtZSIsImJnY29sb3IiLCJzdGNvbG9yIiwibnRjb2xvciIsImNvbG9yMSIsImNvbG9yMiIsInNlYXRzaW8iLCJTZWF0aW5nQ2hhcnQiLCJkaXZJZCIsIndvcmtzcGFjZUtleSIsInNob3dGdWxsU2NyZWVuQnV0dG9uIiwiYWxsb3dPcnBoYW5TZWF0cyIsImV4dHJhQ29uZmlnIiwicHJpY2luZ0FsbFNlYXRMYWJlbHMiLCJ1bmF2YWlsYWJsZUNhdGVnb3JpZXNTZWF0TGFiZWxzIiwib2JqZWN0Q2F0ZWdvcmllcyIsInVuYXZhaWxhYmxlQ2F0ZWdvcmllcyIsIm9iamVjdENvbG9yIiwib2JqZWN0IiwiZGVmYXVsdENvbG9yIiwiY2F0ZWdvcnkiLCJjb2xvciIsImNhbkdBU2VsZWN0aW9uQmVJbmNyZWFzZWQiLCJnYUFyZWEiLCJkZWZhdWx0VmFsdWUiLCJudW1Cb29rZWQiLCJvYmplY3RJY29uIiwiZGVmYXVsdEljb24iLCJvYmplY3RXaXRob3V0Q2F0ZWdvcnlTZWxlY3RhYmxlIiwib2JqZWN0VG9vbHRpcCIsInNob3dBY3Rpb25IaW50Iiwic2hvd0F2YWlsYWJpbGl0eSIsInNob3dDYXRlZ29yeSIsInNob3dMYWJlbCIsInNob3dQcmljaW5nIiwic2hvd1VuYXZhaWxhYmxlTm90aWNlIiwic3R5bGl6ZWRMYWJlbCIsImNvbmZpcm1TZWxlY3Rpb25Pbk1vYmlsZSIsImNvbG9ycyIsImN1cnNvclRvb2x0aXBCYWNrZ3JvdW5kQ29sb3IiLCJ0b29sdGlwSW5mbyIsImZvcm1hdHRlZFByaWNlIiwic2VhdFNlY3Rpb24iLCJzZWN0aW9uIiwic2VhdFJvdyIsInNlYXRMYWJlbCIsIm93biIsInNlYXRQcmljZSIsInNlYXRQcmljZUYiLCJzZWF0Tm90aWNlIiwic2VhdEFsZXJ0Iiwib25DaGFydFJlbmRlcmVkIiwiY2hhcnQiLCJvbk9iamVjdERlc2VsZWN0ZWQiLCJkZXNlbGVjdGVkVGlja2V0VHlwZSIsIm9uT2JqZWN0U2VsZWN0ZWQiLCJkZXNlbGVjdGVkIiwiY29uZmlybSIsImRlc2VsZWN0IiwicHJpY2VGb3JtYXR0ZXIiLCJyZW5kZXIiLCJzdHlsZSIsImJnQ29sb3IiLCJzdHJva2VDb2xvciIsIm5vdEF2YWlsYWJsZUNvbG9yIiwiYmdDb2xvclNlbGVjdGVkIiwiZm9udCIsImZvbnRGYW1pbHkiLCJmb250V2VpZ2h0Iiwibm90QXZhaWxhYmxlUG9wb3Zlckh0bWwiLCJzaG93Wm9vbU91dEJ1dHRvbiIsIl9hcyIsIm
8443NoYXJ0TGF5b3V0IiwidG9rZW4iLCJjaGFydElkIiwiY29udGFpbmVySWQiLCJldmVudElkIiwicHJpY2VzIiwib2JqZWN0cyIsInRoZW1lIiwib25PYmplY3RDbGljayIsIm9uT2JqZWN0SG92ZXIiLCJtYWluIiwic2VhdCIsImZvb3RlciIsImZ1bGxSZXRhaWxQcmljZSIsInByaWNldCIsInNob3dQb3BvdmVyIiwibXlTZWxlY3RkT2JqZWN0IiwiY2F0SWQiLCJpMiIsIm9vb2JqIiwib2JqSWQiLCJuZXdNeXNlbGVjdGVkT2JqZWN0IiwiaTMiLCJ0b2dnbGVDYXRlZ29yeSIsInRlbXAiLCJuZXdDYXRlZ29yeSIsInRvZ2dsZUNhdGVnb3JpZXMiLCJzZWxlY3RlZFZhbCIsInByaWNlQiIsImtleXAiLCJtaW5UaWNrIiwibWF4VGljayIsIlJ3YkV2ZW50c0Zvcm1Nb2RlbCIsImdldFdhcm5pbmdEaXYiLCJtc2ciLCJzaG93TG9hZGluZyIsInN3YWwiLCJsb2FkaW5nX3RleHQiLCJzaG93U3VjY2VzcyIsInNob3dFcnJvciIsImNsb3NlTW9kYWwiLCJSd2JFdmVudHNGb3JtU3BpbmUiLCJVVEMiLCJnZXRIb3VycyIsImdldE1pbnV0ZXMiLCJnZXRTZWNvbmRzIiwiZGF0ZWkiLCJkYXRlSW5wdXQiLCJmdWxsWWVhciIsImlzTGVhcFllYXIiLCJmdWxsTW9udGgiLCJvZmZzZXREc3QiLCJpc0RTVCIsInR6T2Zmc2V0IiwiY2hlY2siLCJ0ZXN0IiwibmF2aWdhdG9yIiwidXNlckFnZW50IiwidmVuZG9yIiwib3BlcmEiLCJhcnIiLCJlbGVtIiwiaGVhZCIsImhlYWRUYWJsZSIsImJvZHlUYWJsZSIsImZvb3RlclRhYmxlIiwicm93SHRtbCIsImNvbHNwYW4iLCJjb2wiLCJyb3dIdG1sMSIsInNEYXRlIiwid2l0aFRpbWUiLCJlbGVtZW50VG9wIiwib2Zmc2V0IiwidG9wIiwiZWxlbWVudEJvdHRvbSIsIm91dGVySGVpZ2h0Iiwidmlld3BvcnRUb3AiLCJ2aWV3cG9ydEJvdHRvbSIsImQxIiwiZDIiLCJnZXRQcmljaW5nIiwic2xpY2UiLCJnZXRNYXhTZWxlY3RlZFNlYXRzIiwibWF4U2VsZWN0ZWQiLCJnZXROdW1iZXJPZlBsYWNlc1RvU2VsZWN0IiwiaXNOYU4iLCJnZXRXb3Jrc3BhY2UiLCJnZXRFdmVudEtleSIsImJ0biIsImN1cnJlbnRGb3JtIiwib3duUHJpY2luZ0RhdGEiLCJKRG9jdW1lbnQiLCJKQnRuIiwiSlNlYXRRdHkiLCJKU2VhdERpdiIsIkpQcm9kdWN0SWQiLCJKUXR5VGlja2V0cyIsIkpRdHkiLCJKRmxhdENhbGVuZGFySW5wdXQiLCJ0aW1lX3ZhbCIsIkpTZWF0c01hcCIsImZvcm0iLCJpcyIsIm1haW5Gb3JtIiwibmV4dEFsbCIsInByZXBlbmRUbyJdLCJtYXBwaW5ncyI6IjtRQUFBO1FBQ0E7O1FBRUE7UUFDQTs7UUFFQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTs7UUFFQTtRQUNBOztRQUVBO1FBQ0E7O1FBRUE7UUFDQTtRQUNBOzs7UUFHQTtRQUNBOztRQUVBO1FBQ0E7O1FBRUE7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQSxLQUFLO1FBQ0w7UUFDQTs7UUFFQTtRQUNBO1FBQ0E7UUFDQSwyQkFBMkIsMEJBQTBCLEVBQUU7UUFDdkQsaUNBQWlDLGVBQWU7UUFDaEQ7UUFDQTtRQUNBOztRQUVBO1FBQ0Esc0RBQXNELCtEQUErRDs7UUFFckg7UUFDQTs7UUFFQTtRQUNBOzs7Ozs7Ozs7Ozs7Ozs7QUM3REE7QUFBQTtBQUFBOztBQUVBLENBQUMsVUFBVUEsQ0FBVixFQUFhQyxTQUFiLEVBQXdCO0FBQ3JCLFFBQU1DLHVCQUF1QixHQUFHLElBQUlDLDRGQUFKLEVBQWhDO0FBQ0FELHlCQUF1QixDQUFDRSxJQUF4QjtBQUNILENBSEQsRUFHR0MsTUFBTSxDQUFDQyxNQUhWLEU7Ozs7Ozs7QUNGQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBRUE7QUFDQTtBQUNBOztBQUNBLE1BQU1ILHVCQUFOLFNBQXNDSSxtRUFBdEMsQ0FBd0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VBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLDZFQUE2RTtBQUM3RTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUEsbUJBQW1CLGdCQUFnQjtBQUNuQztBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVk7QUFDWjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7O0FBRUo7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTs7QUFFQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0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BQUNBO0FBQ0E7O0FBRUE7QUFDQSw0Q0FBNEM7O0FBRTVDLHFEQUFxRDs7QUFFckQ7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0VBQWdFOztBQUVoRSx1REFBdUQ7O0FBRXZEOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBO0FBQ0EsT0FBTzs7O0FBR1A7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxnQkFBZ0I7O0FBRWhCO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQSxtQkFBbUIsNkJBQTZCO0FBQ2hEOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUN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FBR0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNDQUFzQztBQUN0QztBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0EsSUFBSTs7O0FBR0o7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbURBQW1EOztBQUVuRDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBLG1DQUFtQzs7QUFFbkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMLHFCQUFxQjtBQUNyQjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBLHFCQUFxQixtQkFBbUI7QUFDeEM7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QU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BQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLHlDQUF5QztBQUN6QztBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQ0FBb0M7O0FBRXBDO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWCxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsT0FBTztBQUNQLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsT0FBTztBQUNQOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0EsT0FBTztBQUNQLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0Esb0JBQW9CO0FBQ3BCOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsT0FBTztBQUNQLEtBQUs7QUFDTDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsSUFBSTs7QUFFSjtBQUNBLG1EQUFtRDs7QUFFbkQ7QUFDQSxnQ0FBZ0M7O0FBRWhDO0FBQ0Esa0JBQWtCO0FBQ2xCLE9BQU87QUFDUDtBQUNBOztBQUVBO0FBQ0EsS0FBSzs7O0FBR0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxLQUFLOzs7QUFHTDtBQUNBLDRDQUE0QztBQUM1QyxLQUFLO0FBQ0wsZ0NBQWdDO0FBQ2hDLEtB
8443QUs7QUFDTCwwQkFBMEI7QUFDMUIsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxlQUFlO0FBQ2Y7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsbUJBQW1CLDhCQUE4QjtBQUNqRDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLHFDQUFxQzs7QUFFckM7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxpREFBaUQ7QUFDakQ7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLDZDQUE2Qzs7QUFFN0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxxQ0FBcUM7O0FBRXJDO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSwrQkFBK0I7O0FBRS9CO0FBQ0E7QUFDQTtBQUNBLEtBQUs7OztBQUdMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBLCtCQUErQjs7QUFFL0IsK0JBQStCOztBQUUvQiw0QkFBNEIsMERBQTBEOzs7QUFHdEY7QUFDQSxpQ0FBaUM7O0FBRWpDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLHVDQUF1Qzs7QUFFdkM7QUFDQTtBQUNBLE9BQU87QUFDUCxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPOztBQUVQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUEsa0NBQWtDOztBQUVsQztBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLEtBQUs7O0FBRUwsbUNBQW1DOztBQUVuQztBQUNBO0FBQ0E7QUFDQTtBQUNBLDBCQUEwQjtBQUMxQjtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsYUFBYTtBQUNiLEtBQUs7OztBQUdMO0FBQ0E7QUFDQTtBQUNBLEtBQUs7OztBQUdMO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsOEJBQThCO0FBQzlCO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLDJCQUEyQjs7QUFFM0I7QUFDQSxxQ0FBcUM7O0FBRXJDO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsT0FBTzs7O0FBR1A7QUFDQTtBQUNBOztBQUVBOztBQUVBLHlFQUF5RSxhQUFhO0FBQ3RGO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87O0FBRVA7O0FBRUE7QUFDQSxLQUFLOzs7QUFHTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQSxHQUFHLEdBQUc7OztBQUdOLGtEQUFrRDs7O0FBR2xELHNDQUFzQzs7O0FBR3RDO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUEsQ0FBQztBQUNELHFEQUFxRCIsImZpbGUiOiJyd2ItZXZlbnRzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiIFx0Ly8gVGhlIG1vZHVsZSBjYWNoZVxuIFx0dmFyIGluc3RhbGxlZE1vZHVsZXMgPSB7fTtcblxuIFx0Ly8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbiBcdGZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcblxuIFx0XHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcbiBcdFx0aWYoaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0pIHtcbiBcdFx0XHRyZXR1cm4gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0uZXhwb3J0cztcbiBcdFx0fVxuIFx0XHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuIFx0XHR2YXIgbW9kdWxlID0gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0gPSB7XG4gXHRcdFx0aTogbW9kdWxlSWQsXG4gXHRcdFx0bDogZmFsc2UsXG4gXHRcdFx0ZXhwb3J0czoge31cbiBcdFx0fTtcblxuIFx0XHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cbiBcdFx0bW9kdWxlc1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cbiBcdFx0Ly8gRmxhZyB0aGUgbW9kdWxlIGFzIGxvYWRlZFxuIFx0XHRtb2R1bGUubCA9IHRydWU7XG5cbiBcdFx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcbiBcdFx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xuIFx0fVxuXG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlcyBvYmplY3QgKF9fd2VicGFja19tb2R1bGVzX18pXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm0gPSBtb2R1bGVzO1xuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZSBjYWNoZVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5jID0gaW5zdGFsbGVkTW9kdWxlcztcblxuIFx0Ly8gZGVmaW5lIGdldHRlciBmdW5jdGlvbiBmb3IgaGFybW9ueSBleHBvcnRzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQgPSBmdW5jdGlvbihleHBvcnRzLCBuYW1lLCBnZXR0ZXIpIHtcbiBcdFx0aWYoIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBuYW1lKSkge1xuIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBuYW1lLCB7XG4gXHRcdFx0XHRjb25maWd1cmFibGU6IGZhbHNlLFxuIFx0XHRcdFx0ZW51bWVyYWJsZTogdHJ1ZSxcbiBcdFx0XHRcdGdldDogZ2V0dGVyXG4gXHRcdFx0fSk7XG4gXHRcdH1cbiBcdH07XG5cbiBcdC8vIGdldERlZmF1bHRFeHBvcnQgZnVuY3Rpb24gZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBub24taGFybW9ueSBtb2R1bGVzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm4gPSBmdW5jdGlvbihtb2R1bGUpIHtcbiBcdFx0dmFyIGdldHRlciA9IG1vZHVsZSAmJiBtb2R1bGUuX19lc01vZHVsZSA/XG4gXHRcdFx0ZnVuY3Rpb24gZ2V0RGVmYXVsdCgpIHsgcmV0dXJuIG1vZHVsZVsnZGVmYXVsdCddOyB9IDpcbiBcdFx0XHRmdW5jdGlvbiBnZXRNb2R1bGVFeHBvcnRzKCkgeyByZXR1cm4gbW9kdWxlOyB9O1xuIFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQoZ2V0dGVyLCAnYScsIGdldHRlcik7XG4gXHRcdHJldHVybi
8443BnZXR0ZXI7XG4gXHR9O1xuXG4gXHQvLyBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGxcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubyA9IGZ1bmN0aW9uKG9iamVjdCwgcHJvcGVydHkpIHsgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIHByb3BlcnR5KTsgfTtcblxuIFx0Ly8gX193ZWJwYWNrX3B1YmxpY19wYXRoX19cbiBcdF9fd2VicGFja19yZXF1aXJlX18ucCA9IFwiL2Fzc2V0cy9qc1wiO1xuXG4gXHQvLyBMb2FkIGVudHJ5IG1vZHVsZSBhbmQgcmV0dXJuIGV4cG9ydHNcbiBcdHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKF9fd2VicGFja19yZXF1aXJlX18ucyA9IDApO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIHdlYnBhY2svYm9vdHN0cmFwIDYyMDJlN2VhMTU1MjEzMDVjZDhjIiwiaW1wb3J0IFJ3YkV2ZW50c0Zvcm1Db250cm9sbGVyIGZyb20gJy4vZnJvbnRlbmQvZnJhbWV3b3JrL1J3YkV2ZW50c0Zvcm1Db250cm9sbGVyJztcclxuXHJcbihmdW5jdGlvbiAoJCwgdW5kZWZpbmVkKSB7XHJcbiAgICBjb25zdCByd2JFdmVudHNGb3JtQ29udHJvbGxlciA9IG5ldyBSd2JFdmVudHNGb3JtQ29udHJvbGxlcigpO1xyXG4gICAgcndiRXZlbnRzRm9ybUNvbnRyb2xsZXIuaW5pdCgpO1xyXG59KSh3aW5kb3cualF1ZXJ5KTtcclxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vbWFpbl9mcm9udGVuZC5qcyIsImltcG9ydCBSd2JFdmVudHNGb3JtVmlldyBmcm9tIFwiLi9Sd2JFdmVudHNGb3JtVmlld1wiO1xyXG5pbXBvcnQgU3dhbCBmcm9tICdzd2VldGFsZXJ0Mi9kaXN0L3N3ZWV0YWxlcnQyLmpzJ1xyXG5cclxuLyoqXHJcbiAqIENvbnRyb2xsZXIgdGFrZXMgY2FyZSB0byBhdHRhY2ggYW5kIGV4ZWN1dGUgYW55IGFjdGlvbnMgdHJpZ2dlcmVkIG9uIHRoZSBlbGVtZW50IGFuZCBpdHMgY2hpbGRyZW5cclxuICovXHJcbmNsYXNzIFJ3YkV2ZW50c0Zvcm1Db250cm9sbGVyIGV4dGVuZHMgUndiRXZlbnRzRm9ybVZpZXcge1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKCkge1xyXG5cclxuICAgICAgICBzdXBlcigpO1xyXG4gICAgfVxyXG5cclxuICAgIHNjcm9sbFdpbmRvdygpIHtcclxuICAgICAgICBpZiAodGhpcy5pc01vYmlsZSgpKSB7XHJcbiAgICAgICAgICAgIC8vc2VhbWxlc3MuZWxlbWVudFNjcm9sbEJ5KHdpbmRvdywge2xlZnQ6IDAsIHRvcDogLTUwfSk7XHJcbiAgICAgICAgICAgIHNlYW1sZXNzLndpbmRvd1Njcm9sbEJ5KDAsIC01MCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgc2VhbWxlc3Mud2luZG93U2Nyb2xsQnkoMCwgLTEzMCk7XHJcbiAgICAgICAgICAgIC8vd2luZG93LnNjcm9sbEJ5KDAsIC0xMzApO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBzY3JvbGxXaW5kb3cyKCkge1xyXG4gICAgICAgIGlmICh0aGlzLmlzTW9iaWxlKCkpIHtcclxuICAgICAgICAgICAgLy9zZWFtbGVzcy5lbGVtZW50U2Nyb2xsQnkod2luZG93LCB7bGVmdDogMCwgdG9wOiAtNTB9KTtcclxuICAgICAgICAgICAgc2VhbWxlc3Mud2luZG93U2Nyb2xsQnkoMCwgLTcwKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBzZWFtbGVzcy53aW5kb3dTY3JvbGxCeSgwLCAtMTUwKTtcclxuICAgICAgICAgICAgLy93aW5kb3cuc2Nyb2xsQnkoMCwgLTEzMCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuXHJcbiAgICBmaXhGdWxsU2NyZWVuKCkge1xyXG4gICAgICAgIC8vIFNlbGVjdCB0aGUgbm9kZSB0aGF0IHdpbGwgYmUgb2JzZXJ2ZWQgZm9yIG11dGF0aW9uc1xyXG4gICAgICAgIC8vY29uc3QgdGFyZ2V0Tm9kZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzb21lLWlkJyk7XHJcbiAgICAgICAgaWYgKGpRdWVyeSgnLmNhcm91c2VsJykubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICBjb25zdCB0YXJnZXROb2RlID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmNhcm91c2VsJyk7XHJcblxyXG4vLyBPcHRpb25zIGZvciB0aGUgb2JzZXJ2ZXIgKHdoaWNoIG11dGF0aW9ucyB0byBvYnNlcnZlKVxyXG4gICAgICAgICAgICAvL2NvbnN0IGNvbmZpZyA9IHsgYXR0cmlidXRlczogdHJ1ZSwgY2hpbGRMaXN0OiB0cnVlLCBzdWJ0cmVlOiB0cnVlIH07XHJcbiAgICAgICAgICAgIGNvbnN0IGNvbmZpZyA9IHthdHRyaWJ1dGVzOiB0cnVlLCBhdHRyaWJ1dGVGaWx0ZXI6IFsnY2xhc3MnXX07XHJcblxyXG4vLyBDYWxsYmFjayBmdW5jdGlvbiB0byBleGVjdXRlIHdoZW4gbXV0YXRpb25zIGFyZSBvYnNlcnZlZFxyXG4gICAgICAgICAgICBjb25zdCBjYWxsYmFjayA9IGZ1bmN0aW9uIChtdXRhdGlvbnNMaXN0LCBvYnNlcnZlcikge1xyXG4gICAgICAgICAgICAgICAgLy8gVXNlIHRyYWRpdGlvbmFsICdmb3IgbG9vcHMnIGZvciBJRSAxMVxyXG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBtdXRhdGlvbiBvZiBtdXRhdGlvbnNMaXN0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy9pZiAobXV0YXRpb24udHlwZSA9PT0gJ2F0dHJpYnV0ZXMnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy9jb25zb2xlLmxvZygnVGhlICcgKyBtdXRhdGlvbi5hdHRyaWJ1dGVOYW1lICsgJyBhdHRyaWJ1dGUgd2FzIG1vZGlmaWVkLicpO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChtdXRhdGlvbi5hdHRyaWJ1dGVOYW1lID09PSAnY2xhc3MnICYmIG11dGF0aW9uLnRhcmdldC5jbGFzc0xpc3QuY29udGFpbnMoJ2lzLWZ1bGxzY3JlZW4nKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBqUXVlcnkoJyNoZWFkZXIuc3RpY2t5LWhlYWRlciAuaGVhZGVyLW1haW4uc3RpY2t5JykuY3NzKCd6LWluZGV4JywgJzEnKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgalF1ZXJ5KCcubWFwY29sdW1uJykuY3NzKCd6LWluZGV4JywgJy0xJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGpRdWVyeSgnLmJwcm9kc2VhcmNoaCcpLmNzcygnei1pbmRleCcsICctMScpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGpRdWVyeSgnI2hlYWRlci5zdGlja3ktaGVhZGVyIC5oZWFkZXItbWFpbi5zdGlja3knKS5jc3MoJ3otaW5kZXgnLCAnMTAwMScpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBqUXVlcnkoJy5icHJvZHNlYXJjaGgnKS5jc3MoJ3otaW5kZXgnLCAnNCcpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBqUXVlcnkoJy5tYXBjb2x1bW4nKS5jc3MoJ3otaW5kZXgnLCAnMTAwMDAwMDAnKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9O1xyXG5cclxuLy8gQ3JlYXRlIGFuIG9ic2VydmVyIGluc3RhbmNlIGxpbmtlZCB0byB0aGUgY2FsbGJhY2sgZnVuY3Rpb25cclxuICAgICAgICAgICAgY29uc3Qgb2JzZXJ2ZXIgPSBuZXcgTXV0YXRpb25PYnNlcnZlcihjYWxsYmFjayk7XHJcblxyXG4vLyBTdGFydCBvYnNlcnZpbmcgdGhlIHRhcmdldCBub2RlIGZvciBjb25maWd1cmVkIG11dGF0aW9uc1xyXG4gICAgICAgICAgICBvYnNlcnZlci5vYnNlcnZlKHRhcmdldE5vZGUsIGNvbmZpZyk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGRhdGVSYW5nZShzdGFydERhdGUsIHN0ZXBzID0gMSkge1xyXG4gICAgICAgIGNvbnN0IGRhdGVBcnJheSA9IFtdO1xyXG4gICAgICAgIGxldCBzZWxmID0gdGhpcztcclxuICAgICAgICBsZXQgY3VycmVudERhdGUgPSBuZXcgRGF0ZShzdGFydERhdGUpO1xyXG4gICAgICAgIGxldCBtYXhTdGVwcyA9IDc7XHJcbiAgICAgICAgaWYgKHNlbGYuaXNNb2JpbGUoKSkge1xyXG4gICAgICAgICAgICBtYXhTdGVwcyA9IDU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGxldCBwID0gMTtcclxuICAgICAgICAvL3doaWxlIChjdXJyZW50RGF0ZSA8PSBuZXcgRGF0ZShlbmREYXRlKSkge1xyXG4gICAgICAgI
8443HdoaWxlICh0cnVlKSB7XHJcbiAgICAgICAgICAgIGRhdGVBcnJheS5wdXNoKG5ldyBEYXRlKGN1cnJlbnREYXRlKSk7XHJcbiAgICAgICAgICAgIC8vIFVzZSBVVEMgZGF0ZSB0byBwcmV2ZW50IHByb2JsZW1zIHdpdGggdGltZSB6b25lcyBhbmQgRFNUXHJcbiAgICAgICAgICAgIGN1cnJlbnREYXRlLnNldFVUQ0RhdGUoY3VycmVudERhdGUuZ2V0VVRDRGF0ZSgpICsgc3RlcHMpO1xyXG4gICAgICAgICAgICBpZiAocCA+PSBtYXhTdGVwcykge1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcCsrO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIGRhdGVBcnJheTtcclxuICAgIH1cclxuXHJcbiAgICBkYXRlUmFuZ2VQcmV2KHN0YXJ0RGF0ZSwgc3RlcHMgPSAxKSB7XHJcbiAgICAgICAgY29uc3QgZGF0ZUFycmF5ID0gW107XHJcbiAgICAgICAgbGV0IHNlbGYgPSB0aGlzO1xyXG4gICAgICAgIGxldCBjdXJyZW50RGF0ZSA9IG5ldyBEYXRlKHN0YXJ0RGF0ZSk7XHJcbiAgICAgICAgbGV0IG1heFN0ZXBzID0gNztcclxuICAgICAgICBpZiAoc2VsZi5pc01vYmlsZSgpKSB7XHJcbiAgICAgICAgICAgIG1heFN0ZXBzID0gNTtcclxuICAgICAgICB9XHJcbiAgICAgICAgbGV0IHAgPSAxO1xyXG4gICAgICAgIC8vd2hpbGUgKGN1cnJlbnREYXRlIDw9IG5ldyBEYXRlKGVuZERhdGUpKSB7XHJcbiAgICAgICAgd2hpbGUgKHRydWUpIHtcclxuICAgICAgICAgICAgZGF0ZUFycmF5LnB1c2gobmV3IERhdGUoY3VycmVudERhdGUpKTtcclxuICAgICAgICAgICAgLy8gVXNlIFVUQyBkYXRlIHRvIHByZXZlbnQgcHJvYmxlbXMgd2l0aCB0aW1lIHpvbmVzIGFuZCBEU1RcclxuICAgICAgICAgICAgY3VycmVudERhdGUuc2V0VVRDRGF0ZShjdXJyZW50RGF0ZS5nZXRVVENEYXRlKCkgLSBzdGVwcyk7XHJcbiAgICAgICAgICAgIGlmIChwID49IG1heFN0ZXBzKSB7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBwKys7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gZGF0ZUFycmF5LnJldmVyc2UoKTtcclxuICAgIH1cclxuXHJcbiAgICBpbml0KCkge1xyXG4gICAgICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xyXG4gICAgICAgIGlmIChqUXVlcnkoJy5ob3RlbG1hcGNvbHVtbicpKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZml4RnVsbFNjcmVlbigpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBqUXVlcnkoJy5iYXR0cmFjdGlvbl9saW5rJykub24oJ2NsaWNrJywgZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICBzZWFtbGVzcy5lbGVtZW50U2Nyb2xsSW50b1ZpZXcoZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmJwc21jX3dyYXBwZXInKSwge1xyXG4gICAgICAgICAgICAgICAgYmVoYXZpb3I6ICdzbW9vdGgnLFxyXG4gICAgICAgICAgICAgICAgaW5saW5lOiAnY2VudGVyJyxcclxuICAgICAgICAgICAgICAgIGJsb2NrOiAnY2VudGVyJ1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgc2VsZi5zY3JvbGxXaW5kb3coKTtcclxuICAgICAgICB9KTtcclxuICAgICAgICBpZiAodGhpcy5KQnV5VGlja2V0cygpLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgdGhpcy5oaWRlUXR5QWRkVG9DYXJ0KCk7XHJcbiAgICAgICAgICAgIHRoaXMuYnV5VGlja2V0c0FjdGlvbigpO1xyXG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5KRmxhdENhbGVuZGFyKCkubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5KSXNBdHRyYWN0aW9uKCkpIHtcclxuICAgICAgICAgICAgICAgIGlmIChqUXVlcnkoJy5uYXZhaWxhYmxlJykubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGpRdWVyeSgnLmJwc21fd3JhcHBlcicpLmNsb3Nlc3QoJy53cC1ibG9jay1xdWJlbHktcm93JykucmVtb3ZlKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgalF1ZXJ5KHdpbmRvdykub24oJ3Jlc2l6ZSBzY3JvbGwnLCBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGpRdWVyeSgnI3RpY2tldHNfc2VsZWN0ZWQnKS5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLmlzSW5WaWV3cG9ydChqUXVlcnkoJyN0aWNrZXRzX3NlbGVjdGVkJykpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkbyBzb21ldGhpbmdcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpRdWVyeSgnLmJwcm9jZWVkX3RpY2tldHMnKS5oaWRlKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2lmIChzZWxmLmlzTW9iaWxlKCkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpRdWVyeSgnLmJwcm9jZWVkX3RpY2tldHMnKS5zaG93KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL31cclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB0aGlzLkpUaWNrZXRzQ2FydCgpLmhpZGUoKTtcclxuICAgICAgICAgICAgdGhpcy5KUHJpY2VNYXAoKS5oaWRlKCk7XHJcbiAgICAgICAgICAgIHRoaXMuSlByaWNlTWFwU2VhdHMoKS5oaWRlKCk7XHJcbiAgICAgICAgICAgIHRoaXMuSlByaWNlTWFwRXhwbGFuYXRpb24oKS5oaWRlKCk7XHJcbiAgICAgICAgICAgIHRoaXMuSkV2ZW50c1BlckRhdGUoKS5oaWRlKCk7XHJcbiAgICAgICAgICAgIHRoaXMuSkV2ZW50U2VsZWN0aW9uKCkuaGlkZSgpO1xyXG4gICAgICAgICAgICB0aGlzLkpFdmVudHNQZXJEYXRlQmVmb3JlVGV4dCgpLmhpZGUoKTtcclxuICAgICAgICAgICAgdGhpcy5KVGlja2V0c0J1dHRvbnNDYXJ0KCkuaGlkZSgpO1xyXG4gICAgICAgICAgICB0aGlzLkpUaWNrZXRzU2VsZWN0ZWRDYXJ0KCkuaGlkZSgpO1xyXG4gICAgICAgICAgICBqUXVlcnkoJ2JvZHknKS5hcHBlbmQoalF1ZXJ5KCc8YSBocmVmPVwiIzBcIiBjbGFzcz1cImJwcm9jZWVkX3RpY2tldHNcIj5Qcm9jZWVkIFdpdGggVGlja2V0czxpIGNsYXNzPVwic2x2IHNsdi1hcnJvdy1yaWdodFwiPjwvaT48L2E+JykpO1xyXG4gICAgICAgICAgICBqUXVlcnkoJy5icHJvY2VlZF90aWNrZXRzJykuaGlkZSgpO1xyXG4gICAgICAgICAgICBqUXVlcnkoJy5icHJvY2VlZF90aWNrZXRzJykub24oJ2NsaWNrJywgZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgalF1ZXJ5KCdodG1sLGJvZHknKS5hbmltYXRlKHtzY3JvbGxUb3A6IDB9LCAnc2xvdycpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgalF1ZXJ5KCcucmV0dXJuX3RvX2NhbGVuZGFyJykub24oJ2NsaWNrJywgZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgc2VhbWxlc3MuZWxlbWVudFNjcm9sbEludG9WaWV3KGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5icHNtY193cmFwcGVyJyksIHtcclxuICAgICAgICAgICAgICAgICAgICBiZWhhdmlvcjogJ3Ntb290aCcsXHJcbiAgICAgICAgICAgICAgICAgICAgaW5saW5lOiAnY2VudGVyJyxcclxuICAgICAgICAgICAgICAgICAgICBibG9jazogJ2NlbnRlcidcclxuICAgICAgICAgICAgICAgI
8443H0pO1xyXG4gICAgICAgICAgICAgICAgc2VsZi5zY3JvbGxXaW5kb3coKTtcclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy5KVGhlbWUoKSA9PT0gJ2xpZ2h0Jykge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5KQmxhbmtTZWF0c01hcCgpLmh0bWwoJzxpbWcgc3R5bGU9XCJwYWRkaW5nOjgwcHg7XCIgc3JjPVwiL3dwLWNvbnRlbnQvdGhlbWVzL3BvcnRvL2ltYWdlcy9ub19zZWxlY3Rpb25fZGF0ZV90aW1lX2xpZ2h0LnBuZ1wiLz48aDQ+UGljayBhIGRhdGUgdG8gc2VlIHRoZSBhdmFpbGFibGUgdGlja2V0czwvaDQ+Jyk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLkpCbGFua1NlYXRzTWFwKCkuaHRtbCgnPGg0PlNlbGVjdCBhIGRhdGUgZnJvbSB0aGUgQ2FsZW5kYXI8L2g0PjxpbWcgc3R5bGU9XCJwYWRkaW5nOjgwcHg7XCIgc3JjPVwiL3dwLWNvbnRlbnQvdGhlbWVzL3BvcnRvL2ltYWdlcy9ub19zZWxlY3Rpb25fZGF0ZV90aW1lLnBuZ1wiLz4nKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLnBvZHMgPSBbXTtcclxuICAgICAgICAgICAgdGhpcy5mcm9tRGVsZXRlID0gZmFsc2U7XHJcblxyXG4gICAgICAgICAgICB0aGlzLmluaXRTZWF0c01hcCgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLnNob3dQYWdlQWN0aW9ucygpO1xyXG4gICAgICAgIHRoaXMuaG90ZWxSb29tQWN0aW9ucygpO1xyXG4gICAgICAgIGlmIChqUXVlcnkoXCIjcGVyaW9kc1wiKS5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIHNlbGYuZnBzZWFyY2hTID0galF1ZXJ5KFwiI3BlcmlvZHNcIikuZmxh
8443dHBpY2tyKHtcclxuICAgICAgICAgICAgICAgIG1pbkRhdGU6IFwidG9kYXlcIixcclxuICAgICAgICAgICAgICAgIGRpc2FibGVNb2JpbGU6IHRydWUsXHJcbiAgICAgICAgICAgICAgICBkYXRlRm9ybWF0OiBcIkQsIE0gZFwiLFxyXG4gICAgICAgICAgICAgICAgc2hvd01vbnRoczogMixcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIGlmIChzZWxmLmlzTW9iaWxlKCkpIHtcclxuICAgICAgICAgICAgICAgIHNlbGYuZnBzZWFyY2hTLnNldCgnc2hvd01vbnRocycsIDEpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoc2VsZi5nZXRQYXJhbWV0ZXJCeU5hbWUoJ3NlYXJjaGNhbGInKSAhPT0gbnVsbCkge1xyXG5cclxuICAgICAgICAgICAgICAgIGlmIChzZWxmLkpTZWFyY2hCdXR0b25DYWxlbmRhcigpLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgc3RhcnRfZGF0ZSA9IHNlbGYuZ2V0UGFyYW1ldGVyQnlOYW1lKCdjYWxzdGFydF9kYXRlJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgLy9sZXQgZW5kX2RhdGUgPSBzZWxmLmdldFBhcmFtZXRlckJ5TmFtZSgnY2FsZW5kX2RhdGUnKTtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgc2NhbHR5cGUgPSBzZWxmLnNjYWx0eXBlO1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBzY2FsY2F0ID0gc2VsZi5zY2FsY2F0O1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBpZiAoc3RhcnRfZGF0ZSAhPT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgY0RhdGUgPSBuZXcgRGF0ZShzdGFydF9kYXRlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY0RhdGUuc2V0VGltZShjRGF0ZS5nZXRUaW1lKCkgKyBzZWxmLmdldFRpbWV6b25lSW5NaWxpc2Vjb25kcyhjRGF0ZSkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvL2xldCBjRGF0ZWUgPSBuZXcgRGF0ZShlbmRfZGF0ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vY0RhdGVlLnNldFRpbWUoY0RhdGVlLmdldFRpbWUoKSArIHNlbGYuZ2V0VGltZXpvbmVJbk1pbGlzZWNvbmRzKGNEYXRlZSkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmZwc2VhcmNoUy5zZXREYXRlKGNEYXRlLCB0cnVlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZGF0ZXNSID0gc2VsZi5kYXRlUmFuZ2Uoc3RhcnRfZGF0ZSwgMSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCB0b2RheSA9IERhdGUubm93KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRvZGF5ID0gdG9kYXkgKyAobmV3IERhdGUoKSkuZ2V0VGltZXpvbmVPZmZzZXQoKSAqIDYwICogMTAwMCAtIHRvZGF5ICUgKDM2MDAgKiAxMDAwICogMjQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRhdGVzUi5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYuY29tcGFyZV9hc2MoZGF0ZXNSW2ldLmdldFRpbWUoKSwgdG9kYXkpIDwgMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpRdWVyeSgnI2JjYWxlbmRhci1zZWN0aW9uJykuYXBwZW5kKGpRdWVyeSgnPGRpdiBjbGFzcz1cImNhbC1jYXJkIGJkaXNhYmxlZFwiIGJiZGF0ZT1cIicgKyBmbGF0cGlja3IuZm9ybWF0RGF0ZShkYXRlc1JbaV0sICdZLW0tZCcpICsgJ1wiPjxzcGFuIGNsYXNzPVwibW9udGhcIj4nICsgZmxhdHBpY2tyLmZvcm1hdERhdGUoZGF0ZXNSW2ldLCAnTScpICsgJzwvc3Bhbj48c3BhbiBjbGFzcz1cImRheVwiPicgKyBmbGF0cGlja3IuZm9ybWF0RGF0ZShkYXRlc1JbaV0sICdkJykgKyAnPC9zcGFuPjxzcGFuIGNsYXNzPVwid2Vla2RcIj4nICsgZmxhdHBpY2tyLmZvcm1hdERhdGUoZGF0ZXNSW2ldLCAnRCcpICsgJzwvc3Bhbj48L2Rpdj4nKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpRdWVyeSgnI2JjYWxlbmRhci1zZWN0aW9uJykuYXBwZW5kKGpRdWVyeSgnPGRpdiBjbGFzcz1cImNhbC1jYXJkXCIgYmJkYXRlPVwiJyArIGZsYXRwaWNrci5mb3JtYXREYXRlKGRhdGVzUltpXSwgJ1ktbS1kJykgKyAnXCI+PHNwYW4gY2xhc3M9XCJtb250aFwiPicgKyBmbGF0cGlja3IuZm9ybWF0RGF0ZShkYXRlc1JbaV0sICdNJykgKyAnPC9zcGFuPjxzcGFuIGNsYXNzPVwiZGF5XCI+JyArIGZsYXRwaWNrci5mb3JtYXREYXRlKGRhdGVzUltpXSwgJ2QnKSArICc8L3NwYW4+PHNwYW4gY2xhc3M9XCJ3ZWVrZFwiPicgKyBmbGF0cGlja3IuZm9ybWF0RGF0ZShkYXRlc1JbaV0sICdEJykgKyAnPC9zcGFuPjwvZGl2PicpKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmNzdGFydF9kYXRlID0gc3RhcnRfZGF0ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5jZW5kX2RhdGUgPSBmbGF0cGlja3IuZm9ybWF0RGF0ZShkYXRlc1JbZGF0ZXNSLmxlbmd0aCAtIDFdLCAnWS1tLWQnKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgalF1ZXJ5KCcjY3ByZXZfYnV0Jykub24oJ2NsaWNrJywgZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgalF1ZXJ5KCcjYmNhbGVuZGFyLXNlY3Rpb24nKS5odG1sKCcnKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB0b2RheSA9IERhdGUubm93KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2RheSA9IHRvZGF5ICsgKG5ldyBEYXRlKCkpLmdldFRpbWV6b25lT2Zmc2V0KCkgKiA2MCAqIDEwMDAgLSB0b2RheSAlICgzNjAwICogMTAwMCAqIDI0KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRhdGVzUjEgPSBzZWxmLmRhdGVSYW5nZVByZXYoc2VsZi5jc3RhcnRfZGF0ZSwgMSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmNzdGFydF9kYXRlID0gZmxhdHBpY2tyLmZvcm1hdERhdGUoZGF0ZXNSMVswXSwgJ1ktbS1kJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmNlbmRfZGF0ZSA9IGZsYXRwaWNrci5mb3JtYXREYXRl
8443KGRhdGVzUjFbZGF0ZXNSMS5sZW5ndGggLSAxXSwgJ1ktbS1kJyk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkYXRlc1IxLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYuY29tcGFyZV9hc2MoZGF0ZXNSMVtpXS5nZXRUaW1lKCksIHRvZGF5KSA8IDApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgalF1ZXJ5KCcjYmNhbGVuZGFyLXNlY3Rpb24nKS5hcHBlbmQoalF1ZXJ5KCc8ZGl2IGNsYXNzPVwiY2FsLWNhcmQgYmRpc2FibGVkXCIgYmJkYXRlPVwiJyArIGZsYXRwaWNrci5mb3JtYXREYXRlKGRhdGVzUjFbaV0sICdZLW0tZCcpICsgJ1wiPjxzcGFuIGNsYXNzPVwibW9udGhcIj4nICsgZmxhdHBpY2tyLmZvcm1hdERhdGUoZGF0ZXNSMVtpXSwgJ00nKSArICc8L3NwYW4+PHNwYW4gY2xhc3M9XCJkYXlcIj4nICsgZmxhdHBpY2tyLmZvcm1hdERhdGUoZGF0ZXNSMVtpXSwgJ2QnKSArICc8L3NwYW4+PHNwYW4gY2xhc3M9XCJ3ZWVrZFwiPicgKyBmbGF0cGlja3IuZm9ybWF0RGF0ZShkYXRlc1IxW2ldLCAnRCcpICsgJzwvc3Bhbj48L2Rpdj4nKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgalF1ZXJ5KCcjYmNhbGVuZGFyLXNlY3Rpb24nKS5hcHBlbmQoalF1ZXJ5KCc8ZGl2IGNsYXNzPVwiY2FsLWNhcmRcIiBiYmRhdGU9XCInICsgZmxhdHBpY2tyLmZvcm1hdERhdGUoZGF0ZXNSMVtpXSwgJ1ktbS1kJykgKyAnXCI+PHNwYW4gY2xhc3M9XCJtb250aFwiPicgKyBmbGF0cGlja3IuZm9ybWF0RGF0ZShkYXRlc1IxW2ldLCAnTScpICsgJzwvc3Bhbj48c3BhbiBjbGFzcz1cImRheVwiPicgKyBmbGF0cGlja3IuZm9ybWF0RGF0ZShkYXRlc1IxW2ldLCAnZCcpICsgJzwvc3Bhbj48c3BhbiBjbGFzcz1cIndlZWtkXCI+JyArIGZsYXRwaWNrci5mb3JtYXREYXRlKGRhdGVzUjFbaV0sICdEJykgKyAnPC9zcGFuPjwvZGl2PicpKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBqUXVlcnkoJy5jYWwtY2FyZCcpLnJlbW92ZUNsYXNzKCdkc2VsZWN0ZWQnKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpRdWVyeSgnW2JiZGF0ZT1cIicgKyBzZWxmLmRzZWxlY3RlZCArICdcIl0nKS5hZGRDbGFzcygnZHNlbGVjdGVkJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgalF1ZXJ5KCcjY25leHRfYnV0Jykub24oJ2NsaWNrJywgZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgalF1ZXJ5KCcjYmNhbGVuZGFyLXNlY3Rpb24nKS5odG1sKCcnKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB0b2RheSA9IERhdGUubm93KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2RheSA9IHRvZGF5ICsgKG5ldyBEYXRlKCkpLmdldFRpbWV6b25lT2Zmc2V0KCkgKiA2MCAqIDEwMDAgLSB0b2RheSAlICgzNjAwICogMTAwMCAqIDI0KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRhdGVzUjEgPSBzZWxmLmRhdGVSYW5nZShzZWxmLmNlbmRfZGF0ZSwgMSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmNzdGFydF9kYXRlID0gZmxhdHBpY2tyLmZvcm1hdERhdGUoZGF0ZXNSMVswXSwgJ1ktbS1kJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmNlbmRfZGF0ZSA9IGZsYXRwaWNrci5mb3JtYXREYXRlKGRhdGVzUjFbZGF0ZXNSMS5sZW5ndGggLSAxXSwgJ1ktbS1kJyk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkYXRlc1IxLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYuY29tcGFyZV9hc2MoZGF0ZXNSMVtpXS5nZXRUaW1lKCksIHRvZGF5KSA8IDApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgalF1ZXJ5KCcjYmNhbGVuZGFyLXNlY3Rpb24nKS5hcHBlbmQoalF1ZXJ5KCc8ZGl2IGNsYXNzPVwiY2FsLWNhcmQgYmRpc2FibGVkXCIgYmJkYXRlPVwiJyArIGZsYXRwaWNrci5mb3JtYXREYXRlKGRhdGVzUjFbaV0sICdZLW0tZCcpICsgJ1wiPjxzcGFuIGNsYXNzPVwibW9udGhcIj4nICsgZmxhdHBpY2tyLmZvcm1hdERhdGUoZGF0ZXNSMVtpXSwgJ00nKSArICc8L3NwYW4+PHNwYW4gY2xhc3M9XCJkYXlcIj4nICsgZmxhdHBpY2tyLmZvcm1hdERhdGUoZGF0ZXNSMVtpXSwgJ2QnKSArICc8L3NwYW4+PHNwYW4gY2xhc3M9XCJ3ZWVrZFwiPicgKyBmbGF0cGlja3IuZm9ybWF0RGF0ZShkYXRlc1IxW2ldLCAnRCcpICsgJzwvc3Bhbj48L2Rpdj4nKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgalF1ZXJ5KCcjYmNhbGVuZGFyLXNlY3Rpb24nKS5hcHBlbmQoalF1ZXJ5KCc8ZGl2IGNsYXNzPVwiY2FsLWNhcmRcIiBiYmRhdGU9XCInICsgZmxhdHBpY2tyLmZvcm1hdERhdGUoZGF0ZXNSMVtpXSwgJ1ktbS1kJykgKyAnXCI+PHNwYW4gY2xhc3M9XCJtb250aFwiPicgKyBmbGF0cGlja3IuZm9ybWF0RGF0ZShkYXRlc1IxW2ldLCAnTScpICsgJzwvc3Bhbj48c3BhbiBjbGFzcz1cImRheVwiPicgKyBmbGF0cGlja3IuZm9ybWF0RGF0ZShkYXRlc1IxW2ldLCAnZCcpICsgJzwvc3Bhbj48c3BhbiBjbGFzcz1cIndlZWtkXCI+JyArIGZsYXRwaWNrci5mb3JtYXREYXRlKGRhdGVzUjFbaV0sICdEJykgKyAnPC9zcGFuPjwvZGl2PicpKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBqUXVlcnkoJy5jYWwtY2FyZCcpLnJlbW92ZUNsYXNzKCdkc2VsZWN0ZWQnKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpRdWVyeSgnW2JiZGF0ZT1cIicgKyBzZWxmLmRzZWxlY3RlZCArICdcIl0nKS5hZGRDbGFzcygnZHNlbGVjdGVkJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgI
8443H0pO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChzdGFydF9kYXRlICE9PSBudWxsKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBqUXVlcnkoJ2JvZHknKS5vbignY2hhbmdlJywgJyNzY2FsdHlwZScsIGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuc2NhbHR5cGUgPSBqUXVlcnkodGhpcykudmFsKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkYXRhID0ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbjogJ2NhbF9zZWxlY3RlZCcsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRfZGF0ZTogalF1ZXJ5KHRoaXMpLmF0dHIoJ2RkZGF0ZScpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYWx0eXBlOiBzZWxmLnNjYWx0eXBlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYWxjYXQ6IHNlbGYuc2NhbGNhdCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWN1cml0eTogalF1ZXJ5KCcjcndiX2NhbF9zZWxlY3RlZF9ub25jZScpLnZhbCgpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpRdWVyeSgnI2JjYWxlbmRhci1zZWN0aW9uLXdyYXBwZXInKS5Mb2FkaW5nT3ZlcmxheShcInNob3dcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBqUXVlcnkuYWpheCh7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ1BPU1QnLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFUeXBlOiAnanNvbicsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXJsOiBiYkxvY2FsLmFqYXhfdXJsLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGE6IGRhdGEsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VjY2VzczogalF1ZXJ5LnByb3h5KHNlbGYuY2FsQ29tcGxldGVkLCBzZWxmKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgalF1ZXJ5KCdib2R5Jykub24oJ2NoYW5nZScsICcjc2NhbGNhdCcsIGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuc2NhbGNhdCA9IGpRdWVyeSh0aGlzKS52YWwoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRhdGEgPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uOiAnY2FsX3NlbGVjdGVkJyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydF9kYXRlOiBqUXVlcnkodGhpcykuYXR0cignZGRkYXRlJyksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NhbHR5cGU6IHNlbGYuc2NhbHR5cGUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGNhdDogc2VsZi5zY2FsY2F0LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlY3VyaXR5OiBqUXVlcnkoJyNyd2JfY2FsX3NlbGVjdGVkX25vbmNlJykudmFsKClcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgalF1ZXJ5KCcjYmNhbGVuZGFyLXNlY3Rpb24td3JhcHBlcicpLkxvYWRpbmdPdmVybGF5KFwic2hvd1wiKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpRdWVyeS5hamF4KHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnUE9TVCcsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVR5cGU6ICdqc29uJyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cmw6IGJiTG9jYWwuYWpheF91cmwsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YTogZGF0YSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWNjZXNzOiBqUXVlcnkucHJveHkoc2VsZi5jYWxDb21wbGV0ZWQsIHNlbGYpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBqUXVlcnkoJ2JvZHknKS5vbignY2xpY2snLCAnLmNhbC1jYXJkJywgZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgalF1ZXJ5KCcjYmNhbGVuZGFyLXNlY3Rpb24td3JhcHBlcicpLkxvYWRpbmdPdmVybGF5KFwic2hvd1wiKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpRdWVyeSgnLmNhbC1jYXJkJykucmVtb3ZlQ2xhc3MoJ2RzZWxlY3RlZCcpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgalF1ZXJ5KHRoaXMpLmFkZENsYXNzKCdkc2VsZWN0ZWQnKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZHNlbGVjdGVkID0galF1ZXJ5KHRoaXMpLmF0dHIoJ2JiZGF0ZScpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZGF0YSA9IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb246ICdjYWxfc2VsZWN0ZWQnLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0X2RhdGU6IGpRdWVyeSh0aGlzKS5hdHRyKCdiYmRhdGUnKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FsdHlwZTogc2VsZi5zY2FsdHlwZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FsY2F0OiBzZWxmLnNjYWxjYXQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VjdXJpdHk6IGpRdWVyeSgnI3J3Yl9jYWxfc2VsZWN0ZWRfbm9uY2UnKS52YWwoKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfTtcclxuXHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgalF1ZXJ5LmFqYXgoe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI
8443HR5cGU6ICdQT1NUJyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhVHlwZTogJ2pzb24nLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVybDogYmJMb2NhbC5hamF4X3VybCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhOiBkYXRhLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3M6IGpRdWVyeS5wcm94eShzZWxmLmNhbENvbXBsZXRlZCwgc2VsZilcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLmRzZWxlY3RlZCA9PSAnJykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgalF1ZXJ5KCdbYmJkYXRlPVwiJyArIHN0YXJ0X2RhdGUgKyAnXCJdJykudHJpZ2dlcignY2xpY2snKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBqUXVlcnkoJyNiY2FsZW5kYXItc2VjdGlvbi13cmFwcGVyJykuY3NzKCdkaXNwbGF5JywgJ2dyaWQnKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKHNlbGYuSlNlYXJjaEJ1dHRvbkNhbGVuZGFyKCkubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgc2VsZi5KU2VhcmNoQnV0dG9uQ2FsZW5kYXIoKS5vbignY2xpY2snLCBqUXVlcnkucHJveHkoc2VsZi5zZWFyY2hDYWxlbmRhckJ1dHRvbiwgc2VsZikpXHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChqUXVlcnkoXCIjcGVyaW9kXCIpLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgc2VsZi5mcHNlYXJjaCA9IGpRdWVyeShcIiNwZXJpb2RcIikuZmxhdHBpY2tyKHtcclxuICAgICAgICAgICAgICAgIG1vZGU6IFwicmFuZ2VcIixcclxuICAgICAgICAgICAgICAgIG1pbkRhdGU6IFwidG9kYXlcIixcclxuICAgICAgICAgICAgICAgIGRpc2FibGVNb2JpbGU6IHRydWUsXHJcbiAgICAgICAgICAgICAgICBkYXRlRm9ybWF0OiBcIkQsIE0gZFwiLFxyXG4gICAgICAgICAgICAgICAgb25DaGFuZ2U6IGZ1bmN0aW9uIChzZWxlY3RlZERhdGVzLCBkYXRlU3RyLCBpbnN0YW5jZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLmVsZW1lbnQudmFsdWUgPSBkYXRlU3RyLnJlcGxhY2UoJ3RvJywgJy0nKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZWN0ZWREYXRlcy5sZW5ndGggPT09IDIpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGRpZmZUaW1lID0gTWF0aC5hYnMoc2VsZWN0ZWREYXRlc1sxXSAtIHNlbGVjdGVkRGF0ZXNbMF0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgZGlmZkRheXMgPSBNYXRoLmNlaWwoZGlmZlRpbWUgLyAoMTAwMCAqIDYwICogNjAgKiAyNCkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgYWRkRGF5cyA9IE1hdGgubWF4KDAsIDEgLSBkaWZmRGF5cyk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWRkRGF5cyA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkRGF0ZXNbMV0uc2V0RGF0ZShzZWxlY3RlZERhdGVzWzFdLmdldERhdGUoKSArIGFkZERheXMpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2Uuc2V0RGF0ZShzZWxlY3RlZERhdGVzKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLmp1bXBUb0RhdGUoc2VsZWN0ZWREYXRlc1swXSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2Uub3BlbigpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgc2hvd01vbnRoczogMixcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIGlmIChzZWxmLmlzTW9iaWxlKCkpIHtcclxuICAgICAgICAgICAgICAgIHNlbGYuZnBzZWFyY2guc2V0KCdzaG93TW9udGhzJywgMSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKHNlbGYuZ2V0UGFyYW1ldGVyQnlOYW1lKCdzZWFyY2hoYicpICE9PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICBqUXVlcnkoJy5ob3RlbC1jYXJkJykub24oJ2NsaWNrJywgZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5ocmVmID0galF1ZXJ5KHRoaXMpLmF0dHIoJ3B1cmwnKTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgaWYgKHNlbGYuSlNlYXJjaEJ1dHRvbigpLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgc3RhcnRfZGF0ZSA9IHNlbGYuZ2V0UGFyYW1ldGVyQnlOYW1lKCdoc3RhcnRfZGF0ZScpO1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBlbmRfZGF0ZSA9IHNlbGYuZ2V0UGFyYW1ldGVyQnlOYW1lKCdoZW5kX2RhdGUnKTtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgYWR1bHRzID0gc2VsZi5nZXRQYXJhbWV0ZXJCeU5hbWUoJ2hhZHVsdHMnKTtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgY2hpbGRyZW4gPSBzZWxmLmdldFBhcmFtZXRlckJ5TmFtZSgnaGNoaWxkcmVuJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IGNoaWxkcmVuYWdlc2EgPSBzZWxmLmdldFBhcmFtZXRlckJ5TmFtZSgnaGNoaWxkcmVuYWdlcycpO1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCByb29tcyA9IHNlbGYuZ2V0UGFyYW1ldGVyQnlOYW1lKCdocm9vbXMnKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoc3RhcnRfZGF0ZSAhPT0gbnVsbCAmJiBlbmRfZGF0ZSAhPT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgY0RhdGUgPSBuZXcgRGF0ZShzdGFydF9kYXRlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY0RhdGUuc2V0VGltZS
8443hjRGF0ZS5nZXRUaW1lKCkgKyBzZWxmLmdldFRpbWV6b25lSW5NaWxpc2Vjb25kcyhjRGF0ZSkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgY0RhdGVlID0gbmV3IERhdGUoZW5kX2RhdGUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjRGF0ZWUuc2V0VGltZShjRGF0ZWUuZ2V0VGltZSgpICsgc2VsZi5nZXRUaW1lem9uZUluTWlsaXNlY29uZHMoY0RhdGVlKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZnBzZWFyY2guc2V0RGF0ZShbY0RhdGUsIGNEYXRlZV0sIHRydWUpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAoYWR1bHRzICE9PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGpRdWVyeSgnI3NlbGVjdEFkdWx0cycpLnZhbChhZHVsdHMpLnRyaWdnZXIoJ2NoYW5nZScpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAocm9vbXMgIT09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgalF1ZXJ5KCcjc2VsZWN0Um9vbXMnKS52YWwocm9vbXMpLnRyaWdnZXIoJ2NoYW5nZScpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAoY2hpbGRyZW4gIT09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgalF1ZXJ5KCcjc2VsZWN0Q2hpbGRyZW4nKS52YWwoY2hpbGRyZW4pLnRyaWdnZXIoJ2NoYW5nZScpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAoY2hpbGRyZW5hZ2VzYSAhPT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgY2hpbGRyZW5hZ2VzID0gY2hpbGRyZW5hZ2VzYS5zcGxpdCgnLScpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNoaWxkcmVuYWdlcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgalF1ZXJ5KCcjY2hpbGRyZW4tZ3Vlc3RzLXNlY3Rpb24gLmd1ZXN0YzplcSgnICsgaSArICcpJykudmFsKGNoaWxkcmVuYWdlc1tpXSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IHNjcm9sbCA9IHNlbGYuZ2V0UGFyYW1ldGVyQnlOYW1lKCdzY3JvbGwnKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoc2Nyb2xsID09ICcxJykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoalF1ZXJ5KCcuYnBjc193cmFwcGVyJykubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgalF1ZXJ5KCcuYnBjc193cmFwcGVyJykuY2xvc2VzdCgnLnF1YmVseS1jb2x1bW4taW5uZXInKS5jc3MoJ3BhZGRpbmcnLCAnOHB4Jyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VhbWxlc3MuZWxlbWVudFNjcm9sbEludG9WaWV3KGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5icGNzX3dyYXBwZXInKSwge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZWhhdmlvcjogJ3Ntb290aCcsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlubGluZTogJ3RvcCcsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrOiAndG9wJ1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuc2Nyb2xsV2luZG93MigpO1xyXG5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCA2MDApO1xyXG5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcblxyXG4gICAgICAgICAgICBpZiAoc2VsZi5KU2VhcmNoQnV0dG9uKCkubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgc2VsZi5KU2VhcmNoQnV0dG9uKCkub24oJ2NsaWNrJywgalF1ZXJ5LnByb3h5KHNlbGYuc2VhcmNoSG90ZWxzQnV0dG9uLCBzZWxmKSlcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKHNlbGYuSlBhY2tCdXR0b24oKS5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICBzZWxmLkpQYWNrQnV0dG9uKCkub24oJ2NsaWNrJywgalF1ZXJ5LnByb3h5KHNlbGYuc3RhcnRQYWNrQnV0dG9uLCBzZWxmKSlcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBqUXVlcnkoJy5wYWNrX3ByaWNlJykuZWFjaChmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICBqUXVlcnkodGhpcykuaHRtbCgnUGxlYXNlIHdhaXQgYXMgd2UgY2FsY3VsYXRlIHRoZSB2YWx1ZScpO1xyXG4gICAgICAgICAgICAgICAgbGV0IGZvbnRzaXplID0galF1ZXJ5KHRoaXMpLmNzcygnZm9udC1zaXplJyk7XHJcbiAgICAgICAgICAgICAgICBqUXVlcnkodGhpcykuY3NzKCdmb250LXNpemUnLCAnMTVweCcpO1xyXG4gICAgICAgICAgICAgICAgc2VsZi5jYWxjdWxhdGVQYWNrUHJpY2UoalF1ZXJ5KHRoaXMpLCBmb250c2l6ZSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICB9XHJcblxyXG4gICAgc2hvd1BhZ2VBY3Rpb25zKCkge1xyXG4gICAgICAgIGpRdWVyeSgnYm9keScpLm9uKCdjbGljaycsICcuYmJ2aWQnLCBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIC8valF1ZXJ5KCcuYmJ2aWQnKS5vbignY2xpY2snLCBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIGpRdWVyeS5tYWduaWZpY1BvcHVwLm9wZW4oe1xyXG4gICAgICAgICAgICAgICAgaXRlbXM6IHtcclxuICAgICAgICAgICAgICAgICAgICBzcmM6IGpRdWVyeSgnLmxpZ2h0Yl92aWRlbycpLmh0bWwoKSxcclxuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnaW5saW5lJyxcclxuICAgICAgICAgICAgICAgIH0sXHJcblxyXG4gICAgICAgICAgICAgICAgbWFpbkNsYXNzOiAnYmxvY2tz
8443LWNvbnQtYiBtZnAtZmFkZScsXHJcbiAgICAgICAgICAgICAgICAvL3JlbW92YWxEZWxheTogMTYwLFxyXG4gICAgICAgICAgICAgICAgcHJlbG9hZGVyOiB0cnVlLFxyXG4gICAgICAgICAgICAgICAgb3ZlcmZsb3dZOiAnYXV0bycsXHJcbiAgICAgICAgICAgICAgICBmaXhlZENvbnRlbnRQb3M6IHRydWUsXHJcbiAgICAgICAgICAgICAgICBjYWxsYmFja3M6IHtcclxuICAgICAgICAgICAgICAgICAgICBvcGVuOiBmdW5jdGlvbiAoKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgIH1cclxuXHJcbiAgICBob3RlbFJvb21BY3Rpb25zKCkge1xyXG5cclxuICAgICAgICBqUXVlcnkoJy5yb29tZGV0YWlscycpLmFwcGVuZFRvKCcjY29udGVudCcpO1xyXG4gICAgICAgIGpRdWVyeSgnLnJvb20tY2FyZCAuaW1hZ2Utd3JhcHBlciwgLnJvb20tY2FyZCAuaG90ZWwtdGl0bGUnKS5vbignY2xpY2snLCBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIGxldCByaWQgPSBqUXVlcnkodGhpcykuYXR0cigncklkJyk7XHJcblxyXG4gICAgICAgICAgICBqUXVlcnkubWFnbmlmaWNQb3B1cC5vcGVuKHtcclxuICAgICAgICAgICAgICAgIGl0ZW1zOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgc3JjOiBqUXVlcnkoJy5yb29tZGV0YWlsc1tySWQ9JyArIHJpZCArICddJykuaHRtbCgpLFxyXG4gICAgICAgICAgICAgICAgICAgIHR5cGU6ICdpbmxpbmUnLFxyXG4gICAgICAgICAgICAgICAgfSxcclxuXHJcbiAgICAgICAgICAgICAgICBtYWluQ2xhc3M6ICdibG9ja3MtY29udC1iIG1mcC1mYWRlJyxcclxuICAgICAgICAgICAgICAgIC8vcmVtb3ZhbERlbGF5OiAxNjAsXHJcbiAgICAgICAgICAgICAgICBwcmVsb2FkZXI6IHRydWUsXHJcbiAgICAgICAgICAgICAgICBvdmVyZmxvd1k6ICdhdXRvJyxcclxuICAgICAgICAgICAgICAgIGZpeGVkQ29udGVudFBvczogdHJ1ZSxcclxuICAgICAgICAgICAgICAgIGNhbGxiYWNrczoge1xyXG4gICAgICAgICAgICAgICAgICAgIG9wZW46IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgalF1ZXJ5KCcubWZwLWNvbnRlbnQnKS5maW5kKCcuY2Fyb3VzZWxyJykuZmxpY2tpdHkoe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3B0aW9uc1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VsbEFsaWduOiAnbGVmdCcsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250YWluOiB0cnVlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVsbHNjcmVlbjogdHJ1ZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyYXBBcm91bmQ6IHRydWUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBncm91cENlbGxzOiAxLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF6eUxvYWQ6IDEsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNoOiB0cnVlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VsbFNlbGVjdG9yOiAnLmNhcm91c2Vsci1jZWxsJyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vd3JhcEFyb3VuZDogdHJ1ZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyZWVTY3JvbGw6IHRydWUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcmFnZ2FibGU6IHRydWUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWdlRG90czogZmFsc2VcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICBqUXVlcnkoJy5yb29tYmFjayAuYmFja2J0bicpLm9uKCdjbGljaycsIGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgIGpRdWVyeS5tYWduaWZpY1BvcHVwLmNsb3NlKCk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAvL2pRdWVyeSgnI2NvbnRlbnQgLnBvcnRvLWJsb2NrOmVxKDApJykuaGlkZSgpO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICB0aGlzLkpSb29tUmVzZXJ2ZUJ1dHRvbigpLm9mZignY2xpY2snKS5vbignY2xpY2snLCBqUXVlcnkucHJveHkodGhpcy5yb29tUmVzZXJ2ZUFjdGlvbiwgdGhpcykpO1xyXG4gICAgfVxyXG5cclxuICAgIHJvb21SZXNlcnZlQWN0aW9uKGV2ZW50KSB7XHJcbiAgICAgICAgbGV0IHNlbGYgPSB0aGlzO1xyXG4gICAgICAgIGxldCBySUQsIHBJRCwgclJhdGUsIGVsLCBpc3A7XHJcbiAgICAgICAgaWYgKGpRdWVyeShldmVudC50YXJnZXQpLmF0dHIoJ3JpZCcpKSB7XHJcbiAgICAgICAgICAgIGVsID0galF1ZXJ5KGV2ZW50LnRhcmdldCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgZWwgPSBqUXVlcnkoZXZlbnQudGFyZ2V0KS5wYXJlbnQoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaXNwID0gZWwuYXR0cignaXNwYWNrJyk7XHJcbiAgICAgICAgaWYgKHR5cGVvZiBpc3AgPT09ICd1bmRlZmluZWQnIHx8IGlzcCA9PT0gZmFsc2UpIHtcclxuICAgICAgICAgICAgaXNwID0gMDtcclxuICAgICAgICB9XHJcbiAgICAgICAgcklEID0gZWwuYXR0cigncmlkJyk7XHJcblxyXG4gICAgICAgIHBJRCA9IGVsLmF0dHIoJ3BpZCcpO1xyXG4gICAgICAgIHJSYXRlID0gZWwuYXR0cigncnJhdGUnKTtcclxuICAgICAgICBsZXQgc3RhcnRfZGF0ZSA9IHNlbGYuZ2V0UGFyYW1ldGVyQnlOYW1lKCdoc3RhcnRfZGF0ZScpO1xyXG4gICAgICAgIGxldCBlbmRfZGF0ZSA9IHNlbGYuZ2V0UGFyYW1ldGVyQnlOYW1lKCdoZW5kX2RhdGUnKTtcclxuICAgICAgICBsZXQgYWR1bHRzID0gc2VsZi5nZXRQYXJhbWV0ZXJCeU5hbWUoJ2hhZHVsdHMnKTtcclxuICAgICAgICBsZXQgY2hpbGRyZW4gPSBzZWxmLmdldFBhcmFtZXRlckJ5TmFtZSgnaGNoaWxkcmVuJyk7XHJcbiAgICAgICAgbGV0IGNoaWxkcmVuYWdlc2EgPSBzZWxmLmdldFBhcmFtZXRlckJ5TmFtZSgnaGNoaWxkcmVuYWdlcycpO1xyXG4gICAgICAgIGxldCByb29tcyA9IHNlbGYuZ2V0UGFyYW1ldGVyQnlOYW1lKCdocm9vbXMnKTtcclxuICAgICAgICBjb25zdCBkYXRhID0ge1xyXG4gICAgICAgICAgICBhY3Rpb246ICdyZXNlcnZlX3Jvb20nLFxyXG4gICAgICAgICAgICBwaWQ6IH
8443BJRCxcclxuICAgICAgICAgICAgcmlkOiBySUQsXHJcbiAgICAgICAgICAgIGlzcDogaXNwLFxyXG4gICAgICAgICAgICBycmF0ZTogclJhdGUsXHJcbiAgICAgICAgICAgIHN0YXJ0X2RhdGU6IHN0YXJ0X2RhdGUsXHJcbiAgICAgICAgICAgIGVuZF9kYXRlOiBlbmRfZGF0ZSxcclxuICAgICAgICAgICAgYWR1bHRzOiBhZHVsdHMsXHJcbiAgICAgICAgICAgIHJvb21zOiByb29tcyxcclxuICAgICAgICAgICAgY2hpbGRyZW46IGNoaWxkcmVuLFxyXG4gICAgICAgICAgICBjaGlsZHJlbmFnZXM6IGNoaWxkcmVuYWdlc2EsXHJcblxyXG4gICAgICAgICAgICBzZWN1cml0eTogalF1ZXJ5KCcjcndiX3Jlc2VydmVfcm9vbV9ub25jZScpLnZhbCgpXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgZWwuTG9hZGluZ092ZXJsYXkoXCJzaG93XCIpO1xyXG4gICAgICAgIGpRdWVyeS5hamF4KHtcclxuICAgICAgICAgICAgdHlwZTogJ1BPU1QnLFxyXG4gICAgICAgICAgICBkYXRhVHlwZTogJ2pzb24nLFxyXG4gICAgICAgICAgICB1cmw6IGJiTG9jYWwuYWpheF91cmwsXHJcbiAgICAgICAgICAgIGRhdGE6IGRhdGEsXHJcbiAgICAgICAgICAgIHN1Y2Nlc3M6IGpRdWVyeS5wcm94eShzZWxmLnJvb21SZXNlcnZlQ29tcGxldGVkLCBzZWxmKVxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIC8qZWxzZSB7XHJcbiAgICAgICAgICAgIFN3YWwuZmlyZSh7XHJcbiAgICAgICAgICAgICAgICB0aXRsZTogJ0Vycm9yIScsXHJcbiAgICAgICAgICAgICAgICB0ZXh0OiAnUGxlYXNlIHNlbGVjdCBhdCBsZWFzdCBvbmUgdGlja2V0JyxcclxuICAgICAgICAgICAgICAgIGljb246ICdlcnJvcicsXHJcbiAgICAgICAgICAgICAgICBjb25maXJtQnV0dG9uVGV4dDogJ09rJ1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9ICovXHJcbiAgICB9XHJcblxyXG4gICAgcm9vbVJlc2VydmVDb21wbGV0ZWQocmVzcG9uc2UpIHtcclxuXHJcbiAgICAgICAgaWYgKHJlc3BvbnNlLnN1Y2Nlc3MgPT09IGZhbHNlKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xyXG4gICAgICAgICAgICBTd2FsLmZpcmUoe1xyXG4gICAgICAgICAgICAgICAgdGl0bGU6ICdJbmZvcm1hdGlvbicsXHJcbiAgICAgICAgICAgICAgICB0ZXh0OiByZXNwb25zZS5tZXNzYWdlLF
8443xyXG4gICAgICAgICAgICAgICAgaWNvbjogJ2luZm8nLFxyXG4gICAgICAgICAgICAgICAgY29uZmlybUJ1dHRvblRleHQ6ICdPSycsXHJcbiAgICAgICAgICAgICAgICBjbG9zZU9uQ29uZmlybTogdHJ1ZSxcclxuICAgICAgICAgICAgfSkudGhlbigocmVzdWx0KSA9PiB7XHJcbiAgICAgICAgICAgICAgICAvKiBSZWFkIG1vcmUgYWJvdXQgaXNDb25maXJtZWQsIGlzRGVuaWVkIGJlbG93ICovXHJcbiAgICAgICAgICAgICAgICBpZiAocmVzdWx0LmlzQ29uZmlybWVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5KUm9vbVJlc2VydmVCdXR0b24oKS5Mb2FkaW5nT3ZlcmxheShcImhpZGVcIiwgdHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgLy9zZWxmLkpCdXlCdXR0b24oKS5oaWRlKCk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJlc3VsdC5pc0RlbmllZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vU3dhbC5maXJlKCdDaGFuZ2VzIGFyZSBub3Qgc2F2ZWQnLCAnJywgJ2luZm8nKVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuXHJcblxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGlmIChyZXNwb25zZS5pc3AgPT09IDApIHtcclxuICAgICAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5ocmVmID0gcmVzcG9uc2UudXJsO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLmhyZWYgPSB3aW5kb3cubG9jYXRpb24uaHJlZjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBjYWxjdWxhdGVQYWNrUHJpY2UoZWxwLCBmb250c2l6ZSkge1xyXG4gICAgICAgIGxldCBzZWxmID0gdGhpcztcclxuICAgICAgICBsZXQgaElELCBlbCwgcGFpcklEO1xyXG4gICAgICAgIGVsID0gZWxwLnBhcmVudCgpLmZpbmQoJy5zdGFydHBhY2stYnV0dG9uJykuZmlyc3QoKTtcclxuICAgICAgICBoSUQgPSBlbC5hdHRyKCdoaWQnKTtcclxuICAgICAgICBwYWlySUQgPSBlbC5hdHRyKCdwYWlyaWQnKTtcclxuICAgICAgICBsZXQgc3RhcnRfZGF0ZSA9IHNlbGYuZ2V0UGFyYW1ldGVyQnlOYW1lKCdoc3RhcnRfZGF0ZScpO1xyXG4gICAgICAgIGxldCBlbmRfZGF0ZSA9IHNlbGYuZ2V0UGFyYW1ldGVyQnlOYW1lKCdoZW5kX2RhdGUnKTtcclxuICAgICAgICBsZXQgYWR1bHRzID0gc2VsZi5nZXRQYXJhbWV0ZXJCeU5hbWUoJ2hhZHVsdHMnKTtcclxuICAgICAgICBsZXQgY2hpbGRyZW4gPSBzZWxmLmdldFBhcmFtZXRlckJ5TmFtZSgnaGNoaWxkcmVuJyk7XHJcbiAgICAgICAgbGV0IGNoaWxkcmVuYWdlc2EgPSBzZWxmLmdldFBhcmFtZXRlckJ5TmFtZSgnaGNoaWxkcmVuYWdlcycpO1xyXG4gICAgICAgIGxldCByb29tcyA9IHNlbGYuZ2V0UGFyYW1ldGVyQnlOYW1lKCdocm9vbXMnKTtcclxuICAgICAgICBjb25zdCBkYXRhID0ge1xyXG4gICAgICAgICAgICBhY3Rpb246ICdwcmljZV9wYWNrYWdlJyxcclxuICAgICAgICAgICAgaGlkOiBoSUQsXHJcbiAgICAgICAgICAgIHBhaXJpZDogcGFpcklELFxyXG4gICAgICAgICAgICBzdGFydF9kYXRlOiBzdGFydF9kYXRlLFxyXG4gICAgICAgICAgICBlbmRfZGF0ZTogZW5kX2RhdGUsXHJcbiAgICAgICAgICAgIGFkdWx0czogYWR1bHRzLFxyXG4gICAgICAgICAgICByb29tczogcm9vbXMsXHJcbiAgICAgICAgICAgIGNoaWxkcmVuOiBjaGlsZHJlbixcclxuICAgICAgICAgICAgY2hpbGRyZW5hZ2VzOiBjaGlsZHJlbmFnZXNhLFxyXG4gICAgICAgICAgICBzZWN1cml0eTogalF1ZXJ5KCcjcndiX3ByaWNlX3BhY2thZ2Vfbm9uY2UnKS52YWwoKVxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIGVscC5Mb2FkaW5nT3ZlcmxheShcInNob3dcIik7XHJcbiAgICAgICAgalF1ZXJ5LmFqYXgoe1xyXG4gICAgICAgICAgICB0eXBlOiAnUE9TVCcsXHJcbiAgICAgICAgICAgIGRhdGFUeXBlOiAnanNvbicsXHJcbiAgICAgICAgICAgIHVybDogYmJMb2NhbC5hamF4X3VybCxcclxuICAgICAgICAgICAgZGF0YTogZGF0YSxcclxuICAgICAgICAgICAgc3VjY2VzczogZnVuY3Rpb24gKHJlc3BvbnNlKSB7XHJcbiAgICAgICAgICAgICAgICBlbHAuTG9hZGluZ092ZXJsYXkoXCJoaWRlXCIpO1xyXG4gICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlLmh0bWwgIT09ICdOb3QgQXZhaWxhYmxlJykge1xyXG4gICAgICAgICAgICAgICAgICAgIGVscC5jc3MoJ2ZvbnQtc2l6ZScsIGZvbnRzaXplKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZWwucmVtb3ZlKCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHAuaHRtbChyZXNwb25zZS5odG1sKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICBzdGFydFBhY2tCdXR0b24oKSB7XHJcbiAgICAgICAgbGV0IHNlbGYgPSB0aGlzO1xyXG4gICAgICAgIGxldCBoSUQsIGVsLCBwYWlySUQ7XHJcbiAgICAgICAgZWwgPSBqUXVlcnkoZXZlbnQudGFyZ2V0KTtcclxuXHJcbiAgICAgICAgaElEID0gZWwuYXR0cignaGlkJyk7XHJcbiAgICAgICAgcGFpcklEID0gZWwuYXR0cigncGFpcmlkJyk7XHJcbiAgICAgICAgbGV0IHN0YXJ0X2RhdGUgPSBzZWxmLmdldFBhcmFtZXRlckJ5TmFtZSgnaHN0YXJ0X2RhdGUnKTtcclxuICAgICAgICBsZXQgZW5kX2RhdGUgPSBzZWxmLmdldFBhcmFtZXRlckJ5TmFtZSgnaGVuZF9kYXRlJyk7XHJcbiAgICAgICAgbGV0IGFkdWx0cyA9IHNlbGYuZ2V0UGFyYW1ldGVyQnlOYW1lKCdoYWR1bHRzJyk7XHJcbiAgICAgICAgbGV0IGNoaWxkcmVuID0gc2VsZi5nZXRQYXJhbWV0ZXJCeU5hbWUoJ2hjaGlsZHJlbicpO1xyXG4gICAgICAgIGxldCBjaGlsZHJlbmFnZXNhID0gc2VsZi5nZXRQYXJhbWV0ZXJCeU5hbWUoJ2hjaGlsZHJlbmFnZXMnKTtcclxuICAgICAgICBsZXQgcm9vbXMgPSBzZWxmLmdldFBhcmFtZXRlckJ5TmFtZSgnaHJvb21zJyk7XHJcbiAgICAgICAgY29uc3QgZGF0YSA9IHtcclxuICAgICAgICAgICAgYWN0aW9uOiAnc3RhcnRfcGFja2FnZScsXHJcbiAgICAgICAgICAgIGhpZDogaElELFxyXG4gICAgICAgICAgICBwYWlyaWQ6IHBhaXJJRCxcclxuICAgICAgICAgICAgc3RhcnRfZGF0ZTogc3RhcnRfZGF0ZSxcclxuICAgICAgICAgICAgZW5kX2RhdGU6IGVuZF9kYXRlLFxyXG4gICAgICAgICAgICBhZHVsdHM6IGFkdWx0cyxcclxuICAgICAgICAgICAgcm9vbXM6IHJvb21zLFxyXG4gICAgICAgICAgICBjaGlsZHJlbjogY2hpbGRyZW4sXHJcbiAgICAgICAgICAgIGNoaWxkcmVuYWdlczogY2hpbGRyZW5hZ2VzYSxcclxuICAgICAgICAgICAgc2VjdXJpdHk6IGpRdWVyeSgnI3J3Yl9zdGFydF9wYWNrYWdlX25vbmNlJykudmFsKClcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICBlbC5Mb2FkaW5nT3ZlcmxheShcInNob3dcIik7XHJcbiAgICAgICAgalF1ZXJ5LmFqYXgoe1xyXG4gICAgICAgICAgICB0eX
8443BlOiAnUE9TVCcsXHJcbiAgICAgICAgICAgIGRhdGFUeXBlOiAnanNvbicsXHJcbiAgICAgICAgICAgIHVybDogYmJMb2NhbC5hamF4X3VybCxcclxuICAgICAgICAgICAgZGF0YTogZGF0YSxcclxuICAgICAgICAgICAgc3VjY2VzczogalF1ZXJ5LnByb3h5KHNlbGYuc3RhcnRQYWNrYWdlQ29tcGxldGVkLCBzZWxmKVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGNhbENvbXBsZXRlZChyZXNwb25zZSkge1xyXG4gICAgICAgIGxldCBzZWxmID0gdGhpcztcclxuICAgICAgICBqUXVlcnkoJyNiY2FsZW5kYXItc2VjdGlvbi13cmFwcGVyJykuTG9hZGluZ092ZXJsYXkoXCJoaWRlXCIpO1xyXG4gICAgICAgIGlmIChyZXNwb25zZS5zdWNjZXNzID09PSB0cnVlKSB7XHJcbiAgICAgICAgICAgIGpRdWVyeSgnI2NhbC1jYXJkLXJlc3VsdCcpLmh0bWwocmVzcG9uc2UuaHRtbCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHN0YXJ0UGFja2FnZUNvbXBsZXRlZChyZXNwb25zZSkge1xyXG4gICAgICAgIGpRdWVyeSgnYm9keScpLkxvYWRpbmdPdmVybGF5KFwiaGlkZVwiKTtcclxuICAgICAgICBpZiAocmVzcG9uc2Uuc3VjY2VzcyA9PT0gdHJ1ZSkge1xyXG4gICAgICAgICAgICBsZXQgdXJsID0gd2luZG93LmxvY2F0aW9uLmhyZWY7XHJcbiAgICAgICAgICAgIHVybCA9IHVybC5yZXBsYWNlKCcmaXNwYWNrPTEnLCAnJyk7XHJcbiAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5ocmVmID0gdXJsO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBzZWFyY2hIb3RlbHNCdXR0b24oKSB7XHJcbiAgICAgICAgbGV0IHNlbGYgPSB0aGlzO1xyXG4gICAgICAgIGlmIChzZWxmLmZwc2VhcmNoICE9PSBmYWxzZSkge1xyXG4gICAgICAgICAgICBsZXQgZGF0ZXMgPSBzZWxmLmZwc2VhcmNoLnNlbGVjdGVkRGF0ZXM7XHJcbiAgICAgICAgICAgIC8vYWxlcnQoZGF0ZXNbMF0gKyAnLScgKyBkYXRlc1sxXSk7XHJcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0X2RhdGUgPSBzZWxmLmZwc2VhcmNoLmZvcm1hdERhdGUoZGF0ZXNbMF0sICdZLW0tZCcpO1xyXG4gICAgICAgICAgICBjb25zdCBlbmRfZGF0ZSA9IHNlbGYuZnBzZWFyY2guZm9ybWF0RGF0ZShkYXRlc1sxXSwgJ1ktbS1kJyk7XHJcbiAgICAgICAgICAgIGNvbnN0IGFkdWx0cyA9IGpRdWVyeSgnI3NlbGVjdEFkdWx0cycpLnZhbCgpO1xyXG4gICAgICAgICAgICBjb25zdCByb29tcyA9IGpRdWVyeSgnI3NlbGVjdFJvb21zJykudmFsKCk7XHJcbiAgICAgICAgICAgIGNvbnN0IGNoaWxkcmVuID0galF1ZXJ5KCcjc2VsZWN0Q2hpbGRyZW4nKS52YWwoKTtcclxuICAgICAgICAgICAgbGV0IGNoaWxkcmVuYWdlcyA9ICcnO1xyXG4gICAgICAgICAgICBqUXVlcnkoJyNjaGlsZHJlbi1ndWVzdHMtc2VjdGlvbiAuZ3Vlc3RjJykuZWFjaChmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICBjaGlsZHJlbmFnZXMgKz0galF1ZXJ5KHRoaXMpLnZhbCgpICsgJy0nO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgY2hpbGRyZW5hZ2VzID0gY2hpbGRyZW5hZ2VzLnN1YnN0cmluZygwLCBjaGlsZHJlbmFnZXMubGVuZ3RoIC0gMSk7XHJcbiAgICAgICAgICAgIGxldCBwYXJhbXMgPSAnJztcclxuICAgICAgICAgICAgaWYgKHN0YXJ0X2RhdGUgIT09ICcnICYmIGVuZF9kYXRlICE9PSAnJyAmJiBhZHVsdHMgIT09ICcnICYmIGFkdWx0cyAhPT0gJzAnICYmIHJvb21zICE9PSAnJyAmJiByb29tcyAhPT0gJzAnKSB7XHJcbiAgICAgICAgICAgICAgICBwYXJhbXMgPSAnP3NlYXJjaGhiPTEmaHN0YXJ0X2RhdGU9JyArIHN0YXJ0X2RhdGUgKyAnJmhlbmRfZGF0ZT0nICsgZW5kX2RhdGUgKyAnJmhhZHVsdHM9JyArIGFkdWx0cyArICcmaHJvb21zPScgKyByb29tcztcclxuICAgICAgICAgICAgICAgIGlmIChjaGlsZHJlbiAhPT0gJycgJiYgY2hpbGRyZW4gIT09ICcwJyAmJiBjaGlsZHJlbmFnZXMgIT09ICcnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcGFyYW1zICs9ICcmaGNoaWxkcmVuPScgKyBjaGlsZHJlbiArICcmaGNoaWxkcmVuYWdlcz0nICsgY2hpbGRyZW5hZ2VzO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYgKHdpbmRvdy5sb2NhdGlvbi5ocmVmLmluZGV4T2YoJ3BhY2thZ2VzJykgIT09IC0xKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcGFyYW1zICs9ICcmaXNwYWNrPTEnO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAocGFyYW1zICE9PSAnJykge1xyXG4gICAgICAgICAgICAgICAgcGFyYW1zICs9ICcmc2Nyb2xsPTEnO1xyXG4gICAgICAgICAgICAgICAgaWYgKGpRdWVyeSgnYm9keScpLmhhc0NsYXNzKCdzaW5nbGUtcHJvZHVjdCcpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IGJiID0gd2luZG93LmxvY2F0aW9uLmhyZWY7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGJiLmluZGV4T2YoJz8nKSA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYmIgPSBiYi5zcGxpdChcIj9cIilbMF07XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5ocmVmID0gYmIgKyBwYXJhbXM7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5ocmVmID0gd2luZG93LmxvY2F0aW9uLm9yaWdpbiArICcvaG90ZWxzLycgKyBwYXJhbXM7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgc2VhcmNoQ2FsZW5kYXJCdXR0b24oKSB7XHJcbiAgICAgICAgbGV0IHNlbGYgPSB0aGlzO1xyXG4gICAgICAgIGlmIChzZWxmLmZwc2VhcmNoUyAhPT0gZmFsc2UpIHtcclxuICAgICAgICAgICAgbGV0IGRhdGVzID0gc2VsZi5mcHNlYXJjaFMuc2VsZWN0ZWREYXRlcztcclxuICAgICAgICAgICAgLy9hbGVydChkYXRlc1swXSArICctJyArIGRhdGVzWzFdKTtcclxuICAgICAgICAgICAgY29uc3Qgc3RhcnRfZGF0ZSA9IHNlbGYuZnBzZWFyY2hTLmZvcm1hdERhdGUoZGF0ZXNbMF0sICdZLW0tZCcpO1xyXG4gICAgICAgICAgICAvL2NvbnN0IGVuZF9kYXRlID0gc2VsZi5mcHNlYXJjaFMuZm9ybWF0RGF0ZShkYXRlc1sxXSwgJ1ktbS1kJyk7XHJcblxyXG4gICAgICAgICAgICBsZXQgcGFyYW1zID0gJyc7XHJcbiAgICAgICAgICAgIGlmIChzdGFydF9kYXRlICE9PSAnJykge1xyXG4gICAgICAgICAgICAgICAgcGFyYW1zICs9ICc/c2VhcmNoY2FsYj0xJmNhbHN0YXJ0X2RhdGU9JyArIHN0YXJ0X2RhdGU7XHJcbiAgICAgICAgICAgI
8443H1cclxuXHJcbiAgICAgICAgICAgIGlmIChwYXJhbXMgIT09ICcnKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAod2luZG93LmxvY2F0aW9uLmhyZWYuaW5kZXhPZignYWFhLnNwb3RsaWdodC52ZWdhcycpID09PSAtMSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5ocmVmID0gJ2h0dHBzOi8vc3BvdGxpZ2h0LnZlZ2FzL3Nob3dzL2NhbGVuZGFyLycgKyBwYXJhbXM7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5ocmVmID0gJ2h0dHBzOi8vYWFhLnNwb3RsaWdodC52ZWdhcy9zaG93cy1jYWxlbmRhci8nICsgcGFyYW1zO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGdldFBhcmFtZXRlckJ5TmFtZShuYW1lLCB1cmwgPSB3aW5kb3cubG9jYXRpb24uaHJlZikge1xyXG4gICAgICAgIG5hbWUgPSBuYW1lLnJlcGxhY2UoL1tcXFtcXF1dL2csICdcXFxcJCYnKTtcclxuICAgICAgICB2YXIgcmVnZXggPSBuZXcgUmVnRXhwKCdbPyZdJyArIG5hbWUgKyAnKD0oW14mI10qKXwmfCN8JCknKSxcclxuICAgICAgICAgICAgcmVzdWx0cyA9IHJlZ2V4LmV4ZWModXJsKTtcclxuICAgICAgICBpZiAoIXJlc3VsdHMpIHJldHVybiBudWxsO1xyXG4gICAgICAgIGlmICghcmVzdWx0c1syXSkgcmV0dXJuICcnO1xyXG4gICAgICAgIHJldHVybiBkZWNvZGVVUklDb21wb25lbnQocmVzdWx0c1syXS5yZXBsYWNlKC9cXCsvZywgJyAnKSk7XHJcbiAgICB9XHJcblxyXG4gICAgaXNQYWNrKCkge1xyXG4gICAgICAgIGlmIChqUXVlcnkoJyNwYWNrX2Rpc2NvdW50cycpLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBwYWNrU3RhcnREYXRlKCkge1xyXG4gICAgICAgIGxldCBzdGFydF9kYXRlID0gZmFsc2U7XHJcbiAgICAgICAgaWYgKGpRdWVyeSgnI3BhY2tfZGlzY291bnRzJykubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICBzdGFydF9kYXRlID0gbmV3IERhdGUoalF1ZXJ5KCcjcGFja19kaXNjb3VudHMnKS5hdHRyKCdzdGFydF9kYXRlJykpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gc3RhcnRfZGF0ZTtcclxuICAgIH1cclxuXHJcbiAgICBwYWNrRW5kRGF0ZSgpIHtcclxuICAgICAgICBsZXQgZW5kX2RhdGUgPSBmYWxzZTtcclxuICAgICAgICBpZiAoalF1ZXJ5KCcjcGFja19kaXNjb3VudHMnKS5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIGVuZF9kYXRlID0gbmV3IERhdGUoalF1ZXJ5KCcjcGFja19kaXNjb3VudHMnKS5hdHRyKCdlbmRfZGF0ZScpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGVuZF9kYXRlO1xyXG4gICAgfVxyXG5cclxuICAgIHJlbmRlckV2ZW50cygpIHtcclxuICAgICAgICBsZXQgc2VsZiA9IHRoaXM7XHJcbiAgICAgICAgbGV0IHBJRDtcclxuICAgICAgICBpZiAoc2VsZi5KSXNBdHRyYWN0aW9uKCkpIHtcclxuICAgICAgICAgICAgcElEID0galF1ZXJ5KCcjYXR0cmFjdGlvbl9pZCcpLmF0dHIoJ3BpZCcpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHBJRCA9IHNlbGYuZ2V0UGFyYW1ldGVyQnlOYW1lKCdwcm9kdWN0X2lkJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGRhdGEgPSB7XHJcbiAgICAgICAgICAgIGFjdGlvbjogJ3NlYXRfc2VsZWN0aW9uX21hcCcsXHJcbiAgICAgICAgICAgIHByb2R1Y3RfaWQ6IHBJRCxcclxuICAgICAgICAgICAgc2VjdXJpdHk6IGpRdWVyeSgnI3J3Yl9zZWF0X3NlbGVjdGlvbl9tYXBfbm9uY2UnKS52YWwoKVxyXG4gICAgICAgIH07XHJcbiAgICAgICAgalF1ZXJ5KCdib2R5JykuTG9hZGluZ092ZXJsYXkoXCJzaG93XCIpO1xyXG4gICAgICAgIGpRdWVyeS5hamF4KHtcclxuICAgICAgICAgICAgdHlwZTogJ1BPU1QnLFxyXG4gICAgICAgICAgICBkYXRhVHlwZTogJ2pzb24nLFxyXG4gICAgICAgICAgICB1cmw6IGJiTG9jYWwuYWpheF91cmwsXHJcbiAgICAgICAgICAgIGRhdGE6IGRhdGEsXHJcbiAgICAgICAgICAgIHN1Y2Nlc3M6IGpRdWVyeS5wcm94eShzZWxmLnJlbmRlckV2ZW50c0NvbXBsZXRlZCwgc2VsZilcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICByZW5kZXJTZWF0Q2hhcnQoZXZlbnRfaWQpIHtcclxuICAgICAgICBsZXQgc2VsZiA9IHRoaXM7XHJcblxyXG4gICAgICAgIHRoaXMuY3JlYXRlRGVzdHJveVNlYXRDaGFydCgpO1xyXG4gICAgICAgIHRoaXMuSlRpY2tldHNDYXJ0KCkuaGlkZSgpO1xyXG4gICAgICAgIGNvbnN0IGRhdGEgPSB7XHJcbiAgICAgICAgICAgIGFjdGlvbjogJ2V2ZW50X3NlYXRzJyxcclxuICAgICAgICAgICAgcHJvZHVjdF9pZDogc2VsZi5nZXRQYXJhbWV0ZXJCeU5hbWUoJ3Byb2R1Y3RfaWQnKSxcclxuICAgICAgICAgICAgZXZlbnRfaWQ6IGV2ZW50X2lkLFxyXG4gICAgICAgICAgICBzZWN1cml0eTogalF1ZXJ5KCcjcndiX2V2ZW50X3NlYXRzX25vbmNlJykudmFsKClcclxuICAgICAgICB9O1xyXG4gICAgICAgIGpRdWVyeSgnYm9keScpLkxvYWRpbmdPdmVybGF5KFwic2hvd1wiKTtcclxuICAgICAgICBqUXVlcnkuYWpheCh7XHJcbiAgICAgICAgICAgIHR5cGU6ICdQT1NUJyxcclxuICAgICAgICAgICAgZGF0YVR5cGU6ICdqc29uJyxcclxuICAgICAgICAgICAgdXJsOiBiYkxvY2FsLmFqYXhfdXJsLFxyXG4gICAgICAgICAgICBkYXRhOiBkYXRhLFxyXG4gICAgICAgICAgICBzdWNjZXNzOiBqUXVlcnkucHJveHkoc2VsZi5yZW5kZXJTZWF0Q2hhcnRDb21wbGV0ZWQsIHNlbGYpXHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgY2xlYXJDYXJ0KCkge1xyXG5cclxuICAgICAgICB0aGlzLnBvZHMgPSBbXTtcclxuICAgICAgICBsZXQgc2VsZWN0ZWRMYWJlbCA9IGpRdWVyeSh0aGlzKS5hdHRyKCdsYWJlbCcpO1xyXG4gICAgICAgIC8vaXQgd2lsbCBjbGVhciB0aGUgd2hvbGUgY2FydCBiZWNhdXNlIHRoZSBzZWF0cyBhcmUgYXV0byBhZGRlZFxyXG4gICAgICAgIGxldCBzZWxsYWIgPSBbXTtcclxuICAgICAgICBmb3IgKGNvbnN0IGsgaW4gdGhpcy5zZWxlY3RlZExhYmVscykge1xyXG4gICAgICAgICAgICBzZWxsYWIucHVzaCh0aGlzLnNlbGVjdGVkTGFiZWxzW2tdWydsYWJlbCddKVxyXG4gICAgICAgI
8443H1cclxuICAgICAgICBpZiAodHlwZW9mIHRoaXMuc2VhdENoYXJ0LmRlc2VsZWN0T2JqZWN0cyAhPT0gJ3VuZGVmaW5lZCcpIHtcclxuICAgICAgICAgICAgdGhpcy5zZWF0Q2hhcnQuZGVzZWxlY3RPYmplY3RzKHNlbGxhYik7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHNlbGVjdEJhc2VkT25Ecm9wRG93bihzZWxlY3RlZFNlYXRzKSB7XHJcbiAgICAgICAgLy91cGRhdGUgdGlja2V0c19jYXJ0IHdpdGggYnV0dG9ucyBhbmQgYWxsXHJcbiAgICAgICAgbGV0IGM7XHJcbiAgICAgICAgbGV0IHA7XHJcbiAgICAgICAgbGV0IGxhYmVscyA9IFtdO1xyXG4gICAgICAgIGxldCBzZWxmID0gdGhpcztcclxuICAgICAgICBsZXQgdG90YWxQcmljZSA9IDA7XHJcbiAgICAgICAgbGV0IGhhc1R5cGUgPSBmYWxzZTtcclxuICAgICAgICBsZXQgdHlwZXNTZWF0ID0gW107XHJcbiAgICAgICAgbGV0IHNlbGVjdFNlYXRzTGFiZWxPbmx5ID0gW107XHJcbiAgICAgICAgbGV0IGV4aXN0aW5nU2VhdHMgPSBbXTtcclxuICAgICAgICBsZXQgdG90YWxUaWNrZXRzID0gMDtcclxuICAgICAgICBmb3IgKGMgPSAwOyBjIDwgc2VsZWN0ZWRTZWF0cy5sZW5ndGg7IGMrKykge1xyXG4gICAgICAgICAgICBsZXQgbGFiZWwgPSB7fTtcclxuXHJcbiAgICAgICAgICAgIGxhYmVsLmxhYmVsID0gc2VsZWN0ZWRTZWF0c1tjXS5sYWJlbDtcclxuICAgICAgICAgICAgbGFiZWwucXR5ID0gMTtcclxuICAgICAgICAgICAgaWYgKHR5cGVvZiBleGlzdGluZ1NlYXRzW3NlbGVjdGVkU2VhdHNbY10udXVpZF0gIT09ICd1bmRlZmluZWQnKSB7XHJcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAodHlwZW9mIHNlbGVjdGVkU2VhdHNbY10ubnVtU2VsZWN0ZWQgIT09ICd1bmRlZmluZWQnKSB7XHJcbiAgICAgICAgICAgICAgICBsYWJlbC5xdHkgPSBzZWxlY3RlZFNlYXRzW2NdLm51bVNlbGVjdGVkO1xyXG4gICAgICAgICAgICAgICAgbGFiZWwubGFiZWxvcmlnID0gbGFiZWwubGFiZWw7XHJcbiAgICAgICAgICAgICAgICBsYWJlbC5sYWJlbCArPSAnKCcgKyBzZWxlY3RlZFNlYXRzW2NdLm51bVNlbGVjdGVkICsgJyknO1xyXG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBleGlzdGluZ1NlYXRzW3NlbGVjdGVkU2VhdHNbY10udXVpZF0gPT09ICd1bmRlZmluZWQnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZXhpc3RpbmdTZWF0c1tzZWxlY3RlZFNlYXRzW2NdLnV1aWRdID0gMTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdG90YWxUaWNrZXRzICs9IGxhYmVsLnF0eTtcclxuICAgICAgICAgICAgc2VsZWN0U2VhdHNMYWJlbE9ubHkucHVzaChsYWJlbC5sYWJlbCk7XHJcbiAgICAgICAgICAgIGlmICh0eXBlb2Ygc2VsZWN0ZWRTZWF0c1tjXS5wcmljaW5nICE9PSBcInVuZGVmaW5lZFwiICYmIHR5cGVvZiBzZWxlY3RlZFNlYXRzW2NdLnByaWNpbmcudGlja2V0VHlwZXMgIT09IFwidW5kZWZpbmVkXCIpIHtcclxuICAgICAgICAgICAgICAgIGZvciAocCA9IDA7IHAgPCBzZWxlY3RlZFNlYXRzW2NdLnByaWNpbmcudGlja2V0VHlwZXMubGVuZ3RoOyBwKyspIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZWN0ZWRTZWF0c1tjXS5wcmljaW5nLnRpY2tldFR5cGVzW3BdWyd0aWNrZXRUeXBlJ10gPT09IHNlbGVjdGVkU2VhdHNbY10uc2VsZWN0ZWRUaWNrZXRUeXBlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsLnByaWNlID0gbGFiZWwucXR5ICogc2VsZWN0ZWRTZWF0c1tjXS5wcmljaW5nLnRpY2tldFR5cGVzW3BdWydwcmljZSddO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsYWJlbC50eXBlID0gc2VsZWN0ZWRTZWF0c1tjXS5wcmljaW5nLnRpY2tldFR5cGVzW3BdWyd0aWNrZXRUeXBlJ107XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsLnR5cGVuID0gbGFiZWwudHlwZTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLmluQXJyYXkodHlwZXNTZWF0LCBsYWJlbC50eXBlKSAhPT0gZmFsc2UpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc1R5cGUgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVzU2VhdC5wdXNoKGxhYmVsLnR5cGUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0b3RhbFByaWNlICs9IGxhYmVsLnF0eSAqIHBhcnNlRmxvYXQobGFiZWwucHJpY2UpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGxhYmVsLnR5cGVuID0gc2VsZi50aWNrZXRUeXBlQWxsO1xyXG4gICAgICAgICAgICAgICAgbGFiZWwucHJpY2UgPSBsYWJlbC5xdHkgKiBzZWxlY3RlZFNlYXRzW2NdLnByaWNpbmdbJ3ByaWNlJ107XHJcbiAgICAgICAgICAgICAgICB0b3RhbFByaWNlICs9IHBhcnNlRmxvYXQobGFiZWwucHJpY2UpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGxhYmVscy5wdXNoKGxhYmVsKTtcclxuXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHNlbGYuc2VsZWN0ZWRMYWJlbHMgPSBsYWJlbHM7XHJcbiAgICAgICAgbGV0IG51bWJlck9mU2VsZWN0ZWRTZWF0cyA9IHNlbGYuc2VsZWN0ZWRMYWJlbHMubGVuZ3RoO1xyXG5cclxuICAgICAgICBsZXQgU2Nyb2xsRnJvbUJvdHRvbSA9IGpRdWVyeShkb2N1bWVudCkuaGVpZ2h0KCkgLSBqUXVlcnkod2luZG93KS5zY3JvbGxUb3AoKTtcclxuICAgICAgICBsZXQgdGFibGVIZWlnaHQgPSBqUXVlcnkoJyN0aWNrZXRzX3NlbGVjdGVkJykuaGVpZ2h0KCk7XHJcbiAgICAgICAgc2VsZi5KVGlja2V0c1NlbGVjdGVkQ2FydCgpLmh0bWwoJycpO1xyXG4gICAgICAgIHNlbGYuSlRpY2tldHNCdXR0b25zQ2FydCgpLmh0bWwoJycpO1xyXG4gICAgICAgIGlmIChudW1iZXJPZlNlbGVjdGVkU2VhdHMgPT09IDApIHtcclxuXHJcbiAgICAgICAgICAgIHNlbGYuSlRpY2tldHNTZWxlY3RlZENhcnQoKS5odG1sKCcnKTtcclxuICAgICAgICAgICAgc2VsZi5KVGlja2V0c0J1dHRvbnNDYXJ0KCkuaGlkZSgpO1xyXG4gICAgICAgICAgICBzZWxmLmNyZWF0ZVByaWNpbmdNYXAoKTtcclxuICAgICAgICAgICAgalF1ZXJ5KCcuYnByb2NlZWRfdGlja2V0cycpLmhpZGUoKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBzZWxmLkpUaWNrZXRzU2VsZWN0ZWRDYXJ0KCkuc2hvdygpO1xyXG4gICAgICAgICAgICBzZWxmLkpUaWNrZXRzQnV0dG9uc0NhcnQoKS5zaG93KCk7XHJcblxyXG4gICAgICAgICAgICBsZXQgaGVhZGVycyA9IFtdO1xyXG5cclxuICAgICAgICAgICAgaGVhZGVycy5wdXNoKHsnbGFiZWwnOiAnJ30pO1xyXG4gICAgICAgICAgICBoZWFkZXJzLnB1c2goeydsYWJlbCc6ICdTZWN0aW9uJ30pO1xyXG4gICAgICAgICAgICBoZWFkZXJzLnB1c2goeydsYWJlbCc6ICdSb3cnfSk7XHJcbiAgICAgICAgICAgIGhlYWRlcnMucHVzaCh7J2xhYmVsJzogJ1NlYXQnfSk7XHJcblxyXG4gICAgICAgICAgICBpZiAoaGFzVHlwZSkge1xyXG4gICAgICAgICAgICAgICAgaGVhZGVycy5wdXNoKHsnbGFiZWwnOiAnVHlwZSd9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBoZWFkZXJzLnB1c2goeydsYWJlbCc6ICdQcmljZSd9KTtcclxuICAgICAgICAgICAgbGV0IHJvd3MgPSBbXTtcclxuICAgICAgICAgICAgZm9yIChjb25zdCBrIGluIHNlbGYuc2VsZWN0ZWRMYWJlbHMpIHtcclxuICAgICAgICAgICAgICAgIGxldCByb3cgPSBbXTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGN1ckxhYmVsID0gc2VsZi5zZWxlY3RlZExhYmVsc1trXTtcclxuICAgICAgICAgICAgICAgIGxldCBsYWJlbCA9IGN1ckxhYmVsWydsYWJlbCddLnNwbGl0KCctJyk7XHJcbiAgICAgICAgICAgICAgICByb3dbJ2NvbHVtbnMnXSA9IFtdO1xyXG4gICAgICAgICAgICAgICAgcm93Wydjb2x1bW5zJ10ucHVzaCgnPGkgc3R5bGU9XCJjdXJzb3I6cG9pbnRlclwiIGNsYXNzPVwiZmFyIGZhLXRyYXNoLWFsdCBkZWxldGVUaWNrZXRcIiBsYWJlbD1cIicgKyBjdXJMYWJlbFsnbGFiZWwnXSArICdcIj48L2k+Jyk7XHJcbiAgICAgICAgICAgICAgICByb3dbJ2NvbHVtbnMnXS5wdXNoKGxhYmVsWzBdKTtcclxuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgbGFiZWxbMV0gIT09ICd1bmRlZmluZWQnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcm93Wydjb2x1bW5zJ10ucHVzaChsYWJlbFsxXSk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgI
8443HJvd1snY29sdW1ucyddLnB1c2goJycpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBsYWJlbFsyXSAhPT0gJ3VuZGVmaW5lZCcpIHtcclxuICAgICAgICAgICAgICAgICAgICByb3dbJ2NvbHVtbnMnXS5wdXNoKGxhYmVsWzJdKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcm93Wydjb2x1bW5zJ10ucHVzaCgnJyk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBpZiAoaGFzVHlwZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJvd1snY29sdW1ucyddLnB1c2goY3VyTGFiZWxbJ3R5cGUnXSlcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmICghc2VsZi5pc1BhY2soKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJvd1snY29sdW1ucyddLnB1c2goJyQnICsgcGFyc2VGbG9hdChjdXJMYWJlbFsncHJpY2UnXSkudG9GaXhlZCgyKSk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBwcCA9IHBhcnNlRmxvYXQoY3VyTGFiZWxbJ3ByaWNlJ10pLnRvRml4ZWQoMikgLSBzZWxmLmluaXRQYWNrUHJpY2U7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHBwID09IDApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcm93Wydjb2x1bW5zJ10ucHVzaCgnSU5DTFVERUQnKTtcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByb3dbJ2NvbHVtbnMnXS5wdXNoKCcrJCcgKyBwcC50b0ZpeGVkKDIpKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICByb3dzLnB1c2gocm93KTtcclxuICAgICAgICAgICAgfVxyXG5cclxuXHJcbiAgICAgICAgICAgIGxldCBmb290ZXJzID0gW107XHJcbiAgICAgICAgICAgIGZvb3RlcnMucHVzaCh7J2xhYmVsJzogdG90YWxUaWNrZXRzICsgJyBUaWNrZXRzJywgJ2NvbHNwYW4nOiAzfSk7XHJcbiAgICAgICAgICAgIGlmICghc2VsZi5pc1BhY2soKSkge1xyXG4gICAgICAgICAgICAgICAgaWYgKGhhc1R5cGUpIHtcclxuICAgICAgICAgICAgICAgICAgICBmb290ZXJzLnB1c2goeydsYWJlbCc6ICdTdWJ0b3RhbDogJCcgKyBwYXJzZUZsb2F0KHRvdGFsUHJpY2UpLnRvRml4ZWQoMiksICdjb2xzcGFuJzogM30pO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBmb290ZXJzLnB1c2goeydsYWJlbCc6ICdTdWJ0b3RhbDogJCcgKyBwYXJzZUZsb2F0KHRvdGFsUHJpY2UpLnRvRml4ZWQoMiksICdjb2xzcGFuJzogMn0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgbGV0IHBwID0gcGFyc2VGbG9hdCh0b3RhbFByaWNlKS50b0ZpeGVkKDIpIC0gc2VsZi5pbml0UGFja1ByaWNlO1xyXG4gICAgICAgICAgICAgICAgaWYgKHBwID09IDApIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoaGFzVHlwZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBmb290ZXJzLnB1c2goeydsYWJlbCc6ICdTdWJ0b3RhbDogSU5DTFVERUQnLCAnY29sc3Bhbic6IDN9KTtcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBmb290ZXJzLnB1c2goeydsYWJlbCc6ICdTdWJ0b3RhbDogSU5DTFVERUQnLCAnY29sc3Bhbic6IDJ9KTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChoYXNUeXBlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvb3RlcnMucHVzaCh7J2xhYmVsJzogJ1N1YnRvdGFsOiArJCcgKyBwcC50b0ZpeGVkKDIpLCAnY29sc3Bhbic6IDN9KTtcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBmb290ZXJzLnB1c2goeydsYWJlbCc6ICdTdWJ0b3RhbDogKyQnICsgcHAudG9GaXhlZCgyKSwgJ2NvbHNwYW4nOiAyfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBzZWxmLkpUaWNrZXRzU2VsZWN0ZWRDYXJ0KCkuYXBwZW5kKHNlbGYuY3JlYXRlSHRtbFRhYmxlKCd0aWNrZXRzX3NlbGVjdGVkJywgaGVhZGVycywgcm93cywgZm9vdGVycykpO1xyXG4gICAgICAgICAgICBzZWxmLkpUaWNrZXRzU2VsZWN0ZWRUYWJsZSgpLmZpbmQoJy5kZWxldGVUaWNrZXQnKS5vbignY2xpY2snLCBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAvL3NlbGYuY2xlYXJDYXJ0KCk7XHJcbiAgICAgICAgICAgICAgICBzZWxmLmZyb21EZWxldGUgPSBzZWxmLnNlbGVjdGVkTGFiZWxzLmxlbmd0aDtcclxuICAgICAgICAgICAgICAgIGxldCBsYWJlbCA9IGpRdWVyeSh0aGlzKS5hdHRyKCdsYWJlbCcpO1xyXG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBrMSBpbiBzZWxmLnNlbGVjdGVkTGFiZWxzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY3VyTGFiZWwgPSBzZWxmLnNlbGVjdGVkTGFiZWxzW2sxXTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoY3VyTGFiZWxbJ2xhYmVsJ10gPT09IGxhYmVsICYmIHR5cGVvZiBjdXJMYWJlbFsnbGFiZWxvcmlnJ10gIT09ICd1bmRlZmluZWQnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsID0gY3VyTGFiZWxbJ2xhYmVsb3JpZyddO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBpZiAoIXNlbGYuSkZyZWVTZWF0aW5nKCkpIHtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgcG9kcyA9IFtdO1xyXG4gICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3Qga3AgaW4gc2VsZi5wb2RzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3Qga3BwIGluIHNlbGYucG9kc1trcF0pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLnBvZHNba3BdW2twcF0gPT09IGxhYmVsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9kcyA9IHNlbGYucG9kc1trcF07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgI
8443H1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBzZWxmLnNlYXRDaGFydC5kZXNlbGVjdE9iamVjdHMgIT09ICd1bmRlZmluZWQnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuc2VhdENoYXJ0LmRlc2VsZWN0T2JqZWN0cyhwb2RzKTtcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpbzEgPSAxOyBpbzEgPCBwb2RzLmxlbmd0aDsgaW8xKyspIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYudXBkYXRlT2JqUXVhbnRpdHkocG9kc1tpbzFdLCAwKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBzZWxmLnNlYXRDaGFydC5kZXNlbGVjdE9iamVjdHMgIT09ICd1bmRlZmluZWQnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuc2VhdENoYXJ0LmRlc2VsZWN0T2JqZWN0cyhbbGFiZWxdKTtcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnVwZGF0ZU9ialF1YW50aXR5KGxhYmVsLCAwKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHNlbGYuc2VhdENoYXJ0Lmxpc3RTZWxlY3RlZE9iamVjdHMgIT09ICd1bmRlZmluZWQnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5zZWF0Q2hhcnQubGlzdFNlbGVjdGVkT2JqZWN0cyhcclxuICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gKHNlbGVjdGVkT2JqZWN0cykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9jaGVjayB0aGUgc2VsZWN0ZWQgc2VhdHMgYW5kIGlmIHRoZSBudW1iZXIgaXMgc21hbGxlciBzZWxlY3QgYmFzZWQgb24gcmFuaywgYW5kIG5lYXJlc3RcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnNlbGVjdEJhc2VkT25Ecm9wRG93bihzZWxlY3RlZE9iamVjdHMpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHNlbGYuc2VsZWN0QmFzZWRPbkRyb3BEb3duKHNlbGYubXlzZWxlY3RlZE9iamVjdHMpO1xyXG5cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIC8qaWYgKHNlbGYuSklzQXR0cmFjdGlvbigpIHx8IHNlbGYuSlpvbmVJbWFnZSgpLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgIGlmICghc2VsZi5pc01vYmlsZSgpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5KVGlja2V0c0J1dHRvbnNDYXJ0KCkuYXBwZW5kKGpRdWVyeSgnPGRpdiBjbGFzcz1cImJlc3RfcHJpY2VfZ3VhcmFudGVlZFwiPiA8c3BhbiBjbGFzcz1cInNsdiBzbHYtY2hlY2stY2lyY2xlXCI+PC9zcGFuPjxzcGFuIGNsYXNzPVwiYmJfbGlua19wcm9kdWN0X3RleHRcIj5CZXN0IHByaWNlIGd1YXJhbnRlZWQ8L3NwYW4+IDwvZGl2PicpKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5KVGlja2V0c0J1dHRvbnNDYXJ0KCkucGFyZW50KCkuYXBwZW5kKGpRdWVyeSgnPGRpdiBjbGFzcz1cImJlc3RfcHJpY2VfZ3VhcmFudGVlZFwiPiA8c3BhbiBjbGFzcz1cInNsdiBzbHYtY2hlY2stY2lyY2xlXCI+PC9zcGFuPjxzcGFuIGNsYXNzPVwiYmJfbGlua19wcm9kdWN0X3RleHRcIj5CZXN0IHByaWNlIGd1YXJhbnRlZWQ8L3NwYW4+IDwvZGl2PicpKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSovXHJcblxyXG4gICAgICAgICAgICBzZWxmLkpUaWNrZXRzQnV0dG9uc0NhcnQoKS5hcHBlbmQoalF1ZXJ5KCc8YSBocmVmPVwiIzBcIiBjbGFzcz1cInNhZGRjYXJ0XCI+QWRkIFRvIENhcnQ8L2E+JykpLmFwcGVuZChqUXVlcnkoJzxhIGhyZWY9XCIjMFwiIGNsYXNzPVwic2J1eW5vd1wiPkJ1eSBOb3c8L2E+JykpOy8vLmFwcGVuZChqUXVlcnkoJzxhIGhyZWY9XCIjMFwiIGNsYXNzPVwiYnV0dG9uIGJ0biBzYWRkX3RvX2NhcnRfYnRuXCI+QWRkIFRvIENhcnQ8L2E+JykpXHJcbiAgICAgICAgICAgIC8valF1ZXJ5KCdodG1sLGJvZHknKS5hbmltYXRlKHtzY3JvbGxUb3A6IDB9LCAnc2xvdycpO1xyXG4gICAgICAgICAgICBpZiAoc2VsZi5KSXNBdHRyYWN0aW9uKCkgfHwgc2VsZi5KWm9uZUltYWdlKCkubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5KQnV5QnV0dG9uKCkub2ZmKCdjbGljaycpLm9uKCdjbGljaycsIGpRdWVyeS5wcm94eSh0aGlzLmJ1eU5vd0FjdGlvbkEsIHRoaXMpKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuSkFkZFRvQ2FydEJ1dHRvbigpLm9mZignY2xpY2snKS5vbignY2xpY2snLCBqUXVlcnkucHJveHkodGhpcy5hZGRUb0NhcnRBY3Rpb25BLCB0aGlzKSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLkpCdXlCdXR0b24oKS5vZmYoJ2NsaWNrJykub24oJ2NsaWNrJywgalF1ZXJ5LnByb3h5KHRoaXMuYnV5Tm93QWN0aW9uLCB0aGlzKSk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLkpBZGRUb0NhcnRCdXR0b24oKS5vZmYoJ2NsaWNrJykub24oJ2NsaWNrJywgalF1ZXJ5LnByb3h5KHRoaXMuYWRkVG9DYXJ0QWN0aW9uLCB0aGlzKSk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmIChqUXVlcnkoJyN0aWNrZXRzX3NlbGVjdGVkJykubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKHNlbGYuaXNJblZpZXdwb3J0KGpRdWVyeSgnI3RpY2tldHNfc2VsZWN0ZWQnKSkpIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyBkbyBzb21ldGhpbmdcclxuICAgICAgICAgICAgICAgICAgICBqUXVlcnkoJy5icHJvY2VlZF90aWNrZXRzJykuaGlkZSgpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBqUXVlcnkoJy5icHJvY2VlZF90aWNrZXRzJykuc2hvdygpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoc2VsZi5pc01vYmlsZSgpKSB7XHJcbiAgICAgICAgICAgICAgICBqUXVlcnkod2luZG93KS5zY3JvbGxUb3AoalF1ZXJ5KGRvY3VtZW50KS5oZWlnaHQoKSAtIFNjcm9sbEZyb21Cb3R0b20gLSAyMCk7XHJcbiAgICAgICAgICAgI
8443H1cclxuXHJcbiAgICAgICAgICAgIGlmICghc2VsZi5KRnJlZVNlYXRpbmcoKSkge1xyXG4gICAgICAgICAgICAgICAgaWYgKHNlbGYuc2VsZWN0ZWROdW1iZXJPZlRpY2tldHMgLSBudW1iZXJPZlNlbGVjdGVkU2VhdHMgJSBzZWxmLnNlbGVjdGVkTnVtYmVyT2ZUaWNrZXRzICE9PSBzZWxmLnNlbGVjdGVkTnVtYmVyT2ZUaWNrZXRzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IGRpZmZlcmVuY2UgPSBzZWxmLnNlbGVjdGVkTnVtYmVyT2ZUaWNrZXRzIC0gbnVtYmVyT2ZTZWxlY3RlZFNlYXRzICUgc2VsZi5zZWxlY3RlZE51bWJlck9mVGlja2V0cztcclxuICAgICAgICAgICAgICAgICAgICBsZXQgbGFzdExhYmVsID0gc2VsZi5zZWxlY3RlZExhYmVsc1tzZWxmLnNlbGVjdGVkTGFiZWxzLmxlbmd0aCAtIDFdO1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBteXBvZCA9IFtdO1xyXG4gICAgICAgICAgICAgICAgICAgIG15cG9kLnB1c2gobGFzdExhYmVsWydsYWJlbCddKTtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgc3RhcnQgPSAwO1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBzZWF0c0J5UG9zaXRpb24gPSBbXTtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgbGFzdFNlYXRTZWxlY3RlZCA9IHNlbGYuZXZlbnRTZWF0c1tsYXN0TGFiZWxbJ2xhYmVsJ11dO1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBmaW5kUG9zID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IGF1dG9TZWxlY3RlZFNlYXRzID0gW107XHJcbiAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBrIGluIHNlbGYuZXZlbnRTZWF0cykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoayA9PT0gbGFzdExhYmVsWydsYWJlbCddKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5kUG9zID0gc3RhcnQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgc2VhdHNCeVBvc2l0aW9uLnB1c2goc2VsZi5ldmVudFNlYXRzW2tdKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQrKztcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IHAgPSAxO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwYXRpYWxTZWF0ID0gcGFyc2VJbnQobGFzdFNlYXRTZWxlY3RlZFsnc3BhdGlhbFNlYXRJZCddKTtcclxuICAgICAgICAgICAgICAgICAgICB3aGlsZSAocCA8IHNlbGYuc2VsZWN0ZWROdW1iZXJPZlRpY2tldHMpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBzZWF0c0J5UG9zaXRpb25bZmluZFBvcyAtIHBdICE9PSAndW5kZWZpbmVkJyAmJlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VhdHNCeVBvc2l0aW9uW2ZpbmRQb3MgLSBwXVsnc3BhdGlhbFJvdyddID09PSBsYXN0U2VhdFNlbGVjdGVkWydzcGF0aWFsUm93J10pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNlbFNlYXQgPSBwYXJzZUludChzZWF0c0J5UG9zaXRpb25bZmluZFBvcyAtIHBdWydzcGF0aWFsU2VhdElkJ10pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbFNlYXQgKyBwID09PSBzcGF0aWFsU2VhdCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBpZXhpc3QgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGtwIGluIHNlbGYuc2VsZWN0ZWRMYWJlbHMpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYuc2VsZWN0ZWRMYWJlbHNba3BdWydsYWJlbCddID09PSBzZWF0c0J5UG9zaXRpb25bZmluZFBvcyAtIHBdWydrZXknXSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWV4aXN0ID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpZXhpc3QgPT09IGZhbHNlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG15cG9kLnB1c2goc2VhdHNCeVBvc2l0aW9uW2ZpbmRQb3MgLSBwXVsna2V5J10pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRvU2VsZWN0ZWRTZWF0cy5wdXNoKHNlYXRzQnlQb3NpdGlvbltmaW5kUG9zIC0gcF1bJ2tleSddKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlmZmVyZW5jZS0tO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRpZmZlcmVuY2UgPT09IDApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2Ygc2VhdHNCeVBvc2l0aW9uW2ZpbmRQb3MgKyBwXSAhPT0gJ3VuZGVmaW5lZCcgJiYgc2VhdHNCeVBvc2l0aW9uW2ZpbmRQb3MgKyBwXVsnc3BhdGlhbFJvdyddID09PSBsYXN0U2VhdFNlbGVjdGVkWydzcGF0aWFsUm93J10pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNlbFNlYXQgPSBwYXJzZUludChzZWF0c0J5UG9zaXRpb25bZmluZFBvcyArIHBdWydzcGF0aWFsU2VhdElkJ10pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKE1hdGguYWJzKHNlbFNlYXQgLSBwKSA9PT0gc3BhdGlhbFNlYXQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgaWV4aXN0ID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBrcCBpbiBzZWxmLnNlbGVjdGVkTGFiZWxzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLnNlbGVjdGVkTGFiZWxzW2twXVsnbGFiZWwnXSA9PT0gc2VhdHNCeVBvc2l0aW9uW2ZpbmRQb3MgKyBwXVsna2V5J10pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlleGlzdCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI
8443H1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaWV4aXN0ID09PSBmYWxzZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBteXBvZC5wdXNoKHNlYXRzQnlQb3NpdGlvbltmaW5kUG9zICsgcF1bJ2tleSddKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0b1NlbGVjdGVkU2VhdHMucHVzaChzZWF0c0J5UG9zaXRpb25bZmluZFBvcyArIHBdWydrZXknXSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpZmZlcmVuY2UtLTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkaWZmZXJlbmNlID09PSAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBwKys7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChkaWZmZXJlbmNlID09PSAwICYmIGF1dG9TZWxlY3RlZFNlYXRzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5wb2RzLnB1c2gobXlwb2QpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnNlYXRDaGFydC5zZWxlY3RPYmplY3RzKGF1dG9TZWxlY3RlZFNlYXRzKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGRpZmZlcmVuY2UgPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFN3YWwuZmlyZSh7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZTogJ0Vycm9yIScsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0OiAnQ2Fubm90IHNlbGVjdCB0aGUgcmVzdCBvZiB0aGUgdGlja2V0cyBiZWNhdXNlIHRoZXJlIGFyZSBubyBzZWF0cyBhdmFpbGFibGUgb24gdGhlIHNhbWUgcm93JyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGljb246ICdlcnJvcicsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maXJtQnV0dG9uVGV4dDogJ09rJ1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5zZWF0Q2hhcnQuZGVzZWxlY3RPYmplY3RzKFtzZWxlY3RTZWF0c0xhYmVsT25seVtzZWxlY3RTZWF0c0xhYmVsT25seS5sZW5ndGggLSAxXV0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnNlYXRDaGFydC5saXN0U2VsZWN0ZWRPYmplY3RzKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gKHNlbGVjdGVkT2JqZWN0cykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vY2hlY2sgdGhlIHNlbGVjdGVkIHNlYXRzIGFuZCBpZiB0aGUgbnVtYmVyIGlzIHNtYWxsZXIgc2VsZWN0IGJhc2VkIG9uIHJhbmssIGFuZCBuZWFyZXN0XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuc2VsZWN0QmFzZWRPbkRyb3BEb3duKHNlbGVjdGVkT2JqZWN0cyk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBhZGRUb0NhcnRBY3Rpb24oKSB7XHJcbiAgICAgICAgbGV0IHNlbGYgPSB0aGlzO1xyXG4gICAgICAgIGxldCBsYWJlbHMgPSBPYmplY3QuYXNzaWduKHt9LCBzZWxmLnNlbGVjdGVkTGFiZWxzKTtcclxuICAgICAgICBsZXQgdXNlZEJsb2Nrc1RvU2VuZCA9IHt9O1xyXG4gICAgICAgIGZvciAoY29uc3QgaSBpbiBzZWxmLnVzZWRCbG9ja3MpIHtcclxuICAgICAgICAgICAgdXNlZEJsb2Nrc1RvU2VuZFtpXSA9IHt9O1xyXG4gICAgICAgICAgICB1c2VkQmxvY2tzVG9TZW5kW2ldWydwcm9tbyddID0ge307XHJcbiAgICAgICAgICAgIHVzZWRCbG9ja3NUb1NlbmRbaV1bJ3Byb21vJ11bJ3Byb21vdGlvbkNvZGUnXSA9IHNlbGYudXNlZEJsb2Nrc1tpXVsncHJvbW8nXVsncHJvbW90aW9uQ29kZSddO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBkYXRhID0ge1xyXG4gICAgICAgICAgICBhY3Rpb246ICdob2xkX3NlYXRzJyxcclxuICAgICAgICAgICAgcHJvZHVjdGlkOiBzZWxmLmdldFBhcmFtZXRlckJ5TmFtZSgncHJvZHVjdF9pZCcpLFxyXG4gICAgICAgICAgICBzZWF0bGFiZWxzOiBsYWJlbHMsXHJcbiAgICAgICAgICAgIHBvZHM6IHNlbGYucG9kcyxcclxuICAgICAgICAgICAgZXZlbnRrZXk6IHNlbGYuc2VsZWN0ZWRFdmVudElkLFxyXG4gICAgICAgICAgICBldmVudERhdGE6IHNlbGYuc2VsZWN0ZWRFdmVudERhdGEsXHJcbiAgICAgICAgICAgIHVzZWRCbG9ja3M6IHVzZWRCbG9ja3NUb1NlbmQsXHJcbiAgICAgICAgICAgIHF0eTogbGFiZWxzLmxlbmd0aCxcclxuICAgICAgICAgICAgaXNwOiBzZWxmLmlzUGFjaygpLFxyXG4gICAgICAgICAgICBpc19hZGRfdG9fY2FydDogdHJ1ZSxcclxuICAgICAgICAgICAgc2VjdXJpdHk6IGpRdWVyeSgnI3J3Yl9ob2xkX3NlYXRzX25vbmNlJykudmFsKClcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICBzZWxmLkpBZGRUb0NhcnRCdXR0b24oKS5Mb2FkaW5nT3ZlcmxheShcInNob3dcIik7XHJcbiAgICAgICAgalF1ZXJ5LmFqYXgoe1xyXG4gICAgICAgICAgICB0eXBlOiAnUE9TVCcsXHJcbiAgICAgICAgICAgIGRhdGFUeXBlOiAnanNvbicsXHJcbiAgICAgICAgICAgIHVybDogYmJMb2NhbC5hamF4X3VybCxcclxuICAgICAgICAgICAgZGF0YTogZGF0YSxcclxuICAgICAgICAgICAgc3VjY2VzczogalF1ZXJ5LnByb3h5KHNlbGYuYWRkVG9DYXJ0Q29tcGxldGVkLCBzZWxmKVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIG9uQnRuQ2xpY2tlZChidG5JZCkge1xyXG4gICAgICAgIFN3YWwuY2xvc2UoKTtcclxuICAgICAgICBpZiAoYnRuSWQgIT0gXCJjYW5jZWxcIikge1xyXG4gICAgICAgICAgICBTd2FsLmZpcmUoXCJ5b3UgY2hvb3NlZDogXCIgKyBidG5JZCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGNyZWF0ZUJ1dHRvbih0ZXh0LCBjYikge1xyXG4gICAgICAgI
8443HJldHVybiBqUXVlcnkoJzxidXR0b24gY2xhc3M9XCJidG4gYnRuLWluZm9cIj4nICsgdGV4dCArICc8L2J1dHRvbj4nKS5vbignY2xpY2snLCBjYik7XHJcbiAgICB9XHJcblxyXG4gICAgYWRkVG9DYXJ0Q29tcGxldGVkKHJlc3BvbnNlKSB7XHJcbiAgICAgICAgY29uc3Qgc2VsZiA9IHRoaXM7XHJcbiAgICAgICAgaWYgKHJlc3BvbnNlLnN1Y2Nlc3MgPT09IGZhbHNlKSB7XHJcbiAgICAgICAgICAgIGlmICh0eXBlb2YgdGhpcy5zZWF0Q2hhcnQucmVyZW5kZXIgIT09ICd1bmRlZmluZWQnKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNlYXRDaGFydC5yZXJlbmRlcigpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIC8vdGhpcy5zZWF0Q2hhcnQgPSBmYWxzZTtcclxuICAgICAgICAgICAgLy90aGlzLnNlbGVjdGVkT2JqZWN0Q2hhcnQgPSBudWxsO1xyXG4gICAgICAgICAgICAvL3RoaXMuc2VsZWN0ZWRFdmVudCA9IG51bGw7XHJcblxyXG4gICAgICAgICAgICBTd2FsLmZpcmUoe1xyXG4gICAgICAgICAgICAgICAgdGl0bGU6ICdJbmZvcm1hdGlvbicsXHJcbiAgICAgICAgICAgICAgICB0ZXh0OiByZXNwb25zZS5tZXNzYWdlLFxyXG4gICAgICAgICAgICAgICAgaWNvbjogJ2luZm8nLFxyXG4gICAgICAgICAgICAgICAgY29uZmlybUJ1dHRvblRleHQ6ICdPSycsXHJcbiAgICAgICAgICAgICAgICBjbG9zZU9uQ29uZmlybTogdHJ1ZSxcclxuICAgICAgICAgICAgICAgIGFsbG93T3V0c2lkZUNsaWNrOiBmYWxzZSxcclxuICAgICAgICAgICAgICAgIGFsbG93RXNjYXBlS2V5OiBmYWxzZVxyXG4gICAgICAgICAgICB9KS50aGVuKChyZXN1bHQpID0+IHtcclxuICAgICAgICAgICAgICAgIC8qIFJlYWQgbW9yZSBhYm91dCBpc0NvbmZpcm1lZCwgaXNEZW5pZWQgYmVsb3cgKi9cclxuICAgICAgICAgICAgICAgIGlmIChyZXN1bHQuaXNDb25maXJtZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICBzZWxmLkpBZGRUb0NhcnRCdXR0b24oKS5Mb2FkaW5nT3ZlcmxheShcImhpZGVcIiwgdHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgLy93aW5kb3cubG9jYXRpb24uaHJlZiA9IHdpbmRvdy5sb2NhdGlvbi5ocmVmO1xyXG4gICAgICAgICAgICAgICAgICAgIC8vc2VsZi5KQnV5QnV0dG9uKCkuTG9hZGluZ092ZXJsYXkoXCJoaWRlXCIsIHRydWUpO1xyXG4gICAgICAgICAgICAgICAgICAgIHNlbGYuY2xlYXJDYXJ0KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5zZWxlY3RCYXNlZE9uRHJvcERvd24oW10pO1xyXG4gICAgICAgICAgICAgICAgICAgIC8vc2VsZi5KQWRkVG9DYXJ0QnV0dG9uKCkuaGlkZSgpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAvL3JlZnJlc2ggbWFwXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlLnJlbG9hZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5KSXNBdHRyYWN0aW9uKCkgfHwgc2VsZi5KWm9uZUltYWdlKCkubGVuZ3RoID4gMCkge1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucmVuZGVyU2VhdENoYXJ0KHNlbGYuc2VsZWN0ZWRFdmVudElkKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJlc3VsdC5pc0RlbmllZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vU3dhbC5maXJlKCdDaGFuZ2VzIGFyZSBub3Qgc2F2ZWQnLCAnJywgJ2luZm8nKVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLmhyZWYgPSByZXNwb25zZS51cmw7XHJcbiAgICAgICAgICAgIC8qXHJcbiAgICAgICAgICAgIHNlbGYuY2xlYXJDYXJ0KCk7XHJcbiAgICAgICAgICAgIGpRdWVyeSgnLmFyb3VuZF9pY29uc19zaG9wcGluZycpLnJlbW92ZUNsYXNzKCdiZWVuX3JlZnJlc2hlZCcpO1xyXG4gICAgICAgICAgICBTd2FsLmZpcmUoe1xyXG4gICAgICAgICAgICAgICAgdGl0bGU6ICdJbmZvcm1hdGlvbicsXHJcbiAgICAgICAgICAgICAgICB0ZXh0OiAnWW91ciB0aWNrZXRzIGhhdmUgYmVlbiBhZGRlZCB0byB0aGUgY2FydC4gSWYgeW91IHdhbnQgdG8gYnV5IG1vcmUgdGlja2V0cyBwbGVhc2Ugc2VsZWN0IHRoZW0gZnJvbSB0aGUgc2VhdGluZyBjaGFydCBhbmQgYWRkIHRoZW0gdG8gdGhlIGNhcnQuIElmIHlvdSBoYXZlIGZpbmlzaGVkIEdvIFRvIENoZWNrb3V0LicsXHJcbiAgICAgICAgICAgICAgICBpY29uOiAnaW5mbycsXHJcbiAgICAgICAgICAgICAgICBjb25maXJtQnV0dG9uVGV4dDogJ0NvbnRpbnVlJyxcclxuICAgICAgICAgICAgICAgIHNob3dDb25maXJtQnV0dG9uOiB0cnVlLFxyXG4gICAgICAgICAgICAgICAgc2hvd0RlbnlCdXR0b246IHRydWUsXHJcbiAgICAgICAgICAgICAgICBkZW55QnV0dG9uVGV4dDogYEdvIFRvIENoZWNrb3V0YCxcclxuICAgICAgICAgICAgICAgIGNsb3NlT25Db25maXJtOiB0cnVlXHJcbiAgICAgICAgICAgIH0pLnRoZW4oKHJlc3VsdCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKHJlc3VsdC5pc0NvbmZpcm1lZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vc2VsZi5KQWRkVG9DYXJ0QnV0dG9uKCkuTG9hZGluZ092ZXJsYXkoXCJoaWRlXCIsIHRydWUpO1xyXG4gICAgICAgICAgICAgICAgICAgIC8vd2luZG93LmxvY2F0aW9uLmhyZWYgPSB3aW5kb3cubG9jYXRpb24uaHJlZjtcclxuICAgICAgICAgICAgICAgICAgICAvL3NlbGYuSkFkZFRvQ2FydEJ1dHRvbigpLmhpZGUoKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocmVzdWx0LmlzRGVuaWVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLmhyZWYgPSByZXNwb25zZS5jaGVja291dF91cmw7XHJcbiAgICAgICAgICAgICAgICAgICAgLy9Td2FsLmZpcmUoJ0NoYW5nZXMgYXJlIG5vdCBzYXZlZCcsICcnLCAnaW5mbycpXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgI
8443H0pO1xyXG5cclxuICAgICAgICAgICAgICovXHJcblxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBidXlOb3dBY3Rpb25BKCkge1xyXG4gICAgICAgIGxldCBzZWxmID0gdGhpcztcclxuXHJcbiAgICAgICAgbGV0IHBJRDtcclxuICAgICAgICBpZiAoc2VsZi5KSXNBdHRyYWN0aW9uKCkpIHtcclxuICAgICAgICAgICAgcElEID0galF1ZXJ5KCcjYXR0cmFjdGlvbl9pZCcpLmF0dHIoJ3BpZCcpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHBJRCA9IHNlbGYuZ2V0UGFyYW1ldGVyQnlOYW1lKCdwcm9kdWN0X2lkJyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBsZXQgdGlja2V0RGF0YSA9IFtdO1xyXG4gICAgICAgIGxldCBzdG9wID0gZmFsc2U7XHJcbiAgICAgICAgalF1ZXJ5KCcuYXR0cmFjdGlvbl9taW50X21heHQnKS5lYWNoKGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgbGV0IGF0dHIgPSB7fTtcclxuICAgICAgICAgICAgaWYgKHBhcnNlSW50KGpRdWVyeSh0aGlzKS52YWwoKSkgPiAwKSB7XHJcbiAgICAgICAgICAgICAgICBhdHRyLnF0eSA9IGpRdWVyeSh0aGlzKS52YWwoKTtcclxuICAgICAgICAgICAgICAgIGF0dHIucHJvbW9fY29kZSA9IGpRdWVyeSh0aGlzKS5hdHRyKCdpJyk7XHJcbiAgICAgICAgICAgICAgICBhdHRyLnByaWNlTGV2ZWxJZCA9IGpRdWVyeSh0aGlzKS5hdHRyKCdqJyk7XHJcbiAgICAgICAgICAgICAgICBpZiAoalF1ZXJ5KHRoaXMpLnBhcmVudCgpLnBhcmVudCgpLnBhcmVudCgpLnBhcmVudCgpLmZpbmQoJy5hdHRyYWN0aW9uX3BpY2t1cGxvYycpLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICBhdHRyLnBpY2t1cGxvYyA9IGpRdWVyeSh0aGlzKS5wYXJlbnQoKS5wYXJlbnQoKS5wYXJlbnQoKS5wYXJlbnQoKS5maW5kKCcuYXR0cmFjdGlvbl9waWNrdXBsb2MnKS52YWwoKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmIChqUXVlcnkodGhpcykucGFyZW50KCkuaGFzQ2xhc3MoJ2hhc253JykpIHtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgYmJmbmFtZSA9IFtdO1xyXG4gICAgICAgICAgICAgICAgICAgIGpRdWVyeSh0aGlzKS5wYXJlbnQoKS5wYXJlbnQoKS5wYXJlbnQoKS5wYXJlbnQoKS5maW5kKCcubndkYXRhIC5iYmZuYW1lJykuZWFjaChmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChqUXVlcnkodGhpcykudmFsKCkgIT09ICcnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYmZuYW1lLnB1c2goalF1ZXJ5KHRoaXMpLnZhbCgpKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0b3AgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgYXR0ci5iYmZuYW1lID0gYmJmbmFtZTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IGJibG5hbWUgPSBbXTtcclxuICAgICAgICAgICAgICAgICAgICBqUXVlcnkodGhpcykucGFyZW50KCkucGFyZW50KCkucGFyZW50KCkucGFyZW50KCkuZmluZCgnLm53ZGF0YSAuYmJsbmFtZScpLmVhY2goZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoalF1ZXJ5KHRoaXMpLnZhbCgpICE9PSAnJykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYmJsbmFtZS5wdXNoKGpRdWVyeSh0aGlzKS52YWwoKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdG9wID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgIGF0dHIuYmJsbmFtZSA9IGJibG5hbWU7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGxldCBiYndlaWdodCA9IFtdO1xyXG4gICAgICAgICAgICAgICAgICAgIGpRdWVyeSh0aGlzKS5wYXJlbnQoKS5wYXJlbnQoKS5wYXJlbnQoKS5wYXJlbnQoKS5maW5kKCcubndkYXRhIC5iYndlaWdodCcpLmVhY2goZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoalF1ZXJ5KHRoaXMpLnZhbCgpICE9PSAnJykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYmJ3ZWlnaHQucHVzaChqUXVlcnkodGhpcykudmFsKCkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RvcCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICBhdHRyLmJid2VpZ2h0ID0gYmJ3ZWlnaHQ7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB0aWNrZXREYXRhLnB1c2goYXR0cik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgICBpZiAoc3RvcCkge1xyXG4gICAgICAgICAgICBTd2FsLmZpcmUoe1xyXG4gICAgICAgICAgICAgICAgdGl0bGU6ICdIb2xkIFVwIScsXHJcbiAgICAgICAgICAgICAgICB0ZXh0OiAnUGxlYXNlIHByb3ZpZGUgYWxsIGluZm9ybWF0aW9uJyxcclxuICAgICAgICAgICAgICAgIGljb246ICdlcnJvcicsXHJcbiAgICAgICAgICAgICAgICBjb25maXJtQnV0dG9uVGV4dDogJ09rJ1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGlja2V0RGF0YS5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIGxldCB1c2VkQmxvY2tzVG9TZW5kID0ge307XHJcbiAgICAgICAgICAgIGZvciAoY29uc3QgaSBpbiBzZWxmLnVzZWRCbG9ja3MpIHtcclxuICAgICAgICAgICAgICAgIHVzZWRCbG9ja3NUb1NlbmRbaV0gPSB7fTtcclxuICAgICAgICAgICAgICAgIHVzZWRCbG9ja3NUb1NlbmRbaV1bJ3Byb21vJ10gPSB7fTtcclxuICAgICAgICAgICAgICAgI
8443HVzZWRCbG9ja3NUb1NlbmRbaV1bJ3Byb21vJ11bJ3Byb21vdGlvbkNvZGUnXSA9IHNlbGYudXNlZEJsb2Nrc1tpXVsncHJvbW8nXVsncHJvbW90aW9uQ29kZSddO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNvbnN0IGRhdGEgPSB7XHJcbiAgICAgICAgICAgICAgICBhY3Rpb246ICdob2xkX2F0dHJhY3Rpb24nLFxyXG4gICAgICAgICAgICAgICAgcHJvZHVjdGlkOiBwSUQsXHJcbiAgICAgICAgICAgICAgICBldmVudGtleTogc2VsZi5zZWxlY3RlZEV2ZW50SWQsXHJcbiAgICAgICAgICAgICAgICBldmVudERhdGE6IHNlbGYuc2VsZWN0ZWRFdmVudERhdGEsXHJcbiAgICAgICAgICAgICAgICB1c2VkQmxvY2tzOiB1c2VkQmxvY2tzVG9TZW5kLFxyXG4gICAgICAgICAgICAgICAgaXNwOiBzZWxmLmlzUGFjaygpLFxyXG4gICAgICAgICAgICAgICAgLy9xdHk6IHNlbGYuc2VsZWN0ZWROdW1iZXJPZlRpY2tldHMsXHJcbiAgICAgICAgICAgICAgICB0aWNrZXRfZGF0YTogdGlja2V0RGF0YSxcclxuICAgICAgICAgICAgICAgIHNlY3VyaXR5OiBqUXVlcnkoJyNyd2JfaG9sZF9hdHRyYWN0aW9uX25vbmNlJykudmFsKClcclxuICAgICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICAgIHNlbGYuSkJ1eUJ1dHRvbigpLkxvYWRpbmdPdmVybGF5KFwic2hvd1wiKTtcclxuICAgICAgICAgICAgalF1ZXJ5LmFqYXgoe1xyXG4gICAgICAgICAgICAgICAgdHlwZTogJ1BPU1QnLFxyXG4gICAgICAgICAgICAgICAgZGF0YVR5cGU6ICdqc29uJyxcclxuICAgICAgICAgICAgICAgIHVybDogYmJMb2NhbC5hamF4X3VybCxcclxuICAgICAgICAgICAgICAgIGRhdGE6IGRhdGEsXHJcbiAgICAgICAgICAgICAgICBzdWNjZXNzOiBqUXVlcnkucHJveHkoc2VsZi5idXlOb3dDb21wbGV0ZWRBLCBzZWxmKVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBTd2FsLmZpcmUoe1xyXG4gICAgICAgICAgICAgICAgdGl0bGU6ICdIb2xkIFVwIScsXHJcbiAgICAgICAgICAgICAgICB0ZXh0OiAnUGxlYXNlIHByb3ZpZGUgYWxsIGluZm9ybWF0aW9uJyxcclxuICAgICAgICAgICAgICAgIGljb246ICdlcnJvcicsXHJcbiAgICAgICAgICAgICAgICBjb25maXJtQnV0dG9uVGV4dDogJ09rJ1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgYnV5Tm93Q29tcGxldGVkQShyZXNwb25zZSkge1xyXG5cclxuICAgICAgICBpZiAocmVzcG9uc2Uuc3VjY2VzcyA9PT0gZmFsc2UpIHtcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZEV2ZW50ID0gbnVsbDtcclxuICAgICAgICAgICAgY29uc3Qgc2VsZiA9IHRoaXM7XHJcbiAgICAgICAgICAgIFN3YWwuZmlyZSh7XHJcbiAgICAgICAgICAgICAgICB0aXRsZTogJ0luZm9ybWF0aW9uJyxcclxuICAgICAgICAgICAgICAgIHRleHQ6IHJlc3BvbnNlLm1lc3NhZ2UsXHJcbiAgICAgICAgICAgICAgICBpY29uOiAnaW5mbycsXHJcbiAgICAgICAgICAgICAgICBjb25maXJtQnV0dG9uVGV4dDogJ09LJyxcclxuICAgICAgICAgICAgICAgIGNsb3NlT25Db25maXJtOiB0cnVlLFxyXG4gICAgICAgICAgICB9KS50aGVuKChyZXN1bHQpID0+IHtcclxuICAgICAgICAgICAgICAgIC8qIFJlYWQgbW9yZSBhYm91dCBpc0NvbmZpcm1lZCwgaXNEZW5pZWQgYmVsb3cgKi9cclxuICAgICAgICAgICAgICAgIGlmIChyZXN1bHQuaXNDb25maXJtZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICBzZWxmLkpCdXlCdXR0b24oKS5Mb2FkaW5nT3ZlcmxheShcImhpZGVcIiwgdHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgLy9zZWxmLkpCdXlCdXR0b24oKS5oaWRlKCk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJlc3VsdC5pc0RlbmllZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vU3dhbC5maXJlKCdDaGFuZ2VzIGFyZSBub3Qgc2F2ZWQnLCAnJywgJ2luZm8nKVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuXHJcblxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5ocmVmID0gcmVzcG9uc2UudXJsO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcblxyXG4gICAgYWRkVG9DYXJ0QWN0aW9uQSgpIHtcclxuICAgICAgICBsZXQgc2VsZiA9IHRoaXM7XHJcblxyXG4gICAgICAgIGxldCBwSUQ7XHJcbiAgICAgICAgaWYgKHNlbGYuSklzQXR0cmFjdGlvbigpKSB7XHJcbiAgICAgICAgICAgIHBJRCA9IGpRdWVyeSgnI2F0dHJhY3Rpb25faWQnKS5hdHRyKCdwaWQnKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBwSUQgPSBzZWxmLmdldFBhcmFtZXRlckJ5TmFtZSgncHJvZHVjdF9pZCcpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbGV0IHRpY2tldERhdGEgPSBbXTtcclxuICAgICAgICBsZXQgc3RvcCA9IGZhbHNlO1xyXG4gICAgICAgIGpRdWVyeSgnLmF0dHJhY3Rpb25fbWludF9tYXh0JykuZWFjaChmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIGxldCBhdHRyID0ge307XHJcbiAgICAgICAgICAgIGlmIChwYXJzZUludChqUXVlcnkodGhpcykudmFsKCkpID4gMCkge1xyXG4gICAgICAgICAgICAgICAgYXR0ci5xdHkgPSBqUXVlcnkodGhpcykudmFsKCk7XHJcbiAgICAgICAgICAgICAgICBhdHRyLnByb21vX2NvZGUgPSBqUXVlcnkodGhpcykuYXR0cignaScpO1xyXG4gICAgICAgICAgICAgICAgYXR0ci5wcmljZUxldmVsSWQgPSBqUXVlcnkodGhpcykuYXR0cignaicpO1xyXG4gICAgICAgICAgICAgICAgaWYgKGpRdWVyeSh0aGlzKS5wYXJlbnQoKS5oYXNDbGFzcygnaGFzbncnKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGF0dHIucGlja3VwbG9jID0galF1ZXJ5KHRoaXMpLnBhcmVudCgpLnBhcmVudCgpLnBhcmVudCgpLnBhcmVudCgpLmZpbmQoJy5hdHRyYWN0aW9uX3BpY2t1cGxvYycpLnZhbCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBiYmZuYW1lID0gW107XHJcbiAgICAgICAgICAgICAgICAgICAgalF1ZXJ5KHRoaXMpLnBhcmVudCgpLnBhcmVudCgpLnBhcmVudCgpLnBhcmVudCgpLmZpbmQoJy5ud2RhdGEgLmJiZm5hbWUnKS5lYWNoKGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGpRdWVyeSh0aGlzKS52YWwoKSAhPT0gJycpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJiZm5hbWUucHVzaChqUXVlcnkodGhpcykudmFsKCkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RvcCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgI
8443H1cclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICBhdHRyLmJiZm5hbWUgPSBiYmZuYW1lO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBsZXQgYmJsbmFtZSA9IFtdO1xyXG4gICAgICAgICAgICAgICAgICAgIGpRdWVyeSh0aGlzKS5wYXJlbnQoKS5wYXJlbnQoKS5wYXJlbnQoKS5wYXJlbnQoKS5maW5kKCcubndkYXRhIC5iYmxuYW1lJykuZWFjaChmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChqUXVlcnkodGhpcykudmFsKCkgIT09ICcnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYmxuYW1lLnB1c2goalF1ZXJ5KHRoaXMpLnZhbCgpKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0b3AgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgYXR0ci5iYmxuYW1lID0gYmJsbmFtZTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IGJid2VpZ2h0ID0gW107XHJcbiAgICAgICAgICAgICAgICAgICAgalF1ZXJ5KHRoaXMpLnBhcmVudCgpLnBhcmVudCgpLnBhcmVudCgpLnBhcmVudCgpLmZpbmQoJy5ud2RhdGEgLmJid2VpZ2h0JykuZWFjaChmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChqUXVlcnkodGhpcykudmFsKCkgIT09ICcnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYndlaWdodC5wdXNoKGpRdWVyeSh0aGlzKS52YWwoKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdG9wID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgIGF0dHIuYmJ3ZWlnaHQgPSBiYndlaWdodDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHRpY2tldERhdGEucHVzaChhdHRyKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBpZiAoc3RvcCkge1xyXG4gICAgICAgICAgICBTd2FsLmZpcmUoe1xyXG4gICAgICAgICAgICAgICAgdGl0bGU6ICdIb2xkIFVwIScsXHJcbiAgICAgICAgICAgICAgICB0ZXh0OiAnUGxlYXNlIHByb3ZpZGUgYWxsIGluZm9ybWF0aW9uJyxcclxuICAgICAgICAgICAgICAgIGljb246ICdlcnJvcicsXHJcbiAgICAgICAgICAgICAgICBjb25maXJtQnV0dG9uVGV4dDogJ09rJ1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGlja2V0RGF0YS5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIGxldCB1c2VkQmxvY2tzVG9TZW5kID0ge307XHJcbiAgICAgICAgICAgIGZvciAoY29uc3QgaSBpbiBzZWxmLnVzZWRCbG9ja3MpIHtcclxuICAgICAgICAgICAgICAgIHVzZWRCbG9ja3NUb1NlbmRbaV0gPSB7fTtcclxuICAgICAgICAgICAgICAgIHVzZWRCbG9ja3NUb1NlbmRbaV1bJ3Byb21vJ10gPSB7fTtcclxuICAgICAgICAgICAgICAgIHVzZWRCbG9ja3NUb1NlbmRbaV1bJ3Byb21vJ11bJ3Byb21vdGlvbkNvZGUnXSA9IHNlbGYudXNlZEJsb2Nrc1tpXVsncHJvbW8nXVsncHJvbW90aW9uQ29kZSddO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNvbnN0IGRhdGEgPSB7XHJcbiAgICAgICAgICAgICAgICBhY3Rpb246ICdob2xkX2F0dHJhY3Rpb24nLFxyXG4gICAgICAgICAgICAgICAgcHJvZHVjdGlkOiBwSUQsXHJcbiAgICAgICAgICAgICAgICBldmVudGtleTogc2VsZi5zZWxlY3RlZEV2ZW50SWQsXHJcbiAgICAgICAgICAgICAgICBldmVudERhdGE6IHNlbGYuc2VsZWN0ZWRFdmVudERhdGEsXHJcbiAgICAgICAgICAgICAgICB1c2VkQmxvY2tzOiB1c2VkQmxvY2tzVG9TZW5kLFxyXG4gICAgICAgICAgICAgICAgLy9xdHk6IHNlbGYuc2VsZWN0ZWROdW1iZXJPZlRpY2tldHMsXHJcbiAgICAgICAgICAgICAgICB0aWNrZXRfZGF0YTogdGlja2V0RGF0YSxcclxuICAgICAgICAgICAgICAgIGlzcDogc2VsZi5pc1BhY2soKSxcclxuICAgICAgICAgICAgICAgIGlzX2FkZF90b19jYXJ0OiB0cnVlLFxyXG4gICAgICAgICAgICAgICAgc2VjdXJpdHk6IGpRdWVyeSgnI3J3Yl9ob2xkX2F0dHJhY3Rpb25fbm9uY2UnKS52YWwoKVxyXG4gICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgc2VsZi5KQWRkVG9DYXJ0QnV0dG9uKCkuTG9hZGluZ092ZXJsYXkoXCJzaG93XCIpO1xyXG4gICAgICAgICAgICBqUXVlcnkuYWpheCh7XHJcbiAgICAgICAgICAgICAgICB0eXBlOiAnUE9TVCcsXHJcbiAgICAgICAgICAgICAgICBkYXRhVHlwZTogJ2pzb24nLFxyXG4gICAgICAgICAgICAgICAgdXJsOiBiYkxvY2FsLmFqYXhfdXJsLFxyXG4gICAgICAgICAgICAgICAgZGF0YTogZGF0YSxcclxuICAgICAgICAgICAgICAgIHN1Y2Nlc3M6IGpRdWVyeS5wcm94eShzZWxmLmFkZFRvQ2FydENvbXBsZXRlZEEsIHNlbGYpXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIFN3YWwuZmlyZSh7XHJcbiAgICAgICAgICAgICAgICB0aXRsZTogJ0Vycm9yIScsXHJcbiAgICAgICAgICAgICAgICB0ZXh0OiAnUGxlYXNlIFNlbGVjdCBhdCBsZWFzdCBvbmUgdGlja2V0JyxcclxuICAgICAgICAgICAgICAgIGljb246ICdlcnJvcicsXHJcbiAgICAgICAgICAgICAgICBjb25maXJtQnV0dG9uVGV4dDogJ09LJ1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgYWRkVG9DYXJ0Q29tcGxldGVkQShyZXNwb25zZSkge1xyXG5cclxuICAgICAgICBpZiAocmVzcG9uc2Uuc3VjY2VzcyA9PT0gZmFsc2UpIHtcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZEV2ZW50ID0gbnVsbDtcclxuICAgICAgICAgICAgY29uc3Qgc2VsZiA9IHRoaXM7XHJcbiAgICAgICAgICAgIFN3YWwuZmlyZSh7XHJcbiAgICAgICAgICAgICAgICB0aXRsZTogJ0luZm9ybWF0aW9uJyxcclxuICAgICAgICAgICAgICAgI
8443HRleHQ6IHJlc3BvbnNlLm1lc3NhZ2UsXHJcbiAgICAgICAgICAgICAgICBpY29uOiAnaW5mbycsXHJcbiAgICAgICAgICAgICAgICBjb25maXJtQnV0dG9uVGV4dDogJ09LJyxcclxuICAgICAgICAgICAgICAgIGNsb3NlT25Db25maXJtOiB0cnVlLFxyXG4gICAgICAgICAgICB9KS50aGVuKChyZXN1bHQpID0+IHtcclxuICAgICAgICAgICAgICAgIC8qIFJlYWQgbW9yZSBhYm91dCBpc0NvbmZpcm1lZCwgaXNEZW5pZWQgYmVsb3cgKi9cclxuICAgICAgICAgICAgICAgIGlmIChyZXN1bHQuaXNDb25maXJtZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICBzZWxmLkpBZGRUb0NhcnRCdXR0b24oKS5Mb2FkaW5nT3ZlcmxheShcImhpZGVcIiwgdHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgLy9zZWxmLkpBZGRUb0NhcnRCdXR0b24oKS5oaWRlKCk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJlc3VsdC5pc0RlbmllZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vU3dhbC5maXJlKCdDaGFuZ2VzIGFyZSBub3Qgc2F2ZWQnLCAnJywgJ2luZm8nKVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLmhyZWYgPSByZXNwb25zZS51cmw7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuXHJcbiAgICBidXlOb3dBY3Rpb24oKSB7XHJcbiAgICAgICAgbGV0IHNlbGYgPSB0aGlzO1xyXG4gICAgICAgIGxldCBsYWJlbHMgP
8443SBPYmplY3QuYXNzaWduKHt9LCBzZWxmLnNlbGVjdGVkTGFiZWxzKTtcclxuICAgICAgICBsZXQgdXNlZEJsb2Nrc1RvU2VuZCA9IHt9O1xyXG4gICAgICAgIGZvciAoY29uc3QgaSBpbiBzZWxmLnVzZWRCbG9ja3MpIHtcclxuICAgICAgICAgICAgdXNlZEJsb2Nrc1RvU2VuZFtpXSA9IHt9O1xyXG4gICAgICAgICAgICB1c2VkQmxvY2tzVG9TZW5kW2ldWydwcm9tbyddID0ge307XHJcbiAgICAgICAgICAgIHVzZWRCbG9ja3NUb1NlbmRbaV1bJ3Byb21vJ11bJ3Byb21vdGlvbkNvZGUnXSA9IHNlbGYudXNlZEJsb2Nrc1tpXVsncHJvbW8nXVsncHJvbW90aW9uQ29kZSddO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBkYXRhID0ge1xyXG4gICAgICAgICAgICBhY3Rpb246ICdob2xkX3NlYXRzJyxcclxuICAgICAgICAgICAgcHJvZHVjdGlkOiBzZWxmLmdldFBhcmFtZXRlckJ5TmFtZSgncHJvZHVjdF9pZCcpLFxyXG4gICAgICAgICAgICBzZWF0bGFiZWxzOiBsYWJlbHMsXHJcbiAgICAgICAgICAgIGV2ZW50a2V5OiBzZWxmLnNlbGVjdGVkRXZlbnRJZCxcclxuICAgICAgICAgICAgZXZlbnREYXRhOiBzZWxmLnNlbGVjdGVkRXZlbnREYXRhLFxyXG4gICAgICAgICAgICB1c2VkQmxvY2tzOiB1c2VkQmxvY2tzVG9TZW5kLFxyXG4gICAgICAgICAgICBxdHk6IGxhYmVscy5sZW5ndGgsXHJcbiAgICAgICAgICAgIGlzcDogc2VsZi5pc1BhY2soKSxcclxuICAgICAgICAgICAgc2VjdXJpdHk6IGpRdWVyeSgnI3J3Yl9ob2xkX3NlYXRzX25vbmNlJykudmFsKClcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICBzZWxmLkpCdXlCdXR0b24oKS5Mb2FkaW5nT3ZlcmxheShcInNob3dcIik7XHJcbiAgICAgICAgalF1ZXJ5LmFqYXgoe1xyXG4gICAgICAgICAgICB0eXBlOiAnUE9TVCcsXHJcbiAgICAgICAgICAgIGRhdGFUeXBlOiAnanNvbicsXHJcbiAgICAgICAgICAgIHVybDogYmJMb2NhbC5hamF4X3VybCxcclxuICAgICAgICAgICAgZGF0YTogZGF0YSxcclxuICAgICAgICAgICAgc3VjY2VzczogalF1ZXJ5LnByb3h5KHNlbGYuYnV5Tm93Q29tcGxldGVkLCBzZWxmKVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGJ1eU5vd0NvbXBsZXRlZChyZXNwb25zZSkge1xyXG5cclxuICAgICAgICBpZiAocmVzcG9uc2Uuc3VjY2VzcyA9PT0gZmFsc2UpIHtcclxuICAgICAgICAgICAgaWYgKHR5cGVvZiB0aGlzLnNlYXRDaGFydC5yZXJlbmRlciAhPT0gJ3VuZGVmaW5lZCcpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2VhdENoYXJ0LnJlcmVuZGVyKCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vdGhpcy5zZWF0Q2hhcnQgPSBmYWxzZTtcclxuICAgICAgICAgICAgLy90aGlzLnNlbGVjdGVkT2JqZWN0Q2hhcnQgPSBudWxsO1xyXG4gICAgICAgICAgICAvL3RoaXMuc2VsZWN0ZWRFdmVudCA9IG51bGw7XHJcbiAgICAgICAgICAgIC8vdGhpcy5jbGVhckNhcnQoKTtcclxuICAgICAgICAgICAgY29uc3Qgc2VsZiA9IHRoaXM7XHJcblxyXG4gICAgICAgICAgICBTd2FsLmZpcmUoe1xyXG4gICAgICAgICAgICAgICAgdGl0bGU6ICdJbmZvcm1hdGlvbicsXHJcbiAgICAgICAgICAgICAgICB0ZXh0OiByZXNwb25zZS5tZXNzYWdlLF
8443xyXG4gICAgICAgICAgICAgICAgaWNvbjogJ2luZm8nLFxyXG4gICAgICAgICAgICAgICAgY29uZmlybUJ1dHRvblRleHQ6ICdPSycsXHJcbiAgICAgICAgICAgICAgICBjbG9zZU9uQ29uZmlybTogdHJ1ZSxcclxuICAgICAgICAgICAgICAgIGFsbG93T3V0c2lkZUNsaWNrOiBmYWxzZSxcclxuICAgICAgICAgICAgICAgIGFsbG93RXNjYXBlS2V5OiBmYWxzZVxyXG4gICAgICAgICAgICB9KS50aGVuKChyZXN1bHQpID0+IHtcclxuXHJcbiAgICAgICAgICAgICAgICAvKiBSZWFkIG1vcmUgYWJvdXQgaXNDb25maXJtZWQsIGlzRGVuaWVkIGJlbG93ICovXHJcbiAgICAgICAgICAgICAgICBpZiAocmVzdWx0LmlzQ29uZmlybWVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5KQnV5QnV0dG9uKCkuTG9hZGluZ092ZXJsYXkoXCJoaWRlXCIsIHRydWUpO1xyXG4gICAgICAgICAgICAgICAgICAgIHNlbGYuY2xlYXJDYXJ0KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5zZWxlY3RCYXNlZE9uRHJvcERvd24oW10pO1xyXG4gICAgICAgICAgICAgICAgICAgIC8vc2VsZi5KQnV5QnV0dG9uKCkuaGlkZSgpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAvL3JlZnJlc2ggbWFwXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlLnJlbG9hZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5KSXNBdHRyYWN0aW9uKCkgfHwgc2VsZi5KWm9uZUltYWdlKCkubGVuZ3RoID4gMCkge1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucmVuZGVyU2VhdENoYXJ0KHNlbGYuc2VsZWN0ZWRFdmVudElkKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJlc3VsdC5pc0RlbmllZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vU3dhbC5maXJlKCdDaGFuZ2VzIGFyZSBub3Qgc2F2ZWQnLCAnJywgJ2luZm8nKVxyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5ocmVmID0gcmVzcG9uc2UudXJsO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBjb21wYXJlUHJpY2VCbG9ja3MoYTEsIGIxKSB7XHJcbiAgICAgICAgY29uc3QgYSA9IGExWzFdO1xyXG4gICAgICAgIGNvbnN0IGIgPSBiMVsxXTtcclxuICAgICAgICBpZiAoYVsnZnVsbFJldGFpbFByaWNlJ10gPCBiWydmdWxsUmV0YWlsUHJpY2UnXSkge1xyXG4gICAgICAgICAgICByZXR1cm4gMTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGFbJ2Z1bGxSZXRhaWxQcmljZSddID4gYlsnZnVsbFJldGFpbFByaWNlJ10pIHtcclxuICAgICAgICAgICAgcmV0dXJuIC0xO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gMDtcclxuICAgIH1cclxuXHJcbiAgICBjb21wYXJlUHJpY2VCbG9ja3NQYWNrKGExLCBiMSkge1xyXG4gICAgICAgIGNvbnN0IGEgPSBhMVsxXTtcclxuICAgICAgICBjb25zdCBiID0gYjFbMV07XHJcbiAgICAgICAgaWYgKGFbJ2Z1bGxSZXRhaWxQcmljZSddID4gYlsnZnVsbFJldGFpbFByaWNlJ10pIHtcclxuICAgICAgICAgICAgcmV0dXJuIDE7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChhWydmdWxsUmV0YWlsUHJpY2UnXSA8IGJbJ2Z1bGxSZXRhaWxQcmljZSddKSB7XHJcbiAgICAgICAgICAgIHJldHVybiAtMTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIDA7XHJcbiAgICB9XHJcblxyXG4gICAgb2JqZWN0VG9BcnJheShvYmopIHtcclxuICAgICAgICBsZXQgX2FyciA9IFtdO1xyXG5cclxuICAgICAgICBmb3IgKGxldCBrZXkgaW4gb2JqKSB7XHJcbiAgICAgICAgICAgIF9hcnIucHVzaChba2V5LCBvYmpba2V5XV0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gX2FycjtcclxuICAgIH1cclxuXHJcbiAgICBnZXRQcmljZUJsb2Nrc0FuZFVzZWRCbG9ja3NBdHRyYWN0aW9uKCkge1xyXG4gICAgICAgIGxldCBwcmljZUJsb2NrcyA9IFtdO1xyXG4gICAgICAgIGxldCBzZWxmID0gdGhpcztcclxuICAgICAgICBsZXQgdXNlZEJsb2NrcyA9IHt9O1xyXG5cclxuICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBzZWxmLmV2ZW50UHJvbW90aW9ucykge1xyXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGtleVAgaW4gc2VsZi5ldmVudFByb21vdGlvbnNba2V5XVsncHJpY2VCbG9ja3MnXSkge1xyXG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCB0bXBrZXkgaW4gc2VsZi5ldmVudFByb21vdGlvbnMpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5zZWxlY3RlZFByb21vQ29kZSAhPT0gZmFsc2UpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYuZXZlbnRQcm9tb3Rpb25zW3RtcGtleV1bJ3Byb21vdGlvbkNvZGUnXSAhPT0gc2VsZi5zZWxlY3RlZFByb21vQ29kZVsncHJvbW90aW9uQ29kZSddKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBsZXQgbXlrZXlQID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCB0bXBrZXlQIGluIHNlbGYuZXZlbnRQcm9tb3Rpb25zW3RtcGtleV1bJ3ByaWNlQmxvY2tzJ10pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYuZXZlbnRQcm9tb3Rpb25zW2tleV1bJ3ByaWNlQmxvY2tzJ11ba2V5UF1bJ3ByaWNlTGV2ZWxJZCddID09PSBzZWxmLmV2ZW50UHJvbW90aW9uc1t0bXBrZXldWydwcmljZUJsb2NrcyddW3RtcGtleVBdWydwcmljZUxldmVsSWQnXSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbXlrZXlQID0gdG1wa2V5UDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChteWtleVAgIT09IGZhbHNlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc2VsZi5ldmVudFByb21vdGlvbnNbdG1wa2V5XVsncHJpY2VCbG9ja3MnXVtteWtleVBdWydpc19leGNsdWRlZCddKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFyc2VGbG9hdChzZWxmLmV2ZW50UHJvbW90aW9uc1trZXldWydwcmljZUJsb2NrcyddW2tleVBdWydmdWxsUmV0YWlsUHJpY2UnXSkgPCBwYXJzZU
8443Zsb2F0KHNlbGYuZXZlbnRQcm9tb3Rpb25zW3RtcGtleV1bJ3ByaWNlQmxvY2tzJ11bbXlrZXlQXVsnZnVsbFJldGFpbFByaWNlJ10pKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBzZWxmLmV2ZW50UHJvbW90aW9uc1trZXldWydwcmljZUJsb2NrcyddW2tleVBdLmJpZ1ByaWNlID09PSAndW5kZWZpbmVkJykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmV2ZW50UHJvbW90aW9uc1trZXldWydwcmljZUJsb2NrcyddW2tleVBdLmJpZ1ByaWNlID0gc2VsZi5ldmVudFByb21vdGlvbnNbdG1wa2V5XVsncHJpY2VCbG9ja3MnXVtteWtleVBdWydmdWxsUmV0YWlsUHJpY2UnXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFyc2VGbG9hdChzZWxmLmV2ZW50UHJvbW90aW9uc1trZXldWydwcmljZUJsb2NrcyddW2tleVBdLmJpZ1ByaWNlKSA8IHBhcnNlRmxvYXQoc2VsZi5ldmVudFByb21vdGlvbnNbdG1wa2V5XVsncHJpY2VCbG9ja3MnXVtteWtleVBdWydmdWxsUmV0YWlsUHJpY2UnXSkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZXZlbnRQcm9tb3Rpb25zW2tleV1bJ3ByaWNlQmxvY2tzJ11ba2V5UF0uYmlnUHJpY2UgPSBzZWxmLmV2ZW50UHJvbW90aW9uc1t0bXBrZXldWydwcmljZUJsb2NrcyddW215a2V5UF1bJ2Z1bGxSZXRhaWxQcmljZSddO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLmV2ZW50UHJvbW90aW9uc1t0bXBrZXldWydwcmljZUJsb2NrcyddW215a2V5UF1bJ2lzX2Nsb3NlZGxvb3AnXSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhcnNlRmxvYXQoc2VsZi5ldmVudFByb21vdGlvbnNba2V5XVsncHJpY2VCbG9ja3MnXVtrZXlQXVsnZnVsbFJldGFpbFByaWNlJ10pID4gcGFyc2VGbG9hdChzZWxmLmV2ZW50UHJvbW90aW9uc1t0bXBrZXldWydwcmljZUJsb2NrcyddW215a2V5UF1bJ2Z1bGxSZXRhaWxQcmljZSddKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2Ygc2VsZi5ldmVudFByb21vdGlvbnNba2V5XVsncHJpY2VCbG9ja3MnXVtrZXlQXS5zbWFsbFByaWNlID09PSAndW5kZWZpbmVkJykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmV2ZW50UHJvbW90aW9uc1trZXldWydwcmljZUJsb2NrcyddW2tleVBdLnNtYWxsUHJpY2UgPSBzZWxmLmV2ZW50UHJvbW90aW9uc1t0bXBrZXldWydwcmljZUJsb2NrcyddW215a2V5UF1bJ2Z1bGxSZXRhaWxQcmljZSddO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmV2ZW50UHJvbW90aW9uc1trZXldWydwcmljZUJsb2NrcyddW2tleVBdLm11c3Rsb2dpbiA9IHNlbGYuZXZlbnRQcm9tb3Rpb25zW3RtcGtleV1bJ3ByaWNlQmxvY2tzJ11bbXlrZXlQXVsnaXNfY2xvc2VkbG9vcCddO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXJzZUZsb2F0KHNlbGYuZXZlbnRQcm9tb3Rpb25zW2tleV1bJ3ByaWNlQmxvY2tzJ11ba2V5UF0uc21hbGxQcmljZSkgPiBwYXJzZUZsb2F0KHNlbGYuZXZlbnRQcm9tb3Rpb25zW3RtcGtleV1bJ3ByaWNlQmxvY2tzJ11bbXlrZXlQXVsnZnVsbFJldGFpbFByaWNlJ10pKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmV2ZW50UHJvbW90aW9uc1trZXldWydwcmljZUJsb2NrcyddW2tleVBdLnNtYWxsUHJpY2UgPSBzZWxmLmV2ZW50UHJvbW90aW9uc1t0bXBrZXldWydwcmljZUJsb2NrcyddW215a2V5UF1bJ2Z1bGxSZXRhaWxQcmljZSddO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5ldmVudFByb21vdGlvbnNba2V5XVsncHJpY2VCbG9ja3MnXVtrZXlQXS5tdXN0bG9naW4gPSBzZWxmLmV2ZW50UHJvbW90aW9uc1t0bXBrZXldWydwcmljZUJsb2NrcyddW215a2V5UF1bJ2lzX2Nsb3NlZGxvb3AnXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmICghc2VsZi5ldmVudFByb21vdGlvbnNba2V5XVsncHJpY2VCbG9ja3MnXVtrZXlQXVsnaXNfZXhjbHVkZWQnXSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgdXNlZEJsb2Nrc1tzZWxmLmV2ZW50UHJvbW90aW9uc1trZXldWydwcmljZUJsb2NrcyddW2tleVBdWydwcmljZUxldmVsSWQnXV0gPT09IFwidW5kZWZpbmVkXCIpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcHJpY2VCbG9ja3MucHVzaChzZWxmLmV2ZW50UHJvbW90aW9uc1trZXldWydwcmljZUJsb2NrcyddW2tleVBdKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdXNlZEJsb2Nrc1tzZWxmLmV2ZW50UHJvbW90aW9uc1trZXldWydwcmljZUJsb2NrcyddW2tleVBdWydwcmljZUxldmVsSWQnXSArICcnXSA9IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdwcm9tbyc6IFtzZWxmLmV2ZW50UHJvbW90aW9uc1trZXldXSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdwb3NpdGlvbic6IHByaWNlQmxvY2tzLmxlbmd0aCAtIDFcclxuICAgICAgICAgICAgICAgICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy9sZXQgcHJvbW8gPSB1c2VkQmxvY2tzW3NlbGYuZXZlbnRQcm9tb3Rpb25zW2tleV1bJ3ByaWNlQmxvY2tzJ11ba2V5UF1bJ3ByaWNlTGV2ZWxJZCddXS5wcm9tbztcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy9sZXQgcG9zaXRpb24gPSB1c2VkQmxvY2tzW3NlbGYuZXZlbnRQcm9tb3Rpb25zW2tleV1bJ3ByaWNlQmxvY2tzJ11ba2V5UF1bJ3ByaWNlTGV2ZWxJZCddXS5wb3NpdGlvbjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy9pZiAocGFyc2VGbG9hdChzZWxmLmV2ZW50UHJvbW90aW9uc1trZXldWydwcmljZUJsb2NrcyddW2tleVBdWydmdWxsUmV0YWlsUHJpY2UnXSkgPCBwYXJzZU
8443Zsb2F0KHByaWNlQmxvY2tzW3Bvc2l0aW9uXVsnZnVsbFJldGFpbFByaWNlJ10pKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vcHJpY2VCbG9ja3NbcG9zaXRpb25dID0gc2VsZi5ldmVudFByb21vdGlvbnNba2V5XVsncHJpY2VCbG9ja3MnXVtrZXlQXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcHJpY2VCbG9ja3MucHVzaChzZWxmLmV2ZW50UHJvbW90aW9uc1trZXldWydwcmljZUJsb2NrcyddW2tleVBdKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdXNlZEJsb2Nrc1tzZWxmLmV2ZW50UHJvbW90aW9uc1trZXldWydwcmljZUJsb2NrcyddW2tleVBdWydwcmljZUxldmVsSWQnXSArICcnXS5wcm9tby5wdXNoKHNlbGYuZXZlbnRQcm9tb3Rpb25zW2tleV0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvL31cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHsncHJpY2VCbG9jayc6IHByaWNlQmxvY2tzLCAndXNlQmxvY2snOiB1c2VkQmxvY2tzfTtcclxuICAgIH1cclxuXHJcbiAgICBnZXRQcmljZUJsb2Nrc0FuZFVzZWRCbG9ja3Nab25lcygpIHtcclxuICAgICAgICBsZXQgcHJpY2VCbG9ja3MgPSBbXTtcclxuICAgICAgICBsZXQgc2VsZiA9IHRoaXM7XHJcbiAgICAgICAgbGV0IHVzZWRCbG9ja3MgPSB7fTtcclxuXHJcbiAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gc2VsZi5ldmVudFByb21vdGlvbnMpIHtcclxuICAgICAgICAgICAgaWYgKHNlbGYuc2VsZWN0ZWRQcm9tb0NvZGUgIT09IGZhbHNlKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoc2VsZi5ldmVudFByb21vdGlvbnNba2V5XVsncHJvbW90aW9uQ29kZSddICE9PSBzZWxmLnNlbGVjdGVkUHJvbW9Db2RlWydwcm9tb3Rpb25Db2RlJ10pIHtcclxuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGtleVAgaW4gc2VsZi5ldmVudFByb21vdGlvbnNba2V5XVsncHJpY2VCbG9ja3MnXSkge1xyXG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCB0bXBrZXkgaW4gc2VsZi5ldmVudFByb21vdGlvbnMpIHtcclxuICAgICAgICAgICAgICAgICAgICAvKmlmIChzZWxmLnNlbGVjdGVkUHJvbW9Db2RlICE9PSBmYWxzZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5ldmVudFByb21vdGlvbnNbdG1wa2V5XVsncHJvbW90aW9uQ29kZSddICE9PSBzZWxmLnNlbGVjdGVkUHJvbW9Db2RlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH0qL1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBteWtleVAgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHRtcGtleVAgaW4gc2VsZi5ldmVudFByb21vdGlvbnNbdG1wa2V5XVsncHJpY2VCbG9ja3MnXSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5ldmVudFByb21vdGlvbnNba2V5XVsncHJpY2VCbG9ja3MnXVtrZXlQXVsncHJpY2VMZXZlbElkJ10gPT09IHNlbGYuZXZlbnRQcm9tb3Rpb25zW3RtcGtleV1bJ3ByaWNlQmxvY2tzJ11bdG1wa2V5UF1bJ3ByaWNlTGV2ZWxJZCddKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBteWtleVAgPSB0bXBrZXlQO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKG15a2V5UCAhPT0gZmFsc2UpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFzZWxmLmV2ZW50UHJvbW90aW9uc1t0bXBrZXldWydwcmljZUJsb2NrcyddW215a2V5UF1bJ2lzX2V4Y2x1ZGVkJ10pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXJzZUZsb2F0KHNlbGYuZXZlbnRQcm9tb3Rpb25zW2tleV1bJ3ByaWNlQmxvY2tzJ11ba2V5UF1bJ2Z1bGxSZXRhaWxQcmljZSddKSA8IHBhcnNlRmxvYXQoc2VsZi5ldmVudFByb21vdGlvbnNbdG1wa2V5XVsncHJpY2VCbG9ja3MnXVtteWtleVBdWydmdWxsUmV0YWlsUHJpY2UnXSkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHNlbGYuZXZlbnRQcm9tb3Rpb25zW2tleV1bJ3ByaWNlQmxvY2tzJ11ba2V5UF0uYmlnUHJpY2UgPT09ICd1bmRlZmluZWQnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZXZlbnRQcm9tb3Rpb25zW2tleV1bJ3ByaWNlQmxvY2tzJ11ba2V5UF0uYmlnUHJpY2UgPSBzZWxmLmV2ZW50UHJvbW90aW9uc1t0bXBrZXldWydwcmljZUJsb2NrcyddW215a2V5UF1bJ2Z1bGxSZXRhaWxQcmljZSddO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXJzZUZsb2F0KHNlbGYuZXZlbnRQcm9tb3Rpb25zW2tleV1bJ3ByaWNlQmxvY2tzJ11ba2V5UF0uYmlnUHJpY2UpIDwgcGFyc2VGbG9hdChzZWxmLmV2ZW50UHJvbW90aW9uc1t0bXBrZXldWydwcmljZUJsb2NrcyddW215a2V5UF1bJ2Z1bGxSZXRhaWxQcmljZSddKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5ldmVudFByb21vdGlvbnNba2V5XVsncHJpY2VCbG9ja3MnXVtrZXlQXS5iaWdQcmljZSA9IHNlbGYuZXZlbnRQcm9tb3Rpb25zW3RtcGtleV1bJ3ByaWNlQmxvY2tzJ11bbXlrZXlQXVsnZnVsbFJldGFpbFByaWNlJ107XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYuZXZlbnRQcm9tb3Rpb25zW3RtcGtleV1bJ3ByaWNlQmxvY2tzJ11bbXlrZXlQXVsnaXNfY2xvc2VkbG9vcCddKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFyc2VGbG9hdChzZWxmLmV2ZW50UHJvbW90aW9uc1trZXldWydwcmljZUJsb2NrcyddW2tleVBdWydmdWxsUmV0YWlsUHJpY2UnXSkgPiBwYXJzZU
8443Zsb2F0KHNlbGYuZXZlbnRQcm9tb3Rpb25zW3RtcGtleV1bJ3ByaWNlQmxvY2tzJ11bbXlrZXlQXVsnZnVsbFJldGFpbFByaWNlJ10pKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBzZWxmLmV2ZW50UHJvbW90aW9uc1trZXldWydwcmljZUJsb2NrcyddW2tleVBdLnNtYWxsUHJpY2UgPT09ICd1bmRlZmluZWQnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZXZlbnRQcm9tb3Rpb25zW2tleV1bJ3ByaWNlQmxvY2tzJ11ba2V5UF0uc21hbGxQcmljZSA9IHNlbGYuZXZlbnRQcm9tb3Rpb25zW3RtcGtleV1bJ3ByaWNlQmxvY2tzJ11bbXlrZXlQXVsnZnVsbFJldGFpbFByaWNlJ107XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZXZlbnRQcm9tb3Rpb25zW2tleV1bJ3ByaWNlQmxvY2tzJ11ba2V5UF0ubXVzdGxvZ2luID0gc2VsZi5ldmVudFByb21vdGlvbnNbdG1wa2V5XVsncHJpY2VCbG9ja3MnXVtteWtleVBdWydpc19jbG9zZWRsb29wJ107XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhcnNlRmxvYXQoc2VsZi5ldmVudFByb21vdGlvbnNba2V5XVsncHJpY2VCbG9ja3MnXVtrZXlQXS5zbWFsbFByaWNlKSA+IHBhcnNlRmxvYXQoc2VsZi5ldmVudFByb21vdGlvbnNbdG1wa2V5XVsncHJpY2VCbG9ja3MnXVtteWtleVBdWydmdWxsUmV0YWlsUHJpY2UnXSkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZXZlbnRQcm9tb3Rpb25zW2tleV1bJ3ByaWNlQmxvY2tzJ11ba2V5UF0uc21hbGxQcmljZSA9IHNlbGYuZXZlbnRQcm9tb3Rpb25zW3RtcGtleV1bJ3ByaWNlQmxvY2tzJ11bbXlrZXlQXVsnZnVsbFJldGFpbFByaWNlJ107XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmV2ZW50UHJvbW90aW9uc1trZXldWydwcmljZUJsb2NrcyddW2tleVBdLm11c3Rsb2dpbiA9IHNlbGYuZXZlbnRQcm9tb3Rpb25zW3RtcGtleV1bJ3ByaWNlQmxvY2tzJ11bbXlrZXlQXVsnaXNfY2xvc2VkbG9vcCddO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYgKCFzZWxmLmV2ZW50UHJvbW90aW9uc1trZXldWydwcmljZUJsb2NrcyddW2tleVBdWydpc19leGNsdWRlZCddKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB1c2VkQmxvY2tzW3NlbGYuZXZlbnRQcm9tb3Rpb25zW2tleV1bJ3ByaWNlQmxvY2tzJ11ba2V5UF1bJ3ByaWNlTGV2ZWxJZCddXSA9PT0gXCJ1bmRlZmluZWRcIikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBwcmljZUJsb2Nrcy5wdXNoKHNlbGYuZXZlbnRQcm9tb3Rpb25zW2tleV1bJ3ByaWNlQmxvY2tzJ11ba2V5UF0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB1c2VkQmxvY2tzW3NlbGYuZXZlbnRQcm9tb3Rpb25zW2tleV1bJ3ByaWNlQmxvY2tzJ11ba2V5UF1bJ3ByaWNlTGV2ZWxJZCddICsgJyddID0ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3Byb21vJzogc2VsZi5ldmVudFByb21vdGlvbnNba2V5XSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdwb3NpdGlvbic6IHByaWNlQmxvY2tzLmxlbmd0aCAtIDFcclxuICAgICAgICAgICAgICAgICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHByb21vID0gdXNlZEJsb2Nrc1tzZWxmLmV2ZW50UHJvbW90aW9uc1trZXldWydwcmljZUJsb2NrcyddW2tleVBdWydwcmljZUxldmVsSWQnXV0ucHJvbW87XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBwb3NpdGlvbiA9IHVzZWRCbG9ja3Nbc2VsZi5ldmVudFByb21vdGlvbnNba2V5XVsncHJpY2VCbG9ja3MnXVtrZXlQXVsncHJpY2VMZXZlbElkJ11dLnBvc2l0aW9uO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFyc2VGbG9hdChzZWxmLmV2ZW50UHJvbW90aW9uc1trZXldWydwcmljZUJsb2NrcyddW2tleVBdWydmdWxsUmV0YWlsUHJpY2UnXSkgPCBwYXJzZUZsb2F0KHByaWNlQmxvY2tzW3Bvc2l0aW9uXVsnZnVsbFJldGFpbFByaWNlJ10pKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmljZUJsb2Nrc1twb3NpdGlvbl0gPSBzZWxmLmV2ZW50UHJvbW90aW9uc1trZXldWydwcmljZUJsb2NrcyddW2tleVBdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlZEJsb2Nrc1tzZWxmLmV2ZW50UHJvbW90aW9uc1trZXldWydwcmljZUJsb2NrcyddW2tleVBdWydwcmljZUxldmVsSWQnXSArICcnXS5wcm9tbyA9IHNlbGYuZXZlbnRQcm9tb3Rpb25zW2tleV07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHsncHJpY2VCbG9jayc6IHByaWNlQmxvY2tzLCAndXNlQmxvY2snOiB1c2VkQmxvY2tzfTtcclxuICAgIH1cclxuXHJcbiAgICBnZXRQcmljZUJsb2Nrc0FuZFVzZWRCbG9ja3MoKSB7XHJcbiAgICAgICAgbGV0IHByaWNlQmxvY2tzID0gW107XHJcbiAgICAgICAgbGV0IHNlbGYgPSB0aGlzO1xyXG4gICAgICAgIGxldCB1c2VkQmxvY2tzID0ge307XHJcblxyXG4gICAgICAgIGZvciAoY29uc3Qga2V5IGluIHNlbGYuZXZlbnRQcm9tb3Rpb25zKSB7XHJcbiAgICAgICAgICAgIGlmIChzZWxmLnNlbGVjdGVkUHJvbW9Db2RlICE9PSBmYWxzZSkge1xyXG4gICAgICAgICAgICAgICAgaWYgKHNlbGYuZXZlbnRQcm9tb3Rpb25zW2tleV1bJ3Byb21vdGlvbkNvZGUnXSAhPT0gc2VsZi5zZWxlY3RlZFByb21vQ29kZVsncHJvbW90aW9uQ29kZSddKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7X
8443HJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZm9yIChjb25zdCBrZXlQIGluIHNlbGYuZXZlbnRQcm9tb3Rpb25zW2tleV1bJ3ByaWNlQmxvY2tzJ10pIHtcclxuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgdG1wa2V5IGluIHNlbGYuZXZlbnRQcm9tb3Rpb25zKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYuc2VsZWN0ZWRQcm9tb0NvZGUgIT09IGZhbHNlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLmV2ZW50UHJvbW90aW9uc1t0bXBrZXldWydwcm9tb3Rpb25Db2RlJ10gIT09IHNlbGYuc2VsZWN0ZWRQcm9tb0NvZGVbJ3Byb21vdGlvbkNvZGUnXSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IG15a2V5UCA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgdG1wa2V5UCBpbiBzZWxmLmV2ZW50UHJvbW90aW9uc1t0bXBrZXldWydwcmljZUJsb2NrcyddKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLmV2ZW50UHJvbW90aW9uc1trZXldWydwcmljZUJsb2NrcyddW2tleVBdWydwcmljZUxldmVsSWQnXSA9PT0gc2VsZi5ldmVudFByb21vdGlvbnNbdG1wa2V5XVsncHJpY2VCbG9ja3MnXVt0bXBrZXlQXVsncHJpY2VMZXZlbElkJ10pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG15a2V5UCA9IHRtcGtleVA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAobXlrZXlQICE9PSBmYWxzZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXNlbGYuZXZlbnRQcm9tb3Rpb25zW3RtcGtleV1bJ3ByaWNlQmxvY2tzJ11bbXlrZXlQXVsnaXNfZXhjbHVkZWQnXSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhcnNlRmxvYXQoc2VsZi5ldmVudFByb21vdGlvbnNba2V5XVsncHJpY2VCbG9ja3MnXVtrZXlQXVsnZnVsbFJldGFpbFByaWNlJ10pIDwgcGFyc2VGbG9hdChzZWxmLmV2ZW50UHJvbW90aW9uc1t0bXBrZXldWydwcmljZUJsb2NrcyddW215a2V5UF1bJ2Z1bGxSZXRhaWxQcmljZSddKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2Ygc2VsZi5ldmVudFByb21vdGlvbnNba2V5XVsncHJpY2VCbG9ja3MnXVtrZXlQXS5iaWdQcmljZSA9PT0gJ3VuZGVmaW5lZCcpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5ldmVudFByb21vdGlvbnNba2V5XVsncHJpY2VCbG9ja3MnXVtrZXlQXS5iaWdQcmljZSA9IHNlbGYuZXZlbnRQcm9tb3Rpb25zW3RtcGtleV1bJ3ByaWNlQmxvY2tzJ11bbXlrZXlQXVsnZnVsbFJldGFpbFByaWNlJ107XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhcnNlRmxvYXQoc2VsZi5ldmVudFByb21vdGlvbnNba2V5XVsncHJpY2VCbG9ja3MnXVtrZXlQXS5iaWdQcmljZSkgPCBwYXJzZUZsb2F0KHNlbGYuZXZlbnRQcm9tb3Rpb25zW3RtcGtleV1bJ3ByaWNlQmxvY2tzJ11bbXlrZXlQXVsnZnVsbFJldGFpbFByaWNlJ10pKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmV2ZW50UHJvbW90aW9uc1trZXldWydwcmljZUJsb2NrcyddW2tleVBdLmJpZ1ByaWNlID0gc2VsZi5ldmVudFByb21vdGlvbnNbdG1wa2V5XVsncHJpY2VCbG9ja3MnXVtteWtleVBdWydmdWxsUmV0YWlsUHJpY2UnXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5ldmVudFByb21vdGlvbnNbdG1wa2V5XVsncHJpY2VCbG9ja3MnXVtteWtleVBdWydpc19jbG9zZWRsb29wJ10pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXJzZUZsb2F0KHNlbGYuZXZlbnRQcm9tb3Rpb25zW2tleV1bJ3ByaWNlQmxvY2tzJ11ba2V5UF1bJ2Z1bGxSZXRhaWxQcmljZSddKSA+IHBhcnNlRmxvYXQoc2VsZi5ldmVudFByb21vdGlvbnNbdG1wa2V5XVsncHJpY2VCbG9ja3MnXVtteWtleVBdWydmdWxsUmV0YWlsUHJpY2UnXSkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHNlbGYuZXZlbnRQcm9tb3Rpb25zW2tleV1bJ3ByaWNlQmxvY2tzJ11ba2V5UF0uc21hbGxQcmljZSA9PT0gJ3VuZGVmaW5lZCcpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5ldmVudFByb21vdGlvbnNba2V5XVsncHJpY2VCbG9ja3MnXVtrZXlQXS5zbWFsbFByaWNlID0gc2VsZi5ldmVudFByb21vdGlvbnNbdG1wa2V5XVsncHJpY2VCbG9ja3MnXVtteWtleVBdWydmdWxsUmV0YWlsUHJpY2UnXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5ldmVudFByb21vdGlvbnNba2V5XVsncHJpY2VCbG9ja3MnXVtrZXlQXS5tdXN0bG9naW4gPSBzZWxmLmV2ZW50UHJvbW90aW9uc1t0bXBrZXldWydwcmljZUJsb2NrcyddW215a2V5UF1bJ2lzX2Nsb3NlZGxvb3AnXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFyc2VGbG9hdChzZWxmLmV2ZW50UHJvbW90aW9uc1trZXldWydwcmljZUJsb2NrcyddW2tleVBdLnNtYWxsUHJpY2UpID4gcGFyc2VGbG9hdChzZWxmLmV2ZW50UHJvbW90aW9uc1t0bXBrZXldWydwcmljZUJsb2NrcyddW215a2V5UF1bJ2Z1bGxSZXRhaWxQcmljZSddKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5ldmVudFByb21vdGlvbnNba2V5XVsncHJpY2VCbG9ja3MnXVtrZXlQXS5zbWFsbFByaWNlID0gc2VsZi5ldmVudFByb21vdGlvbnNbdG1wa2V5XVsncHJpY2VCbG9ja3MnXVtteWtleVBdWydmdWxsUmV0YWlsUHJpY2UnXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI
8443HNlbGYuZXZlbnRQcm9tb3Rpb25zW2tleV1bJ3ByaWNlQmxvY2tzJ11ba2V5UF0ubXVzdGxvZ2luID0gc2VsZi5ldmVudFByb21vdGlvbnNbdG1wa2V5XVsncHJpY2VCbG9ja3MnXVtteWtleVBdWydpc19jbG9zZWRsb29wJ107XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBpZiAoIXNlbGYuZXZlbnRQcm9tb3Rpb25zW2tleV1bJ3ByaWNlQmxvY2tzJ11ba2V5UF1bJ2lzX2V4Y2x1ZGVkJ10pIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHVzZWRCbG9ja3Nbc2VsZi5ldmVudFByb21vdGlvbnNba2V5XVsncHJpY2VCbG9ja3MnXVtrZXlQXVsncHJpY2VMZXZlbElkJ11dID09PSBcInVuZGVmaW5lZFwiKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBwcmljZUJsb2Nrcy5wdXNoKHNlbGYuZXZlbnRQcm9tb3Rpb25zW2tleV1bJ3ByaWNlQmxvY2tzJ11ba2V5UF0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB1c2VkQmxvY2tzW3NlbGYuZXZlbnRQcm9tb3Rpb25zW2tleV1bJ3ByaWNlQmxvY2tzJ11ba2V5UF1bJ3ByaWNlTGV2ZWxJZCddICsgJyddID0ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3Byb21vJzogc2VsZi5ldmVudFByb21vdGlvbnNba2V5XSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdwb3NpdGlvbic6IHByaWNlQmxvY2tzLmxlbmd0aCAtIDFcclxuICAgICAgICAgICAgICAgICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHByb21vID0gdXNlZEJsb2Nrc1tzZWxmLmV2ZW50UHJvbW90aW9uc1trZXldWydwcmljZUJsb2NrcyddW2tleVBdWydwcmljZUxldmVsSWQnXV0ucHJvbW87XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBwb3NpdGlvbiA9IHVzZWRCbG9ja3Nbc2VsZi5ldmVudFByb21vdGlvbnNba2V5XVsncHJpY2VCbG9ja3MnXVtrZXlQXVsncHJpY2VMZXZlbElkJ11dLnBvc2l0aW9uO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhcnNlRmxvYXQoc2VsZi5ldmVudFByb21vdGlvbnNba2V5XVsncHJpY2VCbG9ja3MnXVtrZXlQXVsnZnVsbFJldGFpbFByaWNlJ10pIDwgcGFyc2VGbG9hdChwcmljZUJsb2Nrc1twb3NpdGlvbl1bJ2Z1bGxSZXRhaWxQcmljZSddKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpY2VCbG9ja3NbcG9zaXRpb25dID0gc2VsZi5ldmVudFByb21vdGlvbnNba2V5XVsncHJpY2VCbG9ja3MnXVtrZXlQXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZWRCbG9ja3Nbc2VsZi5ldmVudFByb21vdGlvbnNba2V5XVsncHJpY2VCbG9ja3MnXVtrZXlQXVsncHJpY2VMZXZlbElkJ10gKyAnJ10ucHJvbW8gPSBzZWxmLmV2ZW50UHJvbW90aW9uc1trZXldO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB7J3ByaWNlQmxvY2snOiBwcmljZUJsb2NrcywgJ3VzZUJsb2NrJzogdXNlZEJsb2Nrc307XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0UHJpY2VMZXZlbElkcygpIHtcclxuXHJcbiAgICAgICAgbGV0IHByaWNlTGV2ZWxJZHMgPSBbXTtcclxuICAgICAgICBsZXQgc2VsZiA9IHRoaXM7XHJcbiAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gc2VsZi5ldmVudFByb21vdGlvbnMpIHtcclxuICAgICAgICAgICAgZm9yIChjb25zdCBrZXlQIGluIHNlbGYuZXZlbnRQcm9tb3Rpb25zW2tleV1bJ3ByaWNlTGV2ZWxJZHMnXSkge1xyXG4gICAgICAgICAgICAgICAgcHJpY2VMZXZlbElkcy5wdXNoKHNlbGYuZXZlbnRQcm9tb3Rpb25zW2tleV1bJ3ByaWNlTGV2ZWxJZHMnXVtrZXlQXSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHByaWNlTGV2ZWxJZHM7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0VGFnSWRzKCkge1xyXG4gICAgICAgIGxldCB0YWdJZHMgPSBbXTtcclxuICAgICAgICBsZXQgc2VsZiA9IHRoaXM7XHJcbiAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gc2VsZi5ldmVudFByb21vdGlvbnMpIHtcclxuICAgICAgICAgICAgZm9yIChjb25zdCBrZXlQIGluIHNlbGYuZXZlbnRQcm9tb3Rpb25zW2tleV1bJ3RhZ0lkcyddKSB7XHJcbiAgICAgICAgICAgICAgICB0YWdJZHMucHVzaChzZWxmLmV2ZW50UHJvbW90aW9uc1trZXldWyd0YWdJZHMnXVtrZXlQXSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRhZ0lkcztcclxuICAgIH1cclxuXHJcbiAgICBnZXRTdWJob2xkSWRzKCkge1xyXG4gICAgICAgIGxldCBzdWJob2xkc0lkcyA9IFtdO1xyXG4gICAgICAgIGxldCBzZWxmID0gdGhpcztcclxuICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBzZWxmLmV2ZW50UHJvbW90aW9ucykge1xyXG4gICAgICAgICAgICAvL2ZvciAoY29uc3Qga2V5UCBpbiBzZWxmLmV2ZW50UHJvbW90aW9uc1trZXldWydwcmljZUJsb2NrcyddKSB7XHJcbiAgICAgICAgICAgIHN1YmhvbGRzSWRzLnB1c2goc2VsZi5ldmVudFByb21vdGlvbnNba2V5XVsnaG9sZFN1YmNsYXNzSWQnXSk7XHJcbiAgICAgICAgICAgIC8vfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gc3ViaG9sZHNJZHM7XHJcbiAgICB9XHJcblxyXG4gICAgY3JlYXRlUHJpY2luZ01hcCgpIHtcclxuICAgICAgICBsZXQgc2VsZiA9IHRoaXM7XHJcbiAgICAgICAgbGV0IHByaWNlQmxvY2tzO1xyXG5cclxuICAgICAgICBsZXQgcHJpY2VCbG9ja3NBbmRVc2VkQmxvY2tzID0gc2VsZi5nZXRQcmljZUJsb2Nrc0FuZFVzZWRCbG9ja3MoKTtcclxuICAgICAgICBwcmljZUJsb2NrcyA9IHByaWNlQmxvY2tzQW5kVXNlZEJsb2Nrcy5wcmljZUJsb2NrO1xyXG5cclxuXHJcbiAgICAgICAgc2VsZi5KUHJpY2VNYXAoKS5odG1sKCcnKTtcclxuICAgICAgICBzZWxmLkpQcmljZU1hcCgpLnNob3coKTtcclxuICAgICAgICBzZWxmLkpQcmljZU1hcEV4cGxhbmF0aW9uKCkuc2hvdygpO1xyXG4gICAgICAgI
8443HNlbGYuSlByaWNlQmVzdFNlYXRzKCkucmVtb3ZlKCk7XHJcbiAgICAgICAgc2VsZi5zZWxlY3RlZEZpbHRlcmVkQ2F0ZWdvcmllcyA9IFtdO1xyXG4gICAgICAgIGxldCBwcmljZUFyciA9IFtdO1xyXG4gICAgICAgIGxldCBwcmljZUJsb2NrQXJyID0gc2VsZi5vYmplY3RUb0FycmF5KHByaWNlQmxvY2tzKTtcclxuICAgICAgICBwcmljZUJsb2NrQXJyLnNvcnQoc2VsZi5jb21wYXJlUHJpY2VCbG9ja3MpO1xyXG4gICAgICAgIGxldCBwbyA9IDA7XHJcbiAgICAgICAgalF1ZXJ5KCcjcHJpY2VfbG9naW5fc2lnbnVwJykuaGlkZSgpO1xyXG4gICAgICAgIGZvciAobGV0IGkxID0gcHJpY2VCbG9ja0Fyci5sZW5ndGggLSAxOyBpMSA+PSAwOyBpMS0tKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGtleSA9IHByaWNlQmxvY2tBcnJbaTFdWzBdO1xyXG4gICAgICAgICAgICAvL2NvbnN0IHZhbHVlID0gcHJpY2VCbG9ja0FycltpMV1bMV07XHJcbiAgICAgICAgICAgIGlmIChzZWxmLnVzZWRQcmljZUxldmVsSWRzICE9PSBmYWxzZSAmJiBzZWxmLmluQXJyYXkoc2VsZi51c2VkUHJpY2VMZXZlbElkcywgcHJpY2VCbG9ja3Nba2V5XVsncHJpY2VMZXZlbElkJ10pKSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgYmlncHJpY2VjdXQgPSAnJztcclxuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgcHJpY2VCbG9ja3Nba2V5XS5iaWdQcmljZSAhPT0gJ3VuZGVmaW5lZCcgJiYgcHJpY2VCbG9ja3Nba2V5XVsnZnVsbFJldGFpbFByaWNlJ10gIT09IHByaWNlQmxvY2tzW2tleV0uYmlnUHJpY2UpIHtcclxuICAgICAgICAgICAgICAgICAgICBiaWdwcmljZWN1dCA9ICc8c3BhbiBjbGFzcz1cImJpZ3ByaWNlY3V0XCI+JyArIHBhcnNlRmxvYXQocHJpY2VCbG9ja3Nba2V5XS5iaWdQcmljZSkudG9GaXhlZCgyKSArICc8L3NwYW4+J1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYgKHByaWNlQmxvY2tzW2tleV0ubXVzdGxvZ2luICYmIHR5cGVvZiBwcmljZUJsb2Nrc1trZXldLnNtYWxsUHJpY2UgIT09ICd1bmRlZmluZWQnICYmIHByaWNlQmxvY2tzW2tleV1bJ2Z1bGxSZXRhaWxQcmljZSddICE9PSBwcmljZUJsb2Nrc1trZXldLnNtYWxsUHJpY2UpIHtcclxuICAgICAgICAgICAgICAgICAgICBqUXVlcnkoJyNwcmljZV9sb2dpbl9zaWdudXAnKS5zaG93KCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBsZXQgcHJpY2VEaXYgPSAnPGRpdiBjbGFzcz1cInByaWNlX2Jsb2NrXCIgcHJpY2VfbGV2ZWxfaWQ9XCInICsgcHJpY2VCbG9ja3Nba2V5XVsncHJpY2VMZXZlbElkJ10gKyAnXCI+PGkgY2xhc3M9XCJzbHYgc2x2LXJhZGlvLXVuY2hlY2tlZFwiIHN0eWxlPVwiY29sb3I6JyArIHNlbGYuY29kZUFycmF5KClbcG9dICsgJ1wiPjwvaT48c3BhbiBjbGFzcz1cInByaWNlX2Jsb2NrX3ByaWNpbmdcIj4kJyArIHBhcnNlRmxvYXQocHJpY2VCbG9ja3Nba2V5XVsnZnVsbFJldGFpbFByaWNlJ10pLnRvRml4ZWQoMikgKyBiaWdwcmljZWN1dCArICc8L3NwYW4+PC9kaXY+JztcclxuICAgICAgICAgICAgICAgIGlmIChzZWxmLmlzUGFjaygpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHBvID09PSAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHByaWNlRGl2ID0gJzxkaXYgY2xhc3M9XCJwcmljZV9ibG9ja1wiIHByaWNlX2xldmVsX2lkPVwiJyArIHByaWNlQmxvY2tzW2tleV1bJ3ByaWNlTGV2ZWxJZCddICsgJ1wiPjxpIGNsYXNzPVwic2x2IHNsdi1yYWRpby11bmNoZWNrZWRcIiBzdHlsZT1cImNvbG9yOicgKyBzZWxmLmNvZGVBcnJheSgpW3BvXSArICdcIj48L2k+PHNwYW4gY2xhc3M9XCJwcmljZV9ibG9ja19wcmljaW5nXCI+SU5DTFVERUQ8L3NwYW4+PC9kaXY+JztcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5pbml0UGFja1ByaWNlID0gcGFyc2VGbG9hdChwcmljZUJsb2Nrc1trZXldWydmdWxsUmV0YWlsUHJpY2UnXSkudG9GaXhlZCgyKTtcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBwcmljZURpdiA9ICc8ZGl2IGNsYXNzPVwicHJpY2VfYmxvY2tcIiBwcmljZV9sZXZlbF9pZD1cIicgKyBwcmljZUJsb2Nrc1trZXldWydwcmljZUxldmVsSWQnXSArICdcIj48aSBjbGFzcz1cInNsdiBzbHYtcmFkaW8tdW5jaGVja2VkXCIgc3R5bGU9XCJjb2xvcjonICsgc2VsZi5jb2RlQXJyYXkoKVtwb10gKyAnXCI+PC9pPjxzcGFuIGNsYXNzPVwicHJpY2VfYmxvY2tfcHJpY2luZ1wiPiskJyArIChwYXJzZUZsb2F0KHByaWNlQmxvY2tzW2tleV1bJ2Z1bGxSZXRhaWxQcmljZSddKS50b0ZpeGVkKDIpIC0gc2VsZi5pbml0UGFja1ByaWNlKS50b0ZpeGVkKDIpICsgJzwvc3Bhbj48L2Rpdj4nO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIC8vcHJpY2VBcnIgY2FuIGJlIHNvcnRlZFxyXG4gICAgICAgICAgICAgICAgcHJpY2VBcnIucHVzaChwcmljZURpdik7XHJcbiAgICAgICAgICAgICAgICBwbysrXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8qZm9yIChsZXQgazEgPSBwcmljZUFyci5sZW5ndGggLSAxOyBrMSA+PSAwOyBrMS0tKSB7XHJcbiAgICAgICAgICAgIHNlbGYuSlByaWNlTWFwKCkuYXBwZW5kKGpRdWVyeShwcmljZUFycltrMV0pKTtcclxuICAgICAgICB9Ki9cclxuICAgICAgICBmb3IgKGxldCBrMSA9IDA7IGsxIDwgcHJpY2VBcnIubGVuZ3RoOyBrMSsrKSB7XHJcbiAgICAgICAgICAgIHNlbGYuSlByaWNlTWFwKCkuYXBwZW5kKGpRdWVyeShwcmljZUFycltrMV0pKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgbGV0IG9wdGlvbnNiZXN0ID0gJyc7XHJcbiAgICAgICAgbGV0IHN0ZXAgPSAxO1xyXG4gICAgICAgIGlmICghdGhpcy5KRnJlZVNlYXRpbmcoKSkge1xyXG4gICAgICAgICAgICBzdGVwID0gcGFyc2VJbnQodGhpcy5KVGlja2V0c0Nob29zZXIoKS52YWwoKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChzdGVwID09PSAwKSB7XHJcbiAgICAgICAgICAgI
8443HN0ZXAgPSAxO1xyXG4gICAgICAgIH1cclxuICAgICAgICBmb3IgKGxldCBvbyA9IDA7IG9vIDw9IDMwOyBvbyArPSBzdGVwKSB7XHJcbiAgICAgICAgICAgIG9wdGlvbnNiZXN0ICs9ICc8b3B0aW9uIHZhbHVlPVwiJyArIG9vLnRvU3RyaW5nKCkgKyAnXCI+JyArIG9vLnRvU3RyaW5nKCkgKyAnPC9vcHRpb24+JztcclxuICAgICAgICB9XHJcbiAgICAgICAgbGV0IGRyb3Bkb3duQmVzdFNlYXRzID0gJ1NlbGVjdCAjIG9mIFNlYXRzOjxzZWxlY3QgY2xhc3M9XCJ0aWNrZXRfbnVtYmVyX2Jlc3RcIj4nICsgb3B0aW9uc2Jlc3QgKyAnPC9zZWxlY3Q+JztcclxuICAgICAgICAvL3NlbGYuSlByaWNlTWFwU2VhdHMoKS5hcHBlbmQoalF1ZXJ5KCc8ZGl2IGNsYXNzPVwicHJpY2VfYmVzdF9zZWF0c1wiIHN0eWxlPVwiZGlzcGxheTpub25lXCI+PGRpdiBjbGFzcz1cImJlc3Rfc2VhdHNfYnV0dG9uXCI+RklORCBCRVNUIFNFQVRTPC9kaXY+PGRpdiBjbGFzcz1cImJlc3Rfc2VhdHNfdGV4dFwiPlRoaXMgb3B0aW9uIHdpbGwgZmluZCB0aGUgdGhlIGJlc3Qgc2VhdHMgZm9yIHlvdXIgc2VsZWN0ZWQgY2F0ZWdvcnkuIFlvdSBjYW4gYWxzbyBtYW51YWxseSBzZWxlY3Qgc2VhdHMgYnkgY2xpY2tpbmcgb24gdGhlbS4nICsgZHJvcGRvd25CZXN0U2VhdHMgKyAnPC9kaXY+PC9kaXY+JykpO1xyXG4gICAgICAgIGpRdWVyeSgnLnByaWNlX2Jsb2NrJykub2ZmKCdjbGljaycpLm9uKCdjbGljaycsIGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgY29uc3QgbGV2ZWxJZCA9IGpRdWVyeSh0aGlzKS5hdHRyKCdwcmljZV9sZXZlbF9pZCcpO1xyXG4gICAgICAgICAgICBjb25zdCBpbmRleE9mSXRlbSA9IHNlbGYuc2VsZWN0ZWRGaWx0ZXJlZENhdGVnb3JpZXMuaW5kZXhPZihsZXZlbElkKTtcclxuICAgICAgICAgICAgaWYgKGluZGV4T2ZJdGVtID09PSAtMSkge1xyXG4gICAgICAgICAgICAgICAgc2VsZi5zZWxlY3RlZEZpbHRlcmVkQ2F0ZWdvcmllcy5wdXNoKGxldmVsSWQpO1xyXG4gICAgICAgICAgICAgICAgalF1ZXJ5KHRoaXMpLmFkZENsYXNzKCdwcmljZV9ibG9ja19zZWxlY3RlZCcpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgc2VsZi5zZWxlY3RlZEZpbHRlcmVkQ2F0ZWdvcmllcy5zcGxpY2UoaW5kZXhPZkl0ZW0sIDEpO1xyXG4gICAgICAgICAgICAgICAgalF1ZXJ5KHRoaXMpLnJlbW92ZUNsYXNzKCdwcmljZV9ibG9ja19zZWxlY3RlZCcpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChzZWxmLnNlbGVjdGVkRmlsdGVyZWRDYXRlZ29yaWVzLmxlbmd0aCA9PT0gMSkge1xyXG4gICAgICAgICAgICAgICAgalF1ZXJ5KCcucHJpY2VfYmVzdF9zZWF0cycpLnNob3coKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGpRdWVyeSgnLnByaWNlX2Jlc3Rfc2VhdHMnKS5oaWRlKCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmICh0eXBlb2Ygc2VsZi5zZWF0Q2hhcnQuY2hhbmdlQ29uZmlnICE9PSAndW5kZWZpbmVkJykge1xyXG4gICAgICAgICAgICAgICAgc2VsZi5zZWF0Q2hhcnQuY2hhbmdlQ29uZmlnKHtcclxuICAgICAgICAgICAgICAgICAgICBmaWx0ZXJlZENhdGVnb3JpZXM6IHNlbGYuc2VsZWN0ZWRGaWx0ZXJlZENhdGVnb3JpZXNcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgc2VsZi5zZWF0Q2hhcnQudG9nZ2xlQ2F0ZWdvcmllc0hpZ2hsaWdodFJlbmRlcihzZWxmLnNlbGVjdGVkRmlsdGVyZWRDYXRlZ29yaWVzKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgalF1ZXJ5KCcuYmVzdF9zZWF0c19idXR0b246bm90KC5iYnJ1biknKS5vZmYoJ2NsaWNrJykub24oJ2NsaWNrJywgZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICBzZWxmLnNlYXRDaGFydC5zZWxlY3RCZXN0QXZhaWxhYmxlKHtcclxuICAgICAgICAgICAgICAgICdudW1iZXInOiBwYXJzZUludChqUXVlcnkoJy50aWNrZXRfbnVtYmVyX2Jlc3QnKS52YWwoKSksXHJcbiAgICAgICAgICAgICAgICAnY2F0ZWdvcnknOiBzZWxmLnNlbGVjdGVkRmlsdGVyZWRDYXRlZ29yaWVzWzBdXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICBqUXVlcnkoJy5iZXN0X3NlYXRzX2J1dHRvbicpLmFkZENsYXNzKCdiYnJ1bicpO1xyXG4gICAgICAgICAgICBzZWxmLkpQcmljZU1hcFNlYXRzKCkuZmluZCgnLmJlc3Rfc2VhdHNfdGV4dCcpLmh0bWwoJzxpIGNsYXNzPVwic2x2IHNsdi1jaGVjay1jaXJjbGVcIiBzdHlsZT1cImNvbG9yOiNCQzVBRkZcIj48L2k+IFlvdVxcJ3ZlIGdvdCB0aGUgYmVzdCBzZWF0cycpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHJlbmRlclNlYXRDaGFydENvbXBsZXRlZChyZXNwb25zZSkge1xyXG4gICAgICAgIGpRdWVyeSgnYm9keScpLkxvYWRpbmdPdmVybGF5KFwiaGlkZVwiKTtcclxuICAgICAgICBpZiAocmVzcG9uc2Uuc3VjY2VzcyA9PT0gdHJ1ZSkge1xyXG4gICAgICAgICAgICBsZXQgc2VsZiA9IHRoaXM7XHJcbiAgICAgICAgICAgIHRoaXMuZXZlbnRTZWF0cyA9IHJlc3BvbnNlLmV2ZW50X3NlYXRzO1xyXG4gICAgICAgICAgICB0aGlzLmV2ZW50UHJvbW90aW9ucyA9IHJlc3BvbnNlLmV2ZW50X3Byb21vdGlvbnM7XHJcbiAgICAgICAgICAgIHRoaXMuZXZlbnRTZWN0aW9ucyA9IHJlc3BvbnNlLmV2ZW50X3NlY3Rpb25zO1xyXG4gICAgICAgICAgICB0aGlzLnNlYXRBbGVydHNBbmRUb29sdGlwc1BlckxhYmVsID0gcmVzcG9uc2Uuc2VhdF9hbGVydHM7XHJcbiAgICAgICAgICAgIGlmICghc2VsZi5KRnJlZVNlYXRpbmcoKSkge1xyXG4gICAgICAgICAgICAgICAgc2VsZi5jcmVhdGVEcm9wRG93blNlbGVjdChyZXNwb25zZS5kcm9wZG93bl9zZWxlY3QsIHJlc3BvbnNlLndvcmtzcGFjZWtleSwgcmVzcG9uc2UuZXZlbnQpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgc2VsZi5zZWxlY3RlZE51bWJlck9mVGlja2V0cyA9IDA7XHJcbiAgICAgICAgICAgICAgICBzZWxmLnNlbGVjdGVkUHJvbW9Db2RlID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICBzZWxmLnJlbmRlclNlYXRNYXAocmVzcG9uc2Uud29ya3NwYWNla2V5LCByZXNwb25zZS5ldmVudCk7XHJcbiAgICAgICAgICAgICAgICBzZWxmLmNyZWF0ZVByaWNpbmdNYXAoKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBTd2FsLmZpcmUoe1xyXG4gICAgICAgICAgICAgICAgdGl0bGU6ICdFcnJvciEnLFxyXG4gICAgICAgICAgICAgICAgdGV4dDogJ1RoZXJlIHdhcyBhbiBlcnJvciByZW5kZXJpbmcgdGhlIHNlYXRzIGNoYXJ0LiBUaGUgcGFnZSB3aWxsIG5vdyByZWZyZXNoJyxcclxuICAgICAgICAgICAgICAgIGljb246ICdlcnJvcicsXHJcbiAgICAgICAgICAgICAgICBjb25maXJtQnV0dG9uVGV4dDogJ09LJyxcclxuICAgICAgICAgICAgICAgIGNsb3NlT25Db25maXJtOiB0cnVlLFxyXG4gICAgICAgICAgICB9KS50aGVuKChyZXN1bHQpID0+IHtcclxuICAgICAgICAgICAgICAgIC8qIFJlYWQgbW9yZSBhYm91dCBpc0NvbmZpcm1lZCwgaXNEZW5pZWQgYmVsb3cgKi9cclxuICAgICAgICAgICAgICAgIGlmIChyZXN1bHQuaXNDb25maXJtZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICB3aW5kb3cubG9jYXRpb24uaHJlZiA9IHdpbmRvdy5sb2NhdGlvbi5ocmVmO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChyZXN1bHQuaXNEZW5pZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICAvL1N3YWwuZmlyZSgnQ2hhbmdlcyBhcmUgbm90IHNhdmVkJywgJycsICdpbmZvJylcclxuICAgICAgICAgICAgICAgI
8443H1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGNyZWF0ZUNhbGVuZGFyKCkge1xyXG4gICAgICAgIHRoaXMuY2FsZW5kYXIgPSB0aGlzLkpGbGF0Q2FsZW5kYXIoKS5mbGF0cGlja3Ioe1xyXG4gICAgICAgICAgICBtb2RlOiAnc2luZ2xlJyxcclxuICAgICAgICAgICAgZGlzYWJsZU1vYmlsZTogdHJ1ZSxcclxuICAgICAgICAgICAgaW5saW5lOiB0cnVlLFxyXG4gICAgICAgICAgICAvL2xvY2FsZTogYmJMb2NhbC5jdXJyZW50X2xhbmd1YWdlLFxyXG4gICAgICAgICAgICAvL2RhdGVGb3JtYXQ6IHRoaXMuZ2V0RGF0ZUZvcm1hdCgpLFxyXG4gICAgICAgICAgICBhbHRJbnB1dDogZmFsc2UsXHJcbiAgICAgICAgICAgIGNsaWNrT3BlbnM6IGZhbHNlLFxyXG4gICAgICAgICAgICBhbGxvd0lucHV0OiBmYWxzZSxcclxuICAgICAgICAgICAgLy9zdGF0aWM6IHRydWUsXHJcbiAgICAgICAgICAgIG9uQ2hhbmdlOiBqUXVlcnkucHJveHkodGhpcy5kYXRlQ2hhbmdlZCwgdGhpcyksXHJcbiAgICAgICAgICAgIG9uTW9udGhDaGFuZ2U6IGpRdWVyeS5wcm94eSh0aGlzLm1vbnRoQ2hhbmdlZCwgdGhpcyksXHJcbiAgICAgICAgICAgIG9uRGF5Q3JlYXRlOiBqUXVlcnkucHJveHkodGhpcy5kYXlDcmVhdGUsIHRoaXMpLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGlmICh0aGlzLkpUaGVtZSgpID09PSAnbGlnaHQnKSB7XHJcbiAgICAgICAgICAgIHRoaXMuSkJsYW5rU2VhdHNNYXAoKS5odG1sKCc8aW1nIHNyYz1cIi93cC1jb250ZW50L3RoZW1lcy9wb3J0by9pbWFnZXMvbm9fc2VsZWN0aW9uX2RhdGVfdGltZV9saWdodC5wbmdcIi8+PGg0PlBpY2sgYSBkYXRlIHRvIHNlZSB0aGUgYXZhaWxhYmxlIHRpY2tldHM8L2g0PicpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuSkJsYW5rU2VhdHNNYXAoKS5odG1sKCc8aDQ+U2VsZWN0IGEgZGF0ZSBmcm9tIHRoZSBDYWxlbmRhcjwvaDQ+PGltZyBzdHlsZT1cInBhZGRpbmc6ODBweDtcIiBzcmM9XCIvd3AtY29udGVudC90aGVtZXMvcG9ydG8vaW1hZ2VzL25vX3NlbGVjdGlvbl9kYXRlX3RpbWUucG5nXCIvPicpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy9qUXVlcnkoJzxzcGFuPiw8L3NwYW4+JykuaW5zZXJ0QWZ0ZXIoalF1ZXJ5KCcuZmxhdHBpY2tyLW1vbnRoRHJvcGRvd24tbW9udGhzJykpO1xyXG4gICAgICAgIGpRdWVyeSgnLmZsYXRwaWNrci1tb250aERyb3Bkb3duLW1vbnRocycpLnByb3AoJ2Rpc2FibGVkJywgJ2Rpc2FibGVkJyk7XHJcbiAgICAgICAgalF1ZXJ5KCcuZmxhdHBpY2tyLWN1cnJlbnQtbW9udGggaW5wdXQnKS5wcm9wKCdkaXNhYmxlZCcsICdkaXNhYmxlZCcpO1xyXG4gICAgICAgIGlmICh0aGlzLkpHb1RvTW9udGgoKSAhPT0gZmFsc2UpIHtcclxuICAgICAgICAgICAgdGhpcy5jYWxlbmRhci5qdW1wVG9EYXRlKHRoaXMuZ2V0RW5kT2ZNb250aHModGhpcy5KR29Ub01vbnRoKClbJ3llYXInXSwgdGhpcy5KR29Ub01vbnRoKClbJ21vbnRoJ10gLSAxKSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLmZpcnN0RGF0ZVdpdGhFdmVudCAhPT0gZmFsc2UpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuY2FsZW5kYXIuanVtcFRvRGF0ZSh0aGlzLmdldEVuZE9mTW9udGgodGhpcy5maXJzdERhdGVXaXRoRXZlbnQpKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBtb250aENoYW5nZWQoc2VsZWN0ZWREYXRlcywgZGF0ZVN0ciwgaW5zdGFuY2UpIHtcclxuICAgICAgICAvL2NvbnNvbGUubG9nKGluc3RhbmNlLmN1cnJlbnRNb250aCk7XHJcbiAgICAgICAgbGV0IHNlbGYgPSB0aGlzO1xyXG4gICAgICAgIGxldCBjdXJNb250aCA9IHBhcnNlSW50KGluc3RhbmNlLmN1cnJlbnRNb250aCkgKyAxO1xyXG4gICAgICAgIGxldCBjdXJZZWFyID0gcGFyc2VJbnQoaW5zdGFuY2UuY3VycmVudFllYXIpO1xyXG4gICAgICAgIGlmIChzZWxmLkpEdWFsRGF0ZXMoKSkge1xyXG4gICAgICAgICAgICBsZXQgZHllYXIgPSBwYXJzZUludChzZWxmLkpEdWFsRGF0ZXMoKS5hdHRyKCdkeWVhcicpKTtcclxuICAgICAgICAgICAgbGV0IGRtb250aCA9IHBhcnNlSW50KHNlbGYuSkR1YWxEYXRlcygpLmF0dHIoJ2Rtb250aCcpKTtcclxuICAgICAgICAgICAgbGV0IGR0eXBlID0gc2VsZi5KRHVhbERhdGVzKCkuYXR0cignZHR5cGUnKTtcclxuICAgICAgICAgICAgbGV0IGR1cmwgPSBzZWxmLkpEdWFsRGF0ZXMoKS5hdHRyKCdkdXJsJyk7XHJcbiAgICAgICAgICAgIGlmIChkdHlwZSA9PT0gJ2EnKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoZG1vbnRoIDw9IGN1ck1vbnRoICYmIGN1clllYXIgPT09IGR5ZWFyIHx8IGN1clllYXIgPiBkeWVhcikge1xyXG4gICAgICAgICAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5ocmVmID0gZHVybCArICcmZG1vbnRoPScgKyBjdXJNb250aCArICcmZHllYXI9JyArIGN1clllYXI7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZHR5cGUgPT09ICdiJykge1xyXG4gICAgICAgICAgICAgICAgaWYgKGRtb250aCA+IGN1ck1vbnRoICYmIGN1clllYXIgPT09IGR5ZWFyIHx8IGN1clllYXIgPCBkeWVhcikge1xyXG4gICAgICAgICAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5ocmVmID0gZHVybCArICcmZG1vbnRoPScgKyBjdXJNb250aCArICcmZHllYXI9JyArIGN1clllYXI7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgfVxyXG5cclxuICAgIGdldExhc3REYXkoeSwgbSkge1xyXG4gICAgICAgIHJldHVybiAzMCArIChtIDw9IDcgPyAoKG0gJSAyKSA/IDEgOiAwKSA6ICghKG0gJSAyKSA/IDEgOiAwKSkgLSAobSA9PSAyKSAtIChtID09IDIgJiYgeSAlIDQgIT0gMCB8fCAhKHkgJSAxMDAgPT0gMCAmJiB5ICUgNDAwID09IDApKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXRMYXN0VHJ1ZURheSh5LCBtKSB7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBEYXRlKHksIG0gKyAxLCAwKS5nZXREYXRlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0RW5kT2ZNb250aChkYXRlKSB7XHJcbiAgICAgICAgbGV0IG5leHRNb250aCA9IG5ldyBEYXRlKGRhdGUuZ2V0RnVsbFllYXIoKSwgZGF0ZS5nZXRNb250aCgpLCB0aGlzLmdldExhc3RUcnVlRGF5KGRhdGUuZ2V0RnVsbFllYXIoKSwgZGF0ZS5nZXRNb250aCgpKSk7XHJcbiAgICAgICAgcmV0dXJuIG5leHRNb250aDtcclxuICAgIH1cclxuXHJcbiAgICBnZXRFbmRPZk1vbnRocyhkYXRlWWVhciwgZGF0ZU1vbnRoKSB7X
8443HJcbiAgICAgICAgbGV0IG5leHRNb250aCA9IG5ldyBEYXRlKGRhdGVZZWFyLCBkYXRlTW9udGgsIHRoaXMuZ2V0TGFzdERheShkYXRlWWVhciwgZGF0ZU1vbnRoKSk7XHJcbiAgICAgICAgcmV0dXJuIG5leHRNb250aDtcclxuICAgIH1cclxuXHJcbiAgICBkYXlDcmVhdGUoZE9iaiwgZFN0ciwgZnAsIGRheUVsZW0pIHtcclxuICAgICAgICBpZiAoalF1ZXJ5KGRheUVsZW0pLmhhc0NsYXNzKCdwcmV2TW9udGhEYXknKSB8fCBqUXVlcnkoZGF5RWxlbSkuaGFzQ2xhc3MoJ25leHRNb250aERheScpKSB7XHJcbiAgICAgICAgICAgIGpRdWVyeShkYXlFbGVtKS5hZGRDbGFzcygnZGlzYWJsZWQnKS5jc3MoJ3Zpc2liaWxpdHknLCAnaGlkZGVuJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGxldCBzZWxmID0gdGhpcztcclxuICAgICAgICBsZXQgZm91bmQgPSBmYWxzZTtcclxuICAgICAgICBsZXQgdG9kYXkgPSBuZXcgRGF0ZSgpO1xyXG4gICAgICAgIC8vaWYgKCFzZWxmLkpJc0F0dHJhY3Rpb24oKSkge1xyXG4gICAgICAgIHRvZGF5ID0gbmV3IERhdGUodG9kYXkuZ2V0RnVsbFllYXIoKSwgdG9kYXkuZ2V0TW9udGgoKSwgdG9kYXkuZ2V0RGF0ZSgpKTtcclxuICAgICAgICAvL31cclxuXHJcbiAgICAgICAgaWYgKHNlbGYuY29tcGFyZV9hc2MoZGF5RWxlbS5kYXRlT2JqLCB0b2RheS5nZXRUaW1lKCkpID49IDApIHtcclxuXHJcbiAgICAgICAgICAgIGZvciAoY29uc3Qga2V5IGluIHNlbGYuZXZlbnRMaXN0KSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgY0RhdGUgPSBzZWxmLmNyZWF0ZURhdGVBc1VUQyhkYXlFbGVtLmRhdGVPYmopO1xyXG4gICAgICAgICAgICAgICAgY0RhdGUuc2V0VGltZShjRGF0ZS5nZXRUaW1lKCkgKyBzZWxmLmdldFRpbWV6b25lSW5NaWxpc2Vjb25kcyhjRGF0ZSkpO1xyXG4gICAgICAgICAgICAgICAgaWYgKGtleSA9PT0gZmxhdHBpY2tyLmZvcm1hdERhdGUoY0RhdGUsICdZLW0tZCcpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZm91bmQgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGxldCBzdGFydF9kYXRlID0gc2VsZi5wYWNrU3RhcnREYXRlKCk7XHJcbiAgICAgICAgbGV0IGVuZF9kYXRlID0gc2VsZi5wYWNrRW5kRGF0ZSgpO1xyXG5cclxuICAgICAgICBpZiAoc3RhcnRfZGF0ZSAhPT0gZmFsc2UgJiYgZW5kX2RhdGUgIT09IGZhbHNlKSB7XHJcbiAgICAgICAgICAgIGlmIChzZWxmLmNvbXBhcmVfYXNjKGRheUVsZW0uZGF0ZU9iaiwgc3RhcnRfZGF0ZS5nZXRUaW1lKCkgKyBzZWxmLmdldFRpbWV6b25lSW5NaWxpc2Vjb25kcyhzdGFydF9kYXRlKSkgPCAwKSB7XHJcbiAgICAgICAgICAgICAgICBqUXVlcnkoZGF5RWxlbSkuYWRkQ2xhc3MoJ2ZsYXRwaWNrci1kaXNhYmxlZCcpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChzZWxmLmNvbXBhcmVfYXNjKGRheUVsZW0uZGF0ZU9iaiwgZW5kX2RhdGUuZ2V0VGltZSgpICsgc2VsZi5nZXRUaW1lem9uZUluTWlsaXNlY29uZHMoZW5kX2RhdGUpKSA+IDApIHtcclxuICAgICAgICAgICAgICAgIGpRdWVyeShkYXlFbGVtKS5hZGRDbGFzcygnZmxhdHBpY2tyLWRpc2FibGVkJyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGZvdW5kKSB7XHJcbiAgICAgICAgICAgIGRheUVsZW0uaW5uZXJIVE1MICs9IFwiPHNwYW4gY2xhc3M9J2JiZXZlbnQnPjwvc3Bhbj5cIjtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBqUXVlcnkoZGF5RWxlbSkuYWRkQ2xhc3MoJ2ZsYXRwaWNrci1kaXNhYmxlZCcpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBjcmVhdGVEcm9wRG93bkF0dHJhY3Rpb24obWludCwgbWF4dCwgcmVxZXYsIGksIGopIHtcclxuICAgICAgICBsZXQgZHJvcGQgPSAnPHNlbGVjdCBpPVwiJyArIGkgKyAnXCIgaj1cIicgKyBqICsgJ1wiIG5hbWU9XCJhdHRyYWN0aW9uX3NlbGVjdF8nICsgaSArICdfJyArIGogKyAnXCIgY2xhc3M9XCJhdHRyYWN0aW9uX21pbnRfbWF4dFwiPic7XHJcbiAgICAgICAgbGV0IHN0ZXAgPSAxOy8vdGhpcyBuZWVkcyB0byBiZSBhIHNldHRpbmcgYnV0IGJlY2F1c2Ugb25seSBicmFkIGdhcnJldGggaGFzIHpvbmVzIGFuZCBpcyBmcm9tIDIgKzIgdGhlbiB3ZSBsZWF2ZSBsaWtlIHRoaXNcclxuICAgICAgICBkcm9wZCArPSAnPG9wdGlvbiB2YWx1ZT1cIicgKyAwICsgJ1wiPicgKyAwICsgJzwvb3B0aW9uPic7XHJcbiAgICAgICAgZm9yIChsZXQgcCA9IG1pbnQgKyAxOyBwIDwgbWF4dDsgcCA9IHAgKyBzdGVwKSB7XHJcbiAgICAgICAgICAgIGRyb3BkICs9ICc8b3B0aW9uIHZhbHVlPVwiJyArIHAgKyAnXCI+JyArIHAgKyAnPC9vcHRpb24+JztcclxuICAgICAgICB9XHJcbiAgICAgICAgZHJvcGQgKz0gJzwvc2VsZWN0Pic7XHJcbiAgICAgICAgcmV0dXJuIGRyb3BkO1xyXG4gICAgfVxyXG5cclxuICAgIHJlbmRlclRpY2tldFNlbGVjdG9yKGV2ZW50X2lkKSB7XHJcbiAgICAgICAgbGV0IHNlbGYgPSB0aGlzO1xyXG4gICAgICAgIGxldCBwSUQ7XHJcbiAgICAgICAgaWYgKHNlbGYuSklzQXR0cmFjdGlvbigpKSB7XHJcbiAgICAgICAgICAgIHBJRCA9IGpRdWVyeSgnI2F0dHJhY3Rpb25faWQnKS5hdHRyKCdwaWQnKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBwSUQgPSBzZWxmLmdldFBhcmFtZXRlckJ5TmFtZSgncHJvZHVjdF9pZCcpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBkYXRhID0ge1xyXG4gICAgICAgICAgICBhY3Rpb246ICdldmVudF9zZWF0cycsXHJcbiAgICAgICAgICAgIHByb2R1Y3RfaWQ6IHBJRCxcclxuICAgICAgICAgICAgZXZlbnRfaWQ6IGV2ZW50X2lkLFxyXG4gICAgICAgICAgICBzZWN1cml0eTogalF1ZXJ5KCcjcndiX2V2ZW50X3NlYXRzX25vbmNlJykudmFsKClcclxuICAgICAgICB9O1xyXG4gICAgICAgIGpRdWVyeSgnYm9keScpLkxvYWRpbmdPdmVybGF5KFwic2hvd1wiKTtcclxuICAgICAgICBqUXVlcnkuYWpheCh7XHJcbiAgICAgICAgICAgI
8443HR5cGU6ICdQT1NUJyxcclxuICAgICAgICAgICAgZGF0YVR5cGU6ICdqc29uJyxcclxuICAgICAgICAgICAgdXJsOiBiYkxvY2FsLmFqYXhfdXJsLFxyXG4gICAgICAgICAgICBkYXRhOiBkYXRhLFxyXG4gICAgICAgICAgICBzdWNjZXNzOiBqUXVlcnkucHJveHkoc2VsZi5yZW5kZXJUaWNrZXRTZWxlY3RvckNvbXBsZXRlZCwgc2VsZilcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICByZW5kZXJUaWNrZXRTZWxlY3RvckNvbXBsZXRlZChyZXNwb25zZSkge1xyXG4gICAgICAgIGpRdWVyeSgnYm9keScpLkxvYWRpbmdPdmVybGF5KFwiaGlkZVwiKTtcclxuICAgICAgICBpZiAocmVzcG9uc2Uuc3VjY2VzcyA9PT0gdHJ1ZSkge1xyXG5cclxuICAgICAgICAgICAgdGhpcy5ldmVudFByb21vdGlvbnMgPSByZXNwb25zZS5ldmVudF9wcm9tb3Rpb25zO1xyXG4gICAgICAgICAgICB0aGlzLmV2ZW50U2VjdGlvbnMgPSByZXNwb25zZS5ldmVudF9zZWN0aW9ucztcclxuICAgICAgICAgICAgdGhpcy5yZW5kZXJUaWNrZXRTZWxlY3RvckFjdGlvbigpO1xyXG5cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBTd2FsLmZpcmUoe1xyXG4gICAgICAgICAgICAgICAgdGl0bGU6ICdFcnJvciEnLFxyXG4gICAgICAgICAgICAgICAgdGV4dDogJ1RoZXJlIHdhcyBhbiBlcnJvciByZW5kZXJpbmcgdGhlIHNlYXRzIGNoYXJ0LiBUaGUgcGFnZSB3aWxsIG5vdyByZWZyZXNoJyxcclxuICAgICAgICAgICAgICAgIGljb246ICdlcnJvcicsXHJcbiAgICAgICAgICAgICAgICBjb25maXJtQnV0dG9uVGV4dDogJ09LJyxcclxuICAgICAgICAgICAgICAgIGNsb3NlT25Db25maXJtOiB0cnVlLFxyXG4gICAgICAgICAgICB9KS50aGVuKChyZXN1bHQpID0+IHtcclxuICAgICAgICAgICAgICAgIC8qIFJlYWQgbW9yZSBhYm91dCBpc0NvbmZpcm1lZCwgaXNEZW5pZWQgYmVsb3cgKi9cclxuICAgICAgICAgICAgICAgIGlmIChyZXN1bHQuaXNDb25maXJtZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICB3aW5kb3cubG9jYXRpb24uaHJlZiA9IHdpbmRvdy5sb2NhdGlvbi5ocmVmO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChyZXN1bHQuaXNEZW5pZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICAvL1N3YWwuZmlyZSgnQ2hhbmdlcyBhcmUgbm90IHNhdmVkJywgJycsICdpbmZvJylcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHNvcnRVc2luZ05lc3RlZFRleHQocGFyZW50LCBjaGlsZFNlbGVjdG9yLCBrZXlTZWxlY3Rvcikge1xyXG4gICAgICAgIHZhciBpdGVtcyA9IHBhcmVudC5jaGlsZHJlbihjaGlsZFNlbGVjdG9yKS5zb3J0KGZ1bmN0aW9uIChhLCBiKSB7XHJcbiAgICAgICAgICAgIHZhciB2QSA9IHBhcnNlRmxvYXQoalF1ZXJ5KGtleVNlbGVjdG9yLCBhKS50ZXh0KCkuc3Vic3RyaW5nKDEpKTtcclxuICAgICAgICAgICAgdmFyIHZCID0gcGFyc2VGbG9hdChqUXVlcnkoa2V5U2VsZWN0b3IsIGIpLnRleHQoKS5zdWJzdHJpbmcoMSkpO1xyXG4gICAgICAgICAgICByZXR1cm4gKHZBID4gdkIpID8gLTEgOiAodkEgPCB2QikgPyAxIDogMDtcclxuICAgICAgICB9KTtcclxuICAgICAgICBwYXJlbnQuYXBwZW5kKGl0ZW1zKTtcclxuICAgIH1cclxuXHJcbiAgICByZW5kZXJUaWNrZXRTZWxlY3RvckFjdGlvbigpIHtcclxuICAgICAgICBsZXQgc2VsZiA9IHRoaXM7XHJcbiAgICAgICAgdGhpcy5KQmxhbmtTZWF0c01hcCgpLmhpZGUoKTtcclxuICAgICAgICB0aGlzLkpQcmljZU1hcFNlYXRzKCkuc2hvdygpO1xyXG4gICAgICAgIHRoaXMuSlByaWNlTWFwU2VhdHMoKS5odG1sKCcnKTtcclxuICAgICAgICBpZiAodGhpcy5KWm9uZUltYWdlKCkubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICBsZXQgemltYWdlID0gdGhpcy5KWm9uZUltYWdlKCkuY2xvbmUoKTtcclxuICAgICAgICAgICAgemltYWdlLnJlbW92ZUNsYXNzKCdpc19maXJzdCcpO1xyXG4gICAgICAgICAgICB6aW1hZ2Uuc2hvdygpO1xyXG4gICAgICAgICAgICB0aGlzLkpQcmljZU1hcFNlYXRzKCkuYXBwZW5kKHppbWFnZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGxldCBzZWxlY3RlZFByaWNlTGV2ZWxJZHMgPSBzZWxmLmdldFByaWNlTGV2ZWxJZHMoKTtcclxuXHJcbiAgICAgICAgbGV0IHByaWNlQmxvY2tzQWxsO1xyXG4gICAgICAgIGlmICh0aGlzLkpab25lSW1hZ2UoKS5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIHByaWNlQmxvY2tzQWxsID0gc2VsZi5nZXRQcmljZUJsb2Nrc0FuZFVzZWRCbG9ja3Nab25lcygpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHByaWNlQmxvY2tzQWxsID0gc2VsZi5nZXRQcmljZUJsb2Nrc0FuZFVzZWRCbG9ja3NBdHRyYWN0aW9uKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGxldCBwcmljZUJsb2Nrc0FyciA9IHByaWNlQmxvY2tzQWxsWydwcmljZUJsb2NrJ107XHJcbiAgICAgICAgbGV0IHByaWNlQmxvY2tzID0gc2VsZi5vYmplY3RUb0FycmF5KHByaWNlQmxvY2tzQXJyKTtcclxuICAgICAgICBwcmljZUJsb2Nrcy5zb3J0KHNlbGYuY29tcGFyZVByaWNlQmxvY2tzKTtcclxuXHJcbiAgICAgICAgbGV0IHVzZWRCbG9ja3MgPSBwcmljZUJsb2Nrc0FsbFsndXNlQmxvY2snXTtcclxuICAgICAgICBsZXQgbkJsb2NrcyA9IFtdO1xyXG4gICAgICAgIGZvciAoY29uc3Qga2V5U2VhdHMgaW4gc2VsZi5ldmVudFNlY3Rpb25zKSB7XHJcbiAgICAgICAgICAgIGlmIChzZWxlY3RlZFByaWNlTGV2ZWxJZHMgIT09IGZhbHNlKSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgaXNDYXQgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgaSBpbiBzZWxlY3RlZFByaWNlTGV2ZWxJZHMpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5ldmVudFNlY3Rpb25zW2tleVNlYXRzXVsncHJpY2VMZXZlbElEJ10gPT09IHNlbGVjdGVkUHJpY2VMZXZlbElkc1tpXSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpc0NhdCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgI
8443H1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmIChpc0NhdCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBtYXh0ID0gcGFyc2VJbnQoc2VsZi5ldmVudFNlY3Rpb25zW2tleVNlYXRzXVsnYXZhaWxhYmxlUXVhbnRpdHknXSkgKyAxO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBsZXQgbWludCA9IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBzZWxmLmV2ZW50U2VjdGlvbnNba2V5U2VhdHNdWydtaW5UaWNrZXRzJ10gIT09ICd1bmRlZmluZWQnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG1pbnQgPSBwYXJzZUludChzZWxmLmV2ZW50U2VjdGlvbnNba2V5U2VhdHNdWydtaW5UaWNrZXRzJ10pIC0gMTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBzZWxmLmV2ZW50U2VjdGlvbnNba2V5U2VhdHNdWydtYXhUaWNrZXRzJ10gIT09ICd1bmRlZmluZWQnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXJzZUludChzZWxmLmV2ZW50U2VjdGlvbnNba2V5U2VhdHNdWydtYXhUaWNrZXRzJ10pICsgMSA8IG1heHQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heHQgPSBwYXJzZUludChzZWxmLmV2ZW50U2VjdGlvbnNba2V5U2VhdHNdWydtYXhUaWNrZXRzJ10pICsgMTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAobWF4dCA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHByaWNlTGV2ZUlkID0gc2VsZi5ldmVudFNlY3Rpb25zW2tleVNlYXRzXVsncHJpY2VMZXZlbElEJ107XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLkpab25lSW1hZ2UoKS5sZW5ndGggPT09IDApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLmluQXJyYXkobkJsb2NrcywgcHJpY2VMZXZlSWQpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuQmxvY2tzLnB1c2gocHJpY2VMZXZlSWQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgaiBpbiBwcmljZUJsb2Nrcykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qga2V5ID0gcHJpY2VCbG9ja3Nbal1bMF07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJpY2VCbG9ja3NBcnJba2V5XVsncHJpY2VMZXZlbElkJ10gPT09IHByaWNlTGV2ZUlkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHVzZWRCbG9ja3NbcHJpY2VMZXZlSWRdWydwcm9tbyddKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgcCA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkodXNlZEJsb2Nrc1twcmljZUxldmVJZF1bJ3Byb21vJ10pKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlZEJsb2Nrc1twcmljZUxldmVJZF1bJ3Byb21vJ11ba2V5XSA9IHA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgcDEgaW4gdXNlZEJsb2Nrc1twcmljZUxldmVJZF1bJ3Byb21vJ10pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHAxID09PSBrZXkgfHwgdGhpcy5KWm9uZUltYWdlKCkubGVuZ3RoID4gMCB8fCB0aGlzLkpJc1JlZGVhbSgpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgdGl0bGUgPSBwcmljZUJsb2Nrc0FycltrZXldWydhdHRyYWN0aW9uX3RpdGxlX3ByaWNlJ107XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgZGVzYyA9IHByaWNlQmxvY2tzQXJyW2tleV1bJ2F0dHJhY3Rpb25fZGVzY19wcmljZSddO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGhhc05hbWVXZWlnaHQgPSBwcmljZUJsb2Nrc0FycltrZXldWydhdHRyYWN0aW9uX2hhc19udyddO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHBpY2t1cExvY2F0aW9ucyA9IHByaWNlQmxvY2tzQXJyW2tleV1bJ2F0dHJhY3Rpb25fcGlja3VwX2xvYyddO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHBpY2t1cExvY2F0aW9uc05vbkFwaSA9IHByaWNlQmxvY2tzQXJyW2tleV1bJ2F0dHJhY3Rpb25fcGlja3VwbCddO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGlQcmljZSA9ICckJyArIHBhcnNlRmxvYXQocHJpY2VCbG9ja3NBcnJba2V5XVsnZnVsbFJldGFpbFByaWNlJ10pLnRvRml4ZWQoMik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgcmVxZXYgPSBwcmljZUJsb2Nrc0FycltrZXldWydyZXF1aXJlX2V2ZW5fbnVtYmVyJ107XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgcHJvbW9Db2RlID0gdXNlZEJsb2Nrc1twcmljZUxldmVJZF1bJ3Byb21vJ11bcDFdWydwcm9tb3Rpb25Db2RlJ107XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgZHJvcGRvd24gPSBzZWxmLmNyZWF0ZURyb3BEb3duQXR0cmFjdGlvbihtaW50LCBtYXh0LCByZXFldiwgcHJvbW9Db2RlLCBwcmljZUxldmVJZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgYmlncHJpY2VjdXQgPSAnJztcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcm9tb0NvZGUuaW5kZXhPZignQURVTFQnKSA9PT0gLTEgJiYgcHJvbW9Db2RlLmluZGV4T2YoJ0NISUxEJykgPT09IC0xKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB1c2VkQmxvY2tzW3ByaWNlTGV2ZUlkXVsncHJvbW8nXVtwMV1bJ3ByaWNlQmxvY2tzJ11bcHJpY2VMZXZlSWRdLmJpZ1ByaWNlICE9PSAndW5kZWZpbmVkJyAmJiB1c2VkQmxvY2tzW3ByaWNlTGV2ZUlkXVsncHJvbW8nXVtwMV1bJ3ByaWNlQmxvY2tzJ11bcHJpY2VMZXZlSWRdWydmdWxsUmV0YWlsUHJpY2UnXSAhPT0gdXNlZEJsb2Nrc1twcmljZUxldmVJZF1bJ3Byb21vJ11bcDFdWydwcmljZUJsb2NrcyddW3ByaWNlTGV2ZUlkXS5iaWdQcmljZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaWdwcmljZWN1dCA9ICc8c3BhbiBjbGFzcz1cImJpZ3ByaWNlY3V0XCI+JyArIHBhcnNlRmxvYXQodXNlZEJsb2Nrc1twcmljZUxldmVJZF1bJ3Byb21vJ11bcDFdWydwcmljZUJsb2NrcyddW3ByaWNlTGV2ZUlkXS5iaWdQcmljZSkudG9GaXhlZCgyKSArICc8L3NwYW4+J1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI
8443H1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh1c2VkQmxvY2tzW3ByaWNlTGV2ZUlkXVsncHJvbW8nXVtwMV1bJ3ByaWNlQmxvY2tzJ11bcHJpY2VMZXZlSWRdLm11c3Rsb2dpbiAmJiB0eXBlb2YgdXNlZEJsb2Nrc1twcmljZUxldmVJZF1bJ3Byb21vJ11bcDFdWydwcmljZUJsb2NrcyddW3ByaWNlTGV2ZUlkXS5zbWFsbFByaWNlICE9PSAndW5kZWZpbmVkJyAmJiB1c2VkQmxvY2tzW3ByaWNlTGV2ZUlkXVsncHJvbW8nXVtwMV1bJ3ByaWNlQmxvY2tzJ11bcHJpY2VMZXZlSWRdWydmdWxsUmV0YWlsUHJpY2UnXSAhPT0gdXNlZEJsb2Nrc1twcmljZUxldmVJZF1bJ3Byb21vJ11bcDFdWydwcmljZUJsb2NrcyddW3ByaWNlTGV2ZUlkXS5zbWFsbFByaWNlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgalF1ZXJ5KCcjcHJpY2VfbG9naW5fc2lnbnVwJykuc2hvdygpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBoYXNudyA9ICcnO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGhhc05hbWVXZWlnaHQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNudyA9ICcgaGFzbncnO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGhhc3BwID0gJyc7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHdpdGhEZXNjRGl2ID0gJzxkaXYgY2xhc3M9XCJhdHRyYWN0aW9uX2JveCB3ZGVzY1wiPjxkaXYgY2xhc3M9XCJhdHRyYWN0aW9uX2JveF90aXRsZV9wcmljZVwiPjxkaXYgY2xhc3M9XCJhdHRyYWN0aW9uX2JveF90aXRsZVwiPicgKyB0aXRsZSArICc8L2Rpdj48ZGl2IGNsYXNzPVwiYXR0cmFjdGlvbl9ib3hfcHJpY2VcIj4nICsgaVByaWNlICsgYmlncHJpY2VjdXQgKyAnPC9kaXY+PC9kaXY+PGRpdiBjbGFzcz1cImF0dHJhY3Rpb25fYm94X2Rlc2NfZHJvcGRvd25cIj48ZGl2IGNsYXNzPVwiYXR0cmFjdGlvbl9ib3hfZGVzY1wiPicgKyBkZXNjICsgJzwvZGl2PjxkaXYgY2xhc3M9XCJhdHRyYWN0aW9uX2JveF9kcm9wZG93bicgKyBoYXNudyArICdcIj4nICsgZHJvcGRvd24gKyAnPC9kaXY+PC9kaXY+PC9kaXY+JztcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB3aXRob3V0RGVzY0RpdiA9ICc8ZGl2IGNsYXNzPVwiYXR0cmFjdGlvbl9ib3hcIj48ZGl2IGNsYXNzPVwiYXR0cmFjdGlvbl9ib3hfdGl0bGVfcHJpY2VcIj48ZGl2IGNsYXNzPVwiYXR0cmFjdGlvbl9ib3hfdGl0bGVcIj4nICsgdGl0bGUgKyAnPC9kaXY+PC9kaXY+PGRpdiBjbGFzcz1cImF0dHJhY3Rpb25fYm94X3ByaWNlX2Ryb3Bkb3duXCI+PGRpdiBjbGFzcz1cImF0dHJhY3Rpb25fYm94X3ByaWNlXCI+JyArIGlQcmljZSArIGJpZ3ByaWNlY3V0ICsgJzwvZGl2PjxkaXYgY2xhc3M9XCJhdHRyYWN0aW9uX2JveF9kcm9wZG93bicgKyBoYXNudyArICdcIj4nICsgZHJvcGRvd24gKyAnPC9kaXY+PC9kaXY+PC9kaXY+JztcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjICE9PSAnJykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuSlByaWNlTWFwU2VhdHMoKS5hcHBlbmQoalF1ZXJ5KHdpdGhEZXNjRGl2KSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuSlByaWNlTWFwU2VhdHMoKS5hcHBlbmQoalF1ZXJ5KHdpdGhvdXREZXNjRGl2KSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGlja3VwTG9jYXRpb25zICYmIHBpY2t1cExvY2F0aW9ucy5sZW5ndGggPiAxKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHBpY2t1cGxvYyA9ICc8ZGl2IGNsYXNzPVwicGlra2xvY1wiPlNlbGVjdCBwaWNrdXAgbG9jYXRpb246IDxzZWxlY3QgbmFtZT1cInBpY2t1cGxvY1wiIGNsYXNzPVwiYXR0cmFjdGlvbl9waWNrdXBsb2NcIj4nO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL3BpY2t1cGxvYyArPSAnPG9wdGlvbiB2YWx1ZT1cIicgKyAwICsgJ1wiPicgKyAwICsgJzwvb3B0aW9uPic7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBpIGluIHBpY2t1cExvY2F0aW9ucykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaWNrdXBsb2MgKz0gJzxvcHRpb24gdmFsdWU9XCInICsgcGlja3VwTG9jYXRpb25zW2ldWydob3RlbExvY2F0aW9uSWQnXSArICdcIj4nICsgcGlja3VwTG9jYXRpb25zW2ldWydsb2NhdGlvbk5hbWUnXSArICc8L29wdGlvbj4nO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaWNrdXBsb2MgKz0gJzwvc2VsZWN0PjwvZGl2Pic7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5KUHJpY2VNYXBTZWF0cygpLmFwcGVuZChwaWNrdXBsb2MpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpRdWVyeSgnLnBpa2tsb2MnKS5oaWRlKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBpY2t1cExvY2F0aW9uc05vbkFwaSAmJiBwaWNrdXBMb2NhdGlvbnNOb25BcGkubGVuZ3RoID4gMSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBwaWNrdXBsb2MgPSAnPGRpdiBjbGFzcz1cInBpa2tsb2NcIj5TZWxlY3QgcGlja3VwIGxvY2F0aW9uOiA8c2VsZWN0IG5hbWU9XCJwaWNrdXBsb2NcIiBjbGFzcz1cImF0dHJhY3Rpb25fcGlja3VwbG9jXCI+JztcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9waWNrdXBsb2MgKz0gJzxvcHRpb24gdmFsdWU9XCInICsgMCArICdcIj4nICsgMCArICc8L29wdGlvbj4nO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgaSBpbiBwaWNrdXBMb2NhdGlvbnNOb25BcGkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlja3VwbG9jICs9ICc8b3B0aW9uIHZhbHVlPVwiJyArIGkgKyAnXCI+JyArIHBpY2t1cExvY2F0aW9uc05vbkFwaVtpXSArICc8L29wdGlvbj4nO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI
8443H1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaWNrdXBsb2MgKz0gJzwvc2VsZWN0PjwvZGl2Pic7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5KUHJpY2VNYXBTZWF0cygpLmFwcGVuZChwaWNrdXBsb2MpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpRdWVyeSgnLnBpa2tsb2MnKS5oaWRlKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgLy9zZWF0X2xhYmVsc19jYXRlZ29yaWVzW3NlbGYuZXZlbnRTZWN0aW9uc1trZXlTZWF0c11bJ2tleSddXSA9IFwiXCIgKyBzZWxmLmV2ZW50U2VjdGlvbnNba2V5U2VhdHNdWydwcmljZUxldmVsSUQnXTsvL3NlbGYuc2VsZWN0ZWRQcm9tb0NvZGVbJ3ByaWNlQmxvY2tzJ11bc2VsZi5ldmVudFNlYXRzW2tleVNlYXRzXVsncHJpY2VMZXZlbElkJ11dWydwcmljZUxldmVsTmFtZSddO1xyXG4gICAgICAgICAgICAgICAgICAgIC8vb2JqZWN0X2NhdGVnb3JpZXNbc2VsZi5ldmVudFNlY3Rpb25zW2tleVNlYXRzXVsna2V5J11dID0gc2VsZi5ldmVudFNlY3Rpb25zW2tleVNlYXRzXVsnYXZhaWxhYmxlUXVhbnRpdHknXTtcclxuICAgICAgICAgICAgICAgICAgICAvL3NlbGYudXNlZFByaWNlTGV2ZWxJZHMucHVzaChzZWxmLmV2ZW50U2VjdGlvbnNba2V5U2VhdHNdWydwcmljZUxldmVsSUQnXSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHNlbGYuc29ydFVzaW5nTmVzdGVkVGV4dChqUXVlcnkoJyNwcmljZV9tYXBfc2VhdHMnKSwgJy5hdHRyYWN0aW9uX2JveCcsICcuYXR0cmFjdGlvbl9ib3hfcHJpY2UnKTtcclxuICAgICAgICBzZWxmLkpUaWNrZXRzQnV0dG9uc0NhcnQoKS5odG1sKCcnKTtcclxuICAgICAgICBzZWxmLkpUaWNrZXRzQnV0dG9uc0NhcnQoKS5wYXJlbnQoKS5maW5kKCcuYmVzdF9wcmljZV9ndWFyYW50ZWVkJykucmVtb3ZlKCk7XHJcbiAgICAgICAgaWYgKHNlbGYuSklzQXR0cmFjdGlvbigpIHx8IHNlbGYuSlpvbmVJbWFnZSgpLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgaWYgKCFzZWxmLmlzTW9iaWxlKCkpIHtcclxuICAgICAgICAgICAgICAgIHNlbGYuSlRpY2tldHNCdXR0b25zQ2FydCgpLmFwcGVuZChqUXVlcnkoJzxkaXYgY2xhc3M9XCJiZXN0X3ByaWNlX2d1YXJhbnRlZWRcIj4gPHNwYW4gY2xhc3M9XCJzbHYgc2x2LWNoZWNrLWNpcmNsZVwiPjwvc3Bhbj48c3BhbiBjbGFzcz1cImJiX2xpbmtfcHJvZHVjdF90ZXh0XCI+QmVzdCBwcmljZSBndWFyYW50ZWVkPC9zcGFuPiA8L2Rpdj4nKSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBzZWxmLkpUaWNrZXRzQnV0dG9uc0NhcnQoKS5wYXJlbnQoKS5hcHBlbmQoalF1ZXJ5KCc8ZGl2IGNsYXNzPVwiYmVzdF9wcmljZV9ndWFyYW50ZWVkXCI+IDxzcGFuIGNsYXNzPVwic2x2IHNsdi1jaGVjay1jaXJjbGVcIj48L3NwYW4+PHNwYW4gY2xhc3M9XCJiYl9saW5rX3Byb2R1Y3RfdGV4dFwiPkJlc3QgcHJpY2UgZ3VhcmFudGVlZDwvc3Bhbj4gPC9kaXY+JykpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBzZWxmLkpUaWNrZXRzQnV0dG9uc0NhcnQoKS5hcHBlbmQoalF1ZXJ5KCc8YSBocmVmPVwiIzBcIiBjbGFzcz1cInNhZGRjYXJ0XCI+QWRkIFRvIENhcnQ8L2E+JykpLmFwcGVuZChqUXVlcnkoJzxhIGhyZWY9XCIjMFwiIGNsYXNzPVwic2J1eW5vd1wiPkJ1eSBOb3c8L2E+JykpOy8vLmFwcGVuZChqUXVlcnkoJzxhIGhyZWY9XCIjMFwiIGNsYXNzPVwiYnV0dG9uIGJ0biBzYWRkX3RvX2NhcnRfYnRuXCI+QWRkIFRvIENhcnQ8L2E+JykpXHJcblxyXG4gICAgICAgIHRoaXMuSkJ1eUJ1dHRvbigpLm9mZignY2xpY2snKS5vbignY2xpY2snLCBqUXVlcnkucHJveHkodGhpcy5idXlOb3dBY3Rpb25BLCB0aGlzKSk7XHJcbiAgICAgICAgdGhpcy5KQWRkVG9DYXJ0QnV0dG9uKCkub2ZmKCdjbGljaycpLm9uKCdjbGljaycsIGpRdWVyeS5wcm94eSh0aGlzLmFkZFRvQ2FydEFjdGlvbkEsIHRoaXMpKTtcclxuXHJcbiAgICAgICAgalF1ZXJ5KCcuYXR0cmFjdGlvbl9ib3hfZHJvcGRvd24gc2VsZWN0Jykub2ZmKCdjaGFuZ2UnKS5vbignY2hhbmdlJywgZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICBsZXQgaGFzQmlnID0gZmFsc2U7XHJcbiAgICAgICAgICAgIGxldCBzVmFsID0gMDtcclxuXHJcbiAgICAgICAgICAgIGpRdWVyeSgnLmF0dHJhY3Rpb25fYm94X2Ryb3Bkb3duIHNlbGVjdCcpLmVhY2goZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKHBhcnNlSW50KGpRdWVyeSh0aGlzKS52YWwoKSkgPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaGFzQmlnID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICBzVmFsID0gcGFyc2VJbnQoalF1ZXJ5KHRoaXMpLnZhbCgpKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIGpRdWVyeSgnLm53ZGF0YScpLnJlbW92ZSgpO1xyXG4gICAgICAgICAgICBpZiAoaGFzQmlnKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoalF1ZXJ5KHRoaXMpLnBhcmVudCgpLmhhc0NsYXNzKCdoYXNudycpKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIHNlbGYuSlByaWNlTWFwU2VhdHMoKS5hcHBlbmQoalF1ZXJ5KCc8ZGl2IGNsYXNzPVwibndkYXRhXCI+PC9kaXY+JykpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBpZiAoalF1ZXJ5KCcucGlra2xvYycpLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgalF1ZXJ5KCcucGlra2xvYycpLnNob3coKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgalF1ZXJ5KCcucGlra2xvYycpLmFwcGVuZFRvKHNlbGYuSlByaWNlTWFwU2VhdHMoKS5maW5kKCcubndkYXRhJykpO1xyXG4gICAgICAgICAgICAgICAgICAgI
8443H1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaTEgPSAwOyBpMSA8IHNWYWw7IGkxKyspIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5KUHJpY2VNYXBTZWF0cygpLmZpbmQoJy5ud2RhdGEnKS5hcHBlbmQoalF1ZXJ5KCc8ZGl2IGNsYXNzPVwiYmR3bGhcIj5HdWVzdCAnICsgKGkxICsgMSkgKyAnIERldGFpbHM8L2Rpdj4nKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuSlByaWNlTWFwU2VhdHMoKS5maW5kKCcubndkYXRhJykuYXBwZW5kKGpRdWVyeSgnPGRpdiBjbGFzcz1cImJkd2wgYmR3bCcgKyBpMSArICdcIj48L2Rpdj4nKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCB2diA9IFwiLm53ZGF0YSAuYmR3bFwiICsgaTE7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuSlByaWNlTWFwU2VhdHMoKS5maW5kKHZ2KS5hcHBlbmQoalF1ZXJ5KCc8ZGl2IGNsYXNzPVwiYndkbGlcIj4gPGxhYmVsIGNsYXNzPVwibndjYmJcIj5GaXJzdCBOYW1lOjwvbGFiZWw+IDxpbnB1dCBuYW1lPVwiZm5hbWVbXVwiIGNsYXNzPVwibndjYmIgYmJmbmFtZVwiIHR5cGU9XCJ0ZXh0XCI+PC9kaXY+JykpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzZWxmLkpQcmljZU1hcFNlYXRzKCkuZmluZCh2dikuYXBwZW5kKGpRdWVyeSgnPGRpdiBjbGFzcz1cImJ3ZGxpXCI+IDxsYWJlbCBjbGFzcz1cIm53Y2JiXCI+TGFzdCBOYW1lOjwvbGFiZWw+IDxpbnB1dCBuYW1lPVwibG5hbWVbXVwiIGNsYXNzPVwibndjYmIgYmJsbmFtZVwiIHR5cGU9XCJ0ZXh0XCI+PC9kaXY+JykpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzZWxmLkpQcmljZU1hcFNlYXRzKCkuZmluZCh2dikuYXBwZW5kKGpRdWVyeSgnPGRpdiBjbGFzcz1cImJ3ZGxpXCI+IDxsYWJlbCBjbGFzcz1cIm53Y2JiXCI+V2VpZ2h0OjwvbGFiZWw+IDxpbnB1dCBuYW1lPVwid2VpZ2h0W11cIiBjbGFzcz1cIm53Y2JiIGJid2VpZ2h0XCIgdHlwZT1cIm51bWJlclwiPiA8c3BhbiBjbGFzcz1cImJid2xiXCI+TEI8L3NwYW4+PC9kaXY+JykpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGpRdWVyeSgnLnBpa2tsb2MnKS5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGpRdWVyeSgnLnBpa2tsb2MnKS5zaG93KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGpRdWVyeSgnLnBpa2tsb2MnKS5hcHBlbmRUbyhzZWxmLkpQcmljZU1hcFNlYXRzKCkpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGpRdWVyeSgnLnRpY2tldHNfY2FydCcpLmluc2VydEFmdGVyKHNlbGYuSlByaWNlTWFwU2VhdHMoKSk7XHJcbiAgICAgICAgICAgICAgICBzZWxmLkpUaWNrZXRzQ2FydCgpLnNob3coKTtcclxuICAgICAgICAgICAgICAgIHNlbGYuSlRpY2tldHNCdXR0b25zQ2FydCgpLnNob3coKTtcclxuICAgICAgICAgICAgICAgIGlmICghc2VsZi5KVGlja2V0c0J1dHRvbnNDYXJ0KCkuaGFzQ2xhc3MoJ3RiX2F0dHJhY3Rpb24nKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHNlbGYuSlRpY2tldHNCdXR0b25zQ2FydCgpLmFkZENsYXNzKCd0Yl9hdHRyYWN0aW9uJyk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBqUXVlcnkoJy5yd2JfaXNfYXR0cmFjdGlvbicpLmFuaW1hdGUoe3Njcm9sbFRvcDogMH0sICdzbG93Jyk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBzZWxmLkpUaWNrZXRzQ2FydCgpLmhpZGUoKTtcclxuICAgICAgICAgICAgICAgIHNlbGYuSlRpY2tldHNCdXR0b25zQ2FydCgpLmhpZGUoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgIH1cclxuXHJcbiAgICBkYXRlQ2hhbmdlZChzZWxlY3RlZERhdGVzLCBkYXRlU3RyLCBpbnN0YW5jZSkge1xyXG4gICAgICAgIGxldCBzZWxmID0gdGhpcztcclxuXHJcbiAgICAgICAgbGV0IGV2ZW50VGltZXMgPSB0aGlzLmV2ZW50TGlzdFtkYXRlU3RyXVsnZXZlbnRfdGltZXMnXTtcclxuICAgICAgICBsZXQgZXZlbnRJZHMgPSB0aGlzLmV2ZW50TGlzdFtkYXRlU3RyXVsnaWQnXTtcclxuICAgICAgICAvKmlmICh0aGlzLkpFdmVudHNQZXJEYXRlKCkuZmxpY2tpdHkoKS5sZW5ndGgpIHtcclxuICAgICAgICAgICAgdGhpcy5KRXZlbnRzUGVyRGF0ZSgpLmZsaWNraXR5KCdkZXN0cm95Jyk7XHJcbiAgICAgICAgfSovXHJcbiAgICAgICAgc2VsZi5jcmVhdGVEZXN0cm95U2VhdENoYXJ0KCk7XHJcbiAgICAgICAgdGhpcy5KVGlja2V0c0NhcnQoKS5oaWRlKCk7XHJcbiAgICAgICAgdGhpcy5KRXZlbnRzUGVyRGF0ZSgpLmh0bWwoJycpO1xyXG4gICAgICAgIHRoaXMuSkV2ZW50c1BlckRhdGVCZWZvcmVUZXh0KCkuZmluZCgnLm51bWJlcl9vZl90aWNrZXRzX3RleHQnKS5odG1sKCcnKTtcclxuICAgICAgICB0aGlzLkpFdmVudHNQZXJEYXRlKCkuc2hvdygpO1xyXG4gICAgICAgIHRoaXMuSkV2ZW50U2VsZWN0aW9uKCkuc2hvdygpO1xyXG4gICAgICAgIHRoaXMuSkV2ZW50c1BlckRhdGVCZWZvcmVUZXh0KCkuc2hvdygpO1xyXG4gICAgICAgIGlmIChldmVudFRpbWVzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgdGhpcy5KRXZlbnRzUGVyRGF0ZUJlZm9yZVRleHQoKS5wcmVwZW5kKCc8ZGl2IGNsYXNzPVwibnVtYmVyX29mX3RpY2tldHNfdGV4dFwiPlNlbGVjdCBUaW1lOjwvZGl2PicpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBsZXQgcCA9IDA7XHJcbiAgICAgICAgY29uc3QgYyA9IDE7XHJcbiAgICAgICAgZm9yIChjb25zdCBpIGluIGV2ZW50VGltZXMpIHtcclxuICAgICAgICAgICAgdGhpcy5KRXZlbnRzUGVyRGF0ZSgpLmFwcGVuZCh0aGlzLkpUaW1lRWxlbShldmVudElkc1tpXSwgZXZlbnRUaW1lc1tpXSwgZGF0ZVN0ciwgaSkpO1xyXG4gICAgICAgICAgICAvL3RoaXMuSkV2ZW50c1BlckRhdGUoKS5hcHBlbmQodGhpcy5KVGltZUVsZW0oZXZlbnRJZHNbaV0sIGV2ZW50VGltZXNbaV0sIGRhdGVTdHIsIGkpKTtcclxuICAgICAgICAgICAgcCArPSBjO1xyXG4gICAgICAgICAgICAvL3RoaXMuSkV2ZW50c1BlckRhdGUoKS5hcHBlbmQodGhpcy5KVGltZUVsZW0oZXZlbnRJZHNbaV0sIGV2ZW50VGltZXNbaV0sIGRhdGVTdHIsIGkpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHNlbGYuSklzQXR0cmFjdGlvbigpICYmIHAgPiAxKSB7XHJcbiAgICAgICAgICAgIC8qdGh
8443pcy5KRXZlbnRzUGVyRGF0ZSgpLmZsaWNraXR5KHtcclxuICAgICAgICAgICAgICAgIC8vIG9wdGlvbnNcclxuICAgICAgICAgICAgICAgIGNlbGxBbGlnbjogJ2xlZnQnLFxyXG4gICAgICAgICAgICAgICAgY29udGFpbjogdHJ1ZSxcclxuICAgICAgICAgICAgICAgIGdyb3VwQ2VsbHM6IDEsXHJcbiAgICAgICAgICAgICAgICBjZWxsU2VsZWN0b3I6ICcudGltZV9lbGVtJyxcclxuICAgICAgICAgICAgICAgIC8vd3JhcEFyb3VuZDogdHJ1ZSxcclxuICAgICAgICAgICAgICAgIGZyZWVTY3JvbGw6IHRydWUsXHJcbiAgICAgICAgICAgICAgICBkcmFnZ2FibGU6IHRydWUsXHJcbiAgICAgICAgICAgICAgICBwYWdlRG90czogZmFsc2VcclxuICAgICAgICAgICAgfSk7Ki9cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHNlYW1sZXNzLmVsZW1lbnRTY3JvbGxJbnRvVmlldyhkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuZXZlbnRfc2VsZWN0aW9uX3RpY2tldCcpLCB7XHJcbiAgICAgICAgICAgIGJlaGF2aW9yOiAnc21vb3RoJyxcclxuICAgICAgICAgICAgaW5saW5lOiAnY2VudGVyJyxcclxuICAgICAgICAgICAgYmxvY2s6ICdjZW50ZXInXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgc2VsZi5zY3JvbGxXaW5kb3coKTtcclxuXHJcbiAgICAgICAgalF1ZXJ5KCcudGltZV9lbGVtJykub24oJ2NsaWNrJywgZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICBzZWxmLnNlbGVjdGVkRXZlbnRJZCA9IGpRdWVyeSh0aGlzKS5hdHRyKCdldmVudF9pZCcpO1xyXG4gICAgICAgICAgICBzZWxmLnNlbGVjdGVkZXZlbnRQcm9tb3Rpb25zSWRzID0gc2VsZi5ldmVudExpc3RbalF1ZXJ5KHRoaXMpLmF0dHIoJ2V2ZW50X2RhdGUnKV1bJ2V2ZW50X3Byb21vdGlvbnMnXVtwYXJzZUludChqUXVlcnkodGhpcykuYXR0cignZXZfcG9zJykpXTtcclxuICAgICAgICAgICAgbGV0IGV2aUhvdXI7XHJcbiAgICAgICAgICAgIGV2aUhvdXIgPSBqUXVlcnkodGhpcykuYXR0cignZXZlbnRfaG91cicpO1xyXG4gICAgICAgICAgICBpZiAoalF1ZXJ5KCcudGltZV9lbGVtJykubGVuZ3RoID09PSAxICYmIHNlbGYuSklzQXR0cmFjdGlvbigpKSB7XHJcbiAgICAgICAgICAgICAgICBldmlIb3VyID0gJ25vbmUnO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHNlbGYuc2VsZWN0ZWRFdmVudERhdGEgPSB7XHJcbiAgICAgICAgICAgICAgICAnZXZlbnRfZGF0ZSc6IGpRdWVyeSh0aGlzKS5hdHRyKCdldmVudF9kYXRlJyksXHJcbiAgICAgICAgICAgICAgICAnZXZlbnRfbG9jYXRpb24nOiBqUXVlcnkoJy5zaG93X2xvY2F0aW9uJykuaHRtbCgpLFxyXG4gICAgICAgICAgICAgICAgJ2V2ZW50X3RpbWUnOiBldmlIb3VyLFxyXG4gICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgalF1ZXJ5KCcudGltZV9lbGVtJykucmVtb3ZlQ2xhc3MoJ3RpbWVfZWxlbV9hY3RpdmUnKTtcclxuICAgICAgICAgICAgalF1ZXJ5KHRoaXMpLmFkZENsYXNzKCd0aW1lX2VsZW1fYWN0aXZlJyk7XHJcbiAgICAgICAgICAgIGlmIChqUXVlcnkoJy50aW1lX2VsZW0nKS5sZW5ndGggPT09IDEpIHtcclxuICAgICAgICAgICAgICAgIHNlYW1sZXNzLmVsZW1lbnRTY3JvbGxJbnRvVmlldyhkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuZXZlbnRfc2VsZWN0aW9uX3RpY2tldCcpLCB7XHJcbiAgICAgICAgICAgICAgICAgICAgYmVoYXZpb3I6ICdzbW9vdGgnLFxyXG4gICAgICAgICAgICAgICAgICAgIGlubGluZTogJ2NlbnRlcicsXHJcbiAgICAgICAgICAgICAgICAgICAgYmxvY2s6ICdjZW50ZXInXHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHNlYW1sZXNzLmVsZW1lbnRTY3JvbGxJbnRvVmlldyhkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuYnBzbV93cmFwcGVyJyksIHtcclxuICAgICAgICAgICAgICAgICAgICBiZWhhdmlvcjogJ3Ntb290aCcsXHJcbiAgICAgICAgICAgICAgICAgICAgaW5saW5lOiAnY2VudGVyJyxcclxuICAgICAgICAgICAgICAgICAgICBibG9jazogJ2NlbnRlcidcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHNlbGYuc2Nyb2xsV2luZG93KCk7XHJcbiAgICAgICAgICAgIGlmIChzZWxmLkpJc0F0dHJhY3Rpb24oKSB8fCBzZWxmLkpab25lSW1hZ2UoKS5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICBzZWxmLnJlbmRlclRpY2tldFNlbGVjdG9yKHNlbGYuc2VsZWN0ZWRFdmVudElkKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHNlbGYucmVuZGVyU2VhdENoYXJ0KHNlbGYuc2VsZWN0ZWRFdmVudElkKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGxldCBkZWZfZXYgPSBzZWxmLmdldFBhcmFtZXRlckJ5TmFtZSgnZGVmX2V2Jyk7XHJcbiAgICAgICAgaWYgKGRlZl9ldiAhPT0gbnVsbCAmJiBkZWZfZXYgIT09ICcnKSB7XHJcbiAgICAgICAgICAgIGpRdWVyeSgnLnRpbWVfZWxlbVtldmVudF9pZD1cIicgKyBkZWZfZXYgKyAnXCJdJykudHJpZ2dlcignY2xpY2snKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBpZiAoKHNlbGYuSklzQXR0cmFjdGlvbigpIHx8IHNlbGYuSlpvbmVJbWFnZSgpLmxlbmd0aCA+IDApICYmIHAgPT09IDEpIHtcclxuICAgICAgICAgICAgICAgIGpRdWVyeSgnLnRpbWVfZWxlbScpLnRyaWdnZXIoJ2NsaWNrJyk7XHJcbiAgICAgICAgICAgICAgICBqUXVlcnkoJy5ldmVudF9zZWxlY3Rpb25fdGlja2V0Om5vdCgucmlzem9uZSknKS5oaWRlKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKCFzZWxmLkpJc0F0dHJhY3Rpb24oKSAmJiBwID09PSAxKSB7XHJcbiAgICAgICAgICAgICAgICBqUXVlcnkoJy50aW1lX2VsZW0nKS50cmlnZ2VyKCdjbGljaycpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgIH1cclxuXHJcblxyXG4gICAgdXBkYXRlUGFnZURlc2lnbihkYXRhKSB7XHJcbiAgICAgICAgLy9qUXVlcnkoJy5zaG93X2ltYWdlX3RpY2tldHMnKS5odG1sKGRhdGEuc2VhdF9pbWFnZSk7XHJcbiAgICAgICAgLy9qUXVlcnkoJy5zaG93X2Rlc2NyaXB0aW9uX3RpY2tldHMnKS5odG1sKGRhdGEuc2VhdF90ZXh0KTtcclxuICAgICAgICAvL2pRdWVyeSgnLmZsYXRfY2FsZW5kYXInKS5odG1sKCc8aW5wdXQgdHlwZT1cInRleHRcIiBuYW1lPVwiZmxhdF9jYWxlbmRhclwiIGlkPVwiZmxhdF9jYWxlbmRhclwiIHN0eWxlPVwiZGlzcGxheTpub25lXCI+Jyk7XHJcbiAgICAgICAgLy9qUXVlcnkoJy5zaG93X2J0bl90aWNrZXRzJykuaHRtbCgnPGEgaHJlZj1cIicgKyBkYXRhLmV2ZW50X3VybCArICdcIiBjbGFzcz1cImJ1dHRvbiBidG5cIj4nICsgZGF0YS5ldmVudF91cmxfdGV4dCArICc8L2E+Jyk7XHJcbiAgICAgICAgdGhpcy5maXJzdERhdGVXaXRoRXZlbnQgPSBmYWxzZTtcclxuICAgICAgICBsZXQgc2VsZiA9IHRoaXM7XHJcbiAgICAgICAgbGV0IHRvZGF5ID0gRGF0ZS5ub3coKTtcclxuICAgICAgICB0b2RheSA9IHRvZGF5ICsgKG5ldyBEYXRlKCkpLmdldFRpbWV6b25lT2Zmc2V0KCkgKiA2MCAqIDEwMDAgLSB0b2RheSAlICgzNjAwICogMTAwMCAqIDI0KTtcclxuICAgICAgICBsZXQgbWluVGltZSA9IDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwO1xyXG4gICAgICAgIC8vdG9kYXkuc2V0VGltZS
8443h0b2RheS5nZXRUaW1lKCkgKyB0b2RheS5nZXRUaW1lem9uZUluTWlsaXNlY29uZHModG9kYXkpKTtcclxuICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiB0aGlzLmV2ZW50TGlzdCkge1xyXG4gICAgICAgICAgICBsZXQgc3RhcnRfZGF0ZSA9IHNlbGYucGFja1N0YXJ0RGF0ZSgpO1xyXG4gICAgICAgICAgICBsZXQgZW5kX2RhdGUgPSBzZWxmLnBhY2tFbmREYXRlKCk7XHJcbiAgICAgICAgICAgIGxldCBjRGF0ZSA9IHNlbGYuY3JlYXRlRGF0ZUFzVVRDKG5ldyBEYXRlKGtleS5yZXBsYWNlKC8tL2csIFwiL1wiKSArIFwiIDAwOjAwOjAwXCIpKTtcclxuICAgICAgICAgICAgY0RhdGUuc2V0VGltZShjRGF0ZS5nZXRUaW1lKCkgKyBzZWxmLmdldFRpbWV6b25lSW5NaWxpc2Vjb25kcyhjRGF0ZSkpO1xyXG5cclxuICAgICAgICAgICAgaWYgKHNlbGYuY29tcGFyZV9hc2MoY0RhdGUuZ2V0VGltZSgpLCB0b2RheSkgPj0gMCAmJiBtaW5UaW1lID4gY0RhdGUuZ2V0VGltZSgpKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoc3RhcnRfZGF0ZSAhPT0gZmFsc2UgJiYgZW5kX2RhdGUgIT09IGZhbHNlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYuY29tcGFyZV9hc2MoY0RhdGUuZ2V0VGltZSgpLCBzdGFydF9kYXRlLmdldFRpbWUoKSArIHNlbGYuZ2V0VGltZXpvbmVJbk1pbGlzZWNvbmRzKHN0YXJ0X2RhdGUpKSA+PSAwICYmIHNlbGYuY29tcGFyZV9hc2MoY0RhdGUuZ2V0VGltZSgpLCBlbmRfZGF0ZS5nZXRUaW1lKCkgKyBzZWxmLmdldFRpbWV6b25lSW5NaWxpc2Vjb25kcyhlbmRfZGF0ZSkpIDw9IDApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbWluVGltZSA9IGNEYXRlLmdldFRpbWUoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5maXJzdERhdGVXaXRoRXZlbnQgPSBjRGF0ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy9icmVhaztcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIG1pblRpbWUgPSBjRGF0ZS5nZXRUaW1lKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5maXJzdERhdGVXaXRoRXZlbnQgPSBjRGF0ZTtcclxuICAgICAgICAgICAgICAgICAgICAvL2JyZWFrO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5jcmVhdGVDYWxlbmRhcigpO1xyXG4gICAgICAgIGlmIChzZWxmLmlzUGFjaygpKSB7XHJcbiAgICAgICAgICAgIGpRdWVyeSgnLmJwYWNrc2VhdHMnKS5zaG93KCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBsZXQgZGVmX2RhdGUgPSBzZWxmLmdldFBhcmFtZXRlckJ5TmFtZSgnZGVmX2RhdGUnKTtcclxuICAgICAgICBpZiAoZGVmX2RhdGUgIT09IG51bGwgJiYgZGVmX2RhdGUgIT09ICcnKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY2FsZW5kYXIuc2V0RGF0ZShkZWZfZGF0ZSwgdHJ1ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJlbmRlckV2ZW50c0NvbXBsZXRlZChyZXNwb25zZSkge1xyXG5cclxuICAgICAgICBpZiAocmVzcG9uc2Uuc3VjY2VzcyA9PT0gdHJ1ZSkge1xyXG4gICAgICAgICAgICBqUXVlcnkoJ2JvZHknKS5Mb2FkaW5nT3ZlcmxheShcImhpZGVcIik7XHJcbiAgICAgICAgICAgIHRoaXMuZXZlbnRMaXN0ID0gcmVzcG9uc2UuZXZlbnRzO1xyXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVBhZ2VEZXNpZ24ocmVzcG9uc2UpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIFN3YWwuZmlyZSh7XHJcbiAgICAgICAgICAgICAgICB0aXRsZTogJ0Vycm9yIScsXHJcbiAgICAgICAgICAgICAgICB0ZXh0OiAnVGhlcmUgd2FzIGFuIGVycm9yIHJlbmRlcmluZyB0aGUgZXZlbnRzLiBUaGUgcGFnZSB3aWxsIG5vdyByZWZyZXNoJyxcclxuICAgICAgICAgICAgICAgIGljb246ICdlcnJvcicsXHJcbiAgICAgICAgICAgICAgICBjb25maXJtQnV0dG9uVGV4dDogJ09LJyxcclxuICAgICAgICAgICAgICAgIGNsb3NlT25Db25maXJtOiB0cnVlLFxyXG4gICAgICAgICAgICB9KS50aGVuKChyZXN1bHQpID0+IHtcclxuICAgICAgICAgICAgICAgIC8qIFJlYWQgbW9yZSBhYm91dCBpc0NvbmZpcm1lZCwgaXNEZW5pZWQgYmVsb3cgKi9cclxuICAgICAgICAgICAgICAgIGlmIChyZXN1bHQuaXNDb25maXJtZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICB3aW5kb3cubG9jYXRpb24uaHJlZiA9IHdpbmRvdy5sb2NhdGlvbi5ocmVmO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChyZXN1bHQuaXNEZW5pZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICAvL1N3YWwuZmlyZSgnQ2hhbmdlcyBhcmUgbm90IHNhdmVkJywgJycsICdpbmZvJylcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGluaXRTZWF0c01hcCgpIHtcclxuICAgICAgICB0aGlzLnJlbmRlckV2ZW50cygpO1xyXG4gICAgfVxyXG5cclxuICAgIGJ1eVRpY2tldHNBY3Rpb24oKSB7XHJcbiAgICAgICAgdGhpcy5KQnV5VGlja2V0cygpLmF0dHIoJ2hyZWYnLCBqUXVlcnkoJyN1cmxfc2VhdHMnKS5hdHRyKCd1cmwnKSk7XHJcbiAgICB9XHJcblxyXG4gICAgaGlkZVF0eUFkZFRvQ2FydCgpIHtcclxuICAgICAgICB0aGlzLkpGb3JtKCkuZmluZCgnLnNpbmdsZV9hZGRfdG9fY2FydF9idXR0b24gJykuaGlkZSgpO1xyXG4gICAgICAgIHRoaXMuSkZvcm0oKS5maW5kKCcuc2luZ2xlX2FkZF90b19jYXJ0X2J1dHRvbiAnKS5wcmV2KCkuaGlkZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qW1xyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAnY2F0ZWdvcnknOiAncmVkJywgJ3RpY2tldFR5cGVzJzogW1xyXG4gICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgJ3RpY2tldFR5cGUnOiAnYWR1bHQnLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAncHJpY2UnOiAzMCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgJ2xhYmVsJzogJ0ZvciBhZHVsdHMnLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAnZGVzY3JpcHRpb24nOiAnSW5jbHVkZXMgaG90IG1lYWwgYW5kIGEgZHJpbmsnXHJcbiAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICd0aWNrZXRUeXBlJzogJ2NoaWxkJyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgJ3ByaWNlJzogMjAsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICdsYWJlbCc6ICdGb3IgY2hpbGRyZW4nLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAnZGVzY3JpcHRpb24nOiAnSW5jbHVkZXMgYnVyZ2VyIGFuZCBmcmllcydcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBdXHJcbiAgICAgICAgICAgI
8443H1cclxuICAgICAgICBdXHJcbiAgICAgICAgICAgIFtcclxuICAgICAgICAgICAge2tleTogJ3JlZCcsIGNvbG9yOiAncmVkJywgbGFiZWw6ICdDYXRlZ29yeSAxJywgYWNjZXNzaWJsZTogdHJ1ZX0sXHJcbiAgICAgICAgICAgICAgICB7a2V5OiAnYmx1ZScsIGNvbG9yOiAnYmx1ZScsIGxhYmVsOiAnQ2F0ZWdvcnkgMid9XHJcbiAgICAgICAgICAgIF1cclxuICAgICAgICAgICAgWydyZWQnXVxyXG4gICAgICAgICAgICAqL1xyXG5cclxuICAgIC8qXHJcbiAgIHtcclxuICAgICAgICAgICAgICAgJzEwMS1BLTEnOiAncmVkJyxcclxuICAgICAgICAgICAgICAgJzEwMS1BLTInOiAncmVkJyxcclxuICAgICAgICAgICB9XHJcbiAgICAqL1xyXG5cclxuICAgIG9wYWNpdHlUb0hleChoZXhDb2RlKSB7XHJcbiAgICAgICAgLy9yZXR1cm4gaGV4Q29kZSArICc0RCc7XHJcbiAgICB9XHJcblxyXG4gICAgY29kZUFycmF5KCkge1xyXG4gICAgICAgIHJldHVybiBbXHJcbiAgICAgICAgICAgICcjNjQ5NUVEJywgJyNERTMxNjMnLCAnI0ZGQkYwMCcsICcjNjgwMDkzJyxcclxuICAgICAgICAgICAgJyM5RkUyQkYnLCAnI0ZGN0Y1MCcsICcjQ0NDQ0ZGJywgJyNmZmI2YzEnLFxyXG4gICAgICAgICAgICAnI2ZhODA3MicsICcjODAwMDgwJywgJyMyMGIyYWEnLCAnIzA4OGRhNScsXHJcbiAgICAgICAgICAgICcjZTY4YWJjJywgJyNiZjQ5NzQnLCAnI2Y4MjFmNicsICcjZTJkZTgyJ1xyXG4gICAgICAgIF07XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0UHJpY2luZ0NhdGVnb3JpZXNBbmRDYXRlZ29yaWVzTGFiZWxzQW5kVW5hdmFpbGFibGVDYXRlZ29yaWVzQW5kU2VhdExhYmVsc0NhdGVnb3JpZXNBenVyZSgpIHtcclxuICAgICAgICBsZXQgY2F0ZWdvcmllcyA9IFtdO1xyXG4gICAgICAgIGxldCBzZWxmID0gdGhpcztcclxuICAgICAgICBzZWxmLnVzZWRQcmljZUxldmVsSWRzID0gW107XHJcbiAgICAgICAgY2F0ZWdvcmllc1sndW5hdmFpbGFibGVfY2F0ZWdvcmllcyddID0gW107XHJcbiAgICAgICAgLy9jYXRlZ29yaWVzWydhdmFpbGFibGVfY2F0ZWdvcmllcyddID0gW107XHJcbiAgICAgICAgY2F0ZWdvcmllc1snY2F0ZWdvcmllc19sYWJlbHMnXSA9IFtdO1xyXG4gICAgICAgIGNhdGVnb3JpZXNbJ3NlYXRfbGFiZWxzX2NhdGVnb3JpZXMnXSA9IFtdO1xyXG4gICAgICAgIGNhdGVnb3JpZXNbJ3ByaWNpbmdfY2F0ZWdvcmllcyddID0gW107XHJcbiAgICAgICAgbGV0IHNlbGVjdGVkUHJpY2VMZXZlbElkcyA9IGZhbHNlO1xyXG4gICAgICAgIGxldCBzZWxlY3RlZEhvbGRTdWJjbGFzc0lkID0gZmFsc2U7XHJcbiAgICAgICAgbGV0IHNlbGVjdGVkVGFnc0lkID0gZmFsc2U7XHJcbiAgICAgICAgaWYgKHNlbGYuc2VsZWN0ZWRQcm9tb0NvZGUgIT09IGZhbHNlKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHR5cGUgPSBzZWxmLnNlbGVjdGVkUHJvbW9Db2RlWydsaW1pdFR5cGUnXTtcclxuICAgICAgICAgICAgaWYgKHR5cGUgPT09ICdQcmljZUxldmVsJykge1xyXG4gICAgICAgICAgICAgICAgc2VsZWN0ZWRQcmljZUxldmVsSWRzID0gc2VsZi5zZWxlY3RlZFByb21vQ29kZVsncHJpY2VMZXZlbElkcyddO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAodHlwZSA9PT0gJ0hvbGQnKSB7XHJcbiAgICAgICAgICAgICAgICBzZWxlY3RlZEhvbGRTdWJjbGFzc0lkID0gc2VsZi5zZWxlY3RlZFByb21vQ29kZVsnaG9sZFN1YmNsYXNzSWQnXTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKHR5cGUgPT09ICdUYWcnKSB7XHJcbiAgICAgICAgICAgICAgICBzZWxlY3RlZFRhZ3NJZCA9IHNlbGYuc2VsZWN0ZWRQcm9tb0NvZGVbJ3RhZ0lkcyddO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgc2VsZWN0ZWRQcmljZUxldmVsSWRzID0gc2VsZi5nZXRQcmljZUxldmVsSWRzKCk7XHJcbiAgICAgICAgICAgIHNlbGVjdGVkSG9sZFN1YmNsYXNzSWQgPSBzZWxmLmdldFN1YmhvbGRJZHMoKTtcclxuICAgICAgICAgICAgc2VsZWN0ZWRUYWdzSWQgPSBzZWxmLmdldFRhZ0lkcygpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBsZXQgY2F0ZWdvcmllc19wcmljaW5nID0gW107XHJcbiAgICAgICAgbGV0IGNhdGVnb3JpZXNfbGFiZWxzID0gW107XHJcbiAgICAgICAgc2VsZi50aWNrZXRUeXBlQWxsID0gZmFsc2U7XHJcblxyXG4gICAgICAgIGxldCB0aWNrZXRUeXBlcyA9IFtdO1xyXG4gICAgICAgIGxldCBzZWxlY3RlZFByb21vQ29kZUVsZW1lbnRBbmRVc2VkQmxvY2tzID0gc2VsZi5nZXRQcmljZUJsb2Nrc0FuZFVzZWRCbG9ja3MoKTtcclxuICAgICAgICBsZXQgc2VsZWN0ZWRQcm9tb0NvZGVFbGVtZW50ID0gc2VsZWN0ZWRQcm9tb0NvZGVFbGVtZW50QW5kVXNlZEJsb2Nrcy5wcmljZUJsb2NrO1xyXG4gICAgICAgIHNlbGYudXNlZEJsb2NrcyA9IHNlbGVjdGVkUHJvbW9Db2RlRWxlbWVudEFuZFVzZWRCbG9ja3MudXNlQmxvY2s7XHJcbiAgICAgICAgbGV0IHBvID0gMDtcclxuICAgICAgICBsZXQgcHJpY2VCbG9ja0FyciA9IHNlbGYub2JqZWN0VG9BcnJheShzZWxlY3RlZFByb21vQ29kZUVsZW1lbnQpO1xyXG4gICAgICAgIC8vaWYgKCFzZWxmLmlzUGFjaygpKSB7XHJcbiAgICAgICAgcHJpY2VCbG9ja0Fyci5zb3J0KHNlbGYuY29tcGFyZVByaWNlQmxvY2tzUGFjayk7XHJcbiAgICAgICAgLy99IGVsc2Uge1xyXG4gICAgICAgIC8vcHJpY2VCbG9ja0Fyci5zb3J0KHNlbGYuY29tcGFyZVByaWNlQmxvY2tzKTtcclxuICAgICAgICAvL31cclxuXHJcbiAgICAgICAgbGV0IHNlYXRfbGFiZWxzX2NhdGVnb3JpZXMgPSBbXTtcclxuICAgICAgICBsZXQgb2JqZWN0X2NhdGVnb3JpZXMgPSBbXTtcclxuICAgICAgICBmb3IgKGNvbnN0IGtleVNlYXRzIGluIHNlbGYuZXZlbnRTZWF0cykge1xyXG4gICAgICAgICAgICBpZiAoc2VsZWN0ZWRQcmljZUxldmVsSWRzICE9PSBmYWxzZSkge1xyXG4gICAgICAgICAgICAgICAgbGV0IGlzQ2F0ID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGkgaW4gc2VsZWN0ZWRQcmljZUxldmVsSWRzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYuZXZlbnRTZWF0c1trZXlTZWF0c11bJ3ByaWNlTGV2ZWxJZCddID09PSBzZWxlY3RlZFByaWNlTGV2ZWxJZHNbaV0pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaXNDYXQgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBpZiAoaXNDYXQpIHtcclxuICAgICAgICAgICAgICAgICAgICAvL3NlYXRfbGFiZWxzX2NhdGVnb3JpZXNba2V5U2VhdHNdID0gXCJcIiArIHNlbGYuZXZlbnRTZWF0c1trZXlTZWF0c11bJ3ByaWNlTGV2ZWxJZCddOy8vc2VsZi5zZWxlY3RlZFByb21vQ29kZVsncHJpY2VCbG9ja3MnXVtzZWxmLmV2ZW50U2VhdHNba2V5U2VhdHNdWydwcmljZUxldmVsSWQnXV1bJ3ByaWNlTGV2ZWxOYW1lJ107XHJcbiAgICAgICAgICAgICAgICAgICAgc2VhdF9sYWJlbHNfY2F0ZWdvcmllcy5wdXNoKHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWQ6IGtleVNlYXRzLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjYXRlZ29yeUlkOiBcIlwiICsgc2VsZi5ldmVudFNlYXRzW2tleVNlYXRzXVsncHJpY2VMZXZlbElkJ10sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsOiBrZXlTZWF0cyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzSWQ6ICdhY3RpdmUnLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBkaXNhYmlsaXR5OiBmYWxzZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgYWxlcnQ6ICcnLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBnYToge21heDogMCwgY3VycmVudDogMH1cclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICBzZWxmLnVzZWRQcmljZUxldmVsSWRzLnB1c2goc2VsZi5ldmVudFNlYXRzW2tleVNlYXRzXVsncHJpY2VMZXZlbElkJ10pO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgI
8443H1cclxuXHJcbiAgICAgICAgICAgIGlmIChzZWxlY3RlZFRhZ3NJZCAhPT0gZmFsc2UpIHtcclxuICAgICAgICAgICAgICAgIGxldCBpc0NhdCA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBpIGluIHNlbGVjdGVkVGFnc0lkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYuZXZlbnRTZWF0c1trZXlTZWF0c11bJ3RhZ0lkJ10gPT09IHNlbGVjdGVkVGFnc0lkW2ldKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlzQ2F0ID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYgKGlzQ2F0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy9zZWF0X2xhYmVsc19jYXRlZ29yaWVzW2tleVNlYXRzXSA9IFwiXCIgKyBzZWxmLmV2ZW50U2VhdHNba2V5U2VhdHNdWydwcmljZUxldmVsSWQnXTsvL3NlbGYuc2VsZWN0ZWRQcm9tb0NvZGVbJ3ByaWNlQmxvY2tzJ11bc2VsZi5ldmVudFNlYXRzW2tleVNlYXRzXVsncHJpY2VMZXZlbElkJ11dWydwcmljZUxldmVsTmFtZSddO1xyXG4gICAgICAgICAgICAgICAgICAgIHNlYXRfbGFiZWxzX2NhdGVnb3JpZXMucHVzaCh7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlkOiBrZXlTZWF0cyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2F0ZWdvcnlJZDogXCJcIiArIHNlbGYuZXZlbnRTZWF0c1trZXlTZWF0c11bJ3ByaWNlTGV2ZWxJZCddLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBsYWJlbDoga2V5U2VhdHMsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1c0lkOiAnYWN0aXZlJyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgZGlzYWJpbGl0eTogZmFsc2UsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGFsZXJ0OiAnJyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgZ2E6IHttYXg6IDAsIGN1cnJlbnQ6IDB9XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgc2VsZi51c2VkUHJpY2VMZXZlbElkcy5wdXNoKHNlbGYuZXZlbnRTZWF0c1trZXlTZWF0c11bJ3ByaWNlTGV2ZWxJZCddKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcblxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoc2VsZWN0ZWRIb2xkU3ViY2xhc3NJZCAhPT0gZmFsc2UpIHtcclxuICAgICAgICAgICAgICAgIGxldCBpc0NhdCA9IGZhbHNlO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmIChzZWxmLmV2ZW50U2VhdHNba2V5U2VhdHNdWydob2xkU3ViY2xhc3NJZCddID09PSBzZWxlY3RlZEhvbGRTdWJjbGFzc0lkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaXNDYXQgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYgKGlzQ2F0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy9zZWF0X2xhYmVsc19jYXRlZ29yaWVzW2tleVNlYXRzXSA9IFwiXCIgKyBzZWxmLmV2ZW50U2VhdHNba2V5U2VhdHNdWydwcmljZUxldmVsSWQnXTsvL3NlbGYuc2VsZWN0ZWRQcm9tb0NvZGVbJ3ByaWNlQmxvY2tzJ11bc2VsZi5ldmVudFNlYXRzW2tleVNlYXRzXVsncHJpY2VMZXZlbElkJ11dWydwcmljZUxldmVsTmFtZSddO1xyXG4gICAgICAgICAgICAgICAgICAgIHNlYXRfbGFiZWxzX2NhdGVnb3JpZXMucHVzaCh7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlkOiBrZXlTZWF0cyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2F0ZWdvcnlJZDogXCJcIiArIHNlbGYuZXZlbnRTZWF0c1trZXlTZWF0c11bJ3ByaWNlTGV2ZWxJZCddLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBsYWJlbDoga2V5U2VhdHMsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1c0lkOiAnYWN0aXZlJyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgZGlzYWJpbGl0eTogZmFsc2UsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGFsZXJ0OiAnJyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgZ2E6IHttYXg6IDAsIGN1cnJlbnQ6IDB9XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgc2VsZi51c2VkUHJpY2VMZXZlbElkcy5wdXNoKHNlbGYuZXZlbnRTZWF0c1trZXlTZWF0c11bJ3ByaWNlTGV2ZWxJZCddKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcblxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vZ2FTZWN0aW9uc1xyXG5cclxuICAgICAgICBmb3IgKGNvbnN0IGtleVNlYXRzIGluIHNlbGYuZXZlbnRTZWN0aW9ucykge1xyXG4gICAgICAgICAgICBpZiAoc2VsZWN0ZWRQcmljZUxldmVsSWRzICE9PSBmYWxzZSkge1xyXG4gICAgICAgICAgICAgICAgbGV0IGlzQ2F0ID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGkgaW4gc2VsZWN0ZWRQcmljZUxldmVsSWRzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYuZXZlbnRTZWN0aW9uc1trZXlTZWF0c11bJ3ByaWNlTGV2ZWxJRCddID09PSBzZWxlY3RlZFByaWNlTGV2ZWxJZHNbaV0pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaXNDYXQgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBpZiAoaXNDYXQpIHtcclxuICAgICAgICAgICAgICAgICAgICAvL3NlYXRfbGFiZWxzX2NhdGVnb3JpZXNbc2VsZi5ldmVudFNlY3Rpb25zW2tleVNlYXRzXVsna2V5J11dID0gXCJcIiArIHNlbGYuZXZlbnRTZWN0aW9uc1trZXlTZWF0c11bJ3ByaWNlTGV2ZWxJRCddOy8vc2VsZi5zZWxlY3RlZFByb21vQ29kZVsncHJpY2VCbG9ja3MnXVtzZWxmLmV2ZW50U2VhdHNba2V5U2VhdHNdWydwcmljZUxldmVsSWQnXV1bJ3ByaWNlTGV2ZWxOYW1lJ107XHJcbiAgICAgICAgICAgICAgICAgICAgc2VhdF9sYWJlbHNfY2F0ZWdvcmllcy5wdXNoKHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWQ6IHNlbGYuZXZlbnRTZWN0aW9uc1trZXlTZWF0c11bJ2tleSddLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjYXRlZ29yeUlkOiBcIlwiICsgc2VsZi5ldmVudFNlY3Rpb25zW2tleVNlYXRzXVsncHJpY2VMZXZlbElEJ10sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsOiBzZWxmLmV2ZW50U2VjdGlvbnNba2V5U2VhdHNdWydrZXknXSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzSWQ6ICdhY3RpdmUnLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBkaXNhYmlsaXR5OiBmYWxzZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgYWxlcnQ6ICcnLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBnYToge21heDogc2VsZi5ldmVudFNlY3Rpb25zW2tleVNlYXRzXVsnYXZhaWxhYmxlUXVhbnRpdHknXSwgY3VycmVudDogMH1cclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgb2JqZWN0X2NhdGVnb3JpZXNbc2VsZi5ldmVudFNlY3Rpb25zW2tleVNlYXRzXVsna2V5J11dID0gc2VsZi5ldmVudFNlY3Rpb25zW2tleVNlYXRzXVsnYXZhaWxhYmxlUXVhbnRpdHknXTtcclxuICAgICAgICAgICAgICAgICAgICBzZWxmLnVzZWRQcmljZUxldmVsSWRzLnB1c2goc2VsZi5ldmVudFNlY3Rpb25zW2tleVNlYXRzXVsncHJpY2VMZXZlbElEJ10pO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgI
8443H1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKHNlbGVjdGVkVGFnc0lkICE9PSBmYWxzZSkge1xyXG4gICAgICAgICAgICAgICAgbGV0IGlzQ2F0ID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGkgaW4gc2VsZWN0ZWRUYWdzSWQpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5ldmVudFNlY3Rpb25zW2tleVNlYXRzXVsndGFnSWQnXSA9PT0gc2VsZWN0ZWRUYWdzSWRbaV0pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaXNDYXQgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBpZiAoaXNDYXQpIHtcclxuICAgICAgICAgICAgICAgICAgICAvL3NlYXRfbGFiZWxzX2NhdGVnb3JpZXNbc2VsZi5ldmVudFNlY3Rpb25zW2tleVNlYXRzXVsna2V5J11dID0gXCJcIiArIHNlbGYuZXZlbnRTZWN0aW9uc1trZXlTZWF0c11bJ3ByaWNlTGV2ZWxJRCddOy8vc2VsZi5zZWxlY3RlZFByb21vQ29kZVsncHJpY2VCbG9ja3MnXVtzZWxmLmV2ZW50U2VjdGlvbnNba2V5U2VhdHNdWydwcmljZUxldmVsSWQnXV1bJ3ByaWNlTGV2ZWxOYW1lJ107XHJcbiAgICAgICAgICAgICAgICAgICAgc2VhdF9sYWJlbHNfY2F0ZWdvcmllcy5wdXNoKHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWQ6IHNlbGYuZXZlbnRTZWN0aW9uc1trZXlTZWF0c11bJ2tleSddLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjYXRlZ29yeUlkOiBcIlwiICsgc2VsZi5ldmVudFNlY3Rpb25zW2tleVNlYXRzXVsncHJpY2VMZXZlbElEJ10sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsOiBzZWxmLmV2ZW50U2VjdGlvbnNba2V5U2VhdHNdWydrZXknXSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzSWQ6ICdhY3RpdmUnLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBkaXNhYmlsaXR5OiBmYWxzZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgYWxlcnQ6ICcnLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBnYToge21heDogc2VsZi5ldmVudFNlY3Rpb25zW2tleVNlYXRzXVsnYXZhaWxhYmxlUXVhbnRpdHknXSwgY3VycmVudDogMH1cclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICBvYmplY3RfY2F0ZWdvcmllc1tzZWxmLmV2ZW50U2VjdGlvbnNba2V5U2VhdHNdWydrZXknXV0gPSBzZWxmLmV2ZW50U2VjdGlvbnNba2V5U2VhdHNdWydhdmFpbGFibGVRdWFudGl0eSddO1xyXG4gICAgICAgICAgICAgICAgICAgIHNlbGYudXNlZFByaWNlTGV2ZWxJZHMucHVzaChzZWxmLmV2ZW50U2VjdGlvbnNba2V5U2VhdHNdWydwcmljZUxldmVsSUQnXSk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG5cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKHNlbGVjdGVkSG9sZFN1YmNsYXNzSWQgIT09IGZhbHNlKSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgaXNDYXQgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoc2VsZi5ldmVudFNlY3Rpb25zW2tleVNlYXRzXVsnaG9sZFN1YmNsYXNzSWQnXSA9PT0gc2VsZWN0ZWRIb2xkU3ViY2xhc3NJZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlzQ2F0ID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmIChpc0NhdCkge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vc2VhdF9sYWJlbHNfY2F0ZWdvcmllc1tzZWxmLmV2ZW50U2VjdGlvbnNba2V5U2VhdHNdWydrZXknXV0gPSBcIlwiICsgc2VsZi5ldmVudFNlY3Rpb25zW2tleVNlYXRzXVsncHJpY2VMZXZlbElEJ107Ly9zZWxmLnNlbGVjdGVkUHJvbW9Db2RlWydwcmljZUJsb2NrcyddW3NlbGYuZXZlbnRTZWN0aW9uc1trZXlTZWF0c11bJ3ByaWNlTGV2ZWxJZCddXVsncHJpY2VMZXZlbE5hbWUnXTtcclxuICAgICAgICAgICAgICAgICAgICBzZWF0X2xhYmVsc19jYXRlZ29yaWVzLnB1c2goe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZDogc2VsZi5ldmVudFNlY3Rpb25zW2tleVNlYXRzXVsna2V5J10sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhdGVnb3J5SWQ6IFwiXCIgKyBzZWxmLmV2ZW50U2VjdGlvbnNba2V5U2VhdHNdWydwcmljZUxldmVsSUQnXSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw6IHNlbGYuZXZlbnRTZWN0aW9uc1trZXlTZWF0c11bJ2tleSddLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXNJZDogJ2FjdGl2ZScsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRpc2FiaWxpdHk6IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBhbGVydDogJycsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGdhOiB7bWF4OiBzZWxmLmV2ZW50U2VjdGlvbnNba2V5U2VhdHNdWydhdmFpbGFibGVRdWFudGl0eSddLCBjdXJyZW50OiAwfVxyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgIG9iamVjdF9jYXRlZ29yaWVzW3NlbGYuZXZlbnRTZWN0aW9uc1trZXlTZWF0c11bJ2tleSddXSA9IHNlbGYuZXZlbnRTZWN0aW9uc1trZXlTZWF0c11bJ2F2YWlsYWJsZVF1YW50aXR5J107XHJcbiAgICAgICAgICAgICAgICAgICAgc2VsZi51c2VkUHJpY2VMZXZlbElkcy5wdXNoKHNlbGYuZXZlbnRTZWN0aW9uc1trZXlTZWF0c11bJ3ByaWNlTGV2ZWxJRCddKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcblxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBmb3IgKGxldCBpMSA9IDA7IGkxIDwgcHJpY2VCbG9ja0Fyci5sZW5ndGg7IGkxKyspIHtcclxuICAgICAgICAgICAgY29uc3Qga2V5UHJpY2UgPSBwcmljZUJsb2NrQXJyW2kxXVswXTtcclxuICAgICAgICAgICAgLy9jb25zdCB2YWx1ZSA9IHByaWNlQmxvY2tBcnJbaTFdWzFdO1xyXG4gICAgICAgICAgICBpZiAoc2VsZi51c2VkUHJpY2VMZXZlbElkcyAhPT0gZmFsc2UgJiYgc2VsZi5pbkFycmF5KHNlbGYudXNlZFByaWNlTGV2ZWxJZHMsIHNlbGVjdGVkUHJvbW9Db2RlRWxlbWVudFtrZXlQcmljZV1bJ3ByaWNlTGV2ZWxJZCddKSkge1xyXG5cclxuICAgICAgICAgICAgICAgIGxldCB0aWNrZXRUeXBlID0gW107XHJcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHRpY2tldFR5cGVzW3NlbGVjdGVkUHJvbW9Db2RlRWxlbWVudFtrZXlQcmljZV1bJ3ByaWNlTGV2ZWxJZCddXSAhPT0gJ3VuZGVmaW5lZCcpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aWNrZXRUeXBlID0gdGlja2V0VHlwZXNbc2VsZWN0ZWRQcm9tb0NvZGVFbGVtZW50W2tleVByaWNlXVsncHJpY2VMZXZlbElkJ11dO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgbGV0IHRpY2tldFR5cGVTaW5ndWxhciA9IHt9O1xyXG4gICAgICAgICAgICAgICAgdGlja2V0VHlwZVNpbmd1bGFyWyd0aWNrZXRUeXBlJ10gPSBzZWxlY3RlZFByb21vQ29kZUVsZW1lbnRba2V5UHJpY2VdWydwcmljZVR5cGVOYW1lJ107XHJcbiAgICAgICAgICAgICAgICB0aWNrZXRUeXBlU2luZ3VsYXJbJ2xhYmVsJ10gPSBzZWxlY3RlZFByb21vQ29kZUVsZW1lbnRba2V5UHJpY2VdWydwcmljZVR5cGVOYW1lJ107XHJcbiAgICAgICAgICAgICAgICB0aWNrZXRUeXBlU2luZ3VsYXJbJ3ByaWNlJ10gPSBzZWxlY3RlZFByb21vQ29kZUVsZW1lbnRba2V5UHJpY2VdWydmdWxsUmV0YWlsUHJpY2UnXTtcclxuICAgICAgICAgICAgICAgI
8443HRpY2tldFR5cGUucHVzaCh0aWNrZXRUeXBlU2luZ3VsYXIpO1xyXG4gICAgICAgICAgICAgICAgdGlja2V0VHlwZXNbc2VsZWN0ZWRQcm9tb0NvZGVFbGVtZW50W2tleVByaWNlXVsncHJpY2VMZXZlbElkJ11dID0gdGlja2V0VHlwZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZm9yIChsZXQgaTEgPSAwOyBpMSA8IHByaWNlQmxvY2tBcnIubGVuZ3RoOyBpMSsrKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGtleVByaWNlID0gcHJpY2VCbG9ja0FycltpMV1bMF07XHJcbiAgICAgICAgICAgIC8vY29uc3QgdmFsdWUgPSBwcmljZUJsb2NrQXJyW2kxXVsxXTtcclxuICAgICAgICAgICAgaWYgKHNlbGYudXNlZFByaWNlTGV2ZWxJZHMgIT09IGZhbHNlICYmIHNlbGYuaW5BcnJheShzZWxmLnVzZWRQcmljZUxldmVsSWRzLCBzZWxlY3RlZFByb21vQ29kZUVsZW1lbnRba2V5UHJpY2VdWydwcmljZUxldmVsSWQnXSkpIHtcclxuXHJcbiAgICAgICAgICAgICAgICBsZXQgY2F0ZWdvcnlfcHJpY2luZyA9IHt9O1xyXG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB0aWNrZXRUeXBlc1tzZWxlY3RlZFByb21vQ29kZUVsZW1lbnRba2V5UHJpY2VdWydwcmljZUxldmVsSWQnXV0gIT09ICd1bmRlZmluZWQnICYmIHRpY2tldFR5cGVzW3NlbGVjdGVkUHJvbW9Db2RlRWxlbWVudFtrZXlQcmljZV1bJ3ByaWNlTGV2ZWxJZCddXS5sZW5ndGggPiAxKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY2F0ZWdvcnlfcHJpY2luZ1snY2F0ZWdvcnlJZCddID0gXCJcIiArIHNlbGVjdGVkUHJvbW9Db2RlRWxlbWVudFtrZXlQcmljZV1bJ3ByaWNlTGV2ZWxJZCddO1xyXG4gICAgICAgICAgICAgICAgICAgIGNhdGVnb3J5X3ByaWNpbmdbJ3RpY2tldFR5cGVzJ10gPSB0aWNrZXRUeXBlc1tzZWxlY3RlZFByb21vQ29kZUVsZW1lbnRba2V5UHJpY2VdWydwcmljZUxldmVsSWQnXV07XHJcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiB0aWNrZXRUeXBlc1tzZWxlY3RlZFByb21vQ29kZUVsZW1lbnRba2V5UHJpY2VdWydwcmljZUxldmVsSWQnXV0gIT09ICd1bmRlZmluZWQnICYmIHRpY2tldFR5cGVzW3NlbGVjdGVkUHJvbW9Db2RlRWxlbWVudFtrZXlQcmljZV1bJ3ByaWNlTGV2ZWxJZCddXS5sZW5ndGggPT09IDEpIHtcclxuICAgICAgICAgICAgICAgICAgICAvL2xldCB0aWNrZXRUeXBlU2luZ3VsYXIgPSB7fTtcclxuICAgICAgICAgICAgICAgICAgICBzZWxmLnRpY2tldFR5cGVBbGwgPSB0aWNrZXRUeXBlc1tzZWxlY3RlZFByb21vQ29kZUVsZW1lbnRba2V5UHJpY2VdWydwcmljZUxldmVsSWQnXV1bMF1bJ3RpY2tldFR5cGUnXTtcclxuICAgICAgICAgICAgICAgICAgICBjYXRlZ29yeV9wcmljaW5nWyduYW1lJ10gPSB0aWNrZXRUeXBlc1tzZWxlY3RlZFByb21vQ29kZUVsZW1lbnRba2V5UHJpY2VdWydwcmljZUxldmVsSWQnXV1bMF1bJ2xhYmVsJ107XHJcbiAgICAgICAgICAgICAgICAgICAgY2F0ZWdvcnlfcHJpY2luZ1sncHJpY2UnXSA9IHRpY2tldFR5cGVzW3NlbGVjdGVkUHJvbW9Db2RlRWxlbWVudFtrZXlQcmljZV1bJ3ByaWNlTGV2ZWxJZCddXVswXVsncHJpY2UnXTtcclxuICAgICAgICAgICAgICAgICAgICBjYXRlZ29yeV9wcmljaW5nWydjYXRlZ29yeUlkJ10gPSBcIlwiICsgc2VsZWN0ZWRQcm9tb0NvZGVFbGVtZW50W2tleVByaWNlXVsncHJpY2VMZXZlbElkJ107XHJcbiAgICAgICAgICAgICAgICAgICAgLy9jYXRlZ29yeV9wcmljaW5nWydjYXRlZ29yeSddID0gdGlja2V0VHlwZVNpbmd1bGFyO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGNhdGVnb3JpZXNfcHJpY2luZy5wdXNoKGNhdGVnb3J5X3ByaWNpbmcpO1xyXG5cclxuICAgICAgICAgICAgICAgIGxldCBjYXRlZ29yeV9sYWJlbCA9IHt9O1xyXG4gICAgICAgICAgICAgICAgY2F0ZWdvcnlfbGFiZWxbJ2NhdGVnb3J5SWQnXSA9IFwiXCIgKyBzZWxlY3RlZFByb21vQ29kZUVsZW1lbnRba2V5UHJpY2VdWydwcmljZUxldmVsSWQnXTsvL2NyZWF0ZSBhIG5ldyBjYXQgYmFzZWQgb24gYWRhVHlwZXNcclxuICAgICAgICAgICAgICAgIGNhdGVnb3J5X2xhYmVsWydjb2xvciddID0gXCJcIiArIHNlbGYuY29kZUFycmF5KClbcG9dO1xyXG4gICAgICAgICAgICAgICAgY2F0ZWdvcnlfbGFiZWxbJ25hbWUnXSA9IFwiXCIgKyBzZWxlY3RlZFByb21vQ29kZUVsZW1lbnRba2V5UHJpY2VdWydwcmljZUxldmVsTmFtZSddO1xyXG4gICAgICAgICAgICAgICAgY2F0ZWdvcnlfbGFiZWxbJ3N0YXR1cyddID0gJ2FjdGl2ZSc7XHJcbiAgICAgICAgICAgICAgICBjYXRlZ29yaWVzX2xhYmVscy5wdXNoKGNhdGVnb3J5X2xhYmVsKTtcclxuICAgICAgICAgICAgICAgIC8vY2F0ZWdvcmllc1snYXZhaWxhYmxlX2NhdGVnb3JpZXMnXS5wdXNoKGNhdGVnb3J5X2xhYmVsWydrZXknXSk7XHJcbiAgICAgICAgICAgICAgICBsZXQgY2F0ZWdvcnlfbGFiZWxfbm90ID0ge307XHJcbiAgICAgICAgICAgICAgICBjYXRlZ29yeV9sYWJlbF9ub3RbJ2tleSddID0gXCJub3RfYXZhaWxhYmxlXCIgKyBzZWxlY3RlZFByb21vQ29kZUVsZW1lbnRba2V5UHJpY2VdWydwcmljZUxldmVsSWQnXTsvL2NyZWF0ZSBhIG5ldyBjYXQgYmFzZWQgb24gYWRhVHlwZXNcclxuICAgICAgICAgICAgICAgIGNhdGVnb3J5X2xhYmVsX25vdFsnY29sb3InXSA9IFwiXCIgKyBzZWxmLmNvbnZlcnRIZXgoc2VsZi5jb2RlQXJyYXkoKVtwb10sIDMyKTtcclxuICAgICAgICAgICAgICAgIGNhdGVnb3J5X2xhYmVsX25vdFsnbGFiZWwnXSA9IFwiTm90IEF2YWlsYWJsZVwiO1xyXG4gICAgICAgICAgICAgICAgY2F0ZWdvcmllc1sndW5hdmFpbGFibGVfY2F0ZWdvcmllcyddLnB1c2goY2F0ZWdvcnlfbGFiZWxfbm90WydrZXknXSk7XHJcbiAgICAgICAgICAgICAgICAvL2NhdGVnb3JpZXNfbGFiZWxzLnB1c2goY2F0ZWdvcnlfbGFiZWxfbm90KTtcclxuICAgICAgICAgICAgICAgIHBvKys7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNhdGVnb3JpZXNbJ3NlYXRfbGFiZWxzX2NhdGVnb3JpZXMnXSA9IHNlYXRfbGFiZWxzX2NhdGVnb3JpZXM7XHJcbiAgICAgICAgc2VsZi5ldmVudFNlY3Rpb25zQ2FwYWNpdHkgPSBvYmplY3RfY2F0ZWdvcmllcztcclxuICAgICAgICBjYXRlZ29yaWVzWydvYmplY3RfY2F0ZWdvcmllcyddID0gb2JqZWN0X2NhdGVnb3JpZXM7XHJcbiAgICAgICAgY2F0ZWdvcmllc1sncHJpY2luZ19jYXRlZ29yaWVzJ10gPSBjYXRlZ29yaWVzX3ByaWNpbmc7XHJcbiAgICAgICAgY2F0ZWdvcmllc1snY2F0ZWdvcmllc19sYWJlbHMnXSA9IGNhdGVnb3JpZXNfbGFiZWxzO1xyXG5cclxuICAgICAgICByZXR1cm4gY2F0ZWdvcmllcztcclxuICAgIH1cclxuXHJcblxyXG4gICAgZ2V0UHJpY2luZ0NhdGVnb3JpZXNBbmRDYXRlZ29yaWVzTGFiZWxzQW5kVW5hdmFpbGFibGVDYXRlZ29yaWVzQW5kU2VhdExhYmVsc0NhdGVnb3JpZXMoKSB7XHJcbiAgICAgICAgbGV0IGNhdGVnb3JpZXMgPSBbXTtcclxuICAgICAgICBsZXQgc2VsZiA9IHRoaXM7XHJcbiAgICAgICAgc2VsZi51c2VkUHJpY2VMZXZlbElkcyA9IFtdO1xyXG4gICAgICAgIGNhdGVnb3JpZXNbJ3VuYXZhaWxhYmxlX2NhdGVnb3JpZXMnXSA9IFtdO1xyXG4gICAgICAgIC8vY2F0ZWdvcmllc1snYXZhaWxhYmxlX2NhdGVnb3JpZXMnXSA9IFtdO1xyXG4gICAgICAgIGNhdGVnb3JpZXNbJ2NhdGVnb3JpZXNfbGFiZWxzJ10gPSBbXTtcclxuICAgICAgICBjYXRlZ29yaWVzWydzZWF0X2xhYmVsc19jYXRlZ29yaWVzJ10gPSB7fTtcclxuICAgICAgICBjYXRlZ29yaWVzWydwcmljaW5nX2NhdGVnb3JpZXMnXSA9IFtdO1xyXG4gICAgICAgIGxldCBzZWxlY3RlZFByaWNlTGV2ZWxJZHMgPSBmYWxzZTtcclxuICAgICAgICBsZXQgc2VsZWN0ZWRIb2xkU3ViY2xhc3NJZCA9IGZhbHNlO1xyXG4gICAgICAgIGxldCBzZWxlY3RlZFRhZ3NJZCA9IGZhbHNlO1xyXG4gICAgICAgIGlmIChzZWxmLnNlbGVjdGVkUHJvbW9Db2RlICE9PSBmYWxzZSkge1xyXG4gICAgICAgICAgICBjb25zdCB0eXBlID0gc2VsZi5zZWxlY3RlZFByb21vQ29kZVsnbGltaXRUeXBlJ107XHJcbiAgICAgICAgICAgIGlmICh0eXBlID09PSAnUHJpY2VMZXZlbCcpIHtcclxuICAgICAgICAgICAgICAgI
8443HNlbGVjdGVkUHJpY2VMZXZlbElkcyA9IHNlbGYuc2VsZWN0ZWRQcm9tb0NvZGVbJ3ByaWNlTGV2ZWxJZHMnXTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKHR5cGUgPT09ICdIb2xkJykge1xyXG4gICAgICAgICAgICAgICAgc2VsZWN0ZWRIb2xkU3ViY2xhc3NJZCA9IHNlbGYuc2VsZWN0ZWRQcm9tb0NvZGVbJ2hvbGRTdWJjbGFzc0lkJ107XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmICh0eXBlID09PSAnVGFnJykge1xyXG4gICAgICAgICAgICAgICAgc2VsZWN0ZWRUYWdzSWQgPSBzZWxmLnNlbGVjdGVkUHJvbW9Db2RlWyd0YWdJZHMnXTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHNlbGVjdGVkUHJpY2VMZXZlbElkcyA9IHNlbGYuZ2V0UHJpY2VMZXZlbElkcygpO1xyXG4gICAgICAgICAgICBzZWxlY3RlZEhvbGRTdWJjbGFzc0lkID0gc2VsZi5nZXRTdWJob2xkSWRzKCk7XHJcbiAgICAgICAgICAgIHNlbGVjdGVkVGFnc0lkID0gc2VsZi5nZXRUYWdJZHMoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgbGV0IGNhdGVnb3JpZXNfcHJpY2luZyA9IFtdO1xyXG4gICAgICAgIGxldCBjYXRlZ29yaWVzX2xhYmVscyA9IFtdO1xyXG4gICAgICAgIHNlbGYudGlja2V0VHlwZUFsbCA9IGZhbHNlO1xyXG5cclxuICAgICAgICBsZXQgdGlja2V0VHlwZXMgPSBbXTtcclxuICAgICAgICBsZXQgc2VsZWN0ZWRQcm9tb0NvZGVFbGVtZW50QW5kVXNlZEJsb2NrcyA9IHNlbGYuZ2V0UHJpY2VCbG9ja3NBbmRVc2VkQmxvY2tzKCk7XHJcbiAgICAgICAgbGV0IHNlbGVjdGVkUHJvbW9Db2RlRWxlbWVudCA9IHNlbGVjdGVkUHJvbW9Db2RlRWxlbWVudEFuZFVzZWRCbG9ja3MucHJpY2VCbG9jaztcclxuICAgICAgICBzZWxmLnVzZWRCbG9ja3MgPSBzZWxlY3RlZFByb21vQ29kZUVsZW1lbnRBbmRVc2VkQmxvY2tzLnVzZUJsb2NrO1xyXG4gICAgICAgIGxldCBwbyA9IDA7XHJcbiAgICAgICAgbGV0IHByaWNlQmxvY2tBcnIgPSBzZWxmLm9iamVjdFRvQXJyYXkoc2VsZWN0ZWRQcm9tb0NvZGVFbGVtZW50KTtcclxuICAgICAgICAvL2lmICghc2VsZi5pc1BhY2soKSkge1xyXG4gICAgICAgIHByaWNlQmxvY2tBcnIuc29ydChzZWxmLmNvbXBhcmVQcmljZUJsb2Nrc1BhY2spO1xyXG4gICAgICAgIC8vfSBlbHNlIHtcclxuICAgICAgICAvL3ByaWNlQmxvY2tBcnIuc29ydChzZWxmLmNvbXBhcmVQcmljZUJsb2Nrcyk7XHJcbiAgICAgICAgLy99XHJcblxyXG4gICAgICAgIGxldCBzZWF0X2xhYmVsc19jYXRlZ29yaWVzID0ge307XHJcbiAgICAgICAgbGV0IG9iamVjdF9jYXRlZ29yaWVzID0gW107XHJcbiAgICAgICAgZm9yIChjb25zdCBrZXlTZWF0cyBpbiBzZWxmLmV2ZW50U2VhdHMpIHtcclxuICAgICAgICAgICAgaWYgKHNlbGVjdGVkUHJpY2VMZXZlbElkcyAhPT0gZmFsc2UpIHtcclxuICAgICAgICAgICAgICAgIGxldCBpc0NhdCA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBpIGluIHNlbGVjdGVkUHJpY2VMZXZlbElkcykge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLmV2ZW50U2VhdHNba2V5U2VhdHNdWydwcmljZUxldmVsSWQnXSA9PT0gc2VsZWN0ZWRQcmljZUxldmVsSWRzW2ldKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlzQ2F0ID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYgKGlzQ2F0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgc2VhdF9sYWJlbHNfY2F0ZWdvcmllc1trZXlTZWF0c10gPSBcIlwiICsgc2VsZi5ldmVudFNlYXRzW2tleVNlYXRzXVsncHJpY2VMZXZlbElkJ107Ly9zZWxmLnNlbGVjdGVkUHJvbW9Db2RlWydwcmljZUJsb2NrcyddW3NlbGYuZXZlbnRTZWF0c1trZXlTZWF0c11bJ3ByaWNlTGV2ZWxJZCddXVsncHJpY2VMZXZlbE5hbWUnXTtcclxuICAgICAgICAgICAgICAgICAgICBzZWxmLnVzZWRQcmljZUxldmVsSWRzLnB1c2goc2VsZi5ldmVudFNlYXRzW2tleVNlYXRzXVsncHJpY2VMZXZlbElkJ10pO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAvL3NlYXRfbGFiZWxzX2NhdGVnb3JpZXNba2V5U2VhdHNdID0gJ25vdF9hdmFpbGFibGUnICsgc2VsZi5ldmVudFNlYXRzW2tleVNlYXRzXVsncHJpY2VMZXZlbElkJ107XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmIChzZWxlY3RlZFRhZ3NJZCAhPT0gZmFsc2UpIHtcclxuICAgICAgICAgICAgICAgIGxldCBpc0NhdCA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBpIGluIHNlbGVjdGVkVGFnc0lkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYuZXZlbnRTZWF0c1trZXlTZWF0c11bJ3RhZ0lkJ10gPT09IHNlbGVjdGVkVGFnc0lkW2ldKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlzQ2F0ID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYgKGlzQ2F0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgc2VhdF9sYWJlbHNfY2F0ZWdvcmllc1trZXlTZWF0c10gPSBcIlwiICsgc2VsZi5ldmVudFNlYXRzW2tleVNlYXRzXVsncHJpY2VMZXZlbElkJ107Ly9zZWxmLnNlbGVjdGVkUHJvbW9Db2RlWydwcmljZUJsb2NrcyddW3NlbGYuZXZlbnRTZWF0c1trZXlTZWF0c11bJ3ByaWNlTGV2ZWxJZCddXVsncHJpY2VMZXZlbE5hbWUnXTtcclxuICAgICAgICAgICAgICAgICAgICBzZWxmLnVzZWRQcmljZUxldmVsSWRzLnB1c2goc2VsZi5ldmVudFNlYXRzW2tleVNlYXRzXVsncHJpY2VMZXZlbElkJ10pO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAvL3NlYXRfbGFiZWxzX2NhdGVnb3JpZXNba2V5U2VhdHNdID0gXCJub3RfYXZhaWxhYmxlXCIgKyBzZWxmLmV2ZW50U2VhdHNba2V5U2VhdHNdWydwcmljZUxldmVsSWQnXTtcclxuICAgICAgICAgICAgICAgI
8443H1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKHNlbGVjdGVkSG9sZFN1YmNsYXNzSWQgIT09IGZhbHNlKSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgaXNDYXQgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoc2VsZi5ldmVudFNlYXRzW2tleVNlYXRzXVsnaG9sZFN1YmNsYXNzSWQnXSA9PT0gc2VsZWN0ZWRIb2xkU3ViY2xhc3NJZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlzQ2F0ID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmIChpc0NhdCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHNlYXRfbGFiZWxzX2NhdGVnb3JpZXNba2V5U2VhdHNdID0gXCJcIiArIHNlbGYuZXZlbnRTZWF0c1trZXlTZWF0c11bJ3ByaWNlTGV2ZWxJZCddOy8vc2VsZi5zZWxlY3RlZFByb21vQ29kZVsncHJpY2VCbG9ja3MnXVtzZWxmLmV2ZW50U2VhdHNba2V5U2VhdHNdWydwcmljZUxldmVsSWQnXV1bJ3ByaWNlTGV2ZWxOYW1lJ107XHJcbiAgICAgICAgICAgICAgICAgICAgc2VsZi51c2VkUHJpY2VMZXZlbElkcy5wdXNoKHNlbGYuZXZlbnRTZWF0c1trZXlTZWF0c11bJ3ByaWNlTGV2ZWxJZCddKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy9zZWF0X2xhYmVsc19jYXRlZ29yaWVzW2tleVNlYXRzXSA9IFwibm90X2F2YWlsYWJsZVwiICsgc2VsZi5ldmVudFNlYXRzW2tleVNlYXRzXVsncHJpY2VMZXZlbElkJ107XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgLy9nYVNlY3Rpb25zXHJcblxyXG4gICAgICAgIGZvciAoY29uc3Qga2V5U2VhdHMgaW4gc2VsZi5ldmVudFNlY3Rpb25zKSB7XHJcbiAgICAgICAgICAgIGlmIChzZWxlY3RlZFByaWNlTGV2ZWxJZHMgIT09IGZhbHNlKSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgaXNDYXQgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgaSBpbiBzZWxlY3RlZFByaWNlTGV2ZWxJZHMpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5ldmVudFNlY3Rpb25zW2tleVNlYXRzXVsncHJpY2VMZXZlbElEJ10gPT09IHNlbGVjdGVkUHJpY2VMZXZlbElkc1tpXSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpc0NhdCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmIChpc0NhdCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHNlYXRfbGFiZWxzX2NhdGVnb3JpZXNbc2VsZi5ldmVudFNlY3Rpb25zW2tleVNlYXRzXVsna2V5J11dID0gXCJcIiArIHNlbGYuZXZlbnRTZWN0aW9uc1trZXlTZWF0c11bJ3ByaWNlTGV2ZWxJRCddOy8vc2VsZi5zZWxlY3RlZFByb21vQ29kZVsncHJpY2VCbG9ja3MnXVtzZWxmLmV2ZW50U2VhdHNba2V5U2VhdHNdWydwcmljZUxldmVsSWQnXV1bJ3ByaWNlTGV2ZWxOYW1lJ107XHJcbiAgICAgICAgICAgICAgICAgICAgb2JqZWN0X2NhdGVnb3JpZXNbc2VsZi5ldmVudFNlY3Rpb25zW2tleVNlYXRzXVsna2V5J11dID0gc2VsZi5ldmVudFNlY3Rpb25zW2tleVNlYXRzXVsnYXZhaWxhYmxlUXVhbnRpdHknXTtcclxuICAgICAgICAgICAgICAgICAgICBzZWxmLnVzZWRQcmljZUxldmVsSWRzLnB1c2goc2VsZi5ldmVudFNlY3Rpb25zW2tleVNlYXRzXVsncHJpY2VMZXZlbElEJ10pO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAvL3NlYXRfbGFiZWxzX2NhdGVnb3JpZXNba2V5U2VhdHNdID0gJ25vdF9hdmFpbGFibGUnICsgc2VsZi5ldmVudFNlY3Rpb25zW2tleVNlYXRzXVsncHJpY2VMZXZlbElkJ107XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmIChzZWxlY3RlZFRhZ3NJZCAhPT0gZmFsc2UpIHtcclxuICAgICAgICAgICAgICAgIGxldCBpc0NhdCA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBpIGluIHNlbGVjdGVkVGFnc0lkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYuZXZlbnRTZWN0aW9uc1trZXlTZWF0c11bJ3RhZ0lkJ10gPT09IHNlbGVjdGVkVGFnc0lkW2ldKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlzQ2F0ID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYgKGlzQ2F0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgc2VhdF9sYWJlbHNfY2F0ZWdvcmllc1tzZWxmLmV2ZW50U2VjdGlvbnNba2V5U2VhdHNdWydrZXknXV0gPSBcIlwiICsgc2VsZi5ldmVudFNlY3Rpb25zW2tleVNlYXRzXVsncHJpY2VMZXZlbElEJ107Ly9zZWxmLnNlbGVjdGVkUHJvbW9Db2RlWydwcmljZUJsb2NrcyddW3NlbGYuZXZlbnRTZWN0aW9uc1trZXlTZWF0c11bJ3ByaWNlTGV2ZWxJZCddXVsncHJpY2VMZXZlbE5hbWUnXTtcclxuICAgICAgICAgICAgICAgICAgICBvYmplY3RfY2F0ZWdvcmllc1tzZWxmLmV2ZW50U2VjdGlvbnNba2V5U2VhdHNdWydrZXknXV0gPSBzZWxmLmV2ZW50U2VjdGlvbnNba2V5U2VhdHNdWydhdmFpbGFibGVRdWFudGl0eSddO1xyXG4gICAgICAgICAgICAgICAgICAgIHNlbGYudXNlZFByaWNlTGV2ZWxJZHMucHVzaChzZWxmLmV2ZW50U2VjdGlvbnNba2V5U2VhdHNdWydwcmljZUxldmVsSUQnXSk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vc2VhdF9sYWJlbHNfY2F0ZWdvcmllc1trZXlTZWF0c10gPSBcIm5vdF9hdmFpbGFibGVcIiArIHNlbGYuZXZlbnRTZWN0aW9uc1trZXlTZWF0c11bJ3ByaWNlTGV2ZWxJZCddO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoc2VsZWN0ZWRIb2xkU3ViY2xhc3NJZCAhPT0gZmFsc2UpIHtcclxuICAgICAgICAgICAgICAgIGxldCBpc0NhdCA9IGZhbHNlO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmIChzZWxmLmV2ZW50U2VjdGlvbnNba2V5U2VhdHNdWydob2xkU3ViY2xhc3NJZCddID09PSBzZWxlY3RlZEhvbGRTdWJjbGFzc0lkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaXNDYXQgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYgKGlzQ2F0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgc2VhdF9sYWJlbHNfY2F0ZWdvcmllc1tzZWxmLmV2ZW50U2VjdGlvbnNba2V5U2VhdHNdWydrZXknXV0gPSBcIlwiICsgc2VsZi5ldmVudFNlY3Rpb25zW2tleVNlYXRzXVsncHJpY2VMZXZlbElEJ107Ly9zZWxmLnNlbGVjdGVkUHJvbW9Db2RlWydwcmljZUJsb2NrcyddW3NlbGYuZXZlbnRTZWN0aW9uc1trZXlTZWF0c11bJ3ByaWNlTGV2ZWxJZCddXVsncHJpY2VMZXZlbE5hbWUnXTtcclxuICAgICAgICAgICAgICAgICAgICBvYmplY3RfY2F0ZWdvcmllc1tzZWxmLmV2ZW50U2VjdGlvbnNba2V5U2VhdHNdWydrZXknXV0gPSBzZWxmLmV2ZW50U2VjdGlvbnNba2V5U2VhdHNdWydhdmFpbGFibGVRdWFudGl0eSddO1xyXG4gICAgICAgICAgICAgICAgICAgI
8443HNlbGYudXNlZFByaWNlTGV2ZWxJZHMucHVzaChzZWxmLmV2ZW50U2VjdGlvbnNba2V5U2VhdHNdWydwcmljZUxldmVsSUQnXSk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vc2VhdF9sYWJlbHNfY2F0ZWdvcmllc1trZXlTZWF0c10gPSBcIm5vdF9hdmFpbGFibGVcIiArIHNlbGYuZXZlbnRTZWN0aW9uc1trZXlTZWF0c11bJ3ByaWNlTGV2ZWxJZCddO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBmb3IgKGxldCBpMSA9IDA7IGkxIDwgcHJpY2VCbG9ja0Fyci5sZW5ndGg7IGkxKyspIHtcclxuICAgICAgICAgICAgY29uc3Qga2V5UHJpY2UgPSBwcmljZUJsb2NrQXJyW2kxXVswXTtcclxuICAgICAgICAgICAgLy9jb25zdCB2YWx1ZSA9IHByaWNlQmxvY2tBcnJbaTFdWzFdO1xyXG4gICAgICAgICAgICBpZiAoc2VsZi51c2VkUHJpY2VMZXZlbElkcyAhPT0gZmFsc2UgJiYgc2VsZi5pbkFycmF5KHNlbGYudXNlZFByaWNlTGV2ZWxJZHMsIHNlbGVjdGVkUHJvbW9Db2RlRWxlbWVudFtrZXlQcmljZV1bJ3ByaWNlTGV2ZWxJZCddKSkge1xyXG5cclxuICAgICAgICAgICAgICAgIGxldCB0aWNrZXRUeXBlID0gW107XHJcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHRpY2tldFR5cGVzW3NlbGVjdGVkUHJvbW9Db2RlRWxlbWVudFtrZXlQcmljZV1bJ3ByaWNlTGV2ZWxJZCddXSAhPT0gJ3VuZGVmaW5lZCcpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aWNrZXRUeXBlID0gdGlja2V0VHlwZXNbc2VsZWN0ZWRQcm9tb0NvZGVFbGVtZW50W2tleVByaWNlXVsncHJpY2VMZXZlbElkJ11dO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgbGV0IHRpY2tldFR5cGVTaW5ndWxhciA9IHt9O1xyXG4gICAgICAgICAgICAgICAgdGlja2V0VHlwZVNpbmd1bGFyWyd0aWNrZXRUeXBlJ10gPSBzZWxlY3RlZFByb21vQ29kZUVsZW1lbnRba2V5UHJpY2VdWydwcmljZVR5cGVOYW1lJ107XHJcbiAgICAgICAgICAgICAgICB0aWNrZXRUeXBlU2luZ3VsYXJbJ2xhYmVsJ10gPSBzZWxlY3RlZFByb21vQ29kZUVsZW1lbnRba2V5UHJpY2VdWydwcmljZVR5cGVOYW1lJ107XHJcbiAgICAgICAgICAgICAgICB0aWNrZXRUeXBlU2luZ3VsYXJbJ3ByaWNlJ10gPSBzZWxlY3RlZFByb21vQ29kZUVsZW1lbnRba2V5UHJpY2VdWydmdWxsUmV0YWlsUHJpY2UnXTtcclxuICAgICAgICAgICAgICAgIHRpY2tldFR5cGUucHVzaCh0aWNrZXRUeXBlU2luZ3VsYXIpO1xyXG4gICAgICAgICAgICAgICAgdGlja2V0VHlwZXNbc2VsZWN0ZWRQcm9tb0NvZGVFbGVtZW50W2tleVByaWNlXVsncHJpY2VMZXZlbElkJ11dID0gdGlja2V0VHlwZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZm9yIChsZXQgaTEgPSAwOyBpMSA8IHByaWNlQmxvY2tBcnIubGVuZ3RoOyBpMSsrKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGtleVByaWNlID0gcHJpY2VCbG9ja0FycltpMV1bMF07XHJcbiAgICAgICAgICAgIC8vY29uc3QgdmFsdWUgPSBwcmljZUJsb2NrQXJyW2kxXVsxXTtcclxuICAgICAgICAgICAgaWYgKHNlbGYudXNlZFByaWNlTGV2ZWxJZHMgIT09IGZhbHNlICYmIHNlbGYuaW5BcnJheShzZWxmLnVzZWRQcmljZUxldmVsSWRzLCBzZWxlY3RlZFByb21vQ29kZUVsZW1lbnRba2V5UHJpY2VdWydwcmljZUxldmVsSWQnXSkpIHtcclxuXHJcbiAgICAgICAgICAgICAgICBsZXQgY2F0ZWdvcnlfcHJpY2luZyA9IHt9O1xyXG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB0aWNrZXRUeXBlc1tzZWxlY3RlZFByb21vQ29kZUVsZW1lbnRba2V5UHJpY2VdWydwcmljZUxldmVsSWQnXV0gIT09ICd1bmRlZmluZWQnICYmIHRpY2tldFR5cGVzW3NlbGVjdGVkUHJvbW9Db2RlRWxlbWVudFtrZXlQcmljZV1bJ3ByaWNlTGV2ZWxJZCddXS5sZW5ndGggPiAxKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY2F0ZWdvcnlfcHJpY2luZ1snY2F0ZWdvcnknXSA9IHNlbGVjdGVkUHJvbW9Db2RlRWxlbWVudFtrZXlQcmljZV1bJ3ByaWNlTGV2ZWxJZCddO1xyXG4gICAgICAgICAgICAgICAgICAgIGNhdGVnb3J5X3ByaWNpbmdbJ3RpY2tldFR5cGVzJ10gPSB0aWNrZXRUeXBlc1tzZWxlY3RlZFByb21vQ29kZUVsZW1lbnRba2V5UHJpY2VdWydwcmljZUxldmVsSWQnXV07XHJcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiB0aWNrZXRUeXBlc1tzZWxlY3RlZFByb21vQ29kZUVsZW1lbnRba2V5UHJpY2VdWydwcmljZUxldmVsSWQnXV0gIT09ICd1bmRlZmluZWQnICYmIHRpY2tldFR5cGVzW3NlbGVjdGVkUHJvbW9Db2RlRWxlbWVudFtrZXlQcmljZV1bJ3ByaWNlTGV2ZWxJZCddXS5sZW5ndGggPT09IDEpIHtcclxuICAgICAgICAgICAgICAgICAgICAvL2xldCB0aWNrZXRUeXBlU2luZ3VsYXIgPSB7fTtcclxuICAgICAgICAgICAgICAgICAgICBzZWxmLnRpY2tldFR5cGVBbGwgPSB0aWNrZXRUeXBlc1tzZWxlY3RlZFByb21vQ29kZUVsZW1lbnRba2V5UHJpY2VdWydwcmljZUxldmVsSWQnXV1bMF1bJ3RpY2tldFR5cGUnXTtcclxuICAgICAgICAgICAgICAgICAgICBjYXRlZ29yeV9wcmljaW5nWydsYWJlbCddID0gdGlja2V0VHlwZXNbc2VsZWN0ZWRQcm9tb0NvZGVFbGVtZW50W2tleVByaWNlXVsncHJpY2VMZXZlbElkJ11dWzBdWydsYWJlbCddO1xyXG4gICAgICAgICAgICAgICAgICAgIGNhdGVnb3J5X3ByaWNpbmdbJ3ByaWNlJ10gPSB0aWNrZXRUeXBlc1tzZWxlY3RlZFByb21vQ29kZUVsZW1lbnRba2V5UHJpY2VdWydwcmljZUxldmVsSWQnXV1bMF1bJ3ByaWNlJ107XHJcbiAgICAgICAgICAgICAgICAgICAgY2F0ZWdvcnlfcHJpY2luZ1snY2F0ZWdvcnknXSA9IHNlbGVjdGVkUHJvbW9Db2RlRWxlbWVudFtrZXlQcmljZV1bJ3ByaWNlTGV2ZWxJZCddO1xyXG4gICAgICAgICAgICAgICAgICAgIC8vY2F0ZWdvcnlfcHJpY2luZ1snY2F0ZWdvcnknXSA9IHRpY2tldFR5cGVTaW5ndWxhcjtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBjYXRlZ29yaWVzX3ByaWNpbmcucHVzaChjYXRlZ29yeV9wcmljaW5nKTtcclxuXHJcbiAgICAgICAgICAgICAgICBsZXQgY2F0ZWdvcnlfbGFiZWwgPSB7fTtcclxuICAgICAgICAgICAgICAgIGNhdGVnb3J5X2xhYmVsWydrZXknXSA9IFwiXCIgKyBzZWxlY3RlZFByb21vQ29kZUVsZW1lbnRba2V5UHJpY2VdWydwcmljZUxldmVsSWQnXTsvL2NyZWF0ZSBhIG5ldyBjYXQgYmFzZWQgb24gYWRhVHlwZXNcclxuICAgICAgICAgICAgICAgIGNhdGVnb3J5X2xhYmVsWydjb2xvciddID0gXCJcIiArIHNlbGYuY29kZUFycmF5KClbcG9dO1xyXG4gICAgICAgICAgICAgICAgY2F0ZWdvcnlfbGFiZWxbJ2xhYmVsJ10gPSBcIlwiICsgc2VsZWN0ZWRQcm9tb0NvZGVFbGVtZW50W2tleVByaWNlXVsncHJpY2VMZXZlbE5hbWUnXTtcclxuICAgICAgICAgICAgICAgIGNhdGVnb3JpZXNfbGFiZWxzLnB1c2goY2F0ZWdvcnlfbGFiZWwpO1xyXG4gICAgICAgICAgICAgICAgLy9jYXRlZ29yaWVzWydhdmFpbGFibGVfY2F0ZWdvcmllcyddLnB1c2goY2F0ZWdvcnlfbGFiZWxbJ2tleSddKTtcclxuICAgICAgICAgICAgICAgIGxldCBjYXRlZ29yeV9sYWJlbF9ub3QgPSB7fTtcclxuICAgICAgICAgICAgICAgIGNhdGVnb3J5X2xhYmVsX25vdFsna2V5J10gPSBcIm5vdF9hdmFpbGFibGVcIiArIHNlbGVjdGVkUHJvbW9Db2RlRWxlbWVudFtrZXlQcmljZV1bJ3ByaWNlTGV2ZWxJZCddOy8vY3JlYXRlIGEgbmV3IGNhdCBiYXNlZCBvbiBhZGFUeXBlc1xyXG4gICAgICAgICAgICAgICAgY2F0ZWdvcnlfbGFiZWxfbm90Wydjb2xvciddID0gXCJcIiArIHNlbGYuY29udmVydEhleChzZWxmLmNvZGVBcnJheSgpW3BvXSwgMzIpO1xyXG4gICAgICAgICAgICAgICAgY2F0ZWdvcnlfbGFiZWxfbm90WydsYWJlbCddID0gXCJOb3QgQXZhaWxhYmxlXCI7XHJcbiAgICAgICAgICAgICAgICBjYXRlZ29yaWVzWyd1bmF2YWlsYWJsZV9jYXRlZ29yaWVzJ10ucHVzaChjYXRlZ29yeV9sYWJlbF9ub3RbJ2tleSddKTtcclxuICAgICAgICAgICAgICAgIGNhdGVnb3JpZXNfbGFiZWxzLnB1c2goY2F0ZWdvcnlfbGFiZWxfbm90KTtcclxuICAgICAgICAgICAgICAgI
8443HBvKys7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNhdGVnb3JpZXNbJ3NlYXRfbGFiZWxzX2NhdGVnb3JpZXMnXSA9IHNlYXRfbGFiZWxzX2NhdGVnb3JpZXM7XHJcbiAgICAgICAgc2VsZi5ldmVudFNlY3Rpb25zQ2FwYWNpdHkgPSBvYmplY3RfY2F0ZWdvcmllcztcclxuICAgICAgICBjYXRlZ29yaWVzWydvYmplY3RfY2F0ZWdvcmllcyddID0gT2JqZWN0LmFzc2lnbih7fSwgb2JqZWN0X2NhdGVnb3JpZXMpO1xyXG4gICAgICAgIGNhdGVnb3JpZXNbJ3ByaWNpbmdfY2F0ZWdvcmllcyddID0gY2F0ZWdvcmllc19wcmljaW5nO1xyXG4gICAgICAgIGNhdGVnb3JpZXNbJ2NhdGVnb3JpZXNfbGFiZWxzJ10gPSBjYXRlZ29yaWVzX2xhYmVscztcclxuXHJcbiAgICAgICAgcmV0dXJuIGNhdGVnb3JpZXM7XHJcbiAgICB9XHJcblxyXG4gICAgY3JlYXRlRGVzdHJveVNlYXRDaGFydCgpIHtcclxuICAgICAgICBpZiAodGhpcy5zZWF0Q2hhcnQgIT09IGZhbHNlKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY2xlYXJDYXJ0KCk7XHJcbiAgICAgICAgICAgIGlmICh0eXBlb2YgdGhpcy5zZWF0Q2hhcnQuZGVzdHJveSAhPT0gJ3VuZGVmaW5lZCcpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2VhdENoYXJ0LmRlc3Ryb3koKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGpRdWVyeSgnI3NlYXRzX21hcCcpLmh0bWwoJycpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMuSkJ1eUJ1dHRvbigpLkxvYWRpbmdPdmVybGF5KCdoaWRlJyk7XHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRPYmplY3RDaGFydCA9IG51bGw7XHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRFdmVudCA9IG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuc2VhdENoYXJ0ID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5KUHJpY2VNYXAoKS5oaWRlKCk7XHJcbiAgICAgICAgdGhpcy5KUHJpY2VNYXBTZWF0cygpLmhpZGUoKTtcclxuICAgICAgICB0aGlzLkpQcmljZU1hcEV4cGxhbmF0aW9uKCkuaGlkZSgpO1xyXG4gICAgICAgIHRoaXMuSkJsYW5rU2VhdHNNYXAoKS5zaG93KCk7XHJcbiAgICAgICAgaWYgKHRoaXMuSlRoZW1lKCkgPT09ICdsaWdodCcpIHtcclxuICAgICAgICAgICAgdGhpcy5KQmxhbmtTZWF0c01hcCgpLmh0bWwoJzxpbWcgc3R5bGU9XCJwYWRkaW5nOjgwcHg7XCIgc3JjPVwiL3dwLWNvbnRlbnQvdGhlbWVzL3BvcnRvL2ltYWdlcy9ub19zZWxlY3Rpb25fZGF0ZV90aW1lX2xpZ2h0LnBuZ1wiLz48aDQ+U2VsZWN0IGEgdGltZTwvaDQ+Jyk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5KQmxhbmtTZWF0c01hcCgpLmh0bWwoJzxoND5TZWxlY3QgYSB0aW1lPC9oND48aW1nIHN0eWxlPVwicGFkZGluZzo4MHB4O1wiIHNyYz1cIi93cC1jb250ZW50L3RoZW1lcy9wb3J0by9pbWFnZXMvbm9fc2VsZWN0aW9uX2RhdGVfdGltZS5wbmdcIi8+Jyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuSlRpY2tldHNTZWxlY3RlZENhcnQoKS5odG1sKCcnKTtcclxuICAgICAgICB0aGlzLkpUaWNrZXRzQnV0dG9uc0NhcnQoKS5oaWRlKCk7XHJcbiAgICAgICAgalF1ZXJ5KCcuYnByb2NlZWRfdGlja2V0cycpLmhpZGUoKTtcclxuICAgIH1cclxuXHJcbiAgICBjb252ZXJ0SGV4KGhleENvZGUsIG9wYWNpdHkpIHtcclxuICAgICAgICB2Y
8443XIgaGV4ID0gaGV4Q29kZS5yZXBsYWNlKCcjJywgJycpO1xyXG5cclxuICAgICAgICBpZiAoaGV4Lmxlbmd0aCA9PT0gMykge1xyXG4gICAgICAgICAgICBoZXggPSBoZXhbMF0gKyBoZXhbMF0gKyBoZXhbMV0gKyBoZXhbMV0gKyBoZXhbMl0gKyBoZXhbMl07XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB2YXIgciA9IHBhcnNlSW50KGhleC5zdWJzdHJpbmcoMCwgMiksIDE2KSxcclxuICAgICAgICAgICAgZyA9IHBhcnNlSW50KGhleC5zdWJzdHJpbmcoMiwgNCksIDE2KSxcclxuICAgICAgICAgICAgYiA9IHBhcnNlSW50KGhleC5zdWJzdHJpbmcoNCwgNiksIDE2KTtcclxuXHJcbiAgICAgICAgcmV0dXJuICdyZ2JhKCcgKyByICsgJywnICsgZyArICcsJyArIGIgKyAnLCcgKyBvcGFjaXR5IC8gMTAwICsgJyknO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ3JlYXRlIGEgQVNDSUkgdGFibGUgYmFzZWQgb24gYSBiaS1kaW1lbnNpb25hbCBhcnJheSBvZiBzdHJpbmdzXHJcbiAgICAgKiBAcGFyYW0gIHtBcnJheX0gICBtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaS1kaW1lbnNpb25hbCBhcnJheSBvZiBzdHJpbmdzXHJcbiAgICAgKiBAcGFyYW0gIHtPYmplY3R9ICBbb3B0aW9uc10gICAgICAgICAgICAgICAgICAgICAgICAgICBPcHRpb25zIG9iamVjdFxyXG4gICAgICogQHBhcmFtICB7T2JqZWN0fSAgW29wdGlvbnMucm93XSAgICAgICAgICAgICAgICAgICAgICAgUm93IG9wdGlvbnNcclxuICAgICAqIEBwYXJhbSAge1N0cmluZ30gIFtvcHRpb25zLnJvdy5wYWRkaW5nTGVmdD1cInxcIl0gICAgICAgU3RyaW5nIGFkZGVkIGJlZm9yZSB0aGUgZmlyc3QgY29sdW1uXHJcbiAgICAgKiBAcGFyYW0gIHtTdHJpbmd9ICBbb3B0aW9ucy5yb3cucGFkZGluZ1JpZ2h0PVwifFwiXSAgICAgIFN0cmluZyBhZGRlZCBhZnRlciB0aGUgbGFzdCBjb2x1bW5cclxuICAgICAqIEBwYXJhbSAge1N0cmluZ30gIFtvcHRpb25zLnJvdy5jb2xTZXBhcmF0b3I9XCJ8XCJdICAgICAgU3RyaW5nIGFkZGVkIGJldHdlZW4gY29sdW1uc1xyXG4gICAgICogQHBhcmFtICB7U3RyaW5nfSAgW29wdGlvbnMucm93LmxpbmVCcmVhaz1cIlxcblwiXSAgICAgICAgU3RyaW5nIHVzZWQgdG8gYnJlYWsgcm93c1xyXG4gICAgICogQHBhcmFtICB7T2JqZWN0fSAgW29wdGlvbnMuY2VsbF0gICAgICAgICAgICAgICAgICAgICAgQ2VsbCBvcHRpb25zXHJcbiAgICAgKiBAcGFyYW0gIHtTdHJpbmd9ICBbb3B0aW9ucy5jZWxsLnBhZGRpbmdMZWZ0PVwiIFwiXSAgICAgIFN0cmluZyBhZGRlZCBiZWZvcmUgdGhlIGNlbGwgY29udGVudFxyXG4gICAgICogQHBhcmFtICB7U3RyaW5nfSAgW29wdGlvbnMuY2VsbC5wYWRkaW5nUmlnaHQ9XCIgXCJdICAgICBTdHJpbmcgYWRkZWQgYWZ0ZXIgdGhlIGNlbGwgY29udGVudFxyXG4gICAgICogQHBhcmFtICB7TnVtYmVyfSAgW29wdGlvbnMuY2VsbC5kZWZhdWx0QWxpZ25EaXI9XCIxXCJdICBEZWZpbmUgdGhlIGRlZmF1bHQgYWxpZ25tZW50IHdoZW4gbm90IHNwZWNpZmllZCAoLTE9bGVmdCwgMD1jZW50ZXIsIDE9cmlnaHQpXHJcbiAgICAgKiBAcGFyYW0gIHtPYmplY3R9ICBbb3B0aW9ucy5ocl0gICAgICAgICAgICAgICAgICAgICAgICBIb3Jpem9udGFsIExpbmUgb3B0aW9uc1xyXG4gICAgICogQHBhcmFtICB7U3RyaW5nfSAgW29wdGlvbnMuaHIuc3RyPVwi4oCUXCJdICAgICAgICAgICAgICAgIFN0cmluZyB0aGF0IHdpbGwgYmUgcmVwZWF0ZWQgdG8gbWFrZSB0aGUgSG9yaXpvbnRhbCBMaW5lXHJcbiAgICAgKiBAcGFyYW0gIHtTdHJpbmd9ICBbb3B0aW9ucy5oci5jb2xTZXBhcmF0b3I9XCJ8XCJdICAgICAgIFN0cmluZyBhZGRlZCBiZXR3ZWVuIGNvbHVtbnNcclxuICAgICAqIEByZXR1cm4ge3N0cmluZ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBmaW5hbCBBU0NJSSB0YWJsZVxyXG4gICAgICogQGF1dGhvciBWaWN0b3IgTi4gd3d3dy52aWN0b3Jib3JnZXMuY29tXHJcbiAgICAgKiBAZGF0ZSAgIDIwMTYtMTItMjhcclxuICAgICAqL1xyXG4gICAgbWF0cml4VG9Bc2NpaVRhYmxlKG0sIG9wdGlvbnMpIHtcclxuXHJcbiAgICAgICAgb3B0aW9ucyA9IGRlZmF1bHRzKHtcclxuICAgICAgICAgICAgcm93OiB7XHJcbiAgICAgICAgICAgICAgICBwYWRkaW5nTGVmdDogXCIgXCIsIC8vYmVmb3JlIGZpcnN0IGNvbHVtblxyXG4gICAgICAgICAgICAgICAgcGFkZGluZ1JpZ2h0OiBcIiBcIiwgLy9hZnRlciBsYXN0IGNvbHVtblxyXG4gICAgICAgICAgICAgICAgY29sU2VwYXJhdG9yOiBcIiBcIiwgLy9iZXR3ZWVuIGVhY2ggY29sdW1uXHJcbiAgICAgICAgICAgICAgICBsaW5lQnJlYWs6IFwiW2JyL11cIlxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBjZWxsOiB7XHJcbiAgICAgICAgICAgICAgICBwYWRkaW5nTGVmdDogXCIgXCIsXHJcbiAgICAgICAgICAgICAgICBwYWRkaW5nUmlnaHQ6IFwiIFwiLFxyXG4gICAgICAgICAgICAgICAgZGVmYXVsdEFsaWduRGlyOiAwIC8vbGVmdD0tMSBjZW50ZXI9MCByaWdodD0xXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIGhyOiB7XHJcbiAgICAgICAgICAgICAgICBzdHI6IFwiIFwiLFxyXG4gICAgICAgICAgICAgICAgY29sU2VwYXJhdG9yOiBcIiBcIlxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSwgb3B0aW9ucyk7XHJcblxyXG5cclxuICAgICAgICBmdW5jdGlvbiBkZWZhdWx0cyhkZWZhdWx0T2JqLCBvcHRpb25zKSB7XHJcbiAgICAgICAgICAgIGxldCBpc09iaiA9IGZ1bmN0aW9uICh4KSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4geCAhPT0gbnVsbCAmJiB0eXBlb2YgeCA9PT0gXCJvYmplY3RcIjtcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgaWYgKGlzT2JqKG9wdGlvbnMpKVxyXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgcHJvcCBpbiBkZWZhdWx0T2JqKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChkZWZhdWx0T2JqLCBwcm9wKSAmJiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob3B0aW9ucywgcHJvcCkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzT2JqKGRlZmF1bHRPYmpbcHJvcF0pKSBkZWZhdWx0cyhkZWZhdWx0T2JqW3Byb3BdLCBvcHRpb25zW3Byb3BdKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGRlZmF1bHRPYmpbcHJvcF0gPSBvcHRpb25zW3Byb3BdO1xyXG4gICAgICAgICAgICAgICAgICAgI
8443H1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIGRlZmF1bHRPYmo7XHJcbiAgICAgICAgfVxyXG5cclxuXHJcbiAgICAgICAgZnVuY3Rpb24gcmVwZWF0U3RyKHdpZHRoLCBzdHIpIHtcclxuICAgICAgICAgICAgc3RyID0gc3RyIHx8IFwiIFwiO1xyXG4gICAgICAgICAgICBsZXQgcmVzdWx0ID0gKHdpZHRoID4gMCkgPyBBcnJheShNYXRoLmNlaWwod2lkdGggLyBzdHIubGVuZ3RoKSArIDEpLmpvaW4oc3RyKSA6IFwiXCI7XHJcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQubGVuZ3RoID4gd2lkdGggPyByZXN1bHQuc3Vic3RyKDAsIHdpZHRoKSA6IHJlc3VsdDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGZ1bmN0aW9uIGFsaWduVGV4dCh0eHQsIHdpZHRoKSB7XHJcbiAgICAgICAgICAgIGZ1bmN0aW9uIHBhZCh0eHQsIHdpZHRoLCBkaXIpIHtcclxuICAgICAgICAgICAgICAgIGxldCBwID0gd2lkdGggLSB0eHQubGVuZ3RoO1xyXG4gICAgICAgICAgICAgICAgbGV0IHBMID0gKGRpciA+IDApID8gcCA6IChwIC8gMikgPDwgMDtcclxuICAgICAgICAgICAgICAgIGxldCBwUiA9IChkaXIgPCAwKSA/IHAgOiBwTCArIChwIC0gKHBMICogMikpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHAgPiAwID8gKGRpciA+PSAwID8gQXJyYXkocEwgKyAxKS5qb2luKFwiIFwiKSA6ICcnKSArIHR4dCArIChkaXIgPD0gMCA/IEFycmF5KHBSICsgMSkuam9pbihcIiBcIikgOiAnJykgOiB0eHQ7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHR4dCA9IFwiXCIgKyB0eHQ7IC8vdG9TdHJpbmdcclxuICAgICAgICAgICAgc3dpdGNoICh0eHQuY2hhckF0KDApKSB7XHJcbiAgICAgICAgICAgICAgICBjYXNlICc8JzpcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcGFkKHR4dC5zdWJzdHIoMSksIHdpZHRoLCAtMSk7IC8vYWxpZ24gbGVmdFxyXG4gICAgICAgICAgICAgICAgY2FzZSAnXic6XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBhZCh0eHQuc3Vic3RyKDEpLCB3aWR0aCwgMCk7IC8vYWxpZ24gY2VudGVyXHJcbiAgICAgICAgICAgICAgICBjYXNlICc+JzpcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcGFkKHR4dC5zdWJzdHIoMSksIHdpZHRoLCAxKTsgLy9hbGlnbiByaWdodFxyXG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcGFkKHR4dCwgd2lkdGgsIG9wdGlvbnMuY2VsbC5kZWZhdWx0QWxpZ25EaXIpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBmdW5jdGlvbiBjYWxjQ29sdW1uc1dpZHRoKG1hdHJpeCkge1xyXG4gICAgICAgICAgICAvL2NhbGN1bGF0ZSBjb2x1bW5zIHdpZHRoXHJcbiAgICAgICAgICAgIGxldCBjb2xzV2lkdGggPSBbXTtcclxuICAgICAgICAgICAgcm93czogZm9yIChsZXQgciA9IDAsIHJMZW4gPSBtYXRyaXgubGVuZ3RoOyByIDwgckxlbjsgcisrKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoIW1hdHJpeFtyXSkgY29udGludWU7IC8vc2VwYXJhdG9yXHJcbiAgICAgICAgICAgICAgICBjb2xzOiBmb3IgKGxldCBjID0gMCwgY0xlbiA9IG1hdHJpeFtyXS5sZW5ndGg7IGMgPCBjTGVuOyBjKyspIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoIWNvbHNXaWR0aFtjXSkgY29sc1dpZHRoW2NdID0gMDtcclxuICAgICAgICAgICAgICAgICAgICBjb2xzV2lkdGhbY10gPSBNYXRoLm1heChjb2xzV2lkdGhbY10sIChcIlwiICsgbWF0cml4W3JdW2NdKS5sZW5ndGgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiBjb2xzV2lkdGg7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBsZXQgcGFkZGluZ0xlbmd0aCA9IG9wdGlvbnMuY2VsbC5wYWRkaW5nTGVmdC5sZW5ndGggKyBvcHRpb25zLmNlbGwucGFkZGluZ1JpZ2h0Lmxlbmd0aDtcclxuICAgICAgICBsZXQgaHJTZXBhcmF0b3IgPSByZXBlYXRTdHIob3B0aW9ucy5yb3cuY29sU2VwYXJhdG9yLmxlbmd0aCwgb3B0aW9ucy5oci5jb2xTZXBhcmF0b3IgfHwgb3B0aW9ucy5oci5zdHIpO1xyXG4gICAgICAgIGxldCBjb2xzV2lkdGggPSBjYWxjQ29sdW1uc1dpZHRoKG0pO1xyXG5cclxuICAgICAgICAvL2NyZWF0ZSB0YWJsZVxyXG4gICAgICAgIGxldCB0YWJsZSA9IFtdO1xyXG4gICAgICAgIGZvciAobGV0IHIgPSAwLCByTGVuID0gbS5sZW5ndGg7IHIgPCByTGVuOyByKyspIHtcclxuICAgICAgICAgICAgbGV0IGNvbHMgPSBbXTtcclxuXHJcbiAgICAgICAgICAgIGlmIChtW3JdKSB7IC8vY3JlYXRlIGNvbHVtbnNcclxuICAgICAgICAgICAgICAgIGZvciAobGV0IGMgPSAwOyBjIDwgY29sc1dpZHRoLmxlbmd0aDsgYysrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29scy5wdXNoKG9wdGlvbnMuY2VsbC5wYWRkaW5nTGVmdCArIGFsaWduVGV4dChtW3JdW2NdLCBjb2xzV2lkdGhbY10pICsgb3B0aW9ucy5jZWxsLnBhZGRpbmdSaWdodCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB0YWJsZS5wdXNoKFtvcHRpb25zLnJvdy5wYWRkaW5nTGVmdCwgY29scy5qb2luKG9wdGlvbnMucm93LmNvbFNlcGFyYXRvciksIG9wdGlvbnMucm93LnBhZGRpbmdSaWdodF0uam9pbignJykpO1xyXG4gICAgICAgICAgICB9IGVsc2UgeyAvL2NyZWF0ZSBob3Jpem9udGFsIGxpbmVcclxuICAgICAgICAgICAgICAgIGZvciAobGV0IGMgPSAwOyBjIDwgY29sc1dpZHRoLmxlbmd0aDsgYysrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29scy5wdXNoKHJlcGVhdFN0cihjb2xzV2lkdGhbY10gKyBwYWRkaW5nTGVuZ3RoLCBvcHRpb25zLmhyLnN0cikpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgdGFibGUucHVzaChbb3B0aW9ucy5yb3cucGFkZGluZ0xlZnQsIGNvbHMuam9pbihoclNlcGFyYXRvciksIG9wdGlvbnMucm93LnBhZGRpbmdSaWdodF0uam9pbignJykpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybi
8443B0YWJsZS5qb2luKG9wdGlvbnMucm93LmxpbmVCcmVhayk7XHJcbiAgICB9XHJcblxyXG4gICAgYWxpZ25UZXh0KHR4dCwgd2lkdGgpIHtcclxuICAgICAgICBmdW5jdGlvbiBwYWQodHh0LCB3aWR0aCwgZGlyKSB7XHJcbiAgICAgICAgICAgIGxldCBwID0gd2lkdGggLSB0eHQubGVuZ3RoO1xyXG4gICAgICAgICAgICBsZXQgcEwgPSAoZGlyID4gMCkgPyBwIDogKHAgLyAyKSA8PCAwO1xyXG4gICAgICAgICAgICBsZXQgcFIgPSAoZGlyIDwgMCkgPyBwIDogcEwgKyAocCAtIChwTCAqIDIpKTtcclxuICAgICAgICAgICAgcmV0dXJuIHAgPiAwID8gKGRpciA+PSAwID8gQXJyYXkocEwgKyAxKS5qb2luKFwiIFwiKSA6ICcnKSArIHR4dCArIChkaXIgPD0gMCA/IEFycmF5KHBSICsgMSkuam9pbihcIiBcIikgOiAnJykgOiB0eHQ7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0eHQgPSBcIlwiICsgdHh0OyAvL3RvU3RyaW5nXHJcbiAgICAgICAgc3dpdGNoICh0eHQuY2hhckF0KDApKSB7XHJcbiAgICAgICAgICAgIGNhc2UgJzwnOlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHBhZCh0eHQuc3Vic3RyKDEpLCB3aWR0aCwgLTEpOyAvL2FsaWduIGxlZnRcclxuICAgICAgICAgICAgY2FzZSAnXic6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gcGFkKHR4dC5zdWJzdHIoMSksIHdpZHRoLCAwKTsgLy9hbGlnbiBjZW50ZXJcclxuICAgICAgICAgICAgY2FzZSAnPic6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gcGFkKHR4dC5zdWJzdHIoMSksIHdpZHRoLCAxKTsgLy9hbGlnbiByaWdodFxyXG4gICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHBhZCh0eHQsIHdpZHRoLCAwKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmVuZGVyU2VhdE1hcCh3b3Jrc3BhY2VrZXksIGV2ZW50KSB7XHJcbiAgICAgICAgbGV0IHNlbGYgPSB0aGlzO1xyXG4gICAgICAgIGxldCB1c2VBenVyZSA9IGZhbHNlO1xyXG4gICAgICAgIGxldCBldmVudEFycjtcclxuICAgICAgICBsZXQgY2hhcnRrZXkgPSAnJztcclxuICAgICAgICBsZXQgZXZlbnRpZCA9ICcnO1xyXG4gICAgICAgIGlmICh3b3Jrc3BhY2VrZXkuaW5kZXhPZignYXp1cmU7JykgIT09IC0xKSB7XHJcbiAgICAgICAgICAgIHVzZUF6dXJlID0gdHJ1ZTtcclxuICAgICAgICAgICAgd29ya3NwYWNla2V5ID0gd29ya3NwYWNla2V5LnJlcGxhY2UoJ2F6dXJlOycsICcnKTtcclxuICAgICAgICAgICAgZXZlbnRBcnIgPSBldmVudC5zcGxpdCgnOycpO1xyXG4gICAgICAgICAgICBjaGFydGtleSA9IGV2ZW50QXJyWzBdO1xyXG4gICAgICAgICAgICBldmVudGlkID0gZXZlbnRBcnJbMV07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGxldCBwcmljaW5nQWxsO1xyXG4gICAgICAgIHRoaXMuY3JlYXRlRGVzdHJveVNlYXRDaGFydCgpO1xyXG4gICAgICAgIHRoaXMuSlByaWNlTWFwKCkuc2hvdygpO1xyXG4gICAgICAgIHRoaXMuSlByaWNlTWFwU2VhdHMoKS5zaG93KCk7XHJcbiAgICAgICAgdGhpcy5KUHJpY2VNYXBFeHBsYW5hdGlvbigpLnNob3coKTtcclxuICAgICAgICB0aGlzLkpCbGFua1NlYXRzTWFwKCkuaGlkZSgpO1xyXG4gICAgICAgIGxldCBvcnBoYW5TZWF0ID0gdHJ1ZTtcclxuICAgICAgICBpZiAoc2VsZi5KRnJlZVNlYXRpbmcoKSkge1xyXG4gICAgICAgICAgICBvcnBoYW5TZWF0ID0gdHJ1ZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGxldCBjb2xvclNjaGVtZSA9ICdkYXJrJztcclxuICAgICAgICBsZXQgYmdjb2xvcjtcclxuICAgICAgICBsZXQgc3Rjb2xvcjtcclxuICAgICAgICBsZXQgbnRjb2xvcjtcclxuICAgICAgICBzZWxmLmNvbG9yMSA9ICcjMjUyNTI1JztcclxuICAgICAgICBzZWxmLmNvbG9yMiA9ICcjMzMzMzMzJztcclxuICAgICAgICBiZ2NvbG9yID0gJyMxRTFFMUUnO1xyXG4gICAgICAgIHN0Y29sb3IgPSAnIzAwMDAwMCc7XHJcbiAgICAgICAgbnRjb2xvciA9ICcjNDQ0NDQ0JztcclxuICAgICAgICBpZiAoc2VsZi5KVGhlbWUoKSA9PT0gJ2xpZ2h0Jykge1xyXG4gICAgICAgICAgICBjb2xvclNjaGVtZSA9ICdsaWdodCc7XHJcbiAgICAgICAgICAgIHNlbGYuY29sb3IxID0gJyNFRUYwRjInO1xyXG4gICAgICAgICAgICBzZWxmLmNvbG9yMiA9ICcjZmZmZmZmJztcclxuICAgICAgICAgICAgYmdjb2xvciA9ICcjZmZmZmZmJztcclxuICAgICAgICAgICAgc3Rjb2xvciA9ICcjRUVGMEYyJztcclxuICAgICAgICAgICAgbnRjb2xvciA9ICcjRThFOEU4JztcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCF1c2VBenVyZSkge1xyXG4gICAgICAgICAgICBwcmljaW5nQWxsID0gc2VsZi5nZXRQcmljaW5nQ2F0ZWdvcmllc0FuZENhdGVnb3JpZXNMYWJlbHNBbmRVbmF2YWlsYWJsZUNhdGVnb3JpZXNBbmRTZWF0TGFiZWxzQ2F0ZWdvcmllcygpO1xyXG4gICAgICAgICAgICB0aGlzLnNlYXRDaGFydCA9IG5ldyBzZWF0c2lvLlNlYXRpbmdDaGFydCh7XHJcbiAgICAgICAgICAgICAgICBkaXZJZDogJ3NlYXRzX21hcCcsXHJcbiAgICAgICAgICAgICAgICB3b3Jrc3BhY2VLZXk6IHdvcmtzcGFjZWtleSxcclxuICAgICAgICAgICAgICAgIGNvbG9yU2NoZW1lOiBjb2xvclNjaGVtZSxcclxuICAgICAgICAgICAgICAgIHNob3dGdWxsU2NyZWVuQnV0dG9uOiBmYWxzZSxcclxuICAgICAgICAgICAgICAgIGFsbG93T3JwaGFuU2VhdHM6IG9ycGhhblNlYXQsXHJcbiAgICAgICAgICAgICAgICBleHRyYUNvbmZpZzoge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vcHJpY2luZ0FsbENhdGVnb3J5TGFiZWxzOiBwcmljaW5nQWxsWydjYXRlZ29yeV9sYWJlbHMnXSxcclxuICAgICAgICAgICAgICAgICAgICAvL3ByaWNpbmdBbGxDYXRlZ29yeVByaWNpbmc6IHByaWNpbmdBbGxbJ2NhdGVnb3J5X3ByaWNpbmcnXSxcclxuICAgICAgICAgICAgICAgICAgICBldmVudFNlY3Rpb25zQ2FwYWNpdHk6IHByaWNpbmdBbGxbJ29iamVjdF9jYXRlZ29yaWVzJ10sXHJcbiAgICAgICAgICAgICAgICAgICAgcHJpY2luZ0FsbFNlYXRMYWJlbHM6IHByaWNpbmdBbGxbJ3NlYXRfbGFiZWxzX2NhdGVnb3JpZXMnXSxcclxuICAgICAgICAgICAgICAgICAgICB1bmF2YWlsYWJsZUNhdGVnb3JpZXNTZWF0TGFiZWxzOiBwcmljaW5nQWxsWyd1bmF2YWlsYWJsZV9jYXRlZ29yaWVzJ11cclxuICAgICAgICAgICAgICAgI
8443H0sXHJcbiAgICAgICAgICAgICAgICBwcmljaW5nOiBwcmljaW5nQWxsWydwcmljaW5nX2NhdGVnb3JpZXMnXSxcclxuICAgICAgICAgICAgICAgIGNhdGVnb3JpZXM6IHByaWNpbmdBbGxbJ2NhdGVnb3JpZXNfbGFiZWxzJ10sXHJcbiAgICAgICAgICAgICAgICBvYmplY3RDYXRlZ29yaWVzOiBwcmljaW5nQWxsWydzZWF0X2xhYmVsc19jYXRlZ29yaWVzJ10sXHJcbiAgICAgICAgICAgICAgICB1bmF2YWlsYWJsZUNhdGVnb3JpZXM6IHByaWNpbmdBbGxbJ3VuYXZhaWxhYmxlX2NhdGVnb3JpZXMnXSxcclxuICAgICAgICAgICAgICAgIG9iamVjdENvbG9yOiBmdW5jdGlvbiAob2JqZWN0LCBkZWZhdWx0Q29sb3IsIGV4dHJhQ29uZmlnKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIC8vYmVjYXVzZSB3ZSBkb24ndCBoYXZlIGEgZnVsbCBzZWF0bWFwIGJ5IGNhdGVnb3J5LCB0aGVyZSBpcyBubyB3YXkgdG8ga25vdyB3aGljaCBvbmUgZnJvbSB0aGUgc2VhdHMgYXJlIGFzc2lnbmVkIHRvIHdoaWNoIGNhdGVnb3JpZXMuXHJcbiAgICAgICAgICAgICAgICAgICAgLy93ZSBnZXQgZnJvbSBhcGkgb25seSBhdmFpbGFibGUgc2VhdHNcclxuICAgICAgICAgICAgICAgICAgICAvL2NvbnNvbGUubG9nKG9iamVjdCk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBvYmplY3QuY2F0ZWdvcnkgIT09ICd1bmRlZmluZWQnKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAob2JqZWN0LmNhdGVnb3J5LmxhYmVsID09PSAnTm90IEF2YWlsYWJsZScpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBvYmplY3QuY2F0ZWdvcnkuY29sb3I7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGV4dHJhQ29uZmlnLnByaWNpbmdBbGxTZWF0TGFiZWxzW29iamVjdC5sYWJlbF0pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRlZmF1bHRDb2xvcjtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLmNvbG9yMTtcclxuXHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgY2FuR0FTZWxlY3Rpb25CZUluY3JlYXNlZDogZnVuY3Rpb24gKGdhQXJlYSwgZGVmYXVsdFZhbHVlLCBleHRyYUNvbmZpZykge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgZXh0cmFDb25maWcuZXZlbnRTZWN0aW9uc0NhcGFjaXR5W2dhQXJlYS5sYWJlbF0gIT09ICd1bmRlZmluZWQnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBnYUFyZWEubnVtQm9va2VkICsgZ2FBcmVhLm51bVNlbGVjdGVkIDwgZXh0cmFDb25maWcuZXZlbnRTZWN0aW9uc0NhcGFjaXR5W2dhQXJlYS5sYWJlbF07XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBkZWZhdWx0VmFsdWU7XHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgb2JqZWN0SWNvbjogZnVuY3Rpb24gKG9iamVjdCwgZGVmYXVsdEljb24sIGV4dHJhQ29uZmlnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGRlZmF1bHRJY29uID09PSAnY2hlY2snKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAndXNlcic7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBkZWZhdWx0SWNvbjtcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICBvYmplY3RXaXRob3V0Q2F0ZWdvcnlTZWxlY3RhYmxlOiBmYWxzZSxcclxuICAgICAgICAgICAgICAgIG9iamVjdFRvb2x0aXA6IHtcclxuICAgICAgICAgICAgICAgICAgICBzaG93QWN0aW9uSGludDogZmFsc2UsXHJcbiAgICAgICAgICAgICAgICAgICAgc2hvd0F2YWlsYWJpbGl0eTogZmFsc2UsXHJcbiAgICAgICAgICAgICAgICAgICAgc2hvd0NhdGVnb3J5OiBmYWxzZSxcclxuICAgICAgICAgICAgICAgICAgICBzaG93TGFiZWw6IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgICAgIHNob3dQcmljaW5nOiBmYWxzZSxcclxuICAgICAgICAgICAgICAgICAgICBzaG93VW5hdmFpbGFibGVOb3RpY2U6IHRydWUsXHJcbiAgICAgICAgICAgICAgICAgICAgc3R5bGl6ZWRMYWJlbDogdHJ1ZSxcclxuICAgICAgICAgICAgICAgICAgICBjb25maXJtU2VsZWN0aW9uT25Nb2JpbGU6IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIGNvbG9yczoge1xyXG4gICAgICAgICAgICAgICAgICAgIGN1cnNvclRvb2x0aXBCYWNrZ3JvdW5kQ29sb3I6IHNlbGYuY29sb3IyXHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgdG9vbHRpcEluZm86IGZ1bmN0aW9uIChvYmplY3QpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHNlbGYuZXZlbnRTZWF0c1tvYmplY3QubGFiZWxdICE9PSBcInVuZGVmaW5lZFwiICYmIHR5cGVvZiBvYmplY3QucHJpY2luZyAhPT0gXCJ1bmRlZmluZWRcIiAmJiB0eXBlb2Ygb2JqZWN0LnByaWNpbmcuZm9ybWF0dGVkUHJpY2UgIT09IFwidW5kZWZpbmVkXCIpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgKG9iamVjdC5vYmplY3RUeXBlID09PSAnU2VhdCcpIHtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNlYXRTZWN0aW9uID0gb2JqZWN0LmxhYmVscy5zZWN0aW9uO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzZWF0Um93ID0gb2JqZWN0LmxhYmVscy5wYXJlbnQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNlYXRMYWJlbCA9IG9iamVjdC5sYWJlbHMub3duO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvL2NvbnN0IHNlYXRQcmljZSA9IHBhcnNlRmxvYXQob2JqZWN0LnByaWNpbmcuZm9ybWF0dGVkUHJpY2UpLnRvRml4ZWQoMik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzZWF0UHJpY2UgPSBvYmplY3QucHJpY2luZy5mb3JtYXR0ZWRQcmljZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHNlYXRQcmljZUYgPSBvYmplY3QucHJpY2luZy5wcmljZS50b0ZpeGVkKDIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5pc1BhY2soKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChzZWF0UHJpY2VGIC0gc2VsZi5pbml0UGFja1ByaWNlKSA9PSAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VhdFByaWNlID0gJ0lOQ0xVREVEJ1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWF0UHJpY2UgPSAnKyQnICsgKHNlYXRQcmljZUYgLSBzZWxmLmluaXRQYWNrUHJpY2UpLnRvRml4ZWQoMik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgI
8443H1cclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2VhdE5vdGljZSA9ICdUaWNrZXQgcHJpY2VzIGV4Y2x1ZGVzIGFsbCBmZWVzJztcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHNlYXRBbGVydCA9ICcnO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHNlbGYuZXZlbnRTZWF0c1tvYmplY3QubGFiZWxdW1wic2VhdEFsZXJ0SWRcIl0gIT09IFwidW5kZWZpbmVkXCIgJiYgdHlwZW9mIHNlbGYuc2VhdEFsZXJ0c0FuZFRvb2x0aXBzUGVyTGFiZWxbc2VsZi5ldmVudFNlYXRzW29iamVjdC5sYWJlbF1bXCJzZWF0QWxlcnRJZFwiXV0gIT09ICd1bmRlZmluZWQnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWF0QWxlcnQgPSAnW2JyL10nICsgc2VsZi5zZWF0QWxlcnRzQW5kVG9vbHRpcHNQZXJMYWJlbFtzZWxmLmV2ZW50U2VhdHNbb2JqZWN0LmxhYmVsXVtcInNlYXRBbGVydElkXCJdXVsnZGlzcGxheV9uYW1lJ10gKyAnW2JyL10nO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBtID0gW1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgWydeU2VjdGlvbicsICdeUm93JywgJ15TZWF0J10sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJ14nICsgc2VhdFNlY3Rpb24sICdeJyArIHNlYXRSb3csICdeJyArIHNlYXRMYWJlbF0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIF07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vcmV0dXJuICdbcHJlXScgKyBzZWxmLm1hdHJpeFRvQXNjaWlUYWJsZShtKSArICdbL3ByZV0nICsgJ1twcmVdJyArIHNlbGYubWF0cml4VG9Bc2NpaVRhYmxlKG0xKSArICdbL3ByZV0nICsgJ1tici9dJyArICdbYnIvXScgKyBzZWF0Tm90aWNlICsgJ1tici9dJyArICdbYnIvXScgKyBzZWF0QWxlcnQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnW3ByZV0nICsgc2VsZi5tYXRyaXhUb0FzY2lpVGFibGUobSkgKyAnWy9wcmVdJyArICdbYnIvXScgKyAnW3ByZV0nICsgXCLigJTigJTigJTigJTigJTigJTigJTigJTigJTigJTigJTigJTigJTigJTigJTigJTigJTigJTigJTigJTigJTigJTigJTigJTigJTigJRcIiArICdbL3ByZV0nICsgJ1tici9dJyArICdbYnIvXScgKyAnW3ByZV0nICsgc2VsZi5hbGlnblRleHQoJycgKyBzZWF0UHJpY2UsIDI1KSArICdbL3ByZV0nICsgJ1tici9dJyArICdbYnIvXScgKyBzZWxmLmFsaWduVGV4dChzZWF0Tm90aWNlLCAyNSkgKyAnW2JyL10nICsgJ1tici9dJyArIHNlbGYuYWxpZ25UZXh0KHNlYXRBbGVydCwgMjUpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHNlbGYuZXZlbnRTZWN0aW9uc0NhcGFjaXR5W29iamVjdC5sYWJlbF0gIT09IFwidW5kZWZpbmVkXCIgJiYgdHlwZW9mIG9iamVjdC5wcmljaW5nICE9PSBcInVuZGVmaW5lZFwiICYmIHR5cGVvZiBvYmplY3QucHJpY2luZy5mb3JtYXR0ZWRQcmljZSAhPT0gXCJ1bmRlZmluZWRcIikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiAob2JqZWN0Lm9iamVjdFR5cGUgPT09ICdTZWF0Jykge1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2VhdFNlY3Rpb24gPSBvYmplY3QubGFiZWw7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNlYXROb3RpY2UgPSAnVGlja2V0IHByaWNlcyBleGNsdWRlcyBhbGwgZmVlcyc7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vY29uc3Qgc2VhdFByaWNlID0gcGFyc2VGbG9hdChvYmplY3QucHJpY2luZy5mb3JtYXR0ZWRQcmljZSkudG9GaXhlZCgyKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHNlYXRQcmljZSA9IG9iamVjdC5wcmljaW5nLmZvcm1hdHRlZFByaWNlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgc2VhdFByaWNlRiA9IG9iamVjdC5wcmljaW5nLnByaWNlLnRvRml4ZWQoMik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoc2VhdFByaWNlRiAtIHNlbGYuaW5pdFBhY2tQcmljZSkgPT0gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VhdFByaWNlID0gJ0lOQ0xVREVEJ1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VhdFByaWNlID0gJyskJyArIChzZWF0UHJpY2VGIC0gc2VsZi5pbml0UGFja1ByaWNlKS50b0ZpeGVkKDIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBtID0gW1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgWydeU2VjdGlvbiddLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgWydeJyArIHNlYXRTZWN0aW9uXSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy9yZXR1cm4gJ1twcmVdJyArIHNlbGYubWF0cml4VG9Bc2NpaVRhYmxlKG0pICsgJ1svcHJlXScgKyAnW3ByZV0nICsgc2VsZi5tYXRyaXhUb0FzY2lpVGFibGUobTEpICsgJ1svcHJlXScgKyAnW2JyL10nICsgJ1tici9dJyArIHNlYXROb3RpY2UgKyAnW2JyL10nICsgJ1tici9dJyArIHNlYXRBbGVydDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdbcHJlXScgKyBzZWxmLm1hdHJpeFRvQXNjaWlUYWJsZShtKSArICdbL3ByZV0nICsgJ1tici9dJyArICdbcHJlXScgKyBcIuKAlOKAlOKAlOKAlOKAlOKAlOKAlOKAlOKAlOKAlOKAlOKAlOKAlOKAlOKAlOKAlOKAlOKAlOKAlOKAlOKAlOKAlOKAlOKAlOKAlOKAlFwiICsgJ1svcHJlXScgKyAnW2JyL10nICsgJ1tici9dJyArICdbcHJlXScgKyBzZWxmLmFsaWduVGV4dCgnJyArIHNlYXRQcmljZSwgMjUpICsgJ1svcHJlXScgKyAnW2JyL10nICsgJ1tici9dJyArIHNlbGYuYWxpZ25UZXh0KHNlYXROb3RpY2UsIDI1KSArICdbYnIvXScgKyAnW2JyL10nO1xyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnTm90IEF2YWlsYWJsZSc7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIC8vfVxyXG4gICAgICAgICAgICAgICAgICAgIC8vY2hlY2sgaWYgb2JqZWN0IGxhYmVsIGhhcyBzZWF0IGFsZXJ0XHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgZXZlbnQ6IGV2ZW50LFxyXG4gICAgICAgICAgICAgICAgb25DaGFydFJlbmRlcmVkOiBmdW5jdGlvbiAoY2hhcnQpIHtcclxuXHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgb25PYmplY3REZXNlbGVjdGVkOiBmdW5jdGlvbiAob2JqZWN0LCBkZXNlbGVjdGVkVGlja2V0VHlwZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICghc2VsZi5KRnJlZVNlYXRpbmcoKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgcG9kcyA9IFtdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGtwIGluIHNlbGYucG9kcykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBrcHAgaW4gc2VsZi5wb2RzW2twXSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLnBvZHNba3BdW2twcF0gPT09IG9iamVjdC5sYWJlbCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb2RzID0gc2VsZi5wb2RzW2twXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgI
8443HNlbGYuc2VhdENoYXJ0LmRlc2VsZWN0T2JqZWN0cyhwb2RzKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5zZWF0Q2hhcnQubGlzdFNlbGVjdGVkT2JqZWN0cyhcclxuICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gKHNlbGVjdGVkT2JqZWN0cykge1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGMgPSAwOyBjIDwgc2VsZWN0ZWRPYmplY3RzLmxlbmd0aDsgYysrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGVjdGVkT2JqZWN0c1tjXS5sYWJlbCA9PT0gb2JqZWN0LmxhYmVsICYmIHR5cGVvZiBzZWxlY3RlZE9iamVjdHNbY10ubnVtU2VsZWN0ZWQgPT09ICd1bmRlZmluZWQnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkT2JqZWN0cy5zcGxpY2UoYywgMSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc2VsZi5KRnJlZVNlYXRpbmcoKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLmZyb21EZWxldGUgIT09IGZhbHNlICYmIHNlbGVjdGVkT2JqZWN0cy5sZW5ndGggPCBzZWxmLmZyb21EZWxldGUgLSAyICYmIHNlbGYuZnJvbURlbGV0ZSA+IDEgfHwgc2VsZi5mcm9tRGVsZXRlID09PSBmYWxzZSAmJiBzZWxlY3RlZE9iamVjdHMubGVuZ3RoIDwgc2VsZi5zZWxlY3RlZExhYmVscy5sZW5ndGggLSAxKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN3YWwuZmlyZSh7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZTogJ0luZm9ybWF0aW9uJyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQ6ICdZb3Ugc2VsZWN0ZWQgc2VhdHMgaGF2ZSBiZWVuIHJlbW92ZWQgYmVjYXVzZSB5b3UgY2Fubm90IGhhdmUgb3JwaGFuIHNlYXRzJyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGljb246ICd3YXJuaW5nJyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpcm1CdXR0b25UZXh0OiAnT2snXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmZyb21EZWxldGUgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuc2VsZWN0QmFzZWRPbkRyb3BEb3duKHNlbGVjdGVkT2JqZWN0cyk7XHJcblxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICk7XHJcblxyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIG9uT2JqZWN0U2VsZWN0ZWQ6IGZ1bmN0aW9uIChvYmplY3QsIHNlbGVjdGVkVGlja2V0VHlwZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBkZXNlbGVjdGVkID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBzZWxmLmV2ZW50U2VhdHNbb2JqZWN0LmxhYmVsXSAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIHNlbGYuZXZlbnRTZWF0c1tvYmplY3QubGFiZWxdW1wic2VhdEFsZXJ0SWRcIl0gIT09IFwidW5kZWZpbmVkXCIpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBzZWxmLnNlYXRBbGVydHNBbmRUb29sdGlwc1BlckxhYmVsW3NlbGYuZXZlbnRTZWF0c1tvYmplY3QubGFiZWxdW1wic2VhdEFsZXJ0SWRcIl1dICE9PSAndW5kZWZpbmVkJykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYuc2VhdEFsZXJ0c0FuZFRvb2x0aXBzUGVyTGFiZWxbc2VsZi5ldmVudFNlYXRzW29iamVjdC5sYWJlbF1bXCJzZWF0QWxlcnRJZFwiXV1bJ3JlcXVpcmVfYWNrbm93bGVkZ2VtZW50J10pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWNvbmZpcm0oc2VsZi5zZWF0QWxlcnRzQW5kVG9vbHRpcHNQZXJMYWJlbFtzZWxmLmV2ZW50U2VhdHNbb2JqZWN0LmxhYmVsXVtcInNlYXRBbGVydElkXCJdXVsnZGlzcGxheV9uYW1lJ10pKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdC5kZXNlbGVjdCgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNlbGVjdGVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFkZXNlbGVjdGVkKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnNlYXRDaGFydC5saXN0U2VsZWN0ZWRPYmplY3RzKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gKHNlbGVjdGVkT2JqZWN0cykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuc2VsZWN0QmFzZWRPbkRyb3BEb3duKHNlbGVjdGVkT2JqZWN0cyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIHByaWNlRm9ybWF0dGVyOiBmdW5jdGlvbiAocHJpY2UpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gJyQnICsgcGFyc2VGbG9hdChwcmljZSkudG9GaXhlZCgyKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSkucmVuZGVyKCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcHJpY2luZ0FsbCA9IHNlbGYuZ2V0UHJpY2luZ0NhdGVnb3JpZXNBbmRDYXRlZ29yaWVzTGFiZWxzQW5kVW5hdmFpbGFibGVDYXRlZ29yaWVzQW5kU2VhdExhYmVsc0NhdGVnb3JpZXNBenVyZSgpO1xyXG5cclxuICAgICAgICAgICAgbGV0IHN0eWxlID0ge1xyXG4gICAgICAgICAgICAgICAgYmdDb2xvcjogYmdjb2xvcixcclxuICAgICAgICAgICAgICAgI
8443HN0cm9rZUNvbG9yOiBzdGNvbG9yLFxyXG4gICAgICAgICAgICAgICAgbm90QXZhaWxhYmxlQ29sb3I6IG50Y29sb3IsXHJcbiAgICAgICAgICAgICAgICBiZ0NvbG9yU2VsZWN0ZWQ6ICcjMDAwMDAwJyxcclxuICAgICAgICAgICAgICAgIGZvbnQ6IHtcclxuICAgICAgICAgICAgICAgICAgICBjb2xvcjogJyMwMDAwMDAnLFxyXG4gICAgICAgICAgICAgICAgICAgIGZvbnRGYW1pbHk6ICdBcmlhbCcsXHJcbiAgICAgICAgICAgICAgICAgICAgZm9udFdlaWdodDogJ25vcm1hbCcgLy9ub3JtYWwsIGJvbGQsIGl0YWxpY1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgbGV0IG5vdEF2YWlsYWJsZVBvcG92ZXJIdG1sID0gYDxkaXYgc3R5bGU9J1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg6IDI1MHB4OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogIzNlM2UzZTsgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3JkZXItcmFkaXVzOiA0cHg7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWRkaW5nOiA1cHggMTBweCA1cHggMTBweDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvcjogI2ZmZjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvbnQtc2l6ZTogMTJweDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJveC1zaGFkb3c6IDFweCAwcHggMjVweCAtM3B4ICMzZTNlM2U7X
8443HJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwIHN0eWxlPSdjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjgwKTsgZm9udC1zaXplOiAxNHB4OyBmb250LXN0eWxlOiBub3JtYWw7IGZvbnQtd2VpZ2h0OiA1MDA7IGxpbmUtaGVpZ2h0OiAyMnB4O3RleHQtYWxpZ246IGNlbnRlcjsgIG1hcmdpbi10b3A6IDEwcHg7Jz5Ob3QgYXZhaWxhYmUgPC9wPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9J2NvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuODApOyB0ZXh0LWFsaWduOiBjZW50ZXI7IGZvbnQtc2l6ZTogMTJweDsgZm9udC1zdHlsZTogbm9ybWFsOyBmb250LXdlaWdodDogNTAwOyBsaW5lLWhlaWdodDogMjBweDsgYmFja2dyb3VuZC1jb2xvcjojMDAwOyB3aWR0aDoxMDAlOyBwYWRkaW5nOjAgNXB4Oyc+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm90IGF2YWlsYWJsZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+YDtcclxuXHJcbiAgICAgICAgICAgIGxldCBhdHRyaWJ1dGVzID0ge1xyXG4gICAgICAgICAgICAgICAgc2hvd1pvb21PdXRCdXR0b246IHRydWUsXHJcbiAgICAgICAgICAgICAgICBhbGxvd09ycGhhblNlYXRzOiB0cnVlLFxyXG4gICAgICAgICAgICAgICAgcG9kczogZmFsc2UsXHJcbiAgICAgICAgICAgICAgICBub3RBdmFpbGFibGVQb3BvdmVySHRtbDogbm90QXZhaWxhYmxlUG9wb3Zlckh0bWxcclxuICAgICAgICAgICAgfTtcclxuLy8gICAgICAgICAgICB0aGlzLnRvZ2dsZUNhdGVnb3JpZXMgPSBbXTtcclxuICAgICAgICAgICAgLy90b2tlbjogXCJleUpoYkdjaU9pSklVekkxTmlJc0luUjVjQ0k2SWtwWFZDSjkuZXlKeWIyeGxJam9pVTJWaGRHbHVaeUlzSW01aGJXVWlPaUl6SWl3aVpXMWhhV3dpT2lKelpXRjBhVzVuUUhKdmQyVmlMbkp2SWl3aVJuVnNiRTVoYldVaU9pSlRaV0YwYVc1bklFRndjQ0lzSW1oMGRIQTZMeTl6WTJobGJXRnpMbmh0YkhOdllYQXViM0puTDNkekx6SXdNRFV2TURVdmFXUmxiblJwZEhrdlkyeGhhVzF6TDNONWMzUmxiU0k2SWpFeU16SXpNak15SWl3aVJtbHljM1JPWVcxbElqb2lVMlZoZEdsdVp5SXNJa3hoYzNST1lXMWxJam9pUVhCd0lpd2libUptSWpveE5qYzJNamd4TVRNeExDSmxlSEFpT2pFMk56WTFOREF6TXpFc0ltbGhkQ0k2TVRZM05qSTRNVEV6TVgwLkJwSHNzSUFrbkxxRWlNSXdUZ2o4b3k0eDlFbU9LLWpodFBoa3BPSkI0U1lcIixcclxuICAgICAgICAgICAgLy9jaGFydElkOiBcImU3ZTI5MjA1LTQxYjAtNDdlMi1hODM2LTY1MzdkMzdjNmE3ZVwiLFxyXG4gICAgICAgICAgICAvL2V2ZW50SWQ6IFwiZTdlMjkyMDUtNDFiMC00N2UyLWE4MzYtNjUzN2QzN2M2YTdlXCIsXHJcblxyXG4gICAgICAgICAgICB0aGlzLnNlYXRDaGFydCA9IG5ldyBfYXMuY2hhcnRMYXlvdXQoe1xyXG4gICAgICAgICAgICAgICAgdG9rZW46IHdvcmtzcGFjZWtleSArIFwiXCIsXHJcbiAgICAgICAgICAgICAgICBjaGFydElkOiBjaGFydGtleSArIFwiXCIsXHJcbiAgICAgICAgICAgICAgICBjb250YWluZXJJZDogXCJzZWF0c19tYXBcIixcclxuICAgICAgICAgICAgICAgIGV2ZW50SWQ6IGV2ZW50aWQgKyBcIlwiLFxyXG4gICAgICAgICAgICAgICAgcHJpY2VzOiBwcmljaW5nQWxsWydwcmljaW5nX2NhdGVnb3JpZXMnXSxcclxuICAgICAgICAgICAgICAgIGNhdGVnb3JpZXM6IHByaWNpbmdBbGxbJ2NhdGVnb3JpZXNfbGFiZWxzJ10sXHJcbiAgICAgICAgICAgICAgICBvYmplY3RzOiBwcmljaW5nQWxsWydzZWF0X2xhYmVsc19jYXRlZ29yaWVzJ10sXHJcbiAgICAgICAgICAgICAgICAvL3ByaWNlczogcHJpY2VzLFxyXG4gICAgICAgICAgICAgICAgLy9jYXRlZ29yaWVzOiBjYXRlZ29yaWVzLFxyXG4gICAgICAgICAgICAgICAgLy9vYmplY3RzOiBvYmplY3RzLFxyXG4gICAgICAgICAgICAgICAgc3R5bGU6IHN0eWxlLFxyXG4gICAgICAgICAgICAgICAgdGhlbWU6IHNlbGYuSlRoZW1lKCksXHJcbiAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzOiBhdHRyaWJ1dGVzXHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5zZWF0Q2hhcnQucmVuZGVyKHRoaXMub25PYmplY3RDbGljaywgdGhpcy5vbk9iamVjdEhvdmVyLCBzZWxmLCBwcmljaW5nQWxsKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgb25PYmplY3RIb3ZlcihvYmosIG1haW4sIHNlbGYpIHtcclxuICAgICAgICBsZXQgc2VhdCA9IG9iai5vYmplY3Q7XHJcbiAgICAgICAgY29uc3Qgc3BsaXQgPSBzZWF0LmxhYmVsLnNwbGl0KCctJyk7XHJcblxyXG4gICAgICAgIGxldCBmb290ZXIgPSBgYDtcclxuICAgICAgICBsZXQgc2VhdEFsZXJ0ID0gJyc7XHJcblxyXG4gICAgICAgIGlmICh0eXBlb2Ygc2VsZi5ldmVudFNlYXRzICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2Ygc2VsZi5ldmVudFNlYXRzW3NlYXQubGFiZWxdICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2Ygc2VsZi5zZWF0QWxlcnRzQW5kVG9vbHRpcHNQZXJMYWJlbCAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIHNlbGYuZXZlbnRTZWF0c1tzZWF0LmxhYmVsXVtcInNlYXRBbGVydElkXCJdICE9PSBcInVuZGVmaW5lZFwiICYmIHR5cGVvZiBzZWxmLnNlYXRBbGVydHNBbmRUb29sdGlwc1BlckxhYmVsW3NlbGYuZXZlbnRTZWF0c1tzZWF0LmxhYmVsXVtcInNlYXRBbGVydElkXCJdXSAhPT0gJ3VuZGVmaW5lZCcpIHtcclxuICAgICAgICAgICAgc2VhdEFsZXJ0ID0gJzxwIHN0eWxlPVwibWFyZ2luLXRvcDogMTBweDsgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC44MCk7IHRleHQtYWxpZ246Y2VudGVyO2ZvbnQtc2l6ZTogMTJweDsgZm9udC1zdHlsZTogbm9ybWFsOyBmb250LXdlaWdodDogNTAwOyBsaW5lLWhlaWdodDogMjBweDsgXCI+JyArIHNlbGYuc2VhdEFsZXJ0c0FuZFRvb2x0aXBzUGVyTGFiZWxbc2VsZi5ldmVudFNlYXRzW3NlYXQubGFiZWxdW
84431wic2VhdEFsZXJ0SWRcIl1dWydkaXNwbGF5X25hbWUnXSArICc8L3A+JztcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChzZWF0LnN0YXR1c0lkID09PSAnc2VsZWN0ZWQnKSB7XHJcbiAgICAgICAgICAgIGZvb3RlciA9IGBcclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBzdHlsZT0nYmFja2dyb3VuZC1jb2xvcjojMGNhM2Q2OyB3aWR0aDoxMDAlOyBwYWRkaW5nOjAgNXB4Oyc+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZWxlY3RlZCBcclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGA7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGxldCBwcmljZUJsb2Nrc0FuZFVzZWRCbG9ja3MgPSBzZWxmLmdldFByaWNlQmxvY2tzQW5kVXNlZEJsb2NrcygpO1xyXG4gICAgICAgIGxldCBwcmljZUJsb2NrcyA9IHByaWNlQmxvY2tzQW5kVXNlZEJsb2Nrcy5wcmljZUJsb2NrO1xyXG5cclxuICAgICAgICBsZXQgYmlncHJpY2VjdXQgPSAnJztcclxuICAgICAgICBmb3IgKGxldCBpMSA9IHByaWNlQmxvY2tzLmxlbmd0aCAtIDE7IGkxID49IDA7IGkxLS0pIHtcclxuICAgICAgICAgICAgaWYgKHByaWNlQmxvY2tzW2kxXS5wcmljZUxldmVsSWQgPT0gc2VhdC5jYXRlZ29yeUlkKSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgZnVsbFJldGFpbFByaWNlID0gcHJpY2VCbG9ja3NbaTFdLmZ1bGxSZXRhaWxQcmljZTtcclxuICAgICAgICAgICAgICAgIGlmIChwcmljZUJsb2Nrc1tpMV0uYmlnUHJpY2UgJiYgc2VhdC5wcmljZXNbMF0ucHJpY2UgPT0gZnVsbFJldGFpbFByaWNlKVxyXG4gICAgICAgICAgICAgICAgICAgIGJpZ3ByaWNlY3V0ID0gJzxzcGFuIHN0eWxlPVwicG9zaXRpb246cmVsYXRpdmU7IGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuOCk7Zm9udC13ZWlnaHQ6IDQwMDtcIj4nICsgcHJpY2VCbG9ja3NbaTFdLmJpZ1ByaWNlLnRvRml4ZWQoMilcclxuICAgICAgICAgICAgICAgICAgICAgICAgKyAnPGRpdiBzdHlsZT1cIiBib3JkZXItYm90dG9tOiAwLjA3NWVtIHNvbGlkIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC44KTsgbWFyZ2luLXRvcDogMnB4O2xlZnQ6IDA7cG9zaXRpb246IGFic29sdXRlO3JpZ2h0OiAwO3RvcDogNTAlO1wiPjwvZGl2Pjwvc3Bhbj4nO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGxldCBodG1sID0gYDxkaXYgc3R5bGU9J1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg6IDI1MHB4OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogIzNlM2UzZTsgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3JkZXItcmFkaXVzOiA0cHg7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWRkaW5nOiA1cHggMTBweCA1cHggMTBweDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvcjogI2ZmZjsgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9udC1zaXplOiAxMnB4O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dC1hbGlnbjpjZW50ZXI7X
8443HJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3gtc2hhZG93OiAxcHggMHB4IDI1cHggLTNweCAjM2UzZTNlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0YWJsZSBzdHlsZT0nd2lkdGg6IDEwMCU7dGFibGUtbGF5b3V0OiBmaXhlZCc+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyIHN0eWxlPSdjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjgwKTsgZm9udC1zaXplOiAxNHB4OyBmb250LXN0eWxlOiBub3JtYWw7IGZvbnQtd2VpZ2h0OiA1MDA7IGxpbmUtaGVpZ2h0OiAyMnB4Oyc+YDtcclxuICAgICAgICBpZiAoc3BsaXRbMF0pIHtcclxuICAgICAgICAgICAgaHRtbCArPSBgPHRkIHN0eWxlPSd0ZXh0LWFsaWduOmNlbnRlcjsgcGFkZGluZzoycHg7Jz5TZWN0aW9uPC90ZD5gO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoc3BsaXRbMV0pIHtcclxuICAgICAgICAgICAgaHRtbCArPSBgPHRkIHN0eWxlPSd0ZXh0LWFsaWduOmNlbnRlcjtwYWRkaW5nOjJweDsnPlJvdzwvdGQ+YDtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHNwbGl0WzJdKSB7XHJcbiAgICAgICAgICAgIGh0bWwgKz0gYDx0ZCBzdHlsZT0ndGV4dC1hbGlnbjpjZW50ZXI7ICBwYWRkaW5nOjJweDsnPlNlYXQ8L3RkPmA7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChzZWF0LmdhICYmIHNlYXQuZ2EubWF4ID4gMCAmJiB0eXBlb2Ygc2VhdC5nYS5jdXJyZW50ICE9PSAndW5kZWZpbmVkJykge1xyXG4gICAgICAgICAgICBodG1sICs9IGA8dGQgc3R5bGU9XCJ0ZXh0LWFsaWduOmNlbnRlcjsgYmFja2dyb3VuZC1jb2xvcjogIzI0MjEyMTsgcGFkZGluZzoycHg7XCI+U2VsZWN0ZWQgVGlja2V0czwvdGQ+YDtcclxuICAgICAgICB9XHJcbiAgICAgICAgaHRtbCArPSBgPC90cj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHIgc3R5bGU9J2ZvbnQtc2l6ZTogMThweDsgZm9udC1zdHlsZTogbm9ybWFsOyBmb250LXdlaWdodDogNjAwOyBsaW5lLWhlaWdodDogMjZweDsgJz5gO1xyXG4gICAgICAgIGlmIChzcGxpdFswXSkge1xyXG4gICAgICAgICAgICBodG1sICs9IGA8dGQgc3R5bGU9J3RleHQtYWxpZ246Y2VudGVyOyBwYWRkaW5nOjJweDsnPmAgKyBzcGxpdFswXSArIGA8L3RkPmA7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChzcGxpdFsxXSkge1xyXG4gICAgICAgICAgICBodG1sICs9IGA8dGQgc3R5bGU9J3RleHQtYWxpZ246Y2VudGVyOyAgcGFkZGluZzoycHg7Jz5gICsgc3BsaXRbMV0gKyBgPC90ZD5gO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoc3BsaXRbMl0pIHtcclxuICAgICAgICAgICAgaHRtbCArPSBgPHRkIHN0eWxlPSd0ZXh0LWFsaWduOmNlbnRlcjsgcGFkZGluZzoycHg7Jz5gICsgc3BsaXRbMl0gKyBgPC90ZD5gO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoc2VhdC5nYSAmJiBzZWF0LmdhLm1heCA+IDAgJiYgdHlwZW9mIHNlYXQuZ2EuY3VycmVudCAhPT0gJ3VuZGVmaW5lZCcpIHtcclxuICAgICAgICAgICAgaHRtbCArPSBgPHRkIHN0eWxlPVwidGV4dC1hbGlnbjpjZW50ZXI7IGJhY2tncm91bmQtY29sb3I6ICMyNDIxMjE7IHBhZGRpbmc6MnB4O1wiPmAgKyBzZWF0LmdhLmN1cnJlbnQgKyBgPC90ZD5gO1xyXG4gICAgICAgIH1cclxuICAgICAgICBsZXQgcHJpY2V0ID0gc2VhdC5wcmljZXNbMF0ucHJpY2U7XHJcbiAgICAgICAgaWYgKHNlYXQuZ2EgJiYgc2VhdC5nYS5tYXggPiAwICYmIHR5cGVvZiBzZWF0LmdhLmN1cnJlbnQgIT09ICd1bmRlZmluZWQnKSB7XHJcbiAgICAgICAgICAgIGlmIChzZWF0LmdhLmN1cnJlbnQgPT09IDApIHtcclxuICAgICAgICAgICAgICAgIHByaWNldCA9IHNlYXQucHJpY2VzWzBdLnByaWNlO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgcHJpY2V0ID0gc2VhdC5wcmljZXNbMF0ucHJpY2UgKiBzZWF0LmdhLmN1cnJlbnQ7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgaHRtbCArPSBgPC90cj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90YWJsZT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGFibGUgc3R5bGU9J3dpZHRoOiAxMDAlOyc+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0nMycgc3R5bGU9J3RleHQtYWxpZ246Y2VudGVyOyBjb2xvcjogI0JDNUFGRjsgZm9udC13ZWlnaHQ6IDYwMDtmb250LXNpemU6IDI0cHg7IGZvbnQtc3R5bGU6IG5vcm1hbDsgbGluZS1oZWlnaHQ6IDMycHg7IHBhZGRpbmc6MnB4Oyc+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYCArIGJpZ3ByaWNlY3V0ICsgYCAkYCArIHByaWNldC50b0ZpeGVkKDIpICsgYFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPmA7XHJcbiAgICAgICAgaHRtbCArPSBgPC90cj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGFibGU+YDtcclxuICAgICAgICAvLyBpZiAod2luZG93LmxvY2F0aW9uLmhyZWYuaW5kZXhPZignYWFhLnNwb3RsaWdodC52ZWdhcycpID09PSAtMSkge1xyXG4gICAgICAgIC8vICAgICBodG1sICs9IHNlYXRBbGVydCArIGBcclxuICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgIDxwIHN0eWxlPSdtYXJnaW4tdG9wOiAxMHB4OyBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjgwKTsgdGV4dC1hbGlnbjpjZW50ZXI7Zm9udC1zaXplOiAxMnB4OyBmb250LXN0eWxlOiBub3JtYWw7IGZvbnQtd2VpZ2h0OiA1MDA7IGxpbmUtaGVpZ2h0OiAyMHB4OyAnPlByaWNlIGV4Y2x1ZGVzIGFsbCBmZWVzPC9wPlxyXG4gICAgICAgIC8vXHJcbiAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgICBgICsgZm9vdGVyICsgYFxyXG4gICAgICAgIC8vICAgICAgICAgICAgICAgIDwvZGl2PmA7XHJcbiAgICAgICAgLy8gfSBlbHNlIHtcclxuICAgICAgICBodG1sICs9IHNlYXRBbGVydCArIGZvb3RlciArIGBcclxuICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5gO1xyXG4gICAgICAgIC8vfVxyXG4gICAgICAgIG1haW4uc2hvd1BvcG92ZXIoaHRtbCk7XHJcbiAgICB9XHJcblxyXG4gICAgb25PYmplY3RDbGljayhvYmosIG1haW4sIHNlbGYsIHByaWNpbmdBbGwpIHtcclxuICAgICAgICBsZXQgbXlTZWxlY3RkT2JqZWN0ID0gW107XHJcbiAgICAgICAgZm9yIChsZXQgaTEgPSAwOyBpMSA8IG9iai5zZWxlY3RlZE9iamVjdHMubGVuZ3RoOyBpMSsrKSB7XHJcbiAgICAgICAgICAgIGxldCBwcmljZSA9IDA7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcHJpY2luZ0FsbFsnc2VhdF9sYWJlbHNfY2F0ZWdvcmllcyddLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgbGFiZWwgPSBwcmljaW5nQWxsWydzZWF0X2xhYmVsc19jYXRlZ29yaWVzJ11baV1bJ2xhYmVsJ107XHJcbiAgICAgICAgICAgICAgICBsZXQgY2F0SWQgPSBwcmljaW5nQWxsWydzZWF0X2xhYmVsc19jYXRlZ29yaWVzJ11baV1bJ2NhdGVnb3J5SWQnXTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAob2JqLnNlbGVjdGVkT2JqZWN0c1tpMV0uaWQgPT09IGxhYmVsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaTIgPSAwOyBpMiA8IHByaWNpbmdBbGxbJ3ByaWNpbmdfY2F0ZWdvcmllcyddLmxlbmd0aDsgaTIrKykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2F0SWQgPT09IHByaWNpbmdBbGxbJ3ByaWNpbmdfY2F0ZWdvcmllcyddW2kyXVsnY2F0ZWdvcnlJZCddKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmljZSA9IHByaWNpbmdBbGxbJ3ByaWNpbmdfY2F0ZWdvcmllcyddW2kyXVsncHJpY2UnXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBvb29iaiA9IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbDogb2JqLnNlbGVjdGVkT2JqZWN0c1tpMV0uaWQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXVpZDogb2JqLnNlbGVjdGVkT2JqZWN0c1tpMV0uaWQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpY2luZzoge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmljZTogcHJpY2VcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9iai5zZWxlY3RlZE9iamVjdHNbaTFdLmlkLmluZGV4T2YoJy0nKSA9PT0gLTEpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvb29iai5udW1TZWxlY3RlZCA9IG9iai5zZWxlY3RlZE9iamVjdHNbaTFdLnF0eTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgI
8443H1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG15U2VsZWN0ZE9iamVjdC5wdXNoKG9vb2JqKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBzZWxmLnNlbGVjdEJhc2VkT25Ecm9wRG93bihteVNlbGVjdGRPYmplY3QpO1xyXG4gICAgICAgIHNlbGYubXlzZWxlY3RlZE9iamVjdHMgPSBteVNlbGVjdGRPYmplY3Q7XHJcbiAgICB9XHJcblxyXG4gICAgdXBkYXRlT2JqUXVhbnRpdHkob2JqSWQsIHF0eSkge1xyXG4gICAgICAgIGxldCBuZXdNeXNlbGVjdGVkT2JqZWN0ID0gW107XHJcbiAgICAgICAgaWYgKHF0eSA9PT0gMCkge1xyXG4gICAgICAgICAgICBmb3IgKGxldCBpMyA9IDA7IGkzIDwgdGhpcy5teXNlbGVjdGVkT2JqZWN0cy5sZW5ndGg7IGkzKyspIHtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLm15c2VsZWN0ZWRPYmplY3RzW2kzXVsnbGFiZWwnXSA9PT0gb2JqSWQpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIG5ld015c2VsZWN0ZWRPYmplY3QucHVzaCh0aGlzLm15c2VsZWN0ZWRPYmplY3RzW2kzXSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5teXNlbGVjdGVkT2JqZWN0cyA9IG5ld015c2VsZWN0ZWRPYmplY3Q7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuc2VhdENoYXJ0LnVwZGF0ZU9ialF1YW50aXR5KG9iaklkLCBxdHkpO1xyXG4gICAgfVxyXG5cclxuICAgIHRvZ2dsZUNhdGVnb3J5KGNhdGVnb3J5KSB7XHJcbiAgICAgICAgbGV0IHRlbXAgPSBbXTtcclxuICAgICAgICBsZXQgbmV3Q2F0ZWdvcnkgPSB0cnVlO1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdG9nZ2xlQ2F0ZWdvcmllcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBsZXQgZWxlbWVudCA9IHRvZ2dsZUNhdGVnb3JpZXNbaV07XHJcbiAgICAgICAgICAgIGlmIChjYXRlZ29yeSA9PT0gZWxlbWVudCkge1xyXG4gICAgICAgICAgICAgICAgbmV3Q2F0ZWdvcnkgPSBmYWxzZTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRlbXAucHVzaChlbGVtZW50KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAobmV3Q2F0ZWdvcnkpIHtcclxuICAgICAgICAgICAgdGVtcC5wdXNoKGNhdGVnb3J5KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy50b2dnbGVDYXRlZ29yaWVzID0gdGVtcDtcclxuICAgICAgICB0aGlzLnNlYXRDaGFydC50b2dnbGVDYXRlZ29yaWVzSGlnaGxpZ2h0UmVuZGVyKHRlbXApO1xyXG4gICAgfVxyXG5cclxuICAgIGNyZWF0ZURyb3BEb3duU2VsZWN0KGRyb3Bkb3duLCB3b3Jrc3BhY2VrZXksIGV2ZW50KSB7XHJcbiAgICAgICAgbGV0IHNlbGYgPSB0aGlzO1xyXG4gICAgICAgIHRoaXMuSlRpY2tldHNDYXJ0KCkuaHRtbCgnJyk7XHJcbiAgICAgICAgdGhpcy5KVGlja2V0c0NhcnQoKS5zaG93KCk7XHJcbiAgICAgICAgdGhpcy5KVGlja2V0c0NhcnQoKS5hcHBlbmQoJzxkaXYgY2xhc3M9XCJudW1iZXJfb2ZfdGlja2V0c190ZXh0XCI+TnVtYmVyIG9mIHRpY2tldHM6IDwvZGl2PicgKyBkcm9wZG93bik7XHJcbiAgICAgICAgdGhpcy5KVGlja2V0c0Nob29zZXIoKS5vZmYoJ2NoYW5nZScpLm9uKCdjaGFuZ2UnLCBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHNlbGVjdGVkVmFsID0gcGFyc2VJbnQoalF1ZXJ5KHRoaXMpLnZhbCgpKTtcclxuLy8gICAgICAgICAgICBpZiAoc2VsZWN0ZWRWYWwgPT09IDApIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgICAgc2VsZi5zZWxlY3RlZE51bWJlck9mVGlja2V0cyA9IHNlbGVjdGVkVmFsO1xyXG4gICAgICAgICAgICBzZWxmLnNlbGVjdGVkUHJvbW9Db2RlID0gZmFsc2U7XHJcbiAgICAgICAgICAgIGZvciAoY29uc3Qga2V5IGluIHNlbGYuZXZlbnRQcm9tb3Rpb25zKSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgcHJpY2VCID0gc2VsZi5ldmVudFByb21vdGlvbnNba2V5XVsncHJpY2VCbG9ja3MnXTtcclxuICAgICAgICAgICAgICAgIGZvciAoY29uc3Qga2V5cCBpbiBzZWxmLmV2ZW50UHJvbW90aW9uc1trZXldWydwcmljZUJsb2NrcyddKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IG1pblRpY2ssIG1heFRpY2s7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBzZWxmLmV2ZW50UHJvbW90aW9uc1trZXldWydwcmljZUJsb2NrcyddW2tleXBdWydtaW5fdGlja2V0cyddID09PSAndW5kZWZpbmVkJykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBtaW5UaWNrID0gMDtcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBtaW5UaWNrID0gc2VsZi5ldmVudFByb21vdGlvbnNba2V5XVsncHJpY2VCbG9ja3MnXVtrZXlwXVsnbWluX3RpY2tldHMnXTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2Ygc2VsZi5ldmVudFByb21vdGlvbnNba2V5XVsncHJpY2VCbG9ja3MnXVtrZXlwXVsnbWF4X3RpY2tldHMnXSA9PT0gJ3VuZGVmaW5lZCcpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbWF4VGljayA9IDMwO1xyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG1heFRpY2sgPSBzZWxmLmV2ZW50UHJvbW90aW9uc1trZXldWydwcmljZUJsb2NrcyddW2tleXBdWydtYXhfdGlja2V0cyddO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKG1pblRpY2sgPD0gc2VsZWN0ZWRWYWwgJiYgbWF4VGljayA+PSBzZWxlY3RlZFZhbCAmJiBzZWxmLmV2ZW50UHJvbW90aW9uc1trZXldWydpc3BvZHMnXSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnNlbGVjdGVkUHJvbW9Db2RlID0gc2VsZi5ldmVudFByb21vdGlvbnNba2V5XTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYgKHNlbGYuc2VsZWN0ZWRQcm9tb0NvZGUgIT09IGZhbHNlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgI
8443H1cclxuICAgICAgICAgICAgaWYgKHNlbGYuc2VsZWN0ZWRQcm9tb0NvZGUgIT09IGZhbHNlKSB7XHJcbiAgICAgICAgICAgICAgICBzZWxmLnJlbmRlclNlYXRNYXAod29ya3NwYWNla2V5LCBldmVudCk7XHJcbiAgICAgICAgICAgICAgICBzZWxmLmNyZWF0ZVByaWNpbmdNYXAoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHRoaXMuSlRpY2tldHNDaG9vc2VyKCkudHJpZ2dlcignY2hhbmdlJyk7XHJcbiAgICB9XHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IFJ3YkV2ZW50c0Zvcm1Db250cm9sbGVyXHJcblxyXG4vKmdBY3Rpb25zKCkge1xyXG4gICAgICAgIHRoaXMuSkJ1eUJ1dHRvbigpLmhpZGUoKTtcclxuICAgICAgICB0aGlzLkpCdXlCdXR0b24oKS5vZmYoJ2NsaWNrJykub24oJ2NsaWNrJywgalF1ZXJ5LnByb3h5KHRoaXMuYnV5Tm93QWN0aW9uLCB0aGlzKSk7XHJcbiAgICAgICAgdGhpcy5KUXR5KCkub24oJ2NoYW5nZScsIGpRdWVyeS5wcm94eSh0aGlzLmNoYW5nZVF0eUFjdGlvbiwgdGhpcykpO1xyXG4gICAgfVxyXG5cclxuICAgIGNhcnRBY3Rpb25zKCkge1xyXG4gICAgICAgIHRoaXMuSkJ0bigpLm9uKCdjbGljaycsIGpRdWVyeS5wcm94eSh0aGlzLmJ1eVRpY2tldEJ0biwgdGhpcykpO1xyXG4gICAgfVxyXG4gICAgY2hhbmdlUXR5QWN0aW9uKCkge1xyXG4gICAgICAgIGNvbnN0IHF0eSA9IHRoaXMuSlF0eSgpLnZhbCgpO1xyXG4gICAgICAgIHRoaXMuc2VhdENoYXJ0LmNoYW5nZUNvbmZpZyh7XHJcbiAgICAgICAgICAgIG51bWJlck9mUGxhY2VzVG9TZWxlY3Q6IHF0eSxcclxuICAgICAgICAgICAgbWF4U2VsZWN0ZWRPYmplY3RzOiBxdHlcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBidXlOb3dBY3Rpb24oKSB7XHJcbiAgICAgICAgbGV0IGxhYmVscyA9IFtdO1xyXG4gICAgICAgIGxldCBzZWxmID0gdGhpcztcclxuICAgICAgICB0aGlzLnNlYXRDaGFydC5saXN0U2VsZWN0ZWRPYmplY3RzKFxyXG4gICAgICAgICAgICBmdW5jdGlvbiAoc2VsZWN0ZWRPYmplY3RzKSB7XHJcbiAgICAgICAgICAgICAgICBzZWxmLnNlbGVjdGVkT2JqZWN0Q2hhcnQgPSBzZWxlY3RlZE9iamVjdHM7XHJcbiAgICAgICAgICAgICAgICBsZXQgYztcclxuICAgICAgICAgICAgICAgIGxldCBwO1xyXG4gICAgICAgICAgICAgICAgZm9yIChjID0gMDsgYyA8IHNlbGYuc2VsZWN0ZWRPYmplY3RDaGFydC5sZW5ndGg7IGMrKykge1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBsYWJlbCA9IHt9O1xyXG4gICAgICAgICAgICAgICAgICAgIGxhYmVsLmxhYmVsID0gc2VsZi5zZWxlY3RlZE9iamVjdENoYXJ0W2NdLmxhYmVsO1xyXG4gICAgICAgICAgICAgICAgICAgIGZvciAocCA9IDA7IHAgPCBzZWxmLnNlbGVjdGVkT2JqZWN0Q2hhcnRbY10ucHJpY2luZy50aWNrZXRUeXBlcy5sZW5ndGg7IHArKykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5zZWxlY3RlZE9iamVjdENoYXJ0W2NdLnByaWNpbmcudGlja2V0VHlwZXNbcF1bJ3RpY2tldFR5cGUnXSA9PT0gc2VsZi5zZWxlY3RlZE9iamVjdENoYXJ0W2NdLnNlbGVjdGVkVGlja2V0VHlwZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWwucHJpY2UgPSBzZWxmLnNlbGVjdGVkT2JqZWN0Q2hhcnRbY10ucHJpY2luZy50aWNrZXRUeXBlc1twXVsncHJpY2UnXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsLnR5cGUgPSBzZWxmLnNlbGVjdGVkT2JqZWN0Q2hhcnRbY10ucHJpY2luZy50aWNrZXRUeXBlc1twXVsndGlja2V0VHlwZSddO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGxhYmVscy5wdXNoKGxhYmVsKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGxhYmVscyA9IE9iamVjdC5hc3NpZ24oe30sIGxhYmVscyk7XHJcbiAgICAgICAgICAgICAgICBsZXQgbWF4UXR5ID0gc2VsZi5KUXR5KCkudmFsKCk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBkYXRhID0ge1xyXG4gICAgICAgICAgICAgICAgICAgIGFjdGlvbjogJ2hvbGRfc2VhdHMnLFxyXG4gICAgICAgICAgICAgICAgICAgIHByb2R1Y3RpZDogc2VsZi5KUHJvZHVjdElkKCksXHJcbiAgICAgICAgICAgICAgICAgICAgc2VhdGxhYmVsczogbGFiZWxzLFxyXG4gICAgICAgICAgICAgICAgICAgIGV2ZW50a2V5OiBzZWxmLnNlbGVjdGVkRXZlbnQsXHJcbiAgICAgICAgICAgICAgICAgICAgcXR5OiBtYXhRdHksXHJcbiAgICAgICAgICAgICAgICAgICAgc2VjdXJpdHk6IGpRdWVyeSgnI3J3Yl9ob2xkX3NlYXRzX25vbmNlJykudmFsKClcclxuICAgICAgICAgICAgICAgIH07XHJcblxyXG5cclxuICAgICAgICAgICAgICAgIC8vaWYgKEpTT04uc3RyaW5naWZ5KHNlbGYub2xkRGF0YVNlbnQpID09PSBKU09OLnN0cmluZ2lmeShkYXRhKSkge1xyXG4gICAgICAgICAgICAgICAgLy9yZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAvL31cclxuXHJcbiAgICAgICAgICAgICAgICAvL3NlbGYub2xkRGF0YVNlbnQgPSBkYXRhO1xyXG5cclxuICAgICAgICAgICAgICAgIHNlbGYuSkJ1eUJ1dHRvbigpLkxvYWRpbmdPdmVybGF5KFwic2hvd1wiKTtcclxuICAgICAgICAgICAgICAgIGpRdWVyeS5hamF4KHtcclxuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnUE9TVCcsXHJcbiAgICAgICAgICAgICAgICAgICAgZGF0YVR5cGU6ICdqc29uJyxcclxuICAgICAgICAgICAgICAgICAgICB1cmw6IGJiTG9jYWwuYWpheF91cmwsXHJcbiAgICAgICAgICAgICAgICAgICAgZGF0YTogZGF0YSxcclxuICAgICAgICAgICAgICAgICAgICBzdWNjZXNzOiBqUXVlcnkucHJveHkoc2VsZi5idXlOb3dDb21wbGV0ZWQsIHNlbGYpXHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgYnV5Tm93Q29tcGxldGVkKHJlc3BvbnNlKSB7XHJcblxyXG4gICAgICAgIGlmIChyZXNwb25zZS5zdWNjZXNzID09PSBmYWxzZSkge1xyXG4gICAgICAgICAgICB0aGlzLnNlYXRDaGFydC5yZXJlbmRlcigpO1xyXG4gICAgICAgICAgICB0aGlzLnNlYXRDaGFydCA9IGZhbHNlO1xyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkT2JqZWN0Q2hhcnQgPSBudWxsO1xyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkRXZlbnQgPSBudWxsO1xyXG4gICAgICAgICAgICBhbGVydChyZXNwb25zZS5tZXNzYWdlKTtcclxuICAgICAgICAgICAgdGhpcy5KQnV5QnV0dG9uKCkuTG9hZGluZ092ZXJsYXkoXCJoaWRlXCIsIHRydWUpO1xyXG4gICAgICAgICAgICB0aGlzLkpCdXlCdXR0b24oKS5oaWRlKCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLmhy
8443ZWYgPSByZXNwb25zZS51cmw7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGJ1eVRpY2tldEJ0bihldmVudCkge1xyXG4gICAgICAgIC8vdGhpcyBpcyBuZWVkZWQgYmVjYXVzZSBldmVudC50YXJnZXQgZG9lcyBub3QgaGF2ZSB0aGUgZWxlbWVudCBjYW4gYmUgYSBzcGFuIGluc2lkZSB0aGUgYnV0dG9uXHJcbiAgICAgICAgbGV0IGJ0biA9IGpRdWVyeShldmVudC50YXJnZXQpO1xyXG4gICAgICAgIGxldCBvYmogPSBidG4uZGF0YSgpO1xyXG4gICAgICAgIGlmIChPYmplY3Qua2V5cyhvYmopLmxlbmd0aCA9PT0gMCAmJiBvYmouY29uc3RydWN0b3IgPT09IE9iamVjdCkge1xyXG4gICAgICAgICAgICBidG4gPSBidG4ucGFyZW50KCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuY3JlYXRlRGVzdHJveVNlYXRDaGFydCgpO1xyXG5cclxuICAgICAgICB0aGlzLmdBY3Rpb25zKCk7XHJcbiAgICAgICAgbGV0IHNlbGYgPSB0aGlzO1xyXG5cclxuICAgICAgICB0aGlzLnNlYXRDaGFydCA9IG5ldyBzZWF0c2lvLlNlYXRpbmdDaGFydCh7XHJcbiAgICAgICAgICAgIGRpdklkOiAnZGl2U2VhdHNpbycsXHJcbiAgICAgICAgICAgIHdvcmtzcGFjZUtleTogdGhpcy5nZXRXb3Jrc3BhY2UoYnRuKSxcclxuICAgICAgICAgICAgZXZlbnQ6IHRoaXMuZ2V0RXZlbnRLZXkoYnRuKSxcclxuICAgICAgICAgICAgcHJpY2luZzogcHJpY2luZ0pzb24sXHJcbiAgICAgICAgICAgIG9uQ2hhcnRSZW5kZXJlZDogZnVuY3Rpb24gKGNoYXJ0KSB7XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIG9uT2JqZWN0RGVzZWxlY3RlZDogZnVuY3Rpb24gKG9iamVjdCwgZGVzZWxlY3RlZFRpY2tldFR5cGUpIHtcclxuICAgICAgICAgICAgICAgIHNlbGYuc2VhdENoYXJ0Lmxpc3RTZWxlY3RlZE9iamVjdHMoXHJcbiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gKHNlbGVjdGVkT2JqZWN0cykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZWN0ZWRPYmplY3RzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuSkJ1eUJ1dHRvbigpLnNob3coKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuSkJ1eUJ1dHRvbigpLmhpZGUoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICk7XHJcblxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBvbk9iamVjdFNlbGVjdGVkOiBmdW5jdGlvbiAob2JqZWN0LCBzZWxlY3RlZFRpY2tldFR5cGUpIHtcclxuICAgICAgICAgICAgICAgIHNlbGYuc2VhdENoYXJ0Lmxpc3RTZWxlY3RlZE9iamVjdHMoXHJcbiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gKHNlbGVjdGVkT2JqZWN0cykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZWN0ZWRPYmplY3RzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuSkJ1eUJ1dHRvbigpLnNob3coKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuSkJ1eUJ1dHRvbigpLmhpZGUoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIC8vbnVtYmVyT2ZQbGFjZXNUb1NlbGVjdDogMSxcclxuICAgICAgICAgICAgcHJpY2VGb3JtYXR0ZXI6IGZ1bmN0aW9uIChwcmljZSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuICckJyArIHByaWNlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSkucmVuZGVyKCk7XHJcblxyXG4gICAgICAgIGNvbnN0IG1heFMgPSB0aGlzLmdldE1heFNlbGVjdGVkU2VhdHMoYnRuKTtcclxuICAgICAgICBpZiAobWF4Uy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIGxldCBtYXhTZWF0cyA9IEZ1bmN0aW9uKCdcInVzZSBzdHJpY3RcIjtyZXR1cm4gKCcgKyAnWycgKyBtYXhTICsgJ10nICsgJyknKSgpO1xyXG4gICAgICAgICAgICB0aGlzLnNlYXRDaGFydC5jaGFuZ2VDb25maWcoe1xyXG4gICAgICAgICAgICAgICAgbWF4U2VsZWN0ZWRPYmplY3RzOiBtYXhTZWF0c1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLnNlYXRDaGFydC5jaGFuZ2VDb25maWcoe1xyXG4gICAgICAgICAgICAgICAgbnVtYmVyT2ZQbGFjZXNUb1NlbGVjdDogMSxcclxuICAgICAgICAgICAgICAgIG1heFNlbGVjdGVkT2JqZWN0czogMVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgY3JlYXRlRGVzdHJveVNlYXRDaGFydCgpIHtcclxuICAgICAgICBpZiAodGhpcy5zZWF0Q2hhcnQgIT09IGZhbHNlKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2VhdENoYXJ0LmRlc3Ryb3koKTtcclxuICAgICAgICAgICAgdGhpcy5KQnV5QnV0dG9uKCkuTG9hZGluZ092ZXJsYXkoJ2hpZGUnKTtcclxuICAgICAgICAgICAgdGhpcy5zZWF0Q2hhcnQgPSBmYWxzZTtcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZE9iamVjdENoYXJ0ID0gbnVsbDtcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZEV2ZW50ID0gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICAqL1xyXG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9mcm9udGVuZC9mcmFtZXdvcmsvUndiRXZlbnRzRm9ybUNvbnRyb2xsZXIuanMiLCJcclxuaW1wb3J0IFJ3YkV2ZW50c0Zvcm1Nb2RlbCBmcm9tICcuL1J3YkV2ZW50c0Zvcm1Nb2RlbCc7XHJcblxyXG4vKipcclxuICogVmlldyB0YWtlcyBjYXJlIHRvIGFueSBodG1sIHJlbmRlcmluZyBhbmQgYW55dGhpbmcgcmVsYXRlZCB0byBzaG93aW5nIG9uIHRoZSBlbGVtZW50IGFuZCBpdHMgY2hpbGRyZW5cclxuICovXHJcblxyXG5cclxuY2xhc3MgUndiRXZlbnRzRm9ybVZpZXcgZXh0ZW5kcyBSd2JFdmVudHNGb3JtTW9kZWwge1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgICAgI
8443HN1cGVyKCk7XHJcblxyXG4gICAgfVxyXG5cclxuICAgIGdldFdhcm5pbmdEaXYobXNnKSB7XHJcbiAgICAgICAgcmV0dXJuICc8ZGl2IGNsYXNzPVwiYmItd2FybmluZ1wiPicgKyBtc2cgKyAnPC9kaXY+JztcclxuICAgIH1cclxuICAgIFxyXG4gICAgc2hvd0xvYWRpbmcoKSB7XHJcbiAgICAgICAgc3dhbChcclxuICAgICAgICAgICAgYmJMb2NhbC5sb2FkaW5nX3RleHRcclxuICAgICAgICApO1xyXG4gICAgICAgIHN3YWwuc2hvd0xvYWRpbmcoKTtcclxuICAgIH1cclxuXHJcbiAgICBzaG93U3VjY2VzcyhodG1sKSB7XHJcbiAgICAgICAgc3dhbChcclxuICAgICAgICAgICAgJ0dvb2Qgam9iIScsXHJcbiAgICAgICAgICAgIGh0bWwsXHJcbiAgICAgICAgICAgICdzdWNjZXNzJ1xyXG4gICAgICAgIClcclxuICAgIH1cclxuXHJcbiAgICBzaG93RXJyb3IoaHRtbCkge1xyXG4gICAgICAgIHN3YWwoXHJcbiAgICAgICAgICAgICdPb3BzIScsXHJcbiAgICAgICAgICAgIGh0bWwsXHJcbiAgICAgICAgICAgICdlcnJvcidcclxuICAgICAgICApXHJcbiAgICB9XHJcblxyXG4gICAgY2xvc2VNb2RhbCgpIHtcclxuICAgICAgICBzd2FsLmNsb3NlTW9kYWwoKTtcclxuICAgICAgICAvL3N3YWwuY2xvc2UoKTtcclxuICAgIH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IFJ3YkV2ZW50c0Zvcm1WaWV3XHJcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL2Zyb250ZW5kL2ZyYW1ld29yay9Sd2JFdmVudHNGb3JtVmlldy5qcyIsImltcG9ydCBSd2JFdmVudHNGb3JtU3BpbmUgZnJvbSAnLi9Sd2JFdmVudHNGb3JtU3BpbmUnO1xyXG5cclxuLyoqXHJcbiAqIE1vZGVsIHRha2VzIGNhcmUgdG8gdGhlIGRhdGEtYXR0cmlidXRlcyBhdHRhY2hlZCB0byB0aGUgZWxlbWVudC9yZWFkLXdyaXRlIGFuZCB0cmlnZ2VyIGV2ZW50cyBvbiBjaGFuZ2Ugb2YgaXQuXHJcbiAqL1xyXG5cclxuY2xhc3MgUndiRXZlbnRzRm9ybU1vZGVsIGV4dGVuZHMgUndiRXZlbnRzRm9ybVNwaW5lIHtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcigpIHtcclxuICAgICAgICBzdXBlcigpO1xyXG4gICAgfVxyXG5cclxuICAgIGNyZWF0ZURhdGVBc1VUQyhkYXRlKSB7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBEYXRlKERhdGUuVVRDKGRhdGUuZ2V0RnVsbFllYXIoKSwgZGF0ZS5nZXRNb250aCgpLCBkYXRlLmdldERhdGUoKSwgZGF0ZS5nZXRIb3VycygpLCBkYXRlLmdldE1pbnV0ZXMoKSwgZGF0ZS5nZXRTZWNvbmRzKCkpKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXRUaW1lem9uZUluTWlsaXNlY29uZHMoZGF0ZWkpIHtcclxuICAgICAgICBsZXQgZGF0ZUlucHV0O1xyXG4gICAgICAgIGlmICghZGF0ZWkpIHtcclxuICAgICAgICAgICAgZGF0ZUlucHV0ID0gbmV3IERhdGUoKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBkYXRlSW5wdXQgPSBuZXcgRGF0ZShkYXRlaSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGxldCBmdWxsWWVhciA9IGRhdGVJbnB1dC5nZXRGdWxsWWVhcigpIHwgMDtcclxuICAgICAgICAvLyBcIkxlYXAgWWVhcnMgYXJlIGFueSB5ZWFyIHRoYXQgY2FuIGJlIGV4YWN0bHkgZGl2aWRlZCBieSA0ICgyMDEyLCAyMDE2LCBldGMpXHJcbiAgICAgICAgLy8gICBleGNlcHQgaWYgaXQgY2FuIGJlIGV4YWN0bHkgZGl2aWRlZCBieSAxMDAsIHRoZW4gaXQgaXNuJ3QgKDIxMDAsMjIwMCxldGMpXHJcbiAgICAgICAgLy9cdCAgZXhjZXB0IGlmIGl0IGNhbiBiZSBleGFjdGx5IGRpdmlkZWQgYnkgNDAwLCB0aGVuIGl0IGlzICgyMDAwLCAyNDAwKVwiXHJcbiAgICAgICAgLy8gKGh0dHBzOi8vd3d3Lm1hdGhzaXNmdW4uY29tL2xlYXAteWVhcnMuaHRtbCkuXHJcbiAgICAgICAgbGV0IGlzTGVhcFllYXIgPSAoKGZ1bGxZZWFyICYgMykgfCAoZnVsbFllYXIgLyAxMDAgJiAzKSkgPT09IDAgPyAxIDogMDtcclxuICAgICAgICAvLyAoZnVsbFllYXIgJiAzKSA9IChmdWxsWWVhciAlIDQpLCBidXQgZmFzdGVyXHJcbiAgICAgICAgLy9BbHRlcm5hdGl2ZTp2YXIgaXNMZWFwWWVhcj0obmV3IERhdGUoY3VycmVudFllYXIsMSwyOSwxMikpLmdldERhdGUoKT09PTI5PzE6MFxyXG4gICAgICAgIGxldCBmdWxsTW9udGggPSBkYXRlSW5wdXQuZ2V0TW9udGgoKSB8IDA7XHJcbiAgICAgICAgbGV0IG9mZnNldERzdCA9IDA7XHJcbiAgICAgICAgLyogb2Zmc2V0RHN0ID0gKFxyXG4gICAgICAgICAgICAvLyAxLiBXZSBrbm93IHdoYXQgdGhlIHRpbWUgc2luY2UgdGhlIEVwb2NoIHJlYWxseSBpc1xyXG4gICAgICAgICAgICAoK2RhdGVJbnB1dCkgLy8gc2FtZSBhcyB0aGUgZGF0ZUlucHV0LmdldFRpbWUoKSBtZXRob2RcclxuICAgICAgICAgICAgLy8gMi4gV2Uga25vdyB3aGF0IHRoZSB0aW1lIHNpbmNlIHRoZSBFcG9jaCBhdCB0aGUgc3RhcnQgb2YgdGhlIHllYXIgaXNcclxuICAgICAgICAgICAgLSAoK25ldyBEYXRlKGZ1bGxZZWFyLCAwLCAwKSkgLy8gZGF5IGRlZmF1bHRzIHRvIDEgaWYgbm90IGV4cGxpY2l0bHkgemVyb2VkXHJcbiAgICAgICAgICAgIC8vIDMuIE5vdywgc3VidHJhY3Qgd2hhdCB3ZSB3b3VsZCBleHBlY3QgdGhlIHRpbWUgdG8gYmUgaWYgZGF5bGlnaHQgc2F2aW5nc1xyXG4gICAgICAgICAgICAvLyAgICAgIGRpZCBub3QgZXhpc3QuIFRoaXMgeWllbGRzIHRoZSB0aW1lLW9mZnNldCBkdWUgdG8gZGF5bGlnaHQgc2F2aW5ncy5cclxuICAgICAgICAgICAgLSAoKFxyXG4gICAgICAgICAgICAgICAgKChcclxuICAgICAgICAgICAgICAgICAgICAvLyBDYWxjdWxhdGUgdGhlIGRheSBvZiB0aGUgeWVhciBpbiB0aGUgR3JlZ29yaWFuIGNhbGVuZGFyXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gVGhlIGNvZGUgYmVsb3cgd29ya3MgYmFzZWQgdXBvbiB0aGUgZmFjdHMgb2Ygc2lnbmVkIHJpZ2h0IHNoaWZ0c1xyXG4gICAgICAgICAgICAgICAgICAgIC8vICAgIOKAoiAoeCkgPj4gbjogc2hpZnRzIG4gYW5kIGZpbGxzIGluIHRoZSBuIGhpZ2hlc3QgYml0cyB3aXRoIDBzXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gICAg4oCiICgteCkgPj4gbjogc2hpZnRzIG4gYW5kIGZpbGxzIGluIHRoZSBuIGhpZ2hlc3QgYml0cyB3aXRoIDFzXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gKFRoaXMgYXNzdW1lcyB0aGF0IHggaXMgYSBwb3NpdGl2ZSBpbnRlZ2VyKVxyXG4gICAgICAgICAgICAgICAgICAgICgzMSAmICgoLWZ1bGxNb250aCkgPj4gNCkpICsgLy8gSmFudWFyeSAvLyAoLTExKT4+NCA9IC0xXHJcbiAgICAgICAgICAgICAgICAgICAgKCgyOCArIGlzTGVhcFllYXIpICYgKCgxIC0gZnVsbE1vbnRoKSA+PiA0KSkgKyAvLyBGZWJydWFyeVxyXG4gICAgICAgICAgICAgICAgICAgICgzMSAmICgoMiAtIGZ1bGxNb250aCkgPj4gNCkpICsgLy8gTWFyY2hcclxuICAgICAgICAgICAgICAgICAgICAoMzAgJiAoKDMgLSBmdWxsTW9udGgpID4+IDQpKSArIC8vIEFwcmlsXHJcbiAgICAgICAgICAgICAgICAgICAgKDMxICYgKCg0IC0gZnVsbE1vbnRoKSA+PiA0KSkgKyAvLyBNYXlcclxuICAgICAgICAgICAgICAgICAgICAoMzAgJiAoKDUgLSBmdWxsTW9udGgpID4+IDQpKSArIC8vIEp1bmVcclxuICAgICAgICAgICAgICAgICAgICAoMzEgJiAoKDYgLSBmdWxsTW9udGgpID4+IDQpKSArIC8vIEp1bHlcclxuICAgICAgICAgICAgICAgICAgICAoMzEgJiAoKDcgLSBmdWxsTW9udGgpID4+IDQpKSArIC8vIEF1Z3VzdFxyXG4gICAgICAgICAgICAgICAgICAgICgzMCAmICgoOCAtIGZ1bGxNb250aCkgPj4gNCkpICsgLy8gU2VwdGVtYmVyXHJcbiAgICAgICAgICAgICAgICAgICAgKDMxICYgKCg5IC0gZnVsbE1vbnRoKSA+PiA0KSkgKyAvLyBPY3RvYmVyXHJcbiAgICAgICAgICAgICAgICAgICAgKDMwICYgKCgxMCAtIGZ1bGxNb250aCkgPj4gNCkpICsgLy8gTm92ZW1iZXJcclxuICAgICAgICAgICAgICAgICAgICAvLyBUaGVyZSBhcmUgbm8gbW9udGhzIHBhc3QgRGVjZW1iZXI6IHRoZSB5ZWFyIHJvbGxzIGludG8gdGhlIG5leHQuXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gVGh1cywgZnVsbE1vbnRoIGlzIDAtYmFzZWQsIHNvIGl0IHdpbGwgbmV2ZXIgYmUgMTIgaW4gSmF2YXNjcmlwdFxyXG5cclxuICAgICAgICAgICAgICAgICAgICAoZGF0ZUlucHV0LmdldERhdGUoKSB8IDApIC8vIGdldCBkYXkgb2YgdGhlIG1vbnRoXHJcblxyXG4gICAgICAgICAgICAgICAgKSAmIDB4ZmZmZikgKiAyNCAqIDYwIC8vIDI0IGhvdXJzIGluIGEgZGF5LCA2MCBtaW51dGVzIGluIGFuIGhvdXJcclxuICAgICAgICAgICAgICAgICsgKGRhdGVJbnB1dC5nZXRIb3VycygpICYgMHhmZikgKiA2MCAvLyA2MCBtaW51dGVzIGluIGFuIGhvdXJcclxuICAgICAgICAgICAgICAgICsgKGRhdGVJbnB1dC5nZXRNaW51dGVzKCkgJiAweGZmKVxyXG4gICAgICAgICAgICApIHwgMCkgKiA2MCAqIDEwMDAgLy8gNjAgc2Vjb25kcyBpbiBhIG1pbnV0ZSAqIDEwMDAgbWlsbGlzZWNvbmRzIGluIGEgc2Vjb25kXHJcbiAgICAgICAgICAgIC0gKGRhdGVJbnB1dC5nZXRTZWNvbmRzKCkgJiAweGZmKSAqIDEwMDAgLy8gMTAwMCBtaWxsaXNlY29uZHMgaW4gYSBzZWNvbmRcclxuICAgICAgICAgICAgLSBkYXRlSW5wdXQuZ2V0TWlsbGlzZWNvbmRzKClcclxuICAgICAgICApO1xyXG4gICAgICAgICAqL1xyXG4gICAgICAgIGlmIChkYXRlSW5wdXQuaXNEU1QoKSkge1xyXG4gICAgICAgICAgICBvZmZzZXREc3QgPSA2MCAqIDYwICogMTAwMDtcclxuICAgICAgICB9XHJcbiAgICAgICAgbGV0IHR6T2Zmc2V0ID0gZGF0ZUlucHV0LmdldFRpbWV6b25lT2Zmc2V0KCkgKiA2MCAqIDEwMDA7XHJcbiAgICAgICAgLyppZiAodHpPZmZzZXQgPCAwKSB7XHJcbiAgICAgICAgICAgI
8443HR6T2Zmc2V0ID0gdHpPZmZzZXQgKyBvZmZzZXREc3Q7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdHpPZmZzZXQgPSB0ek9mZnNldCAtIG9mZnNldERzdDtcclxuICAgICAgICB9Ki9cclxuICAgICAgICByZXR1cm4gdHpPZmZzZXQ7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIGlzTW9iaWxlKCkge1xyXG4gICAgICAgIGxldCBjaGVjayA9IGZhbHNlO1xyXG4gICAgICAgIChmdW5jdGlvbiAoYSkge1xyXG4gICAgICAgICAgICBpZiAoLyhhbmRyb2lkfGJiXFxkK3xtZWVnbykuK21vYmlsZXxhdmFudGdvfGJhZGFcXC98YmxhY2tiZXJyeXxibGF6ZXJ8Y29tcGFsfGVsYWluZXxmZW5uZWN8aGlwdG9wfGllbW9iaWxlfGlwKGhvbmV8b2QpfGlyaXN8a2luZGxlfGxnZSB8bWFlbW98bWlkcHxtbXB8bW9iaWxlLitmaXJlZm94fG5ldGZyb250fG9wZXJhIG0ob2J8aW4paXxwYWxtKCBvcyk/fHBob25lfHAoaXhpfHJlKVxcL3xwbHVja2VyfHBvY2tldHxwc3B8c2VyaWVzKDR8NikwfHN5bWJpYW58dHJlb3x1cFxcLihicm93c2VyfGxpbmspfHZvZGFmb25lfHdhcHx3aW5kb3dzIGNlfHhkYXx4aWluby9pLnRlc3QoYSkgfHwgLzEyMDd8NjMxMHw2NTkwfDNnc298NHRocHw1MFsxLTZdaXw3NzBzfDgwMnN8YSB3YXxhYmFjfGFjKGVyfG9vfHNcXC0pfGFpKGtvfHJuKXxhbChhdnxjYXxjbyl8YW1vaXxhbihleHxueXx5dyl8YXB0dXxhcihjaHxnbyl8YXModGV8dXMpfGF0dHd8YXUoZGl8XFwtbXxyIHxzICl8YXZhbnxiZShja3xsbHxucSl8YmkobGJ8cmQpfGJsKGFjfGF6KXxicihlfHYpd3xidW1ifGJ3XFwtKG58dSl8YzU1XFwvfGNhcGl8Y2N3YXxjZG1cXC18Y2VsbHxjaHRtfGNsZGN8Y21kXFwtfGNvKG1wfG5kKXxjcmF3fGRhKGl0fGxsfG5nKXxkYnRlfGRjXFwtc3xkZXZpfGRpY2F8ZG1vYnxkbyhjfHApb3xkcygxMnxcXC1kKXxlbCg0OXxhaSl8ZW0obDJ8dWwpfGVyKGljfGswKXxlc2w4fGV6KFs0LTddMHxvc3x3YXx6ZSl8ZmV0Y3xmbHkoXFwtfF8pfGcxIHV8ZzU2MHxnZW5lfGdmXFwtNXxnXFwtbW98Z28oXFwud3xvZCl8Z3IoYWR8dW4pfGhhaWV8aGNpdHxoZFxcLShtfHB8dCl8aGVpXFwtfGhpKHB0fHRhKXxocCggaXxpcCl8aHNcXC1jfGh0KGMoXFwtfCB8X3xhfGd8cHxzfHQpfHRwKXxodShhd3x0Yyl8aVxcLSgyMHxnb3xtYSl8aTIzMHxpYWMoIHxcXC18XFwvKXxpYnJvfGlkZWF8aWcwMXxpa29tfGltMWt8aW5ub3xpcGFxfGlyaXN8amEodHx2KWF8amJyb3xqZW11fGppZ3N8a2RkaXxrZWppfGtndCggfFxcLyl8a2xvbnxrcHQgfGt3Y1xcLXxreW8oY3xrKXxsZShub3x4aSl8bGcoIGd8XFwvKGt8bHx1KXw1MHw1NHxcXC1bYS13XSl8bGlid3xseW54fG0xXFwtd3xtM2dhfG01MFxcL3xtYSh0ZXx1aXx4byl8bWMoMDF8MjF8Y2EpfG1cXC1jcnxtZShyY3xyaSl8bWkobzh8b2F8dHMpfG1tZWZ8bW8oMDF8MDJ8Yml8ZGV8ZG98dChcXC18IHxvfHYpfHp6KXxtdCg1MHxwMXx2ICl8bXdicHxteXdhfG4xMFswLTJdfG4yMFsyLTNdfG4zMCgwfDIpfG41MCgwfDJ8NSl8bjcoMCgwfDEpfDEwKXxuZSgoY3xtKVxcLXxvbnx0Znx3Znx3Z3x3dCl8bm9rKDZ8aSl8bnpwaHxvMmltfG9wKHRpfHd2KXxvcmFufG93ZzF8cDgwMHxwYW4oYXxkfHQpfHBkeGd8cGcoMTN8XFwtKFsxLThdfGMpKXxwaGlsfHBpcmV8cGwoYXl8dWMpfHBuXFwtMnxwbyhja3xydHxzZSl8cHJveHxwc2lvfHB0XFwtZ3xxYVxcLWF8cWMoMDd8MTJ8MjF8MzJ8NjB8XFwtWzItN118aVxcLSl8cXRla3xyMzgwfHI2MDB8cmFrc3xyaW05fHJvKHZlfHpvKXxzNTVcXC98c2EoZ2V8bWF8bW18bXN8bnl8dmEpfHNjKDAxfGhcXC18b298cFxcLSl8c2RrXFwvfHNlKGMoXFwtfDB8MSl8NDd8bWN8bmR8cmkpfHNnaFxcLXxzaGFyfHNpZShcXC18bSl8c2tcXC0wfHNsKDQ1fGlkKXxzbShhbHxhcnxiM3xpdHx0NSl8c28oZnR8bnkpfHNwKDAxfGhcXC18dlxcLXx2ICl8c3koMDF8bWIpfHQyKDE4fDUwKXx0NigwMHwxMHwxOCl8dGEoZ3R8bGspfHRjbFxcLXx0ZGdcXC18dGVsKGl8bSl8dGltXFwtfHRcXC1tb3x0byhwbHxzaCl8dHMoNzB8bVxcLXxtM3xtNSl8dHhcXC05fHVwKFxcLmJ8ZzF8c2kpfHV0c3R8djQwMHx2NzUwfHZlcml8dmkocmd8dGUpfHZrKDQwfDVbMC0zXXxcXC12KXx2bTQwfHZvZGF8dnVsY3x2eCg1Mnw1M3w2MHw2MXw3MHw4MHw4MXw4M3w4NXw5OCl8dzNjKFxcLXwgKXx3ZWJjfHdoaXR8d2koZyB8bmN8bncpfHdtbGJ8d29udXx4NzAwfHlhc1xcLXx5b3VyfHpldG98enRlXFwtL2kudGVzdChhLnN1YnN0cigwLCA0KSkpIGNoZWNrID0gdHJ1ZTtcclxuICAgICAgICB9KShuYXZpZ2F0b3IudXNlckFnZW50IHx8IG5hdmlnYXRvci52ZW5kb3IgfHwgd2luZG93Lm9wZXJhKTtcclxuICAgICAgICByZXR1cm4gY2hlY2s7XHJcbiAgICB9XHJcblxyXG4gICAgaW5BcnJheShhcnIsIGVsZW0pIHtcclxuXHJcbiAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gYXJyKSB7XHJcbiAgICAgICAgICAgIGlmICgoYXJyW2tleV0gKyBcIlwiKSA9PT0gKFwiXCIgKyBlbGVtKSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGtleTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgY3JlYXRlSHRtbFRhYmxlKGlkLCBoZWFkLCByb3dzLCBmb290ZXIpIHtcclxuICAgICAgICBsZXQgdGFibGUgPSBqUXVlcnkoJzx0YWJsZSBpZD1cIicgKyBpZCArICdcIj48L3RhYmxlPicpO1xyXG4gICAgICAgIGxldCBoZWFkVGFibGUgPSBqUXVlcnkoJzx0aGVhZD48L3RoZWFkPicpO1xyXG4gICAgICAgIGxldCBib2R5VGFibGUgPSBqUXVlcnkoJzx0Ym9keT48L3Rib2R5PicpO1xyXG4gICAgICAgIGxldCBmb290ZXJUYWJsZSA9IGpRdWVyeSgnPHRmb290PjwvdGZvb3Q+Jyk7XHJcbiAgICAgICAgbGV0IHJvd0h0bWwgPSBqUXVlcnkoJzx0cj48L3RyPicpO1xyXG4gICAgICAgIGZvciAoY29uc3Qga2V5IGluIGhlYWQpIHtcclxuICAgICAgICAgICAgbGV0IGNvbHNwYW4gPSAxO1xyXG4gICAgICAgICAgICBpZiAodHlwZW9mIGhlYWRba2V5XVsnY29sc3BhbiddICE9PSAndW5kZWZpbmVkJykge1xyXG4gICAgICAgICAgICAgICAgY29sc3BhbiA9IGhlYWRba2V5XVsnY29sc3BhbiddO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICByb3dIdG1sLmFwcGVuZChqUXVlcnkoJzx0aCBjb2xzcGFuPVwiJyArIGNvbHNwYW4gKyAnXCI+JyArIGhlYWRba2V5XVsnbGFiZWwnXSArICc8L3RoPicpKTtcclxuXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGhlYWRUYWJsZS5hcHBlbmQocm93SHRtbCk7XHJcbiAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gcm93cykge1xyXG4gICAgICAgICAgICBsZXQgcm93SHRtbCA9IGpRdWVyeSgnPHRyPjwvdHI+Jyk7XHJcbiAgICAgICAgICAgIGZvciAoY29uc3QgY29sIGluIHJvd3Nba2V5XVsnY29sdW1ucyddKSB7XHJcbiAgICAgICAgICAgICAgICByb3dIdG1sLmFwcGVuZChqUXVlcnkoJzx0ZD4nICsgcm93c1trZXldWydjb2x1bW5zJ11bY29sXSArICc8L3RkPicpKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBib2R5VGFibGUuYXBwZW5kKHJvd0h0bWwpO1xyXG4gICAgICAgI
8443H1cclxuICAgICAgICBsZXQgcm93SHRtbDEgPSBqUXVlcnkoJzx0cj48L3RyPicpO1xyXG4gICAgICAgIGZvciAoY29uc3Qga2V5IGluIGZvb3Rlcikge1xyXG4gICAgICAgICAgICBsZXQgY29sc3BhbiA9IDE7XHJcbiAgICAgICAgICAgIGlmICh0eXBlb2YgZm9vdGVyW2tleV1bJ2NvbHNwYW4nXSAhPT0gJ3VuZGVmaW5lZCcpIHtcclxuICAgICAgICAgICAgICAgIGNvbHNwYW4gPSBmb290ZXJba2V5XVsnY29sc3BhbiddO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICByb3dIdG1sMS5hcHBlbmQoalF1ZXJ5KCc8dGQgY29sc3Bhbj1cIicgKyBjb2xzcGFuICsgJ1wiPicgKyBmb290ZXJba2V5XVsnbGFiZWwnXSArICc8L3RkPicpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZm9vdGVyVGFibGUuYXBwZW5kKHJvd0h0bWwxKTtcclxuICAgICAgICB0YWJsZS5hcHBlbmQoaGVhZFRhYmxlKS5hcHBlbmQoYm9keVRhYmxlKS5hcHBlbmQoZm9vdGVyVGFibGUpO1xyXG4gICAgICAgIHJldHVybiB0YWJsZTtcclxuICAgIH1cclxuXHJcbiAgICBnZXRUaW1lKHNEYXRlLCB3aXRoVGltZSA9IHRydWUpIHtcclxuICAgICAgICAvL2NvbnN0IGQgPSBnZXROb3JtYWxEYXRlKHNEYXRlKTtcclxuICAgICAgICBpZiAodHlwZW9mIHNEYXRlID09PSAnb2JqZWN0Jykge1xyXG4gICAgICAgICAgICAvL3NEYXRlID0gdGhpcy5jcmVhdGVEYXRlQXNVVEMoc0RhdGUpLmdldFRpbWUoKTtcclxuICAgICAgICAgICAgc0RhdGUgPSBzRGF0ZS5nZXRUaW1lKCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoIXdpdGhUaW1lKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBzRGF0ZSAtIChzRGF0ZSAlIDg2NDAwMDAwKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBzRGF0ZTtcclxuICAgIH1cclxuXHJcbiAgICBpc0luVmlld3BvcnQoZWxlbSkge1xyXG5cclxuICAgICAgICBsZXQgZWxlbWVudFRvcCA9IGVsZW0ub2Zmc2V0KCkudG9wO1xyXG4gICAgICAgIGxldCBlbGVtZW50Qm90dG9tID0gZWxlbWVudFRvcCArIGVsZW0ub3V0ZXJIZWlnaHQoKTtcclxuXHJcbiAgICAgICAgbGV0IHZpZXdwb3J0VG9wID0galF1ZXJ5KHdpbmRvdykuc2Nyb2xsVG9wKCk7XHJcbiAgICAgICAgbGV0IHZpZXdwb3J0Qm90dG9tID0gdmlld3BvcnRUb3AgKyBqUXVlcnkod2luZG93KS5oZWlnaHQoKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGVsZW1lbnRCb3R0b20gPiB2aWV3cG9ydFRvcCAmJiBlbGVtZW50VG9wIDwgdmlld3BvcnRCb3R0b207XHJcbiAgICB9XHJcblxyXG4gICAgY29tcGFyZV9hc2MoZDEsIGQyKSB7XHJcbiAgICAgICAgaWYgKHR5cGVvZiBkMSA9PT0gJ29iamVjdCcpIHtcclxuICAgICAgICAgICAgZDEgPSB0aGlzLmdldFRpbWUoZDEpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodHlwZW9mIGQyID09PSAnb2JqZWN0Jykge1xyXG4gICAgICAgICAgICBkMiA9IHRoaXMuZ2V0VGltZS
8443hkMik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChkMSA+IGQyKSB7XHJcbiAgICAgICAgICAgIHJldHVybiAxO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoZDEgPT09IGQyKSB7XHJcbiAgICAgICAgICAgIHJldHVybiAwXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChkMSA8IGQyKSB7XHJcbiAgICAgICAgICAgIHJldHVybiAtMTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG5cclxuICAgIGdldFByaWNpbmcoZWwpIHtcclxuICAgICAgICBsZXQgcHJpY2luZyA9IGVsLmRhdGEoJ3ByaWNpbmcnKVxyXG4gICAgICAgIGlmICghcHJpY2luZykge1xyXG4gICAgICAgICAgICBwcmljaW5nID0gW107XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBwcmljaW5nLnNsaWNlKDEsIC0xKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXRNYXhTZWxlY3RlZFNlYXRzKGVsKSB7XHJcbiAgICAgICAgbGV0IG1heFNlbGVjdGVkID0gZWwuZGF0YSgnbWF4c2VsZWN0ZWRvYmplY3RzJylcclxuICAgICAgICBpZiAoIW1heFNlbGVjdGVkKSB7XHJcbiAgICAgICAgICAgIG1heFNlbGVjdGVkID0gW107XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBtYXhTZWxlY3RlZC5zbGljZSgxLCAtMSk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0TnVtYmVyT2ZQbGFjZXNUb1NlbGVjdChlbCkge1xyXG4gICAgICAgIGNvbnN0IHF0eSA9IHBhcnNlSW50KGVsLmRhdGEoJ251bWJlcm9mcGxhY2VzdG9zZWxlY3QnKS5zbGljZSgxLCAtMSkpO1xyXG4gICAgICAgIGlmIChpc05hTihxdHkpKSB7XHJcbiAgICAgICAgICAgIHJldHVybiAxO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gcXR5O1xyXG4gICAgfVxyXG5cclxuICAgIGdldFdvcmtzcGFjZShlbCkge1xyXG4gICAgICAgIHJldHVybiBlbC5kYXRhKCd3b3Jrc3BhY2VrZXknKS5zbGljZSgxLCAtMSk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0RXZlbnRLZXkoZWwpIHtcclxuICAgICAgICByZXR1cm4gZWwuZGF0YSgnZXZlbnRrZXknKS5zbGljZSgxLCAtMSk7XHJcbiAgICB9XHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IFJ3YkV2ZW50c0Zvcm1Nb2RlbFxyXG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9mcm9udGVuZC9mcmFtZXdvcmsvUndiRXZlbnRzRm9ybU1vZGVsLmpzIiwiY2xhc3MgUndiRXZlbnRzRm9ybVNwaW5lIHtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcigpIHtcclxuICAgICAgICB0aGlzLmJ0biA9ICcucndiLXRpY2tldHMtYnRuJztcclxuICAgICAgICB0aGlzLnNlYXRDaGFydCA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuY3VycmVudEZvcm0gPSBudWxsO1xyXG4gICAgICAgIHRoaXMuc2VsZWN0ZWRPYmplY3RDaGFydCA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5zZWxlY3RlZEV2ZW50ID0gbnVsbDtcclxuICAgICAgICB0aGlzLmV2ZW50TGlzdCA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5jYWxlbmRhciA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5zZWxlY3RlZEV2ZW50SWQgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLnNlbGVjdGVkZXZlbnRQcm9tb3Rpb25zSWRzID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5zZWxlY3RlZEV2ZW50RGF0YSA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuZmlyc3REYXRlV2l0aEV2ZW50ID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5pbml0UGFja1ByaWNlID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5vd25QcmljaW5nRGF0YSA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5ldmVudFNlYXRzID0gbnVsbDtcclxuICAgICAgICB0aGlzLmV2ZW50UHJvbW90aW9ucyA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5zZWF0QWxlcnRzQW5kVG9vbHRpcHNQZXJMYWJlbCA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5zZWxlY3RlZFByb21vQ29kZSA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuc2VsZWN0ZWROdW1iZXJPZlRpY2tldHMgPSAwO1xyXG4gICAgICAgIHRoaXMuc2VsZWN0ZWRMYWJlbHMgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLmZwc2VhcmNoID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5teXNlbGVjdGVkT2JqZWN0cyA9IFtdO1xyXG4gICAgICAgIHRoaXMuc2NhbHR5cGUgPSAnc2NhbHBvcCc7XHJcbiAgICAgICAgdGhpcy5zY2FsY2F0ID0gJzAnO1xyXG4gICAgICAgIHRoaXMuY3N0YXJ0X2RhdGUgPSAnJztcclxuICAgICAgICB0aGlzLmNlbmRfZGF0ZSA9ICcnO1xyXG4gICAgICAgIHRoaXMuZHNlbGVjdGVkID0gJyc7XHJcbiAgICB9XHJcblxyXG4gICAgSkRvY3VtZW50KCkge1xyXG4gICAgICAgIHJldHVybiAkKGRvY3VtZW50KTtcclxuICAgIH1cclxuXHJcbiAgICBKQnRuKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLkpGb3JtKCkuZmluZCh0aGlzLmJ0bik7XHJcbiAgICB9XHJcblxyXG4gICAgSlNlYXRRdHkoKSB7XHJcbiAgICAgICAgcmV0dXJuICc8ZGl2IGlkPVwiZGl2U2VhdHNpb1wiPjwvZGl2PjxkaXYgaWQ9XCJxdHlUaWNrZXRzXCI+PC9kaXY+PGRpdiBpZD1cImNhcnRCdXR0b25cIj48YSBocmVmPVwiI1wiIGNsYXNzPVwiYnV0dG9uIGJ0biBidXlub3dcIj5CdXkgTm93PC9hPjwvZGl2Pic7XHJcbiAgICB9XHJcblxyXG4gICAgSlNlYXREaXYoKSB7XHJcbiAgICAgICAgcmV0dXJuIGpRdWVyeSgnI2RpdlNlYXRzaW8nKTtcclxuICAgIH1cclxuXHJcbiAgICBKUHJvZHVjdElkKCkge1xyXG4gICAgICAgIHJldHVybiBqUXVlcnkoJ2J1dHRvbi5zaW5nbGVfYWRkX3RvX2NhcnRfYnV0dG9uJykudmFsKCk7XHJcbiAgICB9XHJcblxyXG4gICAgSkJ1eUJ1dHRvbigpIHtcclxuICAgICAgICByZXR1cm4galF1ZXJ5KCcudGlja2V0c19jYXJ0IC5zYnV5bm93Jyk7XHJcbiAgICB9XHJcblxyXG4gICAgSlJvb21SZXNlcnZlQnV0dG9uKCkge1xyXG4gICAgICAgIHJldHVybiBqUXVlcnkoJy5yZXNlcnZlLWJ1dHRvbicpO1xyXG4gICAgfVxyXG5cclxuICAgIEpJc0F0dHJhY3Rpb24oKSB7XHJcbiAgICAgICAgaWYgKGpRdWVyeSgnI2hhc19hdHRyYWN0aW9uJykubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIE
8443pGcmVlU2VhdGluZygpIHtcclxuICAgICAgICBpZiAoalF1ZXJ5KCcjcmlzX2ZyZWVfc2VhdGluZycpLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBKQWRkVG9DYXJ0QnV0dG9uKCkge1xyXG4gICAgICAgIHJldHVybiBqUXVlcnkoJy50aWNrZXRzX2NhcnQgLnNhZGRjYXJ0Jyk7XHJcbiAgICB9XHJcblxyXG4gICAgSlByaWNlQmVzdFNlYXRzKCkge1xyXG4gICAgICAgIHJldHVybiBqUXVlcnkoJy5wcmljZV9iZXN0X3NlYXRzJyk7XHJcbiAgICB9XHJcblxyXG4gICAgSlpvbmVJbWFnZSgpIHtcclxuICAgICAgICByZXR1cm4galF1ZXJ5KCcuYXR0cmFjdGlvbl96b25lX2ltYWdlLmlzX2ZpcnN0Jyk7XHJcbiAgICB9XHJcblxyXG4gICAgSklzUmVkZWFtKCkge1xyXG4gICAgICAgIHJldHVybiBqUXVlcnkoJy5yd2JfcmVkZWFtJykubGVuZ3RoID4gMDtcclxuICAgIH1cclxuXHJcbiAgICBKUXR5VGlja2V0cygpIHtcclxuICAgICAgICByZXR1cm4galF1ZXJ5KCcjcXR5VGlja2V0cycpO1xyXG4gICAgfVxyXG5cclxuICAgIEpRdHkoKSB7XHJcbiAgICAgICAgcmV0dXJuIGpRdWVyeSgnI3F0eVRpY2tldHMgLnF0eV9zZWxlY3QnKTtcclxuICAgIH1cclxuXHJcbiAgICBKQnV5VGlja2V0cygpIHtcclxuICAgICAgICByZXR1cm4galF1ZXJ5KCcuYnV5X3RpY2tldHNfc2VhdHMnKS5maW5kKCdhJyk7XHJcbiAgICB9XHJcblxyXG4gICAgSkZsYXRDYWxlbmRhcigpIHtcclxuICAgICAgICByZXR1cm4galF1ZXJ5KCcuZmxhdF9jYWxlbmRhcicpO1xyXG4gICAgfVxyXG5cclxuICAgIEpGbGF0Q2FsZW5kYXJJbnB1dCgpIHtcclxuICAgICAgICByZXR1cm4galF1ZXJ5KCcuZmxhdF9jYWxlbmRhcicpLmZpbmQoJ2lucHV0Jyk7XHJcbiAgICB9XHJcblxyXG4gICAgSkV2ZW50c1BlckRhdGUoKSB7XHJcbiAgICAgICAgcmV0dXJuIGpRdWVyeSgnLmV2ZW50c19wZXJfZGF0ZScpO1xyXG4gICAgfVxyXG5cclxuICAgIEpFdmVudHNQZXJEYXRlQmVmb3JlVGV4dCgpIHtcclxuICAgICAgICByZXR1cm4galF1ZXJ5KCcuZXZlbnRfc2VsZWN0aW9uX3RpY2tldF90ZXh0Jyk7XHJcbiAgICB9XHJcblxyXG4gICAgSkV2ZW50U2VsZWN0aW9uKCkge1xyXG4gICAgICAgIHJldHVybiBqUXVlcnkoJy5ldmVudF9zZWxlY3Rpb25fdGlja2V0Jyk7XHJcbiAgICB9XHJcblxyXG4gICAgSlByaWNlTWFwRXhwbGFuYXRpb24oKSB7XHJcbiAgICAgICAgcmV0dXJuIGpRdWVyeSgnI3ByaWNlX21hcF9leHBsYW5hdGlvbicpO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICBKVGlja2V0c0NhcnQoKSB7XHJcbiAgICAgICAgcmV0dXJuIGpRdWVyeSgnLmV2ZW50X3NlbGVjdGlvbl90aWNrZXQgLnRpY2tldF9iZWZvcmVfdGFibGVfc2VsZWN0ZWQnKTtcclxuICAgIH1cclxuXHJcbiAgICBKVGlja2V0c1NlbGVjdGVkQ2FydCgpIHtcclxuICAgICAgICByZXR1cm4galF1ZXJ5KCcudGlja2V0c19jYXJ0IC50aWNrZXRfc2VsZWN0ZWRfY2FydCcpO1xyXG4gICAgfVxyXG5cclxuICAgIEpUaWNrZXRzQnV0dG9uc0NhcnQoKSB7XHJcbiAgICAgICAgcmV0dXJuIGpRdWVyeSgnLnRpY2tldHNfY2FydCAudGlja2V0X2J1dHRvbnNfY2FydCcpO1xyXG4gICAgfVxyXG5cclxuICAgIEpUaWNrZXRzQ2hvb3NlcigpIHtcclxuICAgICAgICByZXR1cm4galF1ZXJ5KCcjdGlja2V0X2Nob29zZXInKTtcclxuICAgIH1cclxuXHJcbiAgICBKVGlja2V0c1NlbGVjdGVkVGFibGUoKSB7XHJcbiAgICAgICAgcmV0dXJuIGpRdWVyeSgnI3RpY2tldHNfc2VsZWN0ZWQnKTtcclxuICAgIH1cclxuXHJcbiAgICBKVGltZUVsZW0oZXZlbnRfaWQsIHRpbWVfdmFsLCBkYXRlU3RyLCBpKSB7XHJcbiAgICAgICAgcmV0dXJuIGpRdWVyeSgnPGRpdiBjbGFzcz1cInRpbWVfZWxlbVwiIGV2X3Bvcz1cIicgKyBpICsgJ1wiIGV2ZW50X2RhdGU9XCInICsgZGF0ZVN0ciArICdcIiBldmVudF9ob3VyPVwiJyArIHRpbWVfdmFsICsgJ1wiIGV2ZW50X2lkPVwiJyArIGV2ZW50X2lkICsgJ1wiPicgKyAnPGkgY2xhc3M9XCJzbHYgc2x2LXJhZGlvLXVuY2hlY2tlZFwiPjwvaT4nICsgdGltZV92YWwgKyAnPC9kaXY+Jyk7XHJcbiAgICB9XHJcblxyXG4gICAgSlNlYXRzTWFwKCkge1xyXG4gICAgICAgIHJldHVybiBqUXVlcnkoJyNzZWF0c19tYXAnKTtcclxuICAgIH1cclxuXHJcbiAgICBKU2VhcmNoQnV0dG9uKCkge1xyXG4gICAgICAgIHJldHVybiBqUXVlcnkoJy5zZWFyY2gtY29udHJvbHMgLnNlYXJjaC1idXR0b24nKS5maXJzdCgpO1xyXG4gICAgfVxyXG5cclxuICAgIEpTZWFyY2hCdXR0b25DYWxlbmRhcigpIHtcclxuICAgICAgICByZXR1cm4galF1ZXJ5KCcuc2VhcmNoLWNvbnRyb2xzIC5zZWFyY2gtYnV0dG9uLWNhbGVuZGFyJykuZmlyc3QoKTtcclxuICAgIH1cclxuXHJcbiAgICBKUGFja0J1dHRvbigpIHtcclxuICAgICAgICByZXR1cm4galF1ZXJ5KCcuc3RhcnRwYWNrLWJ1dHRvbicpO1xyXG4gICAgfVxyXG5cclxuICAgIEpEdWFsRGF0ZXMoKSB7XHJcbiAgICAgICAgaWYgKGpRdWVyeSgnI2RkdWFsZGF0ZXMnKS5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBqUXVlcnkoJyNkZHVhbGRhdGVzJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBKVGhlbWUoKSB7X
8443HJcbiAgICAgICAgaWYgKGpRdWVyeSgnI3Nwb3R0aGVtZScpLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgcmV0dXJuIGpRdWVyeSgnI3Nwb3R0aGVtZScpLmF0dHIoJ3RoZW1lJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiAnZGFyayc7XHJcbiAgICB9XHJcblxyXG4gICAgSkdvVG9Nb250aCgpIHtcclxuICAgICAgICBpZiAoalF1ZXJ5KCcjZ3Rtb250aCcpLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgICd5ZWFyJzogcGFyc2VJbnQoalF1ZXJ5KCcjZ3Rtb250aCcpLmF0dHIoJ2R5ZWFyJykpLFxyXG4gICAgICAgICAgICAgICAgJ21vbnRoJzogcGFyc2VJbnQoalF1ZXJ5KCcjZ3Rtb250aCcpLmF0dHIoJ2Rtb250aCcpKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBKQmxhbmtTZWF0c01hcCgpIHtcclxuICAgICAgICByZXR1cm4galF1ZXJ5KCcjYmxhbmtfc2VhdHNfbWFwJyk7XHJcbiAgICB9XHJcblxyXG4gICAgSlByaWNlTWFwKCkge1xyXG4gICAgICAgIHJldHVybiBqUXVlcnkoJyNwcmljZV9tYXAnKTtcclxuICAgIH1cclxuXHJcbiAgICBKUHJpY2VNYXBTZWF0cygpIHtcclxuICAgICAgICByZXR1cm4galF1ZXJ5KCcjcHJpY2VfbWFwX3NlYXRzJyk7XHJcbiAgICB9XHJcblxyXG4gICAgSkZvcm0oKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuY3VycmVudEZvcm0gPT09IG51bGwpIHtcclxuICAgICAgICAgICAgaWYgKGpRdWVyeSh0aGlzLmZvcm0pLnBhcmVudCgpLmlzKCdmb3JtJykpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudEZvcm0gPSBqUXVlcnkodGhpcy5mb3JtKS5wYXJlbnQoKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBqUXVlcnkodGhpcy5mb3JtKS5wYXJlbnQoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBsZXQgbWFpbkZvcm0gPSBqUXVlcnkodGhpcy5mb3JtKS5uZXh0QWxsKCdmb3JtJykuZmlyc3QoKTtcclxuICAgICAgICAgICAgaWYgKG1haW5Gb3JtLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgIGpRdWVyeSh0aGlzLmZvcm0pLnByZXBlbmRUbyhtYWluRm9ybSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBtYWluRm9ybSA9IGpRdWVyeSgnZm9ybS5jYXJ0JykuZmlyc3QoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRGb3JtID0gbWFpbkZvcm07XHJcbiAgICAgICAgICAgIHJldHVybiBtYWluRm9ybTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jdXJyZW50Rm9ybTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBSd2JFdmVudHNGb3JtU3BpbmVcclxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vZnJvbnRlbmQvZnJhbWV3b3JrL1J3YkV2ZW50c0Zvcm1TcGluZS5qcyIsIi8qIVxuKiBzd2VldGFsZXJ0MiB2MTAuMTQuMFxuKiBSZWxlYXNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuXG4qL1xuKGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnID8gbW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KCkgOlxuICB0eX
8443Blb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoZmFjdG9yeSkgOlxuICAoZ2xvYmFsID0gZ2xvYmFsIHx8IHNlbGYsIGdsb2JhbC5Td2VldGFsZXJ0MiA9IGZhY3RvcnkoKSk7XG59KHRoaXMsIGZ1bmN0aW9uICgpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gIGZ1bmN0aW9uIF90eXBlb2Yob2JqKSB7XG4gICAgXCJAYmFiZWwvaGVscGVycyAtIHR5cGVvZlwiO1xuXG4gICAgaWYgKHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID09PSBcInN5bWJvbFwiKSB7XG4gICAgICBfdHlwZW9mID0gZnVuY3Rpb24gKG9iaikge1xuICAgICAgICByZXR1cm4gdHlwZW9mIG9iajtcbiAgICAgIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIF90eXBlb2YgPSBmdW5jdGlvbiAob2JqKSB7XG4gICAgICAgIHJldHVybiBvYmogJiYgdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIG9iai5jb25zdHJ1Y3RvciA9PT0gU3ltYm9sICYmIG9iaiAhPT0gU3ltYm9sLnByb3RvdHlwZSA/IFwic3ltYm9sXCIgOiB0eXBlb2Ygb2JqO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICByZXR1cm4gX3R5cGVvZihvYmopO1xuICB9XG5cbiAgZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3Rvcikge1xuICAgIGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2Y
8443XIgZGVzY3JpcHRvciA9IHByb3BzW2ldO1xuICAgICAgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlO1xuICAgICAgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlO1xuICAgICAgaWYgKFwidmFsdWVcIiBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBfY3JlYXRlQ2xhc3MoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7XG4gICAgaWYgKHByb3RvUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7XG4gICAgaWYgKHN0YXRpY1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpO1xuICAgIHJldHVybiBDb25zdHJ1Y3RvcjtcbiAgfVxuXG4gIGZ1bmN0aW9uIF9leHRlbmRzKCkge1xuICAgIF9leHRlbmRzID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiAodGFyZ2V0KSB7XG4gICAgICBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgc291cmNlID0gYXJndW1lbnRzW2ldO1xuXG4gICAgICAgIGZvciAodmFyIGtleSBpbiBzb3VyY2UpIHtcbiAgICAgICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNvdXJjZSwga2V5KSkge1xuICAgICAgICAgICAgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRhcmdldDtcbiAgICB9O1xuXG4gICAgcmV0dXJuIF9leHRlbmRzLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gIH1cblxuICBmdW5jdGlvbiBfaW5oZXJpdHMoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIHtcbiAgICBpZiAodHlwZW9mIHN1cGVyQ2xhc3MgIT09IFwiZnVuY3Rpb25cIiAmJiBzdXBlckNsYXNzICE9PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb25cIik7XG4gICAgfVxuXG4gICAgc3ViQ2xhc3MucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzdXBlckNsYXNzICYmIHN1cGVyQ2xhc3MucHJvdG90eXBlLCB7XG4gICAgICBjb25zdHJ1Y3Rvcjoge1xuICAgICAgICB2YWx1ZTogc3ViQ2xhc3MsXG4gICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICAgIH1cbiAgICB9KTtcbiAgICBpZiAoc3VwZXJDbGFzcykgX3NldFByb3RvdHlwZU9mKHN1YkNsYXNzLCBzdXBlckNsYXNzKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIF9nZXRQcm90b3R5cGVPZihvKSB7XG4gICAgX2dldFByb3RvdHlwZU9mID0gT2JqZWN0LnNldFByb3RvdHlwZU9mID8gT2JqZWN0LmdldFByb3RvdHlwZU9mIDogZnVuY3Rpb24gX2dldFByb3RvdHlwZU9mKG8pIHtcbiAgICAgIHJldHVybiBvLl9fcHJvdG9fXyB8fCBPYmplY3QuZ2V0UHJvdG90eXBlT2Yobyk7XG4gICAgfTtcbiAgICByZXR1cm4gX2dldFByb3RvdHlwZU9mKG8pO1xuICB9XG5cbiAgZnVuY3Rpb24gX3NldFByb3RvdHlwZU9mKG8sIHApIHtcbiAgICBfc2V0UHJvdG90eXBlT2YgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgfHwgZnVuY3Rpb24gX3NldFByb3RvdHlwZU9mKG8sIHApIHtcbiAgICAgIG8uX19wcm90b19fID0gcDtcbiAgICAgIHJldHVybiBvO1xuICAgIH07XG5cbiAgICByZXR1cm4gX3NldFByb3RvdHlwZU9mKG8sIHApO1xuICB9XG5cbiAgZnVuY3Rpb24gX2lzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCgpIHtcbiAgICBpZiAodHlwZW9mIFJlZmxlY3QgPT09IFwidW5kZWZpbmVkXCIgfHwgIVJlZmxlY3QuY29uc3RydWN0KSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKFJlZmxlY3QuY29uc3RydWN0LnNoYW0pIHJldHVybiBmYWxzZTtcbiAgICBpZiAodHlwZW9mIFByb3h5ID09PSBcImZ1bmN0aW9uXCIpIHJldHVybiB0cnVlO1xuXG4gICAgdHJ5IHtcbiAgICAgIERhdGUucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoUmVmbGVjdC5jb25zdHJ1Y3QoRGF0ZSwgW10sIGZ1bmN0aW9uICgpIHt9KSk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gX2NvbnN0cnVjdChQYXJlbnQsIGFyZ3MsIENsYXNzKSB7XG4gICAgaWYgKF9pc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QoKSkge1xuICAgICAgX2NvbnN0cnVjdCA9IFJlZmxlY3QuY29uc3RydWN0O1xuICAgIH0gZWxzZSB7XG4gICAgICBfY29uc3RydWN0ID0gZnVuY3Rpb24gX2NvbnN0cnVjdChQYXJlbnQsIGFyZ3MsIENsYXNzKSB7XG4gICAgICAgIHZhciBhID0gW251bGxdO1xuICAgICAgICBhLnB1c2guYXBwbHkoYSwgYXJncyk7XG4gICAgICAgIHZhciBDb25zdHJ1Y3RvciA9IEZ1bmN0aW9uLmJpbmQuYXBwbHkoUGFyZW50LCBhKTtcbiAgICAgICAgdmFyIGluc3RhbmNlID0gbmV3IENvbnN0cnVjdG9yKCk7XG4gICAgICAgIGlmIChDbGFzcykgX3NldFByb3RvdHlwZU9mKGluc3RhbmNlLCBDbGFzcy5wcm90b3R5cGUpO1xuICAgICAgICByZXR1cm4gaW5zdGFuY2U7XG4gICAgICB9O1xuICAgIH1cblxuICAgIHJldHVybiBfY29uc3RydWN0LmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7XG4gIH1cblxuICBmdW5jdGlvbiBfYXNzZXJ0VGhpc0luaXRpYWxpemVkKHNlbGYpIHtcbiAgICBpZiAoc2VsZiA9PT0gdm9pZCAwKSB7XG4gICAgICB0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoXCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWRcIik7XG4gICAgfVxuXG4gICAgcmV0dXJuIHNlbGY7XG4gIH1cblxuICBmdW5jdGlvbiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybihzZWxmLCBjYWxsKSB7XG4gICAgaWYgKGNhbGwgJiYgKHR5cGVvZiBjYWxsID09PSBcIm9iamVjdFwiIHx8IHR5cGVvZiBjYWxsID09PSBcImZ1bmN0aW9uXCIpKSB7XG4gICAgICByZXR1cm4gY2FsbDtcbiAgICB9XG5cbiAgICByZXR1cm4gX2Fzc2VydFRoaXNJbml0aWFsaXplZChzZWxmKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIF9jcmVhdGVTdXBlcihEZXJpdmVkKSB7XG4gICAgdmFyIGhhc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QgPSBfaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0KCk7XG5cbiAgICByZXR1cm4gZnVuY3Rpb24gX2NyZWF0ZVN1cGVySW50ZXJuYWwoKSB7XG4gICAgICB2Y
8443XIgU3VwZXIgPSBfZ2V0UHJvdG90eXBlT2YoRGVyaXZlZCksXG4gICAgICAgICAgcmVzdWx0O1xuXG4gICAgICBpZiAoaGFzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCkge1xuICAgICAgICB2YXIgTmV3VGFyZ2V0ID0gX2dldFByb3RvdHlwZU9mKHRoaXMpLmNvbnN0cnVjdG9yO1xuXG4gICAgICAgIHJlc3VsdCA9IFJlZmxlY3QuY29uc3RydWN0KFN1cGVyLCBhcmd1bWVudHMsIE5ld1RhcmdldCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXN1bHQgPSBTdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgcmVzdWx0KTtcbiAgICB9O1xuICB9XG5cbiAgZnVuY3Rpb24gX3N1cGVyUHJvcEJhc2Uob2JqZWN0LCBwcm9wZXJ0eSkge1xuICAgIHdoaWxlICghT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwgcHJvcGVydHkpKSB7XG4gICAgICBvYmplY3QgPSBfZ2V0UHJvdG90eXBlT2Yob2JqZWN0KTtcbiAgICAgIGlmIChvYmplY3QgPT09IG51bGwpIGJyZWFrO1xuICAgIH1cblxuICAgIHJldHVybiBvYmplY3Q7XG4gIH1cblxuICBmdW5jdGlvbiBfZ2V0KHRhcmdldCwgcHJvcGVydHksIHJlY2VpdmVyKSB7XG4gICAgaWYgKHR5cGVvZiBSZWZsZWN0ICE9PSBcInVuZGVmaW5lZFwiICYmIFJlZmxlY3QuZ2V0KSB7XG4gICAgICBfZ2V0ID0gUmVmbGVjdC5nZXQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIF9nZXQgPSBmdW5jdGlvbiBfZ2V0KHRhcmdldCwgcHJvcGVydHksIHJlY2VpdmVyKSB7XG4gICAgICAgIHZhciBiYXNlID0gX3N1cGVyUHJvcEJhc2UodGFyZ2V0LCBwcm9wZXJ0eSk7XG5cbiAgICAgICAgaWYgKCFiYXNlKSByZXR1cm47XG4gICAgICAgIHZhciBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihiYXNlLCBwcm9wZXJ0eSk7XG5cbiAgICAgICAgaWYgKGRlc2MuZ2V0KSB7XG4gICAgICAgICAgcmV0dXJuIGRlc2MuZ2V0LmNhbGwocmVjZWl2ZXIpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGRlc2MudmFsdWU7XG4gICAgICB9O1xuICAgIH1cblxuICAgIHJldHVybiBfZ2V0KHRhcmdldCwgcHJvcGVydHksIHJlY2VpdmVyIHx8IHRhcmdldCk7XG4gIH1cblxuICB2YXIgY29uc29sZVByZWZpeCA9ICdTd2VldEFsZXJ0MjonO1xuICAvKipcbiAgICogRmlsdGVyIHRoZSB1bmlxdWUgdmFsdWVzIGludG8gYSBuZXcgYXJyYXlcbiAgICogQHBhcmFtIGFyclxuICAgKi9cblxuICB2YXIgdW5pcXVlQXJyYXkgPSBmdW5jdGlvbiB1bmlxdWVBcnJheShhcnIpIHtcbiAgICB2YXIgcmVzdWx0ID0gW107XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKHJlc3VsdC5pbmRleE9mKGFycltpXSkgPT09IC0xKSB7XG4gICAgICAgIHJlc3VsdC5wdXNoKGFycltpXSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfTtcbiAgLyoqXG4gICAqIENhcGl0YWxpemUgdGhlIGZpcnN0IGxldHRlciBvZiBhIHN0cmluZ1xuICAgKiBAcGFyYW0gc3RyXG4gICAqL1xuXG4gIHZhciBjYXBpdGFsaXplRmlyc3RMZXR0ZXIgPSBmdW5jdGlvbiBjYXBpdGFsaXplRmlyc3RMZXR0ZXIoc3RyKSB7XG4gICAgcmV0dXJuIHN0ci5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIHN0ci5zbGljZSgxKTtcbiAgfTtcbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGFycmF5IG9mIG9iamVjdCB2YWx1ZXMgKE9iamVjdC52YWx1ZXMgaXNuJ3Qgc3VwcG9ydGVkIGluIElFMTEpXG4gICAqIEBwYXJhbSBvYmpcbiAgICovXG5cbiAgdmFyIG9iamVjdFZhbHVlcyA9IGZ1bmN0aW9uIG9iamVjdFZhbHVlcyhvYmopIHtcbiAgICByZXR1cm4gT2JqZWN0LmtleXMob2JqKS5tYXAoZnVuY3Rpb24gKGtleSkge1xuICAgICAgcmV0dXJuIG9ialtrZXldO1xuICAgIH0pO1xuICB9O1xuICAvKipcbiAgICogQ29udmVydCBOb2RlTGlzdCB0byBBcnJheVxuICAgKiBAcGFyYW0gbm9kZUxpc3RcbiAgICovXG5cbiAgdmFyIHRvQXJyYXkgPSBmdW5jdGlvbiB0b0FycmF5KG5vZGVMaXN0KSB7XG4gICAgcmV0dXJuIEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKG5vZGVMaXN0KTtcbiAgfTtcbiAgLyoqXG4gICAqIFN0YW5kYXJkaXNlIGNvbnNvbGUgd2FybmluZ3NcbiAgICogQHBhcmFtIG1lc3NhZ2VcbiAgICovXG5cbiAgdmFyIHdhcm4gPSBmdW5jdGlvbiB3YXJuKG1lc3NhZ2UpIHtcbiAgICBjb25zb2xlLndhcm4oXCJcIi5jb25jYXQoY29uc29sZVByZWZpeCwgXCIgXCIpLmNvbmNhdChfdHlwZW9mKG1lc3NhZ2UpID09PSAnb2JqZWN0JyA/IG1lc3NhZ2Uuam9pbignICcpIDogbWVzc2FnZSkpO1xuICB9O1xuICAvKipcbiAgICogU3RhbmRhcmRpc2UgY29uc29sZSBlcnJvcnNcbiAgICogQHBhcmFtIG1lc3NhZ2VcbiAgICovXG5cbiAgdmFyIGVycm9yID0gZnVuY3Rpb24gZXJyb3IobWVzc2FnZSkge1xuICAgIGNvbnNvbGUuZXJyb3IoXCJcIi5jb25jYXQoY29uc29sZVByZWZpeCwgXCIgXCIpLmNvbmNhdChtZXNzYWdlKSk7XG4gIH07XG4gIC8qKlxuICAgKiBQcml2YXRlIGdsb2JhbCBzdGF0ZSBmb3IgYHdhcm5PbmNlYFxuICAgKiBAdHlwZSB7QXJyYXl9XG4gICAqIEBwcml2YXRlXG4gICAqL1xuXG4gIHZhciBwcmV2aW91c1dhcm5PbmNlTWVzc2FnZXMgPSBbXTtcbiAgLyoqXG4gICAqIFNob3cgYSBjb25zb2xlIHdhcm5pbmcsIGJ1dCBvbmx5IGlmIGl0IGhhc24ndCBhbHJlYWR5IGJlZW4gc2hvd25cbiAgICogQHBhcmFtIG1lc3NhZ2VcbiAgICovXG5cbiAgdmFyIHdhcm5PbmNlID0gZnVuY3Rpb24gd2Fybk9uY2UobWVzc2FnZSkge1xuICAgIGlmICghKHByZXZpb3VzV2Fybk9uY2VNZXNzYWdlcy5pbmRleE9mKG1lc3NhZ2UpICE9PSAtMSkpIHtcbiAgICAgIHByZXZpb3VzV2Fybk9uY2VNZXNzYWdlcy5wdXNoKG1lc3NhZ2UpO1xuICAgICAgd2FybihtZXNzYWdlKTtcbiAgICB9XG4gIH07XG4gIC8qKlxuICAgKiBTaG93IGEgb25lLXRpbWUgY29uc29sZSB3YXJuaW5nIGFib3V0IGRlcHJlY2F0ZWQgcGFyYW1zL21ldGhvZHNcbiAgICovXG5cbiAgdmFyIHdhcm5BYm91dERlcHJlY2F0aW9uID0gZnVuY3Rpb24gd2FybkFib3V0RGVwcmVjYXRpb24oZGVwcmVjYXRlZFBhcmFtLCB1c2VJbnN0ZWFkKSB7XG4gICAgd2Fyb
8443k9uY2UoXCJcXFwiXCIuY29uY2F0KGRlcHJlY2F0ZWRQYXJhbSwgXCJcXFwiIGlzIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiB0aGUgbmV4dCBtYWpvciByZWxlYXNlLiBQbGVhc2UgdXNlIFxcXCJcIikuY29uY2F0KHVzZUluc3RlYWQsIFwiXFxcIiBpbnN0ZWFkLlwiKSk7XG4gIH07XG4gIC8qKlxuICAgKiBJZiBgYXJnYCBpcyBhIGZ1bmN0aW9uLCBjYWxsIGl0ICh3aXRoIG5vIGFyZ3VtZW50cyBvciBjb250ZXh0KSBhbmQgcmV0dXJuIHRoZSByZXN1bHQuXG4gICAqIE90aGVyd2lzZSwganVzdCBwYXNzIHRoZSB2YWx1ZSB0aHJvdWdoXG4gICAqIEBwYXJhbSBhcmdcbiAgICovXG5cbiAgdmFyIGNhbGxJZkZ1bmN0aW9uID0gZnVuY3Rpb24gY2FsbElmRnVuY3Rpb24oYXJnKSB7XG4gICAgcmV0dXJuIHR5cGVvZiBhcmcgPT09ICdmdW5jdGlvbicgPyBhcmcoKSA6IGFyZztcbiAgfTtcbiAgdmFyIGhhc1RvUHJvbWlzZUZuID0gZnVuY3Rpb24gaGFzVG9Qcm9taXNlRm4oYXJnKSB7XG4gICAgcmV0dXJuIGFyZyAmJiB0eXBlb2YgYXJnLnRvUHJvbWlzZSA9PT0gJ2Z1bmN0aW9uJztcbiAgfTtcbiAgdmFyIGFzUHJvbWlzZSA9IGZ1bmN0aW9uIGFzUHJvbWlzZShhcmcpIHtcbiAgICByZXR1cm4gaGFzVG9Qcm9taXNlRm4oYXJnKSA/IGFyZy50b1Byb21pc2UoKSA6IFByb21pc2UucmVzb2x2ZShhcmcpO1xuICB9O1xuICB2YXIgaXNQcm9taXNlID0gZnVuY3Rpb24gaXNQcm9taXNlKGFyZykge1xuICAgIHJldHVybiBhcmcgJiYgUHJvbWlzZS5yZXNvbHZlKGFyZykgPT09IGFyZztcbiAgfTtcblxuICB2YXIgRGlzbWlzc1JlYXNvbiA9IE9iamVjdC5mcmVlemUoe1xuICAgIGNhbmNlbDogJ2NhbmNlbCcsXG4gICAgYmFja2Ryb3A6ICdiYWNrZHJvcCcsXG4gICAgY2xvc2U6ICdjbG9zZScsXG4gICAgZXNjOiAnZXNjJyxcbiAgICB0aW1lcjogJ3RpbWVyJ1xuICB9KTtcblxuICB2YXIgaXNKcXVlcnlFbGVtZW50ID0gZnVuY3Rpb24gaXNKcXVlcnlFbGVtZW50KGVsZW0pIHtcbiAgICByZXR1cm4gX3R5cGVvZihlbGVtKSA9PT0gJ29iamVjdCcgJiYgZWxlbS5qcXVlcnk7XG4gIH07XG5cbiAgdmFyIGlzRWxlbWVudCA9IGZ1bmN0aW9uIGlzRWxlbWVudChlbGVtKSB7XG4gICAgcmV0dXJuIGVsZW0gaW5zdGFuY2VvZiBFbGVtZW50IHx8IGlzSnF1ZXJ5RWxlbWVudChlbGVtKTtcbiAgfTtcblxuICB2YXIgYXJnc1RvUGFyYW1zID0gZnVuY3Rpb24gYXJnc1RvUGFyYW1zKGFyZ3MpIHtcbiAgICB2YXIgcGFyYW1zID0ge307XG5cbiAgICBpZiAoX3R5cGVvZihhcmdzWzBdKSA9PT0gJ29iamVjdCcgJiYgIWlzRWxlbWVudChhcmdzWzBdKSkge1xuICAgICAgX2V4dGVuZHMocGFyYW1zLCBhcmdzWzBdKTtcbiAgICB9IGVsc2Uge1xuICAgICAgWyd0aXRsZScsICdodG1sJywgJ2ljb24nXS5mb3JFYWNoKGZ1bmN0aW9uIChuYW1lLCBpbmRleCkge1xuICAgICAgICB2Y
8443XIgYXJnID0gYXJnc1tpbmRleF07XG5cbiAgICAgICAgaWYgKHR5cGVvZiBhcmcgPT09ICdzdHJpbmcnIHx8IGlzRWxlbWVudChhcmcpKSB7XG4gICAgICAgICAgcGFyYW1zW25hbWVdID0gYXJnO1xuICAgICAgICB9IGVsc2UgaWYgKGFyZyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgZXJyb3IoXCJVbmV4cGVjdGVkIHR5cGUgb2YgXCIuY29uY2F0KG5hbWUsIFwiISBFeHBlY3RlZCBcXFwic3RyaW5nXFxcIiBvciBcXFwiRWxlbWVudFxcXCIsIGdvdCBcIikuY29uY2F0KF90eXBlb2YoYXJnKSkpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gcGFyYW1zO1xuICB9O1xuXG4gIHZhciBzd2FsUHJlZml4ID0gJ3N3YWwyLSc7XG4gIHZhciBwcmVmaXggPSBmdW5jdGlvbiBwcmVmaXgoaXRlbXMpIHtcbiAgICB2YXIgcmVzdWx0ID0ge307XG5cbiAgICBmb3IgKHZhciBpIGluIGl0ZW1zKSB7XG4gICAgICByZXN1bHRbaXRlbXNbaV1dID0gc3dhbFByZWZpeCArIGl0ZW1zW2ldO1xuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH07XG4gIHZhciBzd2FsQ2xhc3NlcyA9IHByZWZpeChbJ2NvbnRhaW5lcicsICdzaG93bicsICdoZWlnaHQtYXV0bycsICdpb3NmaXgnLCAncG9wdXAnLCAnbW9kYWwnLCAnbm8tYmFja2Ryb3AnLCAnbm8tdHJhbnNpdGlvbicsICd0b2FzdCcsICd0b2FzdC1zaG93bicsICd0b2FzdC1jb2x1bW4nLCAnc2hvdycsICdoaWRlJywgJ2Nsb3NlJywgJ3RpdGxlJywgJ2hlYWRlcicsICdjb250ZW50JywgJ2h0bWwtY29udGFpbmVyJywgJ2FjdGlvbnMnLCAnY29uZmlybScsICdkZW55JywgJ2NhbmNlbCcsICdmb290ZXInLCAnaWNvbicsICdpY29uLWNvbnRlbnQnLCAnaW1hZ2UnLCAnaW5wdXQnLCAnZmlsZScsICdyYW5nZScsICdzZWxlY3QnLCAncmFkaW8nLCAnY2hlY2tib3gnLCAnbGFiZWwnLCAndGV4dGFyZWEnLCAnaW5wdXRlcnJvcicsICdpbnB1dC1sYWJlbCcsICd2YWxpZGF0aW9uLW1lc3NhZ2UnLCAncHJvZ3Jlc3Mtc3RlcHMnLCAnYWN0aXZlLXByb2dyZXNzLXN0ZXAnLCAncHJvZ3Jlc3Mtc3RlcCcsICdwcm9ncmVzcy1zdGVwLWxpbmUnLCAnbG9hZGVyJywgJ2xvYWRpbmcnLCAnc3R5bGVkJywgJ3RvcCcsICd0b3Atc3RhcnQnLCAndG9wLWVuZCcsICd0b3AtbGVmdCcsICd0b3AtcmlnaHQnLCAnY2VudGVyJywgJ2NlbnRlci1zdGFydCcsICdjZW50ZXItZW5kJywgJ2NlbnRlci1sZWZ0JywgJ2NlbnRlci1yaWdodCcsICdib3R0b20nLCAnYm90dG9tLXN0YXJ0JywgJ2JvdHRvbS1lbmQnLCAnYm90dG9tLWxlZnQnLCAnYm90dG9tLXJpZ2h0JywgJ2dyb3ctcm93JywgJ2dyb3ctY29sdW1uJywgJ2dyb3ctZnVsbHNjcmVlbicsICdydGwnLCAndGltZXItcHJvZ3Jlc3MtYmFyJywgJ3RpbWVyLXByb2dyZXNzLWJhci1jb250YWluZXInLCAnc2Nyb2xsYmFyLW1lYXN1cmUnLCAnaWNvbi1zdWNjZXNzJywgJ2ljb24td2FybmluZycsICdpY29uLWluZm8nLCAnaWNvbi1xdWVzdGlvbicsICdpY29uLWVycm9yJ10pO1xuICB2YXIgaWNvblR5cGVzID0gcHJlZml4KFsnc3VjY2VzcycsICd3YXJuaW5nJywgJ2luZm8nLCAncXVlc3Rpb24nLCAnZXJyb3InXSk7XG5cbiAgdmFyIGdldENvbnRhaW5lciA9IGZ1bmN0aW9uIGdldENvbnRhaW5lcigpIHtcbiAgICByZXR1cm4gZG9jdW1lbnQuYm9keS5xdWVyeVNlbGVjdG9yKFwiLlwiLmNvbmNhdChzd2FsQ2xhc3Nlcy5jb250YWluZXIpKTtcbiAgfTtcbiAgdmFyIGVsZW1lbnRCeVNlbGVjdG9yID0gZnVuY3Rpb24gZWxlbWVudEJ5U2VsZWN0b3Ioc2VsZWN0b3JTdHJpbmcpIHtcbiAgICB2YXIgY29udGFpbmVyID0gZ2V0Q29udGFpbmVyKCk7XG4gICAgcmV0dXJuIGNvbnRhaW5lciA/IGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKHNlbGVjdG9yU3RyaW5nKSA6IG51bGw7XG4gIH07XG5cbiAgdmFyIGVsZW1lbnRCeUNsYXNzID0gZnVuY3Rpb24gZWxlbWVudEJ5Q2xhc3MoY2xhc3NOYW1lKSB7XG4gICAgcmV0dXJuIGVsZW1lbnRCeVNlbGVjdG9yKFwiLlwiLmNvbmNhdChjbGFzc05hbWUpKTtcbiAgfTtcblxuICB2YXIgZ2V0UG9wdXAgPSBmdW5jdGlvbiBnZXRQb3B1cCgpIHtcbiAgICByZXR1cm4gZWxlbWVudEJ5Q2xhc3Moc3dhbENsYXNzZXMucG9wdXApO1xuICB9O1xuICB2YXIgZ2V0SWNvbnMgPSBmdW5jdGlvbiBnZXRJY29ucygpIHtcbiAgICB2YXIgcG9wdXAgPSBnZXRQb3B1cCgpO1xuICAgIHJldHVybiB0b0FycmF5KHBvcHVwLnF1ZXJ5U2VsZWN0b3JBbGwoXCIuXCIuY29uY2F0KHN3YWxDbGFzc2VzLmljb24pKSk7XG4gIH07XG4gIHZhciBnZXRJY29uID0gZnVuY3Rpb24gZ2V0SWNvbigpIHtcbiAgICB2YXIgdmlzaWJsZUljb24gPSBnZXRJY29ucygpLmZpbHRlcihmdW5jdGlvbiAoaWNvbikge1xuICAgICAgcmV0dXJuIGlzVmlzaWJsZShpY29uKTtcbiAgICB9KTtcbiAgICByZXR1cm4gdmlzaWJsZUljb24ubGVuZ3RoID8gdmlzaWJsZUljb25bMF0gOiBudWxsO1xuICB9O1xuICB2YXIgZ2V0VGl0bGUgPSBmdW5jdGlvbiBnZXRUaXRsZSgpIHtcbiAgICByZXR1cm4gZWxlbWVudEJ5Q2xhc3Moc3dhbENsYXNzZXMudGl0bGUpO1xuICB9O1xuICB2YXIgZ2V0Q29udGVudCA9IGZ1bmN0aW9uIGdldENvbnRlbnQoKSB7XG4gICAgcmV0dXJuIGVsZW1lbnRCeUNsYXNzKHN3YWxDbGFzc2VzLmNvbnRlbnQpO1xuICB9O1xuICB2YXIgZ2V0SHRtbENvbnRhaW5lciA9IGZ1bmN0aW9uIGdldEh0bWxDb250YWluZXIoKSB7XG4gICAgcmV0dXJuIGVsZW1lbnRCeUNsYXNzKHN3YWxDbGFzc2VzWy
8443dodG1sLWNvbnRhaW5lciddKTtcbiAgfTtcbiAgdmFyIGdldEltYWdlID0gZnVuY3Rpb24gZ2V0SW1hZ2UoKSB7XG4gICAgcmV0dXJuIGVsZW1lbnRCeUNsYXNzKHN3YWxDbGFzc2VzLmltYWdlKTtcbiAgfTtcbiAgdmFyIGdldFByb2dyZXNzU3RlcHMgPSBmdW5jdGlvbiBnZXRQcm9ncmVzc1N0ZXBzKCkge1xuICAgIHJldHVybiBlbGVtZW50QnlDbGFzcyhzd2FsQ2xhc3Nlc1sncHJvZ3Jlc3Mtc3RlcHMnXSk7XG4gIH07XG4gIHZhciBnZXRWYWxpZGF0aW9uTWVzc2FnZSA9IGZ1bmN0aW9uIGdldFZhbGlkYXRpb25NZXNzYWdlKCkge1xuICAgIHJldHVybiBlbGVtZW50QnlDbGFzcyhzd2FsQ2xhc3Nlc1sndmFsaWRhdGlvbi1tZXNzYWdlJ10pO1xuICB9O1xuICB2YXIgZ2V0Q29uZmlybUJ1dHRvbiA9IGZ1bmN0aW9uIGdldENvbmZpcm1CdXR0b24oKSB7XG4gICAgcmV0dXJuIGVsZW1lbnRCeVNlbGVjdG9yKFwiLlwiLmNvbmNhdChzd2FsQ2xhc3Nlcy5hY3Rpb25zLCBcIiAuXCIpLmNvbmNhdChzd2FsQ2xhc3Nlcy5jb25maXJtKSk7XG4gIH07XG4gIHZhciBnZXREZW55QnV0dG9uID0gZnVuY3Rpb24gZ2V0RGVueUJ1dHRvbigpIHtcbiAgICByZXR1cm4gZWxlbWVudEJ5U2VsZWN0b3IoXCIuXCIuY29uY2F0KHN3YWxDbGFzc2VzLmFjdGlvbnMsIFwiIC5cIikuY29uY2F0KHN3YWxDbGFzc2VzLmRlbnkpKTtcbiAgfTtcbiAgdmFyIGdldElucHV0TGFiZWwgPSBmdW5jdGlvbiBnZXRJbnB1dExhYmVsKCkge1xuICAgIHJldHVybiBlbGVtZW50QnlDbGFzcyhzd2FsQ2xhc3Nlc1snaW5wdXQtbGFiZWwnXSk7XG4gIH07XG4gIHZhciBnZXRMb2FkZXIgPSBmdW5jdGlvbiBnZXRMb2FkZXIoKSB7XG4gICAgcmV0dXJuIGVsZW1lbnRCeVNlbGVjdG9yKFwiLlwiLmNvbmNhdChzd2FsQ2xhc3Nlcy5sb2FkZXIpKTtcbiAgfTtcbiAgdmFyIGdldENhbmNlbEJ1dHRvbiA9IGZ1bmN0aW9uIGdldENhbmNlbEJ1dHRvbigpIHtcbiAgICByZXR1cm4gZWxlbWVudEJ5U2VsZWN0b3IoXCIuXCIuY29uY2F0KHN3YWxDbGFzc2VzLmFjdGlvbnMsIFwiIC5cIikuY29uY2F0KHN3YWxDbGFzc2VzLmNhbmNlbCkpO1xuICB9O1xuICB2YXIgZ2V0QWN0aW9ucyA9IGZ1bmN0aW9uIGdldEFjdGlvbnMoKSB7XG4gICAgcmV0dXJuIGVsZW1lbnRCeUNsYXNzKHN3YWxDbGFzc2VzLmFjdGlvbnMpO1xuICB9O1xuICB2YXIgZ2V0SGVhZGVyID0gZnVuY3Rpb24gZ2V0SGVhZGVyKCkge1xuICAgIHJldHVybiBlbGVtZW50QnlDbGFzcyhzd2FsQ2xhc3Nlcy5oZWFkZXIpO1xuICB9O1xuICB2YXIgZ2V0Rm9vdGVyID0gZnVuY3Rpb24gZ2V0Rm9vdGVyKCkge1xuICAgIHJldHVybiBlbGVtZW50QnlDbGFzcyhzd2FsQ2xhc3Nlcy5mb290ZXIpO1xuICB9O1xuICB2YXIgZ2V0VGltZXJQcm9ncmVzc0JhciA9IGZ1bmN0aW9uIGdldFRpbWVyUHJvZ3Jlc3NCYXIoKSB7XG4gICAgcmV0dXJuIGVsZW1lbnRCeUNsYXNzKHN3YWxDbGFzc2VzWy
8443d0aW1lci1wcm9ncmVzcy1iYXInXSk7XG4gIH07XG4gIHZhciBnZXRDbG9zZUJ1dHRvbiA9IGZ1bmN0aW9uIGdldENsb3NlQnV0dG9uKCkge1xuICAgIHJldHVybiBlbGVtZW50QnlDbGFzcyhzd2FsQ2xhc3Nlcy5jbG9zZSk7XG4gIH07IC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9qa3VwL2ZvY3VzYWJsZS9ibG9iL21hc3Rlci9pbmRleC5qc1xuXG4gIHZhciBmb2N1c2FibGUgPSBcIlxcbiAgYVtocmVmXSxcXG4gIGFyZWFbaHJlZl0sXFxuICBpbnB1dDpub3QoW2Rpc2FibGVkXSksXFxuICBzZWxlY3Q6bm90KFtkaXNhYmxlZF0pLFxcbiAgdGV4dGFyZWE6bm90KFtkaXNhYmxlZF0pLFxcbiAgYnV0dG9uOm5vdChbZGlzYWJsZWRdKSxcXG4gIGlmcmFtZSxcXG4gIG9iamVjdCxcXG4gIGVtYmVkLFxcbiAgW3RhYmluZGV4PVxcXCIwXFxcIl0sXFxuICBbY29udGVudGVkaXRhYmxlXSxcXG4gIGF1ZGlvW2NvbnRyb2xzXSxcXG4gIHZpZGVvW2NvbnRyb2xzXSxcXG4gIHN1bW1hcnlcXG5cIjtcbiAgdmFyIGdldEZvY3VzYWJsZUVsZW1lbnRzID0gZnVuY3Rpb24gZ2V0Rm9jdXNhYmxlRWxlbWVudHMoKSB7XG4gICAgdmFyIGZvY3VzYWJsZUVsZW1lbnRzV2l0aFRhYmluZGV4ID0gdG9BcnJheShnZXRQb3B1cCgpLnF1ZXJ5U2VsZWN0b3JBbGwoJ1t0YWJpbmRleF06bm90KFt0YWJpbmRleD1cIi0xXCJdKTpub3QoW3RhYmluZGV4PVwiMFwiXSknKSkgLy8gc29ydCBhY2NvcmRpbmcgdG8gdGFiaW5kZXhcbiAgICAuc29ydChmdW5jdGlvbiAoYSwgYikge1xuICAgICAgYSA9IHBhcnNlSW50KGEuZ2V0QXR0cmlidXRlKCd0YWJpbmRleCcpKTtcbiAgICAgIGIgPSBwYXJzZUludChiLmdldEF0dHJpYnV0ZSgndGFiaW5kZXgnKSk7XG5cbiAgICAgIGlmIChhID4gYikge1xuICAgICAgICByZXR1cm4gMTtcbiAgICAgIH0gZWxzZSBpZiAoYSA8IGIpIHtcbiAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gMDtcbiAgICB9KTtcbiAgICB2YXIgb3RoZXJGb2N1c2FibGVFbGVtZW50cyA9IHRvQXJyYXkoZ2V0UG9wdXAoKS5xdWVyeVNlbGVjdG9yQWxsKGZvY3VzYWJsZSkpLmZpbHRlcihmdW5jdGlvbiAoZWwpIHtcbiAgICAgIHJldHVybiBlbC5nZXRBdHRyaWJ1dGUoJ3RhYmluZGV4JykgIT09ICctMSc7XG4gICAgfSk7XG4gICAgcmV0dXJuIHVuaXF1ZUFycmF5KGZvY3VzYWJsZUVsZW1lbnRzV2l0aFRhYmluZGV4LmNvbmNhdChvdGhlckZvY3VzYWJsZUVsZW1lbnRzKSkuZmlsdGVyKGZ1bmN0aW9uIChlbCkge1xuICAgICAgcmV0dXJuIGlzVmlzaWJsZShlbCk7XG4gICAgfSk7XG4gIH07XG4gIHZhciBpc01vZGFsID0gZnVuY3Rpb24gaXNNb2RhbCgpIHtcbiAgICByZXR1cm4gIWlzVG9hc3QoKSAmJiAhZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QuY29udGFpbnMoc3dhbENsYXNzZXNbJ25vLWJhY2tkcm9wJ10pO1xuICB9O1xuICB2YXIgaXNUb2FzdCA9IGZ1bmN0aW9uIGlzVG9hc3QoKSB7XG4gICAgcmV0dXJuIGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LmNvbnRhaW5zKHN3YWxDbGFzc2VzWy
8443d0b2FzdC1zaG93biddKTtcbiAgfTtcbiAgdmFyIGlzTG9hZGluZyA9IGZ1bmN0aW9uIGlzTG9hZGluZygpIHtcbiAgICByZXR1cm4gZ2V0UG9wdXAoKS5oYXNBdHRyaWJ1dGUoJ2RhdGEtbG9hZGluZycpO1xuICB9O1xuXG4gIHZhciBzdGF0ZXMgPSB7XG4gICAgcHJldmlvdXNCb2R5UGFkZGluZzogbnVsbFxuICB9O1xuICB2YXIgc2V0SW5uZXJIdG1sID0gZnVuY3Rpb24gc2V0SW5uZXJIdG1sKGVsZW0sIGh0bWwpIHtcbiAgICAvLyAjMTkyNlxuICAgIGVsZW0udGV4dENvbnRlbnQgPSAnJztcblxuICAgIGlmIChodG1sKSB7XG4gICAgICB2YXIgcGFyc2VyID0gbmV3IERPTVBhcnNlcigpO1xuICAgICAgdmFyIHBhcnNlZCA9IHBhcnNlci5wYXJzZUZyb21TdHJpbmcoaHRtbCwgXCJ0ZXh0L2h0bWxcIik7XG4gICAgICB0b0FycmF5KHBhcnNlZC5xdWVyeVNlbGVjdG9yKCdoZWFkJykuY2hpbGROb2RlcykuZm9yRWFjaChmdW5jdGlvbiAoY2hpbGQpIHtcbiAgICAgICAgZWxlbS5hcHBlbmRDaGlsZChjaGlsZCk7XG4gICAgICB9KTtcbiAgICAgIHRvQXJyYXkocGFyc2VkLnF1ZXJ5U2VsZWN0b3IoJ2JvZHknKS5jaGlsZE5vZGVzKS5mb3JFYWNoKGZ1bmN0aW9uIChjaGlsZCkge1xuICAgICAgICBlbGVtLmFwcGVuZENoaWxkKGNoaWxkKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfTtcbiAgdmFyIGhhc0NsYXNzID0gZnVuY3Rpb24gaGFzQ2xhc3MoZWxlbSwgY2xhc3NOYW1lKSB7XG4gICAgaWYgKCFjbGFzc05hbWUpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICB2YXIgY2xhc3NMaXN0ID0gY2xhc3NOYW1lLnNwbGl0KC9cXHMrLyk7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNsYXNzTGlzdC5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKCFlbGVtLmNsYXNzTGlzdC5jb250YWlucyhjbGFzc0xpc3RbaV0pKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfTtcblxuICB2YXIgcmVtb3ZlQ3VzdG9tQ2xhc3NlcyA9IGZ1bmN0aW9uIHJlbW92ZUN1c3RvbUNsYXNzZXMoZWxlbSwgcGFyYW1zKSB7XG4gICAgdG9BcnJheShlbGVtLmNsYXNzTGlzdCkuZm9yRWFjaChmdW5jdGlvbiAoY2xhc3NOYW1lKSB7XG4gICAgICBpZiAoIShvYmplY3RWYWx1ZXMoc3dhbENsYXNzZXMpLmluZGV4T2YoY2xhc3NOYW1lKSAhPT0gLTEpICYmICEob2JqZWN0VmFsdWVzKGljb25UeXBlcykuaW5kZXhPZihjbGFzc05hbWUpICE9PSAtMSkgJiYgIShvYmplY3RWYWx1ZXMocGFyYW1zLnNob3dDbGFzcykuaW5kZXhPZihjbGFzc05hbWUpICE9PSAtMSkpIHtcbiAgICAgICAgZWxlbS5jbGFzc0xpc3QucmVtb3ZlKGNsYXNzTmFtZSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH07XG5cbiAgdmFyIGFwcGx5Q3VzdG9tQ2xhc3MgPSBmdW5jdGlvbiBhcHBseUN1c3RvbUNsYXNzKGVsZW0sIHBhcmFtcywgY2xhc3NOYW1lKSB7XG4gICAgcmVtb3ZlQ3VzdG9tQ2xhc3NlcyhlbGVtLCBwYXJhbXMpO1xuXG4gICAgaWYgKHBhcmFtcy5jdXN0b21DbGFzcyAmJiBwYXJhbXMuY3VzdG9tQ2xhc3NbY2xhc3NOYW1lXSkge1xuICAgICAgaWYgKHR5cGVvZiBwYXJhbXMuY3VzdG9tQ2xhc3NbY2xhc3NOYW1lXSAhPT0gJ3N0cmluZycgJiYgIXBhcmFtcy5jdXN0b21DbGFzc1tjbGFzc05hbWVdLmZvckVhY2gpIHtcbiAgICAgICAgcmV0dXJuIHdhcm4oXCJJbnZhbGlkIHR5cGUgb2YgY3VzdG9tQ2xhc3MuXCIuY29uY2F0KGNsYXNzTmFtZSwgXCIhIEV4cGVjdGVkIHN0cmluZyBvciBpdGVyYWJsZSBvYmplY3QsIGdvdCBcXFwiXCIpLmNvbmNhdChfdHlwZW9mKHBhcmFtcy5jdXN0b21DbGFzc1tjbGFzc05hbWVdKSwgXCJcXFwiXCIpKTtcbiAgICAgIH1cblxuICAgICAgYWRkQ2xhc3MoZWxlbSwgcGFyYW1zLmN1c3RvbUNsYXNzW2NsYXNzTmFtZV0pO1xuICAgIH1cbiAgfTtcbiAgZnVuY3Rpb24gZ2V0SW5wdXQoY29udGVudCwgaW5wdXRUeXBlKSB7XG4gICAgaWYgKCFpbnB1dFR5cGUpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHN3aXRjaCAoaW5wdXRUeXBlKSB7XG4gICAgICBjYXNlICdzZWxlY3QnOlxuICAgICAgY2FzZSAndGV4dGFyZWEnOlxuICAgICAgY2FzZSAnZmlsZSc6XG4gICAgICAgIHJldHVybiBnZXRDaGlsZEJ5Q2xhc3MoY29udGVudCwgc3dhbENsYXNzZXNbaW5wdXRUeXBlXSk7XG5cbiAgICAgIGNhc2UgJ2NoZWNrYm94JzpcbiAgICAgICAgcmV0dXJuIGNvbnRlbnQucXVlcnlTZWxlY3RvcihcIi5cIi5jb25jYXQoc3dhbENsYXNzZXMuY2hlY2tib3gsIFwiIGlucHV0XCIpKTtcblxuICAgICAgY2FzZSAncmFkaW8nOlxuICAgICAgICByZXR1cm4gY29udGVudC5xdWVyeVNlbGVjdG9yKFwiLlwiLmNvbmNhdChzd2FsQ2xhc3Nlcy5yYWRpbywgXCIgaW5wdXQ6Y2hlY2tlZFwiKSkgfHwgY29udGVudC5xdWVyeVNlbGVjdG9yKFwiLlwiLmNvbmNhdChzd2FsQ2xhc3Nlcy5yYWRpbywgXCIgaW5wdXQ6Zmlyc3QtY2hpbGRcIikpO1xuXG4gICAgICBjYXNlICdyYW5nZSc6XG4gICAgICAgIHJldHVybiBjb250ZW50LnF1ZXJ5U2VsZWN0b3IoXCIuXCIuY29uY2F0KHN3YWxDbGFzc2VzLnJhbmdlLCBcIiBpbnB1dFwiKSk7XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBnZXRDaGlsZEJ5Q2xhc3MoY29udGVudCwgc3dhbENsYXNzZXMuaW5wdXQpO1xuICAgIH1cbiAgfVxuICB2YXIgZm9jdXNJbnB1dCA9IGZ1bmN0aW9uIGZvY3VzSW5wdXQoaW5wdXQpIHtcbiAgICBpbnB1dC5mb2N1cygpOyAvLyBwbGFjZSBjdXJzb3IgYXQgZW5kIG9mIHRleHQgaW4gdGV4dCBpbnB1dFxuXG4gICAgaWYgKGlucHV0LnR5cGUgIT09ICdmaWxlJykge1xuICAgICAgLy8gaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL2EvMjM0NTkxNVxuICAgICAgdmFyIHZhbCA9IGlucHV0LnZhbHVlO1xuICAgICAgaW5wdXQudmFsdWUgPSAnJztcbiAgICAgIGlucHV0LnZhbHVlID0gdmFsO1xuICAgIH1cbiAgfTtcbiAgdmFyIHRvZ2dsZUNsYXNzID0gZnVuY3Rpb24gdG9nZ2xlQ2xhc3ModGFyZ2V0LCBjbGFzc0xpc3QsIGNvbmRpdGlvbikge1xuICAgIGlmICghdGFyZ2V0IHx8ICFjbGFzc0xpc3QpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGNsYXNzTGlzdCA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGNsYXNzTGlzdCA9IGNsYXNzTGlzdC5zcGxpdCgvXFxzKy8pLmZpbHRlcihCb29sZWFuKTtcbiAgICB9XG5cbiAgICBjbGFzc0xpc3QuZm9yRWFjaChmdW5jdGlvbiAoY2xhc3NOYW1lKSB7XG4gICAgICBpZiAodGFyZ2V0LmZvckVhY2gpIHtcbiAgICAgICAgdGFyZ2V0LmZvckVhY2goZnVuY3Rpb24gKGVsZW0pIHtcbiAgICAgICAgICBjb25kaXRpb24gPyBlbGVtLmNsYXNzTGlzdC5hZGQoY2xhc3NOYW1lKSA6IGVsZW0uY2xhc3NMaXN0LnJlbW92ZShjbGFzc05hbWUpO1xuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbmRpdGlvbiA/IHRhcmdldC5jbGFzc0xpc3QuYWRkKGNsYXNzTmFtZSkgOiB0YXJnZXQuY2xhc3NMaXN0LnJlbW92ZShjbGFzc05hbWUpO1xuICAgICAgfVxuICAgIH0pO1xuICB9O1xuICB2YXIgYWRkQ2xhc3MgPSBmdW5jdGlvbiBhZGRDbGFzcyh0YXJnZXQsIGNsYXNzTGlzdCkge1xuICAgIHRvZ2dsZUNsYXNzKHRhcmdldCwgY2xhc3NMaXN0LCB0cnVlKTtcbiAgfTtcbiAgdmFyIHJlbW92ZUNsYXNzID0gZnVuY3Rpb24gcmVtb3ZlQ2xhc3ModGFyZ2V0LCBjbGFzc0xpc3QpIHtcbiAgICB0b2dnbGVDbGFzcyh0YXJnZXQsIGNsYXNzTGlzdCwgZmFsc2UpO1xuICB9O1xuICB2YXIgZ2V0Q2hpbGRCeUNsYXNzID0gZnVuY3Rpb24gZ2V0Q2hpbGRCeUNsYXNzKGVsZW0sIGNsYXNzTmFtZSkge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZWxlbS5jaGlsZE5vZGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoaGFzQ2xhc3MoZWxlbS5jaGlsZE5vZGVzW2ldLCBjbGFzc05hbWUpKSB7XG4gICAgICAgI
8443HJldHVybiBlbGVtLmNoaWxkTm9kZXNbaV07XG4gICAgICB9XG4gICAgfVxuICB9O1xuICB2YXIgYXBwbHlOdW1lcmljYWxTdHlsZSA9IGZ1bmN0aW9uIGFwcGx5TnVtZXJpY2FsU3R5bGUoZWxlbSwgcHJvcGVydHksIHZhbHVlKSB7XG4gICAgaWYgKHZhbHVlID09PSBcIlwiLmNvbmNhdChwYXJzZUludCh2YWx1ZSkpKSB7XG4gICAgICB2YWx1ZSA9IHBhcnNlSW50KHZhbHVlKTtcbiAgICB9XG5cbiAgICBpZiAodmFsdWUgfHwgcGFyc2VJbnQodmFsdWUpID09PSAwKSB7XG4gICAgICBlbGVtLnN0eWxlW3Byb3BlcnR5XSA9IHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicgPyBcIlwiLmNvbmNhdCh2YWx1ZSwgXCJweFwiKSA6IHZhbHVlO1xuICAgIH0gZWxzZSB7XG4gICAgICBlbGVtLnN0eWxlLnJlbW92ZVByb3BlcnR5KHByb3BlcnR5KTtcbiAgICB9XG4gIH07XG4gIHZhciBzaG93ID0gZnVuY3Rpb24gc2hvdyhlbGVtKSB7XG4gICAgdmFyIGRpc3BsYXkgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6ICdmbGV4JztcbiAgICBlbGVtLnN0eWxlLmRpc3BsYXkgPSBkaXNwbGF5O1xuICB9O1xuICB2YXIgaGlkZSA9IGZ1bmN0aW9uIGhpZGUoZWxlbSkge1xuICAgIGVsZW0uc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgfTtcbiAgdmFyIHNldFN0eWxlID0gZnVuY3Rpb24gc2V0U3R5bGUocGFyZW50LCBzZWxlY3RvciwgcHJvcGVydHksIHZhbHVlKSB7XG4gICAgdmFyIGVsID0gcGFyZW50LnF1ZXJ5U2VsZWN0b3Ioc2VsZWN0b3IpO1xuXG4gICAgaWYgKGVsKSB7XG4gICAgICBlbC5zdHlsZVtwcm9wZXJ0eV0gPSB2YWx1ZTtcbiAgICB9XG4gIH07XG4gIHZhciB0b2dnbGUgPSBmdW5jdGlvbiB0b2dnbGUoZWxlbSwgY29uZGl0aW9uLCBkaXNwbGF5KSB7XG4gICAgY29uZGl0aW9uID8gc2hvdyhlbGVtLCBkaXNwbGF5KSA6IGhpZGUoZWxlbSk7XG4gIH07IC8vIGJvcnJvd2VkIGZyb20ganF1ZXJ5ICQoZWxlbSkuaXMoJzp2aXNpYmxlJykgaW1wbGVtZW50YXRpb25cblxuICB2YXIgaXNWaXNpYmxlID0gZnVuY3Rpb24gaXNWaXNpYmxlKGVsZW0pIHtcbiAgICByZXR1cm4gISEoZWxlbSAmJiAoZWxlbS5vZmZzZXRXaWR0aCB8fCBlbGVtLm9mZnNldEhlaWdodCB8fCBlbGVtLmdldENsaWVudFJlY3RzKCkubGVuZ3RoKSk7XG4gIH07XG4gIHZhciBhbGxCdXR0b25zQXJlSGlkZGVuID0gZnVuY3Rpb24gYWxsQnV0dG9uc0FyZUhpZGRlbigpIHtcbiAgICByZXR1cm4gIWlzVmlzaWJsZShnZXRDb25maXJtQnV0dG9uKCkpICYmICFpc1Zpc2libGUoZ2V0RGVueUJ1dHRvbigpKSAmJiAhaXNWaXNpYmxlKGdldENhbmNlbEJ1dHRvbigpKTtcbiAgfTtcbiAgdmFyIGlzU2Nyb2xsYWJsZSA9IGZ1bmN0aW9uIGlzU2Nyb2xsYWJsZShlbGVtKSB7XG4gICAgcmV0dXJuICEhKGVsZW0uc2Nyb2xsSGVpZ2h0ID4gZWxlbS5jbGllbnRIZWlnaHQpO1xuICB9OyAvLyBib3Jyb3dlZCBmcm9tIGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vYS80NjM1MjExOVxuXG4gIHZhciBoYXNDc3NBbmltYXRpb24gPSBmdW5jdGlvbiBoYXNDc3NBbmltYXRpb24oZWxlbSkge1xuICAgIHZhciBzdHlsZSA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGVsZW0pO1xuICAgIHZhciBhbmltRHVyYXRpb24gPSBwYXJzZUZsb2F0KHN0eWxlLmdldFByb3BlcnR5VmFsdWUoJ2FuaW1hdGlvbi1kdXJhdGlvbicpIHx8ICcwJyk7XG4gICAgdmFyIHRyYW5zRHVyYXRpb24gPSBwYXJzZUZsb2F0KHN0eWxlLmdldFByb3BlcnR5VmFsdWUoJ3RyYW5zaXRpb24tZHVyYXRpb24nKSB8fCAnMCcpO1xuICAgIHJldHVybiBhbmltRHVyYXRpb24gPiAwIHx8IHRyYW5zRHVyYXRpb24gPiAwO1xuICB9O1xuICB2YXIgY29udGFpbnMgPSBmdW5jdGlvbiBjb250YWlucyhoYXlzdGFjaywgbmVlZGxlKSB7XG4gICAgaWYgKHR5cGVvZiBoYXlzdGFjay5jb250YWlucyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcmV0dXJuIGhheXN0YWNrLmNvbnRhaW5zKG5lZWRsZSk7XG4gICAgfVxuICB9O1xuICB2YXIgYW5pbWF0ZVRpbWVyUHJvZ3Jlc3NCYXIgPSBmdW5jdGlvbiBhbmltYXRlVGltZXJQcm9ncmVzc0Jhcih0aW1lcikge1xuICAgIHZhciByZXNldCA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogZmFsc2U7XG4gICAgdmFyIHRpbWVyUHJvZ3Jlc3NCYXIgPSBnZXRUaW1lclByb2dyZXNzQmFyKCk7XG5cbiAgICBpZiAoaXNWaXNpYmxlKHRpbWVyUHJvZ3Jlc3NCYXIpKSB7XG4gICAgICBpZiAocmVzZXQpIHtcbiAgICAgICAgdGltZXJQcm9ncmVzc0Jhci5zdHlsZS50cmFuc2l0aW9uID0gJ25vbmUnO1xuICAgICAgICB0aW1lclByb2dyZXNzQmFyLnN0eWxlLndpZHRoID0gJzEwMCUnO1xuICAgICAgfVxuXG4gICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGltZXJQcm9ncmVzc0Jhci5zdHlsZS50cmFuc2l0aW9uID0gXCJ3aWR0aCBcIi5jb25jYXQodGltZXIgLyAxMDAwLCBcInMgbGluZWFyXCIpO1xuICAgICAgICB0aW1lclByb2dyZXNzQmFyLnN0eWxlLndpZHRoID0gJzAlJztcbiAgICAgIH0sIDEwKTtcbiAgICB9XG4gIH07XG4gIHZhciBzdG9wVGltZXJQcm9ncmVzc0JhciA9IGZ1bmN0aW9uIHN0b3BUaW1lclByb2dyZXNzQmFyKCkge1xuICAgIHZhciB0aW1lclByb2dyZXNzQmFyID0gZ2V0VGltZXJQcm9ncmVzc0JhcigpO1xuICAgIHZhciB0aW1lclByb2dyZXNzQmFyV2lkdGggPSBwYXJzZUludCh3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSh0aW1lclByb2dyZXNzQmFyKS53aWR0aCk7XG4gICAgdGltZXJQcm9ncmVzc0Jhci5zdHlsZS5yZW1vdmVQcm9wZXJ0eSgndHJhbnNpdGlvbicpO1xuICAgIHRpbWVyUHJvZ3Jlc3NCYXIuc3R5bGUud2lkdGggPSAnMTAwJSc7XG4gICAgdmFyIHRpbWVyUHJvZ3Jlc3NCYXJGdWxsV2lkdGggPSBwYXJzZUludCh3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSh0aW1lclByb2dyZXNzQmFyKS53aWR0aCk7XG4gICAgdmFyIHRpbWVyUHJvZ3Jlc3NCYXJQZXJjZW50ID0gcGFyc2VJbnQodGltZXJQcm9ncmVzc0JhcldpZHRoIC8gdGltZXJQcm9ncmVzc0JhckZ1bGxXaWR0aCAqIDEwMCk7XG4gICAgdGltZXJQcm9ncmVzc0Jhci5zdHlsZS5yZW1vdmVQcm9wZXJ0eSgndHJhbnNpdGlvbic
8443pO1xuICAgIHRpbWVyUHJvZ3Jlc3NCYXIuc3R5bGUud2lkdGggPSBcIlwiLmNvbmNhdCh0aW1lclByb2dyZXNzQmFyUGVyY2VudCwgXCIlXCIpO1xuICB9O1xuXG4gIC8vIERldGVjdCBOb2RlIGVudlxuICB2YXIgaXNOb2RlRW52ID0gZnVuY3Rpb24gaXNOb2RlRW52KCkge1xuICAgIHJldHVybiB0eXBlb2Ygd2luZG93ID09PSAndW5kZWZpbmVkJyB8fCB0eXBlb2YgZG9jdW1lbnQgPT09ICd1bmRlZmluZWQnO1xuICB9O1xuXG4gIHZhciBzd2VldEhUTUwgPSBcIlxcbiA8ZGl2IGFyaWEtbGFiZWxsZWRieT1cXFwiXCIuY29uY2F0KHN3YWxDbGFzc2VzLnRpdGxlLCBcIlxcXCIgYXJpYS1kZXNjcmliZWRieT1cXFwiXCIpLmNvbmNhdChzd2FsQ2xhc3Nlcy5jb250ZW50LCBcIlxcXCIgY2xhc3M9XFxcIlwiKS5jb25jYXQoc3dhbENsYXNzZXMucG9wdXAsIFwiXFxcIiB0YWJpbmRleD1cXFwiLTFcXFwiPlxcbiAgIDxkaXYgY2xhc3M9XFxcIlwiKS5jb25jYXQoc3dhbENsYXNzZXMuaGVhZGVyLCBcIlxcXCI+XFxuICAgICA8dWwgY2xhc3M9XFxcIlwiKS5jb25jYXQoc3dhbENsYXNzZXNbJ3Byb2dyZXNzLXN0ZXBzJ10sIFwiXFxcIj48L3VsPlxcbiAgICAgPGRpdiBjbGFzcz1cXFwiXCIpLmNvbmNhdChzd2FsQ2xhc3Nlcy5pY29uLCBcIiBcIikuY29uY2F0KGljb25UeXBlcy5lcnJvciwgXCJcXFwiPjwvZGl2PlxcbiAgICAgPGRpdiBjbGFzcz1cXFwiXCIpLmNvbmNhdChzd2FsQ2xhc3Nlcy5pY29uLCBcIiBcIikuY29uY2F0KGljb25UeXBlcy5xdWVzdGlvbiwgXCJcXFwiPjwvZGl2PlxcbiAgICAgPGRpdiBjbGFzcz1cXFwiXCIpLmNvbmNhdChzd2FsQ2xhc3Nlcy5pY29uLCBcIiBcIikuY29uY2F0KGljb25UeXBlcy53YXJuaW5nLCBcIlxcXCI+PC9kaXY+XFxuICAgICA8ZGl2IGNsYXNzPVxcXCJcIikuY29uY2F0KHN3YWxDbGFzc2VzLmljb24sIFwiIFwiKS5jb25jYXQoaWNvblR5cGVzLmluZm8sIFwiXFxcIj48L2Rpdj5cXG4gICAgIDxkaXYgY2xhc3M9XFxcIlwiKS5jb25jYXQoc3dhbENsYXNzZXMuaWNvbiwgXCIgXCIpLmNvbmNhdChpY29uVHlwZXMuc3VjY2VzcywgXCJcXFwiPjwvZGl2PlxcbiAgICAgPGltZyBjbGFzcz1cXFwiXCIpLmNvbmNhdChzd2FsQ2xhc3Nlcy5pbWFnZSwgXCJcXFwiIC8+XFxuICAgICA8aDIgY2xhc3M9XFxcIlwiKS5jb25jYXQoc3dhbENsYXNzZXMudGl0bGUsIFwiXFxcIiBpZD1cXFwiXCIpLmNvbmNhdChzd2FsQ2xhc3Nlcy50aXRsZSwgXCJcXFwiPjwvaDI+XFxuICAgICA8YnV0dG9uIHR5cGU9XFxcImJ1dHRvblxcXCIgY2xhc3M9XFxcIlwiKS5jb25jYXQoc3dhbENsYXNzZXMuY2xvc2UsIFwiXFxcIj48L2J1dHRvbj5cXG4gICA8L2Rpdj5cXG4gICA8ZGl2IGNsYXNzPVxcXCJcIikuY29uY2F0KHN3YWxDbGFzc2VzLmNvbnRlbnQsIFwiXFxcIj5cXG4gICAgIDxkaXYgaWQ9XFxcIlwiKS5jb25jYXQoc3dhbENsYXNzZXMuY29udGVudCwgXCJcXFwiIGNsYXNzPVxcXCJcIikuY29uY2F0KHN3YWxDbGFzc2VzWy
8443dodG1sLWNvbnRhaW5lciddLCBcIlxcXCI+PC9kaXY+XFxuICAgICA8aW5wdXQgY2xhc3M9XFxcIlwiKS5jb25jYXQoc3dhbENsYXNzZXMuaW5wdXQsIFwiXFxcIiAvPlxcbiAgICAgPGlucHV0IHR5cGU9XFxcImZpbGVcXFwiIGNsYXNzPVxcXCJcIikuY29uY2F0KHN3YWxDbGFzc2VzLmZpbGUsIFwiXFxcIiAvPlxcbiAgICAgPGRpdiBjbGFzcz1cXFwiXCIpLmNvbmNhdChzd2FsQ2xhc3Nlcy5yYW5nZSwgXCJcXFwiPlxcbiAgICAgICA8aW5wdXQgdHlwZT1cXFwicmFuZ2VcXFwiIC8+XFxuICAgICAgIDxvdXRwdXQ+PC9vdXRwdXQ+XFxuICAgICA8L2Rpdj5cXG4gICAgIDxzZWxlY3QgY2xhc3M9XFxcIlwiKS5jb25jYXQoc3dhbENsYXNzZXMuc2VsZWN0LCBcIlxcXCI+PC9zZWxlY3Q+XFxuICAgICA8ZGl2IGNsYXNzPVxcXCJcIikuY29uY2F0KHN3YWxDbGFzc2VzLnJhZGlvLCBcIlxcXCI+PC9kaXY+XFxuICAgICA8bGFiZWwgZm9yPVxcXCJcIikuY29uY2F0KHN3YWxDbGFzc2VzLmNoZWNrYm94LCBcIlxcXCIgY2xhc3M9XFxcIlwiKS5jb25jYXQoc3dhbENsYXNzZXMuY2hlY2tib3gsIFwiXFxcIj5cXG4gICAgICAgPGlucHV0IHR5cGU9XFxcImNoZWNrYm94XFxcIiAvPlxcbiAgICAgICA8c3BhbiBjbGFzcz1cXFwiXCIpLmNvbmNhdChzd2FsQ2xhc3Nlcy5sYWJlbCwgXCJcXFwiPjwvc3Bhbj5cXG4gICAgIDwvbGFiZWw+XFxuICAgICA8dGV4dGFyZWEgY2xhc3M9XFxcIlwiKS5jb25jYXQoc3dhbENsYXNzZXMudGV4dGFyZWEsIFwiXFxcIj48L3RleHRhcmVhPlxcbiAgICAgPGRpdiBjbGFzcz1cXFwiXCIpLmNvbmNhdChzd2FsQ2xhc3Nlc1sndmFsaWRhdGlvbi1tZXNzYWdlJ10sIFwiXFxcIiBpZD1cXFwiXCIpLmNvbmNhdChzd2FsQ2xhc3Nlc1sndmFsaWRhdGlvbi1tZXNzYWdlJ10sIFwiXFxcIj48L2Rpdj5cXG4gICA8L2Rpdj5cXG4gICA8ZGl2IGNsYXNzPVxcXCJcIikuY29uY2F0KHN3YWxDbGFzc2VzLmFjdGlvbnMsIFwiXFxcIj5cXG4gICAgIDxkaXYgY2xhc3M9XFxcIlwiKS5jb25jYXQoc3dhbENsYXNzZXMubG9hZGVyLCBcIlxcXCI+PC9kaXY+XFxuICAgICA8YnV0dG9uIHR5cGU9XFxcImJ1dHRvblxcXCIgY2xhc3M9XFxcIlwiKS5jb25jYXQoc3dhbENsYXNzZXMuY29uZmlybSwgXCJcXFwiPjwvYnV0dG9uPlxcbiAgICAgPGJ1dHRvbiB0eXBlPVxcXCJidXR0b25cXFwiIGNsYXNzPVxcXCJcIikuY29uY2F0KHN3YWxDbGFzc2VzLmRlbnksIFwiXFxcIj48L2J1dHRvbj5cXG4gICAgIDxidXR0b24gdHlwZT1cXFwiYnV0dG9uXFxcIiBjbGFzcz1cXFwiXCIpLmNvbmNhdChzd2FsQ2xhc3Nlcy5jYW5jZWwsIFwiXFxcIj48L2J1dHRvbj5cXG4gICA8L2Rpdj5cXG4gICA8ZGl2IGNsYXNzPVxcXCJcIikuY29uY2F0KHN3YWxDbGFzc2VzLmZvb3RlciwgXCJcXFwiPjwvZGl2PlxcbiAgIDxkaXYgY2xhc3M9XFxcIlwiKS5jb25jYXQoc3dhbENsYXNzZXNbJ3RpbWVyLXByb2dyZXNzLWJhci1jb250YWluZXInXSwgXCJcXFwiPlxcbiAgICAgPGRpdiBjbGFzcz1cXFwiXCIpLmNvbmNhdChzd2FsQ2xhc3Nlc1sndGltZXItcHJvZ3Jlc3MtYmFyJ10sIFwiXFxcIj48L2Rpdj5cXG4gICA8L2Rpdj5cXG4gPC9kaXY+XFxuXCIpLnJlcGxhY2UoLyhefFxcbilcXHMqL2csICcnKTtcblxuICB2YXIgcmVzZXRPbGRDb250YWluZXIgPSBmdW5jdGlvbiByZXNldE9sZENvbnRhaW5lcigpIHtcbiAgICB2YXIgb2xkQ29udGFpbmVyID0gZ2V0Q29udGFpbmVyKCk7XG5cbiAgICBpZiAoIW9sZENvbnRhaW5lcikge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIG9sZENvbnRhaW5lci5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKG9sZENvbnRhaW5lcik7XG4gICAgcmVtb3ZlQ2xhc3MoW2RvY3VtZW50LmRvY3VtZW50RWxlbWVudCwgZG9jdW1lbnQuYm9keV0sIFtzd2FsQ2xhc3Nlc1snbm8tYmFja2Ryb3AnXSwgc3dhbENsYXNzZXNbJ3RvYXN0LXNob3duJ10sIHN3YWxDbGFzc2VzWy
8443doYXMtY29sdW1uJ11dKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfTtcblxuICB2YXIgb2xkSW5wdXRWYWw7IC8vIElFMTEgd29ya2Fyb3VuZCwgc2VlICMxMTA5IGZvciBkZXRhaWxzXG5cbiAgdmFyIHJlc2V0VmFsaWRhdGlvbk1lc3NhZ2UgPSBmdW5jdGlvbiByZXNldFZhbGlkYXRpb25NZXNzYWdlKGUpIHtcbiAgICBpZiAoU3dhbC5pc1Zpc2libGUoKSAmJiBvbGRJbnB1dFZhbCAhPT0gZS50YXJnZXQudmFsdWUpIHtcbiAgICAgIFN3YWwucmVzZXRWYWxpZGF0aW9uTWVzc2FnZSgpO1xuICAgIH1cblxuICAgIG9sZElucHV0VmFsID0gZS50YXJnZXQudmFsdWU7XG4gIH07XG5cbiAgdmFyIGFkZElucHV0Q2hhbmdlTGlzdGVuZXJzID0gZnVuY3Rpb24gYWRkSW5wdXRDaGFuZ2VMaXN0ZW5lcnMoKSB7XG4gICAgdmFyIGNvbnRlbnQgPSBnZXRDb250ZW50KCk7XG4gICAgdmFyIGlucHV0ID0gZ2V0Q2hpbGRCeUNsYXNzKGNvbnRlbnQsIHN3YWxDbGFzc2VzLmlucHV0KTtcbiAgICB2YXIgZmlsZSA9IGdldENoaWxkQnlDbGFzcyhjb250ZW50LCBzd2FsQ2xhc3Nlcy5maWxlKTtcbiAgICB2YXIgcmFuZ2UgPSBjb250ZW50LnF1ZXJ5U2VsZWN0b3IoXCIuXCIuY29uY2F0KHN3YWxDbGFzc2VzLnJhbmdlLCBcIiBpbnB1dFwiKSk7XG4gICAgdmFyIHJhbmdlT3V0cHV0ID0gY29udGVudC5xdWVyeVNlbGVjdG9yKFwiLlwiLmNvbmNhdChzd2FsQ2xhc3Nlcy5yYW5nZSwgXCIgb3V0cHV0XCIpKTtcbiAgICB2YXIgc2VsZWN0ID0gZ2V0Q2hpbGRCeUNsYXNzKGNvbnRlbnQsIHN3YWxDbGFzc2VzLnNlbGVjdCk7XG4gICAgdmFyIGNoZWNrYm94ID0gY29udGVudC5xdWVyeVNlbGVjdG9yKFwiLlwiLmNvbmNhdChzd2FsQ2xhc3Nlcy5jaGVja2JveCwgXCIgaW5wdXRcIikpO1xuICAgIHZhciB0ZXh0YXJlYSA9IGdldENoaWxkQnlDbGFzcyhjb250ZW50LCBzd2FsQ2xhc3Nlcy50ZXh0YXJlYSk7XG4gICAgaW5wdXQub25pbnB1dCA9IHJlc2V0VmFsaWRhdGlvbk1lc3NhZ2U7XG4gICAgZmlsZS5vbmNoYW5nZSA9IHJlc2V0VmFsaWRhdGlvbk1lc3NhZ2U7XG4gICAgc2VsZWN0Lm9uY2hhbmdlID0gcmVzZXRWYWxpZGF0aW9uTWVzc2FnZTtcbiAgICBjaGVja2JveC5vbmNoYW5nZSA9IHJlc2V0VmFsaWRhdGlvbk1lc3NhZ2U7XG4gICAgdGV4dGFyZWEub25pbnB1dCA9IHJlc2V0VmFsaWRhdGlvbk1lc3NhZ2U7XG5cbiAgICByYW5nZS5vbmlucHV0ID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgIHJlc2V0VmFsaWRhdGlvbk1lc3NhZ2UoZSk7XG4gICAgICByYW5nZU91dHB1dC52YWx1ZSA9IHJhbmdlLnZhbHVlO1xuICAgIH07XG5cbiAgICByYW5nZS5vbmNoYW5nZSA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICByZXNldFZhbGlkYXRpb25NZXNzYWdlKGUpO1xuICAgICAgcmFuZ2UubmV4dFNpYmxpbmcudmFsdWUgPSByYW5nZS52YWx1ZTtcbiAgICB9O1xuICB9O1xuXG4gIHZhciBnZXRUYXJnZXQgPSBmdW5jdGlvbiBnZXRUYXJnZXQodGFyZ2V0KSB7XG4gICAgcmV0dXJuIHR5cGVvZiB0YXJnZXQgPT09ICdzdHJpbmcnID8gZG9jdW1lbnQucXVlcnlTZWxlY3Rvcih0YXJnZXQpIDogdGFyZ2V0O1xuICB9O1xuXG4gIHZhciBzZXR1cEFjY2Vzc2liaWxpdHkgPSBmdW5jdGlvbiBzZXR1cEFjY2Vzc2liaWxpdHkocGFyYW1zKSB7XG4gICAgdmFyIHBvcHVwID0gZ2V0UG9wdXAoKTtcbiAgICBwb3B1cC5zZXRBdHRyaWJ1dGUoJ3JvbGUnLCBwYXJhbXMudG9hc3QgPyAnYWxlcnQnIDogJ2RpYWxvZycpO1xuICAgIHBvcHVwLnNldEF0dHJpYnV0ZSgnYXJpYS1saXZlJywgcGFyYW1zLnRvYXN0ID8gJ3BvbGl0ZScgOiAnYXNzZXJ0aXZlJyk7XG5cbiAgICBpZiAoIXBhcmFtcy50b2FzdCkge1xuICAgICAgcG9wdXAuc2V0QXR0cmlidXRlKCdhcmlhLW1vZGFsJywgJ3RydWUnKTtcbiAgICB9XG4gIH07XG5cbiAgdmFyIHNldHVwUlRMID0gZnVuY3Rpb24gc2V0dXBSVEwodGFyZ2V0RWxlbWVudCkge1xuICAgIGlmICh3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSh0YXJnZXRFbGVtZW50KS5kaXJlY3Rpb24gPT09ICdydGwnKSB7XG4gICAgICBhZGRDbGFzcyhnZXRDb250YWluZXIoKSwgc3dhbENsYXNzZXMucnRsKTtcbiAgICB9XG4gIH07XG4gIC8qXG4gICAqIEFkZCBtb2RhbCArIGJhY2tkcm9wIHRvIERPTVxuICAgKi9cblxuXG4gIHZhciBpbml0ID0gZnVuY3Rpb24gaW5pdChwYXJhbXMpIHtcbiAgICAvLyBDbGVhbiB1cCB0aGUgb2xkIHBvcHVwIGNvbnRhaW5lciBpZiBpdCBleGlzdHNcbiAgICB2YXIgb2xkQ29udGFpbmVyRXhpc3RlZCA9IHJlc2V0T2xkQ29udGFpbmVyKCk7XG4gICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG5cbiAgICBpZiAoaXNOb2RlRW52KCkpIHtcbiAgICAgIGVycm9yKCdTd2VldEFsZXJ0MiByZXF1aXJlcyBkb2N1bWVudCB0byBpbml0aWFsaXplJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIGNvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIGNvbnRhaW5lci5jbGFzc05hbWUgPSBzd2FsQ2xhc3Nlcy5jb250YWluZXI7XG5cbiAgICBpZiAob2xkQ29udGFpbmVyRXhpc3RlZCkge1xuICAgICAgYWRkQ2xhc3MoY29udGFpbmVyLCBzd2FsQ2xhc3Nlc1snbm8tdHJhbnNpdGlvbiddKTtcbiAgICB9XG5cbiAgICBzZXRJbm5lckh0bWwoY29udGFpbmVyLCBzd2VldEhUTUwpO1xuICAgIHZhciB0YXJnZXRFbGVtZW50ID0gZ2V0VGFyZ2V0KHBhcmFtcy50YXJnZXQpO1xuICAgIHRhcmdldEVsZW1lbnQuYXBwZW5kQ2hpbGQoY29udGFpbmVyKTtcbiAgICBzZXR1cEFjY2Vzc2liaWxpdHkocGFyYW1zKTtcbiAgICBzZXR1cFJUTCh0YXJnZXRFbGVtZW50KTtcbiAgICBhZGRJbnB1dENoYW5nZUxpc3RlbmVycygpO1xuICB9O1xuXG4gIHZhciBwYXJzZUh0bWxUb0NvbnRhaW5lciA9IGZ1bmN0aW9uIHBhcnNlSHRtbFRvQ29udGFpbmVyKHBhcmFtLCB0YXJnZXQpIHtcbiAgICAvLyBET00gZWxlbWVudFxuICAgIGlmIChwYXJhbSBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KSB7XG4gICAgICB0YXJnZXQuYXBwZW5kQ2hpbGQocGFyYW0pOyAvLyBPYmplY3RcbiAgICB9IGVsc2UgaWYgKF90eXBlb2YocGFyYW0pID09PSAnb2JqZWN0Jykge1xuICAgICAgaGFuZGxlT2JqZWN0KHBhcmFtLCB0YXJnZXQpOyAvLyBQbGFpbiBzdHJpbmdcbiAgICB9IGVsc2UgaWYgKHBhcmFtKSB7XG4gICAgICBzZXRJbm5lckh0bWwodGFyZ2V0LCBwYXJhbSk7XG4gICAgfVxuICB9O1xuXG4gIHZhciBoYW5kbGVPYmplY3QgPSBmdW5jdGlvbiBoYW5kbGVPYmplY3QocGFyYW0sIHRhcmdldCkge1xuICAgIC8vIEpRdWVyeSBlbGVtZW50KHMpXG4gICAgaWYgKHBhcmFtLmpxdWVyeSkge1xuICAgICAgaGFuZGxlSnF1ZXJ5RWxlbSh0YXJnZXQsIHBhcmFtKTsgLy8gRm9yIG90aGVyIG9iamVjdHMgdXNlIHRoZWlyIHN0cmluZyByZXByZXNlbnRhdGlvblxuICAgI
8443H0gZWxzZSB7XG4gICAgICBzZXRJbm5lckh0bWwodGFyZ2V0LCBwYXJhbS50b1N0cmluZygpKTtcbiAgICB9XG4gIH07XG5cbiAgdmFyIGhhbmRsZUpxdWVyeUVsZW0gPSBmdW5jdGlvbiBoYW5kbGVKcXVlcnlFbGVtKHRhcmdldCwgZWxlbSkge1xuICAgIHRhcmdldC50ZXh0Q29udGVudCA9ICcnO1xuXG4gICAgaWYgKDAgaW4gZWxlbSkge1xuICAgICAgZm9yICh2YXIgaSA9IDA7IChpIGluIGVsZW0pOyBpKyspIHtcbiAgICAgICAgdGFyZ2V0LmFwcGVuZENoaWxkKGVsZW1baV0uY2xvbmVOb2RlKHRydWUpKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGFyZ2V0LmFwcGVuZENoaWxkKGVsZW0uY2xvbmVOb2RlKHRydWUpKTtcbiAgICB9XG4gIH07XG5cbiAgdmFyIGFuaW1hdGlvbkVuZEV2ZW50ID0gZnVuY3Rpb24gKCkge1xuICAgIC8vIFByZXZlbnQgcnVuIGluIE5vZGUgZW52XG5cbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgICBpZiAoaXNOb2RlRW52KCkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICB2YXIgdGVzdEVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgdmFyIHRyYW5zRW5kRXZlbnROYW1lcyA9IHtcbiAgICAgIFdlYmtpdEFuaW1hdGlvbjogJ3dlYmtpdEFuaW1hdGlvbkVuZCcsXG4gICAgICBPQW5pbWF0aW9uOiAnb0FuaW1hdGlvbkVuZCBvYW5pbWF0aW9uZW5kJyxcbiAgICAgIGFuaW1hdGlvbjogJ2FuaW1hdGlvbmVuZCdcbiAgICB9O1xuXG4gICAgZm9yICh2YXIgaSBpbiB0cmFuc0VuZEV2ZW50TmFtZXMpIHtcbiAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodHJhbnNFbmRFdmVudE5hbWVzLCBpKSAmJiB0eXBlb2YgdGVzdEVsLnN0eWxlW2ldICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICByZXR1cm4gdHJhbnNFbmRFdmVudE5hbWVzW2ldO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfSgpO1xuXG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9ibG9iL21hc3Rlci9qcy9zcmMvbW9kYWwuanNcblxuICB2YXIgbWVhc3VyZVNjcm9sbGJhciA9IGZ1bmN0aW9uIG1lYXN1cmVTY3JvbGxiYXIoKSB7XG4gICAgdmFyIHNjcm9sbERpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIHNjcm9sbERpdi5jbGFzc05hbWUgPSBzd2FsQ2xhc3Nlc1snc2Nyb2xsYmFyLW1lYXN1cmUnXTtcbiAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHNjcm9sbERpdik7XG4gICAgdmFyIHNjcm9sbGJhcldpZHRoID0gc2Nyb2xsRGl2LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoIC0gc2Nyb2xsRGl2LmNsaWVudFdpZHRoO1xuICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoc2Nyb2xsRGl2KTtcbiAgICByZXR1cm4gc2Nyb2xsYmFyV2lkdGg7XG4gIH07XG5cbiAgdmFyIHJlbmRlckFjdGlvbnMgPSBmdW5jdGlvbiByZW5kZXJBY3Rpb25zKGluc3RhbmNlLCBwYXJhbXMpIHtcbiAgICB2YXIgYWN0aW9ucyA9IGdldEFjdGlvbnMoKTtcbiAgICB2YXIgbG9hZGVyID0gZ2V0TG9hZGVyKCk7XG4gICAgdmFyIGNvbmZpcm1CdXR0b24gPSBnZXRDb25maXJtQnV0dG9uKCk7XG4gICAgdmFyIGRlbnlCdXR0b24gPSBnZXREZW55QnV0dG9uKCk7XG4gICAgdmFyIGNhbmNlbEJ1dHRvbiA9IGdldENhbmNlbEJ1dHRvbigpOyAvLyBBY3Rpb25zIChidXR0b25zKSB3cmFwcGVyXG5cbiAgICBpZiAoIXBhcmFtcy5zaG93Q29uZmlybUJ1dHRvbiAmJiAhcGFyYW1zLnNob3dEZW55QnV0dG9uICYmICFwYXJhbXMuc2hvd0NhbmNlbEJ1dHRvbikge1xuICAgICAgaGlkZShhY3Rpb25zKTtcbiAgICB9IC8vIEN1c3RvbSBjbGFzc1xuXG5cbiAgICBhcHBseUN1c3RvbUNsYXNzKGFjdGlvbnMsIHBhcmFtcywgJ2FjdGlvbnMnKTsgLy8gUmVuZGVyIGJ1dHRvbnNcblxuICAgIHJlbmRlckJ1dHRvbihjb25maXJtQnV0dG9uLCAnY29uZmlybScsIHBhcmFtcyk7XG4gICAgcmVuZGVyQnV0dG9uKGRlbnlCdXR0b24sICdkZW55JywgcGFyYW1zKTtcbiAgICByZW5kZXJCdXR0b24oY2FuY2VsQnV0dG9uLCAnY2FuY2VsJywgcGFyYW1zKTtcbiAgICBoYW5kbGVCdXR0b25zU3R5bGluZyhjb25maXJtQnV0dG9uLCBkZW55QnV0dG9uLCBjYW5jZWxCdXR0b24sIHBhcmFtcyk7XG5cbiAgICBpZiAocGFyYW1zLnJldmVyc2VCdXR0b25zKSB7XG4gICAgICBhY3Rpb25zLmluc2VydEJlZm9yZShjYW5jZWxCdXR0b24sIGxvYWRlcik7XG4gICAgICBhY3Rpb25zLmluc2VydEJlZm9yZShkZW55QnV0dG9uLCBsb2FkZXIpO1xuICAgICAgYWN0aW9ucy5pbnNlcnRCZWZvcmUoY29uZmlybUJ1dHRvbiwgbG9hZGVyKTtcbiAgICB9IC8vIExvYWRlclxuXG5cbiAgICBzZXRJbm5lckh0bWwobG9hZGVyLCBwYXJhbXMubG9hZGVySHRtbCk7XG4gICAgYXBwbHlDdXN0b21DbGFzcyhsb2FkZXIsIHBhcmFtcywgJ2xvYWRlcicpO1xuICB9O1xuXG4gIGZ1bmN0aW9uIGhhbmRsZUJ1dHRvbnNTdHlsaW5nKGNvbmZpcm1CdXR0b24sIGRlbnlCdXR0b24sIGNhbmNlbEJ1dHRvbiwgcGFyYW1zKSB7XG4gICAgaWYgKCFwYXJhbXMuYnV0dG9uc1N0eWxpbmcpIHtcbiAgICAgIHJldHVybiByZW1vdmVDbGFzcyhbY29uZmlybUJ1dHRvbiwgZGVueUJ1dHRvbiwgY2FuY2VsQnV0dG9uXSwgc3dhbENsYXNzZXMuc3R5bGVkKTtcbiAgICB9XG5cbiAgICBhZGRDbGFzcyhbY29uZmlybUJ1dHRvbiwgZGVueUJ1dHRvbiwgY2FuY2VsQnV0dG9uXSwgc3dhbENsYXNzZXMuc3R5bGVkKTsgLy8gQnV0dG9ucyBiYWNrZ3JvdW5kIGNvbG9yc1xuXG4gICAgaWYgKHBhcmFtcy5jb25maXJtQnV0dG9uQ29sb3IpIHtcbiAgICAgIGNvbmZpcm1CdXR0b24uc3R5bGUuYmFja2dyb3VuZENvbG9yID0gcGFyYW1zLmNvbmZpcm1CdXR0b25Db2xvcjtcbiAgICB9XG5cbiAgICBpZiAocGFyYW1zLmRlbnlCdXR0b25Db2xvcikge1xuICAgICAgZGVueUJ1dHRvbi5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSBwYXJhbXMuZGVueUJ1dHRvbkNvbG9yO1xuICAgIH1cblxuICAgIGlmIChwYXJhbXMuY2FuY2VsQnV0dG9uQ29sb3IpIHtcbiAgICAgIGNhbmNlbEJ1dHRvbi5zdHlsZS5iYWNrZ3JvdW5k
8443Q29sb3IgPSBwYXJhbXMuY2FuY2VsQnV0dG9uQ29sb3I7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gcmVuZGVyQnV0dG9uKGJ1dHRvbiwgYnV0dG9uVHlwZSwgcGFyYW1zKSB7XG4gICAgdG9nZ2xlKGJ1dHRvbiwgcGFyYW1zW1wic2hvd1wiLmNvbmNhdChjYXBpdGFsaXplRmlyc3RMZXR0ZXIoYnV0dG9uVHlwZSksIFwiQnV0dG9uXCIpXSwgJ2lubGluZS1ibG9jaycpO1xuICAgIHNldElubmVySHRtbChidXR0b24sIHBhcmFtc1tcIlwiLmNvbmNhdChidXR0b25UeXBlLCBcIkJ1dHRvblRleHRcIildKTsgLy8gU2V0IGNhcHRpb24gdGV4dFxuXG4gICAgYnV0dG9uLnNldEF0dHJpYnV0ZSgnYXJpYS1sYWJlbCcsIHBhcmFtc1tcIlwiLmNvbmNhdChidXR0b25UeXBlLCBcIkJ1dHRvbkFyaWFMYWJlbFwiKV0pOyAvLyBBUklBIGxhYmVsXG4gICAgLy8gQWRkIGJ1dHRvbnMgY3VzdG9tIGNsYXNzZXNcblxuICAgIGJ1dHRvbi5jbGFzc05hbWUgPSBzd2FsQ2xhc3Nlc1tidXR0b25UeXBlXTtcbiAgICBhcHBseUN1c3RvbUNsYXNzKGJ1dHRvbiwgcGFyYW1zLCBcIlwiLmNvbmNhdChidXR0b25UeXBlLCBcIkJ1dHRvblwiKSk7XG4gICAgYWRkQ2xhc3MoYnV0dG9uLCBwYXJhbXNbXCJcIi5jb25jYXQoYnV0dG9uVHlwZSwgXCJCdXR0b25DbGFzc1wiKV0pO1xuICB9XG5cbiAgZnVuY3Rpb24gaGFuZGxlQmFja2Ryb3BQYXJhbShjb250YWluZXIsIGJhY2tkcm9wKSB7XG4gICAgaWYgKHR5cGVvZiBiYWNrZHJvcCA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGNvbnRhaW5lci5zdHlsZS5iYWNrZ3JvdW5kID0gYmFja2Ryb3A7XG4gICAgfSBlbHNlIGlmICghYmFja2Ryb3ApIHtcbiAgICAgIGFkZENsYXNzKFtkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsIGRvY3VtZW50LmJvZHldLCBzd2FsQ2xhc3Nlc1snbm8tYmFja2Ryb3AnXSk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gaGFuZGxlUG9zaXRpb25QYXJhbShjb250YWluZXIsIHBvc2l0aW9uKSB7XG4gICAgaWYgKHBvc2l0aW9uIGluIHN3YWxDbGFzc2VzKSB7XG4gICAgICBhZGRDbGFzcyhjb250YWluZXIsIHN3YWxDbGFzc2VzW3Bvc2l0aW9uXSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHdhcm4oJ1RoZSBcInBvc2l0aW9uXCIgcGFyYW1ldGVyIGlzIG5vdCB2YWxpZCwgZGVmYXVsdGluZyB0byBcImNlbnRlclwiJyk7XG4gICAgICBhZGRDbGFzcyhjb250YWluZXIsIHN3YWxDbGFzc2VzLmNlbnRlcik7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gaGFuZGxlR3Jvd1BhcmFtKGNvbnRhaW5lciwgZ3Jvdykge1xuICAgIGlmIChncm93ICYmIHR5cGVvZiBncm93ID09PSAnc3RyaW5nJykge1xuICAgICAgdmFyIGdyb3dDbGFzcyA9IFwiZ3Jvdy1cIi5jb25jYXQoZ3Jvdyk7XG5cbiAgICAgIGlmIChncm93Q2xhc3MgaW4gc3dhbENsYXNzZXMpIHtcbiAgICAgICAgYWRkQ2xhc3MoY29udGFpbmVyLCBzd2FsQ2xhc3Nlc1tncm93Q2xhc3NdKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICB2YXIgcmVuZGVyQ29udGFpbmVyID0gZnVuY3Rpb24gcmVuZGVyQ29udGFpbmVyKGluc3RhbmNlLCBwYXJhbXMpIHtcbiAgICB2YXIgY29udGFpbmVyID0gZ2V0Q29udGFpbmVyKCk7XG5cbiAgICBpZiAoIWNvbnRhaW5lcikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGhhbmRsZUJhY2tkcm9wUGFyYW0oY29udGFpbmVyLCBwYXJhbXMuYmFja2Ryb3ApO1xuXG4gICAgaWYgKCFwYXJhbXMuYmFja2Ryb3AgJiYgcGFyYW1zLmFsbG93T3V0c2lkZUNsaWNrKSB7XG4gICAgICB3YXJuKCdcImFsbG93T3V0c2lkZUNsaWNrXCIgcGFyYW1ldGVyIHJlcXVpcmVzIGBiYWNrZHJvcGAgcGFyYW1ldGVyIHRvIGJlIHNldCB0byBgdHJ1ZWAnKTtcbiAgICB9XG5cbiAgICBoYW5kbGVQb3NpdGlvblBhcmFtKGNvbnRhaW5lciwgcGFyYW1zLnBvc2l0aW9uKTtcbiAgICBoYW5kbGVHcm93UGFyYW0oY29udGFpbmVyLCBwYXJhbXMuZ3Jvdyk7IC8vIEN1c3RvbSBjbGFzc1xuXG4gICAgYXBwbHlDdXN0b21DbGFzcyhjb250YWluZXIsIHBhcmFtcywgJ2NvbnRhaW5lcicpOyAvLyBTZXQgcXVldWUgc3RlcCBhdHRyaWJ1dGUgZm9yIGdldFF1ZXVlU3RlcCgpIG1ldGhvZFxuXG4gICAgdmFyIHF1ZXVlU3RlcCA9IGRvY3VtZW50LmJvZHkuZ2V0QXR0cmlidXRlKCdkYXRhLXN3YWwyLXF1ZXVlLXN0ZXAnKTtcblxuICAgIGlmIChxdWV1ZVN0ZXApIHtcbiAgICAgIGNvbnRhaW5lci5zZXRBdHRyaWJ1dGUoJ2RhdGEtcXVldWUtc3RlcCcsIHF1ZXVlU3RlcCk7XG4gICAgICBkb2
8443N1bWVudC5ib2R5LnJlbW92ZUF0dHJpYnV0ZSgnZGF0YS1zd2FsMi1xdWV1ZS1zdGVwJyk7XG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKiBUaGlzIG1vZHVsZSBjb250YWludHMgYFdlYWtNYXBgcyBmb3IgZWFjaCBlZmZlY3RpdmVseS1cInByaXZhdGUgIHByb3BlcnR5XCIgdGhhdCBhIGBTd2FsYCBoYXMuXG4gICAqIEZvciBleGFtcGxlLCB0byBzZXQgdGhlIHByaXZhdGUgcHJvcGVydHkgXCJmb29cIiBvZiBgdGhpc2AgdG8gXCJiYXJcIiwgeW91IGNhbiBgcHJpdmF0ZVByb3BzLmZvby5zZXQodGhpcywgJ2JhcicpYFxuICAgKiBUaGlzIGlzIHRoZSBhcHByb2FjaCB0aGF0IEJhYmVsIHdpbGwgcHJvYmFibHkgdGFrZSB0byBpbXBsZW1lbnQgcHJpdmF0ZSBtZXRob2RzL2ZpZWxkc1xuICAgKiAgIGh0dHBzOi8vZ2l0aHViLmNvbS90YzM5L3Byb3Bvc2FsLXByaXZhdGUtbWV0aG9kc1xuICAgKiAgIGh0dHBzOi8vZ2l0aHViLmNvbS9iYWJlbC9iYWJlbC9wdWxsLzc1NTVcbiAgICogT25jZSB3ZSBoYXZlIHRoZSBjaGFuZ2VzIGZyb20gdGhhdCBQUiBpbiBCYWJlbCwgYW5kIG91ciBjb3JlIGNsYXNzIGZpdHMgcmVhc29uYWJsZSBpbiAqb25lIG1vZHVsZSpcbiAgICogICB0aGVuIHdlIGNhbiB1c2UgdGhhdCBsYW5ndWFnZSBmZWF0dXJlLlxuICAgKi9cbiAgdmFyIHByaXZhdGVQcm9wcyA9IHtcbiAgICBwcm9taXNlOiBuZXcgV2Vha01hcCgpLFxuICAgIGlubmVyUGFyYW1zOiBuZXcgV2Vha01hcCgpLFxuICAgIGRvbUNhY2hlOiBuZXcgV2Vha01hcCgpXG4gIH07XG5cbiAgdmFyIGlucHV0VHlwZXMgPSBbJ2lucHV0JywgJ2ZpbGUnLCAncmFuZ2UnLCAnc2VsZWN0JywgJ3JhZGlvJywgJ2NoZWNrYm94JywgJ3RleHRhcmVhJ107XG4gIHZhciByZW5kZXJJbnB1dCA9IGZ1bmN0aW9uIHJlbmRlcklucHV0KGluc3RhbmNlLCBwYXJhbXMpIHtcbiAgICB2YXIgY29udGVudCA9IGdldENvbnRlbnQoKTtcbiAgICB2YXIgaW5uZXJQYXJhbXMgPSBwcml2YXRlUHJvcHMuaW5uZXJQYXJhbXMuZ2V0KGluc3RhbmNlKTtcbiAgICB2YXIgcmVyZW5kZXIgPSAhaW5uZXJQYXJhbXMgfHwgcGFyYW1zLmlucHV0ICE9PSBpbm5lclBhcmFtcy5pbnB1dDtcbiAgICBpbnB1dFR5cGVzLmZvckVhY2goZnVuY3Rpb24gKGlucHV0VHlwZSkge1xuICAgICAgdmFyIGlucHV0Q2xhc3MgPSBzd2FsQ2xhc3Nlc1tpbnB1dFR5cGVdO1xuICAgICAgdmFyIGlucHV0Q29udGFpbmVyID0gZ2V0Q2hpbGRCeUNsYXNzKGNvbnRlbnQsIGlucHV0Q2xhc3MpOyAvLyBzZXQgYXR0cmlidXRlc1xuXG4gICAgICBzZXRBdHRyaWJ1dGVzKGlucHV0VHlwZSwgcGFyYW1zLmlucHV0QXR0cmlidXRlcyk7IC8vIHNldCBjbGFzc1xuXG4gICAgICBpbnB1dENvbnRhaW5lci5jbGFzc05hbWUgPSBpbnB1dENsYXNzO1xuXG4gICAgICBpZiAocmVyZW5kZXIpIHtcbiAgICAgICAgaGlkZShpbnB1dENvbnRhaW5lcik7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBpZiAocGFyYW1zLmlucHV0KSB7XG4gICAgICBpZiAocmVyZW5kZXIpIHtcbiAgICAgICAgc2hvd0lucHV0KHBhcmFtcyk7XG4gICAgICB9IC8vIHNldCBjdXN0b20gY2xhc3NcblxuXG4gICAgICBzZXRDdXN0b21DbGFzcyhwYXJhbXMpO1xuICAgIH1cbiAgfTtcblxuICB2YXIgc2hvd0lucHV0ID0gZnVuY3Rpb24gc2hvd0lucHV0KHBhcmFtcykge1xuICAgIGlmICghcmVuZGVySW5wdXRUeXBlW3BhcmFtcy5pbnB1dF0pIHtcbiAgICAgIHJldHVybiBlcnJvcihcIlVuZXhwZWN0ZWQgdHlwZSBvZiBpbnB1dCEgRXhwZWN0ZWQgXFxcInRleHRcXFwiLCBcXFwiZW1haWxcXFwiLCBcXFwicGFzc3dvcmRcXFwiLCBcXFwibnVtYmVyXFxcIiwgXFxcInRlbFxcXCIsIFxcXCJzZWxlY3RcXFwiLCBcXFwicmFkaW9cXFwiLCBcXFwiY2hlY2tib3hcXFwiLCBcXFwidGV4dGFyZWFcXFwiLCBcXFwiZmlsZVxcXCIgb3IgXFxcInVybFxcXCIsIGdvdCBcXFwiXCIuY29uY2F0KHBhcmFtcy5pbnB1dCwgXCJcXFwiXCIpKTtcbiAgICB9XG5cbiAgICB2YXIgaW5wdXRDb250YWluZXIgPSBnZXRJbnB1dENvbnRhaW5lcihwYXJhbXMuaW5wdXQpO1xuICAgIHZhciBpbnB1dCA9IHJlbmRlcklucHV0VHlwZVtwYXJhbXMuaW5wdXRdKGlucHV0Q29udGFpbmVyLCBwYXJhbXMpO1xuICAgIHNob3coaW5wdXQpOyAvLyBpbnB1dCBhdXRvZm9jdXNcblxuICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgZm9jdXNJbnB1dChpbnB1dCk7XG4gICAgfSk7XG4gIH07XG5cbiAgdmFyIHJlbW92ZUF0dHJpYnV0ZXMgPSBmdW5jdGlvbiByZW1vdmVBdHRyaWJ1dGVzKGlucHV0KSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBpbnB1dC5hdHRyaWJ1dGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2Y
8443XIgYXR0ck5hbWUgPSBpbnB1dC5hdHRyaWJ1dGVzW2ldLm5hbWU7XG5cbiAgICAgIGlmICghKFsndHlwZScsICd2YWx1ZScsICdzdHlsZSddLmluZGV4T2YoYXR0ck5hbWUpICE9PSAtMSkpIHtcbiAgICAgICAgaW5wdXQucmVtb3ZlQXR0cmlidXRlKGF0dHJOYW1lKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgdmFyIHNldEF0dHJpYnV0ZXMgPSBmdW5jdGlvbiBzZXRBdHRyaWJ1dGVzKGlucHV0VHlwZSwgaW5wdXRBdHRyaWJ1dGVzKSB7XG4gICAgdmFyIGlucHV0ID0gZ2V0SW5wdXQoZ2V0Q29udGVudCgpLCBpbnB1dFR5cGUpO1xuXG4gICAgaWYgKCFpbnB1dCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHJlbW92ZUF0dHJpYnV0ZXMoaW5wdXQpO1xuXG4gICAgZm9yICh2YXIgYXR0ciBpbiBpbnB1dEF0dHJpYnV0ZXMpIHtcbiAgICAgIC8vIERvIG5vdCBzZXQgYSBwbGFjZWhvbGRlciBmb3IgPGlucHV0IHR5cGU9XCJyYW5nZVwiPlxuICAgICAgLy8gaXQnbGwgY3Jhc2ggRWRnZSwgIzEyOThcbiAgICAgIGlmIChpbnB1dFR5cGUgPT09ICdyYW5nZScgJiYgYXR0ciA9PT0gJ3BsYWNlaG9sZGVyJykge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaW5wdXQuc2V0QXR0cmlidXRlKGF0dHIsIGlucHV0QXR0cmlidXRlc1thdHRyXSk7XG4gICAgfVxuICB9O1xuXG4gIHZhciBzZXRDdXN0b21DbGFzcyA9IGZ1bmN0aW9uIHNldEN1c3RvbUNsYXNzKHBhcmFtcykge1xuICAgIHZhciBpbnB1dENvbnRhaW5lciA9IGdldElucHV0Q29udGFpbmVyKHBhcmFtcy5pbnB1dCk7XG5cbiAgICBpZiAocGFyYW1zLmN1c3RvbUNsYXNzKSB7XG4gICAgICBhZGRDbGFzcyhpbnB1dENvbnRhaW5lciwgcGFyYW1zLmN1c3RvbUNsYXNzLmlucHV0KTtcbiAgICB9XG4gIH07XG5cbiAgdmFyIHNldElucHV0UGxhY2Vob2xkZXIgPSBmdW5jdGlvbiBzZXRJbnB1dFBsYWNlaG9sZGVyKGlucHV0LCBwYXJhbXMpIHtcbiAgICBpZiAoIWlucHV0LnBsYWNlaG9sZGVyIHx8IHBhcmFtcy5pbnB1dFBsYWNlaG9sZGVyKSB7XG4gICAgICBpbnB1dC5wbGFjZWhvbGRlciA9IHBhcmFtcy5pbnB1dFBsYWNlaG9sZGVyO1xuICAgIH1cbiAgfTtcblxuICB2YXIgc2V0SW5wdXRMYWJlbCA9IGZ1bmN0aW9uIHNldElucHV0TGFiZWwoaW5wdXQsIHByZXBlbmRUbywgcGFyYW1zKSB7XG4gICAgaWYgKHBhcmFtcy5pbnB1dExhYmVsKSB7XG4gICAgICBpbnB1dC5pZCA9IHN3YWxDbGFzc2VzLmlucHV0O1xuICAgICAgdmFyIGxhYmVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnbGFiZWwnKTtcbiAgICAgIHZhciBsYWJlbENsYXNzID0gc3dhbENsYXNzZXNbJ2lucHV0LWxhYmVsJ107XG4gICAgICBsYWJlbC5zZXRBdHRyaWJ1dGUoJ2ZvcicsIGlucHV0LmlkKTtcbiAgICAgIGxhYmVsLmNsYXNzTmFtZSA9IGxhYmVsQ2xhc3M7XG4gICAgICBhZGRDbGFzcyhsYWJlbCwgcGFyYW1zLmN1c3RvbUNsYXNzLmlucHV0TGFiZWwpO1xuICAgICAgbGFiZWwuaW5uZXJUZXh0ID0gcGFyYW1zLmlucHV0TGFiZWw7XG4gICAgICBwcmVwZW5kVG8uaW5zZXJ0QWRqYWNlbnRFbGVtZW50KCdiZWZvcmViZWdpbicsIGxhYmVsKTtcbiAgICB9XG4gIH07XG5cbiAgdmFyIGdldElucHV0Q29udGFpbmVyID0gZnVuY3Rpb24gZ2V0SW5wdXRDb250YWluZXIoaW5wdXRUeXBlKSB7XG4gICAgdmFyIGlucHV0Q2xhc3MgPSBzd2FsQ2xhc3Nlc1tpbnB1dFR5cGVdID8gc3dhbENsYXNzZXNbaW5wdXRUeXBlXSA6IHN3YWxDbGFzc2VzLmlucHV0O1xuICAgIHJldHVybiBnZXRDaGlsZEJ5Q2xhc3MoZ2V0Q29udGVudCgpLCBpbnB1dENsYXNzKTtcbiAgfTtcblxuICB2YXIgcmVuZGVySW5wdXRUeXBlID0ge307XG5cbiAgcmVuZGVySW5wdXRUeXBlLnRleHQgPSByZW5kZXJJbnB1dFR5cGUuZW1haWwgPSByZW5kZXJJbnB1dFR5cGUucGFzc3dvcmQgPSByZW5kZXJJbnB1dFR5cGUubnVtYmVyID0gcmVuZGVySW5wdXRUeXBlLnRlbCA9IHJlbmRlcklucHV0VHlwZS51cmwgPSBmdW5jdGlvbiAoaW5wdXQsIHBhcmFtcykge1xuICAgIGlmICh0eXBlb2YgcGFyYW1zLmlucHV0VmFsdWUgPT09ICdzdHJpbmcnIHx8IHR5cGVvZiBwYXJhbXMuaW5wdXRWYWx1ZSA9PT0gJ251bWJlcicpIHtcbiAgICAgIGlucHV0LnZhbHVlID0gcGFyYW1zLmlucHV0VmFsdWU7XG4gICAgfSBlbHNlIGlmICghaXNQcm9taXNlKHBhcmFtcy5pbnB1dFZhbHVlKSkge1xuICAgICAgd2FybihcIlVuZXhwZWN0ZWQgdHlwZSBvZiBpbnB1dFZhbHVlISBFeHBlY3RlZCBcXFwic3RyaW5nXFxcIiwgXFxcIm51bWJlclxcXCIgb3IgXFxcIlByb21pc2VcXFwiLCBnb3QgXFxcIlwiLmNvbmNhdChfdHlwZW9mKHBhcmFtcy5pbnB1dFZhbHVlKSwgXCJcXFwiXCIpKTtcbiAgICB9XG5cbiAgICBzZXRJbnB1dExhYmVsKGlucHV0LCBpbnB1dCwgcGFyYW1zKTtcbiAgICBzZXRJbnB1dFBsYWNlaG9sZGVyKGlucHV0LCBwYXJhbXMpO1xuICAgIGlucHV0LnR5cGUgPSBwYXJhbXMuaW5wdXQ7XG4gICAgcmV0dXJuIGlucHV0O1xuICB9O1xuXG4gIHJlbmRlcklucHV0VHlwZS5maWxlID0gZnVuY3Rpb24gKGlucHV0LCBwYXJhbXMpIHtcbiAgICBzZXRJbnB1dExhYmVsKGlucHV0LCBpbnB1dCwgcGFyYW1zKTtcbiAgICBzZXRJbnB1dFBsYWNlaG9sZGVyKGlucHV0LCBwYXJhbXMpO1xuICAgIHJldHVybiBpbnB1dDtcbiAgfTtcblxuICByZW5kZXJJbnB1dFR5cGUucmFuZ2UgPSBmdW5jdGlvbiAocmFuZ2UsIHBhcmFtcykge1xuICAgIHZhciByYW5nZUlucHV0ID0gcmFuZ2UucXVlcnlTZWxlY3RvcignaW5wdXQnKTtcbiAgICB2YXIgcmFuZ2VPdXRwdXQgPSByYW5nZS5xdWVyeVNlbGVjdG9yKCdvdXRwdXQnKTtcbiAgICByYW5nZUlucHV0LnZhbHVlID0gcGFyYW1zLmlucHV0VmFsdWU7XG4gICAgcmFuZ2VJbnB1dC50eXBlID0gcGFyYW1zLmlucHV0O1xuICAgIHJhbmdlT3V0cHV0LnZhbHVlID0gcGFyYW1zLmlucHV0VmFsdWU7XG4gICAgc2V0SW5wdXRMYWJlbChyYW5nZUlucHV0LCByYW5nZSwgcGFyYW1zKTtcbiAgICByZXR1cm4gcmFuZ2U7XG4gIH07XG5cbiAgcmVuZGVySW5wdXRUeXBlLnNlbGVjdCA9IGZ1bmN0aW9uIChzZWxlY3QsIHBhcmFtcykge1xuICAgIHNlbGVjdC50
8443ZXh0Q29udGVudCA9ICcnO1xuXG4gICAgaWYgKHBhcmFtcy5pbnB1dFBsYWNlaG9sZGVyKSB7XG4gICAgICB2YXIgcGxhY2Vob2xkZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdvcHRpb24nKTtcbiAgICAgIHNldElubmVySHRtbChwbGFjZWhvbGRlciwgcGFyYW1zLmlucHV0UGxhY2Vob2xkZXIpO1xuICAgICAgcGxhY2Vob2xkZXIudmFsdWUgPSAnJztcbiAgICAgIHBsYWNlaG9sZGVyLmRpc2FibGVkID0gdHJ1ZTtcbiAgICAgIHBsYWNlaG9sZGVyLnNlbGVjdGVkID0gdHJ1ZTtcbiAgICAgIHNlbGVjdC5hcHBlbmRDaGlsZChwbGFjZWhvbGRlcik7XG4gICAgfVxuXG4gICAgc2V0SW5wdXRMYWJlbChzZWxlY3QsIHNlbGVjdCwgcGFyYW1zKTtcbiAgICByZXR1cm4gc2VsZWN0O1xuICB9O1xuXG4gIHJlbmRlcklucHV0VHlwZS5yYWRpbyA9IGZ1bmN0aW9uIChyYWRpbykge1xuICAgIHJhZGlvLnRleHRDb250ZW50ID0gJyc7XG4gICAgcmV0dXJuIHJhZGlvO1xuICB9O1xuXG4gIHJlbmRlcklucHV0VHlwZS5jaGVja2JveCA9IGZ1bmN0aW9uIChjaGVja2JveENvbnRhaW5lciwgcGFyYW1zKSB7XG4gICAgdmFyIGNoZWNrYm94ID0gZ2V0SW5wdXQoZ2V0Q29udGVudCgpLCAnY2hlY2tib3gnKTtcbiAgICBjaGVja2JveC52YWx1ZSA9IDE7XG4gICAgY2hlY2tib3guaWQgPSBzd2FsQ2xhc3Nlcy5jaGVja2JveDtcbiAgICBjaGVja2JveC5jaGVja2VkID0gQm9vbGVhbihwYXJhbXMuaW5wdXRWYWx1ZSk7XG4gICAgdmFyIGxhYmVsID0gY2hlY2tib3hDb250YWluZXIucXVlcnlTZWxlY3Rvcignc3BhbicpO1xuICAgIHNldElubmVySHRtbChsYWJlbCwgcGFyYW1zLmlucHV0UGxhY2Vob2xkZXIpO1xuICAgIHJldHVybiBjaGVja2JveENvbnRhaW5lcjtcbiAgfTtcblxuICByZW5kZXJJbnB1dFR5cGUudGV4dGFyZWEgPSBmdW5jdGlvbiAodGV4dGFyZWEsIHBhcmFtcykge1xuICAgIHRleHRhcmVhLnZhbHVlID0gcGFyYW1zLmlucHV0VmFsdWU7XG4gICAgc2V0SW5wdXRQbGFjZWhvbGRlcih0ZXh0YXJlYSwgcGFyYW1zKTtcbiAgICBzZXRJbnB1dExhYmVsKHRleHRhcmVhLCB0ZXh0YXJlYSwgcGFyYW1zKTtcblxuICAgIHZhciBnZXRQYWRkaW5nID0gZnVuY3Rpb24gZ2V0UGFkZGluZyhlbCkge1xuICAgICAgcmV0dXJuIHBhcnNlSW50KHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGVsKS5wYWRkaW5nTGVmdCkgKyBwYXJzZUludCh3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShlbCkucGFkZGluZ1JpZ2h0KTtcbiAgICB9O1xuXG4gICAgaWYgKCdNdXRhdGlvbk9ic2VydmVyJyBpbiB3aW5kb3cpIHtcbiAgICAgIC8vICMxNjk5XG4gICAgICB2Y
8443XIgaW5pdGlhbFBvcHVwV2lkdGggPSBwYXJzZUludCh3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShnZXRQb3B1cCgpKS53aWR0aCk7XG5cbiAgICAgIHZhciBvdXRwdXRzaXplID0gZnVuY3Rpb24gb3V0cHV0c2l6ZSgpIHtcbiAgICAgICAgdmFyIGNvbnRlbnRXaWR0aCA9IHRleHRhcmVhLm9mZnNldFdpZHRoICsgZ2V0UGFkZGluZyhnZXRQb3B1cCgpKSArIGdldFBhZGRpbmcoZ2V0Q29udGVudCgpKTtcblxuICAgICAgICBpZiAoY29udGVudFdpZHRoID4gaW5pdGlhbFBvcHVwV2lkdGgpIHtcbiAgICAgICAgICBnZXRQb3B1cCgpLnN0eWxlLndpZHRoID0gXCJcIi5jb25jYXQoY29udGVudFdpZHRoLCBcInB4XCIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGdldFBvcHVwKCkuc3R5bGUud2lkdGggPSBudWxsO1xuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICBuZXcgTXV0YXRpb25PYnNlcnZlcihvdXRwdXRzaXplKS5vYnNlcnZlKHRleHRhcmVhLCB7XG4gICAgICAgIGF0dHJpYnV0ZXM6IHRydWUsXG4gICAgICAgIGF0dHJpYnV0ZUZpbHRlcjogWydzdHlsZSddXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGV4dGFyZWE7XG4gIH07XG5cbiAgdmFyIHJlbmRlckNvbnRlbnQgPSBmdW5jdGlvbiByZW5kZXJDb250ZW50KGluc3RhbmNlLCBwYXJhbXMpIHtcbiAgICB2YXIgY29udGVudCA9IGdldENvbnRlbnQoKS5xdWVyeVNlbGVjdG9yKFwiI1wiLmNvbmNhdChzd2FsQ2xhc3Nlcy5jb250ZW50KSk7IC8vIENvbnRlbnQgYXMgSFRNTFxuXG4gICAgaWYgKHBhcmFtcy5odG1sKSB7XG4gICAgICBwYXJzZUh0bWxUb0NvbnRhaW5lcihwYXJhbXMuaHRtbCwgY29udGVudCk7XG4gICAgICBzaG93KGNvbnRlbnQsICdibG9jaycpOyAvLyBDb250ZW50IGFzIHBsYWluIHRleHRcbiAgICB9IGVsc2UgaWYgKHBhcmFtcy50ZXh0KSB7XG4gICAgICBjb250ZW50LnRleHRDb250ZW50ID0gcGFyYW1zLnRleHQ7XG4gICAgICBzaG93KGNvbnRlbnQsICdibG9jaycpOyAvLyBObyBjb250ZW50XG4gICAgfSBlbHNlIHtcbiAgICAgIGhpZGUoY29udGVudCk7XG4gICAgfVxuXG4gICAgcmVuZGVySW5wdXQoaW5zdGFuY2UsIHBhcmFtcyk7IC8vIEN1c3RvbSBjbGFzc1xuXG4gICAgYXBwbHlDdXN0b21DbGFzcyhnZXRDb250ZW50KCksIHBhcmFtcywgJ2NvbnRlbnQnKTtcbiAgfTtcblxuICB2YXIgcmVuZGVyRm9vdGVyID0gZnVuY3Rpb24gcmVuZGVyRm9vdGVyKGluc3RhbmNlLCBwYXJhbXMpIHtcbiAgICB2YXIgZm9vdGVyID0gZ2V0Rm9vdGVyKCk7XG4gICAgdG9nZ2xlKGZvb3RlciwgcGFyYW1zLmZvb3Rlcik7XG5cbiAgICBpZiAocGFyYW1zLmZvb3Rlcikge1xuICAgICAgcGFyc2VIdG1sVG9Db250YWluZXIocGFyYW1zLmZvb3RlciwgZm9vdGVyKTtcbiAgICB9IC8vIEN1c3RvbSBjbGFzc1xuXG5cbiAgICBhcHBseUN1c3RvbUNsYXNzKGZvb3RlciwgcGFyYW1zLCAnZm9vdGVyJyk7XG4gIH07XG5cbiAgdmFyIHJlbmRlckNsb3NlQnV0dG9uID0gZnVuY3Rpb24gcmVuZGVyQ2xvc2VCdXR0b24oaW5zdGFuY2UsIHBhcmFtcykge1xuICAgIHZhciBjbG9zZUJ1dHRvbiA9IGdldENsb3NlQnV0dG9uKCk7XG4gICAgc2V0SW5uZXJIdG1sKGNsb3NlQnV0dG9uLCBwYXJhbXMuY2xvc2VCdXR0b25IdG1sKTsgLy8gQ3VzdG9tIGNsYXNzXG5cbiAgICBhcHBseUN1c3RvbUNsYXNzKGNsb3NlQnV0dG9uLCBwYXJhbXMsICdjbG9zZUJ1dHRvbicpO1xuICAgIHRvZ2dsZShjbG9zZUJ1dHRvbiwgcGFyYW1zLnNob3dDbG9zZUJ1dHRvbik7XG4gICAgY2xvc2VCdXR0b24uc2V0QXR0cmlidXRlKCdhcmlhLWxhYmVsJywgcGFyYW1zLmNsb3NlQnV0dG9uQXJpYUxhYmVsKTtcbiAgfTtcblxuICB2YXIgcmVuZGVySWNvbiA9IGZ1bmN0aW9uIHJlbmRlckljb24oaW5zdGFuY2UsIHBhcmFtcykge1xuICAgIHZhciBpbm5lclBhcmFtcyA9IHByaXZhdGVQcm9wcy5pbm5lclBhcmFtcy5nZXQoaW5zdGFuY2UpOyAvLyBpZiB0aGUgZ2l2ZW4gaWNvbiBhbHJlYWR5IHJlbmRlcmVkLCBhcHBseSB0aGUgc3R5bGluZyB3aXRob3V0IHJlLXJlbmRlcmluZyB0aGUgaWNvblxuXG4gICAgaWYgKGlubmVyUGFyYW1zICYmIHBhcmFtcy5pY29uID09PSBpbm5lclBhcmFtcy5pY29uICYmIGdldEljb24oKSkge1xuICAgICAgYXBwbHlTdHlsZXMoZ2V0SWNvbigpLCBwYXJhbXMpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGhpZGVBbGxJY29ucygpO1xuXG4gICAgaWYgKCFwYXJhbXMuaWNvbikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChPYmplY3Qua2V5cyhpY29uVHlwZXMpLmluZGV4T2YocGFyYW1zLmljb24pICE9PSAtMSkge1xuICAgICAgdmFyIGljb24gPSBlbGVtZW50QnlTZWxlY3RvcihcIi5cIi5jb25jYXQoc3dhbENsYXNzZXMuaWNvbiwgXCIuXCIpLmNvbmNhdChpY29uVHlwZXNbcGFyYW1zLmljb25dKSk7XG4gICAgICBzaG93KGljb24pOyAvLyBDdXN0b20gb3IgZGVmYXVsdCBjb250ZW50XG5cbiAgICAgIHNldENvbnRlbnQoaWNvbiwgcGFyYW1zKTtcbiAgICAgIGFwcGx5U3R5bGVzKGljb24sIHBhcmFtcyk7IC8vIEFuaW1hdGUgaWNvblxuXG4gICAgICBhZGRDbGFzcyhpY29uLCBwYXJhbXMuc2hvd0NsYXNzLmljb24pO1xuICAgIH0gZWxzZSB7XG4gICAgICBlcnJvcihcIlVua25vd24gaWNvbiEgRXhwZWN0ZWQgXFxcInN1Y2Nlc3NcXFwiLCBcXFwiZXJyb3JcXFwiLCBcXFwid2FybmluZ1xcXCIsIFxcXCJpbmZvXFxcIiBvciBcXFwicXVlc3Rpb25cXFwiLCBnb3QgXFxcIlwiLmNvbmNhdChwYXJhbXMuaWNvbiwgXCJcXFwiXCIpKTtcbiAgICB9XG4gIH07XG5cbiAgdmFyIGhpZGVBbGxJY29ucyA9IGZ1bmN0aW9uIGhpZGVBbGxJY29ucygpIHtcbiAgICB2YXIgaWNvbnMgPSBnZXRJY29ucygpO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBpY29ucy5sZW5ndGg7IGkrKykge1xuICAgICAgaGlkZShpY29uc1tpXSk7XG4gICAgfVxuICB9O1xuXG4gIHZhciBhcHBseVN0eWxlcyA9IGZ1bmN0aW9uIGFwcGx5U3R5bGVzKGljb24sIHBhcmFtcykge1xuICAgIC8vIEljb24gY29sb3JcbiAgICBzZXRDb2xvcihpY29uLCBwYXJhbXMpOyAvLyBTdWNjZXNzIGljb24gYmFja2dyb3VuZCBjb2xvclxuXG4gICAgYWRqdXN0U3VjY2Vzc0ljb25CYWNrZ291bmRDb2xvcigpOyAvLyBDdXN0b20gY2xhc3NcblxuICAgIGFwcGx5Q3VzdG9tQ2xhc3MoaWNvbiwgcGFyYW1zLCAnaWNvbicpO1xuICB9OyAvLyBBZGp1c3Qgc3VjY2VzcyBpY29uIGJhY2tncm91bmQgY29sb3IgdG8gbWF0Y2ggdGhlIHBvcHVwIGJhY2tncm91bmQgY29sb3JcblxuXG4gI
8443HZhciBhZGp1c3RTdWNjZXNzSWNvbkJhY2tnb3VuZENvbG9yID0gZnVuY3Rpb24gYWRqdXN0U3VjY2Vzc0ljb25CYWNrZ291bmRDb2xvcigpIHtcbiAgICB2YXIgcG9wdXAgPSBnZXRQb3B1cCgpO1xuICAgIHZhciBwb3B1cEJhY2tncm91bmRDb2xvciA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHBvcHVwKS5nZXRQcm9wZXJ0eVZhbHVlKCdiYWNrZ3JvdW5kLWNvbG9yJyk7XG4gICAgdmFyIHN1Y2Nlc3NJY29uUGFydHMgPSBwb3B1cC5xdWVyeVNlbGVjdG9yQWxsKCdbY2xhc3NePXN3YWwyLXN1Y2Nlc3MtY2lyY3VsYXItbGluZV0sIC5zd2FsMi1zdWNjZXNzLWZpeCcpO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdWNjZXNzSWNvblBhcnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBzdWNjZXNzSWNvblBhcnRzW2ldLnN0eWxlLmJhY2tncm91bmRDb2xvciA9IHBvcHVwQmFja2dyb3VuZENvbG9yO1xuICAgIH1cbiAgfTtcblxuICB2YXIgc2V0Q29udGVudCA9IGZ1bmN0aW9uIHNldENvbnRlbnQoaWNvbiwgcGFyYW1zKSB7XG4gICAgaWNvbi50ZXh0Q29udGVudCA9ICcnO1xuXG4gICAgaWYgKHBhcmFtcy5pY29uSHRtbCkge1xuICAgICAgc2V0SW5uZXJIdG1sKGljb24sIGljb25Db250ZW50KHBhcmFtcy5pY29uSHRtbCkpO1xuICAgIH0gZWxzZSBpZiAocGFyYW1zLmljb24gPT09ICdzdWNjZXNzJykge1xuICAgICAgc2V0SW5uZXJIdG1sKGljb24sIFwiXFxuICAgICAgPGRpdiBjbGFzcz1cXFwic3dhbDItc3VjY2Vzcy1jaXJjdWxhci1saW5lLWxlZnRcXFwiPjwvZGl2PlxcbiAgICAgIDxzcGFuIGNsYXNzPVxcXCJzd2FsMi1zdWNjZXNzLWxpbmUtdGlwXFxcIj48L3NwYW4+IDxzcGFuIGNsYXNzPVxcXCJzd2FsMi1zdWNjZXNzLWxpbmUtbG9uZ1xcXCI+PC9zcGFuPlxcbiAgICAgIDxkaXYgY2xhc3M9XFxcInN3YWwyLXN1Y2Nlc3MtcmluZ1xcXCI+PC9kaXY+IDxkaXYgY2xhc3M9XFxcInN3YWwyLXN1Y2Nlc3MtZml4XFxcIj48L2Rpdj5cXG4gICAgICA8ZGl2IGNsYXNzPVxcXCJzd2FsMi1zdWNjZXNzLWNpcmN1bGFyLWxpbmUtcmlnaHRcXFwiPjwvZGl2PlxcbiAgICBcIik7XG4gICAgfSBlbHNlIGlmIChwYXJhbXMuaWNvbiA9PT0gJ2Vycm9yJykge1xuICAgICAgc2V0SW5uZXJIdG1sKGljb24sIFwiXFxuICAgICAgPHNwYW4gY2xhc3M9XFxcInN3YWwyLXgtbWFya1xcXCI+XFxuICAgICAgICA8c3BhbiBjbGFzcz1cXFwic3dhbDIteC1tYXJrLWxpbmUtbGVmdFxcXCI+PC9zcGFuPlxcbiAgICAgICAgPHNwYW4gY2xhc3M9XFxcInN3YWwyLXgtbWFyay1saW5lLXJpZ2h0XFxcIj48L3NwYW4+XFxuICAgICAgPC9zcGFuPlxcbiAgICBcIik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBkZWZhdWx0SWNvbkh0bWwgPSB7XG4gICAgICAgIHF1ZXN0aW9uOiAnPycsXG4gICAgICAgIHdhcm5pbmc6ICchJyxcbiAgICAgICAgaW5mbzogJ2knXG4gICAgICB9O1xuICAgICAgc2V0SW5uZXJIdG1sKGljb24sIGljb25Db250ZW50KGRlZmF1bHRJY29uSHRtbFtwYXJhbXMuaWNvbl0pKTtcbiAgICB9XG4gIH07XG5cbiAgdmFyIHNldENvbG9yID0gZnVuY3Rpb24gc2V0Q29sb3IoaWNvbiwgcGFyYW1zKSB7XG4gICAgaWYgKCFwYXJhbXMuaWNvbkNvbG9yKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWNvbi5zdHlsZS5jb2xvciA9IHBhcmFtcy5pY29uQ29sb3I7XG4gICAgaWNvbi5zdHlsZS5ib3JkZXJDb2xvciA9IHBhcmFtcy5pY29uQ29sb3I7XG5cbiAgICBmb3IgKHZhciBfaSA9IDAsIF9hcnIgPSBbJy5zd2FsMi1zdWNjZXNzLWxpbmUtdGlwJywgJy5zd2FsMi1zdWNjZXNzLWxpbmUtbG9uZycsICcuc3dhbDIteC1tYXJrLWxpbmUtbGVmdCcsICcuc3dhbDIteC1tYXJrLWxpbmUtcmlnaHQnXTsgX2kgPCBfYXJyLmxlbmd0aDsgX2krKykge1xuICAgICAgdmFyIHNlbCA9IF9hcnJbX2ldO1xuICAgICAgc2V0U3R5bGUoaWNvbiwgc2VsLCAnYmFja2dyb3VuZENvbG9yJywgcGFyYW1zLmljb25Db2xvcik7XG4gICAgfVxuXG4gICAgc2V0U3R5bGUoaWNvbiwgJy5zd2FsMi1zdWNjZXNzLXJpbmcnLCAnYm9yZGVyQ29sb3InLCBwYXJhbXMuaWNvbkNvbG9yKTtcbiAgfTtcblxuICB2YXIgaWNvbkNvbnRlbnQgPSBmdW5jdGlvbiBpY29uQ29udGVudChjb250ZW50KSB7XG4gICAgcmV0dXJuIFwiPGRpdiBjbGFzcz1cXFwiXCIuY29uY2F0KHN3YWxDbGFzc2VzWy
8443dpY29uLWNvbnRlbnQnXSwgXCJcXFwiPlwiKS5jb25jYXQoY29udGVudCwgXCI8L2Rpdj5cIik7XG4gIH07XG5cbiAgdmFyIHJlbmRlckltYWdlID0gZnVuY3Rpb24gcmVuZGVySW1hZ2UoaW5zdGFuY2UsIHBhcmFtcykge1xuICAgIHZhciBpbWFnZSA9IGdldEltYWdlKCk7XG5cbiAgICBpZiAoIXBhcmFtcy5pbWFnZVVybCkge1xuICAgICAgcmV0dXJuIGhpZGUoaW1hZ2UpO1xuICAgIH1cblxuICAgIHNob3coaW1hZ2UsICcnKTsgLy8gU3JjLCBhbHRcblxuICAgIGltYWdlLnNldEF0dHJpYnV0ZSgnc3JjJywgcGFyYW1zLmltYWdlVXJsKTtcbiAgICBpbWFnZS5zZXRBdHRyaWJ1dGUoJ2FsdCcsIHBhcmFtcy5pbWFnZUFsdCk7IC8vIFdpZHRoLCBoZWlnaHRcblxuICAgIGFwcGx5TnVtZXJpY2FsU3R5bGUoaW1hZ2UsICd3aWR0aCcsIHBhcmFtcy5pbWFnZVdpZHRoKTtcbiAgICBhcHBseU51bWVyaWNhbFN0eWxlKGltYWdlLCAnaGVpZ2h0JywgcGFyYW1zLmltYWdlSGVpZ2h0KTsgLy8gQ2xhc3NcblxuICAgIGltYWdlLmNsYXNzTmFtZSA9IHN3YWxDbGFzc2VzLmltYWdlO1xuICAgIGFwcGx5Q3VzdG9tQ2xhc3MoaW1hZ2UsIHBhcmFtcywgJ2ltYWdlJyk7XG4gIH07XG5cbiAgdmFyIGN1cnJlbnRTdGVwcyA9IFtdO1xuICAvKlxuICAgKiBHbG9iYWwgZnVuY3Rpb24gZm9yIGNoYWluaW5nIHN3ZWV0QWxlcnQgcG9wdXBzXG4gICAqL1xuXG4gIHZhciBxdWV1ZSA9IGZ1bmN0aW9uIHF1ZXVlKHN0ZXBzKSB7XG4gICAgdmFyIFN3YWwgPSB0aGlzO1xuICAgIGN1cnJlbnRTdGVwcyA9IHN0ZXBzO1xuXG4gICAgdmFyIHJlc2V0QW5kUmVzb2x2ZSA9IGZ1bmN0aW9uIHJlc2V0QW5kUmVzb2x2ZShyZXNvbHZlLCB2YWx1ZSkge1xuICAgICAgY3VycmVudFN0ZXBzID0gW107XG4gICAgICByZXNvbHZlKHZhbHVlKTtcbiAgICB9O1xuXG4gICAgdmFyIHF1ZXVlUmVzdWx0ID0gW107XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlKSB7XG4gICAgICAoZnVuY3Rpb24gc3RlcChpLCBjYWxsYmFjaykge1xuICAgICAgICBpZiAoaSA8IGN1cnJlbnRTdGVwcy5sZW5ndGgpIHtcbiAgICAgICAgICBkb2
8443N1bWVudC5ib2R5LnNldEF0dHJpYnV0ZSgnZGF0YS1zd2FsMi1xdWV1ZS1zdGVwJywgaSk7XG4gICAgICAgICAgU3dhbC5maXJlKGN1cnJlbnRTdGVwc1tpXSkudGhlbihmdW5jdGlvbiAocmVzdWx0KSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIHJlc3VsdC52YWx1ZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgcXVldWVSZXN1bHQucHVzaChyZXN1bHQudmFsdWUpO1xuICAgICAgICAgICAgICBzdGVwKGkgKyAxLCBjYWxsYmFjayk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICByZXNldEFuZFJlc29sdmUocmVzb2x2ZSwge1xuICAgICAgICAgICAgICAgIGRpc21pc3M6IHJlc3VsdC5kaXNtaXNzXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlc2V0QW5kUmVzb2x2ZShyZXNvbHZlLCB7XG4gICAgICAgICAgICB2YWx1ZTogcXVldWVSZXN1bHRcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSkoMCk7XG4gICAgfSk7XG4gIH07XG4gIC8qXG4gICAqIEdsb2JhbCBmdW5jdGlvbiBmb3IgZ2V0dGluZyB0aGUgaW5kZXggb2YgY3VycmVudCBwb3B1cCBpbiBxdWV1ZVxuICAgKi9cblxuICB2YXIgZ2V0UXVldWVTdGVwID0gZnVuY3Rpb24gZ2V0UXVldWVTdGVwKCkge1xuICAgIHJldHVybiBnZXRDb250YWluZXIoKSAmJiBnZXRDb250YWluZXIoKS5nZXRBdHRyaWJ1dGUoJ2RhdGEtcXVldWUtc3RlcCcpO1xuICB9O1xuICAvKlxuICAgKiBHbG9iYWwgZnVuY3Rpb24gZm9yIGluc2VydGluZyBhIHBvcHVwIHRvIHRoZSBxdWV1ZVxuICAgKi9cblxuICB2YXIgaW5zZXJ0UXVldWVTdGVwID0gZnVuY3Rpb24gaW5zZXJ0UXVldWVTdGVwKHN0ZXAsIGluZGV4KSB7XG4gICAgaWYgKGluZGV4ICYmIGluZGV4IDwgY3VycmVudFN0ZXBzLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIGN1cnJlbnRTdGVwcy5zcGxpY2UoaW5kZXgsIDAsIHN0ZXApO1xuICAgIH1cblxuICAgIHJldHVybiBjdXJyZW50U3RlcHMucHVzaChzdGVwKTtcbiAgfTtcbiAgLypcbiAgICogR2xvYmFsIGZ1bmN0aW9uIGZvciBkZWxldGluZyBhIHBvcHVwIGZyb20gdGhlIHF1ZXVlXG4gICAqL1xuXG4gIHZhciBkZWxldGVRdWV1ZVN0ZXAgPSBmdW5jdGlvbiBkZWxldGVRdWV1ZVN0ZXAoaW5kZXgpIHtcbiAgICBpZiAodHlwZW9mIGN1cnJlbnRTdGVwc1tpbmRleF0gIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBjdXJyZW50U3RlcHMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICB9XG4gIH07XG5cbiAgdmFyIGNyZWF0ZVN0ZXBFbGVtZW50ID0gZnVuY3Rpb24gY3JlYXRlU3RlcEVsZW1lbnQoc3RlcCkge1xuICAgIHZhciBzdGVwRWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdsaScpO1xuICAgIGFkZENsYXNzKHN0ZXBFbCwgc3dhbENsYXNzZXNbJ3Byb2dyZXNzLXN0ZXAnXSk7XG4gICAgc2V0SW5uZXJIdG1sKHN0ZXBFbCwgc3RlcCk7XG4gICAgcmV0dXJuIHN0ZXBFbDtcbiAgfTtcblxuICB2YXIgY3JlYXRlTGluZUVsZW1lbnQgPSBmdW5jdGlvbiBjcmVhdGVMaW5lRWxlbWVudChwYXJhbXMpIHtcbiAgICB2YXIgbGluZUVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnbGknKTtcbiAgICBhZGRDbGFzcyhsaW5lRWwsIHN3YWxDbGFzc2VzWy
8443dwcm9ncmVzcy1zdGVwLWxpbmUnXSk7XG5cbiAgICBpZiAocGFyYW1zLnByb2dyZXNzU3RlcHNEaXN0YW5jZSkge1xuICAgICAgbGluZUVsLnN0eWxlLndpZHRoID0gcGFyYW1zLnByb2dyZXNzU3RlcHNEaXN0YW5jZTtcbiAgICB9XG5cbiAgICByZXR1cm4gbGluZUVsO1xuICB9O1xuXG4gIHZhciByZW5kZXJQcm9ncmVzc1N0ZXBzID0gZnVuY3Rpb24gcmVuZGVyUHJvZ3Jlc3NTdGVwcyhpbnN0YW5jZSwgcGFyYW1zKSB7XG4gICAgdmFyIHByb2dyZXNzU3RlcHNDb250YWluZXIgPSBnZXRQcm9ncmVzc1N0ZXBzKCk7XG5cbiAgICBpZiAoIXBhcmFtcy5wcm9ncmVzc1N0ZXBzIHx8IHBhcmFtcy5wcm9ncmVzc1N0ZXBzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIGhpZGUocHJvZ3Jlc3NTdGVwc0NvbnRhaW5lcik7XG4gICAgfVxuXG4gICAgc2hvdyhwcm9ncmVzc1N0ZXBzQ29udGFpbmVyKTtcbiAgICBwcm9ncmVzc1N0ZXBzQ29udGFpbmVyLnRleHRDb250ZW50ID0gJyc7XG4gICAgdmFyIGN1cnJlbnRQcm9ncmVzc1N0ZXAgPSBwYXJzZUludChwYXJhbXMuY3VycmVudFByb2dyZXNzU3RlcCA9PT0gdW5kZWZpbmVkID8gZ2V0UXVldWVTdGVwKCkgOiBwYXJhbXMuY3VycmVudFByb2dyZXNzU3RlcCk7XG5cbiAgICBpZiAoY3VycmVudFByb2dyZXNzU3RlcCA+PSBwYXJhbXMucHJvZ3Jlc3NTdGVwcy5sZW5ndGgpIHtcbiAgICAgIHdhcm4oJ0ludmFsaWQgY3VycmVudFByb2dyZXNzU3RlcCBwYXJhbWV0ZXIsIGl0IHNob3VsZCBiZSBsZXNzIHRoYW4gcHJvZ3Jlc3NTdGVwcy5sZW5ndGggJyArICcoY3VycmVudFByb2dyZXNzU3RlcCBsaWtlIEpTIGFycmF5cyBzdGFydHMgZnJvbSAwKScpO1xuICAgIH1cblxuICAgIHBhcmFtcy5wcm9ncmVzc1N0ZXBzLmZvckVhY2goZnVuY3Rpb24gKHN0ZXAsIGluZGV4KSB7XG4gICAgICB2Y
8443XIgc3RlcEVsID0gY3JlYXRlU3RlcEVsZW1lbnQoc3RlcCk7XG4gICAgICBwcm9ncmVzc1N0ZXBzQ29udGFpbmVyLmFwcGVuZENoaWxkKHN0ZXBFbCk7XG5cbiAgICAgIGlmIChpbmRleCA9PT0gY3VycmVudFByb2dyZXNzU3RlcCkge1xuICAgICAgICBhZGRDbGFzcyhzdGVwRWwsIHN3YWxDbGFzc2VzWydhY3RpdmUtcHJvZ3Jlc3Mtc3RlcCddKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGluZGV4ICE9PSBwYXJhbXMucHJvZ3Jlc3NTdGVwcy5sZW5ndGggLSAxKSB7XG4gICAgICAgIHZhciBsaW5lRWwgPSBjcmVhdGVMaW5lRWxlbWVudChwYXJhbXMpO1xuICAgICAgICBwcm9ncmVzc1N0ZXBzQ29udGFpbmVyLmFwcGVuZENoaWxkKGxpbmVFbCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH07XG5cbiAgdmFyIHJlbmRlclRpdGxlID0gZnVuY3Rpb24gcmVuZGVyVGl0bGUoaW5zdGFuY2UsIHBhcmFtcykge1xuICAgIHZhciB0aXRsZSA9IGdldFRpdGxlKCk7XG4gICAgdG9nZ2xlKHRpdGxlLCBwYXJhbXMudGl0bGUgfHwgcGFyYW1zLnRpdGxlVGV4dCk7XG5cbiAgICBpZiAocGFyYW1zLnRpdGxlKSB7XG4gICAgICBwYXJzZUh0bWxUb0NvbnRhaW5lcihwYXJhbXMudGl0bGUsIHRpdGxlKTtcbiAgICB9XG5cbiAgICBpZiAocGFyYW1zLnRpdGxlVGV4dCkge1xuICAgICAgdGl0bGUuaW5uZXJUZXh0ID0gcGFyYW1zLnRpdGxlVGV4dDtcbiAgICB9IC8vIEN1c3RvbSBjbGFzc1xuXG5cbiAgICBhcHBseUN1c3RvbUNsYXNzKHRpdGxlLCBwYXJhbXMsICd0aXRsZScpO1xuICB9O1xuXG4gIHZhciByZW5kZXJIZWFkZXIgPSBmdW5jdGlvbiByZW5kZXJIZWFkZXIoaW5zdGFuY2UsIHBhcmFtcykge1xuICAgIHZhciBoZWFkZXIgPSBnZXRIZWFkZXIoKTsgLy8gQ3VzdG9tIGNsYXNzXG5cbiAgICBhcHBseUN1c3RvbUNsYXNzKGhlYWRlciwgcGFyYW1zLCAnaGVhZGVyJyk7IC8vIFByb2dyZXNzIHN0ZXBzXG5cbiAgICByZW5kZXJQcm9ncmVzc1N0ZXBzKGluc3RhbmNlLCBwYXJhbXMpOyAvLyBJY29uXG5cbiAgICByZW5kZXJJY29uKGluc3RhbmNlLCBwYXJhbXMpOyAvLyBJbWFnZVxuXG4gICAgcmVuZGVySW1hZ2UoaW5zdGFuY2UsIHBhcmFtcyk7IC8vIFRpdGxlXG5cbiAgICByZW5kZXJUaXRsZShpbnN0YW5jZSwgcGFyYW1zKTsgLy8gQ2xvc2UgYnV0dG9uXG5cbiAgICByZW5kZXJDbG9zZUJ1dHRvbihpbnN0YW5jZSwgcGFyYW1zKTtcbiAgfTtcblxuICB2YXIgcmVuZGVyUG9wdXAgPSBmdW5jdGlvbiByZW5kZXJQb3B1cChpbnN0YW5jZSwgcGFyYW1zKSB7XG4gICAgdmFyIHBvcHVwID0gZ2V0UG9wdXAoKTsgLy8gV2lkdGhcblxuICAgIGFwcGx5TnVtZXJpY2FsU3R5bGUocG9wdXAsICd3aWR0aCcsIHBhcmFtcy53aWR0aCk7IC8vIFBhZGRpbmdcblxuICAgIGFwcGx5TnVtZXJpY2FsU3R5bGUocG9wdXAsICdwYWRkaW5nJywgcGFyYW1zLnBhZGRpbmcpOyAvLyBCYWNrZ3JvdW5kXG5cbiAgICBpZiAocGFyYW1zLmJhY2tncm91bmQpIHtcbiAgICAgIHBvcHVwLnN0eWxlLmJhY2tncm91bmQgPSBwYXJhbXMuYmFja2dyb3VuZDtcbiAgICB9IC8vIENsYXNzZXNcblxuXG4gICAgYWRkQ2xhc3Nlcyhwb3B1cCwgcGFyYW1zKTtcbiAgfTtcblxuICB2YXIgYWRkQ2xhc3NlcyA9IGZ1bmN0aW9uIGFkZENsYXNzZXMocG9wdXAsIHBhcmFtcykge1xuICAgIC8vIERlZmF1bHQgQ2xhc3MgKyBzaG93Q2xhc3Mgd2hlbiB1cGRhdGluZyBTd2FsLnVwZGF0ZSh7fSlcbiAgICBwb3B1cC5jbGFzc05hbWUgPSBcIlwiLmNvbmNhdChzd2FsQ2xhc3Nlcy5wb3B1cCwgXCIgXCIpLmNvbmNhdChpc1Zpc2libGUocG9wdXApID8gcGFyYW1zLnNob3dDbGFzcy5wb3B1cCA6ICcnKTtcblxuICAgIGlmIChwYXJhbXMudG9hc3QpIHtcbiAgICAgIGFkZENsYXNzKFtkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsIGRvY3VtZW50LmJvZHldLCBzd2FsQ2xhc3Nlc1sndG9hc3Qtc2hvd24nXSk7XG4gICAgICBhZGRDbGFzcyhwb3B1cCwgc3dhbENsYXNzZXMudG9hc3QpO1xuICAgIH0gZWxzZSB7XG4gICAgICBhZGRDbGFzcyhwb3B1cCwgc3dhbENsYXNzZXMubW9kYWwpO1xuICAgIH0gLy8gQ3VzdG9tIGNsYXNzXG5cblxuICAgIGFwcGx5Q3VzdG9tQ2xhc3MocG9wdXAsIHBhcmFtcywgJ3BvcHVwJyk7XG5cbiAgICBpZiAodHlwZW9mIHBhcmFtcy5jdXN0b21DbGFzcyA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGFkZENsYXNzKHBvcHVwLCBwYXJhbXMuY3VzdG9tQ2xhc3MpO1xuICAgIH0gLy8gSWNvbiBjbGFzcyAoIzE4NDIpXG5cblxuICAgIGlmIChwYXJhbXMuaWNvbikge1xuICAgICAgYWRkQ2xhc3MocG9wdXAsIHN3YWxDbGFzc2VzW1wiaWNvbi1cIi5jb25jYXQocGFyYW1zLmljb24pXSk7XG4gICAgfVxuICB9O1xuXG4gIHZhciByZW5kZXIgPSBmdW5jdGlvbiByZW5kZXIoaW5zdGFuY2UsIHBhcmFtcykge1xuICAgIHJlbmRlclBvcHVwKGluc3RhbmNlLCBwYXJhbXMpO1xuICAgIHJlbmRlckNvbnRhaW5lcihpbnN0YW5jZSwgcGFyYW1zKTtcbiAgICByZW5kZXJIZWFkZXIoaW5zdGFuY2UsIHBhcmFtcyk7XG4gICAgcmVuZGVyQ29udGVudChpbnN0YW5jZSwgcGFyYW1zKTtcbiAgICByZW5kZXJBY3Rpb25zKGluc3RhbmNlLCBwYXJhbXMpO1xuICAgIHJlbmRlckZvb3RlcihpbnN0YW5jZSwgcGFyYW1zKTtcblxuICAgIGlmICh0eXBlb2YgcGFyYW1zLmRpZFJlbmRlciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcGFyYW1zLmRpZFJlbmRlcihnZXRQb3B1cCgpKTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBwYXJhbXMub25SZW5kZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHBhcmFtcy5vblJlbmRlcihnZXRQb3B1cCgpKTsgLy8gQGRlcHJlY2F0ZWRcbiAgICB9XG4gIH07XG5cbiAgLypcbiAgICogR2xvYmFsIGZ1bmN0aW9uIHRvIGRldGVybWluZSBpZiBTd2VldEFsZXJ0MiBwb3B1cCBpcyBzaG93blxuICAgKi9cblxuICB2YXIgaXNWaXNpYmxlJDEgPSBmdW5jdGlvbiBpc1Zpc2libGUkJDEoKSB7XG4gICAgcmV0dXJuIGlzVmlzaWJsZShnZXRQb3B1cCgpKTtcbiAgfTtcbiAgLypcbiAgICogR2xvYmFsIGZ1bmN0aW9uIHRvIGNsaWNrICdDb25maXJtJyBidXR0b25cbiAgICovXG5cbiAgdmFyIGNsaWNrQ29uZmlybSA9IGZ1bmN0aW9uIGNsaWNrQ29uZmlybSgpIHtcbiAgICByZXR1cm4gZ2V0Q29uZmlybUJ1dHRvbigpICYmIGdldENvbmZpcm1CdXR0b24oKS5jbGljaygpO1xuICB9O1xuICAvKlxuICAgKiBHbG9iYWwgZnVuY3Rpb24gdG8gY2xpY2sgJ0RlbnknIGJ1dHRvblxuICAgKi9cblxuICB2Y
8443XIgY2xpY2tEZW55ID0gZnVuY3Rpb24gY2xpY2tEZW55KCkge1xuICAgIHJldHVybiBnZXREZW55QnV0dG9uKCkgJiYgZ2V0RGVueUJ1dHRvbigpLmNsaWNrKCk7XG4gIH07XG4gIC8qXG4gICAqIEdsb2JhbCBmdW5jdGlvbiB0byBjbGljayAnQ2FuY2VsJyBidXR0b25cbiAgICovXG5cbiAgdmFyIGNsaWNrQ2FuY2VsID0gZnVuY3Rpb24gY2xpY2tDYW5jZWwoKSB7XG4gICAgcmV0dXJuIGdldENhbmNlbEJ1dHRvbigpICYmIGdldENhbmNlbEJ1dHRvbigpLmNsaWNrKCk7XG4gIH07XG5cbiAgZnVuY3Rpb24gZmlyZSgpIHtcbiAgICB2YXIgU3dhbCA9IHRoaXM7XG5cbiAgICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IG5ldyBBcnJheShfbGVuKSwgX2tleSA9IDA7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICAgIGFyZ3NbX2tleV0gPSBhcmd1bWVudHNbX2tleV07XG4gICAgfVxuXG4gICAgcmV0dXJuIF9jb25zdHJ1Y3QoU3dhbCwgYXJncyk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhbiBleHRlbmRlZCB2ZXJzaW9uIG9mIGBTd2FsYCBjb250YWluaW5nIGBwYXJhbXNgIGFzIGRlZmF1bHRzLlxuICAgKiBVc2VmdWwgZm9yIHJldXNpbmcgU3dhbCBjb25maWd1cmF0aW9uLlxuICAgKlxuICAgKiBGb3IgZXhhbXBsZTpcbiAgICpcbiAgICogQmVmb3JlOlxuICAgKiBjb25zdCB0ZXh0UHJvbXB0T3B0aW9ucyA9IHsgaW5wdXQ6ICd0ZXh0Jywgc2hvd0NhbmNlbEJ1dHRvbjogdHJ1ZSB9XG4gICAqIGNvbnN0IHt2YWx1ZTogZmlyc3ROYW1lfSA9IGF3YWl0IFN3YWwuZmlyZSh7IC4uLnRleHRQcm9tcHRPcHRpb25zLCB0aXRsZTogJ1doYXQgaXMgeW91ciBmaXJzdCBuYW1lPycgfSlcbiAgICogY29uc3Qge3ZhbHVlOiBsYXN0TmFtZX0gPSBhd2FpdCBTd2FsLmZpcmUoeyAuLi50ZXh0UHJvbXB0T3B0aW9ucywgdGl0bGU6ICdXaGF0IGlzIHlvdXIgbGFzdCBuYW1lPycgfSlcbiAgICpcbiAgICogQWZ0ZXI6XG4gICAqIGNvbnN0IFRleHRQcm9tcHQgPSBTd2FsLm1peGluKHsgaW5wdXQ6ICd0ZXh0Jywgc2hvd0NhbmNlbEJ1dHRvbjogdHJ1ZSB9KVxuICAgKiBjb25zdCB7dmFsdWU6IGZpcnN0TmFtZX0gPSBhd2FpdCBUZXh0UHJvbXB0KCdXaGF0IGlzIHlvdXIgZmlyc3QgbmFtZT8nKVxuICAgKiBjb25zdCB7dmFsdWU6IGxhc3ROYW1lfSA9IGF3YWl0IFRleHRQcm9tcHQoJ1doYXQgaXMgeW91ciBsYXN0IG5hbWU/JylcbiAgICpcbiAgICogQHBhcmFtIG1peGluUGFyYW1zXG4gICAqL1xuICBmdW5jdGlvbiBtaXhpbihtaXhpblBhcmFtcykge1xuICAgIHZhciBNaXhpblN3YWwgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKF90aGlzKSB7XG4gICAgICBfaW5oZXJpdHMoTWl4aW5Td2FsLCBfdGhpcyk7XG5cbiAgICAgIHZhciBfc3VwZXIgPSBfY3JlYXRlU3VwZXIoTWl4aW5Td2FsKTtcblxuICAgICAgZnVuY3Rpb24gTWl4aW5Td2FsKCkge1xuICAgICAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgTWl4aW5Td2FsKTtcblxuICAgICAgICByZXR1cm4gX3N1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICB9XG5cbiAgICAgIF9jcmVhdGVDbGFzcyhNaXhpblN3YWwsIFt7XG4gICAgICAgIGtleTogXCJfbWFpblwiLFxuICAgICAgICB2YWx1ZTogZnVuY3Rpb24gX21haW4ocGFyYW1zLCBwcmV2TWl4aW5QYXJhbXMpIHtcbiAgICAgICAgICByZXR1cm4gX2dldChfZ2V0UHJvdG90eXBlT2YoTWl4aW5Td2FsLnByb3RvdHlwZSksIFwiX21haW5cIiwgdGhpcykuY2FsbCh0aGlzLCBwYXJhbXMsIF9leHRlbmRzKHt9LCBwcmV2TWl4aW5QYXJhbXMsIG1peGluUGFyYW1zKSk7XG4gICAgICAgIH1cbiAgICAgIH1dKTtcblxuICAgICAgcmV0dXJuIE1peGluU3dhbDtcbiAgICB9KHRoaXMpO1xuXG4gICAgcmV0dXJuIE1peGluU3dhbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTaG93cyBsb2FkZXIgKHNwaW5uZXIpLCB0aGlzIGlzIHVzZWZ1bCB3aXRoIEFKQVggcmVxdWVzdHMuXG4gICAqIEJ5IGRlZmF1bHQgdGhlIGxvYWRlciBiZSBzaG93biBpbnN0ZWFkIG9mIHRoZSBcIkNvbmZpcm1cIiBidXR0b24uXG4gICAqL1xuXG4gIHZhciBzaG93TG9hZGluZyA9IGZ1bmN0aW9uIHNob3dMb2FkaW5nKGJ1dHRvblRvUmVwbGFjZSkge1xuICAgIHZhciBwb3B1cCA9IGdldFBvcHVwKCk7XG5cbiAgICBpZiAoIXBvcHVwKSB7XG4gICAgICBTd2FsLmZpcmUoKTtcbiAgICB9XG5cbiAgICBwb3B1cCA9IGdldFBvcHVwKCk7XG4gICAgdmFyIGFjdGlvbnMgPSBnZXRBY3Rpb25zKCk7XG4gICAgdmFyIGxvYWRlciA9IGdldExvYWRlcigpO1xuXG4gICAgaWYgKCFidXR0b25Ub1JlcGxhY2UgJiYgaXNWaXNpYmxlKGdldENvbmZpcm1CdXR0b24oKSkpIHtcbiAgICAgIGJ1dHRvblRvUmVwbGFjZSA9IGdldENvbmZpcm1CdXR0b24oKTtcbiAgICB9XG5cbiAgICBzaG93KGFjdGlvbnMpO1xuXG4gICAgaWYgKGJ1dHRvblRvUmVwbGFjZSkge1xuICAgICAgaGlkZShidXR0b25Ub1JlcGxhY2UpO1xuICAgICAgbG9hZGVyLnNldEF0dHJpYnV0ZSgnZGF0YS1idXR0b24tdG8tcmVwbGFjZScsIGJ1dHRvblRvUmVwbGFjZS5jbGFzc05hbWUpO1xuICAgIH1cblxuICAgIGxvYWRlci5wYXJlbnROb2RlLmluc2VydEJlZm9yZShsb2FkZXIsIGJ1dHRvblRvUmVwbGFjZSk7XG4gICAgYWRkQ2xhc3MoW3BvcHVwLCBhY3Rpb25zXSwgc3dhbENsYXNzZXMubG9hZGluZyk7XG4gICAgc2hvdyhsb2FkZXIpO1xuICAgIHBvcHVwLnNldEF0dHJpYnV0ZSgnZGF0YS1sb2FkaW5nJywgdHJ1ZSk7XG4gICAgcG9wdXAuc2V0QXR0cmlidXRlKCdhcmlhLWJ1c3knLCB0cnVlKTtcbiAgICBwb3B1cC5mb2N1cygpO1xuICB9O1xuXG4gIHZhciBSRVNUT1JFX0ZPQ1VTX1RJTUVPVVQgPSAxMDA7XG5cbiAgdmFyIGdsb2JhbFN0YXRlID0ge307XG5cbiAgdmFyIGZvY3VzUHJldmlvdXNBY3RpdmVFbGVtZW50ID0gZnVuY3Rpb24gZm9jdXNQcmV2aW91c0FjdGl2ZUVsZW1lbnQoKSB7XG4gICAgaWYgKGdsb2JhbFN0YXRlLnByZXZpb3VzQWN0aXZlRWxlbWVudCAmJiBnbG9iYWxTdGF0ZS5wcmV2aW91c0FjdGl2ZUVsZW1lbnQuZm9jdXMpIHtcbiAgICAgIGdsb2JhbFN0YXRlLnByZXZpb3VzQWN0aXZlRWxlbWVudC5mb2N1cygpO1xuICAgICAgZ2xvYmFsU3RhdGUucHJldmlvdXNBY3RpdmVFbGVtZW50ID0gbnVsbDtcbiAgICB9IGVsc2UgaWYgKGRvY3VtZW50LmJvZHkpIHtcbiAgICAgIGRvY3VtZW50LmJvZHkuZm9jdXMoKTtcbiAgICB9XG4gI
8443H07IC8vIFJlc3RvcmUgcHJldmlvdXMgYWN0aXZlIChmb2N1c2VkKSBlbGVtZW50XG5cblxuICB2YXIgcmVzdG9yZUFjdGl2ZUVsZW1lbnQgPSBmdW5jdGlvbiByZXN0b3JlQWN0aXZlRWxlbWVudCgpIHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUpIHtcbiAgICAgIHZhciB4ID0gd2luZG93LnNjcm9sbFg7XG4gICAgICB2YXIgeSA9IHdpbmRvdy5zY3JvbGxZO1xuICAgICAgZ2xvYmFsU3RhdGUucmVzdG9yZUZvY3VzVGltZW91dCA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICBmb2N1c1ByZXZpb3VzQWN0aXZlRWxlbWVudCgpO1xuICAgICAgICByZXNvbHZlKCk7XG4gICAgICB9LCBSRVNUT1JFX0ZPQ1VTX1RJTUVPVVQpOyAvLyBpc3N1ZXMvOTAwXG5cbiAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuXG4gICAgICBpZiAodHlwZW9mIHggIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiB5ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAvLyBJRSBkb2Vzbid0IGhhdmUgc2Nyb2xsWC9zY3JvbGxZIHN1cHBvcnRcbiAgICAgICAgd2luZG93LnNjcm9sbFRvKHgsIHkpO1xuICAgICAgfVxuICAgIH0pO1xuICB9O1xuXG4gIC8qKlxuICAgKiBJZiBgdGltZXJgIHBhcmFtZXRlciBpcyBzZXQsIHJldHVybnMgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBvZiB0aW1lciByZW1haW5lZC5cbiAgICogT3RoZXJ3aXNlLCByZXR1cm5zIHVuZGVmaW5lZC5cbiAgICovXG5cbiAgdmFyIGdldFRpbWVyTGVmdCA9IGZ1bmN0aW9uIGdldFRpbWVyTGVmdCgpIHtcbiAgICByZXR1cm4gZ2xvYmFsU3RhdGUudGltZW91dCAmJiBnbG9iYWxTdGF0ZS50aW1lb3V0LmdldFRpbWVyTGVmdCgpO1xuICB9O1xuICAvKipcbiAgICogU3RvcCB0aW1lci4gUmV0dXJucyBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIG9mIHRpbWVyIHJlbWFpbmVkLlxuICAgKiBJZiBgdGltZXJgIHBhcmFtZXRlciBpc24ndCBzZXQsIHJldHVybnMgdW5kZWZpbmVkLlxuICAgKi9cblxuICB2YXIgc3RvcFRpbWVyID0gZnVuY3Rpb24gc3RvcFRpbWVyKCkge1xuICAgIGlmIChnbG9iYWxTdGF0ZS50aW1lb3V0KSB7XG4gICAgICBzdG9wVGltZXJQcm9ncmVzc0JhcigpO1xuICAgICAgcmV0dXJuIGdsb2JhbFN0YXRlLnRpbWVvdXQuc3RvcCgpO1xuICAgIH1cbiAgfTtcbiAgLyoqXG4gICAqIFJlc3VtZSB0aW1lci4gUmV0dXJucyBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIG9mIHRpbWVyIHJlbWFpbmVkLlxuICAgKiBJZiBgdGltZXJgIHBhcmFtZXRlciBpc24ndCBzZXQsIHJldHVybnMgdW5kZWZpbmVkLlxuICAgKi9cblxuICB2YXIgcmVzdW1lVGltZXIgPSBmdW5jdGlvbiByZXN1bWVUaW1lcigpIHtcbiAgICBpZiAoZ2xvYmFsU3RhdGUudGltZW91dCkge1xuICAgICAgdmFyIHJlbWFpbmluZyA9IGdsb2JhbFN0YXRlLnRpbWVvdXQuc3RhcnQoKTtcbiAgICAgIGFuaW1hdGVUaW1lclByb2dyZXNzQmFyKHJlbWFpbmluZyk7XG4gICAgICByZXR1cm4gcmVtYWluaW5nO1xuICAgIH1cbiAgfTtcbiAgLyoqXG4gICAqIFJlc3VtZSB0aW1lci4gUmV0dXJucyBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIG9mIHRpbWVyIHJlbWFpbmVkLlxuICAgKiBJZiBgdGltZXJgIHBhcmFtZXRlciBpc24ndCBzZXQsIHJldHVybnMgdW5kZWZpbmVkLlxuICAgKi9cblxuICB2YXIgdG9nZ2xlVGltZXIgPSBmdW5jdGlvbiB0b2dnbGVUaW1lcigpIHtcbiAgICB2YXIgdGltZXIgPSBnbG9iYWxTdGF0ZS50aW1lb3V0O1xuICAgIHJldHVybiB0aW1lciAmJiAodGltZXIucnVubmluZyA/IHN0b3BUaW1lcigpIDogcmVzdW1lVGltZXIoKSk7XG4gIH07XG4gIC8qKlxuICAgKiBJbmNyZWFzZSB0aW1lci4gUmV0dXJucyBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIG9mIGFuIHVwZGF0ZWQgdGltZXIuXG4gICAqIElmIGB0aW1lcmAgcGFyYW1ldGVyIGlzbid0IHNldCwgcmV0dXJucyB1bmRlZmluZWQuXG4gICAqL1xuXG4gIHZhciBpbmNyZWFzZVRpbWVyID0gZnVuY3Rpb24gaW5jcmVhc2VUaW1lcihuKSB7XG4gICAgaWYgKGdsb2JhbFN0YXRlLnRpbWVvdXQpIHtcbiAgICAgIHZhciByZW1haW5pbmcgPSBnbG9iYWxTdGF0ZS50aW1lb3V0LmluY3JlYXNlKG4pO1xuICAgICAgYW5pbWF0ZVRpbWVyUHJvZ3Jlc3NCYXIocmVtYWluaW5nLCB0cnVlKTtcbiAgICAgIHJldHVybiByZW1haW5pbmc7XG4gICAgfVxuICB9O1xuICAvKipcbiAgICogQ2hlY2sgaWYgdGltZXIgaXMgcnVubmluZy4gUmV0dXJucyB0cnVlIGlmIHRpbWVyIGlzIHJ1bm5pbmdcbiAgICogb3IgZmFsc2UgaWYgdGltZXIgaXMgcGF1c2VkIG9yIHN0b3BwZWQuXG4gICAqIElmIGB0aW1lcmAgcGFyYW1ldGVyIGlzbid0IHNldCwgcmV0dXJucyB1bmRlZmluZWRcbiAgICovXG5cbiAgdmFyIGlzVGltZXJSdW5uaW5nID0gZnVuY3Rpb24gaXNUaW1lclJ1bm5pbmcoKSB7XG4gICAgcmV0dXJuIGdsb2JhbFN0YXRlLnRpbWVvdXQgJiYgZ2xvYmFsU3RhdGUudGltZW91dC5pc1J1bm5pbmcoKTtcbiAgfTtcblxuICB2YXIgYm9keUNsaWNrTGlzdGVuZXJBZGRlZCA9IGZhbHNlO1xuICB2YXIgY2xpY2tIYW5kbGVycyA9IHt9O1xuICBmdW5jdGlvbiBiaW5kQ2xpY2tIYW5kbGVyKCkge1xuICAgIHZhciBhdHRyID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiAnZGF0YS1zd2FsLXRlbXBsYXRlJztcbiAgICBjbGlja0hhbmRsZXJzW2F0dHJdID0gdGhpcztcblxuICAgIGlmICghYm9keUNsaWNrTGlzdGVuZXJBZGRlZCkge1xuICAgICAgZG9jdW1lbnQuYm9keS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGJvZHlDbGlja0xpc3RlbmVyKTtcbiAgICAgIGJvZHlDbGlja0xpc3RlbmVyQWRkZWQgPSB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIHZhciBib2R5Q2xpY2tMaXN0ZW5lciA9IGZ1bmN0aW9uIGJvZHlDbGlja0xpc3RlbmVyKGV2ZW50KSB7XG4gICAgLy8gMS4gdXNpbmcgLnBhcmVudE5vZGUgaW5zdGVhZCBvZiBldmVudC5wYXRoIGJlY2F1c2Ugb2YgYmV0dGVyIHN1cHBvcnQgYnkgb2xkIGJyb3dzZXJzIGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vYS8zOTI0NTYzOFxuICAgIC8vIDIuIHVzaW5nIC5wYXJlbnROb2RlIGluc3RlYWQgb2YgLnBhcmVudEVsZW1lbnQgYmVjYXVzZSBvZiBJRTExICsgU1ZHIGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vYS8zNjI3MDM1NFxuICAgIGZvciAodmFyIGVsID0gZXZlbnQudGFyZ2V0OyBlbCAmJiBlbCAhPT0gZG9jdW1lbnQ7IGVsID0gZWwucGFyZW50Tm9kZSkge1xuICAgICAgZm9yICh2YXIgYXR0ciBpbiBjbGlja0hhbmRsZXJzKSB7XG4gICAgICAgI
8443HZhciB0ZW1wbGF0ZSA9IGVsLmdldEF0dHJpYnV0ZShhdHRyKTtcblxuICAgICAgICBpZiAodGVtcGxhdGUpIHtcbiAgICAgICAgICBjbGlja0hhbmRsZXJzW2F0dHJdLmZpcmUoe1xuICAgICAgICAgICAgdGVtcGxhdGU6IHRlbXBsYXRlXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIHZhciBkZWZhdWx0UGFyYW1zID0ge1xuICAgIHRpdGxlOiAnJyxcbiAgICB0aXRsZVRleHQ6ICcnLFxuICAgIHRleHQ6ICcnLFxuICAgIGh0bWw6ICcnLFxuICAgIGZvb3RlcjogJycsXG4gICAgaWNvbjogdW5kZWZpbmVkLFxuICAgIGljb25Db2xvcjogdW5kZWZpbmVkLFxuICAgIGljb25IdG1sOiB1bmRlZmluZWQsXG4gICAgdGVtcGxhdGU6IHVuZGVmaW5lZCxcbiAgICB0b2FzdDogZmFsc2UsXG4gICAgYW5pbWF0aW9uOiB0cnVlLFxuICAgIHNob3dDbGFzczoge1xuICAgICAgcG9wdXA6ICdzd2FsMi1zaG93JyxcbiAgICAgIGJhY2tkcm9wOiAnc3dhbDItYmFja2Ryb3Atc2hvdycsXG4gICAgICBpY29uOiAnc3dhbDItaWNvbi1zaG93J1xuICAgIH0sXG4gICAgaGlkZUNsYXNzOiB7XG4gICAgICBwb3B1cDogJ3N3YWwyLWhpZGUnLFxuICAgICAgYmFja2Ryb3A6ICdzd2FsMi1iYWNrZHJvcC1oaWRlJyxcbiAgICAgIGljb246ICdzd2FsMi1pY29uLWhpZGUnXG4gICAgfSxcbiAgICBjdXN0b21DbGFzczoge30sXG4gICAgdGFyZ2V0OiAnYm9keScsXG4gICAgYmFja2Ryb3A6IHRydWUsXG4gICAgaGVpZ2h0QXV0bzogdHJ1ZSxcbiAgICBhbGxvd091dHNpZGVDbGljazogdHJ1ZSxcbiAgICBhbGxvd0VzY2FwZUtleTogdHJ1ZSxcbiAgICBhbGxvd0VudGVyS2V5OiB0cnVlLFxuICAgIHN0b3BLZXlkb3duUHJvcGFnYXRpb246IHRydWUsXG4gICAga2V5ZG93bkxpc3RlbmVyQ2FwdHVyZTogZmFsc2UsXG4gICAgc2hvd0NvbmZpcm1CdXR0b246IHRydWUsXG4gICAgc2hvd0RlbnlCdXR0b246IGZhbHNlLFxuICAgIHNob3dDYW5jZWxCdXR0b246IGZhbHNlLFxuICAgIHByZUNvbmZpcm06IHVuZGVmaW5lZCxcbiAgICBwcmVEZW55OiB1bmRlZmluZWQsXG4gICAgY29uZmlybUJ1dHRvblRleHQ6ICdPSycsXG4gICAgY29uZmlybUJ1dHRvbkFyaWFMYWJlbDogJycsXG4gICAgY29uZmlybUJ1dHRvbkNvbG9yOiB1bmRlZmluZWQsXG4gICAgZGVueUJ1dHRvblRleHQ6ICdObycsXG4gICAgZGVueUJ1dHRvbkFyaWFMYWJlbDogJycsXG4gICAgZGVueUJ1dHRvbkNvbG9yOiB1bmRlZmluZWQsXG4gICAgY2FuY2VsQnV0dG9uVGV4dDogJ0NhbmNlbCcsXG4gICAgY2FuY2VsQnV0dG9uQXJpYUxhYmVsOiAnJyxcbiAgICBjYW5jZWxCdXR0b25Db2xvcjogdW5kZWZpbmVkLFxuICAgIGJ1dHRvbnNTdHlsaW5nOiB0cnVlLFxuICAgIHJldmVyc2VCdXR0b25zOiBmYWxzZSxcbiAgICBmb2N1c0NvbmZpcm06IHRydWUsXG4gICAgZm9jdXNEZW55OiBmYWxzZSxcbiAgICBmb2N1c0NhbmNlbDogZmFsc2UsXG4gICAgc2hvd0Nsb3NlQnV0dG9uOiBmYWxzZSxcbiAgICBjbG9zZUJ1dHRvbkh0bWw6ICcmdGltZXM7JyxcbiAgICBjbG9zZUJ1dHRvbkFyaWFMYWJlbDogJ0Nsb3NlIHRoaXMgZGlhbG9nJyxcbiAgICBsb2FkZXJIdG1sOiAnJyxcbiAgICBzaG93TG9hZGVyT25Db25maXJtOiBmYWxzZSxcbiAgICBzaG93TG9hZGVyT25EZW55OiBmYWxzZSxcbiAgICBpbWFnZVVybDogdW5kZWZpbmVkLFxuICAgIGltYWdlV2lkdGg6IHVuZGVmaW5lZCxcbiAgICBpbWFnZUhlaWdodDogdW5kZWZpbmVkLFxuICAgIGltYWdlQWx0OiAnJyxcbiAgICB0aW1lcjogdW5kZWZpbmVkLFxuICAgIHRpbWVyUHJvZ3Jlc3NCYXI6IGZhbHNlLFxuICAgIHdpZHRoOiB1bmRlZmluZWQsXG4gICAgcGFkZGluZzogdW5kZWZpbmVkLFxuICAgIGJhY2tncm91bmQ6IHVuZGVmaW5lZCxcbiAgICBpbnB1dDogdW5kZWZpbmVkLFxuICAgIGlucHV0UGxhY2Vob2xkZXI6ICcnLFxuICAgIGlucHV0TGFiZWw6ICcnLFxuICAgIGlucHV0VmFsdWU6ICcnLFxuICAgIGlucHV0T3B0aW9uczoge30sXG4gICAgaW5wdXRBdXRvVHJpbTogdHJ1ZSxcbiAgICBpbnB1dEF0dHJpYnV0ZXM6IHt9LFxuICAgIGlucHV0VmFsaWRhdG9yOiB1bmRlZmluZWQsXG4gICAgcmV0dXJuSW5wdXRWYWx1ZU9uRGVueTogZmFsc2UsXG4gICAgdmFsaWRhdGlvbk1lc3NhZ2U6IHVuZGVmaW5lZCxcbiAgICBncm93OiBmYWxzZSxcbiAgICBwb3NpdGlvbjogJ2NlbnRlcicsXG4gICAgcHJvZ3Jlc3NTdGVwczogW10sXG4gICAgY3VycmVudFByb2dyZXNzU3RlcDogdW5kZWZpbmVkLFxuICAgIHByb2dyZXNzU3RlcHNEaXN0YW5jZTogdW5kZWZpbmVkLFxuICAgIG9uQmVmb3JlT3BlbjogdW5kZWZpbmVkLFxuICAgIG9uT3BlbjogdW5kZWZpbmVkLFxuICAgIHdpbGxPcGVuOiB1bmRlZmluZWQsXG4gICAgZGlkT3BlbjogdW5kZWZpbmVkLFxuICAgIG9uUmVuZGVyOiB1bmRlZmluZWQsXG4gICAgZGlkUmVuZGVyOiB1bmRlZmluZWQsXG4gICAgb25DbG9zZTogdW5kZWZpbmVkLFxuICAgIG9uQWZ0ZXJDbG9zZTogdW5kZWZpbmVkLFxuICAgIHdpbGxDbG9zZTogdW5kZWZpbmVkLFxuICAgIGRpZENsb3NlOiB1bmRlZmluZWQsXG4gICAgb25EZXN0cm95OiB1bmRlZmluZWQsXG4gICAgZGlkRGVzdHJveTogdW5kZWZpbmVkLFxuICAgIHNjcm9sbGJhclBhZGRpbmc6IHRydWVcbiAgfTtcbiAgdmFyIHVwZGF0YWJsZVBhcmFtcyA9IFsnYWxsb3dFc2NhcGVLZXknLCAnYWxsb3dPdXRzaWRlQ2xpY2snLCAnYmFja2dyb3VuZCcsICdidXR0b25zU3R5bGluZycsICdjYW5jZWxCdXR0b25BcmlhTGFiZWwnLCAnY2FuY2VsQnV0dG9uQ29sb3InLCAnY2FuY2VsQnV0dG9uVGV4dCcsICdjbG9zZUJ1dHRvbkFyaWFMYWJlbCcsICdjbG9zZUJ1dHRvbkh0bWwnLCAnY29uZmlybUJ1dHRvbkFyaWFMYWJlbCcsICdjb25maXJtQnV0dG9uQ29sb3InLCAnY29uZmlybUJ1dHRvblRleHQnLCAnY3VycmVudFByb2dyZXNzU3RlcCcsICdjdXN0b21DbGFzcycsICdkZW55QnV0dG9uQXJpYUxhYmVsJywgJ2RlbnlCdXR0b25Db2xvcicsICdkZW55QnV0dG9uVGV4dCcsICdkaWRDbG9zZScsICdkaWREZXN0cm95JywgJ2Zvb3RlcicsICdoaWRlQ2xhc3MnLCAnaHRtbCcsICdpY29uJywgJ2ljb25Db2xvcicsICdpbWFnZUFsdCcsICdpbWFnZUhlaWdodCcsICdpbWFnZVVybCcsICdpbWFnZVdpZHR
8443oJywgJ29uQWZ0ZXJDbG9zZScsICdvbkNsb3NlJywgJ29uRGVzdHJveScsICdwcm9ncmVzc1N0ZXBzJywgJ3JldmVyc2VCdXR0b25zJywgJ3Nob3dDYW5jZWxCdXR0b24nLCAnc2hvd0Nsb3NlQnV0dG9uJywgJ3Nob3dDb25maXJtQnV0dG9uJywgJ3Nob3dEZW55QnV0dG9uJywgJ3RleHQnLCAndGl0bGUnLCAndGl0bGVUZXh0JywgJ3dpbGxDbG9zZSddO1xuICB2YXIgZGVwcmVjYXRlZFBhcmFtcyA9IHtcbiAgICBhbmltYXRpb246ICdzaG93Q2xhc3NcIiBhbmQgXCJoaWRlQ2xhc3MnLFxuICAgIG9uQmVmb3JlT3BlbjogJ3dpbGxPcGVuJyxcbiAgICBvbk9wZW46ICdkaWRPcGVuJyxcbiAgICBvblJlbmRlcjogJ2RpZFJlbmRlcicsXG4gICAgb25DbG9zZTogJ3dpbGxDbG9zZScsXG4gICAgb25BZnRlckNsb3NlOiAnZGlkQ2xvc2UnLFxuICAgIG9uRGVzdHJveTogJ2RpZERlc3Ryb3knXG4gIH07XG4gIHZhciB0b2FzdEluY29tcGF0aWJsZVBhcmFtcyA9IFsnYWxsb3dPdXRzaWRlQ2xpY2snLCAnYWxsb3dFbnRlcktleScsICdiYWNrZHJvcCcsICdmb2N1c0NvbmZpcm0nLCAnZm9jdXNEZW55JywgJ2ZvY3VzQ2FuY2VsJywgJ2hlaWdodEF1dG8nLCAna2V5ZG93bkxpc3RlbmVyQ2FwdHVyZSddO1xuICAvKipcbiAgICogSXMgdmFsaWQgcGFyYW1ldGVyXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwYXJhbU5hbWVcbiAgICovXG5cbiAgdmFyIGlzVmFsaWRQYXJhbWV0ZXIgPSBmdW5jdGlvbiBpc1ZhbGlkUGFyYW1ldGVyKHBhcmFtTmFtZSkge1xuICAgIHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZGVmYXVsdFBhcmFtcywgcGFyYW1OYW1lKTtcbiAgfTtcbiAgLyoqXG4gICAqIElzIHZhbGlkIHBhcmFtZXRlciBmb3IgU3dhbC51cGRhdGUoKSBtZXRob2RcbiAgICogQHBhcmFtIHtTdHJpbmd9IHBhcmFtTmFtZVxuICAgKi9cblxuICB2YXIgaXNVcGRhdGFibGVQYXJhbWV0ZXIgPSBmdW5jdGlvbiBpc1VwZGF0YWJsZVBhcmFtZXRlcihwYXJhbU5hbWUpIHtcbiAgICByZXR1cm4gdXBkYXRhYmxlUGFyYW1zLmluZGV4T2YocGFyYW1OYW1lKSAhPT0gLTE7XG4gIH07XG4gIC8qKlxuICAgKiBJcyBkZXByZWNhdGVkIHBhcmFtZXRlclxuICAgKiBAcGFyYW0ge1N0cmluZ30gcGFyYW1OYW1lXG4gICAqL1xuXG4gIHZhciBpc0RlcHJlY2F0ZWRQYXJhbWV0ZXIgPSBmdW5jdGlvbiBpc0RlcHJlY2F0ZWRQYXJhbWV0ZXIocGFyYW1OYW1lKSB7XG4gICAgcmV0dXJuIGRlcHJlY2F0ZWRQYXJhbXNbcGFyYW1OYW1lXTtcbiAgfTtcblxuICB2YXIgY2hlY2tJZlBhcmFtSXNWYWxpZCA9IGZ1bmN0aW9uIGNoZWNrSWZQYXJhbUlzVmFsaWQocGFyYW0pIHtcbiAgICBpZiAoIWlzVmFsaWRQYXJhbWV0ZXIocGFyYW0pKSB7XG4gICAgICB3YXJuKFwiVW5rbm93biBwYXJhbWV0ZXIgXFxcIlwiLmNvbmNhdChwYXJhbSwgXCJcXFwiXCIpKTtcbiAgICB9XG4gIH07XG5cbiAgdmFyIGNoZWNrSWZUb2FzdFBhcmFtSXNWYWxpZCA9IGZ1bmN0aW9uIGNoZWNrSWZUb2FzdFBhcmFtSXNWYWxpZChwYXJhbSkge1xuICAgIGlmICh0b2FzdEluY29tcGF0aWJsZVBhcmFtcy5pbmRleE9mKHBhcmFtKSAhPT0gLTEpIHtcbiAgICAgIHdhcm4oXCJUaGUgcGFyYW1ldGVyIFxcXCJcIi5jb25jYXQocGFyYW0sIFwiXFxcIiBpcyBpbmNvbXBhdGlibGUgd2l0aCB0b2FzdHNcIikpO1xuICAgIH1cbiAgfTtcblxuICB2YXIgY2hlY2tJZlBhcmFtSXNEZXByZWNhdGVkID0gZnVuY3Rpb24gY2hlY2tJZlBhcmFtSXNEZXByZWNhdGVkKHBhcmFtKSB7XG4gICAgaWYgKGlzRGVwcmVjYXRlZFBhcmFtZXRlcihwYXJhbSkpIHtcbiAgICAgIHdhcm5BYm91dERlcHJlY2F0aW9uKHBhcmFtLCBpc0RlcHJlY2F0ZWRQYXJhbWV0ZXIocGFyYW0pKTtcbiAgICB9XG4gIH07XG4gIC8qKlxuICAgKiBTaG93IHJlbGV2YW50IHdhcm5pbmdzIGZvciBnaXZlbiBwYXJhbXNcbiAgICpcbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKi9cblxuXG4gIHZhciBzaG93V2FybmluZ3NGb3JQYXJhbXMgPSBmdW5jdGlvbiBzaG93V2FybmluZ3NGb3JQYXJhbXMocGFyYW1zKSB7XG4gICAgZm9yICh2YXIgcGFyYW0gaW4gcGFyYW1zKSB7XG4gICAgICBjaGVja0lmUGFyYW1Jc1ZhbGlkKHBhcmFtKTtcblxuICAgICAgaWYgKHBhcmFtcy50b2FzdCkge1xuICAgICAgICBjaGVja0lmVG9hc3RQYXJhbUlzVmFsaWQocGFyYW0pO1xuICAgICAgfVxuXG4gICAgICBjaGVja0lmUGFyYW1Jc0RlcHJlY2F0ZWQocGFyYW0pO1xuICAgIH1cbiAgfTtcblxuXG5cbiAgdmFyIHN0YXRpY01ldGhvZHMgPSAvKiNfX1BVUkVfXyovT2JqZWN0LmZyZWV6ZSh7XG4gICAgaXNWYWxpZFBhcmFtZXRlcjogaXNWYWxpZFBhcmFtZXRlcixcbiAgICBpc1VwZGF0YWJsZVBhcmFtZXRlcjogaXNVcGRhdGFibGVQYXJhbWV0ZXIsXG4gICAgaXNEZXByZWNhdGVkUGFyYW1ldGVyOiBpc0RlcHJlY2F0ZWRQYXJhbWV0ZXIsXG4gICAgYXJnc1RvUGFyYW1zOiBhcmdzVG9QYXJhbXMsXG4gICAgaXNWaXNpYmxlOiBpc1Zpc2libGUkMSxcbiAgICBjbGlja0NvbmZpcm06IGNsaWNrQ29uZmlybSxcbiAgICBjbGlja0Rlbnk6IGNsaWNrRGVueSxcbiAgICBjbGlja0NhbmNlbDogY2xpY2tDYW5jZWwsXG4gICAgZ2V0Q29udGFpbmVyOiBnZXRDb250YWluZXIsXG4gICAgZ2V0UG9wdXA6IGdldFBvcHVwLFxuICAgIGdldFRpdGxlOiBnZXRUaXRsZSxcbiAgICBnZXRDb250ZW50OiBnZXRDb250ZW50LFxuICAgIGdldEh0bWxDb250YWluZXI6IGdldEh0bWxDb250YWluZXIsXG4gICAgZ2V0SW1hZ2U6IGdldEltYWdlLFxuICAgIGdldEljb246IGdldEljb24sXG4gICAgZ2V0SWNvbnM6IGdldEljb25zLFxuICAgIGdldElucHV0TGFiZWw6IGdldElucHV0TGFiZWwsXG4gICAgZ2V0Q2xvc2VCdXR0b246IGdldENsb3NlQnV0dG9uLFxuICAgIGdldEFjdGlvbnM6IGdldEFjdGlvbnMsXG4gICAgZ2V0Q29uZmlybUJ1dHRvbjogZ2V0Q29uZmlybUJ1dHRvbixcbiAgICBnZXREZW55QnV0dG9uOiBnZXREZW55QnV0dG9uLFxuICAgIGdldENhbmNlbEJ1dHRvbjogZ2V0Q2FuY2VsQnV0dG9uLFxuICAgIGdldExvYWRlcjogZ2V0TG9hZGVyLFxuICAgIGdldEhlYWRlcjogZ2V0SGVhZGVyLFxuICAgIGdldEZvb3RlcjogZ2V0Rm9vdGVyLFxuICAgIGdldFRpbWVyUHJvZ3Jlc3NCYXI6IGdldFRpbWVyUHJvZ3Jlc3NCYXIsXG4gICAgZ2V0Rm9jdXNhYmxlRWxlbWVudHM6IGdldEZvY3VzYWJsZUVsZW1lbnRzLFxuICAgIGdldFZhbGlkYXRpb25NZXNzYWdlOiBnZXRWYWxpZGF0aW9uTWVzc2FnZSxcbiAgICBpc0xvYWRpbmc6IGlzTG9hZGluZyxcbiAgICBmaXJlOiBmaXJlLFxuICAgIG1peGluOiBtaXhpbixcbiAgICBxdWV1ZTogcXVldWUsXG4gICAgZ2V0UXVldWVTdGVwOiBnZXRRdWV1ZVN0ZXAsXG4gICAgaW5zZXJ0UXVldWVTdGVwOiBpbnNlcnRRdWV1ZVN0ZXAsXG4gICAgZGVsZXRlUXVldWVTdGVwOiBkZWxldGVRdWV1ZVN0ZXAsXG4gICAgc2hvd0xvYWRpbmc6IHNob3dMb2FkaW5nLFxuICAgIGVuYWJsZUxvYWRpbmc6IHNob3dMb2FkaW5nLFxuICAgIGdldFRpbWVyTGVmdDogZ2V0VGltZXJMZWZ0LFxuICAgIHN0b3BUaW1lcjogc3RvcFRpbWVyLFxuICAgIHJlc3VtZVRpbWVyOiByZXN1bWVUaW
84431lcixcbiAgICB0b2dnbGVUaW1lcjogdG9nZ2xlVGltZXIsXG4gICAgaW5jcmVhc2VUaW1lcjogaW5jcmVhc2VUaW1lcixcbiAgICBpc1RpbWVyUnVubmluZzogaXNUaW1lclJ1bm5pbmcsXG4gICAgYmluZENsaWNrSGFuZGxlcjogYmluZENsaWNrSGFuZGxlclxuICB9KTtcblxuICAvKipcbiAgICogSGlkZXMgbG9hZGVyIGFuZCBzaG93cyBiYWNrIHRoZSBidXR0b24gd2hpY2ggd2FzIGhpZGRlbiBieSAuc2hvd0xvYWRpbmcoKVxuICAgKi9cblxuICBmdW5jdGlvbiBoaWRlTG9hZGluZygpIHtcbiAgICAvLyBkbyBub3RoaW5nIGlmIHBvcHVwIGlzIGNsb3NlZFxuICAgIHZhciBpbm5lclBhcmFtcyA9IHByaXZhdGVQcm9wcy5pbm5lclBhcmFtcy5nZXQodGhpcyk7XG5cbiAgICBpZiAoIWlubmVyUGFyYW1zKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIGRvbUNhY2hlID0gcHJpdmF0ZVByb3BzLmRvbUNhY2hlLmdldCh0aGlzKTtcbiAgICBoaWRlKGRvbUNhY2hlLmxvYWRlcik7XG4gICAgdmFyIGJ1dHRvblRvUmVwbGFjZSA9IGRvbUNhY2hlLnBvcHVwLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoZG9tQ2FjaGUubG9hZGVyLmdldEF0dHJpYnV0ZSgnZGF0YS1idXR0b24tdG8tcmVwbGFjZScpKTtcblxuICAgIGlmIChidXR0b25Ub1JlcGxhY2UubGVuZ3RoKSB7XG4gICAgICBzaG93KGJ1dHRvblRvUmVwbGFjZVswXSwgJ2lubGluZS1ibG9jaycpO1xuICAgIH0gZWxzZSBpZiAoYWxsQnV0dG9uc0FyZUhpZGRlbigpKSB7XG4gICAgICBoaWRlKGRvbUNhY2hlLmFjdGlvbnMpO1xuICAgIH1cblxuICAgIHJlbW92ZUNsYXNzKFtkb21DYWNoZS5wb3B1cCwgZG9tQ2FjaGUuYWN0aW9uc10sIHN3YWxDbGFzc2VzLmxvYWRpbmcpO1xuICAgIGRvbUNhY2hlLnBvcHVwLnJlbW92ZUF0dHJpYnV0ZSgnYXJpYS1idXN5Jyk7XG4gICAgZG9tQ2FjaGUucG9wdXAucmVtb3ZlQXR0cmlidXRlKCdkYXRhLWxvYWRpbmcnKTtcbiAgICBkb21DYWNoZS5jb25maXJtQnV0dG9uLmRpc2FibGVkID0gZmFsc2U7XG4gICAgZG9tQ2FjaGUuZGVueUJ1dHRvbi5kaXNhYmxlZCA9IGZhbHNlO1xuICAgIGRvbUNhY2hlLmNhbmNlbEJ1dHRvbi5kaXNhYmxlZCA9IGZhbHNlO1xuICB9XG5cbiAgZnVuY3Rpb24gZ2V0SW5wdXQkMShpbnN0YW5jZSkge1xuICAgIHZhciBpbm5lclBhcmFtcyA9IHByaXZhdGVQcm9wcy5pbm5lclBhcmFtcy5nZXQoaW5zdGFuY2UgfHwgdGhpcyk7XG4gICAgdmFyIGRvbUNhY2hlID0gcHJpdmF0ZVByb3BzLmRvbUNhY2hlLmdldChpbnN0YW5jZSB8fCB0aGlzKTtcblxuICAgIGlmICghZG9tQ2FjaGUpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHJldHVybiBnZXRJbnB1dChkb21DYWNoZS5jb250ZW50LCBpbm5lclBhcmFtcy5pbnB1dCk7XG4gIH1cblxuICB2YXIgZml4U2Nyb2xsYmFyID0gZnVuY3Rpb24gZml4U2Nyb2xsYmFyKCkge1xuICAgIC8vIGZvciBxdWV1ZXMsIGRvIG5vdCBkbyB0aGlzIG1vcmUgdGhhbiBvbmNlXG4gICAgaWYgKHN0YXRlcy5wcmV2aW91c0JvZHlQYWRkaW5nICE9PSBudWxsKSB7XG4gICAgICByZXR1cm47XG4gICAgfSAvLyBpZiB0aGUgYm9keSBoYXMgb3ZlcmZsb3dcblxuXG4gICAgaWYgKGRvY3VtZW50LmJvZHkuc2Nyb2xsSGVpZ2h0ID4gd2luZG93LmlubmVySGVpZ2h0KSB7XG4gICAgICAvLyBhZGQgcGFkZGluZyBzbyB0aGUgY29udGVudCBkb2Vzbid0IHNoaWZ0IGFmdGVyIHJlbW92YWwgb2Ygc2Nyb2xsYmFyXG4gICAgICBzdGF0ZXMucHJldmlvdXNCb2R5UGFkZGluZyA9IHBhcnNlSW50KHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGRvY3VtZW50LmJvZHkpLmdldFByb3BlcnR5VmFsdWUoJ3BhZGRpbmctcmlnaHQnKSk7XG4gICAgICBkb2
8443N1bWVudC5ib2R5LnN0eWxlLnBhZGRpbmdSaWdodCA9IFwiXCIuY29uY2F0KHN0YXRlcy5wcmV2aW91c0JvZHlQYWRkaW5nICsgbWVhc3VyZVNjcm9sbGJhcigpLCBcInB4XCIpO1xuICAgIH1cbiAgfTtcbiAgdmFyIHVuZG9TY3JvbGxiYXIgPSBmdW5jdGlvbiB1bmRvU2Nyb2xsYmFyKCkge1xuICAgIGlmIChzdGF0ZXMucHJldmlvdXNCb2R5UGFkZGluZyAhPT0gbnVsbCkge1xuICAgICAgZG9jdW1lbnQuYm9keS5zdHlsZS5wYWRkaW5nUmlnaHQgPSBcIlwiLmNvbmNhdChzdGF0ZXMucHJldmlvdXNCb2R5UGFkZGluZywgXCJweFwiKTtcbiAgICAgIHN0YXRlcy5wcmV2aW91c0JvZHlQYWRkaW5nID0gbnVsbDtcbiAgICB9XG4gIH07XG5cbiAgLyogaXN0YW5idWwgaWdub3JlIGZpbGUgKi9cblxuICB2YXIgaU9TZml4ID0gZnVuY3Rpb24gaU9TZml4KCkge1xuICAgIHZhciBpT1MgPSAvaVBhZHxpUGhvbmV8aVBvZC8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSAmJiAhd2luZG93Lk1TU3RyZWFtIHx8IG5hdmlnYXRvci5wbGF0Zm9ybSA9PT0gJ01hY0ludGVsJyAmJiBuYXZpZ2F0b3IubWF4VG91Y2hQb2ludHMgPiAxO1xuXG4gICAgaWYgKGlPUyAmJiAhaGFzQ2xhc3MoZG9jdW1lbnQuYm9keSwgc3dhbENsYXNzZXMuaW9zZml4KSkge1xuICAgICAgdmFyIG9mZnNldCA9IGRvY3VtZW50LmJvZHkuc2Nyb2xsVG9wO1xuICAgICAgZG9jdW1lbnQuYm9keS5zdHlsZS50b3AgPSBcIlwiLmNvbmNhdChvZmZzZXQgKiAtMSwgXCJweFwiKTtcbiAgICAgIGFkZENsYXNzKGRvY3VtZW50LmJvZHksIHN3YWxDbGFzc2VzLmlvc2ZpeCk7XG4gICAgICBsb2NrQm9keVNjcm9sbCgpO1xuICAgICAgYWRkQm90dG9tUGFkZGluZ0ZvclRhbGxQb3B1cHMoKTsgLy8gIzE5NDhcbiAgICB9XG4gIH07XG5cbiAgdmFyIGFkZEJvdHRvbVBhZGRpbmdGb3JUYWxsUG9wdXBzID0gZnVuY3Rpb24gYWRkQm90dG9tUGFkZGluZ0ZvclRhbGxQb3B1cHMoKSB7XG4gICAgdmFyIHNhZmFyaSA9ICFuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC8oQ3JpT1N8RnhpT1N8RWRnaU9TfFlhQnJvd3NlcnxVQ0Jyb3dzZXIpL2kpO1xuXG4gICAgaWYgKHNhZmFyaSkge1xuICAgICAgdmFyIGJvdHRvbVBhbmVsSGVpZ2h0ID0gNDQ7XG5cbiAgICAgIGlmIChnZXRQb3B1cCgpLnNjcm9sbEhlaWdodCA+IHdpbmRvdy5pbm5lckhlaWdodCAtIGJvdHRvbVBhbmVsSGVpZ2h0KSB7XG4gICAgICAgIGdldENvbnRhaW5lcigpLnN0eWxlLnBhZGRpbmdCb3R0b20gPSBcIlwiLmNvbmNhdChib3R0b21QYW5lbEhlaWdodCwgXCJweFwiKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgdmFyIGxvY2tCb2R5U2Nyb2xsID0gZnVuY3Rpb24gbG9ja0JvZHlTY3JvbGwoKSB7XG4gICAgLy8gIzEyNDZcbiAgICB2YXIgY29udGFpbmVyID0gZ2V0Q29udGFpbmVyKCk7XG4gICAgdmFyIHByZXZlbnRUb3VjaE1vdmU7XG5cbiAgICBjb250YWluZXIub250b3VjaHN0YXJ0ID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgIHByZXZlbnRUb3VjaE1vdmUgPSBzaG91bGRQcmV2ZW50VG91Y2hNb3ZlKGUpO1xuICAgIH07XG5cbiAgICBjb250YWluZXIub250b3VjaG1vdmUgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgaWYgKHByZXZlbnRUb3VjaE1vdmUpIHtcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgfVxuICAgIH07XG4gIH07XG5cbiAgdmFyIHNob3VsZFByZXZlbnRUb3VjaE1vdmUgPSBmdW5jdGlvbiBzaG91bGRQcmV2ZW50VG91Y2hNb3ZlKGV2ZW50KSB7XG4gICAgdmFyIHRhcmdldCA9IGV2ZW50LnRhcmdldDtcbiAgICB2YXIgY29udGFpbmVyID0gZ2V0Q29udGFpbmVyKCk7XG5cbiAgICBpZiAoaXNTdHlseXMoZXZlbnQpIHx8IGlzWm9vbShldmVudCkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAodGFyZ2V0ID09PSBjb250YWluZXIpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGlmICghaXNTY3JvbGxhYmxlKGNvbnRhaW5lcikgJiYgdGFyZ2V0LnRhZ05hbWUgIT09ICdJTlBVVCcgJiYgLy8gIzE2MDNcbiAgICAhKGlzU2Nyb2xsYWJsZShnZXRDb250ZW50KCkpICYmIC8vICMxOTQ0XG4gICAgZ2V0Q29udGVudCgpLmNvbnRhaW5zKHRhcmdldCkpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH07XG5cbiAgdmFyIGlzU3R5bHlzID0gZnVuY3Rpb24gaXNTdHlseXMoZXZlbnQpIHtcbiAgICAvLyAjMTc4NlxuICAgIHJldHVybiBldmVudC50b3VjaGVzICYmIGV2ZW50LnRvdWNoZXMubGVuZ3RoICYmIGV2ZW50LnRvdWNoZXNbMF0udG91Y2hUeXBlID09PSAnc3R5bHVzJztcbiAgfTtcblxuICB2YXIgaXNab29tID0gZnVuY3Rpb24gaXNab29tKGV2ZW50KSB7XG4gICAgLy8gIzE4OTFcbiAgICByZXR1cm4gZXZlbnQudG91Y2hlcyAmJiBldmVudC50b3VjaGVzLmxlbmd0aCA+IDE7XG4gIH07XG5cbiAgdmFyIHVuZG9JT1NmaXggPSBmdW5jdGlvbiB1bmRvSU9TZml4KCkge1xuICAgIGlmIChoYXNDbGFzcyhkb2N1bWVudC5ib2R5LCBzd2FsQ2xhc3Nlcy5pb3NmaXgpKSB7XG4gICAgICB2Y
8443XIgb2Zmc2V0ID0gcGFyc2VJbnQoZG9jdW1lbnQuYm9keS5zdHlsZS50b3AsIDEwKTtcbiAgICAgIHJlbW92ZUNsYXNzKGRvY3VtZW50LmJvZHksIHN3YWxDbGFzc2VzLmlvc2ZpeCk7XG4gICAgICBkb2N1bWVudC5ib2R5LnN0eWxlLnRvcCA9ICcnO1xuICAgICAgZG9jdW1lbnQuYm9keS5zY3JvbGxUb3AgPSBvZmZzZXQgKiAtMTtcbiAgICB9XG4gIH07XG5cbiAgLyogaXN0YW5idWwgaWdub3JlIGZpbGUgKi9cblxuICB2YXIgaXNJRTExID0gZnVuY3Rpb24gaXNJRTExKCkge1xuICAgIHJldHVybiAhIXdpbmRvdy5NU0lucHV0TWV0aG9kQ29udGV4dCAmJiAhIWRvY3VtZW50LmRvY3VtZW50TW9kZTtcbiAgfTsgLy8gRml4IElFMTEgY2VudGVyaW5nIHN3ZWV0YWxlcnQyL2lzc3Vlcy85MzNcblxuXG4gIHZhciBmaXhWZXJ0aWNhbFBvc2l0aW9uSUUgPSBmdW5jdGlvbiBmaXhWZXJ0aWNhbFBvc2l0aW9uSUUoKSB7XG4gICAgdmFyIGNvbnRhaW5lciA9IGdldENvbnRhaW5lcigpO1xuICAgIHZhciBwb3B1cCA9IGdldFBvcHVwKCk7XG4gICAgY29udGFpbmVyLnN0eWxlLnJlbW92ZVByb3BlcnR5KCdhbGlnbi1pdGVtcycpO1xuXG4gICAgaWYgKHBvcHVwLm9mZnNldFRvcCA8IDApIHtcbiAgICAgIGNvbnRhaW5lci5zdHlsZS5hbGlnbkl0ZW1zID0gJ2ZsZXgtc3RhcnQnO1xuICAgIH1cbiAgfTtcblxuICB2YXIgSUVmaXggPSBmdW5jdGlvbiBJRWZpeCgpIHtcbiAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgaXNJRTExKCkpIHtcbiAgICAgIGZpeFZlcnRpY2FsUG9zaXRpb25JRSgpO1xuICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIGZpeFZlcnRpY2FsUG9zaXRpb25JRSk7XG4gICAgfVxuICB9O1xuICB2YXIgdW5kb0lFZml4ID0gZnVuY3Rpb24gdW5kb0lFZml4KCkge1xuICAgIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiBpc0lFMTEoKSkge1xuICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIGZpeFZlcnRpY2FsUG9zaXRpb25JRSk7XG4gICAgfVxuICB9O1xuXG4gIC8vIEFkZGluZyBhcmlhLWhpZGRlbj1cInRydWVcIiB0byBlbGVtZW50cyBvdXRzaWRlIG9mIHRoZSBhY3RpdmUgbW9kYWwgZGlhbG9nIGVuc3VyZXMgdGhhdFxuICAvLyBlbGVtZW50cyBub3Qgd2l0aGluIHRoZSBhY3RpdmUgbW9kYWwgZGlhbG9nIHdpbGwgbm90IGJlIHN1cmZhY2VkIGlmIGEgdXNlciBvcGVucyBhIHNjcmVlblxuICAvLyByZWFkZXLigJlzIGxpc3Qgb2YgZWxlbWVudHMgKGhlYWRpbmdzLCBmb3JtIGNvbnRyb2xzLCBsYW5kbWFya3MsIGV0Yy4pIGluIHRoZSBkb2N1bWVudC5cblxuICB2YXIgc2V0QXJpYUhpZGRlbiA9IGZ1bmN0aW9uIHNldEFyaWFIaWRkZW4oKSB7XG4gICAgdmFyIGJvZHlDaGlsZHJlbiA9IHRvQXJyYXkoZG9jdW1lbnQuYm9keS5jaGlsZHJlbik7XG4gICAgYm9keUNoaWxkcmVuLmZvckVhY2goZnVuY3Rpb24gKGVsKSB7XG4gICAgICBpZiAoZWwgPT09IGdldENvbnRhaW5lcigpIHx8IGNvbnRhaW5zKGVsLCBnZXRDb250YWluZXIoKSkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoZWwuaGFzQXR0cmlidXRlKCdhcmlhLWhpZGRlbicpKSB7XG4gICAgICAgIGVsLnNldEF0dHJpYnV0ZSgnZGF0YS1wcmV2aW91cy1hcmlhLWhpZGRlbicsIGVsLmdldEF0dHJpYnV0ZSgnYXJpYS1oaWRkZW4nKSk7XG4gICAgICB9XG5cbiAgICAgIGVsLnNldEF0dHJpYnV0ZSgnYXJpYS1oaWRkZW4nLCAndHJ1ZScpO1xuICAgIH0pO1xuICB9O1xuICB2YXIgdW5zZXRBcmlhSGlkZGVuID0gZnVuY3Rpb24gdW5zZXRBcmlhSGlkZGVuKCkge1xuICAgIHZhciBib2R5Q2hpbGRyZW4gPSB0b0FycmF5KGRvY3VtZW50LmJvZHkuY2hpbGRyZW4pO1xuICAgIGJvZHlDaGlsZHJlbi5mb3JFYWNoKGZ1bmN0aW9uIChlbCkge1xuICAgICAgaWYgKGVsLmhhc0F0dHJpYnV0ZSgnZGF0YS1wcmV2aW91cy1hcmlhLWhpZGRlbicpKSB7XG4gICAgICAgIGVsLnNldEF0dHJpYnV0ZSgnYXJpYS1oaWRkZW4nLCBlbC5nZXRBdHRyaWJ1dGUoJ2RhdGEtcHJldmlvdXMtYXJpYS1oaWRkZW4nKSk7XG4gICAgICAgIGVsLnJlbW92ZUF0dHJpYnV0ZSgnZGF0YS1wcmV2aW91cy1hcmlhLWhpZGRlbicpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZWwucmVtb3ZlQXR0cmlidXRlKCdhcmlhLWhpZGRlbicpO1xuICAgICAgfVxuICAgIH0pO1xuICB9O1xuXG4gIC8qKlxuICAgKiBUaGlzIG1vZHVsZSBjb250YWludHMgYFdlYWtNYXBgcyBmb3IgZWFjaCBlZmZlY3RpdmVseS1cInByaXZhdGUgIHByb3BlcnR5XCIgdGhhdCBhIGBTd2FsYCBoYXMuXG4gICAqIEZvciBleGFtcGxlLCB0byBzZXQgdGhlIHByaXZhdGUgcHJvcGVydHkgXCJmb29cIiBvZiBgdGhpc2AgdG8gXCJiYXJcIiwgeW91IGNhbiBgcHJpdmF0ZVByb3BzLmZvby5zZXQodGhpcywgJ2JhcicpYFxuICAgKiBUaGlzIGlzIHRoZSBhcHByb2FjaCB0aGF0IEJhYmVsIHdpbGwgcHJvYmFibHkgdGFrZSB0byBpbXBsZW1lbnQgcHJpdmF0ZSBtZXRob2RzL2ZpZWxkc1xuICAgKiAgIGh0dHBzOi8vZ2l0aHViLmNvbS90YzM5L3Byb3Bvc2FsLXByaXZhdGUtbWV0aG9kc1xuICAgKiAgIGh0dHBzOi8vZ2l0aHViLmNvbS9iYWJlbC9iYWJlbC9wdWxsLzc1NTVcbiAgICogT25jZSB3ZSBoYXZlIHRoZSBjaGFuZ2VzIGZyb20gdGhhdCBQUiBpbiBCYWJlbCwgYW5kIG91ciBjb3JlIGNsYXNzIGZpdHMgcmVhc29uYWJsZSBpbiAqb25lIG1vZHVsZSpcbiAgICogICB0aGVuIHdlIGNhbiB1c2UgdGhhdCBsYW5ndWFnZSBmZWF0dXJlLlxuICAgKi9cbiAgdmFyIHByaXZhdGVNZXRob2RzID0ge1xuICAgIHN3YWxQcm9taXNlUmVzb2x2ZTogbmV3IFdlYWtNYXAoKVxuICB9O1xuXG4gIC8qXG4gICAqIEluc3RhbmNlIG1ldGhvZCB0byBjbG9zZSBzd2VldEFsZXJ0XG4gICAqL1xuXG4gIGZ1bmN0aW9uIHJlbW92ZVBvcHVwQW5kUmVzZXRTdGF0ZShpbnN0YW5jZSwgY29udGFpbmVyLCBpc1RvYXN0JCQxLCBkaWRDbG9zZSkge1xuICAgIGlmIChpc1RvYXN0JCQxKSB7XG4gICAgICB0cmlnZ2VyRGlkQ2xvc2VBbmREaXNwb3NlKGluc3RhbmNlLCBkaWRDbG9zZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc3RvcmVBY3RpdmVFbGVtZW50KCkudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICAgI
8443HJldHVybiB0cmlnZ2VyRGlkQ2xvc2VBbmREaXNwb3NlKGluc3RhbmNlLCBkaWRDbG9zZSk7XG4gICAgICB9KTtcbiAgICAgIGdsb2JhbFN0YXRlLmtleWRvd25UYXJnZXQucmVtb3ZlRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIGdsb2JhbFN0YXRlLmtleWRvd25IYW5kbGVyLCB7XG4gICAgICAgIGNhcHR1cmU6IGdsb2JhbFN0YXRlLmtleWRvd25MaXN0ZW5lckNhcHR1cmVcbiAgICAgIH0pO1xuICAgICAgZ2xvYmFsU3RhdGUua2V5ZG93bkhhbmRsZXJBZGRlZCA9IGZhbHNlO1xuICAgIH1cblxuICAgIGlmIChjb250YWluZXIucGFyZW50Tm9kZSAmJiAhZG9jdW1lbnQuYm9keS5nZXRBdHRyaWJ1dGUoJ2RhdGEtc3dhbDItcXVldWUtc3RlcCcpKSB7XG4gICAgICBjb250YWluZXIucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChjb250YWluZXIpO1xuICAgIH1cblxuICAgIGlmIChpc01vZGFsKCkpIHtcbiAgICAgIHVuZG9TY3JvbGxiYXIoKTtcbiAgICAgIHVuZG9JT1NmaXgoKTtcbiAgICAgIHVuZG9JRWZpeCgpO1xuICAgICAgdW5zZXRBcmlhSGlkZGVuKCk7XG4gICAgfVxuXG4gICAgcmVtb3ZlQm9keUNsYXNzZXMoKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHJlbW92ZUJvZHlDbGFzc2VzKCkge1xuICAgIHJlbW92ZUNsYXNzKFtkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsIGRvY3VtZW50LmJvZHldLCBbc3dhbENsYXNzZXMuc2hvd24sIHN3YWxDbGFzc2VzWydoZWlnaHQtYXV0byddLCBzd2FsQ2xhc3Nlc1snbm8tYmFja2Ryb3AnXSwgc3dhbENsYXNzZXNbJ3RvYXN0LXNob3duJ10sIHN3YWxDbGFzc2VzWy
8443d0b2FzdC1jb2x1bW4nXV0pO1xuICB9XG5cbiAgZnVuY3Rpb24gY2xvc2UocmVzb2x2ZVZhbHVlKSB7XG4gICAgdmFyIHBvcHVwID0gZ2V0UG9wdXAoKTtcblxuICAgIGlmICghcG9wdXApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICByZXNvbHZlVmFsdWUgPSBwcmVwYXJlUmVzb2x2ZVZhbHVlKHJlc29sdmVWYWx1ZSk7XG4gICAgdmFyIGlubmVyUGFyYW1zID0gcHJpdmF0ZVByb3BzLmlubmVyUGFyYW1zLmdldCh0aGlzKTtcblxuICAgIGlmICghaW5uZXJQYXJhbXMgfHwgaGFzQ2xhc3MocG9wdXAsIGlubmVyUGFyYW1zLmhpZGVDbGFzcy5wb3B1cCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgc3dhbFByb21pc2VSZXNvbHZlID0gcHJpdmF0ZU1ldGhvZHMuc3dhbFByb21pc2VSZXNvbHZlLmdldCh0aGlzKTtcbiAgICByZW1vdmVDbGFzcyhwb3B1cCwgaW5uZXJQYXJhbXMuc2hvd0NsYXNzLnBvcHVwKTtcbiAgICBhZGRDbGFzcyhwb3B1cCwgaW5uZXJQYXJhbXMuaGlkZUNsYXNzLnBvcHVwKTtcbiAgICB2YXIgYmFja2Ryb3AgPSBnZXRDb250YWluZXIoKTtcbiAgICByZW1vdmVDbGFzcyhiYWNrZHJvcCwgaW5uZXJQYXJhbXMuc2hvd0NsYXNzLmJhY2tkcm9wKTtcbiAgICBhZGRDbGFzcyhiYWNrZHJvcCwgaW5uZXJQYXJhbXMuaGlkZUNsYXNzLmJhY2tkcm9wKTtcbiAgICBoYW5kbGVQb3B1cEFuaW1hdGlvbih0aGlzLCBwb3B1cCwgaW5uZXJQYXJhbXMpOyAvLyBSZXNvbHZlIFN3YWwgcHJvbWlzZVxuXG4gICAgc3dhbFByb21pc2VSZXNvbHZlKHJlc29sdmVWYWx1ZSk7XG4gIH1cblxuICB2YXIgcHJlcGFyZVJlc29sdmVWYWx1ZSA9IGZ1bmN0aW9uIHByZXBhcmVSZXNvbHZlVmFsdWUocmVzb2x2ZVZhbHVlKSB7XG4gICAgLy8gV2hlbiB1c2VyIGNhbGxzIFN3YWwuY2xvc2UoKVxuICAgIGlmICh0eXBlb2YgcmVzb2x2ZVZhbHVlID09PSAndW5kZWZpbmVkJykge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgaXNDb25maXJtZWQ6IGZhbHNlLFxuICAgICAgICBpc0RlbmllZDogZmFsc2UsXG4gICAgICAgIGlzRGlzbWlzc2VkOiB0cnVlXG4gICAgICB9O1xuICAgIH1cblxuICAgIHJldHVybiBfZXh0ZW5kcyh7XG4gICAgICBpc0NvbmZpcm1lZDogZmFsc2UsXG4gICAgICBpc0RlbmllZDogZmFsc2UsXG4gICAgICBpc0Rpc21pc3NlZDogZmFsc2VcbiAgICB9LCByZXNvbHZlVmFsdWUpO1xuICB9O1xuXG4gIHZhciBoYW5kbGVQb3B1cEFuaW1hdGlvbiA9IGZ1bmN0aW9uIGhhbmRsZVBvcHVwQW5pbWF0aW9uKGluc3RhbmNlLCBwb3B1cCwgaW5uZXJQYXJhbXMpIHtcbiAgICB2YXIgY29udGFpbmVyID0gZ2V0Q29udGFpbmVyKCk7IC8vIElmIGFuaW1hdGlvbiBpcyBzdXBwb3J0ZWQsIGFuaW1hdGVcblxuICAgIHZhciBhbmltYXRpb25Jc1N1cHBvcnRlZCA9IGFuaW1hdGlvbkVuZEV2ZW50ICYmIGhhc0Nzc0FuaW1hdGlvbihwb3B1cCk7XG4gICAgdmFyIG9uQ2xvc2UgPSBpbm5lclBhcmFtcy5vbkNsb3NlLFxuICAgICAgICBvbkFmdGVyQ2xvc2UgPSBpbm5lclBhcmFtcy5vbkFmdGVyQ2xvc2UsXG4gICAgICAgIHdpbGxDbG9zZSA9IGlubmVyUGFyYW1zLndpbGxDbG9zZSxcbiAgICAgICAgZGlkQ2xvc2UgPSBpbm5lclBhcmFtcy5kaWRDbG9zZTtcbiAgICBydW5EaWRDbG9zZShwb3B1cCwgd2lsbENsb3NlLCBvbkNsb3NlKTtcblxuICAgIGlmIChhbmltYXRpb25Jc1N1cHBvcnRlZCkge1xuICAgICAgYW5pbWF0ZVBvcHVwKGluc3RhbmNlLCBwb3B1cCwgY29udGFpbmVyLCBkaWRDbG9zZSB8fCBvbkFmdGVyQ2xvc2UpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBPdGhlcndpc2UsIHJlbW92ZSBpbW1lZGlhdGVseVxuICAgICAgcmVtb3ZlUG9wdXBBbmRSZXNldFN0YXRlKGluc3RhbmNlLCBjb250YWluZXIsIGlzVG9hc3QoKSwgZGlkQ2xvc2UgfHwgb25BZnRlckNsb3NlKTtcbiAgICB9XG4gIH07XG5cbiAgdmFyIHJ1bkRpZENsb3NlID0gZnVuY3Rpb24gcnVuRGlkQ2xvc2UocG9wdXAsIHdpbGxDbG9zZSwgb25DbG9zZSkge1xuICAgIGlmICh3aWxsQ2xvc2UgIT09IG51bGwgJiYgdHlwZW9mIHdpbGxDbG9zZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgd2lsbENsb3NlKHBvcHVwKTtcbiAgICB9IGVsc2UgaWYgKG9uQ2xvc2UgIT09IG51bGwgJiYgdHlwZW9mIG9uQ2xvc2UgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIG9uQ2xvc2UocG9wdXApOyAvLyBAZGVwcmVjYXRlZFxuICAgIH1cbiAgfTtcblxuICB2YXIgYW5pbWF0ZVBvcHVwID0gZnVuY3Rpb24gYW5pbWF0ZVBvcHVwKGluc3RhbmNlLCBwb3B1cCwgY29udGFpbmVyLCBkaWRDbG9zZSkge1xuICAgIGdsb2JhbFN0YXRlLnN3YWxDbG9zZUV2ZW50RmluaXNoZWRDYWxsYmFjayA9IHJlbW92ZVBvcHVwQW5kUmVzZXRTdGF0ZS5iaW5kKG51bGwsIGluc3RhbmNlLCBjb250YWluZXIsIGlzVG9hc3QoKSwgZGlkQ2xvc2UpO1xuICAgIHBvcHVwLmFkZEV2ZW50TGlzdGVuZXIoYW5pbWF0aW9uRW5kRXZlbnQsIGZ1bmN0aW9uIChlKSB7XG4gICAgICBpZiAoZS50YXJnZXQgPT09IHBvcHVwKSB7XG4gICAgICAgIGdsb2JhbFN0YXRlLnN3YWxDbG9zZUV2ZW50RmluaXNoZWRDYWxsYmFjaygpO1xuICAgICAgICBkZWxldGUgZ2xvYmFsU3RhdGUuc3dhbENsb3NlRXZlbnRGaW5pc2hlZENhbGxiYWNrO1xuICAgICAgfVxuICAgIH0pO1xuICB9O1xuXG4gIHZhciB0cmlnZ2VyRGlkQ2xvc2VBbmREaXNwb3NlID0gZnVuY3Rpb24gdHJpZ2dlckRpZENsb3NlQW5kRGlzcG9zZShpbnN0YW5jZSwgZGlkQ2xvc2UpIHtcbiAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmICh0eXBlb2YgZGlkQ2xvc2UgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgZGlkQ2xvc2UoKTtcbiAgICAgIH1cblxuICAgICAgaW5zdGFuY2UuX2Rlc3Ryb3koKTtcbiAgICB9KTtcbiAgfTtcblxuICBmdW5jdGlvbiBzZXRCdXR0b25zRGlzYWJsZWQoaW5zdGFuY2UsIGJ1dHRvbnMsIGRpc2FibGVkKSB7XG4gICAgdmFyIGRvbUNhY2hlID0gcHJpdmF0ZVByb3BzLmRvbUNhY2hlLmdldChpbnN0YW5jZSk7XG4gICAgYnV0dG9ucy5mb3JFYWNoKGZ1bmN0aW9uIChidXR0b24pIHtcbiAgICAgIGRvbUNhY2hlW2J1dHRvbl0uZGlzYWJsZWQgPSBkaXNhYmxlZDtcbiAgICB9KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHNldElu
8443cHV0RGlzYWJsZWQoaW5wdXQsIGRpc2FibGVkKSB7XG4gICAgaWYgKCFpbnB1dCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGlmIChpbnB1dC50eXBlID09PSAncmFkaW8nKSB7XG4gICAgICB2YXIgcmFkaW9zQ29udGFpbmVyID0gaW5wdXQucGFyZW50Tm9kZS5wYXJlbnROb2RlO1xuICAgICAgdmFyIHJhZGlvcyA9IHJhZGlvc0NvbnRhaW5lci5xdWVyeVNlbGVjdG9yQWxsKCdpbnB1dCcpO1xuXG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJhZGlvcy5sZW5ndGg7IGkrKykge1xuICAgICAgICByYWRpb3NbaV0uZGlzYWJsZWQgPSBkaXNhYmxlZDtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaW5wdXQuZGlzYWJsZWQgPSBkaXNhYmxlZDtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBlbmFibGVCdXR0b25zKCkge1xuICAgIHNldEJ1dHRvbnNEaXNhYmxlZCh0aGlzLCBbJ2NvbmZpcm1CdXR0b24nLCAnZGVueUJ1dHRvbicsICdjYW5jZWxCdXR0b24nXSwgZmFsc2UpO1xuICB9XG4gIGZ1bmN0aW9uIGRpc2FibGVCdXR0b25zKCkge1xuICAgIHNldEJ1dHRvbnNEaXNhYmxlZCh0aGlzLCBbJ2NvbmZpcm1CdXR0b24nLCAnZGVueUJ1dHRvbicsICdjYW5jZWxCdXR0b24nXSwgdHJ1ZSk7XG4gIH1cbiAgZnVuY3Rpb24gZW5hYmxlSW5wdXQoKSB7XG4gICAgcmV0dXJuIHNldElucHV0RGlzYWJsZWQodGhpcy5nZXRJbnB1dCgpLCBmYWxzZSk7XG4gIH1cbiAgZnVuY3Rpb24gZGlzYWJsZUlucHV0KCkge1xuICAgIHJldHVybiBzZXRJbnB1dERpc2FibGVkKHRoaXMuZ2V0SW5wdXQoKSwgdHJ1ZSk7XG4gIH1cblxuICBmdW5jdGlvbiBzaG93VmFsaWRhdGlvbk1lc3NhZ2UoZXJyb3IpIHtcbiAgICB2YXIgZG9tQ2FjaGUgPSBwcml2YXRlUHJvcHMuZG9tQ2FjaGUuZ2V0KHRoaXMpO1xuICAgIHZhciBwYXJhbXMgPSBwcml2YXRlUHJvcHMuaW5uZXJQYXJhbXMuZ2V0KHRoaXMpO1xuICAgIHNldElubmVySHRtbChkb21DYWNoZS52YWxpZGF0aW9uTWVzc2FnZSwgZXJyb3IpO1xuICAgIGRvbUNhY2hlLnZhbGlkYXRpb25NZXNzYWdlLmNsYXNzTmFtZSA9IHN3YWxDbGFzc2VzWy
8443d2YWxpZGF0aW9uLW1lc3NhZ2UnXTtcblxuICAgIGlmIChwYXJhbXMuY3VzdG9tQ2xhc3MgJiYgcGFyYW1zLmN1c3RvbUNsYXNzLnZhbGlkYXRpb25NZXNzYWdlKSB7XG4gICAgICBhZGRDbGFzcyhkb21DYWNoZS52YWxpZGF0aW9uTWVzc2FnZSwgcGFyYW1zLmN1c3RvbUNsYXNzLnZhbGlkYXRpb25NZXNzYWdlKTtcbiAgICB9XG5cbiAgICBzaG93KGRvbUNhY2hlLnZhbGlkYXRpb25NZXNzYWdlKTtcbiAgICB2YXIgaW5wdXQgPSB0aGlzLmdldElucHV0KCk7XG5cbiAgICBpZiAoaW5wdXQpIHtcbiAgICAgIGlucHV0LnNldEF0dHJpYnV0ZSgnYXJpYS1pbnZhbGlkJywgdHJ1ZSk7XG4gICAgICBpbnB1dC5zZXRBdHRyaWJ1dGUoJ2FyaWEtZGVzY3JpYmVkQnknLCBzd2FsQ2xhc3Nlc1sndmFsaWRhdGlvbi1tZXNzYWdlJ10pO1xuICAgICAgZm9jdXNJbnB1dChpbnB1dCk7XG4gICAgICBhZGRDbGFzcyhpbnB1dCwgc3dhbENsYXNzZXMuaW5wdXRlcnJvcik7XG4gICAgfVxuICB9IC8vIEhpZGUgYmxvY2sgd2l0aCB2YWxpZGF0aW9uIG1lc3NhZ2VcblxuICBmdW5jdGlvbiByZXNldFZhbGlkYXRpb25NZXNzYWdlJDEoKSB7XG4gICAgdmFyIGRvbUNhY2hlID0gcHJpdmF0ZVByb3BzLmRvbUNhY2hlLmdldCh0aGlzKTtcblxuICAgIGlmIChkb21DYWNoZS52YWxpZGF0aW9uTWVzc2FnZSkge1xuICAgICAgaGlkZShkb21DYWNoZS52YWxpZGF0aW9uTWVzc2FnZSk7XG4gICAgfVxuXG4gICAgdmFyIGlucHV0ID0gdGhpcy5nZXRJbnB1dCgpO1xuXG4gICAgaWYgKGlucHV0KSB7XG4gICAgICBpbnB1dC5yZW1vdmVBdHRyaWJ1dGUoJ2FyaWEtaW52YWxpZCcpO1xuICAgICAgaW5wdXQucmVtb3ZlQXR0cmlidXRlKCdhcmlhLWRlc2NyaWJlZEJ5Jyk7XG4gICAgICByZW1vdmVDbGFzcyhpbnB1dCwgc3dhbENsYXNzZXMuaW5wdXRlcnJvcik7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gZ2V0UHJvZ3Jlc3NTdGVwcyQxKCkge1xuICAgIHZhciBkb21DYWNoZSA9IHByaXZhdGVQcm9wcy5kb21
8443DYWNoZS5nZXQodGhpcyk7XG4gICAgcmV0dXJuIGRvbUNhY2hlLnByb2dyZXNzU3RlcHM7XG4gIH1cblxuICB2YXIgVGltZXIgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIFRpbWVyKGNhbGxiYWNrLCBkZWxheSkge1xuICAgICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIFRpbWVyKTtcblxuICAgICAgdGhpcy5jYWxsYmFjayA9IGNhbGxiYWNrO1xuICAgICAgdGhpcy5yZW1haW5pbmcgPSBkZWxheTtcbiAgICAgIHRoaXMucnVubmluZyA9IGZhbHNlO1xuICAgICAgdGhpcy5zdGFydCgpO1xuICAgIH1cblxuICAgIF9jcmVhdGVDbGFzcyhUaW1lciwgW3tcbiAgICAgIGtleTogXCJzdGFydFwiLFxuICAgICAgdmFsdWU6IGZ1bmN0aW9uIHN0YXJ0KCkge1xuICAgICAgICBpZiAoIXRoaXMucnVubmluZykge1xuICAgICAgICAgIHRoaXMucnVubmluZyA9IHRydWU7XG4gICAgICAgICAgdGhpcy5zdGFydGVkID0gbmV3IERhdGUoKTtcbiAgICAgICAgICB0aGlzLmlkID0gc2V0VGltZW91dCh0aGlzLmNhbGxiYWNrLCB0aGlzLnJlbWFpbmluZyk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5yZW1haW5pbmc7XG4gICAgICB9XG4gICAgfSwge1xuICAgICAga2V5OiBcInN0b3BcIixcbiAgICAgIHZhbHVlOiBmdW5jdGlvbiBzdG9wKCkge1xuICAgICAgICBpZiAodGhpcy5ydW5uaW5nKSB7XG4gICAgICAgICAgdGhpcy5ydW5uaW5nID0gZmFsc2U7XG4gICAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuaWQpO1xuICAgICAgICAgIHRoaXMucmVtYWluaW5nIC09IG5ldyBEYXRlKCkgLSB0aGlzLnN0YXJ0ZWQ7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5yZW1haW5pbmc7XG4gICAgICB9XG4gICAgfSwge1xuICAgICAga2V5OiBcImluY3JlYXNlXCIsXG4gICAgICB2YWx1ZTogZnVuY3Rpb24gaW5jcmVhc2Uobikge1xuICAgICAgICB2Y
8443XIgcnVubmluZyA9IHRoaXMucnVubmluZztcblxuICAgICAgICBpZiAocnVubmluZykge1xuICAgICAgICAgIHRoaXMuc3RvcCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5yZW1haW5pbmcgKz0gbjtcblxuICAgICAgICBpZiAocnVubmluZykge1xuICAgICAgICAgIHRoaXMuc3RhcnQoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLnJlbWFpbmluZztcbiAgICAgIH1cbiAgICB9LCB7XG4gICAgICBrZXk6IFwiZ2V0VGltZXJMZWZ0XCIsXG4gICAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0VGltZXJMZWZ0KCkge1xuICAgICAgICBpZiAodGhpcy5ydW5uaW5nKSB7XG4gICAgICAgICAgdGhpcy5zdG9wKCk7XG4gICAgICAgICAgdGhpcy5zdGFydCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMucmVtYWluaW5nO1xuICAgICAgfVxuICAgIH0sIHtcbiAgICAgIGtleTogXCJpc1J1bm5pbmdcIixcbiAgICAgIHZhbHVlOiBmdW5jdGlvbiBpc1J1bm5pbmcoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnJ1bm5pbmc7XG4gICAgICB9XG4gICAgfV0pO1xuXG4gICAgcmV0dXJuIFRpbWVyO1xuICB9KCk7XG5cbiAgdmFyIGRlZmF1bHRJbnB1dFZhbGlkYXRvcnMgPSB7XG4gICAgZW1haWw6IGZ1bmN0aW9uIGVtYWlsKHN0cmluZywgdmFsaWRhdGlvbk1lc3NhZ2UpIHtcbiAgICAgIHJldHVybiAvXlthLXpBLVowLTkuK18tXStAW2EtekEtWjAtOS4tXStcXC5bYS16QS1aMC05LV17MiwyNH0kLy50ZXN0KHN0cmluZykgPyBQcm9taXNlLnJlc29sdmUoKSA6IFByb21pc2UucmVzb2x2ZSh2YWxpZGF0aW9uTWVzc2FnZSB8fCAnSW52YWxpZCBlbWFpbCBhZGRyZXNzJyk7XG4gICAgfSxcbiAgICB1cmw6IGZ1bmN0aW9uIHVybChzdHJpbmcsIHZhbGlkYXRpb25NZXNzYWdlKSB7XG4gICAgICAvLyB0YWtlbiBmcm9tIGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vYS8zODA5NDM1IHdpdGggYSBzbWFsbCBjaGFuZ2UgZnJvbSAjMTMwNiBhbmQgIzIwMTNcbiAgICAgIHJldHVybiAvXmh0dHBzPzpcXC9cXC8od3d3XFwuKT9bLWEtekEtWjAtOUA6JS5fK34jPV17MSwyNTZ9XFwuW2Etel17Miw2M31cXGIoWy1hLXpBLVowLTlAOiVfKy5+Iz8mLz1dKikkLy50ZXN0KHN0cmluZykgPyBQcm9taXNlLnJlc29sdmUoKSA6IFByb21pc2UucmVzb2x2ZSh2YWxpZGF0aW9uTWVzc2FnZSB8fCAnSW52YWxpZCBVUkwnKTtcbiAgICB9XG4gIH07XG5cbiAgZnVuY3Rpb24gc2V0RGVmYXVsdElucHV0VmFsaWRhdG9ycyhwYXJhbXMpIHtcbiAgICAvLyBVc2UgZGVmYXVsdCBgaW5wdXRWYWxpZGF0b3JgIGZvciBzdXBwb3J0ZWQgaW5wdXQgdHlwZXMgaWYgbm90IHByb3ZpZGVkXG4gICAgaWYgKCFwYXJhbXMuaW5wdXRWYWxpZGF0b3IpIHtcbiAgICAgIE9iamVjdC5rZXlzKGRlZmF1bHRJbnB1dFZhbGlkYXRvcnMpLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgICBpZiAocGFyYW1zLmlucHV0ID09PSBrZXkpIHtcbiAgICAgICAgICBwYXJhbXMuaW5wdXRWYWxpZGF0b3IgPSBkZWZhdWx0SW5wdXRWYWxpZGF0b3JzW2tleV07XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHZhbGlkYXRlQ3VzdG9tVGFyZ2V0RWxlbWVudChwYXJhbXMpIHtcbiAgICAvLyBEZXRlcm1pbmUgaWYgdGhlIGN1c3RvbSB0YXJnZXQgZWxlbWVudCBpcyB2YWxpZFxuICAgIGlmICghcGFyYW1zLnRhcmdldCB8fCB0eXBlb2YgcGFyYW1zLnRhcmdldCA9PT0gJ3N0cmluZycgJiYgIWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IocGFyYW1zLnRhcmdldCkgfHwgdHlwZW9mIHBhcmFtcy50YXJnZXQgIT09ICdzdHJpbmcnICYmICFwYXJhbXMudGFyZ2V0LmFwcGVuZENoaWxkKSB7XG4gICAgICB3YXJuKCdUYXJnZXQgcGFyYW1ldGVyIGlzIG5vdCB2YWxpZCwgZGVmYXVsdGluZyB0byBcImJvZHlcIicpO1xuICAgICAgcGFyYW1zLnRhcmdldCA9ICdib2R5JztcbiAgICB9XG4gIH1cbiAgLyoqXG4gICAqIFNldCB0eXBlLCB0ZXh0IGFuZCBhY3Rpb25zIG9uIHBvcHVwXG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuXG5cbiAgZnVuY3Rpb24gc2V0UGFyYW1ldGVycyhwYXJhbXMpIHtcbiAgICBzZXREZWZhdWx0SW5wdXRWYWxpZGF0b3JzKHBhcmFtcyk7IC8vIHNob3dMb2FkZXJPbkNvbmZpcm0gJiYgcHJlQ29uZmlybVxuXG4gICAgaWYgKHBhcmFtcy5zaG93TG9hZGVyT25Db25maXJtICYmICFwYXJhbXMucHJlQ29uZmlybSkge1xuICAgICAgd2Fybignc2hvd0xvYWRlck9uQ29uZmlybSBpcyBzZXQgdG8gdHJ1ZSwgYnV0IHByZUNvbmZpcm0gaXMgbm90IGRlZmluZWQuXFxuJyArICdzaG93TG9hZGVyT25Db25maXJtIHNob3VsZCBiZSB1c2VkIHRvZ2V0aGVyIHdpdGggcHJlQ29uZmlybSwgc2VlIHVzYWdlIGV4YW1wbGU6XFxuJyArICdodHRwczovL3N3ZWV0YWxlcnQyLmdpdGh1Yi5pby8jYWpheC1yZXF1ZXN0Jyk7XG4gICAgfSAvLyBwYXJhbXMuYW5pbWF0aW9uIHdpbGwgYmUgYWN0dWFsbHkgdXNlZCBpbiByZW5kZXJQb3B1cC5qc1xuICAgIC8vIGJ1dCBpbiBjYXNlIHdoZW4gcGFyYW1zLmFuaW1hdGlvbiBpcyBhIGZ1bmN0aW9uLCB3ZSBuZWVkIHRvIGNhbGwgdGhhdCBmdW5jdGlvblxuICAgIC8vIGJlZm9yZSBwb3B1cCAocmUpaW5pdGlhbGl6YXRpb24sIHNvIGl0J2xsIGJlIHBvc3NpYmxlIHRvIGNoZWNrIFN3YWwuaXNWaXNpYmxlKClcbiAgICAvLyBpbnNpZGUgdGhlIHBhcmFtcy5hbmltYXRpb24gZnVuY3Rpb25cblxuXG4gICAgcGFyYW1zLmFuaW1hdGlvbiA9IGNhbGxJZkZ1bmN0aW9uKHBhcmFtcy5hbmltYXRpb24pO1xuICAgIHZhbGlkYXRlQ3VzdG9tVGFyZ2V0RWxlbWVudChwYXJhbXMpOyAvLyBSZXBsYWNlIG5ld2xpbmVzIHdpdGggPGJyPiBpbiB0aXRsZVxuXG4gICAgaWYgKHR5cGVvZiBwYXJhbXMudGl0bGUgPT09ICdzdHJpbmcnKSB7XG4gICAgICBwYXJhbXMudGl0bGUgPSBwYXJhbXMudGl0bGUuc3BsaXQoJ1xcbicpLmpvaW4oJzxiciAvPicpO1xuICAgIH1cblxuICAgIGluaXQocGFyYW1zKTtcbiAgfVxuXG4gIHZhciBzd2FsU3RyaW5nUGFyYW1zID0gWydzd2FsLXRpdGxlJywgJ3N3YWwtaHRtbCcsICdzd2FsLWZvb3RlciddO1xuICB2YXIgZ2V0VGVtcGxhdGVQYXJhbXMgPSBmdW5jdGlvbiBnZXRUZW1wbGF0ZVBhcmFtcyhwYXJhbXMpIHtcbiAgICB2YXIgdGVtcGxhdGUgPSB0eXBlb2YgcGFyYW1zLnRlbXBsYXRlID09PSAnc3RyaW5nJyA/IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IocGFyYW1zLnRlbXBsYXRlKSA6IHBhcmFtcy50ZW1wbGF0ZTtcblxuICAgIGlmICghdGVtcGxhdGUpIHtcbiAgICAgIHJldHVybi
8443B7fTtcbiAgICB9XG5cbiAgICB2YXIgdGVtcGxhdGVDb250ZW50ID0gdGVtcGxhdGUuY29udGVudCB8fCB0ZW1wbGF0ZTsgLy8gSUUxMVxuXG4gICAgc2hvd1dhcm5pbmdzRm9yRWxlbWVudHModGVtcGxhdGVDb250ZW50KTtcblxuICAgIHZhciByZXN1bHQgPSBfZXh0ZW5kcyhnZXRTd2FsUGFyYW1zKHRlbXBsYXRlQ29udGVudCksIGdldFN3YWxCdXR0b25zKHRlbXBsYXRlQ29udGVudCksIGdldFN3YWxJbWFnZSh0ZW1wbGF0ZUNvbnRlbnQpLCBnZXRTd2FsSWNvbih0ZW1wbGF0ZUNvbnRlbnQpLCBnZXRTd2FsSW5wdXQodGVtcGxhdGVDb250ZW50KSwgZ2V0U3dhbFN0cmluZ1BhcmFtcyh0ZW1wbGF0ZUNvbnRlbnQsIHN3YWxTdHJpbmdQYXJhbXMpKTtcblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH07XG5cbiAgdmFyIGdldFN3YWxQYXJhbXMgPSBmdW5jdGlvbiBnZXRTd2FsUGFyYW1zKHRlbXBsYXRlQ29udGVudCkge1xuICAgIHZhciByZXN1bHQgPSB7fTtcbiAgICB0b0FycmF5KHRlbXBsYXRlQ29udGVudC5xdWVyeVNlbGVjdG9yQWxsKCdzd2FsLXBhcmFtJykpLmZvckVhY2goZnVuY3Rpb24gKHBhcmFtKSB7XG4gICAgICBzaG93V2FybmluZ3NGb3JBdHRyaWJ1dGVzKHBhcmFtLCBbJ25hbWUnLCAndmFsdWUnXSk7XG4gICAgICB2YXIgcGFyYW1OYW1lID0gcGFyYW0uZ2V0QXR0cmlidXRlKCduYW1lJyk7XG4gICAgICB2YXIgdmFsdWUgPSBwYXJhbS5nZXRBdHRyaWJ1dGUoJ3ZhbHVlJyk7XG5cbiAgICAgIGlmICh0eXBlb2YgZGVmYXVsdFBhcmFtc1twYXJhbU5hbWVdID09PSAnYm9vbGVhbicgJiYgdmFsdWUgPT09ICdmYWxzZScpIHtcbiAgICAgICAgdmFsdWUgPSBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgaWYgKF90eXBlb2YoZGVmYXVsdFBhcmFtc1twYXJhbU5hbWVdKSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgdmFsdWUgPSBKU09OLnBhcnNlKHZhbHVlKTtcbiAgICAgIH1cblxuICAgICAgcmVzdWx0W3BhcmFtTmFtZV0gPSB2YWx1ZTtcbiAgICB9KTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9O1xuXG4gIHZhciBnZXRTd2FsQnV0dG9ucyA9IGZ1bmN0aW9uIGdldFN3YWxCdXR0b25zKHRlbXBsYXRlQ29udGVudCkge1xuICAgIHZhciByZXN1bHQgPSB7fTtcbiAgICB0b0FycmF5KHRlbXBsYXRlQ29udGVudC5xdWVyeVNlbGVjdG9yQWxsKCdzd2FsLWJ1dHRvbicpKS5mb3JFYWNoKGZ1bmN0aW9uIChidXR0b24pIHtcbiAgICAgIHNob3dXYXJuaW5nc0ZvckF0dHJpYnV0ZXMoYnV0dG9uLCBbJ3R5cGUnLCAnY29sb3InLCAnYXJpYS1sYWJlbCddKTtcbiAgICAgIHZhciB0eXBlID0gYnV0dG9uLmdldEF0dHJpYnV0ZSgndHlwZScpO1xuICAgICAgcmVzdWx0W1wiXCIuY29uY2F0KHR5cGUsIFwiQnV0dG9uVGV4dFwiKV0gPSBidXR0b24uaW5uZXJIVE1MO1xuICAgICAgcmVzdWx0W1wic2hvd1wiLmNvbmNhdChjYXBpdGFsaXplRmlyc3RMZXR0ZXIodHlwZSksIFwiQnV0dG9uXCIpXSA9IHRydWU7XG5cbiAgICAgIGlmIChidXR0b24uaGFzQXR0cmlidXRlKCdjb2xvcicpKSB7XG4gICAgICAgIHJlc3VsdFtcIlwiLmNvbmNhdCh0eXBlLCBcIkJ1dHRvbkNvbG9yXCIpXSA9IGJ1dHRvbi5nZXRBdHRyaWJ1dGUoJ2NvbG9yJyk7XG4gICAgICB9XG5cbiAgICAgIGlmIChidXR0b24uaGFzQXR0cmlidXRlKCdhcmlhLWxhYmVsJykpIHtcbiAgICAgICAgcmVzdWx0W1wiXCIuY29uY2F0KHR5cGUsIFwiQnV0dG9uQXJpYUxhYmVsXCIpXSA9IGJ1dHRvbi5nZXRBdHRyaWJ1dGUoJ2FyaWEtbGFiZWwnKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9O1xuXG4gIHZhciBnZXRTd2FsSW1hZ2UgPSBmdW5jdGlvbiBnZXRTd2FsSW1hZ2UodGVtcGxhdGVDb250ZW50KSB7XG4gICAgdmFyIHJlc3VsdCA9IHt9O1xuICAgIHZhciBpbWFnZSA9IHRlbXBsYXRlQ29udGVudC5xdWVyeVNlbGVjdG9yKCdzd2FsLWltYWdlJyk7XG5cbiAgICBpZiAoaW1hZ2UpIHtcbiAgICAgIHNob3dXYXJuaW5nc0ZvckF0dHJpYnV0ZXMoaW1hZ2UsIFsnc3JjJywgJ3dpZHRoJywgJ2hlaWdodCcsICdhbHQnXSk7XG5cbiAgICAgIGlmIChpbWFnZS5oYXNBdHRyaWJ1dGUoJ3NyYycpKSB7XG4gICAgICAgIHJlc3VsdC5pbWFnZVVybCA9IGltYWdlLmdldEF0dHJpYnV0ZSgnc3JjJyk7XG4gICAgICB9XG5cbiAgICAgIGlmIChpbWFnZS5oYXNBdHRyaWJ1dGUoJ3dpZHRoJykpIHtcbiAgICAgICAgcmVzdWx0LmltYWdlV2lkdGggPSBpbWFnZS5nZXRBdHRyaWJ1dGUoJ3dpZHRoJyk7XG4gICAgICB9XG5cbiAgICAgIGlmIChpbWFnZS5oYXNBdHRyaWJ1dGUoJ2hlaWdodCcpKSB7XG4gICAgICAgIHJlc3VsdC5pbWFnZUhlaWdodCA9IGltYWdlLmdldEF0dHJpYnV0ZSgnaGVpZ2h0Jyk7XG4gICAgICB9XG5cbiAgICAgIGlmIChpbWFnZS5oYXNBdHRyaWJ1dGUoJ2FsdCcpKSB7XG4gICAgICAgIHJlc3VsdC5pbWFnZUFsdCA9IGltYWdlLmdldEF0dHJpYnV0ZSgnYWx0Jyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfTtcblxuICB2YXIgZ2V0U3dhbEljb24gPSBmdW5jdGlvbiBnZXRTd2FsSWNvbih0ZW1wbGF0ZUNvbnRlbnQpIHtcbiAgICB2YXIgcmVzdWx0ID0ge307XG4gICAgdmFyIGljb24gPSB0ZW1wbGF0ZUNvbnRlbnQucXVlcnlTZWxlY3Rvcignc3dhbC1pY29uJyk7XG5cbiAgICBpZiAoaWNvbikge1xuICAgICAgc2hvd1dhcm5pbmdzRm9yQXR0cmlidXRlcyhpY29uLCBbJ3R5cGUnLCAnY29sb3InXSk7XG5cbiAgICAgIGlmIChpY29uLmhhc0F0dHJpYnV0ZSgndHlwZScpKSB7XG4gICAgICAgIHJlc3VsdC5pY29uID0gaWNvbi5nZXRBdHRyaWJ1dGUoJ3R5cGUnKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGljb24uaGFzQXR0cmlidXRlKCdjb2xvcicpKSB7XG4gICAgICAgIHJlc3VsdC5pY29uQ29sb3IgPSBpY29uLmdldEF0dHJpYnV0ZSgnY29sb3InKTtcbiAgICAgIH1cblxuICAgICAgcmVzdWx0Lmljb25IdG1sID0gaWNvbi5pbm5lckhUTUw7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfTtcblxuICB2YXIgZ2V0U3dhbElucHV0ID0gZnVuY3Rpb24gZ2V0U3dhbElucHV0KHRlbXBsYXRlQ29udGVudCkge1xuICAgIHZhciByZXN1bHQgPSB7fTtcbiAgICB2YXIgaW5wdXQgPSB0ZW1wbGF0ZUNvbnRlbnQucXVlcnlTZWxlY3Rvcignc3dhbC1pbnB1dCcpO1xuXG4gICAgaWYgKGlucHV0KSB7XG4gICAgICBzaG93V2FybmluZ3NGb3JBdHRyaWJ1dGVzKGlucHV0LCBbJ3R5cGUnLCAnbGFiZWwnLCAncGxhY2Vob2xkZXInLCAndmFsdWUnXSk7XG4gICAgICByZXN1bHQuaW5wdXQgPSBpbnB1dC5nZXRBdHRyaWJ1dGUoJ3R5cGUnKSB8fCAndGV4dCc7XG5cbiAgICAgIGlmIChpbnB1dC5oYXNBdHRyaWJ1dGUoJ2xhYmVsJykpIHtcbiAgICAgICAgcmVzdWx0LmlucHV0TGFiZWwgPSBpbnB1dC5nZXRBdHRyaWJ1dGUoJ2xhYmVsJyk7XG4gICAgICB9XG5cbiAgICAgIGlmIChpbnB1dC5oYXNBdHRyaWJ1dGUoJ3BsYWNlaG9sZG
8443VyJykpIHtcbiAgICAgICAgcmVzdWx0LmlucHV0UGxhY2Vob2xkZXIgPSBpbnB1dC5nZXRBdHRyaWJ1dGUoJ3BsYWNlaG9sZGVyJyk7XG4gICAgICB9XG5cbiAgICAgIGlmIChpbnB1dC5oYXNBdHRyaWJ1dGUoJ3ZhbHVlJykpIHtcbiAgICAgICAgcmVzdWx0LmlucHV0VmFsdWUgPSBpbnB1dC5nZXRBdHRyaWJ1dGUoJ3ZhbHVlJyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIGlucHV0T3B0aW9ucyA9IHRlbXBsYXRlQ29udGVudC5xdWVyeVNlbGVjdG9yQWxsKCdzd2FsLWlucHV0LW9wdGlvbicpO1xuXG4gICAgaWYgKGlucHV0T3B0aW9ucy5sZW5ndGgpIHtcbiAgICAgIHJlc3VsdC5pbnB1dE9wdGlvbnMgPSB7fTtcbiAgICAgIHRvQXJyYXkoaW5wdXRPcHRpb25zKS5mb3JFYWNoKGZ1bmN0aW9uIChvcHRpb24pIHtcbiAgICAgICAgc2hvd1dhcm5pbmdzRm9yQXR0cmlidXRlcyhvcHRpb24sIFsndmFsdWUnXSk7XG4gICAgICAgIHZhciBvcHRpb25WYWx1ZSA9IG9wdGlvbi5nZXRBdHRyaWJ1dGUoJ3ZhbHVlJyk7XG4gICAgICAgIHZhciBvcHRpb25OYW1lID0gb3B0aW9uLmlubmVySFRNTDtcbiAgICAgICAgcmVzdWx0LmlucHV0T3B0aW9uc1tvcHRpb25WYWx1ZV0gPSBvcHRpb25OYW1lO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfTtcblxuICB2YXIgZ2V0U3dhbFN0cmluZ1BhcmFtcyA9IGZ1bmN0aW9uIGdldFN3YWxTdHJpbmdQYXJhbXModGVtcGxhdGVDb250ZW50LCBwYXJhbU5hbWVzKSB7XG4gICAgdmFyIHJlc3VsdCA9IHt9O1xuXG4gICAgZm9yICh2YXIgaSBpbiBwYXJhbU5hbWVzKSB7XG4gICAgICB2Y
8443XIgcGFyYW1OYW1lID0gcGFyYW1OYW1lc1tpXTtcbiAgICAgIHZhciB0YWcgPSB0ZW1wbGF0ZUNvbnRlbnQucXVlcnlTZWxlY3RvcihwYXJhbU5hbWUpO1xuXG4gICAgICBpZiAodGFnKSB7XG4gICAgICAgIHNob3dXYXJuaW5nc0ZvckF0dHJpYnV0ZXModGFnLCBbXSk7XG4gICAgICAgIHJlc3VsdFtwYXJhbU5hbWUucmVwbGFjZSgvXnN3YWwtLywgJycpXSA9IHRhZy5pbm5lckhUTUw7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfTtcblxuICB2YXIgc2hvd1dhcm5pbmdzRm9yRWxlbWVudHMgPSBmdW5jdGlvbiBzaG93V2FybmluZ3NGb3JFbGVtZW50cyh0ZW1wbGF0ZSkge1xuICAgIHZhciBhbGxvd2VkRWxlbWVudHMgPSBzd2FsU3RyaW5nUGFyYW1zLmNvbmNhdChbJ3N3YWwtcGFyYW0nLCAnc3dhbC1idXR0b24nLCAnc3dhbC1pbWFnZScsICdzd2FsLWljb24nLCAnc3dhbC1pbnB1dCcsICdzd2FsLWlucHV0LW9wdGlvbiddKTtcbiAgICB0b0FycmF5KHRlbXBsYXRlLnF1ZXJ5U2VsZWN0b3JBbGwoJyonKSkuZm9yRWFjaChmdW5jdGlvbiAoZWwpIHtcbiAgICAgIGlmIChlbC5wYXJlbnROb2RlICE9PSB0ZW1wbGF0ZSkge1xuICAgICAgICAvLyBjYW4ndCB1c2UgdGVtcGxhdGUuY2hpbGRyZW4gYmVjYXVzZSBvZiBJRTExXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdmFyIHRhZ05hbWUgPSBlbC50YWdOYW1lLnRvTG93ZXJDYXNlKCk7XG5cbiAgICAgIGlmIChhbGxvd2VkRWxlbWVudHMuaW5kZXhPZih0YWdOYW1lKSA9PT0gLTEpIHtcbiAgICAgICAgd2FybihcIlVucmVjb2duaXplZCBlbGVtZW50IDxcIi5jb25jYXQodGFnTmFtZSwgXCI+XCIpKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfTtcblxuICB2YXIgc2hvd1dhcm5pbmdzRm9yQXR0cmlidXRlcyA9IGZ1bmN0aW9uIHNob3dXYXJuaW5nc0ZvckF0dHJpYnV0ZXMoZWwsIGFsbG93ZWRBdHRyaWJ1dGVzKSB7XG4gICAgdG9BcnJheShlbC5hdHRyaWJ1dGVzKS5mb3JFYWNoKGZ1bmN0aW9uIChhdHRyaWJ1dGUpIHtcbiAgICAgIGlmIChhbGxvd2VkQXR0cmlidXRlcy5pbmRleE9mKGF0dHJpYnV0ZS5uYW1lKSA9PT0gLTEpIHtcbiAgICAgICAgd2FybihbXCJVbnJlY29nbml6ZWQgYXR0cmlidXRlIFxcXCJcIi5jb25jYXQoYXR0cmlidXRlLm5hbWUsIFwiXFxcIiBvbiA8XCIpLmNvbmNhdChlbC50YWdOYW1lLnRvTG93ZXJDYXNlKCksIFwiPi5cIiksIFwiXCIuY29uY2F0KGFsbG93ZWRBdHRyaWJ1dGVzLmxlbmd0aCA/IFwiQWxsb3dlZCBhdHRyaWJ1dGVzIGFyZTogXCIuY29uY2F0KGFsbG93ZWRBdHRyaWJ1dGVzLmpvaW4oJywgJykpIDogJ1RvIHNldCB0aGUgdmFsdWUsIHVzZSBIVE1MIHdpdGhpbiB0aGUgZWxlbWVudC4nKV0pO1xuICAgICAgfVxuICAgIH0pO1xuICB9O1xuXG4gIHZhciBTSE9XX0NMQVNTX1RJTUVPVVQgPSAxMDtcbiAgLyoqXG4gICAqIE9wZW4gcG9wdXAsIGFkZCBuZWNlc3NhcnkgY2xhc3NlcyBhbmQgc3R5bGVzLCBmaXggc2Nyb2xsYmFyXG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICovXG5cbiAgdmFyIG9wZW5Qb3B1cCA9IGZ1bmN0aW9uIG9wZW5Qb3B1cChwYXJhbXMpIHtcbiAgICB2YXIgY29udGFpbmVyID0gZ2V0Q29udGFpbmVyKCk7XG4gICAgdmFyIHBvcHVwID0gZ2V0UG9wdXAoKTtcblxuICAgIGlmICh0eXBlb2YgcGFyYW1zLndpbGxPcGVuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBwYXJhbXMud2lsbE9wZW4ocG9wdXApO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIHBhcmFtcy5vbkJlZm9yZU9wZW4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHBhcmFtcy5vbkJlZm9yZU9wZW4ocG9wdXApOyAvLyBAZGVwcmVjYXRlZFxuICAgIH1cblxuICAgIHZhciBib2R5U3R5bGVzID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUoZG9jdW1lbnQuYm9keSk7XG4gICAgdmFyIGluaXRpYWxCb2R5T3ZlcmZsb3cgPSBib2R5U3R5bGVzLm92ZXJmbG93WTtcbiAgICBhZGRDbGFzc2VzJDEoY29udGFpbmVyLCBwb3B1cCwgcGFyYW1zKTsgLy8gc2Nyb2xsaW5nIGlzICdoaWRkZW4nIHVudGlsIGFuaW1hdGlvbiBpcyBkb25lLCBhZnRlciB0aGF0ICdhdXRvJ1xuXG4gICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICBzZXRTY3JvbGxpbmdWaXNpYmlsaXR5KGNvbnRhaW5lciwgcG9wdXApO1xuICAgIH0sIFNIT1dfQ0xBU1NfVElNRU9VVCk7XG5cbiAgICBpZiAoaXNNb2RhbCgpKSB7XG4gICAgICBmaXhTY3JvbGxDb250YWluZXIoY29udGFpbmVyLCBwYXJhbXMuc2Nyb2xsYmFyUGFkZGluZywgaW5pdGlhbEJvZHlPdmVyZmxvdyk7XG4gICAgICBzZXRBcmlhSGlkZGVuKCk7XG4gICAgfVxuXG4gICAgaWYgKCFpc1RvYXN0KCkgJiYgIWdsb2JhbFN0YXRlLnByZXZpb3VzQWN0aXZlRWxlbWVudCkge1xuICAgICAgZ2xvYmFsU3RhdGUucHJldmlvdXNBY3RpdmVFbGVtZW50ID0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudDtcbiAgICB9XG5cbiAgICBydW5EaWRPcGVuKHBvcHVwLCBwYXJhbXMpO1xuICAgIHJlbW92ZUNsYXNzKGNvbnRhaW5lciwgc3dhbENsYXNzZXNbJ25vLXRyYW5zaXRpb24nXSk7XG4gIH07XG5cbiAgdmFyIHJ1bkRpZE9wZW4gPSBmdW5jdGlvbiBydW5EaWRPcGVuKHBvcHVwLCBwYXJhbXMpIHtcbiAgICBpZiAodHlwZW9mIHBhcmFtcy5kaWRPcGVuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHBhcmFtcy5kaWRPcGVuKHBvcHVwKTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIHBhcmFtcy5vbk9wZW4gPT
844309ICdmdW5jdGlvbicpIHtcbiAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gcGFyYW1zLm9uT3Blbihwb3B1cCk7XG4gICAgICB9KTsgLy8gQGRlcHJlY2F0ZWRcbiAgICB9XG4gIH07XG5cbiAgdmFyIHN3YWxPcGVuQW5pbWF0aW9uRmluaXNoZWQgPSBmdW5jdGlvbiBzd2FsT3BlbkFuaW1hdGlvbkZpbmlzaGVkKGV2ZW50KSB7XG4gICAgdmFyIHBvcHVwID0gZ2V0UG9wdXAoKTtcblxuICAgIGlmIChldmVudC50YXJnZXQgIT09IHBvcHVwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIGNvbnRhaW5lciA9IGdldENvbnRhaW5lcigpO1xuICAgIHBvcHVwLnJlbW92ZUV2ZW50TGlzdGVuZXIoYW5pbWF0aW9uRW5kRXZlbnQsIHN3YWxPcGVuQW5pbWF0aW9uRmluaXNoZWQpO1xuICAgIGNvbnRhaW5lci5zdHlsZS5vdmVyZmxvd1kgPSAnYXV0byc7XG4gIH07XG5cbiAgdmFyIHNldFNjcm9sbGluZ1Zpc2liaWxpdHkgPSBmdW5jdGlvbiBzZXRTY3JvbGxpbmdWaXNpYmlsaXR5KGNvbnRhaW5lciwgcG9wdXApIHtcbiAgICBpZiAoYW5pbWF0aW9uRW5kRXZlbnQgJiYgaGFzQ3NzQW5pbWF0aW9uKHBvcHVwKSkge1xuICAgICAgY29udGFpbmVyLnN0eWxlLm92ZXJmbG93WSA9ICdoaWRkZW4nO1xuICAgICAgcG9wdXAuYWRkRXZlbnRMaXN0ZW5lcihhbmltYXRpb25FbmRFdmVudCwgc3dhbE9wZW5BbmltYXRpb25GaW5pc2hlZCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnRhaW5lci5zdHlsZS5vdmVyZmxvd1kgPSAnYXV0byc7XG4gICAgfVxuICB9O1xuXG4gIHZhciBmaXhTY3JvbGxDb250YWluZXIgPSBmdW5jdGlvbiBmaXhTY3JvbGxDb250YWluZXIoY29udGFpbmVyLCBzY3JvbGxiYXJQYWRkaW5nLCBpbml0aWFsQm9keU92ZXJmbG93KSB7XG4gICAgaU9TZml4KCk7XG4gICAgSUVmaXgoKTtcblxuICAgIGlmIChzY3JvbGxiYXJQYWRkaW5nICYmIGluaXRpYWxCb2R5T3ZlcmZsb3cgIT09ICdoaWRkZW4nKSB7XG4gICAgICBmaXhTY3JvbGxiYXIoKTtcbiAgICB9IC8vIHN3ZWV0YWxlcnQyL2lzc3Vlcy8xMjQ3XG5cblxuICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgY29udGFpbmVyLnNjcm9sbFRvcCA9IDA7XG4gICAgfSk7XG4gIH07XG5cbiAgdmFyIGFkZENsYXNzZXMkMSA9IGZ1bmN0aW9uIGFkZENsYXNzZXMoY29udGFpbmVyLCBwb3B1cCwgcGFyYW1zKSB7XG4gICAgYWRkQ2xhc3MoY29udGFpbmVyLCBwYXJhbXMuc2hvd0NsYXNzLmJhY2tkcm9wKTsgLy8gdGhlIHdvcmthcm91bmQgd2l0aCBzZXR0aW5nL3Vuc2V0dGluZyBvcGFjaXR5IGlzIG5lZWRlZCBmb3IgIzIwMTkgYW5kIDIwNTlcblxuICAgIHBvcHVwLnN0eWxlLnNldFByb3BlcnR5KCdvcGFjaXR5JywgJzAnLCAnaW1wb3J0YW50Jyk7XG4gICAgc2hvdyhwb3B1cCk7XG4gICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAvLyBBbmltYXRlIHBvcHVwIHJpZ2h0IGFmdGVyIHNob3dpbmcgaXRcbiAgICAgIGFkZENsYXNzKHBvcHVwLCBwYXJhbXMuc2hvd0NsYXNzLnBvcHVwKTsgLy8gYW5kIHJlbW92ZSB0aGUgb3BhY2l0eSB3b3JrYXJvdW5kXG5cbiAgICAgIHBvcHVwLnN0eWxlLnJlbW92ZVByb3BlcnR5KCdvcGFjaXR5Jyk7XG4gICAgfSwgU0hPV19DTEFTU19USU1FT1VUKTsgLy8gMTBtcyBpbiBvcmRlciB0byBmaXggIzIwNjJcblxuICAgIGFkZENsYXNzKFtkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsIGRvY3VtZW50LmJvZHldLCBzd2FsQ2xhc3Nlcy5zaG93bik7XG5cbiAgICBpZiAocGFyYW1zLmhlaWdodEF1dG8gJiYgcGFyYW1zLmJhY2tkcm9wICYmICFwYXJhbXMudG9hc3QpIHtcbiAgICAgIGFkZENsYXNzKFtkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsIGRvY3VtZW50LmJvZHldLCBzd2FsQ2xhc3Nlc1snaGVpZ2h0LWF1dG8nXSk7XG4gICAgfVxuICB9O1xuXG4gIHZhciBoYW5kbGVJbnB1dE9wdGlvbnNBbmRWYWx1ZSA9IGZ1bmN0aW9uIGhhbmRsZUlucHV0T3B0aW9uc0FuZFZhbHVlKGluc3RhbmNlLCBwYXJhbXMpIHtcbiAgICBpZiAocGFyYW1zLmlucHV0ID09PSAnc2VsZWN0JyB8fCBwYXJhbXMuaW5wdXQgPT09ICdyYWRpbycpIHtcbiAgICAgIGhhbmRsZUlucHV0T3B0aW9ucyhpbnN0YW5jZSwgcGFyYW1zKTtcbiAgICB9IGVsc2UgaWYgKFsndGV4dCcsICdlbWFpbCcsICdudW1iZXInLCAndGVsJywgJ3RleHRhcmVhJ10uaW5kZXhPZihwYXJhbXMuaW5wdXQpICE9PSAtMSAmJiAoaGFzVG9Qcm9taXNlRm4ocGFyYW1zLmlucHV0VmFsdWUpIHx8IGlzUHJvbWlzZShwYXJhbXMuaW5wdXRWYWx1ZSkpKSB7XG4gICAgICBoYW5kbGVJbnB1dFZhbHVlKGluc3RhbmNlLCBwYXJhbXMpO1xuICAgIH1cbiAgfTtcbiAgdmFyIGdldElucHV0VmFsdWUgPSBmdW5jdGlvbiBnZXRJbnB1dFZhbHVlKGluc3RhbmNlLCBpbm5lclBhcmFtcykge1xuICAgIHZhciBpbnB1dCA9IGluc3RhbmNlLmdldElucHV0KCk7XG5cbiAgICBpZiAoIWlucHV0KSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBzd2l0Y2ggKGlubmVyUGFyYW1zLmlucHV0KSB7XG4gICAgICBjYXNlICdjaGVja2JveCc6XG4gICAgICAgIHJldHVybiBnZXRDaGVja2JveFZhbHVlKGlucHV0KTtcblxuICAgICAgY2FzZSAncmFkaW8nOlxuICAgICAgICByZXR1cm4gZ2V0UmFkaW9WYWx1ZShpbnB1dCk7XG5cbiAgICAgIGNhc2UgJ2ZpbGUnOlxuICAgICAgICByZXR1cm4gZ2V0RmlsZVZhbHVlKGlucHV0KTtcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIGlubmVyUGFyYW1zLmlucHV0QXV0b1RyaW0gPyBpbnB1dC52YWx1ZS50cmltKCkgOiBpbnB1dC52YWx1ZTtcbiAgICB9XG4gIH07XG5cbiAgdmFyIGdldENoZWNrYm94VmFsdWUgPSBmdW5jdGlvbiBnZXRDaGVja2JveFZhbHVlKGlucHV0KSB7XG4gICAgcmV0dXJuIGlucHV0LmNoZWNrZWQgPyAxIDogMDtcbiAgfTtcblxuICB2YXIgZ2V0UmFkaW9WYWx1ZSA9IGZ1bmN0aW9uIGdldFJhZGlvVmFsdWUoaW5wdXQpIHtcbiAgICByZXR1cm4gaW5wdXQuY2hlY2tlZCA/IGlucHV0LnZhbHVlIDogbnVsbDtcbiAgfTtcblxuICB2YXIgZ2V0RmlsZVZhbHVlID0gZnVuY3Rpb24gZ2V0RmlsZVZhbHVlKGlucHV0KSB7XG4gICAgcmV0dXJuIGlucHV0LmZpbGVzLmxlbmd0aCA/IGlucHV0LmdldEF0dHJpYnV0ZSgnbXVsdGlwbGUnKSAhPT0gbnVsbCA/IGlucHV0LmZpbGVzIDogaW5wdXQuZmlsZXNbMF0gOiBudWxsO1xuICB9O1xuXG4gIHZhciBoYW5kbGVJbnB1dE9wdGlvbnMgPSBmdW5jdGlvbiBoYW5kbGVJbnB1dE9wdGlvbnMoaW5zdGFuY2UsIHBhcmFtcykge1xuICAgIHZhciBjb250ZW50ID0gZ2V0Q29udGVudCgpO1xuXG4gICAgdmFyIHByb2Nlc3NJbnB1dE9wdGlvbnMgPSBmdW5jdGlvbiBwcm9jZXNzSW5wdXRPcHRpb25zKGlucHV0T3B0aW9ucykge1xuICAgICAgcmV0dXJuIHBvcHVsYXRlSW5wdXRPcHRpb25zW3BhcmFtcy5pbnB1dF0oY29udGVudCwgZm9ybWF0SW5wdXRPcHRpb25zKGlucHV0T3B0aW9ucyksIHBhcmFtcyk7XG4gICAgfTtcblxuICAgIGlmIChoYXNUb1Byb21pc2VGbihwYXJhbXMuaW5wdXRPcHRpb25zKSB8fCBpc1Byb21pc2UocGFyYW1zLmlucHV0T3B0aW9ucykpIHtcbiAgICAgIHNob3dMb2FkaW5nKCk7XG4gICAgICBhc1Byb21pc2UocGFyYW1zLmlucHV0T3B0aW9ucykudGhlbihmdW5jdGlvbiAoaW5wdXRPcHRpb25zKSB7XG4gICAgICAgIGluc3RhbmNlLmhpZGVMb2FkaW5nKCk7XG4gICAgICAgI
8443HByb2Nlc3NJbnB1dE9wdGlvbnMoaW5wdXRPcHRpb25zKTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSBpZiAoX3R5cGVvZihwYXJhbXMuaW5wdXRPcHRpb25zKSA9PT0gJ29iamVjdCcpIHtcbiAgICAgIHByb2Nlc3NJbnB1dE9wdGlvbnMocGFyYW1zLmlucHV0T3B0aW9ucyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGVycm9yKFwiVW5leHBlY3RlZCB0eXBlIG9mIGlucHV0T3B0aW9ucyEgRXhwZWN0ZWQgb2JqZWN0LCBNYXAgb3IgUHJvbWlzZSwgZ290IFwiLmNvbmNhdChfdHlwZW9mKHBhcmFtcy5pbnB1dE9wdGlvbnMpKSk7XG4gICAgfVxuICB9O1xuXG4gIHZhciBoYW5kbGVJbnB1dFZhbHVlID0gZnVuY3Rpb24gaGFuZGxlSW5wdXRWYWx1ZShpbnN0YW5jZSwgcGFyYW1zKSB7XG4gICAgdmFyIGlucHV0ID0gaW5zdGFuY2UuZ2V0SW5wdXQoKTtcbiAgICBoaWRlKGlucHV0KTtcbiAgICBhc1Byb21pc2UocGFyYW1zLmlucHV0VmFsdWUpLnRoZW4oZnVuY3Rpb24gKGlucHV0VmFsdWUpIHtcbiAgICAgIGlucHV0LnZhbHVlID0gcGFyYW1zLmlucHV0ID09PSAnbnVtYmVyJyA/IHBhcnNlRmxvYXQoaW5wdXRWYWx1ZSkgfHwgMCA6IFwiXCIuY29uY2F0KGlucHV0VmFsdWUpO1xuICAgICAgc2hvdyhpbnB1dCk7XG4gICAgICBpbnB1dC5mb2N1cygpO1xuICAgICAgaW5zdGFuY2UuaGlkZUxvYWRpbmcoKTtcbiAgICB9KVtcImNhdGNoXCJdKGZ1bmN0aW9uIChlcnIpIHtcbiAgICAgIGVycm9yKFwiRXJyb3IgaW4gaW5wdXRWYWx1ZSBwcm9taXNlOiBcIi5jb25jYXQoZXJyKSk7XG4gICAgICBpbnB1dC52YWx1ZSA9ICcnO1xuICAgICAgc2hvdyhpbnB1dCk7XG4gICAgICBpbnB1dC5mb2N1cygpO1xuICAgICAgaW5zdGFuY2UuaGlkZUxvYWRpbmcoKTtcbiAgICB9KTtcbiAgfTtcblxuICB2YXIgcG9wdWxhdGVJbnB1dE9wdGlvbnMgPSB7XG4gICAgc2VsZWN0OiBmdW5jdGlvbiBzZWxlY3QoY29udGVudCwgaW5wdXRPcHRpb25zLCBwYXJhbXMpIHtcbiAgICAgIHZhciBzZWxlY3QgPSBnZXRDaGlsZEJ5Q2xhc3MoY29udGVudCwgc3dhbENsYXNzZXMuc2VsZWN0KTtcblxuICAgICAgdmFyIHJlbmRlck9wdGlvbiA9IGZ1bmN0aW9uIHJlbmRlck9wdGlvbihwYXJlbnQsIG9wdGlvbkxhYmVsLCBvcHRpb25WYWx1ZSkge1xuICAgICAgICB2Y
8443XIgb3B0aW9uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnb3B0aW9uJyk7XG4gICAgICAgIG9wdGlvbi52YWx1ZSA9IG9wdGlvblZhbHVlO1xuICAgICAgICBzZXRJbm5lckh0bWwob3B0aW9uLCBvcHRpb25MYWJlbCk7XG4gICAgICAgIG9wdGlvbi5zZWxlY3RlZCA9IGlzU2VsZWN0ZWQob3B0aW9uVmFsdWUsIHBhcmFtcy5pbnB1dFZhbHVlKTtcbiAgICAgICAgcGFyZW50LmFwcGVuZENoaWxkKG9wdGlvbik7XG4gICAgICB9O1xuXG4gICAgICBpbnB1dE9wdGlvbnMuZm9yRWFjaChmdW5jdGlvbiAoaW5wdXRPcHRpb24pIHtcbiAgICAgICAgdmFyIG9wdGlvblZhbHVlID0gaW5wdXRPcHRpb25bMF07XG4gICAgICAgIHZhciBvcHRpb25MYWJlbCA9IGlucHV0T3B0aW9uWzFdOyAvLyA8b3B0Z3JvdXA+IHNwZWM6XG4gICAgICAgIC8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9odG1sNDAxL2ludGVyYWN0L2Zvcm1zLmh0bWwjaC0xNy42XG4gICAgICAgIC8vIFwiLi4uYWxsIE9QVEdST1VQIGVsZW1lbnRzIG11c3QgYmUgc3BlY2lmaWVkIGRpcmVjdGx5IHdpdGhpbiBhIFNFTEVDVCBlbGVtZW50IChpLmUuLCBncm91cHMgbWF5IG5vdCBiZSBuZXN0ZWQpLi4uXCJcbiAgICAgICAgLy8gY2hlY2sgd2hldGhlciB0aGlzIGlzIGEgPG9wdGdyb3VwPlxuXG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KG9wdGlvbkxhYmVsKSkge1xuICAgICAgICAgIC8vIGlmIGl0IGlzIGFuIGFycmF5LCB0aGVuIGl0IGlzIGFuIDxvcHRncm91cD5cbiAgICAgICAgICB2YXIgb3B0Z3JvdXAgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdvcHRncm91cCcpO1xuICAgICAgICAgIG9wdGdyb3VwLmxhYmVsID0gb3B0aW9uVmFsdWU7XG4gICAgICAgICAgb3B0Z3JvdXAuZGlzYWJsZWQgPSBmYWxzZTsgLy8gbm90IGNvbmZpZ3VyYWJsZSBmb3Igbm93XG5cbiAgICAgICAgICBzZWxlY3QuYXBwZW5kQ2hpbGQob3B0Z3JvdXApO1xuICAgICAgICAgIG9wdGlvbkxhYmVsLmZvckVhY2goZnVuY3Rpb24gKG8pIHtcbiAgICAgICAgICAgIHJldHVybiByZW5kZXJPcHRpb24ob3B0Z3JvdXAsIG9bMV0sIG9bMF0pO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIGNhc2Ugb2YgPG9wdGlvbj5cbiAgICAgICAgICByZW5kZXJPcHRpb24oc2VsZWN0LCBvcHRpb25MYWJlbCwgb3B0aW9uVmFsdWUpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIHNlbGVjdC5mb2N1cygpO1xuICAgIH0sXG4gICAgcmFkaW86IGZ1bmN0aW9uIHJhZGlvKGNvbnRlbnQsIGlucHV0T3B0aW9ucywgcGFyYW1zKSB7XG4gICAgICB2Y
8443XIgcmFkaW8gPSBnZXRDaGlsZEJ5Q2xhc3MoY29udGVudCwgc3dhbENsYXNzZXMucmFkaW8pO1xuICAgICAgaW5wdXRPcHRpb25zLmZvckVhY2goZnVuY3Rpb24gKGlucHV0T3B0aW9uKSB7XG4gICAgICAgIHZhciByYWRpb1ZhbHVlID0gaW5wdXRPcHRpb25bMF07XG4gICAgICAgIHZhciByYWRpb0xhYmVsID0gaW5wdXRPcHRpb25bMV07XG4gICAgICAgIHZhciByYWRpb0lucHV0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW5wdXQnKTtcbiAgICAgICAgdmFyIHJhZGlvTGFiZWxFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnbGFiZWwnKTtcbiAgICAgICAgcmFkaW9JbnB1dC50eXBlID0gJ3JhZGlvJztcbiAgICAgICAgcmFkaW9JbnB1dC5uYW1lID0gc3dhbENsYXNzZXMucmFkaW87XG4gICAgICAgIHJhZGlvSW5wdXQudmFsdWUgPSByYWRpb1ZhbHVlO1xuXG4gICAgICAgIGlmIChpc1NlbGVjdGVkKHJhZGlvVmFsdWUsIHBhcmFtcy5pbnB1dFZhbHVlKSkge1xuICAgICAgICAgIHJhZGlvSW5wdXQuY2hlY2tlZCA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgbGFiZWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7XG4gICAgICAgIHNldElubmVySHRtbChsYWJlbCwgcmFkaW9MYWJlbCk7XG4gICAgICAgIGxhYmVsLmNsYXNzTmFtZSA9IHN3YWxDbGFzc2VzLmxhYmVsO1xuICAgICAgICByYWRpb0xhYmVsRWxlbWVudC5hcHBlbmRDaGlsZChyYWRpb0lucHV0KTtcbiAgICAgICAgcmFkaW9MYWJlbEVsZW1lbnQuYXBwZW5kQ2hpbGQobGFiZWwpO1xuICAgICAgICByYWRpby5hcHBlbmRDaGlsZChyYWRpb0xhYmVsRWxlbWVudCk7XG4gICAgICB9KTtcbiAgICAgIHZhciByYWRpb3MgPSByYWRpby5xdWVyeVNlbGVjdG9yQWxsKCdpbnB1dCcpO1xuXG4gICAgICBpZiAocmFkaW9zLmxlbmd0aCkge1xuICAgICAgICByYWRpb3NbMF0uZm9jdXMoKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG4gIC8qKlxuICAgKiBDb252ZXJ0cyBgaW5wdXRPcHRpb25zYCBpbnRvIGFuIGFycmF5IG9mIGBbdmFsdWUsIGxhYmVsXWBzXG4gICAqIEBwYXJhbSBpbnB1dE9wdGlvbnNcbiAgICovXG5cbiAgdmFyIGZvcm1hdElucHV0T3B0aW9ucyA9IGZ1bmN0aW9uIGZvcm1hdElucHV0T3B0aW9ucyhpbnB1dE9wdGlvbnMpIHtcbiAgICB2YXIgcmVzdWx0ID0gW107XG5cbiAgICBpZiAodHlwZW9mIE1hcCAhPT0gJ3VuZGVmaW5lZCcgJiYgaW5wdXRPcHRpb25zIGluc3RhbmNlb2YgTWFwKSB7XG4gICAgICBpbnB1dE9wdGlvbnMuZm9yRWFjaChmdW5jdGlvbiAodmFsdWUsIGtleSkge1xuICAgICAgICB2Y
8443XIgdmFsdWVGb3JtYXR0ZWQgPSB2YWx1ZTtcblxuICAgICAgICBpZiAoX3R5cGVvZih2YWx1ZUZvcm1hdHRlZCkgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgLy8gY2FzZSBvZiA8b3B0Z3JvdXA+XG4gICAgICAgICAgdmFsdWVGb3JtYXR0ZWQgPSBmb3JtYXRJbnB1dE9wdGlvbnModmFsdWVGb3JtYXR0ZWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmVzdWx0LnB1c2goW2tleSwgdmFsdWVGb3JtYXR0ZWRdKTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBPYmplY3Qua2V5cyhpbnB1dE9wdGlvbnMpLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgICB2YXIgdmFsdWVGb3JtYXR0ZWQgPSBpbnB1dE9wdGlvbnNba2V5XTtcblxuICAgICAgICBpZiAoX3R5cGVvZih2YWx1ZUZvcm1hdHRlZCkgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgLy8gY2FzZSBvZiA8b3B0Z3JvdXA+XG4gICAgICAgICAgdmFsdWVGb3JtYXR0ZWQgPSBmb3JtYXRJbnB1dE9wdGlvbnModmFsdWVGb3JtYXR0ZWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmVzdWx0LnB1c2goW2tleSwgdmFsdWVGb3JtYXR0ZWRdKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH07XG5cbiAgdmFyIGlzU2VsZWN0ZWQgPSBmdW5jdGlvbiBpc1NlbGVjdGVkKG9wdGlvblZhbHVlLCBpbnB1dFZhbHVlKSB7XG4gICAgcmV0dXJuIGlucHV0VmFsdWUgJiYgaW5wdXRWYWx1ZS50b1N0cmluZygpID09PSBvcHRpb25WYWx1ZS50b1N0cmluZygpO1xuICB9O1xuXG4gIHZhciBoYW5kbGVDb25maXJtQnV0dG9uQ2xpY2sgPSBmdW5jdGlvbiBoYW5kbGVDb25maXJtQnV0dG9uQ2xpY2soaW5zdGFuY2UsIGlubmVyUGFyYW1zKSB7XG4gICAgaW5zdGFuY2UuZGlzYWJsZUJ1dHRvbnMoKTtcblxuICAgIGlmIChpbm5lclBhcmFtcy5pbnB1dCkge1xuICAgICAgaGFuZGxlQ29uZmlybU9yRGVueVdpdGhJbnB1dChpbnN0YW5jZSwgaW5uZXJQYXJhbXMsICdjb25maXJtJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbmZpcm0oaW5zdGFuY2UsIGlubmVyUGFyYW1zLCB0cnVlKTtcbiAgICB9XG4gIH07XG4gIHZhciBoYW5kbGVEZW55QnV0dG9uQ2xpY2sgPSBmdW5jdGlvbiBoYW5kbGVEZW55QnV0dG9uQ2xpY2soaW5zdGFuY2UsIGlubmVyUGFyYW1zKSB7XG4gICAgaW5zdGFuY2UuZGlzYWJsZUJ1dHRvbnMoKTtcblxuICAgIGlmIChpbm5lclBhcmFtcy5yZXR1cm5JbnB1dFZhbHVlT25EZW55KSB7XG4gICAgICBoYW5kbGVDb25maXJtT3JEZW55V2l0aElucHV0KGluc3RhbmNlLCBpbm5lclBhcmFtcywgJ2RlbnknKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZGVueShpbnN0YW5jZSwgaW5uZXJQYXJhbXMsIGZhbHNlKTtcbiAgICB9XG4gIH07XG4gIHZhciBoYW5kbGVDYW5jZWxCdXR0b25DbGljayA9IGZ1bmN0aW9uIGhhbmRsZUNhbmNlbEJ1dHRvbkNsaWNrKGluc3RhbmNlLCBkaXNtaXNzV2l0aCkge1xuICAgIGluc3RhbmNlLmRpc2FibGVCdXR0b25zKCk7XG4gICAgZGlzbWlzc1dpdGgoRGlzbWlzc1JlYXNvbi5jYW5jZWwpO1xuICB9O1xuXG4gIHZhciBoYW5kbGVDb25maXJtT3JEZW55V2l0aElucHV0ID0gZnVuY3Rpb24gaGFuZGxlQ29uZmlybU9yRGVueVdpdGhJbnB1dChpbnN0YW5jZSwgaW5uZXJQYXJhbXMsIHR5cGVcbiAgLyogdHlwZSBpcyBlaXRoZXIgJ2NvbmZpcm0nIG9yICdkZW55JyAqL1xuICApIHtcbiAgICB2YXIgaW5wdXRWYWx1ZSA9IGdldElucHV0VmFsdWUoaW5zdGFuY2UsIGlubmVyUGFyYW1zKTtcblxuICAgIGlmIChpbm5lclBhcmFtcy5pbnB1dFZhbGlkYXRvcikge1xuICAgICAgaGFuZGxlSW5wdXRWYWxpZGF0b3IoaW5zdGFuY2UsIGlubmVyUGFyYW1zLCBpbnB1dFZhbHVlKTtcbiAgICB9IGVsc2UgaWYgKCFpbnN0YW5jZS5nZXRJbnB1dCgpLmNoZWNrVmFsaWRpdHkoKSkge1xuICAgICAgaW5zdGFuY2UuZW5hYmxlQnV0dG9ucygpO1xuICAgICAgaW5zdGFuY2Uuc2hvd1ZhbGlkYXRpb25NZXNzYWdlKGlubmVyUGFyYW1zLnZhbGlkYXRpb25NZXNzYWdlKTtcbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdkZW55Jykge1xuICAgICAgZGVueShpbnN0YW5jZSwgaW5uZXJQYXJhbXMsIGlucHV0VmFsdWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25maXJtKGluc3RhbmNlLCBpbm5lclBhcmFtcywgaW5wdXRWYWx1ZSk7XG4gICAgfVxuICB9O1xuXG4gIHZhciBoYW5kbGVJbnB1dFZhbGlkYXRvciA9IGZ1bmN0aW9uIGhhbmRsZUlucHV0VmFsaWRhdG9yKGluc3RhbmNlLCBpbm5lclBhcmFtcywgaW5wdXRWYWx1ZSkge1xuICAgIGluc3RhbmNlLmRpc2FibGVJbnB1dCgpO1xuICAgIHZhciB2YWxpZGF0aW9uUHJvbWlzZSA9IFByb21pc2UucmVzb2x2ZSgpLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIGFzUHJvbWlzZS
8443hpbm5lclBhcmFtcy5pbnB1dFZhbGlkYXRvcihpbnB1dFZhbHVlLCBpbm5lclBhcmFtcy52YWxpZGF0aW9uTWVzc2FnZSkpO1xuICAgIH0pO1xuICAgIHZhbGlkYXRpb25Qcm9taXNlLnRoZW4oZnVuY3Rpb24gKHZhbGlkYXRpb25NZXNzYWdlKSB7XG4gICAgICBpbnN0YW5jZS5lbmFibGVCdXR0b25zKCk7XG4gICAgICBpbnN0YW5jZS5lbmFibGVJbnB1dCgpO1xuXG4gICAgICBpZiAodmFsaWRhdGlvbk1lc3NhZ2UpIHtcbiAgICAgICAgaW5zdGFuY2Uuc2hvd1ZhbGlkYXRpb25NZXNzYWdlKHZhbGlkYXRpb25NZXNzYWdlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbmZpcm0oaW5zdGFuY2UsIGlubmVyUGFyYW1zLCBpbnB1dFZhbHVlKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfTtcblxuICB2YXIgZGVueSA9IGZ1bmN0aW9uIGRlbnkoaW5zdGFuY2UsIGlubmVyUGFyYW1zLCB2YWx1ZSkge1xuICAgIGlmIChpbm5lclBhcmFtcy5zaG93TG9hZGVyT25EZW55KSB7XG4gICAgICBzaG93TG9hZGluZyhnZXREZW55QnV0dG9uKCkpO1xuICAgIH1cblxuICAgIGlmIChpbm5lclBhcmFtcy5wcmVEZW55KSB7XG4gICAgICB2YXIgcHJlRGVueVByb21pc2UgPSBQcm9taXNlLnJlc29sdmUoKS50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIGFzUHJvbWlzZShpbm5lclBhcmFtcy5wcmVEZW55KHZhbHVlLCBpbm5lclBhcmFtcy52YWxpZGF0aW9uTWVzc2FnZSkpO1xuICAgICAgfSk7XG4gICAgICBwcmVEZW55UHJvbWlzZS50aGVuKGZ1bmN0aW9uIChwcmVEZW55VmFsdWUpIHtcbiAgICAgICAgaWYgKHByZURlbnlWYWx1ZSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICBpbnN0YW5jZS5oaWRlTG9hZGluZygpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGluc3RhbmNlLmNsb3NlUG9wdXAoe1xuICAgICAgICAgICAgaXNEZW5pZWQ6IHRydWUsXG4gICAgICAgICAgICB2YWx1ZTogdHlwZW9mIHByZURlbnlWYWx1ZSA9PT0gJ3VuZGVmaW5lZCcgPyB2YWx1ZSA6IHByZURlbnlWYWx1ZVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgaW5zdGFuY2UuY2xvc2VQb3B1cCh7XG4gICAgICAgIGlzRGVuaWVkOiB0cnVlLFxuICAgICAgICB2YWx1ZTogdmFsdWVcbiAgICAgIH0pO1xuICAgIH1cbiAgfTtcblxuICB2YXIgc3VjY2VlZFdpdGggPSBmdW5jdGlvbiBzdWNjZWVkV2l0aChpbnN0YW5jZSwgdmFsdWUpIHtcbiAgICBpbnN0YW5jZS5jbG9zZVBvcHVwKHtcbiAgICAgIGlzQ29uZmlybWVkOiB0cnVlLFxuICAgICAgdmFsdWU6IHZhbHVlXG4gICAgfSk7XG4gIH07XG5cbiAgdmFyIGNvbmZpcm0gPSBmdW5jdGlvbiBjb25maXJtKGluc3RhbmNlLCBpbm5lclBhcmFtcywgdmFsdWUpIHtcbiAgICBpZiAoaW5uZXJQYXJhbXMuc2hvd0xvYWRlck9uQ29uZmlybSkge1xuICAgICAgc2hvd0xvYWRpbmcoKTsgLy8gVE9ETzogbWFrZSBzaG93TG9hZGluZyBhbiAqaW5zdGFuY2UqIG1ldGhvZFxuICAgIH1cblxuICAgIGlmIChpbm5lclBhcmFtcy5wcmVDb25maXJtKSB7XG4gICAgICBpbnN0YW5jZS5yZXNldFZhbGlkYXRpb25NZXNzYWdlKCk7XG4gICAgICB2Y
8443XIgcHJlQ29uZmlybVByb21pc2UgPSBQcm9taXNlLnJlc29sdmUoKS50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIGFzUHJvbWlzZShpbm5lclBhcmFtcy5wcmVDb25maXJtKHZhbHVlLCBpbm5lclBhcmFtcy52YWxpZGF0aW9uTWVzc2FnZSkpO1xuICAgICAgfSk7XG4gICAgICBwcmVDb25maXJtUHJvbWlzZS50aGVuKGZ1bmN0aW9uIChwcmVDb25maXJtVmFsdWUpIHtcbiAgICAgICAgaWYgKGlzVmlzaWJsZShnZXRWYWxpZGF0aW9uTWVzc2FnZSgpKSB8fCBwcmVDb25maXJtVmFsdWUgPT09IGZhbHNlKSB7XG4gICAgICAgICAgaW5zdGFuY2UuaGlkZUxvYWRpbmcoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzdWNjZWVkV2l0aChpbnN0YW5jZSwgdHlwZW9mIHByZUNvbmZpcm1WYWx1ZSA9PT0gJ3VuZGVmaW5lZCcgPyB2YWx1ZSA6IHByZUNvbmZpcm1WYWx1ZSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBzdWNjZWVkV2l0aChpbnN0YW5jZSwgdmFsdWUpO1xuICAgIH1cbiAgfTtcblxuICB2YXIgYWRkS2V5ZG93bkhhbmRsZXIgPSBmdW5jdGlvbiBhZGRLZXlkb3duSGFuZGxlcihpbnN0YW5jZSwgZ2xvYmFsU3RhdGUsIGlubmVyUGFyYW1zLCBkaXNtaXNzV2l0aCkge1xuICAgIGlmIChnbG9iYWxTdGF0ZS5rZXlkb3duVGFyZ2V0ICYmIGdsb2JhbFN0YXRlLmtleWRvd25IYW5kbGVyQWRkZWQpIHtcbiAgICAgIGdsb2JhbFN0YXRlLmtleWRvd25UYXJnZXQucmVtb3ZlRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIGdsb2JhbFN0YXRlLmtleWRvd25IYW5kbGVyLCB7XG4gICAgICAgIGNhcHR1cmU6IGdsb2JhbFN0YXRlLmtleWRvd25MaXN0ZW5lckNhcHR1cmVcbiAgICAgIH0pO1xuICAgICAgZ2xvYmFsU3RhdGUua2V5ZG93bkhhbmRsZXJBZGRlZCA9IGZhbHNlO1xuICAgIH1cblxuICAgIGlmICghaW5uZXJQYXJhbXMudG9hc3QpIHtcbiAgICAgIGdsb2JhbFN0YXRlLmtleWRvd25IYW5kbGVyID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgcmV0dXJuIGtleWRvd25IYW5kbGVyKGluc3RhbmNlLCBlLCBkaXNtaXNzV2l0aCk7XG4gICAgICB9O1xuXG4gICAgICBnbG9iYWxTdGF0ZS5rZXlkb3duVGFyZ2V0ID0gaW5uZXJQYXJhbXMua2V5ZG93bkxpc3RlbmVyQ2FwdHVyZSA/IHdpbmRvdyA6IGdldFBvcHVwKCk7XG4gICAgICBnbG9iYWxTdGF0ZS5rZXlkb3duTGlzdGVuZXJDYXB0dXJlID0gaW5uZXJQYXJhbXMua2V5ZG93bkxpc3RlbmVyQ2FwdHVyZTtcbiAgICAgIGdsb2JhbFN0YXRlLmtleWRvd25UYXJnZXQuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIGdsb2JhbFN0YXRlLmtleWRvd25IYW5kbGVyLCB7XG4gICAgICAgIGNhcHR1cmU6IGdsb2JhbFN0YXRlLmtleWRvd25MaXN0ZW5lckNhcHR1cmVcbiAgICAgIH0pO1xuICAgICAgZ2xvYmFsU3RhdGUua2V5ZG93bkhhbmRsZXJBZGRlZCA9IHRydWU7XG4gICAgfVxuICB9OyAvLyBGb2N1cyBoYW5kbGluZ1xuXG4gIHZhciBzZXRGb2N1cyA9IGZ1bmN0aW9uIHNldEZvY3VzKGlubmVyUGFyYW1zLCBpbmRleCwgaW5jcmVtZW50KSB7XG4gICAgdmFyIGZvY3VzYWJsZUVsZW1lbnRzID0gZ2V0Rm9jdXNhYmxlRWxlbWVudHMoKTsgLy8gc2VhcmNoIGZvciB2aXNpYmxlIGVsZW1lbnRzIGFuZCBzZWxlY3QgdGhlIG5leHQgcG9zc2libGUgbWF0Y2hcblxuICAgIGlmIChmb2N1c2FibGVFbGVtZW50cy5sZW5ndGgpIHtcbiAgICAgIGluZGV4ID0gaW5kZXggKyBpbmNyZW1lbnQ7IC8vIHJvbGxvdmVyIHRvIGZpcnN0IGl0ZW1cblxuICAgICAgaWYgKGluZGV4ID09PSBmb2N1c2FibGVFbGVtZW50cy5sZW5ndGgpIHtcbiAgICAgICAgaW5kZXggPSAwOyAvLyBnbyB0byBsYXN0IGl0ZW1cbiAgICAgIH0gZWxzZSBpZiAoaW5kZXggPT09IC0xKSB7XG4gICAgICAgIGluZGV4ID0gZm9jdXNhYmxlRWxlbWVudHMubGVuZ3RoIC0gMTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGZvY3VzYWJsZUVsZW1lbnRzW2luZGV4XS5mb2N1cygpO1xuICAgIH0gLy8gbm8gdmlzaWJsZSBmb2N1c2FibGUgZWxlbWVudHMsIGZvY3VzIHRoZSBwb3B1cFxuXG5cbiAgICBnZXRQb3B1cCgpLmZvY3VzKCk7XG4gIH07XG4gIHZhciBhcnJvd0tleXNOZXh0QnV0dG9uID0gWydBcnJvd1JpZ2h0JywgJ0Fycm93RG93bicsICdSaWdodCcsICdEb3duJyAvLyBJRTExXG4gIF07XG4gIHZhciBhcnJvd0tleXNQcmV2aW91c0J1dHRvbiA9IFsnQXJyb3dMZWZ0JywgJ0Fycm93VXAnLCAnTGVmdCcsICdVcCcgLy8gSUUxMVxuICBdO1xuICB2YXIgZXNjS2V5cyA9IFsnRXNjYXBlJywgJ0VzYycgLy8gSUUxMVxuICBdO1xuXG4gIHZhciBrZXlkb3duSGFuZGxlciA9IGZ1bmN0aW9uIGtleWRvd25IYW5kbGVyKGluc3RhbmNlLCBlLCBkaXNtaXNzV2l0aCkge1xuICAgIHZhciBpbm5lclBhcmFtcyA9IHByaXZhdGVQcm9wcy5pbm5lclBhcmFtcy5nZXQoaW5zdGFuY2UpO1xuXG4gICAgaWYgKGlubmVyUGFyYW1zLnN0b3BLZXlkb3duUHJvcGFnYXRpb24pIHtcbiAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgfSAvLyBFTlRFUlxuXG5cbiAgICBpZiAoZS5rZXkgPT09ICdFbnRlcicpIHtcbiAgICAgIGhhbmRsZUVudGVyKGluc3RhbmNlLCBlLCBpbm5lclBhcmFtcyk7IC8vIFRBQlxuICAgIH0gZWxzZSBpZiAoZS5rZXkgPT09ICdUYWInKSB7XG4gICAgICBoYW5kbGVUYWIoZSwgaW5uZXJQYXJhbXMpOyAvLyBBUlJPV1MgLSBzd2l0Y2ggZm9jdXMgYmV0d2VlbiBidXR0b25zXG4gICAgfSBlbHNlIGlmIChbXS5jb25jYXQoYXJyb3dLZXlzTmV4dEJ1dHRvbiwgYXJyb3dLZXlzUHJldmlvdXNCdXR0b24pLmluZGV4T2YoZS5rZXkpICE9PSAtMSkge1xuICAgICAgaGFuZGxlQXJyb3dzKGUua2V5KTsgLy8gRVNDXG4gICAgfSBlbHNlIGlmIChlc2NLZXlzLmluZGV4T2YoZS5rZXkpICE9PSAtMSkge1xuICAgICAgaGFuZGxlRXNjKGUsIGlubmVyUGFyYW1zLCBkaXNtaXNzV2l0aCk7XG4gICAgfVxuICB9O1xuXG4gIHZhciBoYW5kbGVFbnRlciA9IGZ1bmN0aW9uIGhhbmRsZUVudGVyKGluc3RhbmNlLCBlLCBpbm5lclBhcmFtcykge1xuICAgIC8vICM3MjAgIzcyMVxuICAgIGlmIChlLmlzQ29tcG9zaW5nKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGUudGFyZ2V0ICYmIGluc3RhbmNlLmdldElucHV0KCkgJiYgZS50YXJnZXQub3V0ZXJIVE1MID09PSBpbnN0YW5jZS5nZXRJbnB1dCgpLm91dGVySFRNTCkge1xuICAgICAgaWYgKFsndGV4dGFyZWEnLCAnZmlsZSddLmluZGV4T2YoaW5uZXJQYXJhbXMuaW5wdXQpICE9PSAtMSkge1xuICAgICAgICByZXR1cm47IC8vIGRvIG5vdCBzdWJtaXRcbiAgICAgIH1cblxuICAgICAgY2xpY2tDb25maXJtKCk7XG4gICAgICBlLnByZXZlbn
8443REZWZhdWx0KCk7XG4gICAgfVxuICB9O1xuXG4gIHZhciBoYW5kbGVUYWIgPSBmdW5jdGlvbiBoYW5kbGVUYWIoZSwgaW5uZXJQYXJhbXMpIHtcbiAgICB2YXIgdGFyZ2V0RWxlbWVudCA9IGUudGFyZ2V0O1xuICAgIHZhciBmb2N1c2FibGVFbGVtZW50cyA9IGdldEZvY3VzYWJsZUVsZW1lbnRzKCk7XG4gICAgdmFyIGJ0bkluZGV4ID0gLTE7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGZvY3VzYWJsZUVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAodGFyZ2V0RWxlbWVudCA9PT0gZm9jdXNhYmxlRWxlbWVudHNbaV0pIHtcbiAgICAgICAgYnRuSW5kZXggPSBpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIWUuc2hpZnRLZXkpIHtcbiAgICAgIC8vIEN5Y2xlIHRvIHRoZSBuZXh0IGJ1dHRvblxuICAgICAgc2V0Rm9jdXMoaW5uZXJQYXJhbXMsIGJ0bkluZGV4LCAxKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gQ3ljbGUgdG8gdGhlIHByZXYgYnV0dG9uXG4gICAgICBzZXRGb2N1cyhpbm5lclBhcmFtcywgYnRuSW5kZXgsIC0xKTtcbiAgICB9XG5cbiAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgfTtcblxuICB2YXIgaGFuZGxlQXJyb3dzID0gZnVuY3Rpb24gaGFuZGxlQXJyb3dzKGtleSkge1xuICAgIHZhciBjb25maXJtQnV0dG9uID0gZ2V0Q29uZmlybUJ1dHRvbigpO1xuICAgIHZhciBkZW55QnV0dG9uID0gZ2V0RGVueUJ1dHRvbigpO1xuICAgIHZhciBjYW5jZWxCdXR0b24gPSBnZXRDYW5jZWxCdXR0b24oKTtcblxuICAgIGlmICghKFtjb25maXJtQnV0dG9uLCBkZW55QnV0dG9uLCBjYW5jZWxCdXR0b25dLmluZGV4T2YoZG9jdW1lbnQuYWN0aXZlRWxlbWVudCkgIT09IC0xKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciBzaWJsaW5nID0gYXJyb3dLZXlzTmV4dEJ1dHRvbi5pbmRleE9mKGtleSkgIT09IC0xID8gJ25leHRFbGVtZW50U2libGluZycgOiAncHJldmlvdXNFbGVtZW50U2libGluZyc7XG4gICAgdmFyIGJ1dHRvblRvRm9jdXMgPSBkb2N1bWVudC5hY3RpdmVFbGVtZW50W3NpYmxpbmddO1xuXG4gICAgaWYgKGJ1dHRvblRvRm9jdXMpIHtcbiAgICAgIGJ1dHRvblRvRm9jdXMuZm9jdXMoKTtcbiAgICB9XG4gIH07XG5cbiAgdmFyIGhhbmRsZUVzYyA9IGZ1bmN0aW9uIGhhbmRsZUVzYyhlLCBpbm5lclBhcmFtcywgZGlzbWlzc1dpdGgpIHtcbiAgICBpZiAoY2FsbElmRnVuY3Rpb24oaW5uZXJQYXJhbXMuYWxsb3dFc2NhcGVLZXkpKSB7XG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBkaXNtaXNzV2l0aChEaXNtaXNzUmVhc29uLmVzYyk7XG4gICAgfVxuICB9O1xuXG4gIHZhciBoYW5kbGVQb3B1cENsaWNrID0gZnVuY3Rpb24gaGFuZGxlUG9wdXBDbGljayhpbnN0YW5jZSwgZG9tQ2FjaGUsIGRpc21pc3NXaXRoKSB7XG4gICAgdmFyIGlubmVyUGFyYW1zID0gcHJpdmF0ZVByb3BzLmlubmVyUGFyYW1zLmdldChpbnN0YW5jZSk7XG5cbiAgICBpZiAoaW5uZXJQYXJhbXMudG9hc3QpIHtcbiAgICAgIGhhbmRsZVRvYXN0Q2xpY2soaW5zdGFuY2UsIGRvbUNhY2hlLCBkaXNtaXNzV2l0aCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIElnbm9yZSBjbGljayBldmVudHMgdGhhdCBoYWQgbW91c2Vkb3duIG9uIHRoZSBwb3B1cCBidXQgbW91c2V1cCBvbiB0aGUgY29udGFpbmVyXG4gICAgICAvLyBUaGlzIGNhbiBoYXBwZW4gd2hlbiB0aGUgdXNlciBkcmFncyBhIHNsaWRlclxuICAgICAgaGFuZGxlTW9kYWxNb3VzZWRvd24oZG9tQ2FjaGUpOyAvLyBJZ25vcmUgY2xpY2sgZXZlbnRzIHRoYXQgaGFkIG1vdXNlZG93biBvbiB0aGUgY29udGFpbmVyIGJ1dCBtb3VzZXVwIG9uIHRoZSBwb3B1cFxuXG4gICAgICBoYW5kbGVDb250YWluZXJNb3VzZWRvd24oZG9tQ2FjaGUpO1xuICAgICAgaGFuZGxlTW9kYWxDbGljayhpbnN0YW5jZSwgZG9tQ2FjaGUsIGRpc21pc3NXaXRoKTtcbiAgICB9XG4gIH07XG5cbiAgdmFyIGhhbmRsZVRvYXN0Q2xpY2sgPSBmdW5jdGlvbiBoYW5kbGVUb2FzdENsaWNrKGluc3RhbmNlLCBkb21DYWNoZSwgZGlzbWlzc1dpdGgpIHtcbiAgICAvLyBDbG9zaW5nIHRvYXN0IGJ5IGludGVybmFsIGNsaWNrXG4gICAgZG9tQ2FjaGUucG9wdXAub25jbGljayA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBpbm5lclBhcmFtcyA9IHByaXZhdGVQcm9wcy5pbm5lclBhcmFtcy5nZXQoaW5zdGFuY2UpO1xuXG4gICAgICBpZiAoaW5uZXJQYXJhbXMuc2hvd0NvbmZpcm1CdXR0b24gfHwgaW5uZXJQYXJhbXMuc2hvd0RlbnlCdXR0b24gfHwgaW5uZXJQYXJhbXMuc2hvd0NhbmNlbEJ1dHRvbiB8fCBpbm5lclBhcmFtcy5zaG93Q2xvc2VCdXR0b24gfHwgaW5uZXJQYXJhbXMudGltZXIgfHwgaW5uZXJQYXJhbXMuaW5wdXQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBkaXNtaXNzV2l0aChEaXNtaXNzUmVhc29uLmNsb3NlKTtcbiAgICB9O1xuICB9O1xuXG4gIHZhciBpZ25vcmVPdXRzaWRlQ2xpY2sgPSBmYWxzZTtcblxuICB2YXIgaGFuZGxlTW9kYWxNb3VzZWRvd24gPSBmdW5jdGlvbiBoYW5kbGVNb2RhbE1vdXNlZG93bihkb21DYWNoZSkge1xuICAgIGRvbUNhY2hlLnBvcHVwLm9ubW91c2Vkb3duID0gZnVuY3Rpb24gKCkge1xuICAgICAgZG9tQ2FjaGUuY29udGFpbmVyLm9ubW91c2V1cCA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIGRvbUNhY2hlLmNvbnRhaW5lci5vbm1vdXNldXAgPSB1bmRlZmluZWQ7IC8vIFdlIG9ubHkgY2hlY2sgaWYgdGhlIG1vdXNldXAgdGFyZ2V0IGlzIHRoZSBjb250YWluZXIgYmVjYXVzZSB1c3VhbGx5IGl0IGRvZXNuJ3RcbiAgICAgICAgLy8gaGF2ZSBhbnkgb3RoZXIgZGlyZWN0IGNoaWxkcmVuIGFzaWRlIG9mIHRoZSBwb3B1cFxuXG4gICAgICAgIGlmIChlLnRhcmdldCA9PT0gZG9tQ2FjaGUuY29udGFpbmVyKSB7XG4gICAgICAgICAgaWdub3JlT3V0c2lkZUNsaWNrID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9O1xuICB9O1xuXG4gIHZhciBoYW5kbGVDb250YWluZXJNb3VzZWRvd24gPSBmdW5jdGlvbiBoYW5kbGVDb250YWluZXJNb3VzZWRvd24oZG9tQ2FjaGUpIHtcbiAgICBkb21DYWNoZS5jb250YWluZXIub25tb3VzZWRvd24gPSBmdW5jdGlvbiAoKSB7XG4gICAgICBkb21DYWNoZS5wb3B1cC
84435vbm1vdXNldXAgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgICBkb21DYWNoZS5wb3B1cC5vbm1vdXNldXAgPSB1bmRlZmluZWQ7IC8vIFdlIGFsc28gbmVlZCB0byBjaGVjayBpZiB0aGUgbW91c2V1cCB0YXJnZXQgaXMgYSBjaGlsZCBvZiB0aGUgcG9wdXBcblxuICAgICAgICBpZiAoZS50YXJnZXQgPT09IGRvbUNhY2hlLnBvcHVwIHx8IGRvbUNhY2hlLnBvcHVwLmNvbnRhaW5zKGUudGFyZ2V0KSkge1xuICAgICAgICAgIGlnbm9yZU91dHNpZGVDbGljayA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfTtcbiAgfTtcblxuICB2YXIgaGFuZGxlTW9kYWxDbGljayA9IGZ1bmN0aW9uIGhhbmRsZU1vZGFsQ2xpY2soaW5zdGFuY2UsIGRvbUNhY2hlLCBkaXNtaXNzV2l0aCkge1xuICAgIGRvbUNhY2hlLmNvbnRhaW5lci5vbmNsaWNrID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgIHZhciBpbm5lclBhcmFtcyA9IHByaXZhdGVQcm9wcy5pbm5lclBhcmFtcy5nZXQoaW5zdGFuY2UpO1xuXG4gICAgICBpZiAoaWdub3JlT3V0c2lkZUNsaWNrKSB7XG4gICAgICAgIGlnbm9yZU91dHNpZGVDbGljayA9IGZhbHNlO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmIChlLnRhcmdldCA9PT0gZG9tQ2FjaGUuY29udGFpbmVyICYmIGNhbGxJZkZ1bmN0aW9uKGlubmVyUGFyYW1zLmFsbG93T3V0c2lkZUNsaWNrKSkge1xuICAgICAgICBkaXNtaXNzV2l0aChEaXNtaXNzUmVhc29uLmJhY2tkcm9wKTtcbiAgICAgIH1cbiAgICB9O1xuICB9O1xuXG4gIGZ1bmN0aW9uIF9tYWluKHVzZXJQYXJhbXMpIHtcbiAgICB2YXIgbWl4aW5QYXJhbXMgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IHt9O1xuICAgIHNob3dXYXJuaW5nc0ZvclBhcmFtcyhfZXh0ZW5kcyh7fSwgbWl4aW5QYXJhbXMsIHVzZXJQYXJhbXMpKTtcblxuICAgIGlmIChnbG9iYWxTdGF0ZS5jdXJyZW50SW5zdGFuY2UpIHtcbiAgICAgIGdsb2JhbFN0YXRlLmN1cnJlbnRJbnN0YW5jZS5fZGVzdHJveSgpO1xuICAgIH1cblxuICAgIGdsb2JhbFN0YXRlLmN1cnJlbnRJbnN0YW5jZSA9IHRoaXM7XG4gICAgdmFyIGlubmVyUGFyYW1zID0gcHJlcGFyZVBhcmFtcyh1c2VyUGFyYW1zLCBtaXhpblBhcmFtcyk7XG4gICAgc2V0UGFyYW1ldGVycyhpbm5lclBhcmFtcyk7XG4gICAgT2JqZWN0LmZyZWV6ZShpbm5lclBhcmFtcyk7IC8vIGNsZWFyIHRoZSBwcmV2aW91cyB0aW1lclxuXG4gICAgaWYgKGdsb2JhbFN0YXRlLnRpbWVvdXQpIHtcbiAgICAgIGdsb2JhbFN0YXRlLnRpbWVvdXQuc3RvcCgpO1xuICAgICAgZGVsZXRlIGdsb2JhbFN0YXRlLnRpbWVvdXQ7XG4gICAgfSAvLyBjbGVhciB0aGUgcmVzdG9yZSBmb2N1cyB0aW1lb3V0XG5cblxuICAgIGNsZWFyVGltZW91dChnbG9iYWxTdGF0ZS5yZXN0b3JlRm9jdXNUaW1lb3V0KTtcbiAgICB2YXIgZG9tQ2FjaGUgPSBwb3B1bGF0ZURvbUNhY2hlKHRoaXMpO1xuICAgIHJlbmRlcih0aGlzLCBpbm5lclBhcmFtcyk7XG4gICAgcHJpdmF0ZVByb3BzLmlubmVyUGFyYW1zLnNldCh0aGlzLCBpbm5lclBhcmFtcyk7XG4gICAgcmV0dXJuIHN3YWxQcm9taXNlKHRoaXMsIGRvbUNhY2hlLCBpbm5lclBhcmFtcyk7XG4gIH1cblxuICB2YXIgcHJlcGFyZVBhcmFtcyA9IGZ1bmN0aW9uIHByZXBhcmVQYXJhbXModXNlclBhcmFtcywgbWl4aW5QYXJhbXMpIHtcbiAgICB2YXIgdGVtcGxhdGVQYXJhbXMgPSBnZXRUZW1wbGF0ZVBhcmFtcyh1c2VyUGFyYW1zKTtcblxuICAgIHZhciBzaG93Q2xhc3MgPSBfZXh0ZW5kcyh7fSwgZGVmYXVsdFBhcmFtcy5zaG93Q2xhc3MsIG1peGluUGFyYW1zLnNob3dDbGFzcywgdGVtcGxhdGVQYXJhbXMuc2hvd0NsYXNzLCB1c2VyUGFyYW1zLnNob3dDbGFzcyk7XG5cbiAgICB2YXIgaGlkZUNsYXNzID0gX2V4dGVuZHMoe30sIGRlZmF1bHRQYXJhbXMuaGlkZUNsYXNzLCBtaXhpblBhcmFtcy5oaWRlQ2xhc3MsIHRlbXBsYXRlUGFyYW1zLmhpZGVDbGFzcywgdXNlclBhcmFtcy5oaWRlQ2xhc3MpO1xuXG4gICAgdmFyIHBhcmFtcyA9IF9leHRlbmRzKHt9LCBkZWZhdWx0UGFyYW1zLCBtaXhpblBhcmFtcywgdGVtcGxhdGVQYXJhbXMsIHVzZXJQYXJhbXMpOyAvLyBwcmVjZWRlbmNlIGlzIGRlc2NyaWJlZCBpbiAjMjEzMVxuXG5cbiAgICBwYXJhbXMuc2hvd0NsYXNzID0gc2hvd0NsYXNzO1xuICAgIHBhcmFtcy5oaWRlQ2xhc3MgPSBoaWRlQ2xhc3M7IC8vIEBkZXByZWNhdGVkXG5cbiAgICBpZiAodXNlclBhcmFtcy5hbmltYXRpb24gPT09IGZhbHNlKSB7XG4gICAgICBwYXJhbXMuc2hvd0NsYXNzID0ge1xuICAgICAgICBwb3B1cDogJ3N3YWwyLW5vYW5pbWF0aW9uJyxcbiAgICAgICAgYmFja2Ryb3A6ICdzd2FsMi1ub2FuaW1hdGlvbidcbiAgICAgIH07XG4gICAgICBwYXJhbXMuaGlkZUNsYXNzID0ge307XG4gICAgfVxuXG4gICAgcmV0dXJuIHBhcmFtcztcbiAgfTtcblxuICB2YXIgc3dhbFByb21pc2UgPSBmdW5jdGlvbiBzd2FsUHJvbWlzZShpbnN0YW5jZSwgZG9tQ2FjaGUsIGlubmVyUGFyYW1zKSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlKSB7XG4gICAgICAvLyBmdW5jdGlvbnMgdG8gaGFuZGxlIGFsbCBjbG9zaW5ncy9kaXNtaXNzYWxzXG4gICAgICB2Y
8443XIgZGlzbWlzc1dpdGggPSBmdW5jdGlvbiBkaXNtaXNzV2l0aChkaXNtaXNzKSB7XG4gICAgICAgIGluc3RhbmNlLmNsb3NlUG9wdXAoe1xuICAgICAgICAgIGlzRGlzbWlzc2VkOiB0cnVlLFxuICAgICAgICAgIGRpc21pc3M6IGRpc21pc3NcbiAgICAgICAgfSk7XG4gICAgICB9O1xuXG4gICAgICBwcml2YXRlTWV0aG9kcy5zd2FsUHJvbWlzZVJlc29sdmUuc2V0KGluc3RhbmNlLCByZXNvbHZlKTtcblxuICAgICAgZG9tQ2FjaGUuY29uZmlybUJ1dHRvbi5vbmNsaWNrID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gaGFuZGxlQ29uZmlybUJ1dHRvbkNsaWNrKGluc3RhbmNlLCBpbm5lclBhcmFtcyk7XG4gICAgICB9O1xuXG4gICAgICBkb21DYWNoZS5kZW55QnV0dG9uLm9uY2xpY2sgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBoYW5kbGVEZW55QnV0dG9uQ2xpY2soaW5zdGFuY2UsIGlubmVyUGFyYW1zKTtcbiAgICAgIH07XG5cbiAgICAgIGRvbUNhY2hlLmNhbmNlbEJ1dHRvbi5vbmNsaWNrID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gaGFuZGxlQ2FuY2VsQnV0dG9uQ2xpY2soaW5zdGFuY2UsIGRpc21pc3NXaXRoKTtcbiAgICAgIH07XG5cbiAgICAgIGRvbUNhY2hlLmNsb3NlQnV0dG9uLm9uY2xpY2sgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBkaXNtaXNzV2l0aChEaXNtaXNzUmVhc29uLmNsb3NlKTtcbiAgICAgIH07XG5cbiAgICAgIGhhbmRsZVBvcHVwQ2xpY2soaW5zdGFuY2UsIGRvbUNhY2hlLCBkaXNtaXNzV2l0aCk7XG4gICAgICBhZGRLZXlkb3duSGFuZGxlcihpbnN0YW5jZSwgZ2xvYmFsU3RhdGUsIGlubmVyUGFyYW1zLCBkaXNtaXNzV2l0aCk7XG5cbiAgICAgIGlmIChpbm5lclBhcmFtcy50b2FzdCAmJiAoaW5uZXJQYXJhbXMuaW5wdXQgfHwgaW5uZXJQYXJhbXMuZm9vdGVyIHx8IGlubmVyUGFyYW1zLnNob3dDbG9zZUJ1dHRvbikpIHtcbiAgICAgICAgYWRkQ2xhc3MoZG9jdW1lbnQuYm9keSwgc3dhbENsYXNzZXNbJ3RvYXN0LWNvbHVtbiddKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlbW92ZUNsYXNzKGRvY3VtZW50LmJvZHksIHN3YWxDbGFzc2VzWy
8443d0b2FzdC1jb2x1bW4nXSk7XG4gICAgICB9XG5cbiAgICAgIGhhbmRsZUlucHV0T3B0aW9uc0FuZFZhbHVlKGluc3RhbmNlLCBpbm5lclBhcmFtcyk7XG4gICAgICBvcGVuUG9wdXAoaW5uZXJQYXJhbXMpO1xuICAgICAgc2V0dXBUaW1lcihnbG9iYWxTdGF0ZSwgaW5uZXJQYXJhbXMsIGRpc21pc3NXaXRoKTtcbiAgICAgIGluaXRGb2N1cyhkb21DYWNoZSwgaW5uZXJQYXJhbXMpOyAvLyBTY3JvbGwgY29udGFpbmVyIHRvIHRvcCBvbiBvcGVuICgjMTI0NywgIzE5NDYpXG5cbiAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICBkb21DYWNoZS5jb250YWluZXIuc2Nyb2xsVG9wID0gMDtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9O1xuXG4gIHZhciBwb3B1bGF0ZURvbUNhY2hlID0gZnVuY3Rpb24gcG9wdWxhdGVEb21DYWNoZShpbnN0YW5jZSkge1xuICAgIHZhciBkb21DYWNoZSA9IHtcbiAgICAgIHBvcHVwOiBnZXRQb3B1cCgpLFxuICAgICAgY29udGFpbmVyOiBnZXRDb250YWluZXIoKSxcbiAgICAgIGNvbnRlbnQ6IGdldENvbnRlbnQoKSxcbiAgICAgIGFjdGlvbnM6IGdldEFjdGlvbnMoKSxcbiAgICAgIGNvbmZpcm1CdXR0b246IGdldENvbmZpcm1CdXR0b24oKSxcbiAgICAgIGRlbnlCdXR0b246IGdldERlbnlCdXR0b24oKSxcbiAgICAgIGNhbmNlbEJ1dHRvbjogZ2V0Q2FuY2VsQnV0dG9uKCksXG4gICAgICBsb2FkZXI6IGdldExvYWRlcigpLFxuICAgICAgY2xvc2VCdXR0b246IGdldENsb3NlQnV0dG9uKCksXG4gICAgICB2YWxpZGF0aW9uTWVzc2FnZTogZ2V0VmFsaWRhdGlvbk1lc3NhZ2UoKSxcbiAgICAgIHByb2dyZXNzU3RlcHM6IGdldFByb2dyZXNzU3RlcHMoKVxuICAgIH07XG4gICAgcHJpdmF0ZVByb3BzLmRvbUNhY2hlLnNldChpbnN0YW5jZSwgZG9tQ2FjaGUpO1xuICAgIHJldHVybiBkb21DYWNoZTtcbiAgfTtcblxuICB2YXIgc2V0dXBUaW1lciA9IGZ1bmN0aW9uIHNldHVwVGltZXIoZ2xvYmFsU3RhdGUkJDEsIGlubmVyUGFyYW1zLCBkaXNtaXNzV2l0aCkge1xuICAgIHZhciB0aW1lclByb2dyZXNzQmFyID0gZ2V0VGltZXJQcm9ncmVzc0JhcigpO1xuICAgIGhpZGUodGltZXJQcm9ncmVzc0Jhcik7XG5cbiAgICBpZiAoaW5uZXJQYXJhbXMudGltZXIpIHtcbiAgICAgIGdsb2JhbFN0YXRlJCQxLnRpbWVvdXQgPSBuZXcgVGltZXIoZnVuY3Rpb24gKCkge1xuICAgICAgICBkaXNtaXNzV2l0aCgndGltZXInKTtcbiAgICAgICAgZGVsZXRlIGdsb2JhbFN0YXRlJCQxLnRpbWVvdXQ7XG4gICAgICB9LCBpbm5lclBhcmFtcy50aW1lcik7XG5cbiAgICAgIGlmIChpbm5lclBhcmFtcy50aW1lclByb2dyZXNzQmFyKSB7XG4gICAgICAgIHNob3codGltZXJQcm9ncmVzc0Jhcik7XG4gICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGlmIChnbG9iYWxTdGF0ZSQkMS50aW1lb3V0ICYmIGdsb2JhbFN0YXRlJCQxLnRpbWVvdXQucnVubmluZykge1xuICAgICAgICAgICAgLy8gdGltZXIgY2FuIGJlIGFscmVhZHkgc3RvcHBlZCBvciB1bnNldCBhdCB0aGlzIHBvaW50XG4gICAgICAgICAgICBhbmltYXRlVGltZXJQcm9ncmVzc0Jhcihpbm5lclBhcmFtcy50aW1lcik7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgdmFyIGluaXRGb2N1cyA9IGZ1bmN0aW9uIGluaXRGb2N1cyhkb21DYWNoZSwgaW5uZXJQYXJhbXMpIHtcbiAgICBpZiAoaW5uZXJQYXJhbXMudG9hc3QpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoIWNhbGxJZkZ1bmN0aW9uKGlubmVyUGFyYW1zLmFsbG93RW50ZXJLZXkpKSB7XG4gICAgICByZXR1cm4gYmx1ckFjdGl2ZUVsZW1lbnQoKTtcbiAgICB9XG5cbiAgICBpZiAoIWZvY3VzQnV0dG9uKGRvbUNhY2hlLCBpbm5lclBhcmFtcykpIHtcbiAgICAgIHNldEZvY3VzKGlubmVyUGFyYW1zLCAtMSwgMSk7XG4gICAgfVxuICB9O1xuXG4gIHZhciBmb2N1c0J1dHRvbiA9IGZ1bmN0aW9uIGZvY3VzQnV0dG9uKGRvbUNhY2hlLCBpbm5lclBhcmFtcykge1xuICAgIGlmIChpbm5lclBhcmFtcy5mb2N1c0RlbnkgJiYgaXNWaXNpYmxlKGRvbUNhY2hlLmRlbnlCdXR0b24pKSB7XG4gICAgICBkb21DYWNoZS5kZW55QnV0dG9uLmZvY3VzKCk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAoaW5uZXJQYXJhbXMuZm9jdXNDYW5jZWwgJiYgaXNWaXNpYmxlKGRvbUNhY2hlLmNhbmNlbEJ1dHRvbikpIHtcbiAgICAgIGRvbUNhY2hlLmNhbmNlbEJ1dHRvbi5mb2N1cygpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgaWYgKGlubmVyUGFyYW1zLmZvY3VzQ29uZmlybSAmJiBpc1Zpc2libGUoZG9tQ2FjaGUuY29uZmlybUJ1dHRvbikpIHtcbiAgICAgIGRvbUNhY2hlLmNvbmZpcm1CdXR0b24uZm9jdXMoKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfTtcblxuICB2YXIgYmx1ckFjdGl2ZUVsZW1lbnQgPSBmdW5jdGlvbiBibHVyQWN0aXZlRWxlbWVudCgpIHtcbiAgICBpZiAoZG9jdW1lbnQuYWN0aXZlRWxlbWVudCAmJiB0eXBlb2YgZG9jdW1lbnQuYWN0aXZlRWxlbWVudC5ibHVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBkb2
8443N1bWVudC5hY3RpdmVFbGVtZW50LmJsdXIoKTtcbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gICAqIFVwZGF0ZXMgcG9wdXAgcGFyYW1ldGVycy5cbiAgICovXG5cbiAgZnVuY3Rpb24gdXBkYXRlKHBhcmFtcykge1xuICAgIHZhciBwb3B1cCA9IGdldFBvcHVwKCk7XG4gICAgdmFyIGlubmVyUGFyYW1zID0gcHJpdmF0ZVByb3BzLmlubmVyUGFyYW1zLmdldCh0aGlzKTtcblxuICAgIGlmICghcG9wdXAgfHwgaGFzQ2xhc3MocG9wdXAsIGlubmVyUGFyYW1zLmhpZGVDbGFzcy5wb3B1cCkpIHtcbiAgICAgIHJldHVybiB3YXJuKFwiWW91J3JlIHRyeWluZyB0byB1cGRhdGUgdGhlIGNsb3NlZCBvciBjbG9zaW5nIHBvcHVwLCB0aGF0IHdvbid0IHdvcmsuIFVzZSB0aGUgdXBkYXRlKCkgbWV0aG9kIGluIHByZUNvbmZpcm0gcGFyYW1ldGVyIG9yIHNob3cgYSBuZXcgcG9wdXAuXCIpO1xuICAgIH1cblxuICAgIHZhciB2YWxpZFVwZGF0YWJsZVBhcmFtcyA9IHt9OyAvLyBhc3NpZ24gdmFsaWQgcGFyYW1zIGZyb20gYHBhcmFtc2AgdG8gYGRlZmF1bHRzYFxuXG4gICAgT2JqZWN0LmtleXMocGFyYW1zKS5mb3JFYWNoKGZ1bmN0aW9uIChwYXJhbSkge1xuICAgICAgaWYgKFN3YWwuaXNVcGRhdGFibGVQYXJhbWV0ZXIocGFyYW0pKSB7XG4gICAgICAgIHZhbGlkVXBkYXRhYmxlUGFyYW1zW3BhcmFtXSA9IHBhcmFtc1twYXJhbV07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB3YXJuKFwiSW52YWxpZCBwYXJhbWV0ZXIgdG8gdXBkYXRlOiBcXFwiXCIuY29uY2F0KHBhcmFtLCBcIlxcXCIuIFVwZGF0YWJsZSBwYXJhbXMgYXJlIGxpc3RlZCBoZXJlOiBodHRwczovL2dpdGh1Yi5jb20vc3dlZXRhbGVydDIvc3dlZXRhbGVydDIvYmxvYi9tYXN0ZXIvc3JjL3V0aWxzL3BhcmFtcy5qc1xcblxcbklmIHlvdSB0aGluayB0aGlzIHBhcmFtZXRlciBzaG91bGQgYmUgdXBkYXRhYmxlLCByZXF1ZXN0IGl0IGhlcmU6IGh0dHBzOi8vZ2l0aHViLmNvbS9zd2VldGFsZXJ0Mi9zd2VldGFsZXJ0Mi9pc3N1ZXMvbmV3P3RlbXBsYXRlPTAyX2ZlYXR1cmVfcmVxdWVzdC5tZFwiKSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICB2YXIgdXBkYXRlZFBhcmFtcyA9IF9leHRlbmRzKHt9LCBpbm5lclBhcmFtcywgdmFsaWRVcGRhdGFibGVQYXJhbXMpO1xuXG4gICAgcmVuZGVyKHRoaXMsIHVwZGF0ZWRQYXJhbXMpO1xuICAgIHByaXZhdGVQcm9wcy5pbm5lclBhcmFtcy5zZXQodGhpcywgdXBkYXRlZFBhcmFtcyk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnRpZXModGhpcywge1xuICAgICAgcGFyYW1zOiB7XG4gICAgICAgIHZhbHVlOiBfZXh0ZW5kcyh7fSwgdGhpcy5wYXJhbXMsIHBhcmFtcyksXG4gICAgICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZVxuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgZnVuY3Rpb24gX2Rlc3Ryb3koKSB7XG4gICAgdmFyIGRvbUNhY2hlID0gcHJpdmF0ZVByb3BzLmRvbUNhY2hlLmdldCh0aGlzKTtcbiAgICB2YXIgaW5uZXJQYXJhbXMgPSBwcml2YXRlUHJvcHMuaW5uZXJQYXJhbXMuZ2V0KHRoaXMpO1xuXG4gICAgaWYgKCFpbm5lclBhcmFtcykge1xuICAgICAgcmV0dXJuOyAvLyBUaGlzIGluc3RhbmNlIGhhcyBhbHJlYWR5IGJlZW4gZGVzdHJveWVkXG4gICAgfSAvLyBDaGVjayBpZiB0aGVyZSBpcyBhbm90aGVyIFN3YWwgY2xvc2luZ1xuXG5cbiAgICBpZiAoZG9tQ2FjaGUucG9wdXAgJiYgZ2xvYmFsU3RhdGUuc3dhbENsb3NlRXZlbnRGaW5pc2hlZENhbGxiYWNrKSB7XG4gICAgICBnbG9iYWxTdGF0ZS5zd2FsQ2xvc2VFdmVudEZpbmlzaGVkQ2FsbGJhY2soKTtcbiAgICAgIGRlbGV0ZSBnbG9iYWxTdGF0ZS5zd2FsQ2xvc2VFdmVudEZpbmlzaGVkQ2FsbGJhY2s7XG4gICAgfSAvLyBDaGVjayBpZiB0aGVyZSBpcyBhIHN3YWwgZGlzcG9zYWwgZGVmZXIgdGltZXJcblxuXG4gICAgaWYgKGdsb2JhbFN0YXRlLmRlZmVyRGlzcG9zYWxUaW1lcikge1xuICAgICAgY2xlYXJUaW1lb3V0KGdsb2JhbFN0YXRlLmRlZmVyRGlzcG9zYWxUaW1lcik7XG4gICAgICBkZWxldGUgZ2xvYmFsU3RhdGUuZGVmZXJEaXNwb3NhbFRpbWVyO1xuICAgIH1cblxuICAgIHJ1bkRpZERlc3Ryb3koaW5uZXJQYXJhbXMpO1xuICAgIGRpc3Bvc2VTd2FsKHRoaXMpO1xuICB9XG5cbiAgdmFyIHJ1bkRpZERlc3Ryb3kgPSBmdW5jdGlvbiBydW5EaWREZXN0cm95KGlubmVyUGFyYW1zKSB7XG4gICAgaWYgKHR5cGVvZiBpbm5lclBhcmFtcy5kaWREZXN0cm95ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBpbm5lclBhcmFtcy5kaWREZXN0cm95KCk7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgaW5uZXJQYXJhbXMub25EZXN0cm95ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBpbm5lclBhcmFtcy5vbkRlc3Ryb3koKTsgLy8gQGRlcHJlY2F0ZWRcbiAgICB9XG4gIH07XG5cbiAgdmFyIGRpc3Bvc2VTd2FsID0gZnVuY3Rpb24gZGlzcG9zZVN3YWwoaW5zdGFuY2UpIHtcbiAgICAvLyBVbnNldCB0aGlzLnBhcmFtcyBzbyBHQyB3aWxsIGRpc3Bvc2UgaXQgKCMxNTY5KVxuICAgIGRlbGV0ZSBpbnN0YW5jZS5wYXJhbXM7IC8vIFVuc2V0IGdsb2JhbFN0YXRlIHByb3BzIHNvIEdDIHdpbGwgZGlzcG9zZSBnbG9iYWxTdGF0ZSAoIzE1NjkpXG5cbiAgICBkZWxldGUgZ2xvYmFsU3RhdGUua2V5ZG93bkhhbmRsZXI7XG4gICAgZGVsZXRlIGdsb2JhbFN0YXRlLmtleWRvd25UYXJnZXQ7IC8vIFVuc2V0IFdlYWtNYXBzIHNvIEdDIHdpbGwgYmUgYWJsZSB0byBkaXNwb3NlIHRoZW0gKCMxNTY5KVxuXG4gICAgdW5zZXRXZWFrTWFwcyhwcml2YXRlUHJvcHMpO1xuICAgIHVuc2V0V2Vha01hcHMocHJpdmF0ZU1ldGhvZHMpO1xuICB9O1xuXG4gIHZhciB1bnNldFdlYWtNYXBzID0gZnVuY3Rpb24gdW5zZXRXZWFrTWFwcyhvYmopIHtcbiAgICBmb3IgKHZhciBpIGluIG9iaikge1xuICAgICAgb2JqW2ldID0gbmV3IFdlYWtNYXAoKTtcbiAgICB9XG4gIH07XG5cblxuXG4gI
8443HZhciBpbnN0YW5jZU1ldGhvZHMgPSAvKiNfX1BVUkVfXyovT2JqZWN0LmZyZWV6ZSh7XG4gICAgaGlkZUxvYWRpbmc6IGhpZGVMb2FkaW5nLFxuICAgIGRpc2FibGVMb2FkaW5nOiBoaWRlTG9hZGluZyxcbiAgICBnZXRJbnB1dDogZ2V0SW5wdXQkMSxcbiAgICBjbG9zZTogY2xvc2UsXG4gICAgY2xvc2VQb3B1cDogY2xvc2UsXG4gICAgY2xvc2VNb2RhbDogY2xvc2UsXG4gICAgY2xvc2VUb2FzdDogY2xvc2UsXG4gICAgZW5hYmxlQnV0dG9uczogZW5hYmxlQnV0dG9ucyxcbiAgICBkaXNhYmxlQnV0dG9uczogZGlzYWJsZUJ1dHRvbnMsXG4gICAgZW5hYmxlSW5wdXQ6IGVuYWJsZUlucHV0LFxuICAgIGRpc2FibGVJbnB1dDogZGlzYWJsZUlucHV0LFxuICAgIHNob3dWYWxpZGF0aW9uTWVzc2FnZTogc2hvd1ZhbGlkYXRpb25NZXNzYWdlLFxuICAgIHJlc2V0VmFsaWRhdGlvbk1lc3NhZ2U6IHJlc2V0VmFsaWRhdGlvbk1lc3NhZ2UkMSxcbiAgICBnZXRQcm9ncmVzc1N0ZXBzOiBnZXRQcm9ncmVzc1N0ZXBzJDEsXG4gICAgX21haW46IF9tYWluLFxuICAgIHVwZGF0ZTogdXBkYXRlLFxuICAgIF9kZXN0cm95OiBfZGVzdHJveVxuICB9KTtcblxuICB2YXIgY3VycmVudEluc3RhbmNlO1xuXG4gIHZhciBTd2VldEFsZXJ0ID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBTd2VldEFsZXJ0KCkge1xuICAgICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIFN3ZWV0QWxlcnQpO1xuXG4gICAgICAvLyBQcmV2ZW50IHJ1biBpbiBOb2RlIGVudlxuICAgICAgaWYgKHR5cGVvZiB3aW5kb3cgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH0gLy8gQ2hlY2sgZm9yIHRoZSBleGlzdGVuY2Ugb2YgUHJvbWlzZVxuXG5cbiAgICAgIGlmICh0eXBlb2YgUHJvbWlzZSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgZXJyb3IoJ1RoaXMgcGFja2FnZSByZXF1aXJlcyBhIFByb21pc2UgbGlicmFyeSwgcGxlYXNlIGluY2x1ZGUgYSBzaGltIHRvIGVuYWJsZSBpdCBpbiB0aGlzIGJyb3dzZXIgKFNlZTogaHR0cHM6Ly9naXRodWIuY29tL3N3ZWV0YWxlcnQyL3N3ZWV0YWxlcnQyL3dpa2kvTWlncmF0aW9uLWZyb20tU3dlZXRBbGVydC10by1Td2VldEFsZXJ0MiMxLWllLXN1cHBvcnQpJyk7XG4gICAgICB9XG5cbiAgICAgIGN1cnJlbnRJbnN0YW5jZSA9IHRoaXM7XG5cbiAgICAgIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gbmV3IEFycmF5KF9sZW4pLCBfa2V5ID0gMDsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgICAgICBhcmdzW19rZXldID0gYXJndW1lbnRzW19rZXldO1xuICAgICAgfVxuXG4gICAgICB2Y
8443XIgb3V0ZXJQYXJhbXMgPSBPYmplY3QuZnJlZXplKHRoaXMuY29uc3RydWN0b3IuYXJnc1RvUGFyYW1zKGFyZ3MpKTtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHRoaXMsIHtcbiAgICAgICAgcGFyYW1zOiB7XG4gICAgICAgICAgdmFsdWU6IG91dGVyUGFyYW1zLFxuICAgICAgICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgdmFyIHByb21pc2UgPSB0aGlzLl9tYWluKHRoaXMucGFyYW1zKTtcblxuICAgICAgcHJpdmF0ZVByb3BzLnByb21pc2Uuc2V0KHRoaXMsIHByb21pc2UpO1xuICAgIH0gLy8gYGNhdGNoYCBjYW5ub3QgYmUgdGhlIG5hbWUgb2YgYSBtb2R1bGUgZXhwb3J0LCBzbyB3ZSBkZWZpbmUgb3VyIHRoZW5hYmxlIG1ldGhvZHMgaGVyZSBpbnN0ZWFkXG5cblxuICAgIF9jcmVhdGVDbGFzcyhTd2VldEFsZXJ0LCBbe1xuICAgICAga2V5OiBcInRoZW5cIixcbiAgICAgIHZhbHVlOiBmdW5jdGlvbiB0aGVuKG9uRnVsZmlsbGVkKSB7XG4gICAgICAgIHZhciBwcm9taXNlID0gcHJpdmF0ZVByb3BzLnByb21pc2UuZ2V0KHRoaXMpO1xuICAgICAgICByZXR1cm4gcHJvbWlzZS50aGVuKG9uRnVsZmlsbGVkKTtcbiAgICAgIH1cbiAgICB9LCB7XG4gICAgICBrZXk6IFwiZmluYWxseVwiLFxuICAgICAgdmFsdWU6IGZ1bmN0aW9uIF9maW5hbGx5KG9uRmluYWxseSkge1xuICAgICAgICB2YXIgcHJvbWlzZSA9IHByaXZhdGVQcm9wcy5wcm9taXNlLmdldCh0aGlzKTtcbiAgICAgICAgcmV0dXJuIHByb21pc2VbXCJmaW5hbGx5XCJdKG9uRmluYWxseSk7XG4gICAgICB9XG4gICAgfV0pO1xuXG4gICAgcmV0dXJuIFN3ZWV0QWxlcnQ7XG4gIH0oKTsgLy8gQXNzaWduIGluc3RhbmNlIG1ldGhvZHMgZnJvbSBzcmMvaW5zdGFuY2VNZXRob2RzLyouanMgdG8gcHJvdG90eXBlXG5cblxuICBfZXh0ZW5kcyhTd2VldEFsZXJ0LnByb3RvdHlwZSwgaW5zdGFuY2VNZXRob2RzKTsgLy8gQXNzaWduIHN0YXRpYyBtZXRob2RzIGZyb20gc3JjL3N0YXRpY01ldGhvZHMvKi5qcyB0byBjb25zdHJ1Y3RvclxuXG5cbiAgX2V4dGVuZHMoU3dlZXRBbGVydCwgc3RhdGljTWV0aG9kcyk7IC8vIFByb3h5IHRvIGluc3RhbmNlIG1ldGhvZHMgdG8gY29uc3RydWN0b3IsIGZvciBub3csIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eVxuXG5cbiAgT2JqZWN0LmtleXMoaW5zdGFuY2VNZXRob2RzKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICBTd2VldEFsZXJ0W2tleV0gPSBmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAoY3VycmVudEluc3RhbmNlKSB7XG4gICAgICAgIHZhciBfY3VycmVudEluc3RhbmNlO1xuXG4gICAgICAgIHJldHVybiAoX2N1cnJlbnRJbnN0YW5jZSA9IGN1cnJlbnRJbnN0YW5jZSlba2V5XS5hcHBseShfY3VycmVudEluc3RhbmNlLCBhcmd1bWVudHMpO1xuICAgICAgfVxuICAgIH07XG4gIH0pO1xuICBTd2VldEFsZXJ0LkRpc21pc3NSZWFzb24gPSBEaXNtaXNzUmVhc29uO1xuICBTd2VldEFsZXJ0LnZlcnNpb24gPSAnMTAuMTQuMCc7XG5cbiAgdmFyIFN3YWwgPSBTd2VldEFsZXJ0O1xuICBTd2FsW1wiZGVmYXVsdFwiXSA9IFN3YWw7XG5cbiAgcmV0dXJuIFN3YWw7XG5cbn0pKTtcbmlmICh0eXBlb2YgdGhpcyAhPT0gJ3VuZGVmaW5lZCcgJiYgdGhpcy5Td2VldGFsZXJ0Mil7ICB0aGlzLnN3YWwgPSB0aGlzLnN3ZWV0QWxlcnQgPSB0aGlzLlN3YWwgPSB0aGlzLlN3ZWV0QWxlcnQgPSB0aGlzLlN3ZWV0YWxlcnQyfVxuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gL3Zhci93d3cvdmVnYXMudGVzdC93cC1jb250ZW50L3BsdWdpbnMvbm9kZV9tb2R1bGVzL3N3ZWV0YWxlcnQyL2Rpc3Qvc3dlZXRhbGVydDIuanNcbi8vIG1vZHVsZSBpZCA9IDZcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sInNvdXJjZVJvb3QiOiIifQ==

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.