matrix-react-sdk
Version:
SDK for matrix.org using React
371 lines (296 loc) • 47.8 kB
JavaScript
"use strict";
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = void 0;
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
var _react = _interopRequireDefault(require("react"));
var _propTypes = _interopRequireDefault(require("prop-types"));
var _room = require("matrix-js-sdk/src/models/room");
var sdk = _interopRequireWildcard(require("../../index"));
var _dispatcher = _interopRequireDefault(require("../../dispatcher/dispatcher"));
var _ratelimitedfunc = _interopRequireDefault(require("../../ratelimitedfunc"));
var _GroupAddressPicker = require("../../GroupAddressPicker");
var _GroupStore = _interopRequireDefault(require("../../stores/GroupStore"));
var _RightPanelStorePhases = require("../../stores/RightPanelStorePhases");
var _RightPanelStore = _interopRequireDefault(require("../../stores/RightPanelStore"));
var _MatrixClientContext = _interopRequireDefault(require("../../contexts/MatrixClientContext"));
var _actions = require("../../dispatcher/actions");
var _RoomSummaryCard = _interopRequireDefault(require("../views/right_panel/RoomSummaryCard"));
var _WidgetCard = _interopRequireDefault(require("../views/right_panel/WidgetCard"));
var _replaceableComponent = require("../../utils/replaceableComponent");
var _SettingsStore = _interopRequireDefault(require("../../settings/SettingsStore"));
var _dec, _class, _class2, _temp;
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; }
let RightPanel = (_dec = (0, _replaceableComponent.replaceableComponent)("structures.RightPanel"), _dec(_class = (_temp = _class2 = class RightPanel extends _react.default.Component {
static get propTypes() {
return {
room: _propTypes.default.instanceOf(_room.Room),
// if showing panels for a given room, this is set
groupId: _propTypes.default.string,
// if showing panels for a given group, this is set
user: _propTypes.default.object // used if we know the user ahead of opening the panel
};
}
constructor(props, context) {
super(props, context);
(0, _defineProperty2.default)(this, "onClose", () => {
// XXX: There are three different ways of 'closing' this panel depending on what state
// things are in... this knows far more than it should do about the state of the rest
// of the app and is generally a bit silly.
if (this.props.user) {
// If we have a user prop then we're displaying a user from the 'user' page type
// in LoggedInView, so need to change the page type to close the panel (we switch
// to the home page which is not obviously the correct thing to do, but I'm not sure
// anything else is - we could hide the close button altogether?)
_dispatcher.default.dispatch({
action: "view_home_page"
});
} else if (this.state.phase === _RightPanelStorePhases.RightPanelPhases.EncryptionPanel && this.state.verificationRequest && this.state.verificationRequest.pending) {
// When the user clicks close on the encryption panel cancel the pending request first if any
this.state.verificationRequest.cancel();
} else {
// the RightPanelStore has no way of knowing which mode room/group it is in, so we handle closing here
_dispatcher.default.dispatch({
action: _actions.Action.ToggleRightPanel,
type: this.props.groupId ? "group" : "room"
});
}
});
this.state = _objectSpread(_objectSpread({}, _RightPanelStore.default.getSharedInstance().roomPanelPhaseParams), {}, {
phase: this._getPhaseFromProps(),
isUserPrivilegedInGroup: null,
member: this._getUserForPanel()
});
this.onAction = this.onAction.bind(this);
this.onRoomStateMember = this.onRoomStateMember.bind(this);
this.onGroupStoreUpdated = this.onGroupStoreUpdated.bind(this);
this.onInviteToGroupButtonClick = this.onInviteToGroupButtonClick.bind(this);
this.onAddRoomToGroupButtonClick = this.onAddRoomToGroupButtonClick.bind(this);
this._delayedUpdate = new _ratelimitedfunc.default(() => {
this.forceUpdate();
}, 500);
} // Helper function to split out the logic for _getPhaseFromProps() and the constructor
// as both are called at the same time in the constructor.
_getUserForPanel() {
if (this.state && this.state.member) return this.state.member;
const lastParams = _RightPanelStore.default.getSharedInstance().roomPanelPhaseParams;
return this.props.user || lastParams['member'];
} // gets the current phase from the props and also maybe the store
_getPhaseFromProps() {
const rps = _RightPanelStore.default.getSharedInstance();
const userForPanel = this._getUserForPanel();
if (this.props.groupId) {
if (!_RightPanelStorePhases.RIGHT_PANEL_PHASES_NO_ARGS.includes(rps.groupPanelPhase)) {
_dispatcher.default.dispatch({
action: _actions.Action.SetRightPanelPhase,
phase: _RightPanelStorePhases.RightPanelPhases.GroupMemberList
});
return _RightPanelStorePhases.RightPanelPhases.GroupMemberList;
}
return rps.groupPanelPhase;
} else if (_SettingsStore.default.getValue("feature_spaces") && this.props.room?.isSpaceRoom() && !_RightPanelStorePhases.RIGHT_PANEL_SPACE_PHASES.includes(rps.roomPanelPhase)) {
return _RightPanelStorePhases.RightPanelPhases.SpaceMemberList;
} else if (userForPanel) {
// XXX FIXME AAAAAARGH: What is going on with this class!? It takes some of its state
// from its props and some from a store, except if the contents of the store changes
// while it's mounted in which case it replaces all of its state with that of the store,
// except it uses a dispatch instead of a normal store listener?
// Unfortunately rewriting this would almost certainly break showing the right panel
// in some of the many cases, and I don't have time to re-architect it and test all
// the flows now, so adding yet another special case so if the store thinks there is
// a verification going on for the member we're displaying, we show that, otherwise
// we race if a verification is started while the panel isn't displayed because we're
// not mounted in time to get the dispatch.
// Until then, let this code serve as a warning from history.
if (rps.roomPanelPhaseParams.member && userForPanel.userId === rps.roomPanelPhaseParams.member.userId && rps.roomPanelPhaseParams.verificationRequest) {
return rps.roomPanelPhase;
}
return _RightPanelStorePhases.RightPanelPhases.RoomMemberInfo;
}
return rps.roomPanelPhase;
}
componentDidMount() {
this.dispatcherRef = _dispatcher.default.register(this.onAction);
const cli = this.context;
cli.on("RoomState.members", this.onRoomStateMember);
this._initGroupStore(this.props.groupId);
}
componentWillUnmount() {
_dispatcher.default.unregister(this.dispatcherRef);
if (this.context) {
this.context.removeListener("RoomState.members", this.onRoomStateMember);
}
this._unregisterGroupStore(this.props.groupId);
} // TODO: [REACT-WARNING] Replace with appropriate lifecycle event
UNSAFE_componentWillReceiveProps(newProps) {
// eslint-disable-line camelcase
if (newProps.groupId !== this.props.groupId) {
this._unregisterGroupStore(this.props.groupId);
this._initGroupStore(newProps.groupId);
}
}
_initGroupStore(groupId) {
if (!groupId) return;
_GroupStore.default.registerListener(groupId, this.onGroupStoreUpdated);
}
_unregisterGroupStore() {
_GroupStore.default.unregisterListener(this.onGroupStoreUpdated);
}
onGroupStoreUpdated() {
this.setState({
isUserPrivilegedInGroup: _GroupStore.default.isUserPrivileged(this.props.groupId)
});
}
onInviteToGroupButtonClick() {
(0, _GroupAddressPicker.showGroupInviteDialog)(this.props.groupId).then(() => {
this.setState({
phase: _RightPanelStorePhases.RightPanelPhases.GroupMemberList
});
});
}
onAddRoomToGroupButtonClick() {
(0, _GroupAddressPicker.showGroupAddRoomDialog)(this.props.groupId).then(() => {
this.forceUpdate();
});
}
onRoomStateMember(ev, state, member) {
if (!this.props.room || member.roomId !== this.props.room.roomId) {
return;
} // redraw the badge on the membership list
if (this.state.phase === _RightPanelStorePhases.RightPanelPhases.RoomMemberList && member.roomId === this.props.room.roomId) {
this._delayedUpdate();
} else if (this.state.phase === _RightPanelStorePhases.RightPanelPhases.RoomMemberInfo && member.roomId === this.props.room.roomId && member.userId === this.state.member.userId) {
// refresh the member info (e.g. new power level)
this._delayedUpdate();
}
}
onAction(payload) {
if (payload.action === _actions.Action.AfterRightPanelPhaseChange) {
this.setState({
phase: payload.phase,
groupRoomId: payload.groupRoomId,
groupId: payload.groupId,
member: payload.member,
event: payload.event,
verificationRequest: payload.verificationRequest,
verificationRequestPromise: payload.verificationRequestPromise,
widgetId: payload.widgetId,
space: payload.space
});
}
}
render() {
const MemberList = sdk.getComponent('rooms.MemberList');
const UserInfo = sdk.getComponent('right_panel.UserInfo');
const ThirdPartyMemberInfo = sdk.getComponent('rooms.ThirdPartyMemberInfo');
const NotificationPanel = sdk.getComponent('structures.NotificationPanel');
const FilePanel = sdk.getComponent('structures.FilePanel');
const GroupMemberList = sdk.getComponent('groups.GroupMemberList');
const GroupRoomList = sdk.getComponent('groups.GroupRoomList');
const GroupRoomInfo = sdk.getComponent('groups.GroupRoomInfo');
let panel = /*#__PURE__*/_react.default.createElement("div", null);
const roomId = this.props.room ? this.props.room.roomId : undefined;
switch (this.state.phase) {
case _RightPanelStorePhases.RightPanelPhases.RoomMemberList:
if (roomId) {
panel = /*#__PURE__*/_react.default.createElement(MemberList, {
roomId: roomId,
key: roomId,
onClose: this.onClose
});
}
break;
case _RightPanelStorePhases.RightPanelPhases.SpaceMemberList:
panel = /*#__PURE__*/_react.default.createElement(MemberList, {
roomId: this.state.space ? this.state.space.roomId : roomId,
key: this.state.space ? this.state.space.roomId : roomId,
onClose: this.onClose
});
break;
case _RightPanelStorePhases.RightPanelPhases.GroupMemberList:
if (this.props.groupId) {
panel = /*#__PURE__*/_react.default.createElement(GroupMemberList, {
groupId: this.props.groupId,
key: this.props.groupId
});
}
break;
case _RightPanelStorePhases.RightPanelPhases.GroupRoomList:
panel = /*#__PURE__*/_react.default.createElement(GroupRoomList, {
groupId: this.props.groupId,
key: this.props.groupId
});
break;
case _RightPanelStorePhases.RightPanelPhases.RoomMemberInfo:
case _RightPanelStorePhases.RightPanelPhases.SpaceMemberInfo:
case _RightPanelStorePhases.RightPanelPhases.EncryptionPanel:
panel = /*#__PURE__*/_react.default.createElement(UserInfo, {
user: this.state.member,
room: this.state.phase === _RightPanelStorePhases.RightPanelPhases.SpaceMemberInfo ? this.state.space : this.props.room,
key: roomId || this.state.member.userId,
onClose: this.onClose,
phase: this.state.phase,
verificationRequest: this.state.verificationRequest,
verificationRequestPromise: this.state.verificationRequestPromise
});
break;
case _RightPanelStorePhases.RightPanelPhases.Room3pidMemberInfo:
case _RightPanelStorePhases.RightPanelPhases.Space3pidMemberInfo:
panel = /*#__PURE__*/_react.default.createElement(ThirdPartyMemberInfo, {
event: this.state.event,
key: roomId
});
break;
case _RightPanelStorePhases.RightPanelPhases.GroupMemberInfo:
panel = /*#__PURE__*/_react.default.createElement(UserInfo, {
user: this.state.member,
groupId: this.props.groupId,
key: this.state.member.userId,
onClose: this.onClose
});
break;
case _RightPanelStorePhases.RightPanelPhases.GroupRoomInfo:
panel = /*#__PURE__*/_react.default.createElement(GroupRoomInfo, {
groupRoomId: this.state.groupRoomId,
groupId: this.props.groupId,
key: this.state.groupRoomId
});
break;
case _RightPanelStorePhases.RightPanelPhases.NotificationPanel:
panel = /*#__PURE__*/_react.default.createElement(NotificationPanel, {
onClose: this.onClose
});
break;
case _RightPanelStorePhases.RightPanelPhases.FilePanel:
panel = /*#__PURE__*/_react.default.createElement(FilePanel, {
roomId: roomId,
resizeNotifier: this.props.resizeNotifier,
onClose: this.onClose
});
break;
case _RightPanelStorePhases.RightPanelPhases.RoomSummary:
panel = /*#__PURE__*/_react.default.createElement(_RoomSummaryCard.default, {
room: this.props.room,
onClose: this.onClose
});
break;
case _RightPanelStorePhases.RightPanelPhases.Widget:
panel = /*#__PURE__*/_react.default.createElement(_WidgetCard.default, {
room: this.props.room,
widgetId: this.state.widgetId,
onClose: this.onClose
});
break;
}
return /*#__PURE__*/_react.default.createElement("aside", {
className: "mx_RightPanel dark-panel",
id: "mx_RightPanel"
}, panel);
}
}, (0, _defineProperty2.default)(_class2, "contextType", _MatrixClientContext.default), _temp)) || _class);
exports.default = RightPanel;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb21wb25lbnRzL3N0cnVjdHVyZXMvUmlnaHRQYW5lbC5qcyJdLCJuYW1lcyI6WyJSaWdodFBhbmVsIiwiUmVhY3QiLCJDb21wb25lbnQiLCJwcm9wVHlwZXMiLCJyb29tIiwiUHJvcFR5cGVzIiwiaW5zdGFuY2VPZiIsIlJvb20iLCJncm91cElkIiwic3RyaW5nIiwidXNlciIsIm9iamVjdCIsImNvbnN0cnVjdG9yIiwicHJvcHMiLCJjb250ZXh0IiwiZGlzIiwiZGlzcGF0Y2giLCJhY3Rpb24iLCJzdGF0ZSIsInBoYXNlIiwiUmlnaHRQYW5lbFBoYXNlcyIsIkVuY3J5cHRpb25QYW5lbCIsInZlcmlmaWNhdGlvblJlcXVlc3QiLCJwZW5kaW5nIiwiY2FuY2VsIiwiQWN0aW9uIiwiVG9nZ2xlUmlnaHRQYW5lbCIsInR5cGUiLCJSaWdodFBhbmVsU3RvcmUiLCJnZXRTaGFyZWRJbnN0YW5jZSIsInJvb21QYW5lbFBoYXNlUGFyYW1zIiwiX2dldFBoYXNlRnJvbVByb3BzIiwiaXNVc2VyUHJpdmlsZWdlZEluR3JvdXAiLCJtZW1iZXIiLCJfZ2V0VXNlckZvclBhbmVsIiwib25BY3Rpb24iLCJiaW5kIiwib25Sb29tU3RhdGVNZW1iZXIiLCJvbkdyb3VwU3RvcmVVcGRhdGVkIiwib25JbnZpdGVUb0dyb3VwQnV0dG9uQ2xpY2siLCJvbkFkZFJvb21Ub0dyb3VwQnV0dG9uQ2xpY2siLCJfZGVsYXllZFVwZGF0ZSIsIlJhdGVMaW1pdGVkRnVuYyIsImZvcmNlVXBkYXRlIiwibGFzdFBhcmFtcyIsInJwcyIsInVzZXJGb3JQYW5lbCIsIlJJR0hUX1BBTkVMX1BIQVNFU19OT19BUkdTIiwiaW5jbHVkZXMiLCJncm91cFBhbmVsUGhhc2UiLCJTZXRSaWdodFBhbmVsUGhhc2UiLCJHcm91cE1lbWJlckxpc3QiLCJTZXR0aW5nc1N0b3JlIiwiZ2V0VmFsdWUiLCJpc1NwYWNlUm9vbSIsIlJJR0hUX1BBTkVMX1NQQUNFX1BIQVNFUyIsInJvb21QYW5lbFBoYXNlIiwiU3BhY2VNZW1iZXJMaXN0IiwidXNlcklkIiwiUm9vbU1lbWJlckluZm8iLCJjb21wb25lbnREaWRNb3VudCIsImRpc3BhdGNoZXJSZWYiLCJyZWdpc3RlciIsImNsaSIsIm9uIiwiX2luaXRHcm91cFN0b3JlIiwiY29tcG9uZW50V2lsbFVubW91bnQiLCJ1bnJlZ2lzdGVyIiwicmVtb3ZlTGlzdGVuZXIiLCJfdW5yZWdpc3Rlckdyb3VwU3RvcmUiLCJVTlNBRkVfY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyIsIm5ld1Byb3BzIiwiR3JvdXBTdG9yZSIsInJlZ2lzdGVyTGlzdGVuZXIiLCJ1bnJlZ2lzdGVyTGlzdGVuZXIiLCJzZXRTdGF0ZSIsImlzVXNlclByaXZpbGVnZWQiLCJ0aGVuIiwiZXYiLCJyb29tSWQiLCJSb29tTWVtYmVyTGlzdCIsInBheWxvYWQiLCJBZnRlclJpZ2h0UGFuZWxQaGFzZUNoYW5nZSIsImdyb3VwUm9vbUlkIiwiZXZlbnQiLCJ2ZXJpZmljYXRpb25SZXF1ZXN0UHJvbWlzZSIsIndpZGdldElkIiwic3BhY2UiLCJyZW5kZXIiLCJNZW1iZXJMaXN0Iiwic2RrIiwiZ2V0Q29tcG9uZW50IiwiVXNlckluZm8iLCJUaGlyZFBhcnR5TWVtYmVySW5mbyIsIk5vdGlmaWNhdGlvblBhbmVsIiwiRmlsZVBhbmVsIiwiR3JvdXBSb29tTGlzdCIsIkdyb3VwUm9vbUluZm8iLCJwYW5lbCIsInVuZGVmaW5lZCIsIm9uQ2xvc2UiLCJTcGFjZU1lbWJlckluZm8iLCJSb29tM3BpZE1lbWJlckluZm8iLCJTcGFjZTNwaWRNZW1iZXJJbmZvIiwiR3JvdXBNZW1iZXJJbmZvIiwicmVzaXplTm90aWZpZXIiLCJSb29tU3VtbWFyeSIsIldpZGdldCIsIk1hdHJpeENsaWVudENvbnRleHQiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7QUFpQkE7O0FBQ0E7O0FBQ0E7O0FBRUE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBS0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7Ozs7Ozs7O0lBR3FCQSxVLFdBRHBCLGdEQUFxQix1QkFBckIsQyxtQ0FBRCxNQUNxQkEsVUFEckIsU0FDd0NDLGVBQU1DLFNBRDlDLENBQ3dEO0FBQ3BELGFBQVdDLFNBQVgsR0FBdUI7QUFDbkIsV0FBTztBQUNIQyxNQUFBQSxJQUFJLEVBQUVDLG1CQUFVQyxVQUFWLENBQXFCQyxVQUFyQixDQURIO0FBQytCO0FBQ2xDQyxNQUFBQSxPQUFPLEVBQUVILG1CQUFVSSxNQUZoQjtBQUV3QjtBQUMzQkMsTUFBQUEsSUFBSSxFQUFFTCxtQkFBVU0sTUFIYixDQUdxQjs7QUFIckIsS0FBUDtBQUtIOztBQUlEQyxFQUFBQSxXQUFXLENBQUNDLEtBQUQsRUFBUUMsT0FBUixFQUFpQjtBQUN4QixVQUFNRCxLQUFOLEVBQWFDLE9BQWI7QUFEd0IsbURBbUpsQixNQUFNO0FBQ1o7QUFDQTtBQUNBO0FBQ0EsVUFBSSxLQUFLRCxLQUFMLENBQVdILElBQWYsRUFBcUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQUssNEJBQUlDLFFBQUosQ0FBYTtBQUNUQyxVQUFBQSxNQUFNLEVBQUU7QUFEQyxTQUFiO0FBR0gsT0FSRCxNQVFPLElBQ0gsS0FBS0MsS0FBTCxDQUFXQyxLQUFYLEtBQXFCQyx3Q0FBaUJDLGVBQXRDLElBQ0EsS0FBS0gsS0FBTCxDQUFXSSxtQkFEWCxJQUNrQyxLQUFLSixLQUFMLENBQVdJLG1CQUFYLENBQStCQyxPQUY5RCxFQUdMO0FBQ0U7QUFDQSxhQUFLTCxLQUFMLENBQVdJLG1CQUFYLENBQStCRSxNQUEvQjtBQUNILE9BTk0sTUFNQTtBQUNIO0FBQ0FULDRCQUFJQyxRQUFKLENBQWE7QUFDVEMsVUFBQUEsTUFBTSxFQUFFUSxnQkFBT0MsZ0JBRE47QUFFVEMsVUFBQUEsSUFBSSxFQUFFLEtBQUtkLEtBQUwsQ0FBV0wsT0FBWCxHQUFxQixPQUFyQixHQUErQjtBQUY1QixTQUFiO0FBSUg7QUFDSixLQTVLMkI7QUFFeEIsU0FBS1UsS0FBTCxtQ0FDT1UseUJBQWdCQyxpQkFBaEIsR0FBb0NDLG9CQUQzQztBQUVJWCxNQUFBQSxLQUFLLEVBQUUsS0FBS1ksa0JBQUwsRUFGWDtBQUdJQyxNQUFBQSx1QkFBdUIsRUFBRSxJQUg3QjtBQUlJQyxNQUFBQSxNQUFNLEVBQUUsS0FBS0MsZ0JBQUw7QUFKWjtBQU1BLFNBQUtDLFFBQUwsR0FBZ0IsS0FBS0EsUUFBTCxDQUFjQyxJQUFkLENBQW1CLElBQW5CLENBQWhCO0FBQ0EsU0FBS0MsaUJBQUwsR0FBeUIsS0FBS0EsaUJBQUwsQ0FBdUJELElBQXZCLENBQTRCLElBQTVCLENBQXpCO0FBQ0EsU0FBS0UsbUJBQUwsR0FBMkIsS0FBS0EsbUJBQUwsQ0FBeUJGLElBQXpCLENBQThCLElBQTlCLENBQTNCO0FBQ0EsU0FBS0csMEJBQUwsR0FBa0MsS0FBS0EsMEJBQUwsQ0FBZ0NILElBQWhDLENBQXFDLElBQXJDLENBQWxDO0FBQ0EsU0FBS0ksMkJBQUwsR0FBbUMsS0FBS0EsMkJBQUwsQ0FBaUNKLElBQWpDLENBQXNDLElBQXRDLENBQW5DO0FBRUEsU0FBS0ssY0FBTCxHQUFzQixJQUFJQyx3QkFBSixDQUFvQixNQUFNO0FBQzVDLFdBQUtDLFdBQUw7QUFDSCxLQUZxQixFQUVuQixHQUZtQixDQUF0QjtBQUdILEdBNUJtRCxDQThCcEQ7QUFDQTs7O0FBQ0FULEVBQUFBLGdCQUFnQixHQUFHO0FBQ2YsUUFBSSxLQUFLaEIsS0FBTCxJQUFjLEtBQUtBLEtBQUwsQ0FBV2UsTUFBN0IsRUFBcUMsT0FBTyxLQUFLZixLQUFMLENBQVdlLE1BQWxCOztBQUNyQyxVQUFNVyxVQUFVLEdBQUdoQix5QkFBZ0JDLGlCQUFoQixHQUFvQ0Msb0JBQXZEOztBQUNBLFdBQU8sS0FBS2pCLEtBQUwsQ0FBV0gsSUFBWCxJQUFtQmtDLFVBQVUsQ0FBQyxRQUFELENBQXBDO0FBQ0gsR0FwQ21ELENBc0NwRDs7O0FBQ0FiLEVBQUFBLGtCQUFrQixHQUFHO0FBQ2pCLFVBQU1jLEdBQUcsR0FBR2pCLHlCQUFnQkMsaUJBQWhCLEVBQVo7O0FBQ0EsVUFBTWlCLFlBQVksR0FBRyxLQUFLWixnQkFBTCxFQUFyQjs7QUFDQSxRQUFJLEtBQUtyQixLQUFMLENBQVdMLE9BQWYsRUFBd0I7QUFDcEIsVUFBSSxDQUFDdUMsa0RBQTJCQyxRQUEzQixDQUFvQ0gsR0FBRyxDQUFDSSxlQUF4QyxDQUFMLEVBQStEO0FBQzNEbEMsNEJBQUlDLFFBQUosQ0FBYTtBQUFDQyxVQUFBQSxNQUFNLEVBQUVRLGdCQUFPeUIsa0JBQWhCO0FBQW9DL0IsVUFBQUEsS0FBSyxFQUFFQyx3Q0FBaUIrQjtBQUE1RCxTQUFiOztBQUNBLGVBQU8vQix3Q0FBaUIrQixlQUF4QjtBQUNIOztBQUNELGFBQU9OLEdBQUcsQ0FBQ0ksZUFBWDtBQUNILEtBTkQsTUFNTyxJQUFJRyx1QkFBY0MsUUFBZCxDQUF1QixnQkFBdkIsS0FBNEMsS0FBS3hDLEtBQUwsQ0FBV1QsSUFBWCxFQUFpQmtELFdBQWpCLEVBQTVDLElBQ0osQ0FBQ0MsZ0RBQXlCUCxRQUF6QixDQUFrQ0gsR0FBRyxDQUFDVyxjQUF0QyxDQURELEVBRUw7QUFDRSxhQUFPcEMsd0NBQWlCcUMsZUFBeEI7QUFDSCxLQUpNLE1BSUEsSUFBSVgsWUFBSixFQUFrQjtBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFDSUQsR0FBRyxDQUFDZixvQkFBSixDQUF5QkcsTUFBekIsSUFDQWEsWUFBWSxDQUFDWSxNQUFiLEtBQXdCYixHQUFHLENBQUNmLG9CQUFKLENBQXlCRyxNQUF6QixDQUFnQ3lCLE1BRHhELElBRUFiLEdBQUcsQ0FBQ2Ysb0JBQUosQ0FBeUJSLG1CQUg3QixFQUlFO0FBQ0UsZUFBT3VCLEdBQUcsQ0FBQ1csY0FBWDtBQUNIOztBQUNELGFBQU9wQyx3Q0FBaUJ1QyxjQUF4QjtBQUNIOztBQUNELFdBQU9kLEdBQUcsQ0FBQ1csY0FBWDtBQUNIOztBQUVESSxFQUFBQSxpQkFBaUIsR0FBRztBQUNoQixTQUFLQyxhQUFMLEdBQXFCOUMsb0JBQUkrQyxRQUFKLENBQWEsS0FBSzNCLFFBQWxCLENBQXJCO0FBQ0EsVUFBTTRCLEdBQUcsR0FBRyxLQUFLakQsT0FBakI7QUFDQWlELElBQUFBLEdBQUcsQ0FBQ0MsRUFBSixDQUFPLG1CQUFQLEVBQTRCLEtBQUszQixpQkFBakM7O0FBQ0EsU0FBSzRCLGVBQUwsQ0FBcUIsS0FBS3BELEtBQUwsQ0FBV0wsT0FBaEM7QUFDSDs7QUFFRDBELEVBQUFBLG9CQUFvQixHQUFHO0FBQ25CbkQsd0JBQUlvRCxVQUFKLENBQWUsS0FBS04sYUFBcEI7O0FBQ0EsUUFBSSxLQUFLL0MsT0FBVCxFQUFrQjtBQUNkLFdBQUtBLE9BQUwsQ0FBYXNELGNBQWIsQ0FBNEIsbUJBQTVCLEVBQWlELEtBQUsvQixpQkFBdEQ7QUFDSDs7QUFDRCxTQUFLZ0MscUJBQUwsQ0FBMkIsS0FBS3hELEtBQUwsQ0FBV0wsT0FBdEM7QUFDSCxHQXpGbUQsQ0EyRnBEOzs7QUFDQThELEVBQUFBLGdDQUFnQyxDQUFDQyxRQUFELEVBQVc7QUFBRTtBQUN6QyxRQUFJQSxRQUFRLENBQUMvRCxPQUFULEtBQXFCLEtBQUtLLEtBQUwsQ0FBV0wsT0FBcEMsRUFBNkM7QUFDekMsV0FBSzZELHFCQUFMLENBQTJCLEtBQUt4RCxLQUFMLENBQVdMLE9BQXRDOztBQUNBLFdBQUt5RCxlQUFMLENBQXFCTSxRQUFRLENBQUMvRCxPQUE5QjtBQUNIO0FBQ0o7O0FBRUR5RCxFQUFBQSxlQUFlLENBQUN6RCxPQUFELEVBQVU7QUFDckIsUUFBSSxDQUFDQSxPQUFMLEVBQWM7O0FBQ2RnRSx3QkFBV0MsZ0JBQVgsQ0FBNEJqRSxPQUE1QixFQUFxQyxLQUFLOEIsbUJBQTFDO0FBQ0g7O0FBRUQrQixFQUFBQSxxQkFBcUIsR0FBRztBQUNwQkcsd0JBQVdFLGtCQUFYLENBQThCLEtBQUtwQyxtQkFBbkM7QUFDSDs7QUFFREEsRUFBQUEsbUJBQW1CLEdBQUc7QUFDbEIsU0FBS3FDLFFBQUwsQ0FBYztBQUNWM0MsTUFBQUEsdUJBQXVCLEVBQUV3QyxvQkFBV0ksZ0JBQVgsQ0FBNEIsS0FBSy9ELEtBQUwsQ0FBV0wsT0FBdkM7QUFEZixLQUFkO0FBR0g7O0FBRUQrQixFQUFBQSwwQkFBMEIsR0FBRztBQUN6QixtREFBc0IsS0FBSzFCLEtBQUwsQ0FBV0wsT0FBakMsRUFBMENxRSxJQUExQyxDQUErQyxNQUFNO0FBQ2pELFdBQUtGLFFBQUwsQ0FBYztBQUNWeEQsUUFBQUEsS0FBSyxFQUFFQyx3Q0FBaUIrQjtBQURkLE9BQWQ7QUFHSCxLQUpEO0FBS0g7O0FBRURYLEVBQUFBLDJCQUEyQixHQUFHO0FBQzFCLG9EQUF1QixLQUFLM0IsS0FBTCxDQUFXTCxPQUFsQyxFQUEyQ3FFLElBQTNDLENBQWdELE1BQU07QUFDbEQsV0FBS2xDLFdBQUw7QUFDSCxLQUZEO0FBR0g7O0FBRUROLEVBQUFBLGlCQUFpQixDQUFDeUMsRUFBRCxFQUFLNUQsS0FBTCxFQUFZZSxNQUFaLEVBQW9CO0FBQ2pDLFFBQUksQ0FBQyxLQUFLcEIsS0FBTCxDQUFXVCxJQUFaLElBQW9CNkIsTUFBTSxDQUFDOEMsTUFBUCxLQUFrQixLQUFLbEUsS0FBTCxDQUFXVCxJQUFYLENBQWdCMkUsTUFBMUQsRUFBa0U7QUFDOUQ7QUFDSCxLQUhnQyxDQUlqQzs7O0FBQ0EsUUFBSSxLQUFLN0QsS0FBTCxDQUFXQyxLQUFYLEtBQXFCQyx3Q0FBaUI0RCxjQUF0QyxJQUF3RC9DLE1BQU0sQ0FBQzhDLE1BQVAsS0FBa0IsS0FBS2xFLEtBQUwsQ0FBV1QsSUFBWCxDQUFnQjJFLE1BQTlGLEVBQXNHO0FBQ2xHLFdBQUt0QyxjQUFMO0FBQ0gsS0FGRCxNQUVPLElBQUksS0FBS3ZCLEtBQUwsQ0FBV0MsS0FBWCxLQUFxQkMsd0NBQWlCdUMsY0FBdEMsSUFBd0QxQixNQUFNLENBQUM4QyxNQUFQLEtBQWtCLEtBQUtsRSxLQUFMLENBQVdULElBQVgsQ0FBZ0IyRSxNQUExRixJQUNIOUMsTUFBTSxDQUFDeUIsTUFBUCxLQUFrQixLQUFLeEMsS0FBTCxDQUFXZSxNQUFYLENBQWtCeUIsTUFEckMsRUFDNkM7QUFDaEQ7QUFDQSxXQUFLakIsY0FBTDtBQUNIO0FBQ0o7O0FBRUROLEVBQUFBLFFBQVEsQ0FBQzhDLE9BQUQsRUFBVTtBQUNkLFFBQUlBLE9BQU8sQ0FBQ2hFLE1BQVIsS0FBbUJRLGdCQUFPeUQsMEJBQTlCLEVBQTBEO0FBQ3RELFdBQUtQLFFBQUwsQ0FBYztBQUNWeEQsUUFBQUEsS0FBSyxFQUFFOEQsT0FBTyxDQUFDOUQsS0FETDtBQUVWZ0UsUUFBQUEsV0FBVyxFQUFFRixPQUFPLENBQUNFLFdBRlg7QUFHVjNFLFFBQUFBLE9BQU8sRUFBRXlFLE9BQU8sQ0FBQ3pFLE9BSFA7QUFJVnlCLFFBQUFBLE1BQU0sRUFBRWdELE9BQU8sQ0FBQ2hELE1BSk47QUFLVm1ELFFBQUFBLEtBQUssRUFBRUgsT0FBTyxDQUFDRyxLQUxMO0FBTVY5RCxRQUFBQSxtQkFBbUIsRUFBRTJELE9BQU8sQ0FBQzNELG1CQU5uQjtBQU9WK0QsUUFBQUEsMEJBQTBCLEVBQUVKLE9BQU8sQ0FBQ0ksMEJBUDFCO0FBUVZDLFFBQUFBLFFBQVEsRUFBRUwsT0FBTyxDQUFDSyxRQVJSO0FBU1ZDLFFBQUFBLEtBQUssRUFBRU4sT0FBTyxDQUFDTTtBQVRMLE9BQWQ7QUFXSDtBQUNKOztBQTZCREMsRUFBQUEsTUFBTSxHQUFHO0FBQ0wsVUFBTUMsVUFBVSxHQUFHQyxHQUFHLENBQUNDLFlBQUosQ0FBaUIsa0JBQWpCLENBQW5CO0FBQ0EsVUFBTUMsUUFBUSxHQUFHRixHQUFHLENBQUNDLFlBQUosQ0FBaUIsc0JBQWpCLENBQWpCO0FBQ0EsVUFBTUUsb0JBQW9CLEdBQUdILEdBQUcsQ0FBQ0MsWUFBSixDQUFpQiw0QkFBakIsQ0FBN0I7QUFDQSxVQUFNRyxpQkFBaUIsR0FBR0osR0FBRyxDQUFDQyxZQUFKLENBQWlCLDhCQUFqQixDQUExQjtBQUNBLFVBQU1JLFNBQVMsR0FBR0wsR0FBRyxDQUFDQyxZQUFKLENBQWlCLHNCQUFqQixDQUFsQjtBQUVBLFVBQU14QyxlQUFlLEdBQUd1QyxHQUFHLENBQUNDLFlBQUosQ0FBaUIsd0JBQWpCLENBQXhCO0FBQ0EsVUFBTUssYUFBYSxHQUFHTixHQUFHLENBQUNDLFlBQUosQ0FBaUIsc0JBQWpCLENBQXRCO0FBQ0EsVUFBTU0sYUFBYSxHQUFHUCxHQUFHLENBQUNDLFlBQUosQ0FBaUIsc0JBQWpCLENBQXRCOztBQUVBLFFBQUlPLEtBQUssZ0JBQUcseUNBQVo7O0FBQ0EsVUFBTW5CLE1BQU0sR0FBRyxLQUFLbEUsS0FBTCxDQUFXVCxJQUFYLEdBQWtCLEtBQUtTLEtBQUwsQ0FBV1QsSUFBWCxDQUFnQjJFLE1BQWxDLEdBQTJDb0IsU0FBMUQ7O0FBRUEsWUFBUSxLQUFLakYsS0FBTCxDQUFXQyxLQUFuQjtBQUNJLFdBQUtDLHdDQUFpQjRELGNBQXRCO0FBQ0ksWUFBSUQsTUFBSixFQUFZO0FBQ1JtQixVQUFBQSxLQUFLLGdCQUFHLDZCQUFDLFVBQUQ7QUFBWSxZQUFBLE1BQU0sRUFBRW5CLE1BQXBCO0FBQTRCLFlBQUEsR0FBRyxFQUFFQSxNQUFqQztBQUF5QyxZQUFBLE9BQU8sRUFBRSxLQUFLcUI7QUFBdkQsWUFBUjtBQUNIOztBQUNEOztBQUNKLFdBQUtoRix3Q0FBaUJxQyxlQUF0QjtBQUNJeUMsUUFBQUEsS0FBSyxnQkFBRyw2QkFBQyxVQUFEO0FBQ0osVUFBQSxNQUFNLEVBQUUsS0FBS2hGLEtBQUwsQ0FBV3FFLEtBQVgsR0FBbUIsS0FBS3JFLEtBQUwsQ0FBV3FFLEtBQVgsQ0FBaUJSLE1BQXBDLEdBQTZDQSxNQURqRDtBQUVKLFVBQUEsR0FBRyxFQUFFLEtBQUs3RCxLQUFMLENBQVdxRSxLQUFYLEdBQW1CLEtBQUtyRSxLQUFMLENBQVdxRSxLQUFYLENBQWlCUixNQUFwQyxHQUE2Q0EsTUFGOUM7QUFHSixVQUFBLE9BQU8sRUFBRSxLQUFLcUI7QUFIVixVQUFSO0FBS0E7O0FBRUosV0FBS2hGLHdDQUFpQitCLGVBQXRCO0FBQ0ksWUFBSSxLQUFLdEMsS0FBTCxDQUFXTCxPQUFmLEVBQXdCO0FBQ3BCMEYsVUFBQUEsS0FBSyxnQkFBRyw2QkFBQyxlQUFEO0FBQWlCLFlBQUEsT0FBTyxFQUFFLEtBQUtyRixLQUFMLENBQVdMLE9BQXJDO0FBQThDLFlBQUEsR0FBRyxFQUFFLEtBQUtLLEtBQUwsQ0FBV0w7QUFBOUQsWUFBUjtBQUNIOztBQUNEOztBQUVKLFdBQUtZLHdDQUFpQjRFLGFBQXRCO0FBQ0lFLFFBQUFBLEtBQUssZ0JBQUcsNkJBQUMsYUFBRDtBQUFlLFVBQUEsT0FBTyxFQUFFLEtBQUtyRixLQUFMLENBQVdMLE9BQW5DO0FBQTRDLFVBQUEsR0FBRyxFQUFFLEtBQUtLLEtBQUwsQ0FBV0w7QUFBNUQsVUFBUjtBQUNBOztBQUVKLFdBQUtZLHdDQUFpQnVDLGNBQXRCO0FBQ0EsV0FBS3ZDLHdDQUFpQmlGLGVBQXRCO0FBQ0EsV0FBS2pGLHdDQUFpQkMsZUFBdEI7QUFDSTZFLFFBQUFBLEtBQUssZ0JBQUcsNkJBQUMsUUFBRDtBQUNKLFVBQUEsSUFBSSxFQUFFLEtBQUtoRixLQUFMLENBQVdlLE1BRGI7QUFFSixVQUFBLElBQUksRUFBRSxLQUFLZixLQUFMLENBQVdDLEtBQVgsS0FBcUJDLHdDQUFpQmlGLGVBQXRDLEdBQXdELEtBQUtuRixLQUFMLENBQVdxRSxLQUFuRSxHQUEyRSxLQUFLMUUsS0FBTCxDQUFXVCxJQUZ4RjtBQUdKLFVBQUEsR0FBRyxFQUFFMkUsTUFBTSxJQUFJLEtBQUs3RCxLQUFMLENBQVdlLE1BQVgsQ0FBa0J5QixNQUg3QjtBQUlKLFVBQUEsT0FBTyxFQUFFLEtBQUswQyxPQUpWO0FBS0osVUFBQSxLQUFLLEVBQUUsS0FBS2xGLEtBQUwsQ0FBV0MsS0FMZDtBQU1KLFVBQUEsbUJBQW1CLEVBQUUsS0FBS0QsS0FBTCxDQUFXSSxtQkFONUI7QUFPSixVQUFBLDBCQUEwQixFQUFFLEtBQUtKLEtBQUwsQ0FBV21FO0FBUG5DLFVBQVI7QUFTQTs7QUFFSixXQUFLakUsd0NBQWlCa0Ysa0JBQXRCO0FBQ0EsV0FBS2xGLHdDQUFpQm1GLG1CQUF0QjtBQUNJTCxRQUFBQSxLQUFLLGdCQUFHLDZCQUFDLG9CQUFEO0FBQXNCLFVBQUEsS0FBSyxFQUFFLEtBQUtoRixLQUFMLENBQVdrRSxLQUF4QztBQUErQyxVQUFBLEdBQUcsRUFBRUw7QUFBcEQsVUFBUjtBQUNBOztBQUVKLFdBQUszRCx3Q0FBaUJvRixlQUF0QjtBQUNJTixRQUFBQSxLQUFLLGdCQUFHLDZCQUFDLFFBQUQ7QUFDSixVQUFBLElBQUksRUFBRSxLQUFLaEYsS0FBTCxDQUFXZSxNQURiO0FBRUosVUFBQSxPQUFPLEVBQUUsS0FBS3BCLEtBQUwsQ0FBV0wsT0FGaEI7QUFHSixVQUFBLEdBQUcsRUFBRSxLQUFLVSxLQUFMLENBQVdlLE1BQVgsQ0FBa0J5QixNQUhuQjtBQUlKLFVBQUEsT0FBTyxFQUFFLEtBQUswQztBQUpWLFVBQVI7QUFLQTs7QUFFSixXQUFLaEYsd0NBQWlCNkUsYUFBdEI7QUFDSUMsUUFBQUEsS0FBSyxnQkFBRyw2QkFBQyxhQUFEO0FBQ0osVUFBQSxXQUFXLEVBQUUsS0FBS2hGLEtBQUwsQ0FBV2lFLFdBRHBCO0FBRUosVUFBQSxPQUFPLEVBQUUsS0FBS3RFLEtBQUwsQ0FBV0wsT0FGaEI7QUFHSixVQUFBLEdBQUcsRUFBRSxLQUFLVSxLQUFMLENBQVdpRTtBQUhaLFVBQVI7QUFJQTs7QUFFSixXQUFLL0Qsd0NBQWlCMEUsaUJBQXRCO0FBQ0lJLFFBQUFBLEtBQUssZ0JBQUcsNkJBQUMsaUJBQUQ7QUFBbUIsVUFBQSxPQUFPLEVBQUUsS0FBS0U7QUFBakMsVUFBUjtBQUNBOztBQUVKLFdBQUtoRix3Q0FBaUIyRSxTQUF0QjtBQUNJRyxRQUFBQSxLQUFLLGdCQUFHLDZCQUFDLFNBQUQ7QUFBVyxVQUFBLE1BQU0sRUFBRW5CLE1BQW5CO0FBQTJCLFVBQUEsY0FBYyxFQUFFLEtBQUtsRSxLQUFMLENBQVc0RixjQUF0RDtBQUFzRSxVQUFBLE9BQU8sRUFBRSxLQUFLTDtBQUFwRixVQUFSO0FBQ0E7O0FBRUosV0FBS2hGLHdDQUFpQnNGLFdBQXRCO0FBQ0lSLFFBQUFBLEtBQUssZ0JBQUcsNkJBQUMsd0JBQUQ7QUFBaUIsVUFBQSxJQUFJLEVBQUUsS0FBS3JGLEtBQUwsQ0FBV1QsSUFBbEM7QUFBd0MsVUFBQSxPQUFPLEVBQUUsS0FBS2dHO0FBQXRELFVBQVI7QUFDQTs7QUFFSixXQUFLaEYsd0NBQWlCdUYsTUFBdEI7QUFDSVQsUUFBQUEsS0FBSyxnQkFBRyw2QkFBQyxtQkFBRDtBQUFZLFVBQUEsSUFBSSxFQUFFLEtBQUtyRixLQUFMLENBQVdULElBQTdCO0FBQW1DLFVBQUEsUUFBUSxFQUFFLEtBQUtjLEtBQUwsQ0FBV29FLFFBQXhEO0FBQWtFLFVBQUEsT0FBTyxFQUFFLEtBQUtjO0FBQWhGLFVBQVI7QUFDQTtBQXhFUjs7QUEyRUEsd0JBQ0k7QUFBTyxNQUFBLFNBQVMsRUFBQywwQkFBakI7QUFBNEMsTUFBQSxFQUFFLEVBQUM7QUFBL0MsT0FDTUYsS0FETixDQURKO0FBS0g7O0FBdlJtRCxDLHdEQVMvQlUsNEIiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuQ29weXJpZ2h0IDIwMTkgTWljaGFlbCBUZWxhdHluc2tpIDw3dDNjaGd1eUBnbWFpbC5jb20+XG5Db3B5cmlnaHQgMjAxNSAtIDIwMjAgVGhlIE1hdHJpeC5vcmcgRm91bmRhdGlvbiBDLkkuQy5cblxuTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbnlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbllvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuXG4gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cblVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbmRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbldJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxubGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qL1xuXG5pbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJztcbmltcG9ydCB7Um9vbX0gZnJvbSBcIm1hdHJpeC1qcy1zZGsvc3JjL21vZGVscy9yb29tXCI7XG5cbmltcG9ydCAqIGFzIHNkayBmcm9tICcuLi8uLi9pbmRleCc7XG5pbXBvcnQgZGlzIGZyb20gJy4uLy4uL2Rpc3BhdGNoZXIvZGlzcGF0Y2hlcic7XG5pbXBvcnQgUmF0ZUxpbWl0ZWRGdW5jIGZyb20gJy4uLy4uL3JhdGVsaW1pdGVkZnVuYyc7XG5pbXBvcnQgeyBzaG93R3JvdXBJbnZpdGVEaWFsb2csIHNob3dHcm91cEFkZFJvb21EaWFsb2cgfSBmcm9tICcuLi8uLi9Hcm91cEFkZHJlc3NQaWNrZXInO1xuaW1wb3J0IEdyb3VwU3RvcmUgZnJvbSAnLi4vLi4vc3RvcmVzL0dyb3VwU3RvcmUnO1xuaW1wb3J0IHtcbiAgICBSaWdodFBhbmVsUGhhc2VzLFxuICAgIFJJR0hUX1BBTkVMX1BIQVNFU19OT19BUkdTLFxuICAgIFJJR0hUX1BBTkVMX1NQQUNFX1BIQVNFUyxcbn0gZnJvbSBcIi4uLy4uL3N0b3Jlcy9SaWdodFBhbmVsU3RvcmVQaGFzZXNcIjtcbmltcG9ydCBSaWdodFBhbmVsU3RvcmUgZnJvbSBcIi4uLy4uL3N0b3Jlcy9SaWdodFBhbmVsU3RvcmVcIjtcbmltcG9ydCBNYXRyaXhDbGllbnRDb250ZXh0IGZyb20gXCIuLi8uLi9jb250ZXh0cy9NYXRyaXhDbGllbnRDb250ZXh0XCI7XG5pbXBvcnQge0FjdGlvbn0gZnJvbSBcIi4uLy4uL2Rpc3BhdGNoZXIvYWN0aW9uc1wiO1xuaW1wb3J0IFJvb21TdW1tYXJ5Q2FyZCBmcm9tIFwiLi4vdmlld3MvcmlnaHRfcGFuZWwvUm9vbVN1bW1hcnlDYXJkXCI7XG5pbXBvcnQgV2lkZ2V0Q2FyZCBmcm9tIFwiLi4vdmlld3MvcmlnaHRfcGFuZWwvV2lkZ2V0Q2FyZFwiO1xuaW1wb3J0IHtyZXBsYWNlYWJsZUNvbXBvbmVudH0gZnJvbSBcIi4uLy4uL3V0aWxzL3JlcGxhY2VhYmxlQ29tcG9uZW50XCI7XG5pbXBvcnQgU2V0dGluZ3NTdG9yZSBmcm9tIFwiLi4vLi4vc2V0dGluZ3MvU2V0dGluZ3NTdG9yZVwiO1xuXG5AcmVwbGFjZWFibGVDb21wb25lbnQoXCJzdHJ1Y3R1cmVzLlJpZ2h0UGFuZWxcIilcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFJpZ2h0UGFuZWwgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICAgIHN0YXRpYyBnZXQgcHJvcFR5cGVzKCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgcm9vbTogUHJvcFR5cGVzLmluc3RhbmNlT2YoUm9vbSksIC8vIGlmIHNob3dpbmcgcGFuZWxzIGZvciBhIGdpdmVuIHJvb20sIHRoaXMgaXMgc2V0XG4gICAgICAgICAgICBncm91cElkOiBQcm9wVHlwZXMuc3RyaW5nLCAvLyBpZiBzaG93aW5nIHBhbmVscyBmb3IgYSBnaXZlbiBncm91cCwgdGhpcyBpcyBzZXRcbiAgICAgICAgICAgIHVzZXI6IFByb3BUeXBlcy5vYmplY3QsIC8vIHVzZWQgaWYgd2Uga25vdyB0aGUgdXNlciBhaGVhZCBvZiBvcGVuaW5nIHRoZSBwYW5lbFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIHN0YXRpYyBjb250ZXh0VHlwZSA9IE1hdHJpeENsaWVudENvbnRleHQ7XG5cbiAgICBjb25zdHJ1Y3Rvcihwcm9wcywgY29udGV4dCkge1xuICAgICAgICBzdXBlcihwcm9wcywgY29udGV4dCk7XG4gICAgICAgIHRoaXMuc3RhdGUgPSB7XG4gICAgICAgICAgICAuLi5SaWdodFBhbmVsU3RvcmUuZ2V0U2hhcmVkSW5zdGFuY2UoKS5yb29tUGFuZWxQaGFzZVBhcmFtcyxcbiAgICAgICAgICAgIHBoYXNlOiB0aGlzLl9nZXRQaGFzZUZyb21Qcm9wcygpLFxuICAgICAgICAgICAgaXNVc2VyUHJpdmlsZWdlZEluR3JvdXA6IG51bGwsXG4gICAgICAgICAgICBtZW1iZXI6IHRoaXMuX2dldFVzZXJGb3JQYW5lbCgpLFxuICAgICAgICB9O1xuICAgICAgICB0aGlzLm9uQWN0aW9uID0gdGhpcy5vbkFjdGlvbi5iaW5kKHRoaXMpO1xuICAgICAgICB0aGlzLm9uUm9vbVN0YXRlTWVtYmVyID0gdGhpcy5vblJvb21TdGF0ZU1lbWJlci5iaW5kKHRoaXMpO1xuICAgICAgICB0aGlzLm9uR3JvdXBTdG9yZVVwZGF0ZWQgPSB0aGlzLm9uR3JvdXBTdG9yZVVwZGF0ZWQuYmluZCh0aGlzKTtcbiAgICAgICAgdGhpcy5vbkludml0ZVRvR3JvdXBCdXR0b25DbGljayA9IHRoaXMub25JbnZpdGVUb0dyb3VwQnV0dG9uQ2xpY2suYmluZCh0aGlzKTtcbiAgICAgICAgdGhpcy5vbkFkZFJvb21Ub0dyb3VwQnV0dG9uQ2xpY2sgPSB0aGlzLm9uQWRkUm9vbVRvR3JvdXBCdXR0b25DbGljay5iaW5kKHRoaXMpO1xuXG4gICAgICAgIHRoaXMuX2RlbGF5ZWRVcGRhdGUgPSBuZXcgUmF0ZUxpbWl0ZWRGdW5jKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuZm9yY2VVcGRhdGUoKTtcbiAgICAgICAgfSwgNTAwKTtcbiAgICB9XG5cbiAgICAvLyBIZWxwZXIgZnVuY3Rpb24gdG8gc3BsaXQgb3V0IHRoZSBsb2dpYyBmb3IgX2dldFBoYXNlRnJvbVByb3BzKCkgYW5kIHRoZSBjb25zdHJ1Y3RvclxuICAgIC8vIGFzIGJvdGggYXJlIGNhbGxlZCBhdCB0aGUgc2FtZSB0aW1lIGluIHRoZSBjb25zdHJ1Y3Rvci5cbiAgICBfZ2V0VXNlckZvclBhbmVsKCkge1xuICAgICAgICBpZiAodGhpcy5zdGF0ZSAmJiB0aGlzLnN0YXRlLm1lbWJlcikgcmV0dXJuIHRoaXMuc3RhdGUubWVtYmVyO1xuICAgICAgICBjb25zdCBsYXN0UGFyYW1zID0gUmlnaHRQYW5lbFN0b3JlLmdldFNoYXJlZEluc3RhbmNlKCkucm9vbVBhbmVsUGhhc2VQYXJhbXM7XG4gICAgICAgIHJldHVybiB0aGlzLnByb3BzLnVzZXIgfHwgbGFzdFBhcmFtc1snbWVtYmVyJ107XG4gICAgfVxuXG4gICAgLy8gZ2V0cyB0aGUgY3VycmVudCBwaGFzZSBmcm9tIHRoZSBwcm9wcyBhbmQgYWxzbyBtYXliZSB0aGUgc3RvcmVcbiAgICBfZ2V0UGhhc2VGcm9tUHJvcHMoKSB7XG4gICAgICAgIGNvbnN0IHJwcyA9IFJpZ2h0UGFuZWxTdG9yZS5nZXRTaGFyZWRJbnN0YW5jZSgpO1xuICAgICAgICBjb25zdCB1c2VyRm9yUGFuZWwgPSB0aGlzLl9nZXRVc2VyRm9yUGFuZWwoKTtcbiAgICAgICAgaWYgKHRoaXMucHJvcHMuZ3JvdXBJZCkge1xuICAgICAgICAgICAgaWYgKCFSSUdIVF9QQU5FTF9QSEFTRVNfTk9fQVJHUy5pbmNsdWRlcyhycHMuZ3JvdXBQYW5lbFBoYXNlKSkge1xuICAgICAgICAgICAgICAgIGRpcy5kaXNwYXRjaCh7YWN0aW9uOiBBY3Rpb24uU2V0UmlnaHRQYW5lbFBoYXNlLCBwaGFzZTogUmlnaHRQYW5lbFBoYXNlcy5Hcm91cE1lbWJlckxpc3R9KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gUmlnaHRQYW5lbFBoYXNlcy5Hcm91cE1lbWJlckxpc3Q7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcnBzLmdyb3VwUGFuZWxQaGFzZTtcbiAgICAgICAgfSBlbHNlIGlmIChTZXR0aW5nc1N0b3JlLmdldFZhbHVlKFwiZmVhdHVyZV9zcGFjZXNcIikgJiYgdGhpcy5wcm9wcy5yb29tPy5pc1NwYWNlUm9vbSgpXG4gICAgICAgICAgICAmJiAhUklHSFRfUEFORUxfU1BBQ0VfUEhBU0VTLmluY2x1ZGVzKHJwcy5yb29tUGFuZWxQaGFzZSlcbiAgICAgICAgKSB7XG4gICAgICAgICAgICByZXR1cm4gUmlnaHRQYW5lbFBoYXNlcy5TcGFjZU1lbWJlckxpc3Q7XG4gICAgICAgIH0gZWxzZSBpZiAodXNlckZvclBhbmVsKSB7XG4gICAgICAgICAgICAvLyBYWFggRklYTUUgQUFBQUFBUkdIOiBXaGF0IGlzIGdvaW5nIG9uIHdpdGggdGhpcyBjbGFzcyE/IEl0IHRha2VzIHNvbWUgb2YgaXRzIHN0YXRlXG4gICAgICAgICAgICAvLyBmcm9tIGl0cyBwcm9wcyBhbmQgc29tZSBmcm9tIGEgc3RvcmUsIGV4Y2VwdCBpZiB0aGUgY29udGVudHMgb2YgdGhlIHN0b3JlIGNoYW5nZXNcbiAgICAgICAgICAgIC8vIHdoaWxlIGl0J3MgbW91bnRlZCBpbiB3aGljaCBjYXNlIGl0IHJlcGxhY2VzIGFsbCBvZiBpdHMgc3RhdGUgd2l0aCB0aGF0IG9mIHRoZSBzdG9yZSxcbiAgICAgICAgICAgIC8vIGV4Y2VwdCBpdCB1c2VzIGEgZGlzcGF0Y2ggaW5zdGVhZCBvZiBhIG5vcm1hbCBzdG9yZSBsaXN0ZW5lcj9cbiAgICAgICAgICAgIC8vIFVuZm9ydHVuYXRlbHkgcmV3cml0aW5nIHRoaXMgd291bGQgYWxtb3N0IGNlcnRhaW5seSBicmVhayBzaG93aW5nIHRoZSByaWdodCBwYW5lbFxuICAgICAgICAgICAgLy8gaW4gc29tZSBvZiB0aGUgbWFueSBjYXNlcywgYW5kIEkgZG9uJ3QgaGF2ZSB0aW1lIHRvIHJlLWFyY2hpdGVjdCBpdCBhbmQgdGVzdCBhbGxcbiAgICAgICAgICAgIC8vIHRoZSBmbG93cyBub3csIHNvIGFkZGluZyB5ZXQgYW5vdGhlciBzcGVjaWFsIGNhc2Ugc28gaWYgdGhlIHN0b3JlIHRoaW5rcyB0aGVyZSBpc1xuICAgICAgICAgICAgLy8gYSB2ZXJpZmljYXRpb24gZ29pbmcgb24gZm9yIHRoZSBtZW1iZXIgd2UncmUgZGlzcGxheWluZywgd2Ugc2hvdyB0aGF0LCBvdGhlcndpc2VcbiAgICAgICAgICAgIC8vIHdlIHJhY2UgaWYgYSB2ZXJpZmljYXRpb24gaXMgc3RhcnRlZCB3aGlsZSB0aGUgcGFuZWwgaXNuJ3QgZGlzcGxheWVkIGJlY2F1c2Ugd2UncmVcbiAgICAgICAgICAgIC8vIG5vdCBtb3VudGVkIGluIHRpbWUgdG8gZ2V0IHRoZSBkaXNwYXRjaC5cbiAgICAgICAgICAgIC8vIFVudGlsIHRoZW4sIGxldCB0aGlzIGNvZGUgc2VydmUgYXMgYSB3YXJuaW5nIGZyb20gaGlzdG9yeS5cbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICBycHMucm9vbVBhbmVsUGhhc2VQYXJhbXMubWVtYmVyICYmXG4gICAgICAgICAgICAgICAgdXNlckZvclBhbmVsLnVzZXJJZCA9PT0gcnBzLnJvb21QYW5lbFBoYXNlUGFyYW1zLm1lbWJlci51c2VySWQgJiZcbiAgICAgICAgICAgICAgICBycHMucm9vbVBhbmVsUGhhc2VQYXJhbXMudmVyaWZpY2F0aW9uUmVxdWVzdFxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJwcy5yb29tUGFuZWxQaGFzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBSaWdodFBhbmVsUGhhc2VzLlJvb21NZW1iZXJJbmZvO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBycHMucm9vbVBhbmVsUGhhc2U7XG4gICAgfVxuXG4gICAgY29tcG9uZW50RGlkTW91bnQoKSB7XG4gICAgICAgIHRoaXMuZGlzcGF0Y2hlclJlZiA9IGRpcy5yZWdpc3Rlcih0aGlzLm9uQWN0aW9uKTtcbiAgICAgICAgY29uc3QgY2xpID0gdGhpcy5jb250ZXh0O1xuICAgICAgICBjbGkub24oXCJSb29tU3RhdGUubWVtYmVyc1wiLCB0aGlzLm9uUm9vbVN0YXRlTWVtYmVyKTtcbiAgICAgICAgdGhpcy5faW5pdEdyb3VwU3RvcmUodGhpcy5wcm9wcy5ncm91cElkKTtcbiAgICB9XG5cbiAgICBjb21wb25lbnRXaWxsVW5tb3VudCgpIHtcbiAgICAgICAgZGlzLnVucmVnaXN0ZXIodGhpcy5kaXNwYXRjaGVyUmVmKTtcbiAgICAgICAgaWYgKHRoaXMuY29udGV4dCkge1xuICAgICAgICAgICAgdGhpcy5jb250ZXh0LnJlbW92ZUxpc3RlbmVyKFwiUm9vbVN0YXRlLm1lbWJlcnNcIiwgdGhpcy5vblJvb21TdGF0ZU1lbWJlcik7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fdW5yZWdpc3Rlckdyb3VwU3RvcmUodGhpcy5wcm9wcy5ncm91cElkKTtcbiAgICB9XG5cbiAgICAvLyBUT0RPOiBbUkVBQ1QtV0FSTklOR10gUmVwbGFjZSB3aXRoIGFwcHJvcHJpYXRlIGxpZmVjeWNsZSBldmVudFxuICAgIFVOU0FGRV9jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzKG5ld1Byb3BzKSB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgY2FtZWxjYXNlXG4gICAgICAgIGlmIChuZXdQcm9wcy5ncm91cElkICE9PSB0aGlzLnByb3BzLmdyb3VwSWQpIHtcbiAgICAgICAgICAgIHRoaXMuX3VucmVnaXN0ZXJHcm91cFN0b3JlKHRoaXMucHJvcHMuZ3JvdXBJZCk7XG4gICAgICAgICAgICB0aGlzLl9pbml0R3JvdXBTdG9yZShuZXdQcm9wcy5ncm91cElkKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIF9pbml0R3JvdXBTdG9yZShncm91cElkKSB7XG4gICAgICAgIGlmICghZ3JvdXBJZCkgcmV0dXJuO1xuICAgICAgICBHcm91cFN0b3JlLnJlZ2lzdGVyTGlzdGVuZXIoZ3JvdXBJZCwgdGhpcy5vbkdyb3VwU3RvcmVVcGRhdGVkKTtcbiAgICB9XG5cbiAgICBfdW5yZWdpc3Rlckdyb3VwU3RvcmUoKSB7XG4gICAgICAgIEdyb3VwU3RvcmUudW5yZWdpc3Rlckxpc3RlbmVyKHRoaXMub25Hcm91cFN0b3JlVXBkYXRlZCk7XG4gICAgfVxuXG4gICAgb25Hcm91cFN0b3JlVXBkYXRlZCgpIHtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgICBpc1VzZXJQcml2aWxlZ2VkSW5Hcm91cDogR3JvdXBTdG9yZS5pc1VzZXJQcml2aWxlZ2VkKHRoaXMucHJvcHMuZ3JvdXBJZCksXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIG9uSW52aXRlVG9Hcm91cEJ1dHRvbkNsaWNrKCkge1xuICAgICAgICBzaG93R3JvdXBJbnZpdGVEaWFsb2codGhpcy5wcm9wcy5ncm91cElkKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICAgICAgICAgIHBoYXNlOiBSaWdodFBhbmVsUGhhc2VzLkdyb3VwTWVtYmVyTGlzdCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBvbkFkZFJvb21Ub0dyb3VwQnV0dG9uQ2xpY2soKSB7XG4gICAgICAgIHNob3dHcm91cEFkZFJvb21EaWFsb2codGhpcy5wcm9wcy5ncm91cElkKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuZm9yY2VVcGRhdGUoKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgb25Sb29tU3RhdGVNZW1iZXIoZXYsIHN0YXRlLCBtZW1iZXIpIHtcbiAgICAgICAgaWYgKCF0aGlzLnByb3BzLnJvb20gfHwgbWVtYmVyLnJvb21JZCAhPT0gdGhpcy5wcm9wcy5yb29tLnJvb21JZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIC8vIHJlZHJhdyB0aGUgYmFkZ2Ugb24gdGhlIG1lbWJlcnNoaXAgbGlzdFxuICAgICAgICBpZiAodGhpcy5zdGF0ZS5waGFzZSA9PT0gUmlnaHRQYW5lbFBoYXNlcy5Sb29tTWVtYmVyTGlzdCAmJiBtZW1iZXIucm9vbUlkID09PSB0aGlzLnByb3BzLnJvb20ucm9vbUlkKSB7XG4gICAgICAgICAgICB0aGlzLl9kZWxheWVkVXBkYXRlKCk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5zdGF0ZS5waGFzZSA9PT0gUmlnaHRQYW5lbFBoYXNlcy5Sb29tTWVtYmVySW5mbyAmJiBtZW1iZXIucm9vbUlkID09PSB0aGlzLnByb3BzLnJvb20ucm9vbUlkICYmXG4gICAgICAgICAgICAgICAgbWVtYmVyLnVzZXJJZCA9PT0gdGhpcy5zdGF0ZS5tZW1iZXIudXNlcklkKSB7XG4gICAgICAgICAgICAvLyByZWZyZXNoIHRoZSBtZW1iZXIgaW5mbyAoZS5nLiBuZXcgcG93ZXIgbGV2ZWwpXG4gICAgICAgICAgICB0aGlzLl9kZWxheWVkVXBkYXRlKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBvbkFjdGlvbihwYXlsb2FkKSB7XG4gICAgICAgIGlmIChwYXlsb2FkLmFjdGlvbiA9PT0gQWN0aW9uLkFmdGVyUmlnaHRQYW5lbFBoYXNlQ2hhbmdlKSB7XG4gICAgICAgICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgICAgICAgICBwaGFzZTogcGF5bG9hZC5waGFzZSxcbiAgICAgICAgICAgICAgICBncm91cFJvb21JZDogcGF5bG9hZC5ncm91cFJvb21JZCxcbiAgICAgICAgICAgICAgICBncm91cElkOiBwYXlsb2FkLmdyb3VwSWQsXG4gICAgICAgICAgICAgICAgbWVtYmVyOiBwYXlsb2FkLm1lbWJlcixcbiAgICAgICAgICAgICAgICBldmVudDogcGF5bG9hZC5ldmVudCxcbiAgICAgICAgICAgICAgICB2ZXJpZmljYXRpb25SZXF1ZXN0OiBwYXlsb2FkLnZlcmlmaWNhdGlvblJlcXVlc3QsXG4gICAgICAgICAgICAgICAgdmVyaWZpY2F0aW9uUmVxdWVzdFByb21pc2U6IHBheWxvYWQudmVyaWZpY2F0aW9uUmVxdWVzdFByb21pc2UsXG4gICAgICAgICAgICAgICAgd2lkZ2V0SWQ6IHBheWxvYWQud2lkZ2V0SWQsXG4gICAgICAgICAgICAgICAgc3BhY2U6IHBheWxvYWQuc3BhY2UsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIG9uQ2xvc2UgPSAoKSA9PiB7XG4gICAgICAgIC8vIFhYWDogVGhlcmUgYXJlIHRocmVlIGRpZmZlcmVudCB3YXlzIG9mICdjbG9zaW5nJyB0aGlzIHBhbmVsIGRlcGVuZGluZyBvbiB3aGF0IHN0YXRlXG4gICAgICAgIC8vIHRoaW5ncyBhcmUgaW4uLi4gdGhpcyBrbm93cyBmYXIgbW9yZSB0aGFuIGl0IHNob3VsZCBkbyBhYm91dCB0aGUgc3RhdGUgb2YgdGhlIHJlc3RcbiAgICAgICAgLy8gb2YgdGhlIGFwcCBhbmQgaXMgZ2VuZXJhbGx5IGEgYml0IHNpbGx5LlxuICAgICAgICBpZiAodGhpcy5wcm9wcy51c2VyKSB7XG4gICAgICAgICAgICAvLyBJZiB3ZSBoYXZlIGEgdXNlciBwcm9wIHRoZW4gd2UncmUgZGlzcGxheWluZyBhIHVzZXIgZnJvbSB0aGUgJ3VzZXInIHBhZ2UgdHlwZVxuICAgICAgICAgICAgLy8gaW4gTG9nZ2VkSW5WaWV3LCBzbyBuZWVkIHRvIGNoYW5nZSB0aGUgcGFnZSB0eXBlIHRvIGNsb3NlIHRoZSBwYW5lbCAod2Ugc3dpdGNoXG4gICAgICAgICAgICAvLyB0byB0aGUgaG9tZSBwYWdlIHdoaWNoIGlzIG5vdCBvYnZpb3VzbHkgdGhlIGNvcnJlY3QgdGhpbmcgdG8gZG8sIGJ1dCBJJ20gbm90IHN1cmVcbiAgICAgICAgICAgIC8vIGFueXRoaW5nIGVsc2UgaXMgLSB3ZSBjb3VsZCBoaWRlIHRoZSBjbG9zZSBidXR0b24gYWx0b2dldGhlcj8pXG4gICAgICAgICAgICBkaXMuZGlzcGF0Y2goe1xuICAgICAgICAgICAgICAgIGFjdGlvbjogXCJ2aWV3X2hvbWVfcGFnZVwiLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgICB0aGlzLnN0YXRlLnBoYXNlID09PSBSaWdodFBhbmVsUGhhc2VzLkVuY3J5cHRpb25QYW5lbCAmJlxuICAgICAgICAgICAgdGhpcy5zdGF0ZS52ZXJpZmljYXRpb25SZXF1ZXN0ICYmIHRoaXMuc3RhdGUudmVyaWZpY2F0aW9uUmVxdWVzdC5wZW5kaW5nXG4gICAgICAgICkge1xuICAgICAgICAgICAgLy8gV2hlbiB0aGUgdXNlciBjbGlja3MgY2xvc2Ugb24gdGhlIGVuY3J5cHRpb24gcGFuZWwgY2FuY2VsIHRoZSBwZW5kaW5nIHJlcXVlc3QgZmlyc3QgaWYgYW55XG4gICAgICAgICAgICB0aGlzLnN0YXRlLnZlcmlmaWNhdGlvblJlcXVlc3QuY2FuY2VsKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyB0aGUgUmlnaHRQYW5lbFN0b3JlIGhhcyBubyB3YXkgb2Yga25vd2luZyB3aGljaCBtb2RlIHJvb20vZ3JvdXAgaXQgaXMgaW4sIHNvIHdlIGhhbmRsZSBjbG9zaW5nIGhlcmVcbiAgICAgICAgICAgIGRpcy5kaXNwYXRjaCh7XG4gICAgICAgICAgICAgICAgYWN0aW9uOiBBY3Rpb24uVG9nZ2xlUmlnaHRQYW5lbCxcbiAgICAgICAgICAgICAgICB0eXBlOiB0aGlzLnByb3BzLmdyb3VwSWQgPyBcImdyb3VwXCIgOiBcInJvb21cIixcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIHJlbmRlcigpIHtcbiAgICAgICAgY29uc3QgTWVtYmVyTGlzdCA9IHNkay5nZXRDb21wb25lbnQoJ3Jvb21zLk1lbWJlckxpc3QnKTtcbiAgICAgICAgY29uc3QgVXNlckluZm8gPSBzZGsuZ2V0Q29tcG9uZW50KCdyaWdodF9wYW5lbC5Vc2VySW5mbycpO1xuICAgICAgICBjb25zdCBUaGlyZFBhcnR5TWVtYmVySW5mbyA9IHNkay5nZXRDb21wb25lbnQoJ3Jvb21zLlRoaXJkUGFydHlNZW1iZXJJbmZvJyk7XG4gICAgICAgIGNvbnN0IE5vdGlmaWNhdGlvblBhbmVsID0gc2RrLmdldENvbXBvbmVudCgnc3RydWN0dXJlcy5Ob3RpZmljYXRpb25QYW5lbCcpO1xuICAgICAgICBjb25zdCBGaWxlUGFuZWwgPSBzZGsuZ2V0Q29tcG9uZW50KCdzdHJ1Y3R1cmVzLkZpbGVQYW5lbCcpO1xuXG4gICAgICAgIGNvbnN0IEdyb3VwTWVtYmVyTGlzdCA9IHNkay5nZXRDb21wb25lbnQoJ2dyb3Vwcy5Hcm91cE1lbWJlckxpc3QnKTtcbiAgICAgICAgY29uc3QgR3JvdXBSb29tTGlzdCA9IHNkay5nZXRDb21wb25lbnQoJ2dyb3Vwcy5Hcm91cFJvb21MaXN0Jyk7XG4gICAgICAgIGNvbnN0IEdyb3VwUm9vbUluZm8gPSBzZGsuZ2V0Q29tcG9uZW50KCdncm91cHMuR3JvdXBSb29tSW5mbycpO1xuXG4gICAgICAgIGxldCBwYW5lbCA9IDxkaXYgLz47XG4gICAgICAgIGNvbnN0IHJvb21JZCA9IHRoaXMucHJvcHMucm9vbSA/IHRoaXMucHJvcHMucm9vbS5yb29tSWQgOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgc3dpdGNoICh0aGlzLnN0YXRlLnBoYXNlKSB7XG4gICAgICAgICAgICBjYXNlIFJpZ2h0UGFuZWxQaGFzZXMuUm9vbU1lbWJlckxpc3Q6XG4gICAgICAgICAgICAgICAgaWYgKHJvb21JZCkge1xuICAgICAgICAgICAgICAgICAgICBwYW5lbCA9IDxNZW1iZXJMaXN0IHJvb21JZD17cm9vbUlkfSBrZXk9e3Jvb21JZH0gb25DbG9zZT17dGhpcy5vbkNsb3NlfSAvPjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFJpZ2h0UGFuZWxQaGFzZXMuU3BhY2VNZW1iZXJMaXN0OlxuICAgICAgICAgICAgICAgIHBhbmVsID0gPE1lbWJlckxpc3RcbiAgICAgICAgICAgICAgICAgICAgcm9vbUlkPXt0aGlzLnN0YXRlLnNwYWNlID8gdGhpcy5zdGF0ZS5zcGFjZS5yb29tSWQgOiByb29tSWR9XG4gICAgICAgICAgICAgICAgICAgIGtleT17dGhpcy5zdGF0ZS5zcGFjZSA/IHRoaXMuc3RhdGUuc3BhY2Uucm9vbUlkIDogcm9vbUlkfVxuICAgICAgICAgICAgICAgICAgICBvbkNsb3NlPXt0aGlzLm9uQ2xvc2V9XG4gICAgICAgICAgICAgICAgLz47XG4gICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgIGNhc2UgUmlnaHRQYW5lbFBoYXNlcy5Hcm91cE1lbWJlckxpc3Q6XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMucHJvcHMuZ3JvdXBJZCkge1xuICAgICAgICAgICAgICAgICAgICBwYW5lbCA9IDxHcm91cE1lbWJlckxpc3QgZ3JvdXBJZD17dGhpcy5wcm9wcy5ncm91cElkfSBrZXk9e3RoaXMucHJvcHMuZ3JvdXBJZH0gLz47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICBjYXNlIFJpZ2h0UGFuZWxQaGFzZXMuR3JvdXBSb29tTGlzdDpcbiAgICAgICAgICAgICAgICBwYW5lbCA9IDxHcm91cFJvb21MaXN0IGdyb3VwSWQ9e3RoaXMucHJvcHMuZ3JvdXBJZH0ga2V5PXt0aGlzLnByb3BzLmdyb3VwSWR9IC8+O1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICBjYXNlIFJpZ2h0UGFuZWxQaGFzZXMuUm9vbU1lbWJlckluZm86XG4gICAgICAgICAgICBjYXNlIFJpZ2h0UGFuZWxQaGFzZXMuU3BhY2VNZW1iZXJJbmZvOlxuICAgICAgICAgICAgY2FzZSBSaWdodFBhbmVsUGhhc2VzLkVuY3J5cHRpb25QYW5lbDpcbiAgICAgICAgICAgICAgICBwYW5lbCA9IDxVc2VySW5mb1xuICAgICAgICAgICAgICAgICAgICB1c2VyPXt0aGlzLnN0YXRlLm1lbWJlcn1cbiAgICAgICAgICAgICAgICAgICAgcm9vbT17dGhpcy5zdGF0ZS5waGFzZSA9PT0gUmlnaHRQYW5lbFBoYXNlcy5TcGFjZU1lbWJlckluZm8gPyB0aGlzLnN0YXRlLnNwYWNlIDogdGhpcy5wcm9wcy5yb29tfVxuICAgICAgICAgICAgICAgICAgICBrZXk9e3Jvb21JZCB8fCB0aGlzLnN0YXRlLm1lbWJlci51c2VySWR9XG4gICAgICAgICAgICAgICAgICAgIG9uQ2xvc2U9e3RoaXMub25DbG9zZX1cbiAgICAgICAgICAgICAgICAgICAgcGhhc2U9e3RoaXMuc3RhdGUucGhhc2V9XG4gICAgICAgICAgICAgICAgICAgIHZlcmlmaWNhdGlvblJlcXVlc3Q9e3RoaXMuc3RhdGUudmVyaWZpY2F0aW9uUmVxdWVzdH1cbiAgICAgICAgICAgICAgICAgICAgdmVyaWZpY2F0aW9uUmVxdWVzdFByb21pc2U9e3RoaXMuc3RhdGUudmVyaWZpY2F0aW9uUmVxdWVzdFByb21pc2V9XG4gICAgICAgICAgICAgICAgLz47XG4gICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgIGNhc2UgUmlnaHRQYW5lbFBoYXNlcy5Sb29tM3BpZE1lbWJlckluZm86XG4gICAgICAgICAgICBjYXNlIFJpZ2h0UGFuZWxQaGFzZXMuU3BhY2UzcGlkTWVtYmVySW5mbzpcbiAgICAgICAgICAgICAgICBwYW5lbCA9IDxUaGlyZFBhcnR5TWVtYmVySW5mbyBldmVudD17dGhpcy5zdGF0ZS5ldmVudH0ga2V5PXtyb29tSWR9IC8+O1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICBjYXNlIFJpZ2h0UGFuZWxQaGFzZXMuR3JvdXBNZW1iZXJJbmZvOlxuICAgICAgICAgICAgICAgIHBhbmVsID0gPFVzZXJJbmZvXG4gICAgICAgICAgICAgICAgICAgIHVzZXI9e3RoaXMuc3RhdGUubWVtYmVyfVxuICAgICAgICAgICAgICAgICAgICBncm91cElkPXt0aGlzLnByb3BzLmdyb3VwSWR9XG4gICAgICAgICAgICAgICAgICAgIGtleT17dGhpcy5zdGF0ZS5tZW1iZXIudXNlcklkfVxuICAgICAgICAgICAgICAgICAgICBvbkNsb3NlPXt0aGlzLm9uQ2xvc2V9IC8+O1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICBjYXNlIFJpZ2h0UGFuZWxQaGFzZXMuR3JvdXBSb29tSW5mbzpcbiAgICAgICAgICAgICAgICBwYW5lbCA9IDxHcm91cFJvb21JbmZvXG4gICAgICAgICAgICAgICAgICAgIGdyb3VwUm9vbUlkPXt0aGlzLnN0YXRlLmdyb3VwUm9vbUlkfVxuICAgICAgICAgICAgICAgICAgICBncm91cElkPXt0aGlzLnByb3BzLmdyb3VwSWR9XG4gICAgICAgICAgICAgICAgICAgIGtleT17dGhpcy5zdGF0ZS5ncm91cFJvb21JZH0gLz47XG4gICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgIGNhc2UgUmlnaHRQYW5lbFBoYXNlcy5Ob3RpZmljYXRpb25QYW5lbDpcbiAgICAgICAgICAgICAgICBwYW5lbCA9IDxOb3RpZmljYXRpb25QYW5lbCBvbkNsb3NlPXt0aGlzLm9uQ2xvc2V9IC8+O1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICBjYXNlIFJpZ2h0UGFuZWxQaGFzZXMuRmlsZVBhbmVsOlxuICAgICAgICAgICAgICAgIHBhbmVsID0gPEZpbGVQYW5lbCByb29tSWQ9e3Jvb21JZH0gcmVzaXplTm90aWZpZXI9e3RoaXMucHJvcHMucmVzaXplTm90aWZpZXJ9IG9uQ2xvc2U9e3RoaXMub25DbG9zZX0gLz47XG4gICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgIGNhc2UgUmlnaHRQYW5lbFBoYXNlcy5Sb29tU3VtbWFyeTpcbiAgICAgICAgICAgICAgICBwYW5lbCA9IDxSb29tU3VtbWFyeUNhcmQgcm9vbT17dGhpcy5wcm9wcy5yb29tfSBvbkNsb3NlPXt0aGlzLm9uQ2xvc2V9IC8+O1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICBjYXNlIFJpZ2h0UGFuZWxQaGFzZXMuV2lkZ2V0OlxuICAgICAgICAgICAgICAgIHBhbmVsID0gPFdpZGdldENhcmQgcm9vbT17dGhpcy5wcm9wcy5yb29tfSB3aWRnZXRJZD17dGhpcy5zdGF0ZS53aWRnZXRJZH0gb25DbG9zZT17dGhpcy5vbkNsb3NlfSAvPjtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICA8YXNpZGUgY2xhc3NOYW1lPVwibXhfUmlnaHRQYW5lbCBkYXJrLXBhbmVsXCIgaWQ9XCJteF9SaWdodFBhbmVsXCI+XG4gICAgICAgICAgICAgICAgeyBwYW5lbCB9XG4gICAgICAgICAgICA8L2FzaWRlPlxuICAgICAgICApO1xuICAgIH1cbn1cbiJdfQ==