"use strict"; (self["webpackChunk_core_volunteer_app"] = self["webpackChunk_core_volunteer_app"] || []).push([["vendors-node_modules_antd_lib__util_ActionButton_js-node_modules_antd_lib__util_ContextIsolat-4f337b"],{ /***/ "../../../node_modules/antd/lib/_util/ActionButton.js": /*!************************************************************!*\ !*** ../../../node_modules/antd/lib/_util/ActionButton.js ***! \************************************************************/ /***/ ((__unused_webpack_module, exports, __webpack_require__) => { "use client"; var _interopRequireDefault = (__webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ "../../../node_modules/@babel/runtime/helpers/interopRequireDefault.js")["default"]); var _interopRequireWildcard = (__webpack_require__(/*! @babel/runtime/helpers/interopRequireWildcard */ "../../../node_modules/@babel/runtime/helpers/interopRequireWildcard.js")["default"]); Object.defineProperty(exports, "__esModule", ({ value: true })); exports["default"] = void 0; var React = _interopRequireWildcard(__webpack_require__(/*! react */ "../../../node_modules/react/index.js")); var _useState = _interopRequireDefault(__webpack_require__(/*! rc-util/lib/hooks/useState */ "../../../node_modules/rc-util/lib/hooks/useState.js")); var _button = _interopRequireDefault(__webpack_require__(/*! ../button */ "../../../node_modules/antd/lib/button/index.js")); var _buttonHelpers = __webpack_require__(/*! ../button/buttonHelpers */ "../../../node_modules/antd/lib/button/buttonHelpers.js"); function isThenable(thing) { return !!(thing === null || thing === void 0 ? void 0 : thing.then); } const ActionButton = props => { const { type, children, prefixCls, buttonProps, close, autoFocus, emitEvent, isSilent, quitOnNullishReturnValue, actionFn } = props; const clickedRef = React.useRef(false); const buttonRef = React.useRef(null); const [loading, setLoading] = (0, _useState.default)(false); const onInternalClose = function () { close === null || close === void 0 ? void 0 : close.apply(void 0, arguments); }; React.useEffect(() => { let timeoutId = null; if (autoFocus) { timeoutId = setTimeout(() => { var _a; (_a = buttonRef.current) === null || _a === void 0 ? void 0 : _a.focus({ preventScroll: true }); }); } return () => { if (timeoutId) { clearTimeout(timeoutId); } }; }, []); const handlePromiseOnOk = returnValueOfOnOk => { if (!isThenable(returnValueOfOnOk)) { return; } setLoading(true); returnValueOfOnOk.then(function () { setLoading(false, true); onInternalClose.apply(void 0, arguments); clickedRef.current = false; }, e => { // See: https://github.com/ant-design/ant-design/issues/6183 setLoading(false, true); clickedRef.current = false; // Do not throw if is `await` mode if (isSilent === null || isSilent === void 0 ? void 0 : isSilent()) { return; } return Promise.reject(e); }); }; const onClick = e => { if (clickedRef.current) { return; } clickedRef.current = true; if (!actionFn) { onInternalClose(); return; } let returnValueOfOnOk; if (emitEvent) { returnValueOfOnOk = actionFn(e); if (quitOnNullishReturnValue && !isThenable(returnValueOfOnOk)) { clickedRef.current = false; onInternalClose(e); return; } } else if (actionFn.length) { returnValueOfOnOk = actionFn(close); // https://github.com/ant-design/ant-design/issues/23358 clickedRef.current = false; } else { returnValueOfOnOk = actionFn(); if (!isThenable(returnValueOfOnOk)) { onInternalClose(); return; } } handlePromiseOnOk(returnValueOfOnOk); }; return /*#__PURE__*/React.createElement(_button.default, Object.assign({}, (0, _buttonHelpers.convertLegacyProps)(type), { onClick: onClick, loading: loading, prefixCls: prefixCls }, buttonProps, { ref: buttonRef }), children); }; var _default = exports["default"] = ActionButton; /***/ }), /***/ "../../../node_modules/antd/lib/_util/ContextIsolator.js": /*!***************************************************************!*\ !*** ../../../node_modules/antd/lib/_util/ContextIsolator.js ***! \***************************************************************/ /***/ ((__unused_webpack_module, exports, __webpack_require__) => { "use client"; var _interopRequireDefault = (__webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ "../../../node_modules/@babel/runtime/helpers/interopRequireDefault.js")["default"]); Object.defineProperty(exports, "__esModule", ({ value: true })); exports["default"] = void 0; var _react = _interopRequireDefault(__webpack_require__(/*! react */ "../../../node_modules/react/index.js")); var _context = __webpack_require__(/*! ../form/context */ "../../../node_modules/antd/lib/form/context.js"); var _Compact = __webpack_require__(/*! ../space/Compact */ "../../../node_modules/antd/lib/space/Compact.js"); const ContextIsolator = props => { const { space, form, children } = props; if (children === undefined || children === null) { return null; } let result = children; if (form) { result = /*#__PURE__*/_react.default.createElement(_context.NoFormStyle, { override: true, status: true }, result); } if (space) { result = /*#__PURE__*/_react.default.createElement(_Compact.NoCompactStyle, null, result); } return result; }; var _default = exports["default"] = ContextIsolator; /***/ }), /***/ "../../../node_modules/antd/lib/_util/PurePanel.js": /*!*********************************************************!*\ !*** ../../../node_modules/antd/lib/_util/PurePanel.js ***! \*********************************************************/ /***/ ((__unused_webpack_module, exports, __webpack_require__) => { "use client"; var _interopRequireDefault = (__webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ "../../../node_modules/@babel/runtime/helpers/interopRequireDefault.js")["default"]); var _interopRequireWildcard = (__webpack_require__(/*! @babel/runtime/helpers/interopRequireWildcard */ "../../../node_modules/@babel/runtime/helpers/interopRequireWildcard.js")["default"]); Object.defineProperty(exports, "__esModule", ({ value: true })); exports["default"] = void 0; exports.withPureRenderTheme = withPureRenderTheme; var React = _interopRequireWildcard(__webpack_require__(/*! react */ "../../../node_modules/react/index.js")); var _useMergedState = _interopRequireDefault(__webpack_require__(/*! rc-util/lib/hooks/useMergedState */ "../../../node_modules/rc-util/lib/hooks/useMergedState.js")); var _configProvider = _interopRequireWildcard(__webpack_require__(/*! ../config-provider */ "../../../node_modules/antd/lib/config-provider/index.js")); function withPureRenderTheme(Component) { return props => (/*#__PURE__*/React.createElement(_configProvider.default, { theme: { token: { motion: false, zIndexPopupBase: 0 } } }, /*#__PURE__*/React.createElement(Component, Object.assign({}, props)))); } /* istanbul ignore next */ const genPurePanel = (Component, alignPropName, postProps, defaultPrefixCls, getDropdownCls) => { const PurePanel = props => { const { prefixCls: customizePrefixCls, style } = props; const holderRef = React.useRef(null); const [popupHeight, setPopupHeight] = React.useState(0); const [popupWidth, setPopupWidth] = React.useState(0); const [open, setOpen] = (0, _useMergedState.default)(false, { value: props.open }); const { getPrefixCls } = React.useContext(_configProvider.ConfigContext); const prefixCls = getPrefixCls(defaultPrefixCls || 'select', customizePrefixCls); React.useEffect(() => { // We do not care about ssr setOpen(true); if (typeof ResizeObserver !== 'undefined') { const resizeObserver = new ResizeObserver(entries => { const element = entries[0].target; setPopupHeight(element.offsetHeight + 8); setPopupWidth(element.offsetWidth); }); const interval = setInterval(() => { var _a; const dropdownCls = getDropdownCls ? `.${getDropdownCls(prefixCls)}` : `.${prefixCls}-dropdown`; const popup = (_a = holderRef.current) === null || _a === void 0 ? void 0 : _a.querySelector(dropdownCls); if (popup) { clearInterval(interval); resizeObserver.observe(popup); } }, 10); return () => { clearInterval(interval); resizeObserver.disconnect(); }; } }, []); let mergedProps = Object.assign(Object.assign({}, props), { style: Object.assign(Object.assign({}, style), { margin: 0 }), open, visible: open, getPopupContainer: () => holderRef.current }); if (postProps) { mergedProps = postProps(mergedProps); } if (alignPropName) { Object.assign(mergedProps, { [alignPropName]: { overflow: { adjustX: false, adjustY: false } } }); } const mergedStyle = { paddingBottom: popupHeight, position: 'relative', minWidth: popupWidth }; return /*#__PURE__*/React.createElement("div", { ref: holderRef, style: mergedStyle }, /*#__PURE__*/React.createElement(Component, Object.assign({}, mergedProps))); }; return withPureRenderTheme(PurePanel); }; var _default = exports["default"] = genPurePanel; /***/ }), /***/ "../../../node_modules/antd/lib/_util/capitalize.js": /*!**********************************************************!*\ !*** ../../../node_modules/antd/lib/_util/capitalize.js ***! \**********************************************************/ /***/ ((__unused_webpack_module, exports) => { Object.defineProperty(exports, "__esModule", ({ value: true })); exports["default"] = capitalize; function capitalize(str) { if (typeof str !== 'string') { return str; } const ret = str.charAt(0).toUpperCase() + str.slice(1); return ret; } /***/ }), /***/ "../../../node_modules/antd/lib/_util/colors.js": /*!******************************************************!*\ !*** ../../../node_modules/antd/lib/_util/colors.js ***! \******************************************************/ /***/ ((__unused_webpack_module, exports, __webpack_require__) => { var _interopRequireDefault = (__webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ "../../../node_modules/@babel/runtime/helpers/interopRequireDefault.js")["default"]); Object.defineProperty(exports, "__esModule", ({ value: true })); exports.PresetStatusColorTypes = void 0; exports.isPresetColor = isPresetColor; exports.isPresetStatusColor = isPresetStatusColor; var _toConsumableArray2 = _interopRequireDefault(__webpack_require__(/*! @babel/runtime/helpers/toConsumableArray */ "../../../node_modules/@babel/runtime/helpers/toConsumableArray.js")); var _interface = __webpack_require__(/*! ../theme/interface */ "../../../node_modules/antd/lib/theme/interface/index.js"); const inverseColors = _interface.PresetColors.map(color => `${color}-inverse`); const PresetStatusColorTypes = exports.PresetStatusColorTypes = ['success', 'processing', 'error', 'default', 'warning']; /** * determine if the color keyword belongs to the `Ant Design` {@link PresetColors}. * @param color color to be judged * @param includeInverse whether to include reversed colors */ function isPresetColor(color) { let includeInverse = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true; if (includeInverse) { return [].concat((0, _toConsumableArray2.default)(inverseColors), (0, _toConsumableArray2.default)(_interface.PresetColors)).includes(color); } return _interface.PresetColors.includes(color); } function isPresetStatusColor(color) { return PresetStatusColorTypes.includes(color); } /***/ }), /***/ "../../../node_modules/antd/lib/_util/easings.js": /*!*******************************************************!*\ !*** ../../../node_modules/antd/lib/_util/easings.js ***! \*******************************************************/ /***/ ((__unused_webpack_module, exports) => { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.easeInOutCubic = easeInOutCubic; function easeInOutCubic(t, b, c, d) { const cc = c - b; // biome-ignore lint: it is a common easing function t /= d / 2; if (t < 1) { return cc / 2 * t * t * t + b; } // biome-ignore lint: it is a common easing function return cc / 2 * ((t -= 2) * t * t + 2) + b; } /***/ }), /***/ "../../../node_modules/antd/lib/_util/extendsObject.js": /*!*************************************************************!*\ !*** ../../../node_modules/antd/lib/_util/extendsObject.js ***! \*************************************************************/ /***/ ((__unused_webpack_module, exports) => { Object.defineProperty(exports, "__esModule", ({ value: true })); exports["default"] = void 0; const extendsObject = function () { const result = Object.assign({}, arguments.length <= 0 ? undefined : arguments[0]); for (let i = 1; i < arguments.length; i++) { const obj = i < 0 || arguments.length <= i ? undefined : arguments[i]; if (obj) { Object.keys(obj).forEach(key => { const val = obj[key]; if (val !== undefined) { result[key] = val; } }); } } return result; }; var _default = exports["default"] = extendsObject; /***/ }), /***/ "../../../node_modules/antd/lib/_util/gapSize.js": /*!*******************************************************!*\ !*** ../../../node_modules/antd/lib/_util/gapSize.js ***! \*******************************************************/ /***/ ((__unused_webpack_module, exports) => { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.isPresetSize = isPresetSize; exports.isValidGapNumber = isValidGapNumber; function isPresetSize(size) { return ['small', 'middle', 'large'].includes(size); } function isValidGapNumber(size) { if (!size) { // The case of size = 0 is deliberately excluded here, because the default value of the gap attribute in CSS is 0, so if the user passes 0 in, we can directly ignore it. return false; } return typeof size === 'number' && !Number.isNaN(size); } /***/ }), /***/ "../../../node_modules/antd/lib/_util/getAllowClear.js": /*!*************************************************************!*\ !*** ../../../node_modules/antd/lib/_util/getAllowClear.js ***! \*************************************************************/ /***/ ((__unused_webpack_module, exports, __webpack_require__) => { "use client"; var _interopRequireDefault = (__webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ "../../../node_modules/@babel/runtime/helpers/interopRequireDefault.js")["default"]); Object.defineProperty(exports, "__esModule", ({ value: true })); exports["default"] = void 0; var _react = _interopRequireDefault(__webpack_require__(/*! react */ "../../../node_modules/react/index.js")); var _CloseCircleFilled = _interopRequireDefault(__webpack_require__(/*! @ant-design/icons/CloseCircleFilled */ "../../../node_modules/@ant-design/icons/CloseCircleFilled.js")); const getAllowClear = allowClear => { let mergedAllowClear; if (typeof allowClear === 'object' && (allowClear === null || allowClear === void 0 ? void 0 : allowClear.clearIcon)) { mergedAllowClear = allowClear; } else if (allowClear) { mergedAllowClear = { clearIcon: /*#__PURE__*/_react.default.createElement(_CloseCircleFilled.default, null) }; } return mergedAllowClear; }; var _default = exports["default"] = getAllowClear; /***/ }), /***/ "../../../node_modules/antd/lib/_util/getRenderPropValue.js": /*!******************************************************************!*\ !*** ../../../node_modules/antd/lib/_util/getRenderPropValue.js ***! \******************************************************************/ /***/ ((__unused_webpack_module, exports) => { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.getRenderPropValue = void 0; const getRenderPropValue = propValue => { if (!propValue) { return null; } return typeof propValue === 'function' ? propValue() : propValue; }; exports.getRenderPropValue = getRenderPropValue; /***/ }), /***/ "../../../node_modules/antd/lib/_util/getScroll.js": /*!*********************************************************!*\ !*** ../../../node_modules/antd/lib/_util/getScroll.js ***! \*********************************************************/ /***/ ((__unused_webpack_module, exports) => { Object.defineProperty(exports, "__esModule", ({ value: true })); exports["default"] = void 0; exports.isWindow = isWindow; function isWindow(obj) { return obj !== null && obj !== undefined && obj === obj.window; } const getScroll = target => { var _a, _b; if (typeof window === 'undefined') { return 0; } let result = 0; if (isWindow(target)) { result = target.pageYOffset; } else if (target instanceof Document) { result = target.documentElement.scrollTop; } else if (target instanceof HTMLElement) { result = target.scrollTop; } else if (target) { // According to the type inference, the `target` is `never` type. // Since we configured the loose mode type checking, and supports mocking the target with such shape below:: // `{ documentElement: { scrollLeft: 200, scrollTop: 400 } }`, // the program may falls into this branch. // Check the corresponding tests for details. Don't sure what is the real scenario this happens. /* biome-ignore lint/complexity/useLiteralKeys: target is a never type */ /* eslint-disable-next-line dot-notation */ result = target['scrollTop']; } if (target && !isWindow(target) && typeof result !== 'number') { result = (_b = ((_a = target.ownerDocument) !== null && _a !== void 0 ? _a : target).documentElement) === null || _b === void 0 ? void 0 : _b.scrollTop; } return result; }; var _default = exports["default"] = getScroll; /***/ }), /***/ "../../../node_modules/antd/lib/_util/hooks/useClosable.js": /*!*****************************************************************!*\ !*** ../../../node_modules/antd/lib/_util/hooks/useClosable.js ***! \*****************************************************************/ /***/ ((__unused_webpack_module, exports, __webpack_require__) => { "use client"; var _interopRequireDefault = (__webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ "../../../node_modules/@babel/runtime/helpers/interopRequireDefault.js")["default"]); Object.defineProperty(exports, "__esModule", ({ value: true })); exports["default"] = useClosable; exports.pickClosable = pickClosable; var _react = _interopRequireDefault(__webpack_require__(/*! react */ "../../../node_modules/react/index.js")); var _CloseOutlined = _interopRequireDefault(__webpack_require__(/*! @ant-design/icons/CloseOutlined */ "../../../node_modules/@ant-design/icons/CloseOutlined.js")); var _pickAttrs = _interopRequireDefault(__webpack_require__(/*! rc-util/lib/pickAttrs */ "../../../node_modules/rc-util/lib/pickAttrs.js")); function pickClosable(context) { if (!context) { return undefined; } return { closable: context.closable, closeIcon: context.closeIcon }; } /** Convert `closable` and `closeIcon` to config object */ function useClosableConfig(closableCollection) { const { closable, closeIcon } = closableCollection || {}; return _react.default.useMemo(() => { if ( // If `closable`, whatever rest be should be true !closable && (closable === false || closeIcon === false || closeIcon === null)) { return false; } if (closable === undefined && closeIcon === undefined) { return null; } let closableConfig = { closeIcon: typeof closeIcon !== 'boolean' && closeIcon !== null ? closeIcon : undefined }; if (closable && typeof closable === 'object') { closableConfig = Object.assign(Object.assign({}, closableConfig), closable); } return closableConfig; }, [closable, closeIcon]); } /** * Assign object without `undefined` field. Will skip if is `false`. * This helps to handle both closableConfig or false */ function assignWithoutUndefined() { const target = {}; for (var _len = arguments.length, objList = new Array(_len), _key = 0; _key < _len; _key++) { objList[_key] = arguments[_key]; } objList.forEach(obj => { if (obj) { Object.keys(obj).forEach(key => { if (obj[key] !== undefined) { target[key] = obj[key]; } }); } }); return target; } /** Use same object to support `useMemo` optimization */ const EmptyFallbackCloseCollection = {}; function useClosable(propCloseCollection, contextCloseCollection) { let fallbackCloseCollection = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : EmptyFallbackCloseCollection; // Align the `props`, `context` `fallback` to config object first const propCloseConfig = useClosableConfig(propCloseCollection); const contextCloseConfig = useClosableConfig(contextCloseCollection); const closeBtnIsDisabled = typeof propCloseConfig !== 'boolean' ? !!(propCloseConfig === null || propCloseConfig === void 0 ? void 0 : propCloseConfig.disabled) : false; const mergedFallbackCloseCollection = _react.default.useMemo(() => Object.assign({ closeIcon: /*#__PURE__*/_react.default.createElement(_CloseOutlined.default, null) }, fallbackCloseCollection), [fallbackCloseCollection]); // Use fallback logic to fill the config const mergedClosableConfig = _react.default.useMemo(() => { // ================ Props First ================ // Skip if prop is disabled if (propCloseConfig === false) { return false; } if (propCloseConfig) { return assignWithoutUndefined(mergedFallbackCloseCollection, contextCloseConfig, propCloseConfig); } // =============== Context Second ============== // Skip if context is disabled if (contextCloseConfig === false) { return false; } if (contextCloseConfig) { return assignWithoutUndefined(mergedFallbackCloseCollection, contextCloseConfig); } // ============= Fallback Default ============== return !mergedFallbackCloseCollection.closable ? false : mergedFallbackCloseCollection; }, [propCloseConfig, contextCloseConfig, mergedFallbackCloseCollection]); // Calculate the final closeIcon return _react.default.useMemo(() => { if (mergedClosableConfig === false) { return [false, null, closeBtnIsDisabled]; } const { closeIconRender } = mergedFallbackCloseCollection; const { closeIcon } = mergedClosableConfig; let mergedCloseIcon = closeIcon; if (mergedCloseIcon !== null && mergedCloseIcon !== undefined) { // Wrap the closeIcon if needed if (closeIconRender) { mergedCloseIcon = closeIconRender(closeIcon); } // Wrap the closeIcon with aria props const ariaProps = (0, _pickAttrs.default)(mergedClosableConfig, true); if (Object.keys(ariaProps).length) { mergedCloseIcon = /*#__PURE__*/_react.default.isValidElement(mergedCloseIcon) ? (/*#__PURE__*/_react.default.cloneElement(mergedCloseIcon, ariaProps)) : (/*#__PURE__*/_react.default.createElement("span", Object.assign({}, ariaProps), mergedCloseIcon)); } } return [true, mergedCloseIcon, closeBtnIsDisabled]; }, [mergedClosableConfig, mergedFallbackCloseCollection]); } /***/ }), /***/ "../../../node_modules/antd/lib/_util/hooks/useForceUpdate.js": /*!********************************************************************!*\ !*** ../../../node_modules/antd/lib/_util/hooks/useForceUpdate.js ***! \********************************************************************/ /***/ ((__unused_webpack_module, exports, __webpack_require__) => { var _interopRequireWildcard = (__webpack_require__(/*! @babel/runtime/helpers/interopRequireWildcard */ "../../../node_modules/@babel/runtime/helpers/interopRequireWildcard.js")["default"]); Object.defineProperty(exports, "__esModule", ({ value: true })); exports["default"] = useForceUpdate; var React = _interopRequireWildcard(__webpack_require__(/*! react */ "../../../node_modules/react/index.js")); function useForceUpdate() { const [, forceUpdate] = React.useReducer(x => x + 1, 0); return forceUpdate; } /***/ }), /***/ "../../../node_modules/antd/lib/_util/hooks/useMultipleSelect.js": /*!***********************************************************************!*\ !*** ../../../node_modules/antd/lib/_util/hooks/useMultipleSelect.js ***! \***********************************************************************/ /***/ ((__unused_webpack_module, exports, __webpack_require__) => { Object.defineProperty(exports, "__esModule", ({ value: true })); exports["default"] = useMultipleSelect; var _react = __webpack_require__(/*! react */ "../../../node_modules/react/index.js"); /** * @title multipleSelect hooks * @description multipleSelect by hold down shift key */ function useMultipleSelect(getKey) { const [prevSelectedIndex, setPrevSelectedIndex] = (0, _react.useState)(null); const multipleSelect = (0, _react.useCallback)((currentSelectedIndex, data, selectedKeys) => { const configPrevSelectedIndex = prevSelectedIndex !== null && prevSelectedIndex !== void 0 ? prevSelectedIndex : currentSelectedIndex; // add/delete the selected range const startIndex = Math.min(configPrevSelectedIndex || 0, currentSelectedIndex); const endIndex = Math.max(configPrevSelectedIndex || 0, currentSelectedIndex); const rangeKeys = data.slice(startIndex, endIndex + 1).map(item => getKey(item)); const shouldSelected = rangeKeys.some(rangeKey => !selectedKeys.has(rangeKey)); const changedKeys = []; rangeKeys.forEach(item => { if (shouldSelected) { if (!selectedKeys.has(item)) { changedKeys.push(item); } selectedKeys.add(item); } else { selectedKeys.delete(item); changedKeys.push(item); } }); setPrevSelectedIndex(shouldSelected ? endIndex : null); return changedKeys; }, [prevSelectedIndex]); const updatePrevSelectedIndex = val => { setPrevSelectedIndex(val); }; return [multipleSelect, updatePrevSelectedIndex]; } /***/ }), /***/ "../../../node_modules/antd/lib/_util/hooks/usePatchElement.js": /*!*********************************************************************!*\ !*** ../../../node_modules/antd/lib/_util/hooks/usePatchElement.js ***! \*********************************************************************/ /***/ ((__unused_webpack_module, exports, __webpack_require__) => { var _interopRequireWildcard = (__webpack_require__(/*! @babel/runtime/helpers/interopRequireWildcard */ "../../../node_modules/@babel/runtime/helpers/interopRequireWildcard.js")["default"]); var _interopRequireDefault = (__webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ "../../../node_modules/@babel/runtime/helpers/interopRequireDefault.js")["default"]); Object.defineProperty(exports, "__esModule", ({ value: true })); exports["default"] = usePatchElement; var _toConsumableArray2 = _interopRequireDefault(__webpack_require__(/*! @babel/runtime/helpers/toConsumableArray */ "../../../node_modules/@babel/runtime/helpers/toConsumableArray.js")); var React = _interopRequireWildcard(__webpack_require__(/*! react */ "../../../node_modules/react/index.js")); function usePatchElement() { const [elements, setElements] = React.useState([]); const patchElement = React.useCallback(element => { // append a new element to elements (and create a new ref) setElements(originElements => [].concat((0, _toConsumableArray2.default)(originElements), [element])); // return a function that removes the new element out of elements (and create a new ref) // it works a little like useEffect return () => { setElements(originElements => originElements.filter(ele => ele !== element)); }; }, []); return [elements, patchElement]; } /***/ }), /***/ "../../../node_modules/antd/lib/_util/hooks/useProxyImperativeHandle.js": /*!******************************************************************************!*\ !*** ../../../node_modules/antd/lib/_util/hooks/useProxyImperativeHandle.js ***! \******************************************************************************/ /***/ ((__unused_webpack_module, exports, __webpack_require__) => { Object.defineProperty(exports, "__esModule", ({ value: true })); exports["default"] = useProxyImperativeHandle; var _react = __webpack_require__(/*! react */ "../../../node_modules/react/index.js"); // Proxy the dom ref with `{ nativeElement, otherFn }` type // ref: https://github.com/ant-design/ant-design/discussions/45242 function fillProxy(element, handler) { element._antProxy = element._antProxy || {}; Object.keys(handler).forEach(key => { if (!(key in element._antProxy)) { const ori = element[key]; element._antProxy[key] = ori; element[key] = handler[key]; } }); return element; } function useProxyImperativeHandle(ref, init) { return (0, _react.useImperativeHandle)(ref, () => { const refObj = init(); const { nativeElement } = refObj; if (typeof Proxy !== 'undefined') { return new Proxy(nativeElement, { get(obj, prop) { if (refObj[prop]) { return refObj[prop]; } return Reflect.get(obj, prop); } }); } // Fallback of IE return fillProxy(nativeElement, refObj); }); } /***/ }), /***/ "../../../node_modules/antd/lib/_util/hooks/useSyncState.js": /*!******************************************************************!*\ !*** ../../../node_modules/antd/lib/_util/hooks/useSyncState.js ***! \******************************************************************/ /***/ ((__unused_webpack_module, exports, __webpack_require__) => { var _interopRequireDefault = (__webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ "../../../node_modules/@babel/runtime/helpers/interopRequireDefault.js")["default"]); var _interopRequireWildcard = (__webpack_require__(/*! @babel/runtime/helpers/interopRequireWildcard */ "../../../node_modules/@babel/runtime/helpers/interopRequireWildcard.js")["default"]); Object.defineProperty(exports, "__esModule", ({ value: true })); exports["default"] = useSyncState; var React = _interopRequireWildcard(__webpack_require__(/*! react */ "../../../node_modules/react/index.js")); var _useForceUpdate = _interopRequireDefault(__webpack_require__(/*! ./useForceUpdate */ "../../../node_modules/antd/lib/_util/hooks/useForceUpdate.js")); function useSyncState(initialValue) { const ref = React.useRef(initialValue); const forceUpdate = (0, _useForceUpdate.default)(); return [() => ref.current, newValue => { ref.current = newValue; // re-render forceUpdate(); }]; } /***/ }), /***/ "../../../node_modules/antd/lib/_util/hooks/useZIndex.js": /*!***************************************************************!*\ !*** ../../../node_modules/antd/lib/_util/hooks/useZIndex.js ***! \***************************************************************/ /***/ ((__unused_webpack_module, exports, __webpack_require__) => { var _interopRequireDefault = (__webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ "../../../node_modules/@babel/runtime/helpers/interopRequireDefault.js")["default"]); Object.defineProperty(exports, "__esModule", ({ value: true })); exports.useZIndex = exports.containerBaseZIndexOffset = exports.consumerBaseZIndexOffset = exports.CONTAINER_MAX_OFFSET = void 0; var _react = _interopRequireDefault(__webpack_require__(/*! react */ "../../../node_modules/react/index.js")); var _useToken = _interopRequireDefault(__webpack_require__(/*! ../../theme/useToken */ "../../../node_modules/antd/lib/theme/useToken.js")); var _warning = __webpack_require__(/*! ../warning */ "../../../node_modules/antd/lib/_util/warning.js"); var _zindexContext = _interopRequireDefault(__webpack_require__(/*! ../zindexContext */ "../../../node_modules/antd/lib/_util/zindexContext.js")); // Z-Index control range // Container: 1000 + offset 100 (max base + 10 * offset = 2000) // Popover: offset 50 // Notification: Container Max zIndex + componentOffset const CONTAINER_OFFSET = 100; const CONTAINER_OFFSET_MAX_COUNT = 10; const CONTAINER_MAX_OFFSET = exports.CONTAINER_MAX_OFFSET = CONTAINER_OFFSET * CONTAINER_OFFSET_MAX_COUNT; /** * Static function will default be the `CONTAINER_MAX_OFFSET`. * But it still may have children component like Select, Dropdown. * So the warning zIndex should exceed the `CONTAINER_MAX_OFFSET`. */ const CONTAINER_MAX_OFFSET_WITH_CHILDREN = CONTAINER_MAX_OFFSET + CONTAINER_OFFSET; const containerBaseZIndexOffset = exports.containerBaseZIndexOffset = { Modal: CONTAINER_OFFSET, Drawer: CONTAINER_OFFSET, Popover: CONTAINER_OFFSET, Popconfirm: CONTAINER_OFFSET, Tooltip: CONTAINER_OFFSET, Tour: CONTAINER_OFFSET, FloatButton: CONTAINER_OFFSET }; const consumerBaseZIndexOffset = exports.consumerBaseZIndexOffset = { SelectLike: 50, Dropdown: 50, DatePicker: 50, Menu: 50, ImagePreview: 1 }; function isContainerType(type) { return type in containerBaseZIndexOffset; } const useZIndex = (componentType, customZIndex) => { const [, token] = (0, _useToken.default)(); const parentZIndex = _react.default.useContext(_zindexContext.default); const isContainer = isContainerType(componentType); let result; if (customZIndex !== undefined) { result = [customZIndex, customZIndex]; } else { let zIndex = parentZIndex !== null && parentZIndex !== void 0 ? parentZIndex : 0; if (isContainer) { zIndex += // Use preset token zIndex by default but not stack when has parent container (parentZIndex ? 0 : token.zIndexPopupBase) + // Container offset containerBaseZIndexOffset[componentType]; } else { zIndex += consumerBaseZIndexOffset[componentType]; } result = [parentZIndex === undefined ? customZIndex : zIndex, zIndex]; } if (true) { const warning = (0, _warning.devUseWarning)(componentType); const maxZIndex = token.zIndexPopupBase + CONTAINER_MAX_OFFSET_WITH_CHILDREN; const currentZIndex = result[0] || 0; true ? warning(customZIndex !== undefined || currentZIndex <= maxZIndex, 'usage', '`zIndex` is over design token `zIndexPopupBase` too much. It may cause unexpected override.') : 0; } return result; }; exports.useZIndex = useZIndex; /***/ }), /***/ "../../../node_modules/antd/lib/_util/isPrimitive.js": /*!***********************************************************!*\ !*** ../../../node_modules/antd/lib/_util/isPrimitive.js ***! \***********************************************************/ /***/ ((__unused_webpack_module, exports) => { Object.defineProperty(exports, "__esModule", ({ value: true })); exports["default"] = void 0; const isPrimitive = value => typeof value !== 'object' && typeof value !== 'function' || value === null; var _default = exports["default"] = isPrimitive; /***/ }), /***/ "../../../node_modules/antd/lib/_util/motion.js": /*!******************************************************!*\ !*** ../../../node_modules/antd/lib/_util/motion.js ***! \******************************************************/ /***/ ((__unused_webpack_module, exports, __webpack_require__) => { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.getTransitionName = exports["default"] = void 0; var _configProvider = __webpack_require__(/*! ../config-provider */ "../../../node_modules/antd/lib/config-provider/index.js"); // ================== Collapse Motion ================== const getCollapsedHeight = () => ({ height: 0, opacity: 0 }); const getRealHeight = node => { const { scrollHeight } = node; return { height: scrollHeight, opacity: 1 }; }; const getCurrentHeight = node => ({ height: node ? node.offsetHeight : 0 }); const skipOpacityTransition = (_, event) => (event === null || event === void 0 ? void 0 : event.deadline) === true || event.propertyName === 'height'; const initCollapseMotion = function () { let rootCls = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : _configProvider.defaultPrefixCls; return { motionName: `${rootCls}-motion-collapse`, onAppearStart: getCollapsedHeight, onEnterStart: getCollapsedHeight, onAppearActive: getRealHeight, onEnterActive: getRealHeight, onLeaveStart: getCurrentHeight, onLeaveActive: getCollapsedHeight, onAppearEnd: skipOpacityTransition, onEnterEnd: skipOpacityTransition, onLeaveEnd: skipOpacityTransition, motionDeadline: 500 }; }; const _SelectPlacements = ['bottomLeft', 'bottomRight', 'topLeft', 'topRight']; const getTransitionName = (rootPrefixCls, motion, transitionName) => { if (transitionName !== undefined) { return transitionName; } return `${rootPrefixCls}-${motion}`; }; exports.getTransitionName = getTransitionName; var _default = exports["default"] = initCollapseMotion; /***/ }), /***/ "../../../node_modules/antd/lib/_util/placements.js": /*!**********************************************************!*\ !*** ../../../node_modules/antd/lib/_util/placements.js ***! \**********************************************************/ /***/ ((__unused_webpack_module, exports, __webpack_require__) => { Object.defineProperty(exports, "__esModule", ({ value: true })); exports["default"] = getPlacements; exports.getOverflowOptions = getOverflowOptions; var _placementArrow = __webpack_require__(/*! ../style/placementArrow */ "../../../node_modules/antd/lib/style/placementArrow.js"); function getOverflowOptions(placement, arrowOffset, arrowWidth, autoAdjustOverflow) { if (autoAdjustOverflow === false) { return { adjustX: false, adjustY: false }; } const overflow = autoAdjustOverflow && typeof autoAdjustOverflow === 'object' ? autoAdjustOverflow : {}; const baseOverflow = {}; switch (placement) { case 'top': case 'bottom': baseOverflow.shiftX = arrowOffset.arrowOffsetHorizontal * 2 + arrowWidth; baseOverflow.shiftY = true; baseOverflow.adjustY = true; break; case 'left': case 'right': baseOverflow.shiftY = arrowOffset.arrowOffsetVertical * 2 + arrowWidth; baseOverflow.shiftX = true; baseOverflow.adjustX = true; break; } const mergedOverflow = Object.assign(Object.assign({}, baseOverflow), overflow); // Support auto shift if (!mergedOverflow.shiftX) { mergedOverflow.adjustX = true; } if (!mergedOverflow.shiftY) { mergedOverflow.adjustY = true; } return mergedOverflow; } const PlacementAlignMap = { left: { points: ['cr', 'cl'] }, right: { points: ['cl', 'cr'] }, top: { points: ['bc', 'tc'] }, bottom: { points: ['tc', 'bc'] }, topLeft: { points: ['bl', 'tl'] }, leftTop: { points: ['tr', 'tl'] }, topRight: { points: ['br', 'tr'] }, rightTop: { points: ['tl', 'tr'] }, bottomRight: { points: ['tr', 'br'] }, rightBottom: { points: ['bl', 'br'] }, bottomLeft: { points: ['tl', 'bl'] }, leftBottom: { points: ['br', 'bl'] } }; const ArrowCenterPlacementAlignMap = { topLeft: { points: ['bl', 'tc'] }, leftTop: { points: ['tr', 'cl'] }, topRight: { points: ['br', 'tc'] }, rightTop: { points: ['tl', 'cr'] }, bottomRight: { points: ['tr', 'bc'] }, rightBottom: { points: ['bl', 'cr'] }, bottomLeft: { points: ['tl', 'bc'] }, leftBottom: { points: ['br', 'cl'] } }; const DisableAutoArrowList = new Set(['topLeft', 'topRight', 'bottomLeft', 'bottomRight', 'leftTop', 'leftBottom', 'rightTop', 'rightBottom']); function getPlacements(config) { const { arrowWidth, autoAdjustOverflow, arrowPointAtCenter, offset, borderRadius, visibleFirst } = config; const halfArrowWidth = arrowWidth / 2; const placementMap = {}; Object.keys(PlacementAlignMap).forEach(key => { const template = arrowPointAtCenter && ArrowCenterPlacementAlignMap[key] || PlacementAlignMap[key]; const placementInfo = Object.assign(Object.assign({}, template), { offset: [0, 0], dynamicInset: true }); placementMap[key] = placementInfo; // Disable autoArrow since design is fixed position if (DisableAutoArrowList.has(key)) { placementInfo.autoArrow = false; } // Static offset switch (key) { case 'top': case 'topLeft': case 'topRight': placementInfo.offset[1] = -halfArrowWidth - offset; break; case 'bottom': case 'bottomLeft': case 'bottomRight': placementInfo.offset[1] = halfArrowWidth + offset; break; case 'left': case 'leftTop': case 'leftBottom': placementInfo.offset[0] = -halfArrowWidth - offset; break; case 'right': case 'rightTop': case 'rightBottom': placementInfo.offset[0] = halfArrowWidth + offset; break; } // Dynamic offset const arrowOffset = (0, _placementArrow.getArrowOffsetToken)({ contentRadius: borderRadius, limitVerticalRadius: true }); if (arrowPointAtCenter) { switch (key) { case 'topLeft': case 'bottomLeft': placementInfo.offset[0] = -arrowOffset.arrowOffsetHorizontal - halfArrowWidth; break; case 'topRight': case 'bottomRight': placementInfo.offset[0] = arrowOffset.arrowOffsetHorizontal + halfArrowWidth; break; case 'leftTop': case 'rightTop': placementInfo.offset[1] = -arrowOffset.arrowOffsetHorizontal * 2 + halfArrowWidth; break; case 'leftBottom': case 'rightBottom': placementInfo.offset[1] = arrowOffset.arrowOffsetHorizontal * 2 - halfArrowWidth; break; } } // Overflow placementInfo.overflow = getOverflowOptions(key, arrowOffset, arrowWidth, autoAdjustOverflow); // VisibleFirst if (visibleFirst) { placementInfo.htmlRegion = 'visibleFirst'; } }); return placementMap; } /***/ }), /***/ "../../../node_modules/antd/lib/_util/reactNode.js": /*!*********************************************************!*\ !*** ../../../node_modules/antd/lib/_util/reactNode.js ***! \*********************************************************/ /***/ ((__unused_webpack_module, exports, __webpack_require__) => { var _interopRequireDefault = (__webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ "../../../node_modules/@babel/runtime/helpers/interopRequireDefault.js")["default"]); Object.defineProperty(exports, "__esModule", ({ value: true })); exports.cloneElement = cloneElement; exports.isFragment = isFragment; exports.replaceElement = void 0; var _react = _interopRequireDefault(__webpack_require__(/*! react */ "../../../node_modules/react/index.js")); function isFragment(child) { return child && /*#__PURE__*/_react.default.isValidElement(child) && child.type === _react.default.Fragment; } const replaceElement = (element, replacement, props) => { if (! /*#__PURE__*/_react.default.isValidElement(element)) { return replacement; } return /*#__PURE__*/_react.default.cloneElement(element, typeof props === 'function' ? props(element.props || {}) : props); }; exports.replaceElement = replaceElement; function cloneElement(element, props) { return replaceElement(element, element, props); } /***/ }), /***/ "../../../node_modules/antd/lib/_util/responsiveObserver.js": /*!******************************************************************!*\ !*** ../../../node_modules/antd/lib/_util/responsiveObserver.js ***! \******************************************************************/ /***/ ((__unused_webpack_module, exports, __webpack_require__) => { var _interopRequireDefault = (__webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ "../../../node_modules/@babel/runtime/helpers/interopRequireDefault.js")["default"]); Object.defineProperty(exports, "__esModule", ({ value: true })); exports["default"] = useResponsiveObserver; exports.responsiveArray = exports.matchScreen = void 0; var _react = _interopRequireDefault(__webpack_require__(/*! react */ "../../../node_modules/react/index.js")); var _internal = __webpack_require__(/*! ../theme/internal */ "../../../node_modules/antd/lib/theme/internal.js"); const responsiveArray = exports.responsiveArray = ['xxl', 'xl', 'lg', 'md', 'sm', 'xs']; const getResponsiveMap = token => ({ xs: `(max-width: ${token.screenXSMax}px)`, sm: `(min-width: ${token.screenSM}px)`, md: `(min-width: ${token.screenMD}px)`, lg: `(min-width: ${token.screenLG}px)`, xl: `(min-width: ${token.screenXL}px)`, xxl: `(min-width: ${token.screenXXL}px)` }); /** * Ensures that the breakpoints token are valid, in good order * For each breakpoint : screenMin <= screen <= screenMax and screenMax <= nextScreenMin */ const validateBreakpoints = token => { const indexableToken = token; const revBreakpoints = [].concat(responsiveArray).reverse(); revBreakpoints.forEach((breakpoint, i) => { const breakpointUpper = breakpoint.toUpperCase(); const screenMin = `screen${breakpointUpper}Min`; const screen = `screen${breakpointUpper}`; if (!(indexableToken[screenMin] <= indexableToken[screen])) { throw new Error(`${screenMin}<=${screen} fails : !(${indexableToken[screenMin]}<=${indexableToken[screen]})`); } if (i < revBreakpoints.length - 1) { const screenMax = `screen${breakpointUpper}Max`; if (!(indexableToken[screen] <= indexableToken[screenMax])) { throw new Error(`${screen}<=${screenMax} fails : !(${indexableToken[screen]}<=${indexableToken[screenMax]})`); } const nextBreakpointUpperMin = revBreakpoints[i + 1].toUpperCase(); const nextScreenMin = `screen${nextBreakpointUpperMin}Min`; if (!(indexableToken[screenMax] <= indexableToken[nextScreenMin])) { throw new Error(`${screenMax}<=${nextScreenMin} fails : !(${indexableToken[screenMax]}<=${indexableToken[nextScreenMin]})`); } } }); return token; }; function useResponsiveObserver() { const [, token] = (0, _internal.useToken)(); const responsiveMap = getResponsiveMap(validateBreakpoints(token)); // To avoid repeat create instance, we add `useMemo` here. return _react.default.useMemo(() => { const subscribers = new Map(); let subUid = -1; let screens = {}; return { matchHandlers: {}, dispatch(pointMap) { screens = pointMap; subscribers.forEach(func => func(screens)); return subscribers.size >= 1; }, subscribe(func) { if (!subscribers.size) { this.register(); } subUid += 1; subscribers.set(subUid, func); func(screens); return subUid; }, unsubscribe(paramToken) { subscribers.delete(paramToken); if (!subscribers.size) { this.unregister(); } }, unregister() { Object.keys(responsiveMap).forEach(screen => { const matchMediaQuery = responsiveMap[screen]; const handler = this.matchHandlers[matchMediaQuery]; handler === null || handler === void 0 ? void 0 : handler.mql.removeListener(handler === null || handler === void 0 ? void 0 : handler.listener); }); subscribers.clear(); }, register() { Object.keys(responsiveMap).forEach(screen => { const matchMediaQuery = responsiveMap[screen]; const listener = _ref => { let { matches } = _ref; this.dispatch(Object.assign(Object.assign({}, screens), { [screen]: matches })); }; const mql = window.matchMedia(matchMediaQuery); mql.addListener(listener); this.matchHandlers[matchMediaQuery] = { mql, listener }; listener(mql); }); }, responsiveMap }; }, [token]); } const matchScreen = (screens, screenSizes) => { if (screenSizes && typeof screenSizes === 'object') { for (let i = 0; i < responsiveArray.length; i++) { const breakpoint = responsiveArray[i]; if (screens[breakpoint] && screenSizes[breakpoint] !== undefined) { return screenSizes[breakpoint]; } } } }; exports.matchScreen = matchScreen; /***/ }), /***/ "../../../node_modules/antd/lib/_util/scrollTo.js": /*!********************************************************!*\ !*** ../../../node_modules/antd/lib/_util/scrollTo.js ***! \********************************************************/ /***/ ((__unused_webpack_module, exports, __webpack_require__) => { var _interopRequireWildcard = (__webpack_require__(/*! @babel/runtime/helpers/interopRequireWildcard */ "../../../node_modules/@babel/runtime/helpers/interopRequireWildcard.js")["default"]); var _interopRequireDefault = (__webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ "../../../node_modules/@babel/runtime/helpers/interopRequireDefault.js")["default"]); Object.defineProperty(exports, "__esModule", ({ value: true })); exports["default"] = scrollTo; var _raf = _interopRequireDefault(__webpack_require__(/*! rc-util/lib/raf */ "../../../node_modules/rc-util/lib/raf.js")); var _easings = __webpack_require__(/*! ./easings */ "../../../node_modules/antd/lib/_util/easings.js"); var _getScroll = _interopRequireWildcard(__webpack_require__(/*! ./getScroll */ "../../../node_modules/antd/lib/_util/getScroll.js")); function scrollTo(y) { let options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; const { getContainer = () => window, callback, duration = 450 } = options; const container = getContainer(); const scrollTop = (0, _getScroll.default)(container); const startTime = Date.now(); const frameFunc = () => { const timestamp = Date.now(); const time = timestamp - startTime; const nextScrollTop = (0, _easings.easeInOutCubic)(time > duration ? duration : time, scrollTop, y, duration); if ((0, _getScroll.isWindow)(container)) { container.scrollTo(window.pageXOffset, nextScrollTop); } else if (container instanceof Document || container.constructor.name === 'HTMLDocument') { container.documentElement.scrollTop = nextScrollTop; } else { container.scrollTop = nextScrollTop; } if (time < duration) { (0, _raf.default)(frameFunc); } else if (typeof callback === 'function') { callback(); } }; (0, _raf.default)(frameFunc); } /***/ }), /***/ "../../../node_modules/antd/lib/_util/statusUtils.js": /*!***********************************************************!*\ !*** ../../../node_modules/antd/lib/_util/statusUtils.js ***! \***********************************************************/ /***/ ((__unused_webpack_module, exports, __webpack_require__) => { var _interopRequireDefault = (__webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ "../../../node_modules/@babel/runtime/helpers/interopRequireDefault.js")["default"]); Object.defineProperty(exports, "__esModule", ({ value: true })); exports.getMergedStatus = void 0; exports.getStatusClassNames = getStatusClassNames; var _classnames = _interopRequireDefault(__webpack_require__(/*! classnames */ "../../../node_modules/classnames/index.js")); const _InputStatuses = ['warning', 'error', '']; function getStatusClassNames(prefixCls, status, hasFeedback) { return (0, _classnames.default)({ [`${prefixCls}-status-success`]: status === 'success', [`${prefixCls}-status-warning`]: status === 'warning', [`${prefixCls}-status-error`]: status === 'error', [`${prefixCls}-status-validating`]: status === 'validating', [`${prefixCls}-has-feedback`]: hasFeedback }); } const getMergedStatus = (contextStatus, customStatus) => customStatus || contextStatus; exports.getMergedStatus = getMergedStatus; /***/ }), /***/ "../../../node_modules/antd/lib/_util/styleChecker.js": /*!************************************************************!*\ !*** ../../../node_modules/antd/lib/_util/styleChecker.js ***! \************************************************************/ /***/ ((__unused_webpack_module, exports, __webpack_require__) => { var _interopRequireDefault = (__webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ "../../../node_modules/@babel/runtime/helpers/interopRequireDefault.js")["default"]); Object.defineProperty(exports, "__esModule", ({ value: true })); exports.canUseDocElement = void 0; Object.defineProperty(exports, "isStyleSupport", ({ enumerable: true, get: function () { return _styleChecker.isStyleSupport; } })); var _canUseDom = _interopRequireDefault(__webpack_require__(/*! rc-util/lib/Dom/canUseDom */ "../../../node_modules/rc-util/lib/Dom/canUseDom.js")); var _styleChecker = __webpack_require__(/*! rc-util/lib/Dom/styleChecker */ "../../../node_modules/rc-util/lib/Dom/styleChecker.js"); const canUseDocElement = () => (0, _canUseDom.default)() && window.document.documentElement; exports.canUseDocElement = canUseDocElement; /***/ }), /***/ "../../../node_modules/antd/lib/_util/toList.js": /*!******************************************************!*\ !*** ../../../node_modules/antd/lib/_util/toList.js ***! \******************************************************/ /***/ ((__unused_webpack_module, exports) => { Object.defineProperty(exports, "__esModule", ({ value: true })); exports["default"] = toList; function toList(candidate) { let skipEmpty = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; if (skipEmpty && (candidate === undefined || candidate === null)) return []; return Array.isArray(candidate) ? candidate : [candidate]; } /***/ }), /***/ "../../../node_modules/antd/lib/_util/warning.js": /*!*******************************************************!*\ !*** ../../../node_modules/antd/lib/_util/warning.js ***! \*******************************************************/ /***/ ((__unused_webpack_module, exports, __webpack_require__) => { var _interopRequireWildcard = (__webpack_require__(/*! @babel/runtime/helpers/interopRequireWildcard */ "../../../node_modules/@babel/runtime/helpers/interopRequireWildcard.js")["default"]); Object.defineProperty(exports, "__esModule", ({ value: true })); exports.devUseWarning = exports["default"] = exports.WarningContext = void 0; exports.noop = noop; exports.resetWarned = resetWarned; var React = _interopRequireWildcard(__webpack_require__(/*! react */ "../../../node_modules/react/index.js")); var _warning = _interopRequireWildcard(__webpack_require__(/*! rc-util/lib/warning */ "../../../node_modules/rc-util/lib/warning.js")); function noop() {} let deprecatedWarnList = null; function resetWarned() { deprecatedWarnList = null; (0, _warning.resetWarned)(); } // eslint-disable-next-line import/no-mutable-exports let warning = noop; if (true) { warning = (valid, component, message) => { (0, _warning.default)(valid, `[antd: ${component}] ${message}`); // StrictMode will inject console which will not throw warning in React 17. if (false) {} }; } const WarningContext = exports.WarningContext = /*#__PURE__*/React.createContext({}); /** * This is a hook but we not named as `useWarning` * since this is only used in development. * We should always wrap this in `if (process.env.NODE_ENV !== 'production')` condition */ const devUseWarning = exports.devUseWarning = true ? component => { const { strict } = React.useContext(WarningContext); const typeWarning = (valid, type, message) => { if (!valid) { if (strict === false && type === 'deprecated') { const existWarning = deprecatedWarnList; if (!deprecatedWarnList) { deprecatedWarnList = {}; } deprecatedWarnList[component] = deprecatedWarnList[component] || []; if (!deprecatedWarnList[component].includes(message || '')) { deprecatedWarnList[component].push(message || ''); } // Warning for the first time if (!existWarning) { console.warn('[antd] There exists deprecated usage in your code:', deprecatedWarnList); } } else { true ? warning(valid, component, message) : 0; } } }; typeWarning.deprecated = (valid, oldProp, newProp, message) => { typeWarning(valid, 'deprecated', `\`${oldProp}\` is deprecated. Please use \`${newProp}\` instead.${message ? ` ${message}` : ''}`); }; return typeWarning; } : 0; var _default = exports["default"] = warning; /***/ }), /***/ "../../../node_modules/antd/lib/_util/wave/WaveEffect.js": /*!***************************************************************!*\ !*** ../../../node_modules/antd/lib/_util/wave/WaveEffect.js ***! \***************************************************************/ /***/ ((__unused_webpack_module, exports, __webpack_require__) => { "use client"; var _interopRequireDefault = (__webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ "../../../node_modules/@babel/runtime/helpers/interopRequireDefault.js")["default"]); var _interopRequireWildcard = (__webpack_require__(/*! @babel/runtime/helpers/interopRequireWildcard */ "../../../node_modules/@babel/runtime/helpers/interopRequireWildcard.js")["default"]); Object.defineProperty(exports, "__esModule", ({ value: true })); exports["default"] = void 0; var React = _interopRequireWildcard(__webpack_require__(/*! react */ "../../../node_modules/react/index.js")); var _classnames = _interopRequireDefault(__webpack_require__(/*! classnames */ "../../../node_modules/classnames/index.js")); var _rcMotion = _interopRequireDefault(__webpack_require__(/*! rc-motion */ "../../../node_modules/rc-motion/es/index.js")); var _raf = _interopRequireDefault(__webpack_require__(/*! rc-util/lib/raf */ "../../../node_modules/rc-util/lib/raf.js")); var _ref2 = __webpack_require__(/*! rc-util/lib/ref */ "../../../node_modules/rc-util/lib/ref.js"); var _UnstableContext = __webpack_require__(/*! ../../config-provider/UnstableContext */ "../../../node_modules/antd/lib/config-provider/UnstableContext.js"); var _interface = __webpack_require__(/*! ./interface */ "../../../node_modules/antd/lib/_util/wave/interface.js"); var _util = __webpack_require__(/*! ./util */ "../../../node_modules/antd/lib/_util/wave/util.js"); function validateNum(value) { return Number.isNaN(value) ? 0 : value; } const WaveEffect = props => { const { className, target, component, registerUnmount } = props; const divRef = React.useRef(null); // ====================== Refs ====================== const unmountRef = React.useRef(null); React.useEffect(() => { unmountRef.current = registerUnmount(); }, []); // ===================== Effect ===================== const [color, setWaveColor] = React.useState(null); const [borderRadius, setBorderRadius] = React.useState([]); const [left, setLeft] = React.useState(0); const [top, setTop] = React.useState(0); const [width, setWidth] = React.useState(0); const [height, setHeight] = React.useState(0); const [enabled, setEnabled] = React.useState(false); const waveStyle = { left, top, width, height, borderRadius: borderRadius.map(radius => `${radius}px`).join(' ') }; if (color) { waveStyle['--wave-color'] = color; } function syncPos() { const nodeStyle = getComputedStyle(target); // Get wave color from target setWaveColor((0, _util.getTargetWaveColor)(target)); const isStatic = nodeStyle.position === 'static'; // Rect const { borderLeftWidth, borderTopWidth } = nodeStyle; setLeft(isStatic ? target.offsetLeft : validateNum(-parseFloat(borderLeftWidth))); setTop(isStatic ? target.offsetTop : validateNum(-parseFloat(borderTopWidth))); setWidth(target.offsetWidth); setHeight(target.offsetHeight); // Get border radius const { borderTopLeftRadius, borderTopRightRadius, borderBottomLeftRadius, borderBottomRightRadius } = nodeStyle; setBorderRadius([borderTopLeftRadius, borderTopRightRadius, borderBottomRightRadius, borderBottomLeftRadius].map(radius => validateNum(parseFloat(radius)))); } React.useEffect(() => { if (target) { // We need delay to check position here // since UI may change after click const id = (0, _raf.default)(() => { syncPos(); setEnabled(true); }); // Add resize observer to follow size let resizeObserver; if (typeof ResizeObserver !== 'undefined') { resizeObserver = new ResizeObserver(syncPos); resizeObserver.observe(target); } return () => { _raf.default.cancel(id); resizeObserver === null || resizeObserver === void 0 ? void 0 : resizeObserver.disconnect(); }; } }, []); if (!enabled) { return null; } const isSmallComponent = (component === 'Checkbox' || component === 'Radio') && (target === null || target === void 0 ? void 0 : target.classList.contains(_interface.TARGET_CLS)); return /*#__PURE__*/React.createElement(_rcMotion.default, { visible: true, motionAppear: true, motionName: "wave-motion", motionDeadline: 5000, onAppearEnd: (_, event) => { var _a, _b; if (event.deadline || event.propertyName === 'opacity') { const holder = (_a = divRef.current) === null || _a === void 0 ? void 0 : _a.parentElement; (_b = unmountRef.current) === null || _b === void 0 ? void 0 : _b.call(unmountRef).then(() => { holder === null || holder === void 0 ? void 0 : holder.remove(); }); } return false; } }, (_ref, ref) => { let { className: motionClassName } = _ref; return /*#__PURE__*/React.createElement("div", { ref: (0, _ref2.composeRef)(divRef, ref), className: (0, _classnames.default)(className, motionClassName, { 'wave-quick': isSmallComponent }), style: waveStyle }); }); }; const showWaveEffect = (target, info) => { var _a; const { component } = info; // Skip for unchecked checkbox if (component === 'Checkbox' && !((_a = target.querySelector('input')) === null || _a === void 0 ? void 0 : _a.checked)) { return; } // Create holder const holder = document.createElement('div'); holder.style.position = 'absolute'; holder.style.left = '0px'; holder.style.top = '0px'; target === null || target === void 0 ? void 0 : target.insertBefore(holder, target === null || target === void 0 ? void 0 : target.firstChild); const reactRender = (0, _UnstableContext.getReactRender)(); let unmountCallback = null; function registerUnmount() { return unmountCallback; } unmountCallback = reactRender(/*#__PURE__*/React.createElement(WaveEffect, Object.assign({}, info, { target: target, registerUnmount: registerUnmount })), holder); }; var _default = exports["default"] = showWaveEffect; /***/ }), /***/ "../../../node_modules/antd/lib/_util/wave/index.js": /*!**********************************************************!*\ !*** ../../../node_modules/antd/lib/_util/wave/index.js ***! \**********************************************************/ /***/ ((__unused_webpack_module, exports, __webpack_require__) => { var _interopRequireDefault = (__webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ "../../../node_modules/@babel/runtime/helpers/interopRequireDefault.js")["default"]); var _interopRequireWildcard = (__webpack_require__(/*! @babel/runtime/helpers/interopRequireWildcard */ "../../../node_modules/@babel/runtime/helpers/interopRequireWildcard.js")["default"]); Object.defineProperty(exports, "__esModule", ({ value: true })); exports["default"] = void 0; var _react = _interopRequireWildcard(__webpack_require__(/*! react */ "../../../node_modules/react/index.js")); var _classnames = _interopRequireDefault(__webpack_require__(/*! classnames */ "../../../node_modules/classnames/index.js")); var _isVisible = _interopRequireDefault(__webpack_require__(/*! rc-util/lib/Dom/isVisible */ "../../../node_modules/rc-util/lib/Dom/isVisible.js")); var _ref = __webpack_require__(/*! rc-util/lib/ref */ "../../../node_modules/rc-util/lib/ref.js"); var _configProvider = __webpack_require__(/*! ../../config-provider */ "../../../node_modules/antd/lib/config-provider/index.js"); var _reactNode = __webpack_require__(/*! ../reactNode */ "../../../node_modules/antd/lib/_util/reactNode.js"); var _style = _interopRequireDefault(__webpack_require__(/*! ./style */ "../../../node_modules/antd/lib/_util/wave/style.js")); var _useWave = _interopRequireDefault(__webpack_require__(/*! ./useWave */ "../../../node_modules/antd/lib/_util/wave/useWave.js")); const Wave = props => { const { children, disabled, component } = props; const { getPrefixCls } = (0, _react.useContext)(_configProvider.ConfigContext); const containerRef = (0, _react.useRef)(null); // ============================== Style =============================== const prefixCls = getPrefixCls('wave'); const [, hashId] = (0, _style.default)(prefixCls); // =============================== Wave =============================== const showWave = (0, _useWave.default)(containerRef, (0, _classnames.default)(prefixCls, hashId), component); // ============================== Effect ============================== _react.default.useEffect(() => { const node = containerRef.current; if (!node || node.nodeType !== 1 || disabled) { return; } // Click handler const onClick = e => { // Fix radio button click twice if (!(0, _isVisible.default)(e.target) || // No need wave !node.getAttribute || node.getAttribute('disabled') || node.disabled || node.className.includes('disabled') || node.className.includes('-leave')) { return; } showWave(e); }; // Bind events node.addEventListener('click', onClick, true); return () => { node.removeEventListener('click', onClick, true); }; }, [disabled]); // ============================== Render ============================== if (! /*#__PURE__*/_react.default.isValidElement(children)) { return children !== null && children !== void 0 ? children : null; } const ref = (0, _ref.supportRef)(children) ? (0, _ref.composeRef)((0, _ref.getNodeRef)(children), containerRef) : containerRef; return (0, _reactNode.cloneElement)(children, { ref }); }; if (true) { Wave.displayName = 'Wave'; } var _default = exports["default"] = Wave; /***/ }), /***/ "../../../node_modules/antd/lib/_util/wave/interface.js": /*!**************************************************************!*\ !*** ../../../node_modules/antd/lib/_util/wave/interface.js ***! \**************************************************************/ /***/ ((__unused_webpack_module, exports, __webpack_require__) => { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.TARGET_CLS = void 0; var _configProvider = __webpack_require__(/*! ../../config-provider */ "../../../node_modules/antd/lib/config-provider/index.js"); const TARGET_CLS = exports.TARGET_CLS = `${_configProvider.defaultPrefixCls}-wave-target`; /***/ }), /***/ "../../../node_modules/antd/lib/_util/wave/style.js": /*!**********************************************************!*\ !*** ../../../node_modules/antd/lib/_util/wave/style.js ***! \**********************************************************/ /***/ ((__unused_webpack_module, exports, __webpack_require__) => { Object.defineProperty(exports, "__esModule", ({ value: true })); exports["default"] = void 0; var _internal = __webpack_require__(/*! ../../theme/internal */ "../../../node_modules/antd/lib/theme/internal.js"); const genWaveStyle = token => { const { componentCls, colorPrimary } = token; return { [componentCls]: { position: 'absolute', background: 'transparent', pointerEvents: 'none', boxSizing: 'border-box', color: `var(--wave-color, ${colorPrimary})`, boxShadow: `0 0 0 0 currentcolor`, opacity: 0.2, // =================== Motion =================== '&.wave-motion-appear': { transition: [`box-shadow 0.4s ${token.motionEaseOutCirc}`, `opacity 2s ${token.motionEaseOutCirc}`].join(','), '&-active': { boxShadow: `0 0 0 6px currentcolor`, opacity: 0 }, '&.wave-quick': { transition: [`box-shadow ${token.motionDurationSlow} ${token.motionEaseInOut}`, `opacity ${token.motionDurationSlow} ${token.motionEaseInOut}`].join(',') } } } }; }; var _default = exports["default"] = (0, _internal.genComponentStyleHook)('Wave', token => [genWaveStyle(token)]); /***/ }), /***/ "../../../node_modules/antd/lib/_util/wave/useWave.js": /*!************************************************************!*\ !*** ../../../node_modules/antd/lib/_util/wave/useWave.js ***! \************************************************************/ /***/ ((__unused_webpack_module, exports, __webpack_require__) => { var _interopRequireDefault = (__webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ "../../../node_modules/@babel/runtime/helpers/interopRequireDefault.js")["default"]); var _interopRequireWildcard = (__webpack_require__(/*! @babel/runtime/helpers/interopRequireWildcard */ "../../../node_modules/@babel/runtime/helpers/interopRequireWildcard.js")["default"]); Object.defineProperty(exports, "__esModule", ({ value: true })); exports["default"] = void 0; var React = _interopRequireWildcard(__webpack_require__(/*! react */ "../../../node_modules/react/index.js")); var _useEvent = _interopRequireDefault(__webpack_require__(/*! rc-util/lib/hooks/useEvent */ "../../../node_modules/rc-util/lib/hooks/useEvent.js")); var _raf = _interopRequireDefault(__webpack_require__(/*! rc-util/lib/raf */ "../../../node_modules/rc-util/lib/raf.js")); var _configProvider = __webpack_require__(/*! ../../config-provider */ "../../../node_modules/antd/lib/config-provider/index.js"); var _useToken = _interopRequireDefault(__webpack_require__(/*! ../../theme/useToken */ "../../../node_modules/antd/lib/theme/useToken.js")); var _interface = __webpack_require__(/*! ./interface */ "../../../node_modules/antd/lib/_util/wave/interface.js"); var _WaveEffect = _interopRequireDefault(__webpack_require__(/*! ./WaveEffect */ "../../../node_modules/antd/lib/_util/wave/WaveEffect.js")); const useWave = (nodeRef, className, component) => { const { wave } = React.useContext(_configProvider.ConfigContext); const [, token, hashId] = (0, _useToken.default)(); const showWave = (0, _useEvent.default)(event => { const node = nodeRef.current; if ((wave === null || wave === void 0 ? void 0 : wave.disabled) || !node) { return; } const targetNode = node.querySelector(`.${_interface.TARGET_CLS}`) || node; const { showEffect } = wave || {}; // Customize wave effect (showEffect || _WaveEffect.default)(targetNode, { className, token, component, event, hashId }); }); const rafId = React.useRef(null); // Merge trigger event into one for each frame const showDebounceWave = event => { _raf.default.cancel(rafId.current); rafId.current = (0, _raf.default)(() => { showWave(event); }); }; return showDebounceWave; }; var _default = exports["default"] = useWave; /***/ }), /***/ "../../../node_modules/antd/lib/_util/wave/util.js": /*!*********************************************************!*\ !*** ../../../node_modules/antd/lib/_util/wave/util.js ***! \*********************************************************/ /***/ ((__unused_webpack_module, exports) => { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.getTargetWaveColor = getTargetWaveColor; exports.isValidWaveColor = isValidWaveColor; function isValidWaveColor(color) { return color && color !== '#fff' && color !== '#ffffff' && color !== 'rgb(255, 255, 255)' && color !== 'rgba(255, 255, 255, 1)' && !/rgba\((?:\d*, ){3}0\)/.test(color) && // any transparent rgba color color !== 'transparent'; } function getTargetWaveColor(node) { const { borderTopColor, borderColor, backgroundColor } = getComputedStyle(node); if (isValidWaveColor(borderTopColor)) { return borderTopColor; } if (isValidWaveColor(borderColor)) { return borderColor; } if (isValidWaveColor(backgroundColor)) { return backgroundColor; } return null; } /***/ }), /***/ "../../../node_modules/antd/lib/_util/zindexContext.js": /*!*************************************************************!*\ !*** ../../../node_modules/antd/lib/_util/zindexContext.js ***! \*************************************************************/ /***/ ((__unused_webpack_module, exports, __webpack_require__) => { var _interopRequireDefault = (__webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ "../../../node_modules/@babel/runtime/helpers/interopRequireDefault.js")["default"]); Object.defineProperty(exports, "__esModule", ({ value: true })); exports["default"] = void 0; var _react = _interopRequireDefault(__webpack_require__(/*! react */ "../../../node_modules/react/index.js")); const zIndexContext = /*#__PURE__*/_react.default.createContext(undefined); if (true) { zIndexContext.displayName = 'zIndexContext'; } var _default = exports["default"] = zIndexContext; /***/ }) }]); //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoianMvdmVuZG9ycy1ub2RlX21vZHVsZXNfYW50ZF9saWJfX3V0aWxfQWN0aW9uQnV0dG9uX2pzLW5vZGVfbW9kdWxlc19hbnRkX2xpYl9fdXRpbF9Db250ZXh0SXNvbGF0LTRmMzM3Yi52b2x1bnRlZXJhcGkuYzkxYjE5OGYzNTQ1OTFlNWE2YTEuYnVuZGxlLmpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7OztBQUFhO0FBQ2I7O0FBRUEsNkJBQTZCLDZKQUErRDtBQUM1Riw4QkFBOEIsK0pBQWdFO0FBQzlGLDhDQUE2QztBQUM3QztBQUNBLENBQUMsRUFBQztBQUNGLGtCQUFlO0FBQ2Ysb0NBQW9DLG1CQUFPLENBQUMsbURBQU87QUFDbkQsdUNBQXVDLG1CQUFPLENBQUMsdUZBQTRCO0FBQzNFLHFDQUFxQyxtQkFBTyxDQUFDLGlFQUFXO0FBQ3hELHFCQUFxQixtQkFBTyxDQUFDLHVGQUF5QjtBQUN0RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyRUFBMkU7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OENBQTZDO0FBQzdDO0FBQ0EsQ0FBQyxFQUFDO0FBQ0Ysa0JBQWU7QUFDZixvQ0FBb0MsbUJBQU8sQ0FBQyxtREFBTztBQUNuRDtBQUNBLElBQUksSUFBcUM7QUFDekM7QUFDQTtBQUNBLGVBQWUsa0JBQWUiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9AY29yZS92b2x1bnRlZXJfYXBwLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9hbnRkL2xpYi9fdXRpbC9BY3Rpb25CdXR0b24uanMiLCJ3ZWJwYWNrOi8vQGNvcmUvdm9sdW50ZWVyX2FwcC8uLi8uLi8uLi9ub2RlX21vZHVsZXMvYW50ZC9saWIvX3V0aWwvQ29udGV4dElzb2xhdG9yLmpzIiwid2VicGFjazovL0Bjb3JlL3ZvbHVudGVlcl9hcHAvLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2FudGQvbGliL191dGlsL1B1cmVQYW5lbC5qcyIsIndlYnBhY2s6Ly9AY29yZS92b2x1bnRlZXJfYXBwLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9hbnRkL2xpYi9fdXRpbC9jYXBpdGFsaXplLmpzIiwid2VicGFjazovL0Bjb3JlL3ZvbHVudGVlcl9hcHAvLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2FudGQvbGliL191dGlsL2NvbG9ycy5qcyIsIndlYnBhY2s6Ly9AY29yZS92b2x1bnRlZXJfYXBwLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9hbnRkL2xpYi9fdXRpbC9lYXNpbmdzLmpzIiwid2VicGFjazovL0Bjb3JlL3ZvbHVudGVlcl9hcHAvLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2FudGQvbGliL191dGlsL2V4dGVuZHNPYmplY3QuanMiLCJ3ZWJwYWNrOi8vQGNvcmUvdm9sdW50ZWVyX2FwcC8uLi8uLi8uLi9ub2RlX21vZHVsZXMvYW50ZC9saWIvX3V0aWwvZ2FwU2l6ZS5qcyIsIndlYnBhY2s6Ly9AY29yZS92b2x1bnRlZXJfYXBwLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9hbnRkL2xpYi9fdXRpbC9nZXRBbGxvd0NsZWFyLmpzIiwid2VicGFjazovL0Bjb3JlL3ZvbHVudGVlcl9hcHAvLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2FudGQvbGliL191dGlsL2dldFJlbmRlclByb3BWYWx1ZS5qcyIsIndlYnBhY2s6Ly9AY29yZS92b2x1bnRlZXJfYXBwLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9hbnRkL2xpYi9fdXRpbC9nZXRTY3JvbGwuanMiLCJ3ZWJwYWNrOi8vQGNvcmUvdm9sdW50ZWVyX2FwcC8uLi8uLi8uLi9ub2RlX21vZHVsZXMvYW50ZC9saWIvX3V0aWwvaG9va3MvdXNlQ2xvc2FibGUuanMiLCJ3ZWJwYWNrOi8vQGNvcmUvdm9sdW50ZWVyX2FwcC8uLi8uLi8uLi9ub2RlX21vZHVsZXMvYW50ZC9saWIvX3V0aWwvaG9va3MvdXNlRm9yY2VVcGRhdGUuanMiLCJ3ZWJwYWNrOi8vQGNvcmUvdm9sdW50ZWVyX2FwcC8uLi8uLi8uLi9ub2RlX21vZHVsZXMvYW50ZC9saWIvX3V0aWwvaG9va3MvdXNlTXVsdGlwbGVTZWxlY3QuanMiLCJ3ZWJwYWNrOi8vQGNvcmUvdm9sdW50ZWVyX2FwcC8uLi8uLi8uLi9ub2RlX21vZHVsZXMvYW50ZC9saWIvX3V0aWwvaG9va3MvdXNlUGF0Y2hFbGVtZW50LmpzIiwid2VicGFjazovL0Bjb3JlL3ZvbHVudGVlcl9hcHAvLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2FudGQvbGliL191dGlsL2hvb2tzL3VzZVByb3h5SW1wZXJhdGl2ZUhhbmRsZS5qcyIsIndlYnBhY2s6Ly9AY29yZS92b2x1bnRlZXJfYXBwLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9hbnRkL2xpYi9fdXRpbC9ob29rcy91c2VTeW5jU3RhdGUuanMiLCJ3ZWJwYWNrOi8vQGNvcmUvdm9sdW50ZWVyX2FwcC8uLi8uLi8uLi9ub2RlX21vZHVsZXMvYW50ZC9saWIvX3V0aWwvaG9va3MvdXNlWkluZGV4LmpzIiwid2VicGFjazovL0Bjb3JlL3ZvbHVudGVlcl9hcHAvLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2FudGQvbGliL191dGlsL2lzUHJpbWl0aXZlLmpzIiwid2VicGFjazovL0Bjb3JlL3ZvbHVudGVlcl9hcHAvLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2FudGQvbGliL191dGlsL21vdGlvbi5qcyIsIndlYnBhY2s6Ly9AY29yZS92b2x1bnRlZXJfYXBwLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9hbnRkL2xpYi9fdXRpbC9wbGFjZW1lbnRzLmpzIiwid2VicGFjazovL0Bjb3JlL3ZvbHVudGVlcl9hcHAvLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2FudGQvbGliL191dGlsL3JlYWN0Tm9kZS5qcyIsIndlYnBhY2s6Ly9AY29yZS92b2x1bnRlZXJfYXBwLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9hbnRkL2xpYi9fdXRpbC9yZXNwb25zaXZlT2JzZXJ2ZXIuanMiLCJ3ZWJwYWNrOi8vQGNvcmUvdm9sdW50ZWVyX2FwcC8uLi8uLi8uLi9ub2RlX21vZHVsZXMvYW50ZC9saWIvX3V0aWwvc2Nyb2xsVG8uanMiLCJ3ZWJwYWNrOi8vQGNvcmUvdm9sdW50ZWVyX2FwcC8uLi8uLi8uLi9ub2RlX21vZHVsZXMvYW50ZC9saWIvX3V0aWwvc3RhdHVzVXRpbHMuanMiLCJ3ZWJwYWNrOi8vQGNvcmUvdm9sdW50ZWVyX2FwcC8uLi8uLi8uLi9ub2RlX21vZHVsZXMvYW50ZC9saWIvX3V0aWwvc3R5bGVDaGVja2VyLmpzIiwid2VicGFjazovL0Bjb3JlL3ZvbHVudGVlcl9hcHAvLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2FudGQvbGliL191dGlsL3RvTGlzdC5qcyIsIndlYnBhY2s6Ly9AY29yZS92b2x1bnRlZXJfYXBwLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9hbnRkL2xpYi9fdXRpbC93YXJuaW5nLmpzIiwid2VicGFjazovL0Bjb3JlL3ZvbHVudGVlcl9hcHAvLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2FudGQvbGliL191dGlsL3dhdmUvV2F2ZUVmZmVjdC5qcyIsIndlYnBhY2s6Ly9AY29yZS92b2x1bnRlZXJfYXBwLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9hbnRkL2xpYi9fdXRpbC93YXZlL2luZGV4LmpzIiwid2VicGFjazovL0Bjb3JlL3ZvbHVudGVlcl9hcHAvLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2FudGQvbGliL191dGlsL3dhdmUvaW50ZXJmYWNlLmpzIiwid2VicGFjazovL0Bjb3JlL3ZvbHVudGVlcl9hcHAvLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2FudGQvbGliL191dGlsL3dhdmUvc3R5bGUuanMiLCJ3ZWJwYWNrOi8vQGNvcmUvdm9sdW50ZWVyX2FwcC8uLi8uLi8uLi9ub2RlX21vZHVsZXMvYW50ZC9saWIvX3V0aWwvd2F2ZS91c2VXYXZlLmpzIiwid2VicGFjazovL0Bjb3JlL3ZvbHVudGVlcl9hcHAvLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2FudGQvbGliL191dGlsL3dhdmUvdXRpbC5qcyIsIndlYnBhY2s6Ly9AY29yZS92b2x1bnRlZXJfYXBwLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9hbnRkL2xpYi9fdXRpbC96aW5kZXhDb250ZXh0LmpzIl0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuXCJ1c2UgY2xpZW50XCI7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpLmRlZmF1bHQ7XG52YXIgX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkXCIpLmRlZmF1bHQ7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xudmFyIFJlYWN0ID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQocmVxdWlyZShcInJlYWN0XCIpKTtcbnZhciBfdXNlU3RhdGUgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJyYy11dGlsL2xpYi9ob29rcy91c2VTdGF0ZVwiKSk7XG52YXIgX2J1dHRvbiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4uL2J1dHRvblwiKSk7XG52YXIgX2J1dHRvbkhlbHBlcnMgPSByZXF1aXJlKFwiLi4vYnV0dG9uL2J1dHRvbkhlbHBlcnNcIik7XG5mdW5jdGlvbiBpc1RoZW5hYmxlKHRoaW5nKSB7XG4gIHJldHVybiAhISh0aGluZyA9PT0gbnVsbCB8fCB0aGluZyA9PT0gdm9pZCAwID8gdm9pZCAwIDogdGhpbmcudGhlbik7XG59XG5jb25zdCBBY3Rpb25CdXR0b24gPSBwcm9wcyA9PiB7XG4gIGNvbnN0IHtcbiAgICB0eXBlLFxuICAgIGNoaWxkcmVuLFxuICAgIHByZWZpeENscyxcbiAgICBidXR0b25Qcm9wcyxcbiAgICBjbG9zZSxcbiAgICBhdXRvRm9jdXMsXG4gICAgZW1pdEV2ZW50LFxuICAgIGlzU2lsZW50LFxuICAgIHF1aXRPbk51bGxpc2hSZXR1cm5WYWx1ZSxcbiAgICBhY3Rpb25GblxuICB9ID0gcHJvcHM7XG4gIGNvbnN0IGNsaWNrZWRSZWYgPSBSZWFjdC51c2VSZWYoZmFsc2UpO1xuICBjb25zdCBidXR0b25SZWYgPSBSZWFjdC51c2VSZWYobnVsbCk7XG4gIGNvbnN0IFtsb2FkaW5nLCBzZXRMb2FkaW5nXSA9ICgwLCBfdXNlU3RhdGUuZGVmYXVsdCkoZmFsc2UpO1xuICBjb25zdCBvbkludGVybmFsQ2xvc2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgY2xvc2UgPT09IG51bGwgfHwgY2xvc2UgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGNsb3NlLmFwcGx5KHZvaWQgMCwgYXJndW1lbnRzKTtcbiAgfTtcbiAgUmVhY3QudXNlRWZmZWN0KCgpID0+IHtcbiAgICBsZXQgdGltZW91dElkID0gbnVsbDtcbiAgICBpZiAoYXV0b0ZvY3VzKSB7XG4gICAgICB0aW1lb3V0SWQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICAoX2EgPSBidXR0b25SZWYuY3VycmVudCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmZvY3VzKHtcbiAgICAgICAgICBwcmV2ZW50U2Nyb2xsOiB0cnVlXG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICBpZiAodGltZW91dElkKSB7XG4gICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0SWQpO1xuICAgICAgfVxuICAgIH07XG4gIH0sIFtdKTtcbiAgY29uc3QgaGFuZGxlUHJvbWlzZU9uT2sgPSByZXR1cm5WYWx1ZU9mT25PayA9PiB7XG4gICAgaWYgKCFpc1RoZW5hYmxlKHJldHVyblZhbHVlT2ZPbk9rKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBzZXRMb2FkaW5nKHRydWUpO1xuICAgIHJldHVyblZhbHVlT2ZPbk9rLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgc2V0TG9hZGluZyhmYWxzZSwgdHJ1ZSk7XG4gICAgICBvbkludGVybmFsQ2xvc2UuYXBwbHkodm9pZCAwLCBhcmd1bWVudHMpO1xuICAgICAgY2xpY2tlZFJlZi5jdXJyZW50ID0gZmFsc2U7XG4gICAgfSwgZSA9PiB7XG4gICAgICAvLyBTZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9hbnQtZGVzaWduL2FudC1kZXNpZ24vaXNzdWVzLzYxODNcbiAgICAgIHNldExvYWRpbmcoZmFsc2UsIHRydWUpO1xuICAgICAgY2xpY2tlZFJlZi5jdXJyZW50ID0gZmFsc2U7XG4gICAgICAvLyBEbyBub3QgdGhyb3cgaWYgaXMgYGF3YWl0YCBtb2RlXG4gICAgICBpZiAoaXNTaWxlbnQgPT09IG51bGwgfHwgaXNTaWxlbnQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGlzU2lsZW50KCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KGUpO1xuICAgIH0pO1xuICB9O1xuICBjb25zdCBvbkNsaWNrID0gZSA9PiB7XG4gICAgaWYgKGNsaWNrZWRSZWYuY3VycmVudCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjbGlja2VkUmVmLmN1cnJlbnQgPSB0cnVlO1xuICAgIGlmICghYWN0aW9uRm4pIHtcbiAgICAgIG9uSW50ZXJuYWxDbG9zZSgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBsZXQgcmV0dXJuVmFsdWVPZk9uT2s7XG4gICAgaWYgKGVtaXRFdmVudCkge1xuICAgICAgcmV0dXJuVmFsdWVPZk9uT2sgPSBhY3Rpb25GbihlKTtcbiAgICAgIGlmIChxdWl0T25OdWxsaXNoUmV0dXJuVmFsdWUgJiYgIWlzVGhlbmFibGUocmV0dXJuVmFsdWVPZk9uT2spKSB7XG4gICAgICAgIGNsaWNrZWRSZWYuY3VycmVudCA9IGZhbHNlO1xuICAgICAgICBvbkludGVybmFsQ2xvc2UoZSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGFjdGlvbkZuLmxlbmd0aCkge1xuICAgICAgcmV0dXJuVmFsdWVPZk9uT2sgPSBhY3Rpb25GbihjbG9zZSk7XG4gICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vYW50LWRlc2lnbi9hbnQtZGVzaWduL2lzc3Vlcy8yMzM1OFxuICAgICAgY2xpY2tlZFJlZi5jdXJyZW50ID0gZmFsc2U7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVyblZhbHVlT2ZPbk9rID0gYWN0aW9uRm4oKTtcbiAgICAgIGlmICghaXNUaGVuYWJsZShyZXR1cm5WYWx1ZU9mT25PaykpIHtcbiAgICAgICAgb25JbnRlcm5hbENsb3NlKCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG4gICAgaGFuZGxlUHJvbWlzZU9uT2socmV0dXJuVmFsdWVPZk9uT2spO1xuICB9O1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoX2J1dHRvbi5kZWZhdWx0LCBPYmplY3QuYXNzaWduKHt9LCAoMCwgX2J1dHRvbkhlbHBlcnMuY29udmVydExlZ2FjeVByb3BzKSh0eXBlKSwge1xuICAgIG9uQ2xpY2s6IG9uQ2xpY2ssXG4gICAgbG9hZGluZzogbG9hZGluZyxcbiAgICBwcmVmaXhDbHM6IHByZWZpeENsc1xuICB9LCBidXR0b25Qcm9wcywge1xuICAgIHJlZjogYnV0dG9uUmVmXG4gIH0pLCBjaGlsZHJlbik7XG59O1xudmFyIF9kZWZhdWx0ID0gZXhwb3J0cy5kZWZhdWx0ID0gQWN0aW9uQnV0dG9uOyIsIlwidXNlIHN0cmljdFwiO1xuXCJ1c2UgY2xpZW50XCI7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpLmRlZmF1bHQ7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xudmFyIF9yZWFjdCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcInJlYWN0XCIpKTtcbnZhciBfY29udGV4dCA9IHJlcXVpcmUoXCIuLi9mb3JtL2NvbnRleHRcIik7XG52YXIgX0NvbXBhY3QgPSByZXF1aXJlKFwiLi4vc3BhY2UvQ29tcGFjdFwiKTtcbmNvbnN0IENvbnRleHRJc29sYXRvciA9IHByb3BzID0+IHtcbiAgY29uc3Qge1xuICAgIHNwYWNlLFxuICAgIGZvcm0sXG4gICAgY2hpbGRyZW5cbiAgfSA9IHByb3BzO1xuICBpZiAoY2hpbGRyZW4gPT09IHVuZGVmaW5lZCB8fCBjaGlsZHJlbiA9PT0gbnVsbCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIGxldCByZXN1bHQgPSBjaGlsZHJlbjtcbiAgaWYgKGZvcm0pIHtcbiAgICByZXN1bHQgPSAvKiNfX1BVUkVfXyovX3JlYWN0LmRlZmF1bHQuY3JlYXRlRWxlbWVudChfY29udGV4dC5Ob0Zvcm1TdHlsZSwge1xuICAgICAgb3ZlcnJpZGU6IHRydWUsXG4gICAgICBzdGF0dXM6IHRydWVcbiAgICB9LCByZXN1bHQpO1xuICB9XG4gIGlmIChzcGFjZSkge1xuICAgIHJlc3VsdCA9IC8qI19fUFVSRV9fKi9fcmVhY3QuZGVmYXVsdC5jcmVhdGVFbGVtZW50KF9Db21wYWN0Lk5vQ29tcGFjdFN0eWxlLCBudWxsLCByZXN1bHQpO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59O1xudmFyIF9kZWZhdWx0ID0gZXhwb3J0cy5kZWZhdWx0ID0gQ29udGV4dElzb2xhdG9yOyIsIlwidXNlIHN0cmljdFwiO1xuXCJ1c2UgY2xpZW50XCI7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpLmRlZmF1bHQ7XG52YXIgX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkXCIpLmRlZmF1bHQ7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xuZXhwb3J0cy53aXRoUHVyZVJlbmRlclRoZW1lID0gd2l0aFB1cmVSZW5kZXJUaGVtZTtcbnZhciBSZWFjdCA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKHJlcXVpcmUoXCJyZWFjdFwiKSk7XG52YXIgX3VzZU1lcmdlZFN0YXRlID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwicmMtdXRpbC9saWIvaG9va3MvdXNlTWVyZ2VkU3RhdGVcIikpO1xudmFyIF9jb25maWdQcm92aWRlciA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKHJlcXVpcmUoXCIuLi9jb25maWctcHJvdmlkZXJcIikpO1xuZnVuY3Rpb24gd2l0aFB1cmVSZW5kZXJUaGVtZShDb21wb25lbnQpIHtcbiAgcmV0dXJuIHByb3BzID0+ICgvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChfY29uZmlnUHJvdmlkZXIuZGVmYXVsdCwge1xuICAgIHRoZW1lOiB7XG4gICAgICB0b2tlbjoge1xuICAgICAgICBtb3Rpb246IGZhbHNlLFxuICAgICAgICB6SW5kZXhQb3B1cEJhc2U6IDBcbiAgICAgIH1cbiAgICB9XG4gIH0sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KENvbXBvbmVudCwgT2JqZWN0LmFzc2lnbih7fSwgcHJvcHMpKSkpO1xufVxuLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbmNvbnN0IGdlblB1cmVQYW5lbCA9IChDb21wb25lbnQsIGFsaWduUHJvcE5hbWUsIHBvc3RQcm9wcywgZGVmYXVsdFByZWZpeENscywgZ2V0RHJvcGRvd25DbHMpID0+IHtcbiAgY29uc3QgUHVyZVBhbmVsID0gcHJvcHMgPT4ge1xuICAgIGNvbnN0IHtcbiAgICAgIHByZWZpeENsczogY3VzdG9taXplUHJlZml4Q2xzLFxuICAgICAgc3R5bGVcbiAgICB9ID0gcHJvcHM7XG4gICAgY29uc3QgaG9sZGVyUmVmID0gUmVhY3QudXNlUmVmKG51bGwpO1xuICAgIGNvbnN0IFtwb3B1cEhlaWdodCwgc2V0UG9wdXBIZWlnaHRdID0gUmVhY3QudXNlU3RhdGUoMCk7XG4gICAgY29uc3QgW3BvcHVwV2lkdGgsIHNldFBvcHVwV2lkdGhdID0gUmVhY3QudXNlU3RhdGUoMCk7XG4gICAgY29uc3QgW29wZW4sIHNldE9wZW5dID0gKDAsIF91c2VNZXJnZWRTdGF0ZS5kZWZhdWx0KShmYWxzZSwge1xuICAgICAgdmFsdWU6IHByb3BzLm9wZW5cbiAgICB9KTtcbiAgICBjb25zdCB7XG4gICAgICBnZXRQcmVmaXhDbHNcbiAgICB9ID0gUmVhY3QudXNlQ29udGV4dChfY29uZmlnUHJvdmlkZXIuQ29uZmlnQ29udGV4dCk7XG4gICAgY29uc3QgcHJlZml4Q2xzID0gZ2V0UHJlZml4Q2xzKGRlZmF1bHRQcmVmaXhDbHMgfHwgJ3NlbGVjdCcsIGN1c3RvbWl6ZVByZWZpeENscyk7XG4gICAgUmVhY3QudXNlRWZmZWN0KCgpID0+IHtcbiAgICAgIC8vIFdlIGRvIG5vdCBjYXJlIGFib3V0IHNzclxuICAgICAgc2V0T3Blbih0cnVlKTtcbiAgICAgIGlmICh0eXBlb2YgUmVzaXplT2JzZXJ2ZXIgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIGNvbnN0IHJlc2l6ZU9ic2VydmVyID0gbmV3IFJlc2l6ZU9ic2VydmVyKGVudHJpZXMgPT4ge1xuICAgICAgICAgIGNvbnN0IGVsZW1lbnQgPSBlbnRyaWVzWzBdLnRhcmdldDtcbiAgICAgICAgICBzZXRQb3B1cEhlaWdodChlbGVtZW50Lm9mZnNldEhlaWdodCArIDgpO1xuICAgICAgICAgIHNldFBvcHVwV2lkdGgoZWxlbWVudC5vZmZzZXRXaWR0aCk7XG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCBpbnRlcnZhbCA9IHNldEludGVydmFsKCgpID0+IHtcbiAgICAgICAgICB2YXIgX2E7XG4gICAgICAgICAgY29uc3QgZHJvcGRvd25DbHMgPSBnZXREcm9wZG93bkNscyA/IGAuJHtnZXREcm9wZG93bkNscyhwcmVmaXhDbHMpfWAgOiBgLiR7cHJlZml4Q2xzfS1kcm9wZG93bmA7XG4gICAgICAgICAgY29uc3QgcG9wdXAgPSAoX2EgPSBob2xkZXJSZWYuY3VycmVudCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnF1ZXJ5U2VsZWN0b3IoZHJvcGRvd25DbHMpO1xuICAgICAgICAgIGlmIChwb3B1cCkge1xuICAgICAgICAgICAgY2xlYXJJbnRlcnZhbChpbnRlcnZhbCk7XG4gICAgICAgICAgICByZXNpemVPYnNlcnZlci5vYnNlcnZlKHBvcHVwKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sIDEwKTtcbiAgICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgICBjbGVhckludGVydmFsKGludGVydmFsKTtcbiAgICAgICAgICByZXNpemVPYnNlcnZlci5kaXNjb25uZWN0KCk7XG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfSwgW10pO1xuICAgIGxldCBtZXJnZWRQcm9wcyA9IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgcHJvcHMpLCB7XG4gICAgICBzdHlsZTogT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBzdHlsZSksIHtcbiAgICAgICAgbWFyZ2luOiAwXG4gICAgICB9KSxcbiAgICAgIG9wZW4sXG4gICAgICB2aXNpYmxlOiBvcGVuLFxuICAgICAgZ2V0UG9wdXBDb250YWluZXI6ICgpID0+IGhvbGRlclJlZi5jdXJyZW50XG4gICAgfSk7XG4gICAgaWYgKHBvc3RQcm9wcykge1xuICAgICAgbWVyZ2VkUHJvcHMgPSBwb3N0UHJvcHMobWVyZ2VkUHJvcHMpO1xuICAgIH1cbiAgICBpZiAoYWxpZ25Qcm9wTmFtZSkge1xuICAgICAgT2JqZWN0LmFzc2lnbihtZXJnZWRQcm9wcywge1xuICAgICAgICBbYWxpZ25Qcm9wTmFtZV06IHtcbiAgICAgICAgICBvdmVyZmxvdzoge1xuICAgICAgICAgICAgYWRqdXN0WDogZmFsc2UsXG4gICAgICAgICAgICBhZGp1c3RZOiBmYWxzZVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICAgIGNvbnN0IG1lcmdlZFN0eWxlID0ge1xuICAgICAgcGFkZGluZ0JvdHRvbTogcG9wdXBIZWlnaHQsXG4gICAgICBwb3NpdGlvbjogJ3JlbGF0aXZlJyxcbiAgICAgIG1pbldpZHRoOiBwb3B1cFdpZHRoXG4gICAgfTtcbiAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgcmVmOiBob2xkZXJSZWYsXG4gICAgICBzdHlsZTogbWVyZ2VkU3R5bGVcbiAgICB9LCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChDb21wb25lbnQsIE9iamVjdC5hc3NpZ24oe30sIG1lcmdlZFByb3BzKSkpO1xuICB9O1xuICByZXR1cm4gd2l0aFB1cmVSZW5kZXJUaGVtZShQdXJlUGFuZWwpO1xufTtcbnZhciBfZGVmYXVsdCA9IGV4cG9ydHMuZGVmYXVsdCA9IGdlblB1cmVQYW5lbDsiLCJcInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IGNhcGl0YWxpemU7XG5mdW5jdGlvbiBjYXBpdGFsaXplKHN0cikge1xuICBpZiAodHlwZW9mIHN0ciAhPT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gc3RyO1xuICB9XG4gIGNvbnN0IHJldCA9IHN0ci5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIHN0ci5zbGljZSgxKTtcbiAgcmV0dXJuIHJldDtcbn0iLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIikuZGVmYXVsdDtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLlByZXNldFN0YXR1c0NvbG9yVHlwZXMgPSB2b2lkIDA7XG5leHBvcnRzLmlzUHJlc2V0Q29sb3IgPSBpc1ByZXNldENvbG9yO1xuZXhwb3J0cy5pc1ByZXNldFN0YXR1c0NvbG9yID0gaXNQcmVzZXRTdGF0dXNDb2xvcjtcbnZhciBfdG9Db25zdW1hYmxlQXJyYXkyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy90b0NvbnN1bWFibGVBcnJheVwiKSk7XG52YXIgX2ludGVyZmFjZSA9IHJlcXVpcmUoXCIuLi90aGVtZS9pbnRlcmZhY2VcIik7XG5jb25zdCBpbnZlcnNlQ29sb3JzID0gX2ludGVyZmFjZS5QcmVzZXRDb2xvcnMubWFwKGNvbG9yID0+IGAke2NvbG9yfS1pbnZlcnNlYCk7XG5jb25zdCBQcmVzZXRTdGF0dXNDb2xvclR5cGVzID0gZXhwb3J0cy5QcmVzZXRTdGF0dXNDb2xvclR5cGVzID0gWydzdWNjZXNzJywgJ3Byb2Nlc3NpbmcnLCAnZXJyb3InLCAnZGVmYXVsdCcsICd3YXJuaW5nJ107XG4vKipcbiAqIGRldGVybWluZSBpZiB0aGUgY29sb3Iga2V5d29yZCBiZWxvbmdzIHRvIHRoZSBgQW50IERlc2lnbmAge0BsaW5rIFByZXNldENvbG9yc30uXG4gKiBAcGFyYW0gY29sb3IgY29sb3IgdG8gYmUganVkZ2VkXG4gKiBAcGFyYW0gaW5jbHVkZUludmVyc2Ugd2hldGhlciB0byBpbmNsdWRlIHJldmVyc2VkIGNvbG9yc1xuICovXG5mdW5jdGlvbiBpc1ByZXNldENvbG9yKGNvbG9yKSB7XG4gIGxldCBpbmNsdWRlSW52ZXJzZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogdHJ1ZTtcbiAgaWYgKGluY2x1ZGVJbnZlcnNlKSB7XG4gICAgcmV0dXJuIFtdLmNvbmNhdCgoMCwgX3RvQ29uc3VtYWJsZUFycmF5Mi5kZWZhdWx0KShpbnZlcnNlQ29sb3JzKSwgKDAsIF90b0NvbnN1bWFibGVBcnJheTIuZGVmYXVsdCkoX2ludGVyZmFjZS5QcmVzZXRDb2xvcnMpKS5pbmNsdWRlcyhjb2xvcik7XG4gIH1cbiAgcmV0dXJuIF9pbnRlcmZhY2UuUHJlc2V0Q29sb3JzLmluY2x1ZGVzKGNvbG9yKTtcbn1cbmZ1bmN0aW9uIGlzUHJlc2V0U3RhdHVzQ29sb3IoY29sb3IpIHtcbiAgcmV0dXJuIFByZXNldFN0YXR1c0NvbG9yVHlwZXMuaW5jbHVkZXMoY29sb3IpO1xufSIsIlwidXNlIHN0cmljdFwiO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5lYXNlSW5PdXRDdWJpYyA9IGVhc2VJbk91dEN1YmljO1xuZnVuY3Rpb24gZWFzZUluT3V0Q3ViaWModCwgYiwgYywgZCkge1xuICBjb25zdCBjYyA9IGMgLSBiO1xuICAvLyBiaW9tZS1pZ25vcmUgbGludDogaXQgaXMgYSBjb21tb24gZWFzaW5nIGZ1bmN0aW9uXG4gIHQgLz0gZCAvIDI7XG4gIGlmICh0IDwgMSkge1xuICAgIHJldHVybiBjYyAvIDIgKiB0ICogdCAqIHQgKyBiO1xuICB9XG4gIC8vIGJpb21lLWlnbm9yZSBsaW50OiBpdCBpcyBhIGNvbW1vbiBlYXNpbmcgZnVuY3Rpb25cbiAgcmV0dXJuIGNjIC8gMiAqICgodCAtPSAyKSAqIHQgKiB0ICsgMikgKyBiO1xufSIsIlwidXNlIHN0cmljdFwiO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xuY29uc3QgZXh0ZW5kc09iamVjdCA9IGZ1bmN0aW9uICgpIHtcbiAgY29uc3QgcmVzdWx0ID0gT2JqZWN0LmFzc2lnbih7fSwgYXJndW1lbnRzLmxlbmd0aCA8PSAwID8gdW5kZWZpbmVkIDogYXJndW1lbnRzWzBdKTtcbiAgZm9yIChsZXQgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBvYmogPSBpIDwgMCB8fCBhcmd1bWVudHMubGVuZ3RoIDw9IGkgPyB1bmRlZmluZWQgOiBhcmd1bWVudHNbaV07XG4gICAgaWYgKG9iaikge1xuICAgICAgT2JqZWN0LmtleXMob2JqKS5mb3JFYWNoKGtleSA9PiB7XG4gICAgICAgIGNvbnN0IHZhbCA9IG9ialtrZXldO1xuICAgICAgICBpZiAodmFsICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICByZXN1bHRba2V5XSA9IHZhbDtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHQ7XG59O1xudmFyIF9kZWZhdWx0ID0gZXhwb3J0cy5kZWZhdWx0ID0gZXh0ZW5kc09iamVjdDsiLCJcInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuaXNQcmVzZXRTaXplID0gaXNQcmVzZXRTaXplO1xuZXhwb3J0cy5pc1ZhbGlkR2FwTnVtYmVyID0gaXNWYWxpZEdhcE51bWJlcjtcbmZ1bmN0aW9uIGlzUHJlc2V0U2l6ZShzaXplKSB7XG4gIHJldHVybiBbJ3NtYWxsJywgJ21pZGRsZScsICdsYXJnZSddLmluY2x1ZGVzKHNpemUpO1xufVxuZnVuY3Rpb24gaXNWYWxpZEdhcE51bWJlcihzaXplKSB7XG4gIGlmICghc2l6ZSkge1xuICAgIC8vIFRoZSBjYXNlIG9mIHNpemUgPSAwIGlzIGRlbGliZXJhdGVseSBleGNsdWRlZCBoZXJlLCBiZWNhdXNlIHRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSBnYXAgYXR0cmlidXRlIGluIENTUyBpcyAwLCBzbyBpZiB0aGUgdXNlciBwYXNzZXMgMCBpbiwgd2UgY2FuIGRpcmVjdGx5IGlnbm9yZSBpdC5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcmV0dXJuIHR5cGVvZiBzaXplID09PSAnbnVtYmVyJyAmJiAhTnVtYmVyLmlzTmFOKHNpemUpO1xufSIsIlwidXNlIHN0cmljdFwiO1xuXCJ1c2UgY2xpZW50XCI7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpLmRlZmF1bHQ7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xudmFyIF9yZWFjdCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcInJlYWN0XCIpKTtcbnZhciBfQ2xvc2VDaXJjbGVGaWxsZWQgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYW50LWRlc2lnbi9pY29ucy9DbG9zZUNpcmNsZUZpbGxlZFwiKSk7XG5jb25zdCBnZXRBbGxvd0NsZWFyID0gYWxsb3dDbGVhciA9PiB7XG4gIGxldCBtZXJnZWRBbGxvd0NsZWFyO1xuICBpZiAodHlwZW9mIGFsbG93Q2xlYXIgPT09ICdvYmplY3QnICYmIChhbGxvd0NsZWFyID09PSBudWxsIHx8IGFsbG93Q2xlYXIgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGFsbG93Q2xlYXIuY2xlYXJJY29uKSkge1xuICAgIG1lcmdlZEFsbG93Q2xlYXIgPSBhbGxvd0NsZWFyO1xuICB9IGVsc2UgaWYgKGFsbG93Q2xlYXIpIHtcbiAgICBtZXJnZWRBbGxvd0NsZWFyID0ge1xuICAgICAgY2xlYXJJY29uOiAvKiNfX1BVUkVfXyovX3JlYWN0LmRlZmF1bHQuY3JlYXRlRWxlbWVudChfQ2xvc2VDaXJjbGVGaWxsZWQuZGVmYXVsdCwgbnVsbClcbiAgICB9O1xuICB9XG4gIHJldHVybiBtZXJnZWRBbGxvd0NsZWFyO1xufTtcbnZhciBfZGVmYXVsdCA9IGV4cG9ydHMuZGVmYXVsdCA9IGdldEFsbG93Q2xlYXI7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmdldFJlbmRlclByb3BWYWx1ZSA9IHZvaWQgMDtcbmNvbnN0IGdldFJlbmRlclByb3BWYWx1ZSA9IHByb3BWYWx1ZSA9PiB7XG4gIGlmICghcHJvcFZhbHVlKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgcmV0dXJuIHR5cGVvZiBwcm9wVmFsdWUgPT09ICdmdW5jdGlvbicgPyBwcm9wVmFsdWUoKSA6IHByb3BWYWx1ZTtcbn07XG5leHBvcnRzLmdldFJlbmRlclByb3BWYWx1ZSA9IGdldFJlbmRlclByb3BWYWx1ZTsiLCJcInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDtcbmV4cG9ydHMuaXNXaW5kb3cgPSBpc1dpbmRvdztcbmZ1bmN0aW9uIGlzV2luZG93KG9iaikge1xuICByZXR1cm4gb2JqICE9PSBudWxsICYmIG9iaiAhPT0gdW5kZWZpbmVkICYmIG9iaiA9PT0gb2JqLndpbmRvdztcbn1cbmNvbnN0IGdldFNjcm9sbCA9IHRhcmdldCA9PiB7XG4gIHZhciBfYSwgX2I7XG4gIGlmICh0eXBlb2Ygd2luZG93ID09PSAndW5kZWZpbmVkJykge1xuICAgIHJldHVybiAwO1xuICB9XG4gIGxldCByZXN1bHQgPSAwO1xuICBpZiAoaXNXaW5kb3codGFyZ2V0KSkge1xuICAgIHJlc3VsdCA9IHRhcmdldC5wYWdlWU9mZnNldDtcbiAgfSBlbHNlIGlmICh0YXJnZXQgaW5zdGFuY2VvZiBEb2N1bWVudCkge1xuICAgIHJlc3VsdCA9IHRhcmdldC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsVG9wO1xuICB9IGVsc2UgaWYgKHRhcmdldCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KSB7XG4gICAgcmVzdWx0ID0gdGFyZ2V0LnNjcm9sbFRvcDtcbiAgfSBlbHNlIGlmICh0YXJnZXQpIHtcbiAgICAvLyBBY2NvcmRpbmcgdG8gdGhlIHR5cGUgaW5mZXJlbmNlLCB0aGUgYHRhcmdldGAgaXMgYG5ldmVyYCB0eXBlLlxuICAgIC8vIFNpbmNlIHdlIGNvbmZpZ3VyZWQgdGhlIGxvb3NlIG1vZGUgdHlwZSBjaGVja2luZywgYW5kIHN1cHBvcnRzIG1vY2tpbmcgdGhlIHRhcmdldCB3aXRoIHN1Y2ggc2hhcGUgYmVsb3c6OlxuICAgIC8vICAgIGB7IGRvY3VtZW50RWxlbWVudDogeyBzY3JvbGxMZWZ0OiAyMDAsIHNjcm9sbFRvcDogNDAwIH0gfWAsXG4gICAgLy8gICAgdGhlIHByb2dyYW0gbWF5IGZhbGxzIGludG8gdGhpcyBicmFuY2guXG4gICAgLy8gQ2hlY2sgdGhlIGNvcnJlc3BvbmRpbmcgdGVzdHMgZm9yIGRldGFpbHMuIERvbid0IHN1cmUgd2hhdCBpcyB0aGUgcmVhbCBzY2VuYXJpbyB0aGlzIGhhcHBlbnMuXG4gICAgLyogYmlvbWUtaWdub3JlIGxpbnQvY29tcGxleGl0eS91c2VMaXRlcmFsS2V5czogdGFyZ2V0IGlzIGEgbmV2ZXIgdHlwZSAqLyAvKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZG90LW5vdGF0aW9uICovXG4gICAgcmVzdWx0ID0gdGFyZ2V0WydzY3JvbGxUb3AnXTtcbiAgfVxuICBpZiAodGFyZ2V0ICYmICFpc1dpbmRvdyh0YXJnZXQpICYmIHR5cGVvZiByZXN1bHQgIT09ICdudW1iZXInKSB7XG4gICAgcmVzdWx0ID0gKF9iID0gKChfYSA9IHRhcmdldC5vd25lckRvY3VtZW50KSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiB0YXJnZXQpLmRvY3VtZW50RWxlbWVudCkgPT09IG51bGwgfHwgX2IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9iLnNjcm9sbFRvcDtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufTtcbnZhciBfZGVmYXVsdCA9IGV4cG9ydHMuZGVmYXVsdCA9IGdldFNjcm9sbDsiLCJcInVzZSBzdHJpY3RcIjtcblwidXNlIGNsaWVudFwiO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKS5kZWZhdWx0O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHVzZUNsb3NhYmxlO1xuZXhwb3J0cy5waWNrQ2xvc2FibGUgPSBwaWNrQ2xvc2FibGU7XG52YXIgX3JlYWN0ID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwicmVhY3RcIikpO1xudmFyIF9DbG9zZU91dGxpbmVkID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGFudC1kZXNpZ24vaWNvbnMvQ2xvc2VPdXRsaW5lZFwiKSk7XG52YXIgX3BpY2tBdHRycyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcInJjLXV0aWwvbGliL3BpY2tBdHRyc1wiKSk7XG5mdW5jdGlvbiBwaWNrQ2xvc2FibGUoY29udGV4dCkge1xuICBpZiAoIWNvbnRleHQpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIHJldHVybiB7XG4gICAgY2xvc2FibGU6IGNvbnRleHQuY2xvc2FibGUsXG4gICAgY2xvc2VJY29uOiBjb250ZXh0LmNsb3NlSWNvblxuICB9O1xufVxuLyoqIENvbnZlcnQgYGNsb3NhYmxlYCBhbmQgYGNsb3NlSWNvbmAgdG8gY29uZmlnIG9iamVjdCAqL1xuZnVuY3Rpb24gdXNlQ2xvc2FibGVDb25maWcoY2xvc2FibGVDb2xsZWN0aW9uKSB7XG4gIGNvbnN0IHtcbiAgICBjbG9zYWJsZSxcbiAgICBjbG9zZUljb25cbiAgfSA9IGNsb3NhYmxlQ29sbGVjdGlvbiB8fCB7fTtcbiAgcmV0dXJuIF9yZWFjdC5kZWZhdWx0LnVzZU1lbW8oKCkgPT4ge1xuICAgIGlmIChcbiAgICAvLyBJZiBgY2xvc2FibGVgLCB3aGF0ZXZlciByZXN0IGJlIHNob3VsZCBiZSB0cnVlXG4gICAgIWNsb3NhYmxlICYmIChjbG9zYWJsZSA9PT0gZmFsc2UgfHwgY2xvc2VJY29uID09PSBmYWxzZSB8fCBjbG9zZUljb24gPT09IG51bGwpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmIChjbG9zYWJsZSA9PT0gdW5kZWZpbmVkICYmIGNsb3NlSWNvbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgbGV0IGNsb3NhYmxlQ29uZmlnID0ge1xuICAgICAgY2xvc2VJY29uOiB0eXBlb2YgY2xvc2VJY29uICE9PSAnYm9vbGVhbicgJiYgY2xvc2VJY29uICE9PSBudWxsID8gY2xvc2VJY29uIDogdW5kZWZpbmVkXG4gICAgfTtcbiAgICBpZiAoY2xvc2FibGUgJiYgdHlwZW9mIGNsb3NhYmxlID09PSAnb2JqZWN0Jykge1xuICAgICAgY2xvc2FibGVDb25maWcgPSBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGNsb3NhYmxlQ29uZmlnKSwgY2xvc2FibGUpO1xuICAgIH1cbiAgICByZXR1cm4gY2xvc2FibGVDb25maWc7XG4gIH0sIFtjbG9zYWJsZSwgY2xvc2VJY29uXSk7XG59XG4vKipcbiAqIEFzc2lnbiBvYmplY3Qgd2l0aG91dCBgdW5kZWZpbmVkYCBmaWVsZC4gV2lsbCBza2lwIGlmIGlzIGBmYWxzZWAuXG4gKiBUaGlzIGhlbHBzIHRvIGhhbmRsZSBib3RoIGNsb3NhYmxlQ29uZmlnIG9yIGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGFzc2lnbldpdGhvdXRVbmRlZmluZWQoKSB7XG4gIGNvbnN0IHRhcmdldCA9IHt9O1xuICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgb2JqTGlzdCA9IG5ldyBBcnJheShfbGVuKSwgX2tleSA9IDA7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICBvYmpMaXN0W19rZXldID0gYXJndW1lbnRzW19rZXldO1xuICB9XG4gIG9iakxpc3QuZm9yRWFjaChvYmogPT4ge1xuICAgIGlmIChvYmopIHtcbiAgICAgIE9iamVjdC5rZXlzKG9iaikuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgICBpZiAob2JqW2tleV0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHRhcmdldFtrZXldID0gb2JqW2tleV07XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiB0YXJnZXQ7XG59XG4vKiogVXNlIHNhbWUgb2JqZWN0IHRvIHN1cHBvcnQgYHVzZU1lbW9gIG9wdGltaXphdGlvbiAqL1xuY29uc3QgRW1wdHlGYWxsYmFja0Nsb3NlQ29sbGVjdGlvbiA9IHt9O1xuZnVuY3Rpb24gdXNlQ2xvc2FibGUocHJvcENsb3NlQ29sbGVjdGlvbiwgY29udGV4dENsb3NlQ29sbGVjdGlvbikge1xuICBsZXQgZmFsbGJhY2tDbG9zZUNvbGxlY3Rpb24gPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1syXSA6IEVtcHR5RmFsbGJhY2tDbG9zZUNvbGxlY3Rpb247XG4gIC8vIEFsaWduIHRoZSBgcHJvcHNgLCBgY29udGV4dGAgYGZhbGxiYWNrYCB0byBjb25maWcgb2JqZWN0IGZpcnN0XG4gIGNvbnN0IHByb3BDbG9zZUNvbmZpZyA9IHVzZUNsb3NhYmxlQ29uZmlnKHByb3BDbG9zZUNvbGxlY3Rpb24pO1xuICBjb25zdCBjb250ZXh0Q2xvc2VDb25maWcgPSB1c2VDbG9zYWJsZUNvbmZpZyhjb250ZXh0Q2xvc2VDb2xsZWN0aW9uKTtcbiAgY29uc3QgY2xvc2VCdG5Jc0Rpc2FibGVkID0gdHlwZW9mIHByb3BDbG9zZUNvbmZpZyAhPT0gJ2Jvb2xlYW4nID8gISEocHJvcENsb3NlQ29uZmlnID09PSBudWxsIHx8IHByb3BDbG9zZUNvbmZpZyA9PT0gdm9pZCAwID8gdm9pZCAwIDogcHJvcENsb3NlQ29uZmlnLmRpc2FibGVkKSA6IGZhbHNlO1xuICBjb25zdCBtZXJnZWRGYWxsYmFja0Nsb3NlQ29sbGVjdGlvbiA9IF9yZWFjdC5kZWZhdWx0LnVzZU1lbW8oKCkgPT4gT2JqZWN0LmFzc2lnbih7XG4gICAgY2xvc2VJY29uOiAvKiNfX1BVUkVfXyovX3JlYWN0LmRlZmF1bHQuY3JlYXRlRWxlbWVudChfQ2xvc2VPdXRsaW5lZC5kZWZhdWx0LCBudWxsKVxuICB9LCBmYWxsYmFja0Nsb3NlQ29sbGVjdGlvbiksIFtmYWxsYmFja0Nsb3NlQ29sbGVjdGlvbl0pO1xuICAvLyBVc2UgZmFsbGJhY2sgbG9naWMgdG8gZmlsbCB0aGUgY29uZmlnXG4gIGNvbnN0IG1lcmdlZENsb3NhYmxlQ29uZmlnID0gX3JlYWN0LmRlZmF1bHQudXNlTWVtbygoKSA9PiB7XG4gICAgLy8gPT09PT09PT09PT09PT09PSBQcm9wcyBGaXJzdCA9PT09PT09PT09PT09PT09XG4gICAgLy8gU2tpcCBpZiBwcm9wIGlzIGRpc2FibGVkXG4gICAgaWYgKHByb3BDbG9zZUNvbmZpZyA9PT0gZmFsc2UpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKHByb3BDbG9zZUNvbmZpZykge1xuICAgICAgcmV0dXJuIGFzc2lnbldpdGhvdXRVbmRlZmluZWQobWVyZ2VkRmFsbGJhY2tDbG9zZUNvbGxlY3Rpb24sIGNvbnRleHRDbG9zZUNvbmZpZywgcHJvcENsb3NlQ29uZmlnKTtcbiAgICB9XG4gICAgLy8gPT09PT09PT09PT09PT09IENvbnRleHQgU2Vjb25kID09PT09PT09PT09PT09XG4gICAgLy8gU2tpcCBpZiBjb250ZXh0IGlzIGRpc2FibGVkXG4gICAgaWYgKGNvbnRleHRDbG9zZUNvbmZpZyA9PT0gZmFsc2UpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKGNvbnRleHRDbG9zZUNvbmZpZykge1xuICAgICAgcmV0dXJuIGFzc2lnbldpdGhvdXRVbmRlZmluZWQobWVyZ2VkRmFsbGJhY2tDbG9zZUNvbGxlY3Rpb24sIGNvbnRleHRDbG9zZUNvbmZpZyk7XG4gICAgfVxuICAgIC8vID09PT09PT09PT09PT0gRmFsbGJhY2sgRGVmYXVsdCA9PT09PT09PT09PT09PVxuICAgIHJldHVybiAhbWVyZ2VkRmFsbGJhY2tDbG9zZUNvbGxlY3Rpb24uY2xvc2FibGUgPyBmYWxzZSA6IG1lcmdlZEZhbGxiYWNrQ2xvc2VDb2xsZWN0aW9uO1xuICB9LCBbcHJvcENsb3NlQ29uZmlnLCBjb250ZXh0Q2xvc2VDb25maWcsIG1lcmdlZEZhbGxiYWNrQ2xvc2VDb2xsZWN0aW9uXSk7XG4gIC8vIENhbGN1bGF0ZSB0aGUgZmluYWwgY2xvc2VJY29uXG4gIHJldHVybiBfcmVhY3QuZGVmYXVsdC51c2VNZW1vKCgpID0+IHtcbiAgICBpZiAobWVyZ2VkQ2xvc2FibGVDb25maWcgPT09IGZhbHNlKSB7XG4gICAgICByZXR1cm4gW2ZhbHNlLCBudWxsLCBjbG9zZUJ0bklzRGlzYWJsZWRdO1xuICAgIH1cbiAgICBjb25zdCB7XG4gICAgICBjbG9zZUljb25SZW5kZXJcbiAgICB9ID0gbWVyZ2VkRmFsbGJhY2tDbG9zZUNvbGxlY3Rpb247XG4gICAgY29uc3Qge1xuICAgICAgY2xvc2VJY29uXG4gICAgfSA9IG1lcmdlZENsb3NhYmxlQ29uZmlnO1xuICAgIGxldCBtZXJnZWRDbG9zZUljb24gPSBjbG9zZUljb247XG4gICAgaWYgKG1lcmdlZENsb3NlSWNvbiAhPT0gbnVsbCAmJiBtZXJnZWRDbG9zZUljb24gIT09IHVuZGVmaW5lZCkge1xuICAgICAgLy8gV3JhcCB0aGUgY2xvc2VJY29uIGlmIG5lZWRlZFxuICAgICAgaWYgKGNsb3NlSWNvblJlbmRlcikge1xuICAgICAgICBtZXJnZWRDbG9zZUljb24gPSBjbG9zZUljb25SZW5kZXIoY2xvc2VJY29uKTtcbiAgICAgIH1cbiAgICAgIC8vIFdyYXAgdGhlIGNsb3NlSWNvbiB3aXRoIGFyaWEgcHJvcHNcbiAgICAgIGNvbnN0IGFyaWFQcm9wcyA9ICgwLCBfcGlja0F0dHJzLmRlZmF1bHQpKG1lcmdlZENsb3NhYmxlQ29uZmlnLCB0cnVlKTtcbiAgICAgIGlmIChPYmplY3Qua2V5cyhhcmlhUHJvcHMpLmxlbmd0aCkge1xuICAgICAgICBtZXJnZWRDbG9zZUljb24gPSAvKiNfX1BVUkVfXyovX3JlYWN0LmRlZmF1bHQuaXNWYWxpZEVsZW1lbnQobWVyZ2VkQ2xvc2VJY29uKSA/ICgvKiNfX1BVUkVfXyovX3JlYWN0LmRlZmF1bHQuY2xvbmVFbGVtZW50KG1lcmdlZENsb3NlSWNvbiwgYXJpYVByb3BzKSkgOiAoLyojX19QVVJFX18qL19yZWFjdC5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIE9iamVjdC5hc3NpZ24oe30sIGFyaWFQcm9wcyksIG1lcmdlZENsb3NlSWNvbikpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gW3RydWUsIG1lcmdlZENsb3NlSWNvbiwgY2xvc2VCdG5Jc0Rpc2FibGVkXTtcbiAgfSwgW21lcmdlZENsb3NhYmxlQ29uZmlnLCBtZXJnZWRGYWxsYmFja0Nsb3NlQ29sbGVjdGlvbl0pO1xufSIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkXCIpLmRlZmF1bHQ7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gdXNlRm9yY2VVcGRhdGU7XG52YXIgUmVhY3QgPSBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChyZXF1aXJlKFwicmVhY3RcIikpO1xuZnVuY3Rpb24gdXNlRm9yY2VVcGRhdGUoKSB7XG4gIGNvbnN0IFssIGZvcmNlVXBkYXRlXSA9IFJlYWN0LnVzZVJlZHVjZXIoeCA9PiB4ICsgMSwgMCk7XG4gIHJldHVybiBmb3JjZVVwZGF0ZTtcbn0iLCJcInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHVzZU11bHRpcGxlU2VsZWN0O1xudmFyIF9yZWFjdCA9IHJlcXVpcmUoXCJyZWFjdFwiKTtcbi8qKlxuICogQHRpdGxlIG11bHRpcGxlU2VsZWN0IGhvb2tzXG4gKiBAZGVzY3JpcHRpb24gbXVsdGlwbGVTZWxlY3QgYnkgaG9sZCBkb3duIHNoaWZ0IGtleVxuICovXG5mdW5jdGlvbiB1c2VNdWx0aXBsZVNlbGVjdChnZXRLZXkpIHtcbiAgY29uc3QgW3ByZXZTZWxlY3RlZEluZGV4LCBzZXRQcmV2U2VsZWN0ZWRJbmRleF0gPSAoMCwgX3JlYWN0LnVzZVN0YXRlKShudWxsKTtcbiAgY29uc3QgbXVsdGlwbGVTZWxlY3QgPSAoMCwgX3JlYWN0LnVzZUNhbGxiYWNrKSgoY3VycmVudFNlbGVjdGVkSW5kZXgsIGRhdGEsIHNlbGVjdGVkS2V5cykgPT4ge1xuICAgIGNvbnN0IGNvbmZpZ1ByZXZTZWxlY3RlZEluZGV4ID0gcHJldlNlbGVjdGVkSW5kZXggIT09IG51bGwgJiYgcHJldlNlbGVjdGVkSW5kZXggIT09IHZvaWQgMCA/IHByZXZTZWxlY3RlZEluZGV4IDogY3VycmVudFNlbGVjdGVkSW5kZXg7XG4gICAgLy8gYWRkL2RlbGV0ZSB0aGUgc2VsZWN0ZWQgcmFuZ2VcbiAgICBjb25zdCBzdGFydEluZGV4ID0gTWF0aC5taW4oY29uZmlnUHJldlNlbGVjdGVkSW5kZXggfHwgMCwgY3VycmVudFNlbGVjdGVkSW5kZXgpO1xuICAgIGNvbnN0IGVuZEluZGV4ID0gTWF0aC5tYXgoY29uZmlnUHJldlNlbGVjdGVkSW5kZXggfHwgMCwgY3VycmVudFNlbGVjdGVkSW5kZXgpO1xuICAgIGNvbnN0IHJhbmdlS2V5cyA9IGRhdGEuc2xpY2Uoc3RhcnRJbmRleCwgZW5kSW5kZXggKyAxKS5tYXAoaXRlbSA9PiBnZXRLZXkoaXRlbSkpO1xuICAgIGNvbnN0IHNob3VsZFNlbGVjdGVkID0gcmFuZ2VLZXlzLnNvbWUocmFuZ2VLZXkgPT4gIXNlbGVjdGVkS2V5cy5oYXMocmFuZ2VLZXkpKTtcbiAgICBjb25zdCBjaGFuZ2VkS2V5cyA9IFtdO1xuICAgIHJhbmdlS2V5cy5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgaWYgKHNob3VsZFNlbGVjdGVkKSB7XG4gICAgICAgIGlmICghc2VsZWN0ZWRLZXlzLmhhcyhpdGVtKSkge1xuICAgICAgICAgIGNoYW5nZWRLZXlzLnB1c2goaXRlbSk7XG4gICAgICAgIH1cbiAgICAgICAgc2VsZWN0ZWRLZXlzLmFkZChpdGVtKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNlbGVjdGVkS2V5cy5kZWxldGUoaXRlbSk7XG4gICAgICAgIGNoYW5nZWRLZXlzLnB1c2goaXRlbSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgc2V0UHJldlNlbGVjdGVkSW5kZXgoc2hvdWxkU2VsZWN0ZWQgPyBlbmRJbmRleCA6IG51bGwpO1xuICAgIHJldHVybiBjaGFuZ2VkS2V5cztcbiAgfSwgW3ByZXZTZWxlY3RlZEluZGV4XSk7XG4gIGNvbnN0IHVwZGF0ZVByZXZTZWxlY3RlZEluZGV4ID0gdmFsID0+IHtcbiAgICBzZXRQcmV2U2VsZWN0ZWRJbmRleCh2YWwpO1xuICB9O1xuICByZXR1cm4gW211bHRpcGxlU2VsZWN0LCB1cGRhdGVQcmV2U2VsZWN0ZWRJbmRleF07XG59IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlV2lsZGNhcmRcIikuZGVmYXVsdDtcbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpLmRlZmF1bHQ7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gdXNlUGF0Y2hFbGVtZW50O1xudmFyIF90b0NvbnN1bWFibGVBcnJheTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL3RvQ29uc3VtYWJsZUFycmF5XCIpKTtcbnZhciBSZWFjdCA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKHJlcXVpcmUoXCJyZWFjdFwiKSk7XG5mdW5jdGlvbiB1c2VQYXRjaEVsZW1lbnQoKSB7XG4gIGNvbnN0IFtlbGVtZW50cywgc2V0RWxlbWVudHNdID0gUmVhY3QudXNlU3RhdGUoW10pO1xuICBjb25zdCBwYXRjaEVsZW1lbnQgPSBSZWFjdC51c2VDYWxsYmFjayhlbGVtZW50ID0+IHtcbiAgICAvLyBhcHBlbmQgYSBuZXcgZWxlbWVudCB0byBlbGVtZW50cyAoYW5kIGNyZWF0ZSBhIG5ldyByZWYpXG4gICAgc2V0RWxlbWVudHMob3JpZ2luRWxlbWVudHMgPT4gW10uY29uY2F0KCgwLCBfdG9Db25zdW1hYmxlQXJyYXkyLmRlZmF1bHQpKG9yaWdpbkVsZW1lbnRzKSwgW2VsZW1lbnRdKSk7XG4gICAgLy8gcmV0dXJuIGEgZnVuY3Rpb24gdGhhdCByZW1vdmVzIHRoZSBuZXcgZWxlbWVudCBvdXQgb2YgZWxlbWVudHMgKGFuZCBjcmVhdGUgYSBuZXcgcmVmKVxuICAgIC8vIGl0IHdvcmtzIGEgbGl0dGxlIGxpa2UgdXNlRWZmZWN0XG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIHNldEVsZW1lbnRzKG9yaWdpbkVsZW1lbnRzID0+IG9yaWdpbkVsZW1lbnRzLmZpbHRlcihlbGUgPT4gZWxlICE9PSBlbGVtZW50KSk7XG4gICAgfTtcbiAgfSwgW10pO1xuICByZXR1cm4gW2VsZW1lbnRzLCBwYXRjaEVsZW1lbnRdO1xufSIsIlwidXNlIHN0cmljdFwiO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gdXNlUHJveHlJbXBlcmF0aXZlSGFuZGxlO1xudmFyIF9yZWFjdCA9IHJlcXVpcmUoXCJyZWFjdFwiKTtcbi8vIFByb3h5IHRoZSBkb20gcmVmIHdpdGggYHsgbmF0aXZlRWxlbWVudCwgb3RoZXJGbiB9YCB0eXBlXG4vLyByZWY6IGh0dHBzOi8vZ2l0aHViLmNvbS9hbnQtZGVzaWduL2FudC1kZXNpZ24vZGlzY3Vzc2lvbnMvNDUyNDJcblxuZnVuY3Rpb24gZmlsbFByb3h5KGVsZW1lbnQsIGhhbmRsZXIpIHtcbiAgZWxlbWVudC5fYW50UHJveHkgPSBlbGVtZW50Ll9hbnRQcm94eSB8fCB7fTtcbiAgT2JqZWN0LmtleXMoaGFuZGxlcikuZm9yRWFjaChrZXkgPT4ge1xuICAgIGlmICghKGtleSBpbiBlbGVtZW50Ll9hbnRQcm94eSkpIHtcbiAgICAgIGNvbnN0IG9yaSA9IGVsZW1lbnRba2V5XTtcbiAgICAgIGVsZW1lbnQuX2FudFByb3h5W2tleV0gPSBvcmk7XG4gICAgICBlbGVtZW50W2tleV0gPSBoYW5kbGVyW2tleV07XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIGVsZW1lbnQ7XG59XG5mdW5jdGlvbiB1c2VQcm94eUltcGVyYXRpdmVIYW5kbGUocmVmLCBpbml0KSB7XG4gIHJldHVybiAoMCwgX3JlYWN0LnVzZUltcGVyYXRpdmVIYW5kbGUpKHJlZiwgKCkgPT4ge1xuICAgIGNvbnN0IHJlZk9iaiA9IGluaXQoKTtcbiAgICBjb25zdCB7XG4gICAgICBuYXRpdmVFbGVtZW50XG4gICAgfSA9IHJlZk9iajtcbiAgICBpZiAodHlwZW9mIFByb3h5ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgcmV0dXJuIG5ldyBQcm94eShuYXRpdmVFbGVtZW50LCB7XG4gICAgICAgIGdldChvYmosIHByb3ApIHtcbiAgICAgICAgICBpZiAocmVmT2JqW3Byb3BdKSB7XG4gICAgICAgICAgICByZXR1cm4gcmVmT2JqW3Byb3BdO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gUmVmbGVjdC5nZXQob2JqLCBwcm9wKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICAgIC8vIEZhbGxiYWNrIG9mIElFXG4gICAgcmV0dXJuIGZpbGxQcm94eShuYXRpdmVFbGVtZW50LCByZWZPYmopO1xuICB9KTtcbn0iLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIikuZGVmYXVsdDtcbnZhciBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlV2lsZGNhcmRcIikuZGVmYXVsdDtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSB1c2VTeW5jU3RhdGU7XG52YXIgUmVhY3QgPSBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChyZXF1aXJlKFwicmVhY3RcIikpO1xudmFyIF91c2VGb3JjZVVwZGF0ZSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vdXNlRm9yY2VVcGRhdGVcIikpO1xuZnVuY3Rpb24gdXNlU3luY1N0YXRlKGluaXRpYWxWYWx1ZSkge1xuICBjb25zdCByZWYgPSBSZWFjdC51c2VSZWYoaW5pdGlhbFZhbHVlKTtcbiAgY29uc3QgZm9yY2VVcGRhdGUgPSAoMCwgX3VzZUZvcmNlVXBkYXRlLmRlZmF1bHQpKCk7XG4gIHJldHVybiBbKCkgPT4gcmVmLmN1cnJlbnQsIG5ld1ZhbHVlID0+IHtcbiAgICByZWYuY3VycmVudCA9IG5ld1ZhbHVlO1xuICAgIC8vIHJlLXJlbmRlclxuICAgIGZvcmNlVXBkYXRlKCk7XG4gIH1dO1xufSIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKS5kZWZhdWx0O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMudXNlWkluZGV4ID0gZXhwb3J0cy5jb250YWluZXJCYXNlWkluZGV4T2Zmc2V0ID0gZXhwb3J0cy5jb25zdW1lckJhc2VaSW5kZXhPZmZzZXQgPSBleHBvcnRzLkNPTlRBSU5FUl9NQVhfT0ZGU0VUID0gdm9pZCAwO1xudmFyIF9yZWFjdCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcInJlYWN0XCIpKTtcbnZhciBfdXNlVG9rZW4gPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuLi8uLi90aGVtZS91c2VUb2tlblwiKSk7XG52YXIgX3dhcm5pbmcgPSByZXF1aXJlKFwiLi4vd2FybmluZ1wiKTtcbnZhciBfemluZGV4Q29udGV4dCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4uL3ppbmRleENvbnRleHRcIikpO1xuLy8gWi1JbmRleCBjb250cm9sIHJhbmdlXG4vLyBDb250YWluZXI6IDEwMDAgKyBvZmZzZXQgMTAwIChtYXggYmFzZSArIDEwICogb2Zmc2V0ID0gMjAwMClcbi8vIFBvcG92ZXI6IG9mZnNldCA1MFxuLy8gTm90aWZpY2F0aW9uOiBDb250YWluZXIgTWF4IHpJbmRleCArIGNvbXBvbmVudE9mZnNldFxuY29uc3QgQ09OVEFJTkVSX09GRlNFVCA9IDEwMDtcbmNvbnN0IENPTlRBSU5FUl9PRkZTRVRfTUFYX0NPVU5UID0gMTA7XG5jb25zdCBDT05UQUlORVJfTUFYX09GRlNFVCA9IGV4cG9ydHMuQ09OVEFJTkVSX01BWF9PRkZTRVQgPSBDT05UQUlORVJfT0ZGU0VUICogQ09OVEFJTkVSX09GRlNFVF9NQVhfQ09VTlQ7XG4vKipcbiAqIFN0YXRpYyBmdW5jdGlvbiB3aWxsIGRlZmF1bHQgYmUgdGhlIGBDT05UQUlORVJfTUFYX09GRlNFVGAuXG4gKiBCdXQgaXQgc3RpbGwgbWF5IGhhdmUgY2hpbGRyZW4gY29tcG9uZW50IGxpa2UgU2VsZWN0LCBEcm9wZG93bi5cbiAqIFNvIHRoZSB3YXJuaW5nIHpJbmRleCBzaG91bGQgZXhjZWVkIHRoZSBgQ09OVEFJTkVSX01BWF9PRkZTRVRgLlxuICovXG5jb25zdCBDT05UQUlORVJfTUFYX09GRlNFVF9XSVRIX0NISUxEUkVOID0gQ09OVEFJTkVSX01BWF9PRkZTRVQgKyBDT05UQUlORVJfT0ZGU0VUO1xuY29uc3QgY29udGFpbmVyQmFzZVpJbmRleE9mZnNldCA9IGV4cG9ydHMuY29udGFpbmVyQmFzZVpJbmRleE9mZnNldCA9IHtcbiAgTW9kYWw6IENPTlRBSU5FUl9PRkZTRVQsXG4gIERyYXdlcjogQ09OVEFJTkVSX09GRlNFVCxcbiAgUG9wb3ZlcjogQ09OVEFJTkVSX09GRlNFVCxcbiAgUG9wY29uZmlybTogQ09OVEFJTkVSX09GRlNFVCxcbiAgVG9vbHRpcDogQ09OVEFJTkVSX09GRlNFVCxcbiAgVG91cjogQ09OVEFJTkVSX09GRlNFVCxcbiAgRmxvYXRCdXR0b246IENPTlRBSU5FUl9PRkZTRVRcbn07XG5jb25zdCBjb25zdW1lckJhc2VaSW5kZXhPZmZzZXQgPSBleHBvcnRzLmNvbnN1bWVyQmFzZVpJbmRleE9mZnNldCA9IHtcbiAgU2VsZWN0TGlrZTogNTAsXG4gIERyb3Bkb3duOiA1MCxcbiAgRGF0ZVBpY2tlcjogNTAsXG4gIE1lbnU6IDUwLFxuICBJbWFnZVByZXZpZXc6IDFcbn07XG5mdW5jdGlvbiBpc0NvbnRhaW5lclR5cGUodHlwZSkge1xuICByZXR1cm4gdHlwZSBpbiBjb250YWluZXJCYXNlWkluZGV4T2Zmc2V0O1xufVxuY29uc3QgdXNlWkluZGV4ID0gKGNvbXBvbmVudFR5cGUsIGN1c3RvbVpJbmRleCkgPT4ge1xuICBjb25zdCBbLCB0b2tlbl0gPSAoMCwgX3VzZVRva2VuLmRlZmF1bHQpKCk7XG4gIGNvbnN0IHBhcmVudFpJbmRleCA9IF9yZWFjdC5kZWZhdWx0LnVzZUNvbnRleHQoX3ppbmRleENvbnRleHQuZGVmYXVsdCk7XG4gIGNvbnN0IGlzQ29udGFpbmVyID0gaXNDb250YWluZXJUeXBlKGNvbXBvbmVudFR5cGUpO1xuICBsZXQgcmVzdWx0O1xuICBpZiAoY3VzdG9tWkluZGV4ICE9PSB1bmRlZmluZWQpIHtcbiAgICByZXN1bHQgPSBbY3VzdG9tWkluZGV4LCBjdXN0b21aSW5kZXhdO1xuICB9IGVsc2Uge1xuICAgIGxldCB6SW5kZXggPSBwYXJlbnRaSW5kZXggIT09IG51bGwgJiYgcGFyZW50WkluZGV4ICE9PSB2b2lkIDAgPyBwYXJlbnRaSW5kZXggOiAwO1xuICAgIGlmIChpc0NvbnRhaW5lcikge1xuICAgICAgekluZGV4ICs9XG4gICAgICAvLyBVc2UgcHJlc2V0IHRva2VuIHpJbmRleCBieSBkZWZhdWx0IGJ1dCBub3Qgc3RhY2sgd2hlbiBoYXMgcGFyZW50IGNvbnRhaW5lclxuICAgICAgKHBhcmVudFpJbmRleCA/IDAgOiB0b2tlbi56SW5kZXhQb3B1cEJhc2UpICtcbiAgICAgIC8vIENvbnRhaW5lciBvZmZzZXRcbiAgICAgIGNvbnRhaW5lckJhc2VaSW5kZXhPZmZzZXRbY29tcG9uZW50VHlwZV07XG4gICAgfSBlbHNlIHtcbiAgICAgIHpJbmRleCArPSBjb25zdW1lckJhc2VaSW5kZXhPZmZzZXRbY29tcG9uZW50VHlwZV07XG4gICAgfVxuICAgIHJlc3VsdCA9IFtwYXJlbnRaSW5kZXggPT09IHVuZGVmaW5lZCA/IGN1c3RvbVpJbmRleCA6IHpJbmRleCwgekluZGV4XTtcbiAgfVxuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgIGNvbnN0IHdhcm5pbmcgPSAoMCwgX3dhcm5pbmcuZGV2VXNlV2FybmluZykoY29tcG9uZW50VHlwZSk7XG4gICAgY29uc3QgbWF4WkluZGV4ID0gdG9rZW4uekluZGV4UG9wdXBCYXNlICsgQ09OVEFJTkVSX01BWF9PRkZTRVRfV0lUSF9DSElMRFJFTjtcbiAgICBjb25zdCBjdXJyZW50WkluZGV4ID0gcmVzdWx0WzBdIHx8IDA7XG4gICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8gd2FybmluZyhjdXN0b21aSW5kZXggIT09IHVuZGVmaW5lZCB8fCBjdXJyZW50WkluZGV4IDw9IG1heFpJbmRleCwgJ3VzYWdlJywgJ2B6SW5kZXhgIGlzIG92ZXIgZGVzaWduIHRva2VuIGB6SW5kZXhQb3B1cEJhc2VgIHRvbyBtdWNoLiBJdCBtYXkgY2F1c2UgdW5leHBlY3RlZCBvdmVycmlkZS4nKSA6IHZvaWQgMDtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufTtcbmV4cG9ydHMudXNlWkluZGV4ID0gdXNlWkluZGV4OyIsIlwidXNlIHN0cmljdFwiO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xuY29uc3QgaXNQcmltaXRpdmUgPSB2YWx1ZSA9PiB0eXBlb2YgdmFsdWUgIT09ICdvYmplY3QnICYmIHR5cGVvZiB2YWx1ZSAhPT0gJ2Z1bmN0aW9uJyB8fCB2YWx1ZSA9PT0gbnVsbDtcbnZhciBfZGVmYXVsdCA9IGV4cG9ydHMuZGVmYXVsdCA9IGlzUHJpbWl0aXZlOyIsIlwidXNlIHN0cmljdFwiO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5nZXRUcmFuc2l0aW9uTmFtZSA9IGV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDtcbnZhciBfY29uZmlnUHJvdmlkZXIgPSByZXF1aXJlKFwiLi4vY29uZmlnLXByb3ZpZGVyXCIpO1xuLy8gPT09PT09PT09PT09PT09PT09IENvbGxhcHNlIE1vdGlvbiA9PT09PT09PT09PT09PT09PT1cbmNvbnN0IGdldENvbGxhcHNlZEhlaWdodCA9ICgpID0+ICh7XG4gIGhlaWdodDogMCxcbiAgb3BhY2l0eTogMFxufSk7XG5jb25zdCBnZXRSZWFsSGVpZ2h0ID0gbm9kZSA9PiB7XG4gIGNvbnN0IHtcbiAgICBzY3JvbGxIZWlnaHRcbiAgfSA9IG5vZGU7XG4gIHJldHVybiB7XG4gICAgaGVpZ2h0OiBzY3JvbGxIZWlnaHQsXG4gICAgb3BhY2l0eTogMVxuICB9O1xufTtcbmNvbnN0IGdldEN1cnJlbnRIZWlnaHQgPSBub2RlID0+ICh7XG4gIGhlaWdodDogbm9kZSA/IG5vZGUub2Zmc2V0SGVpZ2h0IDogMFxufSk7XG5jb25zdCBza2lwT3BhY2l0eVRyYW5zaXRpb24gPSAoXywgZXZlbnQpID0+IChldmVudCA9PT0gbnVsbCB8fCBldmVudCA9PT0gdm9pZCAwID8gdm9pZCAwIDogZXZlbnQuZGVhZGxpbmUpID09PSB0cnVlIHx8IGV2ZW50LnByb3BlcnR5TmFtZSA9PT0gJ2hlaWdodCc7XG5jb25zdCBpbml0Q29sbGFwc2VNb3Rpb24gPSBmdW5jdGlvbiAoKSB7XG4gIGxldCByb290Q2xzID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiBfY29uZmlnUHJvdmlkZXIuZGVmYXVsdFByZWZpeENscztcbiAgcmV0dXJuIHtcbiAgICBtb3Rpb25OYW1lOiBgJHtyb290Q2xzfS1tb3Rpb24tY29sbGFwc2VgLFxuICAgIG9uQXBwZWFyU3RhcnQ6IGdldENvbGxhcHNlZEhlaWdodCxcbiAgICBvbkVudGVyU3RhcnQ6IGdldENvbGxhcHNlZEhlaWdodCxcbiAgICBvbkFwcGVhckFjdGl2ZTogZ2V0UmVhbEhlaWdodCxcbiAgICBvbkVudGVyQWN0aXZlOiBnZXRSZWFsSGVpZ2h0LFxuICAgIG9uTGVhdmVTdGFydDogZ2V0Q3VycmVudEhlaWdodCxcbiAgICBvbkxlYXZlQWN0aXZlOiBnZXRDb2xsYXBzZWRIZWlnaHQsXG4gICAgb25BcHBlYXJFbmQ6IHNraXBPcGFjaXR5VHJhbnNpdGlvbixcbiAgICBvbkVudGVyRW5kOiBza2lwT3BhY2l0eVRyYW5zaXRpb24sXG4gICAgb25MZWF2ZUVuZDogc2tpcE9wYWNpdHlUcmFuc2l0aW9uLFxuICAgIG1vdGlvbkRlYWRsaW5lOiA1MDBcbiAgfTtcbn07XG5jb25zdCBfU2VsZWN0UGxhY2VtZW50cyA9IFsnYm90dG9tTGVmdCcsICdib3R0b21SaWdodCcsICd0b3BMZWZ0JywgJ3RvcFJpZ2h0J107XG5jb25zdCBnZXRUcmFuc2l0aW9uTmFtZSA9IChyb290UHJlZml4Q2xzLCBtb3Rpb24sIHRyYW5zaXRpb25OYW1lKSA9PiB7XG4gIGlmICh0cmFuc2l0aW9uTmFtZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIHRyYW5zaXRpb25OYW1lO1xuICB9XG4gIHJldHVybiBgJHtyb290UHJlZml4Q2xzfS0ke21vdGlvbn1gO1xufTtcbmV4cG9ydHMuZ2V0VHJhbnNpdGlvbk5hbWUgPSBnZXRUcmFuc2l0aW9uTmFtZTtcbnZhciBfZGVmYXVsdCA9IGV4cG9ydHMuZGVmYXVsdCA9IGluaXRDb2xsYXBzZU1vdGlvbjsiLCJcInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IGdldFBsYWNlbWVudHM7XG5leHBvcnRzLmdldE92ZXJmbG93T3B0aW9ucyA9IGdldE92ZXJmbG93T3B0aW9ucztcbnZhciBfcGxhY2VtZW50QXJyb3cgPSByZXF1aXJlKFwiLi4vc3R5bGUvcGxhY2VtZW50QXJyb3dcIik7XG5mdW5jdGlvbiBnZXRPdmVyZmxvd09wdGlvbnMocGxhY2VtZW50LCBhcnJvd09mZnNldCwgYXJyb3dXaWR0aCwgYXV0b0FkanVzdE92ZXJmbG93KSB7XG4gIGlmIChhdXRvQWRqdXN0T3ZlcmZsb3cgPT09IGZhbHNlKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGFkanVzdFg6IGZhbHNlLFxuICAgICAgYWRqdXN0WTogZmFsc2VcbiAgICB9O1xuICB9XG4gIGNvbnN0IG92ZXJmbG93ID0gYXV0b0FkanVzdE92ZXJmbG93ICYmIHR5cGVvZiBhdXRvQWRqdXN0T3ZlcmZsb3cgPT09ICdvYmplY3QnID8gYXV0b0FkanVzdE92ZXJmbG93IDoge307XG4gIGNvbnN0IGJhc2VPdmVyZmxvdyA9IHt9O1xuICBzd2l0Y2ggKHBsYWNlbWVudCkge1xuICAgIGNhc2UgJ3RvcCc6XG4gICAgY2FzZSAnYm90dG9tJzpcbiAgICAgIGJhc2VPdmVyZmxvdy5zaGlmdFggPSBhcnJvd09mZnNldC5hcnJvd09mZnNldEhvcml6b250YWwgKiAyICsgYXJyb3dXaWR0aDtcbiAgICAgIGJhc2VPdmVyZmxvdy5zaGlmdFkgPSB0cnVlO1xuICAgICAgYmFzZU92ZXJmbG93LmFkanVzdFkgPSB0cnVlO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnbGVmdCc6XG4gICAgY2FzZSAncmlnaHQnOlxuICAgICAgYmFzZU92ZXJmbG93LnNoaWZ0WSA9IGFycm93T2Zmc2V0LmFycm93T2Zmc2V0VmVydGljYWwgKiAyICsgYXJyb3dXaWR0aDtcbiAgICAgIGJhc2VPdmVyZmxvdy5zaGlmdFggPSB0cnVlO1xuICAgICAgYmFzZU92ZXJmbG93LmFkanVzdFggPSB0cnVlO1xuICAgICAgYnJlYWs7XG4gIH1cbiAgY29uc3QgbWVyZ2VkT3ZlcmZsb3cgPSBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGJhc2VPdmVyZmxvdyksIG92ZXJmbG93KTtcbiAgLy8gU3VwcG9ydCBhdXRvIHNoaWZ0XG4gIGlmICghbWVyZ2VkT3ZlcmZsb3cuc2hpZnRYKSB7XG4gICAgbWVyZ2VkT3ZlcmZsb3cuYWRqdXN0WCA9IHRydWU7XG4gIH1cbiAgaWYgKCFtZXJnZWRPdmVyZmxvdy5zaGlmdFkpIHtcbiAgICBtZXJnZWRPdmVyZmxvdy5hZGp1c3RZID0gdHJ1ZTtcbiAgfVxuICByZXR1cm4gbWVyZ2VkT3ZlcmZsb3c7XG59XG5jb25zdCBQbGFjZW1lbnRBbGlnbk1hcCA9IHtcbiAgbGVmdDoge1xuICAgIHBvaW50czogWydjcicsICdjbCddXG4gIH0sXG4gIHJpZ2h0OiB7XG4gICAgcG9pbnRzOiBbJ2NsJywgJ2NyJ11cbiAgfSxcbiAgdG9wOiB7XG4gICAgcG9pbnRzOiBbJ2JjJywgJ3RjJ11cbiAgfSxcbiAgYm90dG9tOiB7XG4gICAgcG9pbnRzOiBbJ3RjJywgJ2JjJ11cbiAgfSxcbiAgdG9wTGVmdDoge1xuICAgIHBvaW50czogWydibCcsICd0bCddXG4gIH0sXG4gIGxlZnRUb3A6IHtcbiAgICBwb2ludHM6IFsndHInLCAndGwnXVxuICB9LFxuICB0b3BSaWdodDoge1xuICAgIHBvaW50czogWydicicsICd0ciddXG4gIH0sXG4gIHJpZ2h0VG9wOiB7XG4gICAgcG9pbnRzOiBbJ3RsJywgJ3RyJ11cbiAgfSxcbiAgYm90dG9tUmlnaHQ6IHtcbiAgICBwb2ludHM6IFsndHInLCAnYnInXVxuICB9LFxuICByaWdodEJvdHRvbToge1xuICAgIHBvaW50czogWydibCcsICdiciddXG4gIH0sXG4gIGJvdHRvbUxlZnQ6IHtcbiAgICBwb2ludHM6IFsndGwnLCAnYmwnXVxuICB9LFxuICBsZWZ0Qm90dG9tOiB7XG4gICAgcG9pbnRzOiBbJ2JyJywgJ2JsJ11cbiAgfVxufTtcbmNvbnN0IEFycm93Q2VudGVyUGxhY2VtZW50QWxpZ25NYXAgPSB7XG4gIHRvcExlZnQ6IHtcbiAgICBwb2ludHM6IFsnYmwnLCAndGMnXVxuICB9LFxuICBsZWZ0VG9wOiB7XG4gICAgcG9pbnRzOiBbJ3RyJywgJ2NsJ11cbiAgfSxcbiAgdG9wUmlnaHQ6IHtcbiAgICBwb2ludHM6IFsnYnInLCAndGMnXVxuICB9LFxuICByaWdodFRvcDoge1xuICAgIHBvaW50czogWyd0bCcsICdjciddXG4gIH0sXG4gIGJvdHRvbVJpZ2h0OiB7XG4gICAgcG9pbnRzOiBbJ3RyJywgJ2JjJ11cbiAgfSxcbiAgcmlnaHRCb3R0b206IHtcbiAgICBwb2ludHM6IFsnYmwnLCAnY3InXVxuICB9LFxuICBib3R0b21MZWZ0OiB7XG4gICAgcG9pbnRzOiBbJ3RsJywgJ2JjJ11cbiAgfSxcbiAgbGVmdEJvdHRvbToge1xuICAgIHBvaW50czogWydicicsICdjbCddXG4gIH1cbn07XG5jb25zdCBEaXNhYmxlQXV0b0Fycm93TGlzdCA9IG5ldyBTZXQoWyd0b3BMZWZ0JywgJ3RvcFJpZ2h0JywgJ2JvdHRvbUxlZnQnLCAnYm90dG9tUmlnaHQnLCAnbGVmdFRvcCcsICdsZWZ0Qm90dG9tJywgJ3JpZ2h0VG9wJywgJ3JpZ2h0Qm90dG9tJ10pO1xuZnVuY3Rpb24gZ2V0UGxhY2VtZW50cyhjb25maWcpIHtcbiAgY29uc3Qge1xuICAgIGFycm93V2lkdGgsXG4gICAgYXV0b0FkanVzdE92ZXJmbG93LFxuICAgIGFycm93UG9pbnRBdENlbnRlcixcbiAgICBvZmZzZXQsXG4gICAgYm9yZGVyUmFkaXVzLFxuICAgIHZpc2libGVGaXJzdFxuICB9ID0gY29uZmlnO1xuICBjb25zdCBoYWxmQXJyb3dXaWR0aCA9IGFycm93V2lkdGggLyAyO1xuICBjb25zdCBwbGFjZW1lbnRNYXAgPSB7fTtcbiAgT2JqZWN0LmtleXMoUGxhY2VtZW50QWxpZ25NYXApLmZvckVhY2goa2V5ID0+IHtcbiAgICBjb25zdCB0ZW1wbGF0ZSA9IGFycm93UG9pbnRBdENlbnRlciAmJiBBcnJvd0NlbnRlclBsYWNlbWVudEFsaWduTWFwW2tleV0gfHwgUGxhY2VtZW50QWxpZ25NYXBba2V5XTtcbiAgICBjb25zdCBwbGFjZW1lbnRJbmZvID0gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCB0ZW1wbGF0ZSksIHtcbiAgICAgIG9mZnNldDogWzAsIDBdLFxuICAgICAgZHluYW1pY0luc2V0OiB0cnVlXG4gICAgfSk7XG4gICAgcGxhY2VtZW50TWFwW2tleV0gPSBwbGFjZW1lbnRJbmZvO1xuICAgIC8vIERpc2FibGUgYXV0b0Fycm93IHNpbmNlIGRlc2lnbiBpcyBmaXhlZCBwb3NpdGlvblxuICAgIGlmIChEaXNhYmxlQXV0b0Fycm93TGlzdC5oYXMoa2V5KSkge1xuICAgICAgcGxhY2VtZW50SW5mby5hdXRvQXJyb3cgPSBmYWxzZTtcbiAgICB9XG4gICAgLy8gU3RhdGljIG9mZnNldFxuICAgIHN3aXRjaCAoa2V5KSB7XG4gICAgICBjYXNlICd0b3AnOlxuICAgICAgY2FzZSAndG9wTGVmdCc6XG4gICAgICBjYXNlICd0b3BSaWdodCc6XG4gICAgICAgIHBsYWNlbWVudEluZm8ub2Zmc2V0WzFdID0gLWhhbGZBcnJvd1dpZHRoIC0gb2Zmc2V0O1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2JvdHRvbSc6XG4gICAgICBjYXNlICdib3R0b21MZWZ0JzpcbiAgICAgIGNhc2UgJ2JvdHRvbVJpZ2h0JzpcbiAgICAgICAgcGxhY2VtZW50SW5mby5vZmZzZXRbMV0gPSBoYWxmQXJyb3dXaWR0aCArIG9mZnNldDtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdsZWZ0JzpcbiAgICAgIGNhc2UgJ2xlZnRUb3AnOlxuICAgICAgY2FzZSAnbGVmdEJvdHRvbSc6XG4gICAgICAgIHBsYWNlbWVudEluZm8ub2Zmc2V0WzBdID0gLWhhbGZBcnJvd1dpZHRoIC0gb2Zmc2V0O1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3JpZ2h0JzpcbiAgICAgIGNhc2UgJ3JpZ2h0VG9wJzpcbiAgICAgIGNhc2UgJ3JpZ2h0Qm90dG9tJzpcbiAgICAgICAgcGxhY2VtZW50SW5mby5vZmZzZXRbMF0gPSBoYWxmQXJyb3dXaWR0aCArIG9mZnNldDtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICAgIC8vIER5bmFtaWMgb2Zmc2V0XG4gICAgY29uc3QgYXJyb3dPZmZzZXQgPSAoMCwgX3BsYWNlbWVudEFycm93LmdldEFycm93T2Zmc2V0VG9rZW4pKHtcbiAgICAgIGNvbnRlbnRSYWRpdXM6IGJvcmRlclJhZGl1cyxcbiAgICAgIGxpbWl0VmVydGljYWxSYWRpdXM6IHRydWVcbiAgICB9KTtcbiAgICBpZiAoYXJyb3dQb2ludEF0Q2VudGVyKSB7XG4gICAgICBzd2l0Y2ggKGtleSkge1xuICAgICAgICBjYXNlICd0b3BMZWZ0JzpcbiAgICAgICAgY2FzZSAnYm90dG9tTGVmdCc6XG4gICAgICAgICAgcGxhY2VtZW50SW5mby5vZmZzZXRbMF0gPSAtYXJyb3dPZmZzZXQuYXJyb3dPZmZzZXRIb3Jpem9udGFsIC0gaGFsZkFycm93V2lkdGg7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ3RvcFJpZ2h0JzpcbiAgICAgICAgY2FzZSAnYm90dG9tUmlnaHQnOlxuICAgICAgICAgIHBsYWNlbWVudEluZm8ub2Zmc2V0WzBdID0gYXJyb3dPZmZzZXQuYXJyb3dPZmZzZXRIb3Jpem9udGFsICsgaGFsZkFycm93V2lkdGg7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ2xlZnRUb3AnOlxuICAgICAgICBjYXNlICdyaWdodFRvcCc6XG4gICAgICAgICAgcGxhY2VtZW50SW5mby5vZmZzZXRbMV0gPSAtYXJyb3dPZmZzZXQuYXJyb3dPZmZzZXRIb3Jpem9udGFsICogMiArIGhhbGZBcnJvd1dpZHRoO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdsZWZ0Qm90dG9tJzpcbiAgICAgICAgY2FzZSAncmlnaHRCb3R0b20nOlxuICAgICAgICAgIHBsYWNlbWVudEluZm8ub2Zmc2V0WzFdID0gYXJyb3dPZmZzZXQuYXJyb3dPZmZzZXRIb3Jpem9udGFsICogMiAtIGhhbGZBcnJvd1dpZHRoO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyBPdmVyZmxvd1xuICAgIHBsYWNlbWVudEluZm8ub3ZlcmZsb3cgPSBnZXRPdmVyZmxvd09wdGlvbnMoa2V5LCBhcnJvd09mZnNldCwgYXJyb3dXaWR0aCwgYXV0b0FkanVzdE92ZXJmbG93KTtcbiAgICAvLyBWaXNpYmxlRmlyc3RcbiAgICBpZiAodmlzaWJsZUZpcnN0KSB7XG4gICAgICBwbGFjZW1lbnRJbmZvLmh0bWxSZWdpb24gPSAndmlzaWJsZUZpcnN0JztcbiAgICB9XG4gIH0pO1xuICByZXR1cm4gcGxhY2VtZW50TWFwO1xufSIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKS5kZWZhdWx0O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuY2xvbmVFbGVtZW50ID0gY2xvbmVFbGVtZW50O1xuZXhwb3J0cy5pc0ZyYWdtZW50ID0gaXNGcmFnbWVudDtcbmV4cG9ydHMucmVwbGFjZUVsZW1lbnQgPSB2b2lkIDA7XG52YXIgX3JlYWN0ID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwicmVhY3RcIikpO1xuZnVuY3Rpb24gaXNGcmFnbWVudChjaGlsZCkge1xuICByZXR1cm4gY2hpbGQgJiYgLyojX19QVVJFX18qL19yZWFjdC5kZWZhdWx0LmlzVmFsaWRFbGVtZW50KGNoaWxkKSAmJiBjaGlsZC50eXBlID09PSBfcmVhY3QuZGVmYXVsdC5GcmFnbWVudDtcbn1cbmNvbnN0IHJlcGxhY2VFbGVtZW50ID0gKGVsZW1lbnQsIHJlcGxhY2VtZW50LCBwcm9wcykgPT4ge1xuICBpZiAoISAvKiNfX1BVUkVfXyovX3JlYWN0LmRlZmF1bHQuaXNWYWxpZEVsZW1lbnQoZWxlbWVudCkpIHtcbiAgICByZXR1cm4gcmVwbGFjZW1lbnQ7XG4gIH1cbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9fcmVhY3QuZGVmYXVsdC5jbG9uZUVsZW1lbnQoZWxlbWVudCwgdHlwZW9mIHByb3BzID09PSAnZnVuY3Rpb24nID8gcHJvcHMoZWxlbWVudC5wcm9wcyB8fCB7fSkgOiBwcm9wcyk7XG59O1xuZXhwb3J0cy5yZXBsYWNlRWxlbWVudCA9IHJlcGxhY2VFbGVtZW50O1xuZnVuY3Rpb24gY2xvbmVFbGVtZW50KGVsZW1lbnQsIHByb3BzKSB7XG4gIHJldHVybiByZXBsYWNlRWxlbWVudChlbGVtZW50LCBlbGVtZW50LCBwcm9wcyk7XG59IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpLmRlZmF1bHQ7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gdXNlUmVzcG9uc2l2ZU9ic2VydmVyO1xuZXhwb3J0cy5yZXNwb25zaXZlQXJyYXkgPSBleHBvcnRzLm1hdGNoU2NyZWVuID0gdm9pZCAwO1xudmFyIF9yZWFjdCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcInJlYWN0XCIpKTtcbnZhciBfaW50ZXJuYWwgPSByZXF1aXJlKFwiLi4vdGhlbWUvaW50ZXJuYWxcIik7XG5jb25zdCByZXNwb25zaXZlQXJyYXkgPSBleHBvcnRzLnJlc3BvbnNpdmVBcnJheSA9IFsneHhsJywgJ3hsJywgJ2xnJywgJ21kJywgJ3NtJywgJ3hzJ107XG5jb25zdCBnZXRSZXNwb25zaXZlTWFwID0gdG9rZW4gPT4gKHtcbiAgeHM6IGAobWF4LXdpZHRoOiAke3Rva2VuLnNjcmVlblhTTWF4fXB4KWAsXG4gIHNtOiBgKG1pbi13aWR0aDogJHt0b2tlbi5zY3JlZW5TTX1weClgLFxuICBtZDogYChtaW4td2lkdGg6ICR7dG9rZW4uc2NyZWVuTUR9cHgpYCxcbiAgbGc6IGAobWluLXdpZHRoOiAke3Rva2VuLnNjcmVlbkxHfXB4KWAsXG4gIHhsOiBgKG1pbi13aWR0aDogJHt0b2tlbi5zY3JlZW5YTH1weClgLFxuICB4eGw6IGAobWluLXdpZHRoOiAke3Rva2VuLnNjcmVlblhYTH1weClgXG59KTtcbi8qKlxuICogRW5zdXJlcyB0aGF0IHRoZSBicmVha3BvaW50cyB0b2tlbiBhcmUgdmFsaWQsIGluIGdvb2Qgb3JkZXJcbiAqIEZvciBlYWNoIGJyZWFrcG9pbnQgOiBzY3JlZW5NaW4gPD0gc2NyZWVuIDw9IHNjcmVlbk1heCBhbmQgc2NyZWVuTWF4IDw9IG5leHRTY3JlZW5NaW5cbiAqL1xuY29uc3QgdmFsaWRhdGVCcmVha3BvaW50cyA9IHRva2VuID0+IHtcbiAgY29uc3QgaW5kZXhhYmxlVG9rZW4gPSB0b2tlbjtcbiAgY29uc3QgcmV2QnJlYWtwb2ludHMgPSBbXS5jb25jYXQocmVzcG9uc2l2ZUFycmF5KS5yZXZlcnNlKCk7XG4gIHJldkJyZWFrcG9pbnRzLmZvckVhY2goKGJyZWFrcG9pbnQsIGkpID0+IHtcbiAgICBjb25zdCBicmVha3BvaW50VXBwZXIgPSBicmVha3BvaW50LnRvVXBwZXJDYXNlKCk7XG4gICAgY29uc3Qgc2NyZWVuTWluID0gYHNjcmVlbiR7YnJlYWtwb2ludFVwcGVyfU1pbmA7XG4gICAgY29uc3Qgc2NyZWVuID0gYHNjcmVlbiR7YnJlYWtwb2ludFVwcGVyfWA7XG4gICAgaWYgKCEoaW5kZXhhYmxlVG9rZW5bc2NyZWVuTWluXSA8PSBpbmRleGFibGVUb2tlbltzY3JlZW5dKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGAke3NjcmVlbk1pbn08PSR7c2NyZWVufSBmYWlscyA6ICEoJHtpbmRleGFibGVUb2tlbltzY3JlZW5NaW5dfTw9JHtpbmRleGFibGVUb2tlbltzY3JlZW5dfSlgKTtcbiAgICB9XG4gICAgaWYgKGkgPCByZXZCcmVha3BvaW50cy5sZW5ndGggLSAxKSB7XG4gICAgICBjb25zdCBzY3JlZW5NYXggPSBgc2NyZWVuJHticmVha3BvaW50VXBwZXJ9TWF4YDtcbiAgICAgIGlmICghKGluZGV4YWJsZVRva2VuW3NjcmVlbl0gPD0gaW5kZXhhYmxlVG9rZW5bc2NyZWVuTWF4XSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke3NjcmVlbn08PSR7c2NyZWVuTWF4fSBmYWlscyA6ICEoJHtpbmRleGFibGVUb2tlbltzY3JlZW5dfTw9JHtpbmRleGFibGVUb2tlbltzY3JlZW5NYXhdfSlgKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IG5leHRCcmVha3BvaW50VXBwZXJNaW4gPSByZXZCcmVha3BvaW50c1tpICsgMV0udG9VcHBlckNhc2UoKTtcbiAgICAgIGNvbnN0IG5leHRTY3JlZW5NaW4gPSBgc2NyZWVuJHtuZXh0QnJlYWtwb2ludFVwcGVyTWlufU1pbmA7XG4gICAgICBpZiAoIShpbmRleGFibGVUb2tlbltzY3JlZW5NYXhdIDw9IGluZGV4YWJsZVRva2VuW25leHRTY3JlZW5NaW5dKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7c2NyZWVuTWF4fTw9JHtuZXh0U2NyZWVuTWlufSBmYWlscyA6ICEoJHtpbmRleGFibGVUb2tlbltzY3JlZW5NYXhdfTw9JHtpbmRleGFibGVUb2tlbltuZXh0U2NyZWVuTWluXX0pYCk7XG4gICAgICB9XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIHRva2VuO1xufTtcbmZ1bmN0aW9uIHVzZVJlc3BvbnNpdmVPYnNlcnZlcigpIHtcbiAgY29uc3QgWywgdG9rZW5dID0gKDAsIF9pbnRlcm5hbC51c2VUb2tlbikoKTtcbiAgY29uc3QgcmVzcG9uc2l2ZU1hcCA9IGdldFJlc3BvbnNpdmVNYXAodmFsaWRhdGVCcmVha3BvaW50cyh0b2tlbikpO1xuICAvLyBUbyBhdm9pZCByZXBlYXQgY3JlYXRlIGluc3RhbmNlLCB3ZSBhZGQgYHVzZU1lbW9gIGhlcmUuXG4gIHJldHVybiBfcmVhY3QuZGVmYXVsdC51c2VNZW1vKCgpID0+IHtcbiAgICBjb25zdCBzdWJzY3JpYmVycyA9IG5ldyBNYXAoKTtcbiAgICBsZXQgc3ViVWlkID0gLTE7XG4gICAgbGV0IHNjcmVlbnMgPSB7fTtcbiAgICByZXR1cm4ge1xuICAgICAgbWF0Y2hIYW5kbGVyczoge30sXG4gICAgICBkaXNwYXRjaChwb2ludE1hcCkge1xuICAgICAgICBzY3JlZW5zID0gcG9pbnRNYXA7XG4gICAgICAgIHN1YnNjcmliZXJzLmZvckVhY2goZnVuYyA9PiBmdW5jKHNjcmVlbnMpKTtcbiAgICAgICAgcmV0dXJuIHN1YnNjcmliZXJzLnNpemUgPj0gMTtcbiAgICAgIH0sXG4gICAgICBzdWJzY3JpYmUoZnVuYykge1xuICAgICAgICBpZiAoIXN1YnNjcmliZXJzLnNpemUpIHtcbiAgICAgICAgICB0aGlzLnJlZ2lzdGVyKCk7XG4gICAgICAgIH1cbiAgICAgICAgc3ViVWlkICs9IDE7XG4gICAgICAgIHN1YnNjcmliZXJzLnNldChzdWJVaWQsIGZ1bmMpO1xuICAgICAgICBmdW5jKHNjcmVlbnMpO1xuICAgICAgICByZXR1cm4gc3ViVWlkO1xuICAgICAgfSxcbiAgICAgIHVuc3Vic2NyaWJlKHBhcmFtVG9rZW4pIHtcbiAgICAgICAgc3Vic2NyaWJlcnMuZGVsZXRlKHBhcmFtVG9rZW4pO1xuICAgICAgICBpZiAoIXN1YnNjcmliZXJzLnNpemUpIHtcbiAgICAgICAgICB0aGlzLnVucmVnaXN0ZXIoKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHVucmVnaXN0ZXIoKSB7XG4gICAgICAgIE9iamVjdC5rZXlzKHJlc3BvbnNpdmVNYXApLmZvckVhY2goc2NyZWVuID0+IHtcbiAgICAgICAgICBjb25zdCBtYXRjaE1lZGlhUXVlcnkgPSByZXNwb25zaXZlTWFwW3NjcmVlbl07XG4gICAgICAgICAgY29uc3QgaGFuZGxlciA9IHRoaXMubWF0Y2hIYW5kbGVyc1ttYXRjaE1lZGlhUXVlcnldO1xuICAgICAgICAgIGhhbmRsZXIgPT09IG51bGwgfHwgaGFuZGxlciA9PT0gdm9pZCAwID8gdm9pZCAwIDogaGFuZGxlci5tcWwucmVtb3ZlTGlzdGVuZXIoaGFuZGxlciA9PT0gbnVsbCB8fCBoYW5kbGVyID09PSB2b2lkIDAgPyB2b2lkIDAgOiBoYW5kbGVyLmxpc3RlbmVyKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHN1YnNjcmliZXJzLmNsZWFyKCk7XG4gICAgICB9LFxuICAgICAgcmVnaXN0ZXIoKSB7XG4gICAgICAgIE9iamVjdC5rZXlzKHJlc3BvbnNpdmVNYXApLmZvckVhY2goc2NyZWVuID0+IHtcbiAgICAgICAgICBjb25zdCBtYXRjaE1lZGlhUXVlcnkgPSByZXNwb25zaXZlTWFwW3NjcmVlbl07XG4gICAgICAgICAgY29uc3QgbGlzdGVuZXIgPSBfcmVmID0+IHtcbiAgICAgICAgICAgIGxldCB7XG4gICAgICAgICAgICAgIG1hdGNoZXNcbiAgICAgICAgICAgIH0gPSBfcmVmO1xuICAgICAgICAgICAgdGhpcy5kaXNwYXRjaChPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHNjcmVlbnMpLCB7XG4gICAgICAgICAgICAgIFtzY3JlZW5dOiBtYXRjaGVzXG4gICAgICAgICAgICB9KSk7XG4gICAgICAgICAgfTtcbiAgICAgICAgICBjb25zdCBtcWwgPSB3aW5kb3cubWF0Y2hNZWRpYShtYXRjaE1lZGlhUXVlcnkpO1xuICAgICAgICAgIG1xbC5hZGRMaXN0ZW5lcihsaXN0ZW5lcik7XG4gICAgICAgICAgdGhpcy5tYXRjaEhhbmRsZXJzW21hdGNoTWVkaWFRdWVyeV0gPSB7XG4gICAgICAgICAgICBtcWwsXG4gICAgICAgICAgICBsaXN0ZW5lclxuICAgICAgICAgIH07XG4gICAgICAgICAgbGlzdGVuZXIobXFsKTtcbiAgICAgICAgfSk7XG4gICAgICB9LFxuICAgICAgcmVzcG9uc2l2ZU1hcFxuICAgIH07XG4gIH0sIFt0b2tlbl0pO1xufVxuY29uc3QgbWF0Y2hTY3JlZW4gPSAoc2NyZWVucywgc2NyZWVuU2l6ZXMpID0+IHtcbiAgaWYgKHNjcmVlblNpemVzICYmIHR5cGVvZiBzY3JlZW5TaXplcyA9PT0gJ29iamVjdCcpIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJlc3BvbnNpdmVBcnJheS5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgYnJlYWtwb2ludCA9IHJlc3BvbnNpdmVBcnJheVtpXTtcbiAgICAgIGlmIChzY3JlZW5zW2JyZWFrcG9pbnRdICYmIHNjcmVlblNpemVzW2JyZWFrcG9pbnRdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIHNjcmVlblNpemVzW2JyZWFrcG9pbnRdO1xuICAgICAgfVxuICAgIH1cbiAgfVxufTtcbmV4cG9ydHMubWF0Y2hTY3JlZW4gPSBtYXRjaFNjcmVlbjsiLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVXaWxkY2FyZFwiKS5kZWZhdWx0O1xudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIikuZGVmYXVsdDtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSBzY3JvbGxUbztcbnZhciBfcmFmID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwicmMtdXRpbC9saWIvcmFmXCIpKTtcbnZhciBfZWFzaW5ncyA9IHJlcXVpcmUoXCIuL2Vhc2luZ3NcIik7XG52YXIgX2dldFNjcm9sbCA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKHJlcXVpcmUoXCIuL2dldFNjcm9sbFwiKSk7XG5mdW5jdGlvbiBzY3JvbGxUbyh5KSB7XG4gIGxldCBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiB7fTtcbiAgY29uc3Qge1xuICAgIGdldENvbnRhaW5lciA9ICgpID0+IHdpbmRvdyxcbiAgICBjYWxsYmFjayxcbiAgICBkdXJhdGlvbiA9IDQ1MFxuICB9ID0gb3B0aW9ucztcbiAgY29uc3QgY29udGFpbmVyID0gZ2V0Q29udGFpbmVyKCk7XG4gIGNvbnN0IHNjcm9sbFRvcCA9ICgwLCBfZ2V0U2Nyb2xsLmRlZmF1bHQpKGNvbnRhaW5lcik7XG4gIGNvbnN0IHN0YXJ0VGltZSA9IERhdGUubm93KCk7XG4gIGNvbnN0IGZyYW1lRnVuYyA9ICgpID0+IHtcbiAgICBjb25zdCB0aW1lc3RhbXAgPSBEYXRlLm5vdygpO1xuICAgIGNvbnN0IHRpbWUgPSB0aW1lc3RhbXAgLSBzdGFydFRpbWU7XG4gICAgY29uc3QgbmV4dFNjcm9sbFRvcCA9ICgwLCBfZWFzaW5ncy5lYXNlSW5PdXRDdWJpYykodGltZSA+IGR1cmF0aW9uID8gZHVyYXRpb24gOiB0aW1lLCBzY3JvbGxUb3AsIHksIGR1cmF0aW9uKTtcbiAgICBpZiAoKDAsIF9nZXRTY3JvbGwuaXNXaW5kb3cpKGNvbnRhaW5lcikpIHtcbiAgICAgIGNvbnRhaW5lci5zY3JvbGxUbyh3aW5kb3cucGFnZVhPZmZzZXQsIG5leHRTY3JvbGxUb3ApO1xuICAgIH0gZWxzZSBpZiAoY29udGFpbmVyIGluc3RhbmNlb2YgRG9jdW1lbnQgfHwgY29udGFpbmVyLmNvbnN0cnVjdG9yLm5hbWUgPT09ICdIVE1MRG9jdW1lbnQnKSB7XG4gICAgICBjb250YWluZXIuZG9jdW1lbnRFbGVtZW50LnNjcm9sbFRvcCA9IG5leHRTY3JvbGxUb3A7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnRhaW5lci5zY3JvbGxUb3AgPSBuZXh0U2Nyb2xsVG9wO1xuICAgIH1cbiAgICBpZiAodGltZSA8IGR1cmF0aW9uKSB7XG4gICAgICAoMCwgX3JhZi5kZWZhdWx0KShmcmFtZUZ1bmMpO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIGNhbGxiYWNrID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBjYWxsYmFjaygpO1xuICAgIH1cbiAgfTtcbiAgKDAsIF9yYWYuZGVmYXVsdCkoZnJhbWVGdW5jKTtcbn0iLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIikuZGVmYXVsdDtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmdldE1lcmdlZFN0YXR1cyA9IHZvaWQgMDtcbmV4cG9ydHMuZ2V0U3RhdHVzQ2xhc3NOYW1lcyA9IGdldFN0YXR1c0NsYXNzTmFtZXM7XG52YXIgX2NsYXNzbmFtZXMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJjbGFzc25hbWVzXCIpKTtcbmNvbnN0IF9JbnB1dFN0YXR1c2VzID0gWyd3YXJuaW5nJywgJ2Vycm9yJywgJyddO1xuZnVuY3Rpb24gZ2V0U3RhdHVzQ2xhc3NOYW1lcyhwcmVmaXhDbHMsIHN0YXR1cywgaGFzRmVlZGJhY2spIHtcbiAgcmV0dXJuICgwLCBfY2xhc3NuYW1lcy5kZWZhdWx0KSh7XG4gICAgW2Ake3ByZWZpeENsc30tc3RhdHVzLXN1Y2Nlc3NgXTogc3RhdHVzID09PSAnc3VjY2VzcycsXG4gICAgW2Ake3ByZWZpeENsc30tc3RhdHVzLXdhcm5pbmdgXTogc3RhdHVzID09PSAnd2FybmluZycsXG4gICAgW2Ake3ByZWZpeENsc30tc3RhdHVzLWVycm9yYF06IHN0YXR1cyA9PT0gJ2Vycm9yJyxcbiAgICBbYCR7cHJlZml4Q2xzfS1zdGF0dXMtdmFsaWRhdGluZ2BdOiBzdGF0dXMgPT09ICd2YWxpZGF0aW5nJyxcbiAgICBbYCR7cHJlZml4Q2xzfS1oYXMtZmVlZGJhY2tgXTogaGFzRmVlZGJhY2tcbiAgfSk7XG59XG5jb25zdCBnZXRNZXJnZWRTdGF0dXMgPSAoY29udGV4dFN0YXR1cywgY3VzdG9tU3RhdHVzKSA9PiBjdXN0b21TdGF0dXMgfHwgY29udGV4dFN0YXR1cztcbmV4cG9ydHMuZ2V0TWVyZ2VkU3RhdHVzID0gZ2V0TWVyZ2VkU3RhdHVzOyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKS5kZWZhdWx0O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuY2FuVXNlRG9jRWxlbWVudCA9IHZvaWQgMDtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcImlzU3R5bGVTdXBwb3J0XCIsIHtcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIF9zdHlsZUNoZWNrZXIuaXNTdHlsZVN1cHBvcnQ7XG4gIH1cbn0pO1xudmFyIF9jYW5Vc2VEb20gPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJyYy11dGlsL2xpYi9Eb20vY2FuVXNlRG9tXCIpKTtcbnZhciBfc3R5bGVDaGVja2VyID0gcmVxdWlyZShcInJjLXV0aWwvbGliL0RvbS9zdHlsZUNoZWNrZXJcIik7XG5jb25zdCBjYW5Vc2VEb2NFbGVtZW50ID0gKCkgPT4gKDAsIF9jYW5Vc2VEb20uZGVmYXVsdCkoKSAmJiB3aW5kb3cuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50O1xuZXhwb3J0cy5jYW5Vc2VEb2NFbGVtZW50ID0gY2FuVXNlRG9jRWxlbWVudDsiLCJcInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHRvTGlzdDtcbmZ1bmN0aW9uIHRvTGlzdChjYW5kaWRhdGUpIHtcbiAgbGV0IHNraXBFbXB0eSA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogZmFsc2U7XG4gIGlmIChza2lwRW1wdHkgJiYgKGNhbmRpZGF0ZSA9PT0gdW5kZWZpbmVkIHx8IGNhbmRpZGF0ZSA9PT0gbnVsbCkpIHJldHVybiBbXTtcbiAgcmV0dXJuIEFycmF5LmlzQXJyYXkoY2FuZGlkYXRlKSA/IGNhbmRpZGF0ZSA6IFtjYW5kaWRhdGVdO1xufSIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkXCIpLmRlZmF1bHQ7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZXZVc2VXYXJuaW5nID0gZXhwb3J0cy5kZWZhdWx0ID0gZXhwb3J0cy5XYXJuaW5nQ29udGV4dCA9IHZvaWQgMDtcbmV4cG9ydHMubm9vcCA9IG5vb3A7XG5leHBvcnRzLnJlc2V0V2FybmVkID0gcmVzZXRXYXJuZWQ7XG52YXIgUmVhY3QgPSBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChyZXF1aXJlKFwicmVhY3RcIikpO1xudmFyIF93YXJuaW5nID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQocmVxdWlyZShcInJjLXV0aWwvbGliL3dhcm5pbmdcIikpO1xuZnVuY3Rpb24gbm9vcCgpIHt9XG5sZXQgZGVwcmVjYXRlZFdhcm5MaXN0ID0gbnVsbDtcbmZ1bmN0aW9uIHJlc2V0V2FybmVkKCkge1xuICBkZXByZWNhdGVkV2Fybkxpc3QgPSBudWxsO1xuICAoMCwgX3dhcm5pbmcucmVzZXRXYXJuZWQpKCk7XG59XG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25vLW11dGFibGUtZXhwb3J0c1xubGV0IHdhcm5pbmcgPSBub29wO1xuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgd2FybmluZyA9ICh2YWxpZCwgY29tcG9uZW50LCBtZXNzYWdlKSA9PiB7XG4gICAgKDAsIF93YXJuaW5nLmRlZmF1bHQpKHZhbGlkLCBgW2FudGQ6ICR7Y29tcG9uZW50fV0gJHttZXNzYWdlfWApO1xuICAgIC8vIFN0cmljdE1vZGUgd2lsbCBpbmplY3QgY29uc29sZSB3aGljaCB3aWxsIG5vdCB0aHJvdyB3YXJuaW5nIGluIFJlYWN0IDE3LlxuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gJ3Rlc3QnKSB7XG4gICAgICByZXNldFdhcm5lZCgpO1xuICAgIH1cbiAgfTtcbn1cbmNvbnN0IFdhcm5pbmdDb250ZXh0ID0gZXhwb3J0cy5XYXJuaW5nQ29udGV4dCA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVDb250ZXh0KHt9KTtcbi8qKlxuICogVGhpcyBpcyBhIGhvb2sgYnV0IHdlIG5vdCBuYW1lZCBhcyBgdXNlV2FybmluZ2BcbiAqIHNpbmNlIHRoaXMgaXMgb25seSB1c2VkIGluIGRldmVsb3BtZW50LlxuICogV2Ugc2hvdWxkIGFsd2F5cyB3cmFwIHRoaXMgaW4gYGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKWAgY29uZGl0aW9uXG4gKi9cbmNvbnN0IGRldlVzZVdhcm5pbmcgPSBleHBvcnRzLmRldlVzZVdhcm5pbmcgPSBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gY29tcG9uZW50ID0+IHtcbiAgY29uc3Qge1xuICAgIHN0cmljdFxuICB9ID0gUmVhY3QudXNlQ29udGV4dChXYXJuaW5nQ29udGV4dCk7XG4gIGNvbnN0IHR5cGVXYXJuaW5nID0gKHZhbGlkLCB0eXBlLCBtZXNzYWdlKSA9PiB7XG4gICAgaWYgKCF2YWxpZCkge1xuICAgICAgaWYgKHN0cmljdCA9PT0gZmFsc2UgJiYgdHlwZSA9PT0gJ2RlcHJlY2F0ZWQnKSB7XG4gICAgICAgIGNvbnN0IGV4aXN0V2FybmluZyA9IGRlcHJlY2F0ZWRXYXJuTGlzdDtcbiAgICAgICAgaWYgKCFkZXByZWNhdGVkV2Fybkxpc3QpIHtcbiAgICAgICAgICBkZXByZWNhdGVkV2Fybkxpc3QgPSB7fTtcbiAgICAgICAgfVxuICAgICAgICBkZXByZWNhdGVkV2Fybkxpc3RbY29tcG9uZW50XSA9IGRlcHJlY2F0ZWRXYXJuTGlzdFtjb21wb25lbnRdIHx8IFtdO1xuICAgICAgICBpZiAoIWRlcHJlY2F0ZWRXYXJuTGlzdFtjb21wb25lbnRdLmluY2x1ZGVzKG1lc3NhZ2UgfHwgJycpKSB7XG4gICAgICAgICAgZGVwcmVjYXRlZFdhcm5MaXN0W2NvbXBvbmVudF0ucHVzaChtZXNzYWdlIHx8ICcnKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBXYXJuaW5nIGZvciB0aGUgZmlyc3QgdGltZVxuICAgICAgICBpZiAoIWV4aXN0V2FybmluZykge1xuICAgICAgICAgIGNvbnNvbGUud2FybignW2FudGRdIFRoZXJlIGV4aXN0cyBkZXByZWNhdGVkIHVzYWdlIGluIHlvdXIgY29kZTonLCBkZXByZWNhdGVkV2Fybkxpc3QpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyB3YXJuaW5nKHZhbGlkLCBjb21wb25lbnQsIG1lc3NhZ2UpIDogdm9pZCAwO1xuICAgICAgfVxuICAgIH1cbiAgfTtcbiAgdHlwZVdhcm5pbmcuZGVwcmVjYXRlZCA9ICh2YWxpZCwgb2xkUHJvcCwgbmV3UHJvcCwgbWVzc2FnZSkgPT4ge1xuICAgIHR5cGVXYXJuaW5nKHZhbGlkLCAnZGVwcmVjYXRlZCcsIGBcXGAke29sZFByb3B9XFxgIGlzIGRlcHJlY2F0ZWQuIFBsZWFzZSB1c2UgXFxgJHtuZXdQcm9wfVxcYCBpbnN0ZWFkLiR7bWVzc2FnZSA/IGAgJHttZXNzYWdlfWAgOiAnJ31gKTtcbiAgfTtcbiAgcmV0dXJuIHR5cGVXYXJuaW5nO1xufSA6ICgpID0+IHtcbiAgY29uc3Qgbm9vcFdhcm5pbmcgPSAoKSA9PiB7fTtcbiAgbm9vcFdhcm5pbmcuZGVwcmVjYXRlZCA9IG5vb3A7XG4gIHJldHVybiBub29wV2FybmluZztcbn07XG52YXIgX2RlZmF1bHQgPSBleHBvcnRzLmRlZmF1bHQgPSB3YXJuaW5nOyIsIlwidXNlIHN0cmljdFwiO1xuXCJ1c2UgY2xpZW50XCI7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpLmRlZmF1bHQ7XG52YXIgX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkXCIpLmRlZmF1bHQ7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xudmFyIFJlYWN0ID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQocmVxdWlyZShcInJlYWN0XCIpKTtcbnZhciBfY2xhc3NuYW1lcyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcImNsYXNzbmFtZXNcIikpO1xudmFyIF9yY01vdGlvbiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcInJjLW1vdGlvblwiKSk7XG52YXIgX3JhZiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcInJjLXV0aWwvbGliL3JhZlwiKSk7XG52YXIgX3JlZjIgPSByZXF1aXJlKFwicmMtdXRpbC9saWIvcmVmXCIpO1xudmFyIF9VbnN0YWJsZUNvbnRleHQgPSByZXF1aXJlKFwiLi4vLi4vY29uZmlnLXByb3ZpZGVyL1Vuc3RhYmxlQ29udGV4dFwiKTtcbnZhciBfaW50ZXJmYWNlID0gcmVxdWlyZShcIi4vaW50ZXJmYWNlXCIpO1xudmFyIF91dGlsID0gcmVxdWlyZShcIi4vdXRpbFwiKTtcbmZ1bmN0aW9uIHZhbGlkYXRlTnVtKHZhbHVlKSB7XG4gIHJldHVybiBOdW1iZXIuaXNOYU4odmFsdWUpID8gMCA6IHZhbHVlO1xufVxuY29uc3QgV2F2ZUVmZmVjdCA9IHByb3BzID0+IHtcbiAgY29uc3Qge1xuICAgIGNsYXNzTmFtZSxcbiAgICB0YXJnZXQsXG4gICAgY29tcG9uZW50LFxuICAgIHJlZ2lzdGVyVW5tb3VudFxuICB9ID0gcHJvcHM7XG4gIGNvbnN0IGRpdlJlZiA9IFJlYWN0LnVzZVJlZihudWxsKTtcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PSBSZWZzID09PT09PT09PT09PT09PT09PT09PT1cbiAgY29uc3QgdW5tb3VudFJlZiA9IFJlYWN0LnVzZVJlZihudWxsKTtcbiAgUmVhY3QudXNlRWZmZWN0KCgpID0+IHtcbiAgICB1bm1vdW50UmVmLmN1cnJlbnQgPSByZWdpc3RlclVubW91bnQoKTtcbiAgfSwgW10pO1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT0gRWZmZWN0ID09PT09PT09PT09PT09PT09PT09PVxuICBjb25zdCBbY29sb3IsIHNldFdhdmVDb2xvcl0gPSBSZWFjdC51c2VTdGF0ZShudWxsKTtcbiAgY29uc3QgW2JvcmRlclJhZGl1cywgc2V0Qm9yZGVyUmFkaXVzXSA9IFJlYWN0LnVzZVN0YXRlKFtdKTtcbiAgY29uc3QgW2xlZnQsIHNldExlZnRdID0gUmVhY3QudXNlU3RhdGUoMCk7XG4gIGNvbnN0IFt0b3AsIHNldFRvcF0gPSBSZWFjdC51c2VTdGF0ZSgwKTtcbiAgY29uc3QgW3dpZHRoLCBzZXRXaWR0aF0gPSBSZWFjdC51c2VTdGF0ZSgwKTtcbiAgY29uc3QgW2hlaWdodCwgc2V0SGVpZ2h0XSA9IFJlYWN0LnVzZVN0YXRlKDApO1xuICBjb25zdCBbZW5hYmxlZCwgc2V0RW5hYmxlZF0gPSBSZWFjdC51c2VTdGF0ZShmYWxzZSk7XG4gIGNvbnN0IHdhdmVTdHlsZSA9IHtcbiAgICBsZWZ0LFxuICAgIHRvcCxcbiAgICB3aWR0aCxcbiAgICBoZWlnaHQsXG4gICAgYm9yZGVyUmFkaXVzOiBib3JkZXJSYWRpdXMubWFwKHJhZGl1cyA9PiBgJHtyYWRpdXN9cHhgKS5qb2luKCcgJylcbiAgfTtcbiAgaWYgKGNvbG9yKSB7XG4gICAgd2F2ZVN0eWxlWyctLXdhdmUtY29sb3InXSA9IGNvbG9yO1xuICB9XG4gIGZ1bmN0aW9uIHN5bmNQb3MoKSB7XG4gICAgY29uc3Qgbm9kZVN0eWxlID0gZ2V0Q29tcHV0ZWRTdHlsZSh0YXJnZXQpO1xuICAgIC8vIEdldCB3YXZlIGNvbG9yIGZyb20gdGFyZ2V0XG4gICAgc2V0V2F2ZUNvbG9yKCgwLCBfdXRpbC5nZXRUYXJnZXRXYXZlQ29sb3IpKHRhcmdldCkpO1xuICAgIGNvbnN0IGlzU3RhdGljID0gbm9kZVN0eWxlLnBvc2l0aW9uID09PSAnc3RhdGljJztcbiAgICAvLyBSZWN0XG4gICAgY29uc3Qge1xuICAgICAgYm9yZGVyTGVmdFdpZHRoLFxuICAgICAgYm9yZGVyVG9wV2lkdGhcbiAgICB9ID0gbm9kZVN0eWxlO1xuICAgIHNldExlZnQoaXNTdGF0aWMgPyB0YXJnZXQub2Zmc2V0TGVmdCA6IHZhbGlkYXRlTnVtKC1wYXJzZUZsb2F0KGJvcmRlckxlZnRXaWR0aCkpKTtcbiAgICBzZXRUb3AoaXNTdGF0aWMgPyB0YXJnZXQub2Zmc2V0VG9wIDogdmFsaWRhdGVOdW0oLXBhcnNlRmxvYXQoYm9yZGVyVG9wV2lkdGgpKSk7XG4gICAgc2V0V2lkdGgodGFyZ2V0Lm9mZnNldFdpZHRoKTtcbiAgICBzZXRIZWlnaHQodGFyZ2V0Lm9mZnNldEhlaWdodCk7XG4gICAgLy8gR2V0IGJvcmRlciByYWRpdXNcbiAgICBjb25zdCB7XG4gICAgICBib3JkZXJUb3BMZWZ0UmFkaXVzLFxuICAgICAgYm9yZGVyVG9wUmlnaHRSYWRpdXMsXG4gICAgICBib3JkZXJCb3R0b21MZWZ0UmFkaXVzLFxuICAgICAgYm9yZGVyQm90dG9tUmlnaHRSYWRpdXNcbiAgICB9ID0gbm9kZVN0eWxlO1xuICAgIHNldEJvcmRlclJhZGl1cyhbYm9yZGVyVG9wTGVmdFJhZGl1cywgYm9yZGVyVG9wUmlnaHRSYWRpdXMsIGJvcmRlckJvdHRvbVJpZ2h0UmFkaXVzLCBib3JkZXJCb3R0b21MZWZ0UmFkaXVzXS5tYXAocmFkaXVzID0+IHZhbGlkYXRlTnVtKHBhcnNlRmxvYXQocmFkaXVzKSkpKTtcbiAgfVxuICBSZWFjdC51c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmICh0YXJnZXQpIHtcbiAgICAgIC8vIFdlIG5lZWQgZGVsYXkgdG8gY2hlY2sgcG9zaXRpb24gaGVyZVxuICAgICAgLy8gc2luY2UgVUkgbWF5IGNoYW5nZSBhZnRlciBjbGlja1xuICAgICAgY29uc3QgaWQgPSAoMCwgX3JhZi5kZWZhdWx0KSgoKSA9PiB7XG4gICAgICAgIHN5bmNQb3MoKTtcbiAgICAgICAgc2V0RW5hYmxlZCh0cnVlKTtcbiAgICAgIH0pO1xuICAgICAgLy8gQWRkIHJlc2l6ZSBvYnNlcnZlciB0byBmb2xsb3cgc2l6ZVxuICAgICAgbGV0IHJlc2l6ZU9ic2VydmVyO1xuICAgICAgaWYgKHR5cGVvZiBSZXNpemVPYnNlcnZlciAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgcmVzaXplT2JzZXJ2ZXIgPSBuZXcgUmVzaXplT2JzZXJ2ZXIoc3luY1Bvcyk7XG4gICAgICAgIHJlc2l6ZU9ic2VydmVyLm9ic2VydmUodGFyZ2V0KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgIF9yYWYuZGVmYXVsdC5jYW5jZWwoaWQpO1xuICAgICAgICByZXNpemVPYnNlcnZlciA9PT0gbnVsbCB8fCByZXNpemVPYnNlcnZlciA9PT0gdm9pZCAwID8gdm9pZCAwIDogcmVzaXplT2JzZXJ2ZXIuZGlzY29ubmVjdCgpO1xuICAgICAgfTtcbiAgICB9XG4gIH0sIFtdKTtcbiAgaWYgKCFlbmFibGVkKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgY29uc3QgaXNTbWFsbENvbXBvbmVudCA9IChjb21wb25lbnQgPT09ICdDaGVja2JveCcgfHwgY29tcG9uZW50ID09PSAnUmFkaW8nKSAmJiAodGFyZ2V0ID09PSBudWxsIHx8IHRhcmdldCA9PT0gdm9pZCAwID8gdm9pZCAwIDogdGFyZ2V0LmNsYXNzTGlzdC5jb250YWlucyhfaW50ZXJmYWNlLlRBUkdFVF9DTFMpKTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KF9yY01vdGlvbi5kZWZhdWx0LCB7XG4gICAgdmlzaWJsZTogdHJ1ZSxcbiAgICBtb3Rpb25BcHBlYXI6IHRydWUsXG4gICAgbW90aW9uTmFtZTogXCJ3YXZlLW1vdGlvblwiLFxuICAgIG1vdGlvbkRlYWRsaW5lOiA1MDAwLFxuICAgIG9uQXBwZWFyRW5kOiAoXywgZXZlbnQpID0+IHtcbiAgICAgIHZhciBfYSwgX2I7XG4gICAgICBpZiAoZXZlbnQuZGVhZGxpbmUgfHwgZXZlbnQucHJvcGVydHlOYW1lID09PSAnb3BhY2l0eScpIHtcbiAgICAgICAgY29uc3QgaG9sZGVyID0gKF9hID0gZGl2UmVmLmN1cnJlbnQpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5wYXJlbnRFbGVtZW50O1xuICAgICAgICAoX2IgPSB1bm1vdW50UmVmLmN1cnJlbnQpID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5jYWxsKHVubW91bnRSZWYpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgIGhvbGRlciA9PT0gbnVsbCB8fCBob2xkZXIgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGhvbGRlci5yZW1vdmUoKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9LCAoX3JlZiwgcmVmKSA9PiB7XG4gICAgbGV0IHtcbiAgICAgIGNsYXNzTmFtZTogbW90aW9uQ2xhc3NOYW1lXG4gICAgfSA9IF9yZWY7XG4gICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgIHJlZjogKDAsIF9yZWYyLmNvbXBvc2VSZWYpKGRpdlJlZiwgcmVmKSxcbiAgICAgIGNsYXNzTmFtZTogKDAsIF9jbGFzc25hbWVzLmRlZmF1bHQpKGNsYXNzTmFtZSwgbW90aW9uQ2xhc3NOYW1lLCB7XG4gICAgICAgICd3YXZlLXF1aWNrJzogaXNTbWFsbENvbXBvbmVudFxuICAgICAgfSksXG4gICAgICBzdHlsZTogd2F2ZVN0eWxlXG4gICAgfSk7XG4gIH0pO1xufTtcbmNvbnN0IHNob3dXYXZlRWZmZWN0ID0gKHRhcmdldCwgaW5mbykgPT4ge1xuICB2YXIgX2E7XG4gIGNvbnN0IHtcbiAgICBjb21wb25lbnRcbiAgfSA9IGluZm87XG4gIC8vIFNraXAgZm9yIHVuY2hlY2tlZCBjaGVja2JveFxuICBpZiAoY29tcG9uZW50ID09PSAnQ2hlY2tib3gnICYmICEoKF9hID0gdGFyZ2V0LnF1ZXJ5U2VsZWN0b3IoJ2lucHV0JykpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5jaGVja2VkKSkge1xuICAgIHJldHVybjtcbiAgfVxuICAvLyBDcmVhdGUgaG9sZGVyXG4gIGNvbnN0IGhvbGRlciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICBob2xkZXIuc3R5bGUucG9zaXRpb24gPSAnYWJzb2x1dGUnO1xuICBob2xkZXIuc3R5bGUubGVmdCA9ICcwcHgnO1xuICBob2xkZXIuc3R5bGUudG9wID0gJzBweCc7XG4gIHRhcmdldCA9PT0gbnVsbCB8fCB0YXJnZXQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHRhcmdldC5pbnNlcnRCZWZvcmUoaG9sZGVyLCB0YXJnZXQgPT09IG51bGwgfHwgdGFyZ2V0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiB0YXJnZXQuZmlyc3RDaGlsZCk7XG4gIGNvbnN0IHJlYWN0UmVuZGVyID0gKDAsIF9VbnN0YWJsZUNvbnRleHQuZ2V0UmVhY3RSZW5kZXIpKCk7XG4gIGxldCB1bm1vdW50Q2FsbGJhY2sgPSBudWxsO1xuICBmdW5jdGlvbiByZWdpc3RlclVubW91bnQoKSB7XG4gICAgcmV0dXJuIHVubW91bnRDYWxsYmFjaztcbiAgfVxuICB1bm1vdW50Q2FsbGJhY2sgPSByZWFjdFJlbmRlcigvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChXYXZlRWZmZWN0LCBPYmplY3QuYXNzaWduKHt9LCBpbmZvLCB7XG4gICAgdGFyZ2V0OiB0YXJnZXQsXG4gICAgcmVnaXN0ZXJVbm1vdW50OiByZWdpc3RlclVubW91bnRcbiAgfSkpLCBob2xkZXIpO1xufTtcbnZhciBfZGVmYXVsdCA9IGV4cG9ydHMuZGVmYXVsdCA9IHNob3dXYXZlRWZmZWN0OyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKS5kZWZhdWx0O1xudmFyIF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVXaWxkY2FyZFwiKS5kZWZhdWx0O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDtcbnZhciBfcmVhY3QgPSBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChyZXF1aXJlKFwicmVhY3RcIikpO1xudmFyIF9jbGFzc25hbWVzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiY2xhc3NuYW1lc1wiKSk7XG52YXIgX2lzVmlzaWJsZSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcInJjLXV0aWwvbGliL0RvbS9pc1Zpc2libGVcIikpO1xudmFyIF9yZWYgPSByZXF1aXJlKFwicmMtdXRpbC9saWIvcmVmXCIpO1xudmFyIF9jb25maWdQcm92aWRlciA9IHJlcXVpcmUoXCIuLi8uLi9jb25maWctcHJvdmlkZXJcIik7XG52YXIgX3JlYWN0Tm9kZSA9IHJlcXVpcmUoXCIuLi9yZWFjdE5vZGVcIik7XG52YXIgX3N0eWxlID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9zdHlsZVwiKSk7XG52YXIgX3VzZVdhdmUgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL3VzZVdhdmVcIikpO1xuY29uc3QgV2F2ZSA9IHByb3BzID0+IHtcbiAgY29uc3Qge1xuICAgIGNoaWxkcmVuLFxuICAgIGRpc2FibGVkLFxuICAgIGNvbXBvbmVudFxuICB9ID0gcHJvcHM7XG4gIGNvbnN0IHtcbiAgICBnZXRQcmVmaXhDbHNcbiAgfSA9ICgwLCBfcmVhY3QudXNlQ29udGV4dCkoX2NvbmZpZ1Byb3ZpZGVyLkNvbmZpZ0NvbnRleHQpO1xuICBjb25zdCBjb250YWluZXJSZWYgPSAoMCwgX3JlYWN0LnVzZVJlZikobnVsbCk7XG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBTdHlsZSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIGNvbnN0IHByZWZpeENscyA9IGdldFByZWZpeENscygnd2F2ZScpO1xuICBjb25zdCBbLCBoYXNoSWRdID0gKDAsIF9zdHlsZS5kZWZhdWx0KShwcmVmaXhDbHMpO1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IFdhdmUgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICBjb25zdCBzaG93V2F2ZSA9ICgwLCBfdXNlV2F2ZS5kZWZhdWx0KShjb250YWluZXJSZWYsICgwLCBfY2xhc3NuYW1lcy5kZWZhdWx0KShwcmVmaXhDbHMsIGhhc2hJZCksIGNvbXBvbmVudCk7XG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBFZmZlY3QgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIF9yZWFjdC5kZWZhdWx0LnVzZUVmZmVjdCgoKSA9PiB7XG4gICAgY29uc3Qgbm9kZSA9IGNvbnRhaW5lclJlZi5jdXJyZW50O1xuICAgIGlmICghbm9kZSB8fCBub2RlLm5vZGVUeXBlICE9PSAxIHx8IGRpc2FibGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIENsaWNrIGhhbmRsZXJcbiAgICBjb25zdCBvbkNsaWNrID0gZSA9PiB7XG4gICAgICAvLyBGaXggcmFkaW8gYnV0dG9uIGNsaWNrIHR3aWNlXG4gICAgICBpZiAoISgwLCBfaXNWaXNpYmxlLmRlZmF1bHQpKGUudGFyZ2V0KSB8fFxuICAgICAgLy8gTm8gbmVlZCB3YXZlXG4gICAgICAhbm9kZS5nZXRBdHRyaWJ1dGUgfHwgbm9kZS5nZXRBdHRyaWJ1dGUoJ2Rpc2FibGVkJykgfHwgbm9kZS5kaXNhYmxlZCB8fCBub2RlLmNsYXNzTmFtZS5pbmNsdWRlcygnZGlzYWJsZWQnKSB8fCBub2RlLmNsYXNzTmFtZS5pbmNsdWRlcygnLWxlYXZlJykpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgc2hvd1dhdmUoZSk7XG4gICAgfTtcbiAgICAvLyBCaW5kIGV2ZW50c1xuICAgIG5vZGUuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBvbkNsaWNrLCB0cnVlKTtcbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgbm9kZS5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIG9uQ2xpY2ssIHRydWUpO1xuICAgIH07XG4gIH0sIFtkaXNhYmxlZF0pO1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gUmVuZGVyID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICBpZiAoISAvKiNfX1BVUkVfXyovX3JlYWN0LmRlZmF1bHQuaXNWYWxpZEVsZW1lbnQoY2hpbGRyZW4pKSB7XG4gICAgcmV0dXJuIGNoaWxkcmVuICE9PSBudWxsICYmIGNoaWxkcmVuICE9PSB2b2lkIDAgPyBjaGlsZHJlbiA6IG51bGw7XG4gIH1cbiAgY29uc3QgcmVmID0gKDAsIF9yZWYuc3VwcG9ydFJlZikoY2hpbGRyZW4pID8gKDAsIF9yZWYuY29tcG9zZVJlZikoKDAsIF9yZWYuZ2V0Tm9kZVJlZikoY2hpbGRyZW4pLCBjb250YWluZXJSZWYpIDogY29udGFpbmVyUmVmO1xuICByZXR1cm4gKDAsIF9yZWFjdE5vZGUuY2xvbmVFbGVtZW50KShjaGlsZHJlbiwge1xuICAgIHJlZlxuICB9KTtcbn07XG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICBXYXZlLmRpc3BsYXlOYW1lID0gJ1dhdmUnO1xufVxudmFyIF9kZWZhdWx0ID0gZXhwb3J0cy5kZWZhdWx0ID0gV2F2ZTsiLCJcInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuVEFSR0VUX0NMUyA9IHZvaWQgMDtcbnZhciBfY29uZmlnUHJvdmlkZXIgPSByZXF1aXJlKFwiLi4vLi4vY29uZmlnLXByb3ZpZGVyXCIpO1xuY29uc3QgVEFSR0VUX0NMUyA9IGV4cG9ydHMuVEFSR0VUX0NMUyA9IGAke19jb25maWdQcm92aWRlci5kZWZhdWx0UHJlZml4Q2xzfS13YXZlLXRhcmdldGA7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSB2b2lkIDA7XG52YXIgX2ludGVybmFsID0gcmVxdWlyZShcIi4uLy4uL3RoZW1lL2ludGVybmFsXCIpO1xuY29uc3QgZ2VuV2F2ZVN0eWxlID0gdG9rZW4gPT4ge1xuICBjb25zdCB7XG4gICAgY29tcG9uZW50Q2xzLFxuICAgIGNvbG9yUHJpbWFyeVxuICB9ID0gdG9rZW47XG4gIHJldHVybiB7XG4gICAgW2NvbXBvbmVudENsc106IHtcbiAgICAgIHBvc2l0aW9uOiAnYWJzb2x1dGUnLFxuICAgICAgYmFja2dyb3VuZDogJ3RyYW5zcGFyZW50JyxcbiAgICAgIHBvaW50ZXJFdmVudHM6ICdub25lJyxcbiAgICAgIGJveFNpemluZzogJ2JvcmRlci1ib3gnLFxuICAgICAgY29sb3I6IGB2YXIoLS13YXZlLWNvbG9yLCAke2NvbG9yUHJpbWFyeX0pYCxcbiAgICAgIGJveFNoYWRvdzogYDAgMCAwIDAgY3VycmVudGNvbG9yYCxcbiAgICAgIG9wYWNpdHk6IDAuMixcbiAgICAgIC8vID09PT09PT09PT09PT09PT09PT0gTW90aW9uID09PT09PT09PT09PT09PT09PT1cbiAgICAgICcmLndhdmUtbW90aW9uLWFwcGVhcic6IHtcbiAgICAgICAgdHJhbnNpdGlvbjogW2Bib3gtc2hhZG93IDAuNHMgJHt0b2tlbi5tb3Rpb25FYXNlT3V0Q2lyY31gLCBgb3BhY2l0eSAycyAke3Rva2VuLm1vdGlvbkVhc2VPdXRDaXJjfWBdLmpvaW4oJywnKSxcbiAgICAgICAgJyYtYWN0aXZlJzoge1xuICAgICAgICAgIGJveFNoYWRvdzogYDAgMCAwIDZweCBjdXJyZW50Y29sb3JgLFxuICAgICAgICAgIG9wYWNpdHk6IDBcbiAgICAgICAgfSxcbiAgICAgICAgJyYud2F2ZS1xdWljayc6IHtcbiAgICAgICAgICB0cmFuc2l0aW9uOiBbYGJveC1zaGFkb3cgJHt0b2tlbi5tb3Rpb25EdXJhdGlvblNsb3d9ICR7dG9rZW4ubW90aW9uRWFzZUluT3V0fWAsIGBvcGFjaXR5ICR7dG9rZW4ubW90aW9uRHVyYXRpb25TbG93fSAke3Rva2VuLm1vdGlvbkVhc2VJbk91dH1gXS5qb2luKCcsJylcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfTtcbn07XG52YXIgX2RlZmF1bHQgPSBleHBvcnRzLmRlZmF1bHQgPSAoMCwgX2ludGVybmFsLmdlbkNvbXBvbmVudFN0eWxlSG9vaykoJ1dhdmUnLCB0b2tlbiA9PiBbZ2VuV2F2ZVN0eWxlKHRva2VuKV0pOyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKS5kZWZhdWx0O1xudmFyIF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVXaWxkY2FyZFwiKS5kZWZhdWx0O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDtcbnZhciBSZWFjdCA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKHJlcXVpcmUoXCJyZWFjdFwiKSk7XG52YXIgX3VzZUV2ZW50ID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwicmMtdXRpbC9saWIvaG9va3MvdXNlRXZlbnRcIikpO1xudmFyIF9yYWYgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJyYy11dGlsL2xpYi9yYWZcIikpO1xudmFyIF9jb25maWdQcm92aWRlciA9IHJlcXVpcmUoXCIuLi8uLi9jb25maWctcHJvdmlkZXJcIik7XG52YXIgX3VzZVRva2VuID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi4vLi4vdGhlbWUvdXNlVG9rZW5cIikpO1xudmFyIF9pbnRlcmZhY2UgPSByZXF1aXJlKFwiLi9pbnRlcmZhY2VcIik7XG52YXIgX1dhdmVFZmZlY3QgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL1dhdmVFZmZlY3RcIikpO1xuY29uc3QgdXNlV2F2ZSA9IChub2RlUmVmLCBjbGFzc05hbWUsIGNvbXBvbmVudCkgPT4ge1xuICBjb25zdCB7XG4gICAgd2F2ZVxuICB9ID0gUmVhY3QudXNlQ29udGV4dChfY29uZmlnUHJvdmlkZXIuQ29uZmlnQ29udGV4dCk7XG4gIGNvbnN0IFssIHRva2VuLCBoYXNoSWRdID0gKDAsIF91c2VUb2tlbi5kZWZhdWx0KSgpO1xuICBjb25zdCBzaG93V2F2ZSA9ICgwLCBfdXNlRXZlbnQuZGVmYXVsdCkoZXZlbnQgPT4ge1xuICAgIGNvbnN0IG5vZGUgPSBub2RlUmVmLmN1cnJlbnQ7XG4gICAgaWYgKCh3YXZlID09PSBudWxsIHx8IHdhdmUgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHdhdmUuZGlzYWJsZWQpIHx8ICFub2RlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHRhcmdldE5vZGUgPSBub2RlLnF1ZXJ5U2VsZWN0b3IoYC4ke19pbnRlcmZhY2UuVEFSR0VUX0NMU31gKSB8fCBub2RlO1xuICAgIGNvbnN0IHtcbiAgICAgIHNob3dFZmZlY3RcbiAgICB9ID0gd2F2ZSB8fCB7fTtcbiAgICAvLyBDdXN0b21pemUgd2F2ZSBlZmZlY3RcbiAgICAoc2hvd0VmZmVjdCB8fCBfV2F2ZUVmZmVjdC5kZWZhdWx0KSh0YXJnZXROb2RlLCB7XG4gICAgICBjbGFzc05hbWUsXG4gICAgICB0b2tlbixcbiAgICAgIGNvbXBvbmVudCxcbiAgICAgIGV2ZW50LFxuICAgICAgaGFzaElkXG4gICAgfSk7XG4gIH0pO1xuICBjb25zdCByYWZJZCA9IFJlYWN0LnVzZVJlZihudWxsKTtcbiAgLy8gTWVyZ2UgdHJpZ2dlciBldmVudCBpbnRvIG9uZSBmb3IgZWFjaCBmcmFtZVxuICBjb25zdCBzaG93RGVib3VuY2VXYXZlID0gZXZlbnQgPT4ge1xuICAgIF9yYWYuZGVmYXVsdC5jYW5jZWwocmFmSWQuY3VycmVudCk7XG4gICAgcmFmSWQuY3VycmVudCA9ICgwLCBfcmFmLmRlZmF1bHQpKCgpID0+IHtcbiAgICAgIHNob3dXYXZlKGV2ZW50KTtcbiAgICB9KTtcbiAgfTtcbiAgcmV0dXJuIHNob3dEZWJvdW5jZVdhdmU7XG59O1xudmFyIF9kZWZhdWx0ID0gZXhwb3J0cy5kZWZhdWx0ID0gdXNlV2F2ZTsiLCJcInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZ2V0VGFyZ2V0V2F2ZUNvbG9yID0gZ2V0VGFyZ2V0V2F2ZUNvbG9yO1xuZXhwb3J0cy5pc1ZhbGlkV2F2ZUNvbG9yID0gaXNWYWxpZFdhdmVDb2xvcjtcbmZ1bmN0aW9uIGlzVmFsaWRXYXZlQ29sb3IoY29sb3IpIHtcbiAgcmV0dXJuIGNvbG9yICYmIGNvbG9yICE9PSAnI2ZmZicgJiYgY29sb3IgIT09ICcjZmZmZmZmJyAmJiBjb2xvciAhPT0gJ3JnYigyNTUsIDI1NSwgMjU1KScgJiYgY29sb3IgIT09ICdyZ2JhKDI1NSwgMjU1LCAyNTUsIDEpJyAmJiAhL3JnYmFcXCgoPzpcXGQqLCApezN9MFxcKS8udGVzdChjb2xvcikgJiZcbiAgLy8gYW55IHRyYW5zcGFyZW50IHJnYmEgY29sb3JcbiAgY29sb3IgIT09ICd0cmFuc3BhcmVudCc7XG59XG5mdW5jdGlvbiBnZXRUYXJnZXRXYXZlQ29sb3Iobm9kZSkge1xuICBjb25zdCB7XG4gICAgYm9yZGVyVG9wQ29sb3IsXG4gICAgYm9yZGVyQ29sb3IsXG4gICAgYmFja2dyb3VuZENvbG9yXG4gIH0gPSBnZXRDb21wdXRlZFN0eWxlKG5vZGUpO1xuICBpZiAoaXNWYWxpZFdhdmVDb2xvcihib3JkZXJUb3BDb2xvcikpIHtcbiAgICByZXR1cm4gYm9yZGVyVG9wQ29sb3I7XG4gIH1cbiAgaWYgKGlzVmFsaWRXYXZlQ29sb3IoYm9yZGVyQ29sb3IpKSB7XG4gICAgcmV0dXJuIGJvcmRlckNvbG9yO1xuICB9XG4gIGlmIChpc1ZhbGlkV2F2ZUNvbG9yKGJhY2tncm91bmRDb2xvcikpIHtcbiAgICByZXR1cm4gYmFja2dyb3VuZENvbG9yO1xuICB9XG4gIHJldHVybiBudWxsO1xufSIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKS5kZWZhdWx0O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDtcbnZhciBfcmVhY3QgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJyZWFjdFwiKSk7XG5jb25zdCB6SW5kZXhDb250ZXh0ID0gLyojX19QVVJFX18qL19yZWFjdC5kZWZhdWx0LmNyZWF0ZUNvbnRleHQodW5kZWZpbmVkKTtcbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gIHpJbmRleENvbnRleHQuZGlzcGxheU5hbWUgPSAnekluZGV4Q29udGV4dCc7XG59XG52YXIgX2RlZmF1bHQgPSBleHBvcnRzLmRlZmF1bHQgPSB6SW5kZXhDb250ZXh0OyJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==