1(()=>{var __webpack_modules__={767:()=>{eval('function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); }\n(function () {\n \'use strict\';\n\n var UNSUPPORTED_ENVIRONMENT = typeof window === "undefined";\n\n /**\n * Is true if the browser natively supports the \'scroll-behavior\' CSS-property.\n * @type {boolean}\n */\n var SUPPORTS_SCROLL_BEHAVIOR = UNSUPPORTED_ENVIRONMENT ? false : "scrollBehavior" in document.documentElement.style;\n\n /*! *****************************************************************************\r\n Copyright (c) Microsoft Corporation. All rights reserved.\r\n Licensed under the Apache License, Version 2.0 (the "License"); you may not use\r\n this file except in compliance with the License. You may obtain a copy of the\r\n License at http://www.apache.org/licenses/LICENSE-2.0\r\n THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\r\n KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED\r\n WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,\r\n MERCHANTABLITY OR NON-INFRINGEMENT.\r\n See the Apache Version 2.0 License for specific language governing permissions\r\n and limitations under the License.\r\n ***************************************************************************** */\n\n var _assign = function __assign() {\n _assign = Object.assign || function __assign(t) {\n for (var s, i = 1, n = arguments.length; i < n; i++) {\n s = arguments[i];\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\n }\n return t;\n };\n return _assign.apply(this, arguments);\n };\n function __read(o, n) {\n var m = typeof Symbol === "function" && o[Symbol.iterator];\n if (!m) return o;\n var i = m.call(o),\n r,\n ar = [],\n e;\n try {\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\n } catch (error) {\n e = {\n error: error\n };\n } finally {\n try {\n if (r && !r.done && (m = i["return"])) m.call(i);\n } finally {\n if (e) throw e.error;\n }\n }\n return ar;\n }\n function getScrollingElement() {\n if (document.scrollingElement != null) {\n return document.scrollingElement;\n } else {\n return document.documentElement;\n }\n }\n var STYLE_ATTRIBUTE_PROPERTY_NAME = "scroll-behavior";\n var STYLE_ATTRIBUTE_PROPERTY_REGEXP = new RegExp(STYLE_ATTRIBUTE_PROPERTY_NAME + ":\\\\s*([^;]*)");\n /**\n * Given an Element, this function appends the given ScrollBehavior CSS property value to the elements\' \'style\' attribute.\n * If it doesnt already have one, it will add it.\n * @param {Element} element\n * @param {ScrollBehavior} behavior\n */\n function appendScrollBehaviorToStyleAttribute(element, behavior) {\n var addition = STYLE_ATTRIBUTE_PROPERTY_NAME + ":" + behavior;\n var attributeValue = element.getAttribute("style");\n if (attributeValue == null || attributeValue === "") {\n element.setAttribute("style", addition);\n return;\n }\n // The style attribute may already include a \'scroll-behavior:<something>\' in which case that should be replaced\n var existingValueForProperty = parseScrollBehaviorFromStyleAttribute(element);\n if (existingValueForProperty != null) {\n var replacementProperty = STYLE_ATTRIBUTE_PROPERTY_NAME + ":" + existingValueForProperty;\n // Replace the variant that ends with a semi-colon which it may\n attributeValue = attributeValue.replace(replacementProperty + ";", "");\n // Replace the variant that *doesn\'t* end with a semi-colon\n attributeValue = attributeValue.replace(replacementProperty, "");\n }\n // Now, append the behavior to the string.\n element.setAttribute("style", attributeValue.endsWith(";") ? "" + attributeValue + addition : ";" + attributeValue + addition);\n }\n /**\n * Given an Element, this function attempts to parse its \'style\' attribute (if it has one)\' to extract\n * a value for the \'scroll-behavior\' CSS property (if it is given within that style attribute)\n * @param {Element} element\n * @returns {ScrollBehavior?}\n */\n function parseScrollBehaviorFromStyleAttribute(element) {\n var styleAttributeValue = element.getAttribute("style");\n if (styleAttributeValue != null && styleAttributeValue.includes(STYLE_ATTRIBUTE_PROPERTY_NAME)) {\n var match = styleAttributeValue.match(STYLE_ATTRIBUTE_PROPERTY_REGEXP);\n if (match != null) {\n var _a = __read(match, 2),\n behavior = _a[1];\n if (behavior != null && behavior !== "") {\n return behavior;\n }\n }\n }\n return undefined;\n }\n var styleDeclarationPropertyName = "scrollBehavior";\n /**\n * Determines the scroll behavior to use, depending on the given ScrollOptions and the position of the Element\n * within the DOM\n * @param {Element|HTMLElement|Window} inputTarget\n * @param {ScrollOptions} [options]\n * @returns {ScrollBehavior}\n */\n function getScrollBehavior(inputTarget, options) {\n // If the given \'behavior\' is \'smooth\', apply smooth scrolling no matter what\n if (options != null && options.behavior === "smooth") return "smooth";
1\n var target = "style" in inputTarget ? inputTarget : getScrollingElement();\n var value;\n if ("style" in target) {\n // Check if scroll-behavior is set as a property on the CSSStyleDeclaration\n var scrollBehaviorPropertyValue = target.style[styleDeclarationPropertyName];\n // Return it if it is given and has a proper value\n if (scrollBehaviorPropertyValue != null && scrollBehaviorPropertyValue !== "") {\n value = scrollBehaviorPropertyValue;\n }\n }\n if (value == null) {\n var attributeValue = target.getAttribute("scroll-behavior");\n if (attributeValue != null && attributeValue !== "") {\n value = attributeValue;\n }\n }\n if (value == null) {\n // Otherwise, check if it is set as an inline style\n value = parseScrollBehaviorFromStyleAttribute(target);\n }\n if (value == null) {\n // Take the computed style for the element and see if it contains a specific \'scroll-behavior\' value\n var computedStyle = getComputedStyle(target);\n var computedStyleValue = computedStyle.getPropertyValue("scrollBehavior");\n if (computedStyleValue != null && computedStyleValue !== "") {\n value = computedStyleValue;\n }\n }\n // In all other cases, use the value from the CSSOM\n return value;\n }\n var HALF = 0.5;\n /**\n * The easing function to use when applying the smooth scrolling\n * @param {number} k\n * @returns {number}\n */\n function ease(k) {\n return HALF * (1 - Math.cos(Math.PI * k));\n }\n var NOOP = {\n reset: function reset() {}\n };\n var map = typeof WeakMap === "undefined" ? undefined : new WeakMap();\n function disableScrollSnap(scroller) {\n // If scroll-behavior is natively supported, or if there is no native WeakMap support, there\'s no need for this fix\n if (SUPPORTS_SCROLL_BEHAVIOR || map == null) {\n return NOOP;\n }\n var scrollingElement = getScrollingElement();\n var cachedScrollSnapValue;\n var cachedScrollBehaviorStyleAttributeValue;\n var secondaryScroller;\n var secondaryScrollerCachedScrollSnapValue;\n var secondaryScrollerCachedScrollBehaviorStyleAttributeValue;\n var existingResult = map.get(scroller);\n if (existingResult != null) {\n cachedScrollSnapValue = existingResult.cachedScrollSnapValue;\n cachedScrollBehaviorStyleAttributeValue = existingResult.cachedScrollBehaviorStyleAttributeValue;\n secondaryScroller = existingResult.secondaryScroller;\n secondaryScrollerCachedScrollSnapValue = existingResult.secondaryScrollerCachedScrollSnapValue;\n secondaryScrollerCachedScrollBehaviorStyleAttributeValue = existingResult.secondaryScrollerCachedScrollBehaviorStyleAttributeValue;\n existingResult.release();\n } else {\n cachedScrollSnapValue = scroller.style.scrollSnapType === "" ? null : scroller.style.scrollSnapType;\n cachedScrollBehaviorStyleAttributeValue = parseScrollBehaviorFromStyleAttribute(scroller);\n secondaryScroller = scroller === scrollingElement && scrollingElement !== document.body ? document.body : undefined;\n secondaryScrollerCachedScrollSnapValue = secondaryScroller == null ? undefined : secondaryScroller.style.scrollSnapType === "" ? null : secondaryScroller.style.scrollSnapType;\n secondaryScrollerCachedScrollBehaviorStyleAttributeValue = secondaryScroller == null ? undefined : parseScrollBehaviorFromStyleAttribute(secondaryScroller);\n var cachedComputedScrollSnapValue = getComputedStyle(scroller).getPropertyValue("scroll-snap-type");\n var secondaryScrollerCachedComputedScrollSnapValue = secondaryScroller == null ? undefined : getComputedStyle(secondaryScroller).getPropertyValue("scroll-snap-type");\n // If it just so happens that there actually isn\'t any scroll snapping going on, there\'s no point in performing any additional work here.\n if (cachedComputedScrollSnapValue === "none" && secondaryScrollerCachedComputedScrollSnapValue === "none") {\n return NOOP;\n }\n }\n scroller.style.scrollSnapType = "none";\n if (secondaryScroller !== undefined) {\n secondaryScroller.style.scrollSnapType = "none";\n }\n if (cachedScrollBehaviorStyleAttributeValue !== undefined) {\n appendScrollBehaviorToStyleAttribute(scroller, cachedScrollBehaviorStyleAttributeValue);\n }\n if (secondaryScroller !== undefined && secondaryScrollerCachedScrollBehaviorStyleAttributeValue !== undefined) {\n appendScrollBehaviorToStyleAttribute(secondaryScroller, secondaryScrollerCachedScrollBehaviorStyleAttributeValue);\n }\n var hasReleased = false;\n var eventTarget = scroller === scrollingElement ? window : scroller;\n function release() {\n eventTarget.removeEventListener("scroll", resetHandler);\n if (map != null) {\n map["delete"](scroller);\n }\n hasReleased = true;\n }\n function resetHandler() {\n scroller.style.scrollSnapType = cachedScrollSnapValue;\n if (secondaryScroller != null && secondaryScrollerCachedScrollSnapValue !== undefined) {\n secondaryScroller.style.scrollSnapType = secondaryScrollerCachedScrollSnapValue;\n }\n if (cachedScrollBehaviorStyleAttributeValue !== undefined) {\n appendScrollBehaviorToStyleAttribute(scroller, cachedScrollBehaviorStyleAttributeValue);\n }\n if (secondaryScroller !== undefined && secondaryScrollerCachedScrollBehaviorStyleAttributeValue !== undefined) {\n appendScrollBehaviorToStyleAttribute(secondaryScroller, secondaryScrollerCachedScrollBehaviorStyleAttributeValue);\n }\n release();\n }\n function reset() {\n setTimeout(function () {\n if (hasReleased) return;\n eventTarget.addEventListener("scroll", resetHandler);\n });\n }\n map.set(scroller, {\n release: release,\n cachedScrollSnapValue: cachedScrollSnapValue,\n cachedScrollBehaviorStyleAttributeValue: cachedScrollBehaviorStyleAttributeValue,\n secondaryScroller: secondaryScroller,\n secondaryScrollerCachedScrollSnapValue: secondaryScrollerCachedScrollSnapValue,\n secondaryScrollerCachedScrollBehaviorStyleAttributeValue: secondaryScrollerCachedScrollBehaviorStyleAttributeValue\n });\n return {\n reset: reset\n };\n }\n\n /**\n * The duration of a smooth scroll\n * @type {number}\n */\n var SCROLL_TIME = 15000;\n /**\n * Performs a smooth repositioning of the scroll\n * @param {ISmoothScrollOptions} options\n */\n function smoothScroll(options) {\n var startTime = options.startTime,\n startX = options.startX,\n startY = options.startY,\n endX = options.endX,\n endY = options.endY,\n method = options.method,\n scroller = options.scroller;\n var timeLapsed = 0;\n var distanceX = endX - startX;\n var distanceY = endY - startY;\n var speed = Math.max(Math.abs(distanceX / 1000 * SCROLL_TIME), Math.abs(distanceY / 1000 * SCROLL_TIME));\n // Temporarily disables any scroll snapping that may be active since it fights for control over the scroller with this polyfill\n var scrollSnapFix = disableScrollSnap(scroller);
1\n requestAnimationFrame(function animate(timestamp) {\n timeLapsed += timestamp - startTime;\n var percentage = Math.max(0, Math.min(1, speed === 0 ? 0 : timeLapsed / speed));\n var positionX = Math.floor(startX + distanceX * ease(percentage));\n var positionY = Math.floor(startY + distanceY * ease(percentage));\n method(positionX, positionY);\n if (positionX !== endX || positionY !== endY) {\n requestAnimationFrame(animate);\n } else {\n if (scrollSnapFix != null) {\n scrollSnapFix.reset();\n scrollSnapFix = undefined;\n }\n }\n });\n }\n\n /**\n * Returns a High Resolution timestamp if possible, otherwise fallbacks to Date.now()\n * @returns {number}\n */\n function now() {\n if ("performance" in window) return performance.now();\n return Date.now();\n }\n var ELEMENT_ORIGINAL_SCROLL = UNSUPPORTED_ENVIRONMENT ? undefined : Element.prototype.scroll;\n var WINDOW_ORIGINAL_SCROLL = UNSUPPORTED_ENVIRONMENT ? undefined : window.scroll;\n var ELEMENT_ORIGINAL_SCROLL_BY = UNSUPPORTED_ENVIRONMENT ? undefined : Element.prototype.scrollBy;\n var WINDOW_ORIGINAL_SCROLL_BY = UNSUPPORTED_ENVIRONMENT ? undefined : window.scrollBy;\n var ELEMENT_ORIGINAL_SCROLL_TO = UNSUPPORTED_ENVIRONMENT ? undefined : Element.prototype.scrollTo;\n var WINDOW_ORIGINAL_SCROLL_TO = UNSUPPORTED_ENVIRONMENT ? undefined : window.scrollTo;\n\n /**\n * A fallback if Element.prototype.scroll is not defined\n * @param {number} x\n * @param {number} y\n */\n function elementPrototypeScrollFallback(x, y) {\n this.__adjustingScrollPosition = true;\n this.scrollLeft = x;\n this.scrollTop = y;\n delete this.__adjustingScrollPosition;\n }\n /**\n * A fallback if Element.prototype.scrollTo is not defined\n * @param {number} x\n * @param {number} y\n */\n function elementPrototypeScrollToFallback(x, y) {\n return elementPrototypeScrollFallback.call(this, x, y);\n }\n /**\n * A fallback if Element.prototype.scrollBy is not defined\n * @param {number} x\n * @param {number} y\n */\n function elementPrototypeScrollByFallback(x, y) {\n this.__adjustingScrollPosition = true;\n this.scrollLeft += x;\n this.scrollTop += y;\n delete this.__adjustingScrollPosition;\n }\n /**\n * Gets the original non-patched prototype method for the given kind\n * @param {ScrollMethodName} kind\n * @param {Element|Window} element\n * @return {Function}\n */\n function getOriginalScrollMethodForKind(kind, element) {\n switch (kind) {\n case "scroll":\n if (element instanceof Element) {\n if (ELEMENT_ORIGINAL_SCROLL != null) {\n return ELEMENT_ORIGINAL_SCROLL;\n } else {\n return elementPrototypeScrollFallback;\n }\n } else {\n return WINDOW_ORIGINAL_SCROLL;\n }\n case "scrollBy":\n if (element instanceof Element) {\n if (ELEMENT_ORIGINAL_SCROLL_BY != null) {\n return ELEMENT_ORIGINAL_SCROLL_BY;\n } else {\n return elementPrototypeScrollByFallback;\n }\n } else {\n return WINDOW_ORIGINAL_SCROLL_BY;\n }\n case "scrollTo":\n if (element instanceof Element) {\n if (ELEMENT_ORIGINAL_SCROLL_TO != null) {\n return ELEMENT_ORIGINAL_SCROLL_TO;\n } else {\n return elementPrototypeScrollToFallback;\n }\n } else {\n return WINDOW_ORIGINAL_SCROLL_TO;\n }\n }\n }\n\n /**\n * Gets the Smooth Scroll Options to use for the step function\n * @param {Element|Window} element\n * @param {number} x\n * @param {number} y\n * @param {ScrollMethodName} kind\n * @returns {ISmoothScrollOptions}\n */\n function getSmoothScrollOptions(element, x, y, kind) {\n var startTime = now();\n if (!(element instanceof Element)) {\n // Use window as the scroll container\n var scrollX_1 = window.scrollX,\n pageXOffset_1 = window.pageXOffset,\n scrollY_1 = window.scrollY,\n pageYOffset_1 = window.pageYOffset;\n var startX = scrollX_1 == null || scrollX_1 === 0 ? pageXOffset_1 : scrollX_1;\n var startY = scrollY_1 == null || scrollY_1 === 0 ? pageYOffset_1 : scrollY_1;\n return {\n startTime: startTime,\n startX: startX,\n startY: startY,\n endX: Math.floor(kind === "scrollBy" ? startX + x : x),\n endY: Math.floor(kind === "scrollBy" ? startY + y : y),\n method: getOriginalScrollMethodForKind("scrollTo", window).bind(window),\n scroller: getScrollingElement()\n };\n } else {\n var scrollLeft = element.scrollLeft,\n scrollTop = element.scrollTop;\n var startX = scrollLeft;\n var startY = scrollTop;\n return {\n startTime: startTime,\n startX: startX,\n startY: startY,\n endX: Math.floor(kind === "scrollBy" ? startX + x : x),\n endY: Math.floor(kind === "scrollBy" ? startY + y : y),\n method: getOriginalScrollMethodForKind("scrollTo", element).bind(element),\n scroller: element\n };\n }\n }\n\n /**\n * Ensures that the given value is numeric\n * @param {number}
1 value\n * @return {number}\n */\n function ensureNumeric(value) {\n if (value == null) return 0;else if (typeof value === "number") {\n return value;\n } else if (typeof value === "string") {\n return parseFloat(value);\n } else {\n return 0;\n }\n }\n\n /**\n * Returns true if the given value is some ScrollToOptions\n * @param {number | ScrollToOptions} value\n * @return {value is ScrollToOptions}\n */\n function isScrollToOptions(value) {\n return value != null && _typeof(value) === "object";\n }\n\n /**\n * Handles a scroll method\n * @param {Element|Window} element\n * @param {ScrollMethodName} kind\n * @param {number | ScrollToOptions} optionsOrX\n * @param {number} y\n */\n function handleScrollMethod(element, kind, optionsOrX, y) {\n onScrollWithOptions(getScrollToOptionsWithValidation(optionsOrX, y), element, kind);\n }\n /**\n * Invoked when a \'ScrollToOptions\' dict is provided to \'scroll()\' as the first argument\n * @param {ScrollToOptions} options\n * @param {Element|Window} element\n * @param {ScrollMethodName} kind\n */\n function onScrollWithOptions(options, element, kind) {\n var behavior = getScrollBehavior(element, options);\n // If the behavior is \'auto\' apply instantaneous scrolling\n if (behavior == null || behavior === "auto") {\n getOriginalScrollMethodForKind(kind, element).call(element, options.left, options.top);\n } else {\n smoothScroll(getSmoothScrollOptions(element, options.left, options.top, kind));\n }\n }\n /**\n * Normalizes the given scroll coordinates\n * @param {number?} x\n * @param {number?} y\n * @return {Required<Pick<ScrollToOptions, "top" | "left">>}\n */\n function normalizeScrollCoordinates(x, y) {\n return {\n left: ensureNumeric(x),\n top: ensureNumeric(y)\n };\n }\n /**\n * Gets ScrollToOptions based on the given arguments. Will throw if validation fails\n * @param {number | ScrollToOptions} optionsOrX\n * @param {number} y\n * @return {Required<ScrollToOptions>}\n */\n function getScrollToOptionsWithValidation(optionsOrX, y) {\n // If only one argument is given, and it isn\'t an options object, throw a TypeError\n if (y === undefined && !isScrollToOptions(optionsOrX)) {\n throw new TypeError("Failed to execute \'scroll\' on \'Element\': parameter 1 (\'options\') is not an object.");\n }\n // Scroll based on the primitive values given as arguments\n if (!isScrollToOptions(optionsOrX)) {\n return _assign(_assign({}, normalizeScrollCoordinates(optionsOrX, y)), {\n behavior: "auto"\n });\n }\n // Scroll based on the received options object\n else {\n return _assign(_assign({}, normalizeScrollCoordinates(optionsOrX.left, optionsOrX.top)), {\n behavior: optionsOrX.behavior == null ? "auto" : optionsOrX.behavior\n });\n }\n }\n\n /**\n * Patches the \'scroll\' method on the Element prototype\n */\n function patchElementScroll() {\n Element.prototype.scroll = function (optionsOrX, y) {\n handleScrollMethod(this, "scroll", optionsOrX, y);\n };\n }\n\n /**\n * Patches the \'scrollBy\' method on the Element prototype\n */\n function patchElementScrollBy() {\n Element.prototype.scrollBy = function (optionsOrX, y) {\n handleScrollMethod(this, "scrollBy", optionsOrX, y);\n };\n }\n\n /**\n * Patches the \'scrollTo\' method on the Element prototype\n */\n function patchElementScrollTo() {\n Element.prototype.scrollTo = function (optionsOrX, y) {\n handleScrollMethod(this, "scrollTo", optionsOrX, y);\n };\n }\n\n /**\n * Patches the \'scroll\' method on the Window prototype\n */\n function patchWindowScroll() {\n window.scroll = function (optionsOrX, y) {\n handleScrollMethod(this, "scroll", optionsOrX, y);\n };\n }\n\n /**\n * Patches the \'scrollBy\' method on the Window prototype\n */\n function patchWindowScrollBy() {\n window.scrollBy = function (optionsOrX, y) {\n handleScrollMethod(this, "scrollBy", optionsOrX, y);\n };\n }\n\n /**\n * Patches the \'scrollTo\' method on the Window prototype\n */\n function patchWindowScrollTo() {\n window.scrollTo = function (optionsOrX, y) {\n handleScrollMethod(this, "scrollTo", optionsOrX, y);\n };\n }\n\n // tslint:disable:no-any\n /**\n * Gets the parent of an element, taking into account DocumentFragments, ShadowRoots, as well as the root context (window)\n * @param {EventTarget} currentElement\n * @returns {EventTarget | null}\n */\n function getParent(currentElement) {\n if ("nodeType" in currentElement && currentElement.nodeType === 1) {\n return currentElement.parentNode;\n }\n if ("ShadowRoot" in window && currentElement instanceof window.ShadowRoot) {\n return currentElement.host;\n } else if (currentElement === document) {\n return window;\n } else if (currentElement instanceof Node) return currentElement.parentNode;\n return null;\n }\n\n /**\n * Returns true if the given overflow property represents a scrollable overflow value\
1n * @param {string | null} overflow\n * @return {boolean}\n */\n function canOverflow(overflow) {\n return overflow !== "visible" && overflow !== "clip";\n }\n /**\n * Returns true if the given element is scrollable\n * @param {Element} element\n * @return {boolean}\n */\n function isScrollable(element) {\n if (element.clientHeight < element.scrollHeight || element.clientWidth < element.scrollWidth) {\n var style = getComputedStyle(element, null);\n return canOverflow(style.overflowY) || canOverflow(style.overflowX);\n }\n return false;\n }\n /**\n * Finds the nearest ancestor of an element that can scroll\n * @param {Element} target\n * @returns {Element|Window?}\n */\n function findNearestAncestorsWithScrollBehavior(target) {\n var currentElement = target;\n var scrollingElement = getScrollingElement();\n while (currentElement != null) {\n var behavior = getScrollBehavior(currentElement);\n if (behavior != null && (currentElement === scrollingElement || isScrollable(currentElement))) {\n return [currentElement, behavior];\n }\n var parent_1 = getParent(currentElement);\n currentElement = parent_1;\n }\n // No such element could be found. Start over, but this time find the nearest ancestor that can simply scroll\n currentElement = target;\n while (currentElement != null) {\n if (currentElement === scrollingElement || isScrollable(currentElement)) {\n return [currentElement, "auto"];\n }\n var parent_2 = getParent(currentElement);\n currentElement = parent_2;\n }\n // Default to the scrolling element\n return [scrollingElement, "auto"];\n }\n\n // tslint:disable:no-any\n /**\n * Finds the nearest root from an element\n * @param {Element} target\n * @returns {Document|ShadowRoot}\n */\n function findNearestRoot(target) {\n var currentElement = target;\n while (currentElement != null) {\n if ("ShadowRoot" in window && currentElement instanceof window.ShadowRoot) {\n // Assume this is a ShadowRoot\n return currentElement;\n }\n var parent_1 = getParent(currentElement);\n if (parent_1 === currentElement) {\n return document;\n }\n currentElement = parent_1;\n }\n return document;\n }\n\n /**\n * Gets the origin of the given Location or HTMLAnchorElement if available in the runtime, and otherwise shims it. (it\'s a one-liner)\n * @returns {string}\n */\n function getLocationOrigin(locationLike) {\n if (locationLike === void 0) {\n locationLike = location;\n }\n if ("origin" in locationLike && locationLike.origin != null) {\n return locationLike.origin;\n }\n var port = locationLike.port != null && locationLike.port.length > 0 ? ":" + locationLike.port : "";\n if (locationLike.protocol === "http:" && port === ":80") {\n port = "";\n } else if (locationLike.protocol === "https:" && port === ":443") {\n port = "";\n }\n return locationLike.protocol + "//" + locationLike.hostname + port;\n }\n\n /**\n * A Regular expression that matches id\'s of the form "#[digit]"\n * @type {RegExp}\n */\n var ID_WITH_LEADING_DIGIT_REGEXP = /^#\\d/;\n /**\n * Catches anchor navigation to IDs within the same root and ensures that they can be smooth-scrolled\n * if the scroll behavior is smooth in the first rooter within that context\n */\n function catchNavigation() {\n // Listen for \'click\' events globally\n window.addEventListener("click", function (e) {\n // Only work with trusted events on HTMLAnchorElements\n if (!e.isTrusted || !(e.target instanceof HTMLAnchorElement)) return;\n var _a = e.target,\n pathname = _a.pathname,\n search = _a.search,\n hash = _a.hash;\n var pointsToCurrentPage = getLocationOrigin(e.target) === getLocationOrigin(location) && pathname === location.pathname && search === location.search;\n // Only work with HTMLAnchorElements that navigates to a specific ID on the current page\n if (!pointsToCurrentPage || hash == null || hash.length < 1) {\n return;\n }\n // Find the nearest root, whether it be a ShadowRoot or the document itself\n var root = findNearestRoot(e.target);\n // Attempt to match the selector from that root. querySelector\' doesn\'t support IDs that start with a digit, so work around that limitation\n var elementMatch = hash.match(ID_WITH_LEADING_DIGIT_REGEXP) != null ? root.getElementById(hash.slice(1)) : root.querySelector(hash);\n // If no selector could be found, don\'t proceed\n if (elementMatch == null) return;\n // Find the nearest ancestor that can be scrolled\n var _b = __read(findNearestAncestorsWithScrollBehavior(elementMatch), 2),\n behavior = _b[1];\n // If the behavior isn\'t smooth, don\'t proceed\n if (behavior !== "smooth") return;\n // Otherwise, first prevent the default action.\n e.preventDefault();\n // Now, scroll to the element with that ID\n elementMatch.scrollIntoView({\n behavior: behavior\n });\n });\n }\n var ELEMENT_ORIGINAL_SCROLL_INTO_VIEW = UNSUPPORTED_ENVIRONMENT ? undefined : Element.prototype.scrollIntoView;\n\n /**\n * The majority of this file is based on https://github.com/stipsan/compute-scroll-into-view (MIT license),\n * but has been rewritten to accept a scroller as an argument.\n */\n /**\n * Find out which edge to align against when logical scroll position is "nearest"\n * Interesting fact: "nearest" works similarly to "if-needed", if the element is fully visible it will not scroll it\n *\n * Legends:\n * ââââââââââ â â â â â\n * â target â frame\n * ââââââââââ â â â â â\n */\n function alignNearest(scrollingEdgeStart, scrollingEdgeEnd, scrollingSize, scrollingBorderStart, scrollingBorderEnd, elementEdgeStart, elementEdgeEnd, elementSize) {\n /**\n * If element edge A and element edge B are both outside scrolling box edge A and scrolling box edge B\n *\n * ââââ\n * ââââââââ\n * â â\n * â â â â do nothing\n * â â\n * ââââââââ\n * ââââ\n *\n * If element edge C and element edge D are both outside scrolling box edge C and scrolling box edge D\n *\n * â â â â â â\n * âââââââââââââ\n * ââ ââ do nothing\n * âââââââââââââ\n * â â â â â â\n */\n if (elementEdgeStart < scrollingEdgeStart && elementEdgeEnd > scrollingEdgeEnd || elementEdgeStart > scrollingEdgeStart && elementEdgeEnd < scrollingEdgeEnd) {\n return 0;\n }\n /**\n * If element edge A is outside scrolling box edge A and element height is less than scrolling box he
1ight\n *\n * ââââ\n * ââââââââ ââââââââ\n * ââââ â â\n * from â â to â ââââ â\n *\n * ââ ââ ââ ââ ââ ââ\n *\n * If element edge B is outside scrolling box edge B and element height is greater than scrolling box height\n *\n * ââ ââ ââ ââââââââ\n * â â\n * from â ââââ â to â â â â\n * â â â â\n * ââââââââ ââââââââ\n * â â ââââ\n * â â\n * ââââ\n *\n * If element edge C is outside scrolling box edge C and element width is less than scrolling box width\n *\n * from to\n * â â â â â â â â â â â â\n * âââââ âââââ\n * â â â â â â â\n * âââââ âââââ\n * â â â â â â â â â â â â\n *\n * If element edge D is outside scrolling box edge D and element width is greater than scrolling box width\n *\n * from to\n * â â â â â â â â â â â â\n * âââââââââââââ âââââââââââââ\n * â â â â â â â\n * âââââââââââââ âââââââââââââ\n * â â â â â â â â â â â â\n */\n if (elementEdgeStart <= scrollingEdgeStart && elementSize <= scrollingSize || elementEdgeEnd >= scrollingEdgeEnd && elementSize >= scrollingSize) {\n return elementEdgeStart - scrollingEdgeStart - scrollingBorderStart;\n }\n /**\n * If element edge B is outside scrolling box edge B and element height is less than scrolling box height\n *\n * ââ ââ ââ ââ ââ ââ\n *\n * from â â to â ââââ â\n * ââââ â â\n * ââââââââ ââââââââ\n * ââââ\n *\n * If element edge A is outside scrolling box edge A and element height is greater than scrolling box height\n *\n * ââââ\n * â â\n * â â ââââ\n * ââââââââ ââââââââ\n * â â â â\n * from â ââââ â to â â â â\n * â â\n * ââ ââ ââ ââââââââ\n *\n * If element edge C is outside scrolling box edge C and element width is greater than scrolling box width\n *\n * from to\n * â â â â â â â â â â â â\n * âââââââââââââ âââââââââââââ\n * â â â â â â â\n * âââââââââââââ âââââââââââââ\n * â â â â â â â â â â â â\n *\n * If element edge D is outside scrolling box edge D and element width is less than scrolling box width\n *\n * from to\n * â â â â â â â â â â â â\n * âââââ âââââ\n * â â â â â â â\n * âââââ âââââ\n * â â â â â â â â â â â â\n *\n */\n if (elementEdgeEnd > scrollingEdgeEnd && elementSize < scrollingSize || elementEdgeStart < scrollingEdgeStart && elementSize > scrollingSize) {\n return elementEdgeEnd - scrollingEdgeEnd + scrollingBorderEnd;\n }\n return 0;\n }\n function computeScrollIntoView(target, scroller, options) {\n var block = options.block,\n inline = options.inline;\n // Used to handle the top most element that can be scrolled\n var scrollingElement = getScrollingElement();
1\n // Support pinch-zooming properly, making sure elements scroll into the visual viewport\n // Browsers that don\'t support visualViewport will report the layout viewport dimensions on document.documentElement.clientWidth/Height\n // and viewport dimensions on window.innerWidth/Height\n // https://www.quirksmode.org/mobile/viewports2.html\n // https://bokand.github.io/viewport/index.html\n var viewportWidth = window.visualViewport != null ? visualViewport.width : innerWidth;\n var viewportHeight = window.visualViewport != null ? visualViewport.height : innerHeight;\n var viewportX = window.scrollX != null ? window.scrollX : window.pageXOffset;\n var viewportY = window.scrollY != null ? window.scrollY : window.pageYOffset;\n var _a = target.getBoundingClientRect(),\n targetHeight = _a.height,\n targetWidth = _a.width,\n targetTop = _a.top,\n targetRight = _a.right,\n targetBottom = _a.bottom,\n targetLeft = _a.left;\n // These values mutate as we loop through and generate scroll coordinates\n var targetBlock = block === "start" || block === "nearest" ? targetTop : block === "end" ? targetBottom : targetTop + targetHeight / 2; // block === \'center\n var targetInline = inline === "center" ? targetLeft + targetWidth / 2 : inline === "end" ? targetRight : targetLeft; // inline === \'start || inline === \'nearest\n var _b = scroller.getBoundingClientRect(),\n height = _b.height,\n width = _b.width,\n top = _b.top,\n right = _b.right,\n bottom = _b.bottom,\n left = _b.left;\n var frameStyle = getComputedStyle(scroller);\n var borderLeft = parseInt(frameStyle.borderLeftWidth, 10);\n var borderTop = parseInt(frameStyle.borderTopWidth, 10);\n var borderRight = parseInt(frameStyle.borderRightWidth, 10);\n var borderBottom = parseInt(frameStyle.borderBottomWidth, 10);\n var blockScroll = 0;\n var inlineScroll = 0;\n // The property existance checks for offset[Width|Height] is because only HTMLElement objects have them, but any Element might pass by here\n // @TODO find out if the "as HTMLElement" overrides can be dropped\n var scrollbarWidth = "offsetWidth" in scroller ? scroller.offsetWidth - scroller.clientWidth - borderLeft - borderRight : 0;\n var scrollbarHeight = "offsetHeight" in scroller ? scroller.offsetHeight - scroller.clientHeight - borderTop - borderBottom : 0;\n if (scrollingElement === scroller) {\n // Handle viewport logic (document.documentElement or document.body)\n if (block === "start") {\n blockScroll = targetBlock;\n } else if (block === "end") {\n blockScroll = targetBlock - viewportHeight;\n } else if (block === "nearest") {\n blockScroll = alignNearest(viewportY, viewportY + viewportHeight, viewportHeight, borderTop, borderBottom, viewportY + targetBlock, viewportY + targetBlock + targetHeight, targetHeight);\n } else {\n // block === \'center\' is the default\n blockScroll = targetBlock - viewportHeight / 2;\n }\n if (inline === "start") {\n inlineScroll = targetInline;\n } else if (inline === "center") {\n inlineScroll = targetInline - viewportWidth / 2;\n } else if (inline === "end") {\n inlineScroll = targetInline - viewportWidth;\n } else {\n // inline === \'nearest\' is the default\n inlineScroll = alignNearest(viewportX, viewportX + viewportWidth, viewportWidth, borderLeft, borderRight, viewportX + targetInline, viewportX + targetInline + targetWidth, targetWidth);\n }\n // Apply scroll position offsets and ensure they are within bounds\n // @TODO add more test cases to cover this 100%\n blockScroll = Math.max(0, blockScroll + viewportY);\n inlineScroll = Math.max(0, inlineScroll + viewportX);\n } else {\n // Handle each scrolling frame that might exist between the target and the viewport\n if (block === "start") {\n blockScroll = targetBlock - top - borderTop;\n } else if (block === "end") {\n blockScroll = targetBlock - bottom + borderBottom + scrollbarHeight;\n } else if (block === "nearest") {\n blockScroll = alignNearest(top, bottom, height, borderTop, borderBottom + scrollbarHeight, targetBlock, targetBlock + targetHeight, targetHeight);\n } else {\n // block === \'center\' is the default\n blockScroll = targetBlock - (top + height / 2) + scrollbarHeight / 2;\n }\n if (inline === "start") {\n inlineScroll = targetInline - left - borderLeft;\n } else if (inline === "center") {\n inlineScroll = targetInline - (left + width / 2) + scrollbarWidth / 2;\n } else if (inline === "end") {\n inlineScroll = targetInline - right + borderRight + scrollbarWidth;\n } else {\n // inline === \'nearest\' is the default\n inlineScroll = alignNearest(left, right, width, borderLeft, borderRight + scrollbarWidth, targetInline, targetInline + targetWidth, targetWidth);\n }\n var scrollLeft = scroller.scrollLeft,\n scrollTop = scroller.scrollTop;\n // Ensure scroll coordinates are not out of bounds while applying scroll offsets\n blockScroll = Math.max(0, Math.min(scrollTop + blockScroll, scroller.scrollHeight - height + scrollbarHeight));\n inlineScroll = Math.max(0, Math.min(scrollLeft + inlineScroll, scroller.scrollWidth - width + scrollbarWidth));\n }\n return {\n top: blockScroll,\n left: inlineScroll\n };\n }\n\n /**\n * Patches the \'scrollIntoView\' method on the Element prototype\n */\n function patchElementScrollIntoView() {\n Element.prototype.scrollIntoView = function (arg) {\n var normalizedOptions = arg == null || arg === true ? {\n block: "start",\n inline: "nearest"\n } : arg === false ? {\n block: "end",\n inline: "nearest"\n } : arg;\n // Find the nearest ancestor that can be scrolled\n var _a = __read(findNearestAncestorsWithScrollBehavior(this), 2),\n ancestorWithScroll = _a[0],\n ancestorWithScrollBehavior = _a[1];\n var behavior = normalizedOptions.behavior != null ? normalizedOptions.behavior : ancestorWithScrollBehavior;\n // If the behavior isn\'t smooth, simply invoke the original implementation and do no more\n if (behavior !== "smooth") {\n // Assert that \'scrollIntoView\' is actually defined\n if (ELEMENT_ORIGINAL_SCROLL_INTO_VIEW != null) {\n ELEMENT_ORIGINAL_SCROLL_INTO_VIEW.call(this, normalizedOptions);\n }\n // Otherwise, invoke \'scrollTo\' instead and provide the scroll coordinates\n else {\n var _b = computeScrollIntoView(this, ancestorWithScroll, normalizedOptions),\n top_1 = _b.top,\n left = _b.left;\n getOriginalScrollMethodForKind("scrollTo", this).call(this, left, top_1);\n }\n return;\n }\n ancestorWithScroll.scrollTo(_assign({\n behavior: behavior\n }, computeScrollIntoView(this, ancestorWithScroll, normalizedOptions)));\n };\n // On IE11, HTMLElement has its own declaration of scrollIntoView and does not inherit this from the prototype chain, so we\'ll need to patch that one too.\n if (HTMLElement.prototype.scrollIntoView != null && HTMLElement.prototype.scrollIntoView !== Element.prototype.scrollIntoView) {\n HTMLElement.prototype.scrollIntoView = Element.prototype.scrollIntoView;\n }\n }\n var ELEMENT_ORIGINAL_SCROLL_TOP_SET_DESCRIPTOR = UNSUPPORTED_ENVIRONMENT ? undefined : Object.getOwnPropertyDescriptor(Element.prototype, "scrollTop").set;\n\n /**\n * Patches the \'scrollTop\' property descriptor on the Element prototype\n */\n function patchElementScrollTop() {\n Object.defineProperty(Element.prototype, "scrollTop", {\n set: function set(scrollTop) {\n if (this.__adjustingScrollPosition) {\n return ELEMENT_ORIGINAL_SCROLL_TOP_SET_DESCRIPTOR.call(this, scrollTop);\n }\n handleScrollMethod(this, "scrollTo", this.scrollLeft, scrollTop);\n return scrollTop;\n }\n });\n }\n var ELEMENT_ORIGINAL_SCROLL_LEFT_SET_DESCRIPTOR = UNSUPPORTED_ENVIRONMENT ? undefined : Object.getOwnPropertyDescriptor(Element.prototype, "scrollLeft").set;\n\n /**\n * Patches the \'scrollLeft\' property descriptor on the Element prototype\n */\n function patchElementScrollLeft() {\n Object.defineProperty(Element.prototype, "scrollLeft", {\n set: function set(scrollLeft) {\n if (this.__adjustingScrollPosition) {\n return ELEMENT_ORIGINAL_SCROLL_LEFT_SET_DESCRIPTOR.call(this, scrollLeft);\n }\n handleScrollMethod(this, "scrollTo", scrollLeft, this.scrollTop);\n return scrollLeft;\n }\n });\n }\n\n /**\n * Applies the polyfill\n */\n function patch() {\n // Element.prototype methods\n patchElementScroll();\n patchElementScrollBy();\n patchElementScrollTo();\n patchElementScrollIntoView();\n // Element.prototype descriptors\n patchElementScrollLeft();\n patchElementScrollTop();\n // window methods\n patchWindowScroll();\n patchWindowScrollBy();\n patchWindowScrollTo();\n // Navigation\n catchNavigation();\n }\n\n /**\n * Is true if the browser natively supports the Element.prototype.[scroll|scrollTo|scrollBy|scrollIntoView] methods\n * @type {boolean}\n */\n var SUPPORTS_ELEMENT_PROTOTYPE_SCROLL_METHODS = UNSUPPORTED_ENVIRONMENT ? false : "scroll" in Element.prototype && "scrollTo" in Element.prototype && "scrollBy" in Element.prototype && "scrollIntoView" in Element.prototype;\n if (!UNSUPPORTED_ENVIRONMENT && (!SUPPORTS_SCROLL_BEHAVIOR || !SUPPORTS_ELEMENT_PROTOTYPE_SCROLL_METHODS)) {\n patch();\n }\n})();//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNzY3LmpzIiwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E
17QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9wb3Rhc2xpbS8uL25vZGVfbW9kdWxlcy9zY3JvbGwtYmVoYXZpb3ItcG9seWZpbGwvZGlzdC9pbmRleC5qcz8yM2MwIl0sInNvdXJjZXNDb250ZW50IjpbImZ1bmN0aW9uIF90eXBlb2Yob2JqKSB7IFwiQGJhYmVsL2hlbHBlcnMgLSB0eXBlb2ZcIjsgcmV0dXJuIF90eXBlb2YgPSBcImZ1bmN0aW9uXCIgPT0gdHlwZW9mIFN5bWJvbCAmJiBcInN5bWJvbFwiID09IHR5cGVvZiBTeW1ib2wuaXRlcmF0b3IgPyBmdW5jdGlvbiAob2JqKSB7IHJldHVybiB0eXBlb2Ygb2JqOyB9IDogZnVuY3Rpb24gKG9iaikgeyByZXR1cm4gb2JqICYmIFwiZnVuY3Rpb25cIiA9PSB0eXBlb2YgU3ltYm9sICYmIG9iai5jb25zdHJ1Y3RvciA9PT0gU3ltYm9sICYmIG9iaiAhPT0gU3ltYm9sLnByb3RvdHlwZSA/IFwic3ltYm9sXCIgOiB0eXBlb2Ygb2JqOyB9LCBfdHlwZW9mKG9iaik7IH1cbihmdW5jdGlvbiAoKSB7XG4gICd1c2Ugc3RyaWN0JztcblxuICB2YXIgVU5TVVBQT1JURURfRU5WSVJPTk1FTlQgPSB0eXBlb2Ygd2luZG93ID09PSBcInVuZGVmaW5lZFwiO1xuXG4gIC8qKlxuICAgKiBJcyB0cnVlIGlmIHRoZSBicm93c2VyIG5hdGl2ZWx5IHN1cHBvcnRzIHRoZSAnc2Nyb2xsLWJlaGF2aW9yJyBDU1MtcHJvcGVydHkuXG4gICAqIEB0eXBlIHtib29sZWFufVxuICAgKi9cbiAgdmFyIFNVUFBPUlRTX1NDUk9MTF9CRUhBVklPUiA9IFVOU1VQUE9SVEVEX0VOVklST05NRU5UID8gZmFsc2UgOiBcInNjcm9sbEJlaGF2aW9yXCIgaW4gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnN0eWxlO1xuXG4gIC8qISAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxyXG4gIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxyXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7IHlvdSBtYXkgbm90IHVzZVxyXG4gIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlXHJcbiAgTGljZW5zZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcclxuICAgIFRISVMgQ09ERSBJUyBQUk9WSURFRCBPTiBBTiAqQVMgSVMqIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTllcclxuICBLSU5ELCBFSVRIRVIgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgV0lUSE9VVCBMSU1JVEFUSU9OIEFOWSBJTVBMSUVEXHJcbiAgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIFRJVExFLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSxcclxuICBNRVJDSEFOVEFCTElUWSBPUiBOT04tSU5GUklOR0VNRU5ULlxyXG4gICAgU2VlIHRoZSBBcGFjaGUgVmVyc2lvbiAyLjAgTGljZW5zZSBmb3Igc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zXHJcbiAgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxyXG4gICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovXG5cbiAgdmFyIF9hc3NpZ24gPSBmdW5jdGlvbiBfX2Fzc2lnbigpIHtcbiAgICBfYXNzaWduID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiBfX2Fzc2lnbih0KSB7XG4gICAgICBmb3IgKHZhciBzLCBpID0gMSwgbiA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBuOyBpKyspIHtcbiAgICAgICAgcyA9IGFyZ3VtZW50c1tpXTtcbiAgICAgICAgZm9yICh2YXIgcCBpbiBzKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApKSB0W3BdID0gc1twXTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0O1xuICAgIH07XG4gICAgcmV0dXJuIF9hc3NpZ24uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgfTtcbiAgZnVuY3Rpb24gX19yZWFkKG8sIG4pIHtcbiAgICB2YXIgbSA9IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBvW1N5bWJvbC5pdGVyYXRvcl07XG4gICAgaWYgKCFtKSByZXR1cm4gbztcbiAgICB2YXIgaSA9IG0uY2FsbChvKSxcbiAgICAgIHIsXG4gICAgICBhciA9IFtdLFxuICAgICAgZTtcbiAgICB0cnkge1xuICAgICAgd2hpbGUgKChuID09PSB2b2lkIDAgfHwgbi0tID4gMCkgJiYgIShyID0gaS5uZXh0KCkpLmRvbmUpIGFyLnB1c2goci52YWx1ZSk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGUgPSB7XG4gICAgICAgIGVycm9yOiBlcnJvclxuICAgICAgfTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKHIgJiYgIXIuZG9uZSAmJiAobSA9IGlbXCJyZXR1cm5cIl0pKSBtLmNhbGwoaSk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBpZiAoZSkgdGhyb3cgZS5lcnJvcjtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGFyO1xuICB9XG4gIGZ1bmN0aW9uIGdldFNjcm9sbGluZ0VsZW1lbnQoKSB7XG4gICAgaWYgKGRvY3VtZW50LnNjcm9sbGluZ0VsZW1lbnQgIT0gbnVsbCkge1xuICAgICAgcmV0dXJuIGRvY3VtZW50LnNjcm9sbGluZ0VsZW1lbnQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybi
1Bkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7XG4gICAgfVxuICB9XG4gIHZhciBTVFlMRV9BVFRSSUJVVEVfUFJPUEVSVFlfTkFNRSA9IFwic2Nyb2xsLWJlaGF2aW9yXCI7XG4gIHZhciBTVFlMRV9BVFRSSUJVVEVfUFJPUEVSVFlfUkVHRVhQID0gbmV3IFJlZ0V4cChTVFlMRV9BVFRSSUJVVEVfUFJPUEVSVFlfTkFNRSArIFwiOlxcXFxzKihbXjtdKilcIik7XG4gIC8qKlxuICAgKiBHaXZlbiBhbiBFbGVtZW50LCB0aGlzIGZ1bmN0aW9uIGFwcGVuZHMgdGhlIGdpdmVuIFNjcm9sbEJlaGF2aW9yIENTUyBwcm9wZXJ0eSB2YWx1ZSB0byB0aGUgZWxlbWVudHMnICdzdHlsZScgYXR0cmlidXRlLlxuICAgKiBJZiBpdCBkb2VzbnQgYWxyZWFkeSBoYXZlIG9uZSwgaXQgd2lsbCBhZGQgaXQuXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbWVudFxuICAgKiBAcGFyYW0ge1Njcm9sbEJlaGF2aW9yfSBiZWhhdmlvclxuICAgKi9cbiAgZnVuY3Rpb24gYXBwZW5kU2Nyb2xsQmVoYXZpb3JUb1N0eWxlQXR0cmlidXRlKGVsZW1lbnQsIGJlaGF2aW9yKSB7XG4gICAgdmFyIGFkZGl0aW9uID0gU1RZTEVfQVRUUklCVVRFX1BST1BFUlRZX05BTUUgKyBcIjpcIiArIGJlaGF2aW9yO1xuICAgIHZhciBhdHRyaWJ1dGVWYWx1ZSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKFwic3R5bGVcIik7XG4gICAgaWYgKGF0dHJpYnV0ZVZhbHVlID09IG51bGwgfHwgYXR0cmlidXRlVmFsdWUgPT09IFwiXCIpIHtcbiAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKFwic3R5bGVcIiwgYWRkaXRpb24pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyBUaGUgc3R5bGUgYXR0cmlidXRlIG1heSBhbHJlYWR5IGluY2x1ZGUgYSAnc2Nyb2xsLWJlaGF2aW9yOjxzb21ldGhpbmc+JyBpbiB3aGljaCBjYXNlIHRoYXQgc2hvdWxkIGJlIHJlcGxhY2VkXG4gICAgdmFyIGV4aXN0aW5nVmFsdWVGb3JQcm9wZXJ0eSA9IHBhcnNlU2Nyb2xsQmVoYXZpb3JGcm9tU3R5bGVBdHRyaWJ1dGUoZWxlbWVudCk7XG4gICAgaWYgKGV4aXN0aW5nVmFsdWVGb3JQcm9wZXJ0eSAhPSBudWxsKSB7XG4gICAgICB2Y
1XIgcmVwbGFjZW1lbnRQcm9wZXJ0eSA9IFNUWUxFX0FUVFJJQlVURV9QUk9QRVJUWV9OQU1FICsgXCI6XCIgKyBleGlzdGluZ1ZhbHVlRm9yUHJvcGVydHk7XG4gICAgICAvLyBSZXBsYWNlIHRoZSB2YXJpYW50IHRoYXQgZW5kcyB3aXRoIGEgc2VtaS1jb2xvbiB3aGljaCBpdCBtYXlcbiAgICAgIGF0dHJpYnV0ZVZhbHVlID0gYXR0cmlidXRlVmFsdWUucmVwbGFjZShyZXBsYWNlbWVudFByb3BlcnR5ICsgXCI7XCIsIFwiXCIpO1xuICAgICAgLy8gUmVwbGFjZSB0aGUgdmFyaWFudCB0aGF0ICpkb2Vzbid0KiBlbmQgd2l0aCBhIHNlbWktY29sb25cbiAgICAgIGF0dHJpYnV0ZVZhbHVlID0gYXR0cmlidXRlVmFsdWUucmVwbGFjZShyZXBsYWNlbWVudFByb3BlcnR5LCBcIlwiKTtcbiAgICB9XG4gICAgLy8gTm93LCBhcHBlbmQgdGhlIGJlaGF2aW9yIHRvIHRoZSBzdHJpbmcuXG4gICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoXCJzdHlsZVwiLCBhdHRyaWJ1dGVWYWx1ZS5lbmRzV2l0aChcIjtcIikgPyBcIlwiICsgYXR0cmlidXRlVmFsdWUgKyBhZGRpdGlvbiA6IFwiO1wiICsgYXR0cmlidXRlVmFsdWUgKyBhZGRpdGlvbik7XG4gIH1cbiAgLyoqXG4gICAqIEdpdmVuIGFuIEVsZW1lbnQsIHRoaXMgZnVuY3Rpb24gYXR0ZW1wdHMgdG8gcGFyc2UgaXRzICdzdHlsZScgYXR0cmlidXRlIChpZiBpdCBoYXMgb25lKScgdG8gZXh0cmFjdFxuICAgKiBhIHZhbHVlIGZvciB0aGUgJ3Njcm9sbC1iZWhhdmlvcicgQ1NTIHByb3BlcnR5IChpZiBpdCBpcyBnaXZlbiB3aXRoaW4gdGhhdCBzdHlsZSBhdHRyaWJ1dGUpXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbWVudFxuICAgKiBAcmV0dXJucyB7U2Nyb2xsQmVoYXZpb3I/fVxuICAgKi9cbiAgZnVuY3Rpb24gcGFyc2VTY3JvbGxCZWhhdmlvckZyb21TdHlsZUF0dHJpYnV0ZShlbGVtZW50KSB7XG4gICAgdmFyIHN0eWxlQXR0cmlidXRlVmFsdWUgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShcInN0eWxlXCIpO1xuICAgIGlmIChzdHlsZUF0dHJpYnV0ZVZhbHVlICE9IG51bGwgJiYgc3R5bGVBdHRyaWJ1dGVWYWx1ZS5pbmNsdWRlcyhTVFlMRV9BVFRSSUJVVEVfUFJPUEVSVFlfTkFNRSkpIHtcbiAgICAgIHZhciBtYXRjaCA9IHN0eWxlQXR0cmlidXRlVmFsdWUubWF0Y2goU1RZTEVfQVRUUklCVVRFX1BST1BFUlRZX1JFR0VYUCk7XG4gICAgICBpZiAobWF0Y2ggIT0gbnVsbCkge1xuICAgICAgICB2Y
1XIgX2EgPSBfX3JlYWQobWF0Y2gsIDIpLFxuICAgICAgICAgIGJlaGF2aW9yID0gX2FbMV07XG4gICAgICAgIGlmIChiZWhhdmlvciAhPSBudWxsICYmIGJlaGF2aW9yICE9PSBcIlwiKSB7XG4gICAgICAgICAgcmV0dXJuIGJlaGF2aW9yO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgdmFyIHN0eWxlRGVjbGFyYXRpb25Qcm9wZXJ0eU5hbWUgPSBcInNjcm9sbEJlaGF2aW9yXCI7XG4gIC8qKlxuICAgKiBEZXRlcm1pbmVzIHRoZSBzY3JvbGwgYmVoYXZpb3IgdG8gdXNlLCBkZXBlbmRpbmcgb24gdGhlIGdpdmVuIFNjcm9sbE9wdGlvbnMgYW5kIHRoZSBwb3NpdGlvbiBvZiB0aGUgRWxlbWVudFxuICAgKiB3aXRoaW4gdGhlIERPTVxuICAgKiBAcGFyYW0ge0VsZW1lbnR8SFRNTEVsZW1lbnR8V2luZG93fSBpbnB1dFRhcmdldFxuICAgKiBAcGFyYW0ge1Njcm9sbE9wdGlvbnN9IFtvcHRpb25zXVxuICAgKiBAcmV0dXJucyB7U2Nyb2xsQmVoYXZpb3J9XG4gICAqL1xuICBmdW5jdGlvbiBnZXRTY3JvbGxCZWhhdmlvcihpbnB1dFRhcmdldCwgb3B0aW9ucykge1xuICAgIC8vIElmIHRoZSBnaXZlbiAnYmVoYXZpb3InIGlzICdzbW9vdGgnLCBhcHBseSBzbW9vdGggc2Nyb2xsaW5nIG5vIG1hdHRlciB3aGF0XG4gICAgaWYgKG9wdGlvbnMgIT0gbnVsbCAmJiBvcHRpb25zLmJlaGF2aW9yID09PSBcInNtb290aFwiKSByZXR1cm4gXCJzbW9vdGhcIjtcbiAgICB2YXIgdGFyZ2V0ID0gXCJzdHlsZVwiIGluIGlucHV0VGFyZ2V0ID8gaW5wdXRUYXJnZXQgOiBnZXRTY3JvbGxpbmdFbGVtZW50KCk7XG4gICAgdmFyIHZhbHVlO1xuICAgIGlmIChcInN0eWxlXCIgaW4gdGFyZ2V0KSB7XG4gICAgICAvLyBDaGVjayBpZiBzY3JvbGwtYmVoYXZpb3IgaXMgc2V0IGFzIGEgcHJvcGVydHkgb24gdGhlIENTU1N0eWxlRGVjbGFyYXRpb25cbiAgICAgIHZhciBzY3JvbGxCZWhhdmlvclByb3BlcnR5VmFsdWUgPSB0YXJnZXQuc3R5bGVbc3R5bGVEZWNsYXJhdGlvblByb3BlcnR5TmFtZV07XG4gICAgICAvLyBSZXR1cm4gaXQgaWYgaXQgaXMgZ2l2ZW4gYW5kIGhhcyBhIHByb3BlciB2YWx1ZVxuICAgICAgaWYgKHNjcm9sbEJlaGF2aW9yUHJvcGVydHlWYWx1ZSAhPSBudWxsICYmIHNjcm9sbEJlaGF2aW9yUHJvcGVydHlWYWx1ZSAhPT0gXCJcIikge1xuICAgICAgICB2YWx1ZSA9IHNjcm9sbEJlaGF2aW9yUHJvcGVydHlWYWx1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHZhbHVlID09IG51bGwpIHtcbiAgICAgIHZhciBhdHRyaWJ1dGVWYWx1ZSA9IHRhcmdldC5nZXRBdHRyaWJ1dGUoXCJzY3JvbGwtYmVoYXZpb3JcIik7XG4gICAgICBpZiAoYXR0cmlidXRlVmFsdWUgIT0gbnVsbCAmJiBhdHRyaWJ1dGVWYWx1ZSAhPT0gXCJcIikge1xuICAgICAgICB2YWx1ZSA9IGF0dHJpYnV0ZVZhbHVlO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAodmFsdWUgPT0gbnVsbCkge1xuICAgICAgLy8gT3RoZXJ3aXNlLCBjaGVjayBpZiBpdCBpcyBzZXQgYXMgYW4gaW5saW5lIHN0eWxlXG4gICAgICB2YWx1ZSA9IHBhcnNlU2Nyb2xsQmVoYXZpb3JGcm9tU3R5bGVBdHRyaWJ1dGUodGFyZ2V0KTtcbiAgICB9XG4gICAgaWYgKHZhbHVlID09IG51bGwpIHtcbiAgICAgIC8vIFRha2UgdGhlIGNvbXB1dGVkIHN0eWxlIGZvciB0aGUgZWxlbWVudCBhbmQgc2VlIGlmIGl0IGNvbnRhaW5zIGEgc3BlY2lmaWMgJ3Njcm9sbC1iZWhhdmlvcicgdmFsdWVcbiAgICAgIHZhciBjb21wdXRlZFN0eWxlID0gZ2V0Q29tcHV0ZWRTdHlsZSh0YXJnZXQpO1xuICAgICAgdmFyIGNvbXB1dGVkU3R5bGVWYWx1ZSA9IGNvbXB1dGVkU3R5bGUuZ2V0UHJvcGVydHlWYWx1ZShcInNjcm9sbEJlaGF2aW9yXCIpO1xuICAgICAgaWYgKGNvbXB1dGVkU3R5bGVWYWx1ZSAhPSBudWxsICYmIGNvbXB1dGVkU3R5bGVWYWx1ZSAhPT0gXCJcIikge1xuICAgICAgICB2YWx1ZSA9IGNvbXB1dGVkU3R5bGVWYWx1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gSW4gYWxsIG90aGVyIGNhc2VzLCB1c2UgdGhlIHZhbHVlIGZyb20gdGhlIENTU09NXG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG4gIHZhciBIQUxGID0gMC41O1xuICAvKipcbiAgICogVGhlIGVhc2luZyBmdW5jdGlvbiB0byB1c2Ugd2hlbiBhcHBseWluZyB0aGUgc21vb3RoIHNjcm9sbGluZ1xuICAgKiBAcGFyYW0ge251bWJlcn0ga1xuICAgKiBAcmV0dXJucyB7bnVtYmVyfVxuICAgKi9cbiAgZnVuY3Rpb24gZWFzZShrKSB7XG4gICAgcmV0dXJuIEhBTEYgKiAoMSAtIE1hdGguY29zKE1hdGguUEkgKiBrKSk7XG4gIH1cbiAgdmFyIE5PT1AgPSB7XG4gICAgcmVzZXQ6IGZ1bmN0aW9uIHJlc2V0KCkge31cbiAgfTtcbiAgdmFyIG1hcCA9IHR5cGVvZiBXZWFrTWFwID09PSBcInVuZGVmaW5lZFwiID8gdW5kZWZpbmVkIDogbmV3IFdlYWtNYXAoKTtcbiAgZnVuY3Rpb24gZGlzYWJsZVNjcm9sbFNuYXAoc2Nyb2xsZXIpIHtcbiAgICAvLyBJZiBzY3JvbGwtYmVoYXZpb3IgaXMgbmF0aXZlbHkgc3VwcG9ydGVkLCBvciBpZiB0aGVyZSBpcyBubyBuYXRpdmUgV2Vha01hcCBzdXBwb3J0LCB0aGVyZSdzIG5vIG5lZWQgZm9yIHRoaXMgZml4XG4gICAgaWYgKFNVUFBPUlRTX1NDUk9MTF9CRUhBVklPUiB8fCBtYXAgPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIE5PT1A7XG4gICAgfVxuICAgIHZhciBzY3JvbGxpbmdFbGVtZW50ID0gZ2V0U2Nyb2xsaW5nRWxlbWVudCgpO1xuICAgIHZhciBjYWNoZWRTY3JvbGxTbmFwVmFsdWU7XG4gICAgdmFyIGNhY2hlZFNjcm9sbEJlaGF2aW9yU3R5bGVBdHRyaWJ1dGVWYWx1ZTtcbiAgICB2YXIgc2Vjb25kYXJ5U2Nyb2xsZXI7XG4gICAgdmFyIHNlY29uZGFyeVNjcm9sbGVyQ2FjaGVkU2Nyb2xsU25hcFZhbHVlO1xuICAgIHZhciBzZWNvbmRhcnlTY3JvbGxlckNhY2hlZFNjcm9sbEJlaGF2aW9yU3R5bGVBdHRyaWJ1dGVWYWx1ZTtcbiAgICB2YXIgZXhpc3RpbmdSZXN1bHQgPSBtYXAuZ2V0KHNjcm9sbGVyKTtcbiAgICBpZiAoZXhpc3RpbmdSZXN1bHQgIT0gbnVsbCkge1xuICAgICAgY2FjaGVkU2Nyb2xsU25hcFZhbHVlID0gZXhpc3RpbmdSZXN1bHQuY2FjaGVkU2Nyb2xsU25hcFZhbHVlO1xuICAgICAgY2FjaGVkU2Nyb2xsQmVoYXZpb3JTdHlsZUF0dHJpYnV0ZVZhbHVlID0gZXhpc3RpbmdSZXN1bHQuY2FjaGVkU2Nyb2xsQmVoYXZpb3JTdHlsZUF0dHJpYnV0ZVZhbHVlO1xuICAgICAgc2Vjb25kYXJ5U2Nyb2xsZXIgPSBleGlzdGluZ1Jlc3VsdC5zZWNvbmRhcnlTY3JvbGxlcjtcbiAgICAgIHNlY29uZGFyeVNjcm9sbGVyQ2FjaGVkU2Nyb2xsU25hcFZhbHVlID0gZXhpc3RpbmdSZXN1bHQuc2Vjb25kYXJ5U2Nyb2xsZXJDYWNoZWRTY3JvbGxTbmFwVmFsdWU7XG4gICAgICBzZWNvbmRhcnlTY3JvbGxlckNhY2hlZFNjcm9sbEJlaGF2aW9yU3R5bGVBdHRyaWJ1dGVWYWx1ZSA9IGV4aXN0aW5nUmVzdWx0LnNlY29uZGFyeVNjcm9sbGVyQ2FjaGVkU2Nyb2xsQmVoYXZpb3JTdHlsZUF0dHJpYnV0ZVZhbHVlO1xuICAgICAgZXhpc3RpbmdSZXN1bHQucmVsZWFzZSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjYWNoZWRTY3JvbGxTbmFwVmFsdWUgPSBzY3JvbGxlci5zdHlsZS5zY3JvbGxTbmFwVHlwZSA9PT0gXCJcIiA/IG51bGwgOiBzY3JvbGxlci5zdHlsZS5zY3JvbGxTbmFwVHlwZTtcbiAgICAgIGNhY2hlZFNjcm9sbEJlaGF2aW9yU3R5bGVBdHRyaWJ1dGVWYWx1ZSA9IHBhcnNlU2Nyb2xsQmVoYXZpb3JGcm9tU3R5bGVBdHRyaWJ1dGUoc2Nyb2xsZXIpO1xuICAgICAgc2Vjb25kYXJ5U2Nyb2xsZXIgPSBzY3JvbGxlciA9PT0gc2Nyb2xsaW5nRWxlbWVudCAmJiBzY3JvbGxpbmdFbGVtZW50ICE9PSBkb2N1bWVudC5ib2R5ID8gZG9jdW1lbnQuYm9keSA6IHVuZGVmaW5lZDtcbiAgICAgIHNlY29uZGFyeVNjcm9sbGVyQ2FjaGVkU2Nyb2xsU25hcFZhbHVlID0gc2Vjb25kYXJ5U2Nyb2xsZXIgPT0gbnVsbCA/IHVuZGVmaW5lZCA6IHNlY29uZGFyeVNjcm9sbGVyLnN0eWxlLnNjcm9sbFNuYXBUeXBlID09PSBcIlwiID8gbnVsbCA6IHNlY29uZGFyeVNjcm9sbGVyLnN0eWxlLnNjcm9sbFNuYXBUeXBlO1xuICAgICAgc2Vjb25kYXJ5U2Nyb2xsZXJDYWNoZWRTY3JvbGxCZWhhdmlvclN0eWxlQXR0cmlidXRlVmFsdWUgPSBzZWNvbmRhcnlTY3JvbGxlciA9PSBudWxsID8gdW5kZWZpbmVkIDogcGFyc2VTY3JvbGxCZWhhdmlvckZyb21TdHlsZUF0dHJpYnV0ZShzZWNvbmRhcnlTY3JvbGxlcik7XG4gICAgICB2Y
1XIgY2FjaGVkQ29tcHV0ZWRTY3JvbGxTbmFwVmFsdWUgPSBnZXRDb21wdXRlZFN0eWxlKHNjcm9sbGVyKS5nZXRQcm9wZXJ0eVZhbHVlKFwic2Nyb2xsLXNuYXAtdHlwZVwiKTtcbiAgICAgIHZhciBzZWNvbmRhcnlTY3JvbGxlckNhY2hlZENvbXB1dGVkU2Nyb2xsU25hcFZhbHVlID0gc2Vjb25kYXJ5U2Nyb2xsZXIgPT0gbnVsbCA/IHVuZGVmaW5lZCA6IGdldENvbXB1dGVkU3R5bGUoc2Vjb25kYXJ5U2Nyb2xsZXIpLmdldFByb3BlcnR5VmFsdWUoXCJzY3JvbGwtc25hcC10eXBlXCIpO1xuICAgICAgLy8gSWYgaXQganVzdCBzbyBoYXBwZW5zIHRoYXQgdGhlcmUgYWN0dWFsbHkgaXNuJ3QgYW55IHNjcm9sbCBzbmFwcGluZyBnb2luZyBvbiwgdGhlcmUncyBubyBwb2ludCBpbiBwZXJmb3JtaW5nIGFueSBhZGRpdGlvbmFsIHdvcmsgaGVyZS5cbiAgICAgIGlmIChjYWNoZWRDb21wdXRlZFNjcm9sbFNuYXBWYWx1ZSA9PT0gXCJub25lXCIgJiYgc2Vjb25kYXJ5U2Nyb2xsZXJDYWNoZWRDb21wdXRlZFNjcm9sbFNuYXBWYWx1ZSA9PT0gXCJub25lXCIpIHtcbiAgICAgICAgcmV0dXJuIE5PT1A7XG4gICAgICB9XG4gICAgfVxuICAgIHNjcm9sbGVyLnN0eWxlLnNjcm9sbFNuYXBUeXBlID0gXCJub25lXCI7XG4gICAgaWYgKHNlY29uZGFyeVNjcm9sbGVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHNlY29uZGFyeVNjcm9sbGVyLnN0eWxlLnNjcm9sbFNuYXBUeXBlID0gXCJub25lXCI7XG4gICAgfVxuICAgIGlmIChjYWNoZWRTY3JvbGxCZWhhdmlvclN0eWxlQXR0cmlidXRlVmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgYXBwZW5kU2Nyb2xsQmVoYXZpb3JUb1N0eWxlQXR0cmlidXRlKHNjcm9sbGVyLCBjYWNoZWRTY3JvbGxCZWhhdmlvclN0eWxlQXR0cmlidXRlVmFsdWUpO1xuICAgIH1cbiAgICBpZiAoc2Vjb25kYXJ5U2Nyb2xsZXIgIT09IHVuZGVmaW5lZCAmJiBzZWNvbmRhcnlTY3JvbGxlckNhY2hlZFNjcm9sbEJlaGF2aW9yU3R5bGVBdHRyaWJ1dGVWYWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBhcHBlbmRTY3JvbGxCZWhhdmlvclRvU3R5bGVBdHRyaWJ1dGUoc2Vjb25kYXJ5U2Nyb2xsZXIsIHNlY29uZGFyeVNjcm9sbGVyQ2FjaGVkU2Nyb2xsQmVoYXZpb3JTdHlsZUF0dHJpYnV0ZVZhbHVlKTtcbiAgICB9XG4gICAgdmFyIGhhc1JlbGVhc2VkID0gZmFsc2U7XG4gICAgdmFyIGV2ZW50VGFyZ2V0ID0gc2Nyb2xsZXIgPT09IHNjcm9sbGluZ0VsZW1lbnQgPyB3aW5kb3cgOiBzY3JvbGxlcjtcbiAgICBmdW5jdGlvbiByZWxlYXNlKCkge1xuICAgICAgZXZlbnRUYXJnZXQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInNjcm9sbFwiLCByZXNldEhhbmRsZXIpO1xuICAgICAgaWYgKG1hcCAhPSBudWxsKSB7XG4gICAgICAgIG1hcFtcImRlbGV0ZVwiXShzY3JvbGxlcik7XG4gICAgICB9XG4gICAgICBoYXNSZWxlYXNlZCA9IHRydWU7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHJlc2V0SGFuZGxlcigpIHtcbiAgICAgIHNjcm9sbGVyLnN0eWxlLnNjcm9sbFNuYXBUeXBlID0gY2FjaGVkU2Nyb2xsU25hcFZhbHVlO1xuICAgICAgaWYgKHNlY29uZGFyeVNjcm9sbGVyICE9IG51bGwgJiYgc2Vjb25kYXJ5U2Nyb2xsZXJDYWNoZWRTY3JvbGxTbmFwVmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBzZWNvbmRhcnlTY3JvbGxlci5zdHlsZS5zY3JvbGxTbmFwVHlwZSA9IHNlY29uZGFyeVNjcm9sbGVyQ2FjaGVkU2Nyb2xsU25hcFZhbHVlO1xuICAgICAgfVxuICAgICAgaWYgKGNhY2hlZFNjcm9sbEJlaGF2aW9yU3R5bGVBdHRyaWJ1dGVWYWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGFwcGVuZFNjcm9sbEJlaGF2aW9yVG9TdHlsZUF0dHJpYnV0ZShzY3JvbGxlciwgY2FjaGVkU2Nyb2xsQmVoYXZpb3JTdHlsZUF0dHJpYnV0ZVZhbHVlKTtcbiAgICAgIH1cbiAgICAgIGlmIChzZWNvbmRhcnlTY3JvbGxlciAhPT0gdW5kZWZpbmVkICYmIHNlY29uZGFyeVNjcm9sbGVyQ2FjaGVkU2Nyb2xsQmVoYXZpb3JTdHlsZUF0dHJpYnV0ZVZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgYXBwZW5kU2Nyb2xsQmVoYXZpb3JUb1N0eWxlQXR0cmlidXRlKHNlY29uZGFyeVNjcm9sbGVyLCBzZWNvbmRhcnlTY3JvbGxlckNhY2hlZFNjcm9sbEJlaGF2aW9yU3R5bGVBdHRyaWJ1dGVWYWx1ZSk7XG4gICAgICB9XG4gICAgICByZWxlYXNlKCk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHJlc2V0KCkge1xuICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmIChoYXNSZWxlYXNlZCkgcmV0dXJuO1xuICAgICAgICBldmVudFRhcmdldC5hZGRFdmVudExpc3RlbmVyKFwic2Nyb2xsXCIsIHJlc2V0SGFuZGxlcik7XG4gICAgICB9KTtcbiAgICB9XG4gICAgbWFwLnNldChzY3JvbGxlciwge1xuICAgICAgcmVsZWFzZTogcmVsZWFzZSxcbiAgICAgIGNhY2hlZFNjcm9sbFNuYXBWYWx1ZTogY2FjaGVkU2Nyb2xsU25hcFZhbHVlLFxuICAgICAgY2FjaGVkU2Nyb2xsQmVoYXZpb3JTdHlsZUF0dHJpYnV0ZVZhbHVlOiBjYWNoZWRTY3JvbGxCZWhhdmlvclN0eWxlQXR0cmlidXRlVmFsdWUsXG4gICAgICBzZWNvbmRhcnlTY3JvbGxlcjogc2Vjb25kYXJ5U2Nyb2xsZXIsXG4gICAgICBzZWNvbmRhcnlTY3JvbGxlckNhY2hlZFNjcm9sbFNuYXBWYWx1ZTogc2Vjb25kYXJ5U2Nyb2xsZXJDYWNoZWRTY3JvbGxTbmFwVmFsdWUsXG4gICAgICBzZWNvbmRhcnlTY3JvbGxlckNhY2hlZFNjcm9sbEJlaGF2aW9yU3R5bGVBdHRyaWJ1dGVWYWx1ZTogc2Vjb25kYXJ5U2Nyb2xsZXJDYWNoZWRTY3JvbGxCZWhhdmlvclN0eWxlQXR0cmlidXRlVmFsdWVcbiAgICB9KTtcbiAgICByZXR1cm4ge1xuICAgICAgcmVzZXQ6IHJlc2V0XG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgZHVyYXRpb24gb2YgYSBzbW9vdGggc2Nyb2xsXG4gICAqIEB0eXBlIHtudW1iZXJ9XG4gICAqL1xuICB2YXIgU0NST0xMX1RJTUUgPSAxNTAwMDtcbiAgLyoqXG4gICAqIFBlcmZvcm1zIGEgc21vb3RoIHJlcG9zaXRpb25pbmcgb2YgdGhlIHNjcm9sbFxuICAgKiBAcGFyYW0ge0lTbW9vdGhTY3JvbGxPcHRpb25zfSBvcHRpb25zXG4gICAqL1xuICBmdW5jdGlvbiBzbW9vdGhTY3JvbGwob3B0aW9ucykge1xuICAgIHZhciBzdGFydFRpbWUgPSBvcHRpb25zLnN0YXJ0VGltZSxcbiAgICAgIHN0YXJ0WCA9IG9wdGlvbnMuc3RhcnRYLF
1xuICAgICAgc3RhcnRZID0gb3B0aW9ucy5zdGFydFksXG4gICAgICBlbmRYID0gb3B0aW9ucy5lbmRYLFxuICAgICAgZW5kWSA9IG9wdGlvbnMuZW5kWSxcbiAgICAgIG1ldGhvZCA9IG9wdGlvbnMubWV0aG9kLFxuICAgICAgc2Nyb2xsZXIgPSBvcHRpb25zLnNjcm9sbGVyO1xuICAgIHZhciB0aW1lTGFwc2VkID0gMDtcbiAgICB2YXIgZGlzdGFuY2VYID0gZW5kWCAtIHN0YXJ0WDtcbiAgICB2YXIgZGlzdGFuY2VZID0gZW5kWSAtIHN0YXJ0WTtcbiAgICB2YXIgc3BlZWQgPSBNYXRoLm1heChNYXRoLmFicyhkaXN0YW5jZVggLyAxMDAwICogU0NST0xMX1RJTUUpLCBNYXRoLmFicyhkaXN0YW5jZVkgLyAxMDAwICogU0NST0xMX1RJTUUpKTtcbiAgICAvLyBUZW1wb3JhcmlseSBkaXNhYmxlcyBhbnkgc2Nyb2xsIHNuYXBwaW5nIHRoYXQgbWF5IGJlIGFjdGl2ZSBzaW5jZSBpdCBmaWdodHMgZm9yIGNvbnRyb2wgb3ZlciB0aGUgc2Nyb2xsZXIgd2l0aCB0aGlzIHBvbHlmaWxsXG4gICAgdmFyIHNjcm9sbFNuYXBGaXggPSBkaXNhYmxlU2Nyb2xsU25hcChzY3JvbGxlcik7XG4gICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKGZ1bmN0aW9uIGFuaW1hdGUodGltZXN0YW1wKSB7XG4gICAgICB0aW1lTGFwc2VkICs9IHRpbWVzdGFtcCAtIHN0YXJ0VGltZTtcbiAgICAgIHZhciBwZXJjZW50YWdlID0gTWF0aC5tYXgoMCwgTWF0aC5taW4oMSwgc3BlZWQgPT09IDAgPyAwIDogdGltZUxhcHNlZCAvIHNwZWVkKSk7XG4gICAgICB2YXIgcG9zaXRpb25YID0gTWF0aC5mbG9vcihzdGFydFggKyBkaXN0YW5jZVggKiBlYXNlKHBlcmNlbnRhZ2UpKTtcbiAgICAgIHZhciBwb3NpdGlvblkgPSBNYXRoLmZsb29yKHN0YXJ0WSArIGRpc3RhbmNlWSAqIGVhc2UocGVyY2VudGFnZSkpO1xuICAgICAgbWV0aG9kKHBvc2l0aW9uWCwgcG9zaXRpb25ZKTtcbiAgICAgIGlmIChwb3NpdGlvblggIT09IGVuZFggfHwgcG9zaXRpb25ZICE9PSBlbmRZKSB7XG4gICAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZShhbmltYXRlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChzY3JvbGxTbmFwRml4ICE9IG51bGwpIHtcbiAgICAgICAgICBzY3JvbGxTbmFwRml4LnJlc2V0KCk7XG4gICAgICAgICAgc2Nyb2xsU25hcEZpeCA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBIaWdoIFJlc29sdXRpb24gdGltZXN0YW1wIGlmIHBvc3NpYmxlLCBvdGhlcndpc2UgZmFsbGJhY2tzIHRvIERhdGUubm93KClcbiAgICogQHJldHVybnMge251bWJlcn1cbiAgICovXG4gIGZ1bmN0aW9uIG5vdygpIHtcbiAgICBpZiAoXCJwZXJmb3JtYW5jZVwiIGluIHdpbmRvdykgcmV0dXJuIHBlcmZvcm1hbmNlLm5vdygpO1xuICAgIHJldHVybiBEYXRlLm5vdygpO1xuICB9XG4gIHZhciBFTEVNRU5UX09SSUdJTkFMX1NDUk9MTCA9IFVOU1VQUE9SVEVEX0VOVklST05NRU5UID8gdW5kZWZpbmVkIDogRWxlbWVudC5wcm90b3R5cGUuc2Nyb2xsO1xuICB2YXIgV0lORE9XX09SSUdJTkFMX1NDUk9MTCA9IFVOU1VQUE9SVEVEX0VOVklST05NRU5UID8gdW5kZWZpbmVkIDogd2luZG93LnNjcm9sbDtcbiAgdmFyIEVMRU1FTlRfT1JJR0lOQUxfU0NST0xMX0JZID0gVU5TVVBQT1JURURfRU5WSVJPTk1FTlQgPyB1bmRlZmluZWQgOiBFbGVtZW50LnByb3RvdHlwZS5zY3JvbGxCeTtcbiAgdmFyIFdJTkRPV19PUklHSU5BTF9TQ1JPTExfQlkgPSBVTlNVUFBPUlRFRF9FTlZJUk9OTUVOVCA/IHVuZGVmaW5lZCA6IHdpbmRvdy5zY3JvbGxCeTtcbiAgdmFyIEVMRU1FTlRfT1JJR0lOQUxfU0NST0xMX1RPID0gVU5TVVBQT1JURURfRU5WSVJPTk1FTlQgPyB1bmRlZmluZWQgOiBFbGVtZW50LnByb3RvdHlwZS5zY3JvbGxUbztcbiAgdmFyIFdJTkRPV19PUklHSU5BTF9TQ1JPTExfVE8gPSBVTlNVUFBPUlRFRF9FTlZJUk9OTUVOVCA/IHVuZGVmaW5lZCA6IHdpbmRvdy5zY3JvbGxUbztcblxuICAvKipcbiAgICogQSBmYWxsYmFjayBpZiBFbGVtZW50LnByb3RvdHlwZS5zY3JvbGwgaXMgbm90IGRlZmluZWRcbiAgICogQHBhcmFtIHtudW1iZXJ9IHhcbiAgICogQHBhcmFtIHtudW1iZXJ9IHlcbiAgICovXG4gIGZ1bmN0aW9uIGVsZW1lbnRQcm90b3R5cGVTY3JvbGxGYWxsYmFjayh4LCB5KSB7XG4gICAgdGhpcy5fX2FkanVzdGluZ1Njcm9sbFBvc2l0aW9uID0gdHJ1ZTtcbiAgICB0aGlzLnNjcm9sbExlZnQgPSB4O1xuICAgIHRoaXMuc2Nyb2xsVG9wID0geTtcbiAgICBkZWxldGUgdGhpcy5fX2FkanVzdGluZ1Njcm9sbFBvc2l0aW9uO1xuICB9XG4gIC8qKlxuICAgKiBBIGZhbGxiYWNrIGlmIEVsZW1lbnQucHJvdG90eXBlLnNjcm9sbFRvIGlzIG5vdCBkZWZpbmVkXG4gICAqIEBwYXJhbSB7bnVtYmVyfSB4XG4gICAqIEBwYXJhbSB7bnVtYmVyfSB5XG4gICAqL1xuICBmdW5jdGlvbiBlbGVtZW50UHJvdG90eXBlU2Nyb2xsVG9GYWxsYmFjayh4LCB5KSB7XG4gICAgcmV0dXJuIGVsZW1lbnRQcm90b3R5cGVTY3JvbGxGYWxsYmFjay5jYWxsKHRoaXMsIHgsIHkpO1xuICB9XG4gIC8qKlxuICAgKiBBIGZhbGxiYWNrIGlmIEVsZW1lbnQucHJvdG90eXBlLnNjcm9sbEJ5IGlzIG5vdCBkZWZpbmVkXG4gICAqIEBwYXJhbSB7bnVtYmVyfSB4XG4gICAqIEBwYXJhbSB7bnVtYmVyfSB5XG4gICAqL1xuICBmdW5jdGlvbiBlbGVtZW50UHJvdG90eXBlU2Nyb2xsQnlGYWxsYmFjayh4LCB5KSB7XG4gICAgdGhpcy5fX2FkanVzdGluZ1Njcm9sbFBvc2l0aW9uID0gdHJ1ZTtcbiAgICB0aGlzLnNjcm9sbExlZnQgKz0geDtcbiAgICB0aGlzLnNjcm9sbFRvcCArPSB5O1xuICAgIGRlbGV0ZSB0aGlzLl9fYWRqdXN0aW5nU2Nyb2xsUG9zaXRpb247XG4gIH1cbiAgLyoqXG4gICAqIEdldHMgdGhlIG9yaWdpbmFsIG5vbi1wYXRjaGVkIHByb3RvdHlwZSBtZXRob2QgZm9yIHRoZSBnaXZlbiBraW5kXG4gICAqIEBwYXJhbSB7U2Nyb2xsTWV0aG9kTmFtZX0ga2luZFxuICAgKiBAcGFyYW0ge0VsZW1lbnR8V2luZG93fSBlbGVtZW50XG4gICAqIEByZXR1cm4ge0Z1bmN0aW9ufVxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0T3JpZ2luYWxTY3JvbGxNZXRob2RGb3JLaW5kKGtpbmQsIGVsZW1lbnQpIHtcbiAgICBzd2l0Y2ggKGtpbmQpIHtcbiAgICAgIGNhc2UgXCJzY3JvbGxcIjpcbiAgICAgICAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBFbGVtZW50KSB7XG4gICAgICAgICAgaWYgKEVMRU1FTlRfT1JJR0lOQUxfU0NST0xMICE9IG51bGwpIHtcbiAgICAgICAgICAgI
1HJldHVybiBFTEVNRU5UX09SSUdJTkFMX1NDUk9MTDtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnRQcm90b3R5cGVTY3JvbGxGYWxsYmFjaztcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIFdJTkRPV19PUklHSU5BTF9TQ1JPTEw7XG4gICAgICAgIH1cbiAgICAgIGNhc2UgXCJzY3JvbGxCeVwiOlxuICAgICAgICBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEVsZW1lbnQpIHtcbiAgICAgICAgICBpZiAoRUxFTUVOVF9PUklHSU5BTF9TQ1JPTExfQlkgIT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIEVMRU1FTlRfT1JJR0lOQUxfU0NST0xMX0JZO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gZWxlbWVudFByb3RvdHlwZVNjcm9sbEJ5RmFsbGJhY2s7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiBXSU5ET1dfT1JJR0lOQUxfU0NST0xMX0JZO1xuICAgICAgICB9XG4gICAgICBjYXNlIFwic2Nyb2xsVG9cIjpcbiAgICAgICAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBFbGVtZW50KSB7XG4gICAgICAgICAgaWYgKEVMRU1FTlRfT1JJR0lOQUxfU0NST0xMX1RPICE9IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBFTEVNRU5UX09SSUdJTkFMX1NDUk9MTF9UTztcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnRQcm90b3R5cGVTY3JvbGxUb0ZhbGxiYWNrO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gV0lORE9XX09SSUdJTkFMX1NDUk9MTF9UTztcbiAgICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBTbW9vdGggU2Nyb2xsIE9wdGlvbnMgdG8gdXNlIGZvciB0aGUgc3RlcCBmdW5jdGlvblxuICAgKiBAcGFyYW0ge0VsZW1lbnR8V2luZG93fSBlbGVtZW50XG4gICAqIEBwYXJhbSB7bnVtYmVyfSB4XG4gICAqIEBwYXJhbSB7bnVtYmVyfSB5XG4gICAqIEBwYXJhbSB7U2Nyb2xsTWV0aG9kTmFtZX0ga2luZFxuICAgKiBAcmV0dXJucyB7SVNtb290aFNjcm9sbE9wdGlvbnN9XG4gICAqL1xuICBmdW5jdGlvbiBnZXRTbW9vdGhTY3JvbGxPcHRpb25zKGVsZW1lbnQsIHgsIHksIGtpbmQpIHtcbiAgICB2YXIgc3RhcnRUaW1lID0gbm93KCk7XG4gICAgaWYgKCEoZWxlbWVudCBpbnN0YW5jZW9mIEVsZW1lbnQpKSB7XG4gICAgICAvLyBVc2Ugd2luZG93IGFzIHRoZSBzY3JvbGwgY29udGFpbmVyXG4gICAgICB2Y
1XIgc2Nyb2xsWF8xID0gd2luZG93LnNjcm9sbFgsXG4gICAgICAgIHBhZ2VYT2Zmc2V0XzEgPSB3aW5kb3cucGFnZVhPZmZzZXQsXG4gICAgICAgIHNjcm9sbFlfMSA9IHdpbmRvdy5zY3JvbGxZLFxuICAgICAgICBwYWdlWU9mZnNldF8xID0gd2luZG93LnBhZ2VZT2Zmc2V0O1xuICAgICAgdmFyIHN0YXJ0WCA9IHNjcm9sbFhfMSA9PSBudWxsIHx8IHNjcm9sbFhfMSA9PT0gMCA/IHBhZ2VYT2Zmc2V0XzEgOiBzY3JvbGxYXzE7XG4gICAgICB2YXIgc3RhcnRZID0gc2Nyb2xsWV8xID09IG51bGwgfHwgc2Nyb2xsWV8xID09PSAwID8gcGFnZVlPZmZzZXRfMSA6IHNjcm9sbFlfMTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHN0YXJ0VGltZTogc3RhcnRUaW1lLFxuICAgICAgICBzdGFydFg6IHN0YXJ0WCxcbiAgICAgICAgc3RhcnRZOiBzdGFydFksXG4gICAgICAgIGVuZFg6IE1hdGguZmxvb3Ioa2luZCA9PT0gXCJzY3JvbGxCeVwiID8gc3RhcnRYICsgeCA6IHgpLFxuICAgICAgICBlbmRZOiBNYXRoLmZsb29yKGtpbmQgPT09IFwic2Nyb2xsQnlcIiA/IHN0YXJ0WSArIHkgOiB5KSxcbiAgICAgICAgbWV0aG9kOiBnZXRPcmlnaW5hbFNjcm9sbE1ldGhvZEZvcktpbmQoXCJzY3JvbGxUb1wiLCB3aW5kb3cpLmJpbmQod2luZG93KSxcbiAgICAgICAgc2Nyb2xsZXI6IGdldFNjcm9sbGluZ0VsZW1lbnQoKVxuICAgICAgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIHNjcm9sbExlZnQgPSBlbGVtZW50LnNjcm9sbExlZnQsXG4gICAgICAgIHNjcm9sbFRvcCA9IGVsZW1lbnQuc2Nyb2xsVG9wO1xuICAgICAgdmFyIHN0YXJ0WCA9IHNjcm9sbExlZnQ7XG4gICAgICB2Y
1XIgc3RhcnRZID0gc2Nyb2xsVG9wO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc3RhcnRUaW1lOiBzdGFydFRpbWUsXG4gICAgICAgIHN0YXJ0WDogc3RhcnRYLFxuICAgICAgICBzdGFydFk6IHN0YXJ0WSxcbiAgICAgICAgZW5kWDogTWF0aC5mbG9vcihraW5kID09PSBcInNjcm9sbEJ5XCIgPyBzdGFydFggKyB4IDogeCksXG4gICAgICAgIGVuZFk6IE1hdGguZmxvb3Ioa2luZCA9PT0gXCJzY3JvbGxCeVwiID8gc3RhcnRZICsgeSA6IHkpLFxuICAgICAgICBtZXRob2Q6IGdldE9yaWdpbmFsU2Nyb2xsTWV0aG9kRm9yS2luZChcInNjcm9sbFRvXCIsIGVsZW1lbnQpLmJpbmQoZWxlbWVudCksXG4gICAgICAgIHNjcm9sbGVyOiBlbGVtZW50XG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBFbnN1cmVzIHRoYXQgdGhlIGdpdmVuIHZhbHVlIGlzIG51bWVyaWNcbiAgICogQHBhcmFtIHtudW1iZXJ9IHZhbHVlXG4gICAqIEByZXR1cm4ge251bWJlcn1cbiAgICovXG4gIGZ1bmN0aW9uIGVuc3VyZU51bWVyaWModmFsdWUpIHtcbiAgICBpZiAodmFsdWUgPT0gbnVsbCkgcmV0dXJuIDA7ZWxzZSBpZiAodHlwZW9mIHZhbHVlID09PSBcIm51bWJlclwiKSB7XG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgIHJldHVybiBwYXJzZUZsb2F0KHZhbHVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIDA7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gdmFsdWUgaXMgc29tZSBTY3JvbGxUb09wdGlvbnNcbiAgICogQHBhcmFtIHtudW1iZXIgfCBTY3JvbGxUb09wdGlvbnN9IHZhbHVlXG4gICAqIEByZXR1cm4ge3ZhbHVlIGlzIFNjcm9sbFRvT3B0aW9uc31cbiAgICovXG4gIGZ1bmN0aW9uIGlzU2Nyb2xsVG9PcHRpb25zKHZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlICE9IG51bGwgJiYgX3R5cGVvZih2YWx1ZSkgPT09IFwib2JqZWN0XCI7XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlcyBhIHNjcm9sbCBtZXRob2RcbiAgICogQHBhcmFtIHtFbGVtZW50fFdpbmRvd30gZWxlbWVudFxuICAgKiBAcGFyYW0ge1Njcm9sbE1ldGhvZE5hbWV9IGtpbmRcbiAgICogQHBhcmFtIHtudW1iZXIgfCBTY3JvbGxUb09wdGlvbnN9IG9wdGlvbnNPclhcbiAgICogQHBhcmFtIHtudW1iZXJ9IHlcbiAgICovXG4gIGZ1bmN0aW9uIGhhbmRsZVNjcm9sbE1ldGhvZChlbGVtZW50LCBraW5kLCBvcHRpb25zT3JYLCB5KSB7XG4gICAgb25TY3JvbGxXaXRoT3B0aW9ucyhnZXRTY3JvbGxUb09wdGlvbnNXaXRoVmFsaWRhdGlvbihvcHRpb25zT3JYLCB5KSwgZWxlbWVudCwga2luZCk7XG4gIH1cbiAgLyoqXG4gICAqIEludm9rZWQgd2hlbiBhICdTY3JvbGxUb09wdGlvbnMnIGRpY3QgaXMgcHJvdmlkZWQgdG8gJ3Njcm9sbCgpJyBhcyB0aGUgZmlyc3QgYXJndW1lbnRcbiAgICogQHBhcmFtIHtTY3JvbGxUb09wdGlvbnN9IG9wdGlvbnNcbiAgICogQHBhcmFtIHtFbGVtZW50fFdpbmRvd30gZWxlbWVudFxuICAgKiBAcGFyYW0ge1Njcm9sbE1ldGhvZE5hbWV9IGtpbmRcbiAgICovXG4gIGZ1bmN0aW9uIG9uU2Nyb2xsV2l0aE9wdGlvbnMob3B0aW9ucywgZWxlbWVudCwga2luZCkge1xuICAgIHZhciBiZWhhdmlvciA9IGdldFNjcm9sbEJlaGF2aW9yKGVsZW1lbnQsIG9wdGlvbnMpO1xuICAgIC8vIElmIHRoZSBiZWhhdmlvciBpcyAnYXV0bycgYXBwbHkgaW5zdGFudGFuZW91cyBzY3JvbGxpbmdcbiAgICBpZiAoYmVoYXZpb3IgPT0gbnVsbCB8fCBiZWhhdmlvciA9PT0gXCJhdXRvXCIpIHtcbiAgICAgIGdldE9yaWdpbmFsU2Nyb2xsTWV0aG9kRm9yS2luZChraW5kLCBlbGVtZW50KS5jYWxsKGVsZW1lbnQsIG9wdGlvbnMubGVmdCwgb3B0aW9ucy50b3ApO1xuICAgIH0gZWxzZSB7XG4gICAgICBzbW9vdGhTY3JvbGwoZ2V0U21vb3RoU2Nyb2xsT3B0aW9ucyhlbGVtZW50LCBvcHRpb25zLmxlZnQsIG9wdGlvbnMudG9wLCBraW5kKSk7XG4gICAgfVxuICB9XG4gIC8qKlxuICAgKiBOb3JtYWxpemVzIHRoZSBnaXZlbiBzY3JvbGwgY29vcmRpbmF0ZXNcbiAgICogQHBhcmFtIHtudW1iZXI/fSB4XG4gICAqIEBwYXJhbSB7bnVtYmVyP30geVxuICAgKiBAcmV0dXJuIHtSZXF1aXJlZDxQaWNrPFNjcm9sbFRvT3B0aW9ucywgXCJ0b3BcIiB8IFwibGVmdFwiPj59XG4gICAqL1xuICBmdW5jdGlvbiBub3JtYWxpemVTY3JvbGxDb29yZGluYXRlcyh4LCB5KSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGxlZnQ6IGVuc3VyZU51bWVyaWMoeCksXG4gICAgICB0b3A6IGVuc3VyZU51bWVyaWMoeSlcbiAgICB9O1xuICB9XG4gIC8qKlxuICAgKiBHZXRzIFNjcm9sbFRvT3B0aW9ucyBiYXNlZCBvbiB0aGUgZ2l2ZW4gYXJndW1lbnRzLiBXaWxsIHRocm93IGlmIHZhbGlkYXRpb24gZmFpbHNcbiAgICogQHBhcmFtIHtudW1iZXIgfCBTY3JvbGxUb09wdGlvbnN9IG9wdGlvbnNPclhcbiAgICogQHBhcmFtIHtudW1iZXJ9IHlcbiAgICogQHJldHVybiB7UmVxdWlyZWQ8U2Nyb2xsVG9PcHRpb25zPn1cbiAgICovXG4gIGZ1bmN0aW9uIGdldFNjcm9sbFRvT3B0aW9uc1dpdGhWYWxpZGF0aW9uKG9wdGlvbnNPclgsIHkpIHtcbiAgICAvLyBJZiBvbmx5IG9uZSBhcmd1bWVudCBpcyBnaXZlbiwgYW5kIGl0IGlzbid0IGFuIG9wdGlvbnMgb2JqZWN0LCB0aHJvdyBhIFR5cGVFcnJvclxuICAgIGlmICh5ID09PSB1bmRlZmluZWQgJiYgIWlzU2Nyb2xsVG9PcHRpb25zKG9wdGlvbnNPclgpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiRmFpbGVkIHRvIGV4ZWN1dGUgJ3Njcm9sbCcgb24gJ0VsZW1lbnQnOiBwYXJhbWV0ZXIgMSAoJ29wdGlvbnMnKSBpcyBub3QgYW4gb2JqZWN0LlwiKTtcbiAgICB9XG4gICAgLy8gU2Nyb2xsIGJhc2VkIG9uIHRoZSBwcmltaXRpdmUgdmFsdWVzIGdpdmVuIGFzIGFyZ3VtZW50c1xuICAgIGlmICghaXNTY3JvbGxUb09wdGlvbnMob3B0aW9uc09yWCkpIHtcbiAgICAgIHJldHVybiBfYXNzaWduKF9hc3NpZ24oe30sIG5vcm1hbGl6ZVNjcm9sbENvb3JkaW5hdGVzKG9wdGlvbnNPclgsIHkpKSwge1xuICAgICAgICBiZWhhdmlvcjogXCJhdXRvXCJcbiAgICAgIH0pO1xuICAgIH1cbiAgICAvLyBTY3JvbGwgYmFzZWQgb24gdGhlIHJlY2VpdmVkIG9wdGlvbnMgb2JqZWN0XG4gICAgZWxzZSB7XG4gICAgICByZXR1cm4gX2Fzc2lnbihfYXNzaWduKHt9LCBub3JtYWxpem
1VTY3JvbGxDb29yZGluYXRlcyhvcHRpb25zT3JYLmxlZnQsIG9wdGlvbnNPclgudG9wKSksIHtcbiAgICAgICAgYmVoYXZpb3I6IG9wdGlvbnNPclguYmVoYXZpb3IgPT0gbnVsbCA/IFwiYXV0b1wiIDogb3B0aW9uc09yWC5iZWhhdmlvclxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFBhdGNoZXMgdGhlICdzY3JvbGwnIG1ldGhvZCBvbiB0aGUgRWxlbWVudCBwcm90b3R5cGVcbiAgICovXG4gIGZ1bmN0aW9uIHBhdGNoRWxlbWVudFNjcm9sbCgpIHtcbiAgICBFbGVtZW50LnByb3RvdHlwZS5zY3JvbGwgPSBmdW5jdGlvbiAob3B0aW9uc09yWCwgeSkge1xuICAgICAgaGFuZGxlU2Nyb2xsTWV0aG9kKHRoaXMsIFwic2Nyb2xsXCIsIG9wdGlvbnNPclgsIHkpO1xuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogUGF0Y2hlcyB0aGUgJ3Njcm9sbEJ5JyBtZXRob2Qgb24gdGhlIEVsZW1lbnQgcHJvdG90eXBlXG4gICAqL1xuICBmdW5jdGlvbiBwYXRjaEVsZW1lbnRTY3JvbGxCeSgpIHtcbiAgICBFbGVtZW50LnByb3RvdHlwZS5zY3JvbGxCeSA9IGZ1bmN0aW9uIChvcHRpb25zT3JYLCB5KSB7XG4gICAgICBoYW5kbGVTY3JvbGxNZXRob2QodGhpcywgXCJzY3JvbGxCeVwiLCBvcHRpb25zT3JYLCB5KTtcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFBhdGNoZXMgdGhlICdzY3JvbGxUbycgbWV0aG9kIG9uIHRoZSBFbGVtZW50IHByb3RvdHlwZVxuICAgKi9cbiAgZnVuY3Rpb24gcGF0Y2hFbGVtZW50U2Nyb2xsVG8oKSB7XG4gICAgRWxlbWVudC5wcm90b3R5cGUuc2Nyb2xsVG8gPSBmdW5jdGlvbiAob3B0aW9uc09yWCwgeSkge1xuICAgICAgaGFuZGxlU2Nyb2xsTWV0aG9kKHRoaXMsIFwic2Nyb2xsVG9cIiwgb3B0aW9uc09yWCwgeSk7XG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQYXRjaGVzIHRoZSAnc2Nyb2xsJyBtZXRob2Qgb24gdGhlIFdpbmRvdyBwcm90b3R5cGVcbiAgICovXG4gIGZ1bmN0aW9uIHBhdGNoV2luZG93U2Nyb2xsKCkge1xuICAgIHdpbmRvdy5zY3JvbGwgPSBmdW5jdGlvbiAob3B0aW9uc09yWCwgeSkge1xuICAgICAgaGFuZGxlU2Nyb2xsTWV0aG9kKHRoaXMsIFwic2Nyb2xsXCIsIG9wdGlvbnNPclgsIHkpO1xuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogUGF0Y2hlcyB0aGUgJ3Njcm9sbEJ5JyBtZXRob2Qgb24gdGhlIFdpbmRvdyBwcm90b3R5cGVcbiAgICovXG4gIGZ1bmN0aW9uIHBhdGNoV2luZG93U2Nyb2xsQnkoKSB7XG4gICAgd2luZG93LnNjcm9sbEJ5ID0gZnVuY3Rpb24gKG9wdGlvbnNPclgsIHkpIHtcbiAgICAgIGhhbmRsZVNjcm9sbE1ldGhvZCh0aGlzLCBcInNjcm9sbEJ5XCIsIG9wdGlvbnNPclgsIHkpO1xuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogUGF0Y2hlcyB0aGUgJ3Njcm9sbFRvJyBtZXRob2Qgb24gdGhlIFdpbmRvdyBwcm90b3R5cGVcbiAgICovXG4gIGZ1bmN0aW9uIHBhdGNoV2luZG93U2Nyb2xsVG8oKSB7XG4gICAgd2luZG93LnNjcm9sbFRvID0gZnVuY3Rpb24gKG9wdGlvbnNPclgsIHkpIHtcbiAgICAgIGhhbmRsZVNjcm9sbE1ldGhvZCh0aGlzLCBcInNjcm9sbFRvXCIsIG9wdGlvbnNPclgsIHkpO1xuICAgIH07XG4gIH1cblxuICAvLyB0c2xpbnQ6ZGlzYWJsZTpuby1hbnlcbiAgLyoqXG4gICAqIEdldHMgdGhlIHBhcmVudCBvZiBhbiBlbGVtZW50LCB0YWtpbmcgaW50byBhY2NvdW50IERvY3VtZW50RnJhZ21lbnRzLCBTaGFkb3dSb290cywgYXMgd2VsbCBhcyB0aGUgcm9vdCBjb250ZXh0ICh3aW5kb3cpXG4gICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR9IGN1cnJlbnRFbGVtZW50XG4gICAqIEByZXR1cm5zIHtFdmVudFRhcmdldCB8IG51bGx9XG4gICAqL1xuICBmdW5jdGlvbiBnZXRQYXJlbnQoY3VycmVudEVsZW1lbnQpIHtcbiAgICBpZiAoXCJub2RlVHlwZVwiIGluIGN1cnJlbnRFbGVtZW50ICYmIGN1cnJlbnRFbGVtZW50Lm5vZGVUeXBlID09PSAxKSB7XG4gICAgICByZXR1cm4gY3VycmVudEVsZW1lbnQucGFyZW50Tm9kZTtcbiAgICB9XG4gICAgaWYgKFwiU2hhZG93Um9vdFwiIGluIHdpbmRvdyAmJiBjdXJyZW50RWxlbWVudCBpbnN0YW5jZW9mIHdpbmRvdy5TaGFkb3dSb290KSB7XG4gICAgICByZXR1cm4gY3VycmVudEVsZW1lbnQuaG9zdDtcbiAgICB9IGVsc2UgaWYgKGN1cnJlbnRFbGVtZW50ID09PSBkb2N1bWVudCkge1xuICAgICAgcmV0dXJuIHdpbmRvdztcbiAgICB9IGVsc2UgaWYgKGN1cnJlbnRFbGVtZW50IGluc3RhbmNlb2YgTm9kZSkgcmV0dXJuIGN1cnJlbnRFbGVtZW50LnBhcmVudE5vZGU7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiBvdmVyZmxvdyBwcm9wZXJ0eSByZXByZXNlbnRzIGEgc2Nyb2xsYWJsZSBvdmVyZmxvdyB2YWx1ZVxuICAgKiBAcGFyYW0ge3N0cmluZyB8IG51bGx9IG92ZXJmbG93XG4gICAqIEByZXR1cm4ge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBjYW5PdmVyZmxvdyhvdmVyZmxvdykge1xuICAgIHJldHVybiBvdmVyZmxvdyAhPT0gXCJ2aXNpYmxlXCIgJiYgb3ZlcmZsb3cgIT09IFwiY2xpcFwiO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGdpdmVuIGVsZW1lbnQgaXMgc2Nyb2xsYWJsZVxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsZW1lbnRcbiAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIGlzU2Nyb2xsYWJsZShlbGVtZW50KSB7XG4gICAgaWYgKGVsZW1lbnQuY2xpZW50SGVpZ2h0IDwgZWxlbWVudC5zY3JvbGxIZWlnaHQgfHwgZWxlbWVudC5jbGllbnRXaWR0aCA8IGVsZW1lbnQuc2Nyb2xsV2lkdGgpIHtcbiAgICAgIHZhciBzdHlsZSA9IGdldENvbXB1dGVkU3R5bGUoZWxlbWVudCwgbnVsbCk7XG4gICAgICByZXR1cm4gY2FuT3ZlcmZsb3coc3R5bGUub3ZlcmZsb3dZKSB8fCBjYW5PdmVyZmxvdyhzdHlsZS5vdmVyZmxvd1gpO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgLyoqXG4gICAqIEZpbmRzIHRoZSBuZWFyZXN0IGFuY2VzdG9yIG9mIGFuIGVsZW1lbnQgdGhhdCBjYW4gc2Nyb2xsXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gdGFyZ2V0XG4gICAqIEByZXR1cm5zIHtFbGVtZW50fFdpbmRvdz99XG4gICAqL1xuICBmdW5jdGlvbiBmaW5kTmVhcmVzdEFuY2VzdG9yc1dpdGhTY3JvbGxCZWhhdmlvcih0YXJnZXQpIHtcbiAgICB2YXIgY3VycmVudEVsZW1lbnQgPSB0YXJnZXQ7XG4gICAgdmFyIHNjcm9sbGluZ0VsZW1lbnQgPSBnZXRTY3JvbGxpbmdFbGVtZW50KCk7XG4gICAgd2hpbGUgKGN1cnJlbnRFbGVtZW50ICE9IG51bGwpIHtcbiAgICAgIHZhciBiZWhhdmlvciA9IGdldFNjcm9sbEJlaGF2aW9yKGN1cnJlbnRFbGVtZW50KTtcbiAgICAgIGlmIChiZWhhdmlvciAhPSBudWxsICYmIChjdXJyZW50RWxlbWVudCA9PT0gc2Nyb2xsaW5nRWxlbWVudCB8fCBpc1Njcm9sbGFibGUoY3VycmVudEVsZW1lbnQpKSkge1xuICAgICAgICByZXR1cm4gW2N1cnJlbnRFbGVtZW50LCBiZWhhdmlvcl07XG4gICAgICB9XG4gICAgICB2Y
1XIgcGFyZW50XzEgPSBnZXRQYXJlbnQoY3VycmVudEVsZW1lbnQpO1xuICAgICAgY3VycmVudEVsZW1lbnQgPSBwYXJlbnRfMTtcbiAgICB9XG4gICAgLy8gTm8gc3VjaCBlbGVtZW50IGNvdWxkIGJlIGZvdW5kLiBTdGFydCBvdmVyLCBidXQgdGhpcyB0aW1lIGZpbmQgdGhlIG5lYXJlc3QgYW5jZXN0b3IgdGhhdCBjYW4gc2ltcGx5IHNjcm9sbFxuICAgIGN1cnJlbnRFbGVtZW50ID0gdGFyZ2V0O1xuICAgIHdoaWxlIChjdXJyZW50RWxlbWVudCAhPSBudWxsKSB7XG4gICAgICBpZiAoY3VycmVudEVsZW1lbnQgPT09IHNjcm9sbGluZ0VsZW1lbnQgfHwgaXNTY3JvbGxhYmxlKGN1cnJlbnRFbGVtZW50KSkge1xuICAgICAgICByZXR1cm4gW2N1cnJlbnRFbGVtZW50LCBcImF1dG9cIl07XG4gICAgICB9XG4gICAgICB2YXIgcGFyZW50XzIgPSBnZXRQYXJlbnQoY3VycmVudEVsZW1lbnQpO1xuICAgICAgY3VycmVudEVsZW1lbnQgPSBwYXJlbnRfMjtcbiAgICB9XG4gICAgLy8gRGVmYXVsdCB0byB0aGUgc2Nyb2xsaW5nIGVsZW1lbnRcbiAgICByZXR1cm4gW3Njcm9sbGluZ0VsZW1lbnQsIFwiYXV0b1wiXTtcbiAgfVxuXG4gIC8vIHRzbGludDpkaXNhYmxlOm5vLWFueVxuICAvKipcbiAgICogRmluZHMgdGhlIG5lYXJlc3Qgcm9vdCBmcm9tIGFuIGVsZW1lbnRcbiAgICogQHBhcmFtIHtFbGVtZW50fSB0YXJnZXRcbiAgICogQHJldHVybnMge0RvY3VtZW50fFNoYWRvd1Jvb3R9XG4gICAqL1xuICBmdW5jdGlvbiBmaW5kTmVhcmVzdFJvb3QodGFyZ2V0KSB7XG4gICAgdmFyIGN1cnJlbnRFbGVtZW50ID0gdGFyZ2V0O1xuICAgIHdoaWxlIChjdXJyZW50RWxlbWVudCAhPSBudWxsKSB7XG4gICAgICBpZiAoXCJTaGFkb3dSb290XCIgaW4gd2luZG93ICYmIGN1cnJlbnRFbGVtZW50IGluc3RhbmNlb2Ygd2luZG93LlNoYWRvd1Jvb3QpIHtcbiAgICAgICAgLy8gQXNzdW1lIHRoaXMgaXMgYSBTaGFkb3dSb290XG4gICAgICAgIHJldHVybiBjdXJyZW50RWxlbWVudDtcbiAgICAgIH1cbiAgICAgIHZhciBwYXJlbnRfMSA9IGdldFBhcmVudChjdXJyZW50RWxlbWVudCk7XG4gICAgICBpZiAocGFyZW50XzEgPT09IGN1cnJlbnRFbGVtZW50KSB7XG4gICAgICAgIHJldHVybiBkb2N1bWVudDtcbiAgICAgIH1cbiAgICAgIGN1cnJlbnRFbGVtZW50ID0gcGFyZW50XzE7XG4gICAgfVxuICAgIHJldHVybiBkb2N1bWVudDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBvcmlnaW4gb2YgdGhlIGdpdmVuIExvY2F0aW9uIG9yIEhUTUxBbmNob3JFbGVtZW50IGlmIGF2YWlsYWJsZSBpbiB0aGUgcnVudGltZSwgYW5kIG90aGVyd2lzZSBzaGltcyBpdC4gKGl0J3MgYSBvbmUtbGluZXIpXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuICBmdW5jdGlvbiBnZXRMb2NhdGlvbk9yaWdpbihsb2NhdGlvbkxpa2UpIHtcbiAgICBpZiAobG9jYXRpb25MaWtlID09PSB2b2lkIDApIHtcbiAgICAgIGxvY2F0aW9uTGlrZSA9IGxvY2F0aW9uO1xuICAgIH1cbiAgICBpZiAoXCJvcmlnaW5cIiBpbiBsb2NhdGlvbkxpa2UgJiYgbG9jYXRpb25MaWtlLm9yaWdpbiAhPSBudWxsKSB7XG4gICAgICByZXR1cm4gbG9jYXRpb25MaWtlLm9yaWdpbjtcbiAgICB9XG4gICAgdmFyIHBvcnQgPSBsb2NhdGlvbkxpa2UucG9ydCAhPSBudWxsICYmIGxvY2F0aW9uTGlrZS5wb3J0Lmxlbmd0aCA+IDAgPyBcIjpcIiArIGxvY2F0aW9uTGlrZS5wb3J0IDogXCJcIjtcbiAgICBpZiAobG9jYXRpb25MaWtlLnByb3RvY29sID09PSBcImh0dHA6XCIgJiYgcG9ydCA9PT0gXCI6ODBcIikge1xuICAgICAgcG9ydCA9IFwiXCI7XG4gICAgfSBlbHNlIGlmIChsb2NhdGlvbkxpa2UucHJvdG9jb2wgPT09IFwiaHR0cHM6XCIgJiYgcG9ydCA9PT0gXCI6NDQzXCIpIHtcbiAgICAgIHBvcnQgPSBcIlwiO1xuICAgIH1cbiAgICByZXR1cm4gbG9jYXRpb25MaWtlLnByb3RvY29sICsgXCIvL1wiICsgbG9jYXRpb25MaWtlLmhvc3RuYW1lICsgcG9ydDtcbiAgfVxuXG4gIC8qKlxuICAgKiBBIFJlZ3VsYXIgZXhwcmVzc2lvbiB0aGF0IG1hdGNoZXMgaWQncyBvZiB0aGUgZm9ybSBcIiNbZGlnaXRdXCJcbiAgICogQHR5cGUge1JlZ0V4cH1cbiAgICovXG4gIHZhciBJRF9XSVRIX0xFQURJTkdfRElHSVRfUkVHRVhQID0gL14jXFxkLztcbiAgLyoqXG4gICAqIENhdGNoZXMgYW5jaG9yIG5hdmlnYXRpb24gdG8gSURzIHdpdGhpbiB0aGUgc2FtZSByb290IGFuZCBlbnN1cmVzIHRoYXQgdGhleSBjYW4gYmUgc21vb3RoLXNjcm9sbGVkXG4gICAqIGlmIHRoZSBzY3JvbGwgYmVoYXZpb3IgaXMgc21vb3RoIGluIHRoZSBmaXJzdCByb290ZXIgd2l0aGluIHRoYXQgY29udGV4dFxuICAgKi9cbiAgZnVuY3Rpb24gY2F0Y2hOYXZpZ2F0aW9uKCkge1xuICAgIC8vIExpc3RlbiBmb3IgJ2NsaWNrJyBldmVudHMgZ2xvYmFsbHlcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIGZ1bmN0aW9uIChlKSB7XG4gICAgICAvLyBPbmx5IHdvcmsgd2l0aCB0cnVzdGVkIGV2ZW50cyBvbiBIVE1MQW5jaG9yRWxlbWVudHNcbiAgICAgIGlmICghZS5pc1RydXN0ZWQgfHwgIShlLnRhcmdldCBpbnN0YW5jZW9mIEhUTUxBbmNob3JFbGVtZW50KSkgcmV0dXJuO1xuICAgICAgdmFyIF9hID0gZS50YXJnZXQsXG4gICAgICAgIHBhdGhuYW1lID0gX2EucGF0aG5hbWUsXG4gICAgICAgIHNlYXJjaCA9IF9hLnNlYXJjaCxcbiAgICAgICAgaGFzaCA9IF9hLmhhc2g7XG4gICAgICB2Y
1XIgcG9pbnRzVG9DdXJyZW50UGFnZSA9IGdldExvY2F0aW9uT3JpZ2luKGUudGFyZ2V0KSA9PT0gZ2V0TG9jYXRpb25PcmlnaW4obG9jYXRpb24pICYmIHBhdGhuYW1lID09PSBsb2NhdGlvbi5wYXRobmFtZSAmJiBzZWFyY2ggPT09IGxvY2F0aW9uLnNlYXJjaDtcbiAgICAgIC8vIE9ubHkgd29yayB3aXRoIEhUTUxBbmNob3JFbGVtZW50cyB0aGF0IG5hdmlnYXRlcyB0byBhIHNwZWNpZmljIElEIG9uIHRoZSBjdXJyZW50IHBhZ2VcbiAgICAgIGlmICghcG9pbnRzVG9DdXJyZW50UGFnZSB8fCBoYXNoID09IG51bGwgfHwgaGFzaC5sZW5ndGggPCAxKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIC8vIEZpbmQgdGhlIG5lYXJlc3Qgcm9vdCwgd2hldGhlciBpdCBiZSBhIFNoYWRvd1Jvb3Qgb3IgdGhlIGRvY3VtZW50IGl0c2VsZlxuICAgICAgdmFyIHJvb3QgPSBmaW5kTmVhcmVzdFJvb3QoZS50YXJnZXQpO1xuICAgICAgLy8gQXR0ZW1wdCB0byBtYXRjaCB0aGUgc2VsZWN0b3IgZnJvbSB0aGF0IHJvb3QuIHF1ZXJ5U2VsZWN0b3InIGRvZXNuJ3Qgc3VwcG9ydCBJRHMgdGhhdCBzdGFydCB3aXRoIGEgZGlnaXQsIHNvIHdvcmsgYXJvdW5kIHRoYXQgbGltaXRhdGlvblxuICAgICAgdmFyIGVsZW1lbnRNYXRjaCA9IGhhc2gubWF0Y2goSURfV0lUSF9MRUFESU5HX0RJR0lUX1JFR0VYUCkgIT0gbnVsbCA/IHJvb3QuZ2V0RWxlbWVudEJ5SWQoaGFzaC5zbGljZSgxKSkgOiByb290LnF1ZXJ5U2VsZWN0b3IoaGFzaCk7XG4gICAgICAvLyBJZiBubyBzZWxlY3RvciBjb3VsZCBiZSBmb3VuZCwgZG9uJ3QgcHJvY2VlZFxuICAgICAgaWYgKGVsZW1lbnRNYXRjaCA9PSBudWxsKSByZXR1cm47XG4gICAgICAvLyBGaW5kIHRoZSBuZWFyZXN0IGFuY2VzdG9yIHRoYXQgY2FuIGJlIHNjcm9sbGVkXG4gICAgICB2Y
1XIgX2IgPSBfX3JlYWQoZmluZE5lYXJlc3RBbmNlc3RvcnNXaXRoU2Nyb2xsQmVoYXZpb3IoZWxlbWVudE1hdGNoKSwgMiksXG4gICAgICAgIGJlaGF2aW9yID0gX2JbMV07XG4gICAgICAvLyBJZiB0aGUgYmVoYXZpb3IgaXNuJ3Qgc21vb3RoLCBkb24ndCBwcm9jZWVkXG4gICAgICBpZiAoYmVoYXZpb3IgIT09IFwic21vb3RoXCIpIHJldHVybjtcbiAgICAgIC8vIE90aGVyd2lzZSwgZmlyc3QgcHJldmVudCB0aGUgZGVmYXVsdCBhY3Rpb24uXG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAvLyBOb3csIHNjcm9sbCB0byB0aGUgZWxlbWVudCB3aXRoIHRoYXQgSURcbiAgICAgIGVsZW1lbnRNYXRjaC5zY3JvbGxJbnRvVmlldyh7XG4gICAgICAgIGJlaGF2aW9yOiBiZWhhdmlvclxuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cbiAgdmFyIEVMRU1FTlRfT1JJR0lOQUxfU0NST0xMX0lOVE9fVklFVyA9IFVOU1VQUE9SVEVEX0VOVklST05NRU5UID8gdW5kZWZpbmVkIDogRWxlbWVudC5wcm90b3R5cGUuc2Nyb2xsSW50b1ZpZXc7XG5cbiAgLyoqXG4gICAqIFRoZSBtYWpvcml0eSBvZiB0aGlzIGZpbGUgaXMgYmFzZWQgb24gaHR0cHM6Ly9naXRodWIuY29tL3N0aXBzYW4vY29tcHV0ZS1zY3JvbGwtaW50by12aWV3IChNSVQgbGljZW5zZSksXG4gICAqIGJ1dCBoYXMgYmVlbiByZXdyaXR0ZW4gdG8gYWNjZXB0IGEgc2Nyb2xsZXIgYXMgYW4gYXJndW1lbnQuXG4gICAqL1xuICAvKipcbiAgICogRmluZCBvdXQgd2hpY2ggZWRnZSB0byBhbGlnbiBhZ2FpbnN0IHdoZW4gbG9naWNhbCBzY3JvbGwgcG9zaXRpb24gaXMgXCJuZWFyZXN0XCJcbiAgICogSW50ZXJlc3RpbmcgZmFjdDogXCJuZWFyZXN0XCIgd29ya3Mgc2ltaWxhcmx5IHRvIFwiaWYtbmVlZGVkXCIsIGlmIHRoZSBlbGVtZW50IGlzIGZ1bGx5IHZpc2libGUgaXQgd2lsbCBub3Qgc2Nyb2xsIGl0XG4gICAqXG4gICAqIExlZ2VuZHM6XG4gICAqIOKUjOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUkCDilI8g4pSBIOKUgSDilIEg4pSTXG4gICAqIOKUgiB0YXJnZXQg4pSCICAgZnJhbWVcbiAgICog4pSU4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSYIOKUlyDilIEg4pSBIOKUgSDilJtcbiAgICovXG4gIGZ1bmN0aW9uIGFsaWduTmVhcmVzdChzY3JvbGxpbmdFZGdlU3RhcnQsIHNjcm9sbGluZ0VkZ2VFbmQsIHNjcm9sbGluZ1NpemUsIHNjcm9sbGluZ0JvcmRlclN0YXJ0LCBzY3JvbGxpbmdCb3JkZXJFbmQsIGVsZW1lbnRFZGdlU3RhcnQsIGVsZW1lbnRFZGdlRW5kLCBlbGVtZW50U2l6ZSkge1xuICAgIC8qKlxuICAgICAqIElmIGVsZW1lbnQgZWRnZSBBIGFuZCBlbGVtZW50IGVkZ2UgQiBhcmUgYm90aCBvdXRzaWRlIHNjcm9sbGluZyBib3ggZWRnZSBBIGFuZCBzY3JvbGxpbmcgYm94IGVkZ2UgQlxuICAgICAqXG4gICAgICogICAgICAgICAg4pSM4pSA4pSA4pSQXG4gICAgICogICAgICAgIOKUj+KUgeKUguKUgeKUgeKUguKUgeKUk1xuICAgICAqICAgICAgICAgIOKUgiAg4pSCXG4gICAgICogICAgICAgIOKUgyDilIIgIOKUgiDilIMgICAgICAgIGRvIG5vdGhpbmdcbiAgICAgKiAgICAgICAgICDilIIgIOKUglxuICAgICAqICAgICAgICDilJfilIHilILilIHilIHilILilIHilJtcbiAgICAgKiAgICAgICAgICDilJTilIDilIDilJhcbiAgICAgKlxuICAgICAqICBJZiBlbGVtZW50IGVkZ2UgQyBhbmQgZWxlbWVudCBlZGdlIEQgYXJlIGJvdGggb3V0c2lkZSBzY3JvbGxpbmcgYm94IGVkZ2UgQyBhbmQgc2Nyb2xsaW5nIGJveCBlZGdlIERcbiAgICAgKlxuICAgICAqICAgIOKUjyDilIEg4pSBIOKUgSDilIEg4pSTXG4gICAgICogICDilIzilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilJBcbiAgICAgKiAgIOKUguKUgyAgICAgICAgIOKUg+KUgiAgICAgICAgZG8gbm90aGluZ1xuICAgICAqICAg4pSU4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSYXG4gICAgICogICAg4pSXIOKUgSDilIEg4pSBIOKUgSDilJtcbiAgICAgKi9cbiAgICBpZiAoZWxlbWVudEVkZ2VTdGFydCA8IHNjcm9sbGluZ0VkZ2VTdGFydCAmJiBlbGVtZW50RWRnZUVuZCA+IHNjcm9sbGluZ0VkZ2VFbmQgfHwgZWxlbWVudEVkZ2VTdGFydCA+IHNjcm9sbGluZ0VkZ2VTdGFydCAmJiBlbGVtZW50RWRnZUVuZCA8IHNjcm9sbGluZ0VkZ2VFbmQpIHtcbiAgICAgIHJldHVybiAwO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBJZiBlbGVtZW50IGVkZ2UgQSBpcyBvdXRzaWRlIHNjcm9sbGluZyBib3ggZWRnZSBBIGFuZCBlbGVtZW50IGhlaWdodCBpcyBsZXNzIHRoYW4gc2Nyb2xsaW5nIGJveCBoZWlnaHRcbiAgICAgKlxuICAgICAqICAgICAgICAgIOKUjOKUgOKUgOKUkFxuICAgICAqICAgICAgICDilI/ilIHilILilIHilIHilILilIHilJMgICAgICAgICDilI/ilIHilIzilIHilIHilJDilIHilJNcbiAgICAgKiAgICAgICAgICDilJTilIDilIDilJggICAgICAgICAgICAg4pSCICDilIJcbiAgICAgKiAgZnJvbSAg4pSDICAgICAg4pSDICAgICB0byAg4pSDIOKUlOKUgOKUgOKUmCDilINcbiAgICAgKlxuICAgICAqICAgICAgICDilJfilIEg4pSB4pSBIOKUgeKUmyAgICAgICAgIOKUl+KUgSDilIHilIEg4pSB4pSbXG4gICAgICpcbiAgICAgKiBJZiBlbGVtZW50IGVkZ2UgQiBpcyBvdXRzaWRlIHNjcm9sbGluZyBib3ggZWRnZSBCIGFuZCBlbGVtZW50IGhlaWdodCBpcyBncmVhdGVyIHRoYW4gc2Nyb2xsaW5nIGJveCBoZWlnaHRcbiAgICAgKlxuICAgICAqICAgICAgICDilI/ilIEg4pSB4pSBIOKUgeKUkyAgICAgICAgIOKUj+KUgeKUjOKUgeKUgeKUkOKUgeKUk1xuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAg4pSCICDilIJcbiAgICAgKiAgZnJvbSAg4pSDIOKUjOKUgOKUgOKUkCDilIMgICAgIHRvICDilIMg4pSCICDilIIg4pSDXG4gICAgICogICAgICAgICAg4pSCICDilIIgICAgICAgICAgICAg4pSCICDilIJcbiAgICAgKiAgICAgICAg4pSX4pSB4pSC4pSB4pSB4pSC4pSB4pSbICAgICAgICAg4pSX4pSB4pSC4pSB4pSB4pSC4pSB4pSbXG4gICAgICogICAgICAgICAg4pSCICDilIIgICAgICAgICAgICAg4pSU4pSA4pSA4pSYXG4gICAgICogICAgICAgICAg4pSCICDilIJcbiAgICAgKiAgICAgICAgICDilJTilIDilIDilJhcbiAgICAgKlxuICAgICAqIElmIGVsZW1lbnQgZWRnZSBDIGlzIG91dHNpZGUgc2Nyb2xsaW5nIGJveCBlZGdlIEMgYW5kIGVsZW1lbnQgd2lkdGggaXMgbGVzcyB0aGFuIHNjcm9sbGluZyBib3ggd2lkdGhcbiAgICAgKlxuICAgICAqICAgICAgIGZyb20gICAgICAgICAgICAgICAgI
1HRvXG4gICAgICogICAg4pSPIOKUgSDilIEg4pSBIOKUgSDilJMgICAgICAgICDilI8g4pSBIOKUgSDilIEg4pSBIOKUk1xuICAgICAqICDilIzilIDilIDilIDilJAgICAgICAgICAgICAgICAgIOKUjOKUgOKUgOKUgOKUkFxuICAgICAqICDilIIg4pSDIOKUgiAgICAgICDilIMgICAgICAgICDilIMgICDilIIgICAgIOKUg1xuICAgICAqICDilJTilIDilIDilIDilJggICAgICAgICAgICAgICAgIOKUlOKUgOKUgOKUgOKUmFxuICAgICAqICAgIOKUlyDilIEg4pSBIOKUgSDilIEg4pSbICAgICAgICAg4pSXIOKUgSDilIEg4pSBIOKUgSDilJtcbiAgICAgKlxuICAgICAqIElmIGVsZW1lbnQgZWRnZSBEIGlzIG91dHNpZGUgc2Nyb2xsaW5nIGJveCBlZGdlIEQgYW5kIGVsZW1lbnQgd2lkdGggaXMgZ3JlYXRlciB0aGFuIHNjcm9sbGluZyBib3ggd2lkdGhcbiAgICAgKlxuICAgICAqICAgICAgIGZyb20gICAgICAgICAgICAgICAgIHRvXG4gICAgICogICAg4pSPIOKUgSDilIEg4pSBIOKUgSDilJMgICAgICAgICDilI8g4pSBIOKUgSDilIEg4pSBIOKUk1xuICAgICAqICAgICAgICDilIzilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilJAgICDilIzilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilJBcbiAgICAgKiAgICDilIMgICDilIIgICAgIOKUgyAgICAg4pSCICAg4pSDICAgICAgICAg4pSDIOKUglxuICAgICAqICAgICAgICDilJTilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilJggICDilJTilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilJhcbiAgICAgKiAgICDilJcg4pSBIOKUgSDilIEg4pSBIOKUmyAgICAgICAgIOKUlyDilIEg4pSBIOKUgSDilIEg4pSbXG4gICAgICovXG4gICAgaWYgKGVsZW1lbnRFZGdlU3RhcnQgPD0gc2Nyb2xsaW5nRWRnZVN0YXJ0ICYmIGVsZW1lbnRTaXplIDw9IHNjcm9sbGluZ1NpemUgfHwgZWxlbWVudEVkZ2VFbmQgPj0gc2Nyb2xsaW5nRWRnZUVuZCAmJiBlbGVtZW50U2l6ZSA+PSBzY3JvbGxpbmdTaXplKSB7XG4gICAgICByZXR1cm4gZWxlbWVudEVkZ2VTdGFydCAtIHNjcm9sbGluZ0VkZ2VTdGFydCAtIHNjcm9sbGluZ0JvcmRlclN0YXJ0O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBJZiBlbGVtZW50IGVkZ2UgQiBpcyBvdXRzaWRlIHNjcm9sbGluZyBib3ggZWRnZSBCIGFuZCBlbGVtZW50IGhlaWdodCBpcyBsZXNzIHRoYW4gc2Nyb2xsaW5nIGJveCBoZWlnaHRcbiAgICAgKlxuICAgICAqICAgICAgICDilI/ilIEg4pSB4pSBIOKUgeKUkyAgICAgICAgIOKUj+KUgSDilIHilIEg4pSB4pSTXG4gICAgICpcbiAgICAgKiAgZnJvbSAg4pSDICAgICAg4pSDICAgICB0byAg4pSDIOKUjOKUgOKUgOKUkCDilINcbiAgICAgKiAgICAgICAgICDilIzilIDilIDilJAgICAgICAgICAgICAg4pSCICDilIJcbiAgICAgKiAgICAgICAg4pSX4pSB4pSC4pSB4pSB4pSC4pSB4pSbICAgICAgICAg4pSX4pSB4pSU4pSB4pSB4pSY4pSB4pSbXG4gICAgICogICAgICAgICAg4pSU4pSA4pSA4pSYXG4gICAgICpcbiAgICAgKiBJZiBlbGVtZW50IGVkZ2UgQSBpcyBvdXRzaWRlIHNjcm9sbGluZyBib3ggZWRnZSBBIGFuZCBlbGVtZW50IGhlaWdodCBpcyBncmVhdGVyIHRoYW4gc2Nyb2xsaW5nIGJveCBoZWlnaHRcbiAgICAgKlxuICAgICAqICAgICAgICAgIOKUjOKUgOKUgOKUkFxuICAgICAqICAgICAgICAgIOKUgiAg4pSCXG4gICAgICogICAgICAgICAg4pSCICDilIIgICAgICAgICAgICAg4pSM4pSA4pSA4pSQXG4gICAgICogICAgICAgIOKUj+KUgeKUguKUgeKUgeKUguKUgeKUkyAgICAgICAgIOKUj+KUgeKUguKUgeKUgeKUguKUgeKUk1xuICAgICAqICAgICAgICAgIOKUgiAg4pSCICAgICAgICAgICAgIOKUgiAg4pSCXG4gICAgICogIGZyb20gIOKUgyDilJTilIDilIDilJgg4pSDICAgICB0byAg4pSDIOKUgiAg4pSCIOKUg1xuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAg4pSCICDilIJcbiAgICAgKiAgICAgICAg4pSX4pSBIOKUgeKUgSDilIHilJsgICAgICAgICDilJfilIHilJTilIHilIHilJjilIHilJtcbiAgICAgKlxuICAgICAqIElmIGVsZW1lbnQgZWRnZSBDIGlzIG91dHNpZGUgc2Nyb2xsaW5nIGJveCBlZGdlIEMgYW5kIGVsZW1lbnQgd2lkdGggaXMgZ3JlYXRlciB0aGFuIHNjcm9sbGluZyBib3ggd2lkdGhcbiAgICAgKlxuICAgICAqICAgICAgICAgICBmcm9tICAgICAgICAgICAgICAgICB0b1xuICAgICAqICAgICAgICDilI8g4pSBIOKUgSDilIEg4pSBIOKUkyAgICAgICAgIOKUjyDilIEg4pSBIOKUgSDilIEg4pSTXG4gICAgICogIOKUjOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUkCAgICAgICAgICAg4pSM4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSQXG4gICAgICogIOKUgiAgICAg4pSDICAgICDilIIgICDilIMgICAgICAg4pSCIOKUgyAgICAgICAgIOKUg1xuICAgICAqICDilJTilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilJggICAgICAgICAgIOKUlOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUmFxuICAgICAqICAgICAgICDilJcg4pSBIOKUgSDilIEg4pSBIOKUmyAgICAgICAgIOKUlyDilIEg4pSBIOKUgSDilIEg4pSbXG4gICAgICpcbiAgICAgKiBJZiBlbGVtZW50IGVkZ2UgRCBpcyBvdXRzaWRlIHNjcm9sbGluZyBib3ggZWRnZSBEIGFuZCBlbGVtZW50IHdpZHRoIGlzIGxlc3MgdGhhbiBzY3JvbGxpbmcgYm94IHdpZHRoXG4gICAgICpcbiAgICAgKiAgICAgICAgICAgZnJvbSAgICAgICAgICAgICAgICAgdG9cbiAgICAgKiAgICAgICAg4pSPIOKUgSDilIEg4pSBIOKUgSDilJMgICAgICAgICDilI8g4pSBIOKUgSDilIEg4pSBIOKUk1xuICAgICAqICAgICAgICAgICAgICAgIOKUjOKUgOKUgOKUgOKUkCAgICAgICAgICAgICDilIzilIDilIDilIDilJBcbiAgICAgKiAgICAgICAg4pSDICAgICAgIOKUgiDilIMg4pSCICAgICAgIOKUgyAgICAg4pSCICAg4pSDXG4gICAgICogICAgICAgICAgICAgICAg4pSU4pSA4pSA4pSA4pSYICAgICAgICAgICAgIOKUlOKUgOKUgOKUgOKUmFxuICAgICAqICAgICAgICDilJcg4pSBIOKUgS
1DilIEg4pSBIOKUmyAgICAgICAgIOKUlyDilIEg4pSBIOKUgSDilIEg4pSbXG4gICAgICpcbiAgICAgKi9cbiAgICBpZiAoZWxlbWVudEVkZ2VFbmQgPiBzY3JvbGxpbmdFZGdlRW5kICYmIGVsZW1lbnRTaXplIDwgc2Nyb2xsaW5nU2l6ZSB8fCBlbGVtZW50RWRnZVN0YXJ0IDwgc2Nyb2xsaW5nRWRnZVN0YXJ0ICYmIGVsZW1lbnRTaXplID4gc2Nyb2xsaW5nU2l6ZSkge1xuICAgICAgcmV0dXJuIGVsZW1lbnRFZGdlRW5kIC0gc2Nyb2xsaW5nRWRnZUVuZCArIHNjcm9sbGluZ0JvcmRlckVuZDtcbiAgICB9XG4gICAgcmV0dXJuIDA7XG4gIH1cbiAgZnVuY3Rpb24gY29tcHV0ZVNjcm9sbEludG9WaWV3KHRhcmdldCwgc2Nyb2xsZXIsIG9wdGlvbnMpIHtcbiAgICB2YXIgYmxvY2sgPSBvcHRpb25zLmJsb2NrLFxuICAgICAgaW5saW5lID0gb3B0aW9ucy5pbmxpbmU7XG4gICAgLy8gVXNlZCB0byBoYW5kbGUgdGhlIHRvcCBtb3N0IGVsZW1lbnQgdGhhdCBjYW4gYmUgc2Nyb2xsZWRcbiAgICB2YXIgc2Nyb2xsaW5nRWxlbWVudCA9IGdldFNjcm9sbGluZ0VsZW1lbnQoKTtcbiAgICAvLyBTdXBwb3J0IHBpbmNoLXpvb21pbmcgcHJvcGVybHksIG1ha2luZyBzdXJlIGVsZW1lbnRzIHNjcm9sbCBpbnRvIHRoZSB2aXN1YWwgdmlld3BvcnRcbiAgICAvLyBCcm93c2VycyB0aGF0IGRvbid0IHN1cHBvcnQgdmlzdWFsVmlld3BvcnQgd2lsbCByZXBvcnQgdGhlIGxheW91dCB2aWV3cG9ydCBkaW1lbnNpb25zIG9uIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aC9IZWlnaHRcbiAgICAvLyBhbmQgdmlld3BvcnQgZGltZW5zaW9ucyBvbiB3aW5kb3cuaW5uZXJXaWR0aC9IZWlnaHRcbiAgICAvLyBodHRwczovL3d3dy5xdWlya3Ntb2RlLm9yZy9tb2JpbGUvdmlld3BvcnRzMi5odG1sXG4gICAgLy8gaHR0cHM6Ly9ib2thbmQuZ2l0aHViLmlvL3ZpZXdwb3J0L2luZGV4Lmh0bWxcbiAgICB2YXIgdmlld3BvcnRXaWR0aCA9IHdpbmRvdy52aXN1YWxWaWV3cG9ydCAhPSBudWxsID8gdmlzdWFsVmlld3BvcnQud2lkdGggOiBpbm5lcldpZHRoO1xuICAgIHZhciB2aWV3cG9ydEhlaWdodCA9IHdpbmRvdy52aXN1YWxWaWV3cG9ydCAhPSBudWxsID8gdmlzdWFsVmlld3BvcnQuaGVpZ2h0IDogaW5uZXJIZWlnaHQ7XG4gICAgdmFyIHZpZXdwb3J0WCA9IHdpbmRvdy5zY3JvbGxYICE9IG51bGwgPyB3aW5kb3cuc2Nyb2xsWCA6IHdpbmRvdy5wYWdlWE9mZnNldDtcbiAgICB2YXIgdmlld3BvcnRZID0gd2luZG93LnNjcm9sbFkgIT0gbnVsbCA/IHdpbmRvdy5zY3JvbGxZIDogd2luZG93LnBhZ2VZT2Zmc2V0O1xuICAgIHZhciBfYSA9IHRhcmdldC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxcbiAgICAgIHRhcmdldEhlaWdodCA9IF9hLmhlaWdodCxcbiAgICAgIHRhcmdldFdpZHRoID0gX2Eud2lkdGgsXG4gICAgICB0YXJnZXRUb3AgPSBfYS50b3AsXG4gICAgICB0YXJnZXRSaWdodCA9IF9hLnJpZ2h0LFxuICAgICAgdGFyZ2V0Qm90dG9tID0gX2EuYm90dG9tLFxuICAgICAgdGFyZ2V0TGVmdCA9IF9hLmxlZnQ7XG4gICAgLy8gVGhlc2UgdmFsdWVzIG11dGF0ZSBhcyB3ZSBsb29wIHRocm91Z2ggYW5kIGdlbmVyYXRlIHNjcm9sbCBjb29yZGluYXRlc1xuICAgIHZhciB0YXJnZXRCbG9jayA9IGJsb2NrID09PSBcInN0YXJ0XCIgfHwgYmxvY2sgPT09IFwibmVhcmVzdFwiID8gdGFyZ2V0VG9wIDogYmxvY2sgPT09IFwiZW5kXCIgPyB0YXJnZXRCb3R0b20gOiB0YXJnZXRUb3AgKyB0YXJnZXRIZWlnaHQgLyAyOyAvLyBibG9jayA9PT0gJ2NlbnRlclxuICAgIHZhciB0YXJnZXRJbmxpbmUgPSBpbmxpbmUgPT09IFwiY2VudGVyXCIgPyB0YXJnZXRMZWZ0ICsgdGFyZ2V0V2lkdGggLyAyIDogaW5saW5lID09PSBcImVuZFwiID8gdGFyZ2V0UmlnaHQgOiB0YXJnZXRMZWZ0OyAvLyBpbmxpbmUgPT09ICdzdGFydCB8fCBpbmxpbmUgPT09ICduZWFyZXN0XG4gICAgdmFyIF9iID0gc2Nyb2xsZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksXG4gICAgICBoZWlnaHQgPSBfYi5oZWlnaHQsXG4gICAgICB3aWR0aCA9IF9iLndpZHRoLFxuICAgICAgdG9wID0gX2IudG9wLFxuICAgICAgcmlnaHQgPSBfYi5yaWdodCxcbiAgICAgIGJvdHRvbSA9IF9iLmJvdHRvbSxcbiAgICAgIGxlZnQgPSBfYi5sZWZ0O1xuICAgIHZhciBmcmFtZVN0eWxlID0gZ2V0Q29tcHV0ZWRTdHlsZShzY3JvbGxlcik7XG4gICAgdmFyIGJvcmRlckxlZnQgPSBwYXJzZUludChmcmFtZVN0eWxlLmJvcmRlckxlZnRXaWR0aCwgMTApO1xuICAgIHZhciBib3JkZXJUb3AgPSBwYXJzZUludChmcmFtZVN0eWxlLmJvcmRlclRvcFdpZHRoLCAxMCk7XG4gICAgdmFyIGJvcmRlclJpZ2h0ID0gcGFyc2VJbnQoZnJhbWVTdHlsZS5ib3JkZXJSaWdodFdpZHRoLCAxMCk7XG4gICAgdmFyIGJvcmRlckJvdHRvbSA9IHBhcnNlSW50KGZyYW1lU3R5bGUuYm9yZGVyQm90dG9tV2lkdGgsIDEwKTtcbiAgICB2YXIgYmxvY2tTY3JvbGwgPSAwO1xuICAgIHZhciBpbmxpbmVTY3JvbGwgP
1SAwO1xuICAgIC8vIFRoZSBwcm9wZXJ0eSBleGlzdGFuY2UgY2hlY2tzIGZvciBvZmZzZXRbV2lkdGh8SGVpZ2h0XSBpcyBiZWNhdXNlIG9ubHkgSFRNTEVsZW1lbnQgb2JqZWN0cyBoYXZlIHRoZW0sIGJ1dCBhbnkgRWxlbWVudCBtaWdodCBwYXNzIGJ5IGhlcmVcbiAgICAvLyBAVE9ETyBmaW5kIG91dCBpZiB0aGUgXCJhcyBIVE1MRWxlbWVudFwiIG92ZXJyaWRlcyBjYW4gYmUgZHJvcHBlZFxuICAgIHZhciBzY3JvbGxiYXJXaWR0aCA9IFwib2Zmc2V0V2lkdGhcIiBpbiBzY3JvbGxlciA/IHNjcm9sbGVyLm9mZnNldFdpZHRoIC0gc2Nyb2xsZXIuY2xpZW50V2lkdGggLSBib3JkZXJMZWZ0IC0gYm9yZGVyUmlnaHQgOiAwO1xuICAgIHZhciBzY3JvbGxiYXJIZWlnaHQgPSBcIm9mZnNldEhlaWdodFwiIGluIHNjcm9sbGVyID8gc2Nyb2xsZXIub2Zmc2V0SGVpZ2h0IC0gc2Nyb2xsZXIuY2xpZW50SGVpZ2h0IC0gYm9yZGVyVG9wIC0gYm9yZGVyQm90dG9tIDogMDtcbiAgICBpZiAoc2Nyb2xsaW5nRWxlbWVudCA9PT0gc2Nyb2xsZXIpIHtcbiAgICAgIC8vIEhhbmRsZSB2aWV3cG9ydCBsb2dpYyAoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50IG9yIGRvY3VtZW50LmJvZHkpXG4gICAgICBpZiAoYmxvY2sgPT09IFwic3RhcnRcIikge1xuICAgICAgICBibG9ja1Njcm9sbCA9IHRhcmdldEJsb2NrO1xuICAgICAgfSBlbHNlIGlmIChibG9jayA9PT0gXCJlbmRcIikge1xuICAgICAgICBibG9ja1Njcm9sbCA9IHRhcmdldEJsb2NrIC0gdmlld3BvcnRIZWlnaHQ7XG4gICAgICB9IGVsc2UgaWYgKGJsb2NrID09PSBcIm5lYXJlc3RcIikge1xuICAgICAgICBibG9ja1Njcm9sbCA9IGFsaWduTmVhcmVzdCh2aWV3cG9ydFksIHZpZXdwb3J0WSArIHZpZXdwb3J0SGVpZ2h0LCB2aWV3cG9ydEhlaWdodCwgYm9yZGVyVG9wLCBib3JkZXJCb3R0b20sIHZpZXdwb3J0WSArIHRhcmdldEJsb2NrLCB2aWV3cG9ydFkgKyB0YXJnZXRCbG9jayArIHRhcmdldEhlaWdodCwgdGFyZ2V0SGVpZ2h0KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIGJsb2NrID09PSAnY2VudGVyJyBpcyB0aGUgZGVmYXVsdFxuICAgICAgICBibG9ja1Njcm9sbCA9IHRhcmdldEJsb2NrIC0gdmlld3BvcnRIZWlnaHQgLyAyO1xuICAgICAgfVxuICAgICAgaWYgKGlubGluZSA9PT0gXCJzdGFydFwiKSB7XG4gICAgICAgIGlubGluZVNjcm9sbCA9IHRhcmdldElubGluZTtcbiAgICAgIH0gZWxzZSBpZiAoaW5saW5lID09PSBcImNlbnRlclwiKSB7XG4gICAgICAgIGlubGluZVNjcm9sbCA9IHRhcmdldElubGluZSAtIHZpZXdwb3J0V2lkdGggLyAyO1xuICAgICAgfSBlbHNlIGlmIChpbmxpbmUgPT09IFwiZW5kXCIpIHtcbiAgICAgICAgaW5saW5lU2Nyb2xsID0gdGFyZ2V0SW5saW5lIC0gdmlld3BvcnRXaWR0aDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIGlubGluZSA9PT0gJ25lYXJlc3QnIGlzIHRoZSBkZWZhdWx0XG4gICAgICAgIGlubGluZVNjcm9sbCA9IGFsaWduTmVhcmVzdCh2aWV3cG9ydFgsIHZpZXdwb3J0WCArIHZpZXdwb3J0V2lkdGgsIHZpZXdwb3J0V2lkdGgsIGJvcmRlckxlZnQsIGJvcmRlclJpZ2h0LCB2aWV3cG9ydFggKyB0YXJnZXRJbmxpbmUsIHZpZXdwb3J0WCArIHRhcmdldElubGluZSArIHRhcmdldFdpZHRoLCB0YXJnZXRXaWR0aCk7XG4gICAgICB9XG4gICAgICAvLyBBcHBseSBzY3JvbGwgcG9zaXRpb24gb2Zmc2V0cyBhbmQgZW5zdXJlIHRoZXkgYXJlIHdpdGhpbiBib3VuZHNcbiAgICAgIC8vIEBUT0RPIGFkZCBtb3JlIHRlc3QgY2FzZXMgdG8gY292ZXIgdGhpcyAxMDAlXG4gICAgICBibG9ja1Njcm9sbCA9IE1hdGgubWF4KDAsIGJsb2NrU2Nyb2xsICsgdmlld3BvcnRZKTtcbiAgICAgIGlubGluZVNjcm9sbCA9IE1hdGgubWF4KDAsIGlubGluZVNjcm9sbCArIHZpZXdwb3J0WCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEhhbmRsZSBlYWNoIHNjcm9sbGluZyBmcmFtZSB0aGF0IG1pZ2h0IGV4aXN0IGJldHdlZW4gdGhlIHRhcmdldCBhbmQgdGhlIHZpZXdwb3J0XG4gICAgICBpZiAoYmxvY2sgPT09IFwic3RhcnRcIikge1xuICAgICAgICBibG9ja1Njcm9sbCA9IHRhcmdldEJsb2NrIC0gdG9wIC0gYm9yZGVyVG9wO1xuICAgICAgfSBlbHNlIGlmIChibG9jayA9PT0gXCJlbmRcIikge1xuICAgICAgICBibG9ja1Njcm9sbCA9IHRhcmdldEJsb2NrIC0gYm90dG9tICsgYm9yZGVyQm90dG9tICsgc2Nyb2xsYmFySGVpZ2h0O1xuICAgICAgfSBlbHNlIGlmIChibG9jayA9PT0gXCJuZWFyZXN0XCIpIHtcbiAgICAgICAgYmxvY2tTY3JvbGwgPSBhbGlnbk5lYXJlc3QodG9wLCBib3R0b20sIGhlaWdodCwgYm9yZGVyVG9wLCBib3JkZXJCb3R0b20gKyBzY3JvbGxiYXJIZWlnaHQsIHRhcmdldEJsb2NrLCB0YXJnZXRCbG9jayArIHRhcmdldEhlaWdodCwgdGFyZ2V0SGVpZ2h0KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIGJsb2NrID09PSAnY2VudGVyJyBpcyB0aGUgZGVmYXVsdFxuICAgICAgICBibG9ja1Njcm9sbCA9IHRhcmdldEJsb2NrIC0gKHRvcCArIGhlaWdodCAvIDIpICsgc2Nyb2xsYmFySGVpZ2h0IC8gMjtcbiAgICAgIH1cbiAgICAgIGlmIChpbmxpbmUgPT09IFwic3RhcnRcIikge1xuICAgICAgICBpbmxpbmVTY3JvbGwgP
1SB0YXJnZXRJbmxpbmUgLSBsZWZ0IC0gYm9yZGVyTGVmdDtcbiAgICAgIH0gZWxzZSBpZiAoaW5saW5lID09PSBcImNlbnRlclwiKSB7XG4gICAgICAgIGlubGluZVNjcm9sbCA9IHRhcmdldElubGluZSAtIChsZWZ0ICsgd2lkdGggLyAyKSArIHNjcm9sbGJhcldpZHRoIC8gMjtcbiAgICAgIH0gZWxzZSBpZiAoaW5saW5lID09PSBcImVuZFwiKSB7XG4gICAgICAgIGlubGluZVNjcm9sbCA9IHRhcmdldElubGluZSAtIHJpZ2h0ICsgYm9yZGVyUmlnaHQgKyBzY3JvbGxiYXJXaWR0aDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIGlubGluZSA9PT0gJ25lYXJlc3QnIGlzIHRoZSBkZWZhdWx0XG4gICAgICAgIGlubGluZVNjcm9sbCA9IGFsaWduTmVhcmVzdChsZWZ0LCByaWdodCwgd2lkdGgsIGJvcmRlckxlZnQsIGJvcmRlclJpZ2h0ICsgc2Nyb2xsYmFyV2lkdGgsIHRhcmdldElubGluZSwgdGFyZ2V0SW5saW5lICsgdGFyZ2V0V2lkdGgsIHRhcmdldFdpZHRoKTtcbiAgICAgIH1cbiAgICAgIHZhciBzY3JvbGxMZWZ0ID0gc2Nyb2xsZXIuc2Nyb2xsTGVmdCxcbiAgICAgICAgc2Nyb2xsVG9wID0gc2Nyb2xsZXIuc2Nyb2xsVG9wO1xuICAgICAgLy8gRW5zdXJlIHNjcm9sbCBjb29yZGluYXRlcyBhcmUgbm90IG91dCBvZiBib3VuZHMgd2hpbGUgYXBwbHlpbmcgc2Nyb2xsIG9mZnNldHNcbiAgICAgIGJsb2NrU2Nyb2xsID0gTWF0aC5tYXgoMCwgTWF0aC5taW4oc2Nyb2xsVG9wICsgYmxvY2tTY3JvbGwsIHNjcm9sbGVyLnNjcm9sbEhlaWdodCAtIGhlaWdodCArIHNjcm9sbGJhckhlaWdodCkpO1xuICAgICAgaW5saW5lU2Nyb2xsID0gTWF0aC5tYXgoMCwgTWF0aC5taW4oc2Nyb2xsTGVmdCArIGlubGluZVNjcm9sbCwgc2Nyb2xsZXIuc2Nyb2xsV2lkdGggLSB3aWR0aCArIHNjcm9sbGJhcldpZHRoKSk7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICB0b3A6IGJsb2NrU2Nyb2xsLFxuICAgICAgbGVmdDogaW5saW5lU2Nyb2xsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQYXRjaGVzIHRoZSAnc2Nyb2xsSW50b1ZpZXcnIG1ldGhvZCBvbiB0aGUgRWxlbWVudCBwcm90b3R5cGVcbiAgICovXG4gIGZ1bmN0aW9uIHBhdGNoRWxlbWVudFNjcm9sbEludG9WaWV3KCkge1xuICAgIEVsZW1lbnQucHJvdG90eXBlLnNjcm9sbEludG9WaWV3ID0gZnVuY3Rpb24gKGFyZykge1xuICAgICAgdmFyIG5vcm1hbGl6ZWRPcHRpb25zID0gYXJnID09IG51bGwgfHwgYXJnID09PSB0cnVlID8ge1xuICAgICAgICBibG9jazogXCJzdGFydFwiLFxuICAgICAgICBpbmxpbmU6IFwibmVhcmVzdFwiXG4gICAgICB9IDogYXJnID09PSBmYWxzZSA/IHtcbiAgICAgICAgYmxvY2s6IFwiZW5kXCIsXG4gICAgICAgIGlubGluZTogXCJuZWFyZXN0XCJcbiAgICAgIH0gOiBhcmc7XG4gICAgICAvLyBGaW5kIHRoZSBuZWFyZXN0IGFuY2VzdG9yIHRoYXQgY2FuIGJlIHNjcm9sbGVkXG4gICAgICB2Y
1XIgX2EgPSBfX3JlYWQoZmluZE5lYXJlc3RBbmNlc3RvcnNXaXRoU2Nyb2xsQmVoYXZpb3IodGhpcyksIDIpLFxuICAgICAgICBhbmNlc3RvcldpdGhTY3JvbGwgPSBfYVswXSxcbiAgICAgICAgYW5jZXN0b3JXaXRoU2Nyb2xsQmVoYXZpb3IgPSBfYVsxXTtcbiAgICAgIHZhciBiZWhhdmlvciA9IG5vcm1hbGl6ZWRPcHRpb25zLmJlaGF2aW9yICE9IG51bGwgPyBub3JtYWxpemVkT3B0aW9ucy5iZWhhdmlvciA6IGFuY2VzdG9yV2l0aFNjcm9sbEJlaGF2aW9yO1xuICAgICAgLy8gSWYgdGhlIGJlaGF2aW9yIGlzbid0IHNtb290aCwgc2ltcGx5IGludm9rZSB0aGUgb3JpZ2luYWwgaW1wbGVtZW50YXRpb24gYW5kIGRvIG5vIG1vcmVcbiAgICAgIGlmIChiZWhhdmlvciAhPT0gXCJzbW9vdGhcIikge1xuICAgICAgICAvLyBBc3NlcnQgdGhhdCAnc2Nyb2xsSW50b1ZpZXcnIGlzIGFjdHVhbGx5IGRlZmluZWRcbiAgICAgICAgaWYgKEVMRU1FTlRfT1JJR0lOQUxfU0NST0xMX0lOVE9fVklFVyAhPSBudWxsKSB7XG4gICAgICAgICAgRUxFTUVOVF9PUklHSU5BTF9TQ1JPTExfSU5UT19WSUVXLmNhbGwodGhpcywgbm9ybWFsaXplZE9wdGlvbnMpO1xuICAgICAgICB9XG4gICAgICAgIC8vIE90aGVyd2lzZSwgaW52b2tlICdzY3JvbGxUbycgaW5zdGVhZCBhbmQgcHJvdmlkZSB0aGUgc2Nyb2xsIGNvb3JkaW5hdGVzXG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgIHZhciBfYiA9IGNvbXB1dGVTY3JvbGxJbnRvVmlldyh0aGlzLCBhbmNlc3RvcldpdGhTY3JvbGwsIG5vcm1hbGl6ZWRPcHRpb25zKSxcbiAgICAgICAgICAgIHRvcF8xID0gX2IudG9wLFxuICAgICAgICAgICAgbGVmdCA9IF9iLmxlZnQ7XG4gICAgICAgICAgZ2V0T3JpZ2luYWxTY3JvbGxNZXRob2RGb3JLaW5kKFwic2Nyb2xsVG9cIiwgdGhpcykuY2FsbCh0aGlzLCBsZWZ0LCB0b3BfMSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgYW5jZXN0b3JXaXRoU2Nyb2xsLnNjcm9sbFRvKF9hc3NpZ24oe1xuICAgICAgICBiZWhhdmlvcjogYmVoYXZpb3JcbiAgICAgIH0sIGNvbXB1dGVTY3JvbGxJbnRvVmlldyh0aGlzLCBhbmNlc3RvcldpdGhTY3JvbGwsIG5vcm1hbGl6ZWRPcHRpb25zKSkpO1xuICAgIH07XG4gICAgLy8gT24gSUUxMSwgSFRNTEVsZW1lbnQgaGFzIGl0cyBvd24gZGVjbGFyYXRpb24gb2Ygc2Nyb2xsSW50b1ZpZXcgYW5kIGRvZXMgbm90IGluaGVyaXQgdGhpcyBmcm9tIHRoZSBwcm90b3R5cGUgY2hhaW4sIHNvIHdlJ2xsIG5lZWQgdG8gcGF0Y2ggdGhhdCBvbmUgdG9vLlxuICAgIGlmIChIVE1MRWxlbWVudC5wcm90b3R5cGUuc2Nyb2xsSW50b1ZpZXcgIT0gbnVsbCAmJiBIVE1MRWxlbWVudC5wcm90b3R5cGUuc2Nyb2xsSW50b1ZpZXcgIT09IEVsZW1lbnQucHJvdG90eXBlLnNjcm9sbEludG9WaWV3KSB7XG4gICAgICBIVE1MRWxlbWVudC5wcm90b3R5cGUuc2Nyb2xsSW50b1ZpZXcgPSBFbGVtZW50LnByb3RvdHlwZS5zY3JvbGxJbnRvVmlldztcbiAgICB9XG4gIH1cbiAgdmFyIEVMRU1FTlRfT1JJR0lOQUxfU0NST0xMX1RPUF9TRVRfREVTQ1JJUFRPUiA9IFVOU1VQUE9SVEVEX0VOVklST05NRU5UID8gdW5kZWZpbmVkIDogT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihFbGVtZW50LnByb3RvdHlwZSwgXCJzY3JvbGxUb3BcIikuc2V0O1xuXG4gIC8qKlxuICAgKiBQYXRjaGVzIHRoZSAnc2Nyb2xsVG9wJyBwcm9wZXJ0eSBkZXNjcmlwdG9yIG9uIHRoZSBFbGVtZW50IHByb3RvdHlwZVxuICAgKi9cbiAgZnVuY3Rpb24gcGF0Y2hFbGVtZW50U2Nyb2xsVG9wKCkge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShFbGVtZW50LnByb3RvdHlwZSwgXCJzY3JvbGxUb3BcIiwge1xuICAgICAgc2V0OiBmdW5jdGlvbiBzZXQoc2Nyb2xsVG9wKSB7XG4gICAgICAgIGlmICh0aGlzLl9fYWRqdXN0aW5nU2Nyb2xsUG9zaXRpb24pIHtcbiAgICAgICAgICByZXR1cm4gRUxFTUVOVF9PUklHSU5BTF9TQ1JPTExfVE9QX1NFVF9ERVNDUklQVE9SLmNhbGwodGhpcywgc2Nyb2xsVG9wKTtcbiAgICAgICAgfVxuICAgICAgICBoYW5kbGVTY3JvbGxNZXRob2QodGhpcywgXCJzY3JvbGxUb1wiLCB0aGlzLnNjcm9sbExlZnQsIHNjcm9sbFRvcCk7XG4gICAgICAgIHJldHVybiBzY3JvbGxUb3A7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbiAgdmFyIEVMRU1FTlRfT1JJR0lOQUxfU0NST0xMX0xFRlRfU0VUX0RFU0NSSVBUT1IgPSBVTlNVUFBPUlRFRF9FTlZJUk9OTUVOVCA/IHVuZGVmaW5lZCA6IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoRWxlbWVudC5wcm90b3R5cGUsIFwic2Nyb2xsTGVmdFwiKS5zZXQ7XG5cbiAgLyoqXG4gICAqIFBhdGNoZXMgdGhlICdzY3JvbGxMZWZ0JyBwcm9wZXJ0eSBkZXNjcmlwdG9yIG9uIHRoZSBFbGVtZW50IHByb3RvdHlwZVxuICAgKi9cbiAgZnVuY3Rpb24gcGF0Y2hFbGVtZW50U2Nyb2xsTGVmdCgpIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoRWxlbWVudC5wcm90b3R5cGUsIFwic2Nyb2xsTGVmdFwiLCB7XG4gICAgICBzZXQ6IGZ1bmN0aW9uIHNldChzY3JvbGxMZWZ0KSB7XG4gICAgICAgIGlmICh0aGlzLl9fYWRqdXN0aW5nU2Nyb2xsUG9zaXRpb24pIHtcbiAgICAgICAgICByZXR1cm4gRUxFTUVOVF9PUklHSU5BTF9TQ1JPTExfTEVGVF9TRVRfREVTQ1JJUFRPUi5jYWxsKHRoaXMsIHNjcm9sbExlZnQpO1xuICAgICAgICB9XG4gICAgICAgIGhhbmRsZVNjcm9sbE1ldGhvZCh0aGlzLCBcInNjcm9sbFRvXCIsIHNjcm9sbExlZnQsIHRoaXMuc2Nyb2xsVG9wKTtcbiAgICAgICAgcmV0dXJuIHNjcm9sbExlZnQ7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQXBwbGllcyB0aGUgcG9seWZpbGxcbiAgICovXG4gIGZ1bmN0aW9uIHBhdGNoKCkge1xuICAgIC8vIEVsZW1lbnQucHJvdG90eXBlIG1ldGhvZHNcbiAgICBwYXRjaEVsZW1lbnRTY3JvbGwoKTtcbiAgICBwYXRjaEVsZW1lbnRTY3JvbGxCeSgpO1xuICAgIHBhdGNoRWxlbWVudFNjcm9sbFRvKCk7XG4gICAgcGF0Y2hFbGVtZW50U2Nyb2xsSW50b1ZpZXcoKTtcbiAgICAvLyBFbGVtZW50LnByb3RvdHlwZSBkZXNjcmlwdG9yc1xuICAgIHBhdGNoRWxlbWVudFNjcm9sbExlZnQoKTtcbiAgICBwYXRjaEVsZW1lbnRTY3JvbGxUb3AoKTtcbiAgICAvLyB3aW5kb3cgbWV0aG9kc1xuICAgIHBhdGNoV2luZG93U2Nyb2xsKCk7XG4gICAgcGF0Y2hXaW5kb3dTY3JvbGxCeSgpO1xuICAgIHBhdGNoV2luZG93U2Nyb2xsVG8oKTtcbiAgICAvLyBOYXZpZ2F0aW9uXG4gICAgY2F0Y2hOYXZpZ2F0aW9uKCk7XG4gIH1cblxuICAvKipcbiAgICogSXMgdHJ1ZSBpZiB0aGUgYnJvd3NlciBuYXRpdmVseSBzdXBwb3J0cyB0aGUgRWxlbWVudC5wcm90b3R5cGUuW3Njcm9sbHxzY3JvbGxUb3xzY3JvbGxCeXxzY3JvbGxJbnRvVmlld10gbWV0aG9kc1xuICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICovXG4gIHZhciBTVVBQT1JUU19FTEVNRU5UX1BST1RPVFlQRV9TQ1JPTExfTUVUSE9EUyA9IFVOU1VQUE9SVEVEX0VOVklST05NRU5UID8gZmFsc2UgOiBcInNjcm9sbFwiIGluIEVsZW1lbnQucHJvdG90eXBlICYmIFwic2Nyb2xsVG9cIiBpbiBFbGVtZW50LnByb3RvdHlwZSAmJiBcInNjcm9sbEJ5XCIgaW4gRWxlbWVudC5wcm90b3R5cGUgJiYgXCJzY3JvbGxJbnRvVmlld1wiIGluIEVsZW1lbnQucHJvdG90eXBlO1xuICBpZiAoIVVOU1VQUE9SVEVEX0VOVklST05NRU5UICYmICghU1VQUE9SVFNfU0NST0xMX0JFSEFWSU9SIHx8ICFTVVBQT1JUU19FTEVNRU5UX1BST1RPVFlQRV9TQ1JPTExfTUVUSE9EUykpIHtcbiAgICBwYXRjaCgpO1xuICB9XG59KSgpOyJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///767\n')},701:(__unused_webpack_module,__unused_webpack___webpack_exports__,__webpack_require__)=>{"use strict";eval("/* harmony import */ var scroll_behavior_polyfill__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(767);\n/* harmony import */ var scroll_behavior_polyfill__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(scroll_behavior_polyfill__WEBPACK_IMPORTED_MODULE_0__);\n\n\n/**\n *** Page loading */\nvar loadingWrapper = document.getElementById('loadingWrapper');\nwindow.onload = function () {\n setTimeout(function () {\n loadingWrapper.classList.add('disabled');\n }, 100);\n}(function () {\n /**\n *** burger */\n var burger = document.getElementById('jsBurger');\n // ãªãå ´åã¯ãªã«ãããªã\n if (!burger) {\n return;\n }\n burger.addEventListener('click', function () {\n document.body.classList.toggle('visible-mobile-menu');\n });
1\n\n /**\n *** overlay */\n var overlay = document.getElementById('jsOverlay');\n // ãªãå ´åã¯ãªã«ãããªã\n if (!overlay) {\n return;\n }\n overlay.addEventListener('click', function () {\n document.body.classList.remove('visible-mobile-menu');\n });\n}());\n\n/**\n *** pagetop */\n(function () {\n var pagetop = document.getElementById('jsPagetop');\n // ãªãå ´åã¯ãªã«ãããªã\n if (!pagetop) {\n return;\n }\n var pagetopActiveClass = 'pagetop-active';\n // Scroll event\n window.addEventListener('scroll', function (e) {\n if (window.scrollY > 100) {\n pagetop.classList.add(pagetopActiveClass);\n } else {\n pagetop.classList.remove(pagetopActiveClass);\n }\n });\n // Click event\n pagetop.addEventListener('click', function () {\n window.scrollTo({\n top: 0,\n left: 0,\n behavior: 'smooth'\n });\n });\n})();\n\n/**\n *** accordion */\n(function () {\n // ã¢ã³ã¼ãã£ãªã³ã®è¦ªè¦ç´ ã®ã¯ã©ã¹å\n var accordionParentClassName = '.accordion';\n // ã¢ã³ã¼ãã£ãªã³ã®ã¯ãªãã¯ã¤ãã³ããè¡ãã¯ã©ã¹å\n var triggerClassName = '.js-accordion-trigger';\n // ã¢ã³ã¼ãã£ãªã³ãéãããã®ã¯ã©ã¹å\n var activeClassName = 'active';\n\n // ã¢ã³ã¼ãã£ãªã³ã®ããªã¬ã¼ããã¹ã¦åå¾ãã\n var acc = document.querySelectorAll(triggerClassName);\n\n // ã¯ãªãã¯ã¤ãã³ã\n for (var i = 0; i < acc.length; i++) {\n acc[i].addEventListener('click', function (e) {\n // ã¢ã¯ãã£ãã¯ã©ã¹ãä»ãã¦ããããã§ãã¯ãã\n var isActive = this.classList.contains(activeClassName);\n // ã¯ãªãã¯ããè¦ç´ ã®ã¢ã³ã¼ãã£ãªã³ã®è¦ªè¦ç´ ãåå¾ãã\n var parentAccordion = this.closest(accordionParentClassName);\n\n // ãã¹ã¦ã®ã¢ã³ã¼ãã£ãªã³ãéãã\n var allAccordions = parentAccordion.querySelectorAll(triggerClassName);\n for (var j = 0; j < allAccordions.length; j++) {\n // Remove active class from section header\n allAccordions[j].classList.remove(activeClassName);\n // Remove the max-height class from the panel to close it\n var _panel = allAccordions[j].nextElementSibling;\n var _maxHeightValue = getStyle(_panel, 'maxHeight');\n if (_maxHeightValue !== '0px') {\n _panel.style.maxHeight = null;\n }\n }\n\n // ã¢ã¯ãã£ãã¯ã©ã¹ã®ä»ãæ¿ã\n isActive ? this.classList.remove(activeClassName) : this.classList.add(activeClassName);\n\n // ã¢ã³ã¼ãã£ãªã³ã®ééå¦ç\n var panel = this.nextElementSibling;\n var maxHeightValue = getStyle(panel, 'maxHeight');\n if (maxHeightValue !== '0px') {\n panel.style.maxHeight = null;\n } else {\n panel.style.maxHeight = panel.scrollHeight + 'px';\n }\n });\n }\n})();\n\n/**\n *** tab */\n(function () {\n // ã¿ãå¦çãè¡ãè¦ç´ ã®ã¯ã©ã¹å\n var tabsClass = 'js-tab';\n var currentClassName = 'js-tab-current';\n var currentViewClassName = 'js-tab-current-view';\n // ã¿ãå¦çãè¡ãè¦ç´ ã®åå¾\n var tabs = document.getElementsByClassName(tabsClass);\n // ãªãå ´åã¯ãªã«ãããªã\n if (!tabs) {\n return;\n }\n\n // Click event\n for (var i = 0; i < tabs.length; i++) {\n tabs[i].addEventListener('click', function () {\n // ãã¼ã¿å±æ§ãåå¾ãã\n var view = this.dataset.view;\n // .current ãä»ä¸ãã¦ããããã§ãã¯\n var isCurrent = this.classList.contains(currentClassName);\n // ã¯ãªãã¯ããã¿ãã®è¦ªè¦ç´ ãåå¾ãã\n var tabsParent = this.closest('.tab-wrapper');\n // ä»ã®ã¿ãè¦ç´ ã«å½±é¿ããªãããã«ã¯ãªãã¯ããã¿ãè¦ç´ ã ãã«çµã\n var tabsChild = tabsParent.getElementsByClassName(tabsClass);\n // ã³ã³ãã³ãã®è¦ç´ ãåå¾ãã\n var allContents = tabsParent.getElementsByClassName('js-tab-contents');\n if (!isCurrent) {\n // remove .current\n for (var j = 0; j < tabsChild.length;
1 j++) {\n tabsChild[j].classList.remove(currentClassName);\n }\n this.classList.add(currentClassName);\n }\n // remove .current-view\n for (var k = 0; k < allContents.length; k++) {\n allContents[k].classList.remove(currentViewClassName);\n }\n //\n document.getElementById(view).classList.add(currentViewClassName);\n });\n }\n})();\n\n/**\n *** ãã¼ã¸å
ãªã³ã¯ */\n(function () {\n var elm = document.querySelectorAll('.js-page-anchor');\n // ãªãå ´åã¯ãªã«ãããªã\n if (!elm.length) {\n return;\n }\n // ã¤ãã³ã\n for (var i = 0; i < elm.length; i++) {\n elm[i].addEventListener('click', function (e) {\n e.preventDefault();\n var href = this.getAttribute('href');\n // ãã¼ã¸å
ãªã³ã¯ã§ãªãå ´åã¯ä½ãããªã\n if (href.slice(0, 1) != '#') {\n return;\n }\n // ãªã³ã¯å
ã®è¦ç´ ãåå¾\n var pageID = document.getElementById(href.slice(1));\n // ãªãå ´åã¯ãªã«ãããªã\n if (!pageID) {\n return;\n }\n var rect = pageID.getBoundingClientRect();\n var scrollTop = window.pageYOffset || document.documentElement.scrollTop;\n var position = rect.top + scrollTop;\n // ã¹ã¯ãã¼ã«å¦ç\n window.scrollTo({\n top: position - 120,\n left: 0,\n behavior: 'smooth'\n });\n });\n }\n})();\n\n/**\n *** æå®ããããããã£ãè¦ç´ ããåå¾ãã */\nvar getStyle = function getStyle(el, styleProp) {\n var defaultView = (el.ownerDocument || document).defaultView;\n styleProp = styleProp.replace(/([A-Z])/g, '-$1').toLowerCase();\n return defaultView.getComputedStyle(el, null).getPropertyValue(styleProp);\n};\n\n/**\n *** Grobal Menu Event */\n(function () {\n // ã°ãã¼ãã«ããã²ã¼ã·ã§ã³ã®è¦ç´ \n var globalNav = document.getElementById('globalNav');\n\n // ãã¹ã¦ã®ããªã¬ã¼ãåå¾ãã\n var allTrigger = globalNav.querySelectorAll('.js-trigger');\n\n // å¹
ã lg 以ä¸ã®ãã¥ã¼ãã¼ããã¿ã¼ã²ããã¨ããã¡ãã£ã¢ã¯ã¨ãªã使\n var mediaQuery = window.matchMedia('(min-width: 992px)');\n\n // ã¢ã¯ãã£ãã¯ã©ã¹ãä»ãã¦ããããã§ãã¯ãã\n var activeClassName = 'active';\n\n // ããã¼æã«ä»ä¸ããã¯ã©ã¹å\n var hoverClassName = 'hover';\n\n // Window width\n var memoryWindowWidth = window.innerWidth;\n\n // ã¤ãã³ã\n allTrigger.forEach(function (elm) {\n // ã¯ãªãã¯ã¤ãã³ã\n elm.addEventListener('click', function (t) {\n var _this = this;\n // PCã§ã®å¦ç\n if (mediaQuery.matches) {\n return;\n } else {\n // ã¢ãã¤ã«ã§ã®å¦ç\n t.preventDefault();\n // ã¢ã¯ãã£ãå¤å®\n var isActive = this.parentNode.classList.contains(activeClassName);\n\n // ä¸åº¦ããã¹ã¦ã®ã¡ãã¥ã¼ãéãã\n allTrigger.forEach(function (child) {\n // é«ããåå¾ããè¦ç´ ï¼ã¯ãªãã¯ããè¦ç´ ã®åã¡ãã¥ã¼ï¼\n var panel = child.nextElementSibling;\n //const maxHeightValue = getStyle(panel, 'maxHeight');\n if (child !== _this) {\n child.parentNode.classList.remove(activeClassName);\n panel.style.maxHeight = null;\n }\n });\n // ã¢ã¯ãã£ãã¯ã©ã¹ã®å¦ç\n isActive ? this.parentNode.classList.remove(activeClassName) : this.parentNode.classList.add(activeClassName);\n // åã¡ãã¥ã¼ã®ééå¦ç\n // Toggle the panel element\n var panel = this.nextElementSibling;\n var maxHeightValue = getStyle(panel, 'maxHeight');\n if (maxHeightValue !== '0px') {\n panel.style.maxHeight = null;\n return;\n }\n panel.style.maxHeight = panel.scrollHeight + 'px';\n }\n });\n\n // PCæã®ããã¼å¦ç\n // elm.parentNode.addEventListener('mouseenter', () => {\n // if (mediaQuery.matches) {\n // elm.parentNode.classList.add(hoverClassName);\n // elm.nextElementSibling.style.maxHeight = elm.nextElementSibling.scrollHeight + 'px';\n // }\n // });\n // elm.parentNode.addEventListener('mouseleave', () => {\n // if (mediaQuery.matches) {\n // elm.parentNode.classList.remove(hoverClassName);\n // elm.nextElementSibling.style.maxHeight = null;\n // }\n // });\n });\n // window ãªãµã¤ãºã§ã¡ãã¥ã¼ãã¯ãªã¢ã«ããå¦ç\n window.addEventListener('resize', function () {\n if (memoryWindowWidth !== window.innerWidth) {\n // window ã® width ãåå¾ãç´ã\n memoryWindowWidth = window.innerWidth;\n allTrigger.forEach(function (el) {\n // åã¡ãã¥ã¼ãéãã\n el.parentNode.classList.remove(activeClassName);\n var panel = el.nextElementSibling;\n panel.style.maxHeight = null;\n });\n // ãã¼ã¬ã¼ãéãã\n this.document.body.classList.remove('visible-mobile-menu');\n }\n });\n})();\n\n/**\n *** Maker Animation */\n(function () {\n var markers = document.querySelectorAll('.marker-animation');\n var root = null;\n var observerAction = function observerAction(entries) {\n entries.forEac
1h(function (entry) {\n if (entry.isIntersecting) {\n entry.target.classList.add('is-visible');\n } else {\n entry.target.classList.remove('is-visible');\n }\n });\n };\n var optionsMarkers = {\n root: root,\n rootMargin: '0px 0px -30%' // ãã¥ã¼ãã¼ãã®ä¸å¿ãå¤å®åºæºã«ãã\n };\n\n var startObserve = function startObserve(targets, options) {\n var observer = new IntersectionObserver(observerAction, options);\n targets.forEach(function (target) {\n observer.observe(target);\n });\n };\n startObserve(markers, optionsMarkers);\n\n /**\n *** Modal */\n var openButtons = document.querySelectorAll('.js-modal-open');\n openButtons.forEach(function (btn) {\n btn.addEventListener('click', function () {\n var modalAttribute = btn.getAttribute('data-modal');\n var modalShow = document.getElementById(modalAttribute);\n modalShow.classList.add('active');\n });\n });\n var closeButtons = document.querySelectorAll('.js-modal-close');\n closeButtons.forEach(function (btn) {\n btn.addEventListener('click', function () {\n var modal = btn.closest('.modal-outer');\n modal.classList.remove('active');\n });\n });\n var modalOuter = document.querySelectorAll('.modal-outer');\n modalOuter.forEach(function (outer) {\n outer.addEventListener('click', function (event) {\n if (event.target.closest('.modal-inner') === null) {\n event.target.classList.remove('active');\n }\n });\n });\n})();//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNzAxLmpzIiwibWFwcGluZ3MiOiI7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9wb3Rhc2xpbS8uL3NyYy93ZWJwYWNrL21vZHVsZS5qcz8wZWFlIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAnc2Nyb2xsLWJlaGF2aW9yLXBvbHlmaWxsJztcblxuLyoqXG4gKioqICBQYWdlIGxvYWRpbmcgICovXG52YXIgbG9hZGluZ1dyYXBwZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbG9hZGluZ1dyYXBwZXInKTtcbndpbmRvdy5vbmxvYWQgPSBmdW5jdGlvbiAoKSB7XG4gIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgIGxvYWRpbmdXcmFwcGVyLmNsYXNzTGlzdC5hZGQoJ2Rpc2FibGVkJyk7XG4gIH0sIDEwMCk7XG59KGZ1bmN0aW9uICgpIHtcbiAgLyoqXG4gICAqKiogIGJ1cmdlciAgKi9cbiAgdmFyIGJ1cmdlciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdqc0J1cmdlcicpO1xuICAvLyDjgarjgYTloLTlkIjjga/jgarjgavjgoLjgZfjgarjgYRcbiAgaWYgKCFidXJnZXIpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgYnVyZ2VyLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24gKCkge1xuICAgIGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LnRvZ2dsZSgndmlzaWJsZS1tb2JpbGUtbWVudScpO1xuICB9KTtcblxuICAvKipcbiAgICoqKiAgb3ZlcmxheSAgKi9cbiAgdmFyIG92ZXJsYXkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnanNPdmVybGF5Jyk7XG4gIC8vIOOBquOBhOWgtOWQiOOBr+OBquOBq+OCguOBl+OBquOBhFxuICBpZiAoIW92ZXJsYXkpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgb3ZlcmxheS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGZ1bmN0aW9uICgpIHtcbiAgICBkb2
1N1bWVudC5ib2R5LmNsYXNzTGlzdC5yZW1vdmUoJ3Zpc2libGUtbW9iaWxlLW1lbnUnKTtcbiAgfSk7XG59KCkpO1xuXG4vKipcbiAqKiogIHBhZ2V0b3AgICovXG4oZnVuY3Rpb24gKCkge1xuICB2YXIgcGFnZXRvcCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdqc1BhZ2V0b3AnKTtcbiAgLy8g44Gq44GE5aC05ZCI44Gv44Gq44Gr44KC44GX44Gq44GEXG4gIGlmICghcGFnZXRvcCkge1xuICAgIHJldHVybjtcbiAgfVxuICB2YXIgcGFnZXRvcEFjdGl2ZUNsYXNzID0gJ3BhZ2V0b3AtYWN0aXZlJztcbiAgLy8gU2Nyb2xsIGV2ZW50XG4gIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdzY3JvbGwnLCBmdW5jdGlvbiAoZSkge1xuICAgIGlmICh3aW5kb3cuc2Nyb2xsWSA+IDEwMCkge1xuICAgICAgcGFnZXRvcC5jbGFzc0xpc3QuYWRkKHBhZ2V0b3BBY3RpdmVDbGFzcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHBhZ2V0b3AuY2xhc3NMaXN0LnJlbW92ZShwYWdldG9wQWN0aXZlQ2xhc3MpO1xuICAgIH1cbiAgfSk7XG4gIC8vIENsaWNrIGV2ZW50XG4gIHBhZ2V0b3AuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmdW5jdGlvbiAoKSB7XG4gICAgd2luZG93LnNjcm9sbFRvKHtcbiAgICAgIHRvcDogMCxcbiAgICAgIGxlZnQ6IDAsXG4gICAgICBiZWhhdmlvcjogJ3Ntb290aCdcbiAgICB9KTtcbiAgfSk7XG59KSgpO1xuXG4vKipcbiAqKiogIGFjY29yZGlvbiAgKi9cbihmdW5jdGlvbiAoKSB7XG4gIC8vIOOCouOCs+ODvOODh+OCo+OCquODs+OBruimquimgee0oOOBruOCr+ODqeOCueWQjVxuICB2YXIgYWNjb3JkaW9uUGFyZW50Q2xhc3NOYW1lID0gJy5hY2NvcmRpb24nO1xuICAvLyDjgqLjgrPjg7zjg4fjgqPjgqrjg7Pjga7jgq/jg6rjg4Pjgq/jgqTjg5njg7Pjg4jjgpLooYzjgYbjgq/jg6njgrnlkI1cbiAgdmFyIHRyaWdnZXJDbGFzc05hbWUgPSAnLmpzLWFjY29yZGlvbi10cmlnZ2VyJztcbiAgLy8g44Ki44Kz44O844OH44Kj44Kq44Oz44KS6ZaL44GP44Gf44KB44Gu44Kv44Op44K55ZCNXG4gIHZhciBhY3RpdmVDbGFzc05hbWUgPSAnYWN0aXZlJztcblxuICAvLyDjgqLjgrPjg7zjg4fjgqPjgqrjg7Pjga7jg4jjg6rjgqzjg7zjgpLjgZnjgbnjgablj5blvpfjgZnjgotcbiAgdmFyIGFjYyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwodHJpZ2dlckNsYXNzTmFtZSk7XG5cbiAgLy8g44Kv44Oq44OD44Kv44Kk44OZ44Oz44OIXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgYWNjLmxlbmd0aDsgaSsrKSB7XG4gICAgYWNjW2ldLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24gKGUpIHtcbiAgICAgIC8vIOOCouOCr+ODhuOCo+ODluOCr+ODqeOCueOBjOS7mOOBhOOBpuOBhOOCi+OBi+ODgeOCp+ODg+OCr+OBmeOCi1xuICAgICAgdmFyIGlzQWN0aXZlID0gdGhpcy5jbGFzc0xpc3QuY29udGFpbnMoYWN0aXZlQ2xhc3NOYW1lKTtcbiAgICAgIC8vIOOCr+ODquODg+OCr+OBl+OBn+imgee0oOOBruOCouOCs+ODvOODh+OCo+OCquODs+OBruimquimgee0oOOCkuWPluW+l+OBmeOCi1xuICAgICAgdmFyIHBhcmVudEFjY29yZGlvbiA9IHRoaXMuY2xvc2VzdChhY2NvcmRpb25QYXJlbnRDbGFzc05hbWUpO1xuXG4gICAgICAvLyDjgZnjgbnjgabjga7jgqLjgrPjg7zjg4fjgqPjgqrjg7PjgpLplonjgZjjgotcbiAgICAgIHZhciBhbGxBY2NvcmRpb25zID0gcGFyZW50QWNjb3JkaW9uLnF1ZXJ5U2VsZWN0b3JBbGwodHJpZ2dlckNsYXNzTmFtZSk7XG4gICAgICBmb3IgKHZhciBqID0gMDsgaiA8IGFsbEFjY29yZGlvbnMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgLy8gUmVtb3ZlIGFjdGl2ZSBjbGFzcyBmcm9tIHNlY3Rpb24gaGVhZGVyXG4gICAgICAgIGFsbEFjY29yZGlvbnNbal0uY2xhc3NMaXN0LnJlbW92ZShhY3RpdmVDbGFzc05hbWUpO1xuICAgICAgICAvLyBSZW1vdmUgdGhlIG1heC1oZWlnaHQgY2xhc3MgZnJvbSB0aGUgcGFuZWwgdG8gY2xvc2UgaXRcbiAgICAgICAgdmFyIF9wYW5lbCA9IGFsbEFjY29yZGlvbnNbal0ubmV4dEVsZW1lbnRTaWJsaW5nO1xuICAgICAgICB2Y
1XIgX21heEhlaWdodFZhbHVlID0gZ2V0U3R5bGUoX3BhbmVsLCAnbWF4SGVpZ2h0Jyk7XG4gICAgICAgIGlmIChfbWF4SGVpZ2h0VmFsdWUgIT09ICcwcHgnKSB7XG4gICAgICAgICAgX3BhbmVsLnN0eWxlLm1heEhlaWdodCA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8g44Ki44Kv44OG44Kj44OW44Kv44Op44K544Gu5LuY44GR5pu/44GIXG4gICAgICBpc0FjdGl2ZSA/IHRoaXMuY2xhc3NMaXN0LnJlbW92ZShhY3RpdmVDbGFzc05hbWUpIDogdGhpcy5jbGFzc0xpc3QuYWRkKGFjdGl2ZUNsYXNzTmFtZSk7XG5cbiAgICAgIC8vIOOCouOCs+ODvOODh+OCo+OCquODs+OBrumWi+mWieWHpueQhlxuICAgICAgdmFyIHBhbmVsID0gdGhpcy5uZXh0RWxlbWVudFNpYmxpbmc7XG4gICAgICB2YXIgbWF4SGVpZ2h0VmFsdWUgPSBnZXRTdHlsZShwYW5lbCwgJ21heEhlaWdodCcpO1xuICAgICAgaWYgKG1heEhlaWdodFZhbHVlICE9PSAnMHB4Jykge1xuICAgICAgICBwYW5lbC5zdHlsZS5tYXhIZWlnaHQgPSBudWxsO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcGFuZWwuc3R5bGUubWF4SGVpZ2h0ID0gcGFuZWwuc2Nyb2xsSGVpZ2h0ICsgJ3B4JztcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxufSkoKTtcblxuLyoqXG4gKioqICB0YWIgICovXG4oZnVuY3Rpb24gKCkge1xuICAvLyDjgr/jg5blh6bnkIbjgpLooYzjgYbopoHntKDjga7jgq/jg6njgrnlkI1cbiAgdmFyIHRhYnNDbGFzcyA9ICdqcy10YWInO1xuICB2YXIgY3VycmVudENsYXNzTmFtZSA9ICdqcy10YWItY3VycmVudCc7XG4gIHZhciBjdXJyZW50Vmlld0NsYXNzTmFtZSA9ICdqcy10YWItY3VycmVudC12aWV3JztcbiAgLy8g44K/44OW5Yem55CG44KS6KGM44GG6KaB57Sg44Gu5Y+W5b6XXG4gIHZhciB0YWJzID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSh0YWJzQ2xhc3MpO1xuICAvLyDjgarjgYTloLTlkIjjga/jgarjgavjgoLjgZfjgarjgYRcbiAgaWYgKCF0YWJzKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gQ2xpY2sgZXZlbnRcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCB0YWJzLmxlbmd0aDsgaSsrKSB7XG4gICAgdGFic1tpXS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIC8vIOODh+ODvOOCv+WxnuaAp+OCkuWPluW+l+OBmeOCi1xuICAgICAgdmFyIHZpZXcgPSB0aGlzLmRhdGFzZXQudmlldztcbiAgICAgIC8vIC5jdXJyZW50IOOBjOS7mOS4juOBl+OBpuOBhOOCi+OBi+ODgeOCp+ODg+OCr1xuICAgICAgdmFyIGlzQ3VycmVudCA9IHRoaXMuY2xhc3NMaXN0LmNvbnRhaW5zKGN1cnJlbnRDbGFzc05hbWUpO1xuICAgICAgLy8g44Kv44Oq44OD44Kv44GX44Gf44K/44OW44Gu6Kaq6KaB57Sg44KS5Y+W5b6X44GZ44KLXG4gICAgICB2Y
1XIgdGFic1BhcmVudCA9IHRoaXMuY2xvc2VzdCgnLnRhYi13cmFwcGVyJyk7XG4gICAgICAvLyDku5bjga7jgr/jg5bopoHntKDjgavlvbHpn7/jgZfjgarjgYTjgojjgYbjgavjgq/jg6rjg4Pjgq/jgZfjgZ/jgr/jg5bopoHntKDjgaDjgZHjgavntZ7jgotcbiAgICAgIHZhciB0YWJzQ2hpbGQgPSB0YWJzUGFyZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUodGFic0NsYXNzKTtcbiAgICAgIC8vIOOCs+ODs+ODhuODs+ODhOOBruimgee0oOOCkuWPluW+l+OBmeOCi1xuICAgICAgdmFyIGFsbENvbnRlbnRzID0gdGFic1BhcmVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdqcy10YWItY29udGVudHMnKTtcbiAgICAgIGlmICghaXNDdXJyZW50KSB7XG4gICAgICAgIC8vIHJlbW92ZSAuY3VycmVudFxuICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IHRhYnNDaGlsZC5sZW5ndGg7IGorKykge1xuICAgICAgICAgIHRhYnNDaGlsZFtqXS5jbGFzc0xpc3QucmVtb3ZlKGN1cnJlbnRDbGFzc05hbWUpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuY2xhc3NMaXN0LmFkZChjdXJyZW50Q2xhc3NOYW1lKTtcbiAgICAgIH1cbiAgICAgIC8vIHJlbW92ZSAuY3VycmVudC12aWV3XG4gICAgICBmb3IgKHZhciBrID0gMDsgayA8IGFsbENvbnRlbnRzLmxlbmd0aDsgaysrKSB7XG4gICAgICAgIGFsbENvbnRlbnRzW2tdLmNsYXNzTGlzdC5yZW1vdmUoY3VycmVudFZpZXdDbGFzc05hbWUpO1xuICAgICAgfVxuICAgICAgLy9cbiAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHZpZXcpLmNsYXNzTGlzdC5hZGQoY3VycmVudFZpZXdDbGFzc05hbWUpO1xuICAgIH0pO1xuICB9XG59KSgpO1xuXG4vKipcbiAqKiogIOODmuODvOOCuOWGheODquODs+OCryAgKi9cbihmdW5jdGlvbiAoKSB7XG4gIHZhciBlbG0gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuanMtcGFnZS1hbmNob3InKTtcbiAgLy8g44Gq44GE5aC05ZCI44Gv44Gq44Gr44KC44GX44Gq44GEXG4gIGlmICghZWxtLmxlbmd0aCkge1xuICAgIHJldHVybjtcbiAgfVxuICAvLyDjgqTjg5njg7Pjg4hcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBlbG0ubGVuZ3RoOyBpKyspIHtcbiAgICBlbG1baV0uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmdW5jdGlvbiAoZSkge1xuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgdmFyIGhyZWYgPSB0aGlzLmdldEF0dHJpYnV0ZSgnaHJlZicpO1xuICAgICAgLy8g44Oa44O844K45YaF44Oq44Oz44Kv44Gn44Gq44GE5aC05ZCI44Gv5L2V44KC44GX44Gq44GEXG4gICAgICBpZiAoaHJlZi5zbGljZSgwLCAxKSAhPSAnIycpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgLy8g44Oq44Oz44Kv5YWI44Gu6KaB57Sg44KS5Y+W5b6XXG4gICAgICB2Y
1XIgcGFnZUlEID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaHJlZi5zbGljZSgxKSk7XG4gICAgICAvLyDjgarjgYTloLTlkIjjga/jgarjgavjgoLjgZfjgarjgYRcbiAgICAgIGlmICghcGFnZUlEKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHZhciByZWN0ID0gcGFnZUlELmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgdmFyIHNjcm9sbFRvcCA9IHdpbmRvdy5wYWdlWU9mZnNldCB8fCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsVG9wO1xuICAgICAgdmFyIHBvc2l0aW9uID0gcmVjdC50b3AgKyBzY3JvbGxUb3A7XG4gICAgICAvLyDjgrnjgq/jg63jg7zjg6vlh6bnkIZcbiAgICAgIHdpbmRvdy5zY3JvbGxUbyh7XG4gICAgICAgIHRvcDogcG9zaXRpb24gLSAxMjAsXG4gICAgICAgIGxlZnQ6IDAsXG4gICAgICAgIGJlaGF2aW9yOiAnc21vb3RoJ1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cbn0pKCk7XG5cbi8qKlxuICoqKiAg5oyH5a6a44GX44Gf44OX44Ot44OR44OG44Kj44KS6KaB57Sg44GL44KJ5Y+W5b6X44GZ44KLICAqL1xudmFyIGdldFN0eWxlID0gZnVuY3Rpb24gZ2V0U3R5bGUoZWwsIHN0eWxlUHJvcCkge1xuICB2YXIgZGVmYXVsdFZpZXcgPSAoZWwub3duZXJEb2N1bWVudCB8fCBkb2N1bWVudCkuZGVmYXVsdFZpZXc7XG4gIHN0eWxlUHJvcCA9IHN0eWxlUHJvcC5yZXBsYWNlKC8oW0EtWl0pL2csICctJDEnKS50b0xvd2VyQ2FzZSgpO1xuICByZXR1cm4gZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZShlbCwgbnVsbCkuZ2V0UHJvcGVydHlWYWx1ZShzdHlsZVByb3ApO1xufTtcblxuLyoqXG4gKioqICBHcm9iYWwgTWVudSBFdmVudCAgKi9cbihmdW5jdGlvbiAoKSB7XG4gIC8vIOOCsOODreODvOODkOODq+ODiuODk+OCsuODvOOCt+ODp+ODs+OBruimgee0oFxuICB2YXIgZ2xvYmFsTmF2ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2dsb2JhbE5hdicpO1xuXG4gIC8vIOOBmeOBueOBpuOBruODiOODquOCrOODvOOCkuWPluW+l+OBmeOCi1xuICB2YXIgYWxsVHJpZ2dlciA9IGdsb2JhbE5hdi5xdWVyeVNlbGVjdG9yQWxsKCcuanMtdHJpZ2dlcicpO1xuXG4gIC8vIOW5heOBjCBsZyDku6XkuIrjga7jg5Pjg6Xjg7zjg53jg7zjg4jjgpLjgr/jg7zjgrLjg4Pjg4jjgajjgZnjgovjg6Hjg4fjgqPjgqLjgq/jgqjjg6rjgpLkvZzmiJBcbiAgdmFyIG1lZGlhUXVlcnkgPSB3aW5kb3cubWF0Y2hNZWRpYSgnKG1pbi13aWR0aDogOTkycHgpJyk7XG5cbiAgLy8g44Ki44Kv44OG44Kj44OW44Kv44Op44K544GM5LuY44GE44Gm44GE44KL44GL44OB44Kn44OD44Kv44GZ44KLXG4gIHZhciBhY3RpdmVDbGFzc05hbWUgPSAnYWN0aXZlJztcblxuICAvLyDjg5vjg5Djg7zmmYLjgavku5jkuI7jgZnjgovjgq/jg6njgrnlkI1cbiAgdmFyIGhvdmVyQ2xhc3NOYW1lID0gJ2hvdmVyJztcblxuICAvLyBXaW5kb3cgd2lkdGhcbiAgdmFyIG1lbW9yeVdpbmRvd1dpZHRoID0gd2luZG93LmlubmVyV2lkdGg7XG5cbiAgLy8g44Kk44OZ44Oz44OIXG4gIGFsbFRyaWdnZXIuZm9yRWFjaChmdW5jdGlvbiAoZWxtKSB7XG4gICAgLy8g44Kv44Oq44OD44Kv44Kk44OZ44Oz44OIXG4gICAgZWxtLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24gKHQpIHtcbiAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAvLyBQQ+OBp+OBruWHpueQhlxuICAgICAgaWYgKG1lZGlhUXVlcnkubWF0Y2hlcykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyDjg6Ljg5DjgqTjg6vjgafjga7lh6bnkIZcbiAgICAgICAgdC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAvLyDjgqLjgq/jg4bjgqPjg5bliKTlrppcbiAgICAgICAgdmFyIGlzQWN0aXZlID0gdGhpcy5wYXJlbnROb2RlLmNsYXNzTGlzdC5jb250YWlucyhhY3RpdmVDbGFzc05hbWUpO1xuXG4gICAgICAgIC8vIOS4gOW6puOAgeOBmeOBueOBpuOBruODoeODi+ODpeODvOOCkumWieOBmOOCi1xuICAgICAgICBhbGxUcmlnZ2VyLmZvckVhY2goZnVuY3Rpb24gKGNoaWxkKSB7XG4gICAgICAgICAgLy8g6auY44GV44KS5Y+W5b6X44GZ44KL6KaB57Sg77yI44Kv44Oq44OD44Kv44GX44Gf6KaB57Sg44Gu5a2Q44Oh44OL44Ol44O877yJXG4gICAgICAgICAgdmFyIHBhbmVsID0gY2hpbGQubmV4dEVsZW1lbnRTaWJsaW5nO1xuICAgICAgICAgIC8vY29uc3QgbWF4SGVpZ2h0VmFsdWUgPSBnZXRTdHlsZShwYW5lbCwgJ21heEhlaWdodCcpO1xuICAgICAgICAgIGlmIChjaGlsZCAhPT0gX3RoaXMpIHtcbiAgICAgICAgICAgIGNoaWxkLnBhcmVudE5vZGUuY2xhc3NMaXN0LnJlbW92ZShhY3RpdmVDbGFzc05hbWUpO1xuICAgICAgICAgICAgcGFuZWwuc3R5bGUubWF4SGVpZ2h0ID0gbnVsbDtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICAvLyDjgqLjgq/jg4bjgqPjg5bjgq/jg6njgrnjga7lh6bnkIZcbiAgICAgICAgaXNBY3RpdmUgPyB0aGlzLnBhcmVudE5vZGUuY2xhc3NMaXN0LnJlbW92ZShhY3RpdmVDbGFzc05hbWUpIDogdGhpcy5wYXJlbnROb2RlLmNsYXNzTGlzdC5hZGQoYWN0aXZlQ2xhc3NOYW1lKTtcbiAgICAgICAgLy8g5a2Q44Oh44OL44Ol44O844Gu6ZaL6ZaJ5Yem55CGXG4gICAgICAgIC8vIFRvZ2dsZSB0aGUgcGFuZWwgZWxlbWVudFxuICAgICAgICB2Y
1XIgcGFuZWwgPSB0aGlzLm5leHRFbGVtZW50U2libGluZztcbiAgICAgICAgdmFyIG1heEhlaWdodFZhbHVlID0gZ2V0U3R5bGUocGFuZWwsICdtYXhIZWlnaHQnKTtcbiAgICAgICAgaWYgKG1heEhlaWdodFZhbHVlICE9PSAnMHB4Jykge1xuICAgICAgICAgIHBhbmVsLnN0eWxlLm1heEhlaWdodCA9IG51bGw7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHBhbmVsLnN0eWxlLm1heEhlaWdodCA9IHBhbmVsLnNjcm9sbEhlaWdodCArICdweCc7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyBQQ+aZguOBruODm+ODkOODvOWHpueQhlxuICAgIC8vIGVsbS5wYXJlbnROb2RlLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlZW50ZXInLCAoKSA9PiB7XG4gICAgLy8gICBpZiAobWVkaWFRdWVyeS5tYXRjaGVzKSB7XG4gICAgLy8gICAgIGVsbS5wYXJlbnROb2RlLmNsYXNzTGlzdC5hZGQoaG92ZXJDbGFzc05hbWUpO1xuICAgIC8vICAgICBlbG0ubmV4dEVsZW1lbnRTaWJsaW5nLnN0eWxlLm1heEhlaWdodCA9IGVsbS5uZXh0RWxlbWVudFNpYmxpbmcuc2Nyb2xsSGVpZ2h0ICsgJ3B4JztcbiAgICAvLyAgIH1cbiAgICAvLyB9KTtcbiAgICAvLyBlbG0ucGFyZW50Tm9kZS5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWxlYXZlJywgKCkgPT4ge1xuICAgIC8vICAgaWYgKG1lZGlhUXVlcnkubWF0Y2hlcykge1xuICAgIC8vICAgICBlbG0ucGFyZW50Tm9kZS5jbGFzc0xpc3QucmVtb3ZlKGhvdmVyQ2xhc3NOYW1lKTtcbiAgICAvLyAgICAgZWxtLm5leHRFbGVtZW50U2libGluZy5zdHlsZS5tYXhIZWlnaHQgPSBudWxsO1xuICAgIC8vICAgfVxuICAgIC8vIH0pO1xuICB9KTtcbiAgLy8gd2luZG93IOODquOCteOCpOOCuuOBp+ODoeODi+ODpeODvOOCkuOCr+ODquOCouOBq+OBmeOCi+WHpueQhlxuICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigncmVzaXplJywgZnVuY3Rpb24gKCkge1xuICAgIGlmIChtZW1vcnlXaW5kb3dXaWR0aCAhPT0gd2luZG93LmlubmVyV2lkdGgpIHtcbiAgICAgIC8vIHdpbmRvdyDjga4gd2lkdGgg44KS5Y+W5b6X44GX55u044GZXG4gICAgICBtZW1vcnlXaW5kb3dXaWR0aCA9IHdpbmRvdy5pbm5lcldpZHRoO1xuICAgICAgYWxsVHJpZ2dlci5mb3JFYWNoKGZ1bmN0aW9uIChlbCkge1xuICAgICAgICAvLyDlrZDjg6Hjg4vjg6Xjg7zjgpLplonjgZjjgotcbiAgICAgICAgZWwucGFyZW50Tm9kZS5jbGFzc0xpc3QucmVtb3ZlKGFjdGl2ZUNsYXNzTmFtZSk7XG4gICAgICAgIHZhciBwYW5lbCA9IGVsLm5leHRFbGVtZW50U2libGluZztcbiAgICAgICAgcGFuZWwuc3R5bGUubWF4SGVpZ2h0ID0gbnVsbDtcbiAgICAgIH0pO1xuICAgICAgLy8g44OQ44O844Ks44O844KS6ZaJ44GY44KLXG4gICAgICB0aGlzLmRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LnJlbW92ZSgndmlzaWJsZS1tb2JpbGUtbWVudScpO1xuICAgIH1cbiAgfSk7XG59KSgpO1xuXG4vKipcbiAqKiogIE1ha2VyIEFuaW1hdGlvbiAgKi9cbihmdW5jdGlvbiAoKSB7XG4gIHZhciBtYXJrZXJzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLm1hcmtlci1hbmltYXRpb24nKTtcbiAgdmFyIHJvb3QgPSBudWxsO1xuICB2YXIgb2JzZXJ2ZXJBY3Rpb24gPSBmdW5jdGlvbiBvYnNlcnZlckFjdGlvbihlbnRyaWVzKSB7XG4gICAgZW50cmllcy5mb3JFYWNoKGZ1bmN0aW9uIChlbnRyeSkge1xuICAgICAgaWYgKGVudHJ5LmlzSW50ZXJzZWN0aW5nKSB7XG4gICAgICAgIGVudHJ5LnRhcmdldC5jbGFzc0xpc3QuYWRkKCdpcy12aXNpYmxlJyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBlbnRyeS50YXJnZXQuY2xhc3NMaXN0LnJlbW92ZSgnaXMtdmlzaWJsZScpO1xuICAgICAgfVxuICAgIH0pO1xuICB9O1xuICB2YXIgb3B0aW9uc01hcmtlcnMgPSB7XG4gICAgcm9vdDogcm9vdCxcbiAgICByb290TWFyZ2luOiAnMHB4IDBweCAtMzAlJyAvLyDjg5Pjg6Xjg7zjg53jg7zjg4jjga7kuK3lv4PjgpLliKTlrprln7rmupbjgavjgZnjgotcbiAgfTtcblxuICB2YXIgc3RhcnRPYnNlcnZlID0gZnVuY3Rpb24gc3RhcnRPYnNlcnZlKHRhcmdldHMsIG9wdGlvbnMpIHtcbiAgICB2YXIgb2JzZXJ2ZXIgPSBuZXcgSW50ZXJzZWN0aW9uT2JzZXJ2ZXIob2JzZXJ2ZXJBY3Rpb24sIG9wdGlvbnMpO1xuICAgIHRhcmdldHMuZm9yRWFjaChmdW5jdGlvbiAodGFyZ2V0KSB7XG4gICAgICBvYnNlcnZlci5vYnNlcnZlKHRhcmdldCk7XG4gICAgfSk7XG4gIH07XG4gIHN0YXJ0T2JzZXJ2ZShtYXJrZXJzLCBvcHRpb25zTWFya2Vycyk7XG5cbiAgLyoqXG4gICAqKiogIE1vZGFsICAqL1xuICB2YXIgb3BlbkJ1dHRvbnMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuanMtbW9kYWwtb3BlbicpO1xuICBvcGVuQnV0dG9ucy5mb3JFYWNoKGZ1bmN0aW9uIChidG4pIHtcbiAgICBidG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmdW5jdGlvbiAoKSB7XG4gICAgICB2Y
1XIgbW9kYWxBdHRyaWJ1dGUgPSBidG4uZ2V0QXR0cmlidXRlKCdkYXRhLW1vZGFsJyk7XG4gICAgICB2YXIgbW9kYWxTaG93ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQobW9kYWxBdHRyaWJ1dGUpO1xuICAgICAgbW9kYWxTaG93LmNsYXNzTGlzdC5hZGQoJ2FjdGl2ZScpO1xuICAgIH0pO1xuICB9KTtcbiAgdmFyIGNsb3NlQnV0dG9ucyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5qcy1tb2RhbC1jbG9zZScpO1xuICBjbG9zZUJ1dHRvbnMuZm9yRWFjaChmdW5jdGlvbiAoYnRuKSB7XG4gICAgYnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIG1vZGFsID0gYnRuLmNsb3Nlc3QoJy5tb2RhbC1vdXRlcicpO1xuICAgICAgbW9kYWwuY2xhc3NMaXN0LnJlbW92ZSgnYWN0aXZlJyk7XG4gICAgfSk7XG4gIH0pO1xuICB2YXIgbW9kYWxPdXRlciA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5tb2RhbC1vdXRlcicpO1xuICBtb2RhbE91dGVyLmZvckVhY2goZnVuY3Rpb24gKG91dGVyKSB7XG4gICAgb3V0ZXIuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgIGlmIChldmVudC50YXJnZXQuY2xvc2VzdCgnLm1vZGFsLWlubmVyJykgPT09IG51bGwpIHtcbiAgICAgICAgZXZlbnQudGFyZ2V0LmNsYXNzTGlzdC5yZW1vdmUoJ2FjdGl2ZScpO1xuICAgICAgfVxuICAgIH0pO1xuICB9KTtcbn0pKCk7Il0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///701\n")}},__webpack_module_cache__={};function __webpack_require__(g){var l=__webpack_module_cache__[g];if(void 0!==l)return l.exports;var I=__webpack_module_cache__[g]={exports:{}};return __webpack_modules__[g](I,I.exports,__webpack_require__),I.exports}__webpack_require__.n=g=>{var l=g&&g.__esModule?()=>g.default:()=>g;return __webpack_require__.d(l,{a:l}),l},__webpack_require__.d=(g,l)=>{for(var I in l)__webpack_require__.o(l,I)&&!__webpack_require__.o(g,I)&&Object.defineProperty(g,I,{enumerable:!0,get:l[I]})},__webpack_require__.o=(g,l)=>Object.prototype.hasOwnProperty.call(g,l);var __webpack_exports__=__webpack_require__(701)})();
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.