matrix-react-sdk
Version:
SDK for matrix.org using React
188 lines (184 loc) • 32 kB
JavaScript
"use strict";
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.VectorPushRulesDefinitions = void 0;
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
var _matrix = require("matrix-js-sdk/src/matrix");
var _logger = require("matrix-js-sdk/src/logger");
var _languageHandler = require("../languageHandler");
var _StandardActions = require("./StandardActions");
var _PushRuleVectorState = require("./PushRuleVectorState");
var _NotificationUtils = require("./NotificationUtils");
/*
Copyright 2024 New Vector Ltd.
Copyright 2016-2022 The Matrix.org Foundation C.I.C.
SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only
Please see LICENSE files in the repository root for full details.
*/
class VectorPushRuleDefinition {
constructor(opts) {
(0, _defineProperty2.default)(this, "description", void 0);
(0, _defineProperty2.default)(this, "vectorStateToActions", void 0);
(0, _defineProperty2.default)(this, "syncedRuleIds", void 0);
this.description = opts.description;
this.vectorStateToActions = opts.vectorStateToActions;
this.syncedRuleIds = opts.syncedRuleIds;
}
// Translate the rule actions and its enabled value into vector state
ruleToVectorState(rule) {
let enabled = false;
if (rule) {
enabled = rule.enabled;
}
for (const state of Object.values(_PushRuleVectorState.PushRuleVectorState.states)) {
const vectorStateToActions = this.vectorStateToActions[state];
if (!vectorStateToActions) {
// No defined actions means that this vector state expects a disabled (or absent) rule
if (!enabled) {
return state;
}
} else {
// The actions must match to the ones expected by vector state.
// Use `decodeActions` on both sides to canonicalize things like
// value: true vs. unspecified for highlight (which defaults to
// true, making them equivalent).
if (enabled && JSON.stringify(_NotificationUtils.NotificationUtils.decodeActions(rule.actions)) === JSON.stringify(_NotificationUtils.NotificationUtils.decodeActions(vectorStateToActions))) {
return state;
}
}
}
_logger.logger.error(`Cannot translate rule actions into Vector rule state. ` + `Rule: ${JSON.stringify(rule)}, ` + `Expected: ${JSON.stringify(this.vectorStateToActions)}`);
return undefined;
}
}
/**
* The descriptions of rules managed by the Vector UI.
*/
const VectorPushRulesDefinitions = exports.VectorPushRulesDefinitions = {
// Messages containing user's display name
".m.rule.contains_display_name": new VectorPushRuleDefinition({
description: (0, _languageHandler._td)("settings|notifications|rule_contains_display_name"),
// passed through _t() translation in src/components/views/settings/Notifications.js
vectorStateToActions: {
// The actions for each vector state, or null to disable the rule.
[]: _StandardActions.StandardActions.ACTION_NOTIFY,
[]: _StandardActions.StandardActions.ACTION_HIGHLIGHT_DEFAULT_SOUND,
[]: _StandardActions.StandardActions.ACTION_DISABLED
}
}),
// Messages containing user's username (localpart/MXID)
".m.rule.contains_user_name": new VectorPushRuleDefinition({
description: (0, _languageHandler._td)("settings|notifications|rule_contains_user_name"),
// passed through _t() translation in src/components/views/settings/Notifications.js
vectorStateToActions: {
// The actions for each vector state, or null to disable the rule.
[]: _StandardActions.StandardActions.ACTION_NOTIFY,
[]: _StandardActions.StandardActions.ACTION_HIGHLIGHT_DEFAULT_SOUND,
[]: _StandardActions.StandardActions.ACTION_DISABLED
},
syncedRuleIds: [_matrix.RuleId.IsUserMention]
}),
// Messages containing @room
".m.rule.roomnotif": new VectorPushRuleDefinition({
description: (0, _languageHandler._td)("settings|notifications|rule_roomnotif"),
// passed through _t() translation in src/components/views/settings/Notifications.js
vectorStateToActions: {
// The actions for each vector state, or null to disable the rule.
[]: _StandardActions.StandardActions.ACTION_NOTIFY,
[]: _StandardActions.StandardActions.ACTION_HIGHLIGHT,
[]: _StandardActions.StandardActions.ACTION_DISABLED
},
syncedRuleIds: [_matrix.RuleId.IsRoomMention]
}),
// Messages just sent to the user in a 1:1 room
".m.rule.room_one_to_one": new VectorPushRuleDefinition({
description: (0, _languageHandler._td)("settings|notifications|rule_room_one_to_one"),
// passed through _t() translation in src/components/views/settings/Notifications.js
vectorStateToActions: {
[]: _StandardActions.StandardActions.ACTION_NOTIFY,
[]: _StandardActions.StandardActions.ACTION_NOTIFY_DEFAULT_SOUND,
[]: _StandardActions.StandardActions.ACTION_DONT_NOTIFY
},
syncedRuleIds: [_matrix.RuleId.PollStartOneToOne, _matrix.RuleId.PollStartOneToOneUnstable, _matrix.RuleId.PollEndOneToOne, _matrix.RuleId.PollEndOneToOneUnstable]
}),
// Encrypted messages just sent to the user in a 1:1 room
".m.rule.encrypted_room_one_to_one": new VectorPushRuleDefinition({
description: (0, _languageHandler._td)("settings|notifications|rule_encrypted_room_one_to_one"),
// passed through _t() translation in src/components/views/settings/Notifications.js
vectorStateToActions: {
[]: _StandardActions.StandardActions.ACTION_NOTIFY,
[]: _StandardActions.StandardActions.ACTION_NOTIFY_DEFAULT_SOUND,
[]: _StandardActions.StandardActions.ACTION_DONT_NOTIFY
}
}),
// Messages just sent to a group chat room
// 1:1 room messages are caught by the .m.rule.room_one_to_one rule if any defined
// By opposition, all other room messages are from group chat rooms.
".m.rule.message": new VectorPushRuleDefinition({
description: (0, _languageHandler._td)("settings|notifications|rule_message"),
// passed through _t() translation in src/components/views/settings/Notifications.js
vectorStateToActions: {
[]: _StandardActions.StandardActions.ACTION_NOTIFY,
[]: _StandardActions.StandardActions.ACTION_NOTIFY_DEFAULT_SOUND,
[]: _StandardActions.StandardActions.ACTION_DONT_NOTIFY
},
syncedRuleIds: [_matrix.RuleId.PollStart, _matrix.RuleId.PollStartUnstable, _matrix.RuleId.PollEnd, _matrix.RuleId.PollEndUnstable]
}),
// Encrypted messages just sent to a group chat room
// Encrypted 1:1 room messages are caught by the .m.rule.encrypted_room_one_to_one rule if any defined
// By opposition, all other room messages are from group chat rooms.
".m.rule.encrypted": new VectorPushRuleDefinition({
description: (0, _languageHandler._td)("settings|notifications|rule_encrypted"),
// passed through _t() translation in src/components/views/settings/Notifications.js
vectorStateToActions: {
[]: _StandardActions.StandardActions.ACTION_NOTIFY,
[]: _StandardActions.StandardActions.ACTION_NOTIFY_DEFAULT_SOUND,
[]: _StandardActions.StandardActions.ACTION_DONT_NOTIFY
}
}),
// Invitation for the user
".m.rule.invite_for_me": new VectorPushRuleDefinition({
description: (0, _languageHandler._td)("settings|notifications|rule_invite_for_me"),
// passed through _t() translation in src/components/views/settings/Notifications.js
vectorStateToActions: {
[]: _StandardActions.StandardActions.ACTION_NOTIFY,
[]: _StandardActions.StandardActions.ACTION_NOTIFY_DEFAULT_SOUND,
[]: _StandardActions.StandardActions.ACTION_DISABLED
}
}),
// Incoming call
".m.rule.call": new VectorPushRuleDefinition({
description: (0, _languageHandler._td)("settings|notifications|rule_call"),
// passed through _t() translation in src/components/views/settings/Notifications.js
vectorStateToActions: {
[]: _StandardActions.StandardActions.ACTION_NOTIFY,
[]: _StandardActions.StandardActions.ACTION_NOTIFY_RING_SOUND,
[]: _StandardActions.StandardActions.ACTION_DISABLED
}
}),
// Notifications from bots
".m.rule.suppress_notices": new VectorPushRuleDefinition({
description: (0, _languageHandler._td)("settings|notifications|rule_suppress_notices"),
// passed through _t() translation in src/components/views/settings/Notifications.js
vectorStateToActions: {
// .m.rule.suppress_notices is a "negative" rule, we have to invert its enabled value for vector UI
[]: _StandardActions.StandardActions.ACTION_DISABLED,
[]: _StandardActions.StandardActions.ACTION_NOTIFY_DEFAULT_SOUND,
[]: _StandardActions.StandardActions.ACTION_DONT_NOTIFY
}
}),
// Room upgrades (tombstones)
".m.rule.tombstone": new VectorPushRuleDefinition({
description: (0, _languageHandler._td)("settings|notifications|rule_tombstone"),
// passed through _t() translation in src/components/views/settings/Notifications.js
vectorStateToActions: {
// The actions for each vector state, or null to disable the rule.
[]: _StandardActions.StandardActions.ACTION_NOTIFY,
[]: _StandardActions.StandardActions.ACTION_HIGHLIGHT,
[]: _StandardActions.StandardActions.ACTION_DISABLED
}
})
};
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfbWF0cml4IiwicmVxdWlyZSIsIl9sb2dnZXIiLCJfbGFuZ3VhZ2VIYW5kbGVyIiwiX1N0YW5kYXJkQWN0aW9ucyIsIl9QdXNoUnVsZVZlY3RvclN0YXRlIiwiX05vdGlmaWNhdGlvblV0aWxzIiwiVmVjdG9yUHVzaFJ1bGVEZWZpbml0aW9uIiwiY29uc3RydWN0b3IiLCJvcHRzIiwiX2RlZmluZVByb3BlcnR5MiIsImRlZmF1bHQiLCJkZXNjcmlwdGlvbiIsInZlY3RvclN0YXRlVG9BY3Rpb25zIiwic3luY2VkUnVsZUlkcyIsInJ1bGVUb1ZlY3RvclN0YXRlIiwicnVsZSIsImVuYWJsZWQiLCJzdGF0ZSIsIk9iamVjdCIsInZhbHVlcyIsIlB1c2hSdWxlVmVjdG9yU3RhdGUiLCJzdGF0ZXMiLCJKU09OIiwic3RyaW5naWZ5IiwiTm90aWZpY2F0aW9uVXRpbHMiLCJkZWNvZGVBY3Rpb25zIiwiYWN0aW9ucyIsImxvZ2dlciIsImVycm9yIiwidW5kZWZpbmVkIiwiVmVjdG9yUHVzaFJ1bGVzRGVmaW5pdGlvbnMiLCJleHBvcnRzIiwiX3RkIiwiVmVjdG9yU3RhdGUiLCJPbiIsIlN0YW5kYXJkQWN0aW9ucyIsIkFDVElPTl9OT1RJRlkiLCJMb3VkIiwiQUNUSU9OX0hJR0hMSUdIVF9ERUZBVUxUX1NPVU5EIiwiT2ZmIiwiQUNUSU9OX0RJU0FCTEVEIiwiUnVsZUlkIiwiSXNVc2VyTWVudGlvbiIsIkFDVElPTl9ISUdITElHSFQiLCJJc1Jvb21NZW50aW9uIiwiQUNUSU9OX05PVElGWV9ERUZBVUxUX1NPVU5EIiwiQUNUSU9OX0RPTlRfTk9USUZZIiwiUG9sbFN0YXJ0T25lVG9PbmUiLCJQb2xsU3RhcnRPbmVUb09uZVVuc3RhYmxlIiwiUG9sbEVuZE9uZVRvT25lIiwiUG9sbEVuZE9uZVRvT25lVW5zdGFibGUiLCJQb2xsU3RhcnQiLCJQb2xsU3RhcnRVbnN0YWJsZSIsIlBvbGxFbmQiLCJQb2xsRW5kVW5zdGFibGUiLCJBQ1RJT05fTk9USUZZX1JJTkdfU09VTkQiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvbm90aWZpY2F0aW9ucy9WZWN0b3JQdXNoUnVsZXNEZWZpbml0aW9ucy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuQ29weXJpZ2h0IDIwMjQgTmV3IFZlY3RvciBMdGQuXG5Db3B5cmlnaHQgMjAxNi0yMDIyIFRoZSBNYXRyaXgub3JnIEZvdW5kYXRpb24gQy5JLkMuXG5cblNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBR1BMLTMuMC1vbmx5IE9SIEdQTC0zLjAtb25seVxuUGxlYXNlIHNlZSBMSUNFTlNFIGZpbGVzIGluIHRoZSByZXBvc2l0b3J5IHJvb3QgZm9yIGZ1bGwgZGV0YWlscy5cbiovXG5cbmltcG9ydCB7IElBbm5vdGF0ZWRQdXNoUnVsZSwgUHVzaFJ1bGVBY3Rpb24sIFJ1bGVJZCB9IGZyb20gXCJtYXRyaXgtanMtc2RrL3NyYy9tYXRyaXhcIjtcbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gXCJtYXRyaXgtanMtc2RrL3NyYy9sb2dnZXJcIjtcblxuaW1wb3J0IHsgX3RkLCBUcmFuc2xhdGlvbktleSB9IGZyb20gXCIuLi9sYW5ndWFnZUhhbmRsZXJcIjtcbmltcG9ydCB7IFN0YW5kYXJkQWN0aW9ucyB9IGZyb20gXCIuL1N0YW5kYXJkQWN0aW9uc1wiO1xuaW1wb3J0IHsgUHVzaFJ1bGVWZWN0b3JTdGF0ZSwgVmVjdG9yU3RhdGUgfSBmcm9tIFwiLi9QdXNoUnVsZVZlY3RvclN0YXRlXCI7XG5pbXBvcnQgeyBOb3RpZmljYXRpb25VdGlscyB9IGZyb20gXCIuL05vdGlmaWNhdGlvblV0aWxzXCI7XG5cbnR5cGUgU3RhdGVUb0FjdGlvbnNNYXAgPSB7XG4gICAgW3N0YXRlIGluIFZlY3RvclN0YXRlXT86IFB1c2hSdWxlQWN0aW9uW107XG59O1xuXG5pbnRlcmZhY2UgSVZlY3RvclB1c2hSdWxlRGVmaW5pdGlvbiB7XG4gICAgZGVzY3JpcHRpb246IFRyYW5zbGF0aW9uS2V5O1xuICAgIHZlY3RvclN0YXRlVG9BY3Rpb25zOiBTdGF0ZVRvQWN0aW9uc01hcDtcbiAgICAvKipcbiAgICAgKiBSdWxlcyB0aGF0IHNob3VsZCBiZSB1cGRhdGVkIHRvIGJlIGtlcHQgaW4gc3luY1xuICAgICAqIHdoZW4gdGhpcyBydWxlIGNoYW5nZXNcbiAgICAgKi9cbiAgICBzeW5jZWRSdWxlSWRzPzogKFJ1bGVJZCB8IHN0cmluZylbXTtcbn1cblxuY2xhc3MgVmVjdG9yUHVzaFJ1bGVEZWZpbml0aW9uIHtcbiAgICBwdWJsaWMgcmVhZG9ubHkgZGVzY3JpcHRpb246IFRyYW5zbGF0aW9uS2V5O1xuICAgIHB1YmxpYyByZWFkb25seSB2ZWN0b3JTdGF0ZVRvQWN0aW9uczogU3RhdGVUb0FjdGlvbnNNYXA7XG4gICAgcHVibGljIHJlYWRvbmx5IHN5bmNlZFJ1bGVJZHM/OiAoUnVsZUlkIHwgc3RyaW5nKVtdO1xuXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKG9wdHM6IElWZWN0b3JQdXNoUnVsZURlZmluaXRpb24pIHtcbiAgICAgICAgdGhpcy5kZXNjcmlwdGlvbiA9IG9wdHMuZGVzY3JpcHRpb247XG4gICAgICAgIHRoaXMudmVjdG9yU3RhdGVUb0FjdGlvbnMgPSBvcHRzLnZlY3RvclN0YXRlVG9BY3Rpb25zO1xuICAgICAgICB0aGlzLnN5bmNlZFJ1bGVJZHMgPSBvcHRzLnN5bmNlZFJ1bGVJZHM7XG4gICAgfVxuXG4gICAgLy8gVHJhbnNsYXRlIHRoZSBydWxlIGFjdGlvbnMgYW5kIGl0cyBlbmFibGVkIHZhbHVlIGludG8gdmVjdG9yIHN0YXRlXG4gICAgcHVibGljIHJ1bGVUb1ZlY3RvclN0YXRlKHJ1bGU6IElBbm5vdGF0ZWRQdXNoUnVsZSk6IFZlY3RvclN0YXRlIHwgdW5kZWZpbmVkIHtcbiAgICAgICAgbGV0IGVuYWJsZWQgPSBmYWxzZTtcbiAgICAgICAgaWYgKHJ1bGUpIHtcbiAgICAgICAgICAgIGVuYWJsZWQgPSBydWxlLmVuYWJsZWQ7XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGNvbnN0IHN0YXRlIG9mIE9iamVjdC52YWx1ZXMoUHVzaFJ1bGVWZWN0b3JTdGF0ZS5zdGF0ZXMpKSB7XG4gICAgICAgICAgICBjb25zdCB2ZWN0b3JTdGF0ZVRvQWN0aW9ucyA9IHRoaXMudmVjdG9yU3RhdGVUb0FjdGlvbnNbc3RhdGVdO1xuXG4gICAgICAgICAgICBpZiAoIXZlY3RvclN0YXRlVG9BY3Rpb25zKSB7XG4gICAgICAgICAgICAgICAgLy8gTm8gZGVmaW5lZCBhY3Rpb25zIG1lYW5zIHRoYXQgdGhpcyB2ZWN0b3Igc3RhdGUgZXhwZWN0cyBhIGRpc2FibGVkIChvciBhYnNlbnQpIHJ1bGVcbiAgICAgICAgICAgICAgICBpZiAoIWVuYWJsZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN0YXRlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gVGhlIGFjdGlvbnMgbXVzdCBtYXRjaCB0byB0aGUgb25lcyBleHBlY3RlZCBieSB2ZWN0b3Igc3RhdGUuXG4gICAgICAgICAgICAgICAgLy8gVXNlIGBkZWNvZGVBY3Rpb25zYCBvbiBib3RoIHNpZGVzIHRvIGNhbm9uaWNhbGl6ZSB0aGluZ3MgbGlrZVxuICAgICAgICAgICAgICAgIC8vIHZhbHVlOiB0cnVlIHZzLiB1bnNwZWNpZmllZCBmb3IgaGlnaGxpZ2h0ICh3aGljaCBkZWZhdWx0cyB0b1xuICAgICAgICAgICAgICAgIC8vIHRydWUsIG1ha2luZyB0aGVtIGVxdWl2YWxlbnQpLlxuICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgZW5hYmxlZCAmJlxuICAgICAgICAgICAgICAgICAgICBKU09OLnN0cmluZ2lmeShOb3RpZmljYXRpb25VdGlscy5kZWNvZGVBY3Rpb25zKHJ1bGUuYWN0aW9ucykpID09PVxuICAgICAgICAgICAgICAgICAgICAgICAgSlNPTi5zdHJpbmdpZnkoTm90aWZpY2F0aW9uVXRpbHMuZGVjb2RlQWN0aW9ucyh2ZWN0b3JTdGF0ZVRvQWN0aW9ucykpXG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBzdGF0ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBsb2dnZXIuZXJyb3IoXG4gICAgICAgICAgICBgQ2Fubm90IHRyYW5zbGF0ZSBydWxlIGFjdGlvbnMgaW50byBWZWN0b3IgcnVsZSBzdGF0ZS4gYCArXG4gICAgICAgICAgICAgICAgYFJ1bGU6ICR7SlNPTi5zdHJpbmdpZnkocnVsZSl9LCBgICtcbiAgICAgICAgICAgICAgICBgRXhwZWN0ZWQ6ICR7SlNPTi5zdHJpbmdpZnkodGhpcy52ZWN0b3JTdGF0ZVRvQWN0aW9ucyl9YCxcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG59XG5leHBvcnQgdHlwZSB7IFZlY3RvclB1c2hSdWxlRGVmaW5pdGlvbiB9O1xuXG4vKipcbiAqIFRoZSBkZXNjcmlwdGlvbnMgb2YgcnVsZXMgbWFuYWdlZCBieSB0aGUgVmVjdG9yIFVJLlxuICovXG5leHBvcnQgY29uc3QgVmVjdG9yUHVzaFJ1bGVzRGVmaW5pdGlvbnM6IFJlY29yZDxzdHJpbmcsIFZlY3RvclB1c2hSdWxlRGVmaW5pdGlvbj4gPSB7XG4gICAgLy8gTWVzc2FnZXMgY29udGFpbmluZyB1c2VyJ3MgZGlzcGxheSBuYW1lXG4gICAgXCIubS5ydWxlLmNvbnRhaW5zX2Rpc3BsYXlfbmFtZVwiOiBuZXcgVmVjdG9yUHVzaFJ1bGVEZWZpbml0aW9uKHtcbiAgICAgICAgZGVzY3JpcHRpb246IF90ZChcInNldHRpbmdzfG5vdGlmaWNhdGlvbnN8cnVsZV9jb250YWluc19kaXNwbGF5X25hbWVcIiksIC8vIHBhc3NlZCB0aHJvdWdoIF90KCkgdHJhbnNsYXRpb24gaW4gc3JjL2NvbXBvbmVudHMvdmlld3Mvc2V0dGluZ3MvTm90aWZpY2F0aW9ucy5qc1xuICAgICAgICB2ZWN0b3JTdGF0ZVRvQWN0aW9uczoge1xuICAgICAgICAgICAgLy8gVGhlIGFjdGlvbnMgZm9yIGVhY2ggdmVjdG9yIHN0YXRlLCBvciBudWxsIHRvIGRpc2FibGUgdGhlIHJ1bGUuXG4gICAgICAgICAgICBbVmVjdG9yU3RhdGUuT25dOiBTdGFuZGFyZEFjdGlvbnMuQUNUSU9OX05PVElGWSxcbiAgICAgICAgICAgIFtWZWN0b3JTdGF0ZS5Mb3VkXTogU3RhbmRhcmRBY3Rpb25zLkFDVElPTl9ISUdITElHSFRfREVGQVVMVF9TT1VORCxcbiAgICAgICAgICAgIFtWZWN0b3JTdGF0ZS5PZmZdOiBTdGFuZGFyZEFjdGlvbnMuQUNUSU9OX0RJU0FCTEVELFxuICAgICAgICB9LFxuICAgIH0pLFxuXG4gICAgLy8gTWVzc2FnZXMgY29udGFpbmluZyB1c2VyJ3MgdXNlcm5hbWUgKGxvY2FscGFydC9NWElEKVxuICAgIFwiLm0ucnVsZS5jb250YWluc191c2VyX25hbWVcIjogbmV3IFZlY3RvclB1c2hSdWxlRGVmaW5pdGlvbih7XG4gICAgICAgIGRlc2NyaXB0aW9uOiBfdGQoXCJzZXR0aW5nc3xub3RpZmljYXRpb25zfHJ1bGVfY29udGFpbnNfdXNlcl9uYW1lXCIpLCAvLyBwYXNzZWQgdGhyb3VnaCBfdCgpIHRyYW5zbGF0aW9uIGluIHNyYy9jb21wb25lbnRzL3ZpZXdzL3NldHRpbmdzL05vdGlmaWNhdGlvbnMuanNcbiAgICAgICAgdmVjdG9yU3RhdGVUb0FjdGlvbnM6IHtcbiAgICAgICAgICAgIC8vIFRoZSBhY3Rpb25zIGZvciBlYWNoIHZlY3RvciBzdGF0ZSwgb3IgbnVsbCB0byBkaXNhYmxlIHRoZSBydWxlLlxuICAgICAgICAgICAgW1ZlY3RvclN0YXRlLk9uXTogU3RhbmRhcmRBY3Rpb25zLkFDVElPTl9OT1RJRlksXG4gICAgICAgICAgICBbVmVjdG9yU3RhdGUuTG91ZF06IFN0YW5kYXJkQWN0aW9ucy5BQ1RJT05fSElHSExJR0hUX0RFRkFVTFRfU09VTkQsXG4gICAgICAgICAgICBbVmVjdG9yU3RhdGUuT2ZmXTogU3RhbmRhcmRBY3Rpb25zLkFDVElPTl9ESVNBQkxFRCxcbiAgICAgICAgfSxcbiAgICAgICAgc3luY2VkUnVsZUlkczogW1J1bGVJZC5Jc1VzZXJNZW50aW9uXSxcbiAgICB9KSxcblxuICAgIC8vIE1lc3NhZ2VzIGNvbnRhaW5pbmcgQHJvb21cbiAgICBcIi5tLnJ1bGUucm9vbW5vdGlmXCI6IG5ldyBWZWN0b3JQdXNoUnVsZURlZmluaXRpb24oe1xuICAgICAgICBkZXNjcmlwdGlvbjogX3RkKFwic2V0dGluZ3N8bm90aWZpY2F0aW9uc3xydWxlX3Jvb21ub3RpZlwiKSwgLy8gcGFzc2VkIHRocm91Z2ggX3QoKSB0cmFuc2xhdGlvbiBpbiBzcmMvY29tcG9uZW50cy92aWV3cy9zZXR0aW5ncy9Ob3RpZmljYXRpb25zLmpzXG4gICAgICAgIHZlY3RvclN0YXRlVG9BY3Rpb25zOiB7XG4gICAgICAgICAgICAvLyBUaGUgYWN0aW9ucyBmb3IgZWFjaCB2ZWN0b3Igc3RhdGUsIG9yIG51bGwgdG8gZGlzYWJsZSB0aGUgcnVsZS5cbiAgICAgICAgICAgIFtWZWN0b3JTdGF0ZS5Pbl06IFN0YW5kYXJkQWN0aW9ucy5BQ1RJT05fTk9USUZZLFxuICAgICAgICAgICAgW1ZlY3RvclN0YXRlLkxvdWRdOiBTdGFuZGFyZEFjdGlvbnMuQUNUSU9OX0hJR0hMSUdIVCxcbiAgICAgICAgICAgIFtWZWN0b3JTdGF0ZS5PZmZdOiBTdGFuZGFyZEFjdGlvbnMuQUNUSU9OX0RJU0FCTEVELFxuICAgICAgICB9LFxuICAgICAgICBzeW5jZWRSdWxlSWRzOiBbUnVsZUlkLklzUm9vbU1lbnRpb25dLFxuICAgIH0pLFxuXG4gICAgLy8gTWVzc2FnZXMganVzdCBzZW50IHRvIHRoZSB1c2VyIGluIGEgMToxIHJvb21cbiAgICBcIi5tLnJ1bGUucm9vbV9vbmVfdG9fb25lXCI6IG5ldyBWZWN0b3JQdXNoUnVsZURlZmluaXRpb24oe1xuICAgICAgICBkZXNjcmlwdGlvbjogX3RkKFwic2V0dGluZ3N8bm90aWZpY2F0aW9uc3xydWxlX3Jvb21fb25lX3RvX29uZVwiKSwgLy8gcGFzc2VkIHRocm91Z2ggX3QoKSB0cmFuc2xhdGlvbiBpbiBzcmMvY29tcG9uZW50cy92aWV3cy9zZXR0aW5ncy9Ob3RpZmljYXRpb25zLmpzXG4gICAgICAgIHZlY3RvclN0YXRlVG9BY3Rpb25zOiB7XG4gICAgICAgICAgICBbVmVjdG9yU3RhdGUuT25dOiBTdGFuZGFyZEFjdGlvbnMuQUNUSU9OX05PVElGWSxcbiAgICAgICAgICAgIFtWZWN0b3JTdGF0ZS5Mb3VkXTogU3RhbmRhcmRBY3Rpb25zLkFDVElPTl9OT1RJRllfREVGQVVMVF9TT1VORCxcbiAgICAgICAgICAgIFtWZWN0b3JTdGF0ZS5PZmZdOiBTdGFuZGFyZEFjdGlvbnMuQUNUSU9OX0RPTlRfTk9USUZZLFxuICAgICAgICB9LFxuICAgICAgICBzeW5jZWRSdWxlSWRzOiBbXG4gICAgICAgICAgICBSdWxlSWQuUG9sbFN0YXJ0T25lVG9PbmUsXG4gICAgICAgICAgICBSdWxlSWQuUG9sbFN0YXJ0T25lVG9PbmVVbnN0YWJsZSxcbiAgICAgICAgICAgIFJ1bGVJZC5Qb2xsRW5kT25lVG9PbmUsXG4gICAgICAgICAgICBSdWxlSWQuUG9sbEVuZE9uZVRvT25lVW5zdGFibGUsXG4gICAgICAgIF0sXG4gICAgfSksXG5cbiAgICAvLyBFbmNyeXB0ZWQgbWVzc2FnZXMganVzdCBzZW50IHRvIHRoZSB1c2VyIGluIGEgMToxIHJvb21cbiAgICBcIi5tLnJ1bGUuZW5jcnlwdGVkX3Jvb21fb25lX3RvX29uZVwiOiBuZXcgVmVjdG9yUHVzaFJ1bGVEZWZpbml0aW9uKHtcbiAgICAgICAgZGVzY3JpcHRpb246IF90ZChcInNldHRpbmdzfG5vdGlmaWNhdGlvbnN8cnVsZV9lbmNyeXB0ZWRfcm9vbV9vbmVfdG9fb25lXCIpLCAvLyBwYXNzZWQgdGhyb3VnaCBfdCgpIHRyYW5zbGF0aW9uIGluIHNyYy9jb21wb25lbnRzL3ZpZXdzL3NldHRpbmdzL05vdGlmaWNhdGlvbnMuanNcbiAgICAgICAgdmVjdG9yU3RhdGVUb0FjdGlvbnM6IHtcbiAgICAgICAgICAgIFtWZWN0b3JTdGF0ZS5Pbl06IFN0YW5kYXJkQWN0aW9ucy5BQ1RJT05fTk9USUZZLFxuICAgICAgICAgICAgW1ZlY3RvclN0YXRlLkxvdWRdOiBTdGFuZGFyZEFjdGlvbnMuQUNUSU9OX05PVElGWV9ERUZBVUxUX1NPVU5ELFxuICAgICAgICAgICAgW1ZlY3RvclN0YXRlLk9mZl06IFN0YW5kYXJkQWN0aW9ucy5BQ1RJT05fRE9OVF9OT1RJRlksXG4gICAgICAgIH0sXG4gICAgfSksXG5cbiAgICAvLyBNZXNzYWdlcyBqdXN0IHNlbnQgdG8gYSBncm91cCBjaGF0IHJvb21cbiAgICAvLyAxOjEgcm9vbSBtZXNzYWdlcyBhcmUgY2F1Z2h0IGJ5IHRoZSAubS5ydWxlLnJvb21fb25lX3RvX29uZSBydWxlIGlmIGFueSBkZWZpbmVkXG4gICAgLy8gQnkgb3Bwb3NpdGlvbiwgYWxsIG90aGVyIHJvb20gbWVzc2FnZXMgYXJlIGZyb20gZ3JvdXAgY2hhdCByb29tcy5cbiAgICBcIi5tLnJ1bGUubWVzc2FnZVwiOiBuZXcgVmVjdG9yUHVzaFJ1bGVEZWZpbml0aW9uKHtcbiAgICAgICAgZGVzY3JpcHRpb246IF90ZChcInNldHRpbmdzfG5vdGlmaWNhdGlvbnN8cnVsZV9tZXNzYWdlXCIpLCAvLyBwYXNzZWQgdGhyb3VnaCBfdCgpIHRyYW5zbGF0aW9uIGluIHNyYy9jb21wb25lbnRzL3ZpZXdzL3NldHRpbmdzL05vdGlmaWNhdGlvbnMuanNcbiAgICAgICAgdmVjdG9yU3RhdGVUb0FjdGlvbnM6IHtcbiAgICAgICAgICAgIFtWZWN0b3JTdGF0ZS5Pbl06IFN0YW5kYXJkQWN0aW9ucy5BQ1RJT05fTk9USUZZLFxuICAgICAgICAgICAgW1ZlY3RvclN0YXRlLkxvdWRdOiBTdGFuZGFyZEFjdGlvbnMuQUNUSU9OX05PVElGWV9ERUZBVUxUX1NPVU5ELFxuICAgICAgICAgICAgW1ZlY3RvclN0YXRlLk9mZl06IFN0YW5kYXJkQWN0aW9ucy5BQ1RJT05fRE9OVF9OT1RJRlksXG4gICAgICAgIH0sXG4gICAgICAgIHN5bmNlZFJ1bGVJZHM6IFtSdWxlSWQuUG9sbFN0YXJ0LCBSdWxlSWQuUG9sbFN0YXJ0VW5zdGFibGUsIFJ1bGVJZC5Qb2xsRW5kLCBSdWxlSWQuUG9sbEVuZFVuc3RhYmxlXSxcbiAgICB9KSxcblxuICAgIC8vIEVuY3J5cHRlZCBtZXNzYWdlcyBqdXN0IHNlbnQgdG8gYSBncm91cCBjaGF0IHJvb21cbiAgICAvLyBFbmNyeXB0ZWQgMToxIHJvb20gbWVzc2FnZXMgYXJlIGNhdWdodCBieSB0aGUgLm0ucnVsZS5lbmNyeXB0ZWRfcm9vbV9vbmVfdG9fb25lIHJ1bGUgaWYgYW55IGRlZmluZWRcbiAgICAvLyBCeSBvcHBvc2l0aW9uLCBhbGwgb3RoZXIgcm9vbSBtZXNzYWdlcyBhcmUgZnJvbSBncm91cCBjaGF0IHJvb21zLlxuICAgIFwiLm0ucnVsZS5lbmNyeXB0ZWRcIjogbmV3IFZlY3RvclB1c2hSdWxlRGVmaW5pdGlvbih7XG4gICAgICAgIGRlc2NyaXB0aW9uOiBfdGQoXCJzZXR0aW5nc3xub3RpZmljYXRpb25zfHJ1bGVfZW5jcnlwdGVkXCIpLCAvLyBwYXNzZWQgdGhyb3VnaCBfdCgpIHRyYW5zbGF0aW9uIGluIHNyYy9jb21wb25lbnRzL3ZpZXdzL3NldHRpbmdzL05vdGlmaWNhdGlvbnMuanNcbiAgICAgICAgdmVjdG9yU3RhdGVUb0FjdGlvbnM6IHtcbiAgICAgICAgICAgIFtWZWN0b3JTdGF0ZS5Pbl06IFN0YW5kYXJkQWN0aW9ucy5BQ1RJT05fTk9USUZZLFxuICAgICAgICAgICAgW1ZlY3RvclN0YXRlLkxvdWRdOiBTdGFuZGFyZEFjdGlvbnMuQUNUSU9OX05PVElGWV9ERUZBVUxUX1NPVU5ELFxuICAgICAgICAgICAgW1ZlY3RvclN0YXRlLk9mZl06IFN0YW5kYXJkQWN0aW9ucy5BQ1RJT05fRE9OVF9OT1RJRlksXG4gICAgICAgIH0sXG4gICAgfSksXG5cbiAgICAvLyBJbnZpdGF0aW9uIGZvciB0aGUgdXNlclxuICAgIFwiLm0ucnVsZS5pbnZpdGVfZm9yX21lXCI6IG5ldyBWZWN0b3JQdXNoUnVsZURlZmluaXRpb24oe1xuICAgICAgICBkZXNjcmlwdGlvbjogX3RkKFwic2V0dGluZ3N8bm90aWZpY2F0aW9uc3xydWxlX2ludml0ZV9mb3JfbWVcIiksIC8vIHBhc3NlZCB0aHJvdWdoIF90KCkgdHJhbnNsYXRpb24gaW4gc3JjL2NvbXBvbmVudHMvdmlld3Mvc2V0dGluZ3MvTm90aWZpY2F0aW9ucy5qc1xuICAgICAgICB2ZWN0b3JTdGF0ZVRvQWN0aW9uczoge1xuICAgICAgICAgICAgW1ZlY3RvclN0YXRlLk9uXTogU3RhbmRhcmRBY3Rpb25zLkFDVElPTl9OT1RJRlksXG4gICAgICAgICAgICBbVmVjdG9yU3RhdGUuTG91ZF06IFN0YW5kYXJkQWN0aW9ucy5BQ1RJT05fTk9USUZZX0RFRkFVTFRfU09VTkQsXG4gICAgICAgICAgICBbVmVjdG9yU3RhdGUuT2ZmXTogU3RhbmRhcmRBY3Rpb25zLkFDVElPTl9ESVNBQkxFRCxcbiAgICAgICAgfSxcbiAgICB9KSxcblxuICAgIC8vIEluY29taW5nIGNhbGxcbiAgICBcIi5tLnJ1bGUuY2FsbFwiOiBuZXcgVmVjdG9yUHVzaFJ1bGVEZWZpbml0aW9uKHtcbiAgICAgICAgZGVzY3JpcHRpb246IF90ZChcInNldHRpbmdzfG5vdGlmaWNhdGlvbnN8cnVsZV9jYWxsXCIpLCAvLyBwYXNzZWQgdGhyb3VnaCBfdCgpIHRyYW5zbGF0aW9uIGluIHNyYy9jb21wb25lbnRzL3ZpZXdzL3NldHRpbmdzL05vdGlmaWNhdGlvbnMuanNcbiAgICAgICAgdmVjdG9yU3RhdGVUb0FjdGlvbnM6IHtcbiAgICAgICAgICAgIFtWZWN0b3JTdGF0ZS5Pbl06IFN0YW5kYXJkQWN0aW9ucy5BQ1RJT05fTk9USUZZLFxuICAgICAgICAgICAgW1ZlY3RvclN0YXRlLkxvdWRdOiBTdGFuZGFyZEFjdGlvbnMuQUNUSU9OX05PVElGWV9SSU5HX1NPVU5ELFxuICAgICAgICAgICAgW1ZlY3RvclN0YXRlLk9mZl06IFN0YW5kYXJkQWN0aW9ucy5BQ1RJT05fRElTQUJMRUQsXG4gICAgICAgIH0sXG4gICAgfSksXG5cbiAgICAvLyBOb3RpZmljYXRpb25zIGZyb20gYm90c1xuICAgIFwiLm0ucnVsZS5zdXBwcmVzc19ub3RpY2VzXCI6IG5ldyBWZWN0b3JQdXNoUnVsZURlZmluaXRpb24oe1xuICAgICAgICBkZXNjcmlwdGlvbjogX3RkKFwic2V0dGluZ3N8bm90aWZpY2F0aW9uc3xydWxlX3N1cHByZXNzX25vdGljZXNcIiksIC8vIHBhc3NlZCB0aHJvdWdoIF90KCkgdHJhbnNsYXRpb24gaW4gc3JjL2NvbXBvbmVudHMvdmlld3Mvc2V0dGluZ3MvTm90aWZpY2F0aW9ucy5qc1xuICAgICAgICB2ZWN0b3JTdGF0ZVRvQWN0aW9uczoge1xuICAgICAgICAgICAgLy8gLm0ucnVsZS5zdXBwcmVzc19ub3RpY2VzIGlzIGEgXCJuZWdhdGl2ZVwiIHJ1bGUsIHdlIGhhdmUgdG8gaW52ZXJ0IGl0cyBlbmFibGVkIHZhbHVlIGZvciB2ZWN0b3IgVUlcbiAgICAgICAgICAgIFtWZWN0b3JTdGF0ZS5Pbl06IFN0YW5kYXJkQWN0aW9ucy5BQ1RJT05fRElTQUJMRUQsXG4gICAgICAgICAgICBbVmVjdG9yU3RhdGUuTG91ZF06IFN0YW5kYXJkQWN0aW9ucy5BQ1RJT05fTk9USUZZX0RFRkFVTFRfU09VTkQsXG4gICAgICAgICAgICBbVmVjdG9yU3RhdGUuT2ZmXTogU3RhbmRhcmRBY3Rpb25zLkFDVElPTl9ET05UX05PVElGWSxcbiAgICAgICAgfSxcbiAgICB9KSxcblxuICAgIC8vIFJvb20gdXBncmFkZXMgKHRvbWJzdG9uZXMpXG4gICAgXCIubS5ydWxlLnRvbWJzdG9uZVwiOiBuZXcgVmVjdG9yUHVzaFJ1bGVEZWZpbml0aW9uKHtcbiAgICAgICAgZGVzY3JpcHRpb246IF90ZChcInNldHRpbmdzfG5vdGlmaWNhdGlvbnN8cnVsZV90b21ic3RvbmVcIiksIC8vIHBhc3NlZCB0aHJvdWdoIF90KCkgdHJhbnNsYXRpb24gaW4gc3JjL2NvbXBvbmVudHMvdmlld3Mvc2V0dGluZ3MvTm90aWZpY2F0aW9ucy5qc1xuICAgICAgICB2ZWN0b3JTdGF0ZVRvQWN0aW9uczoge1xuICAgICAgICAgICAgLy8gVGhlIGFjdGlvbnMgZm9yIGVhY2ggdmVjdG9yIHN0YXRlLCBvciBudWxsIHRvIGRpc2FibGUgdGhlIHJ1bGUuXG4gICAgICAgICAgICBbVmVjdG9yU3RhdGUuT25dOiBTdGFuZGFyZEFjdGlvbnMuQUNUSU9OX05PVElGWSxcbiAgICAgICAgICAgIFtWZWN0b3JTdGF0ZS5Mb3VkXTogU3RhbmRhcmRBY3Rpb25zLkFDVElPTl9ISUdITElHSFQsXG4gICAgICAgICAgICBbVmVjdG9yU3RhdGUuT2ZmXTogU3RhbmRhcmRBY3Rpb25zLkFDVElPTl9ESVNBQkxFRCxcbiAgICAgICAgfSxcbiAgICB9KSxcbn07XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7O0FBUUEsSUFBQUEsT0FBQSxHQUFBQyxPQUFBO0FBQ0EsSUFBQUMsT0FBQSxHQUFBRCxPQUFBO0FBRUEsSUFBQUUsZ0JBQUEsR0FBQUYsT0FBQTtBQUNBLElBQUFHLGdCQUFBLEdBQUFILE9BQUE7QUFDQSxJQUFBSSxvQkFBQSxHQUFBSixPQUFBO0FBQ0EsSUFBQUssa0JBQUEsR0FBQUwsT0FBQTtBQWRBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQXdCQSxNQUFNTSx3QkFBd0IsQ0FBQztFQUtwQkMsV0FBV0EsQ0FBQ0MsSUFBK0IsRUFBRTtJQUFBLElBQUFDLGdCQUFBLENBQUFDLE9BQUE7SUFBQSxJQUFBRCxnQkFBQSxDQUFBQyxPQUFBO0lBQUEsSUFBQUQsZ0JBQUEsQ0FBQUMsT0FBQTtJQUNoRCxJQUFJLENBQUNDLFdBQVcsR0FBR0gsSUFBSSxDQUFDRyxXQUFXO0lBQ25DLElBQUksQ0FBQ0Msb0JBQW9CLEdBQUdKLElBQUksQ0FBQ0ksb0JBQW9CO0lBQ3JELElBQUksQ0FBQ0MsYUFBYSxHQUFHTCxJQUFJLENBQUNLLGFBQWE7RUFDM0M7O0VBRUE7RUFDT0MsaUJBQWlCQSxDQUFDQyxJ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