matrix-react-sdk
Version:
SDK for matrix.org using React
375 lines (314 loc) • 38.9 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 sdk = _interopRequireWildcard(require("../../../index"));
var _dispatcher = _interopRequireDefault(require("../../../dispatcher/dispatcher"));
var _classnames = _interopRequireDefault(require("classnames"));
var _room = require("matrix-js-sdk/src/models/room");
var _roomMember = require("matrix-js-sdk/src/models/room-member");
var _propTypes = _interopRequireDefault(require("prop-types"));
var _MatrixClientPeg = require("../../../MatrixClientPeg");
var _FlairStore = _interopRequireDefault(require("../../../stores/FlairStore"));
var _Permalinks = require("../../../utils/permalinks/Permalinks");
var _MatrixClientContext = _interopRequireDefault(require("../../../contexts/MatrixClientContext"));
var _actions = require("../../../dispatcher/actions");
var _Media = require("../../../customisations/Media");
var _Tooltip = _interopRequireDefault(require("./Tooltip"));
var _replaceableComponent = require("../../../utils/replaceableComponent");
var _dec, _class, _class2, _temp;
let Pill = (_dec = (0, _replaceableComponent.replaceableComponent)("views.elements.Pill"), _dec(_class = (_temp = _class2 = class Pill extends _react.default.Component {
constructor(...args) {
super(...args);
(0, _defineProperty2.default)(this, "state", {
// ID/alias of the room/user
resourceId: null,
// Type of pill
pillType: null,
// The member related to the user pill
member: null,
// The group related to the group pill
group: null,
// The room related to the room pill
room: null,
// Is the user hovering the pill
hover: false
});
(0, _defineProperty2.default)(this, "onMouseOver", () => {
this.setState({
hover: true
});
});
(0, _defineProperty2.default)(this, "onMouseLeave", () => {
this.setState({
hover: false
});
});
(0, _defineProperty2.default)(this, "onUserPillClicked", () => {
_dispatcher.default.dispatch({
action: _actions.Action.ViewUser,
member: this.state.member
});
});
}
static roomNotifPos(text) {
return text.indexOf("@room");
}
static roomNotifLen() {
return "@room".length;
}
// TODO: [REACT-WARNING] Replace with appropriate lifecycle event
// eslint-disable-next-line camelcase
async UNSAFE_componentWillReceiveProps(nextProps) {
let resourceId;
let prefix;
if (nextProps.url) {
if (nextProps.inMessage) {
const parts = (0, _Permalinks.parseAppLocalLink)(nextProps.url);
resourceId = parts.primaryEntityId; // The room/user ID
prefix = parts.sigil; // The first character of prefix
} else {
resourceId = (0, _Permalinks.getPrimaryPermalinkEntity)(nextProps.url);
prefix = resourceId ? resourceId[0] : undefined;
}
}
const pillType = this.props.type || {
'@': Pill.TYPE_USER_MENTION,
'#': Pill.TYPE_ROOM_MENTION,
'!': Pill.TYPE_ROOM_MENTION,
'+': Pill.TYPE_GROUP_MENTION
}[prefix];
let member;
let group;
let room;
switch (pillType) {
case Pill.TYPE_AT_ROOM_MENTION:
{
room = nextProps.room;
}
break;
case Pill.TYPE_USER_MENTION:
{
const localMember = nextProps.room ? nextProps.room.getMember(resourceId) : undefined;
member = localMember;
if (!localMember) {
member = new _roomMember.RoomMember(null, resourceId);
this.doProfileLookup(resourceId, member);
}
}
break;
case Pill.TYPE_ROOM_MENTION:
{
const localRoom = resourceId[0] === '#' ? _MatrixClientPeg.MatrixClientPeg.get().getRooms().find(r => {
return r.getCanonicalAlias() === resourceId || r.getAltAliases().includes(resourceId);
}) : _MatrixClientPeg.MatrixClientPeg.get().getRoom(resourceId);
room = localRoom;
if (!localRoom) {// TODO: This would require a new API to resolve a room alias to
// a room avatar and name.
// this.doRoomProfileLookup(resourceId, member);
}
}
break;
case Pill.TYPE_GROUP_MENTION:
{
const cli = _MatrixClientPeg.MatrixClientPeg.get();
try {
group = await _FlairStore.default.getGroupProfileCached(cli, resourceId);
} catch (e) {
// if FlairStore failed, fall back to just groupId
group = {
groupId: resourceId,
avatarUrl: null,
name: null
};
}
}
}
this.setState({
resourceId,
pillType,
member,
group,
room
});
}
componentDidMount() {
this._unmounted = false;
this._matrixClient = _MatrixClientPeg.MatrixClientPeg.get(); // eslint-disable-next-line new-cap
this.UNSAFE_componentWillReceiveProps(this.props); // HACK: We shouldn't be calling lifecycle functions ourselves.
}
componentWillUnmount() {
this._unmounted = true;
}
doProfileLookup(userId, member) {
_MatrixClientPeg.MatrixClientPeg.get().getProfileInfo(userId).then(resp => {
if (this._unmounted) {
return;
}
member.name = resp.displayname;
member.rawDisplayName = resp.displayname;
member.events.member = {
getContent: () => {
return {
avatar_url: resp.avatar_url
};
},
getDirectionalContent: function () {
return this.getContent();
}
};
this.setState({
member
});
}).catch(err => {
console.error('Could not retrieve profile data for ' + userId + ':', err);
});
}
render() {
const BaseAvatar = sdk.getComponent('views.avatars.BaseAvatar');
const MemberAvatar = sdk.getComponent('avatars.MemberAvatar');
const RoomAvatar = sdk.getComponent('avatars.RoomAvatar');
const resource = this.state.resourceId;
let avatar = null;
let linkText = resource;
let pillClass;
let userId;
let href = this.props.url;
let onClick;
switch (this.state.pillType) {
case Pill.TYPE_AT_ROOM_MENTION:
{
const room = this.props.room;
if (room) {
linkText = "@room";
if (this.props.shouldShowPillAvatar) {
avatar = /*#__PURE__*/_react.default.createElement(RoomAvatar, {
room: room,
width: 16,
height: 16,
"aria-hidden": "true"
});
}
pillClass = 'mx_AtRoomPill';
}
}
break;
case Pill.TYPE_USER_MENTION:
{
// If this user is not a member of this room, default to the empty member
const member = this.state.member;
if (member) {
userId = member.userId;
member.rawDisplayName = member.rawDisplayName || '';
linkText = member.rawDisplayName;
if (this.props.shouldShowPillAvatar) {
avatar = /*#__PURE__*/_react.default.createElement(MemberAvatar, {
member: member,
width: 16,
height: 16,
"aria-hidden": "true"
});
}
pillClass = 'mx_UserPill';
href = null;
onClick = this.onUserPillClicked;
}
}
break;
case Pill.TYPE_ROOM_MENTION:
{
const room = this.state.room;
if (room) {
linkText = room.name || resource;
if (this.props.shouldShowPillAvatar) {
avatar = /*#__PURE__*/_react.default.createElement(RoomAvatar, {
room: room,
width: 16,
height: 16,
"aria-hidden": "true"
});
}
}
pillClass = 'mx_RoomPill';
}
break;
case Pill.TYPE_GROUP_MENTION:
{
if (this.state.group) {
const {
avatarUrl,
groupId,
name
} = this.state.group;
linkText = groupId;
if (this.props.shouldShowPillAvatar) {
avatar = /*#__PURE__*/_react.default.createElement(BaseAvatar, {
name: name || groupId,
width: 16,
height: 16,
"aria-hidden": "true",
url: avatarUrl ? (0, _Media.mediaFromMxc)(avatarUrl).getSquareThumbnailHttp(16) : null
});
}
pillClass = 'mx_GroupPill';
}
}
break;
}
const classes = (0, _classnames.default)("mx_Pill", pillClass, {
"mx_UserPill_me": userId === _MatrixClientPeg.MatrixClientPeg.get().getUserId(),
"mx_UserPill_selected": this.props.isSelected
});
if (this.state.pillType) {
const {
yOffset
} = this.props;
let tip;
if (this.state.hover && resource) {
tip = /*#__PURE__*/_react.default.createElement(_Tooltip.default, {
label: resource,
yOffset: yOffset
});
}
return /*#__PURE__*/_react.default.createElement(_MatrixClientContext.default.Provider, {
value: this._matrixClient
}, this.props.inMessage ? /*#__PURE__*/_react.default.createElement("a", {
className: classes,
href: href,
onClick: onClick,
"data-offset-key": this.props.offsetKey,
onMouseOver: this.onMouseOver,
onMouseLeave: this.onMouseLeave
}, avatar, linkText, tip) : /*#__PURE__*/_react.default.createElement("span", {
className: classes,
"data-offset-key": this.props.offsetKey,
onMouseOver: this.onMouseOver,
onMouseLeave: this.onMouseLeave
}, avatar, linkText, tip));
} else {
// Deliberately render nothing if the URL isn't recognised
return null;
}
}
}, (0, _defineProperty2.default)(_class2, "TYPE_USER_MENTION", 'TYPE_USER_MENTION'), (0, _defineProperty2.default)(_class2, "TYPE_ROOM_MENTION", 'TYPE_ROOM_MENTION'), (0, _defineProperty2.default)(_class2, "TYPE_GROUP_MENTION", 'TYPE_GROUP_MENTION'), (0, _defineProperty2.default)(_class2, "TYPE_AT_ROOM_MENTION", 'TYPE_AT_ROOM_MENTION'), (0, _defineProperty2.default)(_class2, "propTypes", {
// The Type of this Pill. If url is given, this is auto-detected.
type: _propTypes.default.string,
// The URL to pillify (no validation is done)
url: _propTypes.default.string,
// Whether the pill is in a message
inMessage: _propTypes.default.bool,
// The room in which this pill is being rendered
room: _propTypes.default.instanceOf(_room.Room),
// Whether to include an avatar in the pill
shouldShowPillAvatar: _propTypes.default.bool,
// Whether to render this pill as if it were highlit by a selection
isSelected: _propTypes.default.bool
}), _temp)) || _class);
var _default = Pill;
exports.default = _default;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnRzL3ZpZXdzL2VsZW1lbnRzL1BpbGwuanMiXSwibmFtZXMiOlsiUGlsbCIsIlJlYWN0IiwiQ29tcG9uZW50IiwicmVzb3VyY2VJZCIsInBpbGxUeXBlIiwibWVtYmVyIiwiZ3JvdXAiLCJyb29tIiwiaG92ZXIiLCJzZXRTdGF0ZSIsImRpcyIsImRpc3BhdGNoIiwiYWN0aW9uIiwiQWN0aW9uIiwiVmlld1VzZXIiLCJzdGF0ZSIsInJvb21Ob3RpZlBvcyIsInRleHQiLCJpbmRleE9mIiwicm9vbU5vdGlmTGVuIiwibGVuZ3RoIiwiVU5TQUZFX2NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMiLCJuZXh0UHJvcHMiLCJwcmVmaXgiLCJ1cmwiLCJpbk1lc3NhZ2UiLCJwYXJ0cyIsInByaW1hcnlFbnRpdHlJZCIsInNpZ2lsIiwidW5kZWZpbmVkIiwicHJvcHMiLCJ0eXBlIiwiVFlQRV9VU0VSX01FTlRJT04iLCJUWVBFX1JPT01fTUVOVElPTiIsIlRZUEVfR1JPVVBfTUVOVElPTiIsIlRZUEVfQVRfUk9PTV9NRU5USU9OIiwibG9jYWxNZW1iZXIiLCJnZXRNZW1iZXIiLCJSb29tTWVtYmVyIiwiZG9Qcm9maWxlTG9va3VwIiwibG9jYWxSb29tIiwiTWF0cml4Q2xpZW50UGVnIiwiZ2V0IiwiZ2V0Um9vbXMiLCJmaW5kIiwiciIsImdldENhbm9uaWNhbEFsaWFzIiwiZ2V0QWx0QWxpYXNlcyIsImluY2x1ZGVzIiwiZ2V0Um9vbSIsImNsaSIsIkZsYWlyU3RvcmUiLCJnZXRHcm91cFByb2ZpbGVDYWNoZWQiLCJlIiwiZ3JvdXBJZCIsImF2YXRhclVybCIsIm5hbWUiLCJjb21wb25lbnREaWRNb3VudCIsIl91bm1vdW50ZWQiLCJfbWF0cml4Q2xpZW50IiwiY29tcG9uZW50V2lsbFVubW91bnQiLCJ1c2VySWQiLCJnZXRQcm9maWxlSW5mbyIsInRoZW4iLCJyZXNwIiwiZGlzcGxheW5hbWUiLCJyYXdEaXNwbGF5TmFtZSIsImV2ZW50cyIsImdldENvbnRlbnQiLCJhdmF0YXJfdXJsIiwiZ2V0RGlyZWN0aW9uYWxDb250ZW50IiwiY2F0Y2giLCJlcnIiLCJjb25zb2xlIiwiZXJyb3IiLCJyZW5kZXIiLCJCYXNlQXZhdGFyIiwic2RrIiwiZ2V0Q29tcG9uZW50IiwiTWVtYmVyQXZhdGFyIiwiUm9vbUF2YXRhciIsInJlc291cmNlIiwiYXZhdGFyIiwibGlua1RleHQiLCJwaWxsQ2xhc3MiLCJocmVmIiwib25DbGljayIsInNob3VsZFNob3dQaWxsQXZhdGFyIiwib25Vc2VyUGlsbENsaWNrZWQiLCJnZXRTcXVhcmVUaHVtYm5haWxIdHRwIiwiY2xhc3NlcyIsImdldFVzZXJJZCIsImlzU2VsZWN0ZWQiLCJ5T2Zmc2V0IiwidGlwIiwib2Zmc2V0S2V5Iiwib25Nb3VzZU92ZXIiLCJvbk1vdXNlTGVhdmUiLCJQcm9wVHlwZXMiLCJzdHJpbmciLCJib29sIiwiaW5zdGFuY2VPZiIsIlJvb20iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7QUFlQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7OztJQUdNQSxJLFdBREwsZ0RBQXFCLHFCQUFyQixDLG1DQUFELE1BQ01BLElBRE4sU0FDbUJDLGVBQU1DLFNBRHpCLENBQ21DO0FBQUE7QUFBQTtBQUFBLGlEQTZCdkI7QUFDSjtBQUNBQyxNQUFBQSxVQUFVLEVBQUUsSUFGUjtBQUdKO0FBQ0FDLE1BQUFBLFFBQVEsRUFBRSxJQUpOO0FBTUo7QUFDQUMsTUFBQUEsTUFBTSxFQUFFLElBUEo7QUFRSjtBQUNBQyxNQUFBQSxLQUFLLEVBQUUsSUFUSDtBQVVKO0FBQ0FDLE1BQUFBLElBQUksRUFBRSxJQVhGO0FBWUo7QUFDQUMsTUFBQUEsS0FBSyxFQUFFO0FBYkgsS0E3QnVCO0FBQUEsdURBaUlqQixNQUFNO0FBQ2hCLFdBQUtDLFFBQUwsQ0FBYztBQUNWRCxRQUFBQSxLQUFLLEVB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QVROLEVBVU1XLEdBVk4sQ0FERixnQkFhRTtBQUNJLFFBQUEsU0FBUyxFQUFFSixPQURmO0FBRUksMkJBQWlCLEtBQUs1RCxLQUFMLENBQVdpRSxTQUZoQztBQUdJLFFBQUEsV0FBVyxFQUFFLEtBQUtDLFdBSHRCO0FBSUksUUFBQSxZQUFZLEVBQUUsS0FBS0M7QUFKdkIsU0FNTWYsTUFOTixFQU9NQyxRQVBOLEVBUU1XLEdBUk4sQ0FkRCxDQUFQO0FBeUJILEtBakNELE1BaUNPO0FBQ0g7QUFDQSxhQUFPLElBQVA7QUFDSDtBQUNKOztBQXZSOEIsQyw4REFTSixtQiwrREFDQSxtQixnRUFDQyxvQixrRUFDRSxzQix1REFFWDtBQUNmO0FBQ0EvRCxFQUFBQSxJQUFJLEVBQUVtRSxtQkFBVUMsTUFGRDtBQUdmO0FBQ0EzRSxFQUFBQSxHQUFHLEVBQUUwRSxtQkFBVUMsTUFKQTtBQUtmO0FBQ0ExRSxFQUFBQSxTQUFTLEVBQUV5RSxtQkFBVUUsSUFOTjtBQU9mO0FBQ0E3RixFQUFBQSxJQUFJLEVBQUUyRixtQkFBVUcsVUFBVixDQUFxQkMsVUFBckIsQ0FSUztBQVNmO0FBQ0FmLEVBQUFBLG9CQUFvQixFQUFFVyxtQkFBVUUsSUFWakI7QUFXZjtBQUNBUixFQUFBQSxVQUFVLEVBQUVNLG1CQUFVRTtBQVpQLEM7ZUE0UVJwRyxJIiwic291cmNlc0NvbnRlbnQiOlsiLypcbkNvcHlyaWdodCAyMDE3IC0gMjAxOSwgMjAyMSBUaGUgTWF0cml4Lm9yZyBGb3VuZGF0aW9uIEMuSS5DLlxuXG5MaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xueW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG5cbiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcblxuVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG5TZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG5saW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiovXG5pbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0ICogYXMgc2RrIGZyb20gJy4uLy4uLy4uL2luZGV4JztcbmltcG9ydCBkaXMgZnJvbSAnLi4vLi4vLi4vZGlzcGF0Y2hlci9kaXNwYXRjaGVyJztcbmltcG9ydCBjbGFzc05hbWVzIGZyb20gJ2NsYXNzbmFtZXMnO1xuaW1wb3J0IHsgUm9vbSB9IGZyb20gJ21hdHJpeC1qcy1zZGsvc3JjL21vZGVscy9yb29tJztcbmltcG9ydCB7IFJvb21NZW1iZXIgfSBmcm9tICdtYXRyaXgtanMtc2RrL3NyYy9tb2RlbHMvcm9vbS1tZW1iZXInO1xuaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJztcbmltcG9ydCB7TWF0cml4Q2xpZW50UGVnfSBmcm9tICcuLi8uLi8uLi9NYXRyaXhDbGllbnRQZWcnO1xuaW1wb3J0IEZsYWlyU3RvcmUgZnJvbSBcIi4uLy4uLy4uL3N0b3Jlcy9GbGFpclN0b3JlXCI7XG5pbXBvcnQge2dldFByaW1hcnlQZXJtYWxpbmtFbnRpdHksIHBhcnNlQXBwTG9jYWxMaW5rfSBmcm9tIFwiLi4vLi4vLi4vdXRpbHMvcGVybWFsaW5rcy9QZXJtYWxpbmtzXCI7XG5pbXBvcnQgTWF0cml4Q2xpZW50Q29udGV4dCBmcm9tIFwiLi4vLi4vLi4vY29udGV4dHMvTWF0cml4Q2xpZW50Q29udGV4dFwiO1xuaW1wb3J0IHtBY3Rpb259IGZyb20gXCIuLi8uLi8uLi9kaXNwYXRjaGVyL2FjdGlvbnNcIjtcbmltcG9ydCB7bWVkaWFGcm9tTXhjfSBmcm9tIFwiLi4vLi4vLi4vY3VzdG9taXNhdGlvbnMvTWVkaWFcIjtcbmltcG9ydCBUb29sdGlwIGZyb20gJy4vVG9vbHRpcCc7XG5pbXBvcnQge3JlcGxhY2VhYmxlQ29tcG9uZW50fSBmcm9tIFwiLi4vLi4vLi4vdXRpbHMvcmVwbGFjZWFibGVDb21wb25lbnRcIjtcblxuQHJlcGxhY2VhYmxlQ29tcG9uZW50KFwidmlld3MuZWxlbWVudHMuUGlsbFwiKVxuY2xhc3MgUGlsbCBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XG4gICAgc3RhdGljIHJvb21Ob3RpZlBvcyh0ZXh0KSB7XG4gICAgICAgIHJldHVybiB0ZXh0LmluZGV4T2YoXCJAcm9vbVwiKTtcbiAgICB9XG5cbiAgICBzdGF0aWMgcm9vbU5vdGlmTGVuKCkge1xuICAgICAgICByZXR1cm4gXCJAcm9vbVwiLmxlbmd0aDtcbiAgICB9XG5cbiAgICBzdGF0aWMgVFlQRV9VU0VSX01FTlRJT04gPSAnVFlQRV9VU0VSX01FTlRJT04nO1xuICAgIHN0YXRpYyBUWVBFX1JPT01fTUVOVElPTiA9ICdUWVBFX1JPT01fTUVOVElPTic7XG4gICAgc3RhdGljIFRZUEVfR1JPVVBfTUVOVElPTiA9ICdUWVBFX0dST1VQX01FTlRJT04nO1xuICAgIHN0YXRpYyBUWVBFX0FUX1JPT01fTUVOVElPTiA9ICdUWVBFX0FUX1JPT01fTUVOVElPTic7IC8vICdAcm9vbScgbWVudGlvblxuXG4gICAgc3RhdGljIHByb3BUeXBlcyA9IHtcbiAgICAgICAgLy8gVGhlIFR5cGUgb2YgdGhpcyBQaWxsLiBJZiB1cmwgaXMgZ2l2ZW4sIHRoaXMgaXMgYXV0by1kZXRlY3RlZC5cbiAgICAgICAgdHlwZTogUHJvcFR5cGVzLnN0cmluZyxcbiAgICAgICAgLy8gVGhlIFVSTCB0byBwaWxsaWZ5IChubyB2YWxpZGF0aW9uIGlzIGRvbmUpXG4gICAgICAgIHVybDogUHJvcFR5cGVzLnN0cmluZyxcbiAgICAgICAgLy8gV2hldGhlciB0aGUgcGlsbCBpcyBpbiBhIG1lc3NhZ2VcbiAgICAgICAgaW5NZXNzYWdlOiBQcm9wVHlwZXMuYm9vbCxcbiAgICAgICAgLy8gVGhlIHJvb20gaW4gd2hpY2ggdGhpcyBwaWxsIGlzIGJlaW5nIHJlbmRlcmVkXG4gICAgICAgIHJvb206IFByb3BUeXBlcy5pbnN0YW5jZU9mKFJvb20pLFxuICAgICAgICAvLyBXaGV0aGVyIHRvIGluY2x1ZGUgYW4gYXZhdGFyIGluIHRoZSBwaWxsXG4gICAgICAgIHNob3VsZFNob3dQaWxsQXZhdGFyOiBQcm9wVHlwZXMuYm9vbCxcbiAgICAgICAgLy8gV2hldGhlciB0byByZW5kZXIgdGhpcyBwaWxsIGFzIGlmIGl0IHdlcmUgaGlnaGxpdCBieSBhIHNlbGVjdGlvblxuICAgICAgICBpc1NlbGVjdGVkOiBQcm9wVHlwZXMuYm9vbCxcbiAgICB9O1xuXG4gICAgc3RhdGUgPSB7XG4gICAgICAgIC8vIElEL2FsaWFzIG9mIHRoZSByb29tL3VzZXJcbiAgICAgICAgcmVzb3VyY2VJZDogbnVsbCxcbiAgICAgICAgLy8gVHlwZSBvZiBwaWxsXG4gICAgICAgIHBpbGxUeXBlOiBudWxsLFxuXG4gICAgICAgIC8vIFRoZSBtZW1iZXIgcmVsYXRlZCB0byB0aGUgdXNlciBwaWxsXG4gICAgICAgIG1lbWJlcjogbnVsbCxcbiAgICAgICAgLy8gVGhlIGdyb3VwIHJlbGF0ZWQgdG8gdGhlIGdyb3VwIHBpbGxcbiAgICAgICAgZ3JvdXA6IG51bGwsXG4gICAgICAgIC8vIFRoZSByb29tIHJlbGF0ZWQgdG8gdGhlIHJvb20gcGlsbFxuICAgICAgICByb29tOiBudWxsLFxuICAgICAgICAvLyBJcyB0aGUgdXNlciBob3ZlcmluZyB0aGUgcGlsbFxuICAgICAgICBob3ZlcjogZmFsc2UsXG4gICAgfTtcblxuICAgIC8vIFRPRE86IFtSRUFDVC1XQVJOSU5HXSBSZXBsYWNlIHdpdGggYXBwcm9wcmlhdGUgbGlmZWN5Y2xlIGV2ZW50XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGNhbWVsY2FzZVxuICAgIGFzeW5jIFVOU0FGRV9jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzKG5leHRQcm9wcykge1xuICAgICAgICBsZXQgcmVzb3VyY2VJZDtcbiAgICAgICAgbGV0IHByZWZpeDtcblxuICAgICAgICBpZiAobmV4dFByb3BzLnVybCkge1xuICAgICAgICAgICAgaWYgKG5leHRQcm9wcy5pbk1lc3NhZ2UpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBwYXJ0cyA9IHBhcnNlQXBwTG9jYWxMaW5rKG5leHRQcm9wcy51cmwpO1xuICAgICAgICAgICAgICAgIHJlc291cmNlSWQgPSBwYXJ0cy5wcmltYXJ5RW50aXR5SWQ7IC8vIFRoZSByb29tL3VzZXIgSURcbiAgICAgICAgICAgICAgICBwcmVmaXggPSBwYXJ0cy5zaWdpbDsgLy8gVGhlIGZpcnN0IGNoYXJhY3RlciBvZiBwcmVmaXhcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmVzb3VyY2VJZCA9IGdldFByaW1hcnlQZXJtYWxpbmtFbnRpdHkobmV4dFByb3BzLnVybCk7XG4gICAgICAgICAgICAgICAgcHJlZml4ID0gcmVzb3VyY2VJZCA/IHJlc291cmNlSWRbMF0gOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBwaWxsVHlwZSA9IHRoaXMucHJvcHMudHlwZSB8fCB7XG4gICAgICAgICAgICAnQCc6IFBpbGwuVFlQRV9VU0VSX01FTlRJT04sXG4gICAgICAgICAgICAnIyc6IFBpbGwuVFlQRV9ST09NX01FTlRJT04sXG4gICAgICAgICAgICAnISc6IFBpbGwuVFlQRV9ST09NX01FTlRJT04sXG4gICAgICAgICAgICAnKyc6IFBpbGwuVFlQRV9HUk9VUF9NRU5USU9OLFxuICAgICAgICB9W3ByZWZpeF07XG5cbiAgICAgICAgbGV0IG1lbWJlcjtcbiAgICAgICAgbGV0IGdyb3VwO1xuICAgICAgICBsZXQgcm9vbTtcbiAgICAgICAgc3dpdGNoIChwaWxsVHlwZSkge1xuICAgICAgICAgICAgY2FzZSBQaWxsLlRZUEVfQVRfUk9PTV9NRU5USU9OOiB7XG4gICAgICAgICAgICAgICAgcm9vbSA9IG5leHRQcm9wcy5yb29tO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBQaWxsLlRZUEVfVVNFUl9NRU5USU9OOiB7XG4gICAgICAgICAgICAgICAgY29uc3QgbG9jYWxNZW1iZXIgPSBuZXh0UHJvcHMucm9vbSA/IG5leHRQcm9wcy5yb29tLmdldE1lbWJlcihyZXNvdXJjZUlkKSA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICBtZW1iZXIgPSBsb2NhbE1lbWJlcjtcbiAgICAgICAgICAgICAgICBpZiAoIWxvY2FsTWVtYmVyKSB7XG4gICAgICAgICAgICAgICAgICAgIG1lbWJlciA9IG5ldyBSb29tTWVtYmVyKG51bGwsIHJlc291cmNlSWQpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRvUHJvZmlsZUxvb2t1cChyZXNvdXJjZUlkLCBtZW1iZXIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgUGlsbC5UWVBFX1JPT01fTUVOVElPTjoge1xuICAgICAgICAgICAgICAgIGNvbnN0IGxvY2FsUm9vbSA9IHJlc291cmNlSWRbMF0gPT09ICcjJyA/XG4gICAgICAgICAgICAgICAgICAgIE1hdHJpeENsaWVudFBlZy5nZXQoKS5nZXRSb29tcygpLmZpbmQoKHIpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByLmdldENhbm9uaWNhbEFsaWFzKCkgPT09IHJlc291cmNlSWQgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByLmdldEFsdEFsaWFzZXMoKS5pbmNsdWRlcyhyZXNvdXJjZUlkKTtcbiAgICAgICAgICAgICAgICAgICAgfSkgOiBNYXRyaXhDbGllbnRQZWcuZ2V0KCkuZ2V0Um9vbShyZXNvdXJjZUlkKTtcbiAgICAgICAgICAgICAgICByb29tID0gbG9jYWxSb29tO1xuICAgICAgICAgICAgICAgIGlmICghbG9jYWxSb29tKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IFRoaXMgd291bGQgcmVxdWlyZSBhIG5ldyBBUEkgdG8gcmVzb2x2ZSBhIHJvb20gYWxpYXMgdG9cbiAgICAgICAgICAgICAgICAgICAgLy8gYSByb29tIGF2YXRhciBhbmQgbmFtZS5cbiAgICAgICAgICAgICAgICAgICAgLy8gdGhpcy5kb1Jvb21Qcm9maWxlTG9va3VwKHJlc291cmNlSWQsIG1lbWJlcik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBQaWxsLlRZUEVfR1JPVVBfTUVOVElPTjoge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNsaSA9IE1hdHJpeENsaWVudFBlZy5nZXQoKTtcblxuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGdyb3VwID0gYXdhaXQgRmxhaXJTdG9yZS5nZXRHcm91cFByb2ZpbGVDYWNoZWQoY2xpLCByZXNvdXJjZUlkKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7IC8vIGlmIEZsYWlyU3RvcmUgZmFpbGVkLCBmYWxsIGJhY2sgdG8ganVzdCBncm91cElkXG4gICAgICAgICAgICAgICAgICAgIGdyb3VwID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXBJZDogcmVzb3VyY2VJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGF2YXRhclVybDogbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe3Jlc291cmNlSWQsIHBpbGxUeXBlLCBtZW1iZXIsIGdyb3VwLCByb29tfSk7XG4gICAgfVxuXG4gICAgY29tcG9uZW50RGlkTW91bnQoKSB7XG4gICAgICAgIHRoaXMuX3VubW91bnRlZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLl9tYXRyaXhDbGllbnQgPSBNYXRyaXhDbGllbnRQZWcuZ2V0KCk7XG5cbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5ldy1jYXBcbiAgICAgICAgdGhpcy5VTlNBRkVfY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyh0aGlzLnByb3BzKTsgLy8gSEFDSzogV2Ugc2hvdWxkbid0IGJlIGNhbGxpbmcgbGlmZWN5Y2xlIGZ1bmN0aW9ucyBvdXJzZWx2ZXMuXG4gICAgfVxuXG4gICAgY29tcG9uZW50V2lsbFVubW91bnQoKSB7XG4gICAgICAgIHRoaXMuX3VubW91bnRlZCA9IHRydWU7XG4gICAgfVxuXG4gICAgb25Nb3VzZU92ZXIgPSAoKSA9PiB7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICAgICAgaG92ZXI6IHRydWUsXG4gICAgICAgIH0pO1xuICAgIH07XG5cbiAgICBvbk1vdXNlTGVhdmUgPSAoKSA9PiB7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICAgICAgaG92ZXI6IGZhbHNlLFxuICAgICAgICB9KTtcbiAgICB9O1xuXG4gICAgZG9Qcm9maWxlTG9va3VwKHVzZXJJZCwgbWVtYmVyKSB7XG4gICAgICAgIE1hdHJpeENsaWVudFBlZy5nZXQoKS5nZXRQcm9maWxlSW5mbyh1c2VySWQpLnRoZW4oKHJlc3ApID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLl91bm1vdW50ZWQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBtZW1iZXIubmFtZSA9IHJlc3AuZGlzcGxheW5hbWU7XG4gICAgICAgICAgICBtZW1iZXIucmF3RGlzcGxheU5hbWUgPSByZXNwLmRpc3BsYXluYW1lO1xuICAgICAgICAgICAgbWVtYmVyLmV2ZW50cy5tZW1iZXIgPSB7XG4gICAgICAgICAgICAgICAgZ2V0Q29udGVudDogKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4ge2F2YXRhcl91cmw6IHJlc3AuYXZhdGFyX3VybH07XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBnZXREaXJlY3Rpb25hbENvbnRlbnQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5nZXRDb250ZW50KCk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICB0aGlzLnNldFN0YXRlKHttZW1iZXJ9KTtcbiAgICAgICAgfSkuY2F0Y2goKGVycikgPT4ge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcignQ291bGQgbm90IHJldHJpZXZlIHByb2ZpbGUgZGF0YSBmb3IgJyArIHVzZXJJZCArICc6JywgZXJyKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgb25Vc2VyUGlsbENsaWNrZWQgPSAoKSA9PiB7XG4gICAgICAgIGRpcy5kaXNwYXRjaCh7XG4gICAgICAgICAgICBhY3Rpb246IEFjdGlvbi5WaWV3VXNlcixcbiAgICAgICAgICAgIG1lbWJlcjogdGhpcy5zdGF0ZS5tZW1iZXIsXG4gICAgICAgIH0pO1xuICAgIH07XG5cbiAgICByZW5kZXIoKSB7XG4gICAgICAgIGNvbnN0IEJhc2VBdmF0YXIgPSBzZGsuZ2V0Q29tcG9uZW50KCd2aWV3cy5hdmF0YXJzLkJhc2VBdmF0YXInKTtcbiAgICAgICAgY29uc3QgTWVtYmVyQXZhdGFyID0gc2RrLmdldENvbXBvbmVudCgnYXZhdGFycy5NZW1iZXJBdmF0YXInKTtcbiAgICAgICAgY29uc3QgUm9vbUF2YXRhciA9IHNkay5nZXRDb21wb25lbnQoJ2F2YXRhcnMuUm9vbUF2YXRhcicpO1xuXG4gICAgICAgIGNvbnN0IHJlc291cmNlID0gdGhpcy5zdGF0ZS5yZXNvdXJjZUlkO1xuXG4gICAgICAgIGxldCBhdmF0YXIgPSBudWxsO1xuICAgICAgICBsZXQgbGlua1RleHQgPSByZXNvdXJjZTtcbiAgICAgICAgbGV0IHBpbGxDbGFzcztcbiAgICAgICAgbGV0IHVzZXJJZDtcbiAgICAgICAgbGV0IGhyZWYgPSB0aGlzLnByb3BzLnVybDtcbiAgICAgICAgbGV0IG9uQ2xpY2s7XG4gICAgICAgIHN3aXRjaCAodGhpcy5zdGF0ZS5waWxsVHlwZSkge1xuICAgICAgICAgICAgY2FzZSBQaWxsLlRZUEVfQVRfUk9PTV9NRU5USU9OOiB7XG4gICAgICAgICAgICAgICAgY29uc3Qgcm9vbSA9IHRoaXMucHJvcHMucm9vbTtcbiAgICAgICAgICAgICAgICBpZiAocm9vbSkge1xuICAgICAgICAgICAgICAgICAgICBsaW5rVGV4dCA9IFwiQHJvb21cIjtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMucHJvcHMuc2hvdWxkU2hvd1BpbGxBdmF0YXIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGF2YXRhciA9IDxSb29tQXZhdGFyIHJvb209e3Jvb219IHdpZHRoPXsxNn0gaGVpZ2h0PXsxNn0gYXJpYS1oaWRkZW49XCJ0cnVlXCIgLz47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcGlsbENsYXNzID0gJ214X0F0Um9vbVBpbGwnO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgUGlsbC5UWVBFX1VTRVJfTUVOVElPTjoge1xuICAgICAgICAgICAgICAgIC8vIElmIHRoaXMgdXNlciBpcyBub3QgYSBtZW1iZXIgb2YgdGhpcyByb29tLCBkZWZhdWx0IHRvIHRoZSBlbXB0eSBtZW1iZXJcbiAgICAgICAgICAgICAgICBjb25zdCBtZW1iZXIgPSB0aGlzLnN0YXRlLm1lbWJlcjtcbiAgICAgICAgICAgICAgICBpZiAobWVtYmVyKSB7XG4gICAgICAgICAgICAgICAgICAgIHVzZXJJZCA9IG1lbWJlci51c2VySWQ7XG4gICAgICAgICAgICAgICAgICAgIG1lbWJlci5yYXdEaXNwbGF5TmFtZSA9IG1lbWJlci5yYXdEaXNwbGF5TmFtZSB8fCAnJztcbiAgICAgICAgICAgICAgICAgICAgbGlua1RleHQgPSBtZW1iZXIucmF3RGlzcGxheU5hbWU7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnByb3BzLnNob3VsZFNob3dQaWxsQXZhdGFyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhdmF0YXIgPSA8TWVtYmVyQXZhdGFyIG1lbWJlcj17bWVtYmVyfSB3aWR0aD17MTZ9IGhlaWdodD17MTZ9IGFyaWEtaGlkZGVuPVwidHJ1ZVwiIC8+O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHBpbGxDbGFzcyA9ICdteF9Vc2VyUGlsbCc7XG4gICAgICAgICAgICAgICAgICAgIGhyZWYgPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICBvbkNsaWNrID0gdGhpcy5vblVzZXJQaWxsQ2xpY2tlZDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFBpbGwuVFlQRV9ST09NX01FTlRJT046IHtcbiAgICAgICAgICAgICAgICBjb25zdCByb29tID0gdGhpcy5zdGF0ZS5yb29tO1xuICAgICAgICAgICAgICAgIGlmIChyb29tKSB7XG4gICAgICAgICAgICAgICAgICAgIGxpbmtUZXh0ID0gcm9vbS5uYW1lIHx8IHJlc291cmNlO1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5wcm9wcy5zaG91bGRTaG93UGlsbEF2YXRhcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgYXZhdGFyID0gPFJvb21BdmF0YXIgcm9vbT17cm9vbX0gd2lkdGg9ezE2fSBoZWlnaHQ9ezE2fSBhcmlhLWhpZGRlbj1cInRydWVcIiAvPjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBwaWxsQ2xhc3MgPSAnbXhfUm9vbVBpbGwnO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBQaWxsLlRZUEVfR1JPVVBfTUVOVElPTjoge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnN0YXRlLmdyb3VwKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHthdmF0YXJVcmwsIGdyb3VwSWQsIG5hbWV9ID0gdGhpcy5zdGF0ZS5ncm91cDtcblxuICAgICAgICAgICAgICAgICAgICBsaW5rVGV4dCA9IGdyb3VwSWQ7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnByb3BzLnNob3VsZFNob3dQaWxsQXZhdGFyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhdmF0YXIgPSA8QmFzZUF2YXRhclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9e25hbWUgfHwgZ3JvdXBJZH0gd2lkdGg9ezE2fSBoZWlnaHQ9ezE2fSBhcmlhLWhpZGRlbj1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVybD17YXZhdGFyVXJsID8gbWVkaWFGcm9tTXhjKGF2YXRhclVybCkuZ2V0U3F1YXJlVGh1bWJuYWlsSHR0cCgxNikgOiBudWxsfSAvPjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBwaWxsQ2xhc3MgPSAnbXhfR3JvdXBQaWxsJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjbGFzc2VzID0gY2xhc3NOYW1lcyhcIm14X1BpbGxcIiwgcGlsbENsYXNzLCB7XG4gICAgICAgICAgICBcIm14X1VzZXJQaWxsX21lXCI6IHVzZXJJZCA9PT0gTWF0cml4Q2xpZW50UGVnLmdldCgpLmdldFVzZXJJZCgpLFxuICAgICAgICAgICAgXCJteF9Vc2VyUGlsbF9zZWxlY3RlZFwiOiB0aGlzLnByb3BzLmlzU2VsZWN0ZWQsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmICh0aGlzLnN0YXRlLnBpbGxUeXBlKSB7XG4gICAgICAgICAgICBjb25zdCB7eU9mZnNldH0gPSB0aGlzLnByb3BzO1xuXG4gICAgICAgICAgICBsZXQgdGlwO1xuICAgICAgICAgICAgaWYgKHRoaXMuc3RhdGUuaG92ZXIgJiYgcmVzb3VyY2UpIHtcbiAgICAgICAgICAgICAgICB0aXAgPSA8VG9vbHRpcCBsYWJlbD17cmVzb3VyY2V9IHlPZmZzZXQ9e3lPZmZzZXR9IC8+O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gPE1hdHJpeENsaWVudENvbnRleHQuUHJvdmlkZXIgdmFsdWU9e3RoaXMuX21hdHJpeENsaWVudH0+XG4gICAgICAgICAgICAgICAgeyB0aGlzLnByb3BzLmluTWVzc2FnZSA/XG4gICAgICAgICAgICAgICAgICAgIDxhXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9e2NsYXNzZXN9XG4gICAgICAgICAgICAgICAgICAgICAgICBocmVmPXtocmVmfVxuICAgICAgICAgICAgICAgICAgICAgICAgb25DbGljaz17b25DbGlja31cbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtb2Zmc2V0LWtleT17dGhpcy5wcm9wcy5vZmZzZXRLZXl9XG4gICAgICAgICAgICAgICAgICAgICAgICBvbk1vdXNlT3Zlcj17dGhpcy5vbk1vdXNlT3Zlcn1cbiAgICAgICAgICAgICAgICAgICAgICAgIG9uTW91c2VMZWF2ZT17dGhpcy5vbk1vdXNlTGVhdmV9XG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIHsgYXZhdGFyIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHsgbGlua1RleHQgfVxuICAgICAgICAgICAgICAgICAgICAgICAgeyB0aXAgfVxuICAgICAgICAgICAgICAgICAgICA8L2E+IDpcbiAgICAgICAgICAgICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT17Y2xhc3Nlc31cbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtb2Zmc2V0LWtleT17dGhpcy5wcm9wcy5vZmZzZXRLZXl9XG4gICAgICAgICAgICAgICAgICAgICAgICBvbk1vdXNlT3Zlcj17dGhpcy5vbk1vdXNlT3Zlcn1cbiAgICAgICAgICAgICAgICAgICAgICAgIG9uTW91c2VMZWF2ZT17dGhpcy5vbk1vdXNlTGVhdmV9XG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIHsgYXZhdGFyIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHsgbGlua1RleHQgfVxuICAgICAgICAgICAgICAgICAgICAgICAgeyB0aXAgfVxuICAgICAgICAgICAgICAgICAgICA8L3NwYW4+IH1cbiAgICAgICAgICAgIDwvTWF0cml4Q2xpZW50Q29udGV4dC5Qcm92aWRlcj47XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBEZWxpYmVyYXRlbHkgcmVuZGVyIG5vdGhpbmcgaWYgdGhlIFVSTCBpc24ndCByZWNvZ25pc2VkXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgUGlsbDtcbiJdfQ==