@excalidraw/excalidraw 0.12.0-426b5d9 → 0.12.0-54c7ec4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -2029,7 +2029,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
|
|
|
2029
2029
|
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|
2030
2030
|
|
|
2031
2031
|
"use strict";
|
|
2032
|
-
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"trackEvent\": () => (/* binding */ trackEvent)\n/* harmony export */ });\nvar _a, _b;\nconst trackEvent = typeof process !== \"undefined\" &&\n ((_a = ({\"REACT_APP_BACKEND_V2_GET_URL\":\"https://json-dev.excalidraw.com/api/v2/\",\"REACT_APP_BACKEND_V2_POST_URL\":\"https://json-dev.excalidraw.com/api/v2/post/\",\"REACT_APP_LIBRARY_URL\":\"https://libraries.excalidraw.com\",\"REACT_APP_LIBRARY_BACKEND\":\"https://us-central1-excalidraw-room-persistence.cloudfunctions.net/libraries\",\"REACT_APP_WS_SERVER_URL\":\"http://localhost:3002\",\"REACT_APP_PORTAL_URL\":\"\",\"REACT_APP_FIREBASE_CONFIG\":\"{\\\"apiKey\\\":\\\"AIzaSyCMkxA60XIW8KbqMYL7edC4qT5l4qHX2h8\\\",\\\"authDomain\\\":\\\"excalidraw-oss-dev.firebaseapp.com\\\",\\\"projectId\\\":\\\"excalidraw-oss-dev\\\",\\\"storageBucket\\\":\\\"excalidraw-oss-dev.appspot.com\\\",\\\"messagingSenderId\\\":\\\"664559512677\\\",\\\"appId\\\":\\\"1:664559512677:web:a385181f2928d328a7aa8c\\\"}\",\"REACT_APP_DEV_ENABLE_SW\":\"\",\"REACT_APP_DEV_DISABLE_LIVE_RELOAD\":\"\",\"PKG_NAME\":\"@excalidraw/excalidraw\",\"PKG_VERSION\":\"0.12.0-
|
|
2032
|
+
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"trackEvent\": () => (/* binding */ trackEvent)\n/* harmony export */ });\nvar _a, _b;\nconst trackEvent = typeof process !== \"undefined\" &&\n ((_a = ({\"REACT_APP_BACKEND_V2_GET_URL\":\"https://json-dev.excalidraw.com/api/v2/\",\"REACT_APP_BACKEND_V2_POST_URL\":\"https://json-dev.excalidraw.com/api/v2/post/\",\"REACT_APP_LIBRARY_URL\":\"https://libraries.excalidraw.com\",\"REACT_APP_LIBRARY_BACKEND\":\"https://us-central1-excalidraw-room-persistence.cloudfunctions.net/libraries\",\"REACT_APP_WS_SERVER_URL\":\"http://localhost:3002\",\"REACT_APP_PORTAL_URL\":\"\",\"REACT_APP_FIREBASE_CONFIG\":\"{\\\"apiKey\\\":\\\"AIzaSyCMkxA60XIW8KbqMYL7edC4qT5l4qHX2h8\\\",\\\"authDomain\\\":\\\"excalidraw-oss-dev.firebaseapp.com\\\",\\\"projectId\\\":\\\"excalidraw-oss-dev\\\",\\\"storageBucket\\\":\\\"excalidraw-oss-dev.appspot.com\\\",\\\"messagingSenderId\\\":\\\"664559512677\\\",\\\"appId\\\":\\\"1:664559512677:web:a385181f2928d328a7aa8c\\\"}\",\"REACT_APP_DEV_ENABLE_SW\":\"\",\"REACT_APP_DEV_DISABLE_LIVE_RELOAD\":\"\",\"PKG_NAME\":\"@excalidraw/excalidraw\",\"PKG_VERSION\":\"0.12.0-54c7ec4\",\"IS_EXCALIDRAW_NPM_PACKAGE\":true})) === null || _a === void 0 ? void 0 : _a.REACT_APP_GOOGLE_ANALYTICS_ID) &&\n typeof window !== \"undefined\" &&\n window.gtag\n ? (category, action, label, value) => {\n try {\n window.gtag(\"event\", action, {\n event_category: category,\n event_label: label,\n value,\n });\n }\n catch (error) {\n console.error(\"error logging to ga\", error);\n }\n }\n : typeof process !== \"undefined\" && ((_b = ({\"REACT_APP_BACKEND_V2_GET_URL\":\"https://json-dev.excalidraw.com/api/v2/\",\"REACT_APP_BACKEND_V2_POST_URL\":\"https://json-dev.excalidraw.com/api/v2/post/\",\"REACT_APP_LIBRARY_URL\":\"https://libraries.excalidraw.com\",\"REACT_APP_LIBRARY_BACKEND\":\"https://us-central1-excalidraw-room-persistence.cloudfunctions.net/libraries\",\"REACT_APP_WS_SERVER_URL\":\"http://localhost:3002\",\"REACT_APP_PORTAL_URL\":\"\",\"REACT_APP_FIREBASE_CONFIG\":\"{\\\"apiKey\\\":\\\"AIzaSyCMkxA60XIW8KbqMYL7edC4qT5l4qHX2h8\\\",\\\"authDomain\\\":\\\"excalidraw-oss-dev.firebaseapp.com\\\",\\\"projectId\\\":\\\"excalidraw-oss-dev\\\",\\\"storageBucket\\\":\\\"excalidraw-oss-dev.appspot.com\\\",\\\"messagingSenderId\\\":\\\"664559512677\\\",\\\"appId\\\":\\\"1:664559512677:web:a385181f2928d328a7aa8c\\\"}\",\"REACT_APP_DEV_ENABLE_SW\":\"\",\"REACT_APP_DEV_DISABLE_LIVE_RELOAD\":\"\",\"PKG_NAME\":\"@excalidraw/excalidraw\",\"PKG_VERSION\":\"0.12.0-54c7ec4\",\"IS_EXCALIDRAW_NPM_PACKAGE\":true})) === null || _b === void 0 ? void 0 : _b.JEST_WORKER_ID)\n ? (category, action, label, value) => { }\n : (category, action, label, value) => {\n // Uncomment the next line to track locally\n // console.log(\"Track Event\", { category, action, label, value });\n };\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi4vLi4vYW5hbHl0aWNzLnRzLmpzIiwibWFwcGluZ3MiOiI7Ozs7O0FBQU8sTUFBTSxVQUFVLEdBQ3JCLE9BQU8sT0FBTyxLQUFLLFdBQVc7S0FDOUIsaTRCQUFXLDBDQUFFLDZCQUE2QjtJQUMxQyxPQUFPLE1BQU0sS0FBSyxXQUFXO0lBQzdCLE1BQU0sQ0FBQyxJQUFJO0lBQ1QsQ0FBQyxDQUFDLENBQUMsUUFBZ0IsRUFBRSxNQUFjLEVBQUUsS0FBYyxFQUFFLEtBQWMsRUFBRSxFQUFFO1FBQ25FLElBQUk7WUFDRixNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUU7Z0JBQzNCLGNBQWMsRUFBRSxRQUFRO2dCQUN4QixXQUFXLEVBQUUsS0FBSztnQkFDbEIsS0FBSzthQUNOLENBQUMsQ0FBQztTQUNKO1FBQUMsT0FBTyxLQUFLLEVBQUU7WUFDZCxPQUFPLENBQUMsS0FBSyxDQUFDLHFCQUFxQixFQUFFLEtBQUssQ0FBQyxDQUFDO1NBQzdDO0lBQ0gsQ0FBQztJQUNILENBQUMsQ0FBQyxPQUFPLE9BQU8sS0FBSyxXQUFXLEtBQUksaTRCQUFXLDBDQUFFLGNBQWM7UUFDL0QsQ0FBQyxDQUFDLENBQUMsUUFBZ0IsRUFBRSxNQUFjLEVBQUUsS0FBYyxFQUFFLEtBQWMsRUFBRSxFQUFFLEdBQUUsQ0FBQztRQUMxRSxDQUFDLENBQUMsQ0FBQyxRQUFnQixFQUFFLE1BQWMsRUFBRSxLQUFjLEVBQUUsS0FBYyxFQUFFLEVBQUU7WUFDbkUsMkNBQTJDO1lBQzNDLGtFQUFrRTtRQUNwRSxDQUFDLENBQUMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi4vLi4vYW5hbHl0aWNzLnRzPzVmMGMiXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGNvbnN0IHRyYWNrRXZlbnQgPVxuICB0eXBlb2YgcHJvY2VzcyAhPT0gXCJ1bmRlZmluZWRcIiAmJlxuICBwcm9jZXNzLmVudj8uUkVBQ1RfQVBQX0dPT0dMRV9BTkFMWVRJQ1NfSUQgJiZcbiAgdHlwZW9mIHdpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIiAmJlxuICB3aW5kb3cuZ3RhZ1xuICAgID8gKGNhdGVnb3J5OiBzdHJpbmcsIGFjdGlvbjogc3RyaW5nLCBsYWJlbD86IHN0cmluZywgdmFsdWU/OiBudW1iZXIpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICB3aW5kb3cuZ3RhZyhcImV2ZW50XCIsIGFjdGlvbiwge1xuICAgICAgICAgICAgZXZlbnRfY2F0ZWdvcnk6IGNhdGVnb3J5LFxuICAgICAgICAgICAgZXZlbnRfbGFiZWw6IGxhYmVsLFxuICAgICAgICAgICAgdmFsdWUsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihcImVycm9yIGxvZ2dpbmcgdG8gZ2FcIiwgZXJyb3IpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgOiB0eXBlb2YgcHJvY2VzcyAhPT0gXCJ1bmRlZmluZWRcIiAmJiBwcm9jZXNzLmVudj8uSkVTVF9XT1JLRVJfSURcbiAgICA/IChjYXRlZ29yeTogc3RyaW5nLCBhY3Rpb246IHN0cmluZywgbGFiZWw/OiBzdHJpbmcsIHZhbHVlPzogbnVtYmVyKSA9PiB7fVxuICAgIDogKGNhdGVnb3J5OiBzdHJpbmcsIGFjdGlvbjogc3RyaW5nLCBsYWJlbD86IHN0cmluZywgdmFsdWU/OiBudW1iZXIpID0+IHtcbiAgICAgICAgLy8gVW5jb21tZW50IHRoZSBuZXh0IGxpbmUgdG8gdHJhY2sgbG9jYWxseVxuICAgICAgICAvLyBjb25zb2xlLmxvZyhcIlRyYWNrIEV2ZW50XCIsIHsgY2F0ZWdvcnksIGFjdGlvbiwgbGFiZWwsIHZhbHVlIH0pO1xuICAgICAgfTtcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///../../analytics.ts\n");
|
|
2033
2033
|
|
|
2034
2034
|
/***/ }),
|
|
2035
2035
|
|
|
@@ -2117,7 +2117,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
|
|
|
2117
2117
|
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|
2118
2118
|
|
|
2119
2119
|
"use strict";
|
|
2120
|
-
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__),\n/* harmony export */ \"useDevice\": () => (/* binding */ useDevice),\n/* harmony export */ \"useExcalidrawContainer\": () => (/* binding */ useExcalidrawContainer)\n/* harmony export */ });\n/* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react/jsx-runtime */ \"../../../node_modules/react/jsx-runtime.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ \"react\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var react_dom__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react-dom */ \"react-dom\");\n/* harmony import */ var react_dom__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react_dom__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var roughjs_bin_rough__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! roughjs/bin/rough */ \"../../../node_modules/roughjs/bin/rough.js\");\n/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! clsx */ \"../../../node_modules/clsx/dist/clsx.m.js\");\n/* harmony import */ var nanoid__WEBPACK_IMPORTED_MODULE_46__ = __webpack_require__(/*! nanoid */ \"../../../node_modules/nanoid/index.browser.js\");\n/* harmony import */ var _actions__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../actions */ \"../../actions/index.ts\");\n/* harmony import */ var _actions_actionHistory__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../actions/actionHistory */ \"../../actions/actionHistory.tsx\");\n/* harmony import */ var _actions_manager__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../actions/manager */ \"../../actions/manager.tsx\");\n/* harmony import */ var _actions_register__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../actions/register */ \"../../actions/register.ts\");\n/* harmony import */ var _analytics__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../analytics */ \"../../analytics.ts\");\n/* harmony import */ var _appState__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../appState */ \"../../appState.ts\");\n/* harmony import */ var _clipboard__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../clipboard */ \"../../clipboard.ts\");\n/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../constants */ \"../../constants.ts\");\n/* harmony import */ var _data__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../data */ \"../../data/index.ts\");\n/* harmony import */ var _data_library__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ../data/library */ \"../../data/library.ts\");\n/* harmony import */ var _data_restore__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ../data/restore */ \"../../data/restore.ts\");\n/* harmony import */ var _element__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ../element */ \"../../element/index.ts\");\n/* harmony import */ var _element_binding__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ../element/binding */ \"../../element/binding.ts\");\n/* harmony import */ var _element_linearElementEditor__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ../element/linearElementEditor */ \"../../element/linearElementEditor.ts\");\n/* harmony import */ var _element_mutateElement__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ../element/mutateElement */ \"../../element/mutateElement.ts\");\n/* harmony import */ var _element_newElement__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ../element/newElement */ \"../../element/newElement.ts\");\n/* harmony import */ var _element_typeChecks__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! ../element/typeChecks */ \"../../element/typeChecks.ts\");\n/* harmony import */ var _gesture__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! ../gesture */ \"../../gesture.ts\");\n/* harmony import */ var _groups__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! ../groups */ \"../../groups.ts\");\n/* harmony import */ var _history__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(/*! ../history */ \"../../history.ts\");\n/* harmony import */ var _i18n__WEBPACK_IMPORTED_MODULE_25__ = __webpack_require__(/*! ../i18n */ \"../../i18n.ts\");\n/* harmony import */ var _keys__WEBPACK_IMPORTED_MODULE_26__ = __webpack_require__(/*! ../keys */ \"../../keys.ts\");\n/* harmony import */ var _math__WEBPACK_IMPORTED_MODULE_27__ = __webpack_require__(/*! ../math */ \"../../math.ts\");\n/* harmony import */ var _renderer_renderScene__WEBPACK_IMPORTED_MODULE_28__ = __webpack_require__(/*! ../renderer/renderScene */ \"../../renderer/renderScene.ts\");\n/* harmony import */ var _renderer_renderElement__WEBPACK_IMPORTED_MODULE_29__ = __webpack_require__(/*! ../renderer/renderElement */ \"../../renderer/renderElement.ts\");\n/* harmony import */ var _scene__WEBPACK_IMPORTED_MODULE_30__ = __webpack_require__(/*! ../scene */ \"../../scene/index.ts\");\n/* harmony import */ var _scene_Scene__WEBPACK_IMPORTED_MODULE_31__ = __webpack_require__(/*! ../scene/Scene */ \"../../scene/Scene.ts\");\n/* harmony import */ var _scene_zoom__WEBPACK_IMPORTED_MODULE_32__ = __webpack_require__(/*! ../scene/zoom */ \"../../scene/zoom.ts\");\n/* harmony import */ var _shapes__WEBPACK_IMPORTED_MODULE_33__ = __webpack_require__(/*! ../shapes */ \"../../shapes.tsx\");\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_34__ = __webpack_require__(/*! ../utils */ \"../../utils.ts\");\n/* harmony import */ var _ContextMenu__WEBPACK_IMPORTED_MODULE_35__ = __webpack_require__(/*! ./ContextMenu */ \"../../components/ContextMenu.tsx\");\n/* harmony import */ var _LayerUI__WEBPACK_IMPORTED_MODULE_36__ = __webpack_require__(/*! ./LayerUI */ \"../../components/LayerUI.tsx\");\n/* harmony import */ var _Toast__WEBPACK_IMPORTED_MODULE_37__ = __webpack_require__(/*! ./Toast */ \"../../components/Toast.tsx\");\n/* harmony import */ var _actions_actionToggleViewMode__WEBPACK_IMPORTED_MODULE_38__ = __webpack_require__(/*! ../actions/actionToggleViewMode */ \"../../actions/actionToggleViewMode.tsx\");\n/* harmony import */ var _data_blob__WEBPACK_IMPORTED_MODULE_39__ = __webpack_require__(/*! ../data/blob */ \"../../data/blob.ts\");\n/* harmony import */ var _element_image__WEBPACK_IMPORTED_MODULE_40__ = __webpack_require__(/*! ../element/image */ \"../../element/image.ts\");\n/* harmony import */ var lodash_throttle__WEBPACK_IMPORTED_MODULE_41__ = __webpack_require__(/*! lodash.throttle */ \"../../../node_modules/lodash.throttle/index.js\");\n/* harmony import */ var lodash_throttle__WEBPACK_IMPORTED_MODULE_41___default = /*#__PURE__*/__webpack_require__.n(lodash_throttle__WEBPACK_IMPORTED_MODULE_41__);\n/* harmony import */ var _data_filesystem__WEBPACK_IMPORTED_MODULE_42__ = __webpack_require__(/*! ../data/filesystem */ \"../../data/filesystem.ts\");\n/* harmony import */ var _element_textElement__WEBPACK_IMPORTED_MODULE_43__ = __webpack_require__(/*! ../element/textElement */ \"../../element/textElement.ts\");\n/* harmony import */ var _element_collision__WEBPACK_IMPORTED_MODULE_44__ = __webpack_require__(/*! ../element/collision */ \"../../element/collision.ts\");\n/* harmony import */ var _element_Hyperlink__WEBPACK_IMPORTED_MODULE_45__ = __webpack_require__(/*! ../element/Hyperlink */ \"../../element/Hyperlink.tsx\");\nvar __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nconst deviceContextInitialValue = {\n isSmScreen: false,\n isMobile: false,\n isTouchScreen: false,\n canDeviceFitSidebar: false,\n};\nconst DeviceContext = react__WEBPACK_IMPORTED_MODULE_1___default().createContext(deviceContextInitialValue);\nconst useDevice = () => (0,react__WEBPACK_IMPORTED_MODULE_1__.useContext)(DeviceContext);\nconst ExcalidrawContainerContext = react__WEBPACK_IMPORTED_MODULE_1___default().createContext({ container: null, id: null });\nconst useExcalidrawContainer = () => (0,react__WEBPACK_IMPORTED_MODULE_1__.useContext)(ExcalidrawContainerContext);\nlet didTapTwice = false;\nlet tappedTwiceTimer = 0;\nlet cursorX = 0;\nlet cursorY = 0;\nlet isHoldingSpace = false;\nlet isPanning = false;\nlet isDraggingScrollBar = false;\nlet currentScrollBars = { horizontal: null, vertical: null };\nlet touchTimeout = 0;\nlet invalidateContextMenu = false;\n// remove this hack when we can sync render & resizeObserver (state update)\n// to rAF. See #5439\nlet THROTTLE_NEXT_RENDER = true;\nlet lastPointerUp = null;\nconst gesture = {\n pointers: new Map(),\n lastCenter: null,\n initialDistance: null,\n initialScale: null,\n};\nclass App extends (react__WEBPACK_IMPORTED_MODULE_1___default().Component) {\n constructor(props) {\n var _a;\n super(props);\n this.canvas = null;\n this.rc = null;\n this.unmounted = false;\n this.device = deviceContextInitialValue;\n this.excalidrawContainerRef = react__WEBPACK_IMPORTED_MODULE_1___default().createRef();\n this.files = {};\n this.imageCache = new Map();\n this.lastPointerDown = null;\n this.lastPointerUp = null;\n this.contextMenuOpen = false;\n this.lastScenePointer = null;\n this.focusContainer = () => {\n var _a;\n if (this.props.autoFocus) {\n (_a = this.excalidrawContainerRef.current) === null || _a === void 0 ? void 0 : _a.focus();\n }\n };\n this.getSceneElementsIncludingDeleted = () => {\n return this.scene.getElementsIncludingDeleted();\n };\n this.getSceneElements = () => {\n return this.scene.getNonDeletedElements();\n };\n this.syncActionResult = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.withBatchedUpdates)((actionResult) => {\n var _a, _b, _c, _d, _e, _f;\n // Since context menu closes when action triggered so setting to false\n this.contextMenuOpen = false;\n if (this.unmounted || actionResult === false) {\n return;\n }\n let editingElement = null;\n if (actionResult.elements) {\n actionResult.elements.forEach((element) => {\n var _a;\n if (((_a = this.state.editingElement) === null || _a === void 0 ? void 0 : _a.id) === element.id &&\n this.state.editingElement !== element &&\n (0,_element__WEBPACK_IMPORTED_MODULE_16__.isNonDeletedElement)(element)) {\n editingElement = element;\n }\n });\n this.scene.replaceAllElements(actionResult.elements);\n if (actionResult.commitToHistory) {\n this.history.resumeRecording();\n }\n }\n if (actionResult.files) {\n this.files = actionResult.replaceFiles\n ? actionResult.files\n : Object.assign(Object.assign({}, this.files), actionResult.files);\n this.addNewImagesToImageCache();\n }\n if (actionResult.appState || editingElement) {\n if (actionResult.commitToHistory) {\n this.history.resumeRecording();\n }\n let viewModeEnabled = ((_a = actionResult === null || actionResult === void 0 ? void 0 : actionResult.appState) === null || _a === void 0 ? void 0 : _a.viewModeEnabled) || false;\n let zenModeEnabled = ((_b = actionResult === null || actionResult === void 0 ? void 0 : actionResult.appState) === null || _b === void 0 ? void 0 : _b.zenModeEnabled) || false;\n let gridSize = ((_c = actionResult === null || actionResult === void 0 ? void 0 : actionResult.appState) === null || _c === void 0 ? void 0 : _c.gridSize) || null;\n let theme = ((_d = actionResult === null || actionResult === void 0 ? void 0 : actionResult.appState) === null || _d === void 0 ? void 0 : _d.theme) || _constants__WEBPACK_IMPORTED_MODULE_12__.THEME.LIGHT;\n let name = (_f = (_e = actionResult === null || actionResult === void 0 ? void 0 : actionResult.appState) === null || _e === void 0 ? void 0 : _e.name) !== null && _f !== void 0 ? _f : this.state.name;\n if (typeof this.props.viewModeEnabled !== \"undefined\") {\n viewModeEnabled = this.props.viewModeEnabled;\n }\n if (typeof this.props.zenModeEnabled !== \"undefined\") {\n zenModeEnabled = this.props.zenModeEnabled;\n }\n if (typeof this.props.gridModeEnabled !== \"undefined\") {\n gridSize = this.props.gridModeEnabled ? _constants__WEBPACK_IMPORTED_MODULE_12__.GRID_SIZE : null;\n }\n if (typeof this.props.theme !== \"undefined\") {\n theme = this.props.theme;\n }\n if (typeof this.props.name !== \"undefined\") {\n name = this.props.name;\n }\n this.setState((state) => {\n var _a;\n // using Object.assign instead of spread to fool TS 4.2.2+ into\n // regarding the resulting type as not containing undefined\n // (which the following expression will never contain)\n return Object.assign(actionResult.appState || {}, {\n editingElement: editingElement || ((_a = actionResult.appState) === null || _a === void 0 ? void 0 : _a.editingElement) || null,\n viewModeEnabled,\n zenModeEnabled,\n gridSize,\n theme,\n name,\n });\n }, () => {\n if (actionResult.syncHistory) {\n this.history.setCurrentState(this.state, this.scene.getElementsIncludingDeleted());\n }\n });\n }\n });\n // Lifecycle\n this.onBlur = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.withBatchedUpdates)(() => {\n isHoldingSpace = false;\n this.setState({ isBindingEnabled: true });\n });\n this.onUnload = () => {\n this.onBlur();\n };\n this.disableEvent = (event) => {\n event.preventDefault();\n };\n this.onFontLoaded = () => {\n this.scene.getElementsIncludingDeleted().forEach((element) => {\n if ((0,_element__WEBPACK_IMPORTED_MODULE_16__.isTextElement)(element)) {\n (0,_renderer_renderElement__WEBPACK_IMPORTED_MODULE_29__.invalidateShapeForElement)(element);\n }\n });\n this.onSceneUpdated();\n };\n this.resetHistory = () => {\n this.history.clear();\n };\n /**\n * Resets scene & history.\n * ! Do not use to clear scene user action !\n */\n this.resetScene = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.withBatchedUpdates)((opts) => {\n this.scene.replaceAllElements([]);\n this.setState((state) => (Object.assign(Object.assign({}, (0,_appState__WEBPACK_IMPORTED_MODULE_10__.getDefaultAppState)()), { isLoading: (opts === null || opts === void 0 ? void 0 : opts.resetLoadingState) ? false : state.isLoading, theme: this.state.theme })));\n this.resetHistory();\n });\n this.initializeScene = () => __awaiter(this, void 0, void 0, function* () {\n var _b;\n if (\"launchQueue\" in window && \"LaunchParams\" in window) {\n window.launchQueue.setConsumer((launchParams) => __awaiter(this, void 0, void 0, function* () {\n if (!launchParams.files.length) {\n return;\n }\n const fileHandle = launchParams.files[0];\n const blob = yield fileHandle.getFile();\n this.loadFileToCanvas(new File([blob], blob.name || \"\", { type: blob.type }), fileHandle);\n }));\n }\n if (!this.state.isLoading) {\n this.setState({ isLoading: true });\n }\n let initialData = null;\n try {\n initialData = (yield this.props.initialData) || null;\n if (initialData === null || initialData === void 0 ? void 0 : initialData.libraryItems) {\n this.library\n .updateLibrary({\n libraryItems: initialData.libraryItems,\n merge: true,\n })\n .catch((error) => {\n console.error(error);\n });\n }\n }\n catch (error) {\n console.error(error);\n initialData = {\n appState: {\n errorMessage: error.message ||\n \"Encountered an error during importing or restoring scene data\",\n },\n };\n }\n const scene = (0,_data_restore__WEBPACK_IMPORTED_MODULE_15__.restore)(initialData, null, null);\n scene.appState = Object.assign(Object.assign({}, scene.appState), { \n // we're falling back to current (pre-init) state when deciding\n // whether to open the library, to handle a case where we\n // update the state outside of initialData (e.g. when loading the app\n // with a library install link, which should auto-open the library)\n isLibraryOpen: ((_b = initialData === null || initialData === void 0 ? void 0 : initialData.appState) === null || _b === void 0 ? void 0 : _b.isLibraryOpen) || this.state.isLibraryOpen, activeTool: scene.appState.activeTool.type === \"image\"\n ? Object.assign(Object.assign({}, scene.appState.activeTool), { type: \"selection\" }) : scene.appState.activeTool, isLoading: false, toast: this.state.toast });\n if (initialData === null || initialData === void 0 ? void 0 : initialData.scrollToContent) {\n scene.appState = Object.assign(Object.assign({}, scene.appState), (0,_scene__WEBPACK_IMPORTED_MODULE_30__.calculateScrollCenter)(scene.elements, Object.assign(Object.assign({}, scene.appState), { width: this.state.width, height: this.state.height, offsetTop: this.state.offsetTop, offsetLeft: this.state.offsetLeft }), null));\n }\n this.resetHistory();\n this.syncActionResult(Object.assign(Object.assign({}, scene), { commitToHistory: true }));\n });\n this.refreshDeviceState = (container) => {\n const { width, height } = container.getBoundingClientRect();\n const sidebarBreakpoint = this.props.UIOptions.dockedSidebarBreakpoint != null\n ? this.props.UIOptions.dockedSidebarBreakpoint\n : _constants__WEBPACK_IMPORTED_MODULE_12__.MQ_RIGHT_SIDEBAR_MIN_WIDTH;\n this.device = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.updateObject)(this.device, {\n isSmScreen: width < _constants__WEBPACK_IMPORTED_MODULE_12__.MQ_SM_MAX_WIDTH,\n isMobile: width < _constants__WEBPACK_IMPORTED_MODULE_12__.MQ_MAX_WIDTH_PORTRAIT ||\n (height < _constants__WEBPACK_IMPORTED_MODULE_12__.MQ_MAX_HEIGHT_LANDSCAPE && width < _constants__WEBPACK_IMPORTED_MODULE_12__.MQ_MAX_WIDTH_LANDSCAPE),\n canDeviceFitSidebar: width > sidebarBreakpoint,\n });\n };\n this.onResize = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.withBatchedUpdates)(() => {\n this.scene\n .getElementsIncludingDeleted()\n .forEach((element) => (0,_renderer_renderElement__WEBPACK_IMPORTED_MODULE_29__.invalidateShapeForElement)(element));\n this.setState({});\n });\n this.onScroll = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.debounce)(() => {\n const { offsetTop, offsetLeft } = this.getCanvasOffsets();\n this.setState((state) => {\n if (state.offsetLeft === offsetLeft && state.offsetTop === offsetTop) {\n return null;\n }\n return { offsetTop, offsetLeft };\n });\n }, _constants__WEBPACK_IMPORTED_MODULE_12__.SCROLL_TIMEOUT);\n // Copy/paste\n this.onCut = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.withBatchedUpdates)((event) => {\n var _a;\n const isExcalidrawActive = (_a = this.excalidrawContainerRef.current) === null || _a === void 0 ? void 0 : _a.contains(document.activeElement);\n if (!isExcalidrawActive || (0,_utils__WEBPACK_IMPORTED_MODULE_34__.isWritableElement)(event.target)) {\n return;\n }\n this.cutAll();\n event.preventDefault();\n event.stopPropagation();\n });\n this.onCopy = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.withBatchedUpdates)((event) => {\n var _a;\n const isExcalidrawActive = (_a = this.excalidrawContainerRef.current) === null || _a === void 0 ? void 0 : _a.contains(document.activeElement);\n if (!isExcalidrawActive || (0,_utils__WEBPACK_IMPORTED_MODULE_34__.isWritableElement)(event.target)) {\n return;\n }\n this.copyAll();\n event.preventDefault();\n event.stopPropagation();\n });\n this.cutAll = () => {\n this.actionManager.executeAction(_actions__WEBPACK_IMPORTED_MODULE_5__.actionCut, \"keyboard\");\n };\n this.copyAll = () => {\n this.actionManager.executeAction(_actions__WEBPACK_IMPORTED_MODULE_5__.actionCopy, \"keyboard\");\n };\n this.onTapStart = (event) => {\n // fix for Apple Pencil Scribble\n // On Android, preventing the event would disable contextMenu on tap-hold\n if (!_keys__WEBPACK_IMPORTED_MODULE_26__.isAndroid) {\n event.preventDefault();\n }\n if (!didTapTwice) {\n didTapTwice = true;\n clearTimeout(tappedTwiceTimer);\n tappedTwiceTimer = window.setTimeout(App.resetTapTwice, _constants__WEBPACK_IMPORTED_MODULE_12__.TAP_TWICE_TIMEOUT);\n return;\n }\n // insert text only if we tapped twice with a single finger\n // event.touches.length === 1 will also prevent inserting text when user's zooming\n if (didTapTwice && event.touches.length === 1) {\n const [touch] = event.touches;\n // @ts-ignore\n this.handleCanvasDoubleClick({\n clientX: touch.clientX,\n clientY: touch.clientY,\n });\n didTapTwice = false;\n clearTimeout(tappedTwiceTimer);\n }\n if (_keys__WEBPACK_IMPORTED_MODULE_26__.isAndroid) {\n event.preventDefault();\n }\n if (event.touches.length === 2) {\n this.setState({\n selectedElementIds: {},\n });\n }\n };\n this.onTapEnd = (event) => {\n this.resetContextMenuTimer();\n if (event.touches.length > 0) {\n this.setState({\n previousSelectedElementIds: {},\n selectedElementIds: this.state.previousSelectedElementIds,\n });\n }\n else {\n gesture.pointers.clear();\n }\n };\n this.pasteFromClipboard = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.withBatchedUpdates)((event) => __awaiter(this, void 0, void 0, function* () {\n var _c, _d;\n // #686\n const target = document.activeElement;\n const isExcalidrawActive = (_c = this.excalidrawContainerRef.current) === null || _c === void 0 ? void 0 : _c.contains(target);\n if (!isExcalidrawActive) {\n return;\n }\n const elementUnderCursor = document.elementFromPoint(cursorX, cursorY);\n if (\n // if no ClipboardEvent supplied, assume we're pasting via contextMenu\n // thus these checks don't make sense\n event &&\n (!(elementUnderCursor instanceof HTMLCanvasElement) ||\n (0,_utils__WEBPACK_IMPORTED_MODULE_34__.isWritableElement)(target))) {\n return;\n }\n // must be called in the same frame (thus before any awaits) as the paste\n // event else some browsers (FF...) will clear the clipboardData\n // (something something security)\n let file = (_d = event === null || event === void 0 ? void 0 : event.clipboardData) === null || _d === void 0 ? void 0 : _d.files[0];\n const data = yield (0,_clipboard__WEBPACK_IMPORTED_MODULE_11__.parseClipboard)(event);\n if (!file && data.text) {\n const string = data.text.trim();\n if (string.startsWith(\"<svg\") && string.endsWith(\"</svg>\")) {\n // ignore SVG validation/normalization which will be done during image\n // initialization\n file = (0,_data_blob__WEBPACK_IMPORTED_MODULE_39__.SVGStringToFile)(string);\n }\n }\n // prefer spreadsheet data over image file (MS Office/Libre Office)\n if ((0,_data_blob__WEBPACK_IMPORTED_MODULE_39__.isSupportedImageFile)(file) && !data.spreadsheet) {\n const { x: sceneX, y: sceneY } = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.viewportCoordsToSceneCoords)({ clientX: cursorX, clientY: cursorY }, this.state);\n const imageElement = this.createImageElement({ sceneX, sceneY });\n this.insertImageElement(imageElement, file);\n this.initializeImageDimensions(imageElement);\n this.setState({ selectedElementIds: { [imageElement.id]: true } });\n return;\n }\n if (this.props.onPaste) {\n try {\n if ((yield this.props.onPaste(data, event)) === false) {\n return;\n }\n }\n catch (error) {\n console.error(error);\n }\n }\n if (data.errorMessage) {\n this.setState({ errorMessage: data.errorMessage });\n }\n else if (data.spreadsheet) {\n this.setState({\n pasteDialog: {\n data: data.spreadsheet,\n shown: true,\n },\n });\n }\n else if (data.elements) {\n this.addElementsFromPasteOrLibrary({\n elements: data.elements,\n files: data.files || null,\n position: \"cursor\",\n });\n }\n else if (data.text) {\n this.addTextFromPaste(data.text);\n }\n this.setActiveTool({ type: \"selection\" });\n event === null || event === void 0 ? void 0 : event.preventDefault();\n }));\n this.addElementsFromPasteOrLibrary = (opts) => {\n const elements = (0,_data_restore__WEBPACK_IMPORTED_MODULE_15__.restoreElements)(opts.elements, null);\n const [minX, minY, maxX, maxY] = (0,_element__WEBPACK_IMPORTED_MODULE_16__.getCommonBounds)(elements);\n const elementsCenterX = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.distance)(minX, maxX) / 2;\n const elementsCenterY = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.distance)(minY, maxY) / 2;\n const clientX = typeof opts.position === \"object\"\n ? opts.position.clientX\n : opts.position === \"cursor\"\n ? cursorX\n : this.state.width / 2 + this.state.offsetLeft;\n const clientY = typeof opts.position === \"object\"\n ? opts.position.clientY\n : opts.position === \"cursor\"\n ? cursorY\n : this.state.height / 2 + this.state.offsetTop;\n const { x, y } = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.viewportCoordsToSceneCoords)({ clientX, clientY }, this.state);\n const dx = x - elementsCenterX;\n const dy = y - elementsCenterY;\n const groupIdMap = new Map();\n const [gridX, gridY] = (0,_math__WEBPACK_IMPORTED_MODULE_27__.getGridPoint)(dx, dy, this.state.gridSize);\n const oldIdToDuplicatedId = new Map();\n const newElements = elements.map((element) => {\n const newElement = (0,_element__WEBPACK_IMPORTED_MODULE_16__.duplicateElement)(this.state.editingGroupId, groupIdMap, element, {\n x: element.x + gridX - minX,\n y: element.y + gridY - minY,\n });\n oldIdToDuplicatedId.set(element.id, newElement.id);\n return newElement;\n });\n (0,_element_textElement__WEBPACK_IMPORTED_MODULE_43__.bindTextToShapeAfterDuplication)(newElements, elements, oldIdToDuplicatedId);\n const nextElements = [\n ...this.scene.getElementsIncludingDeleted(),\n ...newElements,\n ];\n (0,_element_binding__WEBPACK_IMPORTED_MODULE_17__.fixBindingsAfterDuplication)(nextElements, elements, oldIdToDuplicatedId);\n if (opts.files) {\n this.files = Object.assign(Object.assign({}, this.files), opts.files);\n }\n this.scene.replaceAllElements(nextElements);\n this.history.resumeRecording();\n this.setState((0,_groups__WEBPACK_IMPORTED_MODULE_23__.selectGroupsForSelectedElements)(Object.assign(Object.assign({}, this.state), { isLibraryOpen: this.state.isLibraryOpen && this.device.canDeviceFitSidebar\n ? this.state.isLibraryMenuDocked\n : false, selectedElementIds: newElements.reduce((acc, element) => {\n if (!(0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_21__.isBoundToContainer)(element)) {\n acc[element.id] = true;\n }\n return acc;\n }, {}), selectedGroupIds: {} }), this.scene.getNonDeletedElements()), () => {\n if (opts.files) {\n this.addNewImagesToImageCache();\n }\n });\n this.setActiveTool({ type: \"selection\" });\n };\n // Collaboration\n this.setAppState = (obj) => {\n this.setState(obj);\n };\n this.removePointer = (event) => {\n if (touchTimeout) {\n this.resetContextMenuTimer();\n }\n gesture.pointers.delete(event.pointerId);\n };\n this.toggleLock = (source = \"ui\") => {\n if (!this.state.activeTool.locked) {\n (0,_analytics__WEBPACK_IMPORTED_MODULE_9__.trackEvent)(\"toolbar\", \"toggleLock\", `${source} (${this.device.isMobile ? \"mobile\" : \"desktop\"})`);\n }\n this.setState((prevState) => {\n return {\n activeTool: Object.assign(Object.assign(Object.assign({}, prevState.activeTool), (0,_utils__WEBPACK_IMPORTED_MODULE_34__.updateActiveTool)(this.state, prevState.activeTool.locked\n ? { type: \"selection\" }\n : prevState.activeTool)), { locked: !prevState.activeTool.locked }),\n };\n });\n };\n this.togglePenMode = () => {\n this.setState((prevState) => {\n return {\n penMode: !prevState.penMode,\n };\n });\n };\n this.scrollToContent = (target = this.scene.getNonDeletedElements()) => {\n this.setState(Object.assign({}, (0,_scene__WEBPACK_IMPORTED_MODULE_30__.calculateScrollCenter)(Array.isArray(target) ? target : [target], this.state, this.canvas)));\n };\n this.setToast = (toast) => {\n this.setState({ toast });\n };\n this.restoreFileFromShare = () => __awaiter(this, void 0, void 0, function* () {\n try {\n const webShareTargetCache = yield caches.open(\"web-share-target\");\n const response = yield webShareTargetCache.match(\"shared-file\");\n if (response) {\n const blob = yield response.blob();\n const file = new File([blob], blob.name || \"\", { type: blob.type });\n this.loadFileToCanvas(file, null);\n yield webShareTargetCache.delete(\"shared-file\");\n window.history.replaceState(null, _constants__WEBPACK_IMPORTED_MODULE_12__.APP_NAME, window.location.pathname);\n }\n }\n catch (error) {\n this.setState({ errorMessage: error.message });\n }\n });\n /** adds supplied files to existing files in the appState */\n this.addFiles = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.withBatchedUpdates)((files) => {\n const filesMap = files.reduce((acc, fileData) => {\n acc.set(fileData.id, fileData);\n return acc;\n }, new Map());\n this.files = Object.assign(Object.assign({}, this.files), Object.fromEntries(filesMap));\n this.scene.getNonDeletedElements().forEach((element) => {\n if ((0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_21__.isInitializedImageElement)(element) &&\n filesMap.has(element.fileId)) {\n this.imageCache.delete(element.fileId);\n (0,_renderer_renderElement__WEBPACK_IMPORTED_MODULE_29__.invalidateShapeForElement)(element);\n }\n });\n this.scene.informMutation();\n this.addNewImagesToImageCache();\n });\n this.updateScene = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.withBatchedUpdates)((sceneData) => {\n if (sceneData.commitToHistory) {\n this.history.resumeRecording();\n }\n if (sceneData.appState) {\n this.setState(sceneData.appState);\n }\n if (sceneData.elements) {\n this.scene.replaceAllElements(sceneData.elements);\n }\n if (sceneData.collaborators) {\n this.setState({ collaborators: sceneData.collaborators });\n }\n });\n this.onSceneUpdated = () => {\n this.setState({});\n };\n this.updateCurrentCursorPosition = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.withBatchedUpdates)((event) => {\n cursorX = event.clientX;\n cursorY = event.clientY;\n });\n // Input handling\n this.onKeyDown = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.withBatchedUpdates)((event) => {\n // normalize `event.key` when CapsLock is pressed #2372\n if (\"Proxy\" in window &&\n ((!event.shiftKey && /^[A-Z]$/.test(event.key)) ||\n (event.shiftKey && /^[a-z]$/.test(event.key)))) {\n event = new Proxy(event, {\n get(ev, prop) {\n const value = ev[prop];\n if (typeof value === \"function\") {\n // fix for Proxies hijacking `this`\n return value.bind(ev);\n }\n return prop === \"key\"\n ? // CapsLock inverts capitalization based on ShiftKey, so invert\n // it back\n event.shiftKey\n ? ev.key.toUpperCase()\n : ev.key.toLowerCase()\n : value;\n },\n });\n }\n // prevent browser zoom in input fields\n if (event[_keys__WEBPACK_IMPORTED_MODULE_26__.KEYS.CTRL_OR_CMD] && (0,_utils__WEBPACK_IMPORTED_MODULE_34__.isWritableElement)(event.target)) {\n if (event.code === _keys__WEBPACK_IMPORTED_MODULE_26__.CODES.MINUS || event.code === _keys__WEBPACK_IMPORTED_MODULE_26__.CODES.EQUAL) {\n event.preventDefault();\n return;\n }\n }\n // bail if\n if (\n // inside an input\n ((0,_utils__WEBPACK_IMPORTED_MODULE_34__.isWritableElement)(event.target) &&\n // unless pressing escape (finalize action)\n event.key !== _keys__WEBPACK_IMPORTED_MODULE_26__.KEYS.ESCAPE) ||\n // or unless using arrows (to move between buttons)\n ((0,_keys__WEBPACK_IMPORTED_MODULE_26__.isArrowKey)(event.key) && (0,_utils__WEBPACK_IMPORTED_MODULE_34__.isInputLike)(event.target))) {\n return;\n }\n if (event.key === _keys__WEBPACK_IMPORTED_MODULE_26__.KEYS.QUESTION_MARK) {\n this.setState({\n showHelpDialog: true,\n });\n }\n if (this.actionManager.handleKeyDown(event)) {\n return;\n }\n if (this.state.viewModeEnabled) {\n return;\n }\n if (event[_keys__WEBPACK_IMPORTED_MODULE_26__.KEYS.CTRL_OR_CMD] && this.state.isBindingEnabled) {\n this.setState({ isBindingEnabled: false });\n }\n if (event.code === _keys__WEBPACK_IMPORTED_MODULE_26__.CODES.ZERO) {\n const nextState = !this.state.isLibraryOpen;\n this.setState({ isLibraryOpen: nextState });\n // track only openings\n if (nextState) {\n (0,_analytics__WEBPACK_IMPORTED_MODULE_9__.trackEvent)(\"library\", \"toggleLibrary (open)\", `keyboard (${this.device.isMobile ? \"mobile\" : \"desktop\"})`);\n }\n }\n if ((0,_keys__WEBPACK_IMPORTED_MODULE_26__.isArrowKey)(event.key)) {\n const step = (this.state.gridSize &&\n (event.shiftKey\n ? _constants__WEBPACK_IMPORTED_MODULE_12__.ELEMENT_TRANSLATE_AMOUNT\n : this.state.gridSize)) ||\n (event.shiftKey\n ? _constants__WEBPACK_IMPORTED_MODULE_12__.ELEMENT_SHIFT_TRANSLATE_AMOUNT\n : _constants__WEBPACK_IMPORTED_MODULE_12__.ELEMENT_TRANSLATE_AMOUNT);\n const selectedElements = (0,_scene__WEBPACK_IMPORTED_MODULE_30__.getSelectedElements)(this.scene.getNonDeletedElements(), this.state, true);\n let offsetX = 0;\n let offsetY = 0;\n if (event.key === _keys__WEBPACK_IMPORTED_MODULE_26__.KEYS.ARROW_LEFT) {\n offsetX = -step;\n }\n else if (event.key === _keys__WEBPACK_IMPORTED_MODULE_26__.KEYS.ARROW_RIGHT) {\n offsetX = step;\n }\n else if (event.key === _keys__WEBPACK_IMPORTED_MODULE_26__.KEYS.ARROW_UP) {\n offsetY = -step;\n }\n else if (event.key === _keys__WEBPACK_IMPORTED_MODULE_26__.KEYS.ARROW_DOWN) {\n offsetY = step;\n }\n selectedElements.forEach((element) => {\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_19__.mutateElement)(element, {\n x: element.x + offsetX,\n y: element.y + offsetY,\n });\n (0,_element_binding__WEBPACK_IMPORTED_MODULE_17__.updateBoundElements)(element, {\n simultaneouslyUpdated: selectedElements,\n });\n });\n this.maybeSuggestBindingForAll(selectedElements);\n event.preventDefault();\n }\n else if (event.key === _keys__WEBPACK_IMPORTED_MODULE_26__.KEYS.ENTER) {\n const selectedElements = (0,_scene__WEBPACK_IMPORTED_MODULE_30__.getSelectedElements)(this.scene.getNonDeletedElements(), this.state);\n if (selectedElements.length === 1) {\n if ((0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_21__.isLinearElement)(selectedElements[0])) {\n if (!this.state.editingLinearElement ||\n this.state.editingLinearElement.elementId !==\n selectedElements[0].id) {\n this.history.resumeRecording();\n this.setState({\n editingLinearElement: new _element_linearElementEditor__WEBPACK_IMPORTED_MODULE_18__.LinearElementEditor(selectedElements[0], this.scene),\n });\n }\n }\n else {\n const selectedElement = selectedElements[0];\n this.startTextEditing({\n sceneX: selectedElement.x + selectedElement.width / 2,\n sceneY: selectedElement.y + selectedElement.height / 2,\n shouldBind: true,\n });\n event.preventDefault();\n return;\n }\n }\n }\n else if (!event.ctrlKey &&\n !event.altKey &&\n !event.metaKey &&\n this.state.draggingElement === null) {\n const shape = (0,_shapes__WEBPACK_IMPORTED_MODULE_33__.findShapeByKey)(event.key);\n if (shape) {\n if (this.state.activeTool.type !== shape) {\n (0,_analytics__WEBPACK_IMPORTED_MODULE_9__.trackEvent)(\"toolbar\", shape, `keyboard (${this.device.isMobile ? \"mobile\" : \"desktop\"})`);\n }\n this.setActiveTool({ type: shape });\n event.stopPropagation();\n }\n else if (event.key === _keys__WEBPACK_IMPORTED_MODULE_26__.KEYS.Q) {\n this.toggleLock(\"keyboard\");\n event.stopPropagation();\n }\n }\n if (event.key === _keys__WEBPACK_IMPORTED_MODULE_26__.KEYS.SPACE && gesture.pointers.size === 0) {\n isHoldingSpace = true;\n (0,_utils__WEBPACK_IMPORTED_MODULE_34__.setCursor)(this.canvas, _constants__WEBPACK_IMPORTED_MODULE_12__.CURSOR_TYPE.GRABBING);\n event.preventDefault();\n }\n if ((event.key === _keys__WEBPACK_IMPORTED_MODULE_26__.KEYS.G || event.key === _keys__WEBPACK_IMPORTED_MODULE_26__.KEYS.S) &&\n !event.altKey &&\n !event[_keys__WEBPACK_IMPORTED_MODULE_26__.KEYS.CTRL_OR_CMD]) {\n const selectedElements = (0,_scene__WEBPACK_IMPORTED_MODULE_30__.getSelectedElements)(this.scene.getNonDeletedElements(), this.state);\n if (this.state.activeTool.type === \"selection\" &&\n !selectedElements.length) {\n return;\n }\n if (event.key === _keys__WEBPACK_IMPORTED_MODULE_26__.KEYS.G &&\n ((0,_scene__WEBPACK_IMPORTED_MODULE_30__.hasBackground)(this.state.activeTool.type) ||\n selectedElements.some((element) => (0,_scene__WEBPACK_IMPORTED_MODULE_30__.hasBackground)(element.type)))) {\n this.setState({ openPopup: \"backgroundColorPicker\" });\n event.stopPropagation();\n }\n if (event.key === _keys__WEBPACK_IMPORTED_MODULE_26__.KEYS.S) {\n this.setState({ openPopup: \"strokeColorPicker\" });\n event.stopPropagation();\n }\n }\n });\n this.onWheel = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.withBatchedUpdates)((event) => {\n // prevent browser pinch zoom on DOM elements\n if (!(event.target instanceof HTMLCanvasElement) && event.ctrlKey) {\n event.preventDefault();\n }\n });\n this.onKeyUp = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.withBatchedUpdates)((event) => {\n if (event.key === _keys__WEBPACK_IMPORTED_MODULE_26__.KEYS.SPACE) {\n if (this.state.viewModeEnabled) {\n (0,_utils__WEBPACK_IMPORTED_MODULE_34__.setCursor)(this.canvas, _constants__WEBPACK_IMPORTED_MODULE_12__.CURSOR_TYPE.GRAB);\n }\n else if (this.state.activeTool.type === \"selection\") {\n (0,_utils__WEBPACK_IMPORTED_MODULE_34__.resetCursor)(this.canvas);\n }\n else {\n (0,_utils__WEBPACK_IMPORTED_MODULE_34__.setCursorForShape)(this.canvas, this.state);\n this.setState({\n selectedElementIds: {},\n selectedGroupIds: {},\n editingGroupId: null,\n });\n }\n isHoldingSpace = false;\n }\n if (!event[_keys__WEBPACK_IMPORTED_MODULE_26__.KEYS.CTRL_OR_CMD] && !this.state.isBindingEnabled) {\n this.setState({ isBindingEnabled: true });\n }\n if ((0,_keys__WEBPACK_IMPORTED_MODULE_26__.isArrowKey)(event.key)) {\n const selectedElements = (0,_scene__WEBPACK_IMPORTED_MODULE_30__.getSelectedElements)(this.scene.getNonDeletedElements(), this.state);\n (0,_element_binding__WEBPACK_IMPORTED_MODULE_17__.isBindingEnabled)(this.state)\n ? (0,_element_binding__WEBPACK_IMPORTED_MODULE_17__.bindOrUnbindSelectedElements)(selectedElements)\n : (0,_element_binding__WEBPACK_IMPORTED_MODULE_17__.unbindLinearElements)(selectedElements);\n this.setState({ suggestedBindings: [] });\n }\n });\n this.setActiveTool = (tool) => {\n const nextActiveTool = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.updateActiveTool)(this.state, tool);\n if (!isHoldingSpace) {\n (0,_utils__WEBPACK_IMPORTED_MODULE_34__.setCursorForShape)(this.canvas, this.state);\n }\n if ((0,_utils__WEBPACK_IMPORTED_MODULE_34__.isToolIcon)(document.activeElement)) {\n this.focusContainer();\n }\n if (!(0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_21__.isLinearElementType)(nextActiveTool.type)) {\n this.setState({ suggestedBindings: [] });\n }\n if (nextActiveTool.type === \"image\") {\n this.onImageAction();\n }\n if (nextActiveTool.type !== \"selection\") {\n this.setState({\n activeTool: nextActiveTool,\n selectedElementIds: {},\n selectedGroupIds: {},\n editingGroupId: null,\n });\n }\n else {\n this.setState({ activeTool: nextActiveTool });\n }\n };\n this.setCursor = (cursor) => {\n (0,_utils__WEBPACK_IMPORTED_MODULE_34__.setCursor)(this.canvas, cursor);\n };\n this.resetCursor = () => {\n (0,_utils__WEBPACK_IMPORTED_MODULE_34__.resetCursor)(this.canvas);\n };\n /**\n * returns whether user is making a gesture with >= 2 fingers (points)\n * on o touch screen (not on a trackpad). Currently only relates to Darwin\n * (iOS/iPadOS,MacOS), but may work on other devices in the future if\n * GestureEvent is standardized.\n */\n this.isTouchScreenMultiTouchGesture = () => {\n // we don't want to deselect when using trackpad, and multi-point gestures\n // only work on touch screens, so checking for >= pointers means we're on a\n // touchscreen\n return gesture.pointers.size >= 2;\n };\n // fires only on Safari\n this.onGestureStart = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.withBatchedUpdates)((event) => {\n event.preventDefault();\n // we only want to deselect on touch screens because user may have selected\n // elements by mistake while zooming\n if (this.isTouchScreenMultiTouchGesture()) {\n this.setState({\n selectedElementIds: {},\n });\n }\n gesture.initialScale = this.state.zoom.value;\n });\n // fires only on Safari\n this.onGestureChange = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.withBatchedUpdates)((event) => {\n event.preventDefault();\n // onGestureChange only has zoom factor but not the center.\n // If we're on iPad or iPhone, then we recognize multi-touch and will\n // zoom in at the right location in the touchmove handler\n // (handleCanvasPointerMove).\n //\n // On Macbook trackpad, we don't have those events so will zoom in at the\n // current location instead.\n //\n // As such, bail from this handler on touch devices.\n if (this.isTouchScreenMultiTouchGesture()) {\n return;\n }\n const initialScale = gesture.initialScale;\n if (initialScale) {\n this.setState((state) => (Object.assign({}, (0,_scene_zoom__WEBPACK_IMPORTED_MODULE_32__.getStateForZoom)({\n viewportX: cursorX,\n viewportY: cursorY,\n nextZoom: (0,_scene__WEBPACK_IMPORTED_MODULE_30__.getNormalizedZoom)(initialScale * event.scale),\n }, state))));\n }\n });\n // fires only on Safari\n this.onGestureEnd = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.withBatchedUpdates)((event) => {\n event.preventDefault();\n // reselect elements only on touch screens (see onGestureStart)\n if (this.isTouchScreenMultiTouchGesture()) {\n this.setState({\n previousSelectedElementIds: {},\n selectedElementIds: this.state.previousSelectedElementIds,\n });\n }\n gesture.initialScale = null;\n });\n this.startTextEditing = ({ sceneX, sceneY, shouldBind, insertAtParentCenter = true, }) => {\n var _a, _b;\n let parentCenterPosition = insertAtParentCenter &&\n this.getTextWysiwygSnappedToCenterPosition(sceneX, sceneY, this.state, this.canvas, window.devicePixelRatio);\n let existingTextElement = null;\n let container = null;\n const selectedElements = (0,_scene__WEBPACK_IMPORTED_MODULE_30__.getSelectedElements)(this.scene.getNonDeletedElements(), this.state);\n if (selectedElements.length === 1) {\n if ((0,_element__WEBPACK_IMPORTED_MODULE_16__.isTextElement)(selectedElements[0])) {\n existingTextElement = selectedElements[0];\n }\n else if ((0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_21__.isTextBindableContainer)(selectedElements[0], false)) {\n existingTextElement = (0,_element_textElement__WEBPACK_IMPORTED_MODULE_43__.getBoundTextElement)(selectedElements[0]);\n }\n else {\n existingTextElement = this.getTextElementAtPosition(sceneX, sceneY);\n }\n }\n else {\n existingTextElement = this.getTextElementAtPosition(sceneX, sceneY);\n }\n // bind to container when shouldBind is true or\n // clicked on center of container\n if (!container &&\n !existingTextElement &&\n (shouldBind || parentCenterPosition)) {\n container = (0,_scene__WEBPACK_IMPORTED_MODULE_30__.getTextBindableContainerAtPosition)(this.scene\n .getNonDeletedElements()\n .filter((ele) => (0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_21__.isTextBindableContainer)(ele, false) && !(0,_element_textElement__WEBPACK_IMPORTED_MODULE_43__.getBoundTextElement)(ele)), sceneX, sceneY);\n }\n if (!existingTextElement && container) {\n const fontString = {\n fontSize: this.state.currentItemFontSize,\n fontFamily: this.state.currentItemFontFamily,\n };\n const minWidth = (0,_element_textElement__WEBPACK_IMPORTED_MODULE_43__.getApproxMinLineWidth)((0,_utils__WEBPACK_IMPORTED_MODULE_34__.getFontString)(fontString));\n const minHeight = (0,_element_textElement__WEBPACK_IMPORTED_MODULE_43__.getApproxMinLineHeight)((0,_utils__WEBPACK_IMPORTED_MODULE_34__.getFontString)(fontString));\n const newHeight = Math.max(container.height, minHeight);\n const newWidth = Math.max(container.width, minWidth);\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_19__.mutateElement)(container, { height: newHeight, width: newWidth });\n sceneX = container.x + newWidth / 2;\n sceneY = container.y + newHeight / 2;\n if (parentCenterPosition) {\n parentCenterPosition = this.getTextWysiwygSnappedToCenterPosition(sceneX, sceneY, this.state, this.canvas, window.devicePixelRatio);\n }\n }\n const element = existingTextElement\n ? existingTextElement\n : (0,_element__WEBPACK_IMPORTED_MODULE_16__.newTextElement)({\n x: parentCenterPosition\n ? parentCenterPosition.elementCenterX\n : sceneX,\n y: parentCenterPosition\n ? parentCenterPosition.elementCenterY\n : sceneY,\n strokeColor: this.state.currentItemStrokeColor,\n backgroundColor: this.state.currentItemBackgroundColor,\n fillStyle: this.state.currentItemFillStyle,\n strokeWidth: this.state.currentItemStrokeWidth,\n strokeStyle: this.state.currentItemStrokeStyle,\n roughness: this.state.currentItemRoughness,\n opacity: this.state.currentItemOpacity,\n strokeSharpness: this.state.currentItemStrokeSharpness,\n text: \"\",\n fontSize: this.state.currentItemFontSize,\n fontFamily: this.state.currentItemFontFamily,\n textAlign: parentCenterPosition\n ? \"center\"\n : this.state.currentItemTextAlign,\n verticalAlign: parentCenterPosition\n ? _constants__WEBPACK_IMPORTED_MODULE_12__.VERTICAL_ALIGN.MIDDLE\n : _constants__WEBPACK_IMPORTED_MODULE_12__.DEFAULT_VERTICAL_ALIGN,\n containerId: (_a = container === null || container === void 0 ? void 0 : container.id) !== null && _a !== void 0 ? _a : undefined,\n groupIds: (_b = container === null || container === void 0 ? void 0 : container.groupIds) !== null && _b !== void 0 ? _b : [],\n locked: false,\n });\n this.setState({ editingElement: element });\n if (!existingTextElement) {\n this.scene.replaceAllElements([\n ...this.scene.getElementsIncludingDeleted(),\n element,\n ]);\n // case: creating new text not centered to parent element → offset Y\n // so that the text is centered to cursor position\n if (!parentCenterPosition) {\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_19__.mutateElement)(element, {\n y: element.y - element.baseline / 2,\n });\n }\n }\n this.setState({\n editingElement: element,\n });\n this.handleTextWysiwyg(element, {\n isExistingElement: !!existingTextElement,\n });\n };\n this.handleCanvasDoubleClick = (event) => {\n // case: double-clicking with arrow/line tool selected would both create\n // text and enter multiElement mode\n if (this.state.multiElement) {\n return;\n }\n // we should only be able to double click when mode is selection\n if (this.state.activeTool.type !== \"selection\") {\n return;\n }\n const selectedElements = (0,_scene__WEBPACK_IMPORTED_MODULE_30__.getSelectedElements)(this.scene.getNonDeletedElements(), this.state);\n if (selectedElements.length === 1 && (0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_21__.isLinearElement)(selectedElements[0])) {\n if (!this.state.editingLinearElement ||\n this.state.editingLinearElement.elementId !== selectedElements[0].id) {\n this.history.resumeRecording();\n this.setState({\n editingLinearElement: new _element_linearElementEditor__WEBPACK_IMPORTED_MODULE_18__.LinearElementEditor(selectedElements[0], this.scene),\n });\n }\n return;\n }\n (0,_utils__WEBPACK_IMPORTED_MODULE_34__.resetCursor)(this.canvas);\n let { x: sceneX, y: sceneY } = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.viewportCoordsToSceneCoords)(event, this.state);\n const selectedGroupIds = (0,_groups__WEBPACK_IMPORTED_MODULE_23__.getSelectedGroupIds)(this.state);\n if (selectedGroupIds.length > 0) {\n const hitElement = this.getElementAtPosition(sceneX, sceneY);\n const selectedGroupId = hitElement &&\n (0,_groups__WEBPACK_IMPORTED_MODULE_23__.getSelectedGroupIdForElement)(hitElement, this.state.selectedGroupIds);\n if (selectedGroupId) {\n this.setState((prevState) => (0,_groups__WEBPACK_IMPORTED_MODULE_23__.selectGroupsForSelectedElements)(Object.assign(Object.assign({}, prevState), { editingGroupId: selectedGroupId, selectedElementIds: { [hitElement.id]: true }, selectedGroupIds: {} }), this.scene.getNonDeletedElements()));\n return;\n }\n }\n (0,_utils__WEBPACK_IMPORTED_MODULE_34__.resetCursor)(this.canvas);\n if (!event[_keys__WEBPACK_IMPORTED_MODULE_26__.KEYS.CTRL_OR_CMD] && !this.state.viewModeEnabled) {\n const selectedElements = (0,_scene__WEBPACK_IMPORTED_MODULE_30__.getSelectedElements)(this.scene.getNonDeletedElements(), this.state);\n if (selectedElements.length === 1) {\n const selectedElement = selectedElements[0];\n const canBindText = (0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_21__.hasBoundTextElement)(selectedElement);\n if (canBindText) {\n sceneX = selectedElement.x + selectedElement.width / 2;\n sceneY = selectedElement.y + selectedElement.height / 2;\n }\n }\n this.startTextEditing({\n sceneX,\n sceneY,\n shouldBind: false,\n insertAtParentCenter: !event.altKey,\n });\n }\n };\n this.getElementLinkAtPosition = (scenePointer, hitElement) => {\n // Reversing so we traverse the elements in decreasing order\n // of z-index\n const elements = this.scene.getNonDeletedElements().slice().reverse();\n let hitElementIndex = Infinity;\n return elements.find((element, index) => {\n if (hitElement && element.id === hitElement.id) {\n hitElementIndex = index;\n }\n return (element.link &&\n index <= hitElementIndex &&\n (0,_element_Hyperlink__WEBPACK_IMPORTED_MODULE_45__.isPointHittingLinkIcon)(element, this.state, [scenePointer.x, scenePointer.y], this.device.isMobile));\n });\n };\n this.redirectToLink = (event, isTouchScreen) => {\n const draggedDistance = (0,_math__WEBPACK_IMPORTED_MODULE_27__.distance2d)(this.lastPointerDown.clientX, this.lastPointerDown.clientY, this.lastPointerUp.clientX, this.lastPointerUp.clientY);\n if (!this.hitLinkElement ||\n // For touch screen allow dragging threshold else strict check\n (isTouchScreen && draggedDistance > _constants__WEBPACK_IMPORTED_MODULE_12__.DRAGGING_THRESHOLD) ||\n (!isTouchScreen && draggedDistance !== 0)) {\n return;\n }\n const lastPointerDownCoords = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.viewportCoordsToSceneCoords)(this.lastPointerDown, this.state);\n const lastPointerDownHittingLinkIcon = (0,_element_Hyperlink__WEBPACK_IMPORTED_MODULE_45__.isPointHittingLinkIcon)(this.hitLinkElement, this.state, [lastPointerDownCoords.x, lastPointerDownCoords.y], this.device.isMobile);\n const lastPointerUpCoords = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.viewportCoordsToSceneCoords)(this.lastPointerUp, this.state);\n const lastPointerUpHittingLinkIcon = (0,_element_Hyperlink__WEBPACK_IMPORTED_MODULE_45__.isPointHittingLinkIcon)(this.hitLinkElement, this.state, [lastPointerUpCoords.x, lastPointerUpCoords.y], this.device.isMobile);\n if (lastPointerDownHittingLinkIcon && lastPointerUpHittingLinkIcon) {\n const url = this.hitLinkElement.link;\n if (url) {\n let customEvent;\n if (this.props.onLinkOpen) {\n customEvent = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.wrapEvent)(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.EXCALIDRAW_LINK, event.nativeEvent);\n this.props.onLinkOpen(this.hitLinkElement, customEvent);\n }\n if (!(customEvent === null || customEvent === void 0 ? void 0 : customEvent.defaultPrevented)) {\n const target = (0,_element_Hyperlink__WEBPACK_IMPORTED_MODULE_45__.isLocalLink)(url) ? \"_self\" : \"_blank\";\n const newWindow = window.open(undefined, target);\n // https://mathiasbynens.github.io/rel-noopener/\n if (newWindow) {\n newWindow.opener = null;\n newWindow.location = (0,_element_Hyperlink__WEBPACK_IMPORTED_MODULE_45__.normalizeLink)(url);\n }\n }\n }\n }\n };\n this.handleCanvasPointerMove = (event) => {\n this.savePointer(event.clientX, event.clientY, this.state.cursorButton);\n if (gesture.pointers.has(event.pointerId)) {\n gesture.pointers.set(event.pointerId, {\n x: event.clientX,\n y: event.clientY,\n });\n }\n const initialScale = gesture.initialScale;\n if (gesture.pointers.size === 2 &&\n gesture.lastCenter &&\n initialScale &&\n gesture.initialDistance) {\n const center = (0,_gesture__WEBPACK_IMPORTED_MODULE_22__.getCenter)(gesture.pointers);\n const deltaX = center.x - gesture.lastCenter.x;\n const deltaY = center.y - gesture.lastCenter.y;\n gesture.lastCenter = center;\n const distance = (0,_gesture__WEBPACK_IMPORTED_MODULE_22__.getDistance)(Array.from(gesture.pointers.values()));\n const scaleFactor = this.state.activeTool.type === \"freedraw\" && this.state.penMode\n ? 1\n : distance / gesture.initialDistance;\n const nextZoom = scaleFactor\n ? (0,_scene__WEBPACK_IMPORTED_MODULE_30__.getNormalizedZoom)(initialScale * scaleFactor)\n : this.state.zoom.value;\n this.setState((state) => {\n const zoomState = (0,_scene_zoom__WEBPACK_IMPORTED_MODULE_32__.getStateForZoom)({\n viewportX: center.x,\n viewportY: center.y,\n nextZoom,\n }, state);\n return {\n zoom: zoomState.zoom,\n scrollX: zoomState.scrollX + deltaX / nextZoom,\n scrollY: zoomState.scrollY + deltaY / nextZoom,\n shouldCacheIgnoreZoom: true,\n };\n });\n this.resetShouldCacheIgnoreZoomDebounced();\n }\n else {\n gesture.lastCenter =\n gesture.initialDistance =\n gesture.initialScale =\n null;\n }\n if (isHoldingSpace || isPanning || isDraggingScrollBar) {\n return;\n }\n const isPointerOverScrollBars = (0,_scene__WEBPACK_IMPORTED_MODULE_30__.isOverScrollBars)(currentScrollBars, event.clientX - this.state.offsetLeft, event.clientY - this.state.offsetTop);\n const isOverScrollBar = isPointerOverScrollBars.isOverEither;\n if (!this.state.draggingElement && !this.state.multiElement) {\n if (isOverScrollBar) {\n (0,_utils__WEBPACK_IMPORTED_MODULE_34__.resetCursor)(this.canvas);\n }\n else {\n (0,_utils__WEBPACK_IMPORTED_MODULE_34__.setCursorForShape)(this.canvas, this.state);\n }\n }\n const scenePointer = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.viewportCoordsToSceneCoords)(event, this.state);\n const { x: scenePointerX, y: scenePointerY } = scenePointer;\n if (this.state.editingLinearElement &&\n !this.state.editingLinearElement.isDragging) {\n const editingLinearElement = _element_linearElementEditor__WEBPACK_IMPORTED_MODULE_18__.LinearElementEditor.handlePointerMove(event, scenePointerX, scenePointerY, this.state.editingLinearElement, this.state.gridSize);\n if (editingLinearElement !== this.state.editingLinearElement) {\n // Since we are reading from previous state which is not possible with\n // automatic batching in React 18 hence using flush sync to synchronously\n // update the state. Check https://github.com/excalidraw/excalidraw/pull/5508 for more details.\n (0,react_dom__WEBPACK_IMPORTED_MODULE_2__.flushSync)(() => {\n this.setState({ editingLinearElement });\n });\n }\n if (editingLinearElement.lastUncommittedPoint != null) {\n this.maybeSuggestBindingAtCursor(scenePointer);\n }\n else {\n this.setState({ suggestedBindings: [] });\n }\n }\n if ((0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_21__.isBindingElementType)(this.state.activeTool.type)) {\n // Hovering with a selected tool or creating new linear element via click\n // and point\n const { draggingElement } = this.state;\n if ((0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_21__.isBindingElement)(draggingElement, false)) {\n this.maybeSuggestBindingsForLinearElementAtCoords(draggingElement, [scenePointer], this.state.startBoundElement);\n }\n else {\n this.maybeSuggestBindingAtCursor(scenePointer);\n }\n }\n if (this.state.multiElement) {\n const { multiElement } = this.state;\n const { x: rx, y: ry } = multiElement;\n const { points, lastCommittedPoint } = multiElement;\n const lastPoint = points[points.length - 1];\n (0,_utils__WEBPACK_IMPORTED_MODULE_34__.setCursorForShape)(this.canvas, this.state);\n if (lastPoint === lastCommittedPoint) {\n // if we haven't yet created a temp point and we're beyond commit-zone\n // threshold, add a point\n if ((0,_math__WEBPACK_IMPORTED_MODULE_27__.distance2d)(scenePointerX - rx, scenePointerY - ry, lastPoint[0], lastPoint[1]) >= _constants__WEBPACK_IMPORTED_MODULE_12__.LINE_CONFIRM_THRESHOLD) {\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_19__.mutateElement)(multiElement, {\n points: [...points, [scenePointerX - rx, scenePointerY - ry]],\n });\n }\n else {\n (0,_utils__WEBPACK_IMPORTED_MODULE_34__.setCursor)(this.canvas, _constants__WEBPACK_IMPORTED_MODULE_12__.CURSOR_TYPE.POINTER);\n // in this branch, we're inside the commit zone, and no uncommitted\n // point exists. Thus do nothing (don't add/remove points).\n }\n }\n else if (points.length > 2 &&\n lastCommittedPoint &&\n (0,_math__WEBPACK_IMPORTED_MODULE_27__.distance2d)(scenePointerX - rx, scenePointerY - ry, lastCommittedPoint[0], lastCommittedPoint[1]) < _constants__WEBPACK_IMPORTED_MODULE_12__.LINE_CONFIRM_THRESHOLD) {\n (0,_utils__WEBPACK_IMPORTED_MODULE_34__.setCursor)(this.canvas, _constants__WEBPACK_IMPORTED_MODULE_12__.CURSOR_TYPE.POINTER);\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_19__.mutateElement)(multiElement, {\n points: points.slice(0, -1),\n });\n }\n else {\n if ((0,_math__WEBPACK_IMPORTED_MODULE_27__.isPathALoop)(points, this.state.zoom.value)) {\n (0,_utils__WEBPACK_IMPORTED_MODULE_34__.setCursor)(this.canvas, _constants__WEBPACK_IMPORTED_MODULE_12__.CURSOR_TYPE.POINTER);\n }\n // update last uncommitted point\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_19__.mutateElement)(multiElement, {\n points: [\n ...points.slice(0, -1),\n [scenePointerX - rx, scenePointerY - ry],\n ],\n });\n }\n return;\n }\n const hasDeselectedButton = Boolean(event.buttons);\n if (hasDeselectedButton ||\n (this.state.activeTool.type !== \"selection\" &&\n this.state.activeTool.type !== \"text\" &&\n this.state.activeTool.type !== \"eraser\")) {\n return;\n }\n const elements = this.scene.getNonDeletedElements();\n const selectedElements = (0,_scene__WEBPACK_IMPORTED_MODULE_30__.getSelectedElements)(elements, this.state);\n if (selectedElements.length === 1 &&\n !isOverScrollBar &&\n !this.state.editingLinearElement) {\n const elementWithTransformHandleType = (0,_element__WEBPACK_IMPORTED_MODULE_16__.getElementWithTransformHandleType)(elements, this.state, scenePointerX, scenePointerY, this.state.zoom, event.pointerType);\n if (elementWithTransformHandleType &&\n elementWithTransformHandleType.transformHandleType) {\n (0,_utils__WEBPACK_IMPORTED_MODULE_34__.setCursor)(this.canvas, (0,_element__WEBPACK_IMPORTED_MODULE_16__.getCursorForResizingElement)(elementWithTransformHandleType));\n return;\n }\n }\n else if (selectedElements.length > 1 && !isOverScrollBar) {\n const transformHandleType = (0,_element__WEBPACK_IMPORTED_MODULE_16__.getTransformHandleTypeFromCoords)((0,_element__WEBPACK_IMPORTED_MODULE_16__.getCommonBounds)(selectedElements), scenePointerX, scenePointerY, this.state.zoom, event.pointerType);\n if (transformHandleType) {\n (0,_utils__WEBPACK_IMPORTED_MODULE_34__.setCursor)(this.canvas, (0,_element__WEBPACK_IMPORTED_MODULE_16__.getCursorForResizingElement)({\n transformHandleType,\n }));\n return;\n }\n }\n const hitElement = this.getElementAtPosition(scenePointer.x, scenePointer.y);\n this.hitLinkElement = this.getElementLinkAtPosition(scenePointer, hitElement);\n if ((0,_appState__WEBPACK_IMPORTED_MODULE_10__.isEraserActive)(this.state)) {\n return;\n }\n if (this.hitLinkElement &&\n !this.state.selectedElementIds[this.hitLinkElement.id]) {\n (0,_utils__WEBPACK_IMPORTED_MODULE_34__.setCursor)(this.canvas, _constants__WEBPACK_IMPORTED_MODULE_12__.CURSOR_TYPE.POINTER);\n (0,_element_Hyperlink__WEBPACK_IMPORTED_MODULE_45__.showHyperlinkTooltip)(this.hitLinkElement, this.state);\n }\n else {\n (0,_element_Hyperlink__WEBPACK_IMPORTED_MODULE_45__.hideHyperlinkToolip)();\n if (hitElement &&\n hitElement.link &&\n this.state.selectedElementIds[hitElement.id] &&\n !this.contextMenuOpen &&\n !this.state.showHyperlinkPopup) {\n this.setState({ showHyperlinkPopup: \"info\" });\n }\n else if (this.state.activeTool.type === \"text\") {\n (0,_utils__WEBPACK_IMPORTED_MODULE_34__.setCursor)(this.canvas, (0,_element__WEBPACK_IMPORTED_MODULE_16__.isTextElement)(hitElement) ? _constants__WEBPACK_IMPORTED_MODULE_12__.CURSOR_TYPE.TEXT : _constants__WEBPACK_IMPORTED_MODULE_12__.CURSOR_TYPE.CROSSHAIR);\n }\n else if (this.state.viewModeEnabled) {\n (0,_utils__WEBPACK_IMPORTED_MODULE_34__.setCursor)(this.canvas, _constants__WEBPACK_IMPORTED_MODULE_12__.CURSOR_TYPE.GRAB);\n }\n else if (isOverScrollBar) {\n (0,_utils__WEBPACK_IMPORTED_MODULE_34__.setCursor)(this.canvas, _constants__WEBPACK_IMPORTED_MODULE_12__.CURSOR_TYPE.AUTO);\n }\n else if (this.state.editingLinearElement) {\n const element = _element_linearElementEditor__WEBPACK_IMPORTED_MODULE_18__.LinearElementEditor.getElement(this.state.editingLinearElement.elementId);\n if (element &&\n (0,_element_collision__WEBPACK_IMPORTED_MODULE_44__.isHittingElementNotConsideringBoundingBox)(element, this.state, [\n scenePointer.x,\n scenePointer.y,\n ])) {\n (0,_utils__WEBPACK_IMPORTED_MODULE_34__.setCursor)(this.canvas, _constants__WEBPACK_IMPORTED_MODULE_12__.CURSOR_TYPE.MOVE);\n }\n else {\n (0,_utils__WEBPACK_IMPORTED_MODULE_34__.setCursor)(this.canvas, _constants__WEBPACK_IMPORTED_MODULE_12__.CURSOR_TYPE.AUTO);\n }\n }\n else if (\n // if using cmd/ctrl, we're not dragging\n !event[_keys__WEBPACK_IMPORTED_MODULE_26__.KEYS.CTRL_OR_CMD] &&\n (hitElement ||\n this.isHittingCommonBoundingBoxOfSelectedElements(scenePointer, selectedElements)) &&\n !(hitElement === null || hitElement === void 0 ? void 0 : hitElement.locked)) {\n (0,_utils__WEBPACK_IMPORTED_MODULE_34__.setCursor)(this.canvas, _constants__WEBPACK_IMPORTED_MODULE_12__.CURSOR_TYPE.MOVE);\n }\n else {\n (0,_utils__WEBPACK_IMPORTED_MODULE_34__.setCursor)(this.canvas, _constants__WEBPACK_IMPORTED_MODULE_12__.CURSOR_TYPE.AUTO);\n }\n }\n };\n this.handleEraser = (event, pointerDownState, scenePointer) => {\n const updateElementIds = (elements) => {\n elements.forEach((element) => {\n if (element.locked) {\n return;\n }\n idsToUpdate.push(element.id);\n if (event.altKey) {\n if (pointerDownState.elementIdsToErase[element.id] &&\n pointerDownState.elementIdsToErase[element.id].erase) {\n pointerDownState.elementIdsToErase[element.id].erase = false;\n }\n }\n else if (!pointerDownState.elementIdsToErase[element.id]) {\n pointerDownState.elementIdsToErase[element.id] = {\n erase: true,\n opacity: element.opacity,\n };\n }\n });\n };\n const idsToUpdate = [];\n const distance = (0,_math__WEBPACK_IMPORTED_MODULE_27__.distance2d)(pointerDownState.lastCoords.x, pointerDownState.lastCoords.y, scenePointer.x, scenePointer.y);\n const threshold = 10 / this.state.zoom.value;\n const point = Object.assign({}, pointerDownState.lastCoords);\n let samplingInterval = 0;\n while (samplingInterval <= distance) {\n const hitElements = this.getElementsAtPosition(point.x, point.y);\n updateElementIds(hitElements);\n // Exit since we reached current point\n if (samplingInterval === distance) {\n break;\n }\n // Calculate next point in the line at a distance of sampling interval\n samplingInterval = Math.min(samplingInterval + threshold, distance);\n const distanceRatio = samplingInterval / distance;\n const nextX = (1 - distanceRatio) * point.x + distanceRatio * scenePointer.x;\n const nextY = (1 - distanceRatio) * point.y + distanceRatio * scenePointer.y;\n point.x = nextX;\n point.y = nextY;\n }\n const elements = this.scene.getElementsIncludingDeleted().map((ele) => {\n const id = (0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_21__.isBoundToContainer)(ele) && idsToUpdate.includes(ele.containerId)\n ? ele.containerId\n : ele.id;\n if (idsToUpdate.includes(id)) {\n if (event.altKey) {\n if (pointerDownState.elementIdsToErase[id] &&\n pointerDownState.elementIdsToErase[id].erase === false) {\n return (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_19__.newElementWith)(ele, {\n opacity: pointerDownState.elementIdsToErase[id].opacity,\n });\n }\n }\n else {\n return (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_19__.newElementWith)(ele, {\n opacity: _constants__WEBPACK_IMPORTED_MODULE_12__.ELEMENT_READY_TO_ERASE_OPACITY,\n });\n }\n }\n return ele;\n });\n this.scene.replaceAllElements(elements);\n pointerDownState.lastCoords.x = scenePointer.x;\n pointerDownState.lastCoords.y = scenePointer.y;\n };\n // set touch moving for mobile context menu\n this.handleTouchMove = (event) => {\n invalidateContextMenu = true;\n };\n this.handleCanvasPointerDown = (event) => {\n var _a, _b;\n // remove any active selection when we start to interact with canvas\n // (mainly, we care about removing selection outside the component which\n // would prevent our copy handling otherwise)\n const selection = document.getSelection();\n if (selection === null || selection === void 0 ? void 0 : selection.anchorNode) {\n selection.removeAllRanges();\n }\n this.maybeOpenContextMenuAfterPointerDownOnTouchDevices(event);\n this.maybeCleanupAfterMissingPointerUp(event);\n //fires only once, if pen is detected, penMode is enabled\n //the user can disable this by toggling the penMode button\n if (!this.state.penDetected && event.pointerType === \"pen\") {\n this.setState((prevState) => {\n return {\n penMode: true,\n penDetected: true,\n };\n });\n }\n if (!this.device.isTouchScreen &&\n [\"pen\", \"touch\"].includes(event.pointerType)) {\n this.device = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.updateObject)(this.device, { isTouchScreen: true });\n }\n if (isPanning) {\n return;\n }\n this.lastPointerDown = event;\n this.setState({\n lastPointerDownWith: event.pointerType,\n cursorButton: \"down\",\n });\n this.savePointer(event.clientX, event.clientY, \"down\");\n this.updateGestureOnPointerDown(event);\n if (this.handleCanvasPanUsingWheelOrSpaceDrag(event)) {\n return;\n }\n // only handle left mouse button or touch\n if (event.button !== _constants__WEBPACK_IMPORTED_MODULE_12__.POINTER_BUTTON.MAIN &&\n event.button !== _constants__WEBPACK_IMPORTED_MODULE_12__.POINTER_BUTTON.TOUCH) {\n return;\n }\n // don't select while panning\n if (gesture.pointers.size > 1) {\n return;\n }\n // State for the duration of a pointer interaction, which starts with a\n // pointerDown event, ends with a pointerUp event (or another pointerDown)\n const pointerDownState = this.initialPointerDownState(event);\n if (this.handleDraggingScrollBar(event, pointerDownState)) {\n return;\n }\n // Since context menu closes on pointer down so setting to false\n this.contextMenuOpen = false;\n this.clearSelectionIfNotUsingSelection();\n this.updateBindingEnabledOnPointerMove(event);\n if (this.handleSelectionOnPointerDown(event, pointerDownState)) {\n return;\n }\n const allowOnPointerDown = !this.state.penMode ||\n event.pointerType !== \"touch\" ||\n this.state.activeTool.type === \"selection\" ||\n this.state.activeTool.type === \"text\" ||\n this.state.activeTool.type === \"image\";\n if (!allowOnPointerDown) {\n return;\n }\n if (this.state.activeTool.type === \"text\") {\n this.handleTextOnPointerDown(event, pointerDownState);\n return;\n }\n else if (this.state.activeTool.type === \"arrow\" ||\n this.state.activeTool.type === \"line\") {\n this.handleLinearElementOnPointerDown(event, this.state.activeTool.type, pointerDownState);\n }\n else if (this.state.activeTool.type === \"image\") {\n // reset image preview on pointerdown\n (0,_utils__WEBPACK_IMPORTED_MODULE_34__.setCursor)(this.canvas, _constants__WEBPACK_IMPORTED_MODULE_12__.CURSOR_TYPE.CROSSHAIR);\n // retrieve the latest element as the state may be stale\n const pendingImageElement = this.state.pendingImageElementId &&\n this.scene.getElement(this.state.pendingImageElementId);\n if (!pendingImageElement) {\n return;\n }\n this.setState({\n draggingElement: pendingImageElement,\n editingElement: pendingImageElement,\n pendingImageElementId: null,\n multiElement: null,\n });\n const { x, y } = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.viewportCoordsToSceneCoords)(event, this.state);\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_19__.mutateElement)(pendingImageElement, {\n x,\n y,\n });\n }\n else if (this.state.activeTool.type === \"freedraw\") {\n this.handleFreeDrawElementOnPointerDown(event, this.state.activeTool.type, pointerDownState);\n }\n else if (this.state.activeTool.type === \"custom\") {\n (0,_utils__WEBPACK_IMPORTED_MODULE_34__.setCursor)(this.canvas, _constants__WEBPACK_IMPORTED_MODULE_12__.CURSOR_TYPE.AUTO);\n }\n else if (this.state.activeTool.type !== \"eraser\") {\n this.createGenericElementOnPointerDown(this.state.activeTool.type, pointerDownState);\n }\n (_b = (_a = this.props) === null || _a === void 0 ? void 0 : _a.onPointerDown) === null || _b === void 0 ? void 0 : _b.call(_a, this.state.activeTool, pointerDownState);\n const onPointerMove = this.onPointerMoveFromPointerDownHandler(pointerDownState);\n const onPointerUp = this.onPointerUpFromPointerDownHandler(pointerDownState);\n const onKeyDown = this.onKeyDownFromPointerDownHandler(pointerDownState);\n const onKeyUp = this.onKeyUpFromPointerDownHandler(pointerDownState);\n lastPointerUp = onPointerUp;\n if (!this.state.viewModeEnabled) {\n window.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.POINTER_MOVE, onPointerMove);\n window.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.POINTER_UP, onPointerUp);\n window.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.KEYDOWN, onKeyDown);\n window.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.KEYUP, onKeyUp);\n pointerDownState.eventListeners.onMove = onPointerMove;\n pointerDownState.eventListeners.onUp = onPointerUp;\n pointerDownState.eventListeners.onKeyUp = onKeyUp;\n pointerDownState.eventListeners.onKeyDown = onKeyDown;\n }\n };\n this.handleCanvasPointerUp = (event) => {\n this.lastPointerUp = event;\n if (this.device.isTouchScreen) {\n const scenePointer = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.viewportCoordsToSceneCoords)({ clientX: event.clientX, clientY: event.clientY }, this.state);\n const hitElement = this.getElementAtPosition(scenePointer.x, scenePointer.y);\n this.hitLinkElement = this.getElementLinkAtPosition(scenePointer, hitElement);\n }\n if (this.hitLinkElement &&\n !this.state.selectedElementIds[this.hitLinkElement.id]) {\n this.redirectToLink(event, this.device.isTouchScreen);\n }\n this.removePointer(event);\n };\n this.maybeOpenContextMenuAfterPointerDownOnTouchDevices = (event) => {\n // deal with opening context menu on touch devices\n if (event.pointerType === \"touch\") {\n invalidateContextMenu = false;\n if (touchTimeout) {\n // If there's already a touchTimeout, this means that there's another\n // touch down and we are doing another touch, so we shouldn't open the\n // context menu.\n invalidateContextMenu = true;\n }\n else {\n // open the context menu with the first touch's clientX and clientY\n // if the touch is not moving\n touchTimeout = window.setTimeout(() => {\n touchTimeout = 0;\n if (!invalidateContextMenu) {\n this.handleCanvasContextMenu(event);\n }\n }, _constants__WEBPACK_IMPORTED_MODULE_12__.TOUCH_CTX_MENU_TIMEOUT);\n }\n }\n };\n this.resetContextMenuTimer = () => {\n clearTimeout(touchTimeout);\n touchTimeout = 0;\n invalidateContextMenu = false;\n };\n // Returns whether the event is a panning\n this.handleCanvasPanUsingWheelOrSpaceDrag = (event) => {\n if (!(gesture.pointers.size <= 1 &&\n (event.button === _constants__WEBPACK_IMPORTED_MODULE_12__.POINTER_BUTTON.WHEEL ||\n (event.button === _constants__WEBPACK_IMPORTED_MODULE_12__.POINTER_BUTTON.MAIN && isHoldingSpace) ||\n this.state.viewModeEnabled)) ||\n (0,_element__WEBPACK_IMPORTED_MODULE_16__.isTextElement)(this.state.editingElement)) {\n return false;\n }\n isPanning = true;\n event.preventDefault();\n let nextPastePrevented = false;\n const isLinux = /Linux/.test(window.navigator.platform);\n (0,_utils__WEBPACK_IMPORTED_MODULE_34__.setCursor)(this.canvas, _constants__WEBPACK_IMPORTED_MODULE_12__.CURSOR_TYPE.GRABBING);\n let { clientX: lastX, clientY: lastY } = event;\n const onPointerMove = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.withBatchedUpdatesThrottled)((event) => {\n const deltaX = lastX - event.clientX;\n const deltaY = lastY - event.clientY;\n lastX = event.clientX;\n lastY = event.clientY;\n /*\n * Prevent paste event if we move while middle clicking on Linux.\n * See issue #1383.\n */\n if (isLinux &&\n !nextPastePrevented &&\n (Math.abs(deltaX) > 1 || Math.abs(deltaY) > 1)) {\n nextPastePrevented = true;\n /* Prevent the next paste event */\n const preventNextPaste = (event) => {\n document.body.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.PASTE, preventNextPaste);\n event.stopPropagation();\n };\n /*\n * Reenable next paste in case of disabled middle click paste for\n * any reason:\n * - right click paste\n * - empty clipboard\n */\n const enableNextPaste = () => {\n setTimeout(() => {\n document.body.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.PASTE, preventNextPaste);\n window.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.POINTER_UP, enableNextPaste);\n }, 100);\n };\n document.body.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.PASTE, preventNextPaste);\n window.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.POINTER_UP, enableNextPaste);\n }\n this.setState({\n scrollX: this.state.scrollX - deltaX / this.state.zoom.value,\n scrollY: this.state.scrollY - deltaY / this.state.zoom.value,\n });\n });\n const teardown = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.withBatchedUpdates)((lastPointerUp = () => {\n lastPointerUp = null;\n isPanning = false;\n if (!isHoldingSpace) {\n if (this.state.viewModeEnabled) {\n (0,_utils__WEBPACK_IMPORTED_MODULE_34__.setCursor)(this.canvas, _constants__WEBPACK_IMPORTED_MODULE_12__.CURSOR_TYPE.GRAB);\n }\n else {\n (0,_utils__WEBPACK_IMPORTED_MODULE_34__.setCursorForShape)(this.canvas, this.state);\n }\n }\n this.setState({\n cursorButton: \"up\",\n });\n this.savePointer(event.clientX, event.clientY, \"up\");\n window.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.POINTER_MOVE, onPointerMove);\n window.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.POINTER_UP, teardown);\n window.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.BLUR, teardown);\n onPointerMove.flush();\n }));\n window.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.BLUR, teardown);\n window.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.POINTER_MOVE, onPointerMove, {\n passive: true,\n });\n window.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.POINTER_UP, teardown);\n return true;\n };\n this.clearSelectionIfNotUsingSelection = () => {\n if (this.state.activeTool.type !== \"selection\") {\n this.setState({\n selectedElementIds: {},\n selectedGroupIds: {},\n editingGroupId: null,\n });\n }\n };\n /**\n * @returns whether the pointer event has been completely handled\n */\n this.handleSelectionOnPointerDown = (event, pointerDownState) => {\n var _a;\n if (this.state.activeTool.type === \"selection\") {\n const elements = this.scene.getNonDeletedElements();\n const selectedElements = (0,_scene__WEBPACK_IMPORTED_MODULE_30__.getSelectedElements)(elements, this.state);\n if (selectedElements.length === 1 && !this.state.editingLinearElement) {\n const elementWithTransformHandleType = (0,_element__WEBPACK_IMPORTED_MODULE_16__.getElementWithTransformHandleType)(elements, this.state, pointerDownState.origin.x, pointerDownState.origin.y, this.state.zoom, event.pointerType);\n if (elementWithTransformHandleType != null) {\n this.setState({\n resizingElement: elementWithTransformHandleType.element,\n });\n pointerDownState.resize.handleType =\n elementWithTransformHandleType.transformHandleType;\n }\n }\n else if (selectedElements.length > 1) {\n pointerDownState.resize.handleType = (0,_element__WEBPACK_IMPORTED_MODULE_16__.getTransformHandleTypeFromCoords)((0,_element__WEBPACK_IMPORTED_MODULE_16__.getCommonBounds)(selectedElements), pointerDownState.origin.x, pointerDownState.origin.y, this.state.zoom, event.pointerType);\n }\n if (pointerDownState.resize.handleType) {\n (0,_utils__WEBPACK_IMPORTED_MODULE_34__.setCursor)(this.canvas, (0,_element__WEBPACK_IMPORTED_MODULE_16__.getCursorForResizingElement)({\n transformHandleType: pointerDownState.resize.handleType,\n }));\n pointerDownState.resize.isResizing = true;\n pointerDownState.resize.offset = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.tupleToCoors)((0,_element__WEBPACK_IMPORTED_MODULE_16__.getResizeOffsetXY)(pointerDownState.resize.handleType, selectedElements, pointerDownState.origin.x, pointerDownState.origin.y));\n if (selectedElements.length === 1 &&\n (0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_21__.isLinearElement)(selectedElements[0]) &&\n selectedElements[0].points.length === 2) {\n pointerDownState.resize.arrowDirection = (0,_element__WEBPACK_IMPORTED_MODULE_16__.getResizeArrowDirection)(pointerDownState.resize.handleType, selectedElements[0]);\n }\n }\n else {\n if (this.state.editingLinearElement) {\n const ret = _element_linearElementEditor__WEBPACK_IMPORTED_MODULE_18__.LinearElementEditor.handlePointerDown(event, this.state, (appState) => this.setState(appState), this.history, pointerDownState.origin);\n if (ret.hitElement) {\n pointerDownState.hit.element = ret.hitElement;\n }\n if (ret.didAddPoint) {\n return true;\n }\n }\n // hitElement may already be set above, so check first\n pointerDownState.hit.element =\n (_a = pointerDownState.hit.element) !== null && _a !== void 0 ? _a : this.getElementAtPosition(pointerDownState.origin.x, pointerDownState.origin.y);\n if (pointerDownState.hit.element) {\n // Early return if pointer is hitting link icon\n if ((0,_element_Hyperlink__WEBPACK_IMPORTED_MODULE_45__.isPointHittingLinkIcon)(pointerDownState.hit.element, this.state, [pointerDownState.origin.x, pointerDownState.origin.y], this.device.isMobile)) {\n return false;\n }\n pointerDownState.hit.hasHitElementInside =\n (0,_element_collision__WEBPACK_IMPORTED_MODULE_44__.isHittingElementNotConsideringBoundingBox)(pointerDownState.hit.element, this.state, [pointerDownState.origin.x, pointerDownState.origin.y]);\n }\n // For overlapped elements one position may hit\n // multiple elements\n pointerDownState.hit.allHitElements = this.getElementsAtPosition(pointerDownState.origin.x, pointerDownState.origin.y);\n const hitElement = pointerDownState.hit.element;\n const someHitElementIsSelected = pointerDownState.hit.allHitElements.some((element) => this.isASelectedElement(element));\n if ((hitElement === null || !someHitElementIsSelected) &&\n !event.shiftKey &&\n !pointerDownState.hit.hasHitCommonBoundingBoxOfSelectedElements) {\n this.clearSelection(hitElement);\n }\n if (this.state.editingLinearElement) {\n this.setState({\n selectedElementIds: {\n [this.state.editingLinearElement.elementId]: true,\n },\n });\n // If we click on something\n }\n else if (hitElement != null) {\n // on CMD/CTRL, drill down to hit element regardless of groups etc.\n if (event[_keys__WEBPACK_IMPORTED_MODULE_26__.KEYS.CTRL_OR_CMD]) {\n if (!this.state.selectedElementIds[hitElement.id]) {\n pointerDownState.hit.wasAddedToSelection = true;\n }\n this.setState((prevState) => (Object.assign(Object.assign({}, (0,_groups__WEBPACK_IMPORTED_MODULE_23__.editGroupForSelectedElement)(prevState, hitElement)), { previousSelectedElementIds: this.state.selectedElementIds })));\n // mark as not completely handled so as to allow dragging etc.\n return false;\n }\n // deselect if item is selected\n // if shift is not clicked, this will always return true\n // otherwise, it will trigger selection based on current\n // state of the box\n if (!this.state.selectedElementIds[hitElement.id]) {\n // if we are currently editing a group, exiting editing mode and deselect the group.\n if (this.state.editingGroupId &&\n !(0,_groups__WEBPACK_IMPORTED_MODULE_23__.isElementInGroup)(hitElement, this.state.editingGroupId)) {\n this.setState({\n selectedElementIds: {},\n selectedGroupIds: {},\n editingGroupId: null,\n });\n }\n // Add hit element to selection. At this point if we're not holding\n // SHIFT the previously selected element(s) were deselected above\n // (make sure you use setState updater to use latest state)\n if (!someHitElementIsSelected &&\n !pointerDownState.hit.hasHitCommonBoundingBoxOfSelectedElements) {\n this.setState((prevState) => {\n return (0,_groups__WEBPACK_IMPORTED_MODULE_23__.selectGroupsForSelectedElements)(Object.assign(Object.assign({}, prevState), { selectedElementIds: Object.assign(Object.assign({}, prevState.selectedElementIds), { [hitElement.id]: true }), showHyperlinkPopup: hitElement.link ? \"info\" : false }), this.scene.getNonDeletedElements());\n });\n pointerDownState.hit.wasAddedToSelection = true;\n }\n }\n }\n this.setState({\n previousSelectedElementIds: this.state.selectedElementIds,\n });\n }\n }\n return false;\n };\n this.handleTextOnPointerDown = (event, pointerDownState) => {\n // if we're currently still editing text, clicking outside\n // should only finalize it, not create another (irrespective\n // of state.activeTool.locked)\n if ((0,_element__WEBPACK_IMPORTED_MODULE_16__.isTextElement)(this.state.editingElement)) {\n return;\n }\n let sceneX = pointerDownState.origin.x;\n let sceneY = pointerDownState.origin.y;\n const element = this.getElementAtPosition(sceneX, sceneY, {\n includeBoundTextElement: true,\n });\n const canBindText = (0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_21__.hasBoundTextElement)(element);\n if (canBindText) {\n sceneX = element.x + element.width / 2;\n sceneY = element.y + element.height / 2;\n }\n this.startTextEditing({\n sceneX,\n sceneY,\n shouldBind: false,\n insertAtParentCenter: !event.altKey,\n });\n (0,_utils__WEBPACK_IMPORTED_MODULE_34__.resetCursor)(this.canvas);\n if (!this.state.activeTool.locked) {\n this.setState({\n activeTool: (0,_utils__WEBPACK_IMPORTED_MODULE_34__.updateActiveTool)(this.state, { type: \"selection\" }),\n });\n }\n };\n this.handleFreeDrawElementOnPointerDown = (event, elementType, pointerDownState) => {\n // Begin a mark capture. This does not have to update state yet.\n const [gridX, gridY] = (0,_math__WEBPACK_IMPORTED_MODULE_27__.getGridPoint)(pointerDownState.origin.x, pointerDownState.origin.y, null);\n const element = (0,_element_newElement__WEBPACK_IMPORTED_MODULE_20__.newFreeDrawElement)({\n type: elementType,\n x: gridX,\n y: gridY,\n strokeColor: this.state.currentItemStrokeColor,\n backgroundColor: this.state.currentItemBackgroundColor,\n fillStyle: this.state.currentItemFillStyle,\n strokeWidth: this.state.currentItemStrokeWidth,\n strokeStyle: this.state.currentItemStrokeStyle,\n roughness: this.state.currentItemRoughness,\n opacity: this.state.currentItemOpacity,\n strokeSharpness: this.state.currentItemLinearStrokeSharpness,\n simulatePressure: event.pressure === 0.5,\n locked: false,\n });\n this.setState((prevState) => ({\n selectedElementIds: Object.assign(Object.assign({}, prevState.selectedElementIds), { [element.id]: false }),\n }));\n const pressures = element.simulatePressure\n ? element.pressures\n : [...element.pressures, event.pressure];\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_19__.mutateElement)(element, {\n points: [[0, 0]],\n pressures,\n });\n const boundElement = (0,_element_binding__WEBPACK_IMPORTED_MODULE_17__.getHoveredElementForBinding)(pointerDownState.origin, this.scene);\n this.scene.replaceAllElements([\n ...this.scene.getElementsIncludingDeleted(),\n element,\n ]);\n this.setState({\n draggingElement: element,\n editingElement: element,\n startBoundElement: boundElement,\n suggestedBindings: [],\n });\n };\n this.createImageElement = ({ sceneX, sceneY, }) => {\n const [gridX, gridY] = (0,_math__WEBPACK_IMPORTED_MODULE_27__.getGridPoint)(sceneX, sceneY, this.state.gridSize);\n const element = (0,_element__WEBPACK_IMPORTED_MODULE_16__.newImageElement)({\n type: \"image\",\n x: gridX,\n y: gridY,\n strokeColor: this.state.currentItemStrokeColor,\n backgroundColor: this.state.currentItemBackgroundColor,\n fillStyle: this.state.currentItemFillStyle,\n strokeWidth: this.state.currentItemStrokeWidth,\n strokeStyle: this.state.currentItemStrokeStyle,\n roughness: this.state.currentItemRoughness,\n opacity: this.state.currentItemOpacity,\n strokeSharpness: this.state.currentItemLinearStrokeSharpness,\n locked: false,\n });\n return element;\n };\n this.handleLinearElementOnPointerDown = (event, elementType, pointerDownState) => {\n if (this.state.multiElement) {\n const { multiElement } = this.state;\n // finalize if completing a loop\n if (multiElement.type === \"line\" &&\n (0,_math__WEBPACK_IMPORTED_MODULE_27__.isPathALoop)(multiElement.points, this.state.zoom.value)) {\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_19__.mutateElement)(multiElement, {\n lastCommittedPoint: multiElement.points[multiElement.points.length - 1],\n });\n this.actionManager.executeAction(_actions__WEBPACK_IMPORTED_MODULE_5__.actionFinalize);\n return;\n }\n const { x: rx, y: ry, lastCommittedPoint } = multiElement;\n // clicking inside commit zone → finalize arrow\n if (multiElement.points.length > 1 &&\n lastCommittedPoint &&\n (0,_math__WEBPACK_IMPORTED_MODULE_27__.distance2d)(pointerDownState.origin.x - rx, pointerDownState.origin.y - ry, lastCommittedPoint[0], lastCommittedPoint[1]) < _constants__WEBPACK_IMPORTED_MODULE_12__.LINE_CONFIRM_THRESHOLD) {\n this.actionManager.executeAction(_actions__WEBPACK_IMPORTED_MODULE_5__.actionFinalize);\n return;\n }\n this.setState((prevState) => ({\n selectedElementIds: Object.assign(Object.assign({}, prevState.selectedElementIds), { [multiElement.id]: true }),\n }));\n // clicking outside commit zone → update reference for last committed\n // point\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_19__.mutateElement)(multiElement, {\n lastCommittedPoint: multiElement.points[multiElement.points.length - 1],\n });\n (0,_utils__WEBPACK_IMPORTED_MODULE_34__.setCursor)(this.canvas, _constants__WEBPACK_IMPORTED_MODULE_12__.CURSOR_TYPE.POINTER);\n }\n else {\n const [gridX, gridY] = (0,_math__WEBPACK_IMPORTED_MODULE_27__.getGridPoint)(pointerDownState.origin.x, pointerDownState.origin.y, this.state.gridSize);\n /* If arrow is pre-arrowheads, it will have undefined for both start and end arrowheads.\n If so, we want it to be null for start and \"arrow\" for end. If the linear item is not\n an arrow, we want it to be null for both. Otherwise, we want it to use the\n values from appState. */\n const { currentItemStartArrowhead, currentItemEndArrowhead } = this.state;\n const [startArrowhead, endArrowhead] = elementType === \"arrow\"\n ? [currentItemStartArrowhead, currentItemEndArrowhead]\n : [null, null];\n const element = (0,_element__WEBPACK_IMPORTED_MODULE_16__.newLinearElement)({\n type: elementType,\n x: gridX,\n y: gridY,\n strokeColor: this.state.currentItemStrokeColor,\n backgroundColor: this.state.currentItemBackgroundColor,\n fillStyle: this.state.currentItemFillStyle,\n strokeWidth: this.state.currentItemStrokeWidth,\n strokeStyle: this.state.currentItemStrokeStyle,\n roughness: this.state.currentItemRoughness,\n opacity: this.state.currentItemOpacity,\n strokeSharpness: this.state.currentItemLinearStrokeSharpness,\n startArrowhead,\n endArrowhead,\n locked: false,\n });\n this.setState((prevState) => ({\n selectedElementIds: Object.assign(Object.assign({}, prevState.selectedElementIds), { [element.id]: false }),\n }));\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_19__.mutateElement)(element, {\n points: [...element.points, [0, 0]],\n });\n const boundElement = (0,_element_binding__WEBPACK_IMPORTED_MODULE_17__.getHoveredElementForBinding)(pointerDownState.origin, this.scene);\n this.scene.replaceAllElements([\n ...this.scene.getElementsIncludingDeleted(),\n element,\n ]);\n this.setState({\n draggingElement: element,\n editingElement: element,\n startBoundElement: boundElement,\n suggestedBindings: [],\n });\n }\n };\n this.createGenericElementOnPointerDown = (elementType, pointerDownState) => {\n const [gridX, gridY] = (0,_math__WEBPACK_IMPORTED_MODULE_27__.getGridPoint)(pointerDownState.origin.x, pointerDownState.origin.y, this.state.gridSize);\n const element = (0,_element__WEBPACK_IMPORTED_MODULE_16__.newElement)({\n type: elementType,\n x: gridX,\n y: gridY,\n strokeColor: this.state.currentItemStrokeColor,\n backgroundColor: this.state.currentItemBackgroundColor,\n fillStyle: this.state.currentItemFillStyle,\n strokeWidth: this.state.currentItemStrokeWidth,\n strokeStyle: this.state.currentItemStrokeStyle,\n roughness: this.state.currentItemRoughness,\n opacity: this.state.currentItemOpacity,\n strokeSharpness: this.state.currentItemStrokeSharpness,\n locked: false,\n });\n if (element.type === \"selection\") {\n this.setState({\n selectionElement: element,\n draggingElement: element,\n });\n }\n else {\n this.scene.replaceAllElements([\n ...this.scene.getElementsIncludingDeleted(),\n element,\n ]);\n this.setState({\n multiElement: null,\n draggingElement: element,\n editingElement: element,\n });\n }\n };\n this.restoreReadyToEraseElements = (pointerDownState) => {\n const elements = this.scene.getElementsIncludingDeleted().map((ele) => {\n if (pointerDownState.elementIdsToErase[ele.id] &&\n pointerDownState.elementIdsToErase[ele.id].erase) {\n return (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_19__.newElementWith)(ele, {\n opacity: pointerDownState.elementIdsToErase[ele.id].opacity,\n });\n }\n else if ((0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_21__.isBoundToContainer)(ele) &&\n pointerDownState.elementIdsToErase[ele.containerId] &&\n pointerDownState.elementIdsToErase[ele.containerId].erase) {\n return (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_19__.newElementWith)(ele, {\n opacity: pointerDownState.elementIdsToErase[ele.containerId].opacity,\n });\n }\n return ele;\n });\n this.scene.replaceAllElements(elements);\n };\n this.eraseElements = (pointerDownState) => {\n const elements = this.scene.getElementsIncludingDeleted().map((ele) => {\n if (pointerDownState.elementIdsToErase[ele.id] &&\n pointerDownState.elementIdsToErase[ele.id].erase) {\n return (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_19__.newElementWith)(ele, { isDeleted: true });\n }\n else if ((0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_21__.isBoundToContainer)(ele) &&\n pointerDownState.elementIdsToErase[ele.containerId] &&\n pointerDownState.elementIdsToErase[ele.containerId].erase) {\n return (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_19__.newElementWith)(ele, { isDeleted: true });\n }\n return ele;\n });\n this.history.resumeRecording();\n this.scene.replaceAllElements(elements);\n };\n this.initializeImage = ({ imageFile, imageElement: _imageElement, showCursorImagePreview = false, }) => __awaiter(this, void 0, void 0, function* () {\n var _e, _f, _g, _h;\n // at this point this should be guaranteed image file, but we do this check\n // to satisfy TS down the line\n if (!(0,_data_blob__WEBPACK_IMPORTED_MODULE_39__.isSupportedImageFile)(imageFile)) {\n throw new Error((0,_i18n__WEBPACK_IMPORTED_MODULE_25__.t)(\"errors.unsupportedFileType\"));\n }\n const mimeType = imageFile.type;\n (0,_utils__WEBPACK_IMPORTED_MODULE_34__.setCursor)(this.canvas, \"wait\");\n if (mimeType === _constants__WEBPACK_IMPORTED_MODULE_12__.MIME_TYPES.svg) {\n try {\n imageFile = (0,_data_blob__WEBPACK_IMPORTED_MODULE_39__.SVGStringToFile)(yield (0,_element_image__WEBPACK_IMPORTED_MODULE_40__.normalizeSVG)(yield imageFile.text()), imageFile.name);\n }\n catch (error) {\n console.warn(error);\n throw new Error((0,_i18n__WEBPACK_IMPORTED_MODULE_25__.t)(\"errors.svgImageInsertError\"));\n }\n }\n // generate image id (by default the file digest) before any\n // resizing/compression takes place to keep it more portable\n const fileId = yield (((_f = (_e = this.props).generateIdForFile) === null || _f === void 0 ? void 0 : _f.call(_e, imageFile)) || (0,_data_blob__WEBPACK_IMPORTED_MODULE_39__.generateIdFromFile)(imageFile));\n if (!fileId) {\n console.warn(\"Couldn't generate file id or the supplied `generateIdForFile` didn't resolve to one.\");\n throw new Error((0,_i18n__WEBPACK_IMPORTED_MODULE_25__.t)(\"errors.imageInsertError\"));\n }\n const existingFileData = this.files[fileId];\n if (!(existingFileData === null || existingFileData === void 0 ? void 0 : existingFileData.dataURL)) {\n try {\n imageFile = yield (0,_data_blob__WEBPACK_IMPORTED_MODULE_39__.resizeImageFile)(imageFile, {\n maxWidthOrHeight: _constants__WEBPACK_IMPORTED_MODULE_12__.DEFAULT_MAX_IMAGE_WIDTH_OR_HEIGHT,\n });\n }\n catch (error) {\n console.error(\"error trying to resing image file on insertion\", error);\n }\n if (imageFile.size > _constants__WEBPACK_IMPORTED_MODULE_12__.MAX_ALLOWED_FILE_BYTES) {\n throw new Error((0,_i18n__WEBPACK_IMPORTED_MODULE_25__.t)(\"errors.fileTooBig\", {\n maxSize: `${Math.trunc(_constants__WEBPACK_IMPORTED_MODULE_12__.MAX_ALLOWED_FILE_BYTES / 1024 / 1024)}MB`,\n }));\n }\n }\n if (showCursorImagePreview) {\n const dataURL = (_g = this.files[fileId]) === null || _g === void 0 ? void 0 : _g.dataURL;\n // optimization so that we don't unnecessarily resize the original\n // full-size file for cursor preview\n // (it's much faster to convert the resized dataURL to File)\n const resizedFile = dataURL && (0,_data_blob__WEBPACK_IMPORTED_MODULE_39__.dataURLToFile)(dataURL);\n this.setImagePreviewCursor(resizedFile || imageFile);\n }\n const dataURL = ((_h = this.files[fileId]) === null || _h === void 0 ? void 0 : _h.dataURL) || (yield (0,_data_blob__WEBPACK_IMPORTED_MODULE_39__.getDataURL)(imageFile));\n const imageElement = (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_19__.mutateElement)(_imageElement, {\n fileId,\n }, false);\n return new Promise((resolve, reject) => __awaiter(this, void 0, void 0, function* () {\n var _j;\n try {\n this.files = Object.assign(Object.assign({}, this.files), { [fileId]: {\n mimeType,\n id: fileId,\n dataURL,\n created: Date.now(),\n } });\n const cachedImageData = this.imageCache.get(fileId);\n if (!cachedImageData) {\n this.addNewImagesToImageCache();\n yield this.updateImageCache([imageElement]);\n }\n if ((cachedImageData === null || cachedImageData === void 0 ? void 0 : cachedImageData.image) instanceof Promise) {\n yield cachedImageData.image;\n }\n if (this.state.pendingImageElementId !== imageElement.id &&\n ((_j = this.state.draggingElement) === null || _j === void 0 ? void 0 : _j.id) !== imageElement.id) {\n this.initializeImageDimensions(imageElement, true);\n }\n resolve(imageElement);\n }\n catch (error) {\n console.error(error);\n reject(new Error((0,_i18n__WEBPACK_IMPORTED_MODULE_25__.t)(\"errors.imageInsertError\")));\n }\n finally {\n if (!showCursorImagePreview) {\n (0,_utils__WEBPACK_IMPORTED_MODULE_34__.resetCursor)(this.canvas);\n }\n }\n }));\n });\n /**\n * inserts image into elements array and rerenders\n */\n this.insertImageElement = (imageElement, imageFile, showCursorImagePreview) => __awaiter(this, void 0, void 0, function* () {\n this.scene.replaceAllElements([\n ...this.scene.getElementsIncludingDeleted(),\n imageElement,\n ]);\n try {\n yield this.initializeImage({\n imageFile,\n imageElement,\n showCursorImagePreview,\n });\n }\n catch (error) {\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_19__.mutateElement)(imageElement, {\n isDeleted: true,\n });\n this.actionManager.executeAction(_actions__WEBPACK_IMPORTED_MODULE_5__.actionFinalize);\n this.setState({\n errorMessage: error.message || (0,_i18n__WEBPACK_IMPORTED_MODULE_25__.t)(\"errors.imageInsertError\"),\n });\n }\n });\n this.setImagePreviewCursor = (imageFile) => __awaiter(this, void 0, void 0, function* () {\n // mustn't be larger than 128 px\n // https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Basic_User_Interface/Using_URL_values_for_the_cursor_property\n const cursorImageSizePx = 96;\n const imagePreview = yield (0,_data_blob__WEBPACK_IMPORTED_MODULE_39__.resizeImageFile)(imageFile, {\n maxWidthOrHeight: cursorImageSizePx,\n });\n let previewDataURL = yield (0,_data_blob__WEBPACK_IMPORTED_MODULE_39__.getDataURL)(imagePreview);\n // SVG cannot be resized via `resizeImageFile` so we resize by rendering to\n // a small canvas\n if (imageFile.type === _constants__WEBPACK_IMPORTED_MODULE_12__.MIME_TYPES.svg) {\n const img = yield (0,_element_image__WEBPACK_IMPORTED_MODULE_40__.loadHTMLImageElement)(previewDataURL);\n let height = Math.min(img.height, cursorImageSizePx);\n let width = height * (img.width / img.height);\n if (width > cursorImageSizePx) {\n width = cursorImageSizePx;\n height = width * (img.height / img.width);\n }\n const canvas = document.createElement(\"canvas\");\n canvas.height = height;\n canvas.width = width;\n const context = canvas.getContext(\"2d\");\n context.drawImage(img, 0, 0, width, height);\n previewDataURL = canvas.toDataURL(_constants__WEBPACK_IMPORTED_MODULE_12__.MIME_TYPES.svg);\n }\n if (this.state.pendingImageElementId) {\n (0,_utils__WEBPACK_IMPORTED_MODULE_34__.setCursor)(this.canvas, `url(${previewDataURL}) 4 4, auto`);\n }\n });\n this.onImageAction = ({ insertOnCanvasDirectly } = { insertOnCanvasDirectly: false }) => __awaiter(this, void 0, void 0, function* () {\n try {\n const clientX = this.state.width / 2 + this.state.offsetLeft;\n const clientY = this.state.height / 2 + this.state.offsetTop;\n const { x, y } = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.viewportCoordsToSceneCoords)({ clientX, clientY }, this.state);\n const imageFile = yield (0,_data_filesystem__WEBPACK_IMPORTED_MODULE_42__.fileOpen)({\n description: \"Image\",\n extensions: [\"jpg\", \"png\", \"svg\", \"gif\"],\n });\n const imageElement = this.createImageElement({\n sceneX: x,\n sceneY: y,\n });\n if (insertOnCanvasDirectly) {\n this.insertImageElement(imageElement, imageFile);\n this.initializeImageDimensions(imageElement);\n this.setState({\n selectedElementIds: { [imageElement.id]: true },\n }, () => {\n this.actionManager.executeAction(_actions__WEBPACK_IMPORTED_MODULE_5__.actionFinalize);\n });\n }\n else {\n this.setState({\n pendingImageElementId: imageElement.id,\n }, () => {\n this.insertImageElement(imageElement, imageFile, \n /* showCursorImagePreview */ true);\n });\n }\n }\n catch (error) {\n if (error.name !== \"AbortError\") {\n console.error(error);\n }\n else {\n console.warn(error);\n }\n this.setState({\n pendingImageElementId: null,\n editingElement: null,\n activeTool: (0,_utils__WEBPACK_IMPORTED_MODULE_34__.updateActiveTool)(this.state, { type: \"selection\" }),\n }, () => {\n this.actionManager.executeAction(_actions__WEBPACK_IMPORTED_MODULE_5__.actionFinalize);\n });\n }\n });\n this.initializeImageDimensions = (imageElement, forceNaturalSize = false) => {\n var _a;\n const image = (0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_21__.isInitializedImageElement)(imageElement) &&\n ((_a = this.imageCache.get(imageElement.fileId)) === null || _a === void 0 ? void 0 : _a.image);\n if (!image || image instanceof Promise) {\n if (imageElement.width < _constants__WEBPACK_IMPORTED_MODULE_12__.DRAGGING_THRESHOLD / this.state.zoom.value &&\n imageElement.height < _constants__WEBPACK_IMPORTED_MODULE_12__.DRAGGING_THRESHOLD / this.state.zoom.value) {\n const placeholderSize = 100 / this.state.zoom.value;\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_19__.mutateElement)(imageElement, {\n x: imageElement.x - placeholderSize / 2,\n y: imageElement.y - placeholderSize / 2,\n width: placeholderSize,\n height: placeholderSize,\n });\n }\n return;\n }\n if (forceNaturalSize ||\n // if user-created bounding box is below threshold, assume the\n // intention was to click instead of drag, and use the image's\n // intrinsic size\n (imageElement.width < _constants__WEBPACK_IMPORTED_MODULE_12__.DRAGGING_THRESHOLD / this.state.zoom.value &&\n imageElement.height < _constants__WEBPACK_IMPORTED_MODULE_12__.DRAGGING_THRESHOLD / this.state.zoom.value)) {\n const minHeight = Math.max(this.state.height - 120, 160);\n // max 65% of canvas height, clamped to <300px, vh - 120px>\n const maxHeight = Math.min(minHeight, Math.floor(this.state.height * 0.5) / this.state.zoom.value);\n const height = Math.min(image.naturalHeight, maxHeight);\n const width = height * (image.naturalWidth / image.naturalHeight);\n // add current imageElement width/height to account for previous centering\n // of the placeholder image\n const x = imageElement.x + imageElement.width / 2 - width / 2;\n const y = imageElement.y + imageElement.height / 2 - height / 2;\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_19__.mutateElement)(imageElement, { x, y, width, height });\n }\n };\n /** updates image cache, refreshing updated elements and/or setting status\n to error for images that fail during <img> element creation */\n this.updateImageCache = (elements, files = this.files) => __awaiter(this, void 0, void 0, function* () {\n const { updatedFiles, erroredFiles } = yield (0,_element_image__WEBPACK_IMPORTED_MODULE_40__.updateImageCache)({\n imageCache: this.imageCache,\n fileIds: elements.map((element) => element.fileId),\n files,\n });\n if (updatedFiles.size || erroredFiles.size) {\n for (const element of elements) {\n if (updatedFiles.has(element.fileId)) {\n (0,_renderer_renderElement__WEBPACK_IMPORTED_MODULE_29__.invalidateShapeForElement)(element);\n }\n }\n }\n if (erroredFiles.size) {\n this.scene.replaceAllElements(this.scene.getElementsIncludingDeleted().map((element) => {\n if ((0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_21__.isInitializedImageElement)(element) &&\n erroredFiles.has(element.fileId)) {\n return (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_19__.newElementWith)(element, {\n status: \"error\",\n });\n }\n return element;\n }));\n }\n return { updatedFiles, erroredFiles };\n });\n /** adds new images to imageCache and re-renders if needed */\n this.addNewImagesToImageCache = (imageElements = (0,_element_image__WEBPACK_IMPORTED_MODULE_40__.getInitializedImageElements)(this.scene.getNonDeletedElements()), files = this.files) => __awaiter(this, void 0, void 0, function* () {\n const uncachedImageElements = imageElements.filter((element) => !element.isDeleted && !this.imageCache.has(element.fileId));\n if (uncachedImageElements.length) {\n const { updatedFiles } = yield this.updateImageCache(uncachedImageElements, files);\n if (updatedFiles.size) {\n this.scene.informMutation();\n }\n }\n });\n /** generally you should use `addNewImagesToImageCache()` directly if you need\n * to render new images. This is just a failsafe */\n this.scheduleImageRefresh = lodash_throttle__WEBPACK_IMPORTED_MODULE_41___default()(() => {\n this.addNewImagesToImageCache();\n }, _constants__WEBPACK_IMPORTED_MODULE_12__.IMAGE_RENDER_TIMEOUT);\n this.updateBindingEnabledOnPointerMove = (event) => {\n const shouldEnableBinding = (0,_element_binding__WEBPACK_IMPORTED_MODULE_17__.shouldEnableBindingForPointerEvent)(event);\n if (this.state.isBindingEnabled !== shouldEnableBinding) {\n this.setState({ isBindingEnabled: shouldEnableBinding });\n }\n };\n this.maybeSuggestBindingAtCursor = (pointerCoords) => {\n const hoveredBindableElement = (0,_element_binding__WEBPACK_IMPORTED_MODULE_17__.getHoveredElementForBinding)(pointerCoords, this.scene);\n this.setState({\n suggestedBindings: hoveredBindableElement != null ? [hoveredBindableElement] : [],\n });\n };\n this.maybeSuggestBindingsForLinearElementAtCoords = (linearElement, \n /** scene coords */\n pointerCoords, \n // During line creation the start binding hasn't been written yet\n // into `linearElement`\n oppositeBindingBoundElement) => {\n if (!pointerCoords.length) {\n return;\n }\n const suggestedBindings = pointerCoords.reduce((acc, coords) => {\n const hoveredBindableElement = (0,_element_binding__WEBPACK_IMPORTED_MODULE_17__.getHoveredElementForBinding)(coords, this.scene);\n if (hoveredBindableElement != null &&\n !(0,_element_binding__WEBPACK_IMPORTED_MODULE_17__.isLinearElementSimpleAndAlreadyBound)(linearElement, oppositeBindingBoundElement === null || oppositeBindingBoundElement === void 0 ? void 0 : oppositeBindingBoundElement.id, hoveredBindableElement)) {\n acc.push(hoveredBindableElement);\n }\n return acc;\n }, []);\n this.setState({ suggestedBindings });\n };\n this.handleCanvasRef = (canvas) => {\n var _a, _b, _c;\n // canvas is null when unmounting\n if (canvas !== null) {\n this.canvas = canvas;\n this.rc = roughjs_bin_rough__WEBPACK_IMPORTED_MODULE_3__[\"default\"].canvas(this.canvas);\n this.canvas.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.WHEEL, this.handleWheel, {\n passive: false,\n });\n this.canvas.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.TOUCH_START, this.onTapStart);\n this.canvas.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.TOUCH_END, this.onTapEnd);\n }\n else {\n (_a = this.canvas) === null || _a === void 0 ? void 0 : _a.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.WHEEL, this.handleWheel);\n (_b = this.canvas) === null || _b === void 0 ? void 0 : _b.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.TOUCH_START, this.onTapStart);\n (_c = this.canvas) === null || _c === void 0 ? void 0 : _c.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.TOUCH_END, this.onTapEnd);\n }\n };\n this.handleAppOnDrop = (event) => __awaiter(this, void 0, void 0, function* () {\n // must be retrieved first, in the same frame\n const { file, fileHandle } = yield (0,_data_blob__WEBPACK_IMPORTED_MODULE_39__.getFileFromEvent)(event);\n try {\n if ((0,_data_blob__WEBPACK_IMPORTED_MODULE_39__.isSupportedImageFile)(file)) {\n // first attempt to decode scene from the image if it's embedded\n // ---------------------------------------------------------------------\n if ((file === null || file === void 0 ? void 0 : file.type) === _constants__WEBPACK_IMPORTED_MODULE_12__.MIME_TYPES.png || (file === null || file === void 0 ? void 0 : file.type) === _constants__WEBPACK_IMPORTED_MODULE_12__.MIME_TYPES.svg) {\n try {\n const scene = yield (0,_data__WEBPACK_IMPORTED_MODULE_13__.loadFromBlob)(file, this.state, this.scene.getElementsIncludingDeleted(), fileHandle);\n this.syncActionResult(Object.assign(Object.assign({}, scene), { appState: Object.assign(Object.assign({}, (scene.appState || this.state)), { isLoading: false }), replaceFiles: true, commitToHistory: true }));\n return;\n }\n catch (error) {\n if (error.name !== \"EncodingError\") {\n throw error;\n }\n }\n }\n // if no scene is embedded or we fail for whatever reason, fall back\n // to importing as regular image\n // ---------------------------------------------------------------------\n const { x: sceneX, y: sceneY } = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.viewportCoordsToSceneCoords)(event, this.state);\n const imageElement = this.createImageElement({ sceneX, sceneY });\n this.insertImageElement(imageElement, file);\n this.initializeImageDimensions(imageElement);\n this.setState({ selectedElementIds: { [imageElement.id]: true } });\n return;\n }\n }\n catch (error) {\n return this.setState({\n isLoading: false,\n errorMessage: error.message,\n });\n }\n const libraryJSON = event.dataTransfer.getData(_constants__WEBPACK_IMPORTED_MODULE_12__.MIME_TYPES.excalidrawlib);\n if (libraryJSON && typeof libraryJSON === \"string\") {\n try {\n const libraryItems = (0,_data_blob__WEBPACK_IMPORTED_MODULE_39__.parseLibraryJSON)(libraryJSON);\n this.addElementsFromPasteOrLibrary({\n elements: (0,_data_library__WEBPACK_IMPORTED_MODULE_14__.distributeLibraryItemsOnSquareGrid)(libraryItems),\n position: event,\n files: null,\n });\n }\n catch (error) {\n this.setState({ errorMessage: error.message });\n }\n return;\n }\n if (file) {\n // atetmpt to parse an excalidraw/excalidrawlib file\n yield this.loadFileToCanvas(file, fileHandle);\n }\n });\n this.loadFileToCanvas = (file, fileHandle) => __awaiter(this, void 0, void 0, function* () {\n file = yield (0,_data_blob__WEBPACK_IMPORTED_MODULE_39__.normalizeFile)(file);\n try {\n const ret = yield (0,_data_blob__WEBPACK_IMPORTED_MODULE_39__.loadSceneOrLibraryFromBlob)(file, this.state, this.scene.getElementsIncludingDeleted(), fileHandle);\n if (ret.type === _constants__WEBPACK_IMPORTED_MODULE_12__.MIME_TYPES.excalidraw) {\n this.setState({ isLoading: true });\n this.syncActionResult(Object.assign(Object.assign({}, ret.data), { appState: Object.assign(Object.assign({}, (ret.data.appState || this.state)), { isLoading: false }), replaceFiles: true, commitToHistory: true }));\n }\n else if (ret.type === _constants__WEBPACK_IMPORTED_MODULE_12__.MIME_TYPES.excalidrawlib) {\n yield this.library\n .updateLibrary({\n libraryItems: file,\n merge: true,\n openLibraryMenu: true,\n })\n .catch((error) => {\n console.error(error);\n this.setState({ errorMessage: (0,_i18n__WEBPACK_IMPORTED_MODULE_25__.t)(\"errors.importLibraryError\") });\n });\n }\n }\n catch (error) {\n this.setState({ isLoading: false, errorMessage: error.message });\n }\n });\n this.handleCanvasContextMenu = (event) => {\n event.preventDefault();\n if ((event.nativeEvent.pointerType === \"touch\" ||\n (event.nativeEvent.pointerType === \"pen\" &&\n // always allow if user uses a pen secondary button\n event.button !== _constants__WEBPACK_IMPORTED_MODULE_12__.POINTER_BUTTON.SECONDARY)) &&\n this.state.activeTool.type !== \"selection\") {\n return;\n }\n const { x, y } = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.viewportCoordsToSceneCoords)(event, this.state);\n const element = this.getElementAtPosition(x, y, {\n preferSelected: true,\n includeLockedElements: true,\n });\n const type = element ? \"element\" : \"canvas\";\n const container = this.excalidrawContainerRef.current;\n const { top: offsetTop, left: offsetLeft } = container.getBoundingClientRect();\n const left = event.clientX - offsetLeft;\n const top = event.clientY - offsetTop;\n if (element && !this.state.selectedElementIds[element.id]) {\n this.setState((0,_groups__WEBPACK_IMPORTED_MODULE_23__.selectGroupsForSelectedElements)(Object.assign(Object.assign({}, this.state), { selectedElementIds: { [element.id]: true } }), this.scene.getNonDeletedElements()), () => {\n this._openContextMenu({ top, left }, type);\n });\n }\n else {\n this._openContextMenu({ top, left }, type);\n }\n };\n this.maybeDragNewGenericElement = (pointerDownState, event) => {\n var _a;\n const draggingElement = this.state.draggingElement;\n const pointerCoords = pointerDownState.lastCoords;\n if (!draggingElement) {\n return;\n }\n if (draggingElement.type === \"selection\" &&\n this.state.activeTool.type !== \"eraser\") {\n (0,_element__WEBPACK_IMPORTED_MODULE_16__.dragNewElement)(draggingElement, this.state.activeTool.type, pointerDownState.origin.x, pointerDownState.origin.y, pointerCoords.x, pointerCoords.y, (0,_utils__WEBPACK_IMPORTED_MODULE_34__.distance)(pointerDownState.origin.x, pointerCoords.x), (0,_utils__WEBPACK_IMPORTED_MODULE_34__.distance)(pointerDownState.origin.y, pointerCoords.y), (0,_keys__WEBPACK_IMPORTED_MODULE_26__.shouldMaintainAspectRatio)(event), (0,_keys__WEBPACK_IMPORTED_MODULE_26__.shouldResizeFromCenter)(event));\n }\n else {\n const [gridX, gridY] = (0,_math__WEBPACK_IMPORTED_MODULE_27__.getGridPoint)(pointerCoords.x, pointerCoords.y, this.state.gridSize);\n const image = (0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_21__.isInitializedImageElement)(draggingElement) &&\n ((_a = this.imageCache.get(draggingElement.fileId)) === null || _a === void 0 ? void 0 : _a.image);\n const aspectRatio = image && !(image instanceof Promise)\n ? image.width / image.height\n : null;\n (0,_element__WEBPACK_IMPORTED_MODULE_16__.dragNewElement)(draggingElement, this.state.activeTool.type, pointerDownState.originInGrid.x, pointerDownState.originInGrid.y, gridX, gridY, (0,_utils__WEBPACK_IMPORTED_MODULE_34__.distance)(pointerDownState.originInGrid.x, gridX), (0,_utils__WEBPACK_IMPORTED_MODULE_34__.distance)(pointerDownState.originInGrid.y, gridY), (0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_21__.isImageElement)(draggingElement)\n ? !(0,_keys__WEBPACK_IMPORTED_MODULE_26__.shouldMaintainAspectRatio)(event)\n : (0,_keys__WEBPACK_IMPORTED_MODULE_26__.shouldMaintainAspectRatio)(event), (0,_keys__WEBPACK_IMPORTED_MODULE_26__.shouldResizeFromCenter)(event), aspectRatio);\n this.maybeSuggestBindingForAll([draggingElement]);\n }\n };\n this.maybeHandleResize = (pointerDownState, event) => {\n const selectedElements = (0,_scene__WEBPACK_IMPORTED_MODULE_30__.getSelectedElements)(this.scene.getNonDeletedElements(), this.state);\n const transformHandleType = pointerDownState.resize.handleType;\n this.setState({\n // TODO: rename this state field to \"isScaling\" to distinguish\n // it from the generic \"isResizing\" which includes scaling and\n // rotating\n isResizing: transformHandleType && transformHandleType !== \"rotation\",\n isRotating: transformHandleType === \"rotation\",\n });\n const pointerCoords = pointerDownState.lastCoords;\n const [resizeX, resizeY] = (0,_math__WEBPACK_IMPORTED_MODULE_27__.getGridPoint)(pointerCoords.x - pointerDownState.resize.offset.x, pointerCoords.y - pointerDownState.resize.offset.y, this.state.gridSize);\n if ((0,_element__WEBPACK_IMPORTED_MODULE_16__.transformElements)(pointerDownState, transformHandleType, selectedElements, pointerDownState.resize.arrowDirection, (0,_keys__WEBPACK_IMPORTED_MODULE_26__.shouldRotateWithDiscreteAngle)(event), (0,_keys__WEBPACK_IMPORTED_MODULE_26__.shouldResizeFromCenter)(event), selectedElements.length === 1 && (0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_21__.isImageElement)(selectedElements[0])\n ? !(0,_keys__WEBPACK_IMPORTED_MODULE_26__.shouldMaintainAspectRatio)(event)\n : (0,_keys__WEBPACK_IMPORTED_MODULE_26__.shouldMaintainAspectRatio)(event), resizeX, resizeY, pointerDownState.resize.center.x, pointerDownState.resize.center.y)) {\n this.maybeSuggestBindingForAll(selectedElements);\n return true;\n }\n return false;\n };\n /** @private use this.handleCanvasContextMenu */\n this._openContextMenu = ({ left, top, }, type) => {\n if (this.state.showHyperlinkPopup) {\n this.setState({ showHyperlinkPopup: false });\n }\n this.contextMenuOpen = true;\n const maybeGroupAction = _actions__WEBPACK_IMPORTED_MODULE_5__.actionGroup.contextItemPredicate(this.actionManager.getElementsIncludingDeleted(), this.actionManager.getAppState());\n const maybeUngroupAction = _actions__WEBPACK_IMPORTED_MODULE_5__.actionUngroup.contextItemPredicate(this.actionManager.getElementsIncludingDeleted(), this.actionManager.getAppState());\n const maybeFlipHorizontal = _actions__WEBPACK_IMPORTED_MODULE_5__.actionFlipHorizontal.contextItemPredicate(this.actionManager.getElementsIncludingDeleted(), this.actionManager.getAppState());\n const maybeFlipVertical = _actions__WEBPACK_IMPORTED_MODULE_5__.actionFlipVertical.contextItemPredicate(this.actionManager.getElementsIncludingDeleted(), this.actionManager.getAppState());\n const mayBeAllowUnbinding = _actions__WEBPACK_IMPORTED_MODULE_5__.actionUnbindText.contextItemPredicate(this.actionManager.getElementsIncludingDeleted(), this.actionManager.getAppState());\n const mayBeAllowBinding = _actions__WEBPACK_IMPORTED_MODULE_5__.actionBindText.contextItemPredicate(this.actionManager.getElementsIncludingDeleted(), this.actionManager.getAppState());\n const separator = \"separator\";\n const elements = this.scene.getNonDeletedElements();\n const selectedElements = (0,_scene__WEBPACK_IMPORTED_MODULE_30__.getSelectedElements)(this.scene.getNonDeletedElements(), this.state);\n const options = [];\n if (_clipboard__WEBPACK_IMPORTED_MODULE_11__.probablySupportsClipboardBlob && elements.length > 0) {\n options.push(_actions__WEBPACK_IMPORTED_MODULE_5__.actionCopyAsPng);\n }\n if (_clipboard__WEBPACK_IMPORTED_MODULE_11__.probablySupportsClipboardWriteText && elements.length > 0) {\n options.push(_actions__WEBPACK_IMPORTED_MODULE_5__.actionCopyAsSvg);\n }\n if (type === \"element\" &&\n _actions__WEBPACK_IMPORTED_MODULE_5__.copyText.contextItemPredicate(elements, this.state) &&\n _clipboard__WEBPACK_IMPORTED_MODULE_11__.probablySupportsClipboardWriteText) {\n options.push(_actions__WEBPACK_IMPORTED_MODULE_5__.copyText);\n }\n if (type === \"canvas\") {\n const viewModeOptions = [\n ...options,\n typeof this.props.gridModeEnabled === \"undefined\" &&\n _actions__WEBPACK_IMPORTED_MODULE_5__.actionToggleGridMode,\n typeof this.props.zenModeEnabled === \"undefined\" && _actions__WEBPACK_IMPORTED_MODULE_5__.actionToggleZenMode,\n typeof this.props.viewModeEnabled === \"undefined\" &&\n _actions_actionToggleViewMode__WEBPACK_IMPORTED_MODULE_38__.actionToggleViewMode,\n _actions__WEBPACK_IMPORTED_MODULE_5__.actionToggleStats,\n ];\n if (this.state.viewModeEnabled) {\n _ContextMenu__WEBPACK_IMPORTED_MODULE_35__[\"default\"].push({\n options: viewModeOptions,\n top,\n left,\n actionManager: this.actionManager,\n appState: this.state,\n container: this.excalidrawContainerRef.current,\n elements,\n });\n }\n else {\n _ContextMenu__WEBPACK_IMPORTED_MODULE_35__[\"default\"].push({\n options: [\n this.device.isMobile &&\n navigator.clipboard && {\n trackEvent: false,\n name: \"paste\",\n perform: (elements, appStates) => {\n this.pasteFromClipboard(null);\n return {\n commitToHistory: false,\n };\n },\n contextItemLabel: \"labels.paste\",\n },\n this.device.isMobile && navigator.clipboard && separator,\n _clipboard__WEBPACK_IMPORTED_MODULE_11__.probablySupportsClipboardBlob &&\n elements.length > 0 &&\n _actions__WEBPACK_IMPORTED_MODULE_5__.actionCopyAsPng,\n _clipboard__WEBPACK_IMPORTED_MODULE_11__.probablySupportsClipboardWriteText &&\n elements.length > 0 &&\n _actions__WEBPACK_IMPORTED_MODULE_5__.actionCopyAsSvg,\n _clipboard__WEBPACK_IMPORTED_MODULE_11__.probablySupportsClipboardWriteText &&\n selectedElements.length > 0 &&\n _actions__WEBPACK_IMPORTED_MODULE_5__.copyText,\n ((_clipboard__WEBPACK_IMPORTED_MODULE_11__.probablySupportsClipboardBlob && elements.length > 0) ||\n (_clipboard__WEBPACK_IMPORTED_MODULE_11__.probablySupportsClipboardWriteText && elements.length > 0)) &&\n separator,\n _actions__WEBPACK_IMPORTED_MODULE_5__.actionSelectAll,\n separator,\n typeof this.props.gridModeEnabled === \"undefined\" &&\n _actions__WEBPACK_IMPORTED_MODULE_5__.actionToggleGridMode,\n typeof this.props.zenModeEnabled === \"undefined\" &&\n _actions__WEBPACK_IMPORTED_MODULE_5__.actionToggleZenMode,\n typeof this.props.viewModeEnabled === \"undefined\" &&\n _actions_actionToggleViewMode__WEBPACK_IMPORTED_MODULE_38__.actionToggleViewMode,\n _actions__WEBPACK_IMPORTED_MODULE_5__.actionToggleStats,\n ],\n top,\n left,\n actionManager: this.actionManager,\n appState: this.state,\n container: this.excalidrawContainerRef.current,\n elements,\n });\n }\n }\n else if (type === \"element\") {\n if (this.state.viewModeEnabled) {\n _ContextMenu__WEBPACK_IMPORTED_MODULE_35__[\"default\"].push({\n options: [navigator.clipboard && _actions__WEBPACK_IMPORTED_MODULE_5__.actionCopy, ...options],\n top,\n left,\n actionManager: this.actionManager,\n appState: this.state,\n container: this.excalidrawContainerRef.current,\n elements,\n });\n }\n else {\n _ContextMenu__WEBPACK_IMPORTED_MODULE_35__[\"default\"].push({\n options: [\n this.device.isMobile && _actions__WEBPACK_IMPORTED_MODULE_5__.actionCut,\n this.device.isMobile && navigator.clipboard && _actions__WEBPACK_IMPORTED_MODULE_5__.actionCopy,\n this.device.isMobile &&\n navigator.clipboard && {\n name: \"paste\",\n trackEvent: false,\n perform: (elements, appStates) => {\n this.pasteFromClipboard(null);\n return {\n commitToHistory: false,\n };\n },\n contextItemLabel: \"labels.paste\",\n },\n this.device.isMobile && separator,\n ...options,\n separator,\n _actions__WEBPACK_IMPORTED_MODULE_5__.actionCopyStyles,\n _actions__WEBPACK_IMPORTED_MODULE_5__.actionPasteStyles,\n separator,\n maybeGroupAction && _actions__WEBPACK_IMPORTED_MODULE_5__.actionGroup,\n mayBeAllowUnbinding && _actions__WEBPACK_IMPORTED_MODULE_5__.actionUnbindText,\n mayBeAllowBinding && _actions__WEBPACK_IMPORTED_MODULE_5__.actionBindText,\n maybeUngroupAction && _actions__WEBPACK_IMPORTED_MODULE_5__.actionUngroup,\n (maybeGroupAction || maybeUngroupAction) && separator,\n _actions__WEBPACK_IMPORTED_MODULE_5__.actionAddToLibrary,\n separator,\n _actions__WEBPACK_IMPORTED_MODULE_5__.actionSendBackward,\n _actions__WEBPACK_IMPORTED_MODULE_5__.actionBringForward,\n _actions__WEBPACK_IMPORTED_MODULE_5__.actionSendToBack,\n _actions__WEBPACK_IMPORTED_MODULE_5__.actionBringToFront,\n separator,\n maybeFlipHorizontal && _actions__WEBPACK_IMPORTED_MODULE_5__.actionFlipHorizontal,\n maybeFlipVertical && _actions__WEBPACK_IMPORTED_MODULE_5__.actionFlipVertical,\n (maybeFlipHorizontal || maybeFlipVertical) && separator,\n _actions__WEBPACK_IMPORTED_MODULE_5__.actionLink.contextItemPredicate(elements, this.state) && _actions__WEBPACK_IMPORTED_MODULE_5__.actionLink,\n _actions__WEBPACK_IMPORTED_MODULE_5__.actionDuplicateSelection,\n _actions__WEBPACK_IMPORTED_MODULE_5__.actionToggleLock,\n separator,\n _actions__WEBPACK_IMPORTED_MODULE_5__.actionDeleteSelected,\n ],\n top,\n left,\n actionManager: this.actionManager,\n appState: this.state,\n container: this.excalidrawContainerRef.current,\n elements,\n });\n }\n }\n };\n this.handleWheel = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.withBatchedUpdates)((event) => {\n event.preventDefault();\n if (isPanning) {\n return;\n }\n const { deltaX, deltaY } = event;\n // note that event.ctrlKey is necessary to handle pinch zooming\n if (event.metaKey || event.ctrlKey) {\n const sign = Math.sign(deltaY);\n const MAX_STEP = 10;\n const absDelta = Math.abs(deltaY);\n let delta = deltaY;\n if (absDelta > MAX_STEP) {\n delta = MAX_STEP * sign;\n }\n let newZoom = this.state.zoom.value - delta / 100;\n // increase zoom steps the more zoomed-in we are (applies to >100% only)\n newZoom +=\n Math.log10(Math.max(1, this.state.zoom.value)) *\n -sign *\n // reduced amplification for small deltas (small movements on a trackpad)\n Math.min(1, absDelta / 20);\n this.setState((state) => (Object.assign(Object.assign({}, (0,_scene_zoom__WEBPACK_IMPORTED_MODULE_32__.getStateForZoom)({\n viewportX: cursorX,\n viewportY: cursorY,\n nextZoom: (0,_scene__WEBPACK_IMPORTED_MODULE_30__.getNormalizedZoom)(newZoom),\n }, state)), { shouldCacheIgnoreZoom: true })));\n this.resetShouldCacheIgnoreZoomDebounced();\n return;\n }\n // scroll horizontally when shift pressed\n if (event.shiftKey) {\n this.setState(({ zoom, scrollX }) => ({\n // on Mac, shift+wheel tends to result in deltaX\n scrollX: scrollX - (deltaY || deltaX) / zoom.value,\n }));\n return;\n }\n this.setState(({ zoom, scrollX, scrollY }) => ({\n scrollX: scrollX - deltaX / zoom.value,\n scrollY: scrollY - deltaY / zoom.value,\n }));\n });\n this.savePointer = (x, y, button) => {\n var _a, _b;\n if (!x || !y) {\n return;\n }\n const pointer = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.viewportCoordsToSceneCoords)({ clientX: x, clientY: y }, this.state);\n if (isNaN(pointer.x) || isNaN(pointer.y)) {\n // sometimes the pointer goes off screen\n }\n (_b = (_a = this.props).onPointerUpdate) === null || _b === void 0 ? void 0 : _b.call(_a, {\n pointer,\n button,\n pointersMap: gesture.pointers,\n });\n };\n this.resetShouldCacheIgnoreZoomDebounced = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.debounce)(() => {\n if (!this.unmounted) {\n this.setState({ shouldCacheIgnoreZoom: false });\n }\n }, 300);\n this.updateDOMRect = (cb) => {\n var _a;\n if ((_a = this.excalidrawContainerRef) === null || _a === void 0 ? void 0 : _a.current) {\n const excalidrawContainer = this.excalidrawContainerRef.current;\n const { width, height, left: offsetLeft, top: offsetTop, } = excalidrawContainer.getBoundingClientRect();\n const { width: currentWidth, height: currentHeight, offsetTop: currentOffsetTop, offsetLeft: currentOffsetLeft, } = this.state;\n if (width === currentWidth &&\n height === currentHeight &&\n offsetLeft === currentOffsetLeft &&\n offsetTop === currentOffsetTop) {\n if (cb) {\n cb();\n }\n return;\n }\n this.setState({\n width,\n height,\n offsetLeft,\n offsetTop,\n }, () => {\n cb && cb();\n });\n }\n };\n this.refresh = () => {\n this.setState(Object.assign({}, this.getCanvasOffsets()));\n };\n const defaultAppState = (0,_appState__WEBPACK_IMPORTED_MODULE_10__.getDefaultAppState)();\n const { excalidrawRef, viewModeEnabled = false, zenModeEnabled = false, gridModeEnabled = false, theme = defaultAppState.theme, name = defaultAppState.name, } = props;\n this.state = Object.assign(Object.assign(Object.assign(Object.assign({}, defaultAppState), { theme, isLoading: true }), this.getCanvasOffsets()), { viewModeEnabled,\n zenModeEnabled, gridSize: gridModeEnabled ? _constants__WEBPACK_IMPORTED_MODULE_12__.GRID_SIZE : null, name, width: window.innerWidth, height: window.innerHeight, showHyperlinkPopup: false, isLibraryMenuDocked: false });\n this.id = (0,nanoid__WEBPACK_IMPORTED_MODULE_46__.nanoid)();\n this.library = new _data_library__WEBPACK_IMPORTED_MODULE_14__[\"default\"](this);\n if (excalidrawRef) {\n const readyPromise = (\"current\" in excalidrawRef && ((_a = excalidrawRef.current) === null || _a === void 0 ? void 0 : _a.readyPromise)) ||\n (0,_utils__WEBPACK_IMPORTED_MODULE_34__.resolvablePromise)();\n const api = {\n ready: true,\n readyPromise,\n updateScene: this.updateScene,\n updateLibrary: this.library.updateLibrary,\n addFiles: this.addFiles,\n resetScene: this.resetScene,\n getSceneElementsIncludingDeleted: this.getSceneElementsIncludingDeleted,\n history: {\n clear: this.resetHistory,\n },\n scrollToContent: this.scrollToContent,\n getSceneElements: this.getSceneElements,\n getAppState: () => this.state,\n getFiles: () => this.files,\n refresh: this.refresh,\n setToast: this.setToast,\n id: this.id,\n setActiveTool: this.setActiveTool,\n setCursor: this.setCursor,\n resetCursor: this.resetCursor,\n };\n if (typeof excalidrawRef === \"function\") {\n excalidrawRef(api);\n }\n else {\n excalidrawRef.current = api;\n }\n readyPromise.resolve(api);\n }\n this.excalidrawContainerValue = {\n container: this.excalidrawContainerRef.current,\n id: this.id,\n };\n this.scene = new _scene_Scene__WEBPACK_IMPORTED_MODULE_31__[\"default\"]();\n this.history = new _history__WEBPACK_IMPORTED_MODULE_24__[\"default\"]();\n this.actionManager = new _actions_manager__WEBPACK_IMPORTED_MODULE_7__.ActionManager(this.syncActionResult, () => this.state, () => this.scene.getElementsIncludingDeleted(), this);\n this.actionManager.registerAll(_actions_register__WEBPACK_IMPORTED_MODULE_8__.actions);\n this.actionManager.registerAction((0,_actions_actionHistory__WEBPACK_IMPORTED_MODULE_6__.createUndoAction)(this.history));\n this.actionManager.registerAction((0,_actions_actionHistory__WEBPACK_IMPORTED_MODULE_6__.createRedoAction)(this.history));\n }\n renderCanvas() {\n const canvasScale = window.devicePixelRatio;\n const { width: canvasDOMWidth, height: canvasDOMHeight, viewModeEnabled, } = this.state;\n const canvasWidth = canvasDOMWidth * canvasScale;\n const canvasHeight = canvasDOMHeight * canvasScale;\n if (viewModeEnabled) {\n return ((0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(\"canvas\", Object.assign({ className: \"excalidraw__canvas\", style: {\n width: canvasDOMWidth,\n height: canvasDOMHeight,\n cursor: _constants__WEBPACK_IMPORTED_MODULE_12__.CURSOR_TYPE.GRAB,\n }, width: canvasWidth, height: canvasHeight, ref: this.handleCanvasRef, onContextMenu: this.handleCanvasContextMenu, onPointerMove: this.handleCanvasPointerMove, onPointerUp: this.handleCanvasPointerUp, onPointerCancel: this.removePointer, onTouchMove: this.handleTouchMove, onPointerDown: this.handleCanvasPointerDown }, { children: (0,_i18n__WEBPACK_IMPORTED_MODULE_25__.t)(\"labels.drawingCanvas\") })));\n }\n return ((0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(\"canvas\", Object.assign({ className: \"excalidraw__canvas\", style: {\n width: canvasDOMWidth,\n height: canvasDOMHeight,\n }, width: canvasWidth, height: canvasHeight, ref: this.handleCanvasRef, onContextMenu: this.handleCanvasContextMenu, onPointerDown: this.handleCanvasPointerDown, onDoubleClick: this.handleCanvasDoubleClick, onPointerMove: this.handleCanvasPointerMove, onPointerUp: this.handleCanvasPointerUp, onPointerCancel: this.removePointer, onTouchMove: this.handleTouchMove }, { children: (0,_i18n__WEBPACK_IMPORTED_MODULE_25__.t)(\"labels.drawingCanvas\") })));\n }\n render() {\n var _a, _b;\n const selectedElement = (0,_scene__WEBPACK_IMPORTED_MODULE_30__.getSelectedElements)(this.scene.getNonDeletedElements(), this.state);\n const { onCollabButtonClick, renderTopRightUI, renderFooter, renderCustomStats, } = this.props;\n return ((0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(\"div\", Object.assign({ className: (0,clsx__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(\"excalidraw excalidraw-container\", {\n \"excalidraw--view-mode\": this.state.viewModeEnabled,\n \"excalidraw--mobile\": this.device.isMobile,\n }), ref: this.excalidrawContainerRef, onDrop: this.handleAppOnDrop, tabIndex: 0, onKeyDown: this.props.handleKeyboardGlobally ? undefined : this.onKeyDown }, { children: (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(ExcalidrawContainerContext.Provider, Object.assign({ value: this.excalidrawContainerValue }, { children: (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)(DeviceContext.Provider, Object.assign({ value: this.device }, { children: [(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_LayerUI__WEBPACK_IMPORTED_MODULE_36__[\"default\"], { canvas: this.canvas, appState: this.state, files: this.files, setAppState: this.setAppState, actionManager: this.actionManager, elements: this.scene.getNonDeletedElements(), onCollabButtonClick: onCollabButtonClick, onLockToggle: this.toggleLock, onPenModeToggle: this.togglePenMode, onInsertElements: (elements) => this.addElementsFromPasteOrLibrary({\n elements,\n position: \"center\",\n files: null,\n }), langCode: (0,_i18n__WEBPACK_IMPORTED_MODULE_25__.getLanguage)().code, isCollaborating: this.props.isCollaborating, renderTopRightUI: renderTopRightUI, renderCustomFooter: renderFooter, renderCustomStats: renderCustomStats, showExitZenModeBtn: typeof ((_a = this.props) === null || _a === void 0 ? void 0 : _a.zenModeEnabled) === \"undefined\" &&\n this.state.zenModeEnabled, showThemeBtn: typeof ((_b = this.props) === null || _b === void 0 ? void 0 : _b.theme) === \"undefined\" &&\n this.props.UIOptions.canvasActions.theme, libraryReturnUrl: this.props.libraryReturnUrl, UIOptions: this.props.UIOptions, focusContainer: this.focusContainer, library: this.library, id: this.id, onImageAction: this.onImageAction }), (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(\"div\", { className: \"excalidraw-textEditorContainer\" }), (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(\"div\", { className: \"excalidraw-contextMenuContainer\" }), selectedElement.length === 1 && this.state.showHyperlinkPopup && ((0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_element_Hyperlink__WEBPACK_IMPORTED_MODULE_45__.Hyperlink, { element: selectedElement[0], appState: this.state, setAppState: this.setAppState, onLinkOpen: this.props.onLinkOpen }, selectedElement[0].id)), this.state.toast !== null && ((0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_Toast__WEBPACK_IMPORTED_MODULE_37__.Toast, { message: this.state.toast.message, onClose: () => this.setToast(null), duration: this.state.toast.duration, closable: this.state.toast.closable })), (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(\"main\", { children: this.renderCanvas() })] })) })) })));\n }\n componentDidMount() {\n var _a, _b;\n return __awaiter(this, void 0, void 0, function* () {\n this.unmounted = false;\n this.excalidrawContainerValue.container =\n this.excalidrawContainerRef.current;\n if (\"development\" === _constants__WEBPACK_IMPORTED_MODULE_12__.ENV.TEST ||\n \"development\" === _constants__WEBPACK_IMPORTED_MODULE_12__.ENV.DEVELOPMENT) {\n const setState = this.setState.bind(this);\n Object.defineProperties(window.h, {\n state: {\n configurable: true,\n get: () => {\n return this.state;\n },\n },\n setState: {\n configurable: true,\n value: (...args) => {\n return this.setState(...args);\n },\n },\n app: {\n configurable: true,\n value: this,\n },\n history: {\n configurable: true,\n value: this.history,\n },\n });\n }\n this.scene.addCallback(this.onSceneUpdated);\n this.addEventListeners();\n if (this.excalidrawContainerRef.current) {\n this.focusContainer();\n }\n if (this.excalidrawContainerRef.current &&\n // bounding rects don't work in tests so updating\n // the state on init would result in making the test enviro run\n // in mobile breakpoint (0 width/height), making everything fail\n \"development\" !== \"test\") {\n this.refreshDeviceState(this.excalidrawContainerRef.current);\n }\n if (\"ResizeObserver\" in window && ((_a = this.excalidrawContainerRef) === null || _a === void 0 ? void 0 : _a.current)) {\n this.resizeObserver = new ResizeObserver(() => {\n THROTTLE_NEXT_RENDER = false;\n // recompute device dimensions state\n // ---------------------------------------------------------------------\n this.refreshDeviceState(this.excalidrawContainerRef.current);\n // refresh offsets\n // ---------------------------------------------------------------------\n this.updateDOMRect();\n });\n (_b = this.resizeObserver) === null || _b === void 0 ? void 0 : _b.observe(this.excalidrawContainerRef.current);\n }\n else if (window.matchMedia) {\n const mdScreenQuery = window.matchMedia(`(max-width: ${_constants__WEBPACK_IMPORTED_MODULE_12__.MQ_MAX_WIDTH_PORTRAIT}px), (max-height: ${_constants__WEBPACK_IMPORTED_MODULE_12__.MQ_MAX_HEIGHT_LANDSCAPE}px) and (max-width: ${_constants__WEBPACK_IMPORTED_MODULE_12__.MQ_MAX_WIDTH_LANDSCAPE}px)`);\n const smScreenQuery = window.matchMedia(`(max-width: ${_constants__WEBPACK_IMPORTED_MODULE_12__.MQ_SM_MAX_WIDTH}px)`);\n const canDeviceFitSidebarMediaQuery = window.matchMedia(`(min-width: ${\n // NOTE this won't update if a different breakpoint is supplied\n // after mount\n this.props.UIOptions.dockedSidebarBreakpoint != null\n ? this.props.UIOptions.dockedSidebarBreakpoint\n : _constants__WEBPACK_IMPORTED_MODULE_12__.MQ_RIGHT_SIDEBAR_MIN_WIDTH}px)`);\n const handler = () => {\n this.excalidrawContainerRef.current.getBoundingClientRect();\n this.device = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.updateObject)(this.device, {\n isSmScreen: smScreenQuery.matches,\n isMobile: mdScreenQuery.matches,\n canDeviceFitSidebar: canDeviceFitSidebarMediaQuery.matches,\n });\n };\n mdScreenQuery.addListener(handler);\n this.detachIsMobileMqHandler = () => mdScreenQuery.removeListener(handler);\n }\n const searchParams = new URLSearchParams(window.location.search.slice(1));\n if (searchParams.has(\"web-share-target\")) {\n // Obtain a file that was shared via the Web Share Target API.\n this.restoreFileFromShare();\n }\n else {\n this.updateDOMRect(this.initializeScene);\n }\n });\n }\n componentWillUnmount() {\n var _a;\n this.files = {};\n this.imageCache.clear();\n (_a = this.resizeObserver) === null || _a === void 0 ? void 0 : _a.disconnect();\n this.unmounted = true;\n this.removeEventListeners();\n this.scene.destroy();\n clearTimeout(touchTimeout);\n touchTimeout = 0;\n }\n removeEventListeners() {\n var _a, _b, _c, _d, _e;\n document.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.POINTER_UP, this.removePointer);\n document.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.COPY, this.onCopy);\n document.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.PASTE, this.pasteFromClipboard);\n document.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.CUT, this.onCut);\n (_a = this.excalidrawContainerRef.current) === null || _a === void 0 ? void 0 : _a.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.WHEEL, this.onWheel);\n (_b = this.nearestScrollableContainer) === null || _b === void 0 ? void 0 : _b.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.SCROLL, this.onScroll);\n document.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.KEYDOWN, this.onKeyDown, false);\n document.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.MOUSE_MOVE, this.updateCurrentCursorPosition, false);\n document.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.KEYUP, this.onKeyUp);\n window.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.RESIZE, this.onResize, false);\n window.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.UNLOAD, this.onUnload, false);\n window.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.BLUR, this.onBlur, false);\n (_c = this.excalidrawContainerRef.current) === null || _c === void 0 ? void 0 : _c.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.DRAG_OVER, this.disableEvent, false);\n (_d = this.excalidrawContainerRef.current) === null || _d === void 0 ? void 0 : _d.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.DROP, this.disableEvent, false);\n document.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.GESTURE_START, this.onGestureStart, false);\n document.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.GESTURE_CHANGE, this.onGestureChange, false);\n document.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.GESTURE_END, this.onGestureEnd, false);\n (_e = this.detachIsMobileMqHandler) === null || _e === void 0 ? void 0 : _e.call(this);\n }\n addEventListeners() {\n var _a, _b, _c, _d, _e;\n this.removeEventListeners();\n document.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.POINTER_UP, this.removePointer); // #3553\n document.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.COPY, this.onCopy);\n (_a = this.excalidrawContainerRef.current) === null || _a === void 0 ? void 0 : _a.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.WHEEL, this.onWheel, { passive: false });\n if (this.props.handleKeyboardGlobally) {\n document.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.KEYDOWN, this.onKeyDown, false);\n }\n document.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.KEYUP, this.onKeyUp, { passive: true });\n document.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.MOUSE_MOVE, this.updateCurrentCursorPosition);\n // rerender text elements on font load to fix #637 && #1553\n (_c = (_b = document.fonts) === null || _b === void 0 ? void 0 : _b.addEventListener) === null || _c === void 0 ? void 0 : _c.call(_b, \"loadingdone\", this.onFontLoaded);\n // Safari-only desktop pinch zoom\n document.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.GESTURE_START, this.onGestureStart, false);\n document.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.GESTURE_CHANGE, this.onGestureChange, false);\n document.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.GESTURE_END, this.onGestureEnd, false);\n if (this.state.viewModeEnabled) {\n return;\n }\n document.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.PASTE, this.pasteFromClipboard);\n document.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.CUT, this.onCut);\n if (this.props.detectScroll) {\n this.nearestScrollableContainer = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.getNearestScrollableContainer)(this.excalidrawContainerRef.current);\n this.nearestScrollableContainer.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.SCROLL, this.onScroll);\n }\n window.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.RESIZE, this.onResize, false);\n window.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.UNLOAD, this.onUnload, false);\n window.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.BLUR, this.onBlur, false);\n (_d = this.excalidrawContainerRef.current) === null || _d === void 0 ? void 0 : _d.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.DRAG_OVER, this.disableEvent, false);\n (_e = this.excalidrawContainerRef.current) === null || _e === void 0 ? void 0 : _e.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.DROP, this.disableEvent, false);\n }\n componentDidUpdate(prevProps, prevState) {\n var _a, _b, _c, _d, _e;\n if (this.excalidrawContainerRef.current &&\n prevProps.UIOptions.dockedSidebarBreakpoint !==\n this.props.UIOptions.dockedSidebarBreakpoint) {\n this.refreshDeviceState(this.excalidrawContainerRef.current);\n }\n if (prevState.scrollX !== this.state.scrollX ||\n prevState.scrollY !== this.state.scrollY) {\n (_b = (_a = this.props) === null || _a === void 0 ? void 0 : _a.onScrollChange) === null || _b === void 0 ? void 0 : _b.call(_a, this.state.scrollX, this.state.scrollY);\n }\n if (Object.keys(this.state.selectedElementIds).length &&\n (0,_appState__WEBPACK_IMPORTED_MODULE_10__.isEraserActive)(this.state)) {\n this.setState({\n activeTool: (0,_utils__WEBPACK_IMPORTED_MODULE_34__.updateActiveTool)(this.state, { type: \"selection\" }),\n });\n }\n if (this.state.activeTool.type === \"eraser\" &&\n prevState.theme !== this.state.theme) {\n (0,_utils__WEBPACK_IMPORTED_MODULE_34__.setEraserCursor)(this.canvas, this.state.theme);\n }\n // Hide hyperlink popup if shown when element type is not selection\n if (prevState.activeTool.type === \"selection\" &&\n this.state.activeTool.type !== \"selection\" &&\n this.state.showHyperlinkPopup) {\n this.setState({ showHyperlinkPopup: false });\n }\n if (prevProps.langCode !== this.props.langCode) {\n this.updateLanguage();\n }\n if (prevProps.viewModeEnabled !== this.props.viewModeEnabled) {\n this.setState({ viewModeEnabled: !!this.props.viewModeEnabled });\n }\n if (prevState.viewModeEnabled !== this.state.viewModeEnabled) {\n this.addEventListeners();\n this.deselectElements();\n }\n if (prevProps.zenModeEnabled !== this.props.zenModeEnabled) {\n this.setState({ zenModeEnabled: !!this.props.zenModeEnabled });\n }\n if (prevProps.theme !== this.props.theme && this.props.theme) {\n this.setState({ theme: this.props.theme });\n }\n if (prevProps.gridModeEnabled !== this.props.gridModeEnabled) {\n this.setState({\n gridSize: this.props.gridModeEnabled ? _constants__WEBPACK_IMPORTED_MODULE_12__.GRID_SIZE : null,\n });\n }\n if (this.props.name && prevProps.name !== this.props.name) {\n this.setState({\n name: this.props.name,\n });\n }\n (_c = this.excalidrawContainerRef.current) === null || _c === void 0 ? void 0 : _c.classList.toggle(\"theme--dark\", this.state.theme === \"dark\");\n if (this.state.editingLinearElement &&\n !this.state.selectedElementIds[this.state.editingLinearElement.elementId]) {\n // defer so that the commitToHistory flag isn't reset via current update\n setTimeout(() => {\n this.actionManager.executeAction(_actions__WEBPACK_IMPORTED_MODULE_5__.actionFinalize);\n });\n }\n const { multiElement } = prevState;\n if (prevState.activeTool !== this.state.activeTool &&\n multiElement != null &&\n (0,_element_binding__WEBPACK_IMPORTED_MODULE_17__.isBindingEnabled)(this.state) &&\n (0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_21__.isBindingElement)(multiElement, false)) {\n (0,_element_binding__WEBPACK_IMPORTED_MODULE_17__.maybeBindLinearElement)(multiElement, this.state, this.scene, (0,_utils__WEBPACK_IMPORTED_MODULE_34__.tupleToCoors)(_element_linearElementEditor__WEBPACK_IMPORTED_MODULE_18__.LinearElementEditor.getPointAtIndexGlobalCoordinates(multiElement, -1)));\n }\n const cursorButton = {};\n const pointerViewportCoords = {};\n const remoteSelectedElementIds = {};\n const pointerUsernames = {};\n const pointerUserStates = {};\n this.state.collaborators.forEach((user, socketId) => {\n if (user.selectedElementIds) {\n for (const id of Object.keys(user.selectedElementIds)) {\n if (!(id in remoteSelectedElementIds)) {\n remoteSelectedElementIds[id] = [];\n }\n remoteSelectedElementIds[id].push(socketId);\n }\n }\n if (!user.pointer) {\n return;\n }\n if (user.username) {\n pointerUsernames[socketId] = user.username;\n }\n if (user.userState) {\n pointerUserStates[socketId] = user.userState;\n }\n pointerViewportCoords[socketId] = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.sceneCoordsToViewportCoords)({\n sceneX: user.pointer.x,\n sceneY: user.pointer.y,\n }, this.state);\n cursorButton[socketId] = user.button;\n });\n const renderingElements = this.scene\n .getNonDeletedElements()\n .filter((element) => {\n if ((0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_21__.isImageElement)(element)) {\n if (\n // not placed on canvas yet (but in elements array)\n this.state.pendingImageElementId === element.id) {\n return false;\n }\n }\n // don't render text element that's being currently edited (it's\n // rendered on remote only)\n return (!this.state.editingElement ||\n this.state.editingElement.type !== \"text\" ||\n element.id !== this.state.editingElement.id);\n });\n (0,_renderer_renderScene__WEBPACK_IMPORTED_MODULE_28__.renderScene)(renderingElements, this.state, this.state.selectionElement, window.devicePixelRatio, this.rc, this.canvas, {\n scrollX: this.state.scrollX,\n scrollY: this.state.scrollY,\n viewBackgroundColor: this.state.viewBackgroundColor,\n zoom: this.state.zoom,\n remotePointerViewportCoords: pointerViewportCoords,\n remotePointerButton: cursorButton,\n remoteSelectedElementIds,\n remotePointerUsernames: pointerUsernames,\n remotePointerUserStates: pointerUserStates,\n shouldCacheIgnoreZoom: this.state.shouldCacheIgnoreZoom,\n theme: this.state.theme,\n imageCache: this.imageCache,\n isExporting: false,\n renderScrollbars: !this.device.isMobile,\n }, ({ atLeastOneVisibleElement, scrollBars }) => {\n if (scrollBars) {\n currentScrollBars = scrollBars;\n }\n const scrolledOutside = \n // hide when editing text\n (0,_element__WEBPACK_IMPORTED_MODULE_16__.isTextElement)(this.state.editingElement)\n ? false\n : !atLeastOneVisibleElement && renderingElements.length > 0;\n if (this.state.scrolledOutside !== scrolledOutside) {\n this.setState({ scrolledOutside });\n }\n this.scheduleImageRefresh();\n }, THROTTLE_NEXT_RENDER && window.EXCALIDRAW_THROTTLE_RENDER === true);\n if (!THROTTLE_NEXT_RENDER) {\n THROTTLE_NEXT_RENDER = true;\n }\n this.history.record(this.state, this.scene.getElementsIncludingDeleted());\n // Do not notify consumers if we're still loading the scene. Among other\n // potential issues, this fixes a case where the tab isn't focused during\n // init, which would trigger onChange with empty elements, which would then\n // override whatever is in localStorage currently.\n if (!this.state.isLoading) {\n (_e = (_d = this.props).onChange) === null || _e === void 0 ? void 0 : _e.call(_d, this.scene.getElementsIncludingDeleted(), this.state, this.files);\n }\n }\n static resetTapTwice() {\n didTapTwice = false;\n }\n addTextFromPaste(text) {\n const { x, y } = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.viewportCoordsToSceneCoords)({ clientX: cursorX, clientY: cursorY }, this.state);\n const element = (0,_element__WEBPACK_IMPORTED_MODULE_16__.newTextElement)({\n x,\n y,\n strokeColor: this.state.currentItemStrokeColor,\n backgroundColor: this.state.currentItemBackgroundColor,\n fillStyle: this.state.currentItemFillStyle,\n strokeWidth: this.state.currentItemStrokeWidth,\n strokeStyle: this.state.currentItemStrokeStyle,\n roughness: this.state.currentItemRoughness,\n opacity: this.state.currentItemOpacity,\n strokeSharpness: this.state.currentItemStrokeSharpness,\n text,\n fontSize: this.state.currentItemFontSize,\n fontFamily: this.state.currentItemFontFamily,\n textAlign: this.state.currentItemTextAlign,\n verticalAlign: _constants__WEBPACK_IMPORTED_MODULE_12__.DEFAULT_VERTICAL_ALIGN,\n locked: false,\n });\n this.scene.replaceAllElements([\n ...this.scene.getElementsIncludingDeleted(),\n element,\n ]);\n this.setState({ selectedElementIds: { [element.id]: true } });\n this.history.resumeRecording();\n }\n handleTextWysiwyg(element, { isExistingElement = false, }) {\n const updateElement = (text, originalText, isDeleted) => {\n this.scene.replaceAllElements([\n ...this.scene.getElementsIncludingDeleted().map((_element) => {\n if (_element.id === element.id && (0,_element__WEBPACK_IMPORTED_MODULE_16__.isTextElement)(_element)) {\n return (0,_element__WEBPACK_IMPORTED_MODULE_16__.updateTextElement)(_element, {\n text,\n isDeleted,\n originalText,\n });\n }\n return _element;\n }),\n ]);\n };\n (0,_element__WEBPACK_IMPORTED_MODULE_16__.textWysiwyg)({\n id: element.id,\n canvas: this.canvas,\n getViewportCoords: (x, y) => {\n const { x: viewportX, y: viewportY } = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.sceneCoordsToViewportCoords)({\n sceneX: x,\n sceneY: y,\n }, this.state);\n return [\n viewportX - this.state.offsetLeft,\n viewportY - this.state.offsetTop,\n ];\n },\n onChange: (0,_utils__WEBPACK_IMPORTED_MODULE_34__.withBatchedUpdates)((text) => {\n updateElement(text, text, false);\n if ((0,_element__WEBPACK_IMPORTED_MODULE_16__.isNonDeletedElement)(element)) {\n (0,_element_binding__WEBPACK_IMPORTED_MODULE_17__.updateBoundElements)(element);\n }\n }),\n onSubmit: (0,_utils__WEBPACK_IMPORTED_MODULE_34__.withBatchedUpdates)(({ text, viaKeyboard, originalText }) => {\n const isDeleted = !text.trim();\n updateElement(text, originalText, isDeleted);\n // select the created text element only if submitting via keyboard\n // (when submitting via click it should act as signal to deselect)\n if (!isDeleted && viaKeyboard) {\n const elementIdToSelect = element.containerId\n ? element.containerId\n : element.id;\n this.setState((prevState) => ({\n selectedElementIds: Object.assign(Object.assign({}, prevState.selectedElementIds), { [elementIdToSelect]: true }),\n }));\n }\n if (isDeleted) {\n (0,_element_binding__WEBPACK_IMPORTED_MODULE_17__.fixBindingsAfterDeletion)(this.scene.getNonDeletedElements(), [\n element,\n ]);\n }\n if (!isDeleted || isExistingElement) {\n this.history.resumeRecording();\n }\n this.setState({\n draggingElement: null,\n editingElement: null,\n });\n if (this.state.activeTool.locked) {\n (0,_utils__WEBPACK_IMPORTED_MODULE_34__.setCursorForShape)(this.canvas, this.state);\n }\n this.focusContainer();\n }),\n element,\n excalidrawContainer: this.excalidrawContainerRef.current,\n app: this,\n });\n // deselect all other elements when inserting text\n this.deselectElements();\n // do an initial update to re-initialize element position since we were\n // modifying element's x/y for sake of editor (case: syncing to remote)\n updateElement(element.text, element.originalText, false);\n }\n deselectElements() {\n this.setState({\n selectedElementIds: {},\n selectedGroupIds: {},\n editingGroupId: null,\n });\n }\n getTextElementAtPosition(x, y) {\n const element = this.getElementAtPosition(x, y, {\n includeBoundTextElement: true,\n });\n if (element && (0,_element__WEBPACK_IMPORTED_MODULE_16__.isTextElement)(element) && !element.isDeleted) {\n return element;\n }\n return null;\n }\n getElementAtPosition(x, y, opts) {\n const allHitElements = this.getElementsAtPosition(x, y, opts === null || opts === void 0 ? void 0 : opts.includeBoundTextElement, opts === null || opts === void 0 ? void 0 : opts.includeLockedElements);\n if (allHitElements.length > 1) {\n if (opts === null || opts === void 0 ? void 0 : opts.preferSelected) {\n for (let index = allHitElements.length - 1; index > -1; index--) {\n if (this.state.selectedElementIds[allHitElements[index].id]) {\n return allHitElements[index];\n }\n }\n }\n const elementWithHighestZIndex = allHitElements[allHitElements.length - 1];\n // If we're hitting element with highest z-index only on its bounding box\n // while also hitting other element figure, the latter should be considered.\n return (0,_element__WEBPACK_IMPORTED_MODULE_16__.isHittingElementBoundingBoxWithoutHittingElement)(elementWithHighestZIndex, this.state, x, y)\n ? allHitElements[allHitElements.length - 2]\n : elementWithHighestZIndex;\n }\n if (allHitElements.length === 1) {\n return allHitElements[0];\n }\n return null;\n }\n getElementsAtPosition(x, y, includeBoundTextElement = false, includeLockedElements = false) {\n const elements = includeBoundTextElement && includeLockedElements\n ? this.scene.getNonDeletedElements()\n : this.scene\n .getNonDeletedElements()\n .filter((element) => (includeLockedElements || !element.locked) &&\n (includeBoundTextElement ||\n !((0,_element__WEBPACK_IMPORTED_MODULE_16__.isTextElement)(element) && element.containerId)));\n return (0,_scene__WEBPACK_IMPORTED_MODULE_30__.getElementsAtPosition)(elements, (element) => (0,_element__WEBPACK_IMPORTED_MODULE_16__.hitTest)(element, this.state, x, y));\n }\n maybeCleanupAfterMissingPointerUp(event) {\n if (lastPointerUp !== null) {\n // Unfortunately, sometimes we don't get a pointerup after a pointerdown,\n // this can happen when a contextual menu or alert is triggered. In order to avoid\n // being in a weird state, we clean up on the next pointerdown\n lastPointerUp(event);\n }\n }\n updateGestureOnPointerDown(event) {\n gesture.pointers.set(event.pointerId, {\n x: event.clientX,\n y: event.clientY,\n });\n if (gesture.pointers.size === 2) {\n gesture.lastCenter = (0,_gesture__WEBPACK_IMPORTED_MODULE_22__.getCenter)(gesture.pointers);\n gesture.initialScale = this.state.zoom.value;\n gesture.initialDistance = (0,_gesture__WEBPACK_IMPORTED_MODULE_22__.getDistance)(Array.from(gesture.pointers.values()));\n }\n }\n initialPointerDownState(event) {\n const origin = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.viewportCoordsToSceneCoords)(event, this.state);\n const selectedElements = (0,_scene__WEBPACK_IMPORTED_MODULE_30__.getSelectedElements)(this.scene.getNonDeletedElements(), this.state);\n const [minX, minY, maxX, maxY] = (0,_element__WEBPACK_IMPORTED_MODULE_16__.getCommonBounds)(selectedElements);\n return {\n origin,\n withCmdOrCtrl: event[_keys__WEBPACK_IMPORTED_MODULE_26__.KEYS.CTRL_OR_CMD],\n originInGrid: (0,_utils__WEBPACK_IMPORTED_MODULE_34__.tupleToCoors)((0,_math__WEBPACK_IMPORTED_MODULE_27__.getGridPoint)(origin.x, origin.y, this.state.gridSize)),\n scrollbars: (0,_scene__WEBPACK_IMPORTED_MODULE_30__.isOverScrollBars)(currentScrollBars, event.clientX - this.state.offsetLeft, event.clientY - this.state.offsetTop),\n // we need to duplicate because we'll be updating this state\n lastCoords: Object.assign({}, origin),\n originalElements: this.scene\n .getNonDeletedElements()\n .reduce((acc, element) => {\n acc.set(element.id, (0,_element_newElement__WEBPACK_IMPORTED_MODULE_20__.deepCopyElement)(element));\n return acc;\n }, new Map()),\n resize: {\n handleType: false,\n isResizing: false,\n offset: { x: 0, y: 0 },\n arrowDirection: \"origin\",\n center: { x: (maxX + minX) / 2, y: (maxY + minY) / 2 },\n },\n hit: {\n element: null,\n allHitElements: [],\n wasAddedToSelection: false,\n hasBeenDuplicated: false,\n hasHitCommonBoundingBoxOfSelectedElements: this.isHittingCommonBoundingBoxOfSelectedElements(origin, selectedElements),\n hasHitElementInside: false,\n },\n drag: {\n hasOccurred: false,\n offset: null,\n },\n eventListeners: {\n onMove: null,\n onUp: null,\n onKeyUp: null,\n onKeyDown: null,\n },\n boxSelection: {\n hasOccurred: false,\n },\n elementIdsToErase: {},\n };\n }\n // Returns whether the event is a dragging a scrollbar\n handleDraggingScrollBar(event, pointerDownState) {\n if (!(pointerDownState.scrollbars.isOverEither && !this.state.multiElement)) {\n return false;\n }\n isDraggingScrollBar = true;\n pointerDownState.lastCoords.x = event.clientX;\n pointerDownState.lastCoords.y = event.clientY;\n const onPointerMove = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.withBatchedUpdatesThrottled)((event) => {\n const target = event.target;\n if (!(target instanceof HTMLElement)) {\n return;\n }\n this.handlePointerMoveOverScrollbars(event, pointerDownState);\n });\n const onPointerUp = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.withBatchedUpdates)(() => {\n isDraggingScrollBar = false;\n (0,_utils__WEBPACK_IMPORTED_MODULE_34__.setCursorForShape)(this.canvas, this.state);\n lastPointerUp = null;\n this.setState({\n cursorButton: \"up\",\n });\n this.savePointer(event.clientX, event.clientY, \"up\");\n window.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.POINTER_MOVE, onPointerMove);\n window.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.POINTER_UP, onPointerUp);\n onPointerMove.flush();\n });\n lastPointerUp = onPointerUp;\n window.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.POINTER_MOVE, onPointerMove);\n window.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.POINTER_UP, onPointerUp);\n return true;\n }\n isASelectedElement(hitElement) {\n return hitElement != null && this.state.selectedElementIds[hitElement.id];\n }\n isHittingCommonBoundingBoxOfSelectedElements(point, selectedElements) {\n if (selectedElements.length < 2) {\n return false;\n }\n // How many pixels off the shape boundary we still consider a hit\n const threshold = 10 / this.state.zoom.value;\n const [x1, y1, x2, y2] = (0,_element__WEBPACK_IMPORTED_MODULE_16__.getCommonBounds)(selectedElements);\n return (point.x > x1 - threshold &&\n point.x < x2 + threshold &&\n point.y > y1 - threshold &&\n point.y < y2 + threshold);\n }\n onKeyDownFromPointerDownHandler(pointerDownState) {\n return (0,_utils__WEBPACK_IMPORTED_MODULE_34__.withBatchedUpdates)((event) => {\n if (this.maybeHandleResize(pointerDownState, event)) {\n return;\n }\n this.maybeDragNewGenericElement(pointerDownState, event);\n });\n }\n onKeyUpFromPointerDownHandler(pointerDownState) {\n return (0,_utils__WEBPACK_IMPORTED_MODULE_34__.withBatchedUpdates)((event) => {\n // Prevents focus from escaping excalidraw tab\n event.key === _keys__WEBPACK_IMPORTED_MODULE_26__.KEYS.ALT && event.preventDefault();\n if (this.maybeHandleResize(pointerDownState, event)) {\n return;\n }\n this.maybeDragNewGenericElement(pointerDownState, event);\n });\n }\n onPointerMoveFromPointerDownHandler(pointerDownState) {\n return (0,_utils__WEBPACK_IMPORTED_MODULE_34__.withBatchedUpdatesThrottled)((event) => {\n var _a, _b;\n // We need to initialize dragOffsetXY only after we've updated\n // `state.selectedElementIds` on pointerDown. Doing it here in pointerMove\n // event handler should hopefully ensure we're already working with\n // the updated state.\n if (pointerDownState.drag.offset === null) {\n pointerDownState.drag.offset = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.tupleToCoors)((0,_element__WEBPACK_IMPORTED_MODULE_16__.getDragOffsetXY)((0,_scene__WEBPACK_IMPORTED_MODULE_30__.getSelectedElements)(this.scene.getNonDeletedElements(), this.state), pointerDownState.origin.x, pointerDownState.origin.y));\n }\n const target = event.target;\n if (!(target instanceof HTMLElement)) {\n return;\n }\n if (this.handlePointerMoveOverScrollbars(event, pointerDownState)) {\n return;\n }\n const pointerCoords = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.viewportCoordsToSceneCoords)(event, this.state);\n if ((0,_appState__WEBPACK_IMPORTED_MODULE_10__.isEraserActive)(this.state)) {\n this.handleEraser(event, pointerDownState, pointerCoords);\n return;\n }\n const [gridX, gridY] = (0,_math__WEBPACK_IMPORTED_MODULE_27__.getGridPoint)(pointerCoords.x, pointerCoords.y, this.state.gridSize);\n // for arrows/lines, don't start dragging until a given threshold\n // to ensure we don't create a 2-point arrow by mistake when\n // user clicks mouse in a way that it moves a tiny bit (thus\n // triggering pointermove)\n if (!pointerDownState.drag.hasOccurred &&\n (this.state.activeTool.type === \"arrow\" ||\n this.state.activeTool.type === \"line\")) {\n if ((0,_math__WEBPACK_IMPORTED_MODULE_27__.distance2d)(pointerCoords.x, pointerCoords.y, pointerDownState.origin.x, pointerDownState.origin.y) < _constants__WEBPACK_IMPORTED_MODULE_12__.DRAGGING_THRESHOLD) {\n return;\n }\n }\n if (pointerDownState.resize.isResizing) {\n pointerDownState.lastCoords.x = pointerCoords.x;\n pointerDownState.lastCoords.y = pointerCoords.y;\n if (this.maybeHandleResize(pointerDownState, event)) {\n return true;\n }\n }\n if (this.state.editingLinearElement) {\n const didDrag = _element_linearElementEditor__WEBPACK_IMPORTED_MODULE_18__.LinearElementEditor.handlePointDragging(this.state, (appState) => this.setState(appState), pointerCoords.x, pointerCoords.y, (element, pointsSceneCoords) => {\n this.maybeSuggestBindingsForLinearElementAtCoords(element, pointsSceneCoords);\n });\n if (didDrag) {\n pointerDownState.lastCoords.x = pointerCoords.x;\n pointerDownState.lastCoords.y = pointerCoords.y;\n return;\n }\n }\n const hasHitASelectedElement = pointerDownState.hit.allHitElements.some((element) => this.isASelectedElement(element));\n if ((hasHitASelectedElement ||\n pointerDownState.hit.hasHitCommonBoundingBoxOfSelectedElements) &&\n // this allows for box-selecting points when clicking inside the\n // line's bounding box\n (!this.state.editingLinearElement || !event.shiftKey) &&\n // box-selecting without shift when editing line, not clicking on a line\n (!this.state.editingLinearElement ||\n ((_a = this.state.editingLinearElement) === null || _a === void 0 ? void 0 : _a.elementId) !==\n ((_b = pointerDownState.hit.element) === null || _b === void 0 ? void 0 : _b.id) ||\n pointerDownState.hit.hasHitElementInside)) {\n const selectedElements = (0,_scene__WEBPACK_IMPORTED_MODULE_30__.getSelectedElements)(this.scene.getNonDeletedElements(), this.state);\n if (selectedElements.every((element) => element.locked)) {\n return;\n }\n // Marking that click was used for dragging to check\n // if elements should be deselected on pointerup\n pointerDownState.drag.hasOccurred = true;\n // prevent dragging even if we're no longer holding cmd/ctrl otherwise\n // it would have weird results (stuff jumping all over the screen)\n if (selectedElements.length > 0 && !pointerDownState.withCmdOrCtrl) {\n const [dragX, dragY] = (0,_math__WEBPACK_IMPORTED_MODULE_27__.getGridPoint)(pointerCoords.x - pointerDownState.drag.offset.x, pointerCoords.y - pointerDownState.drag.offset.y, this.state.gridSize);\n const [dragDistanceX, dragDistanceY] = [\n Math.abs(pointerCoords.x - pointerDownState.origin.x),\n Math.abs(pointerCoords.y - pointerDownState.origin.y),\n ];\n // We only drag in one direction if shift is pressed\n const lockDirection = event.shiftKey;\n (0,_element__WEBPACK_IMPORTED_MODULE_16__.dragSelectedElements)(pointerDownState, selectedElements, dragX, dragY, lockDirection, dragDistanceX, dragDistanceY, this.state);\n this.maybeSuggestBindingForAll(selectedElements);\n // We duplicate the selected element if alt is pressed on pointer move\n if (event.altKey && !pointerDownState.hit.hasBeenDuplicated) {\n // Move the currently selected elements to the top of the z index stack, and\n // put the duplicates where the selected elements used to be.\n // (the origin point where the dragging started)\n pointerDownState.hit.hasBeenDuplicated = true;\n const nextElements = [];\n const elementsToAppend = [];\n const groupIdMap = new Map();\n const oldIdToDuplicatedId = new Map();\n const hitElement = pointerDownState.hit.element;\n const elements = this.scene.getElementsIncludingDeleted();\n const selectedElementIds = (0,_scene__WEBPACK_IMPORTED_MODULE_30__.getSelectedElements)(elements, this.state, true).map((element) => element.id);\n for (const element of elements) {\n if (selectedElementIds.includes(element.id) ||\n // case: the state.selectedElementIds might not have been\n // updated yet by the time this mousemove event is fired\n (element.id === (hitElement === null || hitElement === void 0 ? void 0 : hitElement.id) &&\n pointerDownState.hit.wasAddedToSelection)) {\n const duplicatedElement = (0,_element__WEBPACK_IMPORTED_MODULE_16__.duplicateElement)(this.state.editingGroupId, groupIdMap, element);\n const [originDragX, originDragY] = (0,_math__WEBPACK_IMPORTED_MODULE_27__.getGridPoint)(pointerDownState.origin.x - pointerDownState.drag.offset.x, pointerDownState.origin.y - pointerDownState.drag.offset.y, this.state.gridSize);\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_19__.mutateElement)(duplicatedElement, {\n x: duplicatedElement.x + (originDragX - dragX),\n y: duplicatedElement.y + (originDragY - dragY),\n });\n nextElements.push(duplicatedElement);\n elementsToAppend.push(element);\n oldIdToDuplicatedId.set(element.id, duplicatedElement.id);\n }\n else {\n nextElements.push(element);\n }\n }\n const nextSceneElements = [...nextElements, ...elementsToAppend];\n (0,_element_textElement__WEBPACK_IMPORTED_MODULE_43__.bindTextToShapeAfterDuplication)(nextElements, elementsToAppend, oldIdToDuplicatedId);\n (0,_element_binding__WEBPACK_IMPORTED_MODULE_17__.fixBindingsAfterDuplication)(nextSceneElements, elementsToAppend, oldIdToDuplicatedId, \"duplicatesServeAsOld\");\n this.scene.replaceAllElements(nextSceneElements);\n }\n return;\n }\n }\n // It is very important to read this.state within each move event,\n // otherwise we would read a stale one!\n const draggingElement = this.state.draggingElement;\n if (!draggingElement) {\n return;\n }\n if (draggingElement.type === \"freedraw\") {\n const points = draggingElement.points;\n const dx = pointerCoords.x - draggingElement.x;\n const dy = pointerCoords.y - draggingElement.y;\n const lastPoint = points.length > 0 && points[points.length - 1];\n const discardPoint = lastPoint && lastPoint[0] === dx && lastPoint[1] === dy;\n if (!discardPoint) {\n const pressures = draggingElement.simulatePressure\n ? draggingElement.pressures\n : [...draggingElement.pressures, event.pressure];\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_19__.mutateElement)(draggingElement, {\n points: [...points, [dx, dy]],\n pressures,\n });\n }\n }\n else if ((0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_21__.isLinearElement)(draggingElement)) {\n pointerDownState.drag.hasOccurred = true;\n const points = draggingElement.points;\n let dx = gridX - draggingElement.x;\n let dy = gridY - draggingElement.y;\n if ((0,_keys__WEBPACK_IMPORTED_MODULE_26__.shouldRotateWithDiscreteAngle)(event) && points.length === 2) {\n ({ width: dx, height: dy } = (0,_element__WEBPACK_IMPORTED_MODULE_16__.getPerfectElementSize)(this.state.activeTool.type, dx, dy));\n }\n if (points.length === 1) {\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_19__.mutateElement)(draggingElement, { points: [...points, [dx, dy]] });\n }\n else if (points.length > 1) {\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_19__.mutateElement)(draggingElement, {\n points: [...points.slice(0, -1), [dx, dy]],\n });\n }\n if ((0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_21__.isBindingElement)(draggingElement, false)) {\n // When creating a linear element by dragging\n this.maybeSuggestBindingsForLinearElementAtCoords(draggingElement, [pointerCoords], this.state.startBoundElement);\n }\n }\n else {\n pointerDownState.lastCoords.x = pointerCoords.x;\n pointerDownState.lastCoords.y = pointerCoords.y;\n this.maybeDragNewGenericElement(pointerDownState, event);\n }\n if (this.state.activeTool.type === \"selection\") {\n pointerDownState.boxSelection.hasOccurred = true;\n const elements = this.scene.getNonDeletedElements();\n if (!event.shiftKey &&\n // allows for box-selecting points (without shift)\n !this.state.editingLinearElement &&\n (0,_scene__WEBPACK_IMPORTED_MODULE_30__.isSomeElementSelected)(elements, this.state)) {\n if (pointerDownState.withCmdOrCtrl && pointerDownState.hit.element) {\n this.setState((prevState) => (0,_groups__WEBPACK_IMPORTED_MODULE_23__.selectGroupsForSelectedElements)(Object.assign(Object.assign({}, prevState), { selectedElementIds: {\n [pointerDownState.hit.element.id]: true,\n } }), this.scene.getNonDeletedElements()));\n }\n else {\n this.setState({\n selectedElementIds: {},\n selectedGroupIds: {},\n editingGroupId: null,\n });\n }\n }\n // box-select line editor points\n if (this.state.editingLinearElement) {\n _element_linearElementEditor__WEBPACK_IMPORTED_MODULE_18__.LinearElementEditor.handleBoxSelection(event, this.state, this.setState.bind(this));\n // regular box-select\n }\n else {\n const elementsWithinSelection = (0,_scene__WEBPACK_IMPORTED_MODULE_30__.getElementsWithinSelection)(elements, draggingElement);\n this.setState((prevState) => (0,_groups__WEBPACK_IMPORTED_MODULE_23__.selectGroupsForSelectedElements)(Object.assign(Object.assign({}, prevState), { selectedElementIds: Object.assign(Object.assign(Object.assign({}, prevState.selectedElementIds), elementsWithinSelection.reduce((acc, element) => {\n acc[element.id] = true;\n return acc;\n }, {})), (pointerDownState.hit.element\n ? {\n // if using ctrl/cmd, select the hitElement only if we\n // haven't box-selected anything else\n [pointerDownState.hit.element.id]: !elementsWithinSelection.length,\n }\n : null)), showHyperlinkPopup: elementsWithinSelection.length === 1 &&\n elementsWithinSelection[0].link\n ? \"info\"\n : false }), this.scene.getNonDeletedElements()));\n }\n }\n });\n }\n // Returns whether the pointer move happened over either scrollbar\n handlePointerMoveOverScrollbars(event, pointerDownState) {\n if (pointerDownState.scrollbars.isOverHorizontal) {\n const x = event.clientX;\n const dx = x - pointerDownState.lastCoords.x;\n this.setState({\n scrollX: this.state.scrollX - dx / this.state.zoom.value,\n });\n pointerDownState.lastCoords.x = x;\n return true;\n }\n if (pointerDownState.scrollbars.isOverVertical) {\n const y = event.clientY;\n const dy = y - pointerDownState.lastCoords.y;\n this.setState({\n scrollY: this.state.scrollY - dy / this.state.zoom.value,\n });\n pointerDownState.lastCoords.y = y;\n return true;\n }\n return false;\n }\n onPointerUpFromPointerDownHandler(pointerDownState) {\n return (0,_utils__WEBPACK_IMPORTED_MODULE_34__.withBatchedUpdates)((childEvent) => {\n var _a, _b;\n const { draggingElement, resizingElement, multiElement, activeTool, isResizing, isRotating, } = this.state;\n this.setState({\n isResizing: false,\n isRotating: false,\n resizingElement: null,\n selectionElement: null,\n cursorButton: \"up\",\n // text elements are reset on finalize, and resetting on pointerup\n // may cause issues with double taps\n editingElement: multiElement || (0,_element__WEBPACK_IMPORTED_MODULE_16__.isTextElement)(this.state.editingElement)\n ? this.state.editingElement\n : null,\n });\n this.savePointer(childEvent.clientX, childEvent.clientY, \"up\");\n // Handle end of dragging a point of a linear element, might close a loop\n // and sets binding element\n if (this.state.editingLinearElement) {\n if (!pointerDownState.boxSelection.hasOccurred &&\n (((_b = (_a = pointerDownState.hit) === null || _a === void 0 ? void 0 : _a.element) === null || _b === void 0 ? void 0 : _b.id) !==\n this.state.editingLinearElement.elementId ||\n !pointerDownState.hit.hasHitElementInside)) {\n this.actionManager.executeAction(_actions__WEBPACK_IMPORTED_MODULE_5__.actionFinalize);\n }\n else {\n const editingLinearElement = _element_linearElementEditor__WEBPACK_IMPORTED_MODULE_18__.LinearElementEditor.handlePointerUp(childEvent, this.state.editingLinearElement, this.state);\n if (editingLinearElement !== this.state.editingLinearElement) {\n this.setState({\n editingLinearElement,\n suggestedBindings: [],\n });\n }\n }\n }\n lastPointerUp = null;\n if (pointerDownState.eventListeners.onMove) {\n pointerDownState.eventListeners.onMove.flush();\n }\n window.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.POINTER_MOVE, pointerDownState.eventListeners.onMove);\n window.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.POINTER_UP, pointerDownState.eventListeners.onUp);\n window.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.KEYDOWN, pointerDownState.eventListeners.onKeyDown);\n window.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.KEYUP, pointerDownState.eventListeners.onKeyUp);\n if (this.state.pendingImageElementId) {\n this.setState({ pendingImageElementId: null });\n }\n if ((draggingElement === null || draggingElement === void 0 ? void 0 : draggingElement.type) === \"freedraw\") {\n const pointerCoords = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.viewportCoordsToSceneCoords)(childEvent, this.state);\n const points = draggingElement.points;\n let dx = pointerCoords.x - draggingElement.x;\n let dy = pointerCoords.y - draggingElement.y;\n // Allows dots to avoid being flagged as infinitely small\n if (dx === points[0][0] && dy === points[0][1]) {\n dy += 0.0001;\n dx += 0.0001;\n }\n const pressures = draggingElement.simulatePressure\n ? []\n : [...draggingElement.pressures, childEvent.pressure];\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_19__.mutateElement)(draggingElement, {\n points: [...points, [dx, dy]],\n pressures,\n lastCommittedPoint: [dx, dy],\n });\n this.actionManager.executeAction(_actions__WEBPACK_IMPORTED_MODULE_5__.actionFinalize);\n return;\n }\n if ((0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_21__.isImageElement)(draggingElement)) {\n const imageElement = draggingElement;\n try {\n this.initializeImageDimensions(imageElement);\n this.setState({ selectedElementIds: { [imageElement.id]: true } }, () => {\n this.actionManager.executeAction(_actions__WEBPACK_IMPORTED_MODULE_5__.actionFinalize);\n });\n }\n catch (error) {\n console.error(error);\n this.scene.replaceAllElements(this.scene\n .getElementsIncludingDeleted()\n .filter((el) => el.id !== imageElement.id));\n this.actionManager.executeAction(_actions__WEBPACK_IMPORTED_MODULE_5__.actionFinalize);\n }\n return;\n }\n if ((0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_21__.isLinearElement)(draggingElement)) {\n if (draggingElement.points.length > 1) {\n this.history.resumeRecording();\n }\n const pointerCoords = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.viewportCoordsToSceneCoords)(childEvent, this.state);\n if (!pointerDownState.drag.hasOccurred &&\n draggingElement &&\n !multiElement) {\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_19__.mutateElement)(draggingElement, {\n points: [\n ...draggingElement.points,\n [\n pointerCoords.x - draggingElement.x,\n pointerCoords.y - draggingElement.y,\n ],\n ],\n });\n this.setState({\n multiElement: draggingElement,\n editingElement: this.state.draggingElement,\n });\n }\n else if (pointerDownState.drag.hasOccurred && !multiElement) {\n if ((0,_element_binding__WEBPACK_IMPORTED_MODULE_17__.isBindingEnabled)(this.state) &&\n (0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_21__.isBindingElement)(draggingElement, false)) {\n (0,_element_binding__WEBPACK_IMPORTED_MODULE_17__.maybeBindLinearElement)(draggingElement, this.state, this.scene, pointerCoords);\n }\n this.setState({ suggestedBindings: [], startBoundElement: null });\n if (!activeTool.locked) {\n (0,_utils__WEBPACK_IMPORTED_MODULE_34__.resetCursor)(this.canvas);\n this.setState((prevState) => ({\n draggingElement: null,\n activeTool: (0,_utils__WEBPACK_IMPORTED_MODULE_34__.updateActiveTool)(this.state, {\n type: \"selection\",\n }),\n selectedElementIds: Object.assign(Object.assign({}, prevState.selectedElementIds), { [draggingElement.id]: true }),\n }));\n }\n else {\n this.setState((prevState) => ({\n draggingElement: null,\n selectedElementIds: Object.assign(Object.assign({}, prevState.selectedElementIds), { [draggingElement.id]: true }),\n }));\n }\n }\n return;\n }\n if (activeTool.type !== \"selection\" &&\n draggingElement &&\n (0,_element__WEBPACK_IMPORTED_MODULE_16__.isInvisiblySmallElement)(draggingElement)) {\n // remove invisible element which was added in onPointerDown\n this.scene.replaceAllElements(this.scene.getElementsIncludingDeleted().slice(0, -1));\n this.setState({\n draggingElement: null,\n });\n return;\n }\n if (draggingElement) {\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_19__.mutateElement)(draggingElement, (0,_element__WEBPACK_IMPORTED_MODULE_16__.getNormalizedDimensions)(draggingElement));\n }\n if (resizingElement) {\n this.history.resumeRecording();\n }\n if (resizingElement && (0,_element__WEBPACK_IMPORTED_MODULE_16__.isInvisiblySmallElement)(resizingElement)) {\n this.scene.replaceAllElements(this.scene\n .getElementsIncludingDeleted()\n .filter((el) => el.id !== resizingElement.id));\n }\n // Code below handles selection when element(s) weren't\n // drag or added to selection on pointer down phase.\n const hitElement = pointerDownState.hit.element;\n if ((0,_appState__WEBPACK_IMPORTED_MODULE_10__.isEraserActive)(this.state)) {\n const draggedDistance = (0,_math__WEBPACK_IMPORTED_MODULE_27__.distance2d)(this.lastPointerDown.clientX, this.lastPointerDown.clientY, this.lastPointerUp.clientX, this.lastPointerUp.clientY);\n if (draggedDistance === 0) {\n const scenePointer = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.viewportCoordsToSceneCoords)({\n clientX: this.lastPointerUp.clientX,\n clientY: this.lastPointerUp.clientY,\n }, this.state);\n const hitElements = this.getElementsAtPosition(scenePointer.x, scenePointer.y);\n hitElements.forEach((hitElement) => (pointerDownState.elementIdsToErase[hitElement.id] = {\n erase: true,\n opacity: hitElement.opacity,\n }));\n }\n this.eraseElements(pointerDownState);\n return;\n }\n else if (Object.keys(pointerDownState.elementIdsToErase).length) {\n this.restoreReadyToEraseElements(pointerDownState);\n }\n if (hitElement &&\n !pointerDownState.drag.hasOccurred &&\n !pointerDownState.hit.wasAddedToSelection &&\n // if we're editing a line, pointerup shouldn't switch selection if\n // box selected\n (!this.state.editingLinearElement ||\n !pointerDownState.boxSelection.hasOccurred)) {\n // when inside line editor, shift selects points instead\n if (childEvent.shiftKey && !this.state.editingLinearElement) {\n if (this.state.selectedElementIds[hitElement.id]) {\n if ((0,_groups__WEBPACK_IMPORTED_MODULE_23__.isSelectedViaGroup)(this.state, hitElement)) {\n // We want to unselect all groups hitElement is part of\n // as well as all elements that are part of the groups\n // hitElement is part of\n const idsOfSelectedElementsThatAreInGroups = hitElement.groupIds\n .flatMap((groupId) => (0,_groups__WEBPACK_IMPORTED_MODULE_23__.getElementsInGroup)(this.scene.getNonDeletedElements(), groupId))\n .map((element) => ({ [element.id]: false }))\n .reduce((prevId, acc) => (Object.assign(Object.assign({}, prevId), acc)), {});\n this.setState((_prevState) => ({\n selectedGroupIds: Object.assign(Object.assign({}, _prevState.selectedElementIds), hitElement.groupIds\n .map((gId) => ({ [gId]: false }))\n .reduce((prev, acc) => (Object.assign(Object.assign({}, prev), acc)), {})),\n selectedElementIds: Object.assign(Object.assign({}, _prevState.selectedElementIds), idsOfSelectedElementsThatAreInGroups),\n }));\n }\n else {\n // remove element from selection while\n // keeping prev elements selected\n this.setState((prevState) => (0,_groups__WEBPACK_IMPORTED_MODULE_23__.selectGroupsForSelectedElements)(Object.assign(Object.assign({}, prevState), { selectedElementIds: Object.assign(Object.assign({}, prevState.selectedElementIds), { [hitElement.id]: false }) }), this.scene.getNonDeletedElements()));\n }\n }\n else {\n // add element to selection while\n // keeping prev elements selected\n this.setState((_prevState) => ({\n selectedElementIds: Object.assign(Object.assign({}, _prevState.selectedElementIds), { [hitElement.id]: true }),\n }));\n }\n }\n else {\n this.setState((prevState) => (Object.assign({}, (0,_groups__WEBPACK_IMPORTED_MODULE_23__.selectGroupsForSelectedElements)(Object.assign(Object.assign({}, prevState), { selectedElementIds: { [hitElement.id]: true } }), this.scene.getNonDeletedElements()))));\n }\n }\n if (!this.state.editingLinearElement &&\n !pointerDownState.drag.hasOccurred &&\n !this.state.isResizing &&\n ((hitElement &&\n (0,_element__WEBPACK_IMPORTED_MODULE_16__.isHittingElementBoundingBoxWithoutHittingElement)(hitElement, this.state, pointerDownState.origin.x, pointerDownState.origin.y)) ||\n (!hitElement &&\n pointerDownState.hit.hasHitCommonBoundingBoxOfSelectedElements))) {\n // Deselect selected elements\n this.setState({\n selectedElementIds: {},\n selectedGroupIds: {},\n editingGroupId: null,\n });\n return;\n }\n if (!activeTool.locked &&\n activeTool.type !== \"freedraw\" &&\n draggingElement) {\n this.setState((prevState) => ({\n selectedElementIds: Object.assign(Object.assign({}, prevState.selectedElementIds), { [draggingElement.id]: true }),\n }));\n }\n if (activeTool.type !== \"selection\" ||\n (0,_scene__WEBPACK_IMPORTED_MODULE_30__.isSomeElementSelected)(this.scene.getNonDeletedElements(), this.state)) {\n this.history.resumeRecording();\n }\n if (pointerDownState.drag.hasOccurred || isResizing || isRotating) {\n ((0,_element_binding__WEBPACK_IMPORTED_MODULE_17__.isBindingEnabled)(this.state)\n ? _element_binding__WEBPACK_IMPORTED_MODULE_17__.bindOrUnbindSelectedElements\n : _element_binding__WEBPACK_IMPORTED_MODULE_17__.unbindLinearElements)((0,_scene__WEBPACK_IMPORTED_MODULE_30__.getSelectedElements)(this.scene.getNonDeletedElements(), this.state));\n }\n if (!activeTool.locked && activeTool.type !== \"freedraw\") {\n (0,_utils__WEBPACK_IMPORTED_MODULE_34__.resetCursor)(this.canvas);\n this.setState({\n draggingElement: null,\n suggestedBindings: [],\n activeTool: (0,_utils__WEBPACK_IMPORTED_MODULE_34__.updateActiveTool)(this.state, { type: \"selection\" }),\n });\n }\n else {\n this.setState({\n draggingElement: null,\n suggestedBindings: [],\n });\n }\n });\n }\n maybeSuggestBindingForAll(selectedElements) {\n const suggestedBindings = (0,_element_binding__WEBPACK_IMPORTED_MODULE_17__.getEligibleElementsForBinding)(selectedElements);\n this.setState({ suggestedBindings });\n }\n clearSelection(hitElement) {\n this.setState((prevState) => ({\n selectedElementIds: {},\n selectedGroupIds: {},\n // Continue editing the same group if the user selected a different\n // element from it\n editingGroupId: prevState.editingGroupId &&\n hitElement != null &&\n (0,_groups__WEBPACK_IMPORTED_MODULE_23__.isElementInGroup)(hitElement, prevState.editingGroupId)\n ? prevState.editingGroupId\n : null,\n }));\n this.setState({\n selectedElementIds: {},\n previousSelectedElementIds: this.state.selectedElementIds,\n });\n }\n getTextWysiwygSnappedToCenterPosition(x, y, appState, canvas, scale) {\n const elementClickedInside = (0,_scene__WEBPACK_IMPORTED_MODULE_30__.getTextBindableContainerAtPosition)(this.scene\n .getElementsIncludingDeleted()\n .filter((element) => !(0,_element__WEBPACK_IMPORTED_MODULE_16__.isTextElement)(element)), x, y);\n if (elementClickedInside) {\n const elementCenterX = elementClickedInside.x + elementClickedInside.width / 2;\n const elementCenterY = elementClickedInside.y + elementClickedInside.height / 2;\n const distanceToCenter = Math.hypot(x - elementCenterX, y - elementCenterY);\n const isSnappedToCenter = distanceToCenter < _constants__WEBPACK_IMPORTED_MODULE_12__.TEXT_TO_CENTER_SNAP_THRESHOLD;\n if (isSnappedToCenter) {\n const { x: viewportX, y: viewportY } = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.sceneCoordsToViewportCoords)({ sceneX: elementCenterX, sceneY: elementCenterY }, appState);\n return { viewportX, viewportY, elementCenterX, elementCenterY };\n }\n }\n }\n getCanvasOffsets() {\n var _a;\n if ((_a = this.excalidrawContainerRef) === null || _a === void 0 ? void 0 : _a.current) {\n const excalidrawContainer = this.excalidrawContainerRef.current;\n const { left, top } = excalidrawContainer.getBoundingClientRect();\n return {\n offsetLeft: left,\n offsetTop: top,\n };\n }\n return {\n offsetLeft: 0,\n offsetTop: 0,\n };\n }\n updateLanguage() {\n return __awaiter(this, void 0, void 0, function* () {\n const currentLang = _i18n__WEBPACK_IMPORTED_MODULE_25__.languages.find((lang) => lang.code === this.props.langCode) ||\n _i18n__WEBPACK_IMPORTED_MODULE_25__.defaultLang;\n yield (0,_i18n__WEBPACK_IMPORTED_MODULE_25__.setLanguage)(currentLang);\n this.setAppState({});\n });\n }\n}\nApp.defaultProps = {\n // needed for tests to pass since we directly render App in many tests\n UIOptions: _constants__WEBPACK_IMPORTED_MODULE_12__.DEFAULT_UI_OPTIONS,\n};\nif (\"development\" === _constants__WEBPACK_IMPORTED_MODULE_12__.ENV.TEST ||\n \"development\" === _constants__WEBPACK_IMPORTED_MODULE_12__.ENV.DEVELOPMENT) {\n window.h = window.h || {};\n Object.defineProperties(window.h, {\n elements: {\n configurable: true,\n get() {\n var _a;\n return (_a = this.app) === null || _a === void 0 ? void 0 : _a.scene.getElementsIncludingDeleted();\n },\n set(elements) {\n var _a;\n return (_a = this.app) === null || _a === void 0 ? void 0 : _a.scene.replaceAllElements(elements);\n },\n },\n });\n}\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (App);\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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RCxDQUFDO1NBQ0Y7S0FDRixDQUFDLENBQUM7Q0FDSjtBQUNELGlFQUFlLEdBQUcsRUFBQyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uLi8uLi9jb21wb25lbnRzL0FwcC50c3g/MDA3MCJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgUmVhY3QsIHsgdXNlQ29udGV4dCB9IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IHsgZmx1c2hTeW5jIH0gZnJvbSBcInJlYWN0LWRvbVwiO1xuaW1wb3J0IHsgUm91Z2hDYW52YXMgfSBmcm9tIFwicm91Z2hqcy9iaW4vY2FudmFzXCI7XG5pbXBvcnQgcm91Z2ggZnJvbSBcInJvdWdoanMvYmluL3JvdWdoXCI7XG5pbXBvcnQgY2xzeCBmcm9tIFwiY2xzeFwiO1xuaW1wb3J0IHsgbmFub2lkIH0gZnJvbSBcIm5hbm9pZFwiO1xuXG5pbXBvcnQge1xuICBhY3Rpb25BZGRUb0xpYnJhcnksXG4gIGFjdGlvbkJyaW5nRm9yd2FyZCxcbiAgYWN0aW9uQnJpbmdUb0Zyb250LFxuICBhY3Rpb25Db3B5LFxuICBhY3Rpb25Db3B5QXNQbmcsXG4gIGFjdGlvbkNvcHlBc1N2ZyxcbiAgY29weVRleHQsXG4gIGFjdGlvbkNvcHlTdHlsZXMsXG4gIGFjdGlvbkN1dCxcbiAgYWN0aW9uRGVsZXRlU2VsZWN0ZWQsXG4gIGFjdGlvbkR1cGxpY2F0ZVNlbGVjdGlvbixcbiAgYWN0aW9uRmluYWxpemUsXG4gIGFjdGlvbkZsaXBIb3Jpem9udGFsLFxuICBhY3Rpb25GbGlwVmVydGljYWwsXG4gIGFjdGlvbkdyb3VwLFxuICBhY3Rpb25QYXN0ZVN0eWxlcyxcbiAgYWN0aW9uU2VsZWN0QWxsLFxuICBhY3Rpb25TZW5kQmFja3dhcmQsXG4gIGFjdGlvblNlbmRUb0JhY2ssXG4gIGFjdGlvblRvZ2dsZUdyaWRNb2RlLFxuICBhY3Rpb25Ub2dnbGVTdGF0cyxcbiAgYWN0aW9uVG9nZ2xlWmVuTW9kZSxcbiAgYWN0aW9uVW5iaW5kVGV4dCxcbiAgYWN0aW9uQmluZFRleHQsXG4gIGFjdGlvblVuZ3JvdXAsXG4gIGFjdGlvbkxpbmssXG4gIGFjdGlvblRvZ2dsZUxvY2ssXG59IGZyb20gXCIuLi9hY3Rpb25zXCI7XG5pbXBvcnQgeyBjcmVhdGVSZWRvQWN0aW9uLCBjcmVhdGVVbmRvQWN0aW9uIH0gZnJvbSBcIi4uL2FjdGlvbnMvYWN0aW9uSGlzdG9yeVwiO1xuaW1wb3J0IHsgQWN0aW9uTWFuYWdlciB9IGZyb20gXCIuLi9hY3Rpb25zL21hbmFnZXJcIjtcbmltcG9ydCB7IGFjdGlvbnMgfSBmcm9tIFwiLi4vYWN0aW9ucy9yZWdpc3RlclwiO1xuaW1wb3J0IHsgQWN0aW9uUmVzdWx0IH0gZnJvbSBcIi4uL2FjdGlvbnMvdHlwZXNcIjtcbmltcG9ydCB7IHRyYWNrRXZlbnQgfSBmcm9tIFwiLi4vYW5hbHl0aWNzXCI7XG5pbXBvcnQgeyBnZXREZWZhdWx0QXBwU3RhdGUsIGlzRXJhc2VyQWN0aXZlIH0gZnJvbSBcIi4uL2FwcFN0YXRlXCI7XG5pbXBvcnQge1xuICBwYXJzZUNsaXBib2FyZCxcbiAgcHJvYmFibHlTdXBwb3J0c0NsaXBib2FyZEJsb2IsXG4gIHByb2JhYmx5U3VwcG9ydHNDbGlwYm9hcmRXcml0ZVRleHQsXG59IGZyb20gXCIuLi9jbGlwYm9hcmRcIjtcbmltcG9ydCB7XG4gIEFQUF9OQU1FLFxuICBDVVJTT1JfVFlQRSxcbiAgREVGQVVMVF9NQVhfSU1BR0VfV0lEVEhfT1JfSEVJR0hULFxuICBERUZBVUxUX1VJX09QVElPTlMsXG4gIERFRkFVTFRfVkVSVElDQUxfQUxJR04sXG4gIERSQUdHSU5HX1RIUkVTSE9MRCxcbiAgRUxFTUVOVF9SRUFEWV9UT19FUkFTRV9PUEFDSVRZLFxuICBFTEVNRU5UX1NISUZUX1RSQU5TTEFURV9BTU9VTlQsXG4gIEVMRU1FTlRfVFJBTlNMQVRFX0FNT1VOVCxcbiAgRU5WLFxuICBFVkVOVCxcbiAgR1JJRF9TSVpFLFxuICBJTUFHRV9SRU5ERVJfVElNRU9VVCxcbiAgTElORV9DT05GSVJNX1RIUkVTSE9MRCxcbiAgTUFYX0FMTE9XRURfRklMRV9CWVRFUyxcbiAgTUlNRV9UWVBFUyxcbiAgTVFfTUFYX0hFSUdIVF9MQU5EU0NBUEUsXG4gIE1RX01BWF9XSURUSF9MQU5EU0NBUEUsXG4gIE1RX01BWF9XSURUSF9QT1JUUkFJVCxcbiAgTVFfUklHSFRfU0lERUJBUl9NSU5fV0lEVEgsXG4gIE1RX1NNX01BWF9XSURUSCxcbiAgUE9JTlRFUl9CVVRUT04sXG4gIFNDUk9MTF9USU1FT1VULFxuICBUQVBfVFdJQ0VfVElNRU9VVCxcbiAgVEVYVF9UT19DRU5URVJfU05BUF9USFJFU0hPTEQsXG4gIFRIRU1FLFxuICBUT1VDSF9DVFhfTUVOVV9USU1FT1VULFxuICBWRVJUSUNBTF9BTElHTixcbn0gZnJvbSBcIi4uL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgbG9hZEZyb21CbG9iIH0gZnJvbSBcIi4uL2RhdGFcIjtcbmltcG9ydCBMaWJyYXJ5LCB7IGRpc3RyaWJ1dGVMaWJyYXJ5SXRlbXNPblNxdWFyZUdyaWQgfSBmcm9tIFwiLi4vZGF0YS9saWJyYXJ5XCI7XG5pbXBvcnQgeyByZXN0b3JlLCByZXN0b3JlRWxlbWVudHMgfSBmcm9tIFwiLi4vZGF0YS9yZXN0b3JlXCI7XG5pbXBvcnQge1xuICBkcmFnTmV3RWxlbWVudCxcbiAgZHJhZ1NlbGVjdGVkRWxlbWVudHMsXG4gIGR1cGxpY2F0ZUVsZW1lbnQsXG4gIGdldENvbW1vbkJvdW5kcyxcbiAgZ2V0Q3Vyc29yRm9yUmVzaXppbmdFbGVtZW50LFxuICBnZXREcmFnT2Zmc2V0WFksXG4gIGdldEVsZW1lbnRXaXRoVHJhbnNmb3JtSGFuZGxlVHlwZSxcbiAgZ2V0Tm9ybWFsaXplZERpbWVuc2lvbnMsXG4gIGdldFBlcmZlY3RFbGVtZW50U2l6ZSxcbiAgZ2V0UmVzaXplQXJyb3dEaXJlY3Rpb24sXG4gIGdldFJlc2l6ZU9mZnNldFhZLFxuICBnZXRUcmFuc2Zvcm1IYW5kbGVUeXBlRnJvbUNvb3JkcyxcbiAgaGl0VGVzdCxcbiAgaXNIaXR0aW5nRWxlbWVudEJvdW5kaW5nQm94V2l0aG91dEhpdHRpbmdFbGVtZW50LFxuICBpc0ludmlzaWJseVNtYWxsRWxlbWVudCxcbiAgaXNOb25EZWxldGVkRWxlbWVudCxcbiAgaXNUZXh0RWxlbWVudCxcbiAgbmV3RWxlbWVudCxcbiAgbmV3TGluZWFyRWxlbWVudCxcbiAgbmV3VGV4dEVsZW1lbnQsXG4gIG5ld0ltYWdlRWxlbWVudCxcbiAgdGV4dFd5c2l3eWcsXG4gIHRyYW5zZm9ybUVsZW1lbnRzLFxuICB1cGRhdGVUZXh0RWxlbWVudCxcbn0gZnJvbSBcIi4uL2VsZW1lbnRcIjtcbmltcG9ydCB7XG4gIGJpbmRPclVuYmluZFNlbGVjdGVkRWxlbWVudHMsXG4gIGZpeEJpbmRpbmdzQWZ0ZXJEZWxldGlvbixcbiAgZml4QmluZGluZ3NBZnRlckR1cGxpY2F0aW9uLFxuICBnZXRFbGlnaWJsZUVsZW1lbnRzRm9yQmluZGluZyxcbiAgZ2V0SG92ZXJlZEVsZW1lbnRGb3JCaW5kaW5nLFxuICBpc0JpbmRpbmdFbmFibGVkLFxuICBpc0xpbmVhckVsZW1lbnRTaW1wbGVBbmRBbHJlYWR5Qm91bmQsXG4gIG1heWJlQmluZExpbmVhckVsZW1lbnQsXG4gIHNob3VsZEVuYWJsZUJpbmRpbmdGb3JQb2ludGVyRXZlbnQsXG4gIHVuYmluZExpbmVhckVsZW1lbnRzLFxuICB1cGRhdGVCb3VuZEVsZW1lbnRzLFxufSBmcm9tIFwiLi4vZWxlbWVudC9iaW5kaW5nXCI7XG5pbXBvcnQgeyBMaW5lYXJFbGVtZW50RWRpdG9yIH0gZnJvbSBcIi4uL2VsZW1lbnQvbGluZWFyRWxlbWVudEVkaXRvclwiO1xuaW1wb3J0IHsgbXV0YXRlRWxlbWVudCwgbmV3RWxlbWVudFdpdGggfSBmcm9tIFwiLi4vZWxlbWVudC9tdXRhdGVFbGVtZW50XCI7XG5pbXBvcnQgeyBkZWVwQ29weUVsZW1lbnQsIG5ld0ZyZWVEcmF3RWxlbWVudCB9IGZyb20gXCIuLi9lbGVtZW50L25ld0VsZW1lbnRcIjtcbmltcG9ydCB7XG4gIGhhc0JvdW5kVGV4dEVsZW1lbnQsXG4gIGlzQmluZGluZ0VsZW1lbnQsXG4gIGlzQmluZGluZ0VsZW1lbnRUeXBlLFxuICBpc0JvdW5kVG9Db250YWluZXIsXG4gIGlzSW1hZ2VFbGVtZW50LFxuICBpc0luaXRpYWxpemVkSW1hZ2VFbGVtZW50LFxuICBpc0xpbmVhckVsZW1lbnQsXG4gIGlzTGluZWFyRWxlbWVudFR5cGUsXG4gIGlzVGV4dEJpbmRhYmxlQ29udGFpbmVyLFxufSBmcm9tIFwiLi4vZWxlbWVudC90eXBlQ2hlY2tzXCI7XG5pbXBvcnQge1xuICBFeGNhbGlkcmF3QmluZGFibGVFbGVtZW50LFxuICBFeGNhbGlkcmF3RWxlbWVudCxcbiAgRXhjYWxpZHJhd0ZyZWVEcmF3RWxlbWVudCxcbiAgRXhjYWxpZHJhd0dlbmVyaWNFbGVtZW50LFxuICBFeGNhbGlkcmF3TGluZWFyRWxlbWVudCxcbiAgRXhjYWxpZHJhd1RleHRFbGVtZW50LFxuICBOb25EZWxldGVkLFxuICBJbml0aWFsaXplZEV4Y2FsaWRyYXdJbWFnZUVsZW1lbnQsXG4gIEV4Y2FsaWRyYXdJbWFnZUVsZW1lbnQsXG4gIEZpbGVJZCxcbiAgTm9uRGVsZXRlZEV4Y2FsaWRyYXdFbGVtZW50LFxuICBFeGNhbGlkcmF3VGV4dENvbnRhaW5lcixcbn0gZnJvbSBcIi4uL2VsZW1lbnQvdHlwZXNcIjtcbmltcG9ydCB7IGdldENlbnRlciwgZ2V0RGlzdGFuY2UgfSBmcm9tIFwiLi4vZ2VzdHVyZVwiO1xuaW1wb3J0IHtcbiAgZWRpdEdyb3VwRm9yU2VsZWN0ZWRFbGVtZW50LFxuICBnZXRFbGVtZW50c0luR3JvdXAsXG4gIGdldFNlbGVjdGVkR3JvdXBJZEZvckVsZW1lbnQsXG4gIGdldFNlbGVjdGVkR3JvdXBJZHMsXG4gIGlzRWxlbWVudEluR3JvdXAsXG4gIGlzU2VsZWN0ZWRWaWFHcm91cCxcbiAgc2VsZWN0R3JvdXBzRm9yU2VsZWN0ZWRFbGVtZW50cyxcbn0gZnJvbSBcIi4uL2dyb3Vwc1wiO1xuaW1wb3J0IEhpc3RvcnkgZnJvbSBcIi4uL2hpc3RvcnlcIjtcbmltcG9ydCB7IGRlZmF1bHRMYW5nLCBnZXRMYW5ndWFnZSwgbGFuZ3VhZ2VzLCBzZXRMYW5ndWFnZSwgdCB9IGZyb20gXCIuLi9pMThuXCI7XG5pbXBvcnQge1xuICBDT0RFUyxcbiAgc2hvdWxkUmVzaXplRnJvbUNlbnRlcixcbiAgc2hvdWxkTWFpbnRhaW5Bc3BlY3RSYXRpbyxcbiAgc2hvdWxkUm90YXRlV2l0aERpc2NyZXRlQW5nbGUsXG4gIGlzQXJyb3dLZXksXG4gIEtFWVMsXG4gIGlzQW5kcm9pZCxcbn0gZnJvbSBcIi4uL2tleXNcIjtcbmltcG9ydCB7IGRpc3RhbmNlMmQsIGdldEdyaWRQb2ludCwgaXNQYXRoQUxvb3AgfSBmcm9tIFwiLi4vbWF0aFwiO1xuaW1wb3J0IHsgcmVuZGVyU2NlbmUgfSBmcm9tIFwiLi4vcmVuZGVyZXIvcmVuZGVyU2NlbmVcIjtcbmltcG9ydCB7IGludmFsaWRhdGVTaGFwZUZvckVsZW1lbnQgfSBmcm9tIFwiLi4vcmVuZGVyZXIvcmVuZGVyRWxlbWVudFwiO1xuaW1wb3J0IHtcbiAgY2FsY3VsYXRlU2Nyb2xsQ2VudGVyLFxuICBnZXRUZXh0QmluZGFibGVDb250YWluZXJBdFBvc2l0aW9uLFxuICBnZXRFbGVtZW50c0F0UG9zaXRpb24sXG4gIGdldEVsZW1lbnRzV2l0aGluU2VsZWN0aW9uLFxuICBnZXROb3JtYWxpemVkWm9vbSxcbiAgZ2V0U2VsZWN0ZWRFbGVtZW50cyxcbiAgaGFzQmFja2dyb3VuZCxcbiAgaXNPdmVyU2Nyb2xsQmFycyxcbiAgaXNTb21lRWxlbWVudFNlbGVjdGVkLFxufSBmcm9tIFwiLi4vc2NlbmVcIjtcbmltcG9ydCBTY2VuZSBmcm9tIFwiLi4vc2NlbmUvU2NlbmVcIjtcbmltcG9ydCB7IFJlbmRlckNvbmZpZywgU2Nyb2xsQmFycyB9IGZyb20gXCIuLi9zY2VuZS90eXBlc1wiO1xuaW1wb3J0IHsgZ2V0U3RhdGVGb3Jab29tIH0gZnJvbSBcIi4uL3NjZW5lL3pvb21cIjtcbmltcG9ydCB7IGZpbmRTaGFwZUJ5S2V5LCBTSEFQRVMgfSBmcm9tIFwiLi4vc2hhcGVzXCI7XG5pbXBvcnQge1xuICBBcHBDbGFzc1Byb3BlcnRpZXMsXG4gIEFwcFByb3BzLFxuICBBcHBTdGF0ZSxcbiAgQmluYXJ5RmlsZURhdGEsXG4gIERhdGFVUkwsXG4gIEV4Y2FsaWRyYXdJbXBlcmF0aXZlQVBJLFxuICBCaW5hcnlGaWxlcyxcbiAgR2VzdHVyZSxcbiAgR2VzdHVyZUV2ZW50LFxuICBMaWJyYXJ5SXRlbXMsXG4gIFBvaW50ZXJEb3duU3RhdGUsXG4gIFNjZW5lRGF0YSxcbiAgRGV2aWNlLFxufSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7XG4gIGRlYm91bmNlLFxuICBkaXN0YW5jZSxcbiAgZ2V0Rm9udFN0cmluZyxcbiAgZ2V0TmVhcmVzdFNjcm9sbGFibGVDb250YWluZXIsXG4gIGlzSW5wdXRMaWtlLFxuICBpc1Rvb2xJY29uLFxuICBpc1dyaXRhYmxlRWxlbWVudCxcbiAgcmVzZXRDdXJzb3IsXG4gIHJlc29sdmFibGVQcm9taXNlLFxuICBzY2VuZUNvb3Jkc1RvVmlld3BvcnRDb29yZHMsXG4gIHNldEN1cnNvcixcbiAgc2V0Q3Vyc29yRm9yU2hhcGUsXG4gIHR1cGxlVG9Db29ycyxcbiAgdmlld3BvcnRDb29yZHNUb1NjZW5lQ29vcmRzLFxuICB3aXRoQmF0Y2hlZFVwZGF0ZXMsXG4gIHdyYXBFdmVudCxcbiAgd2l0aEJhdGNoZWRVcGRhdGVzVGhyb3R0bGVkLFxuICB1cGRhdGVPYmplY3QsXG4gIHNldEVyYXNlckN1cnNvcixcbiAgdXBkYXRlQWN0aXZlVG9vbCxcbn0gZnJvbSBcIi4uL3V0aWxzXCI7XG5pbXBvcnQgQ29udGV4dE1lbnUsIHsgQ29udGV4dE1lbnVPcHRpb24gfSBmcm9tIFwiLi9Db250ZXh0TWVudVwiO1xuaW1wb3J0IExheWVyVUkgZnJvbSBcIi4vTGF5ZXJVSVwiO1xuaW1wb3J0IHsgVG9hc3QgfSBmcm9tIFwiLi9Ub2FzdFwiO1xuaW1wb3J0IHsgYWN0aW9uVG9nZ2xlVmlld01vZGUgfSBmcm9tIFwiLi4vYWN0aW9ucy9hY3Rpb25Ub2dnbGVWaWV3TW9kZVwiO1xuaW1wb3J0IHtcbiAgZGF0YVVSTFRvRmlsZSxcbiAgZ2VuZXJhdGVJZEZyb21GaWxlLFxuICBnZXREYXRhVVJMLFxuICBnZXRGaWxlRnJvbUV2ZW50LFxuICBpc1N1cHBvcnRlZEltYWdlRmlsZSxcbiAgbG9hZFNjZW5lT3JMaWJyYXJ5RnJvbUJsb2IsXG4gIG5vcm1hbGl6ZUZpbGUsXG4gIHBhcnNlTGlicmFyeUpTT04sXG4gIHJlc2l6ZUltYWdlRmlsZSxcbiAgU1ZHU3RyaW5nVG9GaWxlLFxufSBmcm9tIFwiLi4vZGF0YS9ibG9iXCI7XG5pbXBvcnQge1xuICBnZXRJbml0aWFsaXplZEltYWdlRWxlbWVudHMsXG4gIGxvYWRIVE1MSW1hZ2VFbGVtZW50LFxuICBub3JtYWxpemVTVkcsXG4gIHVwZGF0ZUltYWdlQ2FjaGUgYXMgX3VwZGF0ZUltYWdlQ2FjaGUsXG59IGZyb20gXCIuLi9lbGVtZW50L2ltYWdlXCI7XG5pbXBvcnQgdGhyb3R0bGUgZnJvbSBcImxvZGFzaC50aHJvdHRsZVwiO1xuaW1wb3J0IHsgZmlsZU9wZW4sIEZpbGVTeXN0ZW1IYW5kbGUgfSBmcm9tIFwiLi4vZGF0YS9maWxlc3lzdGVtXCI7XG5pbXBvcnQge1xuICBiaW5kVGV4dFRvU2hhcGVBZnRlckR1cGxpY2F0aW9uLFxuICBnZXRBcHByb3hNaW5MaW5lSGVpZ2h0LFxuICBnZXRBcHByb3hNaW5MaW5lV2lkdGgsXG4gIGdldEJvdW5kVGV4dEVsZW1lbnQsXG59IGZyb20gXCIuLi9lbGVtZW50L3RleHRFbGVtZW50XCI7XG5pbXBvcnQgeyBpc0hpdHRpbmdFbGVtZW50Tm90Q29uc2lkZXJpbmdCb3VuZGluZ0JveCB9IGZyb20gXCIuLi9lbGVtZW50L2NvbGxpc2lvblwiO1xuaW1wb3J0IHtcbiAgbm9ybWFsaXplTGluayxcbiAgc2hvd0h5cGVybGlua1Rvb2x0aXAsXG4gIGhpZGVIeXBlcmxpbmtUb29saXAsXG4gIEh5cGVybGluayxcbiAgaXNQb2ludEhpdHRpbmdMaW5rSWNvbixcbiAgaXNMb2NhbExpbmssXG59IGZyb20gXCIuLi9lbGVtZW50L0h5cGVybGlua1wiO1xuXG5jb25zdCBkZXZpY2VDb250ZXh0SW5pdGlhbFZhbHVlID0ge1xuICBpc1NtU2NyZWVuOiBmYWxzZSxcbiAgaXNNb2JpbGU6IGZhbHNlLFxuICBpc1RvdWNoU2NyZWVuOiBmYWxzZSxcbiAgY2FuRGV2aWNlRml0U2lkZWJhcjogZmFsc2UsXG59O1xuY29uc3QgRGV2aWNlQ29udGV4dCA9IFJlYWN0LmNyZWF0ZUNvbnRleHQ8RGV2aWNlPihkZXZpY2VDb250ZXh0SW5pdGlhbFZhbHVlKTtcbmV4cG9ydCBjb25zdCB1c2VEZXZpY2UgPSAoKSA9PiB1c2VDb250ZXh0PERldmljZT4oRGV2aWNlQ29udGV4dCk7XG5jb25zdCBFeGNhbGlkcmF3Q29udGFpbmVyQ29udGV4dCA9IFJlYWN0LmNyZWF0ZUNvbnRleHQ8e1xuICBjb250YWluZXI6IEhUTUxEaXZFbGVtZW50IHwgbnVsbDtcbiAgaWQ6IHN0cmluZyB8IG51bGw7XG59Pih7IGNvbnRhaW5lcjogbnVsbCwgaWQ6IG51bGwgfSk7XG5leHBvcnQgY29uc3QgdXNlRXhjYWxpZHJhd0NvbnRhaW5lciA9ICgpID0+XG4gIHVzZUNvbnRleHQoRXhjYWxpZHJhd0NvbnRhaW5lckNvbnRleHQpO1xuXG5sZXQgZGlkVGFwVHdpY2U6IGJvb2xlYW4gPSBmYWxzZTtcbmxldCB0YXBwZWRUd2ljZVRpbWVyID0gMDtcbmxldCBjdXJzb3JYID0gMDtcbmxldCBjdXJzb3JZID0gMDtcbmxldCBpc0hvbGRpbmdTcGFjZTogYm9vbGVhbiA9IGZhbHNlO1xubGV0IGlzUGFubmluZzogYm9vbGVhbiA9IGZhbHNlO1xubGV0IGlzRHJhZ2dpbmdTY3JvbGxCYXI6IGJvb2xlYW4gPSBmYWxzZTtcbmxldCBjdXJyZW50U2Nyb2xsQmFyczogU2Nyb2xsQmFycyA9IHsgaG9yaXpvbnRhbDogbnVsbCwgdmVydGljYWw6IG51bGwgfTtcbmxldCB0b3VjaFRpbWVvdXQgPSAwO1xubGV0IGludmFsaWRhdGVDb250ZXh0TWVudSA9IGZhbHNlO1xuXG4vLyByZW1vdmUgdGhpcyBoYWNrIHdoZW4gd2UgY2FuIHN5bmMgcmVuZGVyICYgcmVzaXplT2JzZXJ2ZXIgKHN0YXRlIHVwZGF0ZSlcbi8vIHRvIHJBRi4gU2VlICM1NDM5XG5sZXQgVEhST1RUTEVfTkVYVF9SRU5ERVIgPSB0cnVlO1xuXG5sZXQgbGFzdFBvaW50ZXJVcDogKChldmVudDogYW55KSA9PiB2b2lkKSB8IG51bGwgPSBudWxsO1xuY29uc3QgZ2VzdHVyZTogR2VzdHVyZSA9IHtcbiAgcG9pbnRlcnM6IG5ldyBNYXAoKSxcbiAgbGFzdENlbnRlcjogbnVsbCxcbiAgaW5pdGlhbERpc3RhbmNlOiBudWxsLFxuICBpbml0aWFsU2NhbGU6IG51bGwsXG59O1xuXG5jbGFzcyBBcHAgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQ8QXBwUHJvcHMsIEFwcFN0YXRlPiB7XG4gIGNhbnZhczogQXBwQ2xhc3NQcm9wZXJ0aWVzW1wiY2FudmFzXCJdID0gbnVsbDtcbiAgcmM6IFJvdWdoQ2FudmFzIHwgbnVsbCA9IG51bGw7XG4gIHVubW91bnRlZDogYm9vbGVhbiA9IGZhbHNlO1xuICBhY3Rpb25NYW5hZ2VyOiBBY3Rpb25NYW5hZ2VyO1xuICBkZXZpY2U6IERldmljZSA9IGRldmljZUNvbnRleHRJbml0aWFsVmFsdWU7XG4gIGRldGFjaElzTW9iaWxlTXFIYW5kbGVyPzogKCkgPT4gdm9pZDtcblxuICBwcml2YXRlIGV4Y2FsaWRyYXdDb250YWluZXJSZWYgPSBSZWFjdC5jcmVhdGVSZWY8SFRNTERpdkVsZW1lbnQ+KCk7XG5cbiAgcHVibGljIHN0YXRpYyBkZWZhdWx0UHJvcHM6IFBhcnRpYWw8QXBwUHJvcHM+ID0ge1xuICAgIC8vIG5lZWRlZCBmb3IgdGVzdHMgdG8gcGFzcyBzaW5jZSB3ZSBkaXJlY3RseSByZW5kZXIgQXBwIGluIG1hbnkgdGVzdHNcbiAgICBVSU9wdGlvbnM6IERFRkFVTFRfVUlfT1BUSU9OUyxcbiAgfTtcblxuICBwdWJsaWMgc2NlbmU6IFNjZW5lO1xuICBwcml2YXRlIHJlc2l6ZU9ic2VydmVyOiBSZXNpemVPYnNlcnZlciB8IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSBuZWFyZXN0U2Nyb2xsYWJsZUNvbnRhaW5lcjogSFRNTEVsZW1lbnQgfCBEb2N1bWVudCB8IHVuZGVmaW5lZDtcbiAgcHVibGljIGxpYnJhcnk6IEFwcENsYXNzUHJvcGVydGllc1tcImxpYnJhcnlcIl07XG4gIHB1YmxpYyBsaWJyYXJ5SXRlbXNGcm9tU3RvcmFnZTogTGlicmFyeUl0ZW1zIHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIGlkOiBzdHJpbmc7XG4gIHByaXZhdGUgaGlzdG9yeTogSGlzdG9yeTtcbiAgcHJpdmF0ZSBleGNhbGlkcmF3Q29udGFpbmVyVmFsdWU6IHtcbiAgICBjb250YWluZXI6IEhUTUxEaXZFbGVtZW50IHwgbnVsbDtcbiAgICBpZDogc3RyaW5nO1xuICB9O1xuXG4gIHB1YmxpYyBmaWxlczogQmluYXJ5RmlsZXMgPSB7fTtcbiAgcHVibGljIGltYWdlQ2FjaGU6IEFwcENsYXNzUHJvcGVydGllc1tcImltYWdlQ2FjaGVcIl0gPSBuZXcgTWFwKCk7XG5cbiAgaGl0TGlua0VsZW1lbnQ/OiBOb25EZWxldGVkRXhjYWxpZHJhd0VsZW1lbnQ7XG4gIGxhc3RQb2ludGVyRG93bjogUmVhY3QuUG9pbnRlckV2ZW50PEhUTUxDYW52YXNFbGVtZW50PiB8IG51bGwgPSBudWxsO1xuICBsYXN0UG9pbnRlclVwOiBSZWFjdC5Qb2ludGVyRXZlbnQ8SFRNTEVsZW1lbnQ+IHwgUG9pbnRlckV2ZW50IHwgbnVsbCA9IG51bGw7XG4gIGNvbnRleHRNZW51T3BlbjogYm9vbGVhbiA9IGZhbHNlO1xuICBsYXN0U2NlbmVQb2ludGVyOiB7IHg6IG51bWJlcjsgeTogbnVtYmVyIH0gfCBudWxsID0gbnVsbDtcblxuICBjb25zdHJ1Y3Rvcihwcm9wczogQXBwUHJvcHMpIHtcbiAgICBzdXBlcihwcm9wcyk7XG4gICAgY29uc3QgZGVmYXVsdEFwcFN0YXRlID0gZ2V0RGVmYXVsdEFwcFN0YXRlKCk7XG4gICAgY29uc3Qge1xuICAgICAgZXhjYWxpZHJhd1JlZixcbiAgICAgIHZpZXdNb2RlRW5hYmxlZCA9IGZhbHNlLFxuICAgICAgemVuTW9kZUVuYWJsZWQgPSBmYWxzZSxcbiAgICAgIGdyaWRNb2RlRW5hYmxlZCA9IGZhbHNlLFxuICAgICAgdGhlbWUgPSBkZWZhdWx0QXBwU3RhdGUudGhlbWUsXG4gICAgICBuYW1lID0gZGVmYXVsdEFwcFN0YXRlLm5hbWUsXG4gICAgfSA9IHByb3BzO1xuICAgIHRoaXMuc3RhdGUgPSB7XG4gICAgICAuLi5kZWZhdWx0QXBwU3RhdGUsXG4gICAgICB0aGVtZSxcbiAgICAgIGlzTG9hZGluZzogdHJ1ZSxcbiAgICAgIC4uLnRoaXMuZ2V0Q2FudmFzT2Zmc2V0cygpLFxuICAgICAgdmlld01vZGVFbmFibGVkLFxuICAgICAgemVuTW9kZUVuYWJsZWQsXG4gICAgICBncmlkU2l6ZTogZ3JpZE1vZGVFbmFibGVkID8gR1JJRF9TSVpFIDogbnVsbCxcbiAgICAgIG5hbWUsXG4gICAgICB3aWR0aDogd2luZG93LmlubmVyV2lkdGgsXG4gICAgICBoZWlnaHQ6IHdpbmRvdy5pbm5lckhlaWdodCxcbiAgICAgIHNob3dIeXBlcmxpbmtQb3B1cDogZmFsc2UsXG4gICAgICBpc0xpYnJhcnlNZW51RG9ja2VkOiBmYWxzZSxcbiAgICB9O1xuXG4gICAgdGhpcy5pZCA9IG5hbm9pZCgpO1xuXG4gICAgdGhpcy5saWJyYXJ5ID0gbmV3IExpYnJhcnkodGhpcyk7XG4gICAgaWYgKGV4Y2FsaWRyYXdSZWYpIHtcbiAgICAgIGNvbnN0IHJlYWR5UHJvbWlzZSA9XG4gICAgICAgIChcImN1cnJlbnRcIiBpbiBleGNhbGlkcmF3UmVmICYmIGV4Y2FsaWRyYXdSZWYuY3VycmVudD8ucmVhZHlQcm9taXNlKSB8fFxuICAgICAgICByZXNvbHZhYmxlUHJvbWlzZTxFeGNhbGlkcmF3SW1wZXJhdGl2ZUFQST4oKTtcblxuICAgICAgY29uc3QgYXBpOiBFeGNhbGlkcmF3SW1wZXJhdGl2ZUFQSSA9IHtcbiAgICAgICAgcmVhZHk6IHRydWUsXG4gICAgICAgIHJlYWR5UHJvbWlzZSxcbiAgICAgICAgdXBkYXRlU2NlbmU6IHRoaXMudXBkYXRlU2NlbmUsXG4gICAgICAgIHVwZGF0ZUxpYnJhcnk6IHRoaXMubGlicmFyeS51cGRhdGVMaWJyYXJ5LFxuICAgICAgICBhZGRGaWxlczogdGhpcy5hZGRGaWxlcyxcbiAgICAgICAgcmVzZXRTY2VuZTogdGhpcy5yZXNldFNjZW5lLFxuICAgICAgICBnZXRTY2VuZUVsZW1lbnRzSW5jbHVkaW5nRGVsZXRlZDogdGhpcy5nZXRTY2VuZUVsZW1lbnRzSW5jbHVkaW5nRGVsZXRlZCxcbiAgICAgICAgaGlzdG9yeToge1xuICAgICAgICAgIGNsZWFyOiB0aGlzLnJlc2V0SGlzdG9yeSxcbiAgICAgICAgfSxcbiAgICAgICAgc2Nyb2xsVG9Db250ZW50OiB0aGlzLnNjcm9sbFRvQ29udGVudCxcbiAgICAgICAgZ2V0U2NlbmVFbGVtZW50czogdGhpcy5nZXRTY2VuZUVsZW1lbnRzLFxuICAgICAgICBnZXRBcHBTdGF0ZTogKCkgPT4gdGhpcy5zdGF0ZSxcbiAgICAgICAgZ2V0RmlsZXM6ICgpID0+IHRoaXMuZmlsZXMsXG4gICAgICAgIHJlZnJlc2g6IHRoaXMucmVmcmVzaCxcbiAgICAgICAgc2V0VG9hc3Q6IHRoaXMuc2V0VG9hc3QsXG4gICAgICAgIGlkOiB0aGlzLmlkLFxuICAgICAgICBzZXRBY3RpdmVUb29sOiB0aGlzLnNldEFjdGl2ZVRvb2wsXG4gICAgICAgIHNldEN1cnNvcjogdGhpcy5zZXRDdXJzb3IsXG4gICAgICAgIHJlc2V0Q3Vyc29yOiB0aGlzLnJlc2V0Q3Vyc29yLFxuICAgICAgfSBhcyBjb25zdDtcbiAgICAgIGlmICh0eXBlb2YgZXhjYWxpZHJhd1JlZiA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgIGV4Y2FsaWRyYXdSZWYoYXBpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGV4Y2FsaWRyYXdSZWYuY3VycmVudCA9IGFwaTtcbiAgICAgIH1cbiAgICAgIHJlYWR5UHJvbWlzZS5yZXNvbHZlKGFwaSk7XG4gICAgfVxuXG4gICAgdGhpcy5leGNhbGlkcmF3Q29udGFpbmVyVmFsdWUgPSB7XG4gICAgICBjb250YWluZXI6IHRoaXMuZXhjYWxpZHJhd0NvbnRhaW5lclJlZi5jdXJyZW50LFxuICAgICAgaWQ6IHRoaXMuaWQsXG4gICAgfTtcblxuICAgIHRoaXMuc2NlbmUgPSBuZXcgU2NlbmUoKTtcbiAgICB0aGlzLmhpc3RvcnkgPSBuZXcgSGlzdG9yeSgpO1xuICAgIHRoaXMuYWN0aW9uTWFuYWdlciA9IG5ldyBBY3Rpb25NYW5hZ2VyKFxuICAgICAgdGhpcy5zeW5jQWN0aW9uUmVzdWx0LFxuICAgICAgKCkgPT4gdGhpcy5zdGF0ZSxcbiAgICAgICgpID0+IHRoaXMuc2NlbmUuZ2V0RWxlbWVudHNJbmNsdWRpbmdEZWxldGVkKCksXG4gICAgICB0aGlzLFxuICAgICk7XG4gICAgdGhpcy5hY3Rpb25NYW5hZ2VyLnJlZ2lzdGVyQWxsKGFjdGlvbnMpO1xuXG4gICAgdGhpcy5hY3Rpb25NYW5hZ2VyLnJlZ2lzdGVyQWN0aW9uKGNyZWF0ZVVuZG9BY3Rpb24odGhpcy5oaXN0b3J5KSk7XG4gICAgdGhpcy5hY3Rpb25NYW5hZ2VyLnJlZ2lzdGVyQWN0aW9uKGNyZWF0ZVJlZG9BY3Rpb24odGhpcy5oaXN0b3J5KSk7XG4gIH1cblxuICBwcml2YXRlIHJlbmRlckNhbnZhcygpIHtcbiAgICBjb25zdCBjYW52YXNTY2FsZSA9IHdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvO1xuICAgIGNvbnN0IHtcbiAgICAgIHdpZHRoOiBjYW52YXNET01XaWR0aCxcbiAgICAgIGhlaWdodDogY2FudmFzRE9NSGVpZ2h0LFxuICAgICAgdmlld01vZGVFbmFibGVkLFxuICAgIH0gPSB0aGlzLnN0YXRlO1xuICAgIGNvbnN0IGNhbnZhc1dpZHRoID0gY2FudmFzRE9NV2lkdGggKiBjYW52YXNTY2FsZTtcbiAgICBjb25zdCBjYW52YXNIZWlnaHQgPSBjYW52YXNET01IZWlnaHQgKiBjYW52YXNTY2FsZTtcbiAgICBpZiAodmlld01vZGVFbmFibGVkKSB7XG4gICAgICByZXR1cm4gKFxuICAgICAgICA8Y2FudmFzXG4gICAgICAgICAgY2xhc3NOYW1lPVwiZXhjYWxpZHJhd19fY2FudmFzXCJcbiAgICAgICAgICBzdHlsZT17e1xuICAgICAgICAgICAgd2lkdGg6IGNhbnZhc0RPTVdpZHRoLFxuICAgICAgICAgICAgaGVpZ2h0OiBjYW52YXNET01IZWlnaHQsXG4gICAgICAgICAgICBjdXJzb3I6IENVUlNPUl9UWVBFLkdSQUIsXG4gICAgICAgICAgfX1cbiAgICAgICAgICB3aWR0aD17Y2FudmFzV2lkdGh9XG4gICAgICAgICAgaGVpZ2h0PXtjYW52YXNIZWlnaHR9XG4gICAgICAgICAgcmVmPXt0aGlzLmhhbmRsZUNhbnZhc1JlZn1cbiAgICAgICAgICBvbkNvbnRleHRNZW51PXt0aGlzLmhhbmRsZUNhbnZhc0NvbnRleHRNZW51fVxuICAgICAgICAgIG9uUG9pbnRlck1vdmU9e3RoaXMuaGFuZGxlQ2FudmFzUG9pbnRlck1vdmV9XG4gICAgICAgICAgb25Qb2ludGVyVXA9e3RoaXMuaGFuZGxlQ2FudmFzUG9pbnRlclVwfVxuICAgICAgICAgIG9uUG9pbnRlckNhbmNlbD17dGhpcy5yZW1vdmVQb2ludGVyfVxuICAgICAgICAgIG9uVG91Y2hNb3ZlPXt0aGlzLmhhbmRsZVRvdWNoTW92ZX1cbiAgICAgICAgICBvblBvaW50ZXJEb3duPXt0aGlzLmhhbmRsZUNhbnZhc1BvaW50ZXJEb3dufVxuICAgICAgICA+XG4gICAgICAgICAge3QoXCJsYWJlbHMuZHJhd2luZ0NhbnZhc1wiKX1cbiAgICAgICAgPC9jYW52YXM+XG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gKFxuICAgICAgPGNhbnZhc1xuICAgICAgICBjbGFzc05hbWU9XCJleGNhbGlkcmF3X19jYW52YXNcIlxuICAgICAgICBzdHlsZT17e1xuICAgICAgICAgIHdpZHRoOiBjYW52YXNET01XaWR0aCxcbiAgICAgICAgICBoZWlnaHQ6IGNhbnZhc0RPTUhlaWdodCxcbiAgICAgICAgfX1cbiAgICAgICAgd2lkdGg9e2NhbnZhc1dpZHRofVxuICAgICAgICBoZWlnaHQ9e2NhbnZhc0hlaWdodH1cbiAgICAgICAgcmVmPXt0aGlzLmhhbmRsZUNhbnZhc1JlZn1cbiAgICAgICAgb25Db250ZXh0TWVudT17dGhpcy5oYW5kbGVDYW52YXNDb250ZXh0TWVudX1cbiAgICAgICAgb25Qb2ludGVyRG93bj17dGhpcy5oYW5kbGVDYW52YXNQb2ludGVyRG93bn1cbiAgICAgICAgb25Eb3VibGVDbGljaz17dGhpcy5oYW5kbGVDYW52YXNEb3VibGVDbGlja31cbiAgICAgICAgb25Qb2ludGVyTW92ZT17dGhpcy5oYW5kbGVDYW52YXNQb2ludGVyTW92ZX1cbiAgICAgICAgb25Qb2ludGVyVXA9e3RoaXMuaGFuZGxlQ2FudmFzUG9pbnRlclVwfVxuICAgICAgICBvblBvaW50ZXJDYW5jZWw9e3RoaXMucmVtb3ZlUG9pbnRlcn1cbiAgICAgICAgb25Ub3VjaE1vdmU9e3RoaXMuaGFuZGxlVG91Y2hNb3ZlfVxuICAgICAgPlxuICAgICAgICB7dChcImxhYmVscy5kcmF3aW5nQ2FudmFzXCIpfVxuICAgICAgPC9jYW52YXM+XG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyByZW5kZXIoKSB7XG4gICAgY29uc3Qgc2VsZWN0ZWRFbGVtZW50ID0gZ2V0U2VsZWN0ZWRFbGVtZW50cyhcbiAgICAgIHRoaXMuc2NlbmUuZ2V0Tm9uRGVsZXRlZEVsZW1lbnRzKCksXG4gICAgICB0aGlzLnN0YXRlLFxuICAgICk7XG4gICAgY29uc3Qge1xuICAgICAgb25Db2xsYWJCdXR0b25DbGljayxcbiAgICAgIHJlbmRlclRvcFJpZ2h0VUksXG4gICAgICByZW5kZXJGb290ZXIsXG4gICAgICByZW5kZXJDdXN0b21TdGF0cyxcbiAgICB9ID0gdGhpcy5wcm9wcztcblxuICAgIHJldHVybiAoXG4gICAgICA8ZGl2XG4gICAgICAgIGNsYXNzTmFtZT17Y2xzeChcImV4Y2FsaWRyYXcgZXhjYWxpZHJhdy1jb250YWluZXJcIiwge1xuICAgICAgICAgIFwiZXhjYWxpZHJhdy0tdmlldy1tb2RlXCI6IHRoaXMuc3RhdGUudmlld01vZGVFbmFibGVkLFxuICAgICAgICAgIFwiZXhjYWxpZHJhdy0tbW9iaWxlXCI6IHRoaXMuZGV2aWNlLmlzTW9iaWxlLFxuICAgICAgICB9KX1cbiAgICAgICAgcmVmPXt0aGlzLmV4Y2FsaWRyYXdDb250YWluZXJSZWZ9XG4gICAgICAgIG9uRHJvcD17dGhpcy5oYW5kbGVBcHBPbkRyb3B9XG4gICAgICAgIHRhYkluZGV4PXswfVxuICAgICAgICBvbktleURvd249e1xuICAgICAgICAgIHRoaXMucHJvcHMuaGFuZGxlS2V5Ym9hcmRHbG9iYWxseSA/IHVuZGVmaW5lZCA6IHRoaXMub25LZXlEb3duXG4gICAgICAgIH1cbiAgICAgID5cbiAgICAgICAgPEV4Y2FsaWRyYXdDb250YWluZXJDb250ZXh0LlByb3ZpZGVyXG4gICAgICAgICAgdmFsdWU9e3RoaXMuZXhjYWxpZHJhd0NvbnRhaW5lclZhbHVlfVxuICAgICAgICA+XG4gICAgICAgICAgPERldmljZUNvbnRleHQuUHJvdmlkZXIgdmFsdWU9e3RoaXMuZGV2aWNlfT5cbiAgICAgICAgICAgIDxMYXllclVJXG4gICAgICAgICAgICAgIGNhbnZhcz17dGhpcy5jYW52YXN9XG4gICAgICAgICAgICAgIGFwcFN0YXRlPXt0aGlzLnN0YXRlfVxuICAgICAgICAgICAgICBmaWxlcz17dGhpcy5maWxlc31cbiAgICAgICAgICAgICAgc2V0QXBwU3RhdGU9e3RoaXMuc2V0QXBwU3RhdGV9XG4gICAgICAgICAgICAgIGFjdGlvbk1hbmFnZXI9e3RoaXMuYWN0aW9uTWFuYWdlcn1cbiAgICAgICAgICAgICAgZWxlbWVudHM9e3RoaXMuc2NlbmUuZ2V0Tm9uRGVsZXRlZEVsZW1lbnRzKCl9XG4gICAgICAgICAgICAgIG9uQ29sbGFiQnV0dG9uQ2xpY2s9e29uQ29sbGFiQnV0dG9uQ2xpY2t9XG4gICAgICAgICAgICAgIG9uTG9ja1RvZ2dsZT17dGhpcy50b2dnbGVMb2NrfVxuICAgICAgICAgICAgICBvblBlbk1vZGVUb2dnbGU9e3RoaXMudG9nZ2xlUGVuTW9kZX1cbiAgICAgICAgICAgICAgb25JbnNlcnRFbGVtZW50cz17KGVsZW1lbnRzKSA9PlxuICAgICAgICAgICAgICAgIHRoaXMuYWRkRWxlbWVudHNGcm9tUGFzdGVPckxpYnJhcnkoe1xuICAgICAgICAgICAgICAgICAgZWxlbWVudHMsXG4gICAgICAgICAgICAgICAgICBwb3NpdGlvbjogXCJjZW50ZXJcIixcbiAgICAgICAgICAgICAgICAgIGZpbGVzOiBudWxsLFxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgbGFuZ0NvZGU9e2dldExhbmd1YWdlKCkuY29kZX1cbiAgICAgICAgICAgICAgaXNDb2xsYWJvcmF0aW5nPXt0aGlzLnByb3BzLmlzQ29sbGFib3JhdGluZ31cbiAgICAgICAgICAgICAgcmVuZGVyVG9wUmlnaHRVST17cmVuZGVyVG9wUmlnaHRVSX1cbiAgICAgICAgICAgICAgcmVuZGVyQ3VzdG9tRm9vdGVyPXtyZW5kZXJGb290ZXJ9XG4gICAgICAgICAgICAgIHJlbmRlckN1c3RvbVN0YXRzPXtyZW5kZXJDdXN0b21TdGF0c31cbiAgICAgICAgICAgICAgc2hvd0V4aXRaZW5Nb2RlQnRuPXtcbiAgICAgICAgICAgICAgICB0eXBlb2YgdGhpcy5wcm9wcz8uemVuTW9kZUVuYWJsZWQgPT09IFwidW5kZWZpbmVkXCIgJiZcbiAgICAgICAgICAgICAgICB0aGlzLnN0YXRlLnplbk1vZGVFbmFibGVkXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgc2hvd1RoZW1lQnRuPXtcbiAgICAgICAgICAgICAgICB0eXBlb2YgdGhpcy5wcm9wcz8udGhlbWUgPT09IFwidW5kZWZpbmVkXCIgJiZcbiAgICAgICAgICAgICAgICB0aGlzLnByb3BzLlVJT3B0aW9ucy5jYW52YXNBY3Rpb25zLnRoZW1lXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgbGlicmFyeVJldHVyblVybD17dGhpcy5wcm9wcy5saWJyYXJ5UmV0dXJuVXJsfVxuICAgICAgICAgICAgICBVSU9wdGlvbnM9e3RoaXMucHJvcHMuVUlPcHRpb25zfVxuICAgICAgICAgICAgICBmb2N1c0NvbnRhaW5lcj17dGhpcy5mb2N1c0NvbnRhaW5lcn1cbiAgICAgICAgICAgICAgbGlicmFyeT17dGhpcy5saWJyYXJ5fVxuICAgICAgICAgICAgICBpZD17dGhpcy5pZH1cbiAgICAgICAgICAgICAgb25JbWFnZUFjdGlvbj17dGhpcy5vbkltYWdlQWN0aW9ufVxuICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZXhjYWxpZHJhdy10ZXh0RWRpdG9yQ29udGFpbmVyXCIgLz5cbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZXhjYWxpZHJhdy1jb250ZXh0TWVudUNvbnRhaW5lclwiIC8+XG4gICAgICAgICAgICB7c2VsZWN0ZWRFbGVtZW50Lmxlbmd0aCA9PT0gMSAmJiB0aGlzLnN0YXRlLnNob3dIeXBlcmxpbmtQb3B1cCAmJiAoXG4gICAgICAgICAgICAgIDxIeXBlcmxpbmtcbiAgICAgICAgICAgICAgICBrZXk9e3NlbGVjdGVkRWxlbWVudFswXS5pZH1cbiAgICAgICAgICAgICAgICBlbGVtZW50PXtzZWxlY3RlZEVsZW1lbnRbMF19XG4gICAgICAgICAgICAgICAgYXBwU3RhdGU9e3RoaXMuc3RhdGV9XG4gICAgICAgICAgICAgICAgc2V0QXBwU3RhdGU9e3RoaXMuc2V0QXBwU3RhdGV9XG4gICAgICAgICAgICAgICAgb25MaW5rT3Blbj17dGhpcy5wcm9wcy5vbkxpbmtPcGVufVxuICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgKX1cbiAgICAgICAgICAgIHt0aGlzLnN0YXRlLnRvYXN0ICE9PSBudWxsICYmIChcbiAgICAgICAgICAgICAgPFRvYXN0XG4gICAgICAgICAgICAgICAgbWVzc2FnZT17dGhpcy5zdGF0ZS50b2FzdC5tZXNzYWdlfVxuICAgICAgICAgICAgICAgIG9uQ2xvc2U9eygpID0+IHRoaXMuc2V0VG9hc3QobnVsbCl9XG4gICAgICAgICAgICAgICAgZHVyYXRpb249e3RoaXMuc3RhdGUudG9hc3QuZHVyYXRpb259XG4gICAgICAgICAgICAgICAgY2xvc2FibGU9e3RoaXMuc3RhdGUudG9hc3QuY2xvc2FibGV9XG4gICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICApfVxuICAgICAgICAgICAgPG1haW4+e3RoaXMucmVuZGVyQ2FudmFzKCl9PC9tYWluPlxuICAgICAgICAgIDwvRGV2aWNlQ29udGV4dC5Qcm92aWRlcj5cbiAgICAgICAgPC9FeGNhbGlkcmF3Q29udGFpbmVyQ29udGV4dC5Qcm92aWRlcj5cbiAgICAgIDwvZGl2PlxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgZm9jdXNDb250YWluZXI6IEFwcENsYXNzUHJvcGVydGllc1tcImZvY3VzQ29udGFpbmVyXCJdID0gKCkgPT4ge1xuICAgIGlmICh0aGlzLnByb3BzLmF1dG9Gb2N1cykge1xuICAgICAgdGhpcy5leGNhbGlkcmF3Q29udGFpbmVyUmVmLmN1cnJlbnQ/LmZvY3VzKCk7XG4gICAgfVxuICB9O1xuXG4gIHB1YmxpYyBnZXRTY2VuZUVsZW1lbnRzSW5jbHVkaW5nRGVsZXRlZCA9ICgpID0+IHtcbiAgICByZXR1cm4gdGhpcy5zY2VuZS5nZXRFbGVtZW50c0luY2x1ZGluZ0RlbGV0ZWQoKTtcbiAgfTtcblxuICBwdWJsaWMgZ2V0U2NlbmVFbGVtZW50cyA9ICgpID0+IHtcbiAgICByZXR1cm4gdGhpcy5zY2VuZS5nZXROb25EZWxldGVkRWxlbWVudHMoKTtcbiAgfTtcblxuICBwcml2YXRlIHN5bmNBY3Rpb25SZXN1bHQgPSB3aXRoQmF0Y2hlZFVwZGF0ZXMoXG4gICAgKGFjdGlvblJlc3VsdDogQWN0aW9uUmVzdWx0KSA9PiB7XG4gICAgICAvLyBTaW5jZSBjb250ZXh0IG1lbnUgY2xvc2VzIHdoZW4gYWN0aW9uIHRyaWdnZXJlZCBzbyBzZXR0aW5nIHRvIGZhbHNlXG4gICAgICB0aGlzLmNvbnRleHRNZW51T3BlbiA9IGZhbHNlO1xuICAgICAgaWYgKHRoaXMudW5tb3VudGVkIHx8IGFjdGlvblJlc3VsdCA9PT0gZmFsc2UpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBsZXQgZWRpdGluZ0VsZW1lbnQ6IEFwcFN0YXRlW1wiZWRpdGluZ0VsZW1lbnRcIl0gfCBudWxsID0gbnVsbDtcbiAgICAgIGlmIChhY3Rpb25SZXN1bHQuZWxlbWVudHMpIHtcbiAgICAgICAgYWN0aW9uUmVzdWx0LmVsZW1lbnRzLmZvckVhY2goKGVsZW1lbnQpID0+IHtcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICB0aGlzLnN0YXRlLmVkaXRpbmdFbGVtZW50Py5pZCA9PT0gZWxlbWVudC5pZCAmJlxuICAgICAgICAgICAgdGhpcy5zdGF0ZS5lZGl0aW5nRWxlbWVudCAhPT0gZWxlbWVudCAmJlxuICAgICAgICAgICAgaXNOb25EZWxldGVkRWxlbWVudChlbGVtZW50KVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgZWRpdGluZ0VsZW1lbnQgPSBlbGVtZW50O1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuc2NlbmUucmVwbGFjZUFsbEVsZW1lbnRzKGFjdGlvblJlc3VsdC5lbGVtZW50cyk7XG4gICAgICAgIGlmIChhY3Rpb25SZXN1bHQuY29tbWl0VG9IaXN0b3J5KSB7XG4gICAgICAgICAgdGhpcy5oaXN0b3J5LnJlc3VtZVJlY29yZGluZygpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChhY3Rpb25SZXN1bHQuZmlsZXMpIHtcbiAgICAgICAgdGhpcy5maWxlcyA9IGFjdGlvblJlc3VsdC5yZXBsYWNlRmlsZXNcbiAgICAgICAgICA/IGFjdGlvblJlc3VsdC5maWxlc1xuICAgICAgICAgIDogeyAuLi50aGlzLmZpbGVzLCAuLi5hY3Rpb25SZXN1bHQuZmlsZXMgfTtcbiAgICAgICAgdGhpcy5hZGROZXdJbWFnZXNUb0ltYWdlQ2FjaGUoKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGFjdGlvblJlc3VsdC5hcHBTdGF0ZSB8fCBlZGl0aW5nRWxlbWVudCkge1xuICAgICAgICBpZiAoYWN0aW9uUmVzdWx0LmNvbW1pdFRvSGlzdG9yeSkge1xuICAgICAgICAgIHRoaXMuaGlzdG9yeS5yZXN1bWVSZWNvcmRpbmcoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCB2aWV3TW9kZUVuYWJsZWQgPSBhY3Rpb25SZXN1bHQ/LmFwcFN0YXRlPy52aWV3TW9kZUVuYWJsZWQgfHwgZmFsc2U7XG4gICAgICAgIGxldCB6ZW5Nb2RlRW5hYmxlZCA9IGFjdGlvblJlc3VsdD8uYXBwU3RhdGU/Lnplbk1vZGVFbmFibGVkIHx8IGZhbHNlO1xuICAgICAgICBsZXQgZ3JpZFNpemUgPSBhY3Rpb25SZXN1bHQ/LmFwcFN0YXRlPy5ncmlkU2l6ZSB8fCBudWxsO1xuICAgICAgICBsZXQgdGhlbWUgPSBhY3Rpb25SZXN1bHQ/LmFwcFN0YXRlPy50aGVtZSB8fCBUSEVNRS5MSUdIVDtcbiAgICAgICAgbGV0IG5hbWUgPSBhY3Rpb25SZXN1bHQ/LmFwcFN0YXRlPy5uYW1lID8/IHRoaXMuc3RhdGUubmFtZTtcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLnByb3BzLnZpZXdNb2RlRW5hYmxlZCAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICAgIHZpZXdNb2RlRW5hYmxlZCA9IHRoaXMucHJvcHMudmlld01vZGVFbmFibGVkO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLnByb3BzLnplbk1vZGVFbmFibGVkICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgICAgemVuTW9kZUVuYWJsZWQgPSB0aGlzLnByb3BzLnplbk1vZGVFbmFibGVkO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLnByb3BzLmdyaWRNb2RlRW5hYmxlZCAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICAgIGdyaWRTaXplID0gdGhpcy5wcm9wcy5ncmlkTW9kZUVuYWJsZWQgPyBHUklEX1NJWkUgOiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLnByb3BzLnRoZW1lICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgICAgdGhlbWUgPSB0aGlzLnByb3BzLnRoZW1lO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLnByb3BzLm5hbWUgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgICBuYW1lID0gdGhpcy5wcm9wcy5uYW1lO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoXG4gICAgICAgICAgKHN0YXRlKSA9PiB7XG4gICAgICAgICAgICAvLyB1c2luZyBPYmplY3QuYXNzaWduIGluc3RlYWQgb2Ygc3ByZWFkIHRvIGZvb2wgVFMgNC4yLjIrIGludG9cbiAgICAgICAgICAgIC8vIHJlZ2FyZGluZyB0aGUgcmVzdWx0aW5nIHR5cGUgYXMgbm90IGNvbnRhaW5pbmcgdW5kZWZpbmVkXG4gICAgICAgICAgICAvLyAod2hpY2ggdGhlIGZvbGxvd2luZyBleHByZXNzaW9uIHdpbGwgbmV2ZXIgY29udGFpbilcbiAgICAgICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKGFjdGlvblJlc3VsdC5hcHBTdGF0ZSB8fCB7fSwge1xuICAgICAgICAgICAgICBlZGl0aW5nRWxlbWVudDpcbiAgICAgICAgICAgICAgICBlZGl0aW5nRWxlbWVudCB8fCBhY3Rpb25SZXN1bHQuYXBwU3RhdGU/LmVkaXRpbmdFbGVtZW50IHx8IG51bGwsXG4gICAgICAgICAgICAgIHZpZXdNb2RlRW5hYmxlZCxcbiAgICAgICAgICAgICAgemVuTW9kZUVuYWJsZWQsXG4gICAgICAgICAgICAgIGdyaWRTaXplLFxuICAgICAgICAgICAgICB0aGVtZSxcbiAgICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgaWYgKGFjdGlvblJlc3VsdC5zeW5jSGlzdG9yeSkge1xuICAgICAgICAgICAgICB0aGlzLmhpc3Rvcnkuc2V0Q3VycmVudFN0YXRlKFxuICAgICAgICAgICAgICAgIHRoaXMuc3RhdGUsXG4gICAgICAgICAgICAgICAgdGhpcy5zY2VuZS5nZXRFbGVtZW50c0luY2x1ZGluZ0RlbGV0ZWQoKSxcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH0sXG4gICk7XG5cbiAgLy8gTGlmZWN5Y2xlXG5cbiAgcHJpdmF0ZSBvbkJsdXIgPSB3aXRoQmF0Y2hlZFVwZGF0ZXMoKCkgPT4ge1xuICAgIGlzSG9sZGluZ1NwYWNlID0gZmFsc2U7XG4gICAgdGhpcy5zZXRTdGF0ZSh7IGlzQmluZGluZ0VuYWJsZWQ6IHRydWUgfSk7XG4gIH0pO1xuXG4gIHByaXZhdGUgb25VbmxvYWQgPSAoKSA9PiB7XG4gICAgdGhpcy5vbkJsdXIoKTtcbiAgfTtcblxuICBwcml2YXRlIGRpc2FibGVFdmVudDogRXZlbnRMaXN0ZW5lciA9IChldmVudCkgPT4ge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gIH07XG5cbiAgcHJpdmF0ZSBvbkZvbnRMb2FkZWQgPSAoKSA9PiB7XG4gICAgdGhpcy5zY2VuZS5nZXRFbGVtZW50c0luY2x1ZGluZ0RlbGV0ZWQoKS5mb3JFYWNoKChlbGVtZW50KSA9PiB7XG4gICAgICBpZiAoaXNUZXh0RWxlbWVudChlbGVtZW50KSkge1xuICAgICAgICBpbnZhbGlkYXRlU2hhcGVGb3JFbGVtZW50KGVsZW1lbnQpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHRoaXMub25TY2VuZVVwZGF0ZWQoKTtcbiAgfTtcblxuICBwcml2YXRlIHJlc2V0SGlzdG9yeSA9ICgpID0+IHtcbiAgICB0aGlzLmhpc3RvcnkuY2xlYXIoKTtcbiAgfTtcblxuICAvKipcbiAgICogUmVzZXRzIHNjZW5lICYgaGlzdG9yeS5cbiAgICogISBEbyBub3QgdXNlIHRvIGNsZWFyIHNjZW5lIHVzZXIgYWN0aW9uICFcbiAgICovXG4gIHByaXZhdGUgcmVzZXRTY2VuZSA9IHdpdGhCYXRjaGVkVXBkYXRlcyhcbiAgICAob3B0cz86IHsgcmVzZXRMb2FkaW5nU3RhdGU6IGJvb2xlYW4gfSkgPT4ge1xuICAgICAgdGhpcy5zY2VuZS5yZXBsYWNlQWxsRWxlbWVudHMoW10pO1xuICAgICAgdGhpcy5zZXRTdGF0ZSgoc3RhdGUpID0+ICh7XG4gICAgICAgIC4uLmdldERlZmF1bHRBcHBTdGF0ZSgpLFxuICAgICAgICBpc0xvYWRpbmc6IG9wdHM/LnJlc2V0TG9hZGluZ1N0YXRlID8gZmFsc2UgOiBzdGF0ZS5pc0xvYWRpbmcsXG4gICAgICAgIHRoZW1lOiB0aGlzLnN0YXRlLnRoZW1lLFxuICAgICAgfSkpO1xuICAgICAgdGhpcy5yZXNldEhpc3RvcnkoKTtcbiAgICB9LFxuICApO1xuXG4gIHByaXZhdGUgaW5pdGlhbGl6ZVNjZW5lID0gYXN5bmMgKCkgPT4ge1xuICAgIGlmIChcImxhdW5jaFF1ZXVlXCIgaW4gd2luZG93ICYmIFwiTGF1bmNoUGFyYW1zXCIgaW4gd2luZG93KSB7XG4gICAgICAod2luZG93IGFzIGFueSkubGF1bmNoUXVldWUuc2V0Q29uc3VtZXIoXG4gICAgICAgIGFzeW5jIChsYXVuY2hQYXJhbXM6IHsgZmlsZXM6IGFueVtdIH0pID0+IHtcbiAgICAgICAgICBpZiAoIWxhdW5jaFBhcmFtcy5maWxlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgZmlsZUhhbmRsZSA9IGxhdW5jaFBhcmFtcy5maWxlc1swXTtcbiAgICAgICAgICBjb25zdCBibG9iOiBCbG9iID0gYXdhaXQgZmlsZUhhbmRsZS5nZXRGaWxlKCk7XG4gICAgICAgICAgdGhpcy5sb2FkRmlsZVRvQ2FudmFzKFxuICAgICAgICAgICAgbmV3IEZpbGUoW2Jsb2JdLCBibG9iLm5hbWUgfHwgXCJcIiwgeyB0eXBlOiBibG9iLnR5cGUgfSksXG4gICAgICAgICAgICBmaWxlSGFuZGxlLFxuICAgICAgICAgICk7XG4gICAgICAgIH0sXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5zdGF0ZS5pc0xvYWRpbmcpIHtcbiAgICAgIHRoaXMuc2V0U3RhdGUoeyBpc0xvYWRpbmc6IHRydWUgfSk7XG4gICAgfVxuICAgIGxldCBpbml0aWFsRGF0YSA9IG51bGw7XG4gICAgdHJ5IHtcbiAgICAgIGluaXRpYWxEYXRhID0gKGF3YWl0IHRoaXMucHJvcHMuaW5pdGlhbERhdGEpIHx8IG51bGw7XG4gICAgICBpZiAoaW5pdGlhbERhdGE/LmxpYnJhcnlJdGVtcykge1xuICAgICAgICB0aGlzLmxpYnJhcnlcbiAgICAgICAgICAudXBkYXRlTGlicmFyeSh7XG4gICAgICAgICAgICBsaWJyYXJ5SXRlbXM6IGluaXRpYWxEYXRhLmxpYnJhcnlJdGVtcyxcbiAgICAgICAgICAgIG1lcmdlOiB0cnVlLFxuICAgICAgICAgIH0pXG4gICAgICAgICAgLmNhdGNoKChlcnJvcikgPT4ge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XG4gICAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XG4gICAgICBpbml0aWFsRGF0YSA9IHtcbiAgICAgICAgYXBwU3RhdGU6IHtcbiAgICAgICAgICBlcnJvck1lc3NhZ2U6XG4gICAgICAgICAgICBlcnJvci5tZXNzYWdlIHx8XG4gICAgICAgICAgICBcIkVuY291bnRlcmVkIGFuIGVycm9yIGR1cmluZyBpbXBvcnRpbmcgb3IgcmVzdG9yaW5nIHNjZW5lIGRhdGFcIixcbiAgICAgICAgfSxcbiAgICAgIH07XG4gICAgfVxuICAgIGNvbnN0IHNjZW5lID0gcmVzdG9yZShpbml0aWFsRGF0YSwgbnVsbCwgbnVsbCk7XG4gICAgc2NlbmUuYXBwU3RhdGUgPSB7XG4gICAgICAuLi5zY2VuZS5hcHBTdGF0ZSxcbiAgICAgIC8vIHdlJ3JlIGZhbGxpbmcgYmFjayB0byBjdXJyZW50IChwcmUtaW5pdCkgc3RhdGUgd2hlbiBkZWNpZGluZ1xuICAgICAgLy8gd2hldGhlciB0byBvcGVuIHRoZSBsaWJyYXJ5LCB0byBoYW5kbGUgYSBjYXNlIHdoZXJlIHdlXG4gICAgICAvLyB1cGRhdGUgdGhlIHN0YXRlIG91dHNpZGUgb2YgaW5pdGlhbERhdGEgKGUuZy4gd2hlbiBsb2FkaW5nIHRoZSBhcHBcbiAgICAgIC8vIHdpdGggYSBsaWJyYXJ5IGluc3RhbGwgbGluaywgd2hpY2ggc2hvdWxkIGF1dG8tb3BlbiB0aGUgbGlicmFyeSlcbiAgICAgIGlzTGlicmFyeU9wZW46XG4gICAgICAgIGluaXRpYWxEYXRhPy5hcHBTdGF0ZT8uaXNMaWJyYXJ5T3BlbiB8fCB0aGlzLnN0YXRlLmlzTGlicmFyeU9wZW4sXG4gICAgICBhY3RpdmVUb29sOlxuICAgICAgICBzY2VuZS5hcHBTdGF0ZS5hY3RpdmVUb29sLnR5cGUgPT09IFwiaW1hZ2VcIlxuICAgICAgICAgID8geyAuLi5zY2VuZS5hcHBTdGF0ZS5hY3RpdmVUb29sLCB0eXBlOiBcInNlbGVjdGlvblwiIH1cbiAgICAgICAgICA6IHNjZW5lLmFwcFN0YXRlLmFjdGl2ZVRvb2wsXG4gICAgICBpc0xvYWRpbmc6IGZhbHNlLFxuICAgICAgdG9hc3Q6IHRoaXMuc3RhdGUudG9hc3QsXG4gICAgfTtcbiAgICBpZiAoaW5pdGlhbERhdGE/LnNjcm9sbFRvQ29udGVudCkge1xuICAgICAgc2NlbmUuYXBwU3RhdGUgPSB7XG4gICAgICAgIC4uLnNjZW5lLmFwcFN0YXRlLFxuICAgICAgICAuLi5jYWxjdWxhdGVTY3JvbGxDZW50ZXIoXG4gICAgICAgICAgc2NlbmUuZWxlbWVudHMsXG4gICAgICAgICAge1xuICAgICAgICAgICAgLi4uc2NlbmUuYXBwU3RhdGUsXG4gICAgICAgICAgICB3aWR0aDogdGhpcy5zdGF0ZS53aWR0aCxcbiAgICAgICAgICAgIGhlaWdodDogdGhpcy5zdGF0ZS5oZWlnaHQsXG4gICAgICAgICAgICBvZmZzZXRUb3A6IHRoaXMuc3RhdGUub2Zmc2V0VG9wLFxuICAgICAgICAgICAgb2Zmc2V0TGVmdDogdGhpcy5zdGF0ZS5vZmZzZXRMZWZ0LFxuICAgICAgICAgIH0sXG4gICAgICAgICAgbnVsbCxcbiAgICAgICAgKSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgdGhpcy5yZXNldEhpc3RvcnkoKTtcbiAgICB0aGlzLnN5bmNBY3Rpb25SZXN1bHQoe1xuICAgICAgLi4uc2NlbmUsXG4gICAgICBjb21taXRUb0hpc3Rvcnk6IHRydWUsXG4gICAgfSk7XG4gIH07XG5cbiAgcHJpdmF0ZSByZWZyZXNoRGV2aWNlU3RhdGUgPSAoY29udGFpbmVyOiBIVE1MRGl2RWxlbWVudCkgPT4ge1xuICAgIGNvbnN0IHsgd2lkdGgsIGhlaWdodCB9ID0gY29udGFpbmVyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIGNvbnN0IHNpZGViYXJCcmVha3BvaW50ID1cbiAgICAgIHRoaXMucHJvcHMuVUlPcHRpb25zLmRvY2tlZFNpZGViYXJCcmVha3BvaW50ICE9IG51bGxcbiAgICAgICAgPyB0aGlzLnByb3BzLlVJT3B0aW9ucy5kb2NrZWRTaWRlYmFyQnJlYWtwb2ludFxuICAgICAgICA6IE1RX1JJR0hUX1NJREVCQVJfTUlOX1dJRFRIO1xuICAgIHRoaXMuZGV2aWNlID0gdXBkYXRlT2JqZWN0KHRoaXMuZGV2aWNlLCB7XG4gICAgICBpc1NtU2NyZWVuOiB3aWR0aCA8IE1RX1NNX01BWF9XSURUSCxcbiAgICAgIGlzTW9iaWxlOlxuICAgICAgICB3aWR0aCA8IE1RX01BWF9XSURUSF9QT1JUUkFJVCB8fFxuICAgICAgICAoaGVpZ2h0IDwgTVFfTUFYX0hFSUdIVF9MQU5EU0NBUEUgJiYgd2lkdGggPCBNUV9NQVhfV0lEVEhfTEFORFNDQVBFKSxcbiAgICAgIGNhbkRldmljZUZpdFNpZGViYXI6IHdpZHRoID4gc2lkZWJhckJyZWFrcG9pbnQsXG4gICAgfSk7XG4gIH07XG5cbiAgcHVibGljIGFzeW5jIGNvbXBvbmVudERpZE1vdW50KCkge1xuICAgIHRoaXMudW5tb3VudGVkID0gZmFsc2U7XG4gICAgdGhpcy5leGNhbGlkcmF3Q29udGFpbmVyVmFsdWUuY29udGFpbmVyID1cbiAgICAgIHRoaXMuZXhjYWxpZHJhd0NvbnRhaW5lclJlZi5jdXJyZW50O1xuXG4gICAgaWYgKFxuICAgICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IEVOVi5URVNUIHx8XG4gICAgICBwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gRU5WLkRFVkVMT1BNRU5UXG4gICAgKSB7XG4gICAgICBjb25zdCBzZXRTdGF0ZSA9IHRoaXMuc2V0U3RhdGUuYmluZCh0aGlzKTtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHdpbmRvdy5oLCB7XG4gICAgICAgIHN0YXRlOiB7XG4gICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgIGdldDogKCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuc3RhdGU7XG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAgc2V0U3RhdGU6IHtcbiAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgdmFsdWU6ICguLi5hcmdzOiBQYXJhbWV0ZXJzPHR5cGVvZiBzZXRTdGF0ZT4pID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnNldFN0YXRlKC4uLmFyZ3MpO1xuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICAgIGFwcDoge1xuICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICB2YWx1ZTogdGhpcyxcbiAgICAgICAgfSxcbiAgICAgICAgaGlzdG9yeToge1xuICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICB2YWx1ZTogdGhpcy5oaXN0b3J5LFxuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgdGhpcy5zY2VuZS5hZGRDYWxsYmFjayh0aGlzLm9uU2NlbmVVcGRhdGVkKTtcbiAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXJzKCk7XG5cbiAgICBpZiAodGhpcy5leGNhbGlkcmF3Q29udGFpbmVyUmVmLmN1cnJlbnQpIHtcbiAgICAgIHRoaXMuZm9jdXNDb250YWluZXIoKTtcbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICB0aGlzLmV4Y2FsaWRyYXdDb250YWluZXJSZWYuY3VycmVudCAmJlxuICAgICAgLy8gYm91bmRpbmcgcmVjdHMgZG9uJ3Qgd29yayBpbiB0ZXN0cyBzbyB1cGRhdGluZ1xuICAgICAgLy8gdGhlIHN0YXRlIG9uIGluaXQgd291bGQgcmVzdWx0IGluIG1ha2luZyB0aGUgdGVzdCBlbnZpcm8gcnVuXG4gICAgICAvLyBpbiBtb2JpbGUgYnJlYWtwb2ludCAoMCB3aWR0aC9oZWlnaHQpLCBtYWtpbmcgZXZlcnl0aGluZyBmYWlsXG4gICAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJ0ZXN0XCJcbiAgICApIHtcbiAgICAgIHRoaXMucmVmcmVzaERldmljZVN0YXRlKHRoaXMuZXhjYWxpZHJhd0NvbnRhaW5lclJlZi5jdXJyZW50KTtcbiAgICB9XG5cbiAgICBpZiAoXCJSZXNpemVPYnNlcnZlclwiIGluIHdpbmRvdyAmJiB0aGlzLmV4Y2FsaWRyYXdDb250YWluZXJSZWY/LmN1cnJlbnQpIHtcbiAgICAgIHRoaXMucmVzaXplT2JzZXJ2ZXIgPSBuZXcgUmVzaXplT2JzZXJ2ZXIoKCkgPT4ge1xuICAgICAgICBUSFJPVFRMRV9ORVhUX1JFTkRFUiA9IGZhbHNlO1xuICAgICAgICAvLyByZWNvbXB1dGUgZGV2aWNlIGRpbWVuc2lvbnMgc3RhdGVcbiAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgICAgIHRoaXMucmVmcmVzaERldmljZVN0YXRlKHRoaXMuZXhjYWxpZHJhd0NvbnRhaW5lclJlZi5jdXJyZW50ISk7XG4gICAgICAgIC8vIHJlZnJlc2ggb2Zmc2V0c1xuICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAgICAgdGhpcy51cGRhdGVET01SZWN0KCk7XG4gICAgICB9KTtcbiAgICAgIHRoaXMucmVzaXplT2JzZXJ2ZXI/Lm9ic2VydmUodGhpcy5leGNhbGlkcmF3Q29udGFpbmVyUmVmLmN1cnJlbnQpO1xuICAgIH0gZWxzZSBpZiAod2luZG93Lm1hdGNoTWVkaWEpIHtcbiAgICAgIGNvbnN0IG1kU2NyZWVuUXVlcnkgPSB3aW5kb3cubWF0Y2hNZWRpYShcbiAgICAgICAgYChtYXgtd2lkdGg6ICR7TVFfTUFYX1dJRFRIX1BPUlRSQUlUfXB4KSwgKG1heC1oZWlnaHQ6ICR7TVFfTUFYX0hFSUdIVF9MQU5EU0NBUEV9cHgpIGFuZCAobWF4LXdpZHRoOiAke01RX01BWF9XSURUSF9MQU5EU0NBUEV9cHgpYCxcbiAgICAgICk7XG4gICAgICBjb25zdCBzbVNjcmVlblF1ZXJ5ID0gd2luZG93Lm1hdGNoTWVkaWEoXG4gICAgICAgIGAobWF4LXdpZHRoOiAke01RX1NNX01BWF9XSURUSH1weClgLFxuICAgICAgKTtcbiAgICAgIGNvbnN0IGNhbkRldmljZUZpdFNpZGViYXJNZWRpYVF1ZXJ5ID0gd2luZG93Lm1hdGNoTWVkaWEoXG4gICAgICAgIGAobWluLXdpZHRoOiAke1xuICAgICAgICAgIC8vIE5PVEUgdGhpcyB3b24ndCB1cGRhdGUgaWYgYSBkaWZmZXJlbnQgYnJlYWtwb2ludCBpcyBzdXBwbGllZFxuICAgICAgICAgIC8vIGFmdGVyIG1vdW50XG4gICAgICAgICAgdGhpcy5wcm9wcy5VSU9wdGlvbnMuZG9ja2VkU2lkZWJhckJyZWFrcG9pbnQgIT0gbnVsbFxuICAgICAgICAgICAgPyB0aGlzLnByb3BzLlVJT3B0aW9ucy5kb2NrZWRTaWRlYmFyQnJlYWtwb2ludFxuICAgICAgICAgICAgOiBNUV9SSUdIVF9TSURFQkFSX01JTl9XSURUSFxuICAgICAgICB9cHgpYCxcbiAgICAgICk7XG4gICAgICBjb25zdCBoYW5kbGVyID0gKCkgPT4ge1xuICAgICAgICB0aGlzLmV4Y2FsaWRyYXdDb250YWluZXJSZWYuY3VycmVudCEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgIHRoaXMuZGV2aWNlID0gdXBkYXRlT2JqZWN0KHRoaXMuZGV2aWNlLCB7XG4gICAgICAgICAgaXNTbVNjcmVlbjogc21TY3JlZW5RdWVyeS5tYXRjaGVzLFxuICAgICAgICAgIGlzTW9iaWxlOiBtZFNjcmVlblF1ZXJ5Lm1hdGNoZXMsXG4gICAgICAgICAgY2FuRGV2aWNlRml0U2lkZWJhcjogY2FuRGV2aWNlRml0U2lkZWJhck1lZGlhUXVlcnkubWF0Y2hlcyxcbiAgICAgICAgfSk7XG4gICAgICB9O1xuICAgICAgbWRTY3JlZW5RdWVyeS5hZGRMaXN0ZW5lcihoYW5kbGVyKTtcbiAgICAgIHRoaXMuZGV0YWNoSXNNb2JpbGVNcUhhbmRsZXIgPSAoKSA9PlxuICAgICAgICBtZFNjcmVlblF1ZXJ5LnJlbW92ZUxpc3RlbmVyKGhhbmRsZXIpO1xuICAgIH1cblxuICAgIGNvbnN0IHNlYXJjaFBhcmFtcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXMod2luZG93LmxvY2F0aW9uLnNlYXJjaC5zbGljZSgxKSk7XG5cbiAgICBpZiAoc2VhcmNoUGFyYW1zLmhhcyhcIndlYi1zaGFyZS10YXJnZXRcIikpIHtcbiAgICAgIC8vIE9idGFpbiBhIGZpbGUgdGhhdCB3YXMgc2hhcmVkIHZpYSB0aGUgV2ViIFNoYXJlIFRhcmdldCBBUEkuXG4gICAgICB0aGlzLnJlc3RvcmVGaWxlRnJvbVNoYXJlKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMudXBkYXRlRE9NUmVjdCh0aGlzLmluaXRpYWxpemVTY2VuZSk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGNvbXBvbmVudFdpbGxVbm1vdW50KCkge1xuICAgIHRoaXMuZmlsZXMgPSB7fTtcbiAgICB0aGlzLmltYWdlQ2FjaGUuY2xlYXIoKTtcbiAgICB0aGlzLnJlc2l6ZU9ic2VydmVyPy5kaXNjb25uZWN0KCk7XG4gICAgdGhpcy51bm1vdW50ZWQgPSB0cnVlO1xuICAgIHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcnMoKTtcbiAgICB0aGlzLnNjZW5lLmRlc3Ryb3koKTtcbiAgICBjbGVhclRpbWVvdXQodG91Y2hUaW1lb3V0KTtcbiAgICB0b3VjaFRpbWVvdXQgPSAwO1xuICB9XG5cbiAgcHJpdmF0ZSBvblJlc2l6ZSA9IHdpdGhCYXRjaGVkVXBkYXRlcygoKSA9PiB7XG4gICAgdGhpcy5zY2VuZVxuICAgICAgLmdldEVsZW1lbnRzSW5jbHVkaW5nRGVsZXRlZCgpXG4gICAgICAuZm9yRWFjaCgoZWxlbWVudCkgPT4gaW52YWxpZGF0ZVNoYXBlRm9yRWxlbWVudChlbGVtZW50KSk7XG4gICAgdGhpcy5zZXRTdGF0ZSh7fSk7XG4gIH0pO1xuXG4gIHByaXZhdGUgcmVtb3ZlRXZlbnRMaXN0ZW5lcnMoKSB7XG4gICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihFVkVOVC5QT0lOVEVSX1VQLCB0aGlzLnJlbW92ZVBvaW50ZXIpO1xuICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoRVZFTlQuQ09QWSwgdGhpcy5vbkNvcHkpO1xuICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoRVZFTlQuUEFTVEUsIHRoaXMucGFzdGVGcm9tQ2xpcGJvYXJkKTtcbiAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKEVWRU5ULkNVVCwgdGhpcy5vbkN1dCk7XG4gICAgdGhpcy5leGNhbGlkcmF3Q29udGFpbmVyUmVmLmN1cnJlbnQ/LnJlbW92ZUV2ZW50TGlzdGVuZXIoXG4gICAgICBFVkVOVC5XSEVFTCxcbiAgICAgIHRoaXMub25XaGVlbCxcbiAgICApO1xuICAgIHRoaXMubmVhcmVzdFNjcm9sbGFibGVDb250YWluZXI/LnJlbW92ZUV2ZW50TGlzdGVuZXIoXG4gICAgICBFVkVOVC5TQ1JPTEwsXG4gICAgICB0aGlzLm9uU2Nyb2xsLFxuICAgICk7XG4gICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihFVkVOVC5LRVlET1dOLCB0aGlzLm9uS2V5RG93biwgZmFsc2UpO1xuICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXG4gICAgICBFVkVOVC5NT1VTRV9NT1ZFLFxuICAgICAgdGhpcy51cGRhdGVDdXJyZW50Q3Vyc29yUG9zaXRpb24sXG4gICAgICBmYWxzZSxcbiAgICApO1xuICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoRVZFTlQuS0VZVVAsIHRoaXMub25LZXlVcCk7XG4gICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoRVZFTlQuUkVTSVpFLCB0aGlzLm9uUmVzaXplLCBmYWxzZSk7XG4gICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoRVZFTlQuVU5MT0FELCB0aGlzLm9uVW5sb2FkLCBmYWxzZSk7XG4gICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoRVZFTlQuQkxVUiwgdGhpcy5vbkJsdXIsIGZhbHNlKTtcbiAgICB0aGlzLmV4Y2FsaWRyYXdDb250YWluZXJSZWYuY3VycmVudD8ucmVtb3ZlRXZlbnRMaXN0ZW5lcihcbiAgICAgIEVWRU5ULkRSQUdfT1ZFUixcbiAgICAgIHRoaXMuZGlzYWJsZUV2ZW50LFxuICAgICAgZmFsc2UsXG4gICAgKTtcbiAgICB0aGlzLmV4Y2FsaWRyYXdDb250YWluZXJSZWYuY3VycmVudD8ucmVtb3ZlRXZlbnRMaXN0ZW5lcihcbiAgICAgIEVWRU5ULkRST1AsXG4gICAgICB0aGlzLmRpc2FibGVFdmVudCxcbiAgICAgIGZhbHNlLFxuICAgICk7XG5cbiAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFxuICAgICAgRVZFTlQuR0VTVFVSRV9TVEFSVCxcbiAgICAgIHRoaXMub25HZXN0dXJlU3RhcnQgYXMgYW55LFxuICAgICAgZmFsc2UsXG4gICAgKTtcbiAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFxuICAgICAgRVZFTlQuR0VTVFVSRV9DSEFOR0UsXG4gICAgICB0aGlzLm9uR2VzdHVyZUNoYW5nZSBhcyBhbnksXG4gICAgICBmYWxzZSxcbiAgICApO1xuICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXG4gICAgICBFVkVOVC5HRVNUVVJFX0VORCxcbiAgICAgIHRoaXMub25HZXN0dXJlRW5kIGFzIGFueSxcbiAgICAgIGZhbHNlLFxuICAgICk7XG5cbiAgICB0aGlzLmRldGFjaElzTW9iaWxlTXFIYW5kbGVyPy4oKTtcbiAgfVxuXG4gIHByaXZhdGUgYWRkRXZlbnRMaXN0ZW5lcnMoKSB7XG4gICAgdGhpcy5yZW1vdmVFdmVudExpc3RlbmVycygpO1xuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoRVZFTlQuUE9JTlRFUl9VUCwgdGhpcy5yZW1vdmVQb2ludGVyKTsgLy8gIzM1NTNcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKEVWRU5ULkNPUFksIHRoaXMub25Db3B5KTtcbiAgICB0aGlzLmV4Y2FsaWRyYXdDb250YWluZXJSZWYuY3VycmVudD8uYWRkRXZlbnRMaXN0ZW5lcihcbiAgICAgIEVWRU5ULldIRUVMLFxuICAgICAgdGhpcy5vbldoZWVsLFxuICAgICAgeyBwYXNzaXZlOiBmYWxzZSB9LFxuICAgICk7XG5cbiAgICBpZiAodGhpcy5wcm9wcy5oYW5kbGVLZXlib2FyZEdsb2JhbGx5KSB7XG4gICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKEVWRU5ULktFWURPV04sIHRoaXMub25LZXlEb3duLCBmYWxzZSk7XG4gICAgfVxuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoRVZFTlQuS0VZVVAsIHRoaXMub25LZXlVcCwgeyBwYXNzaXZlOiB0cnVlIH0pO1xuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXG4gICAgICBFVkVOVC5NT1VTRV9NT1ZFLFxuICAgICAgdGhpcy51cGRhdGVDdXJyZW50Q3Vyc29yUG9zaXRpb24sXG4gICAgKTtcbiAgICAvLyByZXJlbmRlciB0ZXh0IGVsZW1lbnRzIG9uIGZvbnQgbG9hZCB0byBmaXggIzYzNyAmJiAjMTU1M1xuICAgIGRvY3VtZW50LmZvbnRzPy5hZGRFdmVudExpc3RlbmVyPy4oXCJsb2FkaW5nZG9uZVwiLCB0aGlzLm9uRm9udExvYWRlZCk7XG4gICAgLy8gU2FmYXJpLW9ubHkgZGVza3RvcCBwaW5jaCB6b29tXG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcbiAgICAgIEVWRU5ULkdFU1RVUkVfU1RBUlQsXG4gICAgICB0aGlzLm9uR2VzdHVyZVN0YXJ0IGFzIGFueSxcbiAgICAgIGZhbHNlLFxuICAgICk7XG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcbiAgICAgIEVWRU5ULkdFU1RVUkVfQ0hBTkdFLFxuICAgICAgdGhpcy5vbkdlc3R1cmVDaGFuZ2UgYXMgYW55LFxuICAgICAgZmFsc2UsXG4gICAgKTtcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFxuICAgICAgRVZFTlQuR0VTVFVSRV9FTkQsXG4gICAgICB0aGlzLm9uR2VzdHVyZUVuZCBhcyBhbnksXG4gICAgICBmYWxzZSxcbiAgICApO1xuICAgIGlmICh0aGlzLnN0YXRlLnZpZXdNb2RlRW5hYmxlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoRVZFTlQuUEFTVEUsIHRoaXMucGFzdGVGcm9tQ2xpcGJvYXJkKTtcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKEVWRU5ULkNVVCwgdGhpcy5vbkN1dCk7XG4gICAgaWYgKHRoaXMucHJvcHMuZGV0ZWN0U2Nyb2xsKSB7XG4gICAgICB0aGlzLm5lYXJlc3RTY3JvbGxhYmxlQ29udGFpbmVyID0gZ2V0TmVhcmVzdFNjcm9sbGFibGVDb250YWluZXIoXG4gICAgICAgIHRoaXMuZXhjYWxpZHJhd0NvbnRhaW5lclJlZi5jdXJyZW50ISxcbiAgICAgICk7XG4gICAgICB0aGlzLm5lYXJlc3RTY3JvbGxhYmxlQ29udGFpbmVyLmFkZEV2ZW50TGlzdGVuZXIoXG4gICAgICAgIEVWRU5ULlNDUk9MTCxcbiAgICAgICAgdGhpcy5vblNjcm9sbCxcbiAgICAgICk7XG4gICAgfVxuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKEVWRU5ULlJFU0laRSwgdGhpcy5vblJlc2l6ZSwgZmFsc2UpO1xuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKEVWRU5ULlVOTE9BRCwgdGhpcy5vblVubG9hZCwgZmFsc2UpO1xuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKEVWRU5ULkJMVVIsIHRoaXMub25CbHVyLCBmYWxzZSk7XG4gICAgdGhpcy5leGNhbGlkcmF3Q29udGFpbmVyUmVmLmN1cnJlbnQ/LmFkZEV2ZW50TGlzdGVuZXIoXG4gICAgICBFVkVOVC5EUkFHX09WRVIsXG4gICAgICB0aGlzLmRpc2FibGVFdmVudCxcbiAgICAgIGZhbHNlLFxuICAgICk7XG4gICAgdGhpcy5leGNhbGlkcmF3Q29udGFpbmVyUmVmLmN1cnJlbnQ/LmFkZEV2ZW50TGlzdGVuZXIoXG4gICAgICBFVkVOVC5EUk9QLFxuICAgICAgdGhpcy5kaXNhYmxlRXZlbnQsXG4gICAgICBmYWxzZSxcbiAgICApO1xuICB9XG5cbiAgY29tcG9uZW50RGlkVXBkYXRlKHByZXZQcm9wczogQXBwUHJvcHMsIHByZXZTdGF0ZTogQXBwU3RhdGUpIHtcbiAgICBpZiAoXG4gICAgICB0aGlzLmV4Y2FsaWRyYXdDb250YWluZXJSZWYuY3VycmVudCAmJlxuICAgICAgcHJldlByb3BzLlVJT3B0aW9ucy5kb2NrZWRTaWRlYmFyQnJlYWtwb2ludCAhPT1cbiAgICAgICAgdGhpcy5wcm9wcy5VSU9wdGlvbnMuZG9ja2VkU2lkZWJhckJyZWFrcG9pbnRcbiAgICApIHtcbiAgICAgIHRoaXMucmVmcmVzaERldmljZVN0YXRlKHRoaXMuZXhjYWxpZHJhd0NvbnRhaW5lclJlZi5jdXJyZW50KTtcbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICBwcmV2U3RhdGUuc2Nyb2xsWCAhPT0gdGhpcy5zdGF0ZS5zY3JvbGxYIHx8XG4gICAgICBwcmV2U3RhdGUuc2Nyb2xsWSAhPT0gdGhpcy5zdGF0ZS5zY3JvbGxZXG4gICAgKSB7XG4gICAgICB0aGlzLnByb3BzPy5vblNjcm9sbENoYW5nZT8uKHRoaXMuc3RhdGUuc2Nyb2xsWCwgdGhpcy5zdGF0ZS5zY3JvbGxZKTtcbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICBPYmplY3Qua2V5cyh0aGlzLnN0YXRlLnNlbGVjdGVkRWxlbWVudElkcykubGVuZ3RoICYmXG4gICAgICBpc0VyYXNlckFjdGl2ZSh0aGlzLnN0YXRlKVxuICAgICkge1xuICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgIGFjdGl2ZVRvb2w6IHVwZGF0ZUFjdGl2ZVRvb2wodGhpcy5zdGF0ZSwgeyB0eXBlOiBcInNlbGVjdGlvblwiIH0pLFxuICAgICAgfSk7XG4gICAgfVxuICAgIGlmIChcbiAgICAgIHRoaXMuc3RhdGUuYWN0aXZlVG9vbC50eXBlID09PSBcImVyYXNlclwiICYmXG4gICAgICBwcmV2U3RhdGUudGhlbWUgIT09IHRoaXMuc3RhdGUudGhlbWVcbiAgICApIHtcbiAgICAgIHNldEVyYXNlckN1cnNvcih0aGlzLmNhbnZhcywgdGhpcy5zdGF0ZS50aGVtZSk7XG4gICAgfVxuICAgIC8vIEhpZGUgaHlwZXJsaW5rIHBvcHVwIGlmIHNob3duIHdoZW4gZWxlbWVudCB0eXBlIGlzIG5vdCBzZWxlY3Rpb25cbiAgICBpZiAoXG4gICAgICBwcmV2U3RhdGUuYWN0aXZlVG9vbC50eXBlID09PSBcInNlbGVjdGlvblwiICYmXG4gICAgICB0aGlzLnN0YXRlLmFjdGl2ZVRvb2wudHlwZSAhPT0gXCJzZWxlY3Rpb25cIiAmJlxuICAgICAgdGhpcy5zdGF0ZS5zaG93SHlwZXJsaW5rUG9wdXBcbiAgICApIHtcbiAgICAgIHRoaXMuc2V0U3RhdGUoeyBzaG93SHlwZXJsaW5rUG9wdXA6IGZhbHNlIH0pO1xuICAgIH1cbiAgICBpZiAocHJldlByb3BzLmxhbmdDb2RlICE9PSB0aGlzLnByb3BzLmxhbmdDb2RlKSB7XG4gICAgICB0aGlzLnVwZGF0ZUxhbmd1YWdlKCk7XG4gICAgfVxuXG4gICAgaWYgKHByZXZQcm9wcy52aWV3TW9kZUVuYWJsZWQgIT09IHRoaXMucHJvcHMudmlld01vZGVFbmFibGVkKSB7XG4gICAgICB0aGlzLnNldFN0YXRlKHsgdmlld01vZGVFbmFibGVkOiAhIXRoaXMucHJvcHMudmlld01vZGVFbmFibGVkIH0pO1xuICAgIH1cblxuICAgIGlmIChwcmV2U3RhdGUudmlld01vZGVFbmFibGVkICE9PSB0aGlzLnN0YXRlLnZpZXdNb2RlRW5hYmxlZCkge1xuICAgICAgdGhpcy5hZGRFdmVudExpc3RlbmVycygpO1xuICAgICAgdGhpcy5kZXNlbGVjdEVsZW1lbnRzKCk7XG4gICAgfVxuXG4gICAgaWYgKHByZXZQcm9wcy56ZW5Nb2RlRW5hYmxlZCAhPT0gdGhpcy5wcm9wcy56ZW5Nb2RlRW5hYmxlZCkge1xuICAgICAgdGhpcy5zZXRTdGF0ZSh7IHplbk1vZGVFbmFibGVkOiAhIXRoaXMucHJvcHMuemVuTW9kZUVuYWJsZWQgfSk7XG4gICAgfVxuXG4gICAgaWYgKHByZXZQcm9wcy50aGVtZSAhPT0gdGhpcy5wcm9wcy50aGVtZSAmJiB0aGlzLnByb3BzLnRoZW1lKSB7XG4gICAgICB0aGlzLnNldFN0YXRlKHsgdGhlbWU6IHRoaXMucHJvcHMudGhlbWUgfSk7XG4gICAgfVxuXG4gICAgaWYgKHByZXZQcm9wcy5ncmlkTW9kZUVuYWJsZWQgIT09IHRoaXMucHJvcHMuZ3JpZE1vZGVFbmFibGVkKSB7XG4gICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgZ3JpZFNpemU6IHRoaXMucHJvcHMuZ3JpZE1vZGVFbmFibGVkID8gR1JJRF9TSVpFIDogbnVsbCxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnByb3BzLm5hbWUgJiYgcHJldlByb3BzLm5hbWUgIT09IHRoaXMucHJvcHMubmFtZSkge1xuICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgIG5hbWU6IHRoaXMucHJvcHMubmFtZSxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHRoaXMuZXhjYWxpZHJhd0NvbnRhaW5lclJlZi5jdXJyZW50Py5jbGFzc0xpc3QudG9nZ2xlKFxuICAgICAgXCJ0aGVtZS0tZGFya1wiLFxuICAgICAgdGhpcy5zdGF0ZS50aGVtZSA9PT0gXCJkYXJrXCIsXG4gICAgKTtcblxuICAgIGlmIChcbiAgICAgIHRoaXMuc3RhdGUuZWRpdGluZ0xpbmVhckVsZW1lbnQgJiZcbiAgICAgICF0aGlzLnN0YXRlLnNlbGVjdGVkRWxlbWVudElkc1t0aGlzLnN0YXRlLmVkaXRpbmdMaW5lYXJFbGVtZW50LmVsZW1lbnRJZF1cbiAgICApIHtcbiAgICAgIC8vIGRlZmVyIHNvIHRoYXQgdGhlIGNvbW1pdFRvSGlzdG9yeSBmbGFnIGlzbid0IHJlc2V0IHZpYSBjdXJyZW50IHVwZGF0ZVxuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHRoaXMuYWN0aW9uTWFuYWdlci5leGVjdXRlQWN0aW9uKGFjdGlvbkZpbmFsaXplKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICBjb25zdCB7IG11bHRpRWxlbWVudCB9ID0gcHJldlN0YXRlO1xuICAgIGlmIChcbiAgICAgIHByZXZTdGF0ZS5hY3RpdmVUb29sICE9PSB0aGlzLnN0YXRlLmFjdGl2ZVRvb2wgJiZcbiAgICAgIG11bHRpRWxlbWVudCAhPSBudWxsICYmXG4gICAgICBpc0JpbmRpbmdFbmFibGVkKHRoaXMuc3RhdGUpICYmXG4gICAgICBpc0JpbmRpbmdFbGVtZW50KG11bHRpRWxlbWVudCwgZmFsc2UpXG4gICAgKSB7XG4gICAgICBtYXliZUJpbmRMaW5lYXJFbGVtZW50KFxuICAgICAgICBtdWx0aUVsZW1lbnQsXG4gICAgICAgIHRoaXMuc3RhdGUsXG4gICAgICAgIHRoaXMuc2NlbmUsXG4gICAgICAgIHR1cGxlVG9Db29ycyhcbiAgICAgICAgICBMaW5lYXJFbGVtZW50RWRpdG9yLmdldFBvaW50QXRJbmRleEdsb2JhbENvb3JkaW5hdGVzKFxuICAgICAgICAgICAgbXVsdGlFbGVtZW50LFxuICAgICAgICAgICAgLTEsXG4gICAgICAgICAgKSxcbiAgICAgICAgKSxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgY29uc3QgY3Vyc29yQnV0dG9uOiB7XG4gICAgICBbaWQ6IHN0cmluZ106IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICB9ID0ge307XG4gICAgY29uc3QgcG9pbnRlclZpZXdwb3J0Q29vcmRzOiBSZW5kZXJDb25maWdbXCJyZW1vdGVQb2ludGVyVmlld3BvcnRDb29yZHNcIl0gPVxuICAgICAge307XG4gICAgY29uc3QgcmVtb3RlU2VsZWN0ZWRFbGVtZW50SWRzOiBSZW5kZXJDb25maWdbXCJyZW1vdGVTZWxlY3RlZEVsZW1lbnRJZHNcIl0gPVxuICAgICAge307XG4gICAgY29uc3QgcG9pbnRlclVzZXJuYW1lczogeyBbaWQ6IHN0cmluZ106IHN0cmluZyB9ID0ge307XG4gICAgY29uc3QgcG9pbnRlclVzZXJTdGF0ZXM6IHsgW2lkOiBzdHJpbmddOiBzdHJpbmcgfSA9IHt9O1xuICAgIHRoaXMuc3RhdGUuY29sbGFib3JhdG9ycy5mb3JFYWNoKCh1c2VyLCBzb2NrZXRJZCkgPT4ge1xuICAgICAgaWYgKHVzZXIuc2VsZWN0ZWRFbGVtZW50SWRzKSB7XG4gICAgICAgIGZvciAoY29uc3QgaWQgb2YgT2JqZWN0LmtleXModXNlci5zZWxlY3RlZEVsZW1lbnRJZHMpKSB7XG4gICAgICAgICAgaWYgKCEoaWQgaW4gcmVtb3RlU2VsZWN0ZWRFbGVtZW50SWRzKSkge1xuICAgICAgICAgICAgcmVtb3RlU2VsZWN0ZWRFbGVtZW50SWRzW2lkXSA9IFtdO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZW1vdGVTZWxlY3RlZEVsZW1lbnRJZHNbaWRdLnB1c2goc29ja2V0SWQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoIXVzZXIucG9pbnRlcikge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAodXNlci51c2VybmFtZSkge1xuICAgICAgICBwb2ludGVyVXNlcm5hbWVzW3NvY2tldElkXSA9IHVzZXIudXNlcm5hbWU7XG4gICAgICB9XG4gICAgICBpZiAodXNlci51c2VyU3RhdGUpIHtcbiAgICAgICAgcG9pbnRlclVzZXJTdGF0ZXNbc29ja2V0SWRdID0gdXNlci51c2VyU3RhdGU7XG4gICAgICB9XG4gICAgICBwb2ludGVyVmlld3BvcnRDb29yZHNbc29ja2V0SWRdID0gc2NlbmVDb29yZHNUb1ZpZXdwb3J0Q29vcmRzKFxuICAgICAgICB7XG4gICAgICAgICAgc2NlbmVYOiB1c2VyLnBvaW50ZXIueCxcbiAgICAgICAgICBzY2VuZVk6IHVzZXIucG9pbnRlci55LFxuICAgICAgICB9LFxuICAgICAgICB0aGlzLnN0YXRlLFxuICAgICAgKTtcbiAgICAgIGN1cnNvckJ1dHRvbltzb2NrZXRJZF0gPSB1c2VyLmJ1dHRvbjtcbiAgICB9KTtcbiAgICBjb25zdCByZW5kZXJpbmdFbGVtZW50cyA9IHRoaXMuc2NlbmVcbiAgICAgIC5nZXROb25EZWxldGVkRWxlbWVudHMoKVxuICAgICAgLmZpbHRlcigoZWxlbWVudCkgPT4ge1xuICAgICAgICBpZiAoaXNJbWFnZUVsZW1lbnQoZWxlbWVudCkpIHtcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAvLyBub3QgcGxhY2VkIG9uIGNhbnZhcyB5ZXQgKGJ1dCBpbiBlbGVtZW50cyBhcnJheSlcbiAgICAgICAgICAgIHRoaXMuc3RhdGUucGVuZGluZ0ltYWdlRWxlbWVudElkID09PSBlbGVtZW50LmlkXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIGRvbid0IHJlbmRlciB0ZXh0IGVsZW1lbnQgdGhhdCdzIGJlaW5nIGN1cnJlbnRseSBlZGl0ZWQgKGl0J3NcbiAgICAgICAgLy8gcmVuZGVyZWQgb24gcmVtb3RlIG9ubHkpXG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgIXRoaXMuc3RhdGUuZWRpdGluZ0VsZW1lbnQgfHxcbiAgICAgICAgICB0aGlzLnN0YXRlLmVkaXRpbmdFbGVtZW50LnR5cGUgIT09IFwidGV4dFwiIHx8XG4gICAgICAgICAgZWxlbWVudC5pZCAhPT0gdGhpcy5zdGF0ZS5lZGl0aW5nRWxlbWVudC5pZFxuICAgICAgICApO1xuICAgICAgfSk7XG5cbiAgICByZW5kZXJTY2VuZShcbiAgICAgIHJlbmRlcmluZ0VsZW1lbnRzLFxuICAgICAgdGhpcy5zdGF0ZSxcbiAgICAgIHRoaXMuc3RhdGUuc2VsZWN0aW9uRWxlbWVudCxcbiAgICAgIHdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvLFxuICAgICAgdGhpcy5yYyEsXG4gICAgICB0aGlzLmNhbnZhcyEsXG4gICAgICB7XG4gICAgICAgIHNjcm9sbFg6IHRoaXMuc3RhdGUuc2Nyb2xsWCxcbiAgICAgICAgc2Nyb2xsWTogdGhpcy5zdGF0ZS5zY3JvbGxZLFxuICAgICAgICB2aWV3QmFja2dyb3VuZENvbG9yOiB0aGlzLnN0YXRlLnZpZXdCYWNrZ3JvdW5kQ29sb3IsXG4gICAgICAgIHpvb206IHRoaXMuc3RhdGUuem9vbSxcbiAgICAgICAgcmVtb3RlUG9pbnRlclZpZXdwb3J0Q29vcmRzOiBwb2ludGVyVmlld3BvcnRDb29yZHMsXG4gICAgICAgIHJlbW90ZVBvaW50ZXJCdXR0b246IGN1cnNvckJ1dHRvbixcbiAgICAgICAgcmVtb3RlU2VsZWN0ZWRFbGVtZW50SWRzLFxuICAgICAgICByZW1vdGVQb2ludGVyVXNlcm5hbWVzOiBwb2ludGVyVXNlcm5hbWVzLFxuICAgICAgICByZW1vdGVQb2ludGVyVXNlclN0YXRlczogcG9pbnRlclVzZXJTdGF0ZXMsXG4gICAgICAgIHNob3VsZENhY2hlSWdub3JlWm9vbTogdGhpcy5zdGF0ZS5zaG91bGRDYWNoZUlnbm9yZVpvb20sXG4gICAgICAgIHRoZW1lOiB0aGlzLnN0YXRlLnRoZW1lLFxuICAgICAgICBpbWFnZUNhY2hlOiB0aGlzLmltYWdlQ2FjaGUsXG4gICAgICAgIGlzRXhwb3J0aW5nOiBmYWxzZSxcbiAgICAgICAgcmVuZGVyU2Nyb2xsYmFyczogIXRoaXMuZGV2aWNlLmlzTW9iaWxlLFxuICAgICAgfSxcbiAgICAgICh7IGF0TGVhc3RPbmVWaXNpYmxlRWxlbWVudCwgc2Nyb2xsQmFycyB9KSA9PiB7XG4gICAgICAgIGlmIChzY3JvbGxCYXJzKSB7XG4gICAgICAgICAgY3VycmVudFNjcm9sbEJhcnMgPSBzY3JvbGxCYXJzO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHNjcm9sbGVkT3V0c2lkZSA9XG4gICAgICAgICAgLy8gaGlkZSB3aGVuIGVkaXRpbmcgdGV4dFxuICAgICAgICAgIGlzVGV4dEVsZW1lbnQodGhpcy5zdGF0ZS5lZGl0aW5nRWxlbWVudClcbiAgICAgICAgICAgID8gZmFsc2VcbiAgICAgICAgICAgIDogIWF0TGVhc3RPbmVWaXNpYmxlRWxlbWVudCAmJiByZW5kZXJpbmdFbGVtZW50cy5sZW5ndGggPiAwO1xuICAgICAgICBpZiAodGhpcy5zdGF0ZS5zY3JvbGxlZE91dHNpZGUgIT09IHNjcm9sbGVkT3V0c2lkZSkge1xuICAgICAgICAgIHRoaXMuc2V0U3RhdGUoeyBzY3JvbGxlZE91dHNpZGUgfSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnNjaGVkdWxlSW1hZ2VSZWZyZXNoKCk7XG4gICAgICB9LFxuICAgICAgVEhST1RUTEVfTkVYVF9SRU5ERVIgJiYgd2luZG93LkVYQ0FMSURSQVdfVEhST1RUTEVfUkVOREVSID09PSB0cnVlLFxuICAgICk7XG5cbiAgICBpZiAoIVRIUk9UVExFX05FWFRfUkVOREVSKSB7XG4gICAgICBUSFJPVFRMRV9ORVhUX1JFTkRFUiA9IHRydWU7XG4gICAgfVxuXG4gICAgdGhpcy5oaXN0b3J5LnJlY29yZCh0aGlzLnN0YXRlLCB0aGlzLnNjZW5lLmdldEVsZW1lbnRzSW5jbHVkaW5nRGVsZXRlZCgpKTtcblxuICAgIC8vIERvIG5vdCBub3RpZnkgY29uc3VtZXJzIGlmIHdlJ3JlIHN0aWxsIGxvYWRpbmcgdGhlIHNjZW5lLiBBbW9uZyBvdGhlclxuICAgIC8vIHBvdGVudGlhbCBpc3N1ZXMsIHRoaXMgZml4ZXMgYSBjYXNlIHdoZXJlIHRoZSB0YWIgaXNuJ3QgZm9jdXNlZCBkdXJpbmdcbiAgICAvLyBpbml0LCB3aGljaCB3b3VsZCB0cmlnZ2VyIG9uQ2hhbmdlIHdpdGggZW1wdHkgZWxlbWVudHMsIHdoaWNoIHdvdWxkIHRoZW5cbiAgICAvLyBvdmVycmlkZSB3aGF0ZXZlciBpcyBpbiBsb2NhbFN0b3JhZ2UgY3VycmVudGx5LlxuICAgIGlmICghdGhpcy5zdGF0ZS5pc0xvYWRpbmcpIHtcbiAgICAgIHRoaXMucHJvcHMub25DaGFuZ2U/LihcbiAgICAgICAgdGhpcy5zY2VuZS5nZXRFbGVtZW50c0luY2x1ZGluZ0RlbGV0ZWQoKSxcbiAgICAgICAgdGhpcy5zdGF0ZSxcbiAgICAgICAgdGhpcy5maWxlcyxcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBvblNjcm9sbCA9IGRlYm91bmNlKCgpID0+IHtcbiAgICBjb25zdCB7IG9mZnNldFRvcCwgb2Zmc2V0TGVmdCB9ID0gdGhpcy5nZXRDYW52YXNPZmZzZXRzKCk7XG4gICAgdGhpcy5zZXRTdGF0ZSgoc3RhdGUpID0+IHtcbiAgICAgIGlmIChzdGF0ZS5vZmZzZXRMZWZ0ID09PSBvZmZzZXRMZWZ0ICYmIHN0YXRlLm9mZnNldFRvcCA9PT0gb2Zmc2V0VG9wKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHsgb2Zmc2V0VG9wLCBvZmZzZXRMZWZ0IH07XG4gICAgfSk7XG4gIH0sIFNDUk9MTF9USU1FT1VUKTtcblxuICAvLyBDb3B5L3Bhc3RlXG5cbiAgcHJpdmF0ZSBvbkN1dCA9IHdpdGhCYXRjaGVkVXBkYXRlcygoZXZlbnQ6IENsaXBib2FyZEV2ZW50KSA9PiB7XG4gICAgY29uc3QgaXNFeGNhbGlkcmF3QWN0aXZlID0gdGhpcy5leGNhbGlkcmF3Q29udGFpbmVyUmVmLmN1cnJlbnQ/LmNvbnRhaW5zKFxuICAgICAgZG9jdW1lbnQuYWN0aXZlRWxlbWVudCxcbiAgICApO1xuICAgIGlmICghaXNFeGNhbGlkcmF3QWN0aXZlIHx8IGlzV3JpdGFibGVFbGVtZW50KGV2ZW50LnRhcmdldCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5jdXRBbGwoKTtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICB9KTtcblxuICBwcml2YXRlIG9uQ29weSA9IHdpdGhCYXRjaGVkVXBkYXRlcygoZXZlbnQ6IENsaXBib2FyZEV2ZW50KSA9PiB7XG4gICAgY29uc3QgaXNFeGNhbGlkcmF3QWN0aXZlID0gdGhpcy5leGNhbGlkcmF3Q29udGFpbmVyUmVmLmN1cnJlbnQ/LmNvbnRhaW5zKFxuICAgICAgZG9jdW1lbnQuYWN0aXZlRWxlbWVudCxcbiAgICApO1xuICAgIGlmICghaXNFeGNhbGlkcmF3QWN0aXZlIHx8IGlzV3JpdGFibGVFbGVtZW50KGV2ZW50LnRhcmdldCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5jb3B5QWxsKCk7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgfSk7XG5cbiAgcHJpdmF0ZSBjdXRBbGwgPSAoKSA9PiB7XG4gICAgdGhpcy5hY3Rpb25NYW5hZ2VyLmV4ZWN1dGVBY3Rpb24oYWN0aW9uQ3V0LCBcImtleWJvYXJkXCIpO1xuICB9O1xuXG4gIHByaXZhdGUgY29weUFsbCA9ICgpID0+IHtcbiAgICB0aGlzLmFjdGlvbk1hbmFnZXIuZXhlY3V0ZUFjdGlvbihhY3Rpb25Db3B5LCBcImtleWJvYXJkXCIpO1xuICB9O1xuXG4gIHByaXZhdGUgc3RhdGljIHJlc2V0VGFwVHdpY2UoKSB7XG4gICAgZGlkVGFwVHdpY2UgPSBmYWxzZTtcbiAgfVxuXG4gIHByaXZhdGUgb25UYXBTdGFydCA9IChldmVudDogVG91Y2hFdmVudCkgPT4ge1xuICAgIC8vIGZpeCBmb3IgQXBwbGUgUGVuY2lsIFNjcmliYmxlXG4gICAgLy8gT24gQW5kcm9pZCwgcHJldmVudGluZyB0aGUgZXZlbnQgd291bGQgZGlzYWJsZSBjb250ZXh0TWVudSBvbiB0YXAtaG9sZFxuICAgIGlmICghaXNBbmRyb2lkKSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH1cblxuICAgIGlmICghZGlkVGFwVHdpY2UpIHtcbiAgICAgIGRpZFRhcFR3aWNlID0gdHJ1ZTtcbiAgICAgIGNsZWFyVGltZW91dCh0YXBwZWRUd2ljZVRpbWVyKTtcbiAgICAgIHRhcHBlZFR3aWNlVGltZXIgPSB3aW5kb3cuc2V0VGltZW91dChcbiAgICAgICAgQXBwLnJlc2V0VGFwVHdpY2UsXG4gICAgICAgIFRBUF9UV0lDRV9USU1FT1VULFxuICAgICAgKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8gaW5zZXJ0IHRleHQgb25seSBpZiB3ZSB0YXBwZWQgdHdpY2Ugd2l0aCBhIHNpbmdsZSBmaW5nZXJcbiAgICAvLyBldmVudC50b3VjaGVzLmxlbmd0aCA9PT0gMSB3aWxsIGFsc28gcHJldmVudCBpbnNlcnRpbmcgdGV4dCB3aGVuIHVzZXIncyB6b29taW5nXG4gICAgaWYgKGRpZFRhcFR3aWNlICYmIGV2ZW50LnRvdWNoZXMubGVuZ3RoID09PSAxKSB7XG4gICAgICBjb25zdCBbdG91Y2hdID0gZXZlbnQudG91Y2hlcztcbiAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgIHRoaXMuaGFuZGxlQ2FudmFzRG91YmxlQ2xpY2soe1xuICAgICAgICBjbGllbnRYOiB0b3VjaC5jbGllbnRYLFxuICAgICAgICBjbGllbnRZOiB0b3VjaC5jbGllbnRZLFxuICAgICAgfSk7XG4gICAgICBkaWRUYXBUd2ljZSA9IGZhbHNlO1xuICAgICAgY2xlYXJUaW1lb3V0KHRhcHBlZFR3aWNlVGltZXIpO1xuICAgIH1cbiAgICBpZiAoaXNBbmRyb2lkKSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH1cblxuICAgIGlmIChldmVudC50b3VjaGVzLmxlbmd0aCA9PT0gMikge1xuICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgIHNlbGVjdGVkRWxlbWVudElkczoge30sXG4gICAgICB9KTtcbiAgICB9XG4gIH07XG5cbiAgcHJpdmF0ZSBvblRhcEVuZCA9IChldmVudDogVG91Y2hFdmVudCkgPT4ge1xuICAgIHRoaXMucmVzZXRDb250ZXh0TWVudVRpbWVyKCk7XG4gICAgaWYgKGV2ZW50LnRvdWNoZXMubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgIHByZXZpb3VzU2VsZWN0ZWRFbGVtZW50SWRzOiB7fSxcbiAgICAgICAgc2VsZWN0ZWRFbGVtZW50SWRzOiB0aGlzLnN0YXRlLnByZXZpb3VzU2VsZWN0ZWRFbGVtZW50SWRzLFxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGdlc3R1cmUucG9pbnRlcnMuY2xlYXIoKTtcbiAgICB9XG4gIH07XG5cbiAgcHJpdmF0ZSBwYXN0ZUZyb21DbGlwYm9hcmQgPSB3aXRoQmF0Y2hlZFVwZGF0ZXMoXG4gICAgYXN5bmMgKGV2ZW50OiBDbGlwYm9hcmRFdmVudCB8IG51bGwpID0+IHtcbiAgICAgIC8vICM2ODZcbiAgICAgIGNvbnN0IHRhcmdldCA9IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ7XG4gICAgICBjb25zdCBpc0V4Y2FsaWRyYXdBY3RpdmUgPVxuICAgICAgICB0aGlzLmV4Y2FsaWRyYXdDb250YWluZXJSZWYuY3VycmVudD8uY29udGFpbnModGFyZ2V0KTtcbiAgICAgIGlmICghaXNFeGNhbGlkcmF3QWN0aXZlKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZWxlbWVudFVuZGVyQ3Vyc29yID0gZG9jdW1lbnQuZWxlbWVudEZyb21Qb2ludChjdXJzb3JYLCBjdXJzb3JZKTtcbiAgICAgIGlmIChcbiAgICAgICAgLy8gaWYgbm8gQ2xpcGJvYXJkRXZlbnQgc3VwcGxpZWQsIGFzc3VtZSB3ZSdyZSBwYXN0aW5nIHZpYSBjb250ZXh0TWVudVxuICAgICAgICAvLyB0aHVzIHRoZXNlIGNoZWNrcyBkb24ndCBtYWtlIHNlbnNlXG4gICAgICAgIGV2ZW50ICYmXG4gICAgICAgICghKGVsZW1lbnRVbmRlckN1cnNvciBpbnN0YW5jZW9mIEhUTUxDYW52YXNFbGVtZW50KSB8fFxuICAgICAgICAgIGlzV3JpdGFibGVFbGVtZW50KHRhcmdldCkpXG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyBtdXN0IGJlIGNhbGxlZCBpbiB0aGUgc2FtZSBmcmFtZSAodGh1cyBiZWZvcmUgYW55IGF3YWl0cykgYXMgdGhlIHBhc3RlXG4gICAgICAvLyBldmVudCBlbHNlIHNvbWUgYnJvd3NlcnMgKEZGLi4uKSB3aWxsIGNsZWFyIHRoZSBjbGlwYm9hcmREYXRhXG4gICAgICAvLyAoc29tZXRoaW5nIHNvbWV0aGluZyBzZWN1cml0eSlcbiAgICAgIGxldCBmaWxlID0gZXZlbnQ/LmNsaXBib2FyZERhdGE/LmZpbGVzWzBdO1xuXG4gICAgICBjb25zdCBkYXRhID0gYXdhaXQgcGFyc2VDbGlwYm9hcmQoZXZlbnQpO1xuXG4gICAgICBpZiAoIWZpbGUgJiYgZGF0YS50ZXh0KSB7XG4gICAgICAgIGNvbnN0IHN0cmluZyA9IGRhdGEudGV4dC50cmltKCk7XG4gICAgICAgIGlmIChzdHJpbmcuc3RhcnRzV2l0aChcIjxzdmdcIikgJiYgc3RyaW5nLmVuZHNXaXRoKFwiPC9zdmc+XCIpKSB7XG4gICAgICAgICAgLy8gaWdub3JlIFNWRyB2YWxpZGF0aW9uL25vcm1hbGl6YXRpb24gd2hpY2ggd2lsbCBiZSBkb25lIGR1cmluZyBpbWFnZVxuICAgICAgICAgIC8vIGluaXRpYWxpemF0aW9uXG4gICAgICAgICAgZmlsZSA9IFNWR1N0cmluZ1RvRmlsZShzdHJpbmcpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIHByZWZlciBzcHJlYWRzaGVldCBkYXRhIG92ZXIgaW1hZ2UgZmlsZSAoTVMgT2ZmaWNlL0xpYnJlIE9mZmljZSlcbiAgICAgIGlmIChpc1N1cHBvcnRlZEltYWdlRmlsZShmaWxlKSAmJiAhZGF0YS5zcHJlYWRzaGVldCkge1xuICAgICAgICBjb25zdCB7IHg6IHNjZW5lWCwgeTogc2NlbmVZIH0gPSB2aWV3cG9ydENvb3Jkc1RvU2NlbmVDb29yZHMoXG4gICAgICAgICAgeyBjbGllbnRYOiBjdXJzb3JYLCBjbGllbnRZOiBjdXJzb3JZIH0sXG4gICAgICAgICAgdGhpcy5zdGF0ZSxcbiAgICAgICAgKTtcblxuICAgICAgICBjb25zdCBpbWFnZUVsZW1lbnQgPSB0aGlzLmNyZWF0ZUltYWdlRWxlbWVudCh7IHNjZW5lWCwgc2NlbmVZIH0pO1xuICAgICAgICB0aGlzLmluc2VydEltYWdlRWxlbWVudChpbWFnZUVsZW1lbnQsIGZpbGUpO1xuICAgICAgICB0aGlzLmluaXRpYWxpemVJbWFnZURpbWVuc2lvbnMoaW1hZ2VFbGVtZW50KTtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7IHNlbGVjdGVkRWxlbWVudElkczogeyBbaW1hZ2VFbGVtZW50LmlkXTogdHJ1ZSB9IH0pO1xuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMucHJvcHMub25QYXN0ZSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGlmICgoYXdhaXQgdGhpcy5wcm9wcy5vblBhc3RlKGRhdGEsIGV2ZW50KSkgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChkYXRhLmVycm9yTWVzc2FnZSkge1xuICAgICAgICB0aGlzLnNldFN0YXRlKHsgZXJyb3JNZXNzYWdlOiBkYXRhLmVycm9yTWVzc2FnZSB9KTtcbiAgICAgIH0gZWxzZSBpZiAoZGF0YS5zcHJlYWRzaGVldCkge1xuICAgICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgICBwYXN0ZURpYWxvZzoge1xuICAgICAgICAgICAgZGF0YTogZGF0YS5zcHJlYWRzaGVldCxcbiAgICAgICAgICAgIHNob3duOiB0cnVlLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIGlmIChkYXRhLmVsZW1lbnRzKSB7XG4gICAgICAgIHRoaXMuYWRkRWxlbWVudHNGcm9tUGFzdGVPckxpYnJhcnkoe1xuICAgICAgICAgIGVsZW1lbnRzOiBkYXRhLmVsZW1lbnRzLFxuICAgICAgICAgIGZpbGVzOiBkYXRhLmZpbGVzIHx8IG51bGwsXG4gICAgICAgICAgcG9zaXRpb246IFwiY3Vyc29yXCIsXG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIGlmIChkYXRhLnRleHQpIHtcbiAgICAgICAgdGhpcy5hZGRUZXh0RnJvbVBhc3RlKGRhdGEudGV4dCk7XG4gICAgICB9XG4gICAgICB0aGlzLnNldEFjdGl2ZVRvb2woeyB0eXBlOiBcInNlbGVjdGlvblwiIH0pO1xuICAgICAgZXZlbnQ/LnByZXZlbnREZWZhdWx0KCk7XG4gICAgfSxcbiAgKTtcblxuICBwcml2YXRlIGFkZEVsZW1lbnRzRnJvbVBhc3RlT3JMaWJyYXJ5ID0gKG9wdHM6IHtcbiAgICBlbGVtZW50czogcmVhZG9ubHkgRXhjYWxpZHJhd0VsZW1lbnRbXTtcbiAgICBmaWxlczogQmluYXJ5RmlsZXMgfCBudWxsO1xuICAgIHBvc2l0aW9uOiB7IGNsaWVudFg6IG51bWJlcjsgY2xpZW50WTogbnVtYmVyIH0gfCBcImN1cnNvclwiIHwgXCJjZW50ZXJcIjtcbiAgfSkgPT4ge1xuICAgIGNvbnN0IGVsZW1lbnRzID0gcmVzdG9yZUVsZW1lbnRzKG9wdHMuZWxlbWVudHMsIG51bGwpO1xuICAgIGNvbnN0IFttaW5YLCBtaW5ZLCBtYXhYLCBtYXhZXSA9IGdldENvbW1vbkJvdW5kcyhlbGVtZW50cyk7XG5cbiAgICBjb25zdCBlbGVtZW50c0NlbnRlclggPSBkaXN0YW5jZShtaW5YLCBtYXhYKSAvIDI7XG4gICAgY29uc3QgZWxlbWVudHNDZW50ZXJZID0gZGlzdGFuY2UobWluWSwgbWF4WSkgLyAyO1xuXG4gICAgY29uc3QgY2xpZW50WCA9XG4gICAgICB0eXBlb2Ygb3B0cy5wb3NpdGlvbiA9PT0gXCJvYmplY3RcIlxuICAgICAgICA/IG9wdHMucG9zaXRpb24uY2xpZW50WFxuICAgICAgICA6IG9wdHMucG9zaXRpb24gPT09IFwiY3Vyc29yXCJcbiAgICAgICAgPyBjdXJzb3JYXG4gICAgICAgIDogdGhpcy5zdGF0ZS53aWR0aCAvIDIgKyB0aGlzLnN0YXRlLm9mZnNldExlZnQ7XG4gICAgY29uc3QgY2xpZW50WSA9XG4gICAgICB0eXBlb2Ygb3B0cy5wb3NpdGlvbiA9PT0gXCJvYmplY3RcIlxuICAgICAgICA/IG9wdHMucG9zaXRpb24uY2xpZW50WVxuICAgICAgICA6IG9wdHMucG9zaXRpb24gPT09IFwiY3Vyc29yXCJcbiAgICAgICAgPyBjdXJzb3JZXG4gICAgICAgIDogdGhpcy5zdGF0ZS5oZWlnaHQgLyAyICsgdGhpcy5zdGF0ZS5vZmZzZXRUb3A7XG5cbiAgICBjb25zdCB7IHgsIHkgfSA9IHZpZXdwb3J0Q29vcmRzVG9TY2VuZUNvb3JkcyhcbiAgICAgIHsgY2xpZW50WCwgY2xpZW50WSB9LFxuICAgICAgdGhpcy5zdGF0ZSxcbiAgICApO1xuXG4gICAgY29uc3QgZHggPSB4IC0gZWxlbWVudHNDZW50ZXJYO1xuICAgIGNvbnN0IGR5ID0geSAtIGVsZW1lbnRzQ2VudGVyWTtcbiAgICBjb25zdCBncm91cElkTWFwID0gbmV3IE1hcCgpO1xuXG4gICAgY29uc3QgW2dyaWRYLCBncmlkWV0gPSBnZXRHcmlkUG9pbnQoZHgsIGR5LCB0aGlzLnN0YXRlLmdyaWRTaXplKTtcblxuICAgIGNvbnN0IG9sZElkVG9EdXBsaWNhdGVkSWQgPSBuZXcgTWFwKCk7XG4gICAgY29uc3QgbmV3RWxlbWVudHMgPSBlbGVtZW50cy5tYXAoKGVsZW1lbnQpID0+IHtcbiAgICAgIGNvbnN0IG5ld0VsZW1lbnQgPSBkdXBsaWNhdGVFbGVtZW50KFxuICAgICAgICB0aGlzLnN0YXRlLmVkaXRpbmdHcm91cElkLFxuICAgICAgICBncm91cElkTWFwLFxuICAgICAgICBlbGVtZW50LFxuICAgICAgICB7XG4gICAgICAgICAgeDogZWxlbWVudC54ICsgZ3JpZFggLSBtaW5YLFxuICAgICAgICAgIHk6IGVsZW1lbnQueSArIGdyaWRZIC0gbWluWSxcbiAgICAgICAgfSxcbiAgICAgICk7XG4gICAgICBvbGRJZFRvRHVwbGljYXRlZElkLnNldChlbGVtZW50LmlkLCBuZXdFbGVtZW50LmlkKTtcbiAgICAgIHJldHVybiBuZXdFbGVtZW50O1xuICAgIH0pO1xuICAgIGJpbmRUZXh0VG9TaGFwZUFmdGVyRHVwbGljYXRpb24obmV3RWxlbWVudHMsIGVsZW1lbnRzLCBvbGRJZFRvRHVwbGljYXRlZElkKTtcbiAgICBjb25zdCBuZXh0RWxlbWVudHMgPSBbXG4gICAgICAuLi50aGlzLnNjZW5lLmdldEVsZW1lbnRzSW5jbHVkaW5nRGVsZXRlZCgpLFxuICAgICAgLi4ubmV3RWxlbWVudHMsXG4gICAgXTtcbiAgICBmaXhCaW5kaW5nc0FmdGVyRHVwbGljYXRpb24obmV4dEVsZW1lbnRzLCBlbGVtZW50cywgb2xkSWRUb0R1cGxpY2F0ZWRJZCk7XG5cbiAgICBpZiAob3B0cy5maWxlcykge1xuICAgICAgdGhpcy5maWxlcyA9IHsgLi4udGhpcy5maWxlcywgLi4ub3B0cy5maWxlcyB9O1xuICAgIH1cblxuICAgIHRoaXMuc2NlbmUucmVwbGFjZUFsbEVsZW1lbnRzKG5leHRFbGVtZW50cyk7XG4gICAgdGhpcy5oaXN0b3J5LnJlc3VtZVJlY29yZGluZygpO1xuXG4gICAgdGhpcy5zZXRTdGF0ZShcbiAgICAgIHNlbGVjdEdyb3Vwc0ZvclNlbGVjdGVkRWxlbWVudHMoXG4gICAgICAgIHtcbiAgICAgICAgICAuLi50aGlzLnN0YXRlLFxuICAgICAgICAgIGlzTGlicmFyeU9wZW46XG4gICAgICAgICAgICB0aGlzLnN0YXRlLmlzTGlicmFyeU9wZW4gJiYgdGhpcy5kZXZpY2UuY2FuRGV2aWNlRml0U2lkZWJhclxuICAgICAgICAgICAgICA/IHRoaXMuc3RhdGUuaXNMaWJyYXJ5TWVudURvY2tlZFxuICAgICAgICAgICAgICA6IGZhbHNlLFxuICAgICAgICAgIHNlbGVjdGVkRWxlbWVudElkczogbmV3RWxlbWVudHMucmVkdWNlKFxuICAgICAgICAgICAgKGFjYzogUmVjb3JkPEV4Y2FsaWRyYXdFbGVtZW50W1wiaWRcIl0sIHRydWU+LCBlbGVtZW50KSA9PiB7XG4gICAgICAgICAgICAgIGlmICghaXNCb3VuZFRvQ29udGFpbmVyKGVsZW1lbnQpKSB7XG4gICAgICAgICAgICAgICAgYWNjW2VsZW1lbnQuaWRdID0gdHJ1ZTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICByZXR1cm4gYWNjO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHt9LFxuICAgICAgICAgICksXG4gICAgICAgICAgc2VsZWN0ZWRHcm91cElkczoge30sXG4gICAgICAgIH0sXG4gICAgICAgIHRoaXMuc2NlbmUuZ2V0Tm9uRGVsZXRlZEVsZW1lbnRzKCksXG4gICAgICApLFxuICAgICAgKCkgPT4ge1xuICAgICAgICBpZiAob3B0cy5maWxlcykge1xuICAgICAgICAgIHRoaXMuYWRkTmV3SW1hZ2VzVG9JbWFnZUNhY2hlKCk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgKTtcbiAgICB0aGlzLnNldEFjdGl2ZVRvb2woeyB0eXBlOiBcInNlbGVjdGlvblwiIH0pO1xuICB9O1xuXG4gIHByaXZhdGUgYWRkVGV4dEZyb21QYXN0ZSh0ZXh0OiBhbnkpIHtcbiAgICBjb25zdCB7IHgsIHkgfSA9IHZpZXdwb3J0Q29vcmRzVG9TY2VuZUNvb3JkcyhcbiAgICAgIHsgY2xpZW50WDogY3Vyc29yWCwgY2xpZW50WTogY3Vyc29yWSB9LFxuICAgICAgdGhpcy5zdGF0ZSxcbiAgICApO1xuXG4gICAgY29uc3QgZWxlbWVudCA9IG5ld1RleHRFbGVtZW50KHtcbiAgICAgIHgsXG4gICAgICB5LFxuICAgICAgc3Ryb2tlQ29sb3I6IHRoaXMuc3RhdGUuY3VycmVudEl0ZW1TdHJva2VDb2xvcixcbiAgICAgIGJhY2tncm91bmRDb2xvcjogdGhpcy5zdGF0ZS5jdXJyZW50SXRlbUJhY2tncm91bmRDb2xvcixcbiAgICAgIGZpbGxTdHlsZTogdGhpcy5zdGF0ZS5jdXJyZW50SXRlbUZpbGxTdHlsZSxcbiAgICAgIHN0cm9rZVdpZHRoOiB0aGlzLnN0YXRlLmN1cnJlbnRJdGVtU3Ryb2tlV2lkdGgsXG4gICAgICBzdHJva2VTdHlsZTogdGhpcy5zdGF0ZS5jdXJyZW50SXRlbVN0cm9rZVN0eWxlLFxuICAgICAgcm91Z2huZXNzOiB0aGlzLnN0YXRlLmN1cnJlbnRJdGVtUm91Z2huZXNzLFxuICAgICAgb3BhY2l0eTogdGhpcy5zdGF0ZS5jdXJyZW50SXRlbU9wYWNpdHksXG4gICAgICBzdHJva2VTaGFycG5lc3M6IHRoaXMuc3RhdGUuY3VycmVudEl0ZW1TdHJva2VTaGFycG5lc3MsXG4gICAgICB0ZXh0LFxuICAgICAgZm9udFNpemU6IHRoaXMuc3RhdGUuY3VycmVudEl0ZW1Gb250U2l6ZSxcbiAgICAgIGZvbnRGYW1pbHk6IHRoaXMuc3RhdGUuY3VycmVudEl0ZW1Gb250RmFtaWx5LFxuICAgICAgdGV4dEFsaWduOiB0aGlzLnN0YXRlLmN1cnJlbnRJdGVtVGV4dEFsaWduLFxuICAgICAgdmVydGljYWxBbGlnbjogREVGQVVMVF9WRVJUSUNBTF9BTElHTixcbiAgICAgIGxvY2tlZDogZmFsc2UsXG4gICAgfSk7XG5cbiAgICB0aGlzLnNjZW5lLnJlcGxhY2VBbGxFbGVtZW50cyhbXG4gICAgICAuLi50aGlzLnNjZW5lLmdldEVsZW1lbnRzSW5jbHVkaW5nRGVsZXRlZCgpLFxuICAgICAgZWxlbWVudCxcbiAgICBdKTtcbiAgICB0aGlzLnNldFN0YXRlKHsgc2VsZWN0ZWRFbGVtZW50SWRzOiB7IFtlbGVtZW50LmlkXTogdHJ1ZSB9IH0pO1xuICAgIHRoaXMuaGlzdG9yeS5yZXN1bWVSZWNvcmRpbmcoKTtcbiAgfVxuXG4gIC8vIENvbGxhYm9yYXRpb25cblxuICBzZXRBcHBTdGF0ZSA9IChvYmo6IGFueSkgPT4ge1xuICAgIHRoaXMuc2V0U3RhdGUob2JqKTtcbiAgfTtcblxuICByZW1vdmVQb2ludGVyID0gKGV2ZW50OiBSZWFjdC5Qb2ludGVyRXZlbnQ8SFRNTEVsZW1lbnQ+IHwgUG9pbnRlckV2ZW50KSA9PiB7XG4gICAgaWYgKHRvdWNoVGltZW91dCkge1xuICAgICAgdGhpcy5yZXNldENvbnRleHRNZW51VGltZXIoKTtcbiAgICB9XG5cbiAgICBnZXN0dXJlLnBvaW50ZXJzLmRlbGV0ZShldmVudC5wb2ludGVySWQpO1xuICB9O1xuXG4gIHRvZ2dsZUxvY2sgPSAoc291cmNlOiBcImtleWJvYXJkXCIgfCBcInVpXCIgPSBcInVpXCIpID0+IHtcbiAgICBpZiAoIXRoaXMuc3RhdGUuYWN0aXZlVG9vbC5sb2NrZWQpIHtcbiAgICAgIHRyYWNrRXZlbnQoXG4gICAgICAgIFwidG9vbGJhclwiLFxuICAgICAgICBcInRvZ2dsZUxvY2tcIixcbiAgICAgICAgYCR7c291cmNlfSAoJHt0aGlzLmRldmljZS5pc01vYmlsZSA/IFwibW9iaWxlXCIgOiBcImRlc2t0b3BcIn0pYCxcbiAgICAgICk7XG4gICAgfVxuICAgIHRoaXMuc2V0U3RhdGUoKHByZXZTdGF0ZSkgPT4ge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgYWN0aXZlVG9vbDoge1xuICAgICAgICAgIC4uLnByZXZTdGF0ZS5hY3RpdmVUb29sLFxuICAgICAgICAgIC4uLnVwZGF0ZUFjdGl2ZVRvb2woXG4gICAgICAgICAgICB0aGlzLnN0YXRlLFxuICAgICAgICAgICAgcHJldlN0YXRlLmFjdGl2ZVRvb2wubG9ja2VkXG4gICAgICAgICAgICAgID8geyB0eXBlOiBcInNlbGVjdGlvblwiIH1cbiAgICAgICAgICAgICAgOiBwcmV2U3RhdGUuYWN0aXZlVG9vbCxcbiAgICAgICAgICApLFxuICAgICAgICAgIGxvY2tlZDogIXByZXZTdGF0ZS5hY3RpdmVUb29sLmxvY2tlZCxcbiAgICAgICAgfSxcbiAgICAgIH07XG4gICAgfSk7XG4gIH07XG5cbiAgdG9nZ2xlUGVuTW9kZSA9ICgpID0+IHtcbiAgICB0aGlzLnNldFN0YXRlKChwcmV2U3RhdGUpID0+IHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHBlbk1vZGU6ICFwcmV2U3RhdGUucGVuTW9kZSxcbiAgICAgIH07XG4gICAgfSk7XG4gIH07XG5cbiAgc2Nyb2xsVG9Db250ZW50ID0gKFxuICAgIHRhcmdldDpcbiAgICAgIHwgRXhjYWxpZHJhd0VsZW1lbnRcbiAgICAgIHwgcmVhZG9ubHkgRXhjYWxpZHJhd0VsZW1lbnRbXSA9IHRoaXMuc2NlbmUuZ2V0Tm9uRGVsZXRlZEVsZW1lbnRzKCksXG4gICkgPT4ge1xuICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgLi4uY2FsY3VsYXRlU2Nyb2xsQ2VudGVyKFxuICAgICAgICBBcnJheS5pc0FycmF5KHRhcmdldCkgPyB0YXJnZXQgOiBbdGFyZ2V0XSxcbiAgICAgICAgdGhpcy5zdGF0ZSxcbiAgICAgICAgdGhpcy5jYW52YXMsXG4gICAgICApLFxuICAgIH0pO1xuICB9O1xuXG4gIHNldFRvYXN0ID0gKFxuICAgIHRvYXN0OiB7XG4gICAgICBtZXNzYWdlOiBzdHJpbmc7XG4gICAgICBjbG9zYWJsZT86IGJvb2xlYW47XG4gICAgICBkdXJhdGlvbj86IG51bWJlcjtcbiAgICB9IHwgbnVsbCxcbiAgKSA9PiB7XG4gICAgdGhpcy5zZXRTdGF0ZSh7IHRvYXN0IH0pO1xuICB9O1xuXG4gIHJlc3RvcmVGaWxlRnJvbVNoYXJlID0gYXN5bmMgKCkgPT4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCB3ZWJTaGFyZVRhcmdldENhY2hlID0gYXdhaXQgY2FjaGVzLm9wZW4oXCJ3ZWItc2hhcmUtdGFyZ2V0XCIpO1xuXG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHdlYlNoYXJlVGFyZ2V0Q2FjaGUubWF0Y2goXCJzaGFyZWQtZmlsZVwiKTtcbiAgICAgIGlmIChyZXNwb25zZSkge1xuICAgICAgICBjb25zdCBibG9iID0gYXdhaXQgcmVzcG9uc2UuYmxvYigpO1xuICAgICAgICBjb25zdCBmaWxlID0gbmV3IEZpbGUoW2Jsb2JdLCBibG9iLm5hbWUgfHwgXCJcIiwgeyB0eXBlOiBibG9iLnR5cGUgfSk7XG4gICAgICAgIHRoaXMubG9hZEZpbGVUb0NhbnZhcyhmaWxlLCBudWxsKTtcbiAgICAgICAgYXdhaXQgd2ViU2hhcmVUYXJnZXRDYWNoZS5kZWxldGUoXCJzaGFyZWQtZmlsZVwiKTtcbiAgICAgICAgd2luZG93Lmhpc3RvcnkucmVwbGFjZVN0YXRlKG51bGwsIEFQUF9OQU1FLCB3aW5kb3cubG9jYXRpb24ucGF0aG5hbWUpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgIHRoaXMuc2V0U3RhdGUoeyBlcnJvck1lc3NhZ2U6IGVycm9yLm1lc3NhZ2UgfSk7XG4gICAgfVxuICB9O1xuXG4gIC8qKiBhZGRzIHN1cHBsaWVkIGZpbGVzIHRvIGV4aXN0aW5nIGZpbGVzIGluIHRoZSBhcHBTdGF0ZSAqL1xuICBwdWJsaWMgYWRkRmlsZXM6IEV4Y2FsaWRyYXdJbXBlcmF0aXZlQVBJW1wiYWRkRmlsZXNcIl0gPSB3aXRoQmF0Y2hlZFVwZGF0ZXMoXG4gICAgKGZpbGVzKSA9PiB7XG4gICAgICBjb25zdCBmaWxlc01hcCA9IGZpbGVzLnJlZHVjZSgoYWNjLCBmaWxlRGF0YSkgPT4ge1xuICAgICAgICBhY2Muc2V0KGZpbGVEYXRhLmlkLCBmaWxlRGF0YSk7XG4gICAgICAgIHJldHVybiBhY2M7XG4gICAgICB9LCBuZXcgTWFwPEZpbGVJZCwgQmluYXJ5RmlsZURhdGE+KCkpO1xuXG4gICAgICB0aGlzLmZpbGVzID0geyAuLi50aGlzLmZpbGVzLCAuLi5PYmplY3QuZnJvbUVudHJpZXMoZmlsZXNNYXApIH07XG5cbiAgICAgIHRoaXMuc2NlbmUuZ2V0Tm9uRGVsZXRlZEVsZW1lbnRzKCkuZm9yRWFjaCgoZWxlbWVudCkgPT4ge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgaXNJbml0aWFsaXplZEltYWdlRWxlbWVudChlbGVtZW50KSAmJlxuICAgICAgICAgIGZpbGVzTWFwLmhhcyhlbGVtZW50LmZpbGVJZClcbiAgICAgICAgKSB7XG4gICAgICAgICAgdGhpcy5pbWFnZUNhY2hlLmRlbGV0ZShlbGVtZW50LmZpbGVJZCk7XG4gICAgICAgICAgaW52YWxpZGF0ZVNoYXBlRm9yRWxlbWVudChlbGVtZW50KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICB0aGlzLnNjZW5lLmluZm9ybU11dGF0aW9uKCk7XG5cbiAgICAgIHRoaXMuYWRkTmV3SW1hZ2VzVG9JbWFnZUNhY2hlKCk7XG4gICAgfSxcbiAgKTtcblxuICBwdWJsaWMgdXBkYXRlU2NlbmUgPSB3aXRoQmF0Y2hlZFVwZGF0ZXMoXG4gICAgPEsgZXh0ZW5kcyBrZXlvZiBBcHBTdGF0ZT4oc2NlbmVEYXRhOiB7XG4gICAgICBlbGVtZW50cz86IFNjZW5lRGF0YVtcImVsZW1lbnRzXCJdO1xuICAgICAgYXBwU3RhdGU/OiBQaWNrPEFwcFN0YXRlLCBLPiB8IG51bGw7XG4gICAgICBjb2xsYWJvcmF0b3JzPzogU2NlbmVEYXRhW1wiY29sbGFib3JhdG9yc1wiXTtcbiAgICAgIGNvbW1pdFRvSGlzdG9yeT86IFNjZW5lRGF0YVtcImNvbW1pdFRvSGlzdG9yeVwiXTtcbiAgICB9KSA9PiB7XG4gICAgICBpZiAoc2NlbmVEYXRhLmNvbW1pdFRvSGlzdG9yeSkge1xuICAgICAgICB0aGlzLmhpc3RvcnkucmVzdW1lUmVjb3JkaW5nKCk7XG4gICAgICB9XG5cbiAgICAgIGlmIChzY2VuZURhdGEuYXBwU3RhdGUpIHtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZShzY2VuZURhdGEuYXBwU3RhdGUpO1xuICAgICAgfVxuXG4gICAgICBpZiAoc2NlbmVEYXRhLmVsZW1lbnRzKSB7XG4gICAgICAgIHRoaXMuc2NlbmUucmVwbGFjZUFsbEVsZW1lbnRzKHNjZW5lRGF0YS5lbGVtZW50cyk7XG4gICAgICB9XG5cbiAgICAgIGlmIChzY2VuZURhdGEuY29sbGFib3JhdG9ycykge1xuICAgICAgICB0aGlzLnNldFN0YXRlKHsgY29sbGFib3JhdG9yczogc2NlbmVEYXRhLmNvbGxhYm9yYXRvcnMgfSk7XG4gICAgICB9XG4gICAgfSxcbiAgKTtcblxuICBwcml2YXRlIG9uU2NlbmVVcGRhdGVkID0gKCkgPT4ge1xuICAgIHRoaXMuc2V0U3RhdGUoe30pO1xuICB9O1xuXG4gIHByaXZhdGUgdXBkYXRlQ3VycmVudEN1cnNvclBvc2l0aW9uID0gd2l0aEJhdGNoZWRVcGRhdGVzKFxuICAgIChldmVudDogTW91c2VFdmVudCkgPT4ge1xuICAgICAgY3Vyc29yWCA9IGV2ZW50LmNsaWVudFg7XG4gICAgICBjdXJzb3JZID0gZXZlbnQuY2xpZW50WTtcbiAgICB9LFxuICApO1xuXG4gIC8vIElucHV0IGhhbmRsaW5nXG5cbiAgcHJpdmF0ZSBvbktleURvd24gPSB3aXRoQmF0Y2hlZFVwZGF0ZXMoXG4gICAgKGV2ZW50OiBSZWFjdC5LZXlib2FyZEV2ZW50IHwgS2V5Ym9hcmRFdmVudCkgPT4ge1xuICAgICAgLy8gbm9ybWFsaXplIGBldmVudC5rZXlgIHdoZW4gQ2Fwc0xvY2sgaXMgcHJlc3NlZCAjMjM3MlxuXG4gICAgICBpZiAoXG4gICAgICAgIFwiUHJveHlcIiBpbiB3aW5kb3cgJiZcbiAgICAgICAgKCghZXZlbnQuc2hpZnRLZXkgJiYgL15bQS1aXSQvLnRlc3QoZXZlbnQua2V5KSkgfHxcbiAgICAgICAgICAoZXZlbnQuc2hpZnRLZXkgJiYgL15bYS16XSQvLnRlc3QoZXZlbnQua2V5KSkpXG4gICAgICApIHtcbiAgICAgICAgZXZlbnQgPSBuZXcgUHJveHkoZXZlbnQsIHtcbiAgICAgICAgICBnZXQoZXY6IGFueSwgcHJvcCkge1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBldltwcm9wXTtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgICAvLyBmaXggZm9yIFByb3hpZXMgaGlqYWNraW5nIGB0aGlzYFxuICAgICAgICAgICAgICByZXR1cm4gdmFsdWUuYmluZChldik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcHJvcCA9PT0gXCJrZXlcIlxuICAgICAgICAgICAgICA/IC8vIENhcHNMb2NrIGludmVydHMgY2FwaXRhbGl6YXRpb24gYmFzZWQgb24gU2hpZnRLZXksIHNvIGludmVydFxuICAgICAgICAgICAgICAgIC8vIGl0IGJhY2tcbiAgICAgICAgICAgICAgICBldmVudC5zaGlmdEtleVxuICAgICAgICAgICAgICAgID8gZXYua2V5LnRvVXBwZXJDYXNlKClcbiAgICAgICAgICAgICAgICA6IGV2LmtleS50b0xvd2VyQ2FzZSgpXG4gICAgICAgICAgICAgIDogdmFsdWU7XG4gICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIC8vIHByZXZlbnQgYnJvd3NlciB6b29tIGluIGlucHV0IGZpZWxkc1xuICAgICAgaWYgKGV2ZW50W0tFWVMuQ1RSTF9PUl9DTURdICYmIGlzV3JpdGFibGVFbGVtZW50KGV2ZW50LnRhcmdldCkpIHtcbiAgICAgICAgaWYgKGV2ZW50LmNvZGUgPT09IENPREVTLk1JTlVTIHx8IGV2ZW50LmNvZGUgPT09IENPREVTLkVRVUFMKSB7XG4gICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gYmFpbCBpZlxuICAgICAgaWYgKFxuICAgICAgICAvLyBpbnNpZGUgYW4gaW5wdXRcbiAgICAgICAgKGlzV3JpdGFibGVFbGVtZW50KGV2ZW50LnRhcmdldCkgJiZcbiAgICAgICAgICAvLyB1bmxlc3MgcHJlc3NpbmcgZXNjYXBlIChmaW5hbGl6ZSBhY3Rpb24pXG4gICAgICAgICAgZXZlbnQua2V5ICE9PSBLRVlTLkVTQ0FQRSkgfHxcbiAgICAgICAgLy8gb3IgdW5sZXNzIHVzaW5nIGFycm93cyAodG8gbW92ZSBiZXR3ZWVuIGJ1dHRvbnMpXG4gICAgICAgIChpc0Fycm93S2V5KGV2ZW50LmtleSkgJiYgaXNJbnB1dExpa2UoZXZlbnQudGFyZ2V0KSlcbiAgICAgICkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmIChldmVudC5rZXkgPT09IEtFWVMuUVVFU1RJT05fTUFSSykge1xuICAgICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgICBzaG93SGVscERpYWxvZzogdHJ1ZSxcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLmFjdGlvbk1hbmFnZXIuaGFuZGxlS2V5RG93bihldmVudCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5zdGF0ZS52aWV3TW9kZUVuYWJsZWQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoZXZlbnRbS0VZUy5DVFJMX09SX0NNRF0gJiYgdGhpcy5zdGF0ZS5pc0JpbmRpbmdFbmFibGVkKSB7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoeyBpc0JpbmRpbmdFbmFibGVkOiBmYWxzZSB9KTtcbiAgICAgIH1cblxuICAgICAgaWYgKGV2ZW50LmNvZGUgPT09IENPREVTLlpFUk8pIHtcbiAgICAgICAgY29uc3QgbmV4dFN0YXRlID0gIXRoaXMuc3RhdGUuaXNMaWJyYXJ5T3BlbjtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7IGlzTGlicmFyeU9wZW46IG5leHRTdGF0ZSB9KTtcbiAgICAgICAgLy8gdHJhY2sgb25seSBvcGVuaW5nc1xuICAgICAgICBpZiAobmV4dFN0YXRlKSB7XG4gICAgICAgICAgdHJhY2tFdmVudChcbiAgICAgICAgICAgIFwibGlicmFyeVwiLFxuICAgICAgICAgICAgXCJ0b2dnbGVMaWJyYXJ5IChvcGVuKVwiLFxuICAgICAgICAgICAgYGtleWJvYXJkICgke3RoaXMuZGV2aWNlLmlzTW9iaWxlID8gXCJtb2JpbGVcIiA6IFwiZGVza3RvcFwifSlgLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKGlzQXJyb3dLZXkoZXZlbnQua2V5KSkge1xuICAgICAgICBjb25zdCBzdGVwID1cbiAgICAgICAgICAodGhpcy5zdGF0ZS5ncmlkU2l6ZSAmJlxuICAgICAgICAgICAgKGV2ZW50LnNoaWZ0S2V5XG4gICAgICAgICAgICAgID8gRUxFTUVOVF9UUkFOU0xBVEVfQU1PVU5UXG4gICAgICAgICAgICAgIDogdGhpcy5zdGF0ZS5ncmlkU2l6ZSkpIHx8XG4gICAgICAgICAgKGV2ZW50LnNoaWZ0S2V5XG4gICAgICAgICAgICA/IEVMRU1FTlRfU0hJRlRfVFJBTlNMQVRFX0FNT1VOVFxuICAgICAgICAgICAgOiBFTEVNRU5UX1RSQU5TTEFURV9BTU9VTlQpO1xuXG4gICAgICAgIGNvbnN0IHNlbGVjdGVkRWxlbWVudHMgPSBnZXRTZWxlY3RlZEVsZW1lbnRzKFxuICAgICAgICAgIHRoaXMuc2NlbmUuZ2V0Tm9uRGVsZXRlZEVsZW1lbnRzKCksXG4gICAgICAgICAgdGhpcy5zdGF0ZSxcbiAgICAgICAgICB0cnVlLFxuICAgICAgICApO1xuXG4gICAgICAgIGxldCBvZmZzZXRYID0gMDtcbiAgICAgICAgbGV0IG9mZnNldFkgPSAwO1xuXG4gICAgICAgIGlmIChldmVudC5rZXkgPT09IEtFWVMuQVJST1dfTEVGVCkge1xuICAgICAgICAgIG9mZnNldFggPSAtc3RlcDtcbiAgICAgICAgfSBlbHNlIGlmIChldmVudC5rZXkgPT09IEtFWVMuQVJST1dfUklHSFQpIHtcbiAgICAgICAgICBvZmZzZXRYID0gc3RlcDtcbiAgICAgICAgfSBlbHNlIGlmIChldmVudC5rZXkgPT09IEtFWVMuQVJST1dfVVApIHtcbiAgICAgICAgICBvZmZzZXRZID0gLXN0ZXA7XG4gICAgICAgIH0gZWxzZSBpZiAoZXZlbnQua2V5ID09PSBLRVlTLkFSUk9XX0RPV04pIHtcbiAgICAgICAgICBvZmZzZXRZID0gc3RlcDtcbiAgICAgICAgfVxuXG4gICAgICAgIHNlbGVjdGVkRWxlbWVudHMuZm9yRWFjaCgoZWxlbWVudCkgPT4ge1xuICAgICAgICAgIG11dGF0ZUVsZW1lbnQoZWxlbWVudCwge1xuICAgICAgICAgICAgeDogZWxlbWVudC54ICsgb2Zmc2V0WCxcbiAgICAgICAgICAgIHk6IGVsZW1lbnQueSArIG9mZnNldFksXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICB1cGRhdGVCb3VuZEVsZW1lbnRzKGVsZW1lbnQsIHtcbiAgICAgICAgICAgIHNpbXVsdGFuZW91c2x5VXBkYXRlZDogc2VsZWN0ZWRFbGVtZW50cyxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5tYXliZVN1Z2dlc3RCaW5kaW5nRm9yQWxsKHNlbGVjdGVkRWxlbWVudHMpO1xuXG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICB9IGVsc2UgaWYgKGV2ZW50LmtleSA9PT0gS0VZUy5FTlRFUikge1xuICAgICAgICBjb25zdCBzZWxlY3RlZEVsZW1lbnRzID0gZ2V0U2VsZWN0ZWRFbGVtZW50cyhcbiAgICAgICAgICB0aGlzLnNjZW5lLmdldE5vbkRlbGV0ZWRFbGVtZW50cygpLFxuICAgICAgICAgIHRoaXMuc3RhdGUsXG4gICAgICAgICk7XG5cbiAgICAgICAgaWYgKHNlbGVjdGVkRWxlbWVudHMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgaWYgKGlzTGluZWFyRWxlbWVudChzZWxlY3RlZEVsZW1lbnRzWzBdKSkge1xuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAhdGhpcy5zdGF0ZS5lZGl0aW5nTGluZWFyRWxlbWVudCB8fFxuICAgICAgICAgICAgICB0aGlzLnN0YXRlLmVkaXRpbmdMaW5lYXJFbGVtZW50LmVsZW1lbnRJZCAhPT1cbiAgICAgICAgICAgICAgICBzZWxlY3RlZEVsZW1lbnRzWzBdLmlkXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgdGhpcy5oaXN0b3J5LnJlc3VtZVJlY29yZGluZygpO1xuICAgICAgICAgICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgICAgICAgICBlZGl0aW5nTGluZWFyRWxlbWVudDogbmV3IExpbmVhckVsZW1lbnRFZGl0b3IoXG4gICAgICAgICAgICAgICAgICBzZWxlY3RlZEVsZW1lbnRzWzBdLFxuICAgICAgICAgICAgICAgICAgdGhpcy5zY2VuZSxcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3Qgc2VsZWN0ZWRFbGVtZW50ID0gc2VsZWN0ZWRFbGVtZW50c1swXTtcblxuICAgICAgICAgICAgdGhpcy5zdGFydFRleHRFZGl0aW5nKHtcbiAgICAgICAgICAgICAgc2NlbmVYOiBzZWxlY3RlZEVsZW1lbnQueCArIHNlbGVjdGVkRWxlbWVudC53aWR0aCAvIDIsXG4gICAgICAgICAgICAgIHNjZW5lWTogc2VsZWN0ZWRFbGVtZW50LnkgKyBzZWxlY3RlZEVsZW1lbnQuaGVpZ2h0IC8gMixcbiAgICAgICAgICAgICAgc2hvdWxkQmluZDogdHJ1ZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICFldmVudC5jdHJsS2V5ICYmXG4gICAgICAgICFldmVudC5hbHRLZXkgJiZcbiAgICAgICAgIWV2ZW50Lm1ldGFLZXkgJiZcbiAgICAgICAgdGhpcy5zdGF0ZS5kcmFnZ2luZ0VsZW1lbnQgPT09IG51bGxcbiAgICAgICkge1xuICAgICAgICBjb25zdCBzaGFwZSA9IGZpbmRTaGFwZUJ5S2V5KGV2ZW50LmtleSk7XG4gICAgICAgIGlmIChzaGFwZSkge1xuICAgICAgICAgIGlmICh0aGlzLnN0YXRlLmFjdGl2ZVRvb2wudHlwZSAhPT0gc2hhcGUpIHtcbiAgICAgICAgICAgIHRyYWNrRXZlbnQoXG4gICAgICAgICAgICAgIFwidG9vbGJhclwiLFxuICAgICAgICAgICAgICBzaGFwZSxcbiAgICAgICAgICAgICAgYGtleWJvYXJkICgke3RoaXMuZGV2aWNlLmlzTW9iaWxlID8gXCJtb2JpbGVcIiA6IFwiZGVza3RvcFwifSlgLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5zZXRBY3RpdmVUb29sKHsgdHlwZTogc2hhcGUgfSk7XG4gICAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIH0gZWxzZSBpZiAoZXZlbnQua2V5ID09PSBLRVlTLlEpIHtcbiAgICAgICAgICB0aGlzLnRvZ2dsZUxvY2soXCJrZXlib2FyZFwiKTtcbiAgICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGV2ZW50LmtleSA9PT0gS0VZUy5TUEFDRSAmJiBnZXN0dXJlLnBvaW50ZXJzLnNpemUgPT09IDApIHtcbiAgICAgICAgaXNIb2xkaW5nU3BhY2UgPSB0cnVlO1xuICAgICAgICBzZXRDdXJzb3IodGhpcy5jYW52YXMsIENVUlNPUl9UWVBFLkdSQUJCSU5HKTtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIH1cblxuICAgICAgaWYgKFxuICAgICAgICAoZXZlbnQua2V5ID09PSBLRVlTLkcgfHwgZXZlbnQua2V5ID09PSBLRVlTLlMpICYmXG4gICAgICAgICFldmVudC5hbHRLZXkgJiZcbiAgICAgICAgIWV2ZW50W0tFWVMuQ1RSTF9PUl9DTURdXG4gICAgICApIHtcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWRFbGVtZW50cyA9IGdldFNlbGVjdGVkRWxlbWVudHMoXG4gICAgICAgICAgdGhpcy5zY2VuZS5nZXROb25EZWxldGVkRWxlbWVudHMoKSxcbiAgICAgICAgICB0aGlzLnN0YXRlLFxuICAgICAgICApO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgdGhpcy5zdGF0ZS5hY3RpdmVUb29sLnR5cGUgPT09IFwic2VsZWN0aW9uXCIgJiZcbiAgICAgICAgICAhc2VsZWN0ZWRFbGVtZW50cy5sZW5ndGhcbiAgICAgICAgKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKFxuICAgICAgICAgIGV2ZW50LmtleSA9PT0gS0VZUy5HICYmXG4gICAgICAgICAgKGhhc0JhY2tncm91bmQodGhpcy5zdGF0ZS5hY3RpdmVUb29sLnR5cGUpIHx8XG4gICAgICAgICAgICBzZWxlY3RlZEVsZW1lbnRzLnNvbWUoKGVsZW1lbnQpID0+IGhhc0JhY2tncm91bmQoZWxlbWVudC50eXBlKSkpXG4gICAgICAgICkge1xuICAgICAgICAgIHRoaXMuc2V0U3RhdGUoeyBvcGVuUG9wdXA6IFwiYmFja2dyb3VuZENvbG9yUGlja2VyXCIgfSk7XG4gICAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGV2ZW50LmtleSA9PT0gS0VZUy5TKSB7XG4gICAgICAgICAgdGhpcy5zZXRTdGF0ZSh7IG9wZW5Qb3B1cDogXCJzdHJva2VDb2xvclBpY2tlclwiIH0pO1xuICAgICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcbiAgKTtcblxuICBwcml2YXRlIG9uV2hlZWwgPSB3aXRoQmF0Y2hlZFVwZGF0ZXMoKGV2ZW50OiBXaGVlbEV2ZW50KSA9PiB7XG4gICAgLy8gcHJldmVudCBicm93c2VyIHBpbmNoIHpvb20gb24gRE9NIGVsZW1lbnRzXG4gICAgaWYgKCEoZXZlbnQudGFyZ2V0IGluc3RhbmNlb2YgSFRNTENhbnZhc0VsZW1lbnQpICYmIGV2ZW50LmN0cmxLZXkpIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgfVxuICB9KTtcblxuICBwcml2YXRlIG9uS2V5VXAgPSB3aXRoQmF0Y2hlZFVwZGF0ZXMoKGV2ZW50OiBLZXlib2FyZEV2ZW50KSA9PiB7XG4gICAgaWYgKGV2ZW50LmtleSA9PT0gS0VZUy5TUEFDRSkge1xuICAgICAgaWYgKHRoaXMuc3RhdGUudmlld01vZGVFbmFibGVkKSB7XG4gICAgICAgIHNldEN1cnNvcih0aGlzLmNhbnZhcywgQ1VSU09SX1RZUEUuR1JBQik7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMuc3RhdGUuYWN0aXZlVG9vbC50eXBlID09PSBcInNlbGVjdGlvblwiKSB7XG4gICAgICAgIHJlc2V0Q3Vyc29yKHRoaXMuY2FudmFzKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNldEN1cnNvckZvclNoYXBlKHRoaXMuY2FudmFzLCB0aGlzLnN0YXRlKTtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgc2VsZWN0ZWRFbGVtZW50SWRzOiB7fSxcbiAgICAgICAgICBzZWxlY3RlZEdyb3VwSWRzOiB7fSxcbiAgICAgICAgICBlZGl0aW5nR3JvdXBJZDogbnVsbCxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBpc0hvbGRpbmdTcGFjZSA9IGZhbHNlO1xuICAgIH1cbiAgICBpZiAoIWV2ZW50W0tFWVMuQ1RSTF9PUl9DTURdICYmICF0aGlzLnN0YXRlLmlzQmluZGluZ0VuYWJsZWQpIHtcbiAgICAgIHRoaXMuc2V0U3RhdGUoeyBpc0JpbmRpbmdFbmFibGVkOiB0cnVlIH0pO1xuICAgIH1cbiAgICBpZiAoaXNBcnJvd0tleShldmVudC5rZXkpKSB7XG4gICAgICBjb25zdCBzZWxlY3RlZEVsZW1lbnRzID0gZ2V0U2VsZWN0ZWRFbGVtZW50cyhcbiAgICAgICAgdGhpcy5zY2VuZS5nZXROb25EZWxldGVkRWxlbWVudHMoKSxcbiAgICAgICAgdGhpcy5zdGF0ZSxcbiAgICAgICk7XG4gICAgICBpc0JpbmRpbmdFbmFibGVkKHRoaXMuc3RhdGUpXG4gICAgICAgID8gYmluZE9yVW5iaW5kU2VsZWN0ZWRFbGVtZW50cyhzZWxlY3RlZEVsZW1lbnRzKVxuICAgICAgICA6IHVuYmluZExpbmVhckVsZW1lbnRzKHNlbGVjdGVkRWxlbWVudHMpO1xuICAgICAgdGhpcy5zZXRTdGF0ZSh7IHN1Z2dlc3RlZEJpbmRpbmdzOiBbXSB9KTtcbiAgICB9XG4gIH0pO1xuXG4gIHByaXZhdGUgc2V0QWN0aXZlVG9vbCA9IChcbiAgICB0b29sOlxuICAgICAgfCB7IHR5cGU6IHR5cGVvZiBTSEFQRVNbbnVtYmVyXVtcInZhbHVlXCJdIHwgXCJlcmFzZXJcIiB9XG4gICAgICB8IHsgdHlwZTogXCJjdXN0b21cIjsgY3VzdG9tVHlwZTogc3RyaW5nIH0sXG4gICkgPT4ge1xuICAgIGNvbnN0IG5leHRBY3RpdmVUb29sID0gdXBkYXRlQWN0aXZlVG9vbCh0aGlzLnN0YXRlLCB0b29sKTtcbiAgICBpZiAoIWlzSG9sZGluZ1NwYWNlKSB7XG4gICAgICBzZXRDdXJzb3JGb3JTaGFwZSh0aGlzLmNhbnZhcywgdGhpcy5zdGF0ZSk7XG4gICAgfVxuICAgIGlmIChpc1Rvb2xJY29uKGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQpKSB7XG4gICAgICB0aGlzLmZvY3VzQ29udGFpbmVyKCk7XG4gICAgfVxuICAgIGlmICghaXNMaW5lYXJFbGVtZW50VHlwZShuZXh0QWN0aXZlVG9vbC50eXBlKSkge1xuICAgICAgdGhpcy5zZXRTdGF0ZSh7IHN1Z2dlc3RlZEJpbmRpbmdzOiBbXSB9KTtcbiAgICB9XG4gICAgaWYgKG5leHRBY3RpdmVUb29sLnR5cGUgPT09IFwiaW1hZ2VcIikge1xuICAgICAgdGhpcy5vbkltYWdlQWN0aW9uKCk7XG4gICAgfVxuICAgIGlmIChuZXh0QWN0aXZlVG9vbC50eXBlICE9PSBcInNlbGVjdGlvblwiKSB7XG4gICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgYWN0aXZlVG9vbDogbmV4dEFjdGl2ZVRvb2wsXG4gICAgICAgIHNlbGVjdGVkRWxlbWVudElkczoge30sXG4gICAgICAgIHNlbGVjdGVkR3JvdXBJZHM6IHt9LFxuICAgICAgICBlZGl0aW5nR3JvdXBJZDogbnVsbCxcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnNldFN0YXRlKHsgYWN0aXZlVG9vbDogbmV4dEFjdGl2ZVRvb2wgfSk7XG4gICAgfVxuICB9O1xuXG4gIHByaXZhdGUgc2V0Q3Vyc29yID0gKGN1cnNvcjogc3RyaW5nKSA9PiB7XG4gICAgc2V0Q3Vyc29yKHRoaXMuY2FudmFzLCBjdXJzb3IpO1xuICB9O1xuXG4gIHByaXZhdGUgcmVzZXRDdXJzb3IgPSAoKSA9PiB7XG4gICAgcmVzZXRDdXJzb3IodGhpcy5jYW52YXMpO1xuICB9O1xuICAvKipcbiAgICogcmV0dXJucyB3aGV0aGVyIHVzZXIgaXMgbWFraW5nIGEgZ2VzdHVyZSB3aXRoID49IDIgZmluZ2VycyAocG9pbnRzKVxuICAgKiBvbiBvIHRvdWNoIHNjcmVlbiAobm90IG9uIGEgdHJhY2twYWQpLiBDdXJyZW50bHkgb25seSByZWxhdGVzIHRvIERhcndpblxuICAgKiAoaU9TL2lQYWRPUyxNYWNPUyksIGJ1dCBtYXkgd29yayBvbiBvdGhlciBkZXZpY2VzIGluIHRoZSBmdXR1cmUgaWZcbiAgICogR2VzdHVyZUV2ZW50IGlzIHN0YW5kYXJkaXplZC5cbiAgICovXG4gIHByaXZhdGUgaXNUb3VjaFNjcmVlbk11bHRpVG91Y2hHZXN0dXJlID0gKCkgPT4ge1xuICAgIC8vIHdlIGRvbid0IHdhbnQgdG8gZGVzZWxlY3Qgd2hlbiB1c2luZyB0cmFja3BhZCwgYW5kIG11bHRpLXBvaW50IGdlc3R1cmVzXG4gICAgLy8gb25seSB3b3JrIG9uIHRvdWNoIHNjcmVlbnMsIHNvIGNoZWNraW5nIGZvciA+PSBwb2ludGVycyBtZWFucyB3ZSdyZSBvbiBhXG4gICAgLy8gdG91Y2hzY3JlZW5cbiAgICByZXR1cm4gZ2VzdHVyZS5wb2ludGVycy5zaXplID49IDI7XG4gIH07XG5cbiAgLy8gZmlyZXMgb25seSBvbiBTYWZhcmlcbiAgcHJpdmF0ZSBvbkdlc3R1cmVTdGFydCA9IHdpdGhCYXRjaGVkVXBkYXRlcygoZXZlbnQ6IEdlc3R1cmVFdmVudCkgPT4ge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICAvLyB3ZSBvbmx5IHdhbnQgdG8gZGVzZWxlY3Qgb24gdG91Y2ggc2NyZWVucyBiZWNhdXNlIHVzZXIgbWF5IGhhdmUgc2VsZWN0ZWRcbiAgICAvLyBlbGVtZW50cyBieSBtaXN0YWtlIHdoaWxlIHpvb21pbmdcbiAgICBpZiAodGhpcy5pc1RvdWNoU2NyZWVuTXVsdGlUb3VjaEdlc3R1cmUoKSkge1xuICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgIHNlbGVjdGVkRWxlbWVudElkczoge30sXG4gICAgICB9KTtcbiAgICB9XG4gICAgZ2VzdHVyZS5pbml0aWFsU2NhbGUgPSB0aGlzLnN0YXRlLnpvb20udmFsdWU7XG4gIH0pO1xuXG4gIC8vIGZpcmVzIG9ubHkgb24gU2FmYXJpXG4gIHByaXZhdGUgb25HZXN0dXJlQ2hhbmdlID0gd2l0aEJhdGNoZWRVcGRhdGVzKChldmVudDogR2VzdHVyZUV2ZW50KSA9PiB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuICAgIC8vIG9uR2VzdHVyZUNoYW5nZSBvbmx5IGhhcyB6b29tIGZhY3RvciBidXQgbm90IHRoZSBjZW50ZXIuXG4gICAgLy8gSWYgd2UncmUgb24gaVBhZCBvciBpUGhvbmUsIHRoZW4gd2UgcmVjb2duaXplIG11bHRpLXRvdWNoIGFuZCB3aWxsXG4gICAgLy8gem9vbSBpbiBhdCB0aGUgcmlnaHQgbG9jYXRpb24gaW4gdGhlIHRvdWNobW92ZSBoYW5kbGVyXG4gICAgLy8gKGhhbmRsZUNhbnZhc1BvaW50ZXJNb3ZlKS5cbiAgICAvL1xuICAgIC8vIE9uIE1hY2Jvb2sgdHJhY2twYWQsIHdlIGRvbid0IGhhdmUgdGhvc2UgZXZlbnRzIHNvIHdpbGwgem9vbSBpbiBhdCB0aGVcbiAgICAvLyBjdXJyZW50IGxvY2F0aW9uIGluc3RlYWQuXG4gICAgLy9cbiAgICAvLyBBcyBzdWNoLCBiYWlsIGZyb20gdGhpcyBoYW5kbGVyIG9uIHRvdWNoIGRldmljZXMuXG4gICAgaWYgKHRoaXMuaXNUb3VjaFNjcmVlbk11bHRpVG91Y2hHZXN0dXJlKCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBpbml0aWFsU2NhbGUgPSBnZXN0dXJlLmluaXRpYWxTY2FsZTtcbiAgICBpZiAoaW5pdGlhbFNjYWxlKSB7XG4gICAgICB0aGlzLnNldFN0YXRlKChzdGF0ZSkgPT4gKHtcbiAgICAgICAgLi4uZ2V0U3RhdGVGb3Jab29tKFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHZpZXdwb3J0WDogY3Vyc29yWCxcbiAgICAgICAgICAgIHZpZXdwb3J0WTogY3Vyc29yWSxcbiAgICAgICAgICAgIG5leHRab29tOiBnZXROb3JtYWxpemVkWm9vbShpbml0aWFsU2NhbGUgKiBldmVudC5zY2FsZSksXG4gICAgICAgICAgfSxcbiAgICAgICAgICBzdGF0ZSxcbiAgICAgICAgKSxcbiAgICAgIH0pKTtcbiAgICB9XG4gIH0pO1xuXG4gIC8vIGZpcmVzIG9ubHkgb24gU2FmYXJpXG4gIHByaXZhdGUgb25HZXN0dXJlRW5kID0gd2l0aEJhdGNoZWRVcGRhdGVzKChldmVudDogR2VzdHVyZUV2ZW50KSA9PiB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAvLyByZXNlbGVjdCBlbGVtZW50cyBvbmx5IG9uIHRvdWNoIHNjcmVlbnMgKHNlZSBvbkdlc3R1cmVTdGFydClcbiAgICBpZiAodGhpcy5pc1RvdWNoU2NyZWVuTXVsdGlUb3VjaEdlc3R1cmUoKSkge1xuICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgIHByZXZpb3VzU2VsZWN0ZWRFbGVtZW50SWRzOiB7fSxcbiAgICAgICAgc2VsZWN0ZWRFbGVtZW50SWRzOiB0aGlzLnN0YXRlLnByZXZpb3VzU2VsZWN0ZWRFbGVtZW50SWRzLFxuICAgICAgfSk7XG4gICAgfVxuICAgIGdlc3R1cmUuaW5pdGlhbFNjYWxlID0gbnVsbDtcbiAgfSk7XG5cbiAgcHJpdmF0ZSBoYW5kbGVUZXh0V3lzaXd5ZyhcbiAgICBlbGVtZW50OiBFeGNhbGlkcmF3VGV4dEVsZW1lbnQsXG4gICAge1xuICAgICAgaXNFeGlzdGluZ0VsZW1lbnQgPSBmYWxzZSxcbiAgICB9OiB7XG4gICAgICBpc0V4aXN0aW5nRWxlbWVudD86IGJvb2xlYW47XG4gICAgfSxcbiAgKSB7XG4gICAgY29uc3QgdXBkYXRlRWxlbWVudCA9IChcbiAgICAgIHRleHQ6IHN0cmluZyxcbiAgICAgIG9yaWdpbmFsVGV4dDogc3RyaW5nLFxuICAgICAgaXNEZWxldGVkOiBib29sZWFuLFxuICAgICkgPT4ge1xuICAgICAgdGhpcy5zY2VuZS5yZXBsYWNlQWxsRWxlbWVudHMoW1xuICAgICAgICAuLi50aGlzLnNjZW5lLmdldEVsZW1lbnRzSW5jbHVkaW5nRGVsZXRlZCgpLm1hcCgoX2VsZW1lbnQpID0+IHtcbiAgICAgICAgICBpZiAoX2VsZW1lbnQuaWQgPT09IGVsZW1lbnQuaWQgJiYgaXNUZXh0RWxlbWVudChfZWxlbWVudCkpIHtcbiAgICAgICAgICAgIHJldHVybiB1cGRhdGVUZXh0RWxlbWVudChfZWxlbWVudCwge1xuICAgICAgICAgICAgICB0ZXh0LFxuICAgICAgICAgICAgICBpc0RlbGV0ZWQsXG4gICAgICAgICAgICAgIG9yaWdpbmFsVGV4dCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gX2VsZW1lbnQ7XG4gICAgICAgIH0pLFxuICAgICAgXSk7XG4gICAgfTtcblxuICAgIHRleHRXeXNpd3lnKHtcbiAgICAgIGlkOiBlbGVtZW50LmlkLFxuICAgICAgY2FudmFzOiB0aGlzLmNhbnZhcyxcbiAgICAgIGdldFZpZXdwb3J0Q29vcmRzOiAoeCwgeSkgPT4ge1xuICAgICAgICBjb25zdCB7IHg6IHZpZXdwb3J0WCwgeTogdmlld3BvcnRZIH0gPSBzY2VuZUNvb3Jkc1RvVmlld3BvcnRDb29yZHMoXG4gICAgICAgICAge1xuICAgICAgICAgICAgc2NlbmVYOiB4LFxuICAgICAgICAgICAgc2NlbmVZOiB5LFxuICAgICAgICAgIH0sXG4gICAgICAgICAgdGhpcy5zdGF0ZSxcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICB2aWV3cG9ydFggLSB0aGlzLnN0YXRlLm9mZnNldExlZnQsXG4gICAgICAgICAgdmlld3BvcnRZIC0gdGhpcy5zdGF0ZS5vZmZzZXRUb3AsXG4gICAgICAgIF07XG4gICAgICB9LFxuICAgICAgb25DaGFuZ2U6IHdpdGhCYXRjaGVkVXBkYXRlcygodGV4dCkgPT4ge1xuICAgICAgICB1cGRhdGVFbGVtZW50KHRleHQsIHRleHQsIGZhbHNlKTtcbiAgICAgICAgaWYgKGlzTm9uRGVsZXRlZEVsZW1lbnQoZWxlbWVudCkpIHtcbiAgICAgICAgICB1cGRhdGVCb3VuZEVsZW1lbnRzKGVsZW1lbnQpO1xuICAgICAgICB9XG4gICAgICB9KSxcbiAgICAgIG9uU3VibWl0OiB3aXRoQmF0Y2hlZFVwZGF0ZXMoKHsgdGV4dCwgdmlhS2V5Ym9hcmQsIG9yaWdpbmFsVGV4dCB9KSA9PiB7XG4gICAgICAgIGNvbnN0IGlzRGVsZXRlZCA9ICF0ZXh0LnRyaW0oKTtcbiAgICAgICAgdXBkYXRlRWxlbWVudCh0ZXh0LCBvcmlnaW5hbFRleHQsIGlzRGVsZXRlZCk7XG4gICAgICAgIC8vIHNlbGVjdCB0aGUgY3JlYXRlZCB0ZXh0IGVsZW1lbnQgb25seSBpZiBzdWJtaXR0aW5nIHZpYSBrZXlib2FyZFxuICAgICAgICAvLyAod2hlbiBzdWJtaXR0aW5nIHZpYSBjbGljayBpdCBzaG91bGQgYWN0IGFzIHNpZ25hbCB0byBkZXNlbGVjdClcbiAgICAgICAgaWYgKCFpc0RlbGV0ZWQgJiYgdmlhS2V5Ym9hcmQpIHtcbiAgICAgICAgICBjb25zdCBlbGVtZW50SWRUb1NlbGVjdCA9IGVsZW1lbnQuY29udGFpbmVySWRcbiAgICAgICAgICAgID8gZWxlbWVudC5jb250YWluZXJJZFxuICAgICAgICAgICAgOiBlbGVtZW50LmlkO1xuICAgICAgICAgIHRoaXMuc2V0U3RhdGUoKHByZXZTdGF0ZSkgPT4gKHtcbiAgICAgICAgICAgIHNlbGVjdGVkRWxlbWVudElkczoge1xuICAgICAgICAgICAgICAuLi5wcmV2U3RhdGUuc2VsZWN0ZWRFbGVtZW50SWRzLFxuICAgICAgICAgICAgICBbZWxlbWVudElkVG9TZWxlY3RdOiB0cnVlLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9KSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlzRGVsZXRlZCkge1xuICAgICAgICAgIGZpeEJpbmRpbmdzQWZ0ZXJEZWxldGlvbih0aGlzLnNjZW5lLmdldE5vbkRlbGV0ZWRFbGVtZW50cygpLCBbXG4gICAgICAgICAgICBlbGVtZW50LFxuICAgICAgICAgIF0pO1xuICAgICAgICB9XG4gICAgICAgIGlmICghaXNEZWxldGVkIHx8IGlzRXhpc3RpbmdFbGVtZW50KSB7XG4gICAgICAgICAgdGhpcy5oaXN0b3J5LnJlc3VtZVJlY29yZGluZygpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgZHJhZ2dpbmdFbGVtZW50OiBudWxsLFxuICAgICAgICAgIGVkaXRpbmdFbGVtZW50OiBudWxsLFxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKHRoaXMuc3RhdGUuYWN0aXZlVG9vbC5sb2NrZWQpIHtcbiAgICAgICAgICBzZXRDdXJzb3JGb3JTaGFwZSh0aGlzLmNhbnZhcywgdGhpcy5zdGF0ZSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmZvY3VzQ29udGFpbmVyKCk7XG4gICAgICB9KSxcbiAgICAgIGVsZW1lbnQsXG4gICAgICBleGNhbGlkcmF3Q29udGFpbmVyOiB0aGlzLmV4Y2FsaWRyYXdDb250YWluZXJSZWYuY3VycmVudCxcbiAgICAgIGFwcDogdGhpcyxcbiAgICB9KTtcbiAgICAvLyBkZXNlbGVjdCBhbGwgb3RoZXIgZWxlbWVudHMgd2hlbiBpbnNlcnRpbmcgdGV4dFxuICAgIHRoaXMuZGVzZWxlY3RFbGVtZW50cygpO1xuXG4gICAgLy8gZG8gYW4gaW5pdGlhbCB1cGRhdGUgdG8gcmUtaW5pdGlhbGl6ZSBlbGVtZW50IHBvc2l0aW9uIHNpbmNlIHdlIHdlcmVcbiAgICAvLyBtb2RpZnlpbmcgZWxlbWVudCdzIHgveSBmb3Igc2FrZSBvZiBlZGl0b3IgKGNhc2U6IHN5bmNpbmcgdG8gcmVtb3RlKVxuICAgIHVwZGF0ZUVsZW1lbnQoZWxlbWVudC50ZXh0LCBlbGVtZW50Lm9yaWdpbmFsVGV4dCwgZmFsc2UpO1xuICB9XG5cbiAgcHJpdmF0ZSBkZXNlbGVjdEVsZW1lbnRzKCkge1xuICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgc2VsZWN0ZWRFbGVtZW50SWRzOiB7fSxcbiAgICAgIHNlbGVjdGVkR3JvdXBJZHM6IHt9LFxuICAgICAgZWRpdGluZ0dyb3VwSWQ6IG51bGwsXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGdldFRleHRFbGVtZW50QXRQb3NpdGlvbihcbiAgICB4OiBudW1iZXIsXG4gICAgeTogbnVtYmVyLFxuICApOiBOb25EZWxldGVkPEV4Y2FsaWRyYXdUZXh0RWxlbWVudD4gfCBudWxsIHtcbiAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5nZXRFbGVtZW50QXRQb3NpdGlvbih4LCB5LCB7XG4gICAgICBpbmNsdWRlQm91bmRUZXh0RWxlbWVudDogdHJ1ZSxcbiAgICB9KTtcblxuICAgIGlmIChlbGVtZW50ICYmIGlzVGV4dEVsZW1lbnQoZWxlbWVudCkgJiYgIWVsZW1lbnQuaXNEZWxldGVkKSB7XG4gICAgICByZXR1cm4gZWxlbWVudDtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBwcml2YXRlIGdldEVsZW1lbnRBdFBvc2l0aW9uKFxuICAgIHg6IG51bWJlcixcbiAgICB5OiBudW1iZXIsXG4gICAgb3B0cz86IHtcbiAgICAgIC8qKiBpZiB0cnVlLCByZXR1cm5zIHRoZSBmaXJzdCBzZWxlY3RlZCBlbGVtZW50ICh3aXRoIGhpZ2hlc3Qgei1pbmRleClcbiAgICAgICAgb2YgYWxsIGhpdCBlbGVtZW50cyAqL1xuICAgICAgcHJlZmVyU2VsZWN0ZWQ/OiBib29sZWFuO1xuICAgICAgaW5jbHVkZUJvdW5kVGV4dEVsZW1lbnQ/OiBib29sZWFuO1xuICAgICAgaW5jbHVkZUxvY2tlZEVsZW1lbnRzPzogYm9vbGVhbjtcbiAgICB9LFxuICApOiBOb25EZWxldGVkPEV4Y2FsaWRyYXdFbGVtZW50PiB8IG51bGwge1xuICAgIGNvbnN0IGFsbEhpdEVsZW1lbnRzID0gdGhpcy5nZXRFbGVtZW50c0F0UG9zaXRpb24oXG4gICAgICB4LFxuICAgICAgeSxcbiAgICAgIG9wdHM/LmluY2x1ZGVCb3VuZFRleHRFbGVtZW50LFxuICAgICAgb3B0cz8uaW5jbHVkZUxvY2tlZEVsZW1lbnRzLFxuICAgICk7XG4gICAgaWYgKGFsbEhpdEVsZW1lbnRzLmxlbmd0aCA+IDEpIHtcbiAgICAgIGlmIChvcHRzPy5wcmVmZXJTZWxlY3RlZCkge1xuICAgICAgICBmb3IgKGxldCBpbmRleCA9IGFsbEhpdEVsZW1lbnRzLmxlbmd0aCAtIDE7IGluZGV4ID4gLTE7IGluZGV4LS0pIHtcbiAgICAgICAgICBpZiAodGhpcy5zdGF0ZS5zZWxlY3RlZEVsZW1lbnRJZHNbYWxsSGl0RWxlbWVudHNbaW5kZXhdLmlkXSkge1xuICAgICAgICAgICAgcmV0dXJuIGFsbEhpdEVsZW1lbnRzW2luZGV4XTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGNvbnN0IGVsZW1lbnRXaXRoSGlnaGVzdFpJbmRleCA9XG4gICAgICAgIGFsbEhpdEVsZW1lbnRzW2FsbEhpdEVsZW1lbnRzLmxlbmd0aCAtIDFdO1xuICAgICAgLy8gSWYgd2UncmUgaGl0dGluZyBlbGVtZW50IHdpdGggaGlnaGVzdCB6LWluZGV4IG9ubHkgb24gaXRzIGJvdW5kaW5nIGJveFxuICAgICAgLy8gd2hpbGUgYWxzbyBoaXR0aW5nIG90aGVyIGVsZW1lbnQgZmlndXJlLCB0aGUgbGF0dGVyIHNob3VsZCBiZSBjb25zaWRlcmVkLlxuICAgICAgcmV0dXJuIGlzSGl0dGluZ0VsZW1lbnRCb3VuZGluZ0JveFdpdGhvdXRIaXR0aW5nRWxlbWVudChcbiAgICAgICAgZWxlbWVudFdpdGhIaWdoZXN0WkluZGV4LFxuICAgICAgICB0aGlzLnN0YXRlLFxuICAgICAgICB4LFxuICAgICAgICB5LFxuICAgICAgKVxuICAgICAgICA/IGFsbEhpdEVsZW1lbnRzW2FsbEhpdEVsZW1lbnRzLmxlbmd0aCAtIDJdXG4gICAgICAgIDogZWxlbWVudFdpdGhIaWdoZXN0WkluZGV4O1xuICAgIH1cbiAgICBpZiAoYWxsSGl0RWxlbWVudHMubGVuZ3RoID09PSAxKSB7XG4gICAgICByZXR1cm4gYWxsSGl0RWxlbWVudHNbMF07XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRFbGVtZW50c0F0UG9zaXRpb24oXG4gICAgeDogbnVtYmVyLFxuICAgIHk6IG51bWJlcixcbiAgICBpbmNsdWRlQm91bmRUZXh0RWxlbWVudDogYm9vbGVhbiA9IGZhbHNlLFxuICAgIGluY2x1ZGVMb2NrZWRFbGVtZW50czogYm9vbGVhbiA9IGZhbHNlLFxuICApOiBOb25EZWxldGVkPEV4Y2FsaWRyYXdFbGVtZW50PltdIHtcbiAgICBjb25zdCBlbGVtZW50cyA9XG4gICAgICBpbmNsdWRlQm91bmRUZXh0RWxlbWVudCAmJiBpbmNsdWRlTG9ja2VkRWxlbWVudHNcbiAgICAgICAgPyB0aGlzLnNjZW5lLmdldE5vbkRlbGV0ZWRFbGVtZW50cygpXG4gICAgICAgIDogdGhpcy5zY2VuZVxuICAgICAgICAgICAgLmdldE5vbkRlbGV0ZWRFbGVtZW50cygpXG4gICAgICAgICAgICAuZmlsdGVyKFxuICAgICAgICAgICAgICAoZWxlbWVudCkgPT5cbiAgICAgICAgICAgICAgICAoaW5jbHVkZUxvY2tlZEVsZW1lbnRzIHx8ICFlbGVtZW50LmxvY2tlZCkgJiZcbiAgICAgICAgICAgICAgICAoaW5jbHVkZUJvdW5kVGV4dEVsZW1lbnQgfHxcbiAgICAgICAgICAgICAgICAgICEoaXNUZXh0RWxlbWVudChlbGVtZW50KSAmJiBlbGVtZW50LmNvbnRhaW5lcklkKSksXG4gICAgICAgICAgICApO1xuXG4gICAgcmV0dXJuIGdldEVsZW1lbnRzQXRQb3NpdGlvbihlbGVtZW50cywgKGVsZW1lbnQpID0+XG4gICAgICBoaXRUZXN0KGVsZW1lbnQsIHRoaXMuc3RhdGUsIHgsIHkpLFxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIHN0YXJ0VGV4dEVkaXRpbmcgPSAoe1xuICAgIHNjZW5lWCxcbiAgICBzY2VuZVksXG4gICAgc2hvdWxkQmluZCxcbiAgICBpbnNlcnRBdFBhcmVudENlbnRlciA9IHRydWUsXG4gIH06IHtcbiAgICAvKiogWCBwb3NpdGlvbiB0byBpbnNlcnQgdGV4dCBhdCAqL1xuICAgIHNjZW5lWDogbnVtYmVyO1xuICAgIC8qKiBZIHBvc2l0aW9uIHRvIGluc2VydCB0ZXh0IGF0ICovXG4gICAgc2NlbmVZOiBudW1iZXI7XG4gICAgc2hvdWxkQmluZDogYm9vbGVhbjtcbiAgICAvKiogd2hldGhlciB0byBhdHRlbXB0IHRvIGluc2VydCBhdCBlbGVtZW50IGNlbnRlciBpZiBhcHBsaWNhYmxlICovXG4gICAgaW5zZXJ0QXRQYXJlbnRDZW50ZXI/OiBib29sZWFuO1xuICB9KSA9PiB7XG4gICAgbGV0IHBhcmVudENlbnRlclBvc2l0aW9uID1cbiAgICAgIGluc2VydEF0UGFyZW50Q2VudGVyICYmXG4gICAgICB0aGlzLmdldFRleHRXeXNpd3lnU25hcHBlZFRvQ2VudGVyUG9zaXRpb24oXG4gICAgICAgIHNjZW5lWCxcbiAgICAgICAgc2NlbmVZLFxuICAgICAgICB0aGlzLnN0YXRlLFxuICAgICAgICB0aGlzLmNhbnZhcyxcbiAgICAgICAgd2luZG93LmRldmljZVBpeGVsUmF0aW8sXG4gICAgICApO1xuXG4gICAgbGV0IGV4aXN0aW5nVGV4dEVsZW1lbnQ6IE5vbkRlbGV0ZWQ8RXhjYWxpZHJhd1RleHRFbGVtZW50PiB8IG51bGwgPSBudWxsO1xuICAgIGxldCBjb250YWluZXI6IEV4Y2FsaWRyYXdUZXh0Q29udGFpbmVyIHwgbnVsbCA9IG51bGw7XG5cbiAgICBjb25zdCBzZWxlY3RlZEVsZW1lbnRzID0gZ2V0U2VsZWN0ZWRFbGVtZW50cyhcbiAgICAgIHRoaXMuc2NlbmUuZ2V0Tm9uRGVsZXRlZEVsZW1lbnRzKCksXG4gICAgICB0aGlzLnN0YXRlLFxuICAgICk7XG5cbiAgICBpZiAoc2VsZWN0ZWRFbGVtZW50cy5sZW5ndGggPT09IDEpIHtcbiAgICAgIGlmIChpc1RleHRFbGVtZW50KHNlbGVjdGVkRWxlbWVudHNbMF0pKSB7XG4gICAgICAgIGV4aXN0aW5nVGV4dEVsZW1lbnQgPSBzZWxlY3RlZEVsZW1lbnRzWzBdO1xuICAgICAgfSBlbHNlIGlmIChpc1RleHRCaW5kYWJsZUNvbnRhaW5lcihzZWxlY3RlZEVsZW1lbnRzWzBdLCBmYWxzZSkpIHtcbiAgICAgICAgZXhpc3RpbmdUZXh0RWxlbWVudCA9IGdldEJvdW5kVGV4dEVsZW1lbnQoc2VsZWN0ZWRFbGVtZW50c1swXSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBleGlzdGluZ1RleHRFbGVtZW50ID0gdGhpcy5nZXRUZXh0RWxlbWVudEF0UG9zaXRpb24oc2NlbmVYLCBzY2VuZVkpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBleGlzdGluZ1RleHRFbGVtZW50ID0gdGhpcy5nZXRUZXh0RWxlbWVudEF0UG9zaXRpb24oc2NlbmVYLCBzY2VuZVkpO1xuICAgIH1cblxuICAgIC8vIGJpbmQgdG8gY29udGFpbmVyIHdoZW4gc2hvdWxkQmluZCBpcyB0cnVlIG9yXG4gICAgLy8gY2xpY2tlZCBvbiBjZW50ZXIgb2YgY29udGFpbmVyXG4gICAgaWYgKFxuICAgICAgIWNvbnRhaW5lciAmJlxuICAgICAgIWV4aXN0aW5nVGV4dEVsZW1lbnQgJiZcbiAgICAgIChzaG91bGRCaW5kIHx8IHBhcmVudENlbnRlclBvc2l0aW9uKVxuICAgICkge1xuICAgICAgY29udGFpbmVyID0gZ2V0VGV4dEJpbmRhYmxlQ29udGFpbmVyQXRQb3NpdGlvbihcbiAgICAgICAgdGhpcy5zY2VuZVxuICAgICAgICAgIC5nZXROb25EZWxldGVkRWxlbWVudHMoKVxuICAgICAgICAgIC5maWx0ZXIoXG4gICAgICAgICAgICAoZWxlKSA9PlxuICAgICAgICAgICAgICBpc1RleHRCaW5kYWJsZUNvbnRhaW5lcihlbGUsIGZhbHNlKSAmJiAhZ2V0Qm91bmRUZXh0RWxlbWVudChlbGUpLFxuICAgICAgICAgICksXG4gICAgICAgIHNjZW5lWCxcbiAgICAgICAgc2NlbmVZLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAoIWV4aXN0aW5nVGV4dEVsZW1lbnQgJiYgY29udGFpbmVyKSB7XG4gICAgICBjb25zdCBmb250U3RyaW5nID0ge1xuICAgICAgICBmb250U2l6ZTogdGhpcy5zdGF0ZS5jdXJyZW50SXRlbUZvbnRTaXplLFxuICAgICAgICBmb250RmFtaWx5OiB0aGlzLnN0YXRlLmN1cnJlbnRJdGVtRm9udEZhbWlseSxcbiAgICAgIH07XG4gICAgICBjb25zdCBtaW5XaWR0aCA9IGdldEFwcHJveE1pbkxpbmVXaWR0aChnZXRGb250U3RyaW5nKGZvbnRTdHJpbmcpKTtcbiAgICAgIGNvbnN0IG1pbkhlaWdodCA9IGdldEFwcHJveE1pbkxpbmVIZWlnaHQoZ2V0Rm9udFN0cmluZyhmb250U3RyaW5nKSk7XG4gICAgICBjb25zdCBuZXdIZWlnaHQgPSBNYXRoLm1heChjb250YWluZXIuaGVpZ2h0LCBtaW5IZWlnaHQpO1xuICAgICAgY29uc3QgbmV3V2lkdGggPSBNYXRoLm1heChjb250YWluZXIud2lkdGgsIG1pbldpZHRoKTtcbiAgICAgIG11dGF0ZUVsZW1lbnQoY29udGFpbmVyLCB7IGhlaWdodDogbmV3SGVpZ2h0LCB3aWR0aDogbmV3V2lkdGggfSk7XG4gICAgICBzY2VuZVggPSBjb250YWluZXIueCArIG5ld1dpZHRoIC8gMjtcbiAgICAgIHNjZW5lWSA9IGNvbnRhaW5lci55ICsgbmV3SGVpZ2h0IC8gMjtcbiAgICAgIGlmIChwYXJlbnRDZW50ZXJQb3NpdGlvbikge1xuICAgICAgICBwYXJlbnRDZW50ZXJQb3NpdGlvbiA9IHRoaXMuZ2V0VGV4dFd5c2l3eWdTbmFwcGVkVG9DZW50ZXJQb3NpdGlvbihcbiAgICAgICAgICBzY2VuZVgsXG4gICAgICAgICAgc2NlbmVZLFxuICAgICAgICAgIHRoaXMuc3RhdGUsXG4gICAgICAgICAgdGhpcy5jYW52YXMsXG4gICAgICAgICAgd2luZG93LmRldmljZVBpeGVsUmF0aW8sXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgZWxlbWVudCA9IGV4aXN0aW5nVGV4dEVsZW1lbnRcbiAgICAgID8gZXhpc3RpbmdUZXh0RWxlbWVudFxuICAgICAgOiBuZXdUZXh0RWxlbWVudCh7XG4gICAgICAgICAgeDogcGFyZW50Q2VudGVyUG9zaXRpb25cbiAgICAgICAgICAgID8gcGFyZW50Q2VudGVyUG9zaXRpb24uZWxlbWVudENlbnRlclhcbiAgICAgICAgICAgIDogc2NlbmVYLFxuICAgICAgICAgIHk6IHBhcmVudENlbnRlclBvc2l0aW9uXG4gICAgICAgICAgICA/IHBhcmVudENlbnRlclBvc2l0aW9uLmVsZW1lbnRDZW50ZXJZXG4gICAgICAgICAgICA6IHNjZW5lWSxcbiAgICAgICAgICBzdHJva2VDb2xvcjogdGhpcy5zdGF0ZS5jdXJyZW50SXRlbVN0cm9rZUNvbG9yLFxuICAgICAgICAgIGJhY2tncm91bmRDb2xvcjogdGhpcy5zdGF0ZS5jdXJyZW50SXRlbUJhY2tncm91bmRDb2xvcixcbiAgICAgICAgICBmaWxsU3R5bGU6IHRoaXMuc3RhdGUuY3VycmVudEl0ZW1GaWxsU3R5bGUsXG4gICAgICAgICAgc3Ryb2tlV2lkdGg6IHRoaXMuc3RhdGUuY3VycmVudEl0ZW1TdHJva2VXaWR0aCxcbiAgICAgICAgICBzdHJva2VTdHlsZTogdGhpcy5zdGF0ZS5jdXJyZW50SXRlbVN0cm9rZVN0eWxlLFxuICAgICAgICAgIHJvdWdobmVzczogdGhpcy5zdGF0ZS5jdXJyZW50SXRlbVJvdWdobmVzcyxcbiAgICAgICAgICBvcGFjaXR5OiB0aGlzLnN0YXRlLmN1cnJlbnRJdGVtT3BhY2l0eSxcbiAgICAgICAgICBzdHJva2VTaGFycG5lc3M6IHRoaXMuc3RhdGUuY3VycmVudEl0ZW1TdHJva2VTaGFycG5lc3MsXG4gICAgICAgICAgdGV4dDogXCJcIixcbiAgICAgICAgICBmb250U2l6ZTogdGhpcy5zdGF0ZS5jdXJyZW50SXRlbUZvbnRTaXplLFxuICAgICAgICAgIGZvbnRGYW1pbHk6IHRoaXMuc3RhdGUuY3VycmVudEl0ZW1Gb250RmFtaWx5LFxuICAgICAgICAgIHRleHRBbGlnbjogcGFyZW50Q2VudGVyUG9zaXRpb25cbiAgICAgICAgICAgID8gXCJjZW50ZXJcIlxuICAgICAgICAgICAgOiB0aGlzLnN0YXRlLmN1cnJlbnRJdGVtVGV4dEFsaWduLFxuICAgICAgICAgIHZlcnRpY2FsQWxpZ246IHBhcmVudENlbnRlclBvc2l0aW9uXG4gICAgICAgICAgICA/IFZFUlRJQ0FMX0FMSUdOLk1JRERMRVxuICAgICAgICAgICAgOiBERUZBVUxUX1ZFUlRJQ0FMX0FMSUdOLFxuICAgICAgICAgIGNvbnRhaW5lcklkOiBjb250YWluZXI/LmlkID8/IHVuZGVmaW5lZCxcbiAgICAgICAgICBncm91cElkczogY29udGFpbmVyPy5ncm91cElkcyA/PyBbXSxcbiAgICAgICAgICBsb2NrZWQ6IGZhbHNlLFxuICAgICAgICB9KTtcblxuICAgIHRoaXMuc2V0U3RhdGUoeyBlZGl0aW5nRWxlbWVudDogZWxlbWVudCB9KTtcblxuICAgIGlmICghZXhpc3RpbmdUZXh0RWxlbWVudCkge1xuICAgICAgdGhpcy5zY2VuZS5yZXBsYWNlQWxsRWxlbWVudHMoW1xuICAgICAgICAuLi50aGlzLnNjZW5lLmdldEVsZW1lbnRzSW5jbHVkaW5nRGVsZXRlZCgpLFxuICAgICAgICBlbGVtZW50LFxuICAgICAgXSk7XG5cbiAgICAgIC8vIGNhc2U6IGNyZWF0aW5nIG5ldyB0ZXh0IG5vdCBjZW50ZXJlZCB0byBwYXJlbnQgZWxlbWVudCDihpIgb2Zmc2V0IFlcbiAgICAgIC8vIHNvIHRoYXQgdGhlIHRleHQgaXMgY2VudGVyZWQgdG8gY3Vyc29yIHBvc2l0aW9uXG4gICAgICBpZiAoIXBhcmVudENlbnRlclBvc2l0aW9uKSB7XG4gICAgICAgIG11dGF0ZUVsZW1lbnQoZWxlbWVudCwge1xuICAgICAgICAgIHk6IGVsZW1lbnQueSAtIGVsZW1lbnQuYmFzZWxpbmUgLyAyLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgIGVkaXRpbmdFbGVtZW50OiBlbGVtZW50LFxuICAgIH0pO1xuXG4gICAgdGhpcy5oYW5kbGVUZXh0V3lzaXd5ZyhlbGVtZW50LCB7XG4gICAgICBpc0V4aXN0aW5nRWxlbWVudDogISFleGlzdGluZ1RleHRFbGVtZW50LFxuICAgIH0pO1xuICB9O1xuXG4gIHByaXZhdGUgaGFuZGxlQ2FudmFzRG91YmxlQ2xpY2sgPSAoXG4gICAgZXZlbnQ6IFJlYWN0Lk1vdXNlRXZlbnQ8SFRNTENhbnZhc0VsZW1lbnQ+LFxuICApID0+IHtcbiAgICAvLyBjYXNlOiBkb3VibGUtY2xpY2tpbmcgd2l0aCBhcnJvdy9saW5lIHRvb2wgc2VsZWN0ZWQgd291bGQgYm90aCBjcmVhdGVcbiAgICAvLyB0ZXh0IGFuZCBlbnRlciBtdWx0aUVsZW1lbnQgbW9kZVxuICAgIGlmICh0aGlzLnN0YXRlLm11bHRpRWxlbWVudCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyB3ZSBzaG91bGQgb25seSBiZSBhYmxlIHRvIGRvdWJsZSBjbGljayB3aGVuIG1vZGUgaXMgc2VsZWN0aW9uXG4gICAgaWYgKHRoaXMuc3RhdGUuYWN0aXZlVG9vbC50eXBlICE9PSBcInNlbGVjdGlvblwiKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgc2VsZWN0ZWRFbGVtZW50cyA9IGdldFNlbGVjdGVkRWxlbWVudHMoXG4gICAgICB0aGlzLnNjZW5lLmdldE5vbkRlbGV0ZWRFbGVtZW50cygpLFxuICAgICAgdGhpcy5zdGF0ZSxcbiAgICApO1xuXG4gICAgaWYgKHNlbGVjdGVkRWxlbWVudHMubGVuZ3RoID09PSAxICYmIGlzTGluZWFyRWxlbWVudChzZWxlY3RlZEVsZW1lbnRzWzBdKSkge1xuICAgICAgaWYgKFxuICAgICAgICAhdGhpcy5zdGF0ZS5lZGl0aW5nTGluZWFyRWxlbWVudCB8fFxuICAgICAgICB0aGlzLnN0YXRlLmVkaXRpbmdMaW5lYXJFbGVtZW50LmVsZW1lbnRJZCAhPT0gc2VsZWN0ZWRFbGVtZW50c1swXS5pZFxuICAgICAgKSB7XG4gICAgICAgIHRoaXMuaGlzdG9yeS5yZXN1bWVSZWNvcmRpbmcoKTtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgZWRpdGluZ0xpbmVhckVsZW1lbnQ6IG5ldyBMaW5lYXJFbGVtZW50RWRpdG9yKFxuICAgICAgICAgICAgc2VsZWN0ZWRFbGVtZW50c1swXSxcbiAgICAgICAgICAgIHRoaXMuc2NlbmUsXG4gICAgICAgICAgKSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgcmVzZXRDdXJzb3IodGhpcy5jYW52YXMpO1xuXG4gICAgbGV0IHsgeDogc2NlbmVYLCB5OiBzY2VuZVkgfSA9IHZpZXdwb3J0Q29vcmRzVG9TY2VuZUNvb3JkcyhcbiAgICAgIGV2ZW50LFxuICAgICAgdGhpcy5zdGF0ZSxcbiAgICApO1xuXG4gICAgY29uc3Qgc2VsZWN0ZWRHcm91cElkcyA9IGdldFNlbGVjdGVkR3JvdXBJZHModGhpcy5zdGF0ZSk7XG5cbiAgICBpZiAoc2VsZWN0ZWRHcm91cElkcy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBoaXRFbGVtZW50ID0gdGhpcy5nZXRFbGVtZW50QXRQb3NpdGlvbihzY2VuZVgsIHNjZW5lWSk7XG5cbiAgICAgIGNvbnN0IHNlbGVjdGVkR3JvdXBJZCA9XG4gICAgICAgIGhpdEVsZW1lbnQgJiZcbiAgICAgICAgZ2V0U2VsZWN0ZWRHcm91cElkRm9yRWxlbWVudChoaXRFbGVtZW50LCB0aGlzLnN0YXRlLnNlbGVjdGVkR3JvdXBJZHMpO1xuXG4gICAgICBpZiAoc2VsZWN0ZWRHcm91cElkKSB7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoKHByZXZTdGF0ZSkgPT5cbiAgICAgICAgICBzZWxlY3RHcm91cHNGb3JTZWxlY3RlZEVsZW1lbnRzKFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAuLi5wcmV2U3RhdGUsXG4gICAgICAgICAgICAgIGVkaXRpbmdHcm91cElkOiBzZWxlY3RlZEdyb3VwSWQsXG4gICAgICAgICAgICAgIHNlbGVjdGVkRWxlbWVudElkczogeyBbaGl0RWxlbWVudCEuaWRdOiB0cnVlIH0sXG4gICAgICAgICAgICAgIHNlbGVjdGVkR3JvdXBJZHM6IHt9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHRoaXMuc2NlbmUuZ2V0Tm9uRGVsZXRlZEVsZW1lbnRzKCksXG4gICAgICAgICAgKSxcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJlc2V0Q3Vyc29yKHRoaXMuY2FudmFzKTtcbiAgICBpZiAoIWV2ZW50W0tFWVMuQ1RSTF9PUl9DTURdICYmICF0aGlzLnN0YXRlLnZpZXdNb2RlRW5hYmxlZCkge1xuICAgICAgY29uc3Qgc2VsZWN0ZWRFbGVtZW50cyA9IGdldFNlbGVjdGVkRWxlbWVudHMoXG4gICAgICAgIHRoaXMuc2NlbmUuZ2V0Tm9uRGVsZXRlZEVsZW1lbnRzKCksXG4gICAgICAgIHRoaXMuc3RhdGUsXG4gICAgICApO1xuICAgICAgaWYgKHNlbGVjdGVkRWxlbWVudHMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgIGNvbnN0IHNlbGVjdGVkRWxlbWVudCA9IHNlbGVjdGVkRWxlbWVudHNbMF07XG4gICAgICAgIGNvbnN0IGNhbkJpbmRUZXh0ID0gaGFzQm91bmRUZXh0RWxlbWVudChzZWxlY3RlZEVsZW1lbnQpO1xuICAgICAgICBpZiAoY2FuQmluZFRleHQpIHtcbiAgICAgICAgICBzY2VuZVggPSBzZWxlY3RlZEVsZW1lbnQueCArIHNlbGVjdGVkRWxlbWVudC53aWR0aCAvIDI7XG4gICAgICAgICAgc2NlbmVZID0gc2VsZWN0ZWRFbGVtZW50LnkgKyBzZWxlY3RlZEVsZW1lbnQuaGVpZ2h0IC8gMjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdGhpcy5zdGFydFRleHRFZGl0aW5nKHtcbiAgICAgICAgc2NlbmVYLFxuICAgICAgICBzY2VuZVksXG4gICAgICAgIHNob3VsZEJpbmQ6IGZhbHNlLFxuICAgICAgICBpbnNlcnRBdFBhcmVudENlbnRlcjogIWV2ZW50LmFsdEtleSxcbiAgICAgIH0pO1xuICAgIH1cbiAgfTtcblxuICBwcml2YXRlIGdldEVsZW1lbnRMaW5rQXRQb3NpdGlvbiA9IChcbiAgICBzY2VuZVBvaW50ZXI6IFJlYWRvbmx5PHsgeDogbnVtYmVyOyB5OiBudW1iZXIgfT4sXG4gICAgaGl0RWxlbWVudDogTm9uRGVsZXRlZEV4Y2FsaWRyYXdFbGVtZW50IHwgbnVsbCxcbiAgKTogRXhjYWxpZHJhd0VsZW1lbnQgfCB1bmRlZmluZWQgPT4ge1xuICAgIC8vIFJldmVyc2luZyBzbyB3ZSB0cmF2ZXJzZSB0aGUgZWxlbWVudHMgaW4gZGVjcmVhc2luZyBvcmRlclxuICAgIC8vIG9mIHotaW5kZXhcbiAgICBjb25zdCBlbGVtZW50cyA9IHRoaXMuc2NlbmUuZ2V0Tm9uRGVsZXRlZEVsZW1lbnRzKCkuc2xpY2UoKS5yZXZlcnNlKCk7XG4gICAgbGV0IGhpdEVsZW1lbnRJbmRleCA9IEluZmluaXR5O1xuXG4gICAgcmV0dXJuIGVsZW1lbnRzLmZpbmQoKGVsZW1lbnQsIGluZGV4KSA9PiB7XG4gICAgICBpZiAoaGl0RWxlbWVudCAmJiBlbGVtZW50LmlkID09PSBoaXRFbGVtZW50LmlkKSB7XG4gICAgICAgIGhpdEVsZW1lbnRJbmRleCA9IGluZGV4O1xuICAgICAgfVxuICAgICAgcmV0dXJuIChcbiAgICAgICAgZWxlbWVudC5saW5rICYmXG4gICAgICAgIGluZGV4IDw9IGhpdEVsZW1lbnRJbmRleCAmJlxuICAgICAgICBpc1BvaW50SGl0dGluZ0xpbmtJY29uKFxuICAgICAgICAgIGVsZW1lbnQsXG4gICAgICAgICAgdGhpcy5zdGF0ZSxcbiAgICAgICAgICBbc2NlbmVQb2ludGVyLngsIHNjZW5lUG9pbnRlci55XSxcbiAgICAgICAgICB0aGlzLmRldmljZS5pc01vYmlsZSxcbiAgICAgICAgKVxuICAgICAgKTtcbiAgICB9KTtcbiAgfTtcblxuICBwcml2YXRlIHJlZGlyZWN0VG9MaW5rID0gKFxuICAgIGV2ZW50OiBSZWFjdC5Qb2ludGVyRXZlbnQ8SFRNTENhbnZhc0VsZW1lbnQ+LFxuICAgIGlzVG91Y2hTY3JlZW46IGJvb2xlYW4sXG4gICkgPT4ge1xuICAgIGNvbnN0IGRyYWdnZWREaXN0YW5jZSA9IGRpc3RhbmNlMmQoXG4gICAgICB0aGlzLmxhc3RQb2ludGVyRG93biEuY2xpZW50WCxcbiAgICAgIHRoaXMubGFzdFBvaW50ZXJEb3duIS5jbGllbnRZLFxuICAgICAgdGhpcy5sYXN0UG9pbnRlclVwIS5jbGllbnRYLFxuICAgICAgdGhpcy5sYXN0UG9pbnRlclVwIS5jbGllbnRZLFxuICAgICk7XG4gICAgaWYgKFxuICAgICAgIXRoaXMuaGl0TGlua0VsZW1lbnQgfHxcbiAgICAgIC8vIEZvciB0b3VjaCBzY3JlZW4gYWxsb3cgZHJhZ2dpbmcgdGhyZXNob2xkIGVsc2Ugc3RyaWN0IGNoZWNrXG4gICAgICAoaXNUb3VjaFNjcmVlbiAmJiBkcmFnZ2VkRGlzdGFuY2UgPiBEUkFHR0lOR19USFJFU0hPTEQpIHx8XG4gICAgICAoIWlzVG91Y2hTY3JlZW4gJiYgZHJhZ2dlZERpc3RhbmNlICE9PSAwKVxuICAgICkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBsYXN0UG9pbnRlckRvd25Db29yZHMgPSB2aWV3cG9ydENvb3Jkc1RvU2NlbmVDb29yZHMoXG4gICAgICB0aGlzLmxhc3RQb2ludGVyRG93biEsXG4gICAgICB0aGlzLnN0YXRlLFxuICAgICk7XG4gICAgY29uc3QgbGFzdFBvaW50ZXJEb3duSGl0dGluZ0xpbmtJY29uID0gaXNQb2ludEhpdHRpbmdMaW5rSWNvbihcbiAgICAgIHRoaXMuaGl0TGlua0VsZW1lbnQsXG4gICAgICB0aGlzLnN0YXRlLFxuICAgICAgW2xhc3RQb2ludGVyRG93bkNvb3Jkcy54LCBsYXN0UG9pbnRlckRvd25Db29yZHMueV0sXG4gICAgICB0aGlzLmRldmljZS5pc01vYmlsZSxcbiAgICApO1xuICAgIGNvbnN0IGxhc3RQb2ludGVyVXBDb29yZHMgPSB2aWV3cG9ydENvb3Jkc1RvU2NlbmVDb29yZHMoXG4gICAgICB0aGlzLmxhc3RQb2ludGVyVXAhLFxuICAgICAgdGhpcy5zdGF0ZSxcbiAgICApO1xuICAgIGNvbnN0IGxhc3RQb2ludGVyVXBIaXR0aW5nTGlua0ljb24gPSBpc1BvaW50SGl0dGluZ0xpbmtJY29uKFxuICAgICAgdGhpcy5oaXRMaW5rRWxlbWVudCxcbiAgICAgIHRoaXMuc3RhdGUsXG4gICAgICBbbGFzdFBvaW50ZXJVcENvb3Jkcy54LCBsYXN0UG9pbnRlclVwQ29vcmRzLnldLFxuICAgICAgdGhpcy5kZXZpY2UuaXNNb2JpbGUsXG4gICAgKTtcbiAgICBpZiAobGFzdFBvaW50ZXJEb3duSGl0dGluZ0xpbmtJY29uICYmIGxhc3RQb2ludGVyVXBIaXR0aW5nTGlua0ljb24pIHtcbiAgICAgIGNvbnN0IHVybCA9IHRoaXMuaGl0TGlua0VsZW1lbnQubGluaztcbiAgICAgIGlmICh1cmwpIHtcbiAgICAgICAgbGV0IGN1c3RvbUV2ZW50O1xuICAgICAgICBpZiAodGhpcy5wcm9wcy5vbkxpbmtPcGVuKSB7XG4gICAgICAgICAgY3VzdG9tRXZlbnQgPSB3cmFwRXZlbnQoRVZFTlQuRVhDQUxJRFJBV19MSU5LLCBldmVudC5uYXRpdmVFdmVudCk7XG4gICAgICAgICAgdGhpcy5wcm9wcy5vbkxpbmtPcGVuKHRoaXMuaGl0TGlua0VsZW1lbnQsIGN1c3RvbUV2ZW50KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWN1c3RvbUV2ZW50Py5kZWZhdWx0UHJldmVudGVkKSB7XG4gICAgICAgICAgY29uc3QgdGFyZ2V0ID0gaXNMb2NhbExpbmsodXJsKSA/IFwiX3NlbGZcIiA6IFwiX2JsYW5rXCI7XG4gICAgICAgICAgY29uc3QgbmV3V2luZG93ID0gd2luZG93Lm9wZW4odW5kZWZpbmVkLCB0YXJnZXQpO1xuICAgICAgICAgIC8vIGh0dHBzOi8vbWF0aGlhc2J5bmVucy5naXRodWIuaW8vcmVsLW5vb3BlbmVyL1xuICAgICAgICAgIGlmIChuZXdXaW5kb3cpIHtcbiAgICAgICAgICAgIG5ld1dpbmRvdy5vcGVuZXIgPSBudWxsO1xuICAgICAgICAgICAgbmV3V2luZG93LmxvY2F0aW9uID0gbm9ybWFsaXplTGluayh1cmwpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICBwcml2YXRlIGhhbmRsZUNhbnZhc1BvaW50ZXJNb3ZlID0gKFxuICAgIGV2ZW50OiBSZWFjdC5Qb2ludGVyRXZlbnQ8SFRNTENhbnZhc0VsZW1lbnQ+LFxuICApID0+IHtcbiAgICB0aGlzLnNhdmVQb2ludGVyKGV2ZW50LmNsaWVudFgsIGV2ZW50LmNsaWVudFksIHRoaXMuc3RhdGUuY3Vyc29yQnV0dG9uKTtcbiAgICBpZiAoZ2VzdHVyZS5wb2ludGVycy5oYXMoZXZlbnQucG9pbnRlcklkKSkge1xuICAgICAgZ2VzdHVyZS5wb2ludGVycy5zZXQoZXZlbnQucG9pbnRlcklkLCB7XG4gICAgICAgIHg6IGV2ZW50LmNsaWVudFgsXG4gICAgICAgIHk6IGV2ZW50LmNsaWVudFksXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBjb25zdCBpbml0aWFsU2NhbGUgPSBnZXN0dXJlLmluaXRpYWxTY2FsZTtcbiAgICBpZiAoXG4gICAgICBnZXN0dXJlLnBvaW50ZXJzLnNpemUgPT09IDIgJiZcbiAgICAgIGdlc3R1cmUubGFzdENlbnRlciAmJlxuICAgICAgaW5pdGlhbFNjYWxlICYmXG4gICAgICBnZXN0dXJlLmluaXRpYWxEaXN0YW5jZVxuICAgICkge1xuICAgICAgY29uc3QgY2VudGVyID0gZ2V0Q2VudGVyKGdlc3R1cmUucG9pbnRlcnMpO1xuICAgICAgY29uc3QgZGVsdGFYID0gY2VudGVyLnggLSBnZXN0dXJlLmxhc3RDZW50ZXIueDtcbiAgICAgIGNvbnN0IGRlbHRhWSA9IGNlbnRlci55IC0gZ2VzdHVyZS5sYXN0Q2VudGVyLnk7XG4gICAgICBnZXN0dXJlLmxhc3RDZW50ZXIgPSBjZW50ZXI7XG5cbiAgICAgIGNvbnN0IGRpc3RhbmNlID0gZ2V0RGlzdGFuY2UoQXJyYXkuZnJvbShnZXN0dXJlLnBvaW50ZXJzLnZhbHVlcygpKSk7XG4gICAgICBjb25zdCBzY2FsZUZhY3RvciA9XG4gICAgICAgIHRoaXMuc3RhdGUuYWN0aXZlVG9vbC50eXBlID09PSBcImZyZWVkcmF3XCIgJiYgdGhpcy5zdGF0ZS5wZW5Nb2RlXG4gICAgICAgICAgPyAxXG4gICAgICAgICAgOiBkaXN0YW5jZSAvIGdlc3R1cmUuaW5pdGlhbERpc3RhbmNlO1xuXG4gICAgICBjb25zdCBuZXh0Wm9vbSA9IHNjYWxlRmFjdG9yXG4gICAgICAgID8gZ2V0Tm9ybWFsaXplZFpvb20oaW5pdGlhbFNjYWxlICogc2NhbGVGYWN0b3IpXG4gICAgICAgIDogdGhpcy5zdGF0ZS56b29tLnZhbHVlO1xuXG4gICAgICB0aGlzLnNldFN0YXRlKChzdGF0ZSkgPT4ge1xuICAgICAgICBjb25zdCB6b29tU3RhdGUgPSBnZXRTdGF0ZUZvclpvb20oXG4gICAgICAgICAge1xuICAgICAgICAgICAgdmlld3BvcnRYOiBjZW50ZXIueCxcbiAgICAgICAgICAgIHZpZXdwb3J0WTogY2VudGVyLnksXG4gICAgICAgICAgICBuZXh0Wm9vbSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHN0YXRlLFxuICAgICAgICApO1xuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgem9vbTogem9vbVN0YXRlLnpvb20sXG4gICAgICAgICAgc2Nyb2xsWDogem9vbVN0YXRlLnNjcm9sbFggKyBkZWx0YVggLyBuZXh0Wm9vbSxcbiAgICAgICAgICBzY3JvbGxZOiB6b29tU3RhdGUuc2Nyb2xsWSArIGRlbHRhWSAvIG5leHRab29tLFxuICAgICAgICAgIHNob3VsZENhY2hlSWdub3JlWm9vbTogdHJ1ZSxcbiAgICAgICAgfTtcbiAgICAgIH0pO1xuICAgICAgdGhpcy5yZXNldFNob3VsZENhY2hlSWdub3JlWm9vbURlYm91bmNlZCgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBnZXN0dXJlLmxhc3RDZW50ZXIgPVxuICAgICAgICBnZXN0dXJlLmluaXRpYWxEaXN0YW5jZSA9XG4gICAgICAgIGdlc3R1cmUuaW5pdGlhbFNjYWxlID1cbiAgICAgICAgICBudWxsO1xuICAgIH1cblxuICAgIGlmIChpc0hvbGRpbmdTcGFjZSB8fCBpc1Bhbm5pbmcgfHwgaXNEcmFnZ2luZ1Njcm9sbEJhcikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGlzUG9pbnRlck92ZXJTY3JvbGxCYXJzID0gaXNPdmVyU2Nyb2xsQmFycyhcbiAgICAgIGN1cnJlbnRTY3JvbGxCYXJzLFxuICAgICAgZXZlbnQuY2xpZW50WCAtIHRoaXMuc3RhdGUub2Zmc2V0TGVmdCxcbiAgICAgIGV2ZW50LmNsaWVudFkgLSB0aGlzLnN0YXRlLm9mZnNldFRvcCxcbiAgICApO1xuICAgIGNvbnN0IGlzT3ZlclNjcm9sbEJhciA9IGlzUG9pbnRlck92ZXJTY3JvbGxCYXJzLmlzT3ZlckVpdGhlcjtcbiAgICBpZiAoIXRoaXMuc3RhdGUuZHJhZ2dpbmdFbGVtZW50ICYmICF0aGlzLnN0YXRlLm11bHRpRWxlbWVudCkge1xuICAgICAgaWYgKGlzT3ZlclNjcm9sbEJhcikge1xuICAgICAgICByZXNldEN1cnNvcih0aGlzLmNhbnZhcyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzZXRDdXJzb3JGb3JTaGFwZSh0aGlzLmNhbnZhcywgdGhpcy5zdGF0ZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3Qgc2NlbmVQb2ludGVyID0gdmlld3BvcnRDb29yZHNUb1NjZW5lQ29vcmRzKGV2ZW50LCB0aGlzLnN0YXRlKTtcbiAgICBjb25zdCB7IHg6IHNjZW5lUG9pbnRlclgsIHk6IHNjZW5lUG9pbnRlclkgfSA9IHNjZW5lUG9pbnRlcjtcblxuICAgIGlmIChcbiAgICAgIHRoaXMuc3RhdGUuZWRpdGluZ0xpbmVhckVsZW1lbnQgJiZcbiAgICAgICF0aGlzLnN0YXRlLmVkaXRpbmdMaW5lYXJFbGVtZW50LmlzRHJhZ2dpbmdcbiAgICApIHtcbiAgICAgIGNvbnN0IGVkaXRpbmdMaW5lYXJFbGVtZW50ID0gTGluZWFyRWxlbWVudEVkaXRvci5oYW5kbGVQb2ludGVyTW92ZShcbiAgICAgICAgZXZlbnQsXG4gICAgICAgIHNjZW5lUG9pbnRlclgsXG4gICAgICAgIHNjZW5lUG9pbnRlclksXG4gICAgICAgIHRoaXMuc3RhdGUuZWRpdGluZ0xpbmVhckVsZW1lbnQsXG4gICAgICAgIHRoaXMuc3RhdGUuZ3JpZFNpemUsXG4gICAgICApO1xuICAgICAgaWYgKGVkaXRpbmdMaW5lYXJFbGVtZW50ICE9PSB0aGlzLnN0YXRlLmVkaXRpbmdMaW5lYXJFbGVtZW50KSB7XG4gICAgICAgIC8vIFNpbmNlIHdlIGFyZSByZWFkaW5nIGZyb20gcHJldmlvdXMgc3RhdGUgd2hpY2ggaXMgbm90IHBvc3NpYmxlIHdpdGhcbiAgICAgICAgLy8gYXV0b21hdGljIGJhdGNoaW5nIGluIFJlYWN0IDE4IGhlbmNlIHVzaW5nIGZsdXNoIHN5bmMgdG8gc3luY2hyb25vdXNseVxuICAgICAgICAvLyB1cGRhdGUgdGhlIHN0YXRlLiBDaGVjayBodHRwczovL2dpdGh1Yi5jb20vZXhjYWxpZHJhdy9leGNhbGlkcmF3L3B1bGwvNTUwOCBmb3IgbW9yZSBkZXRhaWxzLlxuICAgICAgICBmbHVzaFN5bmMoKCkgPT4ge1xuICAgICAgICAgIHRoaXMuc2V0U3RhdGUoeyBlZGl0aW5nTGluZWFyRWxlbWVudCB9KTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBpZiAoZWRpdGluZ0xpbmVhckVsZW1lbnQubGFzdFVuY29tbWl0dGVkUG9pbnQgIT0gbnVsbCkge1xuICAgICAgICB0aGlzLm1heWJlU3VnZ2VzdEJpbmRpbmdBdEN1cnNvcihzY2VuZVBvaW50ZXIpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7IHN1Z2dlc3RlZEJpbmRpbmdzOiBbXSB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoaXNCaW5kaW5nRWxlbWVudFR5cGUodGhpcy5zdGF0ZS5hY3RpdmVUb29sLnR5cGUpKSB7XG4gICAgICAvLyBIb3ZlcmluZyB3aXRoIGEgc2VsZWN0ZWQgdG9vbCBvciBjcmVhdGluZyBuZXcgbGluZWFyIGVsZW1lbnQgdmlhIGNsaWNrXG4gICAgICAvLyBhbmQgcG9pbnRcbiAgICAgIGNvbnN0IHsgZHJhZ2dpbmdFbGVtZW50IH0gPSB0aGlzLnN0YXRlO1xuICAgICAgaWYgKGlzQmluZGluZ0VsZW1lbnQoZHJhZ2dpbmdFbGVtZW50LCBmYWxzZSkpIHtcbiAgICAgICAgdGhpcy5tYXliZVN1Z2dlc3RCaW5kaW5nc0ZvckxpbmVhckVsZW1lbnRBdENvb3JkcyhcbiAgICAgICAgICBkcmFnZ2luZ0VsZW1lbnQsXG4gICAgICAgICAgW3NjZW5lUG9pbnRlcl0sXG4gICAgICAgICAgdGhpcy5zdGF0ZS5zdGFydEJvdW5kRWxlbWVudCxcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMubWF5YmVTdWdnZXN0QmluZGluZ0F0Q3Vyc29yKHNjZW5lUG9pbnRlcik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuc3RhdGUubXVsdGlFbGVtZW50KSB7XG4gICAgICBjb25zdCB7IG11bHRpRWxlbWVudCB9ID0gdGhpcy5zdGF0ZTtcbiAgICAgIGNvbnN0IHsgeDogcngsIHk6IHJ5IH0gPSBtdWx0aUVsZW1lbnQ7XG5cbiAgICAgIGNvbnN0IHsgcG9pbnRzLCBsYXN0Q29tbWl0dGVkUG9pbnQgfSA9IG11bHRpRWxlbWVudDtcbiAgICAgIGNvbnN0IGxhc3RQb2ludCA9IHBvaW50c1twb2ludHMubGVuZ3RoIC0gMV07XG5cbiAgICAgIHNldEN1cnNvckZvclNoYXBlKHRoaXMuY2FudmFzLCB0aGlzLnN0YXRlKTtcblxuICAgICAgaWYgKGxhc3RQb2ludCA9PT0gbGFzdENvbW1pdHRlZFBvaW50KSB7XG4gICAgICAgIC8vIGlmIHdlIGhhdmVuJ3QgeWV0IGNyZWF0ZWQgYSB0ZW1wIHBvaW50IGFuZCB3ZSdyZSBiZXlvbmQgY29tbWl0LXpvbmVcbiAgICAgICAgLy8gdGhyZXNob2xkLCBhZGQgYSBwb2ludFxuICAgICAgICBpZiAoXG4gICAgICAgICAgZGlzdGFuY2UyZChcbiAgICAgICAgICAgIHNjZW5lUG9pbnRlclggLSByeCxcbiAgICAgICAgICAgIHNjZW5lUG9pbnRlclkgLSByeSxcbiAgICAgICAgICAgIGxhc3RQb2ludFswXSxcbiAgICAgICAgICAgIGxhc3RQb2ludFsxXSxcbiAgICAgICAgICApID49IExJTkVfQ09ORklSTV9USFJFU0hPTERcbiAgICAgICAgKSB7XG4gICAgICAgICAgbXV0YXRlRWxlbWVudChtdWx0aUVsZW1lbnQsIHtcbiAgICAgICAgICAgIHBvaW50czogWy4uLnBvaW50cywgW3NjZW5lUG9pbnRlclggLSByeCwgc2NlbmVQb2ludGVyWSAtIHJ5XV0sXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc2V0Q3Vyc29yKHRoaXMuY2FudmFzLCBDVVJTT1JfVFlQRS5QT0lOVEVSKTtcbiAgICAgICAgICAvLyBpbiB0aGlzIGJyYW5jaCwgd2UncmUgaW5zaWRlIHRoZSBjb21taXQgem9uZSwgYW5kIG5vIHVuY29tbWl0dGVkXG4gICAgICAgICAgLy8gcG9pbnQgZXhpc3RzLiBUaHVzIGRvIG5vdGhpbmcgKGRvbid0IGFkZC9yZW1vdmUgcG9pbnRzKS5cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgcG9pbnRzLmxlbmd0aCA+IDIgJiZcbiAgICAgICAgbGFzdENvbW1pdHRlZFBvaW50ICYmXG4gICAgICAgIGRpc3RhbmNlMmQoXG4gICAgICAgICAgc2NlbmVQb2ludGVyWCAtIHJ4LFxuICAgICAgICAgIHNjZW5lUG9pbnRlclkgLSByeSxcbiAgICAgICAgICBsYXN0Q29tbWl0dGVkUG9pbnRbMF0sXG4gICAgICAgICAgbGFzdENvbW1pdHRlZFBvaW50WzFdLFxuICAgICAgICApIDwgTElORV9DT05GSVJNX1RIUkVTSE9MRFxuICAgICAgKSB7XG4gICAgICAgIHNldEN1cnNvcih0aGlzLmNhbnZhcywgQ1VSU09SX1RZUEUuUE9JTlRFUik7XG4gICAgICAgIG11dGF0ZUVsZW1lbnQobXVsdGlFbGVtZW50LCB7XG4gICAgICAgICAgcG9pbnRzOiBwb2ludHMuc2xpY2UoMCwgLTEpLFxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChpc1BhdGhBTG9vcChwb2ludHMsIHRoaXMuc3RhdGUuem9vbS52YWx1ZSkpIHtcbiAgICAgICAgICBzZXRDdXJzb3IodGhpcy5jYW52YXMsIENVUlNPUl9UWVBFLlBPSU5URVIpO1xuICAgICAgICB9XG4gICAgICAgIC8vIHVwZGF0ZSBsYXN0IHVuY29tbWl0dGVkIHBvaW50XG4gICAgICAgIG11dGF0ZUVsZW1lbnQobXVsdGlFbGVtZW50LCB7XG4gICAgICAgICAgcG9pbnRzOiBbXG4gICAgICAgICAgICAuLi5wb2ludHMuc2xpY2UoMCwgLTEpLFxuICAgICAgICAgICAgW3NjZW5lUG9pbnRlclggLSByeCwgc2NlbmVQb2ludGVyWSAtIHJ5XSxcbiAgICAgICAgICBdLFxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGhhc0Rlc2VsZWN0ZWRCdXR0b24gPSBCb29sZWFuKGV2ZW50LmJ1dHRvbnMpO1xuICAgIGlmIChcbiAgICAgIGhhc0Rlc2VsZWN0ZWRCdXR0b24gfHxcbiAgICAgICh0aGlzLnN0YXRlLmFjdGl2ZVRvb2wudHlwZSAhPT0gXCJzZWxlY3Rpb25cIiAmJlxuICAgICAgICB0aGlzLnN0YXRlLmFjdGl2ZVRvb2wudHlwZSAhPT0gXCJ0ZXh0XCIgJiZcbiAgICAgICAgdGhpcy5zdGF0ZS5hY3RpdmVUb29sLnR5cGUgIT09IFwiZXJhc2VyXCIpXG4gICAgKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgZWxlbWVudHMgPSB0aGlzLnNjZW5lLmdldE5vbkRlbGV0ZWRFbGVtZW50cygpO1xuXG4gICAgY29uc3Qgc2VsZWN0ZWRFbGVtZW50cyA9IGdldFNlbGVjdGVkRWxlbWVudHMoZWxlbWVudHMsIHRoaXMuc3RhdGUpO1xuICAgIGlmIChcbiAgICAgIHNlbGVjdGVkRWxlbWVudHMubGVuZ3RoID09PSAxICYmXG4gICAgICAhaXNPdmVyU2Nyb2xsQmFyICYmXG4gICAgICAhdGhpcy5zdGF0ZS5lZGl0aW5nTGluZWFyRWxlbWVudFxuICAgICkge1xuICAgICAgY29uc3QgZWxlbWVudFdpdGhUcmFuc2Zvcm1IYW5kbGVUeXBlID0gZ2V0RWxlbWVudFdpdGhUcmFuc2Zvcm1IYW5kbGVUeXBlKFxuICAgICAgICBlbGVtZW50cyxcbiAgICAgICAgdGhpcy5zdGF0ZSxcbiAgICAgICAgc2NlbmVQb2ludGVyWCxcbiAgICAgICAgc2NlbmVQb2ludGVyWSxcbiAgICAgICAgdGhpcy5zdGF0ZS56b29tLFxuICAgICAgICBldmVudC5wb2ludGVyVHlwZSxcbiAgICAgICk7XG4gICAgICBpZiAoXG4gICAgICAgIGVsZW1lbnRXaXRoVHJhbnNmb3JtSGFuZGxlVHlwZSAmJlxuICAgICAgICBlbGVtZW50V2l0aFRyYW5zZm9ybUhhbmRsZVR5cGUudHJhbnNmb3JtSGFuZGxlVHlwZVxuICAgICAgKSB7XG4gICAgICAgIHNldEN1cnNvcihcbiAgICAgICAgICB0aGlzLmNhbnZhcyxcbiAgICAgICAgICBnZXRDdXJzb3JGb3JSZXNpemluZ0VsZW1lbnQoZWxlbWVudFdpdGhUcmFuc2Zvcm1IYW5kbGVUeXBlKSxcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoc2VsZWN0ZWRFbGVtZW50cy5sZW5ndGggPiAxICYmICFpc092ZXJTY3JvbGxCYXIpIHtcbiAgICAgIGNvbnN0IHRyYW5zZm9ybUhhbmRsZVR5cGUgPSBnZXRUcmFuc2Zvcm1IYW5kbGVUeXBlRnJvbUNvb3JkcyhcbiAgICAgICAgZ2V0Q29tbW9uQm91bmRzKHNlbGVjdGVkRWxlbWVudHMpLFxuICAgICAgICBzY2VuZVBvaW50ZXJYLFxuICAgICAgICBzY2VuZVBvaW50ZXJZLFxuICAgICAgICB0aGlzLnN0YXRlLnpvb20sXG4gICAgICAgIGV2ZW50LnBvaW50ZXJUeXBlLFxuICAgICAgKTtcbiAgICAgIGlmICh0cmFuc2Zvcm1IYW5kbGVUeXBlKSB7XG4gICAgICAgIHNldEN1cnNvcihcbiAgICAgICAgICB0aGlzLmNhbnZhcyxcbiAgICAgICAgICBnZXRDdXJzb3JGb3JSZXNpemluZ0VsZW1lbnQoe1xuICAgICAgICAgICAgdHJhbnNmb3JtSGFuZGxlVHlwZSxcbiAgICAgICAgICB9KSxcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGhpdEVsZW1lbnQgPSB0aGlzLmdldEVsZW1lbnRBdFBvc2l0aW9uKFxuICAgICAgc2NlbmVQb2ludGVyLngsXG4gICAgICBzY2VuZVBvaW50ZXIueSxcbiAgICApO1xuICAgIHRoaXMuaGl0TGlua0VsZW1lbnQgPSB0aGlzLmdldEVsZW1lbnRMaW5rQXRQb3NpdGlvbihcbiAgICAgIHNjZW5lUG9pbnRlcixcbiAgICAgIGhpdEVsZW1lbnQsXG4gICAgKTtcbiAgICBpZiAoaXNFcmFzZXJBY3RpdmUodGhpcy5zdGF0ZSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKFxuICAgICAgdGhpcy5oaXRMaW5rRWxlbWVudCAmJlxuICAgICAgIXRoaXMuc3RhdGUuc2VsZWN0ZWRFbGVtZW50SWRzW3RoaXMuaGl0TGlua0VsZW1lbnQuaWRdXG4gICAgKSB7XG4gICAgICBzZXRDdXJzb3IodGhpcy5jYW52YXMsIENVUlNPUl9UWVBFLlBPSU5URVIpO1xuICAgICAgc2hvd0h5cGVybGlua1Rvb2x0aXAodGhpcy5oaXRMaW5rRWxlbWVudCwgdGhpcy5zdGF0ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGhpZGVIeXBlcmxpbmtUb29saXAoKTtcbiAgICAgIGlmIChcbiAgICAgICAgaGl0RWxlbWVudCAmJlxuICAgICAgICBoaXRFbGVtZW50LmxpbmsgJiZcbiAgICAgICAgdGhpcy5zdGF0ZS5zZWxlY3RlZEVsZW1lbnRJZHNbaGl0RWxlbWVudC5pZF0gJiZcbiAgICAgICAgIXRoaXMuY29udGV4dE1lbnVPcGVuICYmXG4gICAgICAgICF0aGlzLnN0YXRlLnNob3dIeXBlcmxpbmtQb3B1cFxuICAgICAgKSB7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoeyBzaG93SHlwZXJsaW5rUG9wdXA6IFwiaW5mb1wiIH0pO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLnN0YXRlLmFjdGl2ZVRvb2wudHlwZSA9PT0gXCJ0ZXh0XCIpIHtcbiAgICAgICAgc2V0Q3Vyc29yKFxuICAgICAgICAgIHRoaXMuY2FudmFzLFxuICAgICAgICAgIGlzVGV4dEVsZW1lbnQoaGl0RWxlbWVudCkgPyBDVVJTT1JfVFlQRS5URVhUIDogQ1VSU09SX1RZUEUuQ1JPU1NIQUlSLFxuICAgICAgICApO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLnN0YXRlLnZpZXdNb2RlRW5hYmxlZCkge1xuICAgICAgICBzZXRDdXJzb3IodGhpcy5jYW52YXMsIENVUlNPUl9UWVBFLkdSQUIpO1xuICAgICAgfSBlbHNlIGlmIChpc092ZXJTY3JvbGxCYXIpIHtcbiAgICAgICAgc2V0Q3Vyc29yKHRoaXMuY2FudmFzLCBDVVJTT1JfVFlQRS5BVVRPKTtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5zdGF0ZS5lZGl0aW5nTGluZWFyRWxlbWVudCkge1xuICAgICAgICBjb25zdCBlbGVtZW50ID0gTGluZWFyRWxlbWVudEVkaXRvci5nZXRFbGVtZW50KFxuICAgICAgICAgIHRoaXMuc3RhdGUuZWRpdGluZ0xpbmVhckVsZW1lbnQuZWxlbWVudElkLFxuICAgICAgICApO1xuXG4gICAgICAgIGlmIChcbiAgICAgICAgICBlbGVtZW50ICYmXG4gICAgICAgICAgaXNIaXR0aW5nRWxlbWVudE5vdENvbnNpZGVyaW5nQm91bmRpbmdCb3goZWxlbWVudCwgdGhpcy5zdGF0ZSwgW1xuICAgICAgICAgICAgc2NlbmVQb2ludGVyLngsXG4gICAgICAgICAgICBzY2VuZVBvaW50ZXIueSxcbiAgICAgICAgICBdKVxuICAgICAgICApIHtcbiAgICAgICAgICBzZXRDdXJzb3IodGhpcy5jYW52YXMsIENVUlNPUl9UWVBFLk1PVkUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHNldEN1cnNvcih0aGlzLmNhbnZhcywgQ1VSU09SX1RZUEUuQVVUTyk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgIC8vIGlmIHVzaW5nIGNtZC9jdHJsLCB3ZSdyZSBub3QgZHJhZ2dpbmdcbiAgICAgICAgIWV2ZW50W0tFWVMuQ1RSTF9PUl9DTURdICYmXG4gICAgICAgIChoaXRFbGVtZW50IHx8XG4gICAgICAgICAgdGhpcy5pc0hpdHRpbmdDb21tb25Cb3VuZGluZ0JveE9mU2VsZWN0ZWRFbGVtZW50cyhcbiAgICAgICAgICAgIHNjZW5lUG9pbnRlcixcbiAgICAgICAgICAgIHNlbGVjdGVkRWxlbWVudHMsXG4gICAgICAgICAgKSkgJiZcbiAgICAgICAgIWhpdEVsZW1lbnQ/LmxvY2tlZFxuICAgICAgKSB7XG4gICAgICAgIHNldEN1cnNvcih0aGlzLmNhbnZhcywgQ1VSU09SX1RZUEUuTU9WRSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzZXRDdXJzb3IodGhpcy5jYW52YXMsIENVUlNPUl9UWVBFLkFVVE8pO1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICBwcml2YXRlIGhhbmRsZUVyYXNlciA9IChcbiAgICBldmVudDogUG9pbnRlckV2ZW50LFxuICAgIHBvaW50ZXJEb3duU3RhdGU6IFBvaW50ZXJEb3duU3RhdGUsXG4gICAgc2NlbmVQb2ludGVyOiB7IHg6IG51bWJlcjsgeTogbnVtYmVyIH0sXG4gICkgPT4ge1xuICAgIGNvbnN0IHVwZGF0ZUVsZW1lbnRJZHMgPSAoZWxlbWVudHM6IEV4Y2FsaWRyYXdFbGVtZW50W10pID0+IHtcbiAgICAgIGVsZW1lbnRzLmZvckVhY2goKGVsZW1lbnQpID0+IHtcbiAgICAgICAgaWYgKGVsZW1lbnQubG9ja2VkKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWRzVG9VcGRhdGUucHVzaChlbGVtZW50LmlkKTtcbiAgICAgICAgaWYgKGV2ZW50LmFsdEtleSkge1xuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIHBvaW50ZXJEb3duU3RhdGUuZWxlbWVudElkc1RvRXJhc2VbZWxlbWVudC5pZF0gJiZcbiAgICAgICAgICAgIHBvaW50ZXJEb3duU3RhdGUuZWxlbWVudElkc1RvRXJhc2VbZWxlbWVudC5pZF0uZXJhc2VcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIHBvaW50ZXJEb3duU3RhdGUuZWxlbWVudElkc1RvRXJhc2VbZWxlbWVudC5pZF0uZXJhc2UgPSBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoIXBvaW50ZXJEb3duU3RhdGUuZWxlbWVudElkc1RvRXJhc2VbZWxlbWVudC5pZF0pIHtcbiAgICAgICAgICBwb2ludGVyRG93blN0YXRlLmVsZW1lbnRJZHNUb0VyYXNlW2VsZW1lbnQuaWRdID0ge1xuICAgICAgICAgICAgZXJhc2U6IHRydWUsXG4gICAgICAgICAgICBvcGFjaXR5OiBlbGVtZW50Lm9wYWNpdHksXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfTtcblxuICAgIGNvbnN0IGlkc1RvVXBkYXRlOiBBcnJheTxzdHJpbmc+ID0gW107XG5cbiAgICBjb25zdCBkaXN0YW5jZSA9IGRpc3RhbmNlMmQoXG4gICAgICBwb2ludGVyRG93blN0YXRlLmxhc3RDb29yZHMueCxcbiAgICAgIHBvaW50ZXJEb3duU3RhdGUubGFzdENvb3Jkcy55LFxuICAgICAgc2NlbmVQb2ludGVyLngsXG4gICAgICBzY2VuZVBvaW50ZXIueSxcbiAgICApO1xuICAgIGNvbnN0IHRocmVzaG9sZCA9IDEwIC8gdGhpcy5zdGF0ZS56b29tLnZhbHVlO1xuICAgIGNvbnN0IHBvaW50ID0geyAuLi5wb2ludGVyRG93blN0YXRlLmxhc3RDb29yZHMgfTtcbiAgICBsZXQgc2FtcGxpbmdJbnRlcnZhbCA9IDA7XG4gICAgd2hpbGUgKHNhbXBsaW5nSW50ZXJ2YWwgPD0gZGlzdGFuY2UpIHtcbiAgICAgIGNvbnN0IGhpdEVsZW1lbnRzID0gdGhpcy5nZXRFbGVtZW50c0F0UG9zaXRpb24ocG9pbnQueCwgcG9pbnQueSk7XG4gICAgICB1cGRhdGVFbGVtZW50SWRzKGhpdEVsZW1lbnRzKTtcblxuICAgICAgLy8gRXhpdCBzaW5jZSB3ZSByZWFjaGVkIGN1cnJlbnQgcG9pbnRcbiAgICAgIGlmIChzYW1wbGluZ0ludGVydmFsID09PSBkaXN0YW5jZSkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgLy8gQ2FsY3VsYXRlIG5leHQgcG9pbnQgaW4gdGhlIGxpbmUgYXQgYSBkaXN0YW5jZSBvZiBzYW1wbGluZyBpbnRlcnZhbFxuICAgICAgc2FtcGxpbmdJbnRlcnZhbCA9IE1hdGgubWluKHNhbXBsaW5nSW50ZXJ2YWwgKyB0aHJlc2hvbGQsIGRpc3RhbmNlKTtcblxuICAgICAgY29uc3QgZGlzdGFuY2VSYXRpbyA9IHNhbXBsaW5nSW50ZXJ2YWwgLyBkaXN0YW5jZTtcbiAgICAgIGNvbnN0IG5leHRYID1cbiAgICAgICAgKDEgLSBkaXN0YW5jZVJhdGlvKSAqIHBvaW50LnggKyBkaXN0YW5jZVJhdGlvICogc2NlbmVQb2ludGVyLng7XG4gICAgICBjb25zdCBuZXh0WSA9XG4gICAgICAgICgxIC0gZGlzdGFuY2VSYXRpbykgKiBwb2ludC55ICsgZGlzdGFuY2VSYXRpbyAqIHNjZW5lUG9pbnRlci55O1xuICAgICAgcG9pbnQueCA9IG5leHRYO1xuICAgICAgcG9pbnQueSA9IG5leHRZO1xuICAgIH1cblxuICAgIGNvbnN0IGVsZW1lbnRzID0gdGhpcy5zY2VuZS5nZXRFbGVtZW50c0luY2x1ZGluZ0RlbGV0ZWQoKS5tYXAoKGVsZSkgPT4ge1xuICAgICAgY29uc3QgaWQgPVxuICAgICAgICBpc0JvdW5kVG9Db250YWluZXIoZWxlKSAmJiBpZHNUb1VwZGF0ZS5pbmNsdWRlcyhlbGUuY29udGFpbmVySWQpXG4gICAgICAgICAgPyBlbGUuY29udGFpbmVySWRcbiAgICAgICAgICA6IGVsZS5pZDtcbiAgICAgIGlmIChpZHNUb1VwZGF0ZS5pbmNsdWRlcyhpZCkpIHtcbiAgICAgICAgaWYgKGV2ZW50LmFsdEtleSkge1xuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIHBvaW50ZXJEb3duU3RhdGUuZWxlbWVudElkc1RvRXJhc2VbaWRdICYmXG4gICAgICAgICAgICBwb2ludGVyRG93blN0YXRlLmVsZW1lbnRJZHNUb0VyYXNlW2lkXS5lcmFzZSA9PT0gZmFsc2VcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIHJldHVybiBuZXdFbGVtZW50V2l0aChlbGUsIHtcbiAgICAgICAgICAgICAgb3BhY2l0eTogcG9pbnRlckRvd25TdGF0ZS5lbGVtZW50SWRzVG9FcmFzZVtpZF0ub3BhY2l0eSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gbmV3RWxlbWVudFdpdGgoZWxlLCB7XG4gICAgICAgICAgICBvcGFjaXR5OiBFTEVNRU5UX1JFQURZX1RPX0VSQVNFX09QQUNJVFksXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBlbGU7XG4gICAgfSk7XG5cbiAgICB0aGlzLnNjZW5lLnJlcGxhY2VBbGxFbGVtZW50cyhlbGVtZW50cyk7XG5cbiAgICBwb2ludGVyRG93blN0YXRlLmxhc3RDb29yZHMueCA9IHNjZW5lUG9pbnRlci54O1xuICAgIHBvaW50ZXJEb3duU3RhdGUubGFzdENvb3Jkcy55ID0gc2NlbmVQb2ludGVyLnk7XG4gIH07XG4gIC8vIHNldCB0b3VjaCBtb3ZpbmcgZm9yIG1vYmlsZSBjb250ZXh0IG1lbnVcbiAgcHJpdmF0ZSBoYW5kbGVUb3VjaE1vdmUgPSAoZXZlbnQ6IFJlYWN0LlRvdWNoRXZlbnQ8SFRNTENhbnZhc0VsZW1lbnQ+KSA9PiB7XG4gICAgaW52YWxpZGF0ZUNvbnRleHRNZW51ID0gdHJ1ZTtcbiAgfTtcblxuICBwcml2YXRlIGhhbmRsZUNhbnZhc1BvaW50ZXJEb3duID0gKFxuICAgIGV2ZW50OiBSZWFjdC5Qb2ludGVyRXZlbnQ8SFRNTENhbnZhc0VsZW1lbnQ+LFxuICApID0+IHtcbiAgICAvLyByZW1vdmUgYW55IGFjdGl2ZSBzZWxlY3Rpb24gd2hlbiB3ZSBzdGFydCB0byBpbnRlcmFjdCB3aXRoIGNhbnZhc1xuICAgIC8vIChtYWlubHksIHdlIGNhcmUgYWJvdXQgcmVtb3Zpbmcgc2VsZWN0aW9uIG91dHNpZGUgdGhlIGNvbXBvbmVudCB3aGljaFxuICAgIC8vICB3b3VsZCBwcmV2ZW50IG91ciBjb3B5IGhhbmRsaW5nIG90aGVyd2lzZSlcbiAgICBjb25zdCBzZWxlY3Rpb24gPSBkb2N1bWVudC5nZXRTZWxlY3Rpb24oKTtcbiAgICBpZiAoc2VsZWN0aW9uPy5hbmNob3JOb2RlKSB7XG4gICAgICBzZWxlY3Rpb24ucmVtb3ZlQWxsUmFuZ2VzKCk7XG4gICAgfVxuICAgIHRoaXMubWF5YmVPcGVuQ29udGV4dE1lbnVBZnRlclBvaW50ZXJEb3duT25Ub3VjaERldmljZXMoZXZlbnQpO1xuICAgIHRoaXMubWF5YmVDbGVhbnVwQWZ0ZXJNaXNzaW5nUG9pbnRlclVwKGV2ZW50KTtcblxuICAgIC8vZmlyZXMgb25seSBvbmNlLCBpZiBwZW4gaXMgZGV0ZWN0ZWQsIHBlbk1vZGUgaXMgZW5hYmxlZFxuICAgIC8vdGhlIHVzZXIgY2FuIGRpc2FibGUgdGhpcyBieSB0b2dnbGluZyB0aGUgcGVuTW9kZSBidXR0b25cbiAgICBpZiAoIXRoaXMuc3RhdGUucGVuRGV0ZWN0ZWQgJiYgZXZlbnQucG9pbnRlclR5cGUgPT09IFwicGVuXCIpIHtcbiAgICAgIHRoaXMuc2V0U3RhdGUoKHByZXZTdGF0ZSkgPT4ge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHBlbk1vZGU6IHRydWUsXG4gICAgICAgICAgcGVuRGV0ZWN0ZWQ6IHRydWUsXG4gICAgICAgIH07XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICAhdGhpcy5kZXZpY2UuaXNUb3VjaFNjcmVlbiAmJlxuICAgICAgW1wicGVuXCIsIFwidG91Y2hcIl0uaW5jbHVkZXMoZXZlbnQucG9pbnRlclR5cGUpXG4gICAgKSB7XG4gICAgICB0aGlzLmRldmljZSA9IHVwZGF0ZU9iamVjdCh0aGlzLmRldmljZSwgeyBpc1RvdWNoU2NyZWVuOiB0cnVlIH0pO1xuICAgIH1cblxuICAgIGlmIChpc1Bhbm5pbmcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmxhc3RQb2ludGVyRG93biA9IGV2ZW50O1xuICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgbGFzdFBvaW50ZXJEb3duV2l0aDogZXZlbnQucG9pbnRlclR5cGUsXG4gICAgICBjdXJzb3JCdXR0b246IFwiZG93blwiLFxuICAgIH0pO1xuICAgIHRoaXMuc2F2ZVBvaW50ZXIoZXZlbnQuY2xpZW50WCwgZXZlbnQuY2xpZW50WSwgXCJkb3duXCIpO1xuXG4gICAgdGhpcy51cGRhdGVHZXN0dXJlT25Qb2ludGVyRG93bihldmVudCk7XG5cbiAgICBpZiAodGhpcy5oYW5kbGVDYW52YXNQYW5Vc2luZ1doZWVsT3JTcGFjZURyYWcoZXZlbnQpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gb25seSBoYW5kbGUgbGVmdCBtb3VzZSBidXR0b24gb3IgdG91Y2hcbiAgICBpZiAoXG4gICAgICBldmVudC5idXR0b24gIT09IFBPSU5URVJfQlVUVE9OLk1BSU4gJiZcbiAgICAgIGV2ZW50LmJ1dHRvbiAhPT0gUE9JTlRFUl9CVVRUT04uVE9VQ0hcbiAgICApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBkb24ndCBzZWxlY3Qgd2hpbGUgcGFubmluZ1xuICAgIGlmIChnZXN0dXJlLnBvaW50ZXJzLnNpemUgPiAxKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gU3RhdGUgZm9yIHRoZSBkdXJhdGlvbiBvZiBhIHBvaW50ZXIgaW50ZXJhY3Rpb24sIHdoaWNoIHN0YXJ0cyB3aXRoIGFcbiAgICAvLyBwb2ludGVyRG93biBldmVudCwgZW5kcyB3aXRoIGEgcG9pbnRlclVwIGV2ZW50IChvciBhbm90aGVyIHBvaW50ZXJEb3duKVxuICAgIGNvbnN0IHBvaW50ZXJEb3duU3RhdGUgPSB0aGlzLmluaXRpYWxQb2ludGVyRG93blN0YXRlKGV2ZW50KTtcblxuICAgIGlmICh0aGlzLmhhbmRsZURyYWdnaW5nU2Nyb2xsQmFyKGV2ZW50LCBwb2ludGVyRG93blN0YXRlKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIFNpbmNlIGNvbnRleHQgbWVudSBjbG9zZXMgb24gcG9pbnRlciBkb3duIHNvIHNldHRpbmcgdG8gZmFsc2VcbiAgICB0aGlzLmNvbnRleHRNZW51T3BlbiA9IGZhbHNlO1xuICAgIHRoaXMuY2xlYXJTZWxlY3Rpb25JZk5vdFVzaW5nU2VsZWN0aW9uKCk7XG4gICAgdGhpcy51cGRhdGVCaW5kaW5nRW5hYmxlZE9uUG9pbnRlck1vdmUoZXZlbnQpO1xuXG4gICAgaWYgKHRoaXMuaGFuZGxlU2VsZWN0aW9uT25Qb2ludGVyRG93bihldmVudCwgcG9pbnRlckRvd25TdGF0ZSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBhbGxvd09uUG9pbnRlckRvd24gPVxuICAgICAgIXRoaXMuc3RhdGUucGVuTW9kZSB8fFxuICAgICAgZXZlbnQucG9pbnRlclR5cGUgIT09IFwidG91Y2hcIiB8fFxuICAgICAgdGhpcy5zdGF0ZS5hY3RpdmVUb29sLnR5cGUgPT09IFwic2VsZWN0aW9uXCIgfHxcbiAgICAgIHRoaXMuc3RhdGUuYWN0aXZlVG9vbC50eXBlID09PSBcInRleHRcIiB8fFxuICAgICAgdGhpcy5zdGF0ZS5hY3RpdmVUb29sLnR5cGUgPT09IFwiaW1hZ2VcIjtcblxuICAgIGlmICghYWxsb3dPblBvaW50ZXJEb3duKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuc3RhdGUuYWN0aXZlVG9vbC50eXBlID09PSBcInRleHRcIikge1xuICAgICAgdGhpcy5oYW5kbGVUZXh0T25Qb2ludGVyRG93bihldmVudCwgcG9pbnRlckRvd25TdGF0ZSk7XG4gICAgICByZXR1cm47XG4gICAgfSBlbHNlIGlmIChcbiAgICAgIHRoaXMuc3RhdGUuYWN0aXZlVG9vbC50eXBlID09PSBcImFycm93XCIgfHxcbiAgICAgIHRoaXMuc3RhdGUuYWN0aXZlVG9vbC50eXBlID09PSBcImxpbmVcIlxuICAgICkge1xuICAgICAgdGhpcy5oYW5kbGVMaW5lYXJFbGVtZW50T25Qb2ludGVyRG93bihcbiAgICAgICAgZXZlbnQsXG4gICAgICAgIHRoaXMuc3RhdGUuYWN0aXZlVG9vbC50eXBlLFxuICAgICAgICBwb2ludGVyRG93blN0YXRlLFxuICAgICAgKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuc3RhdGUuYWN0aXZlVG9vbC50eXBlID09PSBcImltYWdlXCIpIHtcbiAgICAgIC8vIHJlc2V0IGltYWdlIHByZXZpZXcgb24gcG9pbnRlcmRvd25cbiAgICAgIHNldEN1cnNvcih0aGlzLmNhbnZhcywgQ1VSU09SX1RZUEUuQ1JPU1NIQUlSKTtcblxuICAgICAgLy8gcmV0cmlldmUgdGhlIGxhdGVzdCBlbGVtZW50IGFzIHRoZSBzdGF0ZSBtYXkgYmUgc3RhbGVcbiAgICAgIGNvbnN0IHBlbmRpbmdJbWFnZUVsZW1lbnQgPVxuICAgICAgICB0aGlzLnN0YXRlLnBlbmRpbmdJbWFnZUVsZW1lbnRJZCAmJlxuICAgICAgICB0aGlzLnNjZW5lLmdldEVsZW1lbnQodGhpcy5zdGF0ZS5wZW5kaW5nSW1hZ2VFbGVtZW50SWQpO1xuXG4gICAgICBpZiAoIXBlbmRpbmdJbWFnZUVsZW1lbnQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgZHJhZ2dpbmdFbGVtZW50OiBwZW5kaW5nSW1hZ2VFbGVtZW50LFxuICAgICAgICBlZGl0aW5nRWxlbWVudDogcGVuZGluZ0ltYWdlRWxlbWVudCxcbiAgICAgICAgcGVuZGluZ0ltYWdlRWxlbWVudElkOiBudWxsLFxuICAgICAgICBtdWx0aUVsZW1lbnQ6IG51bGwsXG4gICAgICB9KTtcblxuICAgICAgY29uc3QgeyB4LCB5IH0gPSB2aWV3cG9ydENvb3Jkc1RvU2NlbmVDb29yZHMoZXZlbnQsIHRoaXMuc3RhdGUpO1xuICAgICAgbXV0YXRlRWxlbWVudChwZW5kaW5nSW1hZ2VFbGVtZW50LCB7XG4gICAgICAgIHgsXG4gICAgICAgIHksXG4gICAgICB9KTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuc3RhdGUuYWN0aXZlVG9vbC50eXBlID09PSBcImZyZWVkcmF3XCIpIHtcbiAgICAgIHRoaXMuaGFuZGxlRnJlZURyYXdFbGVtZW50T25Qb2ludGVyRG93bihcbiAgICAgICAgZXZlbnQsXG4gICAgICAgIHRoaXMuc3RhdGUuYWN0aXZlVG9vbC50eXBlLFxuICAgICAgICBwb2ludGVyRG93blN0YXRlLFxuICAgICAgKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuc3RhdGUuYWN0aXZlVG9vbC50eXBlID09PSBcImN1c3RvbVwiKSB7XG4gICAgICBzZXRDdXJzb3IodGhpcy5jYW52YXMsIENVUlNPUl9UWVBFLkFVVE8pO1xuICAgIH0gZWxzZSBpZiAodGhpcy5zdGF0ZS5hY3RpdmVUb29sLnR5cGUgIT09IFwiZXJhc2VyXCIpIHtcbiAgICAgIHRoaXMuY3JlYXRlR2VuZXJpY0VsZW1lbnRPblBvaW50ZXJEb3duKFxuICAgICAgICB0aGlzLnN0YXRlLmFjdGl2ZVRvb2wudHlwZSxcbiAgICAgICAgcG9pbnRlckRvd25TdGF0ZSxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgdGhpcy5wcm9wcz8ub25Qb2ludGVyRG93bj8uKHRoaXMuc3RhdGUuYWN0aXZlVG9vbCwgcG9pbnRlckRvd25TdGF0ZSk7XG5cbiAgICBjb25zdCBvblBvaW50ZXJNb3ZlID1cbiAgICAgIHRoaXMub25Qb2ludGVyTW92ZUZyb21Qb2ludGVyRG93bkhhbmRsZXIocG9pbnRlckRvd25TdGF0ZSk7XG5cbiAgICBjb25zdCBvblBvaW50ZXJVcCA9XG4gICAgICB0aGlzLm9uUG9pbnRlclVwRnJvbVBvaW50ZXJEb3duSGFuZGxlcihwb2ludGVyRG93blN0YXRlKTtcblxuICAgIGNvbnN0IG9uS2V5RG93biA9IHRoaXMub25LZXlEb3duRnJvbVBvaW50ZXJEb3duSGFuZGxlcihwb2ludGVyRG93blN0YXRlKTtcbiAgICBjb25zdCBvbktleVVwID0gdGhpcy5vbktleVVwRnJvbVBvaW50ZXJEb3duSGFuZGxlcihwb2ludGVyRG93blN0YXRlKTtcblxuICAgIGxhc3RQb2ludGVyVXAgPSBvblBvaW50ZXJVcDtcblxuICAgIGlmICghdGhpcy5zdGF0ZS52aWV3TW9kZUVuYWJsZWQpIHtcbiAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKEVWRU5ULlBPSU5URVJfTU9WRSwgb25Qb2ludGVyTW92ZSk7XG4gICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihFVkVOVC5QT0lOVEVSX1VQLCBvblBvaW50ZXJVcCk7XG4gICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihFVkVOVC5LRVlET1dOLCBvbktleURvd24pO1xuICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoRVZFTlQuS0VZVVAsIG9uS2V5VXApO1xuICAgICAgcG9pbnRlckRvd25TdGF0ZS5ldmVudExpc3RlbmVycy5vbk1vdmUgPSBvblBvaW50ZXJNb3ZlO1xuICAgICAgcG9pbnRlckRvd25TdGF0ZS5ldmVudExpc3RlbmVycy5vblVwID0gb25Qb2ludGVyVXA7XG4gICAgICBwb2ludGVyRG93blN0YXRlLmV2ZW50TGlzdGVuZXJzLm9uS2V5VXAgPSBvbktleVVwO1xuICAgICAgcG9pbnRlckRvd25TdGF0ZS5ldmVudExpc3RlbmVycy5vbktleURvd24gPSBvbktleURvd247XG4gICAgfVxuICB9O1xuXG4gIHByaXZhdGUgaGFuZGxlQ2FudmFzUG9pbnRlclVwID0gKFxuICAgIGV2ZW50OiBSZWFjdC5Qb2ludGVyRXZlbnQ8SFRNTENhbnZhc0VsZW1lbnQ+LFxuICApID0+IHtcbiAgICB0aGlzLmxhc3RQb2ludGVyVXAgPSBldmVudDtcbiAgICBpZiAodGhpcy5kZXZpY2UuaXNUb3VjaFNjcmVlbikge1xuICAgICAgY29uc3Qgc2NlbmVQb2ludGVyID0gdmlld3BvcnRDb29yZHNUb1NjZW5lQ29vcmRzKFxuICAgICAgICB7IGNsaWVudFg6IGV2ZW50LmNsaWVudFgsIGNsaWVudFk6IGV2ZW50LmNsaWVudFkgfSxcbiAgICAgICAgdGhpcy5zdGF0ZSxcbiAgICAgICk7XG4gICAgICBjb25zdCBoaXRFbGVtZW50ID0gdGhpcy5nZXRFbGVtZW50QXRQb3NpdGlvbihcbiAgICAgICAgc2NlbmVQb2ludGVyLngsXG4gICAgICAgIHNjZW5lUG9pbnRlci55LFxuICAgICAgKTtcbiAgICAgIHRoaXMuaGl0TGlua0VsZW1lbnQgPSB0aGlzLmdldEVsZW1lbnRMaW5rQXRQb3NpdGlvbihcbiAgICAgICAgc2NlbmVQb2ludGVyLFxuICAgICAgICBoaXRFbGVtZW50LFxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKFxuICAgICAgdGhpcy5oaXRMaW5rRWxlbWVudCAmJlxuICAgICAgIXRoaXMuc3RhdGUuc2VsZWN0ZWRFbGVtZW50SWRzW3RoaXMuaGl0TGlua0VsZW1lbnQuaWRdXG4gICAgKSB7XG4gICAgICB0aGlzLnJlZGlyZWN0VG9MaW5rKGV2ZW50LCB0aGlzLmRldmljZS5pc1RvdWNoU2NyZWVuKTtcbiAgICB9XG5cbiAgICB0aGlzLnJlbW92ZVBvaW50ZXIoZXZlbnQpO1xuICB9O1xuXG4gIHByaXZhdGUgbWF5YmVPcGVuQ29udGV4dE1lbnVBZnRlclBvaW50ZXJEb3duT25Ub3VjaERldmljZXMgPSAoXG4gICAgZXZlbnQ6IFJlYWN0LlBvaW50ZXJFdmVudDxIVE1MQ2FudmFzRWxlbWVudD4sXG4gICk6IHZvaWQgPT4ge1xuICAgIC8vIGRlYWwgd2l0aCBvcGVuaW5nIGNvbnRleHQgbWVudSBvbiB0b3VjaCBkZXZpY2VzXG4gICAgaWYgKGV2ZW50LnBvaW50ZXJUeXBlID09PSBcInRvdWNoXCIpIHtcbiAgICAgIGludmFsaWRhdGVDb250ZXh0TWVudSA9IGZhbHNlO1xuXG4gICAgICBpZiAodG91Y2hUaW1lb3V0KSB7XG4gICAgICAgIC8vIElmIHRoZXJlJ3MgYWxyZWFkeSBhIHRvdWNoVGltZW91dCwgdGhpcyBtZWFucyB0aGF0IHRoZXJlJ3MgYW5vdGhlclxuICAgICAgICAvLyB0b3VjaCBkb3duIGFuZCB3ZSBhcmUgZG9pbmcgYW5vdGhlciB0b3VjaCwgc28gd2Ugc2hvdWxkbid0IG9wZW4gdGhlXG4gICAgICAgIC8vIGNvbnRleHQgbWVudS5cbiAgICAgICAgaW52YWxpZGF0ZUNvbnRleHRNZW51ID0gdHJ1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIG9wZW4gdGhlIGNvbnRleHQgbWVudSB3aXRoIHRoZSBmaXJzdCB0b3VjaCdzIGNsaWVudFggYW5kIGNsaWVudFlcbiAgICAgICAgLy8gaWYgdGhlIHRvdWNoIGlzIG5vdCBtb3ZpbmdcbiAgICAgICAgdG91Y2hUaW1lb3V0ID0gd2luZG93LnNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIHRvdWNoVGltZW91dCA9IDA7XG4gICAgICAgICAgaWYgKCFpbnZhbGlkYXRlQ29udGV4dE1lbnUpIHtcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlQ2FudmFzQ29udGV4dE1lbnUoZXZlbnQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSwgVE9VQ0hfQ1RYX01FTlVfVElNRU9VVCk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIHByaXZhdGUgcmVzZXRDb250ZXh0TWVudVRpbWVyID0gKCkgPT4ge1xuICAgIGNsZWFyVGltZW91dCh0b3VjaFRpbWVvdXQpO1xuICAgIHRvdWNoVGltZW91dCA9IDA7XG4gICAgaW52YWxpZGF0ZUNvbnRleHRNZW51ID0gZmFsc2U7XG4gIH07XG5cbiAgcHJpdmF0ZSBtYXliZUNsZWFudXBBZnRlck1pc3NpbmdQb2ludGVyVXAoXG4gICAgZXZlbnQ6IFJlYWN0LlBvaW50ZXJFdmVudDxIVE1MQ2FudmFzRWxlbWVudD4sXG4gICk6IHZvaWQge1xuICAgIGlmIChsYXN0UG9pbnRlclVwICE9PSBudWxsKSB7XG4gICAgICAvLyBVbmZvcnR1bmF0ZWx5LCBzb21ldGltZXMgd2UgZG9uJ3QgZ2V0IGEgcG9pbnRlcnVwIGFmdGVyIGEgcG9pbnRlcmRvd24sXG4gICAgICAvLyB0aGlzIGNhbiBoYXBwZW4gd2hlbiBhIGNvbnRleHR1YWwgbWVudSBvciBhbGVydCBpcyB0cmlnZ2VyZWQuIEluIG9yZGVyIHRvIGF2b2lkXG4gICAgICAvLyBiZWluZyBpbiBhIHdlaXJkIHN0YXRlLCB3ZSBjbGVhbiB1cCBvbiB0aGUgbmV4dCBwb2ludGVyZG93blxuICAgICAgbGFzdFBvaW50ZXJVcChldmVudCk7XG4gICAgfVxuICB9XG5cbiAgLy8gUmV0dXJucyB3aGV0aGVyIHRoZSBldmVudCBpcyBhIHBhbm5pbmdcbiAgcHJpdmF0ZSBoYW5kbGVDYW52YXNQYW5Vc2luZ1doZWVsT3JTcGFjZURyYWcgPSAoXG4gICAgZXZlbnQ6IFJlYWN0LlBvaW50ZXJFdmVudDxIVE1MQ2FudmFzRWxlbWVudD4sXG4gICk6IGJvb2xlYW4gPT4ge1xuICAgIGlmIChcbiAgICAgICEoXG4gICAgICAgIGdlc3R1cmUucG9pbnRlcnMuc2l6ZSA8PSAxICYmXG4gICAgICAgIChldmVudC5idXR0b24gPT09IFBPSU5URVJfQlVUVE9OLldIRUVMIHx8XG4gICAgICAgICAgKGV2ZW50LmJ1dHRvbiA9PT0gUE9JTlRFUl9CVVRUT04uTUFJTiAmJiBpc0hvbGRpbmdTcGFjZSkgfHxcbiAgICAgICAgICB0aGlzLnN0YXRlLnZpZXdNb2RlRW5hYmxlZClcbiAgICAgICkgfHxcbiAgICAgIGlzVGV4dEVsZW1lbnQodGhpcy5zdGF0ZS5lZGl0aW5nRWxlbWVudClcbiAgICApIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaXNQYW5uaW5nID0gdHJ1ZTtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgbGV0IG5leHRQYXN0ZVByZXZlbnRlZCA9IGZhbHNlO1xuICAgIGNvbnN0IGlzTGludXggPSAvTGludXgvLnRlc3Qod2luZG93Lm5hdmlnYXRvci5wbGF0Zm9ybSk7XG5cbiAgICBzZXRDdXJzb3IodGhpcy5jYW52YXMsIENVUlNPUl9UWVBFLkdSQUJCSU5HKTtcbiAgICBsZXQgeyBjbGllbnRYOiBsYXN0WCwgY2xpZW50WTogbGFzdFkgfSA9IGV2ZW50O1xuICAgIGNvbnN0IG9uUG9pbnRlck1vdmUgPSB3aXRoQmF0Y2hlZFVwZGF0ZXNUaHJvdHRsZWQoKGV2ZW50OiBQb2ludGVyRXZlbnQpID0+IHtcbiAgICAgIGNvbnN0IGRlbHRhWCA9IGxhc3RYIC0gZXZlbnQuY2xpZW50WDtcbiAgICAgIGNvbnN0IGRlbHRhWSA9IGxhc3RZIC0gZXZlbnQuY2xpZW50WTtcbiAgICAgIGxhc3RYID0gZXZlbnQuY2xpZW50WDtcbiAgICAgIGxhc3RZID0gZXZlbnQuY2xpZW50WTtcblxuICAgICAgLypcbiAgICAgICAqIFByZXZlbnQgcGFzdGUgZXZlbnQgaWYgd2UgbW92ZSB3aGlsZSBtaWRkbGUgY2xpY2tpbmcgb24gTGludXguXG4gICAgICAgKiBTZWUgaXNzdWUgIzEzODMuXG4gICAgICAgKi9cbiAgICAgIGlmIChcbiAgICAgICAgaXNMaW51eCAmJlxuICAgICAgICAhbmV4dFBhc3RlUHJldmVudGVkICYmXG4gICAgICAgIChNYXRoLmFicyhkZWx0YVgpID4gMSB8fCBNYXRoLmFicyhkZWx0YVkpID4gMSlcbiAgICAgICkge1xuICAgICAgICBuZXh0UGFzdGVQcmV2ZW50ZWQgPSB0cnVlO1xuXG4gICAgICAgIC8qIFByZXZlbnQgdGhlIG5leHQgcGFzdGUgZXZlbnQgKi9cbiAgICAgICAgY29uc3QgcHJldmVudE5leHRQYXN0ZSA9IChldmVudDogQ2xpcGJvYXJkRXZlbnQpID0+IHtcbiAgICAgICAgICBkb2N1bWVudC5ib2R5LnJlbW92ZUV2ZW50TGlzdGVuZXIoRVZFTlQuUEFTVEUsIHByZXZlbnROZXh0UGFzdGUpO1xuICAgICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICB9O1xuXG4gICAgICAgIC8qXG4gICAgICAgICAqIFJlZW5hYmxlIG5leHQgcGFzdGUgaW4gY2FzZSBvZiBkaXNhYmxlZCBtaWRkbGUgY2xpY2sgcGFzdGUgZm9yXG4gICAgICAgICAqIGFueSByZWFzb246XG4gICAgICAgICAqIC0gcmlnaHQgY2xpY2sgcGFzdGVcbiAgICAgICAgICogLSBlbXB0eSBjbGlwYm9hcmRcbiAgICAgICAgICovXG4gICAgICAgIGNvbnN0IGVuYWJsZU5leHRQYXN0ZSA9ICgpID0+IHtcbiAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlRXZlbnRMaXN0ZW5lcihFVkVOVC5QQVNURSwgcHJldmVudE5leHRQYXN0ZSk7XG4gICAgICAgICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihFVkVOVC5QT0lOVEVSX1VQLCBlbmFibGVOZXh0UGFzdGUpO1xuICAgICAgICAgIH0sIDEwMCk7XG4gICAgICAgIH07XG5cbiAgICAgICAgZG9jdW1lbnQuYm9keS5hZGRFdmVudExpc3RlbmVyKEVWRU5ULlBBU1RFLCBwcmV2ZW50TmV4dFBhc3RlKTtcbiAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoRVZFTlQuUE9JTlRFUl9VUCwgZW5hYmxlTmV4dFBhc3RlKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgIHNjcm9sbFg6IHRoaXMuc3RhdGUuc2Nyb2xsWCAtIGRlbHRhWCAvIHRoaXMuc3RhdGUuem9vbS52YWx1ZSxcbiAgICAgICAgc2Nyb2xsWTogdGhpcy5zdGF0ZS5zY3JvbGxZIC0gZGVsdGFZIC8gdGhpcy5zdGF0ZS56b29tLnZhbHVlLFxuICAgICAgfSk7XG4gICAgfSk7XG4gICAgY29uc3QgdGVhcmRvd24gPSB3aXRoQmF0Y2hlZFVwZGF0ZXMoXG4gICAgICAobGFzdFBvaW50ZXJVcCA9ICgpID0+IHtcbiAgICAgICAgbGFzdFBvaW50ZXJVcCA9IG51bGw7XG4gICAgICAgIGlzUGFubmluZyA9IGZhbHNlO1xuICAgICAgICBpZiAoIWlzSG9sZGluZ1NwYWNlKSB7XG4gICAgICAgICAgaWYgKHRoaXMuc3RhdGUudmlld01vZGVFbmFibGVkKSB7XG4gICAgICAgICAgICBzZXRDdXJzb3IodGhpcy5jYW52YXMsIENVUlNPUl9UWVBFLkdSQUIpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzZXRDdXJzb3JGb3JTaGFwZSh0aGlzLmNhbnZhcywgdGhpcy5zdGF0ZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICAgIGN1cnNvckJ1dHRvbjogXCJ1cFwiLFxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5zYXZlUG9pbnRlcihldmVudC5jbGllbnRYLCBldmVudC5jbGllbnRZLCBcInVwXCIpO1xuICAgICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihFVkVOVC5QT0lOVEVSX01PVkUsIG9uUG9pbnRlck1vdmUpO1xuICAgICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihFVkVOVC5QT0lOVEVSX1VQLCB0ZWFyZG93bik7XG4gICAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKEVWRU5ULkJMVVIsIHRlYXJkb3duKTtcbiAgICAgICAgb25Qb2ludGVyTW92ZS5mbHVzaCgpO1xuICAgICAgfSksXG4gICAgKTtcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihFVkVOVC5CTFVSLCB0ZWFyZG93bik7XG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoRVZFTlQuUE9JTlRFUl9NT1ZFLCBvblBvaW50ZXJNb3ZlLCB7XG4gICAgICBwYXNzaXZlOiB0cnVlLFxuICAgIH0pO1xuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKEVWRU5ULlBPSU5URVJfVVAsIHRlYXJkb3duKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfTtcblxuICBwcml2YXRlIHVwZGF0ZUdlc3R1cmVPblBvaW50ZXJEb3duKFxuICAgIGV2ZW50OiBSZWFjdC5Qb2ludGVyRXZlbnQ8SFRNTENhbnZhc0VsZW1lbnQ+LFxuICApOiB2b2lkIHtcbiAgICBnZXN0dXJlLnBvaW50ZXJzLnNldChldmVudC5wb2ludGVySWQsIHtcbiAgICAgIHg6IGV2ZW50LmNsaWVudFgsXG4gICAgICB5OiBldmVudC5jbGllbnRZLFxuICAgIH0pO1xuXG4gICAgaWYgKGdlc3R1cmUucG9pbnRlcnMuc2l6ZSA9PT0gMikge1xuICAgICAgZ2VzdHVyZS5sYXN0Q2VudGVyID0gZ2V0Q2VudGVyKGdlc3R1cmUucG9pbnRlcnMpO1xuICAgICAgZ2VzdHVyZS5pbml0aWFsU2NhbGUgPSB0aGlzLnN0YXRlLnpvb20udmFsdWU7XG4gICAgICBnZXN0dXJlLmluaXRpYWxEaXN0YW5jZSA9IGdldERpc3RhbmNlKFxuICAgICAgICBBcnJheS5mcm9tKGdlc3R1cmUucG9pbnRlcnMudmFsdWVzKCkpLFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGluaXRpYWxQb2ludGVyRG93blN0YXRlKFxuICAgIGV2ZW50OiBSZWFjdC5Qb2ludGVyRXZlbnQ8SFRNTENhbnZhc0VsZW1lbnQ+LFxuICApOiBQb2ludGVyRG93blN0YXRlIHtcbiAgICBjb25zdCBvcmlnaW4gPSB2aWV3cG9ydENvb3Jkc1RvU2NlbmVDb29yZHMoZXZlbnQsIHRoaXMuc3RhdGUpO1xuICAgIGNvbnN0IHNlbGVjdGVkRWxlbWVudHMgPSBnZXRTZWxlY3RlZEVsZW1lbnRzKFxuICAgICAgdGhpcy5zY2VuZS5nZXROb25EZWxldGVkRWxlbWVudHMoKSxcbiAgICAgIHRoaXMuc3RhdGUsXG4gICAgKTtcbiAgICBjb25zdCBbbWluWCwgbWluWSwgbWF4WCwgbWF4WV0gPSBnZXRDb21tb25Cb3VuZHMoc2VsZWN0ZWRFbGVtZW50cyk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgb3JpZ2luLFxuICAgICAgd2l0aENtZE9yQ3RybDogZXZlbnRbS0VZUy5DVFJMX09SX0NNRF0sXG4gICAgICBvcmlnaW5JbkdyaWQ6IHR1cGxlVG9Db29ycyhcbiAgICAgICAgZ2V0R3JpZFBvaW50KG9yaWdpbi54LCBvcmlnaW4ueSwgdGhpcy5zdGF0ZS5ncmlkU2l6ZSksXG4gICAgICApLFxuICAgICAgc2Nyb2xsYmFyczogaXNPdmVyU2Nyb2xsQmFycyhcbiAgICAgICAgY3VycmVudFNjcm9sbEJhcnMsXG4gICAgICAgIGV2ZW50LmNsaWVudFggLSB0aGlzLnN0YXRlLm9mZnNldExlZnQsXG4gICAgICAgIGV2ZW50LmNsaWVudFkgLSB0aGlzLnN0YXRlLm9mZnNldFRvcCxcbiAgICAgICksXG4gICAgICAvLyB3ZSBuZWVkIHRvIGR1cGxpY2F0ZSBiZWNhdXNlIHdlJ2xsIGJlIHVwZGF0aW5nIHRoaXMgc3RhdGVcbiAgICAgIGxhc3RDb29yZHM6IHsgLi4ub3JpZ2luIH0sXG4gICAgICBvcmlnaW5hbEVsZW1lbnRzOiB0aGlzLnNjZW5lXG4gICAgICAgIC5nZXROb25EZWxldGVkRWxlbWVudHMoKVxuICAgICAgICAucmVkdWNlKChhY2MsIGVsZW1lbnQpID0+IHtcbiAgICAgICAgICBhY2Muc2V0KGVsZW1lbnQuaWQsIGRlZXBDb3B5RWxlbWVudChlbGVtZW50KSk7XG4gICAgICAgICAgcmV0dXJuIGFjYztcbiAgICAgICAgfSwgbmV3IE1hcCgpIGFzIFBvaW50ZXJEb3duU3RhdGVbXCJvcmlnaW5hbEVsZW1lbnRzXCJdKSxcbiAgICAgIHJlc2l6ZToge1xuICAgICAgICBoYW5kbGVUeXBlOiBmYWxzZSxcbiAgICAgICAgaXNSZXNpemluZzogZmFsc2UsXG4gICAgICAgIG9mZnNldDogeyB4OiAwLCB5OiAwIH0sXG4gICAgICAgIGFycm93RGlyZWN0aW9uOiBcIm9yaWdpblwiLFxuICAgICAgICBjZW50ZXI6IHsgeDogKG1heFggKyBtaW5YKSAvIDIsIHk6IChtYXhZICsgbWluWSkgLyAyIH0sXG4gICAgICB9LFxuICAgICAgaGl0OiB7XG4gICAgICAgIGVsZW1lbnQ6IG51bGwsXG4gICAgICAgIGFsbEhpdEVsZW1lbnRzOiBbXSxcbiAgICAgICAgd2FzQWRkZWRUb1NlbGVjdGlvbjogZmFsc2UsXG4gICAgICAgIGhhc0JlZW5EdXBsaWNhdGVkOiBmYWxzZSxcbiAgICAgICAgaGFzSGl0Q29tbW9uQm91bmRpbmdCb3hPZlNlbGVjdGVkRWxlbWVudHM6XG4gICAgICAgICAgdGhpcy5pc0hpdHRpbmdDb21tb25Cb3VuZGluZ0JveE9mU2VsZWN0ZWRFbGVtZW50cyhcbiAgICAgICAgICAgIG9yaWdpbixcbiAgICAgICAgICAgIHNlbGVjdGVkRWxlbWVudHMsXG4gICAgICAgICAgKSxcbiAgICAgICAgaGFzSGl0RWxlbWVudEluc2lkZTogZmFsc2UsXG4gICAgICB9LFxuICAgICAgZHJhZzoge1xuICAgICAgICBoYXNPY2N1cnJlZDogZmFsc2UsXG4gICAgICAgIG9mZnNldDogbnVsbCxcbiAgICAgIH0sXG4gICAgICBldmVudExpc3RlbmVyczoge1xuICAgICAgICBvbk1vdmU6IG51bGwsXG4gICAgICAgIG9uVXA6IG51bGwsXG4gICAgICAgIG9uS2V5VXA6IG51bGwsXG4gICAgICAgIG9uS2V5RG93bjogbnVsbCxcbiAgICAgIH0sXG4gICAgICBib3hTZWxlY3Rpb246IHtcbiAgICAgICAgaGFzT2NjdXJyZWQ6IGZhbHNlLFxuICAgICAgfSxcbiAgICAgIGVsZW1lbnRJZHNUb0VyYXNlOiB7fSxcbiAgICB9O1xuICB9XG5cbiAgLy8gUmV0dXJucyB3aGV0aGVyIHRoZSBldmVudCBpcyBhIGRyYWdnaW5nIGEgc2Nyb2xsYmFyXG4gIHByaXZhdGUgaGFuZGxlRHJhZ2dpbmdTY3JvbGxCYXIoXG4gICAgZXZlbnQ6IFJlYWN0LlBvaW50ZXJFdmVudDxIVE1MQ2FudmFzRWxlbWVudD4sXG4gICAgcG9pbnRlckRvd25TdGF0ZTogUG9pbnRlckRvd25TdGF0ZSxcbiAgKTogYm9vbGVhbiB7XG4gICAgaWYgKFxuICAgICAgIShwb2ludGVyRG93blN0YXRlLnNjcm9sbGJhcnMuaXNPdmVyRWl0aGVyICYmICF0aGlzLnN0YXRlLm11bHRpRWxlbWVudClcbiAgICApIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaXNEcmFnZ2luZ1Njcm9sbEJhciA9IHRydWU7XG4gICAgcG9pbnRlckRvd25TdGF0ZS5sYXN0Q29vcmRzLnggPSBldmVudC5jbGllbnRYO1xuICAgIHBvaW50ZXJEb3duU3RhdGUubGFzdENvb3Jkcy55ID0gZXZlbnQuY2xpZW50WTtcbiAgICBjb25zdCBvblBvaW50ZXJNb3ZlID0gd2l0aEJhdGNoZWRVcGRhdGVzVGhyb3R0bGVkKChldmVudDogUG9pbnRlckV2ZW50KSA9PiB7XG4gICAgICBjb25zdCB0YXJnZXQgPSBldmVudC50YXJnZXQ7XG4gICAgICBpZiAoISh0YXJnZXQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmhhbmRsZVBvaW50ZXJNb3ZlT3ZlclNjcm9sbGJhcnMoZXZlbnQsIHBvaW50ZXJEb3duU3RhdGUpO1xuICAgIH0pO1xuXG4gICAgY29uc3Qgb25Qb2ludGVyVXAgPSB3aXRoQmF0Y2hlZFVwZGF0ZXMoKCkgPT4ge1xuICAgICAgaXNEcmFnZ2luZ1Njcm9sbEJhciA9IGZhbHNlO1xuICAgICAgc2V0Q3Vyc29yRm9yU2hhcGUodGhpcy5jYW52YXMsIHRoaXMuc3RhdGUpO1xuICAgICAgbGFzdFBvaW50ZXJVcCA9IG51bGw7XG4gICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgY3Vyc29yQnV0dG9uOiBcInVwXCIsXG4gICAgICB9KTtcbiAgICAgIHRoaXMuc2F2ZVBvaW50ZXIoZXZlbnQuY2xpZW50WCwgZXZlbnQuY2xpZW50WSwgXCJ1cFwiKTtcbiAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKEVWRU5ULlBPSU5URVJfTU9WRSwgb25Qb2ludGVyTW92ZSk7XG4gICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihFVkVOVC5QT0lOVEVSX1VQLCBvblBvaW50ZXJVcCk7XG4gICAgICBvblBvaW50ZXJNb3ZlLmZsdXNoKCk7XG4gICAgfSk7XG5cbiAgICBsYXN0UG9pbnRlclVwID0gb25Qb2ludGVyVXA7XG5cbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihFVkVOVC5QT0lOVEVSX01PVkUsIG9uUG9pbnRlck1vdmUpO1xuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKEVWRU5ULlBPSU5URVJfVVAsIG9uUG9pbnRlclVwKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHByaXZhdGUgY2xlYXJTZWxlY3Rpb25JZk5vdFVzaW5nU2VsZWN0aW9uID0gKCk6IHZvaWQgPT4ge1xuICAgIGlmICh0aGlzLnN0YXRlLmFjdGl2ZVRvb2wudHlwZSAhPT0gXCJzZWxlY3Rpb25cIikge1xuICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgIHNlbGVjdGVkRWxlbWVudElkczoge30sXG4gICAgICAgIHNlbGVjdGVkR3JvdXBJZHM6IHt9LFxuICAgICAgICBlZGl0aW5nR3JvdXBJZDogbnVsbCxcbiAgICAgIH0pO1xuICAgIH1cbiAgfTtcblxuICAvKipcbiAgICogQHJldHVybnMgd2hldGhlciB0aGUgcG9pbnRlciBldmVudCBoYXMgYmVlbiBjb21wbGV0ZWx5IGhhbmRsZWRcbiAgICovXG4gIHByaXZhdGUgaGFuZGxlU2VsZWN0aW9uT25Qb2ludGVyRG93biA9IChcbiAgICBldmVudDogUmVhY3QuUG9pbnRlckV2ZW50PEhUTUxDYW52YXNFbGVtZW50PixcbiAgICBwb2ludGVyRG93blN0YXRlOiBQb2ludGVyRG93blN0YXRlLFxuICApOiBib29sZWFuID0+IHtcbiAgICBpZiAodGhpcy5zdGF0ZS5hY3RpdmVUb29sLnR5cGUgPT09IFwic2VsZWN0aW9uXCIpIHtcbiAgICAgIGNvbnN0IGVsZW1lbnRzID0gdGhpcy5zY2VuZS5nZXROb25EZWxldGVkRWxlbWVudHMoKTtcbiAgICAgIGNvbnN0IHNlbGVjdGVkRWxlbWVudHMgPSBnZXRTZWxlY3RlZEVsZW1lbnRzKGVsZW1lbnRzLCB0aGlzLnN0YXRlKTtcbiAgICAgIGlmIChzZWxlY3RlZEVsZW1lbnRzLmxlbmd0aCA9PT0gMSAmJiAhdGhpcy5zdGF0ZS5lZGl0aW5nTGluZWFyRWxlbWVudCkge1xuICAgICAgICBjb25zdCBlbGVtZW50V2l0aFRyYW5zZm9ybUhhbmRsZVR5cGUgPVxuICAgICAgICAgIGdldEVsZW1lbnRXaXRoVHJhbnNmb3JtSGFuZGxlVHlwZShcbiAgICAgICAgICAgIGVsZW1lbnRzLFxuICAgICAgICAgICAgdGhpcy5zdGF0ZSxcbiAgICAgICAgICAgIHBvaW50ZXJEb3duU3RhdGUub3JpZ2luLngsXG4gICAgICAgICAgICBwb2ludGVyRG93blN0YXRlLm9yaWdpbi55LFxuICAgICAgICAgICAgdGhpcy5zdGF0ZS56b29tLFxuICAgICAgICAgICAgZXZlbnQucG9pbnRlclR5cGUsXG4gICAgICAgICAgKTtcbiAgICAgICAgaWYgKGVsZW1lbnRXaXRoVHJhbnNmb3JtSGFuZGxlVHlwZSAhPSBudWxsKSB7XG4gICAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgICByZXNpemluZ0VsZW1lbnQ6IGVsZW1lbnRXaXRoVHJhbnNmb3JtSGFuZGxlVHlwZS5lbGVtZW50LFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHBvaW50ZXJEb3duU3RhdGUucmVzaXplLmhhbmRsZVR5cGUgPVxuICAgICAgICAgICAgZWxlbWVudFdpdGhUcmFuc2Zvcm1IYW5kbGVUeXBlLnRyYW5zZm9ybUhhbmRsZVR5cGU7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoc2VsZWN0ZWRFbGVtZW50cy5sZW5ndGggPiAxKSB7XG4gICAgICAgIHBvaW50ZXJEb3duU3RhdGUucmVzaXplLmhhbmRsZVR5cGUgPSBnZXRUcmFuc2Zvcm1IYW5kbGVUeXBlRnJvbUNvb3JkcyhcbiAgICAgICAgICBnZXRDb21tb25Cb3VuZHMoc2VsZWN0ZWRFbGVtZW50cyksXG4gICAgICAgICAgcG9pbnRlckRvd25TdGF0ZS5vcmlnaW4ueCxcbiAgICAgICAgICBwb2ludGVyRG93blN0YXRlLm9yaWdpbi55LFxuICAgICAgICAgIHRoaXMuc3RhdGUuem9vbSxcbiAgICAgICAgICBldmVudC5wb2ludGVyVHlwZSxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGlmIChwb2ludGVyRG93blN0YXRlLnJlc2l6ZS5oYW5kbGVUeXBlKSB7XG4gICAgICAgIHNldEN1cnNvcihcbiAgICAgICAgICB0aGlzLmNhbnZhcyxcbiAgICAgICAgICBnZXRDdXJzb3JGb3JSZXNpemluZ0VsZW1lbnQoe1xuICAgICAgICAgICAgdHJhbnNmb3JtSGFuZGxlVHlwZTogcG9pbnRlckRvd25TdGF0ZS5yZXNpemUuaGFuZGxlVHlwZSxcbiAgICAgICAgICB9KSxcbiAgICAgICAgKTtcbiAgICAgICAgcG9pbnRlckRvd25TdGF0ZS5yZXNpemUuaXNSZXNpemluZyA9IHRydWU7XG4gICAgICAgIHBvaW50ZXJEb3duU3RhdGUucmVzaXplLm9mZnNldCA9IHR1cGxlVG9Db29ycyhcbiAgICAgICAgICBnZXRSZXNpemVPZmZzZXRYWShcbiAgICAgICAgICAgIHBvaW50ZXJEb3duU3RhdGUucmVzaXplLmhhbmRsZVR5cGUsXG4gICAgICAgICAgICBzZWxlY3RlZEVsZW1lbnRzLFxuICAgICAgICAgICAgcG9pbnRlckRvd25TdGF0ZS5vcmlnaW4ueCxcbiAgICAgICAgICAgIHBvaW50ZXJEb3duU3RhdGUub3JpZ2luLnksXG4gICAgICAgICAgKSxcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIHNlbGVjdGVkRWxlbWVudHMubGVuZ3RoID09PSAxICYmXG4gICAgICAgICAgaXNMaW5lYXJFbGVtZW50KHNlbGVjdGVkRWxlbWVudHNbMF0pICYmXG4gICAgICAgICAgc2VsZWN0ZWRFbGVtZW50c1swXS5wb2ludHMubGVuZ3RoID09PSAyXG4gICAgICAgICkge1xuICAgICAgICAgIHBvaW50ZXJEb3duU3RhdGUucmVzaXplLmFycm93RGlyZWN0aW9uID0gZ2V0UmVzaXplQXJyb3dEaXJlY3Rpb24oXG4gICAgICAgICAgICBwb2ludGVyRG93blN0YXRlLnJlc2l6ZS5oYW5kbGVUeXBlLFxuICAgICAgICAgICAgc2VsZWN0ZWRFbGVtZW50c1swXSxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAodGhpcy5zdGF0ZS5lZGl0aW5nTGluZWFyRWxlbWVudCkge1xuICAgICAgICAgIGNvbnN0IHJldCA9IExpbmVhckVsZW1lbnRFZGl0b3IuaGFuZGxlUG9pbnRlckRvd24oXG4gICAgICAgICAgICBldmVudCxcbiAgICAgICAgICAgIHRoaXMuc3RhdGUsXG4gICAgICAgICAgICAoYXBwU3RhdGUpID0+IHRoaXMuc2V0U3RhdGUoYXBwU3RhdGUpLFxuICAgICAgICAgICAgdGhpcy5oaXN0b3J5LFxuICAgICAgICAgICAgcG9pbnRlckRvd25TdGF0ZS5vcmlnaW4sXG4gICAgICAgICAgKTtcbiAgICAgICAgICBpZiAocmV0LmhpdEVsZW1lbnQpIHtcbiAgICAgICAgICAgIHBvaW50ZXJEb3duU3RhdGUuaGl0LmVsZW1lbnQgPSByZXQuaGl0RWxlbWVudDtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHJldC5kaWRBZGRQb2ludCkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIGhpdEVsZW1lbnQgbWF5IGFscmVhZHkgYmUgc2V0IGFib3ZlLCBzbyBjaGVjayBmaXJzdFxuICAgICAgICBwb2ludGVyRG93blN0YXRlLmhpdC5lbGVtZW50ID1cbiAgICAgICAgICBwb2ludGVyRG93blN0YXRlLmhpdC5lbGVtZW50ID8/XG4gICAgICAgICAgdGhpcy5nZXRFbGVtZW50QXRQb3NpdGlvbihcbiAgICAgICAgICAgIHBvaW50ZXJEb3duU3RhdGUub3JpZ2luLngsXG4gICAgICAgICAgICBwb2ludGVyRG93blN0YXRlLm9yaWdpbi55LFxuICAgICAgICAgICk7XG5cbiAgICAgICAgaWYgKHBvaW50ZXJEb3duU3RhdGUuaGl0LmVsZW1lbnQpIHtcbiAgICAgICAgICAvLyBFYXJseSByZXR1cm4gaWYgcG9pbnRlciBpcyBoaXR0aW5nIGxpbmsgaWNvblxuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIGlzUG9pbnRIaXR0aW5nTGlua0ljb24oXG4gICAgICAgICAgICAgIHBvaW50ZXJEb3duU3RhdGUuaGl0LmVsZW1lbnQsXG4gICAgICAgICAgICAgIHRoaXMuc3RhdGUsXG4gICAgICAgICAgICAgIFtwb2ludGVyRG93blN0YXRlLm9yaWdpbi54LCBwb2ludGVyRG93blN0YXRlLm9yaWdpbi55XSxcbiAgICAgICAgICAgICAgdGhpcy5kZXZpY2UuaXNNb2JpbGUsXG4gICAgICAgICAgICApXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgfVxuICAgICAgICAgIHBvaW50ZXJEb3duU3RhdGUuaGl0Lmhhc0hpdEVsZW1lbnRJbnNpZGUgPVxuICAgICAgICAgICAgaXNIaXR0aW5nRWxlbWVudE5vdENvbnNpZGVyaW5nQm91bmRpbmdCb3goXG4gICAgICAgICAgICAgIHBvaW50ZXJEb3duU3RhdGUuaGl0LmVsZW1lbnQsXG4gICAgICAgICAgICAgIHRoaXMuc3RhdGUsXG4gICAgICAgICAgICAgIFtwb2ludGVyRG93blN0YXRlLm9yaWdpbi54LCBwb2ludGVyRG93blN0YXRlLm9yaWdpbi55XSxcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBGb3Igb3ZlcmxhcHBlZCBlbGVtZW50cyBvbmUgcG9zaXRpb24gbWF5IGhpdFxuICAgICAgICAvLyBtdWx0aXBsZSBlbGVtZW50c1xuICAgICAgICBwb2ludGVyRG93blN0YXRlLmhpdC5hbGxIaXRFbGVtZW50cyA9IHRoaXMuZ2V0RWxlbWVudHNBdFBvc2l0aW9uKFxuICAgICAgICAgIHBvaW50ZXJEb3duU3RhdGUub3JpZ2luLngsXG4gICAgICAgICAgcG9pbnRlckRvd25TdGF0ZS5vcmlnaW4ueSxcbiAgICAgICAgKTtcblxuICAgICAgICBjb25zdCBoaXRFbGVtZW50ID0gcG9pbnRlckRvd25TdGF0ZS5oaXQuZWxlbWVudDtcbiAgICAgICAgY29uc3Qgc29tZUhpdEVsZW1lbnRJc1NlbGVjdGVkID1cbiAgICAgICAgICBwb2ludGVyRG93blN0YXRlLmhpdC5hbGxIaXRFbGVtZW50cy5zb21lKChlbGVtZW50KSA9PlxuICAgICAgICAgICAgdGhpcy5pc0FTZWxlY3RlZEVsZW1lbnQoZWxlbWVudCksXG4gICAgICAgICAgKTtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIChoaXRFbGVtZW50ID09PSBudWxsIHx8ICFzb21lSGl0RWxlbWVudElzU2VsZWN0ZWQpICYmXG4gICAgICAgICAgIWV2ZW50LnNoaWZ0S2V5ICYmXG4gICAgICAgICAgIXBvaW50ZXJEb3duU3RhdGUuaGl0Lmhhc0hpdENvbW1vbkJvdW5kaW5nQm94T2ZTZWxlY3RlZEVsZW1lbnRzXG4gICAgICAgICkge1xuICAgICAgICAgIHRoaXMuY2xlYXJTZWxlY3Rpb24oaGl0RWxlbWVudCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5zdGF0ZS5lZGl0aW5nTGluZWFyRWxlbWVudCkge1xuICAgICAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICAgICAgc2VsZWN0ZWRFbGVtZW50SWRzOiB7XG4gICAgICAgICAgICAgIFt0aGlzLnN0YXRlLmVkaXRpbmdMaW5lYXJFbGVtZW50LmVsZW1lbnRJZF06IHRydWUsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIC8vIElmIHdlIGNsaWNrIG9uIHNvbWV0aGluZ1xuICAgICAgICB9IGVsc2UgaWYgKGhpdEVsZW1lbnQgIT0gbnVsbCkge1xuICAgICAgICAgIC8vIG9uIENNRC9DVFJMLCBkcmlsbCBkb3duIHRvIGhpdCBlbGVtZW50IHJlZ2FyZGxlc3Mgb2YgZ3JvdXBzIGV0Yy5cbiAgICAgICAgICBpZiAoZXZlbnRbS0VZUy5DVFJMX09SX0NNRF0pIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5zdGF0ZS5zZWxlY3RlZEVsZW1lbnRJZHNbaGl0RWxlbWVudC5pZF0pIHtcbiAgICAgICAgICAgICAgcG9pbnRlckRvd25TdGF0ZS5oaXQud2FzQWRkZWRUb1NlbGVjdGlvbiA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnNldFN0YXRlKChwcmV2U3RhdGUpID0+ICh7XG4gICAgICAgICAgICAgIC4uLmVkaXRHcm91cEZvclNlbGVjdGVkRWxlbWVudChwcmV2U3RhdGUsIGhpdEVsZW1lbnQpLFxuICAgICAgICAgICAgICBwcmV2aW91c1NlbGVjdGVkRWxlbWVudElkczogdGhpcy5zdGF0ZS5zZWxlY3RlZEVsZW1lbnRJZHMsXG4gICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICAvLyBtYXJrIGFzIG5vdCBjb21wbGV0ZWx5IGhhbmRsZWQgc28gYXMgdG8gYWxsb3cgZHJhZ2dpbmcgZXRjLlxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIGRlc2VsZWN0IGlmIGl0ZW0gaXMgc2VsZWN0ZWRcbiAgICAgICAgICAvLyBpZiBzaGlmdCBpcyBub3QgY2xpY2tlZCwgdGhpcyB3aWxsIGFsd2F5cyByZXR1cm4gdHJ1ZVxuICAgICAgICAgIC8vIG90aGVyd2lzZSwgaXQgd2lsbCB0cmlnZ2VyIHNlbGVjdGlvbiBiYXNlZCBvbiBjdXJyZW50XG4gICAgICAgICAgLy8gc3RhdGUgb2YgdGhlIGJveFxuICAgICAgICAgIGlmICghdGhpcy5zdGF0ZS5zZWxlY3RlZEVsZW1lbnRJZHNbaGl0RWxlbWVudC5pZF0pIHtcbiAgICAgICAgICAgIC8vIGlmIHdlIGFyZSBjdXJyZW50bHkgZWRpdGluZyBhIGdyb3VwLCBleGl0aW5nIGVkaXRpbmcgbW9kZSBhbmQgZGVzZWxlY3QgdGhlIGdyb3VwLlxuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICB0aGlzLnN0YXRlLmVkaXRpbmdHcm91cElkICYmXG4gICAgICAgICAgICAgICFpc0VsZW1lbnRJbkdyb3VwKGhpdEVsZW1lbnQsIHRoaXMuc3RhdGUuZWRpdGluZ0dyb3VwSWQpXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgICAgICAgc2VsZWN0ZWRFbGVtZW50SWRzOiB7fSxcbiAgICAgICAgICAgICAgICBzZWxlY3RlZEdyb3VwSWRzOiB7fSxcbiAgICAgICAgICAgICAgICBlZGl0aW5nR3JvdXBJZDogbnVsbCxcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIEFkZCBoaXQgZWxlbWVudCB0byBzZWxlY3Rpb24uIEF0IHRoaXMgcG9pbnQgaWYgd2UncmUgbm90IGhvbGRpbmdcbiAgICAgICAgICAgIC8vIFNISUZUIHRoZSBwcmV2aW91c2x5IHNlbGVjdGVkIGVsZW1lbnQocykgd2VyZSBkZXNlbGVjdGVkIGFib3ZlXG4gICAgICAgICAgICAvLyAobWFrZSBzdXJlIHlvdSB1c2Ugc2V0U3RhdGUgdXBkYXRlciB0byB1c2UgbGF0ZXN0IHN0YXRlKVxuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAhc29tZUhpdEVsZW1lbnRJc1NlbGVjdGVkICYmXG4gICAgICAgICAgICAgICFwb2ludGVyRG93blN0YXRlLmhpdC5oYXNIaXRDb21tb25Cb3VuZGluZ0JveE9mU2VsZWN0ZWRFbGVtZW50c1xuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgIHRoaXMuc2V0U3RhdGUoKHByZXZTdGF0ZSkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBzZWxlY3RHcm91cHNGb3JTZWxlY3RlZEVsZW1lbnRzKFxuICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAuLi5wcmV2U3RhdGUsXG4gICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkRWxlbWVudElkczoge1xuICAgICAgICAgICAgICAgICAgICAgIC4uLnByZXZTdGF0ZS5zZWxlY3RlZEVsZW1lbnRJZHMsXG4gICAgICAgICAgICAgICAgICAgICAgW2hpdEVsZW1lbnQuaWRdOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICBzaG93SHlwZXJsaW5rUG9wdXA6IGhpdEVsZW1lbnQubGluayA/IFwiaW5mb1wiIDogZmFsc2UsXG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgdGhpcy5zY2VuZS5nZXROb25EZWxldGVkRWxlbWVudHMoKSxcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgcG9pbnRlckRvd25TdGF0ZS5oaXQud2FzQWRkZWRUb1NlbGVjdGlvbiA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgcHJldmlvdXNTZWxlY3RlZEVsZW1lbnRJZHM6IHRoaXMuc3RhdGUuc2VsZWN0ZWRFbGVtZW50SWRzLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9O1xuXG4gIHByaXZhdGUgaXNBU2VsZWN0ZWRFbGVtZW50KGhpdEVsZW1lbnQ6IEV4Y2FsaWRyYXdFbGVtZW50IHwgbnVsbCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBoaXRFbGVtZW50ICE9IG51bGwgJiYgdGhpcy5zdGF0ZS5zZWxlY3RlZEVsZW1lbnRJZHNbaGl0RWxlbWVudC5pZF07XG4gIH1cblxuICBwcml2YXRlIGlzSGl0dGluZ0NvbW1vbkJvdW5kaW5nQm94T2ZTZWxlY3RlZEVsZW1lbnRzKFxuICAgIHBvaW50OiBSZWFkb25seTx7IHg6IG51bWJlcjsgeTogbnVtYmVyIH0+LFxuICAgIHNlbGVjdGVkRWxlbWVudHM6IHJlYWRvbmx5IEV4Y2FsaWRyYXdFbGVtZW50W10sXG4gICk6IGJvb2xlYW4ge1xuICAgIGlmIChzZWxlY3RlZEVsZW1lbnRzLmxlbmd0aCA8IDIpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyBIb3cgbWFueSBwaXhlbHMgb2ZmIHRoZSBzaGFwZSBib3VuZGFyeSB3ZSBzdGlsbCBjb25zaWRlciBhIGhpdFxuICAgIGNvbnN0IHRocmVzaG9sZCA9IDEwIC8gdGhpcy5zdGF0ZS56b29tLnZhbHVlO1xuICAgIGNvbnN0IFt4MSwgeTEsIHgyLCB5Ml0gPSBnZXRDb21tb25Cb3VuZHMoc2VsZWN0ZWRFbGVtZW50cyk7XG4gICAgcmV0dXJuIChcbiAgICAgIHBvaW50LnggPiB4MSAtIHRocmVzaG9sZCAmJlxuICAgICAgcG9pbnQueCA8IHgyICsgdGhyZXNob2xkICYmXG4gICAgICBwb2ludC55ID4geTEgLSB0aHJlc2hvbGQgJiZcbiAgICAgIHBvaW50LnkgPCB5MiArIHRocmVzaG9sZFxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZVRleHRPblBvaW50ZXJEb3duID0gKFxuICAgIGV2ZW50OiBSZWFjdC5Qb2ludGVyRXZlbnQ8SFRNTENhbnZhc0VsZW1lbnQ+LFxuICAgIHBvaW50ZXJEb3duU3RhdGU6IFBvaW50ZXJEb3duU3RhdGUsXG4gICk6IHZvaWQgPT4ge1xuICAgIC8vIGlmIHdlJ3JlIGN1cnJlbnRseSBzdGlsbCBlZGl0aW5nIHRleHQsIGNsaWNraW5nIG91dHNpZGVcbiAgICAvLyBzaG91bGQgb25seSBmaW5hbGl6ZSBpdCwgbm90IGNyZWF0ZSBhbm90aGVyIChpcnJlc3BlY3RpdmVcbiAgICAvLyBvZiBzdGF0ZS5hY3RpdmVUb29sLmxvY2tlZClcbiAgICBpZiAoaXNUZXh0RWxlbWVudCh0aGlzLnN0YXRlLmVkaXRpbmdFbGVtZW50KSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBsZXQgc2NlbmVYID0gcG9pbnRlckRvd25TdGF0ZS5vcmlnaW4ueDtcbiAgICBsZXQgc2NlbmVZID0gcG9pbnRlckRvd25TdGF0ZS5vcmlnaW4ueTtcblxuICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLmdldEVsZW1lbnRBdFBvc2l0aW9uKHNjZW5lWCwgc2NlbmVZLCB7XG4gICAgICBpbmNsdWRlQm91bmRUZXh0RWxlbWVudDogdHJ1ZSxcbiAgICB9KTtcblxuICAgIGNvbnN0IGNhbkJpbmRUZXh0ID0gaGFzQm91bmRUZXh0RWxlbWVudChlbGVtZW50KTtcbiAgICBpZiAoY2FuQmluZFRleHQpIHtcbiAgICAgIHNjZW5lWCA9IGVsZW1lbnQueCArIGVsZW1lbnQud2lkdGggLyAyO1xuICAgICAgc2NlbmVZID0gZWxlbWVudC55ICsgZWxlbWVudC5oZWlnaHQgLyAyO1xuICAgIH1cbiAgICB0aGlzLnN0YXJ0VGV4dEVkaXRpbmcoe1xuICAgICAgc2NlbmVYLFxuICAgICAgc2NlbmVZLFxuICAgICAgc2hvdWxkQmluZDogZmFsc2UsXG4gICAgICBpbnNlcnRBdFBhcmVudENlbnRlcjogIWV2ZW50LmFsdEtleSxcbiAgICB9KTtcblxuICAgIHJlc2V0Q3Vyc29yKHRoaXMuY2FudmFzKTtcbiAgICBpZiAoIXRoaXMuc3RhdGUuYWN0aXZlVG9vbC5sb2NrZWQpIHtcbiAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICBhY3RpdmVUb29sOiB1cGRhdGVBY3RpdmVUb29sKHRoaXMuc3RhdGUsIHsgdHlwZTogXCJzZWxlY3Rpb25cIiB9KSxcbiAgICAgIH0pO1xuICAgIH1cbiAgfTtcblxuICBwcml2YXRlIGhhbmRsZUZyZWVEcmF3RWxlbWVudE9uUG9pbnRlckRvd24gPSAoXG4gICAgZXZlbnQ6IFJlYWN0LlBvaW50ZXJFdmVudDxIVE1MQ2FudmFzRWxlbWVudD4sXG4gICAgZWxlbWVudFR5cGU6IEV4Y2FsaWRyYXdGcmVlRHJhd0VsZW1lbnRbXCJ0eXBlXCJdLFxuICAgIHBvaW50ZXJEb3duU3RhdGU6IFBvaW50ZXJEb3duU3RhdGUsXG4gICkgPT4ge1xuICAgIC8vIEJlZ2luIGEgbWFyayBjYXB0dXJlLiBUaGlzIGRvZXMgbm90IGhhdmUgdG8gdXBkYXRlIHN0YXRlIHlldC5cbiAgICBjb25zdCBbZ3JpZFgsIGdyaWRZXSA9IGdldEdyaWRQb2ludChcbiAgICAgIHBvaW50ZXJEb3duU3RhdGUub3JpZ2luLngsXG4gICAgICBwb2ludGVyRG93blN0YXRlLm9yaWdpbi55LFxuICAgICAgbnVsbCxcbiAgICApO1xuXG4gICAgY29uc3QgZWxlbWVudCA9IG5ld0ZyZWVEcmF3RWxlbWVudCh7XG4gICAgICB0eXBlOiBlbGVtZW50VHlwZSxcbiAgICAgIHg6IGdyaWRYLFxuICAgICAgeTogZ3JpZFksXG4gICAgICBzdHJva2VDb2xvcjogdGhpcy5zdGF0ZS5jdXJyZW50SXRlbVN0cm9rZUNvbG9yLFxuICAgICAgYmFja2dyb3VuZENvbG9yOiB0aGlzLnN0YXRlLmN1cnJlbnRJdGVtQmFja2dyb3VuZENvbG9yLFxuICAgICAgZmlsbFN0eWxlOiB0aGlzLnN0YXRlLmN1cnJlbnRJdGVtRmlsbFN0eWxlLFxuICAgICAgc3Ryb2tlV2lkdGg6IHRoaXMuc3RhdGUuY3VycmVudEl0ZW1TdHJva2VXaWR0aCxcbiAgICAgIHN0cm9rZVN0eWxlOiB0aGlzLnN0YXRlLmN1cnJlbnRJdGVtU3Ryb2tlU3R5bGUsXG4gICAgICByb3VnaG5lc3M6IHRoaXMuc3RhdGUuY3VycmVudEl0ZW1Sb3VnaG5lc3MsXG4gICAgICBvcGFjaXR5OiB0aGlzLnN0YXRlLmN1cnJlbnRJdGVtT3BhY2l0eSxcbiAgICAgIHN0cm9rZVNoYXJwbmVzczogdGhpcy5zdGF0ZS5jdXJyZW50SXRlbUxpbmVhclN0cm9rZVNoYXJwbmVzcyxcbiAgICAgIHNpbXVsYXRlUHJlc3N1cmU6IGV2ZW50LnByZXNzdXJlID09PSAwLjUsXG4gICAgICBsb2NrZWQ6IGZhbHNlLFxuICAgIH0pO1xuXG4gICAgdGhpcy5zZXRTdGF0ZSgocHJldlN0YXRlKSA9PiAoe1xuICAgICAgc2VsZWN0ZWRFbGVtZW50SWRzOiB7XG4gICAgICAgIC4uLnByZXZTdGF0ZS5zZWxlY3RlZEVsZW1lbnRJZHMsXG4gICAgICAgIFtlbGVtZW50LmlkXTogZmFsc2UsXG4gICAgICB9LFxuICAgIH0pKTtcblxuICAgIGNvbnN0IHByZXNzdXJlcyA9IGVsZW1lbnQuc2ltdWxhdGVQcmVzc3VyZVxuICAgICAgPyBlbGVtZW50LnByZXNzdXJlc1xuICAgICAgOiBbLi4uZWxlbWVudC5wcmVzc3VyZXMsIGV2ZW50LnByZXNzdXJlXTtcblxuICAgIG11dGF0ZUVsZW1lbnQoZWxlbWVudCwge1xuICAgICAgcG9pbnRzOiBbWzAsIDBdXSxcbiAgICAgIHByZXNzdXJlcyxcbiAgICB9KTtcblxuICAgIGNvbnN0IGJvdW5kRWxlbWVudCA9IGdldEhvdmVyZWRFbGVtZW50Rm9yQmluZGluZyhcbiAgICAgIHBvaW50ZXJEb3duU3RhdGUub3JpZ2luLFxuICAgICAgdGhpcy5zY2VuZSxcbiAgICApO1xuICAgIHRoaXMuc2NlbmUucmVwbGFjZUFsbEVsZW1lbnRzKFtcbiAgICAgIC4uLnRoaXMuc2NlbmUuZ2V0RWxlbWVudHNJbmNsdWRpbmdEZWxldGVkKCksXG4gICAgICBlbGVtZW50LFxuICAgIF0pO1xuICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgZHJhZ2dpbmdFbGVtZW50OiBlbGVtZW50LFxuICAgICAgZWRpdGluZ0VsZW1lbnQ6IGVsZW1lbnQsXG4gICAgICBzdGFydEJvdW5kRWxlbWVudDogYm91bmRFbGVtZW50LFxuICAgICAgc3VnZ2VzdGVkQmluZGluZ3M6IFtdLFxuICAgIH0pO1xuICB9O1xuXG4gIHByaXZhdGUgY3JlYXRlSW1hZ2VFbGVtZW50ID0gKHtcbiAgICBzY2VuZVgsXG4gICAgc2NlbmVZLFxuICB9OiB7XG4gICAgc2NlbmVYOiBudW1iZXI7XG4gICAgc2NlbmVZOiBudW1iZXI7XG4gIH0pID0+IHtcbiAgICBjb25zdCBbZ3JpZFgsIGdyaWRZXSA9IGdldEdyaWRQb2ludChzY2VuZVgsIHNjZW5lWSwgdGhpcy5zdGF0ZS5ncmlkU2l6ZSk7XG5cbiAgICBjb25zdCBlbGVtZW50ID0gbmV3SW1hZ2VFbGVtZW50KHtcbiAgICAgIHR5cGU6IFwiaW1hZ2VcIixcbiAgICAgIHg6IGdyaWRYLFxuICAgICAgeTogZ3JpZFksXG4gICAgICBzdHJva2VDb2xvcjogdGhpcy5zdGF0ZS5jdXJyZW50SXRlbVN0cm9rZUNvbG9yLFxuICAgICAgYmFja2dyb3VuZENvbG9yOiB0aGlzLnN0YXRlLmN1cnJlbnRJdGVtQmFja2dyb3VuZENvbG9yLFxuICAgICAgZmlsbFN0eWxlOiB0aGlzLnN0YXRlLmN1cnJlbnRJdGVtRmlsbFN0eWxlLFxuICAgICAgc3Ryb2tlV2lkdGg6IHRoaXMuc3RhdGUuY3VycmVudEl0ZW1TdHJva2VXaWR0aCxcbiAgICAgIHN0cm9rZVN0eWxlOiB0aGlzLnN0YXRlLmN1cnJlbnRJdGVtU3Ryb2tlU3R5bGUsXG4gICAgICByb3VnaG5lc3M6IHRoaXMuc3RhdGUuY3VycmVudEl0ZW1Sb3VnaG5lc3MsXG4gICAgICBvcGFjaXR5OiB0aGlzLnN0YXRlLmN1cnJlbnRJdGVtT3BhY2l0eSxcbiAgICAgIHN0cm9rZVNoYXJwbmVzczogdGhpcy5zdGF0ZS5jdXJyZW50SXRlbUxpbmVhclN0cm9rZVNoYXJwbmVzcyxcbiAgICAgIGxvY2tlZDogZmFsc2UsXG4gICAgfSk7XG5cbiAgICByZXR1cm4gZWxlbWVudDtcbiAgfTtcblxuICBwcml2YXRlIGhhbmRsZUxpbmVhckVsZW1lbnRPblBvaW50ZXJEb3duID0gKFxuICAgIGV2ZW50OiBSZWFjdC5Qb2ludGVyRXZlbnQ8SFRNTENhbnZhc0VsZW1lbnQ+LFxuICAgIGVsZW1lbnRUeXBlOiBFeGNhbGlkcmF3TGluZWFyRWxlbWVudFtcInR5cGVcIl0sXG4gICAgcG9pbnRlckRvd25TdGF0ZTogUG9pbnRlckRvd25TdGF0ZSxcbiAgKTogdm9pZCA9PiB7XG4gICAgaWYgKHRoaXMuc3RhdGUubXVsdGlFbGVtZW50KSB7XG4gICAgICBjb25zdCB7IG11bHRpRWxlbWVudCB9ID0gdGhpcy5zdGF0ZTtcblxuICAgICAgLy8gZmluYWxpemUgaWYgY29tcGxldGluZyBhIGxvb3BcbiAgICAgIGlmIChcbiAgICAgICAgbXVsdGlFbGVtZW50LnR5cGUgPT09IFwibGluZVwiICYmXG4gICAgICAgIGlzUGF0aEFMb29wKG11bHRpRWxlbWVudC5wb2ludHMsIHRoaXMuc3RhdGUuem9vbS52YWx1ZSlcbiAgICAgICkge1xuICAgICAgICBtdXRhdGVFbGVtZW50KG11bHRpRWxlbWVudCwge1xuICAgICAgICAgIGxhc3RDb21taXR0ZWRQb2ludDpcbiAgICAgICAgICAgIG11bHRpRWxlbWVudC5wb2ludHNbbXVsdGlFbGVtZW50LnBvaW50cy5sZW5ndGggLSAxXSxcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuYWN0aW9uTWFuYWdlci5leGVjdXRlQWN0aW9uKGFjdGlvbkZpbmFsaXplKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCB7IHg6IHJ4LCB5OiByeSwgbGFzdENvbW1pdHRlZFBvaW50IH0gPSBtdWx0aUVsZW1lbnQ7XG5cbiAgICAgIC8vIGNsaWNraW5nIGluc2lkZSBjb21taXQgem9uZSDihpIgZmluYWxpemUgYXJyb3dcbiAgICAgIGlmIChcbiAgICAgICAgbXVsdGlFbGVtZW50LnBvaW50cy5sZW5ndGggPiAxICYmXG4gICAgICAgIGxhc3RDb21taXR0ZWRQb2ludCAmJlxuICAgICAgICBkaXN0YW5jZTJkKFxuICAgICAgICAgIHBvaW50ZXJEb3duU3RhdGUub3JpZ2luLnggLSByeCxcbiAgICAgICAgICBwb2ludGVyRG93blN0YXRlLm9yaWdpbi55IC0gcnksXG4gICAgICAgICAgbGFzdENvbW1pdHRlZFBvaW50WzBdLFxuICAgICAgICAgIGxhc3RDb21taXR0ZWRQb2ludFsxXSxcbiAgICAgICAgKSA8IExJTkVfQ09ORklSTV9USFJFU0hPTERcbiAgICAgICkge1xuICAgICAgICB0aGlzLmFjdGlvbk1hbmFnZXIuZXhlY3V0ZUFjdGlvbihhY3Rpb25GaW5hbGl6ZSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdGhpcy5zZXRTdGF0ZSgocHJldlN0YXRlKSA9PiAoe1xuICAgICAgICBzZWxlY3RlZEVsZW1lbnRJZHM6IHtcbiAgICAgICAgICAuLi5wcmV2U3RhdGUuc2VsZWN0ZWRFbGVtZW50SWRzLFxuICAgICAgICAgIFttdWx0aUVsZW1lbnQuaWRdOiB0cnVlLFxuICAgICAgICB9LFxuICAgICAgfSkpO1xuICAgICAgLy8gY2xpY2tpbmcgb3V0c2lkZSBjb21taXQgem9uZSDihpIgdXBkYXRlIHJlZmVyZW5jZSBmb3IgbGFzdCBjb21taXR0ZWRcbiAgICAgIC8vIHBvaW50XG4gICAgICBtdXRhdGVFbGVtZW50KG11bHRpRWxlbWVudCwge1xuICAgICAgICBsYXN0Q29tbWl0dGVkUG9pbnQ6IG11bHRpRWxlbWVudC5wb2ludHNbbXVsdGlFbGVtZW50LnBvaW50cy5sZW5ndGggLSAxXSxcbiAgICAgIH0pO1xuICAgICAgc2V0Q3Vyc29yKHRoaXMuY2FudmFzLCBDVVJTT1JfVFlQRS5QT0lOVEVSKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgW2dyaWRYLCBncmlkWV0gPSBnZXRHcmlkUG9pbnQoXG4gICAgICAgIHBvaW50ZXJEb3duU3RhdGUub3JpZ2luLngsXG4gICAgICAgIHBvaW50ZXJEb3duU3RhdGUub3JpZ2luLnksXG4gICAgICAgIHRoaXMuc3RhdGUuZ3JpZFNpemUsXG4gICAgICApO1xuXG4gICAgICAvKiBJZiBhcnJvdyBpcyBwcmUtYXJyb3doZWFkcywgaXQgd2lsbCBoYXZlIHVuZGVmaW5lZCBmb3IgYm90aCBzdGFydCBhbmQgZW5kIGFycm93aGVhZHMuXG4gICAgICBJZiBzbywgd2Ugd2FudCBpdCB0byBiZSBudWxsIGZvciBzdGFydCBhbmQgXCJhcnJvd1wiIGZvciBlbmQuIElmIHRoZSBsaW5lYXIgaXRlbSBpcyBub3RcbiAgICAgIGFuIGFycm93LCB3ZSB3YW50IGl0IHRvIGJlIG51bGwgZm9yIGJvdGguIE90aGVyd2lzZSwgd2Ugd2FudCBpdCB0byB1c2UgdGhlXG4gICAgICB2YWx1ZXMgZnJvbSBhcHBTdGF0ZS4gKi9cblxuICAgICAgY29uc3QgeyBjdXJyZW50SXRlbVN0YXJ0QXJyb3doZWFkLCBjdXJyZW50SXRlbUVuZEFycm93aGVhZCB9ID0gdGhpcy5zdGF0ZTtcbiAgICAgIGNvbnN0IFtzdGFydEFycm93aGVhZCwgZW5kQXJyb3doZWFkXSA9XG4gICAgICAgIGVsZW1lbnRUeXBlID09PSBcImFycm93XCJcbiAgICAgICAgICA/IFtjdXJyZW50SXRlbVN0YXJ0QXJyb3doZWFkLCBjdXJyZW50SXRlbUVuZEFycm93aGVhZF1cbiAgICAgICAgICA6IFtudWxsLCBudWxsXTtcblxuICAgICAgY29uc3QgZWxlbWVudCA9IG5ld0xpbmVhckVsZW1lbnQoe1xuICAgICAgICB0eXBlOiBlbGVtZW50VHlwZSxcbiAgICAgICAgeDogZ3JpZFgsXG4gICAgICAgIHk6IGdyaWRZLFxuICAgICAgICBzdHJva2VDb2xvcjogdGhpcy5zdGF0ZS5jdXJyZW50SXRlbVN0cm9rZUNvbG9yLFxuICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IHRoaXMuc3RhdGUuY3VycmVudEl0ZW1CYWNrZ3JvdW5kQ29sb3IsXG4gICAgICAgIGZpbGxTdHlsZTogdGhpcy5zdGF0ZS5jdXJyZW50SXRlbUZpbGxTdHlsZSxcbiAgICAgICAgc3Ryb2tlV2lkdGg6IHRoaXMuc3RhdGUuY3VycmVudEl0ZW1TdHJva2VXaWR0aCxcbiAgICAgICAgc3Ryb2tlU3R5bGU6IHRoaXMuc3RhdGUuY3VycmVudEl0ZW1TdHJva2VTdHlsZSxcbiAgICAgICAgcm91Z2huZXNzOiB0aGlzLnN0YXRlLmN1cnJlbnRJdGVtUm91Z2huZXNzLFxuICAgICAgICBvcGFjaXR5OiB0aGlzLnN0YXRlLmN1cnJlbnRJdGVtT3BhY2l0eSxcbiAgICAgICAgc3Ryb2tlU2hhcnBuZXNzOiB0aGlzLnN0YXRlLmN1cnJlbnRJdGVtTGluZWFyU3Ryb2tlU2hhcnBuZXNzLFxuICAgICAgICBzdGFydEFycm93aGVhZCxcbiAgICAgICAgZW5kQXJyb3doZWFkLFxuICAgICAgICBsb2NrZWQ6IGZhbHNlLFxuICAgICAgfSk7XG4gICAgICB0aGlzLnNldFN0YXRlKChwcmV2U3RhdGUpID0+ICh7XG4gICAgICAgIHNlbGVjdGVkRWxlbWVudElkczoge1xuICAgICAgICAgIC4uLnByZXZTdGF0ZS5zZWxlY3RlZEVsZW1lbnRJZHMsXG4gICAgICAgICAgW2VsZW1lbnQuaWRdOiBmYWxzZSxcbiAgICAgICAgfSxcbiAgICAgIH0pKTtcbiAgICAgIG11dGF0ZUVsZW1lbnQoZWxlbWVudCwge1xuICAgICAgICBwb2ludHM6IFsuLi5lbGVtZW50LnBvaW50cywgWzAsIDBdXSxcbiAgICAgIH0pO1xuICAgICAgY29uc3QgYm91bmRFbGVtZW50ID0gZ2V0SG92ZXJlZEVsZW1lbnRGb3JCaW5kaW5nKFxuICAgICAgICBwb2ludGVyRG93blN0YXRlLm9yaWdpbixcbiAgICAgICAgdGhpcy5zY2VuZSxcbiAgICAgICk7XG4gICAgICB0aGlzLnNjZW5lLnJlcGxhY2VBbGxFbGVtZW50cyhbXG4gICAgICAgIC4uLnRoaXMuc2NlbmUuZ2V0RWxlbWVudHNJbmNsdWRpbmdEZWxldGVkKCksXG4gICAgICAgIGVsZW1lbnQsXG4gICAgICBdKTtcbiAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICBkcmFnZ2luZ0VsZW1lbnQ6IGVsZW1lbnQsXG4gICAgICAgIGVkaXRpbmdFbGVtZW50OiBlbGVtZW50LFxuICAgICAgICBzdGFydEJvdW5kRWxlbWVudDogYm91bmRFbGVtZW50LFxuICAgICAgICBzdWdnZXN0ZWRCaW5kaW5nczogW10sXG4gICAgICB9KTtcbiAgICB9XG4gIH07XG5cbiAgcHJpdmF0ZSBjcmVhdGVHZW5lcmljRWxlbWVudE9uUG9pbnRlckRvd24gPSAoXG4gICAgZWxlbWVudFR5cGU6IEV4Y2FsaWRyYXdHZW5lcmljRWxlbWVudFtcInR5cGVcIl0sXG4gICAgcG9pbnRlckRvd25TdGF0ZTogUG9pbnRlckRvd25TdGF0ZSxcbiAgKTogdm9pZCA9PiB7XG4gICAgY29uc3QgW2dyaWRYLCBncmlkWV0gPSBnZXRHcmlkUG9pbnQoXG4gICAgICBwb2ludGVyRG93blN0YXRlLm9yaWdpbi54LFxuICAgICAgcG9pbnRlckRvd25TdGF0ZS5vcmlnaW4ueSxcbiAgICAgIHRoaXMuc3RhdGUuZ3JpZFNpemUsXG4gICAgKTtcbiAgICBjb25zdCBlbGVtZW50ID0gbmV3RWxlbWVudCh7XG4gICAgICB0eXBlOiBlbGVtZW50VHlwZSxcbiAgICAgIHg6IGdyaWRYLFxuICAgICAgeTogZ3JpZFksXG4gICAgICBzdHJva2VDb2xvcjogdGhpcy5zdGF0ZS5jdXJyZW50SXRlbVN0cm9rZUNvbG9yLFxuICAgICAgYmFja2dyb3VuZENvbG9yOiB0aGlzLnN0YXRlLmN1cnJlbnRJdGVtQmFja2dyb3VuZENvbG9yLFxuICAgICAgZmlsbFN0eWxlOiB0aGlzLnN0YXRlLmN1cnJlbnRJdGVtRmlsbFN0eWxlLFxuICAgICAgc3Ryb2tlV2lkdGg6IHRoaXMuc3RhdGUuY3VycmVudEl0ZW1TdHJva2VXaWR0aCxcbiAgICAgIHN0cm9rZVN0eWxlOiB0aGlzLnN0YXRlLmN1cnJlbnRJdGVtU3Ryb2tlU3R5bGUsXG4gICAgICByb3VnaG5lc3M6IHRoaXMuc3RhdGUuY3VycmVudEl0ZW1Sb3VnaG5lc3MsXG4gICAgICBvcGFjaXR5OiB0aGlzLnN0YXRlLmN1cnJlbnRJdGVtT3BhY2l0eSxcbiAgICAgIHN0cm9rZVNoYXJwbmVzczogdGhpcy5zdGF0ZS5jdXJyZW50SXRlbVN0cm9rZVNoYXJwbmVzcyxcbiAgICAgIGxvY2tlZDogZmFsc2UsXG4gICAgfSk7XG5cbiAgICBpZiAoZWxlbWVudC50eXBlID09PSBcInNlbGVjdGlvblwiKSB7XG4gICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgc2VsZWN0aW9uRWxlbWVudDogZWxlbWVudCxcbiAgICAgICAgZHJhZ2dpbmdFbGVtZW50OiBlbGVtZW50LFxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc2NlbmUucmVwbGFjZUFsbEVsZW1lbnRzKFtcbiAgICAgICAgLi4udGhpcy5zY2VuZS5nZXRFbGVtZW50c0luY2x1ZGluZ0RlbGV0ZWQoKSxcbiAgICAgICAgZWxlbWVudCxcbiAgICAgIF0pO1xuICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgIG11bHRpRWxlbWVudDogbnVsbCxcbiAgICAgICAgZHJhZ2dpbmdFbGVtZW50OiBlbGVtZW50LFxuICAgICAgICBlZGl0aW5nRWxlbWVudDogZWxlbWVudCxcbiAgICAgIH0pO1xuICAgIH1cbiAgfTtcblxuICBwcml2YXRlIG9uS2V5RG93bkZyb21Qb2ludGVyRG93bkhhbmRsZXIoXG4gICAgcG9pbnRlckRvd25TdGF0ZTogUG9pbnRlckRvd25TdGF0ZSxcbiAgKTogKGV2ZW50OiBLZXlib2FyZEV2ZW50KSA9PiB2b2lkIHtcbiAgICByZXR1cm4gd2l0aEJhdGNoZWRVcGRhdGVzKChldmVudDogS2V5Ym9hcmRFdmVudCkgPT4ge1xuICAgICAgaWYgKHRoaXMubWF5YmVIYW5kbGVSZXNpemUocG9pbnRlckRvd25TdGF0ZSwgZXZlbnQpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRoaXMubWF5YmVEcmFnTmV3R2VuZXJpY0VsZW1lbnQocG9pbnRlckRvd25TdGF0ZSwgZXZlbnQpO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBvbktleVVwRnJvbVBvaW50ZXJEb3duSGFuZGxlcihcbiAgICBwb2ludGVyRG93blN0YXRlOiBQb2ludGVyRG93blN0YXRlLFxuICApOiAoZXZlbnQ6IEtleWJvYXJkRXZlbnQpID0+IHZvaWQge1xuICAgIHJldHVybiB3aXRoQmF0Y2hlZFVwZGF0ZXMoKGV2ZW50OiBLZXlib2FyZEV2ZW50KSA9PiB7XG4gICAgICAvLyBQcmV2ZW50cyBmb2N1cyBmcm9tIGVzY2FwaW5nIGV4Y2FsaWRyYXcgdGFiXG4gICAgICBldmVudC5rZXkgPT09IEtFWVMuQUxUICYmIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBpZiAodGhpcy5tYXliZUhhbmRsZVJlc2l6ZShwb2ludGVyRG93blN0YXRlLCBldmVudCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdGhpcy5tYXliZURyYWdOZXdHZW5lcmljRWxlbWVudChwb2ludGVyRG93blN0YXRlLCBldmVudCk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIG9uUG9pbnRlck1vdmVGcm9tUG9pbnRlckRvd25IYW5kbGVyKFxuICAgIHBvaW50ZXJEb3duU3RhdGU6IFBvaW50ZXJEb3duU3RhdGUsXG4gICkge1xuICAgIHJldHVybiB3aXRoQmF0Y2hlZFVwZGF0ZXNUaHJvdHRsZWQoKGV2ZW50OiBQb2ludGVyRXZlbnQpID0+IHtcbiAgICAgIC8vIFdlIG5lZWQgdG8gaW5pdGlhbGl6ZSBkcmFnT2Zmc2V0WFkgb25seSBhZnRlciB3ZSd2ZSB1cGRhdGVkXG4gICAgICAvLyBgc3RhdGUuc2VsZWN0ZWRFbGVtZW50SWRzYCBvbiBwb2ludGVyRG93bi4gRG9pbmcgaXQgaGVyZSBpbiBwb2ludGVyTW92ZVxuICAgICAgLy8gZXZlbnQgaGFuZGxlciBzaG91bGQgaG9wZWZ1bGx5IGVuc3VyZSB3ZSdyZSBhbHJlYWR5IHdvcmtpbmcgd2l0aFxuICAgICAgLy8gdGhlIHVwZGF0ZWQgc3RhdGUuXG4gICAgICBpZiAocG9pbnRlckRvd25TdGF0ZS5kcmFnLm9mZnNldCA9PT0gbnVsbCkge1xuICAgICAgICBwb2ludGVyRG93blN0YXRlLmRyYWcub2Zmc2V0ID0gdHVwbGVUb0Nvb3JzKFxuICAgICAgICAgIGdldERyYWdPZmZzZXRYWShcbiAgICAgICAgICAgIGdldFNlbGVjdGVkRWxlbWVudHModGhpcy5zY2VuZS5nZXROb25EZWxldGVkRWxlbWVudHMoKSwgdGhpcy5zdGF0ZSksXG4gICAgICAgICAgICBwb2ludGVyRG93blN0YXRlLm9yaWdpbi54LFxuICAgICAgICAgICAgcG9pbnRlckRvd25TdGF0ZS5vcmlnaW4ueSxcbiAgICAgICAgICApLFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgY29uc3QgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0O1xuICAgICAgaWYgKCEodGFyZ2V0IGluc3RhbmNlb2YgSFRNTEVsZW1lbnQpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuaGFuZGxlUG9pbnRlck1vdmVPdmVyU2Nyb2xsYmFycyhldmVudCwgcG9pbnRlckRvd25TdGF0ZSkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBwb2ludGVyQ29vcmRzID0gdmlld3BvcnRDb29yZHNUb1NjZW5lQ29vcmRzKGV2ZW50LCB0aGlzLnN0YXRlKTtcblxuICAgICAgaWYgKGlzRXJhc2VyQWN0aXZlKHRoaXMuc3RhdGUpKSB7XG4gICAgICAgIHRoaXMuaGFuZGxlRXJhc2VyKGV2ZW50LCBwb2ludGVyRG93blN0YXRlLCBwb2ludGVyQ29vcmRzKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBbZ3JpZFgsIGdyaWRZXSA9IGdldEdyaWRQb2ludChcbiAgICAgICAgcG9pbnRlckNvb3Jkcy54LFxuICAgICAgICBwb2ludGVyQ29vcmRzLnksXG4gICAgICAgIHRoaXMuc3RhdGUuZ3JpZFNpemUsXG4gICAgICApO1xuXG4gICAgICAvLyBmb3IgYXJyb3dzL2xpbmVzLCBkb24ndCBzdGFydCBkcmFnZ2luZyB1bnRpbCBhIGdpdmVuIHRocmVzaG9sZFxuICAgICAgLy8gdG8gZW5zdXJlIHdlIGRvbid0IGNyZWF0ZSBhIDItcG9pbnQgYXJyb3cgYnkgbWlzdGFrZSB3aGVuXG4gICAgICAvLyB1c2VyIGNsaWNrcyBtb3VzZSBpbiBhIHdheSB0aGF0IGl0IG1vdmVzIGEgdGlueSBiaXQgKHRodXNcbiAgICAgIC8vIHRyaWdnZXJpbmcgcG9pbnRlcm1vdmUpXG4gICAgICBpZiAoXG4gICAgICAgICFwb2ludGVyRG93blN0YXRlLmRyYWcuaGFzT2NjdXJyZWQgJiZcbiAgICAgICAgKHRoaXMuc3RhdGUuYWN0aXZlVG9vbC50eXBlID09PSBcImFycm93XCIgfHxcbiAgICAgICAgICB0aGlzLnN0YXRlLmFjdGl2ZVRvb2wudHlwZSA9PT0gXCJsaW5lXCIpXG4gICAgICApIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIGRpc3RhbmNlMmQoXG4gICAgICAgICAgICBwb2ludGVyQ29vcmRzLngsXG4gICAgICAgICAgICBwb2ludGVyQ29vcmRzLnksXG4gICAgICAgICAgICBwb2ludGVyRG93blN0YXRlLm9yaWdpbi54LFxuICAgICAgICAgICAgcG9pbnRlckRvd25TdGF0ZS5vcmlnaW4ueSxcbiAgICAgICAgICApIDwgRFJBR0dJTkdfVEhSRVNIT0xEXG4gICAgICAgICkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAocG9pbnRlckRvd25TdGF0ZS5yZXNpemUuaXNSZXNpemluZykge1xuICAgICAgICBwb2ludGVyRG93blN0YXRlLmxhc3RDb29yZHMueCA9IHBvaW50ZXJDb29yZHMueDtcbiAgICAgICAgcG9pbnRlckRvd25TdGF0ZS5sYXN0Q29vcmRzLnkgPSBwb2ludGVyQ29vcmRzLnk7XG4gICAgICAgIGlmICh0aGlzLm1heWJlSGFuZGxlUmVzaXplKHBvaW50ZXJEb3duU3RhdGUsIGV2ZW50KSkge1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLnN0YXRlLmVkaXRpbmdMaW5lYXJFbGVtZW50KSB7XG4gICAgICAgIGNvbnN0IGRpZERyYWcgPSBMaW5lYXJFbGVtZW50RWRpdG9yLmhhbmRsZVBvaW50RHJhZ2dpbmcoXG4gICAgICAgICAgdGhpcy5zdGF0ZSxcbiAgICAgICAgICAoYXBwU3RhdGUpID0+IHRoaXMuc2V0U3RhdGUoYXBwU3RhdGUpLFxuICAgICAgICAgIHBvaW50ZXJDb29yZHMueCxcbiAgICAgICAgICBwb2ludGVyQ29vcmRzLnksXG4gICAgICAgICAgKGVsZW1lbnQsIHBvaW50c1NjZW5lQ29vcmRzKSA9PiB7XG4gICAgICAgICAgICB0aGlzLm1heWJlU3VnZ2VzdEJpbmRpbmdzRm9yTGluZWFyRWxlbWVudEF0Q29vcmRzKFxuICAgICAgICAgICAgICBlbGVtZW50LFxuICAgICAgICAgICAgICBwb2ludHNTY2VuZUNvb3JkcyxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSxcbiAgICAgICAgKTtcblxuICAgICAgICBpZiAoZGlkRHJhZykge1xuICAgICAgICAgIHBvaW50ZXJEb3duU3RhdGUubGFzdENvb3Jkcy54ID0gcG9pbnRlckNvb3Jkcy54O1xuICAgICAgICAgIHBvaW50ZXJEb3duU3RhdGUubGFzdENvb3Jkcy55ID0gcG9pbnRlckNvb3Jkcy55O1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjb25zdCBoYXNIaXRBU2VsZWN0ZWRFbGVtZW50ID0gcG9pbnRlckRvd25TdGF0ZS5oaXQuYWxsSGl0RWxlbWVudHMuc29tZShcbiAgICAgICAgKGVsZW1lbnQpID0+IHRoaXMuaXNBU2VsZWN0ZWRFbGVtZW50KGVsZW1lbnQpLFxuICAgICAgKTtcblxuICAgICAgaWYgKFxuICAgICAgICAoaGFzSGl0QVNlbGVjdGVkRWxlbWVudCB8fFxuICAgICAgICAgIHBvaW50ZXJEb3duU3RhdGUuaGl0Lmhhc0hpdENvbW1vbkJvdW5kaW5nQm94T2ZTZWxlY3RlZEVsZW1lbnRzKSAmJlxuICAgICAgICAvLyB0aGlzIGFsbG93cyBmb3IgYm94LXNlbGVjdGluZyBwb2ludHMgd2hlbiBjbGlja2luZyBpbnNpZGUgdGhlXG4gICAgICAgIC8vIGxpbmUncyBib3VuZGluZyBib3hcbiAgICAgICAgKCF0aGlzLnN0YXRlLmVkaXRpbmdMaW5lYXJFbGVtZW50IHx8ICFldmVudC5zaGlmdEtleSkgJiZcbiAgICAgICAgLy8gYm94LXNlbGVjdGluZyB3aXRob3V0IHNoaWZ0IHdoZW4gZWRpdGluZyBsaW5lLCBub3QgY2xpY2tpbmcgb24gYSBsaW5lXG4gICAgICAgICghdGhpcy5zdGF0ZS5lZGl0aW5nTGluZWFyRWxlbWVudCB8fFxuICAgICAgICAgIHRoaXMuc3RhdGUuZWRpdGluZ0xpbmVhckVsZW1lbnQ/LmVsZW1lbnRJZCAhPT1cbiAgICAgICAgICAgIHBvaW50ZXJEb3duU3RhdGUuaGl0LmVsZW1lbnQ/LmlkIHx8XG4gICAgICAgICAgcG9pbnRlckRvd25TdGF0ZS5oaXQuaGFzSGl0RWxlbWVudEluc2lkZSlcbiAgICAgICkge1xuICAgICAgICBjb25zdCBzZWxlY3RlZEVsZW1lbnRzID0gZ2V0U2VsZWN0ZWRFbGVtZW50cyhcbiAgICAgICAgICB0aGlzLnNjZW5lLmdldE5vbkRlbGV0ZWRFbGVtZW50cygpLFxuICAgICAgICAgIHRoaXMuc3RhdGUsXG4gICAgICAgICk7XG4gICAgICAgIGlmIChzZWxlY3RlZEVsZW1lbnRzLmV2ZXJ5KChlbGVtZW50KSA9PiBlbGVtZW50LmxvY2tlZCkpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy8gTWFya2luZyB0aGF0IGNsaWNrIHdhcyB1c2VkIGZvciBkcmFnZ2luZyB0byBjaGVja1xuICAgICAgICAvLyBpZiBlbGVtZW50cyBzaG91bGQgYmUgZGVzZWxlY3RlZCBvbiBwb2ludGVydXBcbiAgICAgICAgcG9pbnRlckRvd25TdGF0ZS5kcmFnLmhhc09jY3VycmVkID0gdHJ1ZTtcbiAgICAgICAgLy8gcHJldmVudCBkcmFnZ2luZyBldmVuIGlmIHdlJ3JlIG5vIGxvbmdlciBob2xkaW5nIGNtZC9jdHJsIG90aGVyd2lzZVxuICAgICAgICAvLyBpdCB3b3VsZCBoYXZlIHdlaXJkIHJlc3VsdHMgKHN0dWZmIGp1bXBpbmcgYWxsIG92ZXIgdGhlIHNjcmVlbilcbiAgICAgICAgaWYgKHNlbGVjdGVkRWxlbWVudHMubGVuZ3RoID4gMCAmJiAhcG9pbnRlckRvd25TdGF0ZS53aXRoQ21kT3JDdHJsKSB7XG4gICAgICAgICAgY29uc3QgW2RyYWdYLCBkcmFnWV0gPSBnZXRHcmlkUG9pbnQoXG4gICAgICAgICAgICBwb2ludGVyQ29vcmRzLnggLSBwb2ludGVyRG93blN0YXRlLmRyYWcub2Zmc2V0LngsXG4gICAgICAgICAgICBwb2ludGVyQ29vcmRzLnkgLSBwb2ludGVyRG93blN0YXRlLmRyYWcub2Zmc2V0LnksXG4gICAgICAgICAgICB0aGlzLnN0YXRlLmdyaWRTaXplLFxuICAgICAgICAgICk7XG5cbiAgICAgICAgICBjb25zdCBbZHJhZ0Rpc3RhbmNlWCwgZHJhZ0Rpc3RhbmNlWV0gPSBbXG4gICAgICAgICAgICBNYXRoLmFicyhwb2ludGVyQ29vcmRzLnggLSBwb2ludGVyRG93blN0YXRlLm9yaWdpbi54KSxcbiAgICAgICAgICAgIE1hdGguYWJzKHBvaW50ZXJDb29yZHMueSAtIHBvaW50ZXJEb3duU3RhdGUub3JpZ2luLnkpLFxuICAgICAgICAgIF07XG5cbiAgICAgICAgICAvLyBXZSBvbmx5IGRyYWcgaW4gb25lIGRpcmVjdGlvbiBpZiBzaGlmdCBpcyBwcmVzc2VkXG4gICAgICAgICAgY29uc3QgbG9ja0RpcmVjdGlvbiA9IGV2ZW50LnNoaWZ0S2V5O1xuXG4gICAgICAgICAgZHJhZ1NlbGVjdGVkRWxlbWVudHMoXG4gICAgICAgICAgICBwb2ludGVyRG93blN0YXRlLFxuICAgICAgICAgICAgc2VsZWN0ZWRFbGVtZW50cyxcbiAgICAgICAgICAgIGRyYWdYLFxuICAgICAgICAgICAgZHJhZ1ksXG4gICAgICAgICAgICBsb2NrRGlyZWN0aW9uLFxuICAgICAgICAgICAgZHJhZ0Rpc3RhbmNlWCxcbiAgICAgICAgICAgIGRyYWdEaXN0YW5jZVksXG4gICAgICAgICAgICB0aGlzLnN0YXRlLFxuICAgICAgICAgICk7XG4gICAgICAgICAgdGhpcy5tYXliZVN1Z2dlc3RCaW5kaW5nRm9yQWxsKHNlbGVjdGVkRWxlbWVudHMpO1xuXG4gICAgICAgICAgLy8gV2UgZHVwbGljYXRlIHRoZSBzZWxlY3RlZCBlbGVtZW50IGlmIGFsdCBpcyBwcmVzc2VkIG9uIHBvaW50ZXIgbW92ZVxuICAgICAgICAgIGlmIChldmVudC5hbHRLZXkgJiYgIXBvaW50ZXJEb3duU3RhdGUuaGl0Lmhhc0JlZW5EdXBsaWNhdGVkKSB7XG4gICAgICAgICAgICAvLyBNb3ZlIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgZWxlbWVudHMgdG8gdGhlIHRvcCBvZiB0aGUgeiBpbmRleCBzdGFjaywgYW5kXG4gICAgICAgICAgICAvLyBwdXQgdGhlIGR1cGxpY2F0ZXMgd2hlcmUgdGhlIHNlbGVjdGVkIGVsZW1lbnRzIHVzZWQgdG8gYmUuXG4gICAgICAgICAgICAvLyAodGhlIG9yaWdpbiBwb2ludCB3aGVyZSB0aGUgZHJhZ2dpbmcgc3RhcnRlZClcblxuICAgICAgICAgICAgcG9pbnRlckRvd25TdGF0ZS5oaXQuaGFzQmVlbkR1cGxpY2F0ZWQgPSB0cnVlO1xuXG4gICAgICAgICAgICBjb25zdCBuZXh0RWxlbWVudHMgPSBbXTtcbiAgICAgICAgICAgIGNvbnN0IGVsZW1lbnRzVG9BcHBlbmQgPSBbXTtcbiAgICAgICAgICAgIGNvbnN0IGdyb3VwSWRNYXAgPSBuZXcgTWFwKCk7XG4gICAgICAgICAgICBjb25zdCBvbGRJZFRvRHVwbGljYXRlZElkID0gbmV3IE1hcCgpO1xuICAgICAgICAgICAgY29uc3QgaGl0RWxlbWVudCA9IHBvaW50ZXJEb3duU3RhdGUuaGl0LmVsZW1lbnQ7XG4gICAgICAgICAgICBjb25zdCBlbGVtZW50cyA9IHRoaXMuc2NlbmUuZ2V0RWxlbWVudHNJbmNsdWRpbmdEZWxldGVkKCk7XG4gICAgICAgICAgICBjb25zdCBzZWxlY3RlZEVsZW1lbnRJZHM6IEFycmF5PEV4Y2FsaWRyYXdFbGVtZW50W1wiaWRcIl0+ID1cbiAgICAgICAgICAgICAgZ2V0U2VsZWN0ZWRFbGVtZW50cyhlbGVtZW50cywgdGhpcy5zdGF0ZSwgdHJ1ZSkubWFwKFxuICAgICAgICAgICAgICAgIChlbGVtZW50KSA9PiBlbGVtZW50LmlkLFxuICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgZWxlbWVudHMpIHtcbiAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIHNlbGVjdGVkRWxlbWVudElkcy5pbmNsdWRlcyhlbGVtZW50LmlkKSB8fFxuICAgICAgICAgICAgICAgIC8vIGNhc2U6IHRoZSBzdGF0ZS5zZWxlY3RlZEVsZW1lbnRJZHMgbWlnaHQgbm90IGhhdmUgYmVlblxuICAgICAgICAgICAgICAgIC8vIHVwZGF0ZWQgeWV0IGJ5IHRoZSB0aW1lIHRoaXMgbW91c2Vtb3ZlIGV2ZW50IGlzIGZpcmVkXG4gICAgICAgICAgICAgICAgKGVsZW1lbnQuaWQgPT09IGhpdEVsZW1lbnQ/LmlkICYmXG4gICAgICAgICAgICAgICAgICBwb2ludGVyRG93blN0YXRlLmhpdC53YXNBZGRlZFRvU2VsZWN0aW9uKVxuICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICBjb25zdCBkdXBsaWNhdGVkRWxlbWVudCA9IGR1cGxpY2F0ZUVsZW1lbnQoXG4gICAgICAgICAgICAgICAgICB0aGlzLnN0YXRlLmVkaXRpbmdHcm91cElkLFxuICAgICAgICAgICAgICAgICAgZ3JvdXBJZE1hcCxcbiAgICAgICAgICAgICAgICAgIGVsZW1lbnQsXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBjb25zdCBbb3JpZ2luRHJhZ1gsIG9yaWdpbkRyYWdZXSA9IGdldEdyaWRQb2ludChcbiAgICAgICAgICAgICAgICAgIHBvaW50ZXJEb3duU3RhdGUub3JpZ2luLnggLSBwb2ludGVyRG93blN0YXRlLmRyYWcub2Zmc2V0LngsXG4gICAgICAgICAgICAgICAgICBwb2ludGVyRG93blN0YXRlLm9yaWdpbi55IC0gcG9pbnRlckRvd25TdGF0ZS5kcmFnLm9mZnNldC55LFxuICAgICAgICAgICAgICAgICAgdGhpcy5zdGF0ZS5ncmlkU2l6ZSxcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIG11dGF0ZUVsZW1lbnQoZHVwbGljYXRlZEVsZW1lbnQsIHtcbiAgICAgICAgICAgICAgICAgIHg6IGR1cGxpY2F0ZWRFbGVtZW50LnggKyAob3JpZ2luRHJhZ1ggLSBkcmFnWCksXG4gICAgICAgICAgICAgICAgICB5OiBkdXBsaWNhdGVkRWxlbWVudC55ICsgKG9yaWdpbkRyYWdZIC0gZHJhZ1kpLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIG5leHRFbGVtZW50cy5wdXNoKGR1cGxpY2F0ZWRFbGVtZW50KTtcbiAgICAgICAgICAgICAgICBlbGVtZW50c1RvQXBwZW5kLnB1c2goZWxlbWVudCk7XG4gICAgICAgICAgICAgICAgb2xkSWRUb0R1cGxpY2F0ZWRJZC5zZXQoZWxlbWVudC5pZCwgZHVwbGljYXRlZEVsZW1lbnQuaWQpO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIG5leHRFbGVtZW50cy5wdXNoKGVsZW1lbnQpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBuZXh0U2NlbmVFbGVtZW50cyA9IFsuLi5uZXh0RWxlbWVudHMsIC4uLmVsZW1lbnRzVG9BcHBlbmRdO1xuICAgICAgICAgICAgYmluZFRleHRUb1NoYXBlQWZ0ZXJEdXBsaWNhdGlvbihcbiAgICAgICAgICAgICAgbmV4dEVsZW1lbnRzLFxuICAgICAgICAgICAgICBlbGVtZW50c1RvQXBwZW5kLFxuICAgICAgICAgICAgICBvbGRJZFRvRHVwbGljYXRlZElkLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGZpeEJpbmRpbmdzQWZ0ZXJEdXBsaWNhdGlvbihcbiAgICAgICAgICAgICAgbmV4dFNjZW5lRWxlbWVudHMsXG4gICAgICAgICAgICAgIGVsZW1lbnRzVG9BcHBlbmQsXG4gICAgICAgICAgICAgIG9sZElkVG9EdXBsaWNhdGVkSWQsXG4gICAgICAgICAgICAgIFwiZHVwbGljYXRlc1NlcnZlQXNPbGRcIixcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICB0aGlzLnNjZW5lLnJlcGxhY2VBbGxFbGVtZW50cyhuZXh0U2NlbmVFbGVtZW50cyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBJdCBpcyB2ZXJ5IGltcG9ydGFudCB0byByZWFkIHRoaXMuc3RhdGUgd2l0aGluIGVhY2ggbW92ZSBldmVudCxcbiAgICAgIC8vIG90aGVyd2lzZSB3ZSB3b3VsZCByZWFkIGEgc3RhbGUgb25lIVxuICAgICAgY29uc3QgZHJhZ2dpbmdFbGVtZW50ID0gdGhpcy5zdGF0ZS5kcmFnZ2luZ0VsZW1lbnQ7XG4gICAgICBpZiAoIWRyYWdnaW5nRWxlbWVudCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmIChkcmFnZ2luZ0VsZW1lbnQudHlwZSA9PT0gXCJmcmVlZHJhd1wiKSB7XG4gICAgICAgIGNvbnN0IHBvaW50cyA9IGRyYWdnaW5nRWxlbWVudC5wb2ludHM7XG4gICAgICAgIGNvbnN0IGR4ID0gcG9pbnRlckNvb3Jkcy54IC0gZHJhZ2dpbmdFbGVtZW50Lng7XG4gICAgICAgIGNvbnN0IGR5ID0gcG9pbnRlckNvb3Jkcy55IC0gZHJhZ2dpbmdFbGVtZW50Lnk7XG5cbiAgICAgICAgY29uc3QgbGFzdFBvaW50ID0gcG9pbnRzLmxlbmd0aCA+IDAgJiYgcG9pbnRzW3BvaW50cy5sZW5ndGggLSAxXTtcbiAgICAgICAgY29uc3QgZGlzY2FyZFBvaW50ID1cbiAgICAgICAgICBsYXN0UG9pbnQgJiYgbGFzdFBvaW50WzBdID09PSBkeCAmJiBsYXN0UG9pbnRbMV0gPT09IGR5O1xuXG4gICAgICAgIGlmICghZGlzY2FyZFBvaW50KSB7XG4gICAgICAgICAgY29uc3QgcHJlc3N1cmVzID0gZHJhZ2dpbmdFbGVtZW50LnNpbXVsYXRlUHJlc3N1cmVcbiAgICAgICAgICAgID8gZHJhZ2dpbmdFbGVtZW50LnByZXNzdXJlc1xuICAgICAgICAgICAgOiBbLi4uZHJhZ2dpbmdFbGVtZW50LnByZXNzdXJlcywgZXZlbnQucHJlc3N1cmVdO1xuXG4gICAgICAgICAgbXV0YXRlRWxlbWVudChkcmFnZ2luZ0VsZW1lbnQsIHtcbiAgICAgICAgICAgIHBvaW50czogWy4uLnBvaW50cywgW2R4LCBkeV1dLFxuICAgICAgICAgICAgcHJlc3N1cmVzLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGlzTGluZWFyRWxlbWVudChkcmFnZ2luZ0VsZW1lbnQpKSB7XG4gICAgICAgIHBvaW50ZXJEb3duU3RhdGUuZHJhZy5oYXNPY2N1cnJlZCA9IHRydWU7XG4gICAgICAgIGNvbnN0IHBvaW50cyA9IGRyYWdnaW5nRWxlbWVudC5wb2ludHM7XG4gICAgICAgIGxldCBkeCA9IGdyaWRYIC0gZHJhZ2dpbmdFbGVtZW50Lng7XG4gICAgICAgIGxldCBkeSA9IGdyaWRZIC0gZHJhZ2dpbmdFbGVtZW50Lnk7XG5cbiAgICAgICAgaWYgKHNob3VsZFJvdGF0ZVdpdGhEaXNjcmV0ZUFuZ2xlKGV2ZW50KSAmJiBwb2ludHMubGVuZ3RoID09PSAyKSB7XG4gICAgICAgICAgKHsgd2lkdGg6IGR4LCBoZWlnaHQ6IGR5IH0gPSBnZXRQZXJmZWN0RWxlbWVudFNpemUoXG4gICAgICAgICAgICB0aGlzLnN0YXRlLmFjdGl2ZVRvb2wudHlwZSxcbiAgICAgICAgICAgIGR4LFxuICAgICAgICAgICAgZHksXG4gICAgICAgICAgKSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocG9pbnRzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgIG11dGF0ZUVsZW1lbnQoZHJhZ2dpbmdFbGVtZW50LCB7IHBvaW50czogWy4uLnBvaW50cywgW2R4LCBkeV1dIH0pO1xuICAgICAgICB9IGVsc2UgaWYgKHBvaW50cy5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgbXV0YXRlRWxlbWVudChkcmFnZ2luZ0VsZW1lbnQsIHtcbiAgICAgICAgICAgIHBvaW50czogWy4uLnBvaW50cy5zbGljZSgwLCAtMSksIFtkeCwgZHldXSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpc0JpbmRpbmdFbGVtZW50KGRyYWdnaW5nRWxlbWVudCwgZmFsc2UpKSB7XG4gICAgICAgICAgLy8gV2hlbiBjcmVhdGluZyBhIGxpbmVhciBlbGVtZW50IGJ5IGRyYWdnaW5nXG4gICAgICAgICAgdGhpcy5tYXliZVN1Z2dlc3RCaW5kaW5nc0ZvckxpbmVhckVsZW1lbnRBdENvb3JkcyhcbiAgICAgICAgICAgIGRyYWdnaW5nRWxlbWVudCxcbiAgICAgICAgICAgIFtwb2ludGVyQ29vcmRzXSxcbiAgICAgICAgICAgIHRoaXMuc3RhdGUuc3RhcnRCb3VuZEVsZW1lbnQsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcG9pbnRlckRvd25TdGF0ZS5sYXN0Q29vcmRzLnggPSBwb2ludGVyQ29vcmRzLng7XG4gICAgICAgIHBvaW50ZXJEb3duU3RhdGUubGFzdENvb3Jkcy55ID0gcG9pbnRlckNvb3Jkcy55O1xuICAgICAgICB0aGlzLm1heWJlRHJhZ05ld0dlbmVyaWNFbGVtZW50KHBvaW50ZXJEb3duU3RhdGUsIGV2ZW50KTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuc3RhdGUuYWN0aXZlVG9vbC50eXBlID09PSBcInNlbGVjdGlvblwiKSB7XG4gICAgICAgIHBvaW50ZXJEb3duU3RhdGUuYm94U2VsZWN0aW9uLmhhc09jY3VycmVkID0gdHJ1ZTtcblxuICAgICAgICBjb25zdCBlbGVtZW50cyA9IHRoaXMuc2NlbmUuZ2V0Tm9uRGVsZXRlZEVsZW1lbnRzKCk7XG4gICAgICAgIGlmIChcbiAgICAgICAgICAhZXZlbnQuc2hpZnRLZXkgJiZcbiAgICAgICAgICAvLyBhbGxvd3MgZm9yIGJveC1zZWxlY3RpbmcgcG9pbnRzICh3aXRob3V0IHNoaWZ0KVxuICAgICAgICAgICF0aGlzLnN0YXRlLmVkaXRpbmdMaW5lYXJFbGVtZW50ICYmXG4gICAgICAgICAgaXNTb21lRWxlbWVudFNlbGVjdGVkKGVsZW1lbnRzLCB0aGlzLnN0YXRlKVxuICAgICAgICApIHtcbiAgICAgICAgICBpZiAocG9pbnRlckRvd25TdGF0ZS53aXRoQ21kT3JDdHJsICYmIHBvaW50ZXJEb3duU3RhdGUuaGl0LmVsZW1lbnQpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0U3RhdGUoKHByZXZTdGF0ZSkgPT5cbiAgICAgICAgICAgICAgc2VsZWN0R3JvdXBzRm9yU2VsZWN0ZWRFbGVtZW50cyhcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAuLi5wcmV2U3RhdGUsXG4gICAgICAgICAgICAgICAgICBzZWxlY3RlZEVsZW1lbnRJZHM6IHtcbiAgICAgICAgICAgICAgICAgICAgW3BvaW50ZXJEb3duU3RhdGUuaGl0LmVsZW1lbnQhLmlkXTogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB0aGlzLnNjZW5lLmdldE5vbkRlbGV0ZWRFbGVtZW50cygpLFxuICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgICAgIHNlbGVjdGVkRWxlbWVudElkczoge30sXG4gICAgICAgICAgICAgIHNlbGVjdGVkR3JvdXBJZHM6IHt9LFxuICAgICAgICAgICAgICBlZGl0aW5nR3JvdXBJZDogbnVsbCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBib3gtc2VsZWN0IGxpbmUgZWRpdG9yIHBvaW50c1xuICAgICAgICBpZiAodGhpcy5zdGF0ZS5lZGl0aW5nTGluZWFyRWxlbWVudCkge1xuICAgICAgICAgIExpbmVhckVsZW1lbnRFZGl0b3IuaGFuZGxlQm94U2VsZWN0aW9uKFxuICAgICAgICAgICAgZXZlbnQsXG4gICAgICAgICAgICB0aGlzLnN0YXRlLFxuICAgICAgICAgICAgdGhpcy5zZXRTdGF0ZS5iaW5kKHRoaXMpLFxuICAgICAgICAgICk7XG4gICAgICAgICAgLy8gcmVndWxhciBib3gtc2VsZWN0XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc3QgZWxlbWVudHNXaXRoaW5TZWxlY3Rpb24gPSBnZXRFbGVtZW50c1dpdGhpblNlbGVjdGlvbihcbiAgICAgICAgICAgIGVsZW1lbnRzLFxuICAgICAgICAgICAgZHJhZ2dpbmdFbGVtZW50LFxuICAgICAgICAgICk7XG4gICAgICAgICAgdGhpcy5zZXRTdGF0ZSgocHJldlN0YXRlKSA9PlxuICAgICAgICAgICAgc2VsZWN0R3JvdXBzRm9yU2VsZWN0ZWRFbGVtZW50cyhcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIC4uLnByZXZTdGF0ZSxcbiAgICAgICAgICAgICAgICBzZWxlY3RlZEVsZW1lbnRJZHM6IHtcbiAgICAgICAgICAgICAgICAgIC4uLnByZXZTdGF0ZS5zZWxlY3RlZEVsZW1lbnRJZHMsXG4gICAgICAgICAgICAgICAgICAuLi5lbGVtZW50c1dpdGhpblNlbGVjdGlvbi5yZWR1Y2UoXG4gICAgICAgICAgICAgICAgICAgIChhY2M6IFJlY29yZDxFeGNhbGlkcmF3RWxlbWVudFtcImlkXCJdLCB0cnVlPiwgZWxlbWVudCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgIGFjY1tlbGVtZW50LmlkXSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFjYztcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAge30sXG4gICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgLi4uKHBvaW50ZXJEb3duU3RhdGUuaGl0LmVsZW1lbnRcbiAgICAgICAgICAgICAgICAgICAgPyB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiB1c2luZyBjdHJsL2NtZCwgc2VsZWN0IHRoZSBoaXRFbGVtZW50IG9ubHkgaWYgd2VcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGhhdmVuJ3QgYm94LXNlbGVjdGVkIGFueXRoaW5nIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgIFtwb2ludGVyRG93blN0YXRlLmhpdC5lbGVtZW50LmlkXTpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIWVsZW1lbnRzV2l0aGluU2VsZWN0aW9uLmxlbmd0aCxcbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIDogbnVsbCksXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBzaG93SHlwZXJsaW5rUG9wdXA6XG4gICAgICAgICAgICAgICAgICBlbGVtZW50c1dpdGhpblNlbGVjdGlvbi5sZW5ndGggPT09IDEgJiZcbiAgICAgICAgICAgICAgICAgIGVsZW1lbnRzV2l0aGluU2VsZWN0aW9uWzBdLmxpbmtcbiAgICAgICAgICAgICAgICAgICAgPyBcImluZm9cIlxuICAgICAgICAgICAgICAgICAgICA6IGZhbHNlLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB0aGlzLnNjZW5lLmdldE5vbkRlbGV0ZWRFbGVtZW50cygpLFxuICAgICAgICAgICAgKSxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvLyBSZXR1cm5zIHdoZXRoZXIgdGhlIHBvaW50ZXIgbW92ZSBoYXBwZW5lZCBvdmVyIGVpdGhlciBzY3JvbGxiYXJcbiAgcHJpdmF0ZSBoYW5kbGVQb2ludGVyTW92ZU92ZXJTY3JvbGxiYXJzKFxuICAgIGV2ZW50OiBQb2ludGVyRXZlbnQsXG4gICAgcG9pbnRlckRvd25TdGF0ZTogUG9pbnRlckRvd25TdGF0ZSxcbiAgKTogYm9vbGVhbiB7XG4gICAgaWYgKHBvaW50ZXJEb3duU3RhdGUuc2Nyb2xsYmFycy5pc092ZXJIb3Jpem9udGFsKSB7XG4gICAgICBjb25zdCB4ID0gZXZlbnQuY2xpZW50WDtcbiAgICAgIGNvbnN0IGR4ID0geCAtIHBvaW50ZXJEb3duU3RhdGUubGFzdENvb3Jkcy54O1xuICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgIHNjcm9sbFg6IHRoaXMuc3RhdGUuc2Nyb2xsWCAtIGR4IC8gdGhpcy5zdGF0ZS56b29tLnZhbHVlLFxuICAgICAgfSk7XG4gICAgICBwb2ludGVyRG93blN0YXRlLmxhc3RDb29yZHMueCA9IHg7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAocG9pbnRlckRvd25TdGF0ZS5zY3JvbGxiYXJzLmlzT3ZlclZlcnRpY2FsKSB7XG4gICAgICBjb25zdCB5ID0gZXZlbnQuY2xpZW50WTtcbiAgICAgIGNvbnN0IGR5ID0geSAtIHBvaW50ZXJEb3duU3RhdGUubGFzdENvb3Jkcy55O1xuICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgIHNjcm9sbFk6IHRoaXMuc3RhdGUuc2Nyb2xsWSAtIGR5IC8gdGhpcy5zdGF0ZS56b29tLnZhbHVlLFxuICAgICAgfSk7XG4gICAgICBwb2ludGVyRG93blN0YXRlLmxhc3RDb29yZHMueSA9IHk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcHJpdmF0ZSBvblBvaW50ZXJVcEZyb21Qb2ludGVyRG93bkhhbmRsZXIoXG4gICAgcG9pbnRlckRvd25TdGF0ZTogUG9pbnRlckRvd25TdGF0ZSxcbiAgKTogKGV2ZW50OiBQb2ludGVyRXZlbnQpID0+IHZvaWQge1xuICAgIHJldHVybiB3aXRoQmF0Y2hlZFVwZGF0ZXMoKGNoaWxkRXZlbnQ6IFBvaW50ZXJFdmVudCkgPT4ge1xuICAgICAgY29uc3Qge1xuICAgICAgICBkcmFnZ2luZ0VsZW1lbnQsXG4gICAgICAgIHJlc2l6aW5nRWxlbWVudCxcbiAgICAgICAgbXVsdGlFbGVtZW50LFxuICAgICAgICBhY3RpdmVUb29sLFxuICAgICAgICBpc1Jlc2l6aW5nLFxuICAgICAgICBpc1JvdGF0aW5nLFxuICAgICAgfSA9IHRoaXMuc3RhdGU7XG4gICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgaXNSZXNpemluZzogZmFsc2UsXG4gICAgICAgIGlzUm90YXRpbmc6IGZhbHNlLFxuICAgICAgICByZXNpemluZ0VsZW1lbnQ6IG51bGwsXG4gICAgICAgIHNlbGVjdGlvbkVsZW1lbnQ6IG51bGwsXG4gICAgICAgIGN1cnNvckJ1dHRvbjogXCJ1cFwiLFxuICAgICAgICAvLyB0ZXh0IGVsZW1lbnRzIGFyZSByZXNldCBvbiBmaW5hbGl6ZSwgYW5kIHJlc2V0dGluZyBvbiBwb2ludGVydXBcbiAgICAgICAgLy8gbWF5IGNhdXNlIGlzc3VlcyB3aXRoIGRvdWJsZSB0YXBzXG4gICAgICAgIGVkaXRpbmdFbGVtZW50OlxuICAgICAgICAgIG11bHRpRWxlbWVudCB8fCBpc1RleHRFbGVtZW50KHRoaXMuc3RhdGUuZWRpdGluZ0VsZW1lbnQpXG4gICAgICAgICAgICA/IHRoaXMuc3RhdGUuZWRpdGluZ0VsZW1lbnRcbiAgICAgICAgICAgIDogbnVsbCxcbiAgICAgIH0pO1xuXG4gICAgICB0aGlzLnNhdmVQb2ludGVyKGNoaWxkRXZlbnQuY2xpZW50WCwgY2hpbGRFdmVudC5jbGllbnRZLCBcInVwXCIpO1xuXG4gICAgICAvLyBIYW5kbGUgZW5kIG9mIGRyYWdnaW5nIGEgcG9pbnQgb2YgYSBsaW5lYXIgZWxlbWVudCwgbWlnaHQgY2xvc2UgYSBsb29wXG4gICAgICAvLyBhbmQgc2V0cyBiaW5kaW5nIGVsZW1lbnRcbiAgICAgIGlmICh0aGlzLnN0YXRlLmVkaXRpbmdMaW5lYXJFbGVtZW50KSB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICAhcG9pbnRlckRvd25TdGF0ZS5ib3hTZWxlY3Rpb24uaGFzT2NjdXJyZWQgJiZcbiAgICAgICAgICAocG9pbnRlckRvd25TdGF0ZS5oaXQ/LmVsZW1lbnQ/LmlkICE9PVxuICAgICAgICAgICAgdGhpcy5zdGF0ZS5lZGl0aW5nTGluZWFyRWxlbWVudC5lbGVtZW50SWQgfHxcbiAgICAgICAgICAgICFwb2ludGVyRG93blN0YXRlLmhpdC5oYXNIaXRFbGVtZW50SW5zaWRlKVxuICAgICAgICApIHtcbiAgICAgICAgICB0aGlzLmFjdGlvbk1hbmFnZXIuZXhlY3V0ZUFjdGlvbihhY3Rpb25GaW5hbGl6ZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc3QgZWRpdGluZ0xpbmVhckVsZW1lbnQgPSBMaW5lYXJFbGVtZW50RWRpdG9yLmhhbmRsZVBvaW50ZXJVcChcbiAgICAgICAgICAgIGNoaWxkRXZlbnQsXG4gICAgICAgICAgICB0aGlzLnN0YXRlLmVkaXRpbmdMaW5lYXJFbGVtZW50LFxuICAgICAgICAgICAgdGhpcy5zdGF0ZSxcbiAgICAgICAgICApO1xuICAgICAgICAgIGlmIChlZGl0aW5nTGluZWFyRWxlbWVudCAhPT0gdGhpcy5zdGF0ZS5lZGl0aW5nTGluZWFyRWxlbWVudCkge1xuICAgICAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgICAgIGVkaXRpbmdMaW5lYXJFbGVtZW50LFxuICAgICAgICAgICAgICBzdWdnZXN0ZWRCaW5kaW5nczogW10sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgbGFzdFBvaW50ZXJVcCA9IG51bGw7XG5cbiAgICAgIGlmIChwb2ludGVyRG93blN0YXRlLmV2ZW50TGlzdGVuZXJzLm9uTW92ZSkge1xuICAgICAgICBwb2ludGVyRG93blN0YXRlLmV2ZW50TGlzdGVuZXJzLm9uTW92ZS5mbHVzaCgpO1xuICAgICAgfVxuXG4gICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihcbiAgICAgICAgRVZFTlQuUE9JTlRFUl9NT1ZFLFxuICAgICAgICBwb2ludGVyRG93blN0YXRlLmV2ZW50TGlzdGVuZXJzLm9uTW92ZSEsXG4gICAgICApO1xuICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoXG4gICAgICAgIEVWRU5ULlBPSU5URVJfVVAsXG4gICAgICAgIHBvaW50ZXJEb3duU3RhdGUuZXZlbnRMaXN0ZW5lcnMub25VcCEsXG4gICAgICApO1xuICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoXG4gICAgICAgIEVWRU5ULktFWURPV04sXG4gICAgICAgIHBvaW50ZXJEb3duU3RhdGUuZXZlbnRMaXN0ZW5lcnMub25LZXlEb3duISxcbiAgICAgICk7XG4gICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihcbiAgICAgICAgRVZFTlQuS0VZVVAsXG4gICAgICAgIHBvaW50ZXJEb3duU3RhdGUuZXZlbnRMaXN0ZW5lcnMub25LZXlVcCEsXG4gICAgICApO1xuXG4gICAgICBpZiAodGhpcy5zdGF0ZS5wZW5kaW5nSW1hZ2VFbGVtZW50SWQpIHtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7IHBlbmRpbmdJbWFnZUVsZW1lbnRJZDogbnVsbCB9KTtcbiAgICAgIH1cblxuICAgICAgaWYgKGRyYWdnaW5nRWxlbWVudD8udHlwZSA9PT0gXCJmcmVlZHJhd1wiKSB7XG4gICAgICAgIGNvbnN0IHBvaW50ZXJDb29yZHMgPSB2aWV3cG9ydENvb3Jkc1RvU2NlbmVDb29yZHMoXG4gICAgICAgICAgY2hpbGRFdmVudCxcbiAgICAgICAgICB0aGlzLnN0YXRlLFxuICAgICAgICApO1xuXG4gICAgICAgIGNvbnN0IHBvaW50cyA9IGRyYWdnaW5nRWxlbWVudC5wb2ludHM7XG4gICAgICAgIGxldCBkeCA9IHBvaW50ZXJDb29yZHMueCAtIGRyYWdnaW5nRWxlbWVudC54O1xuICAgICAgICBsZXQgZHkgPSBwb2ludGVyQ29vcmRzLnkgLSBkcmFnZ2luZ0VsZW1lbnQueTtcblxuICAgICAgICAvLyBBbGxvd3MgZG90cyB0byBhdm9pZCBiZWluZyBmbGFnZ2VkIGFzIGluZmluaXRlbHkgc21hbGxcbiAgICAgICAgaWYgKGR4ID09PSBwb2ludHNbMF1bMF0gJiYgZHkgPT09IHBvaW50c1swXVsxXSkge1xuICAgICAgICAgIGR5ICs9IDAuMDAwMTtcbiAgICAgICAgICBkeCArPSAwLjAwMDE7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBwcmVzc3VyZXMgPSBkcmFnZ2luZ0VsZW1lbnQuc2ltdWxhdGVQcmVzc3VyZVxuICAgICAgICAgID8gW11cbiAgICAgICAgICA6IFsuLi5kcmFnZ2luZ0VsZW1lbnQucHJlc3N1cmVzLCBjaGlsZEV2ZW50LnByZXNzdXJlXTtcblxuICAgICAgICBtdXRhdGVFbGVtZW50KGRyYWdnaW5nRWxlbWVudCwge1xuICAgICAgICAgIHBvaW50czogWy4uLnBvaW50cywgW2R4LCBkeV1dLFxuICAgICAgICAgIHByZXNzdXJlcyxcbiAgICAgICAgICBsYXN0Q29tbWl0dGVkUG9pbnQ6IFtkeCwgZHldLFxuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLmFjdGlvbk1hbmFnZXIuZXhlY3V0ZUFjdGlvbihhY3Rpb25GaW5hbGl6ZSk7XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKGlzSW1hZ2VFbGVtZW50KGRyYWdnaW5nRWxlbWVudCkpIHtcbiAgICAgICAgY29uc3QgaW1hZ2VFbGVtZW50ID0gZHJhZ2dpbmdFbGVtZW50O1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHRoaXMuaW5pdGlhbGl6ZUltYWdlRGltZW5zaW9ucyhpbWFnZUVsZW1lbnQpO1xuICAgICAgICAgIHRoaXMuc2V0U3RhdGUoXG4gICAgICAgICAgICB7IHNlbGVjdGVkRWxlbWVudElkczogeyBbaW1hZ2VFbGVtZW50LmlkXTogdHJ1ZSB9IH0sXG4gICAgICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgICAgIHRoaXMuYWN0aW9uTWFuYWdlci5leGVjdXRlQWN0aW9uKGFjdGlvbkZpbmFsaXplKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgICAgICAgIHRoaXMuc2NlbmUucmVwbGFjZUFsbEVsZW1lbnRzKFxuICAgICAgICAgICAgdGhpcy5zY2VuZVxuICAgICAgICAgICAgICAuZ2V0RWxlbWVudHNJbmNsdWRpbmdEZWxldGVkKClcbiAgICAgICAgICAgICAgLmZpbHRlcigoZWwpID0+IGVsLmlkICE9PSBpbWFnZUVsZW1lbnQuaWQpLFxuICAgICAgICAgICk7XG4gICAgICAgICAgdGhpcy5hY3Rpb25NYW5hZ2VyLmV4ZWN1dGVBY3Rpb24oYWN0aW9uRmluYWxpemUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKGlzTGluZWFyRWxlbWVudChkcmFnZ2luZ0VsZW1lbnQpKSB7XG4gICAgICAgIGlmIChkcmFnZ2luZ0VsZW1lbnQhLnBvaW50cy5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgdGhpcy5oaXN0b3J5LnJlc3VtZVJlY29yZGluZygpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHBvaW50ZXJDb29yZHMgPSB2aWV3cG9ydENvb3Jkc1RvU2NlbmVDb29yZHMoXG4gICAgICAgICAgY2hpbGRFdmVudCxcbiAgICAgICAgICB0aGlzLnN0YXRlLFxuICAgICAgICApO1xuXG4gICAgICAgIGlmIChcbiAgICAgICAgICAhcG9pbnRlckRvd25TdGF0ZS5kcmFnLmhhc09jY3VycmVkICYmXG4gICAgICAgICAgZHJhZ2dpbmdFbGVtZW50ICYmXG4gICAgICAgICAgIW11bHRpRWxlbWVudFxuICAgICAgICApIHtcbiAgICAgICAgICBtdXRhdGVFbGVtZW50KGRyYWdnaW5nRWxlbWVudCwge1xuICAgICAgICAgICAgcG9pbnRzOiBbXG4gICAgICAgICAgICAgIC4uLmRyYWdnaW5nRWxlbWVudC5wb2ludHMsXG4gICAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICBwb2ludGVyQ29vcmRzLnggLSBkcmFnZ2luZ0VsZW1lbnQueCxcbiAgICAgICAgICAgICAgICBwb2ludGVyQ29vcmRzLnkgLSBkcmFnZ2luZ0VsZW1lbnQueSxcbiAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgICBtdWx0aUVsZW1lbnQ6IGRyYWdnaW5nRWxlbWVudCxcbiAgICAgICAgICAgIGVkaXRpbmdFbGVtZW50OiB0aGlzLnN0YXRlLmRyYWdnaW5nRWxlbWVudCxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIGlmIChwb2ludGVyRG93blN0YXRlLmRyYWcuaGFzT2NjdXJyZWQgJiYgIW11bHRpRWxlbWVudCkge1xuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIGlzQmluZGluZ0VuYWJsZWQodGhpcy5zdGF0ZSkgJiZcbiAgICAgICAgICAgIGlzQmluZGluZ0VsZW1lbnQoZHJhZ2dpbmdFbGVtZW50LCBmYWxzZSlcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIG1heWJlQmluZExpbmVhckVsZW1lbnQoXG4gICAgICAgICAgICAgIGRyYWdnaW5nRWxlbWVudCxcbiAgICAgICAgICAgICAgdGhpcy5zdGF0ZSxcbiAgICAgICAgICAgICAgdGhpcy5zY2VuZSxcbiAgICAgICAgICAgICAgcG9pbnRlckNvb3JkcyxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMuc2V0U3RhdGUoeyBzdWdnZXN0ZWRCaW5kaW5nczogW10sIHN0YXJ0Qm91bmRFbGVtZW50OiBudWxsIH0pO1xuICAgICAgICAgIGlmICghYWN0aXZlVG9vbC5sb2NrZWQpIHtcbiAgICAgICAgICAgIHJlc2V0Q3Vyc29yKHRoaXMuY2FudmFzKTtcbiAgICAgICAgICAgIHRoaXMuc2V0U3RhdGUoKHByZXZTdGF0ZSkgPT4gKHtcbiAgICAgICAgICAgICAgZHJhZ2dpbmdFbGVtZW50OiBudWxsLFxuICAgICAgICAgICAgICBhY3RpdmVUb29sOiB1cGRhdGVBY3RpdmVUb29sKHRoaXMuc3RhdGUsIHtcbiAgICAgICAgICAgICAgICB0eXBlOiBcInNlbGVjdGlvblwiLFxuICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgc2VsZWN0ZWRFbGVtZW50SWRzOiB7XG4gICAgICAgICAgICAgICAgLi4ucHJldlN0YXRlLnNlbGVjdGVkRWxlbWVudElkcyxcbiAgICAgICAgICAgICAgICBbZHJhZ2dpbmdFbGVtZW50LmlkXTogdHJ1ZSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5zZXRTdGF0ZSgocHJldlN0YXRlKSA9PiAoe1xuICAgICAgICAgICAgICBkcmFnZ2luZ0VsZW1lbnQ6IG51bGwsXG4gICAgICAgICAgICAgIHNlbGVjdGVkRWxlbWVudElkczoge1xuICAgICAgICAgICAgICAgIC4uLnByZXZTdGF0ZS5zZWxlY3RlZEVsZW1lbnRJZHMsXG4gICAgICAgICAgICAgICAgW2RyYWdnaW5nRWxlbWVudC5pZF06IHRydWUsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9KSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKFxuICAgICAgICBhY3RpdmVUb29sLnR5cGUgIT09IFwic2VsZWN0aW9uXCIgJiZcbiAgICAgICAgZHJhZ2dpbmdFbGVtZW50ICYmXG4gICAgICAgIGlzSW52aXNpYmx5U21hbGxFbGVtZW50KGRyYWdnaW5nRWxlbWVudClcbiAgICAgICkge1xuICAgICAgICAvLyByZW1vdmUgaW52aXNpYmxlIGVsZW1lbnQgd2hpY2ggd2FzIGFkZGVkIGluIG9uUG9pbnRlckRvd25cbiAgICAgICAgdGhpcy5zY2VuZS5yZXBsYWNlQWxsRWxlbWVudHMoXG4gICAgICAgICAgdGhpcy5zY2VuZS5nZXRFbGVtZW50c0luY2x1ZGluZ0RlbGV0ZWQoKS5zbGljZSgwLCAtMSksXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICAgIGRyYWdnaW5nRWxlbWVudDogbnVsbCxcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKGRyYWdnaW5nRWxlbWVudCkge1xuICAgICAgICBtdXRhdGVFbGVtZW50KFxuICAgICAgICAgIGRyYWdnaW5nRWxlbWVudCxcbiAgICAgICAgICBnZXROb3JtYWxpemVkRGltZW5zaW9ucyhkcmFnZ2luZ0VsZW1lbnQpLFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBpZiAocmVzaXppbmdFbGVtZW50KSB7XG4gICAgICAgIHRoaXMuaGlzdG9yeS5yZXN1bWVSZWNvcmRpbmcoKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHJlc2l6aW5nRWxlbWVudCAmJiBpc0ludmlzaWJseVNtYWxsRWxlbWVudChyZXNpemluZ0VsZW1lbnQpKSB7XG4gICAgICAgIHRoaXMuc2NlbmUucmVwbGFjZUFsbEVsZW1lbnRzKFxuICAgICAgICAgIHRoaXMuc2NlbmVcbiAgICAgICAgICAgIC5nZXRFbGVtZW50c0luY2x1ZGluZ0RlbGV0ZWQoKVxuICAgICAgICAgICAgLmZpbHRlcigoZWwpID0+IGVsLmlkICE9PSByZXNpemluZ0VsZW1lbnQuaWQpLFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICAvLyBDb2RlIGJlbG93IGhhbmRsZXMgc2VsZWN0aW9uIHdoZW4gZWxlbWVudChzKSB3ZXJlbid0XG4gICAgICAvLyBkcmFnIG9yIGFkZGVkIHRvIHNlbGVjdGlvbiBvbiBwb2ludGVyIGRvd24gcGhhc2UuXG4gICAgICBjb25zdCBoaXRFbGVtZW50ID0gcG9pbnRlckRvd25TdGF0ZS5oaXQuZWxlbWVudDtcbiAgICAgIGlmIChpc0VyYXNlckFjdGl2ZSh0aGlzLnN0YXRlKSkge1xuICAgICAgICBjb25zdCBkcmFnZ2VkRGlzdGFuY2UgPSBkaXN0YW5jZTJkKFxuICAgICAgICAgIHRoaXMubGFzdFBvaW50ZXJEb3duIS5jbGllbnRYLFxuICAgICAgICAgIHRoaXMubGFzdFBvaW50ZXJEb3duIS5jbGllbnRZLFxuICAgICAgICAgIHRoaXMubGFzdFBvaW50ZXJVcCEuY2xpZW50WCxcbiAgICAgICAgICB0aGlzLmxhc3RQb2ludGVyVXAhLmNsaWVudFksXG4gICAgICAgICk7XG5cbiAgICAgICAgaWYgKGRyYWdnZWREaXN0YW5jZSA9PT0gMCkge1xuICAgICAgICAgIGNvbnN0IHNjZW5lUG9pbnRlciA9IHZpZXdwb3J0Q29vcmRzVG9TY2VuZUNvb3JkcyhcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgY2xpZW50WDogdGhpcy5sYXN0UG9pbnRlclVwIS5jbGllbnRYLFxuICAgICAgICAgICAgICBjbGllbnRZOiB0aGlzLmxhc3RQb2ludGVyVXAhLmNsaWVudFksXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdGhpcy5zdGF0ZSxcbiAgICAgICAgICApO1xuICAgICAgICAgIGNvbnN0IGhpdEVsZW1lbnRzID0gdGhpcy5nZXRFbGVtZW50c0F0UG9zaXRpb24oXG4gICAgICAgICAgICBzY2VuZVBvaW50ZXIueCxcbiAgICAgICAgICAgIHNjZW5lUG9pbnRlci55LFxuICAgICAgICAgICk7XG4gICAgICAgICAgaGl0RWxlbWVudHMuZm9yRWFjaChcbiAgICAgICAgICAgIChoaXRFbGVtZW50KSA9PlxuICAgICAgICAgICAgICAocG9pbnRlckRvd25TdGF0ZS5lbGVtZW50SWRzVG9FcmFzZVtoaXRFbGVtZW50LmlkXSA9IHtcbiAgICAgICAgICAgICAgICBlcmFzZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICBvcGFjaXR5OiBoaXRFbGVtZW50Lm9wYWNpdHksXG4gICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5lcmFzZUVsZW1lbnRzKHBvaW50ZXJEb3duU3RhdGUpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9IGVsc2UgaWYgKE9iamVjdC5rZXlzKHBvaW50ZXJEb3duU3RhdGUuZWxlbWVudElkc1RvRXJhc2UpLmxlbmd0aCkge1xuICAgICAgICB0aGlzLnJlc3RvcmVSZWFkeVRvRXJhc2VFbGVtZW50cyhwb2ludGVyRG93blN0YXRlKTtcbiAgICAgIH1cblxuICAgICAgaWYgKFxuICAgICAgICBoaXRFbGVtZW50ICYmXG4gICAgICAgICFwb2ludGVyRG93blN0YXRlLmRyYWcuaGFzT2NjdXJyZWQgJiZcbiAgICAgICAgIXBvaW50ZXJEb3duU3RhdGUuaGl0Lndhc0FkZGVkVG9TZWxlY3Rpb24gJiZcbiAgICAgICAgLy8gaWYgd2UncmUgZWRpdGluZyBhIGxpbmUsIHBvaW50ZXJ1cCBzaG91bGRuJ3Qgc3dpdGNoIHNlbGVjdGlvbiBpZlxuICAgICAgICAvLyBib3ggc2VsZWN0ZWRcbiAgICAgICAgKCF0aGlzLnN0YXRlLmVkaXRpbmdMaW5lYXJFbGVtZW50IHx8XG4gICAgICAgICAgIXBvaW50ZXJEb3duU3RhdGUuYm94U2VsZWN0aW9uLmhhc09jY3VycmVkKVxuICAgICAgKSB7XG4gICAgICAgIC8vIHdoZW4gaW5zaWRlIGxpbmUgZWRpdG9yLCBzaGlmdCBzZWxlY3RzIHBvaW50cyBpbnN0ZWFkXG4gICAgICAgIGlmIChjaGlsZEV2ZW50LnNoaWZ0S2V5ICYmICF0aGlzLnN0YXRlLmVkaXRpbmdMaW5lYXJFbGVtZW50KSB7XG4gICAgICAgICAgaWYgKHRoaXMuc3RhdGUuc2VsZWN0ZWRFbGVtZW50SWRzW2hpdEVsZW1lbnQuaWRdKSB7XG4gICAgICAgICAgICBpZiAoaXNTZWxlY3RlZFZpYUdyb3VwKHRoaXMuc3RhdGUsIGhpdEVsZW1lbnQpKSB7XG4gICAgICAgICAgICAgIC8vIFdlIHdhbnQgdG8gdW5zZWxlY3QgYWxsIGdyb3VwcyBoaXRFbGVtZW50IGlzIHBhcnQgb2ZcbiAgICAgICAgICAgICAgLy8gYXMgd2VsbCBhcyBhbGwgZWxlbWVudHMgdGhhdCBhcmUgcGFydCBvZiB0aGUgZ3JvdXBzXG4gICAgICAgICAgICAgIC8vIGhpdEVsZW1lbnQgaXMgcGFydCBvZlxuICAgICAgICAgICAgICBjb25zdCBpZHNPZlNlbGVjdGVkRWxlbWVudHNUaGF0QXJlSW5Hcm91cHMgPSBoaXRFbGVtZW50Lmdyb3VwSWRzXG4gICAgICAgICAgICAgICAgLmZsYXRNYXAoKGdyb3VwSWQpID0+XG4gICAgICAgICAgICAgICAgICBnZXRFbGVtZW50c0luR3JvdXAoXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2NlbmUuZ2V0Tm9uRGVsZXRlZEVsZW1lbnRzKCksXG4gICAgICAgICAgICAgICAgICAgIGdyb3VwSWQsXG4gICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAubWFwKChlbGVtZW50KSA9PiAoeyBbZWxlbWVudC5pZF06IGZhbHNlIH0pKVxuICAgICAgICAgICAgICAgIC5yZWR1Y2UoKHByZXZJZCwgYWNjKSA9PiAoeyAuLi5wcmV2SWQsIC4uLmFjYyB9KSwge30pO1xuXG4gICAgICAgICAgICAgIHRoaXMuc2V0U3RhdGUoKF9wcmV2U3RhdGUpID0+ICh7XG4gICAgICAgICAgICAgICAgc2VsZWN0ZWRHcm91cElkczoge1xuICAgICAgICAgICAgICAgICAgLi4uX3ByZXZTdGF0ZS5zZWxlY3RlZEVsZW1lbnRJZHMsXG4gICAgICAgICAgICAgICAgICAuLi5oaXRFbGVtZW50Lmdyb3VwSWRzXG4gICAgICAgICAgICAgICAgICAgIC5tYXAoKGdJZCkgPT4gKHsgW2dJZF06IGZhbHNlIH0pKVxuICAgICAgICAgICAgICAgICAgICAucmVkdWNlKChwcmV2LCBhY2MpID0+ICh7IC4uLnByZXYsIC4uLmFjYyB9KSwge30pLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgc2VsZWN0ZWRFbGVtZW50SWRzOiB7XG4gICAgICAgICAgICAgICAgICAuLi5fcHJldlN0YXRlLnNlbGVjdGVkRWxlbWVudElkcyxcbiAgICAgICAgICAgICAgICAgIC4uLmlkc09mU2VsZWN0ZWRFbGVtZW50c1RoYXRBcmVJbkdyb3VwcyxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAvLyByZW1vdmUgZWxlbWVudCBmcm9tIHNlbGVjdGlvbiB3aGlsZVxuICAgICAgICAgICAgICAvLyBrZWVwaW5nIHByZXYgZWxlbWVudHMgc2VsZWN0ZWRcbiAgICAgICAgICAgICAgdGhpcy5zZXRTdGF0ZSgocHJldlN0YXRlKSA9PlxuICAgICAgICAgICAgICAgIHNlbGVjdEdyb3Vwc0ZvclNlbGVjdGVkRWxlbWVudHMoXG4gICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIC4uLnByZXZTdGF0ZSxcbiAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRFbGVtZW50SWRzOiB7XG4gICAgICAgICAgICAgICAgICAgICAgLi4ucHJldlN0YXRlLnNlbGVjdGVkRWxlbWVudElkcyxcbiAgICAgICAgICAgICAgICAgICAgICBbaGl0RWxlbWVudCEuaWRdOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICB0aGlzLnNjZW5lLmdldE5vbkRlbGV0ZWRFbGVtZW50cygpLFxuICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIGFkZCBlbGVtZW50IHRvIHNlbGVjdGlvbiB3aGlsZVxuICAgICAgICAgICAgLy8ga2VlcGluZyBwcmV2IGVsZW1lbnRzIHNlbGVjdGVkXG5cbiAgICAgICAgICAgIHRoaXMuc2V0U3RhdGUoKF9wcmV2U3RhdGUpID0+ICh7XG4gICAgICAgICAgICAgIHNlbGVjdGVkRWxlbWVudElkczoge1xuICAgICAgICAgICAgICAgIC4uLl9wcmV2U3RhdGUuc2VsZWN0ZWRFbGVtZW50SWRzLFxuICAgICAgICAgICAgICAgIFtoaXRFbGVtZW50IS5pZF06IHRydWUsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9KSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuc2V0U3RhdGUoKHByZXZTdGF0ZSkgPT4gKHtcbiAgICAgICAgICAgIC4uLnNlbGVjdEdyb3Vwc0ZvclNlbGVjdGVkRWxlbWVudHMoXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAuLi5wcmV2U3RhdGUsXG4gICAgICAgICAgICAgICAgc2VsZWN0ZWRFbGVtZW50SWRzOiB7IFtoaXRFbGVtZW50LmlkXTogdHJ1ZSB9LFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB0aGlzLnNjZW5lLmdldE5vbkRlbGV0ZWRFbGVtZW50cygpLFxuICAgICAgICAgICAgKSxcbiAgICAgICAgICB9KSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKFxuICAgICAgICAhdGhpcy5zdGF0ZS5lZGl0aW5nTGluZWFyRWxlbWVudCAmJlxuICAgICAgICAhcG9pbnRlckRvd25TdGF0ZS5kcmFnLmhhc09jY3VycmVkICYmXG4gICAgICAgICF0aGlzLnN0YXRlLmlzUmVzaXppbmcgJiZcbiAgICAgICAgKChoaXRFbGVtZW50ICYmXG4gICAgICAgICAgaXNIaXR0aW5nRWxlbWVudEJvdW5kaW5nQm94V2l0aG91dEhpdHRpbmdFbGVtZW50KFxuICAgICAgICAgICAgaGl0RWxlbWVudCxcbiAgICAgICAgICAgIHRoaXMuc3RhdGUsXG4gICAgICAgICAgICBwb2ludGVyRG93blN0YXRlLm9yaWdpbi54LFxuICAgICAgICAgICAgcG9pbnRlckRvd25TdGF0ZS5vcmlnaW4ueSxcbiAgICAgICAgICApKSB8fFxuICAgICAgICAgICghaGl0RWxlbWVudCAmJlxuICAgICAgICAgICAgcG9pbnRlckRvd25TdGF0ZS5oaXQuaGFzSGl0Q29tbW9uQm91bmRpbmdCb3hPZlNlbGVjdGVkRWxlbWVudHMpKVxuICAgICAgKSB7XG4gICAgICAgIC8vIERlc2VsZWN0IHNlbGVjdGVkIGVsZW1lbnRzXG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICAgIHNlbGVjdGVkRWxlbWVudElkczoge30sXG4gICAgICAgICAgc2VsZWN0ZWRHcm91cElkczoge30sXG4gICAgICAgICAgZWRpdGluZ0dyb3VwSWQ6IG51bGwsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKFxuICAgICAgICAhYWN0aXZlVG9vbC5sb2NrZWQgJiZcbiAgICAgICAgYWN0aXZlVG9vbC50eXBlICE9PSBcImZyZWVkcmF3XCIgJiZcbiAgICAgICAgZHJhZ2dpbmdFbGVtZW50XG4gICAgICApIHtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSgocHJldlN0YXRlKSA9PiAoe1xuICAgICAgICAgIHNlbGVjdGVkRWxlbWVudElkczoge1xuICAgICAgICAgICAgLi4ucHJldlN0YXRlLnNlbGVjdGVkRWxlbWVudElkcyxcbiAgICAgICAgICAgIFtkcmFnZ2luZ0VsZW1lbnQuaWRdOiB0cnVlLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pKTtcbiAgICAgIH1cblxuICAgICAgaWYgKFxuICAgICAgICBhY3RpdmVUb29sLnR5cGUgIT09IFwic2VsZWN0aW9uXCIgfHxcbiAgICAgICAgaXNTb21lRWxlbWVudFNlbGVjdGVkKHRoaXMuc2NlbmUuZ2V0Tm9uRGVsZXRlZEVsZW1lbnRzKCksIHRoaXMuc3RhdGUpXG4gICAgICApIHtcbiAgICAgICAgdGhpcy5oaXN0b3J5LnJlc3VtZVJlY29yZGluZygpO1xuICAgICAgfVxuXG4gICAgICBpZiAocG9pbnRlckRvd25TdGF0ZS5kcmFnLmhhc09jY3VycmVkIHx8IGlzUmVzaXppbmcgfHwgaXNSb3RhdGluZykge1xuICAgICAgICAoaXNCaW5kaW5nRW5hYmxlZCh0aGlzLnN0YXRlKVxuICAgICAgICAgID8gYmluZE9yVW5iaW5kU2VsZWN0ZWRFbGVtZW50c1xuICAgICAgICAgIDogdW5iaW5kTGluZWFyRWxlbWVudHMpKFxuICAgICAgICAgIGdldFNlbGVjdGVkRWxlbWVudHModGhpcy5zY2VuZS5nZXROb25EZWxldGVkRWxlbWVudHMoKSwgdGhpcy5zdGF0ZSksXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIGlmICghYWN0aXZlVG9vbC5sb2NrZWQgJiYgYWN0aXZlVG9vbC50eXBlICE9PSBcImZyZWVkcmF3XCIpIHtcbiAgICAgICAgcmVzZXRDdXJzb3IodGhpcy5jYW52YXMpO1xuICAgICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgICBkcmFnZ2luZ0VsZW1lbnQ6IG51bGwsXG4gICAgICAgICAgc3VnZ2VzdGVkQmluZGluZ3M6IFtdLFxuICAgICAgICAgIGFjdGl2ZVRvb2w6IHVwZGF0ZUFjdGl2ZVRvb2wodGhpcy5zdGF0ZSwgeyB0eXBlOiBcInNlbGVjdGlvblwiIH0pLFxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICAgIGRyYWdnaW5nRWxlbWVudDogbnVsbCxcbiAgICAgICAgICBzdWdnZXN0ZWRCaW5kaW5nczogW10sXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSByZXN0b3JlUmVhZHlUb0VyYXNlRWxlbWVudHMgPSAoXG4gICAgcG9pbnRlckRvd25TdGF0ZTogUG9pbnRlckRvd25TdGF0ZSxcbiAgKSA9PiB7XG4gICAgY29uc3QgZWxlbWVudHMgPSB0aGlzLnNjZW5lLmdldEVsZW1lbnRzSW5jbHVkaW5nRGVsZXRlZCgpLm1hcCgoZWxlKSA9PiB7XG4gICAgICBpZiAoXG4gICAgICAgIHBvaW50ZXJEb3duU3RhdGUuZWxlbWVudElkc1RvRXJhc2VbZWxlLmlkXSAmJlxuICAgICAgICBwb2ludGVyRG93blN0YXRlLmVsZW1lbnRJZHNUb0VyYXNlW2VsZS5pZF0uZXJhc2VcbiAgICAgICkge1xuICAgICAgICByZXR1cm4gbmV3RWxlbWVudFdpdGgoZWxlLCB7XG4gICAgICAgICAgb3BhY2l0eTogcG9pbnRlckRvd25TdGF0ZS5lbGVtZW50SWRzVG9FcmFzZVtlbGUuaWRdLm9wYWNpdHksXG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgaXNCb3VuZFRvQ29udGFpbmVyKGVsZSkgJiZcbiAgICAgICAgcG9pbnRlckRvd25TdGF0ZS5lbGVtZW50SWRzVG9FcmFzZVtlbGUuY29udGFpbmVySWRdICYmXG4gICAgICAgIHBvaW50ZXJEb3duU3RhdGUuZWxlbWVudElkc1RvRXJhc2VbZWxlLmNvbnRhaW5lcklkXS5lcmFzZVxuICAgICAgKSB7XG4gICAgICAgIHJldHVybiBuZXdFbGVtZW50V2l0aChlbGUsIHtcbiAgICAgICAgICBvcGFjaXR5OiBwb2ludGVyRG93blN0YXRlLmVsZW1lbnRJZHNUb0VyYXNlW2VsZS5jb250YWluZXJJZF0ub3BhY2l0eSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gZWxlO1xuICAgIH0pO1xuXG4gICAgdGhpcy5zY2VuZS5yZXBsYWNlQWxsRWxlbWVudHMoZWxlbWVudHMpO1xuICB9O1xuXG4gIHByaXZhdGUgZXJhc2VFbGVtZW50cyA9IChwb2ludGVyRG93blN0YXRlOiBQb2ludGVyRG93blN0YXRlKSA9PiB7XG4gICAgY29uc3QgZWxlbWVudHMgPSB0aGlzLnNjZW5lLmdldEVsZW1lbnRzSW5jbHVkaW5nRGVsZXRlZCgpLm1hcCgoZWxlKSA9PiB7XG4gICAgICBpZiAoXG4gICAgICAgIHBvaW50ZXJEb3duU3RhdGUuZWxlbWVudElkc1RvRXJhc2VbZWxlLmlkXSAmJlxuICAgICAgICBwb2ludGVyRG93blN0YXRlLmVsZW1lbnRJZHNUb0VyYXNlW2VsZS5pZF0uZXJhc2VcbiAgICAgICkge1xuICAgICAgICByZXR1cm4gbmV3RWxlbWVudFdpdGgoZWxlLCB7IGlzRGVsZXRlZDogdHJ1ZSB9KTtcbiAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgIGlzQm91bmRUb0NvbnRhaW5lcihlbGUpICYmXG4gICAgICAgIHBvaW50ZXJEb3duU3RhdGUuZWxlbWVudElkc1RvRXJhc2VbZWxlLmNvbnRhaW5lcklkXSAmJlxuICAgICAgICBwb2ludGVyRG93blN0YXRlLmVsZW1lbnRJZHNUb0VyYXNlW2VsZS5jb250YWluZXJJZF0uZXJhc2VcbiAgICAgICkge1xuICAgICAgICByZXR1cm4gbmV3RWxlbWVudFdpdGgoZWxlLCB7IGlzRGVsZXRlZDogdHJ1ZSB9KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBlbGU7XG4gICAgfSk7XG5cbiAgICB0aGlzLmhpc3RvcnkucmVzdW1lUmVjb3JkaW5nKCk7XG4gICAgdGhpcy5zY2VuZS5yZXBsYWNlQWxsRWxlbWVudHMoZWxlbWVudHMpO1xuICB9O1xuXG4gIHByaXZhdGUgaW5pdGlhbGl6ZUltYWdlID0gYXN5bmMgKHtcbiAgICBpbWFnZUZpbGUsXG4gICAgaW1hZ2VFbGVtZW50OiBfaW1hZ2VFbGVtZW50LFxuICAgIHNob3dDdXJzb3JJbWFnZVByZXZpZXcgPSBmYWxzZSxcbiAgfToge1xuICAgIGltYWdlRmlsZTogRmlsZTtcbiAgICBpbWFnZUVsZW1lbnQ6IEV4Y2FsaWRyYXdJbWFnZUVsZW1lbnQ7XG4gICAgc2hvd0N1cnNvckltYWdlUHJldmlldz86IGJvb2xlYW47XG4gIH0pID0+IHtcbiAgICAvLyBhdCB0aGlzIHBvaW50IHRoaXMgc2hvdWxkIGJlIGd1YXJhbnRlZWQgaW1hZ2UgZmlsZSwgYnV0IHdlIGRvIHRoaXMgY2hlY2tcbiAgICAvLyB0byBzYXRpc2Z5IFRTIGRvd24gdGhlIGxpbmVcbiAgICBpZiAoIWlzU3VwcG9ydGVkSW1hZ2VGaWxlKGltYWdlRmlsZSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcih0KFwiZXJyb3JzLnVuc3VwcG9ydGVkRmlsZVR5cGVcIikpO1xuICAgIH1cbiAgICBjb25zdCBtaW1lVHlwZSA9IGltYWdlRmlsZS50eXBlO1xuXG4gICAgc2V0Q3Vyc29yKHRoaXMuY2FudmFzLCBcIndhaXRcIik7XG5cbiAgICBpZiAobWltZVR5cGUgPT09IE1JTUVfVFlQRVMuc3ZnKSB7XG4gICAgICB0cnkge1xuICAgICAgICBpbWFnZUZpbGUgPSBTVkdTdHJpbmdUb0ZpbGUoXG4gICAgICAgICAgYXdhaXQgbm9ybWFsaXplU1ZHKGF3YWl0IGltYWdlRmlsZS50ZXh0KCkpLFxuICAgICAgICAgIGltYWdlRmlsZS5uYW1lLFxuICAgICAgICApO1xuICAgICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgICBjb25zb2xlLndhcm4oZXJyb3IpO1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IodChcImVycm9ycy5zdmdJbWFnZUluc2VydEVycm9yXCIpKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBnZW5lcmF0ZSBpbWFnZSBpZCAoYnkgZGVmYXVsdCB0aGUgZmlsZSBkaWdlc3QpIGJlZm9yZSBhbnlcbiAgICAvLyByZXNpemluZy9jb21wcmVzc2lvbiB0YWtlcyBwbGFjZSB0byBrZWVwIGl0IG1vcmUgcG9ydGFibGVcbiAgICBjb25zdCBmaWxlSWQgPSBhd2FpdCAoKHRoaXMucHJvcHMuZ2VuZXJhdGVJZEZvckZpbGU/LihcbiAgICAgIGltYWdlRmlsZSxcbiAgICApIGFzIFByb21pc2U8RmlsZUlkPikgfHwgZ2VuZXJhdGVJZEZyb21GaWxlKGltYWdlRmlsZSkpO1xuXG4gICAgaWYgKCFmaWxlSWQpIHtcbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgXCJDb3VsZG4ndCBnZW5lcmF0ZSBmaWxlIGlkIG9yIHRoZSBzdXBwbGllZCBgZ2VuZXJhdGVJZEZvckZpbGVgIGRpZG4ndCByZXNvbHZlIHRvIG9uZS5cIixcbiAgICAgICk7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IodChcImVycm9ycy5pbWFnZUluc2VydEVycm9yXCIpKTtcbiAgICB9XG5cbiAgICBjb25zdCBleGlzdGluZ0ZpbGVEYXRhID0gdGhpcy5maWxlc1tmaWxlSWRdO1xuICAgIGlmICghZXhpc3RpbmdGaWxlRGF0YT8uZGF0YVVSTCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgaW1hZ2VGaWxlID0gYXdhaXQgcmVzaXplSW1hZ2VGaWxlKGltYWdlRmlsZSwge1xuICAgICAgICAgIG1heFdpZHRoT3JIZWlnaHQ6IERFRkFVTFRfTUFYX0lNQUdFX1dJRFRIX09SX0hFSUdIVCxcbiAgICAgICAgfSk7XG4gICAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXCJlcnJvciB0cnlpbmcgdG8gcmVzaW5nIGltYWdlIGZpbGUgb24gaW5zZXJ0aW9uXCIsIGVycm9yKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGltYWdlRmlsZS5zaXplID4gTUFYX0FMTE9XRURfRklMRV9CWVRFUykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgdChcImVycm9ycy5maWxlVG9vQmlnXCIsIHtcbiAgICAgICAgICAgIG1heFNpemU6IGAke01hdGgudHJ1bmMoTUFYX0FMTE9XRURfRklMRV9CWVRFUyAvIDEwMjQgLyAxMDI0KX1NQmAsXG4gICAgICAgICAgfSksXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHNob3dDdXJzb3JJbWFnZVByZXZpZXcpIHtcbiAgICAgIGNvbnN0IGRhdGFVUkwgPSB0aGlzLmZpbGVzW2ZpbGVJZF0/LmRhdGFVUkw7XG4gICAgICAvLyBvcHRpbWl6YXRpb24gc28gdGhhdCB3ZSBkb24ndCB1bm5lY2Vzc2FyaWx5IHJlc2l6ZSB0aGUgb3JpZ2luYWxcbiAgICAgIC8vIGZ1bGwtc2l6ZSBmaWxlIGZvciBjdXJzb3IgcHJldmlld1xuICAgICAgLy8gKGl0J3MgbXVjaCBmYXN0ZXIgdG8gY29udmVydCB0aGUgcmVzaXplZCBkYXRhVVJMIHRvIEZpbGUpXG4gICAgICBjb25zdCByZXNpemVkRmlsZSA9IGRhdGFVUkwgJiYgZGF0YVVSTFRvRmlsZShkYXRhVVJMKTtcblxuICAgICAgdGhpcy5zZXRJbWFnZVByZXZpZXdDdXJzb3IocmVzaXplZEZpbGUgfHwgaW1hZ2VGaWxlKTtcbiAgICB9XG5cbiAgICBjb25zdCBkYXRhVVJMID1cbiAgICAgIHRoaXMuZmlsZXNbZmlsZUlkXT8uZGF0YVVSTCB8fCAoYXdhaXQgZ2V0RGF0YVVSTChpbWFnZUZpbGUpKTtcblxuICAgIGNvbnN0IGltYWdlRWxlbWVudCA9IG11dGF0ZUVsZW1lbnQoXG4gICAgICBfaW1hZ2VFbGVtZW50LFxuICAgICAge1xuICAgICAgICBmaWxlSWQsXG4gICAgICB9LFxuICAgICAgZmFsc2UsXG4gICAgKSBhcyBOb25EZWxldGVkPEluaXRpYWxpemVkRXhjYWxpZHJhd0ltYWdlRWxlbWVudD47XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2U8Tm9uRGVsZXRlZDxJbml0aWFsaXplZEV4Y2FsaWRyYXdJbWFnZUVsZW1lbnQ+PihcbiAgICAgIGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICB0aGlzLmZpbGVzID0ge1xuICAgICAgICAgICAgLi4udGhpcy5maWxlcyxcbiAgICAgICAgICAgIFtmaWxlSWRdOiB7XG4gICAgICAgICAgICAgIG1pbWVUeXBlLFxuICAgICAgICAgICAgICBpZDogZmlsZUlkLFxuICAgICAgICAgICAgICBkYXRhVVJMLFxuICAgICAgICAgICAgICBjcmVhdGVkOiBEYXRlLm5vdygpLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9O1xuICAgICAgICAgIGNvbnN0IGNhY2hlZEltYWdlRGF0YSA9IHRoaXMuaW1hZ2VDYWNoZS5nZXQoZmlsZUlkKTtcbiAgICAgICAgICBpZiAoIWNhY2hlZEltYWdlRGF0YSkge1xuICAgICAgICAgICAgdGhpcy5hZGROZXdJbWFnZXNUb0ltYWdlQ2FjaGUoKTtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMudXBkYXRlSW1hZ2VDYWNoZShbaW1hZ2VFbGVtZW50XSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChjYWNoZWRJbWFnZURhdGE/LmltYWdlIGluc3RhbmNlb2YgUHJvbWlzZSkge1xuICAgICAgICAgICAgYXdhaXQgY2FjaGVkSW1hZ2VEYXRhLmltYWdlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICB0aGlzLnN0YXRlLnBlbmRpbmdJbWFnZUVsZW1lbnRJZCAhPT0gaW1hZ2VFbGVtZW50LmlkICYmXG4gICAgICAgICAgICB0aGlzLnN0YXRlLmRyYWdnaW5nRWxlbWVudD8uaWQgIT09IGltYWdlRWxlbWVudC5pZFxuICAgICAgICAgICkge1xuICAgICAgICAgICAgdGhpcy5pbml0aWFsaXplSW1hZ2VEaW1lbnNpb25zKGltYWdlRWxlbWVudCwgdHJ1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJlc29sdmUoaW1hZ2VFbGVtZW50KTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IodChcImVycm9ycy5pbWFnZUluc2VydEVycm9yXCIpKSk7XG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgaWYgKCFzaG93Q3Vyc29ySW1hZ2VQcmV2aWV3KSB7XG4gICAgICAgICAgICByZXNldEN1cnNvcih0aGlzLmNhbnZhcyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9LFxuICAgICk7XG4gIH07XG5cbiAgLyoqXG4gICAqIGluc2VydHMgaW1hZ2UgaW50byBlbGVtZW50cyBhcnJheSBhbmQgcmVyZW5kZXJzXG4gICAqL1xuICBwcml2YXRlIGluc2VydEltYWdlRWxlbWVudCA9IGFzeW5jIChcbiAgICBpbWFnZUVsZW1lbnQ6IEV4Y2FsaWRyYXdJbWFnZUVsZW1lbnQsXG4gICAgaW1hZ2VGaWxlOiBGaWxlLFxuICAgIHNob3dDdXJzb3JJbWFnZVByZXZpZXc/OiBib29sZWFuLFxuICApID0+IHtcbiAgICB0aGlzLnNjZW5lLnJlcGxhY2VBbGxFbGVtZW50cyhbXG4gICAgICAuLi50aGlzLnNjZW5lLmdldEVsZW1lbnRzSW5jbHVkaW5nRGVsZXRlZCgpLFxuICAgICAgaW1hZ2VFbGVtZW50LFxuICAgIF0pO1xuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMuaW5pdGlhbGl6ZUltYWdlKHtcbiAgICAgICAgaW1hZ2VGaWxlLFxuICAgICAgICBpbWFnZUVsZW1lbnQsXG4gICAgICAgIHNob3dDdXJzb3JJbWFnZVByZXZpZXcsXG4gICAgICB9KTtcbiAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICBtdXRhdGVFbGVtZW50KGltYWdlRWxlbWVudCwge1xuICAgICAgICBpc0RlbGV0ZWQ6IHRydWUsXG4gICAgICB9KTtcbiAgICAgIHRoaXMuYWN0aW9uTWFuYWdlci5leGVjdXRlQWN0aW9uKGFjdGlvbkZpbmFsaXplKTtcbiAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICBlcnJvck1lc3NhZ2U6IGVycm9yLm1lc3NhZ2UgfHwgdChcImVycm9ycy5pbWFnZUluc2VydEVycm9yXCIpLFxuICAgICAgfSk7XG4gICAgfVxuICB9O1xuXG4gIHByaXZhdGUgc2V0SW1hZ2VQcmV2aWV3Q3Vyc29yID0gYXN5bmMgKGltYWdlRmlsZTogRmlsZSkgPT4ge1xuICAgIC8vIG11c3RuJ3QgYmUgbGFyZ2VyIHRoYW4gMTI4IHB4XG4gICAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQ1NTL0NTU19CYXNpY19Vc2VyX0ludGVyZmFjZS9Vc2luZ19VUkxfdmFsdWVzX2Zvcl90aGVfY3Vyc29yX3Byb3BlcnR5XG4gICAgY29uc3QgY3Vyc29ySW1hZ2VTaXplUHggPSA5NjtcblxuICAgIGNvbnN0IGltYWdlUHJldmlldyA9IGF3YWl0IHJlc2l6ZUltYWdlRmlsZShpbWFnZUZpbGUsIHtcbiAgICAgIG1heFdpZHRoT3JIZWlnaHQ6IGN1cnNvckltYWdlU2l6ZVB4LFxuICAgIH0pO1xuXG4gICAgbGV0IHByZXZpZXdEYXRhVVJMID0gYXdhaXQgZ2V0RGF0YVVSTChpbWFnZVByZXZpZXcpO1xuXG4gICAgLy8gU1ZHIGNhbm5vdCBiZSByZXNpemVkIHZpYSBgcmVzaXplSW1hZ2VGaWxlYCBzbyB3ZSByZXNpemUgYnkgcmVuZGVyaW5nIHRvXG4gICAgLy8gYSBzbWFsbCBjYW52YXNcbiAgICBpZiAoaW1hZ2VGaWxlLnR5cGUgPT09IE1JTUVfVFlQRVMuc3ZnKSB7XG4gICAgICBjb25zdCBpbWcgPSBhd2FpdCBsb2FkSFRNTEltYWdlRWxlbWVudChwcmV2aWV3RGF0YVVSTCk7XG5cbiAgICAgIGxldCBoZWlnaHQgPSBNYXRoLm1pbihpbWcuaGVpZ2h0LCBjdXJzb3JJbWFnZVNpemVQeCk7XG4gICAgICBsZXQgd2lkdGggPSBoZWlnaHQgKiAoaW1nLndpZHRoIC8gaW1nLmhlaWdodCk7XG5cbiAgICAgIGlmICh3aWR0aCA+IGN1cnNvckltYWdlU2l6ZVB4KSB7XG4gICAgICAgIHdpZHRoID0gY3Vyc29ySW1hZ2VTaXplUHg7XG4gICAgICAgIGhlaWdodCA9IHdpZHRoICogKGltZy5oZWlnaHQgLyBpbWcud2lkdGgpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBjYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiY2FudmFzXCIpO1xuICAgICAgY2FudmFzLmhlaWdodCA9IGhlaWdodDtcbiAgICAgIGNhbnZhcy53aWR0aCA9IHdpZHRoO1xuICAgICAgY29uc3QgY29udGV4dCA9IGNhbnZhcy5nZXRDb250ZXh0KFwiMmRcIikhO1xuXG4gICAgICBjb250ZXh0LmRyYXdJbWFnZShpbWcsIDAsIDAsIHdpZHRoLCBoZWlnaHQpO1xuXG4gICAgICBwcmV2aWV3RGF0YVVSTCA9IGNhbnZhcy50b0RhdGFVUkwoTUlNRV9UWVBFUy5zdmcpIGFzIERhdGFVUkw7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuc3RhdGUucGVuZGluZ0ltYWdlRWxlbWVudElkKSB7XG4gICAgICBzZXRDdXJzb3IodGhpcy5jYW52YXMsIGB1cmwoJHtwcmV2aWV3RGF0YVVSTH0pIDQgNCwgYXV0b2ApO1xuICAgIH1cbiAgfTtcblxuICBwcml2YXRlIG9uSW1hZ2VBY3Rpb24gPSBhc3luYyAoXG4gICAgeyBpbnNlcnRPbkNhbnZhc0RpcmVjdGx5IH0gPSB7IGluc2VydE9uQ2FudmFzRGlyZWN0bHk6IGZhbHNlIH0sXG4gICkgPT4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBjbGllbnRYID0gdGhpcy5zdGF0ZS53aWR0aCAvIDIgKyB0aGlzLnN0YXRlLm9mZnNldExlZnQ7XG4gICAgICBjb25zdCBjbGllbnRZID0gdGhpcy5zdGF0ZS5oZWlnaHQgLyAyICsgdGhpcy5zdGF0ZS5vZmZzZXRUb3A7XG5cbiAgICAgIGNvbnN0IHsgeCwgeSB9ID0gdmlld3BvcnRDb29yZHNUb1NjZW5lQ29vcmRzKFxuICAgICAgICB7IGNsaWVudFgsIGNsaWVudFkgfSxcbiAgICAgICAgdGhpcy5zdGF0ZSxcbiAgICAgICk7XG5cbiAgICAgIGNvbnN0IGltYWdlRmlsZSA9IGF3YWl0IGZpbGVPcGVuKHtcbiAgICAgICAgZGVzY3JpcHRpb246IFwiSW1hZ2VcIixcbiAgICAgICAgZXh0ZW5zaW9uczogW1wianBnXCIsIFwicG5nXCIsIFwic3ZnXCIsIFwiZ2lmXCJdLFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IGltYWdlRWxlbWVudCA9IHRoaXMuY3JlYXRlSW1hZ2VFbGVtZW50KHtcbiAgICAgICAgc2NlbmVYOiB4LFxuICAgICAgICBzY2VuZVk6IHksXG4gICAgICB9KTtcblxuICAgICAgaWYgKGluc2VydE9uQ2FudmFzRGlyZWN0bHkpIHtcbiAgICAgICAgdGhpcy5pbnNlcnRJbWFnZUVsZW1lbnQoaW1hZ2VFbGVtZW50LCBpbWFnZUZpbGUpO1xuICAgICAgICB0aGlzLmluaXRpYWxpemVJbWFnZURpbWVuc2lvbnMoaW1hZ2VFbGVtZW50KTtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZShcbiAgICAgICAgICB7XG4gICAgICAgICAgICBzZWxlY3RlZEVsZW1lbnRJZHM6IHsgW2ltYWdlRWxlbWVudC5pZF06IHRydWUgfSxcbiAgICAgICAgICB9LFxuICAgICAgICAgICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuYWN0aW9uTWFuYWdlci5leGVjdXRlQWN0aW9uKGFjdGlvbkZpbmFsaXplKTtcbiAgICAgICAgICB9LFxuICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZShcbiAgICAgICAgICB7XG4gICAgICAgICAgICBwZW5kaW5nSW1hZ2VFbGVtZW50SWQ6IGltYWdlRWxlbWVudC5pZCxcbiAgICAgICAgICB9LFxuICAgICAgICAgICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuaW5zZXJ0SW1hZ2VFbGVtZW50KFxuICAgICAgICAgICAgICBpbWFnZUVsZW1lbnQsXG4gICAgICAgICAgICAgIGltYWdlRmlsZSxcbiAgICAgICAgICAgICAgLyogc2hvd0N1cnNvckltYWdlUHJldmlldyAqLyB0cnVlLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9LFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgIGlmIChlcnJvci5uYW1lICE9PSBcIkFib3J0RXJyb3JcIikge1xuICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUud2FybihlcnJvcik7XG4gICAgICB9XG4gICAgICB0aGlzLnNldFN0YXRlKFxuICAgICAgICB7XG4gICAgICAgICAgcGVuZGluZ0ltYWdlRWxlbWVudElkOiBudWxsLFxuICAgICAgICAgIGVkaXRpbmdFbGVtZW50OiBudWxsLFxuICAgICAgICAgIGFjdGl2ZVRvb2w6IHVwZGF0ZUFjdGl2ZVRvb2wodGhpcy5zdGF0ZSwgeyB0eXBlOiBcInNlbGVjdGlvblwiIH0pLFxuICAgICAgICB9LFxuICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgdGhpcy5hY3Rpb25NYW5hZ2VyLmV4ZWN1dGVBY3Rpb24oYWN0aW9uRmluYWxpemUpO1xuICAgICAgICB9LFxuICAgICAgKTtcbiAgICB9XG4gIH07XG5cbiAgcHJpdmF0ZSBpbml0aWFsaXplSW1hZ2VEaW1lbnNpb25zID0gKFxuICAgIGltYWdlRWxlbWVudDogRXhjYWxpZHJhd0ltYWdlRWxlbWVudCxcbiAgICBmb3JjZU5hdHVyYWxTaXplID0gZmFsc2UsXG4gICkgPT4ge1xuICAgIGNvbnN0IGltYWdlID1cbiAgICAgIGlzSW5pdGlhbGl6ZWRJbWFnZUVsZW1lbnQoaW1hZ2VFbGVtZW50KSAmJlxuICAgICAgdGhpcy5pbWFnZUNhY2hlLmdldChpbWFnZUVsZW1lbnQuZmlsZUlkKT8uaW1hZ2U7XG5cbiAgICBpZiAoIWltYWdlIHx8IGltYWdlIGluc3RhbmNlb2YgUHJvbWlzZSkge1xuICAgICAgaWYgKFxuICAgICAgICBpbWFnZUVsZW1lbnQud2lkdGggPCBEUkFHR0lOR19USFJFU0hPTEQgLyB0aGlzLnN0YXRlLnpvb20udmFsdWUgJiZcbiAgICAgICAgaW1hZ2VFbGVtZW50LmhlaWdodCA8IERSQUdHSU5HX1RIUkVTSE9MRCAvIHRoaXMuc3RhdGUuem9vbS52YWx1ZVxuICAgICAgKSB7XG4gICAgICAgIGNvbnN0IHBsYWNlaG9sZGVyU2l6ZSA9IDEwMCAvIHRoaXMuc3RhdGUuem9vbS52YWx1ZTtcbiAgICAgICAgbXV0YXRlRWxlbWVudChpbWFnZUVsZW1lbnQsIHtcbiAgICAgICAgICB4OiBpbWFnZUVsZW1lbnQueCAtIHBsYWNlaG9sZGVyU2l6ZSAvIDIsXG4gICAgICAgICAgeTogaW1hZ2VFbGVtZW50LnkgLSBwbGFjZWhvbGRlclNpemUgLyAyLFxuICAgICAgICAgIHdpZHRoOiBwbGFjZWhvbGRlclNpemUsXG4gICAgICAgICAgaGVpZ2h0OiBwbGFjZWhvbGRlclNpemUsXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKFxuICAgICAgZm9yY2VOYXR1cmFsU2l6ZSB8fFxuICAgICAgLy8gaWYgdXNlci1jcmVhdGVkIGJvdW5kaW5nIGJveCBpcyBiZWxvdyB0aHJlc2hvbGQsIGFzc3VtZSB0aGVcbiAgICAgIC8vIGludGVudGlvbiB3YXMgdG8gY2xpY2sgaW5zdGVhZCBvZiBkcmFnLCBhbmQgdXNlIHRoZSBpbWFnZSdzXG4gICAgICAvLyBpbnRyaW5zaWMgc2l6ZVxuICAgICAgKGltYWdlRWxlbWVudC53aWR0aCA8IERSQUdHSU5HX1RIUkVTSE9MRCAvIHRoaXMuc3RhdGUuem9vbS52YWx1ZSAmJlxuICAgICAgICBpbWFnZUVsZW1lbnQuaGVpZ2h0IDwgRFJBR0dJTkdfVEhSRVNIT0xEIC8gdGhpcy5zdGF0ZS56b29tLnZhbHVlKVxuICAgICkge1xuICAgICAgY29uc3QgbWluSGVpZ2h0ID0gTWF0aC5tYXgodGhpcy5zdGF0ZS5oZWlnaHQgLSAxMjAsIDE2MCk7XG4gICAgICAvLyBtYXggNjUlIG9mIGNhbnZhcyBoZWlnaHQsIGNsYW1wZWQgdG8gPDMwMHB4LCB2aCAtIDEyMHB4PlxuICAgICAgY29uc3QgbWF4SGVpZ2h0ID0gTWF0aC5taW4oXG4gICAgICAgIG1pbkhlaWdodCxcbiAgICAgICAgTWF0aC5mbG9vcih0aGlzLnN0YXRlLmhlaWdodCAqIDAuNSkgLyB0aGlzLnN0YXRlLnpvb20udmFsdWUsXG4gICAgICApO1xuXG4gICAgICBjb25zdCBoZWlnaHQgPSBNYXRoLm1pbihpbWFnZS5uYXR1cmFsSGVpZ2h0LCBtYXhIZWlnaHQpO1xuICAgICAgY29uc3Qgd2lkdGggPSBoZWlnaHQgKiAoaW1hZ2UubmF0dXJhbFdpZHRoIC8gaW1hZ2UubmF0dXJhbEhlaWdodCk7XG5cbiAgICAgIC8vIGFkZCBjdXJyZW50IGltYWdlRWxlbWVudCB3aWR0aC9oZWlnaHQgdG8gYWNjb3VudCBmb3IgcHJldmlvdXMgY2VudGVyaW5nXG4gICAgICAvLyBvZiB0aGUgcGxhY2Vob2xkZXIgaW1hZ2VcbiAgICAgIGNvbnN0IHggPSBpbWFnZUVsZW1lbnQueCArIGltYWdlRWxlbWVudC53aWR0aCAvIDIgLSB3aWR0aCAvIDI7XG4gICAgICBjb25zdCB5ID0gaW1hZ2VFbGVtZW50LnkgKyBpbWFnZUVsZW1lbnQuaGVpZ2h0IC8gMiAtIGhlaWdodCAvIDI7XG5cbiAgICAgIG11dGF0ZUVsZW1lbnQoaW1hZ2VFbGVtZW50LCB7IHgsIHksIHdpZHRoLCBoZWlnaHQgfSk7XG4gICAgfVxuICB9O1xuXG4gIC8qKiB1cGRhdGVzIGltYWdlIGNhY2hlLCByZWZyZXNoaW5nIHVwZGF0ZWQgZWxlbWVudHMgYW5kL29yIHNldHRpbmcgc3RhdHVzXG4gICAgICB0byBlcnJvciBmb3IgaW1hZ2VzIHRoYXQgZmFpbCBkdXJpbmcgPGltZz4gZWxlbWVudCBjcmVhdGlvbiAqL1xuICBwcml2YXRlIHVwZGF0ZUltYWdlQ2FjaGUgPSBhc3luYyAoXG4gICAgZWxlbWVudHM6IHJlYWRvbmx5IEluaXRpYWxpemVkRXhjYWxpZHJhd0ltYWdlRWxlbWVudFtdLFxuICAgIGZpbGVzID0gdGhpcy5maWxlcyxcbiAgKSA9PiB7XG4gICAgY29uc3QgeyB1cGRhdGVkRmlsZXMsIGVycm9yZWRGaWxlcyB9ID0gYXdhaXQgX3VwZGF0ZUltYWdlQ2FjaGUoe1xuICAgICAgaW1hZ2VDYWNoZTogdGhpcy5pbWFnZUNhY2hlLFxuICAgICAgZmlsZUlkczogZWxlbWVudHMubWFwKChlbGVtZW50KSA9PiBlbGVtZW50LmZpbGVJZCksXG4gICAgICBmaWxlcyxcbiAgICB9KTtcbiAgICBpZiAodXBkYXRlZEZpbGVzLnNpemUgfHwgZXJyb3JlZEZpbGVzLnNpemUpIHtcbiAgICAgIGZvciAoY29uc3QgZWxlbWVudCBvZiBlbGVtZW50cykge1xuICAgICAgICBpZiAodXBkYXRlZEZpbGVzLmhhcyhlbGVtZW50LmZpbGVJZCkpIHtcbiAgICAgICAgICBpbnZhbGlkYXRlU2hhcGVGb3JFbGVtZW50KGVsZW1lbnQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChlcnJvcmVkRmlsZXMuc2l6ZSkge1xuICAgICAgdGhpcy5zY2VuZS5yZXBsYWNlQWxsRWxlbWVudHMoXG4gICAgICAgIHRoaXMuc2NlbmUuZ2V0RWxlbWVudHNJbmNsdWRpbmdEZWxldGVkKCkubWFwKChlbGVtZW50KSA9PiB7XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgaXNJbml0aWFsaXplZEltYWdlRWxlbWVudChlbGVtZW50KSAmJlxuICAgICAgICAgICAgZXJyb3JlZEZpbGVzLmhhcyhlbGVtZW50LmZpbGVJZClcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIHJldHVybiBuZXdFbGVtZW50V2l0aChlbGVtZW50LCB7XG4gICAgICAgICAgICAgIHN0YXR1czogXCJlcnJvclwiLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBlbGVtZW50O1xuICAgICAgICB9KSxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgdXBkYXRlZEZpbGVzLCBlcnJvcmVkRmlsZXMgfTtcbiAgfTtcblxuICAvKiogYWRkcyBuZXcgaW1hZ2VzIHRvIGltYWdlQ2FjaGUgYW5kIHJlLXJlbmRlcnMgaWYgbmVlZGVkICovXG4gIHByaXZhdGUgYWRkTmV3SW1hZ2VzVG9JbWFnZUNhY2hlID0gYXN5bmMgKFxuICAgIGltYWdlRWxlbWVudHM6IEluaXRpYWxpemVkRXhjYWxpZHJhd0ltYWdlRWxlbWVudFtdID0gZ2V0SW5pdGlhbGl6ZWRJbWFnZUVsZW1lbnRzKFxuICAgICAgdGhpcy5zY2VuZS5nZXROb25EZWxldGVkRWxlbWVudHMoKSxcbiAgICApLFxuICAgIGZpbGVzOiBCaW5hcnlGaWxlcyA9IHRoaXMuZmlsZXMsXG4gICkgPT4ge1xuICAgIGNvbnN0IHVuY2FjaGVkSW1hZ2VFbGVtZW50cyA9IGltYWdlRWxlbWVudHMuZmlsdGVyKFxuICAgICAgKGVsZW1lbnQpID0+ICFlbGVtZW50LmlzRGVsZXRlZCAmJiAhdGhpcy5pbWFnZUNhY2hlLmhhcyhlbGVtZW50LmZpbGVJZCksXG4gICAgKTtcblxuICAgIGlmICh1bmNhY2hlZEltYWdlRWxlbWVudHMubGVuZ3RoKSB7XG4gICAgICBjb25zdCB7IHVwZGF0ZWRGaWxlcyB9ID0gYXdhaXQgdGhpcy51cGRhdGVJbWFnZUNhY2hlKFxuICAgICAgICB1bmNhY2hlZEltYWdlRWxlbWVudHMsXG4gICAgICAgIGZpbGVzLFxuICAgICAgKTtcbiAgICAgIGlmICh1cGRhdGVkRmlsZXMuc2l6ZSkge1xuICAgICAgICB0aGlzLnNjZW5lLmluZm9ybU11dGF0aW9uKCk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIC8qKiBnZW5lcmFsbHkgeW91IHNob3VsZCB1c2UgYGFkZE5ld0ltYWdlc1RvSW1hZ2VDYWNoZSgpYCBkaXJlY3RseSBpZiB5b3UgbmVlZFxuICAgKiAgdG8gcmVuZGVyIG5ldyBpbWFnZXMuIFRoaXMgaXMganVzdCBhIGZhaWxzYWZlICAqL1xuICBwcml2YXRlIHNjaGVkdWxlSW1hZ2VSZWZyZXNoID0gdGhyb3R0bGUoKCkgPT4ge1xuICAgIHRoaXMuYWRkTmV3SW1hZ2VzVG9JbWFnZUNhY2hlKCk7XG4gIH0sIElNQUdFX1JFTkRFUl9USU1FT1VUKTtcblxuICBwcml2YXRlIHVwZGF0ZUJpbmRpbmdFbmFibGVkT25Qb2ludGVyTW92ZSA9IChcbiAgICBldmVudDogUmVhY3QuUG9pbnRlckV2ZW50PEhUTUxDYW52YXNFbGVtZW50PixcbiAgKSA9PiB7XG4gICAgY29uc3Qgc2hvdWxkRW5hYmxlQmluZGluZyA9IHNob3VsZEVuYWJsZUJpbmRpbmdGb3JQb2ludGVyRXZlbnQoZXZlbnQpO1xuICAgIGlmICh0aGlzLnN0YXRlLmlzQmluZGluZ0VuYWJsZWQgIT09IHNob3VsZEVuYWJsZUJpbmRpbmcpIHtcbiAgICAgIHRoaXMuc2V0U3RhdGUoeyBpc0JpbmRpbmdFbmFibGVkOiBzaG91bGRFbmFibGVCaW5kaW5nIH0pO1xuICAgIH1cbiAgfTtcblxuICBwcml2YXRlIG1heWJlU3VnZ2VzdEJpbmRpbmdBdEN1cnNvciA9IChwb2ludGVyQ29vcmRzOiB7XG4gICAgeDogbnVtYmVyO1xuICAgIHk6IG51bWJlcjtcbiAgfSk6IHZvaWQgPT4ge1xuICAgIGNvbnN0IGhvdmVyZWRCaW5kYWJsZUVsZW1lbnQgPSBnZXRIb3ZlcmVkRWxlbWVudEZvckJpbmRpbmcoXG4gICAgICBwb2ludGVyQ29vcmRzLFxuICAgICAgdGhpcy5zY2VuZSxcbiAgICApO1xuICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgc3VnZ2VzdGVkQmluZGluZ3M6XG4gICAgICAgIGhvdmVyZWRCaW5kYWJsZUVsZW1lbnQgIT0gbnVsbCA/IFtob3ZlcmVkQmluZGFibGVFbGVtZW50XSA6IFtdLFxuICAgIH0pO1xuICB9O1xuXG4gIHByaXZhdGUgbWF5YmVTdWdnZXN0QmluZGluZ3NGb3JMaW5lYXJFbGVtZW50QXRDb29yZHMgPSAoXG4gICAgbGluZWFyRWxlbWVudDogTm9uRGVsZXRlZDxFeGNhbGlkcmF3TGluZWFyRWxlbWVudD4sXG4gICAgLyoqIHNjZW5lIGNvb3JkcyAqL1xuICAgIHBvaW50ZXJDb29yZHM6IHtcbiAgICAgIHg6IG51bWJlcjtcbiAgICAgIHk6IG51bWJlcjtcbiAgICB9W10sXG4gICAgLy8gRHVyaW5nIGxpbmUgY3JlYXRpb24gdGhlIHN0YXJ0IGJpbmRpbmcgaGFzbid0IGJlZW4gd3JpdHRlbiB5ZXRcbiAgICAvLyBpbnRvIGBsaW5lYXJFbGVtZW50YFxuICAgIG9wcG9zaXRlQmluZGluZ0JvdW5kRWxlbWVudD86IEV4Y2FsaWRyYXdCaW5kYWJsZUVsZW1lbnQgfCBudWxsLFxuICApOiB2b2lkID0+IHtcbiAgICBpZiAoIXBvaW50ZXJDb29yZHMubGVuZ3RoKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgc3VnZ2VzdGVkQmluZGluZ3MgPSBwb2ludGVyQ29vcmRzLnJlZHVjZShcbiAgICAgIChhY2M6IE5vbkRlbGV0ZWQ8RXhjYWxpZHJhd0JpbmRhYmxlRWxlbWVudD5bXSwgY29vcmRzKSA9PiB7XG4gICAgICAgIGNvbnN0IGhvdmVyZWRCaW5kYWJsZUVsZW1lbnQgPSBnZXRIb3ZlcmVkRWxlbWVudEZvckJpbmRpbmcoXG4gICAgICAgICAgY29vcmRzLFxuICAgICAgICAgIHRoaXMuc2NlbmUsXG4gICAgICAgICk7XG4gICAgICAgIGlmIChcbiAgICAgICAgICBob3ZlcmVkQmluZGFibGVFbGVtZW50ICE9IG51bGwgJiZcbiAgICAgICAgICAhaXNMaW5lYXJFbGVtZW50U2ltcGxlQW5kQWxyZWFkeUJvdW5kKFxuICAgICAgICAgICAgbGluZWFyRWxlbWVudCxcbiAgICAgICAgICAgIG9wcG9zaXRlQmluZGluZ0JvdW5kRWxlbWVudD8uaWQsXG4gICAgICAgICAgICBob3ZlcmVkQmluZGFibGVFbGVtZW50LFxuICAgICAgICAgIClcbiAgICAgICAgKSB7XG4gICAgICAgICAgYWNjLnB1c2goaG92ZXJlZEJpbmRhYmxlRWxlbWVudCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGFjYztcbiAgICAgIH0sXG4gICAgICBbXSxcbiAgICApO1xuXG4gICAgdGhpcy5zZXRTdGF0ZSh7IHN1Z2dlc3RlZEJpbmRpbmdzIH0pO1xuICB9O1xuXG4gIHByaXZhdGUgbWF5YmVTdWdnZXN0QmluZGluZ0ZvckFsbChcbiAgICBzZWxlY3RlZEVsZW1lbnRzOiBOb25EZWxldGVkPEV4Y2FsaWRyYXdFbGVtZW50PltdLFxuICApOiB2b2lkIHtcbiAgICBjb25zdCBzdWdnZXN0ZWRCaW5kaW5ncyA9IGdldEVsaWdpYmxlRWxlbWVudHNGb3JCaW5kaW5nKHNlbGVjdGVkRWxlbWVudHMpO1xuICAgIHRoaXMuc2V0U3RhdGUoeyBzdWdnZXN0ZWRCaW5kaW5ncyB9KTtcbiAgfVxuXG4gIHByaXZhdGUgY2xlYXJTZWxlY3Rpb24oaGl0RWxlbWVudDogRXhjYWxpZHJhd0VsZW1lbnQgfCBudWxsKTogdm9pZCB7XG4gICAgdGhpcy5zZXRTdGF0ZSgocHJldlN0YXRlKSA9PiAoe1xuICAgICAgc2VsZWN0ZWRFbGVtZW50SWRzOiB7fSxcbiAgICAgIHNlbGVjdGVkR3JvdXBJZHM6IHt9LFxuICAgICAgLy8gQ29udGludWUgZWRpdGluZyB0aGUgc2FtZSBncm91cCBpZiB0aGUgdXNlciBzZWxlY3RlZCBhIGRpZmZlcmVudFxuICAgICAgLy8gZWxlbWVudCBmcm9tIGl0XG4gICAgICBlZGl0aW5nR3JvdXBJZDpcbiAgICAgICAgcHJldlN0YXRlLmVkaXRpbmdHcm91cElkICYmXG4gICAgICAgIGhpdEVsZW1lbnQgIT0gbnVsbCAmJlxuICAgICAgICBpc0VsZW1lbnRJbkdyb3VwKGhpdEVsZW1lbnQsIHByZXZTdGF0ZS5lZGl0aW5nR3JvdXBJZClcbiAgICAgICAgICA/IHByZXZTdGF0ZS5lZGl0aW5nR3JvdXBJZFxuICAgICAgICAgIDogbnVsbCxcbiAgICB9KSk7XG4gICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICBzZWxlY3RlZEVsZW1lbnRJZHM6IHt9LFxuICAgICAgcHJldmlvdXNTZWxlY3RlZEVsZW1lbnRJZHM6IHRoaXMuc3RhdGUuc2VsZWN0ZWRFbGVtZW50SWRzLFxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVDYW52YXNSZWYgPSAoY2FudmFzOiBIVE1MQ2FudmFzRWxlbWVudCkgPT4ge1xuICAgIC8vIGNhbnZhcyBpcyBudWxsIHdoZW4gdW5tb3VudGluZ1xuICAgIGlmIChjYW52YXMgIT09IG51bGwpIHtcbiAgICAgIHRoaXMuY2FudmFzID0gY2FudmFzO1xuICAgICAgdGhpcy5yYyA9IHJvdWdoLmNhbnZhcyh0aGlzLmNhbnZhcyk7XG5cbiAgICAgIHRoaXMuY2FudmFzLmFkZEV2ZW50TGlzdGVuZXIoRVZFTlQuV0hFRUwsIHRoaXMuaGFuZGxlV2hlZWwsIHtcbiAgICAgICAgcGFzc2l2ZTogZmFsc2UsXG4gICAgICB9KTtcbiAgICAgIHRoaXMuY2FudmFzLmFkZEV2ZW50TGlzdGVuZXIoRVZFTlQuVE9VQ0hfU1RBUlQsIHRoaXMub25UYXBTdGFydCk7XG4gICAgICB0aGlzLmNhbnZhcy5hZGRFdmVudExpc3RlbmVyKEVWRU5ULlRPVUNIX0VORCwgdGhpcy5vblRhcEVuZCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuY2FudmFzPy5yZW1vdmVFdmVudExpc3RlbmVyKEVWRU5ULldIRUVMLCB0aGlzLmhhbmRsZVdoZWVsKTtcbiAgICAgIHRoaXMuY2FudmFzPy5yZW1vdmVFdmVudExpc3RlbmVyKEVWRU5ULlRPVUNIX1NUQVJULCB0aGlzLm9uVGFwU3RhcnQpO1xuICAgICAgdGhpcy5jYW52YXM/LnJlbW92ZUV2ZW50TGlzdGVuZXIoRVZFTlQuVE9VQ0hfRU5ELCB0aGlzLm9uVGFwRW5kKTtcbiAgICB9XG4gIH07XG5cbiAgcHJpdmF0ZSBoYW5kbGVBcHBPbkRyb3AgPSBhc3luYyAoZXZlbnQ6IFJlYWN0LkRyYWdFdmVudDxIVE1MRGl2RWxlbWVudD4pID0+IHtcbiAgICAvLyBtdXN0IGJlIHJldHJpZXZlZCBmaXJzdCwgaW4gdGhlIHNhbWUgZnJhbWVcbiAgICBjb25zdCB7IGZpbGUsIGZpbGVIYW5kbGUgfSA9IGF3YWl0IGdldEZpbGVGcm9tRXZlbnQoZXZlbnQpO1xuXG4gICAgdHJ5IHtcbiAgICAgIGlmIChpc1N1cHBvcnRlZEltYWdlRmlsZShmaWxlKSkge1xuICAgICAgICAvLyBmaXJzdCBhdHRlbXB0IHRvIGRlY29kZSBzY2VuZSBmcm9tIHRoZSBpbWFnZSBpZiBpdCdzIGVtYmVkZGVkXG4gICAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4gICAgICAgIGlmIChmaWxlPy50eXBlID09PSBNSU1FX1RZUEVTLnBuZyB8fCBmaWxlPy50eXBlID09PSBNSU1FX1RZUEVTLnN2Zykge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBzY2VuZSA9IGF3YWl0IGxvYWRGcm9tQmxvYihcbiAgICAgICAgICAgICAgZmlsZSxcbiAgICAgICAgICAgICAgdGhpcy5zdGF0ZSxcbiAgICAgICAgICAgICAgdGhpcy5zY2VuZS5nZXRFbGVtZW50c0luY2x1ZGluZ0RlbGV0ZWQoKSxcbiAgICAgICAgICAgICAgZmlsZUhhbmRsZSxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICB0aGlzLnN5bmNBY3Rpb25SZXN1bHQoe1xuICAgICAgICAgICAgICAuLi5zY2VuZSxcbiAgICAgICAgICAgICAgYXBwU3RhdGU6IHtcbiAgICAgICAgICAgICAgICAuLi4oc2NlbmUuYXBwU3RhdGUgfHwgdGhpcy5zdGF0ZSksXG4gICAgICAgICAgICAgICAgaXNMb2FkaW5nOiBmYWxzZSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgcmVwbGFjZUZpbGVzOiB0cnVlLFxuICAgICAgICAgICAgICBjb21taXRUb0hpc3Rvcnk6IHRydWUsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICAgICAgICBpZiAoZXJyb3IubmFtZSAhPT0gXCJFbmNvZGluZ0Vycm9yXCIpIHtcbiAgICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gaWYgbm8gc2NlbmUgaXMgZW1iZWRkZWQgb3Igd2UgZmFpbCBmb3Igd2hhdGV2ZXIgcmVhc29uLCBmYWxsIGJhY2tcbiAgICAgICAgLy8gdG8gaW1wb3J0aW5nIGFzIHJlZ3VsYXIgaW1hZ2VcbiAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbiAgICAgICAgY29uc3QgeyB4OiBzY2VuZVgsIHk6IHNjZW5lWSB9ID0gdmlld3BvcnRDb29yZHNUb1NjZW5lQ29vcmRzKFxuICAgICAgICAgIGV2ZW50LFxuICAgICAgICAgIHRoaXMuc3RhdGUsXG4gICAgICAgICk7XG5cbiAgICAgICAgY29uc3QgaW1hZ2VFbGVtZW50ID0gdGhpcy5jcmVhdGVJbWFnZUVsZW1lbnQoeyBzY2VuZVgsIHNjZW5lWSB9KTtcbiAgICAgICAgdGhpcy5pbnNlcnRJbWFnZUVsZW1lbnQoaW1hZ2VFbGVtZW50LCBmaWxlKTtcbiAgICAgICAgdGhpcy5pbml0aWFsaXplSW1hZ2VEaW1lbnNpb25zKGltYWdlRWxlbWVudCk7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoeyBzZWxlY3RlZEVsZW1lbnRJZHM6IHsgW2ltYWdlRWxlbWVudC5pZF06IHRydWUgfSB9KTtcblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgcmV0dXJuIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICBpc0xvYWRpbmc6IGZhbHNlLFxuICAgICAgICBlcnJvck1lc3NhZ2U6IGVycm9yLm1lc3NhZ2UsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBjb25zdCBsaWJyYXJ5SlNPTiA9IGV2ZW50LmRhdGFUcmFuc2Zlci5nZXREYXRhKE1JTUVfVFlQRVMuZXhjYWxpZHJhd2xpYik7XG4gICAgaWYgKGxpYnJhcnlKU09OICYmIHR5cGVvZiBsaWJyYXJ5SlNPTiA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgbGlicmFyeUl0ZW1zID0gcGFyc2VMaWJyYXJ5SlNPTihsaWJyYXJ5SlNPTik7XG4gICAgICAgIHRoaXMuYWRkRWxlbWVudHNGcm9tUGFzdGVPckxpYnJhcnkoe1xuICAgICAgICAgIGVsZW1lbnRzOiBkaXN0cmlidXRlTGlicmFyeUl0ZW1zT25TcXVhcmVHcmlkKGxpYnJhcnlJdGVtcyksXG4gICAgICAgICAgcG9zaXRpb246IGV2ZW50LFxuICAgICAgICAgIGZpbGVzOiBudWxsLFxuICAgICAgICB9KTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7IGVycm9yTWVzc2FnZTogZXJyb3IubWVzc2FnZSB9KTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoZmlsZSkge1xuICAgICAgLy8gYXRldG1wdCB0byBwYXJzZSBhbiBleGNhbGlkcmF3L2V4Y2FsaWRyYXdsaWIgZmlsZVxuICAgICAgYXdhaXQgdGhpcy5sb2FkRmlsZVRvQ2FudmFzKGZpbGUsIGZpbGVIYW5kbGUpO1xuICAgIH1cbiAgfTtcblxuICBsb2FkRmlsZVRvQ2FudmFzID0gYXN5bmMgKFxuICAgIGZpbGU6IEZpbGUsXG4gICAgZmlsZUhhbmRsZTogRmlsZVN5c3RlbUhhbmRsZSB8IG51bGwsXG4gICkgPT4ge1xuICAgIGZpbGUgPSBhd2FpdCBub3JtYWxpemVGaWxlKGZpbGUpO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXQgPSBhd2FpdCBsb2FkU2NlbmVPckxpYnJhcnlGcm9tQmxvYihcbiAgICAgICAgZmlsZSxcbiAgICAgICAgdGhpcy5zdGF0ZSxcbiAgICAgICAgdGhpcy5zY2VuZS5nZXRFbGVtZW50c0luY2x1ZGluZ0RlbGV0ZWQoKSxcbiAgICAgICAgZmlsZUhhbmRsZSxcbiAgICAgICk7XG4gICAgICBpZiAocmV0LnR5cGUgPT09IE1JTUVfVFlQRVMuZXhjYWxpZHJhdykge1xuICAgICAgICB0aGlzLnNldFN0YXRlKHsgaXNMb2FkaW5nOiB0cnVlIH0pO1xuICAgICAgICB0aGlzLnN5bmNBY3Rpb25SZXN1bHQoe1xuICAgICAgICAgIC4uLnJldC5kYXRhLFxuICAgICAgICAgIGFwcFN0YXRlOiB7XG4gICAgICAgICAgICAuLi4ocmV0LmRhdGEuYXBwU3RhdGUgfHwgdGhpcy5zdGF0ZSksXG4gICAgICAgICAgICBpc0xvYWRpbmc6IGZhbHNlLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgcmVwbGFjZUZpbGVzOiB0cnVlLFxuICAgICAgICAgIGNvbW1pdFRvSGlzdG9yeTogdHJ1ZSxcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2UgaWYgKHJldC50eXBlID09PSBNSU1FX1RZUEVTLmV4Y2FsaWRyYXdsaWIpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5saWJyYXJ5XG4gICAgICAgICAgLnVwZGF0ZUxpYnJhcnkoe1xuICAgICAgICAgICAgbGlicmFyeUl0ZW1zOiBmaWxlLFxuICAgICAgICAgICAgbWVyZ2U6IHRydWUsXG4gICAgICAgICAgICBvcGVuTGlicmFyeU1lbnU6IHRydWUsXG4gICAgICAgICAgfSlcbiAgICAgICAgICAuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcbiAgICAgICAgICAgIHRoaXMuc2V0U3RhdGUoeyBlcnJvck1lc3NhZ2U6IHQoXCJlcnJvcnMuaW1wb3J0TGlicmFyeUVycm9yXCIpIH0pO1xuICAgICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgIHRoaXMuc2V0U3RhdGUoeyBpc0xvYWRpbmc6IGZhbHNlLCBlcnJvck1lc3NhZ2U6IGVycm9yLm1lc3NhZ2UgfSk7XG4gICAgfVxuICB9O1xuXG4gIHByaXZhdGUgaGFuZGxlQ2FudmFzQ29udGV4dE1lbnUgPSAoXG4gICAgZXZlbnQ6IFJlYWN0LlBvaW50ZXJFdmVudDxIVE1MQ2FudmFzRWxlbWVudD4sXG4gICkgPT4ge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICBpZiAoXG4gICAgICAoZXZlbnQubmF0aXZlRXZlbnQucG9pbnRlclR5cGUgPT09IFwidG91Y2hcIiB8fFxuICAgICAgICAoZXZlbnQubmF0aXZlRXZlbnQucG9pbnRlclR5cGUgPT09IFwicGVuXCIgJiZcbiAgICAgICAgICAvLyBhbHdheXMgYWxsb3cgaWYgdXNlciB1c2VzIGEgcGVuIHNlY29uZGFyeSBidXR0b25cbiAgICAgICAgICBldmVudC5idXR0b24gIT09IFBPSU5URVJfQlVUVE9OLlNFQ09OREFSWSkpICYmXG4gICAgICB0aGlzLnN0YXRlLmFjdGl2ZVRvb2wudHlwZSAhPT0gXCJzZWxlY3Rpb25cIlxuICAgICkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHsgeCwgeSB9ID0gdmlld3BvcnRDb29yZHNUb1NjZW5lQ29vcmRzKGV2ZW50LCB0aGlzLnN0YXRlKTtcbiAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5nZXRFbGVtZW50QXRQb3NpdGlvbih4LCB5LCB7XG4gICAgICBwcmVmZXJTZWxlY3RlZDogdHJ1ZSxcbiAgICAgIGluY2x1ZGVMb2NrZWRFbGVtZW50czogdHJ1ZSxcbiAgICB9KTtcblxuICAgIGNvbnN0IHR5cGUgPSBlbGVtZW50ID8gXCJlbGVtZW50XCIgOiBcImNhbnZhc1wiO1xuXG4gICAgY29uc3QgY29udGFpbmVyID0gdGhpcy5leGNhbGlkcmF3Q29udGFpbmVyUmVmLmN1cnJlbnQhO1xuICAgIGNvbnN0IHsgdG9wOiBvZmZzZXRUb3AsIGxlZnQ6IG9mZnNldExlZnQgfSA9XG4gICAgICBjb250YWluZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgY29uc3QgbGVmdCA9IGV2ZW50LmNsaWVudFggLSBvZmZzZXRMZWZ0O1xuICAgIGNvbnN0IHRvcCA9IGV2ZW50LmNsaWVudFkgLSBvZmZzZXRUb3A7XG5cbiAgICBpZiAoZWxlbWVudCAmJiAhdGhpcy5zdGF0ZS5zZWxlY3RlZEVsZW1lbnRJZHNbZWxlbWVudC5pZF0pIHtcbiAgICAgIHRoaXMuc2V0U3RhdGUoXG4gICAgICAgIHNlbGVjdEdyb3Vwc0ZvclNlbGVjdGVkRWxlbWVudHMoXG4gICAgICAgICAge1xuICAgICAgICAgICAgLi4udGhpcy5zdGF0ZSxcbiAgICAgICAgICAgIHNlbGVjdGVkRWxlbWVudElkczogeyBbZWxlbWVudC5pZF06IHRydWUgfSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHRoaXMuc2NlbmUuZ2V0Tm9uRGVsZXRlZEVsZW1lbnRzKCksXG4gICAgICAgICksXG4gICAgICAgICgpID0+IHtcbiAgICAgICAgICB0aGlzLl9vcGVuQ29udGV4dE1lbnUoeyB0b3AsIGxlZnQgfSwgdHlwZSk7XG4gICAgICAgIH0sXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9vcGVuQ29udGV4dE1lbnUoeyB0b3AsIGxlZnQgfSwgdHlwZSk7XG4gICAgfVxuICB9O1xuXG4gIHByaXZhdGUgbWF5YmVEcmFnTmV3R2VuZXJpY0VsZW1lbnQgPSAoXG4gICAgcG9pbnRlckRvd25TdGF0ZTogUG9pbnRlckRvd25TdGF0ZSxcbiAgICBldmVudDogTW91c2VFdmVudCB8IEtleWJvYXJkRXZlbnQsXG4gICk6IHZvaWQgPT4ge1xuICAgIGNvbnN0IGRyYWdnaW5nRWxlbWVudCA9IHRoaXMuc3RhdGUuZHJhZ2dpbmdFbGVtZW50O1xuICAgIGNvbnN0IHBvaW50ZXJDb29yZHMgPSBwb2ludGVyRG93blN0YXRlLmxhc3RDb29yZHM7XG4gICAgaWYgKCFkcmFnZ2luZ0VsZW1lbnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKFxuICAgICAgZHJhZ2dpbmdFbGVtZW50LnR5cGUgPT09IFwic2VsZWN0aW9uXCIgJiZcbiAgICAgIHRoaXMuc3RhdGUuYWN0aXZlVG9vbC50eXBlICE9PSBcImVyYXNlclwiXG4gICAgKSB7XG4gICAgICBkcmFnTmV3RWxlbWVudChcbiAgICAgICAgZHJhZ2dpbmdFbGVtZW50LFxuICAgICAgICB0aGlzLnN0YXRlLmFjdGl2ZVRvb2wudHlwZSxcbiAgICAgICAgcG9pbnRlckRvd25TdGF0ZS5vcmlnaW4ueCxcbiAgICAgICAgcG9pbnRlckRvd25TdGF0ZS5vcmlnaW4ueSxcbiAgICAgICAgcG9pbnRlckNvb3Jkcy54LFxuICAgICAgICBwb2ludGVyQ29vcmRzLnksXG4gICAgICAgIGRpc3RhbmNlKHBvaW50ZXJEb3duU3RhdGUub3JpZ2luLngsIHBvaW50ZXJDb29yZHMueCksXG4gICAgICAgIGRpc3RhbmNlKHBvaW50ZXJEb3duU3RhdGUub3JpZ2luLnksIHBvaW50ZXJDb29yZHMueSksXG4gICAgICAgIHNob3VsZE1haW50YWluQXNwZWN0UmF0aW8oZXZlbnQpLFxuICAgICAgICBzaG91bGRSZXNpemVGcm9tQ2VudGVyKGV2ZW50KSxcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IFtncmlkWCwgZ3JpZFldID0gZ2V0R3JpZFBvaW50KFxuICAgICAgICBwb2ludGVyQ29vcmRzLngsXG4gICAgICAgIHBvaW50ZXJDb29yZHMueSxcbiAgICAgICAgdGhpcy5zdGF0ZS5ncmlkU2l6ZSxcbiAgICAgICk7XG5cbiAgICAgIGNvbnN0IGltYWdlID1cbiAgICAgICAgaXNJbml0aWFsaXplZEltYWdlRWxlbWVudChkcmFnZ2luZ0VsZW1lbnQpICYmXG4gICAgICAgIHRoaXMuaW1hZ2VDYWNoZS5nZXQoZHJhZ2dpbmdFbGVtZW50LmZpbGVJZCk/LmltYWdlO1xuICAgICAgY29uc3QgYXNwZWN0UmF0aW8gPVxuICAgICAgICBpbWFnZSAmJiAhKGltYWdlIGluc3RhbmNlb2YgUHJvbWlzZSlcbiAgICAgICAgICA/IGltYWdlLndpZHRoIC8gaW1hZ2UuaGVpZ2h0XG4gICAgICAgICAgOiBudWxsO1xuXG4gICAgICBkcmFnTmV3RWxlbWVudChcbiAgICAgICAgZHJhZ2dpbmdFbGVtZW50LFxuICAgICAgICB0aGlzLnN0YXRlLmFjdGl2ZVRvb2wudHlwZSxcbiAgICAgICAgcG9pbnRlckRvd25TdGF0ZS5vcmlnaW5JbkdyaWQueCxcbiAgICAgICAgcG9pbnRlckRvd25TdGF0ZS5vcmlnaW5JbkdyaWQueSxcbiAgICAgICAgZ3JpZFgsXG4gICAgICAgIGdyaWRZLFxuICAgICAgICBkaXN0YW5jZShwb2ludGVyRG93blN0YXRlLm9yaWdpbkluR3JpZC54LCBncmlkWCksXG4gICAgICAgIGRpc3RhbmNlKHBvaW50ZXJEb3duU3RhdGUub3JpZ2luSW5HcmlkLnksIGdyaWRZKSxcbiAgICAgICAgaXNJbWFnZUVsZW1lbnQoZHJhZ2dpbmdFbGVtZW50KVxuICAgICAgICAgID8gIXNob3VsZE1haW50YWluQXNwZWN0UmF0aW8oZXZlbnQpXG4gICAgICAgICAgOiBzaG91bGRNYWludGFpbkFzcGVjdFJhdGlvKGV2ZW50KSxcbiAgICAgICAgc2hvdWxkUmVzaXplRnJvbUNlbnRlcihldmVudCksXG4gICAgICAgIGFzcGVjdFJhdGlvLFxuICAgICAgKTtcblxuICAgICAgdGhpcy5tYXliZVN1Z2dlc3RCaW5kaW5nRm9yQWxsKFtkcmFnZ2luZ0VsZW1lbnRdKTtcbiAgICB9XG4gIH07XG5cbiAgcHJpdmF0ZSBtYXliZUhhbmRsZVJlc2l6ZSA9IChcbiAgICBwb2ludGVyRG93blN0YXRlOiBQb2ludGVyRG93blN0YXRlLFxuICAgIGV2ZW50OiBNb3VzZUV2ZW50IHwgS2V5Ym9hcmRFdmVudCxcbiAgKTogYm9vbGVhbiA9PiB7XG4gICAgY29uc3Qgc2VsZWN0ZWRFbGVtZW50cyA9IGdldFNlbGVjdGVkRWxlbWVudHMoXG4gICAgICB0aGlzLnNjZW5lLmdldE5vbkRlbGV0ZWRFbGVtZW50cygpLFxuICAgICAgdGhpcy5zdGF0ZSxcbiAgICApO1xuICAgIGNvbnN0IHRyYW5zZm9ybUhhbmRsZVR5cGUgPSBwb2ludGVyRG93blN0YXRlLnJlc2l6ZS5oYW5kbGVUeXBlO1xuICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgLy8gVE9ETzogcmVuYW1lIHRoaXMgc3RhdGUgZmllbGQgdG8gXCJpc1NjYWxpbmdcIiB0byBkaXN0aW5ndWlzaFxuICAgICAgLy8gaXQgZnJvbSB0aGUgZ2VuZXJpYyBcImlzUmVzaXppbmdcIiB3aGljaCBpbmNsdWRlcyBzY2FsaW5nIGFuZFxuICAgICAgLy8gcm90YXRpbmdcbiAgICAgIGlzUmVzaXppbmc6IHRyYW5zZm9ybUhhbmRsZVR5cGUgJiYgdHJhbnNmb3JtSGFuZGxlVHlwZSAhPT0gXCJyb3RhdGlvblwiLFxuICAgICAgaXNSb3RhdGluZzogdHJhbnNmb3JtSGFuZGxlVHlwZSA9PT0gXCJyb3RhdGlvblwiLFxuICAgIH0pO1xuICAgIGNvbnN0IHBvaW50ZXJDb29yZHMgPSBwb2ludGVyRG93blN0YXRlLmxhc3RDb29yZHM7XG4gICAgY29uc3QgW3Jlc2l6ZVgsIHJlc2l6ZVldID0gZ2V0R3JpZFBvaW50KFxuICAgICAgcG9pbnRlckNvb3Jkcy54IC0gcG9pbnRlckRvd25TdGF0ZS5yZXNpemUub2Zmc2V0LngsXG4gICAgICBwb2ludGVyQ29vcmRzLnkgLSBwb2ludGVyRG93blN0YXRlLnJlc2l6ZS5vZmZzZXQueSxcbiAgICAgIHRoaXMuc3RhdGUuZ3JpZFNpemUsXG4gICAgKTtcbiAgICBpZiAoXG4gICAgICB0cmFuc2Zvcm1FbGVtZW50cyhcbiAgICAgICAgcG9pbnRlckRvd25TdGF0ZSxcbiAgICAgICAgdHJhbnNmb3JtSGFuZGxlVHlwZSxcbiAgICAgICAgc2VsZWN0ZWRFbGVtZW50cyxcbiAgICAgICAgcG9pbnRlckRvd25TdGF0ZS5yZXNpemUuYXJyb3dEaXJlY3Rpb24sXG4gICAgICAgIHNob3VsZFJvdGF0ZVdpdGhEaXNjcmV0ZUFuZ2xlKGV2ZW50KSxcbiAgICAgICAgc2hvdWxkUmVzaXplRnJvbUNlbnRlcihldmVudCksXG4gICAgICAgIHNlbGVjdGVkRWxlbWVudHMubGVuZ3RoID09PSAxICYmIGlzSW1hZ2VFbGVtZW50KHNlbGVjdGVkRWxlbWVudHNbMF0pXG4gICAgICAgICAgPyAhc2hvdWxkTWFpbnRhaW5Bc3BlY3RSYXRpbyhldmVudClcbiAgICAgICAgICA6IHNob3VsZE1haW50YWluQXNwZWN0UmF0aW8oZXZlbnQpLFxuICAgICAgICByZXNpemVYLFxuICAgICAgICByZXNpemVZLFxuICAgICAgICBwb2ludGVyRG93blN0YXRlLnJlc2l6ZS5jZW50ZXIueCxcbiAgICAgICAgcG9pbnRlckRvd25TdGF0ZS5yZXNpemUuY2VudGVyLnksXG4gICAgICApXG4gICAgKSB7XG4gICAgICB0aGlzLm1heWJlU3VnZ2VzdEJpbmRpbmdGb3JBbGwoc2VsZWN0ZWRFbGVtZW50cyk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9O1xuXG4gIC8qKiBAcHJpdmF0ZSB1c2UgdGhpcy5oYW5kbGVDYW52YXNDb250ZXh0TWVudSAqL1xuICBwcml2YXRlIF9vcGVuQ29udGV4dE1lbnUgPSAoXG4gICAge1xuICAgICAgbGVmdCxcbiAgICAgIHRvcCxcbiAgICB9OiB7XG4gICAgICBsZWZ0OiBudW1iZXI7XG4gICAgICB0b3A6IG51bWJlcjtcbiAgICB9LFxuICAgIHR5cGU6IFwiY2FudmFzXCIgfCBcImVsZW1lbnRcIixcbiAgKSA9PiB7XG4gICAgaWYgKHRoaXMuc3RhdGUuc2hvd0h5cGVybGlua1BvcHVwKSB7XG4gICAgICB0aGlzLnNldFN0YXRlKHsgc2hvd0h5cGVybGlua1BvcHVwOiBmYWxzZSB9KTtcbiAgICB9XG4gICAgdGhpcy5jb250ZXh0TWVudU9wZW4gPSB0cnVlO1xuICAgIGNvbnN0IG1heWJlR3JvdXBBY3Rpb24gPSBhY3Rpb25Hcm91cC5jb250ZXh0SXRlbVByZWRpY2F0ZSEoXG4gICAgICB0aGlzLmFjdGlvbk1hbmFnZXIuZ2V0RWxlbWVudHNJbmNsdWRpbmdEZWxldGVkKCksXG4gICAgICB0aGlzLmFjdGlvbk1hbmFnZXIuZ2V0QXBwU3RhdGUoKSxcbiAgICApO1xuXG4gICAgY29uc3QgbWF5YmVVbmdyb3VwQWN0aW9uID0gYWN0aW9uVW5ncm91cC5jb250ZXh0SXRlbVByZWRpY2F0ZSEoXG4gICAgICB0aGlzLmFjdGlvbk1hbmFnZXIuZ2V0RWxlbWVudHNJbmNsdWRpbmdEZWxldGVkKCksXG4gICAgICB0aGlzLmFjdGlvbk1hbmFnZXIuZ2V0QXBwU3RhdGUoKSxcbiAgICApO1xuXG4gICAgY29uc3QgbWF5YmVGbGlwSG9yaXpvbnRhbCA9IGFjdGlvbkZsaXBIb3Jpem9udGFsLmNvbnRleHRJdGVtUHJlZGljYXRlIShcbiAgICAgIHRoaXMuYWN0aW9uTWFuYWdlci5nZXRFbGVtZW50c0luY2x1ZGluZ0RlbGV0ZWQoKSxcbiAgICAgIHRoaXMuYWN0aW9uTWFuYWdlci5nZXRBcHBTdGF0ZSgpLFxuICAgICk7XG5cbiAgICBjb25zdCBtYXliZUZsaXBWZXJ0aWNhbCA9IGFjdGlvbkZsaXBWZXJ0aWNhbC5jb250ZXh0SXRlbVByZWRpY2F0ZSEoXG4gICAgICB0aGlzLmFjdGlvbk1hbmFnZXIuZ2V0RWxlbWVudHNJbmNsdWRpbmdEZWxldGVkKCksXG4gICAgICB0aGlzLmFjdGlvbk1hbmFnZXIuZ2V0QXBwU3RhdGUoKSxcbiAgICApO1xuXG4gICAgY29uc3QgbWF5QmVBbGxvd1VuYmluZGluZyA9IGFjdGlvblVuYmluZFRleHQuY29udGV4dEl0ZW1QcmVkaWNhdGUoXG4gICAgICB0aGlzLmFjdGlvbk1hbmFnZXIuZ2V0RWxlbWVudHNJbmNsdWRpbmdEZWxldGVkKCksXG4gICAgICB0aGlzLmFjdGlvbk1hbmFnZXIuZ2V0QXBwU3RhdGUoKSxcbiAgICApO1xuXG4gICAgY29uc3QgbWF5QmVBbGxvd0JpbmRpbmcgPSBhY3Rpb25CaW5kVGV4dC5jb250ZXh0SXRlbVByZWRpY2F0ZShcbiAgICAgIHRoaXMuYWN0aW9uTWFuYWdlci5nZXRFbGVtZW50c0luY2x1ZGluZ0RlbGV0ZWQoKSxcbiAgICAgIHRoaXMuYWN0aW9uTWFuYWdlci5nZXRBcHBTdGF0ZSgpLFxuICAgICk7XG5cbiAgICBjb25zdCBzZXBhcmF0b3IgPSBcInNlcGFyYXRvclwiO1xuXG4gICAgY29uc3QgZWxlbWVudHMgPSB0aGlzLnNjZW5lLmdldE5vbkRlbGV0ZWRFbGVtZW50cygpO1xuXG4gICAgY29uc3Qgc2VsZWN0ZWRFbGVtZW50cyA9IGdldFNlbGVjdGVkRWxlbWVudHMoXG4gICAgICB0aGlzLnNjZW5lLmdldE5vbkRlbGV0ZWRFbGVtZW50cygpLFxuICAgICAgdGhpcy5zdGF0ZSxcbiAgICApO1xuXG4gICAgY29uc3Qgb3B0aW9uczogQ29udGV4dE1lbnVPcHRpb25bXSA9IFtdO1xuICAgIGlmIChwcm9iYWJseVN1cHBvcnRzQ2xpcGJvYXJkQmxvYiAmJiBlbGVtZW50cy5sZW5ndGggPiAwKSB7XG4gICAgICBvcHRpb25zLnB1c2goYWN0aW9uQ29weUFzUG5nKTtcbiAgICB9XG5cbiAgICBpZiAocHJvYmFibHlTdXBwb3J0c0NsaXBib2FyZFdyaXRlVGV4dCAmJiBlbGVtZW50cy5sZW5ndGggPiAwKSB7XG4gICAgICBvcHRpb25zLnB1c2goYWN0aW9uQ29weUFzU3ZnKTtcbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICB0eXBlID09PSBcImVsZW1lbnRcIiAmJlxuICAgICAgY29weVRleHQuY29udGV4dEl0ZW1QcmVkaWNhdGUoZWxlbWVudHMsIHRoaXMuc3RhdGUpICYmXG4gICAgICBwcm9iYWJseVN1cHBvcnRzQ2xpcGJvYXJkV3JpdGVUZXh0XG4gICAgKSB7XG4gICAgICBvcHRpb25zLnB1c2goY29weVRleHQpO1xuICAgIH1cbiAgICBpZiAodHlwZSA9PT0gXCJjYW52YXNcIikge1xuICAgICAgY29uc3Qgdmlld01vZGVPcHRpb25zID0gW1xuICAgICAgICAuLi5vcHRpb25zLFxuICAgICAgICB0eXBlb2YgdGhpcy5wcm9wcy5ncmlkTW9kZUVuYWJsZWQgPT09IFwidW5kZWZpbmVkXCIgJiZcbiAgICAgICAgICBhY3Rpb25Ub2dnbGVHcmlkTW9kZSxcbiAgICAgICAgdHlwZW9mIHRoaXMucHJvcHMuemVuTW9kZUVuYWJsZWQgPT09IFwidW5kZWZpbmVkXCIgJiYgYWN0aW9uVG9nZ2xlWmVuTW9kZSxcbiAgICAgICAgdHlwZW9mIHRoaXMucHJvcHMudmlld01vZGVFbmFibGVkID09PSBcInVuZGVmaW5lZFwiICYmXG4gICAgICAgICAgYWN0aW9uVG9nZ2xlVmlld01vZGUsXG4gICAgICAgIGFjdGlvblRvZ2dsZVN0YXRzLFxuICAgICAgXTtcblxuICAgICAgaWYgKHRoaXMuc3RhdGUudmlld01vZGVFbmFibGVkKSB7XG4gICAgICAgIENvbnRleHRNZW51LnB1c2goe1xuICAgICAgICAgIG9wdGlvbnM6IHZpZXdNb2RlT3B0aW9ucyxcbiAgICAgICAgICB0b3AsXG4gICAgICAgICAgbGVmdCxcbiAgICAgICAgICBhY3Rpb25NYW5hZ2VyOiB0aGlzLmFjdGlvbk1hbmFnZXIsXG4gICAgICAgICAgYXBwU3RhdGU6IHRoaXMuc3RhdGUsXG4gICAgICAgICAgY29udGFpbmVyOiB0aGlzLmV4Y2FsaWRyYXdDb250YWluZXJSZWYuY3VycmVudCEsXG4gICAgICAgICAgZWxlbWVudHMsXG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgQ29udGV4dE1lbnUucHVzaCh7XG4gICAgICAgICAgb3B0aW9uczogW1xuICAgICAgICAgICAgdGhpcy5kZXZpY2UuaXNNb2JpbGUgJiZcbiAgICAgICAgICAgICAgbmF2aWdhdG9yLmNsaXBib2FyZCAmJiB7XG4gICAgICAgICAgICAgICAgdHJhY2tFdmVudDogZmFsc2UsXG4gICAgICAgICAgICAgICAgbmFtZTogXCJwYXN0ZVwiLFxuICAgICAgICAgICAgICAgIHBlcmZvcm06IChlbGVtZW50cywgYXBwU3RhdGVzKSA9PiB7XG4gICAgICAgICAgICAgICAgICB0aGlzLnBhc3RlRnJvbUNsaXBib2FyZChudWxsKTtcbiAgICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbW1pdFRvSGlzdG9yeTogZmFsc2UsXG4gICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgY29udGV4dEl0ZW1MYWJlbDogXCJsYWJlbHMucGFzdGVcIixcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHRoaXMuZGV2aWNlLmlzTW9iaWxlICYmIG5hdmlnYXRvci5jbGlwYm9hcmQgJiYgc2VwYXJhdG9yLFxuICAgICAgICAgICAgcHJvYmFibHlTdXBwb3J0c0NsaXBib2FyZEJsb2IgJiZcbiAgICAgICAgICAgICAgZWxlbWVudHMubGVuZ3RoID4gMCAmJlxuICAgICAgICAgICAgICBhY3Rpb25Db3B5QXNQbmcsXG4gICAgICAgICAgICBwcm9iYWJseVN1cHBvcnRzQ2xpcGJvYXJkV3JpdGVUZXh0ICYmXG4gICAgICAgICAgICAgIGVsZW1lbnRzLmxlbmd0aCA+IDAgJiZcbiAgICAgICAgICAgICAgYWN0aW9uQ29weUFzU3ZnLFxuICAgICAgICAgICAgcHJvYmFibHlTdXBwb3J0c0NsaXBib2FyZFdyaXRlVGV4dCAmJlxuICAgICAgICAgICAgICBzZWxlY3RlZEVsZW1lbnRzLmxlbmd0aCA+IDAgJiZcbiAgICAgICAgICAgICAgY29weVRleHQsXG4gICAgICAgICAgICAoKHByb2JhYmx5U3VwcG9ydHNDbGlwYm9hcmRCbG9iICYmIGVsZW1lbnRzLmxlbmd0aCA+IDApIHx8XG4gICAgICAgICAgICAgIChwcm9iYWJseVN1cHBvcnRzQ2xpcGJvYXJkV3JpdGVUZXh0ICYmIGVsZW1lbnRzLmxlbmd0aCA+IDApKSAmJlxuICAgICAgICAgICAgICBzZXBhcmF0b3IsXG4gICAgICAgICAgICBhY3Rpb25TZWxlY3RBbGwsXG4gICAgICAgICAgICBzZXBhcmF0b3IsXG4gICAgICAgICAgICB0eXBlb2YgdGhpcy5wcm9wcy5ncmlkTW9kZUVuYWJsZWQgPT09IFwidW5kZWZpbmVkXCIgJiZcbiAgICAgICAgICAgICAgYWN0aW9uVG9nZ2xlR3JpZE1vZGUsXG4gICAgICAgICAgICB0eXBlb2YgdGhpcy5wcm9wcy56ZW5Nb2RlRW5hYmxlZCA9PT0gXCJ1bmRlZmluZWRcIiAmJlxuICAgICAgICAgICAgICBhY3Rpb25Ub2dnbGVaZW5Nb2RlLFxuICAgICAgICAgICAgdHlwZW9mIHRoaXMucHJvcHMudmlld01vZGVFbmFibGVkID09PSBcInVuZGVmaW5lZFwiICYmXG4gICAgICAgICAgICAgIGFjdGlvblRvZ2dsZVZpZXdNb2RlLFxuICAgICAgICAgICAgYWN0aW9uVG9nZ2xlU3RhdHMsXG4gICAgICAgICAgXSxcbiAgICAgICAgICB0b3AsXG4gICAgICAgICAgbGVmdCxcbiAgICAgICAgICBhY3Rpb25NYW5hZ2VyOiB0aGlzLmFjdGlvbk1hbmFnZXIsXG4gICAgICAgICAgYXBwU3RhdGU6IHRoaXMuc3RhdGUsXG4gICAgICAgICAgY29udGFpbmVyOiB0aGlzLmV4Y2FsaWRyYXdDb250YWluZXJSZWYuY3VycmVudCEsXG4gICAgICAgICAgZWxlbWVudHMsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gXCJlbGVtZW50XCIpIHtcbiAgICAgIGlmICh0aGlzLnN0YXRlLnZpZXdNb2RlRW5hYmxlZCkge1xuICAgICAgICBDb250ZXh0TWVudS5wdXNoKHtcbiAgICAgICAgICBvcHRpb25zOiBbbmF2aWdhdG9yLmNsaXBib2FyZCAmJiBhY3Rpb25Db3B5LCAuLi5vcHRpb25zXSxcbiAgICAgICAgICB0b3AsXG4gICAgICAgICAgbGVmdCxcbiAgICAgICAgICBhY3Rpb25NYW5hZ2VyOiB0aGlzLmFjdGlvbk1hbmFnZXIsXG4gICAgICAgICAgYXBwU3RhdGU6IHRoaXMuc3RhdGUsXG4gICAgICAgICAgY29udGFpbmVyOiB0aGlzLmV4Y2FsaWRyYXdDb250YWluZXJSZWYuY3VycmVudCEsXG4gICAgICAgICAgZWxlbWVudHMsXG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgQ29udGV4dE1lbnUucHVzaCh7XG4gICAgICAgICAgb3B0aW9uczogW1xuICAgICAgICAgICAgdGhpcy5kZXZpY2UuaXNNb2JpbGUgJiYgYWN0aW9uQ3V0LFxuICAgICAgICAgICAgdGhpcy5kZXZpY2UuaXNNb2JpbGUgJiYgbmF2aWdhdG9yLmNsaXBib2FyZCAmJiBhY3Rpb25Db3B5LFxuICAgICAgICAgICAgdGhpcy5kZXZpY2UuaXNNb2JpbGUgJiZcbiAgICAgICAgICAgICAgbmF2aWdhdG9yLmNsaXBib2FyZCAmJiB7XG4gICAgICAgICAgICAgICAgbmFtZTogXCJwYXN0ZVwiLFxuICAgICAgICAgICAgICAgIHRyYWNrRXZlbnQ6IGZhbHNlLFxuICAgICAgICAgICAgICAgIHBlcmZvcm06IChlbGVtZW50cywgYXBwU3RhdGVzKSA9PiB7XG4gICAgICAgICAgICAgICAgICB0aGlzLnBhc3RlRnJvbUNsaXBib2FyZChudWxsKTtcbiAgICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbW1pdFRvSGlzdG9yeTogZmFsc2UsXG4gICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgY29udGV4dEl0ZW1MYWJlbDogXCJsYWJlbHMucGFzdGVcIixcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHRoaXMuZGV2aWNlLmlzTW9iaWxlICYmIHNlcGFyYXRvcixcbiAgICAgICAgICAgIC4uLm9wdGlvbnMsXG4gICAgICAgICAgICBzZXBhcmF0b3IsXG4gICAgICAgICAgICBhY3Rpb25Db3B5U3R5bGVzLFxuICAgICAgICAgICAgYWN0aW9uUGFzdGVTdHlsZXMsXG4gICAgICAgICAgICBzZXBhcmF0b3IsXG4gICAgICAgICAgICBtYXliZUdyb3VwQWN0aW9uICYmIGFjdGlvbkdyb3VwLFxuICAgICAgICAgICAgbWF5QmVBbGxvd1VuYmluZGluZyAmJiBhY3Rpb25VbmJpbmRUZXh0LFxuICAgICAgICAgICAgbWF5QmVBbGxvd0JpbmRpbmcgJiYgYWN0aW9uQmluZFRleHQsXG4gICAgICAgICAgICBtYXliZVVuZ3JvdXBBY3Rpb24gJiYgYWN0aW9uVW5ncm91cCxcbiAgICAgICAgICAgIChtYXliZUdyb3VwQWN0aW9uIHx8IG1heWJlVW5ncm91cEFjdGlvbikgJiYgc2VwYXJhdG9yLFxuICAgICAgICAgICAgYWN0aW9uQWRkVG9MaWJyYXJ5LFxuICAgICAgICAgICAgc2VwYXJhdG9yLFxuICAgICAgICAgICAgYWN0aW9uU2VuZEJhY2t3YXJkLFxuICAgICAgICAgICAgYWN0aW9uQnJpbmdGb3J3YXJkLFxuICAgICAgICAgICAgYWN0aW9uU2VuZFRvQmFjayxcbiAgICAgICAgICAgIGFjdGlvbkJyaW5nVG9Gcm9udCxcbiAgICAgICAgICAgIHNlcGFyYXRvcixcbiAgICAgICAgICAgIG1heWJlRmxpcEhvcml6b250YWwgJiYgYWN0aW9uRmxpcEhvcml6b250YWwsXG4gICAgICAgICAgICBtYXliZUZsaXBWZXJ0aWNhbCAmJiBhY3Rpb25GbGlwVmVydGljYWwsXG4gICAgICAgICAgICAobWF5YmVGbGlwSG9yaXpvbnRhbCB8fCBtYXliZUZsaXBWZXJ0aWNhbCkgJiYgc2VwYXJhdG9yLFxuICAgICAgICAgICAgYWN0aW9uTGluay5jb250ZXh0SXRlbVByZWRpY2F0ZShlbGVtZW50cywgdGhpcy5zdGF0ZSkgJiYgYWN0aW9uTGluayxcbiAgICAgICAgICAgIGFjdGlvbkR1cGxpY2F0ZVNlbGVjdGlvbixcbiAgICAgICAgICAgIGFjdGlvblRvZ2dsZUxvY2ssXG4gICAgICAgICAgICBzZXBhcmF0b3IsXG4gICAgICAgICAgICBhY3Rpb25EZWxldGVTZWxlY3RlZCxcbiAgICAgICAgICBdLFxuICAgICAgICAgIHRvcCxcbiAgICAgICAgICBsZWZ0LFxuICAgICAgICAgIGFjdGlvbk1hbmFnZXI6IHRoaXMuYWN0aW9uTWFuYWdlcixcbiAgICAgICAgICBhcHBTdGF0ZTogdGhpcy5zdGF0ZSxcbiAgICAgICAgICBjb250YWluZXI6IHRoaXMuZXhjYWxpZHJhd0NvbnRhaW5lclJlZi5jdXJyZW50ISxcbiAgICAgICAgICBlbGVtZW50cyxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIHByaXZhdGUgaGFuZGxlV2hlZWwgPSB3aXRoQmF0Y2hlZFVwZGF0ZXMoKGV2ZW50OiBXaGVlbEV2ZW50KSA9PiB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICBpZiAoaXNQYW5uaW5nKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgeyBkZWx0YVgsIGRlbHRhWSB9ID0gZXZlbnQ7XG4gICAgLy8gbm90ZSB0aGF0IGV2ZW50LmN0cmxLZXkgaXMgbmVjZXNzYXJ5IHRvIGhhbmRsZSBwaW5jaCB6b29taW5nXG4gICAgaWYgKGV2ZW50Lm1ldGFLZXkgfHwgZXZlbnQuY3RybEtleSkge1xuICAgICAgY29uc3Qgc2lnbiA9IE1hdGguc2lnbihkZWx0YVkpO1xuICAgICAgY29uc3QgTUFYX1NURVAgPSAxMDtcbiAgICAgIGNvbnN0IGFic0RlbHRhID0gTWF0aC5hYnMoZGVsdGFZKTtcbiAgICAgIGxldCBkZWx0YSA9IGRlbHRhWTtcbiAgICAgIGlmIChhYnNEZWx0YSA+IE1BWF9TVEVQKSB7XG4gICAgICAgIGRlbHRhID0gTUFYX1NURVAgKiBzaWduO1xuICAgICAgfVxuXG4gICAgICBsZXQgbmV3Wm9vbSA9IHRoaXMuc3RhdGUuem9vbS52YWx1ZSAtIGRlbHRhIC8gMTAwO1xuICAgICAgLy8gaW5jcmVhc2Ugem9vbSBzdGVwcyB0aGUgbW9yZSB6b29tZWQtaW4gd2UgYXJlIChhcHBsaWVzIHRvID4xMDAlIG9ubHkpXG4gICAgICBuZXdab29tICs9XG4gICAgICAgIE1hdGgubG9nMTAoTWF0aC5tYXgoMSwgdGhpcy5zdGF0ZS56b29tLnZhbHVlKSkgKlxuICAgICAgICAtc2lnbiAqXG4gICAgICAgIC8vIHJlZHVjZWQgYW1wbGlmaWNhdGlvbiBmb3Igc21hbGwgZGVsdGFzIChzbWFsbCBtb3ZlbWVudHMgb24gYSB0cmFja3BhZClcbiAgICAgICAgTWF0aC5taW4oMSwgYWJzRGVsdGEgLyAyMCk7XG5cbiAgICAgIHRoaXMuc2V0U3RhdGUoKHN0YXRlKSA9PiAoe1xuICAgICAgICAuLi5nZXRTdGF0ZUZvclpvb20oXG4gICAgICAgICAge1xuICAgICAgICAgICAgdmlld3BvcnRYOiBjdXJzb3JYLFxuICAgICAgICAgICAgdmlld3BvcnRZOiBjdXJzb3JZLFxuICAgICAgICAgICAgbmV4dFpvb206IGdldE5vcm1hbGl6ZWRab29tKG5ld1pvb20pLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgc3RhdGUsXG4gICAgICAgICksXG4gICAgICAgIHNob3VsZENhY2hlSWdub3JlWm9vbTogdHJ1ZSxcbiAgICAgIH0pKTtcbiAgICAgIHRoaXMucmVzZXRTaG91bGRDYWNoZUlnbm9yZVpvb21EZWJvdW5jZWQoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBzY3JvbGwgaG9yaXpvbnRhbGx5IHdoZW4gc2hpZnQgcHJlc3NlZFxuICAgIGlmIChldmVudC5zaGlmdEtleSkge1xuICAgICAgdGhpcy5zZXRTdGF0ZSgoeyB6b29tLCBzY3JvbGxYIH0pID0+ICh7XG4gICAgICAgIC8vIG9uIE1hYywgc2hpZnQrd2hlZWwgdGVuZHMgdG8gcmVzdWx0IGluIGRlbHRhWFxuICAgICAgICBzY3JvbGxYOiBzY3JvbGxYIC0gKGRlbHRhWSB8fCBkZWx0YVgpIC8gem9vbS52YWx1ZSxcbiAgICAgIH0pKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLnNldFN0YXRlKCh7IHpvb20sIHNjcm9sbFgsIHNjcm9sbFkgfSkgPT4gKHtcbiAgICAgIHNjcm9sbFg6IHNjcm9sbFggLSBkZWx0YVggLyB6b29tLnZhbHVlLFxuICAgICAgc2Nyb2xsWTogc2Nyb2xsWSAtIGRlbHRhWSAvIHpvb20udmFsdWUsXG4gICAgfSkpO1xuICB9KTtcblxuICBwcml2YXRlIGdldFRleHRXeXNpd3lnU25hcHBlZFRvQ2VudGVyUG9zaXRpb24oXG4gICAgeDogbnVtYmVyLFxuICAgIHk6IG51bWJlcixcbiAgICBhcHBTdGF0ZTogQXBwU3RhdGUsXG4gICAgY2FudmFzOiBIVE1MQ2FudmFzRWxlbWVudCB8IG51bGwsXG4gICAgc2NhbGU6IG51bWJlcixcbiAgKSB7XG4gICAgY29uc3QgZWxlbWVudENsaWNrZWRJbnNpZGUgPSBnZXRUZXh0QmluZGFibGVDb250YWluZXJBdFBvc2l0aW9uKFxuICAgICAgdGhpcy5zY2VuZVxuICAgICAgICAuZ2V0RWxlbWVudHNJbmNsdWRpbmdEZWxldGVkKClcbiAgICAgICAgLmZpbHRlcigoZWxlbWVudCkgPT4gIWlzVGV4dEVsZW1lbnQoZWxlbWVudCkpLFxuICAgICAgeCxcbiAgICAgIHksXG4gICAgKTtcbiAgICBpZiAoZWxlbWVudENsaWNrZWRJbnNpZGUpIHtcbiAgICAgIGNvbnN0IGVsZW1lbnRDZW50ZXJYID1cbiAgICAgICAgZWxlbWVudENsaWNrZWRJbnNpZGUueCArIGVsZW1lbnRDbGlja2VkSW5zaWRlLndpZHRoIC8gMjtcbiAgICAgIGNvbnN0IGVsZW1lbnRDZW50ZXJZID1cbiAgICAgICAgZWxlbWVudENsaWNrZWRJbnNpZGUueSArIGVsZW1lbnRDbGlja2VkSW5zaWRlLmhlaWdodCAvIDI7XG4gICAgICBjb25zdCBkaXN0YW5jZVRvQ2VudGVyID0gTWF0aC5oeXBvdChcbiAgICAgICAgeCAtIGVsZW1lbnRDZW50ZXJYLFxuICAgICAgICB5IC0gZWxlbWVudENlbnRlclksXG4gICAgICApO1xuICAgICAgY29uc3QgaXNTbmFwcGVkVG9DZW50ZXIgPVxuICAgICAgICBkaXN0YW5jZVRvQ2VudGVyIDwgVEVYVF9UT19DRU5URVJfU05BUF9USFJFU0hPTEQ7XG4gICAgICBpZiAoaXNTbmFwcGVkVG9DZW50ZXIpIHtcbiAgICAgICAgY29uc3QgeyB4OiB2aWV3cG9ydFgsIHk6IHZpZXdwb3J0WSB9ID0gc2NlbmVDb29yZHNUb1ZpZXdwb3J0Q29vcmRzKFxuICAgICAgICAgIHsgc2NlbmVYOiBlbGVtZW50Q2VudGVyWCwgc2NlbmVZOiBlbGVtZW50Q2VudGVyWSB9LFxuICAgICAgICAgIGFwcFN0YXRlLFxuICAgICAgICApO1xuICAgICAgICByZXR1cm4geyB2aWV3cG9ydFgsIHZpZXdwb3J0WSwgZWxlbWVudENlbnRlclgsIGVsZW1lbnRDZW50ZXJZIH07XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzYXZlUG9pbnRlciA9ICh4OiBudW1iZXIsIHk6IG51bWJlciwgYnV0dG9uOiBcInVwXCIgfCBcImRvd25cIikgPT4ge1xuICAgIGlmICgheCB8fCAheSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBwb2ludGVyID0gdmlld3BvcnRDb29yZHNUb1NjZW5lQ29vcmRzKFxuICAgICAgeyBjbGllbnRYOiB4LCBjbGllbnRZOiB5IH0sXG4gICAgICB0aGlzLnN0YXRlLFxuICAgICk7XG5cbiAgICBpZiAoaXNOYU4ocG9pbnRlci54KSB8fCBpc05hTihwb2ludGVyLnkpKSB7XG4gICAgICAvLyBzb21ldGltZXMgdGhlIHBvaW50ZXIgZ29lcyBvZmYgc2NyZWVuXG4gICAgfVxuXG4gICAgdGhpcy5wcm9wcy5vblBvaW50ZXJVcGRhdGU/Lih7XG4gICAgICBwb2ludGVyLFxuICAgICAgYnV0dG9uLFxuICAgICAgcG9pbnRlcnNNYXA6IGdlc3R1cmUucG9pbnRlcnMsXG4gICAgfSk7XG4gIH07XG5cbiAgcHJpdmF0ZSByZXNldFNob3VsZENhY2hlSWdub3JlWm9vbURlYm91bmNlZCA9IGRlYm91bmNlKCgpID0+IHtcbiAgICBpZiAoIXRoaXMudW5tb3VudGVkKSB7XG4gICAgICB0aGlzLnNldFN0YXRlKHsgc2hvdWxkQ2FjaGVJZ25vcmVab29tOiBmYWxzZSB9KTtcbiAgICB9XG4gIH0sIDMwMCk7XG5cbiAgcHJpdmF0ZSB1cGRhdGVET01SZWN0ID0gKGNiPzogKCkgPT4gdm9pZCkgPT4ge1xuICAgIGlmICh0aGlzLmV4Y2FsaWRyYXdDb250YWluZXJSZWY/LmN1cnJlbnQpIHtcbiAgICAgIGNvbnN0IGV4Y2FsaWRyYXdDb250YWluZXIgPSB0aGlzLmV4Y2FsaWRyYXdDb250YWluZXJSZWYuY3VycmVudDtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgd2lkdGgsXG4gICAgICAgIGhlaWdodCxcbiAgICAgICAgbGVmdDogb2Zmc2V0TGVmdCxcbiAgICAgICAgdG9wOiBvZmZzZXRUb3AsXG4gICAgICB9ID0gZXhjYWxpZHJhd0NvbnRhaW5lci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgd2lkdGg6IGN1cnJlbnRXaWR0aCxcbiAgICAgICAgaGVpZ2h0OiBjdXJyZW50SGVpZ2h0LFxuICAgICAgICBvZmZzZXRUb3A6IGN1cnJlbnRPZmZzZXRUb3AsXG4gICAgICAgIG9mZnNldExlZnQ6IGN1cnJlbnRPZmZzZXRMZWZ0LFxuICAgICAgfSA9IHRoaXMuc3RhdGU7XG5cbiAgICAgIGlmIChcbiAgICAgICAgd2lkdGggPT09IGN1cnJlbnRXaWR0aCAmJlxuICAgICAgICBoZWlnaHQgPT09IGN1cnJlbnRIZWlnaHQgJiZcbiAgICAgICAgb2Zmc2V0TGVmdCA9PT0gY3VycmVudE9mZnNldExlZnQgJiZcbiAgICAgICAgb2Zmc2V0VG9wID09PSBjdXJyZW50T2Zmc2V0VG9wXG4gICAgICApIHtcbiAgICAgICAgaWYgKGNiKSB7XG4gICAgICAgICAgY2IoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHRoaXMuc2V0U3RhdGUoXG4gICAgICAgIHtcbiAgICAgICAgICB3aWR0aCxcbiAgICAgICAgICBoZWlnaHQsXG4gICAgICAgICAgb2Zmc2V0TGVmdCxcbiAgICAgICAgICBvZmZzZXRUb3AsXG4gICAgICAgIH0sXG4gICAgICAgICgpID0+IHtcbiAgICAgICAgICBjYiAmJiBjYigpO1xuICAgICAgICB9LFxuICAgICAgKTtcbiAgICB9XG4gIH07XG5cbiAgcHVibGljIHJlZnJlc2ggPSAoKSA9PiB7XG4gICAgdGhpcy5zZXRTdGF0ZSh7IC4uLnRoaXMuZ2V0Q2FudmFzT2Zmc2V0cygpIH0pO1xuICB9O1xuXG4gIHByaXZhdGUgZ2V0Q2FudmFzT2Zmc2V0cygpOiBQaWNrPEFwcFN0YXRlLCBcIm9mZnNldFRvcFwiIHwgXCJvZmZzZXRMZWZ0XCI+IHtcbiAgICBpZiAodGhpcy5leGNhbGlkcmF3Q29udGFpbmVyUmVmPy5jdXJyZW50KSB7XG4gICAgICBjb25zdCBleGNhbGlkcmF3Q29udGFpbmVyID0gdGhpcy5leGNhbGlkcmF3Q29udGFpbmVyUmVmLmN1cnJlbnQ7XG4gICAgICBjb25zdCB7IGxlZnQsIHRvcCB9ID0gZXhjYWxpZHJhd0NvbnRhaW5lci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIG9mZnNldExlZnQ6IGxlZnQsXG4gICAgICAgIG9mZnNldFRvcDogdG9wLFxuICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIG9mZnNldExlZnQ6IDAsXG4gICAgICBvZmZzZXRUb3A6IDAsXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgdXBkYXRlTGFuZ3VhZ2UoKSB7XG4gICAgY29uc3QgY3VycmVudExhbmcgPVxuICAgICAgbGFuZ3VhZ2VzLmZpbmQoKGxhbmcpID0+IGxhbmcuY29kZSA9PT0gdGhpcy5wcm9wcy5sYW5nQ29kZSkgfHxcbiAgICAgIGRlZmF1bHRMYW5nO1xuICAgIGF3YWl0IHNldExhbmd1YWdlKGN1cnJlbnRMYW5nKTtcbiAgICB0aGlzLnNldEFwcFN0YXRlKHt9KTtcbiAgfVxufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gVEVTVCBIT09LU1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgV2luZG93IHtcbiAgICBoOiB7XG4gICAgICBlbGVtZW50czogcmVhZG9ubHkgRXhjYWxpZHJhd0VsZW1lbnRbXTtcbiAgICAgIHN0YXRlOiBBcHBTdGF0ZTtcbiAgICAgIHNldFN0YXRlOiBSZWFjdC5Db21wb25lbnQ8YW55LCBBcHBTdGF0ZT5bXCJzZXRTdGF0ZVwiXTtcbiAgICAgIGFwcDogSW5zdGFuY2VUeXBlPHR5cGVvZiBBcHA+O1xuICAgICAgaGlzdG9yeTogSGlzdG9yeTtcbiAgICB9O1xuICB9XG59XG5cbmlmIChcbiAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IEVOVi5URVNUIHx8XG4gIHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBFTlYuREVWRUxPUE1FTlRcbikge1xuICB3aW5kb3cuaCA9IHdpbmRvdy5oIHx8ICh7fSBhcyBXaW5kb3dbXCJoXCJdKTtcblxuICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyh3aW5kb3cuaCwge1xuICAgIGVsZW1lbnRzOiB7XG4gICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICBnZXQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmFwcD8uc2NlbmUuZ2V0RWxlbWVudHNJbmNsdWRpbmdEZWxldGVkKCk7XG4gICAgICB9LFxuICAgICAgc2V0KGVsZW1lbnRzOiBFeGNhbGlkcmF3RWxlbWVudFtdKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmFwcD8uc2NlbmUucmVwbGFjZUFsbEVsZW1lbnRzKGVsZW1lbnRzKTtcbiAgICAgIH0sXG4gICAgfSxcbiAgfSk7XG59XG5leHBvcnQgZGVmYXVsdCBBcHA7XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///../../components/App.tsx\n");
|
|
2120
|
+
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__),\n/* harmony export */ \"useDevice\": () => (/* binding */ useDevice),\n/* harmony export */ \"useExcalidrawContainer\": () => (/* binding */ useExcalidrawContainer)\n/* harmony export */ });\n/* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react/jsx-runtime */ \"../../../node_modules/react/jsx-runtime.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ \"react\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var react_dom__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react-dom */ \"react-dom\");\n/* harmony import */ var react_dom__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react_dom__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var roughjs_bin_rough__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! roughjs/bin/rough */ \"../../../node_modules/roughjs/bin/rough.js\");\n/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! clsx */ \"../../../node_modules/clsx/dist/clsx.m.js\");\n/* harmony import */ var nanoid__WEBPACK_IMPORTED_MODULE_46__ = __webpack_require__(/*! nanoid */ \"../../../node_modules/nanoid/index.browser.js\");\n/* harmony import */ var _actions__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../actions */ \"../../actions/index.ts\");\n/* harmony import */ var _actions_actionHistory__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../actions/actionHistory */ \"../../actions/actionHistory.tsx\");\n/* harmony import */ var _actions_manager__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../actions/manager */ \"../../actions/manager.tsx\");\n/* harmony import */ var _actions_register__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../actions/register */ \"../../actions/register.ts\");\n/* harmony import */ var _analytics__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../analytics */ \"../../analytics.ts\");\n/* harmony import */ var _appState__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../appState */ \"../../appState.ts\");\n/* harmony import */ var _clipboard__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../clipboard */ \"../../clipboard.ts\");\n/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../constants */ \"../../constants.ts\");\n/* harmony import */ var _data__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../data */ \"../../data/index.ts\");\n/* harmony import */ var _data_library__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ../data/library */ \"../../data/library.ts\");\n/* harmony import */ var _data_restore__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ../data/restore */ \"../../data/restore.ts\");\n/* harmony import */ var _element__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ../element */ \"../../element/index.ts\");\n/* harmony import */ var _element_binding__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ../element/binding */ \"../../element/binding.ts\");\n/* harmony import */ var _element_linearElementEditor__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ../element/linearElementEditor */ \"../../element/linearElementEditor.ts\");\n/* harmony import */ var _element_mutateElement__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ../element/mutateElement */ \"../../element/mutateElement.ts\");\n/* harmony import */ var _element_newElement__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ../element/newElement */ \"../../element/newElement.ts\");\n/* harmony import */ var _element_typeChecks__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! ../element/typeChecks */ \"../../element/typeChecks.ts\");\n/* harmony import */ var _gesture__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! ../gesture */ \"../../gesture.ts\");\n/* harmony import */ var _groups__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! ../groups */ \"../../groups.ts\");\n/* harmony import */ var _history__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(/*! ../history */ \"../../history.ts\");\n/* harmony import */ var _i18n__WEBPACK_IMPORTED_MODULE_25__ = __webpack_require__(/*! ../i18n */ \"../../i18n.ts\");\n/* harmony import */ var _keys__WEBPACK_IMPORTED_MODULE_26__ = __webpack_require__(/*! ../keys */ \"../../keys.ts\");\n/* harmony import */ var _math__WEBPACK_IMPORTED_MODULE_27__ = __webpack_require__(/*! ../math */ \"../../math.ts\");\n/* harmony import */ var _renderer_renderScene__WEBPACK_IMPORTED_MODULE_28__ = __webpack_require__(/*! ../renderer/renderScene */ \"../../renderer/renderScene.ts\");\n/* harmony import */ var _renderer_renderElement__WEBPACK_IMPORTED_MODULE_29__ = __webpack_require__(/*! ../renderer/renderElement */ \"../../renderer/renderElement.ts\");\n/* harmony import */ var _scene__WEBPACK_IMPORTED_MODULE_30__ = __webpack_require__(/*! ../scene */ \"../../scene/index.ts\");\n/* harmony import */ var _scene_Scene__WEBPACK_IMPORTED_MODULE_31__ = __webpack_require__(/*! ../scene/Scene */ \"../../scene/Scene.ts\");\n/* harmony import */ var _scene_zoom__WEBPACK_IMPORTED_MODULE_32__ = __webpack_require__(/*! ../scene/zoom */ \"../../scene/zoom.ts\");\n/* harmony import */ var _shapes__WEBPACK_IMPORTED_MODULE_33__ = __webpack_require__(/*! ../shapes */ \"../../shapes.tsx\");\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_34__ = __webpack_require__(/*! ../utils */ \"../../utils.ts\");\n/* harmony import */ var _ContextMenu__WEBPACK_IMPORTED_MODULE_35__ = __webpack_require__(/*! ./ContextMenu */ \"../../components/ContextMenu.tsx\");\n/* harmony import */ var _LayerUI__WEBPACK_IMPORTED_MODULE_36__ = __webpack_require__(/*! ./LayerUI */ \"../../components/LayerUI.tsx\");\n/* harmony import */ var _Toast__WEBPACK_IMPORTED_MODULE_37__ = __webpack_require__(/*! ./Toast */ \"../../components/Toast.tsx\");\n/* harmony import */ var _actions_actionToggleViewMode__WEBPACK_IMPORTED_MODULE_38__ = __webpack_require__(/*! ../actions/actionToggleViewMode */ \"../../actions/actionToggleViewMode.tsx\");\n/* harmony import */ var _data_blob__WEBPACK_IMPORTED_MODULE_39__ = __webpack_require__(/*! ../data/blob */ \"../../data/blob.ts\");\n/* harmony import */ var _element_image__WEBPACK_IMPORTED_MODULE_40__ = __webpack_require__(/*! ../element/image */ \"../../element/image.ts\");\n/* harmony import */ var lodash_throttle__WEBPACK_IMPORTED_MODULE_41__ = __webpack_require__(/*! lodash.throttle */ \"../../../node_modules/lodash.throttle/index.js\");\n/* harmony import */ var lodash_throttle__WEBPACK_IMPORTED_MODULE_41___default = /*#__PURE__*/__webpack_require__.n(lodash_throttle__WEBPACK_IMPORTED_MODULE_41__);\n/* harmony import */ var _data_filesystem__WEBPACK_IMPORTED_MODULE_42__ = __webpack_require__(/*! ../data/filesystem */ \"../../data/filesystem.ts\");\n/* harmony import */ var _element_textElement__WEBPACK_IMPORTED_MODULE_43__ = __webpack_require__(/*! ../element/textElement */ \"../../element/textElement.ts\");\n/* harmony import */ var _element_collision__WEBPACK_IMPORTED_MODULE_44__ = __webpack_require__(/*! ../element/collision */ \"../../element/collision.ts\");\n/* harmony import */ var _element_Hyperlink__WEBPACK_IMPORTED_MODULE_45__ = __webpack_require__(/*! ../element/Hyperlink */ \"../../element/Hyperlink.tsx\");\nvar __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nconst deviceContextInitialValue = {\n isSmScreen: false,\n isMobile: false,\n isTouchScreen: false,\n canDeviceFitSidebar: false,\n};\nconst DeviceContext = react__WEBPACK_IMPORTED_MODULE_1___default().createContext(deviceContextInitialValue);\nconst useDevice = () => (0,react__WEBPACK_IMPORTED_MODULE_1__.useContext)(DeviceContext);\nconst ExcalidrawContainerContext = react__WEBPACK_IMPORTED_MODULE_1___default().createContext({ container: null, id: null });\nconst useExcalidrawContainer = () => (0,react__WEBPACK_IMPORTED_MODULE_1__.useContext)(ExcalidrawContainerContext);\nlet didTapTwice = false;\nlet tappedTwiceTimer = 0;\nlet cursorX = 0;\nlet cursorY = 0;\nlet isHoldingSpace = false;\nlet isPanning = false;\nlet isDraggingScrollBar = false;\nlet currentScrollBars = { horizontal: null, vertical: null };\nlet touchTimeout = 0;\nlet invalidateContextMenu = false;\n// remove this hack when we can sync render & resizeObserver (state update)\n// to rAF. See #5439\nlet THROTTLE_NEXT_RENDER = true;\nlet lastPointerUp = null;\nconst gesture = {\n pointers: new Map(),\n lastCenter: null,\n initialDistance: null,\n initialScale: null,\n};\nclass App extends (react__WEBPACK_IMPORTED_MODULE_1___default().Component) {\n constructor(props) {\n var _a;\n super(props);\n this.canvas = null;\n this.rc = null;\n this.unmounted = false;\n this.device = deviceContextInitialValue;\n this.excalidrawContainerRef = react__WEBPACK_IMPORTED_MODULE_1___default().createRef();\n this.files = {};\n this.imageCache = new Map();\n this.lastPointerDown = null;\n this.lastPointerUp = null;\n this.contextMenuOpen = false;\n this.lastScenePointer = null;\n this.focusContainer = () => {\n var _a;\n if (this.props.autoFocus) {\n (_a = this.excalidrawContainerRef.current) === null || _a === void 0 ? void 0 : _a.focus();\n }\n };\n this.getSceneElementsIncludingDeleted = () => {\n return this.scene.getElementsIncludingDeleted();\n };\n this.getSceneElements = () => {\n return this.scene.getNonDeletedElements();\n };\n this.syncActionResult = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.withBatchedUpdates)((actionResult) => {\n var _a, _b, _c, _d, _e, _f;\n // Since context menu closes when action triggered so setting to false\n this.contextMenuOpen = false;\n if (this.unmounted || actionResult === false) {\n return;\n }\n let editingElement = null;\n if (actionResult.elements) {\n actionResult.elements.forEach((element) => {\n var _a;\n if (((_a = this.state.editingElement) === null || _a === void 0 ? void 0 : _a.id) === element.id &&\n this.state.editingElement !== element &&\n (0,_element__WEBPACK_IMPORTED_MODULE_16__.isNonDeletedElement)(element)) {\n editingElement = element;\n }\n });\n this.scene.replaceAllElements(actionResult.elements);\n if (actionResult.commitToHistory) {\n this.history.resumeRecording();\n }\n }\n if (actionResult.files) {\n this.files = actionResult.replaceFiles\n ? actionResult.files\n : Object.assign(Object.assign({}, this.files), actionResult.files);\n this.addNewImagesToImageCache();\n }\n if (actionResult.appState || editingElement) {\n if (actionResult.commitToHistory) {\n this.history.resumeRecording();\n }\n let viewModeEnabled = ((_a = actionResult === null || actionResult === void 0 ? void 0 : actionResult.appState) === null || _a === void 0 ? void 0 : _a.viewModeEnabled) || false;\n let zenModeEnabled = ((_b = actionResult === null || actionResult === void 0 ? void 0 : actionResult.appState) === null || _b === void 0 ? void 0 : _b.zenModeEnabled) || false;\n let gridSize = ((_c = actionResult === null || actionResult === void 0 ? void 0 : actionResult.appState) === null || _c === void 0 ? void 0 : _c.gridSize) || null;\n let theme = ((_d = actionResult === null || actionResult === void 0 ? void 0 : actionResult.appState) === null || _d === void 0 ? void 0 : _d.theme) || _constants__WEBPACK_IMPORTED_MODULE_12__.THEME.LIGHT;\n let name = (_f = (_e = actionResult === null || actionResult === void 0 ? void 0 : actionResult.appState) === null || _e === void 0 ? void 0 : _e.name) !== null && _f !== void 0 ? _f : this.state.name;\n if (typeof this.props.viewModeEnabled !== \"undefined\") {\n viewModeEnabled = this.props.viewModeEnabled;\n }\n if (typeof this.props.zenModeEnabled !== \"undefined\") {\n zenModeEnabled = this.props.zenModeEnabled;\n }\n if (typeof this.props.gridModeEnabled !== \"undefined\") {\n gridSize = this.props.gridModeEnabled ? _constants__WEBPACK_IMPORTED_MODULE_12__.GRID_SIZE : null;\n }\n if (typeof this.props.theme !== \"undefined\") {\n theme = this.props.theme;\n }\n if (typeof this.props.name !== \"undefined\") {\n name = this.props.name;\n }\n this.setState((state) => {\n var _a;\n // using Object.assign instead of spread to fool TS 4.2.2+ into\n // regarding the resulting type as not containing undefined\n // (which the following expression will never contain)\n return Object.assign(actionResult.appState || {}, {\n editingElement: editingElement || ((_a = actionResult.appState) === null || _a === void 0 ? void 0 : _a.editingElement) || null,\n viewModeEnabled,\n zenModeEnabled,\n gridSize,\n theme,\n name,\n });\n }, () => {\n if (actionResult.syncHistory) {\n this.history.setCurrentState(this.state, this.scene.getElementsIncludingDeleted());\n }\n });\n }\n });\n // Lifecycle\n this.onBlur = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.withBatchedUpdates)(() => {\n isHoldingSpace = false;\n this.setState({ isBindingEnabled: true });\n });\n this.onUnload = () => {\n this.onBlur();\n };\n this.disableEvent = (event) => {\n event.preventDefault();\n };\n this.onFontLoaded = () => {\n this.scene.getElementsIncludingDeleted().forEach((element) => {\n if ((0,_element__WEBPACK_IMPORTED_MODULE_16__.isTextElement)(element)) {\n (0,_renderer_renderElement__WEBPACK_IMPORTED_MODULE_29__.invalidateShapeForElement)(element);\n }\n });\n this.onSceneUpdated();\n };\n this.resetHistory = () => {\n this.history.clear();\n };\n /**\n * Resets scene & history.\n * ! Do not use to clear scene user action !\n */\n this.resetScene = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.withBatchedUpdates)((opts) => {\n this.scene.replaceAllElements([]);\n this.setState((state) => (Object.assign(Object.assign({}, (0,_appState__WEBPACK_IMPORTED_MODULE_10__.getDefaultAppState)()), { isLoading: (opts === null || opts === void 0 ? void 0 : opts.resetLoadingState) ? false : state.isLoading, theme: this.state.theme })));\n this.resetHistory();\n });\n this.initializeScene = () => __awaiter(this, void 0, void 0, function* () {\n var _b;\n if (\"launchQueue\" in window && \"LaunchParams\" in window) {\n window.launchQueue.setConsumer((launchParams) => __awaiter(this, void 0, void 0, function* () {\n if (!launchParams.files.length) {\n return;\n }\n const fileHandle = launchParams.files[0];\n const blob = yield fileHandle.getFile();\n this.loadFileToCanvas(new File([blob], blob.name || \"\", { type: blob.type }), fileHandle);\n }));\n }\n if (!this.state.isLoading) {\n this.setState({ isLoading: true });\n }\n let initialData = null;\n try {\n initialData = (yield this.props.initialData) || null;\n if (initialData === null || initialData === void 0 ? void 0 : initialData.libraryItems) {\n this.library\n .updateLibrary({\n libraryItems: initialData.libraryItems,\n merge: true,\n })\n .catch((error) => {\n console.error(error);\n });\n }\n }\n catch (error) {\n console.error(error);\n initialData = {\n appState: {\n errorMessage: error.message ||\n \"Encountered an error during importing or restoring scene data\",\n },\n };\n }\n const scene = (0,_data_restore__WEBPACK_IMPORTED_MODULE_15__.restore)(initialData, null, null);\n scene.appState = Object.assign(Object.assign({}, scene.appState), { \n // we're falling back to current (pre-init) state when deciding\n // whether to open the library, to handle a case where we\n // update the state outside of initialData (e.g. when loading the app\n // with a library install link, which should auto-open the library)\n isLibraryOpen: ((_b = initialData === null || initialData === void 0 ? void 0 : initialData.appState) === null || _b === void 0 ? void 0 : _b.isLibraryOpen) || this.state.isLibraryOpen, activeTool: scene.appState.activeTool.type === \"image\"\n ? Object.assign(Object.assign({}, scene.appState.activeTool), { type: \"selection\" }) : scene.appState.activeTool, isLoading: false, toast: this.state.toast });\n if (initialData === null || initialData === void 0 ? void 0 : initialData.scrollToContent) {\n scene.appState = Object.assign(Object.assign({}, scene.appState), (0,_scene__WEBPACK_IMPORTED_MODULE_30__.calculateScrollCenter)(scene.elements, Object.assign(Object.assign({}, scene.appState), { width: this.state.width, height: this.state.height, offsetTop: this.state.offsetTop, offsetLeft: this.state.offsetLeft }), null));\n }\n this.resetHistory();\n this.syncActionResult(Object.assign(Object.assign({}, scene), { commitToHistory: true }));\n });\n this.refreshDeviceState = (container) => {\n const { width, height } = container.getBoundingClientRect();\n const sidebarBreakpoint = this.props.UIOptions.dockedSidebarBreakpoint != null\n ? this.props.UIOptions.dockedSidebarBreakpoint\n : _constants__WEBPACK_IMPORTED_MODULE_12__.MQ_RIGHT_SIDEBAR_MIN_WIDTH;\n this.device = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.updateObject)(this.device, {\n isSmScreen: width < _constants__WEBPACK_IMPORTED_MODULE_12__.MQ_SM_MAX_WIDTH,\n isMobile: width < _constants__WEBPACK_IMPORTED_MODULE_12__.MQ_MAX_WIDTH_PORTRAIT ||\n (height < _constants__WEBPACK_IMPORTED_MODULE_12__.MQ_MAX_HEIGHT_LANDSCAPE && width < _constants__WEBPACK_IMPORTED_MODULE_12__.MQ_MAX_WIDTH_LANDSCAPE),\n canDeviceFitSidebar: width > sidebarBreakpoint,\n });\n };\n this.onResize = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.withBatchedUpdates)(() => {\n this.scene\n .getElementsIncludingDeleted()\n .forEach((element) => (0,_renderer_renderElement__WEBPACK_IMPORTED_MODULE_29__.invalidateShapeForElement)(element));\n this.setState({});\n });\n this.onScroll = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.debounce)(() => {\n const { offsetTop, offsetLeft } = this.getCanvasOffsets();\n this.setState((state) => {\n if (state.offsetLeft === offsetLeft && state.offsetTop === offsetTop) {\n return null;\n }\n return { offsetTop, offsetLeft };\n });\n }, _constants__WEBPACK_IMPORTED_MODULE_12__.SCROLL_TIMEOUT);\n // Copy/paste\n this.onCut = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.withBatchedUpdates)((event) => {\n var _a;\n const isExcalidrawActive = (_a = this.excalidrawContainerRef.current) === null || _a === void 0 ? void 0 : _a.contains(document.activeElement);\n if (!isExcalidrawActive || (0,_utils__WEBPACK_IMPORTED_MODULE_34__.isWritableElement)(event.target)) {\n return;\n }\n this.cutAll();\n event.preventDefault();\n event.stopPropagation();\n });\n this.onCopy = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.withBatchedUpdates)((event) => {\n var _a;\n const isExcalidrawActive = (_a = this.excalidrawContainerRef.current) === null || _a === void 0 ? void 0 : _a.contains(document.activeElement);\n if (!isExcalidrawActive || (0,_utils__WEBPACK_IMPORTED_MODULE_34__.isWritableElement)(event.target)) {\n return;\n }\n this.copyAll();\n event.preventDefault();\n event.stopPropagation();\n });\n this.cutAll = () => {\n this.actionManager.executeAction(_actions__WEBPACK_IMPORTED_MODULE_5__.actionCut, \"keyboard\");\n };\n this.copyAll = () => {\n this.actionManager.executeAction(_actions__WEBPACK_IMPORTED_MODULE_5__.actionCopy, \"keyboard\");\n };\n this.onTapStart = (event) => {\n // fix for Apple Pencil Scribble\n // On Android, preventing the event would disable contextMenu on tap-hold\n if (!_keys__WEBPACK_IMPORTED_MODULE_26__.isAndroid) {\n event.preventDefault();\n }\n if (!didTapTwice) {\n didTapTwice = true;\n clearTimeout(tappedTwiceTimer);\n tappedTwiceTimer = window.setTimeout(App.resetTapTwice, _constants__WEBPACK_IMPORTED_MODULE_12__.TAP_TWICE_TIMEOUT);\n return;\n }\n // insert text only if we tapped twice with a single finger\n // event.touches.length === 1 will also prevent inserting text when user's zooming\n if (didTapTwice && event.touches.length === 1) {\n const [touch] = event.touches;\n // @ts-ignore\n this.handleCanvasDoubleClick({\n clientX: touch.clientX,\n clientY: touch.clientY,\n });\n didTapTwice = false;\n clearTimeout(tappedTwiceTimer);\n }\n if (_keys__WEBPACK_IMPORTED_MODULE_26__.isAndroid) {\n event.preventDefault();\n }\n if (event.touches.length === 2) {\n this.setState({\n selectedElementIds: {},\n });\n }\n };\n this.onTapEnd = (event) => {\n this.resetContextMenuTimer();\n if (event.touches.length > 0) {\n this.setState({\n previousSelectedElementIds: {},\n selectedElementIds: this.state.previousSelectedElementIds,\n });\n }\n else {\n gesture.pointers.clear();\n }\n };\n this.pasteFromClipboard = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.withBatchedUpdates)((event) => __awaiter(this, void 0, void 0, function* () {\n var _c, _d;\n // #686\n const target = document.activeElement;\n const isExcalidrawActive = (_c = this.excalidrawContainerRef.current) === null || _c === void 0 ? void 0 : _c.contains(target);\n if (!isExcalidrawActive) {\n return;\n }\n const elementUnderCursor = document.elementFromPoint(cursorX, cursorY);\n if (\n // if no ClipboardEvent supplied, assume we're pasting via contextMenu\n // thus these checks don't make sense\n event &&\n (!(elementUnderCursor instanceof HTMLCanvasElement) ||\n (0,_utils__WEBPACK_IMPORTED_MODULE_34__.isWritableElement)(target))) {\n return;\n }\n // must be called in the same frame (thus before any awaits) as the paste\n // event else some browsers (FF...) will clear the clipboardData\n // (something something security)\n let file = (_d = event === null || event === void 0 ? void 0 : event.clipboardData) === null || _d === void 0 ? void 0 : _d.files[0];\n const data = yield (0,_clipboard__WEBPACK_IMPORTED_MODULE_11__.parseClipboard)(event);\n if (!file && data.text) {\n const string = data.text.trim();\n if (string.startsWith(\"<svg\") && string.endsWith(\"</svg>\")) {\n // ignore SVG validation/normalization which will be done during image\n // initialization\n file = (0,_data_blob__WEBPACK_IMPORTED_MODULE_39__.SVGStringToFile)(string);\n }\n }\n // prefer spreadsheet data over image file (MS Office/Libre Office)\n if ((0,_data_blob__WEBPACK_IMPORTED_MODULE_39__.isSupportedImageFile)(file) && !data.spreadsheet) {\n const { x: sceneX, y: sceneY } = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.viewportCoordsToSceneCoords)({ clientX: cursorX, clientY: cursorY }, this.state);\n const imageElement = this.createImageElement({ sceneX, sceneY });\n this.insertImageElement(imageElement, file);\n this.initializeImageDimensions(imageElement);\n this.setState({ selectedElementIds: { [imageElement.id]: true } });\n return;\n }\n if (this.props.onPaste) {\n try {\n if ((yield this.props.onPaste(data, event)) === false) {\n return;\n }\n }\n catch (error) {\n console.error(error);\n }\n }\n if (data.errorMessage) {\n this.setState({ errorMessage: data.errorMessage });\n }\n else if (data.spreadsheet) {\n this.setState({\n pasteDialog: {\n data: data.spreadsheet,\n shown: true,\n },\n });\n }\n else if (data.elements) {\n this.addElementsFromPasteOrLibrary({\n elements: data.elements,\n files: data.files || null,\n position: \"cursor\",\n });\n }\n else if (data.text) {\n this.addTextFromPaste(data.text);\n }\n this.setActiveTool({ type: \"selection\" });\n event === null || event === void 0 ? void 0 : event.preventDefault();\n }));\n this.addElementsFromPasteOrLibrary = (opts) => {\n const elements = (0,_data_restore__WEBPACK_IMPORTED_MODULE_15__.restoreElements)(opts.elements, null);\n const [minX, minY, maxX, maxY] = (0,_element__WEBPACK_IMPORTED_MODULE_16__.getCommonBounds)(elements);\n const elementsCenterX = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.distance)(minX, maxX) / 2;\n const elementsCenterY = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.distance)(minY, maxY) / 2;\n const clientX = typeof opts.position === \"object\"\n ? opts.position.clientX\n : opts.position === \"cursor\"\n ? cursorX\n : this.state.width / 2 + this.state.offsetLeft;\n const clientY = typeof opts.position === \"object\"\n ? opts.position.clientY\n : opts.position === \"cursor\"\n ? cursorY\n : this.state.height / 2 + this.state.offsetTop;\n const { x, y } = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.viewportCoordsToSceneCoords)({ clientX, clientY }, this.state);\n const dx = x - elementsCenterX;\n const dy = y - elementsCenterY;\n const groupIdMap = new Map();\n const [gridX, gridY] = (0,_math__WEBPACK_IMPORTED_MODULE_27__.getGridPoint)(dx, dy, this.state.gridSize);\n const oldIdToDuplicatedId = new Map();\n const newElements = elements.map((element) => {\n const newElement = (0,_element__WEBPACK_IMPORTED_MODULE_16__.duplicateElement)(this.state.editingGroupId, groupIdMap, element, {\n x: element.x + gridX - minX,\n y: element.y + gridY - minY,\n });\n oldIdToDuplicatedId.set(element.id, newElement.id);\n return newElement;\n });\n (0,_element_textElement__WEBPACK_IMPORTED_MODULE_43__.bindTextToShapeAfterDuplication)(newElements, elements, oldIdToDuplicatedId);\n const nextElements = [\n ...this.scene.getElementsIncludingDeleted(),\n ...newElements,\n ];\n (0,_element_binding__WEBPACK_IMPORTED_MODULE_17__.fixBindingsAfterDuplication)(nextElements, elements, oldIdToDuplicatedId);\n if (opts.files) {\n this.files = Object.assign(Object.assign({}, this.files), opts.files);\n }\n this.scene.replaceAllElements(nextElements);\n this.history.resumeRecording();\n this.setState((0,_groups__WEBPACK_IMPORTED_MODULE_23__.selectGroupsForSelectedElements)(Object.assign(Object.assign({}, this.state), { isLibraryOpen: this.state.isLibraryOpen && this.device.canDeviceFitSidebar\n ? this.state.isLibraryMenuDocked\n : false, selectedElementIds: newElements.reduce((acc, element) => {\n if (!(0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_21__.isBoundToContainer)(element)) {\n acc[element.id] = true;\n }\n return acc;\n }, {}), selectedGroupIds: {} }), this.scene.getNonDeletedElements()), () => {\n if (opts.files) {\n this.addNewImagesToImageCache();\n }\n });\n this.setActiveTool({ type: \"selection\" });\n };\n // Collaboration\n this.setAppState = (obj) => {\n this.setState(obj);\n };\n this.removePointer = (event) => {\n if (touchTimeout) {\n this.resetContextMenuTimer();\n }\n gesture.pointers.delete(event.pointerId);\n };\n this.toggleLock = (source = \"ui\") => {\n if (!this.state.activeTool.locked) {\n (0,_analytics__WEBPACK_IMPORTED_MODULE_9__.trackEvent)(\"toolbar\", \"toggleLock\", `${source} (${this.device.isMobile ? \"mobile\" : \"desktop\"})`);\n }\n this.setState((prevState) => {\n return {\n activeTool: Object.assign(Object.assign(Object.assign({}, prevState.activeTool), (0,_utils__WEBPACK_IMPORTED_MODULE_34__.updateActiveTool)(this.state, prevState.activeTool.locked\n ? { type: \"selection\" }\n : prevState.activeTool)), { locked: !prevState.activeTool.locked }),\n };\n });\n };\n this.togglePenMode = () => {\n this.setState((prevState) => {\n return {\n penMode: !prevState.penMode,\n };\n });\n };\n this.scrollToContent = (target = this.scene.getNonDeletedElements()) => {\n this.setState(Object.assign({}, (0,_scene__WEBPACK_IMPORTED_MODULE_30__.calculateScrollCenter)(Array.isArray(target) ? target : [target], this.state, this.canvas)));\n };\n this.setToast = (toast) => {\n this.setState({ toast });\n };\n this.restoreFileFromShare = () => __awaiter(this, void 0, void 0, function* () {\n try {\n const webShareTargetCache = yield caches.open(\"web-share-target\");\n const response = yield webShareTargetCache.match(\"shared-file\");\n if (response) {\n const blob = yield response.blob();\n const file = new File([blob], blob.name || \"\", { type: blob.type });\n this.loadFileToCanvas(file, null);\n yield webShareTargetCache.delete(\"shared-file\");\n window.history.replaceState(null, _constants__WEBPACK_IMPORTED_MODULE_12__.APP_NAME, window.location.pathname);\n }\n }\n catch (error) {\n this.setState({ errorMessage: error.message });\n }\n });\n /** adds supplied files to existing files in the appState */\n this.addFiles = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.withBatchedUpdates)((files) => {\n const filesMap = files.reduce((acc, fileData) => {\n acc.set(fileData.id, fileData);\n return acc;\n }, new Map());\n this.files = Object.assign(Object.assign({}, this.files), Object.fromEntries(filesMap));\n this.scene.getNonDeletedElements().forEach((element) => {\n if ((0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_21__.isInitializedImageElement)(element) &&\n filesMap.has(element.fileId)) {\n this.imageCache.delete(element.fileId);\n (0,_renderer_renderElement__WEBPACK_IMPORTED_MODULE_29__.invalidateShapeForElement)(element);\n }\n });\n this.scene.informMutation();\n this.addNewImagesToImageCache();\n });\n this.updateScene = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.withBatchedUpdates)((sceneData) => {\n if (sceneData.commitToHistory) {\n this.history.resumeRecording();\n }\n if (sceneData.appState) {\n this.setState(sceneData.appState);\n }\n if (sceneData.elements) {\n this.scene.replaceAllElements(sceneData.elements);\n }\n if (sceneData.collaborators) {\n this.setState({ collaborators: sceneData.collaborators });\n }\n });\n this.onSceneUpdated = () => {\n this.setState({});\n };\n this.updateCurrentCursorPosition = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.withBatchedUpdates)((event) => {\n cursorX = event.clientX;\n cursorY = event.clientY;\n });\n // Input handling\n this.onKeyDown = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.withBatchedUpdates)((event) => {\n // normalize `event.key` when CapsLock is pressed #2372\n if (\"Proxy\" in window &&\n ((!event.shiftKey && /^[A-Z]$/.test(event.key)) ||\n (event.shiftKey && /^[a-z]$/.test(event.key)))) {\n event = new Proxy(event, {\n get(ev, prop) {\n const value = ev[prop];\n if (typeof value === \"function\") {\n // fix for Proxies hijacking `this`\n return value.bind(ev);\n }\n return prop === \"key\"\n ? // CapsLock inverts capitalization based on ShiftKey, so invert\n // it back\n event.shiftKey\n ? ev.key.toUpperCase()\n : ev.key.toLowerCase()\n : value;\n },\n });\n }\n // prevent browser zoom in input fields\n if (event[_keys__WEBPACK_IMPORTED_MODULE_26__.KEYS.CTRL_OR_CMD] && (0,_utils__WEBPACK_IMPORTED_MODULE_34__.isWritableElement)(event.target)) {\n if (event.code === _keys__WEBPACK_IMPORTED_MODULE_26__.CODES.MINUS || event.code === _keys__WEBPACK_IMPORTED_MODULE_26__.CODES.EQUAL) {\n event.preventDefault();\n return;\n }\n }\n // bail if\n if (\n // inside an input\n ((0,_utils__WEBPACK_IMPORTED_MODULE_34__.isWritableElement)(event.target) &&\n // unless pressing escape (finalize action)\n event.key !== _keys__WEBPACK_IMPORTED_MODULE_26__.KEYS.ESCAPE) ||\n // or unless using arrows (to move between buttons)\n ((0,_keys__WEBPACK_IMPORTED_MODULE_26__.isArrowKey)(event.key) && (0,_utils__WEBPACK_IMPORTED_MODULE_34__.isInputLike)(event.target))) {\n return;\n }\n if (event.key === _keys__WEBPACK_IMPORTED_MODULE_26__.KEYS.QUESTION_MARK) {\n this.setState({\n showHelpDialog: true,\n });\n }\n if (this.actionManager.handleKeyDown(event)) {\n return;\n }\n if (this.state.viewModeEnabled) {\n return;\n }\n if (event[_keys__WEBPACK_IMPORTED_MODULE_26__.KEYS.CTRL_OR_CMD] && this.state.isBindingEnabled) {\n this.setState({ isBindingEnabled: false });\n }\n if (event.code === _keys__WEBPACK_IMPORTED_MODULE_26__.CODES.ZERO) {\n const nextState = !this.state.isLibraryOpen;\n this.setState({ isLibraryOpen: nextState });\n // track only openings\n if (nextState) {\n (0,_analytics__WEBPACK_IMPORTED_MODULE_9__.trackEvent)(\"library\", \"toggleLibrary (open)\", `keyboard (${this.device.isMobile ? \"mobile\" : \"desktop\"})`);\n }\n }\n if ((0,_keys__WEBPACK_IMPORTED_MODULE_26__.isArrowKey)(event.key)) {\n const step = (this.state.gridSize &&\n (event.shiftKey\n ? _constants__WEBPACK_IMPORTED_MODULE_12__.ELEMENT_TRANSLATE_AMOUNT\n : this.state.gridSize)) ||\n (event.shiftKey\n ? _constants__WEBPACK_IMPORTED_MODULE_12__.ELEMENT_SHIFT_TRANSLATE_AMOUNT\n : _constants__WEBPACK_IMPORTED_MODULE_12__.ELEMENT_TRANSLATE_AMOUNT);\n const selectedElements = (0,_scene__WEBPACK_IMPORTED_MODULE_30__.getSelectedElements)(this.scene.getNonDeletedElements(), this.state, true);\n let offsetX = 0;\n let offsetY = 0;\n if (event.key === _keys__WEBPACK_IMPORTED_MODULE_26__.KEYS.ARROW_LEFT) {\n offsetX = -step;\n }\n else if (event.key === _keys__WEBPACK_IMPORTED_MODULE_26__.KEYS.ARROW_RIGHT) {\n offsetX = step;\n }\n else if (event.key === _keys__WEBPACK_IMPORTED_MODULE_26__.KEYS.ARROW_UP) {\n offsetY = -step;\n }\n else if (event.key === _keys__WEBPACK_IMPORTED_MODULE_26__.KEYS.ARROW_DOWN) {\n offsetY = step;\n }\n selectedElements.forEach((element) => {\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_19__.mutateElement)(element, {\n x: element.x + offsetX,\n y: element.y + offsetY,\n });\n (0,_element_binding__WEBPACK_IMPORTED_MODULE_17__.updateBoundElements)(element, {\n simultaneouslyUpdated: selectedElements,\n });\n });\n this.maybeSuggestBindingForAll(selectedElements);\n event.preventDefault();\n }\n else if (event.key === _keys__WEBPACK_IMPORTED_MODULE_26__.KEYS.ENTER) {\n const selectedElements = (0,_scene__WEBPACK_IMPORTED_MODULE_30__.getSelectedElements)(this.scene.getNonDeletedElements(), this.state);\n if (selectedElements.length === 1) {\n if ((0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_21__.isLinearElement)(selectedElements[0])) {\n if (!this.state.editingLinearElement ||\n this.state.editingLinearElement.elementId !==\n selectedElements[0].id) {\n this.history.resumeRecording();\n this.setState({\n editingLinearElement: new _element_linearElementEditor__WEBPACK_IMPORTED_MODULE_18__.LinearElementEditor(selectedElements[0], this.scene),\n });\n }\n }\n else {\n const selectedElement = selectedElements[0];\n this.startTextEditing({\n sceneX: selectedElement.x + selectedElement.width / 2,\n sceneY: selectedElement.y + selectedElement.height / 2,\n shouldBind: true,\n });\n event.preventDefault();\n return;\n }\n }\n }\n else if (!event.ctrlKey &&\n !event.altKey &&\n !event.metaKey &&\n this.state.draggingElement === null) {\n const shape = (0,_shapes__WEBPACK_IMPORTED_MODULE_33__.findShapeByKey)(event.key);\n if (shape) {\n if (this.state.activeTool.type !== shape) {\n (0,_analytics__WEBPACK_IMPORTED_MODULE_9__.trackEvent)(\"toolbar\", shape, `keyboard (${this.device.isMobile ? \"mobile\" : \"desktop\"})`);\n }\n this.setActiveTool({ type: shape });\n event.stopPropagation();\n }\n else if (event.key === _keys__WEBPACK_IMPORTED_MODULE_26__.KEYS.Q) {\n this.toggleLock(\"keyboard\");\n event.stopPropagation();\n }\n }\n if (event.key === _keys__WEBPACK_IMPORTED_MODULE_26__.KEYS.SPACE && gesture.pointers.size === 0) {\n isHoldingSpace = true;\n (0,_utils__WEBPACK_IMPORTED_MODULE_34__.setCursor)(this.canvas, _constants__WEBPACK_IMPORTED_MODULE_12__.CURSOR_TYPE.GRABBING);\n event.preventDefault();\n }\n if ((event.key === _keys__WEBPACK_IMPORTED_MODULE_26__.KEYS.G || event.key === _keys__WEBPACK_IMPORTED_MODULE_26__.KEYS.S) &&\n !event.altKey &&\n !event[_keys__WEBPACK_IMPORTED_MODULE_26__.KEYS.CTRL_OR_CMD]) {\n const selectedElements = (0,_scene__WEBPACK_IMPORTED_MODULE_30__.getSelectedElements)(this.scene.getNonDeletedElements(), this.state);\n if (this.state.activeTool.type === \"selection\" &&\n !selectedElements.length) {\n return;\n }\n if (event.key === _keys__WEBPACK_IMPORTED_MODULE_26__.KEYS.G &&\n ((0,_scene__WEBPACK_IMPORTED_MODULE_30__.hasBackground)(this.state.activeTool.type) ||\n selectedElements.some((element) => (0,_scene__WEBPACK_IMPORTED_MODULE_30__.hasBackground)(element.type)))) {\n this.setState({ openPopup: \"backgroundColorPicker\" });\n event.stopPropagation();\n }\n if (event.key === _keys__WEBPACK_IMPORTED_MODULE_26__.KEYS.S) {\n this.setState({ openPopup: \"strokeColorPicker\" });\n event.stopPropagation();\n }\n }\n });\n this.onWheel = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.withBatchedUpdates)((event) => {\n // prevent browser pinch zoom on DOM elements\n if (!(event.target instanceof HTMLCanvasElement) && event.ctrlKey) {\n event.preventDefault();\n }\n });\n this.onKeyUp = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.withBatchedUpdates)((event) => {\n if (event.key === _keys__WEBPACK_IMPORTED_MODULE_26__.KEYS.SPACE) {\n if (this.state.viewModeEnabled) {\n (0,_utils__WEBPACK_IMPORTED_MODULE_34__.setCursor)(this.canvas, _constants__WEBPACK_IMPORTED_MODULE_12__.CURSOR_TYPE.GRAB);\n }\n else if (this.state.activeTool.type === \"selection\") {\n (0,_utils__WEBPACK_IMPORTED_MODULE_34__.resetCursor)(this.canvas);\n }\n else {\n (0,_utils__WEBPACK_IMPORTED_MODULE_34__.setCursorForShape)(this.canvas, this.state);\n this.setState({\n selectedElementIds: {},\n selectedGroupIds: {},\n editingGroupId: null,\n });\n }\n isHoldingSpace = false;\n }\n if (!event[_keys__WEBPACK_IMPORTED_MODULE_26__.KEYS.CTRL_OR_CMD] && !this.state.isBindingEnabled) {\n this.setState({ isBindingEnabled: true });\n }\n if ((0,_keys__WEBPACK_IMPORTED_MODULE_26__.isArrowKey)(event.key)) {\n const selectedElements = (0,_scene__WEBPACK_IMPORTED_MODULE_30__.getSelectedElements)(this.scene.getNonDeletedElements(), this.state);\n (0,_element_binding__WEBPACK_IMPORTED_MODULE_17__.isBindingEnabled)(this.state)\n ? (0,_element_binding__WEBPACK_IMPORTED_MODULE_17__.bindOrUnbindSelectedElements)(selectedElements)\n : (0,_element_binding__WEBPACK_IMPORTED_MODULE_17__.unbindLinearElements)(selectedElements);\n this.setState({ suggestedBindings: [] });\n }\n });\n this.setActiveTool = (tool) => {\n const nextActiveTool = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.updateActiveTool)(this.state, tool);\n if (!isHoldingSpace) {\n (0,_utils__WEBPACK_IMPORTED_MODULE_34__.setCursorForShape)(this.canvas, this.state);\n }\n if ((0,_utils__WEBPACK_IMPORTED_MODULE_34__.isToolIcon)(document.activeElement)) {\n this.focusContainer();\n }\n if (!(0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_21__.isLinearElementType)(nextActiveTool.type)) {\n this.setState({ suggestedBindings: [] });\n }\n if (nextActiveTool.type === \"image\") {\n this.onImageAction();\n }\n if (nextActiveTool.type !== \"selection\") {\n this.setState({\n activeTool: nextActiveTool,\n selectedElementIds: {},\n selectedGroupIds: {},\n editingGroupId: null,\n });\n }\n else {\n this.setState({ activeTool: nextActiveTool });\n }\n };\n this.setCursor = (cursor) => {\n (0,_utils__WEBPACK_IMPORTED_MODULE_34__.setCursor)(this.canvas, cursor);\n };\n this.resetCursor = () => {\n (0,_utils__WEBPACK_IMPORTED_MODULE_34__.resetCursor)(this.canvas);\n };\n /**\n * returns whether user is making a gesture with >= 2 fingers (points)\n * on o touch screen (not on a trackpad). Currently only relates to Darwin\n * (iOS/iPadOS,MacOS), but may work on other devices in the future if\n * GestureEvent is standardized.\n */\n this.isTouchScreenMultiTouchGesture = () => {\n // we don't want to deselect when using trackpad, and multi-point gestures\n // only work on touch screens, so checking for >= pointers means we're on a\n // touchscreen\n return gesture.pointers.size >= 2;\n };\n // fires only on Safari\n this.onGestureStart = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.withBatchedUpdates)((event) => {\n event.preventDefault();\n // we only want to deselect on touch screens because user may have selected\n // elements by mistake while zooming\n if (this.isTouchScreenMultiTouchGesture()) {\n this.setState({\n selectedElementIds: {},\n });\n }\n gesture.initialScale = this.state.zoom.value;\n });\n // fires only on Safari\n this.onGestureChange = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.withBatchedUpdates)((event) => {\n event.preventDefault();\n // onGestureChange only has zoom factor but not the center.\n // If we're on iPad or iPhone, then we recognize multi-touch and will\n // zoom in at the right location in the touchmove handler\n // (handleCanvasPointerMove).\n //\n // On Macbook trackpad, we don't have those events so will zoom in at the\n // current location instead.\n //\n // As such, bail from this handler on touch devices.\n if (this.isTouchScreenMultiTouchGesture()) {\n return;\n }\n const initialScale = gesture.initialScale;\n if (initialScale) {\n this.setState((state) => (Object.assign({}, (0,_scene_zoom__WEBPACK_IMPORTED_MODULE_32__.getStateForZoom)({\n viewportX: cursorX,\n viewportY: cursorY,\n nextZoom: (0,_scene__WEBPACK_IMPORTED_MODULE_30__.getNormalizedZoom)(initialScale * event.scale),\n }, state))));\n }\n });\n // fires only on Safari\n this.onGestureEnd = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.withBatchedUpdates)((event) => {\n event.preventDefault();\n // reselect elements only on touch screens (see onGestureStart)\n if (this.isTouchScreenMultiTouchGesture()) {\n this.setState({\n previousSelectedElementIds: {},\n selectedElementIds: this.state.previousSelectedElementIds,\n });\n }\n gesture.initialScale = null;\n });\n this.startTextEditing = ({ sceneX, sceneY, shouldBind, insertAtParentCenter = true, }) => {\n var _a, _b;\n let parentCenterPosition = insertAtParentCenter &&\n this.getTextWysiwygSnappedToCenterPosition(sceneX, sceneY, this.state, this.canvas, window.devicePixelRatio);\n let existingTextElement = null;\n let container = null;\n const selectedElements = (0,_scene__WEBPACK_IMPORTED_MODULE_30__.getSelectedElements)(this.scene.getNonDeletedElements(), this.state);\n if (selectedElements.length === 1) {\n if ((0,_element__WEBPACK_IMPORTED_MODULE_16__.isTextElement)(selectedElements[0])) {\n existingTextElement = selectedElements[0];\n }\n else if ((0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_21__.isTextBindableContainer)(selectedElements[0], false)) {\n existingTextElement = (0,_element_textElement__WEBPACK_IMPORTED_MODULE_43__.getBoundTextElement)(selectedElements[0]);\n }\n else {\n existingTextElement = this.getTextElementAtPosition(sceneX, sceneY);\n }\n }\n else {\n existingTextElement = this.getTextElementAtPosition(sceneX, sceneY);\n }\n // bind to container when shouldBind is true or\n // clicked on center of container\n if (!container &&\n !existingTextElement &&\n (shouldBind || parentCenterPosition)) {\n container = (0,_scene__WEBPACK_IMPORTED_MODULE_30__.getTextBindableContainerAtPosition)(this.scene\n .getNonDeletedElements()\n .filter((ele) => (0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_21__.isTextBindableContainer)(ele, false) && !(0,_element_textElement__WEBPACK_IMPORTED_MODULE_43__.getBoundTextElement)(ele)), sceneX, sceneY);\n }\n if (!existingTextElement && container) {\n const fontString = {\n fontSize: this.state.currentItemFontSize,\n fontFamily: this.state.currentItemFontFamily,\n };\n const minWidth = (0,_element_textElement__WEBPACK_IMPORTED_MODULE_43__.getApproxMinLineWidth)((0,_utils__WEBPACK_IMPORTED_MODULE_34__.getFontString)(fontString));\n const minHeight = (0,_element_textElement__WEBPACK_IMPORTED_MODULE_43__.getApproxMinLineHeight)((0,_utils__WEBPACK_IMPORTED_MODULE_34__.getFontString)(fontString));\n const newHeight = Math.max(container.height, minHeight);\n const newWidth = Math.max(container.width, minWidth);\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_19__.mutateElement)(container, { height: newHeight, width: newWidth });\n sceneX = container.x + newWidth / 2;\n sceneY = container.y + newHeight / 2;\n if (parentCenterPosition) {\n parentCenterPosition = this.getTextWysiwygSnappedToCenterPosition(sceneX, sceneY, this.state, this.canvas, window.devicePixelRatio);\n }\n }\n const element = existingTextElement\n ? existingTextElement\n : (0,_element__WEBPACK_IMPORTED_MODULE_16__.newTextElement)({\n x: parentCenterPosition\n ? parentCenterPosition.elementCenterX\n : sceneX,\n y: parentCenterPosition\n ? parentCenterPosition.elementCenterY\n : sceneY,\n strokeColor: this.state.currentItemStrokeColor,\n backgroundColor: this.state.currentItemBackgroundColor,\n fillStyle: this.state.currentItemFillStyle,\n strokeWidth: this.state.currentItemStrokeWidth,\n strokeStyle: this.state.currentItemStrokeStyle,\n roughness: this.state.currentItemRoughness,\n opacity: this.state.currentItemOpacity,\n strokeSharpness: this.state.currentItemStrokeSharpness,\n text: \"\",\n fontSize: this.state.currentItemFontSize,\n fontFamily: this.state.currentItemFontFamily,\n textAlign: parentCenterPosition\n ? \"center\"\n : this.state.currentItemTextAlign,\n verticalAlign: parentCenterPosition\n ? _constants__WEBPACK_IMPORTED_MODULE_12__.VERTICAL_ALIGN.MIDDLE\n : _constants__WEBPACK_IMPORTED_MODULE_12__.DEFAULT_VERTICAL_ALIGN,\n containerId: (_a = container === null || container === void 0 ? void 0 : container.id) !== null && _a !== void 0 ? _a : undefined,\n groupIds: (_b = container === null || container === void 0 ? void 0 : container.groupIds) !== null && _b !== void 0 ? _b : [],\n locked: false,\n });\n this.setState({ editingElement: element });\n if (!existingTextElement) {\n this.scene.replaceAllElements([\n ...this.scene.getElementsIncludingDeleted(),\n element,\n ]);\n // case: creating new text not centered to parent element → offset Y\n // so that the text is centered to cursor position\n if (!parentCenterPosition) {\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_19__.mutateElement)(element, {\n y: element.y - element.baseline / 2,\n });\n }\n }\n this.setState({\n editingElement: element,\n });\n this.handleTextWysiwyg(element, {\n isExistingElement: !!existingTextElement,\n });\n };\n this.handleCanvasDoubleClick = (event) => {\n // case: double-clicking with arrow/line tool selected would both create\n // text and enter multiElement mode\n if (this.state.multiElement) {\n return;\n }\n // we should only be able to double click when mode is selection\n if (this.state.activeTool.type !== \"selection\") {\n return;\n }\n const selectedElements = (0,_scene__WEBPACK_IMPORTED_MODULE_30__.getSelectedElements)(this.scene.getNonDeletedElements(), this.state);\n if (selectedElements.length === 1 && (0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_21__.isLinearElement)(selectedElements[0])) {\n if (!this.state.editingLinearElement ||\n this.state.editingLinearElement.elementId !== selectedElements[0].id) {\n this.history.resumeRecording();\n this.setState({\n editingLinearElement: new _element_linearElementEditor__WEBPACK_IMPORTED_MODULE_18__.LinearElementEditor(selectedElements[0], this.scene),\n });\n }\n return;\n }\n (0,_utils__WEBPACK_IMPORTED_MODULE_34__.resetCursor)(this.canvas);\n let { x: sceneX, y: sceneY } = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.viewportCoordsToSceneCoords)(event, this.state);\n const selectedGroupIds = (0,_groups__WEBPACK_IMPORTED_MODULE_23__.getSelectedGroupIds)(this.state);\n if (selectedGroupIds.length > 0) {\n const hitElement = this.getElementAtPosition(sceneX, sceneY);\n const selectedGroupId = hitElement &&\n (0,_groups__WEBPACK_IMPORTED_MODULE_23__.getSelectedGroupIdForElement)(hitElement, this.state.selectedGroupIds);\n if (selectedGroupId) {\n this.setState((prevState) => (0,_groups__WEBPACK_IMPORTED_MODULE_23__.selectGroupsForSelectedElements)(Object.assign(Object.assign({}, prevState), { editingGroupId: selectedGroupId, selectedElementIds: { [hitElement.id]: true }, selectedGroupIds: {} }), this.scene.getNonDeletedElements()));\n return;\n }\n }\n (0,_utils__WEBPACK_IMPORTED_MODULE_34__.resetCursor)(this.canvas);\n if (!event[_keys__WEBPACK_IMPORTED_MODULE_26__.KEYS.CTRL_OR_CMD] && !this.state.viewModeEnabled) {\n const selectedElements = (0,_scene__WEBPACK_IMPORTED_MODULE_30__.getSelectedElements)(this.scene.getNonDeletedElements(), this.state);\n if (selectedElements.length === 1) {\n const selectedElement = selectedElements[0];\n const canBindText = (0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_21__.hasBoundTextElement)(selectedElement);\n if (canBindText) {\n sceneX = selectedElement.x + selectedElement.width / 2;\n sceneY = selectedElement.y + selectedElement.height / 2;\n }\n }\n this.startTextEditing({\n sceneX,\n sceneY,\n shouldBind: false,\n insertAtParentCenter: !event.altKey,\n });\n }\n };\n this.getElementLinkAtPosition = (scenePointer, hitElement) => {\n // Reversing so we traverse the elements in decreasing order\n // of z-index\n const elements = this.scene.getNonDeletedElements().slice().reverse();\n let hitElementIndex = Infinity;\n return elements.find((element, index) => {\n if (hitElement && element.id === hitElement.id) {\n hitElementIndex = index;\n }\n return (element.link &&\n index <= hitElementIndex &&\n (0,_element_Hyperlink__WEBPACK_IMPORTED_MODULE_45__.isPointHittingLinkIcon)(element, this.state, [scenePointer.x, scenePointer.y], this.device.isMobile));\n });\n };\n this.redirectToLink = (event, isTouchScreen) => {\n const draggedDistance = (0,_math__WEBPACK_IMPORTED_MODULE_27__.distance2d)(this.lastPointerDown.clientX, this.lastPointerDown.clientY, this.lastPointerUp.clientX, this.lastPointerUp.clientY);\n if (!this.hitLinkElement ||\n // For touch screen allow dragging threshold else strict check\n (isTouchScreen && draggedDistance > _constants__WEBPACK_IMPORTED_MODULE_12__.DRAGGING_THRESHOLD) ||\n (!isTouchScreen && draggedDistance !== 0)) {\n return;\n }\n const lastPointerDownCoords = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.viewportCoordsToSceneCoords)(this.lastPointerDown, this.state);\n const lastPointerDownHittingLinkIcon = (0,_element_Hyperlink__WEBPACK_IMPORTED_MODULE_45__.isPointHittingLinkIcon)(this.hitLinkElement, this.state, [lastPointerDownCoords.x, lastPointerDownCoords.y], this.device.isMobile);\n const lastPointerUpCoords = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.viewportCoordsToSceneCoords)(this.lastPointerUp, this.state);\n const lastPointerUpHittingLinkIcon = (0,_element_Hyperlink__WEBPACK_IMPORTED_MODULE_45__.isPointHittingLinkIcon)(this.hitLinkElement, this.state, [lastPointerUpCoords.x, lastPointerUpCoords.y], this.device.isMobile);\n if (lastPointerDownHittingLinkIcon && lastPointerUpHittingLinkIcon) {\n const url = this.hitLinkElement.link;\n if (url) {\n let customEvent;\n if (this.props.onLinkOpen) {\n customEvent = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.wrapEvent)(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.EXCALIDRAW_LINK, event.nativeEvent);\n this.props.onLinkOpen(this.hitLinkElement, customEvent);\n }\n if (!(customEvent === null || customEvent === void 0 ? void 0 : customEvent.defaultPrevented)) {\n const target = (0,_element_Hyperlink__WEBPACK_IMPORTED_MODULE_45__.isLocalLink)(url) ? \"_self\" : \"_blank\";\n const newWindow = window.open(undefined, target);\n // https://mathiasbynens.github.io/rel-noopener/\n if (newWindow) {\n newWindow.opener = null;\n newWindow.location = (0,_element_Hyperlink__WEBPACK_IMPORTED_MODULE_45__.normalizeLink)(url);\n }\n }\n }\n }\n };\n this.handleCanvasPointerMove = (event) => {\n var _a;\n this.savePointer(event.clientX, event.clientY, this.state.cursorButton);\n if (gesture.pointers.has(event.pointerId)) {\n gesture.pointers.set(event.pointerId, {\n x: event.clientX,\n y: event.clientY,\n });\n }\n const initialScale = gesture.initialScale;\n if (gesture.pointers.size === 2 &&\n gesture.lastCenter &&\n initialScale &&\n gesture.initialDistance) {\n const center = (0,_gesture__WEBPACK_IMPORTED_MODULE_22__.getCenter)(gesture.pointers);\n const deltaX = center.x - gesture.lastCenter.x;\n const deltaY = center.y - gesture.lastCenter.y;\n gesture.lastCenter = center;\n const distance = (0,_gesture__WEBPACK_IMPORTED_MODULE_22__.getDistance)(Array.from(gesture.pointers.values()));\n const scaleFactor = this.state.activeTool.type === \"freedraw\" && this.state.penMode\n ? 1\n : distance / gesture.initialDistance;\n const nextZoom = scaleFactor\n ? (0,_scene__WEBPACK_IMPORTED_MODULE_30__.getNormalizedZoom)(initialScale * scaleFactor)\n : this.state.zoom.value;\n this.setState((state) => {\n const zoomState = (0,_scene_zoom__WEBPACK_IMPORTED_MODULE_32__.getStateForZoom)({\n viewportX: center.x,\n viewportY: center.y,\n nextZoom,\n }, state);\n return {\n zoom: zoomState.zoom,\n scrollX: zoomState.scrollX + deltaX / nextZoom,\n scrollY: zoomState.scrollY + deltaY / nextZoom,\n shouldCacheIgnoreZoom: true,\n };\n });\n this.resetShouldCacheIgnoreZoomDebounced();\n }\n else {\n gesture.lastCenter =\n gesture.initialDistance =\n gesture.initialScale =\n null;\n }\n if (isHoldingSpace || isPanning || isDraggingScrollBar) {\n return;\n }\n const isPointerOverScrollBars = (0,_scene__WEBPACK_IMPORTED_MODULE_30__.isOverScrollBars)(currentScrollBars, event.clientX - this.state.offsetLeft, event.clientY - this.state.offsetTop);\n const isOverScrollBar = isPointerOverScrollBars.isOverEither;\n if (!this.state.draggingElement && !this.state.multiElement) {\n if (isOverScrollBar) {\n (0,_utils__WEBPACK_IMPORTED_MODULE_34__.resetCursor)(this.canvas);\n }\n else {\n (0,_utils__WEBPACK_IMPORTED_MODULE_34__.setCursorForShape)(this.canvas, this.state);\n }\n }\n const scenePointer = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.viewportCoordsToSceneCoords)(event, this.state);\n const { x: scenePointerX, y: scenePointerY } = scenePointer;\n if (this.state.editingLinearElement &&\n !this.state.editingLinearElement.isDragging) {\n const editingLinearElement = _element_linearElementEditor__WEBPACK_IMPORTED_MODULE_18__.LinearElementEditor.handlePointerMove(event, scenePointerX, scenePointerY, this.state.editingLinearElement, this.state.gridSize);\n if (editingLinearElement !== this.state.editingLinearElement) {\n // Since we are reading from previous state which is not possible with\n // automatic batching in React 18 hence using flush sync to synchronously\n // update the state. Check https://github.com/excalidraw/excalidraw/pull/5508 for more details.\n (0,react_dom__WEBPACK_IMPORTED_MODULE_2__.flushSync)(() => {\n this.setState({ editingLinearElement });\n });\n }\n if (editingLinearElement.lastUncommittedPoint != null) {\n this.maybeSuggestBindingAtCursor(scenePointer);\n }\n else {\n this.setState({ suggestedBindings: [] });\n }\n }\n if ((0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_21__.isBindingElementType)(this.state.activeTool.type)) {\n // Hovering with a selected tool or creating new linear element via click\n // and point\n const { draggingElement } = this.state;\n if ((0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_21__.isBindingElement)(draggingElement, false)) {\n this.maybeSuggestBindingsForLinearElementAtCoords(draggingElement, [scenePointer], this.state.startBoundElement);\n }\n else {\n this.maybeSuggestBindingAtCursor(scenePointer);\n }\n }\n if (this.state.multiElement) {\n const { multiElement } = this.state;\n const { x: rx, y: ry } = multiElement;\n const { points, lastCommittedPoint } = multiElement;\n const lastPoint = points[points.length - 1];\n (0,_utils__WEBPACK_IMPORTED_MODULE_34__.setCursorForShape)(this.canvas, this.state);\n if (lastPoint === lastCommittedPoint) {\n // if we haven't yet created a temp point and we're beyond commit-zone\n // threshold, add a point\n if ((0,_math__WEBPACK_IMPORTED_MODULE_27__.distance2d)(scenePointerX - rx, scenePointerY - ry, lastPoint[0], lastPoint[1]) >= _constants__WEBPACK_IMPORTED_MODULE_12__.LINE_CONFIRM_THRESHOLD) {\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_19__.mutateElement)(multiElement, {\n points: [...points, [scenePointerX - rx, scenePointerY - ry]],\n });\n }\n else {\n (0,_utils__WEBPACK_IMPORTED_MODULE_34__.setCursor)(this.canvas, _constants__WEBPACK_IMPORTED_MODULE_12__.CURSOR_TYPE.POINTER);\n // in this branch, we're inside the commit zone, and no uncommitted\n // point exists. Thus do nothing (don't add/remove points).\n }\n }\n else if (points.length > 2 &&\n lastCommittedPoint &&\n (0,_math__WEBPACK_IMPORTED_MODULE_27__.distance2d)(scenePointerX - rx, scenePointerY - ry, lastCommittedPoint[0], lastCommittedPoint[1]) < _constants__WEBPACK_IMPORTED_MODULE_12__.LINE_CONFIRM_THRESHOLD) {\n (0,_utils__WEBPACK_IMPORTED_MODULE_34__.setCursor)(this.canvas, _constants__WEBPACK_IMPORTED_MODULE_12__.CURSOR_TYPE.POINTER);\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_19__.mutateElement)(multiElement, {\n points: points.slice(0, -1),\n });\n }\n else {\n const [gridX, gridY] = (0,_math__WEBPACK_IMPORTED_MODULE_27__.getGridPoint)(scenePointerX, scenePointerY, this.state.gridSize);\n const [lastCommittedX, lastCommittedY] = (_a = multiElement === null || multiElement === void 0 ? void 0 : multiElement.lastCommittedPoint) !== null && _a !== void 0 ? _a : [0, 0];\n let dxFromLastCommitted = gridX - rx - lastCommittedX;\n let dyFromLastCommitted = gridY - ry - lastCommittedY;\n if ((0,_keys__WEBPACK_IMPORTED_MODULE_26__.shouldRotateWithDiscreteAngle)(event)) {\n ({ width: dxFromLastCommitted, height: dyFromLastCommitted } =\n (0,_element__WEBPACK_IMPORTED_MODULE_16__.getPerfectElementSize)(this.state.activeTool.type, dxFromLastCommitted, dyFromLastCommitted));\n }\n if ((0,_math__WEBPACK_IMPORTED_MODULE_27__.isPathALoop)(points, this.state.zoom.value)) {\n (0,_utils__WEBPACK_IMPORTED_MODULE_34__.setCursor)(this.canvas, _constants__WEBPACK_IMPORTED_MODULE_12__.CURSOR_TYPE.POINTER);\n }\n // update last uncommitted point\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_19__.mutateElement)(multiElement, {\n points: [\n ...points.slice(0, -1),\n [\n lastCommittedX + dxFromLastCommitted,\n lastCommittedY + dyFromLastCommitted,\n ],\n ],\n });\n }\n return;\n }\n const hasDeselectedButton = Boolean(event.buttons);\n if (hasDeselectedButton ||\n (this.state.activeTool.type !== \"selection\" &&\n this.state.activeTool.type !== \"text\" &&\n this.state.activeTool.type !== \"eraser\")) {\n return;\n }\n const elements = this.scene.getNonDeletedElements();\n const selectedElements = (0,_scene__WEBPACK_IMPORTED_MODULE_30__.getSelectedElements)(elements, this.state);\n if (selectedElements.length === 1 &&\n !isOverScrollBar &&\n !this.state.editingLinearElement) {\n const elementWithTransformHandleType = (0,_element__WEBPACK_IMPORTED_MODULE_16__.getElementWithTransformHandleType)(elements, this.state, scenePointerX, scenePointerY, this.state.zoom, event.pointerType);\n if (elementWithTransformHandleType &&\n elementWithTransformHandleType.transformHandleType) {\n (0,_utils__WEBPACK_IMPORTED_MODULE_34__.setCursor)(this.canvas, (0,_element__WEBPACK_IMPORTED_MODULE_16__.getCursorForResizingElement)(elementWithTransformHandleType));\n return;\n }\n }\n else if (selectedElements.length > 1 && !isOverScrollBar) {\n const transformHandleType = (0,_element__WEBPACK_IMPORTED_MODULE_16__.getTransformHandleTypeFromCoords)((0,_element__WEBPACK_IMPORTED_MODULE_16__.getCommonBounds)(selectedElements), scenePointerX, scenePointerY, this.state.zoom, event.pointerType);\n if (transformHandleType) {\n (0,_utils__WEBPACK_IMPORTED_MODULE_34__.setCursor)(this.canvas, (0,_element__WEBPACK_IMPORTED_MODULE_16__.getCursorForResizingElement)({\n transformHandleType,\n }));\n return;\n }\n }\n const hitElement = this.getElementAtPosition(scenePointer.x, scenePointer.y);\n this.hitLinkElement = this.getElementLinkAtPosition(scenePointer, hitElement);\n if ((0,_appState__WEBPACK_IMPORTED_MODULE_10__.isEraserActive)(this.state)) {\n return;\n }\n if (this.hitLinkElement &&\n !this.state.selectedElementIds[this.hitLinkElement.id]) {\n (0,_utils__WEBPACK_IMPORTED_MODULE_34__.setCursor)(this.canvas, _constants__WEBPACK_IMPORTED_MODULE_12__.CURSOR_TYPE.POINTER);\n (0,_element_Hyperlink__WEBPACK_IMPORTED_MODULE_45__.showHyperlinkTooltip)(this.hitLinkElement, this.state);\n }\n else {\n (0,_element_Hyperlink__WEBPACK_IMPORTED_MODULE_45__.hideHyperlinkToolip)();\n if (hitElement &&\n hitElement.link &&\n this.state.selectedElementIds[hitElement.id] &&\n !this.contextMenuOpen &&\n !this.state.showHyperlinkPopup) {\n this.setState({ showHyperlinkPopup: \"info\" });\n }\n else if (this.state.activeTool.type === \"text\") {\n (0,_utils__WEBPACK_IMPORTED_MODULE_34__.setCursor)(this.canvas, (0,_element__WEBPACK_IMPORTED_MODULE_16__.isTextElement)(hitElement) ? _constants__WEBPACK_IMPORTED_MODULE_12__.CURSOR_TYPE.TEXT : _constants__WEBPACK_IMPORTED_MODULE_12__.CURSOR_TYPE.CROSSHAIR);\n }\n else if (this.state.viewModeEnabled) {\n (0,_utils__WEBPACK_IMPORTED_MODULE_34__.setCursor)(this.canvas, _constants__WEBPACK_IMPORTED_MODULE_12__.CURSOR_TYPE.GRAB);\n }\n else if (isOverScrollBar) {\n (0,_utils__WEBPACK_IMPORTED_MODULE_34__.setCursor)(this.canvas, _constants__WEBPACK_IMPORTED_MODULE_12__.CURSOR_TYPE.AUTO);\n }\n else if (this.state.editingLinearElement) {\n const element = _element_linearElementEditor__WEBPACK_IMPORTED_MODULE_18__.LinearElementEditor.getElement(this.state.editingLinearElement.elementId);\n if (element &&\n (0,_element_collision__WEBPACK_IMPORTED_MODULE_44__.isHittingElementNotConsideringBoundingBox)(element, this.state, [\n scenePointer.x,\n scenePointer.y,\n ])) {\n (0,_utils__WEBPACK_IMPORTED_MODULE_34__.setCursor)(this.canvas, _constants__WEBPACK_IMPORTED_MODULE_12__.CURSOR_TYPE.MOVE);\n }\n else {\n (0,_utils__WEBPACK_IMPORTED_MODULE_34__.setCursor)(this.canvas, _constants__WEBPACK_IMPORTED_MODULE_12__.CURSOR_TYPE.AUTO);\n }\n }\n else if (\n // if using cmd/ctrl, we're not dragging\n !event[_keys__WEBPACK_IMPORTED_MODULE_26__.KEYS.CTRL_OR_CMD] &&\n (hitElement ||\n this.isHittingCommonBoundingBoxOfSelectedElements(scenePointer, selectedElements)) &&\n !(hitElement === null || hitElement === void 0 ? void 0 : hitElement.locked)) {\n (0,_utils__WEBPACK_IMPORTED_MODULE_34__.setCursor)(this.canvas, _constants__WEBPACK_IMPORTED_MODULE_12__.CURSOR_TYPE.MOVE);\n }\n else {\n (0,_utils__WEBPACK_IMPORTED_MODULE_34__.setCursor)(this.canvas, _constants__WEBPACK_IMPORTED_MODULE_12__.CURSOR_TYPE.AUTO);\n }\n }\n };\n this.handleEraser = (event, pointerDownState, scenePointer) => {\n const updateElementIds = (elements) => {\n elements.forEach((element) => {\n if (element.locked) {\n return;\n }\n idsToUpdate.push(element.id);\n if (event.altKey) {\n if (pointerDownState.elementIdsToErase[element.id] &&\n pointerDownState.elementIdsToErase[element.id].erase) {\n pointerDownState.elementIdsToErase[element.id].erase = false;\n }\n }\n else if (!pointerDownState.elementIdsToErase[element.id]) {\n pointerDownState.elementIdsToErase[element.id] = {\n erase: true,\n opacity: element.opacity,\n };\n }\n });\n };\n const idsToUpdate = [];\n const distance = (0,_math__WEBPACK_IMPORTED_MODULE_27__.distance2d)(pointerDownState.lastCoords.x, pointerDownState.lastCoords.y, scenePointer.x, scenePointer.y);\n const threshold = 10 / this.state.zoom.value;\n const point = Object.assign({}, pointerDownState.lastCoords);\n let samplingInterval = 0;\n while (samplingInterval <= distance) {\n const hitElements = this.getElementsAtPosition(point.x, point.y);\n updateElementIds(hitElements);\n // Exit since we reached current point\n if (samplingInterval === distance) {\n break;\n }\n // Calculate next point in the line at a distance of sampling interval\n samplingInterval = Math.min(samplingInterval + threshold, distance);\n const distanceRatio = samplingInterval / distance;\n const nextX = (1 - distanceRatio) * point.x + distanceRatio * scenePointer.x;\n const nextY = (1 - distanceRatio) * point.y + distanceRatio * scenePointer.y;\n point.x = nextX;\n point.y = nextY;\n }\n const elements = this.scene.getElementsIncludingDeleted().map((ele) => {\n const id = (0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_21__.isBoundToContainer)(ele) && idsToUpdate.includes(ele.containerId)\n ? ele.containerId\n : ele.id;\n if (idsToUpdate.includes(id)) {\n if (event.altKey) {\n if (pointerDownState.elementIdsToErase[id] &&\n pointerDownState.elementIdsToErase[id].erase === false) {\n return (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_19__.newElementWith)(ele, {\n opacity: pointerDownState.elementIdsToErase[id].opacity,\n });\n }\n }\n else {\n return (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_19__.newElementWith)(ele, {\n opacity: _constants__WEBPACK_IMPORTED_MODULE_12__.ELEMENT_READY_TO_ERASE_OPACITY,\n });\n }\n }\n return ele;\n });\n this.scene.replaceAllElements(elements);\n pointerDownState.lastCoords.x = scenePointer.x;\n pointerDownState.lastCoords.y = scenePointer.y;\n };\n // set touch moving for mobile context menu\n this.handleTouchMove = (event) => {\n invalidateContextMenu = true;\n };\n this.handleCanvasPointerDown = (event) => {\n var _a, _b;\n // remove any active selection when we start to interact with canvas\n // (mainly, we care about removing selection outside the component which\n // would prevent our copy handling otherwise)\n const selection = document.getSelection();\n if (selection === null || selection === void 0 ? void 0 : selection.anchorNode) {\n selection.removeAllRanges();\n }\n this.maybeOpenContextMenuAfterPointerDownOnTouchDevices(event);\n this.maybeCleanupAfterMissingPointerUp(event);\n //fires only once, if pen is detected, penMode is enabled\n //the user can disable this by toggling the penMode button\n if (!this.state.penDetected && event.pointerType === \"pen\") {\n this.setState((prevState) => {\n return {\n penMode: true,\n penDetected: true,\n };\n });\n }\n if (!this.device.isTouchScreen &&\n [\"pen\", \"touch\"].includes(event.pointerType)) {\n this.device = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.updateObject)(this.device, { isTouchScreen: true });\n }\n if (isPanning) {\n return;\n }\n this.lastPointerDown = event;\n this.setState({\n lastPointerDownWith: event.pointerType,\n cursorButton: \"down\",\n });\n this.savePointer(event.clientX, event.clientY, \"down\");\n this.updateGestureOnPointerDown(event);\n if (this.handleCanvasPanUsingWheelOrSpaceDrag(event)) {\n return;\n }\n // only handle left mouse button or touch\n if (event.button !== _constants__WEBPACK_IMPORTED_MODULE_12__.POINTER_BUTTON.MAIN &&\n event.button !== _constants__WEBPACK_IMPORTED_MODULE_12__.POINTER_BUTTON.TOUCH) {\n return;\n }\n // don't select while panning\n if (gesture.pointers.size > 1) {\n return;\n }\n // State for the duration of a pointer interaction, which starts with a\n // pointerDown event, ends with a pointerUp event (or another pointerDown)\n const pointerDownState = this.initialPointerDownState(event);\n if (this.handleDraggingScrollBar(event, pointerDownState)) {\n return;\n }\n // Since context menu closes on pointer down so setting to false\n this.contextMenuOpen = false;\n this.clearSelectionIfNotUsingSelection();\n this.updateBindingEnabledOnPointerMove(event);\n if (this.handleSelectionOnPointerDown(event, pointerDownState)) {\n return;\n }\n const allowOnPointerDown = !this.state.penMode ||\n event.pointerType !== \"touch\" ||\n this.state.activeTool.type === \"selection\" ||\n this.state.activeTool.type === \"text\" ||\n this.state.activeTool.type === \"image\";\n if (!allowOnPointerDown) {\n return;\n }\n if (this.state.activeTool.type === \"text\") {\n this.handleTextOnPointerDown(event, pointerDownState);\n return;\n }\n else if (this.state.activeTool.type === \"arrow\" ||\n this.state.activeTool.type === \"line\") {\n this.handleLinearElementOnPointerDown(event, this.state.activeTool.type, pointerDownState);\n }\n else if (this.state.activeTool.type === \"image\") {\n // reset image preview on pointerdown\n (0,_utils__WEBPACK_IMPORTED_MODULE_34__.setCursor)(this.canvas, _constants__WEBPACK_IMPORTED_MODULE_12__.CURSOR_TYPE.CROSSHAIR);\n // retrieve the latest element as the state may be stale\n const pendingImageElement = this.state.pendingImageElementId &&\n this.scene.getElement(this.state.pendingImageElementId);\n if (!pendingImageElement) {\n return;\n }\n this.setState({\n draggingElement: pendingImageElement,\n editingElement: pendingImageElement,\n pendingImageElementId: null,\n multiElement: null,\n });\n const { x, y } = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.viewportCoordsToSceneCoords)(event, this.state);\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_19__.mutateElement)(pendingImageElement, {\n x,\n y,\n });\n }\n else if (this.state.activeTool.type === \"freedraw\") {\n this.handleFreeDrawElementOnPointerDown(event, this.state.activeTool.type, pointerDownState);\n }\n else if (this.state.activeTool.type === \"custom\") {\n (0,_utils__WEBPACK_IMPORTED_MODULE_34__.setCursor)(this.canvas, _constants__WEBPACK_IMPORTED_MODULE_12__.CURSOR_TYPE.AUTO);\n }\n else if (this.state.activeTool.type !== \"eraser\") {\n this.createGenericElementOnPointerDown(this.state.activeTool.type, pointerDownState);\n }\n (_b = (_a = this.props) === null || _a === void 0 ? void 0 : _a.onPointerDown) === null || _b === void 0 ? void 0 : _b.call(_a, this.state.activeTool, pointerDownState);\n const onPointerMove = this.onPointerMoveFromPointerDownHandler(pointerDownState);\n const onPointerUp = this.onPointerUpFromPointerDownHandler(pointerDownState);\n const onKeyDown = this.onKeyDownFromPointerDownHandler(pointerDownState);\n const onKeyUp = this.onKeyUpFromPointerDownHandler(pointerDownState);\n lastPointerUp = onPointerUp;\n if (!this.state.viewModeEnabled) {\n window.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.POINTER_MOVE, onPointerMove);\n window.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.POINTER_UP, onPointerUp);\n window.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.KEYDOWN, onKeyDown);\n window.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.KEYUP, onKeyUp);\n pointerDownState.eventListeners.onMove = onPointerMove;\n pointerDownState.eventListeners.onUp = onPointerUp;\n pointerDownState.eventListeners.onKeyUp = onKeyUp;\n pointerDownState.eventListeners.onKeyDown = onKeyDown;\n }\n };\n this.handleCanvasPointerUp = (event) => {\n this.lastPointerUp = event;\n if (this.device.isTouchScreen) {\n const scenePointer = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.viewportCoordsToSceneCoords)({ clientX: event.clientX, clientY: event.clientY }, this.state);\n const hitElement = this.getElementAtPosition(scenePointer.x, scenePointer.y);\n this.hitLinkElement = this.getElementLinkAtPosition(scenePointer, hitElement);\n }\n if (this.hitLinkElement &&\n !this.state.selectedElementIds[this.hitLinkElement.id]) {\n this.redirectToLink(event, this.device.isTouchScreen);\n }\n this.removePointer(event);\n };\n this.maybeOpenContextMenuAfterPointerDownOnTouchDevices = (event) => {\n // deal with opening context menu on touch devices\n if (event.pointerType === \"touch\") {\n invalidateContextMenu = false;\n if (touchTimeout) {\n // If there's already a touchTimeout, this means that there's another\n // touch down and we are doing another touch, so we shouldn't open the\n // context menu.\n invalidateContextMenu = true;\n }\n else {\n // open the context menu with the first touch's clientX and clientY\n // if the touch is not moving\n touchTimeout = window.setTimeout(() => {\n touchTimeout = 0;\n if (!invalidateContextMenu) {\n this.handleCanvasContextMenu(event);\n }\n }, _constants__WEBPACK_IMPORTED_MODULE_12__.TOUCH_CTX_MENU_TIMEOUT);\n }\n }\n };\n this.resetContextMenuTimer = () => {\n clearTimeout(touchTimeout);\n touchTimeout = 0;\n invalidateContextMenu = false;\n };\n // Returns whether the event is a panning\n this.handleCanvasPanUsingWheelOrSpaceDrag = (event) => {\n if (!(gesture.pointers.size <= 1 &&\n (event.button === _constants__WEBPACK_IMPORTED_MODULE_12__.POINTER_BUTTON.WHEEL ||\n (event.button === _constants__WEBPACK_IMPORTED_MODULE_12__.POINTER_BUTTON.MAIN && isHoldingSpace) ||\n this.state.viewModeEnabled)) ||\n (0,_element__WEBPACK_IMPORTED_MODULE_16__.isTextElement)(this.state.editingElement)) {\n return false;\n }\n isPanning = true;\n event.preventDefault();\n let nextPastePrevented = false;\n const isLinux = /Linux/.test(window.navigator.platform);\n (0,_utils__WEBPACK_IMPORTED_MODULE_34__.setCursor)(this.canvas, _constants__WEBPACK_IMPORTED_MODULE_12__.CURSOR_TYPE.GRABBING);\n let { clientX: lastX, clientY: lastY } = event;\n const onPointerMove = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.withBatchedUpdatesThrottled)((event) => {\n const deltaX = lastX - event.clientX;\n const deltaY = lastY - event.clientY;\n lastX = event.clientX;\n lastY = event.clientY;\n /*\n * Prevent paste event if we move while middle clicking on Linux.\n * See issue #1383.\n */\n if (isLinux &&\n !nextPastePrevented &&\n (Math.abs(deltaX) > 1 || Math.abs(deltaY) > 1)) {\n nextPastePrevented = true;\n /* Prevent the next paste event */\n const preventNextPaste = (event) => {\n document.body.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.PASTE, preventNextPaste);\n event.stopPropagation();\n };\n /*\n * Reenable next paste in case of disabled middle click paste for\n * any reason:\n * - right click paste\n * - empty clipboard\n */\n const enableNextPaste = () => {\n setTimeout(() => {\n document.body.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.PASTE, preventNextPaste);\n window.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.POINTER_UP, enableNextPaste);\n }, 100);\n };\n document.body.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.PASTE, preventNextPaste);\n window.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.POINTER_UP, enableNextPaste);\n }\n this.setState({\n scrollX: this.state.scrollX - deltaX / this.state.zoom.value,\n scrollY: this.state.scrollY - deltaY / this.state.zoom.value,\n });\n });\n const teardown = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.withBatchedUpdates)((lastPointerUp = () => {\n lastPointerUp = null;\n isPanning = false;\n if (!isHoldingSpace) {\n if (this.state.viewModeEnabled) {\n (0,_utils__WEBPACK_IMPORTED_MODULE_34__.setCursor)(this.canvas, _constants__WEBPACK_IMPORTED_MODULE_12__.CURSOR_TYPE.GRAB);\n }\n else {\n (0,_utils__WEBPACK_IMPORTED_MODULE_34__.setCursorForShape)(this.canvas, this.state);\n }\n }\n this.setState({\n cursorButton: \"up\",\n });\n this.savePointer(event.clientX, event.clientY, \"up\");\n window.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.POINTER_MOVE, onPointerMove);\n window.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.POINTER_UP, teardown);\n window.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.BLUR, teardown);\n onPointerMove.flush();\n }));\n window.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.BLUR, teardown);\n window.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.POINTER_MOVE, onPointerMove, {\n passive: true,\n });\n window.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.POINTER_UP, teardown);\n return true;\n };\n this.clearSelectionIfNotUsingSelection = () => {\n if (this.state.activeTool.type !== \"selection\") {\n this.setState({\n selectedElementIds: {},\n selectedGroupIds: {},\n editingGroupId: null,\n });\n }\n };\n /**\n * @returns whether the pointer event has been completely handled\n */\n this.handleSelectionOnPointerDown = (event, pointerDownState) => {\n var _a;\n if (this.state.activeTool.type === \"selection\") {\n const elements = this.scene.getNonDeletedElements();\n const selectedElements = (0,_scene__WEBPACK_IMPORTED_MODULE_30__.getSelectedElements)(elements, this.state);\n if (selectedElements.length === 1 && !this.state.editingLinearElement) {\n const elementWithTransformHandleType = (0,_element__WEBPACK_IMPORTED_MODULE_16__.getElementWithTransformHandleType)(elements, this.state, pointerDownState.origin.x, pointerDownState.origin.y, this.state.zoom, event.pointerType);\n if (elementWithTransformHandleType != null) {\n this.setState({\n resizingElement: elementWithTransformHandleType.element,\n });\n pointerDownState.resize.handleType =\n elementWithTransformHandleType.transformHandleType;\n }\n }\n else if (selectedElements.length > 1) {\n pointerDownState.resize.handleType = (0,_element__WEBPACK_IMPORTED_MODULE_16__.getTransformHandleTypeFromCoords)((0,_element__WEBPACK_IMPORTED_MODULE_16__.getCommonBounds)(selectedElements), pointerDownState.origin.x, pointerDownState.origin.y, this.state.zoom, event.pointerType);\n }\n if (pointerDownState.resize.handleType) {\n (0,_utils__WEBPACK_IMPORTED_MODULE_34__.setCursor)(this.canvas, (0,_element__WEBPACK_IMPORTED_MODULE_16__.getCursorForResizingElement)({\n transformHandleType: pointerDownState.resize.handleType,\n }));\n pointerDownState.resize.isResizing = true;\n pointerDownState.resize.offset = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.tupleToCoors)((0,_element__WEBPACK_IMPORTED_MODULE_16__.getResizeOffsetXY)(pointerDownState.resize.handleType, selectedElements, pointerDownState.origin.x, pointerDownState.origin.y));\n if (selectedElements.length === 1 &&\n (0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_21__.isLinearElement)(selectedElements[0]) &&\n selectedElements[0].points.length === 2) {\n pointerDownState.resize.arrowDirection = (0,_element__WEBPACK_IMPORTED_MODULE_16__.getResizeArrowDirection)(pointerDownState.resize.handleType, selectedElements[0]);\n }\n }\n else {\n if (this.state.editingLinearElement) {\n const ret = _element_linearElementEditor__WEBPACK_IMPORTED_MODULE_18__.LinearElementEditor.handlePointerDown(event, this.state, (appState) => this.setState(appState), this.history, pointerDownState.origin);\n if (ret.hitElement) {\n pointerDownState.hit.element = ret.hitElement;\n }\n if (ret.didAddPoint) {\n return true;\n }\n }\n // hitElement may already be set above, so check first\n pointerDownState.hit.element =\n (_a = pointerDownState.hit.element) !== null && _a !== void 0 ? _a : this.getElementAtPosition(pointerDownState.origin.x, pointerDownState.origin.y);\n if (pointerDownState.hit.element) {\n // Early return if pointer is hitting link icon\n if ((0,_element_Hyperlink__WEBPACK_IMPORTED_MODULE_45__.isPointHittingLinkIcon)(pointerDownState.hit.element, this.state, [pointerDownState.origin.x, pointerDownState.origin.y], this.device.isMobile)) {\n return false;\n }\n pointerDownState.hit.hasHitElementInside =\n (0,_element_collision__WEBPACK_IMPORTED_MODULE_44__.isHittingElementNotConsideringBoundingBox)(pointerDownState.hit.element, this.state, [pointerDownState.origin.x, pointerDownState.origin.y]);\n }\n // For overlapped elements one position may hit\n // multiple elements\n pointerDownState.hit.allHitElements = this.getElementsAtPosition(pointerDownState.origin.x, pointerDownState.origin.y);\n const hitElement = pointerDownState.hit.element;\n const someHitElementIsSelected = pointerDownState.hit.allHitElements.some((element) => this.isASelectedElement(element));\n if ((hitElement === null || !someHitElementIsSelected) &&\n !event.shiftKey &&\n !pointerDownState.hit.hasHitCommonBoundingBoxOfSelectedElements) {\n this.clearSelection(hitElement);\n }\n if (this.state.editingLinearElement) {\n this.setState({\n selectedElementIds: {\n [this.state.editingLinearElement.elementId]: true,\n },\n });\n // If we click on something\n }\n else if (hitElement != null) {\n // on CMD/CTRL, drill down to hit element regardless of groups etc.\n if (event[_keys__WEBPACK_IMPORTED_MODULE_26__.KEYS.CTRL_OR_CMD]) {\n if (!this.state.selectedElementIds[hitElement.id]) {\n pointerDownState.hit.wasAddedToSelection = true;\n }\n this.setState((prevState) => (Object.assign(Object.assign({}, (0,_groups__WEBPACK_IMPORTED_MODULE_23__.editGroupForSelectedElement)(prevState, hitElement)), { previousSelectedElementIds: this.state.selectedElementIds })));\n // mark as not completely handled so as to allow dragging etc.\n return false;\n }\n // deselect if item is selected\n // if shift is not clicked, this will always return true\n // otherwise, it will trigger selection based on current\n // state of the box\n if (!this.state.selectedElementIds[hitElement.id]) {\n // if we are currently editing a group, exiting editing mode and deselect the group.\n if (this.state.editingGroupId &&\n !(0,_groups__WEBPACK_IMPORTED_MODULE_23__.isElementInGroup)(hitElement, this.state.editingGroupId)) {\n this.setState({\n selectedElementIds: {},\n selectedGroupIds: {},\n editingGroupId: null,\n });\n }\n // Add hit element to selection. At this point if we're not holding\n // SHIFT the previously selected element(s) were deselected above\n // (make sure you use setState updater to use latest state)\n if (!someHitElementIsSelected &&\n !pointerDownState.hit.hasHitCommonBoundingBoxOfSelectedElements) {\n this.setState((prevState) => {\n return (0,_groups__WEBPACK_IMPORTED_MODULE_23__.selectGroupsForSelectedElements)(Object.assign(Object.assign({}, prevState), { selectedElementIds: Object.assign(Object.assign({}, prevState.selectedElementIds), { [hitElement.id]: true }), showHyperlinkPopup: hitElement.link ? \"info\" : false }), this.scene.getNonDeletedElements());\n });\n pointerDownState.hit.wasAddedToSelection = true;\n }\n }\n }\n this.setState({\n previousSelectedElementIds: this.state.selectedElementIds,\n });\n }\n }\n return false;\n };\n this.handleTextOnPointerDown = (event, pointerDownState) => {\n // if we're currently still editing text, clicking outside\n // should only finalize it, not create another (irrespective\n // of state.activeTool.locked)\n if ((0,_element__WEBPACK_IMPORTED_MODULE_16__.isTextElement)(this.state.editingElement)) {\n return;\n }\n let sceneX = pointerDownState.origin.x;\n let sceneY = pointerDownState.origin.y;\n const element = this.getElementAtPosition(sceneX, sceneY, {\n includeBoundTextElement: true,\n });\n const canBindText = (0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_21__.hasBoundTextElement)(element);\n if (canBindText) {\n sceneX = element.x + element.width / 2;\n sceneY = element.y + element.height / 2;\n }\n this.startTextEditing({\n sceneX,\n sceneY,\n shouldBind: false,\n insertAtParentCenter: !event.altKey,\n });\n (0,_utils__WEBPACK_IMPORTED_MODULE_34__.resetCursor)(this.canvas);\n if (!this.state.activeTool.locked) {\n this.setState({\n activeTool: (0,_utils__WEBPACK_IMPORTED_MODULE_34__.updateActiveTool)(this.state, { type: \"selection\" }),\n });\n }\n };\n this.handleFreeDrawElementOnPointerDown = (event, elementType, pointerDownState) => {\n // Begin a mark capture. This does not have to update state yet.\n const [gridX, gridY] = (0,_math__WEBPACK_IMPORTED_MODULE_27__.getGridPoint)(pointerDownState.origin.x, pointerDownState.origin.y, null);\n const element = (0,_element_newElement__WEBPACK_IMPORTED_MODULE_20__.newFreeDrawElement)({\n type: elementType,\n x: gridX,\n y: gridY,\n strokeColor: this.state.currentItemStrokeColor,\n backgroundColor: this.state.currentItemBackgroundColor,\n fillStyle: this.state.currentItemFillStyle,\n strokeWidth: this.state.currentItemStrokeWidth,\n strokeStyle: this.state.currentItemStrokeStyle,\n roughness: this.state.currentItemRoughness,\n opacity: this.state.currentItemOpacity,\n strokeSharpness: this.state.currentItemLinearStrokeSharpness,\n simulatePressure: event.pressure === 0.5,\n locked: false,\n });\n this.setState((prevState) => ({\n selectedElementIds: Object.assign(Object.assign({}, prevState.selectedElementIds), { [element.id]: false }),\n }));\n const pressures = element.simulatePressure\n ? element.pressures\n : [...element.pressures, event.pressure];\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_19__.mutateElement)(element, {\n points: [[0, 0]],\n pressures,\n });\n const boundElement = (0,_element_binding__WEBPACK_IMPORTED_MODULE_17__.getHoveredElementForBinding)(pointerDownState.origin, this.scene);\n this.scene.replaceAllElements([\n ...this.scene.getElementsIncludingDeleted(),\n element,\n ]);\n this.setState({\n draggingElement: element,\n editingElement: element,\n startBoundElement: boundElement,\n suggestedBindings: [],\n });\n };\n this.createImageElement = ({ sceneX, sceneY, }) => {\n const [gridX, gridY] = (0,_math__WEBPACK_IMPORTED_MODULE_27__.getGridPoint)(sceneX, sceneY, this.state.gridSize);\n const element = (0,_element__WEBPACK_IMPORTED_MODULE_16__.newImageElement)({\n type: \"image\",\n x: gridX,\n y: gridY,\n strokeColor: this.state.currentItemStrokeColor,\n backgroundColor: this.state.currentItemBackgroundColor,\n fillStyle: this.state.currentItemFillStyle,\n strokeWidth: this.state.currentItemStrokeWidth,\n strokeStyle: this.state.currentItemStrokeStyle,\n roughness: this.state.currentItemRoughness,\n opacity: this.state.currentItemOpacity,\n strokeSharpness: this.state.currentItemLinearStrokeSharpness,\n locked: false,\n });\n return element;\n };\n this.handleLinearElementOnPointerDown = (event, elementType, pointerDownState) => {\n if (this.state.multiElement) {\n const { multiElement } = this.state;\n // finalize if completing a loop\n if (multiElement.type === \"line\" &&\n (0,_math__WEBPACK_IMPORTED_MODULE_27__.isPathALoop)(multiElement.points, this.state.zoom.value)) {\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_19__.mutateElement)(multiElement, {\n lastCommittedPoint: multiElement.points[multiElement.points.length - 1],\n });\n this.actionManager.executeAction(_actions__WEBPACK_IMPORTED_MODULE_5__.actionFinalize);\n return;\n }\n const { x: rx, y: ry, lastCommittedPoint } = multiElement;\n // clicking inside commit zone → finalize arrow\n if (multiElement.points.length > 1 &&\n lastCommittedPoint &&\n (0,_math__WEBPACK_IMPORTED_MODULE_27__.distance2d)(pointerDownState.origin.x - rx, pointerDownState.origin.y - ry, lastCommittedPoint[0], lastCommittedPoint[1]) < _constants__WEBPACK_IMPORTED_MODULE_12__.LINE_CONFIRM_THRESHOLD) {\n this.actionManager.executeAction(_actions__WEBPACK_IMPORTED_MODULE_5__.actionFinalize);\n return;\n }\n this.setState((prevState) => ({\n selectedElementIds: Object.assign(Object.assign({}, prevState.selectedElementIds), { [multiElement.id]: true }),\n }));\n // clicking outside commit zone → update reference for last committed\n // point\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_19__.mutateElement)(multiElement, {\n lastCommittedPoint: multiElement.points[multiElement.points.length - 1],\n });\n (0,_utils__WEBPACK_IMPORTED_MODULE_34__.setCursor)(this.canvas, _constants__WEBPACK_IMPORTED_MODULE_12__.CURSOR_TYPE.POINTER);\n }\n else {\n const [gridX, gridY] = (0,_math__WEBPACK_IMPORTED_MODULE_27__.getGridPoint)(pointerDownState.origin.x, pointerDownState.origin.y, this.state.gridSize);\n /* If arrow is pre-arrowheads, it will have undefined for both start and end arrowheads.\n If so, we want it to be null for start and \"arrow\" for end. If the linear item is not\n an arrow, we want it to be null for both. Otherwise, we want it to use the\n values from appState. */\n const { currentItemStartArrowhead, currentItemEndArrowhead } = this.state;\n const [startArrowhead, endArrowhead] = elementType === \"arrow\"\n ? [currentItemStartArrowhead, currentItemEndArrowhead]\n : [null, null];\n const element = (0,_element__WEBPACK_IMPORTED_MODULE_16__.newLinearElement)({\n type: elementType,\n x: gridX,\n y: gridY,\n strokeColor: this.state.currentItemStrokeColor,\n backgroundColor: this.state.currentItemBackgroundColor,\n fillStyle: this.state.currentItemFillStyle,\n strokeWidth: this.state.currentItemStrokeWidth,\n strokeStyle: this.state.currentItemStrokeStyle,\n roughness: this.state.currentItemRoughness,\n opacity: this.state.currentItemOpacity,\n strokeSharpness: this.state.currentItemLinearStrokeSharpness,\n startArrowhead,\n endArrowhead,\n locked: false,\n });\n this.setState((prevState) => ({\n selectedElementIds: Object.assign(Object.assign({}, prevState.selectedElementIds), { [element.id]: false }),\n }));\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_19__.mutateElement)(element, {\n points: [...element.points, [0, 0]],\n });\n const boundElement = (0,_element_binding__WEBPACK_IMPORTED_MODULE_17__.getHoveredElementForBinding)(pointerDownState.origin, this.scene);\n this.scene.replaceAllElements([\n ...this.scene.getElementsIncludingDeleted(),\n element,\n ]);\n this.setState({\n draggingElement: element,\n editingElement: element,\n startBoundElement: boundElement,\n suggestedBindings: [],\n });\n }\n };\n this.createGenericElementOnPointerDown = (elementType, pointerDownState) => {\n const [gridX, gridY] = (0,_math__WEBPACK_IMPORTED_MODULE_27__.getGridPoint)(pointerDownState.origin.x, pointerDownState.origin.y, this.state.gridSize);\n const element = (0,_element__WEBPACK_IMPORTED_MODULE_16__.newElement)({\n type: elementType,\n x: gridX,\n y: gridY,\n strokeColor: this.state.currentItemStrokeColor,\n backgroundColor: this.state.currentItemBackgroundColor,\n fillStyle: this.state.currentItemFillStyle,\n strokeWidth: this.state.currentItemStrokeWidth,\n strokeStyle: this.state.currentItemStrokeStyle,\n roughness: this.state.currentItemRoughness,\n opacity: this.state.currentItemOpacity,\n strokeSharpness: this.state.currentItemStrokeSharpness,\n locked: false,\n });\n if (element.type === \"selection\") {\n this.setState({\n selectionElement: element,\n draggingElement: element,\n });\n }\n else {\n this.scene.replaceAllElements([\n ...this.scene.getElementsIncludingDeleted(),\n element,\n ]);\n this.setState({\n multiElement: null,\n draggingElement: element,\n editingElement: element,\n });\n }\n };\n this.restoreReadyToEraseElements = (pointerDownState) => {\n const elements = this.scene.getElementsIncludingDeleted().map((ele) => {\n if (pointerDownState.elementIdsToErase[ele.id] &&\n pointerDownState.elementIdsToErase[ele.id].erase) {\n return (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_19__.newElementWith)(ele, {\n opacity: pointerDownState.elementIdsToErase[ele.id].opacity,\n });\n }\n else if ((0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_21__.isBoundToContainer)(ele) &&\n pointerDownState.elementIdsToErase[ele.containerId] &&\n pointerDownState.elementIdsToErase[ele.containerId].erase) {\n return (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_19__.newElementWith)(ele, {\n opacity: pointerDownState.elementIdsToErase[ele.containerId].opacity,\n });\n }\n return ele;\n });\n this.scene.replaceAllElements(elements);\n };\n this.eraseElements = (pointerDownState) => {\n const elements = this.scene.getElementsIncludingDeleted().map((ele) => {\n if (pointerDownState.elementIdsToErase[ele.id] &&\n pointerDownState.elementIdsToErase[ele.id].erase) {\n return (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_19__.newElementWith)(ele, { isDeleted: true });\n }\n else if ((0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_21__.isBoundToContainer)(ele) &&\n pointerDownState.elementIdsToErase[ele.containerId] &&\n pointerDownState.elementIdsToErase[ele.containerId].erase) {\n return (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_19__.newElementWith)(ele, { isDeleted: true });\n }\n return ele;\n });\n this.history.resumeRecording();\n this.scene.replaceAllElements(elements);\n };\n this.initializeImage = ({ imageFile, imageElement: _imageElement, showCursorImagePreview = false, }) => __awaiter(this, void 0, void 0, function* () {\n var _e, _f, _g, _h;\n // at this point this should be guaranteed image file, but we do this check\n // to satisfy TS down the line\n if (!(0,_data_blob__WEBPACK_IMPORTED_MODULE_39__.isSupportedImageFile)(imageFile)) {\n throw new Error((0,_i18n__WEBPACK_IMPORTED_MODULE_25__.t)(\"errors.unsupportedFileType\"));\n }\n const mimeType = imageFile.type;\n (0,_utils__WEBPACK_IMPORTED_MODULE_34__.setCursor)(this.canvas, \"wait\");\n if (mimeType === _constants__WEBPACK_IMPORTED_MODULE_12__.MIME_TYPES.svg) {\n try {\n imageFile = (0,_data_blob__WEBPACK_IMPORTED_MODULE_39__.SVGStringToFile)(yield (0,_element_image__WEBPACK_IMPORTED_MODULE_40__.normalizeSVG)(yield imageFile.text()), imageFile.name);\n }\n catch (error) {\n console.warn(error);\n throw new Error((0,_i18n__WEBPACK_IMPORTED_MODULE_25__.t)(\"errors.svgImageInsertError\"));\n }\n }\n // generate image id (by default the file digest) before any\n // resizing/compression takes place to keep it more portable\n const fileId = yield (((_f = (_e = this.props).generateIdForFile) === null || _f === void 0 ? void 0 : _f.call(_e, imageFile)) || (0,_data_blob__WEBPACK_IMPORTED_MODULE_39__.generateIdFromFile)(imageFile));\n if (!fileId) {\n console.warn(\"Couldn't generate file id or the supplied `generateIdForFile` didn't resolve to one.\");\n throw new Error((0,_i18n__WEBPACK_IMPORTED_MODULE_25__.t)(\"errors.imageInsertError\"));\n }\n const existingFileData = this.files[fileId];\n if (!(existingFileData === null || existingFileData === void 0 ? void 0 : existingFileData.dataURL)) {\n try {\n imageFile = yield (0,_data_blob__WEBPACK_IMPORTED_MODULE_39__.resizeImageFile)(imageFile, {\n maxWidthOrHeight: _constants__WEBPACK_IMPORTED_MODULE_12__.DEFAULT_MAX_IMAGE_WIDTH_OR_HEIGHT,\n });\n }\n catch (error) {\n console.error(\"error trying to resing image file on insertion\", error);\n }\n if (imageFile.size > _constants__WEBPACK_IMPORTED_MODULE_12__.MAX_ALLOWED_FILE_BYTES) {\n throw new Error((0,_i18n__WEBPACK_IMPORTED_MODULE_25__.t)(\"errors.fileTooBig\", {\n maxSize: `${Math.trunc(_constants__WEBPACK_IMPORTED_MODULE_12__.MAX_ALLOWED_FILE_BYTES / 1024 / 1024)}MB`,\n }));\n }\n }\n if (showCursorImagePreview) {\n const dataURL = (_g = this.files[fileId]) === null || _g === void 0 ? void 0 : _g.dataURL;\n // optimization so that we don't unnecessarily resize the original\n // full-size file for cursor preview\n // (it's much faster to convert the resized dataURL to File)\n const resizedFile = dataURL && (0,_data_blob__WEBPACK_IMPORTED_MODULE_39__.dataURLToFile)(dataURL);\n this.setImagePreviewCursor(resizedFile || imageFile);\n }\n const dataURL = ((_h = this.files[fileId]) === null || _h === void 0 ? void 0 : _h.dataURL) || (yield (0,_data_blob__WEBPACK_IMPORTED_MODULE_39__.getDataURL)(imageFile));\n const imageElement = (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_19__.mutateElement)(_imageElement, {\n fileId,\n }, false);\n return new Promise((resolve, reject) => __awaiter(this, void 0, void 0, function* () {\n var _j;\n try {\n this.files = Object.assign(Object.assign({}, this.files), { [fileId]: {\n mimeType,\n id: fileId,\n dataURL,\n created: Date.now(),\n } });\n const cachedImageData = this.imageCache.get(fileId);\n if (!cachedImageData) {\n this.addNewImagesToImageCache();\n yield this.updateImageCache([imageElement]);\n }\n if ((cachedImageData === null || cachedImageData === void 0 ? void 0 : cachedImageData.image) instanceof Promise) {\n yield cachedImageData.image;\n }\n if (this.state.pendingImageElementId !== imageElement.id &&\n ((_j = this.state.draggingElement) === null || _j === void 0 ? void 0 : _j.id) !== imageElement.id) {\n this.initializeImageDimensions(imageElement, true);\n }\n resolve(imageElement);\n }\n catch (error) {\n console.error(error);\n reject(new Error((0,_i18n__WEBPACK_IMPORTED_MODULE_25__.t)(\"errors.imageInsertError\")));\n }\n finally {\n if (!showCursorImagePreview) {\n (0,_utils__WEBPACK_IMPORTED_MODULE_34__.resetCursor)(this.canvas);\n }\n }\n }));\n });\n /**\n * inserts image into elements array and rerenders\n */\n this.insertImageElement = (imageElement, imageFile, showCursorImagePreview) => __awaiter(this, void 0, void 0, function* () {\n this.scene.replaceAllElements([\n ...this.scene.getElementsIncludingDeleted(),\n imageElement,\n ]);\n try {\n yield this.initializeImage({\n imageFile,\n imageElement,\n showCursorImagePreview,\n });\n }\n catch (error) {\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_19__.mutateElement)(imageElement, {\n isDeleted: true,\n });\n this.actionManager.executeAction(_actions__WEBPACK_IMPORTED_MODULE_5__.actionFinalize);\n this.setState({\n errorMessage: error.message || (0,_i18n__WEBPACK_IMPORTED_MODULE_25__.t)(\"errors.imageInsertError\"),\n });\n }\n });\n this.setImagePreviewCursor = (imageFile) => __awaiter(this, void 0, void 0, function* () {\n // mustn't be larger than 128 px\n // https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Basic_User_Interface/Using_URL_values_for_the_cursor_property\n const cursorImageSizePx = 96;\n const imagePreview = yield (0,_data_blob__WEBPACK_IMPORTED_MODULE_39__.resizeImageFile)(imageFile, {\n maxWidthOrHeight: cursorImageSizePx,\n });\n let previewDataURL = yield (0,_data_blob__WEBPACK_IMPORTED_MODULE_39__.getDataURL)(imagePreview);\n // SVG cannot be resized via `resizeImageFile` so we resize by rendering to\n // a small canvas\n if (imageFile.type === _constants__WEBPACK_IMPORTED_MODULE_12__.MIME_TYPES.svg) {\n const img = yield (0,_element_image__WEBPACK_IMPORTED_MODULE_40__.loadHTMLImageElement)(previewDataURL);\n let height = Math.min(img.height, cursorImageSizePx);\n let width = height * (img.width / img.height);\n if (width > cursorImageSizePx) {\n width = cursorImageSizePx;\n height = width * (img.height / img.width);\n }\n const canvas = document.createElement(\"canvas\");\n canvas.height = height;\n canvas.width = width;\n const context = canvas.getContext(\"2d\");\n context.drawImage(img, 0, 0, width, height);\n previewDataURL = canvas.toDataURL(_constants__WEBPACK_IMPORTED_MODULE_12__.MIME_TYPES.svg);\n }\n if (this.state.pendingImageElementId) {\n (0,_utils__WEBPACK_IMPORTED_MODULE_34__.setCursor)(this.canvas, `url(${previewDataURL}) 4 4, auto`);\n }\n });\n this.onImageAction = ({ insertOnCanvasDirectly } = { insertOnCanvasDirectly: false }) => __awaiter(this, void 0, void 0, function* () {\n try {\n const clientX = this.state.width / 2 + this.state.offsetLeft;\n const clientY = this.state.height / 2 + this.state.offsetTop;\n const { x, y } = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.viewportCoordsToSceneCoords)({ clientX, clientY }, this.state);\n const imageFile = yield (0,_data_filesystem__WEBPACK_IMPORTED_MODULE_42__.fileOpen)({\n description: \"Image\",\n extensions: [\"jpg\", \"png\", \"svg\", \"gif\"],\n });\n const imageElement = this.createImageElement({\n sceneX: x,\n sceneY: y,\n });\n if (insertOnCanvasDirectly) {\n this.insertImageElement(imageElement, imageFile);\n this.initializeImageDimensions(imageElement);\n this.setState({\n selectedElementIds: { [imageElement.id]: true },\n }, () => {\n this.actionManager.executeAction(_actions__WEBPACK_IMPORTED_MODULE_5__.actionFinalize);\n });\n }\n else {\n this.setState({\n pendingImageElementId: imageElement.id,\n }, () => {\n this.insertImageElement(imageElement, imageFile, \n /* showCursorImagePreview */ true);\n });\n }\n }\n catch (error) {\n if (error.name !== \"AbortError\") {\n console.error(error);\n }\n else {\n console.warn(error);\n }\n this.setState({\n pendingImageElementId: null,\n editingElement: null,\n activeTool: (0,_utils__WEBPACK_IMPORTED_MODULE_34__.updateActiveTool)(this.state, { type: \"selection\" }),\n }, () => {\n this.actionManager.executeAction(_actions__WEBPACK_IMPORTED_MODULE_5__.actionFinalize);\n });\n }\n });\n this.initializeImageDimensions = (imageElement, forceNaturalSize = false) => {\n var _a;\n const image = (0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_21__.isInitializedImageElement)(imageElement) &&\n ((_a = this.imageCache.get(imageElement.fileId)) === null || _a === void 0 ? void 0 : _a.image);\n if (!image || image instanceof Promise) {\n if (imageElement.width < _constants__WEBPACK_IMPORTED_MODULE_12__.DRAGGING_THRESHOLD / this.state.zoom.value &&\n imageElement.height < _constants__WEBPACK_IMPORTED_MODULE_12__.DRAGGING_THRESHOLD / this.state.zoom.value) {\n const placeholderSize = 100 / this.state.zoom.value;\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_19__.mutateElement)(imageElement, {\n x: imageElement.x - placeholderSize / 2,\n y: imageElement.y - placeholderSize / 2,\n width: placeholderSize,\n height: placeholderSize,\n });\n }\n return;\n }\n if (forceNaturalSize ||\n // if user-created bounding box is below threshold, assume the\n // intention was to click instead of drag, and use the image's\n // intrinsic size\n (imageElement.width < _constants__WEBPACK_IMPORTED_MODULE_12__.DRAGGING_THRESHOLD / this.state.zoom.value &&\n imageElement.height < _constants__WEBPACK_IMPORTED_MODULE_12__.DRAGGING_THRESHOLD / this.state.zoom.value)) {\n const minHeight = Math.max(this.state.height - 120, 160);\n // max 65% of canvas height, clamped to <300px, vh - 120px>\n const maxHeight = Math.min(minHeight, Math.floor(this.state.height * 0.5) / this.state.zoom.value);\n const height = Math.min(image.naturalHeight, maxHeight);\n const width = height * (image.naturalWidth / image.naturalHeight);\n // add current imageElement width/height to account for previous centering\n // of the placeholder image\n const x = imageElement.x + imageElement.width / 2 - width / 2;\n const y = imageElement.y + imageElement.height / 2 - height / 2;\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_19__.mutateElement)(imageElement, { x, y, width, height });\n }\n };\n /** updates image cache, refreshing updated elements and/or setting status\n to error for images that fail during <img> element creation */\n this.updateImageCache = (elements, files = this.files) => __awaiter(this, void 0, void 0, function* () {\n const { updatedFiles, erroredFiles } = yield (0,_element_image__WEBPACK_IMPORTED_MODULE_40__.updateImageCache)({\n imageCache: this.imageCache,\n fileIds: elements.map((element) => element.fileId),\n files,\n });\n if (updatedFiles.size || erroredFiles.size) {\n for (const element of elements) {\n if (updatedFiles.has(element.fileId)) {\n (0,_renderer_renderElement__WEBPACK_IMPORTED_MODULE_29__.invalidateShapeForElement)(element);\n }\n }\n }\n if (erroredFiles.size) {\n this.scene.replaceAllElements(this.scene.getElementsIncludingDeleted().map((element) => {\n if ((0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_21__.isInitializedImageElement)(element) &&\n erroredFiles.has(element.fileId)) {\n return (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_19__.newElementWith)(element, {\n status: \"error\",\n });\n }\n return element;\n }));\n }\n return { updatedFiles, erroredFiles };\n });\n /** adds new images to imageCache and re-renders if needed */\n this.addNewImagesToImageCache = (imageElements = (0,_element_image__WEBPACK_IMPORTED_MODULE_40__.getInitializedImageElements)(this.scene.getNonDeletedElements()), files = this.files) => __awaiter(this, void 0, void 0, function* () {\n const uncachedImageElements = imageElements.filter((element) => !element.isDeleted && !this.imageCache.has(element.fileId));\n if (uncachedImageElements.length) {\n const { updatedFiles } = yield this.updateImageCache(uncachedImageElements, files);\n if (updatedFiles.size) {\n this.scene.informMutation();\n }\n }\n });\n /** generally you should use `addNewImagesToImageCache()` directly if you need\n * to render new images. This is just a failsafe */\n this.scheduleImageRefresh = lodash_throttle__WEBPACK_IMPORTED_MODULE_41___default()(() => {\n this.addNewImagesToImageCache();\n }, _constants__WEBPACK_IMPORTED_MODULE_12__.IMAGE_RENDER_TIMEOUT);\n this.updateBindingEnabledOnPointerMove = (event) => {\n const shouldEnableBinding = (0,_element_binding__WEBPACK_IMPORTED_MODULE_17__.shouldEnableBindingForPointerEvent)(event);\n if (this.state.isBindingEnabled !== shouldEnableBinding) {\n this.setState({ isBindingEnabled: shouldEnableBinding });\n }\n };\n this.maybeSuggestBindingAtCursor = (pointerCoords) => {\n const hoveredBindableElement = (0,_element_binding__WEBPACK_IMPORTED_MODULE_17__.getHoveredElementForBinding)(pointerCoords, this.scene);\n this.setState({\n suggestedBindings: hoveredBindableElement != null ? [hoveredBindableElement] : [],\n });\n };\n this.maybeSuggestBindingsForLinearElementAtCoords = (linearElement, \n /** scene coords */\n pointerCoords, \n // During line creation the start binding hasn't been written yet\n // into `linearElement`\n oppositeBindingBoundElement) => {\n if (!pointerCoords.length) {\n return;\n }\n const suggestedBindings = pointerCoords.reduce((acc, coords) => {\n const hoveredBindableElement = (0,_element_binding__WEBPACK_IMPORTED_MODULE_17__.getHoveredElementForBinding)(coords, this.scene);\n if (hoveredBindableElement != null &&\n !(0,_element_binding__WEBPACK_IMPORTED_MODULE_17__.isLinearElementSimpleAndAlreadyBound)(linearElement, oppositeBindingBoundElement === null || oppositeBindingBoundElement === void 0 ? void 0 : oppositeBindingBoundElement.id, hoveredBindableElement)) {\n acc.push(hoveredBindableElement);\n }\n return acc;\n }, []);\n this.setState({ suggestedBindings });\n };\n this.handleCanvasRef = (canvas) => {\n var _a, _b, _c;\n // canvas is null when unmounting\n if (canvas !== null) {\n this.canvas = canvas;\n this.rc = roughjs_bin_rough__WEBPACK_IMPORTED_MODULE_3__[\"default\"].canvas(this.canvas);\n this.canvas.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.WHEEL, this.handleWheel, {\n passive: false,\n });\n this.canvas.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.TOUCH_START, this.onTapStart);\n this.canvas.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.TOUCH_END, this.onTapEnd);\n }\n else {\n (_a = this.canvas) === null || _a === void 0 ? void 0 : _a.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.WHEEL, this.handleWheel);\n (_b = this.canvas) === null || _b === void 0 ? void 0 : _b.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.TOUCH_START, this.onTapStart);\n (_c = this.canvas) === null || _c === void 0 ? void 0 : _c.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.TOUCH_END, this.onTapEnd);\n }\n };\n this.handleAppOnDrop = (event) => __awaiter(this, void 0, void 0, function* () {\n // must be retrieved first, in the same frame\n const { file, fileHandle } = yield (0,_data_blob__WEBPACK_IMPORTED_MODULE_39__.getFileFromEvent)(event);\n try {\n if ((0,_data_blob__WEBPACK_IMPORTED_MODULE_39__.isSupportedImageFile)(file)) {\n // first attempt to decode scene from the image if it's embedded\n // ---------------------------------------------------------------------\n if ((file === null || file === void 0 ? void 0 : file.type) === _constants__WEBPACK_IMPORTED_MODULE_12__.MIME_TYPES.png || (file === null || file === void 0 ? void 0 : file.type) === _constants__WEBPACK_IMPORTED_MODULE_12__.MIME_TYPES.svg) {\n try {\n const scene = yield (0,_data__WEBPACK_IMPORTED_MODULE_13__.loadFromBlob)(file, this.state, this.scene.getElementsIncludingDeleted(), fileHandle);\n this.syncActionResult(Object.assign(Object.assign({}, scene), { appState: Object.assign(Object.assign({}, (scene.appState || this.state)), { isLoading: false }), replaceFiles: true, commitToHistory: true }));\n return;\n }\n catch (error) {\n if (error.name !== \"EncodingError\") {\n throw error;\n }\n }\n }\n // if no scene is embedded or we fail for whatever reason, fall back\n // to importing as regular image\n // ---------------------------------------------------------------------\n const { x: sceneX, y: sceneY } = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.viewportCoordsToSceneCoords)(event, this.state);\n const imageElement = this.createImageElement({ sceneX, sceneY });\n this.insertImageElement(imageElement, file);\n this.initializeImageDimensions(imageElement);\n this.setState({ selectedElementIds: { [imageElement.id]: true } });\n return;\n }\n }\n catch (error) {\n return this.setState({\n isLoading: false,\n errorMessage: error.message,\n });\n }\n const libraryJSON = event.dataTransfer.getData(_constants__WEBPACK_IMPORTED_MODULE_12__.MIME_TYPES.excalidrawlib);\n if (libraryJSON && typeof libraryJSON === \"string\") {\n try {\n const libraryItems = (0,_data_blob__WEBPACK_IMPORTED_MODULE_39__.parseLibraryJSON)(libraryJSON);\n this.addElementsFromPasteOrLibrary({\n elements: (0,_data_library__WEBPACK_IMPORTED_MODULE_14__.distributeLibraryItemsOnSquareGrid)(libraryItems),\n position: event,\n files: null,\n });\n }\n catch (error) {\n this.setState({ errorMessage: error.message });\n }\n return;\n }\n if (file) {\n // atetmpt to parse an excalidraw/excalidrawlib file\n yield this.loadFileToCanvas(file, fileHandle);\n }\n });\n this.loadFileToCanvas = (file, fileHandle) => __awaiter(this, void 0, void 0, function* () {\n file = yield (0,_data_blob__WEBPACK_IMPORTED_MODULE_39__.normalizeFile)(file);\n try {\n const ret = yield (0,_data_blob__WEBPACK_IMPORTED_MODULE_39__.loadSceneOrLibraryFromBlob)(file, this.state, this.scene.getElementsIncludingDeleted(), fileHandle);\n if (ret.type === _constants__WEBPACK_IMPORTED_MODULE_12__.MIME_TYPES.excalidraw) {\n this.setState({ isLoading: true });\n this.syncActionResult(Object.assign(Object.assign({}, ret.data), { appState: Object.assign(Object.assign({}, (ret.data.appState || this.state)), { isLoading: false }), replaceFiles: true, commitToHistory: true }));\n }\n else if (ret.type === _constants__WEBPACK_IMPORTED_MODULE_12__.MIME_TYPES.excalidrawlib) {\n yield this.library\n .updateLibrary({\n libraryItems: file,\n merge: true,\n openLibraryMenu: true,\n })\n .catch((error) => {\n console.error(error);\n this.setState({ errorMessage: (0,_i18n__WEBPACK_IMPORTED_MODULE_25__.t)(\"errors.importLibraryError\") });\n });\n }\n }\n catch (error) {\n this.setState({ isLoading: false, errorMessage: error.message });\n }\n });\n this.handleCanvasContextMenu = (event) => {\n event.preventDefault();\n if ((event.nativeEvent.pointerType === \"touch\" ||\n (event.nativeEvent.pointerType === \"pen\" &&\n // always allow if user uses a pen secondary button\n event.button !== _constants__WEBPACK_IMPORTED_MODULE_12__.POINTER_BUTTON.SECONDARY)) &&\n this.state.activeTool.type !== \"selection\") {\n return;\n }\n const { x, y } = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.viewportCoordsToSceneCoords)(event, this.state);\n const element = this.getElementAtPosition(x, y, {\n preferSelected: true,\n includeLockedElements: true,\n });\n const type = element ? \"element\" : \"canvas\";\n const container = this.excalidrawContainerRef.current;\n const { top: offsetTop, left: offsetLeft } = container.getBoundingClientRect();\n const left = event.clientX - offsetLeft;\n const top = event.clientY - offsetTop;\n if (element && !this.state.selectedElementIds[element.id]) {\n this.setState((0,_groups__WEBPACK_IMPORTED_MODULE_23__.selectGroupsForSelectedElements)(Object.assign(Object.assign({}, this.state), { selectedElementIds: { [element.id]: true } }), this.scene.getNonDeletedElements()), () => {\n this._openContextMenu({ top, left }, type);\n });\n }\n else {\n this._openContextMenu({ top, left }, type);\n }\n };\n this.maybeDragNewGenericElement = (pointerDownState, event) => {\n var _a;\n const draggingElement = this.state.draggingElement;\n const pointerCoords = pointerDownState.lastCoords;\n if (!draggingElement) {\n return;\n }\n if (draggingElement.type === \"selection\" &&\n this.state.activeTool.type !== \"eraser\") {\n (0,_element__WEBPACK_IMPORTED_MODULE_16__.dragNewElement)(draggingElement, this.state.activeTool.type, pointerDownState.origin.x, pointerDownState.origin.y, pointerCoords.x, pointerCoords.y, (0,_utils__WEBPACK_IMPORTED_MODULE_34__.distance)(pointerDownState.origin.x, pointerCoords.x), (0,_utils__WEBPACK_IMPORTED_MODULE_34__.distance)(pointerDownState.origin.y, pointerCoords.y), (0,_keys__WEBPACK_IMPORTED_MODULE_26__.shouldMaintainAspectRatio)(event), (0,_keys__WEBPACK_IMPORTED_MODULE_26__.shouldResizeFromCenter)(event));\n }\n else {\n const [gridX, gridY] = (0,_math__WEBPACK_IMPORTED_MODULE_27__.getGridPoint)(pointerCoords.x, pointerCoords.y, this.state.gridSize);\n const image = (0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_21__.isInitializedImageElement)(draggingElement) &&\n ((_a = this.imageCache.get(draggingElement.fileId)) === null || _a === void 0 ? void 0 : _a.image);\n const aspectRatio = image && !(image instanceof Promise)\n ? image.width / image.height\n : null;\n (0,_element__WEBPACK_IMPORTED_MODULE_16__.dragNewElement)(draggingElement, this.state.activeTool.type, pointerDownState.originInGrid.x, pointerDownState.originInGrid.y, gridX, gridY, (0,_utils__WEBPACK_IMPORTED_MODULE_34__.distance)(pointerDownState.originInGrid.x, gridX), (0,_utils__WEBPACK_IMPORTED_MODULE_34__.distance)(pointerDownState.originInGrid.y, gridY), (0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_21__.isImageElement)(draggingElement)\n ? !(0,_keys__WEBPACK_IMPORTED_MODULE_26__.shouldMaintainAspectRatio)(event)\n : (0,_keys__WEBPACK_IMPORTED_MODULE_26__.shouldMaintainAspectRatio)(event), (0,_keys__WEBPACK_IMPORTED_MODULE_26__.shouldResizeFromCenter)(event), aspectRatio);\n this.maybeSuggestBindingForAll([draggingElement]);\n }\n };\n this.maybeHandleResize = (pointerDownState, event) => {\n const selectedElements = (0,_scene__WEBPACK_IMPORTED_MODULE_30__.getSelectedElements)(this.scene.getNonDeletedElements(), this.state);\n const transformHandleType = pointerDownState.resize.handleType;\n this.setState({\n // TODO: rename this state field to \"isScaling\" to distinguish\n // it from the generic \"isResizing\" which includes scaling and\n // rotating\n isResizing: transformHandleType && transformHandleType !== \"rotation\",\n isRotating: transformHandleType === \"rotation\",\n });\n const pointerCoords = pointerDownState.lastCoords;\n const [resizeX, resizeY] = (0,_math__WEBPACK_IMPORTED_MODULE_27__.getGridPoint)(pointerCoords.x - pointerDownState.resize.offset.x, pointerCoords.y - pointerDownState.resize.offset.y, this.state.gridSize);\n if ((0,_element__WEBPACK_IMPORTED_MODULE_16__.transformElements)(pointerDownState, transformHandleType, selectedElements, pointerDownState.resize.arrowDirection, (0,_keys__WEBPACK_IMPORTED_MODULE_26__.shouldRotateWithDiscreteAngle)(event), (0,_keys__WEBPACK_IMPORTED_MODULE_26__.shouldResizeFromCenter)(event), selectedElements.length === 1 && (0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_21__.isImageElement)(selectedElements[0])\n ? !(0,_keys__WEBPACK_IMPORTED_MODULE_26__.shouldMaintainAspectRatio)(event)\n : (0,_keys__WEBPACK_IMPORTED_MODULE_26__.shouldMaintainAspectRatio)(event), resizeX, resizeY, pointerDownState.resize.center.x, pointerDownState.resize.center.y)) {\n this.maybeSuggestBindingForAll(selectedElements);\n return true;\n }\n return false;\n };\n /** @private use this.handleCanvasContextMenu */\n this._openContextMenu = ({ left, top, }, type) => {\n if (this.state.showHyperlinkPopup) {\n this.setState({ showHyperlinkPopup: false });\n }\n this.contextMenuOpen = true;\n const maybeGroupAction = _actions__WEBPACK_IMPORTED_MODULE_5__.actionGroup.contextItemPredicate(this.actionManager.getElementsIncludingDeleted(), this.actionManager.getAppState());\n const maybeUngroupAction = _actions__WEBPACK_IMPORTED_MODULE_5__.actionUngroup.contextItemPredicate(this.actionManager.getElementsIncludingDeleted(), this.actionManager.getAppState());\n const maybeFlipHorizontal = _actions__WEBPACK_IMPORTED_MODULE_5__.actionFlipHorizontal.contextItemPredicate(this.actionManager.getElementsIncludingDeleted(), this.actionManager.getAppState());\n const maybeFlipVertical = _actions__WEBPACK_IMPORTED_MODULE_5__.actionFlipVertical.contextItemPredicate(this.actionManager.getElementsIncludingDeleted(), this.actionManager.getAppState());\n const mayBeAllowUnbinding = _actions__WEBPACK_IMPORTED_MODULE_5__.actionUnbindText.contextItemPredicate(this.actionManager.getElementsIncludingDeleted(), this.actionManager.getAppState());\n const mayBeAllowBinding = _actions__WEBPACK_IMPORTED_MODULE_5__.actionBindText.contextItemPredicate(this.actionManager.getElementsIncludingDeleted(), this.actionManager.getAppState());\n const separator = \"separator\";\n const elements = this.scene.getNonDeletedElements();\n const selectedElements = (0,_scene__WEBPACK_IMPORTED_MODULE_30__.getSelectedElements)(this.scene.getNonDeletedElements(), this.state);\n const options = [];\n if (_clipboard__WEBPACK_IMPORTED_MODULE_11__.probablySupportsClipboardBlob && elements.length > 0) {\n options.push(_actions__WEBPACK_IMPORTED_MODULE_5__.actionCopyAsPng);\n }\n if (_clipboard__WEBPACK_IMPORTED_MODULE_11__.probablySupportsClipboardWriteText && elements.length > 0) {\n options.push(_actions__WEBPACK_IMPORTED_MODULE_5__.actionCopyAsSvg);\n }\n if (type === \"element\" &&\n _actions__WEBPACK_IMPORTED_MODULE_5__.copyText.contextItemPredicate(elements, this.state) &&\n _clipboard__WEBPACK_IMPORTED_MODULE_11__.probablySupportsClipboardWriteText) {\n options.push(_actions__WEBPACK_IMPORTED_MODULE_5__.copyText);\n }\n if (type === \"canvas\") {\n const viewModeOptions = [\n ...options,\n typeof this.props.gridModeEnabled === \"undefined\" &&\n _actions__WEBPACK_IMPORTED_MODULE_5__.actionToggleGridMode,\n typeof this.props.zenModeEnabled === \"undefined\" && _actions__WEBPACK_IMPORTED_MODULE_5__.actionToggleZenMode,\n typeof this.props.viewModeEnabled === \"undefined\" &&\n _actions_actionToggleViewMode__WEBPACK_IMPORTED_MODULE_38__.actionToggleViewMode,\n _actions__WEBPACK_IMPORTED_MODULE_5__.actionToggleStats,\n ];\n if (this.state.viewModeEnabled) {\n _ContextMenu__WEBPACK_IMPORTED_MODULE_35__[\"default\"].push({\n options: viewModeOptions,\n top,\n left,\n actionManager: this.actionManager,\n appState: this.state,\n container: this.excalidrawContainerRef.current,\n elements,\n });\n }\n else {\n _ContextMenu__WEBPACK_IMPORTED_MODULE_35__[\"default\"].push({\n options: [\n this.device.isMobile &&\n navigator.clipboard && {\n trackEvent: false,\n name: \"paste\",\n perform: (elements, appStates) => {\n this.pasteFromClipboard(null);\n return {\n commitToHistory: false,\n };\n },\n contextItemLabel: \"labels.paste\",\n },\n this.device.isMobile && navigator.clipboard && separator,\n _clipboard__WEBPACK_IMPORTED_MODULE_11__.probablySupportsClipboardBlob &&\n elements.length > 0 &&\n _actions__WEBPACK_IMPORTED_MODULE_5__.actionCopyAsPng,\n _clipboard__WEBPACK_IMPORTED_MODULE_11__.probablySupportsClipboardWriteText &&\n elements.length > 0 &&\n _actions__WEBPACK_IMPORTED_MODULE_5__.actionCopyAsSvg,\n _clipboard__WEBPACK_IMPORTED_MODULE_11__.probablySupportsClipboardWriteText &&\n selectedElements.length > 0 &&\n _actions__WEBPACK_IMPORTED_MODULE_5__.copyText,\n ((_clipboard__WEBPACK_IMPORTED_MODULE_11__.probablySupportsClipboardBlob && elements.length > 0) ||\n (_clipboard__WEBPACK_IMPORTED_MODULE_11__.probablySupportsClipboardWriteText && elements.length > 0)) &&\n separator,\n _actions__WEBPACK_IMPORTED_MODULE_5__.actionSelectAll,\n separator,\n typeof this.props.gridModeEnabled === \"undefined\" &&\n _actions__WEBPACK_IMPORTED_MODULE_5__.actionToggleGridMode,\n typeof this.props.zenModeEnabled === \"undefined\" &&\n _actions__WEBPACK_IMPORTED_MODULE_5__.actionToggleZenMode,\n typeof this.props.viewModeEnabled === \"undefined\" &&\n _actions_actionToggleViewMode__WEBPACK_IMPORTED_MODULE_38__.actionToggleViewMode,\n _actions__WEBPACK_IMPORTED_MODULE_5__.actionToggleStats,\n ],\n top,\n left,\n actionManager: this.actionManager,\n appState: this.state,\n container: this.excalidrawContainerRef.current,\n elements,\n });\n }\n }\n else if (type === \"element\") {\n if (this.state.viewModeEnabled) {\n _ContextMenu__WEBPACK_IMPORTED_MODULE_35__[\"default\"].push({\n options: [navigator.clipboard && _actions__WEBPACK_IMPORTED_MODULE_5__.actionCopy, ...options],\n top,\n left,\n actionManager: this.actionManager,\n appState: this.state,\n container: this.excalidrawContainerRef.current,\n elements,\n });\n }\n else {\n _ContextMenu__WEBPACK_IMPORTED_MODULE_35__[\"default\"].push({\n options: [\n this.device.isMobile && _actions__WEBPACK_IMPORTED_MODULE_5__.actionCut,\n this.device.isMobile && navigator.clipboard && _actions__WEBPACK_IMPORTED_MODULE_5__.actionCopy,\n this.device.isMobile &&\n navigator.clipboard && {\n name: \"paste\",\n trackEvent: false,\n perform: (elements, appStates) => {\n this.pasteFromClipboard(null);\n return {\n commitToHistory: false,\n };\n },\n contextItemLabel: \"labels.paste\",\n },\n this.device.isMobile && separator,\n ...options,\n separator,\n _actions__WEBPACK_IMPORTED_MODULE_5__.actionCopyStyles,\n _actions__WEBPACK_IMPORTED_MODULE_5__.actionPasteStyles,\n separator,\n maybeGroupAction && _actions__WEBPACK_IMPORTED_MODULE_5__.actionGroup,\n mayBeAllowUnbinding && _actions__WEBPACK_IMPORTED_MODULE_5__.actionUnbindText,\n mayBeAllowBinding && _actions__WEBPACK_IMPORTED_MODULE_5__.actionBindText,\n maybeUngroupAction && _actions__WEBPACK_IMPORTED_MODULE_5__.actionUngroup,\n (maybeGroupAction || maybeUngroupAction) && separator,\n _actions__WEBPACK_IMPORTED_MODULE_5__.actionAddToLibrary,\n separator,\n _actions__WEBPACK_IMPORTED_MODULE_5__.actionSendBackward,\n _actions__WEBPACK_IMPORTED_MODULE_5__.actionBringForward,\n _actions__WEBPACK_IMPORTED_MODULE_5__.actionSendToBack,\n _actions__WEBPACK_IMPORTED_MODULE_5__.actionBringToFront,\n separator,\n maybeFlipHorizontal && _actions__WEBPACK_IMPORTED_MODULE_5__.actionFlipHorizontal,\n maybeFlipVertical && _actions__WEBPACK_IMPORTED_MODULE_5__.actionFlipVertical,\n (maybeFlipHorizontal || maybeFlipVertical) && separator,\n _actions__WEBPACK_IMPORTED_MODULE_5__.actionLink.contextItemPredicate(elements, this.state) && _actions__WEBPACK_IMPORTED_MODULE_5__.actionLink,\n _actions__WEBPACK_IMPORTED_MODULE_5__.actionDuplicateSelection,\n _actions__WEBPACK_IMPORTED_MODULE_5__.actionToggleLock,\n separator,\n _actions__WEBPACK_IMPORTED_MODULE_5__.actionDeleteSelected,\n ],\n top,\n left,\n actionManager: this.actionManager,\n appState: this.state,\n container: this.excalidrawContainerRef.current,\n elements,\n });\n }\n }\n };\n this.handleWheel = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.withBatchedUpdates)((event) => {\n event.preventDefault();\n if (isPanning) {\n return;\n }\n const { deltaX, deltaY } = event;\n // note that event.ctrlKey is necessary to handle pinch zooming\n if (event.metaKey || event.ctrlKey) {\n const sign = Math.sign(deltaY);\n const MAX_STEP = 10;\n const absDelta = Math.abs(deltaY);\n let delta = deltaY;\n if (absDelta > MAX_STEP) {\n delta = MAX_STEP * sign;\n }\n let newZoom = this.state.zoom.value - delta / 100;\n // increase zoom steps the more zoomed-in we are (applies to >100% only)\n newZoom +=\n Math.log10(Math.max(1, this.state.zoom.value)) *\n -sign *\n // reduced amplification for small deltas (small movements on a trackpad)\n Math.min(1, absDelta / 20);\n this.setState((state) => (Object.assign(Object.assign({}, (0,_scene_zoom__WEBPACK_IMPORTED_MODULE_32__.getStateForZoom)({\n viewportX: cursorX,\n viewportY: cursorY,\n nextZoom: (0,_scene__WEBPACK_IMPORTED_MODULE_30__.getNormalizedZoom)(newZoom),\n }, state)), { shouldCacheIgnoreZoom: true })));\n this.resetShouldCacheIgnoreZoomDebounced();\n return;\n }\n // scroll horizontally when shift pressed\n if (event.shiftKey) {\n this.setState(({ zoom, scrollX }) => ({\n // on Mac, shift+wheel tends to result in deltaX\n scrollX: scrollX - (deltaY || deltaX) / zoom.value,\n }));\n return;\n }\n this.setState(({ zoom, scrollX, scrollY }) => ({\n scrollX: scrollX - deltaX / zoom.value,\n scrollY: scrollY - deltaY / zoom.value,\n }));\n });\n this.savePointer = (x, y, button) => {\n var _a, _b;\n if (!x || !y) {\n return;\n }\n const pointer = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.viewportCoordsToSceneCoords)({ clientX: x, clientY: y }, this.state);\n if (isNaN(pointer.x) || isNaN(pointer.y)) {\n // sometimes the pointer goes off screen\n }\n (_b = (_a = this.props).onPointerUpdate) === null || _b === void 0 ? void 0 : _b.call(_a, {\n pointer,\n button,\n pointersMap: gesture.pointers,\n });\n };\n this.resetShouldCacheIgnoreZoomDebounced = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.debounce)(() => {\n if (!this.unmounted) {\n this.setState({ shouldCacheIgnoreZoom: false });\n }\n }, 300);\n this.updateDOMRect = (cb) => {\n var _a;\n if ((_a = this.excalidrawContainerRef) === null || _a === void 0 ? void 0 : _a.current) {\n const excalidrawContainer = this.excalidrawContainerRef.current;\n const { width, height, left: offsetLeft, top: offsetTop, } = excalidrawContainer.getBoundingClientRect();\n const { width: currentWidth, height: currentHeight, offsetTop: currentOffsetTop, offsetLeft: currentOffsetLeft, } = this.state;\n if (width === currentWidth &&\n height === currentHeight &&\n offsetLeft === currentOffsetLeft &&\n offsetTop === currentOffsetTop) {\n if (cb) {\n cb();\n }\n return;\n }\n this.setState({\n width,\n height,\n offsetLeft,\n offsetTop,\n }, () => {\n cb && cb();\n });\n }\n };\n this.refresh = () => {\n this.setState(Object.assign({}, this.getCanvasOffsets()));\n };\n const defaultAppState = (0,_appState__WEBPACK_IMPORTED_MODULE_10__.getDefaultAppState)();\n const { excalidrawRef, viewModeEnabled = false, zenModeEnabled = false, gridModeEnabled = false, theme = defaultAppState.theme, name = defaultAppState.name, } = props;\n this.state = Object.assign(Object.assign(Object.assign(Object.assign({}, defaultAppState), { theme, isLoading: true }), this.getCanvasOffsets()), { viewModeEnabled,\n zenModeEnabled, gridSize: gridModeEnabled ? _constants__WEBPACK_IMPORTED_MODULE_12__.GRID_SIZE : null, name, width: window.innerWidth, height: window.innerHeight, showHyperlinkPopup: false, isLibraryMenuDocked: false });\n this.id = (0,nanoid__WEBPACK_IMPORTED_MODULE_46__.nanoid)();\n this.library = new _data_library__WEBPACK_IMPORTED_MODULE_14__[\"default\"](this);\n if (excalidrawRef) {\n const readyPromise = (\"current\" in excalidrawRef && ((_a = excalidrawRef.current) === null || _a === void 0 ? void 0 : _a.readyPromise)) ||\n (0,_utils__WEBPACK_IMPORTED_MODULE_34__.resolvablePromise)();\n const api = {\n ready: true,\n readyPromise,\n updateScene: this.updateScene,\n updateLibrary: this.library.updateLibrary,\n addFiles: this.addFiles,\n resetScene: this.resetScene,\n getSceneElementsIncludingDeleted: this.getSceneElementsIncludingDeleted,\n history: {\n clear: this.resetHistory,\n },\n scrollToContent: this.scrollToContent,\n getSceneElements: this.getSceneElements,\n getAppState: () => this.state,\n getFiles: () => this.files,\n refresh: this.refresh,\n setToast: this.setToast,\n id: this.id,\n setActiveTool: this.setActiveTool,\n setCursor: this.setCursor,\n resetCursor: this.resetCursor,\n };\n if (typeof excalidrawRef === \"function\") {\n excalidrawRef(api);\n }\n else {\n excalidrawRef.current = api;\n }\n readyPromise.resolve(api);\n }\n this.excalidrawContainerValue = {\n container: this.excalidrawContainerRef.current,\n id: this.id,\n };\n this.scene = new _scene_Scene__WEBPACK_IMPORTED_MODULE_31__[\"default\"]();\n this.history = new _history__WEBPACK_IMPORTED_MODULE_24__[\"default\"]();\n this.actionManager = new _actions_manager__WEBPACK_IMPORTED_MODULE_7__.ActionManager(this.syncActionResult, () => this.state, () => this.scene.getElementsIncludingDeleted(), this);\n this.actionManager.registerAll(_actions_register__WEBPACK_IMPORTED_MODULE_8__.actions);\n this.actionManager.registerAction((0,_actions_actionHistory__WEBPACK_IMPORTED_MODULE_6__.createUndoAction)(this.history));\n this.actionManager.registerAction((0,_actions_actionHistory__WEBPACK_IMPORTED_MODULE_6__.createRedoAction)(this.history));\n }\n renderCanvas() {\n const canvasScale = window.devicePixelRatio;\n const { width: canvasDOMWidth, height: canvasDOMHeight, viewModeEnabled, } = this.state;\n const canvasWidth = canvasDOMWidth * canvasScale;\n const canvasHeight = canvasDOMHeight * canvasScale;\n if (viewModeEnabled) {\n return ((0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(\"canvas\", Object.assign({ className: \"excalidraw__canvas\", style: {\n width: canvasDOMWidth,\n height: canvasDOMHeight,\n cursor: _constants__WEBPACK_IMPORTED_MODULE_12__.CURSOR_TYPE.GRAB,\n }, width: canvasWidth, height: canvasHeight, ref: this.handleCanvasRef, onContextMenu: this.handleCanvasContextMenu, onPointerMove: this.handleCanvasPointerMove, onPointerUp: this.handleCanvasPointerUp, onPointerCancel: this.removePointer, onTouchMove: this.handleTouchMove, onPointerDown: this.handleCanvasPointerDown }, { children: (0,_i18n__WEBPACK_IMPORTED_MODULE_25__.t)(\"labels.drawingCanvas\") })));\n }\n return ((0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(\"canvas\", Object.assign({ className: \"excalidraw__canvas\", style: {\n width: canvasDOMWidth,\n height: canvasDOMHeight,\n }, width: canvasWidth, height: canvasHeight, ref: this.handleCanvasRef, onContextMenu: this.handleCanvasContextMenu, onPointerDown: this.handleCanvasPointerDown, onDoubleClick: this.handleCanvasDoubleClick, onPointerMove: this.handleCanvasPointerMove, onPointerUp: this.handleCanvasPointerUp, onPointerCancel: this.removePointer, onTouchMove: this.handleTouchMove }, { children: (0,_i18n__WEBPACK_IMPORTED_MODULE_25__.t)(\"labels.drawingCanvas\") })));\n }\n render() {\n var _a, _b;\n const selectedElement = (0,_scene__WEBPACK_IMPORTED_MODULE_30__.getSelectedElements)(this.scene.getNonDeletedElements(), this.state);\n const { onCollabButtonClick, renderTopRightUI, renderFooter, renderCustomStats, } = this.props;\n return ((0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(\"div\", Object.assign({ className: (0,clsx__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(\"excalidraw excalidraw-container\", {\n \"excalidraw--view-mode\": this.state.viewModeEnabled,\n \"excalidraw--mobile\": this.device.isMobile,\n }), ref: this.excalidrawContainerRef, onDrop: this.handleAppOnDrop, tabIndex: 0, onKeyDown: this.props.handleKeyboardGlobally ? undefined : this.onKeyDown }, { children: (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(ExcalidrawContainerContext.Provider, Object.assign({ value: this.excalidrawContainerValue }, { children: (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)(DeviceContext.Provider, Object.assign({ value: this.device }, { children: [(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_LayerUI__WEBPACK_IMPORTED_MODULE_36__[\"default\"], { canvas: this.canvas, appState: this.state, files: this.files, setAppState: this.setAppState, actionManager: this.actionManager, elements: this.scene.getNonDeletedElements(), onCollabButtonClick: onCollabButtonClick, onLockToggle: this.toggleLock, onPenModeToggle: this.togglePenMode, onInsertElements: (elements) => this.addElementsFromPasteOrLibrary({\n elements,\n position: \"center\",\n files: null,\n }), langCode: (0,_i18n__WEBPACK_IMPORTED_MODULE_25__.getLanguage)().code, isCollaborating: this.props.isCollaborating, renderTopRightUI: renderTopRightUI, renderCustomFooter: renderFooter, renderCustomStats: renderCustomStats, showExitZenModeBtn: typeof ((_a = this.props) === null || _a === void 0 ? void 0 : _a.zenModeEnabled) === \"undefined\" &&\n this.state.zenModeEnabled, showThemeBtn: typeof ((_b = this.props) === null || _b === void 0 ? void 0 : _b.theme) === \"undefined\" &&\n this.props.UIOptions.canvasActions.theme, libraryReturnUrl: this.props.libraryReturnUrl, UIOptions: this.props.UIOptions, focusContainer: this.focusContainer, library: this.library, id: this.id, onImageAction: this.onImageAction }), (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(\"div\", { className: \"excalidraw-textEditorContainer\" }), (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(\"div\", { className: \"excalidraw-contextMenuContainer\" }), selectedElement.length === 1 && this.state.showHyperlinkPopup && ((0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_element_Hyperlink__WEBPACK_IMPORTED_MODULE_45__.Hyperlink, { element: selectedElement[0], appState: this.state, setAppState: this.setAppState, onLinkOpen: this.props.onLinkOpen }, selectedElement[0].id)), this.state.toast !== null && ((0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_Toast__WEBPACK_IMPORTED_MODULE_37__.Toast, { message: this.state.toast.message, onClose: () => this.setToast(null), duration: this.state.toast.duration, closable: this.state.toast.closable })), (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(\"main\", { children: this.renderCanvas() })] })) })) })));\n }\n componentDidMount() {\n var _a, _b;\n return __awaiter(this, void 0, void 0, function* () {\n this.unmounted = false;\n this.excalidrawContainerValue.container =\n this.excalidrawContainerRef.current;\n if (\"development\" === _constants__WEBPACK_IMPORTED_MODULE_12__.ENV.TEST ||\n \"development\" === _constants__WEBPACK_IMPORTED_MODULE_12__.ENV.DEVELOPMENT) {\n const setState = this.setState.bind(this);\n Object.defineProperties(window.h, {\n state: {\n configurable: true,\n get: () => {\n return this.state;\n },\n },\n setState: {\n configurable: true,\n value: (...args) => {\n return this.setState(...args);\n },\n },\n app: {\n configurable: true,\n value: this,\n },\n history: {\n configurable: true,\n value: this.history,\n },\n });\n }\n this.scene.addCallback(this.onSceneUpdated);\n this.addEventListeners();\n if (this.excalidrawContainerRef.current) {\n this.focusContainer();\n }\n if (this.excalidrawContainerRef.current &&\n // bounding rects don't work in tests so updating\n // the state on init would result in making the test enviro run\n // in mobile breakpoint (0 width/height), making everything fail\n \"development\" !== \"test\") {\n this.refreshDeviceState(this.excalidrawContainerRef.current);\n }\n if (\"ResizeObserver\" in window && ((_a = this.excalidrawContainerRef) === null || _a === void 0 ? void 0 : _a.current)) {\n this.resizeObserver = new ResizeObserver(() => {\n THROTTLE_NEXT_RENDER = false;\n // recompute device dimensions state\n // ---------------------------------------------------------------------\n this.refreshDeviceState(this.excalidrawContainerRef.current);\n // refresh offsets\n // ---------------------------------------------------------------------\n this.updateDOMRect();\n });\n (_b = this.resizeObserver) === null || _b === void 0 ? void 0 : _b.observe(this.excalidrawContainerRef.current);\n }\n else if (window.matchMedia) {\n const mdScreenQuery = window.matchMedia(`(max-width: ${_constants__WEBPACK_IMPORTED_MODULE_12__.MQ_MAX_WIDTH_PORTRAIT}px), (max-height: ${_constants__WEBPACK_IMPORTED_MODULE_12__.MQ_MAX_HEIGHT_LANDSCAPE}px) and (max-width: ${_constants__WEBPACK_IMPORTED_MODULE_12__.MQ_MAX_WIDTH_LANDSCAPE}px)`);\n const smScreenQuery = window.matchMedia(`(max-width: ${_constants__WEBPACK_IMPORTED_MODULE_12__.MQ_SM_MAX_WIDTH}px)`);\n const canDeviceFitSidebarMediaQuery = window.matchMedia(`(min-width: ${\n // NOTE this won't update if a different breakpoint is supplied\n // after mount\n this.props.UIOptions.dockedSidebarBreakpoint != null\n ? this.props.UIOptions.dockedSidebarBreakpoint\n : _constants__WEBPACK_IMPORTED_MODULE_12__.MQ_RIGHT_SIDEBAR_MIN_WIDTH}px)`);\n const handler = () => {\n this.excalidrawContainerRef.current.getBoundingClientRect();\n this.device = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.updateObject)(this.device, {\n isSmScreen: smScreenQuery.matches,\n isMobile: mdScreenQuery.matches,\n canDeviceFitSidebar: canDeviceFitSidebarMediaQuery.matches,\n });\n };\n mdScreenQuery.addListener(handler);\n this.detachIsMobileMqHandler = () => mdScreenQuery.removeListener(handler);\n }\n const searchParams = new URLSearchParams(window.location.search.slice(1));\n if (searchParams.has(\"web-share-target\")) {\n // Obtain a file that was shared via the Web Share Target API.\n this.restoreFileFromShare();\n }\n else {\n this.updateDOMRect(this.initializeScene);\n }\n });\n }\n componentWillUnmount() {\n var _a;\n this.files = {};\n this.imageCache.clear();\n (_a = this.resizeObserver) === null || _a === void 0 ? void 0 : _a.disconnect();\n this.unmounted = true;\n this.removeEventListeners();\n this.scene.destroy();\n clearTimeout(touchTimeout);\n touchTimeout = 0;\n }\n removeEventListeners() {\n var _a, _b, _c, _d, _e;\n document.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.POINTER_UP, this.removePointer);\n document.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.COPY, this.onCopy);\n document.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.PASTE, this.pasteFromClipboard);\n document.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.CUT, this.onCut);\n (_a = this.excalidrawContainerRef.current) === null || _a === void 0 ? void 0 : _a.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.WHEEL, this.onWheel);\n (_b = this.nearestScrollableContainer) === null || _b === void 0 ? void 0 : _b.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.SCROLL, this.onScroll);\n document.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.KEYDOWN, this.onKeyDown, false);\n document.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.MOUSE_MOVE, this.updateCurrentCursorPosition, false);\n document.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.KEYUP, this.onKeyUp);\n window.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.RESIZE, this.onResize, false);\n window.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.UNLOAD, this.onUnload, false);\n window.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.BLUR, this.onBlur, false);\n (_c = this.excalidrawContainerRef.current) === null || _c === void 0 ? void 0 : _c.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.DRAG_OVER, this.disableEvent, false);\n (_d = this.excalidrawContainerRef.current) === null || _d === void 0 ? void 0 : _d.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.DROP, this.disableEvent, false);\n document.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.GESTURE_START, this.onGestureStart, false);\n document.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.GESTURE_CHANGE, this.onGestureChange, false);\n document.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.GESTURE_END, this.onGestureEnd, false);\n (_e = this.detachIsMobileMqHandler) === null || _e === void 0 ? void 0 : _e.call(this);\n }\n addEventListeners() {\n var _a, _b, _c, _d, _e;\n this.removeEventListeners();\n document.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.POINTER_UP, this.removePointer); // #3553\n document.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.COPY, this.onCopy);\n (_a = this.excalidrawContainerRef.current) === null || _a === void 0 ? void 0 : _a.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.WHEEL, this.onWheel, { passive: false });\n if (this.props.handleKeyboardGlobally) {\n document.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.KEYDOWN, this.onKeyDown, false);\n }\n document.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.KEYUP, this.onKeyUp, { passive: true });\n document.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.MOUSE_MOVE, this.updateCurrentCursorPosition);\n // rerender text elements on font load to fix #637 && #1553\n (_c = (_b = document.fonts) === null || _b === void 0 ? void 0 : _b.addEventListener) === null || _c === void 0 ? void 0 : _c.call(_b, \"loadingdone\", this.onFontLoaded);\n // Safari-only desktop pinch zoom\n document.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.GESTURE_START, this.onGestureStart, false);\n document.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.GESTURE_CHANGE, this.onGestureChange, false);\n document.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.GESTURE_END, this.onGestureEnd, false);\n if (this.state.viewModeEnabled) {\n return;\n }\n document.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.PASTE, this.pasteFromClipboard);\n document.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.CUT, this.onCut);\n if (this.props.detectScroll) {\n this.nearestScrollableContainer = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.getNearestScrollableContainer)(this.excalidrawContainerRef.current);\n this.nearestScrollableContainer.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.SCROLL, this.onScroll);\n }\n window.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.RESIZE, this.onResize, false);\n window.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.UNLOAD, this.onUnload, false);\n window.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.BLUR, this.onBlur, false);\n (_d = this.excalidrawContainerRef.current) === null || _d === void 0 ? void 0 : _d.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.DRAG_OVER, this.disableEvent, false);\n (_e = this.excalidrawContainerRef.current) === null || _e === void 0 ? void 0 : _e.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.DROP, this.disableEvent, false);\n }\n componentDidUpdate(prevProps, prevState) {\n var _a, _b, _c, _d, _e;\n if (this.excalidrawContainerRef.current &&\n prevProps.UIOptions.dockedSidebarBreakpoint !==\n this.props.UIOptions.dockedSidebarBreakpoint) {\n this.refreshDeviceState(this.excalidrawContainerRef.current);\n }\n if (prevState.scrollX !== this.state.scrollX ||\n prevState.scrollY !== this.state.scrollY) {\n (_b = (_a = this.props) === null || _a === void 0 ? void 0 : _a.onScrollChange) === null || _b === void 0 ? void 0 : _b.call(_a, this.state.scrollX, this.state.scrollY);\n }\n if (Object.keys(this.state.selectedElementIds).length &&\n (0,_appState__WEBPACK_IMPORTED_MODULE_10__.isEraserActive)(this.state)) {\n this.setState({\n activeTool: (0,_utils__WEBPACK_IMPORTED_MODULE_34__.updateActiveTool)(this.state, { type: \"selection\" }),\n });\n }\n if (this.state.activeTool.type === \"eraser\" &&\n prevState.theme !== this.state.theme) {\n (0,_utils__WEBPACK_IMPORTED_MODULE_34__.setEraserCursor)(this.canvas, this.state.theme);\n }\n // Hide hyperlink popup if shown when element type is not selection\n if (prevState.activeTool.type === \"selection\" &&\n this.state.activeTool.type !== \"selection\" &&\n this.state.showHyperlinkPopup) {\n this.setState({ showHyperlinkPopup: false });\n }\n if (prevProps.langCode !== this.props.langCode) {\n this.updateLanguage();\n }\n if (prevProps.viewModeEnabled !== this.props.viewModeEnabled) {\n this.setState({ viewModeEnabled: !!this.props.viewModeEnabled });\n }\n if (prevState.viewModeEnabled !== this.state.viewModeEnabled) {\n this.addEventListeners();\n this.deselectElements();\n }\n if (prevProps.zenModeEnabled !== this.props.zenModeEnabled) {\n this.setState({ zenModeEnabled: !!this.props.zenModeEnabled });\n }\n if (prevProps.theme !== this.props.theme && this.props.theme) {\n this.setState({ theme: this.props.theme });\n }\n if (prevProps.gridModeEnabled !== this.props.gridModeEnabled) {\n this.setState({\n gridSize: this.props.gridModeEnabled ? _constants__WEBPACK_IMPORTED_MODULE_12__.GRID_SIZE : null,\n });\n }\n if (this.props.name && prevProps.name !== this.props.name) {\n this.setState({\n name: this.props.name,\n });\n }\n (_c = this.excalidrawContainerRef.current) === null || _c === void 0 ? void 0 : _c.classList.toggle(\"theme--dark\", this.state.theme === \"dark\");\n if (this.state.editingLinearElement &&\n !this.state.selectedElementIds[this.state.editingLinearElement.elementId]) {\n // defer so that the commitToHistory flag isn't reset via current update\n setTimeout(() => {\n this.actionManager.executeAction(_actions__WEBPACK_IMPORTED_MODULE_5__.actionFinalize);\n });\n }\n const { multiElement } = prevState;\n if (prevState.activeTool !== this.state.activeTool &&\n multiElement != null &&\n (0,_element_binding__WEBPACK_IMPORTED_MODULE_17__.isBindingEnabled)(this.state) &&\n (0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_21__.isBindingElement)(multiElement, false)) {\n (0,_element_binding__WEBPACK_IMPORTED_MODULE_17__.maybeBindLinearElement)(multiElement, this.state, this.scene, (0,_utils__WEBPACK_IMPORTED_MODULE_34__.tupleToCoors)(_element_linearElementEditor__WEBPACK_IMPORTED_MODULE_18__.LinearElementEditor.getPointAtIndexGlobalCoordinates(multiElement, -1)));\n }\n const cursorButton = {};\n const pointerViewportCoords = {};\n const remoteSelectedElementIds = {};\n const pointerUsernames = {};\n const pointerUserStates = {};\n this.state.collaborators.forEach((user, socketId) => {\n if (user.selectedElementIds) {\n for (const id of Object.keys(user.selectedElementIds)) {\n if (!(id in remoteSelectedElementIds)) {\n remoteSelectedElementIds[id] = [];\n }\n remoteSelectedElementIds[id].push(socketId);\n }\n }\n if (!user.pointer) {\n return;\n }\n if (user.username) {\n pointerUsernames[socketId] = user.username;\n }\n if (user.userState) {\n pointerUserStates[socketId] = user.userState;\n }\n pointerViewportCoords[socketId] = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.sceneCoordsToViewportCoords)({\n sceneX: user.pointer.x,\n sceneY: user.pointer.y,\n }, this.state);\n cursorButton[socketId] = user.button;\n });\n const renderingElements = this.scene\n .getNonDeletedElements()\n .filter((element) => {\n if ((0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_21__.isImageElement)(element)) {\n if (\n // not placed on canvas yet (but in elements array)\n this.state.pendingImageElementId === element.id) {\n return false;\n }\n }\n // don't render text element that's being currently edited (it's\n // rendered on remote only)\n return (!this.state.editingElement ||\n this.state.editingElement.type !== \"text\" ||\n element.id !== this.state.editingElement.id);\n });\n (0,_renderer_renderScene__WEBPACK_IMPORTED_MODULE_28__.renderScene)(renderingElements, this.state, this.state.selectionElement, window.devicePixelRatio, this.rc, this.canvas, {\n scrollX: this.state.scrollX,\n scrollY: this.state.scrollY,\n viewBackgroundColor: this.state.viewBackgroundColor,\n zoom: this.state.zoom,\n remotePointerViewportCoords: pointerViewportCoords,\n remotePointerButton: cursorButton,\n remoteSelectedElementIds,\n remotePointerUsernames: pointerUsernames,\n remotePointerUserStates: pointerUserStates,\n shouldCacheIgnoreZoom: this.state.shouldCacheIgnoreZoom,\n theme: this.state.theme,\n imageCache: this.imageCache,\n isExporting: false,\n renderScrollbars: !this.device.isMobile,\n }, ({ atLeastOneVisibleElement, scrollBars }) => {\n if (scrollBars) {\n currentScrollBars = scrollBars;\n }\n const scrolledOutside = \n // hide when editing text\n (0,_element__WEBPACK_IMPORTED_MODULE_16__.isTextElement)(this.state.editingElement)\n ? false\n : !atLeastOneVisibleElement && renderingElements.length > 0;\n if (this.state.scrolledOutside !== scrolledOutside) {\n this.setState({ scrolledOutside });\n }\n this.scheduleImageRefresh();\n }, THROTTLE_NEXT_RENDER && window.EXCALIDRAW_THROTTLE_RENDER === true);\n if (!THROTTLE_NEXT_RENDER) {\n THROTTLE_NEXT_RENDER = true;\n }\n this.history.record(this.state, this.scene.getElementsIncludingDeleted());\n // Do not notify consumers if we're still loading the scene. Among other\n // potential issues, this fixes a case where the tab isn't focused during\n // init, which would trigger onChange with empty elements, which would then\n // override whatever is in localStorage currently.\n if (!this.state.isLoading) {\n (_e = (_d = this.props).onChange) === null || _e === void 0 ? void 0 : _e.call(_d, this.scene.getElementsIncludingDeleted(), this.state, this.files);\n }\n }\n static resetTapTwice() {\n didTapTwice = false;\n }\n addTextFromPaste(text) {\n const { x, y } = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.viewportCoordsToSceneCoords)({ clientX: cursorX, clientY: cursorY }, this.state);\n const element = (0,_element__WEBPACK_IMPORTED_MODULE_16__.newTextElement)({\n x,\n y,\n strokeColor: this.state.currentItemStrokeColor,\n backgroundColor: this.state.currentItemBackgroundColor,\n fillStyle: this.state.currentItemFillStyle,\n strokeWidth: this.state.currentItemStrokeWidth,\n strokeStyle: this.state.currentItemStrokeStyle,\n roughness: this.state.currentItemRoughness,\n opacity: this.state.currentItemOpacity,\n strokeSharpness: this.state.currentItemStrokeSharpness,\n text,\n fontSize: this.state.currentItemFontSize,\n fontFamily: this.state.currentItemFontFamily,\n textAlign: this.state.currentItemTextAlign,\n verticalAlign: _constants__WEBPACK_IMPORTED_MODULE_12__.DEFAULT_VERTICAL_ALIGN,\n locked: false,\n });\n this.scene.replaceAllElements([\n ...this.scene.getElementsIncludingDeleted(),\n element,\n ]);\n this.setState({ selectedElementIds: { [element.id]: true } });\n this.history.resumeRecording();\n }\n handleTextWysiwyg(element, { isExistingElement = false, }) {\n const updateElement = (text, originalText, isDeleted) => {\n this.scene.replaceAllElements([\n ...this.scene.getElementsIncludingDeleted().map((_element) => {\n if (_element.id === element.id && (0,_element__WEBPACK_IMPORTED_MODULE_16__.isTextElement)(_element)) {\n return (0,_element__WEBPACK_IMPORTED_MODULE_16__.updateTextElement)(_element, {\n text,\n isDeleted,\n originalText,\n });\n }\n return _element;\n }),\n ]);\n };\n (0,_element__WEBPACK_IMPORTED_MODULE_16__.textWysiwyg)({\n id: element.id,\n canvas: this.canvas,\n getViewportCoords: (x, y) => {\n const { x: viewportX, y: viewportY } = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.sceneCoordsToViewportCoords)({\n sceneX: x,\n sceneY: y,\n }, this.state);\n return [\n viewportX - this.state.offsetLeft,\n viewportY - this.state.offsetTop,\n ];\n },\n onChange: (0,_utils__WEBPACK_IMPORTED_MODULE_34__.withBatchedUpdates)((text) => {\n updateElement(text, text, false);\n if ((0,_element__WEBPACK_IMPORTED_MODULE_16__.isNonDeletedElement)(element)) {\n (0,_element_binding__WEBPACK_IMPORTED_MODULE_17__.updateBoundElements)(element);\n }\n }),\n onSubmit: (0,_utils__WEBPACK_IMPORTED_MODULE_34__.withBatchedUpdates)(({ text, viaKeyboard, originalText }) => {\n const isDeleted = !text.trim();\n updateElement(text, originalText, isDeleted);\n // select the created text element only if submitting via keyboard\n // (when submitting via click it should act as signal to deselect)\n if (!isDeleted && viaKeyboard) {\n const elementIdToSelect = element.containerId\n ? element.containerId\n : element.id;\n this.setState((prevState) => ({\n selectedElementIds: Object.assign(Object.assign({}, prevState.selectedElementIds), { [elementIdToSelect]: true }),\n }));\n }\n if (isDeleted) {\n (0,_element_binding__WEBPACK_IMPORTED_MODULE_17__.fixBindingsAfterDeletion)(this.scene.getNonDeletedElements(), [\n element,\n ]);\n }\n if (!isDeleted || isExistingElement) {\n this.history.resumeRecording();\n }\n this.setState({\n draggingElement: null,\n editingElement: null,\n });\n if (this.state.activeTool.locked) {\n (0,_utils__WEBPACK_IMPORTED_MODULE_34__.setCursorForShape)(this.canvas, this.state);\n }\n this.focusContainer();\n }),\n element,\n excalidrawContainer: this.excalidrawContainerRef.current,\n app: this,\n });\n // deselect all other elements when inserting text\n this.deselectElements();\n // do an initial update to re-initialize element position since we were\n // modifying element's x/y for sake of editor (case: syncing to remote)\n updateElement(element.text, element.originalText, false);\n }\n deselectElements() {\n this.setState({\n selectedElementIds: {},\n selectedGroupIds: {},\n editingGroupId: null,\n });\n }\n getTextElementAtPosition(x, y) {\n const element = this.getElementAtPosition(x, y, {\n includeBoundTextElement: true,\n });\n if (element && (0,_element__WEBPACK_IMPORTED_MODULE_16__.isTextElement)(element) && !element.isDeleted) {\n return element;\n }\n return null;\n }\n getElementAtPosition(x, y, opts) {\n const allHitElements = this.getElementsAtPosition(x, y, opts === null || opts === void 0 ? void 0 : opts.includeBoundTextElement, opts === null || opts === void 0 ? void 0 : opts.includeLockedElements);\n if (allHitElements.length > 1) {\n if (opts === null || opts === void 0 ? void 0 : opts.preferSelected) {\n for (let index = allHitElements.length - 1; index > -1; index--) {\n if (this.state.selectedElementIds[allHitElements[index].id]) {\n return allHitElements[index];\n }\n }\n }\n const elementWithHighestZIndex = allHitElements[allHitElements.length - 1];\n // If we're hitting element with highest z-index only on its bounding box\n // while also hitting other element figure, the latter should be considered.\n return (0,_element__WEBPACK_IMPORTED_MODULE_16__.isHittingElementBoundingBoxWithoutHittingElement)(elementWithHighestZIndex, this.state, x, y)\n ? allHitElements[allHitElements.length - 2]\n : elementWithHighestZIndex;\n }\n if (allHitElements.length === 1) {\n return allHitElements[0];\n }\n return null;\n }\n getElementsAtPosition(x, y, includeBoundTextElement = false, includeLockedElements = false) {\n const elements = includeBoundTextElement && includeLockedElements\n ? this.scene.getNonDeletedElements()\n : this.scene\n .getNonDeletedElements()\n .filter((element) => (includeLockedElements || !element.locked) &&\n (includeBoundTextElement ||\n !((0,_element__WEBPACK_IMPORTED_MODULE_16__.isTextElement)(element) && element.containerId)));\n return (0,_scene__WEBPACK_IMPORTED_MODULE_30__.getElementsAtPosition)(elements, (element) => (0,_element__WEBPACK_IMPORTED_MODULE_16__.hitTest)(element, this.state, x, y));\n }\n maybeCleanupAfterMissingPointerUp(event) {\n if (lastPointerUp !== null) {\n // Unfortunately, sometimes we don't get a pointerup after a pointerdown,\n // this can happen when a contextual menu or alert is triggered. In order to avoid\n // being in a weird state, we clean up on the next pointerdown\n lastPointerUp(event);\n }\n }\n updateGestureOnPointerDown(event) {\n gesture.pointers.set(event.pointerId, {\n x: event.clientX,\n y: event.clientY,\n });\n if (gesture.pointers.size === 2) {\n gesture.lastCenter = (0,_gesture__WEBPACK_IMPORTED_MODULE_22__.getCenter)(gesture.pointers);\n gesture.initialScale = this.state.zoom.value;\n gesture.initialDistance = (0,_gesture__WEBPACK_IMPORTED_MODULE_22__.getDistance)(Array.from(gesture.pointers.values()));\n }\n }\n initialPointerDownState(event) {\n const origin = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.viewportCoordsToSceneCoords)(event, this.state);\n const selectedElements = (0,_scene__WEBPACK_IMPORTED_MODULE_30__.getSelectedElements)(this.scene.getNonDeletedElements(), this.state);\n const [minX, minY, maxX, maxY] = (0,_element__WEBPACK_IMPORTED_MODULE_16__.getCommonBounds)(selectedElements);\n return {\n origin,\n withCmdOrCtrl: event[_keys__WEBPACK_IMPORTED_MODULE_26__.KEYS.CTRL_OR_CMD],\n originInGrid: (0,_utils__WEBPACK_IMPORTED_MODULE_34__.tupleToCoors)((0,_math__WEBPACK_IMPORTED_MODULE_27__.getGridPoint)(origin.x, origin.y, this.state.gridSize)),\n scrollbars: (0,_scene__WEBPACK_IMPORTED_MODULE_30__.isOverScrollBars)(currentScrollBars, event.clientX - this.state.offsetLeft, event.clientY - this.state.offsetTop),\n // we need to duplicate because we'll be updating this state\n lastCoords: Object.assign({}, origin),\n originalElements: this.scene\n .getNonDeletedElements()\n .reduce((acc, element) => {\n acc.set(element.id, (0,_element_newElement__WEBPACK_IMPORTED_MODULE_20__.deepCopyElement)(element));\n return acc;\n }, new Map()),\n resize: {\n handleType: false,\n isResizing: false,\n offset: { x: 0, y: 0 },\n arrowDirection: \"origin\",\n center: { x: (maxX + minX) / 2, y: (maxY + minY) / 2 },\n },\n hit: {\n element: null,\n allHitElements: [],\n wasAddedToSelection: false,\n hasBeenDuplicated: false,\n hasHitCommonBoundingBoxOfSelectedElements: this.isHittingCommonBoundingBoxOfSelectedElements(origin, selectedElements),\n hasHitElementInside: false,\n },\n drag: {\n hasOccurred: false,\n offset: null,\n },\n eventListeners: {\n onMove: null,\n onUp: null,\n onKeyUp: null,\n onKeyDown: null,\n },\n boxSelection: {\n hasOccurred: false,\n },\n elementIdsToErase: {},\n };\n }\n // Returns whether the event is a dragging a scrollbar\n handleDraggingScrollBar(event, pointerDownState) {\n if (!(pointerDownState.scrollbars.isOverEither && !this.state.multiElement)) {\n return false;\n }\n isDraggingScrollBar = true;\n pointerDownState.lastCoords.x = event.clientX;\n pointerDownState.lastCoords.y = event.clientY;\n const onPointerMove = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.withBatchedUpdatesThrottled)((event) => {\n const target = event.target;\n if (!(target instanceof HTMLElement)) {\n return;\n }\n this.handlePointerMoveOverScrollbars(event, pointerDownState);\n });\n const onPointerUp = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.withBatchedUpdates)(() => {\n isDraggingScrollBar = false;\n (0,_utils__WEBPACK_IMPORTED_MODULE_34__.setCursorForShape)(this.canvas, this.state);\n lastPointerUp = null;\n this.setState({\n cursorButton: \"up\",\n });\n this.savePointer(event.clientX, event.clientY, \"up\");\n window.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.POINTER_MOVE, onPointerMove);\n window.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.POINTER_UP, onPointerUp);\n onPointerMove.flush();\n });\n lastPointerUp = onPointerUp;\n window.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.POINTER_MOVE, onPointerMove);\n window.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.POINTER_UP, onPointerUp);\n return true;\n }\n isASelectedElement(hitElement) {\n return hitElement != null && this.state.selectedElementIds[hitElement.id];\n }\n isHittingCommonBoundingBoxOfSelectedElements(point, selectedElements) {\n if (selectedElements.length < 2) {\n return false;\n }\n // How many pixels off the shape boundary we still consider a hit\n const threshold = 10 / this.state.zoom.value;\n const [x1, y1, x2, y2] = (0,_element__WEBPACK_IMPORTED_MODULE_16__.getCommonBounds)(selectedElements);\n return (point.x > x1 - threshold &&\n point.x < x2 + threshold &&\n point.y > y1 - threshold &&\n point.y < y2 + threshold);\n }\n onKeyDownFromPointerDownHandler(pointerDownState) {\n return (0,_utils__WEBPACK_IMPORTED_MODULE_34__.withBatchedUpdates)((event) => {\n if (this.maybeHandleResize(pointerDownState, event)) {\n return;\n }\n this.maybeDragNewGenericElement(pointerDownState, event);\n });\n }\n onKeyUpFromPointerDownHandler(pointerDownState) {\n return (0,_utils__WEBPACK_IMPORTED_MODULE_34__.withBatchedUpdates)((event) => {\n // Prevents focus from escaping excalidraw tab\n event.key === _keys__WEBPACK_IMPORTED_MODULE_26__.KEYS.ALT && event.preventDefault();\n if (this.maybeHandleResize(pointerDownState, event)) {\n return;\n }\n this.maybeDragNewGenericElement(pointerDownState, event);\n });\n }\n onPointerMoveFromPointerDownHandler(pointerDownState) {\n return (0,_utils__WEBPACK_IMPORTED_MODULE_34__.withBatchedUpdatesThrottled)((event) => {\n var _a, _b;\n // We need to initialize dragOffsetXY only after we've updated\n // `state.selectedElementIds` on pointerDown. Doing it here in pointerMove\n // event handler should hopefully ensure we're already working with\n // the updated state.\n if (pointerDownState.drag.offset === null) {\n pointerDownState.drag.offset = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.tupleToCoors)((0,_element__WEBPACK_IMPORTED_MODULE_16__.getDragOffsetXY)((0,_scene__WEBPACK_IMPORTED_MODULE_30__.getSelectedElements)(this.scene.getNonDeletedElements(), this.state), pointerDownState.origin.x, pointerDownState.origin.y));\n }\n const target = event.target;\n if (!(target instanceof HTMLElement)) {\n return;\n }\n if (this.handlePointerMoveOverScrollbars(event, pointerDownState)) {\n return;\n }\n const pointerCoords = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.viewportCoordsToSceneCoords)(event, this.state);\n if ((0,_appState__WEBPACK_IMPORTED_MODULE_10__.isEraserActive)(this.state)) {\n this.handleEraser(event, pointerDownState, pointerCoords);\n return;\n }\n const [gridX, gridY] = (0,_math__WEBPACK_IMPORTED_MODULE_27__.getGridPoint)(pointerCoords.x, pointerCoords.y, this.state.gridSize);\n // for arrows/lines, don't start dragging until a given threshold\n // to ensure we don't create a 2-point arrow by mistake when\n // user clicks mouse in a way that it moves a tiny bit (thus\n // triggering pointermove)\n if (!pointerDownState.drag.hasOccurred &&\n (this.state.activeTool.type === \"arrow\" ||\n this.state.activeTool.type === \"line\")) {\n if ((0,_math__WEBPACK_IMPORTED_MODULE_27__.distance2d)(pointerCoords.x, pointerCoords.y, pointerDownState.origin.x, pointerDownState.origin.y) < _constants__WEBPACK_IMPORTED_MODULE_12__.DRAGGING_THRESHOLD) {\n return;\n }\n }\n if (pointerDownState.resize.isResizing) {\n pointerDownState.lastCoords.x = pointerCoords.x;\n pointerDownState.lastCoords.y = pointerCoords.y;\n if (this.maybeHandleResize(pointerDownState, event)) {\n return true;\n }\n }\n if (this.state.editingLinearElement) {\n const didDrag = _element_linearElementEditor__WEBPACK_IMPORTED_MODULE_18__.LinearElementEditor.handlePointDragging(this.state, (appState) => this.setState(appState), pointerCoords.x, pointerCoords.y, (element, pointsSceneCoords) => {\n this.maybeSuggestBindingsForLinearElementAtCoords(element, pointsSceneCoords);\n });\n if (didDrag) {\n pointerDownState.lastCoords.x = pointerCoords.x;\n pointerDownState.lastCoords.y = pointerCoords.y;\n return;\n }\n }\n const hasHitASelectedElement = pointerDownState.hit.allHitElements.some((element) => this.isASelectedElement(element));\n if ((hasHitASelectedElement ||\n pointerDownState.hit.hasHitCommonBoundingBoxOfSelectedElements) &&\n // this allows for box-selecting points when clicking inside the\n // line's bounding box\n (!this.state.editingLinearElement || !event.shiftKey) &&\n // box-selecting without shift when editing line, not clicking on a line\n (!this.state.editingLinearElement ||\n ((_a = this.state.editingLinearElement) === null || _a === void 0 ? void 0 : _a.elementId) !==\n ((_b = pointerDownState.hit.element) === null || _b === void 0 ? void 0 : _b.id) ||\n pointerDownState.hit.hasHitElementInside)) {\n const selectedElements = (0,_scene__WEBPACK_IMPORTED_MODULE_30__.getSelectedElements)(this.scene.getNonDeletedElements(), this.state);\n if (selectedElements.every((element) => element.locked)) {\n return;\n }\n // Marking that click was used for dragging to check\n // if elements should be deselected on pointerup\n pointerDownState.drag.hasOccurred = true;\n // prevent dragging even if we're no longer holding cmd/ctrl otherwise\n // it would have weird results (stuff jumping all over the screen)\n if (selectedElements.length > 0 && !pointerDownState.withCmdOrCtrl) {\n const [dragX, dragY] = (0,_math__WEBPACK_IMPORTED_MODULE_27__.getGridPoint)(pointerCoords.x - pointerDownState.drag.offset.x, pointerCoords.y - pointerDownState.drag.offset.y, this.state.gridSize);\n const [dragDistanceX, dragDistanceY] = [\n Math.abs(pointerCoords.x - pointerDownState.origin.x),\n Math.abs(pointerCoords.y - pointerDownState.origin.y),\n ];\n // We only drag in one direction if shift is pressed\n const lockDirection = event.shiftKey;\n (0,_element__WEBPACK_IMPORTED_MODULE_16__.dragSelectedElements)(pointerDownState, selectedElements, dragX, dragY, lockDirection, dragDistanceX, dragDistanceY, this.state);\n this.maybeSuggestBindingForAll(selectedElements);\n // We duplicate the selected element if alt is pressed on pointer move\n if (event.altKey && !pointerDownState.hit.hasBeenDuplicated) {\n // Move the currently selected elements to the top of the z index stack, and\n // put the duplicates where the selected elements used to be.\n // (the origin point where the dragging started)\n pointerDownState.hit.hasBeenDuplicated = true;\n const nextElements = [];\n const elementsToAppend = [];\n const groupIdMap = new Map();\n const oldIdToDuplicatedId = new Map();\n const hitElement = pointerDownState.hit.element;\n const elements = this.scene.getElementsIncludingDeleted();\n const selectedElementIds = (0,_scene__WEBPACK_IMPORTED_MODULE_30__.getSelectedElements)(elements, this.state, true).map((element) => element.id);\n for (const element of elements) {\n if (selectedElementIds.includes(element.id) ||\n // case: the state.selectedElementIds might not have been\n // updated yet by the time this mousemove event is fired\n (element.id === (hitElement === null || hitElement === void 0 ? void 0 : hitElement.id) &&\n pointerDownState.hit.wasAddedToSelection)) {\n const duplicatedElement = (0,_element__WEBPACK_IMPORTED_MODULE_16__.duplicateElement)(this.state.editingGroupId, groupIdMap, element);\n const [originDragX, originDragY] = (0,_math__WEBPACK_IMPORTED_MODULE_27__.getGridPoint)(pointerDownState.origin.x - pointerDownState.drag.offset.x, pointerDownState.origin.y - pointerDownState.drag.offset.y, this.state.gridSize);\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_19__.mutateElement)(duplicatedElement, {\n x: duplicatedElement.x + (originDragX - dragX),\n y: duplicatedElement.y + (originDragY - dragY),\n });\n nextElements.push(duplicatedElement);\n elementsToAppend.push(element);\n oldIdToDuplicatedId.set(element.id, duplicatedElement.id);\n }\n else {\n nextElements.push(element);\n }\n }\n const nextSceneElements = [...nextElements, ...elementsToAppend];\n (0,_element_textElement__WEBPACK_IMPORTED_MODULE_43__.bindTextToShapeAfterDuplication)(nextElements, elementsToAppend, oldIdToDuplicatedId);\n (0,_element_binding__WEBPACK_IMPORTED_MODULE_17__.fixBindingsAfterDuplication)(nextSceneElements, elementsToAppend, oldIdToDuplicatedId, \"duplicatesServeAsOld\");\n this.scene.replaceAllElements(nextSceneElements);\n }\n return;\n }\n }\n // It is very important to read this.state within each move event,\n // otherwise we would read a stale one!\n const draggingElement = this.state.draggingElement;\n if (!draggingElement) {\n return;\n }\n if (draggingElement.type === \"freedraw\") {\n const points = draggingElement.points;\n const dx = pointerCoords.x - draggingElement.x;\n const dy = pointerCoords.y - draggingElement.y;\n const lastPoint = points.length > 0 && points[points.length - 1];\n const discardPoint = lastPoint && lastPoint[0] === dx && lastPoint[1] === dy;\n if (!discardPoint) {\n const pressures = draggingElement.simulatePressure\n ? draggingElement.pressures\n : [...draggingElement.pressures, event.pressure];\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_19__.mutateElement)(draggingElement, {\n points: [...points, [dx, dy]],\n pressures,\n });\n }\n }\n else if ((0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_21__.isLinearElement)(draggingElement)) {\n pointerDownState.drag.hasOccurred = true;\n const points = draggingElement.points;\n let dx = gridX - draggingElement.x;\n let dy = gridY - draggingElement.y;\n if ((0,_keys__WEBPACK_IMPORTED_MODULE_26__.shouldRotateWithDiscreteAngle)(event) && points.length === 2) {\n ({ width: dx, height: dy } = (0,_element__WEBPACK_IMPORTED_MODULE_16__.getPerfectElementSize)(this.state.activeTool.type, dx, dy));\n }\n if (points.length === 1) {\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_19__.mutateElement)(draggingElement, { points: [...points, [dx, dy]] });\n }\n else if (points.length > 1) {\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_19__.mutateElement)(draggingElement, {\n points: [...points.slice(0, -1), [dx, dy]],\n });\n }\n if ((0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_21__.isBindingElement)(draggingElement, false)) {\n // When creating a linear element by dragging\n this.maybeSuggestBindingsForLinearElementAtCoords(draggingElement, [pointerCoords], this.state.startBoundElement);\n }\n }\n else {\n pointerDownState.lastCoords.x = pointerCoords.x;\n pointerDownState.lastCoords.y = pointerCoords.y;\n this.maybeDragNewGenericElement(pointerDownState, event);\n }\n if (this.state.activeTool.type === \"selection\") {\n pointerDownState.boxSelection.hasOccurred = true;\n const elements = this.scene.getNonDeletedElements();\n if (!event.shiftKey &&\n // allows for box-selecting points (without shift)\n !this.state.editingLinearElement &&\n (0,_scene__WEBPACK_IMPORTED_MODULE_30__.isSomeElementSelected)(elements, this.state)) {\n if (pointerDownState.withCmdOrCtrl && pointerDownState.hit.element) {\n this.setState((prevState) => (0,_groups__WEBPACK_IMPORTED_MODULE_23__.selectGroupsForSelectedElements)(Object.assign(Object.assign({}, prevState), { selectedElementIds: {\n [pointerDownState.hit.element.id]: true,\n } }), this.scene.getNonDeletedElements()));\n }\n else {\n this.setState({\n selectedElementIds: {},\n selectedGroupIds: {},\n editingGroupId: null,\n });\n }\n }\n // box-select line editor points\n if (this.state.editingLinearElement) {\n _element_linearElementEditor__WEBPACK_IMPORTED_MODULE_18__.LinearElementEditor.handleBoxSelection(event, this.state, this.setState.bind(this));\n // regular box-select\n }\n else {\n const elementsWithinSelection = (0,_scene__WEBPACK_IMPORTED_MODULE_30__.getElementsWithinSelection)(elements, draggingElement);\n this.setState((prevState) => (0,_groups__WEBPACK_IMPORTED_MODULE_23__.selectGroupsForSelectedElements)(Object.assign(Object.assign({}, prevState), { selectedElementIds: Object.assign(Object.assign(Object.assign({}, prevState.selectedElementIds), elementsWithinSelection.reduce((acc, element) => {\n acc[element.id] = true;\n return acc;\n }, {})), (pointerDownState.hit.element\n ? {\n // if using ctrl/cmd, select the hitElement only if we\n // haven't box-selected anything else\n [pointerDownState.hit.element.id]: !elementsWithinSelection.length,\n }\n : null)), showHyperlinkPopup: elementsWithinSelection.length === 1 &&\n elementsWithinSelection[0].link\n ? \"info\"\n : false }), this.scene.getNonDeletedElements()));\n }\n }\n });\n }\n // Returns whether the pointer move happened over either scrollbar\n handlePointerMoveOverScrollbars(event, pointerDownState) {\n if (pointerDownState.scrollbars.isOverHorizontal) {\n const x = event.clientX;\n const dx = x - pointerDownState.lastCoords.x;\n this.setState({\n scrollX: this.state.scrollX - dx / this.state.zoom.value,\n });\n pointerDownState.lastCoords.x = x;\n return true;\n }\n if (pointerDownState.scrollbars.isOverVertical) {\n const y = event.clientY;\n const dy = y - pointerDownState.lastCoords.y;\n this.setState({\n scrollY: this.state.scrollY - dy / this.state.zoom.value,\n });\n pointerDownState.lastCoords.y = y;\n return true;\n }\n return false;\n }\n onPointerUpFromPointerDownHandler(pointerDownState) {\n return (0,_utils__WEBPACK_IMPORTED_MODULE_34__.withBatchedUpdates)((childEvent) => {\n var _a, _b;\n const { draggingElement, resizingElement, multiElement, activeTool, isResizing, isRotating, } = this.state;\n this.setState({\n isResizing: false,\n isRotating: false,\n resizingElement: null,\n selectionElement: null,\n cursorButton: \"up\",\n // text elements are reset on finalize, and resetting on pointerup\n // may cause issues with double taps\n editingElement: multiElement || (0,_element__WEBPACK_IMPORTED_MODULE_16__.isTextElement)(this.state.editingElement)\n ? this.state.editingElement\n : null,\n });\n this.savePointer(childEvent.clientX, childEvent.clientY, \"up\");\n // Handle end of dragging a point of a linear element, might close a loop\n // and sets binding element\n if (this.state.editingLinearElement) {\n if (!pointerDownState.boxSelection.hasOccurred &&\n (((_b = (_a = pointerDownState.hit) === null || _a === void 0 ? void 0 : _a.element) === null || _b === void 0 ? void 0 : _b.id) !==\n this.state.editingLinearElement.elementId ||\n !pointerDownState.hit.hasHitElementInside)) {\n this.actionManager.executeAction(_actions__WEBPACK_IMPORTED_MODULE_5__.actionFinalize);\n }\n else {\n const editingLinearElement = _element_linearElementEditor__WEBPACK_IMPORTED_MODULE_18__.LinearElementEditor.handlePointerUp(childEvent, this.state.editingLinearElement, this.state);\n if (editingLinearElement !== this.state.editingLinearElement) {\n this.setState({\n editingLinearElement,\n suggestedBindings: [],\n });\n }\n }\n }\n lastPointerUp = null;\n if (pointerDownState.eventListeners.onMove) {\n pointerDownState.eventListeners.onMove.flush();\n }\n window.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.POINTER_MOVE, pointerDownState.eventListeners.onMove);\n window.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.POINTER_UP, pointerDownState.eventListeners.onUp);\n window.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.KEYDOWN, pointerDownState.eventListeners.onKeyDown);\n window.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.KEYUP, pointerDownState.eventListeners.onKeyUp);\n if (this.state.pendingImageElementId) {\n this.setState({ pendingImageElementId: null });\n }\n if ((draggingElement === null || draggingElement === void 0 ? void 0 : draggingElement.type) === \"freedraw\") {\n const pointerCoords = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.viewportCoordsToSceneCoords)(childEvent, this.state);\n const points = draggingElement.points;\n let dx = pointerCoords.x - draggingElement.x;\n let dy = pointerCoords.y - draggingElement.y;\n // Allows dots to avoid being flagged as infinitely small\n if (dx === points[0][0] && dy === points[0][1]) {\n dy += 0.0001;\n dx += 0.0001;\n }\n const pressures = draggingElement.simulatePressure\n ? []\n : [...draggingElement.pressures, childEvent.pressure];\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_19__.mutateElement)(draggingElement, {\n points: [...points, [dx, dy]],\n pressures,\n lastCommittedPoint: [dx, dy],\n });\n this.actionManager.executeAction(_actions__WEBPACK_IMPORTED_MODULE_5__.actionFinalize);\n return;\n }\n if ((0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_21__.isImageElement)(draggingElement)) {\n const imageElement = draggingElement;\n try {\n this.initializeImageDimensions(imageElement);\n this.setState({ selectedElementIds: { [imageElement.id]: true } }, () => {\n this.actionManager.executeAction(_actions__WEBPACK_IMPORTED_MODULE_5__.actionFinalize);\n });\n }\n catch (error) {\n console.error(error);\n this.scene.replaceAllElements(this.scene\n .getElementsIncludingDeleted()\n .filter((el) => el.id !== imageElement.id));\n this.actionManager.executeAction(_actions__WEBPACK_IMPORTED_MODULE_5__.actionFinalize);\n }\n return;\n }\n if ((0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_21__.isLinearElement)(draggingElement)) {\n if (draggingElement.points.length > 1) {\n this.history.resumeRecording();\n }\n const pointerCoords = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.viewportCoordsToSceneCoords)(childEvent, this.state);\n if (!pointerDownState.drag.hasOccurred &&\n draggingElement &&\n !multiElement) {\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_19__.mutateElement)(draggingElement, {\n points: [\n ...draggingElement.points,\n [\n pointerCoords.x - draggingElement.x,\n pointerCoords.y - draggingElement.y,\n ],\n ],\n });\n this.setState({\n multiElement: draggingElement,\n editingElement: this.state.draggingElement,\n });\n }\n else if (pointerDownState.drag.hasOccurred && !multiElement) {\n if ((0,_element_binding__WEBPACK_IMPORTED_MODULE_17__.isBindingEnabled)(this.state) &&\n (0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_21__.isBindingElement)(draggingElement, false)) {\n (0,_element_binding__WEBPACK_IMPORTED_MODULE_17__.maybeBindLinearElement)(draggingElement, this.state, this.scene, pointerCoords);\n }\n this.setState({ suggestedBindings: [], startBoundElement: null });\n if (!activeTool.locked) {\n (0,_utils__WEBPACK_IMPORTED_MODULE_34__.resetCursor)(this.canvas);\n this.setState((prevState) => ({\n draggingElement: null,\n activeTool: (0,_utils__WEBPACK_IMPORTED_MODULE_34__.updateActiveTool)(this.state, {\n type: \"selection\",\n }),\n selectedElementIds: Object.assign(Object.assign({}, prevState.selectedElementIds), { [draggingElement.id]: true }),\n }));\n }\n else {\n this.setState((prevState) => ({\n draggingElement: null,\n selectedElementIds: Object.assign(Object.assign({}, prevState.selectedElementIds), { [draggingElement.id]: true }),\n }));\n }\n }\n return;\n }\n if (activeTool.type !== \"selection\" &&\n draggingElement &&\n (0,_element__WEBPACK_IMPORTED_MODULE_16__.isInvisiblySmallElement)(draggingElement)) {\n // remove invisible element which was added in onPointerDown\n this.scene.replaceAllElements(this.scene.getElementsIncludingDeleted().slice(0, -1));\n this.setState({\n draggingElement: null,\n });\n return;\n }\n if (draggingElement) {\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_19__.mutateElement)(draggingElement, (0,_element__WEBPACK_IMPORTED_MODULE_16__.getNormalizedDimensions)(draggingElement));\n }\n if (resizingElement) {\n this.history.resumeRecording();\n }\n if (resizingElement && (0,_element__WEBPACK_IMPORTED_MODULE_16__.isInvisiblySmallElement)(resizingElement)) {\n this.scene.replaceAllElements(this.scene\n .getElementsIncludingDeleted()\n .filter((el) => el.id !== resizingElement.id));\n }\n // Code below handles selection when element(s) weren't\n // drag or added to selection on pointer down phase.\n const hitElement = pointerDownState.hit.element;\n if ((0,_appState__WEBPACK_IMPORTED_MODULE_10__.isEraserActive)(this.state)) {\n const draggedDistance = (0,_math__WEBPACK_IMPORTED_MODULE_27__.distance2d)(this.lastPointerDown.clientX, this.lastPointerDown.clientY, this.lastPointerUp.clientX, this.lastPointerUp.clientY);\n if (draggedDistance === 0) {\n const scenePointer = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.viewportCoordsToSceneCoords)({\n clientX: this.lastPointerUp.clientX,\n clientY: this.lastPointerUp.clientY,\n }, this.state);\n const hitElements = this.getElementsAtPosition(scenePointer.x, scenePointer.y);\n hitElements.forEach((hitElement) => (pointerDownState.elementIdsToErase[hitElement.id] = {\n erase: true,\n opacity: hitElement.opacity,\n }));\n }\n this.eraseElements(pointerDownState);\n return;\n }\n else if (Object.keys(pointerDownState.elementIdsToErase).length) {\n this.restoreReadyToEraseElements(pointerDownState);\n }\n if (hitElement &&\n !pointerDownState.drag.hasOccurred &&\n !pointerDownState.hit.wasAddedToSelection &&\n // if we're editing a line, pointerup shouldn't switch selection if\n // box selected\n (!this.state.editingLinearElement ||\n !pointerDownState.boxSelection.hasOccurred)) {\n // when inside line editor, shift selects points instead\n if (childEvent.shiftKey && !this.state.editingLinearElement) {\n if (this.state.selectedElementIds[hitElement.id]) {\n if ((0,_groups__WEBPACK_IMPORTED_MODULE_23__.isSelectedViaGroup)(this.state, hitElement)) {\n // We want to unselect all groups hitElement is part of\n // as well as all elements that are part of the groups\n // hitElement is part of\n const idsOfSelectedElementsThatAreInGroups = hitElement.groupIds\n .flatMap((groupId) => (0,_groups__WEBPACK_IMPORTED_MODULE_23__.getElementsInGroup)(this.scene.getNonDeletedElements(), groupId))\n .map((element) => ({ [element.id]: false }))\n .reduce((prevId, acc) => (Object.assign(Object.assign({}, prevId), acc)), {});\n this.setState((_prevState) => ({\n selectedGroupIds: Object.assign(Object.assign({}, _prevState.selectedElementIds), hitElement.groupIds\n .map((gId) => ({ [gId]: false }))\n .reduce((prev, acc) => (Object.assign(Object.assign({}, prev), acc)), {})),\n selectedElementIds: Object.assign(Object.assign({}, _prevState.selectedElementIds), idsOfSelectedElementsThatAreInGroups),\n }));\n }\n else {\n // remove element from selection while\n // keeping prev elements selected\n this.setState((prevState) => (0,_groups__WEBPACK_IMPORTED_MODULE_23__.selectGroupsForSelectedElements)(Object.assign(Object.assign({}, prevState), { selectedElementIds: Object.assign(Object.assign({}, prevState.selectedElementIds), { [hitElement.id]: false }) }), this.scene.getNonDeletedElements()));\n }\n }\n else {\n // add element to selection while\n // keeping prev elements selected\n this.setState((_prevState) => ({\n selectedElementIds: Object.assign(Object.assign({}, _prevState.selectedElementIds), { [hitElement.id]: true }),\n }));\n }\n }\n else {\n this.setState((prevState) => (Object.assign({}, (0,_groups__WEBPACK_IMPORTED_MODULE_23__.selectGroupsForSelectedElements)(Object.assign(Object.assign({}, prevState), { selectedElementIds: { [hitElement.id]: true } }), this.scene.getNonDeletedElements()))));\n }\n }\n if (!this.state.editingLinearElement &&\n !pointerDownState.drag.hasOccurred &&\n !this.state.isResizing &&\n ((hitElement &&\n (0,_element__WEBPACK_IMPORTED_MODULE_16__.isHittingElementBoundingBoxWithoutHittingElement)(hitElement, this.state, pointerDownState.origin.x, pointerDownState.origin.y)) ||\n (!hitElement &&\n pointerDownState.hit.hasHitCommonBoundingBoxOfSelectedElements))) {\n // Deselect selected elements\n this.setState({\n selectedElementIds: {},\n selectedGroupIds: {},\n editingGroupId: null,\n });\n return;\n }\n if (!activeTool.locked &&\n activeTool.type !== \"freedraw\" &&\n draggingElement) {\n this.setState((prevState) => ({\n selectedElementIds: Object.assign(Object.assign({}, prevState.selectedElementIds), { [draggingElement.id]: true }),\n }));\n }\n if (activeTool.type !== \"selection\" ||\n (0,_scene__WEBPACK_IMPORTED_MODULE_30__.isSomeElementSelected)(this.scene.getNonDeletedElements(), this.state)) {\n this.history.resumeRecording();\n }\n if (pointerDownState.drag.hasOccurred || isResizing || isRotating) {\n ((0,_element_binding__WEBPACK_IMPORTED_MODULE_17__.isBindingEnabled)(this.state)\n ? _element_binding__WEBPACK_IMPORTED_MODULE_17__.bindOrUnbindSelectedElements\n : _element_binding__WEBPACK_IMPORTED_MODULE_17__.unbindLinearElements)((0,_scene__WEBPACK_IMPORTED_MODULE_30__.getSelectedElements)(this.scene.getNonDeletedElements(), this.state));\n }\n if (!activeTool.locked && activeTool.type !== \"freedraw\") {\n (0,_utils__WEBPACK_IMPORTED_MODULE_34__.resetCursor)(this.canvas);\n this.setState({\n draggingElement: null,\n suggestedBindings: [],\n activeTool: (0,_utils__WEBPACK_IMPORTED_MODULE_34__.updateActiveTool)(this.state, { type: \"selection\" }),\n });\n }\n else {\n this.setState({\n draggingElement: null,\n suggestedBindings: [],\n });\n }\n });\n }\n maybeSuggestBindingForAll(selectedElements) {\n const suggestedBindings = (0,_element_binding__WEBPACK_IMPORTED_MODULE_17__.getEligibleElementsForBinding)(selectedElements);\n this.setState({ suggestedBindings });\n }\n clearSelection(hitElement) {\n this.setState((prevState) => ({\n selectedElementIds: {},\n selectedGroupIds: {},\n // Continue editing the same group if the user selected a different\n // element from it\n editingGroupId: prevState.editingGroupId &&\n hitElement != null &&\n (0,_groups__WEBPACK_IMPORTED_MODULE_23__.isElementInGroup)(hitElement, prevState.editingGroupId)\n ? prevState.editingGroupId\n : null,\n }));\n this.setState({\n selectedElementIds: {},\n previousSelectedElementIds: this.state.selectedElementIds,\n });\n }\n getTextWysiwygSnappedToCenterPosition(x, y, appState, canvas, scale) {\n const elementClickedInside = (0,_scene__WEBPACK_IMPORTED_MODULE_30__.getTextBindableContainerAtPosition)(this.scene\n .getElementsIncludingDeleted()\n .filter((element) => !(0,_element__WEBPACK_IMPORTED_MODULE_16__.isTextElement)(element)), x, y);\n if (elementClickedInside) {\n const elementCenterX = elementClickedInside.x + elementClickedInside.width / 2;\n const elementCenterY = elementClickedInside.y + elementClickedInside.height / 2;\n const distanceToCenter = Math.hypot(x - elementCenterX, y - elementCenterY);\n const isSnappedToCenter = distanceToCenter < _constants__WEBPACK_IMPORTED_MODULE_12__.TEXT_TO_CENTER_SNAP_THRESHOLD;\n if (isSnappedToCenter) {\n const { x: viewportX, y: viewportY } = (0,_utils__WEBPACK_IMPORTED_MODULE_34__.sceneCoordsToViewportCoords)({ sceneX: elementCenterX, sceneY: elementCenterY }, appState);\n return { viewportX, viewportY, elementCenterX, elementCenterY };\n }\n }\n }\n getCanvasOffsets() {\n var _a;\n if ((_a = this.excalidrawContainerRef) === null || _a === void 0 ? void 0 : _a.current) {\n const excalidrawContainer = this.excalidrawContainerRef.current;\n const { left, top } = excalidrawContainer.getBoundingClientRect();\n return {\n offsetLeft: left,\n offsetTop: top,\n };\n }\n return {\n offsetLeft: 0,\n offsetTop: 0,\n };\n }\n updateLanguage() {\n return __awaiter(this, void 0, void 0, function* () {\n const currentLang = _i18n__WEBPACK_IMPORTED_MODULE_25__.languages.find((lang) => lang.code === this.props.langCode) ||\n _i18n__WEBPACK_IMPORTED_MODULE_25__.defaultLang;\n yield (0,_i18n__WEBPACK_IMPORTED_MODULE_25__.setLanguage)(currentLang);\n this.setAppState({});\n });\n }\n}\nApp.defaultProps = {\n // needed for tests to pass since we directly render App in many tests\n UIOptions: _constants__WEBPACK_IMPORTED_MODULE_12__.DEFAULT_UI_OPTIONS,\n};\nif (\"development\" === _constants__WEBPACK_IMPORTED_MODULE_12__.ENV.TEST ||\n \"development\" === _constants__WEBPACK_IMPORTED_MODULE_12__.ENV.DEVELOPMENT) {\n window.h = window.h || {};\n Object.defineProperties(window.h, {\n elements: {\n configurable: true,\n get() {\n var _a;\n return (_a = this.app) === null || _a === void 0 ? void 0 : _a.scene.getElementsIncludingDeleted();\n },\n set(elements) {\n var _a;\n return (_a = this.app) === null || _a === void 0 ? void 0 : _a.scene.replaceAllElements(elements);\n },\n },\n });\n}\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (App);\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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Q0FBVyxDQUFDO1lBQ2QsTUFBTSxtREFBVyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBQy9CLElBQUksQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDdkIsQ0FBQztLQUFBOztBQWhpTGEsZ0JBQVksR0FBc0I7SUFDOUMsc0VBQXNFO0lBQ3RFLFNBQVMsRUFBRSwyREFBa0I7Q0FDOUIsQ0FBQztBQWdqTEosSUFDRSxhQUFvQixLQUFLLGlEQUFRO0lBQ2pDLGFBQW9CLEtBQUssd0RBQWUsRUFDeEM7SUFDQSxNQUFNLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLElBQUssRUFBa0IsQ0FBQztJQUUzQyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRTtRQUNoQyxRQUFRLEVBQUU7WUFDUixZQUFZLEVBQUUsSUFBSTtZQUNsQixHQUFHOztnQkFDRCxPQUFPLFVBQUksQ0FBQyxHQUFHLDBDQUFFLEtBQUssQ0FBQywyQkFBMkIsRUFBRSxDQUFDO1lBQ3ZELENBQUM7WUFDRCxHQUFHLENBQUMsUUFBNkI7O2dCQUMvQixPQUFPLFVBQUksQ0FBQyxHQUFHLDBDQUFFLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUN0RCxDQUFDO1NBQ0Y7S0FDRixDQUFDLENBQUM7Q0FDSjtBQUNELGlFQUFlLEdBQUcsRUFBQyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uLi8uLi9jb21wb25lbnRzL0FwcC50c3g/MDA3MCJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgUmVhY3QsIHsgdXNlQ29udGV4dCB9IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IHsgZmx1c2hTeW5jIH0gZnJvbSBcInJlYWN0LWRvbVwiO1xuaW1wb3J0IHsgUm91Z2hDYW52YXMgfSBmcm9tIFwicm91Z2hqcy9iaW4vY2FudmFzXCI7XG5pbXBvcnQgcm91Z2ggZnJvbSBcInJvdWdoanMvYmluL3JvdWdoXCI7XG5pbXBvcnQgY2xzeCBmcm9tIFwiY2xzeFwiO1xuaW1wb3J0IHsgbmFub2lkIH0gZnJvbSBcIm5hbm9pZFwiO1xuXG5pbXBvcnQge1xuICBhY3Rpb25BZGRUb0xpYnJhcnksXG4gIGFjdGlvbkJyaW5nRm9yd2FyZCxcbiAgYWN0aW9uQnJpbmdUb0Zyb250LFxuICBhY3Rpb25Db3B5LFxuICBhY3Rpb25Db3B5QXNQbmcsXG4gIGFjdGlvbkNvcHlBc1N2ZyxcbiAgY29weVRleHQsXG4gIGFjdGlvbkNvcHlTdHlsZXMsXG4gIGFjdGlvbkN1dCxcbiAgYWN0aW9uRGVsZXRlU2VsZWN0ZWQsXG4gIGFjdGlvbkR1cGxpY2F0ZVNlbGVjdGlvbixcbiAgYWN0aW9uRmluYWxpemUsXG4gIGFjdGlvbkZsaXBIb3Jpem9udGFsLFxuICBhY3Rpb25GbGlwVmVydGljYWwsXG4gIGFjdGlvbkdyb3VwLFxuICBhY3Rpb25QYXN0ZVN0eWxlcyxcbiAgYWN0aW9uU2VsZWN0QWxsLFxuICBhY3Rpb25TZW5kQmFja3dhcmQsXG4gIGFjdGlvblNlbmRUb0JhY2ssXG4gIGFjdGlvblRvZ2dsZUdyaWRNb2RlLFxuICBhY3Rpb25Ub2dnbGVTdGF0cyxcbiAgYWN0aW9uVG9nZ2xlWmVuTW9kZSxcbiAgYWN0aW9uVW5iaW5kVGV4dCxcbiAgYWN0aW9uQmluZFRleHQsXG4gIGFjdGlvblVuZ3JvdXAsXG4gIGFjdGlvbkxpbmssXG4gIGFjdGlvblRvZ2dsZUxvY2ssXG59IGZyb20gXCIuLi9hY3Rpb25zXCI7XG5pbXBvcnQgeyBjcmVhdGVSZWRvQWN0aW9uLCBjcmVhdGVVbmRvQWN0aW9uIH0gZnJvbSBcIi4uL2FjdGlvbnMvYWN0aW9uSGlzdG9yeVwiO1xuaW1wb3J0IHsgQWN0aW9uTWFuYWdlciB9IGZyb20gXCIuLi9hY3Rpb25zL21hbmFnZXJcIjtcbmltcG9ydCB7IGFjdGlvbnMgfSBmcm9tIFwiLi4vYWN0aW9ucy9yZWdpc3RlclwiO1xuaW1wb3J0IHsgQWN0aW9uUmVzdWx0IH0gZnJvbSBcIi4uL2FjdGlvbnMvdHlwZXNcIjtcbmltcG9ydCB7IHRyYWNrRXZlbnQgfSBmcm9tIFwiLi4vYW5hbHl0aWNzXCI7XG5pbXBvcnQgeyBnZXREZWZhdWx0QXBwU3RhdGUsIGlzRXJhc2VyQWN0aXZlIH0gZnJvbSBcIi4uL2FwcFN0YXRlXCI7XG5pbXBvcnQge1xuICBwYXJzZUNsaXBib2FyZCxcbiAgcHJvYmFibHlTdXBwb3J0c0NsaXBib2FyZEJsb2IsXG4gIHByb2JhYmx5U3VwcG9ydHNDbGlwYm9hcmRXcml0ZVRleHQsXG59IGZyb20gXCIuLi9jbGlwYm9hcmRcIjtcbmltcG9ydCB7XG4gIEFQUF9OQU1FLFxuICBDVVJTT1JfVFlQRSxcbiAgREVGQVVMVF9NQVhfSU1BR0VfV0lEVEhfT1JfSEVJR0hULFxuICBERUZBVUxUX1VJX09QVElPTlMsXG4gIERFRkFVTFRfVkVSVElDQUxfQUxJR04sXG4gIERSQUdHSU5HX1RIUkVTSE9MRCxcbiAgRUxFTUVOVF9SRUFEWV9UT19FUkFTRV9PUEFDSVRZLFxuICBFTEVNRU5UX1NISUZUX1RSQU5TTEFURV9BTU9VTlQsXG4gIEVMRU1FTlRfVFJBTlNMQVRFX0FNT1VOVCxcbiAgRU5WLFxuICBFVkVOVCxcbiAgR1JJRF9TSVpFLFxuICBJTUFHRV9SRU5ERVJfVElNRU9VVCxcbiAgTElORV9DT05GSVJNX1RIUkVTSE9MRCxcbiAgTUFYX0FMTE9XRURfRklMRV9CWVRFUyxcbiAgTUlNRV9UWVBFUyxcbiAgTVFfTUFYX0hFSUdIVF9MQU5EU0NBUEUsXG4gIE1RX01BWF9XSURUSF9MQU5EU0NBUEUsXG4gIE1RX01BWF9XSURUSF9QT1JUUkFJVCxcbiAgTVFfUklHSFRfU0lERUJBUl9NSU5fV0lEVEgsXG4gIE1RX1NNX01BWF9XSURUSCxcbiAgUE9JTlRFUl9CVVRUT04sXG4gIFNDUk9MTF9USU1FT1VULFxuICBUQVBfVFdJQ0VfVElNRU9VVCxcbiAgVEVYVF9UT19DRU5URVJfU05BUF9USFJFU0hPTEQsXG4gIFRIRU1FLFxuICBUT1VDSF9DVFhfTUVOVV9USU1FT1VULFxuICBWRVJUSUNBTF9BTElHTixcbn0gZnJvbSBcIi4uL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgbG9hZEZyb21CbG9iIH0gZnJvbSBcIi4uL2RhdGFcIjtcbmltcG9ydCBMaWJyYXJ5LCB7IGRpc3RyaWJ1dGVMaWJyYXJ5SXRlbXNPblNxdWFyZUdyaWQgfSBmcm9tIFwiLi4vZGF0YS9saWJyYXJ5XCI7XG5pbXBvcnQgeyByZXN0b3JlLCByZXN0b3JlRWxlbWVudHMgfSBmcm9tIFwiLi4vZGF0YS9yZXN0b3JlXCI7XG5pbXBvcnQge1xuICBkcmFnTmV3RWxlbWVudCxcbiAgZHJhZ1NlbGVjdGVkRWxlbWVudHMsXG4gIGR1cGxpY2F0ZUVsZW1lbnQsXG4gIGdldENvbW1vbkJvdW5kcyxcbiAgZ2V0Q3Vyc29yRm9yUmVzaXppbmdFbGVtZW50LFxuICBnZXREcmFnT2Zmc2V0WFksXG4gIGdldEVsZW1lbnRXaXRoVHJhbnNmb3JtSGFuZGxlVHlwZSxcbiAgZ2V0Tm9ybWFsaXplZERpbWVuc2lvbnMsXG4gIGdldFBlcmZlY3RFbGVtZW50U2l6ZSxcbiAgZ2V0UmVzaXplQXJyb3dEaXJlY3Rpb24sXG4gIGdldFJlc2l6ZU9mZnNldFhZLFxuICBnZXRUcmFuc2Zvcm1IYW5kbGVUeXBlRnJvbUNvb3JkcyxcbiAgaGl0VGVzdCxcbiAgaXNIaXR0aW5nRWxlbWVudEJvdW5kaW5nQm94V2l0aG91dEhpdHRpbmdFbGVtZW50LFxuICBpc0ludmlzaWJseVNtYWxsRWxlbWVudCxcbiAgaXNOb25EZWxldGVkRWxlbWVudCxcbiAgaXNUZXh0RWxlbWVudCxcbiAgbmV3RWxlbWVudCxcbiAgbmV3TGluZWFyRWxlbWVudCxcbiAgbmV3VGV4dEVsZW1lbnQsXG4gIG5ld0ltYWdlRWxlbWVudCxcbiAgdGV4dFd5c2l3eWcsXG4gIHRyYW5zZm9ybUVsZW1lbnRzLFxuICB1cGRhdGVUZXh0RWxlbWVudCxcbn0gZnJvbSBcIi4uL2VsZW1lbnRcIjtcbmltcG9ydCB7XG4gIGJpbmRPclVuYmluZFNlbGVjdGVkRWxlbWVudHMsXG4gIGZpeEJpbmRpbmdzQWZ0ZXJEZWxldGlvbixcbiAgZml4QmluZGluZ3NBZnRlckR1cGxpY2F0aW9uLFxuICBnZXRFbGlnaWJsZUVsZW1lbnRzRm9yQmluZGluZyxcbiAgZ2V0SG92ZXJlZEVsZW1lbnRGb3JCaW5kaW5nLFxuICBpc0JpbmRpbmdFbmFibGVkLFxuICBpc0xpbmVhckVsZW1lbnRTaW1wbGVBbmRBbHJlYWR5Qm91bmQsXG4gIG1heWJlQmluZExpbmVhckVsZW1lbnQsXG4gIHNob3VsZEVuYWJsZUJpbmRpbmdGb3JQb2ludGVyRXZlbnQsXG4gIHVuYmluZExpbmVhckVsZW1lbnRzLFxuICB1cGRhdGVCb3VuZEVsZW1lbnRzLFxufSBmcm9tIFwiLi4vZWxlbWVudC9iaW5kaW5nXCI7XG5pbXBvcnQgeyBMaW5lYXJFbGVtZW50RWRpdG9yIH0gZnJvbSBcIi4uL2VsZW1lbnQvbGluZWFyRWxlbWVudEVkaXRvclwiO1xuaW1wb3J0IHsgbXV0YXRlRWxlbWVudCwgbmV3RWxlbWVudFdpdGggfSBmcm9tIFwiLi4vZWxlbWVudC9tdXRhdGVFbGVtZW50XCI7XG5pbXBvcnQgeyBkZWVwQ29weUVsZW1lbnQsIG5ld0ZyZWVEcmF3RWxlbWVudCB9IGZyb20gXCIuLi9lbGVtZW50L25ld0VsZW1lbnRcIjtcbmltcG9ydCB7XG4gIGhhc0JvdW5kVGV4dEVsZW1lbnQsXG4gIGlzQmluZGluZ0VsZW1lbnQsXG4gIGlzQmluZGluZ0VsZW1lbnRUeXBlLFxuICBpc0JvdW5kVG9Db250YWluZXIsXG4gIGlzSW1hZ2VFbGVtZW50LFxuICBpc0luaXRpYWxpemVkSW1hZ2VFbGVtZW50LFxuICBpc0xpbmVhckVsZW1lbnQsXG4gIGlzTGluZWFyRWxlbWVudFR5cGUsXG4gIGlzVGV4dEJpbmRhYmxlQ29udGFpbmVyLFxufSBmcm9tIFwiLi4vZWxlbWVudC90eXBlQ2hlY2tzXCI7XG5pbXBvcnQge1xuICBFeGNhbGlkcmF3QmluZGFibGVFbGVtZW50LFxuICBFeGNhbGlkcmF3RWxlbWVudCxcbiAgRXhjYWxpZHJhd0ZyZWVEcmF3RWxlbWVudCxcbiAgRXhjYWxpZHJhd0dlbmVyaWNFbGVtZW50LFxuICBFeGNhbGlkcmF3TGluZWFyRWxlbWVudCxcbiAgRXhjYWxpZHJhd1RleHRFbGVtZW50LFxuICBOb25EZWxldGVkLFxuICBJbml0aWFsaXplZEV4Y2FsaWRyYXdJbWFnZUVsZW1lbnQsXG4gIEV4Y2FsaWRyYXdJbWFnZUVsZW1lbnQsXG4gIEZpbGVJZCxcbiAgTm9uRGVsZXRlZEV4Y2FsaWRyYXdFbGVtZW50LFxuICBFeGNhbGlkcmF3VGV4dENvbnRhaW5lcixcbn0gZnJvbSBcIi4uL2VsZW1lbnQvdHlwZXNcIjtcbmltcG9ydCB7IGdldENlbnRlciwgZ2V0RGlzdGFuY2UgfSBmcm9tIFwiLi4vZ2VzdHVyZVwiO1xuaW1wb3J0IHtcbiAgZWRpdEdyb3VwRm9yU2VsZWN0ZWRFbGVtZW50LFxuICBnZXRFbGVtZW50c0luR3JvdXAsXG4gIGdldFNlbGVjdGVkR3JvdXBJZEZvckVsZW1lbnQsXG4gIGdldFNlbGVjdGVkR3JvdXBJZHMsXG4gIGlzRWxlbWVudEluR3JvdXAsXG4gIGlzU2VsZWN0ZWRWaWFHcm91cCxcbiAgc2VsZWN0R3JvdXBzRm9yU2VsZWN0ZWRFbGVtZW50cyxcbn0gZnJvbSBcIi4uL2dyb3Vwc1wiO1xuaW1wb3J0IEhpc3RvcnkgZnJvbSBcIi4uL2hpc3RvcnlcIjtcbmltcG9ydCB7IGRlZmF1bHRMYW5nLCBnZXRMYW5ndWFnZSwgbGFuZ3VhZ2VzLCBzZXRMYW5ndWFnZSwgdCB9IGZyb20gXCIuLi9pMThuXCI7XG5pbXBvcnQge1xuICBDT0RFUyxcbiAgc2hvdWxkUmVzaXplRnJvbUNlbnRlcixcbiAgc2hvdWxkTWFpbnRhaW5Bc3BlY3RSYXRpbyxcbiAgc2hvdWxkUm90YXRlV2l0aERpc2NyZXRlQW5nbGUsXG4gIGlzQXJyb3dLZXksXG4gIEtFWVMsXG4gIGlzQW5kcm9pZCxcbn0gZnJvbSBcIi4uL2tleXNcIjtcbmltcG9ydCB7IGRpc3RhbmNlMmQsIGdldEdyaWRQb2ludCwgaXNQYXRoQUxvb3AgfSBmcm9tIFwiLi4vbWF0aFwiO1xuaW1wb3J0IHsgcmVuZGVyU2NlbmUgfSBmcm9tIFwiLi4vcmVuZGVyZXIvcmVuZGVyU2NlbmVcIjtcbmltcG9ydCB7IGludmFsaWRhdGVTaGFwZUZvckVsZW1lbnQgfSBmcm9tIFwiLi4vcmVuZGVyZXIvcmVuZGVyRWxlbWVudFwiO1xuaW1wb3J0IHtcbiAgY2FsY3VsYXRlU2Nyb2xsQ2VudGVyLFxuICBnZXRUZXh0QmluZGFibGVDb250YWluZXJBdFBvc2l0aW9uLFxuICBnZXRFbGVtZW50c0F0UG9zaXRpb24sXG4gIGdldEVsZW1lbnRzV2l0aGluU2VsZWN0aW9uLFxuICBnZXROb3JtYWxpemVkWm9vbSxcbiAgZ2V0U2VsZWN0ZWRFbGVtZW50cyxcbiAgaGFzQmFja2dyb3VuZCxcbiAgaXNPdmVyU2Nyb2xsQmFycyxcbiAgaXNTb21lRWxlbWVudFNlbGVjdGVkLFxufSBmcm9tIFwiLi4vc2NlbmVcIjtcbmltcG9ydCBTY2VuZSBmcm9tIFwiLi4vc2NlbmUvU2NlbmVcIjtcbmltcG9ydCB7IFJlbmRlckNvbmZpZywgU2Nyb2xsQmFycyB9IGZyb20gXCIuLi9zY2VuZS90eXBlc1wiO1xuaW1wb3J0IHsgZ2V0U3RhdGVGb3Jab29tIH0gZnJvbSBcIi4uL3NjZW5lL3pvb21cIjtcbmltcG9ydCB7IGZpbmRTaGFwZUJ5S2V5LCBTSEFQRVMgfSBmcm9tIFwiLi4vc2hhcGVzXCI7XG5pbXBvcnQge1xuICBBcHBDbGFzc1Byb3BlcnRpZXMsXG4gIEFwcFByb3BzLFxuICBBcHBTdGF0ZSxcbiAgQmluYXJ5RmlsZURhdGEsXG4gIERhdGFVUkwsXG4gIEV4Y2FsaWRyYXdJbXBlcmF0aXZlQVBJLFxuICBCaW5hcnlGaWxlcyxcbiAgR2VzdHVyZSxcbiAgR2VzdHVyZUV2ZW50LFxuICBMaWJyYXJ5SXRlbXMsXG4gIFBvaW50ZXJEb3duU3RhdGUsXG4gIFNjZW5lRGF0YSxcbiAgRGV2aWNlLFxufSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7XG4gIGRlYm91bmNlLFxuICBkaXN0YW5jZSxcbiAgZ2V0Rm9udFN0cmluZyxcbiAgZ2V0TmVhcmVzdFNjcm9sbGFibGVDb250YWluZXIsXG4gIGlzSW5wdXRMaWtlLFxuICBpc1Rvb2xJY29uLFxuICBpc1dyaXRhYmxlRWxlbWVudCxcbiAgcmVzZXRDdXJzb3IsXG4gIHJlc29sdmFibGVQcm9taXNlLFxuICBzY2VuZUNvb3Jkc1RvVmlld3BvcnRDb29yZHMsXG4gIHNldEN1cnNvcixcbiAgc2V0Q3Vyc29yRm9yU2hhcGUsXG4gIHR1cGxlVG9Db29ycyxcbiAgdmlld3BvcnRDb29yZHNUb1NjZW5lQ29vcmRzLFxuICB3aXRoQmF0Y2hlZFVwZGF0ZXMsXG4gIHdyYXBFdmVudCxcbiAgd2l0aEJhdGNoZWRVcGRhdGVzVGhyb3R0bGVkLFxuICB1cGRhdGVPYmplY3QsXG4gIHNldEVyYXNlckN1cnNvcixcbiAgdXBkYXRlQWN0aXZlVG9vbCxcbn0gZnJvbSBcIi4uL3V0aWxzXCI7XG5pbXBvcnQgQ29udGV4dE1lbnUsIHsgQ29udGV4dE1lbnVPcHRpb24gfSBmcm9tIFwiLi9Db250ZXh0TWVudVwiO1xuaW1wb3J0IExheWVyVUkgZnJvbSBcIi4vTGF5ZXJVSVwiO1xuaW1wb3J0IHsgVG9hc3QgfSBmcm9tIFwiLi9Ub2FzdFwiO1xuaW1wb3J0IHsgYWN0aW9uVG9nZ2xlVmlld01vZGUgfSBmcm9tIFwiLi4vYWN0aW9ucy9hY3Rpb25Ub2dnbGVWaWV3TW9kZVwiO1xuaW1wb3J0IHtcbiAgZGF0YVVSTFRvRmlsZSxcbiAgZ2VuZXJhdGVJZEZyb21GaWxlLFxuICBnZXREYXRhVVJMLFxuICBnZXRGaWxlRnJvbUV2ZW50LFxuICBpc1N1cHBvcnRlZEltYWdlRmlsZSxcbiAgbG9hZFNjZW5lT3JMaWJyYXJ5RnJvbUJsb2IsXG4gIG5vcm1hbGl6ZUZpbGUsXG4gIHBhcnNlTGlicmFyeUpTT04sXG4gIHJlc2l6ZUltYWdlRmlsZSxcbiAgU1ZHU3RyaW5nVG9GaWxlLFxufSBmcm9tIFwiLi4vZGF0YS9ibG9iXCI7XG5pbXBvcnQge1xuICBnZXRJbml0aWFsaXplZEltYWdlRWxlbWVudHMsXG4gIGxvYWRIVE1MSW1hZ2VFbGVtZW50LFxuICBub3JtYWxpemVTVkcsXG4gIHVwZGF0ZUltYWdlQ2FjaGUgYXMgX3VwZGF0ZUltYWdlQ2FjaGUsXG59IGZyb20gXCIuLi9lbGVtZW50L2ltYWdlXCI7XG5pbXBvcnQgdGhyb3R0bGUgZnJvbSBcImxvZGFzaC50aHJvdHRsZVwiO1xuaW1wb3J0IHsgZmlsZU9wZW4sIEZpbGVTeXN0ZW1IYW5kbGUgfSBmcm9tIFwiLi4vZGF0YS9maWxlc3lzdGVtXCI7XG5pbXBvcnQge1xuICBiaW5kVGV4dFRvU2hhcGVBZnRlckR1cGxpY2F0aW9uLFxuICBnZXRBcHByb3hNaW5MaW5lSGVpZ2h0LFxuICBnZXRBcHByb3hNaW5MaW5lV2lkdGgsXG4gIGdldEJvdW5kVGV4dEVsZW1lbnQsXG59IGZyb20gXCIuLi9lbGVtZW50L3RleHRFbGVtZW50XCI7XG5pbXBvcnQgeyBpc0hpdHRpbmdFbGVtZW50Tm90Q29uc2lkZXJpbmdCb3VuZGluZ0JveCB9IGZyb20gXCIuLi9lbGVtZW50L2NvbGxpc2lvblwiO1xuaW1wb3J0IHtcbiAgbm9ybWFsaXplTGluayxcbiAgc2hvd0h5cGVybGlua1Rvb2x0aXAsXG4gIGhpZGVIeXBlcmxpbmtUb29saXAsXG4gIEh5cGVybGluayxcbiAgaXNQb2ludEhpdHRpbmdMaW5rSWNvbixcbiAgaXNMb2NhbExpbmssXG59IGZyb20gXCIuLi9lbGVtZW50L0h5cGVybGlua1wiO1xuXG5jb25zdCBkZXZpY2VDb250ZXh0SW5pdGlhbFZhbHVlID0ge1xuICBpc1NtU2NyZWVuOiBmYWxzZSxcbiAgaXNNb2JpbGU6IGZhbHNlLFxuICBpc1RvdWNoU2NyZWVuOiBmYWxzZSxcbiAgY2FuRGV2aWNlRml0U2lkZWJhcjogZmFsc2UsXG59O1xuY29uc3QgRGV2aWNlQ29udGV4dCA9IFJlYWN0LmNyZWF0ZUNvbnRleHQ8RGV2aWNlPihkZXZpY2VDb250ZXh0SW5pdGlhbFZhbHVlKTtcbmV4cG9ydCBjb25zdCB1c2VEZXZpY2UgPSAoKSA9PiB1c2VDb250ZXh0PERldmljZT4oRGV2aWNlQ29udGV4dCk7XG5jb25zdCBFeGNhbGlkcmF3Q29udGFpbmVyQ29udGV4dCA9IFJlYWN0LmNyZWF0ZUNvbnRleHQ8e1xuICBjb250YWluZXI6IEhUTUxEaXZFbGVtZW50IHwgbnVsbDtcbiAgaWQ6IHN0cmluZyB8IG51bGw7XG59Pih7IGNvbnRhaW5lcjogbnVsbCwgaWQ6IG51bGwgfSk7XG5leHBvcnQgY29uc3QgdXNlRXhjYWxpZHJhd0NvbnRhaW5lciA9ICgpID0+XG4gIHVzZUNvbnRleHQoRXhjYWxpZHJhd0NvbnRhaW5lckNvbnRleHQpO1xuXG5sZXQgZGlkVGFwVHdpY2U6IGJvb2xlYW4gPSBmYWxzZTtcbmxldCB0YXBwZWRUd2ljZVRpbWVyID0gMDtcbmxldCBjdXJzb3JYID0gMDtcbmxldCBjdXJzb3JZID0gMDtcbmxldCBpc0hvbGRpbmdTcGFjZTogYm9vbGVhbiA9IGZhbHNlO1xubGV0IGlzUGFubmluZzogYm9vbGVhbiA9IGZhbHNlO1xubGV0IGlzRHJhZ2dpbmdTY3JvbGxCYXI6IGJvb2xlYW4gPSBmYWxzZTtcbmxldCBjdXJyZW50U2Nyb2xsQmFyczogU2Nyb2xsQmFycyA9IHsgaG9yaXpvbnRhbDogbnVsbCwgdmVydGljYWw6IG51bGwgfTtcbmxldCB0b3VjaFRpbWVvdXQgPSAwO1xubGV0IGludmFsaWRhdGVDb250ZXh0TWVudSA9IGZhbHNlO1xuXG4vLyByZW1vdmUgdGhpcyBoYWNrIHdoZW4gd2UgY2FuIHN5bmMgcmVuZGVyICYgcmVzaXplT2JzZXJ2ZXIgKHN0YXRlIHVwZGF0ZSlcbi8vIHRvIHJBRi4gU2VlICM1NDM5XG5sZXQgVEhST1RUTEVfTkVYVF9SRU5ERVIgPSB0cnVlO1xuXG5sZXQgbGFzdFBvaW50ZXJVcDogKChldmVudDogYW55KSA9PiB2b2lkKSB8IG51bGwgPSBudWxsO1xuY29uc3QgZ2VzdHVyZTogR2VzdHVyZSA9IHtcbiAgcG9pbnRlcnM6IG5ldyBNYXAoKSxcbiAgbGFzdENlbnRlcjogbnVsbCxcbiAgaW5pdGlhbERpc3RhbmNlOiBudWxsLFxuICBpbml0aWFsU2NhbGU6IG51bGwsXG59O1xuXG5jbGFzcyBBcHAgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQ8QXBwUHJvcHMsIEFwcFN0YXRlPiB7XG4gIGNhbnZhczogQXBwQ2xhc3NQcm9wZXJ0aWVzW1wiY2FudmFzXCJdID0gbnVsbDtcbiAgcmM6IFJvdWdoQ2FudmFzIHwgbnVsbCA9IG51bGw7XG4gIHVubW91bnRlZDogYm9vbGVhbiA9IGZhbHNlO1xuICBhY3Rpb25NYW5hZ2VyOiBBY3Rpb25NYW5hZ2VyO1xuICBkZXZpY2U6IERldmljZSA9IGRldmljZUNvbnRleHRJbml0aWFsVmFsdWU7XG4gIGRldGFjaElzTW9iaWxlTXFIYW5kbGVyPzogKCkgPT4gdm9pZDtcblxuICBwcml2YXRlIGV4Y2FsaWRyYXdDb250YWluZXJSZWYgPSBSZWFjdC5jcmVhdGVSZWY8SFRNTERpdkVsZW1lbnQ+KCk7XG5cbiAgcHVibGljIHN0YXRpYyBkZWZhdWx0UHJvcHM6IFBhcnRpYWw8QXBwUHJvcHM+ID0ge1xuICAgIC8vIG5lZWRlZCBmb3IgdGVzdHMgdG8gcGFzcyBzaW5jZSB3ZSBkaXJlY3RseSByZW5kZXIgQXBwIGluIG1hbnkgdGVzdHNcbiAgICBVSU9wdGlvbnM6IERFRkFVTFRfVUlfT1BUSU9OUyxcbiAgfTtcblxuICBwdWJsaWMgc2NlbmU6IFNjZW5lO1xuICBwcml2YXRlIHJlc2l6ZU9ic2VydmVyOiBSZXNpemVPYnNlcnZlciB8IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSBuZWFyZXN0U2Nyb2xsYWJsZUNvbnRhaW5lcjogSFRNTEVsZW1lbnQgfCBEb2N1bWVudCB8IHVuZGVmaW5lZDtcbiAgcHVibGljIGxpYnJhcnk6IEFwcENsYXNzUHJvcGVydGllc1tcImxpYnJhcnlcIl07XG4gIHB1YmxpYyBsaWJyYXJ5SXRlbXNGcm9tU3RvcmFnZTogTGlicmFyeUl0ZW1zIHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIGlkOiBzdHJpbmc7XG4gIHByaXZhdGUgaGlzdG9yeTogSGlzdG9yeTtcbiAgcHJpdmF0ZSBleGNhbGlkcmF3Q29udGFpbmVyVmFsdWU6IHtcbiAgICBjb250YWluZXI6IEhUTUxEaXZFbGVtZW50IHwgbnVsbDtcbiAgICBpZDogc3RyaW5nO1xuICB9O1xuXG4gIHB1YmxpYyBmaWxlczogQmluYXJ5RmlsZXMgPSB7fTtcbiAgcHVibGljIGltYWdlQ2FjaGU6IEFwcENsYXNzUHJvcGVydGllc1tcImltYWdlQ2FjaGVcIl0gPSBuZXcgTWFwKCk7XG5cbiAgaGl0TGlua0VsZW1lbnQ/OiBOb25EZWxldGVkRXhjYWxpZHJhd0VsZW1lbnQ7XG4gIGxhc3RQb2ludGVyRG93bjogUmVhY3QuUG9pbnRlckV2ZW50PEhUTUxDYW52YXNFbGVtZW50PiB8IG51bGwgPSBudWxsO1xuICBsYXN0UG9pbnRlclVwOiBSZWFjdC5Qb2ludGVyRXZlbnQ8SFRNTEVsZW1lbnQ+IHwgUG9pbnRlckV2ZW50IHwgbnVsbCA9IG51bGw7XG4gIGNvbnRleHRNZW51T3BlbjogYm9vbGVhbiA9IGZhbHNlO1xuICBsYXN0U2NlbmVQb2ludGVyOiB7IHg6IG51bWJlcjsgeTogbnVtYmVyIH0gfCBudWxsID0gbnVsbDtcblxuICBjb25zdHJ1Y3Rvcihwcm9wczogQXBwUHJvcHMpIHtcbiAgICBzdXBlcihwcm9wcyk7XG4gICAgY29uc3QgZGVmYXVsdEFwcFN0YXRlID0gZ2V0RGVmYXVsdEFwcFN0YXRlKCk7XG4gICAgY29uc3Qge1xuICAgICAgZXhjYWxpZHJhd1JlZixcbiAgICAgIHZpZXdNb2RlRW5hYmxlZCA9IGZhbHNlLFxuICAgICAgemVuTW9kZUVuYWJsZWQgPSBmYWxzZSxcbiAgICAgIGdyaWRNb2RlRW5hYmxlZCA9IGZhbHNlLFxuICAgICAgdGhlbWUgPSBkZWZhdWx0QXBwU3RhdGUudGhlbWUsXG4gICAgICBuYW1lID0gZGVmYXVsdEFwcFN0YXRlLm5hbWUsXG4gICAgfSA9IHByb3BzO1xuICAgIHRoaXMuc3RhdGUgPSB7XG4gICAgICAuLi5kZWZhdWx0QXBwU3RhdGUsXG4gICAgICB0aGVtZSxcbiAgICAgIGlzTG9hZGluZzogdHJ1ZSxcbiAgICAgIC4uLnRoaXMuZ2V0Q2FudmFzT2Zmc2V0cygpLFxuICAgICAgdmlld01vZGVFbmFibGVkLFxuICAgICAgemVuTW9kZUVuYWJsZWQsXG4gICAgICBncmlkU2l6ZTogZ3JpZE1vZGVFbmFibGVkID8gR1JJRF9TSVpFIDogbnVsbCxcbiAgICAgIG5hbWUsXG4gICAgICB3aWR0aDogd2luZG93LmlubmVyV2lkdGgsXG4gICAgICBoZWlnaHQ6IHdpbmRvdy5pbm5lckhlaWdodCxcbiAgICAgIHNob3dIeXBlcmxpbmtQb3B1cDogZmFsc2UsXG4gICAgICBpc0xpYnJhcnlNZW51RG9ja2VkOiBmYWxzZSxcbiAgICB9O1xuXG4gICAgdGhpcy5pZCA9IG5hbm9pZCgpO1xuXG4gICAgdGhpcy5saWJyYXJ5ID0gbmV3IExpYnJhcnkodGhpcyk7XG4gICAgaWYgKGV4Y2FsaWRyYXdSZWYpIHtcbiAgICAgIGNvbnN0IHJlYWR5UHJvbWlzZSA9XG4gICAgICAgIChcImN1cnJlbnRcIiBpbiBleGNhbGlkcmF3UmVmICYmIGV4Y2FsaWRyYXdSZWYuY3VycmVudD8ucmVhZHlQcm9taXNlKSB8fFxuICAgICAgICByZXNvbHZhYmxlUHJvbWlzZTxFeGNhbGlkcmF3SW1wZXJhdGl2ZUFQST4oKTtcblxuICAgICAgY29uc3QgYXBpOiBFeGNhbGlkcmF3SW1wZXJhdGl2ZUFQSSA9IHtcbiAgICAgICAgcmVhZHk6IHRydWUsXG4gICAgICAgIHJlYWR5UHJvbWlzZSxcbiAgICAgICAgdXBkYXRlU2NlbmU6IHRoaXMudXBkYXRlU2NlbmUsXG4gICAgICAgIHVwZGF0ZUxpYnJhcnk6IHRoaXMubGlicmFyeS51cGRhdGVMaWJyYXJ5LFxuICAgICAgICBhZGRGaWxlczogdGhpcy5hZGRGaWxlcyxcbiAgICAgICAgcmVzZXRTY2VuZTogdGhpcy5yZXNldFNjZW5lLFxuICAgICAgICBnZXRTY2VuZUVsZW1lbnRzSW5jbHVkaW5nRGVsZXRlZDogdGhpcy5nZXRTY2VuZUVsZW1lbnRzSW5jbHVkaW5nRGVsZXRlZCxcbiAgICAgICAgaGlzdG9yeToge1xuICAgICAgICAgIGNsZWFyOiB0aGlzLnJlc2V0SGlzdG9yeSxcbiAgICAgICAgfSxcbiAgICAgICAgc2Nyb2xsVG9Db250ZW50OiB0aGlzLnNjcm9sbFRvQ29udGVudCxcbiAgICAgICAgZ2V0U2NlbmVFbGVtZW50czogdGhpcy5nZXRTY2VuZUVsZW1lbnRzLFxuICAgICAgICBnZXRBcHBTdGF0ZTogKCkgPT4gdGhpcy5zdGF0ZSxcbiAgICAgICAgZ2V0RmlsZXM6ICgpID0+IHRoaXMuZmlsZXMsXG4gICAgICAgIHJlZnJlc2g6IHRoaXMucmVmcmVzaCxcbiAgICAgICAgc2V0VG9hc3Q6IHRoaXMuc2V0VG9hc3QsXG4gICAgICAgIGlkOiB0aGlzLmlkLFxuICAgICAgICBzZXRBY3RpdmVUb29sOiB0aGlzLnNldEFjdGl2ZVRvb2wsXG4gICAgICAgIHNldEN1cnNvcjogdGhpcy5zZXRDdXJzb3IsXG4gICAgICAgIHJlc2V0Q3Vyc29yOiB0aGlzLnJlc2V0Q3Vyc29yLFxuICAgICAgfSBhcyBjb25zdDtcbiAgICAgIGlmICh0eXBlb2YgZXhjYWxpZHJhd1JlZiA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgIGV4Y2FsaWRyYXdSZWYoYXBpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGV4Y2FsaWRyYXdSZWYuY3VycmVudCA9IGFwaTtcbiAgICAgIH1cbiAgICAgIHJlYWR5UHJvbWlzZS5yZXNvbHZlKGFwaSk7XG4gICAgfVxuXG4gICAgdGhpcy5leGNhbGlkcmF3Q29udGFpbmVyVmFsdWUgPSB7XG4gICAgICBjb250YWluZXI6IHRoaXMuZXhjYWxpZHJhd0NvbnRhaW5lclJlZi5jdXJyZW50LFxuICAgICAgaWQ6IHRoaXMuaWQsXG4gICAgfTtcblxuICAgIHRoaXMuc2NlbmUgPSBuZXcgU2NlbmUoKTtcbiAgICB0aGlzLmhpc3RvcnkgPSBuZXcgSGlzdG9yeSgpO1xuICAgIHRoaXMuYWN0aW9uTWFuYWdlciA9IG5ldyBBY3Rpb25NYW5hZ2VyKFxuICAgICAgdGhpcy5zeW5jQWN0aW9uUmVzdWx0LFxuICAgICAgKCkgPT4gdGhpcy5zdGF0ZSxcbiAgICAgICgpID0+IHRoaXMuc2NlbmUuZ2V0RWxlbWVudHNJbmNsdWRpbmdEZWxldGVkKCksXG4gICAgICB0aGlzLFxuICAgICk7XG4gICAgdGhpcy5hY3Rpb25NYW5hZ2VyLnJlZ2lzdGVyQWxsKGFjdGlvbnMpO1xuXG4gICAgdGhpcy5hY3Rpb25NYW5hZ2VyLnJlZ2lzdGVyQWN0aW9uKGNyZWF0ZVVuZG9BY3Rpb24odGhpcy5oaXN0b3J5KSk7XG4gICAgdGhpcy5hY3Rpb25NYW5hZ2VyLnJlZ2lzdGVyQWN0aW9uKGNyZWF0ZVJlZG9BY3Rpb24odGhpcy5oaXN0b3J5KSk7XG4gIH1cblxuICBwcml2YXRlIHJlbmRlckNhbnZhcygpIHtcbiAgICBjb25zdCBjYW52YXNTY2FsZSA9IHdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvO1xuICAgIGNvbnN0IHtcbiAgICAgIHdpZHRoOiBjYW52YXNET01XaWR0aCxcbiAgICAgIGhlaWdodDogY2FudmFzRE9NSGVpZ2h0LFxuICAgICAgdmlld01vZGVFbmFibGVkLFxuICAgIH0gPSB0aGlzLnN0YXRlO1xuICAgIGNvbnN0IGNhbnZhc1dpZHRoID0gY2FudmFzRE9NV2lkdGggKiBjYW52YXNTY2FsZTtcbiAgICBjb25zdCBjYW52YXNIZWlnaHQgPSBjYW52YXNET01IZWlnaHQgKiBjYW52YXNTY2FsZTtcbiAgICBpZiAodmlld01vZGVFbmFibGVkKSB7XG4gICAgICByZXR1cm4gKFxuICAgICAgICA8Y2FudmFzXG4gICAgICAgICAgY2xhc3NOYW1lPVwiZXhjYWxpZHJhd19fY2FudmFzXCJcbiAgICAgICAgICBzdHlsZT17e1xuICAgICAgICAgICAgd2lkdGg6IGNhbnZhc0RPTVdpZHRoLFxuICAgICAgICAgICAgaGVpZ2h0OiBjYW52YXNET01IZWlnaHQsXG4gICAgICAgICAgICBjdXJzb3I6IENVUlNPUl9UWVBFLkdSQUIsXG4gICAgICAgICAgfX1cbiAgICAgICAgICB3aWR0aD17Y2FudmFzV2lkdGh9XG4gICAgICAgICAgaGVpZ2h0PXtjYW52YXNIZWlnaHR9XG4gICAgICAgICAgcmVmPXt0aGlzLmhhbmRsZUNhbnZhc1JlZn1cbiAgICAgICAgICBvbkNvbnRleHRNZW51PXt0aGlzLmhhbmRsZUNhbnZhc0NvbnRleHRNZW51fVxuICAgICAgICAgIG9uUG9pbnRlck1vdmU9e3RoaXMuaGFuZGxlQ2FudmFzUG9pbnRlck1vdmV9XG4gICAgICAgICAgb25Qb2ludGVyVXA9e3RoaXMuaGFuZGxlQ2FudmFzUG9pbnRlclVwfVxuICAgICAgICAgIG9uUG9pbnRlckNhbmNlbD17dGhpcy5yZW1vdmVQb2ludGVyfVxuICAgICAgICAgIG9uVG91Y2hNb3ZlPXt0aGlzLmhhbmRsZVRvdWNoTW92ZX1cbiAgICAgICAgICBvblBvaW50ZXJEb3duPXt0aGlzLmhhbmRsZUNhbnZhc1BvaW50ZXJEb3dufVxuICAgICAgICA+XG4gICAgICAgICAge3QoXCJsYWJlbHMuZHJhd2luZ0NhbnZhc1wiKX1cbiAgICAgICAgPC9jYW52YXM+XG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gKFxuICAgICAgPGNhbnZhc1xuICAgICAgICBjbGFzc05hbWU9XCJleGNhbGlkcmF3X19jYW52YXNcIlxuICAgICAgICBzdHlsZT17e1xuICAgICAgICAgIHdpZHRoOiBjYW52YXNET01XaWR0aCxcbiAgICAgICAgICBoZWlnaHQ6IGNhbnZhc0RPTUhlaWdodCxcbiAgICAgICAgfX1cbiAgICAgICAgd2lkdGg9e2NhbnZhc1dpZHRofVxuICAgICAgICBoZWlnaHQ9e2NhbnZhc0hlaWdodH1cbiAgICAgICAgcmVmPXt0aGlzLmhhbmRsZUNhbnZhc1JlZn1cbiAgICAgICAgb25Db250ZXh0TWVudT17dGhpcy5oYW5kbGVDYW52YXNDb250ZXh0TWVudX1cbiAgICAgICAgb25Qb2ludGVyRG93bj17dGhpcy5oYW5kbGVDYW52YXNQb2ludGVyRG93bn1cbiAgICAgICAgb25Eb3VibGVDbGljaz17dGhpcy5oYW5kbGVDYW52YXNEb3VibGVDbGlja31cbiAgICAgICAgb25Qb2ludGVyTW92ZT17dGhpcy5oYW5kbGVDYW52YXNQb2ludGVyTW92ZX1cbiAgICAgICAgb25Qb2ludGVyVXA9e3RoaXMuaGFuZGxlQ2FudmFzUG9pbnRlclVwfVxuICAgICAgICBvblBvaW50ZXJDYW5jZWw9e3RoaXMucmVtb3ZlUG9pbnRlcn1cbiAgICAgICAgb25Ub3VjaE1vdmU9e3RoaXMuaGFuZGxlVG91Y2hNb3ZlfVxuICAgICAgPlxuICAgICAgICB7dChcImxhYmVscy5kcmF3aW5nQ2FudmFzXCIpfVxuICAgICAgPC9jYW52YXM+XG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyByZW5kZXIoKSB7XG4gICAgY29uc3Qgc2VsZWN0ZWRFbGVtZW50ID0gZ2V0U2VsZWN0ZWRFbGVtZW50cyhcbiAgICAgIHRoaXMuc2NlbmUuZ2V0Tm9uRGVsZXRlZEVsZW1lbnRzKCksXG4gICAgICB0aGlzLnN0YXRlLFxuICAgICk7XG4gICAgY29uc3Qge1xuICAgICAgb25Db2xsYWJCdXR0b25DbGljayxcbiAgICAgIHJlbmRlclRvcFJpZ2h0VUksXG4gICAgICByZW5kZXJGb290ZXIsXG4gICAgICByZW5kZXJDdXN0b21TdGF0cyxcbiAgICB9ID0gdGhpcy5wcm9wcztcblxuICAgIHJldHVybiAoXG4gICAgICA8ZGl2XG4gICAgICAgIGNsYXNzTmFtZT17Y2xzeChcImV4Y2FsaWRyYXcgZXhjYWxpZHJhdy1jb250YWluZXJcIiwge1xuICAgICAgICAgIFwiZXhjYWxpZHJhdy0tdmlldy1tb2RlXCI6IHRoaXMuc3RhdGUudmlld01vZGVFbmFibGVkLFxuICAgICAgICAgIFwiZXhjYWxpZHJhdy0tbW9iaWxlXCI6IHRoaXMuZGV2aWNlLmlzTW9iaWxlLFxuICAgICAgICB9KX1cbiAgICAgICAgcmVmPXt0aGlzLmV4Y2FsaWRyYXdDb250YWluZXJSZWZ9XG4gICAgICAgIG9uRHJvcD17dGhpcy5oYW5kbGVBcHBPbkRyb3B9XG4gICAgICAgIHRhYkluZGV4PXswfVxuICAgICAgICBvbktleURvd249e1xuICAgICAgICAgIHRoaXMucHJvcHMuaGFuZGxlS2V5Ym9hcmRHbG9iYWxseSA/IHVuZGVmaW5lZCA6IHRoaXMub25LZXlEb3duXG4gICAgICAgIH1cbiAgICAgID5cbiAgICAgICAgPEV4Y2FsaWRyYXdDb250YWluZXJDb250ZXh0LlByb3ZpZGVyXG4gICAgICAgICAgdmFsdWU9e3RoaXMuZXhjYWxpZHJhd0NvbnRhaW5lclZhbHVlfVxuICAgICAgICA+XG4gICAgICAgICAgPERldmljZUNvbnRleHQuUHJvdmlkZXIgdmFsdWU9e3RoaXMuZGV2aWNlfT5cbiAgICAgICAgICAgIDxMYXllclVJXG4gICAgICAgICAgICAgIGNhbnZhcz17dGhpcy5jYW52YXN9XG4gICAgICAgICAgICAgIGFwcFN0YXRlPXt0aGlzLnN0YXRlfVxuICAgICAgICAgICAgICBmaWxlcz17dGhpcy5maWxlc31cbiAgICAgICAgICAgICAgc2V0QXBwU3RhdGU9e3RoaXMuc2V0QXBwU3RhdGV9XG4gICAgICAgICAgICAgIGFjdGlvbk1hbmFnZXI9e3RoaXMuYWN0aW9uTWFuYWdlcn1cbiAgICAgICAgICAgICAgZWxlbWVudHM9e3RoaXMuc2NlbmUuZ2V0Tm9uRGVsZXRlZEVsZW1lbnRzKCl9XG4gICAgICAgICAgICAgIG9uQ29sbGFiQnV0dG9uQ2xpY2s9e29uQ29sbGFiQnV0dG9uQ2xpY2t9XG4gICAgICAgICAgICAgIG9uTG9ja1RvZ2dsZT17dGhpcy50b2dnbGVMb2NrfVxuICAgICAgICAgICAgICBvblBlbk1vZGVUb2dnbGU9e3RoaXMudG9nZ2xlUGVuTW9kZX1cbiAgICAgICAgICAgICAgb25JbnNlcnRFbGVtZW50cz17KGVsZW1lbnRzKSA9PlxuICAgICAgICAgICAgICAgIHRoaXMuYWRkRWxlbWVudHNGcm9tUGFzdGVPckxpYnJhcnkoe1xuICAgICAgICAgICAgICAgICAgZWxlbWVudHMsXG4gICAgICAgICAgICAgICAgICBwb3NpdGlvbjogXCJjZW50ZXJcIixcbiAgICAgICAgICAgICAgICAgIGZpbGVzOiBudWxsLFxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgbGFuZ0NvZGU9e2dldExhbmd1YWdlKCkuY29kZX1cbiAgICAgICAgICAgICAgaXNDb2xsYWJvcmF0aW5nPXt0aGlzLnByb3BzLmlzQ29sbGFib3JhdGluZ31cbiAgICAgICAgICAgICAgcmVuZGVyVG9wUmlnaHRVST17cmVuZGVyVG9wUmlnaHRVSX1cbiAgICAgICAgICAgICAgcmVuZGVyQ3VzdG9tRm9vdGVyPXtyZW5kZXJGb290ZXJ9XG4gICAgICAgICAgICAgIHJlbmRlckN1c3RvbVN0YXRzPXtyZW5kZXJDdXN0b21TdGF0c31cbiAgICAgICAgICAgICAgc2hvd0V4aXRaZW5Nb2RlQnRuPXtcbiAgICAgICAgICAgICAgICB0eXBlb2YgdGhpcy5wcm9wcz8uemVuTW9kZUVuYWJsZWQgPT09IFwidW5kZWZpbmVkXCIgJiZcbiAgICAgICAgICAgICAgICB0aGlzLnN0YXRlLnplbk1vZGVFbmFibGVkXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgc2hvd1RoZW1lQnRuPXtcbiAgICAgICAgICAgICAgICB0eXBlb2YgdGhpcy5wcm9wcz8udGhlbWUgPT09IFwidW5kZWZpbmVkXCIgJiZcbiAgICAgICAgICAgICAgICB0aGlzLnByb3BzLlVJT3B0aW9ucy5jYW52YXNBY3Rpb25zLnRoZW1lXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgbGlicmFyeVJldHVyblVybD17dGhpcy5wcm9wcy5saWJyYXJ5UmV0dXJuVXJsfVxuICAgICAgICAgICAgICBVSU9wdGlvbnM9e3RoaXMucHJvcHMuVUlPcHRpb25zfVxuICAgICAgICAgICAgICBmb2N1c0NvbnRhaW5lcj17dGhpcy5mb2N1c0NvbnRhaW5lcn1cbiAgICAgICAgICAgICAgbGlicmFyeT17dGhpcy5saWJyYXJ5fVxuICAgICAgICAgICAgICBpZD17dGhpcy5pZH1cbiAgICAgICAgICAgICAgb25JbWFnZUFjdGlvbj17dGhpcy5vbkltYWdlQWN0aW9ufVxuICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZXhjYWxpZHJhdy10ZXh0RWRpdG9yQ29udGFpbmVyXCIgLz5cbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZXhjYWxpZHJhdy1jb250ZXh0TWVudUNvbnRhaW5lclwiIC8+XG4gICAgICAgICAgICB7c2VsZWN0ZWRFbGVtZW50Lmxlbmd0aCA9PT0gMSAmJiB0aGlzLnN0YXRlLnNob3dIeXBlcmxpbmtQb3B1cCAmJiAoXG4gICAgICAgICAgICAgIDxIeXBlcmxpbmtcbiAgICAgICAgICAgICAgICBrZXk9e3NlbGVjdGVkRWxlbWVudFswXS5pZH1cbiAgICAgICAgICAgICAgICBlbGVtZW50PXtzZWxlY3RlZEVsZW1lbnRbMF19XG4gICAgICAgICAgICAgICAgYXBwU3RhdGU9e3RoaXMuc3RhdGV9XG4gICAgICAgICAgICAgICAgc2V0QXBwU3RhdGU9e3RoaXMuc2V0QXBwU3RhdGV9XG4gICAgICAgICAgICAgICAgb25MaW5rT3Blbj17dGhpcy5wcm9wcy5vbkxpbmtPcGVufVxuICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgKX1cbiAgICAgICAgICAgIHt0aGlzLnN0YXRlLnRvYXN0ICE9PSBudWxsICYmIChcbiAgICAgICAgICAgICAgPFRvYXN0XG4gICAgICAgICAgICAgICAgbWVzc2FnZT17dGhpcy5zdGF0ZS50b2FzdC5tZXNzYWdlfVxuICAgICAgICAgICAgICAgIG9uQ2xvc2U9eygpID0+IHRoaXMuc2V0VG9hc3QobnVsbCl9XG4gICAgICAgICAgICAgICAgZHVyYXRpb249e3RoaXMuc3RhdGUudG9hc3QuZHVyYXRpb259XG4gICAgICAgICAgICAgICAgY2xvc2FibGU9e3RoaXMuc3RhdGUudG9hc3QuY2xvc2FibGV9XG4gICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICApfVxuICAgICAgICAgICAgPG1haW4+e3RoaXMucmVuZGVyQ2FudmFzKCl9PC9tYWluPlxuICAgICAgICAgIDwvRGV2aWNlQ29udGV4dC5Qcm92aWRlcj5cbiAgICAgICAgPC9FeGNhbGlkcmF3Q29udGFpbmVyQ29udGV4dC5Qcm92aWRlcj5cbiAgICAgIDwvZGl2PlxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgZm9jdXNDb250YWluZXI6IEFwcENsYXNzUHJvcGVydGllc1tcImZvY3VzQ29udGFpbmVyXCJdID0gKCkgPT4ge1xuICAgIGlmICh0aGlzLnByb3BzLmF1dG9Gb2N1cykge1xuICAgICAgdGhpcy5leGNhbGlkcmF3Q29udGFpbmVyUmVmLmN1cnJlbnQ/LmZvY3VzKCk7XG4gICAgfVxuICB9O1xuXG4gIHB1YmxpYyBnZXRTY2VuZUVsZW1lbnRzSW5jbHVkaW5nRGVsZXRlZCA9ICgpID0+IHtcbiAgICByZXR1cm4gdGhpcy5zY2VuZS5nZXRFbGVtZW50c0luY2x1ZGluZ0RlbGV0ZWQoKTtcbiAgfTtcblxuICBwdWJsaWMgZ2V0U2NlbmVFbGVtZW50cyA9ICgpID0+IHtcbiAgICByZXR1cm4gdGhpcy5zY2VuZS5nZXROb25EZWxldGVkRWxlbWVudHMoKTtcbiAgfTtcblxuICBwcml2YXRlIHN5bmNBY3Rpb25SZXN1bHQgPSB3aXRoQmF0Y2hlZFVwZGF0ZXMoXG4gICAgKGFjdGlvblJlc3VsdDogQWN0aW9uUmVzdWx0KSA9PiB7XG4gICAgICAvLyBTaW5jZSBjb250ZXh0IG1lbnUgY2xvc2VzIHdoZW4gYWN0aW9uIHRyaWdnZXJlZCBzbyBzZXR0aW5nIHRvIGZhbHNlXG4gICAgICB0aGlzLmNvbnRleHRNZW51T3BlbiA9IGZhbHNlO1xuICAgICAgaWYgKHRoaXMudW5tb3VudGVkIHx8IGFjdGlvblJlc3VsdCA9PT0gZmFsc2UpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBsZXQgZWRpdGluZ0VsZW1lbnQ6IEFwcFN0YXRlW1wiZWRpdGluZ0VsZW1lbnRcIl0gfCBudWxsID0gbnVsbDtcbiAgICAgIGlmIChhY3Rpb25SZXN1bHQuZWxlbWVudHMpIHtcbiAgICAgICAgYWN0aW9uUmVzdWx0LmVsZW1lbnRzLmZvckVhY2goKGVsZW1lbnQpID0+IHtcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICB0aGlzLnN0YXRlLmVkaXRpbmdFbGVtZW50Py5pZCA9PT0gZWxlbWVudC5pZCAmJlxuICAgICAgICAgICAgdGhpcy5zdGF0ZS5lZGl0aW5nRWxlbWVudCAhPT0gZWxlbWVudCAmJlxuICAgICAgICAgICAgaXNOb25EZWxldGVkRWxlbWVudChlbGVtZW50KVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgZWRpdGluZ0VsZW1lbnQgPSBlbGVtZW50O1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuc2NlbmUucmVwbGFjZUFsbEVsZW1lbnRzKGFjdGlvblJlc3VsdC5lbGVtZW50cyk7XG4gICAgICAgIGlmIChhY3Rpb25SZXN1bHQuY29tbWl0VG9IaXN0b3J5KSB7XG4gICAgICAgICAgdGhpcy5oaXN0b3J5LnJlc3VtZVJlY29yZGluZygpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChhY3Rpb25SZXN1bHQuZmlsZXMpIHtcbiAgICAgICAgdGhpcy5maWxlcyA9IGFjdGlvblJlc3VsdC5yZXBsYWNlRmlsZXNcbiAgICAgICAgICA/IGFjdGlvblJlc3VsdC5maWxlc1xuICAgICAgICAgIDogeyAuLi50aGlzLmZpbGVzLCAuLi5hY3Rpb25SZXN1bHQuZmlsZXMgfTtcbiAgICAgICAgdGhpcy5hZGROZXdJbWFnZXNUb0ltYWdlQ2FjaGUoKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGFjdGlvblJlc3VsdC5hcHBTdGF0ZSB8fCBlZGl0aW5nRWxlbWVudCkge1xuICAgICAgICBpZiAoYWN0aW9uUmVzdWx0LmNvbW1pdFRvSGlzdG9yeSkge1xuICAgICAgICAgIHRoaXMuaGlzdG9yeS5yZXN1bWVSZWNvcmRpbmcoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCB2aWV3TW9kZUVuYWJsZWQgPSBhY3Rpb25SZXN1bHQ/LmFwcFN0YXRlPy52aWV3TW9kZUVuYWJsZWQgfHwgZmFsc2U7XG4gICAgICAgIGxldCB6ZW5Nb2RlRW5hYmxlZCA9IGFjdGlvblJlc3VsdD8uYXBwU3RhdGU/Lnplbk1vZGVFbmFibGVkIHx8IGZhbHNlO1xuICAgICAgICBsZXQgZ3JpZFNpemUgPSBhY3Rpb25SZXN1bHQ/LmFwcFN0YXRlPy5ncmlkU2l6ZSB8fCBudWxsO1xuICAgICAgICBsZXQgdGhlbWUgPSBhY3Rpb25SZXN1bHQ/LmFwcFN0YXRlPy50aGVtZSB8fCBUSEVNRS5MSUdIVDtcbiAgICAgICAgbGV0IG5hbWUgPSBhY3Rpb25SZXN1bHQ/LmFwcFN0YXRlPy5uYW1lID8/IHRoaXMuc3RhdGUubmFtZTtcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLnByb3BzLnZpZXdNb2RlRW5hYmxlZCAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICAgIHZpZXdNb2RlRW5hYmxlZCA9IHRoaXMucHJvcHMudmlld01vZGVFbmFibGVkO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLnByb3BzLnplbk1vZGVFbmFibGVkICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgICAgemVuTW9kZUVuYWJsZWQgPSB0aGlzLnByb3BzLnplbk1vZGVFbmFibGVkO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLnByb3BzLmdyaWRNb2RlRW5hYmxlZCAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICAgIGdyaWRTaXplID0gdGhpcy5wcm9wcy5ncmlkTW9kZUVuYWJsZWQgPyBHUklEX1NJWkUgOiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLnByb3BzLnRoZW1lICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgICAgdGhlbWUgPSB0aGlzLnByb3BzLnRoZW1lO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLnByb3BzLm5hbWUgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgICBuYW1lID0gdGhpcy5wcm9wcy5uYW1lO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoXG4gICAgICAgICAgKHN0YXRlKSA9PiB7XG4gICAgICAgICAgICAvLyB1c2luZyBPYmplY3QuYXNzaWduIGluc3RlYWQgb2Ygc3ByZWFkIHRvIGZvb2wgVFMgNC4yLjIrIGludG9cbiAgICAgICAgICAgIC8vIHJlZ2FyZGluZyB0aGUgcmVzdWx0aW5nIHR5cGUgYXMgbm90IGNvbnRhaW5pbmcgdW5kZWZpbmVkXG4gICAgICAgICAgICAvLyAod2hpY2ggdGhlIGZvbGxvd2luZyBleHByZXNzaW9uIHdpbGwgbmV2ZXIgY29udGFpbilcbiAgICAgICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKGFjdGlvblJlc3VsdC5hcHBTdGF0ZSB8fCB7fSwge1xuICAgICAgICAgICAgICBlZGl0aW5nRWxlbWVudDpcbiAgICAgICAgICAgICAgICBlZGl0aW5nRWxlbWVudCB8fCBhY3Rpb25SZXN1bHQuYXBwU3RhdGU/LmVkaXRpbmdFbGVtZW50IHx8IG51bGwsXG4gICAgICAgICAgICAgIHZpZXdNb2RlRW5hYmxlZCxcbiAgICAgICAgICAgICAgemVuTW9kZUVuYWJsZWQsXG4gICAgICAgICAgICAgIGdyaWRTaXplLFxuICAgICAgICAgICAgICB0aGVtZSxcbiAgICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgaWYgKGFjdGlvblJlc3VsdC5zeW5jSGlzdG9yeSkge1xuICAgICAgICAgICAgICB0aGlzLmhpc3Rvcnkuc2V0Q3VycmVudFN0YXRlKFxuICAgICAgICAgICAgICAgIHRoaXMuc3RhdGUsXG4gICAgICAgICAgICAgICAgdGhpcy5zY2VuZS5nZXRFbGVtZW50c0luY2x1ZGluZ0RlbGV0ZWQoKSxcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH0sXG4gICk7XG5cbiAgLy8gTGlmZWN5Y2xlXG5cbiAgcHJpdmF0ZSBvbkJsdXIgPSB3aXRoQmF0Y2hlZFVwZGF0ZXMoKCkgPT4ge1xuICAgIGlzSG9sZGluZ1NwYWNlID0gZmFsc2U7XG4gICAgdGhpcy5zZXRTdGF0ZSh7IGlzQmluZGluZ0VuYWJsZWQ6IHRydWUgfSk7XG4gIH0pO1xuXG4gIHByaXZhdGUgb25VbmxvYWQgPSAoKSA9PiB7XG4gICAgdGhpcy5vbkJsdXIoKTtcbiAgfTtcblxuICBwcml2YXRlIGRpc2FibGVFdmVudDogRXZlbnRMaXN0ZW5lciA9IChldmVudCkgPT4ge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gIH07XG5cbiAgcHJpdmF0ZSBvbkZvbnRMb2FkZWQgPSAoKSA9PiB7XG4gICAgdGhpcy5zY2VuZS5nZXRFbGVtZW50c0luY2x1ZGluZ0RlbGV0ZWQoKS5mb3JFYWNoKChlbGVtZW50KSA9PiB7XG4gICAgICBpZiAoaXNUZXh0RWxlbWVudChlbGVtZW50KSkge1xuICAgICAgICBpbnZhbGlkYXRlU2hhcGVGb3JFbGVtZW50KGVsZW1lbnQpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHRoaXMub25TY2VuZVVwZGF0ZWQoKTtcbiAgfTtcblxuICBwcml2YXRlIHJlc2V0SGlzdG9yeSA9ICgpID0+IHtcbiAgICB0aGlzLmhpc3RvcnkuY2xlYXIoKTtcbiAgfTtcblxuICAvKipcbiAgICogUmVzZXRzIHNjZW5lICYgaGlzdG9yeS5cbiAgICogISBEbyBub3QgdXNlIHRvIGNsZWFyIHNjZW5lIHVzZXIgYWN0aW9uICFcbiAgICovXG4gIHByaXZhdGUgcmVzZXRTY2VuZSA9IHdpdGhCYXRjaGVkVXBkYXRlcyhcbiAgICAob3B0cz86IHsgcmVzZXRMb2FkaW5nU3RhdGU6IGJvb2xlYW4gfSkgPT4ge1xuICAgICAgdGhpcy5zY2VuZS5yZXBsYWNlQWxsRWxlbWVudHMoW10pO1xuICAgICAgdGhpcy5zZXRTdGF0ZSgoc3RhdGUpID0+ICh7XG4gICAgICAgIC4uLmdldERlZmF1bHRBcHBTdGF0ZSgpLFxuICAgICAgICBpc0xvYWRpbmc6IG9wdHM/LnJlc2V0TG9hZGluZ1N0YXRlID8gZmFsc2UgOiBzdGF0ZS5pc0xvYWRpbmcsXG4gICAgICAgIHRoZW1lOiB0aGlzLnN0YXRlLnRoZW1lLFxuICAgICAgfSkpO1xuICAgICAgdGhpcy5yZXNldEhpc3RvcnkoKTtcbiAgICB9LFxuICApO1xuXG4gIHByaXZhdGUgaW5pdGlhbGl6ZVNjZW5lID0gYXN5bmMgKCkgPT4ge1xuICAgIGlmIChcImxhdW5jaFF1ZXVlXCIgaW4gd2luZG93ICYmIFwiTGF1bmNoUGFyYW1zXCIgaW4gd2luZG93KSB7XG4gICAgICAod2luZG93IGFzIGFueSkubGF1bmNoUXVldWUuc2V0Q29uc3VtZXIoXG4gICAgICAgIGFzeW5jIChsYXVuY2hQYXJhbXM6IHsgZmlsZXM6IGFueVtdIH0pID0+IHtcbiAgICAgICAgICBpZiAoIWxhdW5jaFBhcmFtcy5maWxlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgZmlsZUhhbmRsZSA9IGxhdW5jaFBhcmFtcy5maWxlc1swXTtcbiAgICAgICAgICBjb25zdCBibG9iOiBCbG9iID0gYXdhaXQgZmlsZUhhbmRsZS5nZXRGaWxlKCk7XG4gICAgICAgICAgdGhpcy5sb2FkRmlsZVRvQ2FudmFzKFxuICAgICAgICAgICAgbmV3IEZpbGUoW2Jsb2JdLCBibG9iLm5hbWUgfHwgXCJcIiwgeyB0eXBlOiBibG9iLnR5cGUgfSksXG4gICAgICAgICAgICBmaWxlSGFuZGxlLFxuICAgICAgICAgICk7XG4gICAgICAgIH0sXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5zdGF0ZS5pc0xvYWRpbmcpIHtcbiAgICAgIHRoaXMuc2V0U3RhdGUoeyBpc0xvYWRpbmc6IHRydWUgfSk7XG4gICAgfVxuICAgIGxldCBpbml0aWFsRGF0YSA9IG51bGw7XG4gICAgdHJ5IHtcbiAgICAgIGluaXRpYWxEYXRhID0gKGF3YWl0IHRoaXMucHJvcHMuaW5pdGlhbERhdGEpIHx8IG51bGw7XG4gICAgICBpZiAoaW5pdGlhbERhdGE/LmxpYnJhcnlJdGVtcykge1xuICAgICAgICB0aGlzLmxpYnJhcnlcbiAgICAgICAgICAudXBkYXRlTGlicmFyeSh7XG4gICAgICAgICAgICBsaWJyYXJ5SXRlbXM6IGluaXRpYWxEYXRhLmxpYnJhcnlJdGVtcyxcbiAgICAgICAgICAgIG1lcmdlOiB0cnVlLFxuICAgICAgICAgIH0pXG4gICAgICAgICAgLmNhdGNoKChlcnJvcikgPT4ge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XG4gICAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XG4gICAgICBpbml0aWFsRGF0YSA9IHtcbiAgICAgICAgYXBwU3RhdGU6IHtcbiAgICAgICAgICBlcnJvck1lc3NhZ2U6XG4gICAgICAgICAgICBlcnJvci5tZXNzYWdlIHx8XG4gICAgICAgICAgICBcIkVuY291bnRlcmVkIGFuIGVycm9yIGR1cmluZyBpbXBvcnRpbmcgb3IgcmVzdG9yaW5nIHNjZW5lIGRhdGFcIixcbiAgICAgICAgfSxcbiAgICAgIH07XG4gICAgfVxuICAgIGNvbnN0IHNjZW5lID0gcmVzdG9yZShpbml0aWFsRGF0YSwgbnVsbCwgbnVsbCk7XG4gICAgc2NlbmUuYXBwU3RhdGUgPSB7XG4gICAgICAuLi5zY2VuZS5hcHBTdGF0ZSxcbiAgICAgIC8vIHdlJ3JlIGZhbGxpbmcgYmFjayB0byBjdXJyZW50IChwcmUtaW5pdCkgc3RhdGUgd2hlbiBkZWNpZGluZ1xuICAgICAgLy8gd2hldGhlciB0byBvcGVuIHRoZSBsaWJyYXJ5LCB0byBoYW5kbGUgYSBjYXNlIHdoZXJlIHdlXG4gICAgICAvLyB1cGRhdGUgdGhlIHN0YXRlIG91dHNpZGUgb2YgaW5pdGlhbERhdGEgKGUuZy4gd2hlbiBsb2FkaW5nIHRoZSBhcHBcbiAgICAgIC8vIHdpdGggYSBsaWJyYXJ5IGluc3RhbGwgbGluaywgd2hpY2ggc2hvdWxkIGF1dG8tb3BlbiB0aGUgbGlicmFyeSlcbiAgICAgIGlzTGlicmFyeU9wZW46XG4gICAgICAgIGluaXRpYWxEYXRhPy5hcHBTdGF0ZT8uaXNMaWJyYXJ5T3BlbiB8fCB0aGlzLnN0YXRlLmlzTGlicmFyeU9wZW4sXG4gICAgICBhY3RpdmVUb29sOlxuICAgICAgICBzY2VuZS5hcHBTdGF0ZS5hY3RpdmVUb29sLnR5cGUgPT09IFwiaW1hZ2VcIlxuICAgICAgICAgID8geyAuLi5zY2VuZS5hcHBTdGF0ZS5hY3RpdmVUb29sLCB0eXBlOiBcInNlbGVjdGlvblwiIH1cbiAgICAgICAgICA6IHNjZW5lLmFwcFN0YXRlLmFjdGl2ZVRvb2wsXG4gICAgICBpc0xvYWRpbmc6IGZhbHNlLFxuICAgICAgdG9hc3Q6IHRoaXMuc3RhdGUudG9hc3QsXG4gICAgfTtcbiAgICBpZiAoaW5pdGlhbERhdGE/LnNjcm9sbFRvQ29udGVudCkge1xuICAgICAgc2NlbmUuYXBwU3RhdGUgPSB7XG4gICAgICAgIC4uLnNjZW5lLmFwcFN0YXRlLFxuICAgICAgICAuLi5jYWxjdWxhdGVTY3JvbGxDZW50ZXIoXG4gICAgICAgICAgc2NlbmUuZWxlbWVudHMsXG4gICAgICAgICAge1xuICAgICAgICAgICAgLi4uc2NlbmUuYXBwU3RhdGUsXG4gICAgICAgICAgICB3aWR0aDogdGhpcy5zdGF0ZS53aWR0aCxcbiAgICAgICAgICAgIGhlaWdodDogdGhpcy5zdGF0ZS5oZWlnaHQsXG4gICAgICAgICAgICBvZmZzZXRUb3A6IHRoaXMuc3RhdGUub2Zmc2V0VG9wLFxuICAgICAgICAgICAgb2Zmc2V0TGVmdDogdGhpcy5zdGF0ZS5vZmZzZXRMZWZ0LFxuICAgICAgICAgIH0sXG4gICAgICAgICAgbnVsbCxcbiAgICAgICAgKSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgdGhpcy5yZXNldEhpc3RvcnkoKTtcbiAgICB0aGlzLnN5bmNBY3Rpb25SZXN1bHQoe1xuICAgICAgLi4uc2NlbmUsXG4gICAgICBjb21taXRUb0hpc3Rvcnk6IHRydWUsXG4gICAgfSk7XG4gIH07XG5cbiAgcHJpdmF0ZSByZWZyZXNoRGV2aWNlU3RhdGUgPSAoY29udGFpbmVyOiBIVE1MRGl2RWxlbWVudCkgPT4ge1xuICAgIGNvbnN0IHsgd2lkdGgsIGhlaWdodCB9ID0gY29udGFpbmVyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIGNvbnN0IHNpZGViYXJCcmVha3BvaW50ID1cbiAgICAgIHRoaXMucHJvcHMuVUlPcHRpb25zLmRvY2tlZFNpZGViYXJCcmVha3BvaW50ICE9IG51bGxcbiAgICAgICAgPyB0aGlzLnByb3BzLlVJT3B0aW9ucy5kb2NrZWRTaWRlYmFyQnJlYWtwb2ludFxuICAgICAgICA6IE1RX1JJR0hUX1NJREVCQVJfTUlOX1dJRFRIO1xuICAgIHRoaXMuZGV2aWNlID0gdXBkYXRlT2JqZWN0KHRoaXMuZGV2aWNlLCB7XG4gICAgICBpc1NtU2NyZWVuOiB3aWR0aCA8IE1RX1NNX01BWF9XSURUSCxcbiAgICAgIGlzTW9iaWxlOlxuICAgICAgICB3aWR0aCA8IE1RX01BWF9XSURUSF9QT1JUUkFJVCB8fFxuICAgICAgICAoaGVpZ2h0IDwgTVFfTUFYX0hFSUdIVF9MQU5EU0NBUEUgJiYgd2lkdGggPCBNUV9NQVhfV0lEVEhfTEFORFNDQVBFKSxcbiAgICAgIGNhbkRldmljZUZpdFNpZGViYXI6IHdpZHRoID4gc2lkZWJhckJyZWFrcG9pbnQsXG4gICAgfSk7XG4gIH07XG5cbiAgcHVibGljIGFzeW5jIGNvbXBvbmVudERpZE1vdW50KCkge1xuICAgIHRoaXMudW5tb3VudGVkID0gZmFsc2U7XG4gICAgdGhpcy5leGNhbGlkcmF3Q29udGFpbmVyVmFsdWUuY29udGFpbmVyID1cbiAgICAgIHRoaXMuZXhjYWxpZHJhd0NvbnRhaW5lclJlZi5jdXJyZW50O1xuXG4gICAgaWYgKFxuICAgICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IEVOVi5URVNUIHx8XG4gICAgICBwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gRU5WLkRFVkVMT1BNRU5UXG4gICAgKSB7XG4gICAgICBjb25zdCBzZXRTdGF0ZSA9IHRoaXMuc2V0U3RhdGUuYmluZCh0aGlzKTtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHdpbmRvdy5oLCB7XG4gICAgICAgIHN0YXRlOiB7XG4gICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgIGdldDogKCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuc3RhdGU7XG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAgc2V0U3RhdGU6IHtcbiAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgdmFsdWU6ICguLi5hcmdzOiBQYXJhbWV0ZXJzPHR5cGVvZiBzZXRTdGF0ZT4pID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnNldFN0YXRlKC4uLmFyZ3MpO1xuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICAgIGFwcDoge1xuICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICB2YWx1ZTogdGhpcyxcbiAgICAgICAgfSxcbiAgICAgICAgaGlzdG9yeToge1xuICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICB2YWx1ZTogdGhpcy5oaXN0b3J5LFxuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgdGhpcy5zY2VuZS5hZGRDYWxsYmFjayh0aGlzLm9uU2NlbmVVcGRhdGVkKTtcbiAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXJzKCk7XG5cbiAgICBpZiAodGhpcy5leGNhbGlkcmF3Q29udGFpbmVyUmVmLmN1cnJlbnQpIHtcbiAgICAgIHRoaXMuZm9jdXNDb250YWluZXIoKTtcbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICB0aGlzLmV4Y2FsaWRyYXdDb250YWluZXJSZWYuY3VycmVudCAmJlxuICAgICAgLy8gYm91bmRpbmcgcmVjdHMgZG9uJ3Qgd29yayBpbiB0ZXN0cyBzbyB1cGRhdGluZ1xuICAgICAgLy8gdGhlIHN0YXRlIG9uIGluaXQgd291bGQgcmVzdWx0IGluIG1ha2luZyB0aGUgdGVzdCBlbnZpcm8gcnVuXG4gICAgICAvLyBpbiBtb2JpbGUgYnJlYWtwb2ludCAoMCB3aWR0aC9oZWlnaHQpLCBtYWtpbmcgZXZlcnl0aGluZyBmYWlsXG4gICAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJ0ZXN0XCJcbiAgICApIHtcbiAgICAgIHRoaXMucmVmcmVzaERldmljZVN0YXRlKHRoaXMuZXhjYWxpZHJhd0NvbnRhaW5lclJlZi5jdXJyZW50KTtcbiAgICB9XG5cbiAgICBpZiAoXCJSZXNpemVPYnNlcnZlclwiIGluIHdpbmRvdyAmJiB0aGlzLmV4Y2FsaWRyYXdDb250YWluZXJSZWY/LmN1cnJlbnQpIHtcbiAgICAgIHRoaXMucmVzaXplT2JzZXJ2ZXIgPSBuZXcgUmVzaXplT2JzZXJ2ZXIoKCkgPT4ge1xuICAgICAgICBUSFJPVFRMRV9ORVhUX1JFTkRFUiA9IGZhbHNlO1xuICAgICAgICAvLyByZWNvbXB1dGUgZGV2aWNlIGRpbWVuc2lvbnMgc3RhdGVcbiAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgICAgIHRoaXMucmVmcmVzaERldmljZVN0YXRlKHRoaXMuZXhjYWxpZHJhd0NvbnRhaW5lclJlZi5jdXJyZW50ISk7XG4gICAgICAgIC8vIHJlZnJlc2ggb2Zmc2V0c1xuICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAgICAgdGhpcy51cGRhdGVET01SZWN0KCk7XG4gICAgICB9KTtcbiAgICAgIHRoaXMucmVzaXplT2JzZXJ2ZXI/Lm9ic2VydmUodGhpcy5leGNhbGlkcmF3Q29udGFpbmVyUmVmLmN1cnJlbnQpO1xuICAgIH0gZWxzZSBpZiAod2luZG93Lm1hdGNoTWVkaWEpIHtcbiAgICAgIGNvbnN0IG1kU2NyZWVuUXVlcnkgPSB3aW5kb3cubWF0Y2hNZWRpYShcbiAgICAgICAgYChtYXgtd2lkdGg6ICR7TVFfTUFYX1dJRFRIX1BPUlRSQUlUfXB4KSwgKG1heC1oZWlnaHQ6ICR7TVFfTUFYX0hFSUdIVF9MQU5EU0NBUEV9cHgpIGFuZCAobWF4LXdpZHRoOiAke01RX01BWF9XSURUSF9MQU5EU0NBUEV9cHgpYCxcbiAgICAgICk7XG4gICAgICBjb25zdCBzbVNjcmVlblF1ZXJ5ID0gd2luZG93Lm1hdGNoTWVkaWEoXG4gICAgICAgIGAobWF4LXdpZHRoOiAke01RX1NNX01BWF9XSURUSH1weClgLFxuICAgICAgKTtcbiAgICAgIGNvbnN0IGNhbkRldmljZUZpdFNpZGViYXJNZWRpYVF1ZXJ5ID0gd2luZG93Lm1hdGNoTWVkaWEoXG4gICAgICAgIGAobWluLXdpZHRoOiAke1xuICAgICAgICAgIC8vIE5PVEUgdGhpcyB3b24ndCB1cGRhdGUgaWYgYSBkaWZmZXJlbnQgYnJlYWtwb2ludCBpcyBzdXBwbGllZFxuICAgICAgICAgIC8vIGFmdGVyIG1vdW50XG4gICAgICAgICAgdGhpcy5wcm9wcy5VSU9wdGlvbnMuZG9ja2VkU2lkZWJhckJyZWFrcG9pbnQgIT0gbnVsbFxuICAgICAgICAgICAgPyB0aGlzLnByb3BzLlVJT3B0aW9ucy5kb2NrZWRTaWRlYmFyQnJlYWtwb2ludFxuICAgICAgICAgICAgOiBNUV9SSUdIVF9TSURFQkFSX01JTl9XSURUSFxuICAgICAgICB9cHgpYCxcbiAgICAgICk7XG4gICAgICBjb25zdCBoYW5kbGVyID0gKCkgPT4ge1xuICAgICAgICB0aGlzLmV4Y2FsaWRyYXdDb250YWluZXJSZWYuY3VycmVudCEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgIHRoaXMuZGV2aWNlID0gdXBkYXRlT2JqZWN0KHRoaXMuZGV2aWNlLCB7XG4gICAgICAgICAgaXNTbVNjcmVlbjogc21TY3JlZW5RdWVyeS5tYXRjaGVzLFxuICAgICAgICAgIGlzTW9iaWxlOiBtZFNjcmVlblF1ZXJ5Lm1hdGNoZXMsXG4gICAgICAgICAgY2FuRGV2aWNlRml0U2lkZWJhcjogY2FuRGV2aWNlRml0U2lkZWJhck1lZGlhUXVlcnkubWF0Y2hlcyxcbiAgICAgICAgfSk7XG4gICAgICB9O1xuICAgICAgbWRTY3JlZW5RdWVyeS5hZGRMaXN0ZW5lcihoYW5kbGVyKTtcbiAgICAgIHRoaXMuZGV0YWNoSXNNb2JpbGVNcUhhbmRsZXIgPSAoKSA9PlxuICAgICAgICBtZFNjcmVlblF1ZXJ5LnJlbW92ZUxpc3RlbmVyKGhhbmRsZXIpO1xuICAgIH1cblxuICAgIGNvbnN0IHNlYXJjaFBhcmFtcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXMod2luZG93LmxvY2F0aW9uLnNlYXJjaC5zbGljZSgxKSk7XG5cbiAgICBpZiAoc2VhcmNoUGFyYW1zLmhhcyhcIndlYi1zaGFyZS10YXJnZXRcIikpIHtcbiAgICAgIC8vIE9idGFpbiBhIGZpbGUgdGhhdCB3YXMgc2hhcmVkIHZpYSB0aGUgV2ViIFNoYXJlIFRhcmdldCBBUEkuXG4gICAgICB0aGlzLnJlc3RvcmVGaWxlRnJvbVNoYXJlKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMudXBkYXRlRE9NUmVjdCh0aGlzLmluaXRpYWxpemVTY2VuZSk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGNvbXBvbmVudFdpbGxVbm1vdW50KCkge1xuICAgIHRoaXMuZmlsZXMgPSB7fTtcbiAgICB0aGlzLmltYWdlQ2FjaGUuY2xlYXIoKTtcbiAgICB0aGlzLnJlc2l6ZU9ic2VydmVyPy5kaXNjb25uZWN0KCk7XG4gICAgdGhpcy51bm1vdW50ZWQgPSB0cnVlO1xuICAgIHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcnMoKTtcbiAgICB0aGlzLnNjZW5lLmRlc3Ryb3koKTtcbiAgICBjbGVhclRpbWVvdXQodG91Y2hUaW1lb3V0KTtcbiAgICB0b3VjaFRpbWVvdXQgPSAwO1xuICB9XG5cbiAgcHJpdmF0ZSBvblJlc2l6ZSA9IHdpdGhCYXRjaGVkVXBkYXRlcygoKSA9PiB7XG4gICAgdGhpcy5zY2VuZVxuICAgICAgLmdldEVsZW1lbnRzSW5jbHVkaW5nRGVsZXRlZCgpXG4gICAgICAuZm9yRWFjaCgoZWxlbWVudCkgPT4gaW52YWxpZGF0ZVNoYXBlRm9yRWxlbWVudChlbGVtZW50KSk7XG4gICAgdGhpcy5zZXRTdGF0ZSh7fSk7XG4gIH0pO1xuXG4gIHByaXZhdGUgcmVtb3ZlRXZlbnRMaXN0ZW5lcnMoKSB7XG4gICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihFVkVOVC5QT0lOVEVSX1VQLCB0aGlzLnJlbW92ZVBvaW50ZXIpO1xuICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoRVZFTlQuQ09QWSwgdGhpcy5vbkNvcHkpO1xuICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoRVZFTlQuUEFTVEUsIHRoaXMucGFzdGVGcm9tQ2xpcGJvYXJkKTtcbiAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKEVWRU5ULkNVVCwgdGhpcy5vbkN1dCk7XG4gICAgdGhpcy5leGNhbGlkcmF3Q29udGFpbmVyUmVmLmN1cnJlbnQ/LnJlbW92ZUV2ZW50TGlzdGVuZXIoXG4gICAgICBFVkVOVC5XSEVFTCxcbiAgICAgIHRoaXMub25XaGVlbCxcbiAgICApO1xuICAgIHRoaXMubmVhcmVzdFNjcm9sbGFibGVDb250YWluZXI/LnJlbW92ZUV2ZW50TGlzdGVuZXIoXG4gICAgICBFVkVOVC5TQ1JPTEwsXG4gICAgICB0aGlzLm9uU2Nyb2xsLFxuICAgICk7XG4gICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihFVkVOVC5LRVlET1dOLCB0aGlzLm9uS2V5RG93biwgZmFsc2UpO1xuICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXG4gICAgICBFVkVOVC5NT1VTRV9NT1ZFLFxuICAgICAgdGhpcy51cGRhdGVDdXJyZW50Q3Vyc29yUG9zaXRpb24sXG4gICAgICBmYWxzZSxcbiAgICApO1xuICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoRVZFTlQuS0VZVVAsIHRoaXMub25LZXlVcCk7XG4gICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoRVZFTlQuUkVTSVpFLCB0aGlzLm9uUmVzaXplLCBmYWxzZSk7XG4gICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoRVZFTlQuVU5MT0FELCB0aGlzLm9uVW5sb2FkLCBmYWxzZSk7XG4gICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoRVZFTlQuQkxVUiwgdGhpcy5vbkJsdXIsIGZhbHNlKTtcbiAgICB0aGlzLmV4Y2FsaWRyYXdDb250YWluZXJSZWYuY3VycmVudD8ucmVtb3ZlRXZlbnRMaXN0ZW5lcihcbiAgICAgIEVWRU5ULkRSQUdfT1ZFUixcbiAgICAgIHRoaXMuZGlzYWJsZUV2ZW50LFxuICAgICAgZmFsc2UsXG4gICAgKTtcbiAgICB0aGlzLmV4Y2FsaWRyYXdDb250YWluZXJSZWYuY3VycmVudD8ucmVtb3ZlRXZlbnRMaXN0ZW5lcihcbiAgICAgIEVWRU5ULkRST1AsXG4gICAgICB0aGlzLmRpc2FibGVFdmVudCxcbiAgICAgIGZhbHNlLFxuICAgICk7XG5cbiAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFxuICAgICAgRVZFTlQuR0VTVFVSRV9TVEFSVCxcbiAgICAgIHRoaXMub25HZXN0dXJlU3RhcnQgYXMgYW55LFxuICAgICAgZmFsc2UsXG4gICAgKTtcbiAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFxuICAgICAgRVZFTlQuR0VTVFVSRV9DSEFOR0UsXG4gICAgICB0aGlzLm9uR2VzdHVyZUNoYW5nZSBhcyBhbnksXG4gICAgICBmYWxzZSxcbiAgICApO1xuICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXG4gICAgICBFVkVOVC5HRVNUVVJFX0VORCxcbiAgICAgIHRoaXMub25HZXN0dXJlRW5kIGFzIGFueSxcbiAgICAgIGZhbHNlLFxuICAgICk7XG5cbiAgICB0aGlzLmRldGFjaElzTW9iaWxlTXFIYW5kbGVyPy4oKTtcbiAgfVxuXG4gIHByaXZhdGUgYWRkRXZlbnRMaXN0ZW5lcnMoKSB7XG4gICAgdGhpcy5yZW1vdmVFdmVudExpc3RlbmVycygpO1xuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoRVZFTlQuUE9JTlRFUl9VUCwgdGhpcy5yZW1vdmVQb2ludGVyKTsgLy8gIzM1NTNcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKEVWRU5ULkNPUFksIHRoaXMub25Db3B5KTtcbiAgICB0aGlzLmV4Y2FsaWRyYXdDb250YWluZXJSZWYuY3VycmVudD8uYWRkRXZlbnRMaXN0ZW5lcihcbiAgICAgIEVWRU5ULldIRUVMLFxuICAgICAgdGhpcy5vbldoZWVsLFxuICAgICAgeyBwYXNzaXZlOiBmYWxzZSB9LFxuICAgICk7XG5cbiAgICBpZiAodGhpcy5wcm9wcy5oYW5kbGVLZXlib2FyZEdsb2JhbGx5KSB7XG4gICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKEVWRU5ULktFWURPV04sIHRoaXMub25LZXlEb3duLCBmYWxzZSk7XG4gICAgfVxuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoRVZFTlQuS0VZVVAsIHRoaXMub25LZXlVcCwgeyBwYXNzaXZlOiB0cnVlIH0pO1xuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXG4gICAgICBFVkVOVC5NT1VTRV9NT1ZFLFxuICAgICAgdGhpcy51cGRhdGVDdXJyZW50Q3Vyc29yUG9zaXRpb24sXG4gICAgKTtcbiAgICAvLyByZXJlbmRlciB0ZXh0IGVsZW1lbnRzIG9uIGZvbnQgbG9hZCB0byBmaXggIzYzNyAmJiAjMTU1M1xuICAgIGRvY3VtZW50LmZvbnRzPy5hZGRFdmVudExpc3RlbmVyPy4oXCJsb2FkaW5nZG9uZVwiLCB0aGlzLm9uRm9udExvYWRlZCk7XG4gICAgLy8gU2FmYXJpLW9ubHkgZGVza3RvcCBwaW5jaCB6b29tXG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcbiAgICAgIEVWRU5ULkdFU1RVUkVfU1RBUlQsXG4gICAgICB0aGlzLm9uR2VzdHVyZVN0YXJ0IGFzIGFueSxcbiAgICAgIGZhbHNlLFxuICAgICk7XG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcbiAgICAgIEVWRU5ULkdFU1RVUkVfQ0hBTkdFLFxuICAgICAgdGhpcy5vbkdlc3R1cmVDaGFuZ2UgYXMgYW55LFxuICAgICAgZmFsc2UsXG4gICAgKTtcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFxuICAgICAgRVZFTlQuR0VTVFVSRV9FTkQsXG4gICAgICB0aGlzLm9uR2VzdHVyZUVuZCBhcyBhbnksXG4gICAgICBmYWxzZSxcbiAgICApO1xuICAgIGlmICh0aGlzLnN0YXRlLnZpZXdNb2RlRW5hYmxlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoRVZFTlQuUEFTVEUsIHRoaXMucGFzdGVGcm9tQ2xpcGJvYXJkKTtcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKEVWRU5ULkNVVCwgdGhpcy5vbkN1dCk7XG4gICAgaWYgKHRoaXMucHJvcHMuZGV0ZWN0U2Nyb2xsKSB7XG4gICAgICB0aGlzLm5lYXJlc3RTY3JvbGxhYmxlQ29udGFpbmVyID0gZ2V0TmVhcmVzdFNjcm9sbGFibGVDb250YWluZXIoXG4gICAgICAgIHRoaXMuZXhjYWxpZHJhd0NvbnRhaW5lclJlZi5jdXJyZW50ISxcbiAgICAgICk7XG4gICAgICB0aGlzLm5lYXJlc3RTY3JvbGxhYmxlQ29udGFpbmVyLmFkZEV2ZW50TGlzdGVuZXIoXG4gICAgICAgIEVWRU5ULlNDUk9MTCxcbiAgICAgICAgdGhpcy5vblNjcm9sbCxcbiAgICAgICk7XG4gICAgfVxuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKEVWRU5ULlJFU0laRSwgdGhpcy5vblJlc2l6ZSwgZmFsc2UpO1xuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKEVWRU5ULlVOTE9BRCwgdGhpcy5vblVubG9hZCwgZmFsc2UpO1xuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKEVWRU5ULkJMVVIsIHRoaXMub25CbHVyLCBmYWxzZSk7XG4gICAgdGhpcy5leGNhbGlkcmF3Q29udGFpbmVyUmVmLmN1cnJlbnQ/LmFkZEV2ZW50TGlzdGVuZXIoXG4gICAgICBFVkVOVC5EUkFHX09WRVIsXG4gICAgICB0aGlzLmRpc2FibGVFdmVudCxcbiAgICAgIGZhbHNlLFxuICAgICk7XG4gICAgdGhpcy5leGNhbGlkcmF3Q29udGFpbmVyUmVmLmN1cnJlbnQ/LmFkZEV2ZW50TGlzdGVuZXIoXG4gICAgICBFVkVOVC5EUk9QLFxuICAgICAgdGhpcy5kaXNhYmxlRXZlbnQsXG4gICAgICBmYWxzZSxcbiAgICApO1xuICB9XG5cbiAgY29tcG9uZW50RGlkVXBkYXRlKHByZXZQcm9wczogQXBwUHJvcHMsIHByZXZTdGF0ZTogQXBwU3RhdGUpIHtcbiAgICBpZiAoXG4gICAgICB0aGlzLmV4Y2FsaWRyYXdDb250YWluZXJSZWYuY3VycmVudCAmJlxuICAgICAgcHJldlByb3BzLlVJT3B0aW9ucy5kb2NrZWRTaWRlYmFyQnJlYWtwb2ludCAhPT1cbiAgICAgICAgdGhpcy5wcm9wcy5VSU9wdGlvbnMuZG9ja2VkU2lkZWJhckJyZWFrcG9pbnRcbiAgICApIHtcbiAgICAgIHRoaXMucmVmcmVzaERldmljZVN0YXRlKHRoaXMuZXhjYWxpZHJhd0NvbnRhaW5lclJlZi5jdXJyZW50KTtcbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICBwcmV2U3RhdGUuc2Nyb2xsWCAhPT0gdGhpcy5zdGF0ZS5zY3JvbGxYIHx8XG4gICAgICBwcmV2U3RhdGUuc2Nyb2xsWSAhPT0gdGhpcy5zdGF0ZS5zY3JvbGxZXG4gICAgKSB7XG4gICAgICB0aGlzLnByb3BzPy5vblNjcm9sbENoYW5nZT8uKHRoaXMuc3RhdGUuc2Nyb2xsWCwgdGhpcy5zdGF0ZS5zY3JvbGxZKTtcbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICBPYmplY3Qua2V5cyh0aGlzLnN0YXRlLnNlbGVjdGVkRWxlbWVudElkcykubGVuZ3RoICYmXG4gICAgICBpc0VyYXNlckFjdGl2ZSh0aGlzLnN0YXRlKVxuICAgICkge1xuICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgIGFjdGl2ZVRvb2w6IHVwZGF0ZUFjdGl2ZVRvb2wodGhpcy5zdGF0ZSwgeyB0eXBlOiBcInNlbGVjdGlvblwiIH0pLFxuICAgICAgfSk7XG4gICAgfVxuICAgIGlmIChcbiAgICAgIHRoaXMuc3RhdGUuYWN0aXZlVG9vbC50eXBlID09PSBcImVyYXNlclwiICYmXG4gICAgICBwcmV2U3RhdGUudGhlbWUgIT09IHRoaXMuc3RhdGUudGhlbWVcbiAgICApIHtcbiAgICAgIHNldEVyYXNlckN1cnNvcih0aGlzLmNhbnZhcywgdGhpcy5zdGF0ZS50aGVtZSk7XG4gICAgfVxuICAgIC8vIEhpZGUgaHlwZXJsaW5rIHBvcHVwIGlmIHNob3duIHdoZW4gZWxlbWVudCB0eXBlIGlzIG5vdCBzZWxlY3Rpb25cbiAgICBpZiAoXG4gICAgICBwcmV2U3RhdGUuYWN0aXZlVG9vbC50eXBlID09PSBcInNlbGVjdGlvblwiICYmXG4gICAgICB0aGlzLnN0YXRlLmFjdGl2ZVRvb2wudHlwZSAhPT0gXCJzZWxlY3Rpb25cIiAmJlxuICAgICAgdGhpcy5zdGF0ZS5zaG93SHlwZXJsaW5rUG9wdXBcbiAgICApIHtcbiAgICAgIHRoaXMuc2V0U3RhdGUoeyBzaG93SHlwZXJsaW5rUG9wdXA6IGZhbHNlIH0pO1xuICAgIH1cbiAgICBpZiAocHJldlByb3BzLmxhbmdDb2RlICE9PSB0aGlzLnByb3BzLmxhbmdDb2RlKSB7XG4gICAgICB0aGlzLnVwZGF0ZUxhbmd1YWdlKCk7XG4gICAgfVxuXG4gICAgaWYgKHByZXZQcm9wcy52aWV3TW9kZUVuYWJsZWQgIT09IHRoaXMucHJvcHMudmlld01vZGVFbmFibGVkKSB7XG4gICAgICB0aGlzLnNldFN0YXRlKHsgdmlld01vZGVFbmFibGVkOiAhIXRoaXMucHJvcHMudmlld01vZGVFbmFibGVkIH0pO1xuICAgIH1cblxuICAgIGlmIChwcmV2U3RhdGUudmlld01vZGVFbmFibGVkICE9PSB0aGlzLnN0YXRlLnZpZXdNb2RlRW5hYmxlZCkge1xuICAgICAgdGhpcy5hZGRFdmVudExpc3RlbmVycygpO1xuICAgICAgdGhpcy5kZXNlbGVjdEVsZW1lbnRzKCk7XG4gICAgfVxuXG4gICAgaWYgKHByZXZQcm9wcy56ZW5Nb2RlRW5hYmxlZCAhPT0gdGhpcy5wcm9wcy56ZW5Nb2RlRW5hYmxlZCkge1xuICAgICAgdGhpcy5zZXRTdGF0ZSh7IHplbk1vZGVFbmFibGVkOiAhIXRoaXMucHJvcHMuemVuTW9kZUVuYWJsZWQgfSk7XG4gICAgfVxuXG4gICAgaWYgKHByZXZQcm9wcy50aGVtZSAhPT0gdGhpcy5wcm9wcy50aGVtZSAmJiB0aGlzLnByb3BzLnRoZW1lKSB7XG4gICAgICB0aGlzLnNldFN0YXRlKHsgdGhlbWU6IHRoaXMucHJvcHMudGhlbWUgfSk7XG4gICAgfVxuXG4gICAgaWYgKHByZXZQcm9wcy5ncmlkTW9kZUVuYWJsZWQgIT09IHRoaXMucHJvcHMuZ3JpZE1vZGVFbmFibGVkKSB7XG4gICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgZ3JpZFNpemU6IHRoaXMucHJvcHMuZ3JpZE1vZGVFbmFibGVkID8gR1JJRF9TSVpFIDogbnVsbCxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnByb3BzLm5hbWUgJiYgcHJldlByb3BzLm5hbWUgIT09IHRoaXMucHJvcHMubmFtZSkge1xuICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgIG5hbWU6IHRoaXMucHJvcHMubmFtZSxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHRoaXMuZXhjYWxpZHJhd0NvbnRhaW5lclJlZi5jdXJyZW50Py5jbGFzc0xpc3QudG9nZ2xlKFxuICAgICAgXCJ0aGVtZS0tZGFya1wiLFxuICAgICAgdGhpcy5zdGF0ZS50aGVtZSA9PT0gXCJkYXJrXCIsXG4gICAgKTtcblxuICAgIGlmIChcbiAgICAgIHRoaXMuc3RhdGUuZWRpdGluZ0xpbmVhckVsZW1lbnQgJiZcbiAgICAgICF0aGlzLnN0YXRlLnNlbGVjdGVkRWxlbWVudElkc1t0aGlzLnN0YXRlLmVkaXRpbmdMaW5lYXJFbGVtZW50LmVsZW1lbnRJZF1cbiAgICApIHtcbiAgICAgIC8vIGRlZmVyIHNvIHRoYXQgdGhlIGNvbW1pdFRvSGlzdG9yeSBmbGFnIGlzbid0IHJlc2V0IHZpYSBjdXJyZW50IHVwZGF0ZVxuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHRoaXMuYWN0aW9uTWFuYWdlci5leGVjdXRlQWN0aW9uKGFjdGlvbkZpbmFsaXplKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICBjb25zdCB7IG11bHRpRWxlbWVudCB9ID0gcHJldlN0YXRlO1xuICAgIGlmIChcbiAgICAgIHByZXZTdGF0ZS5hY3RpdmVUb29sICE9PSB0aGlzLnN0YXRlLmFjdGl2ZVRvb2wgJiZcbiAgICAgIG11bHRpRWxlbWVudCAhPSBudWxsICYmXG4gICAgICBpc0JpbmRpbmdFbmFibGVkKHRoaXMuc3RhdGUpICYmXG4gICAgICBpc0JpbmRpbmdFbGVtZW50KG11bHRpRWxlbWVudCwgZmFsc2UpXG4gICAgKSB7XG4gICAgICBtYXliZUJpbmRMaW5lYXJFbGVtZW50KFxuICAgICAgICBtdWx0aUVsZW1lbnQsXG4gICAgICAgIHRoaXMuc3RhdGUsXG4gICAgICAgIHRoaXMuc2NlbmUsXG4gICAgICAgIHR1cGxlVG9Db29ycyhcbiAgICAgICAgICBMaW5lYXJFbGVtZW50RWRpdG9yLmdldFBvaW50QXRJbmRleEdsb2JhbENvb3JkaW5hdGVzKFxuICAgICAgICAgICAgbXVsdGlFbGVtZW50LFxuICAgICAgICAgICAgLTEsXG4gICAgICAgICAgKSxcbiAgICAgICAgKSxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgY29uc3QgY3Vyc29yQnV0dG9uOiB7XG4gICAgICBbaWQ6IHN0cmluZ106IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICB9ID0ge307XG4gICAgY29uc3QgcG9pbnRlclZpZXdwb3J0Q29vcmRzOiBSZW5kZXJDb25maWdbXCJyZW1vdGVQb2ludGVyVmlld3BvcnRDb29yZHNcIl0gPVxuICAgICAge307XG4gICAgY29uc3QgcmVtb3RlU2VsZWN0ZWRFbGVtZW50SWRzOiBSZW5kZXJDb25maWdbXCJyZW1vdGVTZWxlY3RlZEVsZW1lbnRJZHNcIl0gPVxuICAgICAge307XG4gICAgY29uc3QgcG9pbnRlclVzZXJuYW1lczogeyBbaWQ6IHN0cmluZ106IHN0cmluZyB9ID0ge307XG4gICAgY29uc3QgcG9pbnRlclVzZXJTdGF0ZXM6IHsgW2lkOiBzdHJpbmddOiBzdHJpbmcgfSA9IHt9O1xuICAgIHRoaXMuc3RhdGUuY29sbGFib3JhdG9ycy5mb3JFYWNoKCh1c2VyLCBzb2NrZXRJZCkgPT4ge1xuICAgICAgaWYgKHVzZXIuc2VsZWN0ZWRFbGVtZW50SWRzKSB7XG4gICAgICAgIGZvciAoY29uc3QgaWQgb2YgT2JqZWN0LmtleXModXNlci5zZWxlY3RlZEVsZW1lbnRJZHMpKSB7XG4gICAgICAgICAgaWYgKCEoaWQgaW4gcmVtb3RlU2VsZWN0ZWRFbGVtZW50SWRzKSkge1xuICAgICAgICAgICAgcmVtb3RlU2VsZWN0ZWRFbGVtZW50SWRzW2lkXSA9IFtdO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZW1vdGVTZWxlY3RlZEVsZW1lbnRJZHNbaWRdLnB1c2goc29ja2V0SWQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoIXVzZXIucG9pbnRlcikge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAodXNlci51c2VybmFtZSkge1xuICAgICAgICBwb2ludGVyVXNlcm5hbWVzW3NvY2tldElkXSA9IHVzZXIudXNlcm5hbWU7XG4gICAgICB9XG4gICAgICBpZiAodXNlci51c2VyU3RhdGUpIHtcbiAgICAgICAgcG9pbnRlclVzZXJTdGF0ZXNbc29ja2V0SWRdID0gdXNlci51c2VyU3RhdGU7XG4gICAgICB9XG4gICAgICBwb2ludGVyVmlld3BvcnRDb29yZHNbc29ja2V0SWRdID0gc2NlbmVDb29yZHNUb1ZpZXdwb3J0Q29vcmRzKFxuICAgICAgICB7XG4gICAgICAgICAgc2NlbmVYOiB1c2VyLnBvaW50ZXIueCxcbiAgICAgICAgICBzY2VuZVk6IHVzZXIucG9pbnRlci55LFxuICAgICAgICB9LFxuICAgICAgICB0aGlzLnN0YXRlLFxuICAgICAgKTtcbiAgICAgIGN1cnNvckJ1dHRvbltzb2NrZXRJZF0gPSB1c2VyLmJ1dHRvbjtcbiAgICB9KTtcbiAgICBjb25zdCByZW5kZXJpbmdFbGVtZW50cyA9IHRoaXMuc2NlbmVcbiAgICAgIC5nZXROb25EZWxldGVkRWxlbWVudHMoKVxuICAgICAgLmZpbHRlcigoZWxlbWVudCkgPT4ge1xuICAgICAgICBpZiAoaXNJbWFnZUVsZW1lbnQoZWxlbWVudCkpIHtcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAvLyBub3QgcGxhY2VkIG9uIGNhbnZhcyB5ZXQgKGJ1dCBpbiBlbGVtZW50cyBhcnJheSlcbiAgICAgICAgICAgIHRoaXMuc3RhdGUucGVuZGluZ0ltYWdlRWxlbWVudElkID09PSBlbGVtZW50LmlkXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIGRvbid0IHJlbmRlciB0ZXh0IGVsZW1lbnQgdGhhdCdzIGJlaW5nIGN1cnJlbnRseSBlZGl0ZWQgKGl0J3NcbiAgICAgICAgLy8gcmVuZGVyZWQgb24gcmVtb3RlIG9ubHkpXG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgIXRoaXMuc3RhdGUuZWRpdGluZ0VsZW1lbnQgfHxcbiAgICAgICAgICB0aGlzLnN0YXRlLmVkaXRpbmdFbGVtZW50LnR5cGUgIT09IFwidGV4dFwiIHx8XG4gICAgICAgICAgZWxlbWVudC5pZCAhPT0gdGhpcy5zdGF0ZS5lZGl0aW5nRWxlbWVudC5pZFxuICAgICAgICApO1xuICAgICAgfSk7XG5cbiAgICByZW5kZXJTY2VuZShcbiAgICAgIHJlbmRlcmluZ0VsZW1lbnRzLFxuICAgICAgdGhpcy5zdGF0ZSxcbiAgICAgIHRoaXMuc3RhdGUuc2VsZWN0aW9uRWxlbWVudCxcbiAgICAgIHdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvLFxuICAgICAgdGhpcy5yYyEsXG4gICAgICB0aGlzLmNhbnZhcyEsXG4gICAgICB7XG4gICAgICAgIHNjcm9sbFg6IHRoaXMuc3RhdGUuc2Nyb2xsWCxcbiAgICAgICAgc2Nyb2xsWTogdGhpcy5zdGF0ZS5zY3JvbGxZLFxuICAgICAgICB2aWV3QmFja2dyb3VuZENvbG9yOiB0aGlzLnN0YXRlLnZpZXdCYWNrZ3JvdW5kQ29sb3IsXG4gICAgICAgIHpvb206IHRoaXMuc3RhdGUuem9vbSxcbiAgICAgICAgcmVtb3RlUG9pbnRlclZpZXdwb3J0Q29vcmRzOiBwb2ludGVyVmlld3BvcnRDb29yZHMsXG4gICAgICAgIHJlbW90ZVBvaW50ZXJCdXR0b246IGN1cnNvckJ1dHRvbixcbiAgICAgICAgcmVtb3RlU2VsZWN0ZWRFbGVtZW50SWRzLFxuICAgICAgICByZW1vdGVQb2ludGVyVXNlcm5hbWVzOiBwb2ludGVyVXNlcm5hbWVzLFxuICAgICAgICByZW1vdGVQb2ludGVyVXNlclN0YXRlczogcG9pbnRlclVzZXJTdGF0ZXMsXG4gICAgICAgIHNob3VsZENhY2hlSWdub3JlWm9vbTogdGhpcy5zdGF0ZS5zaG91bGRDYWNoZUlnbm9yZVpvb20sXG4gICAgICAgIHRoZW1lOiB0aGlzLnN0YXRlLnRoZW1lLFxuICAgICAgICBpbWFnZUNhY2hlOiB0aGlzLmltYWdlQ2FjaGUsXG4gICAgICAgIGlzRXhwb3J0aW5nOiBmYWxzZSxcbiAgICAgICAgcmVuZGVyU2Nyb2xsYmFyczogIXRoaXMuZGV2aWNlLmlzTW9iaWxlLFxuICAgICAgfSxcbiAgICAgICh7IGF0TGVhc3RPbmVWaXNpYmxlRWxlbWVudCwgc2Nyb2xsQmFycyB9KSA9PiB7XG4gICAgICAgIGlmIChzY3JvbGxCYXJzKSB7XG4gICAgICAgICAgY3VycmVudFNjcm9sbEJhcnMgPSBzY3JvbGxCYXJzO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHNjcm9sbGVkT3V0c2lkZSA9XG4gICAgICAgICAgLy8gaGlkZSB3aGVuIGVkaXRpbmcgdGV4dFxuICAgICAgICAgIGlzVGV4dEVsZW1lbnQodGhpcy5zdGF0ZS5lZGl0aW5nRWxlbWVudClcbiAgICAgICAgICAgID8gZmFsc2VcbiAgICAgICAgICAgIDogIWF0TGVhc3RPbmVWaXNpYmxlRWxlbWVudCAmJiByZW5kZXJpbmdFbGVtZW50cy5sZW5ndGggPiAwO1xuICAgICAgICBpZiAodGhpcy5zdGF0ZS5zY3JvbGxlZE91dHNpZGUgIT09IHNjcm9sbGVkT3V0c2lkZSkge1xuICAgICAgICAgIHRoaXMuc2V0U3RhdGUoeyBzY3JvbGxlZE91dHNpZGUgfSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnNjaGVkdWxlSW1hZ2VSZWZyZXNoKCk7XG4gICAgICB9LFxuICAgICAgVEhST1RUTEVfTkVYVF9SRU5ERVIgJiYgd2luZG93LkVYQ0FMSURSQVdfVEhST1RUTEVfUkVOREVSID09PSB0cnVlLFxuICAgICk7XG5cbiAgICBpZiAoIVRIUk9UVExFX05FWFRfUkVOREVSKSB7XG4gICAgICBUSFJPVFRMRV9ORVhUX1JFTkRFUiA9IHRydWU7XG4gICAgfVxuXG4gICAgdGhpcy5oaXN0b3J5LnJlY29yZCh0aGlzLnN0YXRlLCB0aGlzLnNjZW5lLmdldEVsZW1lbnRzSW5jbHVkaW5nRGVsZXRlZCgpKTtcblxuICAgIC8vIERvIG5vdCBub3RpZnkgY29uc3VtZXJzIGlmIHdlJ3JlIHN0aWxsIGxvYWRpbmcgdGhlIHNjZW5lLiBBbW9uZyBvdGhlclxuICAgIC8vIHBvdGVudGlhbCBpc3N1ZXMsIHRoaXMgZml4ZXMgYSBjYXNlIHdoZXJlIHRoZSB0YWIgaXNuJ3QgZm9jdXNlZCBkdXJpbmdcbiAgICAvLyBpbml0LCB3aGljaCB3b3VsZCB0cmlnZ2VyIG9uQ2hhbmdlIHdpdGggZW1wdHkgZWxlbWVudHMsIHdoaWNoIHdvdWxkIHRoZW5cbiAgICAvLyBvdmVycmlkZSB3aGF0ZXZlciBpcyBpbiBsb2NhbFN0b3JhZ2UgY3VycmVudGx5LlxuICAgIGlmICghdGhpcy5zdGF0ZS5pc0xvYWRpbmcpIHtcbiAgICAgIHRoaXMucHJvcHMub25DaGFuZ2U/LihcbiAgICAgICAgdGhpcy5zY2VuZS5nZXRFbGVtZW50c0luY2x1ZGluZ0RlbGV0ZWQoKSxcbiAgICAgICAgdGhpcy5zdGF0ZSxcbiAgICAgICAgdGhpcy5maWxlcyxcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBvblNjcm9sbCA9IGRlYm91bmNlKCgpID0+IHtcbiAgICBjb25zdCB7IG9mZnNldFRvcCwgb2Zmc2V0TGVmdCB9ID0gdGhpcy5nZXRDYW52YXNPZmZzZXRzKCk7XG4gICAgdGhpcy5zZXRTdGF0ZSgoc3RhdGUpID0+IHtcbiAgICAgIGlmIChzdGF0ZS5vZmZzZXRMZWZ0ID09PSBvZmZzZXRMZWZ0ICYmIHN0YXRlLm9mZnNldFRvcCA9PT0gb2Zmc2V0VG9wKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHsgb2Zmc2V0VG9wLCBvZmZzZXRMZWZ0IH07XG4gICAgfSk7XG4gIH0sIFNDUk9MTF9USU1FT1VUKTtcblxuICAvLyBDb3B5L3Bhc3RlXG5cbiAgcHJpdmF0ZSBvbkN1dCA9IHdpdGhCYXRjaGVkVXBkYXRlcygoZXZlbnQ6IENsaXBib2FyZEV2ZW50KSA9PiB7XG4gICAgY29uc3QgaXNFeGNhbGlkcmF3QWN0aXZlID0gdGhpcy5leGNhbGlkcmF3Q29udGFpbmVyUmVmLmN1cnJlbnQ/LmNvbnRhaW5zKFxuICAgICAgZG9jdW1lbnQuYWN0aXZlRWxlbWVudCxcbiAgICApO1xuICAgIGlmICghaXNFeGNhbGlkcmF3QWN0aXZlIHx8IGlzV3JpdGFibGVFbGVtZW50KGV2ZW50LnRhcmdldCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5jdXRBbGwoKTtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICB9KTtcblxuICBwcml2YXRlIG9uQ29weSA9IHdpdGhCYXRjaGVkVXBkYXRlcygoZXZlbnQ6IENsaXBib2FyZEV2ZW50KSA9PiB7XG4gICAgY29uc3QgaXNFeGNhbGlkcmF3QWN0aXZlID0gdGhpcy5leGNhbGlkcmF3Q29udGFpbmVyUmVmLmN1cnJlbnQ/LmNvbnRhaW5zKFxuICAgICAgZG9jdW1lbnQuYWN0aXZlRWxlbWVudCxcbiAgICApO1xuICAgIGlmICghaXNFeGNhbGlkcmF3QWN0aXZlIHx8IGlzV3JpdGFibGVFbGVtZW50KGV2ZW50LnRhcmdldCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5jb3B5QWxsKCk7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgfSk7XG5cbiAgcHJpdmF0ZSBjdXRBbGwgPSAoKSA9PiB7XG4gICAgdGhpcy5hY3Rpb25NYW5hZ2VyLmV4ZWN1dGVBY3Rpb24oYWN0aW9uQ3V0LCBcImtleWJvYXJkXCIpO1xuICB9O1xuXG4gIHByaXZhdGUgY29weUFsbCA9ICgpID0+IHtcbiAgICB0aGlzLmFjdGlvbk1hbmFnZXIuZXhlY3V0ZUFjdGlvbihhY3Rpb25Db3B5LCBcImtleWJvYXJkXCIpO1xuICB9O1xuXG4gIHByaXZhdGUgc3RhdGljIHJlc2V0VGFwVHdpY2UoKSB7XG4gICAgZGlkVGFwVHdpY2UgPSBmYWxzZTtcbiAgfVxuXG4gIHByaXZhdGUgb25UYXBTdGFydCA9IChldmVudDogVG91Y2hFdmVudCkgPT4ge1xuICAgIC8vIGZpeCBmb3IgQXBwbGUgUGVuY2lsIFNjcmliYmxlXG4gICAgLy8gT24gQW5kcm9pZCwgcHJldmVudGluZyB0aGUgZXZlbnQgd291bGQgZGlzYWJsZSBjb250ZXh0TWVudSBvbiB0YXAtaG9sZFxuICAgIGlmICghaXNBbmRyb2lkKSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH1cblxuICAgIGlmICghZGlkVGFwVHdpY2UpIHtcbiAgICAgIGRpZFRhcFR3aWNlID0gdHJ1ZTtcbiAgICAgIGNsZWFyVGltZW91dCh0YXBwZWRUd2ljZVRpbWVyKTtcbiAgICAgIHRhcHBlZFR3aWNlVGltZXIgPSB3aW5kb3cuc2V0VGltZW91dChcbiAgICAgICAgQXBwLnJlc2V0VGFwVHdpY2UsXG4gICAgICAgIFRBUF9UV0lDRV9USU1FT1VULFxuICAgICAgKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8gaW5zZXJ0IHRleHQgb25seSBpZiB3ZSB0YXBwZWQgdHdpY2Ugd2l0aCBhIHNpbmdsZSBmaW5nZXJcbiAgICAvLyBldmVudC50b3VjaGVzLmxlbmd0aCA9PT0gMSB3aWxsIGFsc28gcHJldmVudCBpbnNlcnRpbmcgdGV4dCB3aGVuIHVzZXIncyB6b29taW5nXG4gICAgaWYgKGRpZFRhcFR3aWNlICYmIGV2ZW50LnRvdWNoZXMubGVuZ3RoID09PSAxKSB7XG4gICAgICBjb25zdCBbdG91Y2hdID0gZXZlbnQudG91Y2hlcztcbiAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgIHRoaXMuaGFuZGxlQ2FudmFzRG91YmxlQ2xpY2soe1xuICAgICAgICBjbGllbnRYOiB0b3VjaC5jbGllbnRYLFxuICAgICAgICBjbGllbnRZOiB0b3VjaC5jbGllbnRZLFxuICAgICAgfSk7XG4gICAgICBkaWRUYXBUd2ljZSA9IGZhbHNlO1xuICAgICAgY2xlYXJUaW1lb3V0KHRhcHBlZFR3aWNlVGltZXIpO1xuICAgIH1cbiAgICBpZiAoaXNBbmRyb2lkKSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH1cblxuICAgIGlmIChldmVudC50b3VjaGVzLmxlbmd0aCA9PT0gMikge1xuICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgIHNlbGVjdGVkRWxlbWVudElkczoge30sXG4gICAgICB9KTtcbiAgICB9XG4gIH07XG5cbiAgcHJpdmF0ZSBvblRhcEVuZCA9IChldmVudDogVG91Y2hFdmVudCkgPT4ge1xuICAgIHRoaXMucmVzZXRDb250ZXh0TWVudVRpbWVyKCk7XG4gICAgaWYgKGV2ZW50LnRvdWNoZXMubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgIHByZXZpb3VzU2VsZWN0ZWRFbGVtZW50SWRzOiB7fSxcbiAgICAgICAgc2VsZWN0ZWRFbGVtZW50SWRzOiB0aGlzLnN0YXRlLnByZXZpb3VzU2VsZWN0ZWRFbGVtZW50SWRzLFxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGdlc3R1cmUucG9pbnRlcnMuY2xlYXIoKTtcbiAgICB9XG4gIH07XG5cbiAgcHJpdmF0ZSBwYXN0ZUZyb21DbGlwYm9hcmQgPSB3aXRoQmF0Y2hlZFVwZGF0ZXMoXG4gICAgYXN5bmMgKGV2ZW50OiBDbGlwYm9hcmRFdmVudCB8IG51bGwpID0+IHtcbiAgICAgIC8vICM2ODZcbiAgICAgIGNvbnN0IHRhcmdldCA9IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ7XG4gICAgICBjb25zdCBpc0V4Y2FsaWRyYXdBY3RpdmUgPVxuICAgICAgICB0aGlzLmV4Y2FsaWRyYXdDb250YWluZXJSZWYuY3VycmVudD8uY29udGFpbnModGFyZ2V0KTtcbiAgICAgIGlmICghaXNFeGNhbGlkcmF3QWN0aXZlKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZWxlbWVudFVuZGVyQ3Vyc29yID0gZG9jdW1lbnQuZWxlbWVudEZyb21Qb2ludChjdXJzb3JYLCBjdXJzb3JZKTtcbiAgICAgIGlmIChcbiAgICAgICAgLy8gaWYgbm8gQ2xpcGJvYXJkRXZlbnQgc3VwcGxpZWQsIGFzc3VtZSB3ZSdyZSBwYXN0aW5nIHZpYSBjb250ZXh0TWVudVxuICAgICAgICAvLyB0aHVzIHRoZXNlIGNoZWNrcyBkb24ndCBtYWtlIHNlbnNlXG4gICAgICAgIGV2ZW50ICYmXG4gICAgICAgICghKGVsZW1lbnRVbmRlckN1cnNvciBpbnN0YW5jZW9mIEhUTUxDYW52YXNFbGVtZW50KSB8fFxuICAgICAgICAgIGlzV3JpdGFibGVFbGVtZW50KHRhcmdldCkpXG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyBtdXN0IGJlIGNhbGxlZCBpbiB0aGUgc2FtZSBmcmFtZSAodGh1cyBiZWZvcmUgYW55IGF3YWl0cykgYXMgdGhlIHBhc3RlXG4gICAgICAvLyBldmVudCBlbHNlIHNvbWUgYnJvd3NlcnMgKEZGLi4uKSB3aWxsIGNsZWFyIHRoZSBjbGlwYm9hcmREYXRhXG4gICAgICAvLyAoc29tZXRoaW5nIHNvbWV0aGluZyBzZWN1cml0eSlcbiAgICAgIGxldCBmaWxlID0gZXZlbnQ/LmNsaXBib2FyZERhdGE/LmZpbGVzWzBdO1xuXG4gICAgICBjb25zdCBkYXRhID0gYXdhaXQgcGFyc2VDbGlwYm9hcmQoZXZlbnQpO1xuXG4gICAgICBpZiAoIWZpbGUgJiYgZGF0YS50ZXh0KSB7XG4gICAgICAgIGNvbnN0IHN0cmluZyA9IGRhdGEudGV4dC50cmltKCk7XG4gICAgICAgIGlmIChzdHJpbmcuc3RhcnRzV2l0aChcIjxzdmdcIikgJiYgc3RyaW5nLmVuZHNXaXRoKFwiPC9zdmc+XCIpKSB7XG4gICAgICAgICAgLy8gaWdub3JlIFNWRyB2YWxpZGF0aW9uL25vcm1hbGl6YXRpb24gd2hpY2ggd2lsbCBiZSBkb25lIGR1cmluZyBpbWFnZVxuICAgICAgICAgIC8vIGluaXRpYWxpemF0aW9uXG4gICAgICAgICAgZmlsZSA9IFNWR1N0cmluZ1RvRmlsZShzdHJpbmcpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIHByZWZlciBzcHJlYWRzaGVldCBkYXRhIG92ZXIgaW1hZ2UgZmlsZSAoTVMgT2ZmaWNlL0xpYnJlIE9mZmljZSlcbiAgICAgIGlmIChpc1N1cHBvcnRlZEltYWdlRmlsZShmaWxlKSAmJiAhZGF0YS5zcHJlYWRzaGVldCkge1xuICAgICAgICBjb25zdCB7IHg6IHNjZW5lWCwgeTogc2NlbmVZIH0gPSB2aWV3cG9ydENvb3Jkc1RvU2NlbmVDb29yZHMoXG4gICAgICAgICAgeyBjbGllbnRYOiBjdXJzb3JYLCBjbGllbnRZOiBjdXJzb3JZIH0sXG4gICAgICAgICAgdGhpcy5zdGF0ZSxcbiAgICAgICAgKTtcblxuICAgICAgICBjb25zdCBpbWFnZUVsZW1lbnQgPSB0aGlzLmNyZWF0ZUltYWdlRWxlbWVudCh7IHNjZW5lWCwgc2NlbmVZIH0pO1xuICAgICAgICB0aGlzLmluc2VydEltYWdlRWxlbWVudChpbWFnZUVsZW1lbnQsIGZpbGUpO1xuICAgICAgICB0aGlzLmluaXRpYWxpemVJbWFnZURpbWVuc2lvbnMoaW1hZ2VFbGVtZW50KTtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7IHNlbGVjdGVkRWxlbWVudElkczogeyBbaW1hZ2VFbGVtZW50LmlkXTogdHJ1ZSB9IH0pO1xuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMucHJvcHMub25QYXN0ZSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGlmICgoYXdhaXQgdGhpcy5wcm9wcy5vblBhc3RlKGRhdGEsIGV2ZW50KSkgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChkYXRhLmVycm9yTWVzc2FnZSkge1xuICAgICAgICB0aGlzLnNldFN0YXRlKHsgZXJyb3JNZXNzYWdlOiBkYXRhLmVycm9yTWVzc2FnZSB9KTtcbiAgICAgIH0gZWxzZSBpZiAoZGF0YS5zcHJlYWRzaGVldCkge1xuICAgICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgICBwYXN0ZURpYWxvZzoge1xuICAgICAgICAgICAgZGF0YTogZGF0YS5zcHJlYWRzaGVldCxcbiAgICAgICAgICAgIHNob3duOiB0cnVlLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIGlmIChkYXRhLmVsZW1lbnRzKSB7XG4gICAgICAgIHRoaXMuYWRkRWxlbWVudHNGcm9tUGFzdGVPckxpYnJhcnkoe1xuICAgICAgICAgIGVsZW1lbnRzOiBkYXRhLmVsZW1lbnRzLFxuICAgICAgICAgIGZpbGVzOiBkYXRhLmZpbGVzIHx8IG51bGwsXG4gICAgICAgICAgcG9zaXRpb246IFwiY3Vyc29yXCIsXG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIGlmIChkYXRhLnRleHQpIHtcbiAgICAgICAgdGhpcy5hZGRUZXh0RnJvbVBhc3RlKGRhdGEudGV4dCk7XG4gICAgICB9XG4gICAgICB0aGlzLnNldEFjdGl2ZVRvb2woeyB0eXBlOiBcInNlbGVjdGlvblwiIH0pO1xuICAgICAgZXZlbnQ/LnByZXZlbnREZWZhdWx0KCk7XG4gICAgfSxcbiAgKTtcblxuICBwcml2YXRlIGFkZEVsZW1lbnRzRnJvbVBhc3RlT3JMaWJyYXJ5ID0gKG9wdHM6IHtcbiAgICBlbGVtZW50czogcmVhZG9ubHkgRXhjYWxpZHJhd0VsZW1lbnRbXTtcbiAgICBmaWxlczogQmluYXJ5RmlsZXMgfCBudWxsO1xuICAgIHBvc2l0aW9uOiB7IGNsaWVudFg6IG51bWJlcjsgY2xpZW50WTogbnVtYmVyIH0gfCBcImN1cnNvclwiIHwgXCJjZW50ZXJcIjtcbiAgfSkgPT4ge1xuICAgIGNvbnN0IGVsZW1lbnRzID0gcmVzdG9yZUVsZW1lbnRzKG9wdHMuZWxlbWVudHMsIG51bGwpO1xuICAgIGNvbnN0IFttaW5YLCBtaW5ZLCBtYXhYLCBtYXhZXSA9IGdldENvbW1vbkJvdW5kcyhlbGVtZW50cyk7XG5cbiAgICBjb25zdCBlbGVtZW50c0NlbnRlclggPSBkaXN0YW5jZShtaW5YLCBtYXhYKSAvIDI7XG4gICAgY29uc3QgZWxlbWVudHNDZW50ZXJZID0gZGlzdGFuY2UobWluWSwgbWF4WSkgLyAyO1xuXG4gICAgY29uc3QgY2xpZW50WCA9XG4gICAgICB0eXBlb2Ygb3B0cy5wb3NpdGlvbiA9PT0gXCJvYmplY3RcIlxuICAgICAgICA/IG9wdHMucG9zaXRpb24uY2xpZW50WFxuICAgICAgICA6IG9wdHMucG9zaXRpb24gPT09IFwiY3Vyc29yXCJcbiAgICAgICAgPyBjdXJzb3JYXG4gICAgICAgIDogdGhpcy5zdGF0ZS53aWR0aCAvIDIgKyB0aGlzLnN0YXRlLm9mZnNldExlZnQ7XG4gICAgY29uc3QgY2xpZW50WSA9XG4gICAgICB0eXBlb2Ygb3B0cy5wb3NpdGlvbiA9PT0gXCJvYmplY3RcIlxuICAgICAgICA/IG9wdHMucG9zaXRpb24uY2xpZW50WVxuICAgICAgICA6IG9wdHMucG9zaXRpb24gPT09IFwiY3Vyc29yXCJcbiAgICAgICAgPyBjdXJzb3JZXG4gICAgICAgIDogdGhpcy5zdGF0ZS5oZWlnaHQgLyAyICsgdGhpcy5zdGF0ZS5vZmZzZXRUb3A7XG5cbiAgICBjb25zdCB7IHgsIHkgfSA9IHZpZXdwb3J0Q29vcmRzVG9TY2VuZUNvb3JkcyhcbiAgICAgIHsgY2xpZW50WCwgY2xpZW50WSB9LFxuICAgICAgdGhpcy5zdGF0ZSxcbiAgICApO1xuXG4gICAgY29uc3QgZHggPSB4IC0gZWxlbWVudHNDZW50ZXJYO1xuICAgIGNvbnN0IGR5ID0geSAtIGVsZW1lbnRzQ2VudGVyWTtcbiAgICBjb25zdCBncm91cElkTWFwID0gbmV3IE1hcCgpO1xuXG4gICAgY29uc3QgW2dyaWRYLCBncmlkWV0gPSBnZXRHcmlkUG9pbnQoZHgsIGR5LCB0aGlzLnN0YXRlLmdyaWRTaXplKTtcblxuICAgIGNvbnN0IG9sZElkVG9EdXBsaWNhdGVkSWQgPSBuZXcgTWFwKCk7XG4gICAgY29uc3QgbmV3RWxlbWVudHMgPSBlbGVtZW50cy5tYXAoKGVsZW1lbnQpID0+IHtcbiAgICAgIGNvbnN0IG5ld0VsZW1lbnQgPSBkdXBsaWNhdGVFbGVtZW50KFxuICAgICAgICB0aGlzLnN0YXRlLmVkaXRpbmdHcm91cElkLFxuICAgICAgICBncm91cElkTWFwLFxuICAgICAgICBlbGVtZW50LFxuICAgICAgICB7XG4gICAgICAgICAgeDogZWxlbWVudC54ICsgZ3JpZFggLSBtaW5YLFxuICAgICAgICAgIHk6IGVsZW1lbnQueSArIGdyaWRZIC0gbWluWSxcbiAgICAgICAgfSxcbiAgICAgICk7XG4gICAgICBvbGRJZFRvRHVwbGljYXRlZElkLnNldChlbGVtZW50LmlkLCBuZXdFbGVtZW50LmlkKTtcbiAgICAgIHJldHVybiBuZXdFbGVtZW50O1xuICAgIH0pO1xuICAgIGJpbmRUZXh0VG9TaGFwZUFmdGVyRHVwbGljYXRpb24obmV3RWxlbWVudHMsIGVsZW1lbnRzLCBvbGRJZFRvRHVwbGljYXRlZElkKTtcbiAgICBjb25zdCBuZXh0RWxlbWVudHMgPSBbXG4gICAgICAuLi50aGlzLnNjZW5lLmdldEVsZW1lbnRzSW5jbHVkaW5nRGVsZXRlZCgpLFxuICAgICAgLi4ubmV3RWxlbWVudHMsXG4gICAgXTtcbiAgICBmaXhCaW5kaW5nc0FmdGVyRHVwbGljYXRpb24obmV4dEVsZW1lbnRzLCBlbGVtZW50cywgb2xkSWRUb0R1cGxpY2F0ZWRJZCk7XG5cbiAgICBpZiAob3B0cy5maWxlcykge1xuICAgICAgdGhpcy5maWxlcyA9IHsgLi4udGhpcy5maWxlcywgLi4ub3B0cy5maWxlcyB9O1xuICAgIH1cblxuICAgIHRoaXMuc2NlbmUucmVwbGFjZUFsbEVsZW1lbnRzKG5leHRFbGVtZW50cyk7XG4gICAgdGhpcy5oaXN0b3J5LnJlc3VtZVJlY29yZGluZygpO1xuXG4gICAgdGhpcy5zZXRTdGF0ZShcbiAgICAgIHNlbGVjdEdyb3Vwc0ZvclNlbGVjdGVkRWxlbWVudHMoXG4gICAgICAgIHtcbiAgICAgICAgICAuLi50aGlzLnN0YXRlLFxuICAgICAgICAgIGlzTGlicmFyeU9wZW46XG4gICAgICAgICAgICB0aGlzLnN0YXRlLmlzTGlicmFyeU9wZW4gJiYgdGhpcy5kZXZpY2UuY2FuRGV2aWNlRml0U2lkZWJhclxuICAgICAgICAgICAgICA/IHRoaXMuc3RhdGUuaXNMaWJyYXJ5TWVudURvY2tlZFxuICAgICAgICAgICAgICA6IGZhbHNlLFxuICAgICAgICAgIHNlbGVjdGVkRWxlbWVudElkczogbmV3RWxlbWVudHMucmVkdWNlKFxuICAgICAgICAgICAgKGFjYzogUmVjb3JkPEV4Y2FsaWRyYXdFbGVtZW50W1wiaWRcIl0sIHRydWU+LCBlbGVtZW50KSA9PiB7XG4gICAgICAgICAgICAgIGlmICghaXNCb3VuZFRvQ29udGFpbmVyKGVsZW1lbnQpKSB7XG4gICAgICAgICAgICAgICAgYWNjW2VsZW1lbnQuaWRdID0gdHJ1ZTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICByZXR1cm4gYWNjO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHt9LFxuICAgICAgICAgICksXG4gICAgICAgICAgc2VsZWN0ZWRHcm91cElkczoge30sXG4gICAgICAgIH0sXG4gICAgICAgIHRoaXMuc2NlbmUuZ2V0Tm9uRGVsZXRlZEVsZW1lbnRzKCksXG4gICAgICApLFxuICAgICAgKCkgPT4ge1xuICAgICAgICBpZiAob3B0cy5maWxlcykge1xuICAgICAgICAgIHRoaXMuYWRkTmV3SW1hZ2VzVG9JbWFnZUNhY2hlKCk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgKTtcbiAgICB0aGlzLnNldEFjdGl2ZVRvb2woeyB0eXBlOiBcInNlbGVjdGlvblwiIH0pO1xuICB9O1xuXG4gIHByaXZhdGUgYWRkVGV4dEZyb21QYXN0ZSh0ZXh0OiBhbnkpIHtcbiAgICBjb25zdCB7IHgsIHkgfSA9IHZpZXdwb3J0Q29vcmRzVG9TY2VuZUNvb3JkcyhcbiAgICAgIHsgY2xpZW50WDogY3Vyc29yWCwgY2xpZW50WTogY3Vyc29yWSB9LFxuICAgICAgdGhpcy5zdGF0ZSxcbiAgICApO1xuXG4gICAgY29uc3QgZWxlbWVudCA9IG5ld1RleHRFbGVtZW50KHtcbiAgICAgIHgsXG4gICAgICB5LFxuICAgICAgc3Ryb2tlQ29sb3I6IHRoaXMuc3RhdGUuY3VycmVudEl0ZW1TdHJva2VDb2xvcixcbiAgICAgIGJhY2tncm91bmRDb2xvcjogdGhpcy5zdGF0ZS5jdXJyZW50SXRlbUJhY2tncm91bmRDb2xvcixcbiAgICAgIGZpbGxTdHlsZTogdGhpcy5zdGF0ZS5jdXJyZW50SXRlbUZpbGxTdHlsZSxcbiAgICAgIHN0cm9rZVdpZHRoOiB0aGlzLnN0YXRlLmN1cnJlbnRJdGVtU3Ryb2tlV2lkdGgsXG4gICAgICBzdHJva2VTdHlsZTogdGhpcy5zdGF0ZS5jdXJyZW50SXRlbVN0cm9rZVN0eWxlLFxuICAgICAgcm91Z2huZXNzOiB0aGlzLnN0YXRlLmN1cnJlbnRJdGVtUm91Z2huZXNzLFxuICAgICAgb3BhY2l0eTogdGhpcy5zdGF0ZS5jdXJyZW50SXRlbU9wYWNpdHksXG4gICAgICBzdHJva2VTaGFycG5lc3M6IHRoaXMuc3RhdGUuY3VycmVudEl0ZW1TdHJva2VTaGFycG5lc3MsXG4gICAgICB0ZXh0LFxuICAgICAgZm9udFNpemU6IHRoaXMuc3RhdGUuY3VycmVudEl0ZW1Gb250U2l6ZSxcbiAgICAgIGZvbnRGYW1pbHk6IHRoaXMuc3RhdGUuY3VycmVudEl0ZW1Gb250RmFtaWx5LFxuICAgICAgdGV4dEFsaWduOiB0aGlzLnN0YXRlLmN1cnJlbnRJdGVtVGV4dEFsaWduLFxuICAgICAgdmVydGljYWxBbGlnbjogREVGQVVMVF9WRVJUSUNBTF9BTElHTixcbiAgICAgIGxvY2tlZDogZmFsc2UsXG4gICAgfSk7XG5cbiAgICB0aGlzLnNjZW5lLnJlcGxhY2VBbGxFbGVtZW50cyhbXG4gICAgICAuLi50aGlzLnNjZW5lLmdldEVsZW1lbnRzSW5jbHVkaW5nRGVsZXRlZCgpLFxuICAgICAgZWxlbWVudCxcbiAgICBdKTtcbiAgICB0aGlzLnNldFN0YXRlKHsgc2VsZWN0ZWRFbGVtZW50SWRzOiB7IFtlbGVtZW50LmlkXTogdHJ1ZSB9IH0pO1xuICAgIHRoaXMuaGlzdG9yeS5yZXN1bWVSZWNvcmRpbmcoKTtcbiAgfVxuXG4gIC8vIENvbGxhYm9yYXRpb25cblxuICBzZXRBcHBTdGF0ZSA9IChvYmo6IGFueSkgPT4ge1xuICAgIHRoaXMuc2V0U3RhdGUob2JqKTtcbiAgfTtcblxuICByZW1vdmVQb2ludGVyID0gKGV2ZW50OiBSZWFjdC5Qb2ludGVyRXZlbnQ8SFRNTEVsZW1lbnQ+IHwgUG9pbnRlckV2ZW50KSA9PiB7XG4gICAgaWYgKHRvdWNoVGltZW91dCkge1xuICAgICAgdGhpcy5yZXNldENvbnRleHRNZW51VGltZXIoKTtcbiAgICB9XG5cbiAgICBnZXN0dXJlLnBvaW50ZXJzLmRlbGV0ZShldmVudC5wb2ludGVySWQpO1xuICB9O1xuXG4gIHRvZ2dsZUxvY2sgPSAoc291cmNlOiBcImtleWJvYXJkXCIgfCBcInVpXCIgPSBcInVpXCIpID0+IHtcbiAgICBpZiAoIXRoaXMuc3RhdGUuYWN0aXZlVG9vbC5sb2NrZWQpIHtcbiAgICAgIHRyYWNrRXZlbnQoXG4gICAgICAgIFwidG9vbGJhclwiLFxuICAgICAgICBcInRvZ2dsZUxvY2tcIixcbiAgICAgICAgYCR7c291cmNlfSAoJHt0aGlzLmRldmljZS5pc01vYmlsZSA/IFwibW9iaWxlXCIgOiBcImRlc2t0b3BcIn0pYCxcbiAgICAgICk7XG4gICAgfVxuICAgIHRoaXMuc2V0U3RhdGUoKHByZXZTdGF0ZSkgPT4ge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgYWN0aXZlVG9vbDoge1xuICAgICAgICAgIC4uLnByZXZTdGF0ZS5hY3RpdmVUb29sLFxuICAgICAgICAgIC4uLnVwZGF0ZUFjdGl2ZVRvb2woXG4gICAgICAgICAgICB0aGlzLnN0YXRlLFxuICAgICAgICAgICAgcHJldlN0YXRlLmFjdGl2ZVRvb2wubG9ja2VkXG4gICAgICAgICAgICAgID8geyB0eXBlOiBcInNlbGVjdGlvblwiIH1cbiAgICAgICAgICAgICAgOiBwcmV2U3RhdGUuYWN0aXZlVG9vbCxcbiAgICAgICAgICApLFxuICAgICAgICAgIGxvY2tlZDogIXByZXZTdGF0ZS5hY3RpdmVUb29sLmxvY2tlZCxcbiAgICAgICAgfSxcbiAgICAgIH07XG4gICAgfSk7XG4gIH07XG5cbiAgdG9nZ2xlUGVuTW9kZSA9ICgpID0+IHtcbiAgICB0aGlzLnNldFN0YXRlKChwcmV2U3RhdGUpID0+IHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHBlbk1vZGU6ICFwcmV2U3RhdGUucGVuTW9kZSxcbiAgICAgIH07XG4gICAgfSk7XG4gIH07XG5cbiAgc2Nyb2xsVG9Db250ZW50ID0gKFxuICAgIHRhcmdldDpcbiAgICAgIHwgRXhjYWxpZHJhd0VsZW1lbnRcbiAgICAgIHwgcmVhZG9ubHkgRXhjYWxpZHJhd0VsZW1lbnRbXSA9IHRoaXMuc2NlbmUuZ2V0Tm9uRGVsZXRlZEVsZW1lbnRzKCksXG4gICkgPT4ge1xuICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgLi4uY2FsY3VsYXRlU2Nyb2xsQ2VudGVyKFxuICAgICAgICBBcnJheS5pc0FycmF5KHRhcmdldCkgPyB0YXJnZXQgOiBbdGFyZ2V0XSxcbiAgICAgICAgdGhpcy5zdGF0ZSxcbiAgICAgICAgdGhpcy5jYW52YXMsXG4gICAgICApLFxuICAgIH0pO1xuICB9O1xuXG4gIHNldFRvYXN0ID0gKFxuICAgIHRvYXN0OiB7XG4gICAgICBtZXNzYWdlOiBzdHJpbmc7XG4gICAgICBjbG9zYWJsZT86IGJvb2xlYW47XG4gICAgICBkdXJhdGlvbj86IG51bWJlcjtcbiAgICB9IHwgbnVsbCxcbiAgKSA9PiB7XG4gICAgdGhpcy5zZXRTdGF0ZSh7IHRvYXN0IH0pO1xuICB9O1xuXG4gIHJlc3RvcmVGaWxlRnJvbVNoYXJlID0gYXN5bmMgKCkgPT4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCB3ZWJTaGFyZVRhcmdldENhY2hlID0gYXdhaXQgY2FjaGVzLm9wZW4oXCJ3ZWItc2hhcmUtdGFyZ2V0XCIpO1xuXG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHdlYlNoYXJlVGFyZ2V0Q2FjaGUubWF0Y2goXCJzaGFyZWQtZmlsZVwiKTtcbiAgICAgIGlmIChyZXNwb25zZSkge1xuICAgICAgICBjb25zdCBibG9iID0gYXdhaXQgcmVzcG9uc2UuYmxvYigpO1xuICAgICAgICBjb25zdCBmaWxlID0gbmV3IEZpbGUoW2Jsb2JdLCBibG9iLm5hbWUgfHwgXCJcIiwgeyB0eXBlOiBibG9iLnR5cGUgfSk7XG4gICAgICAgIHRoaXMubG9hZEZpbGVUb0NhbnZhcyhmaWxlLCBudWxsKTtcbiAgICAgICAgYXdhaXQgd2ViU2hhcmVUYXJnZXRDYWNoZS5kZWxldGUoXCJzaGFyZWQtZmlsZVwiKTtcbiAgICAgICAgd2luZG93Lmhpc3RvcnkucmVwbGFjZVN0YXRlKG51bGwsIEFQUF9OQU1FLCB3aW5kb3cubG9jYXRpb24ucGF0aG5hbWUpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgIHRoaXMuc2V0U3RhdGUoeyBlcnJvck1lc3NhZ2U6IGVycm9yLm1lc3NhZ2UgfSk7XG4gICAgfVxuICB9O1xuXG4gIC8qKiBhZGRzIHN1cHBsaWVkIGZpbGVzIHRvIGV4aXN0aW5nIGZpbGVzIGluIHRoZSBhcHBTdGF0ZSAqL1xuICBwdWJsaWMgYWRkRmlsZXM6IEV4Y2FsaWRyYXdJbXBlcmF0aXZlQVBJW1wiYWRkRmlsZXNcIl0gPSB3aXRoQmF0Y2hlZFVwZGF0ZXMoXG4gICAgKGZpbGVzKSA9PiB7XG4gICAgICBjb25zdCBmaWxlc01hcCA9IGZpbGVzLnJlZHVjZSgoYWNjLCBmaWxlRGF0YSkgPT4ge1xuICAgICAgICBhY2Muc2V0KGZpbGVEYXRhLmlkLCBmaWxlRGF0YSk7XG4gICAgICAgIHJldHVybiBhY2M7XG4gICAgICB9LCBuZXcgTWFwPEZpbGVJZCwgQmluYXJ5RmlsZURhdGE+KCkpO1xuXG4gICAgICB0aGlzLmZpbGVzID0geyAuLi50aGlzLmZpbGVzLCAuLi5PYmplY3QuZnJvbUVudHJpZXMoZmlsZXNNYXApIH07XG5cbiAgICAgIHRoaXMuc2NlbmUuZ2V0Tm9uRGVsZXRlZEVsZW1lbnRzKCkuZm9yRWFjaCgoZWxlbWVudCkgPT4ge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgaXNJbml0aWFsaXplZEltYWdlRWxlbWVudChlbGVtZW50KSAmJlxuICAgICAgICAgIGZpbGVzTWFwLmhhcyhlbGVtZW50LmZpbGVJZClcbiAgICAgICAgKSB7XG4gICAgICAgICAgdGhpcy5pbWFnZUNhY2hlLmRlbGV0ZShlbGVtZW50LmZpbGVJZCk7XG4gICAgICAgICAgaW52YWxpZGF0ZVNoYXBlRm9yRWxlbWVudChlbGVtZW50KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICB0aGlzLnNjZW5lLmluZm9ybU11dGF0aW9uKCk7XG5cbiAgICAgIHRoaXMuYWRkTmV3SW1hZ2VzVG9JbWFnZUNhY2hlKCk7XG4gICAgfSxcbiAgKTtcblxuICBwdWJsaWMgdXBkYXRlU2NlbmUgPSB3aXRoQmF0Y2hlZFVwZGF0ZXMoXG4gICAgPEsgZXh0ZW5kcyBrZXlvZiBBcHBTdGF0ZT4oc2NlbmVEYXRhOiB7XG4gICAgICBlbGVtZW50cz86IFNjZW5lRGF0YVtcImVsZW1lbnRzXCJdO1xuICAgICAgYXBwU3RhdGU/OiBQaWNrPEFwcFN0YXRlLCBLPiB8IG51bGw7XG4gICAgICBjb2xsYWJvcmF0b3JzPzogU2NlbmVEYXRhW1wiY29sbGFib3JhdG9yc1wiXTtcbiAgICAgIGNvbW1pdFRvSGlzdG9yeT86IFNjZW5lRGF0YVtcImNvbW1pdFRvSGlzdG9yeVwiXTtcbiAgICB9KSA9PiB7XG4gICAgICBpZiAoc2NlbmVEYXRhLmNvbW1pdFRvSGlzdG9yeSkge1xuICAgICAgICB0aGlzLmhpc3RvcnkucmVzdW1lUmVjb3JkaW5nKCk7XG4gICAgICB9XG5cbiAgICAgIGlmIChzY2VuZURhdGEuYXBwU3RhdGUpIHtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZShzY2VuZURhdGEuYXBwU3RhdGUpO1xuICAgICAgfVxuXG4gICAgICBpZiAoc2NlbmVEYXRhLmVsZW1lbnRzKSB7XG4gICAgICAgIHRoaXMuc2NlbmUucmVwbGFjZUFsbEVsZW1lbnRzKHNjZW5lRGF0YS5lbGVtZW50cyk7XG4gICAgICB9XG5cbiAgICAgIGlmIChzY2VuZURhdGEuY29sbGFib3JhdG9ycykge1xuICAgICAgICB0aGlzLnNldFN0YXRlKHsgY29sbGFib3JhdG9yczogc2NlbmVEYXRhLmNvbGxhYm9yYXRvcnMgfSk7XG4gICAgICB9XG4gICAgfSxcbiAgKTtcblxuICBwcml2YXRlIG9uU2NlbmVVcGRhdGVkID0gKCkgPT4ge1xuICAgIHRoaXMuc2V0U3RhdGUoe30pO1xuICB9O1xuXG4gIHByaXZhdGUgdXBkYXRlQ3VycmVudEN1cnNvclBvc2l0aW9uID0gd2l0aEJhdGNoZWRVcGRhdGVzKFxuICAgIChldmVudDogTW91c2VFdmVudCkgPT4ge1xuICAgICAgY3Vyc29yWCA9IGV2ZW50LmNsaWVudFg7XG4gICAgICBjdXJzb3JZID0gZXZlbnQuY2xpZW50WTtcbiAgICB9LFxuICApO1xuXG4gIC8vIElucHV0IGhhbmRsaW5nXG5cbiAgcHJpdmF0ZSBvbktleURvd24gPSB3aXRoQmF0Y2hlZFVwZGF0ZXMoXG4gICAgKGV2ZW50OiBSZWFjdC5LZXlib2FyZEV2ZW50IHwgS2V5Ym9hcmRFdmVudCkgPT4ge1xuICAgICAgLy8gbm9ybWFsaXplIGBldmVudC5rZXlgIHdoZW4gQ2Fwc0xvY2sgaXMgcHJlc3NlZCAjMjM3MlxuXG4gICAgICBpZiAoXG4gICAgICAgIFwiUHJveHlcIiBpbiB3aW5kb3cgJiZcbiAgICAgICAgKCghZXZlbnQuc2hpZnRLZXkgJiYgL15bQS1aXSQvLnRlc3QoZXZlbnQua2V5KSkgfHxcbiAgICAgICAgICAoZXZlbnQuc2hpZnRLZXkgJiYgL15bYS16XSQvLnRlc3QoZXZlbnQua2V5KSkpXG4gICAgICApIHtcbiAgICAgICAgZXZlbnQgPSBuZXcgUHJveHkoZXZlbnQsIHtcbiAgICAgICAgICBnZXQoZXY6IGFueSwgcHJvcCkge1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBldltwcm9wXTtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgICAvLyBmaXggZm9yIFByb3hpZXMgaGlqYWNraW5nIGB0aGlzYFxuICAgICAgICAgICAgICByZXR1cm4gdmFsdWUuYmluZChldik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcHJvcCA9PT0gXCJrZXlcIlxuICAgICAgICAgICAgICA/IC8vIENhcHNMb2NrIGludmVydHMgY2FwaXRhbGl6YXRpb24gYmFzZWQgb24gU2hpZnRLZXksIHNvIGludmVydFxuICAgICAgICAgICAgICAgIC8vIGl0IGJhY2tcbiAgICAgICAgICAgICAgICBldmVudC5zaGlmdEtleVxuICAgICAgICAgICAgICAgID8gZXYua2V5LnRvVXBwZXJDYXNlKClcbiAgICAgICAgICAgICAgICA6IGV2LmtleS50b0xvd2VyQ2FzZSgpXG4gICAgICAgICAgICAgIDogdmFsdWU7XG4gICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIC8vIHByZXZlbnQgYnJvd3NlciB6b29tIGluIGlucHV0IGZpZWxkc1xuICAgICAgaWYgKGV2ZW50W0tFWVMuQ1RSTF9PUl9DTURdICYmIGlzV3JpdGFibGVFbGVtZW50KGV2ZW50LnRhcmdldCkpIHtcbiAgICAgICAgaWYgKGV2ZW50LmNvZGUgPT09IENPREVTLk1JTlVTIHx8IGV2ZW50LmNvZGUgPT09IENPREVTLkVRVUFMKSB7XG4gICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gYmFpbCBpZlxuICAgICAgaWYgKFxuICAgICAgICAvLyBpbnNpZGUgYW4gaW5wdXRcbiAgICAgICAgKGlzV3JpdGFibGVFbGVtZW50KGV2ZW50LnRhcmdldCkgJiZcbiAgICAgICAgICAvLyB1bmxlc3MgcHJlc3NpbmcgZXNjYXBlIChmaW5hbGl6ZSBhY3Rpb24pXG4gICAgICAgICAgZXZlbnQua2V5ICE9PSBLRVlTLkVTQ0FQRSkgfHxcbiAgICAgICAgLy8gb3IgdW5sZXNzIHVzaW5nIGFycm93cyAodG8gbW92ZSBiZXR3ZWVuIGJ1dHRvbnMpXG4gICAgICAgIChpc0Fycm93S2V5KGV2ZW50LmtleSkgJiYgaXNJbnB1dExpa2UoZXZlbnQudGFyZ2V0KSlcbiAgICAgICkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmIChldmVudC5rZXkgPT09IEtFWVMuUVVFU1RJT05fTUFSSykge1xuICAgICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgICBzaG93SGVscERpYWxvZzogdHJ1ZSxcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLmFjdGlvbk1hbmFnZXIuaGFuZGxlS2V5RG93bihldmVudCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5zdGF0ZS52aWV3TW9kZUVuYWJsZWQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoZXZlbnRbS0VZUy5DVFJMX09SX0NNRF0gJiYgdGhpcy5zdGF0ZS5pc0JpbmRpbmdFbmFibGVkKSB7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoeyBpc0JpbmRpbmdFbmFibGVkOiBmYWxzZSB9KTtcbiAgICAgIH1cblxuICAgICAgaWYgKGV2ZW50LmNvZGUgPT09IENPREVTLlpFUk8pIHtcbiAgICAgICAgY29uc3QgbmV4dFN0YXRlID0gIXRoaXMuc3RhdGUuaXNMaWJyYXJ5T3BlbjtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7IGlzTGlicmFyeU9wZW46IG5leHRTdGF0ZSB9KTtcbiAgICAgICAgLy8gdHJhY2sgb25seSBvcGVuaW5nc1xuICAgICAgICBpZiAobmV4dFN0YXRlKSB7XG4gICAgICAgICAgdHJhY2tFdmVudChcbiAgICAgICAgICAgIFwibGlicmFyeVwiLFxuICAgICAgICAgICAgXCJ0b2dnbGVMaWJyYXJ5IChvcGVuKVwiLFxuICAgICAgICAgICAgYGtleWJvYXJkICgke3RoaXMuZGV2aWNlLmlzTW9iaWxlID8gXCJtb2JpbGVcIiA6IFwiZGVza3RvcFwifSlgLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKGlzQXJyb3dLZXkoZXZlbnQua2V5KSkge1xuICAgICAgICBjb25zdCBzdGVwID1cbiAgICAgICAgICAodGhpcy5zdGF0ZS5ncmlkU2l6ZSAmJlxuICAgICAgICAgICAgKGV2ZW50LnNoaWZ0S2V5XG4gICAgICAgICAgICAgID8gRUxFTUVOVF9UUkFOU0xBVEVfQU1PVU5UXG4gICAgICAgICAgICAgIDogdGhpcy5zdGF0ZS5ncmlkU2l6ZSkpIHx8XG4gICAgICAgICAgKGV2ZW50LnNoaWZ0S2V5XG4gICAgICAgICAgICA/IEVMRU1FTlRfU0hJRlRfVFJBTlNMQVRFX0FNT1VOVFxuICAgICAgICAgICAgOiBFTEVNRU5UX1RSQU5TTEFURV9BTU9VTlQpO1xuXG4gICAgICAgIGNvbnN0IHNlbGVjdGVkRWxlbWVudHMgPSBnZXRTZWxlY3RlZEVsZW1lbnRzKFxuICAgICAgICAgIHRoaXMuc2NlbmUuZ2V0Tm9uRGVsZXRlZEVsZW1lbnRzKCksXG4gICAgICAgICAgdGhpcy5zdGF0ZSxcbiAgICAgICAgICB0cnVlLFxuICAgICAgICApO1xuXG4gICAgICAgIGxldCBvZmZzZXRYID0gMDtcbiAgICAgICAgbGV0IG9mZnNldFkgPSAwO1xuXG4gICAgICAgIGlmIChldmVudC5rZXkgPT09IEtFWVMuQVJST1dfTEVGVCkge1xuICAgICAgICAgIG9mZnNldFggPSAtc3RlcDtcbiAgICAgICAgfSBlbHNlIGlmIChldmVudC5rZXkgPT09IEtFWVMuQVJST1dfUklHSFQpIHtcbiAgICAgICAgICBvZmZzZXRYID0gc3RlcDtcbiAgICAgICAgfSBlbHNlIGlmIChldmVudC5rZXkgPT09IEtFWVMuQVJST1dfVVApIHtcbiAgICAgICAgICBvZmZzZXRZID0gLXN0ZXA7XG4gICAgICAgIH0gZWxzZSBpZiAoZXZlbnQua2V5ID09PSBLRVlTLkFSUk9XX0RPV04pIHtcbiAgICAgICAgICBvZmZzZXRZID0gc3RlcDtcbiAgICAgICAgfVxuXG4gICAgICAgIHNlbGVjdGVkRWxlbWVudHMuZm9yRWFjaCgoZWxlbWVudCkgPT4ge1xuICAgICAgICAgIG11dGF0ZUVsZW1lbnQoZWxlbWVudCwge1xuICAgICAgICAgICAgeDogZWxlbWVudC54ICsgb2Zmc2V0WCxcbiAgICAgICAgICAgIHk6IGVsZW1lbnQueSArIG9mZnNldFksXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICB1cGRhdGVCb3VuZEVsZW1lbnRzKGVsZW1lbnQsIHtcbiAgICAgICAgICAgIHNpbXVsdGFuZW91c2x5VXBkYXRlZDogc2VsZWN0ZWRFbGVtZW50cyxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5tYXliZVN1Z2dlc3RCaW5kaW5nRm9yQWxsKHNlbGVjdGVkRWxlbWVudHMpO1xuXG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICB9IGVsc2UgaWYgKGV2ZW50LmtleSA9PT0gS0VZUy5FTlRFUikge1xuICAgICAgICBjb25zdCBzZWxlY3RlZEVsZW1lbnRzID0gZ2V0U2VsZWN0ZWRFbGVtZW50cyhcbiAgICAgICAgICB0aGlzLnNjZW5lLmdldE5vbkRlbGV0ZWRFbGVtZW50cygpLFxuICAgICAgICAgIHRoaXMuc3RhdGUsXG4gICAgICAgICk7XG5cbiAgICAgICAgaWYgKHNlbGVjdGVkRWxlbWVudHMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgaWYgKGlzTGluZWFyRWxlbWVudChzZWxlY3RlZEVsZW1lbnRzWzBdKSkge1xuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAhdGhpcy5zdGF0ZS5lZGl0aW5nTGluZWFyRWxlbWVudCB8fFxuICAgICAgICAgICAgICB0aGlzLnN0YXRlLmVkaXRpbmdMaW5lYXJFbGVtZW50LmVsZW1lbnRJZCAhPT1cbiAgICAgICAgICAgICAgICBzZWxlY3RlZEVsZW1lbnRzWzBdLmlkXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgdGhpcy5oaXN0b3J5LnJlc3VtZVJlY29yZGluZygpO1xuICAgICAgICAgICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgICAgICAgICBlZGl0aW5nTGluZWFyRWxlbWVudDogbmV3IExpbmVhckVsZW1lbnRFZGl0b3IoXG4gICAgICAgICAgICAgICAgICBzZWxlY3RlZEVsZW1lbnRzWzBdLFxuICAgICAgICAgICAgICAgICAgdGhpcy5zY2VuZSxcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3Qgc2VsZWN0ZWRFbGVtZW50ID0gc2VsZWN0ZWRFbGVtZW50c1swXTtcblxuICAgICAgICAgICAgdGhpcy5zdGFydFRleHRFZGl0aW5nKHtcbiAgICAgICAgICAgICAgc2NlbmVYOiBzZWxlY3RlZEVsZW1lbnQueCArIHNlbGVjdGVkRWxlbWVudC53aWR0aCAvIDIsXG4gICAgICAgICAgICAgIHNjZW5lWTogc2VsZWN0ZWRFbGVtZW50LnkgKyBzZWxlY3RlZEVsZW1lbnQuaGVpZ2h0IC8gMixcbiAgICAgICAgICAgICAgc2hvdWxkQmluZDogdHJ1ZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICFldmVudC5jdHJsS2V5ICYmXG4gICAgICAgICFldmVudC5hbHRLZXkgJiZcbiAgICAgICAgIWV2ZW50Lm1ldGFLZXkgJiZcbiAgICAgICAgdGhpcy5zdGF0ZS5kcmFnZ2luZ0VsZW1lbnQgPT09IG51bGxcbiAgICAgICkge1xuICAgICAgICBjb25zdCBzaGFwZSA9IGZpbmRTaGFwZUJ5S2V5KGV2ZW50LmtleSk7XG4gICAgICAgIGlmIChzaGFwZSkge1xuICAgICAgICAgIGlmICh0aGlzLnN0YXRlLmFjdGl2ZVRvb2wudHlwZSAhPT0gc2hhcGUpIHtcbiAgICAgICAgICAgIHRyYWNrRXZlbnQoXG4gICAgICAgICAgICAgIFwidG9vbGJhclwiLFxuICAgICAgICAgICAgICBzaGFwZSxcbiAgICAgICAgICAgICAgYGtleWJvYXJkICgke3RoaXMuZGV2aWNlLmlzTW9iaWxlID8gXCJtb2JpbGVcIiA6IFwiZGVza3RvcFwifSlgLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5zZXRBY3RpdmVUb29sKHsgdHlwZTogc2hhcGUgfSk7XG4gICAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIH0gZWxzZSBpZiAoZXZlbnQua2V5ID09PSBLRVlTLlEpIHtcbiAgICAgICAgICB0aGlzLnRvZ2dsZUxvY2soXCJrZXlib2FyZFwiKTtcbiAgICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGV2ZW50LmtleSA9PT0gS0VZUy5TUEFDRSAmJiBnZXN0dXJlLnBvaW50ZXJzLnNpemUgPT09IDApIHtcbiAgICAgICAgaXNIb2xkaW5nU3BhY2UgPSB0cnVlO1xuICAgICAgICBzZXRDdXJzb3IodGhpcy5jYW52YXMsIENVUlNPUl9UWVBFLkdSQUJCSU5HKTtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIH1cblxuICAgICAgaWYgKFxuICAgICAgICAoZXZlbnQua2V5ID09PSBLRVlTLkcgfHwgZXZlbnQua2V5ID09PSBLRVlTLlMpICYmXG4gICAgICAgICFldmVudC5hbHRLZXkgJiZcbiAgICAgICAgIWV2ZW50W0tFWVMuQ1RSTF9PUl9DTURdXG4gICAgICApIHtcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWRFbGVtZW50cyA9IGdldFNlbGVjdGVkRWxlbWVudHMoXG4gICAgICAgICAgdGhpcy5zY2VuZS5nZXROb25EZWxldGVkRWxlbWVudHMoKSxcbiAgICAgICAgICB0aGlzLnN0YXRlLFxuICAgICAgICApO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgdGhpcy5zdGF0ZS5hY3RpdmVUb29sLnR5cGUgPT09IFwic2VsZWN0aW9uXCIgJiZcbiAgICAgICAgICAhc2VsZWN0ZWRFbGVtZW50cy5sZW5ndGhcbiAgICAgICAgKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKFxuICAgICAgICAgIGV2ZW50LmtleSA9PT0gS0VZUy5HICYmXG4gICAgICAgICAgKGhhc0JhY2tncm91bmQodGhpcy5zdGF0ZS5hY3RpdmVUb29sLnR5cGUpIHx8XG4gICAgICAgICAgICBzZWxlY3RlZEVsZW1lbnRzLnNvbWUoKGVsZW1lbnQpID0+IGhhc0JhY2tncm91bmQoZWxlbWVudC50eXBlKSkpXG4gICAgICAgICkge1xuICAgICAgICAgIHRoaXMuc2V0U3RhdGUoeyBvcGVuUG9wdXA6IFwiYmFja2dyb3VuZENvbG9yUGlja2VyXCIgfSk7XG4gICAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGV2ZW50LmtleSA9PT0gS0VZUy5TKSB7XG4gICAgICAgICAgdGhpcy5zZXRTdGF0ZSh7IG9wZW5Qb3B1cDogXCJzdHJva2VDb2xvclBpY2tlclwiIH0pO1xuICAgICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcbiAgKTtcblxuICBwcml2YXRlIG9uV2hlZWwgPSB3aXRoQmF0Y2hlZFVwZGF0ZXMoKGV2ZW50OiBXaGVlbEV2ZW50KSA9PiB7XG4gICAgLy8gcHJldmVudCBicm93c2VyIHBpbmNoIHpvb20gb24gRE9NIGVsZW1lbnRzXG4gICAgaWYgKCEoZXZlbnQudGFyZ2V0IGluc3RhbmNlb2YgSFRNTENhbnZhc0VsZW1lbnQpICYmIGV2ZW50LmN0cmxLZXkpIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgfVxuICB9KTtcblxuICBwcml2YXRlIG9uS2V5VXAgPSB3aXRoQmF0Y2hlZFVwZGF0ZXMoKGV2ZW50OiBLZXlib2FyZEV2ZW50KSA9PiB7XG4gICAgaWYgKGV2ZW50LmtleSA9PT0gS0VZUy5TUEFDRSkge1xuICAgICAgaWYgKHRoaXMuc3RhdGUudmlld01vZGVFbmFibGVkKSB7XG4gICAgICAgIHNldEN1cnNvcih0aGlzLmNhbnZhcywgQ1VSU09SX1RZUEUuR1JBQik7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMuc3RhdGUuYWN0aXZlVG9vbC50eXBlID09PSBcInNlbGVjdGlvblwiKSB7XG4gICAgICAgIHJlc2V0Q3Vyc29yKHRoaXMuY2FudmFzKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNldEN1cnNvckZvclNoYXBlKHRoaXMuY2FudmFzLCB0aGlzLnN0YXRlKTtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgc2VsZWN0ZWRFbGVtZW50SWRzOiB7fSxcbiAgICAgICAgICBzZWxlY3RlZEdyb3VwSWRzOiB7fSxcbiAgICAgICAgICBlZGl0aW5nR3JvdXBJZDogbnVsbCxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBpc0hvbGRpbmdTcGFjZSA9IGZhbHNlO1xuICAgIH1cbiAgICBpZiAoIWV2ZW50W0tFWVMuQ1RSTF9PUl9DTURdICYmICF0aGlzLnN0YXRlLmlzQmluZGluZ0VuYWJsZWQpIHtcbiAgICAgIHRoaXMuc2V0U3RhdGUoeyBpc0JpbmRpbmdFbmFibGVkOiB0cnVlIH0pO1xuICAgIH1cbiAgICBpZiAoaXNBcnJvd0tleShldmVudC5rZXkpKSB7XG4gICAgICBjb25zdCBzZWxlY3RlZEVsZW1lbnRzID0gZ2V0U2VsZWN0ZWRFbGVtZW50cyhcbiAgICAgICAgdGhpcy5zY2VuZS5nZXROb25EZWxldGVkRWxlbWVudHMoKSxcbiAgICAgICAgdGhpcy5zdGF0ZSxcbiAgICAgICk7XG4gICAgICBpc0JpbmRpbmdFbmFibGVkKHRoaXMuc3RhdGUpXG4gICAgICAgID8gYmluZE9yVW5iaW5kU2VsZWN0ZWRFbGVtZW50cyhzZWxlY3RlZEVsZW1lbnRzKVxuICAgICAgICA6IHVuYmluZExpbmVhckVsZW1lbnRzKHNlbGVjdGVkRWxlbWVudHMpO1xuICAgICAgdGhpcy5zZXRTdGF0ZSh7IHN1Z2dlc3RlZEJpbmRpbmdzOiBbXSB9KTtcbiAgICB9XG4gIH0pO1xuXG4gIHByaXZhdGUgc2V0QWN0aXZlVG9vbCA9IChcbiAgICB0b29sOlxuICAgICAgfCB7IHR5cGU6IHR5cGVvZiBTSEFQRVNbbnVtYmVyXVtcInZhbHVlXCJdIHwgXCJlcmFzZXJcIiB9XG4gICAgICB8IHsgdHlwZTogXCJjdXN0b21cIjsgY3VzdG9tVHlwZTogc3RyaW5nIH0sXG4gICkgPT4ge1xuICAgIGNvbnN0IG5leHRBY3RpdmVUb29sID0gdXBkYXRlQWN0aXZlVG9vbCh0aGlzLnN0YXRlLCB0b29sKTtcbiAgICBpZiAoIWlzSG9sZGluZ1NwYWNlKSB7XG4gICAgICBzZXRDdXJzb3JGb3JTaGFwZSh0aGlzLmNhbnZhcywgdGhpcy5zdGF0ZSk7XG4gICAgfVxuICAgIGlmIChpc1Rvb2xJY29uKGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQpKSB7XG4gICAgICB0aGlzLmZvY3VzQ29udGFpbmVyKCk7XG4gICAgfVxuICAgIGlmICghaXNMaW5lYXJFbGVtZW50VHlwZShuZXh0QWN0aXZlVG9vbC50eXBlKSkge1xuICAgICAgdGhpcy5zZXRTdGF0ZSh7IHN1Z2dlc3RlZEJpbmRpbmdzOiBbXSB9KTtcbiAgICB9XG4gICAgaWYgKG5leHRBY3RpdmVUb29sLnR5cGUgPT09IFwiaW1hZ2VcIikge1xuICAgICAgdGhpcy5vbkltYWdlQWN0aW9uKCk7XG4gICAgfVxuICAgIGlmIChuZXh0QWN0aXZlVG9vbC50eXBlICE9PSBcInNlbGVjdGlvblwiKSB7XG4gICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgYWN0aXZlVG9vbDogbmV4dEFjdGl2ZVRvb2wsXG4gICAgICAgIHNlbGVjdGVkRWxlbWVudElkczoge30sXG4gICAgICAgIHNlbGVjdGVkR3JvdXBJZHM6IHt9LFxuICAgICAgICBlZGl0aW5nR3JvdXBJZDogbnVsbCxcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnNldFN0YXRlKHsgYWN0aXZlVG9vbDogbmV4dEFjdGl2ZVRvb2wgfSk7XG4gICAgfVxuICB9O1xuXG4gIHByaXZhdGUgc2V0Q3Vyc29yID0gKGN1cnNvcjogc3RyaW5nKSA9PiB7XG4gICAgc2V0Q3Vyc29yKHRoaXMuY2FudmFzLCBjdXJzb3IpO1xuICB9O1xuXG4gIHByaXZhdGUgcmVzZXRDdXJzb3IgPSAoKSA9PiB7XG4gICAgcmVzZXRDdXJzb3IodGhpcy5jYW52YXMpO1xuICB9O1xuICAvKipcbiAgICogcmV0dXJucyB3aGV0aGVyIHVzZXIgaXMgbWFraW5nIGEgZ2VzdHVyZSB3aXRoID49IDIgZmluZ2VycyAocG9pbnRzKVxuICAgKiBvbiBvIHRvdWNoIHNjcmVlbiAobm90IG9uIGEgdHJhY2twYWQpLiBDdXJyZW50bHkgb25seSByZWxhdGVzIHRvIERhcndpblxuICAgKiAoaU9TL2lQYWRPUyxNYWNPUyksIGJ1dCBtYXkgd29yayBvbiBvdGhlciBkZXZpY2VzIGluIHRoZSBmdXR1cmUgaWZcbiAgICogR2VzdHVyZUV2ZW50IGlzIHN0YW5kYXJkaXplZC5cbiAgICovXG4gIHByaXZhdGUgaXNUb3VjaFNjcmVlbk11bHRpVG91Y2hHZXN0dXJlID0gKCkgPT4ge1xuICAgIC8vIHdlIGRvbid0IHdhbnQgdG8gZGVzZWxlY3Qgd2hlbiB1c2luZyB0cmFja3BhZCwgYW5kIG11bHRpLXBvaW50IGdlc3R1cmVzXG4gICAgLy8gb25seSB3b3JrIG9uIHRvdWNoIHNjcmVlbnMsIHNvIGNoZWNraW5nIGZvciA+PSBwb2ludGVycyBtZWFucyB3ZSdyZSBvbiBhXG4gICAgLy8gdG91Y2hzY3JlZW5cbiAgICByZXR1cm4gZ2VzdHVyZS5wb2ludGVycy5zaXplID49IDI7XG4gIH07XG5cbiAgLy8gZmlyZXMgb25seSBvbiBTYWZhcmlcbiAgcHJpdmF0ZSBvbkdlc3R1cmVTdGFydCA9IHdpdGhCYXRjaGVkVXBkYXRlcygoZXZlbnQ6IEdlc3R1cmVFdmVudCkgPT4ge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICAvLyB3ZSBvbmx5IHdhbnQgdG8gZGVzZWxlY3Qgb24gdG91Y2ggc2NyZWVucyBiZWNhdXNlIHVzZXIgbWF5IGhhdmUgc2VsZWN0ZWRcbiAgICAvLyBlbGVtZW50cyBieSBtaXN0YWtlIHdoaWxlIHpvb21pbmdcbiAgICBpZiAodGhpcy5pc1RvdWNoU2NyZWVuTXVsdGlUb3VjaEdlc3R1cmUoKSkge1xuICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgIHNlbGVjdGVkRWxlbWVudElkczoge30sXG4gICAgICB9KTtcbiAgICB9XG4gICAgZ2VzdHVyZS5pbml0aWFsU2NhbGUgPSB0aGlzLnN0YXRlLnpvb20udmFsdWU7XG4gIH0pO1xuXG4gIC8vIGZpcmVzIG9ubHkgb24gU2FmYXJpXG4gIHByaXZhdGUgb25HZXN0dXJlQ2hhbmdlID0gd2l0aEJhdGNoZWRVcGRhdGVzKChldmVudDogR2VzdHVyZUV2ZW50KSA9PiB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuICAgIC8vIG9uR2VzdHVyZUNoYW5nZSBvbmx5IGhhcyB6b29tIGZhY3RvciBidXQgbm90IHRoZSBjZW50ZXIuXG4gICAgLy8gSWYgd2UncmUgb24gaVBhZCBvciBpUGhvbmUsIHRoZW4gd2UgcmVjb2duaXplIG11bHRpLXRvdWNoIGFuZCB3aWxsXG4gICAgLy8gem9vbSBpbiBhdCB0aGUgcmlnaHQgbG9jYXRpb24gaW4gdGhlIHRvdWNobW92ZSBoYW5kbGVyXG4gICAgLy8gKGhhbmRsZUNhbnZhc1BvaW50ZXJNb3ZlKS5cbiAgICAvL1xuICAgIC8vIE9uIE1hY2Jvb2sgdHJhY2twYWQsIHdlIGRvbid0IGhhdmUgdGhvc2UgZXZlbnRzIHNvIHdpbGwgem9vbSBpbiBhdCB0aGVcbiAgICAvLyBjdXJyZW50IGxvY2F0aW9uIGluc3RlYWQuXG4gICAgLy9cbiAgICAvLyBBcyBzdWNoLCBiYWlsIGZyb20gdGhpcyBoYW5kbGVyIG9uIHRvdWNoIGRldmljZXMuXG4gICAgaWYgKHRoaXMuaXNUb3VjaFNjcmVlbk11bHRpVG91Y2hHZXN0dXJlKCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBpbml0aWFsU2NhbGUgPSBnZXN0dXJlLmluaXRpYWxTY2FsZTtcbiAgICBpZiAoaW5pdGlhbFNjYWxlKSB7XG4gICAgICB0aGlzLnNldFN0YXRlKChzdGF0ZSkgPT4gKHtcbiAgICAgICAgLi4uZ2V0U3RhdGVGb3Jab29tKFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHZpZXdwb3J0WDogY3Vyc29yWCxcbiAgICAgICAgICAgIHZpZXdwb3J0WTogY3Vyc29yWSxcbiAgICAgICAgICAgIG5leHRab29tOiBnZXROb3JtYWxpemVkWm9vbShpbml0aWFsU2NhbGUgKiBldmVudC5zY2FsZSksXG4gICAgICAgICAgfSxcbiAgICAgICAgICBzdGF0ZSxcbiAgICAgICAgKSxcbiAgICAgIH0pKTtcbiAgICB9XG4gIH0pO1xuXG4gIC8vIGZpcmVzIG9ubHkgb24gU2FmYXJpXG4gIHByaXZhdGUgb25HZXN0dXJlRW5kID0gd2l0aEJhdGNoZWRVcGRhdGVzKChldmVudDogR2VzdHVyZUV2ZW50KSA9PiB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAvLyByZXNlbGVjdCBlbGVtZW50cyBvbmx5IG9uIHRvdWNoIHNjcmVlbnMgKHNlZSBvbkdlc3R1cmVTdGFydClcbiAgICBpZiAodGhpcy5pc1RvdWNoU2NyZWVuTXVsdGlUb3VjaEdlc3R1cmUoKSkge1xuICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgIHByZXZpb3VzU2VsZWN0ZWRFbGVtZW50SWRzOiB7fSxcbiAgICAgICAgc2VsZWN0ZWRFbGVtZW50SWRzOiB0aGlzLnN0YXRlLnByZXZpb3VzU2VsZWN0ZWRFbGVtZW50SWRzLFxuICAgICAgfSk7XG4gICAgfVxuICAgIGdlc3R1cmUuaW5pdGlhbFNjYWxlID0gbnVsbDtcbiAgfSk7XG5cbiAgcHJpdmF0ZSBoYW5kbGVUZXh0V3lzaXd5ZyhcbiAgICBlbGVtZW50OiBFeGNhbGlkcmF3VGV4dEVsZW1lbnQsXG4gICAge1xuICAgICAgaXNFeGlzdGluZ0VsZW1lbnQgPSBmYWxzZSxcbiAgICB9OiB7XG4gICAgICBpc0V4aXN0aW5nRWxlbWVudD86IGJvb2xlYW47XG4gICAgfSxcbiAgKSB7XG4gICAgY29uc3QgdXBkYXRlRWxlbWVudCA9IChcbiAgICAgIHRleHQ6IHN0cmluZyxcbiAgICAgIG9yaWdpbmFsVGV4dDogc3RyaW5nLFxuICAgICAgaXNEZWxldGVkOiBib29sZWFuLFxuICAgICkgPT4ge1xuICAgICAgdGhpcy5zY2VuZS5yZXBsYWNlQWxsRWxlbWVudHMoW1xuICAgICAgICAuLi50aGlzLnNjZW5lLmdldEVsZW1lbnRzSW5jbHVkaW5nRGVsZXRlZCgpLm1hcCgoX2VsZW1lbnQpID0+IHtcbiAgICAgICAgICBpZiAoX2VsZW1lbnQuaWQgPT09IGVsZW1lbnQuaWQgJiYgaXNUZXh0RWxlbWVudChfZWxlbWVudCkpIHtcbiAgICAgICAgICAgIHJldHVybiB1cGRhdGVUZXh0RWxlbWVudChfZWxlbWVudCwge1xuICAgICAgICAgICAgICB0ZXh0LFxuICAgICAgICAgICAgICBpc0RlbGV0ZWQsXG4gICAgICAgICAgICAgIG9yaWdpbmFsVGV4dCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gX2VsZW1lbnQ7XG4gICAgICAgIH0pLFxuICAgICAgXSk7XG4gICAgfTtcblxuICAgIHRleHRXeXNpd3lnKHtcbiAgICAgIGlkOiBlbGVtZW50LmlkLFxuICAgICAgY2FudmFzOiB0aGlzLmNhbnZhcyxcbiAgICAgIGdldFZpZXdwb3J0Q29vcmRzOiAoeCwgeSkgPT4ge1xuICAgICAgICBjb25zdCB7IHg6IHZpZXdwb3J0WCwgeTogdmlld3BvcnRZIH0gPSBzY2VuZUNvb3Jkc1RvVmlld3BvcnRDb29yZHMoXG4gICAgICAgICAge1xuICAgICAgICAgICAgc2NlbmVYOiB4LFxuICAgICAgICAgICAgc2NlbmVZOiB5LFxuICAgICAgICAgIH0sXG4gICAgICAgICAgdGhpcy5zdGF0ZSxcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICB2aWV3cG9ydFggLSB0aGlzLnN0YXRlLm9mZnNldExlZnQsXG4gICAgICAgICAgdmlld3BvcnRZIC0gdGhpcy5zdGF0ZS5vZmZzZXRUb3AsXG4gICAgICAgIF07XG4gICAgICB9LFxuICAgICAgb25DaGFuZ2U6IHdpdGhCYXRjaGVkVXBkYXRlcygodGV4dCkgPT4ge1xuICAgICAgICB1cGRhdGVFbGVtZW50KHRleHQsIHRleHQsIGZhbHNlKTtcbiAgICAgICAgaWYgKGlzTm9uRGVsZXRlZEVsZW1lbnQoZWxlbWVudCkpIHtcbiAgICAgICAgICB1cGRhdGVCb3VuZEVsZW1lbnRzKGVsZW1lbnQpO1xuICAgICAgICB9XG4gICAgICB9KSxcbiAgICAgIG9uU3VibWl0OiB3aXRoQmF0Y2hlZFVwZGF0ZXMoKHsgdGV4dCwgdmlhS2V5Ym9hcmQsIG9yaWdpbmFsVGV4dCB9KSA9PiB7XG4gICAgICAgIGNvbnN0IGlzRGVsZXRlZCA9ICF0ZXh0LnRyaW0oKTtcbiAgICAgICAgdXBkYXRlRWxlbWVudCh0ZXh0LCBvcmlnaW5hbFRleHQsIGlzRGVsZXRlZCk7XG4gICAgICAgIC8vIHNlbGVjdCB0aGUgY3JlYXRlZCB0ZXh0IGVsZW1lbnQgb25seSBpZiBzdWJtaXR0aW5nIHZpYSBrZXlib2FyZFxuICAgICAgICAvLyAod2hlbiBzdWJtaXR0aW5nIHZpYSBjbGljayBpdCBzaG91bGQgYWN0IGFzIHNpZ25hbCB0byBkZXNlbGVjdClcbiAgICAgICAgaWYgKCFpc0RlbGV0ZWQgJiYgdmlhS2V5Ym9hcmQpIHtcbiAgICAgICAgICBjb25zdCBlbGVtZW50SWRUb1NlbGVjdCA9IGVsZW1lbnQuY29udGFpbmVySWRcbiAgICAgICAgICAgID8gZWxlbWVudC5jb250YWluZXJJZFxuICAgICAgICAgICAgOiBlbGVtZW50LmlkO1xuICAgICAgICAgIHRoaXMuc2V0U3RhdGUoKHByZXZTdGF0ZSkgPT4gKHtcbiAgICAgICAgICAgIHNlbGVjdGVkRWxlbWVudElkczoge1xuICAgICAgICAgICAgICAuLi5wcmV2U3RhdGUuc2VsZWN0ZWRFbGVtZW50SWRzLFxuICAgICAgICAgICAgICBbZWxlbWVudElkVG9TZWxlY3RdOiB0cnVlLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9KSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlzRGVsZXRlZCkge1xuICAgICAgICAgIGZpeEJpbmRpbmdzQWZ0ZXJEZWxldGlvbih0aGlzLnNjZW5lLmdldE5vbkRlbGV0ZWRFbGVtZW50cygpLCBbXG4gICAgICAgICAgICBlbGVtZW50LFxuICAgICAgICAgIF0pO1xuICAgICAgICB9XG4gICAgICAgIGlmICghaXNEZWxldGVkIHx8IGlzRXhpc3RpbmdFbGVtZW50KSB7XG4gICAgICAgICAgdGhpcy5oaXN0b3J5LnJlc3VtZVJlY29yZGluZygpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgZHJhZ2dpbmdFbGVtZW50OiBudWxsLFxuICAgICAgICAgIGVkaXRpbmdFbGVtZW50OiBudWxsLFxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKHRoaXMuc3RhdGUuYWN0aXZlVG9vbC5sb2NrZWQpIHtcbiAgICAgICAgICBzZXRDdXJzb3JGb3JTaGFwZSh0aGlzLmNhbnZhcywgdGhpcy5zdGF0ZSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmZvY3VzQ29udGFpbmVyKCk7XG4gICAgICB9KSxcbiAgICAgIGVsZW1lbnQsXG4gICAgICBleGNhbGlkcmF3Q29udGFpbmVyOiB0aGlzLmV4Y2FsaWRyYXdDb250YWluZXJSZWYuY3VycmVudCxcbiAgICAgIGFwcDogdGhpcyxcbiAgICB9KTtcbiAgICAvLyBkZXNlbGVjdCBhbGwgb3RoZXIgZWxlbWVudHMgd2hlbiBpbnNlcnRpbmcgdGV4dFxuICAgIHRoaXMuZGVzZWxlY3RFbGVtZW50cygpO1xuXG4gICAgLy8gZG8gYW4gaW5pdGlhbCB1cGRhdGUgdG8gcmUtaW5pdGlhbGl6ZSBlbGVtZW50IHBvc2l0aW9uIHNpbmNlIHdlIHdlcmVcbiAgICAvLyBtb2RpZnlpbmcgZWxlbWVudCdzIHgveSBmb3Igc2FrZSBvZiBlZGl0b3IgKGNhc2U6IHN5bmNpbmcgdG8gcmVtb3RlKVxuICAgIHVwZGF0ZUVsZW1lbnQoZWxlbWVudC50ZXh0LCBlbGVtZW50Lm9yaWdpbmFsVGV4dCwgZmFsc2UpO1xuICB9XG5cbiAgcHJpdmF0ZSBkZXNlbGVjdEVsZW1lbnRzKCkge1xuICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgc2VsZWN0ZWRFbGVtZW50SWRzOiB7fSxcbiAgICAgIHNlbGVjdGVkR3JvdXBJZHM6IHt9LFxuICAgICAgZWRpdGluZ0dyb3VwSWQ6IG51bGwsXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGdldFRleHRFbGVtZW50QXRQb3NpdGlvbihcbiAgICB4OiBudW1iZXIsXG4gICAgeTogbnVtYmVyLFxuICApOiBOb25EZWxldGVkPEV4Y2FsaWRyYXdUZXh0RWxlbWVudD4gfCBudWxsIHtcbiAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5nZXRFbGVtZW50QXRQb3NpdGlvbih4LCB5LCB7XG4gICAgICBpbmNsdWRlQm91bmRUZXh0RWxlbWVudDogdHJ1ZSxcbiAgICB9KTtcblxuICAgIGlmIChlbGVtZW50ICYmIGlzVGV4dEVsZW1lbnQoZWxlbWVudCkgJiYgIWVsZW1lbnQuaXNEZWxldGVkKSB7XG4gICAgICByZXR1cm4gZWxlbWVudDtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBwcml2YXRlIGdldEVsZW1lbnRBdFBvc2l0aW9uKFxuICAgIHg6IG51bWJlcixcbiAgICB5OiBudW1iZXIsXG4gICAgb3B0cz86IHtcbiAgICAgIC8qKiBpZiB0cnVlLCByZXR1cm5zIHRoZSBmaXJzdCBzZWxlY3RlZCBlbGVtZW50ICh3aXRoIGhpZ2hlc3Qgei1pbmRleClcbiAgICAgICAgb2YgYWxsIGhpdCBlbGVtZW50cyAqL1xuICAgICAgcHJlZmVyU2VsZWN0ZWQ/OiBib29sZWFuO1xuICAgICAgaW5jbHVkZUJvdW5kVGV4dEVsZW1lbnQ/OiBib29sZWFuO1xuICAgICAgaW5jbHVkZUxvY2tlZEVsZW1lbnRzPzogYm9vbGVhbjtcbiAgICB9LFxuICApOiBOb25EZWxldGVkPEV4Y2FsaWRyYXdFbGVtZW50PiB8IG51bGwge1xuICAgIGNvbnN0IGFsbEhpdEVsZW1lbnRzID0gdGhpcy5nZXRFbGVtZW50c0F0UG9zaXRpb24oXG4gICAgICB4LFxuICAgICAgeSxcbiAgICAgIG9wdHM/LmluY2x1ZGVCb3VuZFRleHRFbGVtZW50LFxuICAgICAgb3B0cz8uaW5jbHVkZUxvY2tlZEVsZW1lbnRzLFxuICAgICk7XG4gICAgaWYgKGFsbEhpdEVsZW1lbnRzLmxlbmd0aCA+IDEpIHtcbiAgICAgIGlmIChvcHRzPy5wcmVmZXJTZWxlY3RlZCkge1xuICAgICAgICBmb3IgKGxldCBpbmRleCA9IGFsbEhpdEVsZW1lbnRzLmxlbmd0aCAtIDE7IGluZGV4ID4gLTE7IGluZGV4LS0pIHtcbiAgICAgICAgICBpZiAodGhpcy5zdGF0ZS5zZWxlY3RlZEVsZW1lbnRJZHNbYWxsSGl0RWxlbWVudHNbaW5kZXhdLmlkXSkge1xuICAgICAgICAgICAgcmV0dXJuIGFsbEhpdEVsZW1lbnRzW2luZGV4XTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGNvbnN0IGVsZW1lbnRXaXRoSGlnaGVzdFpJbmRleCA9XG4gICAgICAgIGFsbEhpdEVsZW1lbnRzW2FsbEhpdEVsZW1lbnRzLmxlbmd0aCAtIDFdO1xuICAgICAgLy8gSWYgd2UncmUgaGl0dGluZyBlbGVtZW50IHdpdGggaGlnaGVzdCB6LWluZGV4IG9ubHkgb24gaXRzIGJvdW5kaW5nIGJveFxuICAgICAgLy8gd2hpbGUgYWxzbyBoaXR0aW5nIG90aGVyIGVsZW1lbnQgZmlndXJlLCB0aGUgbGF0dGVyIHNob3VsZCBiZSBjb25zaWRlcmVkLlxuICAgICAgcmV0dXJuIGlzSGl0dGluZ0VsZW1lbnRCb3VuZGluZ0JveFdpdGhvdXRIaXR0aW5nRWxlbWVudChcbiAgICAgICAgZWxlbWVudFdpdGhIaWdoZXN0WkluZGV4LFxuICAgICAgICB0aGlzLnN0YXRlLFxuICAgICAgICB4LFxuICAgICAgICB5LFxuICAgICAgKVxuICAgICAgICA/IGFsbEhpdEVsZW1lbnRzW2FsbEhpdEVsZW1lbnRzLmxlbmd0aCAtIDJdXG4gICAgICAgIDogZWxlbWVudFdpdGhIaWdoZXN0WkluZGV4O1xuICAgIH1cbiAgICBpZiAoYWxsSGl0RWxlbWVudHMubGVuZ3RoID09PSAxKSB7XG4gICAgICByZXR1cm4gYWxsSGl0RWxlbWVudHNbMF07XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRFbGVtZW50c0F0UG9zaXRpb24oXG4gICAgeDogbnVtYmVyLFxuICAgIHk6IG51bWJlcixcbiAgICBpbmNsdWRlQm91bmRUZXh0RWxlbWVudDogYm9vbGVhbiA9IGZhbHNlLFxuICAgIGluY2x1ZGVMb2NrZWRFbGVtZW50czogYm9vbGVhbiA9IGZhbHNlLFxuICApOiBOb25EZWxldGVkPEV4Y2FsaWRyYXdFbGVtZW50PltdIHtcbiAgICBjb25zdCBlbGVtZW50cyA9XG4gICAgICBpbmNsdWRlQm91bmRUZXh0RWxlbWVudCAmJiBpbmNsdWRlTG9ja2VkRWxlbWVudHNcbiAgICAgICAgPyB0aGlzLnNjZW5lLmdldE5vbkRlbGV0ZWRFbGVtZW50cygpXG4gICAgICAgIDogdGhpcy5zY2VuZVxuICAgICAgICAgICAgLmdldE5vbkRlbGV0ZWRFbGVtZW50cygpXG4gICAgICAgICAgICAuZmlsdGVyKFxuICAgICAgICAgICAgICAoZWxlbWVudCkgPT5cbiAgICAgICAgICAgICAgICAoaW5jbHVkZUxvY2tlZEVsZW1lbnRzIHx8ICFlbGVtZW50LmxvY2tlZCkgJiZcbiAgICAgICAgICAgICAgICAoaW5jbHVkZUJvdW5kVGV4dEVsZW1lbnQgfHxcbiAgICAgICAgICAgICAgICAgICEoaXNUZXh0RWxlbWVudChlbGVtZW50KSAmJiBlbGVtZW50LmNvbnRhaW5lcklkKSksXG4gICAgICAgICAgICApO1xuXG4gICAgcmV0dXJuIGdldEVsZW1lbnRzQXRQb3NpdGlvbihlbGVtZW50cywgKGVsZW1lbnQpID0+XG4gICAgICBoaXRUZXN0KGVsZW1lbnQsIHRoaXMuc3RhdGUsIHgsIHkpLFxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIHN0YXJ0VGV4dEVkaXRpbmcgPSAoe1xuICAgIHNjZW5lWCxcbiAgICBzY2VuZVksXG4gICAgc2hvdWxkQmluZCxcbiAgICBpbnNlcnRBdFBhcmVudENlbnRlciA9IHRydWUsXG4gIH06IHtcbiAgICAvKiogWCBwb3NpdGlvbiB0byBpbnNlcnQgdGV4dCBhdCAqL1xuICAgIHNjZW5lWDogbnVtYmVyO1xuICAgIC8qKiBZIHBvc2l0aW9uIHRvIGluc2VydCB0ZXh0IGF0ICovXG4gICAgc2NlbmVZOiBudW1iZXI7XG4gICAgc2hvdWxkQmluZDogYm9vbGVhbjtcbiAgICAvKiogd2hldGhlciB0byBhdHRlbXB0IHRvIGluc2VydCBhdCBlbGVtZW50IGNlbnRlciBpZiBhcHBsaWNhYmxlICovXG4gICAgaW5zZXJ0QXRQYXJlbnRDZW50ZXI/OiBib29sZWFuO1xuICB9KSA9PiB7XG4gICAgbGV0IHBhcmVudENlbnRlclBvc2l0aW9uID1cbiAgICAgIGluc2VydEF0UGFyZW50Q2VudGVyICYmXG4gICAgICB0aGlzLmdldFRleHRXeXNpd3lnU25hcHBlZFRvQ2VudGVyUG9zaXRpb24oXG4gICAgICAgIHNjZW5lWCxcbiAgICAgICAgc2NlbmVZLFxuICAgICAgICB0aGlzLnN0YXRlLFxuICAgICAgICB0aGlzLmNhbnZhcyxcbiAgICAgICAgd2luZG93LmRldmljZVBpeGVsUmF0aW8sXG4gICAgICApO1xuXG4gICAgbGV0IGV4aXN0aW5nVGV4dEVsZW1lbnQ6IE5vbkRlbGV0ZWQ8RXhjYWxpZHJhd1RleHRFbGVtZW50PiB8IG51bGwgPSBudWxsO1xuICAgIGxldCBjb250YWluZXI6IEV4Y2FsaWRyYXdUZXh0Q29udGFpbmVyIHwgbnVsbCA9IG51bGw7XG5cbiAgICBjb25zdCBzZWxlY3RlZEVsZW1lbnRzID0gZ2V0U2VsZWN0ZWRFbGVtZW50cyhcbiAgICAgIHRoaXMuc2NlbmUuZ2V0Tm9uRGVsZXRlZEVsZW1lbnRzKCksXG4gICAgICB0aGlzLnN0YXRlLFxuICAgICk7XG5cbiAgICBpZiAoc2VsZWN0ZWRFbGVtZW50cy5sZW5ndGggPT09IDEpIHtcbiAgICAgIGlmIChpc1RleHRFbGVtZW50KHNlbGVjdGVkRWxlbWVudHNbMF0pKSB7XG4gICAgICAgIGV4aXN0aW5nVGV4dEVsZW1lbnQgPSBzZWxlY3RlZEVsZW1lbnRzWzBdO1xuICAgICAgfSBlbHNlIGlmIChpc1RleHRCaW5kYWJsZUNvbnRhaW5lcihzZWxlY3RlZEVsZW1lbnRzWzBdLCBmYWxzZSkpIHtcbiAgICAgICAgZXhpc3RpbmdUZXh0RWxlbWVudCA9IGdldEJvdW5kVGV4dEVsZW1lbnQoc2VsZWN0ZWRFbGVtZW50c1swXSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBleGlzdGluZ1RleHRFbGVtZW50ID0gdGhpcy5nZXRUZXh0RWxlbWVudEF0UG9zaXRpb24oc2NlbmVYLCBzY2VuZVkpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBleGlzdGluZ1RleHRFbGVtZW50ID0gdGhpcy5nZXRUZXh0RWxlbWVudEF0UG9zaXRpb24oc2NlbmVYLCBzY2VuZVkpO1xuICAgIH1cblxuICAgIC8vIGJpbmQgdG8gY29udGFpbmVyIHdoZW4gc2hvdWxkQmluZCBpcyB0cnVlIG9yXG4gICAgLy8gY2xpY2tlZCBvbiBjZW50ZXIgb2YgY29udGFpbmVyXG4gICAgaWYgKFxuICAgICAgIWNvbnRhaW5lciAmJlxuICAgICAgIWV4aXN0aW5nVGV4dEVsZW1lbnQgJiZcbiAgICAgIChzaG91bGRCaW5kIHx8IHBhcmVudENlbnRlclBvc2l0aW9uKVxuICAgICkge1xuICAgICAgY29udGFpbmVyID0gZ2V0VGV4dEJpbmRhYmxlQ29udGFpbmVyQXRQb3NpdGlvbihcbiAgICAgICAgdGhpcy5zY2VuZVxuICAgICAgICAgIC5nZXROb25EZWxldGVkRWxlbWVudHMoKVxuICAgICAgICAgIC5maWx0ZXIoXG4gICAgICAgICAgICAoZWxlKSA9PlxuICAgICAgICAgICAgICBpc1RleHRCaW5kYWJsZUNvbnRhaW5lcihlbGUsIGZhbHNlKSAmJiAhZ2V0Qm91bmRUZXh0RWxlbWVudChlbGUpLFxuICAgICAgICAgICksXG4gICAgICAgIHNjZW5lWCxcbiAgICAgICAgc2NlbmVZLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAoIWV4aXN0aW5nVGV4dEVsZW1lbnQgJiYgY29udGFpbmVyKSB7XG4gICAgICBjb25zdCBmb250U3RyaW5nID0ge1xuICAgICAgICBmb250U2l6ZTogdGhpcy5zdGF0ZS5jdXJyZW50SXRlbUZvbnRTaXplLFxuICAgICAgICBmb250RmFtaWx5OiB0aGlzLnN0YXRlLmN1cnJlbnRJdGVtRm9udEZhbWlseSxcbiAgICAgIH07XG4gICAgICBjb25zdCBtaW5XaWR0aCA9IGdldEFwcHJveE1pbkxpbmVXaWR0aChnZXRGb250U3RyaW5nKGZvbnRTdHJpbmcpKTtcbiAgICAgIGNvbnN0IG1pbkhlaWdodCA9IGdldEFwcHJveE1pbkxpbmVIZWlnaHQoZ2V0Rm9udFN0cmluZyhmb250U3RyaW5nKSk7XG4gICAgICBjb25zdCBuZXdIZWlnaHQgPSBNYXRoLm1heChjb250YWluZXIuaGVpZ2h0LCBtaW5IZWlnaHQpO1xuICAgICAgY29uc3QgbmV3V2lkdGggPSBNYXRoLm1heChjb250YWluZXIud2lkdGgsIG1pbldpZHRoKTtcbiAgICAgIG11dGF0ZUVsZW1lbnQoY29udGFpbmVyLCB7IGhlaWdodDogbmV3SGVpZ2h0LCB3aWR0aDogbmV3V2lkdGggfSk7XG4gICAgICBzY2VuZVggPSBjb250YWluZXIueCArIG5ld1dpZHRoIC8gMjtcbiAgICAgIHNjZW5lWSA9IGNvbnRhaW5lci55ICsgbmV3SGVpZ2h0IC8gMjtcbiAgICAgIGlmIChwYXJlbnRDZW50ZXJQb3NpdGlvbikge1xuICAgICAgICBwYXJlbnRDZW50ZXJQb3NpdGlvbiA9IHRoaXMuZ2V0VGV4dFd5c2l3eWdTbmFwcGVkVG9DZW50ZXJQb3NpdGlvbihcbiAgICAgICAgICBzY2VuZVgsXG4gICAgICAgICAgc2NlbmVZLFxuICAgICAgICAgIHRoaXMuc3RhdGUsXG4gICAgICAgICAgdGhpcy5jYW52YXMsXG4gICAgICAgICAgd2luZG93LmRldmljZVBpeGVsUmF0aW8sXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgZWxlbWVudCA9IGV4aXN0aW5nVGV4dEVsZW1lbnRcbiAgICAgID8gZXhpc3RpbmdUZXh0RWxlbWVudFxuICAgICAgOiBuZXdUZXh0RWxlbWVudCh7XG4gICAgICAgICAgeDogcGFyZW50Q2VudGVyUG9zaXRpb25cbiAgICAgICAgICAgID8gcGFyZW50Q2VudGVyUG9zaXRpb24uZWxlbWVudENlbnRlclhcbiAgICAgICAgICAgIDogc2NlbmVYLFxuICAgICAgICAgIHk6IHBhcmVudENlbnRlclBvc2l0aW9uXG4gICAgICAgICAgICA/IHBhcmVudENlbnRlclBvc2l0aW9uLmVsZW1lbnRDZW50ZXJZXG4gICAgICAgICAgICA6IHNjZW5lWSxcbiAgICAgICAgICBzdHJva2VDb2xvcjogdGhpcy5zdGF0ZS5jdXJyZW50SXRlbVN0cm9rZUNvbG9yLFxuICAgICAgICAgIGJhY2tncm91bmRDb2xvcjogdGhpcy5zdGF0ZS5jdXJyZW50SXRlbUJhY2tncm91bmRDb2xvcixcbiAgICAgICAgICBmaWxsU3R5bGU6IHRoaXMuc3RhdGUuY3VycmVudEl0ZW1GaWxsU3R5bGUsXG4gICAgICAgICAgc3Ryb2tlV2lkdGg6IHRoaXMuc3RhdGUuY3VycmVudEl0ZW1TdHJva2VXaWR0aCxcbiAgICAgICAgICBzdHJva2VTdHlsZTogdGhpcy5zdGF0ZS5jdXJyZW50SXRlbVN0cm9rZVN0eWxlLFxuICAgICAgICAgIHJvdWdobmVzczogdGhpcy5zdGF0ZS5jdXJyZW50SXRlbVJvdWdobmVzcyxcbiAgICAgICAgICBvcGFjaXR5OiB0aGlzLnN0YXRlLmN1cnJlbnRJdGVtT3BhY2l0eSxcbiAgICAgICAgICBzdHJva2VTaGFycG5lc3M6IHRoaXMuc3RhdGUuY3VycmVudEl0ZW1TdHJva2VTaGFycG5lc3MsXG4gICAgICAgICAgdGV4dDogXCJcIixcbiAgICAgICAgICBmb250U2l6ZTogdGhpcy5zdGF0ZS5jdXJyZW50SXRlbUZvbnRTaXplLFxuICAgICAgICAgIGZvbnRGYW1pbHk6IHRoaXMuc3RhdGUuY3VycmVudEl0ZW1Gb250RmFtaWx5LFxuICAgICAgICAgIHRleHRBbGlnbjogcGFyZW50Q2VudGVyUG9zaXRpb25cbiAgICAgICAgICAgID8gXCJjZW50ZXJcIlxuICAgICAgICAgICAgOiB0aGlzLnN0YXRlLmN1cnJlbnRJdGVtVGV4dEFsaWduLFxuICAgICAgICAgIHZlcnRpY2FsQWxpZ246IHBhcmVudENlbnRlclBvc2l0aW9uXG4gICAgICAgICAgICA/IFZFUlRJQ0FMX0FMSUdOLk1JRERMRVxuICAgICAgICAgICAgOiBERUZBVUxUX1ZFUlRJQ0FMX0FMSUdOLFxuICAgICAgICAgIGNvbnRhaW5lcklkOiBjb250YWluZXI/LmlkID8/IHVuZGVmaW5lZCxcbiAgICAgICAgICBncm91cElkczogY29udGFpbmVyPy5ncm91cElkcyA/PyBbXSxcbiAgICAgICAgICBsb2NrZWQ6IGZhbHNlLFxuICAgICAgICB9KTtcblxuICAgIHRoaXMuc2V0U3RhdGUoeyBlZGl0aW5nRWxlbWVudDogZWxlbWVudCB9KTtcblxuICAgIGlmICghZXhpc3RpbmdUZXh0RWxlbWVudCkge1xuICAgICAgdGhpcy5zY2VuZS5yZXBsYWNlQWxsRWxlbWVudHMoW1xuICAgICAgICAuLi50aGlzLnNjZW5lLmdldEVsZW1lbnRzSW5jbHVkaW5nRGVsZXRlZCgpLFxuICAgICAgICBlbGVtZW50LFxuICAgICAgXSk7XG5cbiAgICAgIC8vIGNhc2U6IGNyZWF0aW5nIG5ldyB0ZXh0IG5vdCBjZW50ZXJlZCB0byBwYXJlbnQgZWxlbWVudCDihpIgb2Zmc2V0IFlcbiAgICAgIC8vIHNvIHRoYXQgdGhlIHRleHQgaXMgY2VudGVyZWQgdG8gY3Vyc29yIHBvc2l0aW9uXG4gICAgICBpZiAoIXBhcmVudENlbnRlclBvc2l0aW9uKSB7XG4gICAgICAgIG11dGF0ZUVsZW1lbnQoZWxlbWVudCwge1xuICAgICAgICAgIHk6IGVsZW1lbnQueSAtIGVsZW1lbnQuYmFzZWxpbmUgLyAyLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgIGVkaXRpbmdFbGVtZW50OiBlbGVtZW50LFxuICAgIH0pO1xuXG4gICAgdGhpcy5oYW5kbGVUZXh0V3lzaXd5ZyhlbGVtZW50LCB7XG4gICAgICBpc0V4aXN0aW5nRWxlbWVudDogISFleGlzdGluZ1RleHRFbGVtZW50LFxuICAgIH0pO1xuICB9O1xuXG4gIHByaXZhdGUgaGFuZGxlQ2FudmFzRG91YmxlQ2xpY2sgPSAoXG4gICAgZXZlbnQ6IFJlYWN0Lk1vdXNlRXZlbnQ8SFRNTENhbnZhc0VsZW1lbnQ+LFxuICApID0+IHtcbiAgICAvLyBjYXNlOiBkb3VibGUtY2xpY2tpbmcgd2l0aCBhcnJvdy9saW5lIHRvb2wgc2VsZWN0ZWQgd291bGQgYm90aCBjcmVhdGVcbiAgICAvLyB0ZXh0IGFuZCBlbnRlciBtdWx0aUVsZW1lbnQgbW9kZVxuICAgIGlmICh0aGlzLnN0YXRlLm11bHRpRWxlbWVudCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyB3ZSBzaG91bGQgb25seSBiZSBhYmxlIHRvIGRvdWJsZSBjbGljayB3aGVuIG1vZGUgaXMgc2VsZWN0aW9uXG4gICAgaWYgKHRoaXMuc3RhdGUuYWN0aXZlVG9vbC50eXBlICE9PSBcInNlbGVjdGlvblwiKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgc2VsZWN0ZWRFbGVtZW50cyA9IGdldFNlbGVjdGVkRWxlbWVudHMoXG4gICAgICB0aGlzLnNjZW5lLmdldE5vbkRlbGV0ZWRFbGVtZW50cygpLFxuICAgICAgdGhpcy5zdGF0ZSxcbiAgICApO1xuXG4gICAgaWYgKHNlbGVjdGVkRWxlbWVudHMubGVuZ3RoID09PSAxICYmIGlzTGluZWFyRWxlbWVudChzZWxlY3RlZEVsZW1lbnRzWzBdKSkge1xuICAgICAgaWYgKFxuICAgICAgICAhdGhpcy5zdGF0ZS5lZGl0aW5nTGluZWFyRWxlbWVudCB8fFxuICAgICAgICB0aGlzLnN0YXRlLmVkaXRpbmdMaW5lYXJFbGVtZW50LmVsZW1lbnRJZCAhPT0gc2VsZWN0ZWRFbGVtZW50c1swXS5pZFxuICAgICAgKSB7XG4gICAgICAgIHRoaXMuaGlzdG9yeS5yZXN1bWVSZWNvcmRpbmcoKTtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgZWRpdGluZ0xpbmVhckVsZW1lbnQ6IG5ldyBMaW5lYXJFbGVtZW50RWRpdG9yKFxuICAgICAgICAgICAgc2VsZWN0ZWRFbGVtZW50c1swXSxcbiAgICAgICAgICAgIHRoaXMuc2NlbmUsXG4gICAgICAgICAgKSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgcmVzZXRDdXJzb3IodGhpcy5jYW52YXMpO1xuXG4gICAgbGV0IHsgeDogc2NlbmVYLCB5OiBzY2VuZVkgfSA9IHZpZXdwb3J0Q29vcmRzVG9TY2VuZUNvb3JkcyhcbiAgICAgIGV2ZW50LFxuICAgICAgdGhpcy5zdGF0ZSxcbiAgICApO1xuXG4gICAgY29uc3Qgc2VsZWN0ZWRHcm91cElkcyA9IGdldFNlbGVjdGVkR3JvdXBJZHModGhpcy5zdGF0ZSk7XG5cbiAgICBpZiAoc2VsZWN0ZWRHcm91cElkcy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBoaXRFbGVtZW50ID0gdGhpcy5nZXRFbGVtZW50QXRQb3NpdGlvbihzY2VuZVgsIHNjZW5lWSk7XG5cbiAgICAgIGNvbnN0IHNlbGVjdGVkR3JvdXBJZCA9XG4gICAgICAgIGhpdEVsZW1lbnQgJiZcbiAgICAgICAgZ2V0U2VsZWN0ZWRHcm91cElkRm9yRWxlbWVudChoaXRFbGVtZW50LCB0aGlzLnN0YXRlLnNlbGVjdGVkR3JvdXBJZHMpO1xuXG4gICAgICBpZiAoc2VsZWN0ZWRHcm91cElkKSB7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoKHByZXZTdGF0ZSkgPT5cbiAgICAgICAgICBzZWxlY3RHcm91cHNGb3JTZWxlY3RlZEVsZW1lbnRzKFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAuLi5wcmV2U3RhdGUsXG4gICAgICAgICAgICAgIGVkaXRpbmdHcm91cElkOiBzZWxlY3RlZEdyb3VwSWQsXG4gICAgICAgICAgICAgIHNlbGVjdGVkRWxlbWVudElkczogeyBbaGl0RWxlbWVudCEuaWRdOiB0cnVlIH0sXG4gICAgICAgICAgICAgIHNlbGVjdGVkR3JvdXBJZHM6IHt9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHRoaXMuc2NlbmUuZ2V0Tm9uRGVsZXRlZEVsZW1lbnRzKCksXG4gICAgICAgICAgKSxcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJlc2V0Q3Vyc29yKHRoaXMuY2FudmFzKTtcbiAgICBpZiAoIWV2ZW50W0tFWVMuQ1RSTF9PUl9DTURdICYmICF0aGlzLnN0YXRlLnZpZXdNb2RlRW5hYmxlZCkge1xuICAgICAgY29uc3Qgc2VsZWN0ZWRFbGVtZW50cyA9IGdldFNlbGVjdGVkRWxlbWVudHMoXG4gICAgICAgIHRoaXMuc2NlbmUuZ2V0Tm9uRGVsZXRlZEVsZW1lbnRzKCksXG4gICAgICAgIHRoaXMuc3RhdGUsXG4gICAgICApO1xuICAgICAgaWYgKHNlbGVjdGVkRWxlbWVudHMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgIGNvbnN0IHNlbGVjdGVkRWxlbWVudCA9IHNlbGVjdGVkRWxlbWVudHNbMF07XG4gICAgICAgIGNvbnN0IGNhbkJpbmRUZXh0ID0gaGFzQm91bmRUZXh0RWxlbWVudChzZWxlY3RlZEVsZW1lbnQpO1xuICAgICAgICBpZiAoY2FuQmluZFRleHQpIHtcbiAgICAgICAgICBzY2VuZVggPSBzZWxlY3RlZEVsZW1lbnQueCArIHNlbGVjdGVkRWxlbWVudC53aWR0aCAvIDI7XG4gICAgICAgICAgc2NlbmVZID0gc2VsZWN0ZWRFbGVtZW50LnkgKyBzZWxlY3RlZEVsZW1lbnQuaGVpZ2h0IC8gMjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdGhpcy5zdGFydFRleHRFZGl0aW5nKHtcbiAgICAgICAgc2NlbmVYLFxuICAgICAgICBzY2VuZVksXG4gICAgICAgIHNob3VsZEJpbmQ6IGZhbHNlLFxuICAgICAgICBpbnNlcnRBdFBhcmVudENlbnRlcjogIWV2ZW50LmFsdEtleSxcbiAgICAgIH0pO1xuICAgIH1cbiAgfTtcblxuICBwcml2YXRlIGdldEVsZW1lbnRMaW5rQXRQb3NpdGlvbiA9IChcbiAgICBzY2VuZVBvaW50ZXI6IFJlYWRvbmx5PHsgeDogbnVtYmVyOyB5OiBudW1iZXIgfT4sXG4gICAgaGl0RWxlbWVudDogTm9uRGVsZXRlZEV4Y2FsaWRyYXdFbGVtZW50IHwgbnVsbCxcbiAgKTogRXhjYWxpZHJhd0VsZW1lbnQgfCB1bmRlZmluZWQgPT4ge1xuICAgIC8vIFJldmVyc2luZyBzbyB3ZSB0cmF2ZXJzZSB0aGUgZWxlbWVudHMgaW4gZGVjcmVhc2luZyBvcmRlclxuICAgIC8vIG9mIHotaW5kZXhcbiAgICBjb25zdCBlbGVtZW50cyA9IHRoaXMuc2NlbmUuZ2V0Tm9uRGVsZXRlZEVsZW1lbnRzKCkuc2xpY2UoKS5yZXZlcnNlKCk7XG4gICAgbGV0IGhpdEVsZW1lbnRJbmRleCA9IEluZmluaXR5O1xuXG4gICAgcmV0dXJuIGVsZW1lbnRzLmZpbmQoKGVsZW1lbnQsIGluZGV4KSA9PiB7XG4gICAgICBpZiAoaGl0RWxlbWVudCAmJiBlbGVtZW50LmlkID09PSBoaXRFbGVtZW50LmlkKSB7XG4gICAgICAgIGhpdEVsZW1lbnRJbmRleCA9IGluZGV4O1xuICAgICAgfVxuICAgICAgcmV0dXJuIChcbiAgICAgICAgZWxlbWVudC5saW5rICYmXG4gICAgICAgIGluZGV4IDw9IGhpdEVsZW1lbnRJbmRleCAmJlxuICAgICAgICBpc1BvaW50SGl0dGluZ0xpbmtJY29uKFxuICAgICAgICAgIGVsZW1lbnQsXG4gICAgICAgICAgdGhpcy5zdGF0ZSxcbiAgICAgICAgICBbc2NlbmVQb2ludGVyLngsIHNjZW5lUG9pbnRlci55XSxcbiAgICAgICAgICB0aGlzLmRldmljZS5pc01vYmlsZSxcbiAgICAgICAgKVxuICAgICAgKTtcbiAgICB9KTtcbiAgfTtcblxuICBwcml2YXRlIHJlZGlyZWN0VG9MaW5rID0gKFxuICAgIGV2ZW50OiBSZWFjdC5Qb2ludGVyRXZlbnQ8SFRNTENhbnZhc0VsZW1lbnQ+LFxuICAgIGlzVG91Y2hTY3JlZW46IGJvb2xlYW4sXG4gICkgPT4ge1xuICAgIGNvbnN0IGRyYWdnZWREaXN0YW5jZSA9IGRpc3RhbmNlMmQoXG4gICAgICB0aGlzLmxhc3RQb2ludGVyRG93biEuY2xpZW50WCxcbiAgICAgIHRoaXMubGFzdFBvaW50ZXJEb3duIS5jbGllbnRZLFxuICAgICAgdGhpcy5sYXN0UG9pbnRlclVwIS5jbGllbnRYLFxuICAgICAgdGhpcy5sYXN0UG9pbnRlclVwIS5jbGllbnRZLFxuICAgICk7XG4gICAgaWYgKFxuICAgICAgIXRoaXMuaGl0TGlua0VsZW1lbnQgfHxcbiAgICAgIC8vIEZvciB0b3VjaCBzY3JlZW4gYWxsb3cgZHJhZ2dpbmcgdGhyZXNob2xkIGVsc2Ugc3RyaWN0IGNoZWNrXG4gICAgICAoaXNUb3VjaFNjcmVlbiAmJiBkcmFnZ2VkRGlzdGFuY2UgPiBEUkFHR0lOR19USFJFU0hPTEQpIHx8XG4gICAgICAoIWlzVG91Y2hTY3JlZW4gJiYgZHJhZ2dlZERpc3RhbmNlICE9PSAwKVxuICAgICkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBsYXN0UG9pbnRlckRvd25Db29yZHMgPSB2aWV3cG9ydENvb3Jkc1RvU2NlbmVDb29yZHMoXG4gICAgICB0aGlzLmxhc3RQb2ludGVyRG93biEsXG4gICAgICB0aGlzLnN0YXRlLFxuICAgICk7XG4gICAgY29uc3QgbGFzdFBvaW50ZXJEb3duSGl0dGluZ0xpbmtJY29uID0gaXNQb2ludEhpdHRpbmdMaW5rSWNvbihcbiAgICAgIHRoaXMuaGl0TGlua0VsZW1lbnQsXG4gICAgICB0aGlzLnN0YXRlLFxuICAgICAgW2xhc3RQb2ludGVyRG93bkNvb3Jkcy54LCBsYXN0UG9pbnRlckRvd25Db29yZHMueV0sXG4gICAgICB0aGlzLmRldmljZS5pc01vYmlsZSxcbiAgICApO1xuICAgIGNvbnN0IGxhc3RQb2ludGVyVXBDb29yZHMgPSB2aWV3cG9ydENvb3Jkc1RvU2NlbmVDb29yZHMoXG4gICAgICB0aGlzLmxhc3RQb2ludGVyVXAhLFxuICAgICAgdGhpcy5zdGF0ZSxcbiAgICApO1xuICAgIGNvbnN0IGxhc3RQb2ludGVyVXBIaXR0aW5nTGlua0ljb24gPSBpc1BvaW50SGl0dGluZ0xpbmtJY29uKFxuICAgICAgdGhpcy5oaXRMaW5rRWxlbWVudCxcbiAgICAgIHRoaXMuc3RhdGUsXG4gICAgICBbbGFzdFBvaW50ZXJVcENvb3Jkcy54LCBsYXN0UG9pbnRlclVwQ29vcmRzLnldLFxuICAgICAgdGhpcy5kZXZpY2UuaXNNb2JpbGUsXG4gICAgKTtcbiAgICBpZiAobGFzdFBvaW50ZXJEb3duSGl0dGluZ0xpbmtJY29uICYmIGxhc3RQb2ludGVyVXBIaXR0aW5nTGlua0ljb24pIHtcbiAgICAgIGNvbnN0IHVybCA9IHRoaXMuaGl0TGlua0VsZW1lbnQubGluaztcbiAgICAgIGlmICh1cmwpIHtcbiAgICAgICAgbGV0IGN1c3RvbUV2ZW50O1xuICAgICAgICBpZiAodGhpcy5wcm9wcy5vbkxpbmtPcGVuKSB7XG4gICAgICAgICAgY3VzdG9tRXZlbnQgPSB3cmFwRXZlbnQoRVZFTlQuRVhDQUxJRFJBV19MSU5LLCBldmVudC5uYXRpdmVFdmVudCk7XG4gICAgICAgICAgdGhpcy5wcm9wcy5vbkxpbmtPcGVuKHRoaXMuaGl0TGlua0VsZW1lbnQsIGN1c3RvbUV2ZW50KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWN1c3RvbUV2ZW50Py5kZWZhdWx0UHJldmVudGVkKSB7XG4gICAgICAgICAgY29uc3QgdGFyZ2V0ID0gaXNMb2NhbExpbmsodXJsKSA/IFwiX3NlbGZcIiA6IFwiX2JsYW5rXCI7XG4gICAgICAgICAgY29uc3QgbmV3V2luZG93ID0gd2luZG93Lm9wZW4odW5kZWZpbmVkLCB0YXJnZXQpO1xuICAgICAgICAgIC8vIGh0dHBzOi8vbWF0aGlhc2J5bmVucy5naXRodWIuaW8vcmVsLW5vb3BlbmVyL1xuICAgICAgICAgIGlmIChuZXdXaW5kb3cpIHtcbiAgICAgICAgICAgIG5ld1dpbmRvdy5vcGVuZXIgPSBudWxsO1xuICAgICAgICAgICAgbmV3V2luZG93LmxvY2F0aW9uID0gbm9ybWFsaXplTGluayh1cmwpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICBwcml2YXRlIGhhbmRsZUNhbnZhc1BvaW50ZXJNb3ZlID0gKFxuICAgIGV2ZW50OiBSZWFjdC5Qb2ludGVyRXZlbnQ8SFRNTENhbnZhc0VsZW1lbnQ+LFxuICApID0+IHtcbiAgICB0aGlzLnNhdmVQb2ludGVyKGV2ZW50LmNsaWVudFgsIGV2ZW50LmNsaWVudFksIHRoaXMuc3RhdGUuY3Vyc29yQnV0dG9uKTtcbiAgICBpZiAoZ2VzdHVyZS5wb2ludGVycy5oYXMoZXZlbnQucG9pbnRlcklkKSkge1xuICAgICAgZ2VzdHVyZS5wb2ludGVycy5zZXQoZXZlbnQucG9pbnRlcklkLCB7XG4gICAgICAgIHg6IGV2ZW50LmNsaWVudFgsXG4gICAgICAgIHk6IGV2ZW50LmNsaWVudFksXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBjb25zdCBpbml0aWFsU2NhbGUgPSBnZXN0dXJlLmluaXRpYWxTY2FsZTtcbiAgICBpZiAoXG4gICAgICBnZXN0dXJlLnBvaW50ZXJzLnNpemUgPT09IDIgJiZcbiAgICAgIGdlc3R1cmUubGFzdENlbnRlciAmJlxuICAgICAgaW5pdGlhbFNjYWxlICYmXG4gICAgICBnZXN0dXJlLmluaXRpYWxEaXN0YW5jZVxuICAgICkge1xuICAgICAgY29uc3QgY2VudGVyID0gZ2V0Q2VudGVyKGdlc3R1cmUucG9pbnRlcnMpO1xuICAgICAgY29uc3QgZGVsdGFYID0gY2VudGVyLnggLSBnZXN0dXJlLmxhc3RDZW50ZXIueDtcbiAgICAgIGNvbnN0IGRlbHRhWSA9IGNlbnRlci55IC0gZ2VzdHVyZS5sYXN0Q2VudGVyLnk7XG4gICAgICBnZXN0dXJlLmxhc3RDZW50ZXIgPSBjZW50ZXI7XG5cbiAgICAgIGNvbnN0IGRpc3RhbmNlID0gZ2V0RGlzdGFuY2UoQXJyYXkuZnJvbShnZXN0dXJlLnBvaW50ZXJzLnZhbHVlcygpKSk7XG4gICAgICBjb25zdCBzY2FsZUZhY3RvciA9XG4gICAgICAgIHRoaXMuc3RhdGUuYWN0aXZlVG9vbC50eXBlID09PSBcImZyZWVkcmF3XCIgJiYgdGhpcy5zdGF0ZS5wZW5Nb2RlXG4gICAgICAgICAgPyAxXG4gICAgICAgICAgOiBkaXN0YW5jZSAvIGdlc3R1cmUuaW5pdGlhbERpc3RhbmNlO1xuXG4gICAgICBjb25zdCBuZXh0Wm9vbSA9IHNjYWxlRmFjdG9yXG4gICAgICAgID8gZ2V0Tm9ybWFsaXplZFpvb20oaW5pdGlhbFNjYWxlICogc2NhbGVGYWN0b3IpXG4gICAgICAgIDogdGhpcy5zdGF0ZS56b29tLnZhbHVlO1xuXG4gICAgICB0aGlzLnNldFN0YXRlKChzdGF0ZSkgPT4ge1xuICAgICAgICBjb25zdCB6b29tU3RhdGUgPSBnZXRTdGF0ZUZvclpvb20oXG4gICAgICAgICAge1xuICAgICAgICAgICAgdmlld3BvcnRYOiBjZW50ZXIueCxcbiAgICAgICAgICAgIHZpZXdwb3J0WTogY2VudGVyLnksXG4gICAgICAgICAgICBuZXh0Wm9vbSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHN0YXRlLFxuICAgICAgICApO1xuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgem9vbTogem9vbVN0YXRlLnpvb20sXG4gICAgICAgICAgc2Nyb2xsWDogem9vbVN0YXRlLnNjcm9sbFggKyBkZWx0YVggLyBuZXh0Wm9vbSxcbiAgICAgICAgICBzY3JvbGxZOiB6b29tU3RhdGUuc2Nyb2xsWSArIGRlbHRhWSAvIG5leHRab29tLFxuICAgICAgICAgIHNob3VsZENhY2hlSWdub3JlWm9vbTogdHJ1ZSxcbiAgICAgICAgfTtcbiAgICAgIH0pO1xuICAgICAgdGhpcy5yZXNldFNob3VsZENhY2hlSWdub3JlWm9vbURlYm91bmNlZCgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBnZXN0dXJlLmxhc3RDZW50ZXIgPVxuICAgICAgICBnZXN0dXJlLmluaXRpYWxEaXN0YW5jZSA9XG4gICAgICAgIGdlc3R1cmUuaW5pdGlhbFNjYWxlID1cbiAgICAgICAgICBudWxsO1xuICAgIH1cblxuICAgIGlmIChpc0hvbGRpbmdTcGFjZSB8fCBpc1Bhbm5pbmcgfHwgaXNEcmFnZ2luZ1Njcm9sbEJhcikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGlzUG9pbnRlck92ZXJTY3JvbGxCYXJzID0gaXNPdmVyU2Nyb2xsQmFycyhcbiAgICAgIGN1cnJlbnRTY3JvbGxCYXJzLFxuICAgICAgZXZlbnQuY2xpZW50WCAtIHRoaXMuc3RhdGUub2Zmc2V0TGVmdCxcbiAgICAgIGV2ZW50LmNsaWVudFkgLSB0aGlzLnN0YXRlLm9mZnNldFRvcCxcbiAgICApO1xuICAgIGNvbnN0IGlzT3ZlclNjcm9sbEJhciA9IGlzUG9pbnRlck92ZXJTY3JvbGxCYXJzLmlzT3ZlckVpdGhlcjtcbiAgICBpZiAoIXRoaXMuc3RhdGUuZHJhZ2dpbmdFbGVtZW50ICYmICF0aGlzLnN0YXRlLm11bHRpRWxlbWVudCkge1xuICAgICAgaWYgKGlzT3ZlclNjcm9sbEJhcikge1xuICAgICAgICByZXNldEN1cnNvcih0aGlzLmNhbnZhcyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzZXRDdXJzb3JGb3JTaGFwZSh0aGlzLmNhbnZhcywgdGhpcy5zdGF0ZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3Qgc2NlbmVQb2ludGVyID0gdmlld3BvcnRDb29yZHNUb1NjZW5lQ29vcmRzKGV2ZW50LCB0aGlzLnN0YXRlKTtcbiAgICBjb25zdCB7IHg6IHNjZW5lUG9pbnRlclgsIHk6IHNjZW5lUG9pbnRlclkgfSA9IHNjZW5lUG9pbnRlcjtcblxuICAgIGlmIChcbiAgICAgIHRoaXMuc3RhdGUuZWRpdGluZ0xpbmVhckVsZW1lbnQgJiZcbiAgICAgICF0aGlzLnN0YXRlLmVkaXRpbmdMaW5lYXJFbGVtZW50LmlzRHJhZ2dpbmdcbiAgICApIHtcbiAgICAgIGNvbnN0IGVkaXRpbmdMaW5lYXJFbGVtZW50ID0gTGluZWFyRWxlbWVudEVkaXRvci5oYW5kbGVQb2ludGVyTW92ZShcbiAgICAgICAgZXZlbnQsXG4gICAgICAgIHNjZW5lUG9pbnRlclgsXG4gICAgICAgIHNjZW5lUG9pbnRlclksXG4gICAgICAgIHRoaXMuc3RhdGUuZWRpdGluZ0xpbmVhckVsZW1lbnQsXG4gICAgICAgIHRoaXMuc3RhdGUuZ3JpZFNpemUsXG4gICAgICApO1xuICAgICAgaWYgKGVkaXRpbmdMaW5lYXJFbGVtZW50ICE9PSB0aGlzLnN0YXRlLmVkaXRpbmdMaW5lYXJFbGVtZW50KSB7XG4gICAgICAgIC8vIFNpbmNlIHdlIGFyZSByZWFkaW5nIGZyb20gcHJldmlvdXMgc3RhdGUgd2hpY2ggaXMgbm90IHBvc3NpYmxlIHdpdGhcbiAgICAgICAgLy8gYXV0b21hdGljIGJhdGNoaW5nIGluIFJlYWN0IDE4IGhlbmNlIHVzaW5nIGZsdXNoIHN5bmMgdG8gc3luY2hyb25vdXNseVxuICAgICAgICAvLyB1cGRhdGUgdGhlIHN0YXRlLiBDaGVjayBodHRwczovL2dpdGh1Yi5jb20vZXhjYWxpZHJhdy9leGNhbGlkcmF3L3B1bGwvNTUwOCBmb3IgbW9yZSBkZXRhaWxzLlxuICAgICAgICBmbHVzaFN5bmMoKCkgPT4ge1xuICAgICAgICAgIHRoaXMuc2V0U3RhdGUoeyBlZGl0aW5nTGluZWFyRWxlbWVudCB9KTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBpZiAoZWRpdGluZ0xpbmVhckVsZW1lbnQubGFzdFVuY29tbWl0dGVkUG9pbnQgIT0gbnVsbCkge1xuICAgICAgICB0aGlzLm1heWJlU3VnZ2VzdEJpbmRpbmdBdEN1cnNvcihzY2VuZVBvaW50ZXIpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7IHN1Z2dlc3RlZEJpbmRpbmdzOiBbXSB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoaXNCaW5kaW5nRWxlbWVudFR5cGUodGhpcy5zdGF0ZS5hY3RpdmVUb29sLnR5cGUpKSB7XG4gICAgICAvLyBIb3ZlcmluZyB3aXRoIGEgc2VsZWN0ZWQgdG9vbCBvciBjcmVhdGluZyBuZXcgbGluZWFyIGVsZW1lbnQgdmlhIGNsaWNrXG4gICAgICAvLyBhbmQgcG9pbnRcbiAgICAgIGNvbnN0IHsgZHJhZ2dpbmdFbGVtZW50IH0gPSB0aGlzLnN0YXRlO1xuICAgICAgaWYgKGlzQmluZGluZ0VsZW1lbnQoZHJhZ2dpbmdFbGVtZW50LCBmYWxzZSkpIHtcbiAgICAgICAgdGhpcy5tYXliZVN1Z2dlc3RCaW5kaW5nc0ZvckxpbmVhckVsZW1lbnRBdENvb3JkcyhcbiAgICAgICAgICBkcmFnZ2luZ0VsZW1lbnQsXG4gICAgICAgICAgW3NjZW5lUG9pbnRlcl0sXG4gICAgICAgICAgdGhpcy5zdGF0ZS5zdGFydEJvdW5kRWxlbWVudCxcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMubWF5YmVTdWdnZXN0QmluZGluZ0F0Q3Vyc29yKHNjZW5lUG9pbnRlcik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuc3RhdGUubXVsdGlFbGVtZW50KSB7XG4gICAgICBjb25zdCB7IG11bHRpRWxlbWVudCB9ID0gdGhpcy5zdGF0ZTtcbiAgICAgIGNvbnN0IHsgeDogcngsIHk6IHJ5IH0gPSBtdWx0aUVsZW1lbnQ7XG5cbiAgICAgIGNvbnN0IHsgcG9pbnRzLCBsYXN0Q29tbWl0dGVkUG9pbnQgfSA9IG11bHRpRWxlbWVudDtcbiAgICAgIGNvbnN0IGxhc3RQb2ludCA9IHBvaW50c1twb2ludHMubGVuZ3RoIC0gMV07XG5cbiAgICAgIHNldEN1cnNvckZvclNoYXBlKHRoaXMuY2FudmFzLCB0aGlzLnN0YXRlKTtcblxuICAgICAgaWYgKGxhc3RQb2ludCA9PT0gbGFzdENvbW1pdHRlZFBvaW50KSB7XG4gICAgICAgIC8vIGlmIHdlIGhhdmVuJ3QgeWV0IGNyZWF0ZWQgYSB0ZW1wIHBvaW50IGFuZCB3ZSdyZSBiZXlvbmQgY29tbWl0LXpvbmVcbiAgICAgICAgLy8gdGhyZXNob2xkLCBhZGQgYSBwb2ludFxuICAgICAgICBpZiAoXG4gICAgICAgICAgZGlzdGFuY2UyZChcbiAgICAgICAgICAgIHNjZW5lUG9pbnRlclggLSByeCxcbiAgICAgICAgICAgIHNjZW5lUG9pbnRlclkgLSByeSxcbiAgICAgICAgICAgIGxhc3RQb2ludFswXSxcbiAgICAgICAgICAgIGxhc3RQb2ludFsxXSxcbiAgICAgICAgICApID49IExJTkVfQ09ORklSTV9USFJFU0hPTERcbiAgICAgICAgKSB7XG4gICAgICAgICAgbXV0YXRlRWxlbWVudChtdWx0aUVsZW1lbnQsIHtcbiAgICAgICAgICAgIHBvaW50czogWy4uLnBvaW50cywgW3NjZW5lUG9pbnRlclggLSByeCwgc2NlbmVQb2ludGVyWSAtIHJ5XV0sXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc2V0Q3Vyc29yKHRoaXMuY2FudmFzLCBDVVJTT1JfVFlQRS5QT0lOVEVSKTtcbiAgICAgICAgICAvLyBpbiB0aGlzIGJyYW5jaCwgd2UncmUgaW5zaWRlIHRoZSBjb21taXQgem9uZSwgYW5kIG5vIHVuY29tbWl0dGVkXG4gICAgICAgICAgLy8gcG9pbnQgZXhpc3RzLiBUaHVzIGRvIG5vdGhpbmcgKGRvbid0IGFkZC9yZW1vdmUgcG9pbnRzKS5cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgcG9pbnRzLmxlbmd0aCA+IDIgJiZcbiAgICAgICAgbGFzdENvbW1pdHRlZFBvaW50ICYmXG4gICAgICAgIGRpc3RhbmNlMmQoXG4gICAgICAgICAgc2NlbmVQb2ludGVyWCAtIHJ4LFxuICAgICAgICAgIHNjZW5lUG9pbnRlclkgLSByeSxcbiAgICAgICAgICBsYXN0Q29tbWl0dGVkUG9pbnRbMF0sXG4gICAgICAgICAgbGFzdENvbW1pdHRlZFBvaW50WzFdLFxuICAgICAgICApIDwgTElORV9DT05GSVJNX1RIUkVTSE9MRFxuICAgICAgKSB7XG4gICAgICAgIHNldEN1cnNvcih0aGlzLmNhbnZhcywgQ1VSU09SX1RZUEUuUE9JTlRFUik7XG4gICAgICAgIG11dGF0ZUVsZW1lbnQobXVsdGlFbGVtZW50LCB7XG4gICAgICAgICAgcG9pbnRzOiBwb2ludHMuc2xpY2UoMCwgLTEpLFxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IFtncmlkWCwgZ3JpZFldID0gZ2V0R3JpZFBvaW50KFxuICAgICAgICAgIHNjZW5lUG9pbnRlclgsXG4gICAgICAgICAgc2NlbmVQb2ludGVyWSxcbiAgICAgICAgICB0aGlzLnN0YXRlLmdyaWRTaXplLFxuICAgICAgICApO1xuXG4gICAgICAgIGNvbnN0IFtsYXN0Q29tbWl0dGVkWCwgbGFzdENvbW1pdHRlZFldID1cbiAgICAgICAgICBtdWx0aUVsZW1lbnQ/Lmxhc3RDb21taXR0ZWRQb2ludCA/PyBbMCwgMF07XG5cbiAgICAgICAgbGV0IGR4RnJvbUxhc3RDb21taXR0ZWQgPSBncmlkWCAtIHJ4IC0gbGFzdENvbW1pdHRlZFg7XG4gICAgICAgIGxldCBkeUZyb21MYXN0Q29tbWl0dGVkID0gZ3JpZFkgLSByeSAtIGxhc3RDb21taXR0ZWRZO1xuXG4gICAgICAgIGlmIChzaG91bGRSb3RhdGVXaXRoRGlzY3JldGVBbmdsZShldmVudCkpIHtcbiAgICAgICAgICAoeyB3aWR0aDogZHhGcm9tTGFzdENvbW1pdHRlZCwgaGVpZ2h0OiBkeUZyb21MYXN0Q29tbWl0dGVkIH0gPVxuICAgICAgICAgICAgZ2V0UGVyZmVjdEVsZW1lbnRTaXplKFxuICAgICAgICAgICAgICB0aGlzLnN0YXRlLmFjdGl2ZVRvb2wudHlwZSxcbiAgICAgICAgICAgICAgZHhGcm9tTGFzdENvbW1pdHRlZCxcbiAgICAgICAgICAgICAgZHlGcm9tTGFzdENvbW1pdHRlZCxcbiAgICAgICAgICAgICkpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGlzUGF0aEFMb29wKHBvaW50cywgdGhpcy5zdGF0ZS56b29tLnZhbHVlKSkge1xuICAgICAgICAgIHNldEN1cnNvcih0aGlzLmNhbnZhcywgQ1VSU09SX1RZUEUuUE9JTlRFUik7XG4gICAgICAgIH1cbiAgICAgICAgLy8gdXBkYXRlIGxhc3QgdW5jb21taXR0ZWQgcG9pbnRcbiAgICAgICAgbXV0YXRlRWxlbWVudChtdWx0aUVsZW1lbnQsIHtcbiAgICAgICAgICBwb2ludHM6IFtcbiAgICAgICAgICAgIC4uLnBvaW50cy5zbGljZSgwLCAtMSksXG4gICAgICAgICAgICBbXG4gICAgICAgICAgICAgIGxhc3RDb21taXR0ZWRYICsgZHhGcm9tTGFzdENvbW1pdHRlZCxcbiAgICAgICAgICAgICAgbGFzdENvbW1pdHRlZFkgKyBkeUZyb21MYXN0Q29tbWl0dGVkLFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICBdLFxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGhhc0Rlc2VsZWN0ZWRCdXR0b24gPSBCb29sZWFuKGV2ZW50LmJ1dHRvbnMpO1xuICAgIGlmIChcbiAgICAgIGhhc0Rlc2VsZWN0ZWRCdXR0b24gfHxcbiAgICAgICh0aGlzLnN0YXRlLmFjdGl2ZVRvb2wudHlwZSAhPT0gXCJzZWxlY3Rpb25cIiAmJlxuICAgICAgICB0aGlzLnN0YXRlLmFjdGl2ZVRvb2wudHlwZSAhPT0gXCJ0ZXh0XCIgJiZcbiAgICAgICAgdGhpcy5zdGF0ZS5hY3RpdmVUb29sLnR5cGUgIT09IFwiZXJhc2VyXCIpXG4gICAgKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgZWxlbWVudHMgPSB0aGlzLnNjZW5lLmdldE5vbkRlbGV0ZWRFbGVtZW50cygpO1xuXG4gICAgY29uc3Qgc2VsZWN0ZWRFbGVtZW50cyA9IGdldFNlbGVjdGVkRWxlbWVudHMoZWxlbWVudHMsIHRoaXMuc3RhdGUpO1xuICAgIGlmIChcbiAgICAgIHNlbGVjdGVkRWxlbWVudHMubGVuZ3RoID09PSAxICYmXG4gICAgICAhaXNPdmVyU2Nyb2xsQmFyICYmXG4gICAgICAhdGhpcy5zdGF0ZS5lZGl0aW5nTGluZWFyRWxlbWVudFxuICAgICkge1xuICAgICAgY29uc3QgZWxlbWVudFdpdGhUcmFuc2Zvcm1IYW5kbGVUeXBlID0gZ2V0RWxlbWVudFdpdGhUcmFuc2Zvcm1IYW5kbGVUeXBlKFxuICAgICAgICBlbGVtZW50cyxcbiAgICAgICAgdGhpcy5zdGF0ZSxcbiAgICAgICAgc2NlbmVQb2ludGVyWCxcbiAgICAgICAgc2NlbmVQb2ludGVyWSxcbiAgICAgICAgdGhpcy5zdGF0ZS56b29tLFxuICAgICAgICBldmVudC5wb2ludGVyVHlwZSxcbiAgICAgICk7XG4gICAgICBpZiAoXG4gICAgICAgIGVsZW1lbnRXaXRoVHJhbnNmb3JtSGFuZGxlVHlwZSAmJlxuICAgICAgICBlbGVtZW50V2l0aFRyYW5zZm9ybUhhbmRsZVR5cGUudHJhbnNmb3JtSGFuZGxlVHlwZVxuICAgICAgKSB7XG4gICAgICAgIHNldEN1cnNvcihcbiAgICAgICAgICB0aGlzLmNhbnZhcyxcbiAgICAgICAgICBnZXRDdXJzb3JGb3JSZXNpemluZ0VsZW1lbnQoZWxlbWVudFdpdGhUcmFuc2Zvcm1IYW5kbGVUeXBlKSxcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoc2VsZWN0ZWRFbGVtZW50cy5sZW5ndGggPiAxICYmICFpc092ZXJTY3JvbGxCYXIpIHtcbiAgICAgIGNvbnN0IHRyYW5zZm9ybUhhbmRsZVR5cGUgPSBnZXRUcmFuc2Zvcm1IYW5kbGVUeXBlRnJvbUNvb3JkcyhcbiAgICAgICAgZ2V0Q29tbW9uQm91bmRzKHNlbGVjdGVkRWxlbWVudHMpLFxuICAgICAgICBzY2VuZVBvaW50ZXJYLFxuICAgICAgICBzY2VuZVBvaW50ZXJZLFxuICAgICAgICB0aGlzLnN0YXRlLnpvb20sXG4gICAgICAgIGV2ZW50LnBvaW50ZXJUeXBlLFxuICAgICAgKTtcbiAgICAgIGlmICh0cmFuc2Zvcm1IYW5kbGVUeXBlKSB7XG4gICAgICAgIHNldEN1cnNvcihcbiAgICAgICAgICB0aGlzLmNhbnZhcyxcbiAgICAgICAgICBnZXRDdXJzb3JGb3JSZXNpemluZ0VsZW1lbnQoe1xuICAgICAgICAgICAgdHJhbnNmb3JtSGFuZGxlVHlwZSxcbiAgICAgICAgICB9KSxcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGhpdEVsZW1lbnQgPSB0aGlzLmdldEVsZW1lbnRBdFBvc2l0aW9uKFxuICAgICAgc2NlbmVQb2ludGVyLngsXG4gICAgICBzY2VuZVBvaW50ZXIueSxcbiAgICApO1xuICAgIHRoaXMuaGl0TGlua0VsZW1lbnQgPSB0aGlzLmdldEVsZW1lbnRMaW5rQXRQb3NpdGlvbihcbiAgICAgIHNjZW5lUG9pbnRlcixcbiAgICAgIGhpdEVsZW1lbnQsXG4gICAgKTtcbiAgICBpZiAoaXNFcmFzZXJBY3RpdmUodGhpcy5zdGF0ZSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKFxuICAgICAgdGhpcy5oaXRMaW5rRWxlbWVudCAmJlxuICAgICAgIXRoaXMuc3RhdGUuc2VsZWN0ZWRFbGVtZW50SWRzW3RoaXMuaGl0TGlua0VsZW1lbnQuaWRdXG4gICAgKSB7XG4gICAgICBzZXRDdXJzb3IodGhpcy5jYW52YXMsIENVUlNPUl9UWVBFLlBPSU5URVIpO1xuICAgICAgc2hvd0h5cGVybGlua1Rvb2x0aXAodGhpcy5oaXRMaW5rRWxlbWVudCwgdGhpcy5zdGF0ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGhpZGVIeXBlcmxpbmtUb29saXAoKTtcbiAgICAgIGlmIChcbiAgICAgICAgaGl0RWxlbWVudCAmJlxuICAgICAgICBoaXRFbGVtZW50LmxpbmsgJiZcbiAgICAgICAgdGhpcy5zdGF0ZS5zZWxlY3RlZEVsZW1lbnRJZHNbaGl0RWxlbWVudC5pZF0gJiZcbiAgICAgICAgIXRoaXMuY29udGV4dE1lbnVPcGVuICYmXG4gICAgICAgICF0aGlzLnN0YXRlLnNob3dIeXBlcmxpbmtQb3B1cFxuICAgICAgKSB7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoeyBzaG93SHlwZXJsaW5rUG9wdXA6IFwiaW5mb1wiIH0pO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLnN0YXRlLmFjdGl2ZVRvb2wudHlwZSA9PT0gXCJ0ZXh0XCIpIHtcbiAgICAgICAgc2V0Q3Vyc29yKFxuICAgICAgICAgIHRoaXMuY2FudmFzLFxuICAgICAgICAgIGlzVGV4dEVsZW1lbnQoaGl0RWxlbWVudCkgPyBDVVJTT1JfVFlQRS5URVhUIDogQ1VSU09SX1RZUEUuQ1JPU1NIQUlSLFxuICAgICAgICApO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLnN0YXRlLnZpZXdNb2RlRW5hYmxlZCkge1xuICAgICAgICBzZXRDdXJzb3IodGhpcy5jYW52YXMsIENVUlNPUl9UWVBFLkdSQUIpO1xuICAgICAgfSBlbHNlIGlmIChpc092ZXJTY3JvbGxCYXIpIHtcbiAgICAgICAgc2V0Q3Vyc29yKHRoaXMuY2FudmFzLCBDVVJTT1JfVFlQRS5BVVRPKTtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5zdGF0ZS5lZGl0aW5nTGluZWFyRWxlbWVudCkge1xuICAgICAgICBjb25zdCBlbGVtZW50ID0gTGluZWFyRWxlbWVudEVkaXRvci5nZXRFbGVtZW50KFxuICAgICAgICAgIHRoaXMuc3RhdGUuZWRpdGluZ0xpbmVhckVsZW1lbnQuZWxlbWVudElkLFxuICAgICAgICApO1xuXG4gICAgICAgIGlmIChcbiAgICAgICAgICBlbGVtZW50ICYmXG4gICAgICAgICAgaXNIaXR0aW5nRWxlbWVudE5vdENvbnNpZGVyaW5nQm91bmRpbmdCb3goZWxlbWVudCwgdGhpcy5zdGF0ZSwgW1xuICAgICAgICAgICAgc2NlbmVQb2ludGVyLngsXG4gICAgICAgICAgICBzY2VuZVBvaW50ZXIueSxcbiAgICAgICAgICBdKVxuICAgICAgICApIHtcbiAgICAgICAgICBzZXRDdXJzb3IodGhpcy5jYW52YXMsIENVUlNPUl9UWVBFLk1PVkUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHNldEN1cnNvcih0aGlzLmNhbnZhcywgQ1VSU09SX1RZUEUuQVVUTyk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgIC8vIGlmIHVzaW5nIGNtZC9jdHJsLCB3ZSdyZSBub3QgZHJhZ2dpbmdcbiAgICAgICAgIWV2ZW50W0tFWVMuQ1RSTF9PUl9DTURdICYmXG4gICAgICAgIChoaXRFbGVtZW50IHx8XG4gICAgICAgICAgdGhpcy5pc0hpdHRpbmdDb21tb25Cb3VuZGluZ0JveE9mU2VsZWN0ZWRFbGVtZW50cyhcbiAgICAgICAgICAgIHNjZW5lUG9pbnRlcixcbiAgICAgICAgICAgIHNlbGVjdGVkRWxlbWVudHMsXG4gICAgICAgICAgKSkgJiZcbiAgICAgICAgIWhpdEVsZW1lbnQ/LmxvY2tlZFxuICAgICAgKSB7XG4gICAgICAgIHNldEN1cnNvcih0aGlzLmNhbnZhcywgQ1VSU09SX1RZUEUuTU9WRSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzZXRDdXJzb3IodGhpcy5jYW52YXMsIENVUlNPUl9UWVBFLkFVVE8pO1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICBwcml2YXRlIGhhbmRsZUVyYXNlciA9IChcbiAgICBldmVudDogUG9pbnRlckV2ZW50LFxuICAgIHBvaW50ZXJEb3duU3RhdGU6IFBvaW50ZXJEb3duU3RhdGUsXG4gICAgc2NlbmVQb2ludGVyOiB7IHg6IG51bWJlcjsgeTogbnVtYmVyIH0sXG4gICkgPT4ge1xuICAgIGNvbnN0IHVwZGF0ZUVsZW1lbnRJZHMgPSAoZWxlbWVudHM6IEV4Y2FsaWRyYXdFbGVtZW50W10pID0+IHtcbiAgICAgIGVsZW1lbnRzLmZvckVhY2goKGVsZW1lbnQpID0+IHtcbiAgICAgICAgaWYgKGVsZW1lbnQubG9ja2VkKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWRzVG9VcGRhdGUucHVzaChlbGVtZW50LmlkKTtcbiAgICAgICAgaWYgKGV2ZW50LmFsdEtleSkge1xuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIHBvaW50ZXJEb3duU3RhdGUuZWxlbWVudElkc1RvRXJhc2VbZWxlbWVudC5pZF0gJiZcbiAgICAgICAgICAgIHBvaW50ZXJEb3duU3RhdGUuZWxlbWVudElkc1RvRXJhc2VbZWxlbWVudC5pZF0uZXJhc2VcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIHBvaW50ZXJEb3duU3RhdGUuZWxlbWVudElkc1RvRXJhc2VbZWxlbWVudC5pZF0uZXJhc2UgPSBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoIXBvaW50ZXJEb3duU3RhdGUuZWxlbWVudElkc1RvRXJhc2VbZWxlbWVudC5pZF0pIHtcbiAgICAgICAgICBwb2ludGVyRG93blN0YXRlLmVsZW1lbnRJZHNUb0VyYXNlW2VsZW1lbnQuaWRdID0ge1xuICAgICAgICAgICAgZXJhc2U6IHRydWUsXG4gICAgICAgICAgICBvcGFjaXR5OiBlbGVtZW50Lm9wYWNpdHksXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfTtcblxuICAgIGNvbnN0IGlkc1RvVXBkYXRlOiBBcnJheTxzdHJpbmc+ID0gW107XG5cbiAgICBjb25zdCBkaXN0YW5jZSA9IGRpc3RhbmNlMmQoXG4gICAgICBwb2ludGVyRG93blN0YXRlLmxhc3RDb29yZHMueCxcbiAgICAgIHBvaW50ZXJEb3duU3RhdGUubGFzdENvb3Jkcy55LFxuICAgICAgc2NlbmVQb2ludGVyLngsXG4gICAgICBzY2VuZVBvaW50ZXIueSxcbiAgICApO1xuICAgIGNvbnN0IHRocmVzaG9sZCA9IDEwIC8gdGhpcy5zdGF0ZS56b29tLnZhbHVlO1xuICAgIGNvbnN0IHBvaW50ID0geyAuLi5wb2ludGVyRG93blN0YXRlLmxhc3RDb29yZHMgfTtcbiAgICBsZXQgc2FtcGxpbmdJbnRlcnZhbCA9IDA7XG4gICAgd2hpbGUgKHNhbXBsaW5nSW50ZXJ2YWwgPD0gZGlzdGFuY2UpIHtcbiAgICAgIGNvbnN0IGhpdEVsZW1lbnRzID0gdGhpcy5nZXRFbGVtZW50c0F0UG9zaXRpb24ocG9pbnQueCwgcG9pbnQueSk7XG4gICAgICB1cGRhdGVFbGVtZW50SWRzKGhpdEVsZW1lbnRzKTtcblxuICAgICAgLy8gRXhpdCBzaW5jZSB3ZSByZWFjaGVkIGN1cnJlbnQgcG9pbnRcbiAgICAgIGlmIChzYW1wbGluZ0ludGVydmFsID09PSBkaXN0YW5jZSkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgLy8gQ2FsY3VsYXRlIG5leHQgcG9pbnQgaW4gdGhlIGxpbmUgYXQgYSBkaXN0YW5jZSBvZiBzYW1wbGluZyBpbnRlcnZhbFxuICAgICAgc2FtcGxpbmdJbnRlcnZhbCA9IE1hdGgubWluKHNhbXBsaW5nSW50ZXJ2YWwgKyB0aHJlc2hvbGQsIGRpc3RhbmNlKTtcblxuICAgICAgY29uc3QgZGlzdGFuY2VSYXRpbyA9IHNhbXBsaW5nSW50ZXJ2YWwgLyBkaXN0YW5jZTtcbiAgICAgIGNvbnN0IG5leHRYID1cbiAgICAgICAgKDEgLSBkaXN0YW5jZVJhdGlvKSAqIHBvaW50LnggKyBkaXN0YW5jZVJhdGlvICogc2NlbmVQb2ludGVyLng7XG4gICAgICBjb25zdCBuZXh0WSA9XG4gICAgICAgICgxIC0gZGlzdGFuY2VSYXRpbykgKiBwb2ludC55ICsgZGlzdGFuY2VSYXRpbyAqIHNjZW5lUG9pbnRlci55O1xuICAgICAgcG9pbnQueCA9IG5leHRYO1xuICAgICAgcG9pbnQueSA9IG5leHRZO1xuICAgIH1cblxuICAgIGNvbnN0IGVsZW1lbnRzID0gdGhpcy5zY2VuZS5nZXRFbGVtZW50c0luY2x1ZGluZ0RlbGV0ZWQoKS5tYXAoKGVsZSkgPT4ge1xuICAgICAgY29uc3QgaWQgPVxuICAgICAgICBpc0JvdW5kVG9Db250YWluZXIoZWxlKSAmJiBpZHNUb1VwZGF0ZS5pbmNsdWRlcyhlbGUuY29udGFpbmVySWQpXG4gICAgICAgICAgPyBlbGUuY29udGFpbmVySWRcbiAgICAgICAgICA6IGVsZS5pZDtcbiAgICAgIGlmIChpZHNUb1VwZGF0ZS5pbmNsdWRlcyhpZCkpIHtcbiAgICAgICAgaWYgKGV2ZW50LmFsdEtleSkge1xuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIHBvaW50ZXJEb3duU3RhdGUuZWxlbWVudElkc1RvRXJhc2VbaWRdICYmXG4gICAgICAgICAgICBwb2ludGVyRG93blN0YXRlLmVsZW1lbnRJZHNUb0VyYXNlW2lkXS5lcmFzZSA9PT0gZmFsc2VcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIHJldHVybiBuZXdFbGVtZW50V2l0aChlbGUsIHtcbiAgICAgICAgICAgICAgb3BhY2l0eTogcG9pbnRlckRvd25TdGF0ZS5lbGVtZW50SWRzVG9FcmFzZVtpZF0ub3BhY2l0eSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gbmV3RWxlbWVudFdpdGgoZWxlLCB7XG4gICAgICAgICAgICBvcGFjaXR5OiBFTEVNRU5UX1JFQURZX1RPX0VSQVNFX09QQUNJVFksXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBlbGU7XG4gICAgfSk7XG5cbiAgICB0aGlzLnNjZW5lLnJlcGxhY2VBbGxFbGVtZW50cyhlbGVtZW50cyk7XG5cbiAgICBwb2ludGVyRG93blN0YXRlLmxhc3RDb29yZHMueCA9IHNjZW5lUG9pbnRlci54O1xuICAgIHBvaW50ZXJEb3duU3RhdGUubGFzdENvb3Jkcy55ID0gc2NlbmVQb2ludGVyLnk7XG4gIH07XG4gIC8vIHNldCB0b3VjaCBtb3ZpbmcgZm9yIG1vYmlsZSBjb250ZXh0IG1lbnVcbiAgcHJpdmF0ZSBoYW5kbGVUb3VjaE1vdmUgPSAoZXZlbnQ6IFJlYWN0LlRvdWNoRXZlbnQ8SFRNTENhbnZhc0VsZW1lbnQ+KSA9PiB7XG4gICAgaW52YWxpZGF0ZUNvbnRleHRNZW51ID0gdHJ1ZTtcbiAgfTtcblxuICBwcml2YXRlIGhhbmRsZUNhbnZhc1BvaW50ZXJEb3duID0gKFxuICAgIGV2ZW50OiBSZWFjdC5Qb2ludGVyRXZlbnQ8SFRNTENhbnZhc0VsZW1lbnQ+LFxuICApID0+IHtcbiAgICAvLyByZW1vdmUgYW55IGFjdGl2ZSBzZWxlY3Rpb24gd2hlbiB3ZSBzdGFydCB0byBpbnRlcmFjdCB3aXRoIGNhbnZhc1xuICAgIC8vIChtYWlubHksIHdlIGNhcmUgYWJvdXQgcmVtb3Zpbmcgc2VsZWN0aW9uIG91dHNpZGUgdGhlIGNvbXBvbmVudCB3aGljaFxuICAgIC8vICB3b3VsZCBwcmV2ZW50IG91ciBjb3B5IGhhbmRsaW5nIG90aGVyd2lzZSlcbiAgICBjb25zdCBzZWxlY3Rpb24gPSBkb2N1bWVudC5nZXRTZWxlY3Rpb24oKTtcbiAgICBpZiAoc2VsZWN0aW9uPy5hbmNob3JOb2RlKSB7XG4gICAgICBzZWxlY3Rpb24ucmVtb3ZlQWxsUmFuZ2VzKCk7XG4gICAgfVxuICAgIHRoaXMubWF5YmVPcGVuQ29udGV4dE1lbnVBZnRlclBvaW50ZXJEb3duT25Ub3VjaERldmljZXMoZXZlbnQpO1xuICAgIHRoaXMubWF5YmVDbGVhbnVwQWZ0ZXJNaXNzaW5nUG9pbnRlclVwKGV2ZW50KTtcblxuICAgIC8vZmlyZXMgb25seSBvbmNlLCBpZiBwZW4gaXMgZGV0ZWN0ZWQsIHBlbk1vZGUgaXMgZW5hYmxlZFxuICAgIC8vdGhlIHVzZXIgY2FuIGRpc2FibGUgdGhpcyBieSB0b2dnbGluZyB0aGUgcGVuTW9kZSBidXR0b25cbiAgICBpZiAoIXRoaXMuc3RhdGUucGVuRGV0ZWN0ZWQgJiYgZXZlbnQucG9pbnRlclR5cGUgPT09IFwicGVuXCIpIHtcbiAgICAgIHRoaXMuc2V0U3RhdGUoKHByZXZTdGF0ZSkgPT4ge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHBlbk1vZGU6IHRydWUsXG4gICAgICAgICAgcGVuRGV0ZWN0ZWQ6IHRydWUsXG4gICAgICAgIH07XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICAhdGhpcy5kZXZpY2UuaXNUb3VjaFNjcmVlbiAmJlxuICAgICAgW1wicGVuXCIsIFwidG91Y2hcIl0uaW5jbHVkZXMoZXZlbnQucG9pbnRlclR5cGUpXG4gICAgKSB7XG4gICAgICB0aGlzLmRldmljZSA9IHVwZGF0ZU9iamVjdCh0aGlzLmRldmljZSwgeyBpc1RvdWNoU2NyZWVuOiB0cnVlIH0pO1xuICAgIH1cblxuICAgIGlmIChpc1Bhbm5pbmcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmxhc3RQb2ludGVyRG93biA9IGV2ZW50O1xuICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgbGFzdFBvaW50ZXJEb3duV2l0aDogZXZlbnQucG9pbnRlclR5cGUsXG4gICAgICBjdXJzb3JCdXR0b246IFwiZG93blwiLFxuICAgIH0pO1xuICAgIHRoaXMuc2F2ZVBvaW50ZXIoZXZlbnQuY2xpZW50WCwgZXZlbnQuY2xpZW50WSwgXCJkb3duXCIpO1xuXG4gICAgdGhpcy51cGRhdGVHZXN0dXJlT25Qb2ludGVyRG93bihldmVudCk7XG5cbiAgICBpZiAodGhpcy5oYW5kbGVDYW52YXNQYW5Vc2luZ1doZWVsT3JTcGFjZURyYWcoZXZlbnQpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gb25seSBoYW5kbGUgbGVmdCBtb3VzZSBidXR0b24gb3IgdG91Y2hcbiAgICBpZiAoXG4gICAgICBldmVudC5idXR0b24gIT09IFBPSU5URVJfQlVUVE9OLk1BSU4gJiZcbiAgICAgIGV2ZW50LmJ1dHRvbiAhPT0gUE9JTlRFUl9CVVRUT04uVE9VQ0hcbiAgICApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBkb24ndCBzZWxlY3Qgd2hpbGUgcGFubmluZ1xuICAgIGlmIChnZXN0dXJlLnBvaW50ZXJzLnNpemUgPiAxKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gU3RhdGUgZm9yIHRoZSBkdXJhdGlvbiBvZiBhIHBvaW50ZXIgaW50ZXJhY3Rpb24sIHdoaWNoIHN0YXJ0cyB3aXRoIGFcbiAgICAvLyBwb2ludGVyRG93biBldmVudCwgZW5kcyB3aXRoIGEgcG9pbnRlclVwIGV2ZW50IChvciBhbm90aGVyIHBvaW50ZXJEb3duKVxuICAgIGNvbnN0IHBvaW50ZXJEb3duU3RhdGUgPSB0aGlzLmluaXRpYWxQb2ludGVyRG93blN0YXRlKGV2ZW50KTtcblxuICAgIGlmICh0aGlzLmhhbmRsZURyYWdnaW5nU2Nyb2xsQmFyKGV2ZW50LCBwb2ludGVyRG93blN0YXRlKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIFNpbmNlIGNvbnRleHQgbWVudSBjbG9zZXMgb24gcG9pbnRlciBkb3duIHNvIHNldHRpbmcgdG8gZmFsc2VcbiAgICB0aGlzLmNvbnRleHRNZW51T3BlbiA9IGZhbHNlO1xuICAgIHRoaXMuY2xlYXJTZWxlY3Rpb25JZk5vdFVzaW5nU2VsZWN0aW9uKCk7XG4gICAgdGhpcy51cGRhdGVCaW5kaW5nRW5hYmxlZE9uUG9pbnRlck1vdmUoZXZlbnQpO1xuXG4gICAgaWYgKHRoaXMuaGFuZGxlU2VsZWN0aW9uT25Qb2ludGVyRG93bihldmVudCwgcG9pbnRlckRvd25TdGF0ZSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBhbGxvd09uUG9pbnRlckRvd24gPVxuICAgICAgIXRoaXMuc3RhdGUucGVuTW9kZSB8fFxuICAgICAgZXZlbnQucG9pbnRlclR5cGUgIT09IFwidG91Y2hcIiB8fFxuICAgICAgdGhpcy5zdGF0ZS5hY3RpdmVUb29sLnR5cGUgPT09IFwic2VsZWN0aW9uXCIgfHxcbiAgICAgIHRoaXMuc3RhdGUuYWN0aXZlVG9vbC50eXBlID09PSBcInRleHRcIiB8fFxuICAgICAgdGhpcy5zdGF0ZS5hY3RpdmVUb29sLnR5cGUgPT09IFwiaW1hZ2VcIjtcblxuICAgIGlmICghYWxsb3dPblBvaW50ZXJEb3duKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuc3RhdGUuYWN0aXZlVG9vbC50eXBlID09PSBcInRleHRcIikge1xuICAgICAgdGhpcy5oYW5kbGVUZXh0T25Qb2ludGVyRG93bihldmVudCwgcG9pbnRlckRvd25TdGF0ZSk7XG4gICAgICByZXR1cm47XG4gICAgfSBlbHNlIGlmIChcbiAgICAgIHRoaXMuc3RhdGUuYWN0aXZlVG9vbC50eXBlID09PSBcImFycm93XCIgfHxcbiAgICAgIHRoaXMuc3RhdGUuYWN0aXZlVG9vbC50eXBlID09PSBcImxpbmVcIlxuICAgICkge1xuICAgICAgdGhpcy5oYW5kbGVMaW5lYXJFbGVtZW50T25Qb2ludGVyRG93bihcbiAgICAgICAgZXZlbnQsXG4gICAgICAgIHRoaXMuc3RhdGUuYWN0aXZlVG9vbC50eXBlLFxuICAgICAgICBwb2ludGVyRG93blN0YXRlLFxuICAgICAgKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuc3RhdGUuYWN0aXZlVG9vbC50eXBlID09PSBcImltYWdlXCIpIHtcbiAgICAgIC8vIHJlc2V0IGltYWdlIHByZXZpZXcgb24gcG9pbnRlcmRvd25cbiAgICAgIHNldEN1cnNvcih0aGlzLmNhbnZhcywgQ1VSU09SX1RZUEUuQ1JPU1NIQUlSKTtcblxuICAgICAgLy8gcmV0cmlldmUgdGhlIGxhdGVzdCBlbGVtZW50IGFzIHRoZSBzdGF0ZSBtYXkgYmUgc3RhbGVcbiAgICAgIGNvbnN0IHBlbmRpbmdJbWFnZUVsZW1lbnQgPVxuICAgICAgICB0aGlzLnN0YXRlLnBlbmRpbmdJbWFnZUVsZW1lbnRJZCAmJlxuICAgICAgICB0aGlzLnNjZW5lLmdldEVsZW1lbnQodGhpcy5zdGF0ZS5wZW5kaW5nSW1hZ2VFbGVtZW50SWQpO1xuXG4gICAgICBpZiAoIXBlbmRpbmdJbWFnZUVsZW1lbnQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgZHJhZ2dpbmdFbGVtZW50OiBwZW5kaW5nSW1hZ2VFbGVtZW50LFxuICAgICAgICBlZGl0aW5nRWxlbWVudDogcGVuZGluZ0ltYWdlRWxlbWVudCxcbiAgICAgICAgcGVuZGluZ0ltYWdlRWxlbWVudElkOiBudWxsLFxuICAgICAgICBtdWx0aUVsZW1lbnQ6IG51bGwsXG4gICAgICB9KTtcblxuICAgICAgY29uc3QgeyB4LCB5IH0gPSB2aWV3cG9ydENvb3Jkc1RvU2NlbmVDb29yZHMoZXZlbnQsIHRoaXMuc3RhdGUpO1xuICAgICAgbXV0YXRlRWxlbWVudChwZW5kaW5nSW1hZ2VFbGVtZW50LCB7XG4gICAgICAgIHgsXG4gICAgICAgIHksXG4gICAgICB9KTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuc3RhdGUuYWN0aXZlVG9vbC50eXBlID09PSBcImZyZWVkcmF3XCIpIHtcbiAgICAgIHRoaXMuaGFuZGxlRnJlZURyYXdFbGVtZW50T25Qb2ludGVyRG93bihcbiAgICAgICAgZXZlbnQsXG4gICAgICAgIHRoaXMuc3RhdGUuYWN0aXZlVG9vbC50eXBlLFxuICAgICAgICBwb2ludGVyRG93blN0YXRlLFxuICAgICAgKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuc3RhdGUuYWN0aXZlVG9vbC50eXBlID09PSBcImN1c3RvbVwiKSB7XG4gICAgICBzZXRDdXJzb3IodGhpcy5jYW52YXMsIENVUlNPUl9UWVBFLkFVVE8pO1xuICAgIH0gZWxzZSBpZiAodGhpcy5zdGF0ZS5hY3RpdmVUb29sLnR5cGUgIT09IFwiZXJhc2VyXCIpIHtcbiAgICAgIHRoaXMuY3JlYXRlR2VuZXJpY0VsZW1lbnRPblBvaW50ZXJEb3duKFxuICAgICAgICB0aGlzLnN0YXRlLmFjdGl2ZVRvb2wudHlwZSxcbiAgICAgICAgcG9pbnRlckRvd25TdGF0ZSxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgdGhpcy5wcm9wcz8ub25Qb2ludGVyRG93bj8uKHRoaXMuc3RhdGUuYWN0aXZlVG9vbCwgcG9pbnRlckRvd25TdGF0ZSk7XG5cbiAgICBjb25zdCBvblBvaW50ZXJNb3ZlID1cbiAgICAgIHRoaXMub25Qb2ludGVyTW92ZUZyb21Qb2ludGVyRG93bkhhbmRsZXIocG9pbnRlckRvd25TdGF0ZSk7XG5cbiAgICBjb25zdCBvblBvaW50ZXJVcCA9XG4gICAgICB0aGlzLm9uUG9pbnRlclVwRnJvbVBvaW50ZXJEb3duSGFuZGxlcihwb2ludGVyRG93blN0YXRlKTtcblxuICAgIGNvbnN0IG9uS2V5RG93biA9IHRoaXMub25LZXlEb3duRnJvbVBvaW50ZXJEb3duSGFuZGxlcihwb2ludGVyRG93blN0YXRlKTtcbiAgICBjb25zdCBvbktleVVwID0gdGhpcy5vbktleVVwRnJvbVBvaW50ZXJEb3duSGFuZGxlcihwb2ludGVyRG93blN0YXRlKTtcblxuICAgIGxhc3RQb2ludGVyVXAgPSBvblBvaW50ZXJVcDtcblxuICAgIGlmICghdGhpcy5zdGF0ZS52aWV3TW9kZUVuYWJsZWQpIHtcbiAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKEVWRU5ULlBPSU5URVJfTU9WRSwgb25Qb2ludGVyTW92ZSk7XG4gICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihFVkVOVC5QT0lOVEVSX1VQLCBvblBvaW50ZXJVcCk7XG4gICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihFVkVOVC5LRVlET1dOLCBvbktleURvd24pO1xuICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoRVZFTlQuS0VZVVAsIG9uS2V5VXApO1xuICAgICAgcG9pbnRlckRvd25TdGF0ZS5ldmVudExpc3RlbmVycy5vbk1vdmUgPSBvblBvaW50ZXJNb3ZlO1xuICAgICAgcG9pbnRlckRvd25TdGF0ZS5ldmVudExpc3RlbmVycy5vblVwID0gb25Qb2ludGVyVXA7XG4gICAgICBwb2ludGVyRG93blN0YXRlLmV2ZW50TGlzdGVuZXJzLm9uS2V5VXAgPSBvbktleVVwO1xuICAgICAgcG9pbnRlckRvd25TdGF0ZS5ldmVudExpc3RlbmVycy5vbktleURvd24gPSBvbktleURvd247XG4gICAgfVxuICB9O1xuXG4gIHByaXZhdGUgaGFuZGxlQ2FudmFzUG9pbnRlclVwID0gKFxuICAgIGV2ZW50OiBSZWFjdC5Qb2ludGVyRXZlbnQ8SFRNTENhbnZhc0VsZW1lbnQ+LFxuICApID0+IHtcbiAgICB0aGlzLmxhc3RQb2ludGVyVXAgPSBldmVudDtcbiAgICBpZiAodGhpcy5kZXZpY2UuaXNUb3VjaFNjcmVlbikge1xuICAgICAgY29uc3Qgc2NlbmVQb2ludGVyID0gdmlld3BvcnRDb29yZHNUb1NjZW5lQ29vcmRzKFxuICAgICAgICB7IGNsaWVudFg6IGV2ZW50LmNsaWVudFgsIGNsaWVudFk6IGV2ZW50LmNsaWVudFkgfSxcbiAgICAgICAgdGhpcy5zdGF0ZSxcbiAgICAgICk7XG4gICAgICBjb25zdCBoaXRFbGVtZW50ID0gdGhpcy5nZXRFbGVtZW50QXRQb3NpdGlvbihcbiAgICAgICAgc2NlbmVQb2ludGVyLngsXG4gICAgICAgIHNjZW5lUG9pbnRlci55LFxuICAgICAgKTtcbiAgICAgIHRoaXMuaGl0TGlua0VsZW1lbnQgPSB0aGlzLmdldEVsZW1lbnRMaW5rQXRQb3NpdGlvbihcbiAgICAgICAgc2NlbmVQb2ludGVyLFxuICAgICAgICBoaXRFbGVtZW50LFxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKFxuICAgICAgdGhpcy5oaXRMaW5rRWxlbWVudCAmJlxuICAgICAgIXRoaXMuc3RhdGUuc2VsZWN0ZWRFbGVtZW50SWRzW3RoaXMuaGl0TGlua0VsZW1lbnQuaWRdXG4gICAgKSB7XG4gICAgICB0aGlzLnJlZGlyZWN0VG9MaW5rKGV2ZW50LCB0aGlzLmRldmljZS5pc1RvdWNoU2NyZWVuKTtcbiAgICB9XG5cbiAgICB0aGlzLnJlbW92ZVBvaW50ZXIoZXZlbnQpO1xuICB9O1xuXG4gIHByaXZhdGUgbWF5YmVPcGVuQ29udGV4dE1lbnVBZnRlclBvaW50ZXJEb3duT25Ub3VjaERldmljZXMgPSAoXG4gICAgZXZlbnQ6IFJlYWN0LlBvaW50ZXJFdmVudDxIVE1MQ2FudmFzRWxlbWVudD4sXG4gICk6IHZvaWQgPT4ge1xuICAgIC8vIGRlYWwgd2l0aCBvcGVuaW5nIGNvbnRleHQgbWVudSBvbiB0b3VjaCBkZXZpY2VzXG4gICAgaWYgKGV2ZW50LnBvaW50ZXJUeXBlID09PSBcInRvdWNoXCIpIHtcbiAgICAgIGludmFsaWRhdGVDb250ZXh0TWVudSA9IGZhbHNlO1xuXG4gICAgICBpZiAodG91Y2hUaW1lb3V0KSB7XG4gICAgICAgIC8vIElmIHRoZXJlJ3MgYWxyZWFkeSBhIHRvdWNoVGltZW91dCwgdGhpcyBtZWFucyB0aGF0IHRoZXJlJ3MgYW5vdGhlclxuICAgICAgICAvLyB0b3VjaCBkb3duIGFuZCB3ZSBhcmUgZG9pbmcgYW5vdGhlciB0b3VjaCwgc28gd2Ugc2hvdWxkbid0IG9wZW4gdGhlXG4gICAgICAgIC8vIGNvbnRleHQgbWVudS5cbiAgICAgICAgaW52YWxpZGF0ZUNvbnRleHRNZW51ID0gdHJ1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIG9wZW4gdGhlIGNvbnRleHQgbWVudSB3aXRoIHRoZSBmaXJzdCB0b3VjaCdzIGNsaWVudFggYW5kIGNsaWVudFlcbiAgICAgICAgLy8gaWYgdGhlIHRvdWNoIGlzIG5vdCBtb3ZpbmdcbiAgICAgICAgdG91Y2hUaW1lb3V0ID0gd2luZG93LnNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIHRvdWNoVGltZW91dCA9IDA7XG4gICAgICAgICAgaWYgKCFpbnZhbGlkYXRlQ29udGV4dE1lbnUpIHtcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlQ2FudmFzQ29udGV4dE1lbnUoZXZlbnQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSwgVE9VQ0hfQ1RYX01FTlVfVElNRU9VVCk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIHByaXZhdGUgcmVzZXRDb250ZXh0TWVudVRpbWVyID0gKCkgPT4ge1xuICAgIGNsZWFyVGltZW91dCh0b3VjaFRpbWVvdXQpO1xuICAgIHRvdWNoVGltZW91dCA9IDA7XG4gICAgaW52YWxpZGF0ZUNvbnRleHRNZW51ID0gZmFsc2U7XG4gIH07XG5cbiAgcHJpdmF0ZSBtYXliZUNsZWFudXBBZnRlck1pc3NpbmdQb2ludGVyVXAoXG4gICAgZXZlbnQ6IFJlYWN0LlBvaW50ZXJFdmVudDxIVE1MQ2FudmFzRWxlbWVudD4sXG4gICk6IHZvaWQge1xuICAgIGlmIChsYXN0UG9pbnRlclVwICE9PSBudWxsKSB7XG4gICAgICAvLyBVbmZvcnR1bmF0ZWx5LCBzb21ldGltZXMgd2UgZG9uJ3QgZ2V0IGEgcG9pbnRlcnVwIGFmdGVyIGEgcG9pbnRlcmRvd24sXG4gICAgICAvLyB0aGlzIGNhbiBoYXBwZW4gd2hlbiBhIGNvbnRleHR1YWwgbWVudSBvciBhbGVydCBpcyB0cmlnZ2VyZWQuIEluIG9yZGVyIHRvIGF2b2lkXG4gICAgICAvLyBiZWluZyBpbiBhIHdlaXJkIHN0YXRlLCB3ZSBjbGVhbiB1cCBvbiB0aGUgbmV4dCBwb2ludGVyZG93blxuICAgICAgbGFzdFBvaW50ZXJVcChldmVudCk7XG4gICAgfVxuICB9XG5cbiAgLy8gUmV0dXJucyB3aGV0aGVyIHRoZSBldmVudCBpcyBhIHBhbm5pbmdcbiAgcHJpdmF0ZSBoYW5kbGVDYW52YXNQYW5Vc2luZ1doZWVsT3JTcGFjZURyYWcgPSAoXG4gICAgZXZlbnQ6IFJlYWN0LlBvaW50ZXJFdmVudDxIVE1MQ2FudmFzRWxlbWVudD4sXG4gICk6IGJvb2xlYW4gPT4ge1xuICAgIGlmIChcbiAgICAgICEoXG4gICAgICAgIGdlc3R1cmUucG9pbnRlcnMuc2l6ZSA8PSAxICYmXG4gICAgICAgIChldmVudC5idXR0b24gPT09IFBPSU5URVJfQlVUVE9OLldIRUVMIHx8XG4gICAgICAgICAgKGV2ZW50LmJ1dHRvbiA9PT0gUE9JTlRFUl9CVVRUT04uTUFJTiAmJiBpc0hvbGRpbmdTcGFjZSkgfHxcbiAgICAgICAgICB0aGlzLnN0YXRlLnZpZXdNb2RlRW5hYmxlZClcbiAgICAgICkgfHxcbiAgICAgIGlzVGV4dEVsZW1lbnQodGhpcy5zdGF0ZS5lZGl0aW5nRWxlbWVudClcbiAgICApIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaXNQYW5uaW5nID0gdHJ1ZTtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgbGV0IG5leHRQYXN0ZVByZXZlbnRlZCA9IGZhbHNlO1xuICAgIGNvbnN0IGlzTGludXggPSAvTGludXgvLnRlc3Qod2luZG93Lm5hdmlnYXRvci5wbGF0Zm9ybSk7XG5cbiAgICBzZXRDdXJzb3IodGhpcy5jYW52YXMsIENVUlNPUl9UWVBFLkdSQUJCSU5HKTtcbiAgICBsZXQgeyBjbGllbnRYOiBsYXN0WCwgY2xpZW50WTogbGFzdFkgfSA9IGV2ZW50O1xuICAgIGNvbnN0IG9uUG9pbnRlck1vdmUgPSB3aXRoQmF0Y2hlZFVwZGF0ZXNUaHJvdHRsZWQoKGV2ZW50OiBQb2ludGVyRXZlbnQpID0+IHtcbiAgICAgIGNvbnN0IGRlbHRhWCA9IGxhc3RYIC0gZXZlbnQuY2xpZW50WDtcbiAgICAgIGNvbnN0IGRlbHRhWSA9IGxhc3RZIC0gZXZlbnQuY2xpZW50WTtcbiAgICAgIGxhc3RYID0gZXZlbnQuY2xpZW50WDtcbiAgICAgIGxhc3RZID0gZXZlbnQuY2xpZW50WTtcblxuICAgICAgLypcbiAgICAgICAqIFByZXZlbnQgcGFzdGUgZXZlbnQgaWYgd2UgbW92ZSB3aGlsZSBtaWRkbGUgY2xpY2tpbmcgb24gTGludXguXG4gICAgICAgKiBTZWUgaXNzdWUgIzEzODMuXG4gICAgICAgKi9cbiAgICAgIGlmIChcbiAgICAgICAgaXNMaW51eCAmJlxuICAgICAgICAhbmV4dFBhc3RlUHJldmVudGVkICYmXG4gICAgICAgIChNYXRoLmFicyhkZWx0YVgpID4gMSB8fCBNYXRoLmFicyhkZWx0YVkpID4gMSlcbiAgICAgICkge1xuICAgICAgICBuZXh0UGFzdGVQcmV2ZW50ZWQgPSB0cnVlO1xuXG4gICAgICAgIC8qIFByZXZlbnQgdGhlIG5leHQgcGFzdGUgZXZlbnQgKi9cbiAgICAgICAgY29uc3QgcHJldmVudE5leHRQYXN0ZSA9IChldmVudDogQ2xpcGJvYXJkRXZlbnQpID0+IHtcbiAgICAgICAgICBkb2N1bWVudC5ib2R5LnJlbW92ZUV2ZW50TGlzdGVuZXIoRVZFTlQuUEFTVEUsIHByZXZlbnROZXh0UGFzdGUpO1xuICAgICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICB9O1xuXG4gICAgICAgIC8qXG4gICAgICAgICAqIFJlZW5hYmxlIG5leHQgcGFzdGUgaW4gY2FzZSBvZiBkaXNhYmxlZCBtaWRkbGUgY2xpY2sgcGFzdGUgZm9yXG4gICAgICAgICAqIGFueSByZWFzb246XG4gICAgICAgICAqIC0gcmlnaHQgY2xpY2sgcGFzdGVcbiAgICAgICAgICogLSBlbXB0eSBjbGlwYm9hcmRcbiAgICAgICAgICovXG4gICAgICAgIGNvbnN0IGVuYWJsZU5leHRQYXN0ZSA9ICgpID0+IHtcbiAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlRXZlbnRMaXN0ZW5lcihFVkVOVC5QQVNURSwgcHJldmVudE5leHRQYXN0ZSk7XG4gICAgICAgICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihFVkVOVC5QT0lOVEVSX1VQLCBlbmFibGVOZXh0UGFzdGUpO1xuICAgICAgICAgIH0sIDEwMCk7XG4gICAgICAgIH07XG5cbiAgICAgICAgZG9jdW1lbnQuYm9keS5hZGRFdmVudExpc3RlbmVyKEVWRU5ULlBBU1RFLCBwcmV2ZW50TmV4dFBhc3RlKTtcbiAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoRVZFTlQuUE9JTlRFUl9VUCwgZW5hYmxlTmV4dFBhc3RlKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgIHNjcm9sbFg6IHRoaXMuc3RhdGUuc2Nyb2xsWCAtIGRlbHRhWCAvIHRoaXMuc3RhdGUuem9vbS52YWx1ZSxcbiAgICAgICAgc2Nyb2xsWTogdGhpcy5zdGF0ZS5zY3JvbGxZIC0gZGVsdGFZIC8gdGhpcy5zdGF0ZS56b29tLnZhbHVlLFxuICAgICAgfSk7XG4gICAgfSk7XG4gICAgY29uc3QgdGVhcmRvd24gPSB3aXRoQmF0Y2hlZFVwZGF0ZXMoXG4gICAgICAobGFzdFBvaW50ZXJVcCA9ICgpID0+IHtcbiAgICAgICAgbGFzdFBvaW50ZXJVcCA9IG51bGw7XG4gICAgICAgIGlzUGFubmluZyA9IGZhbHNlO1xuICAgICAgICBpZiAoIWlzSG9sZGluZ1NwYWNlKSB7XG4gICAgICAgICAgaWYgKHRoaXMuc3RhdGUudmlld01vZGVFbmFibGVkKSB7XG4gICAgICAgICAgICBzZXRDdXJzb3IodGhpcy5jYW52YXMsIENVUlNPUl9UWVBFLkdSQUIpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzZXRDdXJzb3JGb3JTaGFwZSh0aGlzLmNhbnZhcywgdGhpcy5zdGF0ZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICAgIGN1cnNvckJ1dHRvbjogXCJ1cFwiLFxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5zYXZlUG9pbnRlcihldmVudC5jbGllbnRYLCBldmVudC5jbGllbnRZLCBcInVwXCIpO1xuICAgICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihFVkVOVC5QT0lOVEVSX01PVkUsIG9uUG9pbnRlck1vdmUpO1xuICAgICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihFVkVOVC5QT0lOVEVSX1VQLCB0ZWFyZG93bik7XG4gICAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKEVWRU5ULkJMVVIsIHRlYXJkb3duKTtcbiAgICAgICAgb25Qb2ludGVyTW92ZS5mbHVzaCgpO1xuICAgICAgfSksXG4gICAgKTtcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihFVkVOVC5CTFVSLCB0ZWFyZG93bik7XG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoRVZFTlQuUE9JTlRFUl9NT1ZFLCBvblBvaW50ZXJNb3ZlLCB7XG4gICAgICBwYXNzaXZlOiB0cnVlLFxuICAgIH0pO1xuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKEVWRU5ULlBPSU5URVJfVVAsIHRlYXJkb3duKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfTtcblxuICBwcml2YXRlIHVwZGF0ZUdlc3R1cmVPblBvaW50ZXJEb3duKFxuICAgIGV2ZW50OiBSZWFjdC5Qb2ludGVyRXZlbnQ8SFRNTENhbnZhc0VsZW1lbnQ+LFxuICApOiB2b2lkIHtcbiAgICBnZXN0dXJlLnBvaW50ZXJzLnNldChldmVudC5wb2ludGVySWQsIHtcbiAgICAgIHg6IGV2ZW50LmNsaWVudFgsXG4gICAgICB5OiBldmVudC5jbGllbnRZLFxuICAgIH0pO1xuXG4gICAgaWYgKGdlc3R1cmUucG9pbnRlcnMuc2l6ZSA9PT0gMikge1xuICAgICAgZ2VzdHVyZS5sYXN0Q2VudGVyID0gZ2V0Q2VudGVyKGdlc3R1cmUucG9pbnRlcnMpO1xuICAgICAgZ2VzdHVyZS5pbml0aWFsU2NhbGUgPSB0aGlzLnN0YXRlLnpvb20udmFsdWU7XG4gICAgICBnZXN0dXJlLmluaXRpYWxEaXN0YW5jZSA9IGdldERpc3RhbmNlKFxuICAgICAgICBBcnJheS5mcm9tKGdlc3R1cmUucG9pbnRlcnMudmFsdWVzKCkpLFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGluaXRpYWxQb2ludGVyRG93blN0YXRlKFxuICAgIGV2ZW50OiBSZWFjdC5Qb2ludGVyRXZlbnQ8SFRNTENhbnZhc0VsZW1lbnQ+LFxuICApOiBQb2ludGVyRG93blN0YXRlIHtcbiAgICBjb25zdCBvcmlnaW4gPSB2aWV3cG9ydENvb3Jkc1RvU2NlbmVDb29yZHMoZXZlbnQsIHRoaXMuc3RhdGUpO1xuICAgIGNvbnN0IHNlbGVjdGVkRWxlbWVudHMgPSBnZXRTZWxlY3RlZEVsZW1lbnRzKFxuICAgICAgdGhpcy5zY2VuZS5nZXROb25EZWxldGVkRWxlbWVudHMoKSxcbiAgICAgIHRoaXMuc3RhdGUsXG4gICAgKTtcbiAgICBjb25zdCBbbWluWCwgbWluWSwgbWF4WCwgbWF4WV0gPSBnZXRDb21tb25Cb3VuZHMoc2VsZWN0ZWRFbGVtZW50cyk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgb3JpZ2luLFxuICAgICAgd2l0aENtZE9yQ3RybDogZXZlbnRbS0VZUy5DVFJMX09SX0NNRF0sXG4gICAgICBvcmlnaW5JbkdyaWQ6IHR1cGxlVG9Db29ycyhcbiAgICAgICAgZ2V0R3JpZFBvaW50KG9yaWdpbi54LCBvcmlnaW4ueSwgdGhpcy5zdGF0ZS5ncmlkU2l6ZSksXG4gICAgICApLFxuICAgICAgc2Nyb2xsYmFyczogaXNPdmVyU2Nyb2xsQmFycyhcbiAgICAgICAgY3VycmVudFNjcm9sbEJhcnMsXG4gICAgICAgIGV2ZW50LmNsaWVudFggLSB0aGlzLnN0YXRlLm9mZnNldExlZnQsXG4gICAgICAgIGV2ZW50LmNsaWVudFkgLSB0aGlzLnN0YXRlLm9mZnNldFRvcCxcbiAgICAgICksXG4gICAgICAvLyB3ZSBuZWVkIHRvIGR1cGxpY2F0ZSBiZWNhdXNlIHdlJ2xsIGJlIHVwZGF0aW5nIHRoaXMgc3RhdGVcbiAgICAgIGxhc3RDb29yZHM6IHsgLi4ub3JpZ2luIH0sXG4gICAgICBvcmlnaW5hbEVsZW1lbnRzOiB0aGlzLnNjZW5lXG4gICAgICAgIC5nZXROb25EZWxldGVkRWxlbWVudHMoKVxuICAgICAgICAucmVkdWNlKChhY2MsIGVsZW1lbnQpID0+IHtcbiAgICAgICAgICBhY2Muc2V0KGVsZW1lbnQuaWQsIGRlZXBDb3B5RWxlbWVudChlbGVtZW50KSk7XG4gICAgICAgICAgcmV0dXJuIGFjYztcbiAgICAgICAgfSwgbmV3IE1hcCgpIGFzIFBvaW50ZXJEb3duU3RhdGVbXCJvcmlnaW5hbEVsZW1lbnRzXCJdKSxcbiAgICAgIHJlc2l6ZToge1xuICAgICAgICBoYW5kbGVUeXBlOiBmYWxzZSxcbiAgICAgICAgaXNSZXNpemluZzogZmFsc2UsXG4gICAgICAgIG9mZnNldDogeyB4OiAwLCB5OiAwIH0sXG4gICAgICAgIGFycm93RGlyZWN0aW9uOiBcIm9yaWdpblwiLFxuICAgICAgICBjZW50ZXI6IHsgeDogKG1heFggKyBtaW5YKSAvIDIsIHk6IChtYXhZICsgbWluWSkgLyAyIH0sXG4gICAgICB9LFxuICAgICAgaGl0OiB7XG4gICAgICAgIGVsZW1lbnQ6IG51bGwsXG4gICAgICAgIGFsbEhpdEVsZW1lbnRzOiBbXSxcbiAgICAgICAgd2FzQWRkZWRUb1NlbGVjdGlvbjogZmFsc2UsXG4gICAgICAgIGhhc0JlZW5EdXBsaWNhdGVkOiBmYWxzZSxcbiAgICAgICAgaGFzSGl0Q29tbW9uQm91bmRpbmdCb3hPZlNlbGVjdGVkRWxlbWVudHM6XG4gICAgICAgICAgdGhpcy5pc0hpdHRpbmdDb21tb25Cb3VuZGluZ0JveE9mU2VsZWN0ZWRFbGVtZW50cyhcbiAgICAgICAgICAgIG9yaWdpbixcbiAgICAgICAgICAgIHNlbGVjdGVkRWxlbWVudHMsXG4gICAgICAgICAgKSxcbiAgICAgICAgaGFzSGl0RWxlbWVudEluc2lkZTogZmFsc2UsXG4gICAgICB9LFxuICAgICAgZHJhZzoge1xuICAgICAgICBoYXNPY2N1cnJlZDogZmFsc2UsXG4gICAgICAgIG9mZnNldDogbnVsbCxcbiAgICAgIH0sXG4gICAgICBldmVudExpc3RlbmVyczoge1xuICAgICAgICBvbk1vdmU6IG51bGwsXG4gICAgICAgIG9uVXA6IG51bGwsXG4gICAgICAgIG9uS2V5VXA6IG51bGwsXG4gICAgICAgIG9uS2V5RG93bjogbnVsbCxcbiAgICAgIH0sXG4gICAgICBib3hTZWxlY3Rpb246IHtcbiAgICAgICAgaGFzT2NjdXJyZWQ6IGZhbHNlLFxuICAgICAgfSxcbiAgICAgIGVsZW1lbnRJZHNUb0VyYXNlOiB7fSxcbiAgICB9O1xuICB9XG5cbiAgLy8gUmV0dXJucyB3aGV0aGVyIHRoZSBldmVudCBpcyBhIGRyYWdnaW5nIGEgc2Nyb2xsYmFyXG4gIHByaXZhdGUgaGFuZGxlRHJhZ2dpbmdTY3JvbGxCYXIoXG4gICAgZXZlbnQ6IFJlYWN0LlBvaW50ZXJFdmVudDxIVE1MQ2FudmFzRWxlbWVudD4sXG4gICAgcG9pbnRlckRvd25TdGF0ZTogUG9pbnRlckRvd25TdGF0ZSxcbiAgKTogYm9vbGVhbiB7XG4gICAgaWYgKFxuICAgICAgIShwb2ludGVyRG93blN0YXRlLnNjcm9sbGJhcnMuaXNPdmVyRWl0aGVyICYmICF0aGlzLnN0YXRlLm11bHRpRWxlbWVudClcbiAgICApIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaXNEcmFnZ2luZ1Njcm9sbEJhciA9IHRydWU7XG4gICAgcG9pbnRlckRvd25TdGF0ZS5sYXN0Q29vcmRzLnggPSBldmVudC5jbGllbnRYO1xuICAgIHBvaW50ZXJEb3duU3RhdGUubGFzdENvb3Jkcy55ID0gZXZlbnQuY2xpZW50WTtcbiAgICBjb25zdCBvblBvaW50ZXJNb3ZlID0gd2l0aEJhdGNoZWRVcGRhdGVzVGhyb3R0bGVkKChldmVudDogUG9pbnRlckV2ZW50KSA9PiB7XG4gICAgICBjb25zdCB0YXJnZXQgPSBldmVudC50YXJnZXQ7XG4gICAgICBpZiAoISh0YXJnZXQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmhhbmRsZVBvaW50ZXJNb3ZlT3ZlclNjcm9sbGJhcnMoZXZlbnQsIHBvaW50ZXJEb3duU3RhdGUpO1xuICAgIH0pO1xuXG4gICAgY29uc3Qgb25Qb2ludGVyVXAgPSB3aXRoQmF0Y2hlZFVwZGF0ZXMoKCkgPT4ge1xuICAgICAgaXNEcmFnZ2luZ1Njcm9sbEJhciA9IGZhbHNlO1xuICAgICAgc2V0Q3Vyc29yRm9yU2hhcGUodGhpcy5jYW52YXMsIHRoaXMuc3RhdGUpO1xuICAgICAgbGFzdFBvaW50ZXJVcCA9IG51bGw7XG4gICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgY3Vyc29yQnV0dG9uOiBcInVwXCIsXG4gICAgICB9KTtcbiAgICAgIHRoaXMuc2F2ZVBvaW50ZXIoZXZlbnQuY2xpZW50WCwgZXZlbnQuY2xpZW50WSwgXCJ1cFwiKTtcbiAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKEVWRU5ULlBPSU5URVJfTU9WRSwgb25Qb2ludGVyTW92ZSk7XG4gICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihFVkVOVC5QT0lOVEVSX1VQLCBvblBvaW50ZXJVcCk7XG4gICAgICBvblBvaW50ZXJNb3ZlLmZsdXNoKCk7XG4gICAgfSk7XG5cbiAgICBsYXN0UG9pbnRlclVwID0gb25Qb2ludGVyVXA7XG5cbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihFVkVOVC5QT0lOVEVSX01PVkUsIG9uUG9pbnRlck1vdmUpO1xuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKEVWRU5ULlBPSU5URVJfVVAsIG9uUG9pbnRlclVwKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHByaXZhdGUgY2xlYXJTZWxlY3Rpb25JZk5vdFVzaW5nU2VsZWN0aW9uID0gKCk6IHZvaWQgPT4ge1xuICAgIGlmICh0aGlzLnN0YXRlLmFjdGl2ZVRvb2wudHlwZSAhPT0gXCJzZWxlY3Rpb25cIikge1xuICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgIHNlbGVjdGVkRWxlbWVudElkczoge30sXG4gICAgICAgIHNlbGVjdGVkR3JvdXBJZHM6IHt9LFxuICAgICAgICBlZGl0aW5nR3JvdXBJZDogbnVsbCxcbiAgICAgIH0pO1xuICAgIH1cbiAgfTtcblxuICAvKipcbiAgICogQHJldHVybnMgd2hldGhlciB0aGUgcG9pbnRlciBldmVudCBoYXMgYmVlbiBjb21wbGV0ZWx5IGhhbmRsZWRcbiAgICovXG4gIHByaXZhdGUgaGFuZGxlU2VsZWN0aW9uT25Qb2ludGVyRG93biA9IChcbiAgICBldmVudDogUmVhY3QuUG9pbnRlckV2ZW50PEhUTUxDYW52YXNFbGVtZW50PixcbiAgICBwb2ludGVyRG93blN0YXRlOiBQb2ludGVyRG93blN0YXRlLFxuICApOiBib29sZWFuID0+IHtcbiAgICBpZiAodGhpcy5zdGF0ZS5hY3RpdmVUb29sLnR5cGUgPT09IFwic2VsZWN0aW9uXCIpIHtcbiAgICAgIGNvbnN0IGVsZW1lbnRzID0gdGhpcy5zY2VuZS5nZXROb25EZWxldGVkRWxlbWVudHMoKTtcbiAgICAgIGNvbnN0IHNlbGVjdGVkRWxlbWVudHMgPSBnZXRTZWxlY3RlZEVsZW1lbnRzKGVsZW1lbnRzLCB0aGlzLnN0YXRlKTtcbiAgICAgIGlmIChzZWxlY3RlZEVsZW1lbnRzLmxlbmd0aCA9PT0gMSAmJiAhdGhpcy5zdGF0ZS5lZGl0aW5nTGluZWFyRWxlbWVudCkge1xuICAgICAgICBjb25zdCBlbGVtZW50V2l0aFRyYW5zZm9ybUhhbmRsZVR5cGUgPVxuICAgICAgICAgIGdldEVsZW1lbnRXaXRoVHJhbnNmb3JtSGFuZGxlVHlwZShcbiAgICAgICAgICAgIGVsZW1lbnRzLFxuICAgICAgICAgICAgdGhpcy5zdGF0ZSxcbiAgICAgICAgICAgIHBvaW50ZXJEb3duU3RhdGUub3JpZ2luLngsXG4gICAgICAgICAgICBwb2ludGVyRG93blN0YXRlLm9yaWdpbi55LFxuICAgICAgICAgICAgdGhpcy5zdGF0ZS56b29tLFxuICAgICAgICAgICAgZXZlbnQucG9pbnRlclR5cGUsXG4gICAgICAgICAgKTtcbiAgICAgICAgaWYgKGVsZW1lbnRXaXRoVHJhbnNmb3JtSGFuZGxlVHlwZSAhPSBudWxsKSB7XG4gICAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgICByZXNpemluZ0VsZW1lbnQ6IGVsZW1lbnRXaXRoVHJhbnNmb3JtSGFuZGxlVHlwZS5lbGVtZW50LFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHBvaW50ZXJEb3duU3RhdGUucmVzaXplLmhhbmRsZVR5cGUgPVxuICAgICAgICAgICAgZWxlbWVudFdpdGhUcmFuc2Zvcm1IYW5kbGVUeXBlLnRyYW5zZm9ybUhhbmRsZVR5cGU7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoc2VsZWN0ZWRFbGVtZW50cy5sZW5ndGggPiAxKSB7XG4gICAgICAgIHBvaW50ZXJEb3duU3RhdGUucmVzaXplLmhhbmRsZVR5cGUgPSBnZXRUcmFuc2Zvcm1IYW5kbGVUeXBlRnJvbUNvb3JkcyhcbiAgICAgICAgICBnZXRDb21tb25Cb3VuZHMoc2VsZWN0ZWRFbGVtZW50cyksXG4gICAgICAgICAgcG9pbnRlckRvd25TdGF0ZS5vcmlnaW4ueCxcbiAgICAgICAgICBwb2ludGVyRG93blN0YXRlLm9yaWdpbi55LFxuICAgICAgICAgIHRoaXMuc3RhdGUuem9vbSxcbiAgICAgICAgICBldmVudC5wb2ludGVyVHlwZSxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGlmIChwb2ludGVyRG93blN0YXRlLnJlc2l6ZS5oYW5kbGVUeXBlKSB7XG4gICAgICAgIHNldEN1cnNvcihcbiAgICAgICAgICB0aGlzLmNhbnZhcyxcbiAgICAgICAgICBnZXRDdXJzb3JGb3JSZXNpemluZ0VsZW1lbnQoe1xuICAgICAgICAgICAgdHJhbnNmb3JtSGFuZGxlVHlwZTogcG9pbnRlckRvd25TdGF0ZS5yZXNpemUuaGFuZGxlVHlwZSxcbiAgICAgICAgICB9KSxcbiAgICAgICAgKTtcbiAgICAgICAgcG9pbnRlckRvd25TdGF0ZS5yZXNpemUuaXNSZXNpemluZyA9IHRydWU7XG4gICAgICAgIHBvaW50ZXJEb3duU3RhdGUucmVzaXplLm9mZnNldCA9IHR1cGxlVG9Db29ycyhcbiAgICAgICAgICBnZXRSZXNpemVPZmZzZXRYWShcbiAgICAgICAgICAgIHBvaW50ZXJEb3duU3RhdGUucmVzaXplLmhhbmRsZVR5cGUsXG4gICAgICAgICAgICBzZWxlY3RlZEVsZW1lbnRzLFxuICAgICAgICAgICAgcG9pbnRlckRvd25TdGF0ZS5vcmlnaW4ueCxcbiAgICAgICAgICAgIHBvaW50ZXJEb3duU3RhdGUub3JpZ2luLnksXG4gICAgICAgICAgKSxcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIHNlbGVjdGVkRWxlbWVudHMubGVuZ3RoID09PSAxICYmXG4gICAgICAgICAgaXNMaW5lYXJFbGVtZW50KHNlbGVjdGVkRWxlbWVudHNbMF0pICYmXG4gICAgICAgICAgc2VsZWN0ZWRFbGVtZW50c1swXS5wb2ludHMubGVuZ3RoID09PSAyXG4gICAgICAgICkge1xuICAgICAgICAgIHBvaW50ZXJEb3duU3RhdGUucmVzaXplLmFycm93RGlyZWN0aW9uID0gZ2V0UmVzaXplQXJyb3dEaXJlY3Rpb24oXG4gICAgICAgICAgICBwb2ludGVyRG93blN0YXRlLnJlc2l6ZS5oYW5kbGVUeXBlLFxuICAgICAgICAgICAgc2VsZWN0ZWRFbGVtZW50c1swXSxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAodGhpcy5zdGF0ZS5lZGl0aW5nTGluZWFyRWxlbWVudCkge1xuICAgICAgICAgIGNvbnN0IHJldCA9IExpbmVhckVsZW1lbnRFZGl0b3IuaGFuZGxlUG9pbnRlckRvd24oXG4gICAgICAgICAgICBldmVudCxcbiAgICAgICAgICAgIHRoaXMuc3RhdGUsXG4gICAgICAgICAgICAoYXBwU3RhdGUpID0+IHRoaXMuc2V0U3RhdGUoYXBwU3RhdGUpLFxuICAgICAgICAgICAgdGhpcy5oaXN0b3J5LFxuICAgICAgICAgICAgcG9pbnRlckRvd25TdGF0ZS5vcmlnaW4sXG4gICAgICAgICAgKTtcbiAgICAgICAgICBpZiAocmV0LmhpdEVsZW1lbnQpIHtcbiAgICAgICAgICAgIHBvaW50ZXJEb3duU3RhdGUuaGl0LmVsZW1lbnQgPSByZXQuaGl0RWxlbWVudDtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHJldC5kaWRBZGRQb2ludCkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIGhpdEVsZW1lbnQgbWF5IGFscmVhZHkgYmUgc2V0IGFib3ZlLCBzbyBjaGVjayBmaXJzdFxuICAgICAgICBwb2ludGVyRG93blN0YXRlLmhpdC5lbGVtZW50ID1cbiAgICAgICAgICBwb2ludGVyRG93blN0YXRlLmhpdC5lbGVtZW50ID8/XG4gICAgICAgICAgdGhpcy5nZXRFbGVtZW50QXRQb3NpdGlvbihcbiAgICAgICAgICAgIHBvaW50ZXJEb3duU3RhdGUub3JpZ2luLngsXG4gICAgICAgICAgICBwb2ludGVyRG93blN0YXRlLm9yaWdpbi55LFxuICAgICAgICAgICk7XG5cbiAgICAgICAgaWYgKHBvaW50ZXJEb3duU3RhdGUuaGl0LmVsZW1lbnQpIHtcbiAgICAgICAgICAvLyBFYXJseSByZXR1cm4gaWYgcG9pbnRlciBpcyBoaXR0aW5nIGxpbmsgaWNvblxuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIGlzUG9pbnRIaXR0aW5nTGlua0ljb24oXG4gICAgICAgICAgICAgIHBvaW50ZXJEb3duU3RhdGUuaGl0LmVsZW1lbnQsXG4gICAgICAgICAgICAgIHRoaXMuc3RhdGUsXG4gICAgICAgICAgICAgIFtwb2ludGVyRG93blN0YXRlLm9yaWdpbi54LCBwb2ludGVyRG93blN0YXRlLm9yaWdpbi55XSxcbiAgICAgICAgICAgICAgdGhpcy5kZXZpY2UuaXNNb2JpbGUsXG4gICAgICAgICAgICApXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgfVxuICAgICAgICAgIHBvaW50ZXJEb3duU3RhdGUuaGl0Lmhhc0hpdEVsZW1lbnRJbnNpZGUgPVxuICAgICAgICAgICAgaXNIaXR0aW5nRWxlbWVudE5vdENvbnNpZGVyaW5nQm91bmRpbmdCb3goXG4gICAgICAgICAgICAgIHBvaW50ZXJEb3duU3RhdGUuaGl0LmVsZW1lbnQsXG4gICAgICAgICAgICAgIHRoaXMuc3RhdGUsXG4gICAgICAgICAgICAgIFtwb2ludGVyRG93blN0YXRlLm9yaWdpbi54LCBwb2ludGVyRG93blN0YXRlLm9yaWdpbi55XSxcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBGb3Igb3ZlcmxhcHBlZCBlbGVtZW50cyBvbmUgcG9zaXRpb24gbWF5IGhpdFxuICAgICAgICAvLyBtdWx0aXBsZSBlbGVtZW50c1xuICAgICAgICBwb2ludGVyRG93blN0YXRlLmhpdC5hbGxIaXRFbGVtZW50cyA9IHRoaXMuZ2V0RWxlbWVudHNBdFBvc2l0aW9uKFxuICAgICAgICAgIHBvaW50ZXJEb3duU3RhdGUub3JpZ2luLngsXG4gICAgICAgICAgcG9pbnRlckRvd25TdGF0ZS5vcmlnaW4ueSxcbiAgICAgICAgKTtcblxuICAgICAgICBjb25zdCBoaXRFbGVtZW50ID0gcG9pbnRlckRvd25TdGF0ZS5oaXQuZWxlbWVudDtcbiAgICAgICAgY29uc3Qgc29tZUhpdEVsZW1lbnRJc1NlbGVjdGVkID1cbiAgICAgICAgICBwb2ludGVyRG93blN0YXRlLmhpdC5hbGxIaXRFbGVtZW50cy5zb21lKChlbGVtZW50KSA9PlxuICAgICAgICAgICAgdGhpcy5pc0FTZWxlY3RlZEVsZW1lbnQoZWxlbWVudCksXG4gICAgICAgICAgKTtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIChoaXRFbGVtZW50ID09PSBudWxsIHx8ICFzb21lSGl0RWxlbWVudElzU2VsZWN0ZWQpICYmXG4gICAgICAgICAgIWV2ZW50LnNoaWZ0S2V5ICYmXG4gICAgICAgICAgIXBvaW50ZXJEb3duU3RhdGUuaGl0Lmhhc0hpdENvbW1vbkJvdW5kaW5nQm94T2ZTZWxlY3RlZEVsZW1lbnRzXG4gICAgICAgICkge1xuICAgICAgICAgIHRoaXMuY2xlYXJTZWxlY3Rpb24oaGl0RWxlbWVudCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5zdGF0ZS5lZGl0aW5nTGluZWFyRWxlbWVudCkge1xuICAgICAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICAgICAgc2VsZWN0ZWRFbGVtZW50SWRzOiB7XG4gICAgICAgICAgICAgIFt0aGlzLnN0YXRlLmVkaXRpbmdMaW5lYXJFbGVtZW50LmVsZW1lbnRJZF06IHRydWUsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIC8vIElmIHdlIGNsaWNrIG9uIHNvbWV0aGluZ1xuICAgICAgICB9IGVsc2UgaWYgKGhpdEVsZW1lbnQgIT0gbnVsbCkge1xuICAgICAgICAgIC8vIG9uIENNRC9DVFJMLCBkcmlsbCBkb3duIHRvIGhpdCBlbGVtZW50IHJlZ2FyZGxlc3Mgb2YgZ3JvdXBzIGV0Yy5cbiAgICAgICAgICBpZiAoZXZlbnRbS0VZUy5DVFJMX09SX0NNRF0pIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5zdGF0ZS5zZWxlY3RlZEVsZW1lbnRJZHNbaGl0RWxlbWVudC5pZF0pIHtcbiAgICAgICAgICAgICAgcG9pbnRlckRvd25TdGF0ZS5oaXQud2FzQWRkZWRUb1NlbGVjdGlvbiA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnNldFN0YXRlKChwcmV2U3RhdGUpID0+ICh7XG4gICAgICAgICAgICAgIC4uLmVkaXRHcm91cEZvclNlbGVjdGVkRWxlbWVudChwcmV2U3RhdGUsIGhpdEVsZW1lbnQpLFxuICAgICAgICAgICAgICBwcmV2aW91c1NlbGVjdGVkRWxlbWVudElkczogdGhpcy5zdGF0ZS5zZWxlY3RlZEVsZW1lbnRJZHMsXG4gICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICAvLyBtYXJrIGFzIG5vdCBjb21wbGV0ZWx5IGhhbmRsZWQgc28gYXMgdG8gYWxsb3cgZHJhZ2dpbmcgZXRjLlxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIGRlc2VsZWN0IGlmIGl0ZW0gaXMgc2VsZWN0ZWRcbiAgICAgICAgICAvLyBpZiBzaGlmdCBpcyBub3QgY2xpY2tlZCwgdGhpcyB3aWxsIGFsd2F5cyByZXR1cm4gdHJ1ZVxuICAgICAgICAgIC8vIG90aGVyd2lzZSwgaXQgd2lsbCB0cmlnZ2VyIHNlbGVjdGlvbiBiYXNlZCBvbiBjdXJyZW50XG4gICAgICAgICAgLy8gc3RhdGUgb2YgdGhlIGJveFxuICAgICAgICAgIGlmICghdGhpcy5zdGF0ZS5zZWxlY3RlZEVsZW1lbnRJZHNbaGl0RWxlbWVudC5pZF0pIHtcbiAgICAgICAgICAgIC8vIGlmIHdlIGFyZSBjdXJyZW50bHkgZWRpdGluZyBhIGdyb3VwLCBleGl0aW5nIGVkaXRpbmcgbW9kZSBhbmQgZGVzZWxlY3QgdGhlIGdyb3VwLlxuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICB0aGlzLnN0YXRlLmVkaXRpbmdHcm91cElkICYmXG4gICAgICAgICAgICAgICFpc0VsZW1lbnRJbkdyb3VwKGhpdEVsZW1lbnQsIHRoaXMuc3RhdGUuZWRpdGluZ0dyb3VwSWQpXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgICAgICAgc2VsZWN0ZWRFbGVtZW50SWRzOiB7fSxcbiAgICAgICAgICAgICAgICBzZWxlY3RlZEdyb3VwSWRzOiB7fSxcbiAgICAgICAgICAgICAgICBlZGl0aW5nR3JvdXBJZDogbnVsbCxcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIEFkZCBoaXQgZWxlbWVudCB0byBzZWxlY3Rpb24uIEF0IHRoaXMgcG9pbnQgaWYgd2UncmUgbm90IGhvbGRpbmdcbiAgICAgICAgICAgIC8vIFNISUZUIHRoZSBwcmV2aW91c2x5IHNlbGVjdGVkIGVsZW1lbnQocykgd2VyZSBkZXNlbGVjdGVkIGFib3ZlXG4gICAgICAgICAgICAvLyAobWFrZSBzdXJlIHlvdSB1c2Ugc2V0U3RhdGUgdXBkYXRlciB0byB1c2UgbGF0ZXN0IHN0YXRlKVxuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAhc29tZUhpdEVsZW1lbnRJc1NlbGVjdGVkICYmXG4gICAgICAgICAgICAgICFwb2ludGVyRG93blN0YXRlLmhpdC5oYXNIaXRDb21tb25Cb3VuZGluZ0JveE9mU2VsZWN0ZWRFbGVtZW50c1xuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgIHRoaXMuc2V0U3RhdGUoKHByZXZTdGF0ZSkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBzZWxlY3RHcm91cHNGb3JTZWxlY3RlZEVsZW1lbnRzKFxuICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAuLi5wcmV2U3RhdGUsXG4gICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkRWxlbWVudElkczoge1xuICAgICAgICAgICAgICAgICAgICAgIC4uLnByZXZTdGF0ZS5zZWxlY3RlZEVsZW1lbnRJZHMsXG4gICAgICAgICAgICAgICAgICAgICAgW2hpdEVsZW1lbnQuaWRdOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICBzaG93SHlwZXJsaW5rUG9wdXA6IGhpdEVsZW1lbnQubGluayA/IFwiaW5mb1wiIDogZmFsc2UsXG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgdGhpcy5zY2VuZS5nZXROb25EZWxldGVkRWxlbWVudHMoKSxcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgcG9pbnRlckRvd25TdGF0ZS5oaXQud2FzQWRkZWRUb1NlbGVjdGlvbiA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgcHJldmlvdXNTZWxlY3RlZEVsZW1lbnRJZHM6IHRoaXMuc3RhdGUuc2VsZWN0ZWRFbGVtZW50SWRzLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9O1xuXG4gIHByaXZhdGUgaXNBU2VsZWN0ZWRFbGVtZW50KGhpdEVsZW1lbnQ6IEV4Y2FsaWRyYXdFbGVtZW50IHwgbnVsbCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBoaXRFbGVtZW50ICE9IG51bGwgJiYgdGhpcy5zdGF0ZS5zZWxlY3RlZEVsZW1lbnRJZHNbaGl0RWxlbWVudC5pZF07XG4gIH1cblxuICBwcml2YXRlIGlzSGl0dGluZ0NvbW1vbkJvdW5kaW5nQm94T2ZTZWxlY3RlZEVsZW1lbnRzKFxuICAgIHBvaW50OiBSZWFkb25seTx7IHg6IG51bWJlcjsgeTogbnVtYmVyIH0+LFxuICAgIHNlbGVjdGVkRWxlbWVudHM6IHJlYWRvbmx5IEV4Y2FsaWRyYXdFbGVtZW50W10sXG4gICk6IGJvb2xlYW4ge1xuICAgIGlmIChzZWxlY3RlZEVsZW1lbnRzLmxlbmd0aCA8IDIpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyBIb3cgbWFueSBwaXhlbHMgb2ZmIHRoZSBzaGFwZSBib3VuZGFyeSB3ZSBzdGlsbCBjb25zaWRlciBhIGhpdFxuICAgIGNvbnN0IHRocmVzaG9sZCA9IDEwIC8gdGhpcy5zdGF0ZS56b29tLnZhbHVlO1xuICAgIGNvbnN0IFt4MSwgeTEsIHgyLCB5Ml0gPSBnZXRDb21tb25Cb3VuZHMoc2VsZWN0ZWRFbGVtZW50cyk7XG4gICAgcmV0dXJuIChcbiAgICAgIHBvaW50LnggPiB4MSAtIHRocmVzaG9sZCAmJlxuICAgICAgcG9pbnQueCA8IHgyICsgdGhyZXNob2xkICYmXG4gICAgICBwb2ludC55ID4geTEgLSB0aHJlc2hvbGQgJiZcbiAgICAgIHBvaW50LnkgPCB5MiArIHRocmVzaG9sZFxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZVRleHRPblBvaW50ZXJEb3duID0gKFxuICAgIGV2ZW50OiBSZWFjdC5Qb2ludGVyRXZlbnQ8SFRNTENhbnZhc0VsZW1lbnQ+LFxuICAgIHBvaW50ZXJEb3duU3RhdGU6IFBvaW50ZXJEb3duU3RhdGUsXG4gICk6IHZvaWQgPT4ge1xuICAgIC8vIGlmIHdlJ3JlIGN1cnJlbnRseSBzdGlsbCBlZGl0aW5nIHRleHQsIGNsaWNraW5nIG91dHNpZGVcbiAgICAvLyBzaG91bGQgb25seSBmaW5hbGl6ZSBpdCwgbm90IGNyZWF0ZSBhbm90aGVyIChpcnJlc3BlY3RpdmVcbiAgICAvLyBvZiBzdGF0ZS5hY3RpdmVUb29sLmxvY2tlZClcbiAgICBpZiAoaXNUZXh0RWxlbWVudCh0aGlzLnN0YXRlLmVkaXRpbmdFbGVtZW50KSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBsZXQgc2NlbmVYID0gcG9pbnRlckRvd25TdGF0ZS5vcmlnaW4ueDtcbiAgICBsZXQgc2NlbmVZID0gcG9pbnRlckRvd25TdGF0ZS5vcmlnaW4ueTtcblxuICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLmdldEVsZW1lbnRBdFBvc2l0aW9uKHNjZW5lWCwgc2NlbmVZLCB7XG4gICAgICBpbmNsdWRlQm91bmRUZXh0RWxlbWVudDogdHJ1ZSxcbiAgICB9KTtcblxuICAgIGNvbnN0IGNhbkJpbmRUZXh0ID0gaGFzQm91bmRUZXh0RWxlbWVudChlbGVtZW50KTtcbiAgICBpZiAoY2FuQmluZFRleHQpIHtcbiAgICAgIHNjZW5lWCA9IGVsZW1lbnQueCArIGVsZW1lbnQud2lkdGggLyAyO1xuICAgICAgc2NlbmVZID0gZWxlbWVudC55ICsgZWxlbWVudC5oZWlnaHQgLyAyO1xuICAgIH1cbiAgICB0aGlzLnN0YXJ0VGV4dEVkaXRpbmcoe1xuICAgICAgc2NlbmVYLFxuICAgICAgc2NlbmVZLFxuICAgICAgc2hvdWxkQmluZDogZmFsc2UsXG4gICAgICBpbnNlcnRBdFBhcmVudENlbnRlcjogIWV2ZW50LmFsdEtleSxcbiAgICB9KTtcblxuICAgIHJlc2V0Q3Vyc29yKHRoaXMuY2FudmFzKTtcbiAgICBpZiAoIXRoaXMuc3RhdGUuYWN0aXZlVG9vbC5sb2NrZWQpIHtcbiAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICBhY3RpdmVUb29sOiB1cGRhdGVBY3RpdmVUb29sKHRoaXMuc3RhdGUsIHsgdHlwZTogXCJzZWxlY3Rpb25cIiB9KSxcbiAgICAgIH0pO1xuICAgIH1cbiAgfTtcblxuICBwcml2YXRlIGhhbmRsZUZyZWVEcmF3RWxlbWVudE9uUG9pbnRlckRvd24gPSAoXG4gICAgZXZlbnQ6IFJlYWN0LlBvaW50ZXJFdmVudDxIVE1MQ2FudmFzRWxlbWVudD4sXG4gICAgZWxlbWVudFR5cGU6IEV4Y2FsaWRyYXdGcmVlRHJhd0VsZW1lbnRbXCJ0eXBlXCJdLFxuICAgIHBvaW50ZXJEb3duU3RhdGU6IFBvaW50ZXJEb3duU3RhdGUsXG4gICkgPT4ge1xuICAgIC8vIEJlZ2luIGEgbWFyayBjYXB0dXJlLiBUaGlzIGRvZXMgbm90IGhhdmUgdG8gdXBkYXRlIHN0YXRlIHlldC5cbiAgICBjb25zdCBbZ3JpZFgsIGdyaWRZXSA9IGdldEdyaWRQb2ludChcbiAgICAgIHBvaW50ZXJEb3duU3RhdGUub3JpZ2luLngsXG4gICAgICBwb2ludGVyRG93blN0YXRlLm9yaWdpbi55LFxuICAgICAgbnVsbCxcbiAgICApO1xuXG4gICAgY29uc3QgZWxlbWVudCA9IG5ld0ZyZWVEcmF3RWxlbWVudCh7XG4gICAgICB0eXBlOiBlbGVtZW50VHlwZSxcbiAgICAgIHg6IGdyaWRYLFxuICAgICAgeTogZ3JpZFksXG4gICAgICBzdHJva2VDb2xvcjogdGhpcy5zdGF0ZS5jdXJyZW50SXRlbVN0cm9rZUNvbG9yLFxuICAgICAgYmFja2dyb3VuZENvbG9yOiB0aGlzLnN0YXRlLmN1cnJlbnRJdGVtQmFja2dyb3VuZENvbG9yLFxuICAgICAgZmlsbFN0eWxlOiB0aGlzLnN0YXRlLmN1cnJlbnRJdGVtRmlsbFN0eWxlLFxuICAgICAgc3Ryb2tlV2lkdGg6IHRoaXMuc3RhdGUuY3VycmVudEl0ZW1TdHJva2VXaWR0aCxcbiAgICAgIHN0cm9rZVN0eWxlOiB0aGlzLnN0YXRlLmN1cnJlbnRJdGVtU3Ryb2tlU3R5bGUsXG4gICAgICByb3VnaG5lc3M6IHRoaXMuc3RhdGUuY3VycmVudEl0ZW1Sb3VnaG5lc3MsXG4gICAgICBvcGFjaXR5OiB0aGlzLnN0YXRlLmN1cnJlbnRJdGVtT3BhY2l0eSxcbiAgICAgIHN0cm9rZVNoYXJwbmVzczogdGhpcy5zdGF0ZS5jdXJyZW50SXRlbUxpbmVhclN0cm9rZVNoYXJwbmVzcyxcbiAgICAgIHNpbXVsYXRlUHJlc3N1cmU6IGV2ZW50LnByZXNzdXJlID09PSAwLjUsXG4gICAgICBsb2NrZWQ6IGZhbHNlLFxuICAgIH0pO1xuXG4gICAgdGhpcy5zZXRTdGF0ZSgocHJldlN0YXRlKSA9PiAoe1xuICAgICAgc2VsZWN0ZWRFbGVtZW50SWRzOiB7XG4gICAgICAgIC4uLnByZXZTdGF0ZS5zZWxlY3RlZEVsZW1lbnRJZHMsXG4gICAgICAgIFtlbGVtZW50LmlkXTogZmFsc2UsXG4gICAgICB9LFxuICAgIH0pKTtcblxuICAgIGNvbnN0IHByZXNzdXJlcyA9IGVsZW1lbnQuc2ltdWxhdGVQcmVzc3VyZVxuICAgICAgPyBlbGVtZW50LnByZXNzdXJlc1xuICAgICAgOiBbLi4uZWxlbWVudC5wcmVzc3VyZXMsIGV2ZW50LnByZXNzdXJlXTtcblxuICAgIG11dGF0ZUVsZW1lbnQoZWxlbWVudCwge1xuICAgICAgcG9pbnRzOiBbWzAsIDBdXSxcbiAgICAgIHByZXNzdXJlcyxcbiAgICB9KTtcblxuICAgIGNvbnN0IGJvdW5kRWxlbWVudCA9IGdldEhvdmVyZWRFbGVtZW50Rm9yQmluZGluZyhcbiAgICAgIHBvaW50ZXJEb3duU3RhdGUub3JpZ2luLFxuICAgICAgdGhpcy5zY2VuZSxcbiAgICApO1xuICAgIHRoaXMuc2NlbmUucmVwbGFjZUFsbEVsZW1lbnRzKFtcbiAgICAgIC4uLnRoaXMuc2NlbmUuZ2V0RWxlbWVudHNJbmNsdWRpbmdEZWxldGVkKCksXG4gICAgICBlbGVtZW50LFxuICAgIF0pO1xuICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgZHJhZ2dpbmdFbGVtZW50OiBlbGVtZW50LFxuICAgICAgZWRpdGluZ0VsZW1lbnQ6IGVsZW1lbnQsXG4gICAgICBzdGFydEJvdW5kRWxlbWVudDogYm91bmRFbGVtZW50LFxuICAgICAgc3VnZ2VzdGVkQmluZGluZ3M6IFtdLFxuICAgIH0pO1xuICB9O1xuXG4gIHByaXZhdGUgY3JlYXRlSW1hZ2VFbGVtZW50ID0gKHtcbiAgICBzY2VuZVgsXG4gICAgc2NlbmVZLFxuICB9OiB7XG4gICAgc2NlbmVYOiBudW1iZXI7XG4gICAgc2NlbmVZOiBudW1iZXI7XG4gIH0pID0+IHtcbiAgICBjb25zdCBbZ3JpZFgsIGdyaWRZXSA9IGdldEdyaWRQb2ludChzY2VuZVgsIHNjZW5lWSwgdGhpcy5zdGF0ZS5ncmlkU2l6ZSk7XG5cbiAgICBjb25zdCBlbGVtZW50ID0gbmV3SW1hZ2VFbGVtZW50KHtcbiAgICAgIHR5cGU6IFwiaW1hZ2VcIixcbiAgICAgIHg6IGdyaWRYLFxuICAgICAgeTogZ3JpZFksXG4gICAgICBzdHJva2VDb2xvcjogdGhpcy5zdGF0ZS5jdXJyZW50SXRlbVN0cm9rZUNvbG9yLFxuICAgICAgYmFja2dyb3VuZENvbG9yOiB0aGlzLnN0YXRlLmN1cnJlbnRJdGVtQmFja2dyb3VuZENvbG9yLFxuICAgICAgZmlsbFN0eWxlOiB0aGlzLnN0YXRlLmN1cnJlbnRJdGVtRmlsbFN0eWxlLFxuICAgICAgc3Ryb2tlV2lkdGg6IHRoaXMuc3RhdGUuY3VycmVudEl0ZW1TdHJva2VXaWR0aCxcbiAgICAgIHN0cm9rZVN0eWxlOiB0aGlzLnN0YXRlLmN1cnJlbnRJdGVtU3Ryb2tlU3R5bGUsXG4gICAgICByb3VnaG5lc3M6IHRoaXMuc3RhdGUuY3VycmVudEl0ZW1Sb3VnaG5lc3MsXG4gICAgICBvcGFjaXR5OiB0aGlzLnN0YXRlLmN1cnJlbnRJdGVtT3BhY2l0eSxcbiAgICAgIHN0cm9rZVNoYXJwbmVzczogdGhpcy5zdGF0ZS5jdXJyZW50SXRlbUxpbmVhclN0cm9rZVNoYXJwbmVzcyxcbiAgICAgIGxvY2tlZDogZmFsc2UsXG4gICAgfSk7XG5cbiAgICByZXR1cm4gZWxlbWVudDtcbiAgfTtcblxuICBwcml2YXRlIGhhbmRsZUxpbmVhckVsZW1lbnRPblBvaW50ZXJEb3duID0gKFxuICAgIGV2ZW50OiBSZWFjdC5Qb2ludGVyRXZlbnQ8SFRNTENhbnZhc0VsZW1lbnQ+LFxuICAgIGVsZW1lbnRUeXBlOiBFeGNhbGlkcmF3TGluZWFyRWxlbWVudFtcInR5cGVcIl0sXG4gICAgcG9pbnRlckRvd25TdGF0ZTogUG9pbnRlckRvd25TdGF0ZSxcbiAgKTogdm9pZCA9PiB7XG4gICAgaWYgKHRoaXMuc3RhdGUubXVsdGlFbGVtZW50KSB7XG4gICAgICBjb25zdCB7IG11bHRpRWxlbWVudCB9ID0gdGhpcy5zdGF0ZTtcblxuICAgICAgLy8gZmluYWxpemUgaWYgY29tcGxldGluZyBhIGxvb3BcbiAgICAgIGlmIChcbiAgICAgICAgbXVsdGlFbGVtZW50LnR5cGUgPT09IFwibGluZVwiICYmXG4gICAgICAgIGlzUGF0aEFMb29wKG11bHRpRWxlbWVudC5wb2ludHMsIHRoaXMuc3RhdGUuem9vbS52YWx1ZSlcbiAgICAgICkge1xuICAgICAgICBtdXRhdGVFbGVtZW50KG11bHRpRWxlbWVudCwge1xuICAgICAgICAgIGxhc3RDb21taXR0ZWRQb2ludDpcbiAgICAgICAgICAgIG11bHRpRWxlbWVudC5wb2ludHNbbXVsdGlFbGVtZW50LnBvaW50cy5sZW5ndGggLSAxXSxcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuYWN0aW9uTWFuYWdlci5leGVjdXRlQWN0aW9uKGFjdGlvbkZpbmFsaXplKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCB7IHg6IHJ4LCB5OiByeSwgbGFzdENvbW1pdHRlZFBvaW50IH0gPSBtdWx0aUVsZW1lbnQ7XG5cbiAgICAgIC8vIGNsaWNraW5nIGluc2lkZSBjb21taXQgem9uZSDihpIgZmluYWxpemUgYXJyb3dcbiAgICAgIGlmIChcbiAgICAgICAgbXVsdGlFbGVtZW50LnBvaW50cy5sZW5ndGggPiAxICYmXG4gICAgICAgIGxhc3RDb21taXR0ZWRQb2ludCAmJlxuICAgICAgICBkaXN0YW5jZTJkKFxuICAgICAgICAgIHBvaW50ZXJEb3duU3RhdGUub3JpZ2luLnggLSByeCxcbiAgICAgICAgICBwb2ludGVyRG93blN0YXRlLm9yaWdpbi55IC0gcnksXG4gICAgICAgICAgbGFzdENvbW1pdHRlZFBvaW50WzBdLFxuICAgICAgICAgIGxhc3RDb21taXR0ZWRQb2ludFsxXSxcbiAgICAgICAgKSA8IExJTkVfQ09ORklSTV9USFJFU0hPTERcbiAgICAgICkge1xuICAgICAgICB0aGlzLmFjdGlvbk1hbmFnZXIuZXhlY3V0ZUFjdGlvbihhY3Rpb25GaW5hbGl6ZSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdGhpcy5zZXRTdGF0ZSgocHJldlN0YXRlKSA9PiAoe1xuICAgICAgICBzZWxlY3RlZEVsZW1lbnRJZHM6IHtcbiAgICAgICAgICAuLi5wcmV2U3RhdGUuc2VsZWN0ZWRFbGVtZW50SWRzLFxuICAgICAgICAgIFttdWx0aUVsZW1lbnQuaWRdOiB0cnVlLFxuICAgICAgICB9LFxuICAgICAgfSkpO1xuICAgICAgLy8gY2xpY2tpbmcgb3V0c2lkZSBjb21taXQgem9uZSDihpIgdXBkYXRlIHJlZmVyZW5jZSBmb3IgbGFzdCBjb21taXR0ZWRcbiAgICAgIC8vIHBvaW50XG4gICAgICBtdXRhdGVFbGVtZW50KG11bHRpRWxlbWVudCwge1xuICAgICAgICBsYXN0Q29tbWl0dGVkUG9pbnQ6IG11bHRpRWxlbWVudC5wb2ludHNbbXVsdGlFbGVtZW50LnBvaW50cy5sZW5ndGggLSAxXSxcbiAgICAgIH0pO1xuICAgICAgc2V0Q3Vyc29yKHRoaXMuY2FudmFzLCBDVVJTT1JfVFlQRS5QT0lOVEVSKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgW2dyaWRYLCBncmlkWV0gPSBnZXRHcmlkUG9pbnQoXG4gICAgICAgIHBvaW50ZXJEb3duU3RhdGUub3JpZ2luLngsXG4gICAgICAgIHBvaW50ZXJEb3duU3RhdGUub3JpZ2luLnksXG4gICAgICAgIHRoaXMuc3RhdGUuZ3JpZFNpemUsXG4gICAgICApO1xuXG4gICAgICAvKiBJZiBhcnJvdyBpcyBwcmUtYXJyb3doZWFkcywgaXQgd2lsbCBoYXZlIHVuZGVmaW5lZCBmb3IgYm90aCBzdGFydCBhbmQgZW5kIGFycm93aGVhZHMuXG4gICAgICBJZiBzbywgd2Ugd2FudCBpdCB0byBiZSBudWxsIGZvciBzdGFydCBhbmQgXCJhcnJvd1wiIGZvciBlbmQuIElmIHRoZSBsaW5lYXIgaXRlbSBpcyBub3RcbiAgICAgIGFuIGFycm93LCB3ZSB3YW50IGl0IHRvIGJlIG51bGwgZm9yIGJvdGguIE90aGVyd2lzZSwgd2Ugd2FudCBpdCB0byB1c2UgdGhlXG4gICAgICB2YWx1ZXMgZnJvbSBhcHBTdGF0ZS4gKi9cblxuICAgICAgY29uc3QgeyBjdXJyZW50SXRlbVN0YXJ0QXJyb3doZWFkLCBjdXJyZW50SXRlbUVuZEFycm93aGVhZCB9ID0gdGhpcy5zdGF0ZTtcbiAgICAgIGNvbnN0IFtzdGFydEFycm93aGVhZCwgZW5kQXJyb3doZWFkXSA9XG4gICAgICAgIGVsZW1lbnRUeXBlID09PSBcImFycm93XCJcbiAgICAgICAgICA/IFtjdXJyZW50SXRlbVN0YXJ0QXJyb3doZWFkLCBjdXJyZW50SXRlbUVuZEFycm93aGVhZF1cbiAgICAgICAgICA6IFtudWxsLCBudWxsXTtcblxuICAgICAgY29uc3QgZWxlbWVudCA9IG5ld0xpbmVhckVsZW1lbnQoe1xuICAgICAgICB0eXBlOiBlbGVtZW50VHlwZSxcbiAgICAgICAgeDogZ3JpZFgsXG4gICAgICAgIHk6IGdyaWRZLFxuICAgICAgICBzdHJva2VDb2xvcjogdGhpcy5zdGF0ZS5jdXJyZW50SXRlbVN0cm9rZUNvbG9yLFxuICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IHRoaXMuc3RhdGUuY3VycmVudEl0ZW1CYWNrZ3JvdW5kQ29sb3IsXG4gICAgICAgIGZpbGxTdHlsZTogdGhpcy5zdGF0ZS5jdXJyZW50SXRlbUZpbGxTdHlsZSxcbiAgICAgICAgc3Ryb2tlV2lkdGg6IHRoaXMuc3RhdGUuY3VycmVudEl0ZW1TdHJva2VXaWR0aCxcbiAgICAgICAgc3Ryb2tlU3R5bGU6IHRoaXMuc3RhdGUuY3VycmVudEl0ZW1TdHJva2VTdHlsZSxcbiAgICAgICAgcm91Z2huZXNzOiB0aGlzLnN0YXRlLmN1cnJlbnRJdGVtUm91Z2huZXNzLFxuICAgICAgICBvcGFjaXR5OiB0aGlzLnN0YXRlLmN1cnJlbnRJdGVtT3BhY2l0eSxcbiAgICAgICAgc3Ryb2tlU2hhcnBuZXNzOiB0aGlzLnN0YXRlLmN1cnJlbnRJdGVtTGluZWFyU3Ryb2tlU2hhcnBuZXNzLFxuICAgICAgICBzdGFydEFycm93aGVhZCxcbiAgICAgICAgZW5kQXJyb3doZWFkLFxuICAgICAgICBsb2NrZWQ6IGZhbHNlLFxuICAgICAgfSk7XG4gICAgICB0aGlzLnNldFN0YXRlKChwcmV2U3RhdGUpID0+ICh7XG4gICAgICAgIHNlbGVjdGVkRWxlbWVudElkczoge1xuICAgICAgICAgIC4uLnByZXZTdGF0ZS5zZWxlY3RlZEVsZW1lbnRJZHMsXG4gICAgICAgICAgW2VsZW1lbnQuaWRdOiBmYWxzZSxcbiAgICAgICAgfSxcbiAgICAgIH0pKTtcbiAgICAgIG11dGF0ZUVsZW1lbnQoZWxlbWVudCwge1xuICAgICAgICBwb2ludHM6IFsuLi5lbGVtZW50LnBvaW50cywgWzAsIDBdXSxcbiAgICAgIH0pO1xuICAgICAgY29uc3QgYm91bmRFbGVtZW50ID0gZ2V0SG92ZXJlZEVsZW1lbnRGb3JCaW5kaW5nKFxuICAgICAgICBwb2ludGVyRG93blN0YXRlLm9yaWdpbixcbiAgICAgICAgdGhpcy5zY2VuZSxcbiAgICAgICk7XG4gICAgICB0aGlzLnNjZW5lLnJlcGxhY2VBbGxFbGVtZW50cyhbXG4gICAgICAgIC4uLnRoaXMuc2NlbmUuZ2V0RWxlbWVudHNJbmNsdWRpbmdEZWxldGVkKCksXG4gICAgICAgIGVsZW1lbnQsXG4gICAgICBdKTtcbiAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICBkcmFnZ2luZ0VsZW1lbnQ6IGVsZW1lbnQsXG4gICAgICAgIGVkaXRpbmdFbGVtZW50OiBlbGVtZW50LFxuICAgICAgICBzdGFydEJvdW5kRWxlbWVudDogYm91bmRFbGVtZW50LFxuICAgICAgICBzdWdnZXN0ZWRCaW5kaW5nczogW10sXG4gICAgICB9KTtcbiAgICB9XG4gIH07XG5cbiAgcHJpdmF0ZSBjcmVhdGVHZW5lcmljRWxlbWVudE9uUG9pbnRlckRvd24gPSAoXG4gICAgZWxlbWVudFR5cGU6IEV4Y2FsaWRyYXdHZW5lcmljRWxlbWVudFtcInR5cGVcIl0sXG4gICAgcG9pbnRlckRvd25TdGF0ZTogUG9pbnRlckRvd25TdGF0ZSxcbiAgKTogdm9pZCA9PiB7XG4gICAgY29uc3QgW2dyaWRYLCBncmlkWV0gPSBnZXRHcmlkUG9pbnQoXG4gICAgICBwb2ludGVyRG93blN0YXRlLm9yaWdpbi54LFxuICAgICAgcG9pbnRlckRvd25TdGF0ZS5vcmlnaW4ueSxcbiAgICAgIHRoaXMuc3RhdGUuZ3JpZFNpemUsXG4gICAgKTtcbiAgICBjb25zdCBlbGVtZW50ID0gbmV3RWxlbWVudCh7XG4gICAgICB0eXBlOiBlbGVtZW50VHlwZSxcbiAgICAgIHg6IGdyaWRYLFxuICAgICAgeTogZ3JpZFksXG4gICAgICBzdHJva2VDb2xvcjogdGhpcy5zdGF0ZS5jdXJyZW50SXRlbVN0cm9rZUNvbG9yLFxuICAgICAgYmFja2dyb3VuZENvbG9yOiB0aGlzLnN0YXRlLmN1cnJlbnRJdGVtQmFja2dyb3VuZENvbG9yLFxuICAgICAgZmlsbFN0eWxlOiB0aGlzLnN0YXRlLmN1cnJlbnRJdGVtRmlsbFN0eWxlLFxuICAgICAgc3Ryb2tlV2lkdGg6IHRoaXMuc3RhdGUuY3VycmVudEl0ZW1TdHJva2VXaWR0aCxcbiAgICAgIHN0cm9rZVN0eWxlOiB0aGlzLnN0YXRlLmN1cnJlbnRJdGVtU3Ryb2tlU3R5bGUsXG4gICAgICByb3VnaG5lc3M6IHRoaXMuc3RhdGUuY3VycmVudEl0ZW1Sb3VnaG5lc3MsXG4gICAgICBvcGFjaXR5OiB0aGlzLnN0YXRlLmN1cnJlbnRJdGVtT3BhY2l0eSxcbiAgICAgIHN0cm9rZVNoYXJwbmVzczogdGhpcy5zdGF0ZS5jdXJyZW50SXRlbVN0cm9rZVNoYXJwbmVzcyxcbiAgICAgIGxvY2tlZDogZmFsc2UsXG4gICAgfSk7XG5cbiAgICBpZiAoZWxlbWVudC50eXBlID09PSBcInNlbGVjdGlvblwiKSB7XG4gICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgc2VsZWN0aW9uRWxlbWVudDogZWxlbWVudCxcbiAgICAgICAgZHJhZ2dpbmdFbGVtZW50OiBlbGVtZW50LFxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc2NlbmUucmVwbGFjZUFsbEVsZW1lbnRzKFtcbiAgICAgICAgLi4udGhpcy5zY2VuZS5nZXRFbGVtZW50c0luY2x1ZGluZ0RlbGV0ZWQoKSxcbiAgICAgICAgZWxlbWVudCxcbiAgICAgIF0pO1xuICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgIG11bHRpRWxlbWVudDogbnVsbCxcbiAgICAgICAgZHJhZ2dpbmdFbGVtZW50OiBlbGVtZW50LFxuICAgICAgICBlZGl0aW5nRWxlbWVudDogZWxlbWVudCxcbiAgICAgIH0pO1xuICAgIH1cbiAgfTtcblxuICBwcml2YXRlIG9uS2V5RG93bkZyb21Qb2ludGVyRG93bkhhbmRsZXIoXG4gICAgcG9pbnRlckRvd25TdGF0ZTogUG9pbnRlckRvd25TdGF0ZSxcbiAgKTogKGV2ZW50OiBLZXlib2FyZEV2ZW50KSA9PiB2b2lkIHtcbiAgICByZXR1cm4gd2l0aEJhdGNoZWRVcGRhdGVzKChldmVudDogS2V5Ym9hcmRFdmVudCkgPT4ge1xuICAgICAgaWYgKHRoaXMubWF5YmVIYW5kbGVSZXNpemUocG9pbnRlckRvd25TdGF0ZSwgZXZlbnQpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRoaXMubWF5YmVEcmFnTmV3R2VuZXJpY0VsZW1lbnQocG9pbnRlckRvd25TdGF0ZSwgZXZlbnQpO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBvbktleVVwRnJvbVBvaW50ZXJEb3duSGFuZGxlcihcbiAgICBwb2ludGVyRG93blN0YXRlOiBQb2ludGVyRG93blN0YXRlLFxuICApOiAoZXZlbnQ6IEtleWJvYXJkRXZlbnQpID0+IHZvaWQge1xuICAgIHJldHVybiB3aXRoQmF0Y2hlZFVwZGF0ZXMoKGV2ZW50OiBLZXlib2FyZEV2ZW50KSA9PiB7XG4gICAgICAvLyBQcmV2ZW50cyBmb2N1cyBmcm9tIGVzY2FwaW5nIGV4Y2FsaWRyYXcgdGFiXG4gICAgICBldmVudC5rZXkgPT09IEtFWVMuQUxUICYmIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBpZiAodGhpcy5tYXliZUhhbmRsZVJlc2l6ZShwb2ludGVyRG93blN0YXRlLCBldmVudCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdGhpcy5tYXliZURyYWdOZXdHZW5lcmljRWxlbWVudChwb2ludGVyRG93blN0YXRlLCBldmVudCk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIG9uUG9pbnRlck1vdmVGcm9tUG9pbnRlckRvd25IYW5kbGVyKFxuICAgIHBvaW50ZXJEb3duU3RhdGU6IFBvaW50ZXJEb3duU3RhdGUsXG4gICkge1xuICAgIHJldHVybiB3aXRoQmF0Y2hlZFVwZGF0ZXNUaHJvdHRsZWQoKGV2ZW50OiBQb2ludGVyRXZlbnQpID0+IHtcbiAgICAgIC8vIFdlIG5lZWQgdG8gaW5pdGlhbGl6ZSBkcmFnT2Zmc2V0WFkgb25seSBhZnRlciB3ZSd2ZSB1cGRhdGVkXG4gICAgICAvLyBgc3RhdGUuc2VsZWN0ZWRFbGVtZW50SWRzYCBvbiBwb2ludGVyRG93bi4gRG9pbmcgaXQgaGVyZSBpbiBwb2ludGVyTW92ZVxuICAgICAgLy8gZXZlbnQgaGFuZGxlciBzaG91bGQgaG9wZWZ1bGx5IGVuc3VyZSB3ZSdyZSBhbHJlYWR5IHdvcmtpbmcgd2l0aFxuICAgICAgLy8gdGhlIHVwZGF0ZWQgc3RhdGUuXG4gICAgICBpZiAocG9pbnRlckRvd25TdGF0ZS5kcmFnLm9mZnNldCA9PT0gbnVsbCkge1xuICAgICAgICBwb2ludGVyRG93blN0YXRlLmRyYWcub2Zmc2V0ID0gdHVwbGVUb0Nvb3JzKFxuICAgICAgICAgIGdldERyYWdPZmZzZXRYWShcbiAgICAgICAgICAgIGdldFNlbGVjdGVkRWxlbWVudHModGhpcy5zY2VuZS5nZXROb25EZWxldGVkRWxlbWVudHMoKSwgdGhpcy5zdGF0ZSksXG4gICAgICAgICAgICBwb2ludGVyRG93blN0YXRlLm9yaWdpbi54LFxuICAgICAgICAgICAgcG9pbnRlckRvd25TdGF0ZS5vcmlnaW4ueSxcbiAgICAgICAgICApLFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgY29uc3QgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0O1xuICAgICAgaWYgKCEodGFyZ2V0IGluc3RhbmNlb2YgSFRNTEVsZW1lbnQpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuaGFuZGxlUG9pbnRlck1vdmVPdmVyU2Nyb2xsYmFycyhldmVudCwgcG9pbnRlckRvd25TdGF0ZSkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBwb2ludGVyQ29vcmRzID0gdmlld3BvcnRDb29yZHNUb1NjZW5lQ29vcmRzKGV2ZW50LCB0aGlzLnN0YXRlKTtcblxuICAgICAgaWYgKGlzRXJhc2VyQWN0aXZlKHRoaXMuc3RhdGUpKSB7XG4gICAgICAgIHRoaXMuaGFuZGxlRXJhc2VyKGV2ZW50LCBwb2ludGVyRG93blN0YXRlLCBwb2ludGVyQ29vcmRzKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBbZ3JpZFgsIGdyaWRZXSA9IGdldEdyaWRQb2ludChcbiAgICAgICAgcG9pbnRlckNvb3Jkcy54LFxuICAgICAgICBwb2ludGVyQ29vcmRzLnksXG4gICAgICAgIHRoaXMuc3RhdGUuZ3JpZFNpemUsXG4gICAgICApO1xuXG4gICAgICAvLyBmb3IgYXJyb3dzL2xpbmVzLCBkb24ndCBzdGFydCBkcmFnZ2luZyB1bnRpbCBhIGdpdmVuIHRocmVzaG9sZFxuICAgICAgLy8gdG8gZW5zdXJlIHdlIGRvbid0IGNyZWF0ZSBhIDItcG9pbnQgYXJyb3cgYnkgbWlzdGFrZSB3aGVuXG4gICAgICAvLyB1c2VyIGNsaWNrcyBtb3VzZSBpbiBhIHdheSB0aGF0IGl0IG1vdmVzIGEgdGlueSBiaXQgKHRodXNcbiAgICAgIC8vIHRyaWdnZXJpbmcgcG9pbnRlcm1vdmUpXG4gICAgICBpZiAoXG4gICAgICAgICFwb2ludGVyRG93blN0YXRlLmRyYWcuaGFzT2NjdXJyZWQgJiZcbiAgICAgICAgKHRoaXMuc3RhdGUuYWN0aXZlVG9vbC50eXBlID09PSBcImFycm93XCIgfHxcbiAgICAgICAgICB0aGlzLnN0YXRlLmFjdGl2ZVRvb2wudHlwZSA9PT0gXCJsaW5lXCIpXG4gICAgICApIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIGRpc3RhbmNlMmQoXG4gICAgICAgICAgICBwb2ludGVyQ29vcmRzLngsXG4gICAgICAgICAgICBwb2ludGVyQ29vcmRzLnksXG4gICAgICAgICAgICBwb2ludGVyRG93blN0YXRlLm9yaWdpbi54LFxuICAgICAgICAgICAgcG9pbnRlckRvd25TdGF0ZS5vcmlnaW4ueSxcbiAgICAgICAgICApIDwgRFJBR0dJTkdfVEhSRVNIT0xEXG4gICAgICAgICkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAocG9pbnRlckRvd25TdGF0ZS5yZXNpemUuaXNSZXNpemluZykge1xuICAgICAgICBwb2ludGVyRG93blN0YXRlLmxhc3RDb29yZHMueCA9IHBvaW50ZXJDb29yZHMueDtcbiAgICAgICAgcG9pbnRlckRvd25TdGF0ZS5sYXN0Q29vcmRzLnkgPSBwb2ludGVyQ29vcmRzLnk7XG4gICAgICAgIGlmICh0aGlzLm1heWJlSGFuZGxlUmVzaXplKHBvaW50ZXJEb3duU3RhdGUsIGV2ZW50KSkge1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLnN0YXRlLmVkaXRpbmdMaW5lYXJFbGVtZW50KSB7XG4gICAgICAgIGNvbnN0IGRpZERyYWcgPSBMaW5lYXJFbGVtZW50RWRpdG9yLmhhbmRsZVBvaW50RHJhZ2dpbmcoXG4gICAgICAgICAgdGhpcy5zdGF0ZSxcbiAgICAgICAgICAoYXBwU3RhdGUpID0+IHRoaXMuc2V0U3RhdGUoYXBwU3RhdGUpLFxuICAgICAgICAgIHBvaW50ZXJDb29yZHMueCxcbiAgICAgICAgICBwb2ludGVyQ29vcmRzLnksXG4gICAgICAgICAgKGVsZW1lbnQsIHBvaW50c1NjZW5lQ29vcmRzKSA9PiB7XG4gICAgICAgICAgICB0aGlzLm1heWJlU3VnZ2VzdEJpbmRpbmdzRm9yTGluZWFyRWxlbWVudEF0Q29vcmRzKFxuICAgICAgICAgICAgICBlbGVtZW50LFxuICAgICAgICAgICAgICBwb2ludHNTY2VuZUNvb3JkcyxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSxcbiAgICAgICAgKTtcblxuICAgICAgICBpZiAoZGlkRHJhZykge1xuICAgICAgICAgIHBvaW50ZXJEb3duU3RhdGUubGFzdENvb3Jkcy54ID0gcG9pbnRlckNvb3Jkcy54O1xuICAgICAgICAgIHBvaW50ZXJEb3duU3RhdGUubGFzdENvb3Jkcy55ID0gcG9pbnRlckNvb3Jkcy55O1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjb25zdCBoYXNIaXRBU2VsZWN0ZWRFbGVtZW50ID0gcG9pbnRlckRvd25TdGF0ZS5oaXQuYWxsSGl0RWxlbWVudHMuc29tZShcbiAgICAgICAgKGVsZW1lbnQpID0+IHRoaXMuaXNBU2VsZWN0ZWRFbGVtZW50KGVsZW1lbnQpLFxuICAgICAgKTtcblxuICAgICAgaWYgKFxuICAgICAgICAoaGFzSGl0QVNlbGVjdGVkRWxlbWVudCB8fFxuICAgICAgICAgIHBvaW50ZXJEb3duU3RhdGUuaGl0Lmhhc0hpdENvbW1vbkJvdW5kaW5nQm94T2ZTZWxlY3RlZEVsZW1lbnRzKSAmJlxuICAgICAgICAvLyB0aGlzIGFsbG93cyBmb3IgYm94LXNlbGVjdGluZyBwb2ludHMgd2hlbiBjbGlja2luZyBpbnNpZGUgdGhlXG4gICAgICAgIC8vIGxpbmUncyBib3VuZGluZyBib3hcbiAgICAgICAgKCF0aGlzLnN0YXRlLmVkaXRpbmdMaW5lYXJFbGVtZW50IHx8ICFldmVudC5zaGlmdEtleSkgJiZcbiAgICAgICAgLy8gYm94LXNlbGVjdGluZyB3aXRob3V0IHNoaWZ0IHdoZW4gZWRpdGluZyBsaW5lLCBub3QgY2xpY2tpbmcgb24gYSBsaW5lXG4gICAgICAgICghdGhpcy5zdGF0ZS5lZGl0aW5nTGluZWFyRWxlbWVudCB8fFxuICAgICAgICAgIHRoaXMuc3RhdGUuZWRpdGluZ0xpbmVhckVsZW1lbnQ/LmVsZW1lbnRJZCAhPT1cbiAgICAgICAgICAgIHBvaW50ZXJEb3duU3RhdGUuaGl0LmVsZW1lbnQ/LmlkIHx8XG4gICAgICAgICAgcG9pbnRlckRvd25TdGF0ZS5oaXQuaGFzSGl0RWxlbWVudEluc2lkZSlcbiAgICAgICkge1xuICAgICAgICBjb25zdCBzZWxlY3RlZEVsZW1lbnRzID0gZ2V0U2VsZWN0ZWRFbGVtZW50cyhcbiAgICAgICAgICB0aGlzLnNjZW5lLmdldE5vbkRlbGV0ZWRFbGVtZW50cygpLFxuICAgICAgICAgIHRoaXMuc3RhdGUsXG4gICAgICAgICk7XG4gICAgICAgIGlmIChzZWxlY3RlZEVsZW1lbnRzLmV2ZXJ5KChlbGVtZW50KSA9PiBlbGVtZW50LmxvY2tlZCkpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy8gTWFya2luZyB0aGF0IGNsaWNrIHdhcyB1c2VkIGZvciBkcmFnZ2luZyB0byBjaGVja1xuICAgICAgICAvLyBpZiBlbGVtZW50cyBzaG91bGQgYmUgZGVzZWxlY3RlZCBvbiBwb2ludGVydXBcbiAgICAgICAgcG9pbnRlckRvd25TdGF0ZS5kcmFnLmhhc09jY3VycmVkID0gdHJ1ZTtcbiAgICAgICAgLy8gcHJldmVudCBkcmFnZ2luZyBldmVuIGlmIHdlJ3JlIG5vIGxvbmdlciBob2xkaW5nIGNtZC9jdHJsIG90aGVyd2lzZVxuICAgICAgICAvLyBpdCB3b3VsZCBoYXZlIHdlaXJkIHJlc3VsdHMgKHN0dWZmIGp1bXBpbmcgYWxsIG92ZXIgdGhlIHNjcmVlbilcbiAgICAgICAgaWYgKHNlbGVjdGVkRWxlbWVudHMubGVuZ3RoID4gMCAmJiAhcG9pbnRlckRvd25TdGF0ZS53aXRoQ21kT3JDdHJsKSB7XG4gICAgICAgICAgY29uc3QgW2RyYWdYLCBkcmFnWV0gPSBnZXRHcmlkUG9pbnQoXG4gICAgICAgICAgICBwb2ludGVyQ29vcmRzLnggLSBwb2ludGVyRG93blN0YXRlLmRyYWcub2Zmc2V0LngsXG4gICAgICAgICAgICBwb2ludGVyQ29vcmRzLnkgLSBwb2ludGVyRG93blN0YXRlLmRyYWcub2Zmc2V0LnksXG4gICAgICAgICAgICB0aGlzLnN0YXRlLmdyaWRTaXplLFxuICAgICAgICAgICk7XG5cbiAgICAgICAgICBjb25zdCBbZHJhZ0Rpc3RhbmNlWCwgZHJhZ0Rpc3RhbmNlWV0gPSBbXG4gICAgICAgICAgICBNYXRoLmFicyhwb2ludGVyQ29vcmRzLnggLSBwb2ludGVyRG93blN0YXRlLm9yaWdpbi54KSxcbiAgICAgICAgICAgIE1hdGguYWJzKHBvaW50ZXJDb29yZHMueSAtIHBvaW50ZXJEb3duU3RhdGUub3JpZ2luLnkpLFxuICAgICAgICAgIF07XG5cbiAgICAgICAgICAvLyBXZSBvbmx5IGRyYWcgaW4gb25lIGRpcmVjdGlvbiBpZiBzaGlmdCBpcyBwcmVzc2VkXG4gICAgICAgICAgY29uc3QgbG9ja0RpcmVjdGlvbiA9IGV2ZW50LnNoaWZ0S2V5O1xuXG4gICAgICAgICAgZHJhZ1NlbGVjdGVkRWxlbWVudHMoXG4gICAgICAgICAgICBwb2ludGVyRG93blN0YXRlLFxuICAgICAgICAgICAgc2VsZWN0ZWRFbGVtZW50cyxcbiAgICAgICAgICAgIGRyYWdYLFxuICAgICAgICAgICAgZHJhZ1ksXG4gICAgICAgICAgICBsb2NrRGlyZWN0aW9uLFxuICAgICAgICAgICAgZHJhZ0Rpc3RhbmNlWCxcbiAgICAgICAgICAgIGRyYWdEaXN0YW5jZVksXG4gICAgICAgICAgICB0aGlzLnN0YXRlLFxuICAgICAgICAgICk7XG4gICAgICAgICAgdGhpcy5tYXliZVN1Z2dlc3RCaW5kaW5nRm9yQWxsKHNlbGVjdGVkRWxlbWVudHMpO1xuXG4gICAgICAgICAgLy8gV2UgZHVwbGljYXRlIHRoZSBzZWxlY3RlZCBlbGVtZW50IGlmIGFsdCBpcyBwcmVzc2VkIG9uIHBvaW50ZXIgbW92ZVxuICAgICAgICAgIGlmIChldmVudC5hbHRLZXkgJiYgIXBvaW50ZXJEb3duU3RhdGUuaGl0Lmhhc0JlZW5EdXBsaWNhdGVkKSB7XG4gICAgICAgICAgICAvLyBNb3ZlIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgZWxlbWVudHMgdG8gdGhlIHRvcCBvZiB0aGUgeiBpbmRleCBzdGFjaywgYW5kXG4gICAgICAgICAgICAvLyBwdXQgdGhlIGR1cGxpY2F0ZXMgd2hlcmUgdGhlIHNlbGVjdGVkIGVsZW1lbnRzIHVzZWQgdG8gYmUuXG4gICAgICAgICAgICAvLyAodGhlIG9yaWdpbiBwb2ludCB3aGVyZSB0aGUgZHJhZ2dpbmcgc3RhcnRlZClcblxuICAgICAgICAgICAgcG9pbnRlckRvd25TdGF0ZS5oaXQuaGFzQmVlbkR1cGxpY2F0ZWQgPSB0cnVlO1xuXG4gICAgICAgICAgICBjb25zdCBuZXh0RWxlbWVudHMgPSBbXTtcbiAgICAgICAgICAgIGNvbnN0IGVsZW1lbnRzVG9BcHBlbmQgPSBbXTtcbiAgICAgICAgICAgIGNvbnN0IGdyb3VwSWRNYXAgPSBuZXcgTWFwKCk7XG4gICAgICAgICAgICBjb25zdCBvbGRJZFRvRHVwbGljYXRlZElkID0gbmV3IE1hcCgpO1xuICAgICAgICAgICAgY29uc3QgaGl0RWxlbWVudCA9IHBvaW50ZXJEb3duU3RhdGUuaGl0LmVsZW1lbnQ7XG4gICAgICAgICAgICBjb25zdCBlbGVtZW50cyA9IHRoaXMuc2NlbmUuZ2V0RWxlbWVudHNJbmNsdWRpbmdEZWxldGVkKCk7XG4gICAgICAgICAgICBjb25zdCBzZWxlY3RlZEVsZW1lbnRJZHM6IEFycmF5PEV4Y2FsaWRyYXdFbGVtZW50W1wiaWRcIl0+ID1cbiAgICAgICAgICAgICAgZ2V0U2VsZWN0ZWRFbGVtZW50cyhlbGVtZW50cywgdGhpcy5zdGF0ZSwgdHJ1ZSkubWFwKFxuICAgICAgICAgICAgICAgIChlbGVtZW50KSA9PiBlbGVtZW50LmlkLFxuICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgZWxlbWVudHMpIHtcbiAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIHNlbGVjdGVkRWxlbWVudElkcy5pbmNsdWRlcyhlbGVtZW50LmlkKSB8fFxuICAgICAgICAgICAgICAgIC8vIGNhc2U6IHRoZSBzdGF0ZS5zZWxlY3RlZEVsZW1lbnRJZHMgbWlnaHQgbm90IGhhdmUgYmVlblxuICAgICAgICAgICAgICAgIC8vIHVwZGF0ZWQgeWV0IGJ5IHRoZSB0aW1lIHRoaXMgbW91c2Vtb3ZlIGV2ZW50IGlzIGZpcmVkXG4gICAgICAgICAgICAgICAgKGVsZW1lbnQuaWQgPT09IGhpdEVsZW1lbnQ/LmlkICYmXG4gICAgICAgICAgICAgICAgICBwb2ludGVyRG93blN0YXRlLmhpdC53YXNBZGRlZFRvU2VsZWN0aW9uKVxuICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICBjb25zdCBkdXBsaWNhdGVkRWxlbWVudCA9IGR1cGxpY2F0ZUVsZW1lbnQoXG4gICAgICAgICAgICAgICAgICB0aGlzLnN0YXRlLmVkaXRpbmdHcm91cElkLFxuICAgICAgICAgICAgICAgICAgZ3JvdXBJZE1hcCxcbiAgICAgICAgICAgICAgICAgIGVsZW1lbnQsXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBjb25zdCBbb3JpZ2luRHJhZ1gsIG9yaWdpbkRyYWdZXSA9IGdldEdyaWRQb2ludChcbiAgICAgICAgICAgICAgICAgIHBvaW50ZXJEb3duU3RhdGUub3JpZ2luLnggLSBwb2ludGVyRG93blN0YXRlLmRyYWcub2Zmc2V0LngsXG4gICAgICAgICAgICAgICAgICBwb2ludGVyRG93blN0YXRlLm9yaWdpbi55IC0gcG9pbnRlckRvd25TdGF0ZS5kcmFnLm9mZnNldC55LFxuICAgICAgICAgICAgICAgICAgdGhpcy5zdGF0ZS5ncmlkU2l6ZSxcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIG11dGF0ZUVsZW1lbnQoZHVwbGljYXRlZEVsZW1lbnQsIHtcbiAgICAgICAgICAgICAgICAgIHg6IGR1cGxpY2F0ZWRFbGVtZW50LnggKyAob3JpZ2luRHJhZ1ggLSBkcmFnWCksXG4gICAgICAgICAgICAgICAgICB5OiBkdXBsaWNhdGVkRWxlbWVudC55ICsgKG9yaWdpbkRyYWdZIC0gZHJhZ1kpLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIG5leHRFbGVtZW50cy5wdXNoKGR1cGxpY2F0ZWRFbGVtZW50KTtcbiAgICAgICAgICAgICAgICBlbGVtZW50c1RvQXBwZW5kLnB1c2goZWxlbWVudCk7XG4gICAgICAgICAgICAgICAgb2xkSWRUb0R1cGxpY2F0ZWRJZC5zZXQoZWxlbWVudC5pZCwgZHVwbGljYXRlZEVsZW1lbnQuaWQpO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIG5leHRFbGVtZW50cy5wdXNoKGVsZW1lbnQpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBuZXh0U2NlbmVFbGVtZW50cyA9IFsuLi5uZXh0RWxlbWVudHMsIC4uLmVsZW1lbnRzVG9BcHBlbmRdO1xuICAgICAgICAgICAgYmluZFRleHRUb1NoYXBlQWZ0ZXJEdXBsaWNhdGlvbihcbiAgICAgICAgICAgICAgbmV4dEVsZW1lbnRzLFxuICAgICAgICAgICAgICBlbGVtZW50c1RvQXBwZW5kLFxuICAgICAgICAgICAgICBvbGRJZFRvRHVwbGljYXRlZElkLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGZpeEJpbmRpbmdzQWZ0ZXJEdXBsaWNhdGlvbihcbiAgICAgICAgICAgICAgbmV4dFNjZW5lRWxlbWVudHMsXG4gICAgICAgICAgICAgIGVsZW1lbnRzVG9BcHBlbmQsXG4gICAgICAgICAgICAgIG9sZElkVG9EdXBsaWNhdGVkSWQsXG4gICAgICAgICAgICAgIFwiZHVwbGljYXRlc1NlcnZlQXNPbGRcIixcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICB0aGlzLnNjZW5lLnJlcGxhY2VBbGxFbGVtZW50cyhuZXh0U2NlbmVFbGVtZW50cyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBJdCBpcyB2ZXJ5IGltcG9ydGFudCB0byByZWFkIHRoaXMuc3RhdGUgd2l0aGluIGVhY2ggbW92ZSBldmVudCxcbiAgICAgIC8vIG90aGVyd2lzZSB3ZSB3b3VsZCByZWFkIGEgc3RhbGUgb25lIVxuICAgICAgY29uc3QgZHJhZ2dpbmdFbGVtZW50ID0gdGhpcy5zdGF0ZS5kcmFnZ2luZ0VsZW1lbnQ7XG4gICAgICBpZiAoIWRyYWdnaW5nRWxlbWVudCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmIChkcmFnZ2luZ0VsZW1lbnQudHlwZSA9PT0gXCJmcmVlZHJhd1wiKSB7XG4gICAgICAgIGNvbnN0IHBvaW50cyA9IGRyYWdnaW5nRWxlbWVudC5wb2ludHM7XG4gICAgICAgIGNvbnN0IGR4ID0gcG9pbnRlckNvb3Jkcy54IC0gZHJhZ2dpbmdFbGVtZW50Lng7XG4gICAgICAgIGNvbnN0IGR5ID0gcG9pbnRlckNvb3Jkcy55IC0gZHJhZ2dpbmdFbGVtZW50Lnk7XG5cbiAgICAgICAgY29uc3QgbGFzdFBvaW50ID0gcG9pbnRzLmxlbmd0aCA+IDAgJiYgcG9pbnRzW3BvaW50cy5sZW5ndGggLSAxXTtcbiAgICAgICAgY29uc3QgZGlzY2FyZFBvaW50ID1cbiAgICAgICAgICBsYXN0UG9pbnQgJiYgbGFzdFBvaW50WzBdID09PSBkeCAmJiBsYXN0UG9pbnRbMV0gPT09IGR5O1xuXG4gICAgICAgIGlmICghZGlzY2FyZFBvaW50KSB7XG4gICAgICAgICAgY29uc3QgcHJlc3N1cmVzID0gZHJhZ2dpbmdFbGVtZW50LnNpbXVsYXRlUHJlc3N1cmVcbiAgICAgICAgICAgID8gZHJhZ2dpbmdFbGVtZW50LnByZXNzdXJlc1xuICAgICAgICAgICAgOiBbLi4uZHJhZ2dpbmdFbGVtZW50LnByZXNzdXJlcywgZXZlbnQucHJlc3N1cmVdO1xuXG4gICAgICAgICAgbXV0YXRlRWxlbWVudChkcmFnZ2luZ0VsZW1lbnQsIHtcbiAgICAgICAgICAgIHBvaW50czogWy4uLnBvaW50cywgW2R4LCBkeV1dLFxuICAgICAgICAgICAgcHJlc3N1cmVzLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGlzTGluZWFyRWxlbWVudChkcmFnZ2luZ0VsZW1lbnQpKSB7XG4gICAgICAgIHBvaW50ZXJEb3duU3RhdGUuZHJhZy5oYXNPY2N1cnJlZCA9IHRydWU7XG4gICAgICAgIGNvbnN0IHBvaW50cyA9IGRyYWdnaW5nRWxlbWVudC5wb2ludHM7XG4gICAgICAgIGxldCBkeCA9IGdyaWRYIC0gZHJhZ2dpbmdFbGVtZW50Lng7XG4gICAgICAgIGxldCBkeSA9IGdyaWRZIC0gZHJhZ2dpbmdFbGVtZW50Lnk7XG5cbiAgICAgICAgaWYgKHNob3VsZFJvdGF0ZVdpdGhEaXNjcmV0ZUFuZ2xlKGV2ZW50KSAmJiBwb2ludHMubGVuZ3RoID09PSAyKSB7XG4gICAgICAgICAgKHsgd2lkdGg6IGR4LCBoZWlnaHQ6IGR5IH0gPSBnZXRQZXJmZWN0RWxlbWVudFNpemUoXG4gICAgICAgICAgICB0aGlzLnN0YXRlLmFjdGl2ZVRvb2wudHlwZSxcbiAgICAgICAgICAgIGR4LFxuICAgICAgICAgICAgZHksXG4gICAgICAgICAgKSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocG9pbnRzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgIG11dGF0ZUVsZW1lbnQoZHJhZ2dpbmdFbGVtZW50LCB7IHBvaW50czogWy4uLnBvaW50cywgW2R4LCBkeV1dIH0pO1xuICAgICAgICB9IGVsc2UgaWYgKHBvaW50cy5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgbXV0YXRlRWxlbWVudChkcmFnZ2luZ0VsZW1lbnQsIHtcbiAgICAgICAgICAgIHBvaW50czogWy4uLnBvaW50cy5zbGljZSgwLCAtMSksIFtkeCwgZHldXSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpc0JpbmRpbmdFbGVtZW50KGRyYWdnaW5nRWxlbWVudCwgZmFsc2UpKSB7XG4gICAgICAgICAgLy8gV2hlbiBjcmVhdGluZyBhIGxpbmVhciBlbGVtZW50IGJ5IGRyYWdnaW5nXG4gICAgICAgICAgdGhpcy5tYXliZVN1Z2dlc3RCaW5kaW5nc0ZvckxpbmVhckVsZW1lbnRBdENvb3JkcyhcbiAgICAgICAgICAgIGRyYWdnaW5nRWxlbWVudCxcbiAgICAgICAgICAgIFtwb2ludGVyQ29vcmRzXSxcbiAgICAgICAgICAgIHRoaXMuc3RhdGUuc3RhcnRCb3VuZEVsZW1lbnQsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcG9pbnRlckRvd25TdGF0ZS5sYXN0Q29vcmRzLnggPSBwb2ludGVyQ29vcmRzLng7XG4gICAgICAgIHBvaW50ZXJEb3duU3RhdGUubGFzdENvb3Jkcy55ID0gcG9pbnRlckNvb3Jkcy55O1xuICAgICAgICB0aGlzLm1heWJlRHJhZ05ld0dlbmVyaWNFbGVtZW50KHBvaW50ZXJEb3duU3RhdGUsIGV2ZW50KTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuc3RhdGUuYWN0aXZlVG9vbC50eXBlID09PSBcInNlbGVjdGlvblwiKSB7XG4gICAgICAgIHBvaW50ZXJEb3duU3RhdGUuYm94U2VsZWN0aW9uLmhhc09jY3VycmVkID0gdHJ1ZTtcblxuICAgICAgICBjb25zdCBlbGVtZW50cyA9IHRoaXMuc2NlbmUuZ2V0Tm9uRGVsZXRlZEVsZW1lbnRzKCk7XG4gICAgICAgIGlmIChcbiAgICAgICAgICAhZXZlbnQuc2hpZnRLZXkgJiZcbiAgICAgICAgICAvLyBhbGxvd3MgZm9yIGJveC1zZWxlY3RpbmcgcG9pbnRzICh3aXRob3V0IHNoaWZ0KVxuICAgICAgICAgICF0aGlzLnN0YXRlLmVkaXRpbmdMaW5lYXJFbGVtZW50ICYmXG4gICAgICAgICAgaXNTb21lRWxlbWVudFNlbGVjdGVkKGVsZW1lbnRzLCB0aGlzLnN0YXRlKVxuICAgICAgICApIHtcbiAgICAgICAgICBpZiAocG9pbnRlckRvd25TdGF0ZS53aXRoQ21kT3JDdHJsICYmIHBvaW50ZXJEb3duU3RhdGUuaGl0LmVsZW1lbnQpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0U3RhdGUoKHByZXZTdGF0ZSkgPT5cbiAgICAgICAgICAgICAgc2VsZWN0R3JvdXBzRm9yU2VsZWN0ZWRFbGVtZW50cyhcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAuLi5wcmV2U3RhdGUsXG4gICAgICAgICAgICAgICAgICBzZWxlY3RlZEVsZW1lbnRJZHM6IHtcbiAgICAgICAgICAgICAgICAgICAgW3BvaW50ZXJEb3duU3RhdGUuaGl0LmVsZW1lbnQhLmlkXTogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB0aGlzLnNjZW5lLmdldE5vbkRlbGV0ZWRFbGVtZW50cygpLFxuICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgICAgIHNlbGVjdGVkRWxlbWVudElkczoge30sXG4gICAgICAgICAgICAgIHNlbGVjdGVkR3JvdXBJZHM6IHt9LFxuICAgICAgICAgICAgICBlZGl0aW5nR3JvdXBJZDogbnVsbCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBib3gtc2VsZWN0IGxpbmUgZWRpdG9yIHBvaW50c1xuICAgICAgICBpZiAodGhpcy5zdGF0ZS5lZGl0aW5nTGluZWFyRWxlbWVudCkge1xuICAgICAgICAgIExpbmVhckVsZW1lbnRFZGl0b3IuaGFuZGxlQm94U2VsZWN0aW9uKFxuICAgICAgICAgICAgZXZlbnQsXG4gICAgICAgICAgICB0aGlzLnN0YXRlLFxuICAgICAgICAgICAgdGhpcy5zZXRTdGF0ZS5iaW5kKHRoaXMpLFxuICAgICAgICAgICk7XG4gICAgICAgICAgLy8gcmVndWxhciBib3gtc2VsZWN0XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc3QgZWxlbWVudHNXaXRoaW5TZWxlY3Rpb24gPSBnZXRFbGVtZW50c1dpdGhpblNlbGVjdGlvbihcbiAgICAgICAgICAgIGVsZW1lbnRzLFxuICAgICAgICAgICAgZHJhZ2dpbmdFbGVtZW50LFxuICAgICAgICAgICk7XG4gICAgICAgICAgdGhpcy5zZXRTdGF0ZSgocHJldlN0YXRlKSA9PlxuICAgICAgICAgICAgc2VsZWN0R3JvdXBzRm9yU2VsZWN0ZWRFbGVtZW50cyhcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIC4uLnByZXZTdGF0ZSxcbiAgICAgICAgICAgICAgICBzZWxlY3RlZEVsZW1lbnRJZHM6IHtcbiAgICAgICAgICAgICAgICAgIC4uLnByZXZTdGF0ZS5zZWxlY3RlZEVsZW1lbnRJZHMsXG4gICAgICAgICAgICAgICAgICAuLi5lbGVtZW50c1dpdGhpblNlbGVjdGlvbi5yZWR1Y2UoXG4gICAgICAgICAgICAgICAgICAgIChhY2M6IFJlY29yZDxFeGNhbGlkcmF3RWxlbWVudFtcImlkXCJdLCB0cnVlPiwgZWxlbWVudCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgIGFjY1tlbGVtZW50LmlkXSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFjYztcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAge30sXG4gICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgLi4uKHBvaW50ZXJEb3duU3RhdGUuaGl0LmVsZW1lbnRcbiAgICAgICAgICAgICAgICAgICAgPyB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiB1c2luZyBjdHJsL2NtZCwgc2VsZWN0IHRoZSBoaXRFbGVtZW50IG9ubHkgaWYgd2VcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGhhdmVuJ3QgYm94LXNlbGVjdGVkIGFueXRoaW5nIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgIFtwb2ludGVyRG93blN0YXRlLmhpdC5lbGVtZW50LmlkXTpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIWVsZW1lbnRzV2l0aGluU2VsZWN0aW9uLmxlbmd0aCxcbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIDogbnVsbCksXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBzaG93SHlwZXJsaW5rUG9wdXA6XG4gICAgICAgICAgICAgICAgICBlbGVtZW50c1dpdGhpblNlbGVjdGlvbi5sZW5ndGggPT09IDEgJiZcbiAgICAgICAgICAgICAgICAgIGVsZW1lbnRzV2l0aGluU2VsZWN0aW9uWzBdLmxpbmtcbiAgICAgICAgICAgICAgICAgICAgPyBcImluZm9cIlxuICAgICAgICAgICAgICAgICAgICA6IGZhbHNlLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB0aGlzLnNjZW5lLmdldE5vbkRlbGV0ZWRFbGVtZW50cygpLFxuICAgICAgICAgICAgKSxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvLyBSZXR1cm5zIHdoZXRoZXIgdGhlIHBvaW50ZXIgbW92ZSBoYXBwZW5lZCBvdmVyIGVpdGhlciBzY3JvbGxiYXJcbiAgcHJpdmF0ZSBoYW5kbGVQb2ludGVyTW92ZU92ZXJTY3JvbGxiYXJzKFxuICAgIGV2ZW50OiBQb2ludGVyRXZlbnQsXG4gICAgcG9pbnRlckRvd25TdGF0ZTogUG9pbnRlckRvd25TdGF0ZSxcbiAgKTogYm9vbGVhbiB7XG4gICAgaWYgKHBvaW50ZXJEb3duU3RhdGUuc2Nyb2xsYmFycy5pc092ZXJIb3Jpem9udGFsKSB7XG4gICAgICBjb25zdCB4ID0gZXZlbnQuY2xpZW50WDtcbiAgICAgIGNvbnN0IGR4ID0geCAtIHBvaW50ZXJEb3duU3RhdGUubGFzdENvb3Jkcy54O1xuICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgIHNjcm9sbFg6IHRoaXMuc3RhdGUuc2Nyb2xsWCAtIGR4IC8gdGhpcy5zdGF0ZS56b29tLnZhbHVlLFxuICAgICAgfSk7XG4gICAgICBwb2ludGVyRG93blN0YXRlLmxhc3RDb29yZHMueCA9IHg7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAocG9pbnRlckRvd25TdGF0ZS5zY3JvbGxiYXJzLmlzT3ZlclZlcnRpY2FsKSB7XG4gICAgICBjb25zdCB5ID0gZXZlbnQuY2xpZW50WTtcbiAgICAgIGNvbnN0IGR5ID0geSAtIHBvaW50ZXJEb3duU3RhdGUubGFzdENvb3Jkcy55O1xuICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgIHNjcm9sbFk6IHRoaXMuc3RhdGUuc2Nyb2xsWSAtIGR5IC8gdGhpcy5zdGF0ZS56b29tLnZhbHVlLFxuICAgICAgfSk7XG4gICAgICBwb2ludGVyRG93blN0YXRlLmxhc3RDb29yZHMueSA9IHk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcHJpdmF0ZSBvblBvaW50ZXJVcEZyb21Qb2ludGVyRG93bkhhbmRsZXIoXG4gICAgcG9pbnRlckRvd25TdGF0ZTogUG9pbnRlckRvd25TdGF0ZSxcbiAgKTogKGV2ZW50OiBQb2ludGVyRXZlbnQpID0+IHZvaWQge1xuICAgIHJldHVybiB3aXRoQmF0Y2hlZFVwZGF0ZXMoKGNoaWxkRXZlbnQ6IFBvaW50ZXJFdmVudCkgPT4ge1xuICAgICAgY29uc3Qge1xuICAgICAgICBkcmFnZ2luZ0VsZW1lbnQsXG4gICAgICAgIHJlc2l6aW5nRWxlbWVudCxcbiAgICAgICAgbXVsdGlFbGVtZW50LFxuICAgICAgICBhY3RpdmVUb29sLFxuICAgICAgICBpc1Jlc2l6aW5nLFxuICAgICAgICBpc1JvdGF0aW5nLFxuICAgICAgfSA9IHRoaXMuc3RhdGU7XG4gICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgaXNSZXNpemluZzogZmFsc2UsXG4gICAgICAgIGlzUm90YXRpbmc6IGZhbHNlLFxuICAgICAgICByZXNpemluZ0VsZW1lbnQ6IG51bGwsXG4gICAgICAgIHNlbGVjdGlvbkVsZW1lbnQ6IG51bGwsXG4gICAgICAgIGN1cnNvckJ1dHRvbjogXCJ1cFwiLFxuICAgICAgICAvLyB0ZXh0IGVsZW1lbnRzIGFyZSByZXNldCBvbiBmaW5hbGl6ZSwgYW5kIHJlc2V0dGluZyBvbiBwb2ludGVydXBcbiAgICAgICAgLy8gbWF5IGNhdXNlIGlzc3VlcyB3aXRoIGRvdWJsZSB0YXBzXG4gICAgICAgIGVkaXRpbmdFbGVtZW50OlxuICAgICAgICAgIG11bHRpRWxlbWVudCB8fCBpc1RleHRFbGVtZW50KHRoaXMuc3RhdGUuZWRpdGluZ0VsZW1lbnQpXG4gICAgICAgICAgICA/IHRoaXMuc3RhdGUuZWRpdGluZ0VsZW1lbnRcbiAgICAgICAgICAgIDogbnVsbCxcbiAgICAgIH0pO1xuXG4gICAgICB0aGlzLnNhdmVQb2ludGVyKGNoaWxkRXZlbnQuY2xpZW50WCwgY2hpbGRFdmVudC5jbGllbnRZLCBcInVwXCIpO1xuXG4gICAgICAvLyBIYW5kbGUgZW5kIG9mIGRyYWdnaW5nIGEgcG9pbnQgb2YgYSBsaW5lYXIgZWxlbWVudCwgbWlnaHQgY2xvc2UgYSBsb29wXG4gICAgICAvLyBhbmQgc2V0cyBiaW5kaW5nIGVsZW1lbnRcbiAgICAgIGlmICh0aGlzLnN0YXRlLmVkaXRpbmdMaW5lYXJFbGVtZW50KSB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICAhcG9pbnRlckRvd25TdGF0ZS5ib3hTZWxlY3Rpb24uaGFzT2NjdXJyZWQgJiZcbiAgICAgICAgICAocG9pbnRlckRvd25TdGF0ZS5oaXQ/LmVsZW1lbnQ/LmlkICE9PVxuICAgICAgICAgICAgdGhpcy5zdGF0ZS5lZGl0aW5nTGluZWFyRWxlbWVudC5lbGVtZW50SWQgfHxcbiAgICAgICAgICAgICFwb2ludGVyRG93blN0YXRlLmhpdC5oYXNIaXRFbGVtZW50SW5zaWRlKVxuICAgICAgICApIHtcbiAgICAgICAgICB0aGlzLmFjdGlvbk1hbmFnZXIuZXhlY3V0ZUFjdGlvbihhY3Rpb25GaW5hbGl6ZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc3QgZWRpdGluZ0xpbmVhckVsZW1lbnQgPSBMaW5lYXJFbGVtZW50RWRpdG9yLmhhbmRsZVBvaW50ZXJVcChcbiAgICAgICAgICAgIGNoaWxkRXZlbnQsXG4gICAgICAgICAgICB0aGlzLnN0YXRlLmVkaXRpbmdMaW5lYXJFbGVtZW50LFxuICAgICAgICAgICAgdGhpcy5zdGF0ZSxcbiAgICAgICAgICApO1xuICAgICAgICAgIGlmIChlZGl0aW5nTGluZWFyRWxlbWVudCAhPT0gdGhpcy5zdGF0ZS5lZGl0aW5nTGluZWFyRWxlbWVudCkge1xuICAgICAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgICAgIGVkaXRpbmdMaW5lYXJFbGVtZW50LFxuICAgICAgICAgICAgICBzdWdnZXN0ZWRCaW5kaW5nczogW10sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgbGFzdFBvaW50ZXJVcCA9IG51bGw7XG5cbiAgICAgIGlmIChwb2ludGVyRG93blN0YXRlLmV2ZW50TGlzdGVuZXJzLm9uTW92ZSkge1xuICAgICAgICBwb2ludGVyRG93blN0YXRlLmV2ZW50TGlzdGVuZXJzLm9uTW92ZS5mbHVzaCgpO1xuICAgICAgfVxuXG4gICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihcbiAgICAgICAgRVZFTlQuUE9JTlRFUl9NT1ZFLFxuICAgICAgICBwb2ludGVyRG93blN0YXRlLmV2ZW50TGlzdGVuZXJzLm9uTW92ZSEsXG4gICAgICApO1xuICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoXG4gICAgICAgIEVWRU5ULlBPSU5URVJfVVAsXG4gICAgICAgIHBvaW50ZXJEb3duU3RhdGUuZXZlbnRMaXN0ZW5lcnMub25VcCEsXG4gICAgICApO1xuICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoXG4gICAgICAgIEVWRU5ULktFWURPV04sXG4gICAgICAgIHBvaW50ZXJEb3duU3RhdGUuZXZlbnRMaXN0ZW5lcnMub25LZXlEb3duISxcbiAgICAgICk7XG4gICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihcbiAgICAgICAgRVZFTlQuS0VZVVAsXG4gICAgICAgIHBvaW50ZXJEb3duU3RhdGUuZXZlbnRMaXN0ZW5lcnMub25LZXlVcCEsXG4gICAgICApO1xuXG4gICAgICBpZiAodGhpcy5zdGF0ZS5wZW5kaW5nSW1hZ2VFbGVtZW50SWQpIHtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7IHBlbmRpbmdJbWFnZUVsZW1lbnRJZDogbnVsbCB9KTtcbiAgICAgIH1cblxuICAgICAgaWYgKGRyYWdnaW5nRWxlbWVudD8udHlwZSA9PT0gXCJmcmVlZHJhd1wiKSB7XG4gICAgICAgIGNvbnN0IHBvaW50ZXJDb29yZHMgPSB2aWV3cG9ydENvb3Jkc1RvU2NlbmVDb29yZHMoXG4gICAgICAgICAgY2hpbGRFdmVudCxcbiAgICAgICAgICB0aGlzLnN0YXRlLFxuICAgICAgICApO1xuXG4gICAgICAgIGNvbnN0IHBvaW50cyA9IGRyYWdnaW5nRWxlbWVudC5wb2ludHM7XG4gICAgICAgIGxldCBkeCA9IHBvaW50ZXJDb29yZHMueCAtIGRyYWdnaW5nRWxlbWVudC54O1xuICAgICAgICBsZXQgZHkgPSBwb2ludGVyQ29vcmRzLnkgLSBkcmFnZ2luZ0VsZW1lbnQueTtcblxuICAgICAgICAvLyBBbGxvd3MgZG90cyB0byBhdm9pZCBiZWluZyBmbGFnZ2VkIGFzIGluZmluaXRlbHkgc21hbGxcbiAgICAgICAgaWYgKGR4ID09PSBwb2ludHNbMF1bMF0gJiYgZHkgPT09IHBvaW50c1swXVsxXSkge1xuICAgICAgICAgIGR5ICs9IDAuMDAwMTtcbiAgICAgICAgICBkeCArPSAwLjAwMDE7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBwcmVzc3VyZXMgPSBkcmFnZ2luZ0VsZW1lbnQuc2ltdWxhdGVQcmVzc3VyZVxuICAgICAgICAgID8gW11cbiAgICAgICAgICA6IFsuLi5kcmFnZ2luZ0VsZW1lbnQucHJlc3N1cmVzLCBjaGlsZEV2ZW50LnByZXNzdXJlXTtcblxuICAgICAgICBtdXRhdGVFbGVtZW50KGRyYWdnaW5nRWxlbWVudCwge1xuICAgICAgICAgIHBvaW50czogWy4uLnBvaW50cywgW2R4LCBkeV1dLFxuICAgICAgICAgIHByZXNzdXJlcyxcbiAgICAgICAgICBsYXN0Q29tbWl0dGVkUG9pbnQ6IFtkeCwgZHldLFxuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLmFjdGlvbk1hbmFnZXIuZXhlY3V0ZUFjdGlvbihhY3Rpb25GaW5hbGl6ZSk7XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKGlzSW1hZ2VFbGVtZW50KGRyYWdnaW5nRWxlbWVudCkpIHtcbiAgICAgICAgY29uc3QgaW1hZ2VFbGVtZW50ID0gZHJhZ2dpbmdFbGVtZW50O1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHRoaXMuaW5pdGlhbGl6ZUltYWdlRGltZW5zaW9ucyhpbWFnZUVsZW1lbnQpO1xuICAgICAgICAgIHRoaXMuc2V0U3RhdGUoXG4gICAgICAgICAgICB7IHNlbGVjdGVkRWxlbWVudElkczogeyBbaW1hZ2VFbGVtZW50LmlkXTogdHJ1ZSB9IH0sXG4gICAgICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgICAgIHRoaXMuYWN0aW9uTWFuYWdlci5leGVjdXRlQWN0aW9uKGFjdGlvbkZpbmFsaXplKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgICAgICAgIHRoaXMuc2NlbmUucmVwbGFjZUFsbEVsZW1lbnRzKFxuICAgICAgICAgICAgdGhpcy5zY2VuZVxuICAgICAgICAgICAgICAuZ2V0RWxlbWVudHNJbmNsdWRpbmdEZWxldGVkKClcbiAgICAgICAgICAgICAgLmZpbHRlcigoZWwpID0+IGVsLmlkICE9PSBpbWFnZUVsZW1lbnQuaWQpLFxuICAgICAgICAgICk7XG4gICAgICAgICAgdGhpcy5hY3Rpb25NYW5hZ2VyLmV4ZWN1dGVBY3Rpb24oYWN0aW9uRmluYWxpemUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKGlzTGluZWFyRWxlbWVudChkcmFnZ2luZ0VsZW1lbnQpKSB7XG4gICAgICAgIGlmIChkcmFnZ2luZ0VsZW1lbnQhLnBvaW50cy5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgdGhpcy5oaXN0b3J5LnJlc3VtZVJlY29yZGluZygpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHBvaW50ZXJDb29yZHMgPSB2aWV3cG9ydENvb3Jkc1RvU2NlbmVDb29yZHMoXG4gICAgICAgICAgY2hpbGRFdmVudCxcbiAgICAgICAgICB0aGlzLnN0YXRlLFxuICAgICAgICApO1xuXG4gICAgICAgIGlmIChcbiAgICAgICAgICAhcG9pbnRlckRvd25TdGF0ZS5kcmFnLmhhc09jY3VycmVkICYmXG4gICAgICAgICAgZHJhZ2dpbmdFbGVtZW50ICYmXG4gICAgICAgICAgIW11bHRpRWxlbWVudFxuICAgICAgICApIHtcbiAgICAgICAgICBtdXRhdGVFbGVtZW50KGRyYWdnaW5nRWxlbWVudCwge1xuICAgICAgICAgICAgcG9pbnRzOiBbXG4gICAgICAgICAgICAgIC4uLmRyYWdnaW5nRWxlbWVudC5wb2ludHMsXG4gICAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICBwb2ludGVyQ29vcmRzLnggLSBkcmFnZ2luZ0VsZW1lbnQueCxcbiAgICAgICAgICAgICAgICBwb2ludGVyQ29vcmRzLnkgLSBkcmFnZ2luZ0VsZW1lbnQueSxcbiAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgICBtdWx0aUVsZW1lbnQ6IGRyYWdnaW5nRWxlbWVudCxcbiAgICAgICAgICAgIGVkaXRpbmdFbGVtZW50OiB0aGlzLnN0YXRlLmRyYWdnaW5nRWxlbWVudCxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIGlmIChwb2ludGVyRG93blN0YXRlLmRyYWcuaGFzT2NjdXJyZWQgJiYgIW11bHRpRWxlbWVudCkge1xuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIGlzQmluZGluZ0VuYWJsZWQodGhpcy5zdGF0ZSkgJiZcbiAgICAgICAgICAgIGlzQmluZGluZ0VsZW1lbnQoZHJhZ2dpbmdFbGVtZW50LCBmYWxzZSlcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIG1heWJlQmluZExpbmVhckVsZW1lbnQoXG4gICAgICAgICAgICAgIGRyYWdnaW5nRWxlbWVudCxcbiAgICAgICAgICAgICAgdGhpcy5zdGF0ZSxcbiAgICAgICAgICAgICAgdGhpcy5zY2VuZSxcbiAgICAgICAgICAgICAgcG9pbnRlckNvb3JkcyxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMuc2V0U3RhdGUoeyBzdWdnZXN0ZWRCaW5kaW5nczogW10sIHN0YXJ0Qm91bmRFbGVtZW50OiBudWxsIH0pO1xuICAgICAgICAgIGlmICghYWN0aXZlVG9vbC5sb2NrZWQpIHtcbiAgICAgICAgICAgIHJlc2V0Q3Vyc29yKHRoaXMuY2FudmFzKTtcbiAgICAgICAgICAgIHRoaXMuc2V0U3RhdGUoKHByZXZTdGF0ZSkgPT4gKHtcbiAgICAgICAgICAgICAgZHJhZ2dpbmdFbGVtZW50OiBudWxsLFxuICAgICAgICAgICAgICBhY3RpdmVUb29sOiB1cGRhdGVBY3RpdmVUb29sKHRoaXMuc3RhdGUsIHtcbiAgICAgICAgICAgICAgICB0eXBlOiBcInNlbGVjdGlvblwiLFxuICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgc2VsZWN0ZWRFbGVtZW50SWRzOiB7XG4gICAgICAgICAgICAgICAgLi4ucHJldlN0YXRlLnNlbGVjdGVkRWxlbWVudElkcyxcbiAgICAgICAgICAgICAgICBbZHJhZ2dpbmdFbGVtZW50LmlkXTogdHJ1ZSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5zZXRTdGF0ZSgocHJldlN0YXRlKSA9PiAoe1xuICAgICAgICAgICAgICBkcmFnZ2luZ0VsZW1lbnQ6IG51bGwsXG4gICAgICAgICAgICAgIHNlbGVjdGVkRWxlbWVudElkczoge1xuICAgICAgICAgICAgICAgIC4uLnByZXZTdGF0ZS5zZWxlY3RlZEVsZW1lbnRJZHMsXG4gICAgICAgICAgICAgICAgW2RyYWdnaW5nRWxlbWVudC5pZF06IHRydWUsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9KSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKFxuICAgICAgICBhY3RpdmVUb29sLnR5cGUgIT09IFwic2VsZWN0aW9uXCIgJiZcbiAgICAgICAgZHJhZ2dpbmdFbGVtZW50ICYmXG4gICAgICAgIGlzSW52aXNpYmx5U21hbGxFbGVtZW50KGRyYWdnaW5nRWxlbWVudClcbiAgICAgICkge1xuICAgICAgICAvLyByZW1vdmUgaW52aXNpYmxlIGVsZW1lbnQgd2hpY2ggd2FzIGFkZGVkIGluIG9uUG9pbnRlckRvd25cbiAgICAgICAgdGhpcy5zY2VuZS5yZXBsYWNlQWxsRWxlbWVudHMoXG4gICAgICAgICAgdGhpcy5zY2VuZS5nZXRFbGVtZW50c0luY2x1ZGluZ0RlbGV0ZWQoKS5zbGljZSgwLCAtMSksXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICAgIGRyYWdnaW5nRWxlbWVudDogbnVsbCxcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKGRyYWdnaW5nRWxlbWVudCkge1xuICAgICAgICBtdXRhdGVFbGVtZW50KFxuICAgICAgICAgIGRyYWdnaW5nRWxlbWVudCxcbiAgICAgICAgICBnZXROb3JtYWxpemVkRGltZW5zaW9ucyhkcmFnZ2luZ0VsZW1lbnQpLFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBpZiAocmVzaXppbmdFbGVtZW50KSB7XG4gICAgICAgIHRoaXMuaGlzdG9yeS5yZXN1bWVSZWNvcmRpbmcoKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHJlc2l6aW5nRWxlbWVudCAmJiBpc0ludmlzaWJseVNtYWxsRWxlbWVudChyZXNpemluZ0VsZW1lbnQpKSB7XG4gICAgICAgIHRoaXMuc2NlbmUucmVwbGFjZUFsbEVsZW1lbnRzKFxuICAgICAgICAgIHRoaXMuc2NlbmVcbiAgICAgICAgICAgIC5nZXRFbGVtZW50c0luY2x1ZGluZ0RlbGV0ZWQoKVxuICAgICAgICAgICAgLmZpbHRlcigoZWwpID0+IGVsLmlkICE9PSByZXNpemluZ0VsZW1lbnQuaWQpLFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICAvLyBDb2RlIGJlbG93IGhhbmRsZXMgc2VsZWN0aW9uIHdoZW4gZWxlbWVudChzKSB3ZXJlbid0XG4gICAgICAvLyBkcmFnIG9yIGFkZGVkIHRvIHNlbGVjdGlvbiBvbiBwb2ludGVyIGRvd24gcGhhc2UuXG4gICAgICBjb25zdCBoaXRFbGVtZW50ID0gcG9pbnRlckRvd25TdGF0ZS5oaXQuZWxlbWVudDtcbiAgICAgIGlmIChpc0VyYXNlckFjdGl2ZSh0aGlzLnN0YXRlKSkge1xuICAgICAgICBjb25zdCBkcmFnZ2VkRGlzdGFuY2UgPSBkaXN0YW5jZTJkKFxuICAgICAgICAgIHRoaXMubGFzdFBvaW50ZXJEb3duIS5jbGllbnRYLFxuICAgICAgICAgIHRoaXMubGFzdFBvaW50ZXJEb3duIS5jbGllbnRZLFxuICAgICAgICAgIHRoaXMubGFzdFBvaW50ZXJVcCEuY2xpZW50WCxcbiAgICAgICAgICB0aGlzLmxhc3RQb2ludGVyVXAhLmNsaWVudFksXG4gICAgICAgICk7XG5cbiAgICAgICAgaWYgKGRyYWdnZWREaXN0YW5jZSA9PT0gMCkge1xuICAgICAgICAgIGNvbnN0IHNjZW5lUG9pbnRlciA9IHZpZXdwb3J0Q29vcmRzVG9TY2VuZUNvb3JkcyhcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgY2xpZW50WDogdGhpcy5sYXN0UG9pbnRlclVwIS5jbGllbnRYLFxuICAgICAgICAgICAgICBjbGllbnRZOiB0aGlzLmxhc3RQb2ludGVyVXAhLmNsaWVudFksXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdGhpcy5zdGF0ZSxcbiAgICAgICAgICApO1xuICAgICAgICAgIGNvbnN0IGhpdEVsZW1lbnRzID0gdGhpcy5nZXRFbGVtZW50c0F0UG9zaXRpb24oXG4gICAgICAgICAgICBzY2VuZVBvaW50ZXIueCxcbiAgICAgICAgICAgIHNjZW5lUG9pbnRlci55LFxuICAgICAgICAgICk7XG4gICAgICAgICAgaGl0RWxlbWVudHMuZm9yRWFjaChcbiAgICAgICAgICAgIChoaXRFbGVtZW50KSA9PlxuICAgICAgICAgICAgICAocG9pbnRlckRvd25TdGF0ZS5lbGVtZW50SWRzVG9FcmFzZVtoaXRFbGVtZW50LmlkXSA9IHtcbiAgICAgICAgICAgICAgICBlcmFzZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICBvcGFjaXR5OiBoaXRFbGVtZW50Lm9wYWNpdHksXG4gICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5lcmFzZUVsZW1lbnRzKHBvaW50ZXJEb3duU3RhdGUpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9IGVsc2UgaWYgKE9iamVjdC5rZXlzKHBvaW50ZXJEb3duU3RhdGUuZWxlbWVudElkc1RvRXJhc2UpLmxlbmd0aCkge1xuICAgICAgICB0aGlzLnJlc3RvcmVSZWFkeVRvRXJhc2VFbGVtZW50cyhwb2ludGVyRG93blN0YXRlKTtcbiAgICAgIH1cblxuICAgICAgaWYgKFxuICAgICAgICBoaXRFbGVtZW50ICYmXG4gICAgICAgICFwb2ludGVyRG93blN0YXRlLmRyYWcuaGFzT2NjdXJyZWQgJiZcbiAgICAgICAgIXBvaW50ZXJEb3duU3RhdGUuaGl0Lndhc0FkZGVkVG9TZWxlY3Rpb24gJiZcbiAgICAgICAgLy8gaWYgd2UncmUgZWRpdGluZyBhIGxpbmUsIHBvaW50ZXJ1cCBzaG91bGRuJ3Qgc3dpdGNoIHNlbGVjdGlvbiBpZlxuICAgICAgICAvLyBib3ggc2VsZWN0ZWRcbiAgICAgICAgKCF0aGlzLnN0YXRlLmVkaXRpbmdMaW5lYXJFbGVtZW50IHx8XG4gICAgICAgICAgIXBvaW50ZXJEb3duU3RhdGUuYm94U2VsZWN0aW9uLmhhc09jY3VycmVkKVxuICAgICAgKSB7XG4gICAgICAgIC8vIHdoZW4gaW5zaWRlIGxpbmUgZWRpdG9yLCBzaGlmdCBzZWxlY3RzIHBvaW50cyBpbnN0ZWFkXG4gICAgICAgIGlmIChjaGlsZEV2ZW50LnNoaWZ0S2V5ICYmICF0aGlzLnN0YXRlLmVkaXRpbmdMaW5lYXJFbGVtZW50KSB7XG4gICAgICAgICAgaWYgKHRoaXMuc3RhdGUuc2VsZWN0ZWRFbGVtZW50SWRzW2hpdEVsZW1lbnQuaWRdKSB7XG4gICAgICAgICAgICBpZiAoaXNTZWxlY3RlZFZpYUdyb3VwKHRoaXMuc3RhdGUsIGhpdEVsZW1lbnQpKSB7XG4gICAgICAgICAgICAgIC8vIFdlIHdhbnQgdG8gdW5zZWxlY3QgYWxsIGdyb3VwcyBoaXRFbGVtZW50IGlzIHBhcnQgb2ZcbiAgICAgICAgICAgICAgLy8gYXMgd2VsbCBhcyBhbGwgZWxlbWVudHMgdGhhdCBhcmUgcGFydCBvZiB0aGUgZ3JvdXBzXG4gICAgICAgICAgICAgIC8vIGhpdEVsZW1lbnQgaXMgcGFydCBvZlxuICAgICAgICAgICAgICBjb25zdCBpZHNPZlNlbGVjdGVkRWxlbWVudHNUaGF0QXJlSW5Hcm91cHMgPSBoaXRFbGVtZW50Lmdyb3VwSWRzXG4gICAgICAgICAgICAgICAgLmZsYXRNYXAoKGdyb3VwSWQpID0+XG4gICAgICAgICAgICAgICAgICBnZXRFbGVtZW50c0luR3JvdXAoXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2NlbmUuZ2V0Tm9uRGVsZXRlZEVsZW1lbnRzKCksXG4gICAgICAgICAgICAgICAgICAgIGdyb3VwSWQsXG4gICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAubWFwKChlbGVtZW50KSA9PiAoeyBbZWxlbWVudC5pZF06IGZhbHNlIH0pKVxuICAgICAgICAgICAgICAgIC5yZWR1Y2UoKHByZXZJZCwgYWNjKSA9PiAoeyAuLi5wcmV2SWQsIC4uLmFjYyB9KSwge30pO1xuXG4gICAgICAgICAgICAgIHRoaXMuc2V0U3RhdGUoKF9wcmV2U3RhdGUpID0+ICh7XG4gICAgICAgICAgICAgICAgc2VsZWN0ZWRHcm91cElkczoge1xuICAgICAgICAgICAgICAgICAgLi4uX3ByZXZTdGF0ZS5zZWxlY3RlZEVsZW1lbnRJZHMsXG4gICAgICAgICAgICAgICAgICAuLi5oaXRFbGVtZW50Lmdyb3VwSWRzXG4gICAgICAgICAgICAgICAgICAgIC5tYXAoKGdJZCkgPT4gKHsgW2dJZF06IGZhbHNlIH0pKVxuICAgICAgICAgICAgICAgICAgICAucmVkdWNlKChwcmV2LCBhY2MpID0+ICh7IC4uLnByZXYsIC4uLmFjYyB9KSwge30pLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgc2VsZWN0ZWRFbGVtZW50SWRzOiB7XG4gICAgICAgICAgICAgICAgICAuLi5fcHJldlN0YXRlLnNlbGVjdGVkRWxlbWVudElkcyxcbiAgICAgICAgICAgICAgICAgIC4uLmlkc09mU2VsZWN0ZWRFbGVtZW50c1RoYXRBcmVJbkdyb3VwcyxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAvLyByZW1vdmUgZWxlbWVudCBmcm9tIHNlbGVjdGlvbiB3aGlsZVxuICAgICAgICAgICAgICAvLyBrZWVwaW5nIHByZXYgZWxlbWVudHMgc2VsZWN0ZWRcbiAgICAgICAgICAgICAgdGhpcy5zZXRTdGF0ZSgocHJldlN0YXRlKSA9PlxuICAgICAgICAgICAgICAgIHNlbGVjdEdyb3Vwc0ZvclNlbGVjdGVkRWxlbWVudHMoXG4gICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIC4uLnByZXZTdGF0ZSxcbiAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRFbGVtZW50SWRzOiB7XG4gICAgICAgICAgICAgICAgICAgICAgLi4ucHJldlN0YXRlLnNlbGVjdGVkRWxlbWVudElkcyxcbiAgICAgICAgICAgICAgICAgICAgICBbaGl0RWxlbWVudCEuaWRdOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICB0aGlzLnNjZW5lLmdldE5vbkRlbGV0ZWRFbGVtZW50cygpLFxuICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIGFkZCBlbGVtZW50IHRvIHNlbGVjdGlvbiB3aGlsZVxuICAgICAgICAgICAgLy8ga2VlcGluZyBwcmV2IGVsZW1lbnRzIHNlbGVjdGVkXG5cbiAgICAgICAgICAgIHRoaXMuc2V0U3RhdGUoKF9wcmV2U3RhdGUpID0+ICh7XG4gICAgICAgICAgICAgIHNlbGVjdGVkRWxlbWVudElkczoge1xuICAgICAgICAgICAgICAgIC4uLl9wcmV2U3RhdGUuc2VsZWN0ZWRFbGVtZW50SWRzLFxuICAgICAgICAgICAgICAgIFtoaXRFbGVtZW50IS5pZF06IHRydWUsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9KSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuc2V0U3RhdGUoKHByZXZTdGF0ZSkgPT4gKHtcbiAgICAgICAgICAgIC4uLnNlbGVjdEdyb3Vwc0ZvclNlbGVjdGVkRWxlbWVudHMoXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAuLi5wcmV2U3RhdGUsXG4gICAgICAgICAgICAgICAgc2VsZWN0ZWRFbGVtZW50SWRzOiB7IFtoaXRFbGVtZW50LmlkXTogdHJ1ZSB9LFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB0aGlzLnNjZW5lLmdldE5vbkRlbGV0ZWRFbGVtZW50cygpLFxuICAgICAgICAgICAgKSxcbiAgICAgICAgICB9KSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKFxuICAgICAgICAhdGhpcy5zdGF0ZS5lZGl0aW5nTGluZWFyRWxlbWVudCAmJlxuICAgICAgICAhcG9pbnRlckRvd25TdGF0ZS5kcmFnLmhhc09jY3VycmVkICYmXG4gICAgICAgICF0aGlzLnN0YXRlLmlzUmVzaXppbmcgJiZcbiAgICAgICAgKChoaXRFbGVtZW50ICYmXG4gICAgICAgICAgaXNIaXR0aW5nRWxlbWVudEJvdW5kaW5nQm94V2l0aG91dEhpdHRpbmdFbGVtZW50KFxuICAgICAgICAgICAgaGl0RWxlbWVudCxcbiAgICAgICAgICAgIHRoaXMuc3RhdGUsXG4gICAgICAgICAgICBwb2ludGVyRG93blN0YXRlLm9yaWdpbi54LFxuICAgICAgICAgICAgcG9pbnRlckRvd25TdGF0ZS5vcmlnaW4ueSxcbiAgICAgICAgICApKSB8fFxuICAgICAgICAgICghaGl0RWxlbWVudCAmJlxuICAgICAgICAgICAgcG9pbnRlckRvd25TdGF0ZS5oaXQuaGFzSGl0Q29tbW9uQm91bmRpbmdCb3hPZlNlbGVjdGVkRWxlbWVudHMpKVxuICAgICAgKSB7XG4gICAgICAgIC8vIERlc2VsZWN0IHNlbGVjdGVkIGVsZW1lbnRzXG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICAgIHNlbGVjdGVkRWxlbWVudElkczoge30sXG4gICAgICAgICAgc2VsZWN0ZWRHcm91cElkczoge30sXG4gICAgICAgICAgZWRpdGluZ0dyb3VwSWQ6IG51bGwsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKFxuICAgICAgICAhYWN0aXZlVG9vbC5sb2NrZWQgJiZcbiAgICAgICAgYWN0aXZlVG9vbC50eXBlICE9PSBcImZyZWVkcmF3XCIgJiZcbiAgICAgICAgZHJhZ2dpbmdFbGVtZW50XG4gICAgICApIHtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSgocHJldlN0YXRlKSA9PiAoe1xuICAgICAgICAgIHNlbGVjdGVkRWxlbWVudElkczoge1xuICAgICAgICAgICAgLi4ucHJldlN0YXRlLnNlbGVjdGVkRWxlbWVudElkcyxcbiAgICAgICAgICAgIFtkcmFnZ2luZ0VsZW1lbnQuaWRdOiB0cnVlLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pKTtcbiAgICAgIH1cblxuICAgICAgaWYgKFxuICAgICAgICBhY3RpdmVUb29sLnR5cGUgIT09IFwic2VsZWN0aW9uXCIgfHxcbiAgICAgICAgaXNTb21lRWxlbWVudFNlbGVjdGVkKHRoaXMuc2NlbmUuZ2V0Tm9uRGVsZXRlZEVsZW1lbnRzKCksIHRoaXMuc3RhdGUpXG4gICAgICApIHtcbiAgICAgICAgdGhpcy5oaXN0b3J5LnJlc3VtZVJlY29yZGluZygpO1xuICAgICAgfVxuXG4gICAgICBpZiAocG9pbnRlckRvd25TdGF0ZS5kcmFnLmhhc09jY3VycmVkIHx8IGlzUmVzaXppbmcgfHwgaXNSb3RhdGluZykge1xuICAgICAgICAoaXNCaW5kaW5nRW5hYmxlZCh0aGlzLnN0YXRlKVxuICAgICAgICAgID8gYmluZE9yVW5iaW5kU2VsZWN0ZWRFbGVtZW50c1xuICAgICAgICAgIDogdW5iaW5kTGluZWFyRWxlbWVudHMpKFxuICAgICAgICAgIGdldFNlbGVjdGVkRWxlbWVudHModGhpcy5zY2VuZS5nZXROb25EZWxldGVkRWxlbWVudHMoKSwgdGhpcy5zdGF0ZSksXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIGlmICghYWN0aXZlVG9vbC5sb2NrZWQgJiYgYWN0aXZlVG9vbC50eXBlICE9PSBcImZyZWVkcmF3XCIpIHtcbiAgICAgICAgcmVzZXRDdXJzb3IodGhpcy5jYW52YXMpO1xuICAgICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgICBkcmFnZ2luZ0VsZW1lbnQ6IG51bGwsXG4gICAgICAgICAgc3VnZ2VzdGVkQmluZGluZ3M6IFtdLFxuICAgICAgICAgIGFjdGl2ZVRvb2w6IHVwZGF0ZUFjdGl2ZVRvb2wodGhpcy5zdGF0ZSwgeyB0eXBlOiBcInNlbGVjdGlvblwiIH0pLFxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICAgIGRyYWdnaW5nRWxlbWVudDogbnVsbCxcbiAgICAgICAgICBzdWdnZXN0ZWRCaW5kaW5nczogW10sXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSByZXN0b3JlUmVhZHlUb0VyYXNlRWxlbWVudHMgPSAoXG4gICAgcG9pbnRlckRvd25TdGF0ZTogUG9pbnRlckRvd25TdGF0ZSxcbiAgKSA9PiB7XG4gICAgY29uc3QgZWxlbWVudHMgPSB0aGlzLnNjZW5lLmdldEVsZW1lbnRzSW5jbHVkaW5nRGVsZXRlZCgpLm1hcCgoZWxlKSA9PiB7XG4gICAgICBpZiAoXG4gICAgICAgIHBvaW50ZXJEb3duU3RhdGUuZWxlbWVudElkc1RvRXJhc2VbZWxlLmlkXSAmJlxuICAgICAgICBwb2ludGVyRG93blN0YXRlLmVsZW1lbnRJZHNUb0VyYXNlW2VsZS5pZF0uZXJhc2VcbiAgICAgICkge1xuICAgICAgICByZXR1cm4gbmV3RWxlbWVudFdpdGgoZWxlLCB7XG4gICAgICAgICAgb3BhY2l0eTogcG9pbnRlckRvd25TdGF0ZS5lbGVtZW50SWRzVG9FcmFzZVtlbGUuaWRdLm9wYWNpdHksXG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgaXNCb3VuZFRvQ29udGFpbmVyKGVsZSkgJiZcbiAgICAgICAgcG9pbnRlckRvd25TdGF0ZS5lbGVtZW50SWRzVG9FcmFzZVtlbGUuY29udGFpbmVySWRdICYmXG4gICAgICAgIHBvaW50ZXJEb3duU3RhdGUuZWxlbWVudElkc1RvRXJhc2VbZWxlLmNvbnRhaW5lcklkXS5lcmFzZVxuICAgICAgKSB7XG4gICAgICAgIHJldHVybiBuZXdFbGVtZW50V2l0aChlbGUsIHtcbiAgICAgICAgICBvcGFjaXR5OiBwb2ludGVyRG93blN0YXRlLmVsZW1lbnRJZHNUb0VyYXNlW2VsZS5jb250YWluZXJJZF0ub3BhY2l0eSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gZWxlO1xuICAgIH0pO1xuXG4gICAgdGhpcy5zY2VuZS5yZXBsYWNlQWxsRWxlbWVudHMoZWxlbWVudHMpO1xuICB9O1xuXG4gIHByaXZhdGUgZXJhc2VFbGVtZW50cyA9IChwb2ludGVyRG93blN0YXRlOiBQb2ludGVyRG93blN0YXRlKSA9PiB7XG4gICAgY29uc3QgZWxlbWVudHMgPSB0aGlzLnNjZW5lLmdldEVsZW1lbnRzSW5jbHVkaW5nRGVsZXRlZCgpLm1hcCgoZWxlKSA9PiB7XG4gICAgICBpZiAoXG4gICAgICAgIHBvaW50ZXJEb3duU3RhdGUuZWxlbWVudElkc1RvRXJhc2VbZWxlLmlkXSAmJlxuICAgICAgICBwb2ludGVyRG93blN0YXRlLmVsZW1lbnRJZHNUb0VyYXNlW2VsZS5pZF0uZXJhc2VcbiAgICAgICkge1xuICAgICAgICByZXR1cm4gbmV3RWxlbWVudFdpdGgoZWxlLCB7IGlzRGVsZXRlZDogdHJ1ZSB9KTtcbiAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgIGlzQm91bmRUb0NvbnRhaW5lcihlbGUpICYmXG4gICAgICAgIHBvaW50ZXJEb3duU3RhdGUuZWxlbWVudElkc1RvRXJhc2VbZWxlLmNvbnRhaW5lcklkXSAmJlxuICAgICAgICBwb2ludGVyRG93blN0YXRlLmVsZW1lbnRJZHNUb0VyYXNlW2VsZS5jb250YWluZXJJZF0uZXJhc2VcbiAgICAgICkge1xuICAgICAgICByZXR1cm4gbmV3RWxlbWVudFdpdGgoZWxlLCB7IGlzRGVsZXRlZDogdHJ1ZSB9KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBlbGU7XG4gICAgfSk7XG5cbiAgICB0aGlzLmhpc3RvcnkucmVzdW1lUmVjb3JkaW5nKCk7XG4gICAgdGhpcy5zY2VuZS5yZXBsYWNlQWxsRWxlbWVudHMoZWxlbWVudHMpO1xuICB9O1xuXG4gIHByaXZhdGUgaW5pdGlhbGl6ZUltYWdlID0gYXN5bmMgKHtcbiAgICBpbWFnZUZpbGUsXG4gICAgaW1hZ2VFbGVtZW50OiBfaW1hZ2VFbGVtZW50LFxuICAgIHNob3dDdXJzb3JJbWFnZVByZXZpZXcgPSBmYWxzZSxcbiAgfToge1xuICAgIGltYWdlRmlsZTogRmlsZTtcbiAgICBpbWFnZUVsZW1lbnQ6IEV4Y2FsaWRyYXdJbWFnZUVsZW1lbnQ7XG4gICAgc2hvd0N1cnNvckltYWdlUHJldmlldz86IGJvb2xlYW47XG4gIH0pID0+IHtcbiAgICAvLyBhdCB0aGlzIHBvaW50IHRoaXMgc2hvdWxkIGJlIGd1YXJhbnRlZWQgaW1hZ2UgZmlsZSwgYnV0IHdlIGRvIHRoaXMgY2hlY2tcbiAgICAvLyB0byBzYXRpc2Z5IFRTIGRvd24gdGhlIGxpbmVcbiAgICBpZiAoIWlzU3VwcG9ydGVkSW1hZ2VGaWxlKGltYWdlRmlsZSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcih0KFwiZXJyb3JzLnVuc3VwcG9ydGVkRmlsZVR5cGVcIikpO1xuICAgIH1cbiAgICBjb25zdCBtaW1lVHlwZSA9IGltYWdlRmlsZS50eXBlO1xuXG4gICAgc2V0Q3Vyc29yKHRoaXMuY2FudmFzLCBcIndhaXRcIik7XG5cbiAgICBpZiAobWltZVR5cGUgPT09IE1JTUVfVFlQRVMuc3ZnKSB7XG4gICAgICB0cnkge1xuICAgICAgICBpbWFnZUZpbGUgPSBTVkdTdHJpbmdUb0ZpbGUoXG4gICAgICAgICAgYXdhaXQgbm9ybWFsaXplU1ZHKGF3YWl0IGltYWdlRmlsZS50ZXh0KCkpLFxuICAgICAgICAgIGltYWdlRmlsZS5uYW1lLFxuICAgICAgICApO1xuICAgICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgICBjb25zb2xlLndhcm4oZXJyb3IpO1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IodChcImVycm9ycy5zdmdJbWFnZUluc2VydEVycm9yXCIpKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBnZW5lcmF0ZSBpbWFnZSBpZCAoYnkgZGVmYXVsdCB0aGUgZmlsZSBkaWdlc3QpIGJlZm9yZSBhbnlcbiAgICAvLyByZXNpemluZy9jb21wcmVzc2lvbiB0YWtlcyBwbGFjZSB0byBrZWVwIGl0IG1vcmUgcG9ydGFibGVcbiAgICBjb25zdCBmaWxlSWQgPSBhd2FpdCAoKHRoaXMucHJvcHMuZ2VuZXJhdGVJZEZvckZpbGU/LihcbiAgICAgIGltYWdlRmlsZSxcbiAgICApIGFzIFByb21pc2U8RmlsZUlkPikgfHwgZ2VuZXJhdGVJZEZyb21GaWxlKGltYWdlRmlsZSkpO1xuXG4gICAgaWYgKCFmaWxlSWQpIHtcbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgXCJDb3VsZG4ndCBnZW5lcmF0ZSBmaWxlIGlkIG9yIHRoZSBzdXBwbGllZCBgZ2VuZXJhdGVJZEZvckZpbGVgIGRpZG4ndCByZXNvbHZlIHRvIG9uZS5cIixcbiAgICAgICk7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IodChcImVycm9ycy5pbWFnZUluc2VydEVycm9yXCIpKTtcbiAgICB9XG5cbiAgICBjb25zdCBleGlzdGluZ0ZpbGVEYXRhID0gdGhpcy5maWxlc1tmaWxlSWRdO1xuICAgIGlmICghZXhpc3RpbmdGaWxlRGF0YT8uZGF0YVVSTCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgaW1hZ2VGaWxlID0gYXdhaXQgcmVzaXplSW1hZ2VGaWxlKGltYWdlRmlsZSwge1xuICAgICAgICAgIG1heFdpZHRoT3JIZWlnaHQ6IERFRkFVTFRfTUFYX0lNQUdFX1dJRFRIX09SX0hFSUdIVCxcbiAgICAgICAgfSk7XG4gICAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXCJlcnJvciB0cnlpbmcgdG8gcmVzaW5nIGltYWdlIGZpbGUgb24gaW5zZXJ0aW9uXCIsIGVycm9yKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGltYWdlRmlsZS5zaXplID4gTUFYX0FMTE9XRURfRklMRV9CWVRFUykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgdChcImVycm9ycy5maWxlVG9vQmlnXCIsIHtcbiAgICAgICAgICAgIG1heFNpemU6IGAke01hdGgudHJ1bmMoTUFYX0FMTE9XRURfRklMRV9CWVRFUyAvIDEwMjQgLyAxMDI0KX1NQmAsXG4gICAgICAgICAgfSksXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHNob3dDdXJzb3JJbWFnZVByZXZpZXcpIHtcbiAgICAgIGNvbnN0IGRhdGFVUkwgPSB0aGlzLmZpbGVzW2ZpbGVJZF0/LmRhdGFVUkw7XG4gICAgICAvLyBvcHRpbWl6YXRpb24gc28gdGhhdCB3ZSBkb24ndCB1bm5lY2Vzc2FyaWx5IHJlc2l6ZSB0aGUgb3JpZ2luYWxcbiAgICAgIC8vIGZ1bGwtc2l6ZSBmaWxlIGZvciBjdXJzb3IgcHJldmlld1xuICAgICAgLy8gKGl0J3MgbXVjaCBmYXN0ZXIgdG8gY29udmVydCB0aGUgcmVzaXplZCBkYXRhVVJMIHRvIEZpbGUpXG4gICAgICBjb25zdCByZXNpemVkRmlsZSA9IGRhdGFVUkwgJiYgZGF0YVVSTFRvRmlsZShkYXRhVVJMKTtcblxuICAgICAgdGhpcy5zZXRJbWFnZVByZXZpZXdDdXJzb3IocmVzaXplZEZpbGUgfHwgaW1hZ2VGaWxlKTtcbiAgICB9XG5cbiAgICBjb25zdCBkYXRhVVJMID1cbiAgICAgIHRoaXMuZmlsZXNbZmlsZUlkXT8uZGF0YVVSTCB8fCAoYXdhaXQgZ2V0RGF0YVVSTChpbWFnZUZpbGUpKTtcblxuICAgIGNvbnN0IGltYWdlRWxlbWVudCA9IG11dGF0ZUVsZW1lbnQoXG4gICAgICBfaW1hZ2VFbGVtZW50LFxuICAgICAge1xuICAgICAgICBmaWxlSWQsXG4gICAgICB9LFxuICAgICAgZmFsc2UsXG4gICAgKSBhcyBOb25EZWxldGVkPEluaXRpYWxpemVkRXhjYWxpZHJhd0ltYWdlRWxlbWVudD47XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2U8Tm9uRGVsZXRlZDxJbml0aWFsaXplZEV4Y2FsaWRyYXdJbWFnZUVsZW1lbnQ+PihcbiAgICAgIGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICB0aGlzLmZpbGVzID0ge1xuICAgICAgICAgICAgLi4udGhpcy5maWxlcyxcbiAgICAgICAgICAgIFtmaWxlSWRdOiB7XG4gICAgICAgICAgICAgIG1pbWVUeXBlLFxuICAgICAgICAgICAgICBpZDogZmlsZUlkLFxuICAgICAgICAgICAgICBkYXRhVVJMLFxuICAgICAgICAgICAgICBjcmVhdGVkOiBEYXRlLm5vdygpLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9O1xuICAgICAgICAgIGNvbnN0IGNhY2hlZEltYWdlRGF0YSA9IHRoaXMuaW1hZ2VDYWNoZS5nZXQoZmlsZUlkKTtcbiAgICAgICAgICBpZiAoIWNhY2hlZEltYWdlRGF0YSkge1xuICAgICAgICAgICAgdGhpcy5hZGROZXdJbWFnZXNUb0ltYWdlQ2FjaGUoKTtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMudXBkYXRlSW1hZ2VDYWNoZShbaW1hZ2VFbGVtZW50XSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChjYWNoZWRJbWFnZURhdGE/LmltYWdlIGluc3RhbmNlb2YgUHJvbWlzZSkge1xuICAgICAgICAgICAgYXdhaXQgY2FjaGVkSW1hZ2VEYXRhLmltYWdlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICB0aGlzLnN0YXRlLnBlbmRpbmdJbWFnZUVsZW1lbnRJZCAhPT0gaW1hZ2VFbGVtZW50LmlkICYmXG4gICAgICAgICAgICB0aGlzLnN0YXRlLmRyYWdnaW5nRWxlbWVudD8uaWQgIT09IGltYWdlRWxlbWVudC5pZFxuICAgICAgICAgICkge1xuICAgICAgICAgICAgdGhpcy5pbml0aWFsaXplSW1hZ2VEaW1lbnNpb25zKGltYWdlRWxlbWVudCwgdHJ1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJlc29sdmUoaW1hZ2VFbGVtZW50KTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IodChcImVycm9ycy5pbWFnZUluc2VydEVycm9yXCIpKSk7XG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgaWYgKCFzaG93Q3Vyc29ySW1hZ2VQcmV2aWV3KSB7XG4gICAgICAgICAgICByZXNldEN1cnNvcih0aGlzLmNhbnZhcyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9LFxuICAgICk7XG4gIH07XG5cbiAgLyoqXG4gICAqIGluc2VydHMgaW1hZ2UgaW50byBlbGVtZW50cyBhcnJheSBhbmQgcmVyZW5kZXJzXG4gICAqL1xuICBwcml2YXRlIGluc2VydEltYWdlRWxlbWVudCA9IGFzeW5jIChcbiAgICBpbWFnZUVsZW1lbnQ6IEV4Y2FsaWRyYXdJbWFnZUVsZW1lbnQsXG4gICAgaW1hZ2VGaWxlOiBGaWxlLFxuICAgIHNob3dDdXJzb3JJbWFnZVByZXZpZXc/OiBib29sZWFuLFxuICApID0+IHtcbiAgICB0aGlzLnNjZW5lLnJlcGxhY2VBbGxFbGVtZW50cyhbXG4gICAgICAuLi50aGlzLnNjZW5lLmdldEVsZW1lbnRzSW5jbHVkaW5nRGVsZXRlZCgpLFxuICAgICAgaW1hZ2VFbGVtZW50LFxuICAgIF0pO1xuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMuaW5pdGlhbGl6ZUltYWdlKHtcbiAgICAgICAgaW1hZ2VGaWxlLFxuICAgICAgICBpbWFnZUVsZW1lbnQsXG4gICAgICAgIHNob3dDdXJzb3JJbWFnZVByZXZpZXcsXG4gICAgICB9KTtcbiAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICBtdXRhdGVFbGVtZW50KGltYWdlRWxlbWVudCwge1xuICAgICAgICBpc0RlbGV0ZWQ6IHRydWUsXG4gICAgICB9KTtcbiAgICAgIHRoaXMuYWN0aW9uTWFuYWdlci5leGVjdXRlQWN0aW9uKGFjdGlvbkZpbmFsaXplKTtcbiAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICBlcnJvck1lc3NhZ2U6IGVycm9yLm1lc3NhZ2UgfHwgdChcImVycm9ycy5pbWFnZUluc2VydEVycm9yXCIpLFxuICAgICAgfSk7XG4gICAgfVxuICB9O1xuXG4gIHByaXZhdGUgc2V0SW1hZ2VQcmV2aWV3Q3Vyc29yID0gYXN5bmMgKGltYWdlRmlsZTogRmlsZSkgPT4ge1xuICAgIC8vIG11c3RuJ3QgYmUgbGFyZ2VyIHRoYW4gMTI4IHB4XG4gICAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQ1NTL0NTU19CYXNpY19Vc2VyX0ludGVyZmFjZS9Vc2luZ19VUkxfdmFsdWVzX2Zvcl90aGVfY3Vyc29yX3Byb3BlcnR5XG4gICAgY29uc3QgY3Vyc29ySW1hZ2VTaXplUHggPSA5NjtcblxuICAgIGNvbnN0IGltYWdlUHJldmlldyA9IGF3YWl0IHJlc2l6ZUltYWdlRmlsZShpbWFnZUZpbGUsIHtcbiAgICAgIG1heFdpZHRoT3JIZWlnaHQ6IGN1cnNvckltYWdlU2l6ZVB4LFxuICAgIH0pO1xuXG4gICAgbGV0IHByZXZpZXdEYXRhVVJMID0gYXdhaXQgZ2V0RGF0YVVSTChpbWFnZVByZXZpZXcpO1xuXG4gICAgLy8gU1ZHIGNhbm5vdCBiZSByZXNpemVkIHZpYSBgcmVzaXplSW1hZ2VGaWxlYCBzbyB3ZSByZXNpemUgYnkgcmVuZGVyaW5nIHRvXG4gICAgLy8gYSBzbWFsbCBjYW52YXNcbiAgICBpZiAoaW1hZ2VGaWxlLnR5cGUgPT09IE1JTUVfVFlQRVMuc3ZnKSB7XG4gICAgICBjb25zdCBpbWcgPSBhd2FpdCBsb2FkSFRNTEltYWdlRWxlbWVudChwcmV2aWV3RGF0YVVSTCk7XG5cbiAgICAgIGxldCBoZWlnaHQgPSBNYXRoLm1pbihpbWcuaGVpZ2h0LCBjdXJzb3JJbWFnZVNpemVQeCk7XG4gICAgICBsZXQgd2lkdGggPSBoZWlnaHQgKiAoaW1nLndpZHRoIC8gaW1nLmhlaWdodCk7XG5cbiAgICAgIGlmICh3aWR0aCA+IGN1cnNvckltYWdlU2l6ZVB4KSB7XG4gICAgICAgIHdpZHRoID0gY3Vyc29ySW1hZ2VTaXplUHg7XG4gICAgICAgIGhlaWdodCA9IHdpZHRoICogKGltZy5oZWlnaHQgLyBpbWcud2lkdGgpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBjYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiY2FudmFzXCIpO1xuICAgICAgY2FudmFzLmhlaWdodCA9IGhlaWdodDtcbiAgICAgIGNhbnZhcy53aWR0aCA9IHdpZHRoO1xuICAgICAgY29uc3QgY29udGV4dCA9IGNhbnZhcy5nZXRDb250ZXh0KFwiMmRcIikhO1xuXG4gICAgICBjb250ZXh0LmRyYXdJbWFnZShpbWcsIDAsIDAsIHdpZHRoLCBoZWlnaHQpO1xuXG4gICAgICBwcmV2aWV3RGF0YVVSTCA9IGNhbnZhcy50b0RhdGFVUkwoTUlNRV9UWVBFUy5zdmcpIGFzIERhdGFVUkw7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuc3RhdGUucGVuZGluZ0ltYWdlRWxlbWVudElkKSB7XG4gICAgICBzZXRDdXJzb3IodGhpcy5jYW52YXMsIGB1cmwoJHtwcmV2aWV3RGF0YVVSTH0pIDQgNCwgYXV0b2ApO1xuICAgIH1cbiAgfTtcblxuICBwcml2YXRlIG9uSW1hZ2VBY3Rpb24gPSBhc3luYyAoXG4gICAgeyBpbnNlcnRPbkNhbnZhc0RpcmVjdGx5IH0gPSB7IGluc2VydE9uQ2FudmFzRGlyZWN0bHk6IGZhbHNlIH0sXG4gICkgPT4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBjbGllbnRYID0gdGhpcy5zdGF0ZS53aWR0aCAvIDIgKyB0aGlzLnN0YXRlLm9mZnNldExlZnQ7XG4gICAgICBjb25zdCBjbGllbnRZID0gdGhpcy5zdGF0ZS5oZWlnaHQgLyAyICsgdGhpcy5zdGF0ZS5vZmZzZXRUb3A7XG5cbiAgICAgIGNvbnN0IHsgeCwgeSB9ID0gdmlld3BvcnRDb29yZHNUb1NjZW5lQ29vcmRzKFxuICAgICAgICB7IGNsaWVudFgsIGNsaWVudFkgfSxcbiAgICAgICAgdGhpcy5zdGF0ZSxcbiAgICAgICk7XG5cbiAgICAgIGNvbnN0IGltYWdlRmlsZSA9IGF3YWl0IGZpbGVPcGVuKHtcbiAgICAgICAgZGVzY3JpcHRpb246IFwiSW1hZ2VcIixcbiAgICAgICAgZXh0ZW5zaW9uczogW1wianBnXCIsIFwicG5nXCIsIFwic3ZnXCIsIFwiZ2lmXCJdLFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IGltYWdlRWxlbWVudCA9IHRoaXMuY3JlYXRlSW1hZ2VFbGVtZW50KHtcbiAgICAgICAgc2NlbmVYOiB4LFxuICAgICAgICBzY2VuZVk6IHksXG4gICAgICB9KTtcblxuICAgICAgaWYgKGluc2VydE9uQ2FudmFzRGlyZWN0bHkpIHtcbiAgICAgICAgdGhpcy5pbnNlcnRJbWFnZUVsZW1lbnQoaW1hZ2VFbGVtZW50LCBpbWFnZUZpbGUpO1xuICAgICAgICB0aGlzLmluaXRpYWxpemVJbWFnZURpbWVuc2lvbnMoaW1hZ2VFbGVtZW50KTtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZShcbiAgICAgICAgICB7XG4gICAgICAgICAgICBzZWxlY3RlZEVsZW1lbnRJZHM6IHsgW2ltYWdlRWxlbWVudC5pZF06IHRydWUgfSxcbiAgICAgICAgICB9LFxuICAgICAgICAgICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuYWN0aW9uTWFuYWdlci5leGVjdXRlQWN0aW9uKGFjdGlvbkZpbmFsaXplKTtcbiAgICAgICAgICB9LFxuICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZShcbiAgICAgICAgICB7XG4gICAgICAgICAgICBwZW5kaW5nSW1hZ2VFbGVtZW50SWQ6IGltYWdlRWxlbWVudC5pZCxcbiAgICAgICAgICB9LFxuICAgICAgICAgICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuaW5zZXJ0SW1hZ2VFbGVtZW50KFxuICAgICAgICAgICAgICBpbWFnZUVsZW1lbnQsXG4gICAgICAgICAgICAgIGltYWdlRmlsZSxcbiAgICAgICAgICAgICAgLyogc2hvd0N1cnNvckltYWdlUHJldmlldyAqLyB0cnVlLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9LFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgIGlmIChlcnJvci5uYW1lICE9PSBcIkFib3J0RXJyb3JcIikge1xuICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUud2FybihlcnJvcik7XG4gICAgICB9XG4gICAgICB0aGlzLnNldFN0YXRlKFxuICAgICAgICB7XG4gICAgICAgICAgcGVuZGluZ0ltYWdlRWxlbWVudElkOiBudWxsLFxuICAgICAgICAgIGVkaXRpbmdFbGVtZW50OiBudWxsLFxuICAgICAgICAgIGFjdGl2ZVRvb2w6IHVwZGF0ZUFjdGl2ZVRvb2wodGhpcy5zdGF0ZSwgeyB0eXBlOiBcInNlbGVjdGlvblwiIH0pLFxuICAgICAgICB9LFxuICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgdGhpcy5hY3Rpb25NYW5hZ2VyLmV4ZWN1dGVBY3Rpb24oYWN0aW9uRmluYWxpemUpO1xuICAgICAgICB9LFxuICAgICAgKTtcbiAgICB9XG4gIH07XG5cbiAgcHJpdmF0ZSBpbml0aWFsaXplSW1hZ2VEaW1lbnNpb25zID0gKFxuICAgIGltYWdlRWxlbWVudDogRXhjYWxpZHJhd0ltYWdlRWxlbWVudCxcbiAgICBmb3JjZU5hdHVyYWxTaXplID0gZmFsc2UsXG4gICkgPT4ge1xuICAgIGNvbnN0IGltYWdlID1cbiAgICAgIGlzSW5pdGlhbGl6ZWRJbWFnZUVsZW1lbnQoaW1hZ2VFbGVtZW50KSAmJlxuICAgICAgdGhpcy5pbWFnZUNhY2hlLmdldChpbWFnZUVsZW1lbnQuZmlsZUlkKT8uaW1hZ2U7XG5cbiAgICBpZiAoIWltYWdlIHx8IGltYWdlIGluc3RhbmNlb2YgUHJvbWlzZSkge1xuICAgICAgaWYgKFxuICAgICAgICBpbWFnZUVsZW1lbnQud2lkdGggPCBEUkFHR0lOR19USFJFU0hPTEQgLyB0aGlzLnN0YXRlLnpvb20udmFsdWUgJiZcbiAgICAgICAgaW1hZ2VFbGVtZW50LmhlaWdodCA8IERSQUdHSU5HX1RIUkVTSE9MRCAvIHRoaXMuc3RhdGUuem9vbS52YWx1ZVxuICAgICAgKSB7XG4gICAgICAgIGNvbnN0IHBsYWNlaG9sZGVyU2l6ZSA9IDEwMCAvIHRoaXMuc3RhdGUuem9vbS52YWx1ZTtcbiAgICAgICAgbXV0YXRlRWxlbWVudChpbWFnZUVsZW1lbnQsIHtcbiAgICAgICAgICB4OiBpbWFnZUVsZW1lbnQueCAtIHBsYWNlaG9sZGVyU2l6ZSAvIDIsXG4gICAgICAgICAgeTogaW1hZ2VFbGVtZW50LnkgLSBwbGFjZWhvbGRlclNpemUgLyAyLFxuICAgICAgICAgIHdpZHRoOiBwbGFjZWhvbGRlclNpemUsXG4gICAgICAgICAgaGVpZ2h0OiBwbGFjZWhvbGRlclNpemUsXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKFxuICAgICAgZm9yY2VOYXR1cmFsU2l6ZSB8fFxuICAgICAgLy8gaWYgdXNlci1jcmVhdGVkIGJvdW5kaW5nIGJveCBpcyBiZWxvdyB0aHJlc2hvbGQsIGFzc3VtZSB0aGVcbiAgICAgIC8vIGludGVudGlvbiB3YXMgdG8gY2xpY2sgaW5zdGVhZCBvZiBkcmFnLCBhbmQgdXNlIHRoZSBpbWFnZSdzXG4gICAgICAvLyBpbnRyaW5zaWMgc2l6ZVxuICAgICAgKGltYWdlRWxlbWVudC53aWR0aCA8IERSQUdHSU5HX1RIUkVTSE9MRCAvIHRoaXMuc3RhdGUuem9vbS52YWx1ZSAmJlxuICAgICAgICBpbWFnZUVsZW1lbnQuaGVpZ2h0IDwgRFJBR0dJTkdfVEhSRVNIT0xEIC8gdGhpcy5zdGF0ZS56b29tLnZhbHVlKVxuICAgICkge1xuICAgICAgY29uc3QgbWluSGVpZ2h0ID0gTWF0aC5tYXgodGhpcy5zdGF0ZS5oZWlnaHQgLSAxMjAsIDE2MCk7XG4gICAgICAvLyBtYXggNjUlIG9mIGNhbnZhcyBoZWlnaHQsIGNsYW1wZWQgdG8gPDMwMHB4LCB2aCAtIDEyMHB4PlxuICAgICAgY29uc3QgbWF4SGVpZ2h0ID0gTWF0aC5taW4oXG4gICAgICAgIG1pbkhlaWdodCxcbiAgICAgICAgTWF0aC5mbG9vcih0aGlzLnN0YXRlLmhlaWdodCAqIDAuNSkgLyB0aGlzLnN0YXRlLnpvb20udmFsdWUsXG4gICAgICApO1xuXG4gICAgICBjb25zdCBoZWlnaHQgPSBNYXRoLm1pbihpbWFnZS5uYXR1cmFsSGVpZ2h0LCBtYXhIZWlnaHQpO1xuICAgICAgY29uc3Qgd2lkdGggPSBoZWlnaHQgKiAoaW1hZ2UubmF0dXJhbFdpZHRoIC8gaW1hZ2UubmF0dXJhbEhlaWdodCk7XG5cbiAgICAgIC8vIGFkZCBjdXJyZW50IGltYWdlRWxlbWVudCB3aWR0aC9oZWlnaHQgdG8gYWNjb3VudCBmb3IgcHJldmlvdXMgY2VudGVyaW5nXG4gICAgICAvLyBvZiB0aGUgcGxhY2Vob2xkZXIgaW1hZ2VcbiAgICAgIGNvbnN0IHggPSBpbWFnZUVsZW1lbnQueCArIGltYWdlRWxlbWVudC53aWR0aCAvIDIgLSB3aWR0aCAvIDI7XG4gICAgICBjb25zdCB5ID0gaW1hZ2VFbGVtZW50LnkgKyBpbWFnZUVsZW1lbnQuaGVpZ2h0IC8gMiAtIGhlaWdodCAvIDI7XG5cbiAgICAgIG11dGF0ZUVsZW1lbnQoaW1hZ2VFbGVtZW50LCB7IHgsIHksIHdpZHRoLCBoZWlnaHQgfSk7XG4gICAgfVxuICB9O1xuXG4gIC8qKiB1cGRhdGVzIGltYWdlIGNhY2hlLCByZWZyZXNoaW5nIHVwZGF0ZWQgZWxlbWVudHMgYW5kL29yIHNldHRpbmcgc3RhdHVzXG4gICAgICB0byBlcnJvciBmb3IgaW1hZ2VzIHRoYXQgZmFpbCBkdXJpbmcgPGltZz4gZWxlbWVudCBjcmVhdGlvbiAqL1xuICBwcml2YXRlIHVwZGF0ZUltYWdlQ2FjaGUgPSBhc3luYyAoXG4gICAgZWxlbWVudHM6IHJlYWRvbmx5IEluaXRpYWxpemVkRXhjYWxpZHJhd0ltYWdlRWxlbWVudFtdLFxuICAgIGZpbGVzID0gdGhpcy5maWxlcyxcbiAgKSA9PiB7XG4gICAgY29uc3QgeyB1cGRhdGVkRmlsZXMsIGVycm9yZWRGaWxlcyB9ID0gYXdhaXQgX3VwZGF0ZUltYWdlQ2FjaGUoe1xuICAgICAgaW1hZ2VDYWNoZTogdGhpcy5pbWFnZUNhY2hlLFxuICAgICAgZmlsZUlkczogZWxlbWVudHMubWFwKChlbGVtZW50KSA9PiBlbGVtZW50LmZpbGVJZCksXG4gICAgICBmaWxlcyxcbiAgICB9KTtcbiAgICBpZiAodXBkYXRlZEZpbGVzLnNpemUgfHwgZXJyb3JlZEZpbGVzLnNpemUpIHtcbiAgICAgIGZvciAoY29uc3QgZWxlbWVudCBvZiBlbGVtZW50cykge1xuICAgICAgICBpZiAodXBkYXRlZEZpbGVzLmhhcyhlbGVtZW50LmZpbGVJZCkpIHtcbiAgICAgICAgICBpbnZhbGlkYXRlU2hhcGVGb3JFbGVtZW50KGVsZW1lbnQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChlcnJvcmVkRmlsZXMuc2l6ZSkge1xuICAgICAgdGhpcy5zY2VuZS5yZXBsYWNlQWxsRWxlbWVudHMoXG4gICAgICAgIHRoaXMuc2NlbmUuZ2V0RWxlbWVudHNJbmNsdWRpbmdEZWxldGVkKCkubWFwKChlbGVtZW50KSA9PiB7XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgaXNJbml0aWFsaXplZEltYWdlRWxlbWVudChlbGVtZW50KSAmJlxuICAgICAgICAgICAgZXJyb3JlZEZpbGVzLmhhcyhlbGVtZW50LmZpbGVJZClcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIHJldHVybiBuZXdFbGVtZW50V2l0aChlbGVtZW50LCB7XG4gICAgICAgICAgICAgIHN0YXR1czogXCJlcnJvclwiLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBlbGVtZW50O1xuICAgICAgICB9KSxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgdXBkYXRlZEZpbGVzLCBlcnJvcmVkRmlsZXMgfTtcbiAgfTtcblxuICAvKiogYWRkcyBuZXcgaW1hZ2VzIHRvIGltYWdlQ2FjaGUgYW5kIHJlLXJlbmRlcnMgaWYgbmVlZGVkICovXG4gIHByaXZhdGUgYWRkTmV3SW1hZ2VzVG9JbWFnZUNhY2hlID0gYXN5bmMgKFxuICAgIGltYWdlRWxlbWVudHM6IEluaXRpYWxpemVkRXhjYWxpZHJhd0ltYWdlRWxlbWVudFtdID0gZ2V0SW5pdGlhbGl6ZWRJbWFnZUVsZW1lbnRzKFxuICAgICAgdGhpcy5zY2VuZS5nZXROb25EZWxldGVkRWxlbWVudHMoKSxcbiAgICApLFxuICAgIGZpbGVzOiBCaW5hcnlGaWxlcyA9IHRoaXMuZmlsZXMsXG4gICkgPT4ge1xuICAgIGNvbnN0IHVuY2FjaGVkSW1hZ2VFbGVtZW50cyA9IGltYWdlRWxlbWVudHMuZmlsdGVyKFxuICAgICAgKGVsZW1lbnQpID0+ICFlbGVtZW50LmlzRGVsZXRlZCAmJiAhdGhpcy5pbWFnZUNhY2hlLmhhcyhlbGVtZW50LmZpbGVJZCksXG4gICAgKTtcblxuICAgIGlmICh1bmNhY2hlZEltYWdlRWxlbWVudHMubGVuZ3RoKSB7XG4gICAgICBjb25zdCB7IHVwZGF0ZWRGaWxlcyB9ID0gYXdhaXQgdGhpcy51cGRhdGVJbWFnZUNhY2hlKFxuICAgICAgICB1bmNhY2hlZEltYWdlRWxlbWVudHMsXG4gICAgICAgIGZpbGVzLFxuICAgICAgKTtcbiAgICAgIGlmICh1cGRhdGVkRmlsZXMuc2l6ZSkge1xuICAgICAgICB0aGlzLnNjZW5lLmluZm9ybU11dGF0aW9uKCk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIC8qKiBnZW5lcmFsbHkgeW91IHNob3VsZCB1c2UgYGFkZE5ld0ltYWdlc1RvSW1hZ2VDYWNoZSgpYCBkaXJlY3RseSBpZiB5b3UgbmVlZFxuICAgKiAgdG8gcmVuZGVyIG5ldyBpbWFnZXMuIFRoaXMgaXMganVzdCBhIGZhaWxzYWZlICAqL1xuICBwcml2YXRlIHNjaGVkdWxlSW1hZ2VSZWZyZXNoID0gdGhyb3R0bGUoKCkgPT4ge1xuICAgIHRoaXMuYWRkTmV3SW1hZ2VzVG9JbWFnZUNhY2hlKCk7XG4gIH0sIElNQUdFX1JFTkRFUl9USU1FT1VUKTtcblxuICBwcml2YXRlIHVwZGF0ZUJpbmRpbmdFbmFibGVkT25Qb2ludGVyTW92ZSA9IChcbiAgICBldmVudDogUmVhY3QuUG9pbnRlckV2ZW50PEhUTUxDYW52YXNFbGVtZW50PixcbiAgKSA9PiB7XG4gICAgY29uc3Qgc2hvdWxkRW5hYmxlQmluZGluZyA9IHNob3VsZEVuYWJsZUJpbmRpbmdGb3JQb2ludGVyRXZlbnQoZXZlbnQpO1xuICAgIGlmICh0aGlzLnN0YXRlLmlzQmluZGluZ0VuYWJsZWQgIT09IHNob3VsZEVuYWJsZUJpbmRpbmcpIHtcbiAgICAgIHRoaXMuc2V0U3RhdGUoeyBpc0JpbmRpbmdFbmFibGVkOiBzaG91bGRFbmFibGVCaW5kaW5nIH0pO1xuICAgIH1cbiAgfTtcblxuICBwcml2YXRlIG1heWJlU3VnZ2VzdEJpbmRpbmdBdEN1cnNvciA9IChwb2ludGVyQ29vcmRzOiB7XG4gICAgeDogbnVtYmVyO1xuICAgIHk6IG51bWJlcjtcbiAgfSk6IHZvaWQgPT4ge1xuICAgIGNvbnN0IGhvdmVyZWRCaW5kYWJsZUVsZW1lbnQgPSBnZXRIb3ZlcmVkRWxlbWVudEZvckJpbmRpbmcoXG4gICAgICBwb2ludGVyQ29vcmRzLFxuICAgICAgdGhpcy5zY2VuZSxcbiAgICApO1xuICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgc3VnZ2VzdGVkQmluZGluZ3M6XG4gICAgICAgIGhvdmVyZWRCaW5kYWJsZUVsZW1lbnQgIT0gbnVsbCA/IFtob3ZlcmVkQmluZGFibGVFbGVtZW50XSA6IFtdLFxuICAgIH0pO1xuICB9O1xuXG4gIHByaXZhdGUgbWF5YmVTdWdnZXN0QmluZGluZ3NGb3JMaW5lYXJFbGVtZW50QXRDb29yZHMgPSAoXG4gICAgbGluZWFyRWxlbWVudDogTm9uRGVsZXRlZDxFeGNhbGlkcmF3TGluZWFyRWxlbWVudD4sXG4gICAgLyoqIHNjZW5lIGNvb3JkcyAqL1xuICAgIHBvaW50ZXJDb29yZHM6IHtcbiAgICAgIHg6IG51bWJlcjtcbiAgICAgIHk6IG51bWJlcjtcbiAgICB9W10sXG4gICAgLy8gRHVyaW5nIGxpbmUgY3JlYXRpb24gdGhlIHN0YXJ0IGJpbmRpbmcgaGFzbid0IGJlZW4gd3JpdHRlbiB5ZXRcbiAgICAvLyBpbnRvIGBsaW5lYXJFbGVtZW50YFxuICAgIG9wcG9zaXRlQmluZGluZ0JvdW5kRWxlbWVudD86IEV4Y2FsaWRyYXdCaW5kYWJsZUVsZW1lbnQgfCBudWxsLFxuICApOiB2b2lkID0+IHtcbiAgICBpZiAoIXBvaW50ZXJDb29yZHMubGVuZ3RoKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgc3VnZ2VzdGVkQmluZGluZ3MgPSBwb2ludGVyQ29vcmRzLnJlZHVjZShcbiAgICAgIChhY2M6IE5vbkRlbGV0ZWQ8RXhjYWxpZHJhd0JpbmRhYmxlRWxlbWVudD5bXSwgY29vcmRzKSA9PiB7XG4gICAgICAgIGNvbnN0IGhvdmVyZWRCaW5kYWJsZUVsZW1lbnQgPSBnZXRIb3ZlcmVkRWxlbWVudEZvckJpbmRpbmcoXG4gICAgICAgICAgY29vcmRzLFxuICAgICAgICAgIHRoaXMuc2NlbmUsXG4gICAgICAgICk7XG4gICAgICAgIGlmIChcbiAgICAgICAgICBob3ZlcmVkQmluZGFibGVFbGVtZW50ICE9IG51bGwgJiZcbiAgICAgICAgICAhaXNMaW5lYXJFbGVtZW50U2ltcGxlQW5kQWxyZWFkeUJvdW5kKFxuICAgICAgICAgICAgbGluZWFyRWxlbWVudCxcbiAgICAgICAgICAgIG9wcG9zaXRlQmluZGluZ0JvdW5kRWxlbWVudD8uaWQsXG4gICAgICAgICAgICBob3ZlcmVkQmluZGFibGVFbGVtZW50LFxuICAgICAgICAgIClcbiAgICAgICAgKSB7XG4gICAgICAgICAgYWNjLnB1c2goaG92ZXJlZEJpbmRhYmxlRWxlbWVudCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGFjYztcbiAgICAgIH0sXG4gICAgICBbXSxcbiAgICApO1xuXG4gICAgdGhpcy5zZXRTdGF0ZSh7IHN1Z2dlc3RlZEJpbmRpbmdzIH0pO1xuICB9O1xuXG4gIHByaXZhdGUgbWF5YmVTdWdnZXN0QmluZGluZ0ZvckFsbChcbiAgICBzZWxlY3RlZEVsZW1lbnRzOiBOb25EZWxldGVkPEV4Y2FsaWRyYXdFbGVtZW50PltdLFxuICApOiB2b2lkIHtcbiAgICBjb25zdCBzdWdnZXN0ZWRCaW5kaW5ncyA9IGdldEVsaWdpYmxlRWxlbWVudHNGb3JCaW5kaW5nKHNlbGVjdGVkRWxlbWVudHMpO1xuICAgIHRoaXMuc2V0U3RhdGUoeyBzdWdnZXN0ZWRCaW5kaW5ncyB9KTtcbiAgfVxuXG4gIHByaXZhdGUgY2xlYXJTZWxlY3Rpb24oaGl0RWxlbWVudDogRXhjYWxpZHJhd0VsZW1lbnQgfCBudWxsKTogdm9pZCB7XG4gICAgdGhpcy5zZXRTdGF0ZSgocHJldlN0YXRlKSA9PiAoe1xuICAgICAgc2VsZWN0ZWRFbGVtZW50SWRzOiB7fSxcbiAgICAgIHNlbGVjdGVkR3JvdXBJZHM6IHt9LFxuICAgICAgLy8gQ29udGludWUgZWRpdGluZyB0aGUgc2FtZSBncm91cCBpZiB0aGUgdXNlciBzZWxlY3RlZCBhIGRpZmZlcmVudFxuICAgICAgLy8gZWxlbWVudCBmcm9tIGl0XG4gICAgICBlZGl0aW5nR3JvdXBJZDpcbiAgICAgICAgcHJldlN0YXRlLmVkaXRpbmdHcm91cElkICYmXG4gICAgICAgIGhpdEVsZW1lbnQgIT0gbnVsbCAmJlxuICAgICAgICBpc0VsZW1lbnRJbkdyb3VwKGhpdEVsZW1lbnQsIHByZXZTdGF0ZS5lZGl0aW5nR3JvdXBJZClcbiAgICAgICAgICA/IHByZXZTdGF0ZS5lZGl0aW5nR3JvdXBJZFxuICAgICAgICAgIDogbnVsbCxcbiAgICB9KSk7XG4gICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICBzZWxlY3RlZEVsZW1lbnRJZHM6IHt9LFxuICAgICAgcHJldmlvdXNTZWxlY3RlZEVsZW1lbnRJZHM6IHRoaXMuc3RhdGUuc2VsZWN0ZWRFbGVtZW50SWRzLFxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVDYW52YXNSZWYgPSAoY2FudmFzOiBIVE1MQ2FudmFzRWxlbWVudCkgPT4ge1xuICAgIC8vIGNhbnZhcyBpcyBudWxsIHdoZW4gdW5tb3VudGluZ1xuICAgIGlmIChjYW52YXMgIT09IG51bGwpIHtcbiAgICAgIHRoaXMuY2FudmFzID0gY2FudmFzO1xuICAgICAgdGhpcy5yYyA9IHJvdWdoLmNhbnZhcyh0aGlzLmNhbnZhcyk7XG5cbiAgICAgIHRoaXMuY2FudmFzLmFkZEV2ZW50TGlzdGVuZXIoRVZFTlQuV0hFRUwsIHRoaXMuaGFuZGxlV2hlZWwsIHtcbiAgICAgICAgcGFzc2l2ZTogZmFsc2UsXG4gICAgICB9KTtcbiAgICAgIHRoaXMuY2FudmFzLmFkZEV2ZW50TGlzdGVuZXIoRVZFTlQuVE9VQ0hfU1RBUlQsIHRoaXMub25UYXBTdGFydCk7XG4gICAgICB0aGlzLmNhbnZhcy5hZGRFdmVudExpc3RlbmVyKEVWRU5ULlRPVUNIX0VORCwgdGhpcy5vblRhcEVuZCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuY2FudmFzPy5yZW1vdmVFdmVudExpc3RlbmVyKEVWRU5ULldIRUVMLCB0aGlzLmhhbmRsZVdoZWVsKTtcbiAgICAgIHRoaXMuY2FudmFzPy5yZW1vdmVFdmVudExpc3RlbmVyKEVWRU5ULlRPVUNIX1NUQVJULCB0aGlzLm9uVGFwU3RhcnQpO1xuICAgICAgdGhpcy5jYW52YXM/LnJlbW92ZUV2ZW50TGlzdGVuZXIoRVZFTlQuVE9VQ0hfRU5ELCB0aGlzLm9uVGFwRW5kKTtcbiAgICB9XG4gIH07XG5cbiAgcHJpdmF0ZSBoYW5kbGVBcHBPbkRyb3AgPSBhc3luYyAoZXZlbnQ6IFJlYWN0LkRyYWdFdmVudDxIVE1MRGl2RWxlbWVudD4pID0+IHtcbiAgICAvLyBtdXN0IGJlIHJldHJpZXZlZCBmaXJzdCwgaW4gdGhlIHNhbWUgZnJhbWVcbiAgICBjb25zdCB7IGZpbGUsIGZpbGVIYW5kbGUgfSA9IGF3YWl0IGdldEZpbGVGcm9tRXZlbnQoZXZlbnQpO1xuXG4gICAgdHJ5IHtcbiAgICAgIGlmIChpc1N1cHBvcnRlZEltYWdlRmlsZShmaWxlKSkge1xuICAgICAgICAvLyBmaXJzdCBhdHRlbXB0IHRvIGRlY29kZSBzY2VuZSBmcm9tIHRoZSBpbWFnZSBpZiBpdCdzIGVtYmVkZGVkXG4gICAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4gICAgICAgIGlmIChmaWxlPy50eXBlID09PSBNSU1FX1RZUEVTLnBuZyB8fCBmaWxlPy50eXBlID09PSBNSU1FX1RZUEVTLnN2Zykge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBzY2VuZSA9IGF3YWl0IGxvYWRGcm9tQmxvYihcbiAgICAgICAgICAgICAgZmlsZSxcbiAgICAgICAgICAgICAgdGhpcy5zdGF0ZSxcbiAgICAgICAgICAgICAgdGhpcy5zY2VuZS5nZXRFbGVtZW50c0luY2x1ZGluZ0RlbGV0ZWQoKSxcbiAgICAgICAgICAgICAgZmlsZUhhbmRsZSxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICB0aGlzLnN5bmNBY3Rpb25SZXN1bHQoe1xuICAgICAgICAgICAgICAuLi5zY2VuZSxcbiAgICAgICAgICAgICAgYXBwU3RhdGU6IHtcbiAgICAgICAgICAgICAgICAuLi4oc2NlbmUuYXBwU3RhdGUgfHwgdGhpcy5zdGF0ZSksXG4gICAgICAgICAgICAgICAgaXNMb2FkaW5nOiBmYWxzZSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgcmVwbGFjZUZpbGVzOiB0cnVlLFxuICAgICAgICAgICAgICBjb21taXRUb0hpc3Rvcnk6IHRydWUsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICAgICAgICBpZiAoZXJyb3IubmFtZSAhPT0gXCJFbmNvZGluZ0Vycm9yXCIpIHtcbiAgICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gaWYgbm8gc2NlbmUgaXMgZW1iZWRkZWQgb3Igd2UgZmFpbCBmb3Igd2hhdGV2ZXIgcmVhc29uLCBmYWxsIGJhY2tcbiAgICAgICAgLy8gdG8gaW1wb3J0aW5nIGFzIHJlZ3VsYXIgaW1hZ2VcbiAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbiAgICAgICAgY29uc3QgeyB4OiBzY2VuZVgsIHk6IHNjZW5lWSB9ID0gdmlld3BvcnRDb29yZHNUb1NjZW5lQ29vcmRzKFxuICAgICAgICAgIGV2ZW50LFxuICAgICAgICAgIHRoaXMuc3RhdGUsXG4gICAgICAgICk7XG5cbiAgICAgICAgY29uc3QgaW1hZ2VFbGVtZW50ID0gdGhpcy5jcmVhdGVJbWFnZUVsZW1lbnQoeyBzY2VuZVgsIHNjZW5lWSB9KTtcbiAgICAgICAgdGhpcy5pbnNlcnRJbWFnZUVsZW1lbnQoaW1hZ2VFbGVtZW50LCBmaWxlKTtcbiAgICAgICAgdGhpcy5pbml0aWFsaXplSW1hZ2VEaW1lbnNpb25zKGltYWdlRWxlbWVudCk7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoeyBzZWxlY3RlZEVsZW1lbnRJZHM6IHsgW2ltYWdlRWxlbWVudC5pZF06IHRydWUgfSB9KTtcblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgcmV0dXJuIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICBpc0xvYWRpbmc6IGZhbHNlLFxuICAgICAgICBlcnJvck1lc3NhZ2U6IGVycm9yLm1lc3NhZ2UsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBjb25zdCBsaWJyYXJ5SlNPTiA9IGV2ZW50LmRhdGFUcmFuc2Zlci5nZXREYXRhKE1JTUVfVFlQRVMuZXhjYWxpZHJhd2xpYik7XG4gICAgaWYgKGxpYnJhcnlKU09OICYmIHR5cGVvZiBsaWJyYXJ5SlNPTiA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgbGlicmFyeUl0ZW1zID0gcGFyc2VMaWJyYXJ5SlNPTihsaWJyYXJ5SlNPTik7XG4gICAgICAgIHRoaXMuYWRkRWxlbWVudHNGcm9tUGFzdGVPckxpYnJhcnkoe1xuICAgICAgICAgIGVsZW1lbnRzOiBkaXN0cmlidXRlTGlicmFyeUl0ZW1zT25TcXVhcmVHcmlkKGxpYnJhcnlJdGVtcyksXG4gICAgICAgICAgcG9zaXRpb246IGV2ZW50LFxuICAgICAgICAgIGZpbGVzOiBudWxsLFxuICAgICAgICB9KTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7IGVycm9yTWVzc2FnZTogZXJyb3IubWVzc2FnZSB9KTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoZmlsZSkge1xuICAgICAgLy8gYXRldG1wdCB0byBwYXJzZSBhbiBleGNhbGlkcmF3L2V4Y2FsaWRyYXdsaWIgZmlsZVxuICAgICAgYXdhaXQgdGhpcy5sb2FkRmlsZVRvQ2FudmFzKGZpbGUsIGZpbGVIYW5kbGUpO1xuICAgIH1cbiAgfTtcblxuICBsb2FkRmlsZVRvQ2FudmFzID0gYXN5bmMgKFxuICAgIGZpbGU6IEZpbGUsXG4gICAgZmlsZUhhbmRsZTogRmlsZVN5c3RlbUhhbmRsZSB8IG51bGwsXG4gICkgPT4ge1xuICAgIGZpbGUgPSBhd2FpdCBub3JtYWxpemVGaWxlKGZpbGUpO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXQgPSBhd2FpdCBsb2FkU2NlbmVPckxpYnJhcnlGcm9tQmxvYihcbiAgICAgICAgZmlsZSxcbiAgICAgICAgdGhpcy5zdGF0ZSxcbiAgICAgICAgdGhpcy5zY2VuZS5nZXRFbGVtZW50c0luY2x1ZGluZ0RlbGV0ZWQoKSxcbiAgICAgICAgZmlsZUhhbmRsZSxcbiAgICAgICk7XG4gICAgICBpZiAocmV0LnR5cGUgPT09IE1JTUVfVFlQRVMuZXhjYWxpZHJhdykge1xuICAgICAgICB0aGlzLnNldFN0YXRlKHsgaXNMb2FkaW5nOiB0cnVlIH0pO1xuICAgICAgICB0aGlzLnN5bmNBY3Rpb25SZXN1bHQoe1xuICAgICAgICAgIC4uLnJldC5kYXRhLFxuICAgICAgICAgIGFwcFN0YXRlOiB7XG4gICAgICAgICAgICAuLi4ocmV0LmRhdGEuYXBwU3RhdGUgfHwgdGhpcy5zdGF0ZSksXG4gICAgICAgICAgICBpc0xvYWRpbmc6IGZhbHNlLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgcmVwbGFjZUZpbGVzOiB0cnVlLFxuICAgICAgICAgIGNvbW1pdFRvSGlzdG9yeTogdHJ1ZSxcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2UgaWYgKHJldC50eXBlID09PSBNSU1FX1RZUEVTLmV4Y2FsaWRyYXdsaWIpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5saWJyYXJ5XG4gICAgICAgICAgLnVwZGF0ZUxpYnJhcnkoe1xuICAgICAgICAgICAgbGlicmFyeUl0ZW1zOiBmaWxlLFxuICAgICAgICAgICAgbWVyZ2U6IHRydWUsXG4gICAgICAgICAgICBvcGVuTGlicmFyeU1lbnU6IHRydWUsXG4gICAgICAgICAgfSlcbiAgICAgICAgICAuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcbiAgICAgICAgICAgIHRoaXMuc2V0U3RhdGUoeyBlcnJvck1lc3NhZ2U6IHQoXCJlcnJvcnMuaW1wb3J0TGlicmFyeUVycm9yXCIpIH0pO1xuICAgICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgIHRoaXMuc2V0U3RhdGUoeyBpc0xvYWRpbmc6IGZhbHNlLCBlcnJvck1lc3NhZ2U6IGVycm9yLm1lc3NhZ2UgfSk7XG4gICAgfVxuICB9O1xuXG4gIHByaXZhdGUgaGFuZGxlQ2FudmFzQ29udGV4dE1lbnUgPSAoXG4gICAgZXZlbnQ6IFJlYWN0LlBvaW50ZXJFdmVudDxIVE1MQ2FudmFzRWxlbWVudD4sXG4gICkgPT4ge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICBpZiAoXG4gICAgICAoZXZlbnQubmF0aXZlRXZlbnQucG9pbnRlclR5cGUgPT09IFwidG91Y2hcIiB8fFxuICAgICAgICAoZXZlbnQubmF0aXZlRXZlbnQucG9pbnRlclR5cGUgPT09IFwicGVuXCIgJiZcbiAgICAgICAgICAvLyBhbHdheXMgYWxsb3cgaWYgdXNlciB1c2VzIGEgcGVuIHNlY29uZGFyeSBidXR0b25cbiAgICAgICAgICBldmVudC5idXR0b24gIT09IFBPSU5URVJfQlVUVE9OLlNFQ09OREFSWSkpICYmXG4gICAgICB0aGlzLnN0YXRlLmFjdGl2ZVRvb2wudHlwZSAhPT0gXCJzZWxlY3Rpb25cIlxuICAgICkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHsgeCwgeSB9ID0gdmlld3BvcnRDb29yZHNUb1NjZW5lQ29vcmRzKGV2ZW50LCB0aGlzLnN0YXRlKTtcbiAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5nZXRFbGVtZW50QXRQb3NpdGlvbih4LCB5LCB7XG4gICAgICBwcmVmZXJTZWxlY3RlZDogdHJ1ZSxcbiAgICAgIGluY2x1ZGVMb2NrZWRFbGVtZW50czogdHJ1ZSxcbiAgICB9KTtcblxuICAgIGNvbnN0IHR5cGUgPSBlbGVtZW50ID8gXCJlbGVtZW50XCIgOiBcImNhbnZhc1wiO1xuXG4gICAgY29uc3QgY29udGFpbmVyID0gdGhpcy5leGNhbGlkcmF3Q29udGFpbmVyUmVmLmN1cnJlbnQhO1xuICAgIGNvbnN0IHsgdG9wOiBvZmZzZXRUb3AsIGxlZnQ6IG9mZnNldExlZnQgfSA9XG4gICAgICBjb250YWluZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgY29uc3QgbGVmdCA9IGV2ZW50LmNsaWVudFggLSBvZmZzZXRMZWZ0O1xuICAgIGNvbnN0IHRvcCA9IGV2ZW50LmNsaWVudFkgLSBvZmZzZXRUb3A7XG5cbiAgICBpZiAoZWxlbWVudCAmJiAhdGhpcy5zdGF0ZS5zZWxlY3RlZEVsZW1lbnRJZHNbZWxlbWVudC5pZF0pIHtcbiAgICAgIHRoaXMuc2V0U3RhdGUoXG4gICAgICAgIHNlbGVjdEdyb3Vwc0ZvclNlbGVjdGVkRWxlbWVudHMoXG4gICAgICAgICAge1xuICAgICAgICAgICAgLi4udGhpcy5zdGF0ZSxcbiAgICAgICAgICAgIHNlbGVjdGVkRWxlbWVudElkczogeyBbZWxlbWVudC5pZF06IHRydWUgfSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHRoaXMuc2NlbmUuZ2V0Tm9uRGVsZXRlZEVsZW1lbnRzKCksXG4gICAgICAgICksXG4gICAgICAgICgpID0+IHtcbiAgICAgICAgICB0aGlzLl9vcGVuQ29udGV4dE1lbnUoeyB0b3AsIGxlZnQgfSwgdHlwZSk7XG4gICAgICAgIH0sXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9vcGVuQ29udGV4dE1lbnUoeyB0b3AsIGxlZnQgfSwgdHlwZSk7XG4gICAgfVxuICB9O1xuXG4gIHByaXZhdGUgbWF5YmVEcmFnTmV3R2VuZXJpY0VsZW1lbnQgPSAoXG4gICAgcG9pbnRlckRvd25TdGF0ZTogUG9pbnRlckRvd25TdGF0ZSxcbiAgICBldmVudDogTW91c2VFdmVudCB8IEtleWJvYXJkRXZlbnQsXG4gICk6IHZvaWQgPT4ge1xuICAgIGNvbnN0IGRyYWdnaW5nRWxlbWVudCA9IHRoaXMuc3RhdGUuZHJhZ2dpbmdFbGVtZW50O1xuICAgIGNvbnN0IHBvaW50ZXJDb29yZHMgPSBwb2ludGVyRG93blN0YXRlLmxhc3RDb29yZHM7XG4gICAgaWYgKCFkcmFnZ2luZ0VsZW1lbnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKFxuICAgICAgZHJhZ2dpbmdFbGVtZW50LnR5cGUgPT09IFwic2VsZWN0aW9uXCIgJiZcbiAgICAgIHRoaXMuc3RhdGUuYWN0aXZlVG9vbC50eXBlICE9PSBcImVyYXNlclwiXG4gICAgKSB7XG4gICAgICBkcmFnTmV3RWxlbWVudChcbiAgICAgICAgZHJhZ2dpbmdFbGVtZW50LFxuICAgICAgICB0aGlzLnN0YXRlLmFjdGl2ZVRvb2wudHlwZSxcbiAgICAgICAgcG9pbnRlckRvd25TdGF0ZS5vcmlnaW4ueCxcbiAgICAgICAgcG9pbnRlckRvd25TdGF0ZS5vcmlnaW4ueSxcbiAgICAgICAgcG9pbnRlckNvb3Jkcy54LFxuICAgICAgICBwb2ludGVyQ29vcmRzLnksXG4gICAgICAgIGRpc3RhbmNlKHBvaW50ZXJEb3duU3RhdGUub3JpZ2luLngsIHBvaW50ZXJDb29yZHMueCksXG4gICAgICAgIGRpc3RhbmNlKHBvaW50ZXJEb3duU3RhdGUub3JpZ2luLnksIHBvaW50ZXJDb29yZHMueSksXG4gICAgICAgIHNob3VsZE1haW50YWluQXNwZWN0UmF0aW8oZXZlbnQpLFxuICAgICAgICBzaG91bGRSZXNpemVGcm9tQ2VudGVyKGV2ZW50KSxcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IFtncmlkWCwgZ3JpZFldID0gZ2V0R3JpZFBvaW50KFxuICAgICAgICBwb2ludGVyQ29vcmRzLngsXG4gICAgICAgIHBvaW50ZXJDb29yZHMueSxcbiAgICAgICAgdGhpcy5zdGF0ZS5ncmlkU2l6ZSxcbiAgICAgICk7XG5cbiAgICAgIGNvbnN0IGltYWdlID1cbiAgICAgICAgaXNJbml0aWFsaXplZEltYWdlRWxlbWVudChkcmFnZ2luZ0VsZW1lbnQpICYmXG4gICAgICAgIHRoaXMuaW1hZ2VDYWNoZS5nZXQoZHJhZ2dpbmdFbGVtZW50LmZpbGVJZCk/LmltYWdlO1xuICAgICAgY29uc3QgYXNwZWN0UmF0aW8gPVxuICAgICAgICBpbWFnZSAmJiAhKGltYWdlIGluc3RhbmNlb2YgUHJvbWlzZSlcbiAgICAgICAgICA/IGltYWdlLndpZHRoIC8gaW1hZ2UuaGVpZ2h0XG4gICAgICAgICAgOiBudWxsO1xuXG4gICAgICBkcmFnTmV3RWxlbWVudChcbiAgICAgICAgZHJhZ2dpbmdFbGVtZW50LFxuICAgICAgICB0aGlzLnN0YXRlLmFjdGl2ZVRvb2wudHlwZSxcbiAgICAgICAgcG9pbnRlckRvd25TdGF0ZS5vcmlnaW5JbkdyaWQueCxcbiAgICAgICAgcG9pbnRlckRvd25TdGF0ZS5vcmlnaW5JbkdyaWQueSxcbiAgICAgICAgZ3JpZFgsXG4gICAgICAgIGdyaWRZLFxuICAgICAgICBkaXN0YW5jZShwb2ludGVyRG93blN0YXRlLm9yaWdpbkluR3JpZC54LCBncmlkWCksXG4gICAgICAgIGRpc3RhbmNlKHBvaW50ZXJEb3duU3RhdGUub3JpZ2luSW5HcmlkLnksIGdyaWRZKSxcbiAgICAgICAgaXNJbWFnZUVsZW1lbnQoZHJhZ2dpbmdFbGVtZW50KVxuICAgICAgICAgID8gIXNob3VsZE1haW50YWluQXNwZWN0UmF0aW8oZXZlbnQpXG4gICAgICAgICAgOiBzaG91bGRNYWludGFpbkFzcGVjdFJhdGlvKGV2ZW50KSxcbiAgICAgICAgc2hvdWxkUmVzaXplRnJvbUNlbnRlcihldmVudCksXG4gICAgICAgIGFzcGVjdFJhdGlvLFxuICAgICAgKTtcblxuICAgICAgdGhpcy5tYXliZVN1Z2dlc3RCaW5kaW5nRm9yQWxsKFtkcmFnZ2luZ0VsZW1lbnRdKTtcbiAgICB9XG4gIH07XG5cbiAgcHJpdmF0ZSBtYXliZUhhbmRsZVJlc2l6ZSA9IChcbiAgICBwb2ludGVyRG93blN0YXRlOiBQb2ludGVyRG93blN0YXRlLFxuICAgIGV2ZW50OiBNb3VzZUV2ZW50IHwgS2V5Ym9hcmRFdmVudCxcbiAgKTogYm9vbGVhbiA9PiB7XG4gICAgY29uc3Qgc2VsZWN0ZWRFbGVtZW50cyA9IGdldFNlbGVjdGVkRWxlbWVudHMoXG4gICAgICB0aGlzLnNjZW5lLmdldE5vbkRlbGV0ZWRFbGVtZW50cygpLFxuICAgICAgdGhpcy5zdGF0ZSxcbiAgICApO1xuICAgIGNvbnN0IHRyYW5zZm9ybUhhbmRsZVR5cGUgPSBwb2ludGVyRG93blN0YXRlLnJlc2l6ZS5oYW5kbGVUeXBlO1xuICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgLy8gVE9ETzogcmVuYW1lIHRoaXMgc3RhdGUgZmllbGQgdG8gXCJpc1NjYWxpbmdcIiB0byBkaXN0aW5ndWlzaFxuICAgICAgLy8gaXQgZnJvbSB0aGUgZ2VuZXJpYyBcImlzUmVzaXppbmdcIiB3aGljaCBpbmNsdWRlcyBzY2FsaW5nIGFuZFxuICAgICAgLy8gcm90YXRpbmdcbiAgICAgIGlzUmVzaXppbmc6IHRyYW5zZm9ybUhhbmRsZVR5cGUgJiYgdHJhbnNmb3JtSGFuZGxlVHlwZSAhPT0gXCJyb3RhdGlvblwiLFxuICAgICAgaXNSb3RhdGluZzogdHJhbnNmb3JtSGFuZGxlVHlwZSA9PT0gXCJyb3RhdGlvblwiLFxuICAgIH0pO1xuICAgIGNvbnN0IHBvaW50ZXJDb29yZHMgPSBwb2ludGVyRG93blN0YXRlLmxhc3RDb29yZHM7XG4gICAgY29uc3QgW3Jlc2l6ZVgsIHJlc2l6ZVldID0gZ2V0R3JpZFBvaW50KFxuICAgICAgcG9pbnRlckNvb3Jkcy54IC0gcG9pbnRlckRvd25TdGF0ZS5yZXNpemUub2Zmc2V0LngsXG4gICAgICBwb2ludGVyQ29vcmRzLnkgLSBwb2ludGVyRG93blN0YXRlLnJlc2l6ZS5vZmZzZXQueSxcbiAgICAgIHRoaXMuc3RhdGUuZ3JpZFNpemUsXG4gICAgKTtcbiAgICBpZiAoXG4gICAgICB0cmFuc2Zvcm1FbGVtZW50cyhcbiAgICAgICAgcG9pbnRlckRvd25TdGF0ZSxcbiAgICAgICAgdHJhbnNmb3JtSGFuZGxlVHlwZSxcbiAgICAgICAgc2VsZWN0ZWRFbGVtZW50cyxcbiAgICAgICAgcG9pbnRlckRvd25TdGF0ZS5yZXNpemUuYXJyb3dEaXJlY3Rpb24sXG4gICAgICAgIHNob3VsZFJvdGF0ZVdpdGhEaXNjcmV0ZUFuZ2xlKGV2ZW50KSxcbiAgICAgICAgc2hvdWxkUmVzaXplRnJvbUNlbnRlcihldmVudCksXG4gICAgICAgIHNlbGVjdGVkRWxlbWVudHMubGVuZ3RoID09PSAxICYmIGlzSW1hZ2VFbGVtZW50KHNlbGVjdGVkRWxlbWVudHNbMF0pXG4gICAgICAgICAgPyAhc2hvdWxkTWFpbnRhaW5Bc3BlY3RSYXRpbyhldmVudClcbiAgICAgICAgICA6IHNob3VsZE1haW50YWluQXNwZWN0UmF0aW8oZXZlbnQpLFxuICAgICAgICByZXNpemVYLFxuICAgICAgICByZXNpemVZLFxuICAgICAgICBwb2ludGVyRG93blN0YXRlLnJlc2l6ZS5jZW50ZXIueCxcbiAgICAgICAgcG9pbnRlckRvd25TdGF0ZS5yZXNpemUuY2VudGVyLnksXG4gICAgICApXG4gICAgKSB7XG4gICAgICB0aGlzLm1heWJlU3VnZ2VzdEJpbmRpbmdGb3JBbGwoc2VsZWN0ZWRFbGVtZW50cyk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9O1xuXG4gIC8qKiBAcHJpdmF0ZSB1c2UgdGhpcy5oYW5kbGVDYW52YXNDb250ZXh0TWVudSAqL1xuICBwcml2YXRlIF9vcGVuQ29udGV4dE1lbnUgPSAoXG4gICAge1xuICAgICAgbGVmdCxcbiAgICAgIHRvcCxcbiAgICB9OiB7XG4gICAgICBsZWZ0OiBudW1iZXI7XG4gICAgICB0b3A6IG51bWJlcjtcbiAgICB9LFxuICAgIHR5cGU6IFwiY2FudmFzXCIgfCBcImVsZW1lbnRcIixcbiAgKSA9PiB7XG4gICAgaWYgKHRoaXMuc3RhdGUuc2hvd0h5cGVybGlua1BvcHVwKSB7XG4gICAgICB0aGlzLnNldFN0YXRlKHsgc2hvd0h5cGVybGlua1BvcHVwOiBmYWxzZSB9KTtcbiAgICB9XG4gICAgdGhpcy5jb250ZXh0TWVudU9wZW4gPSB0cnVlO1xuICAgIGNvbnN0IG1heWJlR3JvdXBBY3Rpb24gPSBhY3Rpb25Hcm91cC5jb250ZXh0SXRlbVByZWRpY2F0ZSEoXG4gICAgICB0aGlzLmFjdGlvbk1hbmFnZXIuZ2V0RWxlbWVudHNJbmNsdWRpbmdEZWxldGVkKCksXG4gICAgICB0aGlzLmFjdGlvbk1hbmFnZXIuZ2V0QXBwU3RhdGUoKSxcbiAgICApO1xuXG4gICAgY29uc3QgbWF5YmVVbmdyb3VwQWN0aW9uID0gYWN0aW9uVW5ncm91cC5jb250ZXh0SXRlbVByZWRpY2F0ZSEoXG4gICAgICB0aGlzLmFjdGlvbk1hbmFnZXIuZ2V0RWxlbWVudHNJbmNsdWRpbmdEZWxldGVkKCksXG4gICAgICB0aGlzLmFjdGlvbk1hbmFnZXIuZ2V0QXBwU3RhdGUoKSxcbiAgICApO1xuXG4gICAgY29uc3QgbWF5YmVGbGlwSG9yaXpvbnRhbCA9IGFjdGlvbkZsaXBIb3Jpem9udGFsLmNvbnRleHRJdGVtUHJlZGljYXRlIShcbiAgICAgIHRoaXMuYWN0aW9uTWFuYWdlci5nZXRFbGVtZW50c0luY2x1ZGluZ0RlbGV0ZWQoKSxcbiAgICAgIHRoaXMuYWN0aW9uTWFuYWdlci5nZXRBcHBTdGF0ZSgpLFxuICAgICk7XG5cbiAgICBjb25zdCBtYXliZUZsaXBWZXJ0aWNhbCA9IGFjdGlvbkZsaXBWZXJ0aWNhbC5jb250ZXh0SXRlbVByZWRpY2F0ZSEoXG4gICAgICB0aGlzLmFjdGlvbk1hbmFnZXIuZ2V0RWxlbWVudHNJbmNsdWRpbmdEZWxldGVkKCksXG4gICAgICB0aGlzLmFjdGlvbk1hbmFnZXIuZ2V0QXBwU3RhdGUoKSxcbiAgICApO1xuXG4gICAgY29uc3QgbWF5QmVBbGxvd1VuYmluZGluZyA9IGFjdGlvblVuYmluZFRleHQuY29udGV4dEl0ZW1QcmVkaWNhdGUoXG4gICAgICB0aGlzLmFjdGlvbk1hbmFnZXIuZ2V0RWxlbWVudHNJbmNsdWRpbmdEZWxldGVkKCksXG4gICAgICB0aGlzLmFjdGlvbk1hbmFnZXIuZ2V0QXBwU3RhdGUoKSxcbiAgICApO1xuXG4gICAgY29uc3QgbWF5QmVBbGxvd0JpbmRpbmcgPSBhY3Rpb25CaW5kVGV4dC5jb250ZXh0SXRlbVByZWRpY2F0ZShcbiAgICAgIHRoaXMuYWN0aW9uTWFuYWdlci5nZXRFbGVtZW50c0luY2x1ZGluZ0RlbGV0ZWQoKSxcbiAgICAgIHRoaXMuYWN0aW9uTWFuYWdlci5nZXRBcHBTdGF0ZSgpLFxuICAgICk7XG5cbiAgICBjb25zdCBzZXBhcmF0b3IgPSBcInNlcGFyYXRvclwiO1xuXG4gICAgY29uc3QgZWxlbWVudHMgPSB0aGlzLnNjZW5lLmdldE5vbkRlbGV0ZWRFbGVtZW50cygpO1xuXG4gICAgY29uc3Qgc2VsZWN0ZWRFbGVtZW50cyA9IGdldFNlbGVjdGVkRWxlbWVudHMoXG4gICAgICB0aGlzLnNjZW5lLmdldE5vbkRlbGV0ZWRFbGVtZW50cygpLFxuICAgICAgdGhpcy5zdGF0ZSxcbiAgICApO1xuXG4gICAgY29uc3Qgb3B0aW9uczogQ29udGV4dE1lbnVPcHRpb25bXSA9IFtdO1xuICAgIGlmIChwcm9iYWJseVN1cHBvcnRzQ2xpcGJvYXJkQmxvYiAmJiBlbGVtZW50cy5sZW5ndGggPiAwKSB7XG4gICAgICBvcHRpb25zLnB1c2goYWN0aW9uQ29weUFzUG5nKTtcbiAgICB9XG5cbiAgICBpZiAocHJvYmFibHlTdXBwb3J0c0NsaXBib2FyZFdyaXRlVGV4dCAmJiBlbGVtZW50cy5sZW5ndGggPiAwKSB7XG4gICAgICBvcHRpb25zLnB1c2goYWN0aW9uQ29weUFzU3ZnKTtcbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICB0eXBlID09PSBcImVsZW1lbnRcIiAmJlxuICAgICAgY29weVRleHQuY29udGV4dEl0ZW1QcmVkaWNhdGUoZWxlbWVudHMsIHRoaXMuc3RhdGUpICYmXG4gICAgICBwcm9iYWJseVN1cHBvcnRzQ2xpcGJvYXJkV3JpdGVUZXh0XG4gICAgKSB7XG4gICAgICBvcHRpb25zLnB1c2goY29weVRleHQpO1xuICAgIH1cbiAgICBpZiAodHlwZSA9PT0gXCJjYW52YXNcIikge1xuICAgICAgY29uc3Qgdmlld01vZGVPcHRpb25zID0gW1xuICAgICAgICAuLi5vcHRpb25zLFxuICAgICAgICB0eXBlb2YgdGhpcy5wcm9wcy5ncmlkTW9kZUVuYWJsZWQgPT09IFwidW5kZWZpbmVkXCIgJiZcbiAgICAgICAgICBhY3Rpb25Ub2dnbGVHcmlkTW9kZSxcbiAgICAgICAgdHlwZW9mIHRoaXMucHJvcHMuemVuTW9kZUVuYWJsZWQgPT09IFwidW5kZWZpbmVkXCIgJiYgYWN0aW9uVG9nZ2xlWmVuTW9kZSxcbiAgICAgICAgdHlwZW9mIHRoaXMucHJvcHMudmlld01vZGVFbmFibGVkID09PSBcInVuZGVmaW5lZFwiICYmXG4gICAgICAgICAgYWN0aW9uVG9nZ2xlVmlld01vZGUsXG4gICAgICAgIGFjdGlvblRvZ2dsZVN0YXRzLFxuICAgICAgXTtcblxuICAgICAgaWYgKHRoaXMuc3RhdGUudmlld01vZGVFbmFibGVkKSB7XG4gICAgICAgIENvbnRleHRNZW51LnB1c2goe1xuICAgICAgICAgIG9wdGlvbnM6IHZpZXdNb2RlT3B0aW9ucyxcbiAgICAgICAgICB0b3AsXG4gICAgICAgICAgbGVmdCxcbiAgICAgICAgICBhY3Rpb25NYW5hZ2VyOiB0aGlzLmFjdGlvbk1hbmFnZXIsXG4gICAgICAgICAgYXBwU3RhdGU6IHRoaXMuc3RhdGUsXG4gICAgICAgICAgY29udGFpbmVyOiB0aGlzLmV4Y2FsaWRyYXdDb250YWluZXJSZWYuY3VycmVudCEsXG4gICAgICAgICAgZWxlbWVudHMsXG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgQ29udGV4dE1lbnUucHVzaCh7XG4gICAgICAgICAgb3B0aW9uczogW1xuICAgICAgICAgICAgdGhpcy5kZXZpY2UuaXNNb2JpbGUgJiZcbiAgICAgICAgICAgICAgbmF2aWdhdG9yLmNsaXBib2FyZCAmJiB7XG4gICAgICAgICAgICAgICAgdHJhY2tFdmVudDogZmFsc2UsXG4gICAgICAgICAgICAgICAgbmFtZTogXCJwYXN0ZVwiLFxuICAgICAgICAgICAgICAgIHBlcmZvcm06IChlbGVtZW50cywgYXBwU3RhdGVzKSA9PiB7XG4gICAgICAgICAgICAgICAgICB0aGlzLnBhc3RlRnJvbUNsaXBib2FyZChudWxsKTtcbiAgICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbW1pdFRvSGlzdG9yeTogZmFsc2UsXG4gICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgY29udGV4dEl0ZW1MYWJlbDogXCJsYWJlbHMucGFzdGVcIixcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHRoaXMuZGV2aWNlLmlzTW9iaWxlICYmIG5hdmlnYXRvci5jbGlwYm9hcmQgJiYgc2VwYXJhdG9yLFxuICAgICAgICAgICAgcHJvYmFibHlTdXBwb3J0c0NsaXBib2FyZEJsb2IgJiZcbiAgICAgICAgICAgICAgZWxlbWVudHMubGVuZ3RoID4gMCAmJlxuICAgICAgICAgICAgICBhY3Rpb25Db3B5QXNQbmcsXG4gICAgICAgICAgICBwcm9iYWJseVN1cHBvcnRzQ2xpcGJvYXJkV3JpdGVUZXh0ICYmXG4gICAgICAgICAgICAgIGVsZW1lbnRzLmxlbmd0aCA+IDAgJiZcbiAgICAgICAgICAgICAgYWN0aW9uQ29weUFzU3ZnLFxuICAgICAgICAgICAgcHJvYmFibHlTdXBwb3J0c0NsaXBib2FyZFdyaXRlVGV4dCAmJlxuICAgICAgICAgICAgICBzZWxlY3RlZEVsZW1lbnRzLmxlbmd0aCA+IDAgJiZcbiAgICAgICAgICAgICAgY29weVRleHQsXG4gICAgICAgICAgICAoKHByb2JhYmx5U3VwcG9ydHNDbGlwYm9hcmRCbG9iICYmIGVsZW1lbnRzLmxlbmd0aCA+IDApIHx8XG4gICAgICAgICAgICAgIChwcm9iYWJseVN1cHBvcnRzQ2xpcGJvYXJkV3JpdGVUZXh0ICYmIGVsZW1lbnRzLmxlbmd0aCA+IDApKSAmJlxuICAgICAgICAgICAgICBzZXBhcmF0b3IsXG4gICAgICAgICAgICBhY3Rpb25TZWxlY3RBbGwsXG4gICAgICAgICAgICBzZXBhcmF0b3IsXG4gICAgICAgICAgICB0eXBlb2YgdGhpcy5wcm9wcy5ncmlkTW9kZUVuYWJsZWQgPT09IFwidW5kZWZpbmVkXCIgJiZcbiAgICAgICAgICAgICAgYWN0aW9uVG9nZ2xlR3JpZE1vZGUsXG4gICAgICAgICAgICB0eXBlb2YgdGhpcy5wcm9wcy56ZW5Nb2RlRW5hYmxlZCA9PT0gXCJ1bmRlZmluZWRcIiAmJlxuICAgICAgICAgICAgICBhY3Rpb25Ub2dnbGVaZW5Nb2RlLFxuICAgICAgICAgICAgdHlwZW9mIHRoaXMucHJvcHMudmlld01vZGVFbmFibGVkID09PSBcInVuZGVmaW5lZFwiICYmXG4gICAgICAgICAgICAgIGFjdGlvblRvZ2dsZVZpZXdNb2RlLFxuICAgICAgICAgICAgYWN0aW9uVG9nZ2xlU3RhdHMsXG4gICAgICAgICAgXSxcbiAgICAgICAgICB0b3AsXG4gICAgICAgICAgbGVmdCxcbiAgICAgICAgICBhY3Rpb25NYW5hZ2VyOiB0aGlzLmFjdGlvbk1hbmFnZXIsXG4gICAgICAgICAgYXBwU3RhdGU6IHRoaXMuc3RhdGUsXG4gICAgICAgICAgY29udGFpbmVyOiB0aGlzLmV4Y2FsaWRyYXdDb250YWluZXJSZWYuY3VycmVudCEsXG4gICAgICAgICAgZWxlbWVudHMsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gXCJlbGVtZW50XCIpIHtcbiAgICAgIGlmICh0aGlzLnN0YXRlLnZpZXdNb2RlRW5hYmxlZCkge1xuICAgICAgICBDb250ZXh0TWVudS5wdXNoKHtcbiAgICAgICAgICBvcHRpb25zOiBbbmF2aWdhdG9yLmNsaXBib2FyZCAmJiBhY3Rpb25Db3B5LCAuLi5vcHRpb25zXSxcbiAgICAgICAgICB0b3AsXG4gICAgICAgICAgbGVmdCxcbiAgICAgICAgICBhY3Rpb25NYW5hZ2VyOiB0aGlzLmFjdGlvbk1hbmFnZXIsXG4gICAgICAgICAgYXBwU3RhdGU6IHRoaXMuc3RhdGUsXG4gICAgICAgICAgY29udGFpbmVyOiB0aGlzLmV4Y2FsaWRyYXdDb250YWluZXJSZWYuY3VycmVudCEsXG4gICAgICAgICAgZWxlbWVudHMsXG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgQ29udGV4dE1lbnUucHVzaCh7XG4gICAgICAgICAgb3B0aW9uczogW1xuICAgICAgICAgICAgdGhpcy5kZXZpY2UuaXNNb2JpbGUgJiYgYWN0aW9uQ3V0LFxuICAgICAgICAgICAgdGhpcy5kZXZpY2UuaXNNb2JpbGUgJiYgbmF2aWdhdG9yLmNsaXBib2FyZCAmJiBhY3Rpb25Db3B5LFxuICAgICAgICAgICAgdGhpcy5kZXZpY2UuaXNNb2JpbGUgJiZcbiAgICAgICAgICAgICAgbmF2aWdhdG9yLmNsaXBib2FyZCAmJiB7XG4gICAgICAgICAgICAgICAgbmFtZTogXCJwYXN0ZVwiLFxuICAgICAgICAgICAgICAgIHRyYWNrRXZlbnQ6IGZhbHNlLFxuICAgICAgICAgICAgICAgIHBlcmZvcm06IChlbGVtZW50cywgYXBwU3RhdGVzKSA9PiB7XG4gICAgICAgICAgICAgICAgICB0aGlzLnBhc3RlRnJvbUNsaXBib2FyZChudWxsKTtcbiAgICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbW1pdFRvSGlzdG9yeTogZmFsc2UsXG4gICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgY29udGV4dEl0ZW1MYWJlbDogXCJsYWJlbHMucGFzdGVcIixcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHRoaXMuZGV2aWNlLmlzTW9iaWxlICYmIHNlcGFyYXRvcixcbiAgICAgICAgICAgIC4uLm9wdGlvbnMsXG4gICAgICAgICAgICBzZXBhcmF0b3IsXG4gICAgICAgICAgICBhY3Rpb25Db3B5U3R5bGVzLFxuICAgICAgICAgICAgYWN0aW9uUGFzdGVTdHlsZXMsXG4gICAgICAgICAgICBzZXBhcmF0b3IsXG4gICAgICAgICAgICBtYXliZUdyb3VwQWN0aW9uICYmIGFjdGlvbkdyb3VwLFxuICAgICAgICAgICAgbWF5QmVBbGxvd1VuYmluZGluZyAmJiBhY3Rpb25VbmJpbmRUZXh0LFxuICAgICAgICAgICAgbWF5QmVBbGxvd0JpbmRpbmcgJiYgYWN0aW9uQmluZFRleHQsXG4gICAgICAgICAgICBtYXliZVVuZ3JvdXBBY3Rpb24gJiYgYWN0aW9uVW5ncm91cCxcbiAgICAgICAgICAgIChtYXliZUdyb3VwQWN0aW9uIHx8IG1heWJlVW5ncm91cEFjdGlvbikgJiYgc2VwYXJhdG9yLFxuICAgICAgICAgICAgYWN0aW9uQWRkVG9MaWJyYXJ5LFxuICAgICAgICAgICAgc2VwYXJhdG9yLFxuICAgICAgICAgICAgYWN0aW9uU2VuZEJhY2t3YXJkLFxuICAgICAgICAgICAgYWN0aW9uQnJpbmdGb3J3YXJkLFxuICAgICAgICAgICAgYWN0aW9uU2VuZFRvQmFjayxcbiAgICAgICAgICAgIGFjdGlvbkJyaW5nVG9Gcm9udCxcbiAgICAgICAgICAgIHNlcGFyYXRvcixcbiAgICAgICAgICAgIG1heWJlRmxpcEhvcml6b250YWwgJiYgYWN0aW9uRmxpcEhvcml6b250YWwsXG4gICAgICAgICAgICBtYXliZUZsaXBWZXJ0aWNhbCAmJiBhY3Rpb25GbGlwVmVydGljYWwsXG4gICAgICAgICAgICAobWF5YmVGbGlwSG9yaXpvbnRhbCB8fCBtYXliZUZsaXBWZXJ0aWNhbCkgJiYgc2VwYXJhdG9yLFxuICAgICAgICAgICAgYWN0aW9uTGluay5jb250ZXh0SXRlbVByZWRpY2F0ZShlbGVtZW50cywgdGhpcy5zdGF0ZSkgJiYgYWN0aW9uTGluayxcbiAgICAgICAgICAgIGFjdGlvbkR1cGxpY2F0ZVNlbGVjdGlvbixcbiAgICAgICAgICAgIGFjdGlvblRvZ2dsZUxvY2ssXG4gICAgICAgICAgICBzZXBhcmF0b3IsXG4gICAgICAgICAgICBhY3Rpb25EZWxldGVTZWxlY3RlZCxcbiAgICAgICAgICBdLFxuICAgICAgICAgIHRvcCxcbiAgICAgICAgICBsZWZ0LFxuICAgICAgICAgIGFjdGlvbk1hbmFnZXI6IHRoaXMuYWN0aW9uTWFuYWdlcixcbiAgICAgICAgICBhcHBTdGF0ZTogdGhpcy5zdGF0ZSxcbiAgICAgICAgICBjb250YWluZXI6IHRoaXMuZXhjYWxpZHJhd0NvbnRhaW5lclJlZi5jdXJyZW50ISxcbiAgICAgICAgICBlbGVtZW50cyxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIHByaXZhdGUgaGFuZGxlV2hlZWwgPSB3aXRoQmF0Y2hlZFVwZGF0ZXMoKGV2ZW50OiBXaGVlbEV2ZW50KSA9PiB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICBpZiAoaXNQYW5uaW5nKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgeyBkZWx0YVgsIGRlbHRhWSB9ID0gZXZlbnQ7XG4gICAgLy8gbm90ZSB0aGF0IGV2ZW50LmN0cmxLZXkgaXMgbmVjZXNzYXJ5IHRvIGhhbmRsZSBwaW5jaCB6b29taW5nXG4gICAgaWYgKGV2ZW50Lm1ldGFLZXkgfHwgZXZlbnQuY3RybEtleSkge1xuICAgICAgY29uc3Qgc2lnbiA9IE1hdGguc2lnbihkZWx0YVkpO1xuICAgICAgY29uc3QgTUFYX1NURVAgPSAxMDtcbiAgICAgIGNvbnN0IGFic0RlbHRhID0gTWF0aC5hYnMoZGVsdGFZKTtcbiAgICAgIGxldCBkZWx0YSA9IGRlbHRhWTtcbiAgICAgIGlmIChhYnNEZWx0YSA+IE1BWF9TVEVQKSB7XG4gICAgICAgIGRlbHRhID0gTUFYX1NURVAgKiBzaWduO1xuICAgICAgfVxuXG4gICAgICBsZXQgbmV3Wm9vbSA9IHRoaXMuc3RhdGUuem9vbS52YWx1ZSAtIGRlbHRhIC8gMTAwO1xuICAgICAgLy8gaW5jcmVhc2Ugem9vbSBzdGVwcyB0aGUgbW9yZSB6b29tZWQtaW4gd2UgYXJlIChhcHBsaWVzIHRvID4xMDAlIG9ubHkpXG4gICAgICBuZXdab29tICs9XG4gICAgICAgIE1hdGgubG9nMTAoTWF0aC5tYXgoMSwgdGhpcy5zdGF0ZS56b29tLnZhbHVlKSkgKlxuICAgICAgICAtc2lnbiAqXG4gICAgICAgIC8vIHJlZHVjZWQgYW1wbGlmaWNhdGlvbiBmb3Igc21hbGwgZGVsdGFzIChzbWFsbCBtb3ZlbWVudHMgb24gYSB0cmFja3BhZClcbiAgICAgICAgTWF0aC5taW4oMSwgYWJzRGVsdGEgLyAyMCk7XG5cbiAgICAgIHRoaXMuc2V0U3RhdGUoKHN0YXRlKSA9PiAoe1xuICAgICAgICAuLi5nZXRTdGF0ZUZvclpvb20oXG4gICAgICAgICAge1xuICAgICAgICAgICAgdmlld3BvcnRYOiBjdXJzb3JYLFxuICAgICAgICAgICAgdmlld3BvcnRZOiBjdXJzb3JZLFxuICAgICAgICAgICAgbmV4dFpvb206IGdldE5vcm1hbGl6ZWRab29tKG5ld1pvb20pLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgc3RhdGUsXG4gICAgICAgICksXG4gICAgICAgIHNob3VsZENhY2hlSWdub3JlWm9vbTogdHJ1ZSxcbiAgICAgIH0pKTtcbiAgICAgIHRoaXMucmVzZXRTaG91bGRDYWNoZUlnbm9yZVpvb21EZWJvdW5jZWQoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBzY3JvbGwgaG9yaXpvbnRhbGx5IHdoZW4gc2hpZnQgcHJlc3NlZFxuICAgIGlmIChldmVudC5zaGlmdEtleSkge1xuICAgICAgdGhpcy5zZXRTdGF0ZSgoeyB6b29tLCBzY3JvbGxYIH0pID0+ICh7XG4gICAgICAgIC8vIG9uIE1hYywgc2hpZnQrd2hlZWwgdGVuZHMgdG8gcmVzdWx0IGluIGRlbHRhWFxuICAgICAgICBzY3JvbGxYOiBzY3JvbGxYIC0gKGRlbHRhWSB8fCBkZWx0YVgpIC8gem9vbS52YWx1ZSxcbiAgICAgIH0pKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLnNldFN0YXRlKCh7IHpvb20sIHNjcm9sbFgsIHNjcm9sbFkgfSkgPT4gKHtcbiAgICAgIHNjcm9sbFg6IHNjcm9sbFggLSBkZWx0YVggLyB6b29tLnZhbHVlLFxuICAgICAgc2Nyb2xsWTogc2Nyb2xsWSAtIGRlbHRhWSAvIHpvb20udmFsdWUsXG4gICAgfSkpO1xuICB9KTtcblxuICBwcml2YXRlIGdldFRleHRXeXNpd3lnU25hcHBlZFRvQ2VudGVyUG9zaXRpb24oXG4gICAgeDogbnVtYmVyLFxuICAgIHk6IG51bWJlcixcbiAgICBhcHBTdGF0ZTogQXBwU3RhdGUsXG4gICAgY2FudmFzOiBIVE1MQ2FudmFzRWxlbWVudCB8IG51bGwsXG4gICAgc2NhbGU6IG51bWJlcixcbiAgKSB7XG4gICAgY29uc3QgZWxlbWVudENsaWNrZWRJbnNpZGUgPSBnZXRUZXh0QmluZGFibGVDb250YWluZXJBdFBvc2l0aW9uKFxuICAgICAgdGhpcy5zY2VuZVxuICAgICAgICAuZ2V0RWxlbWVudHNJbmNsdWRpbmdEZWxldGVkKClcbiAgICAgICAgLmZpbHRlcigoZWxlbWVudCkgPT4gIWlzVGV4dEVsZW1lbnQoZWxlbWVudCkpLFxuICAgICAgeCxcbiAgICAgIHksXG4gICAgKTtcbiAgICBpZiAoZWxlbWVudENsaWNrZWRJbnNpZGUpIHtcbiAgICAgIGNvbnN0IGVsZW1lbnRDZW50ZXJYID1cbiAgICAgICAgZWxlbWVudENsaWNrZWRJbnNpZGUueCArIGVsZW1lbnRDbGlja2VkSW5zaWRlLndpZHRoIC8gMjtcbiAgICAgIGNvbnN0IGVsZW1lbnRDZW50ZXJZID1cbiAgICAgICAgZWxlbWVudENsaWNrZWRJbnNpZGUueSArIGVsZW1lbnRDbGlja2VkSW5zaWRlLmhlaWdodCAvIDI7XG4gICAgICBjb25zdCBkaXN0YW5jZVRvQ2VudGVyID0gTWF0aC5oeXBvdChcbiAgICAgICAgeCAtIGVsZW1lbnRDZW50ZXJYLFxuICAgICAgICB5IC0gZWxlbWVudENlbnRlclksXG4gICAgICApO1xuICAgICAgY29uc3QgaXNTbmFwcGVkVG9DZW50ZXIgPVxuICAgICAgICBkaXN0YW5jZVRvQ2VudGVyIDwgVEVYVF9UT19DRU5URVJfU05BUF9USFJFU0hPTEQ7XG4gICAgICBpZiAoaXNTbmFwcGVkVG9DZW50ZXIpIHtcbiAgICAgICAgY29uc3QgeyB4OiB2aWV3cG9ydFgsIHk6IHZpZXdwb3J0WSB9ID0gc2NlbmVDb29yZHNUb1ZpZXdwb3J0Q29vcmRzKFxuICAgICAgICAgIHsgc2NlbmVYOiBlbGVtZW50Q2VudGVyWCwgc2NlbmVZOiBlbGVtZW50Q2VudGVyWSB9LFxuICAgICAgICAgIGFwcFN0YXRlLFxuICAgICAgICApO1xuICAgICAgICByZXR1cm4geyB2aWV3cG9ydFgsIHZpZXdwb3J0WSwgZWxlbWVudENlbnRlclgsIGVsZW1lbnRDZW50ZXJZIH07XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzYXZlUG9pbnRlciA9ICh4OiBudW1iZXIsIHk6IG51bWJlciwgYnV0dG9uOiBcInVwXCIgfCBcImRvd25cIikgPT4ge1xuICAgIGlmICgheCB8fCAheSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBwb2ludGVyID0gdmlld3BvcnRDb29yZHNUb1NjZW5lQ29vcmRzKFxuICAgICAgeyBjbGllbnRYOiB4LCBjbGllbnRZOiB5IH0sXG4gICAgICB0aGlzLnN0YXRlLFxuICAgICk7XG5cbiAgICBpZiAoaXNOYU4ocG9pbnRlci54KSB8fCBpc05hTihwb2ludGVyLnkpKSB7XG4gICAgICAvLyBzb21ldGltZXMgdGhlIHBvaW50ZXIgZ29lcyBvZmYgc2NyZWVuXG4gICAgfVxuXG4gICAgdGhpcy5wcm9wcy5vblBvaW50ZXJVcGRhdGU/Lih7XG4gICAgICBwb2ludGVyLFxuICAgICAgYnV0dG9uLFxuICAgICAgcG9pbnRlcnNNYXA6IGdlc3R1cmUucG9pbnRlcnMsXG4gICAgfSk7XG4gIH07XG5cbiAgcHJpdmF0ZSByZXNldFNob3VsZENhY2hlSWdub3JlWm9vbURlYm91bmNlZCA9IGRlYm91bmNlKCgpID0+IHtcbiAgICBpZiAoIXRoaXMudW5tb3VudGVkKSB7XG4gICAgICB0aGlzLnNldFN0YXRlKHsgc2hvdWxkQ2FjaGVJZ25vcmVab29tOiBmYWxzZSB9KTtcbiAgICB9XG4gIH0sIDMwMCk7XG5cbiAgcHJpdmF0ZSB1cGRhdGVET01SZWN0ID0gKGNiPzogKCkgPT4gdm9pZCkgPT4ge1xuICAgIGlmICh0aGlzLmV4Y2FsaWRyYXdDb250YWluZXJSZWY/LmN1cnJlbnQpIHtcbiAgICAgIGNvbnN0IGV4Y2FsaWRyYXdDb250YWluZXIgPSB0aGlzLmV4Y2FsaWRyYXdDb250YWluZXJSZWYuY3VycmVudDtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgd2lkdGgsXG4gICAgICAgIGhlaWdodCxcbiAgICAgICAgbGVmdDogb2Zmc2V0TGVmdCxcbiAgICAgICAgdG9wOiBvZmZzZXRUb3AsXG4gICAgICB9ID0gZXhjYWxpZHJhd0NvbnRhaW5lci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgd2lkdGg6IGN1cnJlbnRXaWR0aCxcbiAgICAgICAgaGVpZ2h0OiBjdXJyZW50SGVpZ2h0LFxuICAgICAgICBvZmZzZXRUb3A6IGN1cnJlbnRPZmZzZXRUb3AsXG4gICAgICAgIG9mZnNldExlZnQ6IGN1cnJlbnRPZmZzZXRMZWZ0LFxuICAgICAgfSA9IHRoaXMuc3RhdGU7XG5cbiAgICAgIGlmIChcbiAgICAgICAgd2lkdGggPT09IGN1cnJlbnRXaWR0aCAmJlxuICAgICAgICBoZWlnaHQgPT09IGN1cnJlbnRIZWlnaHQgJiZcbiAgICAgICAgb2Zmc2V0TGVmdCA9PT0gY3VycmVudE9mZnNldExlZnQgJiZcbiAgICAgICAgb2Zmc2V0VG9wID09PSBjdXJyZW50T2Zmc2V0VG9wXG4gICAgICApIHtcbiAgICAgICAgaWYgKGNiKSB7XG4gICAgICAgICAgY2IoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHRoaXMuc2V0U3RhdGUoXG4gICAgICAgIHtcbiAgICAgICAgICB3aWR0aCxcbiAgICAgICAgICBoZWlnaHQsXG4gICAgICAgICAgb2Zmc2V0TGVmdCxcbiAgICAgICAgICBvZmZzZXRUb3AsXG4gICAgICAgIH0sXG4gICAgICAgICgpID0+IHtcbiAgICAgICAgICBjYiAmJiBjYigpO1xuICAgICAgICB9LFxuICAgICAgKTtcbiAgICB9XG4gIH07XG5cbiAgcHVibGljIHJlZnJlc2ggPSAoKSA9PiB7XG4gICAgdGhpcy5zZXRTdGF0ZSh7IC4uLnRoaXMuZ2V0Q2FudmFzT2Zmc2V0cygpIH0pO1xuICB9O1xuXG4gIHByaXZhdGUgZ2V0Q2FudmFzT2Zmc2V0cygpOiBQaWNrPEFwcFN0YXRlLCBcIm9mZnNldFRvcFwiIHwgXCJvZmZzZXRMZWZ0XCI+IHtcbiAgICBpZiAodGhpcy5leGNhbGlkcmF3Q29udGFpbmVyUmVmPy5jdXJyZW50KSB7XG4gICAgICBjb25zdCBleGNhbGlkcmF3Q29udGFpbmVyID0gdGhpcy5leGNhbGlkcmF3Q29udGFpbmVyUmVmLmN1cnJlbnQ7XG4gICAgICBjb25zdCB7IGxlZnQsIHRvcCB9ID0gZXhjYWxpZHJhd0NvbnRhaW5lci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIG9mZnNldExlZnQ6IGxlZnQsXG4gICAgICAgIG9mZnNldFRvcDogdG9wLFxuICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIG9mZnNldExlZnQ6IDAsXG4gICAgICBvZmZzZXRUb3A6IDAsXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgdXBkYXRlTGFuZ3VhZ2UoKSB7XG4gICAgY29uc3QgY3VycmVudExhbmcgPVxuICAgICAgbGFuZ3VhZ2VzLmZpbmQoKGxhbmcpID0+IGxhbmcuY29kZSA9PT0gdGhpcy5wcm9wcy5sYW5nQ29kZSkgfHxcbiAgICAgIGRlZmF1bHRMYW5nO1xuICAgIGF3YWl0IHNldExhbmd1YWdlKGN1cnJlbnRMYW5nKTtcbiAgICB0aGlzLnNldEFwcFN0YXRlKHt9KTtcbiAgfVxufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gVEVTVCBIT09LU1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgV2luZG93IHtcbiAgICBoOiB7XG4gICAgICBlbGVtZW50czogcmVhZG9ubHkgRXhjYWxpZHJhd0VsZW1lbnRbXTtcbiAgICAgIHN0YXRlOiBBcHBTdGF0ZTtcbiAgICAgIHNldFN0YXRlOiBSZWFjdC5Db21wb25lbnQ8YW55LCBBcHBTdGF0ZT5bXCJzZXRTdGF0ZVwiXTtcbiAgICAgIGFwcDogSW5zdGFuY2VUeXBlPHR5cGVvZiBBcHA+O1xuICAgICAgaGlzdG9yeTogSGlzdG9yeTtcbiAgICB9O1xuICB9XG59XG5cbmlmIChcbiAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IEVOVi5URVNUIHx8XG4gIHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBFTlYuREVWRUxPUE1FTlRcbikge1xuICB3aW5kb3cuaCA9IHdpbmRvdy5oIHx8ICh7fSBhcyBXaW5kb3dbXCJoXCJdKTtcblxuICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyh3aW5kb3cuaCwge1xuICAgIGVsZW1lbnRzOiB7XG4gICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICBnZXQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmFwcD8uc2NlbmUuZ2V0RWxlbWVudHNJbmNsdWRpbmdEZWxldGVkKCk7XG4gICAgICB9LFxuICAgICAgc2V0KGVsZW1lbnRzOiBFeGNhbGlkcmF3RWxlbWVudFtdKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmFwcD8uc2NlbmUucmVwbGFjZUFsbEVsZW1lbnRzKGVsZW1lbnRzKTtcbiAgICAgIH0sXG4gICAgfSxcbiAgfSk7XG59XG5leHBvcnQgZGVmYXVsdCBBcHA7XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///../../components/App.tsx\n");
|
|
2121
2121
|
|
|
2122
2122
|
/***/ }),
|
|
2123
2123
|
|
|
@@ -2249,7 +2249,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
|
|
|
2249
2249
|
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|
2250
2250
|
|
|
2251
2251
|
"use strict";
|
|
2252
|
-
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"Dialog\": () => (/* binding */ Dialog)\n/* harmony export */ });\n/* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react/jsx-runtime */ \"../../../node_modules/react/jsx-runtime.js\");\n/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! clsx */ \"../../../node_modules/clsx/dist/clsx.m.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react */ \"react\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var _hooks_useCallbackRefState__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../hooks/useCallbackRefState */ \"../../hooks/useCallbackRefState.ts\");\n/* harmony import */ var _i18n__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../i18n */ \"../../i18n.ts\");\n/* harmony import */ var _components_App__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../components/App */ \"../../components/App.tsx\");\n/* harmony import */ var _keys__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../keys */ \"../../keys.ts\");\n/* harmony import */ var _Dialog_scss__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./Dialog.scss */ \"../../components/Dialog.scss\");\n/* harmony import */ var _Dialog_scss__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(_Dialog_scss__WEBPACK_IMPORTED_MODULE_7__);\n/* harmony import */ var _icons__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./icons */ \"../../components/icons.tsx\");\n/* harmony import */ var _Island__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./Island */ \"../../components/Island.tsx\");\n/* harmony import */ var _Modal__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./Modal */ \"../../components/Modal.tsx\");\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../utils */ \"../../utils.ts\");\n\n\n\n\n\n\n\n\n\n\n\n\nconst Dialog = (props) => {\n const [islandNode, setIslandNode] = (0,_hooks_useCallbackRefState__WEBPACK_IMPORTED_MODULE_3__.useCallbackRefState)();\n const [lastActiveElement] = (0,react__WEBPACK_IMPORTED_MODULE_2__.useState)(document.activeElement);\n const { id } = (0,_components_App__WEBPACK_IMPORTED_MODULE_5__.useExcalidrawContainer)();\n (0,react__WEBPACK_IMPORTED_MODULE_2__.useEffect)(() => {\n if (!islandNode) {\n return;\n }\n const focusableElements = (0,_utils__WEBPACK_IMPORTED_MODULE_11__.queryFocusableElements)(islandNode);\n if (focusableElements.length > 0 && props.autofocus !== false) {\n // If there's an element other than close, focus it.\n (focusableElements[1] || focusableElements[0]).focus();\n }\n const handleKeyDown = (event) => {\n if (event.key === _keys__WEBPACK_IMPORTED_MODULE_6__.KEYS.TAB) {\n const focusableElements = (0,_utils__WEBPACK_IMPORTED_MODULE_11__.queryFocusableElements)(islandNode);\n const { activeElement } = document;\n const currentIndex = focusableElements.findIndex((element) => element === activeElement);\n if (currentIndex === 0 && event.shiftKey) {\n focusableElements[focusableElements.length - 1].focus();\n event.preventDefault();\n }\n else if (currentIndex === focusableElements.length - 1 &&\n !event.shiftKey) {\n focusableElements[0].focus();\n event.preventDefault();\n }\n }\n };\n islandNode.addEventListener(\"keydown\", handleKeyDown);\n return () => islandNode.removeEventListener(\"keydown\", handleKeyDown);\n }, [islandNode, props.autofocus]);\n const onClose = () => {\n lastActiveElement.focus();\n props.onCloseRequest();\n };\n return ((0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_Modal__WEBPACK_IMPORTED_MODULE_10__.Modal, Object.assign({ className: (0,clsx__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(\"Dialog\", props.className), labelledBy: \"dialog-title\", maxWidth: props.small ? 550 : 800, onCloseRequest: onClose, theme: props.theme, closeOnClickOutside: props.closeOnClickOutside }, { children: (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)(_Island__WEBPACK_IMPORTED_MODULE_9__.Island, Object.assign({ ref: setIslandNode }, { children: [(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)(\"h2\", Object.assign({ id: `${id}-dialog-title`, className: \"Dialog__title\" }, { children: [(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(\"span\", Object.assign({ className: \"Dialog__titleContent\" }, { children: props.title })), (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(\"button\", Object.assign({ className: \"Modal__close\", onClick: onClose, \"aria-label\": (0,_i18n__WEBPACK_IMPORTED_MODULE_4__.t)(\"buttons.close\") }, { children: (0,_components_App__WEBPACK_IMPORTED_MODULE_5__.useDevice)().isMobile ? _icons__WEBPACK_IMPORTED_MODULE_8__.back : _icons__WEBPACK_IMPORTED_MODULE_8__.close }))] })), (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(\"div\", Object.assign({ className: \"Dialog__content\" }, { children: props.children }))] })) })));\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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SyxFQUNsQixtQkFBbUIsRUFBRSxLQUFLLENBQUMsbUJBQW1CLGdCQUU5Qyx3REFBQywyQ0FBTSxrQkFBQyxHQUFHLEVBQUUsYUFBYSxpQkFDeEIsOEVBQUksRUFBRSxFQUFFLEdBQUcsRUFBRSxlQUFlLEVBQUUsU0FBUyxFQUFDLGVBQWUsaUJBQ3JELCtFQUFNLFNBQVMsRUFBQyxzQkFBc0IsZ0JBQUUsS0FBSyxDQUFDLEtBQUssSUFBUSxFQUMzRCxpRkFDRSxTQUFTLEVBQUMsY0FBYyxFQUN4QixPQUFPLEVBQUUsT0FBTyxnQkFDSix3Q0FBQyxDQUFDLGVBQWUsQ0FBQyxnQkFFN0IsMERBQVMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsd0NBQUksQ0FBQyxDQUFDLENBQUMseUNBQUssSUFDN0IsS0FDTixFQUNMLDhFQUFLLFNBQVMsRUFBQyxpQkFBaUIsZ0JBQUUsS0FBSyxDQUFDLFFBQVEsSUFBTyxLQUNoRCxJQUNILENBQ1QsQ0FBQztBQUNKLENBQUMsQ0FBQyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uLi8uLi9jb21wb25lbnRzL0RpYWxvZy50c3g/MGQ3YyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgY2xzeCBmcm9tIFwiY2xzeFwiO1xuaW1wb3J0IFJlYWN0LCB7IHVzZUVmZmVjdCwgdXNlU3RhdGUgfSBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCB7IHVzZUNhbGxiYWNrUmVmU3RhdGUgfSBmcm9tIFwiLi4vaG9va3MvdXNlQ2FsbGJhY2tSZWZTdGF0ZVwiO1xuaW1wb3J0IHsgdCB9IGZyb20gXCIuLi9pMThuXCI7XG5pbXBvcnQgeyB1c2VFeGNhbGlkcmF3Q29udGFpbmVyLCB1c2VEZXZpY2UgfSBmcm9tIFwiLi4vY29tcG9uZW50cy9BcHBcIjtcbmltcG9ydCB7IEtFWVMgfSBmcm9tIFwiLi4va2V5c1wiO1xuaW1wb3J0IFwiLi9EaWFsb2cuc2Nzc1wiO1xuaW1wb3J0IHsgYmFjaywgY2xvc2UgfSBmcm9tIFwiLi9pY29uc1wiO1xuaW1wb3J0IHsgSXNsYW5kIH0gZnJvbSBcIi4vSXNsYW5kXCI7XG5pbXBvcnQgeyBNb2RhbCB9IGZyb20gXCIuL01vZGFsXCI7XG5pbXBvcnQgeyBBcHBTdGF0ZSB9IGZyb20gXCIuLi90eXBlc1wiO1xuaW1wb3J0IHsgcXVlcnlGb2N1c2FibGVFbGVtZW50cyB9IGZyb20gXCIuLi91dGlsc1wiO1xuXG5leHBvcnQgaW50ZXJmYWNlIERpYWxvZ1Byb3BzIHtcbiAgY2hpbGRyZW46IFJlYWN0LlJlYWN0Tm9kZTtcbiAgY2xhc3NOYW1lPzogc3RyaW5nO1xuICBzbWFsbD86IGJvb2xlYW47XG4gIG9uQ2xvc2VSZXF1ZXN0KCk6IHZvaWQ7XG4gIHRpdGxlOiBSZWFjdC5SZWFjdE5vZGU7XG4gIGF1dG9mb2N1cz86IGJvb2xlYW47XG4gIHRoZW1lPzogQXBwU3RhdGVbXCJ0aGVtZVwiXTtcbiAgY2xvc2VPbkNsaWNrT3V0c2lkZT86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBjb25zdCBEaWFsb2cgPSAocHJvcHM6IERpYWxvZ1Byb3BzKSA9PiB7XG4gIGNvbnN0IFtpc2xhbmROb2RlLCBzZXRJc2xhbmROb2RlXSA9IHVzZUNhbGxiYWNrUmVmU3RhdGU8SFRNTERpdkVsZW1lbnQ+KCk7XG4gIGNvbnN0IFtsYXN0QWN0aXZlRWxlbWVudF0gPSB1c2VTdGF0ZShkb2N1bWVudC5hY3RpdmVFbGVtZW50KTtcbiAgY29uc3QgeyBpZCB9ID0gdXNlRXhjYWxpZHJhd0NvbnRhaW5lcigpO1xuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKCFpc2xhbmROb2RlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgZm9jdXNhYmxlRWxlbWVudHMgPSBxdWVyeUZvY3VzYWJsZUVsZW1lbnRzKGlzbGFuZE5vZGUpO1xuXG4gICAgaWYgKGZvY3VzYWJsZUVsZW1lbnRzLmxlbmd0aCA+IDAgJiYgcHJvcHMuYXV0b2ZvY3VzICE9PSBmYWxzZSkge1xuICAgICAgLy8gSWYgdGhlcmUncyBhbiBlbGVtZW50IG90aGVyIHRoYW4gY2xvc2UsIGZvY3VzIGl0LlxuICAgICAgKGZvY3VzYWJsZUVsZW1lbnRzWzFdIHx8IGZvY3VzYWJsZUVsZW1lbnRzWzBdKS5mb2N1cygpO1xuICAgIH1cblxuICAgIGNvbnN0IGhhbmRsZUtleURvd24gPSAoZXZlbnQ6IEtleWJvYXJkRXZlbnQpID0+IHtcbiAgICAgIGlmIChldmVudC5rZXkgPT09IEtFWVMuVEFCKSB7XG4gICAgICAgIGNvbnN0IGZvY3VzYWJsZUVsZW1lbnRzID0gcXVlcnlGb2N1c2FibGVFbGVtZW50cyhpc2xhbmROb2RlKTtcbiAgICAgICAgY29uc3QgeyBhY3RpdmVFbGVtZW50IH0gPSBkb2N1bWVudDtcbiAgICAgICAgY29uc3QgY3VycmVudEluZGV4ID0gZm9jdXNhYmxlRWxlbWVudHMuZmluZEluZGV4KFxuICAgICAgICAgIChlbGVtZW50KSA9PiBlbGVtZW50ID09PSBhY3RpdmVFbGVtZW50LFxuICAgICAgICApO1xuXG4gICAgICAgIGlmIChjdXJyZW50SW5kZXggPT09IDAgJiYgZXZlbnQuc2hpZnRLZXkpIHtcbiAgICAgICAgICBmb2N1c2FibGVFbGVtZW50c1tmb2N1c2FibGVFbGVtZW50cy5sZW5ndGggLSAxXS5mb2N1cygpO1xuICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgY3VycmVudEluZGV4ID09PSBmb2N1c2FibGVFbGVtZW50cy5sZW5ndGggLSAxICYmXG4gICAgICAgICAgIWV2ZW50LnNoaWZ0S2V5XG4gICAgICAgICkge1xuICAgICAgICAgIGZvY3VzYWJsZUVsZW1lbnRzWzBdLmZvY3VzKCk7XG4gICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG5cbiAgICBpc2xhbmROb2RlLmFkZEV2ZW50TGlzdGVuZXIoXCJrZXlkb3duXCIsIGhhbmRsZUtleURvd24pO1xuXG4gICAgcmV0dXJuICgpID0+IGlzbGFuZE5vZGUucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImtleWRvd25cIiwgaGFuZGxlS2V5RG93bik7XG4gIH0sIFtpc2xhbmROb2RlLCBwcm9wcy5hdXRvZm9jdXNdKTtcblxuICBjb25zdCBvbkNsb3NlID0gKCkgPT4ge1xuICAgIChsYXN0QWN0aXZlRWxlbWVudCBhcyBIVE1MRWxlbWVudCkuZm9jdXMoKTtcbiAgICBwcm9wcy5vbkNsb3NlUmVxdWVzdCgpO1xuICB9O1xuXG4gIHJldHVybiAoXG4gICAgPE1vZGFsXG4gICAgICBjbGFzc05hbWU9e2Nsc3goXCJEaWFsb2dcIiwgcHJvcHMuY2xhc3NOYW1lKX1cbiAgICAgIGxhYmVsbGVkQnk9XCJkaWFsb2ctdGl0bGVcIlxuICAgICAgbWF4V2lkdGg9e3Byb3BzLnNtYWxsID8gNTUwIDogODAwfVxuICAgICAgb25DbG9zZVJlcXVlc3Q9e29uQ2xvc2V9XG4gICAgICB0aGVtZT17cHJvcHMudGhlbWV9XG4gICAgICBjbG9zZU9uQ2xpY2tPdXRzaWRlPXtwcm9wcy5jbG9zZU9uQ2xpY2tPdXRzaWRlfVxuICAgID5cbiAgICAgIDxJc2xhbmQgcmVmPXtzZXRJc2xhbmROb2RlfT5cbiAgICAgICAgPGgyIGlkPXtgJHtpZH0tZGlhbG9nLXRpdGxlYH0gY2xhc3NOYW1lPVwiRGlhbG9nX190aXRsZVwiPlxuICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cIkRpYWxvZ19fdGl0bGVDb250ZW50XCI+e3Byb3BzLnRpdGxlfTwvc3Bhbj5cbiAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICBjbGFzc05hbWU9XCJNb2RhbF9fY2xvc2VcIlxuICAgICAgICAgICAgb25DbGljaz17b25DbG9zZX1cbiAgICAgICAgICAgIGFyaWEtbGFiZWw9e3QoXCJidXR0b25zLmNsb3NlXCIpfVxuICAgICAgICAgID5cbiAgICAgICAgICAgIHt1c2VEZXZpY2UoKS5pc01vYmlsZSA/IGJhY2sgOiBjbG9zZX1cbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPC9oMj5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJEaWFsb2dfX2NvbnRlbnRcIj57cHJvcHMuY2hpbGRyZW59PC9kaXY+XG4gICAgICA8L0lzbGFuZD5cbiAgICA8L01vZGFsPlxuICApO1xufTtcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///../../components/Dialog.tsx\n");
|
|
2252
|
+
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"Dialog\": () => (/* binding */ Dialog)\n/* harmony export */ });\n/* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react/jsx-runtime */ \"../../../node_modules/react/jsx-runtime.js\");\n/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! clsx */ \"../../../node_modules/clsx/dist/clsx.m.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react */ \"react\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var _hooks_useCallbackRefState__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../hooks/useCallbackRefState */ \"../../hooks/useCallbackRefState.ts\");\n/* harmony import */ var _i18n__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../i18n */ \"../../i18n.ts\");\n/* harmony import */ var _components_App__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../components/App */ \"../../components/App.tsx\");\n/* harmony import */ var _keys__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../keys */ \"../../keys.ts\");\n/* harmony import */ var _Dialog_scss__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./Dialog.scss */ \"../../components/Dialog.scss\");\n/* harmony import */ var _Dialog_scss__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(_Dialog_scss__WEBPACK_IMPORTED_MODULE_7__);\n/* harmony import */ var _icons__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./icons */ \"../../components/icons.tsx\");\n/* harmony import */ var _Island__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./Island */ \"../../components/Island.tsx\");\n/* harmony import */ var _Modal__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./Modal */ \"../../components/Modal.tsx\");\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../utils */ \"../../utils.ts\");\n\n\n\n\n\n\n\n\n\n\n\n\nconst Dialog = (props) => {\n const [islandNode, setIslandNode] = (0,_hooks_useCallbackRefState__WEBPACK_IMPORTED_MODULE_3__.useCallbackRefState)();\n const [lastActiveElement] = (0,react__WEBPACK_IMPORTED_MODULE_2__.useState)(document.activeElement);\n const { id } = (0,_components_App__WEBPACK_IMPORTED_MODULE_5__.useExcalidrawContainer)();\n (0,react__WEBPACK_IMPORTED_MODULE_2__.useEffect)(() => {\n if (!islandNode) {\n return;\n }\n const focusableElements = (0,_utils__WEBPACK_IMPORTED_MODULE_11__.queryFocusableElements)(islandNode);\n if (focusableElements.length > 0 && props.autofocus !== false) {\n // If there's an element other than close, focus it.\n (focusableElements[1] || focusableElements[0]).focus();\n }\n const handleKeyDown = (event) => {\n if (event.key === _keys__WEBPACK_IMPORTED_MODULE_6__.KEYS.TAB) {\n const focusableElements = (0,_utils__WEBPACK_IMPORTED_MODULE_11__.queryFocusableElements)(islandNode);\n const { activeElement } = document;\n const currentIndex = focusableElements.findIndex((element) => element === activeElement);\n if (currentIndex === 0 && event.shiftKey) {\n focusableElements[focusableElements.length - 1].focus();\n event.preventDefault();\n }\n else if (currentIndex === focusableElements.length - 1 &&\n !event.shiftKey) {\n focusableElements[0].focus();\n event.preventDefault();\n }\n }\n };\n islandNode.addEventListener(\"keydown\", handleKeyDown);\n return () => islandNode.removeEventListener(\"keydown\", handleKeyDown);\n }, [islandNode, props.autofocus]);\n const onClose = () => {\n lastActiveElement.focus();\n props.onCloseRequest();\n };\n return ((0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_Modal__WEBPACK_IMPORTED_MODULE_10__.Modal, Object.assign({ className: (0,clsx__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(\"Dialog\", props.className), labelledBy: \"dialog-title\", maxWidth: props.small ? 550 : 800, onCloseRequest: onClose, theme: props.theme, closeOnClickOutside: props.closeOnClickOutside }, { children: (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)(_Island__WEBPACK_IMPORTED_MODULE_9__.Island, Object.assign({ ref: setIslandNode }, { children: [(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)(\"h2\", Object.assign({ id: `${id}-dialog-title`, className: \"Dialog__title\" }, { children: [(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(\"span\", Object.assign({ className: \"Dialog__titleContent\" }, { children: props.title })), (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(\"button\", Object.assign({ className: \"Modal__close\", onClick: onClose, title: (0,_i18n__WEBPACK_IMPORTED_MODULE_4__.t)(\"buttons.close\"), \"aria-label\": (0,_i18n__WEBPACK_IMPORTED_MODULE_4__.t)(\"buttons.close\") }, { children: (0,_components_App__WEBPACK_IMPORTED_MODULE_5__.useDevice)().isMobile ? _icons__WEBPACK_IMPORTED_MODULE_8__.back : _icons__WEBPACK_IMPORTED_MODULE_8__.close }))] })), (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(\"div\", Object.assign({ className: \"Dialog__content\" }, { children: props.children }))] })) })));\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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SyxFQUNsQixtQkFBbUIsRUFBRSxLQUFLLENBQUMsbUJBQW1CLGdCQUU5Qyx3REFBQywyQ0FBTSxrQkFBQyxHQUFHLEVBQUUsYUFBYSxpQkFDeEIsOEVBQUksRUFBRSxFQUFFLEdBQUcsRUFBRSxlQUFlLEVBQUUsU0FBUyxFQUFDLGVBQWUsaUJBQ3JELCtFQUFNLFNBQVMsRUFBQyxzQkFBc0IsZ0JBQUUsS0FBSyxDQUFDLEtBQUssSUFBUSxFQUMzRCxpRkFDRSxTQUFTLEVBQUMsY0FBYyxFQUN4QixPQUFPLEVBQUUsT0FBTyxFQUNoQixLQUFLLEVBQUUsd0NBQUMsQ0FBQyxlQUFlLENBQUMsZ0JBQ2Isd0NBQUMsQ0FBQyxlQUFlLENBQUMsZ0JBRTdCLDBEQUFTLEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLHdDQUFJLENBQUMsQ0FBQyxDQUFDLHlDQUFLLElBQzdCLEtBQ04sRUFDTCw4RUFBSyxTQUFTLEVBQUMsaUJBQWlCLGdCQUFFLEtBQUssQ0FBQyxRQUFRLElBQU8sS0FDaEQsSUFDSCxDQUNULENBQUM7QUFDSixDQUFDLENBQUMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi4vLi4vY29tcG9uZW50cy9EaWFsb2cudHN4PzBkN2MiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGNsc3ggZnJvbSBcImNsc3hcIjtcbmltcG9ydCBSZWFjdCwgeyB1c2VFZmZlY3QsIHVzZVN0YXRlIH0gZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgeyB1c2VDYWxsYmFja1JlZlN0YXRlIH0gZnJvbSBcIi4uL2hvb2tzL3VzZUNhbGxiYWNrUmVmU3RhdGVcIjtcbmltcG9ydCB7IHQgfSBmcm9tIFwiLi4vaTE4blwiO1xuaW1wb3J0IHsgdXNlRXhjYWxpZHJhd0NvbnRhaW5lciwgdXNlRGV2aWNlIH0gZnJvbSBcIi4uL2NvbXBvbmVudHMvQXBwXCI7XG5pbXBvcnQgeyBLRVlTIH0gZnJvbSBcIi4uL2tleXNcIjtcbmltcG9ydCBcIi4vRGlhbG9nLnNjc3NcIjtcbmltcG9ydCB7IGJhY2ssIGNsb3NlIH0gZnJvbSBcIi4vaWNvbnNcIjtcbmltcG9ydCB7IElzbGFuZCB9IGZyb20gXCIuL0lzbGFuZFwiO1xuaW1wb3J0IHsgTW9kYWwgfSBmcm9tIFwiLi9Nb2RhbFwiO1xuaW1wb3J0IHsgQXBwU3RhdGUgfSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7IHF1ZXJ5Rm9jdXNhYmxlRWxlbWVudHMgfSBmcm9tIFwiLi4vdXRpbHNcIjtcblxuZXhwb3J0IGludGVyZmFjZSBEaWFsb2dQcm9wcyB7XG4gIGNoaWxkcmVuOiBSZWFjdC5SZWFjdE5vZGU7XG4gIGNsYXNzTmFtZT86IHN0cmluZztcbiAgc21hbGw/OiBib29sZWFuO1xuICBvbkNsb3NlUmVxdWVzdCgpOiB2b2lkO1xuICB0aXRsZTogUmVhY3QuUmVhY3ROb2RlO1xuICBhdXRvZm9jdXM/OiBib29sZWFuO1xuICB0aGVtZT86IEFwcFN0YXRlW1widGhlbWVcIl07XG4gIGNsb3NlT25DbGlja091dHNpZGU/OiBib29sZWFuO1xufVxuXG5leHBvcnQgY29uc3QgRGlhbG9nID0gKHByb3BzOiBEaWFsb2dQcm9wcykgPT4ge1xuICBjb25zdCBbaXNsYW5kTm9kZSwgc2V0SXNsYW5kTm9kZV0gPSB1c2VDYWxsYmFja1JlZlN0YXRlPEhUTUxEaXZFbGVtZW50PigpO1xuICBjb25zdCBbbGFzdEFjdGl2ZUVsZW1lbnRdID0gdXNlU3RhdGUoZG9jdW1lbnQuYWN0aXZlRWxlbWVudCk7XG4gIGNvbnN0IHsgaWQgfSA9IHVzZUV4Y2FsaWRyYXdDb250YWluZXIoKTtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmICghaXNsYW5kTm9kZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGZvY3VzYWJsZUVsZW1lbnRzID0gcXVlcnlGb2N1c2FibGVFbGVtZW50cyhpc2xhbmROb2RlKTtcblxuICAgIGlmIChmb2N1c2FibGVFbGVtZW50cy5sZW5ndGggPiAwICYmIHByb3BzLmF1dG9mb2N1cyAhPT0gZmFsc2UpIHtcbiAgICAgIC8vIElmIHRoZXJlJ3MgYW4gZWxlbWVudCBvdGhlciB0aGFuIGNsb3NlLCBmb2N1cyBpdC5cbiAgICAgIChmb2N1c2FibGVFbGVtZW50c1sxXSB8fCBmb2N1c2FibGVFbGVtZW50c1swXSkuZm9jdXMoKTtcbiAgICB9XG5cbiAgICBjb25zdCBoYW5kbGVLZXlEb3duID0gKGV2ZW50OiBLZXlib2FyZEV2ZW50KSA9PiB7XG4gICAgICBpZiAoZXZlbnQua2V5ID09PSBLRVlTLlRBQikge1xuICAgICAgICBjb25zdCBmb2N1c2FibGVFbGVtZW50cyA9IHF1ZXJ5Rm9jdXNhYmxlRWxlbWVudHMoaXNsYW5kTm9kZSk7XG4gICAgICAgIGNvbnN0IHsgYWN0aXZlRWxlbWVudCB9ID0gZG9jdW1lbnQ7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRJbmRleCA9IGZvY3VzYWJsZUVsZW1lbnRzLmZpbmRJbmRleChcbiAgICAgICAgICAoZWxlbWVudCkgPT4gZWxlbWVudCA9PT0gYWN0aXZlRWxlbWVudCxcbiAgICAgICAgKTtcblxuICAgICAgICBpZiAoY3VycmVudEluZGV4ID09PSAwICYmIGV2ZW50LnNoaWZ0S2V5KSB7XG4gICAgICAgICAgZm9jdXNhYmxlRWxlbWVudHNbZm9jdXNhYmxlRWxlbWVudHMubGVuZ3RoIC0gMV0uZm9jdXMoKTtcbiAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgIGN1cnJlbnRJbmRleCA9PT0gZm9jdXNhYmxlRWxlbWVudHMubGVuZ3RoIC0gMSAmJlxuICAgICAgICAgICFldmVudC5zaGlmdEtleVxuICAgICAgICApIHtcbiAgICAgICAgICBmb2N1c2FibGVFbGVtZW50c1swXS5mb2N1cygpO1xuICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuXG4gICAgaXNsYW5kTm9kZS5hZGRFdmVudExpc3RlbmVyKFwia2V5ZG93blwiLCBoYW5kbGVLZXlEb3duKTtcblxuICAgIHJldHVybiAoKSA9PiBpc2xhbmROb2RlLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJrZXlkb3duXCIsIGhhbmRsZUtleURvd24pO1xuICB9LCBbaXNsYW5kTm9kZSwgcHJvcHMuYXV0b2ZvY3VzXSk7XG5cbiAgY29uc3Qgb25DbG9zZSA9ICgpID0+IHtcbiAgICAobGFzdEFjdGl2ZUVsZW1lbnQgYXMgSFRNTEVsZW1lbnQpLmZvY3VzKCk7XG4gICAgcHJvcHMub25DbG9zZVJlcXVlc3QoKTtcbiAgfTtcblxuICByZXR1cm4gKFxuICAgIDxNb2RhbFxuICAgICAgY2xhc3NOYW1lPXtjbHN4KFwiRGlhbG9nXCIsIHByb3BzLmNsYXNzTmFtZSl9XG4gICAgICBsYWJlbGxlZEJ5PVwiZGlhbG9nLXRpdGxlXCJcbiAgICAgIG1heFdpZHRoPXtwcm9wcy5zbWFsbCA/IDU1MCA6IDgwMH1cbiAgICAgIG9uQ2xvc2VSZXF1ZXN0PXtvbkNsb3NlfVxuICAgICAgdGhlbWU9e3Byb3BzLnRoZW1lfVxuICAgICAgY2xvc2VPbkNsaWNrT3V0c2lkZT17cHJvcHMuY2xvc2VPbkNsaWNrT3V0c2lkZX1cbiAgICA+XG4gICAgICA8SXNsYW5kIHJlZj17c2V0SXNsYW5kTm9kZX0+XG4gICAgICAgIDxoMiBpZD17YCR7aWR9LWRpYWxvZy10aXRsZWB9IGNsYXNzTmFtZT1cIkRpYWxvZ19fdGl0bGVcIj5cbiAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJEaWFsb2dfX3RpdGxlQ29udGVudFwiPntwcm9wcy50aXRsZX08L3NwYW4+XG4gICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgY2xhc3NOYW1lPVwiTW9kYWxfX2Nsb3NlXCJcbiAgICAgICAgICAgIG9uQ2xpY2s9e29uQ2xvc2V9XG4gICAgICAgICAgICB0aXRsZT17dChcImJ1dHRvbnMuY2xvc2VcIil9XG4gICAgICAgICAgICBhcmlhLWxhYmVsPXt0KFwiYnV0dG9ucy5jbG9zZVwiKX1cbiAgICAgICAgICA+XG4gICAgICAgICAgICB7dXNlRGV2aWNlKCkuaXNNb2JpbGUgPyBiYWNrIDogY2xvc2V9XG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDwvaDI+XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiRGlhbG9nX19jb250ZW50XCI+e3Byb3BzLmNoaWxkcmVufTwvZGl2PlxuICAgICAgPC9Jc2xhbmQ+XG4gICAgPC9Nb2RhbD5cbiAgKTtcbn07XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///../../components/Dialog.tsx\n");
|
|
2253
2253
|
|
|
2254
2254
|
/***/ }),
|
|
2255
2255
|
|
|
@@ -2491,7 +2491,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
|
|
|
2491
2491
|
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|
2492
2492
|
|
|
2493
2493
|
"use strict";
|
|
2494
|
-
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"Popover\": () => (/* binding */ Popover)\n/* harmony export */ });\n/* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react/jsx-runtime */ \"../../../node_modules/react/jsx-runtime.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ \"react\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _Popover_scss__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./Popover.scss */ \"../../components/Popover.scss\");\n/* harmony import */ var _Popover_scss__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_Popover_scss__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var react_dom__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react-dom */ \"react-dom\");\n/* harmony import */ var react_dom__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(react_dom__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../utils */ \"../../utils.ts\");\n/* harmony import */ var _keys__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../keys */ \"../../keys.ts\");\n\n\n\n\n\n\nconst Popover = ({ children, left, top, onCloseRequest, fitInViewport = false, offsetLeft = 0, offsetTop = 0, viewportWidth = window.innerWidth, viewportHeight = window.innerHeight, }) => {\n const popoverRef = (0,react__WEBPACK_IMPORTED_MODULE_1__.useRef)(null);\n const container = popoverRef.current;\n (0,react__WEBPACK_IMPORTED_MODULE_1__.useEffect)(() => {\n if (!container) {\n return;\n }\n const handleKeyDown = (event) => {\n if (event.key === _keys__WEBPACK_IMPORTED_MODULE_5__.KEYS.TAB) {\n const focusableElements = (0,_utils__WEBPACK_IMPORTED_MODULE_4__.queryFocusableElements)(container);\n const { activeElement } = document;\n const currentIndex = focusableElements.findIndex((element) => element === activeElement);\n if (currentIndex === 0 && event.shiftKey) {\n focusableElements[focusableElements.length - 1].focus();\n event.preventDefault();\n event.stopImmediatePropagation();\n }\n else if (currentIndex === focusableElements.length - 1 &&\n !event.shiftKey) {\n focusableElements[0].focus();\n event.preventDefault();\n event.stopImmediatePropagation();\n }\n }\n };\n container.addEventListener(\"keydown\", handleKeyDown);\n return () => container.removeEventListener(\"keydown\", handleKeyDown);\n }, [container]);\n // ensure the popover doesn't overflow the viewport\n (0,react__WEBPACK_IMPORTED_MODULE_1__.useLayoutEffect)(() => {\n if (fitInViewport && popoverRef.current) {\n const element = popoverRef.current;\n const { x, y, width, height } = element.getBoundingClientRect();\n const { innerWidth: viewportWidth, innerHeight: viewportHeight } = window;\n //Position correctly when clicked on rightmost part or the bottom part of viewport\n if (x + width - offsetLeft > viewportWidth) {\n element.style.left = `${viewportWidth - width - 10}px`;\n }\n if (y + height - offsetTop > viewportHeight) {\n element.style.top = `${viewportHeight - height}px`;\n }\n //Resize to fit viewport on smaller screens\n if (height >= viewportHeight) {\n element.style.height = `${viewportHeight - 20}px`;\n element.style.top = \"10px\";\n element.style.overflowY = \"scroll\";\n }\n if (width >= viewportWidth) {\n element.style.width = `${viewportWidth}px`;\n element.style.left = \"0px\";\n element.style.overflowX = \"scroll\";\n }\n }\n }, [fitInViewport, viewportWidth, viewportHeight, offsetLeft, offsetTop]);\n (0,react__WEBPACK_IMPORTED_MODULE_1__.useEffect)(() => {\n if (onCloseRequest) {\n const handler = (event) => {\n var _a;\n if (!((_a = popoverRef.current) === null || _a === void 0 ? void 0 : _a.contains(event.target))) {\n (0,react_dom__WEBPACK_IMPORTED_MODULE_3__.unstable_batchedUpdates)(() => onCloseRequest(event));\n }\n };\n document.addEventListener(\"pointerdown\", handler, false);\n return () => document.removeEventListener(\"pointerdown\", handler, false);\n }\n }, [onCloseRequest]);\n return ((0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(\"div\", Object.assign({ className: \"popover\", style: { top, left }, ref: popoverRef }, { children: children })));\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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QUFDLG1CQUFtQixDQUFDLGFBQWEsRUFBRSxPQUFPLEVBQUUsS0FBSyxDQUFDLENBQUM7U0FDMUU7SUFDSCxDQUFDLEVBQUUsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDO0lBRXJCLE9BQU8sQ0FDTCw4RUFBSyxTQUFTLEVBQUMsU0FBUyxFQUFDLEtBQUssRUFBRSxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsRUFBRSxHQUFHLEVBQUUsVUFBVSxnQkFDM0QsUUFBUSxJQUNMLENBQ1AsQ0FBQztBQUNKLENBQUMsQ0FBQyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uLi8uLi9jb21wb25lbnRzL1BvcG92ZXIudHN4PzA0YWQiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFJlYWN0LCB7IHVzZUxheW91dEVmZmVjdCwgdXNlUmVmLCB1c2VFZmZlY3QgfSBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCBcIi4vUG9wb3Zlci5zY3NzXCI7XG5pbXBvcnQgeyB1bnN0YWJsZV9iYXRjaGVkVXBkYXRlcyB9IGZyb20gXCJyZWFjdC1kb21cIjtcbmltcG9ydCB7IHF1ZXJ5Rm9jdXNhYmxlRWxlbWVudHMgfSBmcm9tIFwiLi4vdXRpbHNcIjtcbmltcG9ydCB7IEtFWVMgfSBmcm9tIFwiLi4va2V5c1wiO1xuXG50eXBlIFByb3BzID0ge1xuICB0b3A/OiBudW1iZXI7XG4gIGxlZnQ/OiBudW1iZXI7XG4gIGNoaWxkcmVuPzogUmVhY3QuUmVhY3ROb2RlO1xuICBvbkNsb3NlUmVxdWVzdD8oZXZlbnQ6IFBvaW50ZXJFdmVudCk6IHZvaWQ7XG4gIGZpdEluVmlld3BvcnQ/OiBib29sZWFuO1xuICBvZmZzZXRMZWZ0PzogbnVtYmVyO1xuICBvZmZzZXRUb3A/OiBudW1iZXI7XG4gIHZpZXdwb3J0V2lkdGg/OiBudW1iZXI7XG4gIHZpZXdwb3J0SGVpZ2h0PzogbnVtYmVyO1xufTtcblxuZXhwb3J0IGNvbnN0IFBvcG92ZXIgPSAoe1xuICBjaGlsZHJlbixcbiAgbGVmdCxcbiAgdG9wLFxuICBvbkNsb3NlUmVxdWVzdCxcbiAgZml0SW5WaWV3cG9ydCA9IGZhbHNlLFxuICBvZmZzZXRMZWZ0ID0gMCxcbiAgb2Zmc2V0VG9wID0gMCxcbiAgdmlld3BvcnRXaWR0aCA9IHdpbmRvdy5pbm5lcldpZHRoLFxuICB2aWV3cG9ydEhlaWdodCA9IHdpbmRvdy5pbm5lckhlaWdodCxcbn06IFByb3BzKSA9PiB7XG4gIGNvbnN0IHBvcG92ZXJSZWYgPSB1c2VSZWY8SFRNTERpdkVsZW1lbnQ+KG51bGwpO1xuXG4gIGNvbnN0IGNvbnRhaW5lciA9IHBvcG92ZXJSZWYuY3VycmVudDtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmICghY29udGFpbmVyKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgaGFuZGxlS2V5RG93biA9IChldmVudDogS2V5Ym9hcmRFdmVudCkgPT4ge1xuICAgICAgaWYgKGV2ZW50LmtleSA9PT0gS0VZUy5UQUIpIHtcbiAgICAgICAgY29uc3QgZm9jdXNhYmxlRWxlbWVudHMgPSBxdWVyeUZvY3VzYWJsZUVsZW1lbnRzKGNvbnRhaW5lcik7XG4gICAgICAgIGNvbnN0IHsgYWN0aXZlRWxlbWVudCB9ID0gZG9jdW1lbnQ7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRJbmRleCA9IGZvY3VzYWJsZUVsZW1lbnRzLmZpbmRJbmRleChcbiAgICAgICAgICAoZWxlbWVudCkgPT4gZWxlbWVudCA9PT0gYWN0aXZlRWxlbWVudCxcbiAgICAgICAgKTtcblxuICAgICAgICBpZiAoY3VycmVudEluZGV4ID09PSAwICYmIGV2ZW50LnNoaWZ0S2V5KSB7XG4gICAgICAgICAgZm9jdXNhYmxlRWxlbWVudHNbZm9jdXNhYmxlRWxlbWVudHMubGVuZ3RoIC0gMV0uZm9jdXMoKTtcbiAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgIGV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xuICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgIGN1cnJlbnRJbmRleCA9PT0gZm9jdXNhYmxlRWxlbWVudHMubGVuZ3RoIC0gMSAmJlxuICAgICAgICAgICFldmVudC5zaGlmdEtleVxuICAgICAgICApIHtcbiAgICAgICAgICBmb2N1c2FibGVFbGVtZW50c1swXS5mb2N1cygpO1xuICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuXG4gICAgY29udGFpbmVyLmFkZEV2ZW50TGlzdGVuZXIoXCJrZXlkb3duXCIsIGhhbmRsZUtleURvd24pO1xuXG4gICAgcmV0dXJuICgpID0+IGNvbnRhaW5lci5yZW1vdmVFdmVudExpc3RlbmVyKFwia2V5ZG93blwiLCBoYW5kbGVLZXlEb3duKTtcbiAgfSwgW2NvbnRhaW5lcl0pO1xuXG4gIC8vIGVuc3VyZSB0aGUgcG9wb3ZlciBkb2Vzbid0IG92ZXJmbG93IHRoZSB2aWV3cG9ydFxuICB1c2VMYXlvdXRFZmZlY3QoKCkgPT4ge1xuICAgIGlmIChmaXRJblZpZXdwb3J0ICYmIHBvcG92ZXJSZWYuY3VycmVudCkge1xuICAgICAgY29uc3QgZWxlbWVudCA9IHBvcG92ZXJSZWYuY3VycmVudDtcbiAgICAgIGNvbnN0IHsgeCwgeSwgd2lkdGgsIGhlaWdodCB9ID0gZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgIGNvbnN0IHsgaW5uZXJXaWR0aDogdmlld3BvcnRXaWR0aCwgaW5uZXJIZWlnaHQ6IHZpZXdwb3J0SGVpZ2h0IH0gPSB3aW5kb3c7XG5cbiAgICAgIC8vUG9zaXRpb24gY29ycmVjdGx5IHdoZW4gY2xpY2tlZCBvbiByaWdodG1vc3QgcGFydCBvciB0aGUgYm90dG9tIHBhcnQgb2Ygdmlld3BvcnRcbiAgICAgIGlmICh4ICsgd2lkdGggLSBvZmZzZXRMZWZ0ID4gdmlld3BvcnRXaWR0aCkge1xuICAgICAgICBlbGVtZW50LnN0eWxlLmxlZnQgPSBgJHt2aWV3cG9ydFdpZHRoIC0gd2lkdGggLSAxMH1weGA7XG4gICAgICB9XG4gICAgICBpZiAoeSArIGhlaWdodCAtIG9mZnNldFRvcCA+IHZpZXdwb3J0SGVpZ2h0KSB7XG4gICAgICAgIGVsZW1lbnQuc3R5bGUudG9wID0gYCR7dmlld3BvcnRIZWlnaHQgLSBoZWlnaHR9cHhgO1xuICAgICAgfVxuXG4gICAgICAvL1Jlc2l6ZSB0byBmaXQgdmlld3BvcnQgb24gc21hbGxlciBzY3JlZW5zXG4gICAgICBpZiAoaGVpZ2h0ID49IHZpZXdwb3J0SGVpZ2h0KSB7XG4gICAgICAgIGVsZW1lbnQuc3R5bGUuaGVpZ2h0ID0gYCR7dmlld3BvcnRIZWlnaHQgLSAyMH1weGA7XG4gICAgICAgIGVsZW1lbnQuc3R5bGUudG9wID0gXCIxMHB4XCI7XG4gICAgICAgIGVsZW1lbnQuc3R5bGUub3ZlcmZsb3dZID0gXCJzY3JvbGxcIjtcbiAgICAgIH1cbiAgICAgIGlmICh3aWR0aCA+PSB2aWV3cG9ydFdpZHRoKSB7XG4gICAgICAgIGVsZW1lbnQuc3R5bGUud2lkdGggPSBgJHt2aWV3cG9ydFdpZHRofXB4YDtcbiAgICAgICAgZWxlbWVudC5zdHlsZS5sZWZ0ID0gXCIwcHhcIjtcbiAgICAgICAgZWxlbWVudC5zdHlsZS5vdmVyZmxvd1ggPSBcInNjcm9sbFwiO1xuICAgICAgfVxuICAgIH1cbiAgfSwgW2ZpdEluVmlld3BvcnQsIHZpZXdwb3J0V2lkdGgsIHZpZXdwb3J0SGVpZ2h0LCBvZmZzZXRMZWZ0LCBvZmZzZXRUb3BdKTtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmIChvbkNsb3NlUmVxdWVzdCkge1xuICAgICAgY29uc3QgaGFuZGxlciA9IChldmVudDogUG9pbnRlckV2ZW50KSA9PiB7XG4gICAgICAgIGlmICghcG9wb3ZlclJlZi5jdXJyZW50Py5jb250YWlucyhldmVudC50YXJnZXQgYXMgTm9kZSkpIHtcbiAgICAgICAgICB1bnN0YWJsZV9iYXRjaGVkVXBkYXRlcygoKSA9PiBvbkNsb3NlUmVxdWVzdChldmVudCkpO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcInBvaW50ZXJkb3duXCIsIGhhbmRsZXIsIGZhbHNlKTtcbiAgICAgIHJldHVybiAoKSA9PiBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFwicG9pbnRlcmRvd25cIiwgaGFuZGxlciwgZmFsc2UpO1xuICAgIH1cbiAgfSwgW29uQ2xvc2VSZXF1ZXN0XSk7XG5cbiAgcmV0dXJuIChcbiAgICA8ZGl2IGNsYXNzTmFtZT1cInBvcG92ZXJcIiBzdHlsZT17eyB0b3AsIGxlZnQgfX0gcmVmPXtwb3BvdmVyUmVmfT5cbiAgICAgIHtjaGlsZHJlbn1cbiAgICA8L2Rpdj5cbiAgKTtcbn07XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///../../components/Popover.tsx\n");
|
|
2494
|
+
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"Popover\": () => (/* binding */ Popover)\n/* harmony export */ });\n/* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react/jsx-runtime */ \"../../../node_modules/react/jsx-runtime.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ \"react\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _Popover_scss__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./Popover.scss */ \"../../components/Popover.scss\");\n/* harmony import */ var _Popover_scss__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_Popover_scss__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var react_dom__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react-dom */ \"react-dom\");\n/* harmony import */ var react_dom__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(react_dom__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../utils */ \"../../utils.ts\");\n/* harmony import */ var _keys__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../keys */ \"../../keys.ts\");\n\n\n\n\n\n\nconst Popover = ({ children, left, top, onCloseRequest, fitInViewport = false, offsetLeft = 0, offsetTop = 0, viewportWidth = window.innerWidth, viewportHeight = window.innerHeight, }) => {\n const popoverRef = (0,react__WEBPACK_IMPORTED_MODULE_1__.useRef)(null);\n const container = popoverRef.current;\n (0,react__WEBPACK_IMPORTED_MODULE_1__.useEffect)(() => {\n if (!container) {\n return;\n }\n const handleKeyDown = (event) => {\n if (event.key === _keys__WEBPACK_IMPORTED_MODULE_5__.KEYS.TAB) {\n const focusableElements = (0,_utils__WEBPACK_IMPORTED_MODULE_4__.queryFocusableElements)(container);\n const { activeElement } = document;\n const currentIndex = focusableElements.findIndex((element) => element === activeElement);\n if (currentIndex === 0 && event.shiftKey) {\n focusableElements[focusableElements.length - 1].focus();\n event.preventDefault();\n event.stopImmediatePropagation();\n }\n else if (currentIndex === focusableElements.length - 1 &&\n !event.shiftKey) {\n focusableElements[0].focus();\n event.preventDefault();\n event.stopImmediatePropagation();\n }\n }\n };\n container.addEventListener(\"keydown\", handleKeyDown);\n return () => container.removeEventListener(\"keydown\", handleKeyDown);\n }, [container]);\n // ensure the popover doesn't overflow the viewport\n (0,react__WEBPACK_IMPORTED_MODULE_1__.useLayoutEffect)(() => {\n if (fitInViewport && popoverRef.current) {\n const element = popoverRef.current;\n const { x, y, width, height } = element.getBoundingClientRect();\n //Position correctly when clicked on rightmost part or the bottom part of viewport\n if (x + width - offsetLeft > viewportWidth) {\n element.style.left = `${viewportWidth - width - 10}px`;\n }\n if (y + height - offsetTop > viewportHeight) {\n element.style.top = `${viewportHeight - height}px`;\n }\n //Resize to fit viewport on smaller screens\n if (height >= viewportHeight) {\n element.style.height = `${viewportHeight - 20}px`;\n element.style.top = \"10px\";\n element.style.overflowY = \"scroll\";\n }\n if (width >= viewportWidth) {\n element.style.width = `${viewportWidth}px`;\n element.style.left = \"0px\";\n element.style.overflowX = \"scroll\";\n }\n }\n }, [fitInViewport, viewportWidth, viewportHeight, offsetLeft, offsetTop]);\n (0,react__WEBPACK_IMPORTED_MODULE_1__.useEffect)(() => {\n if (onCloseRequest) {\n const handler = (event) => {\n var _a;\n if (!((_a = popoverRef.current) === null || _a === void 0 ? void 0 : _a.contains(event.target))) {\n (0,react_dom__WEBPACK_IMPORTED_MODULE_3__.unstable_batchedUpdates)(() => onCloseRequest(event));\n }\n };\n document.addEventListener(\"pointerdown\", handler, false);\n return () => document.removeEventListener(\"pointerdown\", handler, false);\n }\n }, [onCloseRequest]);\n return ((0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(\"div\", Object.assign({ className: \"popover\", style: { top, left }, ref: popoverRef }, { children: children })));\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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LENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQztJQUVyQixPQUFPLENBQ0wsOEVBQUssU0FBUyxFQUFDLFNBQVMsRUFBQyxLQUFLLEVBQUUsRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLEVBQUUsR0FBRyxFQUFFLFVBQVUsZ0JBQzNELFFBQVEsSUFDTCxDQUNQLENBQUM7QUFDSixDQUFDLENBQUMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi4vLi4vY29tcG9uZW50cy9Qb3BvdmVyLnRzeD8wNGFkIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBSZWFjdCwgeyB1c2VMYXlvdXRFZmZlY3QsIHVzZVJlZiwgdXNlRWZmZWN0IH0gZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgXCIuL1BvcG92ZXIuc2Nzc1wiO1xuaW1wb3J0IHsgdW5zdGFibGVfYmF0Y2hlZFVwZGF0ZXMgfSBmcm9tIFwicmVhY3QtZG9tXCI7XG5pbXBvcnQgeyBxdWVyeUZvY3VzYWJsZUVsZW1lbnRzIH0gZnJvbSBcIi4uL3V0aWxzXCI7XG5pbXBvcnQgeyBLRVlTIH0gZnJvbSBcIi4uL2tleXNcIjtcblxudHlwZSBQcm9wcyA9IHtcbiAgdG9wPzogbnVtYmVyO1xuICBsZWZ0PzogbnVtYmVyO1xuICBjaGlsZHJlbj86IFJlYWN0LlJlYWN0Tm9kZTtcbiAgb25DbG9zZVJlcXVlc3Q/KGV2ZW50OiBQb2ludGVyRXZlbnQpOiB2b2lkO1xuICBmaXRJblZpZXdwb3J0PzogYm9vbGVhbjtcbiAgb2Zmc2V0TGVmdD86IG51bWJlcjtcbiAgb2Zmc2V0VG9wPzogbnVtYmVyO1xuICB2aWV3cG9ydFdpZHRoPzogbnVtYmVyO1xuICB2aWV3cG9ydEhlaWdodD86IG51bWJlcjtcbn07XG5cbmV4cG9ydCBjb25zdCBQb3BvdmVyID0gKHtcbiAgY2hpbGRyZW4sXG4gIGxlZnQsXG4gIHRvcCxcbiAgb25DbG9zZVJlcXVlc3QsXG4gIGZpdEluVmlld3BvcnQgPSBmYWxzZSxcbiAgb2Zmc2V0TGVmdCA9IDAsXG4gIG9mZnNldFRvcCA9IDAsXG4gIHZpZXdwb3J0V2lkdGggPSB3aW5kb3cuaW5uZXJXaWR0aCxcbiAgdmlld3BvcnRIZWlnaHQgPSB3aW5kb3cuaW5uZXJIZWlnaHQsXG59OiBQcm9wcykgPT4ge1xuICBjb25zdCBwb3BvdmVyUmVmID0gdXNlUmVmPEhUTUxEaXZFbGVtZW50PihudWxsKTtcblxuICBjb25zdCBjb250YWluZXIgPSBwb3BvdmVyUmVmLmN1cnJlbnQ7XG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAoIWNvbnRhaW5lcikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGhhbmRsZUtleURvd24gPSAoZXZlbnQ6IEtleWJvYXJkRXZlbnQpID0+IHtcbiAgICAgIGlmIChldmVudC5rZXkgPT09IEtFWVMuVEFCKSB7XG4gICAgICAgIGNvbnN0IGZvY3VzYWJsZUVsZW1lbnRzID0gcXVlcnlGb2N1c2FibGVFbGVtZW50cyhjb250YWluZXIpO1xuICAgICAgICBjb25zdCB7IGFjdGl2ZUVsZW1lbnQgfSA9IGRvY3VtZW50O1xuICAgICAgICBjb25zdCBjdXJyZW50SW5kZXggPSBmb2N1c2FibGVFbGVtZW50cy5maW5kSW5kZXgoXG4gICAgICAgICAgKGVsZW1lbnQpID0+IGVsZW1lbnQgPT09IGFjdGl2ZUVsZW1lbnQsXG4gICAgICAgICk7XG5cbiAgICAgICAgaWYgKGN1cnJlbnRJbmRleCA9PT0gMCAmJiBldmVudC5zaGlmdEtleSkge1xuICAgICAgICAgIGZvY3VzYWJsZUVsZW1lbnRzW2ZvY3VzYWJsZUVsZW1lbnRzLmxlbmd0aCAtIDFdLmZvY3VzKCk7XG4gICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICBldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcbiAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICBjdXJyZW50SW5kZXggPT09IGZvY3VzYWJsZUVsZW1lbnRzLmxlbmd0aCAtIDEgJiZcbiAgICAgICAgICAhZXZlbnQuc2hpZnRLZXlcbiAgICAgICAgKSB7XG4gICAgICAgICAgZm9jdXNhYmxlRWxlbWVudHNbMF0uZm9jdXMoKTtcbiAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgIGV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcblxuICAgIGNvbnRhaW5lci5hZGRFdmVudExpc3RlbmVyKFwia2V5ZG93blwiLCBoYW5kbGVLZXlEb3duKTtcblxuICAgIHJldHVybiAoKSA9PiBjb250YWluZXIucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImtleWRvd25cIiwgaGFuZGxlS2V5RG93bik7XG4gIH0sIFtjb250YWluZXJdKTtcblxuICAvLyBlbnN1cmUgdGhlIHBvcG92ZXIgZG9lc24ndCBvdmVyZmxvdyB0aGUgdmlld3BvcnRcbiAgdXNlTGF5b3V0RWZmZWN0KCgpID0+IHtcbiAgICBpZiAoZml0SW5WaWV3cG9ydCAmJiBwb3BvdmVyUmVmLmN1cnJlbnQpIHtcbiAgICAgIGNvbnN0IGVsZW1lbnQgPSBwb3BvdmVyUmVmLmN1cnJlbnQ7XG4gICAgICBjb25zdCB7IHgsIHksIHdpZHRoLCBoZWlnaHQgfSA9IGVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG5cbiAgICAgIC8vUG9zaXRpb24gY29ycmVjdGx5IHdoZW4gY2xpY2tlZCBvbiByaWdodG1vc3QgcGFydCBvciB0aGUgYm90dG9tIHBhcnQgb2Ygdmlld3BvcnRcbiAgICAgIGlmICh4ICsgd2lkdGggLSBvZmZzZXRMZWZ0ID4gdmlld3BvcnRXaWR0aCkge1xuICAgICAgICBlbGVtZW50LnN0eWxlLmxlZnQgPSBgJHt2aWV3cG9ydFdpZHRoIC0gd2lkdGggLSAxMH1weGA7XG4gICAgICB9XG4gICAgICBpZiAoeSArIGhlaWdodCAtIG9mZnNldFRvcCA+IHZpZXdwb3J0SGVpZ2h0KSB7XG4gICAgICAgIGVsZW1lbnQuc3R5bGUudG9wID0gYCR7dmlld3BvcnRIZWlnaHQgLSBoZWlnaHR9cHhgO1xuICAgICAgfVxuXG4gICAgICAvL1Jlc2l6ZSB0byBmaXQgdmlld3BvcnQgb24gc21hbGxlciBzY3JlZW5zXG4gICAgICBpZiAoaGVpZ2h0ID49IHZpZXdwb3J0SGVpZ2h0KSB7XG4gICAgICAgIGVsZW1lbnQuc3R5bGUuaGVpZ2h0ID0gYCR7dmlld3BvcnRIZWlnaHQgLSAyMH1weGA7XG4gICAgICAgIGVsZW1lbnQuc3R5bGUudG9wID0gXCIxMHB4XCI7XG4gICAgICAgIGVsZW1lbnQuc3R5bGUub3ZlcmZsb3dZID0gXCJzY3JvbGxcIjtcbiAgICAgIH1cbiAgICAgIGlmICh3aWR0aCA+PSB2aWV3cG9ydFdpZHRoKSB7XG4gICAgICAgIGVsZW1lbnQuc3R5bGUud2lkdGggPSBgJHt2aWV3cG9ydFdpZHRofXB4YDtcbiAgICAgICAgZWxlbWVudC5zdHlsZS5sZWZ0ID0gXCIwcHhcIjtcbiAgICAgICAgZWxlbWVudC5zdHlsZS5vdmVyZmxvd1ggPSBcInNjcm9sbFwiO1xuICAgICAgfVxuICAgIH1cbiAgfSwgW2ZpdEluVmlld3BvcnQsIHZpZXdwb3J0V2lkdGgsIHZpZXdwb3J0SGVpZ2h0LCBvZmZzZXRMZWZ0LCBvZmZzZXRUb3BdKTtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmIChvbkNsb3NlUmVxdWVzdCkge1xuICAgICAgY29uc3QgaGFuZGxlciA9IChldmVudDogUG9pbnRlckV2ZW50KSA9PiB7XG4gICAgICAgIGlmICghcG9wb3ZlclJlZi5jdXJyZW50Py5jb250YWlucyhldmVudC50YXJnZXQgYXMgTm9kZSkpIHtcbiAgICAgICAgICB1bnN0YWJsZV9iYXRjaGVkVXBkYXRlcygoKSA9PiBvbkNsb3NlUmVxdWVzdChldmVudCkpO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcInBvaW50ZXJkb3duXCIsIGhhbmRsZXIsIGZhbHNlKTtcbiAgICAgIHJldHVybiAoKSA9PiBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFwicG9pbnRlcmRvd25cIiwgaGFuZGxlciwgZmFsc2UpO1xuICAgIH1cbiAgfSwgW29uQ2xvc2VSZXF1ZXN0XSk7XG5cbiAgcmV0dXJuIChcbiAgICA8ZGl2IGNsYXNzTmFtZT1cInBvcG92ZXJcIiBzdHlsZT17eyB0b3AsIGxlZnQgfX0gcmVmPXtwb3BvdmVyUmVmfT5cbiAgICAgIHtjaGlsZHJlbn1cbiAgICA8L2Rpdj5cbiAgKTtcbn07XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///../../components/Popover.tsx\n");
|
|
2495
2495
|
|
|
2496
2496
|
/***/ }),
|
|
2497
2497
|
|
|
@@ -3107,7 +3107,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
|
|
|
3107
3107
|
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|
3108
3108
|
|
|
3109
3109
|
"use strict";
|
|
3110
|
-
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"CODES\": () => (/* binding */ CODES),\n/* harmony export */ \"KEYS\": () => (/* binding */ KEYS),\n/* harmony export */ \"isAndroid\": () => (/* binding */ isAndroid),\n/* harmony export */ \"isArrowKey\": () => (/* binding */ isArrowKey),\n/* harmony export */ \"isDarwin\": () => (/* binding */ isDarwin),\n/* harmony export */ \"isWindows\": () => (/* binding */ isWindows),\n/* harmony export */ \"shouldMaintainAspectRatio\": () => (/* binding */ shouldMaintainAspectRatio),\n/* harmony export */ \"shouldResizeFromCenter\": () => (/* binding */ shouldResizeFromCenter),\n/* harmony export */ \"shouldRotateWithDiscreteAngle\": () => (/* binding */ shouldRotateWithDiscreteAngle)\n/* harmony export */ });\nconst isDarwin = /Mac|iPod|iPhone|iPad/.test(window.navigator.platform);\nconst isWindows = /^Win/.test(window.navigator.platform);\nconst isAndroid = /\\b(android)\\b/i.test(navigator.userAgent);\nconst CODES = {\n EQUAL: \"Equal\",\n MINUS: \"Minus\",\n NUM_ADD: \"NumpadAdd\",\n NUM_SUBTRACT: \"NumpadSubtract\",\n NUM_ZERO: \"Numpad0\",\n BRACKET_RIGHT: \"BracketRight\",\n BRACKET_LEFT: \"BracketLeft\",\n ONE: \"Digit1\",\n TWO: \"Digit2\",\n NINE: \"Digit9\",\n QUOTE: \"Quote\",\n ZERO: \"Digit0\",\n SLASH: \"Slash\",\n C: \"KeyC\",\n D: \"KeyD\",\n G: \"KeyG\",\n F: \"KeyF\",\n H: \"KeyH\",\n V: \"KeyV\",\n X: \"KeyX\",\n Z: \"KeyZ\",\n R: \"KeyR\",\n};\nconst KEYS = {\n ARROW_DOWN: \"ArrowDown\",\n ARROW_LEFT: \"ArrowLeft\",\n ARROW_RIGHT: \"ArrowRight\",\n ARROW_UP: \"ArrowUp\",\n BACKSPACE: \"Backspace\",\n ALT: \"Alt\",\n CTRL_OR_CMD: isDarwin ? \"metaKey\" : \"ctrlKey\",\n DELETE: \"Delete\",\n ENTER: \"Enter\",\n ESCAPE: \"Escape\",\n QUESTION_MARK: \"?\",\n SPACE: \" \",\n TAB: \"Tab\",\n CHEVRON_LEFT: \"<\",\n CHEVRON_RIGHT: \">\",\n PERIOD: \".\",\n COMMA: \",\",\n A: \"a\",\n D: \"d\",\n E: \"e\",\n G: \"g\",\n I: \"i\",\n L: \"l\",\n O: \"o\",\n P: \"p\",\n Q: \"q\",\n R: \"r\",\n S: \"s\",\n T: \"t\",\n V: \"v\",\n X: \"x\",\n Y: \"y\",\n Z: \"z\",\n K: \"k\",\n};\nconst isArrowKey = (key) => key === KEYS.ARROW_LEFT ||\n key === KEYS.ARROW_RIGHT ||\n key === KEYS.ARROW_DOWN ||\n key === KEYS.ARROW_UP;\nconst shouldResizeFromCenter = (event) => event.altKey;\nconst shouldMaintainAspectRatio = (event) => event.shiftKey;\nconst shouldRotateWithDiscreteAngle = (event) => event.shiftKey;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,
|
|
3110
|
+
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"CODES\": () => (/* binding */ CODES),\n/* harmony export */ \"KEYS\": () => (/* binding */ KEYS),\n/* harmony export */ \"isAndroid\": () => (/* binding */ isAndroid),\n/* harmony export */ \"isArrowKey\": () => (/* binding */ isArrowKey),\n/* harmony export */ \"isDarwin\": () => (/* binding */ isDarwin),\n/* harmony export */ \"isWindows\": () => (/* binding */ isWindows),\n/* harmony export */ \"shouldMaintainAspectRatio\": () => (/* binding */ shouldMaintainAspectRatio),\n/* harmony export */ \"shouldResizeFromCenter\": () => (/* binding */ shouldResizeFromCenter),\n/* harmony export */ \"shouldRotateWithDiscreteAngle\": () => (/* binding */ shouldRotateWithDiscreteAngle)\n/* harmony export */ });\nconst isDarwin = /Mac|iPod|iPhone|iPad/.test(window.navigator.platform);\nconst isWindows = /^Win/.test(window.navigator.platform);\nconst isAndroid = /\\b(android)\\b/i.test(navigator.userAgent);\nconst CODES = {\n EQUAL: \"Equal\",\n MINUS: \"Minus\",\n NUM_ADD: \"NumpadAdd\",\n NUM_SUBTRACT: \"NumpadSubtract\",\n NUM_ZERO: \"Numpad0\",\n BRACKET_RIGHT: \"BracketRight\",\n BRACKET_LEFT: \"BracketLeft\",\n ONE: \"Digit1\",\n TWO: \"Digit2\",\n NINE: \"Digit9\",\n QUOTE: \"Quote\",\n ZERO: \"Digit0\",\n SLASH: \"Slash\",\n C: \"KeyC\",\n D: \"KeyD\",\n G: \"KeyG\",\n F: \"KeyF\",\n H: \"KeyH\",\n V: \"KeyV\",\n X: \"KeyX\",\n Z: \"KeyZ\",\n R: \"KeyR\",\n};\nconst KEYS = {\n ARROW_DOWN: \"ArrowDown\",\n ARROW_LEFT: \"ArrowLeft\",\n ARROW_RIGHT: \"ArrowRight\",\n ARROW_UP: \"ArrowUp\",\n BACKSPACE: \"Backspace\",\n ALT: \"Alt\",\n CTRL_OR_CMD: isDarwin ? \"metaKey\" : \"ctrlKey\",\n DELETE: \"Delete\",\n ENTER: \"Enter\",\n ESCAPE: \"Escape\",\n QUESTION_MARK: \"?\",\n SPACE: \" \",\n TAB: \"Tab\",\n CHEVRON_LEFT: \"<\",\n CHEVRON_RIGHT: \">\",\n PERIOD: \".\",\n COMMA: \",\",\n A: \"a\",\n D: \"d\",\n E: \"e\",\n G: \"g\",\n I: \"i\",\n L: \"l\",\n O: \"o\",\n P: \"p\",\n Q: \"q\",\n R: \"r\",\n S: \"s\",\n T: \"t\",\n V: \"v\",\n X: \"x\",\n Y: \"y\",\n Z: \"z\",\n K: \"k\",\n};\nconst isArrowKey = (key) => key === KEYS.ARROW_LEFT ||\n key === KEYS.ARROW_RIGHT ||\n key === KEYS.ARROW_DOWN ||\n key === KEYS.ARROW_UP;\nconst shouldResizeFromCenter = (event) => event.altKey;\nconst shouldMaintainAspectRatio = (event) => event.shiftKey;\nconst shouldRotateWithDiscreteAngle = (event) => event.shiftKey;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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RSxFQUFFLENBQzdFLEtBQUssQ0FBQyxRQUFRLENBQUM7QUFFVixNQUFNLDZCQUE2QixHQUFHLENBQzNDLEtBQXlFLEVBQ3pFLEVBQUUsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4uLy4uL2tleXMudHM/MWE4MSJdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgY29uc3QgaXNEYXJ3aW4gPSAvTWFjfGlQb2R8aVBob25lfGlQYWQvLnRlc3Qod2luZG93Lm5hdmlnYXRvci5wbGF0Zm9ybSk7XG5leHBvcnQgY29uc3QgaXNXaW5kb3dzID0gL15XaW4vLnRlc3Qod2luZG93Lm5hdmlnYXRvci5wbGF0Zm9ybSk7XG5leHBvcnQgY29uc3QgaXNBbmRyb2lkID0gL1xcYihhbmRyb2lkKVxcYi9pLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCk7XG5cbmV4cG9ydCBjb25zdCBDT0RFUyA9IHtcbiAgRVFVQUw6IFwiRXF1YWxcIixcbiAgTUlOVVM6IFwiTWludXNcIixcbiAgTlVNX0FERDogXCJOdW1wYWRBZGRcIixcbiAgTlVNX1NVQlRSQUNUOiBcIk51bXBhZFN1YnRyYWN0XCIsXG4gIE5VTV9aRVJPOiBcIk51bXBhZDBcIixcbiAgQlJBQ0tFVF9SSUdIVDogXCJCcmFja2V0UmlnaHRcIixcbiAgQlJBQ0tFVF9MRUZUOiBcIkJyYWNrZXRMZWZ0XCIsXG4gIE9ORTogXCJEaWdpdDFcIixcbiAgVFdPOiBcIkRpZ2l0MlwiLFxuICBOSU5FOiBcIkRpZ2l0OVwiLFxuICBRVU9URTogXCJRdW90ZVwiLFxuICBaRVJPOiBcIkRpZ2l0MFwiLFxuICBTTEFTSDogXCJTbGFzaFwiLFxuICBDOiBcIktleUNcIixcbiAgRDogXCJLZXlEXCIsXG4gIEc6IFwiS2V5R1wiLFxuICBGOiBcIktleUZcIixcbiAgSDogXCJLZXlIXCIsXG4gIFY6IFwiS2V5VlwiLFxuICBYOiBcIktleVhcIixcbiAgWjogXCJLZXlaXCIsXG4gIFI6IFwiS2V5UlwiLFxufSBhcyBjb25zdDtcblxuZXhwb3J0IGNvbnN0IEtFWVMgPSB7XG4gIEFSUk9XX0RPV046IFwiQXJyb3dEb3duXCIsXG4gIEFSUk9XX0xFRlQ6IFwiQXJyb3dMZWZ0XCIsXG4gIEFSUk9XX1JJR0hUOiBcIkFycm93UmlnaHRcIixcbiAgQVJST1dfVVA6IFwiQXJyb3dVcFwiLFxuICBCQUNLU1BBQ0U6IFwiQmFja3NwYWNlXCIsXG4gIEFMVDogXCJBbHRcIixcbiAgQ1RSTF9PUl9DTUQ6IGlzRGFyd2luID8gXCJtZXRhS2V5XCIgOiBcImN0cmxLZXlcIixcbiAgREVMRVRFOiBcIkRlbGV0ZVwiLFxuICBFTlRFUjogXCJFbnRlclwiLFxuICBFU0NBUEU6IFwiRXNjYXBlXCIsXG4gIFFVRVNUSU9OX01BUks6IFwiP1wiLFxuICBTUEFDRTogXCIgXCIsXG4gIFRBQjogXCJUYWJcIixcbiAgQ0hFVlJPTl9MRUZUOiBcIjxcIixcbiAgQ0hFVlJPTl9SSUdIVDogXCI+XCIsXG4gIFBFUklPRDogXCIuXCIsXG4gIENPTU1BOiBcIixcIixcblxuICBBOiBcImFcIixcbiAgRDogXCJkXCIsXG4gIEU6IFwiZVwiLFxuICBHOiBcImdcIixcbiAgSTogXCJpXCIsXG4gIEw6IFwibFwiLFxuICBPOiBcIm9cIixcbiAgUDogXCJwXCIsXG4gIFE6IFwicVwiLFxuICBSOiBcInJcIixcbiAgUzogXCJzXCIsXG4gIFQ6IFwidFwiLFxuICBWOiBcInZcIixcbiAgWDogXCJ4XCIsXG4gIFk6IFwieVwiLFxuICBaOiBcInpcIixcbiAgSzogXCJrXCIsXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgdHlwZSBLZXkgPSBrZXlvZiB0eXBlb2YgS0VZUztcblxuZXhwb3J0IGNvbnN0IGlzQXJyb3dLZXkgPSAoa2V5OiBzdHJpbmcpID0+XG4gIGtleSA9PT0gS0VZUy5BUlJPV19MRUZUIHx8XG4gIGtleSA9PT0gS0VZUy5BUlJPV19SSUdIVCB8fFxuICBrZXkgPT09IEtFWVMuQVJST1dfRE9XTiB8fFxuICBrZXkgPT09IEtFWVMuQVJST1dfVVA7XG5cbmV4cG9ydCBjb25zdCBzaG91bGRSZXNpemVGcm9tQ2VudGVyID0gKGV2ZW50OiBNb3VzZUV2ZW50IHwgS2V5Ym9hcmRFdmVudCkgPT5cbiAgZXZlbnQuYWx0S2V5O1xuXG5leHBvcnQgY29uc3Qgc2hvdWxkTWFpbnRhaW5Bc3BlY3RSYXRpbyA9IChldmVudDogTW91c2VFdmVudCB8IEtleWJvYXJkRXZlbnQpID0+XG4gIGV2ZW50LnNoaWZ0S2V5O1xuXG5leHBvcnQgY29uc3Qgc2hvdWxkUm90YXRlV2l0aERpc2NyZXRlQW5nbGUgPSAoXG4gIGV2ZW50OiBNb3VzZUV2ZW50IHwgS2V5Ym9hcmRFdmVudCB8IFJlYWN0LlBvaW50ZXJFdmVudDxIVE1MQ2FudmFzRWxlbWVudD4sXG4pID0+IGV2ZW50LnNoaWZ0S2V5O1xuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///../../keys.ts\n");
|
|
3111
3111
|
|
|
3112
3112
|
/***/ }),
|
|
3113
3113
|
|
|
@@ -3151,7 +3151,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
|
|
|
3151
3151
|
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|
3152
3152
|
|
|
3153
3153
|
"use strict";
|
|
3154
|
-
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../constants */ \"../../constants.ts\");\n\nif (\"development\" !== _constants__WEBPACK_IMPORTED_MODULE_0__.ENV.TEST) {\n /* eslint-disable */\n /* global __webpack_public_path__:writable */\n __webpack_require__.p =\n window.EXCALIDRAW_ASSET_PATH ||\n `https://unpkg.com/${\"@excalidraw/excalidraw\"}@${\"0.12.0-
|
|
3154
|
+
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../constants */ \"../../constants.ts\");\n\nif (\"development\" !== _constants__WEBPACK_IMPORTED_MODULE_0__.ENV.TEST) {\n /* eslint-disable */\n /* global __webpack_public_path__:writable */\n __webpack_require__.p =\n window.EXCALIDRAW_ASSET_PATH ||\n `https://unpkg.com/${\"@excalidraw/excalidraw\"}@${\"0.12.0-54c7ec4\"}/dist/`;\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9wdWJsaWNQYXRoLmpzLmpzIiwibWFwcGluZ3MiOiI7O0FBQXNDO0FBQ3RDLElBQUksYUFBb0IsS0FBSyxnREFBUSxFQUFFO0lBQ3JDLG9CQUFvQjtJQUNwQiw2Q0FBNkM7SUFDN0MscUJBQXVCO1FBQ3JCLE1BQU0sQ0FBQyxxQkFBcUI7WUFDNUIscUJBQXFCLHdCQUFvQixJQUFJLGdCQUF1QixRQUFRLENBQUM7Q0FDaEYiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9wdWJsaWNQYXRoLmpzP2E4N2QiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRU5WIH0gZnJvbSBcIi4uLy4uL2NvbnN0YW50c1wiO1xuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBFTlYuVEVTVCkge1xuICAvKiBlc2xpbnQtZGlzYWJsZSAqL1xuICAvKiBnbG9iYWwgX193ZWJwYWNrX3B1YmxpY19wYXRoX186d3JpdGFibGUgKi9cbiAgX193ZWJwYWNrX3B1YmxpY19wYXRoX18gPVxuICAgIHdpbmRvdy5FWENBTElEUkFXX0FTU0VUX1BBVEggfHxcbiAgICBgaHR0cHM6Ly91bnBrZy5jb20vJHtwcm9jZXNzLmVudi5QS0dfTkFNRX1AJHtwcm9jZXNzLmVudi5QS0dfVkVSU0lPTn0vZGlzdC9gO1xufVxuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./publicPath.js\n");
|
|
3155
3155
|
|
|
3156
3156
|
/***/ }),
|
|
3157
3157
|
|
|
@@ -3250,7 +3250,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
|
|
|
3250
3250
|
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|
3251
3251
|
|
|
3252
3252
|
"use strict";
|
|
3253
|
-
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"SVG_EXPORT_TAG\": () => (/* binding */ SVG_EXPORT_TAG),\n/* harmony export */ \"exportToCanvas\": () => (/* binding */ exportToCanvas),\n/* harmony export */ \"exportToSvg\": () => (/* binding */ exportToSvg),\n/* harmony export */ \"getExportSize\": () => (/* binding */ getExportSize)\n/* harmony export */ });\n/* harmony import */ var roughjs_bin_rough__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! roughjs/bin/rough */ \"../../../node_modules/roughjs/bin/rough.js\");\n/* harmony import */ var _element_bounds__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../element/bounds */ \"../../element/bounds.ts\");\n/* harmony import */ var _renderer_renderScene__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../renderer/renderScene */ \"../../renderer/renderScene.ts\");\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../utils */ \"../../utils.ts\");\n/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../constants */ \"../../constants.ts\");\n/* harmony import */ var _appState__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../appState */ \"../../appState.ts\");\n/* harmony import */ var _data_json__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../data/json */ \"../../data/json.ts\");\n/* harmony import */ var _element_image__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../element/image */ \"../../element/image.ts\");\nvar __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\n\n\n\n\n\n\n\n\nconst SVG_EXPORT_TAG = `<!-- svg-source:excalidraw -->`;\nconst exportToCanvas = (elements, appState, files, { exportBackground, exportPadding = _constants__WEBPACK_IMPORTED_MODULE_4__.DEFAULT_EXPORT_PADDING, viewBackgroundColor, }, createCanvas = (width, height) => {\n const canvas = document.createElement(\"canvas\");\n canvas.width = width * appState.exportScale;\n canvas.height = height * appState.exportScale;\n return { canvas, scale: appState.exportScale };\n}) => __awaiter(void 0, void 0, void 0, function* () {\n const [minX, minY, width, height] = getCanvasSize(elements, exportPadding);\n const { canvas, scale = 1 } = createCanvas(width, height);\n const defaultAppState = (0,_appState__WEBPACK_IMPORTED_MODULE_5__.getDefaultAppState)();\n const { imageCache } = yield (0,_element_image__WEBPACK_IMPORTED_MODULE_7__.updateImageCache)({\n imageCache: new Map(),\n fileIds: (0,_element_image__WEBPACK_IMPORTED_MODULE_7__.getInitializedImageElements)(elements).map((element) => element.fileId),\n files,\n });\n (0,_renderer_renderScene__WEBPACK_IMPORTED_MODULE_2__.renderScene)(elements, appState, null, scale, roughjs_bin_rough__WEBPACK_IMPORTED_MODULE_0__[\"default\"].canvas(canvas), canvas, {\n viewBackgroundColor: exportBackground ? viewBackgroundColor : null,\n scrollX: -minX + exportPadding,\n scrollY: -minY + exportPadding,\n zoom: defaultAppState.zoom,\n remotePointerViewportCoords: {},\n remoteSelectedElementIds: {},\n shouldCacheIgnoreZoom: false,\n remotePointerUsernames: {},\n remotePointerUserStates: {},\n theme: appState.exportWithDarkMode ? \"dark\" : \"light\",\n imageCache,\n renderScrollbars: false,\n renderSelection: false,\n renderGrid: false,\n isExporting: true,\n });\n return canvas;\n});\nconst exportToSvg = (elements, appState, files) => __awaiter(void 0, void 0, void 0, function* () {\n const { exportPadding = _constants__WEBPACK_IMPORTED_MODULE_4__.DEFAULT_EXPORT_PADDING, viewBackgroundColor, exportScale = 1, exportEmbedScene, } = appState;\n let metadata = \"\";\n if (exportEmbedScene) {\n try {\n metadata = yield (yield Promise.resolve(/*! import() */).then(__webpack_require__.bind(__webpack_require__, /*! ../../src/data/image */ \"../../data/image.ts\"))).encodeSvgMetadata({\n text: (0,_data_json__WEBPACK_IMPORTED_MODULE_6__.serializeAsJSON)(elements, appState, files || {}, \"local\"),\n });\n }\n catch (error) {\n console.error(error);\n }\n }\n const [minX, minY, width, height] = getCanvasSize(elements, exportPadding);\n // initialize SVG root\n const svgRoot = document.createElementNS(_constants__WEBPACK_IMPORTED_MODULE_4__.SVG_NS, \"svg\");\n svgRoot.setAttribute(\"version\", \"1.1\");\n svgRoot.setAttribute(\"xmlns\", _constants__WEBPACK_IMPORTED_MODULE_4__.SVG_NS);\n svgRoot.setAttribute(\"viewBox\", `0 0 ${width} ${height}`);\n svgRoot.setAttribute(\"width\", `${width * exportScale}`);\n svgRoot.setAttribute(\"height\", `${height * exportScale}`);\n if (appState.exportWithDarkMode) {\n svgRoot.setAttribute(\"filter\", _constants__WEBPACK_IMPORTED_MODULE_4__.THEME_FILTER);\n }\n let assetPath = \"https://excalidraw.com/\";\n // Asset path needs to be determined only when using package\n if (true) {\n assetPath =\n window.EXCALIDRAW_ASSET_PATH ||\n `https://unpkg.com/${\"@excalidraw/excalidraw\"}@${\"0.12.0-426b5d9\"}`;\n if (assetPath === null || assetPath === void 0 ? void 0 : assetPath.startsWith(\"/\")) {\n assetPath = assetPath.replace(\"/\", `${window.location.origin}/`);\n }\n assetPath = `${assetPath}/dist/excalidraw-assets/`;\n }\n svgRoot.innerHTML = `\n ${SVG_EXPORT_TAG}\n ${metadata}\n <defs>\n <style>\n @font-face {\n font-family: \"Virgil\";\n src: url(\"${assetPath}Virgil.woff2\");\n }\n @font-face {\n font-family: \"Cascadia\";\n src: url(\"${assetPath}Cascadia.woff2\");\n }\n </style>\n </defs>\n `;\n // render background rect\n if (appState.exportBackground && viewBackgroundColor) {\n const rect = svgRoot.ownerDocument.createElementNS(_constants__WEBPACK_IMPORTED_MODULE_4__.SVG_NS, \"rect\");\n rect.setAttribute(\"x\", \"0\");\n rect.setAttribute(\"y\", \"0\");\n rect.setAttribute(\"width\", `${width}`);\n rect.setAttribute(\"height\", `${height}`);\n rect.setAttribute(\"fill\", viewBackgroundColor);\n svgRoot.appendChild(rect);\n }\n const rsvg = roughjs_bin_rough__WEBPACK_IMPORTED_MODULE_0__[\"default\"].svg(svgRoot);\n (0,_renderer_renderScene__WEBPACK_IMPORTED_MODULE_2__.renderSceneToSvg)(elements, rsvg, svgRoot, files || {}, {\n offsetX: -minX + exportPadding,\n offsetY: -minY + exportPadding,\n exportWithDarkMode: appState.exportWithDarkMode,\n });\n return svgRoot;\n});\n// calculate smallest area to fit the contents in\nconst getCanvasSize = (elements, exportPadding) => {\n const [minX, minY, maxX, maxY] = (0,_element_bounds__WEBPACK_IMPORTED_MODULE_1__.getCommonBounds)(elements);\n const width = (0,_utils__WEBPACK_IMPORTED_MODULE_3__.distance)(minX, maxX) + exportPadding * 2;\n const height = (0,_utils__WEBPACK_IMPORTED_MODULE_3__.distance)(minY, maxY) + exportPadding + exportPadding;\n return [minX, minY, width, height];\n};\nconst getExportSize = (elements, exportPadding, scale) => {\n const [, , width, height] = getCanvasSize(elements, exportPadding).map((dimension) => Math.trunc(dimension * scale));\n return [width, height];\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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azovLy8uLi8uLi9zY2VuZS9leHBvcnQudHM/OWJmNyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgcm91Z2ggZnJvbSBcInJvdWdoanMvYmluL3JvdWdoXCI7XG5pbXBvcnQgeyBOb25EZWxldGVkRXhjYWxpZHJhd0VsZW1lbnQgfSBmcm9tIFwiLi4vZWxlbWVudC90eXBlc1wiO1xuaW1wb3J0IHsgZ2V0Q29tbW9uQm91bmRzIH0gZnJvbSBcIi4uL2VsZW1lbnQvYm91bmRzXCI7XG5pbXBvcnQgeyByZW5kZXJTY2VuZSwgcmVuZGVyU2NlbmVUb1N2ZyB9IGZyb20gXCIuLi9yZW5kZXJlci9yZW5kZXJTY2VuZVwiO1xuaW1wb3J0IHsgZGlzdGFuY2UgfSBmcm9tIFwiLi4vdXRpbHNcIjtcbmltcG9ydCB7IEFwcFN0YXRlLCBCaW5hcnlGaWxlcyB9IGZyb20gXCIuLi90eXBlc1wiO1xuaW1wb3J0IHsgREVGQVVMVF9FWFBPUlRfUEFERElORywgU1ZHX05TLCBUSEVNRV9GSUxURVIgfSBmcm9tIFwiLi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBnZXREZWZhdWx0QXBwU3RhdGUgfSBmcm9tIFwiLi4vYXBwU3RhdGVcIjtcbmltcG9ydCB7IHNlcmlhbGl6ZUFzSlNPTiB9IGZyb20gXCIuLi9kYXRhL2pzb25cIjtcbmltcG9ydCB7XG4gIGdldEluaXRpYWxpemVkSW1hZ2VFbGVtZW50cyxcbiAgdXBkYXRlSW1hZ2VDYWNoZSxcbn0gZnJvbSBcIi4uL2VsZW1lbnQvaW1hZ2VcIjtcblxuZXhwb3J0IGNvbnN0IFNWR19FWFBPUlRfVEFHID0gYDwhLS0gc3ZnLXNvdXJjZTpleGNhbGlkcmF3IC0tPmA7XG5cbmV4cG9ydCBjb25zdCBleHBvcnRUb0NhbnZhcyA9IGFzeW5jIChcbiAgZWxlbWVudHM6IHJlYWRvbmx5IE5vbkRlbGV0ZWRFeGNhbGlkcmF3RWxlbWVudFtdLFxuICBhcHBTdGF0ZTogQXBwU3RhdGUsXG4gIGZpbGVzOiBCaW5hcnlGaWxlcyxcbiAge1xuICAgIGV4cG9ydEJhY2tncm91bmQsXG4gICAgZXhwb3J0UGFkZGluZyA9IERFRkFVTFRfRVhQT1JUX1BBRERJTkcsXG4gICAgdmlld0JhY2tncm91bmRDb2xvcixcbiAgfToge1xuICAgIGV4cG9ydEJhY2tncm91bmQ6IGJvb2xlYW47XG4gICAgZXhwb3J0UGFkZGluZz86IG51bWJlcjtcbiAgICB2aWV3QmFja2dyb3VuZENvbG9yOiBzdHJpbmc7XG4gIH0sXG4gIGNyZWF0ZUNhbnZhczogKFxuICAgIHdpZHRoOiBudW1iZXIsXG4gICAgaGVpZ2h0OiBudW1iZXIsXG4gICkgPT4geyBjYW52YXM6IEhUTUxDYW52YXNFbGVtZW50OyBzY2FsZTogbnVtYmVyIH0gPSAod2lkdGgsIGhlaWdodCkgPT4ge1xuICAgIGNvbnN0IGNhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJjYW52YXNcIik7XG4gICAgY2FudmFzLndpZHRoID0gd2lkdGggKiBhcHBTdGF0ZS5leHBvcnRTY2FsZTtcbiAgICBjYW52YXMuaGVpZ2h0ID0gaGVpZ2h0ICogYXBwU3RhdGUuZXhwb3J0U2NhbGU7XG4gICAgcmV0dXJuIHsgY2FudmFzLCBzY2FsZTogYXBwU3RhdGUuZXhwb3J0U2NhbGUgfTtcbiAgfSxcbikgPT4ge1xuICBjb25zdCBbbWluWCwgbWluWSwgd2lkdGgsIGhlaWdodF0gPSBnZXRDYW52YXNTaXplKGVsZW1lbnRzLCBleHBvcnRQYWRkaW5nKTtcblxuICBjb25zdCB7IGNhbnZhcywgc2NhbGUgPSAxIH0gPSBjcmVhdGVDYW52YXMod2lkdGgsIGhlaWdodCk7XG5cbiAgY29uc3QgZGVmYXVsdEFwcFN0YXRlID0gZ2V0RGVmYXVsdEFwcFN0YXRlKCk7XG5cbiAgY29uc3QgeyBpbWFnZUNhY2hlIH0gPSBhd2FpdCB1cGRhdGVJbWFnZUNhY2hlKHtcbiAgICBpbWFnZUNhY2hlOiBuZXcgTWFwKCksXG4gICAgZmlsZUlkczogZ2V0SW5pdGlhbGl6ZWRJbWFnZUVsZW1lbnRzKGVsZW1lbnRzKS5tYXAoXG4gICAgICAoZWxlbWVudCkgPT4gZWxlbWVudC5maWxlSWQsXG4gICAgKSxcbiAgICBmaWxlcyxcbiAgfSk7XG5cbiAgcmVuZGVyU2NlbmUoZWxlbWVudHMsIGFwcFN0YXRlLCBudWxsLCBzY2FsZSwgcm91Z2guY2FudmFzKGNhbnZhcyksIGNhbnZhcywge1xuICAgIHZpZXdCYWNrZ3JvdW5kQ29sb3I6IGV4cG9ydEJhY2tncm91bmQgPyB2aWV3QmFja2dyb3VuZENvbG9yIDogbnVsbCxcbiAgICBzY3JvbGxYOiAtbWluWCArIGV4cG9ydFBhZGRpbmcsXG4gICAgc2Nyb2xsWTogLW1pblkgKyBleHBvcnRQYWRkaW5nLFxuICAgIHpvb206IGRlZmF1bHRBcHBTdGF0ZS56b29tLFxuICAgIHJlbW90ZVBvaW50ZXJWaWV3cG9ydENvb3Jkczoge30sXG4gICAgcmVtb3RlU2VsZWN0ZWRFbGVtZW50SWRzOiB7fSxcbiAgICBzaG91bGRDYWNoZUlnbm9yZVpvb206IGZhbHNlLFxuICAgIHJlbW90ZVBvaW50ZXJVc2VybmFtZXM6IHt9LFxuICAgIHJlbW90ZVBvaW50ZXJVc2VyU3RhdGVzOiB7fSxcbiAgICB0aGVtZTogYXBwU3RhdGUuZXhwb3J0V2l0aERhcmtNb2RlID8gXCJkYXJrXCIgOiBcImxpZ2h0XCIsXG4gICAgaW1hZ2VDYWNoZSxcbiAgICByZW5kZXJTY3JvbGxiYXJzOiBmYWxzZSxcbiAgICByZW5kZXJTZWxlY3Rpb246IGZhbHNlLFxuICAgIHJlbmRlckdyaWQ6IGZhbHNlLFxuICAgIGlzRXhwb3J0aW5nOiB0cnVlLFxuICB9KTtcblxuICByZXR1cm4gY2FudmFzO1xufTtcblxuZXhwb3J0IGNvbnN0IGV4cG9ydFRvU3ZnID0gYXN5bmMgKFxuICBlbGVtZW50czogcmVhZG9ubHkgTm9uRGVsZXRlZEV4Y2FsaWRyYXdFbGVtZW50W10sXG4gIGFwcFN0YXRlOiB7XG4gICAgZXhwb3J0QmFja2dyb3VuZDogYm9vbGVhbjtcbiAgICBleHBvcnRQYWRkaW5nPzogbnVtYmVyO1xuICAgIGV4cG9ydFNjYWxlPzogbnVtYmVyO1xuICAgIHZpZXdCYWNrZ3JvdW5kQ29sb3I6IHN0cmluZztcbiAgICBleHBvcnRXaXRoRGFya01vZGU/OiBib29sZWFuO1xuICAgIGV4cG9ydEVtYmVkU2NlbmU/OiBib29sZWFuO1xuICB9LFxuICBmaWxlczogQmluYXJ5RmlsZXMgfCBudWxsLFxuKTogUHJvbWlzZTxTVkdTVkdFbGVtZW50PiA9PiB7XG4gIGNvbnN0IHtcbiAgICBleHBvcnRQYWRkaW5nID0gREVGQVVMVF9FWFBPUlRfUEFERElORyxcbiAgICB2aWV3QmFja2dyb3VuZENvbG9yLFxuICAgIGV4cG9ydFNjYWxlID0gMSxcbiAgICBleHBvcnRFbWJlZFNjZW5lLFxuICB9ID0gYXBwU3RhdGU7XG4gIGxldCBtZXRhZGF0YSA9IFwiXCI7XG4gIGlmIChleHBvcnRFbWJlZFNjZW5lKSB7XG4gICAgdHJ5IHtcbiAgICAgIG1ldGFkYXRhID0gYXdhaXQgKFxuICAgICAgICBhd2FpdCBpbXBvcnQoLyogd2VicGFja0NodW5rTmFtZTogXCJpbWFnZVwiICovIFwiLi4vLi4vc3JjL2RhdGEvaW1hZ2VcIilcbiAgICAgICkuZW5jb2RlU3ZnTWV0YWRhdGEoe1xuICAgICAgICB0ZXh0OiBzZXJpYWxpemVBc0pTT04oZWxlbWVudHMsIGFwcFN0YXRlLCBmaWxlcyB8fCB7fSwgXCJsb2NhbFwiKSxcbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgIH1cbiAgfVxuICBjb25zdCBbbWluWCwgbWluWSwgd2lkdGgsIGhlaWdodF0gPSBnZXRDYW52YXNTaXplKGVsZW1lbnRzLCBleHBvcnRQYWRkaW5nKTtcblxuICAvLyBpbml0aWFsaXplIFNWRyByb290XG4gIGNvbnN0IHN2Z1Jvb3QgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoU1ZHX05TLCBcInN2Z1wiKTtcbiAgc3ZnUm9vdC5zZXRBdHRyaWJ1dGUoXCJ2ZXJzaW9uXCIsIFwiMS4xXCIpO1xuICBzdmdSb290LnNldEF0dHJpYnV0ZShcInhtbG5zXCIsIFNWR19OUyk7XG4gIHN2Z1Jvb3Quc2V0QXR0cmlidXRlKFwidmlld0JveFwiLCBgMCAwICR7d2lkdGh9ICR7aGVpZ2h0fWApO1xuICBzdmdSb290LnNldEF0dHJpYnV0ZShcIndpZHRoXCIsIGAke3dpZHRoICogZXhwb3J0U2NhbGV9YCk7XG4gIHN2Z1Jvb3Quc2V0QXR0cmlidXRlKFwiaGVpZ2h0XCIsIGAke2hlaWdodCAqIGV4cG9ydFNjYWxlfWApO1xuICBpZiAoYXBwU3RhdGUuZXhwb3J0V2l0aERhcmtNb2RlKSB7XG4gICAgc3ZnUm9vdC5zZXRBdHRyaWJ1dGUoXCJmaWx0ZXJcIiwgVEhFTUVfRklMVEVSKTtcbiAgfVxuXG4gIGxldCBhc3NldFBhdGggPSBcImh0dHBzOi8vZXhjYWxpZHJhdy5jb20vXCI7XG5cbiAgLy8gQXNzZXQgcGF0aCBuZWVkcyB0byBiZSBkZXRlcm1pbmVkIG9ubHkgd2hlbiB1c2luZyBwYWNrYWdlXG4gIGlmIChwcm9jZXNzLmVudi5JU19FWENBTElEUkFXX05QTV9QQUNLQUdFKSB7XG4gICAgYXNzZXRQYXRoID1cbiAgICAgIHdpbmRvdy5FWENBTElEUkFXX0FTU0VUX1BBVEggfHxcbiAgICAgIGBodHRwczovL3VucGtnLmNvbS8ke3Byb2Nlc3MuZW52LlBLR19OQU1FfUAke3Byb2Nlc3MuZW52LlBLR19WRVJTSU9OfWA7XG5cbiAgICBpZiAoYXNzZXRQYXRoPy5zdGFydHNXaXRoKFwiL1wiKSkge1xuICAgICAgYXNzZXRQYXRoID0gYXNzZXRQYXRoLnJlcGxhY2UoXCIvXCIsIGAke3dpbmRvdy5sb2NhdGlvbi5vcmlnaW59L2ApO1xuICAgIH1cbiAgICBhc3NldFBhdGggPSBgJHthc3NldFBhdGh9L2Rpc3QvZXhjYWxpZHJhdy1hc3NldHMvYDtcbiAgfVxuICBzdmdSb290LmlubmVySFRNTCA9IGBcbiAgJHtTVkdfRVhQT1JUX1RBR31cbiAgJHttZXRhZGF0YX1cbiAgPGRlZnM+XG4gICAgPHN0eWxlPlxuICAgICAgQGZvbnQtZmFjZSB7XG4gICAgICAgIGZvbnQtZmFtaWx5OiBcIlZpcmdpbFwiO1xuICAgICAgICBzcmM6IHVybChcIiR7YXNzZXRQYXRofVZpcmdpbC53b2ZmMlwiKTtcbiAgICAgIH1cbiAgICAgIEBmb250LWZhY2Uge1xuICAgICAgICBmb250LWZhbWlseTogXCJDYXNjYWRpYVwiO1xuICAgICAgICBzcmM6IHVybChcIiR7YXNzZXRQYXRofUNhc2NhZGlhLndvZmYyXCIpO1xuICAgICAgfVxuICAgIDwvc3R5bGU+XG4gIDwvZGVmcz5cbiAgYDtcbiAgLy8gcmVuZGVyIGJhY2tncm91bmQgcmVjdFxuICBpZiAoYXBwU3RhdGUuZXhwb3J0QmFja2dyb3VuZCAmJiB2aWV3QmFja2dyb3VuZENvbG9yKSB7XG4gICAgY29uc3QgcmVjdCA9IHN2Z1Jvb3Qub3duZXJEb2N1bWVudCEuY3JlYXRlRWxlbWVudE5TKFNWR19OUywgXCJyZWN0XCIpO1xuICAgIHJlY3Quc2V0QXR0cmlidXRlKFwieFwiLCBcIjBcIik7XG4gICAgcmVjdC5zZXRBdHRyaWJ1dGUoXCJ5XCIsIFwiMFwiKTtcbiAgICByZWN0LnNldEF0dHJpYnV0ZShcIndpZHRoXCIsIGAke3dpZHRofWApO1xuICAgIHJlY3Quc2V0QXR0cmlidXRlKFwiaGVpZ2h0XCIsIGAke2hlaWdodH1gKTtcbiAgICByZWN0LnNldEF0dHJpYnV0ZShcImZpbGxcIiwgdmlld0JhY2tncm91bmRDb2xvcik7XG4gICAgc3ZnUm9vdC5hcHBlbmRDaGlsZChyZWN0KTtcbiAgfVxuXG4gIGNvbnN0IHJzdmcgPSByb3VnaC5zdmcoc3ZnUm9vdCk7XG4gIHJlbmRlclNjZW5lVG9TdmcoZWxlbWVudHMsIHJzdmcsIHN2Z1Jvb3QsIGZpbGVzIHx8IHt9LCB7XG4gICAgb2Zmc2V0WDogLW1pblggKyBleHBvcnRQYWRkaW5nLFxuICAgIG9mZnNldFk6IC1taW5ZICsgZXhwb3J0UGFkZGluZyxcbiAgICBleHBvcnRXaXRoRGFya01vZGU6IGFwcFN0YXRlLmV4cG9ydFdpdGhEYXJrTW9kZSxcbiAgfSk7XG5cbiAgcmV0dXJuIHN2Z1Jvb3Q7XG59O1xuXG4vLyBjYWxjdWxhdGUgc21hbGxlc3QgYXJlYSB0byBmaXQgdGhlIGNvbnRlbnRzIGluXG5jb25zdCBnZXRDYW52YXNTaXplID0gKFxuICBlbGVtZW50czogcmVhZG9ubHkgTm9uRGVsZXRlZEV4Y2FsaWRyYXdFbGVtZW50W10sXG4gIGV4cG9ydFBhZGRpbmc6IG51bWJlcixcbik6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdID0+IHtcbiAgY29uc3QgW21pblgsIG1pblksIG1heFgsIG1heFldID0gZ2V0Q29tbW9uQm91bmRzKGVsZW1lbnRzKTtcbiAgY29uc3Qgd2lkdGggPSBkaXN0YW5jZShtaW5YLCBtYXhYKSArIGV4cG9ydFBhZGRpbmcgKiAyO1xuICBjb25zdCBoZWlnaHQgPSBkaXN0YW5jZShtaW5ZLCBtYXhZKSArIGV4cG9ydFBhZGRpbmcgKyBleHBvcnRQYWRkaW5nO1xuXG4gIHJldHVybiBbbWluWCwgbWluWSwgd2lkdGgsIGhlaWdodF07XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0RXhwb3J0U2l6ZSA9IChcbiAgZWxlbWVudHM6IHJlYWRvbmx5IE5vbkRlbGV0ZWRFeGNhbGlkcmF3RWxlbWVudFtdLFxuICBleHBvcnRQYWRkaW5nOiBudW1iZXIsXG4gIHNjYWxlOiBudW1iZXIsXG4pOiBbbnVtYmVyLCBudW1iZXJdID0+IHtcbiAgY29uc3QgWywgLCB3aWR0aCwgaGVpZ2h0XSA9IGdldENhbnZhc1NpemUoZWxlbWVudHMsIGV4cG9ydFBhZGRpbmcpLm1hcChcbiAgICAoZGltZW5zaW9uKSA9PiBNYXRoLnRydW5jKGRpbWVuc2lvbiAqIHNjYWxlKSxcbiAgKTtcblxuICByZXR1cm4gW3dpZHRoLCBoZWlnaHRdO1xufTtcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///../../scene/export.ts\n");
|
|
3253
|
+
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"SVG_EXPORT_TAG\": () => (/* binding */ SVG_EXPORT_TAG),\n/* harmony export */ \"exportToCanvas\": () => (/* binding */ exportToCanvas),\n/* harmony export */ \"exportToSvg\": () => (/* binding */ exportToSvg),\n/* harmony export */ \"getExportSize\": () => (/* binding */ getExportSize)\n/* harmony export */ });\n/* harmony import */ var roughjs_bin_rough__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! roughjs/bin/rough */ \"../../../node_modules/roughjs/bin/rough.js\");\n/* harmony import */ var _element_bounds__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../element/bounds */ \"../../element/bounds.ts\");\n/* harmony import */ var _renderer_renderScene__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../renderer/renderScene */ \"../../renderer/renderScene.ts\");\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../utils */ \"../../utils.ts\");\n/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../constants */ \"../../constants.ts\");\n/* harmony import */ var _appState__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../appState */ \"../../appState.ts\");\n/* harmony import */ var _data_json__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../data/json */ \"../../data/json.ts\");\n/* harmony import */ var _element_image__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../element/image */ \"../../element/image.ts\");\nvar __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\n\n\n\n\n\n\n\n\nconst SVG_EXPORT_TAG = `<!-- svg-source:excalidraw -->`;\nconst exportToCanvas = (elements, appState, files, { exportBackground, exportPadding = _constants__WEBPACK_IMPORTED_MODULE_4__.DEFAULT_EXPORT_PADDING, viewBackgroundColor, }, createCanvas = (width, height) => {\n const canvas = document.createElement(\"canvas\");\n canvas.width = width * appState.exportScale;\n canvas.height = height * appState.exportScale;\n return { canvas, scale: appState.exportScale };\n}) => __awaiter(void 0, void 0, void 0, function* () {\n const [minX, minY, width, height] = getCanvasSize(elements, exportPadding);\n const { canvas, scale = 1 } = createCanvas(width, height);\n const defaultAppState = (0,_appState__WEBPACK_IMPORTED_MODULE_5__.getDefaultAppState)();\n const { imageCache } = yield (0,_element_image__WEBPACK_IMPORTED_MODULE_7__.updateImageCache)({\n imageCache: new Map(),\n fileIds: (0,_element_image__WEBPACK_IMPORTED_MODULE_7__.getInitializedImageElements)(elements).map((element) => element.fileId),\n files,\n });\n (0,_renderer_renderScene__WEBPACK_IMPORTED_MODULE_2__.renderScene)(elements, appState, null, scale, roughjs_bin_rough__WEBPACK_IMPORTED_MODULE_0__[\"default\"].canvas(canvas), canvas, {\n viewBackgroundColor: exportBackground ? viewBackgroundColor : null,\n scrollX: -minX + exportPadding,\n scrollY: -minY + exportPadding,\n zoom: defaultAppState.zoom,\n remotePointerViewportCoords: {},\n remoteSelectedElementIds: {},\n shouldCacheIgnoreZoom: false,\n remotePointerUsernames: {},\n remotePointerUserStates: {},\n theme: appState.exportWithDarkMode ? \"dark\" : \"light\",\n imageCache,\n renderScrollbars: false,\n renderSelection: false,\n renderGrid: false,\n isExporting: true,\n });\n return canvas;\n});\nconst exportToSvg = (elements, appState, files) => __awaiter(void 0, void 0, void 0, function* () {\n const { exportPadding = _constants__WEBPACK_IMPORTED_MODULE_4__.DEFAULT_EXPORT_PADDING, viewBackgroundColor, exportScale = 1, exportEmbedScene, } = appState;\n let metadata = \"\";\n if (exportEmbedScene) {\n try {\n metadata = yield (yield Promise.resolve(/*! import() */).then(__webpack_require__.bind(__webpack_require__, /*! ../../src/data/image */ \"../../data/image.ts\"))).encodeSvgMetadata({\n text: (0,_data_json__WEBPACK_IMPORTED_MODULE_6__.serializeAsJSON)(elements, appState, files || {}, \"local\"),\n });\n }\n catch (error) {\n console.error(error);\n }\n }\n const [minX, minY, width, height] = getCanvasSize(elements, exportPadding);\n // initialize SVG root\n const svgRoot = document.createElementNS(_constants__WEBPACK_IMPORTED_MODULE_4__.SVG_NS, \"svg\");\n svgRoot.setAttribute(\"version\", \"1.1\");\n svgRoot.setAttribute(\"xmlns\", _constants__WEBPACK_IMPORTED_MODULE_4__.SVG_NS);\n svgRoot.setAttribute(\"viewBox\", `0 0 ${width} ${height}`);\n svgRoot.setAttribute(\"width\", `${width * exportScale}`);\n svgRoot.setAttribute(\"height\", `${height * exportScale}`);\n if (appState.exportWithDarkMode) {\n svgRoot.setAttribute(\"filter\", _constants__WEBPACK_IMPORTED_MODULE_4__.THEME_FILTER);\n }\n let assetPath = \"https://excalidraw.com/\";\n // Asset path needs to be determined only when using package\n if (true) {\n assetPath =\n window.EXCALIDRAW_ASSET_PATH ||\n `https://unpkg.com/${\"@excalidraw/excalidraw\"}@${\"0.12.0-54c7ec4\"}`;\n if (assetPath === null || assetPath === void 0 ? void 0 : assetPath.startsWith(\"/\")) {\n assetPath = assetPath.replace(\"/\", `${window.location.origin}/`);\n }\n assetPath = `${assetPath}/dist/excalidraw-assets/`;\n }\n svgRoot.innerHTML = `\n ${SVG_EXPORT_TAG}\n ${metadata}\n <defs>\n <style>\n @font-face {\n font-family: \"Virgil\";\n src: url(\"${assetPath}Virgil.woff2\");\n }\n @font-face {\n font-family: \"Cascadia\";\n src: url(\"${assetPath}Cascadia.woff2\");\n }\n </style>\n </defs>\n `;\n // render background rect\n if (appState.exportBackground && viewBackgroundColor) {\n const rect = svgRoot.ownerDocument.createElementNS(_constants__WEBPACK_IMPORTED_MODULE_4__.SVG_NS, \"rect\");\n rect.setAttribute(\"x\", \"0\");\n rect.setAttribute(\"y\", \"0\");\n rect.setAttribute(\"width\", `${width}`);\n rect.setAttribute(\"height\", `${height}`);\n rect.setAttribute(\"fill\", viewBackgroundColor);\n svgRoot.appendChild(rect);\n }\n const rsvg = roughjs_bin_rough__WEBPACK_IMPORTED_MODULE_0__[\"default\"].svg(svgRoot);\n (0,_renderer_renderScene__WEBPACK_IMPORTED_MODULE_2__.renderSceneToSvg)(elements, rsvg, svgRoot, files || {}, {\n offsetX: -minX + exportPadding,\n offsetY: -minY + exportPadding,\n exportWithDarkMode: appState.exportWithDarkMode,\n });\n return svgRoot;\n});\n// calculate smallest area to fit the contents in\nconst getCanvasSize = (elements, exportPadding) => {\n const [minX, minY, maxX, maxY] = (0,_element_bounds__WEBPACK_IMPORTED_MODULE_1__.getCommonBounds)(elements);\n const width = (0,_utils__WEBPACK_IMPORTED_MODULE_3__.distance)(minX, maxX) + exportPadding * 2;\n const height = (0,_utils__WEBPACK_IMPORTED_MODULE_3__.distance)(minY, maxY) + exportPadding + exportPadding;\n return [minX, minY, width, height];\n};\nconst getExportSize = (elements, exportPadding, scale) => {\n const [, , width, height] = getCanvasSize(elements, exportPadding).map((dimension) => Math.trunc(dimension * scale));\n return [width, height];\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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azovLy8uLi8uLi9zY2VuZS9leHBvcnQudHM/OWJmNyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgcm91Z2ggZnJvbSBcInJvdWdoanMvYmluL3JvdWdoXCI7XG5pbXBvcnQgeyBOb25EZWxldGVkRXhjYWxpZHJhd0VsZW1lbnQgfSBmcm9tIFwiLi4vZWxlbWVudC90eXBlc1wiO1xuaW1wb3J0IHsgZ2V0Q29tbW9uQm91bmRzIH0gZnJvbSBcIi4uL2VsZW1lbnQvYm91bmRzXCI7XG5pbXBvcnQgeyByZW5kZXJTY2VuZSwgcmVuZGVyU2NlbmVUb1N2ZyB9IGZyb20gXCIuLi9yZW5kZXJlci9yZW5kZXJTY2VuZVwiO1xuaW1wb3J0IHsgZGlzdGFuY2UgfSBmcm9tIFwiLi4vdXRpbHNcIjtcbmltcG9ydCB7IEFwcFN0YXRlLCBCaW5hcnlGaWxlcyB9IGZyb20gXCIuLi90eXBlc1wiO1xuaW1wb3J0IHsgREVGQVVMVF9FWFBPUlRfUEFERElORywgU1ZHX05TLCBUSEVNRV9GSUxURVIgfSBmcm9tIFwiLi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBnZXREZWZhdWx0QXBwU3RhdGUgfSBmcm9tIFwiLi4vYXBwU3RhdGVcIjtcbmltcG9ydCB7IHNlcmlhbGl6ZUFzSlNPTiB9IGZyb20gXCIuLi9kYXRhL2pzb25cIjtcbmltcG9ydCB7XG4gIGdldEluaXRpYWxpemVkSW1hZ2VFbGVtZW50cyxcbiAgdXBkYXRlSW1hZ2VDYWNoZSxcbn0gZnJvbSBcIi4uL2VsZW1lbnQvaW1hZ2VcIjtcblxuZXhwb3J0IGNvbnN0IFNWR19FWFBPUlRfVEFHID0gYDwhLS0gc3ZnLXNvdXJjZTpleGNhbGlkcmF3IC0tPmA7XG5cbmV4cG9ydCBjb25zdCBleHBvcnRUb0NhbnZhcyA9IGFzeW5jIChcbiAgZWxlbWVudHM6IHJlYWRvbmx5IE5vbkRlbGV0ZWRFeGNhbGlkcmF3RWxlbWVudFtdLFxuICBhcHBTdGF0ZTogQXBwU3RhdGUsXG4gIGZpbGVzOiBCaW5hcnlGaWxlcyxcbiAge1xuICAgIGV4cG9ydEJhY2tncm91bmQsXG4gICAgZXhwb3J0UGFkZGluZyA9IERFRkFVTFRfRVhQT1JUX1BBRERJTkcsXG4gICAgdmlld0JhY2tncm91bmRDb2xvcixcbiAgfToge1xuICAgIGV4cG9ydEJhY2tncm91bmQ6IGJvb2xlYW47XG4gICAgZXhwb3J0UGFkZGluZz86IG51bWJlcjtcbiAgICB2aWV3QmFja2dyb3VuZENvbG9yOiBzdHJpbmc7XG4gIH0sXG4gIGNyZWF0ZUNhbnZhczogKFxuICAgIHdpZHRoOiBudW1iZXIsXG4gICAgaGVpZ2h0OiBudW1iZXIsXG4gICkgPT4geyBjYW52YXM6IEhUTUxDYW52YXNFbGVtZW50OyBzY2FsZTogbnVtYmVyIH0gPSAod2lkdGgsIGhlaWdodCkgPT4ge1xuICAgIGNvbnN0IGNhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJjYW52YXNcIik7XG4gICAgY2FudmFzLndpZHRoID0gd2lkdGggKiBhcHBTdGF0ZS5leHBvcnRTY2FsZTtcbiAgICBjYW52YXMuaGVpZ2h0ID0gaGVpZ2h0ICogYXBwU3RhdGUuZXhwb3J0U2NhbGU7XG4gICAgcmV0dXJuIHsgY2FudmFzLCBzY2FsZTogYXBwU3RhdGUuZXhwb3J0U2NhbGUgfTtcbiAgfSxcbikgPT4ge1xuICBjb25zdCBbbWluWCwgbWluWSwgd2lkdGgsIGhlaWdodF0gPSBnZXRDYW52YXNTaXplKGVsZW1lbnRzLCBleHBvcnRQYWRkaW5nKTtcblxuICBjb25zdCB7IGNhbnZhcywgc2NhbGUgPSAxIH0gPSBjcmVhdGVDYW52YXMod2lkdGgsIGhlaWdodCk7XG5cbiAgY29uc3QgZGVmYXVsdEFwcFN0YXRlID0gZ2V0RGVmYXVsdEFwcFN0YXRlKCk7XG5cbiAgY29uc3QgeyBpbWFnZUNhY2hlIH0gPSBhd2FpdCB1cGRhdGVJbWFnZUNhY2hlKHtcbiAgICBpbWFnZUNhY2hlOiBuZXcgTWFwKCksXG4gICAgZmlsZUlkczogZ2V0SW5pdGlhbGl6ZWRJbWFnZUVsZW1lbnRzKGVsZW1lbnRzKS5tYXAoXG4gICAgICAoZWxlbWVudCkgPT4gZWxlbWVudC5maWxlSWQsXG4gICAgKSxcbiAgICBmaWxlcyxcbiAgfSk7XG5cbiAgcmVuZGVyU2NlbmUoZWxlbWVudHMsIGFwcFN0YXRlLCBudWxsLCBzY2FsZSwgcm91Z2guY2FudmFzKGNhbnZhcyksIGNhbnZhcywge1xuICAgIHZpZXdCYWNrZ3JvdW5kQ29sb3I6IGV4cG9ydEJhY2tncm91bmQgPyB2aWV3QmFja2dyb3VuZENvbG9yIDogbnVsbCxcbiAgICBzY3JvbGxYOiAtbWluWCArIGV4cG9ydFBhZGRpbmcsXG4gICAgc2Nyb2xsWTogLW1pblkgKyBleHBvcnRQYWRkaW5nLFxuICAgIHpvb206IGRlZmF1bHRBcHBTdGF0ZS56b29tLFxuICAgIHJlbW90ZVBvaW50ZXJWaWV3cG9ydENvb3Jkczoge30sXG4gICAgcmVtb3RlU2VsZWN0ZWRFbGVtZW50SWRzOiB7fSxcbiAgICBzaG91bGRDYWNoZUlnbm9yZVpvb206IGZhbHNlLFxuICAgIHJlbW90ZVBvaW50ZXJVc2VybmFtZXM6IHt9LFxuICAgIHJlbW90ZVBvaW50ZXJVc2VyU3RhdGVzOiB7fSxcbiAgICB0aGVtZTogYXBwU3RhdGUuZXhwb3J0V2l0aERhcmtNb2RlID8gXCJkYXJrXCIgOiBcImxpZ2h0XCIsXG4gICAgaW1hZ2VDYWNoZSxcbiAgICByZW5kZXJTY3JvbGxiYXJzOiBmYWxzZSxcbiAgICByZW5kZXJTZWxlY3Rpb246IGZhbHNlLFxuICAgIHJlbmRlckdyaWQ6IGZhbHNlLFxuICAgIGlzRXhwb3J0aW5nOiB0cnVlLFxuICB9KTtcblxuICByZXR1cm4gY2FudmFzO1xufTtcblxuZXhwb3J0IGNvbnN0IGV4cG9ydFRvU3ZnID0gYXN5bmMgKFxuICBlbGVtZW50czogcmVhZG9ubHkgTm9uRGVsZXRlZEV4Y2FsaWRyYXdFbGVtZW50W10sXG4gIGFwcFN0YXRlOiB7XG4gICAgZXhwb3J0QmFja2dyb3VuZDogYm9vbGVhbjtcbiAgICBleHBvcnRQYWRkaW5nPzogbnVtYmVyO1xuICAgIGV4cG9ydFNjYWxlPzogbnVtYmVyO1xuICAgIHZpZXdCYWNrZ3JvdW5kQ29sb3I6IHN0cmluZztcbiAgICBleHBvcnRXaXRoRGFya01vZGU/OiBib29sZWFuO1xuICAgIGV4cG9ydEVtYmVkU2NlbmU/OiBib29sZWFuO1xuICB9LFxuICBmaWxlczogQmluYXJ5RmlsZXMgfCBudWxsLFxuKTogUHJvbWlzZTxTVkdTVkdFbGVtZW50PiA9PiB7XG4gIGNvbnN0IHtcbiAgICBleHBvcnRQYWRkaW5nID0gREVGQVVMVF9FWFBPUlRfUEFERElORyxcbiAgICB2aWV3QmFja2dyb3VuZENvbG9yLFxuICAgIGV4cG9ydFNjYWxlID0gMSxcbiAgICBleHBvcnRFbWJlZFNjZW5lLFxuICB9ID0gYXBwU3RhdGU7XG4gIGxldCBtZXRhZGF0YSA9IFwiXCI7XG4gIGlmIChleHBvcnRFbWJlZFNjZW5lKSB7XG4gICAgdHJ5IHtcbiAgICAgIG1ldGFkYXRhID0gYXdhaXQgKFxuICAgICAgICBhd2FpdCBpbXBvcnQoLyogd2VicGFja0NodW5rTmFtZTogXCJpbWFnZVwiICovIFwiLi4vLi4vc3JjL2RhdGEvaW1hZ2VcIilcbiAgICAgICkuZW5jb2RlU3ZnTWV0YWRhdGEoe1xuICAgICAgICB0ZXh0OiBzZXJpYWxpemVBc0pTT04oZWxlbWVudHMsIGFwcFN0YXRlLCBmaWxlcyB8fCB7fSwgXCJsb2NhbFwiKSxcbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgIH1cbiAgfVxuICBjb25zdCBbbWluWCwgbWluWSwgd2lkdGgsIGhlaWdodF0gPSBnZXRDYW52YXNTaXplKGVsZW1lbnRzLCBleHBvcnRQYWRkaW5nKTtcblxuICAvLyBpbml0aWFsaXplIFNWRyByb290XG4gIGNvbnN0IHN2Z1Jvb3QgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoU1ZHX05TLCBcInN2Z1wiKTtcbiAgc3ZnUm9vdC5zZXRBdHRyaWJ1dGUoXCJ2ZXJzaW9uXCIsIFwiMS4xXCIpO1xuICBzdmdSb290LnNldEF0dHJpYnV0ZShcInhtbG5zXCIsIFNWR19OUyk7XG4gIHN2Z1Jvb3Quc2V0QXR0cmlidXRlKFwidmlld0JveFwiLCBgMCAwICR7d2lkdGh9ICR7aGVpZ2h0fWApO1xuICBzdmdSb290LnNldEF0dHJpYnV0ZShcIndpZHRoXCIsIGAke3dpZHRoICogZXhwb3J0U2NhbGV9YCk7XG4gIHN2Z1Jvb3Quc2V0QXR0cmlidXRlKFwiaGVpZ2h0XCIsIGAke2hlaWdodCAqIGV4cG9ydFNjYWxlfWApO1xuICBpZiAoYXBwU3RhdGUuZXhwb3J0V2l0aERhcmtNb2RlKSB7XG4gICAgc3ZnUm9vdC5zZXRBdHRyaWJ1dGUoXCJmaWx0ZXJcIiwgVEhFTUVfRklMVEVSKTtcbiAgfVxuXG4gIGxldCBhc3NldFBhdGggPSBcImh0dHBzOi8vZXhjYWxpZHJhdy5jb20vXCI7XG5cbiAgLy8gQXNzZXQgcGF0aCBuZWVkcyB0byBiZSBkZXRlcm1pbmVkIG9ubHkgd2hlbiB1c2luZyBwYWNrYWdlXG4gIGlmIChwcm9jZXNzLmVudi5JU19FWENBTElEUkFXX05QTV9QQUNLQUdFKSB7XG4gICAgYXNzZXRQYXRoID1cbiAgICAgIHdpbmRvdy5FWENBTElEUkFXX0FTU0VUX1BBVEggfHxcbiAgICAgIGBodHRwczovL3VucGtnLmNvbS8ke3Byb2Nlc3MuZW52LlBLR19OQU1FfUAke3Byb2Nlc3MuZW52LlBLR19WRVJTSU9OfWA7XG5cbiAgICBpZiAoYXNzZXRQYXRoPy5zdGFydHNXaXRoKFwiL1wiKSkge1xuICAgICAgYXNzZXRQYXRoID0gYXNzZXRQYXRoLnJlcGxhY2UoXCIvXCIsIGAke3dpbmRvdy5sb2NhdGlvbi5vcmlnaW59L2ApO1xuICAgIH1cbiAgICBhc3NldFBhdGggPSBgJHthc3NldFBhdGh9L2Rpc3QvZXhjYWxpZHJhdy1hc3NldHMvYDtcbiAgfVxuICBzdmdSb290LmlubmVySFRNTCA9IGBcbiAgJHtTVkdfRVhQT1JUX1RBR31cbiAgJHttZXRhZGF0YX1cbiAgPGRlZnM+XG4gICAgPHN0eWxlPlxuICAgICAgQGZvbnQtZmFjZSB7XG4gICAgICAgIGZvbnQtZmFtaWx5OiBcIlZpcmdpbFwiO1xuICAgICAgICBzcmM6IHVybChcIiR7YXNzZXRQYXRofVZpcmdpbC53b2ZmMlwiKTtcbiAgICAgIH1cbiAgICAgIEBmb250LWZhY2Uge1xuICAgICAgICBmb250LWZhbWlseTogXCJDYXNjYWRpYVwiO1xuICAgICAgICBzcmM6IHVybChcIiR7YXNzZXRQYXRofUNhc2NhZGlhLndvZmYyXCIpO1xuICAgICAgfVxuICAgIDwvc3R5bGU+XG4gIDwvZGVmcz5cbiAgYDtcbiAgLy8gcmVuZGVyIGJhY2tncm91bmQgcmVjdFxuICBpZiAoYXBwU3RhdGUuZXhwb3J0QmFja2dyb3VuZCAmJiB2aWV3QmFja2dyb3VuZENvbG9yKSB7XG4gICAgY29uc3QgcmVjdCA9IHN2Z1Jvb3Qub3duZXJEb2N1bWVudCEuY3JlYXRlRWxlbWVudE5TKFNWR19OUywgXCJyZWN0XCIpO1xuICAgIHJlY3Quc2V0QXR0cmlidXRlKFwieFwiLCBcIjBcIik7XG4gICAgcmVjdC5zZXRBdHRyaWJ1dGUoXCJ5XCIsIFwiMFwiKTtcbiAgICByZWN0LnNldEF0dHJpYnV0ZShcIndpZHRoXCIsIGAke3dpZHRofWApO1xuICAgIHJlY3Quc2V0QXR0cmlidXRlKFwiaGVpZ2h0XCIsIGAke2hlaWdodH1gKTtcbiAgICByZWN0LnNldEF0dHJpYnV0ZShcImZpbGxcIiwgdmlld0JhY2tncm91bmRDb2xvcik7XG4gICAgc3ZnUm9vdC5hcHBlbmRDaGlsZChyZWN0KTtcbiAgfVxuXG4gIGNvbnN0IHJzdmcgPSByb3VnaC5zdmcoc3ZnUm9vdCk7XG4gIHJlbmRlclNjZW5lVG9TdmcoZWxlbWVudHMsIHJzdmcsIHN2Z1Jvb3QsIGZpbGVzIHx8IHt9LCB7XG4gICAgb2Zmc2V0WDogLW1pblggKyBleHBvcnRQYWRkaW5nLFxuICAgIG9mZnNldFk6IC1taW5ZICsgZXhwb3J0UGFkZGluZyxcbiAgICBleHBvcnRXaXRoRGFya01vZGU6IGFwcFN0YXRlLmV4cG9ydFdpdGhEYXJrTW9kZSxcbiAgfSk7XG5cbiAgcmV0dXJuIHN2Z1Jvb3Q7XG59O1xuXG4vLyBjYWxjdWxhdGUgc21hbGxlc3QgYXJlYSB0byBmaXQgdGhlIGNvbnRlbnRzIGluXG5jb25zdCBnZXRDYW52YXNTaXplID0gKFxuICBlbGVtZW50czogcmVhZG9ubHkgTm9uRGVsZXRlZEV4Y2FsaWRyYXdFbGVtZW50W10sXG4gIGV4cG9ydFBhZGRpbmc6IG51bWJlcixcbik6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdID0+IHtcbiAgY29uc3QgW21pblgsIG1pblksIG1heFgsIG1heFldID0gZ2V0Q29tbW9uQm91bmRzKGVsZW1lbnRzKTtcbiAgY29uc3Qgd2lkdGggPSBkaXN0YW5jZShtaW5YLCBtYXhYKSArIGV4cG9ydFBhZGRpbmcgKiAyO1xuICBjb25zdCBoZWlnaHQgPSBkaXN0YW5jZShtaW5ZLCBtYXhZKSArIGV4cG9ydFBhZGRpbmcgKyBleHBvcnRQYWRkaW5nO1xuXG4gIHJldHVybiBbbWluWCwgbWluWSwgd2lkdGgsIGhlaWdodF07XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0RXhwb3J0U2l6ZSA9IChcbiAgZWxlbWVudHM6IHJlYWRvbmx5IE5vbkRlbGV0ZWRFeGNhbGlkcmF3RWxlbWVudFtdLFxuICBleHBvcnRQYWRkaW5nOiBudW1iZXIsXG4gIHNjYWxlOiBudW1iZXIsXG4pOiBbbnVtYmVyLCBudW1iZXJdID0+IHtcbiAgY29uc3QgWywgLCB3aWR0aCwgaGVpZ2h0XSA9IGdldENhbnZhc1NpemUoZWxlbWVudHMsIGV4cG9ydFBhZGRpbmcpLm1hcChcbiAgICAoZGltZW5zaW9uKSA9PiBNYXRoLnRydW5jKGRpbWVuc2lvbiAqIHNjYWxlKSxcbiAgKTtcblxuICByZXR1cm4gW3dpZHRoLCBoZWlnaHRdO1xufTtcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///../../scene/export.ts\n");
|
|
3254
3254
|
|
|
3255
3255
|
/***/ }),
|
|
3256
3256
|
|
|
@@ -3338,7 +3338,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
|
|
|
3338
3338
|
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|
3339
3339
|
|
|
3340
3340
|
"use strict";
|
|
3341
|
-
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"allowFullScreen\": () => (/* binding */ allowFullScreen),\n/* harmony export */ \"arrayToMap\": () => (/* binding */ arrayToMap),\n/* harmony export */ \"bytesToHexString\": () => (/* binding */ bytesToHexString),\n/* harmony export */ \"capitalizeString\": () => (/* binding */ capitalizeString),\n/* harmony export */ \"chunk\": () => (/* binding */ chunk),\n/* harmony export */ \"debounce\": () => (/* binding */ debounce),\n/* harmony export */ \"distance\": () => (/* binding */ distance),\n/* harmony export */ \"exitFullScreen\": () => (/* binding */ exitFullScreen),\n/* harmony export */ \"findIndex\": () => (/* binding */ findIndex),\n/* harmony export */ \"findLastIndex\": () => (/* binding */ findLastIndex),\n/* harmony export */ \"focusNearestParent\": () => (/* binding */ focusNearestParent),\n/* harmony export */ \"getDateTime\": () => (/* binding */ getDateTime),\n/* harmony export */ \"getFontFamilyString\": () => (/* binding */ getFontFamilyString),\n/* harmony export */ \"getFontString\": () => (/* binding */ getFontString),\n/* harmony export */ \"getFrame\": () => (/* binding */ getFrame),\n/* harmony export */ \"getGlobalCSSVariable\": () => (/* binding */ getGlobalCSSVariable),\n/* harmony export */ \"getNearestScrollableContainer\": () => (/* binding */ getNearestScrollableContainer),\n/* harmony export */ \"getShortcutKey\": () => (/* binding */ getShortcutKey),\n/* harmony export */ \"getUpdatedTimestamp\": () => (/* binding */ getUpdatedTimestamp),\n/* harmony export */ \"getVersion\": () => (/* binding */ getVersion),\n/* harmony export */ \"isFullScreen\": () => (/* binding */ isFullScreen),\n/* harmony export */ \"isInputLike\": () => (/* binding */ isInputLike),\n/* harmony export */ \"isPrimitive\": () => (/* binding */ isPrimitive),\n/* harmony export */ \"isProdEnv\": () => (/* binding */ isProdEnv),\n/* harmony export */ \"isPromiseLike\": () => (/* binding */ isPromiseLike),\n/* harmony export */ \"isRTL\": () => (/* binding */ isRTL),\n/* harmony export */ \"isTestEnv\": () => (/* binding */ isTestEnv),\n/* harmony export */ \"isToolIcon\": () => (/* binding */ isToolIcon),\n/* harmony export */ \"isTransparent\": () => (/* binding */ isTransparent),\n/* harmony export */ \"isWritableElement\": () => (/* binding */ isWritableElement),\n/* harmony export */ \"muteFSAbortError\": () => (/* binding */ muteFSAbortError),\n/* harmony export */ \"nFormatter\": () => (/* binding */ nFormatter),\n/* harmony export */ \"preventUnload\": () => (/* binding */ preventUnload),\n/* harmony export */ \"queryFocusableElements\": () => (/* binding */ queryFocusableElements),\n/* harmony export */ \"removeSelection\": () => (/* binding */ removeSelection),\n/* harmony export */ \"resetCursor\": () => (/* binding */ resetCursor),\n/* harmony export */ \"resolvablePromise\": () => (/* binding */ resolvablePromise),\n/* harmony export */ \"sceneCoordsToViewportCoords\": () => (/* binding */ sceneCoordsToViewportCoords),\n/* harmony export */ \"selectNode\": () => (/* binding */ selectNode),\n/* harmony export */ \"setCursor\": () => (/* binding */ setCursor),\n/* harmony export */ \"setCursorForShape\": () => (/* binding */ setCursorForShape),\n/* harmony export */ \"setDateTimeForTests\": () => (/* binding */ setDateTimeForTests),\n/* harmony export */ \"setEraserCursor\": () => (/* binding */ setEraserCursor),\n/* harmony export */ \"supportsEmoji\": () => (/* binding */ supportsEmoji),\n/* harmony export */ \"throttleRAF\": () => (/* binding */ throttleRAF),\n/* harmony export */ \"tupleToCoors\": () => (/* binding */ tupleToCoors),\n/* harmony export */ \"updateActiveTool\": () => (/* binding */ updateActiveTool),\n/* harmony export */ \"updateObject\": () => (/* binding */ updateObject),\n/* harmony export */ \"viewportCoordsToSceneCoords\": () => (/* binding */ viewportCoordsToSceneCoords),\n/* harmony export */ \"withBatchedUpdates\": () => (/* binding */ withBatchedUpdates),\n/* harmony export */ \"withBatchedUpdatesThrottled\": () => (/* binding */ withBatchedUpdatesThrottled),\n/* harmony export */ \"wrapEvent\": () => (/* binding */ wrapEvent)\n/* harmony export */ });\n/* harmony import */ var open_color__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! open-color */ \"../../../node_modules/open-color/open-color.json\");\n/* harmony import */ var _colors__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./colors */ \"../../colors.ts\");\n/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./constants */ \"../../constants.ts\");\n/* harmony import */ var react_dom__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react-dom */ \"react-dom\");\n/* harmony import */ var react_dom__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(react_dom__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var _keys__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./keys */ \"../../keys.ts\");\n\n\n\n\n\nlet mockDateTime = null;\nconst setDateTimeForTests = (dateTime) => {\n mockDateTime = dateTime;\n};\nconst getDateTime = () => {\n if (mockDateTime) {\n return mockDateTime;\n }\n const date = new Date();\n const year = date.getFullYear();\n const month = `${date.getMonth() + 1}`.padStart(2, \"0\");\n const day = `${date.getDate()}`.padStart(2, \"0\");\n const hr = `${date.getHours()}`.padStart(2, \"0\");\n const min = `${date.getMinutes()}`.padStart(2, \"0\");\n return `${year}-${month}-${day}-${hr}${min}`;\n};\nconst capitalizeString = (str) => str.charAt(0).toUpperCase() + str.slice(1);\nconst isToolIcon = (target) => target instanceof HTMLElement && target.className.includes(\"ToolIcon\");\nconst isInputLike = (target) => (target instanceof HTMLElement && target.dataset.type === \"wysiwyg\") ||\n target instanceof HTMLBRElement || // newline in wysiwyg\n target instanceof HTMLInputElement ||\n target instanceof HTMLTextAreaElement ||\n target instanceof HTMLSelectElement;\nconst isWritableElement = (target) => (target instanceof HTMLElement && target.dataset.type === \"wysiwyg\") ||\n target instanceof HTMLBRElement || // newline in wysiwyg\n target instanceof HTMLTextAreaElement ||\n (target instanceof HTMLInputElement &&\n (target.type === \"text\" || target.type === \"number\"));\nconst getFontFamilyString = ({ fontFamily, }) => {\n for (const [fontFamilyString, id] of Object.entries(_constants__WEBPACK_IMPORTED_MODULE_2__.FONT_FAMILY)) {\n if (id === fontFamily) {\n return `${fontFamilyString}, ${_constants__WEBPACK_IMPORTED_MODULE_2__.WINDOWS_EMOJI_FALLBACK_FONT}`;\n }\n }\n return _constants__WEBPACK_IMPORTED_MODULE_2__.WINDOWS_EMOJI_FALLBACK_FONT;\n};\n/** returns fontSize+fontFamily string for assignment to DOM elements */\nconst getFontString = ({ fontSize, fontFamily, }) => {\n return `${fontSize}px ${getFontFamilyString({ fontFamily })}`;\n};\nconst debounce = (fn, timeout) => {\n let handle = 0;\n let lastArgs = null;\n const ret = (...args) => {\n lastArgs = args;\n clearTimeout(handle);\n handle = window.setTimeout(() => {\n lastArgs = null;\n fn(...args);\n }, timeout);\n };\n ret.flush = () => {\n clearTimeout(handle);\n if (lastArgs) {\n const _lastArgs = lastArgs;\n lastArgs = null;\n fn(..._lastArgs);\n }\n };\n ret.cancel = () => {\n lastArgs = null;\n clearTimeout(handle);\n };\n return ret;\n};\n// throttle callback to execute once per animation frame\nconst throttleRAF = (fn, opts) => {\n let timerId = null;\n let lastArgs = null;\n let lastArgsTrailing = null;\n const scheduleFunc = (args) => {\n timerId = window.requestAnimationFrame(() => {\n timerId = null;\n fn(...args);\n lastArgs = null;\n if (lastArgsTrailing) {\n lastArgs = lastArgsTrailing;\n lastArgsTrailing = null;\n scheduleFunc(lastArgs);\n }\n });\n };\n const ret = (...args) => {\n if (false) {}\n lastArgs = args;\n if (timerId === null) {\n scheduleFunc(lastArgs);\n }\n else if (opts === null || opts === void 0 ? void 0 : opts.trailing) {\n lastArgsTrailing = args;\n }\n };\n ret.flush = () => {\n if (timerId !== null) {\n cancelAnimationFrame(timerId);\n timerId = null;\n }\n if (lastArgs) {\n fn(...(lastArgsTrailing || lastArgs));\n lastArgs = lastArgsTrailing = null;\n }\n };\n ret.cancel = () => {\n lastArgs = lastArgsTrailing = null;\n if (timerId !== null) {\n cancelAnimationFrame(timerId);\n timerId = null;\n }\n };\n return ret;\n};\n// https://github.com/lodash/lodash/blob/es/chunk.js\nconst chunk = (array, size) => {\n if (!array.length || size < 1) {\n return [];\n }\n let index = 0;\n let resIndex = 0;\n const result = Array(Math.ceil(array.length / size));\n while (index < array.length) {\n result[resIndex++] = array.slice(index, (index += size));\n }\n return result;\n};\nconst selectNode = (node) => {\n const selection = window.getSelection();\n if (selection) {\n const range = document.createRange();\n range.selectNodeContents(node);\n selection.removeAllRanges();\n selection.addRange(range);\n }\n};\nconst removeSelection = () => {\n const selection = window.getSelection();\n if (selection) {\n selection.removeAllRanges();\n }\n};\nconst distance = (x, y) => Math.abs(x - y);\nconst updateActiveTool = (appState, data) => {\n if (data.type === \"custom\") {\n return Object.assign(Object.assign({}, appState.activeTool), { type: \"custom\", customType: data.customType });\n }\n return Object.assign(Object.assign({}, appState.activeTool), { lastActiveToolBeforeEraser: data.lastActiveToolBeforeEraser === undefined\n ? appState.activeTool.lastActiveToolBeforeEraser\n : data.lastActiveToolBeforeEraser, type: data.type, customType: null });\n};\nconst resetCursor = (canvas) => {\n if (canvas) {\n canvas.style.cursor = \"\";\n }\n};\nconst setCursor = (canvas, cursor) => {\n if (canvas) {\n canvas.style.cursor = cursor;\n }\n};\nlet eraserCanvasCache;\nlet previewDataURL;\nconst setEraserCursor = (canvas, theme) => {\n const cursorImageSizePx = 20;\n const drawCanvas = () => {\n const isDarkTheme = theme === _constants__WEBPACK_IMPORTED_MODULE_2__.THEME.DARK;\n eraserCanvasCache = document.createElement(\"canvas\");\n eraserCanvasCache.theme = theme;\n eraserCanvasCache.height = cursorImageSizePx;\n eraserCanvasCache.width = cursorImageSizePx;\n const context = eraserCanvasCache.getContext(\"2d\");\n context.lineWidth = 1;\n context.beginPath();\n context.arc(eraserCanvasCache.width / 2, eraserCanvasCache.height / 2, 5, 0, 2 * Math.PI);\n context.fillStyle = isDarkTheme ? open_color__WEBPACK_IMPORTED_MODULE_0__.black : open_color__WEBPACK_IMPORTED_MODULE_0__.white;\n context.fill();\n context.strokeStyle = isDarkTheme ? open_color__WEBPACK_IMPORTED_MODULE_0__.white : open_color__WEBPACK_IMPORTED_MODULE_0__.black;\n context.stroke();\n previewDataURL = eraserCanvasCache.toDataURL(_constants__WEBPACK_IMPORTED_MODULE_2__.MIME_TYPES.svg);\n };\n if (!eraserCanvasCache || eraserCanvasCache.theme !== theme) {\n drawCanvas();\n }\n setCursor(canvas, `url(${previewDataURL}) ${cursorImageSizePx / 2} ${cursorImageSizePx / 2}, auto`);\n};\nconst setCursorForShape = (canvas, appState) => {\n if (!canvas) {\n return;\n }\n if (appState.activeTool.type === \"selection\") {\n resetCursor(canvas);\n }\n else if (appState.activeTool.type === \"eraser\") {\n setEraserCursor(canvas, appState.theme);\n // do nothing if image tool is selected which suggests there's\n // a image-preview set as the cursor\n // Ignore custom type as well and let host decide\n }\n else if (![\"image\", \"custom\"].includes(appState.activeTool.type)) {\n canvas.style.cursor = _constants__WEBPACK_IMPORTED_MODULE_2__.CURSOR_TYPE.CROSSHAIR;\n }\n};\nconst isFullScreen = () => { var _a; return ((_a = document.fullscreenElement) === null || _a === void 0 ? void 0 : _a.nodeName) === \"HTML\"; };\nconst allowFullScreen = () => document.documentElement.requestFullscreen();\nconst exitFullScreen = () => document.exitFullscreen();\nconst getShortcutKey = (shortcut) => {\n shortcut = shortcut\n .replace(/\\bAlt\\b/i, \"Alt\")\n .replace(/\\bShift\\b/i, \"Shift\")\n .replace(/\\b(Enter|Return)\\b/i, \"Enter\")\n .replace(/\\bDel\\b/i, \"Delete\");\n if (_keys__WEBPACK_IMPORTED_MODULE_4__.isDarwin) {\n return shortcut\n .replace(/\\bCtrlOrCmd\\b/i, \"Cmd\")\n .replace(/\\bAlt\\b/i, \"Option\");\n }\n return shortcut.replace(/\\bCtrlOrCmd\\b/i, \"Ctrl\");\n};\nconst viewportCoordsToSceneCoords = ({ clientX, clientY }, { zoom, offsetLeft, offsetTop, scrollX, scrollY, }) => {\n const invScale = 1 / zoom.value;\n const x = (clientX - offsetLeft) * invScale - scrollX;\n const y = (clientY - offsetTop) * invScale - scrollY;\n return { x, y };\n};\nconst sceneCoordsToViewportCoords = ({ sceneX, sceneY }, { zoom, offsetLeft, offsetTop, scrollX, scrollY, }) => {\n const x = (sceneX + scrollX) * zoom.value + offsetLeft;\n const y = (sceneY + scrollY) * zoom.value + offsetTop;\n return { x, y };\n};\nconst getGlobalCSSVariable = (name) => getComputedStyle(document.documentElement).getPropertyValue(`--${name}`);\nconst RS_LTR_CHARS = \"A-Za-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02B8\\u0300-\\u0590\\u0800-\\u1FFF\" +\n \"\\u2C00-\\uFB1C\\uFDFE-\\uFE6F\\uFEFD-\\uFFFF\";\nconst RS_RTL_CHARS = \"\\u0591-\\u07FF\\uFB1D-\\uFDFD\\uFE70-\\uFEFC\";\nconst RE_RTL_CHECK = new RegExp(`^[^${RS_LTR_CHARS}]*[${RS_RTL_CHARS}]`);\n/**\n * Checks whether first directional character is RTL. Meaning whether it starts\n * with RTL characters, or indeterminate (numbers etc.) characters followed by\n * RTL.\n * See https://github.com/excalidraw/excalidraw/pull/1722#discussion_r436340171\n */\nconst isRTL = (text) => RE_RTL_CHECK.test(text);\nconst tupleToCoors = (xyTuple) => {\n const [x, y] = xyTuple;\n return { x, y };\n};\n/** use as a rejectionHandler to mute filesystem Abort errors */\nconst muteFSAbortError = (error) => {\n if ((error === null || error === void 0 ? void 0 : error.name) === \"AbortError\") {\n console.warn(error);\n return;\n }\n throw error;\n};\nconst findIndex = (array, cb, fromIndex = 0) => {\n if (fromIndex < 0) {\n fromIndex = array.length + fromIndex;\n }\n fromIndex = Math.min(array.length, Math.max(fromIndex, 0));\n let index = fromIndex - 1;\n while (++index < array.length) {\n if (cb(array[index], index, array)) {\n return index;\n }\n }\n return -1;\n};\nconst findLastIndex = (array, cb, fromIndex = array.length - 1) => {\n if (fromIndex < 0) {\n fromIndex = array.length + fromIndex;\n }\n fromIndex = Math.min(array.length - 1, Math.max(fromIndex, 0));\n let index = fromIndex + 1;\n while (--index > -1) {\n if (cb(array[index], index, array)) {\n return index;\n }\n }\n return -1;\n};\nconst isTransparent = (color) => {\n const isRGBTransparent = color.length === 5 && color.substr(4, 1) === \"0\";\n const isRRGGBBTransparent = color.length === 9 && color.substr(7, 2) === \"00\";\n return (isRGBTransparent ||\n isRRGGBBTransparent ||\n color === _colors__WEBPACK_IMPORTED_MODULE_1__[\"default\"].elementBackground[0]);\n};\nconst resolvablePromise = () => {\n let resolve;\n let reject;\n const promise = new Promise((_resolve, _reject) => {\n resolve = _resolve;\n reject = _reject;\n });\n promise.resolve = resolve;\n promise.reject = reject;\n return promise;\n};\n/**\n * @param func handler taking at most single parameter (event).\n */\nconst withBatchedUpdates = (func) => ((event) => {\n (0,react_dom__WEBPACK_IMPORTED_MODULE_3__.unstable_batchedUpdates)(func, event);\n});\n/**\n * barches React state updates and throttles the calls to a single call per\n * animation frame\n */\nconst withBatchedUpdatesThrottled = (func) => {\n // @ts-ignore\n return throttleRAF(((event) => {\n (0,react_dom__WEBPACK_IMPORTED_MODULE_3__.unstable_batchedUpdates)(func, event);\n }));\n};\n//https://stackoverflow.com/a/9462382/8418\nconst nFormatter = (num, digits) => {\n const si = [\n { value: 1, symbol: \"b\" },\n { value: 1e3, symbol: \"k\" },\n { value: 1e6, symbol: \"M\" },\n { value: 1e9, symbol: \"G\" },\n ];\n const rx = /\\.0+$|(\\.[0-9]*[1-9])0+$/;\n let index;\n for (index = si.length - 1; index > 0; index--) {\n if (num >= si[index].value) {\n break;\n }\n }\n return ((num / si[index].value).toFixed(digits).replace(rx, \"$1\") + si[index].symbol);\n};\nconst getVersion = () => {\n var _a;\n return (((_a = document.querySelector('meta[name=\"version\"]')) === null || _a === void 0 ? void 0 : _a.content) ||\n _constants__WEBPACK_IMPORTED_MODULE_2__.DEFAULT_VERSION);\n};\n// Adapted from https://github.com/Modernizr/Modernizr/blob/master/feature-detects/emoji.js\nconst supportsEmoji = () => {\n const canvas = document.createElement(\"canvas\");\n const ctx = canvas.getContext(\"2d\");\n if (!ctx) {\n return false;\n }\n const offset = 12;\n ctx.fillStyle = \"#f00\";\n ctx.textBaseline = \"top\";\n ctx.font = \"32px Arial\";\n // Modernizr used 🐨, but it is sort of supported on Windows 7.\n // Luckily 😀 isn't supported.\n ctx.fillText(\"😀\", 0, 0);\n return ctx.getImageData(offset, offset, 1, 1).data[0] !== 0;\n};\nconst getNearestScrollableContainer = (element) => {\n let parent = element.parentElement;\n while (parent) {\n if (parent === document.body) {\n return document;\n }\n const { overflowY } = window.getComputedStyle(parent);\n const hasScrollableContent = parent.scrollHeight > parent.clientHeight;\n if (hasScrollableContent &&\n (overflowY === \"auto\" ||\n overflowY === \"scroll\" ||\n overflowY === \"overlay\")) {\n return parent;\n }\n parent = parent.parentElement;\n }\n return document;\n};\nconst focusNearestParent = (element) => {\n let parent = element.parentElement;\n while (parent) {\n if (parent.tabIndex > -1) {\n parent.focus();\n return;\n }\n parent = parent.parentElement;\n }\n};\nconst preventUnload = (event) => {\n event.preventDefault();\n // NOTE: modern browsers no longer allow showing a custom message here\n event.returnValue = \"\";\n};\nconst bytesToHexString = (bytes) => {\n return Array.from(bytes)\n .map((byte) => `0${byte.toString(16)}`.slice(-2))\n .join(\"\");\n};\nconst getUpdatedTimestamp = () => (isTestEnv() ? 1 : Date.now());\n/**\n * Transforms array of objects containing `id` attribute,\n * or array of ids (strings), into a Map, keyd by `id`.\n */\nconst arrayToMap = (items) => {\n return items.reduce((acc, element) => {\n acc.set(typeof element === \"string\" ? element : element.id, element);\n return acc;\n }, new Map());\n};\nconst isTestEnv = () => { var _a; return typeof process !== \"undefined\" && ((_a = ({\"REACT_APP_BACKEND_V2_GET_URL\":\"https://json-dev.excalidraw.com/api/v2/\",\"REACT_APP_BACKEND_V2_POST_URL\":\"https://json-dev.excalidraw.com/api/v2/post/\",\"REACT_APP_LIBRARY_URL\":\"https://libraries.excalidraw.com\",\"REACT_APP_LIBRARY_BACKEND\":\"https://us-central1-excalidraw-room-persistence.cloudfunctions.net/libraries\",\"REACT_APP_WS_SERVER_URL\":\"http://localhost:3002\",\"REACT_APP_PORTAL_URL\":\"\",\"REACT_APP_FIREBASE_CONFIG\":\"{\\\"apiKey\\\":\\\"AIzaSyCMkxA60XIW8KbqMYL7edC4qT5l4qHX2h8\\\",\\\"authDomain\\\":\\\"excalidraw-oss-dev.firebaseapp.com\\\",\\\"projectId\\\":\\\"excalidraw-oss-dev\\\",\\\"storageBucket\\\":\\\"excalidraw-oss-dev.appspot.com\\\",\\\"messagingSenderId\\\":\\\"664559512677\\\",\\\"appId\\\":\\\"1:664559512677:web:a385181f2928d328a7aa8c\\\"}\",\"REACT_APP_DEV_ENABLE_SW\":\"\",\"REACT_APP_DEV_DISABLE_LIVE_RELOAD\":\"\",\"PKG_NAME\":\"@excalidraw/excalidraw\",\"PKG_VERSION\":\"0.12.0-426b5d9\",\"IS_EXCALIDRAW_NPM_PACKAGE\":true})) === null || _a === void 0 ? void 0 : _a.NODE_ENV) === \"test\"; };\nconst isProdEnv = () => { var _a; return typeof process !== \"undefined\" && ((_a = ({\"REACT_APP_BACKEND_V2_GET_URL\":\"https://json-dev.excalidraw.com/api/v2/\",\"REACT_APP_BACKEND_V2_POST_URL\":\"https://json-dev.excalidraw.com/api/v2/post/\",\"REACT_APP_LIBRARY_URL\":\"https://libraries.excalidraw.com\",\"REACT_APP_LIBRARY_BACKEND\":\"https://us-central1-excalidraw-room-persistence.cloudfunctions.net/libraries\",\"REACT_APP_WS_SERVER_URL\":\"http://localhost:3002\",\"REACT_APP_PORTAL_URL\":\"\",\"REACT_APP_FIREBASE_CONFIG\":\"{\\\"apiKey\\\":\\\"AIzaSyCMkxA60XIW8KbqMYL7edC4qT5l4qHX2h8\\\",\\\"authDomain\\\":\\\"excalidraw-oss-dev.firebaseapp.com\\\",\\\"projectId\\\":\\\"excalidraw-oss-dev\\\",\\\"storageBucket\\\":\\\"excalidraw-oss-dev.appspot.com\\\",\\\"messagingSenderId\\\":\\\"664559512677\\\",\\\"appId\\\":\\\"1:664559512677:web:a385181f2928d328a7aa8c\\\"}\",\"REACT_APP_DEV_ENABLE_SW\":\"\",\"REACT_APP_DEV_DISABLE_LIVE_RELOAD\":\"\",\"PKG_NAME\":\"@excalidraw/excalidraw\",\"PKG_VERSION\":\"0.12.0-426b5d9\",\"IS_EXCALIDRAW_NPM_PACKAGE\":true})) === null || _a === void 0 ? void 0 : _a.NODE_ENV) === \"production\"; };\nconst wrapEvent = (name, nativeEvent) => {\n return new CustomEvent(name, {\n detail: {\n nativeEvent,\n },\n cancelable: true,\n });\n};\nconst updateObject = (obj, updates) => {\n let didChange = false;\n for (const key in updates) {\n const value = updates[key];\n if (typeof value !== \"undefined\") {\n if (obj[key] === value &&\n // if object, always update because its attrs could have changed\n (typeof value !== \"object\" || value === null)) {\n continue;\n }\n didChange = true;\n }\n }\n if (!didChange) {\n return obj;\n }\n return Object.assign(Object.assign({}, obj), updates);\n};\nconst isPrimitive = (val) => {\n const type = typeof val;\n return val == null || (type !== \"object\" && type !== \"function\");\n};\nconst getFrame = () => {\n try {\n return window.self === window.top ? \"top\" : \"iframe\";\n }\n catch (error) {\n return \"iframe\";\n }\n};\nconst isPromiseLike = (value) => {\n return (!!value &&\n typeof value === \"object\" &&\n \"then\" in value &&\n \"catch\" in value &&\n \"finally\" in value);\n};\nconst queryFocusableElements = (container) => {\n const focusableElements = container === null || container === void 0 ? void 0 : container.querySelectorAll(\"button, a, input, select, textarea, div[tabindex], label[tabindex]\");\n return focusableElements\n ? Array.from(focusableElements).filter((element) => element.tabIndex > -1 && !element.disabled)\n : [];\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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LFFBQVEsSUFBSSxJQUFJLEtBQUssVUFBVSxDQUFDLENBQUM7QUFDbkUsQ0FBQyxDQUFDO0FBRUssTUFBTSxRQUFRLEdBQUcsR0FBRyxFQUFFO0lBQzNCLElBQUk7UUFDRixPQUFPLE1BQU0sQ0FBQyxJQUFJLEtBQUssTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUM7S0FDdEQ7SUFBQyxPQUFPLEtBQUssRUFBRTtRQUNkLE9BQU8sUUFBUSxDQUFDO0tBQ2pCO0FBQ0gsQ0FBQyxDQUFDO0FBRUssTUFBTSxhQUFhLEdBQUcsQ0FDM0IsS0FBVSxFQUNzQyxFQUFFO0lBQ2xELE9BQU8sQ0FDTCxDQUFDLENBQUMsS0FBSztRQUNQLE9BQU8sS0FBSyxLQUFLLFFBQVE7UUFDekIsTUFBTSxJQUFJLEtBQUs7UUFDZixPQUFPLElBQUksS0FBSztRQUNoQixTQUFTLElBQUksS0FBSyxDQUNuQixDQUFDO0FBQ0osQ0FBQyxDQUFDO0FBRUssTUFBTSxzQkFBc0IsR0FBRyxDQUFDLFNBQTZCLEVBQUUsRUFBRTtJQUN0RSxNQUFNLGlCQUFpQixHQUFHLFNBQVMsYUFBVCxTQUFTLHVCQUFULFNBQVMsQ0FBRSxnQkFBZ0IsQ0FDbkQsb0VBQW9FLENBQ3JFLENBQUM7SUFFRixPQUFPLGlCQUFpQjtRQUN0QixDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLE1BQU0sQ0FDbEMsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUNWLE9BQU8sQ0FBQyxRQUFRLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBRSxPQUE0QixDQUFDLFFBQVEsQ0FDbkU7UUFDSCxDQUFDLENBQUMsRUFBRSxDQUFDO0FBQ1QsQ0FBQyxDQUFDIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4uLy4uL3V0aWxzLnRzPzc2M2EiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IG9jIGZyb20gXCJvcGVuLWNvbG9yXCI7XG5cbmltcG9ydCBjb2xvcnMgZnJvbSBcIi4vY29sb3JzXCI7XG5pbXBvcnQge1xuICBDVVJTT1JfVFlQRSxcbiAgREVGQVVMVF9WRVJTSU9OLFxuICBFVkVOVCxcbiAgRk9OVF9GQU1JTFksXG4gIE1JTUVfVFlQRVMsXG4gIFRIRU1FLFxuICBXSU5ET1dTX0VNT0pJX0ZBTExCQUNLX0ZPTlQsXG59IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgRm9udEZhbWlseVZhbHVlcywgRm9udFN0cmluZyB9IGZyb20gXCIuL2VsZW1lbnQvdHlwZXNcIjtcbmltcG9ydCB7IEFwcFN0YXRlLCBEYXRhVVJMLCBMYXN0QWN0aXZlVG9vbEJlZm9yZUVyYXNlciwgWm9vbSB9IGZyb20gXCIuL3R5cGVzXCI7XG5pbXBvcnQgeyB1bnN0YWJsZV9iYXRjaGVkVXBkYXRlcyB9IGZyb20gXCJyZWFjdC1kb21cIjtcbmltcG9ydCB7IGlzRGFyd2luIH0gZnJvbSBcIi4va2V5c1wiO1xuaW1wb3J0IHsgU0hBUEVTIH0gZnJvbSBcIi4vc2hhcGVzXCI7XG5cbmxldCBtb2NrRGF0ZVRpbWU6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuXG5leHBvcnQgY29uc3Qgc2V0RGF0ZVRpbWVGb3JUZXN0cyA9IChkYXRlVGltZTogc3RyaW5nKSA9PiB7XG4gIG1vY2tEYXRlVGltZSA9IGRhdGVUaW1lO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldERhdGVUaW1lID0gKCkgPT4ge1xuICBpZiAobW9ja0RhdGVUaW1lKSB7XG4gICAgcmV0dXJuIG1vY2tEYXRlVGltZTtcbiAgfVxuXG4gIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZSgpO1xuICBjb25zdCB5ZWFyID0gZGF0ZS5nZXRGdWxsWWVhcigpO1xuICBjb25zdCBtb250aCA9IGAke2RhdGUuZ2V0TW9udGgoKSArIDF9YC5wYWRTdGFydCgyLCBcIjBcIik7XG4gIGNvbnN0IGRheSA9IGAke2RhdGUuZ2V0RGF0ZSgpfWAucGFkU3RhcnQoMiwgXCIwXCIpO1xuICBjb25zdCBociA9IGAke2RhdGUuZ2V0SG91cnMoKX1gLnBhZFN0YXJ0KDIsIFwiMFwiKTtcbiAgY29uc3QgbWluID0gYCR7ZGF0ZS5nZXRNaW51dGVzKCl9YC5wYWRTdGFydCgyLCBcIjBcIik7XG5cbiAgcmV0dXJuIGAke3llYXJ9LSR7bW9udGh9LSR7ZGF5fS0ke2hyfSR7bWlufWA7XG59O1xuXG5leHBvcnQgY29uc3QgY2FwaXRhbGl6ZVN0cmluZyA9IChzdHI6IHN0cmluZykgPT5cbiAgc3RyLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgc3RyLnNsaWNlKDEpO1xuXG5leHBvcnQgY29uc3QgaXNUb29sSWNvbiA9IChcbiAgdGFyZ2V0OiBFbGVtZW50IHwgRXZlbnRUYXJnZXQgfCBudWxsLFxuKTogdGFyZ2V0IGlzIEhUTUxFbGVtZW50ID0+XG4gIHRhcmdldCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50ICYmIHRhcmdldC5jbGFzc05hbWUuaW5jbHVkZXMoXCJUb29sSWNvblwiKTtcblxuZXhwb3J0IGNvbnN0IGlzSW5wdXRMaWtlID0gKFxuICB0YXJnZXQ6IEVsZW1lbnQgfCBFdmVudFRhcmdldCB8IG51bGwsXG4pOiB0YXJnZXQgaXNcbiAgfCBIVE1MSW5wdXRFbGVtZW50XG4gIHwgSFRNTFRleHRBcmVhRWxlbWVudFxuICB8IEhUTUxTZWxlY3RFbGVtZW50XG4gIHwgSFRNTEJSRWxlbWVudFxuICB8IEhUTUxEaXZFbGVtZW50ID0+XG4gICh0YXJnZXQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCAmJiB0YXJnZXQuZGF0YXNldC50eXBlID09PSBcInd5c2l3eWdcIikgfHxcbiAgdGFyZ2V0IGluc3RhbmNlb2YgSFRNTEJSRWxlbWVudCB8fCAvLyBuZXdsaW5lIGluIHd5c2l3eWdcbiAgdGFyZ2V0IGluc3RhbmNlb2YgSFRNTElucHV0RWxlbWVudCB8fFxuICB0YXJnZXQgaW5zdGFuY2VvZiBIVE1MVGV4dEFyZWFFbGVtZW50IHx8XG4gIHRhcmdldCBpbnN0YW5jZW9mIEhUTUxTZWxlY3RFbGVtZW50O1xuXG5leHBvcnQgY29uc3QgaXNXcml0YWJsZUVsZW1lbnQgPSAoXG4gIHRhcmdldDogRWxlbWVudCB8IEV2ZW50VGFyZ2V0IHwgbnVsbCxcbik6IHRhcmdldCBpc1xuICB8IEhUTUxJbnB1dEVsZW1lbnRcbiAgfCBIVE1MVGV4dEFyZWFFbGVtZW50XG4gIHwgSFRNTEJSRWxlbWVudFxuICB8IEhUTUxEaXZFbGVtZW50ID0+XG4gICh0YXJnZXQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCAmJiB0YXJnZXQuZGF0YXNldC50eXBlID09PSBcInd5c2l3eWdcIikgfHxcbiAgdGFyZ2V0IGluc3RhbmNlb2YgSFRNTEJSRWxlbWVudCB8fCAvLyBuZXdsaW5lIGluIHd5c2l3eWdcbiAgdGFyZ2V0IGluc3RhbmNlb2YgSFRNTFRleHRBcmVhRWxlbWVudCB8fFxuICAodGFyZ2V0IGluc3RhbmNlb2YgSFRNTElucHV0RWxlbWVudCAmJlxuICAgICh0YXJnZXQudHlwZSA9PT0gXCJ0ZXh0XCIgfHwgdGFyZ2V0LnR5cGUgPT09IFwibnVtYmVyXCIpKTtcblxuZXhwb3J0IGNvbnN0IGdldEZvbnRGYW1pbHlTdHJpbmcgPSAoe1xuICBmb250RmFtaWx5LFxufToge1xuICBmb250RmFtaWx5OiBGb250RmFtaWx5VmFsdWVzO1xufSkgPT4ge1xuICBmb3IgKGNvbnN0IFtmb250RmFtaWx5U3RyaW5nLCBpZF0gb2YgT2JqZWN0LmVudHJpZXMoRk9OVF9GQU1JTFkpKSB7XG4gICAgaWYgKGlkID09PSBmb250RmFtaWx5KSB7XG4gICAgICByZXR1cm4gYCR7Zm9udEZhbWlseVN0cmluZ30sICR7V0lORE9XU19FTU9KSV9GQUxMQkFDS19GT05UfWA7XG4gICAgfVxuICB9XG4gIHJldHVybiBXSU5ET1dTX0VNT0pJX0ZBTExCQUNLX0ZPTlQ7XG59O1xuXG4vKiogcmV0dXJucyBmb250U2l6ZStmb250RmFtaWx5IHN0cmluZyBmb3IgYXNzaWdubWVudCB0byBET00gZWxlbWVudHMgKi9cbmV4cG9ydCBjb25zdCBnZXRGb250U3RyaW5nID0gKHtcbiAgZm9udFNpemUsXG4gIGZvbnRGYW1pbHksXG59OiB7XG4gIGZvbnRTaXplOiBudW1iZXI7XG4gIGZvbnRGYW1pbHk6IEZvbnRGYW1pbHlWYWx1ZXM7XG59KSA9PiB7XG4gIHJldHVybiBgJHtmb250U2l6ZX1weCAke2dldEZvbnRGYW1pbHlTdHJpbmcoeyBmb250RmFtaWx5IH0pfWAgYXMgRm9udFN0cmluZztcbn07XG5cbmV4cG9ydCBjb25zdCBkZWJvdW5jZSA9IDxUIGV4dGVuZHMgYW55W10+KFxuICBmbjogKC4uLmFyZ3M6IFQpID0+IHZvaWQsXG4gIHRpbWVvdXQ6IG51bWJlcixcbikgPT4ge1xuICBsZXQgaGFuZGxlID0gMDtcbiAgbGV0IGxhc3RBcmdzOiBUIHwgbnVsbCA9IG51bGw7XG4gIGNvbnN0IHJldCA9ICguLi5hcmdzOiBUKSA9PiB7XG4gICAgbGFzdEFyZ3MgPSBhcmdzO1xuICAgIGNsZWFyVGltZW91dChoYW5kbGUpO1xuICAgIGhhbmRsZSA9IHdpbmRvdy5zZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGxhc3RBcmdzID0gbnVsbDtcbiAgICAgIGZuKC4uLmFyZ3MpO1xuICAgIH0sIHRpbWVvdXQpO1xuICB9O1xuICByZXQuZmx1c2ggPSAoKSA9PiB7XG4gICAgY2xlYXJUaW1lb3V0KGhhbmRsZSk7XG4gICAgaWYgKGxhc3RBcmdzKSB7XG4gICAgICBjb25zdCBfbGFzdEFyZ3MgPSBsYXN0QXJncztcbiAgICAgIGxhc3RBcmdzID0gbnVsbDtcbiAgICAgIGZuKC4uLl9sYXN0QXJncyk7XG4gICAgfVxuICB9O1xuICByZXQuY2FuY2VsID0gKCkgPT4ge1xuICAgIGxhc3RBcmdzID0gbnVsbDtcbiAgICBjbGVhclRpbWVvdXQoaGFuZGxlKTtcbiAgfTtcbiAgcmV0dXJuIHJldDtcbn07XG5cbi8vIHRocm90dGxlIGNhbGxiYWNrIHRvIGV4ZWN1dGUgb25jZSBwZXIgYW5pbWF0aW9uIGZyYW1lXG5leHBvcnQgY29uc3QgdGhyb3R0bGVSQUYgPSA8VCBleHRlbmRzIGFueVtdPihcbiAgZm46ICguLi5hcmdzOiBUKSA9PiB2b2lkLFxuICBvcHRzPzogeyB0cmFpbGluZz86IGJvb2xlYW4gfSxcbikgPT4ge1xuICBsZXQgdGltZXJJZDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG4gIGxldCBsYXN0QXJnczogVCB8IG51bGwgPSBudWxsO1xuICBsZXQgbGFzdEFyZ3NUcmFpbGluZzogVCB8IG51bGwgPSBudWxsO1xuXG4gIGNvbnN0IHNjaGVkdWxlRnVuYyA9IChhcmdzOiBUKSA9PiB7XG4gICAgdGltZXJJZCA9IHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xuICAgICAgdGltZXJJZCA9IG51bGw7XG4gICAgICBmbiguLi5hcmdzKTtcbiAgICAgIGxhc3RBcmdzID0gbnVsbDtcbiAgICAgIGlmIChsYXN0QXJnc1RyYWlsaW5nKSB7XG4gICAgICAgIGxhc3RBcmdzID0gbGFzdEFyZ3NUcmFpbGluZztcbiAgICAgICAgbGFzdEFyZ3NUcmFpbGluZyA9IG51bGw7XG4gICAgICAgIHNjaGVkdWxlRnVuYyhsYXN0QXJncyk7XG4gICAgICB9XG4gICAgfSk7XG4gIH07XG5cbiAgY29uc3QgcmV0ID0gKC4uLmFyZ3M6IFQpID0+IHtcbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwidGVzdFwiKSB7XG4gICAgICBmbiguLi5hcmdzKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgbGFzdEFyZ3MgPSBhcmdzO1xuICAgIGlmICh0aW1lcklkID09PSBudWxsKSB7XG4gICAgICBzY2hlZHVsZUZ1bmMobGFzdEFyZ3MpO1xuICAgIH0gZWxzZSBpZiAob3B0cz8udHJhaWxpbmcpIHtcbiAgICAgIGxhc3RBcmdzVHJhaWxpbmcgPSBhcmdzO1xuICAgIH1cbiAgfTtcbiAgcmV0LmZsdXNoID0gKCkgPT4ge1xuICAgIGlmICh0aW1lcklkICE9PSBudWxsKSB7XG4gICAgICBjYW5jZWxBbmltYXRpb25GcmFtZSh0aW1lcklkKTtcbiAgICAgIHRpbWVySWQgPSBudWxsO1xuICAgIH1cbiAgICBpZiAobGFzdEFyZ3MpIHtcbiAgICAgIGZuKC4uLihsYXN0QXJnc1RyYWlsaW5nIHx8IGxhc3RBcmdzKSk7XG4gICAgICBsYXN0QXJncyA9IGxhc3RBcmdzVHJhaWxpbmcgPSBudWxsO1xuICAgIH1cbiAgfTtcbiAgcmV0LmNhbmNlbCA9ICgpID0+IHtcbiAgICBsYXN0QXJncyA9IGxhc3RBcmdzVHJhaWxpbmcgPSBudWxsO1xuICAgIGlmICh0aW1lcklkICE9PSBudWxsKSB7XG4gICAgICBjYW5jZWxBbmltYXRpb25GcmFtZSh0aW1lcklkKTtcbiAgICAgIHRpbWVySWQgPSBudWxsO1xuICAgIH1cbiAgfTtcbiAgcmV0dXJuIHJldDtcbn07XG5cbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9sb2Rhc2gvbG9kYXNoL2Jsb2IvZXMvY2h1bmsuanNcbmV4cG9ydCBjb25zdCBjaHVuayA9IDxUIGV4dGVuZHMgYW55PihcbiAgYXJyYXk6IHJlYWRvbmx5IFRbXSxcbiAgc2l6ZTogbnVtYmVyLFxuKTogVFtdW10gPT4ge1xuICBpZiAoIWFycmF5Lmxlbmd0aCB8fCBzaXplIDwgMSkge1xuICAgIHJldHVybiBbXTtcbiAgfVxuICBsZXQgaW5kZXggPSAwO1xuICBsZXQgcmVzSW5kZXggPSAwO1xuICBjb25zdCByZXN1bHQgPSBBcnJheShNYXRoLmNlaWwoYXJyYXkubGVuZ3RoIC8gc2l6ZSkpO1xuICB3aGlsZSAoaW5kZXggPCBhcnJheS5sZW5ndGgpIHtcbiAgICByZXN1bHRbcmVzSW5kZXgrK10gPSBhcnJheS5zbGljZShpbmRleCwgKGluZGV4ICs9IHNpemUpKTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufTtcblxuZXhwb3J0IGNvbnN0IHNlbGVjdE5vZGUgPSAobm9kZTogRWxlbWVudCkgPT4ge1xuICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XG4gIGlmIChzZWxlY3Rpb24pIHtcbiAgICBjb25zdCByYW5nZSA9IGRvY3VtZW50LmNyZWF0ZVJhbmdlKCk7XG4gICAgcmFuZ2Uuc2VsZWN0Tm9kZUNvbnRlbnRzKG5vZGUpO1xuICAgIHNlbGVjdGlvbi5yZW1vdmVBbGxSYW5nZXMoKTtcbiAgICBzZWxlY3Rpb24uYWRkUmFuZ2UocmFuZ2UpO1xuICB9XG59O1xuXG5leHBvcnQgY29uc3QgcmVtb3ZlU2VsZWN0aW9uID0gKCkgPT4ge1xuICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XG4gIGlmIChzZWxlY3Rpb24pIHtcbiAgICBzZWxlY3Rpb24ucmVtb3ZlQWxsUmFuZ2VzKCk7XG4gIH1cbn07XG5cbmV4cG9ydCBjb25zdCBkaXN0YW5jZSA9ICh4OiBudW1iZXIsIHk6IG51bWJlcikgPT4gTWF0aC5hYnMoeCAtIHkpO1xuXG5leHBvcnQgY29uc3QgdXBkYXRlQWN0aXZlVG9vbCA9IChcbiAgYXBwU3RhdGU6IFBpY2s8QXBwU3RhdGUsIFwiYWN0aXZlVG9vbFwiPixcbiAgZGF0YTogKFxuICAgIHwgeyB0eXBlOiB0eXBlb2YgU0hBUEVTW251bWJlcl1bXCJ2YWx1ZVwiXSB8IFwiZXJhc2VyXCIgfVxuICAgIHwgeyB0eXBlOiBcImN1c3RvbVwiOyBjdXN0b21UeXBlOiBzdHJpbmcgfVxuICApICYgeyBsYXN0QWN0aXZlVG9vbEJlZm9yZUVyYXNlcj86IExhc3RBY3RpdmVUb29sQmVmb3JlRXJhc2VyIH0sXG4pOiBBcHBTdGF0ZVtcImFjdGl2ZVRvb2xcIl0gPT4ge1xuICBpZiAoZGF0YS50eXBlID09PSBcImN1c3RvbVwiKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLmFwcFN0YXRlLmFjdGl2ZVRvb2wsXG4gICAgICB0eXBlOiBcImN1c3RvbVwiLFxuICAgICAgY3VzdG9tVHlwZTogZGF0YS5jdXN0b21UeXBlLFxuICAgIH07XG4gIH1cblxuICByZXR1cm4ge1xuICAgIC4uLmFwcFN0YXRlLmFjdGl2ZVRvb2wsXG4gICAgbGFzdEFjdGl2ZVRvb2xCZWZvcmVFcmFzZXI6XG4gICAgICBkYXRhLmxhc3RBY3RpdmVUb29sQmVmb3JlRXJhc2VyID09PSB1bmRlZmluZWRcbiAgICAgICAgPyBhcHBTdGF0ZS5hY3RpdmVUb29sLmxhc3RBY3RpdmVUb29sQmVmb3JlRXJhc2VyXG4gICAgICAgIDogZGF0YS5sYXN0QWN0aXZlVG9vbEJlZm9yZUVyYXNlcixcbiAgICB0eXBlOiBkYXRhLnR5cGUsXG4gICAgY3VzdG9tVHlwZTogbnVsbCxcbiAgfTtcbn07XG5cbmV4cG9ydCBjb25zdCByZXNldEN1cnNvciA9IChjYW52YXM6IEhUTUxDYW52YXNFbGVtZW50IHwgbnVsbCkgPT4ge1xuICBpZiAoY2FudmFzKSB7XG4gICAgY2FudmFzLnN0eWxlLmN1cnNvciA9IFwiXCI7XG4gIH1cbn07XG5cbmV4cG9ydCBjb25zdCBzZXRDdXJzb3IgPSAoY2FudmFzOiBIVE1MQ2FudmFzRWxlbWVudCB8IG51bGwsIGN1cnNvcjogc3RyaW5nKSA9PiB7XG4gIGlmIChjYW52YXMpIHtcbiAgICBjYW52YXMuc3R5bGUuY3Vyc29yID0gY3Vyc29yO1xuICB9XG59O1xuXG5sZXQgZXJhc2VyQ2FudmFzQ2FjaGU6IGFueTtcbmxldCBwcmV2aWV3RGF0YVVSTDogc3RyaW5nO1xuZXhwb3J0IGNvbnN0IHNldEVyYXNlckN1cnNvciA9IChcbiAgY2FudmFzOiBIVE1MQ2FudmFzRWxlbWVudCB8IG51bGwsXG4gIHRoZW1lOiBBcHBTdGF0ZVtcInRoZW1lXCJdLFxuKSA9PiB7XG4gIGNvbnN0IGN1cnNvckltYWdlU2l6ZVB4ID0gMjA7XG5cbiAgY29uc3QgZHJhd0NhbnZhcyA9ICgpID0+IHtcbiAgICBjb25zdCBpc0RhcmtUaGVtZSA9IHRoZW1lID09PSBUSEVNRS5EQVJLO1xuICAgIGVyYXNlckNhbnZhc0NhY2hlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImNhbnZhc1wiKTtcbiAgICBlcmFzZXJDYW52YXNDYWNoZS50aGVtZSA9IHRoZW1lO1xuICAgIGVyYXNlckNhbnZhc0NhY2hlLmhlaWdodCA9IGN1cnNvckltYWdlU2l6ZVB4O1xuICAgIGVyYXNlckNhbnZhc0NhY2hlLndpZHRoID0gY3Vyc29ySW1hZ2VTaXplUHg7XG4gICAgY29uc3QgY29udGV4dCA9IGVyYXNlckNhbnZhc0NhY2hlLmdldENvbnRleHQoXCIyZFwiKSE7XG4gICAgY29udGV4dC5saW5lV2lkdGggPSAxO1xuICAgIGNvbnRleHQuYmVnaW5QYXRoKCk7XG4gICAgY29udGV4dC5hcmMoXG4gICAgICBlcmFzZXJDYW52YXNDYWNoZS53aWR0aCAvIDIsXG4gICAgICBlcmFzZXJDYW52YXNDYWNoZS5oZWlnaHQgLyAyLFxuICAgICAgNSxcbiAgICAgIDAsXG4gICAgICAyICogTWF0aC5QSSxcbiAgICApO1xuICAgIGNvbnRleHQuZmlsbFN0eWxlID0gaXNEYXJrVGhlbWUgPyBvYy5ibGFjayA6IG9jLndoaXRlO1xuICAgIGNvbnRleHQuZmlsbCgpO1xuICAgIGNvbnRleHQuc3Ryb2tlU3R5bGUgPSBpc0RhcmtUaGVtZSA/IG9jLndoaXRlIDogb2MuYmxhY2s7XG4gICAgY29udGV4dC5zdHJva2UoKTtcbiAgICBwcmV2aWV3RGF0YVVSTCA9IGVyYXNlckNhbnZhc0NhY2hlLnRvRGF0YVVSTChNSU1FX1RZUEVTLnN2ZykgYXMgRGF0YVVSTDtcbiAgfTtcbiAgaWYgKCFlcmFzZXJDYW52YXNDYWNoZSB8fCBlcmFzZXJDYW52YXNDYWNoZS50aGVtZSAhPT0gdGhlbWUpIHtcbiAgICBkcmF3Q2FudmFzKCk7XG4gIH1cblxuICBzZXRDdXJzb3IoXG4gICAgY2FudmFzLFxuICAgIGB1cmwoJHtwcmV2aWV3RGF0YVVSTH0pICR7Y3Vyc29ySW1hZ2VTaXplUHggLyAyfSAke1xuICAgICAgY3Vyc29ySW1hZ2VTaXplUHggLyAyXG4gICAgfSwgYXV0b2AsXG4gICk7XG59O1xuXG5leHBvcnQgY29uc3Qgc2V0Q3Vyc29yRm9yU2hhcGUgPSAoXG4gIGNhbnZhczogSFRNTENhbnZhc0VsZW1lbnQgfCBudWxsLFxuICBhcHBTdGF0ZTogQXBwU3RhdGUsXG4pID0+IHtcbiAgaWYgKCFjYW52YXMpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKGFwcFN0YXRlLmFjdGl2ZVRvb2wudHlwZSA9PT0gXCJzZWxlY3Rpb25cIikge1xuICAgIHJlc2V0Q3Vyc29yKGNhbnZhcyk7XG4gIH0gZWxzZSBpZiAoYXBwU3RhdGUuYWN0aXZlVG9vbC50eXBlID09PSBcImVyYXNlclwiKSB7XG4gICAgc2V0RXJhc2VyQ3Vyc29yKGNhbnZhcywgYXBwU3RhdGUudGhlbWUpO1xuICAgIC8vIGRvIG5vdGhpbmcgaWYgaW1hZ2UgdG9vbCBpcyBzZWxlY3RlZCB3aGljaCBzdWdnZXN0cyB0aGVyZSdzXG4gICAgLy8gYSBpbWFnZS1wcmV2aWV3IHNldCBhcyB0aGUgY3Vyc29yXG4gICAgLy8gSWdub3JlIGN1c3RvbSB0eXBlIGFzIHdlbGwgYW5kIGxldCBob3N0IGRlY2lkZVxuICB9IGVsc2UgaWYgKCFbXCJpbWFnZVwiLCBcImN1c3RvbVwiXS5pbmNsdWRlcyhhcHBTdGF0ZS5hY3RpdmVUb29sLnR5cGUpKSB7XG4gICAgY2FudmFzLnN0eWxlLmN1cnNvciA9IENVUlNPUl9UWVBFLkNST1NTSEFJUjtcbiAgfVxufTtcblxuZXhwb3J0IGNvbnN0IGlzRnVsbFNjcmVlbiA9ICgpID0+XG4gIGRvY3VtZW50LmZ1bGxzY3JlZW5FbGVtZW50Py5ub2RlTmFtZSA9PT0gXCJIVE1MXCI7XG5cbmV4cG9ydCBjb25zdCBhbGxvd0Z1bGxTY3JlZW4gPSAoKSA9PlxuICBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQucmVxdWVzdEZ1bGxzY3JlZW4oKTtcblxuZXhwb3J0IGNvbnN0IGV4aXRGdWxsU2NyZWVuID0gKCkgPT4gZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4oKTtcblxuZXhwb3J0IGNvbnN0IGdldFNob3J0Y3V0S2V5ID0gKHNob3J0Y3V0OiBzdHJpbmcpOiBzdHJpbmcgPT4ge1xuICBzaG9ydGN1dCA9IHNob3J0Y3V0XG4gICAgLnJlcGxhY2UoL1xcYkFsdFxcYi9pLCBcIkFsdFwiKVxuICAgIC5yZXBsYWNlKC9cXGJTaGlmdFxcYi9pLCBcIlNoaWZ0XCIpXG4gICAgLnJlcGxhY2UoL1xcYihFbnRlcnxSZXR1cm4pXFxiL2ksIFwiRW50ZXJcIilcbiAgICAucmVwbGFjZSgvXFxiRGVsXFxiL2ksIFwiRGVsZXRlXCIpO1xuXG4gIGlmIChpc0Rhcndpbikge1xuICAgIHJldHVybiBzaG9ydGN1dFxuICAgICAgLnJlcGxhY2UoL1xcYkN0cmxPckNtZFxcYi9pLCBcIkNtZFwiKVxuICAgICAgLnJlcGxhY2UoL1xcYkFsdFxcYi9pLCBcIk9wdGlvblwiKTtcbiAgfVxuICByZXR1cm4gc2hvcnRjdXQucmVwbGFjZSgvXFxiQ3RybE9yQ21kXFxiL2ksIFwiQ3RybFwiKTtcbn07XG5cbmV4cG9ydCBjb25zdCB2aWV3cG9ydENvb3Jkc1RvU2NlbmVDb29yZHMgPSAoXG4gIHsgY2xpZW50WCwgY2xpZW50WSB9OiB7IGNsaWVudFg6IG51bWJlcjsgY2xpZW50WTogbnVtYmVyIH0sXG4gIHtcbiAgICB6b29tLFxuICAgIG9mZnNldExlZnQsXG4gICAgb2Zmc2V0VG9wLFxuICAgIHNjcm9sbFgsXG4gICAgc2Nyb2xsWSxcbiAgfToge1xuICAgIHpvb206IFpvb207XG4gICAgb2Zmc2V0TGVmdDogbnVtYmVyO1xuICAgIG9mZnNldFRvcDogbnVtYmVyO1xuICAgIHNjcm9sbFg6IG51bWJlcjtcbiAgICBzY3JvbGxZOiBudW1iZXI7XG4gIH0sXG4pID0+IHtcbiAgY29uc3QgaW52U2NhbGUgPSAxIC8gem9vbS52YWx1ZTtcbiAgY29uc3QgeCA9IChjbGllbnRYIC0gb2Zmc2V0TGVmdCkgKiBpbnZTY2FsZSAtIHNjcm9sbFg7XG4gIGNvbnN0IHkgPSAoY2xpZW50WSAtIG9mZnNldFRvcCkgKiBpbnZTY2FsZSAtIHNjcm9sbFk7XG5cbiAgcmV0dXJuIHsgeCwgeSB9O1xufTtcblxuZXhwb3J0IGNvbnN0IHNjZW5lQ29vcmRzVG9WaWV3cG9ydENvb3JkcyA9IChcbiAgeyBzY2VuZVgsIHNjZW5lWSB9OiB7IHNjZW5lWDogbnVtYmVyOyBzY2VuZVk6IG51bWJlciB9LFxuICB7XG4gICAgem9vbSxcbiAgICBvZmZzZXRMZWZ0LFxuICAgIG9mZnNldFRvcCxcbiAgICBzY3JvbGxYLFxuICAgIHNjcm9sbFksXG4gIH06IHtcbiAgICB6b29tOiBab29tO1xuICAgIG9mZnNldExlZnQ6IG51bWJlcjtcbiAgICBvZmZzZXRUb3A6IG51bWJlcjtcbiAgICBzY3JvbGxYOiBudW1iZXI7XG4gICAgc2Nyb2xsWTogbnVtYmVyO1xuICB9LFxuKSA9PiB7XG4gIGNvbnN0IHggPSAoc2NlbmVYICsgc2Nyb2xsWCkgKiB6b29tLnZhbHVlICsgb2Zmc2V0TGVmdDtcbiAgY29uc3QgeSA9IChzY2VuZVkgKyBzY3JvbGxZKSAqIHpvb20udmFsdWUgKyBvZmZzZXRUb3A7XG4gIHJldHVybiB7IHgsIHkgfTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRHbG9iYWxDU1NWYXJpYWJsZSA9IChuYW1lOiBzdHJpbmcpID0+XG4gIGdldENvbXB1dGVkU3R5bGUoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KS5nZXRQcm9wZXJ0eVZhbHVlKGAtLSR7bmFtZX1gKTtcblxuY29uc3QgUlNfTFRSX0NIQVJTID1cbiAgXCJBLVphLXpcXHUwMEMwLVxcdTAwRDZcXHUwMEQ4LVxcdTAwRjZcXHUwMEY4LVxcdTAyQjhcXHUwMzAwLVxcdTA1OTBcXHUwODAwLVxcdTFGRkZcIiArXG4gIFwiXFx1MkMwMC1cXHVGQjFDXFx1RkRGRS1cXHVGRTZGXFx1RkVGRC1cXHVGRkZGXCI7XG5jb25zdCBSU19SVExfQ0hBUlMgPSBcIlxcdTA1OTEtXFx1MDdGRlxcdUZCMUQtXFx1RkRGRFxcdUZFNzAtXFx1RkVGQ1wiO1xuY29uc3QgUkVfUlRMX0NIRUNLID0gbmV3IFJlZ0V4cChgXlteJHtSU19MVFJfQ0hBUlN9XSpbJHtSU19SVExfQ0hBUlN9XWApO1xuLyoqXG4gKiBDaGVja3Mgd2hldGhlciBmaXJzdCBkaXJlY3Rpb25hbCBjaGFyYWN0ZXIgaXMgUlRMLiBNZWFuaW5nIHdoZXRoZXIgaXQgc3RhcnRzXG4gKiAgd2l0aCBSVEwgY2hhcmFjdGVycywgb3IgaW5kZXRlcm1pbmF0ZSAobnVtYmVycyBldGMuKSBjaGFyYWN0ZXJzIGZvbGxvd2VkIGJ5XG4gKiAgUlRMLlxuICogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9leGNhbGlkcmF3L2V4Y2FsaWRyYXcvcHVsbC8xNzIyI2Rpc2N1c3Npb25fcjQzNjM0MDE3MVxuICovXG5leHBvcnQgY29uc3QgaXNSVEwgPSAodGV4dDogc3RyaW5nKSA9PiBSRV9SVExfQ0hFQ0sudGVzdCh0ZXh0KTtcblxuZXhwb3J0IGNvbnN0IHR1cGxlVG9Db29ycyA9IChcbiAgeHlUdXBsZTogcmVhZG9ubHkgW251bWJlciwgbnVtYmVyXSxcbik6IHsgeDogbnVtYmVyOyB5OiBudW1iZXIgfSA9PiB7XG4gIGNvbnN0IFt4LCB5XSA9IHh5VHVwbGU7XG4gIHJldHVybiB7IHgsIHkgfTtcbn07XG5cbi8qKiB1c2UgYXMgYSByZWplY3Rpb25IYW5kbGVyIHRvIG11dGUgZmlsZXN5c3RlbSBBYm9ydCBlcnJvcnMgKi9cbmV4cG9ydCBjb25zdCBtdXRlRlNBYm9ydEVycm9yID0gKGVycm9yPzogRXJyb3IpID0+IHtcbiAgaWYgKGVycm9yPy5uYW1lID09PSBcIkFib3J0RXJyb3JcIikge1xuICAgIGNvbnNvbGUud2FybihlcnJvcik7XG4gICAgcmV0dXJuO1xuICB9XG4gIHRocm93IGVycm9yO1xufTtcblxuZXhwb3J0IGNvbnN0IGZpbmRJbmRleCA9IDxUPihcbiAgYXJyYXk6IHJlYWRvbmx5IFRbXSxcbiAgY2I6IChlbGVtZW50OiBULCBpbmRleDogbnVtYmVyLCBhcnJheTogcmVhZG9ubHkgVFtdKSA9PiBib29sZWFuLFxuICBmcm9tSW5kZXg6IG51bWJlciA9IDAsXG4pID0+IHtcbiAgaWYgKGZyb21JbmRleCA8IDApIHtcbiAgICBmcm9tSW5kZXggPSBhcnJheS5sZW5ndGggKyBmcm9tSW5kZXg7XG4gIH1cbiAgZnJvbUluZGV4ID0gTWF0aC5taW4oYXJyYXkubGVuZ3RoLCBNYXRoLm1heChmcm9tSW5kZXgsIDApKTtcbiAgbGV0IGluZGV4ID0gZnJvbUluZGV4IC0gMTtcbiAgd2hpbGUgKCsraW5kZXggPCBhcnJheS5sZW5ndGgpIHtcbiAgICBpZiAoY2IoYXJyYXlbaW5kZXhdLCBpbmRleCwgYXJyYXkpKSB7XG4gICAgICByZXR1cm4gaW5kZXg7XG4gICAgfVxuICB9XG4gIHJldHVybiAtMTtcbn07XG5cbmV4cG9ydCBjb25zdCBmaW5kTGFzdEluZGV4ID0gPFQ+KFxuICBhcnJheTogcmVhZG9ubHkgVFtdLFxuICBjYjogKGVsZW1lbnQ6IFQsIGluZGV4OiBudW1iZXIsIGFycmF5OiByZWFkb25seSBUW10pID0+IGJvb2xlYW4sXG4gIGZyb21JbmRleDogbnVtYmVyID0gYXJyYXkubGVuZ3RoIC0gMSxcbikgPT4ge1xuICBpZiAoZnJvbUluZGV4IDwgMCkge1xuICAgIGZyb21JbmRleCA9IGFycmF5Lmxlbmd0aCArIGZyb21JbmRleDtcbiAgfVxuICBmcm9tSW5kZXggPSBNYXRoLm1pbihhcnJheS5sZW5ndGggLSAxLCBNYXRoLm1heChmcm9tSW5kZXgsIDApKTtcbiAgbGV0IGluZGV4ID0gZnJvbUluZGV4ICsgMTtcbiAgd2hpbGUgKC0taW5kZXggPiAtMSkge1xuICAgIGlmIChjYihhcnJheVtpbmRleF0sIGluZGV4LCBhcnJheSkpIHtcbiAgICAgIHJldHVybiBpbmRleDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIC0xO1xufTtcblxuZXhwb3J0IGNvbnN0IGlzVHJhbnNwYXJlbnQgPSAoY29sb3I6IHN0cmluZykgPT4ge1xuICBjb25zdCBpc1JHQlRyYW5zcGFyZW50ID0gY29sb3IubGVuZ3RoID09PSA1ICYmIGNvbG9yLnN1YnN0cig0LCAxKSA9PT0gXCIwXCI7XG4gIGNvbnN0IGlzUlJHR0JCVHJhbnNwYXJlbnQgPSBjb2xvci5sZW5ndGggPT09IDkgJiYgY29sb3Iuc3Vic3RyKDcsIDIpID09PSBcIjAwXCI7XG4gIHJldHVybiAoXG4gICAgaXNSR0JUcmFuc3BhcmVudCB8fFxuICAgIGlzUlJHR0JCVHJhbnNwYXJlbnQgfHxcbiAgICBjb2xvciA9PT0gY29sb3JzLmVsZW1lbnRCYWNrZ3JvdW5kWzBdXG4gICk7XG59O1xuXG5leHBvcnQgdHlwZSBSZXNvbHZhYmxlUHJvbWlzZTxUPiA9IFByb21pc2U8VD4gJiB7XG4gIHJlc29sdmU6IFtUXSBleHRlbmRzIFt1bmRlZmluZWRdID8gKHZhbHVlPzogVCkgPT4gdm9pZCA6ICh2YWx1ZTogVCkgPT4gdm9pZDtcbiAgcmVqZWN0OiAoZXJyb3I6IEVycm9yKSA9PiB2b2lkO1xufTtcbmV4cG9ydCBjb25zdCByZXNvbHZhYmxlUHJvbWlzZSA9IDxUPigpID0+IHtcbiAgbGV0IHJlc29sdmUhOiBhbnk7XG4gIGxldCByZWplY3QhOiBhbnk7XG4gIGNvbnN0IHByb21pc2UgPSBuZXcgUHJvbWlzZSgoX3Jlc29sdmUsIF9yZWplY3QpID0+IHtcbiAgICByZXNvbHZlID0gX3Jlc29sdmU7XG4gICAgcmVqZWN0ID0gX3JlamVjdDtcbiAgfSk7XG4gIChwcm9taXNlIGFzIGFueSkucmVzb2x2ZSA9IHJlc29sdmU7XG4gIChwcm9taXNlIGFzIGFueSkucmVqZWN0ID0gcmVqZWN0O1xuICByZXR1cm4gcHJvbWlzZSBhcyBSZXNvbHZhYmxlUHJvbWlzZTxUPjtcbn07XG5cbi8qKlxuICogQHBhcmFtIGZ1bmMgaGFuZGxlciB0YWtpbmcgYXQgbW9zdCBzaW5nbGUgcGFyYW1ldGVyIChldmVudCkuXG4gKi9cbmV4cG9ydCBjb25zdCB3aXRoQmF0Y2hlZFVwZGF0ZXMgPSA8XG4gIFRGdW5jdGlvbiBleHRlbmRzICgoZXZlbnQ6IGFueSkgPT4gdm9pZCkgfCAoKCkgPT4gdm9pZCksXG4+KFxuICBmdW5jOiBQYXJhbWV0ZXJzPFRGdW5jdGlvbj5bXCJsZW5ndGhcIl0gZXh0ZW5kcyAwIHwgMSA/IFRGdW5jdGlvbiA6IG5ldmVyLFxuKSA9PlxuICAoKGV2ZW50KSA9PiB7XG4gICAgdW5zdGFibGVfYmF0Y2hlZFVwZGF0ZXMoZnVuYyBhcyBURnVuY3Rpb24sIGV2ZW50KTtcbiAgfSkgYXMgVEZ1bmN0aW9uO1xuXG4vKipcbiAqIGJhcmNoZXMgUmVhY3Qgc3RhdGUgdXBkYXRlcyBhbmQgdGhyb3R0bGVzIHRoZSBjYWxscyB0byBhIHNpbmdsZSBjYWxsIHBlclxuICogYW5pbWF0aW9uIGZyYW1lXG4gKi9cbmV4cG9ydCBjb25zdCB3aXRoQmF0Y2hlZFVwZGF0ZXNUaHJvdHRsZWQgPSA8XG4gIFRGdW5jdGlvbiBleHRlbmRzICgoZXZlbnQ6IGFueSkgPT4gdm9pZCkgfCAoKCkgPT4gdm9pZCksXG4+KFxuICBmdW5jOiBQYXJhbWV0ZXJzPFRGdW5jdGlvbj5bXCJsZW5ndGhcIl0gZXh0ZW5kcyAwIHwgMSA/IFRGdW5jdGlvbiA6IG5ldmVyLFxuKSA9PiB7XG4gIC8vIEB0cy1pZ25vcmVcbiAgcmV0dXJuIHRocm90dGxlUkFGPFBhcmFtZXRlcnM8VEZ1bmN0aW9uPj4oKChldmVudCkgPT4ge1xuICAgIHVuc3RhYmxlX2JhdGNoZWRVcGRhdGVzKGZ1bmMsIGV2ZW50KTtcbiAgfSkgYXMgVEZ1bmN0aW9uKTtcbn07XG5cbi8vaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9hLzk0NjIzODIvODQxOFxuZXhwb3J0IGNvbnN0IG5Gb3JtYXR0ZXIgPSAobnVtOiBudW1iZXIsIGRpZ2l0czogbnVtYmVyKTogc3RyaW5nID0+IHtcbiAgY29uc3Qgc2kgPSBbXG4gICAgeyB2YWx1ZTogMSwgc3ltYm9sOiBcImJcIiB9LFxuICAgIHsgdmFsdWU6IDFlMywgc3ltYm9sOiBcImtcIiB9LFxuICAgIHsgdmFsdWU6IDFlNiwgc3ltYm9sOiBcIk1cIiB9LFxuICAgIHsgdmFsdWU6IDFlOSwgc3ltYm9sOiBcIkdcIiB9LFxuICBdO1xuICBjb25zdCByeCA9IC9cXC4wKyR8KFxcLlswLTldKlsxLTldKTArJC87XG4gIGxldCBpbmRleDtcbiAgZm9yIChpbmRleCA9IHNpLmxlbmd0aCAtIDE7IGluZGV4ID4gMDsgaW5kZXgtLSkge1xuICAgIGlmIChudW0gPj0gc2lbaW5kZXhdLnZhbHVlKSB7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cbiAgcmV0dXJuIChcbiAgICAobnVtIC8gc2lbaW5kZXhdLnZhbHVlKS50b0ZpeGVkKGRpZ2l0cykucmVwbGFjZShyeCwgXCIkMVwiKSArIHNpW2luZGV4XS5zeW1ib2xcbiAgKTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRWZXJzaW9uID0gKCkgPT4ge1xuICByZXR1cm4gKFxuICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3I8SFRNTE1ldGFFbGVtZW50PignbWV0YVtuYW1lPVwidmVyc2lvblwiXScpPy5jb250ZW50IHx8XG4gICAgREVGQVVMVF9WRVJTSU9OXG4gICk7XG59O1xuXG4vLyBBZGFwdGVkIGZyb20gaHR0cHM6Ly9naXRodWIuY29tL01vZGVybml6ci9Nb2Rlcm5penIvYmxvYi9tYXN0ZXIvZmVhdHVyZS1kZXRlY3RzL2Vtb2ppLmpzXG5leHBvcnQgY29uc3Qgc3VwcG9ydHNFbW9qaSA9ICgpID0+IHtcbiAgY29uc3QgY2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImNhbnZhc1wiKTtcbiAgY29uc3QgY3R4ID0gY2FudmFzLmdldENvbnRleHQoXCIyZFwiKTtcbiAgaWYgKCFjdHgpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgY29uc3Qgb2Zmc2V0ID0gMTI7XG4gIGN0eC5maWxsU3R5bGUgPSBcIiNmMDBcIjtcbiAgY3R4LnRleHRCYXNlbGluZSA9IFwidG9wXCI7XG4gIGN0eC5mb250ID0gXCIzMnB4IEFyaWFsXCI7XG4gIC8vIE1vZGVybml6ciB1c2VkIPCfkKgsIGJ1dCBpdCBpcyBzb3J0IG9mIHN1cHBvcnRlZCBvbiBXaW5kb3dzIDcuXG4gIC8vIEx1Y2tpbHkg8J+YgCBpc24ndCBzdXBwb3J0ZWQuXG4gIGN0eC5maWxsVGV4dChcIvCfmIBcIiwgMCwgMCk7XG4gIHJldHVybiBjdHguZ2V0SW1hZ2VEYXRhKG9mZnNldCwgb2Zmc2V0LCAxLCAxKS5kYXRhWzBdICE9PSAwO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldE5lYXJlc3RTY3JvbGxhYmxlQ29udGFpbmVyID0gKFxuICBlbGVtZW50OiBIVE1MRWxlbWVudCxcbik6IEhUTUxFbGVtZW50IHwgRG9jdW1lbnQgPT4ge1xuICBsZXQgcGFyZW50ID0gZWxlbWVudC5wYXJlbnRFbGVtZW50O1xuICB3aGlsZSAocGFyZW50KSB7XG4gICAgaWYgKHBhcmVudCA9PT0gZG9jdW1lbnQuYm9keSkge1xuICAgICAgcmV0dXJuIGRvY3VtZW50O1xuICAgIH1cbiAgICBjb25zdCB7IG92ZXJmbG93WSB9ID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUocGFyZW50KTtcbiAgICBjb25zdCBoYXNTY3JvbGxhYmxlQ29udGVudCA9IHBhcmVudC5zY3JvbGxIZWlnaHQgPiBwYXJlbnQuY2xpZW50SGVpZ2h0O1xuICAgIGlmIChcbiAgICAgIGhhc1Njcm9sbGFibGVDb250ZW50ICYmXG4gICAgICAob3ZlcmZsb3dZID09PSBcImF1dG9cIiB8fFxuICAgICAgICBvdmVyZmxvd1kgPT09IFwic2Nyb2xsXCIgfHxcbiAgICAgICAgb3ZlcmZsb3dZID09PSBcIm92ZXJsYXlcIilcbiAgICApIHtcbiAgICAgIHJldHVybiBwYXJlbnQ7XG4gICAgfVxuICAgIHBhcmVudCA9IHBhcmVudC5wYXJlbnRFbGVtZW50O1xuICB9XG4gIHJldHVybiBkb2N1bWVudDtcbn07XG5cbmV4cG9ydCBjb25zdCBmb2N1c05lYXJlc3RQYXJlbnQgPSAoZWxlbWVudDogSFRNTElucHV0RWxlbWVudCkgPT4ge1xuICBsZXQgcGFyZW50ID0gZWxlbWVudC5wYXJlbnRFbGVtZW50O1xuICB3aGlsZSAocGFyZW50KSB7XG4gICAgaWYgKHBhcmVudC50YWJJbmRleCA+IC0xKSB7XG4gICAgICBwYXJlbnQuZm9jdXMoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgcGFyZW50ID0gcGFyZW50LnBhcmVudEVsZW1lbnQ7XG4gIH1cbn07XG5cbmV4cG9ydCBjb25zdCBwcmV2ZW50VW5sb2FkID0gKGV2ZW50OiBCZWZvcmVVbmxvYWRFdmVudCkgPT4ge1xuICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAvLyBOT1RFOiBtb2Rlcm4gYnJvd3NlcnMgbm8gbG9uZ2VyIGFsbG93IHNob3dpbmcgYSBjdXN0b20gbWVzc2FnZSBoZXJlXG4gIGV2ZW50LnJldHVyblZhbHVlID0gXCJcIjtcbn07XG5cbmV4cG9ydCBjb25zdCBieXRlc1RvSGV4U3RyaW5nID0gKGJ5dGVzOiBVaW50OEFycmF5KSA9PiB7XG4gIHJldHVybiBBcnJheS5mcm9tKGJ5dGVzKVxuICAgIC5tYXAoKGJ5dGUpID0+IGAwJHtieXRlLnRvU3RyaW5nKDE2KX1gLnNsaWNlKC0yKSlcbiAgICAuam9pbihcIlwiKTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRVcGRhdGVkVGltZXN0YW1wID0gKCkgPT4gKGlzVGVzdEVudigpID8gMSA6IERhdGUubm93KCkpO1xuXG4vKipcbiAqIFRyYW5zZm9ybXMgYXJyYXkgb2Ygb2JqZWN0cyBjb250YWluaW5nIGBpZGAgYXR0cmlidXRlLFxuICogb3IgYXJyYXkgb2YgaWRzIChzdHJpbmdzKSwgaW50byBhIE1hcCwga2V5ZCBieSBgaWRgLlxuICovXG5leHBvcnQgY29uc3QgYXJyYXlUb01hcCA9IDxUIGV4dGVuZHMgeyBpZDogc3RyaW5nIH0gfCBzdHJpbmc+KFxuICBpdGVtczogcmVhZG9ubHkgVFtdLFxuKSA9PiB7XG4gIHJldHVybiBpdGVtcy5yZWR1Y2UoKGFjYzogTWFwPHN0cmluZywgVD4sIGVsZW1lbnQpID0+IHtcbiAgICBhY2Muc2V0KHR5cGVvZiBlbGVtZW50ID09PSBcInN0cmluZ1wiID8gZWxlbWVudCA6IGVsZW1lbnQuaWQsIGVsZW1lbnQpO1xuICAgIHJldHVybiBhY2M7XG4gIH0sIG5ldyBNYXAoKSk7XG59O1xuXG5leHBvcnQgY29uc3QgaXNUZXN0RW52ID0gKCkgPT5cbiAgdHlwZW9mIHByb2Nlc3MgIT09IFwidW5kZWZpbmVkXCIgJiYgcHJvY2Vzcy5lbnY/Lk5PREVfRU5WID09PSBcInRlc3RcIjtcblxuZXhwb3J0IGNvbnN0IGlzUHJvZEVudiA9ICgpID0+XG4gIHR5cGVvZiBwcm9jZXNzICE9PSBcInVuZGVmaW5lZFwiICYmIHByb2Nlc3MuZW52Py5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCI7XG5cbmV4cG9ydCBjb25zdCB3cmFwRXZlbnQgPSA8VCBleHRlbmRzIEV2ZW50PihuYW1lOiBFVkVOVCwgbmF0aXZlRXZlbnQ6IFQpID0+IHtcbiAgcmV0dXJuIG5ldyBDdXN0b21FdmVudChuYW1lLCB7XG4gICAgZGV0YWlsOiB7XG4gICAgICBuYXRpdmVFdmVudCxcbiAgICB9LFxuICAgIGNhbmNlbGFibGU6IHRydWUsXG4gIH0pO1xufTtcblxuZXhwb3J0IGNvbnN0IHVwZGF0ZU9iamVjdCA9IDxUIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgYW55Pj4oXG4gIG9iajogVCxcbiAgdXBkYXRlczogUGFydGlhbDxUPixcbik6IFQgPT4ge1xuICBsZXQgZGlkQ2hhbmdlID0gZmFsc2U7XG4gIGZvciAoY29uc3Qga2V5IGluIHVwZGF0ZXMpIHtcbiAgICBjb25zdCB2YWx1ZSA9ICh1cGRhdGVzIGFzIGFueSlba2V5XTtcbiAgICBpZiAodHlwZW9mIHZhbHVlICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICBpZiAoXG4gICAgICAgIChvYmogYXMgYW55KVtrZXldID09PSB2YWx1ZSAmJlxuICAgICAgICAvLyBpZiBvYmplY3QsIGFsd2F5cyB1cGRhdGUgYmVjYXVzZSBpdHMgYXR0cnMgY291bGQgaGF2ZSBjaGFuZ2VkXG4gICAgICAgICh0eXBlb2YgdmFsdWUgIT09IFwib2JqZWN0XCIgfHwgdmFsdWUgPT09IG51bGwpXG4gICAgICApIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBkaWRDaGFuZ2UgPSB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIGlmICghZGlkQ2hhbmdlKSB7XG4gICAgcmV0dXJuIG9iajtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgLi4ub2JqLFxuICAgIC4uLnVwZGF0ZXMsXG4gIH07XG59O1xuXG5leHBvcnQgY29uc3QgaXNQcmltaXRpdmUgPSAodmFsOiBhbnkpID0+IHtcbiAgY29uc3QgdHlwZSA9IHR5cGVvZiB2YWw7XG4gIHJldHVybiB2YWwgPT0gbnVsbCB8fCAodHlwZSAhPT0gXCJvYmplY3RcIiAmJiB0eXBlICE9PSBcImZ1bmN0aW9uXCIpO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldEZyYW1lID0gKCkgPT4ge1xuICB0cnkge1xuICAgIHJldHVybiB3aW5kb3cuc2VsZiA9PT0gd2luZG93LnRvcCA/IFwidG9wXCIgOiBcImlmcmFtZVwiO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHJldHVybiBcImlmcmFtZVwiO1xuICB9XG59O1xuXG5leHBvcnQgY29uc3QgaXNQcm9taXNlTGlrZSA9IChcbiAgdmFsdWU6IGFueSxcbik6IHZhbHVlIGlzIFByb21pc2U8UmVzb2x1dGlvblR5cGU8dHlwZW9mIHZhbHVlPj4gPT4ge1xuICByZXR1cm4gKFxuICAgICEhdmFsdWUgJiZcbiAgICB0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIgJiZcbiAgICBcInRoZW5cIiBpbiB2YWx1ZSAmJlxuICAgIFwiY2F0Y2hcIiBpbiB2YWx1ZSAmJlxuICAgIFwiZmluYWxseVwiIGluIHZhbHVlXG4gICk7XG59O1xuXG5leHBvcnQgY29uc3QgcXVlcnlGb2N1c2FibGVFbGVtZW50cyA9IChjb250YWluZXI6IEhUTUxFbGVtZW50IHwgbnVsbCkgPT4ge1xuICBjb25zdCBmb2N1c2FibGVFbGVtZW50cyA9IGNvbnRhaW5lcj8ucXVlcnlTZWxlY3RvckFsbDxIVE1MRWxlbWVudD4oXG4gICAgXCJidXR0b24sIGEsIGlucHV0LCBzZWxlY3QsIHRleHRhcmVhLCBkaXZbdGFiaW5kZXhdLCBsYWJlbFt0YWJpbmRleF1cIixcbiAgKTtcblxuICByZXR1cm4gZm9jdXNhYmxlRWxlbWVudHNcbiAgICA/IEFycmF5LmZyb20oZm9jdXNhYmxlRWxlbWVudHMpLmZpbHRlcihcbiAgICAgICAgKGVsZW1lbnQpID0+XG4gICAgICAgICAgZWxlbWVudC50YWJJbmRleCA+IC0xICYmICEoZWxlbWVudCBhcyBIVE1MSW5wdXRFbGVtZW50KS5kaXNhYmxlZCxcbiAgICAgIClcbiAgICA6IFtdO1xufTtcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///../../utils.ts\n");
|
|
3341
|
+
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"allowFullScreen\": () => (/* binding */ allowFullScreen),\n/* harmony export */ \"arrayToMap\": () => (/* binding */ arrayToMap),\n/* harmony export */ \"bytesToHexString\": () => (/* binding */ bytesToHexString),\n/* harmony export */ \"capitalizeString\": () => (/* binding */ capitalizeString),\n/* harmony export */ \"chunk\": () => (/* binding */ chunk),\n/* harmony export */ \"debounce\": () => (/* binding */ debounce),\n/* harmony export */ \"distance\": () => (/* binding */ distance),\n/* harmony export */ \"exitFullScreen\": () => (/* binding */ exitFullScreen),\n/* harmony export */ \"findIndex\": () => (/* binding */ findIndex),\n/* harmony export */ \"findLastIndex\": () => (/* binding */ findLastIndex),\n/* harmony export */ \"focusNearestParent\": () => (/* binding */ focusNearestParent),\n/* harmony export */ \"getDateTime\": () => (/* binding */ getDateTime),\n/* harmony export */ \"getFontFamilyString\": () => (/* binding */ getFontFamilyString),\n/* harmony export */ \"getFontString\": () => (/* binding */ getFontString),\n/* harmony export */ \"getFrame\": () => (/* binding */ getFrame),\n/* harmony export */ \"getGlobalCSSVariable\": () => (/* binding */ getGlobalCSSVariable),\n/* harmony export */ \"getNearestScrollableContainer\": () => (/* binding */ getNearestScrollableContainer),\n/* harmony export */ \"getShortcutKey\": () => (/* binding */ getShortcutKey),\n/* harmony export */ \"getUpdatedTimestamp\": () => (/* binding */ getUpdatedTimestamp),\n/* harmony export */ \"getVersion\": () => (/* binding */ getVersion),\n/* harmony export */ \"isFullScreen\": () => (/* binding */ isFullScreen),\n/* harmony export */ \"isInputLike\": () => (/* binding */ isInputLike),\n/* harmony export */ \"isPrimitive\": () => (/* binding */ isPrimitive),\n/* harmony export */ \"isProdEnv\": () => (/* binding */ isProdEnv),\n/* harmony export */ \"isPromiseLike\": () => (/* binding */ isPromiseLike),\n/* harmony export */ \"isRTL\": () => (/* binding */ isRTL),\n/* harmony export */ \"isTestEnv\": () => (/* binding */ isTestEnv),\n/* harmony export */ \"isToolIcon\": () => (/* binding */ isToolIcon),\n/* harmony export */ \"isTransparent\": () => (/* binding */ isTransparent),\n/* harmony export */ \"isWritableElement\": () => (/* binding */ isWritableElement),\n/* harmony export */ \"muteFSAbortError\": () => (/* binding */ muteFSAbortError),\n/* harmony export */ \"nFormatter\": () => (/* binding */ nFormatter),\n/* harmony export */ \"preventUnload\": () => (/* binding */ preventUnload),\n/* harmony export */ \"queryFocusableElements\": () => (/* binding */ queryFocusableElements),\n/* harmony export */ \"removeSelection\": () => (/* binding */ removeSelection),\n/* harmony export */ \"resetCursor\": () => (/* binding */ resetCursor),\n/* harmony export */ \"resolvablePromise\": () => (/* binding */ resolvablePromise),\n/* harmony export */ \"sceneCoordsToViewportCoords\": () => (/* binding */ sceneCoordsToViewportCoords),\n/* harmony export */ \"selectNode\": () => (/* binding */ selectNode),\n/* harmony export */ \"setCursor\": () => (/* binding */ setCursor),\n/* harmony export */ \"setCursorForShape\": () => (/* binding */ setCursorForShape),\n/* harmony export */ \"setDateTimeForTests\": () => (/* binding */ setDateTimeForTests),\n/* harmony export */ \"setEraserCursor\": () => (/* binding */ setEraserCursor),\n/* harmony export */ \"supportsEmoji\": () => (/* binding */ supportsEmoji),\n/* harmony export */ \"throttleRAF\": () => (/* binding */ throttleRAF),\n/* harmony export */ \"tupleToCoors\": () => (/* binding */ tupleToCoors),\n/* harmony export */ \"updateActiveTool\": () => (/* binding */ updateActiveTool),\n/* harmony export */ \"updateObject\": () => (/* binding */ updateObject),\n/* harmony export */ \"viewportCoordsToSceneCoords\": () => (/* binding */ viewportCoordsToSceneCoords),\n/* harmony export */ \"withBatchedUpdates\": () => (/* binding */ withBatchedUpdates),\n/* harmony export */ \"withBatchedUpdatesThrottled\": () => (/* binding */ withBatchedUpdatesThrottled),\n/* harmony export */ \"wrapEvent\": () => (/* binding */ wrapEvent)\n/* harmony export */ });\n/* harmony import */ var open_color__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! open-color */ \"../../../node_modules/open-color/open-color.json\");\n/* harmony import */ var _colors__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./colors */ \"../../colors.ts\");\n/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./constants */ \"../../constants.ts\");\n/* harmony import */ var react_dom__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react-dom */ \"react-dom\");\n/* harmony import */ var react_dom__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(react_dom__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var _keys__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./keys */ \"../../keys.ts\");\n\n\n\n\n\nlet mockDateTime = null;\nconst setDateTimeForTests = (dateTime) => {\n mockDateTime = dateTime;\n};\nconst getDateTime = () => {\n if (mockDateTime) {\n return mockDateTime;\n }\n const date = new Date();\n const year = date.getFullYear();\n const month = `${date.getMonth() + 1}`.padStart(2, \"0\");\n const day = `${date.getDate()}`.padStart(2, \"0\");\n const hr = `${date.getHours()}`.padStart(2, \"0\");\n const min = `${date.getMinutes()}`.padStart(2, \"0\");\n return `${year}-${month}-${day}-${hr}${min}`;\n};\nconst capitalizeString = (str) => str.charAt(0).toUpperCase() + str.slice(1);\nconst isToolIcon = (target) => target instanceof HTMLElement && target.className.includes(\"ToolIcon\");\nconst isInputLike = (target) => (target instanceof HTMLElement && target.dataset.type === \"wysiwyg\") ||\n target instanceof HTMLBRElement || // newline in wysiwyg\n target instanceof HTMLInputElement ||\n target instanceof HTMLTextAreaElement ||\n target instanceof HTMLSelectElement;\nconst isWritableElement = (target) => (target instanceof HTMLElement && target.dataset.type === \"wysiwyg\") ||\n target instanceof HTMLBRElement || // newline in wysiwyg\n target instanceof HTMLTextAreaElement ||\n (target instanceof HTMLInputElement &&\n (target.type === \"text\" || target.type === \"number\"));\nconst getFontFamilyString = ({ fontFamily, }) => {\n for (const [fontFamilyString, id] of Object.entries(_constants__WEBPACK_IMPORTED_MODULE_2__.FONT_FAMILY)) {\n if (id === fontFamily) {\n return `${fontFamilyString}, ${_constants__WEBPACK_IMPORTED_MODULE_2__.WINDOWS_EMOJI_FALLBACK_FONT}`;\n }\n }\n return _constants__WEBPACK_IMPORTED_MODULE_2__.WINDOWS_EMOJI_FALLBACK_FONT;\n};\n/** returns fontSize+fontFamily string for assignment to DOM elements */\nconst getFontString = ({ fontSize, fontFamily, }) => {\n return `${fontSize}px ${getFontFamilyString({ fontFamily })}`;\n};\nconst debounce = (fn, timeout) => {\n let handle = 0;\n let lastArgs = null;\n const ret = (...args) => {\n lastArgs = args;\n clearTimeout(handle);\n handle = window.setTimeout(() => {\n lastArgs = null;\n fn(...args);\n }, timeout);\n };\n ret.flush = () => {\n clearTimeout(handle);\n if (lastArgs) {\n const _lastArgs = lastArgs;\n lastArgs = null;\n fn(..._lastArgs);\n }\n };\n ret.cancel = () => {\n lastArgs = null;\n clearTimeout(handle);\n };\n return ret;\n};\n// throttle callback to execute once per animation frame\nconst throttleRAF = (fn, opts) => {\n let timerId = null;\n let lastArgs = null;\n let lastArgsTrailing = null;\n const scheduleFunc = (args) => {\n timerId = window.requestAnimationFrame(() => {\n timerId = null;\n fn(...args);\n lastArgs = null;\n if (lastArgsTrailing) {\n lastArgs = lastArgsTrailing;\n lastArgsTrailing = null;\n scheduleFunc(lastArgs);\n }\n });\n };\n const ret = (...args) => {\n if (false) {}\n lastArgs = args;\n if (timerId === null) {\n scheduleFunc(lastArgs);\n }\n else if (opts === null || opts === void 0 ? void 0 : opts.trailing) {\n lastArgsTrailing = args;\n }\n };\n ret.flush = () => {\n if (timerId !== null) {\n cancelAnimationFrame(timerId);\n timerId = null;\n }\n if (lastArgs) {\n fn(...(lastArgsTrailing || lastArgs));\n lastArgs = lastArgsTrailing = null;\n }\n };\n ret.cancel = () => {\n lastArgs = lastArgsTrailing = null;\n if (timerId !== null) {\n cancelAnimationFrame(timerId);\n timerId = null;\n }\n };\n return ret;\n};\n// https://github.com/lodash/lodash/blob/es/chunk.js\nconst chunk = (array, size) => {\n if (!array.length || size < 1) {\n return [];\n }\n let index = 0;\n let resIndex = 0;\n const result = Array(Math.ceil(array.length / size));\n while (index < array.length) {\n result[resIndex++] = array.slice(index, (index += size));\n }\n return result;\n};\nconst selectNode = (node) => {\n const selection = window.getSelection();\n if (selection) {\n const range = document.createRange();\n range.selectNodeContents(node);\n selection.removeAllRanges();\n selection.addRange(range);\n }\n};\nconst removeSelection = () => {\n const selection = window.getSelection();\n if (selection) {\n selection.removeAllRanges();\n }\n};\nconst distance = (x, y) => Math.abs(x - y);\nconst updateActiveTool = (appState, data) => {\n if (data.type === \"custom\") {\n return Object.assign(Object.assign({}, appState.activeTool), { type: \"custom\", customType: data.customType });\n }\n return Object.assign(Object.assign({}, appState.activeTool), { lastActiveToolBeforeEraser: data.lastActiveToolBeforeEraser === undefined\n ? appState.activeTool.lastActiveToolBeforeEraser\n : data.lastActiveToolBeforeEraser, type: data.type, customType: null });\n};\nconst resetCursor = (canvas) => {\n if (canvas) {\n canvas.style.cursor = \"\";\n }\n};\nconst setCursor = (canvas, cursor) => {\n if (canvas) {\n canvas.style.cursor = cursor;\n }\n};\nlet eraserCanvasCache;\nlet previewDataURL;\nconst setEraserCursor = (canvas, theme) => {\n const cursorImageSizePx = 20;\n const drawCanvas = () => {\n const isDarkTheme = theme === _constants__WEBPACK_IMPORTED_MODULE_2__.THEME.DARK;\n eraserCanvasCache = document.createElement(\"canvas\");\n eraserCanvasCache.theme = theme;\n eraserCanvasCache.height = cursorImageSizePx;\n eraserCanvasCache.width = cursorImageSizePx;\n const context = eraserCanvasCache.getContext(\"2d\");\n context.lineWidth = 1;\n context.beginPath();\n context.arc(eraserCanvasCache.width / 2, eraserCanvasCache.height / 2, 5, 0, 2 * Math.PI);\n context.fillStyle = isDarkTheme ? open_color__WEBPACK_IMPORTED_MODULE_0__.black : open_color__WEBPACK_IMPORTED_MODULE_0__.white;\n context.fill();\n context.strokeStyle = isDarkTheme ? open_color__WEBPACK_IMPORTED_MODULE_0__.white : open_color__WEBPACK_IMPORTED_MODULE_0__.black;\n context.stroke();\n previewDataURL = eraserCanvasCache.toDataURL(_constants__WEBPACK_IMPORTED_MODULE_2__.MIME_TYPES.svg);\n };\n if (!eraserCanvasCache || eraserCanvasCache.theme !== theme) {\n drawCanvas();\n }\n setCursor(canvas, `url(${previewDataURL}) ${cursorImageSizePx / 2} ${cursorImageSizePx / 2}, auto`);\n};\nconst setCursorForShape = (canvas, appState) => {\n if (!canvas) {\n return;\n }\n if (appState.activeTool.type === \"selection\") {\n resetCursor(canvas);\n }\n else if (appState.activeTool.type === \"eraser\") {\n setEraserCursor(canvas, appState.theme);\n // do nothing if image tool is selected which suggests there's\n // a image-preview set as the cursor\n // Ignore custom type as well and let host decide\n }\n else if (![\"image\", \"custom\"].includes(appState.activeTool.type)) {\n canvas.style.cursor = _constants__WEBPACK_IMPORTED_MODULE_2__.CURSOR_TYPE.CROSSHAIR;\n }\n};\nconst isFullScreen = () => { var _a; return ((_a = document.fullscreenElement) === null || _a === void 0 ? void 0 : _a.nodeName) === \"HTML\"; };\nconst allowFullScreen = () => document.documentElement.requestFullscreen();\nconst exitFullScreen = () => document.exitFullscreen();\nconst getShortcutKey = (shortcut) => {\n shortcut = shortcut\n .replace(/\\bAlt\\b/i, \"Alt\")\n .replace(/\\bShift\\b/i, \"Shift\")\n .replace(/\\b(Enter|Return)\\b/i, \"Enter\")\n .replace(/\\bDel\\b/i, \"Delete\");\n if (_keys__WEBPACK_IMPORTED_MODULE_4__.isDarwin) {\n return shortcut\n .replace(/\\bCtrlOrCmd\\b/i, \"Cmd\")\n .replace(/\\bAlt\\b/i, \"Option\");\n }\n return shortcut.replace(/\\bCtrlOrCmd\\b/i, \"Ctrl\");\n};\nconst viewportCoordsToSceneCoords = ({ clientX, clientY }, { zoom, offsetLeft, offsetTop, scrollX, scrollY, }) => {\n const invScale = 1 / zoom.value;\n const x = (clientX - offsetLeft) * invScale - scrollX;\n const y = (clientY - offsetTop) * invScale - scrollY;\n return { x, y };\n};\nconst sceneCoordsToViewportCoords = ({ sceneX, sceneY }, { zoom, offsetLeft, offsetTop, scrollX, scrollY, }) => {\n const x = (sceneX + scrollX) * zoom.value + offsetLeft;\n const y = (sceneY + scrollY) * zoom.value + offsetTop;\n return { x, y };\n};\nconst getGlobalCSSVariable = (name) => getComputedStyle(document.documentElement).getPropertyValue(`--${name}`);\nconst RS_LTR_CHARS = \"A-Za-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02B8\\u0300-\\u0590\\u0800-\\u1FFF\" +\n \"\\u2C00-\\uFB1C\\uFDFE-\\uFE6F\\uFEFD-\\uFFFF\";\nconst RS_RTL_CHARS = \"\\u0591-\\u07FF\\uFB1D-\\uFDFD\\uFE70-\\uFEFC\";\nconst RE_RTL_CHECK = new RegExp(`^[^${RS_LTR_CHARS}]*[${RS_RTL_CHARS}]`);\n/**\n * Checks whether first directional character is RTL. Meaning whether it starts\n * with RTL characters, or indeterminate (numbers etc.) characters followed by\n * RTL.\n * See https://github.com/excalidraw/excalidraw/pull/1722#discussion_r436340171\n */\nconst isRTL = (text) => RE_RTL_CHECK.test(text);\nconst tupleToCoors = (xyTuple) => {\n const [x, y] = xyTuple;\n return { x, y };\n};\n/** use as a rejectionHandler to mute filesystem Abort errors */\nconst muteFSAbortError = (error) => {\n if ((error === null || error === void 0 ? void 0 : error.name) === \"AbortError\") {\n console.warn(error);\n return;\n }\n throw error;\n};\nconst findIndex = (array, cb, fromIndex = 0) => {\n if (fromIndex < 0) {\n fromIndex = array.length + fromIndex;\n }\n fromIndex = Math.min(array.length, Math.max(fromIndex, 0));\n let index = fromIndex - 1;\n while (++index < array.length) {\n if (cb(array[index], index, array)) {\n return index;\n }\n }\n return -1;\n};\nconst findLastIndex = (array, cb, fromIndex = array.length - 1) => {\n if (fromIndex < 0) {\n fromIndex = array.length + fromIndex;\n }\n fromIndex = Math.min(array.length - 1, Math.max(fromIndex, 0));\n let index = fromIndex + 1;\n while (--index > -1) {\n if (cb(array[index], index, array)) {\n return index;\n }\n }\n return -1;\n};\nconst isTransparent = (color) => {\n const isRGBTransparent = color.length === 5 && color.substr(4, 1) === \"0\";\n const isRRGGBBTransparent = color.length === 9 && color.substr(7, 2) === \"00\";\n return (isRGBTransparent ||\n isRRGGBBTransparent ||\n color === _colors__WEBPACK_IMPORTED_MODULE_1__[\"default\"].elementBackground[0]);\n};\nconst resolvablePromise = () => {\n let resolve;\n let reject;\n const promise = new Promise((_resolve, _reject) => {\n resolve = _resolve;\n reject = _reject;\n });\n promise.resolve = resolve;\n promise.reject = reject;\n return promise;\n};\n/**\n * @param func handler taking at most single parameter (event).\n */\nconst withBatchedUpdates = (func) => ((event) => {\n (0,react_dom__WEBPACK_IMPORTED_MODULE_3__.unstable_batchedUpdates)(func, event);\n});\n/**\n * barches React state updates and throttles the calls to a single call per\n * animation frame\n */\nconst withBatchedUpdatesThrottled = (func) => {\n // @ts-ignore\n return throttleRAF(((event) => {\n (0,react_dom__WEBPACK_IMPORTED_MODULE_3__.unstable_batchedUpdates)(func, event);\n }));\n};\n//https://stackoverflow.com/a/9462382/8418\nconst nFormatter = (num, digits) => {\n const si = [\n { value: 1, symbol: \"b\" },\n { value: 1e3, symbol: \"k\" },\n { value: 1e6, symbol: \"M\" },\n { value: 1e9, symbol: \"G\" },\n ];\n const rx = /\\.0+$|(\\.[0-9]*[1-9])0+$/;\n let index;\n for (index = si.length - 1; index > 0; index--) {\n if (num >= si[index].value) {\n break;\n }\n }\n return ((num / si[index].value).toFixed(digits).replace(rx, \"$1\") + si[index].symbol);\n};\nconst getVersion = () => {\n var _a;\n return (((_a = document.querySelector('meta[name=\"version\"]')) === null || _a === void 0 ? void 0 : _a.content) ||\n _constants__WEBPACK_IMPORTED_MODULE_2__.DEFAULT_VERSION);\n};\n// Adapted from https://github.com/Modernizr/Modernizr/blob/master/feature-detects/emoji.js\nconst supportsEmoji = () => {\n const canvas = document.createElement(\"canvas\");\n const ctx = canvas.getContext(\"2d\");\n if (!ctx) {\n return false;\n }\n const offset = 12;\n ctx.fillStyle = \"#f00\";\n ctx.textBaseline = \"top\";\n ctx.font = \"32px Arial\";\n // Modernizr used 🐨, but it is sort of supported on Windows 7.\n // Luckily 😀 isn't supported.\n ctx.fillText(\"😀\", 0, 0);\n return ctx.getImageData(offset, offset, 1, 1).data[0] !== 0;\n};\nconst getNearestScrollableContainer = (element) => {\n let parent = element.parentElement;\n while (parent) {\n if (parent === document.body) {\n return document;\n }\n const { overflowY } = window.getComputedStyle(parent);\n const hasScrollableContent = parent.scrollHeight > parent.clientHeight;\n if (hasScrollableContent &&\n (overflowY === \"auto\" ||\n overflowY === \"scroll\" ||\n overflowY === \"overlay\")) {\n return parent;\n }\n parent = parent.parentElement;\n }\n return document;\n};\nconst focusNearestParent = (element) => {\n let parent = element.parentElement;\n while (parent) {\n if (parent.tabIndex > -1) {\n parent.focus();\n return;\n }\n parent = parent.parentElement;\n }\n};\nconst preventUnload = (event) => {\n event.preventDefault();\n // NOTE: modern browsers no longer allow showing a custom message here\n event.returnValue = \"\";\n};\nconst bytesToHexString = (bytes) => {\n return Array.from(bytes)\n .map((byte) => `0${byte.toString(16)}`.slice(-2))\n .join(\"\");\n};\nconst getUpdatedTimestamp = () => (isTestEnv() ? 1 : Date.now());\n/**\n * Transforms array of objects containing `id` attribute,\n * or array of ids (strings), into a Map, keyd by `id`.\n */\nconst arrayToMap = (items) => {\n return items.reduce((acc, element) => {\n acc.set(typeof element === \"string\" ? element : element.id, element);\n return acc;\n }, new Map());\n};\nconst isTestEnv = () => { var _a; return typeof process !== \"undefined\" && ((_a = ({\"REACT_APP_BACKEND_V2_GET_URL\":\"https://json-dev.excalidraw.com/api/v2/\",\"REACT_APP_BACKEND_V2_POST_URL\":\"https://json-dev.excalidraw.com/api/v2/post/\",\"REACT_APP_LIBRARY_URL\":\"https://libraries.excalidraw.com\",\"REACT_APP_LIBRARY_BACKEND\":\"https://us-central1-excalidraw-room-persistence.cloudfunctions.net/libraries\",\"REACT_APP_WS_SERVER_URL\":\"http://localhost:3002\",\"REACT_APP_PORTAL_URL\":\"\",\"REACT_APP_FIREBASE_CONFIG\":\"{\\\"apiKey\\\":\\\"AIzaSyCMkxA60XIW8KbqMYL7edC4qT5l4qHX2h8\\\",\\\"authDomain\\\":\\\"excalidraw-oss-dev.firebaseapp.com\\\",\\\"projectId\\\":\\\"excalidraw-oss-dev\\\",\\\"storageBucket\\\":\\\"excalidraw-oss-dev.appspot.com\\\",\\\"messagingSenderId\\\":\\\"664559512677\\\",\\\"appId\\\":\\\"1:664559512677:web:a385181f2928d328a7aa8c\\\"}\",\"REACT_APP_DEV_ENABLE_SW\":\"\",\"REACT_APP_DEV_DISABLE_LIVE_RELOAD\":\"\",\"PKG_NAME\":\"@excalidraw/excalidraw\",\"PKG_VERSION\":\"0.12.0-54c7ec4\",\"IS_EXCALIDRAW_NPM_PACKAGE\":true})) === null || _a === void 0 ? void 0 : _a.NODE_ENV) === \"test\"; };\nconst isProdEnv = () => { var _a; return typeof process !== \"undefined\" && ((_a = ({\"REACT_APP_BACKEND_V2_GET_URL\":\"https://json-dev.excalidraw.com/api/v2/\",\"REACT_APP_BACKEND_V2_POST_URL\":\"https://json-dev.excalidraw.com/api/v2/post/\",\"REACT_APP_LIBRARY_URL\":\"https://libraries.excalidraw.com\",\"REACT_APP_LIBRARY_BACKEND\":\"https://us-central1-excalidraw-room-persistence.cloudfunctions.net/libraries\",\"REACT_APP_WS_SERVER_URL\":\"http://localhost:3002\",\"REACT_APP_PORTAL_URL\":\"\",\"REACT_APP_FIREBASE_CONFIG\":\"{\\\"apiKey\\\":\\\"AIzaSyCMkxA60XIW8KbqMYL7edC4qT5l4qHX2h8\\\",\\\"authDomain\\\":\\\"excalidraw-oss-dev.firebaseapp.com\\\",\\\"projectId\\\":\\\"excalidraw-oss-dev\\\",\\\"storageBucket\\\":\\\"excalidraw-oss-dev.appspot.com\\\",\\\"messagingSenderId\\\":\\\"664559512677\\\",\\\"appId\\\":\\\"1:664559512677:web:a385181f2928d328a7aa8c\\\"}\",\"REACT_APP_DEV_ENABLE_SW\":\"\",\"REACT_APP_DEV_DISABLE_LIVE_RELOAD\":\"\",\"PKG_NAME\":\"@excalidraw/excalidraw\",\"PKG_VERSION\":\"0.12.0-54c7ec4\",\"IS_EXCALIDRAW_NPM_PACKAGE\":true})) === null || _a === void 0 ? void 0 : _a.NODE_ENV) === \"production\"; };\nconst wrapEvent = (name, nativeEvent) => {\n return new CustomEvent(name, {\n detail: {\n nativeEvent,\n },\n cancelable: true,\n });\n};\nconst updateObject = (obj, updates) => {\n let didChange = false;\n for (const key in updates) {\n const value = updates[key];\n if (typeof value !== \"undefined\") {\n if (obj[key] === value &&\n // if object, always update because its attrs could have changed\n (typeof value !== \"object\" || value === null)) {\n continue;\n }\n didChange = true;\n }\n }\n if (!didChange) {\n return obj;\n }\n return Object.assign(Object.assign({}, obj), updates);\n};\nconst isPrimitive = (val) => {\n const type = typeof val;\n return val == null || (type !== \"object\" && type !== \"function\");\n};\nconst getFrame = () => {\n try {\n return window.self === window.top ? \"top\" : \"iframe\";\n }\n catch (error) {\n return \"iframe\";\n }\n};\nconst isPromiseLike = (value) => {\n return (!!value &&\n typeof value === \"object\" &&\n \"then\" in value &&\n \"catch\" in value &&\n \"finally\" in value);\n};\nconst queryFocusableElements = (container) => {\n const focusableElements = container === null || container === void 0 ? void 0 : container.querySelectorAll(\"button, a, input, select, textarea, div[tabindex], label[tabindex]\");\n return focusableElements\n ? Array.from(focusableElements).filter((element) => element.tabIndex > -1 && !element.disabled)\n : [];\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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LFFBQVEsSUFBSSxJQUFJLEtBQUssVUFBVSxDQUFDLENBQUM7QUFDbkUsQ0FBQyxDQUFDO0FBRUssTUFBTSxRQUFRLEdBQUcsR0FBRyxFQUFFO0lBQzNCLElBQUk7UUFDRixPQUFPLE1BQU0sQ0FBQyxJQUFJLEtBQUssTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUM7S0FDdEQ7SUFBQyxPQUFPLEtBQUssRUFBRTtRQUNkLE9BQU8sUUFBUSxDQUFDO0tBQ2pCO0FBQ0gsQ0FBQyxDQUFDO0FBRUssTUFBTSxhQUFhLEdBQUcsQ0FDM0IsS0FBVSxFQUNzQyxFQUFFO0lBQ2xELE9BQU8sQ0FDTCxDQUFDLENBQUMsS0FBSztRQUNQLE9BQU8sS0FBSyxLQUFLLFFBQVE7UUFDekIsTUFBTSxJQUFJLEtBQUs7UUFDZixPQUFPLElBQUksS0FBSztRQUNoQixTQUFTLElBQUksS0FBSyxDQUNuQixDQUFDO0FBQ0osQ0FBQyxDQUFDO0FBRUssTUFBTSxzQkFBc0IsR0FBRyxDQUFDLFNBQTZCLEVBQUUsRUFBRTtJQUN0RSxNQUFNLGlCQUFpQixHQUFHLFNBQVMsYUFBVCxTQUFTLHVCQUFULFNBQVMsQ0FBRSxnQkFBZ0IsQ0FDbkQsb0VBQW9FLENBQ3JFLENBQUM7SUFFRixPQUFPLGlCQUFpQjtRQUN0QixDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLE1BQU0sQ0FDbEMsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUNWLE9BQU8sQ0FBQyxRQUFRLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBRSxPQUE0QixDQUFDLFFBQVEsQ0FDbkU7UUFDSCxDQUFDLENBQUMsRUFBRSxDQUFDO0FBQ1QsQ0FBQyxDQUFDIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4uLy4uL3V0aWxzLnRzPzc2M2EiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IG9jIGZyb20gXCJvcGVuLWNvbG9yXCI7XG5cbmltcG9ydCBjb2xvcnMgZnJvbSBcIi4vY29sb3JzXCI7XG5pbXBvcnQge1xuICBDVVJTT1JfVFlQRSxcbiAgREVGQVVMVF9WRVJTSU9OLFxuICBFVkVOVCxcbiAgRk9OVF9GQU1JTFksXG4gIE1JTUVfVFlQRVMsXG4gIFRIRU1FLFxuICBXSU5ET1dTX0VNT0pJX0ZBTExCQUNLX0ZPTlQsXG59IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgRm9udEZhbWlseVZhbHVlcywgRm9udFN0cmluZyB9IGZyb20gXCIuL2VsZW1lbnQvdHlwZXNcIjtcbmltcG9ydCB7IEFwcFN0YXRlLCBEYXRhVVJMLCBMYXN0QWN0aXZlVG9vbEJlZm9yZUVyYXNlciwgWm9vbSB9IGZyb20gXCIuL3R5cGVzXCI7XG5pbXBvcnQgeyB1bnN0YWJsZV9iYXRjaGVkVXBkYXRlcyB9IGZyb20gXCJyZWFjdC1kb21cIjtcbmltcG9ydCB7IGlzRGFyd2luIH0gZnJvbSBcIi4va2V5c1wiO1xuaW1wb3J0IHsgU0hBUEVTIH0gZnJvbSBcIi4vc2hhcGVzXCI7XG5cbmxldCBtb2NrRGF0ZVRpbWU6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuXG5leHBvcnQgY29uc3Qgc2V0RGF0ZVRpbWVGb3JUZXN0cyA9IChkYXRlVGltZTogc3RyaW5nKSA9PiB7XG4gIG1vY2tEYXRlVGltZSA9IGRhdGVUaW1lO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldERhdGVUaW1lID0gKCkgPT4ge1xuICBpZiAobW9ja0RhdGVUaW1lKSB7XG4gICAgcmV0dXJuIG1vY2tEYXRlVGltZTtcbiAgfVxuXG4gIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZSgpO1xuICBjb25zdCB5ZWFyID0gZGF0ZS5nZXRGdWxsWWVhcigpO1xuICBjb25zdCBtb250aCA9IGAke2RhdGUuZ2V0TW9udGgoKSArIDF9YC5wYWRTdGFydCgyLCBcIjBcIik7XG4gIGNvbnN0IGRheSA9IGAke2RhdGUuZ2V0RGF0ZSgpfWAucGFkU3RhcnQoMiwgXCIwXCIpO1xuICBjb25zdCBociA9IGAke2RhdGUuZ2V0SG91cnMoKX1gLnBhZFN0YXJ0KDIsIFwiMFwiKTtcbiAgY29uc3QgbWluID0gYCR7ZGF0ZS5nZXRNaW51dGVzKCl9YC5wYWRTdGFydCgyLCBcIjBcIik7XG5cbiAgcmV0dXJuIGAke3llYXJ9LSR7bW9udGh9LSR7ZGF5fS0ke2hyfSR7bWlufWA7XG59O1xuXG5leHBvcnQgY29uc3QgY2FwaXRhbGl6ZVN0cmluZyA9IChzdHI6IHN0cmluZykgPT5cbiAgc3RyLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgc3RyLnNsaWNlKDEpO1xuXG5leHBvcnQgY29uc3QgaXNUb29sSWNvbiA9IChcbiAgdGFyZ2V0OiBFbGVtZW50IHwgRXZlbnRUYXJnZXQgfCBudWxsLFxuKTogdGFyZ2V0IGlzIEhUTUxFbGVtZW50ID0+XG4gIHRhcmdldCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50ICYmIHRhcmdldC5jbGFzc05hbWUuaW5jbHVkZXMoXCJUb29sSWNvblwiKTtcblxuZXhwb3J0IGNvbnN0IGlzSW5wdXRMaWtlID0gKFxuICB0YXJnZXQ6IEVsZW1lbnQgfCBFdmVudFRhcmdldCB8IG51bGwsXG4pOiB0YXJnZXQgaXNcbiAgfCBIVE1MSW5wdXRFbGVtZW50XG4gIHwgSFRNTFRleHRBcmVhRWxlbWVudFxuICB8IEhUTUxTZWxlY3RFbGVtZW50XG4gIHwgSFRNTEJSRWxlbWVudFxuICB8IEhUTUxEaXZFbGVtZW50ID0+XG4gICh0YXJnZXQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCAmJiB0YXJnZXQuZGF0YXNldC50eXBlID09PSBcInd5c2l3eWdcIikgfHxcbiAgdGFyZ2V0IGluc3RhbmNlb2YgSFRNTEJSRWxlbWVudCB8fCAvLyBuZXdsaW5lIGluIHd5c2l3eWdcbiAgdGFyZ2V0IGluc3RhbmNlb2YgSFRNTElucHV0RWxlbWVudCB8fFxuICB0YXJnZXQgaW5zdGFuY2VvZiBIVE1MVGV4dEFyZWFFbGVtZW50IHx8XG4gIHRhcmdldCBpbnN0YW5jZW9mIEhUTUxTZWxlY3RFbGVtZW50O1xuXG5leHBvcnQgY29uc3QgaXNXcml0YWJsZUVsZW1lbnQgPSAoXG4gIHRhcmdldDogRWxlbWVudCB8IEV2ZW50VGFyZ2V0IHwgbnVsbCxcbik6IHRhcmdldCBpc1xuICB8IEhUTUxJbnB1dEVsZW1lbnRcbiAgfCBIVE1MVGV4dEFyZWFFbGVtZW50XG4gIHwgSFRNTEJSRWxlbWVudFxuICB8IEhUTUxEaXZFbGVtZW50ID0+XG4gICh0YXJnZXQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCAmJiB0YXJnZXQuZGF0YXNldC50eXBlID09PSBcInd5c2l3eWdcIikgfHxcbiAgdGFyZ2V0IGluc3RhbmNlb2YgSFRNTEJSRWxlbWVudCB8fCAvLyBuZXdsaW5lIGluIHd5c2l3eWdcbiAgdGFyZ2V0IGluc3RhbmNlb2YgSFRNTFRleHRBcmVhRWxlbWVudCB8fFxuICAodGFyZ2V0IGluc3RhbmNlb2YgSFRNTElucHV0RWxlbWVudCAmJlxuICAgICh0YXJnZXQudHlwZSA9PT0gXCJ0ZXh0XCIgfHwgdGFyZ2V0LnR5cGUgPT09IFwibnVtYmVyXCIpKTtcblxuZXhwb3J0IGNvbnN0IGdldEZvbnRGYW1pbHlTdHJpbmcgPSAoe1xuICBmb250RmFtaWx5LFxufToge1xuICBmb250RmFtaWx5OiBGb250RmFtaWx5VmFsdWVzO1xufSkgPT4ge1xuICBmb3IgKGNvbnN0IFtmb250RmFtaWx5U3RyaW5nLCBpZF0gb2YgT2JqZWN0LmVudHJpZXMoRk9OVF9GQU1JTFkpKSB7XG4gICAgaWYgKGlkID09PSBmb250RmFtaWx5KSB7XG4gICAgICByZXR1cm4gYCR7Zm9udEZhbWlseVN0cmluZ30sICR7V0lORE9XU19FTU9KSV9GQUxMQkFDS19GT05UfWA7XG4gICAgfVxuICB9XG4gIHJldHVybiBXSU5ET1dTX0VNT0pJX0ZBTExCQUNLX0ZPTlQ7XG59O1xuXG4vKiogcmV0dXJucyBmb250U2l6ZStmb250RmFtaWx5IHN0cmluZyBmb3IgYXNzaWdubWVudCB0byBET00gZWxlbWVudHMgKi9cbmV4cG9ydCBjb25zdCBnZXRGb250U3RyaW5nID0gKHtcbiAgZm9udFNpemUsXG4gIGZvbnRGYW1pbHksXG59OiB7XG4gIGZvbnRTaXplOiBudW1iZXI7XG4gIGZvbnRGYW1pbHk6IEZvbnRGYW1pbHlWYWx1ZXM7XG59KSA9PiB7XG4gIHJldHVybiBgJHtmb250U2l6ZX1weCAke2dldEZvbnRGYW1pbHlTdHJpbmcoeyBmb250RmFtaWx5IH0pfWAgYXMgRm9udFN0cmluZztcbn07XG5cbmV4cG9ydCBjb25zdCBkZWJvdW5jZSA9IDxUIGV4dGVuZHMgYW55W10+KFxuICBmbjogKC4uLmFyZ3M6IFQpID0+IHZvaWQsXG4gIHRpbWVvdXQ6IG51bWJlcixcbikgPT4ge1xuICBsZXQgaGFuZGxlID0gMDtcbiAgbGV0IGxhc3RBcmdzOiBUIHwgbnVsbCA9IG51bGw7XG4gIGNvbnN0IHJldCA9ICguLi5hcmdzOiBUKSA9PiB7XG4gICAgbGFzdEFyZ3MgPSBhcmdzO1xuICAgIGNsZWFyVGltZW91dChoYW5kbGUpO1xuICAgIGhhbmRsZSA9IHdpbmRvdy5zZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGxhc3RBcmdzID0gbnVsbDtcbiAgICAgIGZuKC4uLmFyZ3MpO1xuICAgIH0sIHRpbWVvdXQpO1xuICB9O1xuICByZXQuZmx1c2ggPSAoKSA9PiB7XG4gICAgY2xlYXJUaW1lb3V0KGhhbmRsZSk7XG4gICAgaWYgKGxhc3RBcmdzKSB7XG4gICAgICBjb25zdCBfbGFzdEFyZ3MgPSBsYXN0QXJncztcbiAgICAgIGxhc3RBcmdzID0gbnVsbDtcbiAgICAgIGZuKC4uLl9sYXN0QXJncyk7XG4gICAgfVxuICB9O1xuICByZXQuY2FuY2VsID0gKCkgPT4ge1xuICAgIGxhc3RBcmdzID0gbnVsbDtcbiAgICBjbGVhclRpbWVvdXQoaGFuZGxlKTtcbiAgfTtcbiAgcmV0dXJuIHJldDtcbn07XG5cbi8vIHRocm90dGxlIGNhbGxiYWNrIHRvIGV4ZWN1dGUgb25jZSBwZXIgYW5pbWF0aW9uIGZyYW1lXG5leHBvcnQgY29uc3QgdGhyb3R0bGVSQUYgPSA8VCBleHRlbmRzIGFueVtdPihcbiAgZm46ICguLi5hcmdzOiBUKSA9PiB2b2lkLFxuICBvcHRzPzogeyB0cmFpbGluZz86IGJvb2xlYW4gfSxcbikgPT4ge1xuICBsZXQgdGltZXJJZDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG4gIGxldCBsYXN0QXJnczogVCB8IG51bGwgPSBudWxsO1xuICBsZXQgbGFzdEFyZ3NUcmFpbGluZzogVCB8IG51bGwgPSBudWxsO1xuXG4gIGNvbnN0IHNjaGVkdWxlRnVuYyA9IChhcmdzOiBUKSA9PiB7XG4gICAgdGltZXJJZCA9IHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xuICAgICAgdGltZXJJZCA9IG51bGw7XG4gICAgICBmbiguLi5hcmdzKTtcbiAgICAgIGxhc3RBcmdzID0gbnVsbDtcbiAgICAgIGlmIChsYXN0QXJnc1RyYWlsaW5nKSB7XG4gICAgICAgIGxhc3RBcmdzID0gbGFzdEFyZ3NUcmFpbGluZztcbiAgICAgICAgbGFzdEFyZ3NUcmFpbGluZyA9IG51bGw7XG4gICAgICAgIHNjaGVkdWxlRnVuYyhsYXN0QXJncyk7XG4gICAgICB9XG4gICAgfSk7XG4gIH07XG5cbiAgY29uc3QgcmV0ID0gKC4uLmFyZ3M6IFQpID0+IHtcbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwidGVzdFwiKSB7XG4gICAgICBmbiguLi5hcmdzKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgbGFzdEFyZ3MgPSBhcmdzO1xuICAgIGlmICh0aW1lcklkID09PSBudWxsKSB7XG4gICAgICBzY2hlZHVsZUZ1bmMobGFzdEFyZ3MpO1xuICAgIH0gZWxzZSBpZiAob3B0cz8udHJhaWxpbmcpIHtcbiAgICAgIGxhc3RBcmdzVHJhaWxpbmcgPSBhcmdzO1xuICAgIH1cbiAgfTtcbiAgcmV0LmZsdXNoID0gKCkgPT4ge1xuICAgIGlmICh0aW1lcklkICE9PSBudWxsKSB7XG4gICAgICBjYW5jZWxBbmltYXRpb25GcmFtZSh0aW1lcklkKTtcbiAgICAgIHRpbWVySWQgPSBudWxsO1xuICAgIH1cbiAgICBpZiAobGFzdEFyZ3MpIHtcbiAgICAgIGZuKC4uLihsYXN0QXJnc1RyYWlsaW5nIHx8IGxhc3RBcmdzKSk7XG4gICAgICBsYXN0QXJncyA9IGxhc3RBcmdzVHJhaWxpbmcgPSBudWxsO1xuICAgIH1cbiAgfTtcbiAgcmV0LmNhbmNlbCA9ICgpID0+IHtcbiAgICBsYXN0QXJncyA9IGxhc3RBcmdzVHJhaWxpbmcgPSBudWxsO1xuICAgIGlmICh0aW1lcklkICE9PSBudWxsKSB7XG4gICAgICBjYW5jZWxBbmltYXRpb25GcmFtZSh0aW1lcklkKTtcbiAgICAgIHRpbWVySWQgPSBudWxsO1xuICAgIH1cbiAgfTtcbiAgcmV0dXJuIHJldDtcbn07XG5cbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9sb2Rhc2gvbG9kYXNoL2Jsb2IvZXMvY2h1bmsuanNcbmV4cG9ydCBjb25zdCBjaHVuayA9IDxUIGV4dGVuZHMgYW55PihcbiAgYXJyYXk6IHJlYWRvbmx5IFRbXSxcbiAgc2l6ZTogbnVtYmVyLFxuKTogVFtdW10gPT4ge1xuICBpZiAoIWFycmF5Lmxlbmd0aCB8fCBzaXplIDwgMSkge1xuICAgIHJldHVybiBbXTtcbiAgfVxuICBsZXQgaW5kZXggPSAwO1xuICBsZXQgcmVzSW5kZXggPSAwO1xuICBjb25zdCByZXN1bHQgPSBBcnJheShNYXRoLmNlaWwoYXJyYXkubGVuZ3RoIC8gc2l6ZSkpO1xuICB3aGlsZSAoaW5kZXggPCBhcnJheS5sZW5ndGgpIHtcbiAgICByZXN1bHRbcmVzSW5kZXgrK10gPSBhcnJheS5zbGljZShpbmRleCwgKGluZGV4ICs9IHNpemUpKTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufTtcblxuZXhwb3J0IGNvbnN0IHNlbGVjdE5vZGUgPSAobm9kZTogRWxlbWVudCkgPT4ge1xuICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XG4gIGlmIChzZWxlY3Rpb24pIHtcbiAgICBjb25zdCByYW5nZSA9IGRvY3VtZW50LmNyZWF0ZVJhbmdlKCk7XG4gICAgcmFuZ2Uuc2VsZWN0Tm9kZUNvbnRlbnRzKG5vZGUpO1xuICAgIHNlbGVjdGlvbi5yZW1vdmVBbGxSYW5nZXMoKTtcbiAgICBzZWxlY3Rpb24uYWRkUmFuZ2UocmFuZ2UpO1xuICB9XG59O1xuXG5leHBvcnQgY29uc3QgcmVtb3ZlU2VsZWN0aW9uID0gKCkgPT4ge1xuICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XG4gIGlmIChzZWxlY3Rpb24pIHtcbiAgICBzZWxlY3Rpb24ucmVtb3ZlQWxsUmFuZ2VzKCk7XG4gIH1cbn07XG5cbmV4cG9ydCBjb25zdCBkaXN0YW5jZSA9ICh4OiBudW1iZXIsIHk6IG51bWJlcikgPT4gTWF0aC5hYnMoeCAtIHkpO1xuXG5leHBvcnQgY29uc3QgdXBkYXRlQWN0aXZlVG9vbCA9IChcbiAgYXBwU3RhdGU6IFBpY2s8QXBwU3RhdGUsIFwiYWN0aXZlVG9vbFwiPixcbiAgZGF0YTogKFxuICAgIHwgeyB0eXBlOiB0eXBlb2YgU0hBUEVTW251bWJlcl1bXCJ2YWx1ZVwiXSB8IFwiZXJhc2VyXCIgfVxuICAgIHwgeyB0eXBlOiBcImN1c3RvbVwiOyBjdXN0b21UeXBlOiBzdHJpbmcgfVxuICApICYgeyBsYXN0QWN0aXZlVG9vbEJlZm9yZUVyYXNlcj86IExhc3RBY3RpdmVUb29sQmVmb3JlRXJhc2VyIH0sXG4pOiBBcHBTdGF0ZVtcImFjdGl2ZVRvb2xcIl0gPT4ge1xuICBpZiAoZGF0YS50eXBlID09PSBcImN1c3RvbVwiKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLmFwcFN0YXRlLmFjdGl2ZVRvb2wsXG4gICAgICB0eXBlOiBcImN1c3RvbVwiLFxuICAgICAgY3VzdG9tVHlwZTogZGF0YS5jdXN0b21UeXBlLFxuICAgIH07XG4gIH1cblxuICByZXR1cm4ge1xuICAgIC4uLmFwcFN0YXRlLmFjdGl2ZVRvb2wsXG4gICAgbGFzdEFjdGl2ZVRvb2xCZWZvcmVFcmFzZXI6XG4gICAgICBkYXRhLmxhc3RBY3RpdmVUb29sQmVmb3JlRXJhc2VyID09PSB1bmRlZmluZWRcbiAgICAgICAgPyBhcHBTdGF0ZS5hY3RpdmVUb29sLmxhc3RBY3RpdmVUb29sQmVmb3JlRXJhc2VyXG4gICAgICAgIDogZGF0YS5sYXN0QWN0aXZlVG9vbEJlZm9yZUVyYXNlcixcbiAgICB0eXBlOiBkYXRhLnR5cGUsXG4gICAgY3VzdG9tVHlwZTogbnVsbCxcbiAgfTtcbn07XG5cbmV4cG9ydCBjb25zdCByZXNldEN1cnNvciA9IChjYW52YXM6IEhUTUxDYW52YXNFbGVtZW50IHwgbnVsbCkgPT4ge1xuICBpZiAoY2FudmFzKSB7XG4gICAgY2FudmFzLnN0eWxlLmN1cnNvciA9IFwiXCI7XG4gIH1cbn07XG5cbmV4cG9ydCBjb25zdCBzZXRDdXJzb3IgPSAoY2FudmFzOiBIVE1MQ2FudmFzRWxlbWVudCB8IG51bGwsIGN1cnNvcjogc3RyaW5nKSA9PiB7XG4gIGlmIChjYW52YXMpIHtcbiAgICBjYW52YXMuc3R5bGUuY3Vyc29yID0gY3Vyc29yO1xuICB9XG59O1xuXG5sZXQgZXJhc2VyQ2FudmFzQ2FjaGU6IGFueTtcbmxldCBwcmV2aWV3RGF0YVVSTDogc3RyaW5nO1xuZXhwb3J0IGNvbnN0IHNldEVyYXNlckN1cnNvciA9IChcbiAgY2FudmFzOiBIVE1MQ2FudmFzRWxlbWVudCB8IG51bGwsXG4gIHRoZW1lOiBBcHBTdGF0ZVtcInRoZW1lXCJdLFxuKSA9PiB7XG4gIGNvbnN0IGN1cnNvckltYWdlU2l6ZVB4ID0gMjA7XG5cbiAgY29uc3QgZHJhd0NhbnZhcyA9ICgpID0+IHtcbiAgICBjb25zdCBpc0RhcmtUaGVtZSA9IHRoZW1lID09PSBUSEVNRS5EQVJLO1xuICAgIGVyYXNlckNhbnZhc0NhY2hlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImNhbnZhc1wiKTtcbiAgICBlcmFzZXJDYW52YXNDYWNoZS50aGVtZSA9IHRoZW1lO1xuICAgIGVyYXNlckNhbnZhc0NhY2hlLmhlaWdodCA9IGN1cnNvckltYWdlU2l6ZVB4O1xuICAgIGVyYXNlckNhbnZhc0NhY2hlLndpZHRoID0gY3Vyc29ySW1hZ2VTaXplUHg7XG4gICAgY29uc3QgY29udGV4dCA9IGVyYXNlckNhbnZhc0NhY2hlLmdldENvbnRleHQoXCIyZFwiKSE7XG4gICAgY29udGV4dC5saW5lV2lkdGggPSAxO1xuICAgIGNvbnRleHQuYmVnaW5QYXRoKCk7XG4gICAgY29udGV4dC5hcmMoXG4gICAgICBlcmFzZXJDYW52YXNDYWNoZS53aWR0aCAvIDIsXG4gICAgICBlcmFzZXJDYW52YXNDYWNoZS5oZWlnaHQgLyAyLFxuICAgICAgNSxcbiAgICAgIDAsXG4gICAgICAyICogTWF0aC5QSSxcbiAgICApO1xuICAgIGNvbnRleHQuZmlsbFN0eWxlID0gaXNEYXJrVGhlbWUgPyBvYy5ibGFjayA6IG9jLndoaXRlO1xuICAgIGNvbnRleHQuZmlsbCgpO1xuICAgIGNvbnRleHQuc3Ryb2tlU3R5bGUgPSBpc0RhcmtUaGVtZSA/IG9jLndoaXRlIDogb2MuYmxhY2s7XG4gICAgY29udGV4dC5zdHJva2UoKTtcbiAgICBwcmV2aWV3RGF0YVVSTCA9IGVyYXNlckNhbnZhc0NhY2hlLnRvRGF0YVVSTChNSU1FX1RZUEVTLnN2ZykgYXMgRGF0YVVSTDtcbiAgfTtcbiAgaWYgKCFlcmFzZXJDYW52YXNDYWNoZSB8fCBlcmFzZXJDYW52YXNDYWNoZS50aGVtZSAhPT0gdGhlbWUpIHtcbiAgICBkcmF3Q2FudmFzKCk7XG4gIH1cblxuICBzZXRDdXJzb3IoXG4gICAgY2FudmFzLFxuICAgIGB1cmwoJHtwcmV2aWV3RGF0YVVSTH0pICR7Y3Vyc29ySW1hZ2VTaXplUHggLyAyfSAke1xuICAgICAgY3Vyc29ySW1hZ2VTaXplUHggLyAyXG4gICAgfSwgYXV0b2AsXG4gICk7XG59O1xuXG5leHBvcnQgY29uc3Qgc2V0Q3Vyc29yRm9yU2hhcGUgPSAoXG4gIGNhbnZhczogSFRNTENhbnZhc0VsZW1lbnQgfCBudWxsLFxuICBhcHBTdGF0ZTogQXBwU3RhdGUsXG4pID0+IHtcbiAgaWYgKCFjYW52YXMpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKGFwcFN0YXRlLmFjdGl2ZVRvb2wudHlwZSA9PT0gXCJzZWxlY3Rpb25cIikge1xuICAgIHJlc2V0Q3Vyc29yKGNhbnZhcyk7XG4gIH0gZWxzZSBpZiAoYXBwU3RhdGUuYWN0aXZlVG9vbC50eXBlID09PSBcImVyYXNlclwiKSB7XG4gICAgc2V0RXJhc2VyQ3Vyc29yKGNhbnZhcywgYXBwU3RhdGUudGhlbWUpO1xuICAgIC8vIGRvIG5vdGhpbmcgaWYgaW1hZ2UgdG9vbCBpcyBzZWxlY3RlZCB3aGljaCBzdWdnZXN0cyB0aGVyZSdzXG4gICAgLy8gYSBpbWFnZS1wcmV2aWV3IHNldCBhcyB0aGUgY3Vyc29yXG4gICAgLy8gSWdub3JlIGN1c3RvbSB0eXBlIGFzIHdlbGwgYW5kIGxldCBob3N0IGRlY2lkZVxuICB9IGVsc2UgaWYgKCFbXCJpbWFnZVwiLCBcImN1c3RvbVwiXS5pbmNsdWRlcyhhcHBTdGF0ZS5hY3RpdmVUb29sLnR5cGUpKSB7XG4gICAgY2FudmFzLnN0eWxlLmN1cnNvciA9IENVUlNPUl9UWVBFLkNST1NTSEFJUjtcbiAgfVxufTtcblxuZXhwb3J0IGNvbnN0IGlzRnVsbFNjcmVlbiA9ICgpID0+XG4gIGRvY3VtZW50LmZ1bGxzY3JlZW5FbGVtZW50Py5ub2RlTmFtZSA9PT0gXCJIVE1MXCI7XG5cbmV4cG9ydCBjb25zdCBhbGxvd0Z1bGxTY3JlZW4gPSAoKSA9PlxuICBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQucmVxdWVzdEZ1bGxzY3JlZW4oKTtcblxuZXhwb3J0IGNvbnN0IGV4aXRGdWxsU2NyZWVuID0gKCkgPT4gZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4oKTtcblxuZXhwb3J0IGNvbnN0IGdldFNob3J0Y3V0S2V5ID0gKHNob3J0Y3V0OiBzdHJpbmcpOiBzdHJpbmcgPT4ge1xuICBzaG9ydGN1dCA9IHNob3J0Y3V0XG4gICAgLnJlcGxhY2UoL1xcYkFsdFxcYi9pLCBcIkFsdFwiKVxuICAgIC5yZXBsYWNlKC9cXGJTaGlmdFxcYi9pLCBcIlNoaWZ0XCIpXG4gICAgLnJlcGxhY2UoL1xcYihFbnRlcnxSZXR1cm4pXFxiL2ksIFwiRW50ZXJcIilcbiAgICAucmVwbGFjZSgvXFxiRGVsXFxiL2ksIFwiRGVsZXRlXCIpO1xuXG4gIGlmIChpc0Rhcndpbikge1xuICAgIHJldHVybiBzaG9ydGN1dFxuICAgICAgLnJlcGxhY2UoL1xcYkN0cmxPckNtZFxcYi9pLCBcIkNtZFwiKVxuICAgICAgLnJlcGxhY2UoL1xcYkFsdFxcYi9pLCBcIk9wdGlvblwiKTtcbiAgfVxuICByZXR1cm4gc2hvcnRjdXQucmVwbGFjZSgvXFxiQ3RybE9yQ21kXFxiL2ksIFwiQ3RybFwiKTtcbn07XG5cbmV4cG9ydCBjb25zdCB2aWV3cG9ydENvb3Jkc1RvU2NlbmVDb29yZHMgPSAoXG4gIHsgY2xpZW50WCwgY2xpZW50WSB9OiB7IGNsaWVudFg6IG51bWJlcjsgY2xpZW50WTogbnVtYmVyIH0sXG4gIHtcbiAgICB6b29tLFxuICAgIG9mZnNldExlZnQsXG4gICAgb2Zmc2V0VG9wLFxuICAgIHNjcm9sbFgsXG4gICAgc2Nyb2xsWSxcbiAgfToge1xuICAgIHpvb206IFpvb207XG4gICAgb2Zmc2V0TGVmdDogbnVtYmVyO1xuICAgIG9mZnNldFRvcDogbnVtYmVyO1xuICAgIHNjcm9sbFg6IG51bWJlcjtcbiAgICBzY3JvbGxZOiBudW1iZXI7XG4gIH0sXG4pID0+IHtcbiAgY29uc3QgaW52U2NhbGUgPSAxIC8gem9vbS52YWx1ZTtcbiAgY29uc3QgeCA9IChjbGllbnRYIC0gb2Zmc2V0TGVmdCkgKiBpbnZTY2FsZSAtIHNjcm9sbFg7XG4gIGNvbnN0IHkgPSAoY2xpZW50WSAtIG9mZnNldFRvcCkgKiBpbnZTY2FsZSAtIHNjcm9sbFk7XG5cbiAgcmV0dXJuIHsgeCwgeSB9O1xufTtcblxuZXhwb3J0IGNvbnN0IHNjZW5lQ29vcmRzVG9WaWV3cG9ydENvb3JkcyA9IChcbiAgeyBzY2VuZVgsIHNjZW5lWSB9OiB7IHNjZW5lWDogbnVtYmVyOyBzY2VuZVk6IG51bWJlciB9LFxuICB7XG4gICAgem9vbSxcbiAgICBvZmZzZXRMZWZ0LFxuICAgIG9mZnNldFRvcCxcbiAgICBzY3JvbGxYLFxuICAgIHNjcm9sbFksXG4gIH06IHtcbiAgICB6b29tOiBab29tO1xuICAgIG9mZnNldExlZnQ6IG51bWJlcjtcbiAgICBvZmZzZXRUb3A6IG51bWJlcjtcbiAgICBzY3JvbGxYOiBudW1iZXI7XG4gICAgc2Nyb2xsWTogbnVtYmVyO1xuICB9LFxuKSA9PiB7XG4gIGNvbnN0IHggPSAoc2NlbmVYICsgc2Nyb2xsWCkgKiB6b29tLnZhbHVlICsgb2Zmc2V0TGVmdDtcbiAgY29uc3QgeSA9IChzY2VuZVkgKyBzY3JvbGxZKSAqIHpvb20udmFsdWUgKyBvZmZzZXRUb3A7XG4gIHJldHVybiB7IHgsIHkgfTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRHbG9iYWxDU1NWYXJpYWJsZSA9IChuYW1lOiBzdHJpbmcpID0+XG4gIGdldENvbXB1dGVkU3R5bGUoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KS5nZXRQcm9wZXJ0eVZhbHVlKGAtLSR7bmFtZX1gKTtcblxuY29uc3QgUlNfTFRSX0NIQVJTID1cbiAgXCJBLVphLXpcXHUwMEMwLVxcdTAwRDZcXHUwMEQ4LVxcdTAwRjZcXHUwMEY4LVxcdTAyQjhcXHUwMzAwLVxcdTA1OTBcXHUwODAwLVxcdTFGRkZcIiArXG4gIFwiXFx1MkMwMC1cXHVGQjFDXFx1RkRGRS1cXHVGRTZGXFx1RkVGRC1cXHVGRkZGXCI7XG5jb25zdCBSU19SVExfQ0hBUlMgPSBcIlxcdTA1OTEtXFx1MDdGRlxcdUZCMUQtXFx1RkRGRFxcdUZFNzAtXFx1RkVGQ1wiO1xuY29uc3QgUkVfUlRMX0NIRUNLID0gbmV3IFJlZ0V4cChgXlteJHtSU19MVFJfQ0hBUlN9XSpbJHtSU19SVExfQ0hBUlN9XWApO1xuLyoqXG4gKiBDaGVja3Mgd2hldGhlciBmaXJzdCBkaXJlY3Rpb25hbCBjaGFyYWN0ZXIgaXMgUlRMLiBNZWFuaW5nIHdoZXRoZXIgaXQgc3RhcnRzXG4gKiAgd2l0aCBSVEwgY2hhcmFjdGVycywgb3IgaW5kZXRlcm1pbmF0ZSAobnVtYmVycyBldGMuKSBjaGFyYWN0ZXJzIGZvbGxvd2VkIGJ5XG4gKiAgUlRMLlxuICogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9leGNhbGlkcmF3L2V4Y2FsaWRyYXcvcHVsbC8xNzIyI2Rpc2N1c3Npb25fcjQzNjM0MDE3MVxuICovXG5leHBvcnQgY29uc3QgaXNSVEwgPSAodGV4dDogc3RyaW5nKSA9PiBSRV9SVExfQ0hFQ0sudGVzdCh0ZXh0KTtcblxuZXhwb3J0IGNvbnN0IHR1cGxlVG9Db29ycyA9IChcbiAgeHlUdXBsZTogcmVhZG9ubHkgW251bWJlciwgbnVtYmVyXSxcbik6IHsgeDogbnVtYmVyOyB5OiBudW1iZXIgfSA9PiB7XG4gIGNvbnN0IFt4LCB5XSA9IHh5VHVwbGU7XG4gIHJldHVybiB7IHgsIHkgfTtcbn07XG5cbi8qKiB1c2UgYXMgYSByZWplY3Rpb25IYW5kbGVyIHRvIG11dGUgZmlsZXN5c3RlbSBBYm9ydCBlcnJvcnMgKi9cbmV4cG9ydCBjb25zdCBtdXRlRlNBYm9ydEVycm9yID0gKGVycm9yPzogRXJyb3IpID0+IHtcbiAgaWYgKGVycm9yPy5uYW1lID09PSBcIkFib3J0RXJyb3JcIikge1xuICAgIGNvbnNvbGUud2FybihlcnJvcik7XG4gICAgcmV0dXJuO1xuICB9XG4gIHRocm93IGVycm9yO1xufTtcblxuZXhwb3J0IGNvbnN0IGZpbmRJbmRleCA9IDxUPihcbiAgYXJyYXk6IHJlYWRvbmx5IFRbXSxcbiAgY2I6IChlbGVtZW50OiBULCBpbmRleDogbnVtYmVyLCBhcnJheTogcmVhZG9ubHkgVFtdKSA9PiBib29sZWFuLFxuICBmcm9tSW5kZXg6IG51bWJlciA9IDAsXG4pID0+IHtcbiAgaWYgKGZyb21JbmRleCA8IDApIHtcbiAgICBmcm9tSW5kZXggPSBhcnJheS5sZW5ndGggKyBmcm9tSW5kZXg7XG4gIH1cbiAgZnJvbUluZGV4ID0gTWF0aC5taW4oYXJyYXkubGVuZ3RoLCBNYXRoLm1heChmcm9tSW5kZXgsIDApKTtcbiAgbGV0IGluZGV4ID0gZnJvbUluZGV4IC0gMTtcbiAgd2hpbGUgKCsraW5kZXggPCBhcnJheS5sZW5ndGgpIHtcbiAgICBpZiAoY2IoYXJyYXlbaW5kZXhdLCBpbmRleCwgYXJyYXkpKSB7XG4gICAgICByZXR1cm4gaW5kZXg7XG4gICAgfVxuICB9XG4gIHJldHVybiAtMTtcbn07XG5cbmV4cG9ydCBjb25zdCBmaW5kTGFzdEluZGV4ID0gPFQ+KFxuICBhcnJheTogcmVhZG9ubHkgVFtdLFxuICBjYjogKGVsZW1lbnQ6IFQsIGluZGV4OiBudW1iZXIsIGFycmF5OiByZWFkb25seSBUW10pID0+IGJvb2xlYW4sXG4gIGZyb21JbmRleDogbnVtYmVyID0gYXJyYXkubGVuZ3RoIC0gMSxcbikgPT4ge1xuICBpZiAoZnJvbUluZGV4IDwgMCkge1xuICAgIGZyb21JbmRleCA9IGFycmF5Lmxlbmd0aCArIGZyb21JbmRleDtcbiAgfVxuICBmcm9tSW5kZXggPSBNYXRoLm1pbihhcnJheS5sZW5ndGggLSAxLCBNYXRoLm1heChmcm9tSW5kZXgsIDApKTtcbiAgbGV0IGluZGV4ID0gZnJvbUluZGV4ICsgMTtcbiAgd2hpbGUgKC0taW5kZXggPiAtMSkge1xuICAgIGlmIChjYihhcnJheVtpbmRleF0sIGluZGV4LCBhcnJheSkpIHtcbiAgICAgIHJldHVybiBpbmRleDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIC0xO1xufTtcblxuZXhwb3J0IGNvbnN0IGlzVHJhbnNwYXJlbnQgPSAoY29sb3I6IHN0cmluZykgPT4ge1xuICBjb25zdCBpc1JHQlRyYW5zcGFyZW50ID0gY29sb3IubGVuZ3RoID09PSA1ICYmIGNvbG9yLnN1YnN0cig0LCAxKSA9PT0gXCIwXCI7XG4gIGNvbnN0IGlzUlJHR0JCVHJhbnNwYXJlbnQgPSBjb2xvci5sZW5ndGggPT09IDkgJiYgY29sb3Iuc3Vic3RyKDcsIDIpID09PSBcIjAwXCI7XG4gIHJldHVybiAoXG4gICAgaXNSR0JUcmFuc3BhcmVudCB8fFxuICAgIGlzUlJHR0JCVHJhbnNwYXJlbnQgfHxcbiAgICBjb2xvciA9PT0gY29sb3JzLmVsZW1lbnRCYWNrZ3JvdW5kWzBdXG4gICk7XG59O1xuXG5leHBvcnQgdHlwZSBSZXNvbHZhYmxlUHJvbWlzZTxUPiA9IFByb21pc2U8VD4gJiB7XG4gIHJlc29sdmU6IFtUXSBleHRlbmRzIFt1bmRlZmluZWRdID8gKHZhbHVlPzogVCkgPT4gdm9pZCA6ICh2YWx1ZTogVCkgPT4gdm9pZDtcbiAgcmVqZWN0OiAoZXJyb3I6IEVycm9yKSA9PiB2b2lkO1xufTtcbmV4cG9ydCBjb25zdCByZXNvbHZhYmxlUHJvbWlzZSA9IDxUPigpID0+IHtcbiAgbGV0IHJlc29sdmUhOiBhbnk7XG4gIGxldCByZWplY3QhOiBhbnk7XG4gIGNvbnN0IHByb21pc2UgPSBuZXcgUHJvbWlzZSgoX3Jlc29sdmUsIF9yZWplY3QpID0+IHtcbiAgICByZXNvbHZlID0gX3Jlc29sdmU7XG4gICAgcmVqZWN0ID0gX3JlamVjdDtcbiAgfSk7XG4gIChwcm9taXNlIGFzIGFueSkucmVzb2x2ZSA9IHJlc29sdmU7XG4gIChwcm9taXNlIGFzIGFueSkucmVqZWN0ID0gcmVqZWN0O1xuICByZXR1cm4gcHJvbWlzZSBhcyBSZXNvbHZhYmxlUHJvbWlzZTxUPjtcbn07XG5cbi8qKlxuICogQHBhcmFtIGZ1bmMgaGFuZGxlciB0YWtpbmcgYXQgbW9zdCBzaW5nbGUgcGFyYW1ldGVyIChldmVudCkuXG4gKi9cbmV4cG9ydCBjb25zdCB3aXRoQmF0Y2hlZFVwZGF0ZXMgPSA8XG4gIFRGdW5jdGlvbiBleHRlbmRzICgoZXZlbnQ6IGFueSkgPT4gdm9pZCkgfCAoKCkgPT4gdm9pZCksXG4+KFxuICBmdW5jOiBQYXJhbWV0ZXJzPFRGdW5jdGlvbj5bXCJsZW5ndGhcIl0gZXh0ZW5kcyAwIHwgMSA/IFRGdW5jdGlvbiA6IG5ldmVyLFxuKSA9PlxuICAoKGV2ZW50KSA9PiB7XG4gICAgdW5zdGFibGVfYmF0Y2hlZFVwZGF0ZXMoZnVuYyBhcyBURnVuY3Rpb24sIGV2ZW50KTtcbiAgfSkgYXMgVEZ1bmN0aW9uO1xuXG4vKipcbiAqIGJhcmNoZXMgUmVhY3Qgc3RhdGUgdXBkYXRlcyBhbmQgdGhyb3R0bGVzIHRoZSBjYWxscyB0byBhIHNpbmdsZSBjYWxsIHBlclxuICogYW5pbWF0aW9uIGZyYW1lXG4gKi9cbmV4cG9ydCBjb25zdCB3aXRoQmF0Y2hlZFVwZGF0ZXNUaHJvdHRsZWQgPSA8XG4gIFRGdW5jdGlvbiBleHRlbmRzICgoZXZlbnQ6IGFueSkgPT4gdm9pZCkgfCAoKCkgPT4gdm9pZCksXG4+KFxuICBmdW5jOiBQYXJhbWV0ZXJzPFRGdW5jdGlvbj5bXCJsZW5ndGhcIl0gZXh0ZW5kcyAwIHwgMSA/IFRGdW5jdGlvbiA6IG5ldmVyLFxuKSA9PiB7XG4gIC8vIEB0cy1pZ25vcmVcbiAgcmV0dXJuIHRocm90dGxlUkFGPFBhcmFtZXRlcnM8VEZ1bmN0aW9uPj4oKChldmVudCkgPT4ge1xuICAgIHVuc3RhYmxlX2JhdGNoZWRVcGRhdGVzKGZ1bmMsIGV2ZW50KTtcbiAgfSkgYXMgVEZ1bmN0aW9uKTtcbn07XG5cbi8vaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9hLzk0NjIzODIvODQxOFxuZXhwb3J0IGNvbnN0IG5Gb3JtYXR0ZXIgPSAobnVtOiBudW1iZXIsIGRpZ2l0czogbnVtYmVyKTogc3RyaW5nID0+IHtcbiAgY29uc3Qgc2kgPSBbXG4gICAgeyB2YWx1ZTogMSwgc3ltYm9sOiBcImJcIiB9LFxuICAgIHsgdmFsdWU6IDFlMywgc3ltYm9sOiBcImtcIiB9LFxuICAgIHsgdmFsdWU6IDFlNiwgc3ltYm9sOiBcIk1cIiB9LFxuICAgIHsgdmFsdWU6IDFlOSwgc3ltYm9sOiBcIkdcIiB9LFxuICBdO1xuICBjb25zdCByeCA9IC9cXC4wKyR8KFxcLlswLTldKlsxLTldKTArJC87XG4gIGxldCBpbmRleDtcbiAgZm9yIChpbmRleCA9IHNpLmxlbmd0aCAtIDE7IGluZGV4ID4gMDsgaW5kZXgtLSkge1xuICAgIGlmIChudW0gPj0gc2lbaW5kZXhdLnZhbHVlKSB7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cbiAgcmV0dXJuIChcbiAgICAobnVtIC8gc2lbaW5kZXhdLnZhbHVlKS50b0ZpeGVkKGRpZ2l0cykucmVwbGFjZShyeCwgXCIkMVwiKSArIHNpW2luZGV4XS5zeW1ib2xcbiAgKTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRWZXJzaW9uID0gKCkgPT4ge1xuICByZXR1cm4gKFxuICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3I8SFRNTE1ldGFFbGVtZW50PignbWV0YVtuYW1lPVwidmVyc2lvblwiXScpPy5jb250ZW50IHx8XG4gICAgREVGQVVMVF9WRVJTSU9OXG4gICk7XG59O1xuXG4vLyBBZGFwdGVkIGZyb20gaHR0cHM6Ly9naXRodWIuY29tL01vZGVybml6ci9Nb2Rlcm5penIvYmxvYi9tYXN0ZXIvZmVhdHVyZS1kZXRlY3RzL2Vtb2ppLmpzXG5leHBvcnQgY29uc3Qgc3VwcG9ydHNFbW9qaSA9ICgpID0+IHtcbiAgY29uc3QgY2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImNhbnZhc1wiKTtcbiAgY29uc3QgY3R4ID0gY2FudmFzLmdldENvbnRleHQoXCIyZFwiKTtcbiAgaWYgKCFjdHgpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgY29uc3Qgb2Zmc2V0ID0gMTI7XG4gIGN0eC5maWxsU3R5bGUgPSBcIiNmMDBcIjtcbiAgY3R4LnRleHRCYXNlbGluZSA9IFwidG9wXCI7XG4gIGN0eC5mb250ID0gXCIzMnB4IEFyaWFsXCI7XG4gIC8vIE1vZGVybml6ciB1c2VkIPCfkKgsIGJ1dCBpdCBpcyBzb3J0IG9mIHN1cHBvcnRlZCBvbiBXaW5kb3dzIDcuXG4gIC8vIEx1Y2tpbHkg8J+YgCBpc24ndCBzdXBwb3J0ZWQuXG4gIGN0eC5maWxsVGV4dChcIvCfmIBcIiwgMCwgMCk7XG4gIHJldHVybiBjdHguZ2V0SW1hZ2VEYXRhKG9mZnNldCwgb2Zmc2V0LCAxLCAxKS5kYXRhWzBdICE9PSAwO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldE5lYXJlc3RTY3JvbGxhYmxlQ29udGFpbmVyID0gKFxuICBlbGVtZW50OiBIVE1MRWxlbWVudCxcbik6IEhUTUxFbGVtZW50IHwgRG9jdW1lbnQgPT4ge1xuICBsZXQgcGFyZW50ID0gZWxlbWVudC5wYXJlbnRFbGVtZW50O1xuICB3aGlsZSAocGFyZW50KSB7XG4gICAgaWYgKHBhcmVudCA9PT0gZG9jdW1lbnQuYm9keSkge1xuICAgICAgcmV0dXJuIGRvY3VtZW50O1xuICAgIH1cbiAgICBjb25zdCB7IG92ZXJmbG93WSB9ID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUocGFyZW50KTtcbiAgICBjb25zdCBoYXNTY3JvbGxhYmxlQ29udGVudCA9IHBhcmVudC5zY3JvbGxIZWlnaHQgPiBwYXJlbnQuY2xpZW50SGVpZ2h0O1xuICAgIGlmIChcbiAgICAgIGhhc1Njcm9sbGFibGVDb250ZW50ICYmXG4gICAgICAob3ZlcmZsb3dZID09PSBcImF1dG9cIiB8fFxuICAgICAgICBvdmVyZmxvd1kgPT09IFwic2Nyb2xsXCIgfHxcbiAgICAgICAgb3ZlcmZsb3dZID09PSBcIm92ZXJsYXlcIilcbiAgICApIHtcbiAgICAgIHJldHVybiBwYXJlbnQ7XG4gICAgfVxuICAgIHBhcmVudCA9IHBhcmVudC5wYXJlbnRFbGVtZW50O1xuICB9XG4gIHJldHVybiBkb2N1bWVudDtcbn07XG5cbmV4cG9ydCBjb25zdCBmb2N1c05lYXJlc3RQYXJlbnQgPSAoZWxlbWVudDogSFRNTElucHV0RWxlbWVudCkgPT4ge1xuICBsZXQgcGFyZW50ID0gZWxlbWVudC5wYXJlbnRFbGVtZW50O1xuICB3aGlsZSAocGFyZW50KSB7XG4gICAgaWYgKHBhcmVudC50YWJJbmRleCA+IC0xKSB7XG4gICAgICBwYXJlbnQuZm9jdXMoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgcGFyZW50ID0gcGFyZW50LnBhcmVudEVsZW1lbnQ7XG4gIH1cbn07XG5cbmV4cG9ydCBjb25zdCBwcmV2ZW50VW5sb2FkID0gKGV2ZW50OiBCZWZvcmVVbmxvYWRFdmVudCkgPT4ge1xuICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAvLyBOT1RFOiBtb2Rlcm4gYnJvd3NlcnMgbm8gbG9uZ2VyIGFsbG93IHNob3dpbmcgYSBjdXN0b20gbWVzc2FnZSBoZXJlXG4gIGV2ZW50LnJldHVyblZhbHVlID0gXCJcIjtcbn07XG5cbmV4cG9ydCBjb25zdCBieXRlc1RvSGV4U3RyaW5nID0gKGJ5dGVzOiBVaW50OEFycmF5KSA9PiB7XG4gIHJldHVybiBBcnJheS5mcm9tKGJ5dGVzKVxuICAgIC5tYXAoKGJ5dGUpID0+IGAwJHtieXRlLnRvU3RyaW5nKDE2KX1gLnNsaWNlKC0yKSlcbiAgICAuam9pbihcIlwiKTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRVcGRhdGVkVGltZXN0YW1wID0gKCkgPT4gKGlzVGVzdEVudigpID8gMSA6IERhdGUubm93KCkpO1xuXG4vKipcbiAqIFRyYW5zZm9ybXMgYXJyYXkgb2Ygb2JqZWN0cyBjb250YWluaW5nIGBpZGAgYXR0cmlidXRlLFxuICogb3IgYXJyYXkgb2YgaWRzIChzdHJpbmdzKSwgaW50byBhIE1hcCwga2V5ZCBieSBgaWRgLlxuICovXG5leHBvcnQgY29uc3QgYXJyYXlUb01hcCA9IDxUIGV4dGVuZHMgeyBpZDogc3RyaW5nIH0gfCBzdHJpbmc+KFxuICBpdGVtczogcmVhZG9ubHkgVFtdLFxuKSA9PiB7XG4gIHJldHVybiBpdGVtcy5yZWR1Y2UoKGFjYzogTWFwPHN0cmluZywgVD4sIGVsZW1lbnQpID0+IHtcbiAgICBhY2Muc2V0KHR5cGVvZiBlbGVtZW50ID09PSBcInN0cmluZ1wiID8gZWxlbWVudCA6IGVsZW1lbnQuaWQsIGVsZW1lbnQpO1xuICAgIHJldHVybiBhY2M7XG4gIH0sIG5ldyBNYXAoKSk7XG59O1xuXG5leHBvcnQgY29uc3QgaXNUZXN0RW52ID0gKCkgPT5cbiAgdHlwZW9mIHByb2Nlc3MgIT09IFwidW5kZWZpbmVkXCIgJiYgcHJvY2Vzcy5lbnY/Lk5PREVfRU5WID09PSBcInRlc3RcIjtcblxuZXhwb3J0IGNvbnN0IGlzUHJvZEVudiA9ICgpID0+XG4gIHR5cGVvZiBwcm9jZXNzICE9PSBcInVuZGVmaW5lZFwiICYmIHByb2Nlc3MuZW52Py5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCI7XG5cbmV4cG9ydCBjb25zdCB3cmFwRXZlbnQgPSA8VCBleHRlbmRzIEV2ZW50PihuYW1lOiBFVkVOVCwgbmF0aXZlRXZlbnQ6IFQpID0+IHtcbiAgcmV0dXJuIG5ldyBDdXN0b21FdmVudChuYW1lLCB7XG4gICAgZGV0YWlsOiB7XG4gICAgICBuYXRpdmVFdmVudCxcbiAgICB9LFxuICAgIGNhbmNlbGFibGU6IHRydWUsXG4gIH0pO1xufTtcblxuZXhwb3J0IGNvbnN0IHVwZGF0ZU9iamVjdCA9IDxUIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgYW55Pj4oXG4gIG9iajogVCxcbiAgdXBkYXRlczogUGFydGlhbDxUPixcbik6IFQgPT4ge1xuICBsZXQgZGlkQ2hhbmdlID0gZmFsc2U7XG4gIGZvciAoY29uc3Qga2V5IGluIHVwZGF0ZXMpIHtcbiAgICBjb25zdCB2YWx1ZSA9ICh1cGRhdGVzIGFzIGFueSlba2V5XTtcbiAgICBpZiAodHlwZW9mIHZhbHVlICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICBpZiAoXG4gICAgICAgIChvYmogYXMgYW55KVtrZXldID09PSB2YWx1ZSAmJlxuICAgICAgICAvLyBpZiBvYmplY3QsIGFsd2F5cyB1cGRhdGUgYmVjYXVzZSBpdHMgYXR0cnMgY291bGQgaGF2ZSBjaGFuZ2VkXG4gICAgICAgICh0eXBlb2YgdmFsdWUgIT09IFwib2JqZWN0XCIgfHwgdmFsdWUgPT09IG51bGwpXG4gICAgICApIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBkaWRDaGFuZ2UgPSB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIGlmICghZGlkQ2hhbmdlKSB7XG4gICAgcmV0dXJuIG9iajtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgLi4ub2JqLFxuICAgIC4uLnVwZGF0ZXMsXG4gIH07XG59O1xuXG5leHBvcnQgY29uc3QgaXNQcmltaXRpdmUgPSAodmFsOiBhbnkpID0+IHtcbiAgY29uc3QgdHlwZSA9IHR5cGVvZiB2YWw7XG4gIHJldHVybiB2YWwgPT0gbnVsbCB8fCAodHlwZSAhPT0gXCJvYmplY3RcIiAmJiB0eXBlICE9PSBcImZ1bmN0aW9uXCIpO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldEZyYW1lID0gKCkgPT4ge1xuICB0cnkge1xuICAgIHJldHVybiB3aW5kb3cuc2VsZiA9PT0gd2luZG93LnRvcCA/IFwidG9wXCIgOiBcImlmcmFtZVwiO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHJldHVybiBcImlmcmFtZVwiO1xuICB9XG59O1xuXG5leHBvcnQgY29uc3QgaXNQcm9taXNlTGlrZSA9IChcbiAgdmFsdWU6IGFueSxcbik6IHZhbHVlIGlzIFByb21pc2U8UmVzb2x1dGlvblR5cGU8dHlwZW9mIHZhbHVlPj4gPT4ge1xuICByZXR1cm4gKFxuICAgICEhdmFsdWUgJiZcbiAgICB0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIgJiZcbiAgICBcInRoZW5cIiBpbiB2YWx1ZSAmJlxuICAgIFwiY2F0Y2hcIiBpbiB2YWx1ZSAmJlxuICAgIFwiZmluYWxseVwiIGluIHZhbHVlXG4gICk7XG59O1xuXG5leHBvcnQgY29uc3QgcXVlcnlGb2N1c2FibGVFbGVtZW50cyA9IChjb250YWluZXI6IEhUTUxFbGVtZW50IHwgbnVsbCkgPT4ge1xuICBjb25zdCBmb2N1c2FibGVFbGVtZW50cyA9IGNvbnRhaW5lcj8ucXVlcnlTZWxlY3RvckFsbDxIVE1MRWxlbWVudD4oXG4gICAgXCJidXR0b24sIGEsIGlucHV0LCBzZWxlY3QsIHRleHRhcmVhLCBkaXZbdGFiaW5kZXhdLCBsYWJlbFt0YWJpbmRleF1cIixcbiAgKTtcblxuICByZXR1cm4gZm9jdXNhYmxlRWxlbWVudHNcbiAgICA/IEFycmF5LmZyb20oZm9jdXNhYmxlRWxlbWVudHMpLmZpbHRlcihcbiAgICAgICAgKGVsZW1lbnQpID0+XG4gICAgICAgICAgZWxlbWVudC50YWJJbmRleCA+IC0xICYmICEoZWxlbWVudCBhcyBIVE1MSW5wdXRFbGVtZW50KS5kaXNhYmxlZCxcbiAgICAgIClcbiAgICA6IFtdO1xufTtcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///../../utils.ts\n");
|
|
3342
3342
|
|
|
3343
3343
|
/***/ }),
|
|
3344
3344
|
|