matrix-react-sdk
Version:
SDK for matrix.org using React
685 lines (573 loc) • 81.2 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 sdk = _interopRequireWildcard(require("../../../index"));
var _MatrixClientPeg = require("../../../MatrixClientPeg");
var _dispatcher = _interopRequireDefault(require("../../../dispatcher/dispatcher"));
var _classnames = _interopRequireDefault(require("classnames"));
var _languageHandler = require("../../../languageHandler");
var _SdkConfig = _interopRequireDefault(require("../../../SdkConfig"));
var _IdentityAuthClient = _interopRequireDefault(require("../../../IdentityAuthClient"));
var _CommunityPrototypeStore = require("../../../stores/CommunityPrototypeStore");
var _AsyncStore = require("../../../stores/AsyncStore");
var _replaceableComponent = require("../../../utils/replaceableComponent");
var _InviteReason = _interopRequireDefault(require("../elements/InviteReason"));
var _dec, _class, _class2, _temp;
const MessageCase = Object.freeze({
NotLoggedIn: "NotLoggedIn",
Joining: "Joining",
Loading: "Loading",
Rejecting: "Rejecting",
Kicked: "Kicked",
Banned: "Banned",
OtherThreePIDError: "OtherThreePIDError",
InvitedEmailNotFoundInAccount: "InvitedEmailNotFoundInAccount",
InvitedEmailNoIdentityServer: "InvitedEmailNoIdentityServer",
InvitedEmailMismatch: "InvitedEmailMismatch",
Invite: "Invite",
ViewingRoom: "ViewingRoom",
RoomNotFound: "RoomNotFound",
OtherError: "OtherError"
});
let RoomPreviewBar = (_dec = (0, _replaceableComponent.replaceableComponent)("views.rooms.RoomPreviewBar"), _dec(_class = (_temp = _class2 = class RoomPreviewBar extends _react.default.Component {
constructor(...args) {
super(...args);
(0, _defineProperty2.default)(this, "state", {
busy: false
});
(0, _defineProperty2.default)(this, "_onCommunityUpdate", roomId => {
if (this.props.room && this.props.room.roomId !== roomId) {
return;
}
this.forceUpdate(); // we have nothing to update
});
(0, _defineProperty2.default)(this, "onLoginClick", () => {
_dispatcher.default.dispatch({
action: 'start_login',
screenAfterLogin: this._makeScreenAfterLogin()
});
});
(0, _defineProperty2.default)(this, "onRegisterClick", () => {
_dispatcher.default.dispatch({
action: 'start_registration',
screenAfterLogin: this._makeScreenAfterLogin()
});
});
}
componentDidMount() {
this._checkInvitedEmail();
_CommunityPrototypeStore.CommunityPrototypeStore.instance.on(_AsyncStore.UPDATE_EVENT, this._onCommunityUpdate);
}
componentDidUpdate(prevProps, prevState) {
if (this.props.invitedEmail !== prevProps.invitedEmail || this.props.inviterName !== prevProps.inviterName) {
this._checkInvitedEmail();
}
}
componentWillUnmount() {
_CommunityPrototypeStore.CommunityPrototypeStore.instance.off(_AsyncStore.UPDATE_EVENT, this._onCommunityUpdate);
}
async _checkInvitedEmail() {
// If this is an invite and we've been told what email address was
// invited, fetch the user's account emails and discovery bindings so we
// can check them against the email that was invited.
if (this.props.inviterName && this.props.invitedEmail) {
this.setState({
busy: true
});
try {
// Gather the account 3PIDs
const account3pids = await _MatrixClientPeg.MatrixClientPeg.get().getThreePids();
this.setState({
accountEmails: account3pids.threepids.filter(b => b.medium === 'email').map(b => b.address)
}); // If we have an IS connected, use that to lookup the email and
// check the bound MXID.
if (!_MatrixClientPeg.MatrixClientPeg.get().getIdentityServerUrl()) {
this.setState({
busy: false
});
return;
}
const authClient = new _IdentityAuthClient.default();
const identityAccessToken = await authClient.getAccessToken();
const result = await _MatrixClientPeg.MatrixClientPeg.get().lookupThreePid('email', this.props.invitedEmail, undefined
/* callback */
, identityAccessToken);
this.setState({
invitedEmailMxid: result.mxid
});
} catch (err) {
this.setState({
threePidFetchError: err
});
}
this.setState({
busy: false
});
}
}
_getMessageCase() {
const isGuest = _MatrixClientPeg.MatrixClientPeg.get().isGuest();
if (isGuest) {
return MessageCase.NotLoggedIn;
}
const myMember = this._getMyMember();
if (myMember) {
if (myMember.isKicked()) {
return MessageCase.Kicked;
} else if (myMember.membership === "ban") {
return MessageCase.Banned;
}
}
if (this.props.joining) {
return MessageCase.Joining;
} else if (this.props.rejecting) {
return MessageCase.Rejecting;
} else if (this.props.loading || this.state.busy) {
return MessageCase.Loading;
}
if (this.props.inviterName) {
if (this.props.invitedEmail) {
if (this.state.threePidFetchError) {
return MessageCase.OtherThreePIDError;
} else if (this.state.accountEmails && !this.state.accountEmails.includes(this.props.invitedEmail)) {
return MessageCase.InvitedEmailNotFoundInAccount;
} else if (!_MatrixClientPeg.MatrixClientPeg.get().getIdentityServerUrl()) {
return MessageCase.InvitedEmailNoIdentityServer;
} else if (this.state.invitedEmailMxid != _MatrixClientPeg.MatrixClientPeg.get().getUserId()) {
return MessageCase.InvitedEmailMismatch;
}
}
return MessageCase.Invite;
} else if (this.props.error) {
if (this.props.error.errcode == 'M_NOT_FOUND') {
return MessageCase.RoomNotFound;
} else {
return MessageCase.OtherError;
}
} else {
return MessageCase.ViewingRoom;
}
}
_getKickOrBanInfo() {
const myMember = this._getMyMember();
if (!myMember) {
return {};
}
const kickerMember = this.props.room.currentState.getMember(myMember.events.member.getSender());
const memberName = kickerMember ? kickerMember.name : myMember.events.member.getSender();
const reason = myMember.events.member.getContent().reason;
return {
memberName,
reason
};
}
_joinRule() {
const room = this.props.room;
if (room) {
const joinRules = room.currentState.getStateEvents('m.room.join_rules', '');
if (joinRules) {
return joinRules.getContent().join_rule;
}
}
}
_communityProfile() {
if (this.props.room) return _CommunityPrototypeStore.CommunityPrototypeStore.instance.getInviteProfile(this.props.room.roomId);
return {
displayName: null,
avatarMxc: null
};
}
_roomName(atStart = false) {
let name = this.props.room ? this.props.room.name : this.props.roomAlias;
const profile = this._communityProfile();
if (profile.displayName) name = profile.displayName;
if (name) {
return name;
} else if (atStart) {
return (0, _languageHandler._t)("This room");
} else {
return (0, _languageHandler._t)("this room");
}
}
_getMyMember() {
return this.props.room && this.props.room.getMember(_MatrixClientPeg.MatrixClientPeg.get().getUserId());
}
_getInviteMember() {
const {
room
} = this.props;
if (!room) {
return;
}
const myUserId = _MatrixClientPeg.MatrixClientPeg.get().getUserId();
const inviteEvent = room.currentState.getMember(myUserId);
if (!inviteEvent) {
return;
}
const inviterUserId = inviteEvent.events.member.getSender();
return room.currentState.getMember(inviterUserId);
}
_isDMInvite() {
const myMember = this._getMyMember();
if (!myMember) {
return false;
}
const memberEvent = myMember.events.member;
const memberContent = memberEvent.getContent();
return memberContent.membership === "invite" && memberContent.is_direct;
}
_makeScreenAfterLogin() {
return {
screen: 'room',
params: {
email: this.props.invitedEmail,
signurl: this.props.signUrl,
room_name: this.props.oobData ? this.props.oobData.room_name : null,
room_avatar_url: this.props.oobData ? this.props.oobData.avatarUrl : null,
inviter_name: this.props.oobData ? this.props.oobData.inviterName : null
}
};
}
render() {
const brand = _SdkConfig.default.get().brand;
const Spinner = sdk.getComponent('elements.Spinner');
const AccessibleButton = sdk.getComponent('elements.AccessibleButton');
let showSpinner = false;
let title;
let subTitle;
let reasonElement;
let primaryActionHandler;
let primaryActionLabel;
let secondaryActionHandler;
let secondaryActionLabel;
let footer;
const extraComponents = [];
const messageCase = this._getMessageCase();
switch (messageCase) {
case MessageCase.Joining:
{
title = (0, _languageHandler._t)("Joining room …");
showSpinner = true;
break;
}
case MessageCase.Loading:
{
title = (0, _languageHandler._t)("Loading …");
showSpinner = true;
break;
}
case MessageCase.Rejecting:
{
title = (0, _languageHandler._t)("Rejecting invite …");
showSpinner = true;
break;
}
case MessageCase.NotLoggedIn:
{
title = (0, _languageHandler._t)("Join the conversation with an account");
primaryActionLabel = (0, _languageHandler._t)("Sign Up");
primaryActionHandler = this.onRegisterClick;
secondaryActionLabel = (0, _languageHandler._t)("Sign In");
secondaryActionHandler = this.onLoginClick;
if (this.props.previewLoading) {
footer = /*#__PURE__*/_react.default.createElement("div", null, /*#__PURE__*/_react.default.createElement(Spinner, {
w: 20,
h: 20
}), (0, _languageHandler._t)("Loading room preview"));
}
break;
}
case MessageCase.Kicked:
{
const {
memberName,
reason
} = this._getKickOrBanInfo();
title = (0, _languageHandler._t)("You were kicked from %(roomName)s by %(memberName)s", {
memberName,
roomName: this._roomName()
});
subTitle = reason ? (0, _languageHandler._t)("Reason: %(reason)s", {
reason
}) : null;
if (this._joinRule() === "invite") {
primaryActionLabel = (0, _languageHandler._t)("Forget this room");
primaryActionHandler = this.props.onForgetClick;
} else {
primaryActionLabel = (0, _languageHandler._t)("Re-join");
primaryActionHandler = this.props.onJoinClick;
secondaryActionLabel = (0, _languageHandler._t)("Forget this room");
secondaryActionHandler = this.props.onForgetClick;
}
break;
}
case MessageCase.Banned:
{
const {
memberName,
reason
} = this._getKickOrBanInfo();
title = (0, _languageHandler._t)("You were banned from %(roomName)s by %(memberName)s", {
memberName,
roomName: this._roomName()
});
subTitle = reason ? (0, _languageHandler._t)("Reason: %(reason)s", {
reason
}) : null;
primaryActionLabel = (0, _languageHandler._t)("Forget this room");
primaryActionHandler = this.props.onForgetClick;
break;
}
case MessageCase.OtherThreePIDError:
{
title = (0, _languageHandler._t)("Something went wrong with your invite to %(roomName)s", {
roomName: this._roomName()
});
const joinRule = this._joinRule();
const errCodeMessage = (0, _languageHandler._t)("An error (%(errcode)s) was returned while trying to validate your " + "invite. You could try to pass this information on to a room admin.", {
errcode: this.state.threePidFetchError.errcode || (0, _languageHandler._t)("unknown error code")
});
switch (joinRule) {
case "invite":
subTitle = [(0, _languageHandler._t)("You can only join it with a working invite."), errCodeMessage];
primaryActionLabel = (0, _languageHandler._t)("Try to join anyway");
primaryActionHandler = this.props.onJoinClick;
break;
case "public":
subTitle = (0, _languageHandler._t)("You can still join it because this is a public room.");
primaryActionLabel = (0, _languageHandler._t)("Join the discussion");
primaryActionHandler = this.props.onJoinClick;
break;
default:
subTitle = errCodeMessage;
primaryActionLabel = (0, _languageHandler._t)("Try to join anyway");
primaryActionHandler = this.props.onJoinClick;
break;
}
break;
}
case MessageCase.InvitedEmailNotFoundInAccount:
{
title = (0, _languageHandler._t)("This invite to %(roomName)s was sent to %(email)s which is not " + "associated with your account", {
roomName: this._roomName(),
email: this.props.invitedEmail
});
subTitle = (0, _languageHandler._t)("Link this email with your account in Settings to receive invites " + "directly in %(brand)s.", {
brand
});
primaryActionLabel = (0, _languageHandler._t)("Join the discussion");
primaryActionHandler = this.props.onJoinClick;
break;
}
case MessageCase.InvitedEmailNoIdentityServer:
{
title = (0, _languageHandler._t)("This invite to %(roomName)s was sent to %(email)s", {
roomName: this._roomName(),
email: this.props.invitedEmail
});
subTitle = (0, _languageHandler._t)("Use an identity server in Settings to receive invites directly in %(brand)s.", {
brand
});
primaryActionLabel = (0, _languageHandler._t)("Join the discussion");
primaryActionHandler = this.props.onJoinClick;
break;
}
case MessageCase.InvitedEmailMismatch:
{
title = (0, _languageHandler._t)("This invite to %(roomName)s was sent to %(email)s", {
roomName: this._roomName(),
email: this.props.invitedEmail
});
subTitle = (0, _languageHandler._t)("Share this email in Settings to receive invites directly in %(brand)s.", {
brand
});
primaryActionLabel = (0, _languageHandler._t)("Join the discussion");
primaryActionHandler = this.props.onJoinClick;
break;
}
case MessageCase.Invite:
{
const RoomAvatar = sdk.getComponent("views.avatars.RoomAvatar");
const oobData = Object.assign({}, this.props.oobData, {
avatarUrl: this._communityProfile().avatarMxc
});
const avatar = /*#__PURE__*/_react.default.createElement(RoomAvatar, {
room: this.props.room,
oobData: oobData
});
const inviteMember = this._getInviteMember();
let inviterElement;
if (inviteMember) {
inviterElement = /*#__PURE__*/_react.default.createElement("span", null, /*#__PURE__*/_react.default.createElement("span", {
className: "mx_RoomPreviewBar_inviter"
}, inviteMember.rawDisplayName), " (", inviteMember.userId, ")");
} else {
inviterElement = /*#__PURE__*/_react.default.createElement("span", {
className: "mx_RoomPreviewBar_inviter"
}, this.props.inviterName);
}
const isDM = this._isDMInvite();
if (isDM) {
title = (0, _languageHandler._t)("Do you want to chat with %(user)s?", {
user: inviteMember.name
});
subTitle = [avatar, (0, _languageHandler._t)("<userName/> wants to chat", {}, {
userName: () => inviterElement
})];
primaryActionLabel = (0, _languageHandler._t)("Start chatting");
} else {
title = (0, _languageHandler._t)("Do you want to join %(roomName)s?", {
roomName: this._roomName()
});
subTitle = [avatar, (0, _languageHandler._t)("<userName/> invited you", {}, {
userName: () => inviterElement
})];
primaryActionLabel = (0, _languageHandler._t)("Accept");
}
const myUserId = _MatrixClientPeg.MatrixClientPeg.get().getUserId();
const reason = this.props.room.currentState.getMember(myUserId).events.member.event.content.reason;
if (reason) {
reasonElement = /*#__PURE__*/_react.default.createElement(_InviteReason.default, {
reason: reason
});
}
primaryActionHandler = this.props.onJoinClick;
secondaryActionLabel = (0, _languageHandler._t)("Reject");
secondaryActionHandler = this.props.onRejectClick;
if (this.props.onRejectAndIgnoreClick) {
extraComponents.push( /*#__PURE__*/_react.default.createElement(AccessibleButton, {
kind: "secondary",
onClick: this.props.onRejectAndIgnoreClick,
key: "ignore"
}, (0, _languageHandler._t)("Reject & Ignore user")));
}
break;
}
case MessageCase.ViewingRoom:
{
if (this.props.canPreview) {
title = (0, _languageHandler._t)("You're previewing %(roomName)s. Want to join it?", {
roomName: this._roomName()
});
} else {
title = (0, _languageHandler._t)("%(roomName)s can't be previewed. Do you want to join it?", {
roomName: this._roomName(true)
});
}
primaryActionLabel = (0, _languageHandler._t)("Join the discussion");
primaryActionHandler = this.props.onJoinClick;
break;
}
case MessageCase.RoomNotFound:
{
title = (0, _languageHandler._t)("%(roomName)s does not exist.", {
roomName: this._roomName(true)
});
subTitle = (0, _languageHandler._t)("This room doesn't exist. Are you sure you're at the right place?");
break;
}
case MessageCase.OtherError:
{
title = (0, _languageHandler._t)("%(roomName)s is not accessible at this time.", {
roomName: this._roomName(true)
});
subTitle = [(0, _languageHandler._t)("Try again later, or ask a room admin to check if you have access."), (0, _languageHandler._t)("%(errcode)s was returned while trying to access the room. " + "If you think you're seeing this message in error, please " + "<issueLink>submit a bug report</issueLink>.", {
errcode: this.props.error.errcode
}, {
issueLink: label => /*#__PURE__*/_react.default.createElement("a", {
href: "https://github.com/vector-im/element-web/issues/new/choose",
target: "_blank",
rel: "noreferrer noopener"
}, label)
})];
break;
}
}
let subTitleElements;
if (subTitle) {
if (!Array.isArray(subTitle)) {
subTitle = [subTitle];
}
subTitleElements = subTitle.map((t, i) => /*#__PURE__*/_react.default.createElement("p", {
key: `subTitle${i}`
}, t));
}
let titleElement;
if (showSpinner) {
titleElement = /*#__PURE__*/_react.default.createElement("h3", {
className: "mx_RoomPreviewBar_spinnerTitle"
}, /*#__PURE__*/_react.default.createElement(Spinner, null), title);
} else {
titleElement = /*#__PURE__*/_react.default.createElement("h3", null, title);
}
let primaryButton;
if (primaryActionHandler) {
primaryButton = /*#__PURE__*/_react.default.createElement(AccessibleButton, {
kind: "primary",
onClick: primaryActionHandler
}, primaryActionLabel);
}
let secondaryButton;
if (secondaryActionHandler) {
secondaryButton = /*#__PURE__*/_react.default.createElement(AccessibleButton, {
kind: "secondary",
onClick: secondaryActionHandler
}, secondaryActionLabel);
}
const classes = (0, _classnames.default)("mx_RoomPreviewBar", "dark-panel", `mx_RoomPreviewBar_${messageCase}`, {
"mx_RoomPreviewBar_panel": this.props.canPreview,
"mx_RoomPreviewBar_dialog": !this.props.canPreview
});
return /*#__PURE__*/_react.default.createElement("div", {
className: classes
}, /*#__PURE__*/_react.default.createElement("div", {
className: "mx_RoomPreviewBar_message"
}, titleElement, subTitleElements), reasonElement, /*#__PURE__*/_react.default.createElement("div", {
className: "mx_RoomPreviewBar_actions"
}, secondaryButton, extraComponents, primaryButton), /*#__PURE__*/_react.default.createElement("div", {
className: "mx_RoomPreviewBar_footer"
}, footer));
}
}, (0, _defineProperty2.default)(_class2, "propTypes", {
onJoinClick: _propTypes.default.func,
onRejectClick: _propTypes.default.func,
onRejectAndIgnoreClick: _propTypes.default.func,
onForgetClick: _propTypes.default.func,
// if inviterName is specified, the preview bar will shown an invite to the room.
// You should also specify onRejectClick if specifiying inviterName
inviterName: _propTypes.default.string,
// If invited by 3rd party invite, the email address the invite was sent to
invitedEmail: _propTypes.default.string,
// For third party invites, information passed about the room out-of-band
oobData: _propTypes.default.object,
// For third party invites, a URL for a 3pid invite signing service
signUrl: _propTypes.default.string,
// A standard client/server API error object. If supplied, indicates that the
// caller was unable to fetch details about the room for the given reason.
error: _propTypes.default.object,
canPreview: _propTypes.default.bool,
previewLoading: _propTypes.default.bool,
room: _propTypes.default.object,
// When a spinner is present, a spinnerState can be specified to indicate the
// purpose of the spinner.
spinner: _propTypes.default.bool,
spinnerState: _propTypes.default.oneOf(["joining"]),
loading: _propTypes.default.bool,
joining: _propTypes.default.bool,
rejecting: _propTypes.default.bool,
// The alias that was used to access this room, if appropriate
// If given, this will be how the room is referred to (eg.
// in error messages).
roomAlias: _propTypes.default.string
}), (0, _defineProperty2.default)(_class2, "defaultProps", {
onJoinClick() {}
}), _temp)) || _class);
exports.default = RoomPreviewBar;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnRzL3ZpZXdzL3Jvb21zL1Jvb21QcmV2aWV3QmFyLmpzIl0sIm5hbWVzIjpbIk1lc3NhZ2VDYXNlIiwiT2JqZWN0IiwiZnJlZXplIiwiTm90TG9nZ2VkSW4iLCJKb2luaW5nIiwiTG9hZGluZyIsIlJlamVjdGluZyIsIktpY2tlZCIsIkJhbm5lZCIsIk90aGVyVGhyZWVQSURFcnJvciIsIkludml0ZWRFbWFpbE5vdEZvdW5kSW5BY2NvdW50IiwiSW52aXRlZEVtYWlsTm9JZGVudGl0eVNlcnZlciIsIkludml0ZWRFbWFpbE1pc21hdGNoIiwiSW52aXRlIiwiVmlld2luZ1Jvb20iLCJSb29tTm90Rm91bmQiLCJPdGhlckVycm9yIiwiUm9vbVByZXZpZXdCYXIiLCJSZWFjdCIsIkNvbXBvbmVudCIsImJ1c3kiLCJyb29tSWQiLCJwcm9wcyIsInJvb20iLCJmb3JjZVVwZGF0ZSIsImRpcyIsImRpc3BhdGNoIiwiYWN0aW9uIiwic2NyZWVuQWZ0ZXJMb2dpbiIsIl9tYWtlU2NyZWVuQWZ0ZXJMb2dpbiIsImNvbXBvbmVudERpZE1vdW50IiwiX2NoZWNrSW52aXRlZEVtYWlsIiwiQ29tbXVuaXR5UHJvdG90eXBlU3RvcmUiLCJpbnN0YW5jZSIsIm9uIiwiVVBEQVRFX0VWRU5UIiwiX29uQ29tbXVuaXR5VXBkYXRlIiwiY29tcG9uZW50RGlkVXBkYXRlIiwicHJldlByb3BzIiwicHJldlN0YXRlIiwiaW52aXRlZEVtYWlsIiwiaW52aXRlck5hbWUiLCJjb21wb25lbnRXaWxsVW5tb3VudCIsIm9mZiIsInNldFN0YXRlIiwiYWNjb3VudDNwaWRzIiwiTWF0cml4Q2xpZW50UGVnIiwiZ2V0IiwiZ2V0VGhyZWVQaWRzIiwiYWNjb3VudEVtYWlscyIsInRocmVlcGlkcyIsImZpbHRlciIsImIiLCJtZWRpdW0iLCJtYXAiLCJhZGRyZXNzIiwiZ2V0SWRlbnRpdHlTZXJ2ZXJVcmwiLCJhdXRoQ2xpZW50IiwiSWRlbnRpdHlBdXRoQ2xpZW50IiwiaWRlbnRpdHlBY2Nlc3NUb2tlbiIsImdldEFjY2Vzc1Rva2VuIiwicmVzdWx0IiwibG9va3VwVGhyZWVQaWQiLCJ1bmRlZmluZWQiLCJpbnZpdGVkRW1haWxNeGlkIiwibXhpZCIsImVyciIsInRocmVlUGlkRmV0Y2hFcnJvciIsIl9nZXRNZXNzYWdlQ2FzZSIsImlzR3Vlc3QiLCJteU1lbWJlciIsIl9nZXRNeU1lbWJlciIsImlzS2lja2VkIiwibWVtYmVyc2hpcCIsImpvaW5pbmciLCJyZWplY3RpbmciLCJsb2FkaW5nIiwic3RhdGUiLCJpbmNsdWRlcyIsImdldFVzZXJJZCIsImVycm9yIiwiZXJyY29kZSIsIl9nZXRLaWNrT3JCYW5JbmZvIiwia2lja2VyTWVtYmVyIiwiY3VycmVudFN0YXRlIiwiZ2V0TWVtYmVyIiwiZXZlbnRzIiwibWVtYmVyIiwiZ2V0U2VuZGVyIiwibWVtYmVyTmFtZSIsIm5hbWUiLCJyZWFzb24iLCJnZXRDb250ZW50IiwiX2pvaW5SdWxlIiwiam9pblJ1bGVzIiwiZ2V0U3RhdGVFdmVudHMiLCJqb2luX3J1bGUiLCJfY29tbXVuaXR5UHJvZmlsZSIsImdldEludml0ZVByb2ZpbGUiLCJkaXNwbGF5TmFtZSIsImF2YXRhck14YyIsIl9yb29tTmFtZSIsImF0U3RhcnQiLCJyb29tQWxpYXMiLCJwcm9maWxlIiwiX2dldEludml0ZU1lbWJlciIsIm15VXNlcklkIiwiaW52aXRlRXZlbnQiLCJpbnZpdGVyVXNlcklkIiwiX2lzRE1JbnZpdGUiLCJtZW1iZXJFdmVudCIsIm1lbWJlckNvbnRlbnQiLCJpc19kaXJlY3QiLCJzY3JlZW4iLCJwYXJhbXMiLCJlbWFpbCIsInNpZ251cmwiLCJzaWduVXJsIiwicm9vbV9uYW1lIiwib29iRGF0YSIsInJvb21fYXZhdGFyX3VybCIsImF2YXRhclVybCIsImludml0ZXJfbmFtZSIsInJlbmRlciIsImJyYW5kIiwiU2RrQ29uZmlnIiwiU3Bpbm5lciIsInNkayIsImdldENvbXBvbmVudCIsIkFjY2Vzc2libGVCdXR0b24iLCJzaG93U3Bpbm5lciIsInRpdGxlIiwic3ViVGl0bGUiLCJyZWFzb25FbGVtZW50IiwicHJpbWFyeUFjdGlvbkhhbmRsZXIiLCJwcmltYXJ5QWN0aW9uTGFiZWwiLCJzZWNvbmRhcnlBY3Rpb25IYW5kbGVyIiwic2Vjb25kYXJ5QWN0aW9uTGFiZWwiLCJmb290ZXIiLCJleHRyYUNvbXBvbmVudHMiLCJtZXNzYWdlQ2FzZSIsIm9uUmVnaXN0ZXJDbGljayIsIm9uTG9naW5DbGljayIsInByZXZpZXdMb2FkaW5nIiwicm9vbU5hbWUiLCJvbkZvcmdldENsaWNrIiwib25Kb2luQ2xpY2siLCJqb2luUnVsZSIsImVyckNvZGVNZXNzYWdlIiwiUm9vbUF2YXRhciIsImFzc2lnbiIsImF2YXRhciIsImludml0ZU1lbWJlciIsImludml0ZXJFbGVtZW50IiwicmF3RGlzcGxheU5hbWUiLCJ1c2VySWQiLCJpc0RNIiwidXNlciIsInVzZXJOYW1lIiwiZXZlbnQiLCJjb250ZW50Iiwib25SZWplY3RDbGljayIsIm9uUmVqZWN0QW5kSWdub3JlQ2xpY2siLCJwdXNoIiwiY2FuUHJldmlldyIsImlzc3VlTGluayIsImxhYmVsIiwic3ViVGl0bGVFbGVtZW50cyIsIkFycmF5IiwiaXNBcnJheSIsInQiLCJpIiwidGl0bGVFbGVtZW50IiwicHJpbWFyeUJ1dHRvbiIsInNlY29uZGFyeUJ1dHRvbiIsImNsYXNzZXMiLCJQcm9wVHlwZXMiLCJmdW5jIiwic3RyaW5nIiwib2JqZWN0IiwiYm9vbCIsInNwaW5uZXIiLCJzcGlubmVyU3RhdGUiLCJvbmVPZiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7OztBQWdCQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7OztBQUVBLE1BQU1BLFdBQVcsR0FBR0MsTUFBTSxDQUFDQyxNQUFQLENBQWM7QUFDOUJDLEVBQUFBLFdBQVcsRUFBRSxhQURpQjtBQUU5QkMsRUFBQUEsT0FBTyxFQUFFLFNB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SixtQkFBVUcsTUF4QkQ7QUEwQmY7QUFDQTtBQUNBRSxFQUFBQSxPQUFPLEVBQUVMLG1CQUFVSSxJQTVCSjtBQTZCZkUsRUFBQUEsWUFBWSxFQUFFTixtQkFBVU8sS0FBVixDQUFnQixDQUFDLFNBQUQsQ0FBaEIsQ0E3QkM7QUE4QmYzRyxFQUFBQSxPQUFPLEVBQUVvRyxtQkFBVUksSUE5Qko7QUErQmYxRyxFQUFBQSxPQUFPLEVBQUVzRyxtQkFBVUksSUEvQko7QUFnQ2Z6RyxFQUFBQSxTQUFTLEVBQUVxRyxtQkFBVUksSUFoQ047QUFpQ2Y7QUFDQTtBQUNBO0FBQ0E3RSxFQUFBQSxTQUFTLEVBQUV5RSxtQkFBVUU7QUFwQ04sQywwREF1Q0c7QUFDbEJoQyxFQUFBQSxXQUFXLEdBQUcsQ0FBRTs7QUFERSxDIiwic291cmNlc0NvbnRlbnQiOlsiLypcbkNvcHlyaWdodCAyMDE1LTIwMjEgVGhlIE1hdHJpeC5vcmcgRm91bmRhdGlvbiBDLkkuQy5cblxuTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbnlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbllvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuXG4gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cblVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbmRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbldJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxubGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qL1xuXG5pbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJztcbmltcG9ydCAqIGFzIHNkayBmcm9tICcuLi8uLi8uLi9pbmRleCc7XG5pbXBvcnQge01hdHJpeENsaWVudFBlZ30gZnJvbSAnLi4vLi4vLi4vTWF0cml4Q2xpZW50UGVnJztcbmltcG9ydCBkaXMgZnJvbSAnLi4vLi4vLi4vZGlzcGF0Y2hlci9kaXNwYXRjaGVyJztcbmltcG9ydCBjbGFzc05hbWVzIGZyb20gJ2NsYXNzbmFtZXMnO1xuaW1wb3J0IHsgX3QgfSBmcm9tICcuLi8uLi8uLi9sYW5ndWFnZUhhbmRsZXInO1xuaW1wb3J0IFNka0NvbmZpZyBmcm9tIFwiLi4vLi4vLi4vU2RrQ29uZmlnXCI7XG5pbXBvcnQgSWRlbnRpdHlBdXRoQ2xpZW50IGZyb20gJy4uLy4uLy4uL0lkZW50aXR5QXV0aENsaWVudCc7XG5pbXBvcnQge0NvbW11bml0eVByb3RvdHlwZVN0b3JlfSBmcm9tIFwiLi4vLi4vLi4vc3RvcmVzL0NvbW11bml0eVByb3RvdHlwZVN0b3JlXCI7XG5pbXBvcnQge1VQREFURV9FVkVOVH0gZnJvbSBcIi4uLy4uLy4uL3N0b3Jlcy9Bc3luY1N0b3JlXCI7XG5pbXBvcnQgeyByZXBsYWNlYWJsZUNvbXBvbmVudCB9IGZyb20gXCIuLi8uLi8uLi91dGlscy9yZXBsYWNlYWJsZUNvbXBvbmVudFwiO1xuaW1wb3J0IEludml0ZVJlYXNvbiBmcm9tIFwiLi4vZWxlbWVudHMvSW52aXRlUmVhc29uXCI7XG5cbmNvbnN0IE1lc3NhZ2VDYXNlID0gT2JqZWN0LmZyZWV6ZSh7XG4gICAgTm90TG9nZ2VkSW46IFwiT