UNPKG

botframework-webchat-component

Version:
332 lines (276 loc) 38.9 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.connectSuggestedActions = exports.default = void 0; var _botframeworkWebchatApi = require("botframework-webchat-api"); var _reactFilm = _interopRequireWildcard(require("react-film")); var _classnames = _interopRequireDefault(require("classnames")); var _propTypes = _interopRequireDefault(require("prop-types")); var _react = _interopRequireWildcard(require("react")); var _connectToWebChat = _interopRequireDefault(require("../connectToWebChat")); var _ScreenReaderText = _interopRequireDefault(require("../ScreenReaderText")); var _SuggestedAction = _interopRequireDefault(require("./SuggestedAction")); var _useLocalizeAccessKey = _interopRequireDefault(require("../hooks/internal/useLocalizeAccessKey")); var _useNonce3 = _interopRequireDefault(require("../hooks/internal/useNonce")); var _useStyleSet7 = _interopRequireDefault(require("../hooks/useStyleSet")); var _useStyleToEmotionObject = _interopRequireDefault(require("../hooks/internal/useStyleToEmotionObject")); var _useSuggestedActionsAccessKey = _interopRequireDefault(require("../hooks/internal/useSuggestedActionsAccessKey")); var _useUniqueId = _interopRequireDefault(require("../hooks/internal/useUniqueId")); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } 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 _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 useDirection = _botframeworkWebchatApi.hooks.useDirection, useLocalizer = _botframeworkWebchatApi.hooks.useLocalizer, useStyleOptions = _botframeworkWebchatApi.hooks.useStyleOptions; var ROOT_STYLE = { '&.webchat__suggested-actions': { '&.webchat__suggested-actions--flow-layout .webchat__suggested-actions__flow-box': { display: 'flex', flexWrap: 'wrap' }, '&.webchat__suggested-actions--stack-layout .webchat__suggested-actions__stack': { display: 'flex', flexDirection: 'column' } } }; function suggestedActionText(_ref) { var displayText = _ref.displayText, title = _ref.title, type = _ref.type, value = _ref.value; if (type === 'messageBack') { return title || displayText; } else if (title) { return title; } else if (typeof value === 'string') { return value; } return JSON.stringify(value); } var connectSuggestedActions = function connectSuggestedActions() { for (var _len = arguments.length, selectors = new Array(_len), _key = 0; _key < _len; _key++) { selectors[_key] = arguments[_key]; } return _connectToWebChat.default.apply(void 0, [function (_ref2) { var language = _ref2.language, suggestedActions = _ref2.suggestedActions; return { language: language, suggestedActions: suggestedActions }; }].concat(selectors)); }; exports.connectSuggestedActions = connectSuggestedActions; var SuggestedActionCarouselContainer = function SuggestedActionCarouselContainer(_ref3) { var children = _ref3.children, className = _ref3.className, screenReaderText = _ref3.screenReaderText; var _useStyleOptions = useStyleOptions(), _useStyleOptions2 = _slicedToArray(_useStyleOptions, 1), _useStyleOptions2$ = _useStyleOptions2[0], suggestedActionsCarouselFlipperBoxWidth = _useStyleOptions2$.suggestedActionsCarouselFlipperBoxWidth, suggestedActionsCarouselFlipperCursor = _useStyleOptions2$.suggestedActionsCarouselFlipperCursor, suggestedActionsCarouselFlipperSize = _useStyleOptions2$.suggestedActionsCarouselFlipperSize; var _useStyleSet = (0, _useStyleSet7.default)(), _useStyleSet2 = _slicedToArray(_useStyleSet, 1), suggestedActionsStyleSet = _useStyleSet2[0].suggestedActions; var _useDirection = useDirection(), _useDirection2 = _slicedToArray(_useDirection, 1), direction = _useDirection2[0]; var _useNonce = (0, _useNonce3.default)(), _useNonce2 = _slicedToArray(_useNonce, 1), nonce = _useNonce2[0]; var ariaLabelId = (0, _useUniqueId.default)('webchat__suggested-actions'); var rootClassName = (0, _useStyleToEmotionObject.default)()(ROOT_STYLE) + ''; var filmStyleSet = (0, _react.useMemo)(function () { return (0, _reactFilm.createBasicStyleSet)({ autoHide: false, cursor: suggestedActionsCarouselFlipperCursor, flipperBoxWidth: suggestedActionsCarouselFlipperBoxWidth, flipperSize: suggestedActionsCarouselFlipperSize }); }, [suggestedActionsCarouselFlipperBoxWidth, suggestedActionsCarouselFlipperCursor, suggestedActionsCarouselFlipperSize]); return ( /*#__PURE__*/ // TODO: The content of suggested actions should be the labelled by the activity. // That means, when the user focus into the suggested actions, it should read similar to "Bot said, what's your preference of today? Suggested actions has items: apple button, orange button, banana button." _react.default.createElement("div", { "aria-labelledby": ariaLabelId, "aria-live": "polite", className: (0, _classnames.default)('webchat__suggested-actions', 'webchat__suggested-actions--carousel-layout', { 'webchat__suggested-actions--rtl': direction === 'rtl' }, rootClassName, suggestedActionsStyleSet + '', (className || '') + ''), role: "status" }, /*#__PURE__*/_react.default.createElement(_ScreenReaderText.default, { id: ariaLabelId, text: screenReaderText }), !!children && !!_react.default.Children.count(children) && /*#__PURE__*/_react.default.createElement(_reactFilm.default, { autoCenter: false, className: "webchat__suggested-actions__carousel", dir: direction, flipperBlurFocusOnClick: true, nonce: nonce, showDots: false, showScrollBar: false, styleSet: filmStyleSet }, children)) ); }; SuggestedActionCarouselContainer.defaultProps = { children: undefined, className: undefined }; SuggestedActionCarouselContainer.propTypes = { children: _propTypes.default.any, className: _propTypes.default.string, screenReaderText: _propTypes.default.string.isRequired }; var SuggestedActionFlowContainer = function SuggestedActionFlowContainer(_ref4) { var children = _ref4.children, className = _ref4.className, screenReaderText = _ref4.screenReaderText; var _useStyleSet3 = (0, _useStyleSet7.default)(), _useStyleSet4 = _slicedToArray(_useStyleSet3, 1), suggestedActionsStyleSet = _useStyleSet4[0].suggestedActions; var ariaLabelId = (0, _useUniqueId.default)('webchat__suggested-actions'); var rootClassName = (0, _useStyleToEmotionObject.default)()(ROOT_STYLE) + ''; return /*#__PURE__*/_react.default.createElement("div", { "aria-labelledby": ariaLabelId, "aria-live": "polite", className: (0, _classnames.default)('webchat__suggested-actions', 'webchat__suggested-actions--flow-layout', rootClassName, suggestedActionsStyleSet + '', (className || '') + ''), role: "status" }, /*#__PURE__*/_react.default.createElement(_ScreenReaderText.default, { id: ariaLabelId, text: screenReaderText }), !!children && !!_react.default.Children.count(children) && /*#__PURE__*/_react.default.createElement("div", { className: "webchat__suggested-actions__flow-box" }, _react.default.Children.map(children, function (child) { return /*#__PURE__*/_react.default.createElement("div", { className: "webchat__suggested-actions__item" }, child); }))); }; SuggestedActionFlowContainer.defaultProps = { children: undefined, className: undefined }; SuggestedActionFlowContainer.propTypes = { children: _propTypes.default.any, className: _propTypes.default.string, screenReaderText: _propTypes.default.string.isRequired }; var SuggestedActionStackedContainer = function SuggestedActionStackedContainer(_ref5) { var children = _ref5.children, className = _ref5.className, screenReaderText = _ref5.screenReaderText; var _useStyleSet5 = (0, _useStyleSet7.default)(), _useStyleSet6 = _slicedToArray(_useStyleSet5, 1), suggestedActionsStyleSet = _useStyleSet6[0].suggestedActions; var ariaLabelId = (0, _useUniqueId.default)('webchat__suggested-actions'); var rootClassName = (0, _useStyleToEmotionObject.default)()(ROOT_STYLE) + ''; return /*#__PURE__*/_react.default.createElement("div", { "aria-labelledby": ariaLabelId, "aria-live": "polite", className: (0, _classnames.default)('webchat__suggested-actions', 'webchat__suggested-actions--stacked-layout', rootClassName, suggestedActionsStyleSet + '', (className || '') + ''), role: "status" }, /*#__PURE__*/_react.default.createElement(_ScreenReaderText.default, { id: ariaLabelId, text: screenReaderText }), !!children && !!_react.default.Children.count(children) && /*#__PURE__*/_react.default.createElement("div", { className: "webchat__suggested-actions__stack" }, children)); }; SuggestedActionStackedContainer.defaultProps = { children: undefined, className: undefined }; SuggestedActionStackedContainer.propTypes = { children: _propTypes.default.any, className: _propTypes.default.string, screenReaderText: _propTypes.default.string.isRequired }; var SuggestedActions = function SuggestedActions(_ref6) { var className = _ref6.className, _ref6$suggestedAction = _ref6.suggestedActions, suggestedActions = _ref6$suggestedAction === void 0 ? [] : _ref6$suggestedAction; var _useStyleOptions3 = useStyleOptions(), _useStyleOptions4 = _slicedToArray(_useStyleOptions3, 1), _useStyleOptions4$ = _useStyleOptions4[0], suggestedActionLayout = _useStyleOptions4$.suggestedActionLayout, suggestedActionsStackedLayoutButtonTextWrap = _useStyleOptions4$.suggestedActionsStackedLayoutButtonTextWrap; var _useSuggestedActionsA = (0, _useSuggestedActionsAccessKey.default)(), _useSuggestedActionsA2 = _slicedToArray(_useSuggestedActionsA, 1), accessKey = _useSuggestedActionsA2[0]; var localize = useLocalizer(); var localizeAccessKey = (0, _useLocalizeAccessKey.default)(); var screenReaderText = localize('SUGGESTED_ACTIONS_ALT', suggestedActions.length ? accessKey ? localize('SUGGESTED_ACTIONS_ALT_HAS_CONTENT_AND_ACCESS_KEY', localizeAccessKey(accessKey)) : localize('SUGGESTED_ACTIONS_ALT_HAS_CONTENT') : localize('SUGGESTED_ACTIONS_ALT_NO_CONTENT')); var children = suggestedActions.map(function (_ref7, index) { var displayText = _ref7.displayText, image = _ref7.image, imageAltText = _ref7.imageAltText, text = _ref7.text, title = _ref7.title, type = _ref7.type, value = _ref7.value; return /*#__PURE__*/_react.default.createElement(_SuggestedAction.default, { ariaHidden: true, buttonText: suggestedActionText({ displayText: displayText, title: title, type: type, value: value }), className: "webchat__suggested-actions__button", displayText: displayText, image: image, imageAlt: imageAltText, key: index, text: text, textClassName: suggestedActionLayout === 'stacked' && suggestedActionsStackedLayoutButtonTextWrap ? 'webchat__suggested-actions__button-text-stacked-text-wrap' : 'webchat__suggested-actions__button-text', type: type, value: value }); }); if (suggestedActionLayout === 'flow') { return /*#__PURE__*/_react.default.createElement(SuggestedActionFlowContainer, { className: className, screenReaderText: screenReaderText }, children); } else if (suggestedActionLayout === 'stacked') { return /*#__PURE__*/_react.default.createElement(SuggestedActionStackedContainer, { className: className, screenReaderText: screenReaderText }, children); } return /*#__PURE__*/_react.default.createElement(SuggestedActionCarouselContainer, { className: className, screenReaderText: screenReaderText }, children); }; SuggestedActions.defaultProps = { className: '' }; SuggestedActions.propTypes = { className: _propTypes.default.string, suggestedActions: _propTypes.default.arrayOf(_propTypes.default.shape({ displayText: _propTypes.default.string, image: _propTypes.default.string, imageAltText: _propTypes.default.string, text: _propTypes.default.string, title: _propTypes.default.string, type: _propTypes.default.string.isRequired, value: _propTypes.default.any })).isRequired }; var _default = connectSuggestedActions()(SuggestedActions); exports.default = _default; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9TZW5kQm94L1N1Z2dlc3RlZEFjdGlvbnMuanMiXSwibmFtZXMiOlsidXNlRGlyZWN0aW9uIiwiaG9va3MiLCJ1c2VMb2NhbGl6ZXIiLCJ1c2VTdHlsZU9wdGlvbnMiLCJST09UX1NUWUxFIiwiZGlzcGxheSIsImZsZXhXcmFwIiwiZmxleERpcmVjdGlvbiIsInN1Z2dlc3RlZEFjdGlvblRleHQiLCJkaXNwbGF5VGV4dCIsInRpdGxlIiwidHlwZSIsInZhbHVlIiwiSlNPTiIsInN0cmluZ2lmeSIsImNvbm5lY3RTdWdnZXN0ZWRBY3Rpb25zIiwic2VsZWN0b3JzIiwiY29ubmVjdFRvV2ViQ2hhdCIsImxhbmd1YWdlIiwic3VnZ2VzdGVkQWN0aW9ucyIsIlN1Z2dlc3RlZEFjdGlvbkNhcm91c2VsQ29udGFpbmVyIiwiY2hpbGRyZW4iLCJjbGFzc05hbWUiLCJzY3JlZW5SZWFkZXJUZXh0Iiwic3VnZ2VzdGVkQWN0aW9uc0Nhcm91c2VsRmxpcHBlckJveFdpZHRoIiwic3VnZ2VzdGVkQWN0aW9uc0Nhcm91c2VsRmxpcHBlckN1cnNvciIsInN1Z2dlc3RlZEFjdGlvbnNDYXJvdXNlbEZsaXBwZXJTaXplIiwic3VnZ2VzdGVkQWN0aW9uc1N0eWxlU2V0IiwiZGlyZWN0aW9uIiwibm9uY2UiLCJhcmlhTGFiZWxJZCIsInJvb3RDbGFzc05hbWUiLCJmaWxtU3R5bGVTZXQiLCJhdXRvSGlkZSIsImN1cnNvciIsImZsaXBwZXJCb3hXaWR0aCIsImZsaXBwZXJTaXplIiwiUmVhY3QiLCJDaGlsZHJlbiIsImNvdW50IiwiZGVmYXVsdFByb3BzIiwidW5kZWZpbmVkIiwicHJvcFR5cGVzIiwiUHJvcFR5cGVzIiwiYW55Iiwic3RyaW5nIiwiaXNSZXF1aXJlZCIsIlN1Z2dlc3RlZEFjdGlvbkZsb3dDb250YWluZXIiLCJtYXAiLCJjaGlsZCIsIlN1Z2dlc3RlZEFjdGlvblN0YWNrZWRDb250YWluZXIiLCJTdWdnZXN0ZWRBY3Rpb25zIiwic3VnZ2VzdGVkQWN0aW9uTGF5b3V0Iiwic3VnZ2VzdGVkQWN0aW9uc1N0YWNrZWRMYXlvdXRCdXR0b25UZXh0V3JhcCIsImFjY2Vzc0tleSIsImxvY2FsaXplIiwibG9jYWxpemVBY2Nlc3NLZXkiLCJsZW5ndGgiLCJpbmRleCIsImltYWdlIiwiaW1hZ2VBbHRUZXh0IiwidGV4dCIsImFycmF5T2YiLCJzaGFwZSJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBRUE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBRUE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0lBRVFBLFksR0FBZ0RDLDZCLENBQWhERCxZO0lBQWNFLFksR0FBa0NELDZCLENBQWxDQyxZO0lBQWNDLGUsR0FBb0JGLDZCLENBQXBCRSxlO0FBRXBDLElBQU1DLFVBQVUsR0FBRztBQUNqQixrQ0FBZ0M7QUFDOUIsdUZBQW1GO0FBQ2pGQyxNQUFBQSxPQUFPLEVBQUUsTUFEd0U7QUFFakZDLE1BQUFBLFFBQVEsRUFBRTtBQUZ1RSxLQURyRDtBQU05QixxRkFBaUY7QUFDL0VELE1BQUFBLE9BQU8sRUFBRSxNQURzRTtBQUUvRUUsTUFBQUEsYUFBYSxFQUFFO0FBRmdFO0FBTm5EO0FBRGYsQ0FBbkI7O0FBY0EsU0FBU0MsbUJBQVQsT0FBa0U7QUFBQSxNQUFuQ0MsV0FBbUMsUUFBbkNBLFdBQW1DO0FBQUEsTUFBdEJDLEtBQXNCLFFBQXRCQSxLQUFzQjtBQUFBLE1BQWZDLElBQWUsUUFBZkEsSUFBZTtBQUFBLE1BQVRDLEtBQVMsUUFBVEEsS0FBUzs7QUFDaEUsTUFBSUQsSUFBSSxLQUFLLGFBQWIsRUFBNEI7QUFDMUIsV0FBT0QsS0FBSyxJQUFJRCxXQUFoQjtBQUNELEdBRkQsTUFFTyxJQUFJQyxLQUFKLEVBQVc7QUFDaEIsV0FBT0EsS0FBUDtBQUNELEdBRk0sTUFFQSxJQUFJLE9BQU9FLEtBQVAsS0FBaUIsUUFBckIsRUFBK0I7QUFDcEMsV0FBT0EsS0FBUDtBQUNEOztBQUVE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LENBRGdCLEVBVWhCRTtBQVp5QixDQUE3Qjs7ZUFlZS9CLHVCQUF1QixHQUFHb0MsZ0JBQUgsQyIsInNvdXJjZVJvb3QiOiJjb21wb25lbnQ6Ly8vIiwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50IHJlYWN0L25vLWFycmF5LWluZGV4LWtleTogXCJvZmZcIiAqL1xuXG5pbXBvcnQgeyBob29rcyB9IGZyb20gJ2JvdGZyYW1ld29yay13ZWJjaGF0LWFwaSc7XG5pbXBvcnQgQmFzaWNGaWxtLCB7IGNyZWF0ZUJhc2ljU3R5bGVTZXQgYXMgY3JlYXRlQmFzaWNTdHlsZVNldEZvclJlYWN0RmlsbSB9IGZyb20gJ3JlYWN0LWZpbG0nO1xuaW1wb3J0IGNsYXNzTmFtZXMgZnJvbSAnY2xhc3NuYW1lcyc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0IFJlYWN0LCB7IHVzZU1lbW8gfSBmcm9tICdyZWFjdCc7XG5cbmltcG9ydCBjb25uZWN0VG9XZWJDaGF0IGZyb20gJy4uL2Nvbm5lY3RUb1dlYkNoYXQnO1xuaW1wb3J0IFNjcmVlblJlYWRlclRleHQgZnJvbSAnLi4vU2NyZWVuUmVhZGVyVGV4dCc7XG5pbXBvcnQgU3VnZ2VzdGVkQWN0aW9uIGZyb20gJy4vU3VnZ2VzdGVkQWN0aW9uJztcbmltcG9ydCB1c2VMb2NhbGl6ZUFjY2Vzc0tleSBmcm9tICcuLi9ob29rcy9pbnRlcm5hbC91c2VMb2NhbGl6ZUFjY2Vzc0tleSc7XG5pbXBvcnQgdXNlTm9uY2UgZnJvbSAnLi4vaG9va3MvaW50ZXJuYWwvdXNlTm9uY2UnO1xuaW1wb3J0IHVzZVN0eWxlU2V0IGZyb20gJy4uL2hvb2tzL3VzZVN0eWxlU2V0JztcbmltcG9ydCB1c2VTdHlsZVRvRW1vdGlvbk9iamVjdCBmcm9tICcuLi9ob29rcy9pbnRlcm5hbC91c2VTdHlsZVRvRW1vdGlvbk9iamVjdCc7XG5pbXBvcnQgdXNlU3VnZ2VzdGVkQWN0aW9uc0FjY2Vzc0tleSBmcm9tICcuLi9ob29rcy9pbnRlcm5hbC91c2VTdWdnZXN0ZWRBY3Rpb25zQWNjZXNzS2V5JztcbmltcG9ydCB1c2VVbmlxdWVJZCBmcm9tICcuLi9ob29rcy9pbnRlcm5hbC91c2VVbmlxdWVJZCc7XG5cbmNvbnN0IHsgdXNlRGlyZWN0aW9uLCB1c2VMb2NhbGl6ZXIsIHVzZVN0eWxlT3B0aW9ucyB9ID0gaG9va3M7XG5cbmNvbnN0IFJPT1RfU1RZTEUgPSB7XG4gICcmLndlYmNoYXRfX3N1Z2dlc3RlZC1hY3Rpb25zJzoge1xuICAgICcmLndlYmNoYXRfX3N1Z2dlc3RlZC1hY3Rpb25zLS1mbG93LWxheW91dCAud2ViY2hhdF9fc3VnZ2VzdGVkLWFjdGlvbnNfX2Zsb3ctYm94Jzoge1xuICAgICAgZGlzcGxheTogJ2ZsZXgnLFxuICAgICAgZmxleFdyYXA6ICd3cmFwJ1xuICAgIH0sXG5cbiAgICAnJi53ZWJjaGF0X19zdWdnZXN0ZWQtYWN0aW9ucy0tc3RhY2stbGF5b3V0IC53ZWJjaGF0X19zdWdnZXN0ZWQtYWN0aW9uc19fc3RhY2snOiB7XG4gICAgICBkaXNwbGF5OiAnZmxleCcsXG4gICAgICBmbGV4RGlyZWN0aW9uOiAnY29sdW1uJ1xuICAgIH1cbiAgfVxufTtcblxuZnVuY3Rpb24gc3VnZ2VzdGVkQWN0aW9uVGV4dCh7IGRpc3BsYXlUZXh0LCB0aXRsZSwgdHlwZSwgdmFsdWUgfSkge1xuICBpZiAodHlwZSA9PT0gJ21lc3NhZ2VCYWNrJykge1xuICAgIHJldHVybiB0aXRsZSB8fCBkaXNwbGF5VGV4dDtcbiAgfSBlbHNlIGlmICh0aXRsZSkge1xuICAgIHJldHVybiB0aXRsZTtcbiAgfSBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG5cbiAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHZhbHVlKTtcbn1cblxuY29uc3QgY29ubmVjdFN1Z2dlc3RlZEFjdGlvbnMgPSAoLi4uc2VsZWN0b3JzKSA9PlxuICBjb25uZWN0VG9XZWJDaGF0KFxuICAgICh7IGxhbmd1YWdlLCBzdWdnZXN0ZWRBY3Rpb25zIH0pID0+ICh7XG4gICAgICBsYW5ndWFnZSxcbiAgICAgIHN1Z2dlc3RlZEFjdGlvbnNcbiAgICB9KSxcbiAgICAuLi5zZWxlY3RvcnNcbiAgKTtcblxuY29uc3QgU3VnZ2VzdGVkQWN0aW9uQ2Fyb3VzZWxDb250YWluZXIgPSAoeyBjaGlsZHJlbiwgY2xhc3NOYW1lLCBzY3JlZW5SZWFkZXJUZXh0IH0pID0+IHtcbiAgY29uc3QgW1xuICAgIHtcbiAgICAgIHN1Z2dlc3RlZEFjdGlvbnNDYXJvdXNlbEZsaXBwZXJCb3hXaWR0aCxcbiAgICAgIHN1Z2dlc3RlZEFjdGlvbnNDYXJvdXNlbEZsaXBwZXJDdXJzb3IsXG4gICAgICBzdWdnZXN0ZWRBY3Rpb25zQ2Fyb3VzZWxGbGlwcGVyU2l6ZVxuICAgIH1cbiAgXSA9IHVzZVN0eWxlT3B0aW9ucygpO1xuICBjb25zdCBbeyBzdWdnZXN0ZWRBY3Rpb25zOiBzdWdnZXN0ZWRBY3Rpb25zU3R5bGVTZXQgfV0gPSB1c2VTdHlsZVNldCgpO1xuICBjb25zdCBbZGlyZWN0aW9uXSA9IHVzZURpcmVjdGlvbigpO1xuICBjb25zdCBbbm9uY2VdID0gdXNlTm9uY2UoKTtcbiAgY29uc3QgYXJpYUxhYmVsSWQgPSB1c2VVbmlxdWVJZCgnd2ViY2hhdF9fc3VnZ2VzdGVkLWFjdGlvbnMnKTtcbiAgY29uc3Qgcm9vdENsYXNzTmFtZSA9IHVzZVN0eWxlVG9FbW90aW9uT2JqZWN0KCkoUk9PVF9TVFlMRSkgKyAnJztcblxuICBjb25zdCBmaWxtU3R5bGVTZXQgPSB1c2VNZW1vKFxuICAgICgpID0+XG4gICAgICBjcmVhdGVCYXNpY1N0eWxlU2V0Rm9yUmVhY3RGaWxtKHtcbiAgICAgICAgYXV0b0hpZGU6IGZhbHNlLFxuICAgICAgICBjdXJzb3I6IHN1Z2dlc3RlZEFjdGlvbnNDYXJvdXNlbEZsaXBwZXJDdXJzb3IsXG4gICAgICAgIGZsaXBwZXJCb3hXaWR0aDogc3VnZ2VzdGVkQWN0aW9uc0Nhcm91c2VsRmxpcHBlckJveFdpZHRoLFxuICAgICAgICBmbGlwcGVyU2l6ZTogc3VnZ2VzdGVkQWN0aW9uc0Nhcm91c2VsRmxpcHBlclNpemVcbiAgICAgIH0pLFxuICAgIFtcbiAgICAgIHN1Z2dlc3RlZEFjdGlvbnNDYXJvdXNlbEZsaXBwZXJCb3hXaWR0aCxcbiAgICAgIHN1Z2dlc3RlZEFjdGlvbnNDYXJvdXNlbEZsaXBwZXJDdXJzb3IsXG4gICAgICBzdWdnZXN0ZWRBY3Rpb25zQ2Fyb3VzZWxGbGlwcGVyU2l6ZVxuICAgIF1cbiAgKTtcblxuICByZXR1cm4gKFxuICAgIC8vIFRPRE86IFRoZSBjb250ZW50IG9mIHN1Z2dlc3RlZCBhY3Rpb25zIHNob3VsZCBiZSB0aGUgbGFiZWxsZWQgYnkgdGhlIGFjdGl2aXR5LlxuICAgIC8vICAgICAgIFRoYXQgbWVhbnMsIHdoZW4gdGhlIHVzZXIgZm9jdXMgaW50byB0aGUgc3VnZ2VzdGVkIGFjdGlvbnMsIGl0IHNob3VsZCByZWFkIHNpbWlsYXIgdG8gXCJCb3Qgc2FpZCwgd2hhdCdzIHlvdXIgcHJlZmVyZW5jZSBvZiB0b2RheT8gU3VnZ2VzdGVkIGFjdGlvbnMgaGFzIGl0ZW1zOiBhcHBsZSBidXR0b24sIG9yYW5nZSBidXR0b24sIGJhbmFuYSBidXR0b24uXCJcbiAgICA8ZGl2XG4gICAgICBhcmlhLWxhYmVsbGVkYnk9e2FyaWFMYWJlbElkfVxuICAgICAgYXJpYS1saXZlPVwicG9saXRlXCJcbiAgICAgIGNsYXNzTmFtZT17Y2xhc3NOYW1lcyhcbiAgICAgICAgJ3dlYmNoYXRfX3N1Z2dlc3RlZC1hY3Rpb25zJyxcbiAgICAgICAgJ3dlYmNoYXRfX3N1Z2dlc3RlZC1hY3Rpb25zLS1jYXJvdXNlbC1sYXlvdXQnLFxuICAgICAgICB7ICd3ZWJjaGF0X19zdWdnZXN0ZWQtYWN0aW9ucy0tcnRsJzogZGlyZWN0aW9uID09PSAncnRsJyB9LFxuICAgICAgICByb290Q2xhc3NOYW1lLFxuICAgICAgICBzdWdnZXN0ZWRBY3Rpb25zU3R5bGVTZXQgKyAnJyxcbiAgICAgICAgKGNsYXNzTmFtZSB8fCAnJykgKyAnJ1xuICAgICAgKX1cbiAgICAgIHJvbGU9XCJzdGF0dXNcIlxuICAgID5cbiAgICAgIDxTY3JlZW5SZWFkZXJUZXh0IGlkPXthcmlhTGFiZWxJZH0gdGV4dD17c2NyZWVuUmVhZGVyVGV4dH0gLz5cbiAgICAgIHshIWNoaWxkcmVuICYmICEhUmVhY3QuQ2hpbGRyZW4uY291bnQoY2hpbGRyZW4pICYmIChcbiAgICAgICAgPEJhc2ljRmlsbVxuICAgICAgICAgIGF1dG9DZW50ZXI9e2ZhbHNlfVxuICAgICAgICAgIGNsYXNzTmFtZT1cIndlYmNoYXRfX3N1Z2dlc3RlZC1hY3Rpb25zX19jYXJvdXNlbFwiXG4gICAgICAgICAgZGlyPXtkaXJlY3Rpb259XG4gICAgICAgICAgZmxpcHBlckJsdXJGb2N1c09uQ2xpY2s9e3RydWV9XG4gICAgICAgICAgbm9uY2U9e25vbmNlfVxuICAgICAgICAgIHNob3dEb3RzPXtmYWxzZX1cbiAgICAgICAgICBzaG93U2Nyb2xsQmFyPXtmYWxzZX1cbiAgICAgICAgICBzdHlsZVNldD17ZmlsbVN0eWxlU2V0fVxuICAgICAgICA+XG4gICAgICAgICAge2NoaWxkcmVufVxuICAgICAgICA8L0Jhc2ljRmlsbT5cbiAgICAgICl9XG4gICAgPC9kaXY+XG4gICk7XG59O1xuXG5TdWdnZXN0ZWRBY3Rpb25DYXJvdXNlbENvbnRhaW5lci5kZWZhdWx0UHJvcHMgPSB7XG4gIGNoaWxkcmVuOiB1bmRlZmluZWQsXG4gIGNsYXNzTmFtZTogdW5kZWZpbmVkXG59O1xuXG5TdWdnZXN0ZWRBY3Rpb25DYXJvdXNlbENvbnRhaW5lci5wcm9wVHlwZXMgPSB7XG4gIGNoaWxkcmVuOiBQcm9wVHlwZXMuYW55LFxuICBjbGFzc05hbWU6IFByb3BUeXBlcy5zdHJpbmcsXG4gIHNjcmVlblJlYWRlclRleHQ6IFByb3BUeXBlcy5zdHJpbmcuaXNSZXF1aXJlZFxufTtcblxuY29uc3QgU3VnZ2VzdGVkQWN0aW9uRmxvd0NvbnRhaW5lciA9ICh7IGNoaWxkcmVuLCBjbGFzc05hbWUsIHNjcmVlblJlYWRlclRleHQgfSkgPT4ge1xuICBjb25zdCBbeyBzdWdnZXN0ZWRBY3Rpb25zOiBzdWdnZXN0ZWRBY3Rpb25zU3R5bGVTZXQgfV0gPSB1c2VTdHlsZVNldCgpO1xuICBjb25zdCBhcmlhTGFiZWxJZCA9IHVzZVVuaXF1ZUlkKCd3ZWJjaGF0X19zdWdnZXN0ZWQtYWN0aW9ucycpO1xuICBjb25zdCByb290Q2xhc3NOYW1lID0gdXNlU3R5bGVUb0Vtb3Rpb25PYmplY3QoKShST09UX1NUWUxFKSArICcnO1xuXG4gIHJldHVybiAoXG4gICAgPGRpdlxuICAgICAgYXJpYS1sYWJlbGxlZGJ5PXthcmlhTGFiZWxJZH1cbiAgICAgIGFyaWEtbGl2ZT1cInBvbGl0ZVwiXG4gICAgICBjbGFzc05hbWU9e2NsYXNzTmFtZXMoXG4gICAgICAgICd3ZWJjaGF0X19zdWdnZXN0ZWQtYWN0aW9ucycsXG4gICAgICAgICd3ZWJjaGF0X19zdWdnZXN0ZWQtYWN0aW9ucy0tZmxvdy1sYXlvdXQnLFxuICAgICAgICByb290Q2xhc3NOYW1lLFxuICAgICAgICBzdWdnZXN0ZWRBY3Rpb25zU3R5bGVTZXQgKyAnJyxcbiAgICAgICAgKGNsYXNzTmFtZSB8fCAnJykgKyAnJ1xuICAgICAgKX1cbiAgICAgIHJvbGU9XCJzdGF0dXNcIlxuICAgID5cbiAgICAgIDxTY3JlZW5SZWFkZXJUZXh0IGlkPXthcmlhTGFiZWxJZH0gdGV4dD17c2NyZWVuUmVhZGVyVGV4dH0gLz5cbiAgICAgIHshIWNoaWxkcmVuICYmICEhUmVhY3QuQ2hpbGRyZW4uY291bnQoY2hpbGRyZW4pICYmIChcbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJ3ZWJjaGF0X19zdWdnZXN0ZWQtYWN0aW9uc19fZmxvdy1ib3hcIj5cbiAgICAgICAgICB7UmVhY3QuQ2hpbGRyZW4ubWFwKGNoaWxkcmVuLCBjaGlsZCA9PiAoXG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIndlYmNoYXRfX3N1Z2dlc3RlZC1hY3Rpb25zX19pdGVtXCI+e2NoaWxkfTwvZGl2PlxuICAgICAgICAgICkpfVxuICAgICAgICA8L2Rpdj5cbiAgICAgICl9XG4gICAgPC9kaXY+XG4gICk7XG59O1xuXG5TdWdnZXN0ZWRBY3Rpb25GbG93Q29udGFpbmVyLmRlZmF1bHRQcm9wcyA9IHtcbiAgY2hpbGRyZW46IHVuZGVmaW5lZCxcbiAgY2xhc3NOYW1lOiB1bmRlZmluZWRcbn07XG5cblN1Z2dlc3RlZEFjdGlvbkZsb3dDb250YWluZXIucHJvcFR5cGVzID0ge1xuICBjaGlsZHJlbjogUHJvcFR5cGVzLmFueSxcbiAgY2xhc3NOYW1lOiBQcm9wVHlwZXMuc3RyaW5nLFxuICBzY3JlZW5SZWFkZXJUZXh0OiBQcm9wVHlwZXMuc3RyaW5nLmlzUmVxdWlyZWRcbn07XG5cbmNvbnN0IFN1Z2dlc3RlZEFjdGlvblN0YWNrZWRDb250YWluZXIgPSAoeyBjaGlsZHJlbiwgY2xhc3NOYW1lLCBzY3JlZW5SZWFkZXJUZXh0IH0pID0+IHtcbiAgY29uc3QgW3sgc3VnZ2VzdGVkQWN0aW9uczogc3VnZ2VzdGVkQWN0aW9uc1N0eWxlU2V0IH1dID0gdXNlU3R5bGVTZXQoKTtcbiAgY29uc3QgYXJpYUxhYmVsSWQgPSB1c2VVbmlxdWVJZCgnd2ViY2hhdF9fc3VnZ2VzdGVkLWFjdGlvbnMnKTtcbiAgY29uc3Qgcm9vdENsYXNzTmFtZSA9IHVzZVN0eWxlVG9FbW90aW9uT2JqZWN0KCkoUk9PVF9TVFlMRSkgKyAnJztcblxuICByZXR1cm4gKFxuICAgIDxkaXZcbiAgICAgIGFyaWEtbGFiZWxsZWRieT17YXJpYUxhYmVsSWR9XG4gICAgICBhcmlhLWxpdmU9XCJwb2xpdGVcIlxuICAgICAgY2xhc3NOYW1lPXtjbGFzc05hbWVzKFxuICAgICAgICAnd2ViY2hhdF9fc3VnZ2VzdGVkLWFjdGlvbnMnLFxuICAgICAgICAnd2ViY2hhdF9fc3VnZ2VzdGVkLWFjdGlvbnMtLXN0YWNrZWQtbGF5b3V0JyxcbiAgICAgICAgcm9vdENsYXNzTmFtZSxcbiAgICAgICAgc3VnZ2VzdGVkQWN0aW9uc1N0eWxlU2V0ICsgJycsXG4gICAgICAgIChjbGFzc05hbWUgfHwgJycpICsgJydcbiAgICAgICl9XG4gICAgICByb2xlPVwic3RhdHVzXCJcbiAgICA+XG4gICAgICA8U2NyZWVuUmVhZGVyVGV4dCBpZD17YXJpYUxhYmVsSWR9IHRleHQ9e3NjcmVlblJlYWRlclRleHR9IC8+XG4gICAgICB7ISFjaGlsZHJlbiAmJiAhIVJlYWN0LkNoaWxkcmVuLmNvdW50KGNoaWxkcmVuKSAmJiAoXG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwid2ViY2hhdF9fc3VnZ2VzdGVkLWFjdGlvbnNfX3N0YWNrXCI+e2NoaWxkcmVufTwvZGl2PlxuICAgICAgKX1cbiAgICA8L2Rpdj5cbiAgKTtcbn07XG5cblN1Z2dlc3RlZEFjdGlvblN0YWNrZWRDb250YWluZXIuZGVmYXVsdFByb3BzID0ge1xuICBjaGlsZHJlbjogdW5kZWZpbmVkLFxuICBjbGFzc05hbWU6IHVuZGVmaW5lZFxufTtcblxuU3VnZ2VzdGVkQWN0aW9uU3RhY2tlZENvbnRhaW5lci5wcm9wVHlwZXMgPSB7XG4gIGNoaWxkcmVuOiBQcm9wVHlwZXMuYW55LFxuICBjbGFzc05hbWU6IFByb3BUeXBlcy5zdHJpbmcsXG4gIHNjcmVlblJlYWRlclRleHQ6IFByb3BUeXBlcy5zdHJpbmcuaXNSZXF1aXJlZFxufTtcblxuY29uc3QgU3VnZ2VzdGVkQWN0aW9ucyA9ICh7IGNsYXNzTmFtZSwgc3VnZ2VzdGVkQWN0aW9ucyA9IFtdIH0pID0+IHtcbiAgY29uc3QgW3sgc3VnZ2VzdGVkQWN0aW9uTGF5b3V0LCBzdWdnZXN0ZWRBY3Rpb25zU3RhY2tlZExheW91dEJ1dHRvblRleHRXcmFwIH1dID0gdXNlU3R5bGVPcHRpb25zKCk7XG4gIGNvbnN0IFthY2Nlc3NLZXldID0gdXNlU3VnZ2VzdGVkQWN0aW9uc0FjY2Vzc0tleSgpO1xuICBjb25zdCBsb2NhbGl6ZSA9IHVzZUxvY2FsaXplcigpO1xuICBjb25zdCBsb2NhbGl6ZUFjY2Vzc0tleSA9IHVzZUxvY2FsaXplQWNjZXNzS2V5KCk7XG5cbiAgY29uc3Qgc2NyZWVuUmVhZGVyVGV4dCA9IGxvY2FsaXplKFxuICAgICdTVUdHRVNURURfQUNUSU9OU19BTFQnLFxuICAgIHN1Z2dlc3RlZEFjdGlvbnMubGVuZ3RoXG4gICAgICA/IGFjY2Vzc0tleVxuICAgICAgICA/IGxvY2FsaXplKCdTVUdHRVNURURfQUNUSU9OU19BTFRfSEFTX0NPTlRFTlRfQU5EX0FDQ0VTU19LRVknLCBsb2NhbGl6ZUFjY2Vzc0tleShhY2Nlc3NLZXkpKVxuICAgICAgICA6IGxvY2FsaXplKCdTVUdHRVNURURfQUNUSU9OU19BTFRfSEFTX0NPTlRFTlQnKVxuICAgICAgOiBsb2NhbGl6ZSgnU1VHR0VTVEVEX0FDVElPTlNfQUxUX05PX0NPTlRFTlQnKVxuICApO1xuXG4gIGNvbnN0IGNoaWxkcmVuID0gc3VnZ2VzdGVkQWN0aW9ucy5tYXAoKHsgZGlzcGxheVRleHQsIGltYWdlLCBpbWFnZUFsdFRleHQsIHRleHQsIHRpdGxlLCB0eXBlLCB2YWx1ZSB9LCBpbmRleCkgPT4gKFxuICAgIDxTdWdnZXN0ZWRBY3Rpb25cbiAgICAgIGFyaWFIaWRkZW49e3RydWV9XG4gICAgICBidXR0b25UZXh0PXtzdWdnZXN0ZWRBY3Rpb25UZXh0KHsgZGlzcGxheVRleHQsIHRpdGxlLCB0eXBlLCB2YWx1ZSB9KX1cbiAgICAgIGNsYXNzTmFtZT1cIndlYmNoYXRfX3N1Z2dlc3RlZC1hY3Rpb25zX19idXR0b25cIlxuICAgICAgZGlzcGxheVRleHQ9e2Rpc3BsYXlUZXh0fVxuICAgICAgaW1hZ2U9e2ltYWdlfVxuICAgICAgaW1hZ2VBbHQ9e2ltYWdlQWx0VGV4dH1cbiAgICAgIGtleT17aW5kZXh9XG4gICAgICB0ZXh0PXt0ZXh0fVxuICAgICAgdGV4dENsYXNzTmFtZT17XG4gICAgICAgIHN1Z2dlc3RlZEFjdGlvbkxheW91dCA9PT0gJ3N0YWNrZWQnICYmIHN1Z2dlc3RlZEFjdGlvbnNTdGFja2VkTGF5b3V0QnV0dG9uVGV4dFdyYXBcbiAgICAgICAgICA/ICd3ZWJjaGF0X19zdWdnZXN0ZWQtYWN0aW9uc19fYnV0dG9uLXRleHQtc3RhY2tlZC10ZXh0LXdyYXAnXG4gICAgICAgICAgOiAnd2ViY2hhdF9fc3VnZ2VzdGVkLWFjdGlvbnNfX2J1dHRvbi10ZXh0J1xuICAgICAgfVxuICAgICAgdHlwZT17dHlwZX1cbiAgICAgIHZhbHVlPXt2YWx1ZX1cbiAgICAvPlxuICApKTtcblxuICBpZiAoc3VnZ2VzdGVkQWN0aW9uTGF5b3V0ID09PSAnZmxvdycpIHtcbiAgICByZXR1cm4gKFxuICAgICAgPFN1Z2dlc3RlZEFjdGlvbkZsb3dDb250YWluZXIgY2xhc3NOYW1lPXtjbGFzc05hbWV9IHNjcmVlblJlYWRlclRleHQ9e3NjcmVlblJlYWRlclRleHR9PlxuICAgICAgICB7Y2hpbGRyZW59XG4gICAgICA8L1N1Z2dlc3RlZEFjdGlvbkZsb3dDb250YWluZXI+XG4gICAgKTtcbiAgfSBlbHNlIGlmIChzdWdnZXN0ZWRBY3Rpb25MYXlvdXQgPT09ICdzdGFja2VkJykge1xuICAgIHJldHVybiAoXG4gICAgICA8U3VnZ2VzdGVkQWN0aW9uU3RhY2tlZENvbnRhaW5lciBjbGFzc05hbWU9e2NsYXNzTmFtZX0gc2NyZWVuUmVhZGVyVGV4dD17c2NyZWVuUmVhZGVyVGV4dH0+XG4gICAgICAgIHtjaGlsZHJlbn1cbiAgICAgIDwvU3VnZ2VzdGVkQWN0aW9uU3RhY2tlZENvbnRhaW5lcj5cbiAgICApO1xuICB9XG5cbiAgcmV0dXJuIChcbiAgICA8U3VnZ2VzdGVkQWN0aW9uQ2Fyb3VzZWxDb250YWluZXIgY2xhc3NOYW1lPXtjbGFzc05hbWV9IHNjcmVlblJlYWRlclRleHQ9e3NjcmVlblJlYWRlclRleHR9PlxuICAgICAge2NoaWxkcmVufVxuICAgIDwvU3VnZ2VzdGVkQWN0aW9uQ2Fyb3VzZWxDb250YWluZXI+XG4gICk7XG59O1xuXG5TdWdnZXN0ZWRBY3Rpb25zLmRlZmF1bHRQcm9wcyA9IHtcbiAgY2xhc3NOYW1lOiAnJ1xufTtcblxuU3VnZ2VzdGVkQWN0aW9ucy5wcm9wVHlwZXMgPSB7XG4gIGNsYXNzTmFtZTogUHJvcFR5cGVzLnN0cmluZyxcbiAgc3VnZ2VzdGVkQWN0aW9uczogUHJvcFR5cGVzLmFycmF5T2YoXG4gICAgUHJvcFR5cGVzLnNoYXBlKHtcbiAgICAgIGRpc3BsYXlUZXh0OiBQcm9wVHlwZXMuc3RyaW5nLFxuICAgICAgaW1hZ2U6IFByb3BUeXBlcy5zdHJpbmcsXG4gICAgICBpbWFnZUFsdFRleHQ6IFByb3BUeXBlcy5zdHJpbmcsXG4gICAgICB0ZXh0OiBQcm9wVHlwZXMuc3RyaW5nLFxuICAgICAgdGl0bGU6IFByb3BUeXBlcy5zdHJpbmcsXG4gICAgICB0eXBlOiBQcm9wVHlwZXMuc3RyaW5nLmlzUmVxdWlyZWQsXG4gICAgICB2YWx1ZTogUHJvcFR5cGVzLmFueVxuICAgIH0pXG4gICkuaXNSZXF1aXJlZFxufTtcblxuZXhwb3J0IGRlZmF1bHQgY29ubmVjdFN1Z2dlc3RlZEFjdGlvbnMoKShTdWdnZXN0ZWRBY3Rpb25zKTtcblxuZXhwb3J0IHsgY29ubmVjdFN1Z2dlc3RlZEFjdGlvbnMgfTtcbiJdfQ==