matrix-react-sdk
Version:
SDK for matrix.org using React
299 lines (293 loc) • 49.9 kB
JavaScript
"use strict";
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 = _interopRequireDefault(require("react"));
var _classnames = _interopRequireDefault(require("classnames"));
var _reResizable = require("re-resizable");
var _AppTile = _interopRequireDefault(require("../elements/AppTile"));
var _dispatcher = _interopRequireDefault(require("../../../dispatcher/dispatcher"));
var ScalarMessaging = _interopRequireWildcard(require("../../../ScalarMessaging"));
var _WidgetUtils = _interopRequireDefault(require("../../../utils/WidgetUtils"));
var _WidgetEchoStore = _interopRequireDefault(require("../../../stores/WidgetEchoStore"));
var _ResizeHandle = _interopRequireDefault(require("../elements/ResizeHandle"));
var _resizer = _interopRequireDefault(require("../../../resizer/resizer"));
var _percentage = _interopRequireDefault(require("../../../resizer/distributors/percentage"));
var _WidgetLayoutStore = require("../../../stores/widgets/WidgetLayoutStore");
var _numbers = require("../../../utils/numbers");
var _UIStore = _interopRequireDefault(require("../../../stores/UIStore"));
var _Spinner = _interopRequireDefault(require("../elements/Spinner"));
var _SdkConfig = _interopRequireDefault(require("../../../SdkConfig"));
function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
/*
Copyright 2018-2024 New Vector Ltd.
Copyright 2017 Vector Creations Ltd
SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only
Please see LICENSE files in the repository root for full details.
*/
class AppsDrawer extends _react.default.Component {
constructor(props) {
super(props);
(0, _defineProperty2.default)(this, "unmounted", false);
(0, _defineProperty2.default)(this, "resizeContainer", void 0);
(0, _defineProperty2.default)(this, "resizer", void 0);
(0, _defineProperty2.default)(this, "dispatcherRef", void 0);
(0, _defineProperty2.default)(this, "onIsResizing", resizing => {
// This one is the vertical, ie. change height of apps drawer
this.setState({
resizingVertical: resizing
});
if (!resizing) {
this.relaxResizer();
}
});
(0, _defineProperty2.default)(this, "collectResizer", ref => {
if (this.resizeContainer) {
this.resizer.detach();
}
if (ref) {
this.resizer.container = ref;
this.resizer.attach();
}
this.resizeContainer = ref;
this.loadResizerPreferences();
});
(0, _defineProperty2.default)(this, "getAppsHash", apps => apps.map(app => app.id).join("~"));
(0, _defineProperty2.default)(this, "relaxResizer", () => {
const distributors = this.resizer.getDistributors();
// relax all items if they had any overconstrained flexboxes
distributors.forEach(d => d.start());
distributors.forEach(d => d.finish());
});
(0, _defineProperty2.default)(this, "loadResizerPreferences", () => {
const distributions = _WidgetLayoutStore.WidgetLayoutStore.instance.getResizerDistributions(this.props.room, _WidgetLayoutStore.Container.Top);
if (this.state.apps && this.topApps().length - 1 === distributions.length) {
distributions.forEach((size, i) => {
const distributor = this.resizer.forHandleAt(i);
if (distributor) {
distributor.size = size;
distributor.finish();
}
});
} else if (this.state.apps) {
const distributors = this.resizer.getDistributors();
distributors.forEach(d => d.item.clearSize());
distributors.forEach(d => d.start());
distributors.forEach(d => d.finish());
}
});
(0, _defineProperty2.default)(this, "onAction", action => {
const hideWidgetKey = this.props.room.roomId + "_hide_widget_drawer";
switch (action.action) {
case "appsDrawer":
// Note: these booleans are awkward because localstorage is fundamentally
// string-based. We also do exact equality on the strings later on.
if (action.show) {
localStorage.setItem(hideWidgetKey, "false");
} else {
// Store hidden state of widget
// Don't show if previously hidden
localStorage.setItem(hideWidgetKey, "true");
}
break;
}
});
(0, _defineProperty2.default)(this, "getApps", () => ({
[_WidgetLayoutStore.Container.Top]: _WidgetLayoutStore.WidgetLayoutStore.instance.getContainerWidgets(this.props.room, _WidgetLayoutStore.Container.Top),
[_WidgetLayoutStore.Container.Center]: _WidgetLayoutStore.WidgetLayoutStore.instance.getContainerWidgets(this.props.room, _WidgetLayoutStore.Container.Center)
}));
(0, _defineProperty2.default)(this, "topApps", () => this.state.apps[_WidgetLayoutStore.Container.Top]);
(0, _defineProperty2.default)(this, "centerApps", () => this.state.apps[_WidgetLayoutStore.Container.Center]);
(0, _defineProperty2.default)(this, "updateApps", () => {
if (this.unmounted) return;
this.setState({
apps: this.getApps()
});
});
this.state = {
apps: this.getApps(),
resizingVertical: false,
resizingHorizontal: false,
resizing: false
};
this.resizer = this.createResizer();
this.props.resizeNotifier.on("isResizing", this.onIsResizing);
}
componentDidMount() {
ScalarMessaging.startListening();
_WidgetLayoutStore.WidgetLayoutStore.instance.on(_WidgetLayoutStore.WidgetLayoutStore.emissionForRoom(this.props.room), this.updateApps);
this.dispatcherRef = _dispatcher.default.register(this.onAction);
}
componentWillUnmount() {
this.unmounted = true;
ScalarMessaging.stopListening();
_WidgetLayoutStore.WidgetLayoutStore.instance.off(_WidgetLayoutStore.WidgetLayoutStore.emissionForRoom(this.props.room), this.updateApps);
if (this.dispatcherRef) _dispatcher.default.unregister(this.dispatcherRef);
if (this.resizeContainer) {
this.resizer.detach();
}
this.props.resizeNotifier.off("isResizing", this.onIsResizing);
}
createResizer() {
// This is the horizontal one, changing the distribution of the width between the app tiles
// (ie. a vertical resize handle because, the handle itself is vertical...)
const classNames = {
handle: "mx_ResizeHandle",
vertical: "mx_ResizeHandle--vertical",
reverse: "mx_ResizeHandle_reverse"
};
const collapseConfig = {
onResizeStart: () => {
this.resizeContainer?.classList.add("mx_AppsDrawer--resizing");
this.setState({
resizingHorizontal: true
});
},
onResizeStop: () => {
this.resizeContainer?.classList.remove("mx_AppsDrawer--resizing");
_WidgetLayoutStore.WidgetLayoutStore.instance.setResizerDistributions(this.props.room, _WidgetLayoutStore.Container.Top, this.topApps().slice(1).map((_, i) => this.resizer.forHandleAt(i).size));
this.setState({
resizingHorizontal: false
});
}
};
// pass a truthy container for now, we won't call attach until we update it
const resizer = new _resizer.default(null, _percentage.default, collapseConfig);
resizer.setClassNames(classNames);
return resizer;
}
componentDidUpdate(prevProps, prevState) {
if (prevProps.userId !== this.props.userId || prevProps.room !== this.props.room) {
// Room has changed, update apps
this.updateApps();
} else if (this.getAppsHash(this.topApps()) !== this.getAppsHash(prevState.apps[_WidgetLayoutStore.Container.Top])) {
this.loadResizerPreferences();
}
}
isResizing() {
return this.state.resizingVertical || this.state.resizingHorizontal;
}
render() {
if (!this.props.showApps) return /*#__PURE__*/_react.default.createElement("div", null);
const widgetIsMaxmised = this.centerApps().length > 0;
const appsToDisplay = widgetIsMaxmised ? this.centerApps() : this.topApps();
const apps = appsToDisplay.map((app, index, arr) => {
return /*#__PURE__*/_react.default.createElement(_AppTile.default, {
key: app.id,
app: app,
fullWidth: arr.length < 2,
room: this.props.room,
userId: this.props.userId,
creatorUserId: app.creatorUserId,
widgetPageTitle: _WidgetUtils.default.getWidgetDataTitle(app),
waitForIframeLoad: app.waitForIframeLoad,
pointerEvents: this.isResizing() ? "none" : undefined
});
});
if (apps.length === 0) {
return /*#__PURE__*/_react.default.createElement("div", null);
}
let spinner;
if (apps.length === 0 && _WidgetEchoStore.default.roomHasPendingWidgets(this.props.room.roomId, _WidgetUtils.default.getRoomWidgets(this.props.room))) {
spinner = /*#__PURE__*/_react.default.createElement(_Spinner.default, null);
}
const classes = (0, _classnames.default)({
"mx_AppsDrawer": true,
"mx_AppsDrawer--maximised": widgetIsMaxmised,
"mx_AppsDrawer--resizing": this.state.resizing,
"mx_AppsDrawer--2apps": apps.length === 2,
"mx_AppsDrawer--3apps": apps.length === 3
});
const appContainers = /*#__PURE__*/_react.default.createElement("div", {
className: "mx_AppsContainer",
ref: this.collectResizer
}, apps.map((app, i) => {
if (i < 1) return app;
return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, {
key: app.key
}, /*#__PURE__*/_react.default.createElement(_ResizeHandle.default, {
reverse: i > apps.length / 2
}), app);
}));
let drawer;
if (widgetIsMaxmised) {
drawer = appContainers;
} else {
drawer = /*#__PURE__*/_react.default.createElement(PersistentVResizer, {
room: this.props.room,
minHeight: 100,
maxHeight: this.props.maxHeight - 50,
className: "mx_AppsDrawer_resizer",
handleWrapperClass: "mx_AppsDrawer_resizer_container",
handleClass: "mx_AppsDrawer_resizer_container_handle",
resizeNotifier: this.props.resizeNotifier
}, appContainers);
}
return /*#__PURE__*/_react.default.createElement("div", {
role: this.props.role,
className: classes
}, drawer, spinner);
}
}
exports.default = AppsDrawer;
(0, _defineProperty2.default)(AppsDrawer, "defaultProps", {
showApps: true
});
const PersistentVResizer = ({
room,
minHeight,
maxHeight,
className,
handleWrapperClass,
handleClass,
resizeNotifier,
children
}) => {
let defaultHeight = _WidgetLayoutStore.WidgetLayoutStore.instance.getContainerHeight(room, _WidgetLayoutStore.Container.Top);
// Arbitrary defaults to avoid NaN problems. 100 px or 3/4 of the visible window.
if (!minHeight) minHeight = 100;
if (!maxHeight) maxHeight = _UIStore.default.instance.windowHeight / 4 * 3;
// Convert from percentage to height. Note that the default height is 280px.
if (defaultHeight) {
defaultHeight = (0, _numbers.clamp)(defaultHeight, 0, 100);
defaultHeight = (0, _numbers.percentageWithin)(defaultHeight / 100, minHeight, maxHeight);
} else {
defaultHeight = _SdkConfig.default.get().default_widget_container_height ?? 280;
}
return /*#__PURE__*/_react.default.createElement(_reResizable.Resizable
// types do not support undefined height/width
// but resizable code checks specifically for undefined on Size prop
, {
size: {
height: Math.min(defaultHeight, maxHeight),
width: undefined
},
minHeight: minHeight,
maxHeight: maxHeight,
onResizeStart: () => {
resizeNotifier.startResizing();
},
onResize: () => {
resizeNotifier.notifyTimelineHeightChanged();
},
onResizeStop: (e, dir, ref, d) => {
let newHeight = defaultHeight + d.height;
newHeight = (0, _numbers.percentageOf)(newHeight, minHeight, maxHeight) * 100;
_WidgetLayoutStore.WidgetLayoutStore.instance.setContainerHeight(room, _WidgetLayoutStore.Container.Top, newHeight);
resizeNotifier.stopResizing();
},
className: className,
handleWrapperClass: handleWrapperClass,
handleClasses: {
bottom: handleClass
},
enable: {
bottom: true
}
}, children);
};
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwicmVxdWlyZSIsIl9jbGFzc25hbWVzIiwiX3JlUmVzaXphYmxlIiwiX0FwcFRpbGUiLCJfZGlzcGF0Y2hlciIsIlNjYWxhck1lc3NhZ2luZyIsIl9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkIiwiX1dpZGdldFV0aWxzIiwiX1dpZGdldEVjaG9TdG9yZSIsIl9SZXNpemVIYW5kbGUiLCJfcmVzaXplciIsIl9wZXJjZW50YWdlIiwiX1dpZGdldExheW91dFN0b3JlIiwiX251bWJlcnMiLCJfVUlTdG9yZSIsIl9TcGlubmVyIiwiX1Nka0NvbmZpZyIsIl9nZXRSZXF1aXJlV2lsZGNhcmRDYWNoZSIsImUiLCJXZWFrTWFwIiwiciIsInQiLCJfX2VzTW9kdWxlIiwiZGVmYXVsdCIsImhhcyIsImdldCIsIm4iLCJfX3Byb3RvX18iLCJhIiwiT2JqZWN0IiwiZGVmaW5lUHJvcGVydHkiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCJ1IiwiaGFzT3duUHJvcGVydHkiLCJjYWxsIiwiaSIsInNldCIsIkFwcHNEcmF3ZXIiLCJSZWFjdCIsIkNvbXBvbmVudCIsImNvbnN0cnVjdG9yIiwicHJvcHMiLCJfZGVmaW5lUHJvcGVydHkyIiwicmVzaXppbmciLCJzZXRTdGF0ZSIsInJlc2l6aW5nVmVydGljYWwiLCJyZWxheFJlc2l6ZXIiLCJyZWYiLCJyZXNpemVDb250YWluZXIiLCJyZXNpemVyIiwiZGV0YWNoIiwiY29udGFpbmVyIiwiYXR0YWNoIiwibG9hZFJlc2l6ZXJQcmVmZXJlbmNlcyIsImFwcHMiLCJtYXAiLCJhcHAiLCJpZCIsImpvaW4iLCJkaXN0cmlidXRvcnMiLCJnZXREaXN0cmlidXRvcnMiLCJmb3JFYWNoIiwiZCIsInN0YXJ0IiwiZmluaXNoIiwiZGlzdHJpYnV0aW9ucyIsIldpZGdldExheW91dFN0b3JlIiwiaW5zdGFuY2UiLCJnZXRSZXNpemVyRGlzdHJpYnV0aW9ucyIsInJvb20iLCJDb250YWluZXIiLCJUb3AiLCJzdGF0ZSIsInRvcEFwcHMiLCJsZW5ndGgiLCJzaXplIiwiZGlzdHJpYnV0b3IiLCJmb3JIYW5kbGVBdCIsIml0ZW0iLCJjbGVhclNpemUiLCJhY3Rpb24iLCJoaWRlV2lkZ2V0S2V5Iiwicm9vbUlkIiwic2hvdyIsImxvY2FsU3RvcmFnZSIsInNldEl0ZW0iLCJnZXRDb250YWluZXJXaWRnZXRzIiwiQ2VudGVyIiwidW5tb3VudGVkIiwiZ2V0QXBwcyIsInJlc2l6aW5nSG9yaXpvbnRhbCIsImNyZWF0ZVJlc2l6ZXIiLCJyZXNpemVOb3RpZmllciIsIm9uIiwib25Jc1Jlc2l6aW5nIiwiY29tcG9uZW50RGlkTW91bnQiLCJzdGFydExpc3RlbmluZyIsImVtaXNzaW9uRm9yUm9vbSIsInVwZGF0ZUFwcHMiLCJkaXNwYXRjaGVyUmVmIiwiZGlzIiwicmVnaXN0ZXIiLCJvbkFjdGlvbiIsImNvbXBvbmVudFdpbGxVbm1vdW50Iiwic3RvcExpc3RlbmluZyIsIm9mZiIsInVucmVnaXN0ZXIiLCJjbGFzc05hbWVzIiwiaGFuZGxlIiwidmVydGljYWwiLCJyZXZlcnNlIiwiY29sbGFwc2VDb25maWciLCJvblJlc2l6ZVN0YXJ0IiwiY2xhc3NMaXN0IiwiYWRkIiwib25SZXNpemVTdG9wIiwicmVtb3ZlIiwic2V0UmVzaXplckRpc3RyaWJ1dGlvbnMiLCJzbGljZSIsIl8iLCJSZXNpemVyIiwiUGVyY2VudGFnZURpc3RyaWJ1dG9yIiwic2V0Q2xhc3NOYW1lcyIsImNvbXBvbmVudERpZFVwZGF0ZSIsInByZXZQcm9wcyIsInByZXZTdGF0ZSIsInVzZXJJZCIsImdldEFwcHNIYXNoIiwiaXNSZXNpemluZyIsInJlbmRlciIsInNob3dBcHBzIiwiY3JlYXRlRWxlbWVudCIsIndpZGdldElzTWF4bWlzZWQiLCJjZW50ZXJBcHBzIiwiYXBwc1RvRGlzcGxheSIsImluZGV4IiwiYXJyIiwia2V5IiwiZnVsbFdpZHRoIiwiY3JlYXRvclVzZXJJZCIsIndpZGdldFBhZ2VUaXRsZSIsIldpZGdldFV0aWxzIiwiZ2V0V2lkZ2V0RGF0YVRpdGxlIiwid2FpdEZvcklmcmFtZUxvYWQiLCJwb2ludGVyRXZlbnRzIiwidW5kZWZpbmVkIiwic3Bpbm5lciIsIldpZGdldEVjaG9TdG9yZSIsInJvb21IYXNQZW5kaW5nV2lkZ2V0cyIsImdldFJvb21XaWRnZXRzIiwiY2xhc3NlcyIsImFwcENvbnRhaW5lcnMiLCJjbGFzc05hbWUiLCJjb2xsZWN0UmVzaXplciIsIkZyYWdtZW50IiwiZHJhd2VyIiwiUGVyc2lzdGVudFZSZXNpemVyIiwibWluSGVpZ2h0IiwibWF4SGVpZ2h0IiwiaGFuZGxlV3JhcHBlckNsYXNzIiwiaGFuZGxlQ2xhc3MiLCJyb2xlIiwiZXhwb3J0cyIsImNoaWxkcmVuIiwiZGVmYXVsdEhlaWdodCIsImdldENvbnRhaW5lckhlaWdodCIsIlVJU3RvcmUiLCJ3aW5kb3dIZWlnaHQiLCJjbGFtcCIsInBlcmNlbnRhZ2VXaXRoaW4iLCJTZGtDb25maWciLCJkZWZhdWx0X3dpZGdldF9jb250YWluZXJfaGVpZ2h0IiwiUmVzaXphYmxlIiwiaGVpZ2h0IiwiTWF0aCIsIm1pbiIsIndpZHRoIiwic3RhcnRSZXNpemluZyIsIm9uUmVzaXplIiwibm90aWZ5VGltZWxpbmVIZWlnaHRDaGFuZ2VkIiwiZGlyIiwibmV3SGVpZ2h0IiwicGVyY2VudGFnZU9mIiwic2V0Q29udGFpbmVySGVpZ2h0Iiwic3RvcFJlc2l6aW5nIiwiaGFuZGxlQ2xhc3NlcyIsImJvdHRvbSIsImVuYWJsZSJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnRzL3ZpZXdzL3Jvb21zL0FwcHNEcmF3ZXIudHN4Il0sInNvdXJjZXNDb250ZW50IjpbIi8qXG5Db3B5cmlnaHQgMjAxOC0yMDI0IE5ldyBWZWN0b3IgTHRkLlxuQ29weXJpZ2h0IDIwMTcgVmVjdG9yIENyZWF0aW9ucyBMdGRcblxuU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFHUEwtMy4wLW9ubHkgT1IgR1BMLTMuMC1vbmx5XG5QbGVhc2Ugc2VlIExJQ0VOU0UgZmlsZXMgaW4gdGhlIHJlcG9zaXRvcnkgcm9vdCBmb3IgZnVsbCBkZXRhaWxzLlxuKi9cblxuaW1wb3J0IFJlYWN0LCB7IEFyaWFSb2xlIH0gZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgY2xhc3NOYW1lcyBmcm9tIFwiY2xhc3NuYW1lc1wiO1xuaW1wb3J0IHsgUmVzaXphYmxlLCBTaXplIH0gZnJvbSBcInJlLXJlc2l6YWJsZVwiO1xuaW1wb3J0IHsgUm9vbSB9IGZyb20gXCJtYXRyaXgtanMtc2RrL3NyYy9tYXRyaXhcIjtcbmltcG9ydCB7IElXaWRnZXQgfSBmcm9tIFwibWF0cml4LXdpZGdldC1hcGlcIjtcblxuaW1wb3J0IEFwcFRpbGUgZnJvbSBcIi4uL2VsZW1lbnRzL0FwcFRpbGVcIjtcbmltcG9ydCBkaXMgZnJvbSBcIi4uLy4uLy4uL2Rpc3BhdGNoZXIvZGlzcGF0Y2hlclwiO1xuaW1wb3J0ICogYXMgU2NhbGFyTWVzc2FnaW5nIGZyb20gXCIuLi8uLi8uLi9TY2FsYXJNZXNzYWdpbmdcIjtcbmltcG9ydCBXaWRnZXRVdGlscyBmcm9tIFwiLi4vLi4vLi4vdXRpbHMvV2lkZ2V0VXRpbHNcIjtcbmltcG9ydCBXaWRnZXRFY2hvU3RvcmUgZnJvbSBcIi4uLy4uLy4uL3N0b3Jlcy9XaWRnZXRFY2hvU3RvcmVcIjtcbmltcG9ydCBSZXNpemVOb3RpZmllciBmcm9tIFwiLi4vLi4vLi4vdXRpbHMvUmVzaXplTm90aWZpZXJcIjtcbmltcG9ydCBSZXNpemVIYW5kbGUgZnJvbSBcIi4uL2VsZW1lbnRzL1Jlc2l6ZUhhbmRsZVwiO1xuaW1wb3J0IFJlc2l6ZXIsIHsgSUNvbmZpZyB9IGZyb20gXCIuLi8uLi8uLi9yZXNpemVyL3Jlc2l6ZXJcIjtcbmltcG9ydCBQZXJjZW50YWdlRGlzdHJpYnV0b3IgZnJvbSBcIi4uLy4uLy4uL3Jlc2l6ZXIvZGlzdHJpYnV0b3JzL3BlcmNlbnRhZ2VcIjtcbmltcG9ydCB7IENvbnRhaW5lciwgV2lkZ2V0TGF5b3V0U3RvcmUgfSBmcm9tIFwiLi4vLi4vLi4vc3RvcmVzL3dpZGdldHMvV2lkZ2V0TGF5b3V0U3RvcmVcIjtcbmltcG9ydCB7IGNsYW1wLCBwZXJjZW50YWdlT2YsIHBlcmNlbnRhZ2VXaXRoaW4gfSBmcm9tIFwiLi4vLi4vLi4vdXRpbHMvbnVtYmVyc1wiO1xuaW1wb3J0IFVJU3RvcmUgZnJvbSBcIi4uLy4uLy4uL3N0b3Jlcy9VSVN0b3JlXCI7XG5pbXBvcnQgeyBBY3Rpb25QYXlsb2FkIH0gZnJvbSBcIi4uLy4uLy4uL2Rpc3BhdGNoZXIvcGF5bG9hZHNcIjtcbmltcG9ydCBTcGlubmVyIGZyb20gXCIuLi9lbGVtZW50cy9TcGlubmVyXCI7XG5pbXBvcnQgU2RrQ29uZmlnIGZyb20gXCIuLi8uLi8uLi9TZGtDb25maWdcIjtcblxuaW50ZXJmYWNlIElQcm9wcyB7XG4gICAgdXNlcklkOiBzdHJpbmc7XG4gICAgcm9vbTogUm9vbTtcbiAgICByZXNpemVOb3RpZmllcjogUmVzaXplTm90aWZpZXI7XG4gICAgc2hvd0FwcHM/OiBib29sZWFuOyAvLyBTaG91bGQgYXBwcyBiZSByZW5kZXJlZFxuICAgIG1heEhlaWdodDogbnVtYmVyO1xuICAgIHJvbGU/OiBBcmlhUm9sZTtcbn1cblxuaW50ZXJmYWNlIElTdGF0ZSB7XG4gICAgYXBwczoge1xuICAgICAgICBbQ29udGFpbmVyLlRvcF06IElXaWRnZXRbXTtcbiAgICAgICAgW0NvbnRhaW5lci5DZW50ZXJdOiBJV2lkZ2V0W107XG4gICAgICAgIFtDb250YWluZXIuUmlnaHRdPzogSVdpZGdldFtdO1xuICAgIH07XG4gICAgcmVzaXppbmdWZXJ0aWNhbDogYm9vbGVhbjsgLy8gdHJ1ZSB3aGVuIGNoYW5naW5nIHRoZSBoZWlnaHQgb2YgdGhlIGFwcHMgZHJhd2VyXG4gICAgcmVzaXppbmdIb3Jpem9udGFsOiBib29sZWFuOyAvLyB0cnVlIHdoZW4gY2hhbmdpbmcgdGhlIGRpc3RyaWJ1dGlvbiBvZiB0aGUgd2lkdGggYmV0d2VlbiB3aWRnZXRzXG4gICAgcmVzaXppbmc6IGJvb2xlYW47XG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEFwcHNEcmF3ZXIgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQ8SVByb3BzLCBJU3RhdGU+IHtcbiAgICBwcml2YXRlIHVubW91bnRlZCA9IGZhbHNlO1xuICAgIHByaXZhdGUgcmVzaXplQ29udGFpbmVyPzogSFRNTERpdkVsZW1lbnQ7XG4gICAgcHJpdmF0ZSByZXNpemVyOiBSZXNpemVyPElDb25maWc+O1xuICAgIHByaXZhdGUgZGlzcGF0Y2hlclJlZj86IHN0cmluZztcbiAgICBwdWJsaWMgc3RhdGljIGRlZmF1bHRQcm9wczogUGFydGlhbDxJUHJvcHM+ID0ge1xuICAgICAgICBzaG93QXBwczogdHJ1ZSxcbiAgICB9O1xuXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHByb3BzOiBJUHJvcHMpIHtcbiAgICAgICAgc3VwZXIocHJvcHMpO1xuXG4gICAgICAgIHRoaXMuc3RhdGUgPSB7XG4gICAgICAgICAgICBhcHBzOiB0aGlzLmdldEFwcHMoKSxcbiAgICAgICAgICAgIHJlc2l6aW5nVmVydGljYWw6IGZhbHNlLFxuICAgICAgICAgICAgcmVzaXppbmdIb3Jpem9udGFsOiBmYWxzZSxcbiAgICAgICAgICAgIHJlc2l6aW5nOiBmYWxzZSxcbiAgICAgICAgfTtcblxuICAgICAgICB0aGlzLnJlc2l6ZXIgPSB0aGlzLmNyZWF0ZVJlc2l6ZXIoKTtcblxuICAgICAgICB0aGlzLnByb3BzLnJlc2l6ZU5vdGlmaWVyLm9uKFwiaXNSZXNpemluZ1wiLCB0aGlzLm9uSXNSZXNpemluZyk7XG4gICAgfVxuXG4gICAgcHVibGljIGNvbXBvbmVudERpZE1vdW50KCk6IHZvaWQge1xuICAgICAgICBTY2FsYXJNZXNzYWdpbmcuc3RhcnRMaXN0ZW5pbmcoKTtcbiAgICAgICAgV2lkZ2V0TGF5b3V0U3RvcmUuaW5zdGFuY2Uub24oV2lkZ2V0TGF5b3V0U3RvcmUuZW1pc3Npb25Gb3JSb29tKHRoaXMucHJvcHMucm9vbSksIHRoaXMudXBkYXRlQXBwcyk7XG4gICAgICAgIHRoaXMuZGlzcGF0Y2hlclJlZiA9IGRpcy5yZWdpc3Rlcih0aGlzLm9uQWN0aW9uKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgY29tcG9uZW50V2lsbFVubW91bnQoKTogdm9pZCB7XG4gICAgICAgIHRoaXMudW5tb3VudGVkID0gdHJ1ZTtcbiAgICAgICAgU2NhbGFyTWVzc2FnaW5nLnN0b3BMaXN0ZW5pbmcoKTtcbiAgICAgICAgV2lkZ2V0TGF5b3V0U3RvcmUuaW5zdGFuY2Uub2ZmKFdpZGdldExheW91dFN0b3JlLmVtaXNzaW9uRm9yUm9vbSh0aGlzLnByb3BzLnJvb20pLCB0aGlzLnVwZGF0ZUFwcHMpO1xuICAgICAgICBpZiAodGhpcy5kaXNwYXRjaGVyUmVmKSBkaXMudW5yZWdpc3Rlcih0aGlzLmRpc3BhdGNoZXJSZWYpO1xuICAgICAgICBpZiAodGhpcy5yZXNpemVDb250YWluZXIpIHtcbiAgICAgICAgICAgIHRoaXMucmVzaXplci5kZXRhY2goKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnByb3BzLnJlc2l6ZU5vdGlmaWVyLm9mZihcImlzUmVzaXppbmdcIiwgdGhpcy5vbklzUmVzaXppbmcpO1xuICAgIH1cblxuICAgIHByaXZhdGUgb25Jc1Jlc2l6aW5nID0gKHJlc2l6aW5nOiBib29sZWFuKTogdm9pZCA9PiB7XG4gICAgICAgIC8vIFRoaXMgb25lIGlzIHRoZSB2ZXJ0aWNhbCwgaWUuIGNoYW5nZSBoZWlnaHQgb2YgYXBwcyBkcmF3ZXJcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7IHJlc2l6aW5nVmVydGljYWw6IHJlc2l6aW5nIH0pO1xuICAgICAgICBpZiAoIXJlc2l6aW5nKSB7XG4gICAgICAgICAgICB0aGlzLnJlbGF4UmVzaXplcigpO1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIHByaXZhdGUgY3JlYXRlUmVzaXplcigpOiBSZXNpemVyPElDb25maWc+IHtcbiAgICAgICAgLy8gVGhpcyBpcyB0aGUgaG9yaXpvbnRhbCBvbmUsIGNoYW5naW5nIHRoZSBkaXN0cmlidXRpb24gb2YgdGhlIHdpZHRoIGJldHdlZW4gdGhlIGFwcCB0aWxlc1xuICAgICAgICAvLyAoaWUuIGEgdmVydGljYWwgcmVzaXplIGhhbmRsZSBiZWNhdXNlLCB0aGUgaGFuZGxlIGl0c2VsZiBpcyB2ZXJ0aWNhbC4uLilcbiAgICAgICAgY29uc3QgY2xhc3NOYW1lcyA9IHtcbiAgICAgICAgICAgIGhhbmRsZTogXCJteF9SZXNpemVIYW5kbGVcIixcbiAgICAgICAgICAgIHZlcnRpY2FsOiBcIm14X1Jlc2l6ZUhhbmRsZS0tdmVydGljYWxcIixcbiAgICAgICAgICAgIHJldmVyc2U6IFwibXhfUmVzaXplSGFuZGxlX3JldmVyc2VcIixcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgY29sbGFwc2VDb25maWcgPSB7XG4gICAgICAgICAgICBvblJlc2l6ZVN0YXJ0OiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5yZXNpemVDb250YWluZXI/LmNsYXNzTGlzdC5hZGQoXCJteF9BcHBzRHJhd2VyLS1yZXNpemluZ1wiKTtcbiAgICAgICAgICAgICAgICB0aGlzLnNldFN0YXRlKHsgcmVzaXppbmdIb3Jpem9udGFsOiB0cnVlIH0pO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG9uUmVzaXplU3RvcDogKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMucmVzaXplQ29udGFpbmVyPy5jbGFzc0xpc3QucmVtb3ZlKFwibXhfQXBwc0RyYXdlci0tcmVzaXppbmdcIik7XG4gICAgICAgICAgICAgICAgV2lkZ2V0TGF5b3V0U3RvcmUuaW5zdGFuY2Uuc2V0UmVzaXplckRpc3RyaWJ1dGlvbnMoXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucHJvcHMucm9vbSxcbiAgICAgICAgICAgICAgICAgICAgQ29udGFpbmVyLlRvcCxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50b3BBcHBzKClcbiAgICAgICAgICAgICAgICAgICAgICAgIC5zbGljZSgxKVxuICAgICAgICAgICAgICAgICAgICAgICAgLm1hcCgoXywgaSkgPT4gdGhpcy5yZXNpemVyLmZvckhhbmRsZUF0KGkpIS5zaXplKSxcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIHRoaXMuc2V0U3RhdGUoeyByZXNpemluZ0hvcml6b250YWw6IGZhbHNlIH0pO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICAgICAgLy8gcGFzcyBhIHRydXRoeSBjb250YWluZXIgZm9yIG5vdywgd2Ugd29uJ3QgY2FsbCBhdHRhY2ggdW50aWwgd2UgdXBkYXRlIGl0XG4gICAgICAgIGNvbnN0IHJlc2l6ZXIgPSBuZXcgUmVzaXplcihudWxsLCBQZXJjZW50YWdlRGlzdHJpYnV0b3IsIGNvbGxhcHNlQ29uZmlnKTtcbiAgICAgICAgcmVzaXplci5zZXRDbGFzc05hbWVzKGNsYXNzTmFtZXMpO1xuICAgICAgICByZXR1cm4gcmVzaXplcjtcbiAgICB9XG5cbiAgICBwcml2YXRlIGNvbGxlY3RSZXNpemVyID0gKHJlZjogSFRNTERpdkVsZW1lbnQpOiB2b2lkID0+IHtcbiAgICAgICAgaWYgKHRoaXMucmVzaXplQ29udGFpbmVyKSB7XG4gICAgICAgICAgICB0aGlzLnJlc2l6ZXIuZGV0YWNoKCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocmVmKSB7XG4gICAgICAgICAgICB0aGlzLnJlc2l6ZXIuY29udGFpbmVyID0gcmVmO1xuICAgICAgICAgICAgdGhpcy5yZXNpemVyLmF0dGFjaCgpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucmVzaXplQ29udGFpbmVyID0gcmVmO1xuICAgICAgICB0aGlzLmxvYWRSZXNpemVyUHJlZmVyZW5jZXMoKTtcbiAgICB9O1xuXG4gICAgcHJpdmF0ZSBnZXRBcHBzSGFzaCA9IChhcHBzOiBJV2lkZ2V0W10pOiBzdHJpbmcgPT4gYXBwcy5tYXAoKGFwcCkgPT4gYXBwLmlkKS5qb2luKFwiflwiKTtcblxuICAgIHB1YmxpYyBjb21wb25lbnREaWRVcGRhdGUocHJldlByb3BzOiBJUHJvcHMsIHByZXZTdGF0ZTogSVN0YXRlKTogdm9pZCB7XG4gICAgICAgIGlmIChwcmV2UHJvcHMudXNlcklkICE9PSB0aGlzLnByb3BzLnVzZXJJZCB8fCBwcmV2UHJvcHMucm9vbSAhPT0gdGhpcy5wcm9wcy5yb29tKSB7XG4gICAgICAgICAgICAvLyBSb29tIGhhcyBjaGFuZ2VkLCB1cGRhdGUgYXBwc1xuICAgICAgICAgICAgdGhpcy51cGRhdGVBcHBzKCk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5nZXRBcHBzSGFzaCh0aGlzLnRvcEFwcHMoKSkgIT09IHRoaXMuZ2V0QXBwc0hhc2gocHJldlN0YXRlLmFwcHNbQ29udGFpbmVyLlRvcF0pKSB7XG4gICAgICAgICAgICB0aGlzLmxvYWRSZXNpemVyUHJlZmVyZW5jZXMoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgcmVsYXhSZXNpemVyID0gKCk6IHZvaWQgPT4ge1xuICAgICAgICBjb25zdCBkaXN0cmlidXRvcnMgPSB0aGlzLnJlc2l6ZXIuZ2V0RGlzdHJpYnV0b3JzKCk7XG5cbiAgICAgICAgLy8gcmVsYXggYWxsIGl0ZW1zIGlmIHRoZXkgaGFkIGFueSBvdmVyY29uc3RyYWluZWQgZmxleGJveGVzXG4gICAgICAgIGRpc3RyaWJ1dG9ycy5mb3JFYWNoKChkKSA9PiBkLnN0YXJ0KCkpO1xuICAgICAgICBkaXN0cmlidXRvcnMuZm9yRWFjaCgoZCkgPT4gZC5maW5pc2goKSk7XG4gICAgfTtcblxuICAgIHByaXZhdGUgbG9hZFJlc2l6ZXJQcmVmZXJlbmNlcyA9ICgpOiB2b2lkID0+IHtcbiAgICAgICAgY29uc3QgZGlzdHJpYnV0aW9ucyA9IFdpZGdldExheW91dFN0b3JlLmluc3RhbmNlLmdldFJlc2l6ZXJEaXN0cmlidXRpb25zKHRoaXMucHJvcHMucm9vbSwgQ29udGFpbmVyLlRvcCk7XG4gICAgICAgIGlmICh0aGlzLnN0YXRlLmFwcHMgJiYgdGhpcy50b3BBcHBzKCkubGVuZ3RoIC0gMSA9PT0gZGlzdHJpYnV0aW9ucy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGRpc3RyaWJ1dGlvbnMuZm9yRWFjaCgoc2l6ZSwgaSkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGRpc3RyaWJ1dG9yID0gdGhpcy5yZXNpemVyLmZvckhhbmRsZUF0KGkpO1xuICAgICAgICAgICAgICAgIGlmIChkaXN0cmlidXRvcikge1xuICAgICAgICAgICAgICAgICAgICBkaXN0cmlidXRvci5zaXplID0gc2l6ZTtcbiAgICAgICAgICAgICAgICAgICAgZGlzdHJpYnV0b3IuZmluaXNoKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5zdGF0ZS5hcHBzKSB7XG4gICAgICAgICAgICBjb25zdCBkaXN0cmlidXRvcnMgPSB0aGlzLnJlc2l6ZXIuZ2V0RGlzdHJpYnV0b3JzKCk7XG4gICAgICAgICAgICBkaXN0cmlidXRvcnMuZm9yRWFjaCgoZCkgPT4gZC5pdGVtLmNsZWFyU2l6ZSgpKTtcbiAgICAgICAgICAgIGRpc3RyaWJ1dG9ycy5mb3JFYWNoKChkKSA9PiBkLnN0YXJ0KCkpO1xuICAgICAgICAgICAgZGlzdHJpYnV0b3JzLmZvckVhY2goKGQpID0+IGQuZmluaXNoKCkpO1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIHByaXZhdGUgaXNSZXNpemluZygpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3RhdGUucmVzaXppbmdWZXJ0aWNhbCB8fCB0aGlzLnN0YXRlLnJlc2l6aW5nSG9yaXpvbnRhbDtcbiAgICB9XG5cbiAgICBwcml2YXRlIG9uQWN0aW9uID0gKGFjdGlvbjogQWN0aW9uUGF5bG9hZCk6IHZvaWQgPT4ge1xuICAgICAgICBjb25zdCBoaWRlV2lkZ2V0S2V5ID0gdGhpcy5wcm9wcy5yb29tLnJvb21JZCArIFwiX2hpZGVfd2lkZ2V0X2RyYXdlclwiO1xuICAgICAgICBzd2l0Y2ggKGFjdGlvbi5hY3Rpb24pIHtcbiAgICAgICAgICAgIGNhc2UgXCJhcHBzRHJhd2VyXCI6XG4gICAgICAgICAgICAgICAgLy8gTm90ZTogdGhlc2UgYm9vbGVhbnMgYXJlIGF3a3dhcmQgYmVjYXVzZSBsb2NhbHN0b3JhZ2UgaXMgZnVuZGFtZW50YWxseVxuICAgICAgICAgICAgICAgIC8vIHN0cmluZy1iYXNlZC4gV2UgYWxzbyBkbyBleGFjdCBlcXVhbGl0eSBvbiB0aGUgc3RyaW5ncyBsYXRlciBvbi5cbiAgICAgICAgICAgICAgICBpZiAoYWN0aW9uLnNob3cpIHtcbiAgICAgICAgICAgICAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oaGlkZVdpZGdldEtleSwgXCJmYWxzZVwiKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvLyBTdG9yZSBoaWRkZW4gc3RhdGUgb2Ygd2lkZ2V0XG4gICAgICAgICAgICAgICAgICAgIC8vIERvbid0IHNob3cgaWYgcHJldmlvdXNseSBoaWRkZW5cbiAgICAgICAgICAgICAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oaGlkZVdpZGdldEtleSwgXCJ0cnVlXCIpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIHByaXZhdGUgZ2V0QXBwcyA9ICgpOiBJU3RhdGVbXCJhcHBzXCJdID0+ICh7XG4gICAgICAgIFtDb250YWluZXIuVG9wXTogV2lkZ2V0TGF5b3V0U3RvcmUuaW5zdGFuY2UuZ2V0Q29udGFpbmVyV2lkZ2V0cyh0aGlzLnByb3BzLnJvb20sIENvbnRhaW5lci5Ub3ApLFxuICAgICAgICBbQ29udGFpbmVyLkNlbnRlcl06IFdpZGdldExheW91dFN0b3JlLmluc3RhbmNlLmdldENvbnRhaW5lcldpZGdldHModGhpcy5wcm9wcy5yb29tLCBDb250YWluZXIuQ2VudGVyKSxcbiAgICB9KTtcbiAgICBwcml2YXRlIHRvcEFwcHMgPSAoKTogSVdpZGdldFtdID0+IHRoaXMuc3RhdGUuYXBwc1tDb250YWluZXIuVG9wXTtcbiAgICBwcml2YXRlIGNlbnRlckFwcHMgPSAoKTogSVdpZGdldFtdID0+IHRoaXMuc3RhdGUuYXBwc1tDb250YWluZXIuQ2VudGVyXTtcblxuICAgIHByaXZhdGUgdXBkYXRlQXBwcyA9ICgpOiB2b2lkID0+IHtcbiAgICAgICAgaWYgKHRoaXMudW5tb3VudGVkKSByZXR1cm47XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICAgICAgYXBwczogdGhpcy5nZXRBcHBzKCksXG4gICAgICAgIH0pO1xuICAgIH07XG5cbiAgICBwdWJsaWMgcmVuZGVyKCk6IFJlYWN0LlJlYWN0Tm9kZSB7XG4gICAgICAgIGlmICghdGhpcy5wcm9wcy5zaG93QXBwcykgcmV0dXJuIDxkaXYgLz47XG4gICAgICAgIGNvbnN0IHdpZGdldElzTWF4bWlzZWQ6IGJvb2xlYW4gPSB0aGlzLmNlbnRlckFwcHMoKS5sZW5ndGggPiAwO1xuICAgICAgICBjb25zdCBhcHBzVG9EaXNwbGF5ID0gd2lkZ2V0SXNNYXhtaXNlZCA/IHRoaXMuY2VudGVyQXBwcygpIDogdGhpcy50b3BBcHBzKCk7XG4gICAgICAgIGNvbnN0IGFwcHMgPSBhcHBzVG9EaXNwbGF5Lm1hcCgoYXBwLCBpbmRleCwgYXJyKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgIDxBcHBUaWxlXG4gICAgICAgICAgICAgICAgICAgIGtleT17YXBwLmlkfVxuICAgICAgICAgICAgICAgICAgICBhcHA9e2FwcH1cbiAgICAgICAgICAgICAgICAgICAgZnVsbFdpZHRoPXthcnIubGVuZ3RoIDwgMn1cbiAgICAgICAgICAgICAgICAgICAgcm9vbT17dGhpcy5wcm9wcy5yb29tfVxuICAgICAgICAgICAgICAgICAgICB1c2VySWQ9e3RoaXMucHJvcHMudXNlcklkfVxuICAgICAgICAgICAgICAgICAgICBjcmVhdG9yVXNlcklkPXthcHAuY3JlYXRvclVzZXJJZH1cbiAgICAgICAgICAgICAgICAgICAgd2lkZ2V0UGFnZVRpdGxlPXtXaWRnZXRVdGlscy5nZXRXaWRnZXREYXRhVGl0bGUoYXBwKX1cbiAgICAgICAgICAgICAgICAgICAgd2FpdEZvcklmcmFtZUxvYWQ9e2FwcC53YWl0Rm9ySWZyYW1lTG9hZH1cbiAgICAgICAgICAgICAgICAgICAgcG9pbnRlckV2ZW50cz17dGhpcy5pc1Jlc2l6aW5nKCkgPyBcIm5vbmVcIiA6IHVuZGVmaW5lZH1cbiAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKGFwcHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gPGRpdiAvPjtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBzcGlubmVyO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgICBhcHBzLmxlbmd0aCA9PT0gMCAmJlxuICAgICAgICAgICAgV2lkZ2V0RWNob1N0b3JlLnJvb21IYXNQZW5kaW5nV2lkZ2V0cyh0aGlzLnByb3BzLnJvb20ucm9vbUlkLCBXaWRnZXRVdGlscy5nZXRSb29tV2lkZ2V0cyh0aGlzLnByb3BzLnJvb20pKVxuICAgICAgICApIHtcbiAgICAgICAgICAgIHNwaW5uZXIgPSA8U3Bpbm5lciAvPjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGNsYXNzZXMgPSBjbGFzc05hbWVzKHtcbiAgICAgICAgICAgIFwibXhfQXBwc0RyYXdlclwiOiB0cnVlLFxuICAgICAgICAgICAgXCJteF9BcHBzRHJhd2VyLS1tYXhpbWlzZWRcIjogd2lkZ2V0SXNNYXhtaXNlZCxcbiAgICAgICAgICAgIFwibXhfQXBwc0RyYXdlci0tcmVzaXppbmdcIjogdGhpcy5zdGF0ZS5yZXNpemluZyxcbiAgICAgICAgICAgIFwibXhfQXBwc0RyYXdlci0tMmFwcHNcIjogYXBwcy5sZW5ndGggPT09IDIsXG4gICAgICAgICAgICBcIm14X0FwcHNEcmF3ZXItLTNhcHBzXCI6IGFwcHMubGVuZ3RoID09PSAzLFxuICAgICAgICB9KTtcbiAgICAgICAgY29uc3QgYXBwQ29udGFpbmVycyA9IChcbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibXhfQXBwc0NvbnRhaW5lclwiIHJlZj17dGhpcy5jb2xsZWN0UmVzaXplcn0+XG4gICAgICAgICAgICAgICAge2FwcHMubWFwKChhcHAsIGkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGkgPCAxKSByZXR1cm4gYXBwO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgICAgICAgICAgPFJlYWN0LkZyYWdtZW50IGtleT17YXBwLmtleX0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPFJlc2l6ZUhhbmRsZSByZXZlcnNlPXtpID4gYXBwcy5sZW5ndGggLyAyfSAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHthcHB9XG4gICAgICAgICAgICAgICAgICAgICAgICA8L1JlYWN0LkZyYWdtZW50PlxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH0pfVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICk7XG5cbiAgICAgICAgbGV0IGRyYXdlcjtcbiAgICAgICAgaWYgKHdpZGdldElzTWF4bWlzZWQpIHtcbiAgICAgICAgICAgIGRyYXdlciA9IGFwcENvbnRhaW5lcnM7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBkcmF3ZXIgPSAoXG4gICAgICAgICAgICAgICAgPFBlcnNpc3RlbnRWUmVzaXplclxuICAgICAgICAgICAgICAgICAgICByb29tPXt0aGlzLnByb3BzLnJvb219XG4gICAgICAgICAgICAgICAgICAgIG1pbkhlaWdodD17MTAwfVxuICAgICAgICAgICAgICAgICAgICBtYXhIZWlnaHQ9e3RoaXMucHJvcHMubWF4SGVpZ2h0IC0gNTB9XG4gICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cIm14X0FwcHNEcmF3ZXJfcmVzaXplclwiXG4gICAgICAgICAgICAgICAgICAgIGhhbmRsZVdyYXBwZXJDbGFzcz1cIm14X0FwcHNEcmF3ZXJfcmVzaXplcl9jb250YWluZXJcIlxuICAgICAgICAgICAgICAgICAgICBoYW5kbGVDbGFzcz1cIm14X0FwcHNEcmF3ZXJfcmVzaXplcl9jb250YWluZXJfaGFuZGxlXCJcbiAgICAgICAgICAgICAgICAgICAgcmVzaXplTm90aWZpZXI9e3RoaXMucHJvcHMucmVzaXplTm90aWZpZXJ9XG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICB7YXBwQ29udGFpbmVyc31cbiAgICAgICAgICAgICAgICA8L1BlcnNpc3RlbnRWUmVzaXplcj5cbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgPGRpdiByb2xlPXt0aGlzLnByb3BzLnJvbGV9IGNsYXNzTmFtZT17Y2xhc3Nlc30+XG4gICAgICAgICAgICAgICAge2RyYXdlcn1cbiAgICAgICAgICAgICAgICB7c3Bpbm5lcn1cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICApO1xuICAgIH1cbn1cblxuaW50ZXJmYWNlIElQZXJzaXN0ZW50UmVzaXplclByb3BzIHtcbiAgICByb29tOiBSb29tO1xuICAgIG1pbkhlaWdodDogbnVtYmVyO1xuICAgIG1heEhlaWdodDogbnVtYmVyO1xuICAgIGNsYXNzTmFtZTogc3RyaW5nO1xuICAgIGhhbmRsZVdyYXBwZXJDbGFzczogc3RyaW5nO1xuICAgIGhhbmRsZUNsYXNzOiBzdHJpbmc7XG4gICAgcmVzaXplTm90aWZpZXI6IFJlc2l6ZU5vdGlmaWVyO1xuICAgIGNoaWxkcmVuOiBSZWFjdC5SZWFjdE5vZGU7XG59XG5cbmNvbnN0IFBlcnNpc3RlbnRWUmVzaXplcjogUmVhY3QuRkM8SVBlcnNpc3RlbnRSZXNpemVyUHJvcHM+ID0gKHtcbiAgICByb29tLFxuICAgIG1pbkhlaWdodCxcbiAgICBtYXhIZWlnaHQsXG4gICAgY2xhc3NOYW1lLFxuICAgIGhhbmRsZVdyYXBwZXJDbGFzcyxcbiAgICBoYW5kbGVDbGFzcyxcbiAgICByZXNpemVOb3RpZmllcixcbiAgICBjaGlsZHJlbixcbn0pID0+IHtcbiAgICBsZXQgZGVmYXVsdEhlaWdodCA9IFdpZGdldExheW91dFN0b3JlLmluc3RhbmNlLmdldENvbnRhaW5lckhlaWdodChyb29tLCBDb250YWluZXIuVG9wKTtcblxuICAgIC8vIEFyYml0cmFyeSBkZWZhdWx0cyB0byBhdm9pZCBOYU4gcHJvYmxlbXMuIDEwMCBweCBvciAzLzQgb2YgdGhlIHZpc2libGUgd2luZG93LlxuICAgIGlmICghbWluSGVpZ2h0KSBtaW5IZWlnaHQgPSAxMDA7XG4gICAgaWYgKCFtYXhIZWlnaHQpIG1heEhlaWdodCA9IChVSVN0b3JlLmluc3RhbmNlLndpbmRvd0hlaWdodCAvIDQpICogMztcblxuICAgIC8vIENvbnZlcnQgZnJvbSBwZXJjZW50YWdlIHRvIGhlaWdodC4gTm90ZSB0aGF0IHRoZSBkZWZhdWx0IGhlaWdodCBpcyAyODBweC5cbiAgICBpZiAoZGVmYXVsdEhlaWdodCkge1xuICAgICAgICBkZWZhdWx0SGVpZ2h0ID0gY2xhbXAoZGVmYXVsdEhlaWdodCwgMCwgMTAwKTtcbiAgICAgICAgZGVmYXVsdEhlaWdodCA9IHBlcmNlbnRhZ2VXaXRoaW4oZGVmYXVsdEhlaWdodCAvIDEwMCwgbWluSGVpZ2h0LCBtYXhIZWlnaHQpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGRlZmF1bHRIZWlnaHQgPSBTZGtDb25maWcuZ2V0KCkuZGVmYXVsdF93aWRnZXRfY29udGFpbmVyX2hlaWdodCA/PyAyODA7XG4gICAgfVxuXG4gICAgcmV0dXJuIChcbiAgICAgICAgPFJlc2l6YWJsZVxuICAgICAgICAgICAgLy8gdHlwZXMgZG8gbm90IHN1cHBvcnQgdW5kZWZpbmVkIGhlaWdodC93aWR0aFxuICAgICAgICAgICAgLy8gYnV0IHJlc2l6YWJsZSBjb2RlIGNoZWNrcyBzcGVjaWZpY2FsbHkgZm9yIHVuZGVmaW5lZCBvbiBTaXplIHByb3BcbiAgICAgICAgICAgIHNpemU9e3sgaGVpZ2h0OiBNYXRoLm1pbihkZWZhdWx0SGVpZ2h0LCBtYXhIZWlnaHQpLCB3aWR0aDogdW5kZWZpbmVkIH0gYXMgdW5rbm93biBhcyBTaXplfVxuICAgICAgICAgICAgbWluSGVpZ2h0PXttaW5IZWlnaHR9XG4gICAgICAgICAgICBtYXhIZWlnaHQ9e21heEhlaWdodH1cbiAgICAgICAgICAgIG9uUmVzaXplU3RhcnQ9eygpID0+IHtcbiAgICAgICAgICAgICAgICByZXNpemVOb3RpZmllci5zdGFydFJlc2l6aW5nKCk7XG4gICAgICAgICAgICB9fVxuICAgICAgICAgICAgb25SZXNpemU9eygpID0+IHtcbiAgICAgICAgICAgICAgICByZXNpemVOb3RpZmllci5ub3RpZnlUaW1lbGluZUhlaWdodENoYW5nZWQoKTtcbiAgICAgICAgICAgIH19XG4gICAgICAgICAgICBvblJlc2l6ZVN0b3A9eyhlLCBkaXIsIHJlZiwgZCkgPT4ge1xuICAgICAgICAgICAgICAgIGxldCBuZXdIZWlnaHQgPSBkZWZhdWx0SGVpZ2h0ISArIGQuaGVpZ2h0O1xuICAgICAgICAgICAgICAgIG5ld0hlaWdodCA9IHBlcmNlbnRhZ2VPZihuZXdIZWlnaHQsIG1pbkhlaWdodCwgbWF4SGVpZ2h0KSAqIDEwMDtcblxuICAgICAgICAgICAgICAgIFdpZGdldExheW91dFN0b3JlLmluc3RhbmNlLnNldENvbnRhaW5lckhlaWdodChyb29tLCBDb250YWluZXIuVG9wLCBuZXdIZWlnaHQpO1xuXG4gICAgICAgICAgICAgICAgcmVzaXplTm90aWZpZXIuc3RvcFJlc2l6aW5nKCk7XG4gICAgICAgICAgICB9fVxuICAgICAgICAgICAgY2xhc3NOYW1lPXtjbGFzc05hbWV9XG4gICAgICAgICAgICBoYW5kbGVXcmFwcGVyQ2xhc3M9e2hhbmRsZVdyYXBwZXJDbGFzc31cbiAgICAgICAgICAgIGhhbmRsZUNsYXNzZXM9e3sgYm90dG9tOiBoYW5kbGVDbGFzcyB9fVxuICAgICAgICAgICAgZW5hYmxlPXt7IGJvdHRvbTogdHJ1ZSB9fVxuICAgICAgICA+XG4gICAgICAgICAgICB7Y2hpbGRyZW59XG4gICAgICAgIDwvUmVzaXphYmxlPlxuICAgICk7XG59O1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7OztBQVFBLElBQUFBLE1BQUEsR0FBQUMsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFDLFdBQUEsR0FBQUYsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFFLFlBQUEsR0FBQUYsT0FBQTtBQUlBLElBQUFHLFFBQUEsR0FBQUosc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFJLFdBQUEsR0FBQUwsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFLLGVBQUEsR0FBQUMsdUJBQUEsQ0FBQU4sT0FBQTtBQUNBLElBQUFPLFlBQUEsR0FBQVIsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFRLGdCQUFBLEdBQUFULHNCQUFBLENBQUFDLE9BQUE7QUFFQSxJQUFBUyxhQUFBLEdBQUFWLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBVSxRQUFBLEdBQUFYLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBVyxXQUFBLEdBQUFaLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBWSxrQkFBQSxHQUFBWixPQUFBO0FBQ0EsSUFBQWEsUUFBQSxHQUFBYixPQUFBO0FBQ0EsSUFBQWMsUUFBQSxHQUFBZixzQkFBQSxDQUFBQyxPQUFBO0FBRUEsSUFBQWUsUUFBQSxHQUFBaEIsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFnQixVQUFBLEdBQUFqQixzQkFBQSxDQUFBQyxPQUFBO0FBQTJDLFNBQUFpQix5QkFBQUMsQ0FBQSw2QkFBQUMsT0FBQSxtQkFBQUMsQ0FBQSxPQUFBRCxPQUFBLElBQUFFLENBQUEsT0FBQUYsT0FBQSxZQUFBRix3QkFBQSxZQUFBQSxDQUFBQyxDQUFBLFdBQUFBLENBQUEsR0FBQUcsQ0FBQSxHQUFBRCxDQUFBLEtBQUFGLENBQUE7QUFBQSxTQUFBWix3QkFBQVksQ0FBQSxFQUFBRSxDQUFBLFNBQUFB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