botframework-webchat-component
Version:
React component of botframework-webchat
166 lines (162 loc) • 30.9 kB
JavaScript
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 _botframeworkWebchatCore = require("botframework-webchat-core");
var _propTypes = _interopRequireDefault(require("prop-types"));
var _react = _interopRequireWildcard(require("react"));
var _simpleUpdateIn = _interopRequireDefault(require("simple-update-in"));
var _createCustomEvent = _interopRequireDefault(require("./createCustomEvent"));
var _randomId = _interopRequireDefault(require("./randomId"));
var _useInternalMarkdownIt = _interopRequireDefault(require("../hooks/internal/useInternalMarkdownIt"));
var _useStyleToEmotionObject = _interopRequireDefault(require("../hooks/internal/useStyleToEmotionObject"));
var _walkMarkdownTokens = _interopRequireDefault(require("./walkMarkdownTokens"));
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 _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 _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; }
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 _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 _iterableToArray(iter) { if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter); }
function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); }
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 ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); 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 = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : 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; } /* eslint react/no-danger: "off" */
var useStyleOptions = _botframeworkWebchatApi.hooks.useStyleOptions;
function replaceAnchorWithButton(markdownTokens) {
return (0, _walkMarkdownTokens.default)(markdownTokens, function (markdownToken) {
markdownToken = _objectSpread({}, markdownToken);
switch (markdownToken.type) {
case 'link_open':
markdownToken.tag = 'button';
markdownToken.attrs = [].concat(_toConsumableArray((0, _simpleUpdateIn.default)(markdownToken.attrs, [function (_ref) {
var _ref2 = _slicedToArray(_ref, 2),
name = _ref2[0],
value = _ref2[1];
return name === 'href' && value.startsWith('#');
}], function (_ref3) {
var _ref4 = _slicedToArray(_ref3, 2),
value = _ref4[1];
return ['data-markdown-href', value.substr(1)];
})), [['type', 'button']]);
break;
case 'link_close':
markdownToken.tag = 'button';
break;
default:
break;
}
return markdownToken;
});
}
var InlineMarkdown = function InlineMarkdown(_ref5) {
var children = _ref5.children,
onReference = _ref5.onReference,
references = _ref5.references;
if (typeof children !== 'string') {
console.warn('botframework-webchat: "children" prop passed to <InlineMarkdown> must be of type string.');
children = '';
}
var _useInternalMarkdownI = (0, _useInternalMarkdownIt.default)(),
_useInternalMarkdownI2 = _slicedToArray(_useInternalMarkdownI, 1),
markdownIt = _useInternalMarkdownI2[0];
var _useStyleOptions = useStyleOptions(),
_useStyleOptions2 = _slicedToArray(_useStyleOptions, 1),
accent = _useStyleOptions2[0].accent;
var styleToClassName = (0, _useStyleToEmotionObject.default)();
// We inlined the style here because this style is:
// 1. Internal to Web Chat
// 2. Not customizable from developers (other than setting `styleOptions.accent`)
var className = (0, _react.useMemo)(function () {
return styleToClassName({
'& button[data-markdown-href]': {
appearance: 'none',
backgroundColor: 'transparent',
border: 0,
color: accent,
cursor: 'pointer',
fontFamily: 'inherit',
fontSize: 'inherit',
padding: 0
},
'@media screen and (forced-colors: active)': {
'& button[data-markdown-href]': {
color: 'LinkText',
textDecoration: 'underline'
}
}
}) + '';
}, [accent, styleToClassName]);
// Markdown-It only support references in uppercase.
references = references.map(function (reference) {
return reference.toUpperCase();
});
var _references$reduce = references.reduce(function (_ref6, ref) {
var hrefToRef = _ref6.hrefToRef,
refToHref = _ref6.refToHref;
var href = (0, _randomId.default)();
return {
hrefToRef: _objectSpread(_objectSpread({}, hrefToRef), {}, _defineProperty({}, href, ref)),
refToHref: _objectSpread(_objectSpread({}, refToHref), {}, _defineProperty({}, ref, href))
};
}, {
hrefToRef: {},
refToHref: {}
}),
hrefToRef = _references$reduce.hrefToRef,
refToHref = _references$reduce.refToHref;
var html = (0, _react.useMemo)(function () {
var tree = markdownIt.parseInline(children, {
references: references.reduce(function (references, key) {
return (
// Mitigated through denylisting.
// eslint-disable-next-line security/detect-object-injection
(0, _botframeworkWebchatCore.isForbiddenPropertyName)(key) ? references : _objectSpread(_objectSpread({}, references), {}, _defineProperty({}, key, {
href: "#".concat(refToHref[key])
}))
);
}, {})
});
// Turn "<a href="#retry">Retry</a>" into "<button data-ref="retry" type="button">Retry</button>"
var updatedTree = replaceAnchorWithButton(tree);
return {
__html: markdownIt.renderer.render(updatedTree)
};
}, [children, refToHref, markdownIt, references]);
var handleClick = (0, _react.useCallback)(function (event) {
event.stopPropagation();
var href = event.target.getAttribute('data-markdown-href');
href && onReference && onReference((0, _createCustomEvent.default)('reference',
// Mitigated through denylisting.
// eslint-disable-next-line security/detect-object-injection
(0, _botframeworkWebchatCore.isForbiddenPropertyName)(href) ? {} : {
data: hrefToRef[href]
}));
}, [hrefToRef, onReference]);
return /*#__PURE__*/_react.default.createElement("span", {
className: className,
dangerouslySetInnerHTML: html,
onClick: handleClick
});
};
InlineMarkdown.defaultProps = {
children: '',
onReference: undefined,
references: []
};
InlineMarkdown.propTypes = {
children: _propTypes.default.string,
onReference: _propTypes.default.func,
references: _propTypes.default.arrayOf(_propTypes.default.string)
};
var _default = InlineMarkdown;
exports.default = _default;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfYm90ZnJhbWV3b3JrV2ViY2hhdEFwaSIsInJlcXVpcmUiLCJfYm90ZnJhbWV3b3JrV2ViY2hhdENvcmUiLCJfcHJvcFR5cGVzIiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsIl9yZWFjdCIsIl9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkIiwiX3NpbXBsZVVwZGF0ZUluIiwiX2NyZWF0ZUN1c3RvbUV2ZW50IiwiX3JhbmRvbUlkIiwiX3VzZUludGVybmFsTWFya2Rvd25JdCIsIl91c2VTdHlsZVRvRW1vdGlvbk9iamVjdCIsIl93YWxrTWFya2Rvd25Ub2tlbnMiLCJfZ2V0UmVxdWlyZVdpbGRjYXJkQ2FjaGUiLCJub2RlSW50ZXJvcCIsIldlYWtNYXAiLCJjYWNoZUJhYmVsSW50ZXJvcCIsImNhY2hlTm9kZUludGVyb3AiLCJvYmoiLCJfX2VzTW9kdWxlIiwiX3R5cGVvZiIsImRlZmF1bHQiLCJjYWNoZSIsImhhcyIsImdldCIsIm5ld09iaiIsImhhc1Byb3BlcnR5RGVzY3JpcHRvciIsIk9iamVjdCIsImRlZmluZVByb3BlcnR5IiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwia2V5IiwicHJvdG90eXBlIiwiaGFzT3duUHJvcGVydHkiLCJjYWxsIiwiZGVzYyIsInNldCIsIl9zbGljZWRUb0FycmF5IiwiYXJyIiwiaSIsIl9hcnJheVdpdGhIb2xlcyIsIl9pdGVyYWJsZVRvQXJyYXlMaW1pdCIsIl91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheSIsIl9ub25JdGVyYWJsZVJlc3QiLCJUeXBlRXJyb3IiLCJfaSIsIlN5bWJvbCIsIml0ZXJhdG9yIiwiX2FyciIsIl9uIiwiX2QiLCJfcyIsIl9lIiwibmV4dCIsImRvbmUiLCJwdXNoIiwidmFsdWUiLCJsZW5ndGgiLCJlcnIiLCJBcnJheSIsImlzQXJyYXkiLCJfdG9Db25zdW1hYmxlQXJyYXkiLCJfYXJyYXlXaXRob3V0SG9sZXMiLCJfaXRlcmFibGVUb0FycmF5IiwiX25vbkl0ZXJhYmxlU3ByZWFkIiwibyIsIm1pbkxlbiIsIl9hcnJheUxpa2VUb0FycmF5IiwibiIsInRvU3RyaW5nIiwic2xpY2UiLCJjb25zdHJ1Y3RvciIsIm5hbWUiLCJmcm9tIiwidGVzdCIsIml0ZXIiLCJsZW4iLCJhcnIyIiwib3duS2V5cyIsIm9iamVjdCIsImVudW1lcmFibGVPbmx5Iiwia2V5cyIsImdldE93blByb3BlcnR5U3ltYm9scyIsInN5bWJvbHMiLCJmaWx0ZXIiLCJzeW0iLCJlbnVtZXJhYmxlIiwiYXBwbHkiLCJfb2JqZWN0U3ByZWFkIiwidGFyZ2V0IiwiYXJndW1lbnRzIiwic291cmNlIiwiZm9yRWFjaCIsIl9kZWZpbmVQcm9wZXJ0eSIsImdldE93blByb3BlcnR5RGVzY3JpcHRvcnMiLCJkZWZpbmVQcm9wZXJ0aWVzIiwiY29uZmlndXJhYmxlIiwid3JpdGFibGUiLCJ1c2VTdHlsZU9wdGlvbnMiLCJob29rcyIsInJlcGxhY2VBbmNob3JXaXRoQnV0dG9uIiwibWFya2Rvd25Ub2tlbnMiLCJ3YWxrTWFya2Rvd25Ub2tlbnMiLCJtYXJrZG93blRva2VuIiwidHlwZSIsInRhZyIsImF0dHJzIiwiY29uY2F0IiwidXBkYXRlSW4iLCJfcmVmIiwiX3JlZjIiLCJzdGFydHNXaXRoIiwiX3JlZjMiLCJfcmVmNCIsInN1YnN0ciIsIklubGluZU1hcmtkb3duIiwiX3JlZjUiLCJjaGlsZHJlbiIsIm9uUmVmZXJlbmNlIiwicmVmZXJlbmNlcyIsImNvbnNvbGUiLCJ3YXJuIiwiX3VzZUludGVybmFsTWFya2Rvd25JIiwidXNlSW50ZXJuYWxNYXJrZG93bkl0IiwiX3VzZUludGVybmFsTWFya2Rvd25JMiIsIm1hcmtkb3duSXQiLCJfdXNlU3R5bGVPcHRpb25zIiwiX3VzZVN0eWxlT3B0aW9uczIiLCJhY2NlbnQiLCJzdHlsZVRvQ2xhc3NOYW1lIiwidXNlU3R5bGVUb0Vtb3Rpb25PYmplY3QiLCJjbGFzc05hbWUiLCJ1c2VNZW1vIiwiYXBwZWFyYW5jZSIsImJhY2tncm91bmRDb2xvciIsImJvcmRlciIsImNvbG9yIiwiY3Vyc29yIiwiZm9udEZhbWlseSIsImZvbnRTaXplIiwicGFkZGluZyIsInRleHREZWNvcmF0aW9uIiwibWFwIiwicmVmZXJlbmNlIiwidG9VcHBlckNhc2UiLCJfcmVmZXJlbmNlcyRyZWR1Y2UiLCJyZWR1Y2UiLCJfcmVmNiIsInJlZiIsImhyZWZUb1JlZiIsInJlZlRvSHJlZiIsImhyZWYiLCJyYW5kb21JZCIsImh0bWwiLCJ0cmVlIiwicGFyc2VJbmxpbmUiLCJpc0ZvcmJpZGRlblByb3BlcnR5TmFtZSIsInVwZGF0ZWRUcmVlIiwiX19odG1sIiwicmVuZGVyZXIiLCJyZW5kZXIiLCJoYW5kbGVDbGljayIsInVzZUNhbGxiYWNrIiwiZXZlbnQiLCJzdG9wUHJvcGFnYXRpb24iLCJnZXRBdHRyaWJ1dGUiLCJjcmVhdGVDdXN0b21FdmVudCIsImRhdGEiLCJjcmVhdGVFbGVtZW50IiwiZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwiLCJvbkNsaWNrIiwiZGVmYXVsdFByb3BzIiwidW5kZWZpbmVkIiwicHJvcFR5cGVzIiwiUHJvcFR5cGVzIiwic3RyaW5nIiwiZnVuYyIsImFycmF5T2YiLCJfZGVmYXVsdCIsImV4cG9ydHMiXSwic291cmNlUm9vdCI6ImNvbXBvbmVudDovLy8iLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9VdGlscy9JbmxpbmVNYXJrZG93bi5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQgcmVhY3Qvbm8tZGFuZ2VyOiBcIm9mZlwiICovXG5cbmltcG9ydCB7IGhvb2tzIH0gZnJvbSAnYm90ZnJhbWV3b3JrLXdlYmNoYXQtYXBpJztcbmltcG9ydCB7IGlzRm9yYmlkZGVuUHJvcGVydHlOYW1lIH0gZnJvbSAnYm90ZnJhbWV3b3JrLXdlYmNoYXQtY29yZSc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0IFJlYWN0LCB7IHVzZUNhbGxiYWNrLCB1c2VNZW1vIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHVwZGF0ZUluIGZyb20gJ3NpbXBsZS11cGRhdGUtaW4nO1xuXG5pbXBvcnQgY3JlYXRlQ3VzdG9tRXZlbnQgZnJvbSAnLi9jcmVhdGVDdXN0b21FdmVudCc7XG5pbXBvcnQgcmFuZG9tSWQgZnJvbSAnLi9yYW5kb21JZCc7XG5pbXBvcnQgdXNlSW50ZXJuYWxNYXJrZG93bkl0IGZyb20gJy4uL2hvb2tzL2ludGVybmFsL3VzZUludGVybmFsTWFya2Rvd25JdCc7XG5pbXBvcnQgdXNlU3R5bGVUb0Vtb3Rpb25PYmplY3QgZnJvbSAnLi4vaG9va3MvaW50ZXJuYWwvdXNlU3R5bGVUb0Vtb3Rpb25PYmplY3QnO1xuaW1wb3J0IHdhbGtNYXJrZG93blRva2VucyBmcm9tICcuL3dhbGtNYXJrZG93blRva2Vucyc7XG5cbmNvbnN0IHsgdXNlU3R5bGVPcHRpb25zIH0gPSBob29rcztcblxuZnVuY3Rpb24gcmVwbGFjZUFuY2hvcldpdGhCdXR0b24obWFya2Rvd25Ub2tlbnMpIHtcbiAgcmV0dXJuIHdhbGtNYXJrZG93blRva2VucyhtYXJrZG93blRva2VucywgbWFya2Rvd25Ub2tlbiA9PiB7XG4gICAgbWFya2Rvd25Ub2tlbiA9IHsgLi4ubWFya2Rvd25Ub2tlbiB9O1xuXG4gICAgc3dpdGNoIChtYXJrZG93blRva2VuLnR5cGUpIHtcbiAgICAgIGNhc2UgJ2xpbmtfb3Blbic6XG4gICAgICAgIG1hcmtkb3duVG9rZW4udGFnID0gJ2J1dHRvbic7XG4gICAgICAgIG1hcmtkb3duVG9rZW4uYXR0cnMgPSBbXG4gICAgICAgICAgLi4udXBkYXRlSW4oXG4gICAgICAgICAgICBtYXJrZG93blRva2VuLmF0dHJzLFxuICAgICAgICAgICAgWyhbbmFtZSwgdmFsdWVdKSA9PiBuYW1lID09PSAnaHJlZicgJiYgdmFsdWUuc3RhcnRzV2l0aCgnIycpXSxcbiAgICAgICAgICAgIChbLCB2YWx1ZV0pID0+IFsnZGF0YS1tYXJrZG93bi1ocmVmJywgdmFsdWUuc3Vic3RyKDEpXVxuICAgICAgICAgICksXG4gICAgICAgICAgWyd0eXBlJywgJ2J1dHRvbiddXG4gICAgICAgIF07XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlICdsaW5rX2Nsb3NlJzpcbiAgICAgICAgbWFya2Rvd25Ub2tlbi50YWcgPSAnYnV0dG9uJztcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIHJldHVybiBtYXJrZG93blRva2VuO1xuICB9KTtcbn1cblxuY29uc3QgSW5saW5lTWFya2Rvd24gPSAoeyBjaGlsZHJlbiwgb25SZWZlcmVuY2UsIHJlZmVyZW5jZXMgfSkgPT4ge1xuICBpZiAodHlwZW9mIGNoaWxkcmVuICE9PSAnc3RyaW5nJykge1xuICAgIGNvbnNvbGUud2FybignYm90ZnJhbWV3b3JrLXdlYmNoYXQ6IFwiY2hpbGRyZW5cIiBwcm9wIHBhc3NlZCB0byA8SW5saW5lTWFya2Rvd24+IG11c3QgYmUgb2YgdHlwZSBzdHJpbmcuJyk7XG4gICAgY2hpbGRyZW4gPSAnJztcbiAgfVxuXG4gIGNvbnN0IFttYXJrZG93bkl0XSA9IHVzZUludGVybmFsTWFya2Rvd25JdCgpO1xuICBjb25zdCBbeyBhY2NlbnQgfV0gPSB1c2VTdHlsZU9wdGlvbnMoKTtcbiAgY29uc3Qgc3R5bGVUb0NsYXNzTmFtZSA9IHVzZVN0eWxlVG9FbW90aW9uT2JqZWN0KCk7XG5cbiAgLy8gV2UgaW5saW5lZCB0aGUgc3R5bGUgaGVyZSBiZWNhdXNlIHRoaXMgc3R5bGUgaXM6XG4gIC8vIDEuIEludGVybmFsIHRvIFdlYiBDaGF0XG4gIC8vIDIuIE5vdCBjdXN0b21pemFibGUgZnJvbSBkZXZlbG9wZXJzIChvdGhlciB0aGFuIHNldHRpbmcgYHN0eWxlT3B0aW9ucy5hY2NlbnRgKVxuICBjb25zdCBjbGFzc05hbWUgPSB1c2VNZW1vKFxuICAgICgpID0+XG4gICAgICBzdHlsZVRvQ2xhc3NOYW1lKHtcbiAgICAgICAgJyYgYnV0dG9uW2RhdGEtbWFya2Rvd24taHJlZl0nOiB7XG4gICAgICAgICAgYXBwZWFyYW5jZTogJ25vbmUnLFxuICAgICAgICAgIGJhY2tncm91bmRDb2xvcjogJ3RyYW5zcGFyZW50JyxcbiAgICAgICAgICBib3JkZXI6IDAsXG4gICAgICAgICAgY29sb3I6IGFjY2VudCxcbiAgICAgICAgICBjdXJzb3I6ICdwb2ludGVyJyxcbiAgICAgICAgICBmb250RmFtaWx5OiAnaW5oZXJpdCcsXG4gICAgICAgICAgZm9udFNpemU6ICdpbmhlcml0JyxcbiAgICAgICAgICBwYWRkaW5nOiAwXG4gICAgICAgIH0sXG4gICAgICAgICdAbWVkaWEgc2NyZWVuIGFuZCAoZm9yY2VkLWNvbG9yczogYWN0aXZlKSc6IHtcbiAgICAgICAgICAnJiBidXR0b25bZGF0YS1tYXJrZG93bi1ocmVmXSc6IHtcbiAgICAgICAgICAgIGNvbG9yOiAnTGlua1RleHQnLFxuICAgICAgICAgICAgdGV4dERlY29yYXRpb246ICd1bmRlcmxpbmUnXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KSArICcnLFxuICAgIFthY2NlbnQsIHN0eWxlVG9DbGFzc05hbWVdXG4gICk7XG5cbiAgLy8gTWFya2Rvd24tSXQgb25seSBzdXBwb3J0IHJlZmVyZW5jZXMgaW4gdXBwZXJjYXNlLlxuICByZWZlcmVuY2VzID0gcmVmZXJlbmNlcy5tYXAocmVmZXJlbmNlID0+IHJlZmVyZW5jZS50b1VwcGVyQ2FzZSgpKTtcblxuICBjb25zdCB7IGhyZWZUb1JlZiwgcmVmVG9IcmVmIH0gPSByZWZlcmVuY2VzLnJlZHVjZShcbiAgICAoeyBocmVmVG9SZWYsIHJlZlRvSHJlZiB9LCByZWYpID0+IHtcbiAgICAgIGNvbnN0IGhyZWYgPSByYW5kb21JZCgpO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBocmVmVG9SZWY6IHsgLi4uaHJlZlRvUmVmLCBbaHJlZl06IHJlZiB9LFxuICAgICAgICByZWZUb0hyZWY6IHsgLi4ucmVmVG9IcmVmLCBbcmVmXTogaHJlZiB9XG4gICAgICB9O1xuICAgIH0sXG4gICAgeyBocmVmVG9SZWY6IHt9LCByZWZUb0hyZWY6IHt9IH1cbiAgKTtcblxuICBjb25zdCBodG1sID0gdXNlTWVtbygoKSA9PiB7XG4gICAgY29uc3QgdHJlZSA9IG1hcmtkb3duSXQucGFyc2VJbmxpbmUoY2hpbGRyZW4sIHtcbiAgICAgIHJlZmVyZW5jZXM6IHJlZmVyZW5jZXMucmVkdWNlKFxuICAgICAgICAocmVmZXJlbmNlcywga2V5KSA9PlxuICAgICAgICAgIC8vIE1pdGlnYXRlZCB0aHJvdWdoIGRlbnlsaXN0aW5nLlxuICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBzZWN1cml0eS9kZXRlY3Qtb2JqZWN0LWluamVjdGlvblxuICAgICAgICAgIGlzRm9yYmlkZGVuUHJvcGVydHlOYW1lKGtleSkgPyByZWZlcmVuY2VzIDogeyAuLi5yZWZlcmVuY2VzLCBba2V5XTogeyBocmVmOiBgIyR7cmVmVG9IcmVmW2tleV19YCB9IH0sXG4gICAgICAgIHt9XG4gICAgICApXG4gICAgfSk7XG5cbiAgICAvLyBUdXJuIFwiPGEgaHJlZj1cIiNyZXRyeVwiPlJldHJ5PC9hPlwiIGludG8gXCI8YnV0dG9uIGRhdGEtcmVmPVwicmV0cnlcIiB0eXBlPVwiYnV0dG9uXCI+UmV0cnk8L2J1dHRvbj5cIlxuICAgIGNvbnN0IHVwZGF0ZWRUcmVlID0gcmVwbGFjZUFuY2hvcldpdGhCdXR0b24odHJlZSk7XG5cbiAgICByZXR1cm4geyBfX2h0bWw6IG1hcmtkb3duSXQucmVuZGVyZXIucmVuZGVyKHVwZGF0ZWRUcmVlKSB9O1xuICB9LCBbY2hpbGRyZW4sIHJlZlRvSHJlZiwgbWFya2Rvd25JdCwgcmVmZXJlbmNlc10pO1xuXG4gIGNvbnN0IGhhbmRsZUNsaWNrID0gdXNlQ2FsbGJhY2soXG4gICAgZXZlbnQgPT4ge1xuICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cbiAgICAgIGNvbnN0IGhyZWYgPSBldmVudC50YXJnZXQuZ2V0QXR0cmlidXRlKCdkYXRhLW1hcmtkb3duLWhyZWYnKTtcblxuICAgICAgaHJlZiAmJlxuICAgICAgICBvblJlZmVyZW5jZSAmJlxuICAgICAgICBvblJlZmVyZW5jZShcbiAgICAgICAgICBjcmVhdGVDdXN0b21FdmVudChcbiAgICAgICAgICAgICdyZWZlcmVuY2UnLFxuICAgICAgICAgICAgLy8gTWl0aWdhdGVkIHRocm91Z2ggZGVueWxpc3RpbmcuXG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgc2VjdXJpdHkvZGV0ZWN0LW9iamVjdC1pbmplY3Rpb25cbiAgICAgICAgICAgIGlzRm9yYmlkZGVuUHJvcGVydHlOYW1lKGhyZWYpID8ge30gOiB7IGRhdGE6IGhyZWZUb1JlZltocmVmXSB9XG4gICAgICAgICAgKVxuICAgICAgICApO1xuICAgIH0sXG4gICAgW2hyZWZUb1JlZiwgb25SZWZlcmVuY2VdXG4gICk7XG5cbiAgcmV0dXJuIDxzcGFuIGNsYXNzTmFtZT17Y2xhc3NOYW1lfSBkYW5nZXJvdXNseVNldElubmVySFRNTD17aHRtbH0gb25DbGljaz17aGFuZGxlQ2xpY2t9IC8+O1xufTtcblxuSW5saW5lTWFya2Rvd24uZGVmYXVsdFByb3BzID0ge1xuICBjaGlsZHJlbjogJycsXG4gIG9uUmVmZXJlbmNlOiB1bmRlZmluZWQsXG4gIHJlZmVyZW5jZXM6IFtdXG59O1xuXG5JbmxpbmVNYXJrZG93bi5wcm9wVHlwZXMgPSB7XG4gIGNoaWxkcmVuOiBQcm9wVHlwZXMuc3RyaW5nLFxuICBvblJlZmVyZW5jZTogUHJvcFR5cGVzLmZ1bmMsXG4gIHJlZmVyZW5jZXM6IFByb3BUeXBlcy5hcnJheU9mKFByb3BUeXBlcy5zdHJpbmcpXG59O1xuXG5leHBvcnQgZGVmYXVsdCBJbmxpbmVNYXJrZG93bjtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQUVBLElBQUFBLHVCQUFBLEdBQUFDLE9BQUE7QUFDQSxJQUFBQyx3QkFBQSxHQUFBRCxPQUFBO0FBQ0EsSUFBQUUsVUFBQSxHQUFBQyxzQkFBQSxDQUFBSCxPQUFBO0FBQ0EsSUFBQUksTUFBQSxHQUFBQyx1QkFBQSxDQUFBTCxP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
;