@excalidraw/excalidraw 0.15.2-6546-d83860c → 0.15.2-6546-9e30320
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.
- package/dist/excalidraw.development.js +5 -5
- package/dist/excalidraw.production.min.js +1 -1
- package/package.json +1 -1
- package/types/data/types.d.ts +1 -1
- package/types/element/newElement.d.ts +2 -2
- package/types/element/textElement.d.ts +3 -3
- package/types/packages/excalidraw/example/initialData.d.ts +35 -3
|
@@ -2482,7 +2482,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
|
|
|
2482
2482
|
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|
2483
2483
|
|
|
2484
2484
|
"use strict";
|
|
2485
|
-
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"trackEvent\": () => (/* binding */ trackEvent)\n/* harmony export */ });\nconst trackEvent = (category, action, label, value) => {\n try {\n // Uncomment the next line to track locally\n // console.log(\"Track Event\", { category, action, label, value });\n if (typeof window === \"undefined\" || ({\"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\":\"\",\"FAST_REFRESH\":\"false\",\"REACT_APP_MATOMO_URL\":\"\",\"REACT_APP_CDN_MATOMO_TRACKER_URL\":\"\",\"REACT_APP_MATOMO_SITE_ID\":\"\",\"REACT_APP_DEBUG_ENABLE_TEXT_CONTAINER_BOUNDING_BOX\":\"\",\"PKG_NAME\":\"@excalidraw/excalidraw\",\"PKG_VERSION\":\"0.15.2-6546-
|
|
2485
|
+
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"trackEvent\": () => (/* binding */ trackEvent)\n/* harmony export */ });\nconst trackEvent = (category, action, label, value) => {\n try {\n // Uncomment the next line to track locally\n // console.log(\"Track Event\", { category, action, label, value });\n if (typeof window === \"undefined\" || ({\"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\":\"\",\"FAST_REFRESH\":\"false\",\"REACT_APP_MATOMO_URL\":\"\",\"REACT_APP_CDN_MATOMO_TRACKER_URL\":\"\",\"REACT_APP_MATOMO_SITE_ID\":\"\",\"REACT_APP_DEBUG_ENABLE_TEXT_CONTAINER_BOUNDING_BOX\":\"\",\"PKG_NAME\":\"@excalidraw/excalidraw\",\"PKG_VERSION\":\"0.15.2-6546-9e30320\",\"IS_EXCALIDRAW_NPM_PACKAGE\":true}).JEST_WORKER_ID) {\n return;\n }\n if (({\"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\":\"\",\"FAST_REFRESH\":\"false\",\"REACT_APP_MATOMO_URL\":\"\",\"REACT_APP_CDN_MATOMO_TRACKER_URL\":\"\",\"REACT_APP_MATOMO_SITE_ID\":\"\",\"REACT_APP_DEBUG_ENABLE_TEXT_CONTAINER_BOUNDING_BOX\":\"\",\"PKG_NAME\":\"@excalidraw/excalidraw\",\"PKG_VERSION\":\"0.15.2-6546-9e30320\",\"IS_EXCALIDRAW_NPM_PACKAGE\":true}).REACT_APP_GOOGLE_ANALYTICS_ID && window.gtag) {\n window.gtag(\"event\", action, {\n event_category: category,\n event_label: label,\n value,\n });\n }\n if (window.sa_event) {\n window.sa_event(action, {\n category,\n label,\n value,\n });\n }\n if (window.fathom) {\n window.fathom.trackEvent(action, {\n category,\n label,\n value,\n });\n }\n }\n catch (error) {\n console.error(\"error during analytics\", error);\n }\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi4vLi4vYW5hbHl0aWNzLnRzLmpzIiwibWFwcGluZ3MiOiI7Ozs7QUFBTyxNQUFNLFVBQVUsR0FBRyxDQUN4QixRQUFnQixFQUNoQixNQUFjLEVBQ2QsS0FBYyxFQUNkLEtBQWMsRUFDZCxFQUFFO0lBQ0YsSUFBSTtRQUNGLDJDQUEyQztRQUMzQyxrRUFBa0U7UUFFbEUsSUFBSSxPQUFPLE1BQU0sS0FBSyxXQUFXLElBQUksNmlDQUFXLENBQUMsY0FBYyxFQUFFO1lBQy9ELE9BQU87U0FDUjtRQUVELElBQUksNmlDQUFXLENBQUMsNkJBQTZCLElBQUksTUFBTSxDQUFDLElBQUksRUFBRTtZQUM1RCxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUU7Z0JBQzNCLGNBQWMsRUFBRSxRQUFRO2dCQUN4QixXQUFXLEVBQUUsS0FBSztnQkFDbEIsS0FBSzthQUNOLENBQUMsQ0FBQztTQUNKO1FBRUQsSUFBSSxNQUFNLENBQUMsUUFBUSxFQUFFO1lBQ25CLE1BQU0sQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFO2dCQUN0QixRQUFRO2dCQUNSLEtBQUs7Z0JBQ0wsS0FBSzthQUNOLENBQUMsQ0FBQztTQUNKO1FBRUQsSUFBSSxNQUFNLENBQUMsTUFBTSxFQUFFO1lBQ2pCLE1BQU0sQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLE1BQU0sRUFBRTtnQkFDL0IsUUFBUTtnQkFDUixLQUFLO2dCQUNMLEtBQUs7YUFDTixDQUFDLENBQUM7U0FDSjtLQUNGO0lBQUMsT0FBTyxLQUFLLEVBQUU7UUFDZCxPQUFPLENBQUMsS0FBSyxDQUFDLHdCQUF3QixFQUFFLEtBQUssQ0FBQyxDQUFDO0tBQ2hEO0FBQ0gsQ0FBQyxDQUFDIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4uLy4uL2FuYWx5dGljcy50cz81ZjBjIl0sInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBjb25zdCB0cmFja0V2ZW50ID0gKFxuICBjYXRlZ29yeTogc3RyaW5nLFxuICBhY3Rpb246IHN0cmluZyxcbiAgbGFiZWw/OiBzdHJpbmcsXG4gIHZhbHVlPzogbnVtYmVyLFxuKSA9PiB7XG4gIHRyeSB7XG4gICAgLy8gVW5jb21tZW50IHRoZSBuZXh0IGxpbmUgdG8gdHJhY2sgbG9jYWxseVxuICAgIC8vIGNvbnNvbGUubG9nKFwiVHJhY2sgRXZlbnRcIiwgeyBjYXRlZ29yeSwgYWN0aW9uLCBsYWJlbCwgdmFsdWUgfSk7XG5cbiAgICBpZiAodHlwZW9mIHdpbmRvdyA9PT0gXCJ1bmRlZmluZWRcIiB8fCBwcm9jZXNzLmVudi5KRVNUX1dPUktFUl9JRCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChwcm9jZXNzLmVudi5SRUFDVF9BUFBfR09PR0xFX0FOQUxZVElDU19JRCAmJiB3aW5kb3cuZ3RhZykge1xuICAgICAgd2luZG93Lmd0YWcoXCJldmVudFwiLCBhY3Rpb24sIHtcbiAgICAgICAgZXZlbnRfY2F0ZWdvcnk6IGNhdGVnb3J5LFxuICAgICAgICBldmVudF9sYWJlbDogbGFiZWwsXG4gICAgICAgIHZhbHVlLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKHdpbmRvdy5zYV9ldmVudCkge1xuICAgICAgd2luZG93LnNhX2V2ZW50KGFjdGlvbiwge1xuICAgICAgICBjYXRlZ29yeSxcbiAgICAgICAgbGFiZWwsXG4gICAgICAgIHZhbHVlLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKHdpbmRvdy5mYXRob20pIHtcbiAgICAgIHdpbmRvdy5mYXRob20udHJhY2tFdmVudChhY3Rpb24sIHtcbiAgICAgICAgY2F0ZWdvcnksXG4gICAgICAgIGxhYmVsLFxuICAgICAgICB2YWx1ZSxcbiAgICAgIH0pO1xuICAgIH1cbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBjb25zb2xlLmVycm9yKFwiZXJyb3IgZHVyaW5nIGFuYWx5dGljc1wiLCBlcnJvcik7XG4gIH1cbn07XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///../../analytics.ts\n");
|
|
2486
2486
|
|
|
2487
2487
|
/***/ }),
|
|
2488
2488
|
|
|
@@ -3692,7 +3692,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
|
|
|
3692
3692
|
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|
3693
3693
|
|
|
3694
3694
|
"use strict";
|
|
3695
|
-
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"convertToExcalidrawElements\": () => (/* binding */ convertToExcalidrawElements),\n/* harmony export */ \"deepCopyElement\": () => (/* binding */ deepCopyElement),\n/* harmony export */ \"duplicateElement\": () => (/* binding */ duplicateElement),\n/* harmony export */ \"duplicateElements\": () => (/* binding */ duplicateElements),\n/* harmony export */ \"newElement\": () => (/* binding */ newElement),\n/* harmony export */ \"newFreeDrawElement\": () => (/* binding */ newFreeDrawElement),\n/* harmony export */ \"newImageElement\": () => (/* binding */ newImageElement),\n/* harmony export */ \"newLinearElement\": () => (/* binding */ newLinearElement),\n/* harmony export */ \"newTextElement\": () => (/* binding */ newTextElement),\n/* harmony export */ \"refreshTextDimensions\": () => (/* binding */ refreshTextDimensions),\n/* harmony export */ \"updateTextElement\": () => (/* binding */ updateTextElement)\n/* harmony export */ });\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../utils */ \"../../utils.ts\");\n/* harmony import */ var _random__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../random */ \"../../random.ts\");\n/* harmony import */ var _mutateElement__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./mutateElement */ \"../../element/mutateElement.ts\");\n/* harmony import */ var _groups__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../groups */ \"../../groups.ts\");\n/* harmony import */ var ___WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! . */ \"../../element/index.ts\");\n/* harmony import */ var _math__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../math */ \"../../math.ts\");\n/* harmony import */ var _bounds__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./bounds */ \"../../element/bounds.ts\");\n/* harmony import */ var _textElement__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./textElement */ \"../../element/textElement.ts\");\n/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../constants */ \"../../constants.ts\");\n/* harmony import */ var _typeChecks__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./typeChecks */ \"../../element/typeChecks.ts\");\nvar __rest = (undefined && undefined.__rest) || function (s, e) {\n var t = {};\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\n t[p] = s[p];\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\n t[p[i]] = s[p[i]];\n }\n return t;\n};\n\n\n\n\n\n\n\n\n\n\nconst ELEMENTS_SUPPORTING_PROGRAMMATIC_API = [\n \"rectangle\",\n \"ellipse\",\n \"diamond\",\n \"text\",\n];\nconst _newElementBase = (type, _a) => {\n var _b, _c;\n var { x, y, strokeColor = _constants__WEBPACK_IMPORTED_MODULE_8__.DEFAULT_ELEMENT_PROPS.strokeColor, backgroundColor = _constants__WEBPACK_IMPORTED_MODULE_8__.DEFAULT_ELEMENT_PROPS.backgroundColor, fillStyle = _constants__WEBPACK_IMPORTED_MODULE_8__.DEFAULT_ELEMENT_PROPS.fillStyle, strokeWidth = _constants__WEBPACK_IMPORTED_MODULE_8__.DEFAULT_ELEMENT_PROPS.strokeWidth, strokeStyle = _constants__WEBPACK_IMPORTED_MODULE_8__.DEFAULT_ELEMENT_PROPS.strokeStyle, roughness = _constants__WEBPACK_IMPORTED_MODULE_8__.DEFAULT_ELEMENT_PROPS.roughness, opacity = _constants__WEBPACK_IMPORTED_MODULE_8__.DEFAULT_ELEMENT_PROPS.opacity, width = 0, height = 0, angle = 0, groupIds = [], roundness = null, boundElements = null, link = null, locked = _constants__WEBPACK_IMPORTED_MODULE_8__.DEFAULT_ELEMENT_PROPS.locked } = _a, rest = __rest(_a, [\"x\", \"y\", \"strokeColor\", \"backgroundColor\", \"fillStyle\", \"strokeWidth\", \"strokeStyle\", \"roughness\", \"opacity\", \"width\", \"height\", \"angle\", \"groupIds\", \"roundness\", \"boundElements\", \"link\", \"locked\"]);\n console.log(\"width\", width);\n // assign type to guard against excess properties\n const element = {\n id: rest.id || (0,_random__WEBPACK_IMPORTED_MODULE_1__.randomId)(),\n type,\n x,\n y,\n width,\n height,\n angle,\n strokeColor,\n backgroundColor,\n fillStyle,\n strokeWidth,\n strokeStyle,\n roughness,\n opacity,\n groupIds,\n roundness,\n seed: (_b = rest.seed) !== null && _b !== void 0 ? _b : (0,_random__WEBPACK_IMPORTED_MODULE_1__.randomInteger)(),\n version: rest.version || 1,\n versionNonce: (_c = rest.versionNonce) !== null && _c !== void 0 ? _c : 0,\n isDeleted: false,\n boundElements,\n updated: (0,_utils__WEBPACK_IMPORTED_MODULE_0__.getUpdatedTimestamp)(),\n link,\n locked,\n };\n return element;\n};\nconst newElement = (opts) => _newElementBase(opts.type, opts);\n/** computes element x/y offset based on textAlign/verticalAlign */\nconst getTextElementPositionOffsets = (opts, metrics) => {\n return {\n x: opts.textAlign === \"center\"\n ? metrics.width / 2\n : opts.textAlign === \"right\"\n ? metrics.width\n : 0,\n y: opts.verticalAlign === \"middle\" ? metrics.height / 2 : 0,\n };\n};\nconst newTextElement = (opts) => {\n const fontFamily = opts.fontFamily || _constants__WEBPACK_IMPORTED_MODULE_8__.DEFAULT_FONT_FAMILY;\n const fontSize = opts.fontSize || _constants__WEBPACK_IMPORTED_MODULE_8__.DEFAULT_FONT_SIZE;\n const lineHeight = opts.lineHeight || (0,_textElement__WEBPACK_IMPORTED_MODULE_7__.getDefaultLineHeight)(fontFamily);\n const text = (0,_textElement__WEBPACK_IMPORTED_MODULE_7__.normalizeText)(opts.text);\n const metrics = (0,_textElement__WEBPACK_IMPORTED_MODULE_7__.measureText)(text, (0,_utils__WEBPACK_IMPORTED_MODULE_0__.getFontString)({ fontFamily, fontSize }), lineHeight);\n const textAlign = opts.textAlign || _constants__WEBPACK_IMPORTED_MODULE_8__.DEFAULT_TEXT_ALIGN;\n const verticalAlign = opts.verticalAlign || _constants__WEBPACK_IMPORTED_MODULE_8__.DEFAULT_VERTICAL_ALIGN;\n const offsets = getTextElementPositionOffsets({ textAlign, verticalAlign }, metrics);\n const textElement = (0,_mutateElement__WEBPACK_IMPORTED_MODULE_2__.newElementWith)(Object.assign(Object.assign({}, _newElementBase(\"text\", opts)), { text,\n fontSize,\n fontFamily,\n textAlign,\n verticalAlign, x: opts.x - offsets.x, y: opts.y - offsets.y, width: metrics.width, height: metrics.height, baseline: metrics.baseline, containerId: opts.containerId || null, originalText: text, lineHeight }), {});\n return textElement;\n};\nconst getAdjustedDimensions = (element, nextText) => {\n const container = (0,_textElement__WEBPACK_IMPORTED_MODULE_7__.getContainerElement)(element);\n const { width: nextWidth, height: nextHeight, baseline: nextBaseline, } = (0,_textElement__WEBPACK_IMPORTED_MODULE_7__.measureText)(nextText, (0,_utils__WEBPACK_IMPORTED_MODULE_0__.getFontString)(element), element.lineHeight);\n const { textAlign, verticalAlign } = element;\n let x;\n let y;\n if (textAlign === \"center\" &&\n verticalAlign === _constants__WEBPACK_IMPORTED_MODULE_8__.VERTICAL_ALIGN.MIDDLE &&\n !element.containerId) {\n const prevMetrics = (0,_textElement__WEBPACK_IMPORTED_MODULE_7__.measureText)(element.text, (0,_utils__WEBPACK_IMPORTED_MODULE_0__.getFontString)(element), element.lineHeight);\n const offsets = getTextElementPositionOffsets(element, {\n width: nextWidth - prevMetrics.width,\n height: nextHeight - prevMetrics.height,\n });\n x = element.x - offsets.x;\n y = element.y - offsets.y;\n }\n else {\n const [x1, y1, x2, y2] = (0,___WEBPACK_IMPORTED_MODULE_4__.getElementAbsoluteCoords)(element);\n const [nextX1, nextY1, nextX2, nextY2] = (0,_bounds__WEBPACK_IMPORTED_MODULE_6__.getResizedElementAbsoluteCoords)(element, nextWidth, nextHeight, false);\n const deltaX1 = (x1 - nextX1) / 2;\n const deltaY1 = (y1 - nextY1) / 2;\n const deltaX2 = (x2 - nextX2) / 2;\n const deltaY2 = (y2 - nextY2) / 2;\n [x, y] = (0,_math__WEBPACK_IMPORTED_MODULE_5__.adjustXYWithRotation)({\n s: true,\n e: textAlign === \"center\" || textAlign === \"left\",\n w: textAlign === \"center\" || textAlign === \"right\",\n }, element.x, element.y, element.angle, deltaX1, deltaY1, deltaX2, deltaY2);\n }\n // make sure container dimensions are set properly when\n // text editor overflows beyond viewport dimensions\n if (container) {\n const boundTextElementPadding = (0,_textElement__WEBPACK_IMPORTED_MODULE_7__.getBoundTextElementOffset)(element);\n const containerDims = (0,_textElement__WEBPACK_IMPORTED_MODULE_7__.getContainerDims)(container);\n let height = containerDims.height;\n let width = containerDims.width;\n if (nextHeight > height - boundTextElementPadding * 2) {\n height = nextHeight + boundTextElementPadding * 2;\n }\n if (nextWidth > width - boundTextElementPadding * 2) {\n width = nextWidth + boundTextElementPadding * 2;\n }\n if (!(0,_typeChecks__WEBPACK_IMPORTED_MODULE_9__.isArrowElement)(container) &&\n (height !== containerDims.height || width !== containerDims.width)) {\n (0,_mutateElement__WEBPACK_IMPORTED_MODULE_2__.mutateElement)(container, { height, width });\n }\n }\n return {\n width: nextWidth,\n height: nextHeight,\n baseline: nextBaseline,\n x: Number.isFinite(x) ? x : element.x,\n y: Number.isFinite(y) ? y : element.y,\n };\n};\nconst refreshTextDimensions = (textElement, text = textElement.text) => {\n if (textElement.isDeleted) {\n return;\n }\n const container = (0,_textElement__WEBPACK_IMPORTED_MODULE_7__.getContainerElement)(textElement);\n if (container) {\n text = (0,_textElement__WEBPACK_IMPORTED_MODULE_7__.wrapText)(text, (0,_utils__WEBPACK_IMPORTED_MODULE_0__.getFontString)(textElement), (0,_textElement__WEBPACK_IMPORTED_MODULE_7__.getBoundTextMaxWidth)(container));\n }\n const dimensions = getAdjustedDimensions(textElement, text);\n return Object.assign({ text }, dimensions);\n};\nconst updateTextElement = (textElement, { text, isDeleted, originalText, }) => {\n return (0,_mutateElement__WEBPACK_IMPORTED_MODULE_2__.newElementWith)(textElement, Object.assign({ originalText, isDeleted: isDeleted !== null && isDeleted !== void 0 ? isDeleted : textElement.isDeleted }, refreshTextDimensions(textElement, originalText)));\n};\nconst newFreeDrawElement = (opts) => {\n return Object.assign(Object.assign({}, _newElementBase(opts.type, opts)), { points: opts.points || [], pressures: [], simulatePressure: opts.simulatePressure, lastCommittedPoint: null });\n};\nconst newLinearElement = (opts) => {\n return Object.assign(Object.assign({}, _newElementBase(opts.type, opts)), { points: opts.points || [], lastCommittedPoint: null, startBinding: null, endBinding: null, startArrowhead: opts.startArrowhead, endArrowhead: opts.endArrowhead });\n};\nconst newImageElement = (opts) => {\n var _a, _b, _c;\n return Object.assign(Object.assign({}, _newElementBase(\"image\", opts)), { \n // in the future we'll support changing stroke color for some SVG elements,\n // and `transparent` will likely mean \"use original colors of the image\"\n strokeColor: \"transparent\", status: (_a = opts.status) !== null && _a !== void 0 ? _a : \"pending\", fileId: (_b = opts.fileId) !== null && _b !== void 0 ? _b : null, scale: (_c = opts.scale) !== null && _c !== void 0 ? _c : [1, 1] });\n};\n// Simplified deep clone for the purpose of cloning ExcalidrawElement.\n//\n// Only clones plain objects and arrays. Doesn't clone Date, RegExp, Map, Set,\n// Typed arrays and other non-null objects.\n//\n// Adapted from https://github.com/lukeed/klona\n//\n// The reason for `deepCopyElement()` wrapper is type safety (only allow\n// passing ExcalidrawElement as the top-level argument).\nconst _deepCopyElement = (val, depth = 0) => {\n // only clone non-primitives\n if (val == null || typeof val !== \"object\") {\n return val;\n }\n const objectType = Object.prototype.toString.call(val);\n if (objectType === \"[object Object]\") {\n const tmp = typeof val.constructor === \"function\"\n ? Object.create(Object.getPrototypeOf(val))\n : {};\n for (const key in val) {\n if (val.hasOwnProperty(key)) {\n // don't copy non-serializable objects like these caches. They'll be\n // populated when the element is rendered.\n if (depth === 0 && (key === \"shape\" || key === \"canvas\")) {\n continue;\n }\n tmp[key] = _deepCopyElement(val[key], depth + 1);\n }\n }\n return tmp;\n }\n if (Array.isArray(val)) {\n let k = val.length;\n const arr = new Array(k);\n while (k--) {\n arr[k] = _deepCopyElement(val[k], depth + 1);\n }\n return arr;\n }\n // we're not cloning non-array & non-plain-object objects because we\n // don't support them on excalidraw elements yet. If we do, we need to make\n // sure we start cloning them, so let's warn about it.\n if (true) {\n if (objectType !== \"[object Object]\" &&\n objectType !== \"[object Array]\" &&\n objectType.startsWith(\"[object \")) {\n console.warn(`_deepCloneElement: unexpected object type ${objectType}. This value will not be cloned!`);\n }\n }\n return val;\n};\n/**\n * Clones ExcalidrawElement data structure. Does not regenerate id, nonce, or\n * any value. The purpose is to to break object references for immutability\n * reasons, whenever we want to keep the original element, but ensure it's not\n * mutated.\n *\n * Only clones plain objects and arrays. Doesn't clone Date, RegExp, Map, Set,\n * Typed arrays and other non-null objects.\n */\nconst deepCopyElement = (val) => {\n return _deepCopyElement(val);\n};\n/**\n * utility wrapper to generate new id. In test env it reuses the old + postfix\n * for test assertions.\n */\nconst regenerateId = (\n/** supply null if no previous id exists */\npreviousId) => {\n var _a, _b;\n if ((0,_utils__WEBPACK_IMPORTED_MODULE_0__.isTestEnv)() && previousId) {\n let nextId = `${previousId}_copy`;\n // `window.h` may not be defined in some unit tests\n if ((_b = (_a = window.h) === null || _a === void 0 ? void 0 : _a.app) === null || _b === void 0 ? void 0 : _b.getSceneElementsIncludingDeleted().find((el) => el.id === nextId)) {\n nextId += \"_copy\";\n }\n return nextId;\n }\n return (0,_random__WEBPACK_IMPORTED_MODULE_1__.randomId)();\n};\n/**\n * Duplicate an element, often used in the alt-drag operation.\n * Note that this method has gotten a bit complicated since the\n * introduction of gruoping/ungrouping elements.\n * @param editingGroupId The current group being edited. The new\n * element will inherit this group and its\n * parents.\n * @param groupIdMapForOperation A Map that maps old group IDs to\n * duplicated ones. If you are duplicating\n * multiple elements at once, share this map\n * amongst all of them\n * @param element Element to duplicate\n * @param overrides Any element properties to override\n */\nconst duplicateElement = (editingGroupId, groupIdMapForOperation, element, overrides) => {\n let copy = deepCopyElement(element);\n copy.id = regenerateId(copy.id);\n copy.boundElements = null;\n copy.updated = (0,_utils__WEBPACK_IMPORTED_MODULE_0__.getUpdatedTimestamp)();\n copy.seed = (0,_random__WEBPACK_IMPORTED_MODULE_1__.randomInteger)();\n copy.groupIds = (0,_groups__WEBPACK_IMPORTED_MODULE_3__.getNewGroupIdsForDuplication)(copy.groupIds, editingGroupId, (groupId) => {\n if (!groupIdMapForOperation.has(groupId)) {\n groupIdMapForOperation.set(groupId, regenerateId(groupId));\n }\n return groupIdMapForOperation.get(groupId);\n });\n if (overrides) {\n copy = Object.assign(copy, overrides);\n }\n return copy;\n};\n/**\n * Clones elements, regenerating their ids (including bindings) and group ids.\n *\n * If bindings don't exist in the elements array, they are removed. Therefore,\n * it's advised to supply the whole elements array, or sets of elements that\n * are encapsulated (such as library items), if the purpose is to retain\n * bindings to the cloned elements intact.\n *\n * NOTE by default does not randomize or regenerate anything except the id.\n */\nconst duplicateElements = (elements, opts) => {\n const clonedElements = [];\n const origElementsMap = (0,_utils__WEBPACK_IMPORTED_MODULE_0__.arrayToMap)(elements);\n // used for for migrating old ids to new ids\n const elementNewIdsMap = new Map();\n const maybeGetNewId = (id) => {\n // if we've already migrated the element id, return the new one directly\n if (elementNewIdsMap.has(id)) {\n return elementNewIdsMap.get(id);\n }\n // if we haven't migrated the element id, but an old element with the same\n // id exists, generate a new id for it and return it\n if (origElementsMap.has(id)) {\n const newId = regenerateId(id);\n elementNewIdsMap.set(id, newId);\n return newId;\n }\n // if old element doesn't exist, return null to mark it for removal\n return null;\n };\n const groupNewIdsMap = new Map();\n for (const element of elements) {\n const clonedElement = _deepCopyElement(element);\n clonedElement.id = maybeGetNewId(element.id);\n if (opts === null || opts === void 0 ? void 0 : opts.randomizeSeed) {\n clonedElement.seed = (0,_random__WEBPACK_IMPORTED_MODULE_1__.randomInteger)();\n (0,_mutateElement__WEBPACK_IMPORTED_MODULE_2__.bumpVersion)(clonedElement);\n }\n if (clonedElement.groupIds) {\n clonedElement.groupIds = clonedElement.groupIds.map((groupId) => {\n if (!groupNewIdsMap.has(groupId)) {\n groupNewIdsMap.set(groupId, regenerateId(groupId));\n }\n return groupNewIdsMap.get(groupId);\n });\n }\n if (\"containerId\" in clonedElement && clonedElement.containerId) {\n const newContainerId = maybeGetNewId(clonedElement.containerId);\n clonedElement.containerId = newContainerId;\n }\n if (\"boundElements\" in clonedElement && clonedElement.boundElements) {\n clonedElement.boundElements = clonedElement.boundElements.reduce((acc, binding) => {\n const newBindingId = maybeGetNewId(binding.id);\n if (newBindingId) {\n acc.push(Object.assign(Object.assign({}, binding), { id: newBindingId }));\n }\n return acc;\n }, []);\n }\n if (\"endBinding\" in clonedElement && clonedElement.endBinding) {\n const newEndBindingId = maybeGetNewId(clonedElement.endBinding.elementId);\n clonedElement.endBinding = newEndBindingId\n ? Object.assign(Object.assign({}, clonedElement.endBinding), { elementId: newEndBindingId }) : null;\n }\n if (\"startBinding\" in clonedElement && clonedElement.startBinding) {\n const newEndBindingId = maybeGetNewId(clonedElement.startBinding.elementId);\n clonedElement.startBinding = newEndBindingId\n ? Object.assign(Object.assign({}, clonedElement.startBinding), { elementId: newEndBindingId }) : null;\n }\n clonedElements.push(clonedElement);\n }\n return clonedElements;\n};\nconst convertToExcalidrawElements = (elements) => {\n const res = [];\n if (!elements) {\n return [];\n }\n console.log(elements, \"ele \");\n elements.forEach((element) => {\n var _a;\n if (!element) {\n return;\n }\n if ((0,_textElement__WEBPACK_IMPORTED_MODULE_7__.isValidTextContainer)(element) &&\n ((_a = element === null || element === void 0 ? void 0 : element.label) === null || _a === void 0 ? void 0 : _a.text) &&\n (element.type === \"rectangle\" ||\n element.type === \"ellipse\" ||\n element.type === \"diamond\")) {\n const elements = (0,_textElement__WEBPACK_IMPORTED_MODULE_7__.bindTextToContainer)(element, element.label);\n res.push(...elements);\n }\n else {\n let excalidrawElement;\n if (element.type === \"text\") {\n //@ts-ignore\n excalidrawElement = newTextElement(Object.assign({ \n //@ts-ignore\n x: 0, \n //@ts-ignore\n y: 0 }, element));\n }\n else {\n //@ts-ignore\n excalidrawElement = newElement(Object.assign(Object.assign({ x: 0, y: 0 }, element), { width: \n //@ts-ignore\n (element === null || element === void 0 ? void 0 : element.width) ||\n (ELEMENTS_SUPPORTING_PROGRAMMATIC_API.includes(element.type)\n ? 100\n : 0), height: \n //@ts-ignore\n (element === null || element === void 0 ? void 0 : element.height) ||\n (ELEMENTS_SUPPORTING_PROGRAMMATIC_API.includes(element.type)\n ? 100\n : 0) }));\n }\n //@ts-ignore\n res.push(excalidrawElement);\n }\n });\n return res;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi4vLi4vZWxlbWVudC9uZXdFbGVtZW50LnRzLmpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBb0JrQjtBQUNrQztBQUN5QjtBQUNwQjtBQUVaO0FBQ0U7QUFDWTtBQVlwQztBQVFEO0FBQ3dCO0FBSTlDLE1BQU0sb0NBQW9DLEdBQUc7SUFDM0MsV0FBVztJQUNYLFNBQVM7SUFDVCxTQUFTO0lBQ1QsTUFBTTtDQUNQLENBQUM7QUF1QkYsTUFBTSxlQUFlLEdBQUcsQ0FDdEIsSUFBZSxFQUNmLEVBbUIyRSxFQUMzRSxFQUFFOztRQXBCRixFQUNFLENBQUMsRUFDRCxDQUFDLEVBQ0QsV0FBVyxHQUFHLHlFQUFpQyxFQUMvQyxlQUFlLEdBQUcsNkVBQXFDLEVBQ3ZELFNBQVMsR0FBRyx1RUFBK0IsRUFDM0MsV0FBVyxHQUFHLHlFQUFpQyxFQUMvQyxXQUFXLEdBQUcseUVBQWlDLEVBQy9DLFNBQVMsR0FBRyx1RUFBK0IsRUFDM0MsT0FBTyxHQUFHLHFFQUE2QixFQUN2QyxLQUFLLEdBQUcsQ0FBQyxFQUNULE1BQU0sR0FBRyxDQUFDLEVBQ1YsS0FBSyxHQUFHLENBQUMsRUFDVCxRQUFRLEdBQUcsRUFBRSxFQUNiLFNBQVMsR0FBRyxJQUFJLEVBQ2hCLGFBQWEsR0FBRyxJQUFJLEVBQ3BCLElBQUksR0FBRyxJQUFJLEVBQ1gsTUFBTSxHQUFHLG9FQUE0QixPQUVvQyxFQUR0RSxJQUFJLGNBbEJULHVNQW1CQyxDQURRO0lBR1QsT0FBTyxDQUFDLEdBQUcsQ0FBQyxPQUFPLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDNUIsaURBQWlEO0lBQ2pELE1BQU0sT0FBTyxHQUF5RDtRQUNwRSxFQUFFLEVBQUUsSUFBSSxDQUFDLEVBQUUsSUFBSSxpREFBUSxFQUFFO1FBQ3pCLElBQUk7UUFDSixDQUFDO1FBQ0QsQ0FBQztRQUNELEtBQUs7UUFDTCxNQUFNO1FBQ04sS0FBSztRQUNMLFdBQVc7UUFDWCxlQUFlO1FBQ2YsU0FBUztRQUNULFdBQVc7UUFDWCxXQUFXO1FBQ1gsU0FBUztRQUNULE9BQU87UUFDUCxRQUFRO1FBQ1IsU0FBUztRQUNULElBQUksRUFBRSxVQUFJLENBQUMsSUFBSSxtQ0FBSSxzREFBYSxFQUFFO1FBQ2xDLE9BQU8sRUFBRSxJQUFJLENBQUMsT0FBTyxJQUFJLENBQUM7UUFDMUIsWUFBWSxFQUFFLFVBQUksQ0FBQyxZQUFZLG1DQUFJLENBQUM7UUFDcEMsU0FBUyxFQUFFLEtBQWM7UUFDekIsYUFBYTtRQUNiLE9BQU8sRUFBRSwyREFBbUIsRUFBRTtRQUM5QixJQUFJO1FBQ0osTUFBTTtLQUNQLENBQUM7SUFDRixPQUFPLE9BQU8sQ0FBQztBQUNqQixDQUFDLENBQUM7QUFFSyxNQUFNLFVBQVUsR0FBRyxDQUN4QixJQUUwQixFQUNZLEVBQUUsQ0FDeEMsZUFBZSxDQUEyQixJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO0FBRTdELG1FQUFtRTtBQUNuRSxNQUFNLDZCQUE2QixHQUFHLENBQ3BDLElBR0MsRUFDRCxPQUdDLEVBQ0QsRUFBRTtJQUNGLE9BQU87UUFDTCxDQUFDLEVBQ0MsSUFBSSxDQUFDLFNBQVMsS0FBSyxRQUFRO1lBQ3pCLENBQUMsQ0FBQyxPQUFPLENBQUMsS0FBSyxHQUFHLENBQUM7WUFDbkIsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLEtBQUssT0FBTztnQkFDNUIsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxLQUFLO2dCQUNmLENBQUMsQ0FBQyxDQUFDO1FBQ1AsQ0FBQyxFQUFFLElBQUksQ0FBQyxhQUFhLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztLQUM1RCxDQUFDO0FBQ0osQ0FBQyxDQUFDO0FBRUssTUFBTSxjQUFjLEdBQUcsQ0FDNUIsSUFTMEIsRUFDUyxFQUFFO0lBQ3JDLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxVQUFVLElBQUksMkRBQW1CLENBQUM7SUFDMUQsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsSUFBSSx5REFBaUIsQ0FBQztJQUNwRCxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsVUFBVSxJQUFJLGtFQUFvQixDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQ3ZFLE1BQU0sSUFBSSxHQUFHLDJEQUFhLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3RDLE1BQU0sT0FBTyxHQUFHLHlEQUFXLENBQ3pCLElBQUksRUFDSixxREFBYSxDQUFDLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxDQUFDLEVBQ3ZDLFVBQVUsQ0FDWCxDQUFDO0lBQ0YsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLFNBQVMsSUFBSSwwREFBa0IsQ0FBQztJQUN2RCxNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsYUFBYSxJQUFJLDhEQUFzQixDQUFDO0lBQ25FLE1BQU0sT0FBTyxHQUFHLDZCQUE2QixDQUMzQyxFQUFFLFNBQVMsRUFBRSxhQUFhLEVBQUUsRUFDNUIsT0FBTyxDQUNSLENBQUM7SUFFRixNQUFNLFdBQVcsR0FBRyw4REFBYyxpQ0FFM0IsZUFBZSxDQUF3QixNQUFNLEVBQUUsSUFBSSxDQUFDLEtBQ3ZELElBQUk7UUFDSixRQUFRO1FBQ1IsVUFBVTtRQUNWLFNBQVM7UUFDVCxhQUFhLEVBQ2IsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLEdBQUcsT0FBTyxDQUFDLENBQUMsRUFDckIsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLEdBQUcsT0FBTyxDQUFDLENBQUMsRUFDckIsS0FBSyxFQUFFLE9BQU8sQ0FBQyxLQUFLLEVBQ3BCLE1BQU0sRUFBRSxPQUFPLENBQUMsTUFBTSxFQUN0QixRQUFRLEVBQUUsT0FBTyxDQUFDLFFBQVEsRUFDMUIsV0FBVyxFQUFFLElBQUksQ0FBQyxXQUFXLElBQUksSUFBSSxFQUNyQyxZQUFZLEVBQUUsSUFBSSxFQUNsQixVQUFVLEtBRVosRUFBRSxDQUNILENBQUM7SUFDRixPQUFPLFdBQVcsQ0FBQztBQUNyQixDQUFDLENBQUM7QUFFRixNQUFNLHFCQUFxQixHQUFHLENBQzVCLE9BQThCLEVBQzlCLFFBQWdCLEVBT2hCLEVBQUU7SUFDRixNQUFNLFNBQVMsR0FBRyxpRUFBbUIsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUUvQyxNQUFNLEVBQ0osS0FBSyxFQUFFLFNBQVMsRUFDaEIsTUFBTSxFQUFFLFVBQVUsRUFDbEIsUUFBUSxFQUFFLFlBQVksR0FDdkIsR0FBRyx5REFBVyxDQUFDLFFBQVEsRUFBRSxxREFBYSxDQUFDLE9BQU8sQ0FBQyxFQUFFLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUN0RSxNQUFNLEVBQUUsU0FBUyxFQUFFLGFBQWEsRUFBRSxHQUFHLE9BQU8sQ0FBQztJQUM3QyxJQUFJLENBQVMsQ0FBQztJQUNkLElBQUksQ0FBUyxDQUFDO0lBQ2QsSUFDRSxTQUFTLEtBQUssUUFBUTtRQUN0QixhQUFhLEtBQUssNkRBQXFCO1FBQ3ZDLENBQUMsT0FBTyxDQUFDLFdBQVcsRUFDcEI7UUFDQSxNQUFNLFdBQVcsR0FBRyx5REFBVyxDQUM3QixPQUFPLENBQUMsSUFBSSxFQUNaLHFEQUFhLENBQUMsT0FBTyxDQUFDLEVBQ3RCLE9BQU8sQ0FBQyxVQUFVLENBQ25CLENBQUM7UUFDRixNQUFNLE9BQU8sR0FBRyw2QkFBNkIsQ0FBQyxPQUFPLEVBQUU7WUFDckQsS0FBSyxFQUFFLFNBQVMsR0FBRyxXQUFXLENBQUMsS0FBSztZQUNwQyxNQUFNLEVBQUUsVUFBVSxHQUFHLFdBQVcsQ0FBQyxNQUFNO1NBQ3hDLENBQUMsQ0FBQztRQUVILENBQUMsR0FBRyxPQUFPLENBQUMsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUM7UUFDMUIsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxDQUFDLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQztLQUMzQjtTQUFNO1FBQ0wsTUFBTSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxHQUFHLDJEQUF3QixDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBRTNELE1BQU0sQ0FBQyxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLENBQUMsR0FBRyx3RUFBK0IsQ0FDdEUsT0FBTyxFQUNQLFNBQVMsRUFDVCxVQUFVLEVBQ1YsS0FBSyxDQUNOLENBQUM7UUFDRixNQUFNLE9BQU8sR0FBRyxDQUFDLEVBQUUsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDbEMsTUFBTSxPQUFPLEdBQUcsQ0FBQyxFQUFFLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ2xDLE1BQU0sT0FBTyxHQUFHLENBQUMsRUFBRSxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNsQyxNQUFNLE9BQU8sR0FBRyxDQUFDLEVBQUUsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7UUFFbEMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsMkRBQW9CLENBQzNCO1lBQ0UsQ0FBQyxFQUFFLElBQUk7WUFDUCxDQUFDLEVBQUUsU0FBUyxLQUFLLFFBQVEsSUFBSSxTQUFTLEtBQUssTUFBTTtZQUNqRCxDQUFDLEVBQUUsU0FBUyxLQUFLLFFBQVEsSUFBSSxTQUFTLEtBQUssT0FBTztTQUNuRCxFQUNELE9BQU8sQ0FBQyxDQUFDLEVBQ1QsT0FBTyxDQUFDLENBQUMsRUFDVCxPQUFPLENBQUMsS0FBSyxFQUNiLE9BQU8sRUFDUCxPQUFPLEVBQ1AsT0FBTyxFQUNQLE9BQU8sQ0FDUixDQUFDO0tBQ0g7SUFFRCx1REFBdUQ7SUFDdkQsbURBQW1EO0lBQ25ELElBQUksU0FBUyxFQUFFO1FBQ2IsTUFBTSx1QkFBdUIsR0FBRyx1RUFBeUIsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUVuRSxNQUFNLGFBQWEsR0FBRyw4REFBZ0IsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUNsRCxJQUFJLE1BQU0sR0FBRyxhQUFhLENBQUMsTUFBTSxDQUFDO1FBQ2xDLElBQUksS0FBSyxHQUFHLGFBQWEsQ0FBQyxLQUFLLENBQUM7UUFDaEMsSUFBSSxVQUFVLEdBQUcsTUFBTSxHQUFHLHVCQUF1QixHQUFHLENBQUMsRUFBRTtZQUNyRCxNQUFNLEdBQUcsVUFBVSxHQUFHLHVCQUF1QixHQUFHLENBQUMsQ0FBQztTQUNuRDtRQUNELElBQUksU0FBUyxHQUFHLEtBQUssR0FBRyx1QkFBdUIsR0FBRyxDQUFDLEVBQUU7WUFDbkQsS0FBSyxHQUFHLFNBQVMsR0FBRyx1QkFBdUIsR0FBRyxDQUFDLENBQUM7U0FDakQ7UUFDRCxJQUNFLENBQUMsMkRBQWMsQ0FBQyxTQUFTLENBQUM7WUFDMUIsQ0FBQyxNQUFNLEtBQUssYUFBYSxDQUFDLE1BQU0sSUFBSSxLQUFLLEtBQUssYUFBYSxDQUFDLEtBQUssQ0FBQyxFQUNsRTtZQUNBLDZEQUFhLENBQUMsU0FBUyxFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7U0FDN0M7S0FDRjtJQUNELE9BQU87UUFDTCxLQUFLLEVBQUUsU0FBUztRQUNoQixNQUFNLEVBQUUsVUFBVTtRQUNsQixRQUFRLEVBQUUsWUFBWTtRQUN0QixDQUFDLEVBQUUsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNyQyxDQUFDLEVBQUUsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQztLQUN0QyxDQUFDO0FBQ0osQ0FBQyxDQUFDO0FBRUssTUFBTSxxQkFBcUIsR0FBRyxDQUNuQyxXQUFrQyxFQUNsQyxJQUFJLEdBQUcsV0FBVyxDQUFDLElBQUksRUFDdkIsRUFBRTtJQUNGLElBQUksV0FBVyxDQUFDLFNBQVMsRUFBRTtRQUN6QixPQUFPO0tBQ1I7SUFDRCxNQUFNLFNBQVMsR0FBRyxpRUFBbUIsQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUNuRCxJQUFJLFNBQVMsRUFBRTtRQUNiLElBQUksR0FBRyxzREFBUSxDQUNiLElBQUksRUFDSixxREFBYSxDQUFDLFdBQVcsQ0FBQyxFQUMxQixrRUFBb0IsQ0FBQyxTQUFTLENBQUMsQ0FDaEMsQ0FBQztLQUNIO0lBQ0QsTUFBTSxVQUFVLEdBQUcscUJBQXFCLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQzVELHVCQUFTLElBQUksSUFBSyxVQUFVLEVBQUc7QUFDakMsQ0FBQyxDQUFDO0FBRUssTUFBTSxpQkFBaUIsR0FBRyxDQUMvQixXQUFrQyxFQUNsQyxFQUNFLElBQUksRUFDSixTQUFTLEVBQ1QsWUFBWSxHQUtiLEVBQ3NCLEVBQUU7SUFDekIsT0FBTyw4REFBYyxDQUFDLFdBQVcsa0JBQy9CLFlBQVksRUFDWixTQUFTLEVBQUUsU0FBUyxhQUFULFNBQVMsY0FBVCxTQUFTLEdBQUksV0FBVyxDQUFDLFNBQVMsSUFDMUMscUJBQXFCLENBQUMsV0FBVyxFQUFFLFlBQVksQ0FBQyxFQUNuRCxDQUFDO0FBQ0wsQ0FBQyxDQUFDO0FBRUssTUFBTSxrQkFBa0IsR0FBRyxDQUNoQyxJQUkwQixFQUNhLEVBQUU7SUFDekMsdUNBQ0ssZUFBZSxDQUE0QixJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxLQUM5RCxNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU0sSUFBSSxFQUFFLEVBQ3pCLFNBQVMsRUFBRSxFQUFFLEVBQ2IsZ0JBQWdCLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixFQUN2QyxrQkFBa0IsRUFBRSxJQUFJLElBQ3hCO0FBQ0osQ0FBQyxDQUFDO0FBRUssTUFBTSxnQkFBZ0IsR0FBRyxDQUM5QixJQUswQixFQUNXLEVBQUU7SUFDdkMsdUNBQ0ssZUFBZSxDQUEwQixJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxLQUM1RCxNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU0sSUFBSSxFQUFFLEVBQ3pCLGtCQUFrQixFQUFFLElBQUksRUFDeEIsWUFBWSxFQUFFLElBQUksRUFDbEIsVUFBVSxFQUFFLElBQUksRUFDaEIsY0FBYyxFQUFFLElBQUksQ0FBQyxjQUFjLEVBQ25DLFlBQVksRUFBRSxJQUFJLENBQUMsWUFBWSxJQUMvQjtBQUNKLENBQUMsQ0FBQztBQUVLLE1BQU0sZUFBZSxHQUFHLENBQzdCLElBSzBCLEVBQ1UsRUFBRTs7SUFDdEMsdUNBQ0ssZUFBZSxDQUF5QixPQUFPLEVBQUUsSUFBSSxDQUFDO1FBQ3pELDJFQUEyRTtRQUMzRSx3RUFBd0U7UUFDeEUsV0FBVyxFQUFFLGFBQWEsRUFDMUIsTUFBTSxFQUFFLFVBQUksQ0FBQyxNQUFNLG1DQUFJLFNBQVMsRUFDaEMsTUFBTSxFQUFFLFVBQUksQ0FBQyxNQUFNLG1DQUFJLElBQUksRUFDM0IsS0FBSyxFQUFFLFVBQUksQ0FBQyxLQUFLLG1DQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUMzQjtBQUNKLENBQUMsQ0FBQztBQUVGLHNFQUFzRTtBQUN0RSxFQUFFO0FBQ0YsOEVBQThFO0FBQzlFLDJDQUEyQztBQUMzQyxFQUFFO0FBQ0YsK0NBQStDO0FBQy9DLEVBQUU7QUFDRix3RUFBd0U7QUFDeEUsd0RBQXdEO0FBQ3hELE1BQU0sZ0JBQWdCLEdBQUcsQ0FBQyxHQUFRLEVBQUUsUUFBZ0IsQ0FBQyxFQUFFLEVBQUU7SUFDdkQsNEJBQTRCO0lBQzVCLElBQUksR0FBRyxJQUFJLElBQUksSUFBSSxPQUFPLEdBQUcsS0FBSyxRQUFRLEVBQUU7UUFDMUMsT0FBTyxHQUFHLENBQUM7S0FDWjtJQUVELE1BQU0sVUFBVSxHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUV2RCxJQUFJLFVBQVUsS0FBSyxpQkFBaUIsRUFBRTtRQUNwQyxNQUFNLEdBQUcsR0FDUCxPQUFPLEdBQUcsQ0FBQyxXQUFXLEtBQUssVUFBVTtZQUNuQyxDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQzNDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDVCxLQUFLLE1BQU0sR0FBRyxJQUFJLEdBQUcsRUFBRTtZQUNyQixJQUFJLEdBQUcsQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLEVBQUU7Z0JBQzNCLG9FQUFvRTtnQkFDcEUsMENBQTBDO2dCQUMxQyxJQUFJLEtBQUssS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLEtBQUssT0FBTyxJQUFJLEdBQUcsS0FBSyxRQUFRLENBQUMsRUFBRTtvQkFDeEQsU0FBUztpQkFDVjtnQkFDRCxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQzthQUNsRDtTQUNGO1FBQ0QsT0FBTyxHQUFHLENBQUM7S0FDWjtJQUVELElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRTtRQUN0QixJQUFJLENBQUMsR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDO1FBQ25CLE1BQU0sR0FBRyxHQUFHLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3pCLE9BQU8sQ0FBQyxFQUFFLEVBQUU7WUFDVixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQztTQUM5QztRQUNELE9BQU8sR0FBRyxDQUFDO0tBQ1o7SUFFRCxvRUFBb0U7SUFDcEUsMkVBQTJFO0lBQzNFLHNEQUFzRDtJQUN0RCxJQUFJLElBQXNDLEVBQUU7UUFDMUMsSUFDRSxVQUFVLEtBQUssaUJBQWlCO1lBQ2hDLFVBQVUsS0FBSyxnQkFBZ0I7WUFDL0IsVUFBVSxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsRUFDakM7WUFDQSxPQUFPLENBQUMsSUFBSSxDQUNWLDZDQUE2QyxVQUFVLGtDQUFrQyxDQUMxRixDQUFDO1NBQ0g7S0FDRjtJQUVELE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQyxDQUFDO0FBRUY7Ozs7Ozs7O0dBUUc7QUFDSSxNQUFNLGVBQWUsR0FBRyxDQUM3QixHQUFNLEVBQ00sRUFBRTtJQUNkLE9BQU8sZ0JBQWdCLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDL0IsQ0FBQyxDQUFDO0FBRUY7OztHQUdHO0FBQ0gsTUFBTSxZQUFZLEdBQUc7QUFDbkIsMkNBQTJDO0FBQzNDLFVBQXlCLEVBQ3pCLEVBQUU7O0lBQ0YsSUFBSSxpREFBUyxFQUFFLElBQUksVUFBVSxFQUFFO1FBQzdCLElBQUksTUFBTSxHQUFHLEdBQUcsVUFBVSxPQUFPLENBQUM7UUFDbEMsbURBQW1EO1FBQ25ELElBQ0Usa0JBQU0sQ0FBQyxDQUFDLDBDQUFFLEdBQUcsMENBQ1QsZ0NBQWdDLEdBQ2pDLElBQUksQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsS0FBSyxNQUFNLENBQUMsRUFDakM7WUFDQSxNQUFNLElBQUksT0FBTyxDQUFDO1NBQ25CO1FBQ0QsT0FBTyxNQUFNLENBQUM7S0FDZjtJQUNELE9BQU8saURBQVEsRUFBRSxDQUFDO0FBQ3BCLENBQUMsQ0FBQztBQUVGOzs7Ozs7Ozs7Ozs7O0dBYUc7QUFDSSxNQUFNLGdCQUFnQixHQUFHLENBQzlCLGNBQTBDLEVBQzFDLHNCQUE2QyxFQUM3QyxPQUFpQixFQUNqQixTQUE2QixFQUNULEVBQUU7SUFDdEIsSUFBSSxJQUFJLEdBQUcsZUFBZSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBRXBDLElBQUksQ0FBQyxFQUFFLEdBQUcsWUFBWSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUNoQyxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQztJQUMxQixJQUFJLENBQUMsT0FBTyxHQUFHLDJEQUFtQixFQUFFLENBQUM7SUFDckMsSUFBSSxDQUFDLElBQUksR0FBRyxzREFBYSxFQUFFLENBQUM7SUFDNUIsSUFBSSxDQUFDLFFBQVEsR0FBRyxxRUFBNEIsQ0FDMUMsSUFBSSxDQUFDLFFBQVEsRUFDYixjQUFjLEVBQ2QsQ0FBQyxPQUFPLEVBQUUsRUFBRTtRQUNWLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLEVBQUU7WUFDeEMsc0JBQXNCLENBQUMsR0FBRyxDQUFDLE9BQU8sRUFBRSxZQUFZLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztTQUM1RDtRQUNELE9BQU8sc0JBQXNCLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBRSxDQUFDO0lBQzlDLENBQUMsQ0FDRixDQUFDO0lBQ0YsSUFBSSxTQUFTLEVBQUU7UUFDYixJQUFJLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsU0FBUyxDQUFDLENBQUM7S0FDdkM7SUFDRCxPQUFPLElBQUksQ0FBQztBQUNkLENBQUMsQ0FBQztBQUVGOzs7Ozs7Ozs7R0FTRztBQUNJLE1BQU0saUJBQWlCLEdBQUcsQ0FDL0IsUUFBc0MsRUFDdEMsSUFHQyxFQUNELEVBQUU7SUFDRixNQUFNLGNBQWMsR0FBd0IsRUFBRSxDQUFDO0lBRS9DLE1BQU0sZUFBZSxHQUFHLGtEQUFVLENBQUMsUUFBUSxDQUFDLENBQUM7SUFFN0MsNENBQTRDO0lBQzVDLE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxHQUFHLEVBRzdCLENBQUM7SUFFSixNQUFNLGFBQWEsR0FBRyxDQUFDLEVBQTJCLEVBQUUsRUFBRTtRQUNwRCx3RUFBd0U7UUFDeEUsSUFBSSxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUU7WUFDNUIsT0FBTyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFFLENBQUM7U0FDbEM7UUFDRCwwRUFBMEU7UUFDMUUsb0RBQW9EO1FBQ3BELElBQUksZUFBZSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRTtZQUMzQixNQUFNLEtBQUssR0FBRyxZQUFZLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDL0IsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxLQUFLLENBQUMsQ0FBQztZQUNoQyxPQUFPLEtBQUssQ0FBQztTQUNkO1FBQ0QsbUVBQW1FO1FBQ25FLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQyxDQUFDO0lBRUYsTUFBTSxjQUFjLEdBQUcsSUFBSSxHQUFHLEVBQXlDLENBQUM7SUFFeEUsS0FBSyxNQUFNLE9BQU8sSUFBSSxRQUFRLEVBQUU7UUFDOUIsTUFBTSxhQUFhLEdBQStCLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBRTVFLGFBQWEsQ0FBQyxFQUFFLEdBQUcsYUFBYSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUUsQ0FBQztRQUU5QyxJQUFJLElBQUksYUFBSixJQUFJLHVCQUFKLElBQUksQ0FBRSxhQUFhLEVBQUU7WUFDdkIsYUFBYSxDQUFDLElBQUksR0FBRyxzREFBYSxFQUFFLENBQUM7WUFDckMsMkRBQVcsQ0FBQyxhQUFhLENBQUMsQ0FBQztTQUM1QjtRQUVELElBQUksYUFBYSxDQUFDLFFBQVEsRUFBRTtZQUMxQixhQUFhLENBQUMsUUFBUSxHQUFHLGFBQWEsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUU7Z0JBQzlELElBQUksQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxFQUFFO29CQUNoQyxjQUFjLENBQUMsR0FBRyxDQUFDLE9BQU8sRUFBRSxZQUFZLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztpQkFDcEQ7Z0JBQ0QsT0FBTyxjQUFjLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBRSxDQUFDO1lBQ3RDLENBQUMsQ0FBQyxDQUFDO1NBQ0o7UUFFRCxJQUFJLGFBQWEsSUFBSSxhQUFhLElBQUksYUFBYSxDQUFDLFdBQVcsRUFBRTtZQUMvRCxNQUFNLGNBQWMsR0FBRyxhQUFhLENBQUMsYUFBYSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBQ2hFLGFBQWEsQ0FBQyxXQUFXLEdBQUcsY0FBYyxDQUFDO1NBQzVDO1FBRUQsSUFBSSxlQUFlLElBQUksYUFBYSxJQUFJLGFBQWEsQ0FBQyxhQUFhLEVBQUU7WUFDbkUsYUFBYSxDQUFDLGFBQWEsR0FBRyxhQUFhLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FDOUQsQ0FDRSxHQUE2RCxFQUM3RCxPQUFPLEVBQ1AsRUFBRTtnQkFDRixNQUFNLFlBQVksR0FBRyxhQUFhLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDO2dCQUMvQyxJQUFJLFlBQVksRUFBRTtvQkFDaEIsR0FBRyxDQUFDLElBQUksaUNBQU0sT0FBTyxLQUFFLEVBQUUsRUFBRSxZQUFZLElBQUcsQ0FBQztpQkFDNUM7Z0JBQ0QsT0FBTyxHQUFHLENBQUM7WUFDYixDQUFDLEVBQ0QsRUFBRSxDQUNILENBQUM7U0FDSDtRQUVELElBQUksWUFBWSxJQUFJLGFBQWEsSUFBSSxhQUFhLENBQUMsVUFBVSxFQUFFO1lBQzdELE1BQU0sZUFBZSxHQUFHLGFBQWEsQ0FBQyxhQUFhLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQzFFLGFBQWEsQ0FBQyxVQUFVLEdBQUcsZUFBZTtnQkFDeEMsQ0FBQyxpQ0FDTSxhQUFhLENBQUMsVUFBVSxLQUMzQixTQUFTLEVBQUUsZUFBZSxJQUU5QixDQUFDLENBQUMsSUFBSSxDQUFDO1NBQ1Y7UUFDRCxJQUFJLGNBQWMsSUFBSSxhQUFhLElBQUksYUFBYSxDQUFDLFlBQVksRUFBRTtZQUNqRSxNQUFNLGVBQWUsR0FBRyxhQUFhLENBQ25DLGFBQWEsQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUNyQyxDQUFDO1lBQ0YsYUFBYSxDQUFDLFlBQVksR0FBRyxlQUFlO2dCQUMxQyxDQUFDLGlDQUNNLGFBQWEsQ0FBQyxZQUFZLEtBQzdCLFNBQVMsRUFBRSxlQUFlLElBRTlCLENBQUMsQ0FBQyxJQUFJLENBQUM7U0FDVjtRQUVELGNBQWMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7S0FDcEM7SUFFRCxPQUFPLGNBQWMsQ0FBQztBQUN4QixDQUFDLENBQUM7QUFFSyxNQUFNLDJCQUEyQixHQUFHLENBQ3pDLFFBQXVDLEVBQ3ZDLEVBQUU7SUFDRixNQUFNLEdBQUcsR0FBd0IsRUFBRSxDQUFDO0lBQ3BDLElBQUksQ0FBQyxRQUFRLEVBQUU7UUFDYixPQUFPLEVBQUUsQ0FBQztLQUNYO0lBQ0QsT0FBTyxDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDL0IsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFOztRQUMzQixJQUFJLENBQUMsT0FBTyxFQUFFO1lBQ1osT0FBTztTQUNSO1FBQ0QsSUFDRSxrRUFBb0IsQ0FBQyxPQUFPLENBQUM7YUFDN0IsYUFBTyxhQUFQLE9BQU8sdUJBQVAsT0FBTyxDQUFFLEtBQUssMENBQUUsSUFBSTtZQUNwQixDQUFDLE9BQU8sQ0FBQyxJQUFJLEtBQUssV0FBVztnQkFDM0IsT0FBTyxDQUFDLElBQUksS0FBSyxTQUFTO2dCQUMxQixPQUFPLENBQUMsSUFBSSxLQUFLLFNBQVMsQ0FBQyxFQUM3QjtZQUNBLE1BQU0sUUFBUSxHQUFHLGlFQUFtQixDQUFDLE9BQU8sRUFBRSxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDN0QsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLFFBQVEsQ0FBQyxDQUFDO1NBQ3ZCO2FBQU07WUFDTCxJQUFJLGlCQUFpQixDQUFDO1lBQ3RCLElBQUksT0FBTyxDQUFDLElBQUksS0FBSyxNQUFNLEVBQUU7Z0JBQzNCLFlBQVk7Z0JBQ1osaUJBQWlCLEdBQUcsY0FBYztvQkFDaEMsWUFBWTtvQkFDWixDQUFDLEVBQUUsQ0FBQztvQkFDSixZQUFZO29CQUNaLENBQUMsRUFBRSxDQUFDLElBQ0QsT0FBTyxFQUNWLENBQUM7YUFDSjtpQkFBTTtnQkFDTCxZQUFZO2dCQUNaLGlCQUFpQixHQUFHLFVBQVUsK0JBQzVCLENBQUMsRUFBRSxDQUFDLEVBQ0osQ0FBQyxFQUFFLENBQUMsSUFFRCxPQUFPLEtBQ1YsS0FBSztvQkFDSCxZQUFZO29CQUNaLFFBQU8sYUFBUCxPQUFPLHVCQUFQLE9BQU8sQ0FBRSxLQUFLO3dCQUNkLENBQUMsb0NBQW9DLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUM7NEJBQzFELENBQUMsQ0FBQyxHQUFHOzRCQUNMLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFDUixNQUFNO29CQUNKLFlBQVk7b0JBQ1osUUFBTyxhQUFQLE9BQU8sdUJBQVAsT0FBTyxDQUFFLE1BQU07d0JBQ2YsQ0FBQyxvQ0FBb0MsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQzs0QkFDMUQsQ0FBQyxDQUFDLEdBQUc7NEJBQ0wsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUNSLENBQUM7YUFDSjtZQUNELFlBQVk7WUFFWixHQUFHLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUM7U0FDN0I7SUFDSCxDQUFDLENBQUMsQ0FBQztJQUNILE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQyxDQUFDIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4uLy4uL2VsZW1lbnQvbmV3RWxlbWVudC50cz8xMjUzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEV4Y2FsaWRyYXdFbGVtZW50LFxuICBFeGNhbGlkcmF3SW1hZ2VFbGVtZW50LFxuICBFeGNhbGlkcmF3VGV4dEVsZW1lbnQsXG4gIEV4Y2FsaWRyYXdMaW5lYXJFbGVtZW50LFxuICBFeGNhbGlkcmF3R2VuZXJpY0VsZW1lbnQsXG4gIE5vbkRlbGV0ZWQsXG4gIFRleHRBbGlnbixcbiAgR3JvdXBJZCxcbiAgVmVydGljYWxBbGlnbixcbiAgQXJyb3doZWFkLFxuICBFeGNhbGlkcmF3RnJlZURyYXdFbGVtZW50LFxuICBGb250RmFtaWx5VmFsdWVzLFxuICBFeGNhbGlkcmF3VGV4dENvbnRhaW5lcixcbn0gZnJvbSBcIi4uL2VsZW1lbnQvdHlwZXNcIjtcbmltcG9ydCB7XG4gIGFycmF5VG9NYXAsXG4gIGdldEZvbnRTdHJpbmcsXG4gIGdldFVwZGF0ZWRUaW1lc3RhbXAsXG4gIGlzVGVzdEVudixcbn0gZnJvbSBcIi4uL3V0aWxzXCI7XG5pbXBvcnQgeyByYW5kb21JbnRlZ2VyLCByYW5kb21JZCB9IGZyb20gXCIuLi9yYW5kb21cIjtcbmltcG9ydCB7IGJ1bXBWZXJzaW9uLCBtdXRhdGVFbGVtZW50LCBuZXdFbGVtZW50V2l0aCB9IGZyb20gXCIuL211dGF0ZUVsZW1lbnRcIjtcbmltcG9ydCB7IGdldE5ld0dyb3VwSWRzRm9yRHVwbGljYXRpb24gfSBmcm9tIFwiLi4vZ3JvdXBzXCI7XG5pbXBvcnQgeyBBcHBTdGF0ZSB9IGZyb20gXCIuLi90eXBlc1wiO1xuaW1wb3J0IHsgZ2V0RWxlbWVudEFic29sdXRlQ29vcmRzIH0gZnJvbSBcIi5cIjtcbmltcG9ydCB7IGFkanVzdFhZV2l0aFJvdGF0aW9uIH0gZnJvbSBcIi4uL21hdGhcIjtcbmltcG9ydCB7IGdldFJlc2l6ZWRFbGVtZW50QWJzb2x1dGVDb29yZHMgfSBmcm9tIFwiLi9ib3VuZHNcIjtcbmltcG9ydCB7XG4gIGdldEJvdW5kVGV4dEVsZW1lbnRPZmZzZXQsXG4gIGdldENvbnRhaW5lckRpbXMsXG4gIGdldENvbnRhaW5lckVsZW1lbnQsXG4gIG1lYXN1cmVUZXh0LFxuICBub3JtYWxpemVUZXh0LFxuICB3cmFwVGV4dCxcbiAgZ2V0Qm91bmRUZXh0TWF4V2lkdGgsXG4gIGdldERlZmF1bHRMaW5lSGVpZ2h0LFxuICBiaW5kVGV4dFRvQ29udGFpbmVyLFxuICBpc1ZhbGlkVGV4dENvbnRhaW5lcixcbn0gZnJvbSBcIi4vdGV4dEVsZW1lbnRcIjtcbmltcG9ydCB7XG4gIERFRkFVTFRfRUxFTUVOVF9QUk9QUyxcbiAgREVGQVVMVF9GT05UX0ZBTUlMWSxcbiAgREVGQVVMVF9GT05UX1NJWkUsXG4gIERFRkFVTFRfVEVYVF9BTElHTixcbiAgREVGQVVMVF9WRVJUSUNBTF9BTElHTixcbiAgVkVSVElDQUxfQUxJR04sXG59IGZyb20gXCIuLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IGlzQXJyb3dFbGVtZW50IH0gZnJvbSBcIi4vdHlwZUNoZWNrc1wiO1xuaW1wb3J0IHsgTWFya09wdGlvbmFsLCBNZXJnZSwgTXV0YWJsZSB9IGZyb20gXCIuLi91dGlsaXR5LXR5cGVzXCI7XG5pbXBvcnQgeyBJbXBvcnRlZERhdGFTdGF0ZSB9IGZyb20gXCIuLi9kYXRhL3R5cGVzXCI7XG5cbmNvbnN0IEVMRU1FTlRTX1NVUFBPUlRJTkdfUFJPR1JBTU1BVElDX0FQSSA9IFtcbiAgXCJyZWN0YW5nbGVcIixcbiAgXCJlbGxpcHNlXCIsXG4gIFwiZGlhbW9uZFwiLFxuICBcInRleHRcIixcbl07XG5leHBvcnQgdHlwZSBFbGVtZW50Q29uc3RydWN0b3JPcHRzID0gTWFya09wdGlvbmFsPFxuICBPbWl0PEV4Y2FsaWRyYXdHZW5lcmljRWxlbWVudCwgXCJpZFwiIHwgXCJ0eXBlXCIgfCBcImlzRGVsZXRlZFwiIHwgXCJ1cGRhdGVkXCI+LFxuICB8IFwid2lkdGhcIlxuICB8IFwiaGVpZ2h0XCJcbiAgfCBcImFuZ2xlXCJcbiAgfCBcImdyb3VwSWRzXCJcbiAgfCBcImJvdW5kRWxlbWVudHNcIlxuICB8IFwic2VlZFwiXG4gIHwgXCJ2ZXJzaW9uXCJcbiAgfCBcInZlcnNpb25Ob25jZVwiXG4gIHwgXCJsaW5rXCJcbiAgfCBcInN0cm9rZVN0eWxlXCJcbiAgfCBcImZpbGxTdHlsZVwiXG4gIHwgXCJzdHJva2VDb2xvclwiXG4gIHwgXCJiYWNrZ3JvdW5kQ29sb3JcIlxuICB8IFwicm91Z2huZXNzXCJcbiAgfCBcInN0cm9rZVdpZHRoXCJcbiAgfCBcInJvdW5kbmVzc1wiXG4gIHwgXCJsb2NrZWRcIlxuICB8IFwib3BhY2l0eVwiXG4+O1xuXG5jb25zdCBfbmV3RWxlbWVudEJhc2UgPSA8VCBleHRlbmRzIEV4Y2FsaWRyYXdFbGVtZW50PihcbiAgdHlwZTogVFtcInR5cGVcIl0sXG4gIHtcbiAgICB4LFxuICAgIHksXG4gICAgc3Ryb2tlQ29sb3IgPSBERUZBVUxUX0VMRU1FTlRfUFJPUFMuc3Ryb2tlQ29sb3IsXG4gICAgYmFja2dyb3VuZENvbG9yID0gREVGQVVMVF9FTEVNRU5UX1BST1BTLmJhY2tncm91bmRDb2xvcixcbiAgICBmaWxsU3R5bGUgPSBERUZBVUxUX0VMRU1FTlRfUFJPUFMuZmlsbFN0eWxlLFxuICAgIHN0cm9rZVdpZHRoID0gREVGQVVMVF9FTEVNRU5UX1BST1BTLnN0cm9rZVdpZHRoLFxuICAgIHN0cm9rZVN0eWxlID0gREVGQVVMVF9FTEVNRU5UX1BST1BTLnN0cm9rZVN0eWxlLFxuICAgIHJvdWdobmVzcyA9IERFRkFVTFRfRUxFTUVOVF9QUk9QUy5yb3VnaG5lc3MsXG4gICAgb3BhY2l0eSA9IERFRkFVTFRfRUxFTUVOVF9QUk9QUy5vcGFjaXR5LFxuICAgIHdpZHRoID0gMCxcbiAgICBoZWlnaHQgPSAwLFxuICAgIGFuZ2xlID0gMCxcbiAgICBncm91cElkcyA9IFtdLFxuICAgIHJvdW5kbmVzcyA9IG51bGwsXG4gICAgYm91bmRFbGVtZW50cyA9IG51bGwsXG4gICAgbGluayA9IG51bGwsXG4gICAgbG9ja2VkID0gREVGQVVMVF9FTEVNRU5UX1BST1BTLmxvY2tlZCxcbiAgICAuLi5yZXN0XG4gIH06IEVsZW1lbnRDb25zdHJ1Y3Rvck9wdHMgJiBPbWl0PFBhcnRpYWw8RXhjYWxpZHJhd0dlbmVyaWNFbGVtZW50PiwgXCJ0eXBlXCI+LFxuKSA9PiB7XG4gIGNvbnNvbGUubG9nKFwid2lkdGhcIiwgd2lkdGgpO1xuICAvLyBhc3NpZ24gdHlwZSB0byBndWFyZCBhZ2FpbnN0IGV4Y2VzcyBwcm9wZXJ0aWVzXG4gIGNvbnN0IGVsZW1lbnQ6IE1lcmdlPEV4Y2FsaWRyYXdHZW5lcmljRWxlbWVudCwgeyB0eXBlOiBUW1widHlwZVwiXSB9PiA9IHtcbiAgICBpZDogcmVzdC5pZCB8fCByYW5kb21JZCgpLFxuICAgIHR5cGUsXG4gICAgeCxcbiAgICB5LFxuICAgIHdpZHRoLFxuICAgIGhlaWdodCxcbiAgICBhbmdsZSxcbiAgICBzdHJva2VDb2xvcixcbiAgICBiYWNrZ3JvdW5kQ29sb3IsXG4gICAgZmlsbFN0eWxlLFxuICAgIHN0cm9rZVdpZHRoLFxuICAgIHN0cm9rZVN0eWxlLFxuICAgIHJvdWdobmVzcyxcbiAgICBvcGFjaXR5LFxuICAgIGdyb3VwSWRzLFxuICAgIHJvdW5kbmVzcyxcbiAgICBzZWVkOiByZXN0LnNlZWQgPz8gcmFuZG9tSW50ZWdlcigpLFxuICAgIHZlcnNpb246IHJlc3QudmVyc2lvbiB8fCAxLFxuICAgIHZlcnNpb25Ob25jZTogcmVzdC52ZXJzaW9uTm9uY2UgPz8gMCxcbiAgICBpc0RlbGV0ZWQ6IGZhbHNlIGFzIGZhbHNlLFxuICAgIGJvdW5kRWxlbWVudHMsXG4gICAgdXBkYXRlZDogZ2V0VXBkYXRlZFRpbWVzdGFtcCgpLFxuICAgIGxpbmssXG4gICAgbG9ja2VkLFxuICB9O1xuICByZXR1cm4gZWxlbWVudDtcbn07XG5cbmV4cG9ydCBjb25zdCBuZXdFbGVtZW50ID0gKFxuICBvcHRzOiB7XG4gICAgdHlwZTogRXhjYWxpZHJhd0dlbmVyaWNFbGVtZW50W1widHlwZVwiXTtcbiAgfSAmIEVsZW1lbnRDb25zdHJ1Y3Rvck9wdHMsXG4pOiBOb25EZWxldGVkPEV4Y2FsaWRyYXdHZW5lcmljRWxlbWVudD4gPT5cbiAgX25ld0VsZW1lbnRCYXNlPEV4Y2FsaWRyYXdHZW5lcmljRWxlbWVudD4ob3B0cy50eXBlLCBvcHRzKTtcblxuLyoqIGNvbXB1dGVzIGVsZW1lbnQgeC95IG9mZnNldCBiYXNlZCBvbiB0ZXh0QWxpZ24vdmVydGljYWxBbGlnbiAqL1xuY29uc3QgZ2V0VGV4dEVsZW1lbnRQb3NpdGlvbk9mZnNldHMgPSAoXG4gIG9wdHM6IHtcbiAgICB0ZXh0QWxpZ246IEV4Y2FsaWRyYXdUZXh0RWxlbWVudFtcInRleHRBbGlnblwiXTtcbiAgICB2ZXJ0aWNhbEFsaWduOiBFeGNhbGlkcmF3VGV4dEVsZW1lbnRbXCJ2ZXJ0aWNhbEFsaWduXCJdO1xuICB9LFxuICBtZXRyaWNzOiB7XG4gICAgd2lkdGg6IG51bWJlcjtcbiAgICBoZWlnaHQ6IG51bWJlcjtcbiAgfSxcbikgPT4ge1xuICByZXR1cm4ge1xuICAgIHg6XG4gICAgICBvcHRzLnRleHRBbGlnbiA9PT0gXCJjZW50ZXJcIlxuICAgICAgICA/IG1ldHJpY3Mud2lkdGggLyAyXG4gICAgICAgIDogb3B0cy50ZXh0QWxpZ24gPT09IFwicmlnaHRcIlxuICAgICAgICA/IG1ldHJpY3Mud2lkdGhcbiAgICAgICAgOiAwLFxuICAgIHk6IG9wdHMudmVydGljYWxBbGlnbiA9PT0gXCJtaWRkbGVcIiA/IG1ldHJpY3MuaGVpZ2h0IC8gMiA6IDAsXG4gIH07XG59O1xuXG5leHBvcnQgY29uc3QgbmV3VGV4dEVsZW1lbnQgPSAoXG4gIG9wdHM6IHtcbiAgICB0ZXh0OiBzdHJpbmc7XG4gICAgZm9udFNpemU/OiBudW1iZXI7XG4gICAgZm9udEZhbWlseT86IEZvbnRGYW1pbHlWYWx1ZXM7XG4gICAgdGV4dEFsaWduPzogVGV4dEFsaWduO1xuICAgIHZlcnRpY2FsQWxpZ24/OiBWZXJ0aWNhbEFsaWduO1xuICAgIGNvbnRhaW5lcklkPzogRXhjYWxpZHJhd1RleHRDb250YWluZXJbXCJpZFwiXTtcbiAgICBsaW5lSGVpZ2h0PzogRXhjYWxpZHJhd1RleHRFbGVtZW50W1wibGluZUhlaWdodFwiXTtcbiAgICBzdHJva2VXaWR0aD86IEV4Y2FsaWRyYXdUZXh0RWxlbWVudFtcInN0cm9rZVdpZHRoXCJdO1xuICB9ICYgRWxlbWVudENvbnN0cnVjdG9yT3B0cyxcbik6IE5vbkRlbGV0ZWQ8RXhjYWxpZHJhd1RleHRFbGVtZW50PiA9PiB7XG4gIGNvbnN0IGZvbnRGYW1pbHkgPSBvcHRzLmZvbnRGYW1pbHkgfHwgREVGQVVMVF9GT05UX0ZBTUlMWTtcbiAgY29uc3QgZm9udFNpemUgPSBvcHRzLmZvbnRTaXplIHx8IERFRkFVTFRfRk9OVF9TSVpFO1xuICBjb25zdCBsaW5lSGVpZ2h0ID0gb3B0cy5saW5lSGVpZ2h0IHx8IGdldERlZmF1bHRMaW5lSGVpZ2h0KGZvbnRGYW1pbHkpO1xuICBjb25zdCB0ZXh0ID0gbm9ybWFsaXplVGV4dChvcHRzLnRleHQpO1xuICBjb25zdCBtZXRyaWNzID0gbWVhc3VyZVRleHQoXG4gICAgdGV4dCxcbiAgICBnZXRGb250U3RyaW5nKHsgZm9udEZhbWlseSwgZm9udFNpemUgfSksXG4gICAgbGluZUhlaWdodCxcbiAgKTtcbiAgY29uc3QgdGV4dEFsaWduID0gb3B0cy50ZXh0QWxpZ24gfHwgREVGQVVMVF9URVhUX0FMSUdOO1xuICBjb25zdCB2ZXJ0aWNhbEFsaWduID0gb3B0cy52ZXJ0aWNhbEFsaWduIHx8IERFRkFVTFRfVkVSVElDQUxfQUxJR047XG4gIGNvbnN0IG9mZnNldHMgPSBnZXRUZXh0RWxlbWVudFBvc2l0aW9uT2Zmc2V0cyhcbiAgICB7IHRleHRBbGlnbiwgdmVydGljYWxBbGlnbiB9LFxuICAgIG1ldHJpY3MsXG4gICk7XG5cbiAgY29uc3QgdGV4dEVsZW1lbnQgPSBuZXdFbGVtZW50V2l0aChcbiAgICB7XG4gICAgICAuLi5fbmV3RWxlbWVudEJhc2U8RXhjYWxpZHJhd1RleHRFbGVtZW50PihcInRleHRcIiwgb3B0cyksXG4gICAgICB0ZXh0LFxuICAgICAgZm9udFNpemUsXG4gICAgICBmb250RmFtaWx5LFxuICAgICAgdGV4dEFsaWduLFxuICAgICAgdmVydGljYWxBbGlnbixcbiAgICAgIHg6IG9wdHMueCAtIG9mZnNldHMueCxcbiAgICAgIHk6IG9wdHMueSAtIG9mZnNldHMueSxcbiAgICAgIHdpZHRoOiBtZXRyaWNzLndpZHRoLFxuICAgICAgaGVpZ2h0OiBtZXRyaWNzLmhlaWdodCxcbiAgICAgIGJhc2VsaW5lOiBtZXRyaWNzLmJhc2VsaW5lLFxuICAgICAgY29udGFpbmVySWQ6IG9wdHMuY29udGFpbmVySWQgfHwgbnVsbCxcbiAgICAgIG9yaWdpbmFsVGV4dDogdGV4dCxcbiAgICAgIGxpbmVIZWlnaHQsXG4gICAgfSxcbiAgICB7fSxcbiAgKTtcbiAgcmV0dXJuIHRleHRFbGVtZW50O1xufTtcblxuY29uc3QgZ2V0QWRqdXN0ZWREaW1lbnNpb25zID0gKFxuICBlbGVtZW50OiBFeGNhbGlkcmF3VGV4dEVsZW1lbnQsXG4gIG5leHRUZXh0OiBzdHJpbmcsXG4pOiB7XG4gIHg6IG51bWJlcjtcbiAgeTogbnVtYmVyO1xuICB3aWR0aDogbnVtYmVyO1xuICBoZWlnaHQ6IG51bWJlcjtcbiAgYmFzZWxpbmU6IG51bWJlcjtcbn0gPT4ge1xuICBjb25zdCBjb250YWluZXIgPSBnZXRDb250YWluZXJFbGVtZW50KGVsZW1lbnQpO1xuXG4gIGNvbnN0IHtcbiAgICB3aWR0aDogbmV4dFdpZHRoLFxuICAgIGhlaWdodDogbmV4dEhlaWdodCxcbiAgICBiYXNlbGluZTogbmV4dEJhc2VsaW5lLFxuICB9ID0gbWVhc3VyZVRleHQobmV4dFRleHQsIGdldEZvbnRTdHJpbmcoZWxlbWVudCksIGVsZW1lbnQubGluZUhlaWdodCk7XG4gIGNvbnN0IHsgdGV4dEFsaWduLCB2ZXJ0aWNhbEFsaWduIH0gPSBlbGVtZW50O1xuICBsZXQgeDogbnVtYmVyO1xuICBsZXQgeTogbnVtYmVyO1xuICBpZiAoXG4gICAgdGV4dEFsaWduID09PSBcImNlbnRlclwiICYmXG4gICAgdmVydGljYWxBbGlnbiA9PT0gVkVSVElDQUxfQUxJR04uTUlERExFICYmXG4gICAgIWVsZW1lbnQuY29udGFpbmVySWRcbiAgKSB7XG4gICAgY29uc3QgcHJldk1ldHJpY3MgPSBtZWFzdXJlVGV4dChcbiAgICAgIGVsZW1lbnQudGV4dCxcbiAgICAgIGdldEZvbnRTdHJpbmcoZWxlbWVudCksXG4gICAgICBlbGVtZW50LmxpbmVIZWlnaHQsXG4gICAgKTtcbiAgICBjb25zdCBvZmZzZXRzID0gZ2V0VGV4dEVsZW1lbnRQb3NpdGlvbk9mZnNldHMoZWxlbWVudCwge1xuICAgICAgd2lkdGg6IG5leHRXaWR0aCAtIHByZXZNZXRyaWNzLndpZHRoLFxuICAgICAgaGVpZ2h0OiBuZXh0SGVpZ2h0IC0gcHJldk1ldHJpY3MuaGVpZ2h0LFxuICAgIH0pO1xuXG4gICAgeCA9IGVsZW1lbnQueCAtIG9mZnNldHMueDtcbiAgICB5ID0gZWxlbWVudC55IC0gb2Zmc2V0cy55O1xuICB9IGVsc2Uge1xuICAgIGNvbnN0IFt4MSwgeTEsIHgyLCB5Ml0gPSBnZXRFbGVtZW50QWJzb2x1dGVDb29yZHMoZWxlbWVudCk7XG5cbiAgICBjb25zdCBbbmV4dFgxLCBuZXh0WTEsIG5leHRYMiwgbmV4dFkyXSA9IGdldFJlc2l6ZWRFbGVtZW50QWJzb2x1dGVDb29yZHMoXG4gICAgICBlbGVtZW50LFxuICAgICAgbmV4dFdpZHRoLFxuICAgICAgbmV4dEhlaWdodCxcbiAgICAgIGZhbHNlLFxuICAgICk7XG4gICAgY29uc3QgZGVsdGFYMSA9ICh4MSAtIG5leHRYMSkgLyAyO1xuICAgIGNvbnN0IGRlbHRhWTEgPSAoeTEgLSBuZXh0WTEpIC8gMjtcbiAgICBjb25zdCBkZWx0YVgyID0gKHgyIC0gbmV4dFgyKSAvIDI7XG4gICAgY29uc3QgZGVsdGFZMiA9ICh5MiAtIG5leHRZMikgLyAyO1xuXG4gICAgW3gsIHldID0gYWRqdXN0WFlXaXRoUm90YXRpb24oXG4gICAgICB7XG4gICAgICAgIHM6IHRydWUsXG4gICAgICAgIGU6IHRleHRBbGlnbiA9PT0gXCJjZW50ZXJcIiB8fCB0ZXh0QWxpZ24gPT09IFwibGVmdFwiLFxuICAgICAgICB3OiB0ZXh0QWxpZ24gPT09IFwiY2VudGVyXCIgfHwgdGV4dEFsaWduID09PSBcInJpZ2h0XCIsXG4gICAgICB9LFxuICAgICAgZWxlbWVudC54LFxuICAgICAgZWxlbWVudC55LFxuICAgICAgZWxlbWVudC5hbmdsZSxcbiAgICAgIGRlbHRhWDEsXG4gICAgICBkZWx0YVkxLFxuICAgICAgZGVsdGFYMixcbiAgICAgIGRlbHRhWTIsXG4gICAgKTtcbiAgfVxuXG4gIC8vIG1ha2Ugc3VyZSBjb250YWluZXIgZGltZW5zaW9ucyBhcmUgc2V0IHByb3Blcmx5IHdoZW5cbiAgLy8gdGV4dCBlZGl0b3Igb3ZlcmZsb3dzIGJleW9uZCB2aWV3cG9ydCBkaW1lbnNpb25zXG4gIGlmIChjb250YWluZXIpIHtcbiAgICBjb25zdCBib3VuZFRleHRFbGVtZW50UGFkZGluZyA9IGdldEJvdW5kVGV4dEVsZW1lbnRPZmZzZXQoZWxlbWVudCk7XG5cbiAgICBjb25zdCBjb250YWluZXJEaW1zID0gZ2V0Q29udGFpbmVyRGltcyhjb250YWluZXIpO1xuICAgIGxldCBoZWlnaHQgPSBjb250YWluZXJEaW1zLmhlaWdodDtcbiAgICBsZXQgd2lkdGggPSBjb250YWluZXJEaW1zLndpZHRoO1xuICAgIGlmIChuZXh0SGVpZ2h0ID4gaGVpZ2h0IC0gYm91bmRUZXh0RWxlbWVudFBhZGRpbmcgKiAyKSB7XG4gICAgICBoZWlnaHQgPSBuZXh0SGVpZ2h0ICsgYm91bmRUZXh0RWxlbWVudFBhZGRpbmcgKiAyO1xuICAgIH1cbiAgICBpZiAobmV4dFdpZHRoID4gd2lkdGggLSBib3VuZFRleHRFbGVtZW50UGFkZGluZyAqIDIpIHtcbiAgICAgIHdpZHRoID0gbmV4dFdpZHRoICsgYm91bmRUZXh0RWxlbWVudFBhZGRpbmcgKiAyO1xuICAgIH1cbiAgICBpZiAoXG4gICAgICAhaXNBcnJvd0VsZW1lbnQoY29udGFpbmVyKSAmJlxuICAgICAgKGhlaWdodCAhPT0gY29udGFpbmVyRGltcy5oZWlnaHQgfHwgd2lkdGggIT09IGNvbnRhaW5lckRpbXMud2lkdGgpXG4gICAgKSB7XG4gICAgICBtdXRhdGVFbGVtZW50KGNvbnRhaW5lciwgeyBoZWlnaHQsIHdpZHRoIH0pO1xuICAgIH1cbiAgfVxuICByZXR1cm4ge1xuICAgIHdpZHRoOiBuZXh0V2lkdGgsXG4gICAgaGVpZ2h0OiBuZXh0SGVpZ2h0LFxuICAgIGJhc2VsaW5lOiBuZXh0QmFzZWxpbmUsXG4gICAgeDogTnVtYmVyLmlzRmluaXRlKHgpID8geCA6IGVsZW1lbnQueCxcbiAgICB5OiBOdW1iZXIuaXNGaW5pdGUoeSkgPyB5IDogZWxlbWVudC55LFxuICB9O1xufTtcblxuZXhwb3J0IGNvbnN0IHJlZnJlc2hUZXh0RGltZW5zaW9ucyA9IChcbiAgdGV4dEVsZW1lbnQ6IEV4Y2FsaWRyYXdUZXh0RWxlbWVudCxcbiAgdGV4dCA9IHRleHRFbGVtZW50LnRleHQsXG4pID0+IHtcbiAgaWYgKHRleHRFbGVtZW50LmlzRGVsZXRlZCkge1xuICAgIHJldHVybjtcbiAgfVxuICBjb25zdCBjb250YWluZXIgPSBnZXRDb250YWluZXJFbGVtZW50KHRleHRFbGVtZW50KTtcbiAgaWYgKGNvbnRhaW5lcikge1xuICAgIHRleHQgPSB3cmFwVGV4dChcbiAgICAgIHRleHQsXG4gICAgICBnZXRGb250U3RyaW5nKHRleHRFbGVtZW50KSxcbiAgICAgIGdldEJvdW5kVGV4dE1heFdpZHRoKGNvbnRhaW5lciksXG4gICAgKTtcbiAgfVxuICBjb25zdCBkaW1lbnNpb25zID0gZ2V0QWRqdXN0ZWREaW1lbnNpb25zKHRleHRFbGVtZW50LCB0ZXh0KTtcbiAgcmV0dXJuIHsgdGV4dCwgLi4uZGltZW5zaW9ucyB9O1xufTtcblxuZXhwb3J0IGNvbnN0IHVwZGF0ZVRleHRFbGVtZW50ID0gKFxuICB0ZXh0RWxlbWVudDogRXhjYWxpZHJhd1RleHRFbGVtZW50LFxuICB7XG4gICAgdGV4dCxcbiAgICBpc0RlbGV0ZWQsXG4gICAgb3JpZ2luYWxUZXh0LFxuICB9OiB7XG4gICAgdGV4dDogc3RyaW5nO1xuICAgIGlzRGVsZXRlZD86IGJvb2xlYW47XG4gICAgb3JpZ2luYWxUZXh0OiBzdHJpbmc7XG4gIH0sXG4pOiBFeGNhbGlkcmF3VGV4dEVsZW1lbnQgPT4ge1xuICByZXR1cm4gbmV3RWxlbWVudFdpdGgodGV4dEVsZW1lbnQsIHtcbiAgICBvcmlnaW5hbFRleHQsXG4gICAgaXNEZWxldGVkOiBpc0RlbGV0ZWQgPz8gdGV4dEVsZW1lbnQuaXNEZWxldGVkLFxuICAgIC4uLnJlZnJlc2hUZXh0RGltZW5zaW9ucyh0ZXh0RWxlbWVudCwgb3JpZ2luYWxUZXh0KSxcbiAgfSk7XG59O1xuXG5leHBvcnQgY29uc3QgbmV3RnJlZURyYXdFbGVtZW50ID0gKFxuICBvcHRzOiB7XG4gICAgdHlwZTogXCJmcmVlZHJhd1wiO1xuICAgIHBvaW50cz86IEV4Y2FsaWRyYXdGcmVlRHJhd0VsZW1lbnRbXCJwb2ludHNcIl07XG4gICAgc2ltdWxhdGVQcmVzc3VyZTogYm9vbGVhbjtcbiAgfSAmIEVsZW1lbnRDb25zdHJ1Y3Rvck9wdHMsXG4pOiBOb25EZWxldGVkPEV4Y2FsaWRyYXdGcmVlRHJhd0VsZW1lbnQ+ID0+IHtcbiAgcmV0dXJuIHtcbiAgICAuLi5fbmV3RWxlbWVudEJhc2U8RXhjYWxpZHJhd0ZyZWVEcmF3RWxlbWVudD4ob3B0cy50eXBlLCBvcHRzKSxcbiAgICBwb2ludHM6IG9wdHMucG9pbnRzIHx8IFtdLFxuICAgIHByZXNzdXJlczogW10sXG4gICAgc2ltdWxhdGVQcmVzc3VyZTogb3B0cy5zaW11bGF0ZVByZXNzdXJlLFxuICAgIGxhc3RDb21taXR0ZWRQb2ludDogbnVsbCxcbiAgfTtcbn07XG5cbmV4cG9ydCBjb25zdCBuZXdMaW5lYXJFbGVtZW50ID0gKFxuICBvcHRzOiB7XG4gICAgdHlwZTogRXhjYWxpZHJhd0xpbmVhckVsZW1lbnRbXCJ0eXBlXCJdO1xuICAgIHN0YXJ0QXJyb3doZWFkOiBBcnJvd2hlYWQgfCBudWxsO1xuICAgIGVuZEFycm93aGVhZDogQXJyb3doZWFkIHwgbnVsbDtcbiAgICBwb2ludHM/OiBFeGNhbGlkcmF3TGluZWFyRWxlbWVudFtcInBvaW50c1wiXTtcbiAgfSAmIEVsZW1lbnRDb25zdHJ1Y3Rvck9wdHMsXG4pOiBOb25EZWxldGVkPEV4Y2FsaWRyYXdMaW5lYXJFbGVtZW50PiA9PiB7XG4gIHJldHVybiB7XG4gICAgLi4uX25ld0VsZW1lbnRCYXNlPEV4Y2FsaWRyYXdMaW5lYXJFbGVtZW50PihvcHRzLnR5cGUsIG9wdHMpLFxuICAgIHBvaW50czogb3B0cy5wb2ludHMgfHwgW10sXG4gICAgbGFzdENvbW1pdHRlZFBvaW50OiBudWxsLFxuICAgIHN0YXJ0QmluZGluZzogbnVsbCxcbiAgICBlbmRCaW5kaW5nOiBudWxsLFxuICAgIHN0YXJ0QXJyb3doZWFkOiBvcHRzLnN0YXJ0QXJyb3doZWFkLFxuICAgIGVuZEFycm93aGVhZDogb3B0cy5lbmRBcnJvd2hlYWQsXG4gIH07XG59O1xuXG5leHBvcnQgY29uc3QgbmV3SW1hZ2VFbGVtZW50ID0gKFxuICBvcHRzOiB7XG4gICAgdHlwZTogRXhjYWxpZHJhd0ltYWdlRWxlbWVudFtcInR5cGVcIl07XG4gICAgc3RhdHVzPzogRXhjYWxpZHJhd0ltYWdlRWxlbWVudFtcInN0YXR1c1wiXTtcbiAgICBmaWxlSWQ/OiBFeGNhbGlkcmF3SW1hZ2VFbGVtZW50W1wiZmlsZUlkXCJdO1xuICAgIHNjYWxlPzogRXhjYWxpZHJhd0ltYWdlRWxlbWVudFtcInNjYWxlXCJdO1xuICB9ICYgRWxlbWVudENvbnN0cnVjdG9yT3B0cyxcbik6IE5vbkRlbGV0ZWQ8RXhjYWxpZHJhd0ltYWdlRWxlbWVudD4gPT4ge1xuICByZXR1cm4ge1xuICAgIC4uLl9uZXdFbGVtZW50QmFzZTxFeGNhbGlkcmF3SW1hZ2VFbGVtZW50PihcImltYWdlXCIsIG9wdHMpLFxuICAgIC8vIGluIHRoZSBmdXR1cmUgd2UnbGwgc3VwcG9ydCBjaGFuZ2luZyBzdHJva2UgY29sb3IgZm9yIHNvbWUgU1ZHIGVsZW1lbnRzLFxuICAgIC8vIGFuZCBgdHJhbnNwYXJlbnRgIHdpbGwgbGlrZWx5IG1lYW4gXCJ1c2Ugb3JpZ2luYWwgY29sb3JzIG9mIHRoZSBpbWFnZVwiXG4gICAgc3Ryb2tlQ29sb3I6IFwidHJhbnNwYXJlbnRcIixcbiAgICBzdGF0dXM6IG9wdHMuc3RhdHVzID8/IFwicGVuZGluZ1wiLFxuICAgIGZpbGVJZDogb3B0cy5maWxlSWQgPz8gbnVsbCxcbiAgICBzY2FsZTogb3B0cy5zY2FsZSA/PyBbMSwgMV0sXG4gIH07XG59O1xuXG4vLyBTaW1wbGlmaWVkIGRlZXAgY2xvbmUgZm9yIHRoZSBwdXJwb3NlIG9mIGNsb25pbmcgRXhjYWxpZHJhd0VsZW1lbnQuXG4vL1xuLy8gT25seSBjbG9uZXMgcGxhaW4gb2JqZWN0cyBhbmQgYXJyYXlzLiBEb2Vzbid0IGNsb25lIERhdGUsIFJlZ0V4cCwgTWFwLCBTZXQsXG4vLyBUeXBlZCBhcnJheXMgYW5kIG90aGVyIG5vbi1udWxsIG9iamVjdHMuXG4vL1xuLy8gQWRhcHRlZCBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9sdWtlZWQva2xvbmFcbi8vXG4vLyBUaGUgcmVhc29uIGZvciBgZGVlcENvcHlFbGVtZW50KClgIHdyYXBwZXIgaXMgdHlwZSBzYWZldHkgKG9ubHkgYWxsb3dcbi8vIHBhc3NpbmcgRXhjYWxpZHJhd0VsZW1lbnQgYXMgdGhlIHRvcC1sZXZlbCBhcmd1bWVudCkuXG5jb25zdCBfZGVlcENvcHlFbGVtZW50ID0gKHZhbDogYW55LCBkZXB0aDogbnVtYmVyID0gMCkgPT4ge1xuICAvLyBvbmx5IGNsb25lIG5vbi1wcmltaXRpdmVzXG4gIGlmICh2YWwgPT0gbnVsbCB8fCB0eXBlb2YgdmFsICE9PSBcIm9iamVjdFwiKSB7XG4gICAgcmV0dXJuIHZhbDtcbiAgfVxuXG4gIGNvbnN0IG9iamVjdFR5cGUgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodmFsKTtcblxuICBpZiAob2JqZWN0VHlwZSA9PT0gXCJbb2JqZWN0IE9iamVjdF1cIikge1xuICAgIGNvbnN0IHRtcCA9XG4gICAgICB0eXBlb2YgdmFsLmNvbnN0cnVjdG9yID09PSBcImZ1bmN0aW9uXCJcbiAgICAgICAgPyBPYmplY3QuY3JlYXRlKE9iamVjdC5nZXRQcm90b3R5cGVPZih2YWwpKVxuICAgICAgICA6IHt9O1xuICAgIGZvciAoY29uc3Qga2V5IGluIHZhbCkge1xuICAgICAgaWYgKHZhbC5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG4gICAgICAgIC8vIGRvbid0IGNvcHkgbm9uLXNlcmlhbGl6YWJsZSBvYmplY3RzIGxpa2UgdGhlc2UgY2FjaGVzLiBUaGV5J2xsIGJlXG4gICAgICAgIC8vIHBvcHVsYXRlZCB3aGVuIHRoZSBlbGVtZW50IGlzIHJlbmRlcmVkLlxuICAgICAgICBpZiAoZGVwdGggPT09IDAgJiYgKGtleSA9PT0gXCJzaGFwZVwiIHx8IGtleSA9PT0gXCJjYW52YXNcIikpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICB0bXBba2V5XSA9IF9kZWVwQ29weUVsZW1lbnQodmFsW2tleV0sIGRlcHRoICsgMSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0bXA7XG4gIH1cblxuICBpZiAoQXJyYXkuaXNBcnJheSh2YWwpKSB7XG4gICAgbGV0IGsgPSB2YWwubGVuZ3RoO1xuICAgIGNvbnN0IGFyciA9IG5ldyBBcnJheShrKTtcbiAgICB3aGlsZSAoay0tKSB7XG4gICAgICBhcnJba10gPSBfZGVlcENvcHlFbGVtZW50KHZhbFtrXSwgZGVwdGggKyAxKTtcbiAgICB9XG4gICAgcmV0dXJuIGFycjtcbiAgfVxuXG4gIC8vIHdlJ3JlIG5vdCBjbG9uaW5nIG5vbi1hcnJheSAmIG5vbi1wbGFpbi1vYmplY3Qgb2JqZWN0cyBiZWNhdXNlIHdlXG4gIC8vIGRvbid0IHN1cHBvcnQgdGhlbSBvbiBleGNhbGlkcmF3IGVsZW1lbnRzIHlldC4gSWYgd2UgZG8sIHdlIG5lZWQgdG8gbWFrZVxuICAvLyBzdXJlIHdlIHN0YXJ0IGNsb25pbmcgdGhlbSwgc28gbGV0J3Mgd2FybiBhYm91dCBpdC5cbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcImRldmVsb3BtZW50XCIpIHtcbiAgICBpZiAoXG4gICAgICBvYmplY3RUeXBlICE9PSBcIltvYmplY3QgT2JqZWN0XVwiICYmXG4gICAgICBvYmplY3RUeXBlICE9PSBcIltvYmplY3QgQXJyYXldXCIgJiZcbiAgICAgIG9iamVjdFR5cGUuc3RhcnRzV2l0aChcIltvYmplY3QgXCIpXG4gICAgKSB7XG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgIGBfZGVlcENsb25lRWxlbWVudDogdW5leHBlY3RlZCBvYmplY3QgdHlwZSAke29iamVjdFR5cGV9LiBUaGlzIHZhbHVlIHdpbGwgbm90IGJlIGNsb25lZCFgLFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdmFsO1xufTtcblxuLyoqXG4gKiBDbG9uZXMgRXhjYWxpZHJhd0VsZW1lbnQgZGF0YSBzdHJ1Y3R1cmUuIERvZXMgbm90IHJlZ2VuZXJhdGUgaWQsIG5vbmNlLCBvclxuICogYW55IHZhbHVlLiBUaGUgcHVycG9zZSBpcyB0byB0byBicmVhayBvYmplY3QgcmVmZXJlbmNlcyBmb3IgaW1tdXRhYmlsaXR5XG4gKiByZWFzb25zLCB3aGVuZXZlciB3ZSB3YW50IHRvIGtlZXAgdGhlIG9yaWdpbmFsIGVsZW1lbnQsIGJ1dCBlbnN1cmUgaXQncyBub3RcbiAqIG11dGF0ZWQuXG4gKlxuICogT25seSBjbG9uZXMgcGxhaW4gb2JqZWN0cyBhbmQgYXJyYXlzLiBEb2Vzbid0IGNsb25lIERhdGUsIFJlZ0V4cCwgTWFwLCBTZXQsXG4gKiBUeXBlZCBhcnJheXMgYW5kIG90aGVyIG5vbi1udWxsIG9iamVjdHMuXG4gKi9cbmV4cG9ydCBjb25zdCBkZWVwQ29weUVsZW1lbnQgPSA8VCBleHRlbmRzIEV4Y2FsaWRyYXdFbGVtZW50PihcbiAgdmFsOiBULFxuKTogTXV0YWJsZTxUPiA9PiB7XG4gIHJldHVybiBfZGVlcENvcHlFbGVtZW50KHZhbCk7XG59O1xuXG4vKipcbiAqIHV0aWxpdHkgd3JhcHBlciB0byBnZW5lcmF0ZSBuZXcgaWQuIEluIHRlc3QgZW52IGl0IHJldXNlcyB0aGUgb2xkICsgcG9zdGZpeFxuICogZm9yIHRlc3QgYXNzZXJ0aW9ucy5cbiAqL1xuY29uc3QgcmVnZW5lcmF0ZUlkID0gKFxuICAvKiogc3VwcGx5IG51bGwgaWYgbm8gcHJldmlvdXMgaWQgZXhpc3RzICovXG4gIHByZXZpb3VzSWQ6IHN0cmluZyB8IG51bGwsXG4pID0+IHtcbiAgaWYgKGlzVGVzdEVudigpICYmIHByZXZpb3VzSWQpIHtcbiAgICBsZXQgbmV4dElkID0gYCR7cHJldmlvdXNJZH1fY29weWA7XG4gICAgLy8gYHdpbmRvdy5oYCBtYXkgbm90IGJlIGRlZmluZWQgaW4gc29tZSB1bml0IHRlc3RzXG4gICAgaWYgKFxuICAgICAgd2luZG93Lmg/LmFwcFxuICAgICAgICA/LmdldFNjZW5lRWxlbWVudHNJbmNsdWRpbmdEZWxldGVkKClcbiAgICAgICAgLmZpbmQoKGVsKSA9PiBlbC5pZCA9PT0gbmV4dElkKVxuICAgICkge1xuICAgICAgbmV4dElkICs9IFwiX2NvcHlcIjtcbiAgICB9XG4gICAgcmV0dXJuIG5leHRJZDtcbiAgfVxuICByZXR1cm4gcmFuZG9tSWQoKTtcbn07XG5cbi8qKlxuICogRHVwbGljYXRlIGFuIGVsZW1lbnQsIG9mdGVuIHVzZWQgaW4gdGhlIGFsdC1kcmFnIG9wZXJhdGlvbi5cbiAqIE5vdGUgdGhhdCB0aGlzIG1ldGhvZCBoYXMgZ290dGVuIGEgYml0IGNvbXBsaWNhdGVkIHNpbmNlIHRoZVxuICogaW50cm9kdWN0aW9uIG9mIGdydW9waW5nL3VuZ3JvdXBpbmcgZWxlbWVudHMuXG4gKiBAcGFyYW0gZWRpdGluZ0dyb3VwSWQgVGhlIGN1cnJlbnQgZ3JvdXAgYmVpbmcgZWRpdGVkLiBUaGUgbmV3XG4gKiAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudCB3aWxsIGluaGVyaXQgdGhpcyBncm91cCBhbmQgaXRzXG4gKiAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50cy5cbiAqIEBwYXJhbSBncm91cElkTWFwRm9yT3BlcmF0aW9uIEEgTWFwIHRoYXQgbWFwcyBvbGQgZ3JvdXAgSURzIHRvXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdXBsaWNhdGVkIG9uZXMuIElmIHlvdSBhcmUgZHVwbGljYXRpbmdcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG11bHRpcGxlIGVsZW1lbnRzIGF0IG9uY2UsIHNoYXJlIHRoaXMgbWFwXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbW9uZ3N0IGFsbCBvZiB0aGVtXG4gKiBAcGFyYW0gZWxlbWVudCBFbGVtZW50IHRvIGR1cGxpY2F0ZVxuICogQHBhcmFtIG92ZXJyaWRlcyBBbnkgZWxlbWVudCBwcm9wZXJ0aWVzIHRvIG92ZXJyaWRlXG4gKi9cbmV4cG9ydCBjb25zdCBkdXBsaWNhdGVFbGVtZW50ID0gPFRFbGVtZW50IGV4dGVuZHMgRXhjYWxpZHJhd0VsZW1lbnQ+KFxuICBlZGl0aW5nR3JvdXBJZDogQXBwU3RhdGVbXCJlZGl0aW5nR3JvdXBJZFwiXSxcbiAgZ3JvdXBJZE1hcEZvck9wZXJhdGlvbjogTWFwPEdyb3VwSWQsIEdyb3VwSWQ+LFxuICBlbGVtZW50OiBURWxlbWVudCxcbiAgb3ZlcnJpZGVzPzogUGFydGlhbDxURWxlbWVudD4sXG4pOiBSZWFkb25seTxURWxlbWVudD4gPT4ge1xuICBsZXQgY29weSA9IGRlZXBDb3B5RWxlbWVudChlbGVtZW50KTtcblxuICBjb3B5LmlkID0gcmVnZW5lcmF0ZUlkKGNvcHkuaWQpO1xuICBjb3B5LmJvdW5kRWxlbWVudHMgPSBudWxsO1xuICBjb3B5LnVwZGF0ZWQgPSBnZXRVcGRhdGVkVGltZXN0YW1wKCk7XG4gIGNvcHkuc2VlZCA9IHJhbmRvbUludGVnZXIoKTtcbiAgY29weS5ncm91cElkcyA9IGdldE5ld0dyb3VwSWRzRm9yRHVwbGljYXRpb24oXG4gICAgY29weS5ncm91cElkcyxcbiAgICBlZGl0aW5nR3JvdXBJZCxcbiAgICAoZ3JvdXBJZCkgPT4ge1xuICAgICAgaWYgKCFncm91cElkTWFwRm9yT3BlcmF0aW9uLmhhcyhncm91cElkKSkge1xuICAgICAgICBncm91cElkTWFwRm9yT3BlcmF0aW9uLnNldChncm91cElkLCByZWdlbmVyYXRlSWQoZ3JvdXBJZCkpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGdyb3VwSWRNYXBGb3JPcGVyYXRpb24uZ2V0KGdyb3VwSWQpITtcbiAgICB9LFxuICApO1xuICBpZiAob3ZlcnJpZGVzKSB7XG4gICAgY29weSA9IE9iamVjdC5hc3NpZ24oY29weSwgb3ZlcnJpZGVzKTtcbiAgfVxuICByZXR1cm4gY29weTtcbn07XG5cbi8qKlxuICogQ2xvbmVzIGVsZW1lbnRzLCByZWdlbmVyYXRpbmcgdGhlaXIgaWRzIChpbmNsdWRpbmcgYmluZGluZ3MpIGFuZCBncm91cCBpZHMuXG4gKlxuICogSWYgYmluZGluZ3MgZG9uJ3QgZXhpc3QgaW4gdGhlIGVsZW1lbnRzIGFycmF5LCB0aGV5IGFyZSByZW1vdmVkLiBUaGVyZWZvcmUsXG4gKiBpdCdzIGFkdmlzZWQgdG8gc3VwcGx5IHRoZSB3aG9sZSBlbGVtZW50cyBhcnJheSwgb3Igc2V0cyBvZiBlbGVtZW50cyB0aGF0XG4gKiBhcmUgZW5jYXBzdWxhdGVkIChzdWNoIGFzIGxpYnJhcnkgaXRlbXMpLCBpZiB0aGUgcHVycG9zZSBpcyB0byByZXRhaW5cbiAqIGJpbmRpbmdzIHRvIHRoZSBjbG9uZWQgZWxlbWVudHMgaW50YWN0LlxuICpcbiAqIE5PVEUgYnkgZGVmYXVsdCBkb2VzIG5vdCByYW5kb21pemUgb3IgcmVnZW5lcmF0ZSBhbnl0aGluZyBleGNlcHQgdGhlIGlkLlxuICovXG5leHBvcnQgY29uc3QgZHVwbGljYXRlRWxlbWVudHMgPSAoXG4gIGVsZW1lbnRzOiByZWFkb25seSBFeGNhbGlkcmF3RWxlbWVudFtdLFxuICBvcHRzPzoge1xuICAgIC8qKiBOT1RFIGFsc28gdXBkYXRlcyB2ZXJzaW9uIGZsYWdzIGFuZCBgdXBkYXRlZGAgKi9cbiAgICByYW5kb21pemVTZWVkOiBib29sZWFuO1xuICB9LFxuKSA9PiB7XG4gIGNvbnN0IGNsb25lZEVsZW1lbnRzOiBFeGNhbGlkcmF3RWxlbWVudFtdID0gW107XG5cbiAgY29uc3Qgb3JpZ0VsZW1lbnRzTWFwID0gYXJyYXlUb01hcChlbGVtZW50cyk7XG5cbiAgLy8gdXNlZCBmb3IgZm9yIG1pZ3JhdGluZyBvbGQgaWRzIHRvIG5ldyBpZHNcbiAgY29uc3QgZWxlbWVudE5ld0lkc01hcCA9IG5ldyBNYXA8XG4gICAgLyogb3JpZyAqLyBFeGNhbGlkcmF3RWxlbWVudFtcImlkXCJdLFxuICAgIC8qIG5ldyAqLyBFeGNhbGlkcmF3RWxlbWVudFtcImlkXCJdXG4gID4oKTtcblxuICBjb25zdCBtYXliZUdldE5ld0lkID0gKGlkOiBFeGNhbGlkcmF3RWxlbWVudFtcImlkXCJdKSA9PiB7XG4gICAgLy8gaWYgd2UndmUgYWxyZWFkeSBtaWdyYXRlZCB0aGUgZWxlbWVudCBpZCwgcmV0dXJuIHRoZSBuZXcgb25lIGRpcmVjdGx5XG4gICAgaWYgKGVsZW1lbnROZXdJZHNNYXAuaGFzKGlkKSkge1xuICAgICAgcmV0dXJuIGVsZW1lbnROZXdJZHNNYXAuZ2V0KGlkKSE7XG4gICAgfVxuICAgIC8vIGlmIHdlIGhhdmVuJ3QgbWlncmF0ZWQgdGhlIGVsZW1lbnQgaWQsIGJ1dCBhbiBvbGQgZWxlbWVudCB3aXRoIHRoZSBzYW1lXG4gICAgLy8gaWQgZXhpc3RzLCBnZW5lcmF0ZSBhIG5ldyBpZCBmb3IgaXQgYW5kIHJldHVybiBpdFxuICAgIGlmIChvcmlnRWxlbWVudHNNYXAuaGFzKGlkKSkge1xuICAgICAgY29uc3QgbmV3SWQgPSByZWdlbmVyYXRlSWQoaWQpO1xuICAgICAgZWxlbWVudE5ld0lkc01hcC5zZXQoaWQsIG5ld0lkKTtcbiAgICAgIHJldHVybiBuZXdJZDtcbiAgICB9XG4gICAgLy8gaWYgb2xkIGVsZW1lbnQgZG9lc24ndCBleGlzdCwgcmV0dXJuIG51bGwgdG8gbWFyayBpdCBmb3IgcmVtb3ZhbFxuICAgIHJldHVybiBudWxsO1xuICB9O1xuXG4gIGNvbnN0IGdyb3VwTmV3SWRzTWFwID0gbmV3IE1hcDwvKiBvcmlnICovIEdyb3VwSWQsIC8qIG5ldyAqLyBHcm91cElkPigpO1xuXG4gIGZvciAoY29uc3QgZWxlbWVudCBvZiBlbGVtZW50cykge1xuICAgIGNvbnN0IGNsb25lZEVsZW1lbnQ6IE11dGFibGU8RXhjYWxpZHJhd0VsZW1lbnQ+ID0gX2RlZXBDb3B5RWxlbWVudChlbGVtZW50KTtcblxuICAgIGNsb25lZEVsZW1lbnQuaWQgPSBtYXliZUdldE5ld0lkKGVsZW1lbnQuaWQpITtcblxuICAgIGlmIChvcHRzPy5yYW5kb21pemVTZWVkKSB7XG4gICAgICBjbG9uZWRFbGVtZW50LnNlZWQgPSByYW5kb21JbnRlZ2VyKCk7XG4gICAgICBidW1wVmVyc2lvbihjbG9uZWRFbGVtZW50KTtcbiAgICB9XG5cbiAgICBpZiAoY2xvbmVkRWxlbWVudC5ncm91cElkcykge1xuICAgICAgY2xvbmVkRWxlbWVudC5ncm91cElkcyA9IGNsb25lZEVsZW1lbnQuZ3JvdXBJZHMubWFwKChncm91cElkKSA9PiB7XG4gICAgICAgIGlmICghZ3JvdXBOZXdJZHNNYXAuaGFzKGdyb3VwSWQpKSB7XG4gICAgICAgICAgZ3JvdXBOZXdJZHNNYXAuc2V0KGdyb3VwSWQsIHJlZ2VuZXJhdGVJZChncm91cElkKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGdyb3VwTmV3SWRzTWFwLmdldChncm91cElkKSE7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAoXCJjb250YWluZXJJZFwiIGluIGNsb25lZEVsZW1lbnQgJiYgY2xvbmVkRWxlbWVudC5jb250YWluZXJJZCkge1xuICAgICAgY29uc3QgbmV3Q29udGFpbmVySWQgPSBtYXliZUdldE5ld0lkKGNsb25lZEVsZW1lbnQuY29udGFpbmVySWQpO1xuICAgICAgY2xvbmVkRWxlbWVudC5jb250YWluZXJJZCA9IG5ld0NvbnRhaW5lcklkO1xuICAgIH1cblxuICAgIGlmIChcImJvdW5kRWxlbWVudHNcIiBpbiBjbG9uZWRFbGVtZW50ICYmIGNsb25lZEVsZW1lbnQuYm91bmRFbGVtZW50cykge1xuICAgICAgY2xvbmVkRWxlbWVudC5ib3VuZEVsZW1lbnRzID0gY2xvbmVkRWxlbWVudC5ib3VuZEVsZW1lbnRzLnJlZHVjZShcbiAgICAgICAgKFxuICAgICAgICAgIGFjYzogTXV0YWJsZTxOb25OdWxsYWJsZTxFeGNhbGlkcmF3RWxlbWVudFtcImJvdW5kRWxlbWVudHNcIl0+PixcbiAgICAgICAgICBiaW5kaW5nLFxuICAgICAgICApID0+IHtcbiAgICAgICAgICBjb25zdCBuZXdCaW5kaW5nSWQgPSBtYXliZUdldE5ld0lkKGJpbmRpbmcuaWQpO1xuICAgICAgICAgIGlmIChuZXdCaW5kaW5nSWQpIHtcbiAgICAgICAgICAgIGFjYy5wdXNoKHsgLi4uYmluZGluZywgaWQ6IG5ld0JpbmRpbmdJZCB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGFjYztcbiAgICAgICAgfSxcbiAgICAgICAgW10sXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmIChcImVuZEJpbmRpbmdcIiBpbiBjbG9uZWRFbGVtZW50ICYmIGNsb25lZEVsZW1lbnQuZW5kQmluZGluZykge1xuICAgICAgY29uc3QgbmV3RW5kQmluZGluZ0lkID0gbWF5YmVHZXROZXdJZChjbG9uZWRFbGVtZW50LmVuZEJpbmRpbmcuZWxlbWVudElkKTtcbiAgICAgIGNsb25lZEVsZW1lbnQuZW5kQmluZGluZyA9IG5ld0VuZEJpbmRpbmdJZFxuICAgICAgICA/IHtcbiAgICAgICAgICAgIC4uLmNsb25lZEVsZW1lbnQuZW5kQmluZGluZyxcbiAgICAgICAgICAgIGVsZW1lbnRJZDogbmV3RW5kQmluZGluZ0lkLFxuICAgICAgICAgIH1cbiAgICAgICAgOiBudWxsO1xuICAgIH1cbiAgICBpZiAoXCJzdGFydEJpbmRpbmdcIiBpbiBjbG9uZWRFbGVtZW50ICYmIGNsb25lZEVsZW1lbnQuc3RhcnRCaW5kaW5nKSB7XG4gICAgICBjb25zdCBuZXdFbmRCaW5kaW5nSWQgPSBtYXliZUdldE5ld0lkKFxuICAgICAgICBjbG9uZWRFbGVtZW50LnN0YXJ0QmluZGluZy5lbGVtZW50SWQsXG4gICAgICApO1xuICAgICAgY2xvbmVkRWxlbWVudC5zdGFydEJpbmRpbmcgPSBuZXdFbmRCaW5kaW5nSWRcbiAgICAgICAgPyB7XG4gICAgICAgICAgICAuLi5jbG9uZWRFbGVtZW50LnN0YXJ0QmluZGluZyxcbiAgICAgICAgICAgIGVsZW1lbnRJZDogbmV3RW5kQmluZGluZ0lkLFxuICAgICAgICAgIH1cbiAgICAgICAgOiBudWxsO1xuICAgIH1cblxuICAgIGNsb25lZEVsZW1lbnRzLnB1c2goY2xvbmVkRWxlbWVudCk7XG4gIH1cblxuICByZXR1cm4gY2xvbmVkRWxlbWVudHM7XG59O1xuXG5leHBvcnQgY29uc3QgY29udmVydFRvRXhjYWxpZHJhd0VsZW1lbnRzID0gKFxuICBlbGVtZW50czogSW1wb3J0ZWREYXRhU3RhdGVbXCJlbGVtZW50c1wiXSxcbikgPT4ge1xuICBjb25zdCByZXM6IEV4Y2FsaWRyYXdFbGVtZW50W10gPSBbXTtcbiAgaWYgKCFlbGVtZW50cykge1xuICAgIHJldHVybiBbXTtcbiAgfVxuICBjb25zb2xlLmxvZyhlbGVtZW50cywgXCJlbGUgIFwiKTtcbiAgZWxlbWVudHMuZm9yRWFjaCgoZWxlbWVudCkgPT4ge1xuICAgIGlmICghZWxlbWVudCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoXG4gICAgICBpc1ZhbGlkVGV4dENvbnRhaW5lcihlbGVtZW50KSAmJlxuICAgICAgZWxlbWVudD8ubGFiZWw/LnRleHQgJiZcbiAgICAgIChlbGVtZW50LnR5cGUgPT09IFwicmVjdGFuZ2xlXCIgfHxcbiAgICAgICAgZWxlbWVudC50eXBlID09PSBcImVsbGlwc2VcIiB8fFxuICAgICAgICBlbGVtZW50LnR5cGUgPT09IFwiZGlhbW9uZFwiKVxuICAgICkge1xuICAgICAgY29uc3QgZWxlbWVudHMgPSBiaW5kVGV4dFRvQ29udGFpbmVyKGVsZW1lbnQsIGVsZW1lbnQubGFiZWwpO1xuICAgICAgcmVzLnB1c2goLi4uZWxlbWVudHMpO1xuICAgIH0gZWxzZSB7XG4gICAgICBsZXQgZXhjYWxpZHJhd0VsZW1lbnQ7XG4gICAgICBpZiAoZWxlbWVudC50eXBlID09PSBcInRleHRcIikge1xuICAgICAgICAvL0B0cy1pZ25vcmVcbiAgICAgICAgZXhjYWxpZHJhd0VsZW1lbnQgPSBuZXdUZXh0RWxlbWVudCh7XG4gICAgICAgICAgLy9AdHMtaWdub3JlXG4gICAgICAgICAgeDogMCxcbiAgICAgICAgICAvL0B0cy1pZ25vcmVcbiAgICAgICAgICB5OiAwLFxuICAgICAgICAgIC4uLmVsZW1lbnQsXG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy9AdHMtaWdub3JlXG4gICAgICAgIGV4Y2FsaWRyYXdFbGVtZW50ID0gbmV3RWxlbWVudCh7XG4gICAgICAgICAgeDogMCxcbiAgICAgICAgICB5OiAwLFxuXG4gICAgICAgICAgLi4uZWxlbWVudCxcbiAgICAgICAgICB3aWR0aDpcbiAgICAgICAgICAgIC8vQHRzLWlnbm9yZVxuICAgICAgICAgICAgZWxlbWVudD8ud2lkdGggfHxcbiAgICAgICAgICAgIChFTEVNRU5UU19TVVBQT1JUSU5HX1BST0dSQU1NQVRJQ19BUEkuaW5jbHVkZXMoZWxlbWVudC50eXBlKVxuICAgICAgICAgICAgICA/IDEwMFxuICAgICAgICAgICAgICA6IDApLFxuICAgICAgICAgIGhlaWdodDpcbiAgICAgICAgICAgIC8vQHRzLWlnbm9yZVxuICAgICAgICAgICAgZWxlbWVudD8uaGVpZ2h0IHx8XG4gICAgICAgICAgICAoRUxFTUVOVFNfU1VQUE9SVElOR19QUk9HUkFNTUFUSUNfQVBJLmluY2x1ZGVzKGVsZW1lbnQudHlwZSlcbiAgICAgICAgICAgICAgPyAxMDBcbiAgICAgICAgICAgICAgOiAwKSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICAvL0B0cy1pZ25vcmVcblxuICAgICAgcmVzLnB1c2goZXhjYWxpZHJhd0VsZW1lbnQpO1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiByZXM7XG59O1xuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///../../element/newElement.ts\n");
|
|
3695
|
+
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"convertToExcalidrawElements\": () => (/* binding */ convertToExcalidrawElements),\n/* harmony export */ \"deepCopyElement\": () => (/* binding */ deepCopyElement),\n/* harmony export */ \"duplicateElement\": () => (/* binding */ duplicateElement),\n/* harmony export */ \"duplicateElements\": () => (/* binding */ duplicateElements),\n/* harmony export */ \"newElement\": () => (/* binding */ newElement),\n/* harmony export */ \"newFreeDrawElement\": () => (/* binding */ newFreeDrawElement),\n/* harmony export */ \"newImageElement\": () => (/* binding */ newImageElement),\n/* harmony export */ \"newLinearElement\": () => (/* binding */ newLinearElement),\n/* harmony export */ \"newTextElement\": () => (/* binding */ newTextElement),\n/* harmony export */ \"refreshTextDimensions\": () => (/* binding */ refreshTextDimensions),\n/* harmony export */ \"updateTextElement\": () => (/* binding */ updateTextElement)\n/* harmony export */ });\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../utils */ \"../../utils.ts\");\n/* harmony import */ var _random__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../random */ \"../../random.ts\");\n/* harmony import */ var _mutateElement__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./mutateElement */ \"../../element/mutateElement.ts\");\n/* harmony import */ var _groups__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../groups */ \"../../groups.ts\");\n/* harmony import */ var ___WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! . */ \"../../element/index.ts\");\n/* harmony import */ var _math__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../math */ \"../../math.ts\");\n/* harmony import */ var _bounds__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./bounds */ \"../../element/bounds.ts\");\n/* harmony import */ var _textElement__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./textElement */ \"../../element/textElement.ts\");\n/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../constants */ \"../../constants.ts\");\n/* harmony import */ var _typeChecks__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./typeChecks */ \"../../element/typeChecks.ts\");\nvar __rest = (undefined && undefined.__rest) || function (s, e) {\n var t = {};\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\n t[p] = s[p];\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\n t[p[i]] = s[p[i]];\n }\n return t;\n};\n\n\n\n\n\n\n\n\n\n\nconst ELEMENTS_SUPPORTING_PROGRAMMATIC_API = [\n \"rectangle\",\n \"ellipse\",\n \"diamond\",\n \"text\",\n \"arrow\",\n \"line\",\n];\nconst _newElementBase = (type, _a) => {\n var _b, _c;\n var { x, y, strokeColor = _constants__WEBPACK_IMPORTED_MODULE_8__.DEFAULT_ELEMENT_PROPS.strokeColor, backgroundColor = _constants__WEBPACK_IMPORTED_MODULE_8__.DEFAULT_ELEMENT_PROPS.backgroundColor, fillStyle = _constants__WEBPACK_IMPORTED_MODULE_8__.DEFAULT_ELEMENT_PROPS.fillStyle, strokeWidth = _constants__WEBPACK_IMPORTED_MODULE_8__.DEFAULT_ELEMENT_PROPS.strokeWidth, strokeStyle = _constants__WEBPACK_IMPORTED_MODULE_8__.DEFAULT_ELEMENT_PROPS.strokeStyle, roughness = _constants__WEBPACK_IMPORTED_MODULE_8__.DEFAULT_ELEMENT_PROPS.roughness, opacity = _constants__WEBPACK_IMPORTED_MODULE_8__.DEFAULT_ELEMENT_PROPS.opacity, width = 0, height = 0, angle = 0, groupIds = [], roundness = null, boundElements = null, link = null, locked = _constants__WEBPACK_IMPORTED_MODULE_8__.DEFAULT_ELEMENT_PROPS.locked } = _a, rest = __rest(_a, [\"x\", \"y\", \"strokeColor\", \"backgroundColor\", \"fillStyle\", \"strokeWidth\", \"strokeStyle\", \"roughness\", \"opacity\", \"width\", \"height\", \"angle\", \"groupIds\", \"roundness\", \"boundElements\", \"link\", \"locked\"]);\n console.log(\"width\", width);\n // assign type to guard against excess properties\n const element = {\n id: rest.id || (0,_random__WEBPACK_IMPORTED_MODULE_1__.randomId)(),\n type,\n x,\n y,\n width,\n height,\n angle,\n strokeColor,\n backgroundColor,\n fillStyle,\n strokeWidth,\n strokeStyle,\n roughness,\n opacity,\n groupIds,\n roundness,\n seed: (_b = rest.seed) !== null && _b !== void 0 ? _b : (0,_random__WEBPACK_IMPORTED_MODULE_1__.randomInteger)(),\n version: rest.version || 1,\n versionNonce: (_c = rest.versionNonce) !== null && _c !== void 0 ? _c : 0,\n isDeleted: false,\n boundElements,\n updated: (0,_utils__WEBPACK_IMPORTED_MODULE_0__.getUpdatedTimestamp)(),\n link,\n locked,\n };\n return element;\n};\nconst newElement = (opts) => _newElementBase(opts.type, opts);\n/** computes element x/y offset based on textAlign/verticalAlign */\nconst getTextElementPositionOffsets = (opts, metrics) => {\n return {\n x: opts.textAlign === \"center\"\n ? metrics.width / 2\n : opts.textAlign === \"right\"\n ? metrics.width\n : 0,\n y: opts.verticalAlign === \"middle\" ? metrics.height / 2 : 0,\n };\n};\nconst newTextElement = (opts) => {\n const fontFamily = opts.fontFamily || _constants__WEBPACK_IMPORTED_MODULE_8__.DEFAULT_FONT_FAMILY;\n const fontSize = opts.fontSize || _constants__WEBPACK_IMPORTED_MODULE_8__.DEFAULT_FONT_SIZE;\n const lineHeight = opts.lineHeight || (0,_textElement__WEBPACK_IMPORTED_MODULE_7__.getDefaultLineHeight)(fontFamily);\n const text = (0,_textElement__WEBPACK_IMPORTED_MODULE_7__.normalizeText)(opts.text);\n const metrics = (0,_textElement__WEBPACK_IMPORTED_MODULE_7__.measureText)(text, (0,_utils__WEBPACK_IMPORTED_MODULE_0__.getFontString)({ fontFamily, fontSize }), lineHeight);\n const textAlign = opts.textAlign || _constants__WEBPACK_IMPORTED_MODULE_8__.DEFAULT_TEXT_ALIGN;\n const verticalAlign = opts.verticalAlign || _constants__WEBPACK_IMPORTED_MODULE_8__.DEFAULT_VERTICAL_ALIGN;\n const offsets = getTextElementPositionOffsets({ textAlign, verticalAlign }, metrics);\n const textElement = (0,_mutateElement__WEBPACK_IMPORTED_MODULE_2__.newElementWith)(Object.assign(Object.assign({}, _newElementBase(\"text\", opts)), { text,\n fontSize,\n fontFamily,\n textAlign,\n verticalAlign, x: opts.x - offsets.x, y: opts.y - offsets.y, width: metrics.width, height: metrics.height, baseline: metrics.baseline, containerId: opts.containerId || null, originalText: text, lineHeight }), {});\n return textElement;\n};\nconst getAdjustedDimensions = (element, nextText) => {\n const container = (0,_textElement__WEBPACK_IMPORTED_MODULE_7__.getContainerElement)(element);\n const { width: nextWidth, height: nextHeight, baseline: nextBaseline, } = (0,_textElement__WEBPACK_IMPORTED_MODULE_7__.measureText)(nextText, (0,_utils__WEBPACK_IMPORTED_MODULE_0__.getFontString)(element), element.lineHeight);\n const { textAlign, verticalAlign } = element;\n let x;\n let y;\n if (textAlign === \"center\" &&\n verticalAlign === _constants__WEBPACK_IMPORTED_MODULE_8__.VERTICAL_ALIGN.MIDDLE &&\n !element.containerId) {\n const prevMetrics = (0,_textElement__WEBPACK_IMPORTED_MODULE_7__.measureText)(element.text, (0,_utils__WEBPACK_IMPORTED_MODULE_0__.getFontString)(element), element.lineHeight);\n const offsets = getTextElementPositionOffsets(element, {\n width: nextWidth - prevMetrics.width,\n height: nextHeight - prevMetrics.height,\n });\n x = element.x - offsets.x;\n y = element.y - offsets.y;\n }\n else {\n const [x1, y1, x2, y2] = (0,___WEBPACK_IMPORTED_MODULE_4__.getElementAbsoluteCoords)(element);\n const [nextX1, nextY1, nextX2, nextY2] = (0,_bounds__WEBPACK_IMPORTED_MODULE_6__.getResizedElementAbsoluteCoords)(element, nextWidth, nextHeight, false);\n const deltaX1 = (x1 - nextX1) / 2;\n const deltaY1 = (y1 - nextY1) / 2;\n const deltaX2 = (x2 - nextX2) / 2;\n const deltaY2 = (y2 - nextY2) / 2;\n [x, y] = (0,_math__WEBPACK_IMPORTED_MODULE_5__.adjustXYWithRotation)({\n s: true,\n e: textAlign === \"center\" || textAlign === \"left\",\n w: textAlign === \"center\" || textAlign === \"right\",\n }, element.x, element.y, element.angle, deltaX1, deltaY1, deltaX2, deltaY2);\n }\n // make sure container dimensions are set properly when\n // text editor overflows beyond viewport dimensions\n if (container) {\n const boundTextElementPadding = (0,_textElement__WEBPACK_IMPORTED_MODULE_7__.getBoundTextElementOffset)(element);\n const containerDims = (0,_textElement__WEBPACK_IMPORTED_MODULE_7__.getContainerDims)(container);\n let height = containerDims.height;\n let width = containerDims.width;\n if (nextHeight > height - boundTextElementPadding * 2) {\n height = nextHeight + boundTextElementPadding * 2;\n }\n if (nextWidth > width - boundTextElementPadding * 2) {\n width = nextWidth + boundTextElementPadding * 2;\n }\n if (!(0,_typeChecks__WEBPACK_IMPORTED_MODULE_9__.isArrowElement)(container) &&\n (height !== containerDims.height || width !== containerDims.width)) {\n (0,_mutateElement__WEBPACK_IMPORTED_MODULE_2__.mutateElement)(container, { height, width });\n }\n }\n return {\n width: nextWidth,\n height: nextHeight,\n baseline: nextBaseline,\n x: Number.isFinite(x) ? x : element.x,\n y: Number.isFinite(y) ? y : element.y,\n };\n};\nconst refreshTextDimensions = (textElement, text = textElement.text) => {\n if (textElement.isDeleted) {\n return;\n }\n const container = (0,_textElement__WEBPACK_IMPORTED_MODULE_7__.getContainerElement)(textElement);\n if (container) {\n text = (0,_textElement__WEBPACK_IMPORTED_MODULE_7__.wrapText)(text, (0,_utils__WEBPACK_IMPORTED_MODULE_0__.getFontString)(textElement), (0,_textElement__WEBPACK_IMPORTED_MODULE_7__.getBoundTextMaxWidth)(container));\n }\n const dimensions = getAdjustedDimensions(textElement, text);\n return Object.assign({ text }, dimensions);\n};\nconst updateTextElement = (textElement, { text, isDeleted, originalText, }) => {\n return (0,_mutateElement__WEBPACK_IMPORTED_MODULE_2__.newElementWith)(textElement, Object.assign({ originalText, isDeleted: isDeleted !== null && isDeleted !== void 0 ? isDeleted : textElement.isDeleted }, refreshTextDimensions(textElement, originalText)));\n};\nconst newFreeDrawElement = (opts) => {\n return Object.assign(Object.assign({}, _newElementBase(opts.type, opts)), { points: opts.points || [], pressures: [], simulatePressure: opts.simulatePressure, lastCommittedPoint: null });\n};\nconst newLinearElement = (opts) => {\n return Object.assign(Object.assign({}, _newElementBase(opts.type, opts)), { points: opts.points || [], lastCommittedPoint: null, startBinding: null, endBinding: null, startArrowhead: opts.startArrowhead || null, endArrowhead: opts.endArrowhead || null });\n};\nconst newImageElement = (opts) => {\n var _a, _b, _c;\n return Object.assign(Object.assign({}, _newElementBase(\"image\", opts)), { \n // in the future we'll support changing stroke color for some SVG elements,\n // and `transparent` will likely mean \"use original colors of the image\"\n strokeColor: \"transparent\", status: (_a = opts.status) !== null && _a !== void 0 ? _a : \"pending\", fileId: (_b = opts.fileId) !== null && _b !== void 0 ? _b : null, scale: (_c = opts.scale) !== null && _c !== void 0 ? _c : [1, 1] });\n};\n// Simplified deep clone for the purpose of cloning ExcalidrawElement.\n//\n// Only clones plain objects and arrays. Doesn't clone Date, RegExp, Map, Set,\n// Typed arrays and other non-null objects.\n//\n// Adapted from https://github.com/lukeed/klona\n//\n// The reason for `deepCopyElement()` wrapper is type safety (only allow\n// passing ExcalidrawElement as the top-level argument).\nconst _deepCopyElement = (val, depth = 0) => {\n // only clone non-primitives\n if (val == null || typeof val !== \"object\") {\n return val;\n }\n const objectType = Object.prototype.toString.call(val);\n if (objectType === \"[object Object]\") {\n const tmp = typeof val.constructor === \"function\"\n ? Object.create(Object.getPrototypeOf(val))\n : {};\n for (const key in val) {\n if (val.hasOwnProperty(key)) {\n // don't copy non-serializable objects like these caches. They'll be\n // populated when the element is rendered.\n if (depth === 0 && (key === \"shape\" || key === \"canvas\")) {\n continue;\n }\n tmp[key] = _deepCopyElement(val[key], depth + 1);\n }\n }\n return tmp;\n }\n if (Array.isArray(val)) {\n let k = val.length;\n const arr = new Array(k);\n while (k--) {\n arr[k] = _deepCopyElement(val[k], depth + 1);\n }\n return arr;\n }\n // we're not cloning non-array & non-plain-object objects because we\n // don't support them on excalidraw elements yet. If we do, we need to make\n // sure we start cloning them, so let's warn about it.\n if (true) {\n if (objectType !== \"[object Object]\" &&\n objectType !== \"[object Array]\" &&\n objectType.startsWith(\"[object \")) {\n console.warn(`_deepCloneElement: unexpected object type ${objectType}. This value will not be cloned!`);\n }\n }\n return val;\n};\n/**\n * Clones ExcalidrawElement data structure. Does not regenerate id, nonce, or\n * any value. The purpose is to to break object references for immutability\n * reasons, whenever we want to keep the original element, but ensure it's not\n * mutated.\n *\n * Only clones plain objects and arrays. Doesn't clone Date, RegExp, Map, Set,\n * Typed arrays and other non-null objects.\n */\nconst deepCopyElement = (val) => {\n return _deepCopyElement(val);\n};\n/**\n * utility wrapper to generate new id. In test env it reuses the old + postfix\n * for test assertions.\n */\nconst regenerateId = (\n/** supply null if no previous id exists */\npreviousId) => {\n var _a, _b;\n if ((0,_utils__WEBPACK_IMPORTED_MODULE_0__.isTestEnv)() && previousId) {\n let nextId = `${previousId}_copy`;\n // `window.h` may not be defined in some unit tests\n if ((_b = (_a = window.h) === null || _a === void 0 ? void 0 : _a.app) === null || _b === void 0 ? void 0 : _b.getSceneElementsIncludingDeleted().find((el) => el.id === nextId)) {\n nextId += \"_copy\";\n }\n return nextId;\n }\n return (0,_random__WEBPACK_IMPORTED_MODULE_1__.randomId)();\n};\n/**\n * Duplicate an element, often used in the alt-drag operation.\n * Note that this method has gotten a bit complicated since the\n * introduction of gruoping/ungrouping elements.\n * @param editingGroupId The current group being edited. The new\n * element will inherit this group and its\n * parents.\n * @param groupIdMapForOperation A Map that maps old group IDs to\n * duplicated ones. If you are duplicating\n * multiple elements at once, share this map\n * amongst all of them\n * @param element Element to duplicate\n * @param overrides Any element properties to override\n */\nconst duplicateElement = (editingGroupId, groupIdMapForOperation, element, overrides) => {\n let copy = deepCopyElement(element);\n copy.id = regenerateId(copy.id);\n copy.boundElements = null;\n copy.updated = (0,_utils__WEBPACK_IMPORTED_MODULE_0__.getUpdatedTimestamp)();\n copy.seed = (0,_random__WEBPACK_IMPORTED_MODULE_1__.randomInteger)();\n copy.groupIds = (0,_groups__WEBPACK_IMPORTED_MODULE_3__.getNewGroupIdsForDuplication)(copy.groupIds, editingGroupId, (groupId) => {\n if (!groupIdMapForOperation.has(groupId)) {\n groupIdMapForOperation.set(groupId, regenerateId(groupId));\n }\n return groupIdMapForOperation.get(groupId);\n });\n if (overrides) {\n copy = Object.assign(copy, overrides);\n }\n return copy;\n};\n/**\n * Clones elements, regenerating their ids (including bindings) and group ids.\n *\n * If bindings don't exist in the elements array, they are removed. Therefore,\n * it's advised to supply the whole elements array, or sets of elements that\n * are encapsulated (such as library items), if the purpose is to retain\n * bindings to the cloned elements intact.\n *\n * NOTE by default does not randomize or regenerate anything except the id.\n */\nconst duplicateElements = (elements, opts) => {\n const clonedElements = [];\n const origElementsMap = (0,_utils__WEBPACK_IMPORTED_MODULE_0__.arrayToMap)(elements);\n // used for for migrating old ids to new ids\n const elementNewIdsMap = new Map();\n const maybeGetNewId = (id) => {\n // if we've already migrated the element id, return the new one directly\n if (elementNewIdsMap.has(id)) {\n return elementNewIdsMap.get(id);\n }\n // if we haven't migrated the element id, but an old element with the same\n // id exists, generate a new id for it and return it\n if (origElementsMap.has(id)) {\n const newId = regenerateId(id);\n elementNewIdsMap.set(id, newId);\n return newId;\n }\n // if old element doesn't exist, return null to mark it for removal\n return null;\n };\n const groupNewIdsMap = new Map();\n for (const element of elements) {\n const clonedElement = _deepCopyElement(element);\n clonedElement.id = maybeGetNewId(element.id);\n if (opts === null || opts === void 0 ? void 0 : opts.randomizeSeed) {\n clonedElement.seed = (0,_random__WEBPACK_IMPORTED_MODULE_1__.randomInteger)();\n (0,_mutateElement__WEBPACK_IMPORTED_MODULE_2__.bumpVersion)(clonedElement);\n }\n if (clonedElement.groupIds) {\n clonedElement.groupIds = clonedElement.groupIds.map((groupId) => {\n if (!groupNewIdsMap.has(groupId)) {\n groupNewIdsMap.set(groupId, regenerateId(groupId));\n }\n return groupNewIdsMap.get(groupId);\n });\n }\n if (\"containerId\" in clonedElement && clonedElement.containerId) {\n const newContainerId = maybeGetNewId(clonedElement.containerId);\n clonedElement.containerId = newContainerId;\n }\n if (\"boundElements\" in clonedElement && clonedElement.boundElements) {\n clonedElement.boundElements = clonedElement.boundElements.reduce((acc, binding) => {\n const newBindingId = maybeGetNewId(binding.id);\n if (newBindingId) {\n acc.push(Object.assign(Object.assign({}, binding), { id: newBindingId }));\n }\n return acc;\n }, []);\n }\n if (\"endBinding\" in clonedElement && clonedElement.endBinding) {\n const newEndBindingId = maybeGetNewId(clonedElement.endBinding.elementId);\n clonedElement.endBinding = newEndBindingId\n ? Object.assign(Object.assign({}, clonedElement.endBinding), { elementId: newEndBindingId }) : null;\n }\n if (\"startBinding\" in clonedElement && clonedElement.startBinding) {\n const newEndBindingId = maybeGetNewId(clonedElement.startBinding.elementId);\n clonedElement.startBinding = newEndBindingId\n ? Object.assign(Object.assign({}, clonedElement.startBinding), { elementId: newEndBindingId }) : null;\n }\n clonedElements.push(clonedElement);\n }\n return clonedElements;\n};\nconst convertToExcalidrawElements = (elements) => {\n const res = [];\n if (!elements) {\n return [];\n }\n elements.forEach((element) => {\n var _a;\n if (!element) {\n return;\n }\n if ((0,_textElement__WEBPACK_IMPORTED_MODULE_7__.isValidTextContainer)(element) && ((_a = element === null || element === void 0 ? void 0 : element.label) === null || _a === void 0 ? void 0 : _a.text)) {\n //@ts-ignore\n const elements = (0,_textElement__WEBPACK_IMPORTED_MODULE_7__.bindTextToContainer)(element, element.label);\n res.push(...elements);\n }\n else {\n let excalidrawElement;\n if (element.type === \"text\") {\n //@ts-ignore\n excalidrawElement = newTextElement(Object.assign({ \n //@ts-ignore\n x: 0, \n //@ts-ignore\n y: 0 }, element));\n }\n else if (element.type === \"arrow\" || element.type === \"line\") {\n excalidrawElement = newLinearElement(Object.assign({ \n //@ts-ignore\n x: 0, \n //@ts-ignore\n y: 0, \n //@ts-ignore\n type: element.type, \n //@ts-ignore\n width: 200, \n //@ts-ignore\n height: 24, \n //@ts-ignore,\n endArrowhead: element.type === \"arrow\" ? \"arrow\" : null, \n //@ts-ignore\n points: [\n [0, 0],\n [200, 0],\n ] }, element));\n }\n else {\n //@ts-ignore\n excalidrawElement = newElement(Object.assign(Object.assign({ x: 0, y: 0 }, element), { width: \n //@ts-ignore\n (element === null || element === void 0 ? void 0 : element.width) ||\n (ELEMENTS_SUPPORTING_PROGRAMMATIC_API.includes(element.type)\n ? 100\n : 0), height: \n //@ts-ignore\n (element === null || element === void 0 ? void 0 : element.height) ||\n (ELEMENTS_SUPPORTING_PROGRAMMATIC_API.includes(element.type)\n ? 100\n : 0) }));\n }\n //@ts-ignore\n res.push(excalidrawElement);\n }\n });\n return res;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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LEVBQUUsQ0FBQyxDQUFDO3FCQUNULElBQ0UsT0FBTyxFQUNWLENBQUM7YUFDSjtpQkFBTTtnQkFDTCxZQUFZO2dCQUNaLGlCQUFpQixHQUFHLFVBQVUsK0JBQzVCLENBQUMsRUFBRSxDQUFDLEVBQ0osQ0FBQyxFQUFFLENBQUMsSUFFRCxPQUFPLEtBQ1YsS0FBSztvQkFDSCxZQUFZO29CQUNaLFFBQU8sYUFBUCxPQUFPLHVCQUFQLE9BQU8sQ0FBRSxLQUFLO3dCQUNkLENBQUMsb0NBQW9DLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUM7NEJBQzFELENBQUMsQ0FBQyxHQUFHOzRCQUNMLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFDUixNQUFNO29CQUNKLFlBQVk7b0JBQ1osUUFBTyxhQUFQLE9BQU8sdUJBQVAsT0FBTyxDQUFFLE1BQU07d0JBQ2YsQ0FBQyxvQ0FBb0MsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQzs0QkFDMUQsQ0FBQyxDQUFDLEdBQUc7NEJBQ0wsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUNSLENBQUM7YUFDSjtZQUNELFlBQVk7WUFFWixHQUFHLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUM7U0FDN0I7SUFDSCxDQUFDLENBQUMsQ0FBQztJQUNILE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQyxDQUFDIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4uLy4uL2VsZW1lbnQvbmV3RWxlbWVudC50cz8xMjUzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEV4Y2FsaWRyYXdFbGVtZW50LFxuICBFeGNhbGlkcmF3SW1hZ2VFbGVtZW50LFxuICBFeGNhbGlkcmF3VGV4dEVsZW1lbnQsXG4gIEV4Y2FsaWRyYXdMaW5lYXJFbGVtZW50LFxuICBFeGNhbGlkcmF3R2VuZXJpY0VsZW1lbnQsXG4gIE5vbkRlbGV0ZWQsXG4gIFRleHRBbGlnbixcbiAgR3JvdXBJZCxcbiAgVmVydGljYWxBbGlnbixcbiAgQXJyb3doZWFkLFxuICBFeGNhbGlkcmF3RnJlZURyYXdFbGVtZW50LFxuICBGb250RmFtaWx5VmFsdWVzLFxuICBFeGNhbGlkcmF3VGV4dENvbnRhaW5lcixcbn0gZnJvbSBcIi4uL2VsZW1lbnQvdHlwZXNcIjtcbmltcG9ydCB7XG4gIGFycmF5VG9NYXAsXG4gIGdldEZvbnRTdHJpbmcsXG4gIGdldFVwZGF0ZWRUaW1lc3RhbXAsXG4gIGlzVGVzdEVudixcbn0gZnJvbSBcIi4uL3V0aWxzXCI7XG5pbXBvcnQgeyByYW5kb21JbnRlZ2VyLCByYW5kb21JZCB9IGZyb20gXCIuLi9yYW5kb21cIjtcbmltcG9ydCB7IGJ1bXBWZXJzaW9uLCBtdXRhdGVFbGVtZW50LCBuZXdFbGVtZW50V2l0aCB9IGZyb20gXCIuL211dGF0ZUVsZW1lbnRcIjtcbmltcG9ydCB7IGdldE5ld0dyb3VwSWRzRm9yRHVwbGljYXRpb24gfSBmcm9tIFwiLi4vZ3JvdXBzXCI7XG5pbXBvcnQgeyBBcHBTdGF0ZSB9IGZyb20gXCIuLi90eXBlc1wiO1xuaW1wb3J0IHsgZ2V0RWxlbWVudEFic29sdXRlQ29vcmRzIH0gZnJvbSBcIi5cIjtcbmltcG9ydCB7IGFkanVzdFhZV2l0aFJvdGF0aW9uIH0gZnJvbSBcIi4uL21hdGhcIjtcbmltcG9ydCB7IGdldFJlc2l6ZWRFbGVtZW50QWJzb2x1dGVDb29yZHMgfSBmcm9tIFwiLi9ib3VuZHNcIjtcbmltcG9ydCB7XG4gIGdldEJvdW5kVGV4dEVsZW1lbnRPZmZzZXQsXG4gIGdldENvbnRhaW5lckRpbXMsXG4gIGdldENvbnRhaW5lckVsZW1lbnQsXG4gIG1lYXN1cmVUZXh0LFxuICBub3JtYWxpemVUZXh0LFxuICB3cmFwVGV4dCxcbiAgZ2V0Qm91bmRUZXh0TWF4V2lkdGgsXG4gIGdldERlZmF1bHRMaW5lSGVpZ2h0LFxuICBiaW5kVGV4dFRvQ29udGFpbmVyLFxuICBpc1ZhbGlkVGV4dENvbnRhaW5lcixcbn0gZnJvbSBcIi4vdGV4dEVsZW1lbnRcIjtcbmltcG9ydCB7XG4gIERFRkFVTFRfRUxFTUVOVF9QUk9QUyxcbiAgREVGQVVMVF9GT05UX0ZBTUlMWSxcbiAgREVGQVVMVF9GT05UX1NJWkUsXG4gIERFRkFVTFRfVEVYVF9BTElHTixcbiAgREVGQVVMVF9WRVJUSUNBTF9BTElHTixcbiAgVkVSVElDQUxfQUxJR04sXG59IGZyb20gXCIuLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IGlzQXJyb3dFbGVtZW50IH0gZnJvbSBcIi4vdHlwZUNoZWNrc1wiO1xuaW1wb3J0IHsgTWFya09wdGlvbmFsLCBNZXJnZSwgTXV0YWJsZSB9IGZyb20gXCIuLi91dGlsaXR5LXR5cGVzXCI7XG5pbXBvcnQgeyBJbXBvcnRlZERhdGFTdGF0ZSB9IGZyb20gXCIuLi9kYXRhL3R5cGVzXCI7XG5cbmNvbnN0IEVMRU1FTlRTX1NVUFBPUlRJTkdfUFJPR1JBTU1BVElDX0FQSSA9IFtcbiAgXCJyZWN0YW5nbGVcIixcbiAgXCJlbGxpcHNlXCIsXG4gIFwiZGlhbW9uZFwiLFxuICBcInRleHRcIixcbiAgXCJhcnJvd1wiLFxuICBcImxpbmVcIixcbl07XG5leHBvcnQgdHlwZSBFbGVtZW50Q29uc3RydWN0b3JPcHRzID0gTWFya09wdGlvbmFsPFxuICBPbWl0PEV4Y2FsaWRyYXdHZW5lcmljRWxlbWVudCwgXCJpZFwiIHwgXCJ0eXBlXCIgfCBcImlzRGVsZXRlZFwiIHwgXCJ1cGRhdGVkXCI+LFxuICB8IFwid2lkdGhcIlxuICB8IFwiaGVpZ2h0XCJcbiAgfCBcImFuZ2xlXCJcbiAgfCBcImdyb3VwSWRzXCJcbiAgfCBcImJvdW5kRWxlbWVudHNcIlxuICB8IFwic2VlZFwiXG4gIHwgXCJ2ZXJzaW9uXCJcbiAgfCBcInZlcnNpb25Ob25jZVwiXG4gIHwgXCJsaW5rXCJcbiAgfCBcInN0cm9rZVN0eWxlXCJcbiAgfCBcImZpbGxTdHlsZVwiXG4gIHwgXCJzdHJva2VDb2xvclwiXG4gIHwgXCJiYWNrZ3JvdW5kQ29sb3JcIlxuICB8IFwicm91Z2huZXNzXCJcbiAgfCBcInN0cm9rZVdpZHRoXCJcbiAgfCBcInJvdW5kbmVzc1wiXG4gIHwgXCJsb2NrZWRcIlxuICB8IFwib3BhY2l0eVwiXG4+O1xuXG5jb25zdCBfbmV3RWxlbWVudEJhc2UgPSA8VCBleHRlbmRzIEV4Y2FsaWRyYXdFbGVtZW50PihcbiAgdHlwZTogVFtcInR5cGVcIl0sXG4gIHtcbiAgICB4LFxuICAgIHksXG4gICAgc3Ryb2tlQ29sb3IgPSBERUZBVUxUX0VMRU1FTlRfUFJPUFMuc3Ryb2tlQ29sb3IsXG4gICAgYmFja2dyb3VuZENvbG9yID0gREVGQVVMVF9FTEVNRU5UX1BST1BTLmJhY2tncm91bmRDb2xvcixcbiAgICBmaWxsU3R5bGUgPSBERUZBVUxUX0VMRU1FTlRfUFJPUFMuZmlsbFN0eWxlLFxuICAgIHN0cm9rZVdpZHRoID0gREVGQVVMVF9FTEVNRU5UX1BST1BTLnN0cm9rZVdpZHRoLFxuICAgIHN0cm9rZVN0eWxlID0gREVGQVVMVF9FTEVNRU5UX1BST1BTLnN0cm9rZVN0eWxlLFxuICAgIHJvdWdobmVzcyA9IERFRkFVTFRfRUxFTUVOVF9QUk9QUy5yb3VnaG5lc3MsXG4gICAgb3BhY2l0eSA9IERFRkFVTFRfRUxFTUVOVF9QUk9QUy5vcGFjaXR5LFxuICAgIHdpZHRoID0gMCxcbiAgICBoZWlnaHQgPSAwLFxuICAgIGFuZ2xlID0gMCxcbiAgICBncm91cElkcyA9IFtdLFxuICAgIHJvdW5kbmVzcyA9IG51bGwsXG4gICAgYm91bmRFbGVtZW50cyA9IG51bGwsXG4gICAgbGluayA9IG51bGwsXG4gICAgbG9ja2VkID0gREVGQVVMVF9FTEVNRU5UX1BST1BTLmxvY2tlZCxcbiAgICAuLi5yZXN0XG4gIH06IEVsZW1lbnRDb25zdHJ1Y3Rvck9wdHMgJiBPbWl0PFBhcnRpYWw8RXhjYWxpZHJhd0dlbmVyaWNFbGVtZW50PiwgXCJ0eXBlXCI+LFxuKSA9PiB7XG4gIGNvbnNvbGUubG9nKFwid2lkdGhcIiwgd2lkdGgpO1xuICAvLyBhc3NpZ24gdHlwZSB0byBndWFyZCBhZ2FpbnN0IGV4Y2VzcyBwcm9wZXJ0aWVzXG4gIGNvbnN0IGVsZW1lbnQ6IE1lcmdlPEV4Y2FsaWRyYXdHZW5lcmljRWxlbWVudCwgeyB0eXBlOiBUW1widHlwZVwiXSB9PiA9IHtcbiAgICBpZDogcmVzdC5pZCB8fCByYW5kb21JZCgpLFxuICAgIHR5cGUsXG4gICAgeCxcbiAgICB5LFxuICAgIHdpZHRoLFxuICAgIGhlaWdodCxcbiAgICBhbmdsZSxcbiAgICBzdHJva2VDb2xvcixcbiAgICBiYWNrZ3JvdW5kQ29sb3IsXG4gICAgZmlsbFN0eWxlLFxuICAgIHN0cm9rZVdpZHRoLFxuICAgIHN0cm9rZVN0eWxlLFxuICAgIHJvdWdobmVzcyxcbiAgICBvcGFjaXR5LFxuICAgIGdyb3VwSWRzLFxuICAgIHJvdW5kbmVzcyxcbiAgICBzZWVkOiByZXN0LnNlZWQgPz8gcmFuZG9tSW50ZWdlcigpLFxuICAgIHZlcnNpb246IHJlc3QudmVyc2lvbiB8fCAxLFxuICAgIHZlcnNpb25Ob25jZTogcmVzdC52ZXJzaW9uTm9uY2UgPz8gMCxcbiAgICBpc0RlbGV0ZWQ6IGZhbHNlIGFzIGZhbHNlLFxuICAgIGJvdW5kRWxlbWVudHMsXG4gICAgdXBkYXRlZDogZ2V0VXBkYXRlZFRpbWVzdGFtcCgpLFxuICAgIGxpbmssXG4gICAgbG9ja2VkLFxuICB9O1xuICByZXR1cm4gZWxlbWVudDtcbn07XG5cbmV4cG9ydCBjb25zdCBuZXdFbGVtZW50ID0gKFxuICBvcHRzOiB7XG4gICAgdHlwZTogRXhjYWxpZHJhd0dlbmVyaWNFbGVtZW50W1widHlwZVwiXTtcbiAgfSAmIEVsZW1lbnRDb25zdHJ1Y3Rvck9wdHMsXG4pOiBOb25EZWxldGVkPEV4Y2FsaWRyYXdHZW5lcmljRWxlbWVudD4gPT5cbiAgX25ld0VsZW1lbnRCYXNlPEV4Y2FsaWRyYXdHZW5lcmljRWxlbWVudD4ob3B0cy50eXBlLCBvcHRzKTtcblxuLyoqIGNvbXB1dGVzIGVsZW1lbnQgeC95IG9mZnNldCBiYXNlZCBvbiB0ZXh0QWxpZ24vdmVydGljYWxBbGlnbiAqL1xuY29uc3QgZ2V0VGV4dEVsZW1lbnRQb3NpdGlvbk9mZnNldHMgPSAoXG4gIG9wdHM6IHtcbiAgICB0ZXh0QWxpZ246IEV4Y2FsaWRyYXdUZXh0RWxlbWVudFtcInRleHRBbGlnblwiXTtcbiAgICB2ZXJ0aWNhbEFsaWduOiBFeGNhbGlkcmF3VGV4dEVsZW1lbnRbXCJ2ZXJ0aWNhbEFsaWduXCJdO1xuICB9LFxuICBtZXRyaWNzOiB7XG4gICAgd2lkdGg6IG51bWJlcjtcbiAgICBoZWlnaHQ6IG51bWJlcjtcbiAgfSxcbikgPT4ge1xuICByZXR1cm4ge1xuICAgIHg6XG4gICAgICBvcHRzLnRleHRBbGlnbiA9PT0gXCJjZW50ZXJcIlxuICAgICAgICA/IG1ldHJpY3Mud2lkdGggLyAyXG4gICAgICAgIDogb3B0cy50ZXh0QWxpZ24gPT09IFwicmlnaHRcIlxuICAgICAgICA/IG1ldHJpY3Mud2lkdGhcbiAgICAgICAgOiAwLFxuICAgIHk6IG9wdHMudmVydGljYWxBbGlnbiA9PT0gXCJtaWRkbGVcIiA/IG1ldHJpY3MuaGVpZ2h0IC8gMiA6IDAsXG4gIH07XG59O1xuXG5leHBvcnQgY29uc3QgbmV3VGV4dEVsZW1lbnQgPSAoXG4gIG9wdHM6IHtcbiAgICB0ZXh0OiBzdHJpbmc7XG4gICAgZm9udFNpemU/OiBudW1iZXI7XG4gICAgZm9udEZhbWlseT86IEZvbnRGYW1pbHlWYWx1ZXM7XG4gICAgdGV4dEFsaWduPzogVGV4dEFsaWduO1xuICAgIHZlcnRpY2FsQWxpZ24/OiBWZXJ0aWNhbEFsaWduO1xuICAgIGNvbnRhaW5lcklkPzogRXhjYWxpZHJhd1RleHRDb250YWluZXJbXCJpZFwiXTtcbiAgICBsaW5lSGVpZ2h0PzogRXhjYWxpZHJhd1RleHRFbGVtZW50W1wibGluZUhlaWdodFwiXTtcbiAgICBzdHJva2VXaWR0aD86IEV4Y2FsaWRyYXdUZXh0RWxlbWVudFtcInN0cm9rZVdpZHRoXCJdO1xuICB9ICYgRWxlbWVudENvbnN0cnVjdG9yT3B0cyxcbik6IE5vbkRlbGV0ZWQ8RXhjYWxpZHJhd1RleHRFbGVtZW50PiA9PiB7XG4gIGNvbnN0IGZvbnRGYW1pbHkgPSBvcHRzLmZvbnRGYW1pbHkgfHwgREVGQVVMVF9GT05UX0ZBTUlMWTtcbiAgY29uc3QgZm9udFNpemUgPSBvcHRzLmZvbnRTaXplIHx8IERFRkFVTFRfRk9OVF9TSVpFO1xuICBjb25zdCBsaW5lSGVpZ2h0ID0gb3B0cy5saW5lSGVpZ2h0IHx8IGdldERlZmF1bHRMaW5lSGVpZ2h0KGZvbnRGYW1pbHkpO1xuICBjb25zdCB0ZXh0ID0gbm9ybWFsaXplVGV4dChvcHRzLnRleHQpO1xuICBjb25zdCBtZXRyaWNzID0gbWVhc3VyZVRleHQoXG4gICAgdGV4dCxcbiAgICBnZXRGb250U3RyaW5nKHsgZm9udEZhbWlseSwgZm9udFNpemUgfSksXG4gICAgbGluZUhlaWdodCxcbiAgKTtcbiAgY29uc3QgdGV4dEFsaWduID0gb3B0cy50ZXh0QWxpZ24gfHwgREVGQVVMVF9URVhUX0FMSUdOO1xuICBjb25zdCB2ZXJ0aWNhbEFsaWduID0gb3B0cy52ZXJ0aWNhbEFsaWduIHx8IERFRkFVTFRfVkVSVElDQUxfQUxJR047XG4gIGNvbnN0IG9mZnNldHMgPSBnZXRUZXh0RWxlbWVudFBvc2l0aW9uT2Zmc2V0cyhcbiAgICB7IHRleHRBbGlnbiwgdmVydGljYWxBbGlnbiB9LFxuICAgIG1ldHJpY3MsXG4gICk7XG5cbiAgY29uc3QgdGV4dEVsZW1lbnQgPSBuZXdFbGVtZW50V2l0aChcbiAgICB7XG4gICAgICAuLi5fbmV3RWxlbWVudEJhc2U8RXhjYWxpZHJhd1RleHRFbGVtZW50PihcInRleHRcIiwgb3B0cyksXG4gICAgICB0ZXh0LFxuICAgICAgZm9udFNpemUsXG4gICAgICBmb250RmFtaWx5LFxuICAgICAgdGV4dEFsaWduLFxuICAgICAgdmVydGljYWxBbGlnbixcbiAgICAgIHg6IG9wdHMueCAtIG9mZnNldHMueCxcbiAgICAgIHk6IG9wdHMueSAtIG9mZnNldHMueSxcbiAgICAgIHdpZHRoOiBtZXRyaWNzLndpZHRoLFxuICAgICAgaGVpZ2h0OiBtZXRyaWNzLmhlaWdodCxcbiAgICAgIGJhc2VsaW5lOiBtZXRyaWNzLmJhc2VsaW5lLFxuICAgICAgY29udGFpbmVySWQ6IG9wdHMuY29udGFpbmVySWQgfHwgbnVsbCxcbiAgICAgIG9yaWdpbmFsVGV4dDogdGV4dCxcbiAgICAgIGxpbmVIZWlnaHQsXG4gICAgfSxcbiAgICB7fSxcbiAgKTtcbiAgcmV0dXJuIHRleHRFbGVtZW50O1xufTtcblxuY29uc3QgZ2V0QWRqdXN0ZWREaW1lbnNpb25zID0gKFxuICBlbGVtZW50OiBFeGNhbGlkcmF3VGV4dEVsZW1lbnQsXG4gIG5leHRUZXh0OiBzdHJpbmcsXG4pOiB7XG4gIHg6IG51bWJlcjtcbiAgeTogbnVtYmVyO1xuICB3aWR0aDogbnVtYmVyO1xuICBoZWlnaHQ6IG51bWJlcjtcbiAgYmFzZWxpbmU6IG51bWJlcjtcbn0gPT4ge1xuICBjb25zdCBjb250YWluZXIgPSBnZXRDb250YWluZXJFbGVtZW50KGVsZW1lbnQpO1xuXG4gIGNvbnN0IHtcbiAgICB3aWR0aDogbmV4dFdpZHRoLFxuICAgIGhlaWdodDogbmV4dEhlaWdodCxcbiAgICBiYXNlbGluZTogbmV4dEJhc2VsaW5lLFxuICB9ID0gbWVhc3VyZVRleHQobmV4dFRleHQsIGdldEZvbnRTdHJpbmcoZWxlbWVudCksIGVsZW1lbnQubGluZUhlaWdodCk7XG4gIGNvbnN0IHsgdGV4dEFsaWduLCB2ZXJ0aWNhbEFsaWduIH0gPSBlbGVtZW50O1xuICBsZXQgeDogbnVtYmVyO1xuICBsZXQgeTogbnVtYmVyO1xuICBpZiAoXG4gICAgdGV4dEFsaWduID09PSBcImNlbnRlclwiICYmXG4gICAgdmVydGljYWxBbGlnbiA9PT0gVkVSVElDQUxfQUxJR04uTUlERExFICYmXG4gICAgIWVsZW1lbnQuY29udGFpbmVySWRcbiAgKSB7XG4gICAgY29uc3QgcHJldk1ldHJpY3MgPSBtZWFzdXJlVGV4dChcbiAgICAgIGVsZW1lbnQudGV4dCxcbiAgICAgIGdldEZvbnRTdHJpbmcoZWxlbWVudCksXG4gICAgICBlbGVtZW50LmxpbmVIZWlnaHQsXG4gICAgKTtcbiAgICBjb25zdCBvZmZzZXRzID0gZ2V0VGV4dEVsZW1lbnRQb3NpdGlvbk9mZnNldHMoZWxlbWVudCwge1xuICAgICAgd2lkdGg6IG5leHRXaWR0aCAtIHByZXZNZXRyaWNzLndpZHRoLFxuICAgICAgaGVpZ2h0OiBuZXh0SGVpZ2h0IC0gcHJldk1ldHJpY3MuaGVpZ2h0LFxuICAgIH0pO1xuXG4gICAgeCA9IGVsZW1lbnQueCAtIG9mZnNldHMueDtcbiAgICB5ID0gZWxlbWVudC55IC0gb2Zmc2V0cy55O1xuICB9IGVsc2Uge1xuICAgIGNvbnN0IFt4MSwgeTEsIHgyLCB5Ml0gPSBnZXRFbGVtZW50QWJzb2x1dGVDb29yZHMoZWxlbWVudCk7XG5cbiAgICBjb25zdCBbbmV4dFgxLCBuZXh0WTEsIG5leHRYMiwgbmV4dFkyXSA9IGdldFJlc2l6ZWRFbGVtZW50QWJzb2x1dGVDb29yZHMoXG4gICAgICBlbGVtZW50LFxuICAgICAgbmV4dFdpZHRoLFxuICAgICAgbmV4dEhlaWdodCxcbiAgICAgIGZhbHNlLFxuICAgICk7XG4gICAgY29uc3QgZGVsdGFYMSA9ICh4MSAtIG5leHRYMSkgLyAyO1xuICAgIGNvbnN0IGRlbHRhWTEgPSAoeTEgLSBuZXh0WTEpIC8gMjtcbiAgICBjb25zdCBkZWx0YVgyID0gKHgyIC0gbmV4dFgyKSAvIDI7XG4gICAgY29uc3QgZGVsdGFZMiA9ICh5MiAtIG5leHRZMikgLyAyO1xuXG4gICAgW3gsIHldID0gYWRqdXN0WFlXaXRoUm90YXRpb24oXG4gICAgICB7XG4gICAgICAgIHM6IHRydWUsXG4gICAgICAgIGU6IHRleHRBbGlnbiA9PT0gXCJjZW50ZXJcIiB8fCB0ZXh0QWxpZ24gPT09IFwibGVmdFwiLFxuICAgICAgICB3OiB0ZXh0QWxpZ24gPT09IFwiY2VudGVyXCIgfHwgdGV4dEFsaWduID09PSBcInJpZ2h0XCIsXG4gICAgICB9LFxuICAgICAgZWxlbWVudC54LFxuICAgICAgZWxlbWVudC55LFxuICAgICAgZWxlbWVudC5hbmdsZSxcbiAgICAgIGRlbHRhWDEsXG4gICAgICBkZWx0YVkxLFxuICAgICAgZGVsdGFYMixcbiAgICAgIGRlbHRhWTIsXG4gICAgKTtcbiAgfVxuXG4gIC8vIG1ha2Ugc3VyZSBjb250YWluZXIgZGltZW5zaW9ucyBhcmUgc2V0IHByb3Blcmx5IHdoZW5cbiAgLy8gdGV4dCBlZGl0b3Igb3ZlcmZsb3dzIGJleW9uZCB2aWV3cG9ydCBkaW1lbnNpb25zXG4gIGlmIChjb250YWluZXIpIHtcbiAgICBjb25zdCBib3VuZFRleHRFbGVtZW50UGFkZGluZyA9IGdldEJvdW5kVGV4dEVsZW1lbnRPZmZzZXQoZWxlbWVudCk7XG5cbiAgICBjb25zdCBjb250YWluZXJEaW1zID0gZ2V0Q29udGFpbmVyRGltcyhjb250YWluZXIpO1xuICAgIGxldCBoZWlnaHQgPSBjb250YWluZXJEaW1zLmhlaWdodDtcbiAgICBsZXQgd2lkdGggPSBjb250YWluZXJEaW1zLndpZHRoO1xuICAgIGlmIChuZXh0SGVpZ2h0ID4gaGVpZ2h0IC0gYm91bmRUZXh0RWxlbWVudFBhZGRpbmcgKiAyKSB7XG4gICAgICBoZWlnaHQgPSBuZXh0SGVpZ2h0ICsgYm91bmRUZXh0RWxlbWVudFBhZGRpbmcgKiAyO1xuICAgIH1cbiAgICBpZiAobmV4dFdpZHRoID4gd2lkdGggLSBib3VuZFRleHRFbGVtZW50UGFkZGluZyAqIDIpIHtcbiAgICAgIHdpZHRoID0gbmV4dFdpZHRoICsgYm91bmRUZXh0RWxlbWVudFBhZGRpbmcgKiAyO1xuICAgIH1cbiAgICBpZiAoXG4gICAgICAhaXNBcnJvd0VsZW1lbnQoY29udGFpbmVyKSAmJlxuICAgICAgKGhlaWdodCAhPT0gY29udGFpbmVyRGltcy5oZWlnaHQgfHwgd2lkdGggIT09IGNvbnRhaW5lckRpbXMud2lkdGgpXG4gICAgKSB7XG4gICAgICBtdXRhdGVFbGVtZW50KGNvbnRhaW5lciwgeyBoZWlnaHQsIHdpZHRoIH0pO1xuICAgIH1cbiAgfVxuICByZXR1cm4ge1xuICAgIHdpZHRoOiBuZXh0V2lkdGgsXG4gICAgaGVpZ2h0OiBuZXh0SGVpZ2h0LFxuICAgIGJhc2VsaW5lOiBuZXh0QmFzZWxpbmUsXG4gICAgeDogTnVtYmVyLmlzRmluaXRlKHgpID8geCA6IGVsZW1lbnQueCxcbiAgICB5OiBOdW1iZXIuaXNGaW5pdGUoeSkgPyB5IDogZWxlbWVudC55LFxuICB9O1xufTtcblxuZXhwb3J0IGNvbnN0IHJlZnJlc2hUZXh0RGltZW5zaW9ucyA9IChcbiAgdGV4dEVsZW1lbnQ6IEV4Y2FsaWRyYXdUZXh0RWxlbWVudCxcbiAgdGV4dCA9IHRleHRFbGVtZW50LnRleHQsXG4pID0+IHtcbiAgaWYgKHRleHRFbGVtZW50LmlzRGVsZXRlZCkge1xuICAgIHJldHVybjtcbiAgfVxuICBjb25zdCBjb250YWluZXIgPSBnZXRDb250YWluZXJFbGVtZW50KHRleHRFbGVtZW50KTtcbiAgaWYgKGNvbnRhaW5lcikge1xuICAgIHRleHQgPSB3cmFwVGV4dChcbiAgICAgIHRleHQsXG4gICAgICBnZXRGb250U3RyaW5nKHRleHRFbGVtZW50KSxcbiAgICAgIGdldEJvdW5kVGV4dE1heFdpZHRoKGNvbnRhaW5lciksXG4gICAgKTtcbiAgfVxuICBjb25zdCBkaW1lbnNpb25zID0gZ2V0QWRqdXN0ZWREaW1lbnNpb25zKHRleHRFbGVtZW50LCB0ZXh0KTtcbiAgcmV0dXJuIHsgdGV4dCwgLi4uZGltZW5zaW9ucyB9O1xufTtcblxuZXhwb3J0IGNvbnN0IHVwZGF0ZVRleHRFbGVtZW50ID0gKFxuICB0ZXh0RWxlbWVudDogRXhjYWxpZHJhd1RleHRFbGVtZW50LFxuICB7XG4gICAgdGV4dCxcbiAgICBpc0RlbGV0ZWQsXG4gICAgb3JpZ2luYWxUZXh0LFxuICB9OiB7XG4gICAgdGV4dDogc3RyaW5nO1xuICAgIGlzRGVsZXRlZD86IGJvb2xlYW47XG4gICAgb3JpZ2luYWxUZXh0OiBzdHJpbmc7XG4gIH0sXG4pOiBFeGNhbGlkcmF3VGV4dEVsZW1lbnQgPT4ge1xuICByZXR1cm4gbmV3RWxlbWVudFdpdGgodGV4dEVsZW1lbnQsIHtcbiAgICBvcmlnaW5hbFRleHQsXG4gICAgaXNEZWxldGVkOiBpc0RlbGV0ZWQgPz8gdGV4dEVsZW1lbnQuaXNEZWxldGVkLFxuICAgIC4uLnJlZnJlc2hUZXh0RGltZW5zaW9ucyh0ZXh0RWxlbWVudCwgb3JpZ2luYWxUZXh0KSxcbiAgfSk7XG59O1xuXG5leHBvcnQgY29uc3QgbmV3RnJlZURyYXdFbGVtZW50ID0gKFxuICBvcHRzOiB7XG4gICAgdHlwZTogXCJmcmVlZHJhd1wiO1xuICAgIHBvaW50cz86IEV4Y2FsaWRyYXdGcmVlRHJhd0VsZW1lbnRbXCJwb2ludHNcIl07XG4gICAgc2ltdWxhdGVQcmVzc3VyZTogYm9vbGVhbjtcbiAgfSAmIEVsZW1lbnRDb25zdHJ1Y3Rvck9wdHMsXG4pOiBOb25EZWxldGVkPEV4Y2FsaWRyYXdGcmVlRHJhd0VsZW1lbnQ+ID0+IHtcbiAgcmV0dXJuIHtcbiAgICAuLi5fbmV3RWxlbWVudEJhc2U8RXhjYWxpZHJhd0ZyZWVEcmF3RWxlbWVudD4ob3B0cy50eXBlLCBvcHRzKSxcbiAgICBwb2ludHM6IG9wdHMucG9pbnRzIHx8IFtdLFxuICAgIHByZXNzdXJlczogW10sXG4gICAgc2ltdWxhdGVQcmVzc3VyZTogb3B0cy5zaW11bGF0ZVByZXNzdXJlLFxuICAgIGxhc3RDb21taXR0ZWRQb2ludDogbnVsbCxcbiAgfTtcbn07XG5cbmV4cG9ydCBjb25zdCBuZXdMaW5lYXJFbGVtZW50ID0gKFxuICBvcHRzOiB7XG4gICAgdHlwZTogRXhjYWxpZHJhd0xpbmVhckVsZW1lbnRbXCJ0eXBlXCJdO1xuICAgIHN0YXJ0QXJyb3doZWFkPzogQXJyb3doZWFkIHwgbnVsbDtcbiAgICBlbmRBcnJvd2hlYWQ/OiBBcnJvd2hlYWQgfCBudWxsO1xuICAgIHBvaW50cz86IEV4Y2FsaWRyYXdMaW5lYXJFbGVtZW50W1wicG9pbnRzXCJdO1xuICB9ICYgRWxlbWVudENvbnN0cnVjdG9yT3B0cyxcbik6IE5vbkRlbGV0ZWQ8RXhjYWxpZHJhd0xpbmVhckVsZW1lbnQ+ID0+IHtcbiAgcmV0dXJuIHtcbiAgICAuLi5fbmV3RWxlbWVudEJhc2U8RXhjYWxpZHJhd0xpbmVhckVsZW1lbnQ+KG9wdHMudHlwZSwgb3B0cyksXG4gICAgcG9pbnRzOiBvcHRzLnBvaW50cyB8fCBbXSxcbiAgICBsYXN0Q29tbWl0dGVkUG9pbnQ6IG51bGwsXG4gICAgc3RhcnRCaW5kaW5nOiBudWxsLFxuICAgIGVuZEJpbmRpbmc6IG51bGwsXG4gICAgc3RhcnRBcnJvd2hlYWQ6IG9wdHMuc3RhcnRBcnJvd2hlYWQgfHwgbnVsbCxcbiAgICBlbmRBcnJvd2hlYWQ6IG9wdHMuZW5kQXJyb3doZWFkIHx8IG51bGwsXG4gIH07XG59O1xuXG5leHBvcnQgY29uc3QgbmV3SW1hZ2VFbGVtZW50ID0gKFxuICBvcHRzOiB7XG4gICAgdHlwZTogRXhjYWxpZHJhd0ltYWdlRWxlbWVudFtcInR5cGVcIl07XG4gICAgc3RhdHVzPzogRXhjYWxpZHJhd0ltYWdlRWxlbWVudFtcInN0YXR1c1wiXTtcbiAgICBmaWxlSWQ/OiBFeGNhbGlkcmF3SW1hZ2VFbGVtZW50W1wiZmlsZUlkXCJdO1xuICAgIHNjYWxlPzogRXhjYWxpZHJhd0ltYWdlRWxlbWVudFtcInNjYWxlXCJdO1xuICB9ICYgRWxlbWVudENvbnN0cnVjdG9yT3B0cyxcbik6IE5vbkRlbGV0ZWQ8RXhjYWxpZHJhd0ltYWdlRWxlbWVudD4gPT4ge1xuICByZXR1cm4ge1xuICAgIC4uLl9uZXdFbGVtZW50QmFzZTxFeGNhbGlkcmF3SW1hZ2VFbGVtZW50PihcImltYWdlXCIsIG9wdHMpLFxuICAgIC8vIGluIHRoZSBmdXR1cmUgd2UnbGwgc3VwcG9ydCBjaGFuZ2luZyBzdHJva2UgY29sb3IgZm9yIHNvbWUgU1ZHIGVsZW1lbnRzLFxuICAgIC8vIGFuZCBgdHJhbnNwYXJlbnRgIHdpbGwgbGlrZWx5IG1lYW4gXCJ1c2Ugb3JpZ2luYWwgY29sb3JzIG9mIHRoZSBpbWFnZVwiXG4gICAgc3Ryb2tlQ29sb3I6IFwidHJhbnNwYXJlbnRcIixcbiAgICBzdGF0dXM6IG9wdHMuc3RhdHVzID8/IFwicGVuZGluZ1wiLFxuICAgIGZpbGVJZDogb3B0cy5maWxlSWQgPz8gbnVsbCxcbiAgICBzY2FsZTogb3B0cy5zY2FsZSA/PyBbMSwgMV0sXG4gIH07XG59O1xuXG4vLyBTaW1wbGlmaWVkIGRlZXAgY2xvbmUgZm9yIHRoZSBwdXJwb3NlIG9mIGNsb25pbmcgRXhjYWxpZHJhd0VsZW1lbnQuXG4vL1xuLy8gT25seSBjbG9uZXMgcGxhaW4gb2JqZWN0cyBhbmQgYXJyYXlzLiBEb2Vzbid0IGNsb25lIERhdGUsIFJlZ0V4cCwgTWFwLCBTZXQsXG4vLyBUeXBlZCBhcnJheXMgYW5kIG90aGVyIG5vbi1udWxsIG9iamVjdHMuXG4vL1xuLy8gQWRhcHRlZCBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9sdWtlZWQva2xvbmFcbi8vXG4vLyBUaGUgcmVhc29uIGZvciBgZGVlcENvcHlFbGVtZW50KClgIHdyYXBwZXIgaXMgdHlwZSBzYWZldHkgKG9ubHkgYWxsb3dcbi8vIHBhc3NpbmcgRXhjYWxpZHJhd0VsZW1lbnQgYXMgdGhlIHRvcC1sZXZlbCBhcmd1bWVudCkuXG5jb25zdCBfZGVlcENvcHlFbGVtZW50ID0gKHZhbDogYW55LCBkZXB0aDogbnVtYmVyID0gMCkgPT4ge1xuICAvLyBvbmx5IGNsb25lIG5vbi1wcmltaXRpdmVzXG4gIGlmICh2YWwgPT0gbnVsbCB8fCB0eXBlb2YgdmFsICE9PSBcIm9iamVjdFwiKSB7XG4gICAgcmV0dXJuIHZhbDtcbiAgfVxuXG4gIGNvbnN0IG9iamVjdFR5cGUgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodmFsKTtcblxuICBpZiAob2JqZWN0VHlwZSA9PT0gXCJbb2JqZWN0IE9iamVjdF1cIikge1xuICAgIGNvbnN0IHRtcCA9XG4gICAgICB0eXBlb2YgdmFsLmNvbnN0cnVjdG9yID09PSBcImZ1bmN0aW9uXCJcbiAgICAgICAgPyBPYmplY3QuY3JlYXRlKE9iamVjdC5nZXRQcm90b3R5cGVPZih2YWwpKVxuICAgICAgICA6IHt9O1xuICAgIGZvciAoY29uc3Qga2V5IGluIHZhbCkge1xuICAgICAgaWYgKHZhbC5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG4gICAgICAgIC8vIGRvbid0IGNvcHkgbm9uLXNlcmlhbGl6YWJsZSBvYmplY3RzIGxpa2UgdGhlc2UgY2FjaGVzLiBUaGV5J2xsIGJlXG4gICAgICAgIC8vIHBvcHVsYXRlZCB3aGVuIHRoZSBlbGVtZW50IGlzIHJlbmRlcmVkLlxuICAgICAgICBpZiAoZGVwdGggPT09IDAgJiYgKGtleSA9PT0gXCJzaGFwZVwiIHx8IGtleSA9PT0gXCJjYW52YXNcIikpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICB0bXBba2V5XSA9IF9kZWVwQ29weUVsZW1lbnQodmFsW2tleV0sIGRlcHRoICsgMSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0bXA7XG4gIH1cblxuICBpZiAoQXJyYXkuaXNBcnJheSh2YWwpKSB7XG4gICAgbGV0IGsgPSB2YWwubGVuZ3RoO1xuICAgIGNvbnN0IGFyciA9IG5ldyBBcnJheShrKTtcbiAgICB3aGlsZSAoay0tKSB7XG4gICAgICBhcnJba10gPSBfZGVlcENvcHlFbGVtZW50KHZhbFtrXSwgZGVwdGggKyAxKTtcbiAgICB9XG4gICAgcmV0dXJuIGFycjtcbiAgfVxuXG4gIC8vIHdlJ3JlIG5vdCBjbG9uaW5nIG5vbi1hcnJheSAmIG5vbi1wbGFpbi1vYmplY3Qgb2JqZWN0cyBiZWNhdXNlIHdlXG4gIC8vIGRvbid0IHN1cHBvcnQgdGhlbSBvbiBleGNhbGlkcmF3IGVsZW1lbnRzIHlldC4gSWYgd2UgZG8sIHdlIG5lZWQgdG8gbWFrZVxuICAvLyBzdXJlIHdlIHN0YXJ0IGNsb25pbmcgdGhlbSwgc28gbGV0J3Mgd2FybiBhYm91dCBpdC5cbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcImRldmVsb3BtZW50XCIpIHtcbiAgICBpZiAoXG4gICAgICBvYmplY3RUeXBlICE9PSBcIltvYmplY3QgT2JqZWN0XVwiICYmXG4gICAgICBvYmplY3RUeXBlICE9PSBcIltvYmplY3QgQXJyYXldXCIgJiZcbiAgICAgIG9iamVjdFR5cGUuc3RhcnRzV2l0aChcIltvYmplY3QgXCIpXG4gICAgKSB7XG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgIGBfZGVlcENsb25lRWxlbWVudDogdW5leHBlY3RlZCBvYmplY3QgdHlwZSAke29iamVjdFR5cGV9LiBUaGlzIHZhbHVlIHdpbGwgbm90IGJlIGNsb25lZCFgLFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdmFsO1xufTtcblxuLyoqXG4gKiBDbG9uZXMgRXhjYWxpZHJhd0VsZW1lbnQgZGF0YSBzdHJ1Y3R1cmUuIERvZXMgbm90IHJlZ2VuZXJhdGUgaWQsIG5vbmNlLCBvclxuICogYW55IHZhbHVlLiBUaGUgcHVycG9zZSBpcyB0byB0byBicmVhayBvYmplY3QgcmVmZXJlbmNlcyBmb3IgaW1tdXRhYmlsaXR5XG4gKiByZWFzb25zLCB3aGVuZXZlciB3ZSB3YW50IHRvIGtlZXAgdGhlIG9yaWdpbmFsIGVsZW1lbnQsIGJ1dCBlbnN1cmUgaXQncyBub3RcbiAqIG11dGF0ZWQuXG4gKlxuICogT25seSBjbG9uZXMgcGxhaW4gb2JqZWN0cyBhbmQgYXJyYXlzLiBEb2Vzbid0IGNsb25lIERhdGUsIFJlZ0V4cCwgTWFwLCBTZXQsXG4gKiBUeXBlZCBhcnJheXMgYW5kIG90aGVyIG5vbi1udWxsIG9iamVjdHMuXG4gKi9cbmV4cG9ydCBjb25zdCBkZWVwQ29weUVsZW1lbnQgPSA8VCBleHRlbmRzIEV4Y2FsaWRyYXdFbGVtZW50PihcbiAgdmFsOiBULFxuKTogTXV0YWJsZTxUPiA9PiB7XG4gIHJldHVybiBfZGVlcENvcHlFbGVtZW50KHZhbCk7XG59O1xuXG4vKipcbiAqIHV0aWxpdHkgd3JhcHBlciB0byBnZW5lcmF0ZSBuZXcgaWQuIEluIHRlc3QgZW52IGl0IHJldXNlcyB0aGUgb2xkICsgcG9zdGZpeFxuICogZm9yIHRlc3QgYXNzZXJ0aW9ucy5cbiAqL1xuY29uc3QgcmVnZW5lcmF0ZUlkID0gKFxuICAvKiogc3VwcGx5IG51bGwgaWYgbm8gcHJldmlvdXMgaWQgZXhpc3RzICovXG4gIHByZXZpb3VzSWQ6IHN0cmluZyB8IG51bGwsXG4pID0+IHtcbiAgaWYgKGlzVGVzdEVudigpICYmIHByZXZpb3VzSWQpIHtcbiAgICBsZXQgbmV4dElkID0gYCR7cHJldmlvdXNJZH1fY29weWA7XG4gICAgLy8gYHdpbmRvdy5oYCBtYXkgbm90IGJlIGRlZmluZWQgaW4gc29tZSB1bml0IHRlc3RzXG4gICAgaWYgKFxuICAgICAgd2luZG93Lmg/LmFwcFxuICAgICAgICA/LmdldFNjZW5lRWxlbWVudHNJbmNsdWRpbmdEZWxldGVkKClcbiAgICAgICAgLmZpbmQoKGVsKSA9PiBlbC5pZCA9PT0gbmV4dElkKVxuICAgICkge1xuICAgICAgbmV4dElkICs9IFwiX2NvcHlcIjtcbiAgICB9XG4gICAgcmV0dXJuIG5leHRJZDtcbiAgfVxuICByZXR1cm4gcmFuZG9tSWQoKTtcbn07XG5cbi8qKlxuICogRHVwbGljYXRlIGFuIGVsZW1lbnQsIG9mdGVuIHVzZWQgaW4gdGhlIGFsdC1kcmFnIG9wZXJhdGlvbi5cbiAqIE5vdGUgdGhhdCB0aGlzIG1ldGhvZCBoYXMgZ290dGVuIGEgYml0IGNvbXBsaWNhdGVkIHNpbmNlIHRoZVxuICogaW50cm9kdWN0aW9uIG9mIGdydW9waW5nL3VuZ3JvdXBpbmcgZWxlbWVudHMuXG4gKiBAcGFyYW0gZWRpdGluZ0dyb3VwSWQgVGhlIGN1cnJlbnQgZ3JvdXAgYmVpbmcgZWRpdGVkLiBUaGUgbmV3XG4gKiAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudCB3aWxsIGluaGVyaXQgdGhpcyBncm91cCBhbmQgaXRzXG4gKiAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50cy5cbiAqIEBwYXJhbSBncm91cElkTWFwRm9yT3BlcmF0aW9uIEEgTWFwIHRoYXQgbWFwcyBvbGQgZ3JvdXAgSURzIHRvXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdXBsaWNhdGVkIG9uZXMuIElmIHlvdSBhcmUgZHVwbGljYXRpbmdcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG11bHRpcGxlIGVsZW1lbnRzIGF0IG9uY2UsIHNoYXJlIHRoaXMgbWFwXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbW9uZ3N0IGFsbCBvZiB0aGVtXG4gKiBAcGFyYW0gZWxlbWVudCBFbGVtZW50IHRvIGR1cGxpY2F0ZVxuICogQHBhcmFtIG92ZXJyaWRlcyBBbnkgZWxlbWVudCBwcm9wZXJ0aWVzIHRvIG92ZXJyaWRlXG4gKi9cbmV4cG9ydCBjb25zdCBkdXBsaWNhdGVFbGVtZW50ID0gPFRFbGVtZW50IGV4dGVuZHMgRXhjYWxpZHJhd0VsZW1lbnQ+KFxuICBlZGl0aW5nR3JvdXBJZDogQXBwU3RhdGVbXCJlZGl0aW5nR3JvdXBJZFwiXSxcbiAgZ3JvdXBJZE1hcEZvck9wZXJhdGlvbjogTWFwPEdyb3VwSWQsIEdyb3VwSWQ+LFxuICBlbGVtZW50OiBURWxlbWVudCxcbiAgb3ZlcnJpZGVzPzogUGFydGlhbDxURWxlbWVudD4sXG4pOiBSZWFkb25seTxURWxlbWVudD4gPT4ge1xuICBsZXQgY29weSA9IGRlZXBDb3B5RWxlbWVudChlbGVtZW50KTtcblxuICBjb3B5LmlkID0gcmVnZW5lcmF0ZUlkKGNvcHkuaWQpO1xuICBjb3B5LmJvdW5kRWxlbWVudHMgPSBudWxsO1xuICBjb3B5LnVwZGF0ZWQgPSBnZXRVcGRhdGVkVGltZXN0YW1wKCk7XG4gIGNvcHkuc2VlZCA9IHJhbmRvbUludGVnZXIoKTtcbiAgY29weS5ncm91cElkcyA9IGdldE5ld0dyb3VwSWRzRm9yRHVwbGljYXRpb24oXG4gICAgY29weS5ncm91cElkcyxcbiAgICBlZGl0aW5nR3JvdXBJZCxcbiAgICAoZ3JvdXBJZCkgPT4ge1xuICAgICAgaWYgKCFncm91cElkTWFwRm9yT3BlcmF0aW9uLmhhcyhncm91cElkKSkge1xuICAgICAgICBncm91cElkTWFwRm9yT3BlcmF0aW9uLnNldChncm91cElkLCByZWdlbmVyYXRlSWQoZ3JvdXBJZCkpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGdyb3VwSWRNYXBGb3JPcGVyYXRpb24uZ2V0KGdyb3VwSWQpITtcbiAgICB9LFxuICApO1xuICBpZiAob3ZlcnJpZGVzKSB7XG4gICAgY29weSA9IE9iamVjdC5hc3NpZ24oY29weSwgb3ZlcnJpZGVzKTtcbiAgfVxuICByZXR1cm4gY29weTtcbn07XG5cbi8qKlxuICogQ2xvbmVzIGVsZW1lbnRzLCByZWdlbmVyYXRpbmcgdGhlaXIgaWRzIChpbmNsdWRpbmcgYmluZGluZ3MpIGFuZCBncm91cCBpZHMuXG4gKlxuICogSWYgYmluZGluZ3MgZG9uJ3QgZXhpc3QgaW4gdGhlIGVsZW1lbnRzIGFycmF5LCB0aGV5IGFyZSByZW1vdmVkLiBUaGVyZWZvcmUsXG4gKiBpdCdzIGFkdmlzZWQgdG8gc3VwcGx5IHRoZSB3aG9sZSBlbGVtZW50cyBhcnJheSwgb3Igc2V0cyBvZiBlbGVtZW50cyB0aGF0XG4gKiBhcmUgZW5jYXBzdWxhdGVkIChzdWNoIGFzIGxpYnJhcnkgaXRlbXMpLCBpZiB0aGUgcHVycG9zZSBpcyB0byByZXRhaW5cbiAqIGJpbmRpbmdzIHRvIHRoZSBjbG9uZWQgZWxlbWVudHMgaW50YWN0LlxuICpcbiAqIE5PVEUgYnkgZGVmYXVsdCBkb2VzIG5vdCByYW5kb21pemUgb3IgcmVnZW5lcmF0ZSBhbnl0aGluZyBleGNlcHQgdGhlIGlkLlxuICovXG5leHBvcnQgY29uc3QgZHVwbGljYXRlRWxlbWVudHMgPSAoXG4gIGVsZW1lbnRzOiByZWFkb25seSBFeGNhbGlkcmF3RWxlbWVudFtdLFxuICBvcHRzPzoge1xuICAgIC8qKiBOT1RFIGFsc28gdXBkYXRlcyB2ZXJzaW9uIGZsYWdzIGFuZCBgdXBkYXRlZGAgKi9cbiAgICByYW5kb21pemVTZWVkOiBib29sZWFuO1xuICB9LFxuKSA9PiB7XG4gIGNvbnN0IGNsb25lZEVsZW1lbnRzOiBFeGNhbGlkcmF3RWxlbWVudFtdID0gW107XG5cbiAgY29uc3Qgb3JpZ0VsZW1lbnRzTWFwID0gYXJyYXlUb01hcChlbGVtZW50cyk7XG5cbiAgLy8gdXNlZCBmb3IgZm9yIG1pZ3JhdGluZyBvbGQgaWRzIHRvIG5ldyBpZHNcbiAgY29uc3QgZWxlbWVudE5ld0lkc01hcCA9IG5ldyBNYXA8XG4gICAgLyogb3JpZyAqLyBFeGNhbGlkcmF3RWxlbWVudFtcImlkXCJdLFxuICAgIC8qIG5ldyAqLyBFeGNhbGlkcmF3RWxlbWVudFtcImlkXCJdXG4gID4oKTtcblxuICBjb25zdCBtYXliZUdldE5ld0lkID0gKGlkOiBFeGNhbGlkcmF3RWxlbWVudFtcImlkXCJdKSA9PiB7XG4gICAgLy8gaWYgd2UndmUgYWxyZWFkeSBtaWdyYXRlZCB0aGUgZWxlbWVudCBpZCwgcmV0dXJuIHRoZSBuZXcgb25lIGRpcmVjdGx5XG4gICAgaWYgKGVsZW1lbnROZXdJZHNNYXAuaGFzKGlkKSkge1xuICAgICAgcmV0dXJuIGVsZW1lbnROZXdJZHNNYXAuZ2V0KGlkKSE7XG4gICAgfVxuICAgIC8vIGlmIHdlIGhhdmVuJ3QgbWlncmF0ZWQgdGhlIGVsZW1lbnQgaWQsIGJ1dCBhbiBvbGQgZWxlbWVudCB3aXRoIHRoZSBzYW1lXG4gICAgLy8gaWQgZXhpc3RzLCBnZW5lcmF0ZSBhIG5ldyBpZCBmb3IgaXQgYW5kIHJldHVybiBpdFxuICAgIGlmIChvcmlnRWxlbWVudHNNYXAuaGFzKGlkKSkge1xuICAgICAgY29uc3QgbmV3SWQgPSByZWdlbmVyYXRlSWQoaWQpO1xuICAgICAgZWxlbWVudE5ld0lkc01hcC5zZXQoaWQsIG5ld0lkKTtcbiAgICAgIHJldHVybiBuZXdJZDtcbiAgICB9XG4gICAgLy8gaWYgb2xkIGVsZW1lbnQgZG9lc24ndCBleGlzdCwgcmV0dXJuIG51bGwgdG8gbWFyayBpdCBmb3IgcmVtb3ZhbFxuICAgIHJldHVybiBudWxsO1xuICB9O1xuXG4gIGNvbnN0IGdyb3VwTmV3SWRzTWFwID0gbmV3IE1hcDwvKiBvcmlnICovIEdyb3VwSWQsIC8qIG5ldyAqLyBHcm91cElkPigpO1xuXG4gIGZvciAoY29uc3QgZWxlbWVudCBvZiBlbGVtZW50cykge1xuICAgIGNvbnN0IGNsb25lZEVsZW1lbnQ6IE11dGFibGU8RXhjYWxpZHJhd0VsZW1lbnQ+ID0gX2RlZXBDb3B5RWxlbWVudChlbGVtZW50KTtcblxuICAgIGNsb25lZEVsZW1lbnQuaWQgPSBtYXliZUdldE5ld0lkKGVsZW1lbnQuaWQpITtcblxuICAgIGlmIChvcHRzPy5yYW5kb21pemVTZWVkKSB7XG4gICAgICBjbG9uZWRFbGVtZW50LnNlZWQgPSByYW5kb21JbnRlZ2VyKCk7XG4gICAgICBidW1wVmVyc2lvbihjbG9uZWRFbGVtZW50KTtcbiAgICB9XG5cbiAgICBpZiAoY2xvbmVkRWxlbWVudC5ncm91cElkcykge1xuICAgICAgY2xvbmVkRWxlbWVudC5ncm91cElkcyA9IGNsb25lZEVsZW1lbnQuZ3JvdXBJZHMubWFwKChncm91cElkKSA9PiB7XG4gICAgICAgIGlmICghZ3JvdXBOZXdJZHNNYXAuaGFzKGdyb3VwSWQpKSB7XG4gICAgICAgICAgZ3JvdXBOZXdJZHNNYXAuc2V0KGdyb3VwSWQsIHJlZ2VuZXJhdGVJZChncm91cElkKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGdyb3VwTmV3SWRzTWFwLmdldChncm91cElkKSE7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAoXCJjb250YWluZXJJZFwiIGluIGNsb25lZEVsZW1lbnQgJiYgY2xvbmVkRWxlbWVudC5jb250YWluZXJJZCkge1xuICAgICAgY29uc3QgbmV3Q29udGFpbmVySWQgPSBtYXliZUdldE5ld0lkKGNsb25lZEVsZW1lbnQuY29udGFpbmVySWQpO1xuICAgICAgY2xvbmVkRWxlbWVudC5jb250YWluZXJJZCA9IG5ld0NvbnRhaW5lcklkO1xuICAgIH1cblxuICAgIGlmIChcImJvdW5kRWxlbWVudHNcIiBpbiBjbG9uZWRFbGVtZW50ICYmIGNsb25lZEVsZW1lbnQuYm91bmRFbGVtZW50cykge1xuICAgICAgY2xvbmVkRWxlbWVudC5ib3VuZEVsZW1lbnRzID0gY2xvbmVkRWxlbWVudC5ib3VuZEVsZW1lbnRzLnJlZHVjZShcbiAgICAgICAgKFxuICAgICAgICAgIGFjYzogTXV0YWJsZTxOb25OdWxsYWJsZTxFeGNhbGlkcmF3RWxlbWVudFtcImJvdW5kRWxlbWVudHNcIl0+PixcbiAgICAgICAgICBiaW5kaW5nLFxuICAgICAgICApID0+IHtcbiAgICAgICAgICBjb25zdCBuZXdCaW5kaW5nSWQgPSBtYXliZUdldE5ld0lkKGJpbmRpbmcuaWQpO1xuICAgICAgICAgIGlmIChuZXdCaW5kaW5nSWQpIHtcbiAgICAgICAgICAgIGFjYy5wdXNoKHsgLi4uYmluZGluZywgaWQ6IG5ld0JpbmRpbmdJZCB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGFjYztcbiAgICAgICAgfSxcbiAgICAgICAgW10sXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmIChcImVuZEJpbmRpbmdcIiBpbiBjbG9uZWRFbGVtZW50ICYmIGNsb25lZEVsZW1lbnQuZW5kQmluZGluZykge1xuICAgICAgY29uc3QgbmV3RW5kQmluZGluZ0lkID0gbWF5YmVHZXROZXdJZChjbG9uZWRFbGVtZW50LmVuZEJpbmRpbmcuZWxlbWVudElkKTtcbiAgICAgIGNsb25lZEVsZW1lbnQuZW5kQmluZGluZyA9IG5ld0VuZEJpbmRpbmdJZFxuICAgICAgICA/IHtcbiAgICAgICAgICAgIC4uLmNsb25lZEVsZW1lbnQuZW5kQmluZGluZyxcbiAgICAgICAgICAgIGVsZW1lbnRJZDogbmV3RW5kQmluZGluZ0lkLFxuICAgICAgICAgIH1cbiAgICAgICAgOiBudWxsO1xuICAgIH1cbiAgICBpZiAoXCJzdGFydEJpbmRpbmdcIiBpbiBjbG9uZWRFbGVtZW50ICYmIGNsb25lZEVsZW1lbnQuc3RhcnRCaW5kaW5nKSB7XG4gICAgICBjb25zdCBuZXdFbmRCaW5kaW5nSWQgPSBtYXliZUdldE5ld0lkKFxuICAgICAgICBjbG9uZWRFbGVtZW50LnN0YXJ0QmluZGluZy5lbGVtZW50SWQsXG4gICAgICApO1xuICAgICAgY2xvbmVkRWxlbWVudC5zdGFydEJpbmRpbmcgPSBuZXdFbmRCaW5kaW5nSWRcbiAgICAgICAgPyB7XG4gICAgICAgICAgICAuLi5jbG9uZWRFbGVtZW50LnN0YXJ0QmluZGluZyxcbiAgICAgICAgICAgIGVsZW1lbnRJZDogbmV3RW5kQmluZGluZ0lkLFxuICAgICAgICAgIH1cbiAgICAgICAgOiBudWxsO1xuICAgIH1cblxuICAgIGNsb25lZEVsZW1lbnRzLnB1c2goY2xvbmVkRWxlbWVudCk7XG4gIH1cblxuICByZXR1cm4gY2xvbmVkRWxlbWVudHM7XG59O1xuXG5leHBvcnQgY29uc3QgY29udmVydFRvRXhjYWxpZHJhd0VsZW1lbnRzID0gKFxuICBlbGVtZW50czogSW1wb3J0ZWREYXRhU3RhdGVbXCJlbGVtZW50c1wiXSxcbikgPT4ge1xuICBjb25zdCByZXM6IEV4Y2FsaWRyYXdFbGVtZW50W10gPSBbXTtcbiAgaWYgKCFlbGVtZW50cykge1xuICAgIHJldHVybiBbXTtcbiAgfVxuICBlbGVtZW50cy5mb3JFYWNoKChlbGVtZW50KSA9PiB7XG4gICAgaWYgKCFlbGVtZW50KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChpc1ZhbGlkVGV4dENvbnRhaW5lcihlbGVtZW50KSAmJiBlbGVtZW50Py5sYWJlbD8udGV4dCkge1xuICAgICAgLy9AdHMtaWdub3JlXG4gICAgICBjb25zdCBlbGVtZW50cyA9IGJpbmRUZXh0VG9Db250YWluZXIoZWxlbWVudCwgZWxlbWVudC5sYWJlbCk7XG4gICAgICByZXMucHVzaCguLi5lbGVtZW50cyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxldCBleGNhbGlkcmF3RWxlbWVudDtcbiAgICAgIGlmIChlbGVtZW50LnR5cGUgPT09IFwidGV4dFwiKSB7XG4gICAgICAgIC8vQHRzLWlnbm9yZVxuICAgICAgICBleGNhbGlkcmF3RWxlbWVudCA9IG5ld1RleHRFbGVtZW50KHtcbiAgICAgICAgICAvL0B0cy1pZ25vcmVcbiAgICAgICAgICB4OiAwLFxuICAgICAgICAgIC8vQHRzLWlnbm9yZVxuICAgICAgICAgIHk6IDAsXG4gICAgICAgICAgLi4uZWxlbWVudCxcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2UgaWYgKGVsZW1lbnQudHlwZSA9PT0gXCJhcnJvd1wiIHx8IGVsZW1lbnQudHlwZSA9PT0gXCJsaW5lXCIpIHtcbiAgICAgICAgZXhjYWxpZHJhd0VsZW1lbnQgPSBuZXdMaW5lYXJFbGVtZW50KHtcbiAgICAgICAgICAvL0B0cy1pZ25vcmVcbiAgICAgICAgICB4OiAwLFxuICAgICAgICAgIC8vQHRzLWlnbm9yZVxuICAgICAgICAgIHk6IDAsXG4gICAgICAgICAgLy9AdHMtaWdub3JlXG4gICAgICAgICAgdHlwZTogZWxlbWVudC50eXBlLFxuICAgICAgICAgIC8vQHRzLWlnbm9yZVxuICAgICAgICAgIHdpZHRoOiAyMDAsXG4gICAgICAgICAgLy9AdHMtaWdub3JlXG4gICAgICAgICAgaGVpZ2h0OiAyNCxcbiAgICAgICAgICAvL0B0cy1pZ25vcmUsXG4gICAgICAgICAgZW5kQXJyb3doZWFkOiBlbGVtZW50LnR5cGUgPT09IFwiYXJyb3dcIiA/IFwiYXJyb3dcIiA6IG51bGwsXG4gICAgICAgICAgLy9AdHMtaWdub3JlXG4gICAgICAgICAgcG9pbnRzOiBbXG4gICAgICAgICAgICBbMCwgMF0sXG4gICAgICAgICAgICBbMjAwLCAwXSxcbiAgICAgICAgICBdLFxuICAgICAgICAgIC4uLmVsZW1lbnQsXG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy9AdHMtaWdub3JlXG4gICAgICAgIGV4Y2FsaWRyYXdFbGVtZW50ID0gbmV3RWxlbWVudCh7XG4gICAgICAgICAgeDogMCxcbiAgICAgICAgICB5OiAwLFxuXG4gICAgICAgICAgLi4uZWxlbWVudCxcbiAgICAgICAgICB3aWR0aDpcbiAgICAgICAgICAgIC8vQHRzLWlnbm9yZVxuICAgICAgICAgICAgZWxlbWVudD8ud2lkdGggfHxcbiAgICAgICAgICAgIChFTEVNRU5UU19TVVBQT1JUSU5HX1BST0dSQU1NQVRJQ19BUEkuaW5jbHVkZXMoZWxlbWVudC50eXBlKVxuICAgICAgICAgICAgICA/IDEwMFxuICAgICAgICAgICAgICA6IDApLFxuICAgICAgICAgIGhlaWdodDpcbiAgICAgICAgICAgIC8vQHRzLWlnbm9yZVxuICAgICAgICAgICAgZWxlbWVudD8uaGVpZ2h0IHx8XG4gICAgICAgICAgICAoRUxFTUVOVFNfU1VQUE9SVElOR19QUk9HUkFNTUFUSUNfQVBJLmluY2x1ZGVzKGVsZW1lbnQudHlwZSlcbiAgICAgICAgICAgICAgPyAxMDBcbiAgICAgICAgICAgICAgOiAwKSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICAvL0B0cy1pZ25vcmVcblxuICAgICAgcmVzLnB1c2goZXhjYWxpZHJhd0VsZW1lbnQpO1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiByZXM7XG59O1xuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///../../element/newElement.ts\n");
|
|
3696
3696
|
|
|
3697
3697
|
/***/ }),
|
|
3698
3698
|
|
|
@@ -3758,7 +3758,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
|
|
|
3758
3758
|
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|
3759
3759
|
|
|
3760
3760
|
"use strict";
|
|
3761
|
-
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"bindTextToContainer\": () => (/* binding */ bindTextToContainer),\n/* harmony export */ \"bindTextToShapeAfterDuplication\": () => (/* binding */ bindTextToShapeAfterDuplication),\n/* harmony export */ \"charWidth\": () => (/* binding */ charWidth),\n/* harmony export */ \"computeBoundTextPosition\": () => (/* binding */ computeBoundTextPosition),\n/* harmony export */ \"computeContainerDimensionForBoundText\": () => (/* binding */ computeContainerDimensionForBoundText),\n/* harmony export */ \"detectLineHeight\": () => (/* binding */ detectLineHeight),\n/* harmony export */ \"getApproxCharsToFitInWidth\": () => (/* binding */ getApproxCharsToFitInWidth),\n/* harmony export */ \"getApproxMinLineHeight\": () => (/* binding */ getApproxMinLineHeight),\n/* harmony export */ \"getApproxMinLineWidth\": () => (/* binding */ getApproxMinLineWidth),\n/* harmony export */ \"getBoundTextElement\": () => (/* binding */ getBoundTextElement),\n/* harmony export */ \"getBoundTextElementId\": () => (/* binding */ getBoundTextElementId),\n/* harmony export */ \"getBoundTextElementOffset\": () => (/* binding */ getBoundTextElementOffset),\n/* harmony export */ \"getBoundTextElementPosition\": () => (/* binding */ getBoundTextElementPosition),\n/* harmony export */ \"getBoundTextMaxHeight\": () => (/* binding */ getBoundTextMaxHeight),\n/* harmony export */ \"getBoundTextMaxWidth\": () => (/* binding */ getBoundTextMaxWidth),\n/* harmony export */ \"getContainerCenter\": () => (/* binding */ getContainerCenter),\n/* harmony export */ \"getContainerCoords\": () => (/* binding */ getContainerCoords),\n/* harmony export */ \"getContainerDims\": () => (/* binding */ getContainerDims),\n/* harmony export */ \"getContainerElement\": () => (/* binding */ getContainerElement),\n/* harmony export */ \"getDefaultLineHeight\": () => (/* binding */ getDefaultLineHeight),\n/* harmony export */ \"getLineHeightInPx\": () => (/* binding */ getLineHeightInPx),\n/* harmony export */ \"getMaxCharWidth\": () => (/* binding */ getMaxCharWidth),\n/* harmony export */ \"getMinCharWidth\": () => (/* binding */ getMinCharWidth),\n/* harmony export */ \"getTextBindableContainerAtPosition\": () => (/* binding */ getTextBindableContainerAtPosition),\n/* harmony export */ \"getTextElementAngle\": () => (/* binding */ getTextElementAngle),\n/* harmony export */ \"getTextHeight\": () => (/* binding */ getTextHeight),\n/* harmony export */ \"getTextWidth\": () => (/* binding */ getTextWidth),\n/* harmony export */ \"handleBindTextResize\": () => (/* binding */ handleBindTextResize),\n/* harmony export */ \"isMeasureTextSupported\": () => (/* binding */ isMeasureTextSupported),\n/* harmony export */ \"isValidTextContainer\": () => (/* binding */ isValidTextContainer),\n/* harmony export */ \"measureBaseline\": () => (/* binding */ measureBaseline),\n/* harmony export */ \"measureText\": () => (/* binding */ measureText),\n/* harmony export */ \"normalizeText\": () => (/* binding */ normalizeText),\n/* harmony export */ \"parseTokens\": () => (/* binding */ parseTokens),\n/* harmony export */ \"redrawTextBoundingBox\": () => (/* binding */ redrawTextBoundingBox),\n/* harmony export */ \"shouldAllowVerticalAlign\": () => (/* binding */ shouldAllowVerticalAlign),\n/* harmony export */ \"splitIntoLines\": () => (/* binding */ splitIntoLines),\n/* harmony export */ \"suppportsHorizontalAlign\": () => (/* binding */ suppportsHorizontalAlign),\n/* harmony export */ \"wrapText\": () => (/* binding */ wrapText)\n/* harmony export */ });\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../utils */ \"../../utils.ts\");\n/* harmony import */ var _mutateElement__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./mutateElement */ \"../../element/mutateElement.ts\");\n/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../constants */ \"../../constants.ts\");\n/* harmony import */ var _scene_Scene__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../scene/Scene */ \"../../scene/Scene.ts\");\n/* harmony import */ var ___WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../element */ \"../../element/index.ts\");\n/* harmony import */ var _typeChecks__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./typeChecks */ \"../../element/typeChecks.ts\");\n/* harmony import */ var _linearElementEditor__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./linearElementEditor */ \"../../element/linearElementEditor.ts\");\n/* harmony import */ var _scene__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../scene */ \"../../scene/index.ts\");\n/* harmony import */ var _collision__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./collision */ \"../../element/collision.ts\");\n/* harmony import */ var _textWysiwyg__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./textWysiwyg */ \"../../element/textWysiwyg.tsx\");\n\n\n\n\n\n\n\n\n\n\n\n\nconst normalizeText = (text) => {\n return (text\n // replace tabs with spaces so they render and measure correctly\n .replace(/\\t/g, \" \")\n // normalize newlines\n .replace(/\\r?\\n|\\r/g, \"\\n\"));\n};\nconst splitIntoLines = (text) => {\n return normalizeText(text).split(\"\\n\");\n};\nconst redrawTextBoundingBox = (textElement, container) => {\n let maxWidth = undefined;\n const boundTextUpdates = {\n x: textElement.x,\n y: textElement.y,\n text: textElement.text,\n width: textElement.width,\n height: textElement.height,\n baseline: textElement.baseline,\n };\n boundTextUpdates.text = textElement.text;\n if (container) {\n maxWidth = getBoundTextMaxWidth(container);\n boundTextUpdates.text = wrapText(textElement.originalText, (0,_utils__WEBPACK_IMPORTED_MODULE_0__.getFontString)(textElement), maxWidth);\n }\n const metrics = measureText(boundTextUpdates.text, (0,_utils__WEBPACK_IMPORTED_MODULE_0__.getFontString)(textElement), textElement.lineHeight);\n boundTextUpdates.width = metrics.width;\n boundTextUpdates.height = metrics.height;\n boundTextUpdates.baseline = metrics.baseline;\n if (container) {\n const maxContainerHeight = getBoundTextMaxHeight(container, textElement);\n const maxContainerWidth = getBoundTextMaxWidth(container);\n if (metrics.height > maxContainerHeight) {\n const nextHeight = computeContainerDimensionForBoundText(metrics.height, container.type);\n (0,_mutateElement__WEBPACK_IMPORTED_MODULE_1__.mutateElement)(container, { height: nextHeight });\n (0,_textWysiwyg__WEBPACK_IMPORTED_MODULE_9__.updateOriginalContainerCache)(container.id, nextHeight);\n }\n if (metrics.width > maxContainerWidth) {\n const nextWidth = computeContainerDimensionForBoundText(metrics.width, container.type);\n (0,_mutateElement__WEBPACK_IMPORTED_MODULE_1__.mutateElement)(container, { width: nextWidth });\n }\n const updatedTextElement = Object.assign(Object.assign({}, textElement), boundTextUpdates);\n const { x, y } = computeBoundTextPosition(container, updatedTextElement);\n boundTextUpdates.x = x;\n boundTextUpdates.y = y;\n }\n (0,_mutateElement__WEBPACK_IMPORTED_MODULE_1__.mutateElement)(textElement, boundTextUpdates);\n};\nconst bindTextToShapeAfterDuplication = (sceneElements, oldElements, oldIdToDuplicatedId) => {\n const sceneElementMap = (0,_utils__WEBPACK_IMPORTED_MODULE_0__.arrayToMap)(sceneElements);\n oldElements.forEach((element) => {\n const newElementId = oldIdToDuplicatedId.get(element.id);\n const boundTextElementId = getBoundTextElementId(element);\n if (boundTextElementId) {\n const newTextElementId = oldIdToDuplicatedId.get(boundTextElementId);\n if (newTextElementId) {\n const newContainer = sceneElementMap.get(newElementId);\n if (newContainer) {\n (0,_mutateElement__WEBPACK_IMPORTED_MODULE_1__.mutateElement)(newContainer, {\n boundElements: (element.boundElements || [])\n .filter((boundElement) => boundElement.id !== newTextElementId &&\n boundElement.id !== boundTextElementId)\n .concat({\n type: \"text\",\n id: newTextElementId,\n }),\n });\n }\n const newTextElement = sceneElementMap.get(newTextElementId);\n if (newTextElement && (0,___WEBPACK_IMPORTED_MODULE_4__.isTextElement)(newTextElement)) {\n (0,_mutateElement__WEBPACK_IMPORTED_MODULE_1__.mutateElement)(newTextElement, {\n containerId: newContainer ? newElementId : null,\n });\n }\n }\n }\n });\n};\nconst handleBindTextResize = (container, transformHandleType) => {\n const boundTextElementId = getBoundTextElementId(container);\n if (!boundTextElementId) {\n return;\n }\n (0,_textWysiwyg__WEBPACK_IMPORTED_MODULE_9__.resetOriginalContainerCache)(container.id);\n let textElement = _scene_Scene__WEBPACK_IMPORTED_MODULE_3__[\"default\"].getScene(container).getElement(boundTextElementId);\n if (textElement && textElement.text) {\n if (!container) {\n return;\n }\n textElement = _scene_Scene__WEBPACK_IMPORTED_MODULE_3__[\"default\"].getScene(container).getElement(boundTextElementId);\n let text = textElement.text;\n let nextHeight = textElement.height;\n let nextWidth = textElement.width;\n const containerDims = getContainerDims(container);\n const maxWidth = getBoundTextMaxWidth(container);\n const maxHeight = getBoundTextMaxHeight(container, textElement);\n let containerHeight = containerDims.height;\n let nextBaseLine = textElement.baseline;\n if (transformHandleType !== \"n\" && transformHandleType !== \"s\") {\n if (text) {\n text = wrapText(textElement.originalText, (0,_utils__WEBPACK_IMPORTED_MODULE_0__.getFontString)(textElement), maxWidth);\n }\n const metrics = measureText(text, (0,_utils__WEBPACK_IMPORTED_MODULE_0__.getFontString)(textElement), textElement.lineHeight);\n nextHeight = metrics.height;\n nextWidth = metrics.width;\n nextBaseLine = metrics.baseline;\n }\n // increase height in case text element height exceeds\n if (nextHeight > maxHeight) {\n containerHeight = computeContainerDimensionForBoundText(nextHeight, container.type);\n const diff = containerHeight - containerDims.height;\n // fix the y coord when resizing from ne/nw/n\n const updatedY = !(0,_typeChecks__WEBPACK_IMPORTED_MODULE_5__.isArrowElement)(container) &&\n (transformHandleType === \"ne\" ||\n transformHandleType === \"nw\" ||\n transformHandleType === \"n\")\n ? container.y - diff\n : container.y;\n (0,_mutateElement__WEBPACK_IMPORTED_MODULE_1__.mutateElement)(container, {\n height: containerHeight,\n y: updatedY,\n });\n }\n (0,_mutateElement__WEBPACK_IMPORTED_MODULE_1__.mutateElement)(textElement, {\n text,\n width: nextWidth,\n height: nextHeight,\n baseline: nextBaseLine,\n });\n if (!(0,_typeChecks__WEBPACK_IMPORTED_MODULE_5__.isArrowElement)(container)) {\n (0,_mutateElement__WEBPACK_IMPORTED_MODULE_1__.mutateElement)(textElement, computeBoundTextPosition(container, textElement));\n }\n }\n};\nconst computeBoundTextPosition = (container, boundTextElement) => {\n if ((0,_typeChecks__WEBPACK_IMPORTED_MODULE_5__.isArrowElement)(container)) {\n return _linearElementEditor__WEBPACK_IMPORTED_MODULE_6__.LinearElementEditor.getBoundTextElementPosition(container, boundTextElement);\n }\n const containerCoords = getContainerCoords(container);\n const maxContainerHeight = getBoundTextMaxHeight(container, boundTextElement);\n const maxContainerWidth = getBoundTextMaxWidth(container);\n let x;\n let y;\n if (boundTextElement.verticalAlign === _constants__WEBPACK_IMPORTED_MODULE_2__.VERTICAL_ALIGN.TOP) {\n y = containerCoords.y;\n }\n else if (boundTextElement.verticalAlign === _constants__WEBPACK_IMPORTED_MODULE_2__.VERTICAL_ALIGN.BOTTOM) {\n y = containerCoords.y + (maxContainerHeight - boundTextElement.height);\n }\n else {\n y =\n containerCoords.y +\n (maxContainerHeight / 2 - boundTextElement.height / 2);\n }\n if (boundTextElement.textAlign === _constants__WEBPACK_IMPORTED_MODULE_2__.TEXT_ALIGN.LEFT) {\n x = containerCoords.x;\n }\n else if (boundTextElement.textAlign === _constants__WEBPACK_IMPORTED_MODULE_2__.TEXT_ALIGN.RIGHT) {\n x = containerCoords.x + (maxContainerWidth - boundTextElement.width);\n }\n else {\n x =\n containerCoords.x + (maxContainerWidth / 2 - boundTextElement.width / 2);\n }\n return { x, y };\n};\n// https://github.com/grassator/canvas-text-editor/blob/master/lib/FontMetrics.js\nconst measureText = (text, font, lineHeight) => {\n text = text\n .split(\"\\n\")\n // replace empty lines with single space because leading/trailing empty\n // lines would be stripped from computation\n .map((x) => x || \" \")\n .join(\"\\n\");\n const fontSize = parseFloat(font);\n const height = getTextHeight(text, fontSize, lineHeight);\n const width = getTextWidth(text, font);\n const baseline = measureBaseline(text, font, lineHeight);\n return { width, height, baseline };\n};\nconst measureBaseline = (text, font, lineHeight, wrapInContainer) => {\n const container = document.createElement(\"div\");\n container.style.position = \"absolute\";\n container.style.whiteSpace = \"pre\";\n container.style.font = font;\n container.style.minHeight = \"1em\";\n if (wrapInContainer) {\n container.style.overflow = \"hidden\";\n container.style.wordBreak = \"break-word\";\n container.style.whiteSpace = \"pre-wrap\";\n }\n container.style.lineHeight = String(lineHeight);\n container.innerText = text;\n // Baseline is important for positioning text on canvas\n document.body.appendChild(container);\n const span = document.createElement(\"span\");\n span.style.display = \"inline-block\";\n span.style.overflow = \"hidden\";\n span.style.width = \"1px\";\n span.style.height = \"1px\";\n container.appendChild(span);\n let baseline = span.offsetTop + span.offsetHeight;\n const height = container.offsetHeight;\n if (_constants__WEBPACK_IMPORTED_MODULE_2__.isSafari) {\n const canvasHeight = getTextHeight(text, parseFloat(font), lineHeight);\n const fontSize = parseFloat(font);\n // In Safari the font size gets rounded off when rendering hence calculating the safari height and shifting the baseline if it differs\n // from the actual canvas height\n const domHeight = getTextHeight(text, Math.round(fontSize), lineHeight);\n if (canvasHeight > height) {\n baseline += canvasHeight - domHeight;\n }\n if (height > canvasHeight) {\n baseline -= domHeight - canvasHeight;\n }\n }\n document.body.removeChild(container);\n return baseline;\n};\n/**\n * To get unitless line-height (if unknown) we can calculate it by dividing\n * height-per-line by fontSize.\n */\nconst detectLineHeight = (textElement) => {\n const lineCount = splitIntoLines(textElement.text).length;\n return (textElement.height /\n lineCount /\n textElement.fontSize);\n};\n/**\n * We calculate the line height from the font size and the unitless line height,\n * aligning with the W3C spec.\n */\nconst getLineHeightInPx = (fontSize, lineHeight) => {\n return fontSize * lineHeight;\n};\n// FIXME rename to getApproxMinContainerHeight\nconst getApproxMinLineHeight = (fontSize, lineHeight) => {\n return getLineHeightInPx(fontSize, lineHeight) + _constants__WEBPACK_IMPORTED_MODULE_2__.BOUND_TEXT_PADDING * 2;\n};\nlet canvas;\nconst getLineWidth = (text, font) => {\n if (!canvas) {\n canvas = document.createElement(\"canvas\");\n }\n const canvas2dContext = canvas.getContext(\"2d\");\n canvas2dContext.font = font;\n const width = canvas2dContext.measureText(text).width;\n // since in test env the canvas measureText algo\n // doesn't measure text and instead just returns number of\n // characters hence we assume that each letteris 10px\n if ((0,_utils__WEBPACK_IMPORTED_MODULE_0__.isTestEnv)()) {\n return width * 10;\n }\n return width;\n};\nconst getTextWidth = (text, font) => {\n const lines = splitIntoLines(text);\n let width = 0;\n lines.forEach((line) => {\n width = Math.max(width, getLineWidth(line, font));\n });\n return width;\n};\nconst getTextHeight = (text, fontSize, lineHeight) => {\n const lineCount = splitIntoLines(text).length;\n return getLineHeightInPx(fontSize, lineHeight) * lineCount;\n};\nconst parseTokens = (text) => {\n // Splitting words containing \"-\" as those are treated as separate words\n // by css wrapping algorithm eg non-profit => non-, profit\n const words = text.split(\"-\");\n if (words.length > 1) {\n // non-proft org => ['non-', 'profit org']\n words.forEach((word, index) => {\n if (index !== words.length - 1) {\n words[index] = word += \"-\";\n }\n });\n }\n // Joining the words with space and splitting them again with space to get the\n // final list of tokens\n // ['non-', 'profit org'] =>,'non- proft org' => ['non-','profit','org']\n return words.join(\" \").split(\" \");\n};\nconst wrapText = (text, font, maxWidth) => {\n // if maxWidth is not finite or NaN which can happen in case of bugs in\n // computation, we need to make sure we don't continue as we'll end up\n // in an infinite loop\n if (!Number.isFinite(maxWidth) || maxWidth < 0) {\n return text;\n }\n const lines = [];\n const originalLines = text.split(\"\\n\");\n const spaceWidth = getLineWidth(\" \", font);\n let currentLine = \"\";\n let currentLineWidthTillNow = 0;\n const push = (str) => {\n if (str.trim()) {\n lines.push(str);\n }\n };\n const resetParams = () => {\n currentLine = \"\";\n currentLineWidthTillNow = 0;\n };\n originalLines.forEach((originalLine) => {\n const currentLineWidth = getTextWidth(originalLine, font);\n // Push the line if its <= maxWidth\n if (currentLineWidth <= maxWidth) {\n lines.push(originalLine);\n return; // continue\n }\n const words = parseTokens(originalLine);\n resetParams();\n let index = 0;\n while (index < words.length) {\n const currentWordWidth = getLineWidth(words[index], font);\n // This will only happen when single word takes entire width\n if (currentWordWidth === maxWidth) {\n push(words[index]);\n index++;\n }\n // Start breaking longer words exceeding max width\n else if (currentWordWidth > maxWidth) {\n // push current line since the current word exceeds the max width\n // so will be appended in next line\n push(currentLine);\n resetParams();\n while (words[index].length > 0) {\n const currentChar = String.fromCodePoint(words[index].codePointAt(0));\n const width = charWidth.calculate(currentChar, font);\n currentLineWidthTillNow += width;\n words[index] = words[index].slice(currentChar.length);\n if (currentLineWidthTillNow >= maxWidth) {\n push(currentLine);\n currentLine = currentChar;\n currentLineWidthTillNow = width;\n }\n else {\n currentLine += currentChar;\n }\n }\n // push current line if appending space exceeds max width\n if (currentLineWidthTillNow + spaceWidth >= maxWidth) {\n push(currentLine);\n resetParams();\n // space needs to be appended before next word\n // as currentLine contains chars which couldn't be appended\n // to previous line unless the line ends with hyphen to sync\n // with css word-wrap\n }\n else if (!currentLine.endsWith(\"-\")) {\n currentLine += \" \";\n currentLineWidthTillNow += spaceWidth;\n }\n index++;\n }\n else {\n // Start appending words in a line till max width reached\n while (currentLineWidthTillNow < maxWidth && index < words.length) {\n const word = words[index];\n currentLineWidthTillNow = getLineWidth(currentLine + word, font);\n if (currentLineWidthTillNow > maxWidth) {\n push(currentLine);\n resetParams();\n break;\n }\n index++;\n // if word ends with \"-\" then we don't need to add space\n // to sync with css word-wrap\n const shouldAppendSpace = !word.endsWith(\"-\");\n currentLine += word;\n if (shouldAppendSpace) {\n currentLine += \" \";\n }\n // Push the word if appending space exceeds max width\n if (currentLineWidthTillNow + spaceWidth >= maxWidth) {\n if (shouldAppendSpace) {\n lines.push(currentLine.slice(0, -1));\n }\n else {\n lines.push(currentLine);\n }\n resetParams();\n break;\n }\n }\n }\n }\n if (currentLine.slice(-1) === \" \") {\n // only remove last trailing space which we have added when joining words\n currentLine = currentLine.slice(0, -1);\n push(currentLine);\n }\n });\n return lines.join(\"\\n\");\n};\nconst charWidth = (() => {\n const cachedCharWidth = {};\n const calculate = (char, font) => {\n const ascii = char.charCodeAt(0);\n if (!cachedCharWidth[font]) {\n cachedCharWidth[font] = [];\n }\n if (!cachedCharWidth[font][ascii]) {\n const width = getLineWidth(char, font);\n cachedCharWidth[font][ascii] = width;\n }\n return cachedCharWidth[font][ascii];\n };\n const getCache = (font) => {\n return cachedCharWidth[font];\n };\n return {\n calculate,\n getCache,\n };\n})();\nconst DUMMY_TEXT = \"ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\".toLocaleUpperCase();\n// FIXME rename to getApproxMinContainerWidth\nconst getApproxMinLineWidth = (font, lineHeight) => {\n const maxCharWidth = getMaxCharWidth(font);\n if (maxCharWidth === 0) {\n return (measureText(DUMMY_TEXT.split(\"\").join(\"\\n\"), font, lineHeight).width +\n _constants__WEBPACK_IMPORTED_MODULE_2__.BOUND_TEXT_PADDING * 2);\n }\n return maxCharWidth + _constants__WEBPACK_IMPORTED_MODULE_2__.BOUND_TEXT_PADDING * 2;\n};\nconst getMinCharWidth = (font) => {\n const cache = charWidth.getCache(font);\n if (!cache) {\n return 0;\n }\n const cacheWithOutEmpty = cache.filter((val) => val !== undefined);\n return Math.min(...cacheWithOutEmpty);\n};\nconst getMaxCharWidth = (font) => {\n const cache = charWidth.getCache(font);\n if (!cache) {\n return 0;\n }\n const cacheWithOutEmpty = cache.filter((val) => val !== undefined);\n return Math.max(...cacheWithOutEmpty);\n};\nconst getApproxCharsToFitInWidth = (font, width) => {\n // Generally lower case is used so converting to lower case\n const dummyText = DUMMY_TEXT.toLocaleLowerCase();\n const batchLength = 6;\n let index = 0;\n let widthTillNow = 0;\n let str = \"\";\n while (widthTillNow <= width) {\n const batch = dummyText.substr(index, index + batchLength);\n str += batch;\n widthTillNow += getLineWidth(str, font);\n if (index === dummyText.length - 1) {\n index = 0;\n }\n index = index + batchLength;\n }\n while (widthTillNow > width) {\n str = str.substr(0, str.length - 1);\n widthTillNow = getLineWidth(str, font);\n }\n return str.length;\n};\nconst getBoundTextElementId = (container) => {\n var _a, _b, _c;\n return ((_a = container === null || container === void 0 ? void 0 : container.boundElements) === null || _a === void 0 ? void 0 : _a.length)\n ? ((_c = (_b = container === null || container === void 0 ? void 0 : container.boundElements) === null || _b === void 0 ? void 0 : _b.filter((ele) => ele.type === \"text\")[0]) === null || _c === void 0 ? void 0 : _c.id) ||\n null\n : null;\n};\nconst getBoundTextElement = (element) => {\n var _a;\n if (!element) {\n return null;\n }\n const boundTextElementId = getBoundTextElementId(element);\n if (boundTextElementId) {\n return (((_a = _scene_Scene__WEBPACK_IMPORTED_MODULE_3__[\"default\"].getScene(element)) === null || _a === void 0 ? void 0 : _a.getElement(boundTextElementId)) || null);\n }\n return null;\n};\nconst getContainerElement = (element) => {\n var _a;\n if (!element) {\n return null;\n }\n if (element.containerId) {\n return ((_a = _scene_Scene__WEBPACK_IMPORTED_MODULE_3__[\"default\"].getScene(element)) === null || _a === void 0 ? void 0 : _a.getElement(element.containerId)) || null;\n }\n return null;\n};\nconst getContainerDims = (element) => {\n const MIN_WIDTH = 300;\n if ((0,_typeChecks__WEBPACK_IMPORTED_MODULE_5__.isArrowElement)(element)) {\n const width = Math.max(element.width, MIN_WIDTH);\n const height = element.height;\n return { width, height };\n }\n return { width: element.width, height: element.height };\n};\nconst getContainerCenter = (container, appState) => {\n if (!(0,_typeChecks__WEBPACK_IMPORTED_MODULE_5__.isArrowElement)(container)) {\n return {\n x: container.x + container.width / 2,\n y: container.y + container.height / 2,\n };\n }\n const points = _linearElementEditor__WEBPACK_IMPORTED_MODULE_6__.LinearElementEditor.getPointsGlobalCoordinates(container);\n if (points.length % 2 === 1) {\n const index = Math.floor(container.points.length / 2);\n const midPoint = _linearElementEditor__WEBPACK_IMPORTED_MODULE_6__.LinearElementEditor.getPointGlobalCoordinates(container, container.points[index]);\n return { x: midPoint[0], y: midPoint[1] };\n }\n const index = container.points.length / 2 - 1;\n let midSegmentMidpoint = _linearElementEditor__WEBPACK_IMPORTED_MODULE_6__.LinearElementEditor.getEditorMidPoints(container, appState)[index];\n if (!midSegmentMidpoint) {\n midSegmentMidpoint = _linearElementEditor__WEBPACK_IMPORTED_MODULE_6__.LinearElementEditor.getSegmentMidPoint(container, points[index], points[index + 1], index + 1);\n }\n return { x: midSegmentMidpoint[0], y: midSegmentMidpoint[1] };\n};\nconst getContainerCoords = (container) => {\n let offsetX = _constants__WEBPACK_IMPORTED_MODULE_2__.BOUND_TEXT_PADDING;\n let offsetY = _constants__WEBPACK_IMPORTED_MODULE_2__.BOUND_TEXT_PADDING;\n if (container.type === \"ellipse\") {\n // The derivation of coordinates is explained in https://github.com/excalidraw/excalidraw/pull/6172\n offsetX += (container.width / 2) * (1 - Math.sqrt(2) / 2);\n offsetY += (container.height / 2) * (1 - Math.sqrt(2) / 2);\n }\n // The derivation of coordinates is explained in https://github.com/excalidraw/excalidraw/pull/6265\n if (container.type === \"diamond\") {\n offsetX += container.width / 4;\n offsetY += container.height / 4;\n }\n return {\n x: container.x + offsetX,\n y: container.y + offsetY,\n };\n};\nconst getTextElementAngle = (textElement) => {\n const container = getContainerElement(textElement);\n if (!container || (0,_typeChecks__WEBPACK_IMPORTED_MODULE_5__.isArrowElement)(container)) {\n return textElement.angle;\n }\n return container.angle;\n};\nconst getBoundTextElementOffset = (boundTextElement) => {\n const container = getContainerElement(boundTextElement);\n if (!container || !boundTextElement) {\n return 0;\n }\n if ((0,_typeChecks__WEBPACK_IMPORTED_MODULE_5__.isArrowElement)(container)) {\n return _constants__WEBPACK_IMPORTED_MODULE_2__.BOUND_TEXT_PADDING * 8;\n }\n return _constants__WEBPACK_IMPORTED_MODULE_2__.BOUND_TEXT_PADDING;\n};\nconst getBoundTextElementPosition = (container, boundTextElement) => {\n if ((0,_typeChecks__WEBPACK_IMPORTED_MODULE_5__.isArrowElement)(container)) {\n return _linearElementEditor__WEBPACK_IMPORTED_MODULE_6__.LinearElementEditor.getBoundTextElementPosition(container, boundTextElement);\n }\n};\nconst shouldAllowVerticalAlign = (selectedElements) => {\n return selectedElements.some((element) => {\n const hasBoundContainer = (0,_typeChecks__WEBPACK_IMPORTED_MODULE_5__.isBoundToContainer)(element);\n if (hasBoundContainer) {\n const container = getContainerElement(element);\n if ((0,___WEBPACK_IMPORTED_MODULE_4__.isTextElement)(element) && (0,_typeChecks__WEBPACK_IMPORTED_MODULE_5__.isArrowElement)(container)) {\n return false;\n }\n return true;\n }\n return false;\n });\n};\nconst suppportsHorizontalAlign = (selectedElements) => {\n return selectedElements.some((element) => {\n const hasBoundContainer = (0,_typeChecks__WEBPACK_IMPORTED_MODULE_5__.isBoundToContainer)(element);\n if (hasBoundContainer) {\n const container = getContainerElement(element);\n if ((0,___WEBPACK_IMPORTED_MODULE_4__.isTextElement)(element) && (0,_typeChecks__WEBPACK_IMPORTED_MODULE_5__.isArrowElement)(container)) {\n return false;\n }\n return true;\n }\n return (0,___WEBPACK_IMPORTED_MODULE_4__.isTextElement)(element);\n });\n};\nconst getTextBindableContainerAtPosition = (elements, appState, x, y) => {\n const selectedElements = (0,_scene__WEBPACK_IMPORTED_MODULE_7__.getSelectedElements)(elements, appState);\n if (selectedElements.length === 1) {\n return (0,_typeChecks__WEBPACK_IMPORTED_MODULE_5__.isTextBindableContainer)(selectedElements[0], false)\n ? selectedElements[0]\n : null;\n }\n let hitElement = null;\n // We need to to hit testing from front (end of the array) to back (beginning of the array)\n for (let index = elements.length - 1; index >= 0; --index) {\n if (elements[index].isDeleted) {\n continue;\n }\n const [x1, y1, x2, y2] = (0,___WEBPACK_IMPORTED_MODULE_4__.getElementAbsoluteCoords)(elements[index]);\n if ((0,_typeChecks__WEBPACK_IMPORTED_MODULE_5__.isArrowElement)(elements[index]) &&\n (0,_collision__WEBPACK_IMPORTED_MODULE_8__.isHittingElementNotConsideringBoundingBox)(elements[index], appState, [\n x,\n y,\n ])) {\n hitElement = elements[index];\n break;\n }\n else if (x1 < x && x < x2 && y1 < y && y < y2) {\n hitElement = elements[index];\n break;\n }\n }\n return (0,_typeChecks__WEBPACK_IMPORTED_MODULE_5__.isTextBindableContainer)(hitElement, false) ? hitElement : null;\n};\nconst VALID_CONTAINER_TYPES = new Set([\n \"rectangle\",\n \"ellipse\",\n \"diamond\",\n \"image\",\n \"arrow\",\n]);\nconst isValidTextContainer = (element) => VALID_CONTAINER_TYPES.has(element.type);\nconst computeContainerDimensionForBoundText = (dimension, containerType) => {\n dimension = Math.ceil(dimension);\n const padding = _constants__WEBPACK_IMPORTED_MODULE_2__.BOUND_TEXT_PADDING * 2;\n if (containerType === \"ellipse\") {\n return Math.round(((dimension + padding) / Math.sqrt(2)) * 2);\n }\n if (containerType === \"arrow\") {\n return dimension + padding * 8;\n }\n if (containerType === \"diamond\") {\n return 2 * (dimension + padding);\n }\n return dimension + padding;\n};\nconst getBoundTextMaxWidth = (container) => {\n const width = getContainerDims(container).width;\n if ((0,_typeChecks__WEBPACK_IMPORTED_MODULE_5__.isArrowElement)(container)) {\n return width - _constants__WEBPACK_IMPORTED_MODULE_2__.BOUND_TEXT_PADDING * 8 * 2;\n }\n if (container.type === \"ellipse\") {\n // The width of the largest rectangle inscribed inside an ellipse is\n // Math.round((ellipse.width / 2) * Math.sqrt(2)) which is derived from\n // equation of an ellipse -https://github.com/excalidraw/excalidraw/pull/6172\n return Math.round((width / 2) * Math.sqrt(2)) - _constants__WEBPACK_IMPORTED_MODULE_2__.BOUND_TEXT_PADDING * 2;\n }\n if (container.type === \"diamond\") {\n // The width of the largest rectangle inscribed inside a rhombus is\n // Math.round(width / 2) - https://github.com/excalidraw/excalidraw/pull/6265\n return Math.round(width / 2) - _constants__WEBPACK_IMPORTED_MODULE_2__.BOUND_TEXT_PADDING * 2;\n }\n return width - _constants__WEBPACK_IMPORTED_MODULE_2__.BOUND_TEXT_PADDING * 2;\n};\nconst getBoundTextMaxHeight = (container, boundTextElement) => {\n const height = getContainerDims(container).height;\n if ((0,_typeChecks__WEBPACK_IMPORTED_MODULE_5__.isArrowElement)(container)) {\n const containerHeight = height - _constants__WEBPACK_IMPORTED_MODULE_2__.BOUND_TEXT_PADDING * 8 * 2;\n if (containerHeight <= 0) {\n return boundTextElement.height;\n }\n return height;\n }\n if (container.type === \"ellipse\") {\n // The height of the largest rectangle inscribed inside an ellipse is\n // Math.round((ellipse.height / 2) * Math.sqrt(2)) which is derived from\n // equation of an ellipse - https://github.com/excalidraw/excalidraw/pull/6172\n return Math.round((height / 2) * Math.sqrt(2)) - _constants__WEBPACK_IMPORTED_MODULE_2__.BOUND_TEXT_PADDING * 2;\n }\n if (container.type === \"diamond\") {\n // The height of the largest rectangle inscribed inside a rhombus is\n // Math.round(height / 2) - https://github.com/excalidraw/excalidraw/pull/6265\n return Math.round(height / 2) - _constants__WEBPACK_IMPORTED_MODULE_2__.BOUND_TEXT_PADDING * 2;\n }\n return height - _constants__WEBPACK_IMPORTED_MODULE_2__.BOUND_TEXT_PADDING * 2;\n};\nconst isMeasureTextSupported = () => {\n const width = getTextWidth(DUMMY_TEXT, (0,_utils__WEBPACK_IMPORTED_MODULE_0__.getFontString)({\n fontSize: _constants__WEBPACK_IMPORTED_MODULE_2__.DEFAULT_FONT_SIZE,\n fontFamily: _constants__WEBPACK_IMPORTED_MODULE_2__.DEFAULT_FONT_FAMILY,\n }));\n return width > 0;\n};\n/**\n * Unitless line height\n *\n * In previous versions we used `normal` line height, which browsers interpret\n * differently, and based on font-family and font-size.\n *\n * To make line heights consistent across browsers we hardcode the values for\n * each of our fonts based on most common average line-heights.\n * See https://github.com/excalidraw/excalidraw/pull/6360#issuecomment-1477635971\n * where the values come from.\n */\nconst DEFAULT_LINE_HEIGHT = {\n // ~1.25 is the average for Virgil in WebKit and Blink.\n // Gecko (FF) uses ~1.28.\n [_constants__WEBPACK_IMPORTED_MODULE_2__.FONT_FAMILY.Virgil]: 1.25,\n // ~1.15 is the average for Virgil in WebKit and Blink.\n // Gecko if all over the place.\n [_constants__WEBPACK_IMPORTED_MODULE_2__.FONT_FAMILY.Helvetica]: 1.15,\n // ~1.2 is the average for Virgil in WebKit and Blink, and kinda Gecko too\n [_constants__WEBPACK_IMPORTED_MODULE_2__.FONT_FAMILY.Cascadia]: 1.2,\n};\nconst getDefaultLineHeight = (fontFamily) => {\n if (fontFamily in DEFAULT_LINE_HEIGHT) {\n return DEFAULT_LINE_HEIGHT[fontFamily];\n }\n return DEFAULT_LINE_HEIGHT[_constants__WEBPACK_IMPORTED_MODULE_2__.DEFAULT_FONT_FAMILY];\n};\nconst bindTextToContainer = (containerProps, textProps) => {\n const container = (0,___WEBPACK_IMPORTED_MODULE_4__.newElement)(Object.assign({ x: 0, y: 0 }, containerProps));\n const textElement = (0,___WEBPACK_IMPORTED_MODULE_4__.newTextElement)(Object.assign(Object.assign({ x: 0, y: 0 }, textProps), { containerId: container.id, textAlign: _constants__WEBPACK_IMPORTED_MODULE_2__.TEXT_ALIGN.CENTER, verticalAlign: _constants__WEBPACK_IMPORTED_MODULE_2__.VERTICAL_ALIGN.MIDDLE }));\n (0,_mutateElement__WEBPACK_IMPORTED_MODULE_1__.mutateElement)(container, {\n boundElements: (container.boundElements || []).concat({\n type: \"text\",\n id: textElement.id,\n }),\n });\n redrawTextBoundingBox(textElement, container);\n return [container, textElement];\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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QVMsRUFBRSxXQUFXLENBQUMsQ0FBQztBQUNsQyxDQUFDLENBQUMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi4vLi4vZWxlbWVudC90ZXh0RWxlbWVudC50cz80MmQyIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGdldEZvbnRTdHJpbmcsIGFycmF5VG9NYXAsIGlzVGVzdEVudiB9IGZyb20gXCIuLi91dGlsc1wiO1xuaW1wb3J0IHtcbiAgRXhjYWxpZHJhd0VsZW1lbnQsXG4gIEV4Y2FsaWRyYXdHZW5lcmljRWxlbWVudCxcbiAgRXhjYWxpZHJhd1RleHRDb250YWluZXIsXG4gIEV4Y2FsaWRyYXdUZXh0RWxlbWVudCxcbiAgRXhjYWxpZHJhd1RleHRFbGVtZW50V2l0aENvbnRhaW5lcixcbiAgRm9udEZhbWlseVZhbHVlcyxcbiAgRm9udFN0cmluZyxcbiAgTm9uRGVsZXRlZEV4Y2FsaWRyYXdFbGVtZW50LFxufSBmcm9tIFwiLi90eXBlc1wiO1xuaW1wb3J0IHsgbXV0YXRlRWxlbWVudCB9IGZyb20gXCIuL211dGF0ZUVsZW1lbnRcIjtcbmltcG9ydCB7XG4gIEJPVU5EX1RFWFRfUEFERElORyxcbiAgREVGQVVMVF9GT05UX0ZBTUlMWSxcbiAgREVGQVVMVF9GT05UX1NJWkUsXG4gIEZPTlRfRkFNSUxZLFxuICBpc1NhZmFyaSxcbiAgVEVYVF9BTElHTixcbiAgVkVSVElDQUxfQUxJR04sXG59IGZyb20gXCIuLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IE1heWJlVHJhbnNmb3JtSGFuZGxlVHlwZSB9IGZyb20gXCIuL3RyYW5zZm9ybUhhbmRsZXNcIjtcbmltcG9ydCBTY2VuZSBmcm9tIFwiLi4vc2NlbmUvU2NlbmVcIjtcbmltcG9ydCB7IGlzVGV4dEVsZW1lbnQsIG5ld0VsZW1lbnQsIG5ld1RleHRFbGVtZW50IH0gZnJvbSBcIi5cIjtcbmltcG9ydCB7IGlzQm91bmRUb0NvbnRhaW5lciwgaXNBcnJvd0VsZW1lbnQgfSBmcm9tIFwiLi90eXBlQ2hlY2tzXCI7XG5pbXBvcnQgeyBMaW5lYXJFbGVtZW50RWRpdG9yIH0gZnJvbSBcIi4vbGluZWFyRWxlbWVudEVkaXRvclwiO1xuaW1wb3J0IHsgQXBwU3RhdGUgfSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7IGlzVGV4dEJpbmRhYmxlQ29udGFpbmVyIH0gZnJvbSBcIi4vdHlwZUNoZWNrc1wiO1xuaW1wb3J0IHsgZ2V0RWxlbWVudEFic29sdXRlQ29vcmRzIH0gZnJvbSBcIi4uL2VsZW1lbnRcIjtcbmltcG9ydCB7IGdldFNlbGVjdGVkRWxlbWVudHMgfSBmcm9tIFwiLi4vc2NlbmVcIjtcbmltcG9ydCB7IGlzSGl0dGluZ0VsZW1lbnROb3RDb25zaWRlcmluZ0JvdW5kaW5nQm94IH0gZnJvbSBcIi4vY29sbGlzaW9uXCI7XG5pbXBvcnQge1xuICByZXNldE9yaWdpbmFsQ29udGFpbmVyQ2FjaGUsXG4gIHVwZGF0ZU9yaWdpbmFsQ29udGFpbmVyQ2FjaGUsXG59IGZyb20gXCIuL3RleHRXeXNpd3lnXCI7XG5pbXBvcnQgeyBFeHRyYWN0U2V0VHlwZSwgTWFya09wdGlvbmFsIH0gZnJvbSBcIi4uL3V0aWxpdHktdHlwZXNcIjtcbmltcG9ydCB7IEVsZW1lbnRDb25zdHJ1Y3Rvck9wdHMgfSBmcm9tIFwiLi9uZXdFbGVtZW50XCI7XG5cbmV4cG9ydCBjb25zdCBub3JtYWxpemVUZXh0ID0gKHRleHQ6IHN0cmluZykgPT4ge1xuICByZXR1cm4gKFxuICAgIHRleHRcbiAgICAgIC8vIHJlcGxhY2UgdGFicyB3aXRoIHNwYWNlcyBzbyB0aGV5IHJlbmRlciBhbmQgbWVhc3VyZSBjb3JyZWN0bHlcbiAgICAgIC5yZXBsYWNlKC9cXHQvZywgXCIgICAgICAgIFwiKVxuICAgICAgLy8gbm9ybWFsaXplIG5ld2xpbmVzXG4gICAgICAucmVwbGFjZSgvXFxyP1xcbnxcXHIvZywgXCJcXG5cIilcbiAgKTtcbn07XG5cbmV4cG9ydCBjb25zdCBzcGxpdEludG9MaW5lcyA9ICh0ZXh0OiBzdHJpbmcpID0+IHtcbiAgcmV0dXJuIG5vcm1hbGl6ZVRleHQodGV4dCkuc3BsaXQoXCJcXG5cIik7XG59O1xuXG5leHBvcnQgY29uc3QgcmVkcmF3VGV4dEJvdW5kaW5nQm94ID0gKFxuICB0ZXh0RWxlbWVudDogRXhjYWxpZHJhd1RleHRFbGVtZW50LFxuICBjb250YWluZXI6IEV4Y2FsaWRyYXdFbGVtZW50IHwgbnVsbCxcbikgPT4ge1xuICBsZXQgbWF4V2lkdGggPSB1bmRlZmluZWQ7XG4gIGNvbnN0IGJvdW5kVGV4dFVwZGF0ZXMgPSB7XG4gICAgeDogdGV4dEVsZW1lbnQueCxcbiAgICB5OiB0ZXh0RWxlbWVudC55LFxuICAgIHRleHQ6IHRleHRFbGVtZW50LnRleHQsXG4gICAgd2lkdGg6IHRleHRFbGVtZW50LndpZHRoLFxuICAgIGhlaWdodDogdGV4dEVsZW1lbnQuaGVpZ2h0LFxuICAgIGJhc2VsaW5lOiB0ZXh0RWxlbWVudC5iYXNlbGluZSxcbiAgfTtcblxuICBib3VuZFRleHRVcGRhdGVzLnRleHQgPSB0ZXh0RWxlbWVudC50ZXh0O1xuXG4gIGlmIChjb250YWluZXIpIHtcbiAgICBtYXhXaWR0aCA9IGdldEJvdW5kVGV4dE1heFdpZHRoKGNvbnRhaW5lcik7XG4gICAgYm91bmRUZXh0VXBkYXRlcy50ZXh0ID0gd3JhcFRleHQoXG4gICAgICB0ZXh0RWxlbWVudC5vcmlnaW5hbFRleHQsXG4gICAgICBnZXRGb250U3RyaW5nKHRleHRFbGVtZW50KSxcbiAgICAgIG1heFdpZHRoLFxuICAgICk7XG4gIH1cbiAgY29uc3QgbWV0cmljcyA9IG1lYXN1cmVUZXh0KFxuICAgIGJvdW5kVGV4dFVwZGF0ZXMudGV4dCxcbiAgICBnZXRGb250U3RyaW5nKHRleHRFbGVtZW50KSxcbiAgICB0ZXh0RWxlbWVudC5saW5lSGVpZ2h0LFxuICApO1xuXG4gIGJvdW5kVGV4dFVwZGF0ZXMud2lkdGggPSBtZXRyaWNzLndpZHRoO1xuICBib3VuZFRleHRVcGRhdGVzLmhlaWdodCA9IG1ldHJpY3MuaGVpZ2h0O1xuICBib3VuZFRleHRVcGRhdGVzLmJhc2VsaW5lID0gbWV0cmljcy5iYXNlbGluZTtcblxuICBpZiAoY29udGFpbmVyKSB7XG4gICAgY29uc3QgbWF4Q29udGFpbmVySGVpZ2h0ID0gZ2V0Qm91bmRUZXh0TWF4SGVpZ2h0KFxuICAgICAgY29udGFpbmVyLFxuICAgICAgdGV4dEVsZW1lbnQgYXMgRXhjYWxpZHJhd1RleHRFbGVtZW50V2l0aENvbnRhaW5lcixcbiAgICApO1xuICAgIGNvbnN0IG1heENvbnRhaW5lcldpZHRoID0gZ2V0Qm91bmRUZXh0TWF4V2lkdGgoY29udGFpbmVyKTtcblxuICAgIGlmIChtZXRyaWNzLmhlaWdodCA+IG1heENvbnRhaW5lckhlaWdodCkge1xuICAgICAgY29uc3QgbmV4dEhlaWdodCA9IGNvbXB1dGVDb250YWluZXJEaW1lbnNpb25Gb3JCb3VuZFRleHQoXG4gICAgICAgIG1ldHJpY3MuaGVpZ2h0LFxuICAgICAgICBjb250YWluZXIudHlwZSxcbiAgICAgICk7XG4gICAgICBtdXRhdGVFbGVtZW50KGNvbnRhaW5lciwgeyBoZWlnaHQ6IG5leHRIZWlnaHQgfSk7XG4gICAgICB1cGRhdGVPcmlnaW5hbENvbnRhaW5lckNhY2hlKGNvbnRhaW5lci5pZCwgbmV4dEhlaWdodCk7XG4gICAgfVxuICAgIGlmIChtZXRyaWNzLndpZHRoID4gbWF4Q29udGFpbmVyV2lkdGgpIHtcbiAgICAgIGNvbnN0IG5leHRXaWR0aCA9IGNvbXB1dGVDb250YWluZXJEaW1lbnNpb25Gb3JCb3VuZFRleHQoXG4gICAgICAgIG1ldHJpY3Mud2lkdGgsXG4gICAgICAgIGNvbnRhaW5lci50eXBlLFxuICAgICAgKTtcbiAgICAgIG11dGF0ZUVsZW1lbnQoY29udGFpbmVyLCB7IHdpZHRoOiBuZXh0V2lkdGggfSk7XG4gICAgfVxuICAgIGNvbnN0IHVwZGF0ZWRUZXh0RWxlbWVudCA9IHtcbiAgICAgIC4uLnRleHRFbGVtZW50LFxuICAgICAgLi4uYm91bmRUZXh0VXBkYXRlcyxcbiAgICB9IGFzIEV4Y2FsaWRyYXdUZXh0RWxlbWVudFdpdGhDb250YWluZXI7XG4gICAgY29uc3QgeyB4LCB5IH0gPSBjb21wdXRlQm91bmRUZXh0UG9zaXRpb24oY29udGFpbmVyLCB1cGRhdGVkVGV4dEVsZW1lbnQpO1xuICAgIGJvdW5kVGV4dFVwZGF0ZXMueCA9IHg7XG4gICAgYm91bmRUZXh0VXBkYXRlcy55ID0geTtcbiAgfVxuXG4gIG11dGF0ZUVsZW1lbnQodGV4dEVsZW1lbnQsIGJvdW5kVGV4dFVwZGF0ZXMpO1xufTtcblxuZXhwb3J0IGNvbnN0IGJpbmRUZXh0VG9TaGFwZUFmdGVyRHVwbGljYXRpb24gPSAoXG4gIHNjZW5lRWxlbWVudHM6IEV4Y2FsaWRyYXdFbGVtZW50W10sXG4gIG9sZEVsZW1lbnRzOiBFeGNhbGlkcmF3RWxlbWVudFtdLFxuICBvbGRJZFRvRHVwbGljYXRlZElkOiBNYXA8RXhjYWxpZHJhd0VsZW1lbnRbXCJpZFwiXSwgRXhjYWxpZHJhd0VsZW1lbnRbXCJpZFwiXT4sXG4pOiB2b2lkID0+IHtcbiAgY29uc3Qgc2NlbmVFbGVtZW50TWFwID0gYXJyYXlUb01hcChzY2VuZUVsZW1lbnRzKSBhcyBNYXA8XG4gICAgRXhjYWxpZHJhd0VsZW1lbnRbXCJpZFwiXSxcbiAgICBFeGNhbGlkcmF3RWxlbWVudFxuICA+O1xuICBvbGRFbGVtZW50cy5mb3JFYWNoKChlbGVtZW50KSA9PiB7XG4gICAgY29uc3QgbmV3RWxlbWVudElkID0gb2xkSWRUb0R1cGxpY2F0ZWRJZC5nZXQoZWxlbWVudC5pZCkgYXMgc3RyaW5nO1xuICAgIGNvbnN0IGJvdW5kVGV4dEVsZW1lbnRJZCA9IGdldEJvdW5kVGV4dEVsZW1lbnRJZChlbGVtZW50KTtcblxuICAgIGlmIChib3VuZFRleHRFbGVtZW50SWQpIHtcbiAgICAgIGNvbnN0IG5ld1RleHRFbGVtZW50SWQgPSBvbGRJZFRvRHVwbGljYXRlZElkLmdldChib3VuZFRleHRFbGVtZW50SWQpO1xuICAgICAgaWYgKG5ld1RleHRFbGVtZW50SWQpIHtcbiAgICAgICAgY29uc3QgbmV3Q29udGFpbmVyID0gc2NlbmVFbGVtZW50TWFwLmdldChuZXdFbGVtZW50SWQpO1xuICAgICAgICBpZiAobmV3Q29udGFpbmVyKSB7XG4gICAgICAgICAgbXV0YXRlRWxlbWVudChuZXdDb250YWluZXIsIHtcbiAgICAgICAgICAgIGJvdW5kRWxlbWVudHM6IChlbGVtZW50LmJvdW5kRWxlbWVudHMgfHwgW10pXG4gICAgICAgICAgICAgIC5maWx0ZXIoXG4gICAgICAgICAgICAgICAgKGJvdW5kRWxlbWVudCkgPT5cbiAgICAgICAgICAgICAgICAgIGJvdW5kRWxlbWVudC5pZCAhPT0gbmV3VGV4dEVsZW1lbnRJZCAmJlxuICAgICAgICAgICAgICAgICAgYm91bmRFbGVtZW50LmlkICE9PSBib3VuZFRleHRFbGVtZW50SWQsXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgLmNvbmNhdCh7XG4gICAgICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICAgICAgaWQ6IG5ld1RleHRFbGVtZW50SWQsXG4gICAgICAgICAgICAgIH0pLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG5ld1RleHRFbGVtZW50ID0gc2NlbmVFbGVtZW50TWFwLmdldChuZXdUZXh0RWxlbWVudElkKTtcbiAgICAgICAgaWYgKG5ld1RleHRFbGVtZW50ICYmIGlzVGV4dEVsZW1lbnQobmV3VGV4dEVsZW1lbnQpKSB7XG4gICAgICAgICAgbXV0YXRlRWxlbWVudChuZXdUZXh0RWxlbWVudCwge1xuICAgICAgICAgICAgY29udGFpbmVySWQ6IG5ld0NvbnRhaW5lciA/IG5ld0VsZW1lbnRJZCA6IG51bGwsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0pO1xufTtcblxuZXhwb3J0IGNvbnN0IGhhbmRsZUJpbmRUZXh0UmVzaXplID0gKFxuICBjb250YWluZXI6IE5vbkRlbGV0ZWRFeGNhbGlkcmF3RWxlbWVudCxcbiAgdHJhbnNmb3JtSGFuZGxlVHlwZTogTWF5YmVUcmFuc2Zvcm1IYW5kbGVUeXBlLFxuKSA9PiB7XG4gIGNvbnN0IGJvdW5kVGV4dEVsZW1lbnRJZCA9IGdldEJvdW5kVGV4dEVsZW1lbnRJZChjb250YWluZXIpO1xuICBpZiAoIWJvdW5kVGV4dEVsZW1lbnRJZCkge1xuICAgIHJldHVybjtcbiAgfVxuICByZXNldE9yaWdpbmFsQ29udGFpbmVyQ2FjaGUoY29udGFpbmVyLmlkKTtcbiAgbGV0IHRleHRFbGVtZW50ID0gU2NlbmUuZ2V0U2NlbmUoY29udGFpbmVyKSEuZ2V0RWxlbWVudChcbiAgICBib3VuZFRleHRFbGVtZW50SWQsXG4gICkgYXMgRXhjYWxpZHJhd1RleHRFbGVtZW50O1xuICBpZiAodGV4dEVsZW1lbnQgJiYgdGV4dEVsZW1lbnQudGV4dCkge1xuICAgIGlmICghY29udGFpbmVyKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGV4dEVsZW1lbnQgPSBTY2VuZS5nZXRTY2VuZShjb250YWluZXIpIS5nZXRFbGVtZW50KFxuICAgICAgYm91bmRUZXh0RWxlbWVudElkLFxuICAgICkgYXMgRXhjYWxpZHJhd1RleHRFbGVtZW50O1xuICAgIGxldCB0ZXh0ID0gdGV4dEVsZW1lbnQudGV4dDtcbiAgICBsZXQgbmV4dEhlaWdodCA9IHRleHRFbGVtZW50LmhlaWdodDtcbiAgICBsZXQgbmV4dFdpZHRoID0gdGV4dEVsZW1lbnQud2lkdGg7XG4gICAgY29uc3QgY29udGFpbmVyRGltcyA9IGdldENvbnRhaW5lckRpbXMoY29udGFpbmVyKTtcbiAgICBjb25zdCBtYXhXaWR0aCA9IGdldEJvdW5kVGV4dE1heFdpZHRoKGNvbnRhaW5lcik7XG4gICAgY29uc3QgbWF4SGVpZ2h0ID0gZ2V0Qm91bmRUZXh0TWF4SGVpZ2h0KFxuICAgICAgY29udGFpbmVyLFxuICAgICAgdGV4dEVsZW1lbnQgYXMgRXhjYWxpZHJhd1RleHRFbGVtZW50V2l0aENvbnRhaW5lcixcbiAgICApO1xuICAgIGxldCBjb250YWluZXJIZWlnaHQgPSBjb250YWluZXJEaW1zLmhlaWdodDtcbiAgICBsZXQgbmV4dEJhc2VMaW5lID0gdGV4dEVsZW1lbnQuYmFzZWxpbmU7XG4gICAgaWYgKHRyYW5zZm9ybUhhbmRsZVR5cGUgIT09IFwiblwiICYmIHRyYW5zZm9ybUhhbmRsZVR5cGUgIT09IFwic1wiKSB7XG4gICAgICBpZiAodGV4dCkge1xuICAgICAgICB0ZXh0ID0gd3JhcFRleHQoXG4gICAgICAgICAgdGV4dEVsZW1lbnQub3JpZ2luYWxUZXh0LFxuICAgICAgICAgIGdldEZvbnRTdHJpbmcodGV4dEVsZW1lbnQpLFxuICAgICAgICAgIG1heFdpZHRoLFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgY29uc3QgbWV0cmljcyA9IG1lYXN1cmVUZXh0KFxuICAgICAgICB0ZXh0LFxuICAgICAgICBnZXRGb250U3RyaW5nKHRleHRFbGVtZW50KSxcbiAgICAgICAgdGV4dEVsZW1lbnQubGluZUhlaWdodCxcbiAgICAgICk7XG4gICAgICBuZXh0SGVpZ2h0ID0gbWV0cmljcy5oZWlnaHQ7XG4gICAgICBuZXh0V2lkdGggPSBtZXRyaWNzLndpZHRoO1xuICAgICAgbmV4dEJhc2VMaW5lID0gbWV0cmljcy5iYXNlbGluZTtcbiAgICB9XG4gICAgLy8gaW5jcmVhc2UgaGVpZ2h0IGluIGNhc2UgdGV4dCBlbGVtZW50IGhlaWdodCBleGNlZWRzXG4gICAgaWYgKG5leHRIZWlnaHQgPiBtYXhIZWlnaHQpIHtcbiAgICAgIGNvbnRhaW5lckhlaWdodCA9IGNvbXB1dGVDb250YWluZXJEaW1lbnNpb25Gb3JCb3VuZFRleHQoXG4gICAgICAgIG5leHRIZWlnaHQsXG4gICAgICAgIGNvbnRhaW5lci50eXBlLFxuICAgICAgKTtcblxuICAgICAgY29uc3QgZGlmZiA9IGNvbnRhaW5lckhlaWdodCAtIGNvbnRhaW5lckRpbXMuaGVpZ2h0O1xuICAgICAgLy8gZml4IHRoZSB5IGNvb3JkIHdoZW4gcmVzaXppbmcgZnJvbSBuZS9udy9uXG4gICAgICBjb25zdCB1cGRhdGVkWSA9XG4gICAgICAgICFpc0Fycm93RWxlbWVudChjb250YWluZXIpICYmXG4gICAgICAgICh0cmFuc2Zvcm1IYW5kbGVUeXBlID09PSBcIm5lXCIgfHxcbiAgICAgICAgICB0cmFuc2Zvcm1IYW5kbGVUeXBlID09PSBcIm53XCIgfHxcbiAgICAgICAgICB0cmFuc2Zvcm1IYW5kbGVUeXBlID09PSBcIm5cIilcbiAgICAgICAgICA/IGNvbnRhaW5lci55IC0gZGlmZlxuICAgICAgICAgIDogY29udGFpbmVyLnk7XG4gICAgICBtdXRhdGVFbGVtZW50KGNvbnRhaW5lciwge1xuICAgICAgICBoZWlnaHQ6IGNvbnRhaW5lckhlaWdodCxcbiAgICAgICAgeTogdXBkYXRlZFksXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBtdXRhdGVFbGVtZW50KHRleHRFbGVtZW50LCB7XG4gICAgICB0ZXh0LFxuICAgICAgd2lkdGg6IG5leHRXaWR0aCxcbiAgICAgIGhlaWdodDogbmV4dEhlaWdodCxcbiAgICAgIGJhc2VsaW5lOiBuZXh0QmFzZUxpbmUsXG4gICAgfSk7XG5cbiAgICBpZiAoIWlzQXJyb3dFbGVtZW50KGNvbnRhaW5lcikpIHtcbiAgICAgIG11dGF0ZUVsZW1lbnQoXG4gICAgICAgIHRleHRFbGVtZW50LFxuICAgICAgICBjb21wdXRlQm91bmRUZXh0UG9zaXRpb24oXG4gICAgICAgICAgY29udGFpbmVyLFxuICAgICAgICAgIHRleHRFbGVtZW50IGFzIEV4Y2FsaWRyYXdUZXh0RWxlbWVudFdpdGhDb250YWluZXIsXG4gICAgICAgICksXG4gICAgICApO1xuICAgIH1cbiAgfVxufTtcblxuZXhwb3J0IGNvbnN0IGNvbXB1dGVCb3VuZFRleHRQb3NpdGlvbiA9IChcbiAgY29udGFpbmVyOiBFeGNhbGlkcmF3RWxlbWVudCxcbiAgYm91bmRUZXh0RWxlbWVudDogRXhjYWxpZHJhd1RleHRFbGVtZW50V2l0aENvbnRhaW5lcixcbikgPT4ge1xuICBpZiAoaXNBcnJvd0VsZW1lbnQoY29udGFpbmVyKSkge1xuICAgIHJldHVybiBMaW5lYXJFbGVtZW50RWRpdG9yLmdldEJvdW5kVGV4dEVsZW1lbnRQb3NpdGlvbihcbiAgICAgIGNvbnRhaW5lcixcbiAgICAgIGJvdW5kVGV4dEVsZW1lbnQsXG4gICAgKTtcbiAgfVxuICBjb25zdCBjb250YWluZXJDb29yZHMgPSBnZXRDb250YWluZXJDb29yZHMoY29udGFpbmVyKTtcbiAgY29uc3QgbWF4Q29udGFpbmVySGVpZ2h0ID0gZ2V0Qm91bmRUZXh0TWF4SGVpZ2h0KGNvbnRhaW5lciwgYm91bmRUZXh0RWxlbWVudCk7XG4gIGNvbnN0IG1heENvbnRhaW5lcldpZHRoID0gZ2V0Qm91bmRUZXh0TWF4V2lkdGgoY29udGFpbmVyKTtcblxuICBsZXQgeDtcbiAgbGV0IHk7XG4gIGlmIChib3VuZFRleHRFbGVtZW50LnZlcnRpY2FsQWxpZ24gPT09IFZFUlRJQ0FMX0FMSUdOLlRPUCkge1xuICAgIHkgPSBjb250YWluZXJDb29yZHMueTtcbiAgfSBlbHNlIGlmIChib3VuZFRleHRFbGVtZW50LnZlcnRpY2FsQWxpZ24gPT09IFZFUlRJQ0FMX0FMSUdOLkJPVFRPTSkge1xuICAgIHkgPSBjb250YWluZXJDb29yZHMueSArIChtYXhDb250YWluZXJIZWlnaHQgLSBib3VuZFRleHRFbGVtZW50LmhlaWdodCk7XG4gIH0gZWxzZSB7XG4gICAgeSA9XG4gICAgICBjb250YWluZXJDb29yZHMueSArXG4gICAgICAobWF4Q29udGFpbmVySGVpZ2h0IC8gMiAtIGJvdW5kVGV4dEVsZW1lbnQuaGVpZ2h0IC8gMik7XG4gIH1cbiAgaWYgKGJvdW5kVGV4dEVsZW1lbnQudGV4dEFsaWduID09PSBURVhUX0FMSUdOLkxFRlQpIHtcbiAgICB4ID0gY29udGFpbmVyQ29vcmRzLng7XG4gIH0gZWxzZSBpZiAoYm91bmRUZXh0RWxlbWVudC50ZXh0QWxpZ24gPT09IFRFWFRfQUxJR04uUklHSFQpIHtcbiAgICB4ID0gY29udGFpbmVyQ29vcmRzLnggKyAobWF4Q29udGFpbmVyV2lkdGggLSBib3VuZFRleHRFbGVtZW50LndpZHRoKTtcbiAgfSBlbHNlIHtcbiAgICB4ID1cbiAgICAgIGNvbnRhaW5lckNvb3Jkcy54ICsgKG1heENvbnRhaW5lcldpZHRoIC8gMiAtIGJvdW5kVGV4dEVsZW1lbnQud2lkdGggLyAyKTtcbiAgfVxuICByZXR1cm4geyB4LCB5IH07XG59O1xuXG4vLyBodHRwczovL2dpdGh1Yi5jb20vZ3Jhc3NhdG9yL2NhbnZhcy10ZXh0LWVkaXRvci9ibG9iL21hc3Rlci9saWIvRm9udE1ldHJpY3MuanNcblxuZXhwb3J0IGNvbnN0IG1lYXN1cmVUZXh0ID0gKFxuICB0ZXh0OiBzdHJpbmcsXG4gIGZvbnQ6IEZvbnRTdHJpbmcsXG4gIGxpbmVIZWlnaHQ6IEV4Y2FsaWRyYXdUZXh0RWxlbWVudFtcImxpbmVIZWlnaHRcIl0sXG4pID0+IHtcbiAgdGV4dCA9IHRleHRcbiAgICAuc3BsaXQoXCJcXG5cIilcbiAgICAvLyByZXBsYWNlIGVtcHR5IGxpbmVzIHdpdGggc2luZ2xlIHNwYWNlIGJlY2F1c2UgbGVhZGluZy90cmFpbGluZyBlbXB0eVxuICAgIC8vIGxpbmVzIHdvdWxkIGJlIHN0cmlwcGVkIGZyb20gY29tcHV0YXRpb25cbiAgICAubWFwKCh4KSA9PiB4IHx8IFwiIFwiKVxuICAgIC5qb2luKFwiXFxuXCIpO1xuICBjb25zdCBmb250U2l6ZSA9IHBhcnNlRmxvYXQoZm9udCk7XG4gIGNvbnN0IGhlaWdodCA9IGdldFRleHRIZWlnaHQodGV4dCwgZm9udFNpemUsIGxpbmVIZWlnaHQpO1xuICBjb25zdCB3aWR0aCA9IGdldFRleHRXaWR0aCh0ZXh0LCBmb250KTtcbiAgY29uc3QgYmFzZWxpbmUgPSBtZWFzdXJlQmFzZWxpbmUodGV4dCwgZm9udCwgbGluZUhlaWdodCk7XG4gIHJldHVybiB7IHdpZHRoLCBoZWlnaHQsIGJhc2VsaW5lIH07XG59O1xuXG5leHBvcnQgY29uc3QgbWVhc3VyZUJhc2VsaW5lID0gKFxuICB0ZXh0OiBzdHJpbmcsXG4gIGZvbnQ6IEZvbnRTdHJpbmcsXG4gIGxpbmVIZWlnaHQ6IEV4Y2FsaWRyYXdUZXh0RWxlbWVudFtcImxpbmVIZWlnaHRcIl0sXG4gIHdyYXBJbkNvbnRhaW5lcj86IGJvb2xlYW4sXG4pID0+IHtcbiAgY29uc3QgY29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgY29udGFpbmVyLnN0eWxlLnBvc2l0aW9uID0gXCJhYnNvbHV0ZVwiO1xuICBjb250YWluZXIuc3R5bGUud2hpdGVTcGFjZSA9IFwicHJlXCI7XG4gIGNvbnRhaW5lci5zdHlsZS5mb250ID0gZm9udDtcbiAgY29udGFpbmVyLnN0eWxlLm1pbkhlaWdodCA9IFwiMWVtXCI7XG4gIGlmICh3cmFwSW5Db250YWluZXIpIHtcbiAgICBjb250YWluZXIuc3R5bGUub3ZlcmZsb3cgPSBcImhpZGRlblwiO1xuICAgIGNvbnRhaW5lci5zdHlsZS53b3JkQnJlYWsgPSBcImJyZWFrLXdvcmRcIjtcbiAgICBjb250YWluZXIuc3R5bGUud2hpdGVTcGFjZSA9IFwicHJlLXdyYXBcIjtcbiAgfVxuXG4gIGNvbnRhaW5lci5zdHlsZS5saW5lSGVpZ2h0ID0gU3RyaW5nKGxpbmVIZWlnaHQpO1xuXG4gIGNvbnRhaW5lci5pbm5lclRleHQgPSB0ZXh0O1xuXG4gIC8vIEJhc2VsaW5lIGlzIGltcG9ydGFudCBmb3IgcG9zaXRpb25pbmcgdGV4dCBvbiBjYW52YXNcbiAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChjb250YWluZXIpO1xuXG4gIGNvbnN0IHNwYW4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3BhblwiKTtcbiAgc3Bhbi5zdHlsZS5kaXNwbGF5ID0gXCJpbmxpbmUtYmxvY2tcIjtcbiAgc3Bhbi5zdHlsZS5vdmVyZmxvdyA9IFwiaGlkZGVuXCI7XG4gIHNwYW4uc3R5bGUud2lkdGggPSBcIjFweFwiO1xuICBzcGFuLnN0eWxlLmhlaWdodCA9IFwiMXB4XCI7XG4gIGNvbnRhaW5lci5hcHBlbmRDaGlsZChzcGFuKTtcbiAgbGV0IGJhc2VsaW5lID0gc3Bhbi5vZmZzZXRUb3AgKyBzcGFuLm9mZnNldEhlaWdodDtcbiAgY29uc3QgaGVpZ2h0ID0gY29udGFpbmVyLm9mZnNldEhlaWdodDtcblxuICBpZiAoaXNTYWZhcmkpIHtcbiAgICBjb25zdCBjYW52YXNIZWlnaHQgPSBnZXRUZXh0SGVpZ2h0KHRleHQsIHBhcnNlRmxvYXQoZm9udCksIGxpbmVIZWlnaHQpO1xuICAgIGNvbnN0IGZvbnRTaXplID0gcGFyc2VGbG9hdChmb250KTtcbiAgICAvLyBJbiBTYWZhcmkgdGhlIGZvbnQgc2l6ZSBnZXRzIHJvdW5kZWQgb2ZmIHdoZW4gcmVuZGVyaW5nIGhlbmNlIGNhbGN1bGF0aW5nIHRoZSBzYWZhcmkgaGVpZ2h0IGFuZCBzaGlmdGluZyB0aGUgYmFzZWxpbmUgaWYgaXQgZGlmZmVyc1xuICAgIC8vIGZyb20gdGhlIGFjdHVhbCBjYW52YXMgaGVpZ2h0XG4gICAgY29uc3QgZG9tSGVpZ2h0ID0gZ2V0VGV4dEhlaWdodCh0ZXh0LCBNYXRoLnJvdW5kKGZvbnRTaXplKSwgbGluZUhlaWdodCk7XG4gICAgaWYgKGNhbnZhc0hlaWdodCA+IGhlaWdodCkge1xuICAgICAgYmFzZWxpbmUgKz0gY2FudmFzSGVpZ2h0IC0gZG9tSGVpZ2h0O1xuICAgIH1cblxuICAgIGlmIChoZWlnaHQgPiBjYW52YXNIZWlnaHQpIHtcbiAgICAgIGJhc2VsaW5lIC09IGRvbUhlaWdodCAtIGNhbnZhc0hlaWdodDtcbiAgICB9XG4gIH1cbiAgZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChjb250YWluZXIpO1xuICByZXR1cm4gYmFzZWxpbmU7XG59O1xuXG4vKipcbiAqIFRvIGdldCB1bml0bGVzcyBsaW5lLWhlaWdodCAoaWYgdW5rbm93bikgd2UgY2FuIGNhbGN1bGF0ZSBpdCBieSBkaXZpZGluZ1xuICogaGVpZ2h0LXBlci1saW5lIGJ5IGZvbnRTaXplLlxuICovXG5leHBvcnQgY29uc3QgZGV0ZWN0TGluZUhlaWdodCA9ICh0ZXh0RWxlbWVudDogRXhjYWxpZHJhd1RleHRFbGVtZW50KSA9PiB7XG4gIGNvbnN0IGxpbmVDb3VudCA9IHNwbGl0SW50b0xpbmVzKHRleHRFbGVtZW50LnRleHQpLmxlbmd0aDtcbiAgcmV0dXJuICh0ZXh0RWxlbWVudC5oZWlnaHQgL1xuICAgIGxpbmVDb3VudCAvXG4gICAgdGV4dEVsZW1lbnQuZm9udFNpemUpIGFzIEV4Y2FsaWRyYXdUZXh0RWxlbWVudFtcImxpbmVIZWlnaHRcIl07XG59O1xuXG4vKipcbiAqIFdlIGNhbGN1bGF0ZSB0aGUgbGluZSBoZWlnaHQgZnJvbSB0aGUgZm9udCBzaXplIGFuZCB0aGUgdW5pdGxlc3MgbGluZSBoZWlnaHQsXG4gKiBhbGlnbmluZyB3aXRoIHRoZSBXM0Mgc3BlYy5cbiAqL1xuZXhwb3J0IGNvbnN0IGdldExpbmVIZWlnaHRJblB4ID0gKFxuICBmb250U2l6ZTogRXhjYWxpZHJhd1RleHRFbGVtZW50W1wiZm9udFNpemVcIl0sXG4gIGxpbmVIZWlnaHQ6IEV4Y2FsaWRyYXdUZXh0RWxlbWVudFtcImxpbmVIZWlnaHRcIl0sXG4pID0+IHtcbiAgcmV0dXJuIGZvbnRTaXplICogbGluZUhlaWdodDtcbn07XG5cbi8vIEZJWE1FIHJlbmFtZSB0byBnZXRBcHByb3hNaW5Db250YWluZXJIZWlnaHRcbmV4cG9ydCBjb25zdCBnZXRBcHByb3hNaW5MaW5lSGVpZ2h0ID0gKFxuICBmb250U2l6ZTogRXhjYWxpZHJhd1RleHRFbGVtZW50W1wiZm9udFNpemVcIl0sXG4gIGxpbmVIZWlnaHQ6IEV4Y2FsaWRyYXdUZXh0RWxlbWVudFtcImxpbmVIZWlnaHRcIl0sXG4pID0+IHtcbiAgcmV0dXJuIGdldExpbmVIZWlnaHRJblB4KGZvbnRTaXplLCBsaW5lSGVpZ2h0KSArIEJPVU5EX1RFWFRfUEFERElORyAqIDI7XG59O1xuXG5sZXQgY2FudmFzOiBIVE1MQ2FudmFzRWxlbWVudCB8IHVuZGVmaW5lZDtcblxuY29uc3QgZ2V0TGluZVdpZHRoID0gKHRleHQ6IHN0cmluZywgZm9udDogRm9udFN0cmluZykgPT4ge1xuICBpZiAoIWNhbnZhcykge1xuICAgIGNhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJjYW52YXNcIik7XG4gIH1cbiAgY29uc3QgY2FudmFzMmRDb250ZXh0ID0gY2FudmFzLmdldENvbnRleHQoXCIyZFwiKSE7XG4gIGNhbnZhczJkQ29udGV4dC5mb250ID0gZm9udDtcbiAgY29uc3Qgd2lkdGggPSBjYW52YXMyZENvbnRleHQubWVhc3VyZVRleHQodGV4dCkud2lkdGg7XG5cbiAgLy8gc2luY2UgaW4gdGVzdCBlbnYgdGhlIGNhbnZhcyBtZWFzdXJlVGV4dCBhbGdvXG4gIC8vIGRvZXNuJ3QgbWVhc3VyZSB0ZXh0IGFuZCBpbnN0ZWFkIGp1c3QgcmV0dXJucyBudW1iZXIgb2ZcbiAgLy8gY2hhcmFjdGVycyBoZW5jZSB3ZSBhc3N1bWUgdGhhdCBlYWNoIGxldHRlcmlzIDEwcHhcbiAgaWYgKGlzVGVzdEVudigpKSB7XG4gICAgcmV0dXJuIHdpZHRoICogMTA7XG4gIH1cbiAgcmV0dXJuIHdpZHRoO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldFRleHRXaWR0aCA9ICh0ZXh0OiBzdHJpbmcsIGZvbnQ6IEZvbnRTdHJpbmcpID0+IHtcbiAgY29uc3QgbGluZXMgPSBzcGxpdEludG9MaW5lcyh0ZXh0KTtcbiAgbGV0IHdpZHRoID0gMDtcbiAgbGluZXMuZm9yRWFjaCgobGluZSkgPT4ge1xuICAgIHdpZHRoID0gTWF0aC5tYXgod2lkdGgsIGdldExpbmVXaWR0aChsaW5lLCBmb250KSk7XG4gIH0pO1xuICByZXR1cm4gd2lkdGg7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0VGV4dEhlaWdodCA9IChcbiAgdGV4dDogc3RyaW5nLFxuICBmb250U2l6ZTogbnVtYmVyLFxuICBsaW5lSGVpZ2h0OiBFeGNhbGlkcmF3VGV4dEVsZW1lbnRbXCJsaW5lSGVpZ2h0XCJdLFxuKSA9PiB7XG4gIGNvbnN0IGxpbmVDb3VudCA9IHNwbGl0SW50b0xpbmVzKHRleHQpLmxlbmd0aDtcbiAgcmV0dXJuIGdldExpbmVIZWlnaHRJblB4KGZvbnRTaXplLCBsaW5lSGVpZ2h0KSAqIGxpbmVDb3VudDtcbn07XG5cbmV4cG9ydCBjb25zdCBwYXJzZVRva2VucyA9ICh0ZXh0OiBzdHJpbmcpID0+IHtcbiAgLy8gU3BsaXR0aW5nIHdvcmRzIGNvbnRhaW5pbmcgXCItXCIgYXMgdGhvc2UgYXJlIHRyZWF0ZWQgYXMgc2VwYXJhdGUgd29yZHNcbiAgLy8gYnkgY3NzIHdyYXBwaW5nIGFsZ29yaXRobSBlZyBub24tcHJvZml0ID0+IG5vbi0sIHByb2ZpdFxuICBjb25zdCB3b3JkcyA9IHRleHQuc3BsaXQoXCItXCIpO1xuICBpZiAod29yZHMubGVuZ3RoID4gMSkge1xuICAgIC8vIG5vbi1wcm9mdCBvcmcgPT4gWydub24tJywgJ3Byb2ZpdCBvcmcnXVxuICAgIHdvcmRzLmZvckVhY2goKHdvcmQsIGluZGV4KSA9PiB7XG4gICAgICBpZiAoaW5kZXggIT09IHdvcmRzLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgd29yZHNbaW5kZXhdID0gd29yZCArPSBcIi1cIjtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuICAvLyBKb2luaW5nIHRoZSB3b3JkcyB3aXRoIHNwYWNlIGFuZCBzcGxpdHRpbmcgdGhlbSBhZ2FpbiB3aXRoIHNwYWNlIHRvIGdldCB0aGVcbiAgLy8gZmluYWwgbGlzdCBvZiB0b2tlbnNcbiAgLy8gWydub24tJywgJ3Byb2ZpdCBvcmcnXSA9Piwnbm9uLSBwcm9mdCBvcmcnID0+IFsnbm9uLScsJ3Byb2ZpdCcsJ29yZyddXG4gIHJldHVybiB3b3Jkcy5qb2luKFwiIFwiKS5zcGxpdChcIiBcIik7XG59O1xuXG5leHBvcnQgY29uc3Qgd3JhcFRleHQgPSAodGV4dDogc3RyaW5nLCBmb250OiBGb250U3RyaW5nLCBtYXhXaWR0aDogbnVtYmVyKSA9PiB7XG4gIC8vIGlmIG1heFdpZHRoIGlzIG5vdCBmaW5pdGUgb3IgTmFOIHdoaWNoIGNhbiBoYXBwZW4gaW4gY2FzZSBvZiBidWdzIGluXG4gIC8vIGNvbXB1dGF0aW9uLCB3ZSBuZWVkIHRvIG1ha2Ugc3VyZSB3ZSBkb24ndCBjb250aW51ZSBhcyB3ZSdsbCBlbmQgdXBcbiAgLy8gaW4gYW4gaW5maW5pdGUgbG9vcFxuICBpZiAoIU51bWJlci5pc0Zpbml0ZShtYXhXaWR0aCkgfHwgbWF4V2lkdGggPCAwKSB7XG4gICAgcmV0dXJuIHRleHQ7XG4gIH1cblxuICBjb25zdCBsaW5lczogQXJyYXk8c3RyaW5nPiA9IFtdO1xuICBjb25zdCBvcmlnaW5hbExpbmVzID0gdGV4dC5zcGxpdChcIlxcblwiKTtcbiAgY29uc3Qgc3BhY2VXaWR0aCA9IGdldExpbmVXaWR0aChcIiBcIiwgZm9udCk7XG5cbiAgbGV0IGN1cnJlbnRMaW5lID0gXCJcIjtcbiAgbGV0IGN1cnJlbnRMaW5lV2lkdGhUaWxsTm93ID0gMDtcblxuICBjb25zdCBwdXNoID0gKHN0cjogc3RyaW5nKSA9PiB7XG4gICAgaWYgKHN0ci50cmltKCkpIHtcbiAgICAgIGxpbmVzLnB1c2goc3RyKTtcbiAgICB9XG4gIH07XG5cbiAgY29uc3QgcmVzZXRQYXJhbXMgPSAoKSA9PiB7XG4gICAgY3VycmVudExpbmUgPSBcIlwiO1xuICAgIGN1cnJlbnRMaW5lV2lkdGhUaWxsTm93ID0gMDtcbiAgfTtcbiAgb3JpZ2luYWxMaW5lcy5mb3JFYWNoKChvcmlnaW5hbExpbmUpID0+IHtcbiAgICBjb25zdCBjdXJyZW50TGluZVdpZHRoID0gZ2V0VGV4dFdpZHRoKG9yaWdpbmFsTGluZSwgZm9udCk7XG5cbiAgICAvLyBQdXNoIHRoZSBsaW5lIGlmIGl0cyA8PSBtYXhXaWR0aFxuICAgIGlmIChjdXJyZW50TGluZVdpZHRoIDw9IG1heFdpZHRoKSB7XG4gICAgICBsaW5lcy5wdXNoKG9yaWdpbmFsTGluZSk7XG4gICAgICByZXR1cm47IC8vIGNvbnRpbnVlXG4gICAgfVxuXG4gICAgY29uc3Qgd29yZHMgPSBwYXJzZVRva2VucyhvcmlnaW5hbExpbmUpO1xuICAgIHJlc2V0UGFyYW1zKCk7XG5cbiAgICBsZXQgaW5kZXggPSAwO1xuXG4gICAgd2hpbGUgKGluZGV4IDwgd29yZHMubGVuZ3RoKSB7XG4gICAgICBjb25zdCBjdXJyZW50V29yZFdpZHRoID0gZ2V0TGluZVdpZHRoKHdvcmRzW2luZGV4XSwgZm9udCk7XG5cbiAgICAgIC8vIFRoaXMgd2lsbCBvbmx5IGhhcHBlbiB3aGVuIHNpbmdsZSB3b3JkIHRha2VzIGVudGlyZSB3aWR0aFxuICAgICAgaWYgKGN1cnJlbnRXb3JkV2lkdGggPT09IG1heFdpZHRoKSB7XG4gICAgICAgIHB1c2god29yZHNbaW5kZXhdKTtcbiAgICAgICAgaW5kZXgrKztcbiAgICAgIH1cblxuICAgICAgLy8gU3RhcnQgYnJlYWtpbmcgbG9uZ2VyIHdvcmRzIGV4Y2VlZGluZyBtYXggd2lkdGhcbiAgICAgIGVsc2UgaWYgKGN1cnJlbnRXb3JkV2lkdGggPiBtYXhXaWR0aCkge1xuICAgICAgICAvLyBwdXNoIGN1cnJlbnQgbGluZSBzaW5jZSB0aGUgY3VycmVudCB3b3JkIGV4Y2VlZHMgdGhlIG1heCB3aWR0aFxuICAgICAgICAvLyBzbyB3aWxsIGJlIGFwcGVuZGVkIGluIG5leHQgbGluZVxuXG4gICAgICAgIHB1c2goY3VycmVudExpbmUpO1xuXG4gICAgICAgIHJlc2V0UGFyYW1zKCk7XG5cbiAgICAgICAgd2hpbGUgKHdvcmRzW2luZGV4XS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgY29uc3QgY3VycmVudENoYXIgPSBTdHJpbmcuZnJvbUNvZGVQb2ludChcbiAgICAgICAgICAgIHdvcmRzW2luZGV4XS5jb2RlUG9pbnRBdCgwKSEsXG4gICAgICAgICAgKTtcbiAgICAgICAgICBjb25zdCB3aWR0aCA9IGNoYXJXaWR0aC5jYWxjdWxhdGUoY3VycmVudENoYXIsIGZvbnQpO1xuICAgICAgICAgIGN1cnJlbnRMaW5lV2lkdGhUaWxsTm93ICs9IHdpZHRoO1xuICAgICAgICAgIHdvcmRzW2luZGV4XSA9IHdvcmRzW2luZGV4XS5zbGljZShjdXJyZW50Q2hhci5sZW5ndGgpO1xuXG4gICAgICAgICAgaWYgKGN1cnJlbnRMaW5lV2lkdGhUaWxsTm93ID49IG1heFdpZHRoKSB7XG4gICAgICAgICAgICBwdXNoKGN1cnJlbnRMaW5lKTtcbiAgICAgICAgICAgIGN1cnJlbnRMaW5lID0gY3VycmVudENoYXI7XG4gICAgICAgICAgICBjdXJyZW50TGluZVdpZHRoVGlsbE5vdyA9IHdpZHRoO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjdXJyZW50TGluZSArPSBjdXJyZW50Q2hhcjtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gcHVzaCBjdXJyZW50IGxpbmUgaWYgYXBwZW5kaW5nIHNwYWNlIGV4Y2VlZHMgbWF4IHdpZHRoXG4gICAgICAgIGlmIChjdXJyZW50TGluZVdpZHRoVGlsbE5vdyArIHNwYWNlV2lkdGggPj0gbWF4V2lkdGgpIHtcbiAgICAgICAgICBwdXNoKGN1cnJlbnRMaW5lKTtcbiAgICAgICAgICByZXNldFBhcmFtcygpO1xuICAgICAgICAgIC8vIHNwYWNlIG5lZWRzIHRvIGJlIGFwcGVuZGVkIGJlZm9yZSBuZXh0IHdvcmRcbiAgICAgICAgICAvLyBhcyBjdXJyZW50TGluZSBjb250YWlucyBjaGFycyB3aGljaCBjb3VsZG4ndCBiZSBhcHBlbmRlZFxuICAgICAgICAgIC8vIHRvIHByZXZpb3VzIGxpbmUgdW5sZXNzIHRoZSBsaW5lIGVuZHMgd2l0aCBoeXBoZW4gdG8gc3luY1xuICAgICAgICAgIC8vIHdpdGggY3NzIHdvcmQtd3JhcFxuICAgICAgICB9IGVsc2UgaWYgKCFjdXJyZW50TGluZS5lbmRzV2l0aChcIi1cIikpIHtcbiAgICAgICAgICBjdXJyZW50TGluZSArPSBcIiBcIjtcbiAgICAgICAgICBjdXJyZW50TGluZVdpZHRoVGlsbE5vdyArPSBzcGFjZVdpZHRoO1xuICAgICAgICB9XG4gICAgICAgIGluZGV4Kys7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBTdGFydCBhcHBlbmRpbmcgd29yZHMgaW4gYSBsaW5lIHRpbGwgbWF4IHdpZHRoIHJlYWNoZWRcbiAgICAgICAgd2hpbGUgKGN1cnJlbnRMaW5lV2lkdGhUaWxsTm93IDwgbWF4V2lkdGggJiYgaW5kZXggPCB3b3Jkcy5sZW5ndGgpIHtcbiAgICAgICAgICBjb25zdCB3b3JkID0gd29yZHNbaW5kZXhdO1xuICAgICAgICAgIGN1cnJlbnRMaW5lV2lkdGhUaWxsTm93ID0gZ2V0TGluZVdpZHRoKGN1cnJlbnRMaW5lICsgd29yZCwgZm9udCk7XG5cbiAgICAgICAgICBpZiAoY3VycmVudExpbmVXaWR0aFRpbGxOb3cgPiBtYXhXaWR0aCkge1xuICAgICAgICAgICAgcHVzaChjdXJyZW50TGluZSk7XG4gICAgICAgICAgICByZXNldFBhcmFtcygpO1xuXG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgaW5kZXgrKztcblxuICAgICAgICAgIC8vIGlmIHdvcmQgZW5kcyB3aXRoIFwiLVwiIHRoZW4gd2UgZG9uJ3QgbmVlZCB0byBhZGQgc3BhY2VcbiAgICAgICAgICAvLyB0byBzeW5jIHdpdGggY3NzIHdvcmQtd3JhcFxuICAgICAgICAgIGNvbnN0IHNob3VsZEFwcGVuZFNwYWNlID0gIXdvcmQuZW5kc1dpdGgoXCItXCIpO1xuICAgICAgICAgIGN1cnJlbnRMaW5lICs9IHdvcmQ7XG5cbiAgICAgICAgICBpZiAoc2hvdWxkQXBwZW5kU3BhY2UpIHtcbiAgICAgICAgICAgIGN1cnJlbnRMaW5lICs9IFwiIFwiO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIFB1c2ggdGhlIHdvcmQgaWYgYXBwZW5kaW5nIHNwYWNlIGV4Y2VlZHMgbWF4IHdpZHRoXG4gICAgICAgICAgaWYgKGN1cnJlbnRMaW5lV2lkdGhUaWxsTm93ICsgc3BhY2VXaWR0aCA+PSBtYXhXaWR0aCkge1xuICAgICAgICAgICAgaWYgKHNob3VsZEFwcGVuZFNwYWNlKSB7XG4gICAgICAgICAgICAgIGxpbmVzLnB1c2goY3VycmVudExpbmUuc2xpY2UoMCwgLTEpKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGxpbmVzLnB1c2goY3VycmVudExpbmUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVzZXRQYXJhbXMoKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoY3VycmVudExpbmUuc2xpY2UoLTEpID09PSBcIiBcIikge1xuICAgICAgLy8gb25seSByZW1vdmUgbGFzdCB0cmFpbGluZyBzcGFjZSB3aGljaCB3ZSBoYXZlIGFkZGVkIHdoZW4gam9pbmluZyB3b3Jkc1xuICAgICAgY3VycmVudExpbmUgPSBjdXJyZW50TGluZS5zbGljZSgwLCAtMSk7XG4gICAgICBwdXNoKGN1cnJlbnRMaW5lKTtcbiAgICB9XG4gIH0pO1xuICByZXR1cm4gbGluZXMuam9pbihcIlxcblwiKTtcbn07XG5cbmV4cG9ydCBjb25zdCBjaGFyV2lkdGggPSAoKCkgPT4ge1xuICBjb25zdCBjYWNoZWRDaGFyV2lkdGg6IHsgW2tleTogRm9udFN0cmluZ106IEFycmF5PG51bWJlcj4gfSA9IHt9O1xuXG4gIGNvbnN0IGNhbGN1bGF0ZSA9IChjaGFyOiBzdHJpbmcsIGZvbnQ6IEZvbnRTdHJpbmcpID0+IHtcbiAgICBjb25zdCBhc2NpaSA9IGNoYXIuY2hhckNvZGVBdCgwKTtcbiAgICBpZiAoIWNhY2hlZENoYXJXaWR0aFtmb250XSkge1xuICAgICAgY2FjaGVkQ2hhcldpZHRoW2ZvbnRdID0gW107XG4gICAgfVxuICAgIGlmICghY2FjaGVkQ2hhcldpZHRoW2ZvbnRdW2FzY2lpXSkge1xuICAgICAgY29uc3Qgd2lkdGggPSBnZXRMaW5lV2lkdGgoY2hhciwgZm9udCk7XG4gICAgICBjYWNoZWRDaGFyV2lkdGhbZm9udF1bYXNjaWldID0gd2lkdGg7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNhY2hlZENoYXJXaWR0aFtmb250XVthc2NpaV07XG4gIH07XG5cbiAgY29uc3QgZ2V0Q2FjaGUgPSAoZm9udDogRm9udFN0cmluZykgPT4ge1xuICAgIHJldHVybiBjYWNoZWRDaGFyV2lkdGhbZm9udF07XG4gIH07XG4gIHJldHVybiB7XG4gICAgY2FsY3VsYXRlLFxuICAgIGdldENhY2hlLFxuICB9O1xufSkoKTtcblxuY29uc3QgRFVNTVlfVEVYVCA9IFwiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVowMTIzNDU2Nzg5XCIudG9Mb2NhbGVVcHBlckNhc2UoKTtcblxuLy8gRklYTUUgcmVuYW1lIHRvIGdldEFwcHJveE1pbkNvbnRhaW5lcldpZHRoXG5leHBvcnQgY29uc3QgZ2V0QXBwcm94TWluTGluZVdpZHRoID0gKFxuICBmb250OiBGb250U3RyaW5nLFxuICBsaW5lSGVpZ2h0OiBFeGNhbGlkcmF3VGV4dEVsZW1lbnRbXCJsaW5lSGVpZ2h0XCJdLFxuKSA9PiB7XG4gIGNvbnN0IG1heENoYXJXaWR0aCA9IGdldE1heENoYXJXaWR0aChmb250KTtcbiAgaWYgKG1heENoYXJXaWR0aCA9PT0gMCkge1xuICAgIHJldHVybiAoXG4gICAgICBtZWFzdXJlVGV4dChEVU1NWV9URVhULnNwbGl0KFwiXCIpLmpvaW4oXCJcXG5cIiksIGZvbnQsIGxpbmVIZWlnaHQpLndpZHRoICtcbiAgICAgIEJPVU5EX1RFWFRfUEFERElORyAqIDJcbiAgICApO1xuICB9XG4gIHJldHVybiBtYXhDaGFyV2lkdGggKyBCT1VORF9URVhUX1BBRERJTkcgKiAyO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldE1pbkNoYXJXaWR0aCA9IChmb250OiBGb250U3RyaW5nKSA9PiB7XG4gIGNvbnN0IGNhY2hlID0gY2hhcldpZHRoLmdldENhY2hlKGZvbnQpO1xuICBpZiAoIWNhY2hlKSB7XG4gICAgcmV0dXJuIDA7XG4gIH1cbiAgY29uc3QgY2FjaGVXaXRoT3V0RW1wdHkgPSBjYWNoZS5maWx0ZXIoKHZhbCkgPT4gdmFsICE9PSB1bmRlZmluZWQpO1xuXG4gIHJldHVybiBNYXRoLm1pbiguLi5jYWNoZVdpdGhPdXRFbXB0eSk7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0TWF4Q2hhcldpZHRoID0gKGZvbnQ6IEZvbnRTdHJpbmcpID0+IHtcbiAgY29uc3QgY2FjaGUgPSBjaGFyV2lkdGguZ2V0Q2FjaGUoZm9udCk7XG4gIGlmICghY2FjaGUpIHtcbiAgICByZXR1cm4gMDtcbiAgfVxuICBjb25zdCBjYWNoZVdpdGhPdXRFbXB0eSA9IGNhY2hlLmZpbHRlcigodmFsKSA9PiB2YWwgIT09IHVuZGVmaW5lZCk7XG4gIHJldHVybiBNYXRoLm1heCguLi5jYWNoZVdpdGhPdXRFbXB0eSk7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0QXBwcm94Q2hhcnNUb0ZpdEluV2lkdGggPSAoZm9udDogRm9udFN0cmluZywgd2lkdGg6IG51bWJlcikgPT4ge1xuICAvLyBHZW5lcmFsbHkgbG93ZXIgY2FzZSBpcyB1c2VkIHNvIGNvbnZlcnRpbmcgdG8gbG93ZXIgY2FzZVxuICBjb25zdCBkdW1teVRleHQgPSBEVU1NWV9URVhULnRvTG9jYWxlTG93ZXJDYXNlKCk7XG4gIGNvbnN0IGJhdGNoTGVuZ3RoID0gNjtcbiAgbGV0IGluZGV4ID0gMDtcbiAgbGV0IHdpZHRoVGlsbE5vdyA9IDA7XG4gIGxldCBzdHIgPSBcIlwiO1xuICB3aGlsZSAod2lkdGhUaWxsTm93IDw9IHdpZHRoKSB7XG4gICAgY29uc3QgYmF0Y2ggPSBkdW1teVRleHQuc3Vic3RyKGluZGV4LCBpbmRleCArIGJhdGNoTGVuZ3RoKTtcbiAgICBzdHIgKz0gYmF0Y2g7XG4gICAgd2lkdGhUaWxsTm93ICs9IGdldExpbmVXaWR0aChzdHIsIGZvbnQpO1xuICAgIGlmIChpbmRleCA9PT0gZHVtbXlUZXh0Lmxlbmd0aCAtIDEpIHtcbiAgICAgIGluZGV4ID0gMDtcbiAgICB9XG4gICAgaW5kZXggPSBpbmRleCArIGJhdGNoTGVuZ3RoO1xuICB9XG5cbiAgd2hpbGUgKHdpZHRoVGlsbE5vdyA+IHdpZHRoKSB7XG4gICAgc3RyID0gc3RyLnN1YnN0cigwLCBzdHIubGVuZ3RoIC0gMSk7XG4gICAgd2lkdGhUaWxsTm93ID0gZ2V0TGluZVdpZHRoKHN0ciwgZm9udCk7XG4gIH1cbiAgcmV0dXJuIHN0ci5sZW5ndGg7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0Qm91bmRUZXh0RWxlbWVudElkID0gKGNvbnRhaW5lcjogRXhjYWxpZHJhd0VsZW1lbnQgfCBudWxsKSA9PiB7XG4gIHJldHVybiBjb250YWluZXI/LmJvdW5kRWxlbWVudHM/Lmxlbmd0aFxuICAgID8gY29udGFpbmVyPy5ib3VuZEVsZW1lbnRzPy5maWx0ZXIoKGVsZSkgPT4gZWxlLnR5cGUgPT09IFwidGV4dFwiKVswXT8uaWQgfHxcbiAgICAgICAgbnVsbFxuICAgIDogbnVsbDtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRCb3VuZFRleHRFbGVtZW50ID0gKGVsZW1lbnQ6IEV4Y2FsaWRyYXdFbGVtZW50IHwgbnVsbCkgPT4ge1xuICBpZiAoIWVsZW1lbnQpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBjb25zdCBib3VuZFRleHRFbGVtZW50SWQgPSBnZXRCb3VuZFRleHRFbGVtZW50SWQoZWxlbWVudCk7XG4gIGlmIChib3VuZFRleHRFbGVtZW50SWQpIHtcbiAgICByZXR1cm4gKFxuICAgICAgKFNjZW5lLmdldFNjZW5lKGVsZW1lbnQpPy5nZXRFbGVtZW50KFxuICAgICAgICBib3VuZFRleHRFbGVtZW50SWQsXG4gICAgICApIGFzIEV4Y2FsaWRyYXdUZXh0RWxlbWVudFdpdGhDb250YWluZXIpIHx8IG51bGxcbiAgICApO1xuICB9XG4gIHJldHVybiBudWxsO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldENvbnRhaW5lckVsZW1lbnQgPSAoXG4gIGVsZW1lbnQ6XG4gICAgfCAoRXhjYWxpZHJhd0VsZW1lbnQgJiB7XG4gICAgICAgIGNvbnRhaW5lcklkOiBFeGNhbGlkcmF3RWxlbWVudFtcImlkXCJdIHwgbnVsbDtcbiAgICAgIH0pXG4gICAgfCBudWxsLFxuKSA9PiB7XG4gIGlmICghZWxlbWVudCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIGlmIChlbGVtZW50LmNvbnRhaW5lcklkKSB7XG4gICAgcmV0dXJuIFNjZW5lLmdldFNjZW5lKGVsZW1lbnQpPy5nZXRFbGVtZW50KGVsZW1lbnQuY29udGFpbmVySWQpIHx8IG51bGw7XG4gIH1cbiAgcmV0dXJuIG51bGw7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0Q29udGFpbmVyRGltcyA9IChlbGVtZW50OiBFeGNhbGlkcmF3RWxlbWVudCkgPT4ge1xuICBjb25zdCBNSU5fV0lEVEggPSAzMDA7XG4gIGlmIChpc0Fycm93RWxlbWVudChlbGVtZW50KSkge1xuICAgIGNvbnN0IHdpZHRoID0gTWF0aC5tYXgoZWxlbWVudC53aWR0aCwgTUlOX1dJRFRIKTtcbiAgICBjb25zdCBoZWlnaHQgPSBlbGVtZW50LmhlaWdodDtcbiAgICByZXR1cm4geyB3aWR0aCwgaGVpZ2h0IH07XG4gIH1cbiAgcmV0dXJuIHsgd2lkdGg6IGVsZW1lbnQud2lkdGgsIGhlaWdodDogZWxlbWVudC5oZWlnaHQgfTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRDb250YWluZXJDZW50ZXIgPSAoXG4gIGNvbnRhaW5lcjogRXhjYWxpZHJhd0VsZW1lbnQsXG4gIGFwcFN0YXRlOiBBcHBTdGF0ZSxcbikgPT4ge1xuICBpZiAoIWlzQXJyb3dFbGVtZW50KGNvbnRhaW5lcikpIHtcbiAgICByZXR1cm4ge1xuICAgICAgeDogY29udGFpbmVyLnggKyBjb250YWluZXIud2lkdGggLyAyLFxuICAgICAgeTogY29udGFpbmVyLnkgKyBjb250YWluZXIuaGVpZ2h0IC8gMixcbiAgICB9O1xuICB9XG4gIGNvbnN0IHBvaW50cyA9IExpbmVhckVsZW1lbnRFZGl0b3IuZ2V0UG9pbnRzR2xvYmFsQ29vcmRpbmF0ZXMoY29udGFpbmVyKTtcbiAgaWYgKHBvaW50cy5sZW5ndGggJSAyID09PSAxKSB7XG4gICAgY29uc3QgaW5kZXggPSBNYXRoLmZsb29yKGNvbnRhaW5lci5wb2ludHMubGVuZ3RoIC8gMik7XG4gICAgY29uc3QgbWlkUG9pbnQgPSBMaW5lYXJFbGVtZW50RWRpdG9yLmdldFBvaW50R2xvYmFsQ29vcmRpbmF0ZXMoXG4gICAgICBjb250YWluZXIsXG4gICAgICBjb250YWluZXIucG9pbnRzW2luZGV4XSxcbiAgICApO1xuICAgIHJldHVybiB7IHg6IG1pZFBvaW50WzBdLCB5OiBtaWRQb2ludFsxXSB9O1xuICB9XG4gIGNvbnN0IGluZGV4ID0gY29udGFpbmVyLnBvaW50cy5sZW5ndGggLyAyIC0gMTtcbiAgbGV0IG1pZFNlZ21lbnRNaWRwb2ludCA9IExpbmVhckVsZW1lbnRFZGl0b3IuZ2V0RWRpdG9yTWlkUG9pbnRzKFxuICAgIGNvbnRhaW5lcixcbiAgICBhcHBTdGF0ZSxcbiAgKVtpbmRleF07XG4gIGlmICghbWlkU2VnbWVudE1pZHBvaW50KSB7XG4gICAgbWlkU2VnbWVudE1pZHBvaW50ID0gTGluZWFyRWxlbWVudEVkaXRvci5nZXRTZWdtZW50TWlkUG9pbnQoXG4gICAgICBjb250YWluZXIsXG4gICAgICBwb2ludHNbaW5kZXhdLFxuICAgICAgcG9pbnRzW2luZGV4ICsgMV0sXG4gICAgICBpbmRleCArIDEsXG4gICAgKTtcbiAgfVxuICByZXR1cm4geyB4OiBtaWRTZWdtZW50TWlkcG9pbnRbMF0sIHk6IG1pZFNlZ21lbnRNaWRwb2ludFsxXSB9O1xufTtcblxuZXhwb3J0IGNvbnN0IGdldENvbnRhaW5lckNvb3JkcyA9IChjb250YWluZXI6IE5vbkRlbGV0ZWRFeGNhbGlkcmF3RWxlbWVudCkgPT4ge1xuICBsZXQgb2Zmc2V0WCA9IEJPVU5EX1RFWFRfUEFERElORztcbiAgbGV0IG9mZnNldFkgPSBCT1VORF9URVhUX1BBRERJTkc7XG5cbiAgaWYgKGNvbnRhaW5lci50eXBlID09PSBcImVsbGlwc2VcIikge1xuICAgIC8vIFRoZSBkZXJpdmF0aW9uIG9mIGNvb3JkaW5hdGVzIGlzIGV4cGxhaW5lZCBpbiBodHRwczovL2dpdGh1Yi5jb20vZXhjYWxpZHJhdy9leGNhbGlkcmF3L3B1bGwvNjE3MlxuICAgIG9mZnNldFggKz0gKGNvbnRhaW5lci53aWR0aCAvIDIpICogKDEgLSBNYXRoLnNxcnQoMikgLyAyKTtcbiAgICBvZmZzZXRZICs9IChjb250YWluZXIuaGVpZ2h0IC8gMikgKiAoMSAtIE1hdGguc3FydCgyKSAvIDIpO1xuICB9XG4gIC8vIFRoZSBkZXJpdmF0aW9uIG9mIGNvb3JkaW5hdGVzIGlzIGV4cGxhaW5lZCBpbiBodHRwczovL2dpdGh1Yi5jb20vZXhjYWxpZHJhdy9leGNhbGlkcmF3L3B1bGwvNjI2NVxuICBpZiAoY29udGFpbmVyLnR5cGUgPT09IFwiZGlhbW9uZFwiKSB7XG4gICAgb2Zmc2V0WCArPSBjb250YWluZXIud2lkdGggLyA0O1xuICAgIG9mZnNldFkgKz0gY29udGFpbmVyLmhlaWdodCAvIDQ7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICB4OiBjb250YWluZXIueCArIG9mZnNldFgsXG4gICAgeTogY29udGFpbmVyLnkgKyBvZmZzZXRZLFxuICB9O1xufTtcblxuZXhwb3J0IGNvbnN0IGdldFRleHRFbGVtZW50QW5nbGUgPSAodGV4dEVsZW1lbnQ6IEV4Y2FsaWRyYXdUZXh0RWxlbWVudCkgPT4ge1xuICBjb25zdCBjb250YWluZXIgPSBnZXRDb250YWluZXJFbGVtZW50KHRleHRFbGVtZW50KTtcbiAgaWYgKCFjb250YWluZXIgfHwgaXNBcnJvd0VsZW1lbnQoY29udGFpbmVyKSkge1xuICAgIHJldHVybiB0ZXh0RWxlbWVudC5hbmdsZTtcbiAgfVxuICByZXR1cm4gY29udGFpbmVyLmFuZ2xlO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldEJvdW5kVGV4dEVsZW1lbnRPZmZzZXQgPSAoXG4gIGJvdW5kVGV4dEVsZW1lbnQ6IEV4Y2FsaWRyYXdUZXh0RWxlbWVudCB8IG51bGwsXG4pID0+IHtcbiAgY29uc3QgY29udGFpbmVyID0gZ2V0Q29udGFpbmVyRWxlbWVudChib3VuZFRleHRFbGVtZW50KTtcbiAgaWYgKCFjb250YWluZXIgfHwgIWJvdW5kVGV4dEVsZW1lbnQpIHtcbiAgICByZXR1cm4gMDtcbiAgfVxuICBpZiAoaXNBcnJvd0VsZW1lbnQoY29udGFpbmVyKSkge1xuICAgIHJldHVybiBCT1VORF9URVhUX1BBRERJTkcgKiA4O1xuICB9XG5cbiAgcmV0dXJuIEJPVU5EX1RFWFRfUEFERElORztcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRCb3VuZFRleHRFbGVtZW50UG9zaXRpb24gPSAoXG4gIGNvbnRhaW5lcjogRXhjYWxpZHJhd0VsZW1lbnQsXG4gIGJvdW5kVGV4dEVsZW1lbnQ6IEV4Y2FsaWRyYXdUZXh0RWxlbWVudFdpdGhDb250YWluZXIsXG4pID0+IHtcbiAgaWYgKGlzQXJyb3dFbGVtZW50KGNvbnRhaW5lcikpIHtcbiAgICByZXR1cm4gTGluZWFyRWxlbWVudEVkaXRvci5nZXRCb3VuZFRleHRFbGVtZW50UG9zaXRpb24oXG4gICAgICBjb250YWluZXIsXG4gICAgICBib3VuZFRleHRFbGVtZW50LFxuICAgICk7XG4gIH1cbn07XG5cbmV4cG9ydCBjb25zdCBzaG91bGRBbGxvd1ZlcnRpY2FsQWxpZ24gPSAoXG4gIHNlbGVjdGVkRWxlbWVudHM6IE5vbkRlbGV0ZWRFeGNhbGlkcmF3RWxlbWVudFtdLFxuKSA9PiB7XG4gIHJldHVybiBzZWxlY3RlZEVsZW1lbnRzLnNvbWUoKGVsZW1lbnQpID0+IHtcbiAgICBjb25zdCBoYXNCb3VuZENvbnRhaW5lciA9IGlzQm91bmRUb0NvbnRhaW5lcihlbGVtZW50KTtcbiAgICBpZiAoaGFzQm91bmRDb250YWluZXIpIHtcbiAgICAgIGNvbnN0IGNvbnRhaW5lciA9IGdldENvbnRhaW5lckVsZW1lbnQoZWxlbWVudCk7XG4gICAgICBpZiAoaXNUZXh0RWxlbWVudChlbGVtZW50KSAmJiBpc0Fycm93RWxlbWVudChjb250YWluZXIpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH0pO1xufTtcblxuZXhwb3J0IGNvbnN0IHN1cHBwb3J0c0hvcml6b250YWxBbGlnbiA9IChcbiAgc2VsZWN0ZWRFbGVtZW50czogTm9uRGVsZXRlZEV4Y2FsaWRyYXdFbGVtZW50W10sXG4pID0+IHtcbiAgcmV0dXJuIHNlbGVjdGVkRWxlbWVudHMuc29tZSgoZWxlbWVudCkgPT4ge1xuICAgIGNvbnN0IGhhc0JvdW5kQ29udGFpbmVyID0gaXNCb3VuZFRvQ29udGFpbmVyKGVsZW1lbnQpO1xuICAgIGlmIChoYXNCb3VuZENvbnRhaW5lcikge1xuICAgICAgY29uc3QgY29udGFpbmVyID0gZ2V0Q29udGFpbmVyRWxlbWVudChlbGVtZW50KTtcbiAgICAgIGlmIChpc1RleHRFbGVtZW50KGVsZW1lbnQpICYmIGlzQXJyb3dFbGVtZW50KGNvbnRhaW5lcikpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIGlzVGV4dEVsZW1lbnQoZWxlbWVudCk7XG4gIH0pO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldFRleHRCaW5kYWJsZUNvbnRhaW5lckF0UG9zaXRpb24gPSAoXG4gIGVsZW1lbnRzOiByZWFkb25seSBFeGNhbGlkcmF3RWxlbWVudFtdLFxuICBhcHBTdGF0ZTogQXBwU3RhdGUsXG4gIHg6IG51bWJlcixcbiAgeTogbnVtYmVyLFxuKTogRXhjYWxpZHJhd1RleHRDb250YWluZXIgfCBudWxsID0+IHtcbiAgY29uc3Qgc2VsZWN0ZWRFbGVtZW50cyA9IGdldFNlbGVjdGVkRWxlbWVudHMoZWxlbWVudHMsIGFwcFN0YXRlKTtcbiAgaWYgKHNlbGVjdGVkRWxlbWVudHMubGVuZ3RoID09PSAxKSB7XG4gICAgcmV0dXJuIGlzVGV4dEJpbmRhYmxlQ29udGFpbmVyKHNlbGVjdGVkRWxlbWVudHNbMF0sIGZhbHNlKVxuICAgICAgPyBzZWxlY3RlZEVsZW1lbnRzWzBdXG4gICAgICA6IG51bGw7XG4gIH1cbiAgbGV0IGhpdEVsZW1lbnQgPSBudWxsO1xuICAvLyBXZSBuZWVkIHRvIHRvIGhpdCB0ZXN0aW5nIGZyb20gZnJvbnQgKGVuZCBvZiB0aGUgYXJyYXkpIHRvIGJhY2sgKGJlZ2lubmluZyBvZiB0aGUgYXJyYXkpXG4gIGZvciAobGV0IGluZGV4ID0gZWxlbWVudHMubGVuZ3RoIC0gMTsgaW5kZXggPj0gMDsgLS1pbmRleCkge1xuICAgIGlmIChlbGVtZW50c1tpbmRleF0uaXNEZWxldGVkKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgY29uc3QgW3gxLCB5MSwgeDIsIHkyXSA9IGdldEVsZW1lbnRBYnNvbHV0ZUNvb3JkcyhlbGVtZW50c1tpbmRleF0pO1xuICAgIGlmIChcbiAgICAgIGlzQXJyb3dFbGVtZW50KGVsZW1lbnRzW2luZGV4XSkgJiZcbiAgICAgIGlzSGl0dGluZ0VsZW1lbnROb3RDb25zaWRlcmluZ0JvdW5kaW5nQm94KGVsZW1lbnRzW2luZGV4XSwgYXBwU3RhdGUsIFtcbiAgICAgICAgeCxcbiAgICAgICAgeSxcbiAgICAgIF0pXG4gICAgKSB7XG4gICAgICBoaXRFbGVtZW50ID0gZWxlbWVudHNbaW5kZXhdO1xuICAgICAgYnJlYWs7XG4gICAgfSBlbHNlIGlmICh4MSA8IHggJiYgeCA8IHgyICYmIHkxIDwgeSAmJiB5IDwgeTIpIHtcbiAgICAgIGhpdEVsZW1lbnQgPSBlbGVtZW50c1tpbmRleF07XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICByZXR1cm4gaXNUZXh0QmluZGFibGVDb250YWluZXIoaGl0RWxlbWVudCwgZmFsc2UpID8gaGl0RWxlbWVudCA6IG51bGw7XG59O1xuXG5jb25zdCBWQUxJRF9DT05UQUlORVJfVFlQRVMgPSBuZXcgU2V0KFtcbiAgXCJyZWN0YW5nbGVcIixcbiAgXCJlbGxpcHNlXCIsXG4gIFwiZGlhbW9uZFwiLFxuICBcImltYWdlXCIsXG4gIFwiYXJyb3dcIixcbl0pO1xuXG5leHBvcnQgY29uc3QgaXNWYWxpZFRleHRDb250YWluZXIgPSAoZWxlbWVudDoge1xuICB0eXBlOiBFeGNhbGlkcmF3RWxlbWVudFtcInR5cGVcIl07XG59KSA9PiBWQUxJRF9DT05UQUlORVJfVFlQRVMuaGFzKGVsZW1lbnQudHlwZSk7XG5cbmV4cG9ydCBjb25zdCBjb21wdXRlQ29udGFpbmVyRGltZW5zaW9uRm9yQm91bmRUZXh0ID0gKFxuICBkaW1lbnNpb246IG51bWJlcixcbiAgY29udGFpbmVyVHlwZTogRXh0cmFjdFNldFR5cGU8dHlwZW9mIFZBTElEX0NPTlRBSU5FUl9UWVBFUz4sXG4pID0+IHtcbiAgZGltZW5zaW9uID0gTWF0aC5jZWlsKGRpbWVuc2lvbik7XG4gIGNvbnN0IHBhZGRpbmcgPSBCT1VORF9URVhUX1BBRERJTkcgKiAyO1xuXG4gIGlmIChjb250YWluZXJUeXBlID09PSBcImVsbGlwc2VcIikge1xuICAgIHJldHVybiBNYXRoLnJvdW5kKCgoZGltZW5zaW9uICsgcGFkZGluZykgLyBNYXRoLnNxcnQoMikpICogMik7XG4gIH1cbiAgaWYgKGNvbnRhaW5lclR5cGUgPT09IFwiYXJyb3dcIikge1xuICAgIHJldHVybiBkaW1lbnNpb24gKyBwYWRkaW5nICogODtcbiAgfVxuICBpZiAoY29udGFpbmVyVHlwZSA9PT0gXCJkaWFtb25kXCIpIHtcbiAgICByZXR1cm4gMiAqIChkaW1lbnNpb24gKyBwYWRkaW5nKTtcbiAgfVxuICByZXR1cm4gZGltZW5zaW9uICsgcGFkZGluZztcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRCb3VuZFRleHRNYXhXaWR0aCA9IChjb250YWluZXI6IEV4Y2FsaWRyYXdFbGVtZW50KSA9PiB7XG4gIGNvbnN0IHdpZHRoID0gZ2V0Q29udGFpbmVyRGltcyhjb250YWluZXIpLndpZHRoO1xuICBpZiAoaXNBcnJvd0VsZW1lbnQoY29udGFpbmVyKSkge1xuICAgIHJldHVybiB3aWR0aCAtIEJPVU5EX1RFWFRfUEFERElORyAqIDggKiAyO1xuICB9XG5cbiAgaWYgKGNvbnRhaW5lci50eXBlID09PSBcImVsbGlwc2VcIikge1xuICAgIC8vIFRoZSB3aWR0aCBvZiB0aGUgbGFyZ2VzdCByZWN0YW5nbGUgaW5zY3JpYmVkIGluc2lkZSBhbiBlbGxpcHNlIGlzXG4gICAgLy8gTWF0aC5yb3VuZCgoZWxsaXBzZS53aWR0aCAvIDIpICogTWF0aC5zcXJ0KDIpKSB3aGljaCBpcyBkZXJpdmVkIGZyb21cbiAgICAvLyBlcXVhdGlvbiBvZiBhbiBlbGxpcHNlIC1odHRwczovL2dpdGh1Yi5jb20vZXhjYWxpZHJhdy9leGNhbGlkcmF3L3B1bGwvNjE3MlxuICAgIHJldHVybiBNYXRoLnJvdW5kKCh3aWR0aCAvIDIpICogTWF0aC5zcXJ0KDIpKSAtIEJPVU5EX1RFWFRfUEFERElORyAqIDI7XG4gIH1cbiAgaWYgKGNvbnRhaW5lci50eXBlID09PSBcImRpYW1vbmRcIikge1xuICAgIC8vIFRoZSB3aWR0aCBvZiB0aGUgbGFyZ2VzdCByZWN0YW5nbGUgaW5zY3JpYmVkIGluc2lkZSBhIHJob21idXMgaXNcbiAgICAvLyBNYXRoLnJvdW5kKHdpZHRoIC8gMikgLSBodHRwczovL2dpdGh1Yi5jb20vZXhjYWxpZHJhdy9leGNhbGlkcmF3L3B1bGwvNjI2NVxuICAgIHJldHVybiBNYXRoLnJvdW5kKHdpZHRoIC8gMikgLSBCT1VORF9URVhUX1BBRERJTkcgKiAyO1xuICB9XG4gIHJldHVybiB3aWR0aCAtIEJPVU5EX1RFWFRfUEFERElORyAqIDI7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0Qm91bmRUZXh0TWF4SGVpZ2h0ID0gKFxuICBjb250YWluZXI6IEV4Y2FsaWRyYXdFbGVtZW50LFxuICBib3VuZFRleHRFbGVtZW50OiBFeGNhbGlkcmF3VGV4dEVsZW1lbnRXaXRoQ29udGFpbmVyLFxuKSA9PiB7XG4gIGNvbnN0IGhlaWdodCA9IGdldENvbnRhaW5lckRpbXMoY29udGFpbmVyKS5oZWlnaHQ7XG4gIGlmIChpc0Fycm93RWxlbWVudChjb250YWluZXIpKSB7XG4gICAgY29uc3QgY29udGFpbmVySGVpZ2h0ID0gaGVpZ2h0IC0gQk9VTkRfVEVYVF9QQURESU5HICogOCAqIDI7XG4gICAgaWYgKGNvbnRhaW5lckhlaWdodCA8PSAwKSB7XG4gICAgICByZXR1cm4gYm91bmRUZXh0RWxlbWVudC5oZWlnaHQ7XG4gICAgfVxuICAgIHJldHVybiBoZWlnaHQ7XG4gIH1cbiAgaWYgKGNvbnRhaW5lci50eXBlID09PSBcImVsbGlwc2VcIikge1xuICAgIC8vIFRoZSBoZWlnaHQgb2YgdGhlIGxhcmdlc3QgcmVjdGFuZ2xlIGluc2NyaWJlZCBpbnNpZGUgYW4gZWxsaXBzZSBpc1xuICAgIC8vIE1hdGgucm91bmQoKGVsbGlwc2UuaGVpZ2h0IC8gMikgKiBNYXRoLnNxcnQoMikpIHdoaWNoIGlzIGRlcml2ZWQgZnJvbVxuICAgIC8vIGVxdWF0aW9uIG9mIGFuIGVsbGlwc2UgLSBodHRwczovL2dpdGh1Yi5jb20vZXhjYWxpZHJhdy9leGNhbGlkcmF3L3B1bGwvNjE3MlxuICAgIHJldHVybiBNYXRoLnJvdW5kKChoZWlnaHQgLyAyKSAqIE1hdGguc3FydCgyKSkgLSBCT1VORF9URVhUX1BBRERJTkcgKiAyO1xuICB9XG4gIGlmIChjb250YWluZXIudHlwZSA9PT0gXCJkaWFtb25kXCIpIHtcbiAgICAvLyBUaGUgaGVpZ2h0IG9mIHRoZSBsYXJnZXN0IHJlY3RhbmdsZSBpbnNjcmliZWQgaW5zaWRlIGEgcmhvbWJ1cyBpc1xuICAgIC8vIE1hdGgucm91bmQoaGVpZ2h0IC8gMikgLSBodHRwczovL2dpdGh1Yi5jb20vZXhjYWxpZHJhdy9leGNhbGlkcmF3L3B1bGwvNjI2NVxuICAgIHJldHVybiBNYXRoLnJvdW5kKGhlaWdodCAvIDIpIC0gQk9VTkRfVEVYVF9QQURESU5HICogMjtcbiAgfVxuICByZXR1cm4gaGVpZ2h0IC0gQk9VTkRfVEVYVF9QQURESU5HICogMjtcbn07XG5cbmV4cG9ydCBjb25zdCBpc01lYXN1cmVUZXh0U3VwcG9ydGVkID0gKCkgPT4ge1xuICBjb25zdCB3aWR0aCA9IGdldFRleHRXaWR0aChcbiAgICBEVU1NWV9URVhULFxuICAgIGdldEZvbnRTdHJpbmcoe1xuICAgICAgZm9udFNpemU6IERFRkFVTFRfRk9OVF9TSVpFLFxuICAgICAgZm9udEZhbWlseTogREVGQVVMVF9GT05UX0ZBTUlMWSxcbiAgICB9KSxcbiAgKTtcbiAgcmV0dXJuIHdpZHRoID4gMDtcbn07XG5cbi8qKlxuICogVW5pdGxlc3MgbGluZSBoZWlnaHRcbiAqXG4gKiBJbiBwcmV2aW91cyB2ZXJzaW9ucyB3ZSB1c2VkIGBub3JtYWxgIGxpbmUgaGVpZ2h0LCB3aGljaCBicm93c2VycyBpbnRlcnByZXRcbiAqIGRpZmZlcmVudGx5LCBhbmQgYmFzZWQgb24gZm9udC1mYW1pbHkgYW5kIGZvbnQtc2l6ZS5cbiAqXG4gKiBUbyBtYWtlIGxpbmUgaGVpZ2h0cyBjb25zaXN0ZW50IGFjcm9zcyBicm93c2VycyB3ZSBoYXJkY29kZSB0aGUgdmFsdWVzIGZvclxuICogZWFjaCBvZiBvdXIgZm9udHMgYmFzZWQgb24gbW9zdCBjb21tb24gYXZlcmFnZSBsaW5lLWhlaWdodHMuXG4gKiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2V4Y2FsaWRyYXcvZXhjYWxpZHJhdy9wdWxsLzYzNjAjaXNzdWVjb21tZW50LTE0Nzc2MzU5NzFcbiAqIHdoZXJlIHRoZSB2YWx1ZXMgY29tZSBmcm9tLlxuICovXG5jb25zdCBERUZBVUxUX0xJTkVfSEVJR0hUID0ge1xuICAvLyB+MS4yNSBpcyB0aGUgYXZlcmFnZSBmb3IgVmlyZ2lsIGluIFdlYktpdCBhbmQgQmxpbmsuXG4gIC8vIEdlY2tvIChGRikgdXNlcyB+MS4yOC5cbiAgW0ZPTlRfRkFNSUxZLlZpcmdpbF06IDEuMjUgYXMgRXhjYWxpZHJhd1RleHRFbGVtZW50W1wibGluZUhlaWdodFwiXSxcbiAgLy8gfjEuMTUgaXMgdGhlIGF2ZXJhZ2UgZm9yIFZpcmdpbCBpbiBXZWJLaXQgYW5kIEJsaW5rLlxuICAvLyBHZWNrbyBpZiBhbGwgb3ZlciB0aGUgcGxhY2UuXG4gIFtGT05UX0ZBTUlMWS5IZWx2ZXRpY2FdOiAxLjE1IGFzIEV4Y2FsaWRyYXdUZXh0RWxlbWVudFtcImxpbmVIZWlnaHRcIl0sXG4gIC8vIH4xLjIgaXMgdGhlIGF2ZXJhZ2UgZm9yIFZpcmdpbCBpbiBXZWJLaXQgYW5kIEJsaW5rLCBhbmQga2luZGEgR2Vja28gdG9vXG4gIFtGT05UX0ZBTUlMWS5DYXNjYWRpYV06IDEuMiBhcyBFeGNhbGlkcmF3VGV4dEVsZW1lbnRbXCJsaW5lSGVpZ2h0XCJdLFxufTtcblxuZXhwb3J0IGNvbnN0IGdldERlZmF1bHRMaW5lSGVpZ2h0ID0gKGZvbnRGYW1pbHk6IEZvbnRGYW1pbHlWYWx1ZXMpID0+IHtcbiAgaWYgKGZvbnRGYW1pbHkgaW4gREVGQVVMVF9MSU5FX0hFSUdIVCkge1xuICAgIHJldHVybiBERUZBVUxUX0xJTkVfSEVJR0hUW2ZvbnRGYW1pbHldO1xuICB9XG4gIHJldHVybiBERUZBVUxUX0xJTkVfSEVJR0hUW0RFRkFVTFRfRk9OVF9GQU1JTFldO1xufTtcblxuZXhwb3J0IGNvbnN0IGJpbmRUZXh0VG9Db250YWluZXIgPSAoXG4gIGNvbnRhaW5lclByb3BzOlxuICAgIHwge1xuICAgICAgICB0eXBlOiBFeGNsdWRlPEV4Y2FsaWRyYXdHZW5lcmljRWxlbWVudFtcInR5cGVcIl0sIFwic2VsZWN0aW9uXCI+O1xuICAgICAgfSAmIE1hcmtPcHRpb25hbDxFbGVtZW50Q29uc3RydWN0b3JPcHRzLCBcInhcIiB8IFwieVwiPixcbiAgdGV4dFByb3BzOiB7IHRleHQ6IHN0cmluZyB9ICYgTWFya09wdGlvbmFsPEVsZW1lbnRDb25zdHJ1Y3Rvck9wdHMsIFwieFwiIHwgXCJ5XCI+LFxuKSA9PiB7XG4gIGNvbnN0IGNvbnRhaW5lciA9IG5ld0VsZW1lbnQoe1xuICAgIHg6IDAsXG4gICAgeTogMCxcbiAgICAuLi5jb250YWluZXJQcm9wcyxcbiAgfSk7XG4gIGNvbnN0IHRleHRFbGVtZW50OiBFeGNhbGlkcmF3VGV4dEVsZW1lbnQgPSBuZXdUZXh0RWxlbWVudCh7XG4gICAgeDogMCxcbiAgICB5OiAwLFxuICAgIC4uLnRleHRQcm9wcyxcbiAgICBjb250YWluZXJJZDogY29udGFpbmVyLmlkLFxuICAgIHRleHRBbGlnbjogVEVYVF9BTElHTi5DRU5URVIsXG4gICAgdmVydGljYWxBbGlnbjogVkVSVElDQUxfQUxJR04uTUlERExFLFxuICB9KTtcblxuICBtdXRhdGVFbGVtZW50KGNvbnRhaW5lciwge1xuICAgIGJvdW5kRWxlbWVudHM6IChjb250YWluZXIuYm91bmRFbGVtZW50cyB8fCBbXSkuY29uY2F0KHtcbiAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgaWQ6IHRleHRFbGVtZW50LmlkLFxuICAgIH0pLFxuICB9KTtcblxuICByZWRyYXdUZXh0Qm91bmRpbmdCb3godGV4dEVsZW1lbnQsIGNvbnRhaW5lcik7XG5cbiAgcmV0dXJuIFtjb250YWluZXIsIHRleHRFbGVtZW50XTtcbn07XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///../../element/textElement.ts\n");
|
|
3761
|
+
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"bindTextToContainer\": () => (/* binding */ bindTextToContainer),\n/* harmony export */ \"bindTextToShapeAfterDuplication\": () => (/* binding */ bindTextToShapeAfterDuplication),\n/* harmony export */ \"charWidth\": () => (/* binding */ charWidth),\n/* harmony export */ \"computeBoundTextPosition\": () => (/* binding */ computeBoundTextPosition),\n/* harmony export */ \"computeContainerDimensionForBoundText\": () => (/* binding */ computeContainerDimensionForBoundText),\n/* harmony export */ \"detectLineHeight\": () => (/* binding */ detectLineHeight),\n/* harmony export */ \"getApproxCharsToFitInWidth\": () => (/* binding */ getApproxCharsToFitInWidth),\n/* harmony export */ \"getApproxMinLineHeight\": () => (/* binding */ getApproxMinLineHeight),\n/* harmony export */ \"getApproxMinLineWidth\": () => (/* binding */ getApproxMinLineWidth),\n/* harmony export */ \"getBoundTextElement\": () => (/* binding */ getBoundTextElement),\n/* harmony export */ \"getBoundTextElementId\": () => (/* binding */ getBoundTextElementId),\n/* harmony export */ \"getBoundTextElementOffset\": () => (/* binding */ getBoundTextElementOffset),\n/* harmony export */ \"getBoundTextElementPosition\": () => (/* binding */ getBoundTextElementPosition),\n/* harmony export */ \"getBoundTextMaxHeight\": () => (/* binding */ getBoundTextMaxHeight),\n/* harmony export */ \"getBoundTextMaxWidth\": () => (/* binding */ getBoundTextMaxWidth),\n/* harmony export */ \"getContainerCenter\": () => (/* binding */ getContainerCenter),\n/* harmony export */ \"getContainerCoords\": () => (/* binding */ getContainerCoords),\n/* harmony export */ \"getContainerDims\": () => (/* binding */ getContainerDims),\n/* harmony export */ \"getContainerElement\": () => (/* binding */ getContainerElement),\n/* harmony export */ \"getDefaultLineHeight\": () => (/* binding */ getDefaultLineHeight),\n/* harmony export */ \"getLineHeightInPx\": () => (/* binding */ getLineHeightInPx),\n/* harmony export */ \"getMaxCharWidth\": () => (/* binding */ getMaxCharWidth),\n/* harmony export */ \"getMinCharWidth\": () => (/* binding */ getMinCharWidth),\n/* harmony export */ \"getTextBindableContainerAtPosition\": () => (/* binding */ getTextBindableContainerAtPosition),\n/* harmony export */ \"getTextElementAngle\": () => (/* binding */ getTextElementAngle),\n/* harmony export */ \"getTextHeight\": () => (/* binding */ getTextHeight),\n/* harmony export */ \"getTextWidth\": () => (/* binding */ getTextWidth),\n/* harmony export */ \"handleBindTextResize\": () => (/* binding */ handleBindTextResize),\n/* harmony export */ \"isMeasureTextSupported\": () => (/* binding */ isMeasureTextSupported),\n/* harmony export */ \"isValidTextContainer\": () => (/* binding */ isValidTextContainer),\n/* harmony export */ \"measureBaseline\": () => (/* binding */ measureBaseline),\n/* harmony export */ \"measureText\": () => (/* binding */ measureText),\n/* harmony export */ \"normalizeText\": () => (/* binding */ normalizeText),\n/* harmony export */ \"parseTokens\": () => (/* binding */ parseTokens),\n/* harmony export */ \"redrawTextBoundingBox\": () => (/* binding */ redrawTextBoundingBox),\n/* harmony export */ \"shouldAllowVerticalAlign\": () => (/* binding */ shouldAllowVerticalAlign),\n/* harmony export */ \"splitIntoLines\": () => (/* binding */ splitIntoLines),\n/* harmony export */ \"suppportsHorizontalAlign\": () => (/* binding */ suppportsHorizontalAlign),\n/* harmony export */ \"wrapText\": () => (/* binding */ wrapText)\n/* harmony export */ });\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../utils */ \"../../utils.ts\");\n/* harmony import */ var _mutateElement__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./mutateElement */ \"../../element/mutateElement.ts\");\n/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../constants */ \"../../constants.ts\");\n/* harmony import */ var _scene_Scene__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../scene/Scene */ \"../../scene/Scene.ts\");\n/* harmony import */ var ___WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../element */ \"../../element/index.ts\");\n/* harmony import */ var _typeChecks__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./typeChecks */ \"../../element/typeChecks.ts\");\n/* harmony import */ var _linearElementEditor__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./linearElementEditor */ \"../../element/linearElementEditor.ts\");\n/* harmony import */ var _scene__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../scene */ \"../../scene/index.ts\");\n/* harmony import */ var _collision__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./collision */ \"../../element/collision.ts\");\n/* harmony import */ var _textWysiwyg__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./textWysiwyg */ \"../../element/textWysiwyg.tsx\");\n/* harmony import */ var _newElement__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./newElement */ \"../../element/newElement.ts\");\n\n\n\n\n\n\n\n\n\n\n\n\n\nconst normalizeText = (text) => {\n return (text\n // replace tabs with spaces so they render and measure correctly\n .replace(/\\t/g, \" \")\n // normalize newlines\n .replace(/\\r?\\n|\\r/g, \"\\n\"));\n};\nconst splitIntoLines = (text) => {\n return normalizeText(text).split(\"\\n\");\n};\nconst redrawTextBoundingBox = (textElement, container) => {\n let maxWidth = undefined;\n const boundTextUpdates = {\n x: textElement.x,\n y: textElement.y,\n text: textElement.text,\n width: textElement.width,\n height: textElement.height,\n baseline: textElement.baseline,\n };\n boundTextUpdates.text = textElement.text;\n if (container) {\n maxWidth = getBoundTextMaxWidth(container);\n boundTextUpdates.text = wrapText(textElement.originalText, (0,_utils__WEBPACK_IMPORTED_MODULE_0__.getFontString)(textElement), maxWidth);\n }\n const metrics = measureText(boundTextUpdates.text, (0,_utils__WEBPACK_IMPORTED_MODULE_0__.getFontString)(textElement), textElement.lineHeight);\n boundTextUpdates.width = metrics.width;\n boundTextUpdates.height = metrics.height;\n boundTextUpdates.baseline = metrics.baseline;\n if (container) {\n const maxContainerHeight = getBoundTextMaxHeight(container, textElement);\n const maxContainerWidth = getBoundTextMaxWidth(container);\n console.log(metrics, maxContainerWidth, container);\n if (metrics.height > maxContainerHeight) {\n const nextHeight = computeContainerDimensionForBoundText(metrics.height, container.type);\n (0,_mutateElement__WEBPACK_IMPORTED_MODULE_1__.mutateElement)(container, { height: nextHeight });\n (0,_textWysiwyg__WEBPACK_IMPORTED_MODULE_9__.updateOriginalContainerCache)(container.id, nextHeight);\n }\n if (metrics.width > maxContainerWidth) {\n const nextWidth = computeContainerDimensionForBoundText(metrics.width, container.type);\n (0,_mutateElement__WEBPACK_IMPORTED_MODULE_1__.mutateElement)(container, { width: nextWidth });\n }\n const updatedTextElement = Object.assign(Object.assign({}, textElement), boundTextUpdates);\n const { x, y } = computeBoundTextPosition(container, updatedTextElement);\n boundTextUpdates.x = x;\n boundTextUpdates.y = y;\n }\n (0,_mutateElement__WEBPACK_IMPORTED_MODULE_1__.mutateElement)(textElement, boundTextUpdates);\n};\nconst bindTextToShapeAfterDuplication = (sceneElements, oldElements, oldIdToDuplicatedId) => {\n const sceneElementMap = (0,_utils__WEBPACK_IMPORTED_MODULE_0__.arrayToMap)(sceneElements);\n oldElements.forEach((element) => {\n const newElementId = oldIdToDuplicatedId.get(element.id);\n const boundTextElementId = getBoundTextElementId(element);\n if (boundTextElementId) {\n const newTextElementId = oldIdToDuplicatedId.get(boundTextElementId);\n if (newTextElementId) {\n const newContainer = sceneElementMap.get(newElementId);\n if (newContainer) {\n (0,_mutateElement__WEBPACK_IMPORTED_MODULE_1__.mutateElement)(newContainer, {\n boundElements: (element.boundElements || [])\n .filter((boundElement) => boundElement.id !== newTextElementId &&\n boundElement.id !== boundTextElementId)\n .concat({\n type: \"text\",\n id: newTextElementId,\n }),\n });\n }\n const newTextElement = sceneElementMap.get(newTextElementId);\n if (newTextElement && (0,___WEBPACK_IMPORTED_MODULE_4__.isTextElement)(newTextElement)) {\n (0,_mutateElement__WEBPACK_IMPORTED_MODULE_1__.mutateElement)(newTextElement, {\n containerId: newContainer ? newElementId : null,\n });\n }\n }\n }\n });\n};\nconst handleBindTextResize = (container, transformHandleType) => {\n const boundTextElementId = getBoundTextElementId(container);\n if (!boundTextElementId) {\n return;\n }\n (0,_textWysiwyg__WEBPACK_IMPORTED_MODULE_9__.resetOriginalContainerCache)(container.id);\n let textElement = _scene_Scene__WEBPACK_IMPORTED_MODULE_3__[\"default\"].getScene(container).getElement(boundTextElementId);\n if (textElement && textElement.text) {\n if (!container) {\n return;\n }\n textElement = _scene_Scene__WEBPACK_IMPORTED_MODULE_3__[\"default\"].getScene(container).getElement(boundTextElementId);\n let text = textElement.text;\n let nextHeight = textElement.height;\n let nextWidth = textElement.width;\n const containerDims = getContainerDims(container);\n const maxWidth = getBoundTextMaxWidth(container);\n const maxHeight = getBoundTextMaxHeight(container, textElement);\n let containerHeight = containerDims.height;\n let nextBaseLine = textElement.baseline;\n if (transformHandleType !== \"n\" && transformHandleType !== \"s\") {\n if (text) {\n text = wrapText(textElement.originalText, (0,_utils__WEBPACK_IMPORTED_MODULE_0__.getFontString)(textElement), maxWidth);\n }\n const metrics = measureText(text, (0,_utils__WEBPACK_IMPORTED_MODULE_0__.getFontString)(textElement), textElement.lineHeight);\n nextHeight = metrics.height;\n nextWidth = metrics.width;\n nextBaseLine = metrics.baseline;\n }\n // increase height in case text element height exceeds\n if (nextHeight > maxHeight) {\n containerHeight = computeContainerDimensionForBoundText(nextHeight, container.type);\n const diff = containerHeight - containerDims.height;\n // fix the y coord when resizing from ne/nw/n\n const updatedY = !(0,_typeChecks__WEBPACK_IMPORTED_MODULE_5__.isArrowElement)(container) &&\n (transformHandleType === \"ne\" ||\n transformHandleType === \"nw\" ||\n transformHandleType === \"n\")\n ? container.y - diff\n : container.y;\n (0,_mutateElement__WEBPACK_IMPORTED_MODULE_1__.mutateElement)(container, {\n height: containerHeight,\n y: updatedY,\n });\n }\n (0,_mutateElement__WEBPACK_IMPORTED_MODULE_1__.mutateElement)(textElement, {\n text,\n width: nextWidth,\n height: nextHeight,\n baseline: nextBaseLine,\n });\n if (!(0,_typeChecks__WEBPACK_IMPORTED_MODULE_5__.isArrowElement)(container)) {\n (0,_mutateElement__WEBPACK_IMPORTED_MODULE_1__.mutateElement)(textElement, computeBoundTextPosition(container, textElement));\n }\n }\n};\nconst computeBoundTextPosition = (container, boundTextElement) => {\n if ((0,_typeChecks__WEBPACK_IMPORTED_MODULE_5__.isArrowElement)(container)) {\n return _linearElementEditor__WEBPACK_IMPORTED_MODULE_6__.LinearElementEditor.getBoundTextElementPosition(container, boundTextElement);\n }\n const containerCoords = getContainerCoords(container);\n const maxContainerHeight = getBoundTextMaxHeight(container, boundTextElement);\n const maxContainerWidth = getBoundTextMaxWidth(container);\n let x;\n let y;\n if (boundTextElement.verticalAlign === _constants__WEBPACK_IMPORTED_MODULE_2__.VERTICAL_ALIGN.TOP) {\n y = containerCoords.y;\n }\n else if (boundTextElement.verticalAlign === _constants__WEBPACK_IMPORTED_MODULE_2__.VERTICAL_ALIGN.BOTTOM) {\n y = containerCoords.y + (maxContainerHeight - boundTextElement.height);\n }\n else {\n y =\n containerCoords.y +\n (maxContainerHeight / 2 - boundTextElement.height / 2);\n }\n if (boundTextElement.textAlign === _constants__WEBPACK_IMPORTED_MODULE_2__.TEXT_ALIGN.LEFT) {\n x = containerCoords.x;\n }\n else if (boundTextElement.textAlign === _constants__WEBPACK_IMPORTED_MODULE_2__.TEXT_ALIGN.RIGHT) {\n x = containerCoords.x + (maxContainerWidth - boundTextElement.width);\n }\n else {\n x =\n containerCoords.x + (maxContainerWidth / 2 - boundTextElement.width / 2);\n }\n return { x, y };\n};\n// https://github.com/grassator/canvas-text-editor/blob/master/lib/FontMetrics.js\nconst measureText = (text, font, lineHeight) => {\n text = text\n .split(\"\\n\")\n // replace empty lines with single space because leading/trailing empty\n // lines would be stripped from computation\n .map((x) => x || \" \")\n .join(\"\\n\");\n const fontSize = parseFloat(font);\n const height = getTextHeight(text, fontSize, lineHeight);\n const width = getTextWidth(text, font);\n const baseline = measureBaseline(text, font, lineHeight);\n return { width, height, baseline };\n};\nconst measureBaseline = (text, font, lineHeight, wrapInContainer) => {\n const container = document.createElement(\"div\");\n container.style.position = \"absolute\";\n container.style.whiteSpace = \"pre\";\n container.style.font = font;\n container.style.minHeight = \"1em\";\n if (wrapInContainer) {\n container.style.overflow = \"hidden\";\n container.style.wordBreak = \"break-word\";\n container.style.whiteSpace = \"pre-wrap\";\n }\n container.style.lineHeight = String(lineHeight);\n container.innerText = text;\n // Baseline is important for positioning text on canvas\n document.body.appendChild(container);\n const span = document.createElement(\"span\");\n span.style.display = \"inline-block\";\n span.style.overflow = \"hidden\";\n span.style.width = \"1px\";\n span.style.height = \"1px\";\n container.appendChild(span);\n let baseline = span.offsetTop + span.offsetHeight;\n const height = container.offsetHeight;\n if (_constants__WEBPACK_IMPORTED_MODULE_2__.isSafari) {\n const canvasHeight = getTextHeight(text, parseFloat(font), lineHeight);\n const fontSize = parseFloat(font);\n // In Safari the font size gets rounded off when rendering hence calculating the safari height and shifting the baseline if it differs\n // from the actual canvas height\n const domHeight = getTextHeight(text, Math.round(fontSize), lineHeight);\n if (canvasHeight > height) {\n baseline += canvasHeight - domHeight;\n }\n if (height > canvasHeight) {\n baseline -= domHeight - canvasHeight;\n }\n }\n document.body.removeChild(container);\n return baseline;\n};\n/**\n * To get unitless line-height (if unknown) we can calculate it by dividing\n * height-per-line by fontSize.\n */\nconst detectLineHeight = (textElement) => {\n const lineCount = splitIntoLines(textElement.text).length;\n return (textElement.height /\n lineCount /\n textElement.fontSize);\n};\n/**\n * We calculate the line height from the font size and the unitless line height,\n * aligning with the W3C spec.\n */\nconst getLineHeightInPx = (fontSize, lineHeight) => {\n return fontSize * lineHeight;\n};\n// FIXME rename to getApproxMinContainerHeight\nconst getApproxMinLineHeight = (fontSize, lineHeight) => {\n return getLineHeightInPx(fontSize, lineHeight) + _constants__WEBPACK_IMPORTED_MODULE_2__.BOUND_TEXT_PADDING * 2;\n};\nlet canvas;\nconst getLineWidth = (text, font) => {\n if (!canvas) {\n canvas = document.createElement(\"canvas\");\n }\n const canvas2dContext = canvas.getContext(\"2d\");\n canvas2dContext.font = font;\n const width = canvas2dContext.measureText(text).width;\n // since in test env the canvas measureText algo\n // doesn't measure text and instead just returns number of\n // characters hence we assume that each letteris 10px\n if ((0,_utils__WEBPACK_IMPORTED_MODULE_0__.isTestEnv)()) {\n return width * 10;\n }\n return width;\n};\nconst getTextWidth = (text, font) => {\n const lines = splitIntoLines(text);\n let width = 0;\n lines.forEach((line) => {\n width = Math.max(width, getLineWidth(line, font));\n });\n return width;\n};\nconst getTextHeight = (text, fontSize, lineHeight) => {\n const lineCount = splitIntoLines(text).length;\n return getLineHeightInPx(fontSize, lineHeight) * lineCount;\n};\nconst parseTokens = (text) => {\n // Splitting words containing \"-\" as those are treated as separate words\n // by css wrapping algorithm eg non-profit => non-, profit\n const words = text.split(\"-\");\n if (words.length > 1) {\n // non-proft org => ['non-', 'profit org']\n words.forEach((word, index) => {\n if (index !== words.length - 1) {\n words[index] = word += \"-\";\n }\n });\n }\n // Joining the words with space and splitting them again with space to get the\n // final list of tokens\n // ['non-', 'profit org'] =>,'non- proft org' => ['non-','profit','org']\n return words.join(\" \").split(\" \");\n};\nconst wrapText = (text, font, maxWidth) => {\n // if maxWidth is not finite or NaN which can happen in case of bugs in\n // computation, we need to make sure we don't continue as we'll end up\n // in an infinite loop\n if (!Number.isFinite(maxWidth) || maxWidth < 0) {\n return text;\n }\n const lines = [];\n const originalLines = text.split(\"\\n\");\n const spaceWidth = getLineWidth(\" \", font);\n let currentLine = \"\";\n let currentLineWidthTillNow = 0;\n const push = (str) => {\n if (str.trim()) {\n lines.push(str);\n }\n };\n const resetParams = () => {\n currentLine = \"\";\n currentLineWidthTillNow = 0;\n };\n originalLines.forEach((originalLine) => {\n const currentLineWidth = getTextWidth(originalLine, font);\n // Push the line if its <= maxWidth\n if (currentLineWidth <= maxWidth) {\n lines.push(originalLine);\n return; // continue\n }\n const words = parseTokens(originalLine);\n resetParams();\n let index = 0;\n while (index < words.length) {\n const currentWordWidth = getLineWidth(words[index], font);\n // This will only happen when single word takes entire width\n if (currentWordWidth === maxWidth) {\n push(words[index]);\n index++;\n }\n // Start breaking longer words exceeding max width\n else if (currentWordWidth > maxWidth) {\n // push current line since the current word exceeds the max width\n // so will be appended in next line\n push(currentLine);\n resetParams();\n while (words[index].length > 0) {\n const currentChar = String.fromCodePoint(words[index].codePointAt(0));\n const width = charWidth.calculate(currentChar, font);\n currentLineWidthTillNow += width;\n words[index] = words[index].slice(currentChar.length);\n if (currentLineWidthTillNow >= maxWidth) {\n push(currentLine);\n currentLine = currentChar;\n currentLineWidthTillNow = width;\n }\n else {\n currentLine += currentChar;\n }\n }\n // push current line if appending space exceeds max width\n if (currentLineWidthTillNow + spaceWidth >= maxWidth) {\n push(currentLine);\n resetParams();\n // space needs to be appended before next word\n // as currentLine contains chars which couldn't be appended\n // to previous line unless the line ends with hyphen to sync\n // with css word-wrap\n }\n else if (!currentLine.endsWith(\"-\")) {\n currentLine += \" \";\n currentLineWidthTillNow += spaceWidth;\n }\n index++;\n }\n else {\n // Start appending words in a line till max width reached\n while (currentLineWidthTillNow < maxWidth && index < words.length) {\n const word = words[index];\n currentLineWidthTillNow = getLineWidth(currentLine + word, font);\n if (currentLineWidthTillNow > maxWidth) {\n push(currentLine);\n resetParams();\n break;\n }\n index++;\n // if word ends with \"-\" then we don't need to add space\n // to sync with css word-wrap\n const shouldAppendSpace = !word.endsWith(\"-\");\n currentLine += word;\n if (shouldAppendSpace) {\n currentLine += \" \";\n }\n // Push the word if appending space exceeds max width\n if (currentLineWidthTillNow + spaceWidth >= maxWidth) {\n if (shouldAppendSpace) {\n lines.push(currentLine.slice(0, -1));\n }\n else {\n lines.push(currentLine);\n }\n resetParams();\n break;\n }\n }\n }\n }\n if (currentLine.slice(-1) === \" \") {\n // only remove last trailing space which we have added when joining words\n currentLine = currentLine.slice(0, -1);\n push(currentLine);\n }\n });\n return lines.join(\"\\n\");\n};\nconst charWidth = (() => {\n const cachedCharWidth = {};\n const calculate = (char, font) => {\n const ascii = char.charCodeAt(0);\n if (!cachedCharWidth[font]) {\n cachedCharWidth[font] = [];\n }\n if (!cachedCharWidth[font][ascii]) {\n const width = getLineWidth(char, font);\n cachedCharWidth[font][ascii] = width;\n }\n return cachedCharWidth[font][ascii];\n };\n const getCache = (font) => {\n return cachedCharWidth[font];\n };\n return {\n calculate,\n getCache,\n };\n})();\nconst DUMMY_TEXT = \"ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\".toLocaleUpperCase();\n// FIXME rename to getApproxMinContainerWidth\nconst getApproxMinLineWidth = (font, lineHeight) => {\n const maxCharWidth = getMaxCharWidth(font);\n if (maxCharWidth === 0) {\n return (measureText(DUMMY_TEXT.split(\"\").join(\"\\n\"), font, lineHeight).width +\n _constants__WEBPACK_IMPORTED_MODULE_2__.BOUND_TEXT_PADDING * 2);\n }\n return maxCharWidth + _constants__WEBPACK_IMPORTED_MODULE_2__.BOUND_TEXT_PADDING * 2;\n};\nconst getMinCharWidth = (font) => {\n const cache = charWidth.getCache(font);\n if (!cache) {\n return 0;\n }\n const cacheWithOutEmpty = cache.filter((val) => val !== undefined);\n return Math.min(...cacheWithOutEmpty);\n};\nconst getMaxCharWidth = (font) => {\n const cache = charWidth.getCache(font);\n if (!cache) {\n return 0;\n }\n const cacheWithOutEmpty = cache.filter((val) => val !== undefined);\n return Math.max(...cacheWithOutEmpty);\n};\nconst getApproxCharsToFitInWidth = (font, width) => {\n // Generally lower case is used so converting to lower case\n const dummyText = DUMMY_TEXT.toLocaleLowerCase();\n const batchLength = 6;\n let index = 0;\n let widthTillNow = 0;\n let str = \"\";\n while (widthTillNow <= width) {\n const batch = dummyText.substr(index, index + batchLength);\n str += batch;\n widthTillNow += getLineWidth(str, font);\n if (index === dummyText.length - 1) {\n index = 0;\n }\n index = index + batchLength;\n }\n while (widthTillNow > width) {\n str = str.substr(0, str.length - 1);\n widthTillNow = getLineWidth(str, font);\n }\n return str.length;\n};\nconst getBoundTextElementId = (container) => {\n var _a, _b, _c;\n return ((_a = container === null || container === void 0 ? void 0 : container.boundElements) === null || _a === void 0 ? void 0 : _a.length)\n ? ((_c = (_b = container === null || container === void 0 ? void 0 : container.boundElements) === null || _b === void 0 ? void 0 : _b.filter((ele) => ele.type === \"text\")[0]) === null || _c === void 0 ? void 0 : _c.id) ||\n null\n : null;\n};\nconst getBoundTextElement = (element) => {\n var _a;\n if (!element) {\n return null;\n }\n const boundTextElementId = getBoundTextElementId(element);\n if (boundTextElementId) {\n return (((_a = _scene_Scene__WEBPACK_IMPORTED_MODULE_3__[\"default\"].getScene(element)) === null || _a === void 0 ? void 0 : _a.getElement(boundTextElementId)) || null);\n }\n return null;\n};\nconst getContainerElement = (element) => {\n var _a;\n if (!element) {\n return null;\n }\n if (element.containerId) {\n return ((_a = _scene_Scene__WEBPACK_IMPORTED_MODULE_3__[\"default\"].getScene(element)) === null || _a === void 0 ? void 0 : _a.getElement(element.containerId)) || null;\n }\n return null;\n};\nconst getContainerDims = (element) => {\n const MIN_WIDTH = 300;\n if ((0,_typeChecks__WEBPACK_IMPORTED_MODULE_5__.isArrowElement)(element)) {\n const width = Math.max(element.width, MIN_WIDTH);\n const height = element.height;\n return { width, height };\n }\n return { width: element.width, height: element.height };\n};\nconst getContainerCenter = (container, appState) => {\n if (!(0,_typeChecks__WEBPACK_IMPORTED_MODULE_5__.isArrowElement)(container)) {\n return {\n x: container.x + container.width / 2,\n y: container.y + container.height / 2,\n };\n }\n const points = _linearElementEditor__WEBPACK_IMPORTED_MODULE_6__.LinearElementEditor.getPointsGlobalCoordinates(container);\n if (points.length % 2 === 1) {\n const index = Math.floor(container.points.length / 2);\n const midPoint = _linearElementEditor__WEBPACK_IMPORTED_MODULE_6__.LinearElementEditor.getPointGlobalCoordinates(container, container.points[index]);\n return { x: midPoint[0], y: midPoint[1] };\n }\n const index = container.points.length / 2 - 1;\n let midSegmentMidpoint = _linearElementEditor__WEBPACK_IMPORTED_MODULE_6__.LinearElementEditor.getEditorMidPoints(container, appState)[index];\n if (!midSegmentMidpoint) {\n midSegmentMidpoint = _linearElementEditor__WEBPACK_IMPORTED_MODULE_6__.LinearElementEditor.getSegmentMidPoint(container, points[index], points[index + 1], index + 1);\n }\n return { x: midSegmentMidpoint[0], y: midSegmentMidpoint[1] };\n};\nconst getContainerCoords = (container) => {\n let offsetX = _constants__WEBPACK_IMPORTED_MODULE_2__.BOUND_TEXT_PADDING;\n let offsetY = _constants__WEBPACK_IMPORTED_MODULE_2__.BOUND_TEXT_PADDING;\n if (container.type === \"ellipse\") {\n // The derivation of coordinates is explained in https://github.com/excalidraw/excalidraw/pull/6172\n offsetX += (container.width / 2) * (1 - Math.sqrt(2) / 2);\n offsetY += (container.height / 2) * (1 - Math.sqrt(2) / 2);\n }\n // The derivation of coordinates is explained in https://github.com/excalidraw/excalidraw/pull/6265\n if (container.type === \"diamond\") {\n offsetX += container.width / 4;\n offsetY += container.height / 4;\n }\n return {\n x: container.x + offsetX,\n y: container.y + offsetY,\n };\n};\nconst getTextElementAngle = (textElement) => {\n const container = getContainerElement(textElement);\n if (!container || (0,_typeChecks__WEBPACK_IMPORTED_MODULE_5__.isArrowElement)(container)) {\n return textElement.angle;\n }\n return container.angle;\n};\nconst getBoundTextElementOffset = (boundTextElement) => {\n const container = getContainerElement(boundTextElement);\n if (!container || !boundTextElement) {\n return 0;\n }\n if ((0,_typeChecks__WEBPACK_IMPORTED_MODULE_5__.isArrowElement)(container)) {\n return _constants__WEBPACK_IMPORTED_MODULE_2__.BOUND_TEXT_PADDING * 8;\n }\n return _constants__WEBPACK_IMPORTED_MODULE_2__.BOUND_TEXT_PADDING;\n};\nconst getBoundTextElementPosition = (container, boundTextElement) => {\n if ((0,_typeChecks__WEBPACK_IMPORTED_MODULE_5__.isArrowElement)(container)) {\n return _linearElementEditor__WEBPACK_IMPORTED_MODULE_6__.LinearElementEditor.getBoundTextElementPosition(container, boundTextElement);\n }\n};\nconst shouldAllowVerticalAlign = (selectedElements) => {\n return selectedElements.some((element) => {\n const hasBoundContainer = (0,_typeChecks__WEBPACK_IMPORTED_MODULE_5__.isBoundToContainer)(element);\n if (hasBoundContainer) {\n const container = getContainerElement(element);\n if ((0,___WEBPACK_IMPORTED_MODULE_4__.isTextElement)(element) && (0,_typeChecks__WEBPACK_IMPORTED_MODULE_5__.isArrowElement)(container)) {\n return false;\n }\n return true;\n }\n return false;\n });\n};\nconst suppportsHorizontalAlign = (selectedElements) => {\n return selectedElements.some((element) => {\n const hasBoundContainer = (0,_typeChecks__WEBPACK_IMPORTED_MODULE_5__.isBoundToContainer)(element);\n if (hasBoundContainer) {\n const container = getContainerElement(element);\n if ((0,___WEBPACK_IMPORTED_MODULE_4__.isTextElement)(element) && (0,_typeChecks__WEBPACK_IMPORTED_MODULE_5__.isArrowElement)(container)) {\n return false;\n }\n return true;\n }\n return (0,___WEBPACK_IMPORTED_MODULE_4__.isTextElement)(element);\n });\n};\nconst getTextBindableContainerAtPosition = (elements, appState, x, y) => {\n const selectedElements = (0,_scene__WEBPACK_IMPORTED_MODULE_7__.getSelectedElements)(elements, appState);\n if (selectedElements.length === 1) {\n return (0,_typeChecks__WEBPACK_IMPORTED_MODULE_5__.isTextBindableContainer)(selectedElements[0], false)\n ? selectedElements[0]\n : null;\n }\n let hitElement = null;\n // We need to to hit testing from front (end of the array) to back (beginning of the array)\n for (let index = elements.length - 1; index >= 0; --index) {\n if (elements[index].isDeleted) {\n continue;\n }\n const [x1, y1, x2, y2] = (0,___WEBPACK_IMPORTED_MODULE_4__.getElementAbsoluteCoords)(elements[index]);\n if ((0,_typeChecks__WEBPACK_IMPORTED_MODULE_5__.isArrowElement)(elements[index]) &&\n (0,_collision__WEBPACK_IMPORTED_MODULE_8__.isHittingElementNotConsideringBoundingBox)(elements[index], appState, [\n x,\n y,\n ])) {\n hitElement = elements[index];\n break;\n }\n else if (x1 < x && x < x2 && y1 < y && y < y2) {\n hitElement = elements[index];\n break;\n }\n }\n return (0,_typeChecks__WEBPACK_IMPORTED_MODULE_5__.isTextBindableContainer)(hitElement, false) ? hitElement : null;\n};\nconst VALID_CONTAINER_TYPES = new Set([\n \"rectangle\",\n \"ellipse\",\n \"diamond\",\n \"image\",\n \"arrow\",\n]);\nconst isValidTextContainer = (element) => VALID_CONTAINER_TYPES.has(element.type);\nconst computeContainerDimensionForBoundText = (dimension, containerType) => {\n dimension = Math.ceil(dimension);\n const padding = _constants__WEBPACK_IMPORTED_MODULE_2__.BOUND_TEXT_PADDING * 2;\n if (containerType === \"ellipse\") {\n return Math.round(((dimension + padding) / Math.sqrt(2)) * 2);\n }\n if (containerType === \"arrow\") {\n return dimension + padding * 8;\n }\n if (containerType === \"diamond\") {\n return 2 * (dimension + padding);\n }\n return dimension + padding;\n};\nconst getBoundTextMaxWidth = (container) => {\n const width = getContainerDims(container).width;\n if ((0,_typeChecks__WEBPACK_IMPORTED_MODULE_5__.isArrowElement)(container)) {\n return width - _constants__WEBPACK_IMPORTED_MODULE_2__.BOUND_TEXT_PADDING * 8 * 2;\n }\n if (container.type === \"ellipse\") {\n // The width of the largest rectangle inscribed inside an ellipse is\n // Math.round((ellipse.width / 2) * Math.sqrt(2)) which is derived from\n // equation of an ellipse -https://github.com/excalidraw/excalidraw/pull/6172\n return Math.round((width / 2) * Math.sqrt(2)) - _constants__WEBPACK_IMPORTED_MODULE_2__.BOUND_TEXT_PADDING * 2;\n }\n if (container.type === \"diamond\") {\n // The width of the largest rectangle inscribed inside a rhombus is\n // Math.round(width / 2) - https://github.com/excalidraw/excalidraw/pull/6265\n return Math.round(width / 2) - _constants__WEBPACK_IMPORTED_MODULE_2__.BOUND_TEXT_PADDING * 2;\n }\n return width - _constants__WEBPACK_IMPORTED_MODULE_2__.BOUND_TEXT_PADDING * 2;\n};\nconst getBoundTextMaxHeight = (container, boundTextElement) => {\n const height = getContainerDims(container).height;\n if ((0,_typeChecks__WEBPACK_IMPORTED_MODULE_5__.isArrowElement)(container)) {\n const containerHeight = height - _constants__WEBPACK_IMPORTED_MODULE_2__.BOUND_TEXT_PADDING * 8 * 2;\n if (containerHeight <= 0) {\n return boundTextElement.height;\n }\n return height;\n }\n if (container.type === \"ellipse\") {\n // The height of the largest rectangle inscribed inside an ellipse is\n // Math.round((ellipse.height / 2) * Math.sqrt(2)) which is derived from\n // equation of an ellipse - https://github.com/excalidraw/excalidraw/pull/6172\n return Math.round((height / 2) * Math.sqrt(2)) - _constants__WEBPACK_IMPORTED_MODULE_2__.BOUND_TEXT_PADDING * 2;\n }\n if (container.type === \"diamond\") {\n // The height of the largest rectangle inscribed inside a rhombus is\n // Math.round(height / 2) - https://github.com/excalidraw/excalidraw/pull/6265\n return Math.round(height / 2) - _constants__WEBPACK_IMPORTED_MODULE_2__.BOUND_TEXT_PADDING * 2;\n }\n return height - _constants__WEBPACK_IMPORTED_MODULE_2__.BOUND_TEXT_PADDING * 2;\n};\nconst isMeasureTextSupported = () => {\n const width = getTextWidth(DUMMY_TEXT, (0,_utils__WEBPACK_IMPORTED_MODULE_0__.getFontString)({\n fontSize: _constants__WEBPACK_IMPORTED_MODULE_2__.DEFAULT_FONT_SIZE,\n fontFamily: _constants__WEBPACK_IMPORTED_MODULE_2__.DEFAULT_FONT_FAMILY,\n }));\n return width > 0;\n};\n/**\n * Unitless line height\n *\n * In previous versions we used `normal` line height, which browsers interpret\n * differently, and based on font-family and font-size.\n *\n * To make line heights consistent across browsers we hardcode the values for\n * each of our fonts based on most common average line-heights.\n * See https://github.com/excalidraw/excalidraw/pull/6360#issuecomment-1477635971\n * where the values come from.\n */\nconst DEFAULT_LINE_HEIGHT = {\n // ~1.25 is the average for Virgil in WebKit and Blink.\n // Gecko (FF) uses ~1.28.\n [_constants__WEBPACK_IMPORTED_MODULE_2__.FONT_FAMILY.Virgil]: 1.25,\n // ~1.15 is the average for Virgil in WebKit and Blink.\n // Gecko if all over the place.\n [_constants__WEBPACK_IMPORTED_MODULE_2__.FONT_FAMILY.Helvetica]: 1.15,\n // ~1.2 is the average for Virgil in WebKit and Blink, and kinda Gecko too\n [_constants__WEBPACK_IMPORTED_MODULE_2__.FONT_FAMILY.Cascadia]: 1.2,\n};\nconst getDefaultLineHeight = (fontFamily) => {\n if (fontFamily in DEFAULT_LINE_HEIGHT) {\n return DEFAULT_LINE_HEIGHT[fontFamily];\n }\n return DEFAULT_LINE_HEIGHT[_constants__WEBPACK_IMPORTED_MODULE_2__.DEFAULT_FONT_FAMILY];\n};\nconst bindTextToContainer = (containerProps, textProps) => {\n let container;\n if (containerProps.type === \"arrow\") {\n container = (0,_newElement__WEBPACK_IMPORTED_MODULE_10__.newLinearElement)(Object.assign({ \n //@ts-ignore\n x: 0, \n //@ts-ignore\n y: 0, \n //@ts-ignore\n type: containerProps.type, \n //@ts-ignore,\n endArrowhead: containerProps.type === \"arrow\" ? \"arrow\" : null, \n //@ts-ignore\n points: [\n [0, 0],\n [300, 0],\n ] }, containerProps));\n }\n else {\n //@ts-ignore\n container = (0,___WEBPACK_IMPORTED_MODULE_4__.newElement)(Object.assign({ x: 0, y: 0 }, containerProps));\n }\n const textElement = (0,___WEBPACK_IMPORTED_MODULE_4__.newTextElement)(Object.assign(Object.assign({ x: 0, y: 0 }, textProps), { containerId: container.id, textAlign: _constants__WEBPACK_IMPORTED_MODULE_2__.TEXT_ALIGN.CENTER, verticalAlign: _constants__WEBPACK_IMPORTED_MODULE_2__.VERTICAL_ALIGN.MIDDLE }));\n (0,_mutateElement__WEBPACK_IMPORTED_MODULE_1__.mutateElement)(container, {\n boundElements: (container.boundElements || []).concat({\n type: \"text\",\n id: textElement.id,\n }),\n });\n redrawTextBoundingBox(textElement, container);\n return [container, textElement];\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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U0FBUyxHQUFHLDZDQUFVLGlCQUNwQixDQUFDLEVBQUUsQ0FBQyxFQUNKLENBQUMsRUFBRSxDQUFDLElBQ0QsY0FBYyxFQUNqQixDQUFDO0tBQ0o7SUFDRCxNQUFNLFdBQVcsR0FBMEIsaURBQWMsK0JBQ3ZELENBQUMsRUFBRSxDQUFDLEVBQ0osQ0FBQyxFQUFFLENBQUMsSUFDRCxTQUFTLEtBQ1osV0FBVyxFQUFFLFNBQVMsQ0FBQyxFQUFFLEVBQ3pCLFNBQVMsRUFBRSx5REFBaUIsRUFDNUIsYUFBYSxFQUFFLDZEQUFxQixJQUNwQyxDQUFDO0lBRUgsNkRBQWEsQ0FBQyxTQUFTLEVBQUU7UUFDdkIsYUFBYSxFQUFFLENBQUMsU0FBUyxDQUFDLGFBQWEsSUFBSSxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUM7WUFDcEQsSUFBSSxFQUFFLE1BQU07WUFDWixFQUFFLEVBQUUsV0FBVyxDQUFDLEVBQUU7U0FDbkIsQ0FBQztLQUNILENBQUMsQ0FBQztJQUVILHFCQUFxQixDQUFDLFdBQVcsRUFBRSxTQUFTLENBQUMsQ0FBQztJQUU5QyxPQUFPLENBQUMsU0FBUyxFQUFFLFdBQVcsQ0FBQyxDQUFDO0FBQ2xDLENBQUMsQ0FBQyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uLi8uLi9lbGVtZW50L3RleHRFbGVtZW50LnRzPzQyZDIiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZ2V0Rm9udFN0cmluZywgYXJyYXlUb01hcCwgaXNUZXN0RW52IH0gZnJvbSBcIi4uL3V0aWxzXCI7XG5pbXBvcnQge1xuICBFeGNhbGlkcmF3RWxlbWVudCxcbiAgRXhjYWxpZHJhd0dlbmVyaWNFbGVtZW50LFxuICBFeGNhbGlkcmF3TGluZWFyRWxlbWVudCxcbiAgRXhjYWxpZHJhd1RleHRDb250YWluZXIsXG4gIEV4Y2FsaWRyYXdUZXh0RWxlbWVudCxcbiAgRXhjYWxpZHJhd1RleHRFbGVtZW50V2l0aENvbnRhaW5lcixcbiAgRm9udEZhbWlseVZhbHVlcyxcbiAgRm9udFN0cmluZyxcbiAgTm9uRGVsZXRlZEV4Y2FsaWRyYXdFbGVtZW50LFxufSBmcm9tIFwiLi90eXBlc1wiO1xuaW1wb3J0IHsgbXV0YXRlRWxlbWVudCB9IGZyb20gXCIuL211dGF0ZUVsZW1lbnRcIjtcbmltcG9ydCB7XG4gIEJPVU5EX1RFWFRfUEFERElORyxcbiAgREVGQVVMVF9GT05UX0ZBTUlMWSxcbiAgREVGQVVMVF9GT05UX1NJWkUsXG4gIEZPTlRfRkFNSUxZLFxuICBpc1NhZmFyaSxcbiAgVEVYVF9BTElHTixcbiAgVkVSVElDQUxfQUxJR04sXG59IGZyb20gXCIuLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IE1heWJlVHJhbnNmb3JtSGFuZGxlVHlwZSB9IGZyb20gXCIuL3RyYW5zZm9ybUhhbmRsZXNcIjtcbmltcG9ydCBTY2VuZSBmcm9tIFwiLi4vc2NlbmUvU2NlbmVcIjtcbmltcG9ydCB7IGlzVGV4dEVsZW1lbnQsIG5ld0VsZW1lbnQsIG5ld1RleHRFbGVtZW50IH0gZnJvbSBcIi5cIjtcbmltcG9ydCB7IGlzQm91bmRUb0NvbnRhaW5lciwgaXNBcnJvd0VsZW1lbnQgfSBmcm9tIFwiLi90eXBlQ2hlY2tzXCI7XG5pbXBvcnQgeyBMaW5lYXJFbGVtZW50RWRpdG9yIH0gZnJvbSBcIi4vbGluZWFyRWxlbWVudEVkaXRvclwiO1xuaW1wb3J0IHsgQXBwU3RhdGUgfSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7IGlzVGV4dEJpbmRhYmxlQ29udGFpbmVyIH0gZnJvbSBcIi4vdHlwZUNoZWNrc1wiO1xuaW1wb3J0IHsgZ2V0RWxlbWVudEFic29sdXRlQ29vcmRzIH0gZnJvbSBcIi4uL2VsZW1lbnRcIjtcbmltcG9ydCB7IGdldFNlbGVjdGVkRWxlbWVudHMgfSBmcm9tIFwiLi4vc2NlbmVcIjtcbmltcG9ydCB7IGlzSGl0dGluZ0VsZW1lbnROb3RDb25zaWRlcmluZ0JvdW5kaW5nQm94IH0gZnJvbSBcIi4vY29sbGlzaW9uXCI7XG5pbXBvcnQge1xuICByZXNldE9yaWdpbmFsQ29udGFpbmVyQ2FjaGUsXG4gIHVwZGF0ZU9yaWdpbmFsQ29udGFpbmVyQ2FjaGUsXG59IGZyb20gXCIuL3RleHRXeXNpd3lnXCI7XG5pbXBvcnQgeyBFeHRyYWN0U2V0VHlwZSwgTWFya09wdGlvbmFsIH0gZnJvbSBcIi4uL3V0aWxpdHktdHlwZXNcIjtcbmltcG9ydCB7IEVsZW1lbnRDb25zdHJ1Y3Rvck9wdHMsIG5ld0xpbmVhckVsZW1lbnQgfSBmcm9tIFwiLi9uZXdFbGVtZW50XCI7XG5cbmV4cG9ydCBjb25zdCBub3JtYWxpemVUZXh0ID0gKHRleHQ6IHN0cmluZykgPT4ge1xuICByZXR1cm4gKFxuICAgIHRleHRcbiAgICAgIC8vIHJlcGxhY2UgdGFicyB3aXRoIHNwYWNlcyBzbyB0aGV5IHJlbmRlciBhbmQgbWVhc3VyZSBjb3JyZWN0bHlcbiAgICAgIC5yZXBsYWNlKC9cXHQvZywgXCIgICAgICAgIFwiKVxuICAgICAgLy8gbm9ybWFsaXplIG5ld2xpbmVzXG4gICAgICAucmVwbGFjZSgvXFxyP1xcbnxcXHIvZywgXCJcXG5cIilcbiAgKTtcbn07XG5cbmV4cG9ydCBjb25zdCBzcGxpdEludG9MaW5lcyA9ICh0ZXh0OiBzdHJpbmcpID0+IHtcbiAgcmV0dXJuIG5vcm1hbGl6ZVRleHQodGV4dCkuc3BsaXQoXCJcXG5cIik7XG59O1xuXG5leHBvcnQgY29uc3QgcmVkcmF3VGV4dEJvdW5kaW5nQm94ID0gKFxuICB0ZXh0RWxlbWVudDogRXhjYWxpZHJhd1RleHRFbGVtZW50LFxuICBjb250YWluZXI6IEV4Y2FsaWRyYXdFbGVtZW50IHwgbnVsbCxcbikgPT4ge1xuICBsZXQgbWF4V2lkdGggPSB1bmRlZmluZWQ7XG4gIGNvbnN0IGJvdW5kVGV4dFVwZGF0ZXMgPSB7XG4gICAgeDogdGV4dEVsZW1lbnQueCxcbiAgICB5OiB0ZXh0RWxlbWVudC55LFxuICAgIHRleHQ6IHRleHRFbGVtZW50LnRleHQsXG4gICAgd2lkdGg6IHRleHRFbGVtZW50LndpZHRoLFxuICAgIGhlaWdodDogdGV4dEVsZW1lbnQuaGVpZ2h0LFxuICAgIGJhc2VsaW5lOiB0ZXh0RWxlbWVudC5iYXNlbGluZSxcbiAgfTtcblxuICBib3VuZFRleHRVcGRhdGVzLnRleHQgPSB0ZXh0RWxlbWVudC50ZXh0O1xuXG4gIGlmIChjb250YWluZXIpIHtcbiAgICBtYXhXaWR0aCA9IGdldEJvdW5kVGV4dE1heFdpZHRoKGNvbnRhaW5lcik7XG4gICAgYm91bmRUZXh0VXBkYXRlcy50ZXh0ID0gd3JhcFRleHQoXG4gICAgICB0ZXh0RWxlbWVudC5vcmlnaW5hbFRleHQsXG4gICAgICBnZXRGb250U3RyaW5nKHRleHRFbGVtZW50KSxcbiAgICAgIG1heFdpZHRoLFxuICAgICk7XG4gIH1cbiAgY29uc3QgbWV0cmljcyA9IG1lYXN1cmVUZXh0KFxuICAgIGJvdW5kVGV4dFVwZGF0ZXMudGV4dCxcbiAgICBnZXRGb250U3RyaW5nKHRleHRFbGVtZW50KSxcbiAgICB0ZXh0RWxlbWVudC5saW5lSGVpZ2h0LFxuICApO1xuXG4gIGJvdW5kVGV4dFVwZGF0ZXMud2lkdGggPSBtZXRyaWNzLndpZHRoO1xuICBib3VuZFRleHRVcGRhdGVzLmhlaWdodCA9IG1ldHJpY3MuaGVpZ2h0O1xuICBib3VuZFRleHRVcGRhdGVzLmJhc2VsaW5lID0gbWV0cmljcy5iYXNlbGluZTtcblxuICBpZiAoY29udGFpbmVyKSB7XG4gICAgY29uc3QgbWF4Q29udGFpbmVySGVpZ2h0ID0gZ2V0Qm91bmRUZXh0TWF4SGVpZ2h0KFxuICAgICAgY29udGFpbmVyLFxuICAgICAgdGV4dEVsZW1lbnQgYXMgRXhjYWxpZHJhd1RleHRFbGVtZW50V2l0aENvbnRhaW5lcixcbiAgICApO1xuICAgIGNvbnN0IG1heENvbnRhaW5lcldpZHRoID0gZ2V0Qm91bmRUZXh0TWF4V2lkdGgoY29udGFpbmVyKTtcbiAgICBjb25zb2xlLmxvZyhtZXRyaWNzLCBtYXhDb250YWluZXJXaWR0aCwgY29udGFpbmVyKTtcbiAgICBpZiAobWV0cmljcy5oZWlnaHQgPiBtYXhDb250YWluZXJIZWlnaHQpIHtcbiAgICAgIGNvbnN0IG5leHRIZWlnaHQgPSBjb21wdXRlQ29udGFpbmVyRGltZW5zaW9uRm9yQm91bmRUZXh0KFxuICAgICAgICBtZXRyaWNzLmhlaWdodCxcbiAgICAgICAgY29udGFpbmVyLnR5cGUsXG4gICAgICApO1xuICAgICAgbXV0YXRlRWxlbWVudChjb250YWluZXIsIHsgaGVpZ2h0OiBuZXh0SGVpZ2h0IH0pO1xuICAgICAgdXBkYXRlT3JpZ2luYWxDb250YWluZXJDYWNoZShjb250YWluZXIuaWQsIG5leHRIZWlnaHQpO1xuICAgIH1cbiAgICBpZiAobWV0cmljcy53aWR0aCA+IG1heENvbnRhaW5lcldpZHRoKSB7XG4gICAgICBjb25zdCBuZXh0V2lkdGggPSBjb21wdXRlQ29udGFpbmVyRGltZW5zaW9uRm9yQm91bmRUZXh0KFxuICAgICAgICBtZXRyaWNzLndpZHRoLFxuICAgICAgICBjb250YWluZXIudHlwZSxcbiAgICAgICk7XG4gICAgICBtdXRhdGVFbGVtZW50KGNvbnRhaW5lciwgeyB3aWR0aDogbmV4dFdpZHRoIH0pO1xuICAgIH1cbiAgICBjb25zdCB1cGRhdGVkVGV4dEVsZW1lbnQgPSB7XG4gICAgICAuLi50ZXh0RWxlbWVudCxcbiAgICAgIC4uLmJvdW5kVGV4dFVwZGF0ZXMsXG4gICAgfSBhcyBFeGNhbGlkcmF3VGV4dEVsZW1lbnRXaXRoQ29udGFpbmVyO1xuICAgIGNvbnN0IHsgeCwgeSB9ID0gY29tcHV0ZUJvdW5kVGV4dFBvc2l0aW9uKGNvbnRhaW5lciwgdXBkYXRlZFRleHRFbGVtZW50KTtcbiAgICBib3VuZFRleHRVcGRhdGVzLnggPSB4O1xuICAgIGJvdW5kVGV4dFVwZGF0ZXMueSA9IHk7XG4gIH1cblxuICBtdXRhdGVFbGVtZW50KHRleHRFbGVtZW50LCBib3VuZFRleHRVcGRhdGVzKTtcbn07XG5cbmV4cG9ydCBjb25zdCBiaW5kVGV4dFRvU2hhcGVBZnRlckR1cGxpY2F0aW9uID0gKFxuICBzY2VuZUVsZW1lbnRzOiBFeGNhbGlkcmF3RWxlbWVudFtdLFxuICBvbGRFbGVtZW50czogRXhjYWxpZHJhd0VsZW1lbnRbXSxcbiAgb2xkSWRUb0R1cGxpY2F0ZWRJZDogTWFwPEV4Y2FsaWRyYXdFbGVtZW50W1wiaWRcIl0sIEV4Y2FsaWRyYXdFbGVtZW50W1wiaWRcIl0+LFxuKTogdm9pZCA9PiB7XG4gIGNvbnN0IHNjZW5lRWxlbWVudE1hcCA9IGFycmF5VG9NYXAoc2NlbmVFbGVtZW50cykgYXMgTWFwPFxuICAgIEV4Y2FsaWRyYXdFbGVtZW50W1wiaWRcIl0sXG4gICAgRXhjYWxpZHJhd0VsZW1lbnRcbiAgPjtcbiAgb2xkRWxlbWVudHMuZm9yRWFjaCgoZWxlbWVudCkgPT4ge1xuICAgIGNvbnN0IG5ld0VsZW1lbnRJZCA9IG9sZElkVG9EdXBsaWNhdGVkSWQuZ2V0KGVsZW1lbnQuaWQpIGFzIHN0cmluZztcbiAgICBjb25zdCBib3VuZFRleHRFbGVtZW50SWQgPSBnZXRCb3VuZFRleHRFbGVtZW50SWQoZWxlbWVudCk7XG5cbiAgICBpZiAoYm91bmRUZXh0RWxlbWVudElkKSB7XG4gICAgICBjb25zdCBuZXdUZXh0RWxlbWVudElkID0gb2xkSWRUb0R1cGxpY2F0ZWRJZC5nZXQoYm91bmRUZXh0RWxlbWVudElkKTtcbiAgICAgIGlmIChuZXdUZXh0RWxlbWVudElkKSB7XG4gICAgICAgIGNvbnN0IG5ld0NvbnRhaW5lciA9IHNjZW5lRWxlbWVudE1hcC5nZXQobmV3RWxlbWVudElkKTtcbiAgICAgICAgaWYgKG5ld0NvbnRhaW5lcikge1xuICAgICAgICAgIG11dGF0ZUVsZW1lbnQobmV3Q29udGFpbmVyLCB7XG4gICAgICAgICAgICBib3VuZEVsZW1lbnRzOiAoZWxlbWVudC5ib3VuZEVsZW1lbnRzIHx8IFtdKVxuICAgICAgICAgICAgICAuZmlsdGVyKFxuICAgICAgICAgICAgICAgIChib3VuZEVsZW1lbnQpID0+XG4gICAgICAgICAgICAgICAgICBib3VuZEVsZW1lbnQuaWQgIT09IG5ld1RleHRFbGVtZW50SWQgJiZcbiAgICAgICAgICAgICAgICAgIGJvdW5kRWxlbWVudC5pZCAhPT0gYm91bmRUZXh0RWxlbWVudElkLFxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgIC5jb25jYXQoe1xuICAgICAgICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgICAgIGlkOiBuZXdUZXh0RWxlbWVudElkLFxuICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBuZXdUZXh0RWxlbWVudCA9IHNjZW5lRWxlbWVudE1hcC5nZXQobmV3VGV4dEVsZW1lbnRJZCk7XG4gICAgICAgIGlmIChuZXdUZXh0RWxlbWVudCAmJiBpc1RleHRFbGVtZW50KG5ld1RleHRFbGVtZW50KSkge1xuICAgICAgICAgIG11dGF0ZUVsZW1lbnQobmV3VGV4dEVsZW1lbnQsIHtcbiAgICAgICAgICAgIGNvbnRhaW5lcklkOiBuZXdDb250YWluZXIgPyBuZXdFbGVtZW50SWQgOiBudWxsLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9KTtcbn07XG5cbmV4cG9ydCBjb25zdCBoYW5kbGVCaW5kVGV4dFJlc2l6ZSA9IChcbiAgY29udGFpbmVyOiBOb25EZWxldGVkRXhjYWxpZHJhd0VsZW1lbnQsXG4gIHRyYW5zZm9ybUhhbmRsZVR5cGU6IE1heWJlVHJhbnNmb3JtSGFuZGxlVHlwZSxcbikgPT4ge1xuICBjb25zdCBib3VuZFRleHRFbGVtZW50SWQgPSBnZXRCb3VuZFRleHRFbGVtZW50SWQoY29udGFpbmVyKTtcbiAgaWYgKCFib3VuZFRleHRFbGVtZW50SWQpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgcmVzZXRPcmlnaW5hbENvbnRhaW5lckNhY2hlKGNvbnRhaW5lci5pZCk7XG4gIGxldCB0ZXh0RWxlbWVudCA9IFNjZW5lLmdldFNjZW5lKGNvbnRhaW5lcikhLmdldEVsZW1lbnQoXG4gICAgYm91bmRUZXh0RWxlbWVudElkLFxuICApIGFzIEV4Y2FsaWRyYXdUZXh0RWxlbWVudDtcbiAgaWYgKHRleHRFbGVtZW50ICYmIHRleHRFbGVtZW50LnRleHQpIHtcbiAgICBpZiAoIWNvbnRhaW5lcikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRleHRFbGVtZW50ID0gU2NlbmUuZ2V0U2NlbmUoY29udGFpbmVyKSEuZ2V0RWxlbWVudChcbiAgICAgIGJvdW5kVGV4dEVsZW1lbnRJZCxcbiAgICApIGFzIEV4Y2FsaWRyYXdUZXh0RWxlbWVudDtcbiAgICBsZXQgdGV4dCA9IHRleHRFbGVtZW50LnRleHQ7XG4gICAgbGV0IG5leHRIZWlnaHQgPSB0ZXh0RWxlbWVudC5oZWlnaHQ7XG4gICAgbGV0IG5leHRXaWR0aCA9IHRleHRFbGVtZW50LndpZHRoO1xuICAgIGNvbnN0IGNvbnRhaW5lckRpbXMgPSBnZXRDb250YWluZXJEaW1zKGNvbnRhaW5lcik7XG4gICAgY29uc3QgbWF4V2lkdGggPSBnZXRCb3VuZFRleHRNYXhXaWR0aChjb250YWluZXIpO1xuICAgIGNvbnN0IG1heEhlaWdodCA9IGdldEJvdW5kVGV4dE1heEhlaWdodChcbiAgICAgIGNvbnRhaW5lcixcbiAgICAgIHRleHRFbGVtZW50IGFzIEV4Y2FsaWRyYXdUZXh0RWxlbWVudFdpdGhDb250YWluZXIsXG4gICAgKTtcbiAgICBsZXQgY29udGFpbmVySGVpZ2h0ID0gY29udGFpbmVyRGltcy5oZWlnaHQ7XG4gICAgbGV0IG5leHRCYXNlTGluZSA9IHRleHRFbGVtZW50LmJhc2VsaW5lO1xuICAgIGlmICh0cmFuc2Zvcm1IYW5kbGVUeXBlICE9PSBcIm5cIiAmJiB0cmFuc2Zvcm1IYW5kbGVUeXBlICE9PSBcInNcIikge1xuICAgICAgaWYgKHRleHQpIHtcbiAgICAgICAgdGV4dCA9IHdyYXBUZXh0KFxuICAgICAgICAgIHRleHRFbGVtZW50Lm9yaWdpbmFsVGV4dCxcbiAgICAgICAgICBnZXRGb250U3RyaW5nKHRleHRFbGVtZW50KSxcbiAgICAgICAgICBtYXhXaWR0aCxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IG1ldHJpY3MgPSBtZWFzdXJlVGV4dChcbiAgICAgICAgdGV4dCxcbiAgICAgICAgZ2V0Rm9udFN0cmluZyh0ZXh0RWxlbWVudCksXG4gICAgICAgIHRleHRFbGVtZW50LmxpbmVIZWlnaHQsXG4gICAgICApO1xuICAgICAgbmV4dEhlaWdodCA9IG1ldHJpY3MuaGVpZ2h0O1xuICAgICAgbmV4dFdpZHRoID0gbWV0cmljcy53aWR0aDtcbiAgICAgIG5leHRCYXNlTGluZSA9IG1ldHJpY3MuYmFzZWxpbmU7XG4gICAgfVxuICAgIC8vIGluY3JlYXNlIGhlaWdodCBpbiBjYXNlIHRleHQgZWxlbWVudCBoZWlnaHQgZXhjZWVkc1xuICAgIGlmIChuZXh0SGVpZ2h0ID4gbWF4SGVpZ2h0KSB7XG4gICAgICBjb250YWluZXJIZWlnaHQgPSBjb21wdXRlQ29udGFpbmVyRGltZW5zaW9uRm9yQm91bmRUZXh0KFxuICAgICAgICBuZXh0SGVpZ2h0LFxuICAgICAgICBjb250YWluZXIudHlwZSxcbiAgICAgICk7XG5cbiAgICAgIGNvbnN0IGRpZmYgPSBjb250YWluZXJIZWlnaHQgLSBjb250YWluZXJEaW1zLmhlaWdodDtcbiAgICAgIC8vIGZpeCB0aGUgeSBjb29yZCB3aGVuIHJlc2l6aW5nIGZyb20gbmUvbncvblxuICAgICAgY29uc3QgdXBkYXRlZFkgPVxuICAgICAgICAhaXNBcnJvd0VsZW1lbnQoY29udGFpbmVyKSAmJlxuICAgICAgICAodHJhbnNmb3JtSGFuZGxlVHlwZSA9PT0gXCJuZVwiIHx8XG4gICAgICAgICAgdHJhbnNmb3JtSGFuZGxlVHlwZSA9PT0gXCJud1wiIHx8XG4gICAgICAgICAgdHJhbnNmb3JtSGFuZGxlVHlwZSA9PT0gXCJuXCIpXG4gICAgICAgICAgPyBjb250YWluZXIueSAtIGRpZmZcbiAgICAgICAgICA6IGNvbnRhaW5lci55O1xuICAgICAgbXV0YXRlRWxlbWVudChjb250YWluZXIsIHtcbiAgICAgICAgaGVpZ2h0OiBjb250YWluZXJIZWlnaHQsXG4gICAgICAgIHk6IHVwZGF0ZWRZLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgbXV0YXRlRWxlbWVudCh0ZXh0RWxlbWVudCwge1xuICAgICAgdGV4dCxcbiAgICAgIHdpZHRoOiBuZXh0V2lkdGgsXG4gICAgICBoZWlnaHQ6IG5leHRIZWlnaHQsXG4gICAgICBiYXNlbGluZTogbmV4dEJhc2VMaW5lLFxuICAgIH0pO1xuXG4gICAgaWYgKCFpc0Fycm93RWxlbWVudChjb250YWluZXIpKSB7XG4gICAgICBtdXRhdGVFbGVtZW50KFxuICAgICAgICB0ZXh0RWxlbWVudCxcbiAgICAgICAgY29tcHV0ZUJvdW5kVGV4dFBvc2l0aW9uKFxuICAgICAgICAgIGNvbnRhaW5lcixcbiAgICAgICAgICB0ZXh0RWxlbWVudCBhcyBFeGNhbGlkcmF3VGV4dEVsZW1lbnRXaXRoQ29udGFpbmVyLFxuICAgICAgICApLFxuICAgICAgKTtcbiAgICB9XG4gIH1cbn07XG5cbmV4cG9ydCBjb25zdCBjb21wdXRlQm91bmRUZXh0UG9zaXRpb24gPSAoXG4gIGNvbnRhaW5lcjogRXhjYWxpZHJhd0VsZW1lbnQsXG4gIGJvdW5kVGV4dEVsZW1lbnQ6IEV4Y2FsaWRyYXdUZXh0RWxlbWVudFdpdGhDb250YWluZXIsXG4pID0+IHtcbiAgaWYgKGlzQXJyb3dFbGVtZW50KGNvbnRhaW5lcikpIHtcbiAgICByZXR1cm4gTGluZWFyRWxlbWVudEVkaXRvci5nZXRCb3VuZFRleHRFbGVtZW50UG9zaXRpb24oXG4gICAgICBjb250YWluZXIsXG4gICAgICBib3VuZFRleHRFbGVtZW50LFxuICAgICk7XG4gIH1cbiAgY29uc3QgY29udGFpbmVyQ29vcmRzID0gZ2V0Q29udGFpbmVyQ29vcmRzKGNvbnRhaW5lcik7XG4gIGNvbnN0IG1heENvbnRhaW5lckhlaWdodCA9IGdldEJvdW5kVGV4dE1heEhlaWdodChjb250YWluZXIsIGJvdW5kVGV4dEVsZW1lbnQpO1xuICBjb25zdCBtYXhDb250YWluZXJXaWR0aCA9IGdldEJvdW5kVGV4dE1heFdpZHRoKGNvbnRhaW5lcik7XG5cbiAgbGV0IHg7XG4gIGxldCB5O1xuICBpZiAoYm91bmRUZXh0RWxlbWVudC52ZXJ0aWNhbEFsaWduID09PSBWRVJUSUNBTF9BTElHTi5UT1ApIHtcbiAgICB5ID0gY29udGFpbmVyQ29vcmRzLnk7XG4gIH0gZWxzZSBpZiAoYm91bmRUZXh0RWxlbWVudC52ZXJ0aWNhbEFsaWduID09PSBWRVJUSUNBTF9BTElHTi5CT1RUT00pIHtcbiAgICB5ID0gY29udGFpbmVyQ29vcmRzLnkgKyAobWF4Q29udGFpbmVySGVpZ2h0IC0gYm91bmRUZXh0RWxlbWVudC5oZWlnaHQpO1xuICB9IGVsc2Uge1xuICAgIHkgPVxuICAgICAgY29udGFpbmVyQ29vcmRzLnkgK1xuICAgICAgKG1heENvbnRhaW5lckhlaWdodCAvIDIgLSBib3VuZFRleHRFbGVtZW50LmhlaWdodCAvIDIpO1xuICB9XG4gIGlmIChib3VuZFRleHRFbGVtZW50LnRleHRBbGlnbiA9PT0gVEVYVF9BTElHTi5MRUZUKSB7XG4gICAgeCA9IGNvbnRhaW5lckNvb3Jkcy54O1xuICB9IGVsc2UgaWYgKGJvdW5kVGV4dEVsZW1lbnQudGV4dEFsaWduID09PSBURVhUX0FMSUdOLlJJR0hUKSB7XG4gICAgeCA9IGNvbnRhaW5lckNvb3Jkcy54ICsgKG1heENvbnRhaW5lcldpZHRoIC0gYm91bmRUZXh0RWxlbWVudC53aWR0aCk7XG4gIH0gZWxzZSB7XG4gICAgeCA9XG4gICAgICBjb250YWluZXJDb29yZHMueCArIChtYXhDb250YWluZXJXaWR0aCAvIDIgLSBib3VuZFRleHRFbGVtZW50LndpZHRoIC8gMik7XG4gIH1cbiAgcmV0dXJuIHsgeCwgeSB9O1xufTtcblxuLy8gaHR0cHM6Ly9naXRodWIuY29tL2dyYXNzYXRvci9jYW52YXMtdGV4dC1lZGl0b3IvYmxvYi9tYXN0ZXIvbGliL0ZvbnRNZXRyaWNzLmpzXG5cbmV4cG9ydCBjb25zdCBtZWFzdXJlVGV4dCA9IChcbiAgdGV4dDogc3RyaW5nLFxuICBmb250OiBGb250U3RyaW5nLFxuICBsaW5lSGVpZ2h0OiBFeGNhbGlkcmF3VGV4dEVsZW1lbnRbXCJsaW5lSGVpZ2h0XCJdLFxuKSA9PiB7XG4gIHRleHQgPSB0ZXh0XG4gICAgLnNwbGl0KFwiXFxuXCIpXG4gICAgLy8gcmVwbGFjZSBlbXB0eSBsaW5lcyB3aXRoIHNpbmdsZSBzcGFjZSBiZWNhdXNlIGxlYWRpbmcvdHJhaWxpbmcgZW1wdHlcbiAgICAvLyBsaW5lcyB3b3VsZCBiZSBzdHJpcHBlZCBmcm9tIGNvbXB1dGF0aW9uXG4gICAgLm1hcCgoeCkgPT4geCB8fCBcIiBcIilcbiAgICAuam9pbihcIlxcblwiKTtcbiAgY29uc3QgZm9udFNpemUgPSBwYXJzZUZsb2F0KGZvbnQpO1xuICBjb25zdCBoZWlnaHQgPSBnZXRUZXh0SGVpZ2h0KHRleHQsIGZvbnRTaXplLCBsaW5lSGVpZ2h0KTtcbiAgY29uc3Qgd2lkdGggPSBnZXRUZXh0V2lkdGgodGV4dCwgZm9udCk7XG4gIGNvbnN0IGJhc2VsaW5lID0gbWVhc3VyZUJhc2VsaW5lKHRleHQsIGZvbnQsIGxpbmVIZWlnaHQpO1xuICByZXR1cm4geyB3aWR0aCwgaGVpZ2h0LCBiYXNlbGluZSB9O1xufTtcblxuZXhwb3J0IGNvbnN0IG1lYXN1cmVCYXNlbGluZSA9IChcbiAgdGV4dDogc3RyaW5nLFxuICBmb250OiBGb250U3RyaW5nLFxuICBsaW5lSGVpZ2h0OiBFeGNhbGlkcmF3VGV4dEVsZW1lbnRbXCJsaW5lSGVpZ2h0XCJdLFxuICB3cmFwSW5Db250YWluZXI/OiBib29sZWFuLFxuKSA9PiB7XG4gIGNvbnN0IGNvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gIGNvbnRhaW5lci5zdHlsZS5wb3NpdGlvbiA9IFwiYWJzb2x1dGVcIjtcbiAgY29udGFpbmVyLnN0eWxlLndoaXRlU3BhY2UgPSBcInByZVwiO1xuICBjb250YWluZXIuc3R5bGUuZm9udCA9IGZvbnQ7XG4gIGNvbnRhaW5lci5zdHlsZS5taW5IZWlnaHQgPSBcIjFlbVwiO1xuICBpZiAod3JhcEluQ29udGFpbmVyKSB7XG4gICAgY29udGFpbmVyLnN0eWxlLm92ZXJmbG93ID0gXCJoaWRkZW5cIjtcbiAgICBjb250YWluZXIuc3R5bGUud29yZEJyZWFrID0gXCJicmVhay13b3JkXCI7XG4gICAgY29udGFpbmVyLnN0eWxlLndoaXRlU3BhY2UgPSBcInByZS13cmFwXCI7XG4gIH1cblxuICBjb250YWluZXIuc3R5bGUubGluZUhlaWdodCA9IFN0cmluZyhsaW5lSGVpZ2h0KTtcblxuICBjb250YWluZXIuaW5uZXJUZXh0ID0gdGV4dDtcblxuICAvLyBCYXNlbGluZSBpcyBpbXBvcnRhbnQgZm9yIHBvc2l0aW9uaW5nIHRleHQgb24gY2FudmFzXG4gIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoY29udGFpbmVyKTtcblxuICBjb25zdCBzcGFuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInNwYW5cIik7XG4gIHNwYW4uc3R5bGUuZGlzcGxheSA9IFwiaW5saW5lLWJsb2NrXCI7XG4gIHNwYW4uc3R5bGUub3ZlcmZsb3cgPSBcImhpZGRlblwiO1xuICBzcGFuLnN0eWxlLndpZHRoID0gXCIxcHhcIjtcbiAgc3Bhbi5zdHlsZS5oZWlnaHQgPSBcIjFweFwiO1xuICBjb250YWluZXIuYXBwZW5kQ2hpbGQoc3Bhbik7XG4gIGxldCBiYXNlbGluZSA9IHNwYW4ub2Zmc2V0VG9wICsgc3Bhbi5vZmZzZXRIZWlnaHQ7XG4gIGNvbnN0IGhlaWdodCA9IGNvbnRhaW5lci5vZmZzZXRIZWlnaHQ7XG5cbiAgaWYgKGlzU2FmYXJpKSB7XG4gICAgY29uc3QgY2FudmFzSGVpZ2h0ID0gZ2V0VGV4dEhlaWdodCh0ZXh0LCBwYXJzZUZsb2F0KGZvbnQpLCBsaW5lSGVpZ2h0KTtcbiAgICBjb25zdCBmb250U2l6ZSA9IHBhcnNlRmxvYXQoZm9udCk7XG4gICAgLy8gSW4gU2FmYXJpIHRoZSBmb250IHNpemUgZ2V0cyByb3VuZGVkIG9mZiB3aGVuIHJlbmRlcmluZyBoZW5jZSBjYWxjdWxhdGluZyB0aGUgc2FmYXJpIGhlaWdodCBhbmQgc2hpZnRpbmcgdGhlIGJhc2VsaW5lIGlmIGl0IGRpZmZlcnNcbiAgICAvLyBmcm9tIHRoZSBhY3R1YWwgY2FudmFzIGhlaWdodFxuICAgIGNvbnN0IGRvbUhlaWdodCA9IGdldFRleHRIZWlnaHQodGV4dCwgTWF0aC5yb3VuZChmb250U2l6ZSksIGxpbmVIZWlnaHQpO1xuICAgIGlmIChjYW52YXNIZWlnaHQgPiBoZWlnaHQpIHtcbiAgICAgIGJhc2VsaW5lICs9IGNhbnZhc0hlaWdodCAtIGRvbUhlaWdodDtcbiAgICB9XG5cbiAgICBpZiAoaGVpZ2h0ID4gY2FudmFzSGVpZ2h0KSB7XG4gICAgICBiYXNlbGluZSAtPSBkb21IZWlnaHQgLSBjYW52YXNIZWlnaHQ7XG4gICAgfVxuICB9XG4gIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoY29udGFpbmVyKTtcbiAgcmV0dXJuIGJhc2VsaW5lO1xufTtcblxuLyoqXG4gKiBUbyBnZXQgdW5pdGxlc3MgbGluZS1oZWlnaHQgKGlmIHVua25vd24pIHdlIGNhbiBjYWxjdWxhdGUgaXQgYnkgZGl2aWRpbmdcbiAqIGhlaWdodC1wZXItbGluZSBieSBmb250U2l6ZS5cbiAqL1xuZXhwb3J0IGNvbnN0IGRldGVjdExpbmVIZWlnaHQgPSAodGV4dEVsZW1lbnQ6IEV4Y2FsaWRyYXdUZXh0RWxlbWVudCkgPT4ge1xuICBjb25zdCBsaW5lQ291bnQgPSBzcGxpdEludG9MaW5lcyh0ZXh0RWxlbWVudC50ZXh0KS5sZW5ndGg7XG4gIHJldHVybiAodGV4dEVsZW1lbnQuaGVpZ2h0IC9cbiAgICBsaW5lQ291bnQgL1xuICAgIHRleHRFbGVtZW50LmZvbnRTaXplKSBhcyBFeGNhbGlkcmF3VGV4dEVsZW1lbnRbXCJsaW5lSGVpZ2h0XCJdO1xufTtcblxuLyoqXG4gKiBXZSBjYWxjdWxhdGUgdGhlIGxpbmUgaGVpZ2h0IGZyb20gdGhlIGZvbnQgc2l6ZSBhbmQgdGhlIHVuaXRsZXNzIGxpbmUgaGVpZ2h0LFxuICogYWxpZ25pbmcgd2l0aCB0aGUgVzNDIHNwZWMuXG4gKi9cbmV4cG9ydCBjb25zdCBnZXRMaW5lSGVpZ2h0SW5QeCA9IChcbiAgZm9udFNpemU6IEV4Y2FsaWRyYXdUZXh0RWxlbWVudFtcImZvbnRTaXplXCJdLFxuICBsaW5lSGVpZ2h0OiBFeGNhbGlkcmF3VGV4dEVsZW1lbnRbXCJsaW5lSGVpZ2h0XCJdLFxuKSA9PiB7XG4gIHJldHVybiBmb250U2l6ZSAqIGxpbmVIZWlnaHQ7XG59O1xuXG4vLyBGSVhNRSByZW5hbWUgdG8gZ2V0QXBwcm94TWluQ29udGFpbmVySGVpZ2h0XG5leHBvcnQgY29uc3QgZ2V0QXBwcm94TWluTGluZUhlaWdodCA9IChcbiAgZm9udFNpemU6IEV4Y2FsaWRyYXdUZXh0RWxlbWVudFtcImZvbnRTaXplXCJdLFxuICBsaW5lSGVpZ2h0OiBFeGNhbGlkcmF3VGV4dEVsZW1lbnRbXCJsaW5lSGVpZ2h0XCJdLFxuKSA9PiB7XG4gIHJldHVybiBnZXRMaW5lSGVpZ2h0SW5QeChmb250U2l6ZSwgbGluZUhlaWdodCkgKyBCT1VORF9URVhUX1BBRERJTkcgKiAyO1xufTtcblxubGV0IGNhbnZhczogSFRNTENhbnZhc0VsZW1lbnQgfCB1bmRlZmluZWQ7XG5cbmNvbnN0IGdldExpbmVXaWR0aCA9ICh0ZXh0OiBzdHJpbmcsIGZvbnQ6IEZvbnRTdHJpbmcpID0+IHtcbiAgaWYgKCFjYW52YXMpIHtcbiAgICBjYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiY2FudmFzXCIpO1xuICB9XG4gIGNvbnN0IGNhbnZhczJkQ29udGV4dCA9IGNhbnZhcy5nZXRDb250ZXh0KFwiMmRcIikhO1xuICBjYW52YXMyZENvbnRleHQuZm9udCA9IGZvbnQ7XG4gIGNvbnN0IHdpZHRoID0gY2FudmFzMmRDb250ZXh0Lm1lYXN1cmVUZXh0KHRleHQpLndpZHRoO1xuXG4gIC8vIHNpbmNlIGluIHRlc3QgZW52IHRoZSBjYW52YXMgbWVhc3VyZVRleHQgYWxnb1xuICAvLyBkb2Vzbid0IG1lYXN1cmUgdGV4dCBhbmQgaW5zdGVhZCBqdXN0IHJldHVybnMgbnVtYmVyIG9mXG4gIC8vIGNoYXJhY3RlcnMgaGVuY2Ugd2UgYXNzdW1lIHRoYXQgZWFjaCBsZXR0ZXJpcyAxMHB4XG4gIGlmIChpc1Rlc3RFbnYoKSkge1xuICAgIHJldHVybiB3aWR0aCAqIDEwO1xuICB9XG4gIHJldHVybiB3aWR0aDtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRUZXh0V2lkdGggPSAodGV4dDogc3RyaW5nLCBmb250OiBGb250U3RyaW5nKSA9PiB7XG4gIGNvbnN0IGxpbmVzID0gc3BsaXRJbnRvTGluZXModGV4dCk7XG4gIGxldCB3aWR0aCA9IDA7XG4gIGxpbmVzLmZvckVhY2goKGxpbmUpID0+IHtcbiAgICB3aWR0aCA9IE1hdGgubWF4KHdpZHRoLCBnZXRMaW5lV2lkdGgobGluZSwgZm9udCkpO1xuICB9KTtcbiAgcmV0dXJuIHdpZHRoO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldFRleHRIZWlnaHQgPSAoXG4gIHRleHQ6IHN0cmluZyxcbiAgZm9udFNpemU6IG51bWJlcixcbiAgbGluZUhlaWdodDogRXhjYWxpZHJhd1RleHRFbGVtZW50W1wibGluZUhlaWdodFwiXSxcbikgPT4ge1xuICBjb25zdCBsaW5lQ291bnQgPSBzcGxpdEludG9MaW5lcyh0ZXh0KS5sZW5ndGg7XG4gIHJldHVybiBnZXRMaW5lSGVpZ2h0SW5QeChmb250U2l6ZSwgbGluZUhlaWdodCkgKiBsaW5lQ291bnQ7XG59O1xuXG5leHBvcnQgY29uc3QgcGFyc2VUb2tlbnMgPSAodGV4dDogc3RyaW5nKSA9PiB7XG4gIC8vIFNwbGl0dGluZyB3b3JkcyBjb250YWluaW5nIFwiLVwiIGFzIHRob3NlIGFyZSB0cmVhdGVkIGFzIHNlcGFyYXRlIHdvcmRzXG4gIC8vIGJ5IGNzcyB3cmFwcGluZyBhbGdvcml0aG0gZWcgbm9uLXByb2ZpdCA9PiBub24tLCBwcm9maXRcbiAgY29uc3Qgd29yZHMgPSB0ZXh0LnNwbGl0KFwiLVwiKTtcbiAgaWYgKHdvcmRzLmxlbmd0aCA+IDEpIHtcbiAgICAvLyBub24tcHJvZnQgb3JnID0+IFsnbm9uLScsICdwcm9maXQgb3JnJ11cbiAgICB3b3Jkcy5mb3JFYWNoKCh3b3JkLCBpbmRleCkgPT4ge1xuICAgICAgaWYgKGluZGV4ICE9PSB3b3Jkcy5sZW5ndGggLSAxKSB7XG4gICAgICAgIHdvcmRzW2luZGV4XSA9IHdvcmQgKz0gXCItXCI7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbiAgLy8gSm9pbmluZyB0aGUgd29yZHMgd2l0aCBzcGFjZSBhbmQgc3BsaXR0aW5nIHRoZW0gYWdhaW4gd2l0aCBzcGFjZSB0byBnZXQgdGhlXG4gIC8vIGZpbmFsIGxpc3Qgb2YgdG9rZW5zXG4gIC8vIFsnbm9uLScsICdwcm9maXQgb3JnJ10gPT4sJ25vbi0gcHJvZnQgb3JnJyA9PiBbJ25vbi0nLCdwcm9maXQnLCdvcmcnXVxuICByZXR1cm4gd29yZHMuam9pbihcIiBcIikuc3BsaXQoXCIgXCIpO1xufTtcblxuZXhwb3J0IGNvbnN0IHdyYXBUZXh0ID0gKHRleHQ6IHN0cmluZywgZm9udDogRm9udFN0cmluZywgbWF4V2lkdGg6IG51bWJlcikgPT4ge1xuICAvLyBpZiBtYXhXaWR0aCBpcyBub3QgZmluaXRlIG9yIE5hTiB3aGljaCBjYW4gaGFwcGVuIGluIGNhc2Ugb2YgYnVncyBpblxuICAvLyBjb21wdXRhdGlvbiwgd2UgbmVlZCB0byBtYWtlIHN1cmUgd2UgZG9uJ3QgY29udGludWUgYXMgd2UnbGwgZW5kIHVwXG4gIC8vIGluIGFuIGluZmluaXRlIGxvb3BcbiAgaWYgKCFOdW1iZXIuaXNGaW5pdGUobWF4V2lkdGgpIHx8IG1heFdpZHRoIDwgMCkge1xuICAgIHJldHVybiB0ZXh0O1xuICB9XG5cbiAgY29uc3QgbGluZXM6IEFycmF5PHN0cmluZz4gPSBbXTtcbiAgY29uc3Qgb3JpZ2luYWxMaW5lcyA9IHRleHQuc3BsaXQoXCJcXG5cIik7XG4gIGNvbnN0IHNwYWNlV2lkdGggPSBnZXRMaW5lV2lkdGgoXCIgXCIsIGZvbnQpO1xuXG4gIGxldCBjdXJyZW50TGluZSA9IFwiXCI7XG4gIGxldCBjdXJyZW50TGluZVdpZHRoVGlsbE5vdyA9IDA7XG5cbiAgY29uc3QgcHVzaCA9IChzdHI6IHN0cmluZykgPT4ge1xuICAgIGlmIChzdHIudHJpbSgpKSB7XG4gICAgICBsaW5lcy5wdXNoKHN0cik7XG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IHJlc2V0UGFyYW1zID0gKCkgPT4ge1xuICAgIGN1cnJlbnRMaW5lID0gXCJcIjtcbiAgICBjdXJyZW50TGluZVdpZHRoVGlsbE5vdyA9IDA7XG4gIH07XG4gIG9yaWdpbmFsTGluZXMuZm9yRWFjaCgob3JpZ2luYWxMaW5lKSA9PiB7XG4gICAgY29uc3QgY3VycmVudExpbmVXaWR0aCA9IGdldFRleHRXaWR0aChvcmlnaW5hbExpbmUsIGZvbnQpO1xuXG4gICAgLy8gUHVzaCB0aGUgbGluZSBpZiBpdHMgPD0gbWF4V2lkdGhcbiAgICBpZiAoY3VycmVudExpbmVXaWR0aCA8PSBtYXhXaWR0aCkge1xuICAgICAgbGluZXMucHVzaChvcmlnaW5hbExpbmUpO1xuICAgICAgcmV0dXJuOyAvLyBjb250aW51ZVxuICAgIH1cblxuICAgIGNvbnN0IHdvcmRzID0gcGFyc2VUb2tlbnMob3JpZ2luYWxMaW5lKTtcbiAgICByZXNldFBhcmFtcygpO1xuXG4gICAgbGV0IGluZGV4ID0gMDtcblxuICAgIHdoaWxlIChpbmRleCA8IHdvcmRzLmxlbmd0aCkge1xuICAgICAgY29uc3QgY3VycmVudFdvcmRXaWR0aCA9IGdldExpbmVXaWR0aCh3b3Jkc1tpbmRleF0sIGZvbnQpO1xuXG4gICAgICAvLyBUaGlzIHdpbGwgb25seSBoYXBwZW4gd2hlbiBzaW5nbGUgd29yZCB0YWtlcyBlbnRpcmUgd2lkdGhcbiAgICAgIGlmIChjdXJyZW50V29yZFdpZHRoID09PSBtYXhXaWR0aCkge1xuICAgICAgICBwdXNoKHdvcmRzW2luZGV4XSk7XG4gICAgICAgIGluZGV4Kys7XG4gICAgICB9XG5cbiAgICAgIC8vIFN0YXJ0IGJyZWFraW5nIGxvbmdlciB3b3JkcyBleGNlZWRpbmcgbWF4IHdpZHRoXG4gICAgICBlbHNlIGlmIChjdXJyZW50V29yZFdpZHRoID4gbWF4V2lkdGgpIHtcbiAgICAgICAgLy8gcHVzaCBjdXJyZW50IGxpbmUgc2luY2UgdGhlIGN1cnJlbnQgd29yZCBleGNlZWRzIHRoZSBtYXggd2lkdGhcbiAgICAgICAgLy8gc28gd2lsbCBiZSBhcHBlbmRlZCBpbiBuZXh0IGxpbmVcblxuICAgICAgICBwdXNoKGN1cnJlbnRMaW5lKTtcblxuICAgICAgICByZXNldFBhcmFtcygpO1xuXG4gICAgICAgIHdoaWxlICh3b3Jkc1tpbmRleF0ubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGNvbnN0IGN1cnJlbnRDaGFyID0gU3RyaW5nLmZyb21Db2RlUG9pbnQoXG4gICAgICAgICAgICB3b3Jkc1tpbmRleF0uY29kZVBvaW50QXQoMCkhLFxuICAgICAgICAgICk7XG4gICAgICAgICAgY29uc3Qgd2lkdGggPSBjaGFyV2lkdGguY2FsY3VsYXRlKGN1cnJlbnRDaGFyLCBmb250KTtcbiAgICAgICAgICBjdXJyZW50TGluZVdpZHRoVGlsbE5vdyArPSB3aWR0aDtcbiAgICAgICAgICB3b3Jkc1tpbmRleF0gPSB3b3Jkc1tpbmRleF0uc2xpY2UoY3VycmVudENoYXIubGVuZ3RoKTtcblxuICAgICAgICAgIGlmIChjdXJyZW50TGluZVdpZHRoVGlsbE5vdyA+PSBtYXhXaWR0aCkge1xuICAgICAgICAgICAgcHVzaChjdXJyZW50TGluZSk7XG4gICAgICAgICAgICBjdXJyZW50TGluZSA9IGN1cnJlbnRDaGFyO1xuICAgICAgICAgICAgY3VycmVudExpbmVXaWR0aFRpbGxOb3cgPSB3aWR0aDtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY3VycmVudExpbmUgKz0gY3VycmVudENoYXI7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIHB1c2ggY3VycmVudCBsaW5lIGlmIGFwcGVuZGluZyBzcGFjZSBleGNlZWRzIG1heCB3aWR0aFxuICAgICAgICBpZiAoY3VycmVudExpbmVXaWR0aFRpbGxOb3cgKyBzcGFjZVdpZHRoID49IG1heFdpZHRoKSB7XG4gICAgICAgICAgcHVzaChjdXJyZW50TGluZSk7XG4gICAgICAgICAgcmVzZXRQYXJhbXMoKTtcbiAgICAgICAgICAvLyBzcGFjZSBuZWVkcyB0byBiZSBhcHBlbmRlZCBiZWZvcmUgbmV4dCB3b3JkXG4gICAgICAgICAgLy8gYXMgY3VycmVudExpbmUgY29udGFpbnMgY2hhcnMgd2hpY2ggY291bGRuJ3QgYmUgYXBwZW5kZWRcbiAgICAgICAgICAvLyB0byBwcmV2aW91cyBsaW5lIHVubGVzcyB0aGUgbGluZSBlbmRzIHdpdGggaHlwaGVuIHRvIHN5bmNcbiAgICAgICAgICAvLyB3aXRoIGNzcyB3b3JkLXdyYXBcbiAgICAgICAgfSBlbHNlIGlmICghY3VycmVudExpbmUuZW5kc1dpdGgoXCItXCIpKSB7XG4gICAgICAgICAgY3VycmVudExpbmUgKz0gXCIgXCI7XG4gICAgICAgICAgY3VycmVudExpbmVXaWR0aFRpbGxOb3cgKz0gc3BhY2VXaWR0aDtcbiAgICAgICAgfVxuICAgICAgICBpbmRleCsrO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gU3RhcnQgYXBwZW5kaW5nIHdvcmRzIGluIGEgbGluZSB0aWxsIG1heCB3aWR0aCByZWFjaGVkXG4gICAgICAgIHdoaWxlIChjdXJyZW50TGluZVdpZHRoVGlsbE5vdyA8IG1heFdpZHRoICYmIGluZGV4IDwgd29yZHMubGVuZ3RoKSB7XG4gICAgICAgICAgY29uc3Qgd29yZCA9IHdvcmRzW2luZGV4XTtcbiAgICAgICAgICBjdXJyZW50TGluZVdpZHRoVGlsbE5vdyA9IGdldExpbmVXaWR0aChjdXJyZW50TGluZSArIHdvcmQsIGZvbnQpO1xuXG4gICAgICAgICAgaWYgKGN1cnJlbnRMaW5lV2lkdGhUaWxsTm93ID4gbWF4V2lkdGgpIHtcbiAgICAgICAgICAgIHB1c2goY3VycmVudExpbmUpO1xuICAgICAgICAgICAgcmVzZXRQYXJhbXMoKTtcblxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICAgIGluZGV4Kys7XG5cbiAgICAgICAgICAvLyBpZiB3b3JkIGVuZHMgd2l0aCBcIi1cIiB0aGVuIHdlIGRvbid0IG5lZWQgdG8gYWRkIHNwYWNlXG4gICAgICAgICAgLy8gdG8gc3luYyB3aXRoIGNzcyB3b3JkLXdyYXBcbiAgICAgICAgICBjb25zdCBzaG91bGRBcHBlbmRTcGFjZSA9ICF3b3JkLmVuZHNXaXRoKFwiLVwiKTtcbiAgICAgICAgICBjdXJyZW50TGluZSArPSB3b3JkO1xuXG4gICAgICAgICAgaWYgKHNob3VsZEFwcGVuZFNwYWNlKSB7XG4gICAgICAgICAgICBjdXJyZW50TGluZSArPSBcIiBcIjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBQdXNoIHRoZSB3b3JkIGlmIGFwcGVuZGluZyBzcGFjZSBleGNlZWRzIG1heCB3aWR0aFxuICAgICAgICAgIGlmIChjdXJyZW50TGluZVdpZHRoVGlsbE5vdyArIHNwYWNlV2lkdGggPj0gbWF4V2lkdGgpIHtcbiAgICAgICAgICAgIGlmIChzaG91bGRBcHBlbmRTcGFjZSkge1xuICAgICAgICAgICAgICBsaW5lcy5wdXNoKGN1cnJlbnRMaW5lLnNsaWNlKDAsIC0xKSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBsaW5lcy5wdXNoKGN1cnJlbnRMaW5lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJlc2V0UGFyYW1zKCk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGN1cnJlbnRMaW5lLnNsaWNlKC0xKSA9PT0gXCIgXCIpIHtcbiAgICAgIC8vIG9ubHkgcmVtb3ZlIGxhc3QgdHJhaWxpbmcgc3BhY2Ugd2hpY2ggd2UgaGF2ZSBhZGRlZCB3aGVuIGpvaW5pbmcgd29yZHNcbiAgICAgIGN1cnJlbnRMaW5lID0gY3VycmVudExpbmUuc2xpY2UoMCwgLTEpO1xuICAgICAgcHVzaChjdXJyZW50TGluZSk7XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIGxpbmVzLmpvaW4oXCJcXG5cIik7XG59O1xuXG5leHBvcnQgY29uc3QgY2hhcldpZHRoID0gKCgpID0+IHtcbiAgY29uc3QgY2FjaGVkQ2hhcldpZHRoOiB7IFtrZXk6IEZvbnRTdHJpbmddOiBBcnJheTxudW1iZXI+IH0gPSB7fTtcblxuICBjb25zdCBjYWxjdWxhdGUgPSAoY2hhcjogc3RyaW5nLCBmb250OiBGb250U3RyaW5nKSA9PiB7XG4gICAgY29uc3QgYXNjaWkgPSBjaGFyLmNoYXJDb2RlQXQoMCk7XG4gICAgaWYgKCFjYWNoZWRDaGFyV2lkdGhbZm9udF0pIHtcbiAgICAgIGNhY2hlZENoYXJXaWR0aFtmb250XSA9IFtdO1xuICAgIH1cbiAgICBpZiAoIWNhY2hlZENoYXJXaWR0aFtmb250XVthc2NpaV0pIHtcbiAgICAgIGNvbnN0IHdpZHRoID0gZ2V0TGluZVdpZHRoKGNoYXIsIGZvbnQpO1xuICAgICAgY2FjaGVkQ2hhcldpZHRoW2ZvbnRdW2FzY2lpXSA9IHdpZHRoO1xuICAgIH1cblxuICAgIHJldHVybiBjYWNoZWRDaGFyV2lkdGhbZm9udF1bYXNjaWldO1xuICB9O1xuXG4gIGNvbnN0IGdldENhY2hlID0gKGZvbnQ6IEZvbnRTdHJpbmcpID0+IHtcbiAgICByZXR1cm4gY2FjaGVkQ2hhcldpZHRoW2ZvbnRdO1xuICB9O1xuICByZXR1cm4ge1xuICAgIGNhbGN1bGF0ZSxcbiAgICBnZXRDYWNoZSxcbiAgfTtcbn0pKCk7XG5cbmNvbnN0IERVTU1ZX1RFWFQgPSBcIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaMDEyMzQ1Njc4OVwiLnRvTG9jYWxlVXBwZXJDYXNlKCk7XG5cbi8vIEZJWE1FIHJlbmFtZSB0byBnZXRBcHByb3hNaW5Db250YWluZXJXaWR0aFxuZXhwb3J0IGNvbnN0IGdldEFwcHJveE1pbkxpbmVXaWR0aCA9IChcbiAgZm9udDogRm9udFN0cmluZyxcbiAgbGluZUhlaWdodDogRXhjYWxpZHJhd1RleHRFbGVtZW50W1wibGluZUhlaWdodFwiXSxcbikgPT4ge1xuICBjb25zdCBtYXhDaGFyV2lkdGggPSBnZXRNYXhDaGFyV2lkdGgoZm9udCk7XG4gIGlmIChtYXhDaGFyV2lkdGggPT09IDApIHtcbiAgICByZXR1cm4gKFxuICAgICAgbWVhc3VyZVRleHQoRFVNTVlfVEVYVC5zcGxpdChcIlwiKS5qb2luKFwiXFxuXCIpLCBmb250LCBsaW5lSGVpZ2h0KS53aWR0aCArXG4gICAgICBCT1VORF9URVhUX1BBRERJTkcgKiAyXG4gICAgKTtcbiAgfVxuICByZXR1cm4gbWF4Q2hhcldpZHRoICsgQk9VTkRfVEVYVF9QQURESU5HICogMjtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRNaW5DaGFyV2lkdGggPSAoZm9udDogRm9udFN0cmluZykgPT4ge1xuICBjb25zdCBjYWNoZSA9IGNoYXJXaWR0aC5nZXRDYWNoZShmb250KTtcbiAgaWYgKCFjYWNoZSkge1xuICAgIHJldHVybiAwO1xuICB9XG4gIGNvbnN0IGNhY2hlV2l0aE91dEVtcHR5ID0gY2FjaGUuZmlsdGVyKCh2YWwpID0+IHZhbCAhPT0gdW5kZWZpbmVkKTtcblxuICByZXR1cm4gTWF0aC5taW4oLi4uY2FjaGVXaXRoT3V0RW1wdHkpO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldE1heENoYXJXaWR0aCA9IChmb250OiBGb250U3RyaW5nKSA9PiB7XG4gIGNvbnN0IGNhY2hlID0gY2hhcldpZHRoLmdldENhY2hlKGZvbnQpO1xuICBpZiAoIWNhY2hlKSB7XG4gICAgcmV0dXJuIDA7XG4gIH1cbiAgY29uc3QgY2FjaGVXaXRoT3V0RW1wdHkgPSBjYWNoZS5maWx0ZXIoKHZhbCkgPT4gdmFsICE9PSB1bmRlZmluZWQpO1xuICByZXR1cm4gTWF0aC5tYXgoLi4uY2FjaGVXaXRoT3V0RW1wdHkpO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldEFwcHJveENoYXJzVG9GaXRJbldpZHRoID0gKGZvbnQ6IEZvbnRTdHJpbmcsIHdpZHRoOiBudW1iZXIpID0+IHtcbiAgLy8gR2VuZXJhbGx5IGxvd2VyIGNhc2UgaXMgdXNlZCBzbyBjb252ZXJ0aW5nIHRvIGxvd2VyIGNhc2VcbiAgY29uc3QgZHVtbXlUZXh0ID0gRFVNTVlfVEVYVC50b0xvY2FsZUxvd2VyQ2FzZSgpO1xuICBjb25zdCBiYXRjaExlbmd0aCA9IDY7XG4gIGxldCBpbmRleCA9IDA7XG4gIGxldCB3aWR0aFRpbGxOb3cgPSAwO1xuICBsZXQgc3RyID0gXCJcIjtcbiAgd2hpbGUgKHdpZHRoVGlsbE5vdyA8PSB3aWR0aCkge1xuICAgIGNvbnN0IGJhdGNoID0gZHVtbXlUZXh0LnN1YnN0cihpbmRleCwgaW5kZXggKyBiYXRjaExlbmd0aCk7XG4gICAgc3RyICs9IGJhdGNoO1xuICAgIHdpZHRoVGlsbE5vdyArPSBnZXRMaW5lV2lkdGgoc3RyLCBmb250KTtcbiAgICBpZiAoaW5kZXggPT09IGR1bW15VGV4dC5sZW5ndGggLSAxKSB7XG4gICAgICBpbmRleCA9IDA7XG4gICAgfVxuICAgIGluZGV4ID0gaW5kZXggKyBiYXRjaExlbmd0aDtcbiAgfVxuXG4gIHdoaWxlICh3aWR0aFRpbGxOb3cgPiB3aWR0aCkge1xuICAgIHN0ciA9IHN0ci5zdWJzdHIoMCwgc3RyLmxlbmd0aCAtIDEpO1xuICAgIHdpZHRoVGlsbE5vdyA9IGdldExpbmVXaWR0aChzdHIsIGZvbnQpO1xuICB9XG4gIHJldHVybiBzdHIubGVuZ3RoO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldEJvdW5kVGV4dEVsZW1lbnRJZCA9IChjb250YWluZXI6IEV4Y2FsaWRyYXdFbGVtZW50IHwgbnVsbCkgPT4ge1xuICByZXR1cm4gY29udGFpbmVyPy5ib3VuZEVsZW1lbnRzPy5sZW5ndGhcbiAgICA/IGNvbnRhaW5lcj8uYm91bmRFbGVtZW50cz8uZmlsdGVyKChlbGUpID0+IGVsZS50eXBlID09PSBcInRleHRcIilbMF0/LmlkIHx8XG4gICAgICAgIG51bGxcbiAgICA6IG51bGw7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0Qm91bmRUZXh0RWxlbWVudCA9IChlbGVtZW50OiBFeGNhbGlkcmF3RWxlbWVudCB8IG51bGwpID0+IHtcbiAgaWYgKCFlbGVtZW50KSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgY29uc3QgYm91bmRUZXh0RWxlbWVudElkID0gZ2V0Qm91bmRUZXh0RWxlbWVudElkKGVsZW1lbnQpO1xuICBpZiAoYm91bmRUZXh0RWxlbWVudElkKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIChTY2VuZS5nZXRTY2VuZShlbGVtZW50KT8uZ2V0RWxlbWVudChcbiAgICAgICAgYm91bmRUZXh0RWxlbWVudElkLFxuICAgICAgKSBhcyBFeGNhbGlkcmF3VGV4dEVsZW1lbnRXaXRoQ29udGFpbmVyKSB8fCBudWxsXG4gICAgKTtcbiAgfVxuICByZXR1cm4gbnVsbDtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRDb250YWluZXJFbGVtZW50ID0gKFxuICBlbGVtZW50OlxuICAgIHwgKEV4Y2FsaWRyYXdFbGVtZW50ICYge1xuICAgICAgICBjb250YWluZXJJZDogRXhjYWxpZHJhd0VsZW1lbnRbXCJpZFwiXSB8IG51bGw7XG4gICAgICB9KVxuICAgIHwgbnVsbCxcbikgPT4ge1xuICBpZiAoIWVsZW1lbnQpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBpZiAoZWxlbWVudC5jb250YWluZXJJZCkge1xuICAgIHJldHVybiBTY2VuZS5nZXRTY2VuZShlbGVtZW50KT8uZ2V0RWxlbWVudChlbGVtZW50LmNvbnRhaW5lcklkKSB8fCBudWxsO1xuICB9XG4gIHJldHVybiBudWxsO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldENvbnRhaW5lckRpbXMgPSAoZWxlbWVudDogRXhjYWxpZHJhd0VsZW1lbnQpID0+IHtcbiAgY29uc3QgTUlOX1dJRFRIID0gMzAwO1xuICBpZiAoaXNBcnJvd0VsZW1lbnQoZWxlbWVudCkpIHtcbiAgICBjb25zdCB3aWR0aCA9IE1hdGgubWF4KGVsZW1lbnQud2lkdGgsIE1JTl9XSURUSCk7XG4gICAgY29uc3QgaGVpZ2h0ID0gZWxlbWVudC5oZWlnaHQ7XG4gICAgcmV0dXJuIHsgd2lkdGgsIGhlaWdodCB9O1xuICB9XG4gIHJldHVybiB7IHdpZHRoOiBlbGVtZW50LndpZHRoLCBoZWlnaHQ6IGVsZW1lbnQuaGVpZ2h0IH07XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0Q29udGFpbmVyQ2VudGVyID0gKFxuICBjb250YWluZXI6IEV4Y2FsaWRyYXdFbGVtZW50LFxuICBhcHBTdGF0ZTogQXBwU3RhdGUsXG4pID0+IHtcbiAgaWYgKCFpc0Fycm93RWxlbWVudChjb250YWluZXIpKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHg6IGNvbnRhaW5lci54ICsgY29udGFpbmVyLndpZHRoIC8gMixcbiAgICAgIHk6IGNvbnRhaW5lci55ICsgY29udGFpbmVyLmhlaWdodCAvIDIsXG4gICAgfTtcbiAgfVxuICBjb25zdCBwb2ludHMgPSBMaW5lYXJFbGVtZW50RWRpdG9yLmdldFBvaW50c0dsb2JhbENvb3JkaW5hdGVzKGNvbnRhaW5lcik7XG4gIGlmIChwb2ludHMubGVuZ3RoICUgMiA9PT0gMSkge1xuICAgIGNvbnN0IGluZGV4ID0gTWF0aC5mbG9vcihjb250YWluZXIucG9pbnRzLmxlbmd0aCAvIDIpO1xuICAgIGNvbnN0IG1pZFBvaW50ID0gTGluZWFyRWxlbWVudEVkaXRvci5nZXRQb2ludEdsb2JhbENvb3JkaW5hdGVzKFxuICAgICAgY29udGFpbmVyLFxuICAgICAgY29udGFpbmVyLnBvaW50c1tpbmRleF0sXG4gICAgKTtcbiAgICByZXR1cm4geyB4OiBtaWRQb2ludFswXSwgeTogbWlkUG9pbnRbMV0gfTtcbiAgfVxuICBjb25zdCBpbmRleCA9IGNvbnRhaW5lci5wb2ludHMubGVuZ3RoIC8gMiAtIDE7XG4gIGxldCBtaWRTZWdtZW50TWlkcG9pbnQgPSBMaW5lYXJFbGVtZW50RWRpdG9yLmdldEVkaXRvck1pZFBvaW50cyhcbiAgICBjb250YWluZXIsXG4gICAgYXBwU3RhdGUsXG4gIClbaW5kZXhdO1xuICBpZiAoIW1pZFNlZ21lbnRNaWRwb2ludCkge1xuICAgIG1pZFNlZ21lbnRNaWRwb2ludCA9IExpbmVhckVsZW1lbnRFZGl0b3IuZ2V0U2VnbWVudE1pZFBvaW50KFxuICAgICAgY29udGFpbmVyLFxuICAgICAgcG9pbnRzW2luZGV4XSxcbiAgICAgIHBvaW50c1tpbmRleCArIDFdLFxuICAgICAgaW5kZXggKyAxLFxuICAgICk7XG4gIH1cbiAgcmV0dXJuIHsgeDogbWlkU2VnbWVudE1pZHBvaW50WzBdLCB5OiBtaWRTZWdtZW50TWlkcG9pbnRbMV0gfTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRDb250YWluZXJDb29yZHMgPSAoY29udGFpbmVyOiBOb25EZWxldGVkRXhjYWxpZHJhd0VsZW1lbnQpID0+IHtcbiAgbGV0IG9mZnNldFggPSBCT1VORF9URVhUX1BBRERJTkc7XG4gIGxldCBvZmZzZXRZID0gQk9VTkRfVEVYVF9QQURESU5HO1xuXG4gIGlmIChjb250YWluZXIudHlwZSA9PT0gXCJlbGxpcHNlXCIpIHtcbiAgICAvLyBUaGUgZGVyaXZhdGlvbiBvZiBjb29yZGluYXRlcyBpcyBleHBsYWluZWQgaW4gaHR0cHM6Ly9naXRodWIuY29tL2V4Y2FsaWRyYXcvZXhjYWxpZHJhdy9wdWxsLzYxNzJcbiAgICBvZmZzZXRYICs9IChjb250YWluZXIud2lkdGggLyAyKSAqICgxIC0gTWF0aC5zcXJ0KDIpIC8gMik7XG4gICAgb2Zmc2V0WSArPSAoY29udGFpbmVyLmhlaWdodCAvIDIpICogKDEgLSBNYXRoLnNxcnQoMikgLyAyKTtcbiAgfVxuICAvLyBUaGUgZGVyaXZhdGlvbiBvZiBjb29yZGluYXRlcyBpcyBleHBsYWluZWQgaW4gaHR0cHM6Ly9naXRodWIuY29tL2V4Y2FsaWRyYXcvZXhjYWxpZHJhdy9wdWxsLzYyNjVcbiAgaWYgKGNvbnRhaW5lci50eXBlID09PSBcImRpYW1vbmRcIikge1xuICAgIG9mZnNldFggKz0gY29udGFpbmVyLndpZHRoIC8gNDtcbiAgICBvZmZzZXRZICs9IGNvbnRhaW5lci5oZWlnaHQgLyA0O1xuICB9XG4gIHJldHVybiB7XG4gICAgeDogY29udGFpbmVyLnggKyBvZmZzZXRYLFxuICAgIHk6IGNvbnRhaW5lci55ICsgb2Zmc2V0WSxcbiAgfTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRUZXh0RWxlbWVudEFuZ2xlID0gKHRleHRFbGVtZW50OiBFeGNhbGlkcmF3VGV4dEVsZW1lbnQpID0+IHtcbiAgY29uc3QgY29udGFpbmVyID0gZ2V0Q29udGFpbmVyRWxlbWVudCh0ZXh0RWxlbWVudCk7XG4gIGlmICghY29udGFpbmVyIHx8IGlzQXJyb3dFbGVtZW50KGNvbnRhaW5lcikpIHtcbiAgICByZXR1cm4gdGV4dEVsZW1lbnQuYW5nbGU7XG4gIH1cbiAgcmV0dXJuIGNvbnRhaW5lci5hbmdsZTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRCb3VuZFRleHRFbGVtZW50T2Zmc2V0ID0gKFxuICBib3VuZFRleHRFbGVtZW50OiBFeGNhbGlkcmF3VGV4dEVsZW1lbnQgfCBudWxsLFxuKSA9PiB7XG4gIGNvbnN0IGNvbnRhaW5lciA9IGdldENvbnRhaW5lckVsZW1lbnQoYm91bmRUZXh0RWxlbWVudCk7XG4gIGlmICghY29udGFpbmVyIHx8ICFib3VuZFRleHRFbGVtZW50KSB7XG4gICAgcmV0dXJuIDA7XG4gIH1cbiAgaWYgKGlzQXJyb3dFbGVtZW50KGNvbnRhaW5lcikpIHtcbiAgICByZXR1cm4gQk9VTkRfVEVYVF9QQURESU5HICogODtcbiAgfVxuXG4gIHJldHVybiBCT1VORF9URVhUX1BBRERJTkc7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0Qm91bmRUZXh0RWxlbWVudFBvc2l0aW9uID0gKFxuICBjb250YWluZXI6IEV4Y2FsaWRyYXdFbGVtZW50LFxuICBib3VuZFRleHRFbGVtZW50OiBFeGNhbGlkcmF3VGV4dEVsZW1lbnRXaXRoQ29udGFpbmVyLFxuKSA9PiB7XG4gIGlmIChpc0Fycm93RWxlbWVudChjb250YWluZXIpKSB7XG4gICAgcmV0dXJuIExpbmVhckVsZW1lbnRFZGl0b3IuZ2V0Qm91bmRUZXh0RWxlbWVudFBvc2l0aW9uKFxuICAgICAgY29udGFpbmVyLFxuICAgICAgYm91bmRUZXh0RWxlbWVudCxcbiAgICApO1xuICB9XG59O1xuXG5leHBvcnQgY29uc3Qgc2hvdWxkQWxsb3dWZXJ0aWNhbEFsaWduID0gKFxuICBzZWxlY3RlZEVsZW1lbnRzOiBOb25EZWxldGVkRXhjYWxpZHJhd0VsZW1lbnRbXSxcbikgPT4ge1xuICByZXR1cm4gc2VsZWN0ZWRFbGVtZW50cy5zb21lKChlbGVtZW50KSA9PiB7XG4gICAgY29uc3QgaGFzQm91bmRDb250YWluZXIgPSBpc0JvdW5kVG9Db250YWluZXIoZWxlbWVudCk7XG4gICAgaWYgKGhhc0JvdW5kQ29udGFpbmVyKSB7XG4gICAgICBjb25zdCBjb250YWluZXIgPSBnZXRDb250YWluZXJFbGVtZW50KGVsZW1lbnQpO1xuICAgICAgaWYgKGlzVGV4dEVsZW1lbnQoZWxlbWVudCkgJiYgaXNBcnJvd0VsZW1lbnQoY29udGFpbmVyKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9KTtcbn07XG5cbmV4cG9ydCBjb25zdCBzdXBwcG9ydHNIb3Jpem9udGFsQWxpZ24gPSAoXG4gIHNlbGVjdGVkRWxlbWVudHM6IE5vbkRlbGV0ZWRFeGNhbGlkcmF3RWxlbWVudFtdLFxuKSA9PiB7XG4gIHJldHVybiBzZWxlY3RlZEVsZW1lbnRzLnNvbWUoKGVsZW1lbnQpID0+IHtcbiAgICBjb25zdCBoYXNCb3VuZENvbnRhaW5lciA9IGlzQm91bmRUb0NvbnRhaW5lcihlbGVtZW50KTtcbiAgICBpZiAoaGFzQm91bmRDb250YWluZXIpIHtcbiAgICAgIGNvbnN0IGNvbnRhaW5lciA9IGdldENvbnRhaW5lckVsZW1lbnQoZWxlbWVudCk7XG4gICAgICBpZiAoaXNUZXh0RWxlbWVudChlbGVtZW50KSAmJiBpc0Fycm93RWxlbWVudChjb250YWluZXIpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiBpc1RleHRFbGVtZW50KGVsZW1lbnQpO1xuICB9KTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRUZXh0QmluZGFibGVDb250YWluZXJBdFBvc2l0aW9uID0gKFxuICBlbGVtZW50czogcmVhZG9ubHkgRXhjYWxpZHJhd0VsZW1lbnRbXSxcbiAgYXBwU3RhdGU6IEFwcFN0YXRlLFxuICB4OiBudW1iZXIsXG4gIHk6IG51bWJlcixcbik6IEV4Y2FsaWRyYXdUZXh0Q29udGFpbmVyIHwgbnVsbCA9PiB7XG4gIGNvbnN0IHNlbGVjdGVkRWxlbWVudHMgPSBnZXRTZWxlY3RlZEVsZW1lbnRzKGVsZW1lbnRzLCBhcHBTdGF0ZSk7XG4gIGlmIChzZWxlY3RlZEVsZW1lbnRzLmxlbmd0aCA9PT0gMSkge1xuICAgIHJldHVybiBpc1RleHRCaW5kYWJsZUNvbnRhaW5lcihzZWxlY3RlZEVsZW1lbnRzWzBdLCBmYWxzZSlcbiAgICAgID8gc2VsZWN0ZWRFbGVtZW50c1swXVxuICAgICAgOiBudWxsO1xuICB9XG4gIGxldCBoaXRFbGVtZW50ID0gbnVsbDtcbiAgLy8gV2UgbmVlZCB0byB0byBoaXQgdGVzdGluZyBmcm9tIGZyb250IChlbmQgb2YgdGhlIGFycmF5KSB0byBiYWNrIChiZWdpbm5pbmcgb2YgdGhlIGFycmF5KVxuICBmb3IgKGxldCBpbmRleCA9IGVsZW1lbnRzLmxlbmd0aCAtIDE7IGluZGV4ID49IDA7IC0taW5kZXgpIHtcbiAgICBpZiAoZWxlbWVudHNbaW5kZXhdLmlzRGVsZXRlZCkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGNvbnN0IFt4MSwgeTEsIHgyLCB5Ml0gPSBnZXRFbGVtZW50QWJzb2x1dGVDb29yZHMoZWxlbWVudHNbaW5kZXhdKTtcbiAgICBpZiAoXG4gICAgICBpc0Fycm93RWxlbWVudChlbGVtZW50c1tpbmRleF0pICYmXG4gICAgICBpc0hpdHRpbmdFbGVtZW50Tm90Q29uc2lkZXJpbmdCb3VuZGluZ0JveChlbGVtZW50c1tpbmRleF0sIGFwcFN0YXRlLCBbXG4gICAgICAgIHgsXG4gICAgICAgIHksXG4gICAgICBdKVxuICAgICkge1xuICAgICAgaGl0RWxlbWVudCA9IGVsZW1lbnRzW2luZGV4XTtcbiAgICAgIGJyZWFrO1xuICAgIH0gZWxzZSBpZiAoeDEgPCB4ICYmIHggPCB4MiAmJiB5MSA8IHkgJiYgeSA8IHkyKSB7XG4gICAgICBoaXRFbGVtZW50ID0gZWxlbWVudHNbaW5kZXhdO1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGlzVGV4dEJpbmRhYmxlQ29udGFpbmVyKGhpdEVsZW1lbnQsIGZhbHNlKSA/IGhpdEVsZW1lbnQgOiBudWxsO1xufTtcblxuY29uc3QgVkFMSURfQ09OVEFJTkVSX1RZUEVTID0gbmV3IFNldChbXG4gIFwicmVjdGFuZ2xlXCIsXG4gIFwiZWxsaXBzZVwiLFxuICBcImRpYW1vbmRcIixcbiAgXCJpbWFnZVwiLFxuICBcImFycm93XCIsXG5dKTtcblxuZXhwb3J0IGNvbnN0IGlzVmFsaWRUZXh0Q29udGFpbmVyID0gKGVsZW1lbnQ6IHtcbiAgdHlwZTogRXhjYWxpZHJhd0VsZW1lbnRbXCJ0eXBlXCJdO1xufSkgPT4gVkFMSURfQ09OVEFJTkVSX1RZUEVTLmhhcyhlbGVtZW50LnR5cGUpO1xuXG5leHBvcnQgY29uc3QgY29tcHV0ZUNvbnRhaW5lckRpbWVuc2lvbkZvckJvdW5kVGV4dCA9IChcbiAgZGltZW5zaW9uOiBudW1iZXIsXG4gIGNvbnRhaW5lclR5cGU6IEV4dHJhY3RTZXRUeXBlPHR5cGVvZiBWQUxJRF9DT05UQUlORVJfVFlQRVM+LFxuKSA9PiB7XG4gIGRpbWVuc2lvbiA9IE1hdGguY2VpbChkaW1lbnNpb24pO1xuICBjb25zdCBwYWRkaW5nID0gQk9VTkRfVEVYVF9QQURESU5HICogMjtcblxuICBpZiAoY29udGFpbmVyVHlwZSA9PT0gXCJlbGxpcHNlXCIpIHtcbiAgICByZXR1cm4gTWF0aC5yb3VuZCgoKGRpbWVuc2lvbiArIHBhZGRpbmcpIC8gTWF0aC5zcXJ0KDIpKSAqIDIpO1xuICB9XG4gIGlmIChjb250YWluZXJUeXBlID09PSBcImFycm93XCIpIHtcbiAgICByZXR1cm4gZGltZW5zaW9uICsgcGFkZGluZyAqIDg7XG4gIH1cbiAgaWYgKGNvbnRhaW5lclR5cGUgPT09IFwiZGlhbW9uZFwiKSB7XG4gICAgcmV0dXJuIDIgKiAoZGltZW5zaW9uICsgcGFkZGluZyk7XG4gIH1cbiAgcmV0dXJuIGRpbWVuc2lvbiArIHBhZGRpbmc7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0Qm91bmRUZXh0TWF4V2lkdGggPSAoY29udGFpbmVyOiBFeGNhbGlkcmF3RWxlbWVudCkgPT4ge1xuICBjb25zdCB3aWR0aCA9IGdldENvbnRhaW5lckRpbXMoY29udGFpbmVyKS53aWR0aDtcbiAgaWYgKGlzQXJyb3dFbGVtZW50KGNvbnRhaW5lcikpIHtcbiAgICByZXR1cm4gd2lkdGggLSBCT1VORF9URVhUX1BBRERJTkcgKiA4ICogMjtcbiAgfVxuXG4gIGlmIChjb250YWluZXIudHlwZSA9PT0gXCJlbGxpcHNlXCIpIHtcbiAgICAvLyBUaGUgd2lkdGggb2YgdGhlIGxhcmdlc3QgcmVjdGFuZ2xlIGluc2NyaWJlZCBpbnNpZGUgYW4gZWxsaXBzZSBpc1xuICAgIC8vIE1hdGgucm91bmQoKGVsbGlwc2Uud2lkdGggLyAyKSAqIE1hdGguc3FydCgyKSkgd2hpY2ggaXMgZGVyaXZlZCBmcm9tXG4gICAgLy8gZXF1YXRpb24gb2YgYW4gZWxsaXBzZSAtaHR0cHM6Ly9naXRodWIuY29tL2V4Y2FsaWRyYXcvZXhjYWxpZHJhdy9wdWxsLzYxNzJcbiAgICByZXR1cm4gTWF0aC5yb3VuZCgod2lkdGggLyAyKSAqIE1hdGguc3FydCgyKSkgLSBCT1VORF9URVhUX1BBRERJTkcgKiAyO1xuICB9XG4gIGlmIChjb250YWluZXIudHlwZSA9PT0gXCJkaWFtb25kXCIpIHtcbiAgICAvLyBUaGUgd2lkdGggb2YgdGhlIGxhcmdlc3QgcmVjdGFuZ2xlIGluc2NyaWJlZCBpbnNpZGUgYSByaG9tYnVzIGlzXG4gICAgLy8gTWF0aC5yb3VuZCh3aWR0aCAvIDIpIC0gaHR0cHM6Ly9naXRodWIuY29tL2V4Y2FsaWRyYXcvZXhjYWxpZHJhdy9wdWxsLzYyNjVcbiAgICByZXR1cm4gTWF0aC5yb3VuZCh3aWR0aCAvIDIpIC0gQk9VTkRfVEVYVF9QQURESU5HICogMjtcbiAgfVxuICByZXR1cm4gd2lkdGggLSBCT1VORF9URVhUX1BBRERJTkcgKiAyO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldEJvdW5kVGV4dE1heEhlaWdodCA9IChcbiAgY29udGFpbmVyOiBFeGNhbGlkcmF3RWxlbWVudCxcbiAgYm91bmRUZXh0RWxlbWVudDogRXhjYWxpZHJhd1RleHRFbGVtZW50V2l0aENvbnRhaW5lcixcbikgPT4ge1xuICBjb25zdCBoZWlnaHQgPSBnZXRDb250YWluZXJEaW1zKGNvbnRhaW5lcikuaGVpZ2h0O1xuICBpZiAoaXNBcnJvd0VsZW1lbnQoY29udGFpbmVyKSkge1xuICAgIGNvbnN0IGNvbnRhaW5lckhlaWdodCA9IGhlaWdodCAtIEJPVU5EX1RFWFRfUEFERElORyAqIDggKiAyO1xuICAgIGlmIChjb250YWluZXJIZWlnaHQgPD0gMCkge1xuICAgICAgcmV0dXJuIGJvdW5kVGV4dEVsZW1lbnQuaGVpZ2h0O1xuICAgIH1cbiAgICByZXR1cm4gaGVpZ2h0O1xuICB9XG4gIGlmIChjb250YWluZXIudHlwZSA9PT0gXCJlbGxpcHNlXCIpIHtcbiAgICAvLyBUaGUgaGVpZ2h0IG9mIHRoZSBsYXJnZXN0IHJlY3RhbmdsZSBpbnNjcmliZWQgaW5zaWRlIGFuIGVsbGlwc2UgaXNcbiAgICAvLyBNYXRoLnJvdW5kKChlbGxpcHNlLmhlaWdodCAvIDIpICogTWF0aC5zcXJ0KDIpKSB3aGljaCBpcyBkZXJpdmVkIGZyb21cbiAgICAvLyBlcXVhdGlvbiBvZiBhbiBlbGxpcHNlIC0gaHR0cHM6Ly9naXRodWIuY29tL2V4Y2FsaWRyYXcvZXhjYWxpZHJhdy9wdWxsLzYxNzJcbiAgICByZXR1cm4gTWF0aC5yb3VuZCgoaGVpZ2h0IC8gMikgKiBNYXRoLnNxcnQoMikpIC0gQk9VTkRfVEVYVF9QQURESU5HICogMjtcbiAgfVxuICBpZiAoY29udGFpbmVyLnR5cGUgPT09IFwiZGlhbW9uZFwiKSB7XG4gICAgLy8gVGhlIGhlaWdodCBvZiB0aGUgbGFyZ2VzdCByZWN0YW5nbGUgaW5zY3JpYmVkIGluc2lkZSBhIHJob21idXMgaXNcbiAgICAvLyBNYXRoLnJvdW5kKGhlaWdodCAvIDIpIC0gaHR0cHM6Ly9naXRodWIuY29tL2V4Y2FsaWRyYXcvZXhjYWxpZHJhdy9wdWxsLzYyNjVcbiAgICByZXR1cm4gTWF0aC5yb3VuZChoZWlnaHQgLyAyKSAtIEJPVU5EX1RFWFRfUEFERElORyAqIDI7XG4gIH1cbiAgcmV0dXJuIGhlaWdodCAtIEJPVU5EX1RFWFRfUEFERElORyAqIDI7XG59O1xuXG5leHBvcnQgY29uc3QgaXNNZWFzdXJlVGV4dFN1cHBvcnRlZCA9ICgpID0+IHtcbiAgY29uc3Qgd2lkdGggPSBnZXRUZXh0V2lkdGgoXG4gICAgRFVNTVlfVEVYVCxcbiAgICBnZXRGb250U3RyaW5nKHtcbiAgICAgIGZvbnRTaXplOiBERUZBVUxUX0ZPTlRfU0laRSxcbiAgICAgIGZvbnRGYW1pbHk6IERFRkFVTFRfRk9OVF9GQU1JTFksXG4gICAgfSksXG4gICk7XG4gIHJldHVybiB3aWR0aCA+IDA7XG59O1xuXG4vKipcbiAqIFVuaXRsZXNzIGxpbmUgaGVpZ2h0XG4gKlxuICogSW4gcHJldmlvdXMgdmVyc2lvbnMgd2UgdXNlZCBgbm9ybWFsYCBsaW5lIGhlaWdodCwgd2hpY2ggYnJvd3NlcnMgaW50ZXJwcmV0XG4gKiBkaWZmZXJlbnRseSwgYW5kIGJhc2VkIG9uIGZvbnQtZmFtaWx5IGFuZCBmb250LXNpemUuXG4gKlxuICogVG8gbWFrZSBsaW5lIGhlaWdodHMgY29uc2lzdGVudCBhY3Jvc3MgYnJvd3NlcnMgd2UgaGFyZGNvZGUgdGhlIHZhbHVlcyBmb3JcbiAqIGVhY2ggb2Ygb3VyIGZvbnRzIGJhc2VkIG9uIG1vc3QgY29tbW9uIGF2ZXJhZ2UgbGluZS1oZWlnaHRzLlxuICogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9leGNhbGlkcmF3L2V4Y2FsaWRyYXcvcHVsbC82MzYwI2lzc3VlY29tbWVudC0xNDc3NjM1OTcxXG4gKiB3aGVyZSB0aGUgdmFsdWVzIGNvbWUgZnJvbS5cbiAqL1xuY29uc3QgREVGQVVMVF9MSU5FX0hFSUdIVCA9IHtcbiAgLy8gfjEuMjUgaXMgdGhlIGF2ZXJhZ2UgZm9yIFZpcmdpbCBpbiBXZWJLaXQgYW5kIEJsaW5rLlxuICAvLyBHZWNrbyAoRkYpIHVzZXMgfjEuMjguXG4gIFtGT05UX0ZBTUlMWS5WaXJnaWxdOiAxLjI1IGFzIEV4Y2FsaWRyYXdUZXh0RWxlbWVudFtcImxpbmVIZWlnaHRcIl0sXG4gIC8vIH4xLjE1IGlzIHRoZSBhdmVyYWdlIGZvciBWaXJnaWwgaW4gV2ViS2l0IGFuZCBCbGluay5cbiAgLy8gR2Vja28gaWYgYWxsIG92ZXIgdGhlIHBsYWNlLlxuICBbRk9OVF9GQU1JTFkuSGVsdmV0aWNhXTogMS4xNSBhcyBFeGNhbGlkcmF3VGV4dEVsZW1lbnRbXCJsaW5lSGVpZ2h0XCJdLFxuICAvLyB+MS4yIGlzIHRoZSBhdmVyYWdlIGZvciBWaXJnaWwgaW4gV2ViS2l0IGFuZCBCbGluaywgYW5kIGtpbmRhIEdlY2tvIHRvb1xuICBbRk9OVF9GQU1JTFkuQ2FzY2FkaWFdOiAxLjIgYXMgRXhjYWxpZHJhd1RleHRFbGVtZW50W1wibGluZUhlaWdodFwiXSxcbn07XG5cbmV4cG9ydCBjb25zdCBnZXREZWZhdWx0TGluZUhlaWdodCA9IChmb250RmFtaWx5OiBGb250RmFtaWx5VmFsdWVzKSA9PiB7XG4gIGlmIChmb250RmFtaWx5IGluIERFRkFVTFRfTElORV9IRUlHSFQpIHtcbiAgICByZXR1cm4gREVGQVVMVF9MSU5FX0hFSUdIVFtmb250RmFtaWx5XTtcbiAgfVxuICByZXR1cm4gREVGQVVMVF9MSU5FX0hFSUdIVFtERUZBVUxUX0ZPTlRfRkFNSUxZXTtcbn07XG5cbmV4cG9ydCBjb25zdCBiaW5kVGV4dFRvQ29udGFpbmVyID0gKFxuICBjb250YWluZXJQcm9wczpcbiAgICB8IHtcbiAgICAgICAgdHlwZTpcbiAgICAgICAgICB8IEV4Y2x1ZGU8RXhjYWxpZHJhd0dlbmVyaWNFbGVtZW50W1widHlwZVwiXSwgXCJzZWxlY3Rpb25cIj5cbiAgICAgICAgICB8IEV4Y2FsaWRyYXdMaW5lYXJFbGVtZW50W1widHlwZVwiXTtcbiAgICAgIH0gJiBNYXJrT3B0aW9uYWw8RWxlbWVudENvbnN0cnVjdG9yT3B0cywgXCJ4XCIgfCBcInlcIj4sXG4gIHRleHRQcm9wczogeyB0ZXh0OiBzdHJpbmcgfSAmIE1hcmtPcHRpb25hbDxFbGVtZW50Q29uc3RydWN0b3JPcHRzLCBcInhcIiB8IFwieVwiPixcbikgPT4ge1xuICBsZXQgY29udGFpbmVyO1xuICBpZiAoY29udGFpbmVyUHJvcHMudHlwZSA9PT0gXCJhcnJvd1wiKSB7XG4gICAgY29udGFpbmVyID0gbmV3TGluZWFyRWxlbWVudCh7XG4gICAgICAvL0B0cy1pZ25vcmVcbiAgICAgIHg6IDAsXG4gICAgICAvL0B0cy1pZ25vcmVcbiAgICAgIHk6IDAsXG4gICAgICAvL0B0cy1pZ25vcmVcbiAgICAgIHR5cGU6IGNvbnRhaW5lclByb3BzLnR5cGUsXG4gICAgICAvL0B0cy1pZ25vcmUsXG4gICAgICBlbmRBcnJvd2hlYWQ6IGNvbnRhaW5lclByb3BzLnR5cGUgPT09IFwiYXJyb3dcIiA/IFwiYXJyb3dcIiA6IG51bGwsXG4gICAgICAvL0B0cy1pZ25vcmVcbiAgICAgIHBvaW50czogW1xuICAgICAgICBbMCwgMF0sXG4gICAgICAgIFszMDAsIDBdLFxuICAgICAgXSxcbiAgICAgIC4uLmNvbnRhaW5lclByb3BzLFxuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIC8vQHRzLWlnbm9yZVxuICAgIGNvbnRhaW5lciA9IG5ld0VsZW1lbnQoe1xuICAgICAgeDogMCxcbiAgICAgIHk6IDAsXG4gICAgICAuLi5jb250YWluZXJQcm9wcyxcbiAgICB9KTtcbiAgfVxuICBjb25zdCB0ZXh0RWxlbWVudDogRXhjYWxpZHJhd1RleHRFbGVtZW50ID0gbmV3VGV4dEVsZW1lbnQoe1xuICAgIHg6IDAsXG4gICAgeTogMCxcbiAgICAuLi50ZXh0UHJvcHMsXG4gICAgY29udGFpbmVySWQ6IGNvbnRhaW5lci5pZCxcbiAgICB0ZXh0QWxpZ246IFRFWFRfQUxJR04uQ0VOVEVSLFxuICAgIHZlcnRpY2FsQWxpZ246IFZFUlRJQ0FMX0FMSUdOLk1JRERMRSxcbiAgfSk7XG5cbiAgbXV0YXRlRWxlbWVudChjb250YWluZXIsIHtcbiAgICBib3VuZEVsZW1lbnRzOiAoY29udGFpbmVyLmJvdW5kRWxlbWVudHMgfHwgW10pLmNvbmNhdCh7XG4gICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgIGlkOiB0ZXh0RWxlbWVudC5pZCxcbiAgICB9KSxcbiAgfSk7XG5cbiAgcmVkcmF3VGV4dEJvdW5kaW5nQm94KHRleHRFbGVtZW50LCBjb250YWluZXIpO1xuXG4gIHJldHVybiBbY29udGFpbmVyLCB0ZXh0RWxlbWVudF07XG59O1xuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///../../element/textElement.ts\n");
|
|
3762
3762
|
|
|
3763
3763
|
/***/ }),
|
|
3764
3764
|
|
|
@@ -3989,7 +3989,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
|
|
|
3989
3989
|
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|
3990
3990
|
|
|
3991
3991
|
"use strict";
|
|
3992
|
-
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.15.2-6546-
|
|
3992
|
+
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.15.2-6546-9e30320\"}/dist/`;\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9wdWJsaWNQYXRoLmpzLmpzIiwibWFwcGluZ3MiOiI7O0FBQXNDO0FBQ3RDLElBQUksYUFBb0IsS0FBSyxnREFBUSxFQUFFO0lBQ3JDLG9CQUFvQjtJQUNwQiw2Q0FBNkM7SUFDN0MscUJBQXVCO1FBQ3JCLE1BQU0sQ0FBQyxxQkFBcUI7WUFDNUIscUJBQXFCLHdCQUFvQixJQUFJLHFCQUF1QixRQUFRLENBQUM7Q0FDaEYiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9wdWJsaWNQYXRoLmpzP2E4N2QiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRU5WIH0gZnJvbSBcIi4uLy4uL2NvbnN0YW50c1wiO1xuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBFTlYuVEVTVCkge1xuICAvKiBlc2xpbnQtZGlzYWJsZSAqL1xuICAvKiBnbG9iYWwgX193ZWJwYWNrX3B1YmxpY19wYXRoX186d3JpdGFibGUgKi9cbiAgX193ZWJwYWNrX3B1YmxpY19wYXRoX18gPVxuICAgIHdpbmRvdy5FWENBTElEUkFXX0FTU0VUX1BBVEggfHxcbiAgICBgaHR0cHM6Ly91bnBrZy5jb20vJHtwcm9jZXNzLmVudi5QS0dfTkFNRX1AJHtwcm9jZXNzLmVudi5QS0dfVkVSU0lPTn0vZGlzdC9gO1xufVxuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./publicPath.js\n");
|
|
3993
3993
|
|
|
3994
3994
|
/***/ }),
|
|
3995
3995
|
|
|
@@ -4110,7 +4110,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
|
|
|
4110
4110
|
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|
4111
4111
|
|
|
4112
4112
|
"use strict";
|
|
4113
|
-
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)({\n elements,\n appState,\n scale,\n rc: roughjs_bin_rough__WEBPACK_IMPORTED_MODULE_0__[\"default\"].canvas(canvas),\n canvas,\n renderConfig: {\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 });\n return canvas;\n});\nconst exportToSvg = (elements, appState, files, opts) => __awaiter(void 0, void 0, void 0, function* () {\n var _a;\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: (opts === null || opts === void 0 ? void 0 : opts.serializeAsJSON)\n ? (_a = opts === null || opts === void 0 ? void 0 : opts.serializeAsJSON) === null || _a === void 0 ? void 0 : _a.call(opts)\n : (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.15.2-6546-d83860c\"}`;\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 class=\"style-fonts\">\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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QUFTLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQyxDQUM3QyxDQUFDO0lBRUYsT0FBTyxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQztBQUN6QixDQUFDLENBQUMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi4vLi4vc2NlbmUvZXhwb3J0LnRzPzliZjciXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHJvdWdoIGZyb20gXCJyb3VnaGpzL2Jpbi9yb3VnaFwiO1xuaW1wb3J0IHsgTm9uRGVsZXRlZEV4Y2FsaWRyYXdFbGVtZW50IH0gZnJvbSBcIi4uL2VsZW1lbnQvdHlwZXNcIjtcbmltcG9ydCB7IGdldENvbW1vbkJvdW5kcyB9IGZyb20gXCIuLi9lbGVtZW50L2JvdW5kc1wiO1xuaW1wb3J0IHsgcmVuZGVyU2NlbmUsIHJlbmRlclNjZW5lVG9TdmcgfSBmcm9tIFwiLi4vcmVuZGVyZXIvcmVuZGVyU2NlbmVcIjtcbmltcG9ydCB7IGRpc3RhbmNlIH0gZnJvbSBcIi4uL3V0aWxzXCI7XG5pbXBvcnQgeyBBcHBTdGF0ZSwgQmluYXJ5RmlsZXMgfSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7IERFRkFVTFRfRVhQT1JUX1BBRERJTkcsIFNWR19OUywgVEhFTUVfRklMVEVSIH0gZnJvbSBcIi4uL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgZ2V0RGVmYXVsdEFwcFN0YXRlIH0gZnJvbSBcIi4uL2FwcFN0YXRlXCI7XG5pbXBvcnQgeyBzZXJpYWxpemVBc0pTT04gfSBmcm9tIFwiLi4vZGF0YS9qc29uXCI7XG5pbXBvcnQge1xuICBnZXRJbml0aWFsaXplZEltYWdlRWxlbWVudHMsXG4gIHVwZGF0ZUltYWdlQ2FjaGUsXG59IGZyb20gXCIuLi9lbGVtZW50L2ltYWdlXCI7XG5cbmV4cG9ydCBjb25zdCBTVkdfRVhQT1JUX1RBRyA9IGA8IS0tIHN2Zy1zb3VyY2U6ZXhjYWxpZHJhdyAtLT5gO1xuXG5leHBvcnQgY29uc3QgZXhwb3J0VG9DYW52YXMgPSBhc3luYyAoXG4gIGVsZW1lbnRzOiByZWFkb25seSBOb25EZWxldGVkRXhjYWxpZHJhd0VsZW1lbnRbXSxcbiAgYXBwU3RhdGU6IEFwcFN0YXRlLFxuICBmaWxlczogQmluYXJ5RmlsZXMsXG4gIHtcbiAgICBleHBvcnRCYWNrZ3JvdW5kLFxuICAgIGV4cG9ydFBhZGRpbmcgPSBERUZBVUxUX0VYUE9SVF9QQURESU5HLFxuICAgIHZpZXdCYWNrZ3JvdW5kQ29sb3IsXG4gIH06IHtcbiAgICBleHBvcnRCYWNrZ3JvdW5kOiBib29sZWFuO1xuICAgIGV4cG9ydFBhZGRpbmc/OiBudW1iZXI7XG4gICAgdmlld0JhY2tncm91bmRDb2xvcjogc3RyaW5nO1xuICB9LFxuICBjcmVhdGVDYW52YXM6IChcbiAgICB3aWR0aDogbnVtYmVyLFxuICAgIGhlaWdodDogbnVtYmVyLFxuICApID0+IHsgY2FudmFzOiBIVE1MQ2FudmFzRWxlbWVudDsgc2NhbGU6IG51bWJlciB9ID0gKHdpZHRoLCBoZWlnaHQpID0+IHtcbiAgICBjb25zdCBjYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiY2FudmFzXCIpO1xuICAgIGNhbnZhcy53aWR0aCA9IHdpZHRoICogYXBwU3RhdGUuZXhwb3J0U2NhbGU7XG4gICAgY2FudmFzLmhlaWdodCA9IGhlaWdodCAqIGFwcFN0YXRlLmV4cG9ydFNjYWxlO1xuICAgIHJldHVybiB7IGNhbnZhcywgc2NhbGU6IGFwcFN0YXRlLmV4cG9ydFNjYWxlIH07XG4gIH0sXG4pID0+IHtcbiAgY29uc3QgW21pblgsIG1pblksIHdpZHRoLCBoZWlnaHRdID0gZ2V0Q2FudmFzU2l6ZShlbGVtZW50cywgZXhwb3J0UGFkZGluZyk7XG5cbiAgY29uc3QgeyBjYW52YXMsIHNjYWxlID0gMSB9ID0gY3JlYXRlQ2FudmFzKHdpZHRoLCBoZWlnaHQpO1xuXG4gIGNvbnN0IGRlZmF1bHRBcHBTdGF0ZSA9IGdldERlZmF1bHRBcHBTdGF0ZSgpO1xuXG4gIGNvbnN0IHsgaW1hZ2VDYWNoZSB9ID0gYXdhaXQgdXBkYXRlSW1hZ2VDYWNoZSh7XG4gICAgaW1hZ2VDYWNoZTogbmV3IE1hcCgpLFxuICAgIGZpbGVJZHM6IGdldEluaXRpYWxpemVkSW1hZ2VFbGVtZW50cyhlbGVtZW50cykubWFwKFxuICAgICAgKGVsZW1lbnQpID0+IGVsZW1lbnQuZmlsZUlkLFxuICAgICksXG4gICAgZmlsZXMsXG4gIH0pO1xuXG4gIHJlbmRlclNjZW5lKHtcbiAgICBlbGVtZW50cyxcbiAgICBhcHBTdGF0ZSxcbiAgICBzY2FsZSxcbiAgICByYzogcm91Z2guY2FudmFzKGNhbnZhcyksXG4gICAgY2FudmFzLFxuICAgIHJlbmRlckNvbmZpZzoge1xuICAgICAgdmlld0JhY2tncm91bmRDb2xvcjogZXhwb3J0QmFja2dyb3VuZCA/IHZpZXdCYWNrZ3JvdW5kQ29sb3IgOiBudWxsLFxuICAgICAgc2Nyb2xsWDogLW1pblggKyBleHBvcnRQYWRkaW5nLFxuICAgICAgc2Nyb2xsWTogLW1pblkgKyBleHBvcnRQYWRkaW5nLFxuICAgICAgem9vbTogZGVmYXVsdEFwcFN0YXRlLnpvb20sXG4gICAgICByZW1vdGVQb2ludGVyVmlld3BvcnRDb29yZHM6IHt9LFxuICAgICAgcmVtb3RlU2VsZWN0ZWRFbGVtZW50SWRzOiB7fSxcbiAgICAgIHNob3VsZENhY2hlSWdub3JlWm9vbTogZmFsc2UsXG4gICAgICByZW1vdGVQb2ludGVyVXNlcm5hbWVzOiB7fSxcbiAgICAgIHJlbW90ZVBvaW50ZXJVc2VyU3RhdGVzOiB7fSxcbiAgICAgIHRoZW1lOiBhcHBTdGF0ZS5leHBvcnRXaXRoRGFya01vZGUgPyBcImRhcmtcIiA6IFwibGlnaHRcIixcbiAgICAgIGltYWdlQ2FjaGUsXG4gICAgICByZW5kZXJTY3JvbGxiYXJzOiBmYWxzZSxcbiAgICAgIHJlbmRlclNlbGVjdGlvbjogZmFsc2UsXG4gICAgICByZW5kZXJHcmlkOiBmYWxzZSxcbiAgICAgIGlzRXhwb3J0aW5nOiB0cnVlLFxuICAgIH0sXG4gIH0pO1xuXG4gIHJldHVybiBjYW52YXM7XG59O1xuXG5leHBvcnQgY29uc3QgZXhwb3J0VG9TdmcgPSBhc3luYyAoXG4gIGVsZW1lbnRzOiByZWFkb25seSBOb25EZWxldGVkRXhjYWxpZHJhd0VsZW1lbnRbXSxcbiAgYXBwU3RhdGU6IHtcbiAgICBleHBvcnRCYWNrZ3JvdW5kOiBib29sZWFuO1xuICAgIGV4cG9ydFBhZGRpbmc/OiBudW1iZXI7XG4gICAgZXhwb3J0U2NhbGU/OiBudW1iZXI7XG4gICAgdmlld0JhY2tncm91bmRDb2xvcjogc3RyaW5nO1xuICAgIGV4cG9ydFdpdGhEYXJrTW9kZT86IGJvb2xlYW47XG4gICAgZXhwb3J0RW1iZWRTY2VuZT86IGJvb2xlYW47XG4gIH0sXG4gIGZpbGVzOiBCaW5hcnlGaWxlcyB8IG51bGwsXG4gIG9wdHM/OiB7XG4gICAgc2VyaWFsaXplQXNKU09OPzogKCkgPT4gc3RyaW5nO1xuICB9LFxuKTogUHJvbWlzZTxTVkdTVkdFbGVtZW50PiA9PiB7XG4gIGNvbnN0IHtcbiAgICBleHBvcnRQYWRkaW5nID0gREVGQVVMVF9FWFBPUlRfUEFERElORyxcbiAgICB2aWV3QmFja2dyb3VuZENvbG9yLFxuICAgIGV4cG9ydFNjYWxlID0gMSxcbiAgICBleHBvcnRFbWJlZFNjZW5lLFxuICB9ID0gYXBwU3RhdGU7XG4gIGxldCBtZXRhZGF0YSA9IFwiXCI7XG4gIGlmIChleHBvcnRFbWJlZFNjZW5lKSB7XG4gICAgdHJ5IHtcbiAgICAgIG1ldGFkYXRhID0gYXdhaXQgKFxuICAgICAgICBhd2FpdCBpbXBvcnQoLyogd2VicGFja0NodW5rTmFtZTogXCJpbWFnZVwiICovIFwiLi4vLi4vc3JjL2RhdGEvaW1hZ2VcIilcbiAgICAgICkuZW5jb2RlU3ZnTWV0YWRhdGEoe1xuICAgICAgICB0ZXh0OiBvcHRzPy5zZXJpYWxpemVBc0pTT05cbiAgICAgICAgICA/IG9wdHM/LnNlcmlhbGl6ZUFzSlNPTj8uKClcbiAgICAgICAgICA6IHNlcmlhbGl6ZUFzSlNPTihlbGVtZW50cywgYXBwU3RhdGUsIGZpbGVzIHx8IHt9LCBcImxvY2FsXCIpLFxuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XG4gICAgfVxuICB9XG4gIGNvbnN0IFttaW5YLCBtaW5ZLCB3aWR0aCwgaGVpZ2h0XSA9IGdldENhbnZhc1NpemUoZWxlbWVudHMsIGV4cG9ydFBhZGRpbmcpO1xuXG4gIC8vIGluaXRpYWxpemUgU1ZHIHJvb3RcbiAgY29uc3Qgc3ZnUm9vdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhTVkdfTlMsIFwic3ZnXCIpO1xuICBzdmdSb290LnNldEF0dHJpYnV0ZShcInZlcnNpb25cIiwgXCIxLjFcIik7XG4gIHN2Z1Jvb3Quc2V0QXR0cmlidXRlKFwieG1sbnNcIiwgU1ZHX05TKTtcbiAgc3ZnUm9vdC5zZXRBdHRyaWJ1dGUoXCJ2aWV3Qm94XCIsIGAwIDAgJHt3aWR0aH0gJHtoZWlnaHR9YCk7XG4gIHN2Z1Jvb3Quc2V0QXR0cmlidXRlKFwid2lkdGhcIiwgYCR7d2lkdGggKiBleHBvcnRTY2FsZX1gKTtcbiAgc3ZnUm9vdC5zZXRBdHRyaWJ1dGUoXCJoZWlnaHRcIiwgYCR7aGVpZ2h0ICogZXhwb3J0U2NhbGV9YCk7XG4gIGlmIChhcHBTdGF0ZS5leHBvcnRXaXRoRGFya01vZGUpIHtcbiAgICBzdmdSb290LnNldEF0dHJpYnV0ZShcImZpbHRlclwiLCBUSEVNRV9GSUxURVIpO1xuICB9XG5cbiAgbGV0IGFzc2V0UGF0aCA9IFwiaHR0cHM6Ly9leGNhbGlkcmF3LmNvbS9cIjtcblxuICAvLyBBc3NldCBwYXRoIG5lZWRzIHRvIGJlIGRldGVybWluZWQgb25seSB3aGVuIHVzaW5nIHBhY2thZ2VcbiAgaWYgKHByb2Nlc3MuZW52LklTX0VYQ0FMSURSQVdfTlBNX1BBQ0tBR0UpIHtcbiAgICBhc3NldFBhdGggPVxuICAgICAgd2luZG93LkVYQ0FMSURSQVdfQVNTRVRfUEFUSCB8fFxuICAgICAgYGh0dHBzOi8vdW5wa2cuY29tLyR7cHJvY2Vzcy5lbnYuUEtHX05BTUV9QCR7cHJvY2Vzcy5lbnYuUEtHX1ZFUlNJT059YDtcblxuICAgIGlmIChhc3NldFBhdGg/LnN0YXJ0c1dpdGgoXCIvXCIpKSB7XG4gICAgICBhc3NldFBhdGggPSBhc3NldFBhdGgucmVwbGFjZShcIi9cIiwgYCR7d2luZG93LmxvY2F0aW9uLm9yaWdpbn0vYCk7XG4gICAgfVxuICAgIGFzc2V0UGF0aCA9IGAke2Fzc2V0UGF0aH0vZGlzdC9leGNhbGlkcmF3LWFzc2V0cy9gO1xuICB9XG4gIHN2Z1Jvb3QuaW5uZXJIVE1MID0gYFxuICAke1NWR19FWFBPUlRfVEFHfVxuICAke21ldGFkYXRhfVxuICA8ZGVmcz5cbiAgICA8c3R5bGUgY2xhc3M9XCJzdHlsZS1mb250c1wiPlxuICAgICAgQGZvbnQtZmFjZSB7XG4gICAgICAgIGZvbnQtZmFtaWx5OiBcIlZpcmdpbFwiO1xuICAgICAgICBzcmM6IHVybChcIiR7YXNzZXRQYXRofVZpcmdpbC53b2ZmMlwiKTtcbiAgICAgIH1cbiAgICAgIEBmb250LWZhY2Uge1xuICAgICAgICBmb250LWZhbWlseTogXCJDYXNjYWRpYVwiO1xuICAgICAgICBzcmM6IHVybChcIiR7YXNzZXRQYXRofUNhc2NhZGlhLndvZmYyXCIpO1xuICAgICAgfVxuICAgIDwvc3R5bGU+XG4gIDwvZGVmcz5cbiAgYDtcbiAgLy8gcmVuZGVyIGJhY2tncm91bmQgcmVjdFxuICBpZiAoYXBwU3RhdGUuZXhwb3J0QmFja2dyb3VuZCAmJiB2aWV3QmFja2dyb3VuZENvbG9yKSB7XG4gICAgY29uc3QgcmVjdCA9IHN2Z1Jvb3Qub3duZXJEb2N1bWVudCEuY3JlYXRlRWxlbWVudE5TKFNWR19OUywgXCJyZWN0XCIpO1xuICAgIHJlY3Quc2V0QXR0cmlidXRlKFwieFwiLCBcIjBcIik7XG4gICAgcmVjdC5zZXRBdHRyaWJ1dGUoXCJ5XCIsIFwiMFwiKTtcbiAgICByZWN0LnNldEF0dHJpYnV0ZShcIndpZHRoXCIsIGAke3dpZHRofWApO1xuICAgIHJlY3Quc2V0QXR0cmlidXRlKFwiaGVpZ2h0XCIsIGAke2hlaWdodH1gKTtcbiAgICByZWN0LnNldEF0dHJpYnV0ZShcImZpbGxcIiwgdmlld0JhY2tncm91bmRDb2xvcik7XG4gICAgc3ZnUm9vdC5hcHBlbmRDaGlsZChyZWN0KTtcbiAgfVxuXG4gIGNvbnN0IHJzdmcgPSByb3VnaC5zdmcoc3ZnUm9vdCk7XG4gIHJlbmRlclNjZW5lVG9TdmcoZWxlbWVudHMsIHJzdmcsIHN2Z1Jvb3QsIGZpbGVzIHx8IHt9LCB7XG4gICAgb2Zmc2V0WDogLW1pblggKyBleHBvcnRQYWRkaW5nLFxuICAgIG9mZnNldFk6IC1taW5ZICsgZXhwb3J0UGFkZGluZyxcbiAgICBleHBvcnRXaXRoRGFya01vZGU6IGFwcFN0YXRlLmV4cG9ydFdpdGhEYXJrTW9kZSxcbiAgfSk7XG5cbiAgcmV0dXJuIHN2Z1Jvb3Q7XG59O1xuXG4vLyBjYWxjdWxhdGUgc21hbGxlc3QgYXJlYSB0byBmaXQgdGhlIGNvbnRlbnRzIGluXG5jb25zdCBnZXRDYW52YXNTaXplID0gKFxuICBlbGVtZW50czogcmVhZG9ubHkgTm9uRGVsZXRlZEV4Y2FsaWRyYXdFbGVtZW50W10sXG4gIGV4cG9ydFBhZGRpbmc6IG51bWJlcixcbik6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdID0+IHtcbiAgY29uc3QgW21pblgsIG1pblksIG1heFgsIG1heFldID0gZ2V0Q29tbW9uQm91bmRzKGVsZW1lbnRzKTtcbiAgY29uc3Qgd2lkdGggPSBkaXN0YW5jZShtaW5YLCBtYXhYKSArIGV4cG9ydFBhZGRpbmcgKiAyO1xuICBjb25zdCBoZWlnaHQgPSBkaXN0YW5jZShtaW5ZLCBtYXhZKSArIGV4cG9ydFBhZGRpbmcgKyBleHBvcnRQYWRkaW5nO1xuXG4gIHJldHVybiBbbWluWCwgbWluWSwgd2lkdGgsIGhlaWdodF07XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0RXhwb3J0U2l6ZSA9IChcbiAgZWxlbWVudHM6IHJlYWRvbmx5IE5vbkRlbGV0ZWRFeGNhbGlkcmF3RWxlbWVudFtdLFxuICBleHBvcnRQYWRkaW5nOiBudW1iZXIsXG4gIHNjYWxlOiBudW1iZXIsXG4pOiBbbnVtYmVyLCBudW1iZXJdID0+IHtcbiAgY29uc3QgWywgLCB3aWR0aCwgaGVpZ2h0XSA9IGdldENhbnZhc1NpemUoZWxlbWVudHMsIGV4cG9ydFBhZGRpbmcpLm1hcChcbiAgICAoZGltZW5zaW9uKSA9PiBNYXRoLnRydW5jKGRpbWVuc2lvbiAqIHNjYWxlKSxcbiAgKTtcblxuICByZXR1cm4gW3dpZHRoLCBoZWlnaHRdO1xufTtcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///../../scene/export.ts\n");
|
|
4113
|
+
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)({\n elements,\n appState,\n scale,\n rc: roughjs_bin_rough__WEBPACK_IMPORTED_MODULE_0__[\"default\"].canvas(canvas),\n canvas,\n renderConfig: {\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 });\n return canvas;\n});\nconst exportToSvg = (elements, appState, files, opts) => __awaiter(void 0, void 0, void 0, function* () {\n var _a;\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: (opts === null || opts === void 0 ? void 0 : opts.serializeAsJSON)\n ? (_a = opts === null || opts === void 0 ? void 0 : opts.serializeAsJSON) === null || _a === void 0 ? void 0 : _a.call(opts)\n : (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.15.2-6546-9e30320\"}`;\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 class=\"style-fonts\">\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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QUFTLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQyxDQUM3QyxDQUFDO0lBRUYsT0FBTyxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQztBQUN6QixDQUFDLENBQUMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi4vLi4vc2NlbmUvZXhwb3J0LnRzPzliZjciXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHJvdWdoIGZyb20gXCJyb3VnaGpzL2Jpbi9yb3VnaFwiO1xuaW1wb3J0IHsgTm9uRGVsZXRlZEV4Y2FsaWRyYXdFbGVtZW50IH0gZnJvbSBcIi4uL2VsZW1lbnQvdHlwZXNcIjtcbmltcG9ydCB7IGdldENvbW1vbkJvdW5kcyB9IGZyb20gXCIuLi9lbGVtZW50L2JvdW5kc1wiO1xuaW1wb3J0IHsgcmVuZGVyU2NlbmUsIHJlbmRlclNjZW5lVG9TdmcgfSBmcm9tIFwiLi4vcmVuZGVyZXIvcmVuZGVyU2NlbmVcIjtcbmltcG9ydCB7IGRpc3RhbmNlIH0gZnJvbSBcIi4uL3V0aWxzXCI7XG5pbXBvcnQgeyBBcHBTdGF0ZSwgQmluYXJ5RmlsZXMgfSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7IERFRkFVTFRfRVhQT1JUX1BBRERJTkcsIFNWR19OUywgVEhFTUVfRklMVEVSIH0gZnJvbSBcIi4uL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgZ2V0RGVmYXVsdEFwcFN0YXRlIH0gZnJvbSBcIi4uL2FwcFN0YXRlXCI7XG5pbXBvcnQgeyBzZXJpYWxpemVBc0pTT04gfSBmcm9tIFwiLi4vZGF0YS9qc29uXCI7XG5pbXBvcnQge1xuICBnZXRJbml0aWFsaXplZEltYWdlRWxlbWVudHMsXG4gIHVwZGF0ZUltYWdlQ2FjaGUsXG59IGZyb20gXCIuLi9lbGVtZW50L2ltYWdlXCI7XG5cbmV4cG9ydCBjb25zdCBTVkdfRVhQT1JUX1RBRyA9IGA8IS0tIHN2Zy1zb3VyY2U6ZXhjYWxpZHJhdyAtLT5gO1xuXG5leHBvcnQgY29uc3QgZXhwb3J0VG9DYW52YXMgPSBhc3luYyAoXG4gIGVsZW1lbnRzOiByZWFkb25seSBOb25EZWxldGVkRXhjYWxpZHJhd0VsZW1lbnRbXSxcbiAgYXBwU3RhdGU6IEFwcFN0YXRlLFxuICBmaWxlczogQmluYXJ5RmlsZXMsXG4gIHtcbiAgICBleHBvcnRCYWNrZ3JvdW5kLFxuICAgIGV4cG9ydFBhZGRpbmcgPSBERUZBVUxUX0VYUE9SVF9QQURESU5HLFxuICAgIHZpZXdCYWNrZ3JvdW5kQ29sb3IsXG4gIH06IHtcbiAgICBleHBvcnRCYWNrZ3JvdW5kOiBib29sZWFuO1xuICAgIGV4cG9ydFBhZGRpbmc/OiBudW1iZXI7XG4gICAgdmlld0JhY2tncm91bmRDb2xvcjogc3RyaW5nO1xuICB9LFxuICBjcmVhdGVDYW52YXM6IChcbiAgICB3aWR0aDogbnVtYmVyLFxuICAgIGhlaWdodDogbnVtYmVyLFxuICApID0+IHsgY2FudmFzOiBIVE1MQ2FudmFzRWxlbWVudDsgc2NhbGU6IG51bWJlciB9ID0gKHdpZHRoLCBoZWlnaHQpID0+IHtcbiAgICBjb25zdCBjYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiY2FudmFzXCIpO1xuICAgIGNhbnZhcy53aWR0aCA9IHdpZHRoICogYXBwU3RhdGUuZXhwb3J0U2NhbGU7XG4gICAgY2FudmFzLmhlaWdodCA9IGhlaWdodCAqIGFwcFN0YXRlLmV4cG9ydFNjYWxlO1xuICAgIHJldHVybiB7IGNhbnZhcywgc2NhbGU6IGFwcFN0YXRlLmV4cG9ydFNjYWxlIH07XG4gIH0sXG4pID0+IHtcbiAgY29uc3QgW21pblgsIG1pblksIHdpZHRoLCBoZWlnaHRdID0gZ2V0Q2FudmFzU2l6ZShlbGVtZW50cywgZXhwb3J0UGFkZGluZyk7XG5cbiAgY29uc3QgeyBjYW52YXMsIHNjYWxlID0gMSB9ID0gY3JlYXRlQ2FudmFzKHdpZHRoLCBoZWlnaHQpO1xuXG4gIGNvbnN0IGRlZmF1bHRBcHBTdGF0ZSA9IGdldERlZmF1bHRBcHBTdGF0ZSgpO1xuXG4gIGNvbnN0IHsgaW1hZ2VDYWNoZSB9ID0gYXdhaXQgdXBkYXRlSW1hZ2VDYWNoZSh7XG4gICAgaW1hZ2VDYWNoZTogbmV3IE1hcCgpLFxuICAgIGZpbGVJZHM6IGdldEluaXRpYWxpemVkSW1hZ2VFbGVtZW50cyhlbGVtZW50cykubWFwKFxuICAgICAgKGVsZW1lbnQpID0+IGVsZW1lbnQuZmlsZUlkLFxuICAgICksXG4gICAgZmlsZXMsXG4gIH0pO1xuXG4gIHJlbmRlclNjZW5lKHtcbiAgICBlbGVtZW50cyxcbiAgICBhcHBTdGF0ZSxcbiAgICBzY2FsZSxcbiAgICByYzogcm91Z2guY2FudmFzKGNhbnZhcyksXG4gICAgY2FudmFzLFxuICAgIHJlbmRlckNvbmZpZzoge1xuICAgICAgdmlld0JhY2tncm91bmRDb2xvcjogZXhwb3J0QmFja2dyb3VuZCA/IHZpZXdCYWNrZ3JvdW5kQ29sb3IgOiBudWxsLFxuICAgICAgc2Nyb2xsWDogLW1pblggKyBleHBvcnRQYWRkaW5nLFxuICAgICAgc2Nyb2xsWTogLW1pblkgKyBleHBvcnRQYWRkaW5nLFxuICAgICAgem9vbTogZGVmYXVsdEFwcFN0YXRlLnpvb20sXG4gICAgICByZW1vdGVQb2ludGVyVmlld3BvcnRDb29yZHM6IHt9LFxuICAgICAgcmVtb3RlU2VsZWN0ZWRFbGVtZW50SWRzOiB7fSxcbiAgICAgIHNob3VsZENhY2hlSWdub3JlWm9vbTogZmFsc2UsXG4gICAgICByZW1vdGVQb2ludGVyVXNlcm5hbWVzOiB7fSxcbiAgICAgIHJlbW90ZVBvaW50ZXJVc2VyU3RhdGVzOiB7fSxcbiAgICAgIHRoZW1lOiBhcHBTdGF0ZS5leHBvcnRXaXRoRGFya01vZGUgPyBcImRhcmtcIiA6IFwibGlnaHRcIixcbiAgICAgIGltYWdlQ2FjaGUsXG4gICAgICByZW5kZXJTY3JvbGxiYXJzOiBmYWxzZSxcbiAgICAgIHJlbmRlclNlbGVjdGlvbjogZmFsc2UsXG4gICAgICByZW5kZXJHcmlkOiBmYWxzZSxcbiAgICAgIGlzRXhwb3J0aW5nOiB0cnVlLFxuICAgIH0sXG4gIH0pO1xuXG4gIHJldHVybiBjYW52YXM7XG59O1xuXG5leHBvcnQgY29uc3QgZXhwb3J0VG9TdmcgPSBhc3luYyAoXG4gIGVsZW1lbnRzOiByZWFkb25seSBOb25EZWxldGVkRXhjYWxpZHJhd0VsZW1lbnRbXSxcbiAgYXBwU3RhdGU6IHtcbiAgICBleHBvcnRCYWNrZ3JvdW5kOiBib29sZWFuO1xuICAgIGV4cG9ydFBhZGRpbmc/OiBudW1iZXI7XG4gICAgZXhwb3J0U2NhbGU/OiBudW1iZXI7XG4gICAgdmlld0JhY2tncm91bmRDb2xvcjogc3RyaW5nO1xuICAgIGV4cG9ydFdpdGhEYXJrTW9kZT86IGJvb2xlYW47XG4gICAgZXhwb3J0RW1iZWRTY2VuZT86IGJvb2xlYW47XG4gIH0sXG4gIGZpbGVzOiBCaW5hcnlGaWxlcyB8IG51bGwsXG4gIG9wdHM/OiB7XG4gICAgc2VyaWFsaXplQXNKU09OPzogKCkgPT4gc3RyaW5nO1xuICB9LFxuKTogUHJvbWlzZTxTVkdTVkdFbGVtZW50PiA9PiB7XG4gIGNvbnN0IHtcbiAgICBleHBvcnRQYWRkaW5nID0gREVGQVVMVF9FWFBPUlRfUEFERElORyxcbiAgICB2aWV3QmFja2dyb3VuZENvbG9yLFxuICAgIGV4cG9ydFNjYWxlID0gMSxcbiAgICBleHBvcnRFbWJlZFNjZW5lLFxuICB9ID0gYXBwU3RhdGU7XG4gIGxldCBtZXRhZGF0YSA9IFwiXCI7XG4gIGlmIChleHBvcnRFbWJlZFNjZW5lKSB7XG4gICAgdHJ5IHtcbiAgICAgIG1ldGFkYXRhID0gYXdhaXQgKFxuICAgICAgICBhd2FpdCBpbXBvcnQoLyogd2VicGFja0NodW5rTmFtZTogXCJpbWFnZVwiICovIFwiLi4vLi4vc3JjL2RhdGEvaW1hZ2VcIilcbiAgICAgICkuZW5jb2RlU3ZnTWV0YWRhdGEoe1xuICAgICAgICB0ZXh0OiBvcHRzPy5zZXJpYWxpemVBc0pTT05cbiAgICAgICAgICA/IG9wdHM/LnNlcmlhbGl6ZUFzSlNPTj8uKClcbiAgICAgICAgICA6IHNlcmlhbGl6ZUFzSlNPTihlbGVtZW50cywgYXBwU3RhdGUsIGZpbGVzIHx8IHt9LCBcImxvY2FsXCIpLFxuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XG4gICAgfVxuICB9XG4gIGNvbnN0IFttaW5YLCBtaW5ZLCB3aWR0aCwgaGVpZ2h0XSA9IGdldENhbnZhc1NpemUoZWxlbWVudHMsIGV4cG9ydFBhZGRpbmcpO1xuXG4gIC8vIGluaXRpYWxpemUgU1ZHIHJvb3RcbiAgY29uc3Qgc3ZnUm9vdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhTVkdfTlMsIFwic3ZnXCIpO1xuICBzdmdSb290LnNldEF0dHJpYnV0ZShcInZlcnNpb25cIiwgXCIxLjFcIik7XG4gIHN2Z1Jvb3Quc2V0QXR0cmlidXRlKFwieG1sbnNcIiwgU1ZHX05TKTtcbiAgc3ZnUm9vdC5zZXRBdHRyaWJ1dGUoXCJ2aWV3Qm94XCIsIGAwIDAgJHt3aWR0aH0gJHtoZWlnaHR9YCk7XG4gIHN2Z1Jvb3Quc2V0QXR0cmlidXRlKFwid2lkdGhcIiwgYCR7d2lkdGggKiBleHBvcnRTY2FsZX1gKTtcbiAgc3ZnUm9vdC5zZXRBdHRyaWJ1dGUoXCJoZWlnaHRcIiwgYCR7aGVpZ2h0ICogZXhwb3J0U2NhbGV9YCk7XG4gIGlmIChhcHBTdGF0ZS5leHBvcnRXaXRoRGFya01vZGUpIHtcbiAgICBzdmdSb290LnNldEF0dHJpYnV0ZShcImZpbHRlclwiLCBUSEVNRV9GSUxURVIpO1xuICB9XG5cbiAgbGV0IGFzc2V0UGF0aCA9IFwiaHR0cHM6Ly9leGNhbGlkcmF3LmNvbS9cIjtcblxuICAvLyBBc3NldCBwYXRoIG5lZWRzIHRvIGJlIGRldGVybWluZWQgb25seSB3aGVuIHVzaW5nIHBhY2thZ2VcbiAgaWYgKHByb2Nlc3MuZW52LklTX0VYQ0FMSURSQVdfTlBNX1BBQ0tBR0UpIHtcbiAgICBhc3NldFBhdGggPVxuICAgICAgd2luZG93LkVYQ0FMSURSQVdfQVNTRVRfUEFUSCB8fFxuICAgICAgYGh0dHBzOi8vdW5wa2cuY29tLyR7cHJvY2Vzcy5lbnYuUEtHX05BTUV9QCR7cHJvY2Vzcy5lbnYuUEtHX1ZFUlNJT059YDtcblxuICAgIGlmIChhc3NldFBhdGg/LnN0YXJ0c1dpdGgoXCIvXCIpKSB7XG4gICAgICBhc3NldFBhdGggPSBhc3NldFBhdGgucmVwbGFjZShcIi9cIiwgYCR7d2luZG93LmxvY2F0aW9uLm9yaWdpbn0vYCk7XG4gICAgfVxuICAgIGFzc2V0UGF0aCA9IGAke2Fzc2V0UGF0aH0vZGlzdC9leGNhbGlkcmF3LWFzc2V0cy9gO1xuICB9XG4gIHN2Z1Jvb3QuaW5uZXJIVE1MID0gYFxuICAke1NWR19FWFBPUlRfVEFHfVxuICAke21ldGFkYXRhfVxuICA8ZGVmcz5cbiAgICA8c3R5bGUgY2xhc3M9XCJzdHlsZS1mb250c1wiPlxuICAgICAgQGZvbnQtZmFjZSB7XG4gICAgICAgIGZvbnQtZmFtaWx5OiBcIlZpcmdpbFwiO1xuICAgICAgICBzcmM6IHVybChcIiR7YXNzZXRQYXRofVZpcmdpbC53b2ZmMlwiKTtcbiAgICAgIH1cbiAgICAgIEBmb250LWZhY2Uge1xuICAgICAgICBmb250LWZhbWlseTogXCJDYXNjYWRpYVwiO1xuICAgICAgICBzcmM6IHVybChcIiR7YXNzZXRQYXRofUNhc2NhZGlhLndvZmYyXCIpO1xuICAgICAgfVxuICAgIDwvc3R5bGU+XG4gIDwvZGVmcz5cbiAgYDtcbiAgLy8gcmVuZGVyIGJhY2tncm91bmQgcmVjdFxuICBpZiAoYXBwU3RhdGUuZXhwb3J0QmFja2dyb3VuZCAmJiB2aWV3QmFja2dyb3VuZENvbG9yKSB7XG4gICAgY29uc3QgcmVjdCA9IHN2Z1Jvb3Qub3duZXJEb2N1bWVudCEuY3JlYXRlRWxlbWVudE5TKFNWR19OUywgXCJyZWN0XCIpO1xuICAgIHJlY3Quc2V0QXR0cmlidXRlKFwieFwiLCBcIjBcIik7XG4gICAgcmVjdC5zZXRBdHRyaWJ1dGUoXCJ5XCIsIFwiMFwiKTtcbiAgICByZWN0LnNldEF0dHJpYnV0ZShcIndpZHRoXCIsIGAke3dpZHRofWApO1xuICAgIHJlY3Quc2V0QXR0cmlidXRlKFwiaGVpZ2h0XCIsIGAke2hlaWdodH1gKTtcbiAgICByZWN0LnNldEF0dHJpYnV0ZShcImZpbGxcIiwgdmlld0JhY2tncm91bmRDb2xvcik7XG4gICAgc3ZnUm9vdC5hcHBlbmRDaGlsZChyZWN0KTtcbiAgfVxuXG4gIGNvbnN0IHJzdmcgPSByb3VnaC5zdmcoc3ZnUm9vdCk7XG4gIHJlbmRlclNjZW5lVG9TdmcoZWxlbWVudHMsIHJzdmcsIHN2Z1Jvb3QsIGZpbGVzIHx8IHt9LCB7XG4gICAgb2Zmc2V0WDogLW1pblggKyBleHBvcnRQYWRkaW5nLFxuICAgIG9mZnNldFk6IC1taW5ZICsgZXhwb3J0UGFkZGluZyxcbiAgICBleHBvcnRXaXRoRGFya01vZGU6IGFwcFN0YXRlLmV4cG9ydFdpdGhEYXJrTW9kZSxcbiAgfSk7XG5cbiAgcmV0dXJuIHN2Z1Jvb3Q7XG59O1xuXG4vLyBjYWxjdWxhdGUgc21hbGxlc3QgYXJlYSB0byBmaXQgdGhlIGNvbnRlbnRzIGluXG5jb25zdCBnZXRDYW52YXNTaXplID0gKFxuICBlbGVtZW50czogcmVhZG9ubHkgTm9uRGVsZXRlZEV4Y2FsaWRyYXdFbGVtZW50W10sXG4gIGV4cG9ydFBhZGRpbmc6IG51bWJlcixcbik6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdID0+IHtcbiAgY29uc3QgW21pblgsIG1pblksIG1heFgsIG1heFldID0gZ2V0Q29tbW9uQm91bmRzKGVsZW1lbnRzKTtcbiAgY29uc3Qgd2lkdGggPSBkaXN0YW5jZShtaW5YLCBtYXhYKSArIGV4cG9ydFBhZGRpbmcgKiAyO1xuICBjb25zdCBoZWlnaHQgPSBkaXN0YW5jZShtaW5ZLCBtYXhZKSArIGV4cG9ydFBhZGRpbmcgKyBleHBvcnRQYWRkaW5nO1xuXG4gIHJldHVybiBbbWluWCwgbWluWSwgd2lkdGgsIGhlaWdodF07XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0RXhwb3J0U2l6ZSA9IChcbiAgZWxlbWVudHM6IHJlYWRvbmx5IE5vbkRlbGV0ZWRFeGNhbGlkcmF3RWxlbWVudFtdLFxuICBleHBvcnRQYWRkaW5nOiBudW1iZXIsXG4gIHNjYWxlOiBudW1iZXIsXG4pOiBbbnVtYmVyLCBudW1iZXJdID0+IHtcbiAgY29uc3QgWywgLCB3aWR0aCwgaGVpZ2h0XSA9IGdldENhbnZhc1NpemUoZWxlbWVudHMsIGV4cG9ydFBhZGRpbmcpLm1hcChcbiAgICAoZGltZW5zaW9uKSA9PiBNYXRoLnRydW5jKGRpbWVuc2lvbiAqIHNjYWxlKSxcbiAgKTtcblxuICByZXR1cm4gW3dpZHRoLCBoZWlnaHRdO1xufTtcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///../../scene/export.ts\n");
|
|
4114
4114
|
|
|
4115
4115
|
/***/ }),
|
|
4116
4116
|
|