UNPKG

botframework-webchat-component

Version:
178 lines (174 loc) 39.6 kB
"use strict"; function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); } Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _botframeworkWebchatApi = require("botframework-webchat-api"); var _classnames = _interopRequireDefault(require("classnames")); var _propTypes = _interopRequireDefault(require("prop-types")); var _react = _interopRequireWildcard(require("react")); var _isPresentational = _interopRequireDefault(require("./LiveRegion/isPresentational")); var _LiveRegionActivity = _interopRequireDefault(require("../LiveRegion/LiveRegionActivity")); var _SendFailed = _interopRequireDefault(require("./LiveRegion/SendFailed")); var _LiveRegionTwinComposer = _interopRequireDefault(require("../providers/LiveRegionTwin/LiveRegionTwinComposer")); var _tabbableElements = _interopRequireDefault(require("../Utils/tabbableElements")); var _useLocalizeAccessKey = _interopRequireDefault(require("../hooks/internal/useLocalizeAccessKey")); var _useQueueStaticElement = _interopRequireDefault(require("../providers/LiveRegionTwin/useQueueStaticElement")); var _useStyleToEmotionObject = _interopRequireDefault(require("../hooks/internal/useStyleToEmotionObject")); var _useSuggestedActionsAccessKey = _interopRequireDefault(require("../hooks/internal/useSuggestedActionsAccessKey")); var _useTypistNames3 = _interopRequireDefault(require("./useTypistNames")); function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); } function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && 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 _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e2) { throw _e2; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e3) { didErr = true; err = _e3; }, f: function f() { try { if (!normalCompletion && it.return != null) it.return(); } finally { if (didErr) throw err; } } }; } 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) { var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"]; if (_i == null) return; var _arr = []; var _n = true; var _d = false; var _s, _e; try { for (_i = _i.call(arr); !(_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 useActivities = _botframeworkWebchatApi.hooks.useActivities, useGetKeyByActivity = _botframeworkWebchatApi.hooks.useGetKeyByActivity, useLocalizer = _botframeworkWebchatApi.hooks.useLocalizer, useStyleOptions = _botframeworkWebchatApi.hooks.useStyleOptions; var ROOT_STYLE = { '&.webchat__live-region-transcript': { '& .webchat__live-region-transcript__note, & .webchat__live-region-transcript__note, & .webchat__live-region-transcript__text-element': { color: 'transparent', height: 1, overflow: 'hidden', position: 'absolute', top: 0, whiteSpace: 'nowrap', width: 1 } } }; var LiveRegionTranscriptCore = function LiveRegionTranscriptCore(_ref) { var activityElementMapRef = _ref.activityElementMapRef; // We are looking for all activities instead of just those will be rendered. // This is because some activities that chosen not be rendered in the chat history, // we might still need to be read by screen reader. Such as, suggested actions without text content. var _useSuggestedActionsA = (0, _useSuggestedActionsAccessKey.default)(), _useSuggestedActionsA2 = _slicedToArray(_useSuggestedActionsA, 1), accessKey = _useSuggestedActionsA2[0]; var _useActivities = useActivities(), _useActivities2 = _slicedToArray(_useActivities, 1), activities = _useActivities2[0]; var _useTypistNames = (0, _useTypistNames3.default)(), _useTypistNames2 = _slicedToArray(_useTypistNames, 1), typistNames = _useTypistNames2[0]; var getKeyByActivity = useGetKeyByActivity(); var localize = useLocalizer(); var localizeAccessKeyAsAccessibleName = (0, _useLocalizeAccessKey.default)('accessible name'); var queueStaticElement = (0, _useQueueStaticElement.default)(); var liveRegionInteractiveLabelAlt = localize('TRANSCRIPT_LIVE_REGION_INTERACTIVE_LABEL_ALT'); var liveRegionInteractiveWithLinkLabelAlt = localize('TRANSCRIPT_LIVE_REGION_INTERACTIVE_WITH_LINKS_LABEL_ALT'); var typingIndicator = !!typistNames.length && localize(typistNames.length > 1 ? 'TYPING_INDICATOR_MULTIPLE_TEXT' : 'TYPING_INDICATOR_SINGLE_TEXT', typistNames[0]); var liveRegionSuggestedActionsLabelAlt = accessKey ? localize('TRANSCRIPT_LIVE_REGION_SUGGESTED_ACTIONS_WITH_ACCESS_KEY_LABEL_ALT', localizeAccessKeyAsAccessibleName(accessKey)) : localize('TRANSCRIPT_LIVE_REGION_SUGGESTED_ACTIONS_LABEL_ALT'); var keyedActivities = (0, _react.useMemo)(function () { return Object.freeze(activities.reduce(function (intermediate, activity) { // Only "message" activity will be read by screen reader. if (activity.type === 'message') { return intermediate.set(getKeyByActivity(activity), activity); } return intermediate; }, new Map())); }, [activities, getKeyByActivity]); var prevRenderingActivitiesRef = (0, _react.useRef)(); (0, _react.useEffect)(function () { var prevRenderingActivities = prevRenderingActivitiesRef.current; var appendedActivities = []; // Bottom-up, find activities which are recently appended (i.e. new activity will have a new key). // We only consider new activities added to the bottom of the chat history. // Based on how `aria-relevant="additions"` works, activities that are updated, deleted, or reordered, should be ignored. var _iterator = _createForOfIteratorHelper(Array.from(keyedActivities.entries()).reverse()), _step; try { for (_iterator.s(); !(_step = _iterator.n()).done;) { var _step$value = _slicedToArray(_step.value, 2), key = _step$value[0], activity = _step$value[1]; if (prevRenderingActivities !== null && prevRenderingActivities !== void 0 && prevRenderingActivities.has(key)) { break; } appendedActivities.unshift({ activity: activity, key: key }); (0, _isPresentational.default)(activity) || queueStaticElement( /*#__PURE__*/_react.default.createElement(_LiveRegionActivity.default, { activity: activity })); } } catch (err) { _iterator.e(err); } finally { _iterator.f(); } var hasNewLink = appendedActivities.some(function (_ref2) { var _activityElementMapRe; var key = _ref2.key; return (_activityElementMapRe = activityElementMapRef.current.get(key)) === null || _activityElementMapRe === void 0 ? void 0 : _activityElementMapRe.querySelector('a'); }); var hasNewWidget = appendedActivities.some(function (_ref3) { var _activityElementMapRe2; var key = _ref3.key; return !!(0, _tabbableElements.default)((_activityElementMapRe2 = activityElementMapRef.current.get(key)) === null || _activityElementMapRe2 === void 0 ? void 0 : _activityElementMapRe2.querySelector('.webchat__basic-transcript__activity-body')).length; }); var hasSuggestedActions = appendedActivities.some(function (_ref4) { var _activity$suggestedAc, _activity$suggestedAc2; var activity = _ref4.activity; return activity.type === 'message' && ((_activity$suggestedAc = activity.suggestedActions) === null || _activity$suggestedAc === void 0 ? void 0 : (_activity$suggestedAc2 = _activity$suggestedAc.actions) === null || _activity$suggestedAc2 === void 0 ? void 0 : _activity$suggestedAc2.length); }); // This is a footnote reading either: // - "Message is interactive. Press shift tab key 2 to 3 times to switch to the chat history. Then click on the message to interact.", or; // - "One or more links in the message. Press shift tab key 2 to 3 times to switch to the chat history. Then click on the message to interact." if (hasNewLink || hasNewWidget) { queueStaticElement( /*#__PURE__*/_react.default.createElement("div", { className: "webchat__live-region-transcript__note", role: "note" }, hasNewLink ? liveRegionInteractiveWithLinkLabelAlt : liveRegionInteractiveLabelAlt)); } // This is a footnote reading "Suggested actions container: has content. Press CTRL + SHIFT + A to select." if (hasSuggestedActions) { queueStaticElement( /*#__PURE__*/_react.default.createElement("div", { className: "webchat__live-region-transcript__note", role: "note" }, liveRegionSuggestedActionsLabelAlt)); } prevRenderingActivitiesRef.current = keyedActivities; }, [activityElementMapRef, liveRegionInteractiveLabelAlt, liveRegionInteractiveWithLinkLabelAlt, liveRegionSuggestedActionsLabelAlt, prevRenderingActivitiesRef, queueStaticElement, keyedActivities]); (0, _react.useEffect)(function () { typingIndicator && queueStaticElement(typingIndicator); }, [queueStaticElement, typingIndicator]); return /*#__PURE__*/_react.default.createElement(_SendFailed.default, null); }; var LiveRegionTranscript = function LiveRegionTranscript(_ref5) { var activityElementMapRef = _ref5.activityElementMapRef; var _useStyleOptions = useStyleOptions(), _useStyleOptions2 = _slicedToArray(_useStyleOptions, 1), internalLiveRegionFadeAfter = _useStyleOptions2[0].internalLiveRegionFadeAfter; var localize = useLocalizer(); var rootClassName = (0, _useStyleToEmotionObject.default)()(ROOT_STYLE) + ''; var transcriptRoleDescription = localize('TRANSCRIPT_ARIA_ROLE_ALT'); return /*#__PURE__*/_react.default.createElement(_LiveRegionTwinComposer.default, { "aria-roledescription": transcriptRoleDescription, className: (0, _classnames.default)('webchat__live-region-transcript', rootClassName), fadeAfter: internalLiveRegionFadeAfter, role: "log", textElementClassName: "webchat__live-region-transcript__text-element" }, /*#__PURE__*/_react.default.createElement(LiveRegionTranscriptCore, { activityElementMapRef: activityElementMapRef })); }; LiveRegionTranscript.propTypes = { // PropTypes cannot be fully expressed in TypeScript. // @ts-ignore activityElementMapRef: _propTypes.default.shape({ current: _propTypes.default.instanceOf(Map) }).isRequired }; var _default = LiveRegionTranscript; exports.default = _default; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfYm90ZnJhbWV3b3JrV2ViY2hhdEFwaSIsInJlcXVpcmUiLCJfY2xhc3NuYW1lcyIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJfcHJvcFR5cGVzIiwiX3JlYWN0IiwiX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQiLCJfaXNQcmVzZW50YXRpb25hbCIsIl9MaXZlUmVnaW9uQWN0aXZpdHkiLCJfU2VuZEZhaWxlZCIsIl9MaXZlUmVnaW9uVHdpbkNvbXBvc2VyIiwiX3RhYmJhYmxlRWxlbWVudHMiLCJfdXNlTG9jYWxpemVBY2Nlc3NLZXkiLCJfdXNlUXVldWVTdGF0aWNFbGVtZW50IiwiX3VzZVN0eWxlVG9FbW90aW9uT2JqZWN0IiwiX3VzZVN1Z2dlc3RlZEFjdGlvbnNBY2Nlc3NLZXkiLCJfdXNlVHlwaXN0TmFtZXMzIiwiX2dldFJlcXVpcmVXaWxkY2FyZENhY2hlIiwibm9kZUludGVyb3AiLCJXZWFrTWFwIiwiY2FjaGVCYWJlbEludGVyb3AiLCJjYWNoZU5vZGVJbnRlcm9wIiwib2JqIiwiX19lc01vZHVsZSIsIl90eXBlb2YiLCJkZWZhdWx0IiwiY2FjaGUiLCJoYXMiLCJnZXQiLCJuZXdPYmoiLCJoYXNQcm9wZXJ0eURlc2NyaXB0b3IiLCJPYmplY3QiLCJkZWZpbmVQcm9wZXJ0eSIsImdldE93blByb3BlcnR5RGVzY3JpcHRvciIsImtleSIsInByb3RvdHlwZSIsImhhc093blByb3BlcnR5IiwiY2FsbCIsImRlc2MiLCJzZXQiLCJfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlciIsIm8iLCJhbGxvd0FycmF5TGlrZSIsIml0IiwiU3ltYm9sIiwiaXRlcmF0b3IiLCJBcnJheSIsImlzQXJyYXkiLCJfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkiLCJsZW5ndGgiLCJpIiwiRiIsInMiLCJuIiwiZG9uZSIsInZhbHVlIiwiZSIsIl9lMiIsImYiLCJUeXBlRXJyb3IiLCJub3JtYWxDb21wbGV0aW9uIiwiZGlkRXJyIiwiZXJyIiwic3RlcCIsIm5leHQiLCJfZTMiLCJyZXR1cm4iLCJfc2xpY2VkVG9BcnJheSIsImFyciIsIl9hcnJheVdpdGhIb2xlcyIsIl9pdGVyYWJsZVRvQXJyYXlMaW1pdCIsIl9ub25JdGVyYWJsZVJlc3QiLCJtaW5MZW4iLCJfYXJyYXlMaWtlVG9BcnJheSIsInRvU3RyaW5nIiwic2xpY2UiLCJjb25zdHJ1Y3RvciIsIm5hbWUiLCJmcm9tIiwidGVzdCIsImxlbiIsImFycjIiLCJfaSIsIl9hcnIiLCJfbiIsIl9kIiwiX3MiLCJfZSIsInB1c2giLCJ1c2VBY3Rpdml0aWVzIiwiaG9va3MiLCJ1c2VHZXRLZXlCeUFjdGl2aXR5IiwidXNlTG9jYWxpemVyIiwidXNlU3R5bGVPcHRpb25zIiwiUk9PVF9TVFlMRSIsImNvbG9yIiwiaGVpZ2h0Iiwib3ZlcmZsb3ciLCJwb3NpdGlvbiIsInRvcCIsIndoaXRlU3BhY2UiLCJ3aWR0aCIsIkxpdmVSZWdpb25UcmFuc2NyaXB0Q29yZSIsIl9yZWYiLCJhY3Rpdml0eUVsZW1lbnRNYXBSZWYiLCJfdXNlU3VnZ2VzdGVkQWN0aW9uc0EiLCJ1c2VTdWdnZXN0ZWRBY3Rpb25zQWNjZXNzS2V5IiwiX3VzZVN1Z2dlc3RlZEFjdGlvbnNBMiIsImFjY2Vzc0tleSIsIl91c2VBY3Rpdml0aWVzIiwiX3VzZUFjdGl2aXRpZXMyIiwiYWN0aXZpdGllcyIsIl91c2VUeXBpc3ROYW1lcyIsInVzZVR5cGlzdE5hbWVzIiwiX3VzZVR5cGlzdE5hbWVzMiIsInR5cGlzdE5hbWVzIiwiZ2V0S2V5QnlBY3Rpdml0eSIsImxvY2FsaXplIiwibG9jYWxpemVBY2Nlc3NLZXlBc0FjY2Vzc2libGVOYW1lIiwidXNlTG9jYWxpemVBY2Nlc3NLZXkiLCJxdWV1ZVN0YXRpY0VsZW1lbnQiLCJ1c2VRdWV1ZVN0YXRpY0VsZW1lbnQiLCJsaXZlUmVnaW9uSW50ZXJhY3RpdmVMYWJlbEFsdCIsImxpdmVSZWdpb25JbnRlcmFjdGl2ZVdpdGhMaW5rTGFiZWxBbHQiLCJ0eXBpbmdJbmRpY2F0b3IiLCJsaXZlUmVnaW9uU3VnZ2VzdGVkQWN0aW9uc0xhYmVsQWx0Iiwia2V5ZWRBY3Rpdml0aWVzIiwidXNlTWVtbyIsImZyZWV6ZSIsInJlZHVjZSIsImludGVybWVkaWF0ZSIsImFjdGl2aXR5IiwidHlwZSIsIk1hcCIsInByZXZSZW5kZXJpbmdBY3Rpdml0aWVzUmVmIiwidXNlUmVmIiwidXNlRWZmZWN0IiwicHJldlJlbmRlcmluZ0FjdGl2aXRpZXMiLCJjdXJyZW50IiwiYXBwZW5kZWRBY3Rpdml0aWVzIiwiX2l0ZXJhdG9yIiwiZW50cmllcyIsInJldmVyc2UiLCJfc3RlcCIsIl9zdGVwJHZhbHVlIiwidW5zaGlmdCIsImlzUHJlc2VudGF0aW9uYWwiLCJjcmVhdGVFbGVtZW50IiwiaGFzTmV3TGluayIsInNvbWUiLCJfcmVmMiIsIl9hY3Rpdml0eUVsZW1lbnRNYXBSZSIsInF1ZXJ5U2VsZWN0b3IiLCJoYXNOZXdXaWRnZXQiLCJfcmVmMyIsIl9hY3Rpdml0eUVsZW1lbnRNYXBSZTIiLCJ0YWJiYWJsZUVsZW1lbnRzIiwiaGFzU3VnZ2VzdGVkQWN0aW9ucyIsIl9yZWY0IiwiX2FjdGl2aXR5JHN1Z2dlc3RlZEFjIiwiX2FjdGl2aXR5JHN1Z2dlc3RlZEFjMiIsInN1Z2dlc3RlZEFjdGlvbnMiLCJhY3Rpb25zIiwiY2xhc3NOYW1lIiwicm9sZSIsIkxpdmVSZWdpb25UcmFuc2NyaXB0IiwiX3JlZjUiLCJfdXNlU3R5bGVPcHRpb25zIiwiX3VzZVN0eWxlT3B0aW9uczIiLCJpbnRlcm5hbExpdmVSZWdpb25GYWRlQWZ0ZXIiLCJyb290Q2xhc3NOYW1lIiwidXNlU3R5bGVUb0Vtb3Rpb25PYmplY3QiLCJ0cmFuc2NyaXB0Um9sZURlc2NyaXB0aW9uIiwiY2xhc3NOYW1lcyIsImZhZGVBZnRlciIsInRleHRFbGVtZW50Q2xhc3NOYW1lIiwicHJvcFR5cGVzIiwiUHJvcFR5cGVzIiwic2hhcGUiLCJpbnN0YW5jZU9mIiwiaXNSZXF1aXJlZCIsIl9kZWZhdWx0IiwiZXhwb3J0cyJdLCJzb3VyY2VSb290IjoiY29tcG9uZW50Oi8vLyIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL1RyYW5zY3JpcHQvTGl2ZVJlZ2lvblRyYW5zY3JpcHQudHN4Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGhvb2tzIH0gZnJvbSAnYm90ZnJhbWV3b3JrLXdlYmNoYXQtYXBpJztcbmltcG9ydCBjbGFzc05hbWVzIGZyb20gJ2NsYXNzbmFtZXMnO1xuaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJztcbmltcG9ydCBSZWFjdCwgeyB1c2VFZmZlY3QsIHVzZU1lbW8sIHVzZVJlZiB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB0eXBlIHsgRkMsIFJlZk9iamVjdCwgVkZDIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHR5cGUgeyBXZWJDaGF0QWN0aXZpdHkgfSBmcm9tICdib3RmcmFtZXdvcmstd2ViY2hhdC1jb3JlJztcblxuaW1wb3J0IGlzUHJlc2VudGF0aW9uYWwgZnJvbSAnLi9MaXZlUmVnaW9uL2lzUHJlc2VudGF0aW9uYWwnO1xuaW1wb3J0IExpdmVSZWdpb25BY3Rpdml0eSBmcm9tICcuLi9MaXZlUmVnaW9uL0xpdmVSZWdpb25BY3Rpdml0eSc7XG5pbXBvcnQgTGl2ZVJlZ2lvblNlbmRGYWlsZWQgZnJvbSAnLi9MaXZlUmVnaW9uL1NlbmRGYWlsZWQnO1xuaW1wb3J0IExpdmVSZWdpb25Ud2luQ29tcG9zZXIgZnJvbSAnLi4vcHJvdmlkZXJzL0xpdmVSZWdpb25Ud2luL0xpdmVSZWdpb25Ud2luQ29tcG9zZXInO1xuaW1wb3J0IHRhYmJhYmxlRWxlbWVudHMgZnJvbSAnLi4vVXRpbHMvdGFiYmFibGVFbGVtZW50cyc7XG5pbXBvcnQgdXNlTG9jYWxpemVBY2Nlc3NLZXkgZnJvbSAnLi4vaG9va3MvaW50ZXJuYWwvdXNlTG9jYWxpemVBY2Nlc3NLZXknO1xuaW1wb3J0IHVzZVF1ZXVlU3RhdGljRWxlbWVudCBmcm9tICcuLi9wcm92aWRlcnMvTGl2ZVJlZ2lvblR3aW4vdXNlUXVldWVTdGF0aWNFbGVtZW50JztcbmltcG9ydCB1c2VTdHlsZVRvRW1vdGlvbk9iamVjdCBmcm9tICcuLi9ob29rcy9pbnRlcm5hbC91c2VTdHlsZVRvRW1vdGlvbk9iamVjdCc7XG5pbXBvcnQgdXNlU3VnZ2VzdGVkQWN0aW9uc0FjY2Vzc0tleSBmcm9tICcuLi9ob29rcy9pbnRlcm5hbC91c2VTdWdnZXN0ZWRBY3Rpb25zQWNjZXNzS2V5JztcbmltcG9ydCB1c2VUeXBpc3ROYW1lcyBmcm9tICcuL3VzZVR5cGlzdE5hbWVzJztcblxuaW1wb3J0IHR5cGUgeyBBY3Rpdml0eUVsZW1lbnRNYXAgfSBmcm9tICcuL3R5cGVzJztcblxuY29uc3QgeyB1c2VBY3Rpdml0aWVzLCB1c2VHZXRLZXlCeUFjdGl2aXR5LCB1c2VMb2NhbGl6ZXIsIHVzZVN0eWxlT3B0aW9ucyB9ID0gaG9va3M7XG5cbmNvbnN0IFJPT1RfU1RZTEUgPSB7XG4gICcmLndlYmNoYXRfX2xpdmUtcmVnaW9uLXRyYW5zY3JpcHQnOiB7XG4gICAgJyYgLndlYmNoYXRfX2xpdmUtcmVnaW9uLXRyYW5zY3JpcHRfX25vdGUsICYgLndlYmNoYXRfX2xpdmUtcmVnaW9uLXRyYW5zY3JpcHRfX25vdGUsICYgLndlYmNoYXRfX2xpdmUtcmVnaW9uLXRyYW5zY3JpcHRfX3RleHQtZWxlbWVudCc6XG4gICAgICB7XG4gICAgICAgIGNvbG9yOiAndHJhbnNwYXJlbnQnLFxuICAgICAgICBoZWlnaHQ6IDEsXG4gICAgICAgIG92ZXJmbG93OiAnaGlkZGVuJyxcbiAgICAgICAgcG9zaXRpb246ICdhYnNvbHV0ZScsXG4gICAgICAgIHRvcDogMCxcbiAgICAgICAgd2hpdGVTcGFjZTogJ25vd3JhcCcsXG4gICAgICAgIHdpZHRoOiAxXG4gICAgICB9XG4gIH1cbn07XG5cbnR5cGUgUmVuZGVyaW5nQWN0aXZpdGllcyA9IE1hcDxzdHJpbmcsIFdlYkNoYXRBY3Rpdml0eT47XG5cbnR5cGUgTGl2ZVJlZ2lvblRyYW5zY3JpcHRDb3JlUHJvcHMgPSBSZWFkb25seTx7XG4gIGFjdGl2aXR5RWxlbWVudE1hcFJlZjogUmVmT2JqZWN0PEFjdGl2aXR5RWxlbWVudE1hcD47XG59PjtcblxuY29uc3QgTGl2ZVJlZ2lvblRyYW5zY3JpcHRDb3JlOiBGQzxMaXZlUmVnaW9uVHJhbnNjcmlwdENvcmVQcm9wcz4gPSAoeyBhY3Rpdml0eUVsZW1lbnRNYXBSZWYgfSkgPT4ge1xuICAvLyBXZSBhcmUgbG9va2luZyBmb3IgYWxsIGFjdGl2aXRpZXMgaW5zdGVhZCBvZiBqdXN0IHRob3NlIHdpbGwgYmUgcmVuZGVyZWQuXG4gIC8vIFRoaXMgaXMgYmVjYXVzZSBzb21lIGFjdGl2aXRpZXMgdGhhdCBjaG9zZW4gbm90IGJlIHJlbmRlcmVkIGluIHRoZSBjaGF0IGhpc3RvcnksXG4gIC8vIHdlIG1pZ2h0IHN0aWxsIG5lZWQgdG8gYmUgcmVhZCBieSBzY3JlZW4gcmVhZGVyLiBTdWNoIGFzLCBzdWdnZXN0ZWQgYWN0aW9ucyB3aXRob3V0IHRleHQgY29udGVudC5cbiAgY29uc3QgW2FjY2Vzc0tleV0gPSB1c2VTdWdnZXN0ZWRBY3Rpb25zQWNjZXNzS2V5KCk7XG4gIGNvbnN0IFthY3Rpdml0aWVzXSA9IHVzZUFjdGl2aXRpZXMoKTtcbiAgY29uc3QgW3R5cGlzdE5hbWVzXSA9IHVzZVR5cGlzdE5hbWVzKCk7XG4gIGNvbnN0IGdldEtleUJ5QWN0aXZpdHkgPSB1c2VHZXRLZXlCeUFjdGl2aXR5KCk7XG4gIGNvbnN0IGxvY2FsaXplID0gdXNlTG9jYWxpemVyKCk7XG4gIGNvbnN0IGxvY2FsaXplQWNjZXNzS2V5QXNBY2Nlc3NpYmxlTmFtZSA9IHVzZUxvY2FsaXplQWNjZXNzS2V5KCdhY2Nlc3NpYmxlIG5hbWUnKTtcbiAgY29uc3QgcXVldWVTdGF0aWNFbGVtZW50ID0gdXNlUXVldWVTdGF0aWNFbGVtZW50KCk7XG5cbiAgY29uc3QgbGl2ZVJlZ2lvbkludGVyYWN0aXZlTGFiZWxBbHQgPSBsb2NhbGl6ZSgnVFJBTlNDUklQVF9MSVZFX1JFR0lPTl9JTlRFUkFDVElWRV9MQUJFTF9BTFQnKTtcbiAgY29uc3QgbGl2ZVJlZ2lvbkludGVyYWN0aXZlV2l0aExpbmtMYWJlbEFsdCA9IGxvY2FsaXplKCdUUkFOU0NSSVBUX0xJVkVfUkVHSU9OX0lOVEVSQUNUSVZFX1dJVEhfTElOS1NfTEFCRUxfQUxUJyk7XG4gIGNvbnN0IHR5cGluZ0luZGljYXRvciA9XG4gICAgISF0eXBpc3ROYW1lcy5sZW5ndGggJiZcbiAgICBsb2NhbGl6ZShcbiAgICAgIHR5cGlzdE5hbWVzLmxlbmd0aCA+IDEgPyAnVFlQSU5HX0lORElDQVRPUl9NVUxUSVBMRV9URVhUJyA6ICdUWVBJTkdfSU5ESUNBVE9SX1NJTkdMRV9URVhUJyxcbiAgICAgIHR5cGlzdE5hbWVzWzBdXG4gICAgKTtcblxuICBjb25zdCBsaXZlUmVnaW9uU3VnZ2VzdGVkQWN0aW9uc0xhYmVsQWx0ID0gYWNjZXNzS2V5XG4gICAgPyBsb2NhbGl6ZShcbiAgICAgICAgJ1RSQU5TQ1JJUFRfTElWRV9SRUdJT05fU1VHR0VTVEVEX0FDVElPTlNfV0lUSF9BQ0NFU1NfS0VZX0xBQkVMX0FMVCcsXG4gICAgICAgIGxvY2FsaXplQWNjZXNzS2V5QXNBY2Nlc3NpYmxlTmFtZShhY2Nlc3NLZXkpXG4gICAgICApXG4gICAgOiBsb2NhbGl6ZSgnVFJBTlNDUklQVF9MSVZFX1JFR0lPTl9TVUdHRVNURURfQUNUSU9OU19MQUJFTF9BTFQnKTtcblxuICBjb25zdCBrZXllZEFjdGl2aXRpZXMgPSB1c2VNZW1vPFJlYWRvbmx5PFJlbmRlcmluZ0FjdGl2aXRpZXM+PihcbiAgICAoKSA9PlxuICAgICAgT2JqZWN0LmZyZWV6ZShcbiAgICAgICAgYWN0aXZpdGllcy5yZWR1Y2U8UmVuZGVyaW5nQWN0aXZpdGllcz4oKGludGVybWVkaWF0ZSwgYWN0aXZpdHkpID0+IHtcbiAgICAgICAgICAvLyBPbmx5IFwibWVzc2FnZVwiIGFjdGl2aXR5IHdpbGwgYmUgcmVhZCBieSBzY3JlZW4gcmVhZGVyLlxuICAgICAgICAgIGlmIChhY3Rpdml0eS50eXBlID09PSAnbWVzc2FnZScpIHtcbiAgICAgICAgICAgIHJldHVybiBpbnRlcm1lZGlhdGUuc2V0KGdldEtleUJ5QWN0aXZpdHkoYWN0aXZpdHkpLCBhY3Rpdml0eSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIGludGVybWVkaWF0ZTtcbiAgICAgICAgfSwgbmV3IE1hcDxzdHJpbmcsIFdlYkNoYXRBY3Rpdml0eT4oKSlcbiAgICAgICksXG4gICAgW2FjdGl2aXRpZXMsIGdldEtleUJ5QWN0aXZpdHldXG4gICk7XG5cbiAgY29uc3QgcHJldlJlbmRlcmluZ0FjdGl2aXRpZXNSZWYgPSB1c2VSZWY8UmVhZG9ubHk8UmVuZGVyaW5nQWN0aXZpdGllcz4+KCk7XG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBjb25zdCB7IGN1cnJlbnQ6IHByZXZSZW5kZXJpbmdBY3Rpdml0aWVzIH0gPSBwcmV2UmVuZGVyaW5nQWN0aXZpdGllc1JlZjtcbiAgICBjb25zdCBhcHBlbmRlZEFjdGl2aXRpZXM6IHsgYWN0aXZpdHk6IFdlYkNoYXRBY3Rpdml0eTsga2V5OiBzdHJpbmcgfVtdID0gW107XG5cbiAgICAvLyBCb3R0b20tdXAsIGZpbmQgYWN0aXZpdGllcyB3aGljaCBhcmUgcmVjZW50bHkgYXBwZW5kZWQgKGkuZS4gbmV3IGFjdGl2aXR5IHdpbGwgaGF2ZSBhIG5ldyBrZXkpLlxuICAgIC8vIFdlIG9ubHkgY29uc2lkZXIgbmV3IGFjdGl2aXRpZXMgYWRkZWQgdG8gdGhlIGJvdHRvbSBvZiB0aGUgY2hhdCBoaXN0b3J5LlxuICAgIC8vIEJhc2VkIG9uIGhvdyBgYXJpYS1yZWxldmFudD1cImFkZGl0aW9uc1wiYCB3b3JrcywgYWN0aXZpdGllcyB0aGF0IGFyZSB1cGRhdGVkLCBkZWxldGVkLCBvciByZW9yZGVyZWQsIHNob3VsZCBiZSBpZ25vcmVkLlxuICAgIGZvciAoY29uc3QgW2tleSwgYWN0aXZpdHldIG9mIEFycmF5LmZyb20oa2V5ZWRBY3Rpdml0aWVzLmVudHJpZXMoKSkucmV2ZXJzZSgpKSB7XG4gICAgICBpZiAocHJldlJlbmRlcmluZ0FjdGl2aXRpZXM/LmhhcyhrZXkpKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICBhcHBlbmRlZEFjdGl2aXRpZXMudW5zaGlmdCh7IGFjdGl2aXR5LCBrZXkgfSk7XG5cbiAgICAgIGlzUHJlc2VudGF0aW9uYWwoYWN0aXZpdHkpIHx8IHF1ZXVlU3RhdGljRWxlbWVudCg8TGl2ZVJlZ2lvbkFjdGl2aXR5IGFjdGl2aXR5PXthY3Rpdml0eX0gLz4pO1xuICAgIH1cblxuICAgIGNvbnN0IGhhc05ld0xpbmsgPSBhcHBlbmRlZEFjdGl2aXRpZXMuc29tZSgoeyBrZXkgfSkgPT4gYWN0aXZpdHlFbGVtZW50TWFwUmVmLmN1cnJlbnQuZ2V0KGtleSk/LnF1ZXJ5U2VsZWN0b3IoJ2EnKSk7XG5cbiAgICBjb25zdCBoYXNOZXdXaWRnZXQgPSBhcHBlbmRlZEFjdGl2aXRpZXMuc29tZShcbiAgICAgICh7IGtleSB9KSA9PlxuICAgICAgICAhIXRhYmJhYmxlRWxlbWVudHMoXG4gICAgICAgICAgYWN0aXZpdHlFbGVtZW50TWFwUmVmLmN1cnJlbnQuZ2V0KGtleSk/LnF1ZXJ5U2VsZWN0b3IoJy53ZWJjaGF0X19iYXNpYy10cmFuc2NyaXB0X19hY3Rpdml0eS1ib2R5JylcbiAgICAgICAgKS5sZW5ndGhcbiAgICApO1xuXG4gICAgY29uc3QgaGFzU3VnZ2VzdGVkQWN0aW9ucyA9IGFwcGVuZGVkQWN0aXZpdGllcy5zb21lKFxuICAgICAgKHsgYWN0aXZpdHkgfSkgPT4gYWN0aXZpdHkudHlwZSA9PT0gJ21lc3NhZ2UnICYmIGFjdGl2aXR5LnN1Z2dlc3RlZEFjdGlvbnM/LmFjdGlvbnM/Lmxlbmd0aFxuICAgICk7XG5cbiAgICAvLyBUaGlzIGlzIGEgZm9vdG5vdGUgcmVhZGluZyBlaXRoZXI6XG4gICAgLy8gLSBcIk1lc3NhZ2UgaXMgaW50ZXJhY3RpdmUuIFByZXNzIHNoaWZ0IHRhYiBrZXkgMiB0byAzIHRpbWVzIHRvIHN3aXRjaCB0byB0aGUgY2hhdCBoaXN0b3J5LiBUaGVuIGNsaWNrIG9uIHRoZSBtZXNzYWdlIHRvIGludGVyYWN0LlwiLCBvcjtcbiAgICAvLyAtIFwiT25lIG9yIG1vcmUgbGlua3MgaW4gdGhlIG1lc3NhZ2UuIFByZXNzIHNoaWZ0IHRhYiBrZXkgMiB0byAzIHRpbWVzIHRvIHN3aXRjaCB0byB0aGUgY2hhdCBoaXN0b3J5LiBUaGVuIGNsaWNrIG9uIHRoZSBtZXNzYWdlIHRvIGludGVyYWN0LlwiXG4gICAgaWYgKGhhc05ld0xpbmsgfHwgaGFzTmV3V2lkZ2V0KSB7XG4gICAgICBxdWV1ZVN0YXRpY0VsZW1lbnQoXG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwid2ViY2hhdF9fbGl2ZS1yZWdpb24tdHJhbnNjcmlwdF9fbm90ZVwiIHJvbGU9XCJub3RlXCI+XG4gICAgICAgICAge2hhc05ld0xpbmsgPyBsaXZlUmVnaW9uSW50ZXJhY3RpdmVXaXRoTGlua0xhYmVsQWx0IDogbGl2ZVJlZ2lvbkludGVyYWN0aXZlTGFiZWxBbHR9XG4gICAgICAgIDwvZGl2PlxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBUaGlzIGlzIGEgZm9vdG5vdGUgcmVhZGluZyBcIlN1Z2dlc3RlZCBhY3Rpb25zIGNvbnRhaW5lcjogaGFzIGNvbnRlbnQuIFByZXNzIENUUkwgKyBTSElGVCArIEEgdG8gc2VsZWN0LlwiXG4gICAgaWYgKGhhc1N1Z2dlc3RlZEFjdGlvbnMpIHtcbiAgICAgIHF1ZXVlU3RhdGljRWxlbWVudChcbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJ3ZWJjaGF0X19saXZlLXJlZ2lvbi10cmFuc2NyaXB0X19ub3RlXCIgcm9sZT1cIm5vdGVcIj5cbiAgICAgICAgICB7bGl2ZVJlZ2lvblN1Z2dlc3RlZEFjdGlvbnNMYWJlbEFsdH1cbiAgICAgICAgPC9kaXY+XG4gICAgICApO1xuICAgIH1cblxuICAgIHByZXZSZW5kZXJpbmdBY3Rpdml0aWVzUmVmLmN1cnJlbnQgPSBrZXllZEFjdGl2aXRpZXM7XG4gIH0sIFtcbiAgICBhY3Rpdml0eUVsZW1lbnRNYXBSZWYsXG4gICAgbGl2ZVJlZ2lvbkludGVyYWN0aXZlTGFiZWxBbHQsXG4gICAgbGl2ZVJlZ2lvbkludGVyYWN0aXZlV2l0aExpbmtMYWJlbEFsdCxcbiAgICBsaXZlUmVnaW9uU3VnZ2VzdGVkQWN0aW9uc0xhYmVsQWx0LFxuICAgIHByZXZSZW5kZXJpbmdBY3Rpdml0aWVzUmVmLFxuICAgIHF1ZXVlU3RhdGljRWxlbWVudCxcbiAgICBrZXllZEFjdGl2aXRpZXNcbiAgXSk7XG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICB0eXBpbmdJbmRpY2F0b3IgJiYgcXVldWVTdGF0aWNFbGVtZW50KHR5cGluZ0luZGljYXRvcik7XG4gIH0sIFtxdWV1ZVN0YXRpY0VsZW1lbnQsIHR5cGluZ0luZGljYXRvcl0pO1xuXG4gIHJldHVybiA8TGl2ZVJlZ2lvblNlbmRGYWlsZWQgLz47XG59O1xuXG50eXBlIExpdmVSZWdpb25UcmFuc2NyaXB0UHJvcHMgPSB7XG4gIGFjdGl2aXR5RWxlbWVudE1hcFJlZjogUmVmT2JqZWN0PEFjdGl2aXR5RWxlbWVudE1hcD47XG59O1xuXG5jb25zdCBMaXZlUmVnaW9uVHJhbnNjcmlwdDogVkZDPExpdmVSZWdpb25UcmFuc2NyaXB0UHJvcHM+ID0gKHsgYWN0aXZpdHlFbGVtZW50TWFwUmVmIH0pID0+IHtcbiAgY29uc3QgW3sgaW50ZXJuYWxMaXZlUmVnaW9uRmFkZUFmdGVyIH1dID0gdXNlU3R5bGVPcHRpb25zKCk7XG4gIGNvbnN0IGxvY2FsaXplID0gdXNlTG9jYWxpemVyKCk7XG4gIGNvbnN0IHJvb3RDbGFzc05hbWUgPSB1c2VTdHlsZVRvRW1vdGlvbk9iamVjdCgpKFJPT1RfU1RZTEUpICsgJyc7XG5cbiAgY29uc3QgdHJhbnNjcmlwdFJvbGVEZXNjcmlwdGlvbiA9IGxvY2FsaXplKCdUUkFOU0NSSVBUX0FSSUFfUk9MRV9BTFQnKTtcblxuICByZXR1cm4gKFxuICAgIDxMaXZlUmVnaW9uVHdpbkNvbXBvc2VyXG4gICAgICBhcmlhLXJvbGVkZXNjcmlwdGlvbj17dHJhbnNjcmlwdFJvbGVEZXNjcmlwdGlvbn1cbiAgICAgIGNsYXNzTmFtZT17Y2xhc3NOYW1lcygnd2ViY2hhdF9fbGl2ZS1yZWdpb24tdHJhbnNjcmlwdCcsIHJvb3RDbGFzc05hbWUpfVxuICAgICAgZmFkZUFmdGVyPXtpbnRlcm5hbExpdmVSZWdpb25GYWRlQWZ0ZXJ9XG4gICAgICByb2xlPVwibG9nXCJcbiAgICAgIHRleHRFbGVtZW50Q2xhc3NOYW1lPVwid2ViY2hhdF9fbGl2ZS1yZWdpb24tdHJhbnNjcmlwdF9fdGV4dC1lbGVtZW50XCJcbiAgICA+XG4gICAgICA8TGl2ZVJlZ2lvblRyYW5zY3JpcHRDb3JlIGFjdGl2aXR5RWxlbWVudE1hcFJlZj17YWN0aXZpdHlFbGVtZW50TWFwUmVmfSAvPlxuICAgIDwvTGl2ZVJlZ2lvblR3aW5Db21wb3Nlcj5cbiAgKTtcbn07XG5cbkxpdmVSZWdpb25UcmFuc2NyaXB0LnByb3BUeXBlcyA9IHtcbiAgLy8gUHJvcFR5cGVzIGNhbm5vdCBiZSBmdWxseSBleHByZXNzZWQgaW4gVHlwZVNjcmlwdC5cbiAgLy8gQHRzLWlnbm9yZVxuICBhY3Rpdml0eUVsZW1lbnRNYXBSZWY6IFByb3BUeXBlcy5zaGFwZSh7XG4gICAgY3VycmVudDogUHJvcFR5cGVzLmluc3RhbmNlT2YoTWFwKVxuICB9KS5pc1JlcXVpcmVkXG59O1xuXG5leHBvcnQgZGVmYXVsdCBMaXZlUmVnaW9uVHJhbnNjcmlwdDtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQUFBLElBQUFBLHVCQUFBLEdBQUFDLE9BQUE7QUFDQSxJQUFBQyxXQUFBLEdBQUFDLHNCQUFBLENBQUFGLE9BQUE7QUFDQSxJQUFBRyxVQUFBLEdBQUFELHNCQUFBLENBQUFGLE9BQUE7QUFDQSxJQUFBSSxNQUFBLEdBQUFDLHVCQUFBLENBQUFMLE9BQUE7QUFJQSxJQUFBTSxpQkFBQSxHQUFBSixzQkFBQSxDQUFBRixPQUFBO0FBQ0EsSUFBQU8sbUJBQUEsR0FBQUwsc0JBQUEsQ0FBQUYsT0FBQTtBQUNBLElBQUFRLFdBQUEsR0FBQU4sc0JBQUEs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