UNPKG

matrix-react-sdk

Version:
277 lines (273 loc) 61.1 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 _react = _interopRequireWildcard(require("react")); var _languageHandler = require("../../../../../languageHandler"); var _SettingsStore = _interopRequireDefault(require("../../../../../settings/SettingsStore")); var _Field = _interopRequireDefault(require("../../../elements/Field")); var _Dropdown = _interopRequireDefault(require("../../../elements/Dropdown")); var _SettingLevel = require("../../../../../settings/SettingLevel"); var _SettingsFlag = _interopRequireDefault(require("../../../elements/SettingsFlag")); var _AccessibleButton = _interopRequireDefault(require("../../../elements/AccessibleButton")); var _dispatcher = _interopRequireDefault(require("../../../../../dispatcher/dispatcher")); var _UserTab = require("../../../dialogs/UserTab"); var _actions = require("../../../../../dispatcher/actions"); var _SdkConfig = _interopRequireDefault(require("../../../../../SdkConfig")); var _UserOnboardingPage = require("../../../user-onboarding/UserOnboardingPage"); var _SettingsSubsection = _interopRequireDefault(require("../../shared/SettingsSubsection")); var _SettingsTab = _interopRequireDefault(require("../SettingsTab")); var _SettingsSection = require("../../shared/SettingsSection"); var _LanguageDropdown = _interopRequireDefault(require("../../../elements/LanguageDropdown")); var _PlatformPeg = _interopRequireDefault(require("../../../../../PlatformPeg")); var _Keyboard = require("../../../../../Keyboard"); var _SpellCheckSettings = _interopRequireDefault(require("../../SpellCheckSettings")); var _LabelledToggleSwitch = _interopRequireDefault(require("../../../elements/LabelledToggleSwitch")); var TimezoneHandler = _interopRequireWildcard(require("../../../../../TimezoneHandler")); function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); } function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; } /* Copyright 2024 New Vector Ltd. Copyright 2019-2023 The Matrix.org Foundation C.I.C. Copyright 2019 Michael Telatynski <7t3chguy@gmail.com> SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only Please see LICENSE files in the repository root for full details. */ const LanguageSection = () => { const [language, setLanguage] = (0, _react.useState)((0, _languageHandler.getCurrentLanguage)()); const onLanguageChange = (0, _react.useCallback)(newLanguage => { if (language === newLanguage) return; _SettingsStore.default.setValue("language", null, _SettingLevel.SettingLevel.DEVICE, newLanguage); setLanguage(newLanguage); const platform = _PlatformPeg.default.get(); if (platform) { platform.setLanguage([newLanguage]); platform.reload(); } }, [language]); return /*#__PURE__*/_react.default.createElement("div", { className: "mx_SettingsSubsection_dropdown" }, (0, _languageHandler._t)("settings|general|application_language"), /*#__PURE__*/_react.default.createElement(_LanguageDropdown.default, { onOptionChange: onLanguageChange, value: language }), /*#__PURE__*/_react.default.createElement("div", { className: "mx_PreferencesUserSettingsTab_section_hint" }, (0, _languageHandler._t)("settings|general|application_language_reload_hint"))); }; const SpellCheckSection = () => { const [spellCheckEnabled, setSpellCheckEnabled] = (0, _react.useState)(); const [spellCheckLanguages, setSpellCheckLanguages] = (0, _react.useState)(); (0, _react.useEffect)(() => { (async () => { const plaf = _PlatformPeg.default.get(); const [enabled, langs] = await Promise.all([plaf?.getSpellCheckEnabled(), plaf?.getSpellCheckLanguages()]); setSpellCheckEnabled(enabled); setSpellCheckLanguages(langs || undefined); })(); }, []); const onSpellCheckEnabledChange = (0, _react.useCallback)(enabled => { setSpellCheckEnabled(enabled); _PlatformPeg.default.get()?.setSpellCheckEnabled(enabled); }, []); const onSpellCheckLanguagesChange = (0, _react.useCallback)(languages => { setSpellCheckLanguages(languages); _PlatformPeg.default.get()?.setSpellCheckLanguages(languages); }, []); if (!_PlatformPeg.default.get()?.supportsSpellCheckSettings()) return null; return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement(_LabelledToggleSwitch.default, { label: (0, _languageHandler._t)("settings|general|allow_spellcheck"), value: Boolean(spellCheckEnabled), onChange: onSpellCheckEnabledChange }), spellCheckEnabled && spellCheckLanguages !== undefined && !_Keyboard.IS_MAC && /*#__PURE__*/_react.default.createElement(_SpellCheckSettings.default, { languages: spellCheckLanguages, onLanguagesChange: onSpellCheckLanguagesChange })); }; class PreferencesUserSettingsTab extends _react.default.Component { constructor(props) { super(props); (0, _defineProperty2.default)(this, "onTimezoneChange", tz => { this.setState({ timezone: tz }); TimezoneHandler.setUserTimezone(tz); }); /** * If present filter the time zones matching the search term */ (0, _defineProperty2.default)(this, "onTimezoneSearchChange", search => { const timezoneSearch = search.toLowerCase(); const timezones = timezoneSearch ? TimezoneHandler.getAllTimezones().filter(tz => { return tz.toLowerCase().includes(timezoneSearch); }) : TimezoneHandler.getAllTimezones(); this.setState({ timezones, timezoneSearch }); }); (0, _defineProperty2.default)(this, "onAutocompleteDelayChange", e => { this.setState({ autocompleteDelay: e.target.value }); _SettingsStore.default.setValue("autocompleteDelay", null, _SettingLevel.SettingLevel.DEVICE, e.target.value); }); (0, _defineProperty2.default)(this, "onReadMarkerInViewThresholdMs", e => { this.setState({ readMarkerInViewThresholdMs: e.target.value }); _SettingsStore.default.setValue("readMarkerInViewThresholdMs", null, _SettingLevel.SettingLevel.DEVICE, e.target.value); }); (0, _defineProperty2.default)(this, "onReadMarkerOutOfViewThresholdMs", e => { this.setState({ readMarkerOutOfViewThresholdMs: e.target.value }); _SettingsStore.default.setValue("readMarkerOutOfViewThresholdMs", null, _SettingLevel.SettingLevel.DEVICE, e.target.value); }); (0, _defineProperty2.default)(this, "onKeyboardShortcutsClicked", () => { _dispatcher.default.dispatch({ action: _actions.Action.ViewUserSettings, initialTabId: _UserTab.UserTab.Keyboard }); }); this.state = { timezone: TimezoneHandler.getUserTimezone(), timezones: TimezoneHandler.getAllTimezones(), timezoneSearch: undefined, autocompleteDelay: _SettingsStore.default.getValueAt(_SettingLevel.SettingLevel.DEVICE, "autocompleteDelay").toString(10), readMarkerInViewThresholdMs: _SettingsStore.default.getValueAt(_SettingLevel.SettingLevel.DEVICE, "readMarkerInViewThresholdMs").toString(10), readMarkerOutOfViewThresholdMs: _SettingsStore.default.getValueAt(_SettingLevel.SettingLevel.DEVICE, "readMarkerOutOfViewThresholdMs").toString(10) }; } renderGroup(settingIds, level = _SettingLevel.SettingLevel.ACCOUNT) { return settingIds.map(i => /*#__PURE__*/_react.default.createElement(_SettingsFlag.default, { key: i, name: i, level: level })); } render() { const useCase = _SettingsStore.default.getValue("FTUE.useCaseSelection"); const roomListSettings = PreferencesUserSettingsTab.ROOM_LIST_SETTINGS // Only show the user onboarding setting if the user should see the user onboarding page .filter(it => it !== "FTUE.userOnboardingButton" || (0, _UserOnboardingPage.showUserOnboardingPage)(useCase)); const browserTimezoneLabel = (0, _languageHandler._t)("settings|preferences|default_timezone", { timezone: TimezoneHandler.shortBrowserTimezone() }); // Always Preprend the default option const timezones = this.state.timezones.map(tz => { return /*#__PURE__*/_react.default.createElement("div", { key: tz }, tz); }); timezones.unshift( /*#__PURE__*/_react.default.createElement("div", { key: "" }, browserTimezoneLabel)); return /*#__PURE__*/_react.default.createElement(_SettingsTab.default, { "data-testid": "mx_PreferencesUserSettingsTab" }, /*#__PURE__*/_react.default.createElement(_SettingsSection.SettingsSection, null, /*#__PURE__*/_react.default.createElement(_SettingsSubsection.default, { heading: (0, _languageHandler._t)("settings|general|language_section") }, /*#__PURE__*/_react.default.createElement(LanguageSection, null), /*#__PURE__*/_react.default.createElement(SpellCheckSection, null)), roomListSettings.length > 0 && /*#__PURE__*/_react.default.createElement(_SettingsSubsection.default, { heading: (0, _languageHandler._t)("settings|preferences|room_list_heading") }, this.renderGroup(roomListSettings)), /*#__PURE__*/_react.default.createElement(_SettingsSubsection.default, { heading: (0, _languageHandler._t)("common|spaces") }, this.renderGroup(PreferencesUserSettingsTab.SPACES_SETTINGS, _SettingLevel.SettingLevel.ACCOUNT)), /*#__PURE__*/_react.default.createElement(_SettingsSubsection.default, { heading: (0, _languageHandler._t)("settings|preferences|keyboard_heading"), description: (0, _languageHandler._t)("settings|preferences|keyboard_view_shortcuts_button", {}, { a: sub => /*#__PURE__*/_react.default.createElement(_AccessibleButton.default, { kind: "link_inline", onClick: this.onKeyboardShortcutsClicked }, sub) }) }, this.renderGroup(PreferencesUserSettingsTab.KEYBINDINGS_SETTINGS)), /*#__PURE__*/_react.default.createElement(_SettingsSubsection.default, { heading: (0, _languageHandler._t)("settings|preferences|time_heading") }, /*#__PURE__*/_react.default.createElement("div", { className: "mx_SettingsSubsection_dropdown" }, (0, _languageHandler._t)("settings|preferences|user_timezone"), /*#__PURE__*/_react.default.createElement(_Dropdown.default, { id: "mx_dropdownUserTimezone", className: "mx_dropdownUserTimezone", "data-testid": "mx_dropdownUserTimezone", searchEnabled: true, value: this.state.timezone, label: (0, _languageHandler._t)("settings|preferences|user_timezone"), placeholder: browserTimezoneLabel, onOptionChange: this.onTimezoneChange, onSearchChange: this.onTimezoneSearchChange }, timezones)), this.renderGroup(PreferencesUserSettingsTab.TIME_SETTINGS), /*#__PURE__*/_react.default.createElement(_SettingsFlag.default, { name: "userTimezonePublish", level: _SettingLevel.SettingLevel.DEVICE })), /*#__PURE__*/_react.default.createElement(_SettingsSubsection.default, { heading: (0, _languageHandler._t)("common|presence"), description: (0, _languageHandler._t)("settings|preferences|presence_description") }, this.renderGroup(PreferencesUserSettingsTab.PRESENCE_SETTINGS)), /*#__PURE__*/_react.default.createElement(_SettingsSubsection.default, { heading: (0, _languageHandler._t)("settings|preferences|composer_heading") }, this.renderGroup(PreferencesUserSettingsTab.COMPOSER_SETTINGS)), /*#__PURE__*/_react.default.createElement(_SettingsSubsection.default, { heading: (0, _languageHandler._t)("settings|preferences|code_blocks_heading") }, this.renderGroup(PreferencesUserSettingsTab.CODE_BLOCKS_SETTINGS)), /*#__PURE__*/_react.default.createElement(_SettingsSubsection.default, { heading: (0, _languageHandler._t)("settings|preferences|media_heading") }, this.renderGroup(PreferencesUserSettingsTab.IMAGES_AND_VIDEOS_SETTINGS)), /*#__PURE__*/_react.default.createElement(_SettingsSubsection.default, { heading: (0, _languageHandler._t)("common|timeline") }, this.renderGroup(PreferencesUserSettingsTab.TIMELINE_SETTINGS)), /*#__PURE__*/_react.default.createElement(_SettingsSubsection.default, { heading: (0, _languageHandler._t)("settings|preferences|room_directory_heading") }, this.renderGroup(PreferencesUserSettingsTab.ROOM_DIRECTORY_SETTINGS)), /*#__PURE__*/_react.default.createElement(_SettingsSubsection.default, { heading: (0, _languageHandler._t)("common|general"), stretchContent: true }, this.renderGroup(PreferencesUserSettingsTab.GENERAL_SETTINGS), /*#__PURE__*/_react.default.createElement(_SettingsFlag.default, { name: "Electron.showTrayIcon", level: _SettingLevel.SettingLevel.PLATFORM, hideIfCannotSet: true }), /*#__PURE__*/_react.default.createElement(_SettingsFlag.default, { name: "Electron.enableHardwareAcceleration", level: _SettingLevel.SettingLevel.PLATFORM, hideIfCannotSet: true, label: (0, _languageHandler._t)("settings|preferences|Electron.enableHardwareAcceleration", { appName: _SdkConfig.default.get().brand }) }), /*#__PURE__*/_react.default.createElement(_SettingsFlag.default, { name: "Electron.alwaysShowMenuBar", level: _SettingLevel.SettingLevel.PLATFORM, hideIfCannotSet: true }), /*#__PURE__*/_react.default.createElement(_SettingsFlag.default, { name: "Electron.autoLaunch", level: _SettingLevel.SettingLevel.PLATFORM, hideIfCannotSet: true }), /*#__PURE__*/_react.default.createElement(_SettingsFlag.default, { name: "Electron.warnBeforeExit", level: _SettingLevel.SettingLevel.PLATFORM, hideIfCannotSet: true }), /*#__PURE__*/_react.default.createElement(_Field.default, { label: (0, _languageHandler._t)("settings|preferences|autocomplete_delay"), type: "number", value: this.state.autocompleteDelay, onChange: this.onAutocompleteDelayChange }), /*#__PURE__*/_react.default.createElement(_Field.default, { label: (0, _languageHandler._t)("settings|preferences|rm_lifetime"), type: "number", value: this.state.readMarkerInViewThresholdMs, onChange: this.onReadMarkerInViewThresholdMs }), /*#__PURE__*/_react.default.createElement(_Field.default, { label: (0, _languageHandler._t)("settings|preferences|rm_lifetime_offscreen"), type: "number", value: this.state.readMarkerOutOfViewThresholdMs, onChange: this.onReadMarkerOutOfViewThresholdMs })))); } } exports.default = PreferencesUserSettingsTab; (0, _defineProperty2.default)(PreferencesUserSettingsTab, "ROOM_LIST_SETTINGS", ["breadcrumbs", "FTUE.userOnboardingButton"]); (0, _defineProperty2.default)(PreferencesUserSettingsTab, "SPACES_SETTINGS", ["Spaces.allRoomsInHome"]); (0, _defineProperty2.default)(PreferencesUserSettingsTab, "KEYBINDINGS_SETTINGS", ["ctrlFForSearch"]); (0, _defineProperty2.default)(PreferencesUserSettingsTab, "PRESENCE_SETTINGS", ["sendReadReceipts", "sendTypingNotifications"]); (0, _defineProperty2.default)(PreferencesUserSettingsTab, "COMPOSER_SETTINGS", ["MessageComposerInput.autoReplaceEmoji", "MessageComposerInput.useMarkdown", "MessageComposerInput.suggestEmoji", "MessageComposerInput.ctrlEnterToSend", "MessageComposerInput.surroundWith", "MessageComposerInput.showStickersButton", "MessageComposerInput.insertTrailingColon"]); (0, _defineProperty2.default)(PreferencesUserSettingsTab, "TIME_SETTINGS", ["showTwelveHourTimestamps", "alwaysShowTimestamps"]); (0, _defineProperty2.default)(PreferencesUserSettingsTab, "CODE_BLOCKS_SETTINGS", ["enableSyntaxHighlightLanguageDetection", "expandCodeByDefault", "showCodeLineNumbers"]); (0, _defineProperty2.default)(PreferencesUserSettingsTab, "IMAGES_AND_VIDEOS_SETTINGS", ["urlPreviewsEnabled", "autoplayGifs", "autoplayVideo", "showImages"]); (0, _defineProperty2.default)(PreferencesUserSettingsTab, "TIMELINE_SETTINGS", ["showTypingNotifications", "showRedactions", "showReadReceipts", "showJoinLeaves", "showDisplaynameChanges", "showChatEffects", "showAvatarChanges", "Pill.shouldShowPillAvatar", "TextualBody.enableBigEmoji", "scrollToBottomOnMessageSent", "useOnlyCurrentProfiles"]); (0, _defineProperty2.default)(PreferencesUserSettingsTab, "ROOM_DIRECTORY_SETTINGS", ["SpotlightSearch.showNsfwPublicRooms"]); (0, _defineProperty2.default)(PreferencesUserSettingsTab, "GENERAL_SETTINGS", ["promptBeforeInviteUnknownUsers" // Start automatically after startup (electron-only) // Autocomplete delay (niche text box) ]); //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCIsInJlcXVpcmUiLCJfbGFuZ3VhZ2VIYW5kbGVyIiwiX1NldHRpbmdzU3RvcmUiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwiX0ZpZWxkIiwiX0Ryb3Bkb3duIiwiX1NldHRpbmdMZXZlbCIsIl9TZXR0aW5nc0ZsYWciLCJfQWNjZXNzaWJsZUJ1dHRvbiIsIl9kaXNwYXRjaGVyIiwiX1VzZXJUYWIiLCJfYWN0aW9ucyIsIl9TZGtDb25maWciLCJfVXNlck9uYm9hcmRpbmdQYWdlIiwiX1NldHRpbmdzU3Vic2VjdGlvbiIsIl9TZXR0aW5nc1RhYiIsIl9TZXR0aW5nc1NlY3Rpb24iLCJfTGFuZ3VhZ2VEcm9wZG93biIsIl9QbGF0Zm9ybVBlZyIsIl9LZXlib2FyZCIsIl9TcGVsbENoZWNrU2V0dGluZ3MiLCJfTGFiZWxsZWRUb2dnbGVTd2l0Y2giLCJUaW1lem9uZUhhbmRsZXIiLCJfZ2V0UmVxdWlyZVdpbGRjYXJkQ2FjaGUiLCJlIiwiV2Vha01hcCIsInIiLCJ0IiwiX19lc01vZHVsZSIsImRlZmF1bHQiLCJoYXMiLCJnZXQiLCJuIiwiX19wcm90b19fIiwiYSIsIk9iamVjdCIsImRlZmluZVByb3BlcnR5IiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwidSIsImhhc093blByb3BlcnR5IiwiY2FsbCIsImkiLCJzZXQiLCJMYW5ndWFnZVNlY3Rpb24iLCJsYW5ndWFnZSIsInNldExhbmd1YWdlIiwidXNlU3RhdGUiLCJnZXRDdXJyZW50TGFuZ3VhZ2UiLCJvbkxhbmd1YWdlQ2hhbmdlIiwidXNlQ2FsbGJhY2siLCJuZXdMYW5ndWFnZSIsIlNldHRpbmdzU3RvcmUiLCJzZXRWYWx1ZSIsIlNldHRpbmdMZXZlbCIsIkRFVklDRSIsInBsYXRmb3JtIiwiUGxhdGZvcm1QZWciLCJyZWxvYWQiLCJjcmVhdGVFbGVtZW50IiwiY2xhc3NOYW1lIiwiX3QiLCJvbk9wdGlvbkNoYW5nZSIsInZhbHVlIiwiU3BlbGxDaGVja1NlY3Rpb24iLCJzcGVsbENoZWNrRW5hYmxlZCIsInNldFNwZWxsQ2hlY2tFbmFibGVkIiwic3BlbGxDaGVja0xhbmd1YWdlcyIsInNldFNwZWxsQ2hlY2tMYW5ndWFnZXMiLCJ1c2VFZmZlY3QiLCJwbGFmIiwiZW5hYmxlZCIsImxhbmdzIiwiUHJvbWlzZSIsImFsbCIsImdldFNwZWxsQ2hlY2tFbmFibGVkIiwiZ2V0U3BlbGxDaGVja0xhbmd1YWdlcyIsInVuZGVmaW5lZCIsIm9uU3BlbGxDaGVja0VuYWJsZWRDaGFuZ2UiLCJvblNwZWxsQ2hlY2tMYW5ndWFnZXNDaGFuZ2UiLCJsYW5ndWFnZXMiLCJzdXBwb3J0c1NwZWxsQ2hlY2tTZXR0aW5ncyIsIkZyYWdtZW50IiwibGFiZWwiLCJCb29sZWFuIiwib25DaGFuZ2UiLCJJU19NQUMiLCJvbkxhbmd1YWdlc0NoYW5nZSIsIlByZWZlcmVuY2VzVXNlclNldHRpbmdzVGFiIiwiUmVhY3QiLCJDb21wb25lbnQiLCJjb25zdHJ1Y3RvciIsInByb3BzIiwiX2RlZmluZVByb3BlcnR5MiIsInR6Iiwic2V0U3RhdGUiLCJ0aW1lem9uZSIsInNldFVzZXJUaW1lem9uZSIsInNlYXJjaCIsInRpbWV6b25lU2VhcmNoIiwidG9Mb3dlckNhc2UiLCJ0aW1lem9uZXMiLCJnZXRBbGxUaW1lem9uZXMiLCJmaWx0ZXIiLCJpbmNsdWRlcyIsImF1dG9jb21wbGV0ZURlbGF5IiwidGFyZ2V0IiwicmVhZE1hcmtlckluVmlld1RocmVzaG9sZE1zIiwicmVhZE1hcmtlck91dE9mVmlld1RocmVzaG9sZE1zIiwiZGlzIiwiZGlzcGF0Y2giLCJhY3Rpb24iLCJBY3Rpb24iLCJWaWV3VXNlclNldHRpbmdzIiwiaW5pdGlhbFRhYklkIiwiVXNlclRhYiIsIktleWJvYXJkIiwic3RhdGUiLCJnZXRVc2VyVGltZXpvbmUiLCJnZXRWYWx1ZUF0IiwidG9TdHJpbmciLCJyZW5kZXJHcm91cCIsInNldHRpbmdJZHMiLCJsZXZlbCIsIkFDQ09VTlQiLCJtYXAiLCJrZXkiLCJuYW1lIiwicmVuZGVyIiwidXNlQ2FzZSIsImdldFZhbHVlIiwicm9vbUxpc3RTZXR0aW5ncyIsIlJPT01fTElTVF9TRVRUSU5HUyIsIml0Iiwic2hvd1VzZXJPbmJvYXJkaW5nUGFnZSIsImJyb3dzZXJUaW1lem9uZUxhYmVsIiwic2hvcnRCcm93c2VyVGltZXpvbmUiLCJ1bnNoaWZ0IiwiU2V0dGluZ3NTZWN0aW9uIiwiaGVhZGluZyIsImxlbmd0aCIsIlNQQUNFU19TRVRUSU5HUyIsImRlc2NyaXB0aW9uIiwic3ViIiwia2luZCIsIm9uQ2xpY2siLCJvbktleWJvYXJkU2hvcnRjdXRzQ2xpY2tlZCIsIktFWUJJTkRJTkdTX1NFVFRJTkdTIiwiaWQiLCJzZWFyY2hFbmFibGVkIiwicGxhY2Vob2xkZXIiLCJvblRpbWV6b25lQ2hhbmdlIiwib25TZWFyY2hDaGFuZ2UiLCJvblRpbWV6b25lU2VhcmNoQ2hhbmdlIiwiVElNRV9TRVRUSU5HUyIsIlBSRVNFTkNFX1NFVFRJTkdTIiwiQ09NUE9TRVJfU0VUVElOR1MiLCJDT0RFX0JMT0NLU19TRVRUSU5HUyIsIklNQUdFU19BTkRfVklERU9TX1NFVFRJTkdTIiwiVElNRUxJTkVfU0VUVElOR1MiLCJST09NX0RJUkVDVE9SWV9TRVRUSU5HUyIsInN0cmV0Y2hDb250ZW50IiwiR0VORVJBTF9TRVRUSU5HUyIsIlBMQVRGT1JNIiwiaGlkZUlmQ2Fubm90U2V0IiwiYXBwTmFtZSIsIlNka0NvbmZpZyIsImJyYW5kIiwidHlwZSIsIm9uQXV0b2NvbXBsZXRlRGVsYXlDaGFuZ2UiLCJvblJlYWRNYXJrZXJJblZpZXdUaHJlc2hvbGRNcyIsIm9uUmVhZE1hcmtlck91dE9mVmlld1RocmVzaG9sZE1zIiwiZXhwb3J0cyJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnRzL3ZpZXdzL3NldHRpbmdzL3RhYnMvdXNlci9QcmVmZXJlbmNlc1VzZXJTZXR0aW5nc1RhYi50c3giXSwic291cmNlc0NvbnRlbnQiOlsiLypcbkNvcHlyaWdodCAyMDI0IE5ldyBWZWN0b3IgTHRkLlxuQ29weXJpZ2h0IDIwMTktMjAyMyBUaGUgTWF0cml4Lm9yZyBGb3VuZGF0aW9uIEMuSS5DLlxuQ29weXJpZ2h0IDIwMTkgTWljaGFlbCBUZWxhdHluc2tpIDw3dDNjaGd1eUBnbWFpbC5jb20+XG5cblNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBR1BMLTMuMC1vbmx5IE9SIEdQTC0zLjAtb25seVxuUGxlYXNlIHNlZSBMSUNFTlNFIGZpbGVzIGluIHRoZSByZXBvc2l0b3J5IHJvb3QgZm9yIGZ1bGwgZGV0YWlscy5cbiovXG5cbmltcG9ydCBSZWFjdCwgeyBSZWFjdEVsZW1lbnQsIHVzZUNhbGxiYWNrLCB1c2VFZmZlY3QsIHVzZVN0YXRlIH0gZnJvbSBcInJlYWN0XCI7XG5cbmltcG9ydCB7IE5vbkVtcHR5QXJyYXkgfSBmcm9tIFwiLi4vLi4vLi4vLi4vLi4vQHR5cGVzL2NvbW1vblwiO1xuaW1wb3J0IHsgX3QsIGdldEN1cnJlbnRMYW5ndWFnZSB9IGZyb20gXCIuLi8uLi8uLi8uLi8uLi9sYW5ndWFnZUhhbmRsZXJcIjtcbmltcG9ydCB7IFVzZUNhc2UgfSBmcm9tIFwiLi4vLi4vLi4vLi4vLi4vc2V0dGluZ3MvZW51bXMvVXNlQ2FzZVwiO1xuaW1wb3J0IFNldHRpbmdzU3RvcmUgZnJvbSBcIi4uLy4uLy4uLy4uLy4uL3NldHRpbmdzL1NldHRpbmdzU3RvcmVcIjtcbmltcG9ydCBGaWVsZCBmcm9tIFwiLi4vLi4vLi4vZWxlbWVudHMvRmllbGRcIjtcbmltcG9ydCBEcm9wZG93biBmcm9tIFwiLi4vLi4vLi4vZWxlbWVudHMvRHJvcGRvd25cIjtcbmltcG9ydCB7IFNldHRpbmdMZXZlbCB9IGZyb20gXCIuLi8uLi8uLi8uLi8uLi9zZXR0aW5ncy9TZXR0aW5nTGV2ZWxcIjtcbmltcG9ydCBTZXR0aW5nc0ZsYWcgZnJvbSBcIi4uLy4uLy4uL2VsZW1lbnRzL1NldHRpbmdzRmxhZ1wiO1xuaW1wb3J0IEFjY2Vzc2libGVCdXR0b24gZnJvbSBcIi4uLy4uLy4uL2VsZW1lbnRzL0FjY2Vzc2libGVCdXR0b25cIjtcbmltcG9ydCBkaXMgZnJvbSBcIi4uLy4uLy4uLy4uLy4uL2Rpc3BhdGNoZXIvZGlzcGF0Y2hlclwiO1xuaW1wb3J0IHsgVXNlclRhYiB9IGZyb20gXCIuLi8uLi8uLi9kaWFsb2dzL1VzZXJUYWJcIjtcbmltcG9ydCB7IE9wZW5Ub1RhYlBheWxvYWQgfSBmcm9tIFwiLi4vLi4vLi4vLi4vLi4vZGlzcGF0Y2hlci9wYXlsb2Fkcy9PcGVuVG9UYWJQYXlsb2FkXCI7XG5pbXBvcnQgeyBBY3Rpb24gfSBmcm9tIFwiLi4vLi4vLi4vLi4vLi4vZGlzcGF0Y2hlci9hY3Rpb25zXCI7XG5pbXBvcnQgU2RrQ29uZmlnIGZyb20gXCIuLi8uLi8uLi8uLi8uLi9TZGtDb25maWdcIjtcbmltcG9ydCB7IHNob3dVc2VyT25ib2FyZGluZ1BhZ2UgfSBmcm9tIFwiLi4vLi4vLi4vdXNlci1vbmJvYXJkaW5nL1VzZXJPbmJvYXJkaW5nUGFnZVwiO1xuaW1wb3J0IFNldHRpbmdzU3Vic2VjdGlvbiBmcm9tIFwiLi4vLi4vc2hhcmVkL1NldHRpbmdzU3Vic2VjdGlvblwiO1xuaW1wb3J0IFNldHRpbmdzVGFiIGZyb20gXCIuLi9TZXR0aW5nc1RhYlwiO1xuaW1wb3J0IHsgU2V0dGluZ3NTZWN0aW9uIH0gZnJvbSBcIi4uLy4uL3NoYXJlZC9TZXR0aW5nc1NlY3Rpb25cIjtcbmltcG9ydCBMYW5ndWFnZURyb3Bkb3duIGZyb20gXCIuLi8uLi8uLi9lbGVtZW50cy9MYW5ndWFnZURyb3Bkb3duXCI7XG5pbXBvcnQgUGxhdGZvcm1QZWcgZnJvbSBcIi4uLy4uLy4uLy4uLy4uL1BsYXRmb3JtUGVnXCI7XG5pbXBvcnQgeyBJU19NQUMgfSBmcm9tIFwiLi4vLi4vLi4vLi4vLi4vS2V5Ym9hcmRcIjtcbmltcG9ydCBTcGVsbENoZWNrU2V0dGluZ3MgZnJvbSBcIi4uLy4uL1NwZWxsQ2hlY2tTZXR0aW5nc1wiO1xuaW1wb3J0IExhYmVsbGVkVG9nZ2xlU3dpdGNoIGZyb20gXCIuLi8uLi8uLi9lbGVtZW50cy9MYWJlbGxlZFRvZ2dsZVN3aXRjaFwiO1xuaW1wb3J0ICogYXMgVGltZXpvbmVIYW5kbGVyIGZyb20gXCIuLi8uLi8uLi8uLi8uLi9UaW1lem9uZUhhbmRsZXJcIjtcblxuaW50ZXJmYWNlIElQcm9wcyB7XG4gICAgY2xvc2VTZXR0aW5nc0ZuKHN1Y2Nlc3M6IGJvb2xlYW4pOiB2b2lkO1xufVxuXG5pbnRlcmZhY2UgSVN0YXRlIHtcbiAgICB0aW1lem9uZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgIHRpbWV6b25lczogc3RyaW5nW107XG4gICAgdGltZXpvbmVTZWFyY2g6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICBhdXRvY29tcGxldGVEZWxheTogc3RyaW5nO1xuICAgIHJlYWRNYXJrZXJJblZpZXdUaHJlc2hvbGRNczogc3RyaW5nO1xuICAgIHJlYWRNYXJrZXJPdXRPZlZpZXdUaHJlc2hvbGRNczogc3RyaW5nO1xufVxuXG5jb25zdCBMYW5ndWFnZVNlY3Rpb246IFJlYWN0LkZDID0gKCkgPT4ge1xuICAgIGNvbnN0IFtsYW5ndWFnZSwgc2V0TGFuZ3VhZ2VdID0gdXNlU3RhdGUoZ2V0Q3VycmVudExhbmd1YWdlKCkpO1xuXG4gICAgY29uc3Qgb25MYW5ndWFnZUNoYW5nZSA9IHVzZUNhbGxiYWNrKFxuICAgICAgICAobmV3TGFuZ3VhZ2U6IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgaWYgKGxhbmd1YWdlID09PSBuZXdMYW5ndWFnZSkgcmV0dXJuO1xuXG4gICAgICAgICAgICBTZXR0aW5nc1N0b3JlLnNldFZhbHVlKFwibGFuZ3VhZ2VcIiwgbnVsbCwgU2V0dGluZ0xldmVsLkRFVklDRSwgbmV3TGFuZ3VhZ2UpO1xuICAgICAgICAgICAgc2V0TGFuZ3VhZ2UobmV3TGFuZ3VhZ2UpO1xuICAgICAgICAgICAgY29uc3QgcGxhdGZvcm0gPSBQbGF0Zm9ybVBlZy5nZXQoKTtcbiAgICAgICAgICAgIGlmIChwbGF0Zm9ybSkge1xuICAgICAgICAgICAgICAgIHBsYXRmb3JtLnNldExhbmd1YWdlKFtuZXdMYW5ndWFnZV0pO1xuICAgICAgICAgICAgICAgIHBsYXRmb3JtLnJlbG9hZCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBbbGFuZ3VhZ2VdLFxuICAgICk7XG5cbiAgICByZXR1cm4gKFxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm14X1NldHRpbmdzU3Vic2VjdGlvbl9kcm9wZG93blwiPlxuICAgICAgICAgICAge190KFwic2V0dGluZ3N8Z2VuZXJhbHxhcHBsaWNhdGlvbl9sYW5ndWFnZVwiKX1cbiAgICAgICAgICAgIDxMYW5ndWFnZURyb3Bkb3duIG9uT3B0aW9uQ2hhbmdlPXtvbkxhbmd1YWdlQ2hhbmdlfSB2YWx1ZT17bGFuZ3VhZ2V9IC8+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm14X1ByZWZlcmVuY2VzVXNlclNldHRpbmdzVGFiX3NlY3Rpb25faGludFwiPlxuICAgICAgICAgICAgICAgIHtfdChcInNldHRpbmdzfGdlbmVyYWx8YXBwbGljYXRpb25fbGFuZ3VhZ2VfcmVsb2FkX2hpbnRcIil9XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgKTtcbn07XG5cbmNvbnN0IFNwZWxsQ2hlY2tTZWN0aW9uOiBSZWFjdC5GQyA9ICgpID0+IHtcbiAgICBjb25zdCBbc3BlbGxDaGVja0VuYWJsZWQsIHNldFNwZWxsQ2hlY2tFbmFibGVkXSA9IHVzZVN0YXRlPGJvb2xlYW4gfCB1bmRlZmluZWQ+KCk7XG4gICAgY29uc3QgW3NwZWxsQ2hlY2tMYW5ndWFnZXMsIHNldFNwZWxsQ2hlY2tMYW5ndWFnZXNdID0gdXNlU3RhdGU8c3RyaW5nW10gfCB1bmRlZmluZWQ+KCk7XG5cbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgcGxhZiA9IFBsYXRmb3JtUGVnLmdldCgpO1xuICAgICAgICAgICAgY29uc3QgW2VuYWJsZWQsIGxhbmdzXSA9IGF3YWl0IFByb21pc2UuYWxsKFtwbGFmPy5nZXRTcGVsbENoZWNrRW5hYmxlZCgpLCBwbGFmPy5nZXRTcGVsbENoZWNrTGFuZ3VhZ2VzKCldKTtcblxuICAgICAgICAgICAgc2V0U3BlbGxDaGVja0VuYWJsZWQoZW5hYmxlZCk7XG4gICAgICAgICAgICBzZXRTcGVsbENoZWNrTGFuZ3VhZ2VzKGxhbmdzIHx8IHVuZGVmaW5lZCk7XG4gICAgICAgIH0pKCk7XG4gICAgfSwgW10pO1xuXG4gICAgY29uc3Qgb25TcGVsbENoZWNrRW5hYmxlZENoYW5nZSA9IHVzZUNhbGxiYWNrKChlbmFibGVkOiBib29sZWFuKSA9PiB7XG4gICAgICAgIHNldFNwZWxsQ2hlY2tFbmFibGVkKGVuYWJsZWQpO1xuICAgICAgICBQbGF0Zm9ybVBlZy5nZXQoKT8uc2V0U3BlbGxDaGVja0VuYWJsZWQoZW5hYmxlZCk7XG4gICAgfSwgW10pO1xuXG4gICAgY29uc3Qgb25TcGVsbENoZWNrTGFuZ3VhZ2VzQ2hhbmdlID0gdXNlQ2FsbGJhY2soKGxhbmd1YWdlczogc3RyaW5nW10pOiB2b2lkID0+IHtcbiAgICAgICAgc2V0U3BlbGxDaGVja0xhbmd1YWdlcyhsYW5ndWFnZXMpO1xuICAgICAgICBQbGF0Zm9ybVBlZy5nZXQoKT8uc2V0U3BlbGxDaGVja0xhbmd1YWdlcyhsYW5ndWFnZXMpO1xuICAgIH0sIFtdKTtcblxuICAgIGlmICghUGxhdGZvcm1QZWcuZ2V0KCk/LnN1cHBvcnRzU3BlbGxDaGVja1NldHRpbmdzKCkpIHJldHVybiBudWxsO1xuXG4gICAgcmV0dXJuIChcbiAgICAgICAgPD5cbiAgICAgICAgICAgIDxMYWJlbGxlZFRvZ2dsZVN3aXRjaFxuICAgICAgICAgICAgICAgIGxhYmVsPXtfdChcInNldHRpbmdzfGdlbmVyYWx8YWxsb3dfc3BlbGxjaGVja1wiKX1cbiAgICAgICAgICAgICAgICB2YWx1ZT17Qm9vbGVhbihzcGVsbENoZWNrRW5hYmxlZCl9XG4gICAgICAgICAgICAgICAgb25DaGFuZ2U9e29uU3BlbGxDaGVja0VuYWJsZWRDaGFuZ2V9XG4gICAgICAgICAgICAvPlxuICAgICAgICAgICAge3NwZWxsQ2hlY2tFbmFibGVkICYmIHNwZWxsQ2hlY2tMYW5ndWFnZXMgIT09IHVuZGVmaW5lZCAmJiAhSVNfTUFDICYmIChcbiAgICAgICAgICAgICAgICA8U3BlbGxDaGVja1NldHRpbmdzIGxhbmd1YWdlcz17c3BlbGxDaGVja0xhbmd1YWdlc30gb25MYW5ndWFnZXNDaGFuZ2U9e29uU3BlbGxDaGVja0xhbmd1YWdlc0NoYW5nZX0gLz5cbiAgICAgICAgICAgICl9XG4gICAgICAgIDwvPlxuICAgICk7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBQcmVmZXJlbmNlc1VzZXJTZXR0aW5nc1RhYiBleHRlbmRzIFJlYWN0LkNvbXBvbmVudDxJUHJvcHMsIElTdGF0ZT4ge1xuICAgIHByaXZhdGUgc3RhdGljIFJPT01fTElTVF9TRVRUSU5HUyA9IFtcImJyZWFkY3J1bWJzXCIsIFwiRlRVRS51c2VyT25ib2FyZGluZ0J1dHRvblwiXTtcblxuICAgIHByaXZhdGUgc3RhdGljIFNQQUNFU19TRVRUSU5HUyA9IFtcIlNwYWNlcy5hbGxSb29tc0luSG9tZVwiXTtcblxuICAgIHByaXZhdGUgc3RhdGljIEtFWUJJTkRJTkdTX1NFVFRJTkdTID0gW1wiY3RybEZGb3JTZWFyY2hcIl07XG5cbiAgICBwcml2YXRlIHN0YXRpYyBQUkVTRU5DRV9TRVRUSU5HUyA9IFtcInNlbmRSZWFkUmVjZWlwdHNcIiwgXCJzZW5kVHlwaW5nTm90aWZpY2F0aW9uc1wiXTtcblxuICAgIHByaXZhdGUgc3RhdGljIENPTVBPU0VSX1NFVFRJTkdTID0gW1xuICAgICAgICBcIk1lc3NhZ2VDb21wb3NlcklucHV0LmF1dG9SZXBsYWNlRW1vamlcIixcbiAgICAgICAgXCJNZXNzYWdlQ29tcG9zZXJJbnB1dC51c2VNYXJrZG93blwiLFxuICAgICAgICBcIk1lc3NhZ2VDb21wb3NlcklucHV0LnN1Z2dlc3RFbW9qaVwiLFxuICAgICAgICBcIk1lc3NhZ2VDb21wb3NlcklucHV0LmN0cmxFbnRlclRvU2VuZFwiLFxuICAgICAgICBcIk1lc3NhZ2VDb21wb3NlcklucHV0LnN1cnJvdW5kV2l0aFwiLFxuICAgICAgICBcIk1lc3NhZ2VDb21wb3NlcklucHV0LnNob3dTdGlja2Vyc0J1dHRvblwiLFxuICAgICAgICBcIk1lc3NhZ2VDb21wb3NlcklucHV0Lmluc2VydFRyYWlsaW5nQ29sb25cIixcbiAgICBdO1xuXG4gICAgcHJpdmF0ZSBzdGF0aWMgVElNRV9TRVRUSU5HUyA9IFtcInNob3dUd2VsdmVIb3VyVGltZXN0YW1wc1wiLCBcImFsd2F5c1Nob3dUaW1lc3RhbXBzXCJdO1xuXG4gICAgcHJpdmF0ZSBzdGF0aWMgQ09ERV9CTE9DS1NfU0VUVElOR1MgPSBbXG4gICAgICAgIFwiZW5hYmxlU3ludGF4SGlnaGxpZ2h0TGFuZ3VhZ2VEZXRlY3Rpb25cIixcbiAgICAgICAgXCJleHBhbmRDb2RlQnlEZWZhdWx0XCIsXG4gICAgICAgIFwic2hvd0NvZGVMaW5lTnVtYmVyc1wiLFxuICAgIF07XG5cbiAgICBwcml2YXRlIHN0YXRpYyBJTUFHRVNfQU5EX1ZJREVPU19TRVRUSU5HUyA9IFtcInVybFByZXZpZXdzRW5hYmxlZFwiLCBcImF1dG9wbGF5R2lmc1wiLCBcImF1dG9wbGF5VmlkZW9cIiwgXCJzaG93SW1hZ2VzXCJdO1xuXG4gICAgcHJpdmF0ZSBzdGF0aWMgVElNRUxJTkVfU0VUVElOR1MgPSBbXG4gICAgICAgIFwic2hvd1R5cGluZ05vdGlmaWNhdGlvbnNcIixcbiAgICAgICAgXCJzaG93UmVkYWN0aW9uc1wiLFxuICAgICAgICBcInNob3dSZWFkUmVjZWlwdHNcIixcbiAgICAgICAgXCJzaG93Sm9pbkxlYXZlc1wiLFxuICAgICAgICBcInNob3dEaXNwbGF5bmFtZUNoYW5nZXNcIixcbiAgICAgICAgXCJzaG93Q2hhdEVmZmVjdHNcIixcbiAgICAgICAgXCJzaG93QXZhdGFyQ2hhbmdlc1wiLFxuICAgICAgICBcIlBpbGwuc2hvdWxkU2hvd1BpbGxBdmF0YXJcIixcbiAgICAgICAgXCJUZXh0dWFsQm9keS5lbmFibGVCaWdFbW9qaVwiLFxuICAgICAgICBcInNjcm9sbFRvQm90dG9tT25NZXNzYWdlU2VudFwiLFxuICAgICAgICBcInVzZU9ubHlDdXJyZW50UHJvZmlsZXNcIixcbiAgICBdO1xuXG4gICAgcHJpdmF0ZSBzdGF0aWMgUk9PTV9ESVJFQ1RPUllfU0VUVElOR1MgPSBbXCJTcG90bGlnaHRTZWFyY2guc2hvd05zZndQdWJsaWNSb29tc1wiXTtcblxuICAgIHByaXZhdGUgc3RhdGljIEdFTkVSQUxfU0VUVElOR1MgPSBbXG4gICAgICAgIFwicHJvbXB0QmVmb3JlSW52aXRlVW5rbm93blVzZXJzXCIsXG4gICAgICAgIC8vIFN0YXJ0IGF1dG9tYXRpY2FsbHkgYWZ0ZXIgc3RhcnR1cCAoZWxlY3Ryb24tb25seSlcbiAgICAgICAgLy8gQXV0b2NvbXBsZXRlIGRlbGF5IChuaWNoZSB0ZXh0IGJveClcbiAgICBdO1xuXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHByb3BzOiBJUHJvcHMpIHtcbiAgICAgICAgc3VwZXIocHJvcHMpO1xuXG4gICAgICAgIHRoaXMuc3RhdGUgPSB7XG4gICAgICAgICAgICB0aW1lem9uZTogVGltZXpvbmVIYW5kbGVyLmdldFVzZXJUaW1lem9uZSgpLFxuICAgICAgICAgICAgdGltZXpvbmVzOiBUaW1lem9uZUhhbmRsZXIuZ2V0QWxsVGltZXpvbmVzKCksXG4gICAgICAgICAgICB0aW1lem9uZVNlYXJjaDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgYXV0b2NvbXBsZXRlRGVsYXk6IFNldHRpbmdzU3RvcmUuZ2V0VmFsdWVBdChTZXR0aW5nTGV2ZWwuREVWSUNFLCBcImF1dG9jb21wbGV0ZURlbGF5XCIpLnRvU3RyaW5nKDEwKSxcbiAgICAgICAgICAgIHJlYWRNYXJrZXJJblZpZXdUaHJlc2hvbGRNczogU2V0dGluZ3NTdG9yZS5nZXRWYWx1ZUF0KFxuICAgICAgICAgICAgICAgIFNldHRpbmdMZXZlbC5ERVZJQ0UsXG4gICAgICAgICAgICAgICAgXCJyZWFkTWFya2VySW5WaWV3VGhyZXNob2xkTXNcIixcbiAgICAgICAgICAgICkudG9TdHJpbmcoMTApLFxuICAgICAgICAgICAgcmVhZE1hcmtlck91dE9mVmlld1RocmVzaG9sZE1zOiBTZXR0aW5nc1N0b3JlLmdldFZhbHVlQXQoXG4gICAgICAgICAgICAgICAgU2V0dGluZ0xldmVsLkRFVklDRSxcbiAgICAgICAgICAgICAgICBcInJlYWRNYXJrZXJPdXRPZlZpZXdUaHJlc2hvbGRNc1wiLFxuICAgICAgICAgICAgKS50b1N0cmluZygxMCksXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBvblRpbWV6b25lQ2hhbmdlID0gKHR6OiBzdHJpbmcpOiB2b2lkID0+IHtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7IHRpbWV6b25lOiB0eiB9KTtcbiAgICAgICAgVGltZXpvbmVIYW5kbGVyLnNldFVzZXJUaW1lem9uZSh0eik7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIElmIHByZXNlbnQgZmlsdGVyIHRoZSB0aW1lIHpvbmVzIG1hdGNoaW5nIHRoZSBzZWFyY2ggdGVybVxuICAgICAqL1xuICAgIHByaXZhdGUgb25UaW1lem9uZVNlYXJjaENoYW5nZSA9IChzZWFyY2g6IHN0cmluZyk6IHZvaWQgPT4ge1xuICAgICAgICBjb25zdCB0aW1lem9uZVNlYXJjaCA9IHNlYXJjaC50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBjb25zdCB0aW1lem9uZXMgPSB0aW1lem9uZVNlYXJjaFxuICAgICAgICAgICAgPyBUaW1lem9uZUhhbmRsZXIuZ2V0QWxsVGltZXpvbmVzKCkuZmlsdGVyKCh0eikgPT4ge1xuICAgICAgICAgICAgICAgICAgcmV0dXJuIHR6LnRvTG93ZXJDYXNlKCkuaW5jbHVkZXModGltZXpvbmVTZWFyY2gpO1xuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgOiBUaW1lem9uZUhhbmRsZXIuZ2V0QWxsVGltZXpvbmVzKCk7XG5cbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7IHRpbWV6b25lcywgdGltZXpvbmVTZWFyY2ggfSk7XG4gICAgfTtcblxuICAgIHByaXZhdGUgb25BdXRvY29tcGxldGVEZWxheUNoYW5nZSA9IChlOiBSZWFjdC5DaGFuZ2VFdmVudDxIVE1MSW5wdXRFbGVtZW50Pik6IHZvaWQgPT4ge1xuICAgICAgICB0aGlzLnNldFN0YXRlKHsgYXV0b2NvbXBsZXRlRGVsYXk6IGUudGFyZ2V0LnZhbHVlIH0pO1xuICAgICAgICBTZXR0aW5nc1N0b3JlLnNldFZhbHVlKFwiYXV0b2NvbXBsZXRlRGVsYXlcIiwgbnVsbCwgU2V0dGluZ0xldmVsLkRFVklDRSwgZS50YXJnZXQudmFsdWUpO1xuICAgIH07XG5cbiAgICBwcml2YXRlIG9uUmVhZE1hcmtlckluVmlld1RocmVzaG9sZE1zID0gKGU6IFJlYWN0LkNoYW5nZUV2ZW50PEhUTUxJbnB1dEVsZW1lbnQ+KTogdm9pZCA9PiB7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoeyByZWFkTWFya2VySW5WaWV3VGhyZXNob2xkTXM6IGUudGFyZ2V0LnZhbHVlIH0pO1xuICAgICAgICBTZXR0aW5nc1N0b3JlLnNldFZhbHVlKFwicmVhZE1hcmtlckluVmlld1RocmVzaG9sZE1zXCIsIG51bGwsIFNldHRpbmdMZXZlbC5ERVZJQ0UsIGUudGFyZ2V0LnZhbHVlKTtcbiAgICB9O1xuXG4gICAgcHJpdmF0ZSBvblJlYWRNYXJrZXJPdXRPZlZpZXdUaHJlc2hvbGRNcyA9IChlOiBSZWFjdC5DaGFuZ2VFdmVudDxIVE1MSW5wdXRFbGVtZW50Pik6IHZvaWQgPT4ge1xuICAgICAgICB0aGlzLnNldFN0YXRlKHsgcmVhZE1hcmtlck91dE9mVmlld1RocmVzaG9sZE1zOiBlLnRhcmdldC52YWx1ZSB9KTtcbiAgICAgICAgU2V0dGluZ3NTdG9yZS5zZXRWYWx1ZShcInJlYWRNYXJrZXJPdXRPZlZpZXdUaHJlc2hvbGRNc1wiLCBudWxsLCBTZXR0aW5nTGV2ZWwuREVWSUNFLCBlLnRhcmdldC52YWx1ZSk7XG4gICAgfTtcblxuICAgIHByaXZhdGUgcmVuZGVyR3JvdXAoc2V0dGluZ0lkczogc3RyaW5nW10sIGxldmVsID0gU2V0dGluZ0xldmVsLkFDQ09VTlQpOiBSZWFjdC5SZWFjdE5vZGVBcnJheSB7XG4gICAgICAgIHJldHVybiBzZXR0aW5nSWRzLm1hcCgoaSkgPT4gPFNldHRpbmdzRmxhZyBrZXk9e2l9IG5hbWU9e2l9IGxldmVsPXtsZXZlbH0gLz4pO1xuICAgIH1cblxuICAgIHByaXZhdGUgb25LZXlib2FyZFNob3J0Y3V0c0NsaWNrZWQgPSAoKTogdm9pZCA9PiB7XG4gICAgICAgIGRpcy5kaXNwYXRjaDxPcGVuVG9UYWJQYXlsb2FkPih7XG4gICAgICAgICAgICBhY3Rpb246IEFjdGlvbi5WaWV3VXNlclNldHRpbmdzLFxuICAgICAgICAgICAgaW5pdGlhbFRhYklkOiBVc2VyVGFiLktleWJvYXJkLFxuICAgICAgICB9KTtcbiAgICB9O1xuXG4gICAgcHVibGljIHJlbmRlcigpOiBSZWFjdC5SZWFjdE5vZGUge1xuICAgICAgICBjb25zdCB1c2VDYXNlID0gU2V0dGluZ3NTdG9yZS5nZXRWYWx1ZTxVc2VDYXNlIHwgbnVsbD4oXCJGVFVFLnVzZUNhc2VTZWxlY3Rpb25cIik7XG4gICAgICAgIGNvbnN0IHJvb21MaXN0U2V0dGluZ3MgPSBQcmVmZXJlbmNlc1VzZXJTZXR0aW5nc1RhYi5ST09NX0xJU1RfU0VUVElOR1NcbiAgICAgICAgICAgIC8vIE9ubHkgc2hvdyB0aGUgdXNlciBvbmJvYXJkaW5nIHNldHRpbmcgaWYgdGhlIHVzZXIgc2hvdWxkIHNlZSB0aGUgdXNlciBvbmJvYXJkaW5nIHBhZ2VcbiAgICAgICAgICAgIC5maWx0ZXIoKGl0KSA9PiBpdCAhPT0gXCJGVFVFLnVzZXJPbmJvYXJkaW5nQnV0dG9uXCIgfHwgc2hvd1VzZXJPbmJvYXJkaW5nUGFnZSh1c2VDYXNlKSk7XG5cbiAgICAgICAgY29uc3QgYnJvd3NlclRpbWV6b25lTGFiZWw6IHN0cmluZyA9IF90KFwic2V0dGluZ3N8cHJlZmVyZW5jZXN8ZGVmYXVsdF90aW1lem9uZVwiLCB7XG4gICAgICAgICAgICB0aW1lem9uZTogVGltZXpvbmVIYW5kbGVyLnNob3J0QnJvd3NlclRpbWV6b25lKCksXG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIEFsd2F5cyBQcmVwcmVuZCB0aGUgZGVmYXVsdCBvcHRpb25cbiAgICAgICAgY29uc3QgdGltZXpvbmVzID0gdGhpcy5zdGF0ZS50aW1lem9uZXMubWFwKCh0eikgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIDxkaXYga2V5PXt0en0+e3R6fTwvZGl2PjtcbiAgICAgICAgfSk7XG4gICAgICAgIHRpbWV6b25lcy51bnNoaWZ0KDxkaXYga2V5PVwiXCI+e2Jyb3dzZXJUaW1lem9uZUxhYmVsfTwvZGl2Pik7XG5cbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIDxTZXR0aW5nc1RhYiBkYXRhLXRlc3RpZD1cIm14X1ByZWZlcmVuY2VzVXNlclNldHRpbmdzVGFiXCI+XG4gICAgICAgICAgICAgICAgPFNldHRpbmdzU2VjdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgey8qIFRoZSBoZWFkaW5nIHN0cmluZyBpcyBzdGlsbCAnZ2VuZXJhbCcgZnJvbSB3aGVyZSBpdCB3YXMgbW92ZWQsIGJ1dCB0aGlzIHNlY3Rpb24gc2hvdWxkIGJlY29tZSAnZ2VuZXJhbCcgKi99XG4gICAgICAgICAgICAgICAgICAgIDxTZXR0aW5nc1N1YnNlY3Rpb24gaGVhZGluZz17X3QoXCJzZXR0aW5nc3xnZW5lcmFsfGxhbmd1YWdlX3NlY3Rpb25cIil9PlxuICAgICAgICAgICAgICAgICAgICAgICAgPExhbmd1YWdlU2VjdGlvbiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgPFNwZWxsQ2hlY2tTZWN0aW9uIC8+XG4gICAgICAgICAgICAgICAgICAgIDwvU2V0dGluZ3NTdWJzZWN0aW9uPlxuXG4gICAgICAgICAgICAgICAgICAgIHtyb29tTGlzdFNldHRpbmdzLmxlbmd0aCA+IDAgJiYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgPFNldHRpbmdzU3Vic2VjdGlvbiBoZWFkaW5nPXtfdChcInNldHRpbmdzfHByZWZlcmVuY2VzfHJvb21fbGlzdF9oZWFkaW5nXCIpfT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7dGhpcy5yZW5kZXJHcm91cChyb29tTGlzdFNldHRpbmdzKX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvU2V0dGluZ3NTdWJzZWN0aW9uPlxuICAgICAgICAgICAgICAgICAgICApfVxuXG4gICAgICAgICAgICAgICAgICAgIDxTZXR0aW5nc1N1YnNlY3Rpb24gaGVhZGluZz17X3QoXCJjb21tb258c3BhY2VzXCIpfT5cbiAgICAgICAgICAgICAgICAgICAgICAgIHt0aGlzLnJlbmRlckdyb3VwKFByZWZlcmVuY2VzVXNlclNldHRpbmdzVGFiLlNQQUNFU19TRVRUSU5HUywgU2V0dGluZ0xldmVsLkFDQ09VTlQpfVxuICAgICAgICAgICAgICAgICAgICA8L1NldHRpbmdzU3Vic2VjdGlvbj5cblxuICAgICAgICAgICAgICAgICAgICA8U2V0dGluZ3NTdWJzZWN0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgICBoZWFkaW5nPXtfdChcInNldHRpbmdzfHByZWZlcmVuY2VzfGtleWJvYXJkX2hlYWRpbmdcIil9XG4gICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbj17X3QoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJzZXR0aW5nc3xwcmVmZXJlbmNlc3xrZXlib2FyZF92aWV3X3Nob3J0Y3V0c19idXR0b25cIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7fSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGE6IChzdWIpID0+IChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxBY2Nlc3NpYmxlQnV0dG9uIGtpbmQ9XCJsaW5rX2lubGluZVwiIG9uQ2xpY2s9e3RoaXMub25LZXlib2FyZFNob3J0Y3V0c0NsaWNrZWR9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtzdWJ9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L0FjY2Vzc2libGVCdXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIHt0aGlzLnJlbmRlckdyb3VwKFByZWZlcmVuY2VzVXNlclNldHRpbmdzVGFiLktFWUJJTkRJTkdTX1NFVFRJTkdTKX1cbiAgICAgICAgICAgICAgICAgICAgPC9TZXR0aW5nc1N1YnNlY3Rpb24+XG5cbiAgICAgICAgICAgICAgICAgICAgPFNldHRpbmdzU3Vic2VjdGlvbiBoZWFkaW5nPXtfdChcInNldHRpbmdzfHByZWZlcmVuY2VzfHRpbWVfaGVhZGluZ1wiKX0+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm14X1NldHRpbmdzU3Vic2VjdGlvbl9kcm9wZG93blwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtfdChcInNldHRpbmdzfHByZWZlcmVuY2VzfHVzZXJfdGltZXpvbmVcIil9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPERyb3Bkb3duXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkPVwibXhfZHJvcGRvd25Vc2VyVGltZXpvbmVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJteF9kcm9wZG93blVzZXJUaW1lem9uZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtdGVzdGlkPVwibXhfZHJvcGRvd25Vc2VyVGltZXpvbmVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWFyY2hFbmFibGVkPXt0cnVlfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT17dGhpcy5zdGF0ZS50aW1lem9uZX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw9e190KFwic2V0dGluZ3N8cHJlZmVyZW5jZXN8dXNlcl90aW1lem9uZVwiKX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9e2Jyb3dzZXJUaW1lem9uZUxhYmVsfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbk9wdGlvbkNoYW5nZT17dGhpcy5vblRpbWV6b25lQ2hhbmdlfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvblNlYXJjaENoYW5nZT17dGhpcy5vblRpbWV6b25lU2VhcmNoQ2hhbmdlfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3RpbWV6b25lcyBhcyBOb25FbXB0eUFycmF5PFJlYWN0RWxlbWVudCAmIHsga2V5OiBzdHJpbmcgfT59XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9Ecm9wZG93bj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgICAgICB7dGhpcy5yZW5kZXJHcm91cChQcmVmZXJlbmNlc1VzZXJTZXR0aW5nc1RhYi5USU1FX1NFVFRJTkdTKX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDxTZXR0aW5nc0ZsYWcgbmFtZT1cInVzZXJUaW1lem9uZVB1Ymxpc2hcIiBsZXZlbD17U2V0dGluZ0xldmVsLkRFVklDRX0gLz5cbiAgICAgICAgICAgICAgICAgICAgPC9TZXR0aW5nc1N1YnNlY3Rpb24+XG5cbiAgICAgICAgICAgICAgICAgICAgPFNldHRpbmdzU3Vic2VjdGlvblxuICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGluZz17X3QoXCJjb21tb258cHJlc2VuY2VcIil9XG4gICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbj17X3QoXCJzZXR0aW5nc3xwcmVmZXJlbmNlc3xwcmVzZW5jZV9kZXNjcmlwdGlvblwiKX1cbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAge3RoaXMucmVuZGVyR3JvdXAoUHJlZmVyZW5jZXNVc2VyU2V0dGluZ3NUYWIuUFJFU0VOQ0VfU0VUVElOR1MpfVxuICAgICAgICAgICAgICAgICAgICA8L1NldHRpbmdzU3Vic2VjdGlvbj5cblxuICAgICAgICAgICAgICAgICAgICA8U2V0dGluZ3NTdWJzZWN0aW9uIGhlYWRpbmc9e190KFwic2V0dGluZ3N8cHJlZmVyZW5jZXN8Y29tcG9zZXJfaGVhZGluZ1wiKX0+XG4gICAgICAgICAgICAgICAgICAgICAgICB7dGhpcy5yZW5kZXJHcm91cChQcmVmZXJlbmNlc1VzZXJTZXR0aW5nc1RhYi5DT01QT1NFUl9TRVRUSU5HUyl9XG4gICAgICAgICAgICAgICAgICAgIDwvU2V0dGluZ3NTdWJzZWN0aW9uPlxuXG4gICAgICAgICAgICAgICAgICAgIDxTZXR0aW5nc1N1YnNlY3Rpb24gaGVhZGluZz17X3QoXCJzZXR0aW5nc3xwcmVmZXJlbmNlc3xjb2RlX2Jsb2Nrc19oZWFkaW5nXCIpfT5cbiAgICAgICAgICAgICAgICAgICAgICAgIHt0aGlzLnJlbmRlckdyb3VwKFByZWZlcmVuY2VzVXNlclNldHRpbmdzVGFiLkNPREVfQkxPQ0tTX1NFVFRJTkdTKX1cbiAgICAgICAgICAgICAgICAgICAgPC9TZXR0aW5nc1N1YnNlY3Rpb24+XG5cbiAgICAgICAgICAgICAgICAgICAgPFNldHRpbmdzU3Vic2VjdGlvbiBoZWFkaW5nPXtfdChcInNldHRpbmdzfHByZWZlcmVuY2VzfG1lZGlhX2hlYWRpbmdcIil9PlxuICAgICAgICAgICAgICAgICAgICAgICAge3RoaXMucmVuZGVyR3JvdXAoUHJlZmVyZW5jZXNVc2VyU2V0dGluZ3NUYWIuSU1BR0VTX0FORF9WSURFT1NfU0VUVElOR1MpfVxuICAgICAgICAgICAgICAgICAgICA8L1NldHRpbmdzU3Vic2VjdGlvbj5cblxuICAgICAgICAgICAgICAgICAgICA8U2V0dGluZ3NTdWJzZWN0aW9uIGhlYWRpbmc9e190KFwiY29tbW9ufHRpbWVsaW5lXCIpfT5cbiAgICAgICAgICAgICAgICAgICAgICAgIHt0aGlzLnJlbmRlckdyb3VwKFByZWZlcmVuY2VzVXNlclNldHRpbmdzVGFiLlRJTUVMSU5FX1NFVFRJTkdTKX1cbiAgICAgICAgICAgICAgICAgICAgPC9TZXR0aW5nc1N1YnNlY3Rpb24+XG5cbiAgICAgICAgICAgICAgICAgICAgPFNldHRpbmdzU3Vic2VjdGlvbiBoZWFkaW5nPXtfdChcInNldHRpbmdzfHByZWZlcmVuY2VzfHJvb21fZGlyZWN0b3J5X2hlYWRpbmdcIil9PlxuICAgICAgICAgICAgICAgICAgICAgICAge3RoaXMucmVuZGVyR3JvdXAoUHJlZmVyZW5jZXNVc2VyU2V0dGluZ3NUYWIuUk9PTV9ESVJFQ1RPUllfU0VUVElOR1MpfVxuICAgICAgICAgICAgICAgICAgICA8L1NldHRpbmdzU3Vic2VjdGlvbj5cblxuICAgICAgICAgICAgICAgICAgICA8U2V0dGluZ3NTdWJzZWN0aW9uIGhlYWRpbmc9e190KFwiY29tbW9ufGdlbmVyYWxcIil9IHN0cmV0Y2hDb250ZW50PlxuICAgICAgICAgICAgICAgICAgICAgICAge3RoaXMucmVuZGVyR3JvdXAoUHJlZmVyZW5jZXNVc2VyU2V0dGluZ3NUYWIuR0VORVJBTF9TRVRUSU5HUyl9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxTZXR0aW5nc0ZsYWcgbmFtZT1cIkVsZWN0cm9uLnNob3dUcmF5SWNvblwiIGxldmVsPXtTZXR0aW5nTGV2ZWwuUExBVEZPUk19IGhpZGVJZkNhbm5vdFNldCAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgPFNldHRpbmdzRmxhZ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9XCJFbGVjdHJvbi5lbmFibGVIYXJkd2FyZUFjY2VsZXJhdGlvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWw9e1NldHRpbmdMZXZlbC5QTEFURk9STX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoaWRlSWZDYW5ub3RTZXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbD17X3QoXCJzZXR0aW5nc3xwcmVmZXJlbmNlc3xFbGVjdHJvbi5lbmFibGVIYXJkd2FyZUFjY2VsZXJhdGlvblwiLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcE5hbWU6IFNka0NvbmZpZy5nZXQoKS5icmFuZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KX1cbiAgICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICA8U2V0dGluZ3NGbGFnIG5hbWU9XCJFbGVjdHJvbi5hbHdheXNTaG93TWVudUJhclwiIGxldmVsPXtTZXR0aW5nTGV2ZWwuUExBVEZPUk19IGhpZGVJZkNhbm5vdFNldCAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgPFNldHRpbmdzRmxhZyBuYW1lPVwiRWxlY3Ryb24uYXV0b0xhdW5jaFwiIGxldmVsPXtTZXR0aW5nTGV2ZWwuUExBVEZPUk19IGhpZGVJZkNhbm5vdFNldCAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgPFNldHRpbmdzRmxhZyBuYW1lPVwiRWxlY3Ryb24ud2FybkJlZm9yZUV4aXRcIiBsZXZlbD17U2V0dGluZ0xldmVsLlBMQVRGT1JNfSBoaWRlSWZDYW5ub3RTZXQgLz5cblxuICAgICAgICAgICAgICAgICAgICAgICAgPEZpZWxkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw9e190KFwic2V0dGluZ3N8cHJlZmVyZW5jZXN8YXV0b2NvbXBsZXRlX2RlbGF5XCIpfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJudW1iZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPXt0aGlzLnN0YXRlLmF1dG9jb21wbGV0ZURlbGF5fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXt0aGlzLm9uQXV0b2NvbXBsZXRlRGVsYXlDaGFuZ2V9XG4gICAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgPEZpZWxkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw9e190KFwic2V0dGluZ3N8cHJlZmVyZW5jZXN8cm1fbGlmZXRpbWVcIil9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cIm51bWJlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9e3RoaXMuc3RhdGUucmVhZE1hcmtlckluVmlld1RocmVzaG9sZE1zfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXt0aGlzLm9uUmVhZE1hcmtlckluVmlld1RocmVzaG9sZE1zfVxuICAgICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxGaWVsZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsPXtfdChcInNldHRpbmdzfHByZWZlcmVuY2VzfHJtX2xpZmV0aW1lX29mZnNjcmVlblwiKX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwibnVtYmVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT17dGhpcy5zdGF0ZS5yZWFkTWFya2VyT3V0T2ZWaWV3VGhyZXNob2xkTXN9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9e3RoaXMub25SZWFkTWFya2VyT3V0T2ZWaWV3VGhyZXNob2xkTXN9XG4gICAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICA8L1NldHRpbmdzU3Vic2VjdGlvbj5cbiAgICAgICAgICAgICAgICA8L1NldHRpbmdzU2VjdGlvbj5cbiAgICAgICAgICAgIDwvU2V0dGluZ3NUYWI+XG4gICAgICAgICk7XG4gICAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7OztBQVNBLElBQUFBLE1BQUEsR0FBQUMsdUJBQUEsQ0FBQUMsT0FBQTtBQUdBLElBQUFDLGdCQUFBLEdBQUFELE9BQUE7QUFFQSxJQUFBRSxjQUFBLEdBQUFDLHNCQUFBLENBQUFILE9BQUE7QUFDQSxJQUFBSSxNQUFBLEdBQUFELHNCQUFBLENBQUFILE9BQUE7QUFDQSxJQUFBSyxTQUFBLEdBQUFGLHNCQUFBLENBQUFILE9BQUE7QUFDQSxJQUFBTSxhQUFBLEdBQUFOLE9BQUE7QUFDQSxJQUFBTyxhQUFBLEdBQUFKLHNCQUFBLENBQUFILE9BQUE7QUFDQSxJQUFBUSxpQkFBQSxHQUFBTCxzQkFBQSxDQUFBSCxPQUFBO0FBQ0EsSUFBQVMsV0FBQSxHQUFBTixzQkFBQSxDQUFBSCxPQUFBO0FBQ0EsSUFBQVUsUUFBQSxHQUFBVixPQUFBO0FBRUEsSUFBQVcsUUFBQSxHQUFBWCxPQUFBO0FBQ0EsSUFBQVksVUFBQSxHQUFBVCxzQkFBQSxDQUFBSCxPQUFBO0FBQ0EsSUFBQWEsbUJBQUEsR0FBQWIsT0FBQTtBQUNBLElBQUFjLG1CQUFBLEdBQUFYLHNCQUFBLENBQUFILE9BQUE7QUFDQSxJQUFBZSxZQUFBLEdBQUFaLHNCQUFBLENBQUFILE9BQUE7QUFDQSxJQUFBZ0IsZ0JBQUEsR0FBQWhCLE9BQUE7QUFDQSxJQUFBaUIsaUJBQUEsR0FBQWQsc0JBQUEsQ0FBQUgsT0FBQTtBQUNBLElBQUFrQixZQUFBLEdBQUFmLHNCQUFBLENBQUFILE9BQUE7QUFDQSxJQUFBbUIsU0FBQSxHQUFBbkIsT0FBQTtBQUNBLElBQUFvQixtQkFBQSxHQUFBakIsc0JBQUEsQ0FBQUgsT0FBQTtBQUNBLElBQUFxQixxQkFBQSxH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