PageSourceSearch

https://www.steris.com/Assets/CorporateWeb/js/chunks/autoplay-e992b2e6.js

js steris.com collected 2026-09-24 17:58:22 UTC 557,580 bytes, 5,196 lines download raw bytes

vendor: 39,252 bytes, lines 1-1234
1function isObject$1(obj) {
2  return obj !== null && typeof obj === "object" && "constructor" in obj && obj.constructor === Object;
3}
4function extend$1(target, src) {
5  if (target === void 0) {
6    target = {};
7  }
8  if (src === void 0) {
9    src = {};
10  }
11  Object.keys(src).forEach((key) => {
12    if (typeof target[key] === "undefined")
13      target[key] = src[key];
14    else if (isObject$1(src[key]) && isObject$1(target[key]) && Object.keys(src[key]).length > 0) {
15      extend$1(target[key], src[key]);
16    }
17  });
18}
19const ssrDocument = {
20  body: {},
21  addEventListener() {
22  },
23  removeEventListener() {
24  },
25  activeElement: {
26    blur() {
27    },
28    nodeName: ""
29  },
30  querySelector() {
31    return null;
32  },
33  querySelectorAll() {
34    return [];
35  },
36  getElementById() {
37    return null;
38  },
39  createEvent() {
40    return {
41      initEvent() {
42      }
43    };
44  },
45  createElement() {
46    return {
47      children: [],
48      childNodes: [],
49      style: {},
50      setAttribute() {
51      },
52      getElementsByTagName() {
53        return [];
54      }
55    };
56  },
57  createElementNS() {
58    return {};
59  },
60  importNode() {
61    return null;
62  },
63  location: {
64    hash: "",
65    host: "",
66    hostname: "",
67    href: "",
68    origin: "",
69    pathname: "",
70    protocol: "",
71    search: ""
72  }
73};
74function getDocument() {
75  const doc = typeof document !== "undefined" ? document : {};
76  extend$1(doc, ssrDocument);
77  return doc;
78}
79const ssrWindow = {
80  document: ssrDocument,
81  navigator: {
82    userAgent: ""
83  },
84  location: {
85    hash: "",
86    host: "",
87    hostname: "",
88    href: "",
89    origin: "",
90    pathname: "",
91    protocol: "",
92    search: ""
93  },
94  history: {
95    replaceState() {
96    },
97    pushState() {
98    },
99    go() {
100    },
101    back() {
102    }
103  },
104  CustomEvent: function CustomEvent() {
105    return this;
106  },
107  addEventListener() {
108  },
109  removeEventListener() {
110  },
111  getComputedStyle() {
112    return {
113      getPropertyValue() {
114        return "";
115      }
116    };
117  },
118  Image() {
119  },
120  Date() {
121  },
122  screen: {},
123  setTimeout() {
124  },
125  clearTimeout() {
126  },
127  matchMedia() {
128    return {};
129  },
130  requestAnimationFrame(callback) {
131    if (typeof setTimeout === "undefined") {
132      callback();
133      return null;
134    }
135    return setTimeout(callback, 0);
136  },
137  cancelAnimationFrame(id) {
138    if (typeof setTimeout === "undefined") {
139      return;
140    }
141    clearTimeout(id);
142  }
143};
144function getWindow() {
145  const win = typeof window !== "undefined" ? window : {};
146  extend$1(win, ssrWindow);
147  return win;
148}
149function classesToTokens(classes2) {
150  if (classes2 === void 0) {
151    classes2 = "";
152  }
153  return classes2.trim().split(" ").filter((c) => !!c.trim());
154}
155function deleteProps(obj) {
156  const object = obj;
157  Object.keys(object).forEach((key) => {
158    try {
159      object[key] = null;
160    } catch (e) {
161    }
162    try {
163      delete object[key];
164    } catch (e) {
165    }
166  });
167}
168function nextTick(callback, delay) {
169  if (delay === void 0) {
170    delay = 0;
171  }
172  return setTimeout(callback, delay);
173}
174function now() {
175  return Date.now();
176}
177function getComputedStyle$1(el) {
178  const window2 = getWindow();
179  let style;
180  if (window2.getComputedStyle) {
181    style = window2.getComputedStyle(el, null);
182  }
183  if (!style && el.currentStyle) {
184    style = el.currentStyle;
185  }
186  if (!style) {
187    style = el.style;
188  }
189  return style;
190}
191function getTranslate(el, axis) {
192  if (axis === void 0) {
193    axis = "x";
194  }
195  const window2 = getWindow();
196  let matrix;
197  let curTransform;
198  let transformMatrix;
199  const curStyle = getComputedStyle$1(el);
200  if (window2.WebKitCSSMatrix) {
201    curTransform = curStyle.transform || curStyle.webkitTransform;
202    if (curTransform.split(",").length > 6) {
203      curTransform = curTransform.split(", ").map((a) => a.replace(",", ".")).join(", ");
204    }
205    transformMatrix = new window2.WebKitCSSMatrix(curTransform === "none" ? "" : curTransform);
206  } else {
207    transformMatrix = curStyle.MozTransform || curStyle.OTransform || curStyle.MsTransform || curStyle.msTransform || curStyle.transform || curStyle.getPropertyValue("transform").replace("translate(", "matrix(1, 0, 0, 1,");
208    matrix = transformMatrix.toString().split(",");
209  }
210  if (axis === "x") {
211    if (window2.WebKitCSSMatrix)
212      curTransform = transformMatrix.m41;
213    else if (matrix.length === 16)
214      curTransform = parseFloat(matrix[12]);
215    else
216      curTransform = parseFloat(matrix[4]);
217  }
218  if (axis === "y") {
219    if (window2.WebKitCSSMatrix)
220      curTransform = transformMatrix.m42;
221    else if (matrix.length === 16)
222      curTransform = parseFloat(matrix[13]);
223    else
224      curTransform = parseFloat(matrix[5]);
225  }
226  return curTransform || 0;
227}
228function isObject(o) {
229  return typeof o === "object" && o !== null && o.constructor && Object.prototype.toString.call(o).slice(8, -1) === "Object";
230}
231function isNode(node) {
232  if (typeof window !== "undefined" && typeof window.HTMLElement !== "undefined") {
233    return node instanceof HTMLElement;
234  }
235  return node && (node.nodeType === 1 || node.nodeType === 11);
236}
237function extend() {
238  const to = Object(arguments.length <= 0 ? void 0 : arguments[0]);
239  const noExtend = ["__proto__", "constructor", "prototype"];
240  for (let i = 1; i < arguments.length; i += 1) {
241    const nextSource = i < 0 || arguments.length <= i ? void 0 : arguments[i];
242    if (nextSource !== void 0 && nextSource !== null && !isNode(nextSource)) {
243      const keysArray = Object.keys(Object(nextSource)).filter((key) => noExtend.indexOf(key) < 0);
244      for (let nextIndex = 0, len = keysArray.length; nextIndex < len; nextIndex += 1) {
245        const nextKey = keysArray[nextIndex];
246        const desc = Object.getOwnPropertyDescriptor(nextSource, nextKey);
247        if (desc !== void 0 && desc.enumerable) {
248          if (isObject(to[nextKey]) && isObject(nextSource[nextKey])) {
249            if (nextSource[nextKey].__swiper__) {
250              to[nextKey] = nextSource[nextKey];
251            } else {
252              extend(to[nextKey], nextSource[nextKey]);
253            }
254          } else if (!isObject(to[nextKey]) && isObject(nextSource[nextKey])) {
255            to[nextKey] = {};
256            if (nextSource[nextKey].__swiper__) {
257              to[nextKey] = nextSource[nextKey];
258            } else {
259              extend(to[nextKey], nextSource[nextKey]);
260            }
261          } else {
262            to[nextKey] = nextSource[nextKey];
263          }
264        }
265      }
266    }
267  }
268  return to;
269}
270function setCSSProperty(el, varName, varValue) {
271  el.style.setProperty(varName, varValue);
272}
273function animateCSSModeScroll(_ref) {
274  let {
275    swiper,
276    targetPosition,
277    side
278  } = _ref;
279  const window2 = getWindow();
280  const startPosition = -swiper.translate;
281  let startTime = null;
282  let time;
283  const duration = swiper.params.speed;
284  swiper.wrapperEl.style.scrollSnapType = "none";
285  window2.cancelAnimationFrame(swiper.cssModeFrameID);
286  const dir = targetPosition > startPosition ? "next" : "prev";
287  const isOutOfBound = (current, target) => {
288    return dir === "next" && current >= target || dir === "prev" && current <= target;
289  };
290  const animate = () => {
291    time = (/* @__PURE__ */ new Date()).getTime();
292    if (startTime === null) {
293      startTime = time;
294    }
295    const progress = Math.max(Math.min((time - startTime) / duration, 1), 0);
296    const easeProgress = 0.5 - Math.cos(progress * Math.PI) / 2;
297    let currentPosition = startPosition + easeProgress * (targetPosition - startPosition);
298    if (isOutOfBound(currentPosition, targetPosition)) {
299      currentPosition = targetPosition;
300    }
301    swiper.wrapperEl.scrollTo({
302      [side]: currentPosition
303    });
304    if (isOutOfBound(currentPosition, targetPosition)) {
305      swiper.wrapperEl.style.overflow = "hidden";
306      swiper.wrapperEl.style.scrollSnapType = "";
307      setTimeout(() => {
308        swiper.wrapperEl.style.overflow = "";
309        swiper.wrapperEl.scrollTo({
310          [side]: currentPosition
311        });
312      });
313      window2.cancelAnimationFrame(swiper.cssModeFrameID);
314      return;
315    }
316    swiper.cssModeFrameID = window2.requestAnimationFrame(animate);
317  };
318  animate();
319}
320function elementChildren(element, selector) {
321  if (selector === void 0) {
322    selector = "";
323  }
324  return [...element.children].filter((el) => el.matches(selector));
325}
326function showWarning(text) {
327  try {
328    console.warn(text);
329    return;
330  } catch (err) {
331  }
332}
333function createElement(tag, classes2) {
334  if (classes2 === void 0) {
335    classes2 = [];
336  }
337  const el = document.createElement(tag);
338  el.classList.add(...Array.isArray(classes2) ? classes2 : classesToTokens(classes2));
339  return el;
340}
341function elementPrevAll(el, selector) {
342  const prevEls = [];
343  while (el.previousElementSibling) {
344    const prev = el.previousElementSibling;
345    if (selector) {
346      if (prev.matches(selector))
347        prevEls.push(prev);
348    } else
349      prevEls.push(prev);
350    el = prev;
351  }
352  return prevEls;
353}
354function elementNextAll(el, selector) {
355  const nextEls = [];
356  while (el.nextElementSibling) {
357    const next = el.nextElementSibling;
358    if (selector) {
359      if (next.matches(selector))
360        nextEls.push(next);
361    } else
362      nextEls.push(next);
363    el = next;
364  }
365  return nextEls;
366}
367function elementStyle(el, prop) {
368  const window2 = getWindow();
369  return window2.getComputedStyle(el, null).getPropertyValue(prop);
370}
371function elementIndex(el) {
372  let child = el;
373  let i;
374  if (child) {
375    i = 0;
376    while ((child = child.previousSibling) !== null) {
377      if (child.nodeType === 1)
378        i += 1;
379    }
380    return i;
381  }
382  return void 0;
383}
384function elementParents(el, selector) {
385  const parents = [];
386  let parent = el.parentElement;
387  while (parent) {
388    if (selector) {
389      if (parent.matches(selector))
390        parents.push(parent);
391    } else {
392      parents.push(parent);
393    }
394    parent = parent.parentElement;
395  }
396  return parents;
397}
398function elementOuterSize(el, size, includeMargins) {
399  const window2 = getWindow();
400  if (includeMargins) {
401    return el[size === "width" ? "offsetWidth" : "offsetHeight"] + parseFloat(window2.getComputedStyle(el, null).getPropertyValue(size === "width" ? "margin-right" : "margin-top")) + parseFloat(window2.getComputedStyle(el, null).getPropertyValue(size === "width" ? "margin-left" : "margin-bottom"));
402  }
403  return el.offsetWidth;
404}
405function makeElementsArray(el) {
406  return (Array.isArray(el) ? el : [el]).filter((e) => !!e);
407}
408let support;
409function calcSupport() {
410  const window2 = getWindow();
411  const document2 = getDocument();
412  return {
413    smoothScroll: document2.documentElement && document2.documentElement.style && "scrollBehavior" in document2.documentElement.style,
414    touch: !!("ontouchstart" in window2 || window2.DocumentTouch && document2 instanceof window2.DocumentTouch)
415  };
416}
417function getSupport() {
418  if (!support) {
419    support = calcSupport();
420  }
421  return support;
422}
423let deviceCached;
424function calcDevice(_temp) {
425  let {
426    userAgent
427  } = _temp === void 0 ? {} : _temp;
428  const support2 = getSupport();
429  const window2 = getWindow();
430  const platform = window2.navigator.platform;
431  const ua = userAgent || window2.navigator.userAgent;
432  const device = {
433    ios: false,
434    android: false
435  };
436  const screenWidth = window2.screen.width;
437  const screenHeight = window2.screen.height;
438  const android = ua.match(/(Android);?[\s\/]+([\d.]+)?/);
439  let ipad = ua.match(/(iPad).*OS\s([\d_]+)/);
440  const ipod = ua.match(/(iPod)(.*OS\s([\d_]+))?/);
441  const iphone = !ipad && ua.match(/(iPhone\sOS|iOS)\s([\d_]+)/);
442  const windows = platform === "Win32";
443  let macos = platform === "MacIntel";
444  const iPadScreens = ["1024x1366", "1366x1024", "834x1194", "1194x834", "834x1112", "1112x834", "768x1024", "1024x768", "820x1180", "1180x820", "810x1080", "1080x810"];
445  if (!ipad && macos && support2.touch && iPadScreens.indexOf(`${screenWidth}x${screenHeight}`) >= 0) {
446    ipad = ua.match(/(Version)\/([\d.]+)/);
447    if (!ipad)
448      ipad = [0, 1, "13_0_0"];
449    macos = false;
450  }
451  if (android && !windows) {
452    device.os = "android";
453    device.android = true;
454  }
455  if (ipad || iphone || ipod) {
456    device.os = "ios";
457    device.ios = true;
458  }
459  return device;
460}
461function getDevice(overrides) {
462  if (overrides === void 0) {
463    overrides = {};
464  }
465  if (!deviceCached) {
466    deviceCached = calcDevice(overrides);
467  }
468  return deviceCached;
469}
470let browser;
471function calcBrowser() {
472  const window2 = getWindow();
473  const device = getDevice();
474  let needPerspectiveFix = false;
475  function isSafari() {
476    const ua = window2.navigator.userAgent.toLowerCase();
477    return ua.indexOf("safari") >= 0 && ua.indexOf("chrome") < 0 && ua.indexOf("android") < 0;
478  }
479  if (isSafari()) {
480    const ua = String(window2.navigator.userAgent);
481    if (ua.includes("Version/")) {
482      const [major, minor] = ua.split("Version/")[1].split(" ")[0].split(".").map((num) => Number(num));
483      needPerspectiveFix = major < 16 || major === 16 && minor < 2;
484    }
485  }
486  const isWebView = /(iPhone|iPod|iPad).*AppleWebKit(?!.*Safari)/i.test(window2.navigator.userAgent);
487  const isSafariBrowser = isSafari();
488  const need3dFix = isSafariBrowser || isWebView && device.ios;
489  return {
490    isSafari: needPerspectiveFix || isSafariBrowser,
491    needPerspectiveFix,
492    need3dFix,
493    isWebView
494  };
495}
496function getBrowser() {
497  if (!browser) {
498    browser = calcBrowser();
499  }
500  return browser;
501}
502function Resize(_ref) {
503  let {
504    swiper,
505    on,
506    emit
507  } = _ref;
508  const window2 = getWindow();
509  let observer = null;
510  let animationFrame = null;
511  const resizeHandler = () => {
512    if (!swiper || swiper.destroyed || !swiper.initialized)
513      return;
514    emit("beforeResize");
515    emit("resize");
516  };
517  const createObserver = () => {
518    if (!swiper || swiper.destroyed || !swiper.initialized)
519      return;
520    observer = new ResizeObserver((entries) => {
521      animationFrame = window2.requestAnimationFrame(() => {
522        const {
523          width,
524          height
525        } = swiper;
526        let newWidth = width;
527        let newHeight = height;
528        entries.forEach((_ref2) => {
529          let {
530            contentBoxSize,
531            contentRect,
532            target
533          } = _ref2;
534          if (target && target !== swiper.el)
535            return;
536          newWidth = contentRect ? contentRect.width : (contentBoxSize[0] || contentBoxSize).inlineSize;
537          newHeight = contentRect ? contentRect.height : (contentBoxSize[0] || contentBoxSize).blockSize;
538        });
539        if (newWidth !== width || newHeight !== height) {
540          resizeHandler();
541        }
542      });
543    });
544    observer.observe(swiper.el);
545  };
546  const removeObserver = () => {
547    if (animationFrame) {
548      window2.cancelAnimationFrame(animationFrame);
549    }
550    if (observer && observer.unobserve && swiper.el) {
551      observer.unobserve(swiper.el);
552      observer = null;
553    }
554  };
555  const orientationChangeHandler = () => {
556    if (!swiper || swiper.destroyed || !swiper.initialized)
557      return;
558    emit("orientationchange");
559  };
560  on("init", () => {
561    if (swiper.params.resizeObserver && typeof window2.ResizeObserver !== "undefined") {
562      createObserver();
563      return;
564    }
565    window2.addEventListener("resize", resizeHandler);
566    window2.addEventListener("orientationchange", orientationChangeHandler);
567  });
568  on("destroy", () => {
569    removeObserver();
570    window2.removeEventListener("resize", resizeHandler);
571    window2.removeEventListener("orientationchange", orientationChangeHandler);
572  });
573}
574function Observer(_ref) {
575  let {
576    swiper,
577    extendParams,
578    on,
579    emit
580  } = _ref;
581  const observers = [];
582  const window2 = getWindow();
583  const attach = function(target, options) {
584    if (options === void 0) {
585      options = {};
586    }
587    const ObserverFunc = window2.MutationObserver || window2.WebkitMutationObserver;
588    const observer = new ObserverFunc((mutations) => {
589      if (swiper.__preventObserver__)
590        return;
591      if (mutations.length === 1) {
592        emit("observerUpdate", mutations[0]);
593        return;
594      }
595      const observerUpdate = function observerUpdate2() {
596        emit("observerUpdate", mutations[0]);
597      };
598      if (window2.requestAnimationFrame) {
599        window2.requestAnimationFrame(observerUpdate);
600      } else {
601        window2.setTimeout(observerUpdate, 0);
602      }
603    });
604    observer.observe(target, {
605      attributes: typeof options.attributes === "undefined" ? true : options.attributes,
606      childList: typeof options.childList === "undefined" ? true : options.childList,
607      characterData: typeof options.characterData === "undefined" ? true : options.characterData
608    });
609    observers.push(observer);
610  };
611  const init = () => {
612    if (!swiper.params.observer)
613      return;
614    if (swiper.params.observeParents) {
615      const containerParents = elementParents(swiper.hostEl);
616      for (let i = 0; i < containerParents.length; i += 1) {
617        attach(containerParents[i]);
618      }
619    }
620    attach(swiper.hostEl, {
621      childList: swiper.params.observeSlideChildren
622    });
623    attach(swiper.wrapperEl, {
624      attributes: false
625    });
626  };
627  const destroy = () => {
628    observers.forEach((observer) => {
629      observer.disconnect();
630    });
631    observers.splice(0, observers.length);
632  };
633  extendParams({
634    observer: false,
635    observeParents: false,
636    observeSlideChildren: false
637  });
638  on("init", init);
639  on("destroy", destroy);
640}
641var eventsEmitter = {
642  on(events2, handler, priority) {
643    const self = this;
644    if (!self.eventsListeners || self.destroyed)
645      return self;
646    if (typeof handler !== "function")
647      return self;
648    const method = priority ? "unshift" : "push";
649    events2.split(" ").forEach((event) => {
650      if (!self.eventsListeners[event])
651        self.eventsListeners[event] = [];
652      self.eventsListeners[event][method](handler);
653    });
654    return self;
655  },
656  once(events2, handler, priority) {
657    const self = this;
658    if (!self.eventsListeners || self.destroyed)
659      return self;
660    if (typeof handler !== "function")
661      return self;
662    function onceHandler() {
663      self.off(events2, onceHandler);
664      if (onceHandler.__emitterProxy) {
665        delete onceHandler.__emitterProxy;
666      }
667      for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
668        args[_key] = arguments[_key];
669      }
670      handler.apply(self, args);
671    }
672    onceHandler.__emitterProxy = handler;
673    return self.on(events2, onceHandler, priority);
674  },
675  onAny(handler, priority) {
676    const self = this;
677    if (!self.eventsListeners || self.destroyed)
678      return self;
679    if (typeof handler !== "function")
680      return self;
681    const method = priority ? "unshift" : "push";
682    if (self.eventsAnyListeners.indexOf(handler) < 0) {
683      self.eventsAnyListeners[method](handler);
684    }
685    return self;
686  },
687  offAny(handler) {
688    const self = this;
689    if (!self.eventsListeners || self.destroyed)
690      return self;
691    if (!self.eventsAnyListeners)
692      return self;
693    const index = self.eventsAnyListeners.indexOf(handler);
694    if (index >= 0) {
695      self.eventsAnyListeners.splice(index, 1);
696    }
697    return self;
698  },
699  off(events2, handler) {
700    const self = this;
701    if (!self.eventsListeners || self.destroyed)
702      return self;
703    if (!self.eventsListeners)
704      return self;
705    events2.split(" ").forEach((event) => {
706      if (typeof handler === "undefined") {
707        self.eventsListeners[event] = [];
708      } else if (self.eventsListeners[event]) {
709        self.eventsListeners[event].forEach((eventHandler, index) => {
710          if (eventHandler === handler || eventHandler.__emitterProxy && eventHandler.__emitterProxy === handler) {
711            self.eventsListeners[event].splice(index, 1);
712          }
713        });
714      }
715    });
716    return self;
717  },
718  emit() {
719    const self = this;
720    if (!self.eventsListeners || self.destroyed)
721      return self;
722    if (!self.eventsListeners)
723      return self;
724    let events2;
725    let data;
726    let context;
727    for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
728      args[_key2] = arguments[_key2];
729    }
730    if (typeof args[0] === "string" || Array.isArray(args[0])) {
731      events2 = args[0];
732      data = args.slice(1, args.length);
733      context = self;
734    } else {
735      events2 = args[0].events;
736      data = args[0].data;
737      context = args[0].context || self;
738    }
739    data.unshift(context);
740    const eventsArray = Array.isArray(events2) ? events2 : events2.split(" ");
741    eventsArray.forEach((event) => {
742      if (self.eventsAnyListeners && self.eventsAnyListeners.length) {
743        self.eventsAnyListeners.forEach((eventHandler) => {
744          eventHandler.apply(context, [event, ...data]);
745        });
746      }
747      if (self.eventsListeners && self.eventsListeners[event]) {
748        self.eventsListeners[event].forEach((eventHandler) => {
749          eventHandler.apply(context, data);
750        });
751      }
752    });
753    return self;
754  }
755};
756function updateSize() {
757  const swiper = this;
758  let width;
759  let height;
760  const el = swiper.el;
761  if (typeof swiper.params.width !== "undefined" && swiper.params.width !== null) {
762    width = swiper.params.width;
763  } else {
764    width = el.clientWidth;
765  }
766  if (typeof swiper.params.height !== "undefined" && swiper.params.height !== null) {
767    height = swiper.params.height;
768  } else {
769    height = el.clientHeight;
770  }
771  if (width === 0 && swiper.isHorizontal() || height === 0 && swiper.isVertical()) {
772    return;
773  }
774  width = width - parseInt(elementStyle(el, "padding-left") || 0, 10) - parseInt(elementStyle(el, "padding-right") || 0, 10);
775  height = height - parseInt(elementStyle(el, "padding-top") || 0, 10) - parseInt(elementStyle(el, "padding-bottom") || 0, 10);
776  if (Number.isNaN(width))
777    width = 0;
778  if (Number.isNaN(height))
779    height = 0;
780  Object.assign(swiper, {
781    width,
782    height,
783    size: swiper.isHorizontal() ? width : height
784  });
785}
786function updateSlides() {
787  const swiper = this;
788  function getDirectionPropertyValue(node, label) {
789    return parseFloat(node.getPropertyValue(swiper.getDirectionLabel(label)) || 0);
790  }
791  const params = swiper.params;
792  const {
793    wrapperEl,
794    slidesEl,
795    size: swiperSize,
796    rtlTranslate: rtl,
797    wrongRTL
798  } = swiper;
799  const isVirtual = swiper.virtual && params.virtual.enabled;
800  const previousSlidesLength = isVirtual ? swiper.virtual.slides.length : swiper.slides.length;
801  const slides = elementChildren(slidesEl, `.${swiper.params.slideClass}, swiper-slide`);
802  const slidesLength = isVirtual ? swiper.virtual.slides.length : slides.length;
803  let snapGrid = [];
804  const slidesGrid = [];
805  const slidesSizesGrid = [];
806  let offsetBefore = params.slidesOffsetBefore;
807  if (typeof offsetBefore === "function") {
808    offsetBefore = params.slidesOffsetBefore.call(swiper);
809  }
810  let offsetAfter = params.slidesOffsetAfter;
811  if (typeof offsetAfter === "function") {
812    offsetAfter = params.slidesOffsetAfter.call(swiper);
813  }
814  const previousSnapGridLength = swiper.snapGrid.length;
815  const previousSlidesGridLength = swiper.slidesGrid.length;
816  let spaceBetween = params.spaceBetween;
817  let slidePosition = -offsetBefore;
818  let prevSlideSize = 0;
819  let index = 0;
820  if (typeof swiperSize === "undefined") {
821    return;
822  }
823  if (typeof spaceBetween === "string" && spaceBetween.indexOf("%") >= 0) {
824    spaceBetween = parseFloat(spaceBetween.replace("%", "")) / 100 * swiperSize;
825  } else if (typeof spaceBetween === "string") {
826    spaceBetween = parseFloat(spaceBetween);
827  }
828  swiper.virtualSize = -spaceBetween;
829  slides.forEach((slideEl) => {
830    if (rtl) {
831      slideEl.style.marginLeft = "";
832    } else {
833      slideEl.style.marginRight = "";
834    }
835    slideEl.style.marginBottom = "";
836    slideEl.style.marginTop = "";
837  });
838  if (params.centeredSlides && params.cssMode) {
839    setCSSProperty(wrapperEl, "--swiper-centered-offset-before", "");
840    setCSSProperty(wrapperEl, "--swiper-centered-offset-after", "");
841  }
842  const gridEnabled = params.grid && params.grid.rows > 1 && swiper.grid;
843  if (gridEnabled) {
844    swiper.grid.initSlides(slides);
845  } else if (swiper.grid) {
846    swiper.grid.unsetSlides();
847  }
848  let slideSize;
849  const shouldResetSlideSize = params.slidesPerView === "auto" && params.breakpoints && Object.keys(params.breakpoints).filter((key) => {
850    return typeof params.breakpoints[key].slidesPerView !== "undefined";
851  }).length > 0;
852  for (let i = 0; i < slidesLength; i += 1) {
853    slideSize = 0;
854    let slide2;
855    if (slides[i])
856      slide2 = slides[i];
857    if (gridEnabled) {
858      swiper.grid.updateSlide(i, slide2, slides);
859    }
860    if (slides[i] && elementStyle(slide2, "display") === "none")
861      continue;
862    if (params.slidesPerView === "auto") {
863      if (shouldResetSlideSize) {
864        slides[i].style[swiper.getDirectionLabel("width")] = ``;
865      }
866      const slideStyles = getComputedStyle(slide2);
867      const currentTransform = slide2.style.transform;
868      const currentWebKitTransform = slide2.style.webkitTransform;
869      if (currentTransform) {
870        slide2.style.transform = "none";
871      }
872      if (currentWebKitTransform) {
873        slide2.style.webkitTransform = "none";
874      }
875      if (params.roundLengths) {
876        slideSize = swiper.isHorizontal() ? elementOuterSize(slide2, "width", true) : elementOuterSize(slide2, "height", true);
877      } else {
878        const width = getDirectionPropertyValue(slideStyles, "width");
879        const paddingLeft = getDirectionPropertyValue(slideStyles, "padding-left");
880        const paddingRight = getDirectionPropertyValue(slideStyles, "padding-right");
881        const marginLeft = getDirectionPropertyValue(slideStyles, "margin-left");
882        const marginRight = getDirectionPropertyValue(slideStyles, "margin-right");
883        const boxSizing = slideStyles.getPropertyValue("box-sizing");
884        if (boxSizing && boxSizing === "border-box") {
885          slideSize = width + marginLeft + marginRight;
886        } else {
887          const {
888            clientWidth,
889            offsetWidth
890          } = slide2;
891          slideSize = width + paddingLeft + paddingRight + marginLeft + marginRight + (offsetWidth - clientWidth);
892        }
893      }
894      if (currentTransform) {
895        slide2.style.transform = currentTransform;
896      }
897      if (currentWebKitTransform) {
898        slide2.style.webkitTransform = currentWebKitTransform;
899      }
900      if (params.roundLengths)
901        slideSize = Math.floor(slideSize);
902    } else {
903      slideSize = (swiperSize - (params.slidesPerView - 1) * spaceBetween) / params.slidesPerView;
904      if (params.roundLengths)
905        slideSize = Math.floor(slideSize);
906      if (slides[i]) {
907        slides[i].style[swiper.getDirectionLabel("width")] = `${slideSize}px`;
908      }
909    }
910    if (slides[i]) {
911      slides[i].swiperSlideSize = slideSize;
912    }
913    slidesSizesGrid.push(slideSize);
914    if (params.centeredSlides) {
915      slidePosition = slidePosition + slideSize / 2 + prevSlideSize / 2 + spaceBetween;
916      if (prevSlideSize === 0 && i !== 0)
917        slidePosition = slidePosition - swiperSize / 2 - spaceBetween;
918      if (i === 0)
919        slidePosition = slidePosition - swiperSize / 2 - spaceBetween;
920      if (Math.abs(slidePosition) < 1 / 1e3)
921        slidePosition = 0;
922      if (params.roundLengths)
923        slidePosition = Math.floor(slidePosition);
924      if (index % params.slidesPerGroup === 0)
925        snapGrid.push(slidePosition);
926      slidesGrid.push(slidePosition);
927    } else {
928      if (params.roundLengths)
929        slidePosition = Math.floor(slidePosition);
930      if ((index - Math.min(swiper.params.slidesPerGroupSkip, index)) % swiper.params.slidesPerGroup === 0)
931        snapGrid.push(slidePosition);
932      slidesGrid.push(slidePosition);
933      slidePosition = slidePosition + slideSize + spaceBetween;
934    }
935    swiper.virtualSize += slideSize + spaceBetween;
936    prevSlideSize = slideSize;
937    index += 1;
938  }
939  swiper.virtualSize = Math.max(swiper.virtualSize, swiperSize) + offsetAfter;
940  if (rtl && wrongRTL && (params.effect === "slide" || params.effect === "coverflow")) {
941    wrapperEl.style.width = `${swiper.virtualSize + spaceBetween}px`;
942  }
943  if (params.setWrapperSize) {
944    wrapperEl.style[swiper.getDirectionLabel("width")] = `${swiper.virtualSize + spaceBetween}px`;
945  }
946  if (gridEnabled) {
947    swiper.grid.updateWrapperSize(slideSize, snapGrid);
948  }
949  if (!params.centeredSlides) {
950    const newSlidesGrid = [];
951    for (let i = 0; i < snapGrid.length; i += 1) {
952      let slidesGridItem = snapGrid[i];
953      if (params.roundLengths)
954        slidesGridItem = Math.floor(slidesGridItem);
955      if (snapGrid[i] <= swiper.virtualSize - swiperSize) {
956        newSlidesGrid.push(slidesGridItem);
957      }
958    }
959    snapGrid = newSlidesGrid;
960    if (Math.floor(swiper.virtualSize - swiperSize) - Math.floor(snapGrid[snapGrid.length - 1]) > 1) {
961      snapGrid.push(swiper.virtualSize - swiperSize);
962    }
963  }
964  if (isVirtual && params.loop) {
965    const size = slidesSizesGrid[0] + spaceBetween;
966    if (params.slidesPerGroup > 1) {
967      const groups = Math.ceil((swiper.virtual.slidesBefore + swiper.virtual.slidesAfter) / params.slidesPerGroup);
968      const groupSize = size * params.slidesPerGroup;
969      for (let i = 0; i < groups; i += 1) {
970        snapGrid.push(snapGrid[snapGrid.length - 1] + groupSize);
971      }
972    }
973    for (let i = 0; i < swiper.virtual.slidesBefore + swiper.virtual.slidesAfter; i += 1) {
974      if (params.slidesPerGroup === 1) {
975        snapGrid.push(snapGrid[snapGrid.length - 1] + size);
976      }
977      slidesGrid.push(slidesGrid[slidesGrid.length - 1] + size);
978      swiper.virtualSize += size;
979    }
980  }
981  if (snapGrid.length === 0)
982    snapGrid = [0];
983  if (spaceBetween !== 0) {
984    const key = swiper.isHorizontal() && rtl ? "marginLeft" : swiper.getDirectionLabel("marginRight");
985    slides.filter((_, slideIndex) => {
986      if (!params.cssMode || params.loop)
987        return true;
988      if (slideIndex === slides.length - 1) {
989        return false;
990      }
991      return true;
992    }).forEach((slideEl) => {
993      slideEl.style[key] = `${spaceBetween}px`;
994    });
995  }
996  if (params.centeredSlides && params.centeredSlidesBounds) {
997    let allSlidesSize = 0;
998    slidesSizesGrid.forEach((slideSizeValue) => {
999      allSlidesSize += slideSizeValue + (spaceBetween || 0);
1000    });
1001    allSlidesSize -= spaceBetween;
1002    const maxSnap = allSlidesSize - swiperSize;
1003    snapGrid = snapGrid.map((snap) => {
1004      if (snap <= 0)
1005        return -offsetBefore;
1006      if (snap > maxSnap)
1007        return maxSnap + offsetAfter;
1008      return snap;
1009    });
1010  }
1011  if (params.centerInsufficientSlides) {
1012    let allSlidesSize = 0;
1013    slidesSizesGrid.forEach((slideSizeValue) => {
1014      allSlidesSize += slideSizeValue + (spaceBetween || 0);
1015    });
1016    allSlidesSize -= spaceBetween;
1017    if (allSlidesSize < swiperSize) {
1018      const allSlidesOffset = (swiperSize - allSlidesSize) / 2;
1019      snapGrid.forEach((snap, snapIndex) => {
1020        snapGrid[snapIndex] = snap - allSlidesOffset;
1021      });
1022      slidesGrid.forEach((snap, snapIndex) => {
1023        slidesGrid[snapIndex] = snap + allSlidesOffset;
1024      });
1025    }
1026  }
1027  Object.assign(swiper, {
1028    slides,
1029    snapGrid,
1030    slidesGrid,
1031    slidesSizesGrid
1032  });
1033  if (params.centeredSlides && params.cssMode && !params.centeredSlidesBounds) {
1034    setCSSProperty(wrapperEl, "--swiper-centered-offset-before", `${-snapGrid[0]}px`);
1035    setCSSProperty(wrapperEl, "--swiper-centered-offset-after", `${swiper.size / 2 - slidesSizesGrid[slidesSizesGrid.length - 1] / 2}px`);
1036    const addToSnapGrid = -swiper.snapGrid[0];
1037    const addToSlidesGrid = -swiper.slidesGrid[0];
1038    swiper.snapGrid = swiper.snapGrid.map((v) => v + addToSnapGrid);
1039    swiper.slidesGrid = swiper.slidesGrid.map((v) => v + addToSlidesGrid);
1040  }
1041  if (slidesLength !== previousSlidesLength) {
1042    swiper.emit("slidesLengthChange");
1043  }
1044  if (snapGrid.length !== previousSnapGridLength) {
1045    if (swiper.params.watchOverflow)
1046      swiper.checkOverflow();
1047    swiper.emit("snapGridLengthChange");
1048  }
1049  if (slidesGrid.length !== previousSlidesGridLength) {
1050    swiper.emit("slidesGridLengthChange");
1051  }
1052  if (params.watchSlidesProgress) {
1053    swiper.updateSlidesOffset();
1054  }
1055  swiper.emit("slidesUpdated");
1056  if (!isVirtual && !params.cssMode && (params.effect === "slide" || params.effect === "fade")) {
1057    const backFaceHiddenClass = `${params.containerModifierClass}backface-hidden`;
1058    const hasClassBackfaceClassAdded = swiper.el.classList.contains(backFaceHiddenClass);
1059    if (slidesLength <= params.maxBackfaceHiddenSlides) {
1060      if (!hasClassBackfaceClassAdded)
1061        swiper.el.classList.add(backFaceHiddenClass);
1062    } else if (hasClassBackfaceClassAdded) {
1063      swiper.el.classList.remove(backFaceHiddenClass);
1064    }
1065  }
1066}
1067function updateAutoHeight(speed) {
1068  const swiper = this;
1069  const activeSlides = [];
1070  const isVirtual = swiper.virtual && swiper.params.virtual.enabled;
1071  let newHeight = 0;
1072  let i;
1073  if (typeof speed === "number") {
1074    swiper.setTransition(speed);
1075  } else if (speed === true) {
1076    swiper.setTransition(swiper.params.speed);
1077  }
1078  const getSlideByIndex = (index) => {
1079    if (isVirtual) {
1080      return swiper.slides[swiper.getSlideIndexByData(index)];
1081    }
1082    return swiper.slides[index];
1083  };
1084  if (swiper.params.slidesPerView !== "auto" && swiper.params.slidesPerView > 1) {
1085    if (swiper.params.centeredSlides) {
1086      (swiper.visibleSlides || []).forEach((slide2) => {
1087        activeSlides.push(slide2);
1088      });
1089    } else {
1090      for (i = 0; i < Math.ceil(swiper.params.slidesPerView); i += 1) {
1091        const index = swiper.activeIndex + i;
1092        if (index > swiper.slides.length && !isVirtual)
1093          break;
1094        activeSlides.push(getSlideByIndex(index));
1095      }
1096    }
1097  } else {
1098    activeSlides.push(getSlideByIndex(swiper.activeIndex));
1099  }
1100  for (i = 0; i < activeSlides.length; i += 1) {
1101    if (typeof activeSlides[i] !== "undefined") {
1102      const height = activeSlides[i].offsetHeight;
1103      newHeight = height > newHeight ? height : newHeight;
1104    }
1105  }
1106  if (newHeight || newHeight === 0)
1107    swiper.wrapperEl.style.height = `${newHeight}px`;
1108}
1109function updateSlidesOffset() {
1110  const swiper = this;
1111  const slides = swiper.slides;
1112  const minusOffset = swiper.isElement ? swiper.isHorizontal() ? swiper.wrapperEl.offsetLeft : swiper.wrapperEl.offsetTop : 0;
1113  for (let i = 0; i < slides.length; i += 1) {
1114    slides[i].swiperSlideOffset = (swiper.isHorizontal() ? slides[i].offsetLeft : slides[i].offsetTop) - minusOffset - swiper.cssOverflowAdjustment();
1115  }
1116}
1117function updateSlidesProgress(translate2) {
1118  if (translate2 === void 0) {
1119    translate2 = this && this.translate || 0;
1120  }
1121  const swiper = this;
1122  const params = swiper.params;
1123  const {
1124    slides,
1125    rtlTranslate: rtl,
1126    snapGrid
1127  } = swiper;
1128  if (slides.length === 0)
1129    return;
1130  if (typeof slides[0].swiperSlideOffset === "undefined")
1131    swiper.updateSlidesOffset();
1132  let offsetCenter = -translate2;
1133  if (rtl)
1134    offsetCenter = translate2;
1135  slides.forEach((slideEl) => {
1136    slideEl.classList.remove(params.slideVisibleClass, params.slideFullyVisibleClass);
1137  });
1138  swiper.visibleSlidesIndexes = [];
1139  swiper.visibleSlides = [];
1140  let spaceBetween = params.spaceBetween;
1141  if (typeof spaceBetween === "string" && spaceBetween.indexOf("%") >= 0) {
1142    spaceBetween = parseFloat(spaceBetween.replace("%", "")) / 100 * swiper.size;
1143  } else if (typeof spaceBetween === "string") {
1144    spaceBetween = parseFloat(spaceBetween);
1145  }
1146  for (let i = 0; i < slides.length; i += 1) {
1147    const slide2 = slides[i];
1148    let slideOffset = slide2.swiperSlideOffset;
1149    if (params.cssMode && params.centeredSlides) {
1150      slideOffset -= slides[0].swiperSlideOffset;
1151    }
1152    const slideProgress = (offsetCenter + (params.centeredSlides ? swiper.minTranslate() : 0) - slideOffset) / (slide2.swiperSlideSize + spaceBetween);
1153    const originalSlideProgress = (offsetCenter - snapGrid[0] + (params.centeredSlides ? swiper.minTranslate() : 0) - slideOffset) / (slide2.swiperSlideSize + spaceBetween);
1154    const slideBefore = -(offsetCenter - slideOffset);
1155    const slideAfter = slideBefore + swiper.slidesSizesGrid[i];
1156    const isFullyVisible = slideBefore >= 0 && slideBefore <= swiper.size - swiper.slidesSizesGrid[i];
1157    const isVisible = slideBefore >= 0 && slideBefore < swiper.size - 1 || slideAfter > 1 && slideAfter <= swiper.size || slideBefore <= 0 && slideAfter >= swiper.size;
1158    if (isVisible) {
1159      swiper.visibleSlides.push(slide2);
1160      swiper.visibleSlidesIndexes.push(i);
1161      slides[i].classList.add(params.slideVisibleClass);
1162    }
1163    if (isFullyVisible) {
1164      slides[i].classList.add(params.slideFullyVisibleClass);
1165    }
1166    slide2.progress = rtl ? -slideProgress : slideProgress;
1167    slide2.originalProgress = rtl ? -originalSlideProgress : originalSlideProgress;
1168  }
1169}
1170function updateProgress(translate2) {
1171  const swiper = this;
1172  if (typeof translate2 === "undefined") {
1173    const multiplier = swiper.rtlTranslate ? -1 : 1;
1174    translate2 = swiper && swiper.translate && swiper.translate * multiplier || 0;
1175  }
1176  const params = swiper.params;
1177  const translatesDiff = swiper.maxTranslate() - swiper.minTranslate();
1178  let {
1179    progress,
1180    isBeginning,
1181    isEnd,
1182    progressLoop
1183  } = swiper;
1184  const wasBeginning = isBeginning;
1185  const wasEnd = isEnd;
1186  if (translatesDiff === 0) {
1187    progress = 0;
1188    isBeginning = true;
1189    isEnd = true;
1190  } else {
1191    progress = (translate2 - swiper.minTranslate()) / translatesDiff;
1192    const isBeginningRounded = Math.abs(translate2 - swiper.minTranslate()) < 1;
1193    const isEndRounded = Math.abs(translate2 - swiper.maxTranslate()) < 1;
1194    isBeginning = isBeginningRounded || progress <= 0;
1195    isEnd = isEndRounded || progress >= 1;
1196    if (isBeginningRounded)
1197      progress = 0;
1198    if (isEndRounded)
1199      progress = 1;
1200  }
1201  if (params.loop) {
1202    const firstSlideIndex = swiper.getSlideIndexByData(0);
1203    const lastSlideIndex = swiper.getSlideIndexByData(swiper.slides.length - 1);
1204    const firstSlideTranslate = swiper.slidesGrid[firstSlideIndex];
1205    const lastSlideTranslate = swiper.slidesGrid[lastSlideIndex];
1206    const translateMax = swiper.slidesGrid[swiper.slidesGrid.length - 1];
1207    const translateAbs = Math.abs(translate2);
1208    if (translateAbs >= firstSlideTranslate) {
1209      progressLoop = (translateAbs - firstSlideTranslate) / translateMax;
1210    } else {
1211      progressLoop = (translateAbs + translateMax - lastSlideTranslate) / translateMax;
1212    }
1213    if (progressLoop > 1)
1214      progressLoop -= 1;
1215  }
1216  Object.assign(swiper, {
1217    progress,
1218    progressLoop,
1219    isBeginning,
1220    isEnd
1221  });
1222  if (params.watchSlidesProgress || params.centeredSlides && params.autoHeight)
1223    swiper.updateSlidesProgress(translate2);
1224  if (isBeginning && !wasBeginning) {
1225    swiper.emit("reachBeginning toEdge");
1226  }
1227  if (isEnd && !wasEnd) {
1228    swiper.emit("reachEnd toEdge");
1229  }
1230  if (wasBeginning && !isBeginning || wasEnd && !isEnd) {
1231    swiper.emit("fromEdge");
1232  }
1233  swiper.emit("progress", progress);
1234}
1235const toggleSlideClasses = (slideEl, condition, className) => {
1236  if (condition && !slideEl.classList.contains(className)) {
1237    slideEl.classList.add(className);
1238  } else if (!condition && slideEl.classList.contains(className)) {
1239    slideEl.classList.remove(className);
1240  }
1241};
1242function updateSlidesClasses() {
1243  const swiper = this;
1244  const {
1245    slides,
1246    params,
1247    slidesEl,
1248    activeIndex
1249  } = swiper;
1250  const isVirtual = swiper.virtual && params.virtual.enabled;
1251  const gridEnabled = swiper.grid && params.grid && params.grid.rows > 1;
1252  const getFilteredSlide = (selector) => {
1253    return elementChildren(slidesEl, `.${params.slideClass}${selector}, swiper-slide${selector}`)[0];
1254  };
1255  let activeSlide;
1256  let prevSlide;
1257  let nextSlide;
1258  if (isVirtual) {
1259    if (params.loop) {
1260      let slideIndex = activeIndex - swiper.virtual.slidesBefore;
1261      if (slideIndex < 0)
1262        slideIndex = swiper.virtual.slides.length + slideIndex;
1263      if (slideIndex >= swiper.virtual.slides.length)
1264        slideIndex -= swiper.virtual.slides.length;
1265      activeSlide = getFilteredSlide(`[data-swiper-slide-index="${slideIndex}"]`);
1266    } else {
1267      activeSlide = getFilteredSlide(`[data-swiper-slide-index="${activeIndex}"]`);
1268    }
1269  } else {
1270    if (gridEnabled) {
1271      activeSlide = slides.filter((slideEl) => slideEl.column === activeIndex)[0];
1272      nextSlide = slides.filter((slideEl) => slideEl.column === activeIndex + 1)[0];
1273      prevSlide = slides.filter((slideEl) => slideEl.column === activeIndex - 1)[0];
1274    } else {
1275      activeSlide = slides[activeIndex];
1276    }
1277  }
1278  if (activeSlide) {
1279    if (!gridEnabled) {
1280      nextSlide = elementNextAll(activeSlide, `.${params.slideClass}, swiper-slide`)[0];
1281      if (params.loop && !nextSlide) {
1282        nextSlide = slides[0];
1283      }
1284      prevSlide = elementPrevAll(activeSlide, `.${params.slideClass}, swiper-slide`)[0];
1285      if (params.loop && !prevSlide === 0) {
1286        prevSlide = slides[slides.length - 1];
1287      }
1288    }
1289  }
1290  slides.forEach((slideEl) => {
1291    toggleSlideClasses(slideEl, slideEl === activeSlide, params.slideActiveClass);
1292    toggleSlideClasses(slideEl, slideEl === nextSlide, params.slideNextClass);
1293    toggleSlideClasses(slideEl, slideEl === prevSlide, params.slidePrevClass);
1294  });
1295  swiper.emitSlidesClasses();
1296}
1297const processLazyPreloader = (swiper, imageEl) => {
1298  if (!swiper || swiper.destroyed || !swiper.params)
1299    return;
1300  const slideSelector = () => swiper.isElement ? `swiper-slide` : `.${swiper.params.slideClass}`;
1301  const slideEl = imageEl.closest(slideSelector());
1302  if (slideEl) {
1303    let lazyEl = slideEl.querySelector(`.${swiper.params.lazyPreloaderClass}`);
1304    if (!lazyEl && swiper.isElement) {
1305      if (slideEl.shadowRoot) {
1306        lazyEl = slideEl.shadowRoot.querySelector(`.${swiper.params.lazyPreloaderClass}`);
1307      } else {
1308        requestAnimationFrame(() => {
1309          if (slideEl.shadowRoot) {
1310            lazyEl = slideEl.shadowRoot.querySelector(`.${swiper.params.lazyPreloaderClass}`);
1311            if (lazyEl)
1312              lazyEl.remove();
1313          }
1314        });
1315      }
1316    }
1317    if (lazyEl)
1318      lazyEl.remove();
1319  }
1320};
1321const unlazy = (swiper, index) => {
1322  if (!swiper.slides[index])
1323    return;
1324  const imageEl = swiper.slides[index].querySelector('[loading="lazy"]');
1325  if (imageEl)
1326    imageEl.removeAttribute("loading");
1327};
1328const preload = (swiper) => {
1329  if (!swiper || swiper.destroyed || !swiper.params)
1330    return;
1331  let amount = swiper.params.lazyPreloadPrevNext;
1332  const len = swiper.slides.length;
1333  if (!len || !amount || amount < 0)
1334    return;
1335  amount = Math.min(amount, len);
1336  const slidesPerView = swiper.params.slidesPerView === "auto" ? swiper.slidesPerViewDynamic() : Math.ceil(swiper.params.slidesPerView);
1337  const activeIndex = swiper.activeIndex;
1338  if (swiper.params.grid && swiper.params.grid.rows > 1) {
1339    const activeColumn = activeIndex;
1340    const preloadColumns = [activeColumn - amount];
1341    preloadColumns.push(...Array.from({
1342      length: amount
1343    }).map((_, i) => {
1344      return activeColumn + slidesPerView + i;
1345    }));
vendor: 54,598 bytes, lines 1346-2976
1346    swiper.slides.forEach((slideEl, i) => {
1347      if (preloadColumns.includes(slideEl.column))
1348        unlazy(swiper, i);
1349    });
1350    return;
1351  }
1352  const slideIndexLastInView = activeIndex + slidesPerView - 1;
1353  if (swiper.params.rewind || swiper.params.loop) {
1354    for (let i = activeIndex - amount; i <= slideIndexLastInView + amount; i += 1) {
1355      const realIndex = (i % len + len) % len;
1356      if (realIndex < activeIndex || realIndex > slideIndexLastInView)
1357        unlazy(swiper, realIndex);
1358    }
1359  } else {
1360    for (let i = Math.max(activeIndex - amount, 0); i <= Math.min(slideIndexLastInView + amount, len - 1); i += 1) {
1361      if (i !== activeIndex && (i > slideIndexLastInView || i < activeIndex)) {
1362        unlazy(swiper, i);
1363      }
1364    }
1365  }
1366};
1367function getActiveIndexByTranslate(swiper) {
1368  const {
1369    slidesGrid,
1370    params
1371  } = swiper;
1372  const translate2 = swiper.rtlTranslate ? swiper.translate : -swiper.translate;
1373  let activeIndex;
1374  for (let i = 0; i < slidesGrid.length; i += 1) {
1375    if (typeof slidesGrid[i + 1] !== "undefined") {
1376      if (translate2 >= slidesGrid[i] && translate2 < slidesGrid[i + 1] - (slidesGrid[i + 1] - slidesGrid[i]) / 2) {
1377        activeIndex = i;
1378      } else if (translate2 >= slidesGrid[i] && translate2 < slidesGrid[i + 1]) {
1379        activeIndex = i + 1;
1380      }
1381    } else if (translate2 >= slidesGrid[i]) {
1382      activeIndex = i;
1383    }
1384  }
1385  if (params.normalizeSlideIndex) {
1386    if (activeIndex < 0 || typeof activeIndex === "undefined")
1387      activeIndex = 0;
1388  }
1389  return activeIndex;
1390}
1391function updateActiveIndex(newActiveIndex) {
1392  const swiper = this;
1393  const translate2 = swiper.rtlTranslate ? swiper.translate : -swiper.translate;
1394  const {
1395    snapGrid,
1396    params,
1397    activeIndex: previousIndex,
1398    realIndex: previousRealIndex,
1399    snapIndex: previousSnapIndex
1400  } = swiper;
1401  let activeIndex = newActiveIndex;
1402  let snapIndex;
1403  const getVirtualRealIndex = (aIndex) => {
1404    let realIndex2 = aIndex - swiper.virtual.slidesBefore;
1405    if (realIndex2 < 0) {
1406      realIndex2 = swiper.virtual.slides.length + realIndex2;
1407    }
1408    if (realIndex2 >= swiper.virtual.slides.length) {
1409      realIndex2 -= swiper.virtual.slides.length;
1410    }
1411    return realIndex2;
1412  };
1413  if (typeof activeIndex === "undefined") {
1414    activeIndex = getActiveIndexByTranslate(swiper);
1415  }
1416  if (snapGrid.indexOf(translate2) >= 0) {
1417    snapIndex = snapGrid.indexOf(translate2);
1418  } else {
1419    const skip = Math.min(params.slidesPerGroupSkip, activeIndex);
1420    snapIndex = skip + Math.floor((activeIndex - skip) / params.slidesPerGroup);
1421  }
1422  if (snapIndex >= snapGrid.length)
1423    snapIndex = snapGrid.length - 1;
1424  if (activeIndex === previousIndex && !swiper.params.loop) {
1425    if (snapIndex !== previousSnapIndex) {
1426      swiper.snapIndex = snapIndex;
1427      swiper.emit("snapIndexChange");
1428    }
1429    return;
1430  }
1431  if (activeIndex === previousIndex && swiper.params.loop && swiper.virtual && swiper.params.virtual.enabled) {
1432    swiper.realIndex = getVirtualRealIndex(activeIndex);
1433    return;
1434  }
1435  const gridEnabled = swiper.grid && params.grid && params.grid.rows > 1;
1436  let realIndex;
1437  if (swiper.virtual && params.virtual.enabled && params.loop) {
1438    realIndex = getVirtualRealIndex(activeIndex);
1439  } else if (gridEnabled) {
1440    const firstSlideInColumn = swiper.slides.filter((slideEl) => slideEl.column === activeIndex)[0];
1441    let activeSlideIndex = parseInt(firstSlideInColumn.getAttribute("data-swiper-slide-index"), 10);
1442    if (Number.isNaN(activeSlideIndex)) {
1443      activeSlideIndex = Math.max(swiper.slides.indexOf(firstSlideInColumn), 0);
1444    }
1445    realIndex = Math.floor(activeSlideIndex / params.grid.rows);
1446  } else if (swiper.slides[activeIndex]) {
1447    const slideIndex = swiper.slides[activeIndex].getAttribute("data-swiper-slide-index");
1448    if (slideIndex) {
1449      realIndex = parseInt(slideIndex, 10);
1450    } else {
1451      realIndex = activeIndex;
1452    }
1453  } else {
1454    realIndex = activeIndex;
1455  }
1456  Object.assign(swiper, {
1457    previousSnapIndex,
1458    snapIndex,
1459    previousRealIndex,
1460    realIndex,
1461    previousIndex,
1462    activeIndex
1463  });
1464  if (swiper.initialized) {
1465    preload(swiper);
1466  }
1467  swiper.emit("activeIndexChange");
1468  swiper.emit("snapIndexChange");
1469  if (swiper.initialized || swiper.params.runCallbacksOnInit) {
1470    if (previousRealIndex !== realIndex) {
1471      swiper.emit("realIndexChange");
1472    }
1473    swiper.emit("slideChange");
1474  }
1475}
1476function updateClickedSlide(el, path) {
1477  const swiper = this;
1478  const params = swiper.params;
1479  let slide2 = el.closest(`.${params.slideClass}, swiper-slide`);
1480  if (!slide2 && swiper.isElement && path && path.length > 1 && path.includes(el)) {
1481    [...path.slice(path.indexOf(el) + 1, path.length)].forEach((pathEl) => {
1482      if (!slide2 && pathEl.matches && pathEl.matches(`.${params.slideClass}, swiper-slide`)) {
1483        slide2 = pathEl;
1484      }
1485    });
1486  }
1487  let slideFound = false;
1488  let slideIndex;
1489  if (slide2) {
1490    for (let i = 0; i < swiper.slides.length; i += 1) {
1491      if (swiper.slides[i] === slide2) {
1492        slideFound = true;
1493        slideIndex = i;
1494        break;
1495      }
1496    }
1497  }
1498  if (slide2 && slideFound) {
1499    swiper.clickedSlide = slide2;
1500    if (swiper.virtual && swiper.params.virtual.enabled) {
1501      swiper.clickedIndex = parseInt(slide2.getAttribute("data-swiper-slide-index"), 10);
1502    } else {
1503      swiper.clickedIndex = slideIndex;
1504    }
1505  } else {
1506    swiper.clickedSlide = void 0;
1507    swiper.clickedIndex = void 0;
1508    return;
1509  }
1510  if (params.slideToClickedSlide && swiper.clickedIndex !== void 0 && swiper.clickedIndex !== swiper.activeIndex) {
1511    swiper.slideToClickedSlide();
1512  }
1513}
1514var update = {
1515  updateSize,
1516  updateSlides,
1517  updateAutoHeight,
1518  updateSlidesOffset,
1519  updateSlidesProgress,
1520  updateProgress,
1521  updateSlidesClasses,
1522  updateActiveIndex,
1523  updateClickedSlide
1524};
1525function getSwiperTranslate(axis) {
1526  if (axis === void 0) {
1527    axis = this.isHorizontal() ? "x" : "y";
1528  }
1529  const swiper = this;
1530  const {
1531    params,
1532    rtlTranslate: rtl,
1533    translate: translate2,
1534    wrapperEl
1535  } = swiper;
1536  if (params.virtualTranslate) {
1537    return rtl ? -translate2 : translate2;
1538  }
1539  if (params.cssMode) {
1540    return translate2;
1541  }
1542  let currentTranslate = getTranslate(wrapperEl, axis);
1543  currentTranslate += swiper.cssOverflowAdjustment();
1544  if (rtl)
1545    currentTranslate = -currentTranslate;
1546  return currentTranslate || 0;
1547}
1548function setTranslate(translate2, byController) {
1549  const swiper = this;
1550  const {
1551    rtlTranslate: rtl,
1552    params,
1553    wrapperEl,
1554    progress
1555  } = swiper;
1556  let x = 0;
1557  let y = 0;
1558  const z = 0;
1559  if (swiper.isHorizontal()) {
1560    x = rtl ? -translate2 : translate2;
1561  } else {
1562    y = translate2;
1563  }
1564  if (params.roundLengths) {
1565    x = Math.floor(x);
1566    y = Math.floor(y);
1567  }
1568  swiper.previousTranslate = swiper.translate;
1569  swiper.translate = swiper.isHorizontal() ? x : y;
1570  if (params.cssMode) {
1571    wrapperEl[swiper.isHorizontal() ? "scrollLeft" : "scrollTop"] = swiper.isHorizontal() ? -x : -y;
1572  } else if (!params.virtualTranslate) {
1573    if (swiper.isHorizontal()) {
1574      x -= swiper.cssOverflowAdjustment();
1575    } else {
1576      y -= swiper.cssOverflowAdjustment();
1577    }
1578    wrapperEl.style.transform = `translate3d(${x}px, ${y}px, ${z}px)`;
1579  }
1580  let newProgress;
1581  const translatesDiff = swiper.maxTranslate() - swiper.minTranslate();
1582  if (translatesDiff === 0) {
1583    newProgress = 0;
1584  } else {
1585    newProgress = (translate2 - swiper.minTranslate()) / translatesDiff;
1586  }
1587  if (newProgress !== progress) {
1588    swiper.updateProgress(translate2);
1589  }
1590  swiper.emit("setTranslate", swiper.translate, byController);
1591}
1592function minTranslate() {
1593  return -this.snapGrid[0];
1594}
1595function maxTranslate() {
1596  return -this.snapGrid[this.snapGrid.length - 1];
1597}
1598function translateTo(translate2, speed, runCallbacks, translateBounds, internal) {
1599  if (translate2 === void 0) {
1600    translate2 = 0;
1601  }
1602  if (speed === void 0) {
1603    speed = this.params.speed;
1604  }
1605  if (runCallbacks === void 0) {
1606    runCallbacks = true;
1607  }
1608  if (translateBounds === void 0) {
1609    translateBounds = true;
1610  }
1611  const swiper = this;
1612  const {
1613    params,
1614    wrapperEl
1615  } = swiper;
1616  if (swiper.animating && params.preventInteractionOnTransition) {
1617    return false;
1618  }
1619  const minTranslate2 = swiper.minTranslate();
1620  const maxTranslate2 = swiper.maxTranslate();
1621  let newTranslate;
1622  if (translateBounds && translate2 > minTranslate2)
1623    newTranslate = minTranslate2;
1624  else if (translateBounds && translate2 < maxTranslate2)
1625    newTranslate = maxTranslate2;
1626  else
1627    newTranslate = translate2;
1628  swiper.updateProgress(newTranslate);
1629  if (params.cssMode) {
1630    const isH = swiper.isHorizontal();
1631    if (speed === 0) {
1632      wrapperEl[isH ? "scrollLeft" : "scrollTop"] = -newTranslate;
1633    } else {
1634      if (!swiper.support.smoothScroll) {
1635        animateCSSModeScroll({
1636          swiper,
1637          targetPosition: -newTranslate,
1638          side: isH ? "left" : "top"
1639        });
1640        return true;
1641      }
1642      wrapperEl.scrollTo({
1643        [isH ? "left" : "top"]: -newTranslate,
1644        behavior: "smooth"
1645      });
1646    }
1647    return true;
1648  }
1649  if (speed === 0) {
1650    swiper.setTransition(0);
1651    swiper.setTranslate(newTranslate);
1652    if (runCallbacks) {
1653      swiper.emit("beforeTransitionStart", speed, internal);
1654      swiper.emit("transitionEnd");
1655    }
1656  } else {
1657    swiper.setTransition(speed);
1658    swiper.setTranslate(newTranslate);
1659    if (runCallbacks) {
1660      swiper.emit("beforeTransitionStart", speed, internal);
1661      swiper.emit("transitionStart");
1662    }
1663    if (!swiper.animating) {
1664      swiper.animating = true;
1665      if (!swiper.onTranslateToWrapperTransitionEnd) {
1666        swiper.onTranslateToWrapperTransitionEnd = function transitionEnd2(e) {
1667          if (!swiper || swiper.destroyed)
1668            return;
1669          if (e.target !== this)
1670            return;
1671          swiper.wrapperEl.removeEventListener("transitionend", swiper.onTranslateToWrapperTransitionEnd);
1672          swiper.onTranslateToWrapperTransitionEnd = null;
1673          delete swiper.onTranslateToWrapperTransitionEnd;
1674          swiper.animating = false;
1675          if (runCallbacks) {
1676            swiper.emit("transitionEnd");
1677          }
1678        };
1679      }
1680      swiper.wrapperEl.addEventListener("transitionend", swiper.onTranslateToWrapperTransitionEnd);
1681    }
1682  }
1683  return true;
1684}
1685var translate = {
1686  getTranslate: getSwiperTranslate,
1687  setTranslate,
1688  minTranslate,
1689  maxTranslate,
1690  translateTo
1691};
1692function setTransition(duration, byController) {
1693  const swiper = this;
1694  if (!swiper.params.cssMode) {
1695    swiper.wrapperEl.style.transitionDuration = `${duration}ms`;
1696    swiper.wrapperEl.style.transitionDelay = duration === 0 ? `0ms` : "";
1697  }
1698  swiper.emit("setTransition", duration, byController);
1699}
1700function transitionEmit(_ref) {
1701  let {
1702    swiper,
1703    runCallbacks,
1704    direction,
1705    step
1706  } = _ref;
1707  const {
1708    activeIndex,
1709    previousIndex
1710  } = swiper;
1711  let dir = direction;
1712  if (!dir) {
1713    if (activeIndex > previousIndex)
1714      dir = "next";
1715    else if (activeIndex < previousIndex)
1716      dir = "prev";
1717    else
1718      dir = "reset";
1719  }
1720  swiper.emit(`transition${step}`);
1721  if (runCallbacks && activeIndex !== previousIndex) {
1722    if (dir === "reset") {
1723      swiper.emit(`slideResetTransition${step}`);
1724      return;
1725    }
1726    swiper.emit(`slideChangeTransition${step}`);
1727    if (dir === "next") {
1728      swiper.emit(`slideNextTransition${step}`);
1729    } else {
1730      swiper.emit(`slidePrevTransition${step}`);
1731    }
1732  }
1733}
1734function transitionStart(runCallbacks, direction) {
1735  if (runCallbacks === void 0) {
1736    runCallbacks = true;
1737  }
1738  const swiper = this;
1739  const {
1740    params
1741  } = swiper;
1742  if (params.cssMode)
1743    return;
1744  if (params.autoHeight) {
1745    swiper.updateAutoHeight();
1746  }
1747  transitionEmit({
1748    swiper,
1749    runCallbacks,
1750    direction,
1751    step: "Start"
1752  });
1753}
1754function transitionEnd(runCallbacks, direction) {
1755  if (runCallbacks === void 0) {
1756    runCallbacks = true;
1757  }
1758  const swiper = this;
1759  const {
1760    params
1761  } = swiper;
1762  swiper.animating = false;
1763  if (params.cssMode)
1764    return;
1765  swiper.setTransition(0);
1766  transitionEmit({
1767    swiper,
1768    runCallbacks,
1769    direction,
1770    step: "End"
1771  });
1772}
1773var transition = {
1774  setTransition,
1775  transitionStart,
1776  transitionEnd
1777};
1778function slideTo(index, speed, runCallbacks, internal, initial) {
1779  if (index === void 0) {
1780    index = 0;
1781  }
1782  if (runCallbacks === void 0) {
1783    runCallbacks = true;
1784  }
1785  if (typeof index === "string") {
1786    index = parseInt(index, 10);
1787  }
1788  const swiper = this;
1789  let slideIndex = index;
1790  if (slideIndex < 0)
1791    slideIndex = 0;
1792  const {
1793    params,
1794    snapGrid,
1795    slidesGrid,
1796    previousIndex,
1797    activeIndex,
1798    rtlTranslate: rtl,
1799    wrapperEl,
1800    enabled
1801  } = swiper;
1802  if (!enabled && !internal && !initial || swiper.destroyed || swiper.animating && params.preventInteractionOnTransition) {
1803    return false;
1804  }
1805  if (typeof speed === "undefined") {
1806    speed = swiper.params.speed;
1807  }
1808  const skip = Math.min(swiper.params.slidesPerGroupSkip, slideIndex);
1809  let snapIndex = skip + Math.floor((slideIndex - skip) / swiper.params.slidesPerGroup);
1810  if (snapIndex >= snapGrid.length)
1811    snapIndex = snapGrid.length - 1;
1812  const translate2 = -snapGrid[snapIndex];
1813  if (params.normalizeSlideIndex) {
1814    for (let i = 0; i < slidesGrid.length; i += 1) {
1815      const normalizedTranslate = -Math.floor(translate2 * 100);
1816      const normalizedGrid = Math.floor(slidesGrid[i] * 100);
1817      const normalizedGridNext = Math.floor(slidesGrid[i + 1] * 100);
1818      if (typeof slidesGrid[i + 1] !== "undefined") {
1819        if (normalizedTranslate >= normalizedGrid && normalizedTranslate < normalizedGridNext - (normalizedGridNext - normalizedGrid) / 2) {
1820          slideIndex = i;
1821        } else if (normalizedTranslate >= normalizedGrid && normalizedTranslate < normalizedGridNext) {
1822          slideIndex = i + 1;
1823        }
1824      } else if (normalizedTranslate >= normalizedGrid) {
1825        slideIndex = i;
1826      }
1827    }
1828  }
1829  if (swiper.initialized && slideIndex !== activeIndex) {
1830    if (!swiper.allowSlideNext && (rtl ? translate2 > swiper.translate && translate2 > swiper.minTranslate() : translate2 < swiper.translate && translate2 < swiper.minTranslate())) {
1831      return false;
1832    }
1833    if (!swiper.allowSlidePrev && translate2 > swiper.translate && translate2 > swiper.maxTranslate()) {
1834      if ((activeIndex || 0) !== slideIndex) {
1835        return false;
1836      }
1837    }
1838  }
1839  if (slideIndex !== (previousIndex || 0) && runCallbacks) {
1840    swiper.emit("beforeSlideChangeStart");
1841  }
1842  swiper.updateProgress(translate2);
1843  let direction;
1844  if (slideIndex > activeIndex)
1845    direction = "next";
1846  else if (slideIndex < activeIndex)
1847    direction = "prev";
1848  else
1849    direction = "reset";
1850  if (rtl && -translate2 === swiper.translate || !rtl && translate2 === swiper.translate) {
1851    swiper.updateActiveIndex(slideIndex);
1852    if (params.autoHeight) {
1853      swiper.updateAutoHeight();
1854    }
1855    swiper.updateSlidesClasses();
1856    if (params.effect !== "slide") {
1857      swiper.setTranslate(translate2);
1858    }
1859    if (direction !== "reset") {
1860      swiper.transitionStart(runCallbacks, direction);
1861      swiper.transitionEnd(runCallbacks, direction);
1862    }
1863    return false;
1864  }
1865  if (params.cssMode) {
1866    const isH = swiper.isHorizontal();
1867    const t = rtl ? translate2 : -translate2;
1868    if (speed === 0) {
1869      const isVirtual = swiper.virtual && swiper.params.virtual.enabled;
1870      if (isVirtual) {
1871        swiper.wrapperEl.style.scrollSnapType = "none";
1872        swiper._immediateVirtual = true;
1873      }
1874      if (isVirtual && !swiper._cssModeVirtualInitialSet && swiper.params.initialSlide > 0) {
1875        swiper._cssModeVirtualInitialSet = true;
1876        requestAnimationFrame(() => {
1877          wrapperEl[isH ? "scrollLeft" : "scrollTop"] = t;
1878        });
1879      } else {
1880        wrapperEl[isH ? "scrollLeft" : "scrollTop"] = t;
1881      }
1882      if (isVirtual) {
1883        requestAnimationFrame(() => {
1884          swiper.wrapperEl.style.scrollSnapType = "";
1885          swiper._immediateVirtual = false;
1886        });
1887      }
1888    } else {
1889      if (!swiper.support.smoothScroll) {
1890        animateCSSModeScroll({
1891          swiper,
1892          targetPosition: t,
1893          side: isH ? "left" : "top"
1894        });
1895        return true;
1896      }
1897      wrapperEl.scrollTo({
1898        [isH ? "left" : "top"]: t,
1899        behavior: "smooth"
1900      });
1901    }
1902    return true;
1903  }
1904  swiper.setTransition(speed);
1905  swiper.setTranslate(translate2);
1906  swiper.updateActiveIndex(slideIndex);
1907  swiper.updateSlidesClasses();
1908  swiper.emit("beforeTransitionStart", speed, internal);
1909  swiper.transitionStart(runCallbacks, direction);
1910  if (speed === 0) {
1911    swiper.transitionEnd(runCallbacks, direction);
1912  } else if (!swiper.animating) {
1913    swiper.animating = true;
1914    if (!swiper.onSlideToWrapperTransitionEnd) {
1915      swiper.onSlideToWrapperTransitionEnd = function transitionEnd2(e) {
1916        if (!swiper || swiper.destroyed)
1917          return;
1918        if (e.target !== this)
1919          return;
1920        swiper.wrapperEl.removeEventListener("transitionend", swiper.onSlideToWrapperTransitionEnd);
1921        swiper.onSlideToWrapperTransitionEnd = null;
1922        delete swiper.onSlideToWrapperTransitionEnd;
1923        swiper.transitionEnd(runCallbacks, direction);
1924      };
1925    }
1926    swiper.wrapperEl.addEventListener("transitionend", swiper.onSlideToWrapperTransitionEnd);
1927  }
1928  return true;
1929}
1930function slideToLoop(index, speed, runCallbacks, internal) {
1931  if (index === void 0) {
1932    index = 0;
1933  }
1934  if (runCallbacks === void 0) {
1935    runCallbacks = true;
1936  }
1937  if (typeof index === "string") {
1938    const indexAsNumber = parseInt(index, 10);
1939    index = indexAsNumber;
1940  }
1941  const swiper = this;
1942  if (swiper.destroyed)
1943    return;
1944  if (typeof speed === "undefined") {
1945    speed = swiper.params.speed;
1946  }
1947  const gridEnabled = swiper.grid && swiper.params.grid && swiper.params.grid.rows > 1;
1948  let newIndex = index;
1949  if (swiper.params.loop) {
1950    if (swiper.virtual && swiper.params.virtual.enabled) {
1951      newIndex = newIndex + swiper.virtual.slidesBefore;
1952    } else {
1953      let targetSlideIndex;
1954      if (gridEnabled) {
1955        const slideIndex = newIndex * swiper.params.grid.rows;
1956        targetSlideIndex = swiper.slides.filter((slideEl) => slideEl.getAttribute("data-swiper-slide-index") * 1 === slideIndex)[0].column;
1957      } else {
1958        targetSlideIndex = swiper.getSlideIndexByData(newIndex);
1959      }
1960      const cols = gridEnabled ? Math.ceil(swiper.slides.length / swiper.params.grid.rows) : swiper.slides.length;
1961      const {
1962        centeredSlides
1963      } = swiper.params;
1964      let slidesPerView = swiper.params.slidesPerView;
1965      if (slidesPerView === "auto") {
1966        slidesPerView = swiper.slidesPerViewDynamic();
1967      } else {
1968        slidesPerView = Math.ceil(parseFloat(swiper.params.slidesPerView, 10));
1969        if (centeredSlides && slidesPerView % 2 === 0) {
1970          slidesPerView = slidesPerView + 1;
1971        }
1972      }
1973      let needLoopFix = cols - targetSlideIndex < slidesPerView;
1974      if (centeredSlides) {
1975        needLoopFix = needLoopFix || targetSlideIndex < Math.ceil(slidesPerView / 2);
1976      }
1977      if (internal && centeredSlides && swiper.params.slidesPerView !== "auto" && !gridEnabled) {
1978        needLoopFix = false;
1979      }
1980      if (needLoopFix) {
1981        const direction = centeredSlides ? targetSlideIndex < swiper.activeIndex ? "prev" : "next" : targetSlideIndex - swiper.activeIndex - 1 < swiper.params.slidesPerView ? "next" : "prev";
1982        swiper.loopFix({
1983          direction,
1984          slideTo: true,
1985          activeSlideIndex: direction === "next" ? targetSlideIndex + 1 : targetSlideIndex - cols + 1,
1986          slideRealIndex: direction === "next" ? swiper.realIndex : void 0
1987        });
1988      }
1989      if (gridEnabled) {
1990        const slideIndex = newIndex * swiper.params.grid.rows;
1991        newIndex = swiper.slides.filter((slideEl) => slideEl.getAttribute("data-swiper-slide-index") * 1 === slideIndex)[0].column;
1992      } else {
1993        newIndex = swiper.getSlideIndexByData(newIndex);
1994      }
1995    }
1996  }
1997  requestAnimationFrame(() => {
1998    swiper.slideTo(newIndex, speed, runCallbacks, internal);
1999  });
2000  return swiper;
2001}
2002function slideNext(speed, runCallbacks, internal) {
2003  if (runCallbacks === void 0) {
2004    runCallbacks = true;
2005  }
2006  const swiper = this;
2007  const {
2008    enabled,
2009    params,
2010    animating
2011  } = swiper;
2012  if (!enabled || swiper.destroyed)
2013    return swiper;
2014  if (typeof speed === "undefined") {
2015    speed = swiper.params.speed;
2016  }
2017  let perGroup = params.slidesPerGroup;
2018  if (params.slidesPerView === "auto" && params.slidesPerGroup === 1 && params.slidesPerGroupAuto) {
2019    perGroup = Math.max(swiper.slidesPerViewDynamic("current", true), 1);
2020  }
2021  const increment = swiper.activeIndex < params.slidesPerGroupSkip ? 1 : perGroup;
2022  const isVirtual = swiper.virtual && params.virtual.enabled;
2023  if (params.loop) {
2024    if (animating && !isVirtual && params.loopPreventsSliding)
2025      return false;
2026    swiper.loopFix({
2027      direction: "next"
2028    });
2029    swiper._clientLeft = swiper.wrapperEl.clientLeft;
2030    if (swiper.activeIndex === swiper.slides.length - 1 && params.cssMode) {
2031      requestAnimationFrame(() => {
2032        swiper.slideTo(swiper.activeIndex + increment, speed, runCallbacks, internal);
2033      });
2034      return true;
2035    }
2036  }
2037  if (params.rewind && swiper.isEnd) {
2038    return swiper.slideTo(0, speed, runCallbacks, internal);
2039  }
2040  return swiper.slideTo(swiper.activeIndex + increment, speed, runCallbacks, internal);
2041}
2042function slidePrev(speed, runCallbacks, internal) {
2043  if (runCallbacks === void 0) {
2044    runCallbacks = true;
2045  }
2046  const swiper = this;
2047  const {
2048    params,
2049    snapGrid,
2050    slidesGrid,
2051    rtlTranslate,
2052    enabled,
2053    animating
2054  } = swiper;
2055  if (!enabled || swiper.destroyed)
2056    return swiper;
2057  if (typeof speed === "undefined") {
2058    speed = swiper.params.speed;
2059  }
2060  const isVirtual = swiper.virtual && params.virtual.enabled;
2061  if (params.loop) {
2062    if (animating && !isVirtual && params.loopPreventsSliding)
2063      return false;
2064    swiper.loopFix({
2065      direction: "prev"
2066    });
2067    swiper._clientLeft = swiper.wrapperEl.clientLeft;
2068  }
2069  const translate2 = rtlTranslate ? swiper.translate : -swiper.translate;
2070  function normalize(val) {
2071    if (val < 0)
2072      return -Math.floor(Math.abs(val));
2073    return Math.floor(val);
2074  }
2075  const normalizedTranslate = normalize(translate2);
2076  const normalizedSnapGrid = snapGrid.map((val) => normalize(val));
2077  let prevSnap = snapGrid[normalizedSnapGrid.indexOf(normalizedTranslate) - 1];
2078  if (typeof prevSnap === "undefined" && params.cssMode) {
2079    let prevSnapIndex;
2080    snapGrid.forEach((snap, snapIndex) => {
2081      if (normalizedTranslate >= snap) {
2082        prevSnapIndex = snapIndex;
2083      }
2084    });
2085    if (typeof prevSnapIndex !== "undefined") {
2086      prevSnap = snapGrid[prevSnapIndex > 0 ? prevSnapIndex - 1 : prevSnapIndex];
2087    }
2088  }
2089  let prevIndex = 0;
2090  if (typeof prevSnap !== "undefined") {
2091    prevIndex = slidesGrid.indexOf(prevSnap);
2092    if (prevIndex < 0)
2093      prevIndex = swiper.activeIndex - 1;
2094    if (params.slidesPerView === "auto" && params.slidesPerGroup === 1 && params.slidesPerGroupAuto) {
2095      prevIndex = prevIndex - swiper.slidesPerViewDynamic("previous", true) + 1;
2096      prevIndex = Math.max(prevIndex, 0);
2097    }
2098  }
2099  if (params.rewind && swiper.isBeginning) {
2100    const lastIndex = swiper.params.virtual && swiper.params.virtual.enabled && swiper.virtual ? swiper.virtual.slides.length - 1 : swiper.slides.length - 1;
2101    return swiper.slideTo(lastIndex, speed, runCallbacks, internal);
2102  } else if (params.loop && swiper.activeIndex === 0 && params.cssMode) {
2103    requestAnimationFrame(() => {
2104      swiper.slideTo(prevIndex, speed, runCallbacks, internal);
2105    });
2106    return true;
2107  }
2108  return swiper.slideTo(prevIndex, speed, runCallbacks, internal);
2109}
2110function slideReset(speed, runCallbacks, internal) {
2111  if (runCallbacks === void 0) {
2112    runCallbacks = true;
2113  }
2114  const swiper = this;
2115  if (swiper.destroyed)
2116    return;
2117  if (typeof speed === "undefined") {
2118    speed = swiper.params.speed;
2119  }
2120  return swiper.slideTo(swiper.activeIndex, speed, runCallbacks, internal);
2121}
2122function slideToClosest(speed, runCallbacks, internal, threshold) {
2123  if (runCallbacks === void 0) {
2124    runCallbacks = true;
2125  }
2126  if (threshold === void 0) {
2127    threshold = 0.5;
2128  }
2129  const swiper = this;
2130  if (swiper.destroyed)
2131    return;
2132  if (typeof speed === "undefined") {
2133    speed = swiper.params.speed;
2134  }
2135  let index = swiper.activeIndex;
2136  const skip = Math.min(swiper.params.slidesPerGroupSkip, index);
2137  const snapIndex = skip + Math.floor((index - skip) / swiper.params.slidesPerGroup);
2138  const translate2 = swiper.rtlTranslate ? swiper.translate : -swiper.translate;
2139  if (translate2 >= swiper.snapGrid[snapIndex]) {
2140    const currentSnap = swiper.snapGrid[snapIndex];
2141    const nextSnap = swiper.snapGrid[snapIndex + 1];
2142    if (translate2 - currentSnap > (nextSnap - currentSnap) * threshold) {
2143      index += swiper.params.slidesPerGroup;
2144    }
2145  } else {
2146    const prevSnap = swiper.snapGrid[snapIndex - 1];
2147    const currentSnap = swiper.snapGrid[snapIndex];
2148    if (translate2 - prevSnap <= (currentSnap - prevSnap) * threshold) {
2149      index -= swiper.params.slidesPerGroup;
2150    }
2151  }
2152  index = Math.max(index, 0);
2153  index = Math.min(index, swiper.slidesGrid.length - 1);
2154  return swiper.slideTo(index, speed, runCallbacks, internal);
2155}
2156function slideToClickedSlide() {
2157  const swiper = this;
2158  if (swiper.destroyed)
2159    return;
2160  const {
2161    params,
2162    slidesEl
2163  } = swiper;
2164  const slidesPerView = params.slidesPerView === "auto" ? swiper.slidesPerViewDynamic() : params.slidesPerView;
2165  let slideToIndex = swiper.clickedIndex;
2166  let realIndex;
2167  const slideSelector = swiper.isElement ? `swiper-slide` : `.${params.slideClass}`;
2168  if (params.loop) {
2169    if (swiper.animating)
2170      return;
2171    realIndex = parseInt(swiper.clickedSlide.getAttribute("data-swiper-slide-index"), 10);
2172    if (params.centeredSlides) {
2173      if (slideToIndex < swiper.loopedSlides - slidesPerView / 2 || slideToIndex > swiper.slides.length - swiper.loopedSlides + slidesPerView / 2) {
2174        swiper.loopFix();
2175        slideToIndex = swiper.getSlideIndex(elementChildren(slidesEl, `${slideSelector}[data-swiper-slide-index="${realIndex}"]`)[0]);
2176        nextTick(() => {
2177          swiper.slideTo(slideToIndex);
2178        });
2179      } else {
2180        swiper.slideTo(slideToIndex);
2181      }
2182    } else if (slideToIndex > swiper.slides.length - slidesPerView) {
2183      swiper.loopFix();
2184      slideToIndex = swiper.getSlideIndex(elementChildren(slidesEl, `${slideSelector}[data-swiper-slide-index="${realIndex}"]`)[0]);
2185      nextTick(() => {
2186        swiper.slideTo(slideToIndex);
2187      });
2188    } else {
2189      swiper.slideTo(slideToIndex);
2190    }
2191  } else {
2192    swiper.slideTo(slideToIndex);
2193  }
2194}
2195var slide = {
2196  slideTo,
2197  slideToLoop,
2198  slideNext,
2199  slidePrev,
2200  slideReset,
2201  slideToClosest,
2202  slideToClickedSlide
2203};
2204function loopCreate(slideRealIndex) {
2205  const swiper = this;
2206  const {
2207    params,
2208    slidesEl
2209  } = swiper;
2210  if (!params.loop || swiper.virtual && swiper.params.virtual.enabled)
2211    return;
2212  const initSlides = () => {
2213    const slides = elementChildren(slidesEl, `.${params.slideClass}, swiper-slide`);
2214    slides.forEach((el, index) => {
2215      el.setAttribute("data-swiper-slide-index", index);
2216    });
2217  };
2218  const gridEnabled = swiper.grid && params.grid && params.grid.rows > 1;
2219  const slidesPerGroup = params.slidesPerGroup * (gridEnabled ? params.grid.rows : 1);
2220  const shouldFillGroup = swiper.slides.length % slidesPerGroup !== 0;
2221  const shouldFillGrid = gridEnabled && swiper.slides.length % params.grid.rows !== 0;
2222  const addBlankSlides = (amountOfSlides) => {
2223    for (let i = 0; i < amountOfSlides; i += 1) {
2224      const slideEl = swiper.isElement ? createElement("swiper-slide", [params.slideBlankClass]) : createElement("div", [params.slideClass, params.slideBlankClass]);
2225      swiper.slidesEl.append(slideEl);
2226    }
2227  };
2228  if (shouldFillGroup) {
2229    if (params.loopAddBlankSlides) {
2230      const slidesToAdd = slidesPerGroup - swiper.slides.length % slidesPerGroup;
2231      addBlankSlides(slidesToAdd);
2232      swiper.recalcSlides();
2233      swiper.updateSlides();
2234    } else {
2235      showWarning("Swiper Loop Warning: The number of slides is not even to slidesPerGroup, loop mode may not function properly. You need to add more slides (or make duplicates, or empty slides)");
2236    }
2237    initSlides();
2238  } else if (shouldFillGrid) {
2239    if (params.loopAddBlankSlides) {
2240      const slidesToAdd = params.grid.rows - swiper.slides.length % params.grid.rows;
2241      addBlankSlides(slidesToAdd);
2242      swiper.recalcSlides();
2243      swiper.updateSlides();
2244    } else {
2245      showWarning("Swiper Loop Warning: The number of slides is not even to grid.rows, loop mode may not function properly. You need to add more slides (or make duplicates, or empty slides)");
2246    }
2247    initSlides();
2248  } else {
2249    initSlides();
2250  }
2251  swiper.loopFix({
2252    slideRealIndex,
2253    direction: params.centeredSlides ? void 0 : "next"
2254  });
2255}
2256function loopFix(_temp) {
2257  let {
2258    slideRealIndex,
2259    slideTo: slideTo2 = true,
2260    direction,
2261    setTranslate: setTranslate2,
2262    activeSlideIndex,
2263    byController,
2264    byMousewheel
2265  } = _temp === void 0 ? {} : _temp;
2266  const swiper = this;
2267  if (!swiper.params.loop)
2268    return;
2269  swiper.emit("beforeLoopFix");
2270  const {
2271    slides,
2272    allowSlidePrev,
2273    allowSlideNext,
2274    slidesEl,
2275    params
2276  } = swiper;
2277  const {
2278    centeredSlides
2279  } = params;
2280  swiper.allowSlidePrev = true;
2281  swiper.allowSlideNext = true;
2282  if (swiper.virtual && params.virtual.enabled) {
2283    if (slideTo2) {
2284      if (!params.centeredSlides && swiper.snapIndex === 0) {
2285        swiper.slideTo(swiper.virtual.slides.length, 0, false, true);
2286      } else if (params.centeredSlides && swiper.snapIndex < params.slidesPerView) {
2287        swiper.slideTo(swiper.virtual.slides.length + swiper.snapIndex, 0, false, true);
2288      } else if (swiper.snapIndex === swiper.snapGrid.length - 1) {
2289        swiper.slideTo(swiper.virtual.slidesBefore, 0, false, true);
2290      }
2291    }
2292    swiper.allowSlidePrev = allowSlidePrev;
2293    swiper.allowSlideNext = allowSlideNext;
2294    swiper.emit("loopFix");
2295    return;
2296  }
2297  let slidesPerView = params.slidesPerView;
2298  if (slidesPerView === "auto") {
2299    slidesPerView = swiper.slidesPerViewDynamic();
2300  } else {
2301    slidesPerView = Math.ceil(parseFloat(params.slidesPerView, 10));
2302    if (centeredSlides && slidesPerView % 2 === 0) {
2303      slidesPerView = slidesPerView + 1;
2304    }
2305  }
2306  const slidesPerGroup = params.slidesPerGroupAuto ? slidesPerView : params.slidesPerGroup;
2307  let loopedSlides = slidesPerGroup;
2308  if (loopedSlides % slidesPerGroup !== 0) {
2309    loopedSlides += slidesPerGroup - loopedSlides % slidesPerGroup;
2310  }
2311  loopedSlides += params.loopAdditionalSlides;
2312  swiper.loopedSlides = loopedSlides;
2313  const gridEnabled = swiper.grid && params.grid && params.grid.rows > 1;
2314  if (slides.length < slidesPerView + loopedSlides) {
2315    showWarning("Swiper Loop Warning: The number of slides is not enough for loop mode, it will be disabled and not function properly. You need to add more slides (or make duplicates) or lower the values of slidesPerView and slidesPerGroup parameters");
2316  } else if (gridEnabled && params.grid.fill === "row") {
2317    showWarning("Swiper Loop Warning: Loop mode is not compatible with grid.fill = `row`");
2318  }
2319  const prependSlidesIndexes = [];
2320  const appendSlidesIndexes = [];
2321  let activeIndex = swiper.activeIndex;
2322  if (typeof activeSlideIndex === "undefined") {
2323    activeSlideIndex = swiper.getSlideIndex(slides.filter((el) => el.classList.contains(params.slideActiveClass))[0]);
2324  } else {
2325    activeIndex = activeSlideIndex;
2326  }
2327  const isNext = direction === "next" || !direction;
2328  const isPrev = direction === "prev" || !direction;
2329  let slidesPrepended = 0;
2330  let slidesAppended = 0;
2331  const cols = gridEnabled ? Math.ceil(slides.length / params.grid.rows) : slides.length;
2332  const activeColIndex = gridEnabled ? slides[activeSlideIndex].column : activeSlideIndex;
2333  const activeColIndexWithShift = activeColIndex + (centeredSlides && typeof setTranslate2 === "undefined" ? -slidesPerView / 2 + 0.5 : 0);
2334  if (activeColIndexWithShift < loopedSlides) {
2335    slidesPrepended = Math.max(loopedSlides - activeColIndexWithShift, slidesPerGroup);
2336    for (let i = 0; i < loopedSlides - activeColIndexWithShift; i += 1) {
2337      const index = i - Math.floor(i / cols) * cols;
2338      if (gridEnabled) {
2339        const colIndexToPrepend = cols - index - 1;
2340        for (let i2 = slides.length - 1; i2 >= 0; i2 -= 1) {
2341          if (slides[i2].column === colIndexToPrepend)
2342            prependSlidesIndexes.push(i2);
2343        }
2344      } else {
2345        prependSlidesIndexes.push(cols - index - 1);
2346      }
2347    }
2348  } else if (activeColIndexWithShift + slidesPerView > cols - loopedSlides) {
2349    slidesAppended = Math.max(activeColIndexWithShift - (cols - loopedSlides * 2), slidesPerGroup);
2350    for (let i = 0; i < slidesAppended; i += 1) {
2351      const index = i - Math.floor(i / cols) * cols;
2352      if (gridEnabled) {
2353        slides.forEach((slide2, slideIndex) => {
2354          if (slide2.column === index)
2355            appendSlidesIndexes.push(slideIndex);
2356        });
2357      } else {
2358        appendSlidesIndexes.push(index);
2359      }
2360    }
2361  }
2362  swiper.__preventObserver__ = true;
2363  requestAnimationFrame(() => {
2364    swiper.__preventObserver__ = false;
2365  });
2366  if (isPrev) {
2367    prependSlidesIndexes.forEach((index) => {
2368      slides[index].swiperLoopMoveDOM = true;
2369      slidesEl.prepend(slides[index]);
2370      slides[index].swiperLoopMoveDOM = false;
2371    });
2372  }
2373  if (isNext) {
2374    appendSlidesIndexes.forEach((index) => {
2375      slides[index].swiperLoopMoveDOM = true;
2376      slidesEl.append(slides[index]);
2377      slides[index].swiperLoopMoveDOM = false;
2378    });
2379  }
2380  swiper.recalcSlides();
2381  if (params.slidesPerView === "auto") {
2382    swiper.updateSlides();
2383  } else if (gridEnabled && (prependSlidesIndexes.length > 0 && isPrev || appendSlidesIndexes.length > 0 && isNext)) {
2384    swiper.slides.forEach((slide2, slideIndex) => {
2385      swiper.grid.updateSlide(slideIndex, slide2, swiper.slides);
2386    });
2387  }
2388  if (params.watchSlidesProgress) {
2389    swiper.updateSlidesOffset();
2390  }
2391  if (slideTo2) {
2392    if (prependSlidesIndexes.length > 0 && isPrev) {
2393      if (typeof slideRealIndex === "undefined") {
2394        const currentSlideTranslate = swiper.slidesGrid[activeIndex];
2395        const newSlideTranslate = swiper.slidesGrid[activeIndex + slidesPrepended];
2396        const diff = newSlideTranslate - currentSlideTranslate;
2397        if (byMousewheel) {
2398          swiper.setTranslate(swiper.translate - diff);
2399        } else {
2400          swiper.slideTo(activeIndex + Math.ceil(slidesPrepended), 0, false, true);
2401          if (setTranslate2) {
2402            swiper.touchEventsData.startTranslate = swiper.touchEventsData.startTranslate - diff;
2403            swiper.touchEventsData.currentTranslate = swiper.touchEventsData.currentTranslate - diff;
2404          }
2405        }
2406      } else {
2407        if (setTranslate2) {
2408          const shift = gridEnabled ? prependSlidesIndexes.length / params.grid.rows : prependSlidesIndexes.length;
2409          swiper.slideTo(swiper.activeIndex + shift, 0, false, true);
2410          swiper.touchEventsData.currentTranslate = swiper.translate;
2411        }
2412      }
2413    } else if (appendSlidesIndexes.length > 0 && isNext) {
2414      if (typeof slideRealIndex === "undefined") {
2415        const currentSlideTranslate = swiper.slidesGrid[activeIndex];
2416        const newSlideTranslate = swiper.slidesGrid[activeIndex - slidesAppended];
2417        const diff = newSlideTranslate - currentSlideTranslate;
2418        if (byMousewheel) {
2419          swiper.setTranslate(swiper.translate - diff);
2420        } else {
2421          swiper.slideTo(activeIndex - slidesAppended, 0, false, true);
2422          if (setTranslate2) {
2423            swiper.touchEventsData.startTranslate = swiper.touchEventsData.startTranslate - diff;
2424            swiper.touchEventsData.currentTranslate = swiper.touchEventsData.currentTranslate - diff;
2425          }
2426        }
2427      } else {
2428        const shift = gridEnabled ? appendSlidesIndexes.length / params.grid.rows : appendSlidesIndexes.length;
2429        swiper.slideTo(swiper.activeIndex - shift, 0, false, true);
2430      }
2431    }
2432  }
2433  swiper.allowSlidePrev = allowSlidePrev;
2434  swiper.allowSlideNext = allowSlideNext;
2435  if (swiper.controller && swiper.controller.control && !byController) {
2436    const loopParams = {
2437      slideRealIndex,
2438      direction,
2439      setTranslate: setTranslate2,
2440      activeSlideIndex,
2441      byController: true
2442    };
2443    if (Array.isArray(swiper.controller.control)) {
2444      swiper.controller.control.forEach((c) => {
2445        if (!c.destroyed && c.params.loop)
2446          c.loopFix({
2447            ...loopParams,
2448            slideTo: c.params.slidesPerView === params.slidesPerView ? slideTo2 : false
2449          });
2450      });
2451    } else if (swiper.controller.control instanceof swiper.constructor && swiper.controller.control.params.loop) {
2452      swiper.controller.control.loopFix({
2453        ...loopParams,
2454        slideTo: swiper.controller.control.params.slidesPerView === params.slidesPerView ? slideTo2 : false
2455      });
2456    }
2457  }
2458  swiper.emit("loopFix");
2459}
2460function loopDestroy() {
2461  const swiper = this;
2462  const {
2463    params,
2464    slidesEl
2465  } = swiper;
2466  if (!params.loop || swiper.virtual && swiper.params.virtual.enabled)
2467    return;
2468  swiper.recalcSlides();
2469  const newSlidesOrder = [];
2470  swiper.slides.forEach((slideEl) => {
2471    const index = typeof slideEl.swiperSlideIndex === "undefined" ? slideEl.getAttribute("data-swiper-slide-index") * 1 : slideEl.swiperSlideIndex;
2472    newSlidesOrder[index] = slideEl;
2473  });
2474  swiper.slides.forEach((slideEl) => {
2475    slideEl.removeAttribute("data-swiper-slide-index");
2476  });
2477  newSlidesOrder.forEach((slideEl) => {
2478    slidesEl.append(slideEl);
2479  });
2480  swiper.recalcSlides();
2481  swiper.slideTo(swiper.realIndex, 0);
2482}
2483var loop = {
2484  loopCreate,
2485  loopFix,
2486  loopDestroy
2487};
2488function setGrabCursor(moving) {
2489  const swiper = this;
2490  if (!swiper.params.simulateTouch || swiper.params.watchOverflow && swiper.isLocked || swiper.params.cssMode)
2491    return;
2492  const el = swiper.params.touchEventsTarget === "container" ? swiper.el : swiper.wrapperEl;
2493  if (swiper.isElement) {
2494    swiper.__preventObserver__ = true;
2495  }
2496  el.style.cursor = "move";
2497  el.style.cursor = moving ? "grabbing" : "grab";
2498  if (swiper.isElement) {
2499    requestAnimationFrame(() => {
2500      swiper.__preventObserver__ = false;
2501    });
2502  }
2503}
2504function unsetGrabCursor() {
2505  const swiper = this;
2506  if (swiper.params.watchOverflow && swiper.isLocked || swiper.params.cssMode) {
2507    return;
2508  }
2509  if (swiper.isElement) {
2510    swiper.__preventObserver__ = true;
2511  }
2512  swiper[swiper.params.touchEventsTarget === "container" ? "el" : "wrapperEl"].style.cursor = "";
2513  if (swiper.isElement) {
2514    requestAnimationFrame(() => {
2515      swiper.__preventObserver__ = false;
2516    });
2517  }
2518}
2519var grabCursor = {
2520  setGrabCursor,
2521  unsetGrabCursor
2522};
2523function closestElement(selector, base) {
2524  if (base === void 0) {
2525    base = this;
2526  }
2527  function __closestFrom(el) {
2528    if (!el || el === getDocument() || el === getWindow())
2529      return null;
2530    if (el.assignedSlot)
2531      el = el.assignedSlot;
2532    const found = el.closest(selector);
2533    if (!found && !el.getRootNode) {
2534      return null;
2535    }
2536    return found || __closestFrom(el.getRootNode().host);
2537  }
2538  return __closestFrom(base);
2539}
2540function preventEdgeSwipe(swiper, event, startX) {
2541  const window2 = getWindow();
2542  const {
2543    params
2544  } = swiper;
2545  const edgeSwipeDetection = params.edgeSwipeDetection;
2546  const edgeSwipeThreshold = params.edgeSwipeThreshold;
2547  if (edgeSwipeDetection && (startX <= edgeSwipeThreshold || startX >= window2.innerWidth - edgeSwipeThreshold)) {
2548    if (edgeSwipeDetection === "prevent") {
2549      event.preventDefault();
2550      return true;
2551    }
2552    return false;
2553  }
2554  return true;
2555}
2556function onTouchStart(event) {
2557  const swiper = this;
2558  const document2 = getDocument();
2559  let e = event;
2560  if (e.originalEvent)
2561    e = e.originalEvent;
2562  const data = swiper.touchEventsData;
2563  if (e.type === "pointerdown") {
2564    if (data.pointerId !== null && data.pointerId !== e.pointerId) {
2565      return;
2566    }
2567    data.pointerId = e.pointerId;
2568  } else if (e.type === "touchstart" && e.targetTouches.length === 1) {
2569    data.touchId = e.targetTouches[0].identifier;
2570  }
2571  if (e.type === "touchstart") {
2572    preventEdgeSwipe(swiper, e, e.targetTouches[0].pageX);
2573    return;
2574  }
2575  const {
2576    params,
2577    touches,
2578    enabled
2579  } = swiper;
2580  if (!enabled)
2581    return;
2582  if (!params.simulateTouch && e.pointerType === "mouse")
2583    return;
2584  if (swiper.animating && params.preventInteractionOnTransition) {
2585    return;
2586  }
2587  if (!swiper.animating && params.cssMode && params.loop) {
2588    swiper.loopFix();
2589  }
2590  let targetEl = e.target;
2591  if (params.touchEventsTarget === "wrapper") {
2592    if (!swiper.wrapperEl.contains(targetEl))
2593      return;
2594  }
2595  if ("which" in e && e.which === 3)
2596    return;
2597  if ("button" in e && e.button > 0)
2598    return;
2599  if (data.isTouched && data.isMoved)
2600    return;
2601  const swipingClassHasValue = !!params.noSwipingClass && params.noSwipingClass !== "";
2602  const eventPath = e.composedPath ? e.composedPath() : e.path;
2603  if (swipingClassHasValue && e.target && e.target.shadowRoot && eventPath) {
2604    targetEl = eventPath[0];
2605  }
2606  const noSwipingSelector = params.noSwipingSelector ? params.noSwipingSelector : `.${params.noSwipingClass}`;
2607  const isTargetShadow = !!(e.target && e.target.shadowRoot);
2608  if (params.noSwiping && (isTargetShadow ? closestElement(noSwipingSelector, targetEl) : targetEl.closest(noSwipingSelector))) {
2609    swiper.allowClick = true;
2610    return;
2611  }
2612  if (params.swipeHandler) {
2613    if (!targetEl.closest(params.swipeHandler))
2614      return;
2615  }
2616  touches.currentX = e.pageX;
2617  touches.currentY = e.pageY;
2618  const startX = touches.currentX;
2619  const startY = touches.currentY;
2620  if (!preventEdgeSwipe(swiper, e, startX)) {
2621    return;
2622  }
2623  Object.assign(data, {
2624    isTouched: true,
2625    isMoved: false,
2626    allowTouchCallbacks: true,
2627    isScrolling: void 0,
2628    startMoving: void 0
2629  });
2630  touches.startX = startX;
2631  touches.startY = startY;
2632  data.touchStartTime = now();
2633  swiper.allowClick = true;
2634  swiper.updateSize();
2635  swiper.swipeDirection = void 0;
2636  if (params.threshold > 0)
2637    data.allowThresholdMove = false;
2638  let preventDefault = true;
2639  if (targetEl.matches(data.focusableElements)) {
2640    preventDefault = false;
2641    if (targetEl.nodeName === "SELECT") {
2642      data.isTouched = false;
2643    }
2644  }
2645  if (document2.activeElement && document2.activeElement.matches(data.focusableElements) && document2.activeElement !== targetEl) {
2646    document2.activeElement.blur();
2647  }
2648  const shouldPreventDefault = preventDefault && swiper.allowTouchMove && params.touchStartPreventDefault;
2649  if ((params.touchStartForcePreventDefault || shouldPreventDefault) && !targetEl.isContentEditable) {
2650    e.preventDefault();
2651  }
2652  if (params.freeMode && params.freeMode.enabled && swiper.freeMode && swiper.animating && !params.cssMode) {
2653    swiper.freeMode.onTouchStart();
2654  }
2655  swiper.emit("touchStart", e);
2656}
2657function onTouchMove(event) {
2658  const document2 = getDocument();
2659  const swiper = this;
2660  const data = swiper.touchEventsData;
2661  const {
2662    params,
2663    touches,
2664    rtlTranslate: rtl,
2665    enabled
2666  } = swiper;
2667  if (!enabled)
2668    return;
2669  if (!params.simulateTouch && event.pointerType === "mouse")
2670    return;
2671  let e = event;
2672  if (e.originalEvent)
2673    e = e.originalEvent;
2674  if (e.type === "pointermove") {
2675    if (data.touchId !== null)
2676      return;
2677    const id = e.pointerId;
2678    if (id !== data.pointerId)
2679      return;
2680  }
2681  let targetTouch;
2682  if (e.type === "touchmove") {
2683    targetTouch = [...e.changedTouches].filter((t) => t.identifier === data.touchId)[0];
2684    if (!targetTouch || targetTouch.identifier !== data.touchId)
2685      return;
2686  } else {
2687    targetTouch = e;
2688  }
2689  if (!data.isTouched) {
2690    if (data.startMoving && data.isScrolling) {
2691      swiper.emit("touchMoveOpposite", e);
2692    }
2693    return;
2694  }
2695  const pageX = targetTouch.pageX;
2696  const pageY = targetTouch.pageY;
2697  if (e.preventedByNestedSwiper) {
2698    touches.startX = pageX;
2699    touches.startY = pageY;
2700    return;
2701  }
2702  if (!swiper.allowTouchMove) {
2703    if (!e.target.matches(data.focusableElements)) {
2704      swiper.allowClick = false;
2705    }
2706    if (data.isTouched) {
2707      Object.assign(touches, {
2708        startX: pageX,
2709        startY: pageY,
2710        currentX: pageX,
2711        currentY: pageY
2712      });
2713      data.touchStartTime = now();
2714    }
2715    return;
2716  }
2717  if (params.touchReleaseOnEdges && !params.loop) {
2718    if (swiper.isVertical()) {
2719      if (pageY < touches.startY && swiper.translate <= swiper.maxTranslate() || pageY > touches.startY && swiper.translate >= swiper.minTranslate()) {
2720        data.isTouched = false;
2721        data.isMoved = false;
2722        return;
2723      }
2724    } else if (pageX < touches.startX && swiper.translate <= swiper.maxTranslate() || pageX > touches.startX && swiper.translate >= swiper.minTranslate()) {
2725      return;
2726    }
2727  }
2728  if (document2.activeElement) {
2729    if (e.target === document2.activeElement && e.target.matches(data.focusableElements)) {
2730      data.isMoved = true;
2731      swiper.allowClick = false;
2732      return;
2733    }
2734  }
2735  if (data.allowTouchCallbacks) {
2736    swiper.emit("touchMove", e);
2737  }
2738  touches.previousX = touches.currentX;
2739  touches.previousY = touches.currentY;
2740  touches.currentX = pageX;
2741  touches.currentY = pageY;
2742  const diffX = touches.currentX - touches.startX;
2743  const diffY = touches.currentY - touches.startY;
2744  if (swiper.params.threshold && Math.sqrt(diffX ** 2 + diffY ** 2) < swiper.params.threshold)
2745    return;
2746  if (typeof data.isScrolling === "undefined") {
2747    let touchAngle;
2748    if (swiper.isHorizontal() && touches.currentY === touches.startY || swiper.isVertical() && touches.currentX === touches.startX) {
2749      data.isScrolling = false;
2750    } else {
2751      if (diffX * diffX + diffY * diffY >= 25) {
2752        touchAngle = Math.atan2(Math.abs(diffY), Math.abs(diffX)) * 180 / Math.PI;
2753        data.isScrolling = swiper.isHorizontal() ? touchAngle > params.touchAngle : 90 - touchAngle > params.touchAngle;
2754      }
2755    }
2756  }
2757  if (data.isScrolling) {
2758    swiper.emit("touchMoveOpposite", e);
2759  }
2760  if (typeof data.startMoving === "undefined") {
2761    if (touches.currentX !== touches.startX || touches.currentY !== touches.startY) {
2762      data.startMoving = true;
2763    }
2764  }
2765  if (data.isScrolling || e.type === "touchmove" && data.preventTouchMoveFromPointerMove) {
2766    data.isTouched = false;
2767    return;
2768  }
2769  if (!data.startMoving) {
2770    return;
2771  }
2772  swiper.allowClick = false;
2773  if (!params.cssMode && e.cancelable) {
2774    e.preventDefault();
2775  }
2776  if (params.touchMoveStopPropagation && !params.nested) {
2777    e.stopPropagation();
2778  }
2779  let diff = swiper.isHorizontal() ? diffX : diffY;
2780  let touchesDiff = swiper.isHorizontal() ? touches.currentX - touches.previousX : touches.currentY - touches.previousY;
2781  if (params.oneWayMovement) {
2782    diff = Math.abs(diff) * (rtl ? 1 : -1);
2783    touchesDiff = Math.abs(touchesDiff) * (rtl ? 1 : -1);
2784  }
2785  touches.diff = diff;
2786  diff *= params.touchRatio;
2787  if (rtl) {
2788    diff = -diff;
2789    touchesDiff = -touchesDiff;
2790  }
2791  const prevTouchesDirection = swiper.touchesDirection;
2792  swiper.swipeDirection = diff > 0 ? "prev" : "next";
2793  swiper.touchesDirection = touchesDiff > 0 ? "prev" : "next";
2794  const isLoop = swiper.params.loop && !params.cssMode;
2795  const allowLoopFix = swiper.touchesDirection === "next" && swiper.allowSlideNext || swiper.touchesDirection === "prev" && swiper.allowSlidePrev;
2796  if (!data.isMoved) {
2797    if (isLoop && allowLoopFix) {
2798      swiper.loopFix({
2799        direction: swiper.swipeDirection
2800      });
2801    }
2802    data.startTranslate = swiper.getTranslate();
2803    swiper.setTransition(0);
2804    if (swiper.animating) {
2805      const evt = new window.CustomEvent("transitionend", {
2806        bubbles: true,
2807        cancelable: true
2808      });
2809      swiper.wrapperEl.dispatchEvent(evt);
2810    }
2811    data.allowMomentumBounce = false;
2812    if (params.grabCursor && (swiper.allowSlideNext === true || swiper.allowSlidePrev === true)) {
2813      swiper.setGrabCursor(true);
2814    }
2815    swiper.emit("sliderFirstMove", e);
2816  }
2817  let loopFixed;
2818  (/* @__PURE__ */ new Date()).getTime();
2819  if (data.isMoved && data.allowThresholdMove && prevTouchesDirection !== swiper.touchesDirection && isLoop && allowLoopFix && Math.abs(diff) >= 1) {
2820    Object.assign(touches, {
2821      startX: pageX,
2822      startY: pageY,
2823      currentX: pageX,
2824      currentY: pageY,
2825      startTranslate: data.currentTranslate
2826    });
2827    data.loopSwapReset = true;
2828    data.startTranslate = data.currentTranslate;
2829    return;
2830  }
2831  swiper.emit("sliderMove", e);
2832  data.isMoved = true;
2833  data.currentTranslate = diff + data.startTranslate;
2834  let disableParentSwiper = true;
2835  let resistanceRatio = params.resistanceRatio;
2836  if (params.touchReleaseOnEdges) {
2837    resistanceRatio = 0;
2838  }
2839  if (diff > 0) {
2840    if (isLoop && allowLoopFix && !loopFixed && data.allowThresholdMove && data.currentTranslate > (params.centeredSlides ? swiper.minTranslate() - swiper.slidesSizesGrid[swiper.activeIndex + 1] : swiper.minTranslate())) {
2841      swiper.loopFix({
2842        direction: "prev",
2843        setTranslate: true,
2844        activeSlideIndex: 0
2845      });
2846    }
2847    if (data.currentTranslate > swiper.minTranslate()) {
2848      disableParentSwiper = false;
2849      if (params.resistance) {
2850        data.currentTranslate = swiper.minTranslate() - 1 + (-swiper.minTranslate() + data.startTranslate + diff) ** resistanceRatio;
2851      }
2852    }
2853  } else if (diff < 0) {
2854    if (isLoop && allowLoopFix && !loopFixed && data.allowThresholdMove && data.currentTranslate < (params.centeredSlides ? swiper.maxTranslate() + swiper.slidesSizesGrid[swiper.slidesSizesGrid.length - 1] : swiper.maxTranslate())) {
2855      swiper.loopFix({
2856        direction: "next",
2857        setTranslate: true,
2858        activeSlideIndex: swiper.slides.length - (params.slidesPerView === "auto" ? swiper.slidesPerViewDynamic() : Math.ceil(parseFloat(params.slidesPerView, 10)))
2859      });
2860    }
2861    if (data.currentTranslate < swiper.maxTranslate()) {
2862      disableParentSwiper = false;
2863      if (params.resistance) {
2864        data.currentTranslate = swiper.maxTranslate() + 1 - (swiper.maxTranslate() - data.startTranslate - diff) ** resistanceRatio;
2865      }
2866    }
2867  }
2868  if (disableParentSwiper) {
2869    e.preventedByNestedSwiper = true;
2870  }
2871  if (!swiper.allowSlideNext && swiper.swipeDirection === "next" && data.currentTranslate < data.startTranslate) {
2872    data.currentTranslate = data.startTranslate;
2873  }
2874  if (!swiper.allowSlidePrev && swiper.swipeDirection === "prev" && data.currentTranslate > data.startTranslate) {
2875    data.currentTranslate = data.startTranslate;
2876  }
2877  if (!swiper.allowSlidePrev && !swiper.allowSlideNext) {
2878    data.currentTranslate = data.startTranslate;
2879  }
2880  if (params.threshold > 0) {
2881    if (Math.abs(diff) > params.threshold || data.allowThresholdMove) {
2882      if (!data.allowThresholdMove) {
2883        data.allowThresholdMove = true;
2884        touches.startX = touches.currentX;
2885        touches.startY = touches.currentY;
2886        data.currentTranslate = data.startTranslate;
2887        touches.diff = swiper.isHorizontal() ? touches.currentX - touches.startX : touches.currentY - touches.startY;
2888        return;
2889      }
2890    } else {
2891      data.currentTranslate = data.startTranslate;
2892      return;
2893    }
2894  }
2895  if (!params.followFinger || params.cssMode)
2896    return;
2897  if (params.freeMode && params.freeMode.enabled && swiper.freeMode || params.watchSlidesProgress) {
2898    swiper.updateActiveIndex();
2899    swiper.updateSlidesClasses();
2900  }
2901  if (params.freeMode && params.freeMode.enabled && swiper.freeMode) {
2902    swiper.freeMode.onTouchMove();
2903  }
2904  swiper.updateProgress(data.currentTranslate);
2905  swiper.setTranslate(data.currentTranslate);
2906}
2907function onTouchEnd(event) {
2908  const swiper = this;
2909  const data = swiper.touchEventsData;
2910  let e = event;
2911  if (e.originalEvent)
2912    e = e.originalEvent;
2913  let targetTouch;
2914  const isTouchEvent = e.type === "touchend" || e.type === "touchcancel";
2915  if (!isTouchEvent) {
2916    if (data.touchId !== null)
2917      return;
2918    if (e.pointerId !== data.pointerId)
2919      return;
2920    targetTouch = e;
2921  } else {
2922    targetTouch = [...e.changedTouches].filter((t) => t.identifier === data.touchId)[0];
2923    if (!targetTouch || targetTouch.identifier !== data.touchId)
2924      return;
2925  }
2926  if (["pointercancel", "pointerout", "pointerleave", "contextmenu"].includes(e.type)) {
2927    const proceed = ["pointercancel", "contextmenu"].includes(e.type) && (swiper.browser.isSafari || swiper.browser.isWebView);
2928    if (!proceed) {
2929      return;
2930    }
2931  }
2932  data.pointerId = null;
2933  data.touchId = null;
2934  const {
2935    params,
2936    touches,
2937    rtlTranslate: rtl,
2938    slidesGrid,
2939    enabled
2940  } = swiper;
2941  if (!enabled)
2942    return;
2943  if (!params.simulateTouch && e.pointerType === "mouse")
2944    return;
2945  if (data.allowTouchCallbacks) {
2946    swiper.emit("touchEnd", e);
2947  }
2948  data.allowTouchCallbacks = false;
2949  if (!data.isTouched) {
2950    if (data.isMoved && params.grabCursor) {
2951      swiper.setGrabCursor(false);
2952    }
2953    data.isMoved = false;
2954    data.startMoving = false;
2955    return;
2956  }
2957  if (params.grabCursor && data.isMoved && data.isTouched && (swiper.allowSlideNext === true || swiper.allowSlidePrev === true)) {
2958    swiper.setGrabCursor(false);
2959  }
2960  const touchEndTime = now();
2961  const timeDiff = touchEndTime - data.touchStartTime;
2962  if (swiper.allowClick) {
2963    const pathTree = e.path || e.composedPath && e.composedPath();
2964    swiper.updateClickedSlide(pathTree && pathTree[0] || e.target, pathTree);
2965    swiper.emit("tap click", e);
2966    if (timeDiff < 300 && touchEndTime - data.lastClickTime < 300) {
2967      swiper.emit("doubleTap doubleClick", e);
2968    }
2969  }
2970  data.lastClickTime = now();
2971  nextTick(() => {
2972    if (!swiper.destroyed)
2973      swiper.allowClick = true;
2974  });
2975  if (!data.isTouched || !data.isMoved || !swiper.swipeDirection || touches.diff === 0 && !data.loopSwapReset || data.currentTranslate === data.startTranslate && !data.loopSwapReset) {
2976    data.isTouched = false;
vendor: 6,013 bytes, lines 2977-3160
2977    data.isMoved = false;
2978    data.startMoving = false;
2979    return;
2980  }
2981  data.isTouched = false;
2982  data.isMoved = false;
2983  data.startMoving = false;
2984  let currentPos;
2985  if (params.followFinger) {
2986    currentPos = rtl ? swiper.translate : -swiper.translate;
2987  } else {
2988    currentPos = -data.currentTranslate;
2989  }
2990  if (params.cssMode) {
2991    return;
2992  }
2993  if (params.freeMode && params.freeMode.enabled) {
2994    swiper.freeMode.onTouchEnd({
2995      currentPos
2996    });
2997    return;
2998  }
2999  const swipeToLast = currentPos >= -swiper.maxTranslate() && !swiper.params.loop;
3000  let stopIndex = 0;
3001  let groupSize = swiper.slidesSizesGrid[0];
3002  for (let i = 0; i < slidesGrid.length; i += i < params.slidesPerGroupSkip ? 1 : params.slidesPerGroup) {
3003    const increment2 = i < params.slidesPerGroupSkip - 1 ? 1 : params.slidesPerGroup;
3004    if (typeof slidesGrid[i + increment2] !== "undefined") {
3005      if (swipeToLast || currentPos >= slidesGrid[i] && currentPos < slidesGrid[i + increment2]) {
3006        stopIndex = i;
3007        groupSize = slidesGrid[i + increment2] - slidesGrid[i];
3008      }
3009    } else if (swipeToLast || currentPos >= slidesGrid[i]) {
3010      stopIndex = i;
3011      groupSize = slidesGrid[slidesGrid.length - 1] - slidesGrid[slidesGrid.length - 2];
3012    }
3013  }
3014  let rewindFirstIndex = null;
3015  let rewindLastIndex = null;
3016  if (params.rewind) {
3017    if (swiper.isBeginning) {
3018      rewindLastIndex = params.virtual && params.virtual.enabled && swiper.virtual ? swiper.virtual.slides.length - 1 : swiper.slides.length - 1;
3019    } else if (swiper.isEnd) {
3020      rewindFirstIndex = 0;
3021    }
3022  }
3023  const ratio = (currentPos - slidesGrid[stopIndex]) / groupSize;
3024  const increment = stopIndex < params.slidesPerGroupSkip - 1 ? 1 : params.slidesPerGroup;
3025  if (timeDiff > params.longSwipesMs) {
3026    if (!params.longSwipes) {
3027      swiper.slideTo(swiper.activeIndex);
3028      return;
3029    }
3030    if (swiper.swipeDirection === "next") {
3031      if (ratio >= params.longSwipesRatio)
3032        swiper.slideTo(params.rewind && swiper.isEnd ? rewindFirstIndex : stopIndex + increment);
3033      else
3034        swiper.slideTo(stopIndex);
3035    }
3036    if (swiper.swipeDirection === "prev") {
3037      if (ratio > 1 - params.longSwipesRatio) {
3038        swiper.slideTo(stopIndex + increment);
3039      } else if (rewindLastIndex !== null && ratio < 0 && Math.abs(ratio) > params.longSwipesRatio) {
3040        swiper.slideTo(rewindLastIndex);
3041      } else {
3042        swiper.slideTo(stopIndex);
3043      }
3044    }
3045  } else {
3046    if (!params.shortSwipes) {
3047      swiper.slideTo(swiper.activeIndex);
3048      return;
3049    }
3050    const isNavButtonTarget = swiper.navigation && (e.target === swiper.navigation.nextEl || e.target === swiper.navigation.prevEl);
3051    if (!isNavButtonTarget) {
3052      if (swiper.swipeDirection === "next") {
3053        swiper.slideTo(rewindFirstIndex !== null ? rewindFirstIndex : stopIndex + increment);
3054      }
3055      if (swiper.swipeDirection === "prev") {
3056        swiper.slideTo(rewindLastIndex !== null ? rewindLastIndex : stopIndex);
3057      }
3058    } else if (e.target === swiper.navigation.nextEl) {
3059      swiper.slideTo(stopIndex + increment);
3060    } else {
3061      swiper.slideTo(stopIndex);
3062    }
3063  }
3064}
3065function onResize() {
3066  const swiper = this;
3067  const {
3068    params,
3069    el
3070  } = swiper;
3071  if (el && el.offsetWidth === 0)
3072    return;
3073  if (params.breakpoints) {
3074    swiper.setBreakpoint();
3075  }
3076  const {
3077    allowSlideNext,
3078    allowSlidePrev,
3079    snapGrid
3080  } = swiper;
3081  const isVirtual = swiper.virtual && swiper.params.virtual.enabled;
3082  swiper.allowSlideNext = true;
3083  swiper.allowSlidePrev = true;
3084  swiper.updateSize();
3085  swiper.updateSlides();
3086  swiper.updateSlidesClasses();
3087  const isVirtualLoop = isVirtual && params.loop;
3088  if ((params.slidesPerView === "auto" || params.slidesPerView > 1) && swiper.isEnd && !swiper.isBeginning && !swiper.params.centeredSlides && !isVirtualLoop) {
3089    swiper.slideTo(swiper.slides.length - 1, 0, false, true);
3090  } else {
3091    if (swiper.params.loop && !isVirtual) {
3092      swiper.slideToLoop(swiper.realIndex, 0, false, true);
3093    } else {
3094      swiper.slideTo(swiper.activeIndex, 0, false, true);
3095    }
3096  }
3097  if (swiper.autoplay && swiper.autoplay.running && swiper.autoplay.paused) {
3098    clearTimeout(swiper.autoplay.resizeTimeout);
3099    swiper.autoplay.resizeTimeout = setTimeout(() => {
3100      if (swiper.autoplay && swiper.autoplay.running && swiper.autoplay.paused) {
3101        swiper.autoplay.resume();
3102      }
3103    }, 500);
3104  }
3105  swiper.allowSlidePrev = allowSlidePrev;
3106  swiper.allowSlideNext = allowSlideNext;
3107  if (swiper.params.watchOverflow && snapGrid !== swiper.snapGrid) {
3108    swiper.checkOverflow();
3109  }
3110}
3111function onClick(e) {
3112  const swiper = this;
3113  if (!swiper.enabled)
3114    return;
3115  if (!swiper.allowClick) {
3116    if (swiper.params.preventClicks)
3117      e.preventDefault();
3118    if (swiper.params.preventClicksPropagation && swiper.animating) {
3119      e.stopPropagation();
3120      e.stopImmediatePropagation();
3121    }
3122  }
3123}
3124function onScroll() {
3125  const swiper = this;
3126  const {
3127    wrapperEl,
3128    rtlTranslate,
3129    enabled
3130  } = swiper;
3131  if (!enabled)
3132    return;
3133  swiper.previousTranslate = swiper.translate;
3134  if (swiper.isHorizontal()) {
3135    swiper.translate = -wrapperEl.scrollLeft;
3136  } else {
3137    swiper.translate = -wrapperEl.scrollTop;
3138  }
3139  if (swiper.translate === 0)
3140    swiper.translate = 0;
3141  swiper.updateActiveIndex();
3142  swiper.updateSlidesClasses();
3143  let newProgress;
3144  const translatesDiff = swiper.maxTranslate() - swiper.minTranslate();
3145  if (translatesDiff === 0) {
3146    newProgress = 0;
3147  } else {
3148    newProgress = (swiper.translate - swiper.minTranslate()) / translatesDiff;
3149  }
3150  if (newProgress !== swiper.progress) {
3151    swiper.updateProgress(rtlTranslate ? -swiper.translate : swiper.translate);
3152  }
3153  swiper.emit("setTranslate", swiper.translate, false);
3154}
3155function onLoad(e) {
3156  const swiper = this;
3157  processLazyPreloader(swiper, e.target);
3158  if (swiper.params.cssMode || swiper.params.slidesPerView !== "auto" && !swiper.params.autoHeight) {
3159    return;
3160  }
vendor: 4,275 bytes, lines 3161-3295
3161  swiper.update();
3162}
3163function onDocumentTouchStart() {
3164  const swiper = this;
3165  if (swiper.documentTouchHandlerProceeded)
3166    return;
3167  swiper.documentTouchHandlerProceeded = true;
3168  if (swiper.params.touchReleaseOnEdges) {
3169    swiper.el.style.touchAction = "auto";
3170  }
3171}
3172const events = (swiper, method) => {
3173  const document2 = getDocument();
3174  const {
3175    params,
3176    el,
3177    wrapperEl,
3178    device
3179  } = swiper;
3180  const capture = !!params.nested;
3181  const domMethod = method === "on" ? "addEventListener" : "removeEventListener";
3182  const swiperMethod = method;
3183  document2[domMethod]("touchstart", swiper.onDocumentTouchStart, {
3184    passive: false,
3185    capture
3186  });
3187  el[domMethod]("touchstart", swiper.onTouchStart, {
3188    passive: false
3189  });
3190  el[domMethod]("pointerdown", swiper.onTouchStart, {
3191    passive: false
3192  });
3193  document2[domMethod]("touchmove", swiper.onTouchMove, {
3194    passive: false,
3195    capture
3196  });
3197  document2[domMethod]("pointermove", swiper.onTouchMove, {
3198    passive: false,
3199    capture
3200  });
3201  document2[domMethod]("touchend", swiper.onTouchEnd, {
3202    passive: true
3203  });
3204  document2[domMethod]("pointerup", swiper.onTouchEnd, {
3205    passive: true
3206  });
3207  document2[domMethod]("pointercancel", swiper.onTouchEnd, {
3208    passive: true
3209  });
3210  document2[domMethod]("touchcancel", swiper.onTouchEnd, {
3211    passive: true
3212  });
3213  document2[domMethod]("pointerout", swiper.onTouchEnd, {
3214    passive: true
3215  });
3216  document2[domMethod]("pointerleave", swiper.onTouchEnd, {
3217    passive: true
3218  });
3219  document2[domMethod]("contextmenu", swiper.onTouchEnd, {
3220    passive: true
3221  });
3222  if (params.preventClicks || params.preventClicksPropagation) {
3223    el[domMethod]("click", swiper.onClick, true);
3224  }
3225  if (params.cssMode) {
3226    wrapperEl[domMethod]("scroll", swiper.onScroll);
3227  }
3228  if (params.updateOnWindowResize) {
3229    swiper[swiperMethod](device.ios || device.android ? "resize orientationchange observerUpdate" : "resize observerUpdate", onResize, true);
3230  } else {
3231    swiper[swiperMethod]("observerUpdate", onResize, true);
3232  }
3233  el[domMethod]("load", swiper.onLoad, {
3234    capture: true
3235  });
3236};
3237function attachEvents() {
3238  const swiper = this;
3239  const {
3240    params
3241  } = swiper;
3242  swiper.onTouchStart = onTouchStart.bind(swiper);
3243  swiper.onTouchMove = onTouchMove.bind(swiper);
3244  swiper.onTouchEnd = onTouchEnd.bind(swiper);
3245  swiper.onDocumentTouchStart = onDocumentTouchStart.bind(swiper);
3246  if (params.cssMode) {
3247    swiper.onScroll = onScroll.bind(swiper);
3248  }
3249  swiper.onClick = onClick.bind(swiper);
3250  swiper.onLoad = onLoad.bind(swiper);
3251  events(swiper, "on");
3252}
3253function detachEvents() {
3254  const swiper = this;
3255  events(swiper, "off");
3256}
3257var events$1 = {
3258  attachEvents,
3259  detachEvents
3260};
3261const isGridEnabled = (swiper, params) => {
3262  return swiper.grid && params.grid && params.grid.rows > 1;
3263};
3264function setBreakpoint() {
3265  const swiper = this;
3266  const {
3267    realIndex,
3268    initialized,
3269    params,
3270    el
3271  } = swiper;
3272  const breakpoints2 = params.breakpoints;
3273  if (!breakpoints2 || breakpoints2 && Object.keys(breakpoints2).length === 0)
3274    return;
3275  const breakpoint = swiper.getBreakpoint(breakpoints2, swiper.params.breakpointsBase, swiper.el);
3276  if (!breakpoint || swiper.currentBreakpoint === breakpoint)
3277    return;
3278  const breakpointOnlyParams = breakpoint in breakpoints2 ? breakpoints2[breakpoint] : void 0;
3279  const breakpointParams = breakpointOnlyParams || swiper.originalParams;
3280  const wasMultiRow = isGridEnabled(swiper, params);
3281  const isMultiRow = isGridEnabled(swiper, breakpointParams);
3282  const wasGrabCursor = swiper.params.grabCursor;
3283  const isGrabCursor = breakpointParams.grabCursor;
3284  const wasEnabled = params.enabled;
3285  if (wasMultiRow && !isMultiRow) {
3286    el.classList.remove(`${params.containerModifierClass}grid`, `${params.containerModifierClass}grid-column`);
3287    swiper.emitContainerClasses();
3288  } else if (!wasMultiRow && isMultiRow) {
3289    el.classList.add(`${params.containerModifierClass}grid`);
3290    if (breakpointParams.grid.fill && breakpointParams.grid.fill === "column" || !breakpointParams.grid.fill && params.grid.fill === "column") {
3291      el.classList.add(`${params.containerModifierClass}grid-column`);
3292    }
3293    swiper.emitContainerClasses();
3294  }
3295  if (wasGrabCursor && !isGrabCursor) {
vendor: 25,549 bytes, lines 3296-4157
3296    swiper.unsetGrabCursor();
3297  } else if (!wasGrabCursor && isGrabCursor) {
3298    swiper.setGrabCursor();
3299  }
3300  ["navigation", "pagination", "scrollbar"].forEach((prop) => {
3301    if (typeof breakpointParams[prop] === "undefined")
3302      return;
3303    const wasModuleEnabled = params[prop] && params[prop].enabled;
3304    const isModuleEnabled = breakpointParams[prop] && breakpointParams[prop].enabled;
3305    if (wasModuleEnabled && !isModuleEnabled) {
3306      swiper[prop].disable();
3307    }
3308    if (!wasModuleEnabled && isModuleEnabled) {
3309      swiper[prop].enable();
3310    }
3311  });
3312  const directionChanged = breakpointParams.direction && breakpointParams.direction !== params.direction;
3313  const needsReLoop = params.loop && (breakpointParams.slidesPerView !== params.slidesPerView || directionChanged);
3314  const wasLoop = params.loop;
3315  if (directionChanged && initialized) {
3316    swiper.changeDirection();
3317  }
3318  extend(swiper.params, breakpointParams);
3319  const isEnabled = swiper.params.enabled;
3320  const hasLoop = swiper.params.loop;
3321  Object.assign(swiper, {
3322    allowTouchMove: swiper.params.allowTouchMove,
3323    allowSlideNext: swiper.params.allowSlideNext,
3324    allowSlidePrev: swiper.params.allowSlidePrev
3325  });
3326  if (wasEnabled && !isEnabled) {
3327    swiper.disable();
3328  } else if (!wasEnabled && isEnabled) {
3329    swiper.enable();
3330  }
3331  swiper.currentBreakpoint = breakpoint;
3332  swiper.emit("_beforeBreakpoint", breakpointParams);
3333  if (initialized) {
3334    if (needsReLoop) {
3335      swiper.loopDestroy();
3336      swiper.loopCreate(realIndex);
3337      swiper.updateSlides();
3338    } else if (!wasLoop && hasLoop) {
3339      swiper.loopCreate(realIndex);
3340      swiper.updateSlides();
3341    } else if (wasLoop && !hasLoop) {
3342      swiper.loopDestroy();
3343    }
3344  }
3345  swiper.emit("breakpoint", breakpointParams);
3346}
3347function getBreakpoint(breakpoints2, base, containerEl) {
3348  if (base === void 0) {
3349    base = "window";
3350  }
3351  if (!breakpoints2 || base === "container" && !containerEl)
3352    return void 0;
3353  let breakpoint = false;
3354  const window2 = getWindow();
3355  const currentHeight = base === "window" ? window2.innerHeight : containerEl.clientHeight;
3356  const points = Object.keys(breakpoints2).map((point) => {
3357    if (typeof point === "string" && point.indexOf("@") === 0) {
3358      const minRatio = parseFloat(point.substr(1));
3359      const value = currentHeight * minRatio;
3360      return {
3361        value,
3362        point
3363      };
3364    }
3365    return {
3366      value: point,
3367      point
3368    };
3369  });
3370  points.sort((a, b) => parseInt(a.value, 10) - parseInt(b.value, 10));
3371  for (let i = 0; i < points.length; i += 1) {
3372    const {
3373      point,
3374      value
3375    } = points[i];
3376    if (base === "window") {
3377      if (window2.matchMedia(`(min-width: ${value}px)`).matches) {
3378        breakpoint = point;
3379      }
3380    } else if (value <= containerEl.clientWidth) {
3381      breakpoint = point;
3382    }
3383  }
3384  return breakpoint || "max";
3385}
3386var breakpoints = {
3387  setBreakpoint,
3388  getBreakpoint
3389};
3390function prepareClasses(entries, prefix) {
3391  const resultClasses = [];
3392  entries.forEach((item) => {
3393    if (typeof item === "object") {
3394      Object.keys(item).forEach((classNames) => {
3395        if (item[classNames]) {
3396          resultClasses.push(prefix + classNames);
3397        }
3398      });
3399    } else if (typeof item === "string") {
3400      resultClasses.push(prefix + item);
3401    }
3402  });
3403  return resultClasses;
3404}
3405function addClasses() {
3406  const swiper = this;
3407  const {
3408    classNames,
3409    params,
3410    rtl,
3411    el,
3412    device
3413  } = swiper;
3414  const suffixes = prepareClasses(["initialized", params.direction, {
3415    "free-mode": swiper.params.freeMode && params.freeMode.enabled
3416  }, {
3417    "autoheight": params.autoHeight
3418  }, {
3419    "rtl": rtl
3420  }, {
3421    "grid": params.grid && params.grid.rows > 1
3422  }, {
3423    "grid-column": params.grid && params.grid.rows > 1 && params.grid.fill === "column"
3424  }, {
3425    "android": device.android
3426  }, {
3427    "ios": device.ios
3428  }, {
3429    "css-mode": params.cssMode
3430  }, {
3431    "centered": params.cssMode && params.centeredSlides
3432  }, {
3433    "watch-progress": params.watchSlidesProgress
3434  }], params.containerModifierClass);
3435  classNames.push(...suffixes);
3436  el.classList.add(...classNames);
3437  swiper.emitContainerClasses();
3438}
3439function removeClasses() {
3440  const swiper = this;
3441  const {
3442    el,
3443    classNames
3444  } = swiper;
3445  el.classList.remove(...classNames);
3446  swiper.emitContainerClasses();
3447}
3448var classes = {
3449  addClasses,
3450  removeClasses
3451};
3452function checkOverflow() {
3453  const swiper = this;
3454  const {
3455    isLocked: wasLocked,
3456    params
3457  } = swiper;
3458  const {
3459    slidesOffsetBefore
3460  } = params;
3461  if (slidesOffsetBefore) {
3462    const lastSlideIndex = swiper.slides.length - 1;
3463    const lastSlideRightEdge = swiper.slidesGrid[lastSlideIndex] + swiper.slidesSizesGrid[lastSlideIndex] + slidesOffsetBefore * 2;
3464    swiper.isLocked = swiper.size > lastSlideRightEdge;
3465  } else {
3466    swiper.isLocked = swiper.snapGrid.length === 1;
3467  }
3468  if (params.allowSlideNext === true) {
3469    swiper.allowSlideNext = !swiper.isLocked;
3470  }
3471  if (params.allowSlidePrev === true) {
3472    swiper.allowSlidePrev = !swiper.isLocked;
3473  }
3474  if (wasLocked && wasLocked !== swiper.isLocked) {
3475    swiper.isEnd = false;
3476  }
3477  if (wasLocked !== swiper.isLocked) {
3478    swiper.emit(swiper.isLocked ? "lock" : "unlock");
3479  }
3480}
3481var checkOverflow$1 = {
3482  checkOverflow
3483};
3484var defaults = {
3485  init: true,
3486  direction: "horizontal",
3487  oneWayMovement: false,
3488  swiperElementNodeName: "SWIPER-CONTAINER",
3489  touchEventsTarget: "wrapper",
3490  initialSlide: 0,
3491  speed: 300,
3492  cssMode: false,
3493  updateOnWindowResize: true,
3494  resizeObserver: true,
3495  nested: false,
3496  createElements: false,
3497  eventsPrefix: "swiper",
3498  enabled: true,
3499  focusableElements: "input, select, option, textarea, button, video, label",
3500  // Overrides
3501  width: null,
3502  height: null,
3503  //
3504  preventInteractionOnTransition: false,
3505  // ssr
3506  userAgent: null,
3507  url: null,
3508  // To support iOS's swipe-to-go-back gesture (when being used in-app).
3509  edgeSwipeDetection: false,
3510  edgeSwipeThreshold: 20,
3511  // Autoheight
3512  autoHeight: false,
3513  // Set wrapper width
3514  setWrapperSize: false,
3515  // Virtual Translate
3516  virtualTranslate: false,
3517  // Effects
3518  effect: "slide",
3519  // 'slide' or 'fade' or 'cube' or 'coverflow' or 'flip'
3520  // Breakpoints
3521  breakpoints: void 0,
3522  breakpointsBase: "window",
3523  // Slides grid
3524  spaceBetween: 0,
3525  slidesPerView: 1,
3526  slidesPerGroup: 1,
3527  slidesPerGroupSkip: 0,
3528  slidesPerGroupAuto: false,
3529  centeredSlides: false,
3530  centeredSlidesBounds: false,
3531  slidesOffsetBefore: 0,
3532  // in px
3533  slidesOffsetAfter: 0,
3534  // in px
3535  normalizeSlideIndex: true,
3536  centerInsufficientSlides: false,
3537  // Disable swiper and hide navigation when container not overflow
3538  watchOverflow: true,
3539  // Round length
3540  roundLengths: false,
3541  // Touches
3542  touchRatio: 1,
3543  touchAngle: 45,
3544  simulateTouch: true,
3545  shortSwipes: true,
3546  longSwipes: true,
3547  longSwipesRatio: 0.5,
3548  longSwipesMs: 300,
3549  followFinger: true,
3550  allowTouchMove: true,
3551  threshold: 5,
3552  touchMoveStopPropagation: false,
3553  touchStartPreventDefault: true,
3554  touchStartForcePreventDefault: false,
3555  touchReleaseOnEdges: false,
3556  // Unique Navigation Elements
3557  uniqueNavElements: true,
3558  // Resistance
3559  resistance: true,
3560  resistanceRatio: 0.85,
3561  // Progress
3562  watchSlidesProgress: false,
3563  // Cursor
3564  grabCursor: false,
3565  // Clicks
3566  preventClicks: true,
3567  preventClicksPropagation: true,
3568  slideToClickedSlide: false,
3569  // loop
3570  loop: false,
3571  loopAddBlankSlides: true,
3572  loopAdditionalSlides: 0,
3573  loopPreventsSliding: true,
3574  // rewind
3575  rewind: false,
3576  // Swiping/no swiping
3577  allowSlidePrev: true,
3578  allowSlideNext: true,
3579  swipeHandler: null,
3580  // '.swipe-handler',
3581  noSwiping: true,
3582  noSwipingClass: "swiper-no-swiping",
3583  noSwipingSelector: null,
3584  // Passive Listeners
3585  passiveListeners: true,
3586  maxBackfaceHiddenSlides: 10,
3587  // NS
3588  containerModifierClass: "swiper-",
3589  // NEW
3590  slideClass: "swiper-slide",
3591  slideBlankClass: "swiper-slide-blank",
3592  slideActiveClass: "swiper-slide-active",
3593  slideVisibleClass: "swiper-slide-visible",
3594  slideFullyVisibleClass: "swiper-slide-fully-visible",
3595  slideNextClass: "swiper-slide-next",
3596  slidePrevClass: "swiper-slide-prev",
3597  wrapperClass: "swiper-wrapper",
3598  lazyPreloaderClass: "swiper-lazy-preloader",
3599  lazyPreloadPrevNext: 0,
3600  // Callbacks
3601  runCallbacksOnInit: true,
3602  // Internals
3603  _emitClasses: false
3604};
3605function moduleExtendParams(params, allModulesParams) {
3606  return function extendParams(obj) {
3607    if (obj === void 0) {
3608      obj = {};
3609    }
3610    const moduleParamName = Object.keys(obj)[0];
3611    const moduleParams = obj[moduleParamName];
3612    if (typeof moduleParams !== "object" || moduleParams === null) {
3613      extend(allModulesParams, obj);
3614      return;
3615    }
3616    if (params[moduleParamName] === true) {
3617      params[moduleParamName] = {
3618        enabled: true
3619      };
3620    }
3621    if (moduleParamName === "navigation" && params[moduleParamName] && params[moduleParamName].enabled && !params[moduleParamName].prevEl && !params[moduleParamName].nextEl) {
3622      params[moduleParamName].auto = true;
3623    }
3624    if (["pagination", "scrollbar"].indexOf(moduleParamName) >= 0 && params[moduleParamName] && params[moduleParamName].enabled && !params[moduleParamName].el) {
3625      params[moduleParamName].auto = true;
3626    }
3627    if (!(moduleParamName in params && "enabled" in moduleParams)) {
3628      extend(allModulesParams, obj);
3629      return;
3630    }
3631    if (typeof params[moduleParamName] === "object" && !("enabled" in params[moduleParamName])) {
3632      params[moduleParamName].enabled = true;
3633    }
3634    if (!params[moduleParamName])
3635      params[moduleParamName] = {
3636        enabled: false
3637      };
3638    extend(allModulesParams, obj);
3639  };
3640}
3641const prototypes = {
3642  eventsEmitter,
3643  update,
3644  translate,
3645  transition,
3646  slide,
3647  loop,
3648  grabCursor,
3649  events: events$1,
3650  breakpoints,
3651  checkOverflow: checkOverflow$1,
3652  classes
3653};
3654const extendedDefaults = {};
3655class Swiper {
3656  constructor() {
3657    let el;
3658    let params;
3659    for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
3660      args[_key] = arguments[_key];
3661    }
3662    if (args.length === 1 && args[0].constructor && Object.prototype.toString.call(args[0]).slice(8, -1) === "Object") {
3663      params = args[0];
3664    } else {
3665      [el, params] = args;
3666    }
3667    if (!params)
3668      params = {};
3669    params = extend({}, params);
3670    if (el && !params.el)
3671      params.el = el;
3672    const document2 = getDocument();
3673    if (params.el && typeof params.el === "string" && document2.querySelectorAll(params.el).length > 1) {
3674      const swipers = [];
3675      document2.querySelectorAll(params.el).forEach((containerEl) => {
3676        const newParams = extend({}, params, {
3677          el: containerEl
3678        });
3679        swipers.push(new Swiper(newParams));
3680      });
3681      return swipers;
3682    }
3683    const swiper = this;
3684    swiper.__swiper__ = true;
3685    swiper.support = getSupport();
3686    swiper.device = getDevice({
3687      userAgent: params.userAgent
3688    });
3689    swiper.browser = getBrowser();
3690    swiper.eventsListeners = {};
3691    swiper.eventsAnyListeners = [];
3692    swiper.modules = [...swiper.__modules__];
3693    if (params.modules && Array.isArray(params.modules)) {
3694      swiper.modules.push(...params.modules);
3695    }
3696    const allModulesParams = {};
3697    swiper.modules.forEach((mod) => {
3698      mod({
3699        params,
3700        swiper,
3701        extendParams: moduleExtendParams(params, allModulesParams),
3702        on: swiper.on.bind(swiper),
3703        once: swiper.once.bind(swiper),
3704        off: swiper.off.bind(swiper),
3705        emit: swiper.emit.bind(swiper)
3706      });
3707    });
3708    const swiperParams = extend({}, defaults, allModulesParams);
3709    swiper.params = extend({}, swiperParams, extendedDefaults, params);
3710    swiper.originalParams = extend({}, swiper.params);
3711    swiper.passedParams = extend({}, params);
3712    if (swiper.params && swiper.params.on) {
3713      Object.keys(swiper.params.on).forEach((eventName) => {
3714        swiper.on(eventName, swiper.params.on[eventName]);
3715      });
3716    }
3717    if (swiper.params && swiper.params.onAny) {
3718      swiper.onAny(swiper.params.onAny);
3719    }
3720    Object.assign(swiper, {
3721      enabled: swiper.params.enabled,
3722      el,
3723      // Classes
3724      classNames: [],
3725      // Slides
3726      slides: [],
3727      slidesGrid: [],
3728      snapGrid: [],
3729      slidesSizesGrid: [],
3730      // isDirection
3731      isHorizontal() {
3732        return swiper.params.direction === "horizontal";
3733      },
3734      isVertical() {
3735        return swiper.params.direction === "vertical";
3736      },
3737      // Indexes
3738      activeIndex: 0,
3739      realIndex: 0,
3740      //
3741      isBeginning: true,
3742      isEnd: false,
3743      // Props
3744      translate: 0,
3745      previousTranslate: 0,
3746      progress: 0,
3747      velocity: 0,
3748      animating: false,
3749      cssOverflowAdjustment() {
3750        return Math.trunc(this.translate / 2 ** 23) * 2 ** 23;
3751      },
3752      // Locks
3753      allowSlideNext: swiper.params.allowSlideNext,
3754      allowSlidePrev: swiper.params.allowSlidePrev,
3755      // Touch Events
3756      touchEventsData: {
3757        isTouched: void 0,
3758        isMoved: void 0,
3759        allowTouchCallbacks: void 0,
3760        touchStartTime: void 0,
3761        isScrolling: void 0,
3762        currentTranslate: void 0,
3763        startTranslate: void 0,
3764        allowThresholdMove: void 0,
3765        // Form elements to match
3766        focusableElements: swiper.params.focusableElements,
3767        // Last click time
3768        lastClickTime: 0,
3769        clickTimeout: void 0,
3770        // Velocities
3771        velocities: [],
3772        allowMomentumBounce: void 0,
3773        startMoving: void 0,
3774        pointerId: null,
3775        touchId: null
3776      },
3777      // Clicks
3778      allowClick: true,
3779      // Touches
3780      allowTouchMove: swiper.params.allowTouchMove,
3781      touches: {
3782        startX: 0,
3783        startY: 0,
3784        currentX: 0,
3785        currentY: 0,
3786        diff: 0
3787      },
3788      // Images
3789      imagesToLoad: [],
3790      imagesLoaded: 0
3791    });
3792    swiper.emit("_swiper");
3793    if (swiper.params.init) {
3794      swiper.init();
3795    }
3796    return swiper;
3797  }
3798  getDirectionLabel(property) {
3799    if (this.isHorizontal()) {
3800      return property;
3801    }
3802    return {
3803      "width": "height",
3804      "margin-top": "margin-left",
3805      "margin-bottom ": "margin-right",
3806      "margin-left": "margin-top",
3807      "margin-right": "margin-bottom",
3808      "padding-left": "padding-top",
3809      "padding-right": "padding-bottom",
3810      "marginRight": "marginBottom"
3811    }[property];
3812  }
3813  getSlideIndex(slideEl) {
3814    const {
3815      slidesEl,
3816      params
3817    } = this;
3818    const slides = elementChildren(slidesEl, `.${params.slideClass}, swiper-slide`);
3819    const firstSlideIndex = elementIndex(slides[0]);
3820    return elementIndex(slideEl) - firstSlideIndex;
3821  }
3822  getSlideIndexByData(index) {
3823    return this.getSlideIndex(this.slides.filter((slideEl) => slideEl.getAttribute("data-swiper-slide-index") * 1 === index)[0]);
3824  }
3825  recalcSlides() {
3826    const swiper = this;
3827    const {
3828      slidesEl,
3829      params
3830    } = swiper;
3831    swiper.slides = elementChildren(slidesEl, `.${params.slideClass}, swiper-slide`);
3832  }
3833  enable() {
3834    const swiper = this;
3835    if (swiper.enabled)
3836      return;
3837    swiper.enabled = true;
3838    if (swiper.params.grabCursor) {
3839      swiper.setGrabCursor();
3840    }
3841    swiper.emit("enable");
3842  }
3843  disable() {
3844    const swiper = this;
3845    if (!swiper.enabled)
3846      return;
3847    swiper.enabled = false;
3848    if (swiper.params.grabCursor) {
3849      swiper.unsetGrabCursor();
3850    }
3851    swiper.emit("disable");
3852  }
3853  setProgress(progress, speed) {
3854    const swiper = this;
3855    progress = Math.min(Math.max(progress, 0), 1);
3856    const min = swiper.minTranslate();
3857    const max = swiper.maxTranslate();
3858    const current = (max - min) * progress + min;
3859    swiper.translateTo(current, typeof speed === "undefined" ? 0 : speed);
3860    swiper.updateActiveIndex();
3861    swiper.updateSlidesClasses();
3862  }
3863  emitContainerClasses() {
3864    const swiper = this;
3865    if (!swiper.params._emitClasses || !swiper.el)
3866      return;
3867    const cls = swiper.el.className.split(" ").filter((className) => {
3868      return className.indexOf("swiper") === 0 || className.indexOf(swiper.params.containerModifierClass) === 0;
3869    });
3870    swiper.emit("_containerClasses", cls.join(" "));
3871  }
3872  getSlideClasses(slideEl) {
3873    const swiper = this;
3874    if (swiper.destroyed)
3875      return "";
3876    return slideEl.className.split(" ").filter((className) => {
3877      return className.indexOf("swiper-slide") === 0 || className.indexOf(swiper.params.slideClass) === 0;
3878    }).join(" ");
3879  }
3880  emitSlidesClasses() {
3881    const swiper = this;
3882    if (!swiper.params._emitClasses || !swiper.el)
3883      return;
3884    const updates = [];
3885    swiper.slides.forEach((slideEl) => {
3886      const classNames = swiper.getSlideClasses(slideEl);
3887      updates.push({
3888        slideEl,
3889        classNames
3890      });
3891      swiper.emit("_slideClass", slideEl, classNames);
3892    });
3893    swiper.emit("_slideClasses", updates);
3894  }
3895  slidesPerViewDynamic(view, exact) {
3896    if (view === void 0) {
3897      view = "current";
3898    }
3899    if (exact === void 0) {
3900      exact = false;
3901    }
3902    const swiper = this;
3903    const {
3904      params,
3905      slides,
3906      slidesGrid,
3907      slidesSizesGrid,
3908      size: swiperSize,
3909      activeIndex
3910    } = swiper;
3911    let spv = 1;
3912    if (typeof params.slidesPerView === "number")
3913      return params.slidesPerView;
3914    if (params.centeredSlides) {
3915      let slideSize = slides[activeIndex] ? Math.ceil(slides[activeIndex].swiperSlideSize) : 0;
3916      let breakLoop;
3917      for (let i = activeIndex + 1; i < slides.length; i += 1) {
3918        if (slides[i] && !breakLoop) {
3919          slideSize += Math.ceil(slides[i].swiperSlideSize);
3920          spv += 1;
3921          if (slideSize > swiperSize)
3922            breakLoop = true;
3923        }
3924      }
3925      for (let i = activeIndex - 1; i >= 0; i -= 1) {
3926        if (slides[i] && !breakLoop) {
3927          slideSize += slides[i].swiperSlideSize;
3928          spv += 1;
3929          if (slideSize > swiperSize)
3930            breakLoop = true;
3931        }
3932      }
3933    } else {
3934      if (view === "current") {
3935        for (let i = activeIndex + 1; i < slides.length; i += 1) {
3936          const slideInView = exact ? slidesGrid[i] + slidesSizesGrid[i] - slidesGrid[activeIndex] < swiperSize : slidesGrid[i] - slidesGrid[activeIndex] < swiperSize;
3937          if (slideInView) {
3938            spv += 1;
3939          }
3940        }
3941      } else {
3942        for (let i = activeIndex - 1; i >= 0; i -= 1) {
3943          const slideInView = slidesGrid[activeIndex] - slidesGrid[i] < swiperSize;
3944          if (slideInView) {
3945            spv += 1;
3946          }
3947        }
3948      }
3949    }
3950    return spv;
3951  }
3952  update() {
3953    const swiper = this;
3954    if (!swiper || swiper.destroyed)
3955      return;
3956    const {
3957      snapGrid,
3958      params
3959    } = swiper;
3960    if (params.breakpoints) {
3961      swiper.setBreakpoint();
3962    }
3963    [...swiper.el.querySelectorAll('[loading="lazy"]')].forEach((imageEl) => {
3964      if (imageEl.complete) {
3965        processLazyPreloader(swiper, imageEl);
3966      }
3967    });
3968    swiper.updateSize();
3969    swiper.updateSlides();
3970    swiper.updateProgress();
3971    swiper.updateSlidesClasses();
3972    function setTranslate2() {
3973      const translateValue = swiper.rtlTranslate ? swiper.translate * -1 : swiper.translate;
3974      const newTranslate = Math.min(Math.max(translateValue, swiper.maxTranslate()), swiper.minTranslate());
3975      swiper.setTranslate(newTranslate);
3976      swiper.updateActiveIndex();
3977      swiper.updateSlidesClasses();
3978    }
3979    let translated;
3980    if (params.freeMode && params.freeMode.enabled && !params.cssMode) {
3981      setTranslate2();
3982      if (params.autoHeight) {
3983        swiper.updateAutoHeight();
3984      }
3985    } else {
3986      if ((params.slidesPerView === "auto" || params.slidesPerView > 1) && swiper.isEnd && !params.centeredSlides) {
3987        const slides = swiper.virtual && params.virtual.enabled ? swiper.virtual.slides : swiper.slides;
3988        translated = swiper.slideTo(slides.length - 1, 0, false, true);
3989      } else {
3990        translated = swiper.slideTo(swiper.activeIndex, 0, false, true);
3991      }
3992      if (!translated) {
3993        setTranslate2();
3994      }
3995    }
3996    if (params.watchOverflow && snapGrid !== swiper.snapGrid) {
3997      swiper.checkOverflow();
3998    }
3999    swiper.emit("update");
4000  }
4001  changeDirection(newDirection, needUpdate) {
4002    if (needUpdate === void 0) {
4003      needUpdate = true;
4004    }
4005    const swiper = this;
4006    const currentDirection = swiper.params.direction;
4007    if (!newDirection) {
4008      newDirection = currentDirection === "horizontal" ? "vertical" : "horizontal";
4009    }
4010    if (newDirection === currentDirection || newDirection !== "horizontal" && newDirection !== "vertical") {
4011      return swiper;
4012    }
4013    swiper.el.classList.remove(`${swiper.params.containerModifierClass}${currentDirection}`);
4014    swiper.el.classList.add(`${swiper.params.containerModifierClass}${newDirection}`);
4015    swiper.emitContainerClasses();
4016    swiper.params.direction = newDirection;
4017    swiper.slides.forEach((slideEl) => {
4018      if (newDirection === "vertical") {
4019        slideEl.style.width = "";
4020      } else {
4021        slideEl.style.height = "";
4022      }
4023    });
4024    swiper.emit("changeDirection");
4025    if (needUpdate)
4026      swiper.update();
4027    return swiper;
4028  }
4029  changeLanguageDirection(direction) {
4030    const swiper = this;
4031    if (swiper.rtl && direction === "rtl" || !swiper.rtl && direction === "ltr")
4032      return;
4033    swiper.rtl = direction === "rtl";
4034    swiper.rtlTranslate = swiper.params.direction === "horizontal" && swiper.rtl;
4035    if (swiper.rtl) {
4036      swiper.el.classList.add(`${swiper.params.containerModifierClass}rtl`);
4037      swiper.el.dir = "rtl";
4038    } else {
4039      swiper.el.classList.remove(`${swiper.params.containerModifierClass}rtl`);
4040      swiper.el.dir = "ltr";
4041    }
4042    swiper.update();
4043  }
4044  mount(element) {
4045    const swiper = this;
4046    if (swiper.mounted)
4047      return true;
4048    let el = element || swiper.params.el;
4049    if (typeof el === "string") {
4050      el = document.querySelector(el);
4051    }
4052    if (!el) {
4053      return false;
4054    }
4055    el.swiper = swiper;
4056    if (el.parentNode && el.parentNode.host && el.parentNode.host.nodeName === swiper.params.swiperElementNodeName.toUpperCase()) {
4057      swiper.isElement = true;
4058    }
4059    const getWrapperSelector = () => {
4060      return `.${(swiper.params.wrapperClass || "").trim().split(" ").join(".")}`;
4061    };
4062    const getWrapper = () => {
4063      if (el && el.shadowRoot && el.shadowRoot.querySelector) {
4064        const res = el.shadowRoot.querySelector(getWrapperSelector());
4065        return res;
4066      }
4067      return elementChildren(el, getWrapperSelector())[0];
4068    };
4069    let wrapperEl = getWrapper();
4070    if (!wrapperEl && swiper.params.createElements) {
4071      wrapperEl = createElement("div", swiper.params.wrapperClass);
4072      el.append(wrapperEl);
4073      elementChildren(el, `.${swiper.params.slideClass}`).forEach((slideEl) => {
4074        wrapperEl.append(slideEl);
4075      });
4076    }
4077    Object.assign(swiper, {
4078      el,
4079      wrapperEl,
4080      slidesEl: swiper.isElement && !el.parentNode.host.slideSlots ? el.parentNode.host : wrapperEl,
4081      hostEl: swiper.isElement ? el.parentNode.host : el,
4082      mounted: true,
4083      // RTL
4084      rtl: el.dir.toLowerCase() === "rtl" || elementStyle(el, "direction") === "rtl",
4085      rtlTranslate: swiper.params.direction === "horizontal" && (el.dir.toLowerCase() === "rtl" || elementStyle(el, "direction") === "rtl"),
4086      wrongRTL: elementStyle(wrapperEl, "display") === "-webkit-box"
4087    });
4088    return true;
4089  }
4090  init(el) {
4091    const swiper = this;
4092    if (swiper.initialized)
4093      return swiper;
4094    const mounted = swiper.mount(el);
4095    if (mounted === false)
4096      return swiper;
4097    swiper.emit("beforeInit");
4098    if (swiper.params.breakpoints) {
4099      swiper.setBreakpoint();
4100    }
4101    swiper.addClasses();
4102    swiper.updateSize();
4103    swiper.updateSlides();
4104    if (swiper.params.watchOverflow) {
4105      swiper.checkOverflow();
4106    }
4107    if (swiper.params.grabCursor && swiper.enabled) {
4108      swiper.setGrabCursor();
4109    }
4110    if (swiper.params.loop && swiper.virtual && swiper.params.virtual.enabled) {
4111      swiper.slideTo(swiper.params.initialSlide + swiper.virtual.slidesBefore, 0, swiper.params.runCallbacksOnInit, false, true);
4112    } else {
4113      swiper.slideTo(swiper.params.initialSlide, 0, swiper.params.runCallbacksOnInit, false, true);
4114    }
4115    if (swiper.params.loop) {
4116      swiper.loopCreate();
4117    }
4118    swiper.attachEvents();
4119    const lazyElements = [...swiper.el.querySelectorAll('[loading="lazy"]')];
4120    if (swiper.isElement) {
4121      lazyElements.push(...swiper.hostEl.querySelectorAll('[loading="lazy"]'));
4122    }
4123    lazyElements.forEach((imageEl) => {
4124      if (imageEl.complete) {
4125        processLazyPreloader(swiper, imageEl);
4126      } else {
4127        imageEl.addEventListener("load", (e) => {
4128          processLazyPreloader(swiper, e.target);
4129        });
4130      }
4131    });
4132    preload(swiper);
4133    swiper.initialized = true;
4134    preload(swiper);
4135    swiper.emit("init");
4136    swiper.emit("afterInit");
4137    return swiper;
4138  }
4139  destroy(deleteInstance, cleanStyles) {
4140    if (deleteInstance === void 0) {
4141      deleteInstance = true;
4142    }
4143    if (cleanStyles === void 0) {
4144      cleanStyles = true;
4145    }
4146    const swiper = this;
4147    const {
4148      params,
4149      el,
4150      wrapperEl,
4151      slides
4152    } = swiper;
4153    if (typeof swiper.params === "undefined" || swiper.destroyed) {
4154      return null;
4155    }
4156    swiper.emit("beforeDestroy");
4157    swiper.initialized = false;
4158    swiper.detachEvents();
4159    if (params.loop) {
4160      swiper.loopDestroy();
4161    }
4162    if (cleanStyles) {
4163      swiper.removeClasses();
4164      el.removeAttribute("style");
4165      wrapperEl.removeAttribute("style");
4166      if (slides && slides.length) {
4167        slides.forEach((slideEl) => {
4168          slideEl.classList.remove(params.slideVisibleClass, params.slideFullyVisibleClass, params.slideActiveClass, params.slideNextClass, params.slidePrevClass);
4169          slideEl.removeAttribute("style");
4170          slideEl.removeAttribute("data-swiper-slide-index");
4171        });
4172      }
4173    }
4174    swiper.emit("destroy");
4175    Object.keys(swiper.eventsListeners).forEach((eventName) => {
4176      swiper.off(eventName);
4177    });
4178    if (deleteInstance !== false) {
4179      swiper.el.swiper = null;
4180      deleteProps(swiper);
4181    }
4182    swiper.destroyed = true;
4183    return null;
4184  }
4185  static extendDefaults(newDefaults) {
4186    extend(extendedDefaults, newDefaults);
4187  }
4188  static get extendedDefaults() {
4189    return extendedDefaults;
4190  }
4191  static get defaults() {
4192    return defaults;
4193  }
4194  static installModule(mod) {
4195    if (!Swiper.prototype.__modules__)
4196      Swiper.prototype.__modules__ = [];
4197    const modules = Swiper.prototype.__modules__;
4198    if (typeof mod === "function" && modules.indexOf(mod) < 0) {
4199      modules.push(mod);
4200    }
4201  }
4202  static use(module) {
4203    if (Array.isArray(module)) {
4204      module.forEach((m) => Swiper.installModule(m));
4205      return Swiper;
4206    }
4207    Swiper.installModule(module);
4208    return Swiper;
4209  }
4210}
4211Object.keys(prototypes).forEach((prototypeGroup) => {
4212  Object.keys(prototypes[prototypeGroup]).forEach((protoMethod) => {
4213    Swiper.prototype[protoMethod] = prototypes[prototypeGroup][protoMethod];
4214  });
4215});
4216Swiper.use([Resize, Observer]);
4217function createElementIfNotDefined(swiper, originalParams, params, checkProps) {
4218  if (swiper.params.createElements) {
4219    Object.keys(checkProps).forEach((key) => {
4220      if (!params[key] && params.auto === true) {
4221        let element = elementChildren(swiper.el, `.${checkProps[key]}`)[0];
4222        if (!element) {
4223          element = createElement("div", checkProps[key]);
4224          element.className = checkProps[key];
4225          swiper.el.append(element);
4226        }
4227        params[key] = element;
4228        originalParams[key] = element;
4229      }
4230    });
4231  }
4232  return params;
4233}
4234function Navigation(_ref) {
4235  let {
4236    swiper,
4237    extendParams,
4238    on,
4239    emit
4240  } = _ref;
4241  extendParams({
4242    navigation: {
4243      nextEl: null,
4244      prevEl: null,
4245      hideOnClick: false,
4246      disabledClass: "swiper-button-disabled",
4247      hiddenClass: "swiper-button-hidden",
4248      lockClass: "swiper-button-lock",
4249      navigationDisabledClass: "swiper-navigation-disabled"
4250    }
4251  });
4252  swiper.navigation = {
4253    nextEl: null,
4254    prevEl: null
4255  };
4256  function getEl(el) {
4257    let res;
4258    if (el && typeof el === "string" && swiper.isElement) {
4259      res = swiper.el.querySelector(el);
4260      if (res)
4261        return res;
4262    }
4263    if (el) {
4264      if (typeof el === "string")
4265        res = [...document.querySelectorAll(el)];
4266      if (swiper.params.uniqueNavElements && typeof el === "string" && res && res.length > 1 && swiper.el.querySelectorAll(el).length === 1) {
4267        res = swiper.el.querySelector(el);
4268      } else if (res && res.length === 1) {
4269        res = res[0];
4270      }
4271    }
4272    if (el && !res)
4273      return el;
4274    return res;
4275  }
4276  function toggleEl(el, disabled) {
4277    const params = swiper.params.navigation;
4278    el = makeElementsArray(el);
4279    el.forEach((subEl) => {
4280      if (subEl) {
4281        subEl.classList[disabled ? "add" : "remove"](...params.disabledClass.split(" "));
4282        if (subEl.tagName === "BUTTON")
4283          subEl.disabled = disabled;
4284        if (swiper.params.watchOverflow && swiper.enabled) {
4285          subEl.classList[swiper.isLocked ? "add" : "remove"](params.lockClass);
4286        }
4287      }
4288    });
4289  }
4290  function update2() {
4291    const {
4292      nextEl,
4293      prevEl
4294    } = swiper.navigation;
4295    if (swiper.params.loop) {
4296      toggleEl(prevEl, false);
4297      toggleEl(nextEl, false);
4298      return;
4299    }
4300    toggleEl(prevEl, swiper.isBeginning && !swiper.params.rewind);
4301    toggleEl(nextEl, swiper.isEnd && !swiper.params.rewind);
4302  }
4303  function onPrevClick(e) {
4304    e.preventDefault();
4305    if (swiper.isBeginning && !swiper.params.loop && !swiper.params.rewind)
4306      return;
4307    swiper.slidePrev();
4308    emit("navigationPrev");
4309  }
4310  function onNextClick(e) {
4311    e.preventDefault();
4312    if (swiper.isEnd && !swiper.params.loop && !swiper.params.rewind)
4313      return;
4314    swiper.slideNext();
4315    emit("navigationNext");
4316  }
4317  function init() {
4318    const params = swiper.params.navigation;
4319    swiper.params.navigation = createElementIfNotDefined(swiper, swiper.originalParams.navigation, swiper.params.navigation, {
4320      nextEl: "swiper-button-next",
4321      prevEl: "swiper-button-prev"
4322    });
4323    if (!(params.nextEl || params.prevEl))
4324      return;
4325    let nextEl = getEl(params.nextEl);
4326    let prevEl = getEl(params.prevEl);
4327    Object.assign(swiper.navigation, {
4328      nextEl,
4329      prevEl
4330    });
4331    nextEl = makeElementsArray(nextEl);
4332    prevEl = makeElementsArray(prevEl);
4333    const initButton = (el, dir) => {
4334      if (el) {
4335        el.addEventListener("click", dir === "next" ? onNextClick : onPrevClick);
4336      }
4337      if (!swiper.enabled && el) {
4338        el.classList.add(...params.lockClass.split(" "));
4339      }
4340    };
4341    nextEl.forEach((el) => initButton(el, "next"));
4342    prevEl.forEach((el) => initButton(el, "prev"));
4343  }
4344  function destroy() {
4345    let {
4346      nextEl,
4347      prevEl
4348    } = swiper.navigation;
4349    nextEl = makeElementsArray(nextEl);
4350    prevEl = makeElementsArray(prevEl);
4351    const destroyButton = (el, dir) => {
4352      el.removeEventListener("click", dir === "next" ? onNextClick : onPrevClick);
4353      el.classList.remove(...swiper.params.navigation.disabledClass.split(" "));
4354    };
4355    nextEl.forEach((el) => destroyButton(el, "next"));
4356    prevEl.forEach((el) => destroyButton(el, "prev"));
4357  }
4358  on("init", () => {
4359    if (swiper.params.navigation.enabled === false) {
4360      disable();
4361    } else {
4362      init();
4363      update2();
4364    }
4365  });
4366  on("toEdge fromEdge lock unlock", () => {
4367    update2();
4368  });
4369  on("destroy", () => {
4370    destroy();
4371  });
4372  on("enable disable", () => {
4373    let {
4374      nextEl,
4375      prevEl
4376    } = swiper.navigation;
4377    nextEl = makeElementsArray(nextEl);
4378    prevEl = makeElementsArray(prevEl);
4379    if (swiper.enabled) {
4380      update2();
4381      return;
4382    }
4383    [...nextEl, ...prevEl].filter((el) => !!el).forEach((el) => el.classList.add(swiper.params.navigation.lockClass));
4384  });
4385  on("click", (_s, e) => {
4386    let {
4387      nextEl,
4388      prevEl
4389    } = swiper.navigation;
4390    nextEl = makeElementsArray(nextEl);
4391    prevEl = makeElementsArray(prevEl);
4392    const targetEl = e.target;
4393    if (swiper.params.navigation.hideOnClick && !prevEl.includes(targetEl) && !nextEl.includes(targetEl)) {
4394      if (swiper.pagination && swiper.params.pagination && swiper.params.pagination.clickable && (swiper.pagination.el === targetEl || swiper.pagination.el.contains(targetEl)))
4395        return;
4396      let isHidden;
4397      if (nextEl.length) {
4398        isHidden = nextEl[0].classList.contains(swiper.params.navigation.hiddenClass);
4399      } else if (prevEl.length) {
4400        isHidden = prevEl[0].classList.contains(swiper.params.navigation.hiddenClass);
4401      }
4402      if (isHidden === true) {
4403        emit("navigationShow");
4404      } else {
4405        emit("navigationHide");
4406      }
4407      [...nextEl, ...prevEl].filter((el) => !!el).forEach((el) => el.classList.toggle(swiper.params.navigation.hiddenClass));
4408    }
4409  });
4410  const enable = () => {
4411    swiper.el.classList.remove(...swiper.params.navigation.navigationDisabledClass.split(" "));
4412    init();
4413    update2();
4414  };
4415  const disable = () => {
4416    swiper.el.classList.add(...swiper.params.navigation.navigationDisabledClass.split(" "));
4417    destroy();
4418  };
4419  Object.assign(swiper.navigation, {
4420    enable,
4421    disable,
4422    update: update2,
4423    init,
4424    destroy
4425  });
4426}
4427function classesToSelector(classes2) {
4428  if (classes2 === void 0) {
4429    classes2 = "";
4430  }
4431  return `.${classes2.trim().replace(/([\.:!+\/])/g, "\\$1").replace(/ /g, ".")}`;
4432}
4433function Pagination(_ref) {
4434  let {
4435    swiper,
4436    extendParams,
4437    on,
4438    emit
4439  } = _ref;
4440  const pfx = "swiper-pagination";
4441  extendParams({
4442    pagination: {
4443      el: null,
4444      bulletElement: "span",
4445      clickable: false,
4446      hideOnClick: false,
4447      renderBullet: null,
4448      renderProgressbar: null,
4449      renderFraction: null,
4450      renderCustom: null,
4451      progressbarOpposite: false,
4452      type: "bullets",
4453      // 'bullets' or 'progressbar' or 'fraction' or 'custom'
4454      dynamicBullets: false,
4455      dynamicMainBullets: 1,
4456      formatFractionCurrent: (number) => number,
4457      formatFractionTotal: (number) => number,
4458      bulletClass: `${pfx}-bullet`,
4459      bulletActiveClass: `${pfx}-bullet-active`,
4460      modifierClass: `${pfx}-`,
4461      currentClass: `${pfx}-current`,
4462      totalClass: `${pfx}-total`,
4463      hiddenClass: `${pfx}-hidden`,
4464      progressbarFillClass: `${pfx}-progressbar-fill`,
4465      progressbarOppositeClass: `${pfx}-progressbar-opposite`,
4466      clickableClass: `${pfx}-clickable`,
4467      lockClass: `${pfx}-lock`,
4468      horizontalClass: `${pfx}-horizontal`,
4469      verticalClass: `${pfx}-vertical`,
4470      paginationDisabledClass: `${pfx}-disabled`
4471    }
4472  });
4473  swiper.pagination = {
4474    el: null,
4475    bullets: []
4476  };
4477  let bulletSize;
4478  let dynamicBulletIndex = 0;
4479  function isPaginationDisabled() {
4480    return !swiper.params.pagination.el || !swiper.pagination.el || Array.isArray(swiper.pagination.el) && swiper.pagination.el.length === 0;
4481  }
4482  function setSideBullets(bulletEl, position) {
4483    const {
4484      bulletActiveClass
4485    } = swiper.params.pagination;
4486    if (!bulletEl)
4487      return;
4488    bulletEl = bulletEl[`${position === "prev" ? "previous" : "next"}ElementSibling`];
4489    if (bulletEl) {
4490      bulletEl.classList.add(`${bulletActiveClass}-${position}`);
4491      bulletEl = bulletEl[`${position === "prev" ? "previous" : "next"}ElementSibling`];
4492      if (bulletEl) {
4493        bulletEl.classList.add(`${bulletActiveClass}-${position}-${position}`);
4494      }
4495    }
4496  }
4497  function onBulletClick(e) {
4498    const bulletEl = e.target.closest(classesToSelector(swiper.params.pagination.bulletClass));
4499    if (!bulletEl) {
4500      return;
4501    }
4502    e.preventDefault();
4503    const index = elementIndex(bulletEl) * swiper.params.slidesPerGroup;
4504    if (swiper.params.loop) {
4505      if (swiper.realIndex === index)
4506        return;
4507      swiper.slideToLoop(index);
4508    } else {
4509      swiper.slideTo(index);
4510    }
4511  }
4512  function update2() {
4513    const rtl = swiper.rtl;
4514    const params = swiper.params.pagination;
4515    if (isPaginationDisabled())
4516      return;
4517    let el = swiper.pagination.el;
4518    el = makeElementsArray(el);
vendor: 23,751 bytes, lines 4519-5196
4519    let current;
4520    let previousIndex;
4521    const slidesLength = swiper.virtual && swiper.params.virtual.enabled ? swiper.virtual.slides.length : swiper.slides.length;
4522    const total = swiper.params.loop ? Math.ceil(slidesLength / swiper.params.slidesPerGroup) : swiper.snapGrid.length;
4523    if (swiper.params.loop) {
4524      previousIndex = swiper.previousRealIndex || 0;
4525      current = swiper.params.slidesPerGroup > 1 ? Math.floor(swiper.realIndex / swiper.params.slidesPerGroup) : swiper.realIndex;
4526    } else if (typeof swiper.snapIndex !== "undefined") {
4527      current = swiper.snapIndex;
4528      previousIndex = swiper.previousSnapIndex;
4529    } else {
4530      previousIndex = swiper.previousIndex || 0;
4531      current = swiper.activeIndex || 0;
4532    }
4533    if (params.type === "bullets" && swiper.pagination.bullets && swiper.pagination.bullets.length > 0) {
4534      const bullets = swiper.pagination.bullets;
4535      let firstIndex;
4536      let lastIndex;
4537      let midIndex;
4538      if (params.dynamicBullets) {
4539        bulletSize = elementOuterSize(bullets[0], swiper.isHorizontal() ? "width" : "height", true);
4540        el.forEach((subEl) => {
4541          subEl.style[swiper.isHorizontal() ? "width" : "height"] = `${bulletSize * (params.dynamicMainBullets + 4)}px`;
4542        });
4543        if (params.dynamicMainBullets > 1 && previousIndex !== void 0) {
4544          dynamicBulletIndex += current - (previousIndex || 0);
4545          if (dynamicBulletIndex > params.dynamicMainBullets - 1) {
4546            dynamicBulletIndex = params.dynamicMainBullets - 1;
4547          } else if (dynamicBulletIndex < 0) {
4548            dynamicBulletIndex = 0;
4549          }
4550        }
4551        firstIndex = Math.max(current - dynamicBulletIndex, 0);
4552        lastIndex = firstIndex + (Math.min(bullets.length, params.dynamicMainBullets) - 1);
4553        midIndex = (lastIndex + firstIndex) / 2;
4554      }
4555      bullets.forEach((bulletEl) => {
4556        const classesToRemove = [...["", "-next", "-next-next", "-prev", "-prev-prev", "-main"].map((suffix) => `${params.bulletActiveClass}${suffix}`)].map((s) => typeof s === "string" && s.includes(" ") ? s.split(" ") : s).flat();
4557        bulletEl.classList.remove(...classesToRemove);
4558      });
4559      if (el.length > 1) {
4560        bullets.forEach((bullet) => {
4561          const bulletIndex = elementIndex(bullet);
4562          if (bulletIndex === current) {
4563            bullet.classList.add(...params.bulletActiveClass.split(" "));
4564          } else if (swiper.isElement) {
4565            bullet.setAttribute("part", "bullet");
4566          }
4567          if (params.dynamicBullets) {
4568            if (bulletIndex >= firstIndex && bulletIndex <= lastIndex) {
4569              bullet.classList.add(...`${params.bulletActiveClass}-main`.split(" "));
4570            }
4571            if (bulletIndex === firstIndex) {
4572              setSideBullets(bullet, "prev");
4573            }
4574            if (bulletIndex === lastIndex) {
4575              setSideBullets(bullet, "next");
4576            }
4577          }
4578        });
4579      } else {
4580        const bullet = bullets[current];
4581        if (bullet) {
4582          bullet.classList.add(...params.bulletActiveClass.split(" "));
4583        }
4584        if (swiper.isElement) {
4585          bullets.forEach((bulletEl, bulletIndex) => {
4586            bulletEl.setAttribute("part", bulletIndex === current ? "bullet-active" : "bullet");
4587          });
4588        }
4589        if (params.dynamicBullets) {
4590          const firstDisplayedBullet = bullets[firstIndex];
4591          const lastDisplayedBullet = bullets[lastIndex];
4592          for (let i = firstIndex; i <= lastIndex; i += 1) {
4593            if (bullets[i]) {
4594              bullets[i].classList.add(...`${params.bulletActiveClass}-main`.split(" "));
4595            }
4596          }
4597          setSideBullets(firstDisplayedBullet, "prev");
4598          setSideBullets(lastDisplayedBullet, "next");
4599        }
4600      }
4601      if (params.dynamicBullets) {
4602        const dynamicBulletsLength = Math.min(bullets.length, params.dynamicMainBullets + 4);
4603        const bulletsOffset = (bulletSize * dynamicBulletsLength - bulletSize) / 2 - midIndex * bulletSize;
4604        const offsetProp = rtl ? "right" : "left";
4605        bullets.forEach((bullet) => {
4606          bullet.style[swiper.isHorizontal() ? offsetProp : "top"] = `${bulletsOffset}px`;
4607        });
4608      }
4609    }
4610    el.forEach((subEl, subElIndex) => {
4611      if (params.type === "fraction") {
4612        subEl.querySelectorAll(classesToSelector(params.currentClass)).forEach((fractionEl) => {
4613          fractionEl.textContent = params.formatFractionCurrent(current + 1);
4614        });
4615        subEl.querySelectorAll(classesToSelector(params.totalClass)).forEach((totalEl) => {
4616          totalEl.textContent = params.formatFractionTotal(total);
4617        });
4618      }
4619      if (params.type === "progressbar") {
4620        let progressbarDirection;
4621        if (params.progressbarOpposite) {
4622          progressbarDirection = swiper.isHorizontal() ? "vertical" : "horizontal";
4623        } else {
4624          progressbarDirection = swiper.isHorizontal() ? "horizontal" : "vertical";
4625        }
4626        const scale = (current + 1) / total;
4627        let scaleX = 1;
4628        let scaleY = 1;
4629        if (progressbarDirection === "horizontal") {
4630          scaleX = scale;
4631        } else {
4632          scaleY = scale;
4633        }
4634        subEl.querySelectorAll(classesToSelector(params.progressbarFillClass)).forEach((progressEl) => {
4635          progressEl.style.transform = `translate3d(0,0,0) scaleX(${scaleX}) scaleY(${scaleY})`;
4636          progressEl.style.transitionDuration = `${swiper.params.speed}ms`;
4637        });
4638      }
4639      if (params.type === "custom" && params.renderCustom) {
4640        subEl.innerHTML = params.renderCustom(swiper, current + 1, total);
4641        if (subElIndex === 0)
4642          emit("paginationRender", subEl);
4643      } else {
4644        if (subElIndex === 0)
4645          emit("paginationRender", subEl);
4646        emit("paginationUpdate", subEl);
4647      }
4648      if (swiper.params.watchOverflow && swiper.enabled) {
4649        subEl.classList[swiper.isLocked ? "add" : "remove"](params.lockClass);
4650      }
4651    });
4652  }
4653  function render() {
4654    const params = swiper.params.pagination;
4655    if (isPaginationDisabled())
4656      return;
4657    const slidesLength = swiper.virtual && swiper.params.virtual.enabled ? swiper.virtual.slides.length : swiper.grid && swiper.params.grid.rows > 1 ? swiper.slides.length / Math.ceil(swiper.params.grid.rows) : swiper.slides.length;
4658    let el = swiper.pagination.el;
4659    el = makeElementsArray(el);
4660    let paginationHTML = "";
4661    if (params.type === "bullets") {
4662      let numberOfBullets = swiper.params.loop ? Math.ceil(slidesLength / swiper.params.slidesPerGroup) : swiper.snapGrid.length;
4663      if (swiper.params.freeMode && swiper.params.freeMode.enabled && numberOfBullets > slidesLength) {
4664        numberOfBullets = slidesLength;
4665      }
4666      for (let i = 0; i < numberOfBullets; i += 1) {
4667        if (params.renderBullet) {
4668          paginationHTML += params.renderBullet.call(swiper, i, params.bulletClass);
4669        } else {
4670          paginationHTML += `<${params.bulletElement} ${swiper.isElement ? 'part="bullet"' : ""} class="${params.bulletClass}"></${params.bulletElement}>`;
4671        }
4672      }
4673    }
4674    if (params.type === "fraction") {
4675      if (params.renderFraction) {
4676        paginationHTML = params.renderFraction.call(swiper, params.currentClass, params.totalClass);
4677      } else {
4678        paginationHTML = `<span class="${params.currentClass}"></span> / <span class="${params.totalClass}"></span>`;
4679      }
4680    }
4681    if (params.type === "progressbar") {
4682      if (params.renderProgressbar) {
4683        paginationHTML = params.renderProgressbar.call(swiper, params.progressbarFillClass);
4684      } else {
4685        paginationHTML = `<span class="${params.progressbarFillClass}"></span>`;
4686      }
4687    }
4688    swiper.pagination.bullets = [];
4689    el.forEach((subEl) => {
4690      if (params.type !== "custom") {
4691        subEl.innerHTML = paginationHTML || "";
4692      }
4693      if (params.type === "bullets") {
4694        swiper.pagination.bullets.push(...subEl.querySelectorAll(classesToSelector(params.bulletClass)));
4695      }
4696    });
4697    if (params.type !== "custom") {
4698      emit("paginationRender", el[0]);
4699    }
4700  }
4701  function init() {
4702    swiper.params.pagination = createElementIfNotDefined(swiper, swiper.originalParams.pagination, swiper.params.pagination, {
4703      el: "swiper-pagination"
4704    });
4705    const params = swiper.params.pagination;
4706    if (!params.el)
4707      return;
4708    let el;
4709    if (typeof params.el === "string" && swiper.isElement) {
4710      el = swiper.el.querySelector(params.el);
4711    }
4712    if (!el && typeof params.el === "string") {
4713      el = [...document.querySelectorAll(params.el)];
4714    }
4715    if (!el) {
4716      el = params.el;
4717    }
4718    if (!el || el.length === 0)
4719      return;
4720    if (swiper.params.uniqueNavElements && typeof params.el === "string" && Array.isArray(el) && el.length > 1) {
4721      el = [...swiper.el.querySelectorAll(params.el)];
4722      if (el.length > 1) {
4723        el = el.filter((subEl) => {
4724          if (elementParents(subEl, ".swiper")[0] !== swiper.el)
4725            return false;
4726          return true;
4727        })[0];
4728      }
4729    }
4730    if (Array.isArray(el) && el.length === 1)
4731      el = el[0];
4732    Object.assign(swiper.pagination, {
4733      el
4734    });
4735    el = makeElementsArray(el);
4736    el.forEach((subEl) => {
4737      if (params.type === "bullets" && params.clickable) {
4738        subEl.classList.add(...(params.clickableClass || "").split(" "));
4739      }
4740      subEl.classList.add(params.modifierClass + params.type);
4741      subEl.classList.add(swiper.isHorizontal() ? params.horizontalClass : params.verticalClass);
4742      if (params.type === "bullets" && params.dynamicBullets) {
4743        subEl.classList.add(`${params.modifierClass}${params.type}-dynamic`);
4744        dynamicBulletIndex = 0;
4745        if (params.dynamicMainBullets < 1) {
4746          params.dynamicMainBullets = 1;
4747        }
4748      }
4749      if (params.type === "progressbar" && params.progressbarOpposite) {
4750        subEl.classList.add(params.progressbarOppositeClass);
4751      }
4752      if (params.clickable) {
4753        subEl.addEventListener("click", onBulletClick);
4754      }
4755      if (!swiper.enabled) {
4756        subEl.classList.add(params.lockClass);
4757      }
4758    });
4759  }
4760  function destroy() {
4761    const params = swiper.params.pagination;
4762    if (isPaginationDisabled())
4763      return;
4764    let el = swiper.pagination.el;
4765    if (el) {
4766      el = makeElementsArray(el);
4767      el.forEach((subEl) => {
4768        subEl.classList.remove(params.hiddenClass);
4769        subEl.classList.remove(params.modifierClass + params.type);
4770        subEl.classList.remove(swiper.isHorizontal() ? params.horizontalClass : params.verticalClass);
4771        if (params.clickable) {
4772          subEl.classList.remove(...(params.clickableClass || "").split(" "));
4773          subEl.removeEventListener("click", onBulletClick);
4774        }
4775      });
4776    }
4777    if (swiper.pagination.bullets)
4778      swiper.pagination.bullets.forEach((subEl) => subEl.classList.remove(...params.bulletActiveClass.split(" ")));
4779  }
4780  on("changeDirection", () => {
4781    if (!swiper.pagination || !swiper.pagination.el)
4782      return;
4783    const params = swiper.params.pagination;
4784    let {
4785      el
4786    } = swiper.pagination;
4787    el = makeElementsArray(el);
4788    el.forEach((subEl) => {
4789      subEl.classList.remove(params.horizontalClass, params.verticalClass);
4790      subEl.classList.add(swiper.isHorizontal() ? params.horizontalClass : params.verticalClass);
4791    });
4792  });
4793  on("init", () => {
4794    if (swiper.params.pagination.enabled === false) {
4795      disable();
4796    } else {
4797      init();
4798      render();
4799      update2();
4800    }
4801  });
4802  on("activeIndexChange", () => {
4803    if (typeof swiper.snapIndex === "undefined") {
4804      update2();
4805    }
4806  });
4807  on("snapIndexChange", () => {
4808    update2();
4809  });
4810  on("snapGridLengthChange", () => {
4811    render();
4812    update2();
4813  });
4814  on("destroy", () => {
4815    destroy();
4816  });
4817  on("enable disable", () => {
4818    let {
4819      el
4820    } = swiper.pagination;
4821    if (el) {
4822      el = makeElementsArray(el);
4823      el.forEach((subEl) => subEl.classList[swiper.enabled ? "remove" : "add"](swiper.params.pagination.lockClass));
4824    }
4825  });
4826  on("lock unlock", () => {
4827    update2();
4828  });
4829  on("click", (_s, e) => {
4830    const targetEl = e.target;
4831    const el = makeElementsArray(swiper.pagination.el);
4832    if (swiper.params.pagination.el && swiper.params.pagination.hideOnClick && el && el.length > 0 && !targetEl.classList.contains(swiper.params.pagination.bulletClass)) {
4833      if (swiper.navigation && (swiper.navigation.nextEl && targetEl === swiper.navigation.nextEl || swiper.navigation.prevEl && targetEl === swiper.navigation.prevEl))
4834        return;
4835      const isHidden = el[0].classList.contains(swiper.params.pagination.hiddenClass);
4836      if (isHidden === true) {
4837        emit("paginationShow");
4838      } else {
4839        emit("paginationHide");
4840      }
4841      el.forEach((subEl) => subEl.classList.toggle(swiper.params.pagination.hiddenClass));
4842    }
4843  });
4844  const enable = () => {
4845    swiper.el.classList.remove(swiper.params.pagination.paginationDisabledClass);
4846    let {
4847      el
4848    } = swiper.pagination;
4849    if (el) {
4850      el = makeElementsArray(el);
4851      el.forEach((subEl) => subEl.classList.remove(swiper.params.pagination.paginationDisabledClass));
4852    }
4853    init();
4854    render();
4855    update2();
4856  };
4857  const disable = () => {
4858    swiper.el.classList.add(swiper.params.pagination.paginationDisabledClass);
4859    let {
4860      el
4861    } = swiper.pagination;
4862    if (el) {
4863      el = makeElementsArray(el);
4864      el.forEach((subEl) => subEl.classList.add(swiper.params.pagination.paginationDisabledClass));
4865    }
4866    destroy();
4867  };
4868  Object.assign(swiper.pagination, {
4869    enable,
4870    disable,
4871    render,
4872    update: update2,
4873    init,
4874    destroy
4875  });
4876}
4877function Autoplay(_ref) {
4878  let {
4879    swiper,
4880    extendParams,
4881    on,
4882    emit,
4883    params
4884  } = _ref;
4885  swiper.autoplay = {
4886    running: false,
4887    paused: false,
4888    timeLeft: 0
4889  };
4890  extendParams({
4891    autoplay: {
4892      enabled: false,
4893      delay: 3e3,
4894      waitForTransition: true,
4895      disableOnInteraction: false,
4896      stopOnLastSlide: false,
4897      reverseDirection: false,
4898      pauseOnMouseEnter: false
4899    }
4900  });
4901  let timeout;
4902  let raf;
4903  let autoplayDelayTotal = params && params.autoplay ? params.autoplay.delay : 3e3;
4904  let autoplayDelayCurrent = params && params.autoplay ? params.autoplay.delay : 3e3;
4905  let autoplayTimeLeft;
4906  let autoplayStartTime = (/* @__PURE__ */ new Date()).getTime();
4907  let wasPaused;
4908  let isTouched;
4909  let pausedByTouch;
4910  let touchStartTimeout;
4911  let slideChanged;
4912  let pausedByInteraction;
4913  let pausedByPointerEnter;
4914  function onTransitionEnd(e) {
4915    if (!swiper || swiper.destroyed || !swiper.wrapperEl)
4916      return;
4917    if (e.target !== swiper.wrapperEl)
4918      return;
4919    swiper.wrapperEl.removeEventListener("transitionend", onTransitionEnd);
4920    if (pausedByPointerEnter) {
4921      return;
4922    }
4923    resume();
4924  }
4925  const calcTimeLeft = () => {
4926    if (swiper.destroyed || !swiper.autoplay.running)
4927      return;
4928    if (swiper.autoplay.paused) {
4929      wasPaused = true;
4930    } else if (wasPaused) {
4931      autoplayDelayCurrent = autoplayTimeLeft;
4932      wasPaused = false;
4933    }
4934    const timeLeft = swiper.autoplay.paused ? autoplayTimeLeft : autoplayStartTime + autoplayDelayCurrent - (/* @__PURE__ */ new Date()).getTime();
4935    swiper.autoplay.timeLeft = timeLeft;
4936    emit("autoplayTimeLeft", timeLeft, timeLeft / autoplayDelayTotal);
4937    raf = requestAnimationFrame(() => {
4938      calcTimeLeft();
4939    });
4940  };
4941  const getSlideDelay = () => {
4942    let activeSlideEl;
4943    if (swiper.virtual && swiper.params.virtual.enabled) {
4944      activeSlideEl = swiper.slides.filter((slideEl) => slideEl.classList.contains("swiper-slide-active"))[0];
4945    } else {
4946      activeSlideEl = swiper.slides[swiper.activeIndex];
4947    }
4948    if (!activeSlideEl)
4949      return void 0;
4950    const currentSlideDelay = parseInt(activeSlideEl.getAttribute("data-swiper-autoplay"), 10);
4951    return currentSlideDelay;
4952  };
4953  const run = (delayForce) => {
4954    if (swiper.destroyed || !swiper.autoplay.running)
4955      return;
4956    cancelAnimationFrame(raf);
4957    calcTimeLeft();
4958    let delay = typeof delayForce === "undefined" ? swiper.params.autoplay.delay : delayForce;
4959    autoplayDelayTotal = swiper.params.autoplay.delay;
4960    autoplayDelayCurrent = swiper.params.autoplay.delay;
4961    const currentSlideDelay = getSlideDelay();
4962    if (!Number.isNaN(currentSlideDelay) && currentSlideDelay > 0 && typeof delayForce === "undefined") {
4963      delay = currentSlideDelay;
4964      autoplayDelayTotal = currentSlideDelay;
4965      autoplayDelayCurrent = currentSlideDelay;
4966    }
4967    autoplayTimeLeft = delay;
4968    const speed = swiper.params.speed;
4969    const proceed = () => {
4970      if (!swiper || swiper.destroyed)
4971        return;
4972      if (swiper.params.autoplay.reverseDirection) {
4973        if (!swiper.isBeginning || swiper.params.loop || swiper.params.rewind) {
4974          swiper.slidePrev(speed, true, true);
4975          emit("autoplay");
4976        } else if (!swiper.params.autoplay.stopOnLastSlide) {
4977          swiper.slideTo(swiper.slides.length - 1, speed, true, true);
4978          emit("autoplay");
4979        }
4980      } else {
4981        if (!swiper.isEnd || swiper.params.loop || swiper.params.rewind) {
4982          swiper.slideNext(speed, true, true);
4983          emit("autoplay");
4984        } else if (!swiper.params.autoplay.stopOnLastSlide) {
4985          swiper.slideTo(0, speed, true, true);
4986          emit("autoplay");
4987        }
4988      }
4989      if (swiper.params.cssMode) {
4990        autoplayStartTime = (/* @__PURE__ */ new Date()).getTime();
4991        requestAnimationFrame(() => {
4992          run();
4993        });
4994      }
4995    };
4996    if (delay > 0) {
4997      clearTimeout(timeout);
4998      timeout = setTimeout(() => {
4999        proceed();
5000      }, delay);
5001    } else {
5002      requestAnimationFrame(() => {
5003        proceed();
5004      });
5005    }
5006    return delay;
5007  };
5008  const start = () => {
5009    autoplayStartTime = (/* @__PURE__ */ new Date()).getTime();
5010    swiper.autoplay.running = true;
5011    run();
5012    emit("autoplayStart");
5013  };
5014  const stop = () => {
5015    swiper.autoplay.running = false;
5016    clearTimeout(timeout);
5017    cancelAnimationFrame(raf);
5018    emit("autoplayStop");
5019  };
5020  const pause = (internal, reset) => {
5021    if (swiper.destroyed || !swiper.autoplay.running)
5022      return;
5023    clearTimeout(timeout);
5024    if (!internal) {
5025      pausedByInteraction = true;
5026    }
5027    const proceed = () => {
5028      emit("autoplayPause");
5029      if (swiper.params.autoplay.waitForTransition) {
5030        swiper.wrapperEl.addEventListener("transitionend", onTransitionEnd);
5031      } else {
5032        resume();
5033      }
5034    };
5035    swiper.autoplay.paused = true;
5036    if (reset) {
5037      if (slideChanged) {
5038        autoplayTimeLeft = swiper.params.autoplay.delay;
5039      }
5040      slideChanged = false;
5041      proceed();
5042      return;
5043    }
5044    const delay = autoplayTimeLeft || swiper.params.autoplay.delay;
5045    autoplayTimeLeft = delay - ((/* @__PURE__ */ new Date()).getTime() - autoplayStartTime);
5046    if (swiper.isEnd && autoplayTimeLeft < 0 && !swiper.params.loop)
5047      return;
5048    if (autoplayTimeLeft < 0)
5049      autoplayTimeLeft = 0;
5050    proceed();
5051  };
5052  const resume = () => {
5053    if (swiper.isEnd && autoplayTimeLeft < 0 && !swiper.params.loop || swiper.destroyed || !swiper.autoplay.running)
5054      return;
5055    autoplayStartTime = (/* @__PURE__ */ new Date()).getTime();
5056    if (pausedByInteraction) {
5057      pausedByInteraction = false;
5058      run(autoplayTimeLeft);
5059    } else {
5060      run();
5061    }
5062    swiper.autoplay.paused = false;
5063    emit("autoplayResume");
5064  };
5065  const onVisibilityChange = () => {
5066    if (swiper.destroyed || !swiper.autoplay.running)
5067      return;
5068    const document2 = getDocument();
5069    if (document2.visibilityState === "hidden") {
5070      pausedByInteraction = true;
5071      pause(true);
5072    }
5073    if (document2.visibilityState === "visible") {
5074      resume();
5075    }
5076  };
5077  const onPointerEnter = (e) => {
5078    if (e.pointerType !== "mouse")
5079      return;
5080    pausedByInteraction = true;
5081    pausedByPointerEnter = true;
5082    if (swiper.animating || swiper.autoplay.paused)
5083      return;
5084    pause(true);
5085  };
5086  const onPointerLeave = (e) => {
5087    if (e.pointerType !== "mouse")
5088      return;
5089    pausedByPointerEnter = false;
5090    if (swiper.autoplay.paused) {
5091      resume();
5092    }
5093  };
5094  const attachMouseEvents = () => {
5095    if (swiper.params.autoplay.pauseOnMouseEnter) {
5096      swiper.el.addEventListener("pointerenter", onPointerEnter);
5097      swiper.el.addEventListener("pointerleave", onPointerLeave);
5098    }
5099  };
5100  const detachMouseEvents = () => {
5101    swiper.el.removeEventListener("pointerenter", onPointerEnter);
5102    swiper.el.removeEventListener("pointerleave", onPointerLeave);
5103  };
5104  const attachDocumentEvents = () => {
5105    const document2 = getDocument();
5106    document2.addEventListener("visibilitychange", onVisibilityChange);
5107  };
5108  const detachDocumentEvents = () => {
5109    const document2 = getDocument();
5110    document2.removeEventListener("visibilitychange", onVisibilityChange);
5111  };
5112  on("init", () => {
5113    if (swiper.params.autoplay.enabled) {
5114      attachMouseEvents();
5115      attachDocumentEvents();
5116      start();
5117    }
5118  });
5119  on("destroy", () => {
5120    detachMouseEvents();
5121    detachDocumentEvents();
5122    if (swiper.autoplay.running) {
5123      stop();
5124    }
5125  });
5126  on("_freeModeStaticRelease", () => {
5127    if (pausedByTouch || pausedByInteraction) {
5128      resume();
5129    }
5130  });
5131  on("_freeModeNoMomentumRelease", () => {
5132    if (!swiper.params.autoplay.disableOnInteraction) {
5133      pause(true, true);
5134    } else {
5135      stop();
5136    }
5137  });
5138  on("beforeTransitionStart", (_s, speed, internal) => {
5139    if (swiper.destroyed || !swiper.autoplay.running)
5140      return;
5141    if (internal || !swiper.params.autoplay.disableOnInteraction) {
5142      pause(true, true);
5143    } else {
5144      stop();
5145    }
5146  });
5147  on("sliderFirstMove", () => {
5148    if (swiper.destroyed || !swiper.autoplay.running)
5149      return;
5150    if (swiper.params.autoplay.disableOnInteraction) {
5151      stop();
5152      return;
5153    }
5154    isTouched = true;
5155    pausedByTouch = false;
5156    pausedByInteraction = false;
5157    touchStartTimeout = setTimeout(() => {
5158      pausedByInteraction = true;
5159      pausedByTouch = true;
5160      pause(true);
5161    }, 200);
5162  });
5163  on("touchEnd", () => {
5164    if (swiper.destroyed || !swiper.autoplay.running || !isTouched)
5165      return;
5166    clearTimeout(touchStartTimeout);
5167    clearTimeout(timeout);
5168    if (swiper.params.autoplay.disableOnInteraction) {
5169      pausedByTouch = false;
5170      isTouched = false;
5171      return;
5172    }
5173    if (pausedByTouch && swiper.params.cssMode)
5174      resume();
5175    pausedByTouch = false;
5176    isTouched = false;
5177  });
5178  on("slideChange", () => {
5179    if (swiper.destroyed || !swiper.autoplay.running)
5180      return;
5181    slideChanged = true;
5182  });
5183  Object.assign(swiper.autoplay, {
5184    start,
5185    stop,
5186    pause,
5187    resume
5188  });
5189}
5190export {
5191  Autoplay as A,
5192  Navigation as N,
5193  Pagination as P,
5194  Swiper as S
5195};
5196//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0b3BsYXktZTk5MmIyZTYuanMiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9zd2lwZXIvc2hhcmVkL3Nzci13aW5kb3cuZXNtLm1qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9zd2lwZXIvc2hhcmVkL3V0aWxzLm1qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9zd2lwZXIvc2hhcmVkL3N3aXBlci1jb3JlLm1qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9zd2lwZXIvc2hhcmVkL2NyZWF0ZS1lbGVtZW50LWlmLW5vdC1kZWZpbmVkLm1qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9zd2lwZXIvbW9kdWxlcy9uYXZpZ2F0aW9uLm1qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9zd2lwZXIvc2hhcmVkL2NsYXNzZXMtdG8tc2VsZWN0b3IubWpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N3aXBlci9tb2R1bGVzL3BhZ2luYX
5196Rpb24ubWpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N3aXBlci9tb2R1bGVzL2F1dG9wbGF5Lm1qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFNTUiBXaW5kb3cgNC4wLjJcbiAqIEJldHRlciBoYW5kbGluZyBmb3Igd2luZG93IG9iamVjdCBpbiBTU1IgZW52aXJvbm1lbnRcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9ub2xpbWl0czR3ZWIvc3NyLXdpbmRvd1xuICpcbiAqIENvcHlyaWdodCAyMDIxLCBWbGFkaW1pciBLaGFybGFtcGlkaVxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIE1JVFxuICpcbiAqIFJlbGVhc2VkIG9uOiBEZWNlbWJlciAxMywgMjAyMVxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBuby1wYXJhbS1yZWFzc2lnbiAqL1xuZnVuY3Rpb24gaXNPYmplY3Qob2JqKSB7XG4gIHJldHVybiBvYmogIT09IG51bGwgJiYgdHlwZW9mIG9iaiA9PT0gJ29iamVjdCcgJiYgJ2NvbnN0cnVjdG9yJyBpbiBvYmogJiYgb2JqLmNvbnN0cnVjdG9yID09PSBPYmplY3Q7XG59XG5mdW5jdGlvbiBleHRlbmQodGFyZ2V0LCBzcmMpIHtcbiAgaWYgKHRhcmdldCA9PT0gdm9pZCAwKSB7XG4gICAgdGFyZ2V0ID0ge307XG4gIH1cbiAgaWYgKHNyYyA9PT0gdm9pZCAwKSB7XG4gICAgc3JjID0ge307XG4gIH1cbiAgT2JqZWN0LmtleXMoc3JjKS5mb3JFYWNoKGtleSA9PiB7XG4gICAgaWYgKHR5cGVvZiB0YXJnZXRba2V5XSA9PT0gJ3VuZGVmaW5lZCcpIHRhcmdldFtrZXldID0gc3JjW2tleV07ZWxzZSBpZiAoaXNPYmplY3Qoc3JjW2tleV0pICYmIGlzT2JqZWN0KHRhcmdldFtrZXldKSAmJiBPYmplY3Qua2V5cyhzcmNba2V5XSkubGVuZ3RoID4gMCkge1xuICAgICAgZXh0ZW5kKHRhcmdldFtrZXldLCBzcmNba2V5XSk7XG4gICAgfVxuICB9KTtcbn1cbmNvbnN0IHNzckRvY3VtZW50ID0ge1xuICBib2R5OiB7fSxcbiAgYWRkRXZlbnRMaXN0ZW5lcigpIHt9LFxuICByZW1vdmVFdmVudExpc3RlbmVyKCkge30sXG4gIGFjdGl2ZUVsZW1lbnQ6IHtcbiAgICBibHVyKCkge30sXG4gICAgbm9kZU5hbWU6ICcnXG4gIH0sXG4gIHF1ZXJ5U2VsZWN0b3IoKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH0sXG4gIHF1ZXJ5U2VsZWN0b3JBbGwoKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9LFxuICBnZXRFbGVtZW50QnlJZCgpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfSxcbiAgY3JlYXRlRXZlbnQoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGluaXRFdmVudCgpIHt9XG4gICAgfTtcbiAgfSxcbiAgY3JlYXRlRWxlbWVudCgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgY2hpbGRyZW46IFtdLFxuICAgICAgY2hpbGROb2RlczogW10sXG4gICAgICBzdHlsZToge30sXG4gICAgICBzZXRBdHRyaWJ1dGUoKSB7fSxcbiAgICAgIGdldEVsZW1lbnRzQnlUYWdOYW1lKCkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG4gICAgfTtcbiAgfSxcbiAgY3JlYXRlRWxlbWVudE5TKCkge1xuICAgIHJldHVybiB7fTtcbiAgfSxcbiAgaW1wb3J0Tm9kZSgpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfSxcbiAgbG9jYXRpb246IHtcbiAgICBoYXNoOiAnJyxcbiAgICBob3N0OiAnJyxcbiAgICBob3N0bmFtZTogJycsXG4gICAgaHJlZjogJycsXG4gICAgb3JpZ2luOiAnJyxcbiAgICBwYXRobmFtZTogJycsXG4gICAgcHJvdG9jb2w6ICcnLFxuICAgIHNlYXJjaDogJydcbiAgfVxufTtcbmZ1bmN0aW9uIGdldERvY3VtZW50KCkge1xuICBjb25zdCBkb2MgPSB0eXBlb2YgZG9jdW1lbnQgIT09ICd1bmRlZmluZWQnID8gZG9jdW1lbnQgOiB7fTtcbiAgZXh0ZW5kKGRvYywgc3NyRG9jdW1lbnQpO1xuICByZXR1cm4gZG9jO1xufVxuY29uc3Qgc3NyV2luZG93ID0ge1xuICBkb2N1bWVudDogc3NyRG9jdW1lbnQsXG4gIG5hdmlnYXRvcjoge1xuICAgIHVzZXJBZ2VudDogJydcbiAgfSxcbiAgbG9jYXRpb246IHtcbiAgICBoYXNoOiAnJyxcbiAgICBob3N0OiAnJyxcbiAgICBob3N0bmFtZTogJycsXG4gICAgaHJlZjogJycsXG4gICAgb3JpZ2luOiAnJyxcbiAgICBwYXRobmFtZTogJycsXG4gICAgcHJvdG9jb2w6ICcnLFxuICAgIHNlYXJjaDogJydcbiAgfSxcbiAgaGlzdG9yeToge1xuICAgIHJlcGxhY2VTdGF0ZSgpIHt9LFxuICAgIHB1c2hTdGF0ZSgpIHt9LFxuICAgIGdvKCkge30sXG4gICAgYmFjaygpIHt9XG4gIH0sXG4gIEN1c3RvbUV2ZW50OiBmdW5jdGlvbiBDdXN0b21FdmVudCgpIHtcbiAgICByZXR1cm4gdGhpcztcbiAgfSxcbiAgYWRkRXZlbnRMaXN0ZW5lcigpIHt9LFxuICByZW1vdmVFdmVudExpc3RlbmVyKCkge30sXG4gIGdldENvbXB1dGVkU3R5bGUoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGdldFByb3BlcnR5VmFsdWUoKSB7XG4gICAgICAgIHJldHVybiAnJztcbiAgICAgIH1cbiAgICB9O1xuICB9LFxuICBJbWFnZSgpIHt9LFxuICBEYXRlKCkge30sXG4gIHNjcmVlbjoge30sXG4gIHNldFRpbWVvdXQoKSB7fSxcbiAgY2xlYXJUaW1lb3V0KCkge30sXG4gIG1hdGNoTWVkaWEoKSB7XG4gICAgcmV0dXJuIHt9O1xuICB9LFxuICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoY2FsbGJhY2spIHtcbiAgICBpZiAodHlwZW9mIHNldFRpbWVvdXQgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBjYWxsYmFjaygpO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHJldHVybiBzZXRUaW1lb3V0KGNhbGxiYWNrLCAwKTtcbiAgfSxcbiAgY2FuY2VsQW5pbWF0aW9uRnJhbWUoaWQpIHtcbiAgICBpZiAodHlwZW9mIHNldFRpbWVvdXQgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNsZWFyVGltZW91dChpZCk7XG4gIH1cbn07XG5mdW5jdGlvbiBnZXRXaW5kb3coKSB7XG4gIGNvbnN0IHdpbiA9IHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnID8gd2luZG93IDoge307XG4gIGV4dGVuZCh3aW4sIHNzcldpbmRvdyk7XG4gIHJldHVybiB3aW47XG59XG5cbmV4cG9ydCB7IGdldFdpbmRvdyBhcyBhLCBnZXREb2N1bWVudCBhcyBnIH07XG4iLCJpbXBvcnQgeyBhIGFzIGdldFdpbmRvdywgZyBhcyBnZXREb2N1bWVudCB9IGZyb20gJy4vc3NyLXdpbmRvdy5lc20ubWpzJztcblxuZnVuY3Rpb24gY2xhc3Nlc1RvVG9rZW5zKGNsYXNzZXMpIHtcbiAgaWYgKGNsYXNzZXMgPT09IHZvaWQgMCkge1xuICAgIGNsYXNzZXMgPSAnJztcbiAgfVxuICByZXR1cm4gY2xhc3Nlcy50cmltKCkuc3BsaXQoJyAnKS5maWx0ZXIoYyA9PiAhIWMudHJpbSgpKTtcbn1cblxuZnVuY3Rpb24gZGVsZXRlUHJvcHMob2JqKSB7XG4gIGNvbnN0IG9iamVjdCA9IG9iajtcbiAgT2JqZWN0LmtleXMob2JqZWN0KS5mb3JFYWNoKGtleSA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIG9iamVjdFtrZXldID0gbnVsbDtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAvLyBubyBnZXR0ZXIgZm9yIG9iamVjdFxuICAgIH1cbiAgICB0cnkge1xuICAgICAgZGVsZXRlIG9iamVjdFtrZXldO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIC8vIHNvbWV0aGluZyBnb3Qgd3JvbmdcbiAgICB9XG4gI
5196H0pO1xufVxuZnVuY3Rpb24gbmV4dFRpY2soY2FsbGJhY2ssIGRlbGF5KSB7XG4gIGlmIChkZWxheSA9PT0gdm9pZCAwKSB7XG4gICAgZGVsYXkgPSAwO1xuICB9XG4gIHJldHVybiBzZXRUaW1lb3V0KGNhbGxiYWNrLCBkZWxheSk7XG59XG5mdW5jdGlvbiBub3coKSB7XG4gIHJldHVybiBEYXRlLm5vdygpO1xufVxuZnVuY3Rpb24gZ2V0Q29tcHV0ZWRTdHlsZShlbCkge1xuICBjb25zdCB3aW5kb3cgPSBnZXRXaW5kb3coKTtcbiAgbGV0IHN0eWxlO1xuICBpZiAod2luZG93LmdldENvbXB1dGVkU3R5bGUpIHtcbiAgICBzdHlsZSA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGVsLCBudWxsKTtcbiAgfVxuICBpZiAoIXN0eWxlICYmIGVsLmN1cnJlbnRTdHlsZSkge1xuICAgIHN0eWxlID0gZWwuY3VycmVudFN0eWxlO1xuICB9XG4gIGlmICghc3R5bGUpIHtcbiAgICBzdHlsZSA9IGVsLnN0eWxlO1xuICB9XG4gIHJldHVybiBzdHlsZTtcbn1cbmZ1bmN0aW9uIGdldFRyYW5zbGF0ZShlbCwgYXhpcykge1xuICBpZiAoYXhpcyA9PT0gdm9pZCAwKSB7XG4gICAgYXhpcyA9ICd4JztcbiAgfVxuICBjb25zdCB3aW5kb3cgPSBnZXRXaW5kb3coKTtcbiAgbGV0IG1hdHJpeDtcbiAgbGV0IGN1clRyYW5zZm9ybTtcbiAgbGV0IHRyYW5zZm9ybU1hdHJpeDtcbiAgY29uc3QgY3VyU3R5bGUgPSBnZXRDb21wdXRlZFN0eWxlKGVsKTtcbiAgaWYgKHdpbmRvdy5XZWJLaXRDU1NNYXRyaXgpIHtcbiAgICBjdXJUcmFuc2Zvcm0gPSBjdXJTdHlsZS50cmFuc2Zvcm0gfHwgY3VyU3R5bGUud2Via2l0VHJhbnNmb3JtO1xuICAgIGlmIChjdXJUcmFuc2Zvcm0uc3BsaXQoJywnKS5sZW5ndGggPiA2KSB7XG4gICAgICBjdXJUcmFuc2Zvcm0gPSBjdXJUcmFuc2Zvcm0uc3BsaXQoJywgJykubWFwKGEgPT4gYS5yZXBsYWNlKCcsJywgJy4nKSkuam9pbignLCAnKTtcbiAgICB9XG4gICAgLy8gU29tZSBvbGQgdmVyc2lvbnMgb2YgV2Via2l0IGNob2tlIHdoZW4gJ25vbmUnIGlzIHBhc3NlZDsgcGFzc1xuICAgIC8vIGVtcHR5IHN0cmluZyBpbnN0ZWFkIGluIHRoaXMgY2FzZVxuICAgIHRyYW5zZm9ybU1hdHJpeCA9IG5ldyB3aW5kb3cuV2ViS2l0Q1NTTWF0cml4KGN1clRyYW5zZm9ybSA9PT0gJ25vbmUnID8gJycgOiBjdXJUcmFuc2Zvcm0pO1xuICB9IGVsc2Uge1xuICAgIHRyYW5zZm9ybU1hdHJpeCA9IGN1clN0eWxlLk1velRyYW5zZm9ybSB8fCBjdXJTdHlsZS5PVHJhbnNmb3JtIHx8IGN1clN0eWxlLk1zVHJhbnNmb3JtIHx8IGN1clN0eWxlLm1zVHJhbnNmb3JtIHx8IGN1clN0eWxlLnRyYW5zZm9ybSB8fCBjdXJTdHlsZS5nZXRQcm9wZXJ0eVZhbHVlKCd0cmFuc2Zvcm0nKS5yZXBsYWNlKCd0cmFuc2xhdGUoJywgJ21hdHJpeCgxLCAwLCAwLCAxLCcpO1xuICAgIG1hdHJpeCA9IHRyYW5zZm9ybU1hdHJpeC50b1N0cmluZygpLnNwbGl0KCcsJyk7XG4gIH1cbiAgaWYgKGF4aXMgPT09ICd4Jykge1xuICAgIC8vIExhdGVzdCBDaHJvbWUgYW5kIHdlYmtpdHMgRml4XG4gICAgaWYgKHdpbmRvdy5XZWJLaXRDU1NNYXRyaXgpIGN1clRyYW5zZm9ybSA9IHRyYW5zZm9ybU1hdHJpeC5tNDE7XG4gICAgLy8gQ3JhenkgSUUxMCBNYXRyaXhcbiAgICBlbHNlIGlmIChtYXRyaXgubGVuZ3RoID09PSAxNikgY3VyVHJhbnNmb3JtID0gcGFyc2VGbG9hdChtYXRyaXhbMTJdKTtcbiAgICAvLyBOb3JtYWwgQnJvd3NlcnNcbiAgICBlbHNlIGN1clRyYW5zZm9ybSA9IHBhcnNlRmxvYXQobWF0cml4WzRdKTtcbiAgfVxuICBpZiAoYXhpcyA9PT0gJ3knKSB7XG4gICAgLy8gTGF0ZXN0IENocm9tZSBhbmQgd2Via2l0cyBGaXhcbiAgICBpZiAod2luZG93LldlYktpdENTU01hdHJpeCkgY3VyVHJhbnNmb3JtID0gdHJhbnNmb3JtTWF0cml4Lm00MjtcbiAgICAvLyBDcmF6eSBJRTEwIE1hdHJpeFxuICAgIGVsc2UgaWYgKG1hdHJpeC5sZW5ndGggPT09IDE2KSBjdXJUcmFuc2Zvcm0gPSBwYXJzZUZsb2F0KG1hdHJpeFsxM10pO1xuICAgIC8vIE5vcm1hbCBCcm93c2Vyc1xuICAgIGVsc2UgY3VyVHJhbnNmb3JtID0gcGFyc2VGbG9hdChtYXRyaXhbNV0pO1xuICB9XG4gIHJldHVybiBjdXJUcmFuc2Zvcm0gfHwgMDtcbn1cbmZ1bmN0aW9uIGlzT2JqZWN0KG8pIHtcbiAgcmV0dXJuIHR5cGVvZiBvID09PSAnb2JqZWN0JyAmJiBvICE9PSBudWxsICYmIG8uY29uc3RydWN0b3IgJiYgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG8pLnNsaWNlKDgsIC0xKSA9PT0gJ09iamVjdCc7XG59XG5mdW5jdGlvbiBpc05vZGUobm9kZSkge1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmVcbiAgaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiB3aW5kb3cuSFRNTEVsZW1lbnQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgcmV0dXJuIG5vZGUgaW5zdGFuY2VvZiBIVE1MRWxlbWVudDtcbiAgfVxuICByZXR1cm4gbm9kZSAmJiAobm9kZS5ub2RlVHlwZSA9PT0gMSB8fCBub2RlLm5vZGVUeXBlID09PSAxMSk7XG59XG5mdW5jdGlvbiBleHRlbmQoKSB7XG4gIGNvbnN0IHRvID0gT2JqZWN0KGFyZ3VtZW50cy5sZW5ndGggPD0gMCA/IHVuZGVmaW5lZCA6IGFyZ3VtZW50c1swXSk7XG4gIGNvbnN0IG5vRXh0ZW5kID0gWydfX3Byb3RvX18nLCAnY29uc3RydWN0b3InLCAncHJvdG90eXBlJ107XG4gIGZvciAobGV0IGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgY29uc3QgbmV4dFNvdXJjZSA9IGkgPCAwIHx8IGFyZ3VtZW50cy5sZW5ndGggPD0gaSA/IHVuZGVmaW5lZCA6IGFyZ3VtZW50c1tpXTtcbiAgICBpZiAobmV4dFNvdXJjZSAhPT0gdW5kZWZpbmVkICYmIG5leHRTb3VyY2UgIT09IG51bGwgJiYgIWlzTm9kZShuZXh0U291cmNlKSkge1xuICAgICAgY29uc3Qga2V5c0FycmF5ID0gT2JqZWN0LmtleXMoT2JqZWN0KG5leHRTb3VyY2UpKS5maWx0ZXIoa2V5ID0+IG5vRXh0ZW5kLmluZGV4T2Yoa2V5KSA8IDApO1xuICAgICAgZm9yIChsZXQgbmV4dEluZGV4ID0gMCwgbGVuID0ga2V5c0FycmF5Lmxlbmd0aDsgbmV4dEluZGV4IDwgbGVuOyBuZXh0SW5kZXggKz0gMSkge1xuICAgICAgICBjb25zdCBuZXh0S2V5ID0ga2V5c0FycmF
51965W25leHRJbmRleF07XG4gICAgICAgIGNvbnN0IGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG5leHRTb3VyY2UsIG5leHRLZXkpO1xuICAgICAgICBpZiAoZGVzYyAhPT0gdW5kZWZpbmVkICYmIGRlc2MuZW51bWVyYWJsZSkge1xuICAgICAgICAgIGlmIChpc09iamVjdCh0b1tuZXh0S2V5XSkgJiYgaXNPYmplY3QobmV4dFNvdXJjZVtuZXh0S2V5XSkpIHtcbiAgICAgICAgICAgIGlmIChuZXh0U291cmNlW25leHRLZXldLl9fc3dpcGVyX18pIHtcbiAgICAgICAgICAgICAgdG9bbmV4dEtleV0gPSBuZXh0U291cmNlW25leHRLZXldO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgZXh0ZW5kKHRvW25leHRLZXldLCBuZXh0U291cmNlW25leHRLZXldKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2UgaWYgKCFpc09iamVjdCh0b1tuZXh0S2V5XSkgJiYgaXNPYmplY3QobmV4dFNvdXJjZVtuZXh0S2V5XSkpIHtcbiAgICAgICAgICAgIHRvW25leHRLZXldID0ge307XG4gICAgICAgICAgICBpZiAobmV4dFNvdXJjZVtuZXh0S2V5XS5fX3N3aXBlcl9fKSB7XG4gICAgICAgICAgICAgIHRvW25leHRLZXldID0gbmV4dFNvdXJjZVtuZXh0S2V5XTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGV4dGVuZCh0b1tuZXh0S2V5XSwgbmV4dFNvdXJjZVtuZXh0S2V5XSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRvW25leHRLZXldID0gbmV4dFNvdXJjZVtuZXh0S2V5XTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRvO1xufVxuZnVuY3Rpb24gc2V0Q1NTUHJvcGVydHkoZWwsIHZhck5hbWUsIHZhclZhbHVlKSB7XG4gIGVsLnN0eWxlLnNldFByb3BlcnR5KHZhck5hbWUsIHZhclZhbHVlKTtcbn1cbmZ1bmN0aW9uIGFuaW1hdGVDU1NNb2RlU2Nyb2xsKF9yZWYpIHtcbiAgbGV0IHtcbiAgICBzd2lwZXIsXG4gICAgdGFyZ2V0UG9zaXRpb24sXG4gICAgc2lkZVxuICB9ID0gX3JlZjtcbiAgY29uc3Qgd2luZG93ID0gZ2V0V2luZG93KCk7XG4gIGNvbnN0IHN0YXJ0UG9zaXRpb24gPSAtc3dpcGVyLnRyYW5zbGF0ZTtcbiAgbGV0IHN0YXJ0VGltZSA9IG51bGw7XG4gIGxldCB0aW1lO1xuICBjb25zdCBkdXJhdGlvbiA9IHN3aXBlci5wYXJhbXMuc3BlZWQ7XG4gIHN3aXBlci53cmFwcGVyRWwuc3R5bGUuc2Nyb2xsU25hcFR5cGUgPSAnbm9uZSc7XG4gIHdpbmRvdy5jYW5jZWxBbmltYXRpb25GcmFtZShzd2lwZXIuY3NzTW9kZUZyYW1lSUQpO1xuICBjb25zdCBkaXIgPSB0YXJnZXRQb3NpdGlvbiA+IHN0YXJ0UG9zaXRpb24gPyAnbmV4dCcgOiAncHJldic7XG4gIGNvbnN0IGlzT3V0T2ZCb3VuZCA9IChjdXJyZW50LCB0YXJnZXQpID0+IHtcbiAgICByZXR1cm4gZGlyID09PSAnbmV4dCcgJiYgY3VycmVudCA+PSB0YXJnZXQgfHwgZGlyID09PSAncHJldicgJiYgY3VycmVudCA8PSB0YXJnZXQ7XG4gIH07XG4gIGNvbnN0IGFuaW1hdGUgPSAoKSA9PiB7XG4gICAgdGltZSA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xuICAgIGlmIChzdGFydFRpbWUgPT09IG51bGwpIHtcbiAgICAgIHN0YXJ0VGltZSA9IHRpbWU7XG4gICAgfVxuICAgIGNvbnN0IHByb2dyZXNzID0gTWF0aC5tYXgoTWF0aC5taW4oKHRpbWUgLSBzdGFydFRpbWUpIC8gZHVyYXRpb24sIDEpLCAwKTtcbiAgICBjb25zdCBlYXNlUHJvZ3Jlc3MgPSAwLjUgLSBNYXRoLmNvcyhwcm9ncmVzcyAqIE1hdGguUEkpIC8gMjtcbiAgICBsZXQgY3VycmVudFBvc2l0aW9uID0gc3RhcnRQb3NpdGlvbiArIGVhc2VQcm9ncmVzcyAqICh0YXJnZXRQb3NpdGlvbiAtIHN0YXJ0UG9zaXRpb24pO1xuICAgIGlmIChpc091dE9mQm91bmQoY3VycmVudFBvc2l0aW9uLCB0YXJnZXRQb3NpdGlvbikpIHtcbiAgICAgIGN1cnJlbnRQb3NpdGlvbiA9IHRhcmdldFBvc2l0aW9uO1xuICAgIH1cbiAgICBzd2lwZXIud3JhcHBlckVsLnNjcm9sbFRvKHtcbiAgICAgIFtzaWRlXTogY3VycmVudFBvc2l0aW9uXG4gICAgfSk7XG4gICAgaWYgKGlzT3V0T2ZCb3VuZChjdXJyZW50UG9zaXRpb24sIHRhcmdldFBvc2l0aW9uKSkge1xuICAgICAgc3dpcGVyLndyYXBwZXJFbC5zdHlsZS5vdmVyZmxvdyA9ICdoaWRkZW4nO1xuICAgICAgc3dpcGVyLndyYXBwZXJFbC5zdHlsZS5zY3JvbGxTbmFwVHlwZSA9ICcnO1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHN3aXBlci53cmFwcGVyRWwuc3R5bGUub3ZlcmZsb3cgPSAnJztcbiAgICAgICAgc3dpcGVyLndyYXBwZXJFbC5zY3JvbGxUbyh7XG4gICAgICAgICAgW3NpZGVdOiBjdXJyZW50UG9zaXRpb25cbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICAgIHdpbmRvdy5jYW5jZWxBbmltYXRpb25GcmFtZShzd2lwZXIuY3NzTW9kZUZyYW1lSUQpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBzd2lwZXIuY3NzTW9kZUZyYW1lSUQgPSB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKGFuaW1hdGUpO1xuICB9O1xuICBhbmltYXRlKCk7XG59XG5mdW5jdGlvbiBnZXRTbGlkZVRyYW5zZm9ybUVsKHNsaWRlRWwpIHtcbiAgcmV0dXJuIHNsaWRlRWwucXVlcnlTZWxlY3RvcignLnN3aXBlci1zbGlkZS10cmFuc2Zvcm0nKSB8fCBzbGlkZUVsLnNoYWRvd1Jvb3QgJiYgc2xpZGVFbC5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3IoJy5zd2lwZXItc2xpZGUtdHJhbnNmb3JtJykgfHwgc2xpZGVFbDtcbn1cbmZ1bmN0aW9uIGVsZW1lbnRDaGlsZHJlbihlbGVtZW50LCBzZWxlY3Rvcikge1xuICBpZiAoc2VsZWN0b3IgPT09IHZvaWQgMCkge1xuICAgIHNlbGVjdG9yID0gJyc7XG4gIH1cbiAgcmV0dXJuIFsuLi5lbGVtZW50LmNoaWxkcmVuXS5maWx0ZXIoZWwgPT4gZWwubWF0Y2hlcyhzZWxlY3RvcikpO1xufVxuZnVuY3Rpb24gc2hvd1dhcm5pbmcodGV4dCkge1xuICB0cnkge1xuICAgIGNvbnNvbGUud2Fybih0ZXh0KTtcbiAgICByZXR1cm47XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIC8vIGVyclxuICB9XG59XG5mdW5jdGlvbiBjcmVhdGVFbGVtZW50KHRhZywgY2xhc3Nlcykge1xuICBpZiAoY2xhc3NlcyA9PT0gdm9pZCAwKSB7XG4gICAgY2xhc3NlcyA9IFtdO1xuICB9XG4gIGNvbnN0IGVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCh0YWcpO1xuICBlbC5jbGFzc0xpc3QuYWRkKC4uLihBcnJheS5pc0FycmF
51965KGNsYXNzZXMpID8gY2xhc3NlcyA6IGNsYXNzZXNUb1Rva2VucyhjbGFzc2VzKSkpO1xuICByZXR1cm4gZWw7XG59XG5mdW5jdGlvbiBlbGVtZW50T2Zmc2V0KGVsKSB7XG4gIGNvbnN0IHdpbmRvdyA9IGdldFdpbmRvdygpO1xuICBjb25zdCBkb2N1bWVudCA9IGdldERvY3VtZW50KCk7XG4gIGNvbnN0IGJveCA9IGVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICBjb25zdCBib2R5ID0gZG9jdW1lbnQuYm9keTtcbiAgY29uc3QgY2xpZW50VG9wID0gZWwuY2xpZW50VG9wIHx8IGJvZHkuY2xpZW50VG9wIHx8IDA7XG4gIGNvbnN0IGNsaWVudExlZnQgPSBlbC5jbGllbnRMZWZ0IHx8IGJvZHkuY2xpZW50TGVmdCB8fCAwO1xuICBjb25zdCBzY3JvbGxUb3AgPSBlbCA9PT0gd2luZG93ID8gd2luZG93LnNjcm9sbFkgOiBlbC5zY3JvbGxUb3A7XG4gIGNvbnN0IHNjcm9sbExlZnQgPSBlbCA9PT0gd2luZG93ID8gd2luZG93LnNjcm9sbFggOiBlbC5zY3JvbGxMZWZ0O1xuICByZXR1cm4ge1xuICAgIHRvcDogYm94LnRvcCArIHNjcm9sbFRvcCAtIGNsaWVudFRvcCxcbiAgICBsZWZ0OiBib3gubGVmdCArIHNjcm9sbExlZnQgLSBjbGllbnRMZWZ0XG4gIH07XG59XG5mdW5jdGlvbiBlbGVtZW50UHJldkFsbChlbCwgc2VsZWN0b3IpIHtcbiAgY29uc3QgcHJldkVscyA9IFtdO1xuICB3aGlsZSAoZWwucHJldmlvdXNFbGVtZW50U2libGluZykge1xuICAgIGNvbnN0IHByZXYgPSBlbC5wcmV2aW91c0VsZW1lbnRTaWJsaW5nOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lXG4gICAgaWYgKHNlbGVjdG9yKSB7XG4gICAgICBpZiAocHJldi5tYXRjaGVzKHNlbGVjdG9yKSkgcHJldkVscy5wdXNoKHByZXYpO1xuICAgIH0gZWxzZSBwcmV2RWxzLnB1c2gocHJldik7XG4gICAgZWwgPSBwcmV2O1xuICB9XG4gIHJldHVybiBwcmV2RWxzO1xufVxuZnVuY3Rpb24gZWxlbWVudE5leHRBbGwoZWwsIHNlbGVjdG9yKSB7XG4gIGNvbnN0IG5leHRFbHMgPSBbXTtcbiAgd2hpbGUgKGVsLm5leHRFbGVtZW50U2libGluZykge1xuICAgIGNvbnN0IG5leHQgPSBlbC5uZXh0RWxlbWVudFNpYmxpbmc7IC8vIGVzbGludC1kaXNhYmxlLWxpbmVcbiAgICBpZiAoc2VsZWN0b3IpIHtcbiAgICAgIGlmIChuZXh0Lm1hdGNoZXMoc2VsZWN0b3IpKSBuZXh0RWxzLnB1c2gobmV4dCk7XG4gICAgfSBlbHNlIG5leHRFbHMucHVzaChuZXh0KTtcbiAgICBlbCA9IG5leHQ7XG4gIH1cbiAgcmV0dXJuIG5leHRFbHM7XG59XG5mdW5jdGlvbiBlbGVtZW50U3R5bGUoZWwsIHByb3ApIHtcbiAgY29uc3Qgd2luZG93ID0gZ2V0V2luZG93KCk7XG4gIHJldHVybiB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShlbCwgbnVsbCkuZ2V0UHJvcGVydHlWYWx1ZShwcm9wKTtcbn1cbmZ1bmN0aW9uIGVsZW1lbnRJbmRleChlbCkge1xuICBsZXQgY2hpbGQgPSBlbDtcbiAgbGV0IGk7XG4gIGlmIChjaGlsZCkge1xuICAgIGkgPSAwO1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZVxuICAgIHdoaWxlICgoY2hpbGQgPSBjaGlsZC5wcmV2aW91c1NpYmxpbmcpICE9PSBudWxsKSB7XG4gICAgICBpZiAoY2hpbGQubm9kZVR5cGUgPT09IDEpIGkgKz0gMTtcbiAgICB9XG4gICAgcmV0dXJuIGk7XG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cbmZ1bmN0aW9uIGVsZW1lbnRQYXJlbnRzKGVsLCBzZWxlY3Rvcikge1xuICBjb25zdCBwYXJlbnRzID0gW107IC8vIGVzbGludC1kaXNhYmxlLWxpbmVcbiAgbGV0IHBhcmVudCA9IGVsLnBhcmVudEVsZW1lbnQ7IC8vIGVzbGludC1kaXNhYmxlLWxpbmVcbiAgd2hpbGUgKHBhcmVudCkge1xuICAgIGlmIChzZWxlY3Rvcikge1xuICAgICAgaWYgKHBhcmVudC5tYXRjaGVzKHNlbGVjdG9yKSkgcGFyZW50cy5wdXNoKHBhcmVudCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHBhcmVudHMucHVzaChwYXJlbnQpO1xuICAgIH1cbiAgICBwYXJlbnQgPSBwYXJlbnQucGFyZW50RWxlbWVudDtcbiAgfVxuICByZXR1cm4gcGFyZW50cztcbn1cbmZ1bmN0aW9uIGVsZW1lbnRUcmFuc2l0aW9uRW5kKGVsLCBjYWxsYmFjaykge1xuICBmdW5jdGlvbiBmaXJlQ2FsbEJhY2soZSkge1xuICAgIGlmIChlLnRhcmdldCAhPT0gZWwpIHJldHVybjtcbiAgICBjYWxsYmFjay5jYWxsKGVsLCBlKTtcbiAgICBlbC5yZW1vdmVFdmVudExpc3RlbmVyKCd0cmFuc2l0aW9uZW5kJywgZmlyZUNhbGxCYWNrKTtcbiAgfVxuICBpZiAoY2FsbGJhY2spIHtcbiAgICBlbC5hZGRFdmVudExpc3RlbmVyKCd0cmFuc2l0aW9uZW5kJywgZmlyZUNhbGxCYWNrKTtcbiAgfVxufVxuZnVuY3Rpb24gZWxlbWVudE91dGVyU2l6ZShlbCwgc2l6ZSwgaW5jbHVkZU1hcmdpbnMpIHtcbiAgY29uc3Qgd2luZG93ID0gZ2V0V2luZG93KCk7XG4gIGlmIChpbmNsdWRlTWFyZ2lucykge1xuICAgIHJldHVybiBlbFtzaXplID09PSAnd2lkdGgnID8gJ29mZnNldFdpZHRoJyA6ICdvZmZzZXRIZWlnaHQnXSArIHBhcnNlRmxvYXQod2luZG93LmdldENvbXB1dGVkU3R5bGUoZWwsIG51bGwpLmdldFByb3BlcnR5VmFsdWUoc2l6ZSA9PT0gJ3dpZHRoJyA/ICdtYXJnaW4tcmlnaHQnIDogJ21hcmdpbi10b3AnKSkgKyBwYXJzZUZsb2F0KHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGVsLCBudWxsKS5nZXRQcm9wZXJ0eVZhbHVlKHNpemUgPT09ICd3aWR0aCcgPyAnbWFyZ2luLWxlZnQnIDogJ21hcmdpbi1ib3R0b20nKSk7XG4gIH1cbiAgcmV0dXJuIGVsLm9mZnNldFdpZHRoO1xufVxuZnVuY3Rpb24gbWFrZUVsZW1lbnRzQXJyYXkoZWwpIHtcbiAgcmV0dXJuIChBcnJheS5pc0FycmF5KGVsKSA/IGVsIDogW2VsXSkuZmlsdGVyKGUgPT4gISFlKTtcbn1cblxuZXhwb3J0IHsgZWxlbWVudFBhcmVudHMgYXMgYSwgZWxlbWVudE9mZnNldCBhcyBiLCBjcmVhdGVFbGVtZW50IGFzIGMsIG5vdyBhcyBkLCBlbGVtZW50Q2hpbGRyZW4gYXMgZSwgZWxlbWVudE91dGVyU2l6ZSBhcyBmLCBnZXRTbGlkZVRyYW5zZm9ybUVsIGFzIGcsIGVsZW1lbnRJbmRleCBhcyBoLCBjbGFzc2VzVG9Ub2tlbnMgYXMgaSwgZ2V0VHJhbnNsYXRlIGFzIGosIGVsZW1lbnRUcmFuc2l0aW9uRW5kIGFzIGssIGlzT2JqZWN0IGFzIGwsIG1ha2VFbGVtZW50c0FycmF5IGFzIG0sIG5leHRUaWNrIGFzIG4sIGVsZW1lbnRTdHlsZSBhcyBvLCBlbGVtZW50TmV4dEFsbCBhcyBwLCBlbGVtZW50UHJldkFsbCBhcyBxLCBhbmltYXRlQ1NTTW9kZVNjcm9sbCBhcyByLCBzZXRDU1NQcm9wZXJ0eSBhcyBzLCBzaG93V2FybmluZyBhcyB0LCBleHRlbmQgYXMgdSwgZGVsZXRlUHJvcHMgYXMgdiB9O1xuIiwiaW1wb3J0IHsgYSBhcyBnZXRXaW5kb3csIGcgYXMgZ2V0RG9jdW1lbnQgfSBmcm9tICcuL3Nzci13aW5kb3cuZXNtLm1qcyc7XG5pbXBvcnQgeyBhIGFzIGVsZW1lbnRQYXJlbnRzLCBvIGFzIGVsZW1lbnRTdHlsZSwgZSBhcyBlbGVtZW50Q2hpbGRyZW4sIHMgYXMgc2V0Q1NTUHJvcGVydHksIGYgYXMgZWxlbWVudE91dGVyU2l6ZSwgcCBhcyBlbGVtZW50TmV4dEFsbCwgcSBhcyBlbGVtZW50UHJldkFsbCwgaiBhcyBnZXRUcmFuc2xhdGUsIHIgYXMgYW5pbWF0ZUNTU01vZGVTY3JvbGwsIG4gYXMgbm
5196V4dFRpY2ssIHQgYXMgc2hvd1dhcm5pbmcsIGMgYXMgY3JlYXRlRWxlbWVudCwgZCBhcyBub3csIHUgYXMgZXh0ZW5kLCBoIGFzIGVsZW1lbnRJbmRleCwgdiBhcyBkZWxldGVQcm9wcyB9IGZyb20gJy4vdXRpbHMubWpzJztcblxubGV0IHN1cHBvcnQ7XG5mdW5jdGlvbiBjYWxjU3VwcG9ydCgpIHtcbiAgY29uc3Qgd2luZG93ID0gZ2V0V2luZG93KCk7XG4gIGNvbnN0IGRvY3VtZW50ID0gZ2V0RG9jdW1lbnQoKTtcbiAgcmV0dXJuIHtcbiAgICBzbW9vdGhTY3JvbGw6IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCAmJiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc3R5bGUgJiYgJ3Njcm9sbEJlaGF2aW9yJyBpbiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc3R5bGUsXG4gICAgdG91Y2g6ICEhKCdvbnRvdWNoc3RhcnQnIGluIHdpbmRvdyB8fCB3aW5kb3cuRG9jdW1lbnRUb3VjaCAmJiBkb2N1bWVudCBpbnN0YW5jZW9mIHdpbmRvdy5Eb2N1bWVudFRvdWNoKVxuICB9O1xufVxuZnVuY3Rpb24gZ2V0U3VwcG9ydCgpIHtcbiAgaWYgKCFzdXBwb3J0KSB7XG4gICAgc3VwcG9ydCA9IGNhbGNTdXBwb3J0KCk7XG4gIH1cbiAgcmV0dXJuIHN1cHBvcnQ7XG59XG5cbmxldCBkZXZpY2VDYWNoZWQ7XG5mdW5jdGlvbiBjYWxjRGV2aWNlKF90ZW1wKSB7XG4gIGxldCB7XG4gICAgdXNlckFnZW50XG4gIH0gPSBfdGVtcCA9PT0gdm9pZCAwID8ge30gOiBfdGVtcDtcbiAgY29uc3Qgc3VwcG9ydCA9IGdldFN1cHBvcnQoKTtcbiAgY29uc3Qgd2luZG93ID0gZ2V0V2luZG93KCk7XG4gIGNvbnN0IHBsYXRmb3JtID0gd2luZG93Lm5hdmlnYXRvci5wbGF0Zm9ybTtcbiAgY29uc3QgdWEgPSB1c2VyQWdlbnQgfHwgd2luZG93Lm5hdmlnYXRvci51c2VyQWdlbnQ7XG4gIGNvbnN0IGRldmljZSA9IHtcbiAgICBpb3M6IGZhbHNlLFxuICAgIGFuZHJvaWQ6IGZhbHNlXG4gIH07XG4gIGNvbnN0IHNjcmVlbldpZHRoID0gd2luZG93LnNjcmVlbi53aWR0aDtcbiAgY29uc3Qgc2NyZWVuSGVpZ2h0ID0gd2luZG93LnNjcmVlbi5oZWlnaHQ7XG4gIGNvbnN0IGFuZHJvaWQgPSB1YS5tYXRjaCgvKEFuZHJvaWQpOz9bXFxzXFwvXSsoW1xcZC5dKyk/Lyk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmVcbiAgbGV0IGlwYWQgPSB1YS5tYXRjaCgvKGlQYWQpLipPU1xccyhbXFxkX10rKS8pO1xuICBjb25zdCBpcG9kID0gdWEubWF0Y2goLyhpUG9kKSguKk9TXFxzKFtcXGRfXSspKT8vKTtcbiAgY29uc3QgaXBob25lID0gIWlwYWQgJiYgdWEubWF0Y2goLyhpUGhvbmVcXHNPU3xpT1MpXFxzKFtcXGRfXSspLyk7XG4gIGNvbnN0IHdpbmRvd3MgPSBwbGF0Zm9ybSA9PT0gJ1dpbjMyJztcbiAgbGV0IG1hY29zID0gcGxhdGZvcm0gPT09ICdNYWNJbnRlbCc7XG5cbiAgLy8gaVBhZE9zIDEzIGZpeFxuICBjb25zdCBpUGFkU2NyZWVucyA9IFsnMTAyNHgxMzY2JywgJzEzNjZ4MTAyNCcsICc4MzR4MTE5NCcsICcxMTk0eDgzNCcsICc4MzR4MTExMicsICcxMTEyeDgzNCcsICc3Njh4MTAyNCcsICcxMDI0eDc2OCcsICc4MjB4MTE4MCcsICcxMTgweDgyMCcsICc4MTB4MTA4MCcsICcxMDgweDgxMCddO1xuICBpZiAoIWlwYWQgJiYgbWFjb3MgJiYgc3VwcG9ydC50b3VjaCAmJiBpUGFkU2NyZWVucy5pbmRleE9mKGAke3NjcmVlbldpZHRofXgke3NjcmVlbkhlaWdodH1gKSA+PSAwKSB7XG4gICAgaXBhZCA9IHVhLm1hdGNoKC8oVmVyc2lvbilcXC8oW1xcZC5dKykvKTtcbiAgICBpZiAoIWlwYWQpIGlwYWQgPSBbMCwgMSwgJzEzXzBfMCddO1xuICAgIG1hY29zID0gZmFsc2U7XG4gIH1cblxuICAvLyBBbmRyb2lkXG4gIGlmIChhbmRyb2lkICYmICF3aW5kb3dzKSB7XG4gICAgZGV2aWNlLm9zID0gJ2FuZHJvaWQnO1xuICAgIGRldmljZS5hbmRyb2lkID0gdHJ1ZTtcbiAgfVxuICBpZiAoaXBhZCB8fCBpcGhvbmUgfHwgaXBvZCkge1xuICAgIGRldmljZS5vcyA9ICdpb3MnO1xuICAgIGRldmljZS5pb3MgPSB0cnVlO1xuICB9XG5cbiAgLy8gRXhwb3J0IG9iamVjdFxuICByZXR1cm4gZGV2aWNlO1xufVxuZnVuY3Rpb24gZ2V0RGV2aWNlKG92ZXJyaWRlcykge1xuICBpZiAob3ZlcnJpZGVzID09PSB2b2lkIDApIHtcbiAgICBvdmVycmlkZXMgPSB7fTtcbiAgfVxuICBpZiAoIWRldmljZUNhY2hlZCkge1xuICAgIGRldmljZUNhY2hlZCA9IGNhbGNEZXZpY2Uob3ZlcnJpZGVzKTtcbiAgfVxuICByZXR1cm4gZGV2aWNlQ2FjaGVkO1xufVxuXG5sZXQgYnJvd3NlcjtcbmZ1bmN0aW9uIGNhbGNCcm93c2VyKCkge1xuICBjb25zdCB3aW5kb3cgPSBnZXRXaW5kb3coKTtcbiAgY29uc3QgZGV2aWNlID0gZ2V0RGV2aWNlKCk7XG4gIGxldCBuZWVkUGVyc3BlY3RpdmVGaXggPSBmYWxzZTtcbiAgZnVuY3Rpb24gaXNTYWZhcmkoKSB7XG4gICAgY29uc3QgdWEgPSB3aW5kb3cubmF2aWdhdG9yLnVzZXJBZ2VudC50b0xvd2VyQ2FzZSgpO1xuICAgIHJldHVybiB1YS5pbmRleE9mKCdzYWZhcmknKSA+PSAwICYmIHVhLmluZGV4T2YoJ2Nocm9tZScpIDwgMCAmJiB1YS5pbmRleE9mKCdhbmRyb2lkJykgPCAwO1xuICB9XG4gIGlmIChpc1NhZmFyaSgpKSB7XG4gICAgY29uc3QgdWEgPSBTdHJpbmcod2luZG93Lm5hdmlnYXRvci51c2VyQWdlbnQpO1xuICAgIGlmICh1YS5pbmNsdWRlcygnVmVyc2lvbi8nKSkge1xuICAgICAgY29uc3QgW21ham9yLCBtaW5vcl0gPSB1YS5zcGxpdCgnVmVyc2lvbi8nKVsxXS5zcGxpdCgnICcpWzBdLnNwbGl0KCcuJykubWFwKG51bSA9PiBOdW1iZXIobnVtKSk7XG4gICAgICBuZWVkUGVyc3BlY3RpdmVGaXggPSBtYWpvciA8IDE2IHx8IG1ham9yID09PSAxNiAmJiBtaW5vciA8IDI7XG4gICAgfVxuICB9XG4gIGNvbnN0IGlzV2ViVmlldyA9IC8oaVBob25lfGlQb2R8aVBhZCkuKkFwcGxlV2ViS2l0KD8hLipTYWZhcmkpL2kudGVzdCh3aW5kb3cubmF2aWdhdG9yLnVzZXJBZ2VudCk7XG4gIGNvbnN0IGlzU2FmYXJpQnJvd3NlciA9IGlzU2FmYXJpKCk7XG4gIGNvbnN0IG5lZWQzZEZpeCA9IGlzU2FmYXJpQnJvd3NlciB8fCBpc1dlYlZpZXcgJiYgZGV2aWNlLmlvcztcbiAgcmV0dXJuIHtcbiAgICBpc1NhZmFyaTogbmVlZFBlcnNwZWN0aXZlRml4IHx8IGlzU2FmYXJpQnJvd3NlcixcbiAgICBuZWVkUGVyc3BlY3RpdmVGaXgsXG4gICAgbmVlZDNkRml4LFxuICAgIGlzV2ViVmlld1xuICB9O1xufVxuZnVuY3Rpb24gZ2V0QnJvd3NlcigpIHtcbiAgaWYgKCFicm93c2VyKSB7XG4gICAgYnJvd3NlciA9IGNhbGNCcm93c2VyKCk7XG4gIH1cbiAgcmV0dXJuIGJyb3dzZXI7XG59XG5cbmZ1bmN0aW9uIFJlc2l6ZShfcmVmKSB7XG4gIGxldCB7XG4gICAgc3dpcGVyLFxuICAgIG9uLFxuICAgIGVtaXRcbiAgfSA9IF9yZWY7XG4gIGNvbnN0IHdpbmRvdyA9IGdldFdpbmRvdygpO1xuICBsZXQgb2JzZXJ2ZXIgPSBudWxsO1xuICBsZXQgYW5pbWF0aW9uRnJhbWUgPSBudWxsO1xuICBjb25zdCByZXNpemVIYW5kbGVyID0gKCkgPT4ge1xuICAgIGlmICghc3dpcGVyIHx8IHN3aXBlci5kZXN0cm95ZWQgfHwgIXN3aXBlci5pbml0aWFsaXplZCkgcmV0dXJuO1xuICAgIGVtaXQoJ2JlZm9yZVJlc2l6ZScpO1xuICAgIGVtaXQoJ3Jlc2l6ZScpO1xuICB9O1xuICBjb25zdCBjcmVhdGVPYnNlcnZlciA9ICgpID0+IHtcbiAgICBpZiAoIXN3aXBlciB8fCBzd2lwZXIuZGVzdHJveWVkIHx8ICFzd2lwZXIuaW5pdGlhbGl6ZWQpIHJldHVybjtcbiAgICBvYnNlcnZlciA9IG5ldyBSZXNpemVPYnNlcnZlcihlbnRyaWVzID0+IHtcbiAgICAgIGFuaW1hdGlvbkZyYW1lID0gd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICAgIGNvbnN0IHtcbiAgICAgICAgICB3aWR0aCxcbiAgICAgICAgICBoZWlnaHRcbiAgICAgICAgfSA9IHN3aXBlcjtcbiAgICAgICAgbGV0IG5ld1dpZHRoID0gd2lkdGg7XG4gICAgICAgIGxldCBuZXdIZWlnaHQgPSBoZWlnaHQ7XG4gICAgICAgIGVudHJpZXMuZm9yRWFjaChfcmVmMiA9PiB7XG4gICAgICAgICAgbGV0IHtcbiAgICAgICAgICAgIGNvbnRlbn
5196RCb3hTaXplLFxuICAgICAgICAgICAgY29udGVudFJlY3QsXG4gICAgICAgICAgICB0YXJnZXRcbiAgICAgICAgICB9ID0gX3JlZjI7XG4gICAgICAgICAgaWYgKHRhcmdldCAmJiB0YXJnZXQgIT09IHN3aXBlci5lbCkgcmV0dXJuO1xuICAgICAgICAgIG5ld1dpZHRoID0gY29udGVudFJlY3QgPyBjb250ZW50UmVjdC53aWR0aCA6IChjb250ZW50Qm94U2l6ZVswXSB8fCBjb250ZW50Qm94U2l6ZSkuaW5saW5lU2l6ZTtcbiAgICAgICAgICBuZXdIZWlnaHQgPSBjb250ZW50UmVjdCA/IGNvbnRlbnRSZWN0LmhlaWdodCA6IChjb250ZW50Qm94U2l6ZVswXSB8fCBjb250ZW50Qm94U2l6ZSkuYmxvY2tTaXplO1xuICAgICAgICB9KTtcbiAgICAgICAgaWYgKG5ld1dpZHRoICE9PSB3aWR0aCB8fCBuZXdIZWlnaHQgIT09IGhlaWdodCkge1xuICAgICAgICAgIHJlc2l6ZUhhbmRsZXIoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG4gICAgb2JzZXJ2ZXIub2JzZXJ2ZShzd2lwZXIuZWwpO1xuICB9O1xuICBjb25zdCByZW1vdmVPYnNlcnZlciA9ICgpID0+IHtcbiAgICBpZiAoYW5pbWF0aW9uRnJhbWUpIHtcbiAgICAgIHdpbmRvdy5jYW5jZWxBbmltYXRpb25GcmFtZShhbmltYXRpb25GcmFtZSk7XG4gICAgfVxuICAgIGlmIChvYnNlcnZlciAmJiBvYnNlcnZlci51bm9ic2VydmUgJiYgc3dpcGVyLmVsKSB7XG4gICAgICBvYnNlcnZlci51bm9ic2VydmUoc3dpcGVyLmVsKTtcbiAgICAgIG9ic2VydmVyID0gbnVsbDtcbiAgICB9XG4gIH07XG4gIGNvbnN0IG9yaWVudGF0aW9uQ2hhbmdlSGFuZGxlciA9ICgpID0+IHtcbiAgICBpZiAoIXN3aXBlciB8fCBzd2lwZXIuZGVzdHJveWVkIHx8ICFzd2lwZXIuaW5pdGlhbGl6ZWQpIHJldHVybjtcbiAgICBlbWl0KCdvcmllbnRhdGlvbmNoYW5nZScpO1xuICB9O1xuICBvbignaW5pdCcsICgpID0+IHtcbiAgICBpZiAoc3dpcGVyLnBhcmFtcy5yZXNpemVPYnNlcnZlciAmJiB0eXBlb2Ygd2luZG93LlJlc2l6ZU9ic2VydmVyICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgY3JlYXRlT2JzZXJ2ZXIoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIHJlc2l6ZUhhbmRsZXIpO1xuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdvcmllbnRhdGlvbmNoYW5nZScsIG9yaWVudGF0aW9uQ2hhbmdlSGFuZGxlcik7XG4gIH0pO1xuICBvbignZGVzdHJveScsICgpID0+IHtcbiAgICByZW1vdmVPYnNlcnZlcigpO1xuICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdyZXNpemUnLCByZXNpemVIYW5kbGVyKTtcbiAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcignb3JpZW50YXRpb25jaGFuZ2UnLCBvcmllbnRhdGlvbkNoYW5nZUhhbmRsZXIpO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gT2JzZXJ2ZXIoX3JlZikge1xuICBsZXQge1xuICAgIHN3aXBlcixcbiAgICBleHRlbmRQYXJhbXMsXG4gICAgb24sXG4gICAgZW1pdFxuICB9ID0gX3JlZjtcbiAgY29uc3Qgb2JzZXJ2ZXJzID0gW107XG4gIGNvbnN0IHdpbmRvdyA9IGdldFdpbmRvdygpO1xuICBjb25zdCBhdHRhY2ggPSBmdW5jdGlvbiAodGFyZ2V0LCBvcHRpb25zKSB7XG4gICAgaWYgKG9wdGlvbnMgPT09IHZvaWQgMCkge1xuICAgICAgb3B0aW9ucyA9IHt9O1xuICAgIH1cbiAgICBjb25zdCBPYnNlcnZlckZ1bmMgPSB3aW5kb3cuTXV0YXRpb25PYnNlcnZlciB8fCB3aW5kb3cuV2Via2l0TXV0YXRpb25PYnNlcnZlcjtcbiAgICBjb25zdCBvYnNlcnZlciA9IG5ldyBPYnNlcnZlckZ1bmMobXV0YXRpb25zID0+IHtcbiAgICAgIC8vIFRoZSBvYnNlcnZlclVwZGF0ZSBldmVudCBzaG91bGQgb25seSBiZSB0cmlnZ2VyZWRcbiAgICAgIC8vIG9uY2UgZGVzcGl0ZSB0aGUgbnVtYmVyIG9mIG11dGF0aW9ucy4gIEFkZGl0aW9uYWxcbiAgICAgIC8vIHRyaWdnZXJzIGFyZSByZWR1bmRhbnQgYW5kIGFyZSB2ZXJ5IGNvc3RseVxuICAgICAgaWYgKHN3aXBlci5fX3ByZXZlbnRPYnNlcnZlcl9fKSByZXR1cm47XG4gICAgICBpZiAobXV0YXRpb25zLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICBlbWl0KCdvYnNlcnZlclVwZGF0ZScsIG11dGF0aW9uc1swXSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IG9ic2VydmVyVXBkYXRlID0gZnVuY3Rpb24gb2JzZXJ2ZXJVcGRhdGUoKSB7XG4gICAgICAgIGVtaXQoJ29ic2VydmVyVXBkYXRlJywgbXV0YXRpb25zWzBdKTtcbiAgICAgIH07XG4gICAgICBpZiAod2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSkge1xuICAgICAgICB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKG9ic2VydmVyVXBkYXRlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHdpbmRvdy5zZXRUaW1lb3V0KG9ic2VydmVyVXBkYXRlLCAwKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBvYnNlcnZlci5vYnNlcnZlKHRhcmdldCwge1xuICAgICAgYXR0cmlidXRlczogdHlwZW9mIG9wdGlvbnMuYXR0cmlidXRlcyA9PT0gJ3VuZGVmaW5lZCcgPyB0cnVlIDogb3B0aW9ucy5hdHRyaWJ1dGVzLFxuICAgICAgY2hpbGRMaXN0OiB0eXBlb2Ygb3B0aW9ucy5jaGlsZExpc3QgPT09ICd1bmRlZmluZWQnID8gdHJ1ZSA6IG9wdGlvbnMuY2hpbGRMaXN0LFxuICAgICAgY2hhcmFjdGVyRGF0YTogdHlwZW9mIG9wdGlvbnMuY2hhcmFjdGVyRGF0YSA9PT0gJ3VuZGVmaW5lZCcgPyB0cnVlIDogb3B0aW9ucy5jaGFyYWN0ZXJEYXRhXG4gICAgfSk7XG4gICAgb2JzZXJ2ZXJzLnB1c2gob2JzZXJ2ZXIpO1xuICB9O1xuICBjb25zdCBpbml0ID0gKCkgPT4ge1xuICAgIGlmICghc3dpcGVyLnBhcmFtcy5vYnNlcnZlcikgcmV0dXJuO1xuICAgIGlmIChzd2lwZXIucGFyYW1zLm9ic2VydmVQYXJlbnRzKSB7XG4gICAgICBjb25zdCBjb250YWluZXJQYXJlbnRzID0gZWxlbWVudFBhcmVudHMoc3dpcGVyLmhvc3RFbCk7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvbnRhaW5lclBhcmVudHMubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgYXR0YWNoKGNvbnRhaW5lclBhcmVudHNbaV0pO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyBPYnNlcnZlIGNvbnRhaW5lclxuICAgIGF0dGFjaChzd2lwZXIuaG9zdEVsLCB7XG4gICAgICBjaGlsZExpc3Q6IHN3aXBlci5wYXJhbXMub2JzZXJ2ZVNsaWRlQ2hpbGRyZW5cbiAgICB9KTtcblxuICAgIC8vIE9ic2VydmUgd3JhcHBlclxuICAgIGF0dGFjaChzd2lwZXIud3JhcHBlckVsLCB7XG4gICAgICBhdHRyaWJ1dGVzOiBmYWxzZVxuICAgIH0pO1xuICB9O1xuICBjb25zdCBkZXN0cm95ID0gKCkgPT4ge1xuICAgIG9ic2VydmVycy5mb3JFYWNoKG9ic2VydmVyID0+IHtcbiAgICAgIG9ic2VydmVyLmRpc2Nvbm5lY3QoKTtcbiAgICB9KTtcbiAgICBvYnNlcnZlcnMuc3BsaWNlKDAsIG9ic2VydmVycy5sZW5ndGgpO1xuICB9O1xuICBleHRlbmRQYXJhbXMoe1xuICAgIG9ic2VydmVyOiBmYWxzZSxcbiAgICBvYnNlcnZlUGFyZW50czogZmFsc2UsXG4gICAgb2JzZXJ2ZVNsaWRlQ2hpbGRyZW46IGZhbHNlXG4gI
5196H0pO1xuICBvbignaW5pdCcsIGluaXQpO1xuICBvbignZGVzdHJveScsIGRlc3Ryb3kpO1xufVxuXG4vKiBlc2xpbnQtZGlzYWJsZSBuby11bmRlcnNjb3JlLWRhbmdsZSAqL1xuXG52YXIgZXZlbnRzRW1pdHRlciA9IHtcbiAgb24oZXZlbnRzLCBoYW5kbGVyLCBwcmlvcml0eSkge1xuICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xuICAgIGlmICghc2VsZi5ldmVudHNMaXN0ZW5lcnMgfHwgc2VsZi5kZXN0cm95ZWQpIHJldHVybiBzZWxmO1xuICAgIGlmICh0eXBlb2YgaGFuZGxlciAhPT0gJ2Z1bmN0aW9uJykgcmV0dXJuIHNlbGY7XG4gICAgY29uc3QgbWV0aG9kID0gcHJpb3JpdHkgPyAndW5zaGlmdCcgOiAncHVzaCc7XG4gICAgZXZlbnRzLnNwbGl0KCcgJykuZm9yRWFjaChldmVudCA9PiB7XG4gICAgICBpZiAoIXNlbGYuZXZlbnRzTGlzdGVuZXJzW2V2ZW50XSkgc2VsZi5ldmVudHNMaXN0ZW5lcnNbZXZlbnRdID0gW107XG4gICAgICBzZWxmLmV2ZW50c0xpc3RlbmVyc1tldmVudF1bbWV0aG9kXShoYW5kbGVyKTtcbiAgICB9KTtcbiAgICByZXR1cm4gc2VsZjtcbiAgfSxcbiAgb25jZShldmVudHMsIGhhbmRsZXIsIHByaW9yaXR5KSB7XG4gICAgY29uc3Qgc2VsZiA9IHRoaXM7XG4gICAgaWYgKCFzZWxmLmV2ZW50c0xpc3RlbmVycyB8fCBzZWxmLmRlc3Ryb3llZCkgcmV0dXJuIHNlbGY7XG4gICAgaWYgKHR5cGVvZiBoYW5kbGVyICE9PSAnZnVuY3Rpb24nKSByZXR1cm4gc2VsZjtcbiAgICBmdW5jdGlvbiBvbmNlSGFuZGxlcigpIHtcbiAgICAgIHNlbGYub2ZmKGV2ZW50cywgb25jZUhhbmRsZXIpO1xuICAgICAgaWYgKG9uY2VIYW5kbGVyLl9fZW1pdHRlclByb3h5KSB7XG4gICAgICAgIGRlbGV0ZSBvbmNlSGFuZGxlci5fX2VtaXR0ZXJQcm94eTtcbiAgICAgIH1cbiAgICAgIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gbmV3IEFycmF5KF9sZW4pLCBfa2V5ID0gMDsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgICAgICBhcmdzW19rZXldID0gYXJndW1lbnRzW19rZXldO1xuICAgICAgfVxuICAgICAgaGFuZGxlci5hcHBseShzZWxmLCBhcmdzKTtcbiAgICB9XG4gICAgb25jZUhhbmRsZXIuX19lbWl0dGVyUHJveHkgPSBoYW5kbGVyO1xuICAgIHJldHVybiBzZWxmLm9uKGV2ZW50cywgb25jZUhhbmRsZXIsIHByaW9yaXR5KTtcbiAgfSxcbiAgb25BbnkoaGFuZGxlciwgcHJpb3JpdHkpIHtcbiAgICBjb25zdCBzZWxmID0gdGhpcztcbiAgICBpZiAoIXNlbGYuZXZlbnRzTGlzdGVuZXJzIHx8IHNlbGYuZGVzdHJveWVkKSByZXR1cm4gc2VsZjtcbiAgICBpZiAodHlwZW9mIGhhbmRsZXIgIT09ICdmdW5jdGlvbicpIHJldHVybiBzZWxmO1xuICAgIGNvbnN0IG1ldGhvZCA9IHByaW9yaXR5ID8gJ3Vuc2hpZnQnIDogJ3B1c2gnO1xuICAgIGlmIChzZWxmLmV2ZW50c0FueUxpc3RlbmVycy5pbmRleE9mKGhhbmRsZXIpIDwgMCkge1xuICAgICAgc2VsZi5ldmVudHNBbnlMaXN0ZW5lcnNbbWV0aG9kXShoYW5kbGVyKTtcbiAgICB9XG4gICAgcmV0dXJuIHNlbGY7XG4gIH0sXG4gIG9mZkFueShoYW5kbGVyKSB7XG4gICAgY29uc3Qgc2VsZiA9IHRoaXM7XG4gICAgaWYgKCFzZWxmLmV2ZW50c0xpc3RlbmVycyB8fCBzZWxmLmRlc3Ryb3llZCkgcmV0dXJuIHNlbGY7XG4gICAgaWYgKCFzZWxmLmV2ZW50c0FueUxpc3RlbmVycykgcmV0dXJuIHNlbGY7XG4gICAgY29uc3QgaW5kZXggPSBzZWxmLmV2ZW50c0FueUxpc3RlbmVycy5pbmRleE9mKGhhbmRsZXIpO1xuICAgIGlmIChpbmRleCA+PSAwKSB7XG4gICAgICBzZWxmLmV2ZW50c0FueUxpc3RlbmVycy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgIH1cbiAgICByZXR1cm4gc2VsZjtcbiAgfSxcbiAgb2ZmKGV2ZW50cywgaGFuZGxlcikge1xuICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xuICAgIGlmICghc2VsZi5ldmVudHNMaXN0ZW5lcnMgfHwgc2VsZi5kZXN0cm95ZWQpIHJldHVybiBzZWxmO1xuICAgIGlmICghc2VsZi5ldmVudHNMaXN0ZW5lcnMpIHJldHVybiBzZWxmO1xuICAgIGV2ZW50cy5zcGxpdCgnICcpLmZvckVhY2goZXZlbnQgPT4ge1xuICAgICAgaWYgKHR5cGVvZiBoYW5kbGVyID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICBzZWxmLmV2ZW50c0xpc3RlbmVyc1tldmVudF0gPSBbXTtcbiAgICAgIH0gZWxzZSBpZiAoc2VsZi5ldmVudHNMaXN0ZW5lcnNbZXZlbnRdKSB7XG4gICAgICAgIHNlbGYuZXZlbnRzTGlzdGVuZXJzW2V2ZW50XS5mb3JFYWNoKChldmVudEhhbmRsZXIsIGluZGV4KSA9PiB7XG4gICAgICAgICAgaWYgKGV2ZW50SGFuZGxlciA9PT0gaGFuZGxlciB8fCBldmVudEhhbmRsZXIuX19lbWl0dGVyUHJveHkgJiYgZXZlbnRIYW5kbGVyLl9fZW1pdHRlclByb3h5ID09PSBoYW5kbGVyKSB7XG4gICAgICAgICAgICBzZWxmLmV2ZW50c0xpc3RlbmVyc1tldmVudF0uc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBzZWxmO1xuICB9LFxuICBlbWl0KCkge1xuICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xuICAgIGlmICghc2VsZi5ldmVudHNMaXN0ZW5lcnMgfHwgc2VsZi5kZXN0cm95ZWQpIHJldHVybiBzZWxmO1xuICAgIGlmICghc2VsZi5ldmVudHNMaXN0ZW5lcnMpIHJldHVybiBzZWxmO1xuICAgIGxldCBldmVudHM7XG4gICAgbGV0IGRhdGE7XG4gICAgbGV0IGNvbnRleHQ7XG4gICAgZm9yICh2YXIgX2xlbjIgPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gbmV3IEFycmF5KF9sZW4yKSwgX2tleTIgPSAwOyBfa2V5MiA8IF9sZW4yOyBfa2V5MisrKSB7XG4gICAgICBhcmdzW19rZXkyXSA9IGFyZ3VtZW50c1tfa2V5Ml07XG4gICAgfVxuICAgIGlmICh0eXBlb2YgYXJnc1swXSA9PT0gJ3N0cmluZycgfHwgQXJyYXkuaXNBcnJheShhcmdzWzBdKSkge1xuICAgICAgZXZlbnRzID0gYXJnc1swXTtcbiAgICAgIGRhdGEgPSBhcmdzLnNsaWNlKDEsIGFyZ3MubGVuZ3RoKTtcbiAgICAgIGNvbnRleHQgPSBzZWxmO1xuICAgIH0gZWxzZSB7XG4gICAgICBldmVudHMgPSBhcmdzWzBdLmV2ZW50cztcbiAgICAgIGRhdGEgPSBhcmdzWzBdLmRhdGE7XG4gICAgICBjb250ZXh0ID0gYXJnc1swXS5jb250ZXh0IHx8IHNlbGY7XG4gICAgfVxuICAgIGRhdGEudW5zaGlmdChjb250ZXh0KTtcbiAgICBjb25zdCBldmVudHNBcnJheSA9IEFycmF5LmlzQXJyYXkoZXZlbnRzKSA/IGV2ZW50cyA6
5196IGV2ZW50cy5zcGxpdCgnICcpO1xuICAgIGV2ZW50c0FycmF5LmZvckVhY2goZXZlbnQgPT4ge1xuICAgICAgaWYgKHNlbGYuZXZlbnRzQW55TGlzdGVuZXJzICYmIHNlbGYuZXZlbnRzQW55TGlzdGVuZXJzLmxlbmd0aCkge1xuICAgICAgICBzZWxmLmV2ZW50c0FueUxpc3RlbmVycy5mb3JFYWNoKGV2ZW50SGFuZGxlciA9PiB7XG4gICAgICAgICAgZXZlbnRIYW5kbGVyLmFwcGx5KGNvbnRleHQsIFtldmVudCwgLi4uZGF0YV0pO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGlmIChzZWxmLmV2ZW50c0xpc3RlbmVycyAmJiBzZWxmLmV2ZW50c0xpc3RlbmVyc1tldmVudF0pIHtcbiAgICAgICAgc2VsZi5ldmVudHNMaXN0ZW5lcnNbZXZlbnRdLmZvckVhY2goZXZlbnRIYW5kbGVyID0+IHtcbiAgICAgICAgICBldmVudEhhbmRsZXIuYXBwbHkoY29udGV4dCwgZGF0YSk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBzZWxmO1xuICB9XG59O1xuXG5mdW5jdGlvbiB1cGRhdGVTaXplKCkge1xuICBjb25zdCBzd2lwZXIgPSB0aGlzO1xuICBsZXQgd2lkdGg7XG4gIGxldCBoZWlnaHQ7XG4gIGNvbnN0IGVsID0gc3dpcGVyLmVsO1xuICBpZiAodHlwZW9mIHN3aXBlci5wYXJhbXMud2lkdGggIT09ICd1bmRlZmluZWQnICYmIHN3aXBlci5wYXJhbXMud2lkdGggIT09IG51bGwpIHtcbiAgICB3aWR0aCA9IHN3aXBlci5wYXJhbXMud2lkdGg7XG4gIH0gZWxzZSB7XG4gICAgd2lkdGggPSBlbC5jbGllbnRXaWR0aDtcbiAgfVxuICBpZiAodHlwZW9mIHN3aXBlci5wYXJhbXMuaGVpZ2h0ICE9PSAndW5kZWZpbmVkJyAmJiBzd2lwZXIucGFyYW1zLmhlaWdodCAhPT0gbnVsbCkge1xuICAgIGhlaWdodCA9IHN3aXBlci5wYXJhbXMuaGVpZ2h0O1xuICB9IGVsc2Uge1xuICAgIGhlaWdodCA9IGVsLmNsaWVudEhlaWdodDtcbiAgfVxuICBpZiAod2lkdGggPT09IDAgJiYgc3dpcGVyLmlzSG9yaXpvbnRhbCgpIHx8IGhlaWdodCA9PT0gMCAmJiBzd2lwZXIuaXNWZXJ0aWNhbCgpKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gU3VidHJhY3QgcGFkZGluZ3NcbiAgd2lkdGggPSB3aWR0aCAtIHBhcnNlSW50KGVsZW1lbnRTdHlsZShlbCwgJ3BhZGRpbmctbGVmdCcpIHx8IDAsIDEwKSAtIHBhcnNlSW50KGVsZW1lbnRTdHlsZShlbCwgJ3BhZGRpbmctcmlnaHQnKSB8fCAwLCAxMCk7XG4gIGhlaWdodCA9IGhlaWdodCAtIHBhcnNlSW50KGVsZW1lbnRTdHlsZShlbCwgJ3BhZGRpbmctdG9wJykgfHwgMCwgMTApIC0gcGFyc2VJbnQoZWxlbWVudFN0eWxlKGVsLCAncGFkZGluZy1ib3R0b20nKSB8fCAwLCAxMCk7XG4gIGlmIChOdW1iZXIuaXNOYU4od2lkdGgpKSB3aWR0aCA9IDA7XG4gIGlmIChOdW1iZXIuaXNOYU4oaGVpZ2h0KSkgaGVpZ2h0ID0gMDtcbiAgT2JqZWN0LmFzc2lnbihzd2lwZXIsIHtcbiAgICB3aWR0aCxcbiAgICBoZWlnaHQsXG4gICAgc2l6ZTogc3dpcGVyLmlzSG9yaXpvbnRhbCgpID8gd2lkdGggOiBoZWlnaHRcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZVNsaWRlcygpIHtcbiAgY29uc3Qgc3dpcGVyID0gdGhpcztcbiAgZnVuY3Rpb24gZ2V0RGlyZWN0aW9uUHJvcGVydHlWYWx1ZShub2RlLCBsYWJlbCkge1xuICAgIHJldHVybiBwYXJzZUZsb2F0KG5vZGUuZ2V0UHJvcGVydHlWYWx1ZShzd2lwZXIuZ2V0RGlyZWN0aW9uTGFiZWwobGFiZWwpKSB8fCAwKTtcbiAgfVxuICBjb25zdCBwYXJhbXMgPSBzd2lwZXIucGFyYW1zO1xuICBjb25zdCB7XG4gICAgd3JhcHBlckVsLFxuICAgIHNsaWRlc0VsLFxuICAgIHNpemU6IHN3aXBlclNpemUsXG4gICAgcnRsVHJhbnNsYXRlOiBydGwsXG4gICAgd3JvbmdSVExcbiAgfSA9IHN3aXBlcjtcbiAgY29uc3QgaXNWaXJ0dWFsID0gc3dpcGVyLnZpcnR1YWwgJiYgcGFyYW1zLnZpcnR1YWwuZW5hYmxlZDtcbiAgY29uc3QgcHJldmlvdXNTbGlkZXNMZW5ndGggPSBpc1ZpcnR1YWwgPyBzd2lwZXIudmlydHVhbC5zbGlkZXMubGVuZ3RoIDogc3dpcGVyLnNsaWRlcy5sZW5ndGg7XG4gIGNvbnN0IHNsaWRlcyA9IGVsZW1lbnRDaGlsZHJlbihzbGlkZXNFbCwgYC4ke3N3aXBlci5wYXJhbXMuc2xpZGVDbGFzc30sIHN3aXBlci1zbGlkZWApO1xuICBjb25zdCBzbGlkZXNMZW5ndGggPSBpc1ZpcnR1YWwgPyBzd2lwZXIudmlydHVhbC5zbGlkZXMubGVuZ3RoIDogc2xpZGVzLmxlbmd0aDtcbiAgbGV0IHNuYXBHcmlkID0gW107XG4gIGNvbnN0IHNsaWRlc0dyaWQgPSBbXTtcbiAgY29uc3Qgc2xpZGVzU2l6ZXNHcmlkID0gW107XG4gIGxldCBvZmZzZXRCZWZvcmUgPSBwYXJhbXMuc2xpZGVzT2Zmc2V0QmVmb3JlO1xuICBpZiAodHlwZW9mIG9mZnNldEJlZm9yZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIG9mZnNldEJlZm9yZSA9IHBhcmFtcy5zbGlkZXNPZmZzZXRCZWZvcmUuY2FsbChzd2lwZXIpO1xuICB9XG4gIGxldCBvZmZzZXRBZnRlciA9IHBhcmFtcy5zbGlkZXNPZmZzZXRBZnRlcjtcbiAgaWYgKHR5cGVvZiBvZmZzZXRBZnRlciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIG9mZnNldEFmdGVyID0gcGFyYW1zLnNsaWRlc09mZnNldEFmdGVyLmNhbGwoc3dpcGVyKTtcbiAgfVxuICBjb25zdCBwcmV2aW91c1NuYXBHcmlkTGVuZ3RoID0gc3dpcGVyLnNuYXBHcmlkLmxlbmd0aDtcbiAgY29uc3QgcHJldmlvdXNTbGlkZXNHcmlkTGVuZ3RoID0gc3dpcGVyLnNsaWRlc0dyaWQubGVuZ3RoO1xuICBsZXQgc3BhY2VCZXR3ZWVuID0gcGFyYW1zLnNwYWNlQmV0d2VlbjtcbiAgbGV0IHNsaWRlUG9zaXRpb24gPSAtb2Zmc2V0QmVmb3JlO1xuICBsZXQgcHJldlNsaWRlU2l6ZSA9IDA7XG4gIGxldCBpbmRleCA9IDA7XG4gIGlmICh0eXBlb2Ygc3dpcGVyU2l6ZSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKHR5cGVvZiBzcGFjZUJldHdlZW4gPT09ICdzdHJpbmcnICYmIHNwYWNlQmV0d2Vlbi5pbmRleE9mKCclJykgPj0gMCkge1xuICAgIHNwYWNlQmV0d2VlbiA9IHBhcnNlRmxvYXQoc3BhY2VCZXR3ZWVuLnJlcGxhY2UoJyUnLCAnJykpIC8gMTAwICogc3dpcGVyU2l6ZTtcbiAgfSBlbHNlIGlmICh0eXBlb2Ygc3BhY2VCZXR3ZWVuID09PSAnc3RyaW5nJykge1xuICAgIHNwYWNlQmV0d2VlbiA9IHBhcnNlRmxvYXQoc3BhY2VCZXR3ZWVuKTtcbiAgfVxuICBzd2lwZXIudmlydHVhbFNpemUgPSAtc3B
5196hY2VCZXR3ZWVuO1xuXG4gIC8vIHJlc2V0IG1hcmdpbnNcbiAgc2xpZGVzLmZvckVhY2goc2xpZGVFbCA9PiB7XG4gICAgaWYgKHJ0bCkge1xuICAgICAgc2xpZGVFbC5zdHlsZS5tYXJnaW5MZWZ0ID0gJyc7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNsaWRlRWwuc3R5bGUubWFyZ2luUmlnaHQgPSAnJztcbiAgICB9XG4gICAgc2xpZGVFbC5zdHlsZS5tYXJnaW5Cb3R0b20gPSAnJztcbiAgICBzbGlkZUVsLnN0eWxlLm1hcmdpblRvcCA9ICcnO1xuICB9KTtcblxuICAvLyByZXNldCBjc3NNb2RlIG9mZnNldHNcbiAgaWYgKHBhcmFtcy5jZW50ZXJlZFNsaWRlcyAmJiBwYXJhbXMuY3NzTW9kZSkge1xuICAgIHNldENTU1Byb3BlcnR5KHdyYXBwZXJFbCwgJy0tc3dpcGVyLWNlbnRlcmVkLW9mZnNldC1iZWZvcmUnLCAnJyk7XG4gICAgc2V0Q1NTUHJvcGVydHkod3JhcHBlckVsLCAnLS1zd2lwZXItY2VudGVyZWQtb2Zmc2V0LWFmdGVyJywgJycpO1xuICB9XG4gIGNvbnN0IGdyaWRFbmFibGVkID0gcGFyYW1zLmdyaWQgJiYgcGFyYW1zLmdyaWQucm93cyA+IDEgJiYgc3dpcGVyLmdyaWQ7XG4gIGlmIChncmlkRW5hYmxlZCkge1xuICAgIHN3aXBlci5ncmlkLmluaXRTbGlkZXMoc2xpZGVzKTtcbiAgfSBlbHNlIGlmIChzd2lwZXIuZ3JpZCkge1xuICAgIHN3aXBlci5ncmlkLnVuc2V0U2xpZGVzKCk7XG4gIH1cblxuICAvLyBDYWxjIHNsaWRlc1xuICBsZXQgc2xpZGVTaXplO1xuICBjb25zdCBzaG91bGRSZXNldFNsaWRlU2l6ZSA9IHBhcmFtcy5zbGlkZXNQZXJWaWV3ID09PSAnYXV0bycgJiYgcGFyYW1zLmJyZWFrcG9pbnRzICYmIE9iamVjdC5rZXlzKHBhcmFtcy5icmVha3BvaW50cykuZmlsdGVyKGtleSA9PiB7XG4gICAgcmV0dXJuIHR5cGVvZiBwYXJhbXMuYnJlYWtwb2ludHNba2V5XS5zbGlkZXNQZXJWaWV3ICE9PSAndW5kZWZpbmVkJztcbiAgfSkubGVuZ3RoID4gMDtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBzbGlkZXNMZW5ndGg7IGkgKz0gMSkge1xuICAgIHNsaWRlU2l6ZSA9IDA7XG4gICAgbGV0IHNsaWRlO1xuICAgIGlmIChzbGlkZXNbaV0pIHNsaWRlID0gc2xpZGVzW2ldO1xuICAgIGlmIChncmlkRW5hYmxlZCkge1xuICAgICAgc3dpcGVyLmdyaWQudXBkYXRlU2xpZGUoaSwgc2xpZGUsIHNsaWRlcyk7XG4gICAgfVxuICAgIGlmIChzbGlkZXNbaV0gJiYgZWxlbWVudFN0eWxlKHNsaWRlLCAnZGlzcGxheScpID09PSAnbm9uZScpIGNvbnRpbnVlOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lXG5cbiAgICBpZiAocGFyYW1zLnNsaWRlc1BlclZpZXcgPT09ICdhdXRvJykge1xuICAgICAgaWYgKHNob3VsZFJlc2V0U2xpZGVTaXplKSB7XG4gICAgICAgIHNsaWRlc1tpXS5zdHlsZVtzd2lwZXIuZ2V0RGlyZWN0aW9uTGFiZWwoJ3dpZHRoJyldID0gYGA7XG4gICAgICB9XG4gICAgICBjb25zdCBzbGlkZVN0eWxlcyA9IGdldENvbXB1dGVkU3R5bGUoc2xpZGUpO1xuICAgICAgY29uc3QgY3VycmVudFRyYW5zZm9ybSA9IHNsaWRlLnN0eWxlLnRyYW5zZm9ybTtcbiAgICAgIGNvbnN0IGN1cnJlbnRXZWJLaXRUcmFuc2Zvcm0gPSBzbGlkZS5zdHlsZS53ZWJraXRUcmFuc2Zvcm07XG4gICAgICBpZiAoY3VycmVudFRyYW5zZm9ybSkge1xuICAgICAgICBzbGlkZS5zdHlsZS50cmFuc2Zvcm0gPSAnbm9uZSc7XG4gICAgICB9XG4gICAgICBpZiAoY3VycmVudFdlYktpdFRyYW5zZm9ybSkge1xuICAgICAgICBzbGlkZS5zdHlsZS53ZWJraXRUcmFuc2Zvcm0gPSAnbm9uZSc7XG4gICAgICB9XG4gICAgICBpZiAocGFyYW1zLnJvdW5kTGVuZ3Rocykge1xuICAgICAgICBzbGlkZVNpemUgPSBzd2lwZXIuaXNIb3Jpem9udGFsKCkgPyBlbGVtZW50T3V0ZXJTaXplKHNsaWRlLCAnd2lkdGgnLCB0cnVlKSA6IGVsZW1lbnRPdXRlclNpemUoc2xpZGUsICdoZWlnaHQnLCB0cnVlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZVxuICAgICAgICBjb25zdCB3aWR0aCA9IGdldERpcmVjdGlvblByb3BlcnR5VmFsdWUoc2xpZGVTdHlsZXMsICd3aWR0aCcpO1xuICAgICAgICBjb25zdCBwYWRkaW5nTGVmdCA9IGdldERpcmVjdGlvblByb3BlcnR5VmFsdWUoc2xpZGVTdHlsZXMsICdwYWRkaW5nLWxlZnQnKTtcbiAgICAgICAgY29uc3QgcGFkZGluZ1JpZ2h0ID0gZ2V0RGlyZWN0aW9uUHJvcGVydHlWYWx1ZShzbGlkZVN0eWxlcywgJ3BhZGRpbmctcmlnaHQnKTtcbiAgICAgICAgY29uc3QgbWFyZ2luTGVmdCA9IGdldERpcmVjdGlvblByb3BlcnR5VmFsdWUoc2xpZGVTdHlsZXMsICdtYXJnaW4tbGVmdCcpO1xuICAgICAgICBjb25zdCBtYXJnaW5SaWdodCA9IGdldERpcmVjdGlvblByb3BlcnR5VmFsdWUoc2xpZGVTdHlsZXMsICdtYXJnaW4tcmlnaHQnKTtcbiAgICAgICAgY29uc3QgYm94U2l6aW5nID0gc2xpZGVTdHlsZXMuZ2V0UHJvcGVydHlWYWx1ZSgnYm94LXNpemluZycpO1xuICAgICAgICBpZiAoYm94U2l6aW5nICYmIGJveFNpemluZyA9PT0gJ2JvcmRlci1ib3gnKSB7XG4gICAgICAgICAgc2xpZGVTaXplID0gd2lkdGggKyBtYXJnaW5MZWZ0ICsgbWFyZ2luUmlnaHQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc3Qge1xuICAgICAgICAgICAgY2xpZW50V2lkdGgsXG4gICAgICAgICAgICBvZmZzZXRXaWR0aFxuICAgICAgICAgIH0gPSBzbGlkZTtcbiAgICAgICAgICBzbGlkZVNpemUgPSB3aWR0aCArIHBhZGRpbmdMZWZ0ICsgcGFkZGluZ1JpZ2h0ICsgbWFyZ2luTGVmdCArIG1hcmdpblJpZ2h0ICsgKG9mZnNldFdpZHRoIC0gY2xpZW50V2lkdGgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoY3VycmVudFRyYW5zZm9ybSkge1xuICAgICAgICBzbGlkZS5zdHlsZS50cmFuc2Zvcm0gPSBjdXJyZW50VHJhbnNmb3JtO1xuICAgICAgfVxuICAgICAgaWYgKGN1cnJlbnRXZWJLaXRUcmFuc2Zvcm0pIHtcbiAgICAgICAgc2xpZGUuc3R5bGUud2Via2l0VHJhbnNmb3JtID0gY3VycmVudFdlYktpdFRyYW5zZm9ybTtcbiAgICAgIH1cbiAgICAgIGlmIChwYXJhbXMucm91bmRMZW5ndGhzKSBzbGlkZVNpemUgPSBNYXRoLmZsb29yKHNsaWRlU2l6ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNsaWRlU2l6ZSA9IChzd2lwZXJTaXplIC0gKHBhcmFtcy5zbGlkZXNQZXJWaWV3IC0gMSkgKiBzcGFjZUJldHdlZW4pIC8gcGFyYW1zLnNsaWRlc1BlclZpZXc7XG4gICAgICBpZiAocGFyYW1zLnJvdW5kTGVuZ3Rocykgc2xpZGVTaXplID0gTWF0aC5mbG9vcihzbGlkZVNpemUpO1xuICAgICAgaWYgKHNsaWRlc1tpXSkge1xuICAgICAgICBzbGlkZXNbaV0uc3R5bGVbc3dpcGVyLmdldERpcmVjdGlvbkxhYmVsKCd3aWR0aCcpXSA9IGAke3NsaWRlU2l6ZX1weGA7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChzbGlkZXNbaV0pIHtcbiAgICAgIHNsaWRlc1tpXS5zd2lwZXJTbGlkZVNpemUgPSBzbGlkZVNpemU7XG4gICAgfVxuICAgIHNsaWRlc1NpemVzR3JpZC5wdXNoKHNsaWRlU2l6ZSk7XG4gICAgaWYgKHBhcmFtcy5jZW50ZXJlZFNsaWRlcykge1xuICAgICAgc2xpZGVQb3NpdGlvbiA9IHNsaWRlUG9zaXRpb24gKyBzbGlkZVNpemUgLyAyICsgcHJldlNsaWRlU2l6ZSAvIDIgKyBzcGFjZUJldHdlZW47XG4gICAgICBpZiAocHJldlNsaWRlU2l6ZSA9PT0gMCAmJiBpICE9PSAwKSBzbGlkZVBvc2l0aW9uID0gc2xpZGVQb3NpdGlvbiAtIHN3aXBlclNpemUgLyAyIC0gc3BhY2VCZXR3ZWVuO1xuICAgICAgaWYgKGkgPT09IDApIHNsaWRlUG9zaXRpb24gPSBzbGlkZVBvc2l0aW9uIC0gc3dpcGVyU2l6ZSAvIDIgLSBzcGFjZUJldHdlZW47XG4gICAgICBpZiAoTWF0aC5hYnMoc2xpZGVQb3NpdGlvbikgPCAxIC8gMTAwMCkgc2xpZGVQb3NpdGlvbiA9IDA7XG4gICAgICBpZiAocGFyYW1zLnJvdW5kTGVuZ3Rocykgc2xpZGVQb3NpdGlvbiA9IE1hdGguZmxvb3Ioc2xpZGVQb3NpdGlvbik7XG4gICAgICBpZiAoaW5kZXggJSBwYXJhbXMuc2xpZGVzUGVyR3JvdXAgPT09IDApIHNuYXBHcmlkLnB1c2goc2xpZGVQb3NpdGlvbik7XG4gICAgICBzbGlkZXNHcmlkLnB1c2goc2xpZGVQb3NpdGlvbik7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChwYXJhbXMucm91bmRMZW5ndGhzKSBzbGlkZVBvc2l0aW9uID0gTWF0aC5mbG9vcihzbGlkZVBvc2l0aW9uKTtcbiAgICAgIGlmICgoaW5kZXggLSBNYXRoLm1pbihzd2lwZXIucGFyYW1zLnNsaWRlc1Blckdyb3VwU2tpcCwgaW5kZXgpKSAlIHN3aXBlci5wYXJhbXMuc2xpZGVzUGVyR3JvdXAgPT09IDApIHNuYXBHcmlkLnB1c2goc2xpZGVQb3NpdGlvbik7XG4gICAgICBzbGlkZXNHcmlkLnB1c2goc2xpZGVQb3NpdGlvbik7XG4gICAgICBzbGlkZVBvc2l0aW9uID0gc2xpZGVQb3NpdGlvbiArIHNsaWRlU2l6ZSArIHNwYWNlQmV0d2VlbjtcbiAgICB9XG4gICAgc3dpcGVyLnZpcnR1YWxTaXplICs9IHNsaWRlU2l6ZSArIHNwYWNlQmV0d2VlbjtcbiAgICBwcmV2U2xpZGVTaXplID0gc2xpZGVTaXplO1xuICAgIGluZGV4ICs9IDE7XG4gIH1cbiAgc3dpcGVyLnZpcnR1YWxTaXplID0gTWF0aC5tYXgoc3dpcGVyLnZpcnR1YWxTaXplLCBzd2lwZXJTaXplKSArIG9mZnNldEFmdGVyO1xuICBpZiAocnRsICYmIHdyb25nUlRMICYmIChwYXJhbXMuZWZmZWN0ID09PSAnc2xpZGUnIHx8IHBhcmFtcy5lZmZlY3QgPT09ICdjb3ZlcmZsb3cnKSkge1xuICAgIHdyYXBwZXJFbC5zdHlsZS53aWR0aCA9IGAke3N3aXBlci52aXJ0dWFsU2l6ZSArIHNwYWNlQmV0d2Vlbn1weGA7XG4gIH1cbiAgaWYgKHBhcmFtcy5zZXRXcmFwcGVyU2l6ZSkge1xuICAgIHdyYXBwZXJFbC5zdHlsZVtzd2lwZXIuZ2V0RGlyZWN0aW9uTGFiZWwoJ3dpZHRoJyldID0gYCR7c3dpcGVyLnZpcnR1YWxTaXplICsgc3BhY2VCZXR3ZWVufXB4YDtcbiAgfVxuICBpZiAoZ3JpZEVuYWJsZWQpIHtcbiAgICBzd2lwZXIuZ3JpZC51cGRhdGVXcmFwcGVyU2l6ZShzbGlkZVNpemUsIHNuYXBHcmlkKTtcbiAgfVxuXG4gIC8vIFJlbW92ZSBsYXN0IGdyaWQgZWxlbWVudHMgZGVwZW5kaW5nIG9uIHdpZHRoXG4gIGlmICghcGFyYW1zLmNlbnRlcmVkU2xpZGVzKSB7XG4gICAgY29uc3QgbmV3U2xpZGVzR3JpZCA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc25hcEdyaWQubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgIGxldCBzbGlkZXNHcmlkSXRlbSA9IHNuYXBHcmlkW2ldO1xuICAgICAgaWYgKHBhcmFtcy5yb3VuZExlbmd0aHMpIHNsaWRlc0dyaWRJdGVtID0gTWF0aC5mbG9vcihzbGlkZXNHcmlkSXRlbSk7XG4gICAgICBpZiAoc25hcEdyaWRbaV0gPD0gc3dpcGVyLnZpcnR1YWxTaXplIC0gc3dpcGVyU2l6ZSkge1xuICAgICAgICBuZXdTbGlkZXNHcmlkLnB1c2goc2xpZGVzR3JpZEl0ZW0pO1xuICAgICAgfVxuICAgIH1cbiAgICBzbmFwR3JpZCA9IG5ld1NsaWRlc0dyaWQ7XG4gICAgaWYgKE1hdGguZmxvb3Ioc3dpcGVyLnZpcnR1YWxTaXplIC0gc3dpcGVyU2l6ZSkgLSBNYXRoLmZsb29yKHNuYXBHcmlkW3NuYXBHcmlkLmxlbmd0aCAtIDFdKSA+IDEpIHtcbiAgICAgIHNuYXBHcmlkLnB1c2goc3dpcGVyLnZpcnR1YWxTaXplIC0gc3dpcGVyU2l6ZSk7XG4gICAgfVxuICB9XG4gIGlmIChpc1ZpcnR1YWwgJiYgcGFyYW1zLmxvb3ApIHtcbiAgICBjb25zdCBzaXplID0gc2xpZGVzU2l6ZXNHcmlkWzBdICsgc3BhY2VCZXR3ZWVuO1xuICAgIGlmIChwYXJhbXMuc2xpZGVzUGVyR3JvdXAgPiAxKSB7XG4gICAgICBjb25zdCBncm91cHMgPSBNYXRoLmNlaWwoKHN3aXBlci52aXJ0dWFsLnNsaWRlc0JlZm9yZSArIHN3aXBlci52aXJ0dWFsLnNsaWRlc0FmdGVyKSAvIHBhcmFtcy5zbGlkZXNQZXJHcm91cCk7XG4gICAgICBjb25zdCBncm91cFNpemUgPSBzaXplICogcGFyYW1zLnNsaWRlc1Blckdyb3VwO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBncm91cHM7IGkgKz
51960gMSkge1xuICAgICAgICBzbmFwR3JpZC5wdXNoKHNuYXBHcmlkW3NuYXBHcmlkLmxlbmd0aCAtIDFdICsgZ3JvdXBTaXplKTtcbiAgICAgIH1cbiAgICB9XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzd2lwZXIudmlydHVhbC5zbGlkZXNCZWZvcmUgKyBzd2lwZXIudmlydHVhbC5zbGlkZXNBZnRlcjsgaSArPSAxKSB7XG4gICAgICBpZiAocGFyYW1zLnNsaWRlc1Blckdyb3VwID09PSAxKSB7XG4gICAgICAgIHNuYXBHcmlkLnB1c2goc25hcEdyaWRbc25hcEdyaWQubGVuZ3RoIC0gMV0gKyBzaXplKTtcbiAgICAgIH1cbiAgICAgIHNsaWRlc0dyaWQucHVzaChzbGlkZXNHcmlkW3NsaWRlc0dyaWQubGVuZ3RoIC0gMV0gKyBzaXplKTtcbiAgICAgIHN3aXBlci52aXJ0dWFsU2l6ZSArPSBzaXplO1xuICAgIH1cbiAgfVxuICBpZiAoc25hcEdyaWQubGVuZ3RoID09PSAwKSBzbmFwR3JpZCA9IFswXTtcbiAgaWYgKHNwYWNlQmV0d2VlbiAhPT0gMCkge1xuICAgIGNvbnN0IGtleSA9IHN3aXBlci5pc0hvcml6b250YWwoKSAmJiBydGwgPyAnbWFyZ2luTGVmdCcgOiBzd2lwZXIuZ2V0RGlyZWN0aW9uTGFiZWwoJ21hcmdpblJpZ2h0Jyk7XG4gICAgc2xpZGVzLmZpbHRlcigoXywgc2xpZGVJbmRleCkgPT4ge1xuICAgICAgaWYgKCFwYXJhbXMuY3NzTW9kZSB8fCBwYXJhbXMubG9vcCkgcmV0dXJuIHRydWU7XG4gICAgICBpZiAoc2xpZGVJbmRleCA9PT0gc2xpZGVzLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSkuZm9yRWFjaChzbGlkZUVsID0+IHtcbiAgICAgIHNsaWRlRWwuc3R5bGVba2V5XSA9IGAke3NwYWNlQmV0d2Vlbn1weGA7XG4gICAgfSk7XG4gIH1cbiAgaWYgKHBhcmFtcy5jZW50ZXJlZFNsaWRlcyAmJiBwYXJhbXMuY2VudGVyZWRTbGlkZXNCb3VuZHMpIHtcbiAgICBsZXQgYWxsU2xpZGVzU2l6ZSA9IDA7XG4gICAgc2xpZGVzU2l6ZXNHcmlkLmZvckVhY2goc2xpZGVTaXplVmFsdWUgPT4ge1xuICAgICAgYWxsU2xpZGVzU2l6ZSArPSBzbGlkZVNpemVWYWx1ZSArIChzcGFjZUJldHdlZW4gfHwgMCk7XG4gICAgfSk7XG4gICAgYWxsU2xpZGVzU2l6ZSAtPSBzcGFj
5196ZUJldHdlZW47XG4gICAgY29uc3QgbWF4U25hcCA9IGFsbFNsaWRlc1NpemUgLSBzd2lwZXJTaXplO1xuICAgIHNuYXBHcmlkID0gc25hcEdyaWQubWFwKHNuYXAgPT4ge1xuICAgICAgaWYgKHNuYXAgPD0gMCkgcmV0dXJuIC1vZmZzZXRCZWZvcmU7XG4gICAgICBpZiAoc25hcCA+IG1heFNuYXApIHJldHVybiBtYXhTbmFwICsgb2Zmc2V0QWZ0ZXI7XG4gICAgICByZXR1cm4gc25hcDtcbiAgICB9KTtcbiAgfVxuICBpZiAocGFyYW1zLmNlbnRlckluc3VmZmljaWVudFNsaWRlcykge1xuICAgIGxldCBhbGxTbGlkZXNTaXplID0gMDtcbiAgICBzbGlkZXNTaXplc0dyaWQuZm9yRWFjaChzbGlkZVNpemVWYWx1ZSA9PiB7XG4gICAgICBhbGxTbGlkZXNTaXplICs9IHNsaWRlU2l6ZVZhbHVlICsgKHNwYWNlQmV0d2VlbiB8fCAwKTtcbiAgICB9KTtcbiAgICBhbGxTbGlkZXNTaXplIC09IHNwYWNlQmV0d2VlbjtcbiAgICBpZiAoYWxsU2xpZGVzU2l6ZSA8IHN3aXBlclNpemUpIHtcbiAgICAgIGNvbnN0IGFsbFNsaWRlc09mZnNldCA9IChzd2lwZXJTaXplIC0gYWxsU2xpZGVzU2l6ZSkgLyAyO1xuICAgICAgc25hcEdyaWQuZm9yRWFjaCgoc25hcCwgc25hcEluZGV4KSA9PiB7XG4gICAgICAgIHNuYXBHcmlkW3NuYXBJbmRleF0gPSBzbmFwIC0gYWxsU2xpZGVzT2Zmc2V0O1xuICAgICAgfSk7XG4gICAgICBzbGlkZXNHcmlkLmZvckVhY2goKHNuYXAsIHNuYXBJbmRleCkgPT4ge1xuICAgICAgICBzbGlkZXNHcmlkW3NuYXBJbmRleF0gPSBzbmFwICsgYWxsU2xpZGVzT2Zmc2V0O1xuICAgICAgfSk7XG4gICAgfVxuICB9XG4gIE9iamVjdC5hc3NpZ24oc3dpcGVyLCB7XG4gICAgc2xpZGVzLFxuICAgIHNuYXBHcmlkLFxuICAgIHNsaWRlc0dyaWQsXG4gICAgc2xpZGVzU2l6ZXNHcmlkXG4gIH0pO1xuICBpZiAocGFyYW1zLmNlbnRlcmVkU2xpZGVzICYmIHBhcmFtcy5jc3NNb2RlICYmICFwYXJhbXMuY2VudGVyZWRTbGlkZXNCb3VuZHMpIHtcbiAgICBzZXRDU1NQcm9wZXJ0eSh3cmFwcGVyRWwsICctLXN3aXBlci1jZW50ZXJlZC1vZmZzZXQtYmVmb3JlJywgYCR7LXNuYXBHcmlkWzBdfXB4YCk7XG4gICAgc2V0Q1NTUHJvcGVydHkod3JhcHBlckVsLCAnLS1zd2lwZXItY2VudGVyZWQtb2Zmc2V0LWFmdGVyJywgYCR7c3dpcGVyLnNpemUgLyAyIC0gc2xpZGVzU2l6ZXNHcmlkW3NsaWRlc1NpemVzR3JpZC5sZW5ndGggLSAxXSAvIDJ9cHhgKTtcbiAgICBjb25zdCBhZGRUb1NuYXBHcmlkID0gLXN3aXBlci5zbmFwR3JpZFswXTtcbiAgICBjb25zdCBhZGRUb1NsaWRlc0dyaWQgPSAtc3dpcGVyLnNsaWRlc0dyaWRbMF07XG4gICAgc3dpcGVyLnNuYXBHcmlkID0gc3dpcGVyLnNuYXBHcmlkLm1hcCh2ID0+IHYgKyBhZGRUb1NuYXBHcmlkKTtcbiAgICBzd2lwZXIuc2xpZGVzR3JpZCA9IHN3aXBlci5zbGlkZXNHcmlkLm1hcCh2ID0+IHYgKyBhZGRUb1NsaWRlc0dyaWQpO1xuICB9XG4gIGlmIChzbGlkZXNMZW5ndGggIT09IHByZXZpb3VzU2xpZGVzTGVuZ3RoKSB7XG4gICAgc3dpcGVyLmVtaXQoJ3NsaWRlc0xlbmd0aENoYW5nZScpO1xuICB9XG4gIGlmIChzbmFwR3JpZC5sZW5ndGggIT09IHByZXZpb3VzU25hcEdyaWRMZW5ndGgpIHtcbiAgICBpZiAoc3dpcGVyLnBhcmFtcy53YXRjaE92ZXJmbG93KSBzd2lwZXIuY2hlY2tPdmVyZmxvdygpO1xuICAgIHN3aXBlci5lbWl0KCdzbmFwR3JpZExlbmd0aENoYW5nZScpO1xuICB9XG4gIGlmIChzbGlkZXNHcmlkLmxlbmd0aCAhPT0gcHJldmlvdXNTbGlkZXNHcmlkTGVuZ3RoKSB7XG4gICAgc3dpcGVyLmVtaXQoJ3NsaWRlc0dyaWRMZW5ndGhDaGFuZ2UnKTtcbiAgfVxuICBpZiAocGFyYW1zLndhdGNoU2xpZGVzUHJvZ3Jlc3MpIHtcbiAgICBzd2lwZXIudXBkYXRlU2xpZGVzT2Zmc2V0KCk7XG4gIH1cbiAgc3dpcGVyLmVtaXQoJ3NsaWRlc1VwZGF0ZWQnKTtcbiAgaWYgKCFpc1ZpcnR1YWwgJiYgIXBhcmFtcy5jc3NNb2RlICYmIChwYXJhbXMuZWZmZWN0ID09PSAnc2xpZGUnIHx8IHBhcmFtcy5lZmZlY3QgPT09ICdmYWRlJykpIHtcbiAgICBjb25zdCBiYWNrRmFjZUhpZGRlbkNsYXNzID0gYCR7cGFyYW1zLmNvbnRhaW5lck1vZGlmaWVyQ2xhc3N9YmFja2ZhY2UtaGlkZGVuYDtcbiAgICBjb25zdCBoYXNDbGFzc0JhY2tmYWNlQ2xhc3NBZGRlZCA9IHN3aXBlci5lbC5jbGFzc0xpc3QuY29udGFpbnMoYmFja0ZhY2VIaWRkZW5DbGFzcyk7XG4gICAgaWYgKHNsaWRlc0xlbmd0aCA8PSBwYXJhbXMubWF4QmFja2ZhY2VIaWRkZW5TbGlkZXMpIHtcbiAgICAgIGlmICghaGFzQ2xhc3NCYWNrZmFjZUNsYXNzQWRkZWQpIHN3aXBlci5lbC5jbGFzc0xpc3QuYWRkKGJhY2tGYWNlSGlkZGVuQ2xhc3MpO1xuICAgIH0gZWxzZSBpZiAoaGFzQ2xhc3NCYWNrZmFjZUNsYXNzQWRkZWQpIHtcbiAgICAgIHN3aXBlci5lbC5jbGFzc0xpc3QucmVtb3ZlKGJhY2tGYWNlSGlkZGVuQ2xhc3MpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiB1cGRhdGVBdXRvSGVpZ2h0KHNwZWVkKSB7XG4gIGNvbnN0IHN3aXBlciA9IHRoaXM7XG4gIGNvbnN0IGFjdGl2ZVNsaWRlcyA9IFtdO1xuICBjb25zdCBpc1ZpcnR1YWwgPSBzd2lwZXIudmlydHVhbCAmJiBzd2lwZXIucGFyYW1zLnZpcnR1YWwuZW5hYmxlZDtcbiAgbGV0IG5ld0hlaWdodCA9IDA7XG4gIGxldCBpO1xuICBpZiAodHlwZW9mIHNwZWVkID09PSAnbnVtYmVyJykge1xuICAgIHN3aXBlci5zZXRUcmFuc2l0aW9uKHNwZWVkKTtcbiAgfSBlbHNlIGlmIChzcGVlZCA9PT0gdHJ1ZSkge1xuICAgIHN3aXBlci5zZXRUcmFuc2l0aW9uKHN3aXBlci5wYXJhbXMuc3BlZWQpO1xuICB9XG4gIGNvbnN0IGdldFNsaWRlQnlJbmRleCA9IGluZGV4ID0+IHtcbiAgICBpZiAoaXNWaXJ0dWFsKSB7XG4gICAgICByZXR1cm4gc3dpcGVyLnNsaWRlc1tzd2lwZXIuZ2V0U2xpZGVJbmRleEJ5RGF0YShpbmRleCldO1xuICAgIH1cbiAgICByZXR1cm4gc3dpcGVyLnNsaWRlc1tpbmRleF07XG4gIH07XG4gIC8vIEZpbmQgc2xpZGVzIGN1cnJlbnRseSBpbiB2aWV3XG4gIGlmIChzd2lwZXIucGFyYW1zLnNsaWRlc1BlclZpZXcgIT09ICdhdXRvJyAmJiBzd2lwZXIucGFyYW1zLnNsaWRlc1BlclZpZXcgPiAxKSB7XG4gICAgaWYgKHN3aXBlci5wYXJhbXMuY2VudGVyZWRTbGlkZXMpIHtcbiAgICAgIChzd2lwZXIudmlzaWJsZVNsaWRlcyB8fCBbXSkuZm9yRWFjaChzbGlkZSA9PiB7XG4gICAgICAgIGFjdGl2ZVNsaWRlcy5wdXNoKHNsaWRlKTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBmb3IgKGkgPSAwOyBpIDwgTWF0aC5jZWlsKHN3aXBlci5wYXJhbXMuc2xpZGVzUGVyVmlldyk7IGkgKz0gMSkge1xuICAgICAgICBjb25zdCBpbmRleCA9IHN3aXBlci5hY3RpdmVJbmRleCArIGk7XG4gICAgICAgIGlmIChpbmRleCA+IHN3aXBlci5zbGlkZXMubGVuZ3RoICYmICFpc1ZpcnR1YWwpIGJyZWFrO1xuICAgICAgICBhY3RpdmVTbGlkZXMucHVzaChnZXRTbGlkZUJ5SW5kZXgoaW5kZXgpKTtcbiAgICAgIH1cbiAgICB9XG4gI
5196H0gZWxzZSB7XG4gICAgYWN0aXZlU2xpZGVzLnB1c2goZ2V0U2xpZGVCeUluZGV4KHN3aXBlci5hY3RpdmVJbmRleCkpO1xuICB9XG5cbiAgLy8gRmluZCBuZXcgaGVpZ2h0IGZyb20gaGlnaGVzdCBzbGlkZSBpbiB2aWV3XG4gIGZvciAoaSA9IDA7IGkgPCBhY3RpdmVTbGlkZXMubGVuZ3RoOyBpICs9IDEpIHtcbiAgICBpZiAodHlwZW9mIGFjdGl2ZVNsaWRlc1tpXSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIGNvbnN0IGhlaWdodCA9IGFjdGl2ZVNsaWRlc1tpXS5vZmZzZXRIZWlnaHQ7XG4gICAgICBuZXdIZWlnaHQgPSBoZWlnaHQgPiBuZXdIZWlnaHQgPyBoZWlnaHQgOiBuZXdIZWlnaHQ7XG4gICAgfVxuICB9XG5cbiAgLy8gVXBkYXRlIEhlaWdodFxuICBpZiAobmV3SGVpZ2h0IHx8IG5ld0hlaWdodCA9PT0gMCkgc3dpcGVyLndyYXBwZXJFbC5zdHlsZS5oZWlnaHQgPSBgJHtuZXdIZWlnaHR9cHhgO1xufVxuXG5mdW5jdGlvbiB1cGRhdGVTbGlkZXNPZmZzZXQoKSB7XG4gIGNvbnN0IHN3aXBlciA9IHRoaXM7XG4gIGNvbnN0IHNsaWRlcyA9IHN3aXBlci5zbGlkZXM7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZVxuICBjb25zdCBtaW51c09mZnNldCA9IHN3aXBlci5pc0VsZW1lbnQgPyBzd2lwZXIuaXNIb3Jpem9udGFsKCkgPyBzd2lwZXIud3JhcHBlckVsLm9mZnNldExlZnQgOiBzd2lwZXIud3JhcHBlckVsLm9mZnNldFRvcCA6IDA7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgc2xpZGVzLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgc2xpZGVzW2ldLnN3aXBlclNsaWRlT2Zmc2V0ID0gKHN3aXBlci5pc0hvcml6b250YWwoKSA/IHNsaWRlc1tpXS5vZmZzZXRMZWZ0IDogc2xpZGVzW2ldLm9mZnNldFRvcCkgLSBtaW51c09mZnNldCAtIHN3aXBlci5jc3NPdmVyZmxvd0FkanVzdG1lbnQoKTtcbiAgfVxufVxuXG5mdW5jdGlvbiB1cGRhdGVTbGlkZXNQcm9ncmVzcyh0cmFuc2xhdGUpIHtcbiAgaWYgKHRyYW5zbGF0ZSA9PT0gdm9pZCAwKSB7XG4gICAgdHJhbnNsYXRlID0gdGhpcyAmJiB0aGlzLnRyYW5zbGF0ZSB8fCAwO1xuICB9XG4gIGNvbnN0IHN3aXBlciA9IHRoaXM7XG4gIGNvbnN0IHBhcmFtcyA9IHN3aXBlci5wYXJhbXM7XG4gIGNvbnN0IHtcbiAgICBzbGlkZXMsXG4gICAgcnRsVHJhbnNsYXRlOiBydGwsXG4gICAgc25hcEdyaWRcbiAgfSA9IHN3aXBlcjtcbiAgaWYgKHNsaWRlcy5sZW5ndGggPT09IDApIHJldHVybjtcbiAgaWYgKHR5cGVvZiBzbGlkZXNbMF0uc3dpcGVyU2xpZGVPZmZzZXQgPT09ICd1bmRlZmluZWQnKSBzd2lwZXIudXBkYXRlU2xpZGVzT2Zmc2V0KCk7XG4gIGxldCBvZmZzZXRDZW50ZXIgPSAtdHJhbnNsYXRlO1xuICBpZiAocnRsKSBvZmZzZXRDZW50ZXIgPSB0cmFuc2xhdGU7XG5cbiAgLy8gVmlzaWJsZSBTbGlkZXNcbiAgc2xpZGVzLmZvckVhY2goc2xpZGVFbCA9PiB7XG4gICAgc2xpZGVFbC5jbGFzc0xpc3QucmVtb3ZlKHBhcmFtcy5zbGlkZVZpc2libGVDbGFzcywgcGFyYW1zLnNsaWRlRnVsbHlWaXNpYmxlQ2xhc3MpO1xuICB9KTtcbiAgc3dpcGVyLnZpc2libGVTbGlkZXNJbmRleGVzID0gW107XG4gIHN3aXBlci52aXNpYmxlU2xpZGVzID0gW107XG4gIGxldCBzcGFjZUJldHdlZW4gPSBwYXJhbXMuc3BhY2VCZXR3ZWVuO1xuICBpZiAodHlwZW9mIHNwYWNlQmV0d2VlbiA9PT0gJ3N0cmluZycgJiYgc3BhY2VCZXR3ZWVuLmluZGV4T2YoJyUnKSA+PSAwKSB7XG4gICAgc3BhY2VCZXR3ZWVuID0gcGFyc2VGbG9hdChzcGFjZUJldHdlZW4ucmVwbGFjZSgnJScsICcnKSkgLyAxMDAgKiBzd2lwZXIuc2l6ZTtcbiAgfSBlbHNlIGlmICh0eXBlb2Ygc3BhY2VCZXR3ZWVuID09PSAnc3RyaW5nJykge1xuICAgIHNwYWNlQmV0d2VlbiA9IHBhcnNlRmxvYXQoc3BhY2VCZXR3ZWVuKTtcbiAgfVxuICBmb3IgKGxldCBpID0gMDsgaSA8IHNsaWRlcy5sZW5ndGg7IGkgKz0gMSkge1xuICAgIGNvbnN0IHNsaWRlID0gc2xpZGVzW2ldO1xuICAgIGxldCBzbGlkZU9mZnNldCA9IHNsaWRlLnN3aXBlclNsaWRlT2Zmc2V0O1xuICAgIGlmIChwYXJhbXMuY3NzTW9kZSAmJiBwYXJhbXMuY2VudGVyZWRTbGlkZXMpIHtcbiAgICAgIHNsaWRlT2Zmc2V0IC09IHNsaWRlc1swXS5zd2lwZXJTbGlkZU9mZnNldDtcbiAgICB9XG4gICAgY29uc3Qgc2xpZGVQcm9ncmVzcyA9IChvZmZzZXRDZW50ZXIgKyAocGFyYW1zLmNlbnRlcmVkU2xpZGVzID8gc3dpcGVyLm1pblRyYW5zbGF0ZSgpIDogMCkgLSBzbGlkZU9mZnNldCkgLyAoc2xpZGUuc3dpcGVyU2xpZGVTaXplICsgc3BhY2VCZXR3ZWVuKTtcbiAgICBjb25zdCBvcmlnaW5hbFNsaWRlUHJvZ3Jlc3MgPSAob2Zmc2V0Q2VudGVyIC0gc25hcEdyaWRbMF0gKyAocGFyYW1zLmNlbnRlcmVkU2xpZGVzID8gc3dpcGVyLm1pblRyYW5zbGF0ZSgpIDogMCkgLSBzbGlkZU9mZnNldCkgLyAoc2xpZGUuc3dpcGVyU2xpZGVTaXplICsgc3BhY2VCZXR3ZWVuKTtcbiAgICBjb25zdCBzbGlkZUJlZm9yZSA9IC0ob2Zmc2V0Q2VudGVyIC0gc2xpZGVPZmZzZXQpO1xuICAgIGNvbnN0IHNsaWRlQWZ0ZXIgPSBzbGlkZUJlZm9yZSArIHN3aXBlci5zbGlkZXNTaXplc0dyaWRbaV07XG4gICAgY29uc3QgaXNGdWxseVZpc2libGUgPSBzbGlkZUJlZm9yZSA+PSAwICYmIHNsaWRlQmVmb3JlIDw9IHN3aXBlci5zaXplIC0gc3dpcGVyLnNsaWRlc1NpemVzR3JpZFtpXTtcbiAgICBjb25zdCBpc1Zpc2libGUgPSBzbGlkZUJlZm9yZSA+PSAwICYmIHNsaWRlQmVmb3JlIDwgc3dpcGVyLnNpemUgLSAxIHx8IHNsaWRlQWZ0ZXIgPiAxICYmIHNsaWRlQWZ0ZXIgPD0gc3dpcGVyLnNpemUgfHwgc2xpZGVCZWZvcmUgPD0gMCAmJiBzbGlkZUFmdGVyID49IHN3aXBlci5zaXplO1xuICAgIGlmIChpc1Zpc2libGUpIHtcbiAgICAgIHN3aXBlci52aXNpYmxlU2xpZGVzLnB1c2goc2xpZGUpO1xuICAgICAgc3dpcGVyLnZpc2libGVTbGlkZXNJbmRleGVzLnB1c2goaSk7XG4gICAgICBzbGlkZXNbaV0uY2xhc3NMaXN0LmFkZChwYXJhbXMuc2xpZGVWaXNpYmxlQ2xhc3MpO1xuICAgIH1cbiAgICBpZiAoaXNGdWxseVZpc2libGUpIHtcbiAgICAgIHNsaWRlc1tpXS5jbGFzc0xpc3QuYWRkKHBhcmFtcy5zbGlkZUZ1bGx5VmlzaWJsZUNsYXNzKTtcbiAgICB9XG4gICAgc2xpZGUucHJvZ3Jlc3MgPSBydGwgPyAtc2xpZGVQcm9ncmVzcyA6IHNsaWRlUHJvZ3Jlc3M7XG4gICAgc2xpZGUub3JpZ2luYWxQcm9ncmVzcyA9IHJ0bCA/IC1vcmlnaW5hbFNsaWRlUHJvZ3Jlc3MgOiBvcmlnaW5hbFNsaWRlUHJvZ3Jlc3M7XG4gIH1cbn1cblxuZnVuY3Rpb24gdXBkYXRlUHJvZ3Jlc3ModHJhbnNsYXRlKSB7XG4gIGNvbnN0IHN3aXBlciA9IHRoaXM7XG4gIGlmICh0eXBlb2YgdHJhbnNsYXRlID09PSAndW5kZWZpbmVkJykge1xuICAgIGNvbnN0IG11bHRpcGxpZXIgPSBzd2lwZXIucnRsVHJhbnNsYXRlID8gLTEgOiAxO1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZVxuICAgIHRyYW5zbGF0ZSA9IHN3aXBlciAmJiBzd2lwZXIudHJhbnNsYXRlICYmIHN3aXBlci50cmFuc2xhdGUgKiBtdWx0aXBsaWVyIHx8IDA7XG4gIH1cbiAgY29uc3QgcGFyYW1zID0gc3dpcGVyLnBhcmFtcztcbiAgY29uc3QgdHJhbnNsYXRlc0RpZmYgPSBzd2lwZXIubWF4VHJhbnNsYXRlKCkgLSBzd2lwZXIubWluVHJhbnNsYXRlKCk7XG4gIGxldCB7XG4gICAgcHJvZ3Jlc3MsXG4gICAgaXNCZWdpbm5pbmcsXG4gICAgaXNFbmQsXG4gICAgcHJvZ3Jlc3NMb29wXG4gIH0gPSBzd2lwZXI7XG4gIGNvbnN0IHdhc0JlZ2lubmluZyA9IGlzQmVnaW5uaW5nO1xuICBjb25zdCB3YXNFbmQgPSBpc0VuZDtcbiAgaWYgKHRyYW5zbGF0ZXNEaWZmID09PSAwKSB7XG4gICAgcHJvZ3Jlc3MgPSAwO1xuICAgIGlzQmVnaW5uaW5nID0gdHJ1ZTtcbiAgICBpc0VuZCA9IHRydWU7XG4gIH0gZWxzZSB7XG4gICAgcHJvZ3Jlc3MgPSAodHJhbnNsYXRlIC0gc3dpcGVyLm1pblRyYW5zbGF0ZSgpKSAvIHRyYW5zbGF0ZXNEaWZmO1xuICAgIGNvbnN0IGlzQmVnaW5uaW5nUm91bmRlZCA9IE1hdGguYWJzKHRyYW5zbGF0ZSAtIHN3aXBlci5taW5UcmFuc2xhdGUoKSkgPCAxO1xuICAgIGNvbnN0IGlzRW5kUm91bmRlZCA9IE1hdGguYWJzKHRyYW5zbGF0ZSAtIHN3aXBlci5tYXhUcmFuc2xhdGUoKSkgPCAxO1xuICAgIGlzQmVnaW5uaW5nID0gaXNCZWdpbm5pbmdSb3VuZGVkIHx8IHByb2dyZXNzIDw9IDA7XG4gICAgaXNFbmQgPSBpc0VuZFJvdW5kZWQgfHwgcHJvZ3Jlc3MgPj0gMTtcbiAgICBpZiAoaXNCZWdpbm5pbmdSb3VuZGVkKSBwcm9ncmVzcyA9IDA7XG4gICAgaWYgKGlzRW5kUm91bmRlZCkgcHJvZ3Jlc3MgPSAxO1xuICB9XG4gIGlmIChwYXJhbXMubG9vcCkge1xuICAgIGNvbnN0IGZpcnN0U2xpZGVJbmRleCA9IHN3aXBlci5nZXRTbGlkZUluZGV4QnlEYXRhKDApO1xuICAgIGNvbnN0IGxhc3RTbGlkZUluZGV4ID0gc3dpcGVyLmdldFNsaWRlSW5kZXhCeURhdGEoc3dpcGVyLnNsaWRlcy5sZW5ndGggLSAxKTtcbiAgICBjb25zdCBmaXJzdFNsaWRlVHJhbnNsYXRlID0gc3dpcGVyLnNsaWRlc0dyaWRbZmlyc3RTbGlkZUluZGV4XTtcbiAgICBjb25zdCBsYXN0U2xpZGVUcmFuc2xhdGUgPSBzd2lwZXIuc2xpZGVzR3JpZFtsYXN0U2xpZGVJbmRleF07XG4gICAgY29uc3QgdHJhbnNsYXRlTWF4ID0gc3dpcGVyLnNsaWRlc0dyaWRbc3dpcGVyLnNsaWRlc0dyaWQubGVuZ3RoIC0gMV07XG4gICAgY29uc3QgdHJhbnNsYXRlQWJzID0gTWF0aC5hYnModHJhbnNsYXRlKTtcbiAgICBpZiAodHJhbnNsYXRlQWJzID49IGZpcnN0U2xpZGVUcmFuc2xhdGUpIHtcbiAgICAgIHByb2dyZXNzTG9vcCA9ICh0cmFuc2xhdGVBYnMgLSBmaXJzdFNsaWRlVHJhbnNsYXRlKSAvIHRyYW5zbGF0ZU1heDtcbiAgICB9IGVsc2Uge1xuICAgICAgcHJvZ3Jlc3NMb29wID0gKHRyYW5zbGF0ZUFicyArIHRyYW5zbGF0ZU1heCAtIGxhc3RTbGlkZVRyYW5zbGF0ZSkgLyB0cmFuc2xhdGVNYXg7XG4gICAgfVxuICAgIGlmIChwcm9ncmVzc0xvb3AgPiAxKSBwcm9ncmVzc0xvb3AgLT0gMTtcbiAgfVxuICBPYmplY3QuYXNzaWduKHN3aXBlciwge1xuICAgIHByb2dyZXNzLFxuICAgIHByb2dyZXNzTG9vcCxcbiAgICBpc0JlZ2lubmluZyxcbiAgICBpc0VuZFxuICB9KTtcbiAgaWYgKHBhcmFtcy53YXRjaFNsaWRlc1Byb2dyZXNzIHx8IHBhcmFtcy5jZW50ZXJlZFNsaWRlcyAmJiBwYXJhbXMuYXV0b0hlaWdodCkgc3dpcGVyLnVwZGF0ZVNsaWRlc1Byb2dyZXNzKHRyYW5zbGF0ZSk7XG4gIGlmIChpc0JlZ2lubmluZyAmJiAhd2FzQmVnaW5uaW5nKSB7XG4gICAgc3dpcGVyLmVtaXQoJ3JlYWNoQmVnaW5uaW5nIHRvRWRnZScpO1xuICB9XG4gIGlmIChpc0VuZCAmJiAhd2FzRW5kKSB7XG4gICAgc3dpcGVyLmVtaXQoJ3JlYWNoRW5kIHRvRWRnZScpO1xuICB9XG4gIGlmICh3YXNCZWdpbm5pbmcgJiYgIWlzQmVnaW5uaW5nIHx8IHdhc0VuZCAmJiAhaXNFbmQpIHtcbiAgICBzd2lwZXIuZW1pdCgnZnJvbUVkZ2UnKTtcbiAgfVxuICBzd2lwZXIuZW1pdCgnc
5196HJvZ3Jlc3MnLCBwcm9ncmVzcyk7XG59XG5cbmNvbnN0IHRvZ2dsZVNsaWRlQ2xhc3NlcyA9IChzbGlkZUVsLCBjb25kaXRpb24sIGNsYXNzTmFtZSkgPT4ge1xuICBpZiAoY29uZGl0aW9uICYmICFzbGlkZUVsLmNsYXNzTGlzdC5jb250YWlucyhjbGFzc05hbWUpKSB7XG4gICAgc2xpZGVFbC5jbGFzc0xpc3QuYWRkKGNsYXNzTmFtZSk7XG4gIH0gZWxzZSBpZiAoIWNvbmRpdGlvbiAmJiBzbGlkZUVsLmNsYXNzTGlzdC5jb250YWlucyhjbGFzc05hbWUpKSB7XG4gICAgc2xpZGVFbC5jbGFzc0xpc3QucmVtb3ZlKGNsYXNzTmFtZSk7XG4gIH1cbn07XG5mdW5jdGlvbiB1cGRhdGVTbGlkZXNDbGFzc2VzKCkge1xuICBjb25zdCBzd2lwZXIgPSB0aGlzO1xuICBjb25zdCB7XG4gICAgc2xpZGVzLFxuICAgIHBhcmFtcyxcbiAgICBzbGlkZXNFbCxcbiAgICBhY3RpdmVJbmRleFxuICB9ID0gc3dpcGVyO1xuICBjb25zdCBpc1ZpcnR1YWwgPSBzd2lwZXIudmlydHVhbCAmJiBwYXJhbXMudmlydHVhbC5lbmFibGVkO1xuICBjb25zdCBncmlkRW5hYmxlZCA9IHN3aXBlci5ncmlkICYmIHBhcmFtcy5ncmlkICYmIHBhcmFtcy5ncmlkLnJvd3MgPiAxO1xuICBjb25zdCBnZXRGaWx0ZXJlZFNsaWRlID0gc2VsZWN0b3IgPT4ge1xuICAgIHJldHVybiBlbGVtZW50Q2hpbGRyZW4oc2xpZGVzRWwsIGAuJHtwYXJhbXMuc2xpZGVDbGFzc30ke3NlbGVjdG9yfSwgc3dpcGVyLXNsaWRlJHtzZWxlY3Rvcn1gKVswXTtcbiAgfTtcbiAgbGV0IGFjdGl2ZVNsaWRlO1xuICBsZXQgcHJldlNsaWRlO1xuICBsZXQgbmV4dFNsaWRlO1xuICBpZiAoaXNWaXJ0dWFsKSB7XG4gICAgaWYgKHBhcmFtcy5sb29wKSB7XG4gICAgICBsZXQgc2xpZGVJbmRleCA9IGFjdGl2ZUluZGV4IC0gc3dpcGVyLnZpcnR1YWwuc2xpZGVzQmVmb3JlO1xuICAgICAgaWYgKHNsaWRlSW5kZXggPCAwKSBzbGlkZUluZGV4ID0gc3dpcGVyLnZpcnR1YWwuc2xpZGVzLmxlbmd0aCArIHNsaWRlSW5kZXg7XG4gICAgICBpZiAoc2xpZGVJbmRleCA+PSBzd2lwZXIudmlydHVhbC5zbGlkZXMubGVuZ3RoKSBzbGlkZUluZGV4IC09IHN3aXBlci52aXJ0dWFsLnNsaWRlcy5sZW5ndGg7XG4gICAgICBhY3RpdmVTbGlkZSA9IGdldEZpbHRlcmVkU2xpZGUoYFtkYXRhLXN3aXBlci1zbGlkZS1pbmRleD1cIiR7c2xpZGVJbmRleH1cIl1gKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYWN0aXZlU2xpZGUgPSBnZXRGaWx0ZXJlZFNsaWRlKGBbZGF0YS1zd2lwZXItc2xpZGUtaW5kZXg9XCIke2FjdGl2ZUluZGV4fVwiXWApO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBpZiAoZ3JpZEVuYWJsZWQpIHtcbiAgICAgIGFjdGl2ZVNsaWRlID0gc2xpZGVzLmZpbHRlcihzbGlkZUVsID0+IHNsaWRlRWwuY29sdW1uID09PSBhY3RpdmVJbmRleClbMF07XG4gICAgICBuZXh0U2xpZGUgPSBzbGlkZXMuZmlsdGVyKHNsaWRlRWwgPT4gc2xpZGVFbC5jb2x1bW4gPT09IGFjdGl2ZUluZGV4ICsgMSlbMF07XG4gICAgICBwcmV2U2xpZGUgPSBzbGlkZXMuZmlsdGVyKHNsaWRlRWwgPT4gc2xpZGVFbC5jb2x1bW4gPT09IGFjdGl2ZUluZGV4IC0gMSlbMF07XG4gICAgfSBlbHNlIHtcbiAgICAgIGFjdGl2ZVNsaWRlID0gc2xpZGVzW2FjdGl2ZUluZGV4XTtcbiAgICB9XG4gIH1cbiAgaWYgKGFjdGl2ZVNsaWRlKSB7XG4gICAgaWYgKCFncmlkRW5hYmxlZCkge1xuICAgICAgLy8gTmV4dCBTbGlkZVxuICAgICAgbmV4dFNsaWRlID0gZWxlbWVudE5leHRBbGwoYWN0aXZlU2xpZGUsIGAuJHtwYXJhbXMuc2xpZGVDbGFzc30sIHN3aXBlci1zbGlkZWApWzBdO1xuICAgICAgaWYgKHBhcmFtcy5sb29wICYmICFuZXh0U2xpZGUpIHtcbiAgICAgICAgbmV4dFNsaWRlID0gc2xpZGVzWzBdO1xuICAgICAgfVxuXG4gICAgICAvLyBQcmV2IFNsaWRlXG4gICAgICBwcmV2U2xpZGUgPSBlbGVtZW50UHJldkFsbChhY3RpdmVTbGlkZSwgYC4ke3BhcmFtcy5zbGlkZUNsYXNzfSwgc3dpcGVyLXNsaWRlYClbMF07XG4gICAgICBpZiAocGFyYW1zLmxvb3AgJiYgIXByZXZTbGlkZSA9PT0gMCkge1xuICAgICAgICBwcmV2U2xpZGUgPSBzbGlkZXNbc2xpZGVzLmxlbmd0aCAtIDFdO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBzbGlkZXMuZm9yRWFjaChzbGlkZUVsID0+IHtcbiAgICB0b2dnbGVTbGlkZUNsYXNzZXMoc2xpZGVFbCwgc2xpZGVFbCA9PT0gYWN0aXZlU2xpZGUsIHBhcmFtcy5zbGlkZUFjdGl2ZUNsYXNzKTtcbiAgICB0b2dnbGVTbGlkZUNsYXNzZXMoc2xpZGVFbCwgc2xpZGVFbCA9PT0gbmV4dFNsaWRlLCBwYXJhbXMuc2xpZGVOZXh0Q2xhc3MpO1xuICAgIHRvZ2dsZVNsaWRlQ2xhc3NlcyhzbGlkZUVsLCBzbGlkZUVsID09PSBwcmV2U2xpZGUsIHBhcmFtcy5zbGlkZVByZXZDbGFzcyk7XG4gIH0pO1xuICBzd2lwZXIuZW1pdFNsaWRlc0NsYXNzZXMoKTtcbn1cblxuY29uc3QgcHJvY2Vzc0xhenlQcmVsb2FkZXIgPSAoc3dpcGVyLCBpbWFnZUVsKSA9PiB7XG4gIGlmICghc3dpcGVyIHx8IHN3aXBlci5kZXN0cm95ZWQgfHwgIXN3aXBlci5wYXJhbXMpIHJldHVybjtcbiAgY29uc3Qgc2xpZGVTZWxlY3RvciA9ICgpID0+IHN3aXBlci5pc0VsZW1lbnQgPyBgc3dpcGVyLXNsaWRlYCA6IGAuJHtzd2lwZXIucGFyYW1zLnNsaWRlQ2xhc3N9YDtcbiAgY29uc3Qgc2xpZGVFbCA9IGltYWdlRWwuY2xvc2VzdChzbGlkZVNlbGVjdG9yKCkpO1xuICBpZiAoc2xpZGVFbCkge1xuICAgIGxldCBsYXp5RWwgPSBzbGlkZUVsLnF1ZXJ5U2VsZWN0b3IoYC4ke3N3aXBlci5wYXJhbXMubGF6eVByZWxvYWRlckNsYXNzfWApO1xuICAgIGlmICghbGF6eUVsICYmIHN3aXBlci5pc0VsZW1lbnQpIHtcbiAgICAgIGlmIChzbGlkZUVsLnNoYWRvd1Jvb3QpIHtcbiAgICAgICAgbGF6eUVsID0gc2xpZGVFbC5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3IoYC4ke3N3aXBlci5wYXJhbXMubGF6eVByZWxvYWRlckNsYXNzfWApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gaW5pdCBsYXRlclxuICAgICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xuICAgICAgICAgIGlmIChzbGlkZUVsLnNoYWRvd1Jvb3QpIHtcbiAgICAgICAgICAgIGxhenlFbCA9IHNsaWRlRWwuc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yKGAuJHtzd2lwZXIucGFyYW1zLmxhenlQcmVsb2FkZXJDbGFzc31gKTtcbiAgICAgICAgICAgIGlmIChsYXp5RWwpIGxhenlFbC5yZW1vdmUoKTtcbiAgICAgICAgICB9XG4gICAgICAgI
5196H0pO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAobGF6eUVsKSBsYXp5RWwucmVtb3ZlKCk7XG4gIH1cbn07XG5jb25zdCB1bmxhenkgPSAoc3dpcGVyLCBpbmRleCkgPT4ge1xuICBpZiAoIXN3aXBlci5zbGlkZXNbaW5kZXhdKSByZXR1cm47XG4gIGNvbnN0IGltYWdlRWwgPSBzd2lwZXIuc2xpZGVzW2luZGV4XS5xdWVyeVNlbGVjdG9yKCdbbG9hZGluZz1cImxhenlcIl0nKTtcbiAgaWYgKGltYWdlRWwpIGltYWdlRWwucmVtb3ZlQXR0cmlidXRlKCdsb2FkaW5nJyk7XG59O1xuY29uc3QgcHJlbG9hZCA9IHN3aXBlciA9PiB7XG4gIGlmICghc3dpcGVyIHx8IHN3aXBlci5kZXN0cm95ZWQgfHwgIXN3aXBlci5wYXJhbXMpIHJldHVybjtcbiAgbGV0IGFtb3VudCA9IHN3aXBlci5wYXJhbXMubGF6eVByZWxvYWRQcmV2TmV4dDtcbiAgY29uc3QgbGVuID0gc3dpcGVyLnNsaWRlcy5sZW5ndGg7XG4gIGlmICghbGVuIHx8ICFhbW91bnQgfHwgYW1vdW50IDwgMCkgcmV0dXJuO1xuICBhbW91bnQgPSBNYXRoLm1pbihhbW91bnQsIGxlbik7XG4gIGNvbnN0IHNsaWRlc1BlclZpZXcgPSBzd2lwZXIucGFyYW1zLnNsaWRlc1BlclZpZXcgPT09ICdhdXRvJyA/IHN3aXBlci5zbGlkZXNQZXJWaWV3RHluYW1pYygpIDogTWF0aC5jZWlsKHN3aXBlci5wYXJhbXMuc2xpZGVzUGVyVmlldyk7XG4gIGNvbnN0IGFjdGl2ZUluZGV4ID0gc3dpcGVyLmFjdGl2ZUluZGV4O1xuICBpZiAoc3dpcGVyLnBhcmFtcy5ncmlkICYmIHN3aXBlci5wYXJhbXMuZ3JpZC5yb3dzID4gMSkge1xuICAgIGNvbnN0IGFjdGl2ZUNvbHVtbiA9IGFjdGl2ZUluZGV4O1xuICAgIGNvbnN0IHByZWxvYWRDb2x1bW5zID0gW2FjdGl2ZUNvbHVtbiAtIGFtb3VudF07XG4gICAgcHJlbG9hZENvbHVtbnMucHVzaCguLi5BcnJheS5mcm9tKHtcbiAgICAgIGxlbmd0aDogYW1vdW50XG4gICAgfSkubWFwKChfLCBpKSA9PiB7XG4gICAgICByZXR1cm4gYWN0aXZlQ29sdW1uICsgc2xpZGVzUGVyVmlldyArIGk7XG4gICAgfSkpO1xuICAgIHN3aXBlci5zbGlkZXMuZm9yRWFjaCgoc2xpZGVFbCwgaSkgPT4ge1xuICAgICAgaWYgKHByZWxvYWRDb2x1bW5zLmluY2x1ZGVzKHNsaWRlRWwuY29sdW1uKSkgdW5sYXp5KHN3aXBlciwgaSk7XG4gICAgfSk7XG4gICAgcmV0dXJuO1xuICB9XG4gIGNvbnN0IHNsaWRlSW5kZXhMYXN0SW5WaWV3ID0gYWN0aXZlSW5kZXggKyBzbGlkZXNQZXJWaWV3IC0gMTtcbiAgaWYgKHN3aXBlci5wYXJhbXMucmV3aW5kIHx8IHN3aXBlci5wYXJhbXMubG9vcCkge1xuICAgIGZvciAobGV0IGkgPSBhY3RpdmVJbmRleCAtIGFtb3VudDsgaSA8PSBzbGlkZUluZGV4TGFzdEluVmlldyArIGFtb3VudDsgaSArPSAxKSB7XG4gICAgICBjb25zdCByZWFsSW5kZXggPSAoaSAlIGxlbiArIGxlbikgJSBsZW47XG4gICAgICBpZiAocmVhbEluZGV4IDwgYWN0aXZlSW5kZXggfHwgcmVhbEluZGV4ID4gc2xpZGVJbmRleExhc3RJblZpZXcpIHVubGF6eShzd2lwZXIsIHJlYWxJbmRleCk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGZvciAobGV0IGkgPSBNYXRoLm1heChhY3RpdmVJbmRleCAtIGFtb3VudCwgMCk7IGkgPD0gTWF0aC5taW4oc2xpZGVJbmRleExhc3RJblZpZXcgKyBhbW91bnQsIGxlbiAtIDEpOyBpICs9IDEpIHtcbiAgICAgIGlmIChpICE9PSBhY3RpdmVJbmRleCAmJiAoaSA+IHNsaWRlSW5kZXhMYXN0SW5WaWV3IHx8IGkgPCBhY3RpdmVJbmRleCkpIHtcbiAgICAgICAgdW5sYXp5KHN3aXBlciwgaSk7XG4gICAgICB9XG4gICAgfVxuICB9XG59O1xuXG5mdW5jdGlvbiBnZXRBY3RpdmVJbmRleEJ5VHJhbnNsYXRlKHN3aXBlcikge1xuICBjb25zdCB7XG4gICAgc2xpZGVzR3JpZCxcbiAgICBwYXJhbXNcbiAgfSA9IHN3aXBlcjtcbiAgY29uc3QgdHJhbnNsYXRlID0gc3dpcGVyLnJ0bFRyYW5zbGF0ZSA/IHN3aXBlci50cmFuc2xhdGUgOiAtc3dpcGVyLnRyYW5zbGF0ZTtcbiAgbGV0IGFjdGl2ZUluZGV4O1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHNsaWRlc0dyaWQubGVuZ3RoOyBpICs9IDEpIHtcbiAgICBpZiAodHlwZW9mIHNsaWRlc0dyaWRbaSArIDFdICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgaWYgKHRyYW5zbGF0ZSA+PSBzbGlkZXNHcmlkW2ldICYmIHRyYW5zbGF0ZSA8IHNsaWRlc0dyaWRbaSArIDFdIC0gKHNsaWRlc0dyaWRbaSArIDFdIC0gc2xpZGVzR3JpZFtpXSkgLyAyKSB7XG4gICAgICAgIGFjdGl2ZUluZGV4ID0gaTtcbiAgICAgIH0gZWxzZSBpZiAodHJhbnNsYXRlID49IHNsaWRlc0dyaWRbaV0gJiYgdHJhbnNsYXRlIDwgc2xpZGVzR3JpZFtpICsgMV0pIHtcbiAgICAgICAgYWN0aXZlSW5kZXggPSBpICsgMTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHRyYW5zbGF0ZSA+PSBzbGlkZXNHcmlkW2ldKSB7XG4gICAgICBhY3RpdmVJbmRleCA9IGk7XG4gICAgfVxuICB9XG4gIC8vIE5vcm1hbGl6ZSBzbGlkZUluZGV4XG4gIGlmIChwYXJhbXMubm9ybWFsaXplU2xpZGVJbmRleCkge1xuICAgIGlmIChhY3RpdmVJbmRleCA8IDAgfHwgdHlwZW9mIGFjdGl2ZUluZGV4ID09PSAndW5kZWZpbmVkJykgYWN0aXZlSW5kZXggPSAwO1xuICB9XG4gIHJldHVybiBhY3RpdmVJbmRleDtcbn1cbmZ1bmN0aW9uIHVwZGF0ZUFjdGl2ZUluZGV4KG5ld0FjdGl2ZUluZGV4KSB7XG4gIGNvbnN0IHN3aXBlciA9IHRoaXM7XG4gIGNvbnN0IHRyYW5zbGF0ZSA9IHN3aXBlci5ydGxUcmFuc2xhdGUgPyBzd2lwZXIudHJhbnNsYXRlIDogLXN3aXBlci50cmFuc2xhdGU7XG4gIGNvbnN0IHtcbiAgICBzbmFwR3JpZCxcbiAgICBwYXJhbXMsXG4gICAgYWN0aXZlSW5kZXg6IHByZXZpb3VzSW5kZXgsXG4gICAgcmVhbEluZGV4OiBwcmV2aW91c1JlYWxJbmRleCxcbiAgICBzbmFwSW5kZXg6IHByZXZpb3VzU25hcEluZGV4XG4gIH0gPSBzd2lwZXI7XG4gIGxldCBhY3RpdmVJbmRleCA9IG5ld0FjdGl2ZUluZGV4O1xuICBsZXQgc25hcEluZGV4O1xuICBjb25zdCBnZXRWaXJ0dWFsUmVhbEluZGV4ID0gYUluZGV4ID0+IHtcbiAgICBsZXQgcmVhbEluZGV4ID0gYUluZGV4IC0gc3dpcGVyLnZpcnR1YWwuc2xpZGVzQmVmb3JlO1xuICAgIGlmIChyZWFsSW5kZXggPCAwKSB7XG4gICAgICByZWFsSW5kZXggPSBzd2lwZXIudmlydHVhbC5zbGlkZXMubGVuZ3RoICsgcmVhbEluZGV4O1xuICAgIH1cbiAgICBpZiAocmVhbEluZGV4ID49IHN3aXBlci52aXJ0dWFsLnNsaWRlcy5sZW5ndGgpIHtcbiAgICAgIHJlYWxJbmRleCAtPSBzd2lwZXIudmlydHVhbC5zbGlkZXMubGVuZ3RoO1xuICAgIH1cbiAgICByZXR1cm4gcmVhbEluZGV4O1xuICB9O1xuICBpZiAodHlwZW9mIGFjdGl2ZUluZGV4ID09PSAndW5kZWZpbmVkJykge1xuICAgIGFjdGl2ZUluZGV4ID0gZ2V0QWN0aXZlSW5kZXhCeVRyYW5zbGF0ZShzd2lwZXIpO1xuICB9XG4gIGlmIChzbmFwR3JpZC5pbmRleE9mKHRyYW5zbGF0ZSkgPj0gMCkge1xuICAgIHNuYXBJbmRleCA9IHNuYXBHcmlkLmluZGV4T2YodHJhbnNsYXRlKTtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCBza2lwID0gTWF0aC5taW4ocGFyYW1zLnNsaWRlc1Blckdyb3VwU2tpcCwgYWN0aXZlSW5kZXgpO1xuICAgIHNuYXBJbmRleCA9IHNraXAgKyBNYXRoLmZsb29yKChhY3RpdmVJbmRleCAtIHNraXApIC8gcGFyYW1zLnNsaWRlc1Blckdyb3VwKTtcbiAgfVxuICBpZiAoc25hcEluZGV4ID49IHNuYXBHcmlkLmxlbmd0aCkgc25hcEluZGV4ID0gc25hcEdyaWQubGVuZ3RoIC0gMTtcbiAgaWYgKGFjdGl2ZUluZGV4ID09PSBwcmV2aW91c0luZGV4ICYmICFzd2lwZXIucGFyYW1zLmxvb3ApIHtcbiAgICBpZiAoc25hcEluZGV4ICE9PSBwcmV2aW91c1NuYXBJbmRleCkge1xuICAgICAgc3dpcGVyLnNuYXBJbmRleCA9IHNuYXBJbmRleDtcbiAgICAgIHN3aXBlci5lbWl0KCdzbmFwSW5kZXhDaGFuZ2UnKTtcbiAgICB9XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmIChhY3RpdmVJbmRleCA9PT0gcHJldmlvdXNJbmRleCAmJiBzd2lwZXIucGFyYW1zLmxvb3AgJiYgc3dpcGVyLnZpcnR1YWwgJiYgc3dpcGVyLnBhcmFtcy52aXJ0dWFsLmVuYWJsZWQpIHtcbiAgICBzd2lwZXIucmVhbEluZGV4ID0gZ2V0VmlydHVhbFJlYWxJbmRleChhY3RpdmVJbmRleCk7XG4gICAgcmV0dXJuO1xuICB9XG4gIGNvbnN0IGdyaWRFbmFibGVkID0gc3dpcGVyLmdyaWQgJiYgcGFyYW1zLmdyaWQgJiYgcGFyYW1zLmdyaWQucm93cyA+IDE7XG5cbiAgLy8gR2V0IHJlYWwgaW5kZXhcbiAgbGV0IHJlYWxJbmRleDtcbiAgaWYgKHN3aXBlci52aXJ0dWFsICYmIHBhcmFtcy52aXJ0dWFsLmVuYWJsZWQgJiYgcGFyYW1zLmxvb3ApIHtcbiAgICByZWFsSW5kZXggPSBnZXRWaXJ0dWFsUmVhbEluZGV4KGFjdGl2ZUluZGV4KTtcbiAgfSBlbHNlIGlmIChncmlkRW5hYmxlZCkge1xuICAgIGNvbnN0IGZpcnN0U2xpZGVJbkNvbHVtbiA9IHN3aXBlci5zbGlkZXMuZmlsdGVyKHNsaWRlRWwgPT4gc2xpZGVFbC5jb2x1bW4gPT09IGFjdGl2ZUluZGV4KVswXTtcbiAgICBsZXQgYWN0aXZlU2xpZGVJbmRleCA9IHBhcnNlSW50KGZpcnN0U2xpZGVJbkNvbHVtbi5nZXRBdHRyaWJ1dGUoJ2RhdGEtc3dpcGVyLXNsaWRlLWluZGV4JyksIDEwKTtcbiAgICBpZiAoTnVtYmVyLmlzTmFOKGFjdGl2ZVNsaWRlSW5kZXgpKSB7XG4gICAgICBhY3RpdmVTbGlkZUluZGV4ID0gTWF0aC5tYXgoc3dpcGVyLnNsaWRlcy5pbmRleE9mKGZpcnN0U2xpZGVJbkNvbHVtbiksIDApO1xuICAgIH1cbiAgICByZWFsSW5kZXggPSBNYXRoLmZsb29yKGFjdGl2ZVNsaWRlSW5kZXggLyBwYXJhbXMuZ3JpZC5yb3dzKTtcbiAgfSBlbHNlIGlmIChzd2lwZXIuc2xpZGVzW2FjdGl2ZUluZGV4XSkge1xuICAgIGNvbnN0IHNsaWRlSW5kZXggPSBzd2lwZXIuc2xpZGVzW2FjdGl2ZUluZGV4XS5nZXRBdHRyaWJ1dGUoJ2RhdGEtc3dpcGVyLXNsaWRlLWluZGV4Jyk7XG4gICAgaWYgKHNsaWRlSW5kZXgpIHtcbiAgICAgIHJlYWxJbmRleCA9IHBhcnNlSW50KHNsaWRlSW5kZXgsIDEwKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVhbEluZGV4ID0gYWN0aXZlSW5kZXg7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHJlYWxJbmRleCA9IGFjdGl2ZUluZGV4O1xuICB9XG4gIE9iamVjdC5hc3NpZ24oc3dpcGVyLCB7XG4gICAgcHJldmlvdXNTbmFwSW5kZXgsXG4gICAgc25hcEluZGV4LFxuICAgIHByZXZpb3VzUmVhbEluZGV4LFxuICAgIHJlYWxJbmRleCxcbiAgICBwcmV2aW91c0luZGV4LFxuICAgIGFjdGl2ZUluZGV4XG4gIH0pO1xuICBpZiAoc3dpcGVyLmluaXRpYWxpemVkKSB7XG4gICAgcHJlbG9hZChzd2lwZXIpO1xuICB9XG4gI
5196HN3aXBlci5lbWl0KCdhY3RpdmVJbmRleENoYW5nZScpO1xuICBzd2lwZXIuZW1pdCgnc25hcEluZGV4Q2hhbmdlJyk7XG4gIGlmIChzd2lwZXIuaW5pdGlhbGl6ZWQgfHwgc3dpcGVyLnBhcmFtcy5ydW5DYWxsYmFja3NPbkluaXQpIHtcbiAgICBpZiAocHJldmlvdXNSZWFsSW5kZXggIT09IHJlYWxJbmRleCkge1xuICAgICAgc3dpcGVyLmVtaXQoJ3JlYWxJbmRleENoYW5nZScpO1xuICAgIH1cbiAgICBzd2lwZXIuZW1pdCgnc2xpZGVDaGFuZ2UnKTtcbiAgfVxufVxuXG5mdW5jdGlvbiB1cGRhdGVDbGlja2VkU2xpZGUoZWwsIHBhdGgpIHtcbiAgY29uc3Qgc3dpcGVyID0gdGhpcztcbiAgY29uc3QgcGFyYW1zID0gc3dpcGVyLnBhcmFtcztcbiAgbGV0IHNsaWRlID0gZWwuY2xvc2VzdChgLiR7cGFyYW1zLnNsaWRlQ2xhc3N9LCBzd2lwZXItc2xpZGVgKTtcbiAgaWYgKCFzbGlkZSAmJiBzd2lwZXIuaXNFbGVtZW50ICYmIHBhdGggJiYgcGF0aC5sZW5ndGggPiAxICYmIHBhdGguaW5jbHVkZXMoZWwpKSB7XG4gICAgWy4uLnBhdGguc2xpY2UocGF0aC5pbmRleE9mKGVsKSArIDEsIHBhdGgubGVuZ3RoKV0uZm9yRWFjaChwYXRoRWwgPT4ge1xuICAgICAgaWYgKCFzbGlkZSAmJiBwYXRoRWwubWF0Y2hlcyAmJiBwYXRoRWwubWF0Y2hlcyhgLiR7cGFyYW1zLnNsaWRlQ2xhc3N9LCBzd2lwZXItc2xpZGVgKSkge1xuICAgICAgICBzbGlkZSA9IHBhdGhFbDtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuICBsZXQgc2xpZGVGb3VuZCA9IGZhbHNlO1xuICBsZXQgc2xpZGVJbmRleDtcbiAgaWYgKHNsaWRlKSB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzd2lwZXIuc2xpZGVzLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICBpZiAoc3dpcGVyLnNsaWRlc1tpXSA9PT0gc2xpZGUpIHtcbiAgICAgICAgc2xpZGVGb3VuZCA9IHRydWU7XG4gICAgICAgIHNsaWRlSW5kZXggPSBpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgaWYgKHNsaWRlICYmIHNsaWRlRm91bmQpIHtcbiAgICBzd2lwZXIuY2xpY2tlZFNsaWRlID0gc2xpZGU7XG4gICAgaWYgKHN3aXBlci52aXJ0dWFsICYmIHN3aXBlci5wYXJhbXMudmlydHVhbC5lbmFibGVkKSB7XG4gICAgICBzd2lwZXIuY2xpY2tlZEluZGV4ID0gcGFyc2VJbnQoc2xpZGUuZ2V0QXR0cmlidXRlKCdkYXRhLXN3aXBlci1zbGlkZS1pbmRleCcpLCAxMCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN3aXBlci5jbGlja2VkSW5kZXggPSBzbGlkZUluZGV4O1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBzd2lwZXIuY2xpY2tlZFNsaWRlID0gdW5kZWZpbmVkO1xuICAgIHN3aXBlci5jbGlja2VkSW5kZXggPSB1bmRlZmluZWQ7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmIChwYXJhbXMuc2xpZGVUb0NsaWNrZWRTbGlkZSAmJiBzd2lwZXIuY2xpY2tlZEluZGV4ICE9PSB1bmRlZmluZWQgJiYgc3dpcGVyLmNsaWNrZWRJbmRleCAhPT0gc3dpcGVyLmFjdGl2ZUluZGV4KSB7XG4gICAgc3dpcGVyLnNsaWRlVG9DbGlja2VkU2xpZGUoKTtcbiAgfVxufVxuXG52YXIgdXBkYXRlID0ge1xuICB1cGRhdGVTaXplLFxuICB1cGRhdGVTbGlkZXMsXG4gIHVwZGF0ZUF1dG9IZWlnaHQsXG4gIHVwZGF0ZVNsaWRlc09mZnNldCxcbiAgdXBkYXRlU2xpZGVzUHJvZ3Jlc3MsXG4gIHVwZGF0ZVByb2dyZXNzLFxuICB1cGRhdGVTbGlkZXNDbGFzc2VzLFxuICB1cGRhdGVBY3RpdmVJbmRleCxcbiAgdXBkYXRlQ2xpY2tlZFNsaWRlXG59O1xuXG5mdW5jdGlvbiBnZXRTd2lwZXJUcmFuc2xhdGUoYXhpcykge1xuICBpZiAoYXhpcyA9PT0gdm9pZCAwKSB7XG4gICAgYXhpcyA9IHRoaXMuaXNIb3Jpem9udGFsKCkgPyAneCcgOiAneSc7XG4gIH1cbiAgY29uc3Qgc3dpcGVyID0gdGhpcztcbiAgY29uc3Qge1xuICAgIHBhcmFtcyxcbiAgICBydGxUcmFuc2xhdGU6IHJ0bCxcbiAgICB0cmFuc2xhdGUsXG4gICAgd3JhcHBlckVsXG4gIH0gPSBzd2lwZXI7XG4gIGlmIChwYXJhbXMudmlydHVhbFRyYW5zbGF0ZSkge1xuICAgIHJldHVybiBydGwgPyAtdHJhbnNsYXRlIDogdHJhbnNsYXRlO1xuICB9XG4gIGlmIChwYXJhbXMuY3NzTW9kZSkge1xuICAgIHJldHVybiB0cmFuc2xhdGU7XG4gIH1cbiAgbGV0IGN1cnJlbnRUcmFuc2xhdGUgPSBnZXRUcmFuc2xhdGUod3JhcHBlckVsLCBheGlzKTtcbiAgY3VycmVudFRyYW5zbGF0ZSArPSBzd2lwZXIuY3NzT3ZlcmZsb3dBZGp1c3RtZW50KCk7XG4gIGlmIChydGwpIGN1cnJlbnRUcmFuc2xhdGUgPSAtY3VycmVudFRyYW5zbGF0ZTtcbiAgcmV0dXJuIGN1cnJlbnRUcmFuc2xhdGUgfHwgMDtcbn1cblxuZnVuY3Rpb24gc2V0VHJhbnNsYXRlKHRyYW5zbGF0ZSwgYnlDb250cm9sbGVyKSB7XG4gIGNvbnN0IHN3aXBlciA9IHRoaXM7XG4gIGNvbnN0IHtcbiAgICBydGxUcmFuc2xhdGU6IHJ0bCxcbiAgICBwYXJhbXMsXG4gICAgd3JhcHBlckVsLFxuICAgIHByb2dyZXNzXG4gIH0gPSBzd2lwZXI7XG4gIGxldCB4ID0gMDtcbiAgbGV0IHkgPSAwO1xuICBjb25zdCB6ID0gMDtcbiAgaWYgKHN3aXBlci5pc0hvcml6b250YWwoKSkge1xuICAgIHggPSBydGwgPyAtdHJhbnNsYXRlIDogdHJhbnNsYXRlO1xuICB9IGVsc2Uge1xuICAgIHkgPSB0cmFuc2xhdGU7XG4gIH1cbiAgaWYgKHBhcmFtcy5yb3VuZExlbmd0aHMpIHtcbiAgICB4ID0gTWF0aC5mbG9vcih4KTtcbiAgICB5ID0gTWF0aC5mbG9vcih5KTtcbiAgfVxuICBzd2lwZXIucHJldmlvdXNUcmFuc2xhdGUgPSBzd2lwZXIudHJhbnNsYXRlO1xuICBzd2lwZXIudHJhbnNsYXRlID0gc3dpcGVyLmlzSG9yaXpvbnRhbCgpID8geCA6IHk7XG4gIGlmIChwYXJhbXMuY3NzTW9kZSkge1xuICAgIHdyYXBwZXJFbFtzd2lwZXIuaXNIb3Jpem9udGFsKCkgPyAnc2Nyb2xsTGVmdCcgOiAnc2Nyb2xsVG9wJ10gPSBzd2lwZXIuaXNIb3Jpem9udGFsKCkgPyAteCA6IC15O1xuICB9IGVsc2UgaWYgKCFwYXJhbXMudmlydHVhbFRyYW5zbGF0ZSkge1xuICAgIGlmIChzd2lwZXIuaXNIb3Jpem9udGFsKCkpIHtcbiAgICAgIHggLT0gc3dpcGVyLmNzc092ZXJmbG93QWRqdXN0bWVudCgpO1xuICAgIH0gZWxzZSB7XG4gICAgICB5IC09IHN3aXBlci5jc3NPdmVyZmxvd0FkanVzdG1lbnQoKTtcbiAgICB9XG4gICAgd3JhcHBlckVsLnN0eWxlLnRyYW5zZm9ybSA9IGB0cmFuc2xhdGUzZCgke3h9cHgsICR7eX1weCwgJHt6fXB4KWA7XG4gIH1cblxuICAvLyBDaGVjayBpZiB3ZSBuZWVkIHRvIHVwZGF0ZSBwcm9ncmVzc1xuICBsZXQgbm
5196V3UHJvZ3Jlc3M7XG4gIGNvbnN0IHRyYW5zbGF0ZXNEaWZmID0gc3dpcGVyLm1heFRyYW5zbGF0ZSgpIC0gc3dpcGVyLm1pblRyYW5zbGF0ZSgpO1xuICBpZiAodHJhbnNsYXRlc0RpZmYgPT09IDApIHtcbiAgICBuZXdQcm9ncmVzcyA9IDA7XG4gIH0gZWxzZSB7XG4gICAgbmV3UHJvZ3Jlc3MgPSAodHJhbnNsYXRlIC0gc3dpcGVyLm1pblRyYW5zbGF0ZSgpKSAvIHRyYW5zbGF0ZXNEaWZmO1xuICB9XG4gIGlmIChuZXdQcm9ncmVzcyAhPT0gcHJvZ3Jlc3MpIHtcbiAgICBzd2lwZXIudXBkYXRlUHJvZ3Jlc3ModHJhbnNsYXRlKTtcbiAgfVxuICBzd2lwZXIuZW1pdCgnc2V0VHJhbnNsYXRlJywgc3dpcGVyLnRyYW5zbGF0ZSwgYnlDb250cm9sbGVyKTtcbn1cblxuZnVuY3Rpb24gbWluVHJhbnNsYXRlKCkge1xuICByZXR1cm4gLXRoaXMuc25hcEdyaWRbMF07XG59XG5cbmZ1bmN0aW9uIG1heFRyYW5zbGF0ZSgpIHtcbiAgcmV0dXJuIC10aGlzLnNuYXBHcmlkW3RoaXMuc25hcEdyaWQubGVuZ3RoIC0gMV07XG59XG5cbmZ1bmN0aW9uIHRyYW5zbGF0ZVRvKHRyYW5zbGF0ZSwgc3BlZWQsIHJ1bkNhbGxiYWNrcywgdHJhbnNsYXRlQm91bmRzLCBpbnRlcm5hbCkge1xuICBpZiAodHJhbnNsYXRlID09PSB2b2lkIDApIHtcbiAgICB0cmFuc2xhdGUgPSAwO1xuICB9XG4gIGlmIChzcGVlZCA9PT0gdm9pZCAwKSB7XG4gICAgc3BlZWQgPSB0aGlzLnBhcmFtcy5zcGVlZDtcbiAgfVxuICBpZiAocnVuQ2FsbGJhY2tzID09PSB2b2lkIDApIHtcbiAgICBydW5DYWxsYmFja3MgPSB0cnVlO1xuICB9XG4gIGlmICh0cmFuc2xhdGVCb3VuZHMgPT09IHZvaWQgMCkge1xuICAgIHRyYW5zbGF0ZUJvdW5kcyA9IHRydWU7XG4gIH1cbiAgY29uc3Qgc3dpcGVyID0gdGhpcztcbiAgY29uc3Qge1xuICAgIHBhcmFtcyxcbiAgICB3cmFwcGVyRWxcbiAgfSA9IHN3aXBlcjtcbiAgaWYgKHN3aXBlci5hbmltYXRpbmcgJiYgcGFyYW1zLnByZXZlbnRJbnRlcmFjdGlvbk9uVHJhbnNpdGlvbikge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBjb25zdCBtaW5UcmFuc2xhdGUgPSBzd2lwZXIubWluVHJhbnNsYXRlKCk7XG4gIGNvbnN0IG1heFRyYW5zbGF0ZSA9IHN3aXBlci5tYXhUcmFuc2xhdGUoKTtcbiAgbGV0IG5ld1RyYW5zbGF0ZTtcbiAgaWYgKHRyYW5zbGF0ZUJvdW5kcyAmJiB0cmFuc2xhdGUgPiBtaW5UcmFuc2xhdGUpIG5ld1RyYW5zbGF0ZSA9IG1pblRyYW5zbGF0ZTtlbHNlIGlmICh0cmFuc2xhdGVCb3VuZHMgJiYgdHJhbnNsYXRlIDwgbWF4VHJhbnNsYXRlKSBuZXdUcmFuc2xhdGUgPSBtYXhUcmFuc2xhdGU7ZWxzZSBuZXdUcmFuc2xhdGUgPSB0cmFuc2xhdGU7XG5cbiAgLy8gVXBkYXRlIHByb2dyZXNzXG4gIHN3aXBlci51cGRhdGVQcm9ncmVzcyhuZXdUcmFuc2xhdGUpO1xuICBpZiAocGFyYW1zLmNzc01vZGUpIHtcbiAgICBjb25zdCBpc0ggPSBzd2lwZXIuaXNIb3Jpem9udGFsKCk7XG4gICAgaWYgKHNwZWVkID09PSAwKSB7XG4gICAgICB3cmFwcGVyRWxbaXNIID8gJ3Njcm9sbExlZnQnIDogJ3Njcm9sbFRvcCddID0gLW5ld1RyYW5zbGF0ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKCFzd2lwZXIuc3VwcG9ydC5zbW9vdGhTY3JvbGwpIHtcbiAgICAgICAgYW5pbWF0ZUNTU01vZGVTY3JvbGwoe1xuICAgICAgICAgIHN3aXBlcixcbiAgICAgICAgICB0YXJnZXRQb3NpdGlvbjogLW5ld1RyYW5zbGF0ZSxcbiAgICAgICAgICBzaWRlOiBpc0ggPyAnbGVmdCcgOiAndG9wJ1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgICB3cmFwcGVyRWwuc2Nyb2xsVG8oe1xuICAgICAgICBbaXNIID8gJ2xlZnQnIDogJ3RvcCddOiAtbmV3VHJhbnNsYXRlLFxuICAgICAgICBiZWhhdmlvcjogJ3Ntb290aCdcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBpZiAoc3BlZWQgPT09IDApIHtcbiAgICBzd2lwZXIuc2V0VHJhbnNpdGlvbigwKTtcbiAgICBzd2lwZXIuc2V0VHJhbnNsYXRlKG5ld1RyYW5zbGF0ZSk7XG4gICAgaWYgKHJ1bkNhbGxiYWNrcykge1xuICAgICAgc3dpcGVyLmVtaXQoJ2JlZm9yZVRyYW5zaXRpb25TdGFydCcsIHNwZWVkLCBpbnRlcm5hbCk7XG4gICAgICBzd2lwZXIuZW1pdCgndHJhbnNpdGlvbkVuZCcpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBzd2lwZXIuc2V0VHJhbnNpdGlvbihzcGVlZCk7XG4gICAgc3dpcGVyLnNldFRyYW5zbGF0ZShuZXdUcmFuc2xhdGUpO1xuICAgIGlmIChydW5DYWxsYmFja3MpIHtcbiAgICAgIHN3aXBlci5lbWl0KCdiZWZvcmVUcmFuc2l0aW9uU3RhcnQnLCBzcGVlZCwgaW50ZXJuYWwpO1xuICAgICAgc3dpcGVyLmVtaXQoJ3RyYW5zaXRpb25TdGFydCcpO1xuICAgIH1cbiAgICBpZiAoIXN3aXBlci5hbmltYXRpbmcpIHtcbiAgICAgIHN3aXBlci5hbmltYXRpbmcgPSB0cnVlO1xuICAgICAgaWYgKCFzd2lwZXIub25UcmFuc2xhdGVUb1dyYXBwZXJUcmFuc2l0aW9uRW5kKSB7XG4gICAgICAgIHN3aXBlci5vblRyYW5zbGF0ZVRvV3JhcHBlclRyYW5zaXRpb25FbmQgPSBmdW5jdGlvbiB0cmFuc2l0aW9uRW5kKGUpIHtcbiAgICAgICAgICBpZiAoIXN3aXBlciB8fCBzd2lwZXIuZGVzdHJveWVkKSByZXR1cm47XG4gICAgICAgICAgaWYgKGUudGFyZ2V0ICE9PSB0aGlzKSByZXR1cm47XG4gICAgICAgICAgc3dpcGVyLndyYXBwZXJFbC5yZW1vdmVFdmVudExpc3RlbmVyKCd0cmFuc2l0aW9uZW5kJywgc3dpcGVyLm9uVHJhbnNsYXRlVG9XcmFwcGVyVHJhbnNpdGlvbkVuZCk7XG4gICAgICAgICAgc3dpcGVyLm9uVHJhbnNsYXRlVG9XcmFwcGVyVHJhbnNpdGlvbkVuZCA9IG51bGw7XG4gICAgICAgICAgZGVsZXRlIHN3aXBlci5vblRyYW5zbGF0ZVRvV3JhcHBlclRyYW5zaXRpb25FbmQ7XG4gICAgICAgICAgc3dpcGVyLmFuaW1hdGluZyA9IGZhbHNlO1xuICAgICAgICAgIGlmIChydW5DYWxsYmFja3MpIHtcbiAgICAgICAgICAgIHN3aXBlci5lbWl0KCd0cmFuc2l0aW9uRW5kJyk7XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgc3dpcGVyLndyYXBwZXJFbC5hZGRFdmVudExpc3RlbmVyKCd0cmFuc2l0aW9uZW5kJywgc3dpcGVyLm9uVHJhbnNsYXRlVG9XcmFwcGVyVHJhbnNpdGlvbkVuZCk7XG4gICAgfVxuICB9XG4gI
5196HJldHVybiB0cnVlO1xufVxuXG52YXIgdHJhbnNsYXRlID0ge1xuICBnZXRUcmFuc2xhdGU6IGdldFN3aXBlclRyYW5zbGF0ZSxcbiAgc2V0VHJhbnNsYXRlLFxuICBtaW5UcmFuc2xhdGUsXG4gIG1heFRyYW5zbGF0ZSxcbiAgdHJhbnNsYXRlVG9cbn07XG5cbmZ1bmN0aW9uIHNldFRyYW5zaXRpb24oZHVyYXRpb24sIGJ5Q29udHJvbGxlcikge1xuICBjb25zdCBzd2lwZXIgPSB0aGlzO1xuICBpZiAoIXN3aXBlci5wYXJhbXMuY3NzTW9kZSkge1xuICAgIHN3aXBlci53cmFwcGVyRWwuc3R5bGUudHJhbnNpdGlvbkR1cmF0aW9uID0gYCR7ZHVyYXRpb259bXNgO1xuICAgIHN3aXBlci53cmFwcGVyRWwuc3R5bGUudHJhbnNpdGlvbkRlbGF5ID0gZHVyYXRpb24gPT09IDAgPyBgMG1zYCA6ICcnO1xuICB9XG4gIHN3aXBlci5lbWl0KCdzZXRUcmFuc2l0aW9uJywgZHVyYXRpb24sIGJ5Q29udHJvbGxlcik7XG59XG5cbmZ1bmN0aW9uIHRyYW5zaXRpb25FbWl0KF9yZWYpIHtcbiAgbGV0IHtcbiAgICBzd2lwZXIsXG4gICAgcnVuQ2FsbGJhY2tzLFxuICAgIGRpcmVjdGlvbixcbiAgICBzdGVwXG4gIH0gPSBfcmVmO1xuICBjb25zdCB7XG4gICAgYWN0aXZlSW5kZXgsXG4gICAgcHJldmlvdXNJbmRleFxuICB9ID0gc3dpcGVyO1xuICBsZXQgZGlyID0gZGlyZWN0aW9uO1xuICBpZiAoIWRpcikge1xuICAgIGlmIChhY3RpdmVJbmRleCA+IHByZXZpb3VzSW5kZXgpIGRpciA9ICduZXh0JztlbHNlIGlmIChhY3RpdmVJbmRleCA8IHByZXZpb3VzSW5kZXgpIGRpciA9ICdwcmV2JztlbHNlIGRpciA9ICdyZXNldCc7XG4gIH1cbiAgc3dpcGVyLmVtaXQoYHRyYW5zaXRpb24ke3N0ZXB9YCk7XG4gIGlmIChydW5DYWxsYmFja3MgJiYgYWN0aXZlSW5kZXggIT09IHByZXZpb3VzSW5kZXgpIHtcbiAgICBpZiAoZGlyID09PSAncmVzZXQnKSB7XG4gICAgICBzd2lwZXIuZW1pdChgc2xpZGVSZXNldFRyYW5zaXRpb24ke3N0ZXB9YCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHN3aXBlci5lbWl0KGBzbGlkZUNoYW5nZVRyYW5zaXRpb24ke3N0ZXB9YCk7XG4gICAgaWYgKGRpciA9PT0gJ25leHQnKSB7XG4gICAgICBzd2lwZXIuZW1pdChgc2xpZGVOZXh0VHJhbnNpdGlvbiR7c3RlcH1gKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc3dpcGVyLmVtaXQoYHNsaWRlUHJldlRyYW5zaXRpb24ke3N0ZXB9YCk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHRyYW5zaXRpb25TdGFydChydW5DYWxsYmFja3MsIGRpcmVjdGlvbikge1xuICBpZiAocnVuQ2FsbGJhY2tzID09PSB2b2lkIDApIHtcbiAgICBydW5DYWxsYmFja3MgPSB0cnVlO1xuICB9XG4gIGNvbnN0IHN3aXBlciA9IHRoaXM7XG4gIGNvbnN0IHtcbiAgICBwYXJhbXNcbiAgfSA9IHN3aXBlcjtcbiAgaWYgKHBhcmFtcy5jc3NNb2RlKSByZXR1cm47XG4gIGlmIChwYXJhbXMuYXV0b0hlaWdodCkge1xuICAgIHN3aXBlci51cGRhdGVBdXRvSGVpZ2h0KCk7XG4gIH1cbiAgdHJhbnNpdGlvbkVtaXQoe1xuICAgIHN3aXBlcixcbiAgICBydW5DYWxsYmFja3MsXG4gICAgZGlyZWN0aW9uLFxuICAgIHN0ZXA6ICdTdGFydCdcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHRyYW5zaXRpb25FbmQocnVuQ2FsbGJhY2tzLCBkaXJlY3Rpb24pIHtcbiAgaWYgKHJ1bkNhbGxiYWNrcyA9PT0gdm9pZCAwKSB7XG4gICAgcnVuQ2FsbGJhY2tzID0gdHJ1ZTtcbiAgfVxuICBjb25zdCBzd2lwZXIgPSB0aGlzO1xuICBjb25zdCB7XG4gICAgcGFyYW1zXG4gIH0gPSBzd2lwZXI7XG4gIHN3aXBlci5hbmltYXRpbmcgPSBmYWxzZTtcbiAgaWYgKHBhcmFtcy5jc3NNb2RlKSByZXR1cm47XG4gIHN3aXBlci5zZXRUcmFuc2l0aW9uKDApO1xuICB0cmFuc2l0aW9uRW1pdCh7XG4gICAgc3dpcGVyLFxuICAgIHJ1bkNhbGxiYWNrcyxcbiAgICBkaXJlY3Rpb24sXG4gICAgc3RlcDogJ0VuZCdcbiAgfSk7XG59XG5cbnZhciB0cmFuc2l0aW9uID0ge1xuICBzZXRUcmFuc2l0aW9uLFxuICB0cmFuc2l0aW9uU3RhcnQsXG4gIHRyYW5zaXRpb25FbmRcbn07XG5cbmZ1bmN0aW9uIHNsaWRlVG8oaW5kZXgsIHNwZWVkLCBydW5DYWxsYmFja3MsIGludGVybmFsLCBpbml0aWFsKSB7XG4gIGlmIChpbmRleCA9PT0gdm9pZCAwKSB7XG4gICAgaW5kZXggPSAwO1xuICB9XG4gIGlmIChydW5DYWxsYmFja3MgPT09IHZvaWQgMCkge1xuICAgIHJ1bkNhbGxiYWNrcyA9IHRydWU7XG4gIH1cbiAgaWYgKHR5cGVvZiBpbmRleCA9PT0gJ3N0cmluZycpIHtcbiAgICBpbmRleCA9IHBhcnNlSW50KGluZGV4LCAxMCk7XG4gIH1cbiAgY29uc3Qgc3dpcGVyID0gdGhpcztcbiAgbGV0IHNsaWRlSW5kZXggPSBpbmRleDtcbiAgaWYgKHNsaWRlSW5kZXggPCAwKSBzbGlkZUluZGV4ID0gMDtcbiAgY29uc3Qge1xuICAgIHBhcmFtcyxcbiAgICBzbmFwR3JpZCxcbiAgICBzbGlkZXNHcmlkLFxuICAgIHByZXZpb3VzSW5kZXgsXG4gICAgYWN0aXZlSW5kZXgsXG4gICAgcnRsVHJhbnNsYXRlOiBydGwsXG4gICAgd3JhcHBlckVsLFxuICAgIGVuYWJsZWRcbiAgfSA9IHN3aXBlcjtcbiAgaWYgKCFlbmFibGVkICYmICFpbnRlcm5hbCAmJiAhaW5pdGlhbCB8fCBzd2lwZXIuZGVzdHJveWVkIHx8IHN3aXBlci5hbmltYXRpbmcgJiYgcGFyYW1zLnByZXZlbnRJbnRlcmFjdGlvbk9uVHJhbnNpdGlvbikge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBpZiAodHlwZW9mIHNwZWVkID09PSAndW5kZWZpbmVkJykge1xuICAgIHNwZWVkID0gc3dpcGVyLnBhcmFtcy5zcGVlZDtcbiAgfVxuICBjb25zdCBza2lwID0gTWF0aC5taW4oc3dpcGVyLnBhcmFtcy5zbGlkZXNQZXJHcm91cFNraXAsIHNsaWRlSW5kZXgpO1xuICBsZXQgc25hcEluZGV4ID0gc2tpcCArIE1hdGguZmxvb3IoKHNsaWRlSW5kZXggLSBza2lwKSAvIHN3aXBlci5wYXJhbXMuc2xpZGVzUGVyR3JvdXApO1xuICBpZiAoc25hcEluZGV4ID49IHNuYXBHcmlkLmxlbmd0aCkgc25hcEluZGV4ID0gc25hcEdyaWQubGVuZ3RoIC0gMTtcbiAgY29uc3QgdHJhbnNsYXRlID0gLXNuYXBHcmlkW3NuYXBJbmRleF07XG4gIC8vIE5vcm1hbGl6ZSBzbGlkZUluZGV4XG4gIGlmIChwYXJhbXMubm9ybWFsaXplU2xpZGVJbmRleCkge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2xpZGVzR3JpZC5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgY29uc3Qgbm9ybWFsaXplZFRyYW5zbGF0ZSA9IC1NYXRoLmZsb29yKHRyYW5zbGF0ZSAqIDEwMCk7XG4gICAgICBjb25zdCBub3JtYWxpem
5196VkR3JpZCA9IE1hdGguZmxvb3Ioc2xpZGVzR3JpZFtpXSAqIDEwMCk7XG4gICAgICBjb25zdCBub3JtYWxpemVkR3JpZE5leHQgPSBNYXRoLmZsb29yKHNsaWRlc0dyaWRbaSArIDFdICogMTAwKTtcbiAgICAgIGlmICh0eXBlb2Ygc2xpZGVzR3JpZFtpICsgMV0gIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIGlmIChub3JtYWxpemVkVHJhbnNsYXRlID49IG5vcm1hbGl6ZWRHcmlkICYmIG5vcm1hbGl6ZWRUcmFuc2xhdGUgPCBub3JtYWxpemVkR3JpZE5leHQgLSAobm9ybWFsaXplZEdyaWROZXh0IC0gbm9ybWFsaXplZEdyaWQpIC8gMikge1xuICAgICAgICAgIHNsaWRlSW5kZXggPSBpO1xuICAgICAgICB9IGVsc2UgaWYgKG5vcm1hbGl6ZWRUcmFuc2xhdGUgPj0gbm9ybWFsaXplZEdyaWQgJiYgbm9ybWFsaXplZFRyYW5zbGF0ZSA8IG5vcm1hbGl6ZWRHcmlkTmV4dCkge1xuICAgICAgICAgIHNsaWRlSW5kZXggPSBpICsgMTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChub3JtYWxpemVkVHJhbnNsYXRlID49IG5vcm1hbGl6ZWRHcmlkKSB7XG4gICAgICAgIHNsaWRlSW5kZXggPSBpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICAvLyBEaXJlY3Rpb25zIGxvY2tzXG4gIGlmIChzd2lwZXIuaW5pdGlhbGl6ZWQgJiYgc2xpZGVJbmRleCAhPT0gYWN0aXZlSW5kZXgpIHtcbiAgICBpZiAoIXN3aXBlci5hbGxvd1NsaWRlTmV4dCAmJiAocnRsID8gdHJhbnNsYXRlID4gc3dpcGVyLnRyYW5zbGF0ZSAmJiB0cmFuc2xhdGUgPiBzd2lwZXIubWluVHJhbnNsYXRlKCkgOiB0cmFuc2xhdGUgPCBzd2lwZXIudHJhbnNsYXRlICYmIHRyYW5zbGF0ZSA8IHN3aXBlci5taW5UcmFuc2xhdGUoKSkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKCFzd2lwZXIuYWxsb3dTbGlkZVByZXYgJiYgdHJhbnNsYXRlID4gc3dpcGVyLnRyYW5zbGF0ZSAmJiB0cmFuc2xhdGUgPiBzd2lwZXIubWF4VHJhbnNsYXRlKCkpIHtcbiAgICAgIGlmICgoYWN0aXZlSW5kZXggfHwgMCkgIT09IHNsaWRlSW5kZXgpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBpZiAoc2xpZGVJbmRleCAhPT0gKHByZXZpb3VzSW5kZXggfHwgMCkgJiYgcnVuQ2FsbGJhY2tzKSB7XG4gICAgc3dpcGVyLmVtaXQoJ2JlZm9yZVNsaWRlQ2hhbmdlU3RhcnQnKTtcbiAgfVxuXG4gIC8vIFVwZGF0ZSBwcm9ncmVzc1xuICBzd2lwZXIudXBkYXRlUHJvZ3Jlc3ModHJhbnNsYXRlKTtcbiAgbGV0IGRpcmVjdGlvbjtcbiAgaWYgKHNsaWRlSW5kZXggPiBhY3RpdmVJbmRleCkgZGlyZWN0aW9uID0gJ25leHQnO2Vsc2UgaWYgKHNsaWRlSW5kZXggPCBhY3RpdmVJbmRleCkgZGlyZWN0aW9uID0gJ3ByZXYnO2Vsc2UgZGlyZWN0aW9uID0gJ3Jlc2V0JztcblxuICAvLyBVcGRhdGUgSW5kZXhcbiAgaWYgKHJ0bCAmJiAtdHJhbnNsYXRlID09PSBzd2lwZXIudHJhbnNsYXRlIHx8ICFydGwgJiYgdHJhbnNsYXRlID09PSBzd2lwZXIudHJhbnNsYXRlKSB7XG4gICAgc3dpcGVyLnVwZGF0ZUFjdGl2ZUluZGV4KHNsaWRlSW5kZXgpO1xuICAgIC8vIFVwZGF0ZSBIZWlnaHRcbiAgICBpZiAocGFyYW1zLmF1dG9IZWlnaHQpIHtcbiAgICAgIHN3aXBlci51cGRhdGVBdXRvSGVpZ2h0KCk7XG4gICAgfVxuICAgIHN3aXBlci51cGRhdGVTbGlkZXNDbGFzc2VzKCk7XG4gICAgaWYgKHBhcmFtcy5lZmZlY3QgIT09ICdzbGlkZScpIHtcbiAgICAgIHN3aXBlci5zZXRUcmFuc2xhdGUodHJhbnNsYXRlKTtcbiAgICB9XG4gICAgaWYgKGRpcmVjdGlvbiAhPT0gJ3Jlc2V0Jykge1xuICAgICAgc3dpcGVyLnRyYW5zaXRpb25TdGFydChydW5DYWxsYmFja3MsIGRpcmVjdGlvbik7XG4gICAgICBzd2lwZXIudHJhbnNpdGlvbkVuZChydW5DYWxsYmFja3MsIGRpcmVjdGlvbik7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBpZiAocGFyYW1zLmNzc01vZGUpIHtcbiAgICBjb25zdCBpc0ggPSBzd2lwZXIuaXNIb3Jpem9udGFsKCk7XG4gICAgY29uc3QgdCA9IHJ0bCA/IHRyYW5zbGF0ZSA6IC10cmFuc2xhdGU7XG4gICAgaWYgKHNwZWVkID09PSAwKSB7XG4gICAgICBjb25zdCBpc1ZpcnR1YWwgPSBzd2lwZXIudmlydHVhbCAmJiBzd2lwZXIucGFyYW1zLnZpcnR1YWwuZW5hYmxlZDtcbiAgICAgIGlmIChpc1ZpcnR1YWwpIHtcbiAgICAgICAgc3dpcGVyLndyYXBwZXJFbC5zdHlsZS5zY3JvbGxTbmFwVHlwZSA9ICdub25lJztcbiAgICAgICAgc3dpcGVyLl9pbW1lZGlhdGVWaXJ0dWFsID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIGlmIChpc1ZpcnR1YWwgJiYgIXN3aXBlci5fY3NzTW9kZVZpcnR1YWxJbml0aWFsU2V0ICYmIHN3aXBlci5wYXJhbXMuaW5pdGlhbFNsaWRlID4gMCkge1xuICAgICAgICBzd2lwZXIuX2Nzc01vZGVWaXJ0dWFsSW5pdGlhbFNldCA9IHRydWU7XG4gICAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICAgICAgd3JhcHBlckVsW2lzSCA/ICdzY3JvbGxMZWZ0JyA6ICdzY3JvbGxUb3AnXSA9IHQ7XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgd3JhcHBlckVsW2lzSCA/ICdzY3JvbGxMZWZ0JyA6ICdzY3JvbGxUb3AnXSA9IHQ7XG4gICAgICB9XG4gICAgICBpZiAoaXNWaXJ0dWFsKSB7XG4gICAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICAgICAgc3dpcGVyLndyYXBwZXJFbC5zdHlsZS5zY3JvbGxTbmFwVHlwZSA9ICcnO1xuICAgICAgICAgIHN3aXBlci5faW1tZWRpYXRlVmlydHVhbCA9IGZhbHNlO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKCFzd2lwZXIuc3VwcG9ydC5zbW9vdGhTY3JvbGwpIHtcbiAgICAgICAgYW5pbWF0ZUNTU01vZGVTY3JvbGwoe1xuICAgICAgICAgIHN3aXBlcixcbiAgICAgICAgICB0YXJnZXRQb3NpdGlvbjogdCxcbiAgICAgICAgICBzaWRlOiBpc0ggPyAnbGVmdCcgOiAndG9wJ1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgICB3cmFwcGVyRWwuc2Nyb2xsVG8oe1xuICAgICAgICBbaXNIID8gJ2xlZnQnIDogJ3RvcCddOiB0LFxuICAgICAgICBiZWhhdmlvcjogJ3Ntb290aCdcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBzd2lwZXIuc2V0VHJhbnNpdGlvbihzcGVlZCk7XG4gIHN3aXBlci5zZXRUcmFuc2xhdGUodHJhbnNsYXRlKTtcbiAgc3dpcGVyLnVwZGF0ZUFjdGl2ZUluZGV4KHNsaWRlSW5kZXgpO1xuICBzd2lwZXIudXBkYXRlU2xpZGVzQ2xhc3NlcygpO1xuICBzd2lwZXIuZW1pdCgnYmVmb3JlVHJhbnNpdGlvblN0YXJ0Jywgc3BlZWQsIGludGVybmFsKTtcbiAgc3dpcGVyLnRyYW5zaXRpb25TdGFydChydW5DYWxsYmFja3MsIGRpcmVjdGlvbik7XG4gIGlmIChzcGVlZCA9PT0gMCkge1xuICAgIHN3aXBlci50cmFuc2l0aW9uRW5kKHJ1bkNhbGxiYWNrcywgZGlyZWN0aW9uKTtcbiAgfSBlbHNlIGlmICghc3dpcGVyLmFuaW1hdGluZykge1xuICAgIHN3aXBlci5hbmltYXRpbmcgPSB0cnVlO1xuICAgIGlmICghc3dpcGVyLm9uU2xpZGVUb1dyYXBwZXJUcmFuc2l0aW9uRW5kKSB7XG4gICAgICBzd2lwZXIub25TbGlkZVRvV3JhcHBlclRyYW5zaXRpb25FbmQgPSBmdW5jdGlvbiB0cmFuc2l0aW9uRW5kKGUpIHtcbiAgICAgICAgaWYgKCFzd2lwZXIgfHwgc3dpcGVyLmRlc3Ryb3llZCkgcmV0dXJuO1xuICAgICAgICBpZiAoZS50YXJnZXQgIT09IHRoaXMpIHJldHVybjtcbiAgICAgICAgc3dpcGVyLndyYXBwZXJFbC5yZW1vdmVFdmVudExpc3RlbmVyKCd0cmFuc2l0aW9uZW5kJywgc3dpcGVyLm9uU2xpZGVUb1dyYXBwZXJUcmFuc2l0aW9uRW5kKTtcbiAgICAgICAgc3dpcGVyLm9uU2xpZGVUb1dyYXBwZXJUcmFuc2l0aW9uRW5kID0gbnVsbDtcbiAgICAgICAgZGVsZXRlIHN3aXBlci5vblNsaWRlVG9XcmFwcGVyVHJhbnNpdGlvbkVuZDtcbiAgICAgICAgc3dpcGVyLnRyYW5zaXRpb25FbmQocnVuQ2FsbGJhY2tzLCBkaXJlY3Rpb24pO1xuICAgICAgfTtcbiAgICB9XG4gICAgc3dpcGVyLndyYXBwZXJFbC5hZGRFdmVudExpc3RlbmVyKCd0cmFuc2l0aW9uZW5kJywgc3dpcGVyLm9uU2xpZGVUb1dyYXBwZXJUcmFuc2l0aW9uRW5kKTtcbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gc2xpZGVUb0xvb3AoaW5kZXgsIHNwZWVkLCBydW5DYWxsYmFja3MsIGludGVybmFsKSB7XG4gIGlmIChpbmRleCA9PT0gdm9pZCAwKSB7XG4gICAgaW5kZXggPSAwO1xuICB9XG4gIGlmIChydW5DYWxsYmFja3MgPT09IHZvaWQgMCkge1xuICAgIHJ1bkNhbGxiYWNrcyA9IHRydWU7XG4gIH1cbiAgaWYgKHR5cGVvZiBpbmRleCA9PT0gJ3N0cmluZycpIHtcbiAgICBjb25zdCBpbmRleEFzTnVtYmVyID0gcGFyc2VJbnQoaW5kZXgsIDEwKTtcbiAgICBpbmRleCA9IGluZGV4QXNOdW1iZXI7XG4gIH1cbiAgY29uc3Qgc3dpcGVyID0gdGhpcztcbiAgaWYgKHN3aXBlci5kZXN0cm95ZWQpIHJldHVybjtcbiAgaWYgKHR5cGVvZiBzcGVlZCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICBzcGVlZCA9IHN3aXBlci5wYXJhbXMuc3BlZWQ7XG4gIH1cbiAgY29uc3QgZ3JpZEVuYWJsZWQgPSBzd2lwZXIuZ3JpZCAmJiBzd2lwZXIucGFyYW1zLmdyaWQgJiYgc3dpcGVyLnBhcmFtcy5ncmlkLnJvd3MgPiAxO1xuICBsZXQgbm
5196V3SW5kZXggPSBpbmRleDtcbiAgaWYgKHN3aXBlci5wYXJhbXMubG9vcCkge1xuICAgIGlmIChzd2lwZXIudmlydHVhbCAmJiBzd2lwZXIucGFyYW1zLnZpcnR1YWwuZW5hYmxlZCkge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lXG4gICAgICBuZXdJbmRleCA9IG5ld0luZGV4ICsgc3dpcGVyLnZpcnR1YWwuc2xpZGVzQmVmb3JlO1xuICAgIH0gZWxzZSB7XG4gICAgICBsZXQgdGFyZ2V0U2xpZGVJbmRleDtcbiAgICAgIGlmIChncmlkRW5hYmxlZCkge1xuICAgICAgICBjb25zdCBzbGlkZUluZGV4ID0gbmV3SW5kZXggKiBzd2lwZXIucGFyYW1zLmdyaWQucm93cztcbiAgICAgICAgdGFyZ2V0U2xpZGVJbmRleCA9IHN3aXBlci5zbGlkZXMuZmlsdGVyKHNsaWRlRWwgPT4gc2xpZGVFbC5nZXRBdHRyaWJ1dGUoJ2RhdGEtc3dpcGVyLXNsaWRlLWluZGV4JykgKiAxID09PSBzbGlkZUluZGV4KVswXS5jb2x1bW47XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0YXJnZXRTbGlkZUluZGV4ID0gc3dpcGVyLmdldFNsaWRlSW5kZXhCeURhdGEobmV3SW5kZXgpO1xuICAgICAgfVxuICAgICAgY29uc3QgY29scyA9IGdyaWRFbmFibGVkID8gTWF0aC5jZWlsKHN3aXBlci5zbGlkZXMubGVuZ3RoIC8gc3dpcGVyLnBhcmFtcy5ncmlkLnJvd3MpIDogc3dpcGVyLnNsaWRlcy5sZW5ndGg7XG4gICAgICBjb25zdCB7XG4gICAgICAgIGNlbnRlcmVkU2xpZGVzXG4gICAgICB9ID0gc3dpcGVyLnBhcmFtcztcbiAgICAgIGxldCBzbGlkZXNQZXJWaWV3ID0gc3dpcGVyLnBhcmFtcy5zbGlkZXNQZXJWaWV3O1xuICAgICAgaWYgKHNsaWRlc1BlclZpZXcgPT09ICdhdXRvJykge1xuICAgICAgICBzbGlkZXNQZXJWaWV3ID0gc3dpcGVyLnNsaWRlc1BlclZpZXdEeW5hbWljKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzbGlkZXNQZXJWaWV3ID0gTWF0aC5jZWlsKHBhcnNlRmxvYXQoc3dpcGVyLnBhcmFtcy5zbGlkZXNQZXJWaWV3LCAxMCkpO1xuICAgICAgICBpZiAoY2VudGVyZWRTbGlkZXMgJiYgc2xpZGVzUGVyVmlldyAlIDIgPT09IDApIHtcbiAgICAgICAgICBzbGlkZXNQZXJWaWV3ID0gc2xpZGVzUGVyVmlldyArIDE7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGxldCBuZWVkTG9vcEZpeCA9IGNvbHMgLSB0YXJnZXRTbGlkZUluZGV4IDwgc2xpZGVzUGVyVmlldztcbiAgICAgIGlmIChjZW50ZXJlZFNsaWRlcykge1xuICAgICAgICBuZWVkTG9vcEZpeCA9IG5lZWRMb29wRml4IHx8IHRhcmdldFNsaWRlSW5kZXggPCBNYXRoLmNlaWwoc2xpZGVzUGVyVmlldyAvIDIpO1xuICAgICAgfVxuICAgICAgaWYgKGludGVybmFsICYmIGNlbnRlcmVkU2xpZGVzICYmIHN3aXBlci5wYXJhbXMuc2xpZGVzUGVyVmlldyAhPT0gJ2F1dG8nICYmICFncmlkRW5hYmxlZCkge1xuICAgICAgICBuZWVkTG9vcEZpeCA9IGZhbHNlO1xuICAgICAgfVxuICAgICAgaWYgKG5lZWRMb29wRml4KSB7XG4gICAgICAgIGNvbnN0IGRpcmVjdGlvbiA9IGNlbnRlcmVkU2xpZGVzID8gdGFyZ2V0U2xpZGVJbmRleCA8IHN3aXBlci5hY3RpdmVJbmRleCA/ICdwcmV2JyA6ICduZXh0JyA6IHRhcmdldFNsaWRlSW5kZXggLSBzd2lwZXIuYWN0aXZlSW5kZXggLSAxIDwgc3dpcGVyLnBhcmFtcy5zbGlkZXNQZXJWaWV3ID8gJ25leHQnIDogJ3ByZXYnO1xuICAgICAgICBzd2lwZXIubG9vcEZpeCh7XG4gICAgICAgICAgZGlyZWN0aW9uLFxuICAgICAgICAgIHNsaWRlVG86IHRydWUsXG4gICAgICAgICAgYWN0aXZlU2xpZGVJbmRleDogZGlyZWN0aW9uID09PSAnbmV4dCcgPyB0YXJnZXRTbGlkZUluZGV4ICsgMSA6IHRhcmdldFNsaWRlSW5kZXggLSBjb2xzICsgMSxcbiAgICAgICAgICBzbGlkZVJlYWxJbmRleDogZGlyZWN0aW9uID09PSAnbmV4dCcgPyBzd2lwZXIucmVhbEluZGV4IDogdW5kZWZpbmVkXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgaWYgKGdyaWRFbmFibGVkKSB7XG4gICAgICAgIGNvbnN0IHNsaWRlSW5kZXggPSBuZXdJbmRleCAqIHN3aXBlci5wYXJhbXMuZ3JpZC5yb3dzO1xuICAgICAgICBuZXdJbmRleCA9IHN3aXBlci5zbGlkZXMuZmlsdGVyKHNsaWRlRWwgPT4gc2xpZGVFbC5nZXRBdHRyaWJ1dGUoJ2RhdGEtc3dpcGVyLXNsaWRlLWluZGV4JykgKiAxID09PSBzbGlkZUluZGV4KVswXS5jb2x1bW47XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBuZXdJbmRleCA9IHN3aXBlci5nZXRTbGlkZUluZGV4QnlEYXRhKG5ld0luZGV4KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICBzd2lwZXIuc2xpZGVUbyhuZXdJbmRleCwgc3BlZWQsIHJ1bkNhbGxiYWNrcywgaW50ZXJuYWwpO1xuICB9KTtcbiAgcmV0dXJuIHN3aXBlcjtcbn1cblxuLyogZXNsaW50IG5vLXVudXNlZC12YXJzOiBcIm9mZlwiICovXG5mdW5jdGlvbiBzbGlkZU5leHQoc3BlZWQsIHJ1bkNhbGxiYWNrcywgaW50ZXJuYWwpIHtcbiAgaWYgKHJ1bkNhbGxiYWNrcyA9PT0gdm9pZCAwKSB7XG4gICAgcnVuQ2FsbGJhY2tzID0gdHJ1ZTtcbiAgfVxuICBjb25zdCBzd2lwZXIgPSB0aGlzO1xuICBjb25zdCB7XG4gICAgZW5hYmxlZCxcbiAgICBwYXJhbXMsXG4gICAgYW5pbWF0aW5nXG4gIH0gPSBzd2lwZXI7XG4gIGlmICghZW5hYmxlZCB8fCBzd2lwZXIuZGVzdHJveWVkKSByZXR1cm4gc3dpcGVyO1xuICBpZiAodHlwZW9mIHNwZWVkID09PSAndW5kZWZpbmVkJykge1xuICAgIHNwZWVkID0gc3dpcGVyLnBhcmFtcy5zcGVlZDtcbiAgfVxuICBsZXQgcGVyR3JvdXAgPSBwYXJhbXMuc2xpZGVzUGVyR3JvdXA7XG4gIGlmIChwYXJhbXMuc2xpZGVzUGVyVmlldyA9PT0gJ2F1dG8nICYmIHBhcmFtcy5zbGlkZXNQZXJHcm91cCA9PT0gMSAmJiBwYXJhbXMuc2xpZGVzUGVyR3JvdXBBdXRvKSB7XG4gICAgcGVyR3JvdXAgPSBNYXRoLm1heChzd2lwZXIuc2xpZGVzUGVyVmlld0R5bmFtaWMoJ2N1cnJlbnQnLCB0cnVlKSwgMSk7XG4gIH1cbiAgY29uc3QgaW5jcmVtZW50ID0gc3dpcGVyLmFjdGl2ZUluZGV4IDwgcGFyYW1zLnNsaWRlc1Blckdyb3VwU2tpcCA/IDEgOiBwZXJHcm91cDtcbiAgY29uc3QgaXNWaXJ0dWFsID0gc3dpcGVyLnZpcnR1YWwgJiYgcGFyYW1zLnZpcnR1YWwuZW5hYmxlZDtcbiAgaWYgKHBhcmFtcy5sb29wKSB7XG4gICAgaWYgKGFuaW1hdGluZyAmJiAhaXNWaXJ0dWFsICYmIHBhcmFtcy5sb29wUHJldmVudHNTbGlkaW5nKSByZXR1cm4gZmFsc2U7XG4gICAgc3dpcGVyLmxvb3BGaXgoe1xuICAgICAgZGlyZWN0aW9uOiAnbmV4dCdcbiAgICB9KTtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmVcbiAgICBzd2lwZXIuX2NsaWVudExlZnQgPSBzd2lwZXIud3JhcHBlckVsLmNsaWVudExlZnQ7XG4gICAgaWYgKHN3aXBlci5hY3RpdmVJbmRleCA9PT0gc3dpcGVyLnNsaWRlcy5sZW5ndGggLSAxICYmIHBhcmFtcy5jc3NNb2RlKSB7XG4gICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xuICAgICAgICBzd2lwZXIuc2xpZGVUbyhzd2lwZXIuYWN0aXZlSW5kZXggKyBpbmNyZW1lbnQsIHNwZWVkLCBydW5DYWxsYmFja3MsIGludGVybmFsKTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG4gIGlmIChwYXJhbXMucmV3aW5kICYmIHN3aXBlci5pc0VuZCkge1xuICAgIHJldHVybi
5196Bzd2lwZXIuc2xpZGVUbygwLCBzcGVlZCwgcnVuQ2FsbGJhY2tzLCBpbnRlcm5hbCk7XG4gIH1cbiAgcmV0dXJuIHN3aXBlci5zbGlkZVRvKHN3aXBlci5hY3RpdmVJbmRleCArIGluY3JlbWVudCwgc3BlZWQsIHJ1bkNhbGxiYWNrcywgaW50ZXJuYWwpO1xufVxuXG4vKiBlc2xpbnQgbm8tdW51c2VkLXZhcnM6IFwib2ZmXCIgKi9cbmZ1bmN0aW9uIHNsaWRlUHJldihzcGVlZCwgcnVuQ2FsbGJhY2tzLCBpbnRlcm5hbCkge1xuICBpZiAocnVuQ2FsbGJhY2tzID09PSB2b2lkIDApIHtcbiAgICBydW5DYWxsYmFja3MgPSB0cnVlO1xuICB9XG4gIGNvbnN0IHN3aXBlciA9IHRoaXM7XG4gIGNvbnN0IHtcbiAgICBwYXJhbXMsXG4gICAgc25hcEdyaWQsXG4gICAgc2xpZGVzR3JpZCxcbiAgICBydGxUcmFuc2xhdGUsXG4gICAgZW5hYmxlZCxcbiAgICBhbmltYXRpbmdcbiAgfSA9IHN3aXBlcjtcbiAgaWYgKCFlbmFibGVkIHx8IHN3aXBlci5kZXN0cm95ZWQpIHJldHVybiBzd2lwZXI7XG4gIGlmICh0eXBlb2Ygc3BlZWQgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgc3BlZWQgPSBzd2lwZXIucGFyYW1zLnNwZWVkO1xuICB9XG4gIGNvbnN0IGlzVmlydHVhbCA9IHN3aXBlci52aXJ0dWFsICYmIHBhcmFtcy52aXJ0dWFsLmVuYWJsZWQ7XG4gIGlmIChwYXJhbXMubG9vcCkge1xuICAgIGlmIChhbmltYXRpbmcgJiYgIWlzVmlydHVhbCAmJiBwYXJhbXMubG9vcFByZXZlbnRzU2xpZGluZykgcmV0dXJuIGZhbHNlO1xuICAgIHN3aXBlci5sb29wRml4KHtcbiAgICAgIGRpcmVjdGlvbjogJ3ByZXYnXG4gICAgfSk7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lXG4gICAgc3dpcGVyLl9jbGllbnRMZWZ0ID0gc3dpcGVyLndyYXBwZXJFbC5jbGllbnRMZWZ0O1xuICB9XG4gIGNvbnN0IHRyYW5zbGF0ZSA9IHJ0bFRyYW5zbGF0ZSA/IHN3aXBlci50cmFuc2xhdGUgOiAtc3dpcGVyLnRyYW5zbGF0ZTtcbiAgZnVuY3Rpb24gbm9ybWFsaXplKHZhbCkge1xuICAgIGlmICh2YWwgPCAwKSByZXR1cm4gLU1hdGguZmxvb3IoTWF0aC5hYnModmFsKSk7XG4gICAgcmV0dXJuIE1hdGguZmxvb3IodmFsKTtcbiAgfVxuICBjb25zdCBub3JtYWxpemVkVHJhbnNsYXRlID0gbm9ybWFsaXplKHRyYW5zbGF0ZSk7XG4gIGNvbnN0IG5vcm1hbGl6ZWRTbmFwR3JpZCA9IHNuYXBHcmlkLm1hcCh2YWwgPT4gbm9ybWFsaXplKHZhbCkpO1xuICBsZXQgcHJldlNuYXAgPSBzbmFwR3JpZFtub3JtYWxpemVkU25hcEdyaWQuaW5kZXhPZihub3JtYWxpemVkVHJhbnNsYXRlKSAtIDFdO1xuICBpZiAodHlwZW9mIHByZXZTbmFwID09PSAndW5kZWZpbmVkJyAmJiBwYXJhbXMuY3NzTW9kZSkge1xuICAgIGxldCBwcmV2U25hcEluZGV4O1xuICAgIHNuYXBHcmlkLmZvckVhY2goKHNuYXAsIHNuYXBJbmRleCkgPT4ge1xuICAgICAgaWYgKG5vcm1hbGl6ZWRUcmFuc2xhdGUgPj0gc25hcCkge1xuICAgICAgICAvLyBwcmV2U25hcCA9IHNuYXA7XG4gICAgICAgIHByZXZTbmFwSW5kZXggPSBzbmFwSW5kZXg7XG4gICAgICB9XG4gICAgfSk7XG4gICAgaWYgKHR5cGVvZiBwcmV2U25hcEluZGV4ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgcHJldlNuYXAgPSBzbmFwR3JpZFtwcmV2U25hcEluZGV4ID4gMCA/IHByZXZTbmFwSW5kZXggLSAxIDogcHJldlNuYXBJbmRleF07XG4gICAgfVxuICB9XG4gIGxldCBwcmV2SW5kZXggPSAwO1xuICBpZiAodHlwZW9mIHByZXZTbmFwICE9PSAndW5kZWZpbmVkJykge1xuICAgIHByZXZJbmRleCA9IHNsaWRlc0dyaWQuaW5kZXhPZihwcmV2U25hcCk7XG4gICAgaWYgKHByZXZJbmRleCA8IDApIHByZXZJbmRleCA9IHN3aXBlci5hY3RpdmVJbmRleCAtIDE7XG4gICAgaWYgKHBhcmFtcy5zbGlkZXNQZXJWaWV3ID09PSAnYXV0bycgJiYgcGFyYW1zLnNsaWRlc1Blckdyb3VwID09PSAxICYmIHBhcmFtcy5zbGlkZXNQZXJHcm91cEF1dG8pIHtcbiAgICAgIHByZXZJbmRleCA9IHByZXZJbmRleCAtIHN3aXBlci5zbGlkZXNQZXJWaWV3RHluYW1pYygncHJldmlvdXMnLCB0cnVlKSArIDE7XG4gICAgICBwcmV2SW5kZXggPSBNYXRoLm1heChwcmV2SW5kZXgsIDApO1xuICAgIH1cbiAgfVxuICBpZiAocGFyYW1zLnJld2luZCAmJiBzd2lwZXIuaXNCZWdpbm5pbmcpIHtcbiAgICBjb25zdCBsYXN0SW5kZXggPSBzd2lwZXIucGFyYW1zLnZpcnR1YWwgJiYgc3dpcGVyLnBhcmFtcy52aXJ0dWFsLmVuYWJsZWQgJiYgc3dpcGVyLnZpcnR1YWwgPyBzd2lwZXIudmlydHVhbC5zbGlkZXMubGVuZ3RoIC0gMSA6IHN3aXBlci5zbGlkZXMubGVuZ3RoIC0gMTtcbiAgICByZXR1cm4gc3dpcGVyLnNsaWRlVG8obGFzdEluZGV4LCBzcGVlZCwgcnVuQ2FsbGJhY2tzLCBpbnRlcm5hbCk7XG4gIH0gZWxzZSBpZiAocGFyYW1zLmxvb3AgJiYgc3dpcGVyLmFjdGl2ZUluZGV4ID09PSAwICYmIHBhcmFtcy5jc3NNb2RlKSB7XG4gICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgIHN3aXBlci5zbGlkZVRvKHByZXZJbmRleCwgc3BlZWQsIHJ1bkNhbGxiYWNrcywgaW50ZXJuYWwpO1xuICAgIH0pO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHJldHVybiBzd2lwZXIuc2xpZGVUbyhwcmV2SW5kZXgsIHNwZWVkLCBydW5DYWxsYmFja3MsIGludGVybmFsKTtcbn1cblxuLyogZXNsaW50IG5vLXVudXNlZC12YXJzOiBcIm9mZlwiICovXG5mdW5jdGlvbiBzbGlkZVJlc2V0KHNwZWVkLCBydW5DYWxsYmFja3MsIGludGVybmFsKSB7XG4gIGlmIChydW5DYWxsYmFja3MgPT09IHZvaWQgMCkge1xuICAgIHJ1bkNhbGxiYWNrcyA9IHRydWU7XG4gIH1cbiAgY29uc3Qgc3dpcGVyID0gdGhpcztcbiAgaWYgKHN3aXBlci5kZXN0cm95ZWQpIHJldHVybjtcbiAgaWYgKHR5cGVvZiBzcGVlZCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICBzcGVlZCA9IHN3aXBlci5wYXJhbXMuc3BlZWQ7XG4gIH1cbiAgcmV0dXJuIHN3aXBlci5zbGlkZVRvKHN3aXBlci5hY3RpdmVJbmRleCwgc3BlZWQsIHJ1bkNhbGxiYWNrcywgaW50ZXJuYWwpO1xufVxuXG4vKiBlc2xpbnQgbm8tdW51c2VkLXZhcnM6IFwib2ZmXCIgKi9cbmZ1bmN0aW9uIHNsaWRlVG9DbG9zZXN0KHNwZWVkLCBydW5DYWxsYmFja3MsIGludGVybmFsLCB0aHJlc2hvbGQpIHtcbiAgaWYgKHJ1bkNhbGxiYWNrcyA9PT0gdm9pZCAwKSB7XG4gICAgcnVuQ2FsbGJhY2tzID0gdHJ1ZTtcbiAgfVxuICBpZiAodGhyZXNob2xkID09PSB2b2lkIDApIHtcbiAgICB0aHJlc2hvbGQgPSAwLjU7XG4gIH1cbiAgY29uc3Qgc3dpcGVyID0gdGhpcztcbiAgaWYgKHN3aXBlci5kZXN0cm95ZWQpIHJldHVybjtcbiAgaWYgKHR5cGVvZiBzcGVlZCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICBzcGVlZCA9IHN3aXBlci5wYXJhbXMuc3BlZWQ7XG4gIH1cbiAgbGV0IGluZGV4ID0gc3dpcGVyLmFjdGl2ZUluZGV4O1xuICBjb25zdCBza2lwID0gTWF0aC5taW4oc3dpcGVyLnBhcmFtcy5zbGlkZXNQZXJHcm91cFNraXAsIGluZGV4KTtcbiAgY29uc3Qgc25hcEluZGV4ID0gc2tpcCArIE1hdGguZmxvb3IoKGluZGV4IC0gc2tpcCkgLyBzd2lwZXIucGFyYW1zLnNsaWRlc1Blckdyb3VwKTtcbiAgY29uc3QgdHJhbnNsYXRlID0gc3dpcGVyLnJ0bFRyYW5zbGF0ZSA/IHN3aXBlci50cmFuc2xhdGUgOiAtc3dpcGVyLnRyYW5zbGF0ZTtcbiAgaWYgKHRyYW5zbGF0ZSA+PSBzd2lwZXIuc25hcEdyaWRbc25hcEluZGV4XSkge1xuICAgIC8vIFRoZSBjdXJyZW50IHRyYW5zbGF0ZSBpcyBvbiBvciBhZnRlciB0aGUgY3VycmVudCBzbmFwIGluZGV4LCBzbyB0aGUgY2hvaWNlXG4gICAgLy8gaXMgYmV0d2VlbiB0aGUgY3VycmVudCBpbmRleCBhbmQgdGhlIG9uZSBhZnRlciBpdC5cbiAgICBjb25zdCBjdXJyZW50U25hcCA9IHN3aXBlci5zbmFwR3JpZFtzbmFwSW5kZXhdO1xuICAgIGNvbnN0IG5leHRTbmFwID0gc3dpcGVyLnNuYXBHcmlkW3NuYXBJbmRleCArIDFdO1xuICAgIGlmICh0cmFuc2xhdGUgLSBjdXJyZW50U25hcCA+IChuZXh0U25hcCAtIGN1cnJlbnRTbmFwKSAqIHRocmVzaG9sZCkge1xuICAgICAgaW5kZXggKz0gc3dpcGVyLnBhcmFtcy5zbGlkZXNQZXJHcm91cDtcbiAgICB9XG4gI
5196H0gZWxzZSB7XG4gICAgLy8gVGhlIGN1cnJlbnQgdHJhbnNsYXRlIGlzIGJlZm9yZSB0aGUgY3VycmVudCBzbmFwIGluZGV4LCBzbyB0aGUgY2hvaWNlXG4gICAgLy8gaXMgYmV0d2VlbiB0aGUgY3VycmVudCBpbmRleCBhbmQgdGhlIG9uZSBiZWZvcmUgaXQuXG4gICAgY29uc3QgcHJldlNuYXAgPSBzd2lwZXIuc25hcEdyaWRbc25hcEluZGV4IC0gMV07XG4gICAgY29uc3QgY3VycmVudFNuYXAgPSBzd2lwZXIuc25hcEdyaWRbc25hcEluZGV4XTtcbiAgICBpZiAodHJhbnNsYXRlIC0gcHJldlNuYXAgPD0gKGN1cnJlbnRTbmFwIC0gcHJldlNuYXApICogdGhyZXNob2xkKSB7XG4gICAgICBpbmRleCAtPSBzd2lwZXIucGFyYW1zLnNsaWRlc1Blckdyb3VwO1xuICAgIH1cbiAgfVxuICBpbmRleCA9IE1hdGgubWF4KGluZGV4LCAwKTtcbiAgaW5kZXggPSBNYXRoLm1pbihpbmRleCwgc3dpcGVyLnNsaWRlc0dyaWQubGVuZ3RoIC0gMSk7XG4gIHJldHVybiBzd2lwZXIuc2xpZGVUbyhpbmRleCwgc3BlZWQsIHJ1bkNhbGxiYWNrcywgaW50ZXJuYWwpO1xufVxuXG5mdW5jdGlvbiBzbGlkZVRvQ2xpY2tlZFNsaWRlKCkge1xuICBjb25zdCBzd2lwZXIgPSB0aGlzO1xuICBpZiAoc3dpcGVyLmRlc3Ryb3llZCkgcmV0dXJuO1xuICBjb25zdCB7XG4gICAgcGFyYW1zLFxuICAgIHNsaWRlc0VsXG4gIH0gPSBzd2lwZXI7XG4gIGNvbnN0IHNsaWRlc1BlclZpZXcgPSBwYXJhbXMuc2xpZGVzUGVyVmlldyA9PT0gJ2F1dG8nID8gc3dpcGVyLnNsaWRlc1BlclZpZXdEeW5hbWljKCkgOiBwYXJhbXMuc2xpZGVzUGVyVmlldztcbiAgbGV0IHNsaWRlVG9JbmRleCA9IHN3aXBlci5jbGlja2VkSW5kZXg7XG4gIGxldCByZWFsSW5kZXg7XG4gIGNvbnN0IHNsaWRlU2VsZWN0b3IgPSBzd2lwZXIuaXNFbGVtZW50ID8gYHN3aXBlci1zbGlkZWAgOiBgLiR7cGFyYW1zLnNsaWRlQ2xhc3N9YDtcbiAgaWYgKHBhcmFtcy5sb29wKSB7XG4gICAgaWYgKHN3aXBlci5hbmltYXRpbmcpIHJldHVybjtcbiAgICByZWFsSW5kZXggPSBwYXJzZUludChzd2lwZXIuY2xpY2tlZFNsaWRlLmdldEF0dHJpYnV0ZSgnZGF0YS1zd2lwZXItc2xpZGUtaW5kZXgnKSwgMTApO1xuICAgIGlmIChwYXJhbXMuY2VudGVyZWRTbGlkZXMpIHtcbiAgICAgIGlmIChzbGlkZVRvSW5kZXggPCBzd2lwZXIubG9vcGVkU2xpZGVzIC0gc2xpZGVzUGVyVmlldyAvIDIgfHwgc2xpZGVUb0luZGV4ID4gc3dpcGVyLnNsaWRlcy5sZW5ndGggLSBzd2lwZXIubG9vcGVkU2xpZGVzICsgc2xpZGVzUGVyVmlldyAvIDIpIHtcbiAgICAgICAgc3dpcGVyLmxvb3BGaXgoKTtcbiAgICAgICAgc2xpZGVUb0luZGV4ID0gc3dpcGVyLmdldFNsaWRlSW5kZXgoZWxlbWVudENoaWxkcmVuKHNsaWRlc0VsLCBgJHtzbGlkZVNlbGVjdG9yfVtkYXRhLXN3aXBlci1zbGlkZS1pbmRleD1cIiR7cmVhbEluZGV4fVwiXWApWzBdKTtcbiAgICAgICAgbmV4dFRpY2soKCkgPT4ge1xuICAgICAgICAgIHN3aXBlci5zbGlkZVRvKHNsaWRlVG9JbmRleCk7XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3dpcGVyLnNsaWRlVG8oc2xpZGVUb0luZGV4KTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHNsaWRlVG9JbmRleCA+IHN3aXBlci5zbGlkZXMubGVuZ3RoIC0gc2xpZGVzUGVyVmlldykge1xuICAgICAgc3dpcGVyLmxvb3BGaXgoKTtcbiAgICAgIHNsaWRlVG9JbmRleCA9IHN3aXBlci5nZXRTbGlkZUluZGV4KGVsZW1lbnRDaGlsZHJlbihzbGlkZXNFbCwgYCR7c2xpZGVTZWxlY3Rvcn1bZGF0YS1zd2lwZXItc2xpZGUtaW5kZXg9XCIke3JlYWxJbmRleH1cIl1gKVswXSk7XG4gICAgICBuZXh0VGljaygoKSA9PiB7XG4gICAgICAgIHN3aXBlci5zbGlkZVRvKHNsaWRlVG9JbmRleCk7XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgc3dpcGVyLnNsaWRlVG8oc2xpZGVUb0luZGV4KTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgc3dpcGVyLnNsaWRlVG8oc2xpZGVUb0luZGV4KTtcbiAgfVxufVxuXG52YXIgc2xpZGUgPSB7XG4gIHNsaWRlVG8sXG4gIHNsaWRlVG9Mb29wLFxuICBzbGlkZU5leHQsXG4gIHNsaWRlUHJldixcbiAgc2xpZGVSZXNldCxcbiAgc2xpZGVUb0Nsb3Nlc3QsXG4gIHNsaWRlVG9DbGlja2VkU2xpZGVcbn07XG5cbmZ1bmN0aW9uIGxvb3BDcmVhdGUoc2xpZGVSZWFsSW5kZXgpIHtcbiAgY29uc3Qgc3dpcGVyID0gdGhpcztcbiAgY29uc3Qge1xuICAgIHBhcmFtcyxcbiAgICBzbGlkZXNFbFxuICB9ID0gc3dpcGVyO1xuICBpZiAoIXBhcmFtcy5sb29wIHx8IHN3aXBlci52aXJ0dWFsICYmIHN3aXBlci5wYXJhbXMudmlydHVhbC5lbmFibGVkKSByZXR1cm47XG4gIGNvbnN0IGluaXRTbGlkZXMgPSAoKSA9PiB7XG4gICAgY29uc3Qgc2xpZGVzID0gZWxlbWVudENoaWxkcmVuKHNsaWRlc0VsLCBgLiR7cGFyYW1zLnNsaWRlQ2xhc3N9LCBzd2lwZXItc2xpZGVgKTtcbiAgICBzbGlkZXMuZm9yRWFjaCgoZWwsIGluZGV4KSA9PiB7XG4gICAgICBlbC5zZXRBdHRyaWJ1dGUoJ2RhdGEtc3dpcGVyLXNsaWRlLWluZGV4JywgaW5kZXgpO1xuICAgIH0pO1xuICB9O1xuICBjb25zdCBncmlkRW5hYmxlZCA9IHN3aXBlci5ncmlkICYmIHBhcmFtcy5ncmlkICYmIHBhcmFtcy5ncmlkLnJvd3MgPiAxO1xuICBjb25zdCBzbGlkZXNQZXJHcm91cCA9IHBhcmFtcy5zbGlkZXNQZXJHcm91cCAqIChncmlkRW5hYmxlZCA/IHBhcmFtcy5ncmlkLnJvd3MgOiAxKTtcbiAgY29uc3Qgc2hvdWxkRmlsbEdyb3VwID0gc3dpcGVyLnNsaWRlcy5sZW5ndGggJSBzbGlkZXNQZXJHcm91cCAhPT0gMDtcbiAgY29uc3Qgc2hvdWxkRmlsbEdyaWQgPSBncmlkRW5hYmxlZCAmJiBzd2lwZXIuc2xpZGVzLmxlbmd0aCAlIHBhcmFtcy5ncmlkLnJvd3MgIT09IDA7XG4gIGNvbnN0IGFkZEJsYW5rU2xpZGVzID0gYW1vdW50T2ZTbGlkZXMgPT4ge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYW1vdW50T2ZTbGlkZXM7IGkgKz0gMSkge1xuICAgICAgY29uc3Qgc2xpZGVFbCA9IHN3aXBlci5pc0VsZW1lbnQgPyBjcmVhdGVFbGVtZW50KCdzd2lwZXItc2xpZGUnLCBbcGFyYW1zLnNsaWRlQmxhbmtDbGFzc10pIDogY3JlYXRlRWxlbWVudCgnZGl2JywgW3BhcmFtcy5zbGlkZUNsYXNzLCBwYXJhbXMuc2xpZGVCbGFua0NsYXNzXSk7XG4gICAgICBzd2lwZXIuc2xpZGVzRWwuYXBwZW5kKHNsaWRlRWwpO1xuICAgIH1cbiAgfTtcbiAgaWYgKHNob3VsZEZpbGxHcm91cCkge1xuICAgIGlmIChwYXJhbXMubG9vcEFkZEJsYW5rU2xpZGVzKSB7XG4gICAgICBjb25zdCBzbGlkZXNUb0FkZCA9IHNsaWRlc1Blckdyb3VwIC0gc3dpcGVyLnNsaWRlcy5sZW5ndGggJSBzbGlkZXNQZXJHcm91cDtcbiAgICAgIGFkZEJsYW5rU2xpZGVzKHNsaWRlc1RvQWRkKTtcbiAgICAgIHN3aXBlci5yZWNhbGNTbGlkZXMoKTtcbiAgICAgIHN3aXBlci51cGRhdGVTbGlkZXMoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc2hvd1dhcm5pbmcoJ1N3aXBlciBMb29wIFdhcm5pbmc6IFRoZSBudW1iZXIgb2Ygc2xpZGVzIGlzIG5vdCBldmVuIHRvIHNsaWRlc1Blckdyb3VwLCBsb29wIG1vZGUgbWF5IG5vdCBmdW5jdGlvbiBwcm9wZXJseS4gWW91IG5lZWQgdG8gYWRkIG1vcmUgc2xpZGVzIChvciBtYWtlIGR1cGxpY2F0ZXMsIG9yIGVt
5196cHR5IHNsaWRlcyknKTtcbiAgICB9XG4gICAgaW5pdFNsaWRlcygpO1xuICB9IGVsc2UgaWYgKHNob3VsZEZpbGxHcmlkKSB7XG4gICAgaWYgKHBhcmFtcy5sb29wQWRkQmxhbmtTbGlkZXMpIHtcbiAgICAgIGNvbnN0IHNsaWRlc1RvQWRkID0gcGFyYW1zLmdyaWQucm93cyAtIHN3aXBlci5zbGlkZXMubGVuZ3RoICUgcGFyYW1zLmdyaWQucm93cztcbiAgICAgIGFkZEJsYW5rU2xpZGVzKHNsaWRlc1RvQWRkKTtcbiAgICAgIHN3aXBlci5yZWNhbGNTbGlkZXMoKTtcbiAgICAgIHN3aXBlci51cGRhdGVTbGlkZXMoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc2hvd1dhcm5pbmcoJ1N3aXBlciBMb29wIFdhcm5pbmc6IFRoZSBudW1iZXIgb2Ygc2xpZGVzIGlzIG5vdCBldmVuIHRvIGdyaWQucm93cywgbG9vcCBtb2RlIG1heSBub3QgZnVuY3Rpb24gcHJvcGVybHkuIFlvdSBuZWVkIHRvIGFkZCBtb3JlIHNsaWRlcyAob3IgbWFrZSBkdXBsaWNhdGVzLCBvciBlbXB0eSBzbGlkZXMpJyk7XG4gICAgfVxuICAgIGluaXRTbGlkZXMoKTtcbiAgfSBlbHNlIHtcbiAgICBpbml0U2xpZGVzKCk7XG4gIH1cbiAgc3dpcGVyLmxvb3BGaXgoe1xuICAgIHNsaWRlUmVhbEluZGV4LFxuICAgIGRpcmVjdGlvbjogcGFyYW1zLmNlbnRlcmVkU2xpZGVzID8gdW5kZWZpbmVkIDogJ25leHQnXG4gIH0pO1xufVxuXG5mdW5jdGlvbiBsb29wRml4KF90ZW1wKSB7XG4gIGxldCB7XG4gICAgc2xpZGVSZWFsSW5kZXgsXG4gICAgc2xpZGVUbyA9IHRydWUsXG4gICAgZGlyZWN0aW9uLFxuICAgIHNldFRyYW5zbGF0ZSxcbiAgICBhY3RpdmVTbGlkZUluZGV4LFxuICAgIGJ5Q29udHJvbGxlcixcbiAgICBieU1vdXNld2hlZWxcbiAgfSA9IF90ZW1wID09PSB2b2lkIDAgPyB7fSA6IF90ZW1wO1xuICBjb25zdCBzd2lwZXIgPSB0aGlzO1xuICBpZiAoIXN3aXBlci5wYXJhbXMubG9vcCkgcmV0dXJuO1xuICBzd2lwZXIuZW1pdCgnYmVmb3JlTG9vcEZpeCcpO1xuICBjb25zdCB7XG4gICAgc2xpZGVzLFxuICAgIGFsbG93U2xpZGVQcmV2LFxuICAgIGFsbG93U2xpZGVOZXh0LFxuICAgIHNsaWRlc0VsLFxuICAgIHBhcmFtc1xuICB9ID0gc3dpcGVyO1xuICBjb25zdCB7XG4gICAgY2VudGVyZWRTbGlkZXNcbiAgfSA9IHBhcmFtcztcbiAgc3dpcGVyLmFsbG93U2xpZGVQcmV2ID0gdHJ1ZTtcbiAgc3dpcGVyLmFsbG93U2xpZGVOZXh0ID0gdHJ1ZTtcbiAgaWYgKHN3aXBlci52aXJ0dWFsICYmIHBhcmFtcy52aXJ0dWFsLmVuYWJsZWQpIHtcbiAgICBpZiAoc2xpZGVUbykge1xuICAgICAgaWYgKCFwYXJhbXMuY2VudGVyZWRTbGlkZXMgJiYgc3dpcGVyLnNuYXBJbmRleCA9PT0gMCkge1xuICAgICAgICBzd2lwZXIuc2xpZGVUbyhzd2lwZXIudmlydHVhbC5zbGlkZXMubGVuZ3RoLCAwLCBmYWxzZSwgdHJ1ZSk7XG4gICAgICB9IGVsc2UgaWYgKHBhcmFtcy5jZW50ZXJlZFNsaWRlcyAmJiBzd2lwZXIuc25hcEluZGV4IDwgcGFyYW1zLnNsaWRlc1BlclZpZXcpIHtcbiAgICAgICAgc3dpcGVyLnNsaWRlVG8oc3dpcGVyLnZpcnR1YWwuc2xpZGVzLmxlbmd0aCArIHN3aXBlci5zbmFwSW5kZXgsIDAsIGZhbHNlLCB0cnVlKTtcbiAgICAgIH0gZWxzZSBpZiAoc3dpcGVyLnNuYXBJbmRleCA9PT0gc3dpcGVyLnNuYXBHcmlkLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgc3dpcGVyLnNsaWRlVG8oc3dpcGVyLnZpcnR1YWwuc2xpZGVzQmVmb3JlLCAwLCBmYWxzZSwgdHJ1ZSk7XG4gICAgICB9XG4gICAgfVxuICAgIHN3aXBlci5hbGxvd1NsaWRlUHJldiA9IGFsbG93U2xpZGVQcmV2O1xuICAgIHN3aXBlci5hbGxvd1NsaWRlTmV4dCA9IGFsbG93U2xpZGVOZXh0O1xuICAgIHN3aXBlci5lbWl0KCdsb29wRml4Jyk7XG4gICAgcmV0dXJuO1xuICB9XG4gIGxldCBzbGlkZXNQZXJWaWV3ID0gcGFyYW1zLnNsaWRlc1BlclZpZXc7XG4gIGlmIChzbGlkZXNQZXJWaWV3ID09PSAnYXV0bycpIHtcbiAgICBzbGlkZXNQZXJWaWV3ID0gc3dpcGVyLnNsaWRlc1BlclZpZXdEeW5hbWljKCk7XG4gIH0gZWxzZSB7XG4gICAgc2xpZGVzUGVyVmlldyA9IE1hdGguY2VpbChwYXJzZUZsb2F0KHBhcmFtcy5zbGlkZXNQZXJWaWV3LCAxMCkpO1xuICAgIGlmIChjZW50ZXJlZFNsaWRlcyAmJiBzbGlkZXNQZXJWaWV3ICUgMiA9PT0gMCkge1xuICAgICAgc2xpZGVzUGVyVmlldyA9IHNsaWRlc1BlclZpZXcgKyAxO1xuICAgIH1cbiAgfVxuICBjb25zdCBzbGlkZXNQZXJHcm91cCA9IHBhcmFtcy5zbGlkZXNQZXJHcm91cEF1dG8gPyBzbGlkZXNQZXJWaWV3IDogcGFyYW1zLnNsaWRlc1Blckdyb3VwO1xuICBsZXQgbG9vcGVkU2xpZGVzID0gc2xpZGVzUGVyR3JvdXA7XG4gIGlmIChsb29wZWRTbGlkZXMgJSBzbGlkZXNQZXJHcm91cCAhPT0gMCkge1xuICAgIGxvb3BlZFNsaWRlcyArPSBzbGlkZXNQZXJHcm91cCAtIGxvb3BlZFNsaWRlcyAlIHNsaWRlc1Blckdyb3VwO1xuICB9XG4gIGxvb3BlZFNsaWRlcyArPSBwYXJhbXMubG9vcEFkZGl0aW9uYWxTbGlkZXM7XG4gIHN3aXBlci5sb29wZWRTbGlkZXMgPSBsb29wZWRTbGlkZXM7XG4gIGNvbnN0IGdyaWRFbmFibGVkID0gc3dpcGVyLmdyaWQgJiYgcGFyYW1zLmdyaWQgJiYgcGFyYW1zLmdyaWQucm93cyA+IDE7XG4gIGlmIChzbGlkZXMubGVuZ3RoIDwgc2xpZGVzUGVyVmlldyArIGxvb3BlZFNsaWRlcykge1xuICAgIHNob3dXYXJuaW5nKCdTd2lwZXIgTG9vcCBXYXJuaW5nOiBUaGUgbnVtYmVyIG9mIHNsaWRlcyBpcyBub3QgZW5vdWdoIGZvciBsb29wIG1vZGUsIGl0IHdpbGwgYmUgZGlzYWJsZWQgYW5kIG5vdCBmdW5jdGlvbiBwcm9wZXJseS4gWW91IG5lZWQgdG8gYWRkIG1vcmUgc2xpZGVzIChvciBtYWtlIGR1cGxpY2F0ZXMpIG9yIGxvd2VyIHRoZSB2YWx1ZXMgb2Ygc2xpZGVzUGVyVmlldyBhbmQgc2xpZGVzUGVyR3JvdXAgcGFyYW1ldGVycycpO1xuICB9IGVsc2UgaWYgKGdyaWRFbmFibGVkICYmIHBhcmFtcy5ncmlkLmZpbGwgPT09ICdyb3cnKSB7XG4gICAgc2hvd1dhcm5pbmcoJ1N3aXBlciBMb29wIFdhcm5pbmc6IExvb3AgbW9kZSBpcyBub3QgY29tcGF0aWJsZSB3aXRoIGdyaWQuZmlsbCA9IGByb3dgJyk7XG4gIH1cbiAgY29uc3QgcHJlcGVuZFNsaWRlc0luZGV4ZXMgPSBbXTtcbiAgY29uc3QgYXBwZW5kU2xpZGVzSW5kZX
5196hlcyA9IFtdO1xuICBsZXQgYWN0aXZlSW5kZXggPSBzd2lwZXIuYWN0aXZlSW5kZXg7XG4gIGlmICh0eXBlb2YgYWN0aXZlU2xpZGVJbmRleCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICBhY3RpdmVTbGlkZUluZGV4ID0gc3dpcGVyLmdldFNsaWRlSW5kZXgoc2xpZGVzLmZpbHRlcihlbCA9PiBlbC5jbGFzc0xpc3QuY29udGFpbnMocGFyYW1zLnNsaWRlQWN0aXZlQ2xhc3MpKVswXSk7XG4gIH0gZWxzZSB7XG4gICAgYWN0aXZlSW5kZXggPSBhY3RpdmVTbGlkZUluZGV4O1xuICB9XG4gIGNvbnN0IGlzTmV4dCA9IGRpcmVjdGlvbiA9PT0gJ25leHQnIHx8ICFkaXJlY3Rpb247XG4gIGNvbnN0IGlzUHJldiA9IGRpcmVjdGlvbiA9PT0gJ3ByZXYnIHx8ICFkaXJlY3Rpb247XG4gIGxldCBzbGlkZXNQcmVwZW5kZWQgPSAwO1xuICBsZXQgc2xpZGVzQXBwZW5kZWQgPSAwO1xuICBjb25zdCBjb2xzID0gZ3JpZEVuYWJsZWQgPyBNYXRoLmNlaWwoc2xpZGVzLmxlbmd0aCAvIHBhcmFtcy5ncmlkLnJvd3MpIDogc2xpZGVzLmxlbmd0aDtcbiAgY29uc3QgYWN0aXZlQ29sSW5kZXggPSBncmlkRW5hYmxlZCA/IHNsaWRlc1thY3RpdmVTbGlkZUluZGV4XS5jb2x1bW4gOiBhY3RpdmVTbGlkZUluZGV4O1xuICBjb25zdCBhY3RpdmVDb2xJbmRleFdpdGhTaGlmdCA9IGFjdGl2ZUNvbEluZGV4ICsgKGNlbnRlcmVkU2xpZGVzICYmIHR5cGVvZiBzZXRUcmFuc2xhdGUgPT09ICd1bmRlZmluZWQnID8gLXNsaWRlc1BlclZpZXcgLyAyICsgMC41IDogMCk7XG4gIC8vIHByZXBlbmQgbGFzdCBzbGlkZXMgYmVmb3JlIHN0YXJ0XG4gIGlmIChhY3RpdmVDb2xJbmRleFdpdGhTaGlmdCA8IGxvb3BlZFNsaWRlcykge1xuICAgIHNsaWRlc1ByZXBlbmRlZCA9IE1hdGgubWF4KGxvb3BlZFNsaWRlcyAtIGFjdGl2ZUNvbEluZGV4V2l0aFNoaWZ0LCBzbGlkZXNQZXJHcm91cCk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsb29wZWRTbGlkZXMgLSBhY3RpdmVDb2xJbmRleFdpdGhTaGlmdDsgaSArPSAxKSB7XG4gICAgICBjb25zdCBpbmRleCA9IGkgLSBNYXRoLmZsb29yKGkgLyBjb2xzKSAqIGNvbHM7XG4gICAgICBpZiAoZ3JpZEVuYWJsZWQpIHtcbiAgICAgICAgY29uc3QgY29sSW5kZXhUb1ByZXBlbmQgPSBjb2xzIC0gaW5kZXggLSAxO1xuICAgICAgICBmb3IgKGxldCBpID0gc2xpZGVzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaSAtPSAxKSB7XG4gICAgICAgICAgaWYgKHNsaWRlc1tpXS5jb2x1bW4gPT09IGNvbEluZGV4VG9QcmVwZW5kKSBwcmVwZW5kU2xpZGVzSW5kZXhlcy5wdXNoKGkpO1xuICAgICAgICB9XG4gICAgICAgIC8vIHNsaWRlcy5mb3JFYWNoKChzbGlkZSwgc2xpZGVJbmRleCkgPT4ge1xuICAgICAgICAvLyAgIGlmIChzbGlkZS5jb2x1bW4gPT09IGNvbEluZGV4VG9QcmVwZW5kKSBwcmVwZW5kU2xpZGVzSW5kZXhlcy5wdXNoKHNsaWRlSW5kZXgpO1xuICAgICAgICAvLyB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHByZXBlbmRTbGlkZXNJbmRleGVzLnB1c2goY29scyAtIGluZGV4IC0gMSk7XG4gICAgICB9XG4gICAgfVxuICB9IGVsc2UgaWYgKGFjdGl2ZUNvbEluZGV4V2l0aFNoaWZ0ICsgc2xpZGVzUGVyVmlldyA+IGNvbHMgLSBsb29wZWRTbGlkZXMpIHtcbiAgICBzbGlkZXNBcHBlbmRlZCA9IE1hdGgubWF4KGFjdGl2ZUNvbEluZGV4V2l0aFNoaWZ0IC0gKGNvbHMgLSBsb29wZWRTbGlkZXMgKiAyKSwgc2xpZGVzUGVyR3JvdXApO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2xpZGVzQXBwZW5kZWQ7IGkgKz0gMSkge1xuICAgICAgY29uc3QgaW5kZXggPSBpIC0gTWF0aC5mbG9vcihpIC8gY29scykgKiBjb2xzO1xuICAgICAgaWYgKGdyaWRFbmFibGVkKSB7XG4gICAgICAgIHNsaWRlcy5mb3JFYWNoKChzbGlkZSwgc2xpZGVJbmRleCkgPT4ge1xuICAgICAgICAgIGlmIChzbGlkZS5jb2x1bW4gPT09IGluZGV4KSBhcHBlbmRTbGlkZXNJbmRleGVzLnB1c2goc2xpZGVJbmRleCk7XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYXBwZW5kU2xpZGVzSW5kZXhlcy5wdXNoKGluZGV4KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgc3dpcGVyLl9fcHJldmVudE9ic2VydmVyX18gPSB0cnVlO1xuICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xuICAgIHN3aXBlci5fX3ByZXZlbnRPYnNlcnZlcl9fID0gZmFsc2U7XG4gIH0pO1xuICBpZiAoaXNQcmV2KSB7XG4gICAgcHJlcGVuZFNsaWRlc0luZGV4ZXMuZm9yRWFjaChpbmRleCA9PiB7XG4gICAgICBzbGlkZXNbaW5kZXhdLnN3aXBlckxvb3BNb3ZlRE9NID0gdHJ1ZTtcbiAgICAgIHNsaWRlc0VsLnByZXBlbmQoc2xpZGVzW2luZGV4XSk7XG4gICAgICBzbGlkZXNbaW5kZXhdLnN3aXBlckxvb3BNb3ZlRE9NID0gZmFsc2U7XG4gICAgfSk7XG4gIH1cbiAgaWYgKGlzTmV4dCkge1xuICAgIGFwcGVuZFNsaWRlc0luZGV4ZXMuZm9yRWFjaChpbmRleCA9PiB7XG4gICAgICBzbGlkZXNbaW5kZXhdLnN3aXBlckxvb3BNb3ZlRE9NID0gdHJ1ZTtcbiAgICAgIHNsaWRlc0VsLmFwcGVuZChzbGlkZXNbaW5kZXhdKTtcbiAgICAgIHNsaWRlc1tpbmRleF0uc3dpcGVyTG9vcE1vdmVET00gPSBmYWxzZTtcbiAgICB9KTtcbiAgfVxuICBzd2lwZXIucmVjYWxjU2xpZGVzKCk7XG4gIGlmIChwYXJhbXMuc2xpZGVzUGVyVmlldyA9PT0gJ2F1dG8nKSB7XG4gICAgc3dpcGVyLnVwZGF0ZVNsaWRlcygpO1xuICB9IGVsc2UgaWYgKGdyaWRFbmFibGVkICYmIChwcmVwZW5kU2xpZGVzSW5kZXhlcy5sZW5ndGggPiAwICYmIGlzUHJldiB8fCBhcHBlbmRTbGlkZXNJbmRleGVzLmxlbmd0aCA+IDAgJiYgaXNOZXh0KSkge1xuICAgIHN3aXBlci5zbGlkZXMuZm9yRWFjaCgoc2xpZGUsIHNsaWRlSW5kZXgpID0+IHtcbiAgICAgIHN3aXBlci5ncmlkLnVwZGF0ZVNsaWRlKHNsaWRlSW5kZXgsIHNsaWRlLCBzd2lwZXIuc2xpZGVzKTtcbiAgICB9KTtcbiAgfVxuICBpZiAocGFyYW1zLndhdGNoU2xpZGVzUHJvZ3Jlc3MpIHtcbiAgICBzd2lwZXIudXBkYXRlU2xpZGVzT2Zmc2V0KCk7XG4gIH1cbiAgaWYgKHNsaWRlVG8pIHtcbiAgICBpZiAocHJlcGVuZFNsaWRlc0luZGV4ZXMubGVuZ3RoID4gMCAmJiBpc1ByZXYpIHtcbiAgICAgIGlmICh0eXBlb2Ygc2xpZGVSZWFsSW5kZXggPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRTbGlkZVRyYW5zbGF0ZSA9IHN3aXBlci5zbGlkZXNHcmlkW2FjdGl2ZUluZGV4XTtcbiAgICAgICAgY29uc3QgbmV3U2xpZGVUcmFuc2xhdGUgPSBzd2lwZXIuc2xpZGVzR3JpZFthY3RpdmVJbmRleCArIHNsaWRlc1ByZXBlbmRlZF07XG4gICAgICAgIGNvbnN0IGRpZmYgPSBuZXdTbGlkZVRyYW5zbGF0ZSAtIGN1cnJlbnRTbGlkZVRyYW5zbGF0ZTtcbiAgICAgICAgaWYgKGJ5TW91c2V3aGVlbCkge1xuICAgICAgICAgI
5196HN3aXBlci5zZXRUcmFuc2xhdGUoc3dpcGVyLnRyYW5zbGF0ZSAtIGRpZmYpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHN3aXBlci5zbGlkZVRvKGFjdGl2ZUluZGV4ICsgTWF0aC5jZWlsKHNsaWRlc1ByZXBlbmRlZCksIDAsIGZhbHNlLCB0cnVlKTtcbiAgICAgICAgICBpZiAoc2V0VHJhbnNsYXRlKSB7XG4gICAgICAgICAgICBzd2lwZXIudG91Y2hFdmVudHNEYXRhLnN0YXJ0VHJhbnNsYXRlID0gc3dpcGVyLnRvdWNoRXZlbnRzRGF0YS5zdGFydFRyYW5zbGF0ZSAtIGRpZmY7XG4gICAgICAgICAgICBzd2lwZXIudG91Y2hFdmVudHNEYXRhLmN1cnJlbnRUcmFuc2xhdGUgPSBzd2lwZXIudG91Y2hFdmVudHNEYXRhLmN1cnJlbnRUcmFuc2xhdGUgLSBkaWZmO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKHNldFRyYW5zbGF0ZSkge1xuICAgICAgICAgIGNvbnN0IHNoaWZ0ID0gZ3JpZEVuYWJsZWQgPyBwcmVwZW5kU2xpZGVzSW5kZXhlcy5sZW5ndGggLyBwYXJhbXMuZ3JpZC5yb3dzIDogcHJlcGVuZFNsaWRlc0luZGV4ZXMubGVuZ3RoO1xuICAgICAgICAgIHN3aXBlci5zbGlkZVRvKHN3aXBlci5hY3RpdmVJbmRleCArIHNoaWZ0LCAwLCBmYWxzZSwgdHJ1ZSk7XG4gICAgICAgICAgc3dpcGVyLnRvdWNoRXZlbnRzRGF0YS5jdXJyZW50VHJhbnNsYXRlID0gc3dpcGVyLnRyYW5zbGF0ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoYXBwZW5kU2xpZGVzSW5kZXhlcy5sZW5ndGggPiAwICYmIGlzTmV4dCkge1xuICAgICAgaWYgKHR5cGVvZiBzbGlkZVJlYWxJbmRleCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgY29uc3QgY3VycmVudFNsaWRlVHJhbnNsYXRlID0gc3dpcGVyLnNsaWRlc0dyaWRbYWN0aXZlSW5kZXhdO1xuICAgICAgICBjb25zdCBuZXdTbGlkZVRyYW5zbGF0ZSA9IHN3aXBlci5zbGlkZXNHcmlkW2FjdGl2ZUluZGV4IC0gc2xpZGVzQXBwZW5kZWRdO1xuICAgICAgICBjb25zdCBkaWZmID0gbmV3U2xpZGVUcmFuc2xhdGUgLSBjdXJyZW50U2xpZGVUcmFuc2xhdGU7XG4gICAgICAgIGlmIChieU1vdXNld2hlZWwpIHtcbiAgICAgICAgICBzd2lwZXIuc2V0VHJhbnNsYXRlKHN3aXBlci50cmFuc2xhdGUgLSBkaWZmKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzd2lwZXIuc2xpZGVUbyhhY3RpdmVJbmRleCAtIHNsaWRlc0FwcGVuZGVkLCAwLCBmYWxzZSwgdHJ1ZSk7XG4gICAgICAgICAgaWYgKHNldFRyYW5zbGF0ZSkge1xuICAgICAgICAgICAgc3dpcGVyLnRvdWNoRXZlbnRzRGF0YS5zdGFydFRyYW5zbGF0ZSA9IHN3aXBlci50b3VjaEV2ZW50c0RhdGEuc3RhcnRUcmFuc2xhdGUgLSBkaWZmO1xuICAgICAgICAgICAgc3dpcGVyLnRvdWNoRXZlbnRzRGF0YS5jdXJyZW50VHJhbnNsYXRlID0gc3dpcGVyLnRvdWNoRXZlbnRzRGF0YS5jdXJyZW50VHJhbnNsYXRlIC0gZGlmZjtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHNoaWZ0ID0gZ3JpZEVuYWJsZWQgPyBhcHBlbmRTbGlkZXNJbmRleGVzLmxlbmd0aCAvIHBhcmFtcy5ncmlkLnJvd3MgOiBhcHBlbmRTbGlkZXNJbmRleGVzLmxlbmd0aDtcbiAgICAgICAgc3dpcGVyLnNsaWRlVG8oc3dpcGVyLmFjdGl2ZUluZGV4IC0gc2hpZnQsIDAsIGZhbHNlLCB0cnVlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgc3dpcGVyLmFsbG93U2xpZGVQcmV2ID0gYWxsb3dTbGlkZVByZXY7XG4gIHN3aXBlci5hbGxvd1NsaWRlTmV4dCA9IGFsbG93U2xpZGVOZXh0O1xuICBpZiAoc3dpcGVyLmNvbnRyb2xsZXIgJiYgc3dpcGVyLmNvbnRyb2xsZXIuY29udHJvbCAmJiAhYnlDb250cm9sbGVyKSB7XG4gICAgY29uc3QgbG9vcFBhcmFtcyA9IHtcbiAgICAgIHNsaWRlUmVhbEluZGV4LFxuICAgICAgZGlyZWN0aW9uLFxuICAgICAgc2V0VHJhbnNsYXRlLFxuICAgICAgYWN0aXZlU2xpZGVJbmRleCxcbiAgICAgIGJ5Q29udHJvbGxlcjogdHJ1ZVxuICAgIH07XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoc3dpcGVyLmNvbnRyb2xsZXIuY29udHJvbCkpIHtcbiAgICAgIHN3aXBlci5jb250cm9sbGVyLmNvbnRyb2wuZm9yRWFjaChjID0+IHtcbiAgICAgICAgaWYgKCFjLmRlc3Ryb3llZCAmJiBjLnBhcmFtcy5sb29wKSBjLmxvb3BGaXgoe1xuICAgICAgICAgIC4uLmxvb3BQYXJhbXMsXG4gICAgICAgICAgc2xpZGVUbzogYy5wYXJhbXMuc2xpZGVzUGVyVmlldyA9PT0gcGFyYW1zLnNsaWRlc1BlclZpZXcgPyBzbGlkZVRvIDogZmFsc2VcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9IGVsc2UgaWYgKHN3aXBlci5jb250cm9sbGVyLmNvbnRyb2wgaW5zdGFuY2VvZiBzd2lwZXIuY29uc3RydWN0b3IgJiYgc3dpcGVyLmNvbnRyb2xsZXIuY29udHJvbC5wYXJhbXMubG9vcCkge1xuICAgICAgc3dpcGVyLmNvbnRyb2xsZXIuY29udHJvbC5sb29wRml4KHtcbiAgICAgICAgLi4ubG9vcFBhcmFtcyxcbiAgICAgICAgc2xpZGVUbzogc3dpcGVyLmNvbnRyb2xsZXIuY29udHJvbC5wYXJhbXMuc2xpZGVzUGVyVmlldyA9PT0gcGFyYW1zLnNsaWRlc1BlclZpZXcgPyBzbGlkZVRvIDogZmFsc2VcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuICBzd2lwZXIuZW1pdCgnbG9vcEZpeCcpO1xufVxuXG5mdW5jdGlvbiBsb29wRGVzdHJveSgpIHtcbiAgY29uc3Qgc3dpcGVyID0gdGhpcztcbiAgY29uc3Qge1xuICAgIHBhcmFtcyxcbiAgICBzbGlkZXNFbFxuICB9ID0gc3dpcGVyO1xuICBpZiAoIXBhcmFtcy5sb29wIHx8IHN3aXBlci52aXJ0dWFsICYmIHN3aXBlci5wYXJhbXMudmlydHVhbC5lbmFibGVkKSByZXR1cm47XG4gIHN3aXBlci5yZWNhbGNTbGlkZXMoKTtcbiAgY29uc3QgbmV3U2xpZGVzT3JkZXIgPSBbXTtcbiAgc3dpcGVyLnNsaWRlcy5mb3JFYWNoKHNsaWRlRWwgPT4ge1xuICAgIGNvbnN0IGluZGV4ID0gdHlwZW9mIHNsaWRlRWwuc3dpcGVyU2xpZGVJbmRleCA9PT0gJ3VuZGVmaW5lZCcgPyBzbGlkZUVsLmdldEF0dHJpYnV0ZSgnZGF0YS1zd2lwZXItc2xpZGUtaW5kZXgnKSAqIDEgOiBzbGlkZUVsLnN3aXBlclNsaWRlSW5kZXg7XG4gICAgbmV3
5196U2xpZGVzT3JkZXJbaW5kZXhdID0gc2xpZGVFbDtcbiAgfSk7XG4gIHN3aXBlci5zbGlkZXMuZm9yRWFjaChzbGlkZUVsID0+IHtcbiAgICBzbGlkZUVsLnJlbW92ZUF0dHJpYnV0ZSgnZGF0YS1zd2lwZXItc2xpZGUtaW5kZXgnKTtcbiAgfSk7XG4gIG5ld1NsaWRlc09yZGVyLmZvckVhY2goc2xpZGVFbCA9PiB7XG4gICAgc2xpZGVzRWwuYXBwZW5kKHNsaWRlRWwpO1xuICB9KTtcbiAgc3dpcGVyLnJlY2FsY1NsaWRlcygpO1xuICBzd2lwZXIuc2xpZGVUbyhzd2lwZXIucmVhbEluZGV4LCAwKTtcbn1cblxudmFyIGxvb3AgPSB7XG4gIGxvb3BDcmVhdGUsXG4gIGxvb3BGaXgsXG4gIGxvb3BEZXN0cm95XG59O1xuXG5mdW5jdGlvbiBzZXRHcmFiQ3Vyc29yKG1vdmluZykge1xuICBjb25zdCBzd2lwZXIgPSB0aGlzO1xuICBpZiAoIXN3aXBlci5wYXJhbXMuc2ltdWxhdGVUb3VjaCB8fCBzd2lwZXIucGFyYW1zLndhdGNoT3ZlcmZsb3cgJiYgc3dpcGVyLmlzTG9ja2VkIHx8IHN3aXBlci5wYXJhbXMuY3NzTW9kZSkgcmV0dXJuO1xuICBjb25zdCBlbCA9IHN3aXBlci5wYXJhbXMudG91Y2hFdmVudHNUYXJnZXQgPT09ICdjb250YWluZXInID8gc3dpcGVyLmVsIDogc3dpcGVyLndyYXBwZXJFbDtcbiAgaWYgKHN3aXBlci5pc0VsZW1lbnQpIHtcbiAgICBzd2lwZXIuX19wcmV2ZW50T2JzZXJ2ZXJfXyA9IHRydWU7XG4gIH1cbiAgZWwuc3R5bGUuY3Vyc29yID0gJ21vdmUnO1xuICBlbC5zdHlsZS5jdXJzb3IgPSBtb3ZpbmcgPyAnZ3JhYmJpbmcnIDogJ2dyYWInO1xuICBpZiAoc3dpcGVyLmlzRWxlbWVudCkge1xuICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICBzd2lwZXIuX19wcmV2ZW50T2JzZXJ2ZXJfXyA9IGZhbHNlO1xuICAgIH0pO1xuICB9XG59XG5cbmZ1bmN0aW9uIHVuc2V0R3JhYkN1cnNvcigpIHtcbiAgY29uc3Qgc3dpcGVyID0gdGhpcztcbiAgaWYgKHN3aXBlci5wYXJhbXMud2F0Y2hPdmVyZmxvdyAmJiBzd2lwZXIuaXNMb2NrZWQgfHwgc3dpcGVyLnBhcmFtcy5jc3NNb2RlKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmIChzd2lwZXIuaXNFbGVtZW50KSB7XG4gICAgc3dpcGVyLl9fcHJldmVudE9ic2VydmVyX18gPSB0cnVlO1xuICB9XG4gIHN3aXBlcltzd2lwZXIucGFyYW1zLnRvdWNoRXZlbnRzVGFyZ2V0ID09PSAnY29udGFpbmVyJyA/ICdlbCcgOiAnd3JhcHBlckVsJ10uc3R5bGUuY3Vyc29yID0gJyc7XG4gIGlmIChzd2lwZXIuaXNFbGVtZW50KSB7XG4gICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgIHN3aXBlci5fX3ByZXZlbnRPYnNlcnZlcl9fID0gZmFsc2U7XG4gICAgfSk7XG4gIH1cbn1cblxudmFyIGdyYWJDdXJzb3IgPSB7XG4gIHNldEdyYWJDdXJzb3IsXG4gIHVuc2V0R3JhYkN1cnNvclxufTtcblxuLy8gTW9kaWZpZWQgZnJvbSBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy81NDUyMDU1NC9jdXN0b20tZWxlbWVudC1nZXRyb290bm9kZS1jbG9zZXN0LWZ1bmN0aW9uLWNyb3NzaW5nLW11bHRpcGxlLXBhcmVudC1zaGFkb3dkXG5mdW5jdGlvbiBjbG9zZXN0RWxlbWVudChzZWxlY3RvciwgYmFzZSkge1xuICBpZiAoYmFzZSA9PT0gdm9pZCAwKSB7XG4gICAgYmFzZSA9IHRoaXM7XG4gIH1cbiAgZnVuY3Rpb24gX19jbG9zZXN0RnJvbShlbCkge1xuICAgIGlmICghZWwgfHwgZWwgPT09IGdldERvY3VtZW50KCkgfHwgZWwgPT09IGdldFdpbmRvdygpKSByZXR1cm4gbnVsbDtcbiAgICBpZiAoZWwuYXNzaWduZWRTbG90KSBlbCA9IGVsLmFzc2lnbmVkU2xvdDtcbiAgICBjb25zdCBmb3VuZCA9IGVsLmNsb3Nlc3Qoc2VsZWN0b3IpO1xuICAgIGlmICghZm91bmQgJiYgIWVsLmdldFJvb3ROb2RlKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIGZvdW5kIHx8IF9fY2xvc2VzdEZyb20oZWwuZ2V0Um9vdE5vZGUoKS5ob3N0KTtcbiAgfVxuICByZXR1cm4gX19jbG9zZXN0RnJvbShiYXNlKTtcbn1cbmZ1bmN0aW9uIHByZXZlbnRFZGdlU3dpcGUoc3dpcGVyLCBldmVudCwgc3RhcnRYKSB7XG4gIGNvbnN0IHdpbmRvdyA9IGdldFdpbmRvdygpO1xuICBjb25zdCB7XG4gICAgcGFyYW1zXG4gIH0gPSBzd2lwZXI7XG4gIGNvbnN0IGVkZ2VTd2lwZURldGVjdGlvbiA9IHBhcmFtcy5lZGdlU3dpcGVEZXRlY3Rpb247XG4gIGNvbnN0IGVkZ2VTd2lwZVRocmVzaG9sZCA9IHBhcmFtcy5lZGdlU3dpcGVUaHJlc2hvbGQ7XG4gIGlmIChlZGdlU3dpcGVEZXRlY3Rpb24gJiYgKHN0YXJ0WCA8PSBlZGdlU3dpcGVUaHJlc2hvbGQgfHwgc3RhcnRYID49IHdpbmRvdy5pbm5lcldpZHRoIC0gZWRnZVN3aXBlVGhyZXNob2xkKSkge1xuICAgIGlmIChlZGdlU3dpcGVEZXRlY3Rpb24gPT09ICdwcmV2ZW50Jykge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG5mdW5jdGlvbiBvblRvdWNoU3RhcnQoZXZlbnQpIHtcbiAgY29uc3Qgc3dpcGVyID0gdGhpcztcbiAgY29uc3QgZG9jdW1lbnQgPSBnZXREb2N1bWVudCgpO1xuICBsZXQgZSA9IGV2ZW50O1xuICBpZiAoZS5vcmlnaW5hbEV2ZW50KSBlID0gZS5vcmlnaW5hbEV2ZW50O1xuICBjb25zdCBkYXRhID0gc3dpcGVyLnRvdWNoRXZlbnRzRGF0YTtcbiAgaWYgKGUudHlwZSA9PT0gJ3BvaW50ZXJkb3duJykge1xuICAgIGlmIChkYXRhLnBvaW50ZXJJZCAhPT0gbnVsbCAmJiBkYXRhLnBvaW50ZXJJZCAhPT0gZS5wb2ludGVySWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZGF0YS5wb2ludGVySWQgPSBlLnBvaW50ZXJJZDtcbiAgfSBlbHNlIGlmIChlLnR5cGUgPT09ICd0b3VjaHN0YXJ0JyAmJiBlLnRhcmdldFRvdWNoZXMubGVuZ3RoID09PSAxKSB7XG4gICAgZGF0YS50b3VjaElkID0gZS50YXJnZXRUb3VjaGVzWzBdLmlkZW50aWZpZXI7XG4gIH1cbiAgaWYgKGUudHlwZSA9PT0gJ3RvdWNoc3RhcnQnKSB7XG4gICAgLy8gZG9uJ3QgcHJvY2VlZCB0b3VjaCBldmVudFxuICAgIHByZXZlbnRFZGdlU3dpcGUoc3dpcGVyLCBlLCBlLnRhcmdldFRvdWNoZXNbMF0ucGFnZVgpO1xuICAgIHJldHVybjtcbiAgfVxuICBjb25zdCB7XG4gICAgcGFyYW1zLFxuICAgIHRvdWNoZXMsXG4gICAgZW5hYmxlZFxuICB9ID0gc3dpcGVyO1xuICBpZiAoIWVuYWJsZWQpIHJldHVybjtcbiAgaWYgKCFwYXJhbXMuc2ltdWxhdGVUb3VjaCAmJi
5196BlLnBvaW50ZXJUeXBlID09PSAnbW91c2UnKSByZXR1cm47XG4gIGlmIChzd2lwZXIuYW5pbWF0aW5nICYmIHBhcmFtcy5wcmV2ZW50SW50ZXJhY3Rpb25PblRyYW5zaXRpb24pIHtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKCFzd2lwZXIuYW5pbWF0aW5nICYmIHBhcmFtcy5jc3NNb2RlICYmIHBhcmFtcy5sb29wKSB7XG4gICAgc3dpcGVyLmxvb3BGaXgoKTtcbiAgfVxuICBsZXQgdGFyZ2V0RWwgPSBlLnRhcmdldDtcbiAgaWYgKHBhcmFtcy50b3VjaEV2ZW50c1RhcmdldCA9PT0gJ3dyYXBwZXInKSB7XG4gICAgaWYgKCFzd2lwZXIud3JhcHBlckVsLmNvbnRhaW5zKHRhcmdldEVsKSkgcmV0dXJuO1xuICB9XG4gIGlmICgnd2hpY2gnIGluIGUgJiYgZS53aGljaCA9PT0gMykgcmV0dXJuO1xuICBpZiAoJ2J1dHRvbicgaW4gZSAmJiBlLmJ1dHRvbiA+IDApIHJldHVybjtcbiAgaWYgKGRhdGEuaXNUb3VjaGVkICYmIGRhdGEuaXNNb3ZlZCkgcmV0dXJuO1xuXG4gIC8vIGNoYW5nZSB0YXJnZXQgZWwgZm9yIHNoYWRvdyByb290IGNvbXBvbmVudFxuICBjb25zdCBzd2lwaW5nQ2xhc3NIYXNWYWx1ZSA9ICEhcGFyYW1zLm5vU3dpcGluZ0NsYXNzICYmIHBhcmFtcy5ub1N3aXBpbmdDbGFzcyAhPT0gJyc7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZVxuICBjb25zdCBldmVudFBhdGggPSBlLmNvbXBvc2VkUGF0aCA/IGUuY29tcG9zZWRQYXRoKCkgOiBlLnBhdGg7XG4gIGlmIChzd2lwaW5nQ2xhc3NIYXNWYWx1ZSAmJiBlLnRhcmdldCAmJiBlLnRhcmdldC5zaGFkb3dSb290ICYmIGV2ZW50UGF0aCkge1xuICAgIHRhcmdldEVsID0gZXZlbnRQYXRoWzBdO1xuICB9XG4gIGNvbnN0IG5vU3dpcGluZ1NlbGVjdG9yID0gcGFyYW1zLm5vU3dpcGluZ1NlbGVjdG9yID8gcGFyYW1zLm5vU3dpcGluZ1NlbGVjdG9yIDogYC4ke3BhcmFtcy5ub1N3aXBpbmdDbGFzc31gO1xuICBjb25zdCBpc1RhcmdldFNoYWRvdyA9ICEhKGUudGFyZ2V0ICYmIGUudGFyZ2V0LnNoYWRvd1Jvb3QpO1xuXG4gIC8vIHVzZSBjbG9zZXN0RWxlbWVudCBmb3Igc2hhZG93IHJvb3QgZWxlbWVudCB0byBnZXQgdGhlIGFjdHVhbCBjbG9zZXN0IGZvciBuZXN0ZWQgc2hhZG93IHJvb3QgZWxlbWVudFxuICBpZiAocGFyYW1zLm5vU3dpcGluZyAmJiAoaXNUYXJnZXRTaGFkb3cgPyBjbG9zZXN0RWxlbWVudChub1N3aXBpbmdTZWxlY3RvciwgdGFyZ2V0RWwpIDogdGFyZ2V0RWwuY2xvc2VzdChub1N3aXBpbmdTZWxlY3RvcikpKSB7XG4gICAgc3dpcGVyLmFsbG93Q2xpY2sgPSB0cnVlO1xuICAgIHJldHVybjtcbiAgfVxuICBpZiAocGFyYW1zLnN3aXBlSGFuZGxlcikge1xuICAgIGlmICghdGFyZ2V0RWwuY2xvc2VzdChwYXJhbXMuc3dpcGVIYW5kbGVyKSkgcmV0dXJuO1xuICB9XG4gIHRvdWNoZXMuY3VycmVudFggPSBlLnBhZ2VYO1xuICB0b3VjaGVzLmN1cnJlbnRZID0gZS5wYWdlWTtcbiAgY29uc3Qgc3RhcnRYID0gdG91Y2hlcy5jdXJyZW50WDtcbiAgY29uc3Qgc3RhcnRZID0gdG91Y2hlcy5jdXJyZW50WTtcblxuICAvLyBEbyBOT1Qgc3RhcnQgaWYgaU9TIGVkZ2Ugc3dpcGUgaXMgZGV0ZWN0ZWQuIE90aGVyd2lzZSBpT1MgYXBwIGNhbm5vdCBzd2lwZS10by1nby1iYWNrIGFueW1vcmVcblxuICBpZiAoIXByZXZlbnRFZGdlU3dpcGUoc3dpcGVyLCBlLCBzdGFydFgpKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIE9iamVjdC5hc3NpZ24oZGF0YSwge1xuICAgIGlzVG91Y2hlZDogdHJ1ZSxcbiAgICBpc01vdmVkOiBmYWxzZSxcbiAgICBhbGxvd1RvdWNoQ2FsbGJhY2tzOiB0cnVlLFxuICAgIGlzU2Nyb2xsaW5nOiB1bmRlZmluZWQsXG4gICAgc3RhcnRNb3Zpbmc6IHVuZGVmaW5lZFxuICB9KTtcbiAgdG91Y2hlcy5zdGFydFggPSBzdGFydFg7XG4gIHRvdWNoZXMuc3RhcnRZID0gc3RhcnRZO1xuICBkYXRhLnRvdWNoU3RhcnRUaW1lID0gbm93KCk7XG4gIHN3aXBlci5hbGxvd0NsaWNrID0gdHJ1ZTtcbiAgc3dpcGVyLnVwZGF0ZVNpemUoKTtcbiAgc3dpcGVyLnN3aXBlRGlyZWN0aW9uID0gdW5kZWZpbmVkO1xuICBpZiAocGFyYW1zLnRocmVzaG9sZCA+IDApIGRhdGEuYWxsb3dUaHJlc2hvbGRNb3ZlID0gZmFsc2U7XG4gIGxldCBwcmV2ZW50RGVmYXVsdCA9IHRydWU7XG4gIGlmICh0YXJnZXRFbC5tYXRjaGVzKGRhdGEuZm9jdXNhYmxlRWxlbWVudHMpKSB7XG4gICAgcHJldmVudERlZmF1bHQgPSBmYWxzZTtcbiAgICBpZiAodGFyZ2V0RWwubm9kZU5hbWUgPT09ICdTRUxFQ1QnKSB7XG4gICAgICBkYXRhLmlzVG91Y2hlZCA9IGZhbHNlO1xuICAgIH1cbiAgfVxuICBpZiAoZG9jdW1lbnQuYWN0aXZlRWxlbWVudCAmJiBkb2N1bWVudC5hY3RpdmVFbGVtZW50Lm1hdGNoZXMoZGF0YS5mb2N1c2FibGVFbGVtZW50cykgJiYgZG9jdW1lbnQuYWN0aXZlRWxlbWVudCAhPT0gdGFyZ2V0RWwpIHtcbiAgICBkb2N1bWVudC5hY3RpdmVFbGVtZW50LmJsdXIoKTtcbiAgfVxuICBjb25zdCBzaG91bGRQcmV2ZW50RGVmYXVsdCA9IHByZXZlbnREZWZhdWx0ICYmIHN3aXBlci5hbGxvd1RvdWNoTW92ZSAmJiBwYXJhbXMudG91Y2hTdGFydFByZXZlbnREZWZhdWx0O1xuICBpZiAoKHBhcmFtcy50b3VjaFN0YXJ0Rm9yY2VQcmV2ZW50RGVmYXVsdCB8fCBzaG91bGRQcmV2ZW50RGVmYXVsdCkgJiYgIXRhcmdldEVsLmlzQ29udGVudEVkaXRhYmxlKSB7XG4gICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICB9XG4gIGlmIChwYXJhbXMuZnJlZU1vZGUgJiYgcGFyYW1zLmZyZWVNb2RlLmVuYWJsZWQgJiYgc3dpcGVyLmZyZWVNb2RlICYmIHN3aXBlci5hbmltYXRpbmcgJiYgIXBhcmFtcy5jc3NNb2RlKSB7XG4gICAgc3dpcGVyLmZyZWVNb2RlLm9uVG91Y2hTdGFydCgpO1xuICB9XG4gIHN3aXBlci5lbWl0KCd0b3VjaFN0YXJ0JywgZSk7XG59XG5cbmZ1bmN0aW9uIG9uVG91Y2hNb3ZlKGV2ZW50KSB7XG4gIGNvbnN0IGRvY3VtZW50ID0gZ2V0RG9jdW1lbnQoKTtcbiAgY29uc3Qgc3dpcGVyID0gdGhpcztcbiAgY29uc3QgZGF0YSA9IHN3aXBlci50b3VjaEV2ZW50c0RhdGE7XG4gIGNvbnN0IHtcbiAgICBwYXJhbXMsXG4gICAgdG91Y2hlcyxcbiAgICBydGxUcmFuc2xhdGU6IHJ0bCxcbiAgICBlbmFibGVkXG4gIH0gPSBzd2lwZXI7XG4gIGlmICghZW5hYmxlZCkgcmV0dXJuO1xuICBpZiAoIXBhcmFtcy5zaW11bGF0ZVRvdWNoICYmIGV2ZW50LnBvaW50ZXJUeXBlID09PSAnbW91c2UnKSByZXR1cm47XG4gIGxldCBlID0gZXZlbnQ7XG4gIGlmIChlLm9yaWdpbmFsRXZlbnQpIGUgPSBlLm9yaWdpbmFsRXZlbnQ7XG4gIGlmIChlLnR5cGUgPT09ICdwb2ludGVybW92ZScpIHtcbiAgICBpZiAoZGF0YS50b3VjaElkICE9PSBudWxsKSByZXR1cm47IC8vIHJldHVybi
5196Bmcm9tIHBvaW50ZXIgaWYgd2UgdXNlIHRvdWNoXG4gICAgY29uc3QgaWQgPSBlLnBvaW50ZXJJZDtcbiAgICBpZiAoaWQgIT09IGRhdGEucG9pbnRlcklkKSByZXR1cm47XG4gIH1cbiAgbGV0IHRhcmdldFRvdWNoO1xuICBpZiAoZS50eXBlID09PSAndG91Y2htb3ZlJykge1xuICAgIHRhcmdldFRvdWNoID0gWy4uLmUuY2hhbmdlZFRvdWNoZXNdLmZpbHRlcih0ID0+IHQuaWRlbnRpZmllciA9PT0gZGF0YS50b3VjaElkKVswXTtcbiAgICBpZiAoIXRhcmdldFRvdWNoIHx8IHRhcmdldFRvdWNoLmlkZW50aWZpZXIgIT09IGRhdGEudG91Y2hJZCkgcmV0dXJuO1xuICB9IGVsc2Uge1xuICAgIHRhcmdldFRvdWNoID0gZTtcbiAgfVxuICBpZiAoIWRhdGEuaXNUb3VjaGVkKSB7XG4gICAgaWYgKGRhdGEuc3RhcnRNb3ZpbmcgJiYgZGF0YS5pc1Njcm9sbGluZykge1xuICAgICAgc3dpcGVyLmVtaXQoJ3RvdWNoTW92ZU9wcG9zaXRlJywgZSk7XG4gICAgfVxuICAgIHJldHVybjtcbiAgfVxuICBjb25zdCBwYWdlWCA9IHRhcmdldFRvdWNoLnBhZ2VYO1xuICBjb25zdCBwYWdlWSA9IHRhcmdldFRvdWNoLnBhZ2VZO1xuICBpZiAoZS5wcmV2ZW50ZWRCeU5lc3RlZFN3aXBlcikge1xuICAgIHRvdWNoZXMuc3RhcnRYID0gcGFnZVg7XG4gICAgdG91Y2hlcy5zdGFydFkgPSBwYWdlWTtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKCFzd2lwZXIuYWxsb3dUb3VjaE1vdmUpIHtcbiAgICBpZiAoIWUudGFyZ2V0Lm1hdGNoZXMoZGF0YS5mb2N1c2FibGVFbGVtZW50cykpIHtcbiAgICAgIHN3aXBlci5hbGxvd0NsaWNrID0gZmFsc2U7XG4gICAgfVxuICAgIGlmIChkYXRhLmlzVG91Y2hlZCkge1xuICAgICAgT2JqZWN0LmFzc2lnbih0b3VjaGVzLCB7XG4gICAgICAgIHN0YXJ0WDogcGFnZVgsXG4gICAgICAgIHN0YXJ0WTogcGFnZVksXG4gICAgICAgIGN1cnJlbnRYOiBwYWdlWCxcbiAgICAgICAgY3VycmVudFk6IHBhZ2VZXG4gICAgICB9KTtcbiAgICAgIGRhdGEudG91Y2hTdGFydFRpbWUgPSBub3coKTtcbiAgICB9XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmIChwYXJhbXMudG91Y2hSZWxlYXNlT25FZGdlcyAmJiAhcGFyYW1zLmxvb3ApIHtcbiAgICBpZiAoc3dpcGVyLmlzVmVydGljYWwoKSkge1xuICAgICAgLy8gVmVydGljYWxcbiAgICAgIGlmIChwYWdlWSA8IHRvdWNoZXMuc3RhcnRZICYmIHN3aXBlci50cmFuc2xhdGUgPD0gc3dpcGVyLm1heFRyYW5zbGF0ZSgpIHx8IHBhZ2VZID4gdG91Y2hlcy5zdGFydFkgJiYgc3dpcGVyLnRyYW5zbGF0ZSA+PSBzd2lwZXIubWluVHJhbnNsYXRlKCkpIHtcbiAgICAgICAgZGF0YS5pc1RvdWNoZWQgPSBmYWxzZTtcbiAgICAgICAgZGF0YS5pc01vdmVkID0gZmFsc2U7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHBhZ2VYIDwgdG91Y2hlcy5zdGFydFggJiYgc3dpcGVyLnRyYW5zbGF0ZSA8PSBzd2lwZXIubWF4VHJhbnNsYXRlKCkgfHwgcGFnZVggPiB0b3VjaGVzLnN0YXJ0WCAmJiBzd2lwZXIudHJhbnNsYXRlID49IHN3aXBlci5taW5UcmFuc2xhdGUoKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfVxuICBpZiAoZG9jdW1lbnQuYWN0aXZlRWxlbWVudCkge1xuICAgIGlmIChlLnRhcmdldCA9PT0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudCAmJiBlLnRhcmdldC5tYXRjaGVzKGRhdGEuZm9jdXNhYmxlRWxlbWVudHMpKSB7XG4gICAgICBkYXRhLmlzTW92ZWQgPSB0cnVlO1xuICAgICAgc3dpcGVyLmFsbG93Q2xpY2sgPSBmYWxzZTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gIH1cbiAgaWYgKGRhdGEuYWxsb3dUb3VjaENhbGxiYWNrcykge1xuICAgIHN3aXBlci5lbWl0KCd0b3VjaE1vdmUnLCBlKTtcbiAgfVxuICB0b3VjaGVzLnByZXZpb3VzWCA9IHRvdWNoZXMuY3VycmVudFg7XG4gIHRvdWNoZXMucHJldmlvdXNZID0gdG91Y2hlcy5jdXJyZW50WTtcbiAgdG91Y2hlcy5jdXJyZW50WCA9IHBhZ2VYO1xuICB0b3VjaGVzLmN1cnJlbnRZID0gcGFnZVk7XG4gIGNvbnN0IGRpZmZYID0gdG91Y2hlcy5jdXJyZW50WCAtIHRvdWNoZXMuc3RhcnRYO1xuICBjb25zdCBkaWZmWSA9IHRvdWNoZXMuY3VycmVudFkgLSB0b3VjaGVzLnN0YXJ0WTtcbiAgaWYgKHN3aXBlci5wYXJhbXMudGhyZXNob2xkICYmIE1hdGguc3FydChkaWZmWCAqKiAyICsgZGlmZlkgKiogMikgPCBzd2lwZXIucGFyYW1zLnRocmVzaG9sZCkgcmV0dXJuO1xuICBpZiAodHlwZW9mIGRhdGEuaXNTY3JvbGxpbmcgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgbGV0IHRvdWNoQW5nbGU7XG4gICAgaWYgKHN3aXBlci5pc0hvcml6b250YWwoKSAmJiB0b3VjaGVzLmN1cnJlbnRZID09PSB0b3VjaGVzLnN0YXJ0WSB8fCBzd2lwZXIuaXNWZXJ0aWNhbCgpICYmIHRvdWNoZXMuY3VycmVudFggPT09IHRvdWNoZXMuc3RhcnRYKSB7XG4gICAgICBkYXRhLmlzU2Nyb2xsaW5nID0gZmFsc2U7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZVxuICAgICAgaWYgKGRpZmZYICogZGlmZlggKyBkaWZmWSAqIGRpZmZZID49IDI1KSB7XG4gICAgICAgIHRvdWNoQW5nbGUgPSBNYXRoLmF0YW4yKE1hdGguYWJzKGRpZmZZKSwgTWF0aC5hYnMoZGlmZlgpKSAqIDE4MCAvIE1hdGguUEk7XG4gICAgICAgIGRhdGEuaXNTY3JvbGxpbmcgPSBzd2lwZXIuaXNIb3Jpem9udGFsKCkgPyB0b3VjaEFuZ2xlID4gcGFyYW1zLnRvdWNoQW5nbGUgOiA5MCAtIHRvdWNoQW5nbGUgPiBwYXJhbXMudG91Y2hBbmdsZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgaWYgKGRhdGEuaXNTY3JvbGxpbmcpIHtcbiAgICBzd2lwZXIuZW1pdCgndG91Y2hNb3ZlT3Bwb3NpdGUnLCBlKTtcbiAgfVxuICBpZiAodHlwZW9mIGRhdGEuc3RhcnRNb3ZpbmcgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgaWYgKHRvdWNoZXMuY3VycmVudFggIT09IHRvdWNoZXMuc3RhcnRYIHx8IHRvdWNoZXMuY3VycmVudFkgIT09IHRvdWNoZXMuc3RhcnRZKSB7XG4gICAgICBkYXRhLnN0YXJ0TW92aW5nID0gdHJ1ZTtcbiAgICB9XG4gIH1cbiAgaWYgKGRhdGEuaXNTY3JvbGxpbmcgfHwgZS50eXBlID09PSAndG91Y2htb3ZlJyAmJiBkYXRhLnByZXZlbn
5196RUb3VjaE1vdmVGcm9tUG9pbnRlck1vdmUpIHtcbiAgICBkYXRhLmlzVG91Y2hlZCA9IGZhbHNlO1xuICAgIHJldHVybjtcbiAgfVxuICBpZiAoIWRhdGEuc3RhcnRNb3ZpbmcpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgc3dpcGVyLmFsbG93Q2xpY2sgPSBmYWxzZTtcbiAgaWYgKCFwYXJhbXMuY3NzTW9kZSAmJiBlLmNhbmNlbGFibGUpIHtcbiAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gIH1cbiAgaWYgKHBhcmFtcy50b3VjaE1vdmVTdG9wUHJvcGFnYXRpb24gJiYgIXBhcmFtcy5uZXN0ZWQpIHtcbiAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICB9XG4gIGxldCBkaWZmID0gc3dpcGVyLmlzSG9yaXpvbnRhbCgpID8gZGlmZlggOiBkaWZmWTtcbiAgbGV0IHRvdWNoZXNEaWZmID0gc3dpcGVyLmlzSG9yaXpvbnRhbCgpID8gdG91Y2hlcy5jdXJyZW50WCAtIHRvdWNoZXMucHJldmlvdXNYIDogdG91Y2hlcy5jdXJyZW50WSAtIHRvdWNoZXMucHJldmlvdXNZO1xuICBpZiAocGFyYW1zLm9uZVdheU1vdmVtZW50KSB7XG4gICAgZGlmZiA9IE1hdGguYWJzKGRpZmYpICogKHJ0bCA/IDEgOiAtMSk7XG4gICAgdG91Y2hlc0RpZmYgPSBNYXRoLmFicyh0b3VjaGVzRGlmZikgKiAocnRsID8gMSA6IC0xKTtcbiAgfVxuICB0b3VjaGVzLmRpZmYgPSBkaWZmO1xuICBkaWZmICo9IHBhcmFtcy50b3VjaFJhdGlvO1xuICBpZiAocnRsKSB7XG4gICAgZGlmZiA9IC1kaWZmO1xuICAgIHRvdWNoZXNEaWZmID0gLXRvdWNoZXNEaWZmO1xuICB9XG4gIGNvbnN0IHByZXZUb3VjaGVzRGlyZWN0aW9uID0gc3dpcGVyLnRvdWNoZXNEaXJlY3Rpb247XG4gIHN3aXBlci5zd2lwZURpcmVjdGlvbiA9IGRpZmYgPiAwID8gJ3ByZXYnIDogJ25leHQnO1xuICBzd2lwZXIudG91Y2hlc0RpcmVjdGlvbiA9IHRvdWNoZXNEaWZmID4gMCA/ICdwcmV2JyA6ICduZXh0JztcbiAgY29uc3QgaXNMb29wID0gc3dpcGVyLnBhcmFtcy5sb29wICYmICFwYXJhbXMuY3NzTW9kZTtcbiAgY29uc3QgYWxsb3dMb29wRml4ID0gc3dpcGVyLnRvdWNoZXNEaXJlY3Rpb24gPT09ICduZXh0JyAmJiBzd2lwZXIuYWxsb3dTbGlkZU5leHQgfHwgc3dpcGVyLnRvdWNoZXNEaXJlY3Rpb24gPT09ICdwcmV2JyAmJiBzd2lwZXIuYWxsb3dTbGlkZVByZXY7XG4gIGlmICghZGF0YS5pc01vdmVkKSB7XG4gICAgaWYgKGlzTG9vcCAmJiBhbGxvd0xvb3BGaXgpIHtcbiAgICAgIHN3aXBlci5sb29wRml4KHtcbiAgICAgICAgZGlyZWN0aW9uOiBzd2lwZXIuc3dpcGVEaXJlY3Rpb25cbiAgICAgIH0pO1xuICAgIH1cbiAgICBkYXRhLnN0YXJ0VHJhbnNsYXRlID0gc3dpcGVyLmdldFRyYW5zbGF0ZSgpO1xuICAgIHN3aXBlci5zZXRUcmFuc2l0aW9uKDApO1xuICAgIGlmIChzd2lwZXIuYW5pbWF0aW5nKSB7XG4gICAgICBjb25zdCBldnQgPSBuZXcgd2luZG93LkN1c3RvbUV2ZW50KCd0cmFuc2l0aW9uZW5kJywge1xuICAgICAgICBidWJibGVzOiB0cnVlLFxuICAgICAgICBjYW5jZWxhYmxlOiB0cnVlXG4gICAgICB9KTtcbiAgICAgIHN3aXBlci53cmFwcGVyRWwuZGlzcGF0Y2hFdmVudChldnQpO1xuICAgIH1cbiAgICBkYXRhLmFsbG93TW9tZW50dW1Cb3VuY2UgPSBmYWxzZTtcbiAgICAvLyBHcmFiIEN1cnNvclxuICAgIGlmIChwYXJhbXMuZ3JhYkN1cnNvciAmJiAoc3dpcGVyLmFsbG93U2xpZGVOZXh0ID09PSB0cnVlIHx8IHN3aXBlci5hbGxvd1NsaWRlUHJldiA9PT0gdHJ1ZSkpIHtcbiAgICAgIHN3aXBlci5zZXRHcmFiQ3Vyc29yKHRydWUpO1xuICAgIH1cbiAgICBzd2lwZXIuZW1pdCgnc2xpZGVyRmlyc3RNb3ZlJywgZSk7XG4gIH1cbiAgbGV0IGxvb3BGaXhlZDtcbiAgbmV3IERhdGUoKS5nZXRUaW1lKCk7XG4gIGlmIChkYXRhLmlzTW92ZWQgJiYgZGF0YS5hbGxvd1RocmVzaG9sZE1vdmUgJiYgcHJldlRvdWNoZXNEaXJlY3Rpb24gIT09IHN3aXBlci50b3VjaGVzRGlyZWN0aW9uICYmIGlzTG9vcCAmJiBhbGxvd0xvb3BGaXggJiYgTWF0aC5hYnMoZGlmZikgPj0gMSkge1xuICAgIE9iamVjdC5hc3NpZ24odG91Y2hlcywge1xuICAgICAgc3RhcnRYOiBwYWdlWCxcbiAgICAgIHN0YXJ0WTogcGFnZVksXG4gICAgICBjdXJyZW50WDogcGFnZVgsXG4gICAgICBjdXJyZW50WTogcGFnZVksXG4gICAgICBzdGFydFRyYW5zbGF0ZTogZGF0YS5jdXJyZW50VHJhbnNsYXRlXG4gICAgfSk7XG4gICAgZGF0YS5sb29wU3dhcFJlc2V0ID0gdHJ1ZTtcbiAgICBkYXRhLnN0YXJ0VHJhbnNsYXRlID0gZGF0YS5jdXJyZW50VHJhbnNsYXRlO1xuICAgIHJldHVybjtcbiAgfVxuICBzd2lwZXIuZW1pdCgnc2xpZGVyTW92ZScsIGUpO1xuICBkYXRhLmlzTW92ZWQgPSB0cnVlO1xuICBkYXRhLmN1cnJlbnRUcmFuc2xhdGUgPSBkaWZmICsgZGF0YS5zdGFydFRyYW5zbGF0ZTtcbiAgbGV0IGRpc2FibGVQYXJlbnRTd2lwZXIgPSB0cnVlO1xuICBsZXQgcmVzaXN0YW5jZVJhdGlvID0gcGFyYW1zLnJlc2lzdGFuY2VSYXRpbztcbiAgaWYgKHBhcmFtcy50b3VjaFJlbGVhc2VPbkVkZ2VzKSB7XG4gICAgcmVzaXN0YW5jZVJhdGlvID0gMDtcbiAgfVxuICBpZiAoZGlmZiA+IDApIHtcbiAgICBpZiAoaXNMb29wICYmIGFsbG93TG9vcEZpeCAmJiAhbG9vcEZpeGVkICYmIGRhdGEuYWxsb3dUaHJlc2hvbGRNb3ZlICYmIGRhdGEuY3VycmVudFRyYW5zbGF0ZSA+IChwYXJhbXMuY2VudGVyZWRTbGlkZXMgPyBzd2lwZXIubWluVHJhbnNsYXRlKCkgLSBzd2lwZXIuc2xpZGVzU2l6ZXNHcmlkW3N3aXBlci5hY3RpdmVJbmRleCArIDFdIDogc3dpcGVyLm1pblRyYW5zbGF0ZSgpKSkge1xuICAgICAgc3dpcGVyLmxvb3BGaXgoe1xuICAgICAgICBkaXJlY3Rpb246ICdwcmV2JyxcbiAgICAgICAgc2V0VHJhbnNsYXRlOiB0cnVlLFxuICAgICAgICBhY3RpdmVTbGlkZUluZGV4OiAwXG4gICAgICB9KTtcbiAgICB9XG4gICAgaWYgKGRhdGEuY3VycmVudFRyYW5zbGF0ZSA+IHN3aXBlci5taW5UcmFuc2xhdGUoKSkge1xuICAgICAgZGlzYWJsZVBhcmVudFN3aXBlciA9IGZhbHNlO1xuICAgICAgaWYgKHBhcmFtcy5yZXNpc3RhbmNlKSB7XG4gICAgICAgIGRhdGEuY3VycmVudFRyYW5zbGF0ZSA9IHN3aXBlci5taW5UcmFuc2xhdGUoKSAtIDEgKyAoLXN3aXBlci5taW5UcmFuc2xhdGUoKSArIGRhdGEuc3RhcnRUcmFuc2xhdGUgKyBkaWZmKSAqKiByZXNpc3RhbmNlUmF0aW87XG4gICAgICB9XG4gICAgfVxuICB9IGVsc2UgaWYgKGRpZmYgPCAwKSB7XG4gICAgaWYgKGlzTG9vcCAmJiBhbGxvd0xvb3BGaXggJiYgIWxvb3BGaXhlZCAmJiBkYXRhLmFsbG93VGhyZXNob2xkTW92ZSAmJi
5196BkYXRhLmN1cnJlbnRUcmFuc2xhdGUgPCAocGFyYW1zLmNlbnRlcmVkU2xpZGVzID8gc3dpcGVyLm1heFRyYW5zbGF0ZSgpICsgc3dpcGVyLnNsaWRlc1NpemVzR3JpZFtzd2lwZXIuc2xpZGVzU2l6ZXNHcmlkLmxlbmd0aCAtIDFdIDogc3dpcGVyLm1heFRyYW5zbGF0ZSgpKSkge1xuICAgICAgc3dpcGVyLmxvb3BGaXgoe1xuICAgICAgICBkaXJlY3Rpb246ICduZXh0JyxcbiAgICAgICAgc2V0VHJhbnNsYXRlOiB0cnVlLFxuICAgICAgICBhY3RpdmVTbGlkZUluZGV4OiBzd2lwZXIuc2xpZGVzLmxlbmd0aCAtIChwYXJhbXMuc2xpZGVzUGVyVmlldyA9PT0gJ2F1dG8nID8gc3dpcGVyLnNsaWRlc1BlclZpZXdEeW5hbWljKCkgOiBNYXRoLmNlaWwocGFyc2VGbG9hdChwYXJhbXMuc2xpZGVzUGVyVmlldywgMTApKSlcbiAgICAgIH0pO1xuICAgIH1cbiAgICBpZiAoZGF0YS5jdXJyZW50VHJhbnNsYXRlIDwgc3dpcGVyLm1heFRyYW5zbGF0ZSgpKSB7XG4gICAgICBkaXNhYmxlUGFyZW50U3dpcGVyID0gZmFsc2U7XG4gICAgICBpZiAocGFyYW1zLnJlc2lzdGFuY2UpIHtcbiAgICAgICAgZGF0YS5jdXJyZW50VHJhbnNsYXRlID0gc3dpcGVyLm1heFRyYW5zbGF0ZSgpICsgMSAtIChzd2lwZXIubWF4VHJhbnNsYXRlKCkgLSBkYXRhLnN0YXJ0VHJhbnNsYXRlIC0gZGlmZikgKiogcmVzaXN0YW5jZVJhdGlvO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBpZiAoZGlzYWJsZVBhcmVudFN3aXBlcikge1xuICAgIGUucHJldmVudGVkQnlOZXN0ZWRTd2lwZXIgPSB0cnVlO1xuICB9XG5cbiAgLy8gRGlyZWN0aW9ucyBsb2Nrc1xuICBpZiAoIXN3aXBlci5hbGxvd1NsaWRlTmV4dCAmJiBzd2lwZXIuc3dpcGVEaXJlY3Rpb24gPT09ICduZXh0JyAmJiBkYXRhLmN1cnJlbnRUcmFuc2xhdGUgPCBkYXRhLnN0YXJ0VHJhbnNsYXRlKSB7XG4gICAgZGF0YS5jdXJyZW50VHJhbnNsYXRlID0gZGF0YS5zdGFydFRyYW5zbGF0ZTtcbiAgfVxuICBpZiAoIXN3aXBlci5hbGxvd1NsaWRlUHJldiAmJiBzd2lwZXIuc3dpcGVEaXJlY3Rpb24gPT09ICdwcmV2JyAmJiBkYXRhLmN1cnJlbnRUcmFuc2xhdGUgPiBkYXRhLnN0YXJ0VHJhbnNsYXRlKSB7XG4gICAgZGF0YS5jdXJyZW50VHJhbnNsYXRlID0gZGF0YS5zdGFydFRyYW5zbGF0ZTtcbiAgfVxuICBpZiAoIXN3aXBlci5hbGxvd1NsaWRlUHJldiAmJiAhc3dpcGVyLmFsbG93U2xpZGVOZXh0KSB7XG4gICAgZGF0YS5jdXJyZW50VHJhbnNsYXRlID0gZGF0YS5zdGFydFRyYW5zbGF0ZTtcbiAgfVxuXG4gIC8vIFRocmVzaG9sZFxuICBpZiAocGFyYW1zLnRocmVzaG9sZCA+IDApIHtcbiAgICBpZiAoTWF0aC5hYnMoZGlmZikgPiBwYXJhbXMudGhyZXNob2xkIHx8IGRhdGEuYWxsb3dUaHJlc2hvbGRNb3ZlKSB7XG4gICAgICBpZiAoIWRhdGEuYWxsb3dUaHJlc2hvbGRNb3ZlKSB7XG4gICAgICAgIGRhdGEuYWxsb3dUaHJlc2hvbGRNb3ZlID0gdHJ1ZTtcbiAgICAgICAgdG91Y2hlcy5zdGFydFggPSB0b3VjaGVzLmN1cnJlbnRYO1xuICAgICAgICB0b3VjaGVzLnN0YXJ0WSA9IHRvdWNoZXMuY3VycmVudFk7XG4gICAgICAgIGRhdGEuY3VycmVudFRyYW5zbGF0ZSA9IGRhdGEuc3RhcnRUcmFuc2xhdGU7XG4gICAgICAgIHRvdWNoZXMuZGlmZiA9IHN3aXBlci5pc0hvcml6b250YWwoKSA/IHRvdWNoZXMuY3VycmVudFggLSB0b3VjaGVzLnN0YXJ0WCA6IHRvdWNoZXMuY3VycmVudFkgLSB0b3VjaGVzLnN0YXJ0WTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBkYXRhLmN1cnJlbnRUcmFuc2xhdGUgPSBkYXRhLnN0YXJ0VHJhbnNsYXRlO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfVxuICBpZiAoIXBhcmFtcy5mb2xsb3dGaW5nZXIgfHwgcGFyYW1zLmNzc01vZGUpIHJldHVybjtcblxuICAvLyBVcGRhdGUgYWN0aXZlIGluZGV4IGluIGZyZWUgbW9kZVxuICBpZiAocGFyYW1zLmZyZWVNb2RlICYmIHBhcmFtcy5mcmVlTW9kZS5lbmFibGVkICYmIHN3aXBlci5mcmVlTW9kZSB8fCBwYXJhbXMud2F0Y2hTbGlkZXNQcm9ncmVzcykge1xuICAgIHN3aXBlci51cGRhdGVBY3RpdmVJbmRleCgpO1xuICAgIHN3aXBlci51cGRhdGVTbGlkZXNDbGFzc2VzKCk7XG4gIH1cbiAgaWYgKHBhcmFtcy5mcmVlTW9kZSAmJiBwYXJhbXMuZnJlZU1vZGUuZW5hYmxlZCAmJiBzd2lwZXIuZnJlZU1vZGUpIHtcbiAgICBzd2lwZXIuZnJlZU1vZGUub25Ub3VjaE1vdmUoKTtcbiAgfVxuICAvLyBVcGRhdGUgcHJvZ3Jlc3NcbiAgc3dpcGVyLnVwZGF0ZVByb2dyZXNzKGRhdGEuY3VycmVudFRyYW5zbGF0ZSk7XG4gIC8vIFVwZGF0ZSB0cmFuc2xhdGVcbiAgc3dpcGVyLnNldFRyYW5zbGF0ZShkYXRhLmN1cnJlbnRUcmFuc2xhdGUpO1xufVxuXG5mdW5jdGlvbiBvblRvdWNoRW5kKGV2ZW50KSB7XG4gIGNvbnN0IHN3aXBlciA9IHRoaXM7XG4gIGNvbnN0IGRhdGEgPSBzd2lwZXIudG91Y2hFdmVudHNEYXRhO1xuICBsZXQgZSA9IGV2ZW50O1xuICBpZiAoZS5vcmlnaW5hbEV2ZW50KSBlID0gZS5vcmlnaW5hbEV2ZW50O1xuICBsZXQgdGFyZ2V0VG91Y2g7XG4gIGNvbnN0IGlzVG91Y2hFdmVudCA9IGUudHlwZSA9PT0gJ3RvdWNoZW5kJyB8fCBlLnR5cGUgPT09ICd0b3VjaGNhbmNlbCc7XG4gIGlmICghaXNUb3VjaEV2ZW50KSB7XG4gICAgaWYgKGRhdGEudG91Y2hJZCAhPT0gbnVsbCkgcmV0dXJuOyAvLyByZXR1cm4gZnJvbSBwb2ludGVyIGlmIHdlIHVzZSB0b3VjaFxuICAgIGlmIChlLnBvaW50ZXJJZCAhPT0gZGF0YS5wb2ludGVySWQpIHJldHVybjtcbiAgICB0YXJnZXRUb3VjaCA9IGU7XG4gIH0gZWxzZSB7XG4gICAgdGFyZ2V0VG91Y2ggPSBbLi4uZS5jaGFuZ2VkVG91Y2hlc10uZmlsdGVyKHQgPT4gdC5pZGVudGlmaWVyID09PSBkYXRhLnRvdWNoSWQpWzBdO1xuICAgIGlmICghdGFyZ2V0VG91Y2ggfHwgdGFyZ2V0VG91Y2guaWRlbnRpZmllciAhPT0gZGF0YS50b3VjaElkKSByZXR1cm47XG4gIH1cbiAgaWYgKFsncG9pbnRlcmNhbmNlbCcsICdwb2ludGVyb3V0JywgJ3BvaW50ZXJsZWF2ZScsICdjb250ZXh0bWVudSddLmluY2x1ZGVzKGUudHlwZSkpIHtcbiAgICBjb25zdCBwcm9jZWVkID0gWydwb2ludGVyY2FuY2VsJywgJ2NvbnRleHRtZW51J10uaW5jbHVkZXMoZS50eXBlKSAmJiAoc3dpcGVyLmJyb3dzZXIuaXNTYWZhcmkgfHwgc3dpcGVyLmJyb3dzZXIuaXNXZWJWaWV3KTtcbiAgICBpZiAoIXByb2NlZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gI
5196H1cbiAgZGF0YS5wb2ludGVySWQgPSBudWxsO1xuICBkYXRhLnRvdWNoSWQgPSBudWxsO1xuICBjb25zdCB7XG4gICAgcGFyYW1zLFxuICAgIHRvdWNoZXMsXG4gICAgcnRsVHJhbnNsYXRlOiBydGwsXG4gICAgc2xpZGVzR3JpZCxcbiAgICBlbmFibGVkXG4gIH0gPSBzd2lwZXI7XG4gIGlmICghZW5hYmxlZCkgcmV0dXJuO1xuICBpZiAoIXBhcmFtcy5zaW11bGF0ZVRvdWNoICYmIGUucG9pbnRlclR5cGUgPT09ICdtb3VzZScpIHJldHVybjtcbiAgaWYgKGRhdGEuYWxsb3dUb3VjaENhbGxiYWNrcykge1xuICAgIHN3aXBlci5lbWl0KCd0b3VjaEVuZCcsIGUpO1xuICB9XG4gIGRhdGEuYWxsb3dUb3VjaENhbGxiYWNrcyA9IGZhbHNlO1xuICBpZiAoIWRhdGEuaXNUb3VjaGVkKSB7XG4gICAgaWYgKGRhdGEuaXNNb3ZlZCAmJiBwYXJhbXMuZ3JhYkN1cnNvcikge1xuICAgICAgc3dpcGVyLnNldEdyYWJDdXJzb3IoZmFsc2UpO1xuICAgIH1cbiAgICBkYXRhLmlzTW92ZWQgPSBmYWxzZTtcbiAgICBkYXRhLnN0YXJ0TW92aW5nID0gZmFsc2U7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gUmV0dXJuIEdyYWIgQ3Vyc29yXG4gIGlmIChwYXJhbXMuZ3JhYkN1cnNvciAmJiBkYXRhLmlzTW92ZWQgJiYgZGF0YS5pc1RvdWNoZWQgJiYgKHN3aXBlci5hbGxvd1NsaWRlTmV4dCA9PT0gdHJ1ZSB8fCBzd2lwZXIuYWxsb3dTbGlkZVByZXYgPT09IHRydWUpKSB7XG4gICAgc3dpcGVyLnNldEdyYWJDdXJzb3IoZmFsc2UpO1xuICB9XG5cbiAgLy8gVGltZSBkaWZmXG4gIGNvbnN0IHRvdWNoRW5kVGltZSA9IG5vdygpO1xuICBjb25zdCB0aW1lRGlmZiA9IHRvdWNoRW5kVGltZSAtIGRhdGEudG91Y2hTdGFydFRpbWU7XG5cbiAgLy8gVGFwLCBkb3VibGVUYXAsIENsaWNrXG4gIGlmIChzd2lwZXIuYWxsb3dDbGljaykge1xuICAgIGNvbnN0IHBhdGhUcmVlID0gZS5wYXRoIHx8IGUuY29tcG9zZWRQYXRoICYmIGUuY29tcG9zZWRQYXRoKCk7XG4gICAgc3dpcGVyLnVwZGF0ZUNsaWNrZWRTbGlkZShwYXRoVHJlZSAmJiBwYXRoVHJlZVswXSB8fCBlLnRhcmdldCwgcGF0aFRyZWUpO1xuICAgIHN3aXBlci5lbWl0KCd0YXAgY2xpY2snLCBlKTtcbiAgICBpZiAodGltZURpZmYgPCAzMDAgJiYgdG91Y2hFbmRUaW1lIC0gZGF0YS5sYXN0Q2xpY2tUaW1lIDwgMzAwKSB7XG4gICAgICBzd2lwZXIuZW1pdCgnZG91YmxlVGFwIGRvdWJsZUNsaWNrJywgZSk7XG4gICAgfVxuICB9XG4gIGRhdGEubGFzdENsaWNrVGltZSA9IG5vdygpO1xuICBuZXh0VGljaygoKSA9PiB7XG4gICAgaWYgKCFzd2lwZXIuZGVzdHJveWVkKSBzd2lwZXIuYWxsb3dDbGljayA9IHRydWU7XG4gIH0pO1xuICBpZiAoIWRhdGEuaXNUb3VjaGVkIHx8ICFkYXRhLmlzTW92ZWQgfHwgIXN3aXBlci5zd2lwZURpcmVjdGlvbiB8fCB0b3VjaGVzLmRpZmYgPT09IDAgJiYgIWRhdGEubG9vcFN3YXBSZXNldCB8fCBkYXRhLmN1cnJlbnRUcmFuc2xhdGUgPT09IGRhdGEuc3RhcnRUcmFuc2xhdGUgJiYgIWRhdGEubG9vcFN3YXBSZXNldCkge1xuICAgIGRhdGEuaXNUb3VjaGVkID0gZmFsc2U7XG4gICAgZGF0YS5pc01vdmVkID0gZmFsc2U7XG4gICAgZGF0YS5zdGFydE1vdmluZyA9IGZhbHNlO1xuICAgIHJldHVybjtcbiAgfVxuICBkYXRhLmlzVG91Y2hlZCA9IGZhbHNlO1xuICBkYXRhLmlzTW92ZWQgPSBmYWxzZTtcbiAgZGF0YS5zdGFydE1vdmluZyA9IGZhbHNlO1xuICBsZXQgY3VycmVudFBvcztcbiAgaWYgKHBhcmFtcy5mb2xsb3dGaW5nZXIpIHtcbiAgICBjdXJyZW50UG9zID0gcnRsID8gc3dpcGVyLnRyYW5zbGF0ZSA6IC1zd2lwZXIudHJhbnNsYXRlO1xuICB9IGVsc2Uge1xuICAgIGN1cnJlbnRQb3MgPSAtZGF0YS5jdXJyZW50VHJhbnNsYXRlO1xuICB9XG4gIGlmIChwYXJhbXMuY3NzTW9kZSkge1xuICAgIHJldHVybjtcbiAgfVxuICBpZiAocGFyYW1zLmZyZWVNb2RlICYmIHBhcmFtcy5mcmVlTW9kZS5lbmFibGVkKSB7XG4gICAgc3dpcGVyLmZyZWVNb2RlLm9uVG91Y2hFbmQoe1xuICAgICAgY3VycmVudFBvc1xuICAgIH0pO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIEZpbmQgY3VycmVudCBzbGlkZVxuICBjb25zdCBzd2lwZVRvTGFzdCA9IGN1cnJlbnRQb3MgPj0gLXN3aXBlci5tYXhUcmFuc2xhdGUoKSAmJiAhc3dpcGVyLnBhcmFtcy5sb29wO1xuICBsZXQgc3RvcEluZGV4ID0gMDtcbiAgbGV0IGdyb3VwU2l6ZSA9IHN3aXBlci5zbGlkZXNTaXplc0dyaWRbMF07XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgc2xpZGVzR3JpZC5sZW5ndGg7IGkgKz0gaSA8IHBhcmFtcy5zbGlkZXNQZXJHcm91cFNraXAgPyAxIDogcGFyYW1zLnNsaWRlc1Blckdyb3VwKSB7XG4gICAgY29uc3QgaW5jcmVtZW50ID0gaSA8IHBhcmFtcy5zbGlkZXNQZXJHcm91cFNraXAgLSAxID8gMSA6IHBhcmFtcy5zbGlkZXNQZXJHcm91cDtcbiAgICBpZiAodHlwZW9mIHNsaWRlc0dyaWRbaSArIGluY3JlbWVudF0gIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBpZiAoc3dpcGVUb0xhc3QgfHwgY3VycmVudFBvcyA+PSBzbGlkZXNHcmlkW2ldICYmIGN1cnJlbnRQb3MgPCBzbGlkZXNHcmlkW2kgKyBpbmNyZW1lbnRdKSB7XG4gICAgICAgIHN0b3BJbmRleCA9IGk7XG4gICAgICAgIGdyb3VwU2l6ZSA9IHNsaWRlc0dyaWRbaSArIGluY3JlbWVudF0gLSBzbGlkZXNHcmlkW2ldO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoc3dpcGVUb0xhc3QgfHwgY3VycmVudFBvcyA+PSBzbGlkZXNHcmlkW2ldKSB7XG4gICAgICBzdG9wSW5kZXggPSBpO1xuICAgICAgZ3JvdXBTaXplID0gc2xpZGVzR3JpZFtzbGlkZXNHcmlkLmxlbmd0aCAtIDFdIC0gc2xpZGVzR3JpZFtzbGlkZXNHcmlkLmxlbmd0aCAtIDJdO1xuICAgIH1cbiAgfVxuICBsZXQgcmV3aW5kRmlyc3RJbmRleCA9IG51bGw7XG4gIGxldCByZXdpbmRMYXN0SW5kZXggPSBudWxsO1xuICBpZiAocGFyYW1zLnJld2luZCkge1xuICAgIGlmIChzd2lwZXIuaXNCZWdpbm5pbmcpIHtcbiAgICAgIHJld2luZExhc3RJbmRleCA9IHBhcmFtcy52aXJ0dWFsICYmIHBhcmFtcy52aXJ0dWFsLmVuYWJsZWQgJiYgc3dpcGVyLnZpcnR1YWwgPyBzd2lwZXIudmlydHVhbC5zbGlkZXMubGVuZ3RoIC0gMSA6IHN3aXBlci5zbGlkZXMubGVuZ3RoIC0gMTtcbiAgICB9IGVsc2UgaWYgKHN3aXBlci5pc0VuZCkge1xuICAgICAgcmV3aW5kRmlyc3RJbmRleCA9IDA7XG4gICAgfVxuICB9XG4gIC8vIEZpbmQgY3VycmVudCBzbGlkZSBzaXplXG4gIGNvbnN0IHJhdGlvID0gKGN1cnJlbnRQb3MgLSBzbGlkZXNHcmlkW3N0b3BJbmRleF0pIC8gZ3JvdXBTaXplO1xuICBjb25zdCBpbmNyZW1lbnQgPSBzdG9wSW5kZXggPCBwYXJhbXMuc2xpZGVzUGVyR3JvdXBTa2lwIC0gMSA/IDEgOiBwYXJhbXMuc2xpZGVzUGVyR3JvdXA7XG4gIGlmICh0aW1lRGlmZiA+IHBhcmFtcy5sb25nU3dpcGVzTXMpIHtcbiAgICAvLyBMb25nIHRvdWNoZXNcbiAgICBpZiAoIXBhcmFtcy5sb25nU3dpcGVzKSB7XG4gICAgICBzd2lwZXIuc2xpZGVUbyhzd2lwZXIuYWN0aXZlSW5kZXgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoc3dpcGVyLnN3aXBlRGlyZWN0aW9uID09PSAnbmV4dCcpIHtcbiAgICAgIGlmIChyYXRpbyA+PSBwYXJhbXMubG9uZ1N3aXBlc1JhdGlvKSBzd2lwZXIuc2xpZGVUbyhwYXJhbXMucmV3aW5kICYmIHN3aXBlci5pc0VuZCA/IHJld2luZEZpcnN0SW5kZXggOiBzdG9wSW5kZXggKyBpbmNyZW1lbnQpO2Vsc2Ug
5196c3dpcGVyLnNsaWRlVG8oc3RvcEluZGV4KTtcbiAgICB9XG4gICAgaWYgKHN3aXBlci5zd2lwZURpcmVjdGlvbiA9PT0gJ3ByZXYnKSB7XG4gICAgICBpZiAocmF0aW8gPiAxIC0gcGFyYW1zLmxvbmdTd2lwZXNSYXRpbykge1xuICAgICAgICBzd2lwZXIuc2xpZGVUbyhzdG9wSW5kZXggKyBpbmNyZW1lbnQpO1xuICAgICAgfSBlbHNlIGlmIChyZXdpbmRMYXN0SW5kZXggIT09IG51bGwgJiYgcmF0aW8gPCAwICYmIE1hdGguYWJzKHJhdGlvKSA+IHBhcmFtcy5sb25nU3dpcGVzUmF0aW8pIHtcbiAgICAgICAgc3dpcGVyLnNsaWRlVG8ocmV3aW5kTGFzdEluZGV4KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHN3aXBlci5zbGlkZVRvKHN0b3BJbmRleCk7XG4gICAgICB9XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIC8vIFNob3J0IHN3aXBlc1xuICAgIGlmICghcGFyYW1zLnNob3J0U3dpcGVzKSB7XG4gICAgICBzd2lwZXIuc2xpZGVUbyhzd2lwZXIuYWN0aXZlSW5kZXgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBpc05hdkJ1dHRvblRhcmdldCA9IHN3aXBlci5uYXZpZ2F0aW9uICYmIChlLnRhcmdldCA9PT0gc3dpcGVyLm5hdmlnYXRpb24ubmV4dEVsIHx8IGUudGFyZ2V0ID09PSBzd2lwZXIubmF2aWdhdGlvbi5wcmV2RWwpO1xuICAgIGlmICghaXNOYXZCdXR0b25UYXJnZXQpIHtcbiAgICAgIGlmIChzd2lwZXIuc3dpcGVEaXJlY3Rpb24gPT09ICduZXh0Jykge1xuICAgICAgICBzd2lwZXIuc2xpZGVUbyhyZXdpbmRGaXJzdEluZGV4ICE9PSBudWxsID8gcmV3aW5kRmlyc3RJbmRleCA6IHN0b3BJbmRleCArIGluY3JlbWVudCk7XG4gICAgICB9XG4gICAgICBpZiAoc3dpcGVyLnN3aXBlRGlyZWN0aW9uID09PSAncHJldicpIHtcbiAgICAgICAgc3dpcGVyLnNsaWRlVG8ocmV3aW5kTGFzdEluZGV4ICE9PSBudWxsID8gcmV3aW5kTGFzdEluZGV4IDogc3RvcEluZGV4KTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGUudGFyZ2V0ID09PSBzd2lwZXIubmF2aWdhdGlvbi5uZXh0RWwpIHtcbiAgICAgIHN3aXBlci5zbGlkZVRvKHN0b3BJbmRleCArIGluY3JlbWVudCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN3aXBlci5zbGlkZVRvKHN0b3BJbmRleCk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIG9uUmVzaXplKCkge1xuICBjb25zdCBzd2lwZXIgPSB0aGlzO1xuICBjb25zdCB7XG4gICAgcGFyYW1zLFxuICAgIGVsXG4gIH0gPSBzd2lwZXI7XG4gIGlmIChlbCAmJiBlbC5vZmZzZXRXaWR0aCA9PT0gMCkgcmV0dXJuO1xuXG4gIC8vIEJyZWFrcG9pbnRzXG4gIGlmIChwYXJhbXMuYnJlYWtwb2ludHMpIHtcbiAgICBzd2lwZXIuc2V0QnJlYWtwb2ludCgpO1xuICB9XG5cbiAgLy8gU2F2ZSBsb2Nrc1xuICBjb25zdCB7XG4gICAgYWxsb3dTbGlkZU5leHQsXG4gICAgYWxsb3dTbGlkZVByZXYsXG4gICAgc25hcEdyaWRcbiAgfSA9IHN3aXBlcjtcbiAgY29uc3QgaXNWaXJ0dWFsID0gc3dpcGVyLnZpcnR1YWwgJiYgc3dpcGVyLnBhcmFtcy52aXJ0dWFsLmVuYWJsZWQ7XG5cbiAgLy8gRGlzYWJsZSBsb2NrcyBvbiByZXNpemVcbiAgc3dpcGVyLmFsbG93U2xpZGVOZXh0ID0gdHJ1ZTtcbiAgc3dpcGVyLmFsbG93U2xpZGVQcmV2ID0gdHJ1ZTtcbiAgc3dpcGVyLnVwZGF0ZVNpemUoKTtcbiAgc3dpcGVyLnVwZGF0ZVNsaWRlcygpO1xuICBzd2lwZXIudXBkYXRlU2xpZGVzQ2xhc3NlcygpO1xuICBjb25zdCBpc1ZpcnR1YWxMb29wID0gaXNWaXJ0dWFsICYmIHBhcmFtcy5sb29wO1xuICBpZiAoKHBhcmFtcy5zbGlkZXNQZXJWaWV3ID09PSAnYXV0bycgfHwgcGFyYW1zLnNsaWRlc1BlclZpZXcgPiAxKSAmJiBzd2lwZXIuaXNFbmQgJiYgIXN3aXBlci5pc0JlZ2lubmluZyAmJiAhc3dpcGVyLnBhcmFtcy5jZW50ZXJlZFNsaWRlcyAmJiAhaXNWaXJ0dWFsTG9vcCkge1xuICAgIHN3aXBlci5zbGlkZVRvKHN3aXBlci5zbGlkZXMubGVuZ3RoIC0gMSwgMCwgZmFsc2UsIHRydWUpO1xuICB9IGVsc2Uge1xuICAgIGlmIChzd2lwZXIucGFyYW1zLmxvb3AgJiYgIWlzVmlydHVhbCkge1xuICAgICAgc3dpcGVyLnNsaWRlVG9Mb29wKHN3aXBlci5yZWFsSW5kZXgsIDAsIGZhbHNlLCB0cnVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc3dpcGVyLnNsaWRlVG8oc3dpcGVyLmFjdGl2ZUluZGV4LCAwLCBmYWxzZSwgdHJ1ZSk7XG4gICAgfVxuICB9XG4gIGlmIChzd2lwZXIuYXV0b3BsYXkgJiYgc3dpcGVyLmF1dG9wbGF5LnJ1bm5pbmcgJiYgc3dpcGVyLmF1dG9wbGF5LnBhdXNlZCkge1xuICAgIGNsZWFyVGltZW91dChzd2lwZXIuYXV0b3BsYXkucmVzaXplVGltZW91dCk7XG4gICAgc3dpcGVyLmF1dG9wbGF5LnJlc2l6ZVRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGlmIChzd2lwZXIuYXV0b3BsYXkgJiYgc3dpcGVyLmF1dG9wbGF5LnJ1bm5pbmcgJiYgc3dpcGVyLmF1dG9wbGF5LnBhdXNlZCkge1xuICAgICAgICBzd2lwZXIuYXV0b3BsYXkucmVzdW1lKCk7XG4gICAgICB9XG4gICAgfSwgNTAwKTtcbiAgfVxuICAvLyBSZXR1cm4gbG9ja3MgYWZ0ZXIgcmVzaXplXG4gIHN3aXBlci5hbGxvd1NsaWRlUHJldiA9IGFsbG93U2xpZGVQcmV2O1xuICBzd2lwZXIuYWxsb3dTbGlkZU5leHQgPSBhbGxvd1NsaWRlTmV4dDtcbiAgaWYgKHN3aXBlci5wYXJhbXMud2F0Y2hPdmVyZmxvdyAmJiBzbmFwR3JpZCAhPT0gc3dpcGVyLnNuYXBHcmlkKSB7XG4gICAgc3dpcGVyLmNoZWNrT3ZlcmZsb3coKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBvbkNsaWNrKGUpIHtcbiAgY29uc3Qgc3dpcGVyID0gdGhpcztcbiAgaWYgKCFzd2lwZXIuZW5hYmxlZCkgcmV0dXJuO1xuICBpZiAoIXN3aXBlci5hbGxvd0NsaWNrKSB7XG4gICAgaWYgKHN3aXBlci5wYXJhbXMucHJldmVudENsaWNrcykgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGlmIChzd2lwZXIucGFyYW1zLnByZXZlbnRDbGlja3NQcm9wYWdhdGlvbiAmJiBzd2lwZXIuYW5pbWF0aW5nKSB7XG4gICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gb25TY3JvbGwoKSB7XG4gIGNvbnN0IHN3aXBlciA9IHRoaXM7XG4gIGNvbnN0IHtcbiAgICB3cmFwcGVyRWwsXG4gICAgcnRsVHJhbnNsYXRlLFxuICAgIGVuYWJsZWRcbiAgfSA9IHN3aXBlcjtcbiAgaWYgKCFlbmFibGVkKSByZXR1cm47XG4gIHN3aXBlci5wcmV2aW91c1RyYW5zbGF0ZSA9IHN3aXBlci50cmFuc2xhdGU7XG4gIGlmIChzd2lwZXIuaXNIb3Jpem9udGFsKCkpIHtcbiAgICBzd2lwZXIudHJhbnNsYXRlID0gLXdyYXBwZXJFbC5zY3JvbGxMZWZ0O1xuICB9IGVsc2Uge1xuICAgIHN3aXBlci50cmFuc2xhdGUgPSAtd3JhcHBlckVsLnNjcm9sbFRvcDtcbiAgfVxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmVcbiAgaWYgKHN3aXBlci50cmFuc2xhdGUgPT09IDApIHN3aXBlci50cmFuc2xhdGUgPSAwO1xuICBzd2lwZXIudXBkYXRlQWN0aXZlSW5kZXgoKTtcbiAgc3dpcGVyLnVwZGF0ZVNsaWRlc0NsYXNzZXMoKTtcbiAgbGV0IG5ld1Byb2dyZXNzO1xuICBjb25zdCB0cmFuc2xhdGVzRGlmZiA9IHN3aXBlci5tYXhUcmFuc2xhdGUoKSAtIHN3aXBlci5taW5UcmFuc2xhdGUoKTtcbiAgaWYgKHRyYW5zbGF0ZXNEaWZmID09PSAwKSB7XG4gICAgbmV3
5196UHJvZ3Jlc3MgPSAwO1xuICB9IGVsc2Uge1xuICAgIG5ld1Byb2dyZXNzID0gKHN3aXBlci50cmFuc2xhdGUgLSBzd2lwZXIubWluVHJhbnNsYXRlKCkpIC8gdHJhbnNsYXRlc0RpZmY7XG4gIH1cbiAgaWYgKG5ld1Byb2dyZXNzICE9PSBzd2lwZXIucHJvZ3Jlc3MpIHtcbiAgICBzd2lwZXIudXBkYXRlUHJvZ3Jlc3MocnRsVHJhbnNsYXRlID8gLXN3aXBlci50cmFuc2xhdGUgOiBzd2lwZXIudHJhbnNsYXRlKTtcbiAgfVxuICBzd2lwZXIuZW1pdCgnc2V0VHJhbnNsYXRlJywgc3dpcGVyLnRyYW5zbGF0ZSwgZmFsc2UpO1xufVxuXG5mdW5jdGlvbiBvbkxvYWQoZSkge1xuICBjb25zdCBzd2lwZXIgPSB0aGlzO1xuICBwcm9jZXNzTGF6eVByZWxvYWRlcihzd2lwZXIsIGUudGFyZ2V0KTtcbiAgaWYgKHN3aXBlci5wYXJhbXMuY3NzTW9kZSB8fCBzd2lwZXIucGFyYW1zLnNsaWRlc1BlclZpZXcgIT09ICdhdXRvJyAmJiAhc3dpcGVyLnBhcmFtcy5hdXRvSGVpZ2h0KSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIHN3aXBlci51cGRhdGUoKTtcbn1cblxuZnVuY3Rpb24gb25Eb2N1bWVudFRvdWNoU3RhcnQoKSB7XG4gIGNvbnN0IHN3aXBlciA9IHRoaXM7XG4gIGlmIChzd2lwZXIuZG9jdW1lbnRUb3VjaEhhbmRsZXJQcm9jZWVkZWQpIHJldHVybjtcbiAgc3dpcGVyLmRvY3VtZW50VG91Y2hIYW5kbGVyUHJvY2VlZGVkID0gdHJ1ZTtcbiAgaWYgKHN3aXBlci5wYXJhbXMudG91Y2hSZWxlYXNlT25FZGdlcykge1xuICAgIHN3aXBlci5lbC5zdHlsZS50b3VjaEFjdGlvbiA9ICdhdXRvJztcbiAgfVxufVxuXG5jb25zdCBldmVudHMgPSAoc3dpcGVyLCBtZXRob2QpID0+IHtcbiAgY29uc3QgZG9jdW1lbnQgPSBnZXREb2N1bWVudCgpO1xuICBjb25zdCB7XG4gICAgcGFyYW1zLFxuICAgIGVsLFxuICAgIHdyYXBwZXJFbCxcbiAgICBkZXZpY2VcbiAgfSA9IHN3aXBlcjtcbiAgY29uc3QgY2FwdHVyZSA9ICEhcGFyYW1zLm5lc3RlZDtcbiAgY29uc3QgZG9tTWV0aG9kID0gbWV0aG9kID09PSAnb24nID8gJ2FkZEV2ZW50TGlzdGVuZXInIDogJ3JlbW92ZUV2ZW50TGlzdGVuZXInO1xuICBjb25zdCBzd2lwZXJNZXRob2QgPSBtZXRob2Q7XG5cbiAgLy8gVG91Y2ggRXZlbnRzXG4gIGRvY3VtZW50W2RvbU1ldGhvZF0oJ3RvdWNoc3RhcnQnLCBzd2lwZXIub25Eb2N1bWVudFRvdWNoU3RhcnQsIHtcbiAgICBwYXNzaXZlOiBmYWxzZSxcbiAgICBjYXB0dXJlXG4gIH0pO1xuICBlbFtkb21NZXRob2RdKCd0b3VjaHN0YXJ0Jywgc3dpcGVyLm9uVG91Y2hTdGFydCwge1xuICAgIHBhc3NpdmU6IGZhbHNlXG4gIH0pO1xuICBlbFtkb21NZXRob2RdKCdwb2ludGVyZG93bicsIHN3aXBlci5vblRvdWNoU3RhcnQsIHtcbiAgICBwYXNzaXZlOiBmYWxzZVxuICB9KTtcbiAgZG9jdW1lbnRbZG9tTWV0aG9kXSgndG91Y2htb3ZlJywgc3dpcGVyLm9uVG91Y2hNb3ZlLCB7XG4gICAgcGFzc2l2ZTogZmFsc2UsXG4gICAgY2FwdHVyZVxuICB9KTtcbiAgZG9jdW1lbnRbZG9tTWV0aG9kXSgncG9pbnRlcm1vdmUnLCBzd2lwZXIub25Ub3VjaE1vdmUsIHtcbiAgICBwYXNzaXZlOiBmYWxzZSxcbiAgICBjYXB0dXJlXG4gIH0pO1xuICBkb2N1bWVudFtkb21NZXRob2RdKCd0b3VjaGVuZCcsIHN3aXBlci5vblRvdWNoRW5kLCB7XG4gICAgcGFzc2l2ZTogdHJ1ZVxuICB9KTtcbiAgZG9jdW1lbnRbZG9tTWV0aG9kXSgncG9pbnRlcnVwJywgc3dpcGVyLm9uVG91Y2hFbmQsIHtcbiAgICBwYXNzaXZlOiB0cnVlXG4gIH0pO1xuICBkb2N1bWVudFtkb21NZXRob2RdKCdwb2ludGVyY2FuY2VsJywgc3dpcGVyLm9uVG91Y2hFbmQsIHtcbiAgICBwYXNzaXZlOiB0cnVlXG4gIH0pO1xuICBkb2N1bWVudFtkb21NZXRob2RdKCd0b3VjaGNhbmNlbCcsIHN3aXBlci5vblRvdWNoRW5kLCB7XG4gICAgcGFzc2l2ZTogdHJ1ZVxuICB9KTtcbiAgZG9jdW1lbnRbZG9tTWV0aG9kXSgncG9pbnRlcm91dCcsIHN3aXBlci5vblRvdWNoRW5kLCB7XG4gICAgcGFzc2l2ZTogdHJ1ZVxuICB9KTtcbiAgZG9jdW1lbnRbZG9tTWV0aG9kXSgncG9pbnRlcmxlYXZlJywgc3dpcGVyLm9uVG91Y2hFbmQsIHtcbiAgICBwYXNzaXZlOiB0cnVlXG4gIH0pO1xuICBkb2N1bWVudFtkb21NZXRob2RdKCdjb250ZXh0bWVudScsIHN3aXBlci5vblRvdWNoRW5kLCB7XG4gICAgcGFzc2l2ZTogdHJ1ZVxuICB9KTtcblxuICAvLyBQcmV2ZW50IExpbmtzIENsaWNrc1xuICBpZiAocGFyYW1zLnByZXZlbnRDbGlja3MgfHwgcGFyYW1zLnByZXZlbnRDbGlja3NQcm9wYWdhdGlvbikge1xuICAgIGVsW2RvbU1ldGhvZF0oJ2NsaWNrJywgc3dpcGVyLm9uQ2xpY2ssIHRydWUpO1xuICB9XG4gIGlmIChwYXJhbXMuY3NzTW9kZSkge1xuICAgIHdyYXBwZXJFbFtkb21NZXRob2RdKCdzY3JvbGwnLCBzd2lwZXIub25TY3JvbGwpO1xuICB9XG5cbiAgLy8gUmVzaXplIGhhbmRsZXJcbiAgaWYgKHBhcmFtcy51cGRhdGVPbldpbmRvd1Jlc2l6ZSkge1xuICAgIHN3aXBlcltzd2lwZXJNZXRob2RdKGRldmljZS5pb3MgfHwgZGV2aWNlLmFuZHJvaWQgPyAncmVzaXplIG9yaWVudGF0aW9uY2hhbmdlIG9ic2VydmVyVXBkYXRlJyA6ICdyZXNpemUgb2JzZXJ2ZXJVcGRhdGUnLCBvblJlc2l6ZSwgdHJ1ZSk7XG4gIH0gZWxzZSB7XG4gICAgc3dpcGVyW3N3aXBlck1ldGhvZF0oJ29ic2VydmVyVXBkYXRlJywgb25SZXNpemUsIHRydWUpO1xuICB9XG5cbiAgLy8gSW1hZ2VzIGxvYWRlclxuICBlbFtkb21NZXRob2RdKCdsb2FkJywgc3dpcGVyLm9uTG9hZCwge1xuICAgIGNhcHR1cmU6IHRydWVcbiAgfSk7XG59O1xuZnVuY3Rpb24gYXR0YWNoRXZlbnRzKCkge1xuICBjb25zdCBzd2lwZXIgPSB0aGlzO1xuICBjb25zdCB7XG4gICAgcGFyYW1zXG4gIH0gPSBzd2lwZXI7XG4gIHN3aXBlci5vblRvdWNoU3RhcnQgPSBvblRvdWNoU3RhcnQuYmluZChzd2lwZXIpO1xuICBzd2lwZXIub25Ub3VjaE1vdmUgPSBvblRvdWNoTW92ZS5iaW5kKHN3aXBlcik7XG4gIHN3aXBlci5vblRvdWNoRW5kID0gb25Ub3VjaEVuZC5iaW5kKHN3aXBlcik7XG4gIHN3aXBlci5vbkRvY3VtZW50VG91Y2hTdGFydCA9IG9uRG9jdW1lbnRUb3VjaFN0YXJ0LmJpbmQoc3dpcGVyKTtcbiAgaWYgKHBhcmFtcy5jc3NNb2RlKSB7XG4gICAgc3dpcGVyLm9uU2Nyb2xsID0gb25TY3JvbGwuYmluZChzd2lwZXIpO1xuICB9XG4gI
5196HN3aXBlci5vbkNsaWNrID0gb25DbGljay5iaW5kKHN3aXBlcik7XG4gIHN3aXBlci5vbkxvYWQgPSBvbkxvYWQuYmluZChzd2lwZXIpO1xuICBldmVudHMoc3dpcGVyLCAnb24nKTtcbn1cbmZ1bmN0aW9uIGRldGFjaEV2ZW50cygpIHtcbiAgY29uc3Qgc3dpcGVyID0gdGhpcztcbiAgZXZlbnRzKHN3aXBlciwgJ29mZicpO1xufVxudmFyIGV2ZW50cyQxID0ge1xuICBhdHRhY2hFdmVudHMsXG4gIGRldGFjaEV2ZW50c1xufTtcblxuY29uc3QgaXNHcmlkRW5hYmxlZCA9IChzd2lwZXIsIHBhcmFtcykgPT4ge1xuICByZXR1cm4gc3dpcGVyLmdyaWQgJiYgcGFyYW1zLmdyaWQgJiYgcGFyYW1zLmdyaWQucm93cyA+IDE7XG59O1xuZnVuY3Rpb24gc2V0QnJlYWtwb2ludCgpIHtcbiAgY29uc3Qgc3dpcGVyID0gdGhpcztcbiAgY29uc3Qge1xuICAgIHJlYWxJbmRleCxcbiAgICBpbml0aWFsaXplZCxcbiAgICBwYXJhbXMsXG4gICAgZWxcbiAgfSA9IHN3aXBlcjtcbiAgY29uc3QgYnJlYWtwb2ludHMgPSBwYXJhbXMuYnJlYWtwb2ludHM7XG4gIGlmICghYnJlYWtwb2ludHMgfHwgYnJlYWtwb2ludHMgJiYgT2JqZWN0LmtleXMoYnJlYWtwb2ludHMpLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuXG4gIC8vIEdldCBicmVha3BvaW50IGZvciB3aW5kb3cgd2lkdGggYW5kIHVwZGF0ZSBwYXJhbWV0ZXJzXG4gIGNvbnN0IGJyZWFrcG9pbnQgPSBzd2lwZXIuZ2V0QnJlYWtwb2ludChicmVha3BvaW50cywgc3dpcGVyLnBhcmFtcy5icmVha3BvaW50c0Jhc2UsIHN3aXBlci5lbCk7XG4gIGlmICghYnJlYWtwb2ludCB8fCBzd2lwZXIuY3VycmVudEJyZWFrcG9pbnQgPT09IGJyZWFrcG9pbnQpIHJldHVybjtcbiAgY29uc3QgYnJlYWtwb2ludE9ubHlQYXJhbXMgPSBicmVha3BvaW50IGluIGJyZWFrcG9pbnRzID8gYnJlYWtwb2ludHNbYnJlYWtwb2ludF0gOiB1bmRlZmluZWQ7XG4gIGNvbnN0IGJyZWFrcG9pbnRQYXJhbXMgPSBicmVha3BvaW50T25seVBhcmFtcyB8fCBzd2lwZXIub3JpZ2luYWxQYXJhbXM7XG4gIGNvbnN0IHdhc011bHRpUm93ID0gaXNHcmlkRW5hYmxlZChzd2lwZXIsIHBhcmFtcyk7XG4gIGNvbnN0IGlzTXVsdGlSb3cgPSBpc0dyaWRFbmFibGVkKHN3aXBlciwgYnJlYWtwb2ludFBhcmFtcyk7XG4gIGNvbnN0IHdhc0dyYWJDdXJzb3IgPSBzd2lwZXIucGFyYW1zLmdyYWJDdXJzb3I7XG4gIGNvbnN0IGlzR3JhYkN1cnNvciA9IGJyZWFrcG9pbnRQYXJhbXMuZ3JhYkN1cnNvcjtcbiAgY29uc3Qgd2FzRW5hYmxlZCA9IHBhcmFtcy5lbmFibGVkO1xuICBpZiAod2FzTXVsdGlSb3cgJiYgIWlzTXVsdGlSb3cpIHtcbiAgICBlbC5jbGFzc0xpc3QucmVtb3ZlKGAke3BhcmFtcy5jb250YWluZXJNb2RpZmllckNsYXNzfWdyaWRgLCBgJHtwYXJhbXMuY29udGFpbmVyTW9kaWZpZXJDbGFzc31ncmlkLWNvbHVtbmApO1xuICAgIHN3aXBlci5lbWl0Q29udGFpbmVyQ2xhc3NlcygpO1xuICB9IGVsc2UgaWYgKCF3YXNNdWx0aVJvdyAmJiBpc011bHRpUm93KSB7XG4gICAgZWwuY2xhc3NMaXN0LmFkZChgJHtwYXJhbXMuY29udGFpbmVyTW9kaWZpZXJDbGFzc31ncmlkYCk7XG4gICAgaWYgKGJyZWFrcG9pbnRQYXJhbXMuZ3JpZC5maWxsICYmIGJyZWFrcG9pbnRQYXJhbXMuZ3JpZC5maWxsID09PSAnY29sdW1uJyB8fCAhYnJlYWtwb2ludFBhcmFtcy5ncmlkLmZpbGwgJiYgcGFyYW1zLmdyaWQuZmlsbCA9PT0gJ2NvbHVtbicpIHtcbiAgICAgIGVsLmNsYXNzTGlzdC5hZGQoYCR7cGFyYW1zLmNvbnRhaW5lck1vZGlmaWVyQ2xhc3N9Z3JpZC1jb2x1bW5gKTtcbiAgICB9XG4gICAgc3dpcGVyLmVtaXRDb250YWluZXJDbGFzc2VzKCk7XG4gIH1cbiAgaWYgKHdhc0dyYWJDdXJzb3IgJiYgIWlzR3JhYkN1cnNvcikge1xuICAgIHN3aXBlci51bnNldEdyYWJDdXJzb3IoKTtcbiAgfSBlbHNlIGlmICghd2FzR3JhYkN1cnNvciAmJiBpc0dyYWJDdXJzb3IpIHtcbiAgICBzd2lwZXIuc2V0R3JhYkN1cnNvcigpO1xuICB9XG5cbiAgLy8gVG9nZ2xlIG5hdmlnYXRpb24sIHBhZ2luYXRpb24sIHNjcm9sbGJhclxuICBbJ25hdmlnYXRpb24nLCAncGFnaW5hdGlvbicsICdzY3JvbGxiYXInXS5mb3JFYWNoKHByb3AgPT4ge1xuICAgIGlmICh0eXBlb2YgYnJlYWtwb2ludFBhcmFtc1twcm9wXSA9PT0gJ3VuZGVmaW5lZCcpIHJldHVybjtcbiAgICBjb25zdCB3YXNNb2R1bGVFbmFibGVkID0gcGFyYW1zW3Byb3BdICYmIHBhcmFtc1twcm9wXS5lbmFibGVkO1xuICAgIGNvbnN0IGlzTW9kdWxlRW5hYmxlZCA9IGJyZWFrcG9pbnRQYXJhbXNbcHJvcF0gJiYgYnJlYWtwb2ludFBhcmFtc1twcm9wXS5lbmFibGVkO1xuICAgIGlmICh3YXNNb2R1bGVFbmFibGVkICYmICFpc01vZHVsZUVuYWJsZWQpIHtcbiAgICAgIHN3aXBlcltwcm9wXS5kaXNhYmxlKCk7XG4gICAgfVxuICAgIGlmICghd2FzTW9kdWxlRW5hYmxlZCAmJiBpc01vZHVsZUVuYWJsZWQpIHtcbiAgICAgIHN3aXBlcltwcm9wXS5lbmFibGUoKTtcbiAgICB9XG4gIH0pO1xuICBjb25zdCBkaXJlY3Rpb25DaGFuZ2VkID0gYnJlYWtwb2ludFBhcmFtcy5kaXJlY3Rpb24gJiYgYnJlYWtwb2ludFBhcmFtcy5kaXJlY3Rpb24gIT09IHBhcmFtcy5kaXJlY3Rpb247XG4gIGNvbnN0IG5lZWRzUmVMb29wID0gcGFyYW1zLmxvb3AgJiYgKGJyZWFrcG9pbnRQYXJhbXMuc2xpZGVzUGVyVmlldyAhPT0gcGFyYW1zLnNsaWRlc1BlclZpZXcgfHwgZGlyZWN0aW9uQ2hhbmdlZCk7XG4gIGNvbnN0IHdhc0xvb3AgPSBwYXJhbXMubG9vcDtcbiAgaWYgKGRpcmVjdGlvbkNoYW5nZWQgJiYgaW5pdGlhbGl6ZWQpIHtcbiAgICBzd2lwZXIuY2hhbmdlRGlyZWN0aW9uKCk7XG4gIH1cbiAgZXh0ZW5kKHN3aXBlci5wYXJhbXMsIGJyZWFrcG9pbnRQYXJhbXMpO1xuICBjb25zdCBpc0VuYWJsZWQgPSBzd2lwZXIucGFyYW1zLmVuYWJsZWQ7XG4gIGNvbnN0IGhhc0xvb3AgPSBzd2lwZXIucGFyYW1zLmxvb3A7XG4gIE9iamVjdC5hc3NpZ24oc3dpcGVyLCB7XG4gICAgYWxsb3dUb3VjaE1vdmU6IHN3aXBlci5wYXJhbXMuYWxsb3dUb3VjaE1vdmUsXG4gICAgYWxsb3dTbGlkZU5leHQ6IHN3aXBlci5wYXJhbXMuYWxsb3dTbGlkZU5leHQsXG4gICAgYWxsb3dTbGlkZVByZXY6IHN3aXBlci5wYXJhbXMuYWxsb3dTbGlkZVByZXZcbiAgfSk7XG4gIGlmICh3YXNFbmFibGVkICYmICFpc0VuYWJsZWQpIHtcbiAgICBzd2lwZXIuZGlzYWJsZSgpO1xuICB9IGVsc2UgaWYgKCF3YXNFbmFibGVkICYmIGlzRW5hYmxlZCkge1xuICAgIHN3aXBlci5lbmFibGUoKTtcbiAgfVxuICBzd2lwZXIuY3VycmVudEJyZWFrcG9pbnQgPSBicmVha3BvaW50O1xuICBzd2lwZXIuZW1pdCgnX2JlZm9yZUJyZWFrcG9pbnQnLCBicmVha3BvaW50UGFyYW1zKTtcbiAgaWYgKGluaXRpYWxpemVkKSB7XG4gICAgaWYgKG5lZWRzUmVMb29wKSB7XG4gICAgICBzd2lwZXIubG9vcERlc3Ryb3koKTtcbiAgICAgIHN3aXBlci5sb29wQ3JlYXRlKHJlYWxJbmRleCk7XG4gICAgICBzd2lwZXIudXBkYXRlU2xpZGVzKCk7XG4gICAgfSBlbHNlIGlmICghd2FzTG9vcCAmJiBoYXNMb29wKSB7XG4gICAgICBzd2lwZXIubG9vcENyZWF0ZShyZWFsSW5kZXgpO1xuICAgICAgc3dpcGVyLnVwZGF0ZVNsaWRlcygpO1xuICAgIH0gZWxzZSBpZiAod2FzTG9vcCAmJiAhaGFzTG9vcCkge1xuICAgICAgc3dpcGVyLmxvb3BEZXN0cm95KCk7XG4gICAgfVxuICB9XG4gI
5196HN3aXBlci5lbWl0KCdicmVha3BvaW50JywgYnJlYWtwb2ludFBhcmFtcyk7XG59XG5cbmZ1bmN0aW9uIGdldEJyZWFrcG9pbnQoYnJlYWtwb2ludHMsIGJhc2UsIGNvbnRhaW5lckVsKSB7XG4gIGlmIChiYXNlID09PSB2b2lkIDApIHtcbiAgICBiYXNlID0gJ3dpbmRvdyc7XG4gIH1cbiAgaWYgKCFicmVha3BvaW50cyB8fCBiYXNlID09PSAnY29udGFpbmVyJyAmJiAhY29udGFpbmVyRWwpIHJldHVybiB1bmRlZmluZWQ7XG4gIGxldCBicmVha3BvaW50ID0gZmFsc2U7XG4gIGNvbnN0IHdpbmRvdyA9IGdldFdpbmRvdygpO1xuICBjb25zdCBjdXJyZW50SGVpZ2h0ID0gYmFzZSA9PT0gJ3dpbmRvdycgPyB3aW5kb3cuaW5uZXJIZWlnaHQgOiBjb250YWluZXJFbC5jbGllbnRIZWlnaHQ7XG4gIGNvbnN0IHBvaW50cyA9IE9iamVjdC5rZXlzKGJyZWFrcG9pbnRzKS5tYXAocG9pbnQgPT4ge1xuICAgIGlmICh0eXBlb2YgcG9pbnQgPT09ICdzdHJpbmcnICYmIHBvaW50LmluZGV4T2YoJ0AnKSA9PT0gMCkge1xuICAgICAgY29uc3QgbWluUmF0aW8gPSBwYXJzZUZsb2F0KHBvaW50LnN1YnN0cigxKSk7XG4gICAgICBjb25zdCB2YWx1ZSA9IGN1cnJlbnRIZWlnaHQgKiBtaW5SYXRpbztcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHZhbHVlLFxuICAgICAgICBwb2ludFxuICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIHZhbHVlOiBwb2ludCxcbiAgICAgIHBvaW50XG4gICAgfTtcbiAgfSk7XG4gIHBvaW50cy5zb3J0KChhLCBiKSA9PiBwYXJzZUludChhLnZhbHVlLCAxMCkgLSBwYXJzZUludChiLnZhbHVlLCAxMCkpO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHBvaW50cy5sZW5ndGg7IGkgKz0gMSkge1xuICAgIGNvbnN0IHtcbiAgICAgIHBvaW50LFxuICAgICAgdmFsdWVcbiAgICB9ID0gcG9pbnRzW2ldO1xuICAgIGlmIChiYXNlID09PSAnd2luZG93Jykge1xuICAgICAgaWYgKHdpbmRvdy5tYXRjaE1lZGlhKGAobWluLXdpZHRoOiAke3ZhbHVlfXB4KWApLm1hdGNoZXMpIHtcbiAgICAgICAgYnJlYWtwb2ludCA9IHBvaW50O1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodmFsdWUgPD0gY29udGFpbmVyRWwuY2xpZW50V2lkdGgpIHtcbiAgICAgIGJyZWFrcG9pbnQgPSBwb2ludDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGJyZWFrcG9pbnQgfHwgJ21heCc7XG59XG5cbnZhciBicmVha3BvaW50cyA9IHtcbiAgc2V0QnJlYWtwb2ludCxcbiAgZ2V0QnJlYWtwb2ludFxufTtcblxuZnVuY3Rpb24gcHJlcGFyZUNsYXNzZXMoZW50cmllcywgcHJlZml4KSB7XG4gIGNvbnN0IHJlc3VsdENsYXNzZXMgPSBbXTtcbiAgZW50cmllcy5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgIGlmICh0eXBlb2YgaXRlbSA9PT0gJ29iamVjdCcpIHtcbiAgICAgIE9iamVjdC5rZXlzKGl0ZW0pLmZvckVhY2goY2xhc3NOYW1lcyA9PiB7XG4gICAgICAgIGlmIChpdGVtW2NsYXNzTmFtZXNdKSB7XG4gICAgICAgICAgcmVzdWx0Q2xhc3Nlcy5wdXNoKHByZWZpeCArIGNsYXNzTmFtZXMpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBpdGVtID09PSAnc3RyaW5nJykge1xuICAgICAgcmVzdWx0Q2xhc3Nlcy5wdXNoKHByZWZpeCArIGl0ZW0pO1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiByZXN1bHRDbGFzc2VzO1xufVxuZnVuY3Rpb24gYWRkQ2xhc3NlcygpIHtcbiAgY29uc3Qgc3dpcGVyID0gdGhpcztcbiAgY29uc3Qge1xuICAgIGNsYXNzTmFtZXMsXG4gICAgcGFyYW1zLFxuICAgIHJ0bCxcbiAgICBlbCxcbiAgICBkZXZpY2VcbiAgfSA9IHN3aXBlcjtcbiAgLy8gcHJldHRpZXItaWdub3JlXG4gIGNvbnN0IHN1ZmZpeGVzID0gcHJlcGFyZUNsYXNzZXMoWydpbml0aWFsaXplZCcsIHBhcmFtcy5kaXJlY3Rpb24sIHtcbiAgICAnZnJlZS1tb2RlJzogc3dpcGVyLnBhcmFtcy5mcmVlTW9kZSAmJiBwYXJhbXMuZnJlZU1vZGUuZW5hYmxlZFxuICB9LCB7XG4gICAgJ2F1dG9oZWlnaHQnOiBwYXJhbXMuYXV0b0hlaWdodFxuICB9LCB7XG4gICAgJ3J0bCc6IHJ0bFxuICB9LCB7XG4gICAgJ2dyaWQnOiBwYXJhbXMuZ3JpZCAmJiBwYXJhbXMuZ3JpZC5yb3dzID4gMVxuICB9LCB7XG4gICAgJ2dyaWQtY29sdW1uJzogcGFyYW1zLmdyaWQgJiYgcGFyYW1zLmdyaWQucm93cyA+IDEgJiYgcGFyYW1zLmdyaWQuZmlsbCA9PT0gJ2NvbHVtbidcbiAgfSwge1xuICAgICdhbmRyb2lkJzogZGV2aWNlLmFuZHJvaWRcbiAgfSwge1xuICAgICdpb3MnOiBkZXZpY2UuaW9zXG4gIH0sIHtcbiAgICAnY3NzLW1vZGUnOiBwYXJhbXMuY3NzTW9kZVxuICB9LCB7XG4gICAgJ2NlbnRlcmVkJzogcGFyYW1zLmNzc01vZGUgJiYgcGFyYW1zLmNlbnRlcmVkU2xpZGVzXG4gIH0sIHtcbiAgICAnd2F0Y2gtcHJvZ3Jlc3MnOiBwYXJhbXMud2F0Y2hTbGlkZXNQcm9ncmVzc1xuICB9XSwgcGFyYW1zLmNvbnRhaW5lck1vZGlmaWVyQ2xhc3MpO1xuICBjbGFzc05hbWVzLnB1c2goLi4uc3VmZml4ZXMpO1xuICBlbC5jbGFzc0xpc3QuYWRkKC4uLmNsYXNzTmFtZXMpO1xuICBzd2lwZXIuZW1pdENvbnRhaW5lckNsYXNzZXMoKTtcbn1cblxuZnVuY3Rpb24gcmVtb3ZlQ2xhc3NlcygpIHtcbiAgY29uc3Qgc3dpcGVyID0gdGhpcztcbiAgY29uc3Qge1xuICAgIGVsLFxuICAgIGNsYXNzTmFtZXNcbiAgfSA9IHN3aXBlcjtcbiAgZWwuY2xhc3NMaXN0LnJlbW92ZSguLi5jbGFzc05hbWVzKTtcbiAgc3dpcGVyLmVtaXRDb250YWluZXJDbGFzc2VzKCk7XG59XG5cbnZhciBjbGFzc2VzID0ge1xuICBhZGRDbGFzc2VzLFxuICByZW1vdmVDbGFzc2VzXG59O1xuXG5mdW5jdGlvbiBjaGVja092ZXJmbG93KCkge1xuICBjb25zdCBzd2lwZXIgPSB0aGlzO1xuICBjb25zdCB7XG4gICAgaXNMb2NrZWQ6IHdhc0xvY2tlZCxcbiAgICBwYXJhbXNcbiAgfSA9IHN3aXBlcjtcbiAgY29uc3Qge1xuICAgIHNsaWRlc09mZnNldEJlZm9yZVxuICB9ID0gcGFyYW1zO1xuICBpZiAoc2xpZGVzT2Zmc2V0QmVmb3JlKSB7XG4gICAgY29uc3QgbGFzdFNsaWRlSW5kZXggPSBzd2lwZXIuc2xpZGVzLmxlbmd0aCAtIDE7XG4gICAgY29uc3QgbGFzdFNsaWRlUmlnaHRFZGdlID0gc3dpcGVyLnNsaWRlc0dyaWRbbGFzdFNsaWRlSW5kZXhdICsgc3dpcGVyLnNsaWRlc1NpemVzR3JpZFtsYXN0U2xpZGVJbmRleF0gKyBzbGlkZXNPZmZzZXRCZWZvcmUgKiAyO1xuICAgIHN3aXBlci5pc0xvY2tlZCA9IHN3aXBlci5zaXplID4gbGFzdFNsaWRlUmlnaHRFZGdlO1xuICB9IGVsc2Uge1xuICAgIHN3aXBlci5pc0xvY2tlZCA9IHN3aXBlci5zbmFwR3JpZC5sZW5ndGggPT09IDE7XG4gIH1cbiAgaWYgKHBhcmFtcy5hbGxvd1NsaWRlTmV4dCA9PT0gdHJ1ZSkge1xuICAgIHN3aXBlci5hbGxvd1NsaWRlTmV4dCA9ICFzd2lwZXIuaXNMb2NrZWQ7XG4gIH1cbiAgaWYgKHBhcmFtcy5hbGxvd1NsaWRlUHJldiA9PT0gdHJ1ZSkge1xuICAgIHN3aXBlci5hbGxvd1NsaWRlUHJldiA9ICFzd2lwZXIuaXNMb2NrZWQ7XG4gIH1cbiAgaWYgKHdhc0xvY2tlZCAmJiB3YXNMb2NrZWQgIT09I
5196HN3aXBlci5pc0xvY2tlZCkge1xuICAgIHN3aXBlci5pc0VuZCA9IGZhbHNlO1xuICB9XG4gIGlmICh3YXNMb2NrZWQgIT09IHN3aXBlci5pc0xvY2tlZCkge1xuICAgIHN3aXBlci5lbWl0KHN3aXBlci5pc0xvY2tlZCA/ICdsb2NrJyA6ICd1bmxvY2snKTtcbiAgfVxufVxudmFyIGNoZWNrT3ZlcmZsb3ckMSA9IHtcbiAgY2hlY2tPdmVyZmxvd1xufTtcblxudmFyIGRlZmF1bHRzID0ge1xuICBpbml0OiB0cnVlLFxuICBkaXJlY3Rpb246ICdob3Jpem9udGFsJyxcbiAgb25lV2F5TW92ZW1lbnQ6IGZhbHNlLFxuICBzd2lwZXJFbGVtZW50Tm9kZU5hbWU6ICdTV0lQRVItQ09OVEFJTkVSJyxcbiAgdG91Y2hFdmVudHNUYXJnZXQ6ICd3cmFwcGVyJyxcbiAgaW5pdGlhbFNsaWRlOiAwLFxuICBzcGVlZDogMzAwLFxuICBjc3NNb2RlOiBmYWxzZSxcbiAgdXBkYXRlT25XaW5kb3dSZXNpemU6IHRydWUsXG4gIHJlc2l6ZU9ic2VydmVyOiB0cnVlLFxuICBuZXN0ZWQ6IGZhbHNlLFxuICBjcmVhdGVFbGVtZW50czogZmFsc2UsXG4gIGV2ZW50c1ByZWZpeDogJ3N3aXBlcicsXG4gIGVuYWJsZWQ6IHRydWUsXG4gIGZvY3VzYWJsZUVsZW1lbnRzOiAnaW5wdXQsIHNlbGVjdCwgb3B0aW9uLCB0ZXh0YXJlYSwgYnV0dG9uLCB2aWRlbywgbGFiZWwnLFxuICAvLyBPdmVycmlkZXNcbiAgd2lkdGg6IG51bGwsXG4gIGhlaWdodDogbnVsbCxcbiAgLy9cbiAgcHJldmVudEludGVyYWN0aW9uT25UcmFuc2l0aW9uOiBmYWxzZSxcbiAgLy8gc3NyXG4gIHVzZXJBZ2VudDogbnVsbCxcbiAgdXJsOiBudWxsLFxuICAvLyBUbyBzdXBwb3J0IGlPUydzIHN3aXBlLXRvLWdvLWJhY2sgZ2VzdHVyZSAod2hlbiBiZWluZyB1c2VkIGluLWFwcCkuXG4gIGVkZ2VTd2lwZURldGVjdGlvbjogZmFsc2UsXG4gIGVkZ2VTd2lwZVRocmVzaG9sZDogMjAsXG4gIC8vIEF1dG9oZWlnaHRcbiAgYXV0b0hlaWdodDogZmFsc2UsXG4gIC8vIFNldCB3cmFwcGVyIHdpZHRoXG4gIHNldFdyYXBwZXJTaXplOiBmYWxzZSxcbiAgLy8gVmlydHVhbCBUcmFuc2xhdGVcbiAgdmlydHVhbFRyYW5zbGF0ZTogZmFsc2UsXG4gIC8vIEVmZmVjdHNcbiAgZWZmZWN0OiAnc2xpZGUnLFxuICAvLyAnc2xpZGUnIG9yICdmYWRlJyBvciAnY3ViZScgb3IgJ2NvdmVyZmxvdycgb3IgJ2ZsaXAnXG5cbiAgLy8gQnJlYWtwb2ludHNcbiAgYnJlYWtwb2ludHM6IHVuZGVmaW5lZCxcbiAgYnJlYWtwb2ludHNCYXNlOiAnd2luZG93JyxcbiAgLy8gU2xpZGVzIGdyaWRcbiAgc3BhY2VCZXR3ZWVuOiAwLFxuICBzbGlkZXNQZXJWaWV3OiAxLFxuICBzbGlkZXNQZXJHcm91cDogMSxcbiAgc2xpZGVzUGVyR3JvdXBTa2lwOiAwLFxuICBzbGlkZXNQZXJHcm91cEF1dG86IGZhbHNlLFxuICBjZW50ZXJlZFNsaWRlczogZmFsc2UsXG4gIGNlbnRlcmVkU2xpZGVzQm91bmRzOiBmYWxzZSxcbiAgc2xpZGVzT2Zmc2V0QmVmb3JlOiAwLFxuICAvLyBpbiBweFxuICBzbGlkZXNPZmZzZXRBZnRlcjogMCxcbiAgLy8gaW4gcHhcbiAgbm9ybWFsaXplU2xpZGVJbmRleDogdHJ1ZSxcbiAgY2VudGVySW5zdWZmaWNpZW50U2xpZGVzOiBmYWxzZSxcbiAgLy8gRGlzYWJsZSBzd2lwZXIgYW5kIGhpZGUgbmF2aWdhdGlvbiB3aGVuIGNvbnRhaW5lciBub3Qgb3ZlcmZsb3dcbiAgd2F0Y2hPdmVyZmxvdzogdHJ1ZSxcbiAgLy8gUm91bmQgbGVuZ3RoXG4gIHJvdW5kTGVuZ3RoczogZmFsc2UsXG4gIC8vIFRvdWNoZXNcbiAgdG91Y2hSYXRpbzogMSxcbiAgdG91Y2hBbmdsZTogNDUsXG4gIHNpbXVsYXRlVG91Y2g6IHRydWUsXG4gIHNob3J0U3dpcGVzOiB0cnVlLFxuICBsb25nU3dpcGVzOiB0cnVlLFxuICBsb25nU3dpcGVzUmF0aW86IDAuNSxcbiAgbG9uZ1N3aXBlc01zOiAzMDAsXG4gIGZvbGxvd0ZpbmdlcjogdHJ1ZSxcbiAgYWxsb3dUb3VjaE1vdmU6IHRydWUsXG4gIHRocmVzaG9sZDogNSxcbiAgdG91Y2hNb3ZlU3RvcFByb3BhZ2F0aW9uOiBmYWxzZSxcbiAgdG91Y2hTdGFydFByZXZlbnREZWZhdWx0OiB0cnVlLFxuICB0b3VjaFN0YXJ0Rm9yY2VQcmV2ZW50RGVmYXVsdDogZmFsc2UsXG4gIHRvdWNoUmVsZWFzZU9uRWRnZXM6IGZhbHNlLFxuICAvLyBVbmlxdWUgTmF2aWdhdGlvbiBFbGVtZW50c1xuICB1bmlxdWVOYXZFbGVtZW50czogdHJ1ZSxcbiAgLy8gUmVzaXN0YW5jZVxuICByZXNpc3RhbmNlOiB0cnVlLFxuICByZXNpc3RhbmNlUmF0aW86IDAuODUsXG4gIC8vIFByb2dyZXNzXG4gIHdhdGNoU2xpZGVzUHJvZ3Jlc3M6IGZhbHNlLFxuICAvLyBDdXJzb3JcbiAgZ3JhYkN1cnNvcjogZmFsc2UsXG4gIC8vIENsaWNrc1xuICBwcmV2ZW50Q2xpY2tzOiB0cnVlLFxuICBwcmV2ZW50Q2xpY2tzUHJvcGFnYXRpb246IHRydWUsXG4gIHNsaWRlVG9DbGlja2VkU2xpZGU6IGZhbHNlLFxuICAvLyBsb29wXG4gIGxvb3A6IGZhbHNlLFxuICBsb29wQWRkQmxhbmtTbGlkZXM6IHRydWUsXG4gIGxvb3BBZGRpdGlvbmFsU2xpZGVzOiAwLFxuICBsb29wUHJldmVudHNTbGlkaW5nOiB0cnVlLFxuICAvLyByZXdpbmRcbiAgcmV3aW5kOiBmYWxzZSxcbiAgLy8gU3dpcGluZy9ubyBzd2lwaW5nXG4gIGFsbG93U2xpZGVQcmV2OiB0cnVlLFxuICBhbGxvd1NsaWRlTmV4dDogdHJ1ZSxcbiAgc3dpcGVIYW5kbGVyOiBudWxsLFxuICAvLyAnLnN3aXBlLWhhbmRsZXInLFxuICBub1N3aXBpbmc6IHRydWUsXG4gIG5vU3dpcGluZ0NsYXNzOiAnc3dpcGVyLW5vLXN3aXBpbmcnLFxuICBub1N3aXBpbmdTZWxlY3RvcjogbnVsbCxcbiAgLy8gUGFzc2l2ZSBMaXN0ZW5lcnNcbiAgcGFzc2l2ZUxpc3RlbmVyczogdHJ1ZSxcbiAgbWF4QmFja2ZhY2VIaWRkZW5TbGlkZXM6IDEwLFxuICAvLyBOU1xuICBjb250YWluZXJNb2RpZmllckNsYXNzOiAnc3dpcGVyLScsXG4gIC8vIE5FV1xuICBzbGlkZUNsYXNzOiAnc3dpcGVyLXNsaWRlJyxcbiAgc2xpZGVCbGFua0NsYXNzOiAnc3dpcGVyLXNsaWRlLWJsYW5rJyxcbiAgc2xpZGVBY3RpdmVDbGFzczogJ3N3aXBlci1zbGlkZS1hY3RpdmUnLFxuICBzbGlkZVZpc2libGVDbGFzczogJ3N3aXBlci1zbGlkZS12aXNpYmxlJyxcbiAgc2xpZGVGdWxseVZpc2libGVDbGFzczogJ3N3aXBlci1zbGlkZS1mdWxseS12aXNpYmxlJyxcbiAgc2xpZGVOZXh0Q2xhc3M6ICdzd2lwZXItc2xpZGUtbmV4dCcsXG4gIHNsaWRlUHJldkNsYXNzOiAnc3dpcGVyLXNsaWRlLXByZXYnLFxuICB3cmFwcGVyQ2xhc3M6ICdzd2lwZXItd3JhcHBlcicsXG4gIGxhenlQcmVsb2FkZXJDbGFzczogJ3N3aXBlci1sYXp5LXByZWxvYWRlcicsXG4gIGxhenlQcmVsb2FkUHJldk5leHQ6IDAsXG4gIC8vIENhbGxiYWNrc1xuICBydW5DYWxsYmFja3NPbkluaXQ6IHRydWUsXG4gIC8vIEludGVybmFsc1xuICBfZW1pdENsYXNzZXM6IGZhbHNlXG59O1xuXG5mdW5jdGlvbiBtb2R1bGVFeHRlbmRQYXJhbXMocGFyYW1zLCBhbGxNb2R1bGVzUGFyYW1zKSB7XG4gIHJldHVybi
5196BmdW5jdGlvbiBleHRlbmRQYXJhbXMob2JqKSB7XG4gICAgaWYgKG9iaiA9PT0gdm9pZCAwKSB7XG4gICAgICBvYmogPSB7fTtcbiAgICB9XG4gICAgY29uc3QgbW9kdWxlUGFyYW1OYW1lID0gT2JqZWN0LmtleXMob2JqKVswXTtcbiAgICBjb25zdCBtb2R1bGVQYXJhbXMgPSBvYmpbbW9kdWxlUGFyYW1OYW1lXTtcbiAgICBpZiAodHlwZW9mIG1vZHVsZVBhcmFtcyAhPT0gJ29iamVjdCcgfHwgbW9kdWxlUGFyYW1zID09PSBudWxsKSB7XG4gICAgICBleHRlbmQoYWxsTW9kdWxlc1BhcmFtcywgb2JqKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHBhcmFtc1ttb2R1bGVQYXJhbU5hbWVdID09PSB0cnVlKSB7XG4gICAgICBwYXJhbXNbbW9kdWxlUGFyYW1OYW1lXSA9IHtcbiAgICAgICAgZW5hYmxlZDogdHJ1ZVxuICAgICAgfTtcbiAgICB9XG4gICAgaWYgKG1vZHVsZVBhcmFtTmFtZSA9PT0gJ25hdmlnYXRpb24nICYmIHBhcmFtc1ttb2R1bGVQYXJhbU5hbWVdICYmIHBhcmFtc1ttb2R1bGVQYXJhbU5hbWVdLmVuYWJsZWQgJiYgIXBhcmFtc1ttb2R1bGVQYXJhbU5hbWVdLnByZXZFbCAmJiAhcGFyYW1zW21vZHVsZVBhcmFtTmFtZV0ubmV4dEVsKSB7XG4gICAgICBwYXJhbXNbbW9kdWxlUGFyYW1OYW1lXS5hdXRvID0gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKFsncGFnaW5hdGlvbicsICdzY3JvbGxiYXInXS5pbmRleE9mKG1vZHVsZVBhcmFtTmFtZSkgPj0gMCAmJiBwYXJhbXNbbW9kdWxlUGFyYW1OYW1lXSAmJiBwYXJhbXNbbW9kdWxlUGFyYW1OYW1lXS5lbmFibGVkICYmICFwYXJhbXNbbW9kdWxlUGFyYW1OYW1lXS5lbCkge1xuICAgICAgcGFyYW1zW21vZHVsZVBhcmFtTmFtZV0uYXV0byA9IHRydWU7XG4gICAgfVxuICAgIGlmICghKG1vZHVsZVBhcmFtTmFtZSBpbiBwYXJhbXMgJiYgJ2VuYWJsZWQnIGluIG1vZHVsZVBhcmFtcykpIHtcbiAgICAgIGV4dGVuZChhbGxNb2R1bGVzUGFyYW1zLCBvYmopO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIHBhcmFtc1ttb2R1bGVQYXJhbU5hbWVdID09PSAnb2JqZWN0JyAmJiAhKCdlbmFibGVkJyBpbiBwYXJhbXNbbW9kdWxlUGFyYW1OYW1lXSkpIHtcbiAgICAgIHBhcmFtc1ttb2R1bGVQYXJhbU5hbWVdLmVuYWJsZWQgPSB0cnVlO1xuICAgIH1cbiAgICBpZiAoIXBhcmFtc1ttb2R1bGVQYXJhbU5hbWVdKSBwYXJhbXNbbW9kdWxlUGFyYW1OYW1lXSA9IHtcbiAgICAgIGVuYWJsZWQ6IGZhbHNlXG4gICAgfTtcbiAgICBleHRlbmQoYWxsTW9kdWxlc1BhcmFtcywgb2JqKTtcbiAgfTtcbn1cblxuLyogZXNsaW50IG5vLXBhcmFtLXJlYXNzaWduOiBcIm9mZlwiICovXG5jb25zdCBwcm90b3R5cGVzID0ge1xuICBldmVudHNFbWl0dGVyLFxuICB1cGRhdGUsXG4gIHRyYW5zbGF0ZSxcbiAgdHJhbnNpdGlvbixcbiAgc2xpZGUsXG4gIGxvb3AsXG4gIGdyYWJDdXJzb3IsXG4gIGV2ZW50czogZXZlbnRzJDEsXG4gIGJyZWFrcG9pbnRzLFxuICBjaGVja092ZXJmbG93OiBjaGVja092ZXJmbG93JDEsXG4gIGNsYXNzZXNcbn07XG5jb25zdCBleHRlbmRlZERlZmF1bHRzID0ge307XG5jbGFzcyBTd2lwZXIge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBsZXQgZWw7XG4gICAgbGV0IHBhcmFtcztcbiAgICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IG5ldyBBcnJheShfbGVuKSwgX2tleSA9IDA7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICAgIGFyZ3NbX2tleV0gPSBhcmd1bWVudHNbX2tleV07XG4gICAgfVxuICAgIGlmIChhcmdzLmxlbmd0aCA9PT0gMSAmJiBhcmdzWzBdLmNvbnN0cnVjdG9yICYmIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChhcmdzWzBdKS5zbGljZSg4LCAtMSkgPT09ICdPYmplY3QnKSB7XG4gICAgICBwYXJhbXMgPSBhcmdzWzBdO1xuICAgIH0gZWxzZSB7XG4gICAgICBbZWwsIHBhcmFtc10gPSBhcmdzO1xuICAgIH1cbiAgICBpZiAoIXBhcmFtcykgcGFyYW1zID0ge307XG4gICAgcGFyYW1zID0gZXh0ZW5kKHt9LCBwYXJhbXMpO1xuICAgIGlmIChlbCAmJiAhcGFyYW1zLmVsKSBwYXJhbXMuZWwgPSBlbDtcbiAgICBjb25zdCBkb2N1bWVudCA9IGdldERvY3VtZW50KCk7XG4gICAgaWYgKHBhcmFtcy5lbCAmJiB0eXBlb2YgcGFyYW1zLmVsID09PSAnc3RyaW5nJyAmJiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKHBhcmFtcy5lbCkubGVuZ3RoID4gMSkge1xuICAgICAgY29uc3Qgc3dpcGVycyA9IFtdO1xuICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChwYXJhbXMuZWwpLmZvckVhY2goY29udGFpbmVyRWwgPT4ge1xuICAgICAgICBjb25zdCBuZXdQYXJhbXMgPSBleHRlbmQoe30sIHBhcmFtcywge1xuICAgICAgICAgIGVsOiBjb250YWluZXJFbFxuICAgICAgICB9KTtcbiAgICAgICAgc3dpcGVycy5wdXNoKG5ldyBTd2lwZXIobmV3UGFyYW1zKSk7XG4gICAgICB9KTtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zdHJ1Y3Rvci1yZXR1cm5cbiAgICAgIHJldHVybiBzd2lwZXJzO1xuICAgIH1cblxuICAgIC8vIFN3aXBlciBJbnN0YW5jZVxuICAgIGNvbnN0IHN3aXBlciA9IHRoaXM7XG4gICAgc3dpcGVyLl9fc3dpcGVyX18gPSB0cnVlO1xuICAgIHN3aXBlci5zdXBwb3J0ID0gZ2V0U3VwcG9ydCgpO1xuICAgIHN3aXBlci5kZXZpY2UgPSBnZXREZXZpY2Uoe1xuICAgICAgdXNlckFnZW50OiBwYXJhbXMudXNlckFnZW50XG4gICAgfSk7XG4gICAgc3dpcGVyLmJyb3dzZXIgPSBnZXRCcm93c2VyKCk7XG4gICAgc3dpcGVyLmV2ZW50c0xpc3RlbmVycyA9IHt9O1xuICAgIHN3aXBlci5ldmVudHNBbnlMaXN0ZW5lcnMgPSBbXTtcbiAgICBzd2lwZXIubW9kdWxlcyA9IFsuLi5zd2lwZXIuX19tb2R1bGVzX19dO1xuICAgIGlmIChwYXJhbXMubW9kdWxlcyAmJiBBcnJheS5pc0FycmF5KHBhcmFtcy5tb2R1bGVzKSkge1xuICAgICAgc3dpcGVyLm1vZHVsZXMucHVzaCguLi5wYXJhbXMubW9kdWxlcyk7XG4gICAgfVxuICAgIGNvbnN0IGFsbE1vZHVsZXNQYXJhbXMgPSB7fTtcbiAgICBzd2lwZXIubW9kdWxlcy5mb3JFYWNoKG1vZCA9PiB7XG4gICAgICBtb2Qoe1xuICAgICAgICBwYXJhbXMsXG4gICAgICAgI
5196HN3aXBlcixcbiAgICAgICAgZXh0ZW5kUGFyYW1zOiBtb2R1bGVFeHRlbmRQYXJhbXMocGFyYW1zLCBhbGxNb2R1bGVzUGFyYW1zKSxcbiAgICAgICAgb246IHN3aXBlci5vbi5iaW5kKHN3aXBlciksXG4gICAgICAgIG9uY2U6IHN3aXBlci5vbmNlLmJpbmQoc3dpcGVyKSxcbiAgICAgICAgb2ZmOiBzd2lwZXIub2ZmLmJpbmQoc3dpcGVyKSxcbiAgICAgICAgZW1pdDogc3dpcGVyLmVtaXQuYmluZChzd2lwZXIpXG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIC8vIEV4dGVuZCBkZWZhdWx0cyB3aXRoIG1vZHVsZXMgcGFyYW1zXG4gICAgY29uc3Qgc3dpcGVyUGFyYW1zID0gZXh0ZW5kKHt9LCBkZWZhdWx0cywgYWxsTW9kdWxlc1BhcmFtcyk7XG5cbiAgICAvLyBFeHRlbmQgZGVmYXVsdHMgd2l0aCBwYXNzZWQgcGFyYW1zXG4gICAgc3dpcGVyLnBhcmFtcyA9IGV4dGVuZCh7fSwgc3dpcGVyUGFyYW1zLCBleHRlbmRlZERlZmF1bHRzLCBwYXJhbXMpO1xuICAgIHN3aXBlci5vcmlnaW5hbFBhcmFtcyA9IGV4dGVuZCh7fSwgc3dpcGVyLnBhcmFtcyk7XG4gICAgc3dpcGVyLnBhc3NlZFBhcmFtcyA9IGV4dGVuZCh7fSwgcGFyYW1zKTtcblxuICAgIC8vIGFkZCBldmVudCBsaXN0ZW5lcnNcbiAgICBpZiAoc3dpcGVyLnBhcmFtcyAmJiBzd2lwZXIucGFyYW1zLm9uKSB7XG4gICAgICBPYmplY3Qua2V5cyhzd2lwZXIucGFyYW1zLm9uKS5mb3JFYWNoKGV2ZW50TmFtZSA9PiB7XG4gICAgICAgIHN3aXBlci5vbihldmVudE5hbWUsIHN3aXBlci5wYXJhbXMub25bZXZlbnROYW1lXSk7XG4gICAgICB9KTtcbiAgICB9XG4gICAgaWYgKHN3aXBlci5wYXJhbXMgJiYgc3dpcGVyLnBhcmFtcy5vbkFueSkge1xuICAgICAgc3dpcGVyLm9uQW55KHN3aXBlci5wYXJhbXMub25BbnkpO1xuICAgIH1cblxuICAgIC8vIEV4dGVuZCBTd2lwZXJcbiAgICBPYmplY3QuYXNzaWduKHN3aXBlciwge1xuICAgICAgZW5hYmxlZDogc3dpcGVyLnBhcmFtcy5lbmFibGVkLFxuICAgICAgZWwsXG4gICAgICAvLyBDbGFzc2VzXG4gICAgICBjbGFzc05hbWVzOiBbXSxcbiAgICAgIC8vIFNsaWRlc1xuICAgICAgc2xpZGVzOiBbXSxcbiAgICAgIHNsaWRlc0dyaWQ6IFtdLFxuICAgICAgc25hcEdyaWQ6IFtdLFxuICAgICAgc2xpZGVzU2l6ZXNHcmlkOiBbXSxcbiAgICAgIC8vIGlzRGlyZWN0aW9uXG4gICAgICBpc0hvcml6b250YWwoKSB7XG4gICAgICAgIHJldHVybiBzd2lwZXIucGFyYW1zLmRpcmVjdGlvbiA9PT0gJ2hvcml6b250YWwnO1xuICAgICAgfSxcbiAgICAgIGlzVmVydGljYWwoKSB7XG4gICAgICAgIHJldHVybiBzd2lwZXIucGFyYW1zLmRpcmVjdGlvbiA9PT0gJ3ZlcnRpY2FsJztcbiAgICAgIH0sXG4gICAgICAvLyBJbmRleGVzXG4gICAgICBhY3RpdmVJbmRleDogMCxcbiAgICAgIHJlYWxJbmRleDogMCxcbiAgICAgIC8vXG4gICAgICBpc0JlZ2lubmluZzogdHJ1ZSxcbiAgICAgIGlzRW5kOiBmYWxzZSxcbiAgICAgIC8vIFByb3BzXG4gICAgICB0cmFuc2xhdGU6IDAsXG4gICAgICBwcmV2aW91c1RyYW5zbGF0ZTogMCxcbiAgICAgIHByb2dyZXNzOiAwLFxuICAgICAgdmVsb2NpdHk6IDAsXG4gICAgICBhbmltYXRpbmc6IGZhbHNlLFxuICAgICAgY3NzT3ZlcmZsb3dBZGp1c3RtZW50KCkge1xuICAgICAgICAvLyBSZXR1cm5zIDAgdW5sZXNzIGB0cmFuc2xhdGVgIGlzID4gMioqMjNcbiAgICAgICAgLy8gU2hvdWxkIGJlIHN1YnRyYWN0ZWQgZnJvbSBjc3MgdmFsdWVzIHRvIHByZXZlbnQgb3ZlcmZsb3dcbiAgICAgICAgcmV0dXJuIE1hdGgudHJ1bmModGhpcy50cmFuc2xhdGUgLyAyICoqIDIzKSAqIDIgKiogMjM7XG4gICAgICB9LFxuICAgICAgLy8gTG9ja3NcbiAgICAgIGFsbG93U2xpZGVOZXh0OiBzd2lwZXIucGFyYW1zLmFsbG93U2xpZGVOZXh0LFxuICAgICAgYWxsb3dTbGlkZVByZXY6IHN3aXBlci5wYXJhbXMuYWxsb3dTbGlkZVByZXYsXG4gICAgICAvLyBUb3VjaCBFdmVudHNcbiAgICAgIHRvdWNoRXZlbnRzRGF0YToge1xuICAgICAgICBpc1RvdWNoZWQ6IHVuZGVmaW5lZCxcbiAgICAgICAgaXNNb3ZlZDogdW5kZWZpbmVkLFxuICAgICAgICBhbGxvd1RvdWNoQ2FsbGJhY2tzOiB1bmRlZmluZWQsXG4gICAgICAgIHRvdWNoU3RhcnRUaW1lOiB1bmRlZmluZWQsXG4gICAgICAgIGlzU2Nyb2xsaW5nOiB1bmRlZmluZWQsXG4gICAgICAgIGN1cnJlbnRUcmFuc2xhdGU6IHVuZGVmaW5lZCxcbiAgICAgICAgc3RhcnRUcmFuc2xhdGU6IHVuZGVmaW5lZCxcbiAgICAgICAgYWxsb3dUaHJlc2hvbGRNb3ZlOiB1bmRlZmluZWQsXG4gICAgICAgIC8vIEZvcm0gZWxlbWVudHMgdG8gbWF0Y2hcbiAgICAgICAgZm9jdXNhYmxlRWxlbWVudHM6IHN3aXBlci5wYXJhbXMuZm9jdXNhYmxlRWxlbWVudHMsXG4gICAgICAgIC8vIExhc3QgY2xpY2sgdGltZVxuICAgICAgICBsYXN0Q2xpY2tUaW1lOiAwLFxuICAgICAgICBjbGlja1RpbWVvdXQ6IHVuZGVmaW5lZCxcbiAgICAgICAgLy8gVmVsb2NpdGllc1xuICAgICAgICB2ZWxvY2l0aWVzOiBbXSxcbiAgICAgICAgYWxsb3dNb21lbnR1bUJvdW5jZTogdW5kZWZpbmVkLFxuICAgICAgICBzdGFydE1vdmluZzogdW5kZWZpbmVkLFxuICAgICAgICBwb2ludGVySWQ6IG51bGwsXG4gICAgICAgIHRvdWNoSWQ6IG51bGxcbiAgICAgIH0sXG4gICAgICAvLyBDbGlja3NcbiAgICAgIGFsbG93Q2xpY2s6IHRydWUsXG4gICAgICAvLyBUb3VjaGVzXG4gICAgICBhbGxvd1RvdWNoTW92ZTogc3dpcGVyLnBhcmFtcy5hbGxvd1RvdWNoTW92ZSxcbiAgICAgIHRvdWNoZXM6IHtcbiAgICAgICAgc3RhcnRYOiAwLFxuICAgICAgICBzdGFydFk6IDAsXG4gICAgICAgIGN1cnJlbnRYOiAwLFxuICAgICAgICBjdXJyZW50WTogMCxcbiAgICAgICAgZGlmZjogMFxuICAgICAgfSxcbiAgICAgIC8vIEltYWdlc1xuICAgICAgaW1hZ2VzVG9Mb2FkOiBbXSxcbiAgICAgIGltYWdlc0xvYWRlZDogMFxuICAgIH0pO1xuICAgIHN3aXBlci5lbWl0KCdfc3dpcGVyJyk7XG5cbiAgICAvLyBJbml0XG4gICAgaWYgKHN3aXBlci5wYXJhbXMuaW5pdCkge1xuICAgICAgc3dpcGVyLmluaXQoKTtcbiAgICB9XG5cbiAgICAvLyBSZXR1cm4gYXBwIGluc3RhbmNlXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnN0cnVjdG9yLXJldHVyblxuICAgI
5196HJldHVybiBzd2lwZXI7XG4gIH1cbiAgZ2V0RGlyZWN0aW9uTGFiZWwocHJvcGVydHkpIHtcbiAgICBpZiAodGhpcy5pc0hvcml6b250YWwoKSkge1xuICAgICAgcmV0dXJuIHByb3BlcnR5O1xuICAgIH1cbiAgICAvLyBwcmV0dGllci1pZ25vcmVcbiAgICByZXR1cm4ge1xuICAgICAgJ3dpZHRoJzogJ2hlaWdodCcsXG4gICAgICAnbWFyZ2luLXRvcCc6ICdtYXJnaW4tbGVmdCcsXG4gICAgICAnbWFyZ2luLWJvdHRvbSAnOiAnbWFyZ2luLXJpZ2h0JyxcbiAgICAgICdtYXJnaW4tbGVmdCc6ICdtYXJnaW4tdG9wJyxcbiAgICAgICdtYXJnaW4tcmlnaHQnOiAnbWFyZ2luLWJvdHRvbScsXG4gICAgICAncGFkZGluZy1sZWZ0JzogJ3BhZGRpbmctdG9wJyxcbiAgICAgICdwYWRkaW5nLXJpZ2h0JzogJ3BhZGRpbmctYm90dG9tJyxcbiAgICAgICdtYXJnaW5SaWdodCc6ICdtYXJnaW5Cb3R0b20nXG4gICAgfVtwcm9wZXJ0eV07XG4gIH1cbiAgZ2V0U2xpZGVJbmRleChzbGlkZUVsKSB7XG4gICAgY29uc3Qge1xuICAgICAgc2xpZGVzRWwsXG4gICAgICBwYXJhbXNcbiAgICB9ID0gdGhpcztcbiAgICBjb25zdCBzbGlkZXMgPSBlbGVtZW50Q2hpbGRyZW4oc2xpZGVzRWwsIGAuJHtwYXJhbXMuc2xpZGVDbGFzc30sIHN3aXBlci1zbGlkZWApO1xuICAgIGNvbnN0IGZpcnN0U2xpZGVJbmRleCA9IGVsZW1lbnRJbmRleChzbGlkZXNbMF0pO1xuICAgIHJldHVybiBlbGVtZW50SW5kZXgoc2xpZGVFbCkgLSBmaXJzdFNsaWRlSW5kZXg7XG4gIH1cbiAgZ2V0U2xpZGVJbmRleEJ5RGF0YShpbmRleCkge1xuICAgIHJldHVybiB0aGlzLmdldFNsaWRlSW5kZXgodGhpcy5zbGlkZXMuZmlsdGVyKHNsaWRlRWwgPT4gc2xpZGVFbC5nZXRBdHRyaWJ1dGUoJ2RhdGEtc3dpcGVyLXNsaWRlLWluZGV4JykgKiAxID09PSBpbmRleClbMF0pO1xuICB9XG4gIHJlY2FsY1NsaWRlcygpIHtcbiAgICBjb25zdCBzd2lwZXIgPSB0aGlzO1xuICAgIGNvbnN0IHtcbiAgICAgIHNsaWRlc0VsLFxuICAgICAgcGFyYW1zXG4gICAgfSA9IHN3aXBlcjtcbiAgICBzd2lwZXIuc2xpZGVzID0gZWxlbWVudENoaWxkcmVuKHNsaWRlc0VsLCBgLiR7cGFyYW1zLnNsaWRlQ2xhc3N9LCBzd2lwZXItc2xpZGVgKTtcbiAgfVxuICBlbmFibGUoKSB7XG4gICAgY29uc3Qgc3dpcGVyID0gdGhpcztcbiAgICBpZiAoc3dpcGVyLmVuYWJsZWQpIHJldHVybjtcbiAgICBzd2lwZXIuZW5hYmxlZCA9IHRydWU7XG4gICAgaWYgKHN3aXBlci5wYXJhbXMuZ3JhYkN1cnNvcikge1xuICAgICAgc3dpcGVyLnNldEdyYWJDdXJzb3IoKTtcbiAgICB9XG4gICAgc3dpcGVyLmVtaXQoJ2VuYWJsZScpO1xuICB9XG4gIGRpc2FibGUoKSB7XG4gICAgY29uc3Qgc3dpcGVyID0gdGhpcztcbiAgICBpZiAoIXN3aXBlci5lbmFibGVkKSByZXR1cm47XG4gICAgc3dpcGVyLmVuYWJsZWQgPSBmYWxzZTtcbiAgICBpZiAoc3dpcGVyLnBhcmFtcy5ncmFiQ3Vyc29yKSB7XG4gICAgICBzd2lwZXIudW5zZXRHcmFiQ3Vyc29yKCk7XG4gICAgfVxuICAgIHN3aXBlci5lbWl0KCdkaXNhYmxlJyk7XG4gIH1cbiAgc2V0UHJvZ3Jlc3MocHJvZ3Jlc3MsIHNwZWVkKSB7XG4gICAgY29uc3Qgc3dpcGVyID0gdGhpcztcbiAgICBwcm9ncmVzcyA9IE1hdGgubWluKE1hdGgubWF4KHByb2dyZXNzLCAwKSwgMSk7XG4gICAgY29uc3QgbWluID0gc3dpcGVyLm1pblRyYW5zbGF0ZSgpO1xuICAgIGNvbnN0IG1heCA9IHN3aXBlci5tYXhUcmFuc2xhdGUoKTtcbiAgICBjb25zdCBjdXJyZW50ID0gKG1heCAtIG1pbikgKiBwcm9ncmVzcyArIG1pbjtcbiAgICBzd2lwZXIudHJhbnNsYXRlVG8oY3VycmVudCwgdHlwZW9mIHNwZWVkID09PSAndW5kZWZpbmVkJyA/IDAgOiBzcGVlZCk7XG4gICAgc3dpcGVyLnVwZGF0ZUFjdGl2ZUluZGV4KCk7XG4gICAgc3dpcGVyLnVwZGF0ZVNsaWRlc0NsYXNzZXMoKTtcbiAgfVxuICBlbWl0Q29udGFpbmVyQ2xhc3NlcygpIHtcbiAgICBjb25zdCBzd2lwZXIgPSB0aGlzO1xuICAgIGlmICghc3dpcGVyLnBhcmFtcy5fZW1pdENsYXNzZXMgfHwgIXN3aXBlci5lbCkgcmV0dXJuO1xuICAgIGNvbnN0IGNscyA9IHN3aXBlci5lbC5jbGFzc05hbWUuc3BsaXQoJyAnKS5maWx0ZXIoY2xhc3NOYW1lID0+IHtcbiAgICAgIHJldHVybiBjbGFzc05hbWUuaW5kZXhPZignc3dpcGVyJykgPT09IDAgfHwgY2xhc3NOYW1lLmluZGV4T2Yoc3dpcGVyLnBhcmFtcy5jb250YWluZXJNb2RpZmllckNsYXNzKSA9PT0gMDtcbiAgICB9KTtcbiAgICBzd2lwZXIuZW1pdCgnX2NvbnRhaW5lckNsYXNzZXMnLCBjbHMuam9pbignICcpKTtcbiAgfVxuICBnZXRTbGlkZUNsYXNzZXMoc2xpZGVFbCkge1xuICAgIGNvbnN0IHN3aXBlciA9IHRoaXM7XG4gICAgaWYgKHN3aXBlci5kZXN0cm95ZWQpIHJldHVybiAnJztcbiAgICByZXR1cm4gc2xpZGVFbC5jbGFzc05hbWUuc3BsaXQoJyAnKS5maWx0ZXIoY2xhc3NOYW1lID0+IHtcbiAgICAgIHJldHVybiBjbGFzc05hbWUuaW5kZXhPZignc3dpcGVyLXNsaWRlJykgPT09IDAgfHwgY2xhc3NOYW1lLmluZGV4T2Yoc3dpcGVyLnBhcmFtcy5zbGlkZUNsYXNzKSA9PT0gMDtcbiAgICB9KS5qb2luKCcgJyk7XG4gIH1cbiAgZW1pdFNsaWRlc0NsYXNzZXMoKSB7XG4gICAgY29uc3Qgc3dpcGVyID0gdGhpcztcbiAgICBpZiAoIXN3aXBlci5wYXJhbXMuX2VtaXRDbGFzc2VzIHx8ICFzd2lwZXIuZWwpIHJldHVybjtcbiAgICBjb25zdCB1cGRhdGVzID0gW107XG4gICAgc3dpcGVyLnNsaWRlcy5mb3JFYWNoKHNsaWRlRWwgPT4ge1xuICAgICAgY29uc3QgY2xhc3NOYW1lcyA9IHN3aXBlci5nZXRTbGlkZUNsYXNzZXMoc2xpZGVFbCk7XG4gICAgICB1cGRhdGVzLnB1c2goe1xuICAgICAgICBzbGlkZUVsLFxuICAgICAgICBjbGFzc05hbWVzXG4gICAgICB9KTtcbiAgICAgIHN3aXBlci5lbWl0KCdfc2xpZGVDbGFzcycsIHNsaWRlRWwsIGNsYXNzTmFtZXMpO1xuICAgIH0pO1xuICAgIHN3aXBlci5lbWl0KCdfc2xpZGVDbGFzc2VzJywgdXBkYXRlcyk7XG4gIH1cbiAgc2xpZGVzUGVyVmlld0R5bmFtaWModmlldywgZXhhY3QpIHtcbiAgICBpZiAodmlldyA9PT0gdm9pZCAwKSB7XG4gICAgICB2aWV3ID0gJ2N1cnJlbnQnO1xuICAgIH1cbiAgICBpZiAoZXhhY3QgPT09IHZvaWQgMCkge1xuICAgICAgZXhhY3QgPSBmYWxzZTtcbiAgICB9XG4gICAgY29uc3Qgc3dpcGVyID0gdGhpcztcbiAgICBjb25zdCB7XG4gICAgICBwYXJhbXMsXG4gICAgICBzbGlkZXMsXG4gICAgICBzbGlkZXNHcmlkLFxuICAgICAgc2xpZGVzU2l6ZXNHcmlkLFxuICAgICAgc2l6ZTogc3dpcGVyU2l6ZSxcbiAgICAgIGFjdGl2ZUluZGV4XG4gICAgfSA9IHN3aXBlcjtcbiAgICBsZXQgc3B2ID0gMTtcbiAgICBpZiAodHlwZW9mIHBhcmFtcy5zbGlkZXNQZXJWaWV3ID09PSAnbnVtYmVyJykgcmV0dXJuIHBhcmFtcy5zbGlkZXNQZXJWaWV3O1xuICAgIGlmIChwYXJhbXMuY2VudGVyZWRTbGlkZXMpIHtcbiAgICAgIGxldCBzbGlkZVNpemUgPSBzbGlkZXNbYWN0aXZlSW5kZXhdID8gTWF0aC5jZWlsKHNsaWRlc1thY3RpdmVJbmRleF0uc3dpcGVyU2xpZGVTaXplKSA6IDA7XG4gICAgICBsZXQgYnJlYWtMb29wO1xuICAgICAgZm9yIChsZXQgaSA9IGFjdGl2ZUluZGV4ICsgMTsgaSA8IHNsaWRlcy5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICBpZiAoc2xpZGVzW2ldICYmICFicmVha0xvb3ApIHtcbiAgICAgICAgICBzbGlkZVNpemUgKz0gTWF0aC5jZWlsKHNsaWRlc1tpXS5zd2lwZXJTbGlkZVNpemUpO1xuICAgICAgICAgI
5196HNwdiArPSAxO1xuICAgICAgICAgIGlmIChzbGlkZVNpemUgPiBzd2lwZXJTaXplKSBicmVha0xvb3AgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBmb3IgKGxldCBpID0gYWN0aXZlSW5kZXggLSAxOyBpID49IDA7IGkgLT0gMSkge1xuICAgICAgICBpZiAoc2xpZGVzW2ldICYmICFicmVha0xvb3ApIHtcbiAgICAgICAgICBzbGlkZVNpemUgKz0gc2xpZGVzW2ldLnN3aXBlclNsaWRlU2l6ZTtcbiAgICAgICAgICBzcHYgKz0gMTtcbiAgICAgICAgICBpZiAoc2xpZGVTaXplID4gc3dpcGVyU2l6ZSkgYnJlYWtMb29wID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmVcbiAgICAgIGlmICh2aWV3ID09PSAnY3VycmVudCcpIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IGFjdGl2ZUluZGV4ICsgMTsgaSA8IHNsaWRlcy5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICAgIGNvbnN0IHNsaWRlSW5WaWV3ID0gZXhhY3QgPyBzbGlkZXNHcmlkW2ldICsgc2xpZGVzU2l6ZXNHcmlkW2ldIC0gc2xpZGVzR3JpZFthY3RpdmVJbmRleF0gPCBzd2lwZXJTaXplIDogc2xpZGVzR3JpZFtpXSAtIHNsaWRlc0dyaWRbYWN0aXZlSW5kZXhdIDwgc3dpcGVyU2l6ZTtcbiAgICAgICAgICBpZiAoc2xpZGVJblZpZXcpIHtcbiAgICAgICAgICAgIHNwdiArPSAxO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gcHJldmlvdXNcbiAgICAgICAgZm9yIChsZXQgaSA9IGFjdGl2ZUluZGV4IC0gMTsgaSA+PSAwOyBpIC09IDEpIHtcbiAgICAgICAgICBjb25zdCBzbGlkZUluVmlldyA9IHNsaWRlc0dyaWRbYWN0aXZlSW5kZXhdIC0gc2xpZGVzR3JpZFtpXSA8IHN3aXBlclNpemU7XG4gICAgICAgICAgaWYgKHNsaWRlSW5WaWV3KSB7XG4gICAgICAgICAgICBzcHYgKz0gMTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHNwdjtcbiAgfVxuICB1cGRhdGUoKSB7XG4gICAgY29uc3Qgc3dpcGVyID0gdGhpcztcbiAgICBpZiAoIXN3aXBlciB8fCBzd2lwZXIuZGVzdHJveWVkKSByZXR1cm47XG4gICAgY29uc3Qge1xuICAgICAgc25hcEdyaWQsXG4gICAgICBwYXJhbXNcbiAgICB9ID0gc3dpcGVyO1xuICAgIC8vIEJyZWFrcG9pbnRzXG4gICAgaWYgKHBhcmFtcy5icmVha3BvaW50cykge1xuICAgICAgc3dpcGVyLnNldEJyZWFrcG9pbnQoKTtcbiAgICB9XG4gICAgWy4uLnN3aXBlci5lbC5xdWVyeVNlbGVjdG9yQWxsKCdbbG9hZGluZz1cImxhenlcIl0nKV0uZm9yRWFjaChpbWFnZUVsID0+IHtcbiAgICAgIGlmIChpbWFnZUVsLmNvbXBsZXRlKSB7XG4gICAgICAgIHByb2Nlc3NMYXp5UHJlbG9hZGVyKHN3aXBlciwgaW1hZ2VFbCk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgc3dpcGVyLnVwZGF0ZVNpemUoKTtcbiAgICBzd2lwZXIudXBkYXRlU2xpZGVzKCk7XG4gICAgc3dpcGVyLnVwZGF0ZVByb2dyZXNzKCk7XG4gICAgc3dpcGVyLnVwZGF0ZVNsaWRlc0NsYXNzZXMoKTtcbiAgICBmdW5jdGlvbiBzZXRUcmFuc2xhdGUoKSB7XG4gICAgICBjb25zdCB0cmFuc2xhdGVWYWx1ZSA9IHN3aXBlci5ydGxUcmFuc2xhdGUgPyBzd2lwZXIudHJhbnNsYXRlICogLTEgOiBzd2lwZXIudHJhbnNsYXRlO1xuICAgICAgY29uc3QgbmV3VHJhbnNsYXRlID0gTWF0aC5taW4oTWF0aC5tYXgodHJhbnNsYXRlVmFsdWUsIHN3aXBlci5tYXhUcmFuc2xhdGUoKSksIHN3aXBlci5taW5UcmFuc2xhdGUoKSk7XG4gICAgICBzd2lwZXIuc2V0VHJhbnNsYXRlKG5ld1RyYW5zbGF0ZSk7XG4gICAgICBzd2lwZXIudXBkYXRlQWN0aXZlSW5kZXgoKTtcbiAgICAgIHN3aXBlci51cGRhdGVTbGlkZXNDbGFzc2VzKCk7XG4gICAgfVxuICAgIGxldCB0cmFuc2xhdGVkO1xuICAgIGlmIChwYXJhbXMuZnJlZU1vZGUgJiYgcGFyYW1zLmZyZWVNb2RlLmVuYWJsZWQgJiYgIXBhcmFtcy5jc3NNb2RlKSB7XG4gICAgICBzZXRUcmFuc2xhdGUoKTtcbiAgICAgIGlmIChwYXJhbXMuYXV0b0hlaWdodCkge1xuICAgICAgICBzd2lwZXIudXBkYXRlQXV0b0hlaWdodCgpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoKHBhcmFtcy5zbGlkZXNQZXJWaWV3ID09PSAnYXV0bycgfHwgcGFyYW1zLnNsaWRlc1BlclZpZXcgPiAxKSAmJiBzd2lwZXIuaXNFbmQgJiYgIXBhcmFtcy5jZW50ZXJlZFNsaWRlcykge1xuICAgICAgICBjb25zdCBzbGlkZXMgPSBzd2lwZXIudmlydHVhbCAmJiBwYXJhbXMudmlydHVhbC5lbmFibGVkID8gc3dpcGVyLnZpcnR1YWwuc2xpZGVzIDogc3dpcGVyLnNsaWRlcztcbiAgICAgICAgdHJhbnNsYXRlZCA9IHN3aXBlci5zbGlkZVRvKHNsaWRlcy5sZW5ndGggLSAxLCAwLCBmYWxzZSwgdHJ1ZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0cmFuc2xhdGVkID0gc3dpcGVyLnNsaWRlVG8oc3dpcGVyLmFjdGl2ZUluZGV4LCAwLCBmYWxzZSwgdHJ1ZSk7XG4gICAgICB9XG4gICAgICBpZiAoIXRyYW5zbGF0ZWQpIHtcbiAgICAgICAgc2V0VHJhbnNsYXRlKCk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChwYXJhbXMud2F0Y2hPdmVyZmxvdyAmJiBzbmFwR3JpZCAhPT0gc3dpcGVyLnNuYXBHcmlkKSB7XG4gICAgICBzd2lwZXIuY2hlY2tPdmVyZmxvdygpO1xuICAgIH1cbiAgICBzd2lwZXIuZW1pdCgndXBkYXRlJyk7XG4gIH1cbiAgY2hhbmdlRGlyZWN0aW9uKG5ld0RpcmVjdGlvbiwgbmVlZFVwZGF0ZSkge1xuICAgIGlmIChuZWVkVXBkYXRlID09PSB2b2lkIDApIHtcbiAgICAgIG5lZWRVcGRhdGUgPSB0cnVlO1xuICAgIH1cbiAgICBjb25zdCBzd2lwZXIgPSB0aGlzO1xuICAgIGNvbnN0IGN1cnJlbnREaXJlY3Rpb24gPSBzd2lwZXIucGFyYW1zLmRpcmVjdGlvbjtcbiAgICBpZiAoIW5ld0RpcmVjdGlvbikge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lXG4gICAgICBuZXdEaXJlY3Rpb24gPSBjdXJyZW50RGlyZWN0aW9uID09PSAnaG9yaXpvbnRhbCcgPyAndmVydGljYWwnIDogJ2hvcml6b250YWwnO1xuICAgIH1cbiAgICBpZiAobmV3RGlyZWN0aW9uID09PSBjdXJyZW50RGlyZWN0aW9uIHx8IG5ld0RpcmVjdGlvbiAhPT0gJ2hvcml6b250YWwnICYmIG5ld0RpcmVjdGlvbiAhPT0gJ3ZlcnRpY2FsJykge1xuICAgICAgcmV0dXJuIHN3aXBlcjtcbiAgICB9XG4gICAgc3dpcGVyLmVsLmNsYXNzTGlzdC5yZW1vdmUoYCR7c3d
5196pcGVyLnBhcmFtcy5jb250YWluZXJNb2RpZmllckNsYXNzfSR7Y3VycmVudERpcmVjdGlvbn1gKTtcbiAgICBzd2lwZXIuZWwuY2xhc3NMaXN0LmFkZChgJHtzd2lwZXIucGFyYW1zLmNvbnRhaW5lck1vZGlmaWVyQ2xhc3N9JHtuZXdEaXJlY3Rpb259YCk7XG4gICAgc3dpcGVyLmVtaXRDb250YWluZXJDbGFzc2VzKCk7XG4gICAgc3dpcGVyLnBhcmFtcy5kaXJlY3Rpb24gPSBuZXdEaXJlY3Rpb247XG4gICAgc3dpcGVyLnNsaWRlcy5mb3JFYWNoKHNsaWRlRWwgPT4ge1xuICAgICAgaWYgKG5ld0RpcmVjdGlvbiA9PT0gJ3ZlcnRpY2FsJykge1xuICAgICAgICBzbGlkZUVsLnN0eWxlLndpZHRoID0gJyc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzbGlkZUVsLnN0eWxlLmhlaWdodCA9ICcnO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHN3aXBlci5lbWl0KCdjaGFuZ2VEaXJlY3Rpb24nKTtcbiAgICBpZiAobmVlZFVwZGF0ZSkgc3dpcGVyLnVwZGF0ZSgpO1xuICAgIHJldHVybiBzd2lwZXI7XG4gIH1cbiAgY2hhbmdlTGFuZ3VhZ2VEaXJlY3Rpb24oZGlyZWN0aW9uKSB7XG4gICAgY29uc3Qgc3dpcGVyID0gdGhpcztcbiAgICBpZiAoc3dpcGVyLnJ0bCAmJiBkaXJlY3Rpb24gPT09ICdydGwnIHx8ICFzd2lwZXIucnRsICYmIGRpcmVjdGlvbiA9PT0gJ2x0cicpIHJldHVybjtcbiAgICBzd2lwZXIucnRsID0gZGlyZWN0aW9uID09PSAncnRsJztcbiAgICBzd2lwZXIucnRsVHJhbnNsYXRlID0gc3dpcGVyLnBhcmFtcy5kaXJlY3Rpb24gPT09ICdob3Jpem9udGFsJyAmJiBzd2lwZXIucnRsO1xuICAgIGlmIChzd2lwZXIucnRsKSB7XG4gICAgICBzd2lwZXIuZWwuY2xhc3NMaXN0LmFkZChgJHtzd2lwZXIucGFyYW1zLmNvbnRhaW5lck1vZGlmaWVyQ2xhc3N9cnRsYCk7XG4gICAgICBzd2lwZXIuZWwuZGlyID0gJ3J0bCc7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN3aXBlci5lbC5jbGFzc0xpc3QucmVtb3ZlKGAke3N3aXBlci5wYXJhbXMuY29udGFpbmVyTW9kaWZpZXJDbGFzc31ydGxgKTtcbiAgICAgIHN3aXBlci5lbC5kaXIgPSAnbHRyJztcbiAgICB9XG4gICAgc3dpcGVyLnVwZGF0ZSgpO1xuICB9XG4gIG1vdW50KGVsZW1lbnQpIHtcbiAgICBjb25zdCBzd2lwZXIgPSB0aGlzO1xuICAgIGlmIChzd2lwZXIubW91bnRlZCkgcmV0dXJuIHRydWU7XG5cbiAgICAvLyBGaW5kIGVsXG4gICAgbGV0IGVsID0gZWxlbWVudCB8fCBzd2lwZXIucGFyYW1zLmVsO1xuICAgIGlmICh0eXBlb2YgZWwgPT09ICdzdHJpbmcnKSB7XG4gICAgICBlbCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoZWwpO1xuICAgIH1cbiAgICBpZiAoIWVsKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGVsLnN3aXBlciA9IHN3aXBlcjtcbiAgICBpZiAoZWwucGFyZW50Tm9kZSAmJiBlbC5wYXJlbnROb2RlLmhvc3QgJiYgZWwucGFyZW50Tm9kZS5ob3N0Lm5vZGVOYW1lID09PSBzd2lwZXIucGFyYW1zLnN3aXBlckVsZW1lbnROb2RlTmFtZS50b1VwcGVyQ2FzZSgpKSB7XG4gICAgICBzd2lwZXIuaXNFbGVtZW50ID0gdHJ1ZTtcbiAgICB9XG4gICAgY29uc3QgZ2V0V3JhcHBlclNlbGVjdG9yID0gKCkgPT4ge1xuICAgICAgcmV0dXJuIGAuJHsoc3dpcGVyLnBhcmFtcy53cmFwcGVyQ2xhc3MgfHwgJycpLnRyaW0oKS5zcGxpdCgnICcpLmpvaW4oJy4nKX1gO1xuICAgIH07XG4gICAgY29uc3QgZ2V0V3JhcHBlciA9ICgpID0+IHtcbiAgICAgIGlmIChlbCAmJiBlbC5zaGFkb3dSb290ICYmIGVsLnNoYWRvd1Jvb3QucXVlcnlTZWxlY3Rvcikge1xuICAgICAgICBjb25zdCByZXMgPSBlbC5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3IoZ2V0V3JhcHBlclNlbGVjdG9yKCkpO1xuICAgICAgICAvLyBDaGlsZHJlbiBuZWVkcyB0byByZXR1cm4gc2xvdCBpdGVtc1xuICAgICAgICByZXR1cm4gcmVzO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGVsZW1lbnRDaGlsZHJlbihlbCwgZ2V0V3JhcHBlclNlbGVjdG9yKCkpWzBdO1xuICAgIH07XG4gICAgLy8gRmluZCBXcmFwcGVyXG4gICAgbGV0IHdyYXBwZXJFbCA9IGdldFdyYXBwZXIoKTtcbiAgICBpZiAoIXdyYXBwZXJFbCAmJiBzd2lwZXIucGFyYW1zLmNyZWF0ZUVsZW1lbnRzKSB7XG4gICAgICB3cmFwcGVyRWwgPSBjcmVhdGVFbGVtZW50KCdkaXYnLCBzd2lwZXIucGFyYW1zLndyYXBwZXJDbGFzcyk7XG4gICAgICBlbC5hcHBlbmQod3JhcHBlckVsKTtcbiAgICAgIGVsZW1lbnRDaGlsZHJlbihlbCwgYC4ke3N3aXBlci5wYXJhbXMuc2xpZGVDbGFzc31gKS5mb3JFYWNoKHNsaWRlRWwgPT4ge1xuICAgICAgICB3cmFwcGVyRWwuYXBwZW5kKHNsaWRlRWwpO1xuICAgICAgfSk7XG4gICAgfVxuICAgIE9iamVjdC5hc3NpZ24oc3dpcGVyLCB7XG4gICAgICBlbCxcbiAgICAgIHdyYXBwZXJFbCxcbiAgICAgIHNsaWRlc0VsOiBzd2lwZXIuaXNFbGVtZW50ICYmICFlbC5wYXJlbnROb2RlLmhvc3Quc2xpZGVTbG90cyA/IGVsLnBhcmVudE5vZGUuaG9zdCA6IHdyYXBwZXJFbCxcbiAgICAgIGhvc3RFbDogc3dpcGVyLmlzRWxlbWVudCA/IGVsLnBhcmVudE5vZGUuaG9zdCA6IGVsLFxuICAgICAgbW91bnRlZDogdHJ1ZSxcbiAgICAgIC8vIFJUTFxuICAgICAgcnRsOiBlbC5kaXIudG9Mb3dlckNhc2UoKSA9PT0gJ3J0bCcgfHwgZWxlbWVudFN0eWxlKGVsLCAnZGlyZWN0aW9uJykgPT09ICdydGwnLFxuICAgICAgcnRsVHJhbnNsYXRlOiBzd2lwZXIucGFyYW1zLmRpcmVjdGlvbiA9PT0gJ2hvcml6b250YWwnICYmIChlbC5kaXIudG9Mb3dlckNhc2UoKSA9PT0gJ3J0bCcgfHwgZWxlbWVudFN0eWxlKGVsLCAnZGlyZWN0aW9uJykgPT09ICdydGwnKSxcbiAgICAgIHdyb25nUlRMOiBlbGVtZW50U3R5bGUod3JhcHBlckVsLCAnZGlzcGxheScpID09PSAnLXdlYmtpdC1ib3gnXG4gICAgfSk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgaW5pdChlbCkge1xuICAgIGNvbnN0IHN3aXBlciA9IHRoaXM7XG4gICAgaWYgKHN3aXBlci5pbml0aWFsaXplZCkgcmV0dXJuIHN3aXBlcjtcbiAgICBjb25zdCBtb3VudGVkID0gc3dpcGVyLm1vdW50KGVsKTtcbiAgICBpZiAobW91bnRlZCA9PT0gZmFsc2UpIHJldHVybi
5196Bzd2lwZXI7XG4gICAgc3dpcGVyLmVtaXQoJ2JlZm9yZUluaXQnKTtcblxuICAgIC8vIFNldCBicmVha3BvaW50XG4gICAgaWYgKHN3aXBlci5wYXJhbXMuYnJlYWtwb2ludHMpIHtcbiAgICAgIHN3aXBlci5zZXRCcmVha3BvaW50KCk7XG4gICAgfVxuXG4gICAgLy8gQWRkIENsYXNzZXNcbiAgICBzd2lwZXIuYWRkQ2xhc3NlcygpO1xuXG4gICAgLy8gVXBkYXRlIHNpemVcbiAgICBzd2lwZXIudXBkYXRlU2l6ZSgpO1xuXG4gICAgLy8gVXBkYXRlIHNsaWRlc1xuICAgIHN3aXBlci51cGRhdGVTbGlkZXMoKTtcbiAgICBpZiAoc3dpcGVyLnBhcmFtcy53YXRjaE92ZXJmbG93KSB7XG4gICAgICBzd2lwZXIuY2hlY2tPdmVyZmxvdygpO1xuICAgIH1cblxuICAgIC8vIFNldCBHcmFiIEN1cnNvclxuICAgIGlmIChzd2lwZXIucGFyYW1zLmdyYWJDdXJzb3IgJiYgc3dpcGVyLmVuYWJsZWQpIHtcbiAgICAgIHN3aXBlci5zZXRHcmFiQ3Vyc29yKCk7XG4gICAgfVxuXG4gICAgLy8gU2xpZGUgVG8gSW5pdGlhbCBTbGlkZVxuICAgIGlmIChzd2lwZXIucGFyYW1zLmxvb3AgJiYgc3dpcGVyLnZpcnR1YWwgJiYgc3dpcGVyLnBhcmFtcy52aXJ0dWFsLmVuYWJsZWQpIHtcbiAgICAgIHN3aXBlci5zbGlkZVRvKHN3aXBlci5wYXJhbXMuaW5pdGlhbFNsaWRlICsgc3dpcGVyLnZpcnR1YWwuc2xpZGVzQmVmb3JlLCAwLCBzd2lwZXIucGFyYW1zLnJ1bkNhbGxiYWNrc09uSW5pdCwgZmFsc2UsIHRydWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzd2lwZXIuc2xpZGVUbyhzd2lwZXIucGFyYW1zLmluaXRpYWxTbGlkZSwgMCwgc3dpcGVyLnBhcmFtcy5ydW5DYWxsYmFja3NPbkluaXQsIGZhbHNlLCB0cnVlKTtcbiAgICB9XG5cbiAgICAvLyBDcmVhdGUgbG9vcFxuICAgIGlmIChzd2lwZXIucGFyYW1zLmxvb3ApIHtcbiAgICAgIHN3aXBlci5sb29wQ3JlYXRlKCk7XG4gICAgfVxuXG4gICAgLy8gQXR0YWNoIGV2ZW50c1xuICAgIHN3aXBlci5hdHRhY2hFdmVudHMoKTtcbiAgICBjb25zdCBsYXp5RWxlbWVudHMgPSBbLi4uc3dpcGVyLmVsLnF1ZXJ5U2VsZWN0b3JBbGwoJ1tsb2FkaW5nPVwibGF6eVwiXScpXTtcbiAgICBpZiAoc3dpcGVyLmlzRWxlbWVudCkge1xuICAgICAgbGF6eUVsZW1lbnRzLnB1c2goLi4uc3dpcGVyLmhvc3RFbC5xdWVyeVNlbGVjdG9yQWxsKCdbbG9hZGluZz1cImxhenlcIl0nKSk7XG4gICAgfVxuICAgIGxhenlFbGVtZW50cy5mb3JFYWNoKGltYWdlRWwgPT4ge1xuICAgICAgaWYgKGltYWdlRWwuY29tcGxldGUpIHtcbiAgICAgICAgcHJvY2Vzc0xhenlQcmVsb2FkZXIoc3dpcGVyLCBpbWFnZUVsKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGltYWdlRWwuYWRkRXZlbnRMaXN0ZW5lcignbG9hZCcsIGUgPT4ge1xuICAgICAgICAgIHByb2Nlc3NMYXp5UHJlbG9hZGVyKHN3aXBlciwgZS50YXJnZXQpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBwcmVsb2FkKHN3aXBlcik7XG5cbiAgICAvLyBJbml0IEZsYWdcbiAgICBzd2lwZXIuaW5pdGlhbGl6ZWQgPSB0cnVlO1xuICAgIHByZWxvYWQoc3dpcGVyKTtcblxuICAgIC8vIEVtaXRcbiAgICBzd2lwZXIuZW1pdCgnaW5pdCcpO1xuICAgIHN3aXBlci5lbWl0KCdhZnRlckluaXQnKTtcbiAgICByZXR1cm4gc3dpcGVyO1xuICB9XG4gIGRlc3Ryb3koZGVsZXRlSW5zdGFuY2UsIGNsZWFuU3R5bGVzKSB7XG4gICAgaWYgKGRlbGV0ZUluc3RhbmNlID09PSB2b2lkIDApIHtcbiAgICAgIGRlbGV0ZUluc3RhbmNlID0gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKGNsZWFuU3R5bGVzID09PSB2b2lkIDApIHtcbiAgICAgIGNsZWFuU3R5bGVzID0gdHJ1ZTtcbiAgICB9XG4gICAgY29uc3Qgc3dpcGVyID0gdGhpcztcbiAgICBjb25zdCB7XG4gICAgICBwYXJhbXMsXG4gICAgICBlbCxcbiAgICAgIHdyYXBwZXJFbCxcbiAgICAgIHNsaWRlc1xuICAgIH0gPSBzd2lwZXI7XG4gICAgaWYgKHR5cGVvZiBzd2lwZXIucGFyYW1zID09PSAndW5kZWZpbmVkJyB8fCBzd2lwZXIuZGVzdHJveWVkKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgc3dpcGVyLmVtaXQoJ2JlZm9yZURlc3Ryb3knKTtcblxuICAgIC8vIEluaXQgRmxhZ1xuICAgIHN3aXBlci5pbml0aWFsaXplZCA9IGZhbHNlO1xuXG4gICAgLy8gRGV0YWNoIGV2ZW50c1xuICAgIHN3aXBlci5kZXRhY2hFdmVudHMoKTtcblxuICAgIC8vIERlc3Ryb3kgbG9vcFxuICAgIGlmIChwYXJhbXMubG9vcCkge1xuICAgICAgc3dpcGVyLmxvb3BEZXN0cm95KCk7XG4gICAgfVxuXG4gICAgLy8gQ2xlYW51cCBzdHlsZXNcbiAgICBpZiAoY2xlYW5TdHlsZXMpIHtcbiAgICAgIHN3aXBlci5yZW1vdmVDbGFzc2VzKCk7XG4gICAgICBlbC5yZW1vdmVBdHRyaWJ1dGUoJ3N0eWxlJyk7XG4gICAgICB3cmFwcGVyRWwucmVtb3ZlQXR0cmlidXRlKCdzdHlsZScpO1xuICAgICAgaWYgKHNsaWRlcyAmJiBzbGlkZXMubGVuZ3RoKSB7XG4gICAgICAgIHNsaWRlcy5mb3JFYWNoKHNsaWRlRWwgPT4ge1xuICAgICAgICAgIHNsaWRlRWwuY2xhc3NMaXN0LnJlbW92ZShwYXJhbXMuc2xpZGVWaXNpYmxlQ2xhc3MsIHBhcmFtcy5zbGlkZUZ1bGx5VmlzaWJsZUNsYXNzLCBwYXJhbXMuc2xpZGVBY3RpdmVDbGFzcywgcGFyYW1zLnNsaWRlTmV4dENsYXNzLCBwYXJhbXMuc2xpZGVQcmV2Q2xhc3MpO1xuICAgICAgICAgIHNsaWRlRWwucmVtb3ZlQXR0cmlidXRlKCdzdHlsZScpO1xuICAgICAgICAgIHNsaWRlRWwucmVtb3ZlQXR0cmlidXRlKCdkYXRhLXN3aXBlci1zbGlkZS1pbmRleCcpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gICAgc3dpcGVyLmVtaXQoJ2Rlc3Ryb3knKTtcblxuICAgIC8vIERldGFjaCBlbWl0dGVyIGV2ZW50c1xuICAgIE9iamVjdC5rZXlzKHN3aXBlci5ldmVudHNMaXN0ZW5lcnMpLmZvckVhY2goZXZlbnROYW1lID0+IHtcbiAgICAgIHN3aXBlci5vZmYoZXZlbnROYW1lKTtcbiAgICB9KTtcbiAgICBpZiAoZGVsZXRlSW5zdGFuY2UgIT09IGZhbHNlKSB7XG4gICAgICBzd2lwZXIuZWwuc3dpcGVyID0gbnVsbDtcbiAgICAgIGRlbGV0ZVByb3BzKHN3aXBlcik7XG4gICAgfVxuICAgIHN3aXBlci5kZXN0cm95ZWQgPSB0cnVlO1xuICAgIHJldHVybi
5196BudWxsO1xuICB9XG4gIHN0YXRpYyBleHRlbmREZWZhdWx0cyhuZXdEZWZhdWx0cykge1xuICAgIGV4dGVuZChleHRlbmRlZERlZmF1bHRzLCBuZXdEZWZhdWx0cyk7XG4gIH1cbiAgc3RhdGljIGdldCBleHRlbmRlZERlZmF1bHRzKCkge1xuICAgIHJldHVybiBleHRlbmRlZERlZmF1bHRzO1xuICB9XG4gIHN0YXRpYyBnZXQgZGVmYXVsdHMoKSB7XG4gICAgcmV0dXJuIGRlZmF1bHRzO1xuICB9XG4gIHN0YXRpYyBpbnN0YWxsTW9kdWxlKG1vZCkge1xuICAgIGlmICghU3dpcGVyLnByb3RvdHlwZS5fX21vZHVsZXNfXykgU3dpcGVyLnByb3RvdHlwZS5fX21vZHVsZXNfXyA9IFtdO1xuICAgIGNvbnN0IG1vZHVsZXMgPSBTd2lwZXIucHJvdG90eXBlLl9fbW9kdWxlc19fO1xuICAgIGlmICh0eXBlb2YgbW9kID09PSAnZnVuY3Rpb24nICYmIG1vZHVsZXMuaW5kZXhPZihtb2QpIDwgMCkge1xuICAgICAgbW9kdWxlcy5wdXNoKG1vZCk7XG4gICAgfVxuICB9XG4gIHN0YXRpYyB1c2UobW9kdWxlKSB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkobW9kdWxlKSkge1xuICAgICAgbW9kdWxlLmZvckVhY2gobSA9PiBTd2lwZXIuaW5zdGFsbE1vZHVsZShtKSk7XG4gICAgICByZXR1cm4gU3dpcGVyO1xuICAgIH1cbiAgICBTd2lwZXIuaW5zdGFsbE1vZHVsZShtb2R1bGUpO1xuICAgIHJldHVybiBTd2lwZXI7XG4gIH1cbn1cbk9iamVjdC5rZXlzKHByb3RvdHlwZXMpLmZvckVhY2gocHJvdG90eXBlR3JvdXAgPT4ge1xuICBPYmplY3Qua2V5cyhwcm90b3R5cGVzW3Byb3RvdHlwZUdyb3VwXSkuZm9yRWFjaChwcm90b01ldGhvZCA9PiB7XG4gICAgU3dpcGVyLnByb3RvdHlwZVtwcm90b01ldGhvZF0gPSBwcm90b3R5cGVzW3Byb3RvdHlwZUdyb3VwXVtwcm90b01ldGhvZF07XG4gIH0pO1xufSk7XG5Td2lwZXIudXNlKFtSZXNpemUsIE9ic2VydmVyXSk7XG5cbmV4cG9ydCB7IFN3aXBlciBhcyBTLCBkZWZhdWx0cyBhcyBkIH07XG4iLCJpbXBvcnQgeyBlIGFzIGVsZW1lbnRDaGlsZHJlbiwgYyBhcyBjcmVhdGVFbGVtZW50IH0gZnJvbSAnLi91dGlscy5tanMnO1xuXG5mdW5jdGlvbiBjcmVhdGVFbGVtZW50SWZOb3REZWZpbmVkKHN3aXBlciwgb3JpZ2luYWxQYXJhbXMsIHBhcmFtcywgY2hlY2tQcm9wcykge1xuICBpZiAoc3dpcGVyLnBhcmFtcy5jcmVhdGVFbGVtZW50cykge1xuICAgIE9iamVjdC5rZXlzKGNoZWNrUHJvcHMpLmZvckVhY2goa2V5ID0+IHtcbiAgICAgIGlmICghcGFyYW1zW2tleV0gJiYgcGFyYW1zLmF1dG8gPT09IHRydWUpIHtcbiAgICAgICAgbGV0IGVsZW1lbnQgPSBlbGVtZW50Q2hpbGRyZW4oc3dpcGVyLmVsLCBgLiR7Y2hlY2tQcm9wc1trZXldfWApWzBdO1xuICAgICAgICBpZiAoIWVsZW1lbnQpIHtcbiAgICAgICAgICBlbGVtZW50ID0gY3JlYXRlRWxlbWVudCgnZGl2JywgY2hlY2tQcm9wc1trZXldKTtcbiAgICAgICAgICBlbGVtZW50LmNsYXNzTmFtZSA9IGNoZWNrUHJvcHNba2V5XTtcbiAgICAgICAgICBzd2lwZXIuZWwuYXBwZW5kKGVsZW1lbnQpO1xuICAgICAgICB9XG4gICAgICAgIHBhcmFtc1trZXldID0gZWxlbWVudDtcbiAgICAgICAgb3JpZ2luYWxQYXJhbXNba2V5XSA9IGVsZW1lbnQ7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbiAgcmV0dXJuIHBhcmFtcztcbn1cblxuZXhwb3J0IHsgY3JlYXRlRWxlbWVudElmTm90RGVmaW5lZCBhcyBjIH07XG4iLCJpbXBvcnQgeyBjIGFzIGNyZWF0ZUVsZW1lbnRJZk5vdERlZmluZWQgfSBmcm9tICcuLi9zaGFyZWQvY3JlYXRlLWVsZW1lbnQtaWYtbm90LWRlZmluZWQubWpzJztcbmltcG9ydCB7IG0gYXMgbWFrZUVsZW1lbnRzQXJyYXkgfSBmcm9tICcuLi9zaGFyZWQvdXRpbHMubWpzJztcblxuZnVuY3Rpb24gTmF2aWdhdGlvbihfcmVmKSB7XG4gIGxldCB7XG4gICAgc3dpcGVyLFxuICAgIGV4dGVuZFBhcmFtcyxcbiAgICBvbixcbiAgICBlbWl0XG4gIH0gPSBfcmVmO1xuICBleHRlbmRQYXJhbXMoe1xuICAgIG5hdmlnYXRpb246IHtcbiAgICAgIG5leHRFbDogbnVsbCxcbiAgICAgIHByZXZFbDogbnVsbCxcbiAgICAgIGhpZGVPbkNsaWNrOiBmYWxzZSxcbiAgICAgIGRpc2FibGVkQ2xhc3M6ICdzd2lwZXItYnV0dG9uLWRpc2FibGVkJyxcbiAgICAgIGhpZGRlbkNsYXNzOiAnc3dpcGVyLWJ1dHRvbi1oaWRkZW4nLFxuICAgICAgbG9ja0NsYXNzOiAnc3dpcGVyLWJ1dHRvbi1sb2NrJyxcbiAgICAgIG5hdmlnYXRpb25EaXNhYmxlZENsYXNzOiAnc3dpcGVyLW5hdmlnYXRpb24tZGlzYWJsZWQnXG4gICAgfVxuICB9KTtcbiAgc3dpcGVyLm5hdmlnYXRpb24gPSB7XG4gICAgbmV4dEVsOiBudWxsLFxuICAgIHByZXZFbDogbnVsbFxuICB9O1xuICBmdW5jdGlvbiBnZXRFbChlbCkge1xuICAgIGxldCByZXM7XG4gICAgaWYgKGVsICYmIHR5cGVvZiBlbCA9PT0gJ3N0cmluZycgJiYgc3dpcGVyLmlzRWxlbWVudCkge1xuICAgICAgcmVzID0gc3dpcGVyLmVsLnF1ZXJ5U2VsZWN0b3IoZWwpO1xuICAgICAgaWYgKHJlcykgcmV0dXJuIHJlcztcbiAgICB9XG4gICAgaWYgKGVsKSB7XG4gICAgICBpZiAodHlwZW9mIGVsID09PSAnc3RyaW5nJykgcmVzID0gWy4uLmRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoZWwpXTtcbiAgICAgIGlmIChzd2lwZXIucGFyYW1zLnVuaXF1ZU5hdkVsZW1lbnRzICYmIHR5cGVvZiBlbCA9PT0gJ3N0cmluZycgJiYgcmVzICYmIHJlcy5sZW5ndGggPiAxICYmIHN3aXBlci5lbC5xdWVyeVNlbGVjdG9yQWxsKGVsKS5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgcmVzID0gc3dpcGVyLmVsLnF1ZXJ5U2VsZWN0b3IoZWwpO1xuICAgICAgfSBlbHNlIGlmIChyZXMgJiYgcmVzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICByZXMgPSByZXNbMF07XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChlbCAmJiAhcmVzKSByZXR1cm4gZWw7XG4gICAgLy8gaWYgKEFycmF5LmlzQXJyYXkocmVzKSAmJiByZXMubGVuZ3RoID09PSAxKSByZXMgPSByZXNbMF07XG4gICAgcmV0dXJuIHJlcztcbiAgfVxuICBmdW5jdGlvbiB0b2dnbGVFbChlbCwgZGlzYWJsZWQpIHtcbiAgICBjb25zdCBwYXJhbXMgPSBzd2lwZXIucGFyYW1zLm5hdmlnYXRpb247XG4gICAgZWwgPSBtYWtlRWxlbWVudHNBcnJheShlbCk7XG4gICAgZWwuZm9yRWFjaChzdWJFbCA9PiB7XG4gICAgICBpZiAoc3ViRWwpIHtcbiAgICAgICAgc3ViRWwuY2xhc3NMaXN0W2Rpc2FibGVkID8gJ2FkZCcgOiAncmVtb3ZlJ10oLi4ucGFyYW1zLmRpc2FibGVkQ2xhc3Muc3BsaXQoJyAnKSk7XG4gICAgICAgIGlmIChzdWJFbC50YWdOYW1lID09PSAnQlVUVE9OJykgc3ViRWwuZGlzYWJsZWQgPSBkaXNhYmxlZDtcbiAgICAgICAgaWYgKHN3aXBlci5wYXJhbXMud2F0Y2hPdmVyZmxvdyAmJiBzd2lwZXIuZW5hYmxlZCkge1xuICAgICAgICAgI
5196HN1YkVsLmNsYXNzTGlzdFtzd2lwZXIuaXNMb2NrZWQgPyAnYWRkJyA6ICdyZW1vdmUnXShwYXJhbXMubG9ja0NsYXNzKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICB9XG4gIGZ1bmN0aW9uIHVwZGF0ZSgpIHtcbiAgICAvLyBVcGRhdGUgTmF2aWdhdGlvbiBCdXR0b25zXG4gICAgY29uc3Qge1xuICAgICAgbmV4dEVsLFxuICAgICAgcHJldkVsXG4gICAgfSA9IHN3aXBlci5uYXZpZ2F0aW9uO1xuICAgIGlmIChzd2lwZXIucGFyYW1zLmxvb3ApIHtcbiAgICAgIHRvZ2dsZUVsKHByZXZFbCwgZmFsc2UpO1xuICAgICAgdG9nZ2xlRWwobmV4dEVsLCBmYWxzZSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRvZ2dsZUVsKHByZXZFbCwgc3dpcGVyLmlzQmVnaW5uaW5nICYmICFzd2lwZXIucGFyYW1zLnJld2luZCk7XG4gICAgdG9nZ2xlRWwobmV4dEVsLCBzd2lwZXIuaXNFbmQgJiYgIXN3aXBlci5wYXJhbXMucmV3aW5kKTtcbiAgfVxuICBmdW5jdGlvbiBvblByZXZDbGljayhlKSB7XG4gICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGlmIChzd2lwZXIuaXNCZWdpbm5pbmcgJiYgIXN3aXBlci5wYXJhbXMubG9vcCAmJiAhc3dpcGVyLnBhcmFtcy5yZXdpbmQpIHJldHVybjtcbiAgICBzd2lwZXIuc2xpZGVQcmV2KCk7XG4gICAgZW1pdCgnbmF2aWdhdGlvblByZXYnKTtcbiAgfVxuICBmdW5jdGlvbiBvbk5leHRDbGljayhlKSB7XG4gICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGlmIChzd2lwZXIuaXNFbmQgJiYgIXN3aXBlci5wYXJhbXMubG9vcCAmJiAhc3dpcGVyLnBhcmFtcy5yZXdpbmQpIHJldHVybjtcbiAgICBzd2lwZXIuc2xpZGVOZXh0KCk7XG4gICAgZW1pdCgnbmF2aWdhdGlvbk5leHQnKTtcbiAgfVxuICBmdW5jdGlvbiBpbml0KCkge1xuICAgIGNvbnN0IHBhcmFtcyA9IHN3aXBlci5wYXJhbXMubmF2aWdhdGlvbjtcbiAgICBzd2lwZXIucGFyYW1zLm5hdmlnYXRpb24gPSBjcmVhdGVFbGVtZW50SWZOb3REZWZpbmVkKHN3aXBlciwgc3dpcGVyLm9yaWdpbmFsUGFyYW1zLm5hdmlnYXRpb24sIHN3aXBlci5wYXJhbXMubmF2aWdhdGlvbiwge1xuICAgICAgbmV4dEVsOiAnc3dpcGVyLWJ1dHRvbi1uZXh0JyxcbiAgICAgIHByZXZFbDogJ3N3aXBlci1idXR0b24tcHJldidcbiAgICB9KTtcbiAgICBpZiAoIShwYXJhbXMubmV4dEVsIHx8IHBhcmFtcy5wcmV2RWwpKSByZXR1cm47XG4gICAgbGV0IG5leHRFbCA9IGdldEVsKHBhcmFtcy5uZXh0RWwpO1xuICAgIGxldCBwcmV2RWwgPSBnZXRFbChwYXJhbXMucHJldkVsKTtcbiAgICBPYmplY3QuYXNzaWduKHN3aXBlci5uYXZpZ2F0aW9uLCB7XG4gICAgICBuZXh0RWwsXG4gICAgICBwcmV2RWxcbiAgICB9KTtcbiAgICBuZXh0RWwgPSBtYWtlRWxlbWVudHNBcnJheShuZXh0RWwpO1xuICAgIHByZXZFbCA9IG1ha2VFbGVtZW50c0FycmF5KHByZXZFbCk7XG4gICAgY29uc3QgaW5pdEJ1dHRvbiA9IChlbCwgZGlyKSA9PiB7XG4gICAgICBpZiAoZWwpIHtcbiAgICAgICAgZWwuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBkaXIgPT09ICduZXh0JyA/IG9uTmV4dENsaWNrIDogb25QcmV2Q2xpY2spO1xuICAgICAgfVxuICAgICAgaWYgKCFzd2lwZXIuZW5hYmxlZCAmJiBlbCkge1xuICAgICAgICBlbC5jbGFzc0xpc3QuYWRkKC4uLnBhcmFtcy5sb2NrQ2xhc3Muc3BsaXQoJyAnKSk7XG4gICAgICB9XG4gICAgfTtcbiAgICBuZXh0RWwuZm9yRWFjaChlbCA9PiBpbml0QnV0dG9uKGVsLCAnbmV4dCcpKTtcbiAgICBwcmV2RWwuZm9yRWFjaChlbCA9PiBpbml0QnV0dG9uKGVsLCAncHJldicpKTtcbiAgfVxuICBmdW5jdGlvbiBkZXN0cm95KCkge1xuICAgIGxldCB7XG4gICAgICBuZXh0RWwsXG4gICAgICBwcmV2RWxcbiAgICB9ID0gc3dpcGVyLm5hdmlnYXRpb247XG4gICAgbmV4dEVsID0gbWFrZUVsZW1lbnRzQXJyYXkobmV4dEVsKTtcbiAgICBwcmV2RWwgPSBtYWtlRWxlbWVudHNBcnJheShwcmV2RWwpO1xuICAgIGNvbnN0IGRlc3Ryb3lCdXR0b24gPSAoZWwsIGRpcikgPT4ge1xuICAgICAgZWwucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xpY2snLCBkaXIgPT09ICduZXh0JyA/IG9uTmV4dENsaWNrIDogb25QcmV2Q2xpY2spO1xuICAgICAgZWwuY2xhc3NMaXN0LnJlbW92ZSguLi5zd2lwZXIucGFyYW1zLm5hdmlnYXRpb24uZGlzYWJsZWRDbGFzcy5zcGxpdCgnICcpKTtcbiAgICB9O1xuICAgIG5leHRFbC5mb3JFYWNoKGVsID0+IGRlc3Ryb3lCdXR0b24oZWwsICduZXh0JykpO1xuICAgIHByZXZFbC5mb3JFYWNoKGVsID0+IGRlc3Ryb3lCdXR0b24oZWwsICdwcmV2JykpO1xuICB9XG4gIG9uKCdpbml0JywgKCkgPT4ge1xuICAgIGlmIChzd2lwZXIucGFyYW1zLm5hdmlnYXRpb24uZW5hYmxlZCA9PT0gZmFsc2UpIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZVxuICAgICAgZGlzYWJsZSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpbml0KCk7XG4gICAgICB1cGRhdGUoKTtcbiAgICB9XG4gIH0pO1xuICBvbigndG9FZGdlIGZyb21FZGdlIGxvY2sgdW5sb2NrJywgKCkgPT4ge1xuICAgIHVwZGF0ZSgpO1xuICB9KTtcbiAgb24oJ2Rlc3Ryb3knLCAoKSA9PiB7XG4gICAgZGVzdHJveSgpO1xuICB9KTtcbiAgb24oJ2VuYWJsZSBkaXNhYmxlJywgKCkgPT4ge1xuICAgIGxldCB7XG4gICAgICBuZXh0RWwsXG4gICAgICBwcmV2RWxcbiAgICB9ID0gc3dpcGVyLm5hdmlnYXRpb247XG4gICAgbmV4dEVsID0gbWFrZUVsZW1lbnRzQXJyYXkobmV4dEVsKTtcbiAgICBwcmV2RWwgPSBtYWtlRWxlbWVudHNBcnJheShwcmV2RWwpO1xuICAgIGlmIChzd2lwZXIuZW5hYmxlZCkge1xuICAgICAgdXBkYXRlKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIFsuLi5uZXh0RWwsIC4uLnByZXZFbF0uZmlsdGVyKGVsID0+ICEhZWwpLmZvckVhY2goZWwgPT4gZWwuY2xhc3NMaXN0LmFkZChzd2lwZXIucGFyYW1zLm5hdmlnYXRpb24ubG9ja0NsYXNzKSk7XG4gIH0pO1xuICBvbignY2xpY2snLCAoX3MsIGUpID0+IHtcbiAgICBsZXQge1xuICAgICAgbmV4dEVsLFxuICAgICAgcHJldkVsXG4gICAgfSA9IHN3aXBlci5uYXZpZ2F0aW9uO1xuICAgIG5leHRFbCA9IG1ha2VFbGVtZW50c0FycmF5KG5leHRFbCk7XG4gICAgcHJldkVsID0gbWFrZUVsZW1lbnRzQXJyYXkocHJldkVsKTtcbiAgICBjb25zdCB0YXJnZXRFbCA9IGUudGFyZ2V0O1xuICAgIGlmIChzd2lwZXIucGFyYW1zLm5hdmlnYXRpb24uaGlkZU9uQ2xpY2sgJiYgIXByZXZFbC5pbmNsdWRlcyh0YXJnZXRFbCkgJiYgIW5leHRFbC5pbmNsdWRlcyh0YXJnZXRFbCkpIHtcbiAgICAgIGlmIChzd2lwZXIucGFnaW5hdGlvbiAmJiBzd2lwZXIucGFyYW1zLnBhZ2luYXRpb24gJiYgc3dpcGVyLnBhcmFtcy5wYWdpbmF0aW9uLm
5196NsaWNrYWJsZSAmJiAoc3dpcGVyLnBhZ2luYXRpb24uZWwgPT09IHRhcmdldEVsIHx8IHN3aXBlci5wYWdpbmF0aW9uLmVsLmNvbnRhaW5zKHRhcmdldEVsKSkpIHJldHVybjtcbiAgICAgIGxldCBpc0hpZGRlbjtcbiAgICAgIGlmIChuZXh0RWwubGVuZ3RoKSB7XG4gICAgICAgIGlzSGlkZGVuID0gbmV4dEVsWzBdLmNsYXNzTGlzdC5jb250YWlucyhzd2lwZXIucGFyYW1zLm5hdmlnYXRpb24uaGlkZGVuQ2xhc3MpO1xuICAgICAgfSBlbHNlIGlmIChwcmV2RWwubGVuZ3RoKSB7XG4gICAgICAgIGlzSGlkZGVuID0gcHJldkVsWzBdLmNsYXNzTGlzdC5jb250YWlucyhzd2lwZXIucGFyYW1zLm5hdmlnYXRpb24uaGlkZGVuQ2xhc3MpO1xuICAgICAgfVxuICAgICAgaWYgKGlzSGlkZGVuID09PSB0cnVlKSB7XG4gICAgICAgIGVtaXQoJ25hdmlnYXRpb25TaG93Jyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBlbWl0KCduYXZpZ2F0aW9uSGlkZScpO1xuICAgICAgfVxuICAgICAgWy4uLm5leHRFbCwgLi4ucHJldkVsXS5maWx0ZXIoZWwgPT4gISFlbCkuZm9yRWFjaChlbCA9PiBlbC5jbGFzc0xpc3QudG9nZ2xlKHN3aXBlci5wYXJhbXMubmF2aWdhdGlvbi5oaWRkZW5DbGFzcykpO1xuICAgIH1cbiAgfSk7XG4gIGNvbnN0IGVuYWJsZSA9ICgpID0+IHtcbiAgICBzd2lwZXIuZWwuY2xhc3NMaXN0LnJlbW92ZSguLi5zd2lwZXIucGFyYW1zLm5hdmlnYXRpb24ubmF2aWdhdGlvbkRpc2FibGVkQ2xhc3Muc3BsaXQoJyAnKSk7XG4gICAgaW5pdCgpO1xuICAgIHVwZGF0ZSgpO1xuICB9O1xuICBjb25zdCBkaXNhYmxlID0gKCkgPT4ge1xuICAgIHN3aXBlci5lbC5jbGFzc0xpc3QuYWRkKC4uLnN3aXBlci5wYXJhbXMubmF2aWdhdGlvbi5uYXZpZ2F0aW9uRGlzYWJsZWRDbGFzcy5zcGxpdCgnICcpKTtcbiAgICBkZXN0cm95KCk7XG4gIH07XG4gIE9iamVjdC5hc3NpZ24oc3dpcGVyLm5hdmlnYXRpb24sIHtcbiAgICBlbmFibGUsXG4gICAgZGlzYWJsZSxcbiAgICB1cGRhdGUsXG4gICAgaW5pdCxcbiAgICBkZXN0cm95XG4gIH0pO1xufVxuXG5leHBvcnQgeyBOYXZpZ2F0aW9uIGFzIGRlZmF1bHQgfTtcbiIsImZ1bmN0aW9uIGNsYXNzZXNUb1NlbGVjdG9yKGNsYXNzZXMpIHtcbiAgaWYgKGNsYXNzZXMgPT09IHZvaWQgMCkge1xuICAgIGNsYXNzZXMgPSAnJztcbiAgfVxuICByZXR1cm4gYC4ke2NsYXNzZXMudHJpbSgpLnJlcGxhY2UoLyhbXFwuOiErXFwvXSkvZywgJ1xcXFwkMScpIC8vIGVzbGludC1kaXNhYmxlLWxpbmVcbiAgLnJlcGxhY2UoLyAvZywgJy4nKX1gO1xufVxuXG5leHBvcnQgeyBjbGFzc2VzVG9TZWxlY3RvciBhcyBjIH07XG4iLCJpbXBvcnQgeyBjIGFzIGNsYXNzZXNUb1NlbGVjdG9yIH0gZnJvbSAnLi4vc2hhcmVkL2NsYXNzZXMtdG8tc2VsZWN0b3IubWpzJztcbmltcG9ydCB7IGMgYXMgY3JlYXRlRWxlbWVudElmTm90RGVmaW5lZCB9IGZyb20gJy4uL3NoYXJlZC9jcmVhdGUtZWxlbWVudC1pZi1ub3QtZGVmaW5lZC5tanMnO1xuaW1wb3J0IHsgbSBhcyBtYWtlRWxlbWVudHNBcnJheSwgZiBhcyBlbGVtZW50T3V0ZXJTaXplLCBoIGFzIGVsZW1lbnRJbmRleCwgYSBhcyBlbGVtZW50UGFyZW50cyB9IGZyb20gJy4uL3NoYXJlZC91dGlscy5tanMnO1xuXG5mdW5jdGlvbiBQYWdpbmF0aW9uKF9yZWYpIHtcbiAgbGV0IHtcbiAgICBzd2lwZXIsXG4gICAgZXh0ZW5kUGFyYW1zLFxuICAgIG9uLFxuICAgIGVtaXRcbiAgfSA9IF9yZWY7XG4gIGNvbnN0IHBmeCA9ICdzd2lwZXItcGFnaW5hdGlvbic7XG4gIGV4dGVuZFBhcmFtcyh7XG4gICAgcGFnaW5hdGlvbjoge1xuICAgICAgZWw6IG51bGwsXG4gICAgICBidWxsZXRFbGVtZW50OiAnc3BhbicsXG4gICAgICBjbGlja2FibGU6IGZhbHNlLFxuICAgICAgaGlkZU9uQ2xpY2s6IGZhbHNlLFxuICAgICAgcmVuZGVyQnVsbGV0OiBudWxsLFxuICAgICAgcmVuZGVyUHJvZ3Jlc3NiYXI6IG51bGwsXG4gICAgICByZW5kZXJGcmFjdGlvbjogbnVsbCxcbiAgICAgIHJlbmRlckN1c3RvbTogbnVsbCxcbiAgICAgIHByb2dyZXNzYmFyT3Bwb3NpdGU6IGZhbHNlLFxuICAgICAgdHlwZTogJ2J1bGxldHMnLFxuICAgICAgLy8gJ2J1bGxldHMnIG9yICdwcm9ncmVzc2Jhcicgb3IgJ2ZyYWN0aW9uJyBvciAnY3VzdG9tJ1xuICAgICAgZHluYW1pY0J1bGxldHM6IGZhbHNlLFxuICAgICAgZHluYW1pY01haW5CdWxsZXRzOiAxLFxuICAgICAgZm9ybWF0RnJhY3Rpb25DdXJyZW50OiBudW1iZXIgPT4gbnVtYmVyLFxuICAgICAgZm9ybWF0RnJhY3Rpb25Ub3RhbDogbnVtYmVyID0+IG51bWJlcixcbiAgICAgIGJ1bGxldENsYXNzOiBgJHtwZnh9LWJ1bGxldGAsXG4gICAgICBidWxsZXRBY3RpdmVDbGFzczogYCR7cGZ4fS1idWxsZXQtYWN0aXZlYCxcbiAgICAgIG1vZGlmaWVyQ2xhc3M6IGAke3BmeH0tYCxcbiAgICAgIGN1cnJlbnRDbGFzczogYCR7cGZ4fS1jdXJyZW50YCxcbiAgICAgIHRvdGFsQ2xhc3M6IGAke3BmeH0tdG90YWxgLFxuICAgICAgaGlkZGVuQ2xhc3M6IGAke3BmeH0taGlkZGVuYCxcbiAgICAgIHByb2dyZXNzYmFyRmlsbENsYXNzOiBgJHtwZnh9LXByb2dyZXNzYmFyLWZpbGxgLFxuICAgICAgcHJvZ3Jlc3NiYXJPcHBvc2l0ZUNsYXNzOiBgJHtwZnh9LXByb2dyZXNzYmFyLW9wcG9zaXRlYCxcbiAgICAgIGNsaWNrYWJsZUNsYXNzOiBgJHtwZnh9LWNsaWNrYWJsZWAsXG4gICAgICBsb2NrQ2xhc3M6IGAke3BmeH0tbG9ja2AsXG4gICAgICBob3Jpem9udGFsQ2xhc3M6IGAke3BmeH0taG9yaXpvbnRhbGAsXG4gICAgICB2ZXJ0aWNhbENsYXNzOiBgJHtwZnh9LXZlcnRpY2FsYCxcbiAgICAgIHBhZ2luYXRpb25EaXNhYmxlZENsYXNzOiBgJHtwZnh9LWRpc2FibGVkYFxuICAgIH1cbiAgfSk7XG4gIHN3aXBlci5wYWdpbmF0aW9uID0ge1xuICAgIGVsOiBudWxsLFxuICAgIGJ1bGxldHM6IFtdXG4gIH07XG4gIGxldCBidWxsZXRTaXplO1xuICBsZXQgZHluYW1pY0J1bGxldEluZGV4ID0gMDtcbiAgZnVuY3Rpb24gaXNQYWdpbmF0aW9uRGlzYWJsZWQoKSB7XG4gICAgcmV0dXJuICFzd2lwZXIucGFyYW1zLnBhZ2luYXRpb24uZWwgfHwgIXN3aXBlci5wYWdpbmF0aW9uLmVsIHx8IEFycmF5LmlzQXJyYXkoc3dpcGVyLnBhZ2luYXRpb24uZWwpICYmIHN3aXBlci5wYWdpbmF0aW9uLmVsLmxlbmd0aCA9PT0gMDtcbiAgfVxuICBmdW5jdGlvbiBzZXRTaWRlQnVsbGV0cyhidWxsZXRFbCwgcG9zaXRpb24pIHtcbiAgICBjb25zdCB7XG4gICAgICBidWxsZXRBY3RpdmVDbGFzc1xuICAgIH0gPSBzd2lwZXIucGFyYW1zLnBhZ2luYXRpb247XG4gICAgaWYgKCFidWxsZXRFbCkgcmV0dXJuO1xuICAgIGJ1bGxldEVsID0gYnVsbGV0RWxbYCR7cG9zaXRpb24gPT09ICdwcmV2JyA/ICdwcmV2aW91cycgOiAnbmV4dCd9RWxlbWVudFNpYmxpbmdgXTtcbiAgICBpZiAoYnVsbGV0RWwpIHtcbiAgICAgIGJ1bGxldEVsLmNsYXNzTGlzdC5hZGQoYCR7Y
5196nVsbGV0QWN0aXZlQ2xhc3N9LSR7cG9zaXRpb259YCk7XG4gICAgICBidWxsZXRFbCA9IGJ1bGxldEVsW2Ake3Bvc2l0aW9uID09PSAncHJldicgPyAncHJldmlvdXMnIDogJ25leHQnfUVsZW1lbnRTaWJsaW5nYF07XG4gICAgICBpZiAoYnVsbGV0RWwpIHtcbiAgICAgICAgYnVsbGV0RWwuY2xhc3NMaXN0LmFkZChgJHtidWxsZXRBY3RpdmVDbGFzc30tJHtwb3NpdGlvbn0tJHtwb3NpdGlvbn1gKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgZnVuY3Rpb24gb25CdWxsZXRDbGljayhlKSB7XG4gICAgY29uc3QgYnVsbGV0RWwgPSBlLnRhcmdldC5jbG9zZXN0KGNsYXNzZXNUb1NlbGVjdG9yKHN3aXBlci5wYXJhbXMucGFnaW5hdGlvbi5idWxsZXRDbGFzcykpO1xuICAgIGlmICghYnVsbGV0RWwpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGNvbnN0IGluZGV4ID0gZWxlbWVudEluZGV4KGJ1bGxldEVsKSAqIHN3aXBlci5wYXJhbXMuc2xpZGVzUGVyR3JvdXA7XG4gICAgaWYgKHN3aXBlci5wYXJhbXMubG9vcCkge1xuICAgICAgaWYgKHN3aXBlci5yZWFsSW5kZXggPT09IGluZGV4KSByZXR1cm47XG4gICAgICBzd2lwZXIuc2xpZGVUb0xvb3AoaW5kZXgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzd2lwZXIuc2xpZGVUbyhpbmRleCk7XG4gICAgfVxuICB9XG4gIGZ1bmN0aW9uIHVwZGF0ZSgpIHtcbiAgICAvLyBSZW5kZXIgfHwgVXBkYXRlIFBhZ2luYXRpb24gYnVsbGV0cy9pdGVtc1xuICAgIGNvbnN0IHJ0bCA9IHN3aXBlci5ydGw7XG4gICAgY29uc3QgcGFyYW1zID0gc3dpcGVyLnBhcmFtcy5wYWdpbmF0aW9uO1xuICAgIGlmIChpc1BhZ2luYXRpb25EaXNhYmxlZCgpKSByZXR1cm47XG4gICAgbGV0IGVsID0gc3dpcGVyLnBhZ2luYXRpb24uZWw7XG4gICAgZWwgPSBtYWtlRWxlbWVudHNBcnJheShlbCk7XG4gICAgLy8gQ3VycmVudC9Ub3RhbFxuICAgIGxldCBjdXJyZW50O1xuICAgIGxldCBwcmV2aW91c0luZGV4O1xuICAgIGNvbnN0IHNsaWRlc0xlbmd0aCA9IHN3aXBlci52aXJ0dWFsICYmIHN3aXBlci5wYXJhbXMudmlydHVhbC5lbmFibGVkID8gc3dpcGVyLnZpcnR1YWwuc2xpZGVzLmxlbmd0aCA6IHN3aXBlci5zbGlkZXMubGVuZ3RoO1xuICAgIGNvbnN0IHRvdGFsID0gc3dpcGVyLnBhcmFtcy5sb29wID8gTWF0aC5jZWlsKHNsaWRlc0xlbmd0aCAvIHN3aXBlci5wYXJhbXMuc2xpZGVzUGVyR3JvdXApIDogc3dpcGVyLnNuYXBHcmlkLmxlbmd0aDtcbiAgICBpZiAoc3dpcGVyLnBhcmFtcy5sb29wKSB7XG4gICAgICBwcmV2aW91c0luZGV4ID0gc3dpcGVyLnByZXZpb3VzUmVhbEluZGV4IHx8IDA7XG4gICAgICBjdXJyZW50ID0gc3dpcGVyLnBhcmFtcy5zbGlkZXNQZXJHcm91cCA+IDEgPyBNYXRoLmZsb29yKHN3aXBlci5yZWFsSW5kZXggLyBzd2lwZXIucGFyYW1zLnNsaWRlc1Blckdyb3VwKSA6IHN3aXBlci5yZWFsSW5kZXg7XG4gICAgfSBlbHNlIGlmICh0eXBlb2Ygc3dpcGVyLnNuYXBJbmRleCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIGN1cnJlbnQgPSBzd2lwZXIuc25hcEluZGV4O1xuICAgICAgcHJldmlvdXNJbmRleCA9IHN3aXBlci5wcmV2aW91c1NuYXBJbmRleDtcbiAgICB9IGVsc2Uge1xuICAgICAgcHJldmlvdXNJbmRleCA9IHN3aXBlci5wcmV2aW91c0luZGV4IHx8IDA7XG4gICAgICBjdXJyZW50ID0gc3dpcGVyLmFjdGl2ZUluZGV4IHx8IDA7XG4gICAgfVxuICAgIC8vIFR5cGVzXG4gICAgaWYgKHBhcmFtcy50eXBlID09PSAnYnVsbGV0cycgJiYgc3dpcGVyLnBhZ2luYXRpb24uYnVsbGV0cyAmJiBzd2lwZXIucGFnaW5hdGlvbi5idWxsZXRzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IGJ1bGxldHMgPSBzd2lwZXIucGFnaW5hdGlvbi5idWxsZXRzO1xuICAgICAgbGV0IGZpcnN0SW5kZXg7XG4gICAgICBsZXQgbGFzdEluZGV4O1xuICAgICAgbGV0IG1pZEluZGV4O1xuICAgICAgaWYgKHBhcmFtcy5keW5hbWljQnVsbGV0cykge1xuICAgICAgICBidWxsZXRTaXplID0gZWxlbWVudE91dGVyU2l6ZShidWxsZXRzWzBdLCBzd2lwZXIuaXNIb3Jpem9udGFsKCkgPyAnd2lkdGgnIDogJ2hlaWdodCcsIHRydWUpO1xuICAgICAgICBlbC5mb3JFYWNoKHN1YkVsID0+IHtcbiAgICAgICAgICBzdWJFbC5zdHlsZVtzd2lwZXIuaXNIb3Jpem9udGFsKCkgPyAnd2lkdGgnIDogJ2hlaWdodCddID0gYCR7YnVsbGV0U2l6ZSAqIChwYXJhbXMuZHluYW1pY01haW5CdWxsZXRzICsgNCl9cHhgO1xuICAgICAgICB9KTtcbiAgICAgICAgaWYgKHBhcmFtcy5keW5hbWljTWFpbkJ1bGxldHMgPiAxICYmIHByZXZpb3VzSW5kZXggIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGR5bmFtaWNCdWxsZXRJbmRleCArPSBjdXJyZW50IC0gKHByZXZpb3VzSW5kZXggfHwgMCk7XG4gICAgICAgICAgaWYgKGR5bmFtaWNCdWxsZXRJbmRleCA+IHBhcmFtcy5keW5hbWljTWFpbkJ1bGxldHMgLSAxKSB7XG4gICAgICAgICAgICBkeW5hbWljQnVsbGV0SW5kZXggPSBwYXJhbXMuZHluYW1pY01haW5CdWxsZXRzIC0gMTtcbiAgICAgICAgICB9IGVsc2UgaWYgKGR5bmFtaWNCdWxsZXRJbmRleCA8IDApIHtcbiAgICAgICAgICAgIGR5bmFtaWNCdWxsZXRJbmRleCA9IDA7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGZpcnN0SW5kZXggPSBNYXRoLm1heChjdXJyZW50IC0gZHluYW1pY0J1bGxldEluZGV4LCAwKTtcbiAgICAgICAgbGFzdEluZGV4ID0gZmlyc3RJbmRleCArIChNYXRoLm1pbihidWxsZXRzLmxlbmd0aCwgcGFyYW1zLmR5bmFtaWNNYWluQnVsbGV0cykgLSAxKTtcbiAgICAgICAgbWlkSW5kZXggPSAobGFzdEluZGV4ICsgZmlyc3RJbmRleCkgLyAyO1xuICAgICAgfVxuICAgICAgYnVsbGV0cy5mb3JFYWNoKGJ1bGxldEVsID0+IHtcbiAgICAgICAgY29uc3QgY2xhc3Nlc1RvUmVtb3ZlID0gWy4uLlsnJywgJy1uZXh0JywgJy1uZXh0LW5leHQnLCAnLXByZXYnLCAnLXByZXYtcHJldicsICctbWFpbiddLm1hcChzdWZmaXggPT4gYCR7cGFyYW1zLmJ1bGxldEFjdGl2ZUNsYXNzfSR7c3VmZml4fWApXS5tYXAocyA9PiB0eXBlb2YgcyA9PT0gJ3N0cmluZycgJiYgcy5pbmNsdWRlcygnICcpID8gcy5zcGxpdCgnICcpIDogcykuZmxh
5196dCgpO1xuICAgICAgICBidWxsZXRFbC5jbGFzc0xpc3QucmVtb3ZlKC4uLmNsYXNzZXNUb1JlbW92ZSk7XG4gICAgICB9KTtcbiAgICAgIGlmIChlbC5sZW5ndGggPiAxKSB7XG4gICAgICAgIGJ1bGxldHMuZm9yRWFjaChidWxsZXQgPT4ge1xuICAgICAgICAgIGNvbnN0IGJ1bGxldEluZGV4ID0gZWxlbWVudEluZGV4KGJ1bGxldCk7XG4gICAgICAgICAgaWYgKGJ1bGxldEluZGV4ID09PSBjdXJyZW50KSB7XG4gICAgICAgICAgICBidWxsZXQuY2xhc3NMaXN0LmFkZCguLi5wYXJhbXMuYnVsbGV0QWN0aXZlQ2xhc3Muc3BsaXQoJyAnKSk7XG4gICAgICAgICAgfSBlbHNlIGlmIChzd2lwZXIuaXNFbGVtZW50KSB7XG4gICAgICAgICAgICBidWxsZXQuc2V0QXR0cmlidXRlKCdwYXJ0JywgJ2J1bGxldCcpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAocGFyYW1zLmR5bmFtaWNCdWxsZXRzKSB7XG4gICAgICAgICAgICBpZiAoYnVsbGV0SW5kZXggPj0gZmlyc3RJbmRleCAmJiBidWxsZXRJbmRleCA8PSBsYXN0SW5kZXgpIHtcbiAgICAgICAgICAgICAgYnVsbGV0LmNsYXNzTGlzdC5hZGQoLi4uYCR7cGFyYW1zLmJ1bGxldEFjdGl2ZUNsYXNzfS1tYWluYC5zcGxpdCgnICcpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChidWxsZXRJbmRleCA9PT0gZmlyc3RJbmRleCkge1xuICAgICAgICAgICAgICBzZXRTaWRlQnVsbGV0cyhidWxsZXQsICdwcmV2Jyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoYnVsbGV0SW5kZXggPT09IGxhc3RJbmRleCkge1xuICAgICAgICAgICAgICBzZXRTaWRlQnVsbGV0cyhidWxsZXQsICduZXh0Jyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IGJ1bGxldCA9IGJ1bGxldHNbY3VycmVudF07XG4gICAgICAgIGlmIChidWxsZXQpIHtcbiAgICAgICAgICBidWxsZXQuY2xhc3NMaXN0LmFkZCguLi5wYXJhbXMuYnVsbGV0QWN0aXZlQ2xhc3Muc3BsaXQoJyAnKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHN3aXBlci5pc0VsZW1lbnQpIHtcbiAgICAgICAgICBidWxsZXRzLmZvckVhY2goKGJ1bGxldEVsLCBidWxsZXRJbmRleCkgPT4ge1xuICAgICAgICAgICAgYnVsbGV0RWwuc2V0QXR0cmlidXRlKCdwYXJ0JywgYnVsbGV0SW5kZXggPT09IGN1cnJlbnQgPyAnYnVsbGV0LWFjdGl2ZScgOiAnYnVsbGV0Jyk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhcmFtcy5keW5hbWljQnVsbGV0cykge1xuICAgICAgICAgIGNvbnN0IGZpcnN0RGlzcGxheWVkQnVsbGV0ID0gYnVsbGV0c1tmaXJzdEluZGV4XTtcbiAgICAgICAgICBjb25zdCBsYXN0RGlzcGxheWVkQnVsbGV0ID0gYnVsbGV0c1tsYXN0SW5kZXhdO1xuICAgICAgICAgIGZvciAobGV0IGkgPSBmaXJzdEluZGV4OyBpIDw9IGxhc3RJbmRleDsgaSArPSAxKSB7XG4gICAgICAgICAgICBpZiAoYnVsbGV0c1tpXSkge1xuICAgICAgICAgICAgICBidWxsZXRzW2ldLmNsYXNzTGlzdC5hZGQoLi4uYCR7cGFyYW1zLmJ1bGxldEFjdGl2ZUNsYXNzfS1tYWluYC5zcGxpdCgnICcpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgc2V0U2lkZUJ1bGxldHMoZmlyc3REaXNwbGF5ZWRCdWxsZXQsICdwcmV2Jyk7XG4gICAgICAgICAgc2V0U2lkZUJ1bGxldHMobGFzdERpc3BsYXllZEJ1bGxldCwgJ25leHQnKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHBhcmFtcy5keW5hbWljQnVsbGV0cykge1xuICAgICAgICBjb25zdCBkeW5hbWljQnVsbGV0c0xlbmd0aCA9IE1hdGgubWluKGJ1bGxldHMubGVuZ3RoLCBwYXJhbXMuZHluYW1pY01haW5CdWxsZXRzICsgNCk7XG4gICAgICAgIGNvbnN0IGJ1bGxldHNPZmZzZXQgPSAoYnVsbGV0U2l6ZSAqIGR5bmFtaWNCdWxsZXRzTGVuZ3RoIC0gYnVsbGV0U2l6ZSkgLyAyIC0gbWlkSW5kZXggKiBidWxsZXRTaXplO1xuICAgICAgICBjb25zdCBvZmZzZXRQcm9wID0gcnRsID8gJ3JpZ2h0JyA6ICdsZWZ0JztcbiAgICAgICAgYnVsbGV0cy5mb3JFYWNoKGJ1bGxldCA9PiB7XG4gICAgICAgICAgYnVsbGV0LnN0eWxlW3N3aXBlci5pc0hvcml6b250YWwoKSA/IG9mZnNldFByb3AgOiAndG9wJ10gPSBgJHtidWxsZXRzT2Zmc2V0fXB4YDtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICAgIGVsLmZvckVhY2goKHN1YkVsLCBzdWJFbEluZGV4KSA9PiB7XG4gICAgICBpZiAocGFyYW1zLnR5cGUgPT09ICdmcmFjdGlvbicpIHtcbiAgICAgICAgc3ViRWwucXVlcnlTZWxlY3RvckFsbChjbGFzc2VzVG9TZWxlY3RvcihwYXJhbXMuY3VycmVudENsYXNzKSkuZm9yRWFjaChmcmFjdGlvbkVsID0+IHtcbiAgICAgICAgICBmcmFjdGlvbkVsLnRleHRDb250ZW50ID0gcGFyYW1zLmZvcm1hdEZyYWN0aW9uQ3VycmVudChjdXJyZW50ICsgMSk7XG4gICAgICAgIH0pO1xuICAgICAgICBzdWJFbC5xdWVyeVNlbGVjdG9yQWxsKGNsYXNzZXNUb1NlbGVjdG9yKHBhcmFtcy50b3RhbENsYXNzKSkuZm9yRWFjaCh0b3RhbEVsID0+IHtcbiAgICAgICAgICB0b3RhbEVsLnRleHRDb250ZW50ID0gcGFyYW1zLmZvcm1hdEZyYWN0aW9uVG90YWwodG90YWwpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGlmIChwYXJhbXMudHlwZSA9PT0gJ3Byb2dyZXNzYmFyJykge1xuICAgICAgICBsZXQgcHJvZ3Jlc3NiYXJEaXJlY3Rpb247XG4gICAgICAgIGlmIChwYXJhbXMucHJvZ3Jlc3NiYXJPcHBvc2l0ZSkge1xuICAgICAgICAgIHByb2dyZXNzYmFyRGlyZWN0aW9uID0gc3dpcGVyLmlzSG9yaXpvbnRhbCgpID8gJ3ZlcnRpY2FsJyA6ICdob3Jpem9udGFsJztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwcm9ncmVzc2JhckRpcmVjdGlvbiA9IHN3aXBlci5pc0hvcml6b250YWwoKSA/ICdob3Jpem9udGFsJyA6ICd2ZXJ0aWNhbCc7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc2NhbGUgPSAoY3VycmVudCArIDEpIC8gdG90YWw7XG4gICAgICAgIGxldCBzY2FsZVggPSAxO1xuICAgICAgICBsZXQgc2NhbGVZID0gMTtcbiAgICAgICAgaWYgKHByb2dyZXNzYmFyRGlyZWN0aW9uID09PSAnaG9yaXpvbn
5196RhbCcpIHtcbiAgICAgICAgICBzY2FsZVggPSBzY2FsZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzY2FsZVkgPSBzY2FsZTtcbiAgICAgICAgfVxuICAgICAgICBzdWJFbC5xdWVyeVNlbGVjdG9yQWxsKGNsYXNzZXNUb1NlbGVjdG9yKHBhcmFtcy5wcm9ncmVzc2JhckZpbGxDbGFzcykpLmZvckVhY2gocHJvZ3Jlc3NFbCA9PiB7XG4gICAgICAgICAgcHJvZ3Jlc3NFbC5zdHlsZS50cmFuc2Zvcm0gPSBgdHJhbnNsYXRlM2QoMCwwLDApIHNjYWxlWCgke3NjYWxlWH0pIHNjYWxlWSgke3NjYWxlWX0pYDtcbiAgICAgICAgICBwcm9ncmVzc0VsLnN0eWxlLnRyYW5zaXRpb25EdXJhdGlvbiA9IGAke3N3aXBlci5wYXJhbXMuc3BlZWR9bXNgO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGlmIChwYXJhbXMudHlwZSA9PT0gJ2N1c3RvbScgJiYgcGFyYW1zLnJlbmRlckN1c3RvbSkge1xuICAgICAgICBzdWJFbC5pbm5lckhUTUwgPSBwYXJhbXMucmVuZGVyQ3VzdG9tKHN3aXBlciwgY3VycmVudCArIDEsIHRvdGFsKTtcbiAgICAgICAgaWYgKHN1YkVsSW5kZXggPT09IDApIGVtaXQoJ3BhZ2luYXRpb25SZW5kZXInLCBzdWJFbCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoc3ViRWxJbmRleCA9PT0gMCkgZW1pdCgncGFnaW5hdGlvblJlbmRlcicsIHN1YkVsKTtcbiAgICAgICAgZW1pdCgncGFnaW5hdGlvblVwZGF0ZScsIHN1YkVsKTtcbiAgICAgIH1cbiAgICAgIGlmIChzd2lwZXIucGFyYW1zLndhdGNoT3ZlcmZsb3cgJiYgc3dpcGVyLmVuYWJsZWQpIHtcbiAgICAgICAgc3ViRWwuY2xhc3NMaXN0W3N3aXBlci5pc0xvY2tlZCA/ICdhZGQnIDogJ3JlbW92ZSddKHBhcmFtcy5sb2NrQ2xhc3MpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG4gIGZ1bmN0aW9uIHJlbmRlcigpIHtcbiAgICAvLyBSZW5kZXIgQ29udGFpbmVyXG4gICAgY29uc3QgcGFyYW1zID0gc3dpcGVyLnBhcmFtcy5wYWdpbmF0aW9uO1xuICAgIGlmIChpc1BhZ2luYXRpb25EaXNhYmxlZCgpKSByZXR1cm47XG4gICAgY29uc3Qgc2xpZGVzTGVuZ3RoID0gc3dpcGVyLnZpcnR1YWwgJiYgc3dpcGVyLnBhcmFtcy52aXJ0dWFsLmVuYWJsZWQgPyBzd2lwZXIudmlydHVhbC5zbGlkZXMubGVuZ3RoIDogc3dpcGVyLmdyaWQgJiYgc3dpcGVyLnBhcmFtcy5ncmlkLnJvd3MgPiAxID8gc3dpcGVyLnNsaWRlcy5sZW5ndGggLyBNYXRoLmNlaWwoc3dpcGVyLnBhcmFtcy5ncmlkLnJvd3MpIDogc3dpcGVyLnNsaWRlcy5sZW5ndGg7XG4gICAgbGV0IGVsID0gc3dpcGVyLnBhZ2luYXRpb24uZWw7XG4gICAgZWwgPSBtYWtlRWxlbWVudHNBcnJheShlbCk7XG4gICAgbGV0IHBhZ2luYXRpb25IVE1MID0gJyc7XG4gICAgaWYgKHBhcmFtcy50eXBlID09PSAnYnVsbGV0cycpIHtcbiAgICAgIGxldCBudW1iZXJPZkJ1bGxldHMgPSBzd2lwZXIucGFyYW1zLmxvb3AgPyBNYXRoLmNlaWwoc2xpZGVzTGVuZ3RoIC8gc3dpcGVyLnBhcmFtcy5zbGlkZXNQZXJHcm91cCkgOiBzd2lwZXIuc25hcEdyaWQubGVuZ3RoO1xuICAgICAgaWYgKHN3aXBlci5wYXJhbXMuZnJlZU1vZGUgJiYgc3dpcGVyLnBhcmFtcy5mcmVlTW9kZS5lbmFibGVkICYmIG51bWJlck9mQnVsbGV0cyA+IHNsaWRlc0xlbmd0aCkge1xuICAgICAgICBudW1iZXJPZkJ1bGxldHMgPSBzbGlkZXNMZW5ndGg7XG4gICAgICB9XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG51bWJlck9mQnVsbGV0czsgaSArPSAxKSB7XG4gICAgICAgIGlmIChwYXJhbXMucmVuZGVyQnVsbGV0KSB7XG4gICAgICAgICAgcGFnaW5hdGlvbkhUTUwgKz0gcGFyYW1zLnJlbmRlckJ1bGxldC5jYWxsKHN3aXBlciwgaSwgcGFyYW1zLmJ1bGxldENsYXNzKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBwcmV0dGllci1pZ25vcmVcbiAgICAgICAgICBwYWdpbmF0aW9uSFRNTCArPSBgPCR7cGFyYW1zLmJ1bGxldEVsZW1lbnR9ICR7c3dpcGVyLmlzRWxlbWVudCA/ICdwYXJ0PVwiYnVsbGV0XCInIDogJyd9IGNsYXNzPVwiJHtwYXJhbXMuYnVsbGV0Q2xhc3N9XCI+PC8ke3BhcmFtcy5idWxsZXRFbGVtZW50fT5gO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChwYXJhbXMudHlwZSA9PT0gJ2ZyYWN0aW9uJykge1xuICAgICAgaWYgKHBhcmFtcy5yZW5kZXJGcmFjdGlvbikge1xuICAgICAgICBwYWdpbmF0aW9uSFRNTCA9IHBhcmFtcy5yZW5kZXJGcmFjdGlvbi5jYWxsKHN3aXBlciwgcGFyYW1zLmN1cnJlbnRDbGFzcywgcGFyYW1zLnRvdGFsQ2xhc3MpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcGFnaW5hdGlvbkhUTUwgPSBgPHNwYW4gY2xhc3M9XCIke3BhcmFtcy5jdXJyZW50Q2xhc3N9XCI+PC9zcGFuPmAgKyAnIC8gJyArIGA8c3BhbiBjbGFzcz1cIiR7cGFyYW1zLnRvdGFsQ2xhc3N9XCI+PC9zcGFuPmA7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChwYXJhbXMudHlwZSA9PT0gJ3Byb2dyZXNzYmFyJykge1xuICAgICAgaWYgKHBhcmFtcy5yZW5kZXJQcm9ncmVzc2Jhcikge1xuICAgICAgICBwYWdpbmF0aW9uSFRNTCA9IHBhcmFtcy5yZW5kZXJQcm9ncmVzc2Jhci5jYWxsKHN3aXBlciwgcGFyYW1zLnByb2dyZXNzYmFyRmlsbENsYXNzKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHBhZ2luYXRpb25IVE1MID0gYDxzcGFuIGNsYXNzPVwiJHtwYXJhbXMucHJvZ3Jlc3NiYXJGaWxsQ2xhc3N9XCI+PC9zcGFuPmA7XG4gICAgICB9XG4gICAgfVxuICAgIHN3aXBlci5wYWdpbmF0aW9uLmJ1bGxldHMgPSBbXTtcbiAgICBlbC5mb3JFYWNoKHN1YkVsID0+IHtcbiAgICAgIGlmIChwYXJhbXMudHlwZSAhPT0gJ2N1c3RvbScpIHtcbiAgICAgICAgc3ViRWwuaW5uZXJIVE1MID0gcGFnaW5hdGlvbkhUTUwgfHwgJyc7XG4gICAgICB9XG4gICAgICBpZiAocGFyYW1zLnR5cGUgPT09ICdidWxsZXRzJykge1xuICAgICAgICBzd2lwZXIucGFnaW5hdGlvbi5idWxsZXRzLnB1c2goLi4uc3ViRWwucXVlcnlTZWxlY3RvckFsbChjbGFzc2VzVG9TZWxlY3RvcihwYXJhbXMuYnVsbGV0Q2xhc3MpKSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgaWYgKHBhcmFtcy50eXBlICE9PSAnY3VzdG9tJykge1xuICAgICAgZW1pdCgncGFnaW5hdGlvblJlbmRlcicsIGVsWzBdKTtcbiAgICB9XG4gI
5196H1cbiAgZnVuY3Rpb24gaW5pdCgpIHtcbiAgICBzd2lwZXIucGFyYW1zLnBhZ2luYXRpb24gPSBjcmVhdGVFbGVtZW50SWZOb3REZWZpbmVkKHN3aXBlciwgc3dpcGVyLm9yaWdpbmFsUGFyYW1zLnBhZ2luYXRpb24sIHN3aXBlci5wYXJhbXMucGFnaW5hdGlvbiwge1xuICAgICAgZWw6ICdzd2lwZXItcGFnaW5hdGlvbidcbiAgICB9KTtcbiAgICBjb25zdCBwYXJhbXMgPSBzd2lwZXIucGFyYW1zLnBhZ2luYXRpb247XG4gICAgaWYgKCFwYXJhbXMuZWwpIHJldHVybjtcbiAgICBsZXQgZWw7XG4gICAgaWYgKHR5cGVvZiBwYXJhbXMuZWwgPT09ICdzdHJpbmcnICYmIHN3aXBlci5pc0VsZW1lbnQpIHtcbiAgICAgIGVsID0gc3dpcGVyLmVsLnF1ZXJ5U2VsZWN0b3IocGFyYW1zLmVsKTtcbiAgICB9XG4gICAgaWYgKCFlbCAmJiB0eXBlb2YgcGFyYW1zLmVsID09PSAnc3RyaW5nJykge1xuICAgICAgZWwgPSBbLi4uZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChwYXJhbXMuZWwpXTtcbiAgICB9XG4gICAgaWYgKCFlbCkge1xuICAgICAgZWwgPSBwYXJhbXMuZWw7XG4gICAgfVxuICAgIGlmICghZWwgfHwgZWwubGVuZ3RoID09PSAwKSByZXR1cm47XG4gICAgaWYgKHN3aXBlci5wYXJhbXMudW5pcXVlTmF2RWxlbWVudHMgJiYgdHlwZW9mIHBhcmFtcy5lbCA9PT0gJ3N0cmluZycgJiYgQXJyYXkuaXNBcnJheShlbCkgJiYgZWwubGVuZ3RoID4gMSkge1xuICAgICAgZWwgPSBbLi4uc3dpcGVyLmVsLnF1ZXJ5U2VsZWN0b3JBbGwocGFyYW1zLmVsKV07XG4gICAgICAvLyBjaGVjayBpZiBpdCBiZWxvbmdzIHRvIGFub3RoZXIgbmVzdGVkIFN3aXBlclxuICAgICAgaWYgKGVsLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgZWwgPSBlbC5maWx0ZXIoc3ViRWwgPT4ge1xuICAgICAgICAgIGlmIChlbGVtZW50UGFyZW50cyhzdWJFbCwgJy5zd2lwZXInKVswXSAhPT0gc3dpcGVyLmVsKSByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH0pWzBdO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoQXJyYXkuaXNBcnJheShlbCkgJiYgZWwubGVuZ3RoID09PSAxKSBlbCA9IGVsWzBdO1xuICAgIE9iamVjdC5hc3NpZ24oc3dpcGVyLnBhZ2luYXRpb24sIHtcbiAgICAgIGVsXG4gICAgfSk7XG4gICAgZWwgPSBtYWtlRWxlbWVudHNBcnJheShlbCk7XG4gICAgZWwuZm9yRWFjaChzdWJFbCA9PiB7XG4gICAgICBpZiAocGFyYW1zLnR5cGUgPT09ICdidWxsZXRzJyAmJiBwYXJhbXMuY2xpY2thYmxlKSB7XG4gICAgICAgIHN1YkVsLmNsYXNzTGlzdC5hZGQoLi4uKHBhcmFtcy5jbGlja2FibGVDbGFzcyB8fCAnJykuc3BsaXQoJyAnKSk7XG4gICAgICB9XG4gICAgICBzdWJFbC5jbGFzc0xpc3QuYWRkKHBhcmFtcy5tb2RpZmllckNsYXNzICsgcGFyYW1zLnR5cGUpO1xuICAgICAgc3ViRWwuY2xhc3NMaXN0LmFkZChzd2lwZXIuaXNIb3Jpem9udGFsKCkgPyBwYXJhbXMuaG9yaXpvbn
5196RhbENsYXNzIDogcGFyYW1zLnZlcnRpY2FsQ2xhc3MpO1xuICAgICAgaWYgKHBhcmFtcy50eXBlID09PSAnYnVsbGV0cycgJiYgcGFyYW1zLmR5bmFtaWNCdWxsZXRzKSB7XG4gICAgICAgIHN1YkVsLmNsYXNzTGlzdC5hZGQoYCR7cGFyYW1zLm1vZGlmaWVyQ2xhc3N9JHtwYXJhbXMudHlwZX0tZHluYW1pY2ApO1xuICAgICAgICBkeW5hbWljQnVsbGV0SW5kZXggPSAwO1xuICAgICAgICBpZiAocGFyYW1zLmR5bmFtaWNNYWluQnVsbGV0cyA8IDEpIHtcbiAgICAgICAgICBwYXJhbXMuZHluYW1pY01haW5CdWxsZXRzID0gMTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHBhcmFtcy50eXBlID09PSAncHJvZ3Jlc3NiYXInICYmIHBhcmFtcy5wcm9ncmVzc2Jhck9wcG9zaXRlKSB7XG4gICAgICAgIHN1YkVsLmNsYXNzTGlzdC5hZGQocGFyYW1zLnByb2dyZXNzYmFyT3Bwb3NpdGVDbGFzcyk7XG4gICAgICB9XG4gICAgICBpZiAocGFyYW1zLmNsaWNrYWJsZSkge1xuICAgICAgICBzdWJFbC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIG9uQnVsbGV0Q2xpY2spO1xuICAgICAgfVxuICAgICAgaWYgKCFzd2lwZXIuZW5hYmxlZCkge1xuICAgICAgICBzdWJFbC5jbGFzc0xpc3QuYWRkKHBhcmFtcy5sb2NrQ2xhc3MpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG4gIGZ1bmN0aW9uIGRlc3Ryb3koKSB7XG4gICAgY29uc3QgcGFyYW1zID0gc3dpcGVyLnBhcmFtcy5wYWdpbmF0aW9uO1xuICAgIGlmIChpc1BhZ2luYXRpb25EaXNhYmxlZCgpKSByZXR1cm47XG4gICAgbGV0IGVsID0gc3dpcGVyLnBhZ2luYXRpb24uZWw7XG4gICAgaWYgKGVsKSB7XG4gICAgICBlbCA9IG1ha2VFbGVtZW50c0FycmF5KGVsKTtcbiAgICAgIGVsLmZvckVhY2goc3ViRWwgPT4ge1xuICAgICAgICBzdWJFbC5jbGFzc0xpc3QucmVtb3ZlKHBhcmFtcy5oaWRkZW5DbGFzcyk7XG4gICAgICAgIHN1YkVsLmNsYXNzTGlzdC5yZW1vdmUocGFyYW1zLm1vZGlmaWVyQ2xhc3MgKyBwYXJhbXMudHlwZSk7XG4gICAgICAgIHN1YkVsLmNsYXNzTGlzdC5yZW1vdmUoc3dpcGVyLmlzSG9yaXpvbnRhbCgpID8gcGFyYW1zLmhvcml6b250YWxDbGFzcyA6IHBhcmFtcy52ZXJ0aWNhbENsYXNzKTtcbiAgICAgICAgaWYgKHBhcmFtcy5jbGlja2FibGUpIHtcbiAgICAgICAgICBzdWJFbC5jbGFzc0xpc3QucmVtb3ZlKC4uLihwYXJhbXMuY2xpY2thYmxlQ2xhc3MgfHwgJycpLnNwbGl0KCcgJykpO1xuICAgICAgICAgIHN1YkVsLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgb25CdWxsZXRDbGljayk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgICBpZiAoc3dpcGVyLnBhZ2luYXRpb24uYnVsbGV0cykgc3dpcGVyLnBhZ2luYXRpb24uYnVsbGV0cy5mb3JFYWNoKHN1YkVsID0+IHN1YkVsLmNsYXNzTGlzdC5yZW1vdmUoLi4ucGFyYW1zLmJ1bGxldEFjdGl2ZUNsYXNzLnNwbGl0KCcgJykpKTtcbiAgfVxuICBvbignY2hhbmdlRGlyZWN0aW9uJywgKCkgPT4ge1xuICAgIGlmICghc3dpcGVyLnBhZ2luYXRpb24gfHwgIXN3aXBlci5wYWdpbmF0aW9uLmVsKSByZXR1cm47XG4gICAgY29uc3QgcGFyYW1zID0gc3dpcGVyLnBhcmFtcy5wYWdpbmF0aW9uO1xuICAgIGxldCB7XG4gICAgICBlbFxuICAgIH0gPSBzd2lwZXIucGFnaW5hdGlvbjtcbiAgICBlbCA9IG1ha2VFbGVtZW50c0FycmF5KGVsKTtcbiAgICBlbC5mb3JFYWNoKHN1YkVsID0+IHtcbiAgICAgIHN1YkVsLmNsYXNzTGlzdC5yZW1vdmUocGFyYW1zLmhvcml6b250YWxDbGFzcywgcGFyYW1zLnZlcnRpY2FsQ2xhc3MpO1xuICAgICAgc3ViRWwuY2xhc3NMaXN0LmFkZChzd2lwZXIuaXNIb3Jpem9udGFsKCkgPyBwYXJhbXMuaG9yaXpvbn
5196RhbENsYXNzIDogcGFyYW1zLnZlcnRpY2FsQ2xhc3MpO1xuICAgIH0pO1xuICB9KTtcbiAgb24oJ2luaXQnLCAoKSA9PiB7XG4gICAgaWYgKHN3aXBlci5wYXJhbXMucGFnaW5hdGlvbi5lbmFibGVkID09PSBmYWxzZSkge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lXG4gICAgICBkaXNhYmxlKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGluaXQoKTtcbiAgICAgIHJlbmRlcigpO1xuICAgICAgdXBkYXRlKCk7XG4gICAgfVxuICB9KTtcbiAgb24oJ2FjdGl2ZUluZGV4Q2hhbmdlJywgKCkgPT4ge1xuICAgIGlmICh0eXBlb2Ygc3dpcGVyLnNuYXBJbmRleCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHVwZGF0ZSgpO1xuICAgIH1cbiAgfSk7XG4gIG9uKCdzbmFwSW5kZXhDaGFuZ2UnLCAoKSA9PiB7XG4gICAgdXBkYXRlKCk7XG4gIH0pO1xuICBvbignc25hcEdyaWRMZW5ndGhDaGFuZ2UnLCAoKSA9PiB7XG4gICAgcmVuZGVyKCk7XG4gICAgdXBkYXRlKCk7XG4gIH0pO1xuICBvbignZGVzdHJveScsICgpID0+IHtcbiAgICBkZXN0cm95KCk7XG4gIH0pO1xuICBvbignZW5hYmxlIGRpc2FibGUnLCAoKSA9PiB7XG4gICAgbGV0IHtcbiAgICAgIGVsXG4gICAgfSA9IHN3aXBlci5wYWdpbmF0aW9uO1xuICAgIGlmIChlbCkge1xuICAgICAgZWwgPSBtYWtlRWxlbWVudHNBcnJheShlbCk7XG4gICAgICBlbC5mb3JFYWNoKHN1YkVsID0+IHN1YkVsLmNsYXNzTGlzdFtzd2lwZXIuZW5hYmxlZCA/ICdyZW1vdmUnIDogJ2FkZCddKHN3aXBlci5wYXJhbXMucGFnaW5hdGlvbi5sb2NrQ2xhc3MpKTtcbiAgICB9XG4gIH0pO1xuICBvbignbG9jayB1bmxvY2snLCAoKSA9PiB7XG4gICAgdXBkYXRlKCk7XG4gIH0pO1xuICBvbignY2xpY2snLCAoX3MsIGUpID0+IHtcbiAgICBjb25zdCB0YXJnZXRFbCA9IGUudGFyZ2V0O1xuICAgIGNvbnN0IGVsID0gbWFrZUVsZW1lbnRzQXJyYXkoc3dpcGVyLnBhZ2luYXRpb24uZWwpO1xuICAgIGlmIChzd2lwZXIucGFyYW1zLnBhZ2luYXRpb24uZWwgJiYgc3dpcGVyLnBhcmFtcy5wYWdpbmF0aW9uLmhpZGVPbkNsaWNrICYmIGVsICYmIGVsLmxlbmd0aCA+IDAgJiYgIXRhcmdldEVsLmNsYXNzTGlzdC5jb250YWlucyhzd2lwZXIucGFyYW1zLnBhZ2luYXRpb24uYnVsbGV0Q2xhc3MpKSB7XG4gICAgICBpZiAoc3dpcGVyLm5hdmlnYXRpb24gJiYgKHN3aXBlci5uYXZpZ2F0aW9uLm5leHRFbCAmJiB0YXJnZXRFbCA9PT0gc3dpcGVyLm5hdmlnYXRpb24ubmV4dEVsIHx8IHN3aXBlci5uYXZpZ2F0aW9uLnByZXZFbCAmJiB0YXJnZXRFbCA9PT0gc3dpcGVyLm5hdmlnYXRpb24ucHJldkVsKSkgcmV0dXJuO1xuICAgICAgY29uc3QgaXNIaWRkZW4gPSBlbFswXS5jbGFzc0xpc3QuY29udGFpbnMoc3dpcGVyLnBhcmFtcy5wYWdpbmF0aW9uLmhpZGRlbkNsYXNzKTtcbiAgICAgIGlmIChpc0hpZGRlbiA9PT0gdHJ1ZSkge1xuICAgICAgICBlbWl0KCdwYWdpbmF0aW9uU2hvdycpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZW1pdCgncGFnaW5hdGlvbkhpZGUnKTtcbiAgICAgIH1cbiAgICAgIGVsLmZvckVhY2goc3ViRWwgPT4gc3ViRWwuY2xhc3NMaXN0LnRvZ2dsZShzd2lwZXIucGFyYW1zLnBhZ2luYXRpb24uaGlkZGVuQ2xhc3MpKTtcbiAgICB9XG4gIH0pO1xuICBjb25zdCBlbmFibGUgPSAoKSA9PiB7XG4gICAgc3dpcGVyLmVsLmNsYXNzTGlzdC5yZW1vdmUoc3dpcGVyLnBhcmFtcy5wYWdpbmF0aW9uLnBhZ2luYXRpb25EaXNhYmxlZENsYXNzKTtcbiAgICBsZXQge1xuICAgICAgZWxcbiAgICB9ID0gc3dpcGVyLnBhZ2luYXRpb247XG4gICAgaWYgKGVsKSB7XG4gICAgICBlbCA9IG1ha2VFbGVtZW50c0FycmF5KGVsKTtcbiAgICAgIGVsLmZvckVhY2goc3ViRWwgPT4gc3ViRWwuY2xhc3NMaXN0LnJlbW92ZShzd2lwZXIucGFyYW1zLnBhZ2luYXRpb24ucGFnaW5hdGlvbkRpc2FibGVkQ2xhc3MpKTtcbiAgICB9XG4gICAgaW5pdCgpO1xuICAgIHJlbmRlcigpO1xuICAgIHVwZGF0ZSgpO1xuICB9O1xuICBjb25zdCBkaXNhYmxlID0gKCkgPT4ge1xuICAgIHN3aXBlci5lbC5jbGFzc0xpc3QuYWRkKHN3aXBlci5wYXJhbXMucGFnaW5hdGlvbi5wYWdpbmF0aW9uRGlzYWJsZWRDbGFzcyk7XG4gICAgbGV0IHtcbiAgICAgIGVsXG4gICAgfSA9IHN3aXBlci5wYWdpbmF0aW9uO1xuICAgIGlmIChlbCkge1xuICAgICAgZWwgPSBtYWtlRWxlbWVudHNBcnJheShlbCk7XG4gICAgICBlbC5mb3JFYWNoKHN1YkVsID0+IHN1YkVsLmNsYXNzTGlzdC5hZGQoc3dpcGVyLnBhcmFtcy5wYWdpbmF0aW9uLnBhZ2luYXRpb25EaXNhYmxlZENsYXNzKSk7XG4gICAgfVxuICAgIGRlc3Ryb3koKTtcbiAgfTtcbiAgT2JqZWN0LmFzc2lnbihzd2lwZXIucGFnaW5hdGlvbiwge1xuICAgIGVuYWJsZSxcbiAgICBkaXNhYmxlLFxuICAgIHJlbmRlcixcbiAgICB1cGRhdGUsXG4gICAgaW5pdCxcbiAgICBkZXN0cm95XG4gIH0pO1xufVxuXG5leHBvcnQgeyBQYWdpbmF0aW9uIGFzIGRlZmF1bHQgfTtcbiIsImltcG9ydCB7IGcgYXMgZ2V0RG9jdW1lbnQgfSBmcm9tICcuLi9zaGFyZWQvc3NyLXdpbmRvdy5lc20ubWpzJztcblxuLyogZXNsaW50IG5vLXVuZGVyc2NvcmUtZGFuZ2xlOiBcIm9mZlwiICovXG4vKiBlc2xpbnQgbm8tdXNlLWJlZm9yZS1kZWZpbmU6IFwib2ZmXCIgKi9cbmZ1bmN0aW9uIEF1dG9wbGF5KF9yZWYpIHtcbiAgbGV0IHtcbiAgICBzd2lwZXIsXG4gICAgZXh0ZW5kUGFyYW1zLFxuICAgIG9uLFxuICAgIGVtaXQsXG4gICAgcGFyYW1zXG4gIH0gPSBfcmVmO1xuICBzd2lwZXIuYXV0b3BsYXkgPSB7XG4gICAgcnVubmluZzogZmFsc2UsXG4gICAgcGF1c2VkOiBmYWxzZSxcbiAgICB0aW1lTGVmdDogMFxuICB9O1xuICBleHRlbmRQYXJhbXMoe1xuICAgIGF1dG9wbGF5OiB7XG4gICAgICBlbmFibGVkOiBmYWxzZSxcbiAgICAgIGRlbGF5OiAzMDAwLFxuICAgICAgd2FpdEZvclRyYW5zaXRpb246IHRydWUsXG4gICAgICBkaXNhYmxlT25JbnRlcmFjdGlvbjogZmFsc2UsXG4gICAgICBzdG9wT25MYXN0U2xpZGU6IGZhbHNlLFxuICAgICAgcmV2ZXJzZURpcmVjdGlvbjogZmFsc2UsXG4gICAgICBwYXVzZU9uTW91c2VFbnRlcjogZmFsc2VcbiAgICB9XG4gI
5196H0pO1xuICBsZXQgdGltZW91dDtcbiAgbGV0IHJhZjtcbiAgbGV0IGF1dG9wbGF5RGVsYXlUb3RhbCA9IHBhcmFtcyAmJiBwYXJhbXMuYXV0b3BsYXkgPyBwYXJhbXMuYXV0b3BsYXkuZGVsYXkgOiAzMDAwO1xuICBsZXQgYXV0b3BsYXlEZWxheUN1cnJlbnQgPSBwYXJhbXMgJiYgcGFyYW1zLmF1dG9wbGF5ID8gcGFyYW1zLmF1dG9wbGF5LmRlbGF5IDogMzAwMDtcbiAgbGV0IGF1dG9wbGF5VGltZUxlZnQ7XG4gIGxldCBhdXRvcGxheVN0YXJ0VGltZSA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xuICBsZXQgd2FzUGF1c2VkO1xuICBsZXQgaXNUb3VjaGVkO1xuICBsZXQgcGF1c2VkQnlUb3VjaDtcbiAgbGV0IHRvdWNoU3RhcnRUaW1lb3V0O1xuICBsZXQgc2xpZGVDaGFuZ2VkO1xuICBsZXQgcGF1c2VkQnlJbnRlcmFjdGlvbjtcbiAgbGV0IHBhdXNlZEJ5UG9pbnRlckVudGVyO1xuICBmdW5jdGlvbiBvblRyYW5zaXRpb25FbmQoZSkge1xuICAgIGlmICghc3dpcGVyIHx8IHN3aXBlci5kZXN0cm95ZWQgfHwgIXN3aXBlci53cmFwcGVyRWwpIHJldHVybjtcbiAgICBpZiAoZS50YXJnZXQgIT09IHN3aXBlci53cmFwcGVyRWwpIHJldHVybjtcbiAgICBzd2lwZXIud3JhcHBlckVsLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3RyYW5zaXRpb25lbmQnLCBvblRyYW5zaXRpb25FbmQpO1xuICAgIGlmIChwYXVzZWRCeVBvaW50ZXJFbnRlcikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICByZXN1bWUoKTtcbiAgfVxuICBjb25zdCBjYWxjVGltZUxlZnQgPSAoKSA9PiB7XG4gICAgaWYgKHN3aXBlci5kZXN0cm95ZWQgfHwgIXN3aXBlci5hdXRvcGxheS5ydW5uaW5nKSByZXR1cm47XG4gICAgaWYgKHN3aXBlci5hdXRvcGxheS5wYXVzZWQpIHtcbiAgICAgIHdhc1BhdXNlZCA9IHRydWU7XG4gICAgfSBlbHNlIGlmICh3YXNQYXVzZWQpIHtcbiAgICAgIGF1dG9wbGF5RGVsYXlDdXJyZW50ID0gYXV0b3BsYXlUaW1lTGVmdDtcbiAgICAgIHdhc1BhdXNlZCA9IGZhbHNlO1xuICAgIH1cbiAgICBjb25zdCB0aW1lTGVmdCA9IHN3aXBlci5hdXRvcGxheS5wYXVzZWQgPyBhdXRvcGxheVRpbWVMZWZ0IDogYXV0b3BsYXlTdGFydFRpbWUgKyBhdXRvcGxheURlbGF5Q3VycmVudCAtIG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xuICAgIHN3aXBlci5hdXRvcGxheS50aW1lTGVmdCA9IHRpbWVMZWZ0O1xuICAgIGVtaXQoJ2F1dG9wbGF5VGltZUxlZnQnLCB0aW1lTGVmdCwgdGltZUxlZnQgLyBhdXRvcGxheURlbGF5VG90YWwpO1xuICAgIHJhZiA9IHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICBjYWxjVGltZUxlZnQoKTtcbiAgICB9KTtcbiAgfTtcbiAgY29uc3QgZ2V0U2xpZGVEZWxheSA9ICgpID0+IHtcbiAgICBsZXQgYWN0aXZlU2xpZGVFbDtcbiAgICBpZiAoc3dpcGVyLnZpcnR1YWwgJiYgc3dpcGVyLnBhcmFtcy52aXJ0dWFsLmVuYWJsZWQpIHtcbiAgICAgIGFjdGl2ZVNsaWRlRWwgPSBzd2lwZXIuc2xpZGVzLmZpbHRlcihzbGlkZUVsID0+IHNsaWRlRWwuY2xhc3NMaXN0LmNvbnRhaW5zKCdzd2lwZXItc2xpZGUtYWN0aXZlJykpWzBdO1xuICAgIH0gZWxzZSB7XG4gICAgICBhY3RpdmVTbGlkZUVsID0gc3dpcGVyLnNsaWRlc1tzd2lwZXIuYWN0aXZlSW5kZXhdO1xuICAgIH1cbiAgICBpZiAoIWFjdGl2ZVNsaWRlRWwpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgY29uc3QgY3VycmVudFNsaWRlRGVsYXkgPSBwYXJzZUludChhY3RpdmVTbGlkZUVsLmdldEF0dHJpYnV0ZSgnZGF0YS1zd2lwZXItYXV0b3BsYXknKSwgMTApO1xuICAgIHJldHVybiBjdXJyZW50U2xpZGVEZWxheTtcbiAgfTtcbiAgY29uc3QgcnVuID0gZGVsYXlGb3JjZSA9PiB7XG4gICAgaWYgKHN3aXBlci5kZXN0cm95ZWQgfHwgIXN3aXBlci5hdXRvcGxheS5ydW5uaW5nKSByZXR1cm47XG4gICAgY2FuY2VsQW5pbWF0aW9uRnJhbWUocmFmKTtcbiAgICBjYWxjVGltZUxlZnQoKTtcbiAgICBsZXQgZGVsYXkgPSB0eXBlb2YgZGVsYXlGb3JjZSA9PT0gJ3VuZGVmaW5lZCcgPyBzd2lwZXIucGFyYW1zLmF1dG9wbGF5LmRlbGF5IDogZGVsYXlGb3JjZTtcbiAgICBhdXRvcGxheURlbGF5VG90YWwgPSBzd2lwZXIucGFyYW1zLmF1dG9wbGF5LmRlbGF5O1xuICAgIGF1dG9wbGF5RGVsYXlDdXJyZW50ID0gc3dpcGVyLnBhcmFtcy5hdXRvcGxheS5kZWxheTtcbiAgICBjb25zdCBjdXJyZW50U2xpZGVEZWxheSA9IGdldFNsaWRlRGVsYXkoKTtcbiAgICBpZiAoIU51bWJlci5pc05hTihjdXJyZW50U2xpZGVEZWxheSkgJiYgY3VycmVudFNsaWRlRGVsYXkgPiAwICYmIHR5cGVvZiBkZWxheUZvcmNlID09PSAndW5kZWZpbmVkJykge1xuICAgICAgZGVsYXkgPSBjdXJyZW50U2xpZGVEZWxheTtcbiAgICAgIGF1dG9wbGF5RGVsYXlUb3RhbCA9IGN1cnJlbnRTbGlkZURlbGF5O1xuICAgICAgYXV0b3BsYXlEZWxheUN1cnJlbnQgPSBjdXJyZW50U2xpZGVEZWxheTtcbiAgICB9XG4gICAgYXV0b3BsYXlUaW1lTGVmdCA9IGRlbGF5O1xuICAgIGNvbnN0IHNwZWVkID0gc3dpcGVyLnBhcmFtcy5zcGVlZDtcbiAgICBjb25zdCBwcm9jZWVkID0gKCkgPT4ge1xuICAgICAgaWYgKCFzd2lwZXIgfHwgc3dpcGVyLmRlc3Ryb3llZCkgcmV0dXJuO1xuICAgICAgaWYgKHN3aXBlci5wYXJhbXMuYXV0b3BsYXkucmV2ZXJzZURpcmVjdGlvbikge1xuICAgICAgICBpZiAoIXN3aXBlci5pc0JlZ2lubmluZyB8fCBzd2lwZXIucGFyYW1zLmxvb3AgfHwgc3dpcGVyLnBhcmFtcy5yZXdpbmQpIHtcbiAgICAgICAgICBzd2lwZXIuc2xpZGVQcmV2KHNwZWVkLCB0cnVlLCB0cnVlKTtcbiAgICAgICAgICBlbWl0KCdhdXRvcGxheScpO1xuICAgICAgICB9IGVsc2UgaWYgKCFzd2lwZXIucGFyYW1zLmF1dG9wbGF5LnN0b3BPbkxhc3RTbGlkZSkge1xuICAgICAgICAgIHN3aXBlci5zbGlkZVRvKHN3aXBlci5zbGlkZXMubGVuZ3RoIC0gMSwgc3BlZWQsIHRydWUsIHRydWUpO1xuICAgICAgICAgIGVtaXQoJ2F1dG9wbGF5Jyk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmICghc3dpcGVyLmlzRW5kIHx8IHN3aXBlci5wYXJhbXMubG9vcCB8fCBzd2lwZXIucGFyYW1zLnJld2luZCkge1xuICAgICAgICAgI
5196HN3aXBlci5zbGlkZU5leHQoc3BlZWQsIHRydWUsIHRydWUpO1xuICAgICAgICAgIGVtaXQoJ2F1dG9wbGF5Jyk7XG4gICAgICAgIH0gZWxzZSBpZiAoIXN3aXBlci5wYXJhbXMuYXV0b3BsYXkuc3RvcE9uTGFzdFNsaWRlKSB7XG4gICAgICAgICAgc3dpcGVyLnNsaWRlVG8oMCwgc3BlZWQsIHRydWUsIHRydWUpO1xuICAgICAgICAgIGVtaXQoJ2F1dG9wbGF5Jyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChzd2lwZXIucGFyYW1zLmNzc01vZGUpIHtcbiAgICAgICAgYXV0b3BsYXlTdGFydFRpbWUgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTtcbiAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgICAgICBydW4oKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfTtcbiAgICBpZiAoZGVsYXkgPiAwKSB7XG4gICAgICBjbGVhclRpbWVvdXQodGltZW91dCk7XG4gICAgICB0aW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHByb2NlZWQoKTtcbiAgICAgIH0sIGRlbGF5KTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgICAgcHJvY2VlZCgpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lXG4gICAgcmV0dXJuIGRlbGF5O1xuICB9O1xuICBjb25zdCBzdGFydCA9ICgpID0+IHtcbiAgICBhdXRvcGxheVN0YXJ0VGltZSA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xuICAgIHN3aXBlci5hdXRvcGxheS5ydW5uaW5nID0gdHJ1ZTtcbiAgICBydW4oKTtcbiAgICBlbWl0KCdhdXRvcGxheVN0YXJ0Jyk7XG4gIH07XG4gIGNvbnN0IHN0b3AgPSAoKSA9PiB7XG4gICAgc3dpcGVyLmF1dG9wbGF5LnJ1bm5pbmcgPSBmYWxzZTtcbiAgICBjbGVhclRpbWVvdXQodGltZW91dCk7XG4gICAgY2FuY2VsQW5pbWF0aW9uRnJhbWUocmFmKTtcbiAgICBlbWl0KCdhdXRvcGxheVN0b3AnKTtcbiAgfTtcbiAgY29uc3QgcGF1c2UgPSAoaW50ZXJuYWwsIHJlc2V0KSA9PiB7XG4gICAgaWYgKHN3aXBlci5kZXN0cm95ZWQgfHwgIXN3aXBlci5hdXRvcGxheS5ydW5uaW5nKSByZXR1cm47XG4gICAgY2xlYXJUaW1lb3V0KHRpbWVvdXQpO1xuICAgIGlmICghaW50ZXJuYWwpIHtcbiAgICAgIHBhdXNlZEJ5SW50ZXJhY3Rpb24gPSB0cnVlO1xuICAgIH1cbiAgICBjb25zdCBwcm9jZWVkID0gKCkgPT4ge1xuICAgICAgZW1pdCgnYXV0b3BsYXlQYXVzZScpO1xuICAgICAgaWYgKHN3aXBlci5wYXJhbXMuYXV0b3BsYXkud2FpdEZvclRyYW5zaXRpb24pIHtcbiAgICAgICAgc3dpcGVyLndyYXBwZXJFbC5hZGRFdmVudExpc3RlbmVyKCd0cmFuc2l0aW9uZW5kJywgb25UcmFuc2l0aW9uRW5kKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlc3VtZSgpO1xuICAgICAgfVxuICAgIH07XG4gICAgc3dpcGVyLmF1dG9wbGF5LnBhdXNlZCA9IHRydWU7XG4gICAgaWYgKHJlc2V0KSB7XG4gICAgICBpZiAoc2xpZGVDaGFuZ2VkKSB7XG4gICAgICAgIGF1dG9wbGF5VGltZUxlZnQgPSBzd2lwZXIucGFyYW1zLmF1dG9wbGF5LmRlbGF5O1xuICAgICAgfVxuICAgICAgc2xpZGVDaGFuZ2VkID0gZmFsc2U7XG4gICAgICBwcm9jZWVkKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGRlbGF5ID0gYXV0b3BsYXlUaW1lTGVmdCB8fCBzd2lwZXIucGFyYW1zLmF1dG9wbGF5LmRlbGF5O1xuICAgIGF1dG9wbGF5VGltZUxlZnQgPSBkZWxheSAtIChuZXcgRGF0ZSgpLmdldFRpbWUoKSAtIGF1dG9wbGF5U3RhcnRUaW1lKTtcbiAgICBpZiAoc3dpcGVyLmlzRW5kICYmIGF1dG9wbGF5VGltZUxlZnQgPCAwICYmICFzd2lwZXIucGFyYW1zLmxvb3ApIHJldHVybjtcbiAgICBpZiAoYXV0b3BsYXlUaW1lTGVmdCA8IDApIGF1dG9wbGF5VGltZUxlZnQgPSAwO1xuICAgIHByb2NlZWQoKTtcbiAgfTtcbiAgY29uc3QgcmVzdW1lID0gKCkgPT4ge1xuICAgIGlmIChzd2lwZXIuaXNFbmQgJiYgYXV0b3BsYXlUaW1lTGVmdCA8IDAgJiYgIXN3aXBlci5wYXJhbXMubG9vcCB8fCBzd2lwZXIuZGVzdHJveWVkIHx8ICFzd2lwZXIuYXV0b3BsYXkucnVubmluZykgcmV0dXJuO1xuICAgIGF1dG9wbGF5U3RhcnRUaW1lID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7XG4gICAgaWYgKHBhdXNlZEJ5SW50ZXJhY3Rpb24pIHtcbiAgICAgIHBhdXNlZEJ5SW50ZXJhY3Rpb24gPSBmYWxzZTtcbiAgICAgIHJ1bihhdXRvcGxheVRpbWVMZWZ0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgcnVuKCk7XG4gICAgfVxuICAgIHN3aXBlci5hdXRvcGxheS5wYXVzZWQgPSBmYWxzZTtcbiAgICBlbWl0KCdhdXRvcGxheVJlc3VtZScpO1xuICB9O1xuICBjb25zdCBvblZpc2liaWxpdHlDaGFuZ2UgPSAoKSA9PiB7XG4gICAgaWYgKHN3aXBlci5kZXN0cm95ZWQgfHwgIXN3aXBlci5hdXRvcGxheS5ydW5uaW5nKSByZXR1cm47XG4gICAgY29uc3QgZG9jdW1lbnQgPSBnZXREb2N1bWVudCgpO1xuICAgIGlmIChkb2N1bWVudC52aXNpYmlsaXR5U3RhdGUgPT09ICdoaWRkZW4nKSB7XG4gICAgICBwYXVzZWRCeUludGVyYWN0aW9uID0gdHJ1ZTtcbiAgICAgIHBhdXNlKHRydWUpO1xuICAgIH1cbiAgICBpZiAoZG9jdW1lbnQudmlzaWJpbGl0eVN0YXRlID09PSAndmlzaWJsZScpIHtcbiAgICAgIHJlc3VtZSgpO1xuICAgIH1cbiAgfTtcbiAgY29uc3Qgb25Qb2ludGVyRW50ZXIgPSBlID0+IHtcbiAgICBpZiAoZS5wb2ludGVyVHlwZSAhPT0gJ21vdXNlJykgcmV0dXJuO1xuICAgIHBhdXNlZEJ5SW50ZXJhY3Rpb24gPSB0cnVlO1xuICAgIHBhdXNlZEJ5UG9pbnRlckVudGVyID0gdHJ1ZTtcbiAgICBpZiAoc3dpcGVyLmFuaW1hdGluZyB8fCBzd2lwZXIuYXV0b3BsYXkucGF1c2VkKSByZXR1cm47XG4gICAgcGF1c2UodHJ1ZSk7XG4gIH07XG4gIGNvbnN0IG9uUG9pbnRlckxlYXZlID0gZSA9PiB7XG4gICAgaWYgKGUucG9pbnRlclR5cGUgIT09ICdtb3VzZScpIHJldHVybjtcbiAgICBwYXVzZWRCeVBvaW50ZXJFbnRlciA9IGZhbHNlO1xuICAgIGlmIChzd2lwZXIuYXV0b3BsYXkucGF1c2VkKSB7XG4gICAgICByZXN1bWUoKTtcbiAgICB9XG4gI
5196H07XG4gIGNvbnN0IGF0dGFjaE1vdXNlRXZlbnRzID0gKCkgPT4ge1xuICAgIGlmIChzd2lwZXIucGFyYW1zLmF1dG9wbGF5LnBhdXNlT25Nb3VzZUVudGVyKSB7XG4gICAgICBzd2lwZXIuZWwuYWRkRXZlbnRMaXN0ZW5lcigncG9pbnRlcmVudGVyJywgb25Qb2ludGVyRW50ZXIpO1xuICAgICAgc3dpcGVyLmVsLmFkZEV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJsZWF2ZScsIG9uUG9pbnRlckxlYXZlKTtcbiAgICB9XG4gIH07XG4gIGNvbnN0IGRldGFjaE1vdXNlRXZlbnRzID0gKCkgPT4ge1xuICAgIHN3aXBlci5lbC5yZW1vdmVFdmVudExpc3RlbmVyKCdwb2ludGVyZW50ZXInLCBvblBvaW50ZXJFbnRlcik7XG4gICAgc3dpcGVyLmVsLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJsZWF2ZScsIG9uUG9pbnRlckxlYXZlKTtcbiAgfTtcbiAgY29uc3QgYXR0YWNoRG9jdW1lbnRFdmVudHMgPSAoKSA9PiB7XG4gICAgY29uc3QgZG9jdW1lbnQgPSBnZXREb2N1bWVudCgpO1xuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3Zpc2liaWxpdHljaGFuZ2UnLCBvblZpc2liaWxpdHlDaGFuZ2UpO1xuICB9O1xuICBjb25zdCBkZXRhY2hEb2N1bWVudEV2ZW50cyA9ICgpID0+IHtcbiAgICBjb25zdCBkb2N1bWVudCA9IGdldERvY3VtZW50KCk7XG4gICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigndmlzaWJpbGl0eWNoYW5nZScsIG9uVmlzaWJpbGl0eUNoYW5nZSk7XG4gIH07XG4gIG9uKCdpbml0JywgKCkgPT4ge1xuICAgIGlmIChzd2lwZXIucGFyYW1zLmF1dG9wbGF5LmVuYWJsZWQpIHtcbiAgICAgIGF0dGFjaE1vdXNlRXZlbnRzKCk7XG4gICAgICBhdHRhY2hEb2N1bWVudEV2ZW50cygpO1xuICAgICAgc3RhcnQoKTtcbiAgICB9XG4gIH0pO1xuICBvbignZGVzdHJveScsICgpID0+IHtcbiAgICBkZXRhY2hNb3VzZUV2ZW50cygpO1xuICAgIGRldGFjaERvY3VtZW50RXZlbnRzKCk7XG4gICAgaWYgKHN3aXBlci5hdXRvcGxheS5ydW5uaW5nKSB7XG4gICAgICBzdG9wKCk7XG4gICAgfVxuICB9KTtcbiAgb24oJ19mcmVlTW9kZVN0YXRpY1JlbGVhc2UnLCAoKSA9PiB7XG4gICAgaWYgKHBhdXNlZEJ5VG91Y2ggfHwgcGF1c2VkQnlJbnRlcmFjdGlvbikge1xuICAgICAgcmVzdW1lKCk7XG4gICAgfVxuICB9KTtcbiAgb24oJ19mcmVlTW9kZU5vTW9tZW50dW1SZWxlYXNlJywgKCkgPT4ge1xuICAgIGlmICghc3dpcGVyLnBhcmFtcy5hdXRvcGxheS5kaXNhYmxlT25JbnRlcmFjdGlvbikge1xuICAgICAgcGF1c2UodHJ1ZSwgdHJ1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0b3AoKTtcbiAgICB9XG4gIH0pO1xuICBvbignYmVmb3JlVHJhbnNpdGlvblN0YXJ0JywgKF9zLCBzcGVlZCwgaW50ZXJuYWwpID0+IHtcbiAgICBpZiAoc3dpcGVyLmRlc3Ryb3llZCB8fCAhc3dpcGVyLmF1dG9wbGF5LnJ1bm5pbmcpIHJldHVybjtcbiAgICBpZiAoaW50ZXJuYWwgfHwgIXN3aXBlci5wYXJhbXMuYXV0b3BsYXkuZGlzYWJsZU9uSW50ZXJhY3Rpb24pIHtcbiAgICAgIHBhdXNlKHRydWUsIHRydWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzdG9wKCk7XG4gICAgfVxuICB9KTtcbiAgb24oJ3NsaWRlckZpcnN0TW92ZScsICgpID0+IHtcbiAgICBpZiAoc3dpcGVyLmRlc3Ryb3llZCB8fCAhc3dpcGVyLmF1dG9wbGF5LnJ1bm5pbmcpIHJldHVybjtcbiAgICBpZiAoc3dpcGVyLnBhcmFtcy5hdXRvcGxheS5kaXNhYmxlT25JbnRlcmFjdGlvbikge1xuICAgICAgc3RvcCgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpc1RvdWNoZWQgPSB0cnVlO1xuICAgIHBhdXNlZEJ5VG91Y2ggPSBmYWxzZTtcbiAgICBwYXVzZWRCeUludGVyYWN0aW9uID0gZmFsc2U7XG4gICAgdG91Y2hTdGFydFRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHBhdXNlZEJ5SW50ZXJhY3Rpb24gPSB0cnVlO1xuICAgICAgcGF1c2VkQnlUb3VjaCA9IHRydWU7XG4gICAgICBwYXVzZSh0cnVlKTtcbiAgICB9LCAyMDApO1xuICB9KTtcbiAgb24oJ3RvdWNoRW5kJywgKCkgPT4ge1xuICAgIGlmIChzd2lwZXIuZGVzdHJveWVkIHx8ICFzd2lwZXIuYXV0b3BsYXkucnVubmluZyB8fCAhaXNUb3VjaGVkKSByZXR1cm47XG4gICAgY2xlYXJUaW1lb3V0KHRvdWNoU3RhcnRUaW1lb3V0KTtcbiAgICBjbGVhclRpbWVvdXQodGltZW91dCk7XG4gICAgaWYgKHN3aXBlci5wYXJhbXMuYXV0b3BsYXkuZGlzYWJsZU9uSW50ZXJhY3Rpb24pIHtcbiAgICAgIHBhdXNlZEJ5VG91Y2ggPSBmYWxzZTtcbiAgICAgIGlzVG91Y2hlZCA9IGZhbHNlO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAocGF1c2VkQnlUb3VjaCAmJiBzd2lwZXIucGFyYW1zLmNzc01vZGUpIHJlc3VtZSgpO1xuICAgIHBhdXNlZEJ5VG91Y2ggPSBmYWxzZTtcbiAgICBpc1RvdWNoZWQgPSBmYWxzZTtcbiAgfSk7XG4gIG9uKCdzbGlkZUNoYW5nZScsICgpID0+IHtcbiAgICBpZiAoc3dpcGVyLmRlc3Ryb3llZCB8fCAhc3dpcGVyLmF1dG9wbGF5LnJ1bm5pbmcpIHJldHVybjtcbiAgICBzbGlkZUNoYW5nZWQgPSB0cnVlO1xuICB9KTtcbiAgT2JqZWN0LmFzc2lnbihzd2lwZXIuYXV0b3BsYXksIHtcbiAgICBzdGFydCxcbiAgICBzdG9wLFxuICAgIHBhdXNlLFxuICAgIHJlc3VtZVxuICB9KTtcbn1cblxuZXhwb3J0IHsgQXV0b3BsYXkgYXMgZGVmYXVsdCB9O1xuIl0sIm5hbWVzIjpbImlzT2JqZWN0IiwiZXh0ZW5kIiwiY2xhc3NlcyIsImdldENvbXB1dGVkU3R5bGUiLCJ3aW5kb3ciLCJkb2N1bWVudCIsInN1cHBvcnQiLCJvYnNlcnZlclVwZGF0ZSIsImV2ZW50cyIsInNsaWRlIiwidHJhbnNsYXRlIiwicmVhbEluZGV4IiwibWluVHJhbnNsYXRlIiwibWF4VHJhbnNsYXRlIiwidHJhbnNpdGlvbkVuZCIsInNsaWRlVG8iLCJzZXRUcmFuc2xhdGUiLCJpIiwiaW5jcmVtZW50IiwiYnJlYWtwb2ludHMiLCJ1cGRhdGUiXSwibWFwcGluZ3MiOiJBQVlBLFNBQVNBLFdBQVMsS0FBSztBQUNyQixTQUFPLFFBQVEsUUFBUSxPQUFPLFFBQVEsWUFBWSxpQkFBaUIsT0FBTyxJQUFJLGdCQUFnQjtBQUNoRztBQUNBLFNBQVNDLFNBQU8sUUFBUSxLQUFLO0FBQzNCLE1BQUksV0FBVyxRQUFRO0FBQ3JCLGFBQVMsQ0FBQTtBQUFBLEVBQ1Y7QUFDRCxNQUFJLFFBQVEsUUFBUTtBQUNsQixVQUFNLENBQUE7QUFBQSxFQUNQO0FBQ0QsU0FBT
5196yxLQUFLLEdBQUcsRUFBRSxRQUFRLFNBQU87QUFDOUIsUUFBSSxPQUFPLE9BQU8sR0FBRyxNQUFNO0FBQWEsYUFBTyxHQUFHLElBQUksSUFBSSxHQUFHO0FBQUEsYUFBV0QsV0FBUyxJQUFJLEdBQUcsQ0FBQyxLQUFLQSxXQUFTLE9BQU8sR0FBRyxDQUFDLEtBQUssT0FBTyxLQUFLLElBQUksR0FBRyxDQUFDLEVBQUUsU0FBUyxHQUFHO0FBQ3ZKQyxlQUFPLE9BQU8sR0FBRyxHQUFHLElBQUksR0FBRyxDQUFDO0FBQUEsSUFDN0I7QUFBQSxFQUNMLENBQUc7QUFDSDtBQUNBLE1BQU0sY0FBYztBQUFBLEVBQ2xCLE1BQU0sQ0FBRTtBQUFBLEVBQ1IsbUJBQW1CO0FBQUEsRUFBRTtBQUFBLEVBQ3JCLHNCQUFzQjtBQUFBLEVBQUU7QUFBQSxFQUN4QixlQUFlO0FBQUEsSUFDYixPQUFPO0FBQUEsSUFBRTtBQUFBLElBQ1QsVUFBVTtBQUFBLEVBQ1g7QUFBQSxFQUNELGdCQUFnQjtBQUNkLFdBQU87QUFBQSxFQUNSO0FBQUEsRUFDRCxtQkFBbUI7QUFDakIsV0FBTztFQUNSO0FBQUEsRUFDRCxpQkFBaUI7QUFDZixXQUFPO0FBQUEsRUFDUjtBQUFBLEVBQ0QsY0FBYztBQUNaLFdBQU87QUFBQSxNQUNMLFlBQVk7QUFBQSxNQUFFO0FBQUEsSUFDcEI7QUFBQSxFQUNHO0FBQUEsRUFDRCxnQkFBZ0I7QUFDZCxXQUFPO0FBQUEsTUFDTCxVQUFVLENBQUU7QUFBQSxNQUNaLFlBQVksQ0FBRTtBQUFBLE1BQ2QsT0FBTyxDQUFFO0FBQUEsTUFDVCxlQUFlO0FBQUEsTUFBRTtBQUFBLE1BQ2pCLHVCQUF1QjtBQUNyQixlQUFPO01BQ1I7QUFBQSxJQUNQO0FBQUEsRUFDRztBQUFBLEVBQ0Qsa0JBQWtCO0FBQ2hCLFdBQU87RUFDUjtBQUFBLEVBQ0QsYUFBYTtBQUNYLFdBQU87QUFBQSxFQUNSO0FBQUEsRUFDRCxVQUFVO0FBQUEsSUFDUixNQUFNO0FBQUEsSUFDTixNQUFNO0FBQUEsSUFDTixVQUFVO0FBQUEsS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xPQUFPLE9BQU8sU0FBUyxzQkFBc0I7QUFDL0M7QUFDQTtBQUFBLElBQ0Q7QUFDRCxnQkFBWTtBQUNaLG9CQUFnQjtBQUNoQiwwQkFBc0I7QUFDdEIsd0JBQW9CLFdBQVcsTUFBTTtBQUNuQyw0QkFBc0I7QUFDdEIsc0JBQWdCO0FBQ2hCLFlBQU0sSUFBSTtBQUFBLElBQ1gsR0FBRSxHQU
5196FHO0FBQUEsRUFDVixDQUFHO0FBQ0QsS0FBRyxZQUFZLE1BQU07QUFDbkIsUUFBSSxPQUFPLGFBQWEsQ0FBQyxPQUFPLFNBQVMsV0FBVyxDQUFDO0FBQVc7QUFDaEUsaUJBQWEsaUJBQWlCO0FBQzlCLGlCQUFhLE9BQU87QUFDcEIsUUFBSSxPQUFPLE9BQU8sU0FBUyxzQkFBc0I7QUFDL0Msc0JBQWdCO0FBQ2hCLGtCQUFZO0FBQ1o7QUFBQSxJQUNEO0FBQ0QsUUFBSSxpQkFBaUIsT0FBTyxPQUFPO0FBQVMsYUFBTTtBQUNsRCxvQkFBZ0I7QUFDaEIsZ0JBQVk7QUFBQSxFQUNoQixDQUFHO0FBQ0QsS0FBRyxlQUFlLE1BQU07QUFDdEIsUUFBSSxPQUFPLGFBQWEsQ0FBQyxPQUFPLFNBQVM7QUFBUztBQUNsRCxtQkFBZTtBQUFBLEVBQ25CLENBQUc7QUFDRCxTQUFPLE9BQU8sT0FBTyxVQUFVO0FBQUEsSUFDN0I7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxFQUNKLENBQUc7QUFDSDsiLCJ4X2dvb2dsZV9pZ25vcmVMaXN0IjpbMCwxLDIsMyw0LDUsNiw3XX0=

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.