UNPKG

matrix-react-sdk

Version:
306 lines (303 loc) 60.4 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = NotificationSettings2; var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _react = _interopRequireWildcard(require("react")); var _newAndImproved = _interopRequireDefault(require("../../../../../res/img/element-icons/new-and-improved.svg")); var _MatrixClientContext = require("../../../../contexts/MatrixClientContext"); var _useNotificationSettings = require("../../../../hooks/useNotificationSettings"); var _useSettings = require("../../../../hooks/useSettings"); var _languageHandler = require("../../../../languageHandler"); var _NotificationSettings = require("../../../../models/notificationsettings/NotificationSettings"); var _RoomNotifs = require("../../../../RoomNotifs"); var _SettingLevel = require("../../../../settings/SettingLevel"); var _SettingsStore = _interopRequireDefault(require("../../../../settings/SettingsStore")); var _NotificationLevel = require("../../../../stores/notifications/NotificationLevel"); var _notifications = require("../../../../utils/notifications"); var _AccessibleButton = _interopRequireDefault(require("../../elements/AccessibleButton")); var _ExternalLink = _interopRequireDefault(require("../../elements/ExternalLink")); var _LabelledCheckbox = _interopRequireDefault(require("../../elements/LabelledCheckbox")); var _LabelledToggleSwitch = _interopRequireDefault(require("../../elements/LabelledToggleSwitch")); var _StyledRadioGroup = _interopRequireDefault(require("../../elements/StyledRadioGroup")); var _TagComposer = _interopRequireDefault(require("../../elements/TagComposer")); var _StatelessNotificationBadge = require("../../rooms/NotificationBadge/StatelessNotificationBadge"); var _SettingsBanner = require("../shared/SettingsBanner"); var _SettingsSection = require("../shared/SettingsSection"); var _SettingsSubsection = _interopRequireDefault(require("../shared/SettingsSubsection")); var _NotificationPusherSettings = require("./NotificationPusherSettings"); var _SettingsFlag = _interopRequireDefault(require("../../elements/SettingsFlag")); 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; } function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; } function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { (0, _defineProperty2.default)(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; } /* Copyright 2024 New Vector Ltd. Copyright 2023 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. */ var NotificationDefaultLevels = /*#__PURE__*/function (NotificationDefaultLevels) { NotificationDefaultLevels["AllMessages"] = "all_messages"; NotificationDefaultLevels["PeopleMentionsKeywords"] = "people_mentions_keywords"; NotificationDefaultLevels["MentionsKeywords"] = "mentions_keywords"; return NotificationDefaultLevels; }(NotificationDefaultLevels || {}); function toDefaultLevels(levels) { if (levels.room === _RoomNotifs.RoomNotifState.AllMessages) { return NotificationDefaultLevels.AllMessages; } else if (levels.dm === _RoomNotifs.RoomNotifState.AllMessages) { return NotificationDefaultLevels.PeopleMentionsKeywords; } else { return NotificationDefaultLevels.MentionsKeywords; } } function boldText(text) { return /*#__PURE__*/_react.default.createElement("strong", null, text); } function helpLink(sub) { return /*#__PURE__*/_react.default.createElement(_ExternalLink.default, { href: "https://element.io/help#settings2" }, sub); } function useHasUnreadNotifications() { const cli = (0, _MatrixClientContext.useMatrixClientContext)(); return cli.getRooms().some(room => room.getUnreadNotificationCount() > 0); } /** * The new notification settings tab view, only displayed if the user has Features.NotificationSettings2 enabled */ function NotificationSettings2() { const cli = (0, _MatrixClientContext.useMatrixClientContext)(); const desktopNotifications = (0, _useSettings.useSettingValue)("notificationsEnabled"); const desktopShowBody = (0, _useSettings.useSettingValue)("notificationBodyEnabled"); const audioNotifications = (0, _useSettings.useSettingValue)("audioNotificationsEnabled"); const { model, hasPendingChanges, reconcile } = (0, _useNotificationSettings.useNotificationSettings)(cli); const disabled = model === null || hasPendingChanges; const settings = model ?? _NotificationSettings.DefaultNotificationSettings; const [updatingUnread, setUpdatingUnread] = (0, _react.useState)(false); const hasUnreadNotifications = useHasUnreadNotifications(); const NotificationOptions = [{ value: NotificationDefaultLevels.AllMessages, label: (0, _languageHandler._t)("notifications|all_messages") }, { value: NotificationDefaultLevels.PeopleMentionsKeywords, label: (0, _languageHandler._t)("settings|notifications|people_mentions_keywords") }, { value: NotificationDefaultLevels.MentionsKeywords, label: (0, _languageHandler._t)("settings|notifications|mentions_keywords_only") }]; return /*#__PURE__*/_react.default.createElement("div", { className: "mx_NotificationSettings2" }, hasPendingChanges && model !== null && /*#__PURE__*/_react.default.createElement(_SettingsBanner.SettingsBanner, { icon: /*#__PURE__*/_react.default.createElement("img", { src: _newAndImproved.default, alt: "", width: 12 }), action: (0, _languageHandler._t)("action|proceed"), onAction: () => reconcile(model) }, (0, _languageHandler._t)("settings|notifications|labs_notice_prompt", {}, { strong: boldText, a: helpLink })), /*#__PURE__*/_react.default.createElement(_SettingsSection.SettingsSection, null, /*#__PURE__*/_react.default.createElement("div", { className: "mx_SettingsSubsection_content mx_NotificationSettings2_flags" }, /*#__PURE__*/_react.default.createElement(_LabelledToggleSwitch.default, { label: (0, _languageHandler._t)("settings|notifications|enable_notifications_account"), value: !settings.globalMute, disabled: disabled, onChange: value => { reconcile(_objectSpread(_objectSpread({}, model), {}, { globalMute: !value })); } }), /*#__PURE__*/_react.default.createElement(_LabelledToggleSwitch.default, { label: (0, _languageHandler._t)("settings|notifications|enable_desktop_notifications_session"), value: desktopNotifications, onChange: value => _SettingsStore.default.setValue("notificationsEnabled", null, _SettingLevel.SettingLevel.DEVICE, value) }), /*#__PURE__*/_react.default.createElement(_LabelledToggleSwitch.default, { label: (0, _languageHandler._t)("settings|notifications|desktop_notification_message_preview"), value: desktopShowBody, onChange: value => _SettingsStore.default.setValue("notificationBodyEnabled", null, _SettingLevel.SettingLevel.DEVICE, value) }), /*#__PURE__*/_react.default.createElement(_LabelledToggleSwitch.default, { label: (0, _languageHandler._t)("settings|notifications|enable_audible_notifications_session"), value: audioNotifications, onChange: value => _SettingsStore.default.setValue("audioNotificationsEnabled", null, _SettingLevel.SettingLevel.DEVICE, value) })), /*#__PURE__*/_react.default.createElement(_SettingsSubsection.default, { heading: (0, _languageHandler._t)("settings|notifications|default_setting_section"), description: (0, _languageHandler._t)("settings|notifications|default_setting_description") }, /*#__PURE__*/_react.default.createElement(_StyledRadioGroup.default, { name: "defaultNotificationLevel", value: toDefaultLevels(settings.defaultLevels), disabled: disabled, definitions: NotificationOptions, onChange: value => { reconcile(_objectSpread(_objectSpread({}, model), {}, { defaultLevels: _objectSpread(_objectSpread({}, model.defaultLevels), {}, { dm: value !== NotificationDefaultLevels.MentionsKeywords ? _RoomNotifs.RoomNotifState.AllMessages : _RoomNotifs.RoomNotifState.MentionsOnly, room: value === NotificationDefaultLevels.AllMessages ? _RoomNotifs.RoomNotifState.AllMessages : _RoomNotifs.RoomNotifState.MentionsOnly }) })); } })), /*#__PURE__*/_react.default.createElement(_SettingsSubsection.default, { heading: (0, _languageHandler._t)("settings|notifications|play_sound_for_section"), description: (0, _languageHandler._t)("settings|notifications|play_sound_for_description") }, /*#__PURE__*/_react.default.createElement(_LabelledCheckbox.default, { label: "People", value: settings.sound.people !== undefined, disabled: disabled || settings.defaultLevels.dm === _RoomNotifs.RoomNotifState.MentionsOnly, onChange: value => { reconcile(_objectSpread(_objectSpread({}, model), {}, { sound: _objectSpread(_objectSpread({}, model.sound), {}, { people: value ? "default" : undefined }) })); } }), /*#__PURE__*/_react.default.createElement(_LabelledCheckbox.default, { label: (0, _languageHandler._t)("settings|notifications|mentions_keywords"), value: settings.sound.mentions !== undefined, disabled: disabled, onChange: value => { reconcile(_objectSpread(_objectSpread({}, model), {}, { sound: _objectSpread(_objectSpread({}, model.sound), {}, { mentions: value ? "default" : undefined }) })); } }), /*#__PURE__*/_react.default.createElement(_LabelledCheckbox.default, { label: (0, _languageHandler._t)("settings|notifications|voip"), value: settings.sound.calls !== undefined, disabled: disabled, onChange: value => { reconcile(_objectSpread(_objectSpread({}, model), {}, { sound: _objectSpread(_objectSpread({}, model.sound), {}, { calls: value ? "ring" : undefined }) })); } })), /*#__PURE__*/_react.default.createElement(_SettingsSubsection.default, { heading: (0, _languageHandler._t)("settings|notifications|other_section") }, /*#__PURE__*/_react.default.createElement(_LabelledCheckbox.default, { label: (0, _languageHandler._t)("settings|notifications|invites"), value: settings.activity.invite, disabled: disabled, onChange: value => { reconcile(_objectSpread(_objectSpread({}, model), {}, { activity: _objectSpread(_objectSpread({}, model.activity), {}, { invite: value }) })); } }), /*#__PURE__*/_react.default.createElement(_LabelledCheckbox.default, { label: (0, _languageHandler._t)("settings|notifications|room_activity"), value: settings.activity.status_event, disabled: disabled, onChange: value => { reconcile(_objectSpread(_objectSpread({}, model), {}, { activity: _objectSpread(_objectSpread({}, model.activity), {}, { status_event: value }) })); } }), /*#__PURE__*/_react.default.createElement(_LabelledCheckbox.default, { label: (0, _languageHandler._t)("settings|notifications|notices"), value: settings.activity.bot_notices, disabled: disabled, onChange: value => { reconcile(_objectSpread(_objectSpread({}, model), {}, { activity: _objectSpread(_objectSpread({}, model.activity), {}, { bot_notices: value }) })); } })), /*#__PURE__*/_react.default.createElement(_SettingsSubsection.default, { heading: (0, _languageHandler._t)("settings|notifications|mentions_keywords"), description: (0, _languageHandler._t)("settings|notifications|keywords", {}, { badge: /*#__PURE__*/_react.default.createElement(_StatelessNotificationBadge.StatelessNotificationBadge, { symbol: "1", count: 1, level: _NotificationLevel.NotificationLevel.Notification }) }) }, /*#__PURE__*/_react.default.createElement(_LabelledCheckbox.default, { label: (0, _languageHandler._t)("settings|notifications|notify_at_room"), value: settings.mentions.room, disabled: disabled, onChange: value => { reconcile(_objectSpread(_objectSpread({}, model), {}, { mentions: _objectSpread(_objectSpread({}, model.mentions), {}, { room: value }) })); } }), /*#__PURE__*/_react.default.createElement(_LabelledCheckbox.default, { label: (0, _languageHandler._t)("settings|notifications|notify_mention", { mxid: cli.getUserId() }), value: settings.mentions.user, disabled: disabled, onChange: value => { reconcile(_objectSpread(_objectSpread({}, model), {}, { mentions: _objectSpread(_objectSpread({}, model.mentions), {}, { user: value }) })); } }), /*#__PURE__*/_react.default.createElement(_LabelledCheckbox.default, { label: (0, _languageHandler._t)("settings|notifications|notify_keyword"), byline: (0, _languageHandler._t)("settings|notifications|keywords_prompt"), value: settings.mentions.keywords, disabled: disabled, onChange: value => { reconcile(_objectSpread(_objectSpread({}, model), {}, { mentions: _objectSpread(_objectSpread({}, model.mentions), {}, { keywords: value }) })); } }), /*#__PURE__*/_react.default.createElement(_TagComposer.default, { id: "mx_NotificationSettings2_Keywords", tags: model?.keywords ?? [], disabled: disabled, onAdd: keyword => { reconcile(_objectSpread(_objectSpread({}, model), {}, { keywords: [keyword, ...model.keywords] })); }, onRemove: keyword => { reconcile(_objectSpread(_objectSpread({}, model), {}, { keywords: model.keywords.filter(it => it !== keyword) })); }, label: (0, _languageHandler._t)("notifications|keyword"), placeholder: (0, _languageHandler._t)("notifications|keyword_new") }), /*#__PURE__*/_react.default.createElement(_SettingsFlag.default, { name: "Notifications.showbold", level: _SettingLevel.SettingLevel.DEVICE }), /*#__PURE__*/_react.default.createElement(_SettingsFlag.default, { name: "Notifications.tac_only_notifications", level: _SettingLevel.SettingLevel.DEVICE })), /*#__PURE__*/_react.default.createElement(_NotificationPusherSettings.NotificationPusherSettings, null), /*#__PURE__*/_react.default.createElement(_SettingsSubsection.default, { heading: (0, _languageHandler._t)("settings|notifications|quick_actions_section") }, hasUnreadNotifications && /*#__PURE__*/_react.default.createElement(_AccessibleButton.default, { kind: "primary_outline", disabled: updatingUnread, onClick: async () => { setUpdatingUnread(true); await (0, _notifications.clearAllNotifications)(cli); setUpdatingUnread(false); } }, (0, _languageHandler._t)("settings|notifications|quick_actions_mark_all_read")), /*#__PURE__*/_react.default.createElement(_AccessibleButton.default, { kind: "danger_outline", disabled: model === null, onClick: () => { reconcile(_NotificationSettings.DefaultNotificationSettings); } }, (0, _languageHandler._t)("settings|notifications|quick_actions_reset"))))); } //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCIsInJlcXVpcmUiLCJfbmV3QW5kSW1wcm92ZWQiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwiX01hdHJpeENsaWVudENvbnRleHQiLCJfdXNlTm90aWZpY2F0aW9uU2V0dGluZ3MiLCJfdXNlU2V0dGluZ3MiLCJfbGFuZ3VhZ2VIYW5kbGVyIiwiX05vdGlmaWNhdGlvblNldHRpbmdzIiwiX1Jvb21Ob3RpZnMiLCJfU2V0dGluZ0xldmVsIiwiX1NldHRpbmdzU3RvcmUiLCJfTm90aWZpY2F0aW9uTGV2ZWwiLCJfbm90aWZpY2F0aW9ucyIsIl9BY2Nlc3NpYmxlQnV0dG9uIiwiX0V4dGVybmFsTGluayIsIl9MYWJlbGxlZENoZWNrYm94IiwiX0xhYmVsbGVkVG9nZ2xlU3dpdGNoIiwiX1N0eWxlZFJhZGlvR3JvdXAiLCJfVGFnQ29tcG9zZXIiLCJfU3RhdGVsZXNzTm90aWZpY2F0aW9uQmFkZ2UiLCJfU2V0dGluZ3NCYW5uZXIiLCJfU2V0dGluZ3NTZWN0aW9uIiwiX1NldHRpbmdzU3Vic2VjdGlvbiIsIl9Ob3RpZmljYXRpb25QdXNoZXJTZXR0aW5ncyIsIl9TZXR0aW5nc0ZsYWciLCJfZ2V0UmVxdWlyZVdpbGRjYXJkQ2FjaGUiLCJlIiwiV2Vha01hcCIsInIiLCJ0IiwiX19lc01vZHVsZSIsImRlZmF1bHQiLCJoYXMiLCJnZXQiLCJuIiwiX19wcm90b19fIiwiYSIsIk9iamVjdCIsImRlZmluZVByb3BlcnR5IiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwidSIsImhhc093blByb3BlcnR5IiwiY2FsbCIsImkiLCJzZXQiLCJvd25LZXlzIiwia2V5cyIsImdldE93blByb3BlcnR5U3ltYm9scyIsIm8iLCJmaWx0ZXIiLCJlbnVtZXJhYmxlIiwicHVzaCIsImFwcGx5IiwiX29iamVjdFNwcmVhZCIsImFyZ3VtZW50cyIsImxlbmd0aCIsImZvckVhY2giLCJfZGVmaW5lUHJvcGVydHkyIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyIsImRlZmluZVByb3BlcnRpZXMiLCJOb3RpZmljYXRpb25EZWZhdWx0TGV2ZWxzIiwidG9EZWZhdWx0TGV2ZWxzIiwibGV2ZWxzIiwicm9vbSIsIlJvb21Ob3RpZlN0YXRlIiwiQWxsTWVzc2FnZXMiLCJkbSIsIlBlb3BsZU1lbnRpb25zS2V5d29yZHMiLCJNZW50aW9uc0tleXdvcmRzIiwiYm9sZFRleHQiLCJ0ZXh0IiwiY3JlYXRlRWxlbWVudCIsImhlbHBMaW5rIiwic3ViIiwiaHJlZiIsInVzZUhhc1VucmVhZE5vdGlmaWNhdGlvbnMiLCJjbGkiLCJ1c2VNYXRyaXhDbGllbnRDb250ZXh0IiwiZ2V0Um9vbXMiLCJzb21lIiwiZ2V0VW5yZWFkTm90aWZpY2F0aW9uQ291bnQiLCJOb3RpZmljYXRpb25TZXR0aW5nczIiLCJkZXNrdG9wTm90aWZpY2F0aW9ucyIsInVzZVNldHRpbmdWYWx1ZSIsImRlc2t0b3BTaG93Qm9keSIsImF1ZGlvTm90aWZpY2F0aW9ucyIsIm1vZGVsIiwiaGFzUGVuZGluZ0NoYW5nZXMiLCJyZWNvbmNpbGUiLCJ1c2VOb3RpZmljYXRpb25TZXR0aW5ncyIsImRpc2FibGVkIiwic2V0dGluZ3MiLCJEZWZhdWx0Tm90aWZpY2F0aW9uU2V0dGluZ3MiLCJ1cGRhdGluZ1VucmVhZCIsInNldFVwZGF0aW5nVW5yZWFkIiwidXNlU3RhdGUiLCJoYXNVbnJlYWROb3RpZmljYXRpb25zIiwiTm90aWZpY2F0aW9uT3B0aW9ucyIsInZhbHVlIiwibGFiZWwiLCJfdCIsImNsYXNzTmFtZSIsIlNldHRpbmdzQmFubmVyIiwiaWNvbiIsInNyYyIsIk5ld0FuZEltcHJvdmVkSWNvbiIsImFsdCIsIndpZHRoIiwiYWN0aW9uIiwib25BY3Rpb24iLCJzdHJvbmciLCJTZXR0aW5nc1NlY3Rpb24iLCJnbG9iYWxNdXRlIiwib25DaGFuZ2UiLCJTZXR0aW5nc1N0b3JlIiwic2V0VmFsdWUiLCJTZXR0aW5nTGV2ZWwiLCJERVZJQ0UiLCJoZWFkaW5nIiwiZGVzY3JpcHRpb24iLCJuYW1lIiwiZGVmYXVsdExldmVscyIsImRlZmluaXRpb25zIiwiTWVudGlvbnNPbmx5Iiwic291bmQiLCJwZW9wbGUiLCJ1bmRlZmluZWQiLCJtZW50aW9ucyIsImNhbGxzIiwiYWN0aXZpdHkiLCJpbnZpdGUiLCJzdGF0dXNfZXZlbnQiLCJib3Rfbm90aWNlcyIsImJhZGdlIiwiU3RhdGVsZXNzTm90aWZpY2F0aW9uQmFkZ2UiLCJzeW1ib2wiLCJjb3VudCIsImxldmVsIiwiTm90aWZpY2F0aW9uTGV2ZWwiLCJOb3RpZmljYXRpb24iLCJteGlkIiwiZ2V0VXNlcklkIiwidXNlciIsImJ5bGluZSIsImtleXdvcmRzIiwiaWQiLCJ0YWdzIiwib25BZGQiLCJrZXl3b3JkIiwib25SZW1vdmUiLCJpdCIsInBsYWNlaG9sZGVyIiwiTm90aWZpY2F0aW9uUHVzaGVyU2V0dGluZ3MiLCJraW5kIiwib25DbGljayIsImNsZWFyQWxsTm90aWZpY2F0aW9ucyJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnRzL3ZpZXdzL3NldHRpbmdzL25vdGlmaWNhdGlvbnMvTm90aWZpY2F0aW9uU2V0dGluZ3MyLnRzeCJdLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuQ29weXJpZ2h0IDIwMjQgTmV3IFZlY3RvciBMdGQuXG5Db3B5cmlnaHQgMjAyMyBUaGUgTWF0cml4Lm9yZyBGb3VuZGF0aW9uIEMuSS5DLlxuXG5TUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQUdQTC0zLjAtb25seSBPUiBHUEwtMy4wLW9ubHlcblBsZWFzZSBzZWUgTElDRU5TRSBmaWxlcyBpbiB0aGUgcmVwb3NpdG9yeSByb290IGZvciBmdWxsIGRldGFpbHMuXG4qL1xuXG5pbXBvcnQgUmVhY3QsIHsgdXNlU3RhdGUgfSBmcm9tIFwicmVhY3RcIjtcblxuaW1wb3J0IE5ld0FuZEltcHJvdmVkSWNvbiBmcm9tIFwiLi4vLi4vLi4vLi4vLi4vcmVzL2ltZy9lbGVtZW50LWljb25zL25ldy1hbmQtaW1wcm92ZWQuc3ZnXCI7XG5pbXBvcnQgeyB1c2VNYXRyaXhDbGllbnRDb250ZXh0IH0gZnJvbSBcIi4uLy4uLy4uLy4uL2NvbnRleHRzL01hdHJpeENsaWVudENvbnRleHRcIjtcbmltcG9ydCB7IHVzZU5vdGlmaWNhdGlvblNldHRpbmdzIH0gZnJvbSBcIi4uLy4uLy4uLy4uL2hvb2tzL3VzZU5vdGlmaWNhdGlvblNldHRpbmdzXCI7XG5pbXBvcnQgeyB1c2VTZXR0aW5nVmFsdWUgfSBmcm9tIFwiLi4vLi4vLi4vLi4vaG9va3MvdXNlU2V0dGluZ3NcIjtcbmltcG9ydCB7IF90IH0gZnJvbSBcIi4uLy4uLy4uLy4uL2xhbmd1YWdlSGFuZGxlclwiO1xuaW1wb3J0IHtcbiAgICBEZWZhdWx0Tm90aWZpY2F0aW9uU2V0dGluZ3MsXG4gICAgTm90aWZpY2F0aW9uU2V0dGluZ3MsXG59IGZyb20gXCIuLi8uLi8uLi8uLi9tb2RlbHMvbm90aWZpY2F0aW9uc2V0dGluZ3MvTm90aWZpY2F0aW9uU2V0dGluZ3NcIjtcbmltcG9ydCB7IFJvb21Ob3RpZlN0YXRlIH0gZnJvbSBcIi4uLy4uLy4uLy4uL1Jvb21Ob3RpZnNcIjtcbmltcG9ydCB7IFNldHRpbmdMZXZlbCB9IGZyb20gXCIuLi8uLi8uLi8uLi9zZXR0aW5ncy9TZXR0aW5nTGV2ZWxcIjtcbmltcG9ydCBTZXR0aW5nc1N0b3JlIGZyb20gXCIuLi8uLi8uLi8uLi9zZXR0aW5ncy9TZXR0aW5nc1N0b3JlXCI7XG5pbXBvcnQgeyBOb3RpZmljYXRpb25MZXZlbCB9IGZyb20gXCIuLi8uLi8uLi8uLi9zdG9yZXMvbm90aWZpY2F0aW9ucy9Ob3RpZmljYXRpb25MZXZlbFwiO1xuaW1wb3J0IHsgY2xlYXJBbGxOb3RpZmljYXRpb25zIH0gZnJvbSBcIi4uLy4uLy4uLy4uL3V0aWxzL25vdGlmaWNhdGlvbnNcIjtcbmltcG9ydCBBY2Nlc3NpYmxlQnV0dG9uIGZyb20gXCIuLi8uLi9lbGVtZW50cy9BY2Nlc3NpYmxlQnV0dG9uXCI7XG5pbXBvcnQgRXh0ZXJuYWxMaW5rIGZyb20gXCIuLi8uLi9lbGVtZW50cy9FeHRlcm5hbExpbmtcIjtcbmltcG9ydCBMYWJlbGxlZENoZWNrYm94IGZyb20gXCIuLi8uLi9lbGVtZW50cy9MYWJlbGxlZENoZWNrYm94XCI7XG5pbXBvcnQgTGFiZWxsZWRUb2dnbGVTd2l0Y2ggZnJvbSBcIi4uLy4uL2VsZW1lbnRzL0xhYmVsbGVkVG9nZ2xlU3dpdGNoXCI7XG5pbXBvcnQgU3R5bGVkUmFkaW9Hcm91cCBmcm9tIFwiLi4vLi4vZWxlbWVudHMvU3R5bGVkUmFkaW9Hcm91cFwiO1xuaW1wb3J0IFRhZ0NvbXBvc2VyIGZyb20gXCIuLi8uLi9lbGVtZW50cy9UYWdDb21wb3NlclwiO1xuaW1wb3J0IHsgU3RhdGVsZXNzTm90aWZpY2F0aW9uQmFkZ2UgfSBmcm9tIFwiLi4vLi4vcm9vbXMvTm90aWZpY2F0aW9uQmFkZ2UvU3RhdGVsZXNzTm90aWZpY2F0aW9uQmFkZ2VcIjtcbmltcG9ydCB7IFNldHRpbmdzQmFubmVyIH0gZnJvbSBcIi4uL3NoYXJlZC9TZXR0aW5nc0Jhbm5lclwiO1xuaW1wb3J0IHsgU2V0dGluZ3NTZWN0aW9uIH0gZnJvbSBcIi4uL3NoYXJlZC9TZXR0aW5nc1NlY3Rpb25cIjtcbmltcG9ydCBTZXR0aW5nc1N1YnNlY3Rpb24gZnJvbSBcIi4uL3NoYXJlZC9TZXR0aW5nc1N1YnNlY3Rpb25cIjtcbmltcG9ydCB7IE5vdGlmaWNhdGlvblB1c2hlclNldHRpbmdzIH0gZnJvbSBcIi4vTm90aWZpY2F0aW9uUHVzaGVyU2V0dGluZ3NcIjtcbmltcG9ydCBTZXR0aW5nc0ZsYWcgZnJvbSBcIi4uLy4uL2VsZW1lbnRzL1NldHRpbmdzRmxhZ1wiO1xuXG5lbnVtIE5vdGlmaWNhdGlvbkRlZmF1bHRMZXZlbHMge1xuICAgIEFsbE1lc3NhZ2VzID0gXCJhbGxfbWVzc2FnZXNcIixcbiAgICBQZW9wbGVNZW50aW9uc0tleXdvcmRzID0gXCJwZW9wbGVfbWVudGlvbnNfa2V5d29yZHNcIixcbiAgICBNZW50aW9uc0tleXdvcmRzID0gXCJtZW50aW9uc19rZXl3b3Jkc1wiLFxufVxuXG5mdW5jdGlvbiB0b0RlZmF1bHRMZXZlbHMobGV2ZWxzOiBOb3RpZmljYXRpb25TZXR0aW5nc1tcImRlZmF1bHRMZXZlbHNcIl0pOiBOb3RpZmljYXRpb25EZWZhdWx0TGV2ZWxzIHtcbiAgICBpZiAobGV2ZWxzLnJvb20gPT09IFJvb21Ob3RpZlN0YXRlLkFsbE1lc3NhZ2VzKSB7XG4gICAgICAgIHJldHVybiBOb3RpZmljYXRpb25EZWZhdWx0TGV2ZWxzLkFsbE1lc3NhZ2VzO1xuICAgIH0gZWxzZSBpZiAobGV2ZWxzLmRtID09PSBSb29tTm90aWZTdGF0ZS5BbGxNZXNzYWdlcykge1xuICAgICAgICByZXR1cm4gTm90aWZpY2F0aW9uRGVmYXVsdExldmVscy5QZW9wbGVNZW50aW9uc0tleXdvcmRzO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBOb3RpZmljYXRpb25EZWZhdWx0TGV2ZWxzLk1lbnRpb25zS2V5d29yZHM7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBib2xkVGV4dCh0ZXh0OiBzdHJpbmcpOiBKU1guRWxlbWVudCB7XG4gICAgcmV0dXJuIDxzdHJvbmc+e3RleHR9PC9zdHJvbmc+O1xufVxuXG5mdW5jdGlvbiBoZWxwTGluayhzdWI6IHN0cmluZyk6IEpTWC5FbGVtZW50IHtcbiAgICByZXR1cm4gPEV4dGVybmFsTGluayBocmVmPVwiaHR0cHM6Ly9lbGVtZW50LmlvL2hlbHAjc2V0dGluZ3MyXCI+e3N1Yn08L0V4dGVybmFsTGluaz47XG59XG5cbmZ1bmN0aW9uIHVzZUhhc1VucmVhZE5vdGlmaWNhdGlvbnMoKTogYm9vbGVhbiB7XG4gICAgY29uc3QgY2xpID0gdXNlTWF0cml4Q2xpZW50Q29udGV4dCgpO1xuICAgIHJldHVybiBjbGkuZ2V0Um9vbXMoKS5zb21lKChyb29tKSA9PiByb29tLmdldFVucmVhZE5vdGlmaWNhdGlvbkNvdW50KCkgPiAwKTtcbn1cblxuLyoqXG4gKiBUaGUgbmV3IG5vdGlmaWNhdGlvbiBzZXR0aW5ncyB0YWIgdmlldywgb25seSBkaXNwbGF5ZWQgaWYgdGhlIHVzZXIgaGFzIEZlYXR1cmVzLk5vdGlmaWNhdGlvblNldHRpbmdzMiBlbmFibGVkXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIE5vdGlmaWNhdGlvblNldHRpbmdzMigpOiBKU1guRWxlbWVudCB7XG4gICAgY29uc3QgY2xpID0gdXNlTWF0cml4Q2xpZW50Q29udGV4dCgpO1xuXG4gICAgY29uc3QgZGVza3RvcE5vdGlmaWNhdGlvbnMgPSB1c2VTZXR0aW5nVmFsdWU8Ym9vbGVhbj4oXCJub3RpZmljYXRpb25zRW5hYmxlZFwiKTtcbiAgICBjb25zdCBkZXNrdG9wU2hvd0JvZHkgPSB1c2VTZXR0aW5nVmFsdWU8Ym9vbGVhbj4oXCJub3RpZmljYXRpb25Cb2R5RW5hYmxlZFwiKTtcbiAgICBjb25zdCBhdWRpb05vdGlmaWNhdGlvbnMgPSB1c2VTZXR0aW5nVmFsdWU8Ym9vbGVhbj4oXCJhdWRpb05vdGlmaWNhdGlvbnNFbmFibGVkXCIpO1xuXG4gICAgY29uc3QgeyBtb2RlbCwgaGFzUGVuZGluZ0NoYW5nZXMsIHJlY29uY2lsZSB9ID0gdXNlTm90aWZpY2F0aW9uU2V0dGluZ3MoY2xpKTtcblxuICAgIGNvbnN0IGRpc2FibGVkID0gbW9kZWwgPT09IG51bGwgfHwgaGFzUGVuZGluZ0NoYW5nZXM7XG4gICAgY29uc3Qgc2V0dGluZ3MgPSBtb2RlbCA/PyBEZWZhdWx0Tm90aWZpY2F0aW9uU2V0dGluZ3M7XG5cbiAgICBjb25zdCBbdXBkYXRpbmdVbnJlYWQsIHNldFVwZGF0aW5nVW5yZWFkXSA9IHVzZVN0YXRlPGJvb2xlYW4+KGZhbHNlKTtcbiAgICBjb25zdCBoYXNVbnJlYWROb3RpZmljYXRpb25zID0gdXNlSGFzVW5yZWFkTm90aWZpY2F0aW9ucygpO1xuXG4gICAgY29uc3QgTm90aWZpY2F0aW9uT3B0aW9ucyA9IFtcbiAgICAgICAge1xuICAgICAgICAgICAgdmFsdWU6IE5vdGlmaWNhdGlvbkRlZmF1bHRMZXZlbHMuQWxsTWVzc2FnZXMsXG4gICAgICAgICAgICBsYWJlbDogX3QoXCJub3RpZmljYXRpb25zfGFsbF9tZXNzYWdlc1wiKSxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgdmFsdWU6IE5vdGlmaWNhdGlvbkRlZmF1bHRMZXZlbHMuUGVvcGxlTWVudGlvbnNLZXl3b3JkcyxcbiAgICAgICAgICAgIGxhYmVsOiBfdChcInNldHRpbmdzfG5vdGlmaWNhdGlvbnN8cGVvcGxlX21lbnRpb25zX2tleXdvcmRzXCIpLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICB2YWx1ZTogTm90aWZpY2F0aW9uRGVmYXVsdExldmVscy5NZW50aW9uc0tleXdvcmRzLFxuICAgICAgICAgICAgbGFiZWw6IF90KFwic2V0dGluZ3N8bm90aWZpY2F0aW9uc3xtZW50aW9uc19rZXl3b3Jkc19vbmx5XCIpLFxuICAgICAgICB9LFxuICAgIF07XG5cbiAgICByZXR1cm4gKFxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm14X05vdGlmaWNhdGlvblNldHRpbmdzMlwiPlxuICAgICAgICAgICAge2hhc1BlbmRpbmdDaGFuZ2VzICYmIG1vZGVsICE9PSBudWxsICYmIChcbiAgICAgICAgICAgICAgICA8U2V0dGluZ3NCYW5uZXJcbiAgICAgICAgICAgICAgICAgICAgaWNvbj17PGltZyBzcmM9e05ld0FuZEltcHJvdmVkSWNvbn0gYWx0PVwiXCIgd2lkdGg9ezEyfSAvPn1cbiAgICAgICAgICAgICAgICAgICAgYWN0aW9uPXtfdChcImFjdGlvbnxwcm9jZWVkXCIpfVxuICAgICAgICAgICAgICAgICAgICBvbkFjdGlvbj17KCkgPT4gcmVjb25jaWxlKG1vZGVsISl9XG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICB7X3QoXG4gICAgICAgICAgICAgICAgICAgICAgICBcInNldHRpbmdzfG5vdGlmaWNhdGlvbnN8bGFic19ub3RpY2VfcHJvbXB0XCIsXG4gICAgICAgICAgICAgICAgICAgICAgICB7fSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJvbmc6IGJvbGRUZXh0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGE6IGhlbHBMaW5rLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgICA8L1NldHRpbmdzQmFubmVyPlxuICAgICAgICAgICAgKX1cbiAgICAgICAgICAgIDxTZXR0aW5nc1NlY3Rpb24+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJteF9TZXR0aW5nc1N1YnNlY3Rpb25fY29udGVudCBteF9Ob3RpZmljYXRpb25TZXR0aW5nczJfZmxhZ3NcIj5cbiAgICAgICAgICAgICAgICAgICAgPExhYmVsbGVkVG9nZ2xlU3dpdGNoXG4gICAgICAgICAgICAgICAgICAgICAgICBsYWJlbD17X3QoXCJzZXR0aW5nc3xub3RpZmljYXRpb25zfGVuYWJsZV9ub3RpZmljYXRpb25zX2FjY291bnRcIil9XG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT17IXNldHRpbmdzLmdsb2JhbE11dGV9XG4gICAgICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZD17ZGlzYWJsZWR9XG4gICAgICAgICAgICAgICAgICAgICAgICBvbkNoYW5nZT17KHZhbHVlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjb25jaWxlKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4ubW9kZWwhLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnbG9iYWxNdXRlOiAhdmFsdWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICA8TGFiZWxsZWRUb2dnbGVTd2l0Y2hcbiAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsPXtfdChcInNldHRpbmdzfG5vdGlmaWNhdGlvbnN8ZW5hYmxlX2Rlc2t0b3Bfbm90aWZpY2F0aW9uc19zZXNzaW9uXCIpfVxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9e2Rlc2t0b3BOb3RpZmljYXRpb25zfVxuICAgICAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9eyh2YWx1ZSkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXR0aW5nc1N0b3JlLnNldFZhbHVlKFwibm90aWZpY2F0aW9uc0VuYWJsZWRcIiwgbnVsbCwgU2V0dGluZ0xldmVsLkRFVklDRSwgdmFsdWUpXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgIDxMYWJlbGxlZFRvZ2dsZVN3aXRjaFxuICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw9e190KFwic2V0dGluZ3N8bm90aWZpY2F0aW9uc3xkZXNrdG9wX25vdGlmaWNhdGlvbl9tZXNzYWdlX3ByZXZpZXdcIil9XG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT17ZGVza3RvcFNob3dCb2R5fVxuICAgICAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9eyh2YWx1ZSkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXR0aW5nc1N0b3JlLnNldFZhbHVlKFwibm90aWZpY2F0aW9uQm9keUVuYWJsZWRcIiwgbnVsbCwgU2V0dGluZ0xldmVsLkRFVklDRSwgdmFsdWUpXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgIDxMYWJlbGxlZFRvZ2dsZVN3aXRjaFxuICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw9e190KFwic2V0dGluZ3N8bm90aWZpY2F0aW9uc3xlbmFibGVfYXVkaWJsZV9ub3RpZmljYXRpb25zX3Nlc3Npb25cIil9XG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT17YXVkaW9Ob3RpZmljYXRpb25zfVxuICAgICAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9eyh2YWx1ZSkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXR0aW5nc1N0b3JlLnNldFZhbHVlKFwiYXVkaW9Ob3RpZmljYXRpb25zRW5hYmxlZFwiLCBudWxsLCBTZXR0aW5nTGV2ZWwuREVWSUNFLCB2YWx1ZSlcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8U2V0dGluZ3NTdWJzZWN0aW9uXG4gICAgICAgICAgICAgICAgICAgIGhlYWRpbmc9e190KFwic2V0dGluZ3N8bm90aWZpY2F0aW9uc3xkZWZhdWx0X3NldHRpbmdfc2VjdGlvblwiKX1cbiAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb249e190KFwic2V0dGluZ3N8bm90aWZpY2F0aW9uc3xkZWZhdWx0X3NldHRpbmdfZGVzY3JpcHRpb25cIil9XG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8U3R5bGVkUmFkaW9Hcm91cFxuICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT1cImRlZmF1bHROb3RpZmljYXRpb25MZXZlbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT17dG9EZWZhdWx0TGV2ZWxzKHNldHRpbmdzLmRlZmF1bHRMZXZlbHMpfVxuICAgICAgICAgICAgICAgICAgICAgICAgZGlzYWJsZWQ9e2Rpc2FibGVkfVxuICAgICAgICAgICAgICAgICAgICAgICAgZGVmaW5pdGlvbnM9e05vdGlmaWNhdGlvbk9wdGlvbnN9XG4gICAgICAgICAgICAgICAgICAgICAgICBvbkNoYW5nZT17KHZhbHVlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjb25jaWxlKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4ubW9kZWwhLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0TGV2ZWxzOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5tb2RlbCEuZGVmYXVsdExldmVscyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRtOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlICE9PSBOb3RpZmljYXRpb25EZWZhdWx0TGV2ZWxzLk1lbnRpb25zS2V5d29yZHNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBSb29tTm90aWZTdGF0ZS5BbGxNZXNzYWdlc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IFJvb21Ob3RpZlN0YXRlLk1lbnRpb25zT25seSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvb206XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPT09IE5vdGlmaWNhdGlvbkRlZmF1bHRMZXZlbHMuQWxsTWVzc2FnZXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBSb29tTm90aWZTdGF0ZS5BbGxNZXNzYWdlc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IFJvb21Ob3RpZlN0YXRlLk1lbnRpb25zT25seSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgPC9TZXR0aW5nc1N1YnNlY3Rpb24+XG4gICAgICAgICAgICAgICAgPFNldHRpbmdzU3Vic2VjdGlvblxuICAgICAgICAgICAgICAgICAgICBoZWFkaW5nPXtfdChcInNldHRpbmdzfG5vdGlmaWNhdGlvbnN8cGxheV9zb3VuZF9mb3Jfc2VjdGlvblwiKX1cbiAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb249e190KFwic2V0dGluZ3N8bm90aWZpY2F0aW9uc3xwbGF5X3NvdW5kX2Zvcl9kZXNjcmlwdGlvblwiKX1cbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDxMYWJlbGxlZENoZWNrYm94XG4gICAgICAgICAgICAgICAgICAgICAgICBsYWJlbD1cIlBlb3BsZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT17c2V0dGluZ3Muc291bmQucGVvcGxlICE9PSB1bmRlZmluZWR9XG4gICAgICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZD17ZGlzYWJsZWQgfHwgc2V0dGluZ3MuZGVmYXVsdExldmVscy5kbSA9PT0gUm9vbU5vdGlmU3RhdGUuTWVudGlvbnNPbmx5fVxuICAgICAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9eyh2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY29uY2lsZSh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLm1vZGVsISxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291bmQ6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLm1vZGVsIS5zb3VuZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlb3BsZTogdmFsdWUgPyBcImRlZmF1bHRcIiA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgIDxMYWJlbGxlZENoZWNrYm94XG4gICAgICAgICAgICAgICAgICAgICAgICBsYWJlbD17X3QoXCJzZXR0aW5nc3xub3RpZmljYXRpb25zfG1lbnRpb25zX2tleXdvcmRzXCIpfVxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9e3NldHRpbmdzLnNvdW5kLm1lbnRpb25zICE9PSB1bmRlZmluZWR9XG4gICAgICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZD17ZGlzYWJsZWR9XG4gICAgICAgICAgICAgICAgICAgICAgICBvbkNoYW5nZT17KHZhbHVlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjb25jaWxlKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4ubW9kZWwhLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VuZDoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4ubW9kZWwhLnNvdW5kLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVudGlvbnM6IHZhbHVlID8gXCJkZWZhdWx0XCIgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICA8TGFiZWxsZWRDaGVja2JveFxuICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw9e190KFwic2V0dGluZ3N8bm90aWZpY2F0aW9uc3x2b2lwXCIpfVxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9e3NldHRpbmdzLnNvdW5kLmNhbGxzICE9PSB1bmRlZmluZWR9XG4gICAgICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZD17ZGlzYWJsZWR9XG4gICAgICAgICAgICAgICAgICAgICAgICBvbkNoYW5nZT17KHZhbHVlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjb25jaWxlKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4ubW9kZWwhLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VuZDoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4ubW9kZWwhLnNvdW5kLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbHM6IHZhbHVlID8gXCJyaW5nXCIgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgIDwvU2V0dGluZ3NTdWJzZWN0aW9uPlxuICAgICAgICAgICAgICAgIDxTZXR0aW5nc1N1YnNlY3Rpb24gaGVhZGluZz17X3QoXCJzZXR0aW5nc3xub3RpZmljYXRpb25zfG90aGVyX3NlY3Rpb25cIil9PlxuICAgICAgICAgICAgICAgICAgICA8TGFiZWxsZWRDaGVja2JveFxuICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw9e190KFwic2V0dGluZ3N8bm90aWZpY2F0aW9uc3xpbnZpdGVzXCIpfVxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9e3NldHRpbmdzLmFjdGl2aXR5Lmludml0ZX1cbiAgICAgICAgICAgICAgICAgICAgICAgIGRpc2FibGVkPXtkaXNhYmxlZH1cbiAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXsodmFsdWUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWNvbmNpbGUoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5tb2RlbCEsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGl2aXR5OiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5tb2RlbCEuYWN0aXZpdHksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnZpdGU6IHZhbHVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgPExhYmVsbGVkQ2hlY2tib3hcbiAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsPXtfdChcInNldHRpbmdzfG5vdGlmaWNhdGlvbnN8cm9vbV9hY3Rpdml0eVwiKX1cbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPXtzZXR0aW5ncy5hY3Rpdml0eS5zdGF0dXNfZXZlbnR9XG4gICAgICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZD17ZGlzYWJsZWR9XG4gICAgICAgICAgICAgICAgICAgICAgICBvbkNoYW5nZT17KHZhbHVlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjb25jaWxlKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4ubW9kZWwhLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3Rpdml0eToge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4ubW9kZWwhLmFjdGl2aXR5LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzX2V2ZW50OiB2YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgIDxMYWJlbGxlZENoZWNrYm94XG4gICAgICAgICAgICAgICAgICAgICAgICBsYWJlbD17X3QoXCJzZXR0aW5nc3xub3RpZmljYXRpb25zfG5vdGljZXNcIil9XG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT17c2V0dGluZ3MuYWN0aXZpdHkuYm90X25vdGljZXN9XG4gICAgICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZD17ZGlzYWJsZWR9XG4gICAgICAgICAgICAgICAgICAgICAgICBvbkNoYW5nZT17KHZhbHVlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjb25jaWxlKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4ubW9kZWwhLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3Rpdml0eToge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4ubW9kZWwhLmFjdGl2aXR5LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm90X25vdGljZXM6IHZhbHVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICA8L1NldHRpbmdzU3Vic2VjdGlvbj5cbiAgICAgICAgICAgICAgICA8U2V0dGluZ3NTdWJzZWN0aW9uXG4gICAgICAgICAgICAgICAgICAgIGhlYWRpbmc9e190KFwic2V0dGluZ3N8bm90aWZpY2F0aW9uc3xtZW50aW9uc19rZXl3b3Jkc1wiKX1cbiAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb249e190KFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJzZXR0aW5nc3xub3RpZmljYXRpb25zfGtleXdvcmRzXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICB7fSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWRnZTogKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8U3RhdGVsZXNzTm90aWZpY2F0aW9uQmFkZ2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5bWJvbD1cIjFcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ9ezF9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbD17Tm90aWZpY2F0aW9uTGV2ZWwuTm90aWZpY2F0aW9ufVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPExhYmVsbGVkQ2hlY2tib3hcbiAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsPXtfdChcInNldHRpbmdzfG5vdGlmaWNhdGlvbnN8bm90aWZ5X2F0X3Jvb21cIil9XG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT17c2V0dGluZ3MubWVudGlvbnMucm9vbX1cbiAgICAgICAgICAgICAgICAgICAgICAgIGRpc2FibGVkPXtkaXNhYmxlZH1cbiAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXsodmFsdWUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWNvbmNpbGUoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5tb2RlbCEsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbnRpb25zOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5tb2RlbCEubWVudGlvbnMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb29tOiB2YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgIDxMYWJlbGxlZENoZWNrYm94XG4gICAgICAgICAgICAgICAgICAgICAgICBsYWJlbD17X3QoXCJzZXR0aW5nc3xub3RpZmljYXRpb25zfG5vdGlmeV9tZW50aW9uXCIsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBteGlkOiBjbGkuZ2V0VXNlcklkKCkhLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSl9XG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT17c2V0dGluZ3MubWVudGlvbnMudXNlcn1cbiAgICAgICAgICAgICAgICAgICAgICAgIGRpc2FibGVkPXtkaXNhYmxlZH1cbiAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXsodmFsdWUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWNvbmNpbGUoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5tb2RlbCEsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbnRpb25zOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5tb2RlbCEubWVudGlvbnMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VyOiB2YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgIDxMYWJlbGxlZENoZWNrYm94XG4gICAgICAgICAgICAgICAgICAgICAgICBsYWJlbD17X3QoXCJzZXR0aW5nc3xub3RpZmljYXRpb25zfG5vdGlmeV9rZXl3b3JkXCIpfVxuICAgICAgICAgICAgICAgICAgICAgICAgYnlsaW5lPXtfdChcInNldHRpbmdzfG5vdGlmaWNhdGlvbnN8a2V5d29yZHNfcHJvbXB0XCIpfVxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9e3NldHRpbmdzLm1lbnRpb25zLmtleXdvcmRzfVxuICAgICAgICAgICAgICAgICAgICAgICAgZGlzYWJsZWQ9e2Rpc2FibGVkfVxuICAgICAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9eyh2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY29uY2lsZSh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLm1vZGVsISxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVudGlvbnM6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLm1vZGVsIS5tZW50aW9ucyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleXdvcmRzOiB2YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgIDxUYWdDb21wb3NlclxuICAgICAgICAgICAgICAgICAgICAgICAgaWQ9XCJteF9Ob3RpZmljYXRpb25TZXR0aW5nczJfS2V5d29yZHNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgdGFncz17bW9kZWw/LmtleXdvcmRzID8/IFtdfVxuICAgICAgICAgICAgICAgICAgICAgICAgZGlzYWJsZWQ9e2Rpc2FibGVkfVxuICAgICAgICAgICAgICAgICAgICAgICAgb25BZGQ9eyhrZXl3b3JkKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjb25jaWxlKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4ubW9kZWwhLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXl3b3JkczogW2tleXdvcmQsIC4uLm1vZGVsIS5rZXl3b3Jkc10sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgb25SZW1vdmU9eyhrZXl3b3JkKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjb25jaWxlKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4ubW9kZWwhLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXl3b3JkczogbW9kZWwhLmtleXdvcmRzLmZpbHRlcigoaXQpID0+IGl0ICE9PSBrZXl3b3JkKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgICAgICAgICAgICBsYWJlbD17X3QoXCJub3RpZmljYXRpb25zfGtleXdvcmRcIil9XG4gICAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj17X3QoXCJub3RpZmljYXRpb25zfGtleXdvcmRfbmV3XCIpfVxuICAgICAgICAgICAgICAgICAgICAvPlxuXG4gICAgICAgICAgICAgICAgICAgIDxTZXR0aW5nc0ZsYWcgbmFtZT1cIk5vdGlmaWNhdGlvbnMuc2hvd2JvbGRcIiBsZXZlbD17U2V0dGluZ0xldmVsLkRFVklDRX0gLz5cbiAgICAgICAgICAgICAgICAgICAgPFNldHRpbmdzRmxhZyBuYW1lPVwiTm90aWZpY2F0aW9ucy50YWNfb25seV9ub3RpZmljYXRpb25zXCIgbGV2ZWw9e1NldHRpbmdMZXZlbC5ERVZJQ0V9IC8+XG4gICAgICAgICAgICAgICAgPC9TZXR0aW5nc1N1YnNlY3Rpb24+XG4gICAgICAgICAgICAgICAgPE5vdGlmaWNhdGlvblB1c2hlclNldHRpbmdzIC8+XG4gICAgICAgICAgICAgICAgPFNldHRpbmdzU3Vic2VjdGlvbiBoZWFkaW5nPXtfdChcInNldHRpbmdzfG5vdGlmaWNhdGlvbnN8cXVpY2tfYWN0aW9uc19zZWN0aW9uXCIpfT5cbiAgICAgICAgICAgICAgICAgICAge2hhc1VucmVhZE5vdGlmaWNhdGlvbnMgJiYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgPEFjY2Vzc2libGVCdXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBraW5kPVwicHJpbWFyeV9vdXRsaW5lXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZD17dXBkYXRpbmdVbnJlYWR9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb25DbGljaz17YXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRVcGRhdGluZ1VucmVhZCh0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgY2xlYXJBbGxOb3RpZmljYXRpb25zKGNsaSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFVwZGF0aW5nVW5yZWFkKGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtfdChcInNldHRpbmdzfG5vdGlmaWNhdGlvbnN8cXVpY2tfYWN0aW9uc19tYXJrX2FsbF9yZWFkXCIpfVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9BY2Nlc3NpYmxlQnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICAgICAgICA8QWNjZXNzaWJsZUJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAga2luZD1cImRhbmdlcl9vdXRsaW5lXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRpc2FibGVkPXttb2RlbCA9PT0gbnVsbH1cbiAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWNvbmNpbGUoRGVmYXVsdE5vdGlmaWNhdGlvblNldHRpbmdzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIHtfdChcInNldHRpbmdzfG5vdGlmaWNhdGlvbnN8cXVpY2tfYWN0aW9uc19yZXNldFwiKX1cbiAgICAgICAgICAgICAgICAgICAgPC9BY2Nlc3NpYmxlQnV0dG9uPlxuICAgICAgICAgICAgICAgIDwvU2V0dGluZ3NTdWJzZWN0aW9uPlxuICAgICAgICAgICAgPC9TZXR0aW5nc1NlY3Rpb24+XG4gICAgICAgIDwvZGl2PlxuICAgICk7XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7O0FBUUEsSUFBQUEsTUFBQSxHQUFBQyx1QkFBQSxDQUFBQyxPQUFBO0FBRUEsSUFBQUMsZUFBQSxHQUFBQyxzQkFBQSxDQUFBRixPQUFBO0FBQ0EsSUFBQUcsb0JBQUEsR0FBQUgsT0FBQTtBQUNBLElBQUFJLHdCQUFBLEdBQUFKLE9BQUE7QUFDQSxJQUFBSyxZQUFBLEdBQUFMLE9BQUE7QUFDQSxJQUFBTSxnQkFBQSxHQUFBTixPQUFBO0FBQ0EsSUFBQU8scUJBQUEsR0FBQVAsT0FBQTtBQUlBLElBQUFRLFdBQUEsR0FBQVIsT0FBQTtBQUNBLElBQUFTLGFBQUEsR0FBQVQsT0FBQTtBQUNBLElBQUFVLGNBQUEsR0FBQVIsc0JBQUEsQ0FBQUYsT0FBQTtBQUNBLElBQUFXLGtCQUFBLEdBQUFYLE9BQUE7QUFDQSxJQUFBWSxjQUFBLEdBQUFaLE9BQUE7QUFDQSxJ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