matrix-react-sdk
Version:
SDK for matrix.org using React
242 lines (202 loc) • 28.9 kB
JavaScript
"use strict";
var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard");
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = void 0;
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
var _react = _interopRequireWildcard(require("react"));
var _classnames = _interopRequireDefault(require("classnames"));
var _event = require("matrix-js-sdk/src/@types/event");
var _reactFocusLock = _interopRequireDefault(require("react-focus-lock"));
var _languageHandler = require("../../../languageHandler");
var _AccessibleTooltipButton = _interopRequireDefault(require("../elements/AccessibleTooltipButton"));
var _ContextMenu = require("../../structures/ContextMenu");
var _createRoom = _interopRequireWildcard(require("../../../createRoom"));
var _MatrixClientContext = _interopRequireDefault(require("../../../contexts/MatrixClientContext"));
var _SpaceBasicSettings = require("./SpaceBasicSettings");
var _AccessibleButton = _interopRequireDefault(require("../elements/AccessibleButton"));
var _BetaCard = require("../beta/BetaCard");
var _dispatcher = _interopRequireDefault(require("../../../dispatcher/dispatcher"));
var _actions = require("../../../dispatcher/actions");
var _UserSettingsDialog = require("../dialogs/UserSettingsDialog");
var _Field = _interopRequireDefault(require("../elements/Field"));
var _Validation = _interopRequireDefault(require("../elements/Validation"));
var _SpaceRoomView = require("../../structures/SpaceRoomView");
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { (0, _defineProperty2.default)(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
const SpaceCreateMenuType = ({
title,
description,
className,
onClick
}) => {
return /*#__PURE__*/_react.default.createElement(_AccessibleButton.default, {
className: (0, _classnames.default)("mx_SpaceCreateMenuType", className),
onClick: onClick
}, /*#__PURE__*/_react.default.createElement("h3", null, title), /*#__PURE__*/_react.default.createElement("span", null, description));
};
var Visibility;
(function (Visibility) {
Visibility[Visibility["Public"] = 0] = "Public";
Visibility[Visibility["Private"] = 1] = "Private";
})(Visibility || (Visibility = {}));
const spaceNameValidator = (0, _Validation.default)({
rules: [{
key: "required",
test: async ({
value
}) => !!value,
invalid: () => (0, _languageHandler._t)("Please enter a name for the space")
}]
});
const SpaceCreateMenu = ({
onFinished
}) => {
const cli = (0, _react.useContext)(_MatrixClientContext.default);
const [visibility, setVisibility] = (0, _react.useState)(null);
const [busy, setBusy] = (0, _react.useState)(false);
const [name, setName] = (0, _react.useState)("");
const spaceNameField = (0, _react.useRef)();
const [avatar, setAvatar] = (0, _react.useState)(null);
const [topic, setTopic] = (0, _react.useState)("");
const onSpaceCreateClick = async e => {
e.preventDefault();
if (busy) return;
setBusy(true); // require & validate the space name field
if (!(await spaceNameField.current.validate({
allowEmpty: false
}))) {
spaceNameField.current.focus();
spaceNameField.current.validate({
allowEmpty: false,
focused: true
});
setBusy(false);
return;
}
const initialState
/*: IStateEvent[]*/
= [{
type: _event.EventType.RoomHistoryVisibility,
content: {
"history_visibility": visibility === Visibility.Public ? "world_readable" : "invited"
}
}];
if (avatar) {
const url = await cli.uploadContent(avatar);
initialState.push({
type: _event.EventType.RoomAvatar,
content: {
url
}
});
}
if (topic) {
initialState.push({
type: _event.EventType.RoomTopic,
content: {
topic
}
});
}
try {
await (0, _createRoom.default)({
createOpts: {
preset: visibility === Visibility.Public ? _createRoom.Preset.PublicChat : _createRoom.Preset.PrivateChat,
name,
creation_content: {
// Based on MSC1840
[_event.RoomCreateTypeField]: _event.RoomType.Space
},
initial_state: initialState,
power_level_content_override: _objectSpread({
// Only allow Admins to write to the timeline to prevent hidden sync spam
events_default: 100
}, Visibility.Public ? {
invite: 0
} : {})
},
spinner: false,
encryption: false,
andView: true,
inlineErrors: true
});
onFinished();
} catch (e) {
console.error(e);
}
};
let body;
if (visibility === null) {
body = /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement("h2", null, (0, _languageHandler._t)("Create a space")), /*#__PURE__*/_react.default.createElement("p", null, (0, _languageHandler._t)("Spaces are a new way to group rooms and people. " + "To join an existing space you'll need an invite.")), /*#__PURE__*/_react.default.createElement(SpaceCreateMenuType, {
title: (0, _languageHandler._t)("Public"),
description: (0, _languageHandler._t)("Open space for anyone, best for communities"),
className: "mx_SpaceCreateMenuType_public",
onClick: () => setVisibility(Visibility.Public)
}), /*#__PURE__*/_react.default.createElement(SpaceCreateMenuType, {
title: (0, _languageHandler._t)("Private"),
description: (0, _languageHandler._t)("Invite only, best for yourself or teams"),
className: "mx_SpaceCreateMenuType_private",
onClick: () => setVisibility(Visibility.Private)
}), /*#__PURE__*/_react.default.createElement("p", null, (0, _languageHandler._t)("You can change this later")), /*#__PURE__*/_react.default.createElement(_SpaceRoomView.SpaceFeedbackPrompt, {
onClick: onFinished
}));
} else {
body = /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement(_AccessibleTooltipButton.default, {
className: "mx_SpaceCreateMenu_back",
onClick: () => setVisibility(null),
title: (0, _languageHandler._t)("Go back")
}), /*#__PURE__*/_react.default.createElement("h2", null, visibility === Visibility.Public ? (0, _languageHandler._t)("Your public space") : (0, _languageHandler._t)("Your private space")), /*#__PURE__*/_react.default.createElement("p", null, (0, _languageHandler._t)("Add some details to help people recognise it."), " ", (0, _languageHandler._t)("You can change these anytime.")), /*#__PURE__*/_react.default.createElement("form", {
className: "mx_SpaceBasicSettings",
onSubmit: onSpaceCreateClick
}, /*#__PURE__*/_react.default.createElement(_SpaceBasicSettings.SpaceAvatar, {
setAvatar: setAvatar,
avatarDisabled: busy
}), /*#__PURE__*/_react.default.createElement(_Field.default, {
name: "spaceName",
label: (0, _languageHandler._t)("Name"),
autoFocus: true,
value: name,
onChange: ev => setName(ev.target.value),
ref: spaceNameField,
onValidate: spaceNameValidator,
disabled: busy
}), /*#__PURE__*/_react.default.createElement(_Field.default, {
name: "spaceTopic",
element: "textarea",
label: (0, _languageHandler._t)("Description"),
value: topic,
onChange: ev => setTopic(ev.target.value),
rows: 3,
disabled: busy
})), /*#__PURE__*/_react.default.createElement(_AccessibleButton.default, {
kind: "primary",
onClick: onSpaceCreateClick,
disabled: busy
}, busy ? (0, _languageHandler._t)("Creating...") : (0, _languageHandler._t)("Create")));
}
return /*#__PURE__*/_react.default.createElement(_ContextMenu.ContextMenu, {
left: 72,
top: 62,
chevronOffset: 0,
chevronFace: _ContextMenu.ChevronFace.None,
onFinished: onFinished,
wrapperClassName: "mx_SpaceCreateMenu_wrapper",
managed: false
}, /*#__PURE__*/_react.default.createElement(_reactFocusLock.default, {
returnFocus: true
}, /*#__PURE__*/_react.default.createElement(_BetaCard.BetaPill, {
onClick: () => {
onFinished();
_dispatcher.default.dispatch({
action: _actions.Action.ViewUserSettings,
initialTabId: _UserSettingsDialog.USER_LABS_TAB
});
}
}), body));
};
var _default = SpaceCreateMenu;
exports.default = _default;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnRzL3ZpZXdzL3NwYWNlcy9TcGFjZUNyZWF0ZU1lbnUudHN4Il0sIm5hbWVzIjpbIlNwYWNlQ3JlYXRlTWVudVR5cGUiLCJ0aXRsZSIsImRlc2NyaXB0aW9uIiwiY2xhc3NOYW1lIiwib25DbGljayIsIlZpc2liaWxpdHkiLCJzcGFjZU5hbWVWYWxpZGF0b3IiLCJydWxlcyIsImtleSIsInRlc3QiLCJ2YWx1ZSIsImludmFsaWQiLCJTcGFjZUNyZWF0ZU1lbnUiLCJvbkZpbmlzaGVkIiwiY2xpIiwiTWF0cml4Q2xpZW50Q29udGV4dCIsInZpc2liaWxpdHkiLCJzZXRWaXNpYmlsaXR5IiwiYnVzeSIsInNldEJ1c3kiLCJuYW1lIiwic2V0TmFtZSIsInNwYWNlTmFtZUZpZWxkIiwiYXZhdGFyIiwic2V0QXZhdGFyIiwidG9waWMiLCJzZXRUb3BpYyIsIm9uU3BhY2VDcmVhdGVDbGljayIsImUiLCJwcmV2ZW50RGVmYXVsdCIsImN1cnJlbnQiLCJ2YWxpZGF0ZSIsImFsbG93RW1wdHkiLCJmb2N1cyIsImZvY3VzZWQiLCJpbml0aWFsU3RhdGUiLCJ0eXBlIiwiRXZlbnRUeXBlIiwiUm9vbUhpc3RvcnlWaXNpYmlsaXR5IiwiY29udGVudCIsIlB1YmxpYyIsInVybCIsInVwbG9hZENvbnRlbnQiLCJwdXNoIiwiUm9vbUF2YXRhciIsIlJvb21Ub3BpYyIsImNyZWF0ZU9wdHMiLCJwcmVzZXQiLCJQcmVzZXQiLCJQdWJsaWNDaGF0IiwiUHJpdmF0ZUNoYXQiLCJjcmVhdGlvbl9jb250ZW50IiwiUm9vbUNyZWF0ZVR5cGVGaWVsZCIsIlJvb21UeXBlIiwiU3BhY2UiLCJpbml0aWFsX3N0YXRlIiwicG93ZXJfbGV2ZWxfY29udGVudF9vdmVycmlkZSIsImV2ZW50c19kZWZhdWx0IiwiaW52aXRlIiwic3Bpbm5lciIsImVuY3J5cHRpb24iLCJhbmRWaWV3IiwiaW5saW5lRXJyb3JzIiwiY29uc29sZSIsImVycm9yIiwiYm9keSIsIlByaXZhdGUiLCJldiIsInRhcmdldCIsIkNoZXZyb25GYWNlIiwiTm9uZSIsImRlZmF1bHREaXNwYXRjaGVyIiwiZGlzcGF0Y2giLCJhY3Rpb24iLCJBY3Rpb24iLCJWaWV3VXNlclNldHRpbmdzIiwiaW5pdGlhbFRhYklkIiwiVVNFUl9MQUJTX1RBQiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7OztBQWdCQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFFQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7Ozs7O0FBRUEsTUFBTUEsbUJBQW1CLEdBQUcsQ0FBQztBQUFFQyxFQUFBQSxLQUFGO0FBQVNDLEVBQUFBLFdBQVQ7QUFBc0JDLEVBQUFBLFNBQXRCO0FBQWlDQyxFQUFBQTtBQUFqQyxDQUFELEtBQWdEO0FBQ3hFLHNCQUNJLDZCQUFDLHlCQUFEO0FBQWtCLElBQUEsU0FBUyxFQUFFLHlCQUFXLHdCQUFYLEVBQXFDRCxTQUFyQyxDQUE3QjtBQUE4RSxJQUFBLE9BQU8sRUFBRUM7QUFBdkYsa0JBQ0kseUNBQU1ILEtBQU4sQ0FESixlQUVJLDJDQUFRQyxXQUFSLENBRkosQ0FESjtBQU1ILENBUEQ7O0lBU0tHLFU7O1dBQUFBLFU7QUFBQUEsRUFBQUEsVSxDQUFBQSxVO0FBQUFBLEVBQUFBLFUsQ0FBQUEsVTtHQUFBQSxVLEtBQUFBLFU7O0FBS0wsTUFBTUMsa0JBQWtCLEdBQUcseUJBQWU7QUFDdENDLEVBQUFBLEtBQUssRUFBRSxDQUNIO0FBQ0lDLElBQUFBLEdBQUcsRUFBRSxVQURUO0FBRUlDLElBQUFBLElBQUksRUFBRSxPQUFPO0FBQUVDLE1BQUFBO0FBQUYsS0FBUCxLQUFxQixDQUFDLENBQUNBLEtBRmpDO0FBR0lDLElBQUFBLE9BQU8sRUFBRSxNQUFNLHlCQUFHLG1DQUFIO0FBSG5CLEdBREc7QUFEK0IsQ0FBZixDQUEzQjs7QUFVQSxNQUFNQyxlQUFlLEdBQUcsQ0FBQztBQUFFQyxFQUFB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QSxJQUFJLEVBQUUsQ0FOVjtBQU9JLE1BQUEsUUFBUSxFQUFFUTtBQVBkLE1BZEosQ0FwQkcsZUE2Q0gsNkJBQUMseUJBQUQ7QUFBa0IsTUFBQSxJQUFJLEVBQUMsU0FBdkI7QUFBaUMsTUFBQSxPQUFPLEVBQUVTLGtCQUExQztBQUE4RCxNQUFBLFFBQVEsRUFBRVQ7QUFBeEUsT0FDTUEsSUFBSSxHQUFHLHlCQUFHLGFBQUgsQ0FBSCxHQUF1Qix5QkFBRyxRQUFILENBRGpDLENBN0NHLENBQVA7QUFpREg7O0FBRUQsc0JBQU8sNkJBQUMsd0JBQUQ7QUFDSCxJQUFBLElBQUksRUFBRSxFQURIO0FBRUgsSUFBQSxHQUFHLEVBQUUsRUFGRjtBQUdILElBQUEsYUFBYSxFQUFFLENBSFo7QUFJSCxJQUFBLFdBQVcsRUFBRW1ELHlCQUFZQyxJQUp0QjtBQUtILElBQUEsVUFBVSxFQUFFekQsVUFMVDtBQU1ILElBQUEsZ0JBQWdCLEVBQUMsNEJBTmQ7QUFPSCxJQUFBLE9BQU8sRUFBRTtBQVBOLGtCQVNILDZCQUFDLHVCQUFEO0FBQVcsSUFBQSxXQUFXLEVBQUU7QUFBeEIsa0JBQ0ksNkJBQUMsa0JBQUQ7QUFBVSxJQUFBLE9BQU8sRUFBRSxNQUFNO0FBQ3JCQSxNQUFBQSxVQUFVOztBQUNWMEQsMEJBQWtCQyxRQUFsQixDQUEyQjtBQUN2QkMsUUFBQUEsTUFBTSxFQUFFQyxnQkFBT0MsZ0JBRFE7QUFFdkJDLFFBQUFBLFlBQVksRUFBRUM7QUFGUyxPQUEzQjtBQUlIO0FBTkQsSUFESixFQVFNWixJQVJOLENBVEcsQ0FBUDtBQW9CSCxDQTFLRDs7ZUE0S2VyRCxlIiwic291cmNlc0NvbnRlbnQiOlsiLypcbkNvcHlyaWdodCAyMDIxIFRoZSBNYXRyaXgub3JnIEZvdW5kYXRpb24gQy5JLkMuXG5cbkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG55b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG5Zb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcblxuICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuXG5Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG5kaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG5XSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cblNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbmxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKi9cblxuaW1wb3J0IFJlYWN0LCB7dXNlQ29udGV4dCwgdXNlUmVmLCB1c2VTdGF0ZX0gZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgY2xhc3NOYW1lcyBmcm9tIFwiY2xhc3NuYW1lc1wiO1xuaW1wb3J0IHtFdmVudFR5cGUsIFJvb21UeXBlLCBSb29tQ3JlYXRlVHlwZUZpZWxkfSBmcm9tIFwibWF0cml4LWpzLXNkay9zcmMvQHR5cGVzL2V2ZW50XCI7XG5pbXBvcnQgRm9jdXNMb2NrIGZyb20gXCJyZWFjdC1mb2N1cy1sb2NrXCI7XG5cbmltcG9ydCB7X3R9IGZyb20gXCIuLi8uLi8uLi9sYW5ndWFnZUhhbmRsZXJcIjtcbmltcG9ydCBBY2Nlc3NpYmxlVG9vbHRpcEJ1dHRvbiBmcm9tIFwiLi4vZWxlbWVudHMvQWNjZXNzaWJsZVRvb2x0aXBCdXR0b25cIjtcbmltcG9ydCB7Q2hldnJvbkZhY2UsIENvbnRleHRNZW51fSBmcm9tIFwiLi4vLi4vc3RydWN0dXJlcy9Db250ZXh0TWVudVwiO1xuaW1wb3J0IGNyZWF0ZVJvb20sIHtJU3RhdGVFdmVudCwgUHJlc2V0fSBmcm9tIFwiLi4vLi4vLi4vY3JlYXRlUm9vbVwiO1xuaW1wb3J0IE1hdHJpeENsaWVudENvbnRleHQgZnJvbSBcIi4uLy4uLy4uL2NvbnRleHRzL01hdHJpeENsaWVudENvbnRleHRcIjtcbmltcG9ydCB7U3BhY2VBdmF0YXJ9IGZyb20gXCIuL1NwYWNlQmFzaWNTZXR0aW5nc1wiO1xuaW1wb3J0IEFjY2Vzc2libGVCdXR0b24gZnJvbSBcIi4uL2VsZW1lbnRzL0FjY2Vzc2libGVCdXR0b25cIjtcbmltcG9ydCB7QmV0YVBpbGx9IGZyb20gXCIuLi9iZXRhL0JldGFDYXJkXCI7XG5pbXBvcnQgZGVmYXVsdERpc3BhdGNoZXIgZnJvbSBcIi4uLy4uLy4uL2Rpc3BhdGNoZXIvZGlzcGF0Y2hlclwiO1xuaW1wb3J0IHtBY3Rpb259IGZyb20gXCIuLi8uLi8uLi9kaXNwYXRjaGVyL2FjdGlvbnNcIjtcbmltcG9ydCB7VVNFUl9MQUJTX1RBQn0gZnJvbSBcIi4uL2RpYWxvZ3MvVXNlclNldHRpbmdzRGlhbG9nXCI7XG5pbXBvcnQgRmllbGQgZnJvbSBcIi4uL2VsZW1lbnRzL0ZpZWxkXCI7XG5pbXBvcnQgd2l0aFZhbGlkYXRpb24gZnJvbSBcIi4uL2VsZW1lbnRzL1ZhbGlkYXRpb25cIjtcbmltcG9ydCB7U3BhY2VGZWVkYmFja1Byb21wdH0gZnJvbSBcIi4uLy4uL3N0cnVjdHVyZXMvU3BhY2VSb29tVmlld1wiO1xuXG5jb25zdCBTcGFjZUNyZWF0ZU1lbnVUeXBlID0gKHsgdGl0bGUsIGRlc2NyaXB0aW9uLCBjbGFzc05hbWUsIG9uQ2xpY2sgfSkgPT4ge1xuICAgIHJldHVybiAoXG4gICAgICAgIDxBY2Nlc3NpYmxlQnV0dG9uIGNsYXNzTmFtZT17Y2xhc3NOYW1lcyhcIm14X1NwYWNlQ3JlYXRlTWVudVR5cGVcIiwgY2xhc3NOYW1lKX0gb25DbGljaz17b25DbGlja30+XG4gICAgICAgICAgICA8aDM+eyB0aXRsZSB9PC9oMz5cbiAgICAgICAgICAgIDxzcGFuPnsgZGVzY3JpcHRpb24gfTwvc3Bhbj5cbiAgICAgICAgPC9BY2Nlc3NpYmxlQnV0dG9uPlxuICAgICk7XG59O1xuXG5lbnVtIFZpc2liaWxpdHkge1xuICAgIFB1YmxpYyxcbiAgICBQcml2YXRlLFxufVxuXG5jb25zdCBzcGFjZU5hbWVWYWxpZGF0b3IgPSB3aXRoVmFsaWRhdGlvbih7XG4gICAgcnVsZXM6IFtcbiAgICAgICAge1xuICAgICAgICAgICAga2V5OiBcInJlcXVpcmVkXCIsXG4gICAgICAgICAgICB0ZXN0OiBhc3luYyAoeyB2YWx1ZSB9KSA9PiAhIXZhbHVlLFxuICAgICAgICAgICAgaW52YWxpZDogKCkgPT4gX3QoXCJQbGVhc2UgZW50ZXIgYSBuYW1lIGZvciB0aGUgc3BhY2VcIiksXG4gICAgICAgIH0sXG4gICAgXSxcbn0pO1xuXG5jb25zdCBTcGFjZUNyZWF0ZU1lbnUgPSAoeyBvbkZpbmlzaGVkIH0pID0+IHtcbiAgICBjb25zdCBjbGkgPSB1c2VDb250ZXh0KE1hdHJpeENsaWVudENvbnRleHQpO1xuICAgIGNvbnN0IFt2aXNpYmlsaXR5LCBzZXRWaXNpYmlsaXR5XSA9IHVzZVN0YXRlPFZpc2liaWxpdHk+KG51bGwpO1xuICAgIGNvbnN0IFtidXN5LCBzZXRCdXN5XSA9IHVzZVN0YXRlPGJvb2xlYW4+KGZhbHNlKTtcblxuICAgIGNvbnN0IFtuYW1lLCBzZXROYW1lXSA9IHVzZVN0YXRlKFwiXCIpO1xuICAgIGNvbnN0IHNwYWNlTmFtZUZpZWxkID0gdXNlUmVmPEZpZWxkPigpO1xuICAgIGNvbnN0IFthdmF0YXIsIHNldEF2YXRhcl0gPSB1c2VTdGF0ZTxGaWxlPihudWxsKTtcbiAgICBjb25zdCBbdG9waWMsIHNldFRvcGljXSA9IHVzZVN0YXRlPHN0cmluZz4oXCJcIik7XG5cbiAgICBjb25zdCBvblNwYWNlQ3JlYXRlQ2xpY2sgPSBhc3luYyAoZSkgPT4ge1xuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGlmIChidXN5KSByZXR1cm47XG5cbiAgICAgICAgc2V0QnVzeSh0cnVlKTtcbiAgICAgICAgLy8gcmVxdWlyZSAmIHZhbGlkYXRlIHRoZSBzcGFjZSBuYW1lIGZpZWxkXG4gICAgICAgIGlmICghYXdhaXQgc3BhY2VOYW1lRmllbGQuY3VycmVudC52YWxpZGF0ZSh7IGFsbG93RW1wdHk6IGZhbHNlIH0pKSB7XG4gICAgICAgICAgICBzcGFjZU5hbWVGaWVsZC5jdXJyZW50LmZvY3VzKCk7XG4gICAgICAgICAgICBzcGFjZU5hbWVGaWVsZC5jdXJyZW50LnZhbGlkYXRlKHsgYWxsb3dFbXB0eTogZmFsc2UsIGZvY3VzZWQ6IHRydWUgfSk7XG4gICAgICAgICAgICBzZXRCdXN5KGZhbHNlKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGluaXRpYWxTdGF0ZTogSVN0YXRlRXZlbnRbXSA9IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB0eXBlOiBFdmVudFR5cGUuUm9vbUhpc3RvcnlWaXNpYmlsaXR5LFxuICAgICAgICAgICAgICAgIGNvbnRlbnQ6IHtcbiAgICAgICAgICAgICAgICAgICAgXCJoaXN0b3J5X3Zpc2liaWxpdHlcIjogdmlzaWJpbGl0eSA9PT0gVmlzaWJpbGl0eS5QdWJsaWMgPyBcIndvcmxkX3JlYWRhYmxlXCIgOiBcImludml0ZWRcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgXTtcbiAgICAgICAgaWYgKGF2YXRhcikge1xuICAgICAgICAgICAgY29uc3QgdXJsID0gYXdhaXQgY2xpLnVwbG9hZENvbnRlbnQoYXZhdGFyKTtcblxuICAgICAgICAgICAgaW5pdGlhbFN0YXRlLnB1c2goe1xuICAgICAgICAgICAgICAgIHR5cGU6IEV2ZW50VHlwZS5Sb29tQXZhdGFyLFxuICAgICAgICAgICAgICAgIGNvbnRlbnQ6IHsgdXJsIH0sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodG9waWMpIHtcbiAgICAgICAgICAgIGluaXRpYWxTdGF0ZS5wdXNoKHtcbiAgICAgICAgICAgICAgICB0eXBlOiBFdmVudFR5cGUuUm9vbVRvcGljLFxuICAgICAgICAgICAgICAgIGNvbnRlbnQ6IHsgdG9waWMgfSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGF3YWl0IGNyZWF0ZVJvb20oe1xuICAgICAgICAgICAgICAgIGNyZWF0ZU9wdHM6IHtcbiAgICAgICAgICAgICAgICAgICAgcHJlc2V0OiB2aXNpYmlsaXR5ID09PSBWaXNpYmlsaXR5LlB1YmxpYyA/IFByZXNldC5QdWJsaWNDaGF0IDogUHJlc2V0LlByaXZhdGVDaGF0LFxuICAgICAgICAgICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgICAgICAgICBjcmVhdGlvbl9jb250ZW50OiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBCYXNlZCBvbiBNU0MxODQwXG4gICAgICAgICAgICAgICAgICAgICAgICBbUm9vbUNyZWF0ZVR5cGVGaWVsZF06IFJvb21UeXBlLlNwYWNlLFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICBpbml0aWFsX3N0YXRlOiBpbml0aWFsU3RhdGUsXG4gICAgICAgICAgICAgICAgICAgIHBvd2VyX2xldmVsX2NvbnRlbnRfb3ZlcnJpZGU6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIE9ubHkgYWxsb3cgQWRtaW5zIHRvIHdyaXRlIHRvIHRoZSB0aW1lbGluZSB0byBwcmV2ZW50IGhpZGRlbiBzeW5jIHNwYW1cbiAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50c19kZWZhdWx0OiAxMDAsXG4gICAgICAgICAgICAgICAgICAgICAgICAuLi5WaXNpYmlsaXR5LlB1YmxpYyA/IHsgaW52aXRlOiAwIH0gOiB7fSxcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHNwaW5uZXI6IGZhbHNlLFxuICAgICAgICAgICAgICAgIGVuY3J5cHRpb246IGZhbHNlLFxuICAgICAgICAgICAgICAgIGFuZFZpZXc6IHRydWUsXG4gICAgICAgICAgICAgICAgaW5saW5lRXJyb3JzOiB0cnVlLFxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIG9uRmluaXNoZWQoKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihlKTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICBsZXQgYm9keTtcbiAgICBpZiAodmlzaWJpbGl0eSA9PT0gbnVsbCkge1xuICAgICAgICBib2R5ID0gPFJlYWN0LkZyYWdtZW50PlxuICAgICAgICAgICAgPGgyPnsgX3QoXCJDcmVhdGUgYSBzcGFjZVwiKSB9PC9oMj5cbiAgICAgICAgICAgIDxwPnsgX3QoXCJTcGFjZXMgYXJlIGEgbmV3IHdheSB0byBncm91cCByb29tcyBhbmQgcGVvcGxlLiBcIiArXG4gICAgICAgICAgICAgICAgXCJUbyBqb2luIGFuIGV4aXN0aW5nIHNwYWNlIHlvdSdsbCBuZWVkIGFuIGludml0ZS5cIikgfTwvcD5cblxuICAgICAgICAgICAgPFNwYWNlQ3JlYXRlTWVudVR5cGVcbiAgICAgICAgICAgICAgICB0aXRsZT17X3QoXCJQdWJsaWNcIil9XG4gICAgICAgICAgICAgICAgZGVzY3JpcHRpb249e190KFwiT3BlbiBzcGFjZSBmb3IgYW55b25lLCBiZXN0IGZvciBjb21tdW5pdGllc1wiKX1cbiAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJteF9TcGFjZUNyZWF0ZU1lbnVUeXBlX3B1YmxpY1wiXG4gICAgICAgICAgICAgICAgb25DbGljaz17KCkgPT4gc2V0VmlzaWJpbGl0eShWaXNpYmlsaXR5LlB1YmxpYyl9XG4gICAgICAgICAgICAvPlxuICAgICAgICAgICAgPFNwYWNlQ3JlYXRlTWVudVR5cGVcbiAgICAgICAgICAgICAgICB0aXRsZT17X3QoXCJQcml2YXRlXCIpfVxuICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uPXtfdChcIkludml0ZSBvbmx5LCBiZXN0IGZvciB5b3Vyc2VsZiBvciB0ZWFtc1wiKX1cbiAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJteF9TcGFjZUNyZWF0ZU1lbnVUeXBlX3ByaXZhdGVcIlxuICAgICAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IHNldFZpc2liaWxpdHkoVmlzaWJpbGl0eS5Qcml2YXRlKX1cbiAgICAgICAgICAgIC8+XG5cbiAgICAgICAgICAgIDxwPnsgX3QoXCJZb3UgY2FuIGNoYW5nZSB0aGlzIGxhdGVyXCIpIH08L3A+XG5cbiAgICAgICAgICAgIDxTcGFjZUZlZWRiYWNrUHJvbXB0IG9uQ2xpY2s9e29uRmluaXNoZWR9IC8+XG4gICAgICAgIDwvUmVhY3QuRnJhZ21lbnQ+O1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGJvZHkgPSA8UmVhY3QuRnJhZ21lbnQ+XG4gICAgICAgICAgICA8QWNjZXNzaWJsZVRvb2x0aXBCdXR0b25cbiAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJteF9TcGFjZUNyZWF0ZU1lbnVfYmFja1wiXG4gICAgICAgICAgICAgICAgb25DbGljaz17KCkgPT4gc2V0VmlzaWJpbGl0eShudWxsKX1cbiAgICAgICAgICAgICAgICB0aXRsZT17X3QoXCJHbyBiYWNrXCIpfVxuICAgICAgICAgICAgLz5cblxuICAgICAgICAgICAgPGgyPlxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgdmlzaWJpbGl0eSA9PT0gVmlzaWJpbGl0eS5QdWJsaWMgPyBfdChcIllvdXIgcHVibGljIHNwYWNlXCIpIDogX3QoXCJZb3VyIHByaXZhdGUgc3BhY2VcIilcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICA8L2gyPlxuICAgICAgICAgICAgPHA+XG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBfdChcIkFkZCBzb21lIGRldGFpbHMgdG8gaGVscCBwZW9wbGUgcmVjb2duaXNlIGl0LlwiKVxuICAgICAgICAgICAgICAgIH0ge1xuICAgICAgICAgICAgICAgICAgICBfdChcIllvdSBjYW4gY2hhbmdlIHRoZXNlIGFueXRpbWUuXCIpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgPC9wPlxuXG4gICAgICAgICAgICA8Zm9ybSBjbGFzc05hbWU9XCJteF9TcGFjZUJhc2ljU2V0dGluZ3NcIiBvblN1Ym1pdD17b25TcGFjZUNyZWF0ZUNsaWNrfT5cbiAgICAgICAgICAgICAgICA8U3BhY2VBdmF0YXIgc2V0QXZhdGFyPXtzZXRBdmF0YXJ9IGF2YXRhckRpc2FibGVkPXtidXN5fSAvPlxuXG4gICAgICAgICAgICAgICAgPEZpZWxkXG4gICAgICAgICAgICAgICAgICAgIG5hbWU9XCJzcGFjZU5hbWVcIlxuICAgICAgICAgICAgICAgICAgICBsYWJlbD17X3QoXCJOYW1lXCIpfVxuICAgICAgICAgICAgICAgICAgICBhdXRvRm9jdXM9e3RydWV9XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlPXtuYW1lfVxuICAgICAgICAgICAgICAgICAgICBvbkNoYW5nZT17ZXYgPT4gc2V0TmFtZShldi50YXJnZXQudmFsdWUpfVxuICAgICAgICAgICAgICAgICAgICByZWY9e3NwYWNlTmFtZUZpZWxkfVxuICAgICAgICAgICAgICAgICAgICBvblZhbGlkYXRlPXtzcGFjZU5hbWVWYWxpZGF0b3J9XG4gICAgICAgICAgICAgICAgICAgIGRpc2FibGVkPXtidXN5fVxuICAgICAgICAgICAgICAgIC8+XG5cbiAgICAgICAgICAgICAgICA8RmllbGRcbiAgICAgICAgICAgICAgICAgICAgbmFtZT1cInNwYWNlVG9waWNcIlxuICAgICAgICAgICAgICAgICAgICBlbGVtZW50PVwidGV4dGFyZWFcIlxuICAgICAgICAgICAgICAgICAgICBsYWJlbD17X3QoXCJEZXNjcmlwdGlvblwiKX1cbiAgICAgICAgICAgICAgICAgICAgdmFsdWU9e3RvcGljfVxuICAgICAgICAgICAgICAgICAgICBvbkNoYW5nZT17ZXYgPT4gc2V0VG9waWMoZXYudGFyZ2V0LnZhbHVlKX1cbiAgICAgICAgICAgICAgICAgICAgcm93cz17M31cbiAgICAgICAgICAgICAgICAgICAgZGlzYWJsZWQ9e2J1c3l9XG4gICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIDwvZm9ybT5cblxuICAgICAgICAgICAgPEFjY2Vzc2libGVCdXR0b24ga2luZD1cInByaW1hcnlcIiBvbkNsaWNrPXtvblNwYWNlQ3JlYXRlQ2xpY2t9IGRpc2FibGVkPXtidXN5fT5cbiAgICAgICAgICAgICAgICB7IGJ1c3kgPyBfdChcIkNyZWF0aW5nLi4uXCIpIDogX3QoXCJDcmVhdGVcIikgfVxuICAgICAgICAgICAgPC9BY2Nlc3NpYmxlQnV0dG9uPlxuICAgICAgICA8L1JlYWN0LkZyYWdtZW50PjtcbiAgICB9XG5cbiAgICByZXR1cm4gPENvbnRleHRNZW51XG4gICAgICAgIGxlZnQ9ezcyfVxuICAgICAgICB0b3A9ezYyfVxuICAgICAgICBjaGV2cm9uT2Zmc2V0PXswfVxuICAgICAgICBjaGV2cm9uRmFjZT17Q2hldnJvbkZhY2UuTm9uZX1cbiAgICAgICAgb25GaW5pc2hlZD17b25GaW5pc2hlZH1cbiAgICAgICAgd3JhcHBlckNsYXNzTmFtZT1cIm14X1NwYWNlQ3JlYXRlTWVudV93cmFwcGVyXCJcbiAgICAgICAgbWFuYWdlZD17ZmFsc2V9XG4gICAgPlxuICAgICAgICA8Rm9jdXNMb2NrIHJldHVybkZvY3VzPXt0cnVlfT5cbiAgICAgICAgICAgIDxCZXRhUGlsbCBvbkNsaWNrPXsoKSA9PiB7XG4gICAgICAgICAgICAgICAgb25GaW5pc2hlZCgpO1xuICAgICAgICAgICAgICAgIGRlZmF1bHREaXNwYXRjaGVyLmRpc3BhdGNoKHtcbiAgICAgICAgICAgICAgICAgICAgYWN0aW9uOiBBY3Rpb24uVmlld1VzZXJTZXR0aW5ncyxcbiAgICAgICAgICAgICAgICAgICAgaW5pdGlhbFRhYklkOiBVU0VSX0xBQlNfVEFCLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfX0gLz5cbiAgICAgICAgICAgIHsgYm9keSB9XG4gICAgICAgIDwvRm9jdXNMb2NrPlxuICAgIDwvQ29udGV4dE1lbnU+O1xufVxuXG5leHBvcnQgZGVmYXVsdCBTcGFjZUNyZWF0ZU1lbnU7XG4iXX0=