@kepler.gl/components 3.3.0-alpha.1 → 3.3.0-alpha.3
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/common/action-panel.js +1 -1
- package/dist/common/color-legend.d.ts +1 -1
- package/dist/common/data-table/canvas.d.ts +1 -1
- package/dist/common/data-table/index.d.ts +1 -1
- package/dist/common/dnd-layer-items.d.ts +4 -0
- package/dist/common/dnd-layer-items.js +6 -2
- package/dist/common/error-boundary.d.ts +1 -1
- package/dist/common/file-uploader/file-upload.d.ts +1 -1
- package/dist/common/flex-container.d.ts +15 -7
- package/dist/common/icon-button.d.ts +53 -6
- package/dist/common/icons/arrow-down-full.d.ts +2 -1
- package/dist/common/icons/arrow-down-full.js +1 -1
- package/dist/common/icons/folder.d.ts +10 -0
- package/dist/common/icons/folder.js +51 -0
- package/dist/common/icons/index.d.ts +1 -0
- package/dist/common/icons/index.js +8 -1
- package/dist/common/icons/timeline-marker.d.ts +2 -1
- package/dist/common/icons/timeline-marker.js +1 -1
- package/dist/common/item-selector/dropdown-list.d.ts +1 -1
- package/dist/common/item-selector/dropdown-list.js +1 -1
- package/dist/common/item-selector/dropdown-select.d.ts +13 -7
- package/dist/common/item-selector/item-selector.d.ts +1 -1
- package/dist/common/item-selector/item-selector.js +1 -1
- package/dist/common/item-selector/typeahead.d.ts +4 -4
- package/dist/common/item-selector/typeahead.js +1 -3
- package/dist/common/layout-splitter.d.ts +45 -0
- package/dist/common/layout-splitter.js +231 -0
- package/dist/common/line-chart.d.ts +7 -3
- package/dist/common/line-chart.js +179 -59
- package/dist/common/modal.d.ts +11 -5
- package/dist/common/modal.js +1 -1
- package/dist/common/portaled.d.ts +17 -17
- package/dist/common/range-slider.js +1 -3
- package/dist/common/slider/mouse-event.d.ts +1 -1
- package/dist/common/slider/mouse-event.js +1 -2
- package/dist/common/slider/slider-bar-handle.d.ts +1 -1
- package/dist/common/slider/slider-bar-handle.js +1 -1
- package/dist/common/slider/slider-handle.d.ts +3 -3
- package/dist/common/slider/slider-handle.js +1 -1
- package/dist/common/slider/slider.d.ts +4 -4
- package/dist/common/slider/slider.js +1 -1
- package/dist/common/styled-components.d.ts +627 -177
- package/dist/common/vertical-toolbar.d.ts +12 -2
- package/dist/container.d.ts +3 -2
- package/dist/container.js +2 -2
- package/dist/context.d.ts +1 -1
- package/dist/context.js +1 -1
- package/dist/dnd-context.d.ts +4 -3
- package/dist/dnd-context.js +64 -9
- package/dist/effects/compact-color-picker.d.ts +1 -1
- package/dist/effects/effect-configurator.d.ts +2 -4
- package/dist/effects/effect-time-configurator.js +1 -1
- package/dist/effects/effect-type-list-item.d.ts +1 -1
- package/dist/filters/components.d.ts +7 -5
- package/dist/filters/filter-panels/filter-synced-dataset-panel.d.ts +6 -2
- package/dist/geocoder-panel.d.ts +2 -2
- package/dist/geocoder-panel.js +6 -7
- package/dist/hooks/use-dnd-layers.d.ts +4 -3
- package/dist/hooks/use-dnd-layers.js +103 -42
- package/dist/index.d.ts +3 -2
- package/dist/index.js +38 -9
- package/dist/injector.d.ts +1 -1
- package/dist/kepler-gl.d.ts +167 -27
- package/dist/kepler-gl.js +3 -2
- package/dist/loading-indicator.d.ts +1 -1
- package/dist/map/layer-hover-info.d.ts +7 -3
- package/dist/map/layer-hover-info.js +58 -22
- package/dist/map/map-control-panel.js +3 -2
- package/dist/map/map-control-toolbar.d.ts +29 -4
- package/dist/map/map-control.d.ts +11 -4
- package/dist/map/map-control.js +7 -6
- package/dist/map/map-legend-panel.d.ts +11 -2
- package/dist/map/map-legend-panel.js +19 -2
- package/dist/map/map-legend.d.ts +19 -2
- package/dist/map/map-legend.js +141 -27
- package/dist/map/split-map-button.d.ts +6 -1
- package/dist/map/split-map-button.js +113 -19
- package/dist/map-container.js +20 -3
- package/dist/maps-layout.d.ts +3 -0
- package/dist/maps-layout.js +86 -26
- package/dist/modal-container.d.ts +1 -1
- package/dist/modals/cloud-tile.d.ts +1 -2
- package/dist/modals/export-map-modal/components.d.ts +9 -5
- package/dist/modals/export-video-modal.d.ts +3 -0
- package/dist/modals/export-video-modal.js +79 -46
- package/dist/modals/export-video-modal.spec.js +2 -2
- package/dist/modals/hubble-utils.d.ts +16 -0
- package/dist/modals/hubble-utils.js +98 -1
- package/dist/modals/modal-dialog.d.ts +1 -1
- package/dist/modals/share-map-modal.d.ts +2 -4
- package/dist/modals/swipe-composite-utils.d.ts +10 -0
- package/dist/modals/swipe-composite-utils.js +108 -0
- package/dist/modals/swipe-export-settings.d.ts +24 -0
- package/dist/modals/swipe-export-settings.js +370 -0
- package/dist/modals/swipe-export-video-container.d.ts +122 -0
- package/dist/modals/swipe-export-video-container.js +630 -0
- package/dist/modals/swipe-export-video-preview.d.ts +68 -0
- package/dist/modals/swipe-export-video-preview.js +339 -0
- package/dist/modals/tilesets-modals/tileset-raster-form.js +1 -5
- package/dist/side-panel/filter-panel/filter-panel-header.d.ts +7 -3
- package/dist/side-panel/layer-manager.d.ts +5 -4
- package/dist/side-panel/layer-manager.js +16 -4
- package/dist/side-panel/layer-panel/color-selector.d.ts +6 -4
- package/dist/side-panel/layer-panel/custom-palette.d.ts +3 -5
- package/dist/side-panel/layer-panel/dataset-layer-group.d.ts +2 -1
- package/dist/side-panel/layer-panel/dataset-layer-group.js +1 -1
- package/dist/side-panel/layer-panel/dataset-layer-section.d.ts +2 -1
- package/dist/side-panel/layer-panel/dataset-layer-section.js +1 -1
- package/dist/side-panel/layer-panel/layer-config-group.d.ts +5 -11
- package/dist/side-panel/layer-panel/layer-configurator.js +130 -82
- package/dist/side-panel/layer-panel/layer-group-header.d.ts +15 -0
- package/dist/side-panel/layer-panel/layer-group-header.js +179 -0
- package/dist/side-panel/layer-panel/layer-list.d.ts +9 -4
- package/dist/side-panel/layer-panel/layer-list.js +197 -40
- package/dist/side-panel/layer-panel/vector-tile-layer-configurator.js +2 -10
- package/dist/side-panel/panel-tab.d.ts +1 -3
- package/dist/side-panel/panel-view-list-toggle.d.ts +4 -4
- package/dist/side-panel/side-bar.d.ts +1 -6
- package/dist/side-panel.d.ts +1 -1
- package/dist/types.d.ts +2 -2
- package/dist/types.js +1 -1
- package/package.json +32 -36
- package/dist/map/layer-selector-panel.d.ts +0 -21
- package/dist/map/layer-selector-panel.js +0 -85
- package/dist/side-panel/layer-panel/radius-by-zoom-input.d.ts +0 -11
- package/dist/side-panel/layer-panel/radius-by-zoom-input.js +0 -220
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import React, { Component, RefObject } from 'react';
|
|
2
|
+
import { type MapRef } from 'react-map-gl/maplibre';
|
|
3
|
+
import type { Deck, DeckProps, MapViewState } from '@deck.gl/core';
|
|
4
|
+
import { DeckAdapter } from '@hubble.gl/core';
|
|
5
|
+
import { SwipeEasing } from './swipe-composite-utils';
|
|
6
|
+
export type SwipeExportVideoPreviewProps = {
|
|
7
|
+
mapData: any;
|
|
8
|
+
resolution: [number, number];
|
|
9
|
+
exportVideoWidth: number;
|
|
10
|
+
disableBaseMap: boolean;
|
|
11
|
+
deckProps?: DeckProps;
|
|
12
|
+
viewState: MapViewState;
|
|
13
|
+
adapter: DeckAdapter;
|
|
14
|
+
mapboxLayerBeforeId?: string;
|
|
15
|
+
rendering: boolean;
|
|
16
|
+
saving: boolean;
|
|
17
|
+
setViewState: (viewState: MapViewState) => void;
|
|
18
|
+
durationMs: number;
|
|
19
|
+
mapProps?: Record<string, any>;
|
|
20
|
+
swipeStartPct: number;
|
|
21
|
+
swipeEndPct: number;
|
|
22
|
+
swipeEasing: SwipeEasing;
|
|
23
|
+
currentTimeMs: number;
|
|
24
|
+
};
|
|
25
|
+
type SwipeExportVideoPreviewState = {
|
|
26
|
+
leftReady: boolean;
|
|
27
|
+
rightReady: boolean;
|
|
28
|
+
};
|
|
29
|
+
/**
|
|
30
|
+
* A dual-canvas video export preview that renders left/right split map layers
|
|
31
|
+
* and composites them with an animated swipe divider.
|
|
32
|
+
*/
|
|
33
|
+
export declare class SwipeExportVideoPreview extends Component<SwipeExportVideoPreviewProps, SwipeExportVideoPreviewState> {
|
|
34
|
+
leftMapRef: RefObject<MapRef | null>;
|
|
35
|
+
rightMapRef: RefObject<MapRef | null>;
|
|
36
|
+
leftDeckRef: RefObject<Deck | null>;
|
|
37
|
+
rightDeckRef: RefObject<Deck | null>;
|
|
38
|
+
compositeCanvasRef: RefObject<HTMLCanvasElement | null>;
|
|
39
|
+
constructor(props: SwipeExportVideoPreviewProps);
|
|
40
|
+
componentDidUpdate(prevProps: SwipeExportVideoPreviewProps): void;
|
|
41
|
+
_resizeVideo(): void;
|
|
42
|
+
_setDevicePixelRatio(devicePixelRatio: number): void;
|
|
43
|
+
_getContainer(): {
|
|
44
|
+
height: number;
|
|
45
|
+
width: number;
|
|
46
|
+
};
|
|
47
|
+
_getCurrentSwipePercentage(): number;
|
|
48
|
+
_getLeftCanvas(): HTMLCanvasElement | null;
|
|
49
|
+
_getRightCanvas(): HTMLCanvasElement | null;
|
|
50
|
+
_compositeFrame(): void;
|
|
51
|
+
/**
|
|
52
|
+
* Called by the parent container's adapter after each render.
|
|
53
|
+
* We need both maps to be loaded before compositing and capturing.
|
|
54
|
+
*/
|
|
55
|
+
onAfterRender: (proceedToNextFrame: () => void) => void;
|
|
56
|
+
_areLayersLoaded(side: 'left' | 'right'): boolean;
|
|
57
|
+
/**
|
|
58
|
+
* Get the composited canvas element for video capture.
|
|
59
|
+
*/
|
|
60
|
+
getCompositeCanvas(): HTMLCanvasElement | null;
|
|
61
|
+
_createLayers(mapIndex: number, beforeId?: string): any;
|
|
62
|
+
_onLeftMapLoad: () => void;
|
|
63
|
+
_onRightMapLoad: () => void;
|
|
64
|
+
_tryComposite(): void;
|
|
65
|
+
_renderMapCanvas(side: 'left' | 'right', mapIndex: number): React.JSX.Element;
|
|
66
|
+
render(): React.JSX.Element;
|
|
67
|
+
}
|
|
68
|
+
export {};
|
|
@@ -0,0 +1,339 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
+
var _typeof = require("@babel/runtime/helpers/typeof");
|
|
5
|
+
Object.defineProperty(exports, "__esModule", {
|
|
6
|
+
value: true
|
|
7
|
+
});
|
|
8
|
+
exports.SwipeExportVideoPreview = void 0;
|
|
9
|
+
var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
|
|
10
|
+
var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
|
|
11
|
+
var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
|
|
12
|
+
var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn"));
|
|
13
|
+
var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf"));
|
|
14
|
+
var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits"));
|
|
15
|
+
var _taggedTemplateLiteral2 = _interopRequireDefault(require("@babel/runtime/helpers/taggedTemplateLiteral"));
|
|
16
|
+
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
|
|
17
|
+
var _react = _interopRequireWildcard(require("react"));
|
|
18
|
+
var _react2 = _interopRequireDefault(require("@deck.gl/react"));
|
|
19
|
+
var _maplibre = _interopRequireWildcard(require("react-map-gl/maplibre"));
|
|
20
|
+
var _mapbox = require("@deck.gl/mapbox");
|
|
21
|
+
var _lodash = _interopRequireDefault(require("lodash.isequal"));
|
|
22
|
+
var _styledComponents = _interopRequireDefault(require("styled-components"));
|
|
23
|
+
var _react3 = require("@hubble.gl/react");
|
|
24
|
+
var _swipeCompositeUtils = require("./swipe-composite-utils");
|
|
25
|
+
var _templateObject, _templateObject2, _templateObject3;
|
|
26
|
+
function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(e) { return e ? t : r; })(e); }
|
|
27
|
+
function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != _typeof(e) && "function" != typeof e) return { "default": e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n["default"] = e, t && t.set(e, n), n; }
|
|
28
|
+
function _callSuper(t, o, e) { return o = (0, _getPrototypeOf2["default"])(o), (0, _possibleConstructorReturn2["default"])(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], (0, _getPrototypeOf2["default"])(t).constructor) : o.apply(t, e)); }
|
|
29
|
+
function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); }
|
|
30
|
+
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
|
|
31
|
+
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { (0, _defineProperty2["default"])(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; } // SPDX-License-Identifier: MIT
|
|
32
|
+
// Copyright contributors to the kepler.gl project
|
|
33
|
+
// @ts-ignore module resolution mismatch with moduleResolution:"node"
|
|
34
|
+
function setRef(ref, value) {
|
|
35
|
+
if (typeof ref === 'function') {
|
|
36
|
+
ref(value);
|
|
37
|
+
} else if (ref) {
|
|
38
|
+
ref.current = value;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
var DeckGLOverlay = /*#__PURE__*/(0, _react.forwardRef)(function (props, ref) {
|
|
42
|
+
var overlay = (0, _maplibre.useControl)(function () {
|
|
43
|
+
return new _mapbox.MapboxOverlay(_objectSpread(_objectSpread({}, props), {}, {
|
|
44
|
+
interleaved: true
|
|
45
|
+
}));
|
|
46
|
+
});
|
|
47
|
+
overlay.setProps(props);
|
|
48
|
+
setRef(ref, overlay._deck);
|
|
49
|
+
return null;
|
|
50
|
+
});
|
|
51
|
+
DeckGLOverlay.displayName = 'DeckGLOverlay';
|
|
52
|
+
var PreviewContainer = _styledComponents["default"].div(_templateObject || (_templateObject = (0, _taggedTemplateLiteral2["default"])(["\n width: ", "px;\n height: ", "px;\n position: relative;\n"])), function (props) {
|
|
53
|
+
return props.$width;
|
|
54
|
+
}, function (props) {
|
|
55
|
+
return props.$height;
|
|
56
|
+
});
|
|
57
|
+
var VisibleCanvas = _styledComponents["default"].canvas(_templateObject2 || (_templateObject2 = (0, _taggedTemplateLiteral2["default"])(["\n width: ", "px;\n height: ", "px;\n display: block;\n position: relative;\n z-index: 1;\n"])), function (props) {
|
|
58
|
+
return props.$width;
|
|
59
|
+
}, function (props) {
|
|
60
|
+
return props.$height;
|
|
61
|
+
});
|
|
62
|
+
var MapLayer = _styledComponents["default"].div(_templateObject3 || (_templateObject3 = (0, _taggedTemplateLiteral2["default"])(["\n width: ", "px;\n height: ", "px;\n position: absolute;\n top: 0;\n left: 0;\n opacity: 0;\n pointer-events: none;\n z-index: 0;\n"])), function (props) {
|
|
63
|
+
return props.$width;
|
|
64
|
+
}, function (props) {
|
|
65
|
+
return props.$height;
|
|
66
|
+
});
|
|
67
|
+
/**
|
|
68
|
+
* A dual-canvas video export preview that renders left/right split map layers
|
|
69
|
+
* and composites them with an animated swipe divider.
|
|
70
|
+
*/
|
|
71
|
+
var SwipeExportVideoPreview = exports.SwipeExportVideoPreview = /*#__PURE__*/function (_Component) {
|
|
72
|
+
function SwipeExportVideoPreview(props) {
|
|
73
|
+
var _this;
|
|
74
|
+
(0, _classCallCheck2["default"])(this, SwipeExportVideoPreview);
|
|
75
|
+
_this = _callSuper(this, SwipeExportVideoPreview, [props]);
|
|
76
|
+
(0, _defineProperty2["default"])(_this, "leftMapRef", /*#__PURE__*/_react["default"].createRef());
|
|
77
|
+
(0, _defineProperty2["default"])(_this, "rightMapRef", /*#__PURE__*/_react["default"].createRef());
|
|
78
|
+
(0, _defineProperty2["default"])(_this, "leftDeckRef", /*#__PURE__*/_react["default"].createRef());
|
|
79
|
+
(0, _defineProperty2["default"])(_this, "rightDeckRef", /*#__PURE__*/_react["default"].createRef());
|
|
80
|
+
(0, _defineProperty2["default"])(_this, "compositeCanvasRef", /*#__PURE__*/_react["default"].createRef());
|
|
81
|
+
/**
|
|
82
|
+
* Called by the parent container's adapter after each render.
|
|
83
|
+
* We need both maps to be loaded before compositing and capturing.
|
|
84
|
+
*/
|
|
85
|
+
(0, _defineProperty2["default"])(_this, "onAfterRender", function (proceedToNextFrame) {
|
|
86
|
+
var leftLoaded = _this._areLayersLoaded('left');
|
|
87
|
+
var rightLoaded = _this._areLayersLoaded('right');
|
|
88
|
+
var leftTilesReady = _this.props.disableBaseMap || !_this.leftMapRef.current || _this.leftMapRef.current.getMap().areTilesLoaded();
|
|
89
|
+
var rightTilesReady = _this.props.disableBaseMap || !_this.rightMapRef.current || _this.rightMapRef.current.getMap().areTilesLoaded();
|
|
90
|
+
if (leftLoaded && rightLoaded && leftTilesReady && rightTilesReady) {
|
|
91
|
+
_this._compositeFrame();
|
|
92
|
+
proceedToNextFrame();
|
|
93
|
+
}
|
|
94
|
+
});
|
|
95
|
+
(0, _defineProperty2["default"])(_this, "_onLeftMapLoad", function () {
|
|
96
|
+
var _this$leftMapRef$curr;
|
|
97
|
+
var map = (_this$leftMapRef$curr = _this.leftMapRef.current) === null || _this$leftMapRef$curr === void 0 ? void 0 : _this$leftMapRef$curr.getMap();
|
|
98
|
+
if (map) {
|
|
99
|
+
map.on('render', function () {
|
|
100
|
+
if (!_this.state.leftReady) {
|
|
101
|
+
_this.setState({
|
|
102
|
+
leftReady: true
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
_this._tryComposite();
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
});
|
|
109
|
+
(0, _defineProperty2["default"])(_this, "_onRightMapLoad", function () {
|
|
110
|
+
var _this$rightMapRef$cur;
|
|
111
|
+
var map = (_this$rightMapRef$cur = _this.rightMapRef.current) === null || _this$rightMapRef$cur === void 0 ? void 0 : _this$rightMapRef$cur.getMap();
|
|
112
|
+
if (map) {
|
|
113
|
+
map.on('render', function () {
|
|
114
|
+
if (!_this.state.rightReady) {
|
|
115
|
+
_this.setState({
|
|
116
|
+
rightReady: true
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
_this._tryComposite();
|
|
120
|
+
});
|
|
121
|
+
}
|
|
122
|
+
});
|
|
123
|
+
_this.state = {
|
|
124
|
+
leftReady: false,
|
|
125
|
+
rightReady: false
|
|
126
|
+
};
|
|
127
|
+
_this._resizeVideo();
|
|
128
|
+
return _this;
|
|
129
|
+
}
|
|
130
|
+
(0, _inherits2["default"])(SwipeExportVideoPreview, _Component);
|
|
131
|
+
return (0, _createClass2["default"])(SwipeExportVideoPreview, [{
|
|
132
|
+
key: "componentDidUpdate",
|
|
133
|
+
value: function componentDidUpdate(prevProps) {
|
|
134
|
+
if (!(0, _lodash["default"])(prevProps.resolution, this.props.resolution)) {
|
|
135
|
+
this._resizeVideo();
|
|
136
|
+
}
|
|
137
|
+
if (prevProps.currentTimeMs !== this.props.currentTimeMs || prevProps.swipeStartPct !== this.props.swipeStartPct || prevProps.swipeEndPct !== this.props.swipeEndPct || prevProps.swipeEasing !== this.props.swipeEasing) {
|
|
138
|
+
this._compositeFrame();
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
}, {
|
|
142
|
+
key: "_resizeVideo",
|
|
143
|
+
value: function _resizeVideo() {
|
|
144
|
+
var _this$props = this.props,
|
|
145
|
+
exportVideoWidth = _this$props.exportVideoWidth,
|
|
146
|
+
resolution = _this$props.resolution;
|
|
147
|
+
this._setDevicePixelRatio(resolution[0] / exportVideoWidth);
|
|
148
|
+
}
|
|
149
|
+
}, {
|
|
150
|
+
key: "_setDevicePixelRatio",
|
|
151
|
+
value: function _setDevicePixelRatio(devicePixelRatio) {
|
|
152
|
+
// @ts-ignore
|
|
153
|
+
window.devicePixelRatio = devicePixelRatio;
|
|
154
|
+
}
|
|
155
|
+
}, {
|
|
156
|
+
key: "_getContainer",
|
|
157
|
+
value: function _getContainer() {
|
|
158
|
+
var _this$props2 = this.props,
|
|
159
|
+
exportVideoWidth = _this$props2.exportVideoWidth,
|
|
160
|
+
resolution = _this$props2.resolution;
|
|
161
|
+
var aspectRatio = resolution[0] / resolution[1];
|
|
162
|
+
return {
|
|
163
|
+
height: exportVideoWidth / aspectRatio,
|
|
164
|
+
width: exportVideoWidth
|
|
165
|
+
};
|
|
166
|
+
}
|
|
167
|
+
}, {
|
|
168
|
+
key: "_getCurrentSwipePercentage",
|
|
169
|
+
value: function _getCurrentSwipePercentage() {
|
|
170
|
+
var _this$props3 = this.props,
|
|
171
|
+
currentTimeMs = _this$props3.currentTimeMs,
|
|
172
|
+
durationMs = _this$props3.durationMs,
|
|
173
|
+
swipeStartPct = _this$props3.swipeStartPct,
|
|
174
|
+
swipeEndPct = _this$props3.swipeEndPct,
|
|
175
|
+
swipeEasing = _this$props3.swipeEasing;
|
|
176
|
+
return (0, _swipeCompositeUtils.getSwipePercentageAtTime)(currentTimeMs, durationMs, swipeStartPct, swipeEndPct, swipeEasing);
|
|
177
|
+
}
|
|
178
|
+
}, {
|
|
179
|
+
key: "_getLeftCanvas",
|
|
180
|
+
value: function _getLeftCanvas() {
|
|
181
|
+
if (this.leftMapRef.current) {
|
|
182
|
+
return this.leftMapRef.current.getMap().getCanvas();
|
|
183
|
+
}
|
|
184
|
+
// Fallback: DeckGL canvas (no basemap mode)
|
|
185
|
+
if (this.leftDeckRef.current) {
|
|
186
|
+
var _getCanvas, _ref;
|
|
187
|
+
return ((_getCanvas = (_ref = this.leftDeckRef.current).getCanvas) === null || _getCanvas === void 0 ? void 0 : _getCanvas.call(_ref)) || null;
|
|
188
|
+
}
|
|
189
|
+
return null;
|
|
190
|
+
}
|
|
191
|
+
}, {
|
|
192
|
+
key: "_getRightCanvas",
|
|
193
|
+
value: function _getRightCanvas() {
|
|
194
|
+
if (this.rightMapRef.current) {
|
|
195
|
+
return this.rightMapRef.current.getMap().getCanvas();
|
|
196
|
+
}
|
|
197
|
+
if (this.rightDeckRef.current) {
|
|
198
|
+
var _getCanvas2, _ref2;
|
|
199
|
+
return ((_getCanvas2 = (_ref2 = this.rightDeckRef.current).getCanvas) === null || _getCanvas2 === void 0 ? void 0 : _getCanvas2.call(_ref2)) || null;
|
|
200
|
+
}
|
|
201
|
+
return null;
|
|
202
|
+
}
|
|
203
|
+
}, {
|
|
204
|
+
key: "_compositeFrame",
|
|
205
|
+
value: function _compositeFrame() {
|
|
206
|
+
var leftCanvas = this._getLeftCanvas();
|
|
207
|
+
var rightCanvas = this._getRightCanvas();
|
|
208
|
+
var outputCanvas = this.compositeCanvasRef.current;
|
|
209
|
+
if (!leftCanvas || !rightCanvas || !outputCanvas) return;
|
|
210
|
+
var percentage = this._getCurrentSwipePercentage();
|
|
211
|
+
(0, _swipeCompositeUtils.compositeSwipeFrame)(leftCanvas, rightCanvas, outputCanvas, percentage, true);
|
|
212
|
+
}
|
|
213
|
+
}, {
|
|
214
|
+
key: "_areLayersLoaded",
|
|
215
|
+
value: function _areLayersLoaded(side) {
|
|
216
|
+
var deckRef = side === 'left' ? this.leftDeckRef : this.rightDeckRef;
|
|
217
|
+
if (!deckRef.current) return false;
|
|
218
|
+
var layers = deckRef.current.props.layers || [];
|
|
219
|
+
return layers.every(function (layer) {
|
|
220
|
+
return layer.isLoaded;
|
|
221
|
+
});
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
/**
|
|
225
|
+
* Get the composited canvas element for video capture.
|
|
226
|
+
*/
|
|
227
|
+
}, {
|
|
228
|
+
key: "getCompositeCanvas",
|
|
229
|
+
value: function getCompositeCanvas() {
|
|
230
|
+
return this.compositeCanvasRef.current;
|
|
231
|
+
}
|
|
232
|
+
}, {
|
|
233
|
+
key: "_createLayers",
|
|
234
|
+
value: function _createLayers(mapIndex, beforeId) {
|
|
235
|
+
var _this$props4 = this.props,
|
|
236
|
+
deckProps = _this$props4.deckProps,
|
|
237
|
+
mapData = _this$props4.mapData,
|
|
238
|
+
viewState = _this$props4.viewState;
|
|
239
|
+
if (deckProps && deckProps.layers) {
|
|
240
|
+
return deckProps.layers;
|
|
241
|
+
}
|
|
242
|
+
return (0, _react3.createKeplerLayers)(mapData, viewState, mapIndex, beforeId);
|
|
243
|
+
}
|
|
244
|
+
}, {
|
|
245
|
+
key: "_tryComposite",
|
|
246
|
+
value: function _tryComposite() {
|
|
247
|
+
if (this.state.leftReady && this.state.rightReady) {
|
|
248
|
+
this._compositeFrame();
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
}, {
|
|
252
|
+
key: "_renderMapCanvas",
|
|
253
|
+
value: function _renderMapCanvas(side, mapIndex) {
|
|
254
|
+
var _this$props5 = this.props,
|
|
255
|
+
viewState = _this$props5.viewState,
|
|
256
|
+
adapter = _this$props5.adapter,
|
|
257
|
+
deckProps = _this$props5.deckProps,
|
|
258
|
+
mapProps = _this$props5.mapProps,
|
|
259
|
+
disableBaseMap = _this$props5.disableBaseMap,
|
|
260
|
+
mapboxLayerBeforeId = _this$props5.mapboxLayerBeforeId;
|
|
261
|
+
var _this$_getContainer = this._getContainer(),
|
|
262
|
+
width = _this$_getContainer.width,
|
|
263
|
+
height = _this$_getContainer.height;
|
|
264
|
+
var keplerLayers = this._createLayers(mapIndex, mapboxLayerBeforeId);
|
|
265
|
+
var mapRef = side === 'left' ? this.leftMapRef : this.rightMapRef;
|
|
266
|
+
var deckRef = side === 'left' ? this.leftDeckRef : this.rightDeckRef;
|
|
267
|
+
var onMapLoad = side === 'left' ? this._onLeftMapLoad : this._onRightMapLoad;
|
|
268
|
+
var deck = deckRef.current;
|
|
269
|
+
if (disableBaseMap) {
|
|
270
|
+
return /*#__PURE__*/_react["default"].createElement(MapLayer, {
|
|
271
|
+
$width: width,
|
|
272
|
+
$height: height
|
|
273
|
+
}, /*#__PURE__*/_react["default"].createElement(_react2["default"], (0, _extends2["default"])({
|
|
274
|
+
ref: function ref(_ref3) {
|
|
275
|
+
return setRef(deckRef, _ref3 === null || _ref3 === void 0 ? void 0 : _ref3.deck);
|
|
276
|
+
}
|
|
277
|
+
}, adapter.getProps({
|
|
278
|
+
deck: deck,
|
|
279
|
+
extraProps: _objectSpread(_objectSpread({}, deckProps), {}, {
|
|
280
|
+
layers: keplerLayers
|
|
281
|
+
})
|
|
282
|
+
}), this._getContainer())));
|
|
283
|
+
}
|
|
284
|
+
var _ref4 = mapProps || {},
|
|
285
|
+
mapStyleFromProps = _ref4.mapStyle,
|
|
286
|
+
mapLib = _ref4.mapLib,
|
|
287
|
+
transformRequest = _ref4.transformRequest;
|
|
288
|
+
return /*#__PURE__*/_react["default"].createElement(MapLayer, {
|
|
289
|
+
$width: width,
|
|
290
|
+
$height: height
|
|
291
|
+
}, /*#__PURE__*/_react["default"].createElement(_maplibre["default"], (0, _extends2["default"])({
|
|
292
|
+
ref: mapRef,
|
|
293
|
+
style: {
|
|
294
|
+
width: width,
|
|
295
|
+
height: height
|
|
296
|
+
},
|
|
297
|
+
antialias: true,
|
|
298
|
+
mapLib: mapLib,
|
|
299
|
+
transformRequest: transformRequest,
|
|
300
|
+
preserveDrawingBuffer: true
|
|
301
|
+
}, viewState, {
|
|
302
|
+
mapStyle: mapStyleFromProps,
|
|
303
|
+
onLoad: onMapLoad
|
|
304
|
+
}), /*#__PURE__*/_react["default"].createElement(DeckGLOverlay, (0, _extends2["default"])({
|
|
305
|
+
ref: deckRef,
|
|
306
|
+
deviceProps: {
|
|
307
|
+
type: 'webgl',
|
|
308
|
+
webgl: {
|
|
309
|
+
stencil: true
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
}, adapter.getProps({
|
|
313
|
+
deck: deck,
|
|
314
|
+
extraProps: _objectSpread(_objectSpread({}, deckProps), {}, {
|
|
315
|
+
layers: keplerLayers
|
|
316
|
+
})
|
|
317
|
+
})))));
|
|
318
|
+
}
|
|
319
|
+
}, {
|
|
320
|
+
key: "render",
|
|
321
|
+
value: function render() {
|
|
322
|
+
var resolution = this.props.resolution;
|
|
323
|
+
var _this$_getContainer2 = this._getContainer(),
|
|
324
|
+
width = _this$_getContainer2.width,
|
|
325
|
+
height = _this$_getContainer2.height;
|
|
326
|
+
return /*#__PURE__*/_react["default"].createElement(PreviewContainer, {
|
|
327
|
+
$width: width,
|
|
328
|
+
$height: height
|
|
329
|
+
}, this._renderMapCanvas('left', 0), this._renderMapCanvas('right', 1), /*#__PURE__*/_react["default"].createElement(VisibleCanvas, {
|
|
330
|
+
ref: this.compositeCanvasRef,
|
|
331
|
+
width: resolution[0],
|
|
332
|
+
height: resolution[1],
|
|
333
|
+
$width: width,
|
|
334
|
+
$height: height
|
|
335
|
+
}));
|
|
336
|
+
}
|
|
337
|
+
}]);
|
|
338
|
+
}(_react.Component);
|
|
339
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCIsInJlcXVpcmUiLCJfcmVhY3QyIiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsIl9tYXBsaWJyZSIsIl9tYXBib3giLCJfbG9kYXNoIiwiX3N0eWxlZENvbXBvbmVudHMiLCJfcmVhY3QzIiwiX3N3aXBlQ29tcG9zaXRlVXRpbHMiLCJfdGVtcGxhdGVPYmplY3QiLCJfdGVtcGxhdGVPYmplY3QyIiwiX3RlbXBsYXRlT2JqZWN0MyIsIl9nZXRSZXF1aXJlV2lsZGNhcmRDYWNoZSIsImUiLCJXZWFrTWFwIiwiciIsInQiLCJfX2VzTW9kdWxlIiwiX3R5cGVvZiIsImhhcyIsImdldCIsIm4iLCJfX3Byb3RvX18iLCJhIiwiT2JqZWN0IiwiZGVmaW5lUHJvcGVydHkiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCJ1IiwiaGFzT3duUHJvcGVydHkiLCJjYWxsIiwiaSIsInNldCIsIl9jYWxsU3VwZXIiLCJvIiwiX2dldFByb3RvdHlwZU9mMiIsIl9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuMiIsIl9pc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QiLCJSZWZsZWN0IiwiY29uc3RydWN0IiwiY29uc3RydWN0b3IiLCJhcHBseSIsIkJvb2xlYW4iLCJwcm90b3R5cGUiLCJ2YWx1ZU9mIiwib3duS2V5cyIsImtleXMiLCJnZXRPd25Qcm9wZXJ0eVN5bWJvbHMiLCJmaWx0ZXIiLCJlbnVtZXJhYmxlIiwicHVzaCIsIl9vYmplY3RTcHJlYWQiLCJhcmd1bWVudHMiLCJsZW5ndGgiLCJmb3JFYWNoIiwiX2RlZmluZVByb3BlcnR5MiIsImdldE93blByb3BlcnR5RGVzY3JpcHRvcnMiLCJkZWZpbmVQcm9wZXJ0aWVzIiwic2V0UmVmIiwicmVmIiwidmFsdWUiLCJjdXJyZW50IiwiRGVja0dMT3ZlcmxheSIsImZvcndhcmRSZWYiLCJwcm9wcyIsIm92ZXJsYXkiLCJ1c2VDb250cm9sIiwiTWFwYm94T3ZlcmxheSIsImludGVybGVhdmVkIiwic2V0UHJvcHMiLCJfZGVjayIsImRpc3BsYXlOYW1lIiwiUHJldmlld0NvbnRhaW5lciIsInN0eWxlZCIsImRpdiIsIl90YWdnZWRUZW1wbGF0ZUxpdGVyYWwyIiwiJHdpZHRoIiwiJGhlaWdodCIsIlZpc2libGVDYW52YXMiLCJjYW52YXMiLCJNYXBMYXllciIsIlN3aXBlRXhwb3J0VmlkZW9QcmV2aWV3IiwiZXhwb3J0cyIsIl9Db21wb25lbnQiLCJfdGhpcyIsIl9jbGFzc0NhbGxDaGVjazIiLCJSZWFjdCIsImNyZWF0ZVJlZiIsInByb2NlZWRUb05leHRGcmFtZSIsImxlZnRMb2FkZWQiLCJfYXJlTGF5ZXJzTG9hZGVkIiwicmlnaHRMb2FkZWQiLCJsZWZ0VGlsZXNSZWFkeSIsImRpc2FibGVCYXNlTWFwIiwibGVmdE1hcFJlZiIsImdldE1hcCIsImFyZVRpbGVzTG9hZGVkIiwicmlnaHRUaWxlc1JlYWR5IiwicmlnaHRNYXBSZWYiLCJfY29tcG9zaXRlRnJhbWUiLCJfdGhpcyRsZWZ0TWFwUmVmJGN1cnIiLCJtYXAiLCJvbiIsInN0YXRlIiwibGVmdFJlYWR5Iiwic2V0U3RhdGUiLCJfdHJ5Q29tcG9zaXRlIiwiX3RoaXMkcmlnaHRNYXBSZWYkY3VyIiwicmlnaHRSZWFkeSIsIl9yZXNpemVWaWRlbyIsIl9pbmhlcml0czIiLCJfY3JlYXRlQ2xhc3MyIiwia2V5IiwiY29tcG9uZW50RGlkVXBkYXRlIiwicHJldlByb3BzIiwiaXNFcXVhbCIsInJlc29sdXRpb24iLCJjdXJyZW50VGltZU1zIiwic3dpcGVTdGFydFBjdCIsInN3aXBlRW5kUGN0Iiwic3dpcGVFYXNpbmciLCJfdGhpcyRwcm9wcyIsImV4cG9ydFZpZGVvV2lkdGgiLCJfc2V0RGV2aWNlUGl4ZWxSYXRpbyIsImRldmljZVBpeGVsUmF0aW8iLCJ3aW5kb3ciLCJfZ2V0Q29udGFpbmVyIiwiX3RoaXMkcHJvcHMyIiwiYXNwZWN0UmF0aW8iLCJoZWlnaHQiLCJ3aWR0aCIsIl9nZXRDdXJyZW50U3dpcGVQZXJjZW50YWdlIiwiX3RoaXMkcHJvcHMzIiwiZHVyYXRpb25NcyIsImdldFN3aXBlUGVyY2VudGFnZUF0VGltZSIsIl9nZXRMZWZ0Q2FudmFzIiwiZ2V0Q2FudmFzIiwibGVmdERlY2tSZWYiLCJfZ2V0Q2FudmFzIiwiX3JlZiIsIl9nZXRSaWdodENhbnZhcyIsInJpZ2h0RGVja1JlZiIsIl9nZXRDYW52YXMyIiwiX3JlZjIiLCJsZWZ0Q2FudmFzIiwicmlnaHRDYW52YXMiLCJvdXRwdXRDYW52YXMiLCJjb21wb3NpdGVDYW52YXNSZWYiLCJwZXJjZW50YWdlIiwiY29tcG9zaXRlU3dpcGVGcmFtZSIsInNpZGUiLCJkZWNrUmVmIiwibGF5ZXJzIiwiZXZlcnkiLCJsYXllciIsImlzTG9hZGVkIiwiZ2V0Q29tcG9zaXRlQ2FudmFzIiwiX2NyZWF0ZUxheWVycyIsIm1hcEluZGV4IiwiYmVmb3JlSWQiLCJfdGhpcyRwcm9wczQiLCJkZWNrUHJvcHMiLCJtYXBEYXRhIiwidmlld1N0YXRlIiwiY3JlYXRlS2VwbGVyTGF5ZXJzIiwiX3JlbmRlck1hcENhbnZhcyIsIl90aGlzJHByb3BzNSIsImFkYXB0ZXIiLCJtYXBQcm9wcyIsIm1hcGJveExheWVyQmVmb3JlSWQiLCJfdGhpcyRfZ2V0Q29udGFpbmVyIiwia2VwbGVyTGF5ZXJzIiwibWFwUmVmIiwib25NYXBMb2FkIiwiX29uTGVmdE1hcExvYWQiLCJfb25SaWdodE1hcExvYWQiLCJkZWNrIiwiY3JlYXRlRWxlbWVudCIsIl9leHRlbmRzMiIsImdldFByb3BzIiwiZXh0cmFQcm9wcyIsIl9yZWY0IiwibWFwU3R5bGVGcm9tUHJvcHMiLCJtYXBTdHlsZSIsIm1hcExpYiIsInRyYW5zZm9ybVJlcXVlc3QiLCJzdHlsZSIsImFudGlhbGlhcyIsInByZXNlcnZlRHJhd2luZ0J1ZmZlciIsIm9uTG9hZCIsImRldmljZVByb3BzIiwidHlwZSIsIndlYmdsIiwic3RlbmNpbCIsInJlbmRlciIsIl90aGlzJF9nZXRDb250YWluZXIyIiwiQ29tcG9uZW50Il0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL21vZGFscy9zd2lwZS1leHBvcnQtdmlkZW8tcHJldmlldy50c3giXSwic291cmNlc0NvbnRlbnQiOlsiLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IE1JVFxuLy8gQ29weXJpZ2h0IGNvbnRyaWJ1dG9ycyB0byB0aGUga2VwbGVyLmdsIHByb2plY3RcblxuaW1wb3J0IFJlYWN0LCB7Q29tcG9uZW50LCBSZWZPYmplY3QsIGZvcndhcmRSZWYsIEZvcndhcmRlZFJlZn0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IERlY2tHTCBmcm9tICdAZGVjay5nbC9yZWFjdCc7XG5pbXBvcnQgUmVhY3RNYXBHTCwge3R5cGUgTWFwUmVmLCB1c2VDb250cm9sfSBmcm9tICdyZWFjdC1tYXAtZ2wvbWFwbGlicmUnO1xuLy8gQHRzLWlnbm9yZSBtb2R1bGUgcmVzb2x1dGlvbiBtaXNtYXRjaCB3aXRoIG1vZHVsZVJlc29sdXRpb246XCJub2RlXCJcbmltcG9ydCB7TWFwYm94T3ZlcmxheX0gZnJvbSAnQGRlY2suZ2wvbWFwYm94JztcbmltcG9ydCB0eXBlIHtEZWNrLCBEZWNrUHJvcHMsIE1hcFZpZXdTdGF0ZX0gZnJvbSAnQGRlY2suZ2wvY29yZSc7XG5pbXBvcnQgaXNFcXVhbCBmcm9tICdsb2Rhc2guaXNlcXVhbCc7XG5pbXBvcnQgc3R5bGVkIGZyb20gJ3N0eWxlZC1jb21wb25lbnRzJztcblxuaW1wb3J0IHtEZWNrQWRhcHRlcn0gZnJvbSAnQGh1YmJsZS5nbC9jb3JlJztcbmltcG9ydCB7Y3JlYXRlS2VwbGVyTGF5ZXJzfSBmcm9tICdAaHViYmxlLmdsL3JlYWN0JztcbmltcG9ydCB7Y29tcG9zaXRlU3dpcGVGcmFtZSwgZ2V0U3dpcGVQZXJjZW50YWdlQXRUaW1lLCBTd2lwZUVhc2luZ30gZnJvbSAnLi9zd2lwZS1jb21wb3NpdGUtdXRpbHMnO1xuXG5mdW5jdGlvbiBzZXRSZWY8VD4ocmVmOiBSZWFjdC5SZWY8VD4gfCBSZWFjdC5NdXRhYmxlUmVmT2JqZWN0PFQ+LCB2YWx1ZTogVCkge1xuICBpZiAodHlwZW9mIHJlZiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHJlZih2YWx1ZSk7XG4gIH0gZWxzZSBpZiAocmVmKSB7XG4gICAgKHJlZiBhcyBSZWFjdC5NdXRhYmxlUmVmT2JqZWN0PFQ+KS5jdXJyZW50ID0gdmFsdWU7XG4gIH1cbn1cblxuY29uc3QgRGVja0dMT3ZlcmxheSA9IGZvcndhcmRSZWY8RGVjaywgYW55PihcbiAgKHByb3BzOiBhbnksIHJlZjogRm9yd2FyZGVkUmVmPERlY2s+KSA9PiB7XG4gICAgY29uc3Qgb3ZlcmxheSA9IHVzZUNvbnRyb2w8TWFwYm94T3ZlcmxheT4oKCkgPT4gbmV3IE1hcGJveE92ZXJsYXkoey4uLnByb3BzLCBpbnRlcmxlYXZlZDogdHJ1ZX0pKTtcbiAgICBvdmVybGF5LnNldFByb3BzKHByb3BzKTtcbiAgICBzZXRSZWYocmVmLCAob3ZlcmxheSBhcyBhbnkpLl9kZWNrKTtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuKTtcbkRlY2tHTE92ZXJsYXkuZGlzcGxheU5hbWUgPSAnRGVja0dMT3ZlcmxheSc7XG5cbmNvbnN0IFByZXZpZXdDb250YWluZXIgPSBzdHlsZWQuZGl2PHskd2lkdGg6IG51bWJlcjsgJGhlaWdodDogbnVtYmVyfT5gXG4gIHdpZHRoOiAke3Byb3BzID0+IHByb3BzLiR3aWR0aH1weDtcbiAgaGVpZ2h0OiAke3Byb3BzID0+IHByb3BzLiRoZWlnaHR9cHg7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbmA7XG5cbmNvbnN0IFZpc2libGVDYW52YXMgPSBzdHlsZWQuY2FudmFzPHskd2lkdGg6IG51bWJlcjsgJGhlaWdodDogbnVtYmVyfT5gXG4gIHdpZHRoOiAke3Byb3BzID0+IHByb3BzLiR3aWR0aH1weDtcbiAgaGVpZ2h0OiAke3Byb3BzID0+IHByb3BzLiRoZWlnaHR9cHg7XG4gIGRpc3BsYXk6IGJsb2NrO1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIHotaW5kZXg6IDE7XG5gO1xuXG5jb25zdCBNYXBMYXllciA9IHN0eWxlZC5kaXY8eyR3aWR0aDogbnVtYmVyOyAkaGVpZ2h0OiBudW1iZXJ9PmBcbiAgd2lkdGg6ICR7cHJvcHMgPT4gcHJvcHMuJHdpZHRofXB4O1xuICBoZWlnaHQ6ICR7cHJvcHMgPT4gcHJvcHMuJGhlaWdodH1weDtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICB0b3A6IDA7XG4gIGxlZnQ6IDA7XG4gIG9wYWNpdHk6IDA7XG4gIHBvaW50ZXItZXZlbnRzOiBub25lO1xuICB6LWluZGV4OiAwO1xuYDtcblxuZXhwb3J0IHR5cGUgU3dpcGVFeHBvcnRWaWRlb1ByZXZpZXdQcm9wcyA9IHtcbiAgbWFwRGF0YTogYW55O1xuICByZXNvbHV0aW9uOiBbbnVtYmVyLCBudW1iZXJdO1xuICBleHBvcnRWaWRlb1dpZHRoOiBudW1iZXI7XG4gIGRpc2FibGVCYXNlTWFwOiBib29sZWFuO1xuICBkZWNrUHJvcHM/OiBEZWNrUHJvcHM7XG4gIHZpZXdTdGF0ZTogTWFwVmlld1N0YXRlO1xuICBhZGFwdGVyOiBEZWNrQWRhcHRlcjtcbiAgbWFwYm94TGF5ZXJCZWZvcmVJZD86IHN0cmluZztcbiAgcmVuZGVyaW5nOiBib29sZWFuO1xuICBzYXZpbmc6IGJvb2xlYW47XG4gIHNldFZpZXdTdGF0ZTogKHZpZXdTdGF0ZTogTWFwVmlld1N0YXRlKSA9PiB2b2lkO1xuICBkdXJhdGlvbk1zOiBudW1iZXI7XG4gIG1hcFByb3BzPzogUmVjb3JkPHN0cmluZywgYW55PjtcbiAgc3dpcGVTdGFydFBjdDogbnVtYmVyO1xuICBzd2lwZUVuZFBjdDogbnVtYmVyO1xuICBzd2lwZUVhc2luZzogU3dpcGVFYXNpbmc7XG4gIGN1cnJlbnRUaW1lTXM6IG51bWJlcjtcbn07XG5cbnR5cGUgU3dpcGVFeHBvcnRWaWRlb1ByZXZpZXdTdGF0ZSA9IHtcbiAgbGVmdFJlYWR5OiBib29sZWFuO1xuICByaWdodFJlYWR5OiBib29sZWFuO1xufTtcblxuLyoqXG4gKiBBIGR1YWwtY2FudmFzIHZpZGVvIGV4cG9ydCBwcmV2aWV3IHRoYXQgcmVuZGVycyBsZWZ0L3JpZ2h0IHNwbGl0IG1hcCBsYXllcnNcbiAqIGFuZCBjb21wb3NpdGVzIHRoZW0gd2l0aCBhbiBhbmltYXRlZCBzd2lwZSBkaXZpZGVyLlxuICovXG5leHBvcnQgY2xhc3MgU3dpcGVFeHBvcnRWaWRlb1ByZXZpZXcgZXh0ZW5kcyBDb21wb25lbnQ8XG4gIFN3aXBlRXhwb3J0VmlkZW9QcmV2aWV3UHJvcHMsXG4gIFN3aXBlRXhwb3J0VmlkZW9QcmV2aWV3U3RhdGVcbj4ge1xuICBsZWZ0TWFwUmVmOiBSZWZPYmplY3Q8TWFwUmVmIHwgbnVsbD4gPSBSZWFjdC5jcmVhdGVSZWY8TWFwUmVmIHwgbnVsbD4oKTtcbiAgcmlnaHRNYXBSZWY6IFJlZk9iamVjdDxNYXBSZWYgfCBudWxsPiA9IFJlYWN0LmNyZWF0ZVJlZjxNYXBSZWYgfCBudWxsPigpO1xuICBsZWZ0RGVja1JlZjogUmVmT2JqZWN0PERlY2sgfCBudWxsPiA9IFJlYWN0LmNyZWF0ZVJlZjxEZWNrIHwgbnVsbD4oKTtcbiAgcmlnaHREZWNrUmVmOiBSZWZPYmplY3Q8RGVjayB8IG51bGw+ID0gUmVhY3QuY3JlYXRlUmVmPERlY2sgfCBudWxsPigpO1xuICBjb21wb3NpdGVDYW52YXNSZWY6IFJlZk9iamVjdDxIVE1MQ2FudmFzRWxlbWVudCB8IG51bGw+ID0gUmVhY3QuY3JlYXRlUmVmPEhUTUxDYW52YXNFbGVtZW50IHwgbnVsbD4oKTtcblxuICBjb25zdHJ1Y3Rvcihwcm9wczogU3dpcGVFeHBvcnRWaWRlb1ByZXZpZXdQcm9wcykge1xuICAgIHN1cGVyKHByb3BzKTtcblxuICAgIHRoaXMuc3RhdGUgPSB7XG4gICAgICBsZWZ0UmVhZHk6IGZhbHNlLFxuICAgICAgcmlnaHRSZWFkeTogZmFsc2VcbiAgICB9O1xuXG4gICAgdGhpcy5fcmVzaXplVmlkZW8oKTtcbiAgfVxuXG4gIGNvbXBvbmVudERpZFVwZGF0ZShwcmV2UHJvcHM6IFN3aXBlRXhwb3J0VmlkZW9QcmV2aWV3UHJvcHMpIHtcbiAgICBpZiAoIWlzRXF1YWwocHJldlByb3BzLnJlc29sdXRpb24sIHRoaXMucHJvcHMucmVzb2x1dGlvbikpIHtcbiAgICAgIHRoaXMuX3Jlc2l6ZVZpZGVvKCk7XG4gICAgfVxuXG4gICAgaWYgKFxuICAgICAgcHJldlByb3BzLmN1cnJlbnRUaW1lTXMgIT09IHRoaXMucHJvcHMuY3VycmVudFRpbWVNcyB8fFxuICAgICAgcHJldlByb3BzLnN3aXBlU3RhcnRQY3QgIT09IHRoaXMucHJvcHMuc3dpcGVTdGFydFBjdCB8fFxuICAgICAgcHJldlByb3BzLnN3aXBlRW5kUGN0ICE9PSB0aGlzLnByb3BzLnN3aXBlRW5kUGN0IHx8XG4gICAgICBwcmV2UHJvcHMuc3dpcGVFYXNpbmcgIT09IHRoaXMucHJvcHMuc3dpcGVFYXNpbmdcbiAgICApIHtcbiAgICAgIHRoaXMuX2NvbXBvc2l0ZUZyYW1lKCk7XG4gICAgfVxuICB9XG5cbiAgX3Jlc2l6ZVZpZGVvKCkge1xuICAgIGNvbnN0IHtleHBvcnRWaWRlb1dpZHRoLCByZXNvbHV0aW9ufSA9IHRoaXMucHJvcHM7XG4gICAgdGhpcy5fc2V0RGV2aWNlUGl4ZWxSYXRpbyhyZXNvbHV0aW9uWzBdIC8gZXhwb3J0VmlkZW9XaWR0aCk7XG4gIH1cblxuICBfc2V0RGV2aWNlUGl4ZWxSYXRpbyhkZXZpY2VQaXhlbFJhdGlvOiBudW1iZXIpIHtcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgd2luZG93LmRldmljZVBpeGVsUmF0aW8gPSBkZXZpY2VQaXhlbFJhdGlvO1xuICB9XG5cbiAgX2dldENvbnRhaW5lcigpIHtcbiAgICBjb25zdCB7ZXhwb3J0VmlkZW9XaWR0aCwgcmVzb2x1dGlvbn0gPSB0aGlzLnByb3BzO1xuICAgIGNvbnN0IGFzcGVjdFJhdGlvID0gcmVzb2x1dGlvblswXSAvIHJlc29sdXRpb25bMV07XG4gICAgcmV0dXJuIHtoZWlnaHQ6IGV4cG9ydFZpZGVvV2lkdGggLyBhc3BlY3RSYXRpbywgd2lkdGg6IGV4cG9ydFZpZGVvV2lkdGh9O1xuICB9XG5cbiAgX2dldEN1cnJlbnRTd2lwZVBlcmNlbnRhZ2UoKTogbnVtYmVyIHtcbiAgICBjb25zdCB7Y3VycmVudFRpbWVNcywgZHVyYXRpb25Ncywgc3dpcGVTdGFydFBjdCwgc3dpcGVFbmRQY3QsIHN3aXBlRWFzaW5nfSA9IHRoaXMucHJvcHM7XG4gICAgcmV0dXJuIGdldFN3aXBlUGVyY2VudGFnZUF0VGltZShjdXJyZW50VGltZU1zLCBkdXJhdGlvbk1zLCBzd2lwZVN0YXJ0UGN0LCBzd2lwZUVuZFBjdCwgc3dpcGVFYXNpbmcpO1xuICB9XG5cbiAgX2dldExlZnRDYW52YXMoKTogSFRNTENhbnZhc0VsZW1lbnQgfCBudWxsIHtcbiAgICBpZiAodGhpcy5sZWZ0TWFwUmVmLmN1cnJlbnQpIHtcbiAgICAgIHJldHVybiB0aGlzLmxlZnRNYXBSZWYuY3VycmVudC5nZXRNYXAoKS5nZXRDYW52YXMoKTtcbiAgICB9XG4gICAgLy8gRmFsbGJhY2s6IERlY2tHTCBjYW52YXMgKG5vIGJhc2VtYXAgbW9kZSlcbiAgICBpZiAodGhpcy5sZWZ0RGVja1JlZi5jdXJyZW50KSB7XG4gICAgICByZXR1cm4gKHRoaXMubGVmdERlY2tSZWYuY3VycmVudCBhcyBhbnkpLmdldENhbnZhcz8uKCkgfHwgbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBfZ2V0UmlnaHRDYW52YXMoKTogSFRNTENhbnZhc0VsZW1lbnQgfCBudWxsIHtcbiAgICBpZiAodGhpcy5yaWdodE1hcFJlZi5jdXJyZW50KSB7XG4gICAgICByZXR1cm4gdGhpcy5yaWdodE1hcFJlZi5jdXJyZW50LmdldE1hcCgpLmdldENhbnZhcygpO1xuICAgIH1cbiAgICBpZiAodGhpcy5yaWdodERlY2tSZWYuY3VycmVudCkge1xuICAgICAgcmV0dXJuICh0aGlzLnJpZ2h0RGVja1JlZi5jdXJyZW50IGFzIGFueSkuZ2V0Q2FudmFzPy4oKSB8fCBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIF9jb21wb3NpdGVGcmFtZSgpIHtcbiAgICBjb25zdCBsZWZ0Q2FudmFzID0gdGhpcy5fZ2V0TGVmdENhbnZhcygpO1xuICAgIGNvbnN0IHJpZ2h0Q2FudmFzID0gdGhpcy5fZ2V0UmlnaHRDYW52YXMoKTtcbiAgICBjb25zdCBvdXRwdXRDYW52YXMgPSB0aGlzLmNvbXBvc2l0ZUNhbnZhc1JlZi5jdXJyZW50O1xuXG4gICAgaWYgKCFsZWZ0Q2FudmFzIHx8ICFyaWdodENhbnZhcyB8fCAhb3V0cHV0Q2FudmFzKSByZXR1cm47XG5cbiAgICBjb25zdCBwZXJjZW50YWdlID0gdGhpcy5fZ2V0Q3VycmVudFN3aXBlUGVyY2VudGFnZSgpO1xuICAgIGNvbXBvc2l0ZVN3aXBlRnJhbWUobGVmdENhbnZhcywgcmlnaHRDYW52YXMsIG91dHB1dENhbnZhcywgcGVyY2VudGFnZSwgdHJ1ZSk7XG4gIH1cblxuICAvKipcbiAgICogQ2FsbGVkIGJ5IHRoZSBwYXJlbnQgY29udGFpbmVyJ3MgYWRhcHRlciBhZnRlciBlYWNoIHJlbmRlci5cbiAgICogV2UgbmVlZCBib3RoIG1hcHMgdG8gYmUgbG9hZGVkIGJlZm9yZSBjb21wb3NpdGluZyBhbmQgY2FwdHVyaW5nLlxuICAgKi9cbiAgb25BZnRlclJlbmRlciA9IChwcm9jZWVkVG9OZXh0RnJhbWU6ICgpID0+IHZvaWQpID0+IHtcbiAgICBjb25zdCBsZWZ0TG9hZGVkID0gdGhpcy5fYXJlTGF5ZXJzTG9hZGVkKCdsZWZ0Jyk7XG4gICAgY29uc3QgcmlnaHRMb2FkZWQgPSB0aGlzLl9hcmVMYXllcnNMb2FkZWQoJ3JpZ2h0Jyk7XG4gICAgY29uc3QgbGVmdFRpbGVzUmVhZHkgPVxuICAgICAgdGhpcy5wcm9wcy5kaXNhYmxlQmFzZU1hcCB8fCAhdGhpcy5sZWZ0TWFwUmVmLmN1cnJlbnQgfHwgdGhpcy5sZWZ0TWFwUmVmLmN1cnJlbnQuZ2V0TWFwKCkuYXJlVGlsZXNMb2FkZWQoKTtcbiAgICBjb25zdCByaWdodFRpbGVzUmVhZHkgPVxuICAgICAgdGhpcy5wcm9wcy5kaXNhYmxlQmFzZU1hcCB8fCAhdGhpcy5yaWdodE1hcFJlZi5jdXJyZW50IHx8IHRoaXMucmlnaHRNYXBSZWYuY3VycmVudC5nZXRNYXAoKS5hcmVUaWxlc0xvYWRlZCgpO1xuXG4gICAgaWYgKGxlZnRMb2FkZWQgJiYgcmlnaHRMb2FkZWQgJiYgbGVmdFRpbGVzUmVhZHkgJiYgcmlnaHRUaWxlc1JlYWR5KSB7XG4gICAgICB0aGlzLl9jb21wb3NpdGVGcmFtZSgpO1xuICAgICAgcHJvY2VlZFRvTmV4dEZyYW1lKCk7XG4gICAgfVxuICB9O1xuXG4gIF9hcmVMYXllcnNMb2FkZWQoc2lkZTogJ2xlZnQnIHwgJ3JpZ2h0Jyk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGRlY2tSZWYgPSBzaWRlID09PSAnbGVmdCcgPyB0aGlzLmxlZnREZWNrUmVmIDogdGhpcy5yaWdodERlY2tSZWY7XG4gICAgaWYgKCFkZWNrUmVmLmN1cnJlbnQpIHJldHVybiBmYWxzZTtcbiAgICBjb25zdCBsYXllcnMgPSBkZWNrUmVmLmN1cnJlbnQucHJvcHMubGF5ZXJzIHx8IFtdO1xuICAgIHJldHVybiBsYXllcnMuZXZlcnkoKGxheWVyOiBhbnkpID0+IGxheWVyLmlzTG9hZGVkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGNvbXBvc2l0ZWQgY2FudmFzIGVsZW1lbnQgZm9yIHZpZGVvIGNhcHR1cmUuXG4gICAqL1xuICBnZXRDb21wb3NpdGVDYW52YXMoKTogSFRNTENhbnZhc0VsZW1lbnQgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5jb21wb3NpdGVDYW52YXNSZWYuY3VycmVudDtcbiAgfVxuXG4gIF9jcmVhdGVMYXllcnMobWFwSW5kZXg6IG51bWJlciwgYmVmb3JlSWQ/OiBzdHJpbmcpIHtcbiAgICBjb25zdCB7ZGVja1Byb3BzLCBtYXBEYXRhLCB2aWV3U3RhdGV9ID0gdGhpcy5wcm9wcztcbiAgICBpZiAoZGVja1Byb3BzICYmIGRlY2tQcm9wcy5sYXllcnMpIHtcbiAgICAgIHJldHVybiBkZWNrUHJvcHMubGF5ZXJzO1xuICAgIH1cbiAgICByZXR1cm4gY3JlYXRlS2VwbGVyTGF5ZXJzKG1hcERhdGEsIHZpZXdTdGF0ZSwgbWFwSW5kZXgsIGJlZm9yZUlkKTtcbiAgfVxuXG4gIF9vbkxlZnRNYXBMb2FkID0gKCkgPT4ge1xuICAgIGNvbnN0IG1hcCA9IHRoaXMubGVmdE1hcFJlZi5jdXJyZW50Py5nZXRNYXAoKTtcbiAgICBpZiAobWFwKSB7XG4gICAgICBtYXAub24oJ3JlbmRlcicsICgpID0+IHtcbiAgICAgICAgaWYgKCF0aGlzLnN0YXRlLmxlZnRSZWFkeSkge1xuICAgICAgICAgIHRoaXMuc2V0U3RhdGUoe2xlZnRSZWFkeTogdHJ1ZX0pO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3RyeUNvbXBvc2l0ZSgpO1xuICAgICAgfSk7XG4gICAgfVxuICB9O1xuXG4gIF9vblJpZ2h0TWFwTG9hZCA9ICgpID0+IHtcbiAgICBjb25zdCBtYXAgPSB0aGlzLnJpZ2h0TWFwUmVmLmN1cnJlbnQ/LmdldE1hcCgpO1xuICAgIGlmIChtYXApIHtcbiAgICAgIG1hcC5vbigncmVuZGVyJywgKCkgPT4ge1xuICAgICAgICBpZiAoIXRoaXMuc3RhdGUucmlnaHRSZWFkeSkge1xuICAgICAgICAgIHRoaXMuc2V0U3RhdGUoe3JpZ2h0UmVhZHk6IHRydWV9KTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl90cnlDb21wb3NpdGUoKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfTtcblxuICBfdHJ5Q29tcG9zaXRlKCkge1xuICAgIGlmICh0aGlzLnN0YXRlLmxlZnRSZWFkeSAmJiB0aGlzLnN0YXRlLnJpZ2h0UmVhZHkpIHtcbiAgICAgIHRoaXMuX2NvbXBvc2l0ZUZyYW1lKCk7XG4gICAgfVxuICB9XG5cbiAgX3JlbmRlck1hcENhbnZhcyhcbiAgICBzaWRlOiAnbGVmdCcgfCAncmlnaHQnLFxuICAgIG1hcEluZGV4OiBudW1iZXJcbiAgKSB7XG4gICAgY29uc3Qge3ZpZXdTdGF0ZSwgYWRhcHRlciwgZGVja1Byb3BzLCBtYXBQcm9wcywgZGlzYWJsZUJhc2VNYXAsIG1hcGJveExheWVyQmVmb3JlSWR9ID0gdGhpcy5wcm9wcztcbiAgICBjb25zdCB7d2lkdGgsIGhlaWdodH0gPSB0aGlzLl9nZXRDb250YWluZXIoKTtcbiAgICBjb25zdCBrZXBsZXJMYXllcnMgPSB0aGlzLl9jcmVhdGVMYXllcnMobWFwSW5kZXgsIG1hcGJveExheWVyQmVmb3JlSWQpO1xuICAgIGNvbnN0IG1hcFJlZiA9IHNpZGUgPT09ICdsZWZ0JyA/IHRoaXMubGVmdE1hcFJlZiA6IHRoaXMucmlnaHRNYXBSZWY7XG4gICAgY29uc3QgZGVja1JlZiA9IHNpZGUgPT09ICdsZWZ0JyA/IHRoaXMubGVmdERlY2tSZWYgOiB0aGlzLnJpZ2h0RGVja1JlZjtcbiAgICBjb25zdCBvbk1hcExvYWQgPSBzaWRlID09PSAnbGVmdCcgPyB0aGlzLl9vbkxlZnRNYXBMb2FkIDogdGhpcy5fb25SaWdodE1hcExvYWQ7XG4gICAgY29uc3QgZGVjayA9IGRlY2tSZWYuY3VycmVudDtcblxuICAgIGlmIChkaXNhYmxlQmFzZU1hcCkge1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgPE1hcExheWVyICR3aWR0aD17d2lkdGh9ICRoZWlnaHQ9e2hlaWdodH0+XG4gICAgICAgICAgPERlY2tHTFxuICAgICAgICAgICAgcmVmPXtyZWYgPT4gc2V0UmVmKGRlY2tSZWYsIHJlZj8uZGVjayBhcyBhbnkpfVxuICAgICAgICAgICAgey4uLihhZGFwdGVyLmdldFByb3BzKHtkZWNrOiBkZWNrIGFzIGFueSwgZXh0cmFQcm9wczogey4uLmRlY2tQcm9wcywgbGF5ZXJzOiBrZXBsZXJMYXllcnN9fSkgYXMgYW55KX1cbiAgICAgICAgICAgIHsuLi50aGlzLl9nZXRDb250YWluZXIoKX1cbiAgICAgICAgICAvPlxuICAgICAgICA8L01hcExheWVyPlxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCB7XG4gICAgICBtYXBTdHlsZTogbWFwU3R5bGVGcm9tUHJvcHMsXG4gICAgICBtYXBMaWIsXG4gICAgICB0cmFuc2Zvcm1SZXF1ZXN0XG4gICAgfSA9IChtYXBQcm9wcyB8fCB7fSkgYXMgYW55O1xuXG4gICAgcmV0dXJuIChcbiAgICAgIDxNYXBMYXllciAkd2lkdGg9e3dpZHRofSAkaGVpZ2h0PXtoZWlnaHR9PlxuICAgICAgICA8UmVhY3RNYXBHTFxuICAgICAgICAgIHJlZj17bWFwUmVmfVxuICAgICAgICAgIHN0eWxlPXt7d2lkdGgsIGhlaWdodH19XG4gICAgICAgICAgYW50aWFsaWFzXG4gICAgICAgICAgbWFwTGliPXttYXBMaWJ9XG4gICAgICAgICAgdHJhbnNmb3JtUmVxdWVzdD17dHJhbnNmb3JtUmVxdWVzdH1cbiAgICAgICAgICBwcmVzZXJ2ZURyYXdpbmdCdWZmZXJcbiAgICAgICAgICB7Li4udmlld1N0YXRlfVxuICAgICAgICAgIG1hcFN0eWxlPXttYXBTdHlsZUZyb21Qcm9wc31cbiAgICAgICAgICBvbkxvYWQ9e29uTWFwTG9hZH1cbiAgICAgICAgPlxuICAgICAgICAgIDxEZWNrR0xPdmVybGF5XG4gICAgICAgICAgICByZWY9e2RlY2tSZWZ9XG4gICAgICAgICAgICBkZXZpY2VQcm9wcz17e3R5cGU6ICd3ZWJnbCcsIHdlYmdsOiB7c3RlbmNpbDogdHJ1ZX19fVxuICAgICAgICAgICAgey4uLmFkYXB0ZXIuZ2V0UHJvcHMoe2RlY2s6IGRlY2sgYXMgYW55LCBleHRyYVByb3BzOiB7Li4uZGVja1Byb3BzLCBsYXllcnM6IGtlcGxlckxheWVyc319KX1cbiAgICAgICAgICAvPlxuICAgICAgICA8L1JlYWN0TWFwR0w+XG4gICAgICA8L01hcExheWVyPlxuICAgICk7XG4gIH1cblxuICByZW5kZXIoKSB7XG4gICAgY29uc3Qge3Jlc29sdXRpb259ID0gdGhpcy5wcm9wcztcbiAgICBjb25zdCB7d2lkdGgsIGhlaWdodH0gPSB0aGlzLl9nZXRDb250YWluZXIoKTtcblxuICAgIHJldHVybiAoXG4gICAgICA8UHJldmlld0NvbnRhaW5lciAkd2lkdGg9e3dpZHRofSAkaGVpZ2h0PXtoZWlnaHR9PlxuICAgICAgICB7LyogSGlkZGVuIG1hcCBjYW52YXNlcyBmb3IgbGVmdCAobWFwSW5kZXg9MCkgYW5kIHJpZ2h0IChtYXBJbmRleD0xKSAqL31cbiAgICAgICAge3RoaXMuX3JlbmRlck1hcENhbnZhcygnbGVmdCcsIDApfVxuICAgICAgICB7dGhpcy5fcmVuZGVyTWFwQ2FudmFzKCdyaWdodCcsIDEpfVxuXG4gICAgICAgIHsvKiBWaXNpYmxlIGNvbXBvc2l0ZWQgb3V0cHV0ICovfVxuICAgICAgICA8VmlzaWJsZUNhbnZhc1xuICAgICAgICAgIHJlZj17dGhpcy5jb21wb3NpdGVDYW52YXNSZWZ9XG4gICAgICAgICAgd2lkdGg9e3Jlc29sdXRpb25bMF19XG4gICAgICAgICAgaGVpZ2h0PXtyZXNvbHV0aW9uWzFdfVxuICAgICAgICAgICR3aWR0aD17d2lkdGh9XG4gICAgICAgICAgJGhlaWdodD17aGVpZ2h0fVxuICAgICAgICAvPlxuICAgICAgPC9QcmV2aWV3Q29udGFpbmVyPlxuICAgICk7XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7OztBQUdBLElBQUFBLE1BQUEsR0FBQUMsdUJBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFDLE9BQUEsR0FBQUMsc0JBQUEsQ0FBQUYsT0FBQTtBQUNBLElBQUFHLFNBQUEsR0FBQUosdUJBQUEsQ0FBQUMsT0FBQTtBQUVBLElBQUFJLE9BQUEsR0FBQUosT0FBQTtBQUVBLElBQUFLLE9BQUEsR0FBQUgsc0JBQUEsQ0FBQUYsT0FBQTtBQUNBLElBQUFNLGlCQUFBLEdBQUFKLHNCQUFBLENBQUFGLE9BQUE7QUFHQSxJQUFBTyxPQUFBLEdBQUFQLE9BQUE7QUFDQSxJQUFBUSxvQkFBQSxHQUFBUixPQUFBO0FBQW1HLElBQUFTLGVBQUEsRUFBQUMsZ0JBQUEsRUFBQUMsZ0JBQUE7QUFBQSxTQUFBQyx5QkFBQUMsQ0FBQSw2QkFBQUMsT0FBQSxtQkFBQUMsQ0FBQSxPQUFBRCxPQUFBLElBQUFFLENBQUEsT0FBQUYsT0FBQSxZQUFBRix3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
|