UNPKG

botframework-webchat-component

Version:
385 lines (319 loc) 58.5 kB
"use strict"; function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _botframeworkWebchatApi = require("botframework-webchat-api"); var _reactSay = require("react-say"); var _createEmotion = _interopRequireDefault(require("create-emotion")); var _createStyleSet = _interopRequireDefault(require("./Styles/createStyleSet")); var _markdownIt = _interopRequireDefault(require("markdown-it")); var _propTypes = _interopRequireDefault(require("prop-types")); var _react = _interopRequireWildcard(require("react")); var _BypassSpeechSynthesisPonyfill = require("./hooks/internal/BypassSpeechSynthesisPonyfill"); var _addTargetBlankToHyperlinksMarkdown = _interopRequireDefault(require("./Utils/addTargetBlankToHyperlinksMarkdown")); var _createCSSKey = _interopRequireDefault(require("./Utils/createCSSKey")); var _createCoreMiddleware = _interopRequireDefault(require("./Middleware/Activity/createCoreMiddleware")); var _createCoreMiddleware2 = _interopRequireDefault(require("./Middleware/ActivityStatus/createCoreMiddleware")); var _createCoreMiddleware3 = _interopRequireDefault(require("./Middleware/AttachmentForScreenReader/createCoreMiddleware")); var _createCoreMiddleware4 = _interopRequireDefault(require("./Middleware/Attachment/createCoreMiddleware")); var _createCoreMiddleware5 = _interopRequireDefault(require("./Middleware/Avatar/createCoreMiddleware")); var _createCoreMiddleware6 = _interopRequireDefault(require("./Middleware/CardAction/createCoreMiddleware")); var _createCoreMiddleware7 = _interopRequireDefault(require("./Middleware/Toast/createCoreMiddleware")); var _createCoreMiddleware8 = _interopRequireDefault(require("./Middleware/TypingIndicator/createCoreMiddleware")); var _Dictation = _interopRequireDefault(require("./Dictation")); var _downscaleImageToDataURL = _interopRequireDefault(require("./Utils/downscaleImageToDataURL")); var _ErrorBox = _interopRequireDefault(require("./ErrorBox")); var _mapMap = _interopRequireDefault(require("./Utils/mapMap")); var _singleToArray = _interopRequireDefault(require("./Utils/singleToArray")); var _UITracker = _interopRequireDefault(require("./hooks/internal/UITracker")); var _WebChatUIContext = _interopRequireDefault(require("./hooks/internal/WebChatUIContext")); function _getRequireWildcardCache() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); _getRequireWildcardCache = function _getRequireWildcardCache() { return cache; }; return cache; } function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; } function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); } function _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; } function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; } function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); } function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && Symbol.iterator in Object(iter)) return Array.from(iter); } function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); } function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; } function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; } function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); } function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; } function _iterableToArrayLimit(arr, i) { if (typeof Symbol === "undefined" || !(Symbol.iterator in Object(arr))) return; var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; } var useReferenceGrammarID = _botframeworkWebchatApi.hooks.useReferenceGrammarID, useStyleOptions = _botframeworkWebchatApi.hooks.useStyleOptions; // eslint-disable-next-line no-undef var node_env = undefined || "production"; var emotionPool = {}; function styleSetToEmotionObjects(styleToEmotionObject, styleSet) { return (0, _mapMap.default)(styleSet, function (style, key) { return key === 'options' ? style : styleToEmotionObject(style); }); } var ComposerCore = function ComposerCore(_ref) { var children = _ref.children, extraStyleSet = _ref.extraStyleSet, nonce = _ref.nonce, renderMarkdown = _ref.renderMarkdown, styleSet = _ref.styleSet, suggestedActionsAccessKey = _ref.suggestedActionsAccessKey, webSpeechPonyfillFactory = _ref.webSpeechPonyfillFactory; var _useState = (0, _react.useState)(), _useState2 = _slicedToArray(_useState, 2), dictateAbortable = _useState2[0], setDictateAbortable = _useState2[1]; var _useReferenceGrammarI = useReferenceGrammarID(), _useReferenceGrammarI2 = _slicedToArray(_useReferenceGrammarI, 1), referenceGrammarID = _useReferenceGrammarI2[0]; var _useStyleOptions = useStyleOptions(), _useStyleOptions2 = _slicedToArray(_useStyleOptions, 1), styleOptions = _useStyleOptions2[0]; var focusSendBoxCallbacksRef = (0, _react.useRef)([]); var focusTranscriptCallbacksRef = (0, _react.useRef)([]); var internalMarkdownIt = (0, _react.useMemo)(function () { return new _markdownIt.default(); }, []); var scrollToCallbacksRef = (0, _react.useRef)([]); var scrollToEndCallbacksRef = (0, _react.useRef)([]); // Instead of having a `scrollUpCallbacksRef` and `scrollDownCallbacksRef`, they are combined into a single `scrollRelativeCallbacksRef`. // The first argument tells whether it should go "up" or "down". var scrollRelativeCallbacksRef = (0, _react.useRef)([]); var dictationOnError = (0, _react.useCallback)(function (err) { console.error(err); }, []); var internalRenderMarkdownInline = (0, _react.useMemo)(function () { return function (markdown) { var tree = internalMarkdownIt.parseInline(markdown); // We should add rel="noopener noreferrer" and target="_blank" var patchedTree = (0, _addTargetBlankToHyperlinksMarkdown.default)(tree); return internalMarkdownIt.renderer.render(patchedTree); }; }, [internalMarkdownIt]); var styleToEmotionObject = (0, _react.useMemo)(function () { // Emotion doesn't hash with nonce. We need to provide the pooling mechanism. // 1. If 2 instances use different nonce, they should result in different hash; // 2. If 2 instances are being mounted, pooling will make sure we render only 1 set of <style> tags, instead of 2. var emotion = emotionPool[nonce] || (emotionPool[nonce] = (0, _createEmotion.default)({ key: "webchat--css-".concat((0, _createCSSKey.default)()), nonce: nonce })); return function (style) { return emotion.css(style); }; }, [nonce]); var patchedStyleSet = (0, _react.useMemo)(function () { return styleSetToEmotionObjects(styleToEmotionObject, _objectSpread(_objectSpread({}, styleSet || (0, _createStyleSet.default)(styleOptions)), extraStyleSet)); }, [extraStyleSet, styleOptions, styleSet, styleToEmotionObject]); var webSpeechPonyfill = (0, _react.useMemo)(function () { var ponyfill = webSpeechPonyfillFactory && webSpeechPonyfillFactory({ referenceGrammarID: referenceGrammarID }); var _ref2 = ponyfill || {}, speechSynthesis = _ref2.speechSynthesis, SpeechSynthesisUtterance = _ref2.SpeechSynthesisUtterance; return _objectSpread(_objectSpread({}, ponyfill), {}, { speechSynthesis: speechSynthesis || _BypassSpeechSynthesisPonyfill.speechSynthesis, SpeechSynthesisUtterance: SpeechSynthesisUtterance || _BypassSpeechSynthesisPonyfill.SpeechSynthesisUtterance }); }, [referenceGrammarID, webSpeechPonyfillFactory]); var scrollPositionObserversRef = (0, _react.useRef)([]); var _useState3 = (0, _react.useState)(0), _useState4 = _slicedToArray(_useState3, 2), numScrollPositionObservers = _useState4[0], setNumScrollPositionObservers = _useState4[1]; var dispatchScrollPosition = (0, _react.useCallback)(function (event) { return scrollPositionObserversRef.current.forEach(function (observer) { return observer(event); }); }, [scrollPositionObserversRef]); var observeScrollPosition = (0, _react.useCallback)(function (observer) { scrollPositionObserversRef.current = [].concat(_toConsumableArray(scrollPositionObserversRef.current), [observer]); setNumScrollPositionObservers(scrollPositionObserversRef.current.length); return function () { scrollPositionObserversRef.current = scrollPositionObserversRef.current.filter(function (target) { return target !== observer; }); setNumScrollPositionObservers(scrollPositionObserversRef.current.length); }; }, [scrollPositionObserversRef, setNumScrollPositionObservers]); var transcriptFocusObserversRef = (0, _react.useRef)([]); var _useState5 = (0, _react.useState)(0), _useState6 = _slicedToArray(_useState5, 2), numTranscriptFocusObservers = _useState6[0], setNumTranscriptFocusObservers = _useState6[1]; var dispatchTranscriptFocus = (0, _react.useCallback)(function (event) { return transcriptFocusObserversRef.current.forEach(function (observer) { return observer(event); }); }, [transcriptFocusObserversRef]); var observeTranscriptFocus = (0, _react.useCallback)(function (observer) { transcriptFocusObserversRef.current = [].concat(_toConsumableArray(transcriptFocusObserversRef.current), [observer]); setNumTranscriptFocusObservers(transcriptFocusObserversRef.current.length); return function () { transcriptFocusObserversRef.current = transcriptFocusObserversRef.current.filter(function (target) { return target !== observer; }); setNumTranscriptFocusObservers(transcriptFocusObserversRef.current.length); }; }, [transcriptFocusObserversRef, setNumTranscriptFocusObservers]); var context = (0, _react.useMemo)(function () { return { dictateAbortable: dictateAbortable, dispatchScrollPosition: dispatchScrollPosition, dispatchTranscriptFocus: dispatchTranscriptFocus, focusSendBoxCallbacksRef: focusSendBoxCallbacksRef, focusTranscriptCallbacksRef: focusTranscriptCallbacksRef, internalMarkdownItState: [internalMarkdownIt], internalRenderMarkdownInline: internalRenderMarkdownInline, nonce: nonce, numScrollPositionObservers: numScrollPositionObservers, numTranscriptFocusObservers: numTranscriptFocusObservers, observeScrollPosition: observeScrollPosition, observeTranscriptFocus: observeTranscriptFocus, renderMarkdown: renderMarkdown, scrollRelativeCallbacksRef: scrollRelativeCallbacksRef, scrollToCallbacksRef: scrollToCallbacksRef, scrollToEndCallbacksRef: scrollToEndCallbacksRef, setDictateAbortable: setDictateAbortable, styleSet: patchedStyleSet, styleToEmotionObject: styleToEmotionObject, suggestedActionsAccessKey: suggestedActionsAccessKey, webSpeechPonyfill: webSpeechPonyfill }; }, [dictateAbortable, dispatchScrollPosition, dispatchTranscriptFocus, focusSendBoxCallbacksRef, focusTranscriptCallbacksRef, internalMarkdownIt, internalRenderMarkdownInline, nonce, numScrollPositionObservers, numTranscriptFocusObservers, observeScrollPosition, observeTranscriptFocus, patchedStyleSet, renderMarkdown, scrollRelativeCallbacksRef, scrollToCallbacksRef, scrollToEndCallbacksRef, setDictateAbortable, styleToEmotionObject, suggestedActionsAccessKey, webSpeechPonyfill]); return /*#__PURE__*/_react.default.createElement(_reactSay.Composer, { ponyfill: webSpeechPonyfill }, /*#__PURE__*/_react.default.createElement(_WebChatUIContext.default.Provider, { value: context }, children, /*#__PURE__*/_react.default.createElement(_Dictation.default, { onError: dictationOnError }))); }; ComposerCore.defaultProps = { extraStyleSet: undefined, nonce: undefined, renderMarkdown: undefined, styleSet: undefined, suggestedActionsAccessKey: 'A a Å å', webSpeechPonyfillFactory: undefined }; ComposerCore.propTypes = { extraStyleSet: _propTypes.default.any, nonce: _propTypes.default.string, renderMarkdown: _propTypes.default.func, styleSet: _propTypes.default.any, suggestedActionsAccessKey: _propTypes.default.oneOfType([_propTypes.default.oneOf([false]), _propTypes.default.string]), webSpeechPonyfillFactory: _propTypes.default.func }; var Composer = function Composer(_ref3) { var activityMiddleware = _ref3.activityMiddleware, activityStatusMiddleware = _ref3.activityStatusMiddleware, attachmentForScreenReaderMiddleware = _ref3.attachmentForScreenReaderMiddleware, attachmentMiddleware = _ref3.attachmentMiddleware, avatarMiddleware = _ref3.avatarMiddleware, cardActionMiddleware = _ref3.cardActionMiddleware, children = _ref3.children, extraStyleSet = _ref3.extraStyleSet, renderMarkdown = _ref3.renderMarkdown, styleSet = _ref3.styleSet, suggestedActionsAccessKey = _ref3.suggestedActionsAccessKey, toastMiddleware = _ref3.toastMiddleware, typingIndicatorMiddleware = _ref3.typingIndicatorMiddleware, webSpeechPonyfillFactory = _ref3.webSpeechPonyfillFactory, composerProps = _objectWithoutProperties(_ref3, ["activityMiddleware", "activityStatusMiddleware", "attachmentForScreenReaderMiddleware", "attachmentMiddleware", "avatarMiddleware", "cardActionMiddleware", "children", "extraStyleSet", "renderMarkdown", "styleSet", "suggestedActionsAccessKey", "toastMiddleware", "typingIndicatorMiddleware", "webSpeechPonyfillFactory"]); var nonce = composerProps.nonce, onTelemetry = composerProps.onTelemetry; var patchedActivityMiddleware = (0, _react.useMemo)(function () { return [].concat(_toConsumableArray((0, _singleToArray.default)(activityMiddleware)), _toConsumableArray((0, _createCoreMiddleware.default)())); }, [activityMiddleware]); var patchedActivityStatusMiddleware = (0, _react.useMemo)(function () { return [].concat(_toConsumableArray((0, _singleToArray.default)(activityStatusMiddleware)), _toConsumableArray((0, _createCoreMiddleware2.default)())); }, [activityStatusMiddleware]); var patchedAttachmentForScreenReaderMiddleware = (0, _react.useMemo)(function () { return [].concat(_toConsumableArray((0, _singleToArray.default)(attachmentForScreenReaderMiddleware)), _toConsumableArray((0, _createCoreMiddleware3.default)())); }, [attachmentForScreenReaderMiddleware]); var patchedAttachmentMiddleware = (0, _react.useMemo)(function () { return [].concat(_toConsumableArray((0, _singleToArray.default)(attachmentMiddleware)), _toConsumableArray((0, _createCoreMiddleware4.default)())); }, [attachmentMiddleware]); var patchedAvatarMiddleware = (0, _react.useMemo)(function () { return [].concat(_toConsumableArray((0, _singleToArray.default)(avatarMiddleware)), _toConsumableArray((0, _createCoreMiddleware5.default)())); }, [avatarMiddleware]); var patchedCardActionMiddleware = (0, _react.useMemo)(function () { return [].concat(_toConsumableArray((0, _singleToArray.default)(cardActionMiddleware)), _toConsumableArray((0, _createCoreMiddleware6.default)())); }, [cardActionMiddleware]); var patchedToastMiddleware = (0, _react.useMemo)(function () { return [].concat(_toConsumableArray((0, _singleToArray.default)(toastMiddleware)), _toConsumableArray((0, _createCoreMiddleware7.default)())); }, [toastMiddleware]); var patchedTypingIndicatorMiddleware = (0, _react.useMemo)(function () { return [].concat(_toConsumableArray((0, _singleToArray.default)(typingIndicatorMiddleware)), _toConsumableArray((0, _createCoreMiddleware8.default)())); }, [typingIndicatorMiddleware]); return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement(_botframeworkWebchatApi.Composer, _extends({ activityMiddleware: patchedActivityMiddleware, activityStatusMiddleware: patchedActivityStatusMiddleware, attachmentForScreenReaderMiddleware: patchedAttachmentForScreenReaderMiddleware, attachmentMiddleware: patchedAttachmentMiddleware, avatarMiddleware: patchedAvatarMiddleware, cardActionMiddleware: patchedCardActionMiddleware, downscaleImageToDataURL: _downscaleImageToDataURL.default // Under dev server of create-react-app, "NODE_ENV" will be set to "development". , internalErrorBoxClass: node_env === 'development' ? _ErrorBox.default : undefined, nonce: nonce, toastMiddleware: patchedToastMiddleware, typingIndicatorMiddleware: patchedTypingIndicatorMiddleware }, composerProps), /*#__PURE__*/_react.default.createElement(ComposerCore, { extraStyleSet: extraStyleSet, nonce: nonce, renderMarkdown: renderMarkdown, styleSet: styleSet, suggestedActionsAccessKey: suggestedActionsAccessKey, webSpeechPonyfillFactory: webSpeechPonyfillFactory }, children, onTelemetry && /*#__PURE__*/_react.default.createElement(_UITracker.default, null)))); }; Composer.defaultProps = _objectSpread(_objectSpread(_objectSpread({}, _botframeworkWebchatApi.Composer.defaultProps), ComposerCore.defaultProps), {}, { activityMiddleware: undefined, activityRenderer: undefined, activityStatusMiddleware: undefined, activityStatusRenderer: undefined, attachmentForScreenReaderMiddleware: undefined, attachmentMiddleware: undefined, attachmentRenderer: undefined, avatarMiddleware: undefined, avatarRenderer: undefined, cardActionMiddleware: undefined, children: undefined, nonce: undefined, renderMarkdown: undefined, toastMiddleware: undefined, toastRenderer: undefined, typingIndicatorMiddleware: undefined, typingIndicatorRenderer: undefined, webSpeechPonyfillFactory: undefined }); Composer.propTypes = _objectSpread(_objectSpread(_objectSpread({}, _botframeworkWebchatApi.Composer.propTypes), ComposerCore.propTypes), {}, { activityMiddleware: _propTypes.default.oneOfType([_propTypes.default.arrayOf(_propTypes.default.func), _propTypes.default.func]), activityRenderer: _propTypes.default.func, activityStatusMiddleware: _propTypes.default.oneOfType([_propTypes.default.arrayOf(_propTypes.default.func), _propTypes.default.func]), activityStatusRenderer: _propTypes.default.func, attachmentForScreenReaderMiddleware: _propTypes.default.oneOfType([_propTypes.default.arrayOf(_propTypes.default.func), _propTypes.default.func]), attachmentMiddleware: _propTypes.default.oneOfType([_propTypes.default.arrayOf(_propTypes.default.func), _propTypes.default.func]), attachmentRenderer: _propTypes.default.func, avatarMiddleware: _propTypes.default.oneOfType([_propTypes.default.arrayOf(_propTypes.default.func), _propTypes.default.func]), avatarRenderer: _propTypes.default.func, cardActionMiddleware: _propTypes.default.func, children: _propTypes.default.any, nonce: _propTypes.default.string, renderMarkdown: _propTypes.default.func, toastMiddleware: _propTypes.default.oneOfType([_propTypes.default.arrayOf(_propTypes.default.func), _propTypes.default.func]), toastRenderer: _propTypes.default.func, typingIndicatorMiddleware: _propTypes.default.oneOfType([_propTypes.default.arrayOf(_propTypes.default.func), _propTypes.default.func]), typingIndicatorRenderer: _propTypes.default.func, webSpeechPonyfillFactory: _propTypes.default.func }); var _default = Composer; exports.default = _default; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9Db21wb3Nlci5qcyJdLCJuYW1lcyI6WyJ1c2VSZWZlcmVuY2VHcmFtbWFySUQiLCJob29rcyIsInVzZVN0eWxlT3B0aW9ucyIsIm5vZGVfZW52IiwiZW1vdGlvblBvb2wiLCJzdHlsZVNldFRvRW1vdGlvbk9iamVjdHMiLCJzdHlsZVRvRW1vdGlvbk9iamVjdCIsInN0eWxlU2V0Iiwic3R5bGUiLCJrZXkiLCJDb21wb3NlckNvcmUiLCJjaGlsZHJlbiIsImV4dHJhU3R5bGVTZXQiLCJub25jZSIsInJlbmRlck1hcmtkb3duIiwic3VnZ2VzdGVkQWN0aW9uc0FjY2Vzc0tleSIsIndlYlNwZWVjaFBvbnlmaWxsRmFjdG9yeSIsImRpY3RhdGVBYm9ydGFibGUiLCJzZXREaWN0YXRlQWJvcnRhYmxlIiwicmVmZXJlbmNlR3JhbW1hcklEIiwic3R5bGVPcHRpb25zIiwiZm9jdXNTZW5kQm94Q2FsbGJhY2tzUmVmIiwiZm9jdXNUcmFuc2NyaXB0Q2FsbGJhY2tzUmVmIiwiaW50ZXJuYWxNYXJrZG93bkl0IiwiTWFya2Rvd25JdCIsInNjcm9sbFRvQ2FsbGJhY2tzUmVmIiwic2Nyb2xsVG9FbmRDYWxsYmFja3NSZWYiLCJzY3JvbGxSZWxhdGl2ZUNhbGxiYWNrc1JlZiIsImRpY3RhdGlvbk9uRXJyb3IiLCJlcnIiLCJjb25zb2xlIiwiZXJyb3IiLCJpbnRlcm5hbFJlbmRlck1hcmtkb3duSW5saW5lIiwibWFya2Rvd24iLCJ0cmVlIiwicGFyc2VJbmxpbmUiLCJwYXRjaGVkVHJlZSIsInJlbmRlcmVyIiwicmVuZGVyIiwiZW1vdGlvbiIsImNzcyIsInBhdGNoZWRTdHlsZVNldCIsIndlYlNwZWVjaFBvbnlmaWxsIiwicG9ueWZpbGwiLCJzcGVlY2hTeW50aGVzaXMiLCJTcGVlY2hTeW50aGVzaXNVdHRlcmFuY2UiLCJieXBhc3NTcGVlY2hTeW50aGVzaXMiLCJCeXBhc3NTcGVlY2hTeW50aGVzaXNVdHRlcmFuY2UiLCJzY3JvbGxQb3NpdGlvbk9ic2VydmVyc1JlZiIsIm51bVNjcm9sbFBvc2l0aW9uT2JzZXJ2ZXJzIiwic2V0TnVtU2Nyb2xsUG9zaXRpb25PYnNlcnZlcnMiLCJkaXNwYXRjaFNjcm9sbFBvc2l0aW9uIiwiZXZlbnQiLCJjdXJyZW50IiwiZm9yRWFjaCIsIm9ic2VydmVyIiwib2JzZXJ2ZVNjcm9sbFBvc2l0aW9uIiwibGVuZ3RoIiwiZmlsdGVyIiwidGFyZ2V0IiwidHJhbnNjcmlwdEZvY3VzT2JzZXJ2ZXJzUmVmIiwibnVtVHJhbnNjcmlwdEZvY3VzT2JzZXJ2ZXJzIiwic2V0TnVtVHJhbnNjcmlwdEZvY3VzT2JzZXJ2ZXJzIiwiZGlzcGF0Y2hUcmFuc2NyaXB0Rm9jdXMiLCJvYnNlcnZlVHJhbnNjcmlwdEZvY3VzIiwiY29udGV4dCIsImludGVybmFsTWFya2Rvd25JdFN0YXRlIiwiZGVmYXVsdFByb3BzIiwidW5kZWZpbmVkIiwicHJvcFR5cGVzIiwiUHJvcFR5cGVzIiwiYW55Iiwic3RyaW5nIiwiZnVuYyIsIm9uZU9mVHlwZSIsIm9uZU9mIiwiQ29tcG9zZXIiLCJhY3Rpdml0eU1pZGRsZXdhcmUiLCJhY3Rpdml0eVN0YXR1c01pZGRsZXdhcmUiLCJhdHRhY2htZW50Rm9yU2NyZWVuUmVhZGVyTWlkZGxld2FyZSIsImF0dGFjaG1lbnRNaWRkbGV3YXJlIiwiYXZhdGFyTWlkZGxld2FyZSIsImNhcmRBY3Rpb25NaWRkbGV3YXJlIiwidG9hc3RNaWRkbGV3YXJlIiwidHlwaW5nSW5kaWNhdG9yTWlkZGxld2FyZSIsImNvbXBvc2VyUHJvcHMiLCJvblRlbGVtZXRyeSIsInBhdGNoZWRBY3Rpdml0eU1pZGRsZXdhcmUiLCJwYXRjaGVkQWN0aXZpdHlTdGF0dXNNaWRkbGV3YXJlIiwicGF0Y2hlZEF0dGFjaG1lbnRGb3JTY3JlZW5SZWFkZXJNaWRkbGV3YXJlIiwicGF0Y2hlZEF0dGFjaG1lbnRNaWRkbGV3YXJlIiwicGF0Y2hlZEF2YXRhck1pZGRsZXdhcmUiLCJwYXRjaGVkQ2FyZEFjdGlvbk1pZGRsZXdhcmUiLCJwYXRjaGVkVG9hc3RNaWRkbGV3YXJlIiwicGF0Y2hlZFR5cGluZ0luZGljYXRvck1pZGRsZXdhcmUiLCJkb3duc2NhbGVJbWFnZVRvRGF0YVVSTCIsIkVycm9yQm94IiwiQVBJQ29tcG9zZXIiLCJhY3Rpdml0eVJlbmRlcmVyIiwiYWN0aXZpdHlTdGF0dXNSZW5kZXJlciIsImF0dGFjaG1lbnRSZW5kZXJlciIsImF2YXRhclJlbmRlcmVyIiwidG9hc3RSZW5kZXJlciIsInR5cGluZ0luZGljYXRvclJlbmRlcmVyIiwiYXJyYXlPZiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBQUE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBRUE7O0FBSUE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7SUFFUUEscUIsR0FBMkNDLDZCLENBQTNDRCxxQjtJQUF1QkUsZSxHQUFvQkQsNkIsQ0FBcEJDLGUsRUFFL0I7O0FBQ0EsSUFBTUMsUUFBUSxHQUFHLHlCQUFqQjtBQUVBLElBQU1DLFdBQVcsR0FBRyxFQUFwQjs7QUFFQSxTQUFTQyx3QkFBVCxDQUFrQ0Msb0JBQWxDLEVBQXdEQyxRQUF4RCxFQUFrRTtBQUNoRSxTQUFPLHFCQUFPQSxRQUFQLEVBQWlCLFVBQUNDLEtBQUQsRUFBUUMsR0FBUjtBQUFBLFdBQWlCQSxHQUFHLEtBQUssU0FBUixHQUFvQkQsS0FBcEIsR0FBNEJGLG9CQUFvQixDQUFDRSxLQUFELENBQWpFO0FBQUEsR0FBakIsQ0FBUDtBQUNEOztBQUVELElBQU1FLFlBQVksR0FBRyxTQUFmQSxZQUFlLE9BUWY7QUFBQSxNQVBKQyxRQU9JLFFBUEpBLFFBT0k7QUFBQSxNQU5KQyxhQU1JLFFBTkpBLGFBTUk7QUFBQSxNQUxKQyxLQUtJLFFBTEpBLEtBS0k7QUFBQSxNQUpKQyxjQUlJLFFBSkpBLGNB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a0MsT0FBVixDQUFrQmxDLG1CQUFVRyxJQUE1QixDQUFELEVBQW9DSCxtQkFBVUcsSUFBOUMsQ0FBcEIsQ0FoQm5CO0FBaUJFNkIsRUFBQUEsYUFBYSxFQUFFaEMsbUJBQVVHLElBakIzQjtBQWtCRVcsRUFBQUEseUJBQXlCLEVBQUVkLG1CQUFVSSxTQUFWLENBQW9CLENBQUNKLG1CQUFVa0MsT0FBVixDQUFrQmxDLG1CQUFVRyxJQUE1QixDQUFELEVBQW9DSCxtQkFBVUcsSUFBOUMsQ0FBcEIsQ0FsQjdCO0FBbUJFOEIsRUFBQUEsdUJBQXVCLEVBQUVqQyxtQkFBVUcsSUFuQnJDO0FBb0JFekQsRUFBQUEsd0JBQXdCLEVBQUVzRCxtQkFBVUc7QUFwQnRDO2VBdUJlRyxRIiwic291cmNlUm9vdCI6ImNvbXBvbmVudDovLy8iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb3NlciBhcyBBUElDb21wb3NlciwgaG9va3MgfSBmcm9tICdib3RmcmFtZXdvcmstd2ViY2hhdC1hcGknO1xuaW1wb3J0IHsgQ29tcG9zZXIgYXMgU2F5Q29tcG9zZXIgfSBmcm9tICdyZWFjdC1zYXknO1xuaW1wb3J0IGNyZWF0ZUVtb3Rpb24gZnJvbSAnY3JlYXRlLWVtb3Rpb24nO1xuaW1wb3J0IGNyZWF0ZVN0eWxlU2V0IGZyb20gJy4vU3R5bGVzL2NyZWF0ZVN0eWxlU2V0JztcbmltcG9ydCBNYXJrZG93bkl0IGZyb20gJ21hcmtkb3duLWl0JztcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5pbXBvcnQgUmVhY3QsIHsgdXNlQ2FsbGJhY2ssIHVzZU1lbW8sIHVzZVJlZiwgdXNlU3RhdGUgfSBmcm9tICdyZWFjdCc7XG5cbmltcG9ydCB7XG4gIHNwZWVjaFN5bnRoZXNpcyBhcyBieXBhc3NTcGVlY2hTeW50aGVzaXMsXG4gIFNwZWVjaFN5bnRoZXNpc1V0dGVyYW5jZSBhcyBCeXBhc3NTcGVlY2hTeW50aGVzaXNVdHRlcmFuY2Vcbn0gZnJvbSAnLi9ob29rcy9pbnRlcm5hbC9CeXBhc3NTcGVlY2hTeW50aGVzaXNQb255ZmlsbCc7XG5pbXBvcnQgYWRkVGFyZ2V0QmxhbmtUb0h5cGVybGlua3NNYXJrZG93biBmcm9tICcuL1V0aWxzL2FkZFRhcmdldEJsYW5rVG9IeXBlcmxpbmtzTWFya2Rvd24nO1xuaW1wb3J0IGNyZWF0ZUNTU0tleSBmcm9tICcuL1V0aWxzL2NyZWF0ZUNTU0tleSc7XG5pbXBvcnQgY3JlYXRlRGVmYXVsdEFjdGl2aXR5TWlkZGxld2FyZSBmcm9tICcuL01pZGRsZXdhcmUvQWN0aXZpdHkvY3JlYXRlQ29yZU1pZGRsZXdhcmUnO1xuaW1wb3J0IGNyZWF0ZURlZmF1bHRBY3Rpdml0eVN0YXR1c01pZGRsZXdhcmUgZnJvbSAnLi9NaWRkbGV3YXJlL0FjdGl2aXR5U3RhdHVzL2NyZWF0ZUNvcmVNaWRkbGV3YXJlJztcbmltcG9ydCBjcmVhdGVEZWZhdWx0QXR0YWNobWVudEZvclNjcmVlblJlYWRlck1pZGRsZXdhcmUgZnJvbSAnLi9NaWRkbGV3YXJlL0F0dGFjaG1lbnRGb3JTY3JlZW5SZWFkZXIvY3JlYXRlQ29yZU1pZGRsZXdhcmUnO1xuaW1wb3J0IGNyZWF0ZURlZmF1bHRBdHRhY2htZW50TWlkZGxld2FyZSBmcm9tICcuL01pZGRsZXdhcmUvQXR0YWNobWVudC9jcmVhdGVDb3JlTWlkZGxld2FyZSc7XG5pbXBvcnQgY3JlYXRlRGVmYXVsdEF2YXRhck1pZGRsZXdhcmUgZnJvbSAnLi9NaWRkbGV3YXJlL0F2YXRhci9jcmVhdGVDb3JlTWlkZGxld2FyZSc7XG5pbXBvcnQgY3JlYXRlRGVmYXVsdENhcmRBY3Rpb25NaWRkbGV3YXJlIGZyb20gJy4vTWlkZGxld2FyZS9DYXJkQWN0aW9uL2NyZWF0ZUNvcmVNaWRkbGV3YXJlJztcbmltcG9ydCBjcmVhdGVEZWZhdWx0VG9hc3RNaWRkbGV3YXJlIGZyb20gJy4vTWlkZGxld2FyZS9Ub2FzdC9jcmVhdGVDb3JlTWlkZGxld2FyZSc7XG5pbXBvcnQgY3JlYXRlRGVmYXVsdFR5cGluZ0luZGljYXRvck1pZGRsZXdhcmUgZnJvbSAnLi9NaWRkbGV3YXJlL1R5cGluZ0luZGljYXRvci9jcmVhdGVDb3JlTWlkZGxld2FyZSc7XG5pbXBvcnQgRGljdGF0aW9uIGZyb20gJy4vRGljdGF0aW9uJztcbmltcG9ydCBkb3duc2NhbGVJbWFnZVRvRGF0YVVSTCBmcm9tICcuL1V0aWxzL2Rvd25zY2FsZUltYWdlVG9EYXRhVVJMJztcbmltcG9ydCBFcnJvckJveCBmcm9tICcuL0Vycm9yQm94JztcbmltcG9ydCBtYXBNYXAgZnJvbSAnLi9VdGlscy9tYXBNYXAnO1xuaW1wb3J0IHNpbmdsZVRvQXJyYXkgZnJvbSAnLi9VdGlscy9zaW5nbGVUb0FycmF5JztcbmltcG9ydCBVSVRyYWNrZXIgZnJvbSAnLi9ob29rcy9pbnRlcm5hbC9VSVRyYWNrZXInO1xuaW1wb3J0IFdlYkNoYXRVSUNvbnRleHQgZnJvbSAnLi9ob29rcy9pbnRlcm5hbC9XZWJDaGF0VUlDb250ZXh0JztcblxuY29uc3QgeyB1c2VSZWZlcmVuY2VHcmFtbWFySUQsIHVzZVN0eWxlT3B0aW9ucyB9ID0gaG9va3M7XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bmRlZlxuY29uc3Qgbm9kZV9lbnYgPSBwcm9jZXNzLmVudi5ub2RlX2VudiB8fCBwcm9jZXNzLmVudi5OT0RFX0VOVjtcblxuY29uc3QgZW1vdGlvblBvb2wgPSB7fTtcblxuZnVuY3Rpb24gc3R5bGVTZXRUb0Vtb3Rpb25PYmplY3RzKHN0eWxlVG9FbW90aW9uT2JqZWN0LCBzdHlsZVNldCkge1xuICByZXR1cm4gbWFwTWFwKHN0eWxlU2V0LCAoc3R5bGUsIGtleSkgPT4gKGtleSA9PT0gJ29wdGlvbnMnID8gc3R5bGUgOiBzdHlsZVRvRW1vdGlvbk9iamVjdChzdHlsZSkpKTtcbn1cblxuY29uc3QgQ29tcG9zZXJDb3JlID0gKHtcbiAgY2hpbGRyZW4sXG4gIGV4dHJhU3R5bGVTZXQsXG4gIG5vbmNlLFxuICByZW5kZXJNYXJrZG93bixcbiAgc3R5bGVTZXQsXG4gIHN1Z2dlc3RlZEFjdGlvbnNBY2Nlc3NLZXksXG4gIHdlYlNwZWVjaFBvbnlmaWxsRmFjdG9yeVxufSkgPT4ge1xuICBjb25zdCBbZGljdGF0ZUFib3J0YWJsZSwgc2V0RGljdGF0ZUFib3J0YWJsZV0gPSB1c2VTdGF0ZSgpO1xuICBjb25zdCBbcmVmZXJlbmNlR3JhbW1hcklEXSA9IHVzZVJlZmVyZW5jZUdyYW1tYXJJRCgpO1xuICBjb25zdCBbc3R5bGVPcHRpb25zXSA9IHVzZVN0eWxlT3B0aW9ucygpO1xuICBjb25zdCBmb2N1c1NlbmRCb3hDYWxsYmFja3NSZWYgPSB1c2VSZWYoW10pO1xuICBjb25zdCBmb2N1c1RyYW5zY3JpcHRDYWxsYmFja3NSZWYgPSB1c2VSZWYoW10pO1xuICBjb25zdCBpbnRlcm5hbE1hcmtkb3duSXQgPSB1c2VNZW1vKCgpID0+IG5ldyBNYXJrZG93bkl0KCksIFtdKTtcbiAgY29uc3Qgc2Nyb2xsVG9DYWxsYmFja3NSZWYgPSB1c2VSZWYoW10pO1xuICBjb25zdCBzY3JvbGxUb0VuZENhbGxiYWNrc1JlZiA9IHVzZVJlZihbXSk7XG5cbiAgLy8gSW5zdGVhZCBvZiBoYXZpbmcgYSBgc2Nyb2xsVXBDYWxsYmFja3NSZWZgIGFuZCBgc2Nyb2xsRG93bkNhbGxiYWNrc1JlZmAsIHRoZXkgYXJlIGNvbWJpbmVkIGludG8gYSBzaW5nbGUgYHNjcm9sbFJlbGF0aXZlQ2FsbGJhY2tzUmVmYC5cbiAgLy8gVGhlIGZpcnN0IGFyZ3VtZW50IHRlbGxzIHdoZXRoZXIgaXQgc2hvdWxkIGdvIFwidXBcIiBvciBcImRvd25cIi5cbiAgY29uc3Qgc2Nyb2xsUmVsYXRpdmVDYWxsYmFja3NSZWYgPSB1c2VSZWYoW10pO1xuXG4gIGNvbnN0IGRpY3RhdGlvbk9uRXJyb3IgPSB1c2VDYWxsYmFjayhlcnIgPT4ge1xuICAgIGNvbnNvbGUuZXJyb3IoZXJyKTtcbiAgfSwgW10pO1xuXG4gIGNvbnN0IGludGVybmFsUmVuZGVyTWFya2Rvd25JbmxpbmUgPSB1c2VNZW1vKFxuICAgICgpID0+IG1hcmtkb3duID0+IHtcbiAgICAgIGNvbnN0IHRyZWUgPSBpbnRlcm5hbE1hcmtkb3duSXQucGFyc2VJbmxpbmUobWFya2Rvd24pO1xuXG4gICAgICAvLyBXZSBzaG91bGQgYWRkIHJlbD1cIm5vb3BlbmVyIG5vcmVmZXJyZXJcIiBhbmQgdGFyZ2V0PVwiX2JsYW5rXCJcbiAgICAgIGNvbnN0IHBhdGNoZWRUcmVlID0gYWRkVGFyZ2V0QmxhbmtUb0h5cGVybGlua3NNYXJrZG93bih0cmVlKTtcblxuICAgICAgcmV0dXJuIGludGVybmFsTWFya2Rvd25JdC5yZW5kZXJlci5yZW5kZXIocGF0Y2hlZFRyZWUpO1xuICAgIH0sXG4gICAgW2ludGVybmFsTWFya2Rvd25JdF1cbiAgKTtcblxuICBjb25zdCBzdHlsZVRvRW1vdGlvbk9iamVjdCA9IHVzZU1lbW8oKCkgPT4ge1xuICAgIC8vIEVtb3Rpb24gZG9lc24ndCBoYXNoIHdpdGggbm9uY2UuIFdlIG5lZWQgdG8gcHJvdmlkZSB0aGUgcG9vbGluZyBtZWNoYW5pc20uXG4gICAgLy8gMS4gSWYgMiBpbnN0YW5jZXMgdXNlIGRpZmZlcmVudCBub25jZSwgdGhleSBzaG91bGQgcmVzdWx0IGluIGRpZmZlcmVudCBoYXNoO1xuICAgIC8vIDIuIElmIDIgaW5zdGFuY2VzIGFyZSBiZWluZyBtb3VudGVkLCBwb29saW5nIHdpbGwgbWFrZSBzdXJlIHdlIHJlbmRlciBvbmx5IDEgc2V0IG9mIDxzdHlsZT4gdGFncywgaW5zdGVhZCBvZiAyLlxuICAgIGNvbnN0IGVtb3Rpb24gPVxuICAgICAgZW1vdGlvblBvb2xbbm9uY2VdIHx8IChlbW90aW9uUG9vbFtub25jZV0gPSBjcmVhdGVFbW90aW9uKHsga2V5OiBgd2ViY2hhdC0tY3NzLSR7Y3JlYXRlQ1NTS2V5KCl9YCwgbm9uY2UgfSkpO1xuXG4gICAgcmV0dXJuIHN0eWxlID0+IGVtb3Rpb24uY3NzKHN0eWxlKTtcbiAgfSwgW25vbmNlXSk7XG5cbiAgY29uc3QgcGF0Y2hlZFN0eWxlU2V0ID0gdXNlTWVtbyhcbiAgICAoKSA9PlxuICAgICAgc3R5bGVTZXRUb0Vtb3Rpb25PYmplY3RzKHN0eWxlVG9FbW90aW9uT2JqZWN0LCB7XG4gICAgICAgIC4uLihzdHlsZVNldCB8fCBjcmVhdGVTdHlsZVNldChzdHlsZU9wdGlvbnMpKSxcbiAgICAgICAgLi4uZXh0cmFTdHlsZVNldFxuICAgICAgfSksXG4gICAgW2V4dHJhU3R5bGVTZXQsIHN0eWxlT3B0aW9ucywgc3R5bGVTZXQsIHN0eWxlVG9FbW90aW9uT2JqZWN0XVxuICApO1xuXG4gIGNvbnN0IHdlYlNwZWVjaFBvbnlmaWxsID0gdXNlTWVtbygoKSA9PiB7XG4gICAgY29uc3QgcG9ueWZpbGwgPSB3ZWJTcGVlY2hQb255ZmlsbEZhY3RvcnkgJiYgd2ViU3BlZWNoUG9ueWZpbGxGYWN0b3J5KHsgcmVmZXJlbmNlR3JhbW1hcklEIH0pO1xuICAgIGNvbnN0IHsgc3BlZWNoU3ludGhlc2lzLCBTcGVlY2hTeW50aGVzaXNVdHRlcmFuY2UgfSA9IHBvbnlmaWxsIHx8IHt9O1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnBvbnlmaWxsLFxuICAgICAgc3BlZWNoU3ludGhlc2lzOiBzcGVlY2hTeW50aGVzaXMgfHwgYnlwYXNzU3BlZWNoU3ludGhlc2lzLFxuICAgICAgU3BlZWNoU3ludGhlc2lzVXR0ZXJhbmNlOiBTcGVlY2hTeW50aGVzaXNVdHRlcmFuY2UgfHwgQnlwYXNzU3BlZWNoU3ludGhlc2lzVXR0ZXJhbmNlXG4gICAgfTtcbiAgfSwgW3JlZmVyZW5jZUdyYW1tYXJJRCwgd2ViU3BlZWNoUG9ueWZpbGxGYWN0b3J5XSk7XG5cbiAgY29uc3Qgc2Nyb2xsUG9zaXRpb25PYnNlcnZlcnNSZWYgPSB1c2VSZWYoW10pO1xuICBjb25zdCBbbnVtU2Nyb2xsUG9zaXRpb25PYnNlcnZlcnMsIHNldE51bVNjcm9sbFBvc2l0aW9uT2JzZXJ2ZXJzXSA9IHVzZVN0YXRlKDApO1xuXG4gIGNvbnN0IGRpc3BhdGNoU2Nyb2xsUG9zaXRpb24gPSB1c2VDYWxsYmFjayhcbiAgICBldmVudCA9PiBzY3JvbGxQb3NpdGlvbk9ic2VydmVyc1JlZi5jdXJyZW50LmZvckVhY2gob2JzZXJ2ZXIgPT4gb2JzZXJ2ZXIoZXZlbnQpKSxcbiAgICBbc2Nyb2xsUG9zaXRpb25PYnNlcnZlcnNSZWZdXG4gICk7XG5cbiAgY29uc3Qgb2JzZXJ2ZVNjcm9sbFBvc2l0aW9uID0gdXNlQ2FsbGJhY2soXG4gICAgb2JzZXJ2ZXIgPT4ge1xuICAgICAgc2Nyb2xsUG9zaXRpb25PYnNlcnZlcnNSZWYuY3VycmVudCA9IFsuLi5zY3JvbGxQb3NpdGlvbk9ic2VydmVyc1JlZi5jdXJyZW50LCBvYnNlcnZlcl07XG4gICAgICBzZXROdW1TY3JvbGxQb3NpdGlvbk9ic2VydmVycyhzY3JvbGxQb3NpdGlvbk9ic2VydmVyc1JlZi5jdXJyZW50Lmxlbmd0aCk7XG5cbiAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgIHNjcm9sbFBvc2l0aW9uT2JzZXJ2ZXJzUmVmLmN1cnJlbnQgPSBzY3JvbGxQb3NpdGlvbk9ic2VydmVyc1JlZi5jdXJyZW50LmZpbHRlcih0YXJnZXQgPT4gdGFyZ2V0ICE9PSBvYnNlcnZlcik7XG4gICAgICAgIHNldE51bVNjcm9sbFBvc2l0aW9uT2JzZXJ2ZXJzKHNjcm9sbFBvc2l0aW9uT2JzZXJ2ZXJzUmVmLmN1cnJlbnQubGVuZ3RoKTtcbiAgICAgIH07XG4gICAgfSxcbiAgICBbc2Nyb2xsUG9zaXRpb25PYnNlcnZlcnNSZWYsIHNldE51bVNjcm9sbFBvc2l0aW9uT2JzZXJ2ZXJzXVxuICApO1xuXG4gIGNvbnN0IHRyYW5zY3JpcHRGb2N1c09ic2VydmVyc1JlZiA9IHVzZVJlZihbXSk7XG4gIGNvbnN0IFtudW1UcmFuc2NyaXB0Rm9jdXNPYnNlcnZlcnMsIHNldE51bVRyYW5zY3JpcHRGb2N1c09ic2VydmVyc10gPSB1c2VTdGF0ZSgwKTtcblxuICBjb25zdCBkaXNwYXRjaFRyYW5zY3JpcHRGb2N1cyA9IHVzZUNhbGxiYWNrKFxuICAgIGV2ZW50ID0+IHRyYW5zY3JpcHRGb2N1c09ic2VydmVyc1JlZi5jdXJyZW50LmZvckVhY2gob2JzZXJ2ZXIgPT4gb2JzZXJ2ZXIoZXZlbnQpKSxcbiAgICBbdHJhbnNjcmlwdEZvY3VzT2JzZXJ2ZXJzUmVmXVxuICApO1xuXG4gIGNvbnN0IG9ic2VydmVUcmFuc2NyaXB0Rm9jdXMgPSB1c2VDYWxsYmFjayhcbiAgICBvYnNlcnZlciA9PiB7XG4gICAgICB0cmFuc2NyaXB0Rm9jdXNPYnNlcnZlcnNSZWYuY3VycmVudCA9IFsuLi50cmFuc2NyaXB0Rm9jdXNPYnNlcnZlcnNSZWYuY3VycmVudCwgb2JzZXJ2ZXJdO1xuICAgICAgc2V0TnVtVHJhbnNjcmlwdEZvY3VzT2JzZXJ2ZXJzKHRyYW5zY3JpcHRGb2N1c09ic2VydmVyc1JlZi5jdXJyZW50Lmxlbmd0aCk7XG5cbiAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgIHRyYW5zY3JpcHRGb2N1c09ic2VydmVyc1JlZi5jdXJyZW50ID0gdHJhbnNjcmlwdEZvY3VzT2JzZXJ2ZXJzUmVmLmN1cnJlbnQuZmlsdGVyKHRhcmdldCA9PiB0YXJnZXQgIT09IG9ic2VydmVyKTtcbiAgICAgICAgc2V0TnVtVHJhbnNjcmlwdEZvY3VzT2JzZXJ2ZXJzKHRyYW5zY3JpcHRGb2N1c09ic2VydmVyc1JlZi5jdXJyZW50Lmxlbmd0aCk7XG4gICAgICB9O1xuICAgIH0sXG4gICAgW3RyYW5zY3JpcHRGb2N1c09ic2VydmVyc1JlZiwgc2V0TnVtVHJhbnNjcmlwdEZvY3VzT2JzZXJ2ZXJzXVxuICApO1xuXG4gIGNvbnN0IGNvbnRleHQgPSB1c2VNZW1vKFxuICAgICgpID0+ICh7XG4gICAgICBkaWN0YXRlQWJvcnRhYmxlLFxuICAgICAgZGlzcGF0Y2hTY3JvbGxQb3NpdGlvbixcbiAgICAgIGRpc3BhdGNoVHJhbnNjcmlwdEZvY3VzLFxuICAgICAgZm9jdXNTZW5kQm94Q2FsbGJhY2tzUmVmLFxuICAgICAgZm9jdXNUcmFuc2NyaXB0Q2FsbGJhY2tzUmVmLFxuICAgICAgaW50ZXJuYWxNYXJrZG93bkl0U3RhdGU6IFtpbnRlcm5hbE1hcmtkb3duSXRdLFxuICAgICAgaW50ZXJuYWxSZW5kZXJNYXJrZG93bklubGluZSxcbiAgICAgIG5vbmNlLFxuICAgICAgbnVtU2Nyb2xsUG9zaXRpb25PYnNlcnZlcnMsXG4gICAgICBudW1UcmFuc2NyaXB0Rm9jdXNPYnNlcnZlcnMsXG4gICAgICBvYnNlcnZlU2Nyb2xsUG9zaXRpb24sXG4gICAgICBvYnNlcnZlVHJhbnNjcmlwdEZvY3VzLFxuICAgICAgcmVuZGVyTWFya2Rvd24sXG4gICAgICBzY3JvbGxSZWxhdGl2ZUNhbGxiYWNrc1JlZixcbiAgICAgIHNjcm9sbFRvQ2FsbGJhY2tzUmVmLFxuICAgICAgc2Nyb2xsVG9FbmRDYWxsYmFja3NSZWYsXG4gICAgICBzZXREaWN0YXRlQWJvcnRhYmxlLFxuICAgICAgc3R5bGVTZXQ6IHBhdGNoZWRTdHlsZVNldCxcbiAgICAgIHN0eWxlVG9FbW90aW9uT2JqZWN0LFxuICAgICAgc3VnZ2VzdGVkQWN0aW9uc0FjY2Vzc0tleSxcbiAgICAgIHdlYlNwZWVjaFBvbnlmaWxsXG4gICAgfSksXG4gICAgW1xuICAgICAgZGljdGF0ZUFib3J0YWJsZSxcbiAgICAgIGRpc3BhdGNoU2Nyb2xsUG9zaXRpb24sXG4gICAgICBkaXNwYXRjaFRyYW5zY3JpcHRGb2N1cyxcbiAgICAgIGZvY3VzU2VuZEJveENhbGxiYWNrc1JlZixcbiAgICAgIGZvY3VzVHJhbnNjcmlwdENhbGxiYWNrc1JlZixcbiAgICAgIGludGVybmFsTWFya2Rvd25JdCxcbiAgICAgIGludGVybmFsUmVuZGVyTWFya2Rvd25Jbm