botframework-webchat-component
Version:
React component of botframework-webchat
330 lines (294 loc) • 40.8 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.connectCarouselFilmStrip = exports.default = void 0;
var _botframeworkWebchatApi = require("botframework-webchat-api");
var _reactFilm = require("react-film");
var _classnames = _interopRequireDefault(require("classnames"));
var _propTypes = _interopRequireDefault(require("prop-types"));
var _react = _interopRequireDefault(require("react"));
var _Bubble = _interopRequireDefault(require("./Bubble"));
var _connectToWebChat = _interopRequireDefault(require("../connectToWebChat"));
var _isZeroOrPositive = _interopRequireDefault(require("../Utils/isZeroOrPositive"));
var _ScreenReaderText = _interopRequireDefault(require("../ScreenReaderText"));
var _textFormatToContentType = _interopRequireDefault(require("../Utils/textFormatToContentType"));
var _useStyleSet3 = _interopRequireDefault(require("../hooks/useStyleSet"));
var _useStyleToEmotionObject = _interopRequireDefault(require("../hooks/internal/useStyleToEmotionObject"));
var _useUniqueId = _interopRequireDefault(require("../hooks/internal/useUniqueId"));
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 _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 useAvatarForBot = _botframeworkWebchatApi.hooks.useAvatarForBot,
useAvatarForUser = _botframeworkWebchatApi.hooks.useAvatarForUser,
useDirection = _botframeworkWebchatApi.hooks.useDirection,
useLocalizer = _botframeworkWebchatApi.hooks.useLocalizer,
useStyleOptions = _botframeworkWebchatApi.hooks.useStyleOptions;
var ROOT_STYLE = {
'&.webchat__carousel-filmstrip': {
display: 'flex',
flexDirection: 'column',
MsOverflowStyle: 'none',
overflowX: 'scroll',
overflowY: 'hidden',
position: 'relative',
// This is to keep screen reader text in the destinated area.
touchAction: 'manipulation',
WebkitOverflowScrolling: 'touch',
'&::-webkit-scrollbar': {
display: 'none'
},
'& .webchat__carousel-filmstrip__alignment-pad': {
flexShrink: 0
},
'& .webchat__carousel-filmstrip__attachment': {
flex: 1
},
'& .webchat__carousel-filmstrip__attachments': {
display: 'flex',
listStyleType: 'none',
margin: 0,
padding: 0
},
'& .webchat__carousel-filmstrip__avatar': {
flexShrink: 0
},
'& .webchat__carousel-filmstrip__avatar-gutter': {
display: 'flex',
flexDirection: 'column',
flexShrink: 0
},
'& .webchat__carousel-filmstrip__complimentary': {
display: 'flex'
},
'& .webchat__carousel-filmstrip__complimentary-content': {
display: 'flex',
flexGrow: 1,
flexDirection: 'column'
},
'& .webchat__carousel-filmstrip__content': {
display: 'flex',
flexGrow: 1,
flexDirection: 'column'
},
'& .webchat__carousel-filmstrip__filler': {
flexGrow: 10000,
flexShrink: 1
},
'& .webchat__carousel-filmstrip__main': {
display: 'flex'
},
'& .webchat__carousel-filmstrip__message': {
display: 'flex'
},
'& .webchat__carousel-filmstrip__nub-pad': {
flexShrink: 0
},
'& .webchat__carousel-filmstrip__status': {
display: 'flex'
}
}
};
var connectCarouselFilmStrip = function connectCarouselFilmStrip() {
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 (_ref, _ref2) {
var language = _ref.language,
_ref$styleSet$options = _ref.styleSet.options,
botAvatarInitials = _ref$styleSet$options.botAvatarInitials,
userAvatarInitials = _ref$styleSet$options.userAvatarInitials;
var _ref2$activity = _ref2.activity;
_ref2$activity = _ref2$activity === void 0 ? {} : _ref2$activity;
var _ref2$activity$from = _ref2$activity.from;
_ref2$activity$from = _ref2$activity$from === void 0 ? {} : _ref2$activity$from;
var role = _ref2$activity$from.role;
return {
avatarInitials: role === 'user' ? userAvatarInitials : botAvatarInitials,
language: language
};
}].concat(selectors));
};
exports.connectCarouselFilmStrip = connectCarouselFilmStrip;
var CarouselFilmStrip = function CarouselFilmStrip(_ref3) {
var activity = _ref3.activity,
className = _ref3.className,
hideTimestamp = _ref3.hideTimestamp,
renderActivityStatus = _ref3.renderActivityStatus,
renderAttachment = _ref3.renderAttachment,
renderAvatar = _ref3.renderAvatar,
showCallout = _ref3.showCallout;
var _useStyleOptions = useStyleOptions(),
_useStyleOptions2 = _slicedToArray(_useStyleOptions, 1),
_useStyleOptions2$ = _useStyleOptions2[0],
bubbleNubOffset = _useStyleOptions2$.bubbleNubOffset,
bubbleNubSize = _useStyleOptions2$.bubbleNubSize,
bubbleFromUserNubOffset = _useStyleOptions2$.bubbleFromUserNubOffset,
bubbleFromUserNubSize = _useStyleOptions2$.bubbleFromUserNubSize;
var _useStyleSet = (0, _useStyleSet3.default)(),
_useStyleSet2 = _slicedToArray(_useStyleSet, 1),
carouselFilmStripStyleSet = _useStyleSet2[0].carouselFilmStrip;
var _useAvatarForBot = useAvatarForBot(),
_useAvatarForBot2 = _slicedToArray(_useAvatarForBot, 1),
botInitials = _useAvatarForBot2[0].initials;
var _useAvatarForUser = useAvatarForUser(),
_useAvatarForUser2 = _slicedToArray(_useAvatarForUser, 1),
userInitials = _useAvatarForUser2[0].initials;
var _useDirection = useDirection(),
_useDirection2 = _slicedToArray(_useDirection, 1),
direction = _useDirection2[0];
var ariaLabelId = (0, _useUniqueId.default)('webchat__carousel-filmstrip__id');
var localize = useLocalizer();
var rootClassName = (0, _useStyleToEmotionObject.default)()(ROOT_STYLE) + '';
var showActivityStatus = typeof renderActivityStatus === 'function';
var itemContainerCallbackRef = (0, _reactFilm.useItemContainerCallbackRef)();
var scrollableCallbackRef = (0, _reactFilm.useScrollableCallbackRef)();
var _activity$attachments = activity.attachments,
attachments = _activity$attachments === void 0 ? [] : _activity$attachments,
_activity$channelData = activity.channelData;
_activity$channelData = _activity$channelData === void 0 ? {} : _activity$channelData;
var _activity$channelData2 = _activity$channelData.messageBack;
_activity$channelData2 = _activity$channelData2 === void 0 ? {} : _activity$channelData2;
var messageBackDisplayText = _activity$channelData2.displayText,
_activity$from = activity.from;
_activity$from = _activity$from === void 0 ? {} : _activity$from;
var role = _activity$from.role,
text = activity.text,
textFormat = activity.textFormat;
var activityDisplayText = messageBackDisplayText || text;
var fromUser = role === 'user';
var attachedAlt = localize(fromUser ? 'ACTIVITY_YOU_ATTACHED_ALT' : 'ACTIVITY_BOT_ATTACHED_ALT');
var greetingAlt = (fromUser ? localize('ACTIVITY_YOU_SAID_ALT') : localize('ACTIVITY_BOT_SAID_ALT', botInitials || '')).replace(/[\t-\r \xA0\u1680\u2000-\u200A\u2028\u2029\u202F\u205F\u3000\uFEFF]{2,}/g, ' ');
var initials = fromUser ? userInitials : botInitials;
var nubOffset = fromUser ? bubbleFromUserNubOffset : bubbleNubOffset;
var nubSize = fromUser ? bubbleFromUserNubSize : bubbleNubSize;
var otherInitials = fromUser ? botInitials : userInitials;
var otherNubSize = fromUser ? bubbleNubSize : bubbleFromUserNubSize;
var hasAvatar = initials || typeof initials === 'string';
var hasOtherAvatar = otherInitials || typeof otherInitials === 'string';
var hasNub = typeof nubSize === 'number';
var hasOtherNub = typeof otherNubSize === 'number';
var topAlignedCallout = (0, _isZeroOrPositive.default)(nubOffset);
var extraTrailing = !hasOtherAvatar && hasOtherNub; // This is for bot message with user nub and no user avatar. And vice versa.
var showAvatar = showCallout && hasAvatar && !!renderAvatar;
var showNub = showCallout && hasNub && (topAlignedCallout || !attachments.length);
return /*#__PURE__*/_react.default.createElement("div", {
"aria-labelledby": ariaLabelId,
className: (0, _classnames.default)('webchat__carousel-filmstrip', {
'webchat__carousel-filmstrip--extra-trailing': extraTrailing,
'webchat__carousel-filmstrip--hide-avatar': hasAvatar && !showAvatar,
'webchat__carousel-filmstrip--hide-nub': hasNub && !showNub,
'webchat__carousel-filmstrip--no-message': !activityDisplayText,
'webchat__carousel-filmstrip--rtl': direction === 'rtl',
'webchat__carousel-filmstrip--show-avatar': showAvatar,
'webchat__carousel-filmstrip--show-nub': showNub,
'webchat__carousel-filmstrip--top-callout': topAlignedCallout
}, 'react-film__filmstrip', rootClassName, carouselFilmStripStyleSet + '', (className || '') + ''),
ref: scrollableCallbackRef,
role: "group"
}, /*#__PURE__*/_react.default.createElement("div", {
className: "webchat__carousel-filmstrip__main"
}, /*#__PURE__*/_react.default.createElement("div", {
className: "webchat__carousel-filmstrip__avatar-gutter"
}, showAvatar && renderAvatar({
activity: activity
})), /*#__PURE__*/_react.default.createElement("div", {
className: "webchat__carousel-filmstrip__content"
}, !!activityDisplayText && /*#__PURE__*/_react.default.createElement("div", {
"aria-roledescription": "message",
className: "webchat__carousel-filmstrip__message" // Disable "Prop `id` is forbidden on DOM Nodes" rule because we are using the ID prop for accessibility.
/* eslint-disable-next-line react/forbid-dom-props */
,
id: ariaLabelId,
role: "group"
}, /*#__PURE__*/_react.default.createElement(_ScreenReaderText.default, {
text: greetingAlt
}), /*#__PURE__*/_react.default.createElement(_Bubble.default, {
className: "webchat__carousel-filmstrip__bubble",
fromUser: fromUser,
nub: showNub || (hasAvatar || hasNub) && 'hidden'
}, renderAttachment({
activity: activity,
attachment: {
content: activityDisplayText,
contentType: (0, _textFormatToContentType.default)(textFormat)
}
})), /*#__PURE__*/_react.default.createElement("div", {
className: "webchat__carousel-filmstrip__filler"
})), /*#__PURE__*/_react.default.createElement("div", {
className: "webchat__carousel-filmstrip__complimentary"
}, /*#__PURE__*/_react.default.createElement("div", {
className: "webchat__carousel-filmstrip__nub-pad"
}), /*#__PURE__*/_react.default.createElement("div", {
className: "webchat__carousel-filmstrip__complimentary-content c"
}, /*#__PURE__*/_react.default.createElement("ul", {
className: "webchat__carousel-filmstrip__attachments react-film__filmstrip__list",
ref: itemContainerCallbackRef
}, attachments.map(function (attachment, index) {
return /*#__PURE__*/_react.default.createElement("li", {
"aria-roledescription": "attachment",
className: "webchat__carousel-filmstrip__attachment react-film__filmstrip__item"
/* Attachments do not have an ID; it is always indexed by number */
/* eslint-disable-next-line react/no-array-index-key */
,
key: index,
role: "listitem"
}, /*#__PURE__*/_react.default.createElement(_ScreenReaderText.default, {
text: attachedAlt
}), /*#__PURE__*/_react.default.createElement(_Bubble.default, {
fromUser: fromUser,
key: index,
nub: false
}, renderAttachment({
activity: activity,
attachment: attachment
})));
}))))), /*#__PURE__*/_react.default.createElement("div", {
className: "webchat__carousel-filmstrip__alignment-pad"
})), showActivityStatus && /*#__PURE__*/_react.default.createElement("div", {
className: "webchat__carousel-filmstrip__status"
}, /*#__PURE__*/_react.default.createElement("div", {
className: "webchat__carousel-filmstrip__avatar-gutter"
}), /*#__PURE__*/_react.default.createElement("div", {
className: "webchat__carousel-filmstrip__nub-pad"
}), renderActivityStatus({
hideTimestamp: hideTimestamp
})));
};
CarouselFilmStrip.defaultProps = {
className: '',
hideTimestamp: false,
renderActivityStatus: false,
renderAvatar: false,
showCallout: false
};
CarouselFilmStrip.propTypes = {
activity: _propTypes.default.shape({
attachments: _propTypes.default.array,
channelData: _propTypes.default.shape({
messageBack: _propTypes.default.shape({
displayText: _propTypes.default.string
}),
state: _propTypes.default.string
}),
from: _propTypes.default.shape({
role: _propTypes.default.string.isRequired
}).isRequired,
text: _propTypes.default.string,
textFormat: _propTypes.default.string,
timestamp: _propTypes.default.string
}).isRequired,
className: _propTypes.default.string,
hideTimestamp: _propTypes.default.bool,
renderActivityStatus: _propTypes.default.oneOfType([_propTypes.default.oneOf([false]), _propTypes.default.func]),
renderAttachment: _propTypes.default.func.isRequired,
renderAvatar: _propTypes.default.oneOfType([_propTypes.default.oneOf([false]), _propTypes.default.func]),
showCallout: _propTypes.default.bool
};
var _default = CarouselFilmStrip;
exports.default = _default;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9BY3Rpdml0eS9DYXJvdXNlbEZpbG1TdHJpcC5qcyJdLCJuYW1lcyI6WyJ1c2VBdmF0YXJGb3JCb3QiLCJob29rcyIsInVzZUF2YXRhckZvclVzZXIiLCJ1c2VEaXJlY3Rpb24iLCJ1c2VMb2NhbGl6ZXIiLCJ1c2VTdHlsZU9wdGlvbnMiLCJST09UX1NUWUxFIiwiZGlzcGxheSIsImZsZXhEaXJlY3Rpb24iLCJNc092ZXJmbG93U3R5bGUiLCJvdmVyZmxvd1giLCJvdmVyZmxvd1kiLCJwb3NpdGlvbiIsInRvdWNoQWN0aW9uIiwiV2Via2l0T3ZlcmZsb3dTY3JvbGxpbmciLCJmbGV4U2hyaW5rIiwiZmxleCIsImxpc3RTdHlsZVR5cGUiLCJtYXJnaW4iLCJwYWRkaW5nIiwiZmxleEdyb3ciLCJjb25uZWN0Q2Fyb3VzZWxGaWxtU3RyaXAiLCJzZWxlY3RvcnMiLCJjb25uZWN0VG9XZWJDaGF0IiwibGFuZ3VhZ2UiLCJzdHlsZVNldCIsIm9wdGlvbnMiLCJib3RBdmF0YXJJbml0aWFscyIsInVzZXJBdmF0YXJJbml0aWFscyIsImFjdGl2aXR5IiwiZnJvbSIsInJvbGUiLCJhdmF0YXJJbml0aWFscyIsIkNhcm91c2VsRmlsbVN0cmlwIiwiY2xhc3NOYW1lIiwiaGlkZVRpbWVzdGFtcCIsInJlbmRlckFjdGl2aXR5U3RhdHVzIiwicmVuZGVyQXR0YWNobWVudCIsInJlbmRlckF2YXRhciIsInNob3dDYWxsb3V0IiwiYnViYmxlTnViT2Zmc2V0IiwiYnViYmxlTnViU2l6ZSIsImJ1YmJsZUZyb21Vc2VyTnViT2Zmc2V0IiwiYnViYmxlRnJvbVVzZXJOdWJTaXplIiwiY2Fyb3VzZWxGaWxtU3RyaXBTdHlsZVNldCIsImNhcm91c2VsRmlsbVN0cmlwIiwiYm90SW5pdGlhbHMiLCJpbml0aWFscyIsInVzZXJJbml0aWFscyIsImRpcmVjdGlvbiIsImFyaWFMYWJlbElkIiwibG9jYWxpemUiLCJyb290Q2xhc3NOYW1lIiwic2hvd0FjdGl2aXR5U3RhdHVzIiwiaXRlbUNvbnRhaW5lckNhbGxiYWNrUmVmIiwic2Nyb2xsYWJsZUNhbGxiYWNrUmVmIiwiYXR0YWNobWVudHMiLCJjaGFubmVsRGF0YSIsIm1lc3NhZ2VCYWNrIiwibWVzc2FnZUJhY2tEaXNwbGF5VGV4dCIsImRpc3BsYXlUZXh0IiwidGV4dCIsInRleHRGb3JtYXQiLCJhY3Rpdml0eURpc3BsYXlUZXh0IiwiZnJvbVVzZXIiLCJhdHRhY2hlZEFsdCIsImdyZWV0aW5nQWx0IiwicmVwbGFjZSIsIm51Yk9mZnNldCIsIm51YlNpemUiLCJvdGhlckluaXRpYWxzIiwib3RoZXJOdWJTaXplIiwiaGFzQXZhdGFyIiwiaGFzT3RoZXJBdmF0YXIiLCJoYXNOdWIiLCJoYXNPdGhlck51YiIsInRvcEFsaWduZWRDYWxsb3V0IiwiZXh0cmFUcmFpbGluZyIsInNob3dBdmF0YXIiLCJzaG93TnViIiwibGVuZ3RoIiwiYXR0YWNobWVudCIsImNvbnRlbnQiLCJjb250ZW50VHlwZSIsIm1hcCIsImluZGV4IiwiZGVmYXVsdFByb3BzIiwicHJvcFR5cGVzIiwiUHJvcFR5cGVzIiwic2hhcGUiLCJhcnJheSIsInN0cmluZyIsInN0YXRlIiwiaXNSZXF1aXJlZCIsInRpbWVzdGFtcCIsImJvb2wiLCJvbmVPZlR5cGUiLCJvbmVPZiIsImZ1bmMiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFFQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFFQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7Ozs7Ozs7Ozs7Ozs7OztJQUVRQSxlLEdBQW1GQyw2QixDQUFuRkQsZTtJQUFpQkUsZ0IsR0FBa0VELDZCLENBQWxFQyxnQjtJQUFrQkMsWSxHQUFnREYsNkIsQ0FBaERFLFk7SUFBY0MsWSxHQUFrQ0gsNkIsQ0FBbENHLFk7SUFBY0MsZSxHQUFvQkosNkIsQ0FBcEJJLGU7QUFFdkUsSUFBTUMsVUFBVSxHQUFHO0FBQ2pCLG1DQUFpQztBQUMvQkMsSUFBQUEsT0FBTyxFQUFFLE1BRHNCO0FB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QUEsV0FBVyxFQUFFNEIsbUJBQVVHO0FBREksT0FBaEIsQ0FEYztBQUkzQkMsTUFBQUEsS0FBSyxFQUFFSixtQkFBVUc7QUFKVSxLQUFoQixDQUZXO0FBUXhCN0QsSUFBQUEsSUFBSSxFQUFFMEQsbUJBQVVDLEtBQVYsQ0FBZ0I7QUFDcEIxRCxNQUFBQSxJQUFJLEVBQUV5RCxtQkFBVUcsTUFBVixDQUFpQkU7QUFESCxLQUFoQixFQUVIQSxVQVZxQjtBQVd4QmhDLElBQUFBLElBQUksRUFBRTJCLG1CQUFVRyxNQVhRO0FBWXhCN0IsSUFBQUEsVUFBVSxFQUFFMEIsbUJBQVVHLE1BWkU7QUFheEJHLElBQUFBLFNBQVMsRUFBRU4sbUJBQVVHO0FBYkcsR0FBaEIsRUFjUEUsVUFmeUI7QUFnQjVCM0QsRUFBQUEsU0FBUyxFQUFFc0QsbUJBQVVHLE1BaEJPO0FBaUI1QnhELEVBQUFBLGFBQWEsRUFBRXFELG1CQUFVTyxJQWpCRztBQWtCNUIzRCxFQUFBQSxvQkFBb0IsRUFBRW9ELG1CQUFVUSxTQUFWLENBQW9CLENBQUNSLG1CQUFVUyxLQUFWLENBQWdCLENBQUMsS0FBRCxDQUFoQixDQUFELEVBQTJCVCxtQkFBVVUsSUFBckMsQ0FBcEIsQ0FsQk07QUFtQjVCN0QsRUFBQUEsZ0JBQWdCLEVBQUVtRCxtQkFBVVUsSUFBVixDQUFlTCxVQW5CTDtBQW9CNUJ2RCxFQUFBQSxZQUFZLEVBQUVrRCxtQkFBVVEsU0FBVixDQUFvQixDQUFDUixtQkFBVVMsS0FBVixDQUFnQixDQUFDLEtBQUQsQ0FBaEIsQ0FBRCxFQUEyQlQsbUJBQVVVLElBQXJDLENBQXBCLENBcEJjO0FBcUI1QjNELEVBQUFBLFdBQVcsRUFBRWlELG1CQUFVTztBQXJCSyxDQUE5QjtlQXdCZTlELGlCIiwic291cmNlUm9vdCI6ImNvbXBvbmVudDovLy8iLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQgY29tcGxleGl0eTogW1wiZXJyb3JcIiwgMzBdICovXG5cbmltcG9ydCB7IGhvb2tzIH0gZnJvbSAnYm90ZnJhbWV3b3JrLXdlYmNoYXQtYXBpJztcbmltcG9ydCB7IHVzZUl0ZW1Db250YWluZXJDYWxsYmFja1JlZiwgdXNlU2Nyb2xsYWJsZUNhbGxiYWNrUmVmIH0gZnJvbSAncmVhY3QtZmlsbSc7XG5pbXBvcnQgY2xhc3NOYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5pbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuXG5pbXBvcnQgQnViYmxlIGZyb20gJy4vQnViYmxlJztcbmltcG9ydCBjb25uZWN0VG9XZWJDaGF0IGZyb20gJy4uL2Nvbm5lY3RUb1dlYkNoYXQnO1xuaW1wb3J0IGlzWmVyb09yUG9zaXRpdmUgZnJvbSAnLi4vVXRpbHMvaXNaZXJvT3JQb3NpdGl2ZSc7XG5pbXBvcnQgU2NyZWVuUmVhZGVyVGV4dCBmcm9tICcuLi9TY3JlZW5SZWFkZXJUZXh0JztcbmltcG9ydCB0ZXh0Rm9ybWF0VG9Db250ZW50VHlwZSBmcm9tICcuLi9VdGlscy90ZXh0Rm9ybWF0VG9Db250ZW50VHlwZSc7XG5pbXBvcnQgdXNlU3R5bGVTZXQgZnJvbSAnLi4vaG9va3MvdXNlU3R5bGVTZXQnO1xuaW1wb3J0IHVzZVN0eWxlVG9FbW90aW9uT2JqZWN0IGZyb20gJy4uL2hvb2tzL2ludGVybmFsL3VzZVN0eWxlVG9FbW90aW9uT2JqZWN0JztcbmltcG9ydCB1c2VVbmlxdWVJZCBmcm9tICcuLi9ob29rcy9pbnRlcm5hbC91c2VVbmlxdWVJZCc7XG5cbmNvbnN0IHsgdXNlQXZhdGFyRm9yQm90LCB1c2VBdmF0YXJGb3JVc2VyLCB1c2VEaXJlY3Rpb24sIHVzZUxvY2FsaXplciwgdXNlU3R5bGVPcHRpb25zIH0gPSBob29rcztcblxuY29uc3QgUk9PVF9TVFlMRSA9IHtcbiAgJyYud2ViY2hhdF9fY2Fyb3VzZWwtZmlsbXN0cmlwJzoge1xuICAgIGRpc3BsYXk6ICdmbGV4JyxcbiAgICBmbGV4RGlyZWN0aW9uOiAnY29sdW1uJyxcbiAgICBNc092ZXJmbG93U3R5bGU6ICdub25lJyxcbiAgICBvdmVyZmxvd1g6ICdzY3JvbGwnLFxuICAgIG92ZXJmbG93WTogJ2hpZGRlbicsXG4gICAgcG9zaXRpb246ICdyZWxhdGl2ZScsIC8vIFRoaXMgaXMgdG8ga2VlcCBzY3JlZW4gcmVhZGVyIHRleHQgaW4gdGhlIGRlc3RpbmF0ZWQgYXJlYS5cbiAgICB0b3VjaEFjdGlvbjogJ21hbmlwdWxhdGlvbicsXG4gICAgV2Via2l0T3ZlcmZsb3dTY3JvbGxpbmc6ICd0b3VjaCcsXG5cbiAgICAnJjo6LXdlYmtpdC1zY3JvbGxiYXInOiB7XG4gICAgICBkaXNwbGF5OiAnbm9uZSdcbiAgICB9LFxuXG4gICAgJyYgLndlYmNoYXRfX2Nhcm91c2VsLWZpbG1zdHJpcF9fYWxpZ25tZW50LXBhZCc6IHtcbiAgICAgIGZsZXhTaHJpbms6IDBcbiAgICB9LFxuXG4gICAgJyYgLndlYmNoYXRfX2Nhcm91c2VsLWZpbG1zdHJpcF9fYXR0YWNobWVudCc6IHtcbiAgICAgIGZsZXg6IDFcbiAgICB9LFxuXG4gICAgJyYgLndlYmNoYXRfX2Nhcm91c2VsLWZpbG1zdHJpcF9fYXR0YWNobWVudHMnOiB7XG4gICAgICBkaXNwbGF5OiAnZmxleCcsXG4gICAgICBsaXN0U3R5bGVUeXBlOiAnbm9uZScsXG4gICAgICBtYXJnaW46IDAsXG4gICAgICBwYWRkaW5nOiAwXG4gICAgfSxcblxuICAgICcmIC53ZWJjaGF0X19jYXJvdXNlbC1maWxtc3RyaXBfX2F2YXRhcic6IHtcbiAgICAgIGZsZXhTaHJpbms6IDBcbiAgICB9LFxuXG4gICAgJyYgLndlYmNoYXRfX2Nhcm91c2VsLWZpbG1zdHJpcF9fYXZhdGFyLWd1dHRlcic6IHtcbiAgICAgIGRpc3BsYXk6ICdmbGV4JyxcbiAgICAgIGZsZXhEaXJlY3Rpb246ICdjb2x1bW4nLFxuICAgICAgZmxleFNocmluazogMFxuICAgIH0sXG5cbiAgICAnJiAud2ViY2hhdF9fY2Fyb3VzZWwtZmlsbXN0cmlwX19jb21wbGltZW50YXJ5Jzoge1xuICAgICAgZGlzcGxheTogJ2ZsZXgnXG4gICAgfSxcblxuICAgICcmIC53ZWJjaGF0X19jYXJvdXNlbC1maWxtc3RyaXBfX2NvbXBsaW1lbnRhcnktY29udGVudCc6IHtcbiAgICAgIGRpc3BsYXk6ICdmbGV4JyxcbiAgICAgIGZsZXhHcm93OiAxLFxuICAgICAgZmxleERpcmVjdGlvbjogJ2NvbHVtbidcbiAgICB9LFxuXG4gICAgJyYgLndlYmNoYXRfX2Nhcm91c2VsLWZpbG1zdHJpcF9fY29udGVudCc6IHtcbiAgICAgIGRpc3BsYXk6ICdmbGV4JyxcbiAgICAgIGZsZXhHcm93OiAxLFxuICAgICAgZmxleERpcmVjdGlvbjogJ2NvbHVtbidcbiAgICB9LFxuXG4gICAgJyYgLndlYmNoYXRfX2Nhcm91c2VsLWZpbG1zdHJpcF9fZmlsbGVyJzoge1xuICAgICAgZmxleEdyb3c6IDEwMDAwLFxuICAgICAgZmxleFNocmluazogMVxuICAgIH0sXG5cbiAgICAnJiAud2ViY2hhdF9fY2Fyb3VzZWwtZmlsbXN0cmlwX19tYWluJzoge1xuICAgICAgZGlzcGxheTogJ2ZsZXgnXG4gICAgfSxcblxuICAgICcmIC53ZWJjaGF0X19jYXJvdXNlbC1maWxtc3RyaXBfX21lc3NhZ2UnOiB7XG4gICAgICBkaXNwbGF5OiAnZmxleCdcbiAgICB9LFxuXG4gICAgJyYgLndlYmNoYXRfX2Nhcm91c2VsLWZpbG1zdHJpcF9fbnViLXBhZCc6IHtcbiAgICAgIGZsZXhTaHJpbms6IDBcbiAgICB9LFxuXG4gICAgJyYgLndlYmNoYXRfX2Nhcm91c2VsLWZpbG1zdHJpcF9fc3RhdHVzJzoge1xuICAgICAgZGlzcGxheTogJ2ZsZXgnXG4gICAgfVxuICB9XG59O1xuXG5jb25zdCBjb25uZWN0Q2Fyb3VzZWxGaWxtU3RyaXAgPSAoLi4uc2VsZWN0b3JzKSA9PlxuICBjb25uZWN0VG9XZWJDaGF0KFxuICAgIChcbiAgICAgIHtcbiAgICAgICAgbGFuZ3VhZ2UsXG4gICAgICAgIHN0eWxlU2V0OiB7XG4gICAgICAgICAgb3B0aW9uczogeyBib3RBdmF0YXJJbml0aWFscywgdXNlckF2YXRhckluaXRpYWxzIH1cbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHsgYWN0aXZpdHk6IHsgZnJvbTogeyByb2xlIH0gPSB7fSB9ID0ge30gfVxuICAgICkgPT4gKHtcbiAgICAgIGF2YXRhckluaXRpYWxzOiByb2xlID09PSAndXNlcicgPyB1c2VyQXZhdGFySW5pdGlhbHMgOiBib3RBdmF0YXJJbml0aWFscyxcbiAgICAgIGxhbmd1YWdlXG4gICAgfSksXG4gICAgLi4uc2VsZWN0b3JzXG4gICk7XG5cbmNvbnN0IENhcm91c2VsRmlsbVN0cmlwID0gKHtcbiAgYWN0aXZpdHksXG4gIGNsYXNzTmFtZSxcbiAgaGlkZVRpbWVzdGFtcCxcbiAgcmVuZGVyQWN0aXZpdHlTdGF0dXMsXG4gIHJlbmRlckF0dGFjaG1lbnQsXG4gIHJlbmRlckF2YXRhcixcbiAgc2hvd0NhbGxvdXRcbn0pID0+IHtcbiAgY29uc3QgW3sgYnViYmxlTnViT2Zmc2V0LCBidWJibGVOdWJTaXplLCBidWJibGVGcm9tVXNlck51Yk9mZnNldCwgYnViYmxlRnJvbVVzZXJOdWJTaXplIH1dID0gdXNlU3R5bGVPcHRpb25zKCk7XG4gIGNvbnN0IFt7IGNhcm91c2VsRmlsbVN0cmlwOiBjYXJvdXNlbEZpbG1TdHJpcFN0eWxlU2V0IH1dID0gdXNlU3R5bGVTZXQoKTtcbiAgY29uc3QgW3sgaW5pdGlhbHM6IGJvdEluaXRpYWxzIH1dID0gdXNlQXZhdGFyRm9yQm90KCk7XG4gIGNvbnN0IFt7IGluaXRpYWxzOiB1c2VySW5pdGlhbHMgfV0gPSB1c2VBdmF0YXJGb3JVc2VyKCk7XG4gIGNvbnN0IFtkaXJlY3Rpb25dID0gdXNlRGlyZWN0aW9uKCk7XG4gIGNvbnN0IGFyaWFMYWJlbElkID0gdXNlVW5pcXVlSWQoJ3dlYmNoYXRfX2Nhcm91c2VsLWZpbG1zdHJpcF9faWQnKTtcbiAgY29uc3QgbG9jYWxpemUgPSB1c2VMb2NhbGl6ZXIoKTtcbiAgY29uc3Qgcm9vdENsYXNzTmFtZSA9IHVzZVN0eWxlVG9FbW90aW9uT2JqZWN0KCkoUk9PVF9TVFlMRSkgKyAnJztcbiAgY29uc3Qgc2hvd0FjdGl2aXR5U3RhdHVzID0gdHlwZW9mIHJlbmRlckFjdGl2aXR5U3RhdHVzID09PSAnZnVuY3Rpb24nO1xuXG4gIGNvbnN0IGl0ZW1Db250YWluZXJDYWxsYmFja1JlZiA9IHVzZUl0ZW1Db250YWluZXJDYWxsYmFja1JlZigpO1xuICBjb25zdCBzY3JvbGxhYmxlQ2FsbGJhY2tSZWYgPSB1c2VTY3JvbGxhYmxlQ2FsbGJhY2tSZWYoKTtcblxuICBjb25zdCB7XG4gICAgYXR0YWNobWVudHMgPSBbXSxcbiAgICBjaGFubmVsRGF0YTogeyBtZXNzYWdlQmFjazogeyBkaXNwbGF5VGV4dDogbWVzc2FnZUJhY2tEaXNwbGF5VGV4dCB9ID0ge30gfSA9IHt9LFxuICAgIGZyb206IHsgcm9sZSB9ID0ge30sXG4gICAgdGV4dCxcbiAgICB0ZXh0Rm9ybWF0XG4gIH0gPSBhY3Rpdml0eTtcblxuICBjb25zdCBhY3Rpdml0eURpc3BsYXlUZXh0ID0gbWVzc2FnZUJhY2tEaXNwbGF5VGV4dCB8fCB0ZXh0O1xuICBjb25zdCBmcm9tVXNlciA9IHJvbGUgPT09ICd1c2VyJztcblxuICBjb25zdCBhdHRhY2hlZEFsdCA9IGxvY2FsaXplKGZyb21Vc2VyID8gJ0FDVElWSVRZX1lPVV9BVFRBQ0hFRF9BTFQnIDogJ0FDVElWSVRZX0JPVF9BVFRBQ0hFRF9BTFQnKTtcbiAgY29uc3QgZ3JlZXRpbmdBbHQgPSAoZnJvbVVzZXJcbiAgICA/IGxvY2FsaXplKCdBQ1RJVklUWV9ZT1VfU0FJRF9BTFQnKVxuICAgIDogbG9jYWxpemUoJ0FDVElWSVRZX0JPVF9TQUlEX0FMVCcsIGJvdEluaXRpYWxzIHx8ICcnKVxuICApLnJlcGxhY2UoL1xcc3syLH0vZ3UsICcgJyk7XG5cbiAgY29uc3QgaW5pdGlhbHMgPSBmcm9tVXNlciA/IHVzZXJJbml0aWFscyA6IGJvdEluaXRpYWxzO1xuICBjb25zdCBudWJPZmZzZXQgPSBmcm9tVXNlciA/IGJ1YmJsZUZyb21Vc2VyTnViT2Zmc2V0IDogYnViYmxlTnViT2Zmc2V0O1xuICBjb25zdCBudWJTaXplID0gZnJvbVVzZXIgPyBidWJibGVGcm9tVXNlck51YlNpemUgOiBidWJibGVOdWJTaXplO1xuICBjb25zdCBvdGhlckluaXRpYWxzID0gZnJvbVVzZXIgPyBib3RJbml0aWFscyA6IHVzZXJJbml0aWFscztcbiAgY29uc3Qgb3RoZXJOdWJTaXplID0gZnJvbVVzZXIgPyBidWJibGVOdWJTaXplIDogYnViYmxlRnJvbVVzZXJOdWJTaXplO1xuXG4gIGNvbnN0IGhhc0F2YXRhciA9IGluaXRpYWxzIHx8IHR5cGVvZiBpbml0aWFscyA9PT0gJ3N0cmluZyc7XG4gIGNvbnN0IGhhc090aGVyQXZhdGFyID0gb3RoZXJJbml0aWFscyB8fCB0eXBlb2Ygb3RoZXJJbml0aWFscyA9PT0gJ3N0cmluZyc7XG4gIGNvbnN0IGhhc051YiA9IHR5cGVvZiBudWJTaXplID09PSAnbnVtYmVyJztcbiAgY29uc3QgaGFzT3RoZXJOdWIgPSB0eXBlb2Ygb3RoZXJOdWJTaXplID09PSAnbnVtYmVyJztcbiAgY29uc3QgdG9wQWxpZ25lZENhbGxvdXQgPSBpc1plcm9PclBvc2l0aXZlKG51Yk9mZnNldCk7XG5cbiAgY29uc3QgZXh0cmFUcmFpbGluZyA9ICFoYXNPdGhlckF2YXRhciAmJiBoYXNPdGhlck51YjsgLy8gVGhpcyBpcyBmb3IgYm90IG1lc3NhZ2Ugd2l0aCB1c2VyIG51YiBhbmQgbm8gdXNlciBhdmF0YXIuIEFuZCB2aWNlIHZlcnNhLlxuXG4gIGNvbnN0IHNob3dBdmF0YXIgPSBzaG93Q2FsbG91dCAmJiBoYXNBdmF0YXIgJiYgISFyZW5kZXJBdmF0YXI7XG4gIGNvbnN0IHNob3dOdWIgPSBzaG93Q2FsbG91dCAmJiBoYXNOdWIgJiYgKHRvcEFsaWduZWRDYWxsb3V0IHx8ICFhdHRhY2htZW50cy5sZW5ndGgpO1xuXG4gIHJldHVybiAoXG4gICAgPGRpdlxuICAgICAgYXJpYS1sYWJlbGxlZGJ5PXthcmlhTGFiZWxJZH1cbiAgICAgIGNsYXNzTmFtZT17Y2xhc3NOYW1lcyhcbiAgICAgICAgJ3dlYmNoYXRfX2Nhcm91c2VsLWZpbG1zdHJpcCcsXG4gICAgICAgIHtcbiAgICAgICAgICAnd2ViY2hhdF9fY2Fyb3VzZWwtZmlsbXN0cmlwLS1leHRyYS10cmFpbGluZyc6IGV4dHJhVHJhaWxpbmcsXG4gICAgICAgICAgJ3dlYmNoYXRfX2Nhcm91c2VsLWZpbG1zdHJpcC0taGlkZS1hdmF0YXInOiBoYXNBdmF0YXIgJiYgIXNob3dBdmF0YXIsXG4gICAgICAgICAgJ3dlYmNoYXRfX2Nhcm91c2VsLWZpbG1zdHJpcC0taGlkZS1udWInOiBoYXNOdWIgJiYgIXNob3dOdWIsXG4gICAgICAgICAgJ3dlYmNoYXRfX2Nhcm91c2VsLWZpbG1zdHJpcC0tbm8tbWVzc2FnZSc6ICFhY3Rpdml0eURpc3BsYXlUZXh0LFxuICAgICAgICAgICd3ZWJjaGF0X19jYXJvdXNlbC1maWxtc3RyaXAtLXJ0bCc6IGRpcmVjdGlvbiA9PT0gJ3J0bCcsXG4gICAgICAgICAgJ3dlYmNoYXRfX2Nhcm91c2VsLWZpbG1zdHJpcC0tc2hvdy1hdmF0YXInOiBzaG93QXZhdGFyLFxuICAgICAgICAgICd3ZWJjaGF0X19jYXJvdXNlbC1maWxtc3RyaXAtLXNob3ctbnViJzogc2hvd051YixcbiAgICAgICAgICAnd2ViY2hhdF9fY2Fyb3VzZWwtZmlsbXN0cmlwLS10b3AtY2FsbG91dCc6IHRvcEFsaWduZWRDYWxsb3V0XG4gICAgICAgIH0sXG4gICAgICAgICdyZWFjdC1maWxtX19maWxtc3RyaXAnLFxuICAgICAgICByb290Q2xhc3NOYW1lLFxuICAgICAgICBjYXJvdXNlbEZpbG1TdHJpcFN0eWxlU2V0ICsgJycsXG4gICAgICAgIChjbGFzc05hbWUgfHwgJycpICsgJydcbiAgICAgICl9XG4gICAgICByZWY9e3Njcm9sbGFibGVDYWxsYmFja1JlZn1cbiAgICAgIHJvbGU9XCJncm91cFwiXG4gICAgPlxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJ3ZWJjaGF0X19jYXJvdXNlbC1maWxtc3RyaXBfX21haW5cIj5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJ3ZWJjaGF0X19jYXJvdXNlbC1maWxtc3RyaXBfX2F2YXRhci1ndXR0ZXJcIj57c2hvd0F2YXRhciAmJiByZW5kZXJBdmF0YXIoeyBhY3Rpdml0eSB9KX08L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJ3ZWJjaGF0X19jYXJvdXNlbC1maWxtc3RyaXBfX2NvbnRlbnRcIj5cbiAgICAgICAgICB7ISFhY3Rpdml0eURpc3BsYXlUZXh0ICYmIChcbiAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgYXJpYS1yb2xlZGVzY3JpcHRpb249XCJtZXNzYWdlXCJcbiAgICAgICAgICAgICAgY2xhc3NOYW1lPVwid2ViY2hhdF9fY2Fyb3VzZWwtZmlsbXN0cmlwX19tZXNzYWdlXCJcbiAgICAgICAgICAgICAgLy8gRGlzYWJsZSBcIlByb3AgYGlkYCBpcyBmb3JiaWRkZW4gb24gRE9NIE5vZGVzXCIgcnVsZSBiZWNhdXNlIHdlIGFyZSB1c2luZyB0aGUgSUQgcHJvcCBmb3IgYWNjZXNzaWJpbGl0eS5cbiAgICAgICAgICAgICAgLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0L2ZvcmJpZC1kb20tcHJvcHMgKi9cbiAgICAgICAgICAgICAgaWQ9e2FyaWFMYWJlbElkfVxuICAgICAgICAgICAgICByb2xlPVwiZ3JvdXBcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8U2NyZWVuUmVhZGVyVGV4dCB0ZXh0PXtncmVldGluZ0FsdH0gLz5cbiAgICAgICAgICAgICAgPEJ1YmJsZVxuICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cIndlYmNoYXRfX2Nhcm91c2VsLWZpbG1zdHJpcF9fYnViYmxlXCJcbiAgICAgICAgICAgICAgICBmcm9tVXNlcj17ZnJvbVVzZXJ9XG4gICAgICAgICAgICAgICAgbnViPXtzaG93TnViIHx8ICgoaGFzQXZhdGFyIHx8IGhhc051YikgJiYgJ2hpZGRlbicpfVxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAge3JlbmRlckF0dGFjaG1lbnQoe1xuICAgICAgICAgICAgICAgICAgYWN0aXZpdHksXG4gICAgICAgICAgICAgICAgICBhdHRhY2htZW50OiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRlbnQ6IGFjdGl2aXR5RGlzcGxheVRleHQsXG4gICAgICAgICAgICAgICAgICAgIGNvbnRlbnRUeXBlOiB0ZXh0Rm9ybWF0VG9Db250ZW50VHlwZSh0ZXh0Rm9ybWF0KVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pfVxuICAgICAgICAgICAgICA8L0J1YmJsZT5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJ3ZWJjaGF0X19jYXJvdXNlbC1maWxtc3RyaXBfX2ZpbGxlclwiIC8+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICApfVxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwid2ViY2hhdF9fY2Fyb3VzZWwtZmlsbXN0cmlwX19jb21wbGltZW50YXJ5XCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIndlYmNoYXRfX2Nhcm91c2VsLWZpbG1zdHJpcF9fbnViLXBhZFwiIC8+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIndlYmNoYXRfX2Nhcm91c2VsLWZpbG1zdHJpcF9fY29tcGxpbWVudGFyeS1jb250ZW50IGNcIj5cbiAgICAgICAgICAgICAgPHVsXG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwid2ViY2hhdF9fY2Fyb3VzZWwtZmlsbXN0cmlwX19hdHRhY2htZW50cyByZWFjdC1maWxtX19maWxtc3RyaXBfX2xpc3RcIlxuICAgICAgICAgICAgICAgIHJlZj17aXRlbUNvbnRhaW5lckNhbGxiYWNrUmVmfVxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAge2F0dGFjaG1lbnRzLm1hcCgoYXR0YWNobWVudCwgaW5kZXgpID0+IChcbiAgICAgICAgICAgICAgICAgIDxsaVxuICAgICAgICAgICAgICAgICAgICBhcmlhLXJvbGVkZXNjcmlwdGlvbj1cImF0dGFjaG1lbnRcIlxuICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJ3ZWJjaGF0X19jYXJvdXNlbC1maWxtc3RyaXBfX2F0dGFjaG1lbnQgcmVhY3QtZmlsbV9fZmlsbXN0cmlwX19pdGVtXCJcbiAgICAgICAgICAgICAgICAgICAgLyogQXR0YWNobWVudHMgZG8gbm90IGhhdmUgYW4gSUQ7IGl0IGlzIGFsd2F5cyBpbmRleGVkIGJ5IG51bWJlciAqL1xuICAgICAgICAgICAgICAgICAgICAvKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3Qvbm8tYXJyYXktaW5kZXgta2V5ICovXG4gICAgICAgICAgICAgICAgICAgIGtleT17aW5kZXh9XG4gICAgICAgICAgICAgICAgICAgIHJvbGU9XCJsaXN0aXRlbVwiXG4gICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDxTY3JlZW5SZWFkZXJUZXh0IHRleHQ9e2F0dGFjaGVkQWx0fSAvPlxuICAgICAgICAgICAgICAgICAgICB7LyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0L25vLWFycmF5LWluZGV4LWtleSAqL31cbiAgICAgICAgICAgICAgICAgICAgPEJ1YmJsZSBmcm9tVXNlcj17ZnJvbVVzZXJ9IGtleT17aW5kZXh9IG51Yj17ZmFsc2V9PlxuICAgICAgICAgICAgICAgICAgICAgIHtyZW5kZXJBdHRhY2htZW50KHsgYWN0aXZpdHksIGF0dGFjaG1lbnQgfSl9XG4gICAgICAgICAgICAgICAgICAgIDwvQnViYmxlPlxuICAgICAgICAgICAgICAgICAgPC9saT5cbiAgICAgICAgICAgICAgICApKX1cbiAgICAgICAgICAgICAgPC91bD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJ3ZWJjaGF0X19jYXJvdXNlbC1maWxtc3RyaXBfX2FsaWdubWVudC1wYWRcIiAvPlxuICAgICAgPC9kaXY+XG4gICAgICB7c2hvd0FjdGl2aXR5U3RhdHVzICYmIChcbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJ3ZWJjaGF0X19jYXJvdXNlbC1maWxtc3RyaXBfX3N0YXR1c1wiPlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwid2ViY2hhdF9fY2Fyb3VzZWwtZmlsbXN0cmlwX19hdmF0YXItZ3V0dGVyXCIgLz5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIndlYmNoYXRfX2Nhcm91c2VsLWZpbG1zdHJpcF9fbnViLXBhZFwiIC8+XG4gICAgICAgICAge3JlbmRlckFjdGl2aXR5U3RhdHVzKHsgaGlkZVRpbWVzdGFtcCB9KX1cbiAgICAgICAgPC9kaXY+XG4gICAgICApfVxuICAgIDwvZGl2PlxuICApO1xufTtcblxuQ2Fyb3VzZWxGaWxtU3RyaXAuZGVmYXVsdFByb3BzID0ge1xuICBjbGFzc05hbWU6ICcnLFxuICBoaWRlVGltZXN0YW1wOiBmYWxzZSxcbiAgcmVuZGVyQWN0aXZpdHlTdGF0dXM6IGZhbHNlLFxuICByZW5kZXJBdmF0YXI6IGZhbHNlLFxuICBzaG93Q2FsbG91dDogZmFsc2Vcbn07XG5cbkNhcm91c2VsRmlsbVN0cmlwLnByb3BUeXBlcyA9IHtcbiAgYWN0aXZpdHk6IFByb3BUeXBlcy5zaGFwZSh7XG4gICAgYXR0YWNobWVudHM6IFByb3BUeXBlcy5hcnJheSxcbiAgICBjaGFubmVsRGF0YTogUHJvcFR5cGVzLnNoYXBlKHtcbiAgICAgIG1lc3NhZ2VCYWNrOiBQcm9wVHlwZXMuc2hhcGUoe1xuICAgICAgICBkaXNwbGF5VGV4dDogUHJvcFR5cGVzLnN0cmluZ1xuICAgICAgfSksXG4gICAgICBzdGF0ZTogUHJvcFR5cGVzLnN0cmluZ1xuICAgIH0pLFxuICAgIGZyb206IFByb3BUeXBlcy5zaGFwZSh7XG4gICAgICByb2xlOiBQcm9wVHlwZXMuc3RyaW5nLmlzUmVxdWlyZWRcbiAgICB9KS5pc1JlcXVpcmVkLFxuICAgIHRleHQ6IFByb3BUeXBlcy5zdHJpbmcsXG4gICAgdGV4dEZvcm1hdDogUHJvcFR5cGVzLnN0cmluZyxcbiAgICB0aW1lc3RhbXA6IFByb3BUeXBlcy5zdHJpbmdcbiAgfSkuaXNSZXF1aXJlZCxcbiAgY2xhc3NOYW1lOiBQcm9wVHlwZXMuc3RyaW5nLFxuICBoaWRlVGltZXN0YW1wOiBQcm9wVHlwZXMuYm9vbCxcbiAgcmVuZGVyQWN0aXZpdHlTdGF0dXM6IFByb3BUeXBlcy5vbmVPZlR5cGUoW1Byb3BUeXBlcy5vbmVPZihbZmFsc2VdKSwgUHJvcFR5cGVzLmZ1bmNdKSxcbiAgcmVuZGVyQXR0YWNobWVudDogUHJvcFR5cGVzLmZ1bmMuaXNSZXF1aXJlZCxcbiAgcmVuZGVyQXZhdGFyOiBQcm9wVHlwZXMub25lT2ZUeXBlKFtQcm9wVHlwZXMub25lT2YoW2ZhbHNlXSksIFByb3BUeXBlcy5mdW5jXSksXG4gIHNob3dDYWxsb3V0OiBQcm9wVHlwZXMuYm9vbFxufTtcblxuZXhwb3J0IGRlZmF1bHQgQ2Fyb3VzZWxGaWxtU3RyaXA7XG5cbmV4cG9ydCB7IGNvbm5lY3RDYXJvdXNlbEZpbG1TdHJpcCB9O1xuIl19