UNPKG

matrix-react-sdk

Version:
258 lines (206 loc) 29.4 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _MatrixClientPeg = require("../../MatrixClientPeg"); var _MatrixClientBackedSettingsHandler = _interopRequireDefault(require("./MatrixClientBackedSettingsHandler")); var _objects = require("../../utils/objects"); var _SettingLevel = require("../SettingLevel"); /* Copyright 2017 Travis Ralston Copyright 2019, 2020 The Matrix.org Foundation C.I.C. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ const BREADCRUMBS_LEGACY_EVENT_TYPE = "im.vector.riot.breadcrumb_rooms"; const BREADCRUMBS_EVENT_TYPE = "im.vector.setting.breadcrumbs"; const BREADCRUMBS_EVENT_TYPES = [BREADCRUMBS_LEGACY_EVENT_TYPE, BREADCRUMBS_EVENT_TYPE]; const RECENT_EMOJI_EVENT_TYPE = "io.element.recent_emoji"; const INTEG_PROVISIONING_EVENT_TYPE = "im.vector.setting.integration_provisioning"; /** * Gets and sets settings at the "account" level for the current user. * This handler does not make use of the roomId parameter. */ class AccountSettingsHandler extends _MatrixClientBackedSettingsHandler.default { constructor(watchers /*: WatchManager*/ ) { super(); this.watchers /*:: */ = watchers /*:: */ ; (0, _defineProperty2.default)(this, "onAccountData", (event /*: MatrixEvent*/ , prevEvent /*: MatrixEvent*/ ) => { if (event.getType() === "org.matrix.preview_urls") { let val = event.getContent()['disable']; if (typeof val !== "boolean") { val = null; } else { val = !val; } this.watchers.notifyUpdate("urlPreviewsEnabled", null, _SettingLevel.SettingLevel.ACCOUNT, val); } else if (event.getType() === "im.vector.web.settings") { // Figure out what changed and fire those updates const prevContent = prevEvent ? prevEvent.getContent() : {}; const changedSettings = (0, _objects.objectKeyChanges)(prevContent, event.getContent()); for (const settingName of changedSettings) { const val = event.getContent()[settingName]; this.watchers.notifyUpdate(settingName, null, _SettingLevel.SettingLevel.ACCOUNT, val); } } else if (BREADCRUMBS_EVENT_TYPES.includes(event.getType())) { this.notifyBreadcrumbsUpdate(event); } else if (event.getType() === INTEG_PROVISIONING_EVENT_TYPE) { const val = event.getContent()['enabled']; this.watchers.notifyUpdate("integrationProvisioning", null, _SettingLevel.SettingLevel.ACCOUNT, val); } else if (event.getType() === RECENT_EMOJI_EVENT_TYPE) { const val = event.getContent()['enabled']; this.watchers.notifyUpdate("recent_emoji", null, _SettingLevel.SettingLevel.ACCOUNT, val); } }); } initMatrixClient(oldClient /*: MatrixClient*/ , newClient /*: MatrixClient*/ ) { if (oldClient) { oldClient.removeListener("accountData", this.onAccountData); } newClient.on("accountData", this.onAccountData); } getValue(settingName /*: string*/ , roomId /*: string*/ ) /*: any*/ { // Special case URL previews if (settingName === "urlPreviewsEnabled") { const content = this.getSettings("org.matrix.preview_urls") || {}; // Check to make sure that we actually got a boolean if (typeof content['disable'] !== "boolean") return null; return !content['disable']; } // Special case for breadcrumbs if (settingName === "breadcrumb_rooms") { let content = this.getSettings(BREADCRUMBS_EVENT_TYPE); if (!content || !content['recent_rooms']) { content = this.getSettings(BREADCRUMBS_LEGACY_EVENT_TYPE); // This is a bit of a hack, but it makes things slightly easier if (content) content['recent_rooms'] = content['rooms']; } return content && content['recent_rooms'] ? content['recent_rooms'] : []; } // Special case recent emoji if (settingName === "recent_emoji") { const content = this.getSettings(RECENT_EMOJI_EVENT_TYPE); return content ? content["recent_emoji"] : null; } // Special case integration manager provisioning if (settingName === "integrationProvisioning") { const content = this.getSettings(INTEG_PROVISIONING_EVENT_TYPE); return content ? content['enabled'] : null; } const settings = this.getSettings() || {}; let preferredValue = settings[settingName]; if (preferredValue === null || preferredValue === undefined) { // Honour the old setting on read only if (settingName === "hideAvatarChanges" || settingName === "hideDisplaynameChanges") { preferredValue = settings["hideAvatarDisplaynameChanges"]; } } return preferredValue; } setValue(settingName /*: string*/ , roomId /*: string*/ , newValue /*: any*/ ) /*: Promise<void>*/ { // Special case URL previews if (settingName === "urlPreviewsEnabled") { const content = this.getSettings("org.matrix.preview_urls") || {}; content['disable'] = !newValue; return _MatrixClientPeg.MatrixClientPeg.get().setAccountData("org.matrix.preview_urls", content); } // Special case for breadcrumbs if (settingName === "breadcrumb_rooms") { // We read the value first just to make sure we preserve whatever random keys might be present. let content = this.getSettings(BREADCRUMBS_EVENT_TYPE); if (!content || !content['recent_rooms']) { content = this.getSettings(BREADCRUMBS_LEGACY_EVENT_TYPE); } if (!content) content = {}; // If we still don't have content, make some content['recent_rooms'] = newValue; return _MatrixClientPeg.MatrixClientPeg.get().setAccountData(BREADCRUMBS_EVENT_TYPE, content); } // Special case recent emoji if (settingName === "recent_emoji") { const content = this.getSettings(RECENT_EMOJI_EVENT_TYPE) || {}; content["recent_emoji"] = newValue; return _MatrixClientPeg.MatrixClientPeg.get().setAccountData(RECENT_EMOJI_EVENT_TYPE, content); } // Special case integration manager provisioning if (settingName === "integrationProvisioning") { const content = this.getSettings(INTEG_PROVISIONING_EVENT_TYPE) || {}; content['enabled'] = newValue; return _MatrixClientPeg.MatrixClientPeg.get().setAccountData(INTEG_PROVISIONING_EVENT_TYPE, content); } const content = this.getSettings() || {}; content[settingName] = newValue; return _MatrixClientPeg.MatrixClientPeg.get().setAccountData("im.vector.web.settings", content); } canSetValue(settingName /*: string*/ , roomId /*: string*/ ) /*: boolean*/ { return true; // It's their account, so they should be able to } isSupported() /*: boolean*/ { const cli = _MatrixClientPeg.MatrixClientPeg.get(); return cli !== undefined && cli !== null && !cli.isGuest(); } getSettings(eventType = "im.vector.web.settings") /*: any*/ { // TODO: [TS] Types on return const cli = _MatrixClientPeg.MatrixClientPeg.get(); if (!cli) return null; const event = cli.getAccountData(eventType); if (!event || !event.getContent()) return null; return (0, _objects.objectClone)(event.getContent()); // clone to prevent mutation } notifyBreadcrumbsUpdate(event /*: MatrixEvent*/ ) { let val = []; if (event.getType() === BREADCRUMBS_LEGACY_EVENT_TYPE) { // This seems fishy - try and get the event for the new rooms const newType = this.getSettings(BREADCRUMBS_EVENT_TYPE); if (newType) val = newType['recent_rooms'];else val = event.getContent()['rooms']; } else if (event.getType() === BREADCRUMBS_EVENT_TYPE) { val = event.getContent()['recent_rooms']; } else { return; // for sanity, not because we expect to be here. } this.watchers.notifyUpdate("breadcrumb_rooms", null, _SettingLevel.SettingLevel.ACCOUNT, val || []); } } exports.default = AccountSettingsHandler; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9zZXR0aW5ncy9oYW5kbGVycy9BY2NvdW50U2V0dGluZ3NIYW5kbGVyLnRzIl0sIm5hbWVzIjpbIkJSRUFEQ1JVTUJTX0xFR0FDWV9FVkVOVF9UWVBFIiwiQlJFQURDUlVNQlNfRVZFTlRfVFlQRSIsIkJSRUFEQ1JVTUJTX0VWRU5UX1RZUEVTIiwiUkVDRU5UX0VNT0pJX0VWRU5UX1RZUEUiLCJJTlRFR19QUk9WSVNJT05JTkdfRVZFTlRfVFlQRSIsIkFjY291bnRTZXR0aW5nc0hhbmRsZXIiLCJNYXRyaXhDbGllbnRCYWNrZWRTZXR0aW5nc0hhbmRsZXIiLCJjb25zdHJ1Y3RvciIsIndhdGNoZXJzIiwiZXZlbnQiLCJwcmV2RXZlbnQiLCJnZXRUeXBlIiwidmFsIiwiZ2V0Q29udGVudCIsIm5vdGlmeVVwZGF0ZSIsIlNldHRpbmdMZXZlbCIsIkFDQ09VTlQiLCJwcmV2Q29udGVudCIsImNoYW5nZWRTZXR0aW5ncyIsInNldHRpbmdOYW1lIiwiaW5jbHVkZXMiLCJub3RpZnlCcmVhZGNydW1ic1VwZGF0ZSIsImluaXRNYXRyaXhDbGllbnQiLCJvbGRDbGllbnQiLCJuZXdDbGllbnQiLCJyZW1vdmVMaXN0ZW5lciIsIm9uQWNjb3VudERhdGEiLCJvbiIsImdldFZhbHVlIiwicm9vbUlkIiwiY29udGVudCIsImdldFNldHRpbmdzIiwic2V0dGluZ3MiLCJwcmVmZXJyZWRWYWx1ZSIsInVuZGVmaW5lZCIsInNldFZhbHVlIiwibmV3VmFsdWUiLCJNYXRyaXhDbGllbnRQZWciLCJnZXQiLCJzZXRBY2NvdW50RGF0YSIsImNhblNldFZhbHVlIiwiaXNTdXBwb3J0ZWQiLCJjbGkiLCJpc0d1ZXN0IiwiZXZlbnRUeXBlIiwiZ2V0QWNjb3VudERhdGEiLCJuZXdUeXBlIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7OztBQWlCQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFwQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FB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c0JBQXhCLEVBQWdEO0FBQ25EVyxNQUFBQSxHQUFHLEdBQUdILEtBQUssQ0FBQ0ksVUFBTixHQUFtQixjQUFuQixDQUFOO0FBQ0gsS0FGTSxNQUVBO0FBQ0gsYUFERyxDQUNLO0FBQ1g7O0FBQ0QsU0FBS0wsUUFBTCxDQUFjTSxZQUFkLENBQTJCLGtCQUEzQixFQUErQyxJQUEvQyxFQUFxREMsMkJBQWFDLE9BQWxFLEVBQTJFSixHQUFHLElBQUksRUFBbEY7QUFDSDs7QUFqS2lGIiwic291cmNlc0NvbnRlbnQiOlsiLypcbkNvcHlyaWdodCAyMDE3IFRyYXZpcyBSYWxzdG9uXG5Db3B5cmlnaHQgMjAxOSwgMjAyMCBUaGUgTWF0cml4Lm9yZyBGb3VuZGF0aW9uIEMuSS5DLlxuXG5MaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xueW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG5cbiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcblxuVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG5TZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG5saW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiovXG5cbmltcG9ydCB7TWF0cml4Q2xpZW50UGVnfSBmcm9tICcuLi8uLi9NYXRyaXhDbGllbnRQZWcnO1xuaW1wb3J0IE1hdHJpeENsaWVudEJhY2tlZFNldHRpbmdzSGFuZGxlciBmcm9tIFwiLi9NYXRyaXhDbGllbnRCYWNrZWRTZXR0aW5nc0hhbmRsZXJcIjtcbmltcG9ydCB7b2JqZWN0Q2xvbmUsIG9iamVjdEtleUNoYW5nZXN9IGZyb20gXCIuLi8uLi91dGlscy9vYmplY3RzXCI7XG5pbXBvcnQge1NldHRpbmdMZXZlbH0gZnJvbSBcIi4uL1NldHRpbmdMZXZlbFwiO1xuaW1wb3J0IHsgV2F0Y2hNYW5hZ2VyIH0gZnJvbSBcIi4uL1dhdGNoTWFuYWdlclwiO1xuaW1wb3J0IHsgTWF0cml4Q2xpZW50IH0gZnJvbSBcIm1hdHJpeC1qcy1zZGsvc3JjL2NsaWVudFwiO1xuaW1wb3J0IHsgTWF0cml4RXZlbnQgfSBmcm9tIFwibWF0cml4LWpzLXNkay9zcmMvbW9kZWxzL2V2ZW50XCI7XG5cbmNvbnN0IEJSRUFEQ1JVTUJTX0xFR0FDWV9FVkVOVF9UWVBFID0gXCJpbS52ZWN0b3IucmlvdC5icmVhZGNydW1iX3Jvb21zXCI7XG5jb25zdCBCUkVBRENSVU1CU19FVkVOVF9UWVBFID0gXCJpbS52ZWN0b3Iuc2V0dGluZy5icmVhZGNydW1ic1wiO1xuY29uc3QgQlJFQURDUlVNQlNfRVZFTlRfVFlQRVMgPSBbQlJFQURDUlVNQlNfTEVHQUNZX0VWRU5UX1RZUEUsIEJSRUFEQ1JVTUJTX0VWRU5UX1RZUEVdO1xuY29uc3QgUkVDRU5UX0VNT0pJX0VWRU5UX1RZUEUgPSBcImlvLmVsZW1lbnQucmVjZW50X2Vtb2ppXCI7XG5jb25zdCBJTlRFR19QUk9WSVNJT05JTkdfRVZFTlRfVFlQRSA9IFwiaW0udmVjdG9yLnNldHRpbmcuaW50ZWdyYXRpb25fcHJvdmlzaW9uaW5nXCI7XG5cbi8qKlxuICogR2V0cyBhbmQgc2V0cyBzZXR0aW5ncyBhdCB0aGUgXCJhY2NvdW50XCIgbGV2ZWwgZm9yIHRoZSBjdXJyZW50IHVzZXIuXG4gKiBUaGlzIGhhbmRsZXIgZG9lcyBub3QgbWFrZSB1c2Ugb2YgdGhlIHJvb21JZCBwYXJhbWV0ZXIuXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEFjY291bnRTZXR0aW5nc0hhbmRsZXIgZXh0ZW5kcyBNYXRyaXhDbGllbnRCYWNrZWRTZXR0aW5nc0hhbmRsZXIge1xuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgd2F0Y2hlcnM6IFdhdGNoTWFuYWdlcikge1xuICAgICAgICBzdXBlcigpO1xuICAgIH1cblxuICAgIHB1YmxpYyBpbml0TWF0cml4Q2xpZW50KG9sZENsaWVudDogTWF0cml4Q2xpZW50LCBuZXdDbGllbnQ6IE1hdHJpeENsaWVudCkge1xuICAgICAgICBpZiAob2xkQ2xpZW50KSB7XG4gICAgICAgICAgICBvbGRDbGllbnQucmVtb3ZlTGlzdGVuZXIoXCJhY2NvdW50RGF0YVwiLCB0aGlzLm9uQWNjb3VudERhdGEpO1xuICAgICAgICB9XG5cbiAgICAgICAgbmV3Q2xpZW50Lm9uKFwiYWNjb3VudERhdGFcIiwgdGhpcy5vbkFjY291bnREYXRhKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIG9uQWNjb3VudERhdGEgPSAoZXZlbnQ6IE1hdHJpeEV2ZW50LCBwcmV2RXZlbnQ6IE1hdHJpeEV2ZW50KSA9PiB7XG4gICAgICAgIGlmIChldmVudC5nZXRUeXBlKCkgPT09IFwib3JnLm1hdHJpeC5wcmV2aWV3X3VybHNcIikge1xuICAgICAgICAgICAgbGV0IHZhbCA9IGV2ZW50LmdldENvbnRlbnQoKVsnZGlzYWJsZSddO1xuICAgICAgICAgICAgaWYgKHR5cGVvZih2YWwpICE9PSBcImJvb2xlYW5cIikge1xuICAgICAgICAgICAgICAgIHZhbCA9IG51bGw7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHZhbCA9ICF2YWw7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMud2F0Y2hlcnMubm90aWZ5VXBkYXRlKFwidXJsUHJldmlld3NFbmFibGVkXCIsIG51bGwsIFNldHRpbmdMZXZlbC5BQ0NPVU5ULCB2YWwpO1xuICAgICAgICB9IGVsc2UgaWYgKGV2ZW50LmdldFR5cGUoKSA9PT0gXCJpbS52ZWN0b3Iud2ViLnNldHRpbmdzXCIpIHtcbiAgICAgICAgICAgIC8vIEZpZ3VyZSBvdXQgd2hhdCBjaGFuZ2VkIGFuZCBmaXJlIHRob3NlIHVwZGF0ZXNcbiAgICAgICAgICAgIGNvbnN0IHByZXZDb250ZW50ID0gcHJldkV2ZW50ID8gcHJldkV2ZW50LmdldENvbnRlbnQoKSA6IHt9O1xuICAgICAgICAgICAgY29uc3QgY2hhbmdlZFNldHRpbmdzID0gb2JqZWN0S2V5Q2hhbmdlczxSZWNvcmQ8c3RyaW5nLCBhbnk+PihwcmV2Q29udGVudCwgZXZlbnQuZ2V0Q29udGVudCgpKTtcbiAgICAgICAgICAgIGZvciAoY29uc3Qgc2V0dGluZ05hbWUgb2YgY2hhbmdlZFNldHRpbmdzKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdmFsID0gZXZlbnQuZ2V0Q29udGVudCgpW3NldHRpbmdOYW1lXTtcbiAgICAgICAgICAgICAgICB0aGlzLndhdGNoZXJzLm5vdGlmeVVwZGF0ZShzZXR0aW5nTmFtZSwgbnVsbCwgU2V0dGluZ0xldmVsLkFDQ09VTlQsIHZhbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoQlJFQURDUlVNQlNfRVZFTlRfVFlQRVMuaW5jbHVkZXMoZXZlbnQuZ2V0VHlwZSgpKSkge1xuICAgICAgICAgICAgdGhpcy5ub3RpZnlCcmVhZGNydW1ic1VwZGF0ZShldmVudCk7XG4gICAgICAgIH0gZWxzZSBpZiAoZXZlbnQuZ2V0VHlwZSgpID09PSBJTlRFR19QUk9WSVNJT05JTkdfRVZFTlRfVFlQRSkge1xuICAgICAgICAgICAgY29uc3QgdmFsID0gZXZlbnQuZ2V0Q29udGVudCgpWydlbmFibGVkJ107XG4gICAgICAgICAgICB0aGlzLndhdGNoZXJzLm5vdGlmeVVwZGF0ZShcImludGVncmF0aW9uUHJvdmlzaW9uaW5nXCIsIG51bGwsIFNldHRpbmdMZXZlbC5BQ0NPVU5ULCB2YWwpO1xuICAgICAgICB9IGVsc2UgaWYgKGV2ZW50LmdldFR5cGUoKSA9PT0gUkVDRU5UX0VNT0pJX0VWRU5UX1RZUEUpIHtcbiAgICAgICAgICAgIGNvbnN0IHZhbCA9IGV2ZW50LmdldENvbnRlbnQoKVsnZW5hYmxlZCddO1xuICAgICAgICAgICAgdGhpcy53YXRjaGVycy5ub3RpZnlVcGRhdGUoXCJyZWNlbnRfZW1vamlcIiwgbnVsbCwgU2V0dGluZ0xldmVsLkFDQ09VTlQsIHZhbCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0VmFsdWUoc2V0dGluZ05hbWU6IHN0cmluZywgcm9vbUlkOiBzdHJpbmcpOiBhbnkge1xuICAgICAgICAvLyBTcGVjaWFsIGNhc2UgVVJMIHByZXZpZXdzXG4gICAgICAgIGlmIChzZXR0aW5nTmFtZSA9PT0gXCJ1cmxQcmV2aWV3c0VuYWJsZWRcIikge1xuICAgICAgICAgICAgY29uc3QgY29udGVudCA9IHRoaXMuZ2V0U2V0dGluZ3MoXCJvcmcubWF0cml4LnByZXZpZXdfdXJsc1wiKSB8fCB7fTtcblxuICAgICAgICAgICAgLy8gQ2hlY2sgdG8gbWFrZSBzdXJlIHRoYXQgd2UgYWN0dWFsbHkgZ290IGEgYm9vbGVhblxuICAgICAgICAgICAgaWYgKHR5cGVvZihjb250ZW50WydkaXNhYmxlJ10pICE9PSBcImJvb2xlYW5cIikgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICByZXR1cm4gIWNvbnRlbnRbJ2Rpc2FibGUnXTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFNwZWNpYWwgY2FzZSBmb3IgYnJlYWRjcnVtYnNcbiAgICAgICAgaWYgKHNldHRpbmdOYW1lID09PSBcImJyZWFkY3J1bWJfcm9vbXNcIikge1xuICAgICAgICAgICAgbGV0IGNvbnRlbnQgPSB0aGlzLmdldFNldHRpbmdzKEJSRUFEQ1JVTUJTX0VWRU5UX1RZUEUpO1xuICAgICAgICAgICAgaWYgKCFjb250ZW50IHx8ICFjb250ZW50WydyZWNlbnRfcm9vbXMnXSkge1xuICAgICAgICAgICAgICAgIGNvbnRlbnQgPSB0aGlzLmdldFNldHRpbmdzKEJSRUFEQ1JVTUJTX0xFR0FDWV9FVkVOVF9UWVBFKTtcblxuICAgICAgICAgICAgICAgIC8vIFRoaXMgaXMgYSBiaXQgb2YgYSBoYWNrLCBidXQgaXQgbWFrZXMgdGhpbmdzIHNsaWdodGx5IGVhc2llclxuICAgICAgICAgICAgICAgIGlmIChjb250ZW50KSBjb250ZW50WydyZWNlbnRfcm9vbXMnXSA9IGNvbnRlbnRbJ3Jvb21zJ107XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBjb250ZW50ICYmIGNvbnRlbnRbJ3JlY2VudF9yb29tcyddID8gY29udGVudFsncmVjZW50X3Jvb21zJ10gOiBbXTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFNwZWNpYWwgY2FzZSByZWNlbnQgZW1vamlcbiAgICAgICAgaWYgKHNldHRpbmdOYW1lID09PSBcInJlY2VudF9lbW9qaVwiKSB7XG4gICAgICAgICAgICBjb25zdCBjb250ZW50ID0gdGhpcy5nZXRTZXR0aW5ncyhSRUNFTlRfRU1PSklfRVZFTlRfVFlQRSk7XG4gICAgICAgICAgICByZXR1cm4gY29udGVudCA/IGNvbnRlbnRbXCJyZWNlbnRfZW1vamlcIl0gOiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gU3BlY2lhbCBjYXNlIGludGVncmF0aW9uIG1hbmFnZXIgcHJvdmlzaW9uaW5nXG4gICAgICAgIGlmIChzZXR0aW5nTmFtZSA9PT0gXCJpbnRlZ3JhdGlvblByb3Zpc2lvbmluZ1wiKSB7XG4gICAgICAgICAgICBjb25zdCBjb250ZW50ID0gdGhpcy5nZXRTZXR0aW5ncyhJTlRFR19QUk9WSVNJT05JTkdfRVZFTlRfVFlQRSk7XG4gICAgICAgICAgICByZXR1cm4gY29udGVudCA/IGNvbnRlbnRbJ2VuYWJsZWQnXSA6IG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBzZXR0aW5ncyA9IHRoaXMuZ2V0U2V0dGluZ3MoKSB8fCB7fTtcbiAgICAgICAgbGV0IHByZWZlcnJlZFZhbHVlID0gc2V0dGluZ3Nbc2V0dGluZ05hbWVdO1xuXG4gICAgICAgIGlmIChwcmVmZXJyZWRWYWx1ZSA9PT0gbnVsbCB8fCBwcmVmZXJyZWRWYWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAvLyBIb25vdXIgdGhlIG9sZCBzZXR0aW5nIG9uIHJlYWQgb25seVxuICAgICAgICAgICAgaWYgKHNldHRpbmdOYW1lID09PSBcImhpZGVBdmF0YXJDaGFuZ2VzXCIgfHwgc2V0dGluZ05hbWUgPT09IFwiaGlkZURpc3BsYXluYW1lQ2hhbmdlc1wiKSB7XG4gICAgICAgICAgICAgICAgcHJlZmVycmVkVmFsdWUgPSBzZXR0aW5nc1tcImhpZGVBdmF0YXJEaXNwbGF5bmFtZUNoYW5nZXNcIl07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcHJlZmVycmVkVmFsdWU7XG4gICAgfVxuXG4gICAgcHVibGljIHNldFZhbHVlKHNldHRpbmdOYW1lOiBzdHJpbmcsIHJvb21JZDogc3RyaW5nLCBuZXdWYWx1ZTogYW55KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIC8vIFNwZWNpYWwgY2FzZSBVUkwgcHJldmlld3NcbiAgICAgICAgaWYgKHNldHRpbmdOYW1lID09PSBcInVybFByZXZpZXdzRW5hYmxlZFwiKSB7XG4gICAgICAgICAgICBjb25zdCBjb250ZW50ID0gdGhpcy5nZXRTZXR0aW5ncyhcIm9yZy5tYXRyaXgucHJldmlld191cmxzXCIpIHx8IHt9O1xuICAgICAgICAgICAgY29udGVudFsnZGlzYWJsZSddID0gIW5ld1ZhbHVlO1xuICAgICAgICAgICAgcmV0dXJuIE1hdHJpeENsaWVudFBlZy5nZXQoKS5zZXRBY2NvdW50RGF0YShcIm9yZy5tYXRyaXgucHJldmlld191cmxzXCIsIGNvbnRlbnQpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gU3BlY2lhbCBjYXNlIGZvciBicmVhZGNydW1ic1xuICAgICAgICBpZiAoc2V0dGluZ05hbWUgPT09IFwiYnJlYWRjcnVtYl9yb29tc1wiKSB7XG4gICAgICAgICAgICAvLyBXZSByZWFkIHRoZSB2YWx1ZSBmaXJzdCBqdXN0IHRvIG1ha2Ugc3VyZSB3ZSBwcmVzZXJ2ZSB3aGF0ZXZlciByYW5kb20ga2V5cyBtaWdodCBiZSBwcmVzZW50LlxuICAgICAgICAgICAgbGV0IGNvbnRlbnQgPSB0aGlzLmdldFNldHRpbmdzKEJSRUFEQ1JVTUJTX0VWRU5UX1RZUEUpO1xuICAgICAgICAgICAgaWYgKCFjb250ZW50IHx8ICFjb250ZW50WydyZWNlbnRfcm9vbXMnXSkge1xuICAgICAgICAgICAgICAgIGNvbnRlbnQgPSB0aGlzLmdldFNldHRpbmdzKEJSRUFEQ1JVTUJTX0xFR0FDWV9FVkVOVF9UWVBFKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghY29udGVudCkgY29udGVudCA9IHt9OyAvLyBJZiB3ZSBzdGlsbCBkb24ndCBoYXZlIGNvbnRlbnQsIG1ha2Ugc29tZVxuXG4gICAgICAgICAgICBjb250ZW50WydyZWNlbnRfcm9vbXMnXSA9IG5ld1ZhbHVlO1xuICAgICAgICAgICAgcmV0dXJuIE1hdHJpeENsaWVudFBlZy5nZXQoKS5zZXRBY2NvdW50RGF0YShCUkVBRENSVU1CU19FVkVOVF9UWVBFLCBjb250ZW50KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFNwZWNpYWwgY2FzZSByZWNlbnQgZW1vamlcbiAgICAgICAgaWYgKHNldHRpbmdOYW1lID09PSBcInJlY2VudF9lbW9qaVwiKSB7XG4gICAgICAgICAgICBjb25zdCBjb250ZW50ID0gdGhpcy5nZXRTZXR0aW5ncyhSRUNFTlRfRU1PSklfRVZFTlRfVFlQRSkgfHwge307XG4gICAgICAgICAgICBjb250ZW50W1wicmVjZW50X2Vtb2ppXCJdID0gbmV3VmFsdWU7XG4gICAgICAgICAgICByZXR1cm4gTWF0cml4Q2xpZW50UGVnLmdldCgpLnNldEFjY291bnREYXRhKFJFQ0VOVF9FTU9KSV9FVkVOVF9UWVBFLCBjb250ZW50KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFNwZWNpYWwgY2FzZSBpbnRlZ3JhdGlvbiBtYW5hZ2VyIHByb3Zpc2lvbmluZ1xuICAgICAgICBpZiAoc2V0dGluZ05hbWUgPT09IFwiaW50ZWdyYXRpb25Qcm92aXNpb25pbmdcIikge1xuICAgICAgICAgICAgY29uc3QgY29udGVudCA9IHRoaXMuZ2V0U2V0dGluZ3MoSU5URUdfUFJPVklTSU9OSU5HX0VWRU5UX1RZUEUpIHx8IHt9O1xuICAgICAgICAgICAgY29udGVudFsnZW5hYmxlZCddID0gbmV3VmFsdWU7XG4gICAgICAgICAgICByZXR1cm4gTWF0cml4Q2xpZW50UGVnLmdldCgpLnNldEFjY291bnREYXRhKElOVEVHX1BST1ZJU0lPTklOR19FVkVOVF9UWVBFLCBjb250ZW50KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGNvbnRlbnQgPSB0aGlzLmdldFNldHRpbmdzKCkgfHwge307XG4gICAgICAgIGNvbnRlbnRbc2V0dGluZ05hbWVdID0gbmV3VmFsdWU7XG4gICAgICAgIHJldHVybiBNYXRyaXhDbGllbnRQZWcuZ2V0KCkuc2V0QWNjb3VudERhdGEoXCJpbS52ZWN0b3Iud2ViLnNldHRpbmdzXCIsIGNvbnRlbnQpO1xuICAgIH1cblxuICAgIHB1YmxpYyBjYW5TZXRWYWx1ZShzZXR0aW5nTmFtZTogc3RyaW5nLCByb29tSWQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdHJ1ZTsgLy8gSXQncyB0aGVpciBhY2NvdW50LCBzbyB0aGV5IHNob3VsZCBiZSBhYmxlIHRvXG4gICAgfVxuXG4gICAgcHVibGljIGlzU3VwcG9ydGVkKCk6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCBjbGkgPSBNYXRyaXhDbGllbnRQZWcuZ2V0KCk7XG4gICAgICAgIHJldHVybiBjbGkgIT09IHVuZGVmaW5lZCAmJiBjbGkgIT09IG51bGwgJiYgIWNsaS5pc0d1ZXN0KCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRTZXR0aW5ncyhldmVudFR5cGUgPSBcImltLnZlY3Rvci53ZWIuc2V0dGluZ3NcIik6IGFueSB7IC8vIFRPRE86IFtUU10gVHlwZXMgb24gcmV0dXJuXG4gICAgICAgIGNvbnN0IGNsaSA9IE1hdHJpeENsaWVudFBlZy5nZXQoKTtcbiAgICAgICAgaWYgKCFjbGkpIHJldHVybiBudWxsO1xuXG4gICAgICAgIGNvbnN0IGV2ZW50ID0gY2xpLmdldEFjY291bnREYXRhKGV2ZW50VHlwZSk7XG4gICAgICAgIGlmICghZXZlbnQgfHwgIWV2ZW50LmdldENvbnRlbnQoKSkgcmV0dXJuIG51bGw7XG4gICAgICAgIHJldHVybiBvYmplY3RDbG9uZShldmVudC5nZXRDb250ZW50KCkpOyAvLyBjbG9uZSB0byBwcmV2ZW50IG11dGF0aW9uXG4gICAgfVxuXG4gICAgcHJpdmF0ZSBub3RpZnlCcmVhZGNydW1ic1VwZGF0ZShldmVudDogTWF0cml4RXZlbnQpIHtcbiAgICAgICAgbGV0IHZhbCA9IFtdO1xuICAgICAgICBpZiAoZXZlbnQuZ2V0VHlwZSgpID09PSBCUkVBRENSVU1CU19MRUdBQ1lfRVZFTlRfVFlQRSkge1xuICAgICAgICAgICAgLy8gVGhpcyBzZWVtcyBmaXNoeSAtIHRyeSBhbmQgZ2V0IHRoZSBldmVudCBmb3IgdGhlIG5ldyByb29tc1xuICAgICAgICAgICAgY29uc3QgbmV3VHlwZSA9IHRoaXMuZ2V0U2V0dGluZ3MoQlJFQURDUlVNQlNfRVZFTlRfVFlQRSk7XG4gICAgICAgICAgICBpZiAobmV3VHlwZSkgdmFsID0gbmV3VHlwZVsncmVjZW50X3Jvb21zJ107XG4gICAgICAgICAgICBlbHNlIHZhbCA9IGV2ZW50LmdldENvbnRlbnQoKVsncm9vbXMnXTtcbiAgICAgICAgfSBlbHNlIGlmIChldmVudC5nZXRUeXBlKCkgPT09IEJSRUFEQ1JVTUJTX0VWRU5UX1RZUEUpIHtcbiAgICAgICAgICAgIHZhbCA9IGV2ZW50LmdldENvbnRlbnQoKVsncmVjZW50X3Jvb21zJ107XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm47IC8vIGZvciBzYW5pdHksIG5vdCBiZWNhdXNlIHdlIGV4cGVjdCB0byBiZSBoZXJlLlxuICAgICAgICB9XG4gICAgICAgIHRoaXMud2F0Y2hlcnMubm90aWZ5VXBkYXRlKFwiYnJlYWRjcnVtYl9yb29tc1wiLCBudWxsLCBTZXR0aW5nTGV2ZWwuQUNDT1VOVCwgdmFsIHx8IFtdKTtcbiAgICB9XG59XG4iXX0=