UNPKG

69.2 kBJavaScriptView Raw
1"use strict";
2
3Object.defineProperty(exports, "__esModule", {
4 value: true
5});
6exports["default"] = void 0;
7
8var _react = _interopRequireDefault(require("react"));
9
10var _constants = require("./constants");
11
12var _modeHandler = _interopRequireDefault(require("./mode-handler"));
13
14var _utils = require("./edit-modes/utils");
15
16var _style = require("./style");
17
18function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
19
20function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
21
22function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _nonIterableSpread(); }
23
24function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance"); }
25
26function _iterableToArray(iter) { if (Symbol.iterator in Object(iter) || Object.prototype.toString.call(iter) === "[object Arguments]") return Array.from(iter); }
27
28function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = new Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } }
29
30function _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }
31
32function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }
33
34function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
35
36function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
37
38function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }
39
40function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); }
41
42function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; }
43
44function _get(target, property, receiver) { if (typeof Reflect !== "undefined" && Reflect.get) { _get = Reflect.get; } else { _get = function _get(target, property, receiver) { var base = _superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(receiver); } return desc.value; }; } return _get(target, property, receiver || target); }
45
46function _superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = _getPrototypeOf(object); if (object === null) break; } return object; }
47
48function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }
49
50function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); }
51
52function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }
53
54function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }
55
56function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(source, true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(source).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
57
58function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
59
60var defaultProps = _objectSpread({}, _modeHandler["default"].defaultProps, {
61 clickRadius: 0,
62 featureShape: 'circle',
63 editHandleShape: 'rect',
64 editHandleStyle: _style.editHandleStyle,
65 featureStyle: _style.featureStyle
66});
67
68var Editor =
69/*#__PURE__*/
70function (_ModeHandler) {
71 _inherits(Editor, _ModeHandler);
72
73 function Editor() {
74 var _getPrototypeOf2;
75
76 var _this;
77
78 _classCallCheck(this, Editor);
79
80 for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
81 args[_key] = arguments[_key];
82 }
83
84 _this = _possibleConstructorReturn(this, (_getPrototypeOf2 = _getPrototypeOf(Editor)).call.apply(_getPrototypeOf2, [this].concat(args)));
85
86 _defineProperty(_assertThisInitialized(_this), "_getEditHandleState", function (editHandle, renderState) {
87 var _this$state = _this.state,
88 pointerDownPicks = _this$state.pointerDownPicks,
89 hovered = _this$state.hovered;
90
91 if (renderState) {
92 return renderState;
93 }
94
95 var editHandleIndex = editHandle.properties.positionIndexes[0];
96 var draggingEditHandleIndex = null;
97 var pickedObject = pointerDownPicks && pointerDownPicks[0] && pointerDownPicks[0].object;
98
99 if (pickedObject && pickedObject.guideType === _constants.GUIDE_TYPE.EDIT_HANDLE) {
100 draggingEditHandleIndex = pickedObject.index;
101 }
102
103 if (editHandleIndex === draggingEditHandleIndex) {
104 return _constants.RENDER_STATE.SELECTED;
105 }
106
107 if (hovered && hovered.type === _constants.ELEMENT_TYPE.EDIT_HANDLE) {
108 if (hovered.index === editHandleIndex) {
109 return _constants.RENDER_STATE.HOVERED;
110 } // cursor hovered on first vertex when drawing polygon
111
112
113 if (hovered.index === 0 && editHandle.properties.guideType === _constants.GUIDE_TYPE.CURSOR_EDIT_HANDLE) {
114 return _constants.RENDER_STATE.CLOSING;
115 }
116 }
117
118 return _constants.RENDER_STATE.INACTIVE;
119 });
120
121 _defineProperty(_assertThisInitialized(_this), "_getFeatureRenderState", function (index, renderState) {
122 var hovered = _this.state.hovered;
123
124 var selectedFeatureIndex = _this._getSelectedFeatureIndex();
125
126 if (renderState) {
127 return renderState;
128 }
129
130 if (index === selectedFeatureIndex) {
131 return _constants.RENDER_STATE.SELECTED;
132 }
133
134 if (hovered && hovered.type === _constants.ELEMENT_TYPE.FEATURE && hovered.featureIndex === index) {
135 return _constants.RENDER_STATE.HOVERED;
136 }
137
138 return _constants.RENDER_STATE.INACTIVE;
139 });
140
141 _defineProperty(_assertThisInitialized(_this), "_getStyleProp", function (styleProp, params) {
142 return typeof styleProp === 'function' ? styleProp(params) : styleProp;
143 });
144
145 _defineProperty(_assertThisInitialized(_this), "_renderEditHandle", function (editHandle, feature) {
146 /* eslint-enable max-params */
147 var coordinates = (0, _utils.getFeatureCoordinates)(editHandle);
148
149 var p = _this.project(coordinates && coordinates[0]);
150
151 if (!p) {
152 return null;
153 }
154
155 var _editHandle$propertie = editHandle.properties,
156 featureIndex = _editHandle$propertie.featureIndex,
157 positionIndexes = _editHandle$propertie.positionIndexes;
158 var _this$props = _this.props,
159 clickRadius = _this$props.clickRadius,
160 editHandleShape = _this$props.editHandleShape,
161 editHandleStyle = _this$props.editHandleStyle;
162 var index = positionIndexes[0];
163
164 var shape = _this._getStyleProp(editHandleShape, {
165 feature: feature || editHandle,
166 index: index,
167 featureIndex: featureIndex,
168 state: _this._getEditHandleState(editHandle)
169 });
170
171 var style = _this._getStyleProp(editHandleStyle, {
172 feature: feature || editHandle,
173 index: index,
174 featureIndex: featureIndex,
175 shape: shape,
176 state: _this._getEditHandleState(editHandle)
177 }); // disable events for cursor editHandle
178
179
180 if (editHandle.properties.guideType === _constants.GUIDE_TYPE.CURSOR_EDIT_HANDLE) {
181 style = _objectSpread({}, style, {
182 // disable pointer events for cursor
183 pointerEvents: 'none'
184 });
185 }
186
187 var elemKey = "".concat(_constants.ELEMENT_TYPE.EDIT_HANDLE, ".").concat(featureIndex, ".").concat(index); // first <circle|rect> is to make path easily interacted with
188
189 switch (shape) {
190 case 'circle':
191 return _react["default"].createElement("g", {
192 key: elemKey,
193 transform: "translate(".concat(p[0], ", ").concat(p[1], ")")
194 }, _react["default"].createElement("circle", {
195 "data-type": _constants.ELEMENT_TYPE.EDIT_HANDLE,
196 "data-index": index,
197 "data-feature-index": featureIndex,
198 key: "".concat(elemKey, ".hidden"),
199 style: _objectSpread({}, style, {
200 stroke: 'none',
201 fill: '#000',
202 fillOpacity: 0
203 }),
204 cx: 0,
205 cy: 0,
206 r: clickRadius
207 }), _react["default"].createElement("circle", {
208 "data-type": _constants.ELEMENT_TYPE.EDIT_HANDLE,
209 "data-index": index,
210 "data-feature-index": featureIndex,
211 key: elemKey,
212 style: style,
213 cx: 0,
214 cy: 0
215 }));
216
217 case 'rect':
218 return _react["default"].createElement("g", {
219 key: elemKey,
220 transform: "translate(".concat(p[0], ", ").concat(p[1], ")")
221 }, _react["default"].createElement("rect", {
222 "data-type": _constants.ELEMENT_TYPE.EDIT_HANDLE,
223 "data-index": index,
224 "data-feature-index": featureIndex,
225 key: "".concat(elemKey, ".hidden"),
226 style: _objectSpread({}, style, {
227 height: clickRadius,
228 width: clickRadius,
229 fill: '#000',
230 fillOpacity: 0
231 }),
232 r: clickRadius
233 }), _react["default"].createElement("rect", {
234 "data-type": _constants.ELEMENT_TYPE.EDIT_HANDLE,
235 "data-index": index,
236 "data-feature-index": featureIndex,
237 key: "".concat(elemKey),
238 style: style
239 }));
240
241 default:
242 return null;
243 }
244 });
245
246 _defineProperty(_assertThisInitialized(_this), "_renderSegment", function (featureIndex, index, coordinates, style) {
247 var path = _this._getPathInScreenCoords(coordinates, _constants.GEOJSON_TYPE.LINE_STRING);
248
249 var radius = style.radius,
250 others = _objectWithoutProperties(style, ["radius"]);
251
252 var clickRadius = _this.props.clickRadius;
253 var elemKey = "".concat(_constants.ELEMENT_TYPE.SEGMENT, ".").concat(featureIndex, ".").concat(index);
254 return _react["default"].createElement("g", {
255 key: elemKey
256 }, _react["default"].createElement("path", {
257 key: "".concat(elemKey, ".hidden"),
258 "data-type": _constants.ELEMENT_TYPE.SEGMENT,
259 "data-index": index,
260 "data-feature-index": featureIndex,
261 style: _objectSpread({}, others, {
262 strokeWidth: clickRadius || radius,
263 opacity: 0
264 }),
265 d: path
266 }), _react["default"].createElement("path", {
267 key: elemKey,
268 "data-type": _constants.ELEMENT_TYPE.SEGMENT,
269 "data-index": index,
270 "data-feature-index": featureIndex,
271 style: others,
272 d: path
273 }));
274 });
275
276 _defineProperty(_assertThisInitialized(_this), "_renderSegments", function (featureIndex, coordinates, style) {
277 var segments = [];
278
279 for (var i = 0; i < coordinates.length - 1; i++) {
280 segments.push(_this._renderSegment(featureIndex, i, [coordinates[i], coordinates[i + 1]], style));
281 }
282
283 return segments;
284 });
285
286 _defineProperty(_assertThisInitialized(_this), "_renderFill", function (featureIndex, coordinates, style) {
287 var path = _this._getPathInScreenCoords(coordinates, _constants.GEOJSON_TYPE.POLYGON);
288
289 return _react["default"].createElement("path", {
290 key: "".concat(_constants.ELEMENT_TYPE.FILL, ".").concat(featureIndex),
291 "data-type": _constants.ELEMENT_TYPE.FILL,
292 "data-feature-index": featureIndex,
293 style: _objectSpread({}, style, {
294 stroke: 'none'
295 }),
296 d: path
297 });
298 });
299
300 _defineProperty(_assertThisInitialized(_this), "_renderTentativeFeature", function (feature, cursorEditHandle) {
301 var featureStyle = _this.props.featureStyle;
302 var coordinates = feature.geometry.coordinates,
303 renderType = feature.properties.renderType;
304
305 if (!coordinates || coordinates.length < 2) {
306 return null;
307 } // >= 2 coordinates
308
309
310 var firstCoords = coordinates[0];
311 var lastCoords = coordinates[coordinates.length - 1];
312
313 var uncommittedStyle = _this._getStyleProp(featureStyle, {
314 feature: feature,
315 index: null,
316 state: _constants.RENDER_STATE.UNCOMMITTED
317 });
318
319 var committedPath;
320 var uncommittedPath;
321 var closingPath;
322
323 var fill = _this._renderFill('tentative', coordinates, uncommittedStyle);
324
325 switch (renderType) {
326 case _constants.RENDER_TYPE.LINE_STRING:
327 case _constants.RENDER_TYPE.POLYGON:
328 case _constants.RENDER_TYPE.CIRCLE:
329 var committedStyle = _this._getStyleProp(featureStyle, {
330 feature: feature,
331 state: _constants.RENDER_STATE.SELECTED
332 });
333
334 if (cursorEditHandle) {
335 var cursorCoords = coordinates[coordinates.length - 2];
336 committedPath = _this._renderSegments('tentative', coordinates.slice(0, coordinates.length - 1), committedStyle);
337 uncommittedPath = _this._renderSegment('tentative-uncommitted', coordinates.length - 2, [cursorCoords, lastCoords], uncommittedStyle);
338 } else {
339 committedPath = _this._renderSegments('tentative', coordinates, committedStyle);
340 }
341
342 if (renderType === _constants.RENDER_TYPE.POLYGON) {
343 var closingStyle = _this._getStyleProp(featureStyle, {
344 feature: feature,
345 index: null,
346 state: _constants.RENDER_STATE.CLOSING
347 });
348
349 closingPath = _this._renderSegment('tentative-closing', coordinates.length - 1, [lastCoords, firstCoords], closingStyle);
350 }
351
352 break;
353
354 case _constants.RENDER_TYPE.RECTANGLE:
355 uncommittedPath = _this._renderSegments('tentative', [].concat(_toConsumableArray(coordinates), [firstCoords]), uncommittedStyle);
356 break;
357
358 default:
359 }
360
361 return [fill, committedPath, uncommittedPath, closingPath].filter(Boolean);
362 });
363
364 _defineProperty(_assertThisInitialized(_this), "_renderGuides", function (_ref) {
365 var tentativeFeature = _ref.tentativeFeature,
366 editHandles = _ref.editHandles;
367
368 var features = _this.getFeatures();
369
370 var cursorEditHandle = editHandles.find(function (f) {
371 return f.properties.guideType === _constants.GUIDE_TYPE.CURSOR_EDIT_HANDLE;
372 });
373 return _react["default"].createElement("g", {
374 key: "feature-guides"
375 }, tentativeFeature && _this._renderTentativeFeature(tentativeFeature, cursorEditHandle), editHandles && editHandles.map(function (editHandle) {
376 var feature = features && features[editHandle.properties.featureIndex] || tentativeFeature;
377 return _this._renderEditHandle(editHandle, feature);
378 }));
379 });
380
381 _defineProperty(_assertThisInitialized(_this), "_renderPoint", function (feature, index, path) {
382 var renderState = _this._getFeatureRenderState(index);
383
384 var _this$props2 = _this.props,
385 featureStyle = _this$props2.featureStyle,
386 featureShape = _this$props2.featureShape,
387 clickRadius = _this$props2.clickRadius;
388
389 var shape = _this._getStyleProp(featureShape, {
390 feature: feature,
391 index: index,
392 state: renderState
393 });
394
395 var style = _this._getStyleProp(featureStyle, {
396 feature: feature,
397 index: index,
398 state: renderState
399 });
400
401 var elemKey = "feature.".concat(index);
402
403 if (shape === 'rect') {
404 return _react["default"].createElement("g", {
405 key: elemKey,
406 transform: "translate(".concat(path[0][0], ", ").concat(path[0][1], ")")
407 }, _react["default"].createElement("rect", {
408 "data-type": _constants.ELEMENT_TYPE.FEATURE,
409 "data-feature-index": index,
410 key: "".concat(elemKey, ".hidden"),
411 style: _objectSpread({}, style, {
412 width: clickRadius,
413 height: clickRadius,
414 fill: '#000',
415 fillOpacity: 0
416 })
417 }), _react["default"].createElement("rect", {
418 "data-type": _constants.ELEMENT_TYPE.FEATURE,
419 "data-feature-index": index,
420 key: elemKey,
421 style: style
422 }));
423 }
424
425 return _react["default"].createElement("g", {
426 key: "feature.".concat(index),
427 transform: "translate(".concat(path[0][0], ", ").concat(path[0][1], ")")
428 }, _react["default"].createElement("circle", {
429 "data-type": _constants.ELEMENT_TYPE.FEATURE,
430 "data-feature-index": index,
431 key: "".concat(elemKey, ".hidden"),
432 style: _objectSpread({}, style, {
433 opacity: 0
434 }),
435 cx: 0,
436 cy: 0,
437 r: clickRadius
438 }), _react["default"].createElement("circle", {
439 "data-type": _constants.ELEMENT_TYPE.FEATURE,
440 "data-feature-index": index,
441 key: elemKey,
442 style: style,
443 cx: 0,
444 cy: 0
445 }));
446 });
447
448 _defineProperty(_assertThisInitialized(_this), "_renderPath", function (feature, index, path) {
449 var _this$props3 = _this.props,
450 featureStyle = _this$props3.featureStyle,
451 clickRadius = _this$props3.clickRadius;
452
453 var selectedFeatureIndex = _this._getSelectedFeatureIndex();
454
455 var selected = index === selectedFeatureIndex;
456
457 var renderState = _this._getFeatureRenderState(index);
458
459 var style = _this._getStyleProp(featureStyle, {
460 feature: feature,
461 index: index,
462 state: renderState
463 });
464
465 var elemKey = "feature.".concat(index);
466
467 if (selected) {
468 return _react["default"].createElement("g", {
469 key: elemKey
470 }, _this._renderSegments(index, feature.geometry.coordinates, style));
471 } // first <path> is to make path easily interacted with
472
473
474 return _react["default"].createElement("g", {
475 key: elemKey
476 }, _react["default"].createElement("path", {
477 "data-type": _constants.ELEMENT_TYPE.FEATURE,
478 "data-feature-index": index,
479 key: "".concat(elemKey, ".hidden"),
480 style: _objectSpread({}, style, {
481 strokeWidth: clickRadius,
482 opacity: 0
483 }),
484 d: path
485 }), _react["default"].createElement("path", {
486 "data-type": _constants.ELEMENT_TYPE.FEATURE,
487 "data-feature-index": index,
488 key: elemKey,
489 style: style,
490 d: path
491 }));
492 });
493
494 _defineProperty(_assertThisInitialized(_this), "_renderPolygon", function (feature, index, path) {
495 var featureStyle = _this.props.featureStyle;
496
497 var selectedFeatureIndex = _this._getSelectedFeatureIndex();
498
499 var selected = index === selectedFeatureIndex;
500
501 var renderState = _this._getFeatureRenderState(index);
502
503 var style = _this._getStyleProp(featureStyle, {
504 feature: feature,
505 index: index,
506 state: renderState
507 });
508
509 var elemKey = "feature.".concat(index);
510
511 if (selected) {
512 var coordinates = (0, _utils.getFeatureCoordinates)(feature);
513
514 if (!coordinates) {
515 return null;
516 }
517
518 return _react["default"].createElement("g", {
519 key: elemKey
520 }, _this._renderFill(index, coordinates, style), _this._renderSegments(index, coordinates, style));
521 }
522
523 return _react["default"].createElement("path", {
524 "data-type": _constants.ELEMENT_TYPE.FEATURE,
525 "data-feature-index": index,
526 key: elemKey,
527 style: style,
528 d: path
529 });
530 });
531
532 _defineProperty(_assertThisInitialized(_this), "_renderFeature", function (feature, index) {
533 var coordinates = (0, _utils.getFeatureCoordinates)(feature);
534
535 if (!coordinates || !coordinates.length) {
536 return null;
537 }
538
539 var renderType = feature.properties.renderType,
540 type = feature.geometry.type;
541
542 var path = _this._getPathInScreenCoords(coordinates, type);
543
544 if (!path) {
545 return null;
546 }
547
548 switch (renderType) {
549 case _constants.RENDER_TYPE.POINT:
550 return _this._renderPoint(feature, index, path);
551
552 case _constants.RENDER_TYPE.LINE_STRING:
553 return _this._renderPath(feature, index, path);
554
555 case _constants.RENDER_TYPE.POLYGON:
556 case _constants.RENDER_TYPE.RECTANGLE:
557 case _constants.RENDER_TYPE.CIRCLE:
558 return _this._renderPolygon(feature, index, path);
559
560 default:
561 return null;
562 }
563 });
564
565 _defineProperty(_assertThisInitialized(_this), "_renderCanvas", function () {
566 var features = _this.getFeatures();
567
568 var guides = _this._modeHandler && _this._modeHandler.getGuides(_this.getModeProps());
569
570 return _react["default"].createElement("svg", {
571 key: "draw-canvas",
572 width: "100%",
573 height: "100%"
574 }, features && features.length > 0 && _react["default"].createElement("g", {
575 key: "feature-group"
576 }, features.map(_this._renderFeature)), guides && _react["default"].createElement("g", {
577 key: "feature-guides"
578 }, _this._renderGuides(guides)));
579 });
580
581 _defineProperty(_assertThisInitialized(_this), "_renderEditor", function () {
582 var viewport = _this._context && _this._context.viewport || {};
583 var style = _this.props.style;
584 var width = viewport.width,
585 height = viewport.height;
586 return _react["default"].createElement("div", {
587 id: "editor",
588 style: _objectSpread({
589 width: width,
590 height: height
591 }, style),
592 ref: function ref(_) {
593 _this._containerRef = _;
594 }
595 }, _this._renderCanvas());
596 });
597
598 return _this;
599 }
600
601 _createClass(Editor, [{
602 key: "_getPathInScreenCoords",
603
604 /* HELPERS */
605 value: function _getPathInScreenCoords(coordinates, type) {
606 var _this2 = this;
607
608 if (coordinates.length === 0) {
609 return '';
610 }
611
612 var screenCoords = coordinates.map(function (p) {
613 return _this2.project(p);
614 });
615 var pathString = '';
616
617 switch (type) {
618 case _constants.GEOJSON_TYPE.POINT:
619 return screenCoords;
620
621 case _constants.GEOJSON_TYPE.LINE_STRING:
622 pathString = screenCoords.map(function (p) {
623 return "".concat(p[0], ",").concat(p[1]);
624 }).join('L');
625 return "M ".concat(pathString);
626
627 case _constants.GEOJSON_TYPE.POLYGON:
628 case _constants.GEOJSON_TYPE.CIRCLE:
629 pathString = screenCoords.map(function (p) {
630 return "".concat(p[0], ",").concat(p[1]);
631 }).join('L');
632 return "M ".concat(pathString, " z");
633
634 default:
635 return null;
636 }
637 }
638 }, {
639 key: "render",
640 value: function render() {
641 return _get(_getPrototypeOf(Editor.prototype), "render", this).call(this, this._renderEditor());
642 }
643 }]);
644
645 return Editor;
646}(_modeHandler["default"]);
647
648exports["default"] = Editor;
649
650_defineProperty(Editor, "defaultProps", defaultProps);
651//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9lZGl0b3IuanMiXSwibmFtZXMiOlsiZGVmYXVsdFByb3BzIiwiTW9kZUhhbmRsZXIiLCJjbGlja1JhZGl1cyIsImZlYXR1cmVTaGFwZSIsImVkaXRIYW5kbGVTaGFwZSIsImVkaXRIYW5kbGVTdHlsZSIsImRlZmF1bHRFZGl0SGFuZGxlU3R5bGUiLCJmZWF0dXJlU3R5bGUiLCJkZWZhdWx0RmVhdHVyZVN0eWxlIiwiRWRpdG9yIiwiZWRpdEhhbmRsZSIsInJlbmRlclN0YXRlIiwic3RhdGUiLCJwb2ludGVyRG93blBpY2tzIiwiaG92ZXJlZCIsImVkaXRIYW5kbGVJbmRleCIsInByb3BlcnRpZXMiLCJwb3NpdGlvbkluZGV4ZXMiLCJkcmFnZ2luZ0VkaXRIYW5kbGVJbmRleCIsInBpY2tlZE9iamVjdCIsIm9iamVjdCIsImd1aWRlVHlwZSIsIkdVSURFX1RZUEUiLCJFRElUX0hBTkRMRSIsImluZGV4IiwiUkVOREVSX1NUQVRFIiwiU0VMRUNURUQiLCJ0eXBlIiwiRUxFTUVOVF9UWVBFIiwiSE9WRVJFRCIsIkNVUlNPUl9FRElUX0hBTkRMRSIsIkNMT1NJTkciLCJJTkFDVElWRSIsInNlbGVjdGVkRmVhdHVyZUluZGV4IiwiX2dldFNlbGVjdGVkRmVhdHVyZUluZGV4IiwiRkVBVFVSRSIsImZlYXR1cmVJbmRleCIsInN0eWxlUHJvcCIsInBhcmFtcyIsImZlYXR1cmUiLCJjb29yZGluYXRlcyIsInAiLCJwcm9qZWN0IiwicHJvcHMiLCJzaGFwZSIsIl9nZXRTdHlsZVByb3AiLCJfZ2V0RWRpdEhhbmRsZVN0YXRlIiwic3R5bGUiLCJwb2ludGVyRXZlbnRzIiwiZWxlbUtleSIsInN0cm9rZSIsImZpbGwiLCJmaWxsT3BhY2l0eSIsImhlaWdodCIsIndpZHRoIiwicGF0aCIsIl9nZXRQYXRoSW5TY3JlZW5Db29yZHMiLCJHRU9KU09OX1RZUEUiLCJMSU5FX1NUUklORyIsInJhZGl1cyIsIm90aGVycyIsIlNFR01FTlQiLCJzdHJva2VXaWR0aCIsIm9wYWNpdHkiLCJzZWdtZW50cyIsImkiLCJsZW5ndGgiLCJwdXNoIiwiX3JlbmRlclNlZ21lbnQiLCJQT0xZR09OIiwiRklMTCIsImN1cnNvckVkaXRIYW5kbGUiLCJnZW9tZXRyeSIsInJlbmRlclR5cGUiLCJmaXJzdENvb3JkcyIsImxhc3RDb29yZHMiLCJ1bmNvbW1pdHRlZFN0eWxlIiwiVU5DT01NSVRURUQiLCJjb21taXR0ZWRQYXRoIiwidW5jb21taXR0ZWRQYXRoIiwiY2xvc2luZ1BhdGgiLCJfcmVuZGVyRmlsbCIsIlJFTkRFUl9UWVBFIiwiQ0lSQ0xFIiwiY29tbWl0dGVkU3R5bGUiLCJjdXJzb3JDb29yZHMiLCJfcmVuZGVyU2VnbWVudHMiLCJzbGljZSIsImNsb3NpbmdTdHlsZSIsIlJFQ1RBTkdMRSIsImZpbHRlciIsIkJvb2xlYW4iLCJ0ZW50YXRpdmVGZWF0dXJlIiwiZWRpdEhhbmRsZXMiLCJmZWF0dXJlcyIsImdldEZlYXR1cmVzIiwiZmluZCIsImYiLCJfcmVuZGVyVGVudGF0aXZlRmVhdHVyZSIsIm1hcCIsIl9yZW5kZXJFZGl0SGFuZGxlIiwiX2dldEZlYXR1cmVSZW5kZXJTdGF0ZSIsInNlbGVjdGVkIiwiUE9JTlQiLCJfcmVuZGVyUG9pbnQiLCJfcmVuZGVyUGF0aCIsIl9yZW5kZXJQb2x5Z29uIiwiZ3VpZGVzIiwiX21vZGVIYW5kbGVyIiwiZ2V0R3VpZGVzIiwiZ2V0TW9kZVByb3BzIiwiX3JlbmRlckZlYXR1cmUiLCJfcmVuZGVyR3VpZGVzIiwidmlld3BvcnQiLCJfY29udGV4dCIsIl8iLCJfY29udGFpbmVyUmVmIiwiX3JlbmRlckNhbnZhcyIsInNjcmVlbkNvb3JkcyIsInBhdGhTdHJpbmciLCJqb2luIiwiX3JlbmRlckVkaXRvciJdLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQUVBOztBQUtBOztBQUNBOztBQUNBOztBQUVBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUtBLElBQU1BLFlBQVkscUJBQ2JDLHdCQUFZRCxZQURDO0FBRWhCRSxFQUFBQSxXQUFXLEVBQUUsQ0FGRztBQUdoQkMsRUFBQUEsWUFBWSxFQUFFLFFBSEU7QUFJaEJDLEVBQUFBLGVBQWUsRUFBRSxNQUpEO0FBS2hCQyxFQUFBQSxlQUFlLEVBQUVDLHNCQUxEO0FBTWhCQyxFQUFBQSxZQUFZLEVBQUVDO0FBTkUsRUFBbEI7O0lBU3FCQyxNOzs7Ozs7Ozs7Ozs7Ozs7Ozs7MEVBOEJHLFVBQUNDLFVBQUQsRUFBc0JDLFdBQXRCLEVBQStDO0FBQUEsd0JBQzdCLE1BQUtDLEtBRHdCO0FBQUEsVUFDM0RDLGdCQUQyRCxlQUMzREEsZ0JBRDJEO0FBQUEsVUFDekNDLE9BRHlDLGVBQ3pDQSxPQUR5Qzs7QUFHbkUsVUFBSUgsV0FBSixFQUFpQjtBQUNmLGVBQU9BLFdBQVA7QUFDRDs7QUFFRCxVQUFNSSxlQUFlLEdBQUdMLFVBQVUsQ0FBQ00sVUFBWCxDQUFzQkMsZUFBdEIsQ0FBc0MsQ0FBdEMsQ0FBeEI7QUFDQSxVQUFJQyx1QkFBdUIsR0FBRyxJQUE5QjtBQUNBLFVBQU1DLFlBQVksR0FBR04sZ0JBQWdCLElBQUlBLGdCQUFnQixDQUFDLENBQUQsQ0FBcEMsSUFBMkNBLGdCQUFnQixDQUFDLENBQUQsQ0FBaEIsQ0FBb0JPLE1BQXBGOztBQUNBLFVBQUlELFlBQVksSUFBSUEsWUFBWSxDQUFDRSxTQUFiLEtBQTJCQyxzQkFBV0MsV0FBMUQsRUFBdUU7QUFDckVMLFFBQUFBLHVCQUF1QixHQUFHQyxZQUFZLENBQUNLLEtBQXZDO0FBQ0Q7O0FBRUQsVUFBSVQsZUFBZSxLQUFLRyx1QkFBeEIsRUFBaUQ7QUFDL0MsZUFBT08sd0JBQWFDLFFBQXBCO0FBQ0Q7O0FBRUQsVUFBSVosT0FBTyxJQUFJQSxPQUFPLENBQUNhLElBQVIsS0FBaUJDLHdCQUFhTCxXQUE3QyxFQUEwRDtBQUN4RCxZQUFJVCxPQUFPLENBQUNVLEtBQVIsS0FBa0JULGVBQXRCLEVBQXVDO0FBQ3JDLGlCQUFPVSx3QkFBYUksT0FBcEI7QUFDRCxTQUh1RCxDQUt4RDs7O0FBQ0EsWUFDRWYsT0FBTyxDQUFDVSxLQUFSLEtBQWtCLENBQWxCLElBQ0FkLFVBQVUsQ0FBQ00sVUFBWCxDQUFzQkssU0FBdEIsS0FBb0NDLHNCQUFXUSxrQkFGakQsRUFHRTtBQUNBLGlCQUFPTCx3QkFBYU0sT0FBcEI7QUFDRDtBQUNGOztBQUVELGFBQU9OLHdCQUFhTyxRQUFwQjtBQUNELEs7OzZFQUV3QixVQUFDUixLQUFELEVBQWdCYixXQUFoQixFQUE4QztBQUFBLFVBQzdERyxPQUQ2RCxHQUNqRCxNQUFLRixLQUQ0QyxDQUM3REUsT0FENkQ7O0FBRXJFLFVBQU1tQixvQkFBb0IsR0FBRyxNQUFLQyx3QkFBTCxFQUE3Qjs7QUFDQSxVQUFJdkIsV0FBSixFQUFpQjtBQUNmLGVBQU9BLFdBQVA7QUFDRDs7QUFFRCxVQUFJYSxLQUFLLEtBQUtTLG9CQUFkLEVBQW9DO0FBQ2xDLGVBQU9SLHdCQUFhQyxRQUFwQjtBQUNEOztBQUVELFVBQUlaLE9BQU8sSUFBSUEsT0FBTyxDQUFDYSxJQUFSLEtBQWlCQyx3QkFBYU8sT0FBekMsSUFBb0RyQixPQUFPLENBQUNzQixZQUFSLEtBQXlCWixLQUFqRixFQUF3RjtBQUN0RixlQUFPQyx3QkFBYUksT0FBcEI7QUFDRDs7QUFFRCxhQUFPSix3QkFBYU8sUUFBcEI7QUFDRCxLOztvRUFFZSxVQUFDSyxTQUFELEVBQWlCQyxNQUFqQixFQUFpQztBQUMvQyxhQUFPLE9BQU9ELFNBQVAsS0FBcUIsVUFBckIsR0FBa0NBLFNBQVMsQ0FBQ0MsTUFBRCxDQUEzQyxHQUFzREQsU0FBN0Q7QUFDRCxLOzt3RUFJbUIsVUFBQzNCLFVBQUQsRUFBc0I2QixPQUF0QixFQUEyQztBQUM3RDtBQUNBLFVBQU1DLFdBQVcsR0FBRyxrQ0FBc0I5QixVQUF0QixDQUFwQjs7QUFDQSxVQUFNK0IsQ0FBQyxHQUFHLE1BQUtDLE9BQUwsQ0FBYUYsV0FBVyxJQUFJQSxXQUFXLENBQUMsQ0FBRCxDQUF2QyxDQUFWOztBQUNBLFVBQUksQ0FBQ0MsQ0FBTCxFQUFRO0FBQ04sZUFBTyxJQUFQO0FBQ0Q7O0FBTjRELGtDQVV6RC9CLFVBVnlELENBUzNETSxVQVQyRDtBQUFBLFVBUzdDb0IsWUFUNkMseUJBUzdDQSxZQVQ2QztBQUFBLFVBUy9CbkIsZUFUK0IseUJBUy9CQSxlQVQrQjtBQUFBLHdCQVdILE1BQUswQixLQVhGO0FBQUEsVUFXckR6QyxXQVhxRCxlQVdyREEsV0FYcUQ7QUFBQSxVQVd4Q0UsZUFYd0MsZUFXeENBLGVBWHdDO0FBQUEsVUFXdkJDLGVBWHVCLGVBV3ZCQSxlQVh1QjtBQWE3RCxVQUFNbUIsS0FBSyxHQUFHUCxlQUFlLENBQUMsQ0FBRCxDQUE3Qjs7QUFFQSxVQUFNMkIsS0FBSyxHQUFHLE1BQUtDLGFBQUwsQ0FBbUJ6QyxlQUFuQixFQUFvQztBQUNoRG1DLFFBQUFBLE9BQU8sRUFBRUEsT0FBTyxJQUFJN0IsVUFENEI7QUFFaERjLFFBQUFBLEtBQUssRUFBTEEsS0FGZ0Q7QUFHaERZLFFBQUFBLFlBQVksRUFBWkEsWUFIZ0Q7QUFJaER4QixRQUFBQSxLQUFLLEVBQUUsTUFBS2tDLG1CQUFMLENBQXlCcEMsVUFBekI7QUFKeUMsT0FBcEMsQ0FBZDs7QUFPQSxVQUFJcUMsS0FBSyxHQUFHLE1BQUtGLGFBQUwsQ0FBbUJ4QyxlQUFuQixFQUFvQztBQUM5Q2tDLFFBQUFBLE9BQU8sRUFBRUEsT0FBTyxJQUFJN0IsVUFEMEI7QUFFOUNjLFFBQUFBLEtBQUssRUFBTEEsS0FGOEM7QUFHOUNZLFFBQUFBLFlBQVksRUFBWkEsWUFIOEM7QUFJOUNRLFFBQUFBLEtBQUssRUFBTEEsS0FKOEM7QUFLOUNoQyxRQUFBQSxLQUFLLEVBQUUsTUFBS2tDLG1CQUFMLENBQXlCcEMsVUFBekI7QUFMdUMsT0FBcEMsQ0FBWixDQXRCNkQsQ0E4QjdEOzs7QUFDQSxVQUFJQSxVQUFVLENBQUNNLFVBQVgsQ0FBc0JLLFNBQXRCLEtBQW9DQyxzQkFBV1Esa0JBQW5ELEVBQXVFO0FBQ3JFaUIsUUFBQUEsS0FBSyxxQkFDQUEsS0FEQTtBQUVIO0FBQ0FDLFVBQUFBLGFBQWEsRUFBRTtBQUhaLFVBQUw7QUFLRDs7QUFFRCxVQUFNQyxPQUFPLGFBQU1yQix3QkFBYUwsV0FBbkIsY0FBa0NhLFlBQWxDLGNBQWtEWixLQUFsRCxDQUFiLENBdkM2RCxDQXdDN0Q7O0FBQ0EsY0FBUW9CLEtBQVI7QUFDRSxhQUFLLFFBQUw7QUFDRSxpQkFDRTtBQUFHLFlBQUEsR0FBRyxFQUFFSyxPQUFSO0FBQWlCLFlBQUEsU0FBUyxzQkFBZVIsQ0FBQyxDQUFDLENBQUQsQ0FBaEIsZUFBd0JBLENBQUMsQ0FBQyxDQUFELENBQXpCO0FBQTFCLGFBQ0U7QUFDRSx5QkFBV2Isd0JBQWFMLFdBRDFCO0FBRUUsMEJBQVlDLEtBRmQ7QUFHRSxrQ0FBb0JZLFlBSHRCO0FBSUUsWUFBQSxHQUFHLFlBQUthLE9BQUwsWUFKTDtBQUtFLFlBQUEsS0FBSyxvQkFBT0YsS0FBUDtBQUFjRyxjQUFBQSxNQUFNLEVBQUUsTUFBdEI7QUFBOEJDLGNBQUFBLElBQUksRUFBRSxNQUFwQztBQUE0Q0MsY0FBQUEsV0FBVyxFQUFFO0FBQXpELGNBTFA7QUFNRSxZQUFBLEVBQUUsRUFBRSxDQU5OO0FBT0UsWUFBQSxFQUFFLEVBQUUsQ0FQTjtBQVFFLFlBQUEsQ0FBQyxFQUFFbEQ7QUFSTCxZQURGLEVBV0U7QUFDRSx5QkFBVzBCLHdCQUFhTCxXQUQxQjtBQUVFLDBCQUFZQyxLQUZkO0FBR0Usa0NBQW9CWSxZQUh0QjtBQUlFLFlBQUEsR0FBRyxFQUFFYSxPQUpQO0FBS0UsWUFBQSxLQUFLLEVBQUVGLEtBTFQ7QUFNRSxZQUFBLEVBQUUsRUFBRSxDQU5OO0FBT0UsWUFBQSxFQUFFLEVBQUU7QUFQTixZQVhGLENBREY7O0FBdUJGLGFBQUssTUFBTDtBQUNFLGlCQUNFO0FBQUcsWUFBQSxHQUFHLEVBQUVFLE9BQVI7QUFBaUIsWUFBQSxTQUFTLHNCQUFlUixDQUFDLENBQUMsQ0FBRCxDQUFoQixlQUF3QkEsQ0FBQyxDQUFDLENBQUQsQ0FBekI7QUFBMUIsYUFDRTtBQUNFLHlCQUFXYix3QkFBYUwsV0FEMUI7QUFFRSwwQkFBWUMsS0FGZDtBQUdFLGtDQUFvQlksWUFIdEI7QUFJRSxZQUFBLEdBQUcsWUFBS2EsT0FBTCxZQUpMO0FBS0UsWUFBQSxLQUFLLG9CQUNBRixLQURBO0FBRUhNLGNBQUFBLE1BQU0sRUFBRW5ELFdBRkw7QUFHSG9ELGNBQUFBLEtBQUssRUFBRXBELFdBSEo7QUFJSGlELGNBQUFBLElBQUksRUFBRSxNQUpIO0FBS0hDLGNBQUFBLFdBQVcsRUFBRTtBQUxWLGNBTFA7QUFZRSxZQUFBLENBQUMsRUFBRWxEO0FBWkwsWUFERixFQWVFO0FBQ0UseUJBQVcwQix3QkFBYUwsV0FEMUI7QUFFRSwwQkFBWUMsS0FGZDtBQUdFLGtDQUFvQlksWUFIdEI7QUFJRSxZQUFBLEdBQUcsWUFBS2EsT0FBTCxDQUpMO0FBS0UsWUFBQSxLQUFLLEVBQUVGO0FBTFQsWUFmRixDQURGOztBQTBCRjtBQUNFLGlCQUFPLElBQVA7QUFyREo7QUF1REQsSzs7cUVBRWdCLFVBQUNYLFlBQUQsRUFBbUJaLEtBQW5CLEVBQWtDZ0IsV0FBbEMsRUFBeURPLEtBQXpELEVBQTJFO0FBQzFGLFVBQU1RLElBQUksR0FBRyxNQUFLQyxzQkFBTCxDQUE0QmhCLFdBQTVCLEVBQXlDaUIsd0JBQWFDLFdBQXRELENBQWI7O0FBRDBGLFVBRWxGQyxNQUZrRixHQUU1RFosS0FGNEQsQ0FFbEZZLE1BRmtGO0FBQUEsVUFFdkVDLE1BRnVFLDRCQUU1RGIsS0FGNEQ7O0FBQUEsVUFHbEY3QyxXQUhrRixHQUdsRSxNQUFLeUMsS0FINkQsQ0FHbEZ6QyxXQUhrRjtBQUsxRixVQUFNK0MsT0FBTyxhQUFNckIsd0JBQWFpQyxPQUFuQixjQUE4QnpCLFlBQTlCLGNBQThDWixLQUE5QyxDQUFiO0FBQ0EsYUFDRTtBQUFHLFFBQUEsR0FBRyxFQUFFeUI7QUFBUixTQUNFO0FBQ0UsUUFBQSxHQUFHLFlBQUtBLE9BQUwsWUFETDtBQUVFLHFCQUFXckIsd0JBQWFpQyxPQUYxQjtBQUdFLHNCQUFZckMsS0FIZDtBQUlFLDhCQUFvQlksWUFKdEI7QUFLRSxRQUFBLEtBQUssb0JBQ0F3QixNQURBO0FBRUhFLFVBQUFBLFdBQVcsRUFBRTVELFdBQVcsSUFBSXlELE1BRnpCO0FBR0hJLFVBQUFBLE9BQU8sRUFBRTtBQUhOLFVBTFA7QUFVRSxRQUFBLENBQUMsRUFBRVI7QUFWTCxRQURGLEVBYUU7QUFDRSxRQUFBLEdBQUcsRUFBRU4sT0FEUDtBQUVFLHFCQUFXckIsd0JBQWFpQyxPQUYxQjtBQUdFLHNCQUFZckMsS0FIZDtBQUlFLDhCQUFvQlksWUFKdEI7QUFLRSxRQUFBLEtBQUssRUFBRXdCLE1BTFQ7QUFNRSxRQUFBLENBQUMsRUFBRUw7QUFOTCxRQWJGLENBREY7QUF3QkQsSzs7c0VBRWlCLFVBQUNuQixZQUFELEVBQW1CSSxXQUFuQixFQUEwQ08sS0FBMUMsRUFBNEQ7QUFDNUUsVUFBTWlCLFFBQVEsR0FBRyxFQUFqQjs7QUFDQSxXQUFLLElBQUlDLENBQUMsR0FBRyxDQUFiLEVBQWdCQSxDQUFDLEdBQUd6QixXQUFXLENBQUMwQixNQUFaLEdBQXFCLENBQXpDLEVBQTRDRCxDQUFDLEVBQTdDLEVBQWlEO0FBQy9DRCxRQUFBQSxRQUFRLENBQUNHLElBQVQsQ0FDRSxNQUFLQyxjQUFMLENBQW9CaEMsWUFBcEIsRUFBa0M2QixDQUFsQyxFQUFxQyxDQUFDekIsV0FBVyxDQUFDeUIsQ0FBRCxDQUFaLEVBQWlCekIsV0FBVyxDQUFDeUIsQ0FBQyxHQUFHLENBQUwsQ0FBNUIsQ0FBckMsRUFBMkVsQixLQUEzRSxDQURGO0FBR0Q7O0FBQ0QsYUFBT2lCLFFBQVA7QUFDRCxLOztrRUFFYSxVQUFDNUIsWUFBRCxFQUFtQkksV0FBbkIsRUFBMENPLEtBQTFDLEVBQTREO0FBQ3hFLFVBQU1RLElBQUksR0FBRyxNQUFLQyxzQkFBTCxDQUE0QmhCLFdBQTVCLEVBQXlDaUIsd0JBQWFZLE9BQXRELENBQWI7O0FBQ0EsYUFDRTtBQUNFLFFBQUEsR0FBRyxZQUFLekMsd0JBQWEwQyxJQUFsQixjQUEwQmxDLFlBQTFCLENBREw7QUFFRSxxQkFBV1Isd0JBQWEwQyxJQUYxQjtBQUdFLDhCQUFvQmxDLFlBSHRCO0FBSUUsUUFBQSxLQUFLLG9CQUFPVyxLQUFQO0FBQWNHLFVBQUFBLE1BQU0sRUFBRTtBQUF0QixVQUpQO0FBS0UsUUFBQSxDQUFDLEVBQUVLO0FBTEwsUUFERjtBQVNELEs7OzhFQUV5QixVQUFDaEIsT0FBRCxFQUFtQmdDLGdCQUFuQixFQUFpRDtBQUFBLFVBQ2pFaEUsWUFEaUUsR0FDaEQsTUFBS29DLEtBRDJDLENBQ2pFcEMsWUFEaUU7QUFBQSxVQUczRGlDLFdBSDJELEdBS3JFRCxPQUxxRSxDQUd2RWlDLFFBSHVFLENBRzNEaEMsV0FIMkQ7QUFBQSxVQUl6RGlDLFVBSnlELEdBS3JFbEMsT0FMcUUsQ0FJdkV2QixVQUp1RSxDQUl6RHlELFVBSnlEOztBQU96RSxVQUFJLENBQUNqQyxXQUFELElBQWdCQSxXQUFXLENBQUMwQixNQUFaLEdBQXFCLENBQXpDLEVBQTRDO0FBQzFDLGVBQU8sSUFBUDtBQUNELE9BVHdFLENBV3pFOzs7QUFDQSxVQUFNUSxXQUFXLEdBQUdsQyxXQUFXLENBQUMsQ0FBRCxDQUEvQjtBQUNBLFVBQU1tQyxVQUFVLEdBQUduQyxXQUFXLENBQUNBLFdBQVcsQ0FBQzBCLE1BQVosR0FBcUIsQ0FBdEIsQ0FBOUI7O0FBQ0EsVUFBTVUsZ0JBQWdCLEdBQUcsTUFBSy9CLGFBQUwsQ0FBbUJ0QyxZQUFuQixFQUFpQztBQUN4RGdDLFFBQUFBLE9BQU8sRUFBUEEsT0FEd0Q7QUFFeERmLFFBQUFBLEtBQUssRUFBRSxJQUZpRDtBQUd4RFosUUFBQUEsS0FBSyxFQUFFYSx3QkFBYW9EO0FBSG9DLE9BQWpDLENBQXpCOztBQU1BLFVBQUlDLGFBQUo7QUFDQSxVQUFJQyxlQUFKO0FBQ0EsVUFBSUMsV0FBSjs7QUFDQSxVQUFNN0IsSUFBSSxHQUFHLE1BQUs4QixXQUFMLENBQWlCLFdBQWpCLEVBQThCekMsV0FBOUIsRUFBMkNvQyxnQkFBM0MsQ0FBYjs7QUFFQSxjQUFRSCxVQUFSO0FBQ0UsYUFBS1MsdUJBQVl4QixXQUFqQjtBQUNBLGFBQUt3Qix1QkFBWWIsT0FBakI7QUFDQSxhQUFLYSx1QkFBWUMsTUFBakI7QUFDRSxjQUFNQyxjQUFjLEdBQUcsTUFBS3ZDLGFBQUwsQ0FBbUJ0QyxZQUFuQixFQUFpQztBQUN0RGdDLFlBQUFBLE9BQU8sRUFBUEEsT0FEc0Q7QUFFdEQzQixZQUFBQSxLQUFLLEVBQUVhLHdCQUFhQztBQUZrQyxXQUFqQyxDQUF2Qjs7QUFLQSxjQUFJNkMsZ0JBQUosRUFBc0I7QUFDcEIsZ0JBQU1jLFlBQVksR0FBRzdDLFdBQVcsQ0FBQ0EsV0FBVyxDQUFDMEIsTUFBWixHQUFxQixDQUF0QixDQUFoQztBQUNBWSxZQUFBQSxhQUFhLEdBQUcsTUFBS1EsZUFBTCxDQUNkLFdBRGMsRUFFZDlDLFdBQVcsQ0FBQytDLEtBQVosQ0FBa0IsQ0FBbEIsRUFBcUIvQyxXQUFXLENBQUMwQixNQUFaLEdBQXFCLENBQTFDLENBRmMsRUFHZGtCLGNBSGMsQ0FBaEI7QUFLQUwsWUFBQUEsZUFBZSxHQUFHLE1BQUtYLGNBQUwsQ0FDaEIsdUJBRGdCLEVBRWhCNUIsV0FBVyxDQUFDMEIsTUFBWixHQUFxQixDQUZMLEVBR2hCLENBQUNtQixZQUFELEVBQWVWLFVBQWYsQ0FIZ0IsRUFJaEJDLGdCQUpnQixDQUFsQjtBQU1ELFdBYkQsTUFhTztBQUNMRSxZQUFBQSxhQUFhLEdBQUcsTUFBS1EsZUFBTCxDQUFxQixXQUFyQixFQUFrQzlDLFdBQWxDLEVBQStDNEMsY0FBL0MsQ0FBaEI7QUFDRDs7QUFFRCxjQUFJWCxVQUFVLEtBQUtTLHVCQUFZYixPQUEvQixFQUF3QztBQUN0QyxnQkFBTW1CLFlBQVksR0FBRyxNQUFLM0MsYUFBTCxDQUFtQnRDLFlBQW5CLEVBQWlDO0FBQ3BEZ0MsY0FBQUEsT0FBTyxFQUFQQSxPQURvRDtBQUVwRGYsY0FBQUEsS0FBSyxFQUFFLElBRjZDO0FBR3BEWixjQUFBQSxLQUFLLEVBQUVhLHdCQUFhTTtBQUhnQyxhQUFqQyxDQUFyQjs7QUFNQWlELFlBQUFBLFdBQVcsR0FBRyxNQUFLWixjQUFMLENBQ1osbUJBRFksRUFFWjVCLFdBQVcsQ0FBQzBCLE1BQVosR0FBcUIsQ0FGVCxFQUdaLENBQUNTLFVBQUQsRUFBYUQsV0FBYixDQUhZLEVBSVpjLFlBSlksQ0FBZDtBQU1EOztBQUVEOztBQUVGLGFBQUtOLHVCQUFZTyxTQUFqQjtBQUNFVixVQUFBQSxlQUFlLEdBQUcsTUFBS08sZUFBTCxDQUNoQixXQURnQiwrQkFFWjlDLFdBRlksSUFFQ2tDLFdBRkQsSUFHaEJFLGdCQUhnQixDQUFsQjtBQUtBOztBQUVGO0FBbkRGOztBQXNEQSxhQUFPLENBQUN6QixJQUFELEVBQU8yQixhQUFQLEVBQXNCQyxlQUF0QixFQUF1Q0MsV0FBdkMsRUFBb0RVLE1BQXBELENBQTJEQyxPQUEzRCxDQUFQO0FBQ0QsSzs7b0VBRWUsZ0JBQStDO0FBQUEsVUFBNUNDLGdCQUE0QyxRQUE1Q0EsZ0JBQTRDO0FBQUEsVUFBMUJDLFdBQTBCLFFBQTFCQSxXQUEwQjs7QUFDN0QsVUFBTUMsUUFBUSxHQUFHLE1BQUtDLFdBQUwsRUFBakI7O0FBQ0EsVUFBTXhCLGdCQUFnQixHQUFHc0IsV0FBVyxDQUFDRyxJQUFaLENBQ3ZCLFVBQUFDLENBQUM7QUFBQSxlQUFJQSxDQUFDLENBQUNqRixVQUFGLENBQWFLLFNBQWIsS0FBMkJDLHNCQUFXUSxrQkFBMUM7QUFBQSxPQURzQixDQUF6QjtBQUdBLGFBQ0U7QUFBRyxRQUFBLEdBQUcsRUFBQztBQUFQLFNBQ0c4RCxnQkFBZ0IsSUFBSSxNQUFLTSx1QkFBTCxDQUE2Qk4sZ0JBQTdCLEVBQStDckIsZ0JBQS9DLENBRHZCLEVBRUdzQixXQUFXLElBQ1ZBLFdBQVcsQ0FBQ00sR0FBWixDQUFnQixVQUFBekYsVUFBVSxFQUFJO0FBQzVCLFlBQU02QixPQUFPLEdBQ1Z1RCxRQUFRLElBQUlBLFFBQVEsQ0FBQ3BGLFVBQVUsQ0FBQ00sVUFBWCxDQUFzQm9CLFlBQXZCLENBQXJCLElBQThEd0QsZ0JBRGhFO0FBRUEsZUFBTyxNQUFLUSxpQkFBTCxDQUF1QjFGLFVBQXZCLEVBQW1DNkIsT0FBbkMsQ0FBUDtBQUNELE9BSkQsQ0FISixDQURGO0FBV0QsSzs7bUVBRWMsVUFBQ0EsT0FBRCxFQUFtQmYsS0FBbkIsRUFBa0MrQixJQUFsQyxFQUFtRDtBQUNoRSxVQUFNNUMsV0FBVyxHQUFHLE1BQUswRixzQkFBTCxDQUE0QjdFLEtBQTVCLENBQXBCOztBQURnRSx5QkFFWixNQUFLbUIsS0FGTztBQUFBLFVBRXhEcEMsWUFGd0QsZ0JBRXhEQSxZQUZ3RDtBQUFBLFVBRTFDSixZQUYwQyxnQkFFMUNBLFlBRjBDO0FBQUEsVUFFNUJELFdBRjRCLGdCQUU1QkEsV0FGNEI7O0FBR2hFLFVBQU0wQyxLQUFLLEdBQUcsTUFBS0MsYUFBTCxDQUFtQjFDLFlBQW5CLEVBQWlDO0FBQUVvQyxRQUFBQSxPQUFPLEVBQVBBLE9BQUY7QUFBV2YsUUFBQUEsS0FBSyxFQUFMQSxLQUFYO0FBQWtCWixRQUFBQSxLQUFLLEVBQUVEO0FBQXpCLE9BQWpDLENBQWQ7O0FBQ0EsVUFBTW9DLEtBQUssR0FBRyxNQUFLRixhQUFMLENBQW1CdEMsWUFBbkIsRUFBaUM7QUFBRWdDLFFBQUFBLE9BQU8sRUFBUEEsT0FBRjtBQUFXZixRQUFBQSxLQUFLLEVBQUxBLEtBQVg7QUFBa0JaLFFBQUFBLEtBQUssRUFBRUQ7QUFBekIsT0FBakMsQ0FBZDs7QUFFQSxVQUFNc0MsT0FBTyxxQkFBY3pCLEtBQWQsQ0FBYjs7QUFDQSxVQUFJb0IsS0FBSyxLQUFLLE1BQWQsRUFBc0I7QUFDcEIsZUFDRTtBQUFHLFVBQUEsR0FBRyxFQUFFSyxPQUFSO0FBQWlCLFVBQUEsU0FBUyxzQkFBZU0sSUFBSSxDQUFDLENBQUQsQ0FBSixDQUFRLENBQVIsQ0FBZixlQUE4QkEsSUFBSSxDQUFDLENBQUQsQ0FBSixDQUFRLENBQVIsQ0FBOUI7QUFBMUIsV0FDRTtBQUNFLHVCQUFXM0Isd0JBQWFPLE9BRDFCO0FBRUUsZ0NBQW9CWCxLQUZ0QjtBQUdFLFVBQUEsR0FBRyxZQUFLeUIsT0FBTCxZQUhMO0FBSUUsVUFBQSxLQUFLLG9CQUNBRixLQURBO0FBRUhPLFlBQUFBLEtBQUssRUFBRXBELFdBRko7QUFHSG1ELFlBQUFBLE1BQU0sRUFBRW5ELFdBSEw7QUFJSGlELFlBQUFBLElBQUksRUFBRSxNQUpIO0FBS0hDLFlBQUFBLFdBQVcsRUFBRTtBQUxWO0FBSlAsVUFERixFQWFFO0FBQ0UsdUJBQVd4Qix3QkFBYU8sT0FEMUI7QUFFRSxnQ0FBb0JYLEtBRnRCO0FBR0UsVUFBQSxHQUFHLEVBQUV5QixPQUhQO0FBSUUsVUFBQSxLQUFLLEVBQUVGO0FBSlQsVUFiRixDQURGO0FBc0JEOztBQUVELGFBQ0U7QUFBRyxRQUFBLEdBQUcsb0JBQWF2QixLQUFiLENBQU47QUFBNEIsUUFBQSxTQUFTLHNCQUFlK0IsSUFBSSxDQUFDLENBQUQsQ0FBSixDQUFRLENBQVIsQ0FBZixlQUE4QkEsSUFBSSxDQUFDLENBQUQsQ0FBSixDQUFRLENBQVIsQ0FBOUI7QUFBckMsU0FDRTtBQUNFLHFCQUFXM0Isd0JBQWFPLE9BRDFCO0FBRUUsOEJBQW9CWCxLQUZ0QjtBQUdFLFFBQUEsR0FBRyxZQUFLeUIsT0FBTCxZQUhMO0FBSUUsUUFBQSxLQUFLLG9CQUNBRixLQURBO0FBRUhnQixVQUFBQSxPQUFPLEVBQUU7QUFGTixVQUpQO0FBUUUsUUFBQSxFQUFFLEVBQUUsQ0FSTjtBQVNFLFFBQUEsRUFBRSxFQUFFLENBVE47QUFVRSxRQUFBLENBQUMsRUFBRTdEO0FBVkwsUUFERixFQWFFO0FBQ0UscUJBQVcwQix3QkFBYU8sT0FEMUI7QUFFRSw4QkFBb0JYLEtBRnRCO0FBR0UsUUFBQSxHQUFHLEVBQUV5QixPQUhQO0FBSUUsUUFBQSxLQUFLLEVBQUVGLEtBSlQ7QUFLRSxRQUFBLEVBQUUsRUFBRSxDQUxOO0FBTUUsUUFBQSxFQUFFLEVBQUU7QUFOTixRQWJGLENBREY7QUF3QkQsSzs7a0VBRWEsVUFBQ1IsT0FBRCxFQUFtQmYsS0FBbkIsRUFBa0MrQixJQUFsQyxFQUFtRDtBQUFBLHlCQUN6QixNQUFLWixLQURvQjtBQUFBLFVBQ3ZEcEMsWUFEdUQsZ0JBQ3ZEQSxZQUR1RDtBQUFBLFVBQ3pDTCxXQUR5QyxnQkFDekNBLFdBRHlDOztBQUUvRCxVQUFNK0Isb0JBQW9CLEdBQUcsTUFBS0Msd0JBQUwsRUFBN0I7O0FBQ0EsVUFBTW9FLFFBQVEsR0FBRzlFLEtBQUssS0FBS1Msb0JBQTNCOztBQUNBLFVBQU10QixXQUFXLEdBQUcsTUFBSzBGLHNCQUFMLENBQTRCN0UsS0FBNUIsQ0FBcEI7O0FBQ0EsVUFBTXVCLEtBQUssR0FBRyxNQUFLRixhQUFMLENBQW1CdEMsWUFBbkIsRUFBaUM7QUFBRWdDLFFBQUFBLE9BQU8sRUFBUEEsT0FBRjtBQUFXZixRQUFBQSxLQUFLLEVBQUxBLEtBQVg7QUFBa0JaLFFBQUFBLEtBQUssRUFBRUQ7QUFBekIsT0FBakMsQ0FBZDs7QUFFQSxVQUFNc0MsT0FBTyxxQkFBY3pCLEtBQWQsQ0FBYjs7QUFDQSxVQUFJOEUsUUFBSixFQUFjO0FBQ1osZUFDRTtBQUFHLFVBQUEsR0FBRyxFQUFFckQ7QUFBUixXQUFrQixNQUFLcUMsZUFBTCxDQUFxQjlELEtBQXJCLEVBQTRCZSxPQUFPLENBQUNpQyxRQUFSLENBQWlCaEMsV0FBN0MsRUFBMERPLEtBQTFELENBQWxCLENBREY7QUFHRCxPQVo4RCxDQWMvRDs7O0FBQ0EsYUFDRTtBQUFHLFFBQUEsR0FBRyxFQUFFRTtBQUFSLFNBQ0U7QUFDRSxxQkFBV3JCLHdCQUFhTyxPQUQxQjtBQUVFLDhCQUFvQlgsS0FGdEI7QUFHRSxRQUFBLEdBQUcsWUFBS3lCLE9BQUwsWUFITDtBQUlFLFFBQUEsS0FBSyxvQkFDQUYsS0FEQTtBQUVIZSxVQUFBQSxXQUFXLEVBQUU1RCxXQUZWO0FBR0g2RCxVQUFBQSxPQUFPLEVBQUU7QUFITixVQUpQO0FBU0UsUUFBQSxDQUFDLEVBQUVSO0FBVEwsUUFERixFQVlFO0FBQ0UscUJBQVczQix3QkFBYU8sT0FEMUI7QUFFRSw4QkFBb0JYLEtBRnRCO0FBR0UsUUFBQSxHQUFHLEVBQUV5QixPQUhQO0FBSUUsUUFBQSxLQUFLLEVBQUVGLEtBSlQ7QUFLRSxRQUFBLENBQUMsRUFBRVE7QUFMTCxRQVpGLENBREY7QUFzQkQsSzs7cUVBRWdCLFVBQUNoQixPQUFELEVBQW1CZixLQUFuQixFQUFrQytCLElBQWxDLEVBQW1EO0FBQUEsVUFDMURoRCxZQUQwRCxHQUN6QyxNQUFLb0MsS0FEb0MsQ0FDMURwQyxZQUQwRDs7QUFFbEUsVUFBTTBCLG9CQUFvQixHQUFHLE1BQUtDLHdCQUFMLEVBQTdCOztBQUNBLFVBQU1vRSxRQUFRLEdBQUc5RSxLQUFLLEtBQUtTLG9CQUEzQjs7QUFFQSxVQUFNdEIsV0FBVyxHQUFHLE1BQUswRixzQkFBTCxDQUE0QjdFLEtBQTVCLENBQXBCOztBQUNBLFVBQU11QixLQUFLLEdBQUcsTUFBS0YsYUFBTCxDQUFtQnRDLFlBQW5CLEVBQWlDO0FBQUVnQyxRQUFBQSxPQUFPLEVBQVBBLE9BQUY7QUFBV2YsUUFBQUEsS0FBSyxFQUFMQSxLQUFYO0FBQWtCWixRQUFBQSxLQUFLLEVBQUVEO0FBQXpCLE9BQWpDLENBQWQ7O0FBRUEsVUFBTXNDLE9BQU8scUJBQWN6QixLQUFkLENBQWI7O0FBQ0EsVUFBSThFLFFBQUosRUFBYztBQUNaLFlBQU05RCxXQUFXLEdBQUcsa0NBQXNCRCxPQUF0QixDQUFwQjs7QUFDQSxZQUFJLENBQUNDLFdBQUwsRUFBa0I7QUFDaEIsaUJBQU8sSUFBUDtBQUNEOztBQUNELGVBQ0U7QUFBRyxVQUFBLEdBQUcsRUFBRVM7QUFBUixXQUNHLE1BQUtnQyxXQUFMLENBQWlCekQsS0FBakIsRUFBd0JnQixXQUF4QixFQUFxQ08sS0FBckMsQ0FESCxFQUVHLE1BQUt1QyxlQUFMLENBQXFCOUQsS0FBckIsRUFBNEJnQixXQUE1QixFQUF5Q08sS0FBekMsQ0FGSCxDQURGO0FBTUQ7O0FBRUQsYUFDRTtBQUNFLHFCQUFXbkIsd0JBQWFPLE9BRDFCO0FBRUUsOEJBQW9CWCxLQUZ0QjtBQUdFLFFBQUEsR0FBRyxFQUFFeUIsT0FIUDtBQUlFLFFBQUEsS0FBSyxFQUFFRixLQUpUO0FBS0UsUUFBQSxDQUFDLEVBQUVRO0FBTEwsUUFERjtBQVNELEs7O3FFQUVnQixVQUFDaEIsT0FBRCxFQUFtQmYsS0FBbkIsRUFBcUM7QUFDcEQsVUFBTWdCLFdBQVcsR0FBRyxrQ0FBc0JELE9BQXRCLENBQXBCOztBQUNBLFVBQUksQ0FBQ0MsV0FBRCxJQUFnQixDQUFDQSxXQUFXLENBQUMwQixNQUFqQyxFQUF5QztBQUN2QyxlQUFPLElBQVA7QUFDRDs7QUFKbUQsVUFPcENPLFVBUG9DLEdBU2hEbEMsT0FUZ0QsQ0FPbER2QixVQVBrRCxDQU9wQ3lELFVBUG9DO0FBQUEsVUFRdEM5QyxJQVJzQyxHQVNoRFksT0FUZ0QsQ0FRbERpQyxRQVJrRCxDQVF0QzdDLElBUnNDOztBQVVwRCxVQUFNNEIsSUFBSSxHQUFHLE1BQUtDLHNCQUFMLENBQTRCaEIsV0FBNUIsRUFBeUNiLElBQXpDLENBQWI7O0FBQ0EsVUFBSSxDQUFDNEIsSUFBTCxFQUFXO0FBQ1QsZUFBTyxJQUFQO0FBQ0Q7O0FBRUQsY0FBUWtCLFVBQVI7QUFDRSxhQUFLUyx1QkFBWXFCLEtBQWpCO0FBQ0UsaUJBQU8sTUFBS0MsWUFBTCxDQUFrQmpFLE9BQWxCLEVBQTJCZixLQUEzQixFQUFrQytCLElBQWxDLENBQVA7O0FBQ0YsYUFBSzJCLHVCQUFZeEIsV0FBakI7QUFDRSxpQkFBTyxNQUFLK0MsV0FBTCxDQUFpQmxFLE9BQWpCLEVBQTBCZixLQUExQixFQUFpQytCLElBQWpDLENBQVA7O0FBRUYsYUFBSzJCLHVCQUFZYixPQUFqQjtBQUNBLGFBQUthLHVCQUFZTyxTQUFqQjtBQUNBLGFBQUtQLHVCQUFZQyxNQUFqQjtBQUNFLGlCQUFPLE1BQUt1QixjQUFMLENBQW9CbkUsT0FBcEIsRUFBNkJmLEtBQTdCLEVBQW9DK0IsSUFBcEMsQ0FBUDs7QUFFRjtBQUNFLGlCQUFPLElBQVA7QUFaSjtBQWNELEs7O29FQUVlLFlBQU07QUFDcEIsVUFBTXVDLFFBQVEsR0FBRyxNQUFLQyxXQUFMLEVBQWpCOztBQUNBLFVBQU1ZLE1BQU0sR0FBRyxNQUFLQyxZQUFMLElBQXFCLE1BQUtBLFlBQUwsQ0FBa0JDLFNBQWxCLENBQTRCLE1BQUtDLFlBQUwsRUFBNUIsQ0FBcEM7O0FBRUEsYUFDRTtBQUFLLFFBQUEsR0FBRyxFQUFDLGFBQVQ7QUFBdUIsUUFBQSxLQUFLLEVBQUMsTUFBN0I7QUFBb0MsUUFBQSxNQUFNLEVBQUM7QUFBM0MsU0FDR2hCLFFBQVEsSUFDUEEsUUFBUSxDQUFDNUIsTUFBVCxHQUFrQixDQURuQixJQUN3QjtBQUFHLFFBQUEsR0FBRyxFQUFDO0FBQVAsU0FBd0I0QixRQUFRLENBQUNLLEdBQVQsQ0FBYSxNQUFLWSxjQUFsQixDQUF4QixDQUYzQixFQUdHSixNQUFNLElBQUk7QUFBRyxRQUFBLEdBQUcsRUFBQztBQUFQLFNBQXlCLE1BQUtLLGFBQUwsQ0FBbUJMLE1BQW5CLENBQXpCLENBSGIsQ0FERjtBQU9ELEs7O29FQUVlLFlBQU07QUFDcEIsVUFBTU0sUUFBUSxHQUFJLE1BQUtDLFFBQUwsSUFBaUIsTUFBS0EsUUFBTCxDQUFjRCxRQUFoQyxJQUE2QyxFQUE5RDtBQURvQixVQUVabEUsS0FGWSxHQUVGLE1BQUtKLEtBRkgsQ0FFWkksS0FGWTtBQUFBLFVBR1pPLEtBSFksR0FHTTJELFFBSE4sQ0FHWjNELEtBSFk7QUFBQSxVQUdMRCxNQUhLLEdBR000RCxRQUhOLENBR0w1RCxNQUhLO0FBS3BCLGFBQ0U7QUFDRSxRQUFBLEVBQUUsRUFBQyxRQURMO0FBRUUsUUFBQSxLQUFLO0FBQ0hDLFVBQUFBLEtBQUssRUFBTEEsS0FERztBQUVIRCxVQUFBQSxNQUFNLEVBQU5BO0FBRkcsV0FHQU4sS0FIQSxDQUZQO0FBT0UsUUFBQSxHQUFHLEVBQUUsYUFBQW9FLENBQUMsRUFBSTtBQUNSLGdCQUFLQyxhQUFMLEdBQXFCRCxDQUFyQjtBQUNEO0FBVEgsU0FXRyxNQUFLRSxhQUFMLEVBWEgsQ0FERjtBQWVELEs7Ozs7Ozs7O0FBcmhCRDsyQ0FDdUI3RSxXLEVBQWtCYixJLEVBQW1CO0FBQUE7O0FBQzFELFVBQUlhLFdBQVcsQ0FBQzBCLE1BQVosS0FBdUIsQ0FBM0IsRUFBOEI7QUFDNUIsZUFBTyxFQUFQO0FBQ0Q7O0FBRUQsVUFBTW9ELFlBQVksR0FBRzlFLFdBQVcsQ0FBQzJELEdBQVosQ0FBZ0IsVUFBQTFELENBQUM7QUFBQSxlQUFJLE1BQUksQ0FBQ0MsT0FBTCxDQUFhRCxDQUFiLENBQUo7QUFBQSxPQUFqQixDQUFyQjtBQUVBLFVBQUk4RSxVQUFVLEdBQUcsRUFBakI7O0FBQ0EsY0FBUTVGLElBQVI7QUFDRSxhQUFLOEIsd0JBQWE4QyxLQUFsQjtBQUNFLGlCQUFPZSxZQUFQOztBQUVGLGFBQUs3RCx3QkFBYUMsV0FBbEI7QUFDRTZELFVBQUFBLFVBQVUsR0FBR0QsWUFBWSxDQUFDbkIsR0FBYixDQUFpQixVQUFBMUQsQ0FBQztBQUFBLDZCQUFPQSxDQUFDLENBQUMsQ0FBRCxDQUFSLGNBQWVBLENBQUMsQ0FBQyxDQUFELENBQWhCO0FBQUEsV0FBbEIsRUFBeUMrRSxJQUF6QyxDQUE4QyxHQUE5QyxDQUFiO0FBQ0EsNkJBQVlELFVBQVo7O0FBRUYsYUFBSzlELHdCQUFhWSxPQUFsQjtBQUNBLGFBQUtaLHdCQUFhMEIsTUFBbEI7QUFDRW9DLFVBQUFBLFVBQVUsR0FBR0QsWUFBWSxDQUFDbkIsR0FBYixDQUFpQixVQUFBMUQsQ0FBQztBQUFBLDZCQUFPQSxDQUFDLENBQUMsQ0FBRCxDQUFSLGNBQWVBLENBQUMsQ0FBQyxDQUFELENBQWhCO0FBQUEsV0FBbEIsRUFBeUMrRSxJQUF6QyxDQUE4QyxHQUE5QyxDQUFiO0FBQ0EsNkJBQVlELFVBQVo7O0FBRUY7QUFDRSxpQkFBTyxJQUFQO0FBZEo7QUFnQkQ7Ozs2QkE4ZlE7QUFDUCxnRkFBb0IsS0FBS0UsYUFBTCxFQUFwQjtBQUNEOzs7O0VBNWhCaUN4SCx1Qjs7OztnQkFBZlEsTSxrQkFDR1QsWSIsInNvdXJjZXNDb250ZW50IjpbIi8vIEBmbG93XG5cbmltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5cbmltcG9ydCB0eXBlIHsgRmVhdHVyZSB9IGZyb20gJ0BuZWJ1bGEuZ2wvZWRpdC1tb2Rlcyc7XG5pbXBvcnQgdHlwZSB7IEdlb0pzb25UeXBlLCBSZW5kZXJTdGF0ZSwgSWQgfSBmcm9tICcuL3R5cGVzJztcblxuaW1wb3J0IHsgUkVOREVSX1NUQVRFLCBSRU5ERVJfVFlQRSwgR0VPSlNPTl9UWVBFLCBHVUlERV9UWVBFLCBFTEVNRU5UX1RZUEUgfSBmcm9tICcuL2NvbnN0YW50cyc7XG5pbXBvcnQgTW9kZUhhbmRsZXIgZnJvbSAnLi9tb2RlLWhhbmRsZXInO1xuaW1wb3J0IHsgZ2V0RmVhdHVyZUNvb3JkaW5hdGVzIH0gZnJvbSAnLi9lZGl0LW1vZGVzL3V0aWxzJztcblxuaW1wb3J0IHtcbiAgZWRpdEhhbmRsZVN0eWxlIGFzIGRlZmF1bHRFZGl0SGFuZGxlU3R5bGUsXG4gIGZlYXR1cmVTdHlsZSBhcyBkZWZhdWx0RmVhdHVyZVN0eWxlXG59IGZyb20gJy4vc3R5bGUnO1xuXG5jb25zdCBkZWZhdWx0UHJvcHMgPSB7XG4gIC4uLk1vZGVIYW5kbGVyLmRlZmF1bHRQcm9wcyxcbiAgY2xpY2tSYWRpdXM6IDAsXG4gIGZlYXR1cmVTaGFwZTogJ2NpcmNsZScsXG4gIGVkaXRIYW5kbGVTaGFwZTogJ3JlY3QnLFxuICBlZGl0SGFuZGxlU3R5bGU6IGRlZmF1bHRFZGl0SGFuZGxlU3R5bGUsXG4gIGZlYXR1cmVTdHlsZTogZGVmYXVsdEZlYXR1cmVTdHlsZVxufTtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRWRpdG9yIGV4dGVuZHMgTW9kZUhhbmRsZXIge1xuICBzdGF0aWMgZGVmYXVsdFByb3BzID0gZGVmYXVsdFByb3BzO1xuXG4gIC8qIEhFTFBFUlMgKi9cbiAgX2dldFBhdGhJblNjcmVlbkNvb3Jkcyhjb29yZGluYXRlczogYW55LCB0eXBlOiBHZW9Kc29uVHlwZSkge1xuICAgIGlmIChjb29yZGluYXRlcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiAnJztcbiAgICB9XG5cbiAgICBjb25zdCBzY3JlZW5Db29yZHMgPSBjb29yZGluYXRlcy5tYXAocCA9PiB0aGlzLnByb2plY3QocCkpO1xuXG4gICAgbGV0IHBhdGhTdHJpbmcgPSAnJztcbiAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgIGNhc2UgR0VPSlNPTl9UWVBFLlBPSU5UOlxuICAgICAgICByZXR1cm4gc2NyZWVuQ29vcmRzO1xuXG4gICAgICBjYXNlIEdFT0pTT05fVFlQRS5MSU5FX1NUUklORzpcbiAgICAgICAgcGF0aFN0cmluZyA9IHNjcmVlbkNvb3Jkcy5tYXAocCA9PiBgJHtwWzBdfSwke3BbMV19YCkuam9pbignTCcpO1xuICAgICAgICByZXR1cm4gYE0gJHtwYXRoU3RyaW5nfWA7XG5cbiAgICAgIGNhc2UgR0VPSlNPTl9UWVBFLlBPTFlHT046XG4gICAgICBjYXNlIEdFT0pTT05fVFlQRS5DSVJDTEU6XG4gICAgICAgIHBhdGhTdHJpbmcgPSBzY3JlZW5Db29yZHMubWFwKHAgPT4gYCR7cFswXX0sJHtwWzFdfWApLmpvaW4oJ0wnKTtcbiAgICAgICAgcmV0dXJuIGBNICR7cGF0aFN0cmluZ30gemA7XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuXG4gIF9nZXRFZGl0SGFuZGxlU3RhdGUgPSAoZWRpdEhhbmRsZTogRmVhdHVyZSwgcmVuZGVyU3RhdGU6ID9zdHJpbmcpID0+IHtcbiAgICBjb25zdCB7IHBvaW50ZXJEb3duUGlja3MsIGhvdmVyZWQgfSA9IHRoaXMuc3RhdGU7XG5cbiAgICBpZiAocmVuZGVyU3RhdGUpIHtcbiAgICAgIHJldHVybiByZW5kZXJTdGF0ZTtcbiAgICB9XG5cbiAgICBjb25zdCBlZGl0SGFuZGxlSW5kZXggPSBlZGl0SGFuZGxlLnByb3BlcnRpZXMucG9zaXRpb25JbmRleGVzWzBdO1xuICAgIGxldCBkcmFnZ2luZ0VkaXRIYW5kbGVJbmRleCA9IG51bGw7XG4gICAgY29uc3QgcGlja2VkT2JqZWN0ID0gcG9pbnRlckRvd25QaWNrcyAmJiBwb2ludGVyRG93blBpY2tzWzBdICYmIHBvaW50ZXJEb3duUGlja3NbMF0ub2JqZWN0O1xuICAgIGlmIChwaWNrZWRPYmplY3QgJiYgcGlja2VkT2JqZWN0Lmd1aWRlVHlwZSA9PT0gR1VJREVfVFlQRS5FRElUX0hBTkRMRSkge1xuICAgICAgZHJhZ2dpbmdFZGl0SGFuZGxlSW5kZXggPSBwaWNrZWRPYmplY3QuaW5kZXg7XG4gICAgfVxuXG4gICAgaWYgKGVkaXRIYW5kbGVJbmRleCA9PT0gZHJhZ2dpbmdFZGl0SGFuZGxlSW5kZXgpIHtcbiAgICAgIHJldHVybiBSRU5ERVJfU1RBVEUuU0VMRUNURUQ7XG4gICAgfVxuXG4gICAgaWYgKGhvdmVyZWQgJiYgaG92ZXJlZC50eXBlID09PSBFTEVNRU5UX1RZUEUuRURJVF9IQU5ETEUpIHtcbiAgICAgIGlmIChob3ZlcmVkLmluZGV4ID09PSBlZGl0SGFuZGxlSW5kZXgpIHtcbiAgICAgICAgcmV0dXJuIFJFTkRFUl9TVEFURS5IT1ZFUkVEO1xuICAgICAgfVxuXG4gICAgICAvLyBjdXJzb3IgaG92ZXJlZCBvbiBmaXJzdCB2ZXJ0ZXggd2hlbiBkcmF3aW5nIHBvbHlnb25cbiAgICAgIGlmIChcbiAgICAgICAgaG92ZXJlZC5pbmRleCA9PT0gMCAmJlxuICAgICAgICBlZGl0SGFuZGxlLnByb3BlcnRpZXMuZ3VpZGVUeXBlID09PSBHVUlERV9UWVBFLkNVUlNPUl9FRElUX0hBTkRMRVxuICAgICAgKSB7XG4gICAgICAgIHJldHVybiBSRU5ERVJfU1RBVEUuQ0xPU0lORztcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gUkVOREVSX1NUQVRFLklOQUNUSVZFO1xuICB9O1xuXG4gIF9nZXRGZWF0dXJlUmVuZGVyU3RhdGUgPSAoaW5kZXg6IG51bWJlciwgcmVuZGVyU3RhdGU6ID9SZW5kZXJTdGF0ZSkgPT4ge1xuICAgIGNvbnN0IHsgaG92ZXJlZCB9ID0gdGhpcy5zdGF0ZTtcbiAgICBjb25zdCBzZWxlY3RlZEZlYXR1cmVJbmRleCA9IHRoaXMuX2dldFNlbGVjdGVkRmVhdHVyZUluZGV4KCk7XG4gICAgaWYgKHJlbmRlclN0YXRlKSB7XG4gICAgICByZXR1cm4gcmVuZGVyU3RhdGU7XG4gICAgfVxuXG4gICAgaWYgKGluZGV4ID09PSBzZWxlY3RlZEZlYXR1cmVJbmRleCkge1xuICAgICAgcmV0dXJuIFJFTkRFUl9TVEFURS5TRUxFQ1RFRDtcbiAgICB9XG5cbiAgICBpZiAoaG92ZXJlZCAmJiBob3ZlcmVkLnR5cGUgPT09IEVMRU1FTlRfVFlQRS5GRUFUVVJFICYmIGhvdmVyZWQuZmVhdHVyZUluZGV4ID09PSBpbmRleCkge1xuICAgICAgcmV0dXJuIFJFTkRFUl9TVEFURS5IT1ZFUkVEO1xuICAgIH1cblxuICAgIHJldHVybiBSRU5ERVJfU1RBVEUuSU5BQ1RJVkU7XG4gIH07XG5cbiAgX2dldFN0eWxlUHJvcCA9IChzdHlsZVByb3A6IGFueSwgcGFyYW1zOiBhbnkpID0+IHtcbiAgICByZXR1cm4gdHlwZW9mIHN0eWxlUHJvcCA9PT0gJ2Z1bmN0aW9uJyA/IHN0eWxlUHJvcChwYXJhbXMpIDogc3R5bGVQcm9wO1xuICB9O1xuXG4gIC8qIFJFTkRFUiAqL1xuICAvKiBlc2xpbnQtZGlzYWJsZSBtYXgtcGFyYW1zICovXG4gIF9yZW5kZXJFZGl0SGFuZGxlID0gKGVkaXRIYW5kbGU6IEZlYXR1cmUsIGZlYXR1cmU6IEZlYXR1cmUpID0+IHtcbiAgICAvKiBlc2xpbnQtZW5hYmxlIG1heC1wYXJhbXMgKi9cbiAgICBjb25zdCBjb29yZGluYXRlcyA9IGdldEZlYXR1cmVDb29yZGluYXRlcyhlZGl0SGFuZGxlKTtcbiAgICBjb25zdCBwID0gdGhpcy5wcm9qZWN0KGNvb3JkaW5hdGVzICYmIGNvb3JkaW5hdGVzWzBdKTtcbiAgICBpZiAoIXApIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGNvbnN0IHtcbiAgICAgIHByb3BlcnRpZXM6IHsgZmVhdHVyZUluZGV4LCBwb3NpdGlvbkluZGV4ZXMgfVxuICAgIH0gPSBlZGl0SGFuZGxlO1xuICAgIGNvbnN0IHsgY2xpY2tSYWRpdXMsIGVkaXRIYW5kbGVTaGFwZSwgZWRpdEhhbmRsZVN0eWxlIH0gPSB0aGlzLnByb3BzO1xuXG4gICAgY29uc3QgaW5kZXggPSBwb3NpdGlvbkluZGV4ZXNbMF07XG5cbiAgICBjb25zdCBzaGFwZSA9IHRoaXMuX2dldFN0eWxlUHJvcChlZGl0SGFuZGxlU2hhcGUsIHtcbiAgICAgIGZlYXR1cmU6IGZlYXR1cmUgfHwgZWRpdEhhbmRsZSxcbiAgICAgIGluZGV4LFxuICAgICAgZmVhdHVyZUluZGV4LFxuICAgICAgc3RhdGU6IHRoaXMuX2dldEVkaXRIYW5kbGVTdGF0ZShlZGl0SGFuZGxlKVxuICAgIH0pO1xuXG4gICAgbGV0IHN0eWxlID0gdGhpcy5fZ2V0U3R5bGVQcm9wKGVkaXRIYW5kbGVTdHlsZSwge1xuICAgICAgZmVhdHVyZTogZmVhdHVyZSB8fCBlZGl0SGFuZGxlLFxuICAgICAgaW5kZXgsXG4gICAgICBmZWF0dXJlSW5kZXgsXG4gICAgICBzaGFwZSxcbiAgICAgIHN0YXRlOiB0aGlzLl9nZXRFZGl0SGFuZGxlU3RhdGUoZWRpdEhhbmRsZSlcbiAgICB9KTtcblxuICAgIC8vIGRpc2FibGUgZXZlbnRzIGZvciBjdXJzb3IgZWRpdEhhbmRsZVxuICAgIGlmIChlZGl0SGFuZGxlLnByb3BlcnRpZXMuZ3VpZGVUeXBlID09PSBHVUlERV9UWVBFLkNVUlNPUl9FRElUX0hBTkRMRSkge1xuICAgICAgc3R5bGUgPSB7XG4gICAgICAgIC4uLnN0eWxlLFxuICAgICAgICAvLyBkaXNhYmxlIHBvaW50ZXIgZXZlbnRzIGZvciBjdXJzb3JcbiAgICAgICAgcG9pbnRlckV2ZW50czogJ25vbmUnXG4gICAgICB9O1xuICAgIH1cblxuICAgIGNvbnN0IGVsZW1LZXkgPSBgJHtFTEVNRU5UX1RZUEUuRURJVF9IQU5ETEV9LiR7ZmVhdHVyZUluZGV4fS4ke2luZGV4fWA7XG4gICAgLy8gZmlyc3QgPGNpcmNsZXxyZWN0PiBpcyB0byBtYWtlIHBhdGggZWFzaWx5IGludGVyYWN0ZWQgd2l0aFxuICAgIHN3aXRjaCAoc2hhcGUpIHtcbiAgICAgIGNhc2UgJ2NpcmNsZSc6XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgPGcga2V5PXtlbGVtS2V5fSB0cmFuc2Zvcm09e2B0cmFuc2xhdGUoJHtwWzBdfSwgJHtwWzFdfSlgfT5cbiAgICAgICAgICAgIDxjaXJjbGVcbiAgICAgICAgICAgICAgZGF0YS10eXBlPXtFTEVNRU5UX1RZUEUuRURJVF9IQU5ETEV9XG4gICAgICAgICAgICAgIGRhdGEtaW5kZXg9e2luZGV4fVxuICAgICAgICAgICAgICBkYXRhLWZlYXR1cmUtaW5kZXg9e2ZlYXR1cmVJbmRleH1cbiAgICAgICAgICAgICAga2V5PXtgJHtlbGVtS2V5fS5oaWRkZW5gfVxuICAgICAgICAgICAgICBzdHlsZT17eyAuLi5zdHlsZSwgc3Ryb2tlOiAnbm9uZScsIGZpbGw6ICcjMDAwJywgZmlsbE9wYWNpdHk6IDAgfX1cbiAgICAgICAgICAgICAgY3g9ezB9XG4gICAgICAgICAgICAgIGN5PXswfVxuICAgICAgICAgICAgICByPXtjbGlja1JhZGl1c31cbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgICA8Y2lyY2xlXG4gICAgICAgICAgICAgIGRhdGEtdHlwZT17RUxFTUVOVF9UWVBFLkVESVRfSEFORExFfVxuICAgICAgICAgICAgICBkYXRhLWluZGV4PXtpbmRleH1cbiAgICAgICAgICAgICAgZGF0YS1mZWF0dXJlLWluZGV4PXtmZWF0dXJlSW5kZXh9XG4gICAgICAgICAgICAgIGtleT17ZWxlbUtleX1cbiAgICAgICAgICAgICAgc3R5bGU9e3N0eWxlfVxuICAgICAgICAgICAgICBjeD17MH1cbiAgICAgICAgICAgICAgY3k9ezB9XG4gICAgICAgICAgICAvPlxuICAgICAgICAgIDwvZz5cbiAgICAgICAgKTtcbiAgICAgIGNhc2UgJ3JlY3QnOlxuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgIDxnIGtleT17ZWxlbUtleX0gdHJhbnNmb3JtPXtgdHJhbnNsYXRlKCR7cFswXX0sICR7cFsxXX0pYH0+XG4gICAgICAgICAgICA8cmVjdFxuICAgICAgICAgICAgICBkYXRhLXR5cGU9e0VMRU1FTlRfVFlQRS5FRElUX0hBTkRMRX1cbiAgICAgICAgICAgICAgZGF0YS1pbmRleD17aW5kZXh9XG4gICAgICAgICAgICAgIGRhdGEtZmVhdHVyZS1pbmRleD17ZmVhdHVyZUluZGV4fVxuICAgICAgICAgICAgICBrZXk9e2Ake2VsZW1LZXl9LmhpZGRlbmB9XG4gICAgICAgICAgICAgIHN0eWxlPXt7XG4gICAgICAgICAgICAgICAgLi4uc3R5bGUsXG4gICAgICAgICAgICAgICAgaGVpZ2h0OiBjbGlja1JhZGl1cyxcbiAgICAgICAgICAgICAgICB3aWR0aDogY2xpY2tSYWRpdXMsXG4gICAgICAgICAgICAgICAgZmlsbDogJyMwMDAnLFxuICAgICAgICAgICAgICAgIGZpbGxPcGFjaXR5OiAwXG4gICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgIHI9e2NsaWNrUmFkaXVzfVxuICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIDxyZWN0XG4gICAgICAgICAgICAgIGRhdGEtdHlwZT17RUxFTUVOVF9UWVBFLkVESVRfSEFORExFfVxuICAgICAgICAgICAgICBkYXRhLWluZGV4PXtpbmRleH1cbiAgICAgICAgICAgICAgZGF0YS1mZWF0dXJlLWluZGV4PXtmZWF0dXJlSW5kZXh9XG4gICAgICAgICAgICAgIGtleT17YCR7ZWxlbUtleX1gfVxuICAgICAgICAgICAgICBzdHlsZT17c3R5bGV9XG4gICAgICAgICAgICAvPlxuICAgICAgICAgIDwvZz5cbiAgICAgICAgKTtcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9O1xuXG4gIF9yZW5kZXJTZWdtZW50ID0gKGZlYXR1cmVJbmRleDogSWQsIGluZGV4OiBudW1iZXIsIGNvb3JkaW5hdGVzOiBudW1iZXJbXSwgc3R5bGU6IE9iamVjdCkgPT4ge1xuICAgIGNvbnN0IHBhdGggPSB0aGlzLl9nZXRQYXRoSW5TY3JlZW5Db29yZHMoY29vcmRpbmF0ZXMsIEdFT0pTT05fVFlQRS5MSU5FX1NUUklORyk7XG4gICAgY29uc3QgeyByYWRpdXMsIC4uLm90aGVycyB9ID0gc3R5bGU7XG4gICAgY29uc3QgeyBjbGlja1JhZGl1cyB9ID0gdGhpcy5wcm9wcztcblxuICAgIGNvbnN0IGVsZW1LZXkgPSBgJHtFTEVNRU5UX1RZUEUuU0VHTUVOVH0uJHtmZWF0dXJlSW5kZXh9LiR7aW5kZXh9YDtcbiAgICByZXR1cm4gKFxuICAgICAgPGcga2V5PXtlbGVtS2V5fT5cbiAgICAgICAgPHBhdGhcbiAgICAgICAgICBrZXk9e2Ake2VsZW1LZXl9LmhpZGRlbmB9XG4gICAgICAgICAgZGF0YS10eXBlPXtFTEVNRU5UX1RZUEUuU0VHTUVOVH1cbiAgICAgICAgICBkYXRhLWluZGV4PXtpbmRleH1cbiAgICAgICAgICBkYXRhLWZlYXR1cmUtaW5kZXg9e2ZlYXR1cmVJbmRleH1cbiAgICAgICAgICBzdHlsZT17e1xuICAgICAgICAgICAgLi4ub3RoZXJzLFxuICAgICAgICAgICAgc3Ryb2tlV2lkdGg6IGNsaWNrUmFkaXVzIHx8IHJhZGl1cyxcbiAgICAgICAgICAgIG9wYWNpdHk6IDBcbiAgICAgICAgICB9fVxuICAgICAgICAgIGQ9e3BhdGh9XG4gICAgICAgIC8+XG4gICAgICAgIDxwYXRoXG4gICAgICAgICAga2V5PXtlbGVtS2V5fVxuICAgICAgICAgIGRhdGEtdHlwZT17RUxFTUVOVF9UWVBFLlNFR01FTlR9XG4gICAgICAgICAgZGF0YS1pbmRleD17aW5kZXh9XG4gICAgICAgICAgZGF0YS1mZWF0dXJlLWluZGV4PXtmZWF0dXJlSW5kZXh9XG4gICAgICAgICAgc3R5bGU9e290aGVyc31cbiAgICAgICAgICBkPXtwYXRofVxuICAgICAgICAvPlxuICAgICAgPC9nPlxuICAgICk7XG4gIH07XG5cbiAgX3JlbmRlclNlZ21lbnRzID0gKGZlYXR1cmVJbmRleDogSWQsIGNvb3JkaW5hdGVzOiBudW1iZXJbXSwgc3R5bGU6IE9iamVjdCkgPT4ge1xuICAgIGNvbnN0IHNlZ21lbnRzID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb29yZGluYXRlcy5sZW5ndGggLSAxOyBpKyspIHtcbiAgICAgIHNlZ21lbnRzLnB1c2goXG4gICAgICAgIHRoaXMuX3JlbmRlclNlZ21lbnQoZmVhdHVyZUluZGV4LCBpLCBbY29vcmRpbmF0ZXNbaV0sIGNvb3JkaW5hdGVzW2kgKyAxXV0sIHN0eWxlKVxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIHNlZ21lbnRzO1xuICB9O1xuXG4gIF9yZW5kZXJGaWxsID0gKGZlYXR1cmVJbmRleDogSWQsIGNvb3JkaW5hdGVzOiBudW1iZXJbXSwgc3R5bGU6IE9iamVjdCkgPT4ge1xuICAgIGNvbnN0IHBhdGggPSB0aGlzLl9nZXRQYXRoSW5TY3JlZW5Db29yZHMoY29vcmRpbmF0ZXMsIEdFT0pTT05fVFlQRS5QT0xZR09OKTtcbiAgICByZXR1cm4gKFxuICAgICAgPHBhdGhcbiAgICAgICAga2V5PXtgJHtFTEVNRU5UX1RZUEUuRklMTH0uJHtmZWF0dXJlSW5kZXh9YH1cbiAgICAgICAgZGF0YS10eXBlPXtFTEVNRU5UX1RZUEUuRklMTH1cbiAgICAgICAgZGF0YS1mZWF0dXJlLWluZGV4PXtmZWF0dXJlSW5kZXh9XG4gICAgICAgIHN0eWxlPXt7IC4uLnN0eWxlLCBzdHJva2U6ICdub25lJyB9fVxuICAgICAgICBkPXtwYXRofVxuICAgICAgLz5cbiAgICApO1xuICB9O1xuXG4gIF9yZW5kZXJUZW50YXRpdmVGZWF0dXJlID0gKGZlYXR1cmU6IEZlYXR1cmUsIGN1cnNvckVkaXRIYW5kbGU6IEZlYXR1cmUpID0+IHtcbiAgICBjb25zdCB7IGZlYXR1cmVTdHlsZSB9ID0gdGhpcy5wcm9wcztcbiAgICBjb25zdCB7XG4gICAgICBnZW9tZXRyeTogeyBjb29yZGluYXRlcyB9LFxuICAgICAgcHJvcGVydGllczogeyByZW5kZXJUeXBlIH1cbiAgICB9ID0gZmVhdHVyZTtcblxuICAgIGlmICghY29vcmRpbmF0ZXMgfHwgY29vcmRpbmF0ZXMubGVuZ3RoIDwgMikge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgLy8gPj0gMiBjb29yZGluYXRlc1xuICAgIGNvbnN0IGZpcnN0Q29vcmRzID0gY29vcmRpbmF0ZXNbMF07XG4gICAgY29uc3QgbGFzdENvb3JkcyA9IGNvb3JkaW5hdGVzW2Nvb3JkaW5hdGVzLmxlbmd0aCAtIDFdO1xuICAgIGNvbnN0IHVuY29tbWl0dGVkU3R5bGUgPSB0aGlzLl9nZXRTdHlsZVByb3AoZmVhdHVyZVN0eWxlLCB7XG4gICAgICBmZWF0dXJlLFxuICAgICAgaW5kZXg6IG51bGwsXG4gICAgICBzdGF0ZTogUkVOREVSX1NUQVRFLlVOQ09NTUlUVEVEXG4gICAgfSk7XG5cbiAgICBsZXQgY29tbWl0dGVkUGF0aDtcbiAgICBsZXQgdW5jb21taXR0ZWRQYXRoO1xuICAgIGxldCBjbG9zaW5nUGF0aDtcbiAgICBjb25zdCBmaWxsID0gdGhpcy5fcmVuZGVyRmlsbCgndGVudGF0aXZlJywgY29vcmRpbmF0ZXMsIHVuY29tbWl0dGVkU3R5bGUpO1xuXG4gICAgc3dpdGNoIChyZW5kZXJUeXBlKSB7XG4gICAgICBjYXNlIFJFTkRFUl9UWVBFLkxJTkVfU1RSSU5HOlxuICAgICAgY2FzZSBSRU5ERVJfVFlQRS5QT0xZR09OOlxuICAgICAgY2FzZSBSRU5ERVJfVFlQRS5DSVJDTEU6XG4gICAgICAgIGNvbnN0IGNvbW1pdHRlZFN0eWxlID0gdGhpcy5fZ2V0U3R5bGVQcm9wKGZlYXR1cmVTdHlsZSwge1xuICAgICAgICAgIGZlYXR1cmUsXG4gICAgICAgICAgc3RhdGU6IFJFTkRFUl9TVEFURS5TRUxFQ1RFRFxuICAgICAgICB9KTtcblxuICAgICAgICBpZiAoY3Vyc29yRWRpdEhhbmRsZSkge1xuICAgICAgICAgIGNvbnN0IGN1cnNvckNvb3JkcyA9IGNvb3JkaW5hdGVzW2Nvb3JkaW5hdGVzLmxlbmd0aCAtIDJdO1xuICAgICAgICAgIGNvbW1pdHRlZFBhdGggPSB0aGlzLl9yZW5kZXJTZWdtZW50cyhcbiAgICAgICAgICAgICd0ZW50YXRpdmUnLFxuICAgICAgICAgICAgY29vcmRpbmF0ZXMuc2xpY2UoMCwgY29vcmRpbmF0ZXMubGVuZ3RoIC0gMSksXG4gICAgICAgICAgICBjb21taXR0ZWRTdHlsZVxuICAgICAgICAgICk7XG4gICAgICAgICAgdW5jb21taXR0ZWRQYXRoID0gdGhpcy5fcmVuZGVyU2VnbWVudChcbiAgICAgICAgICAgICd0ZW50YXRpdmUtdW5jb21taXR0ZWQnLFxuICAgICAgICAgICAgY29vcmRpbmF0ZXMubGVuZ3RoIC0gMixcbiAgICAgICAgICAgIFtjdXJzb3JDb29yZHMsIGxhc3RDb29yZHNdLFxuICAgICAgICAgICAgdW5jb21taXR0ZWRTdHlsZVxuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29tbWl0dGVkUGF0aCA9IHRoaXMuX3JlbmRlclNlZ21lbnRzKCd0ZW50YXRpdmUnLCBjb29yZGluYXRlcywgY29tbWl0dGVkU3R5bGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHJlbmRlclR5cGUgPT09IFJFTkRFUl9UWVBFLlBPTFlHT04pIHtcbiAgICAgICAgICBjb25zdCBjbG9zaW5nU3R5bGUgPSB0aGlzLl9nZXRTdHlsZVByb3AoZmVhdHVyZVN0eWxlLCB7XG4gICAgICAgICAgICBmZWF0dXJlLFxuICAgICAgICAgICAgaW5kZXg6IG51bGwsXG4gICAgICAgICAgICBzdGF0ZTogUkVOREVSX1NUQVRFLkNMT1NJTkdcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIGNsb3NpbmdQYXRoID0gdGhpcy5fcmVuZGVyU2VnbWVudChcbiAgICAgICAgICAgICd0ZW50YXRpdmUtY2xvc2luZycsXG4gICAgICAgICAgICBjb29yZGluYXRlcy5sZW5ndGggLSAxLFxuICAgICAgICAgICAgW2xhc3RDb29yZHMsIGZpcnN0Q29vcmRzXSxcbiAgICAgICAgICAgIGNsb3NpbmdTdHlsZVxuICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBSRU5ERVJfVFlQRS5SRUNUQU5HTEU6XG4gICAgICAgIHVuY29tbWl0dGVkUGF0aCA9IHRoaXMuX3JlbmRlclNlZ21lbnRzKFxuICAgICAgICAgICd0ZW50YXRpdmUnLFxuICAgICAgICAgIFsuLi5jb29yZGluYXRlcywgZmlyc3RDb29yZHNdLFxuICAgICAgICAgIHVuY29tbWl0dGVkU3R5bGVcbiAgICAgICAgKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgfVxuXG4gICAgcmV0dXJuIFtmaWxsLCBjb21taXR0ZWRQYXRoLCB1bmNvbW1pdHRlZFBhdGgsIGNsb3NpbmdQYXRoXS5maWx0ZXIoQm9vbGVhbik7XG4gIH07XG5cbiAgX3JlbmRlckd1aWRlcyA9ICh7IHRlbnRhdGl2ZUZlYXR1cmUsIGVkaXRIYW5kbGVzIH06IE9iamVjdCkgPT4ge1xuICAgIGNvbnN0IGZlYXR1cmVzID0gdGhpcy5nZXRGZWF0dXJlcygpO1xuICAgIGNvbnN0IGN1cnNvckVkaXRIYW5kbGUgPSBlZGl0SGFuZGxlcy5maW5kKFxuICAgICAgZiA9PiBmLnByb3BlcnRpZXMuZ3VpZGVUeXBlID09PSBHVUlERV9UWVBFLkNVUlNPUl9FRElUX0hBTkRMRVxuICAgICk7XG4gICAgcmV0dXJuIChcbiAgICAgIDxnIGtleT1cImZlYXR1cmUtZ3VpZGVzXCI+XG4gICAgICAgIHt0ZW50YXRpdmVGZWF0dXJlICYmIHRoaXMuX3JlbmRlclRlbnRhdGl2ZUZlYXR1cmUodGVudGF0aXZlRmVhdHVyZSwgY3Vyc29yRWRpdEhhbmRsZSl9XG4gICAgICAgIHtlZGl0SGFuZGxlcyAmJlxuICAgICAgICAgIGVkaXRIYW5kbGVzLm1hcChlZGl0SGFuZGxlID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGZlYXR1cmUgPVxuICAgICAgICAgICAgICAoZmVhdHVyZXMgJiYgZmVhdHVyZXNbZWRpdEhhbmRsZS5wcm9wZXJ0aWVzLmZlYXR1cmVJbmRleF0pIHx8IHRlbnRhdGl2ZUZlYXR1cmU7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fcmVuZGVyRWRpdEhhbmRsZShlZGl0SGFuZGxlLCBmZWF0dXJlKTtcbiAgICAgICAgICB9KX1cbiAgICAgIDwvZz5cbiAgICApO1xuICB9O1xuXG4gIF9yZW5kZXJQb2ludCA9IChmZWF0dXJlOiBGZWF0dXJlLCBpbmRleDogbnVtYmVyLCBwYXRoOiBzdHJpbmcpID0+IHtcbiAgICBjb25zdCByZW5kZXJTdGF0ZSA9IHRoaXMuX2dldEZlYXR1cmVSZW5kZXJTdGF0ZShpbmRleCk7XG4gICAgY29uc3QgeyBmZWF0dXJlU3R5bGUsIGZlYXR1cmVTaGFwZSwgY2xpY2tSYWRpdXMgfSA9IHRoaXMucHJvcHM7XG4gICAgY29uc3Qgc2hhcGUgPSB0aGlzLl9nZXRTdHlsZVByb3AoZmVhdHVyZVNoYXBlLCB7IGZlYXR1cmUsIGluZGV4LCBzdGF0ZTogcmVuZGVyU3RhdGUgfSk7XG4gICAgY29uc3Qgc3R5bGUgPSB0aGlzLl9nZXRTdHlsZVByb3AoZmVhdHVyZVN0eWxlLCB7IGZlYXR1cmUsIGluZGV4LCBzdGF0ZTogcmVuZGVyU3RhdGUgfSk7XG5cbiAgICBjb25zdCBlbGVtS2V5ID0gYGZlYXR1cmUuJHtpbmRleH1gO1xuICAgIGlmIChzaGFwZSA9PT0gJ3JlY3QnKSB7XG4gICAgICByZXR1cm4gKFxuICAgICAgICA8ZyBrZXk9e2VsZW1LZXl9IHRyYW5zZm9ybT17YHRyYW5zbGF0ZSgke3BhdGhbMF1bMF19LCAke3BhdGhbMF1bMV19KWB9PlxuICAgICAgICAgIDxyZWN0XG4gICAgICAgICAgICBkYXRhLXR5cGU9e0VMRU1FTlRfVFlQRS5GRUFUVVJFfVxuICAgICAgICAgICAgZGF0YS1mZWF0dXJlLWluZGV4PXtpbmRleH1cbiAgICAgICAgICAgIGtleT17YCR7ZWxlbUtleX0uaGlkZGVuYH1cbiAgICAgICAgICAgIHN0eWxlPXt7XG4gICAgICAgICAgICAgIC4uLnN0eWxlLFxuICAgICAgICAgICAgICB3aWR0aDogY2xpY2tSYWRpdXMsXG4gICAgICAgICAgICAgIGhlaWdodDogY2xpY2tSYWRpdXMsXG4gICAgICAgICAgICAgIGZpbGw6ICcjMDAwJyxcbiAgICAgICAgICAgICAgZmlsbE9wYWNpdHk6IDBcbiAgICAgICAgICAgIH19XG4gICAgICAgICAgLz5cbiAgICAgICAgICA8cmVjdFxuICAgICAgICAgICAgZGF0YS10eXBlPXtFTEVNRU5UX1RZUEUuRkVBVFVSRX1cbiAgICAgICAgICAgIGRhdGEtZmVhdHVyZS1pbmRleD17aW5kZXh9XG4gICAgICAgICAgICBrZXk9e2VsZW1LZXl9XG4gICAgICAgICAgICBzdHlsZT17c3R5bGV9XG4gICAgICAgICAgLz5cbiAgICAgICAgPC9nPlxuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gKFxuICAgICAgPGcga2V5PXtgZmVhdHVyZS4ke2luZGV4fWB9IHRyYW5zZm9ybT17YHRyYW5zbGF0ZSgke3BhdGhbMF1bMF19LCAke3BhdGhbMF1bMV19KWB9PlxuICAgICAgICA8Y2lyY2xlXG4gICAgICAgICAgZGF0YS10eXBlPXtFTEVNRU5UX1RZUEUuRkVBVFVSRX1cbiAgICAgICAgICBkYXRhLWZlYXR1cmUtaW5kZXg9e2luZGV4fVxuICAgICAgICAgIGtleT17YCR7ZWxlbUtleX0uaGlkZGVuYH1cbiAgICAgICAgICBzdHlsZT17e1xuICAgICAgICAgICAgLi4uc3R5bGUsXG4gICAgICAgICAgICBvcGFjaXR5OiAwXG4gICAgICAgICAgfX1cbiAgICAgICAgICBjeD17MH1cbiAgICAgICAgICBjeT17MH1cbiAgICAgICAgICByPXtjbGlja1JhZGl1c31cbiAgICAgICAgLz5cbiAgICAgICAgPGNpcmNsZVxuICAgICAgICAgIGRhdGEtdHlwZT17RUxFTUVOVF9UWVBFLkZFQVRVUkV9XG4gICAgICAgICAgZGF0YS1mZWF0dXJlLWluZGV4PXtpbmRleH1cbiAgICAgICAgICBrZXk9e2VsZW1LZXl9XG4gICAgICAgICAgc3R5bGU9e3N0eWxlfVxuICAgICAgICAgIGN4PXswfVxuICAgICAgICAgIGN5PXswfVxuICAgICAgICAvPlxuICAgICAgPC9nPlxuICAgICk7XG4gIH07XG5cbiAgX3JlbmRlclBhdGggPSAoZmVhdHVyZTogRmVhdHVyZSwgaW5kZXg6IG51bWJlciwgcGF0aDogc3RyaW5nKSA9PiB7XG4gICAgY29uc3QgeyBmZWF0dXJlU3R5bGUsIGNsaWNrUmFkaXVzIH0gPSB0aGlzLnByb3BzO1xuICAgIGNvbnN0IHNlbGVjdGVkRmVhdHVyZUluZGV4ID0gdGhpcy5fZ2V0U2VsZWN0ZWRGZWF0dXJlSW5kZXgoKTtcbiAgICBjb25zdCBzZWxlY3RlZCA9IGluZGV4ID09PSBzZWxlY3RlZEZlYXR1cmVJbmRleDtcbiAgICBjb25zdCByZW5kZXJTdGF0ZSA9IHRoaXMuX2dldEZlYXR1cmVSZW5kZXJTdGF0ZShpbmRleCk7XG4gICAgY29uc3Qgc3R5bGUgPSB0aGlzLl9nZXRTdHlsZVByb3AoZmVhdHVyZVN0eWxlLCB7IGZlYXR1cmUsIGluZGV4LCBzdGF0ZTogcmVuZGVyU3RhdGUgfSk7XG5cbiAgICBjb25zdCBlbGVtS2V5ID0gYGZlYXR1cmUuJHtpbmRleH1gO1xuICAgIGlmIChzZWxlY3RlZCkge1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgPGcga2V5PXtlbGVtS2V5fT57dGhpcy5fcmVuZGVyU2VnbWVudHMoaW5kZXgsIGZlYXR1cmUuZ2VvbWV0cnkuY29vcmRpbmF0ZXMsIHN0eWxlKX08L2c+XG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIGZpcnN0IDxwYXRoPiBpcyB0byBtYWtlIHBhdGggZWFzaWx5IGludGVyYWN0ZWQgd2l0aFxuICAgIHJldHVybiAoXG4gICAgICA8ZyBrZXk9e2VsZW1LZXl9PlxuICAgICAgICA8cGF0aFxuICAgICAgICAgIGRhdGEtdHlwZT17RUxFTUVOVF9UWVBFLkZFQVRVUkV9XG4gICAgICAgICAgZGF0YS1mZWF0dXJlLWluZGV4PXtpbmRleH1cbiAgICAgICAgICBrZXk9e2Ake2VsZW1LZXl9LmhpZGRlbmB9XG4gICAgICAgICAgc3R5bGU9e3tcbiAgICAgICAgICAgIC4uLnN0eWxlLFxuICAgICAgICAgICAgc3Ryb2tlV2lkdGg6IGNsaWNrUmFkaXVzLFxuICAgICAgICAgICAgb3BhY2l0eTogMFxuICAgICAgICAgIH19XG4gICAgICAgICAgZD17cGF0aH1cbiAgICAgICAgLz5cbiAgICAgICAgPHBhdGhcbiAgICAgICAgICBkYXRhLXR5cGU9e0VMRU1FTlRfVFlQRS5GRUFUVVJFfVxuICAgICAgICAgIGRhdGEtZmVhdHVyZS1pbmRleD17aW5kZXh9XG4gICAgICAgICAga2V5PXtlbGVtS2V5fVxuICAgICAgICAgIHN0eWxlPXtzdHlsZX1cbiAgICAgICAgICBkPXtwYXRofVxuICAgICAgICAvPlxuICAgICAgPC9nPlxuICAgICk7XG4gIH07XG5cbiAgX3JlbmRlclBvbHlnb24gPSAoZmVhdHVyZTogRmVhdHVyZSwgaW5kZXg6IG51bWJlciwgcGF0aDogc3RyaW5nKSA9PiB7XG4gICAgY29uc3QgeyBmZWF0dXJlU3R5bGUgfSA9IHRoaXMucHJvcHM7XG4gICAgY29uc3Qgc2VsZWN0ZWRGZWF0dXJlSW5kZXggPSB0aGlzLl9nZXRTZWxlY3RlZEZlYXR1cmVJbmRleCgpO1xuICAgIGNvbnN0IHNlbGVjdGVkID0gaW5kZXggPT09IHNlbGVjdGVkRmVhdHVyZUluZGV4O1xuXG4gICAgY29uc3QgcmVuZGVyU3RhdGUgPSB0aGlzLl9nZXRGZWF0dXJlUmVuZGVyU3RhdGUoaW5kZXgpO1xuICAgIGNvbnN0IHN0eWxlID0gdGhpcy5fZ2V0U3R5bGVQcm9wKGZlYXR1cmVTdHlsZSwgeyBmZWF0dXJlLCBpbmRleCwgc3RhdGU6IHJlbmRlclN0YXRlIH0pO1xuXG4gICAgY29uc3QgZWxlbUtleSA9IGBmZWF0dXJlLiR7aW5kZXh9YDtcbiAgICBpZiAoc2VsZWN0ZWQpIHtcbiAgICAgIGNvbnN0IGNvb3JkaW5hdGVzID0gZ2V0RmVhdHVyZUNvb3JkaW5hdGVzKGZlYXR1cmUpO1xuICAgICAgaWYgKCFjb29yZGluYXRlcykge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICAgIHJldHVybiAoXG4gICAgICAgIDxnIGtleT17ZWxlbUtleX0+XG4gICAgICAgICAge3RoaXMuX3JlbmRlckZpbGwoaW5kZXgsIGNvb3JkaW5hdGVzLCBzdHlsZSl9XG4gICAgICAgICAge3RoaXMuX3JlbmRlclNlZ21lbnRzKGluZGV4LCBjb29yZGluYXRlcywgc3R5bGUpfVxuICAgICAgICA8L2c+XG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiAoXG4gICAgICA8cGF0aFxuICAgICAgICBkYXRhLXR5cGU9e0VMRU1FTlRfVFlQRS5GRUFUVVJFfVxuICAgICAgICBkYXRhLWZlYXR1cmUtaW5kZXg9e2luZGV4fVxuICAgICAgICBrZXk9e2VsZW1LZXl9XG4gICAgICAgIHN0eWxlPXtzdHlsZX1cbiAgICAgICAgZD17cGF0aH1cbiAgICAgIC8+XG4gICAgKTtcbiAgfTtcblxuICBfcmVuZGVyRmVhdHVyZSA9IChmZWF0dXJlOiBGZWF0dXJlLCBpbmRleDogbnVtYmVyKSA9PiB7XG4gICAgY29uc3QgY29vcmRpbmF0ZXMgPSBnZXRGZWF0dXJlQ29vcmRpbmF0ZXMoZmVhdHVyZSk7XG4gICAgaWYgKCFjb29yZGluYXRlcyB8fCAhY29vcmRpbmF0ZXMubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCB7XG4gICAgICBwcm9wZXJ0aWVzOiB7IHJlbmRlclR5cGUgfSxcbiAgICAgIGdlb21ldHJ5OiB7IHR5cGUgfVxuICAgIH0gPSBmZWF0dXJlO1xuICAgIGNvbnN0IHBhdGggPSB0aGlzLl9nZXRQYXRoSW5TY3JlZW5Db29yZHMoY29vcmRpbmF0ZXMsIHR5cGUpO1xuICAgIGlmICghcGF0aCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgc3dpdGNoIChyZW5kZXJUeXBlKSB7XG4gICAgICBjYXNlIFJFTkRFUl9UWVBFLlBPSU5UOlxuICAgICAgICByZXR1cm4gdGhpcy5fcmVuZGVyUG9pbnQoZmVhdHVyZSwgaW5kZXgsIHBhdGgpO1xuICAgICAgY2FzZSBSRU5ERVJfVFlQRS5MSU5FX1NUUklORzpcbiAgICAgICAgcmV0dXJuIHRoaXMuX3JlbmRlclBhdGgoZmVhdHVyZSwgaW5kZXgsIHBhdGgpO1xuXG4gICAgICBjYXNlIFJFTkRFUl9UWVBFLlBPTFlHT046XG4gICAgICBjYXNlIFJFTkRFUl9UWVBFLlJFQ1RBTkdMRTpcbiAgICAgIGNhc2UgUkVOREVSX1RZUEUuQ0lSQ0xFOlxuICAgICAgICByZXR1cm4gdGhpcy5fcmVuZGVyUG9seWdvbihmZWF0dXJlLCBpbmRleCwgcGF0aCk7XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfTtcblxuICBfcmVuZGVyQ2FudmFzID0gKCkgPT4ge1xuICAgIGNvbnN0IGZlYXR1cmVzID0gdGhpcy5nZXRGZWF0dXJlcygpO1xuICAgIGNvbnN0IGd1aWRlcyA9IHRoaXMuX21vZGVIYW5kbGVyICYmIHRoaXMuX21vZGVIYW5kbGVyLmdldEd1aWRlcyh0aGlzLmdldE1vZGVQcm9wcygpKTtcblxuICAgIHJldHVybiAoXG4gICAgICA8c3ZnIGtleT1cImRyYXctY2FudmFzXCIgd2lkdGg9XCIxMDAlXCIgaGVpZ2h0PVwiMTAwJVwiPlxuICAgICAgICB7ZmVhdHVyZXMgJiZcbiAgICAgICAgICBmZWF0dXJlcy5sZW5ndGggPiAwICYmIDxnIGtleT1cImZlYXR1cmUtZ3JvdXBcIj57ZmVhdHVyZXMubWFwKHRoaXMuX3JlbmRlckZlYXR1cmUpfTwvZz59XG4gICAgICAgIHtndWlkZXMgJiYgPGcga2V5PVwiZmVhdHVyZS1ndWlkZXNcIj57dGhpcy5fcmVuZGVyR3VpZGVzKGd1aWRlcyl9PC9nPn1cbiAgICAgIDwvc3ZnPlxuICAgICk7XG4gIH07XG5cbiAgX3JlbmRlckVkaXRvciA9ICgpID0+IHtcbiAgICBjb25zdCB2aWV3cG9ydCA9ICh0aGlzLl9jb250ZXh0ICYmIHRoaXMuX2NvbnRleHQudmlld3BvcnQpIHx8IHt9O1xuICAgIGNvbnN0IHsgc3R5bGUgfSA9IHRoaXMucHJvcHM7XG4gICAgY29uc3QgeyB3aWR0aCwgaGVpZ2h0IH0gPSB2aWV3cG9ydDtcblxuICAgIHJldHVybiAoXG4gICAgICA8ZGl2XG4gICAgICAgIGlkPVwiZWRpdG9yXCJcbiAgICAgICAgc3R5bGU9e3tcbiAgICAgICAgICB3aWR0aCxcbiAgICAgICAgICBoZWlnaHQsXG4gICAgICAgICAgLi4uc3R5bGVcbiAgICAgICAgfX1cbiAgICAgICAgcmVmPXtfID0+IHtcbiAgICAgICAgICB0aGlzLl9jb250YWluZXJSZWYgPSBfO1xuICAgICAgICB9fVxuICAgICAgPlxuICAgICAgICB7dGhpcy5fcmVuZGVyQ2FudmFzKCl9XG4gICAgICA8L2Rpdj5cbiAgICApO1xuICB9O1xuXG4gIHJlbmRlcigpIHtcbiAgICByZXR1cm4gc3VwZXIucmVuZGVyKHRoaXMuX3JlbmRlckVkaXRvcigpKTtcbiAgfVxufVxuIl19
\No newline at end of file