tmp-react-map-gl-draw
Version:
A lite version editing layer with react
334 lines (249 loc) • 37.7 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports["default"] = void 0;
var _constants = require("../constants");
var _baseMode = _interopRequireDefault(require("./base-mode"));
var _utils = require("./utils");
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
function _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); }
function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _nonIterableSpread(); }
function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance"); }
function _iterableToArray(iter) { if (Symbol.iterator in Object(iter) || Object.prototype.toString.call(iter) === "[object Arguments]") return Array.from(iter); }
function _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; } }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
function _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); } }
function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }
function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); }
function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }
function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; }
function _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); }
function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }
function _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; }
var EditingMode =
/*#__PURE__*/
function (_BaseMode) {
_inherits(EditingMode, _BaseMode);
function EditingMode() {
var _getPrototypeOf2;
var _this;
_classCallCheck(this, EditingMode);
for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
args[_key] = arguments[_key];
}
_this = _possibleConstructorReturn(this, (_getPrototypeOf2 = _getPrototypeOf(EditingMode)).call.apply(_getPrototypeOf2, [this].concat(args)));
_defineProperty(_assertThisInitialized(_this), "handleClick", function (event, props) {
var pickedObject = event.picks && event.picks[0] && event.picks[0].object;
var selectedFeatureIndex = props.selectedIndexes && props.selectedIndexes[0];
if (!pickedObject || pickedObject.featureIndex !== selectedFeatureIndex) {
return;
}
var featureIndex = pickedObject.featureIndex,
index = pickedObject.index;
var feature = _this.getSelectedFeature(props, featureIndex);
if (feature && (feature.geometry.type === _constants.RENDER_TYPE.POLYGON || feature.geometry.type === _constants.RENDER_TYPE.LINE_STRING) && pickedObject.type === _constants.ELEMENT_TYPE.SEGMENT) {
var coordinates = (0, _utils.getFeatureCoordinates)(feature);
if (!coordinates) {
return;
}
var insertIndex = (index + 1) % coordinates.length;
var positionIndexes = feature.geometry.type === _constants.RENDER_TYPE.POLYGON ? [0, insertIndex] : [insertIndex];
var insertMapCoords = _this._getPointOnSegment(feature, pickedObject, event.mapCoords);
var updatedData = props.data.addPosition(featureIndex, positionIndexes, insertMapCoords).getObject();
props.onEdit({
editType: _constants.EDIT_TYPE.ADD_POSITION,
updatedData: updatedData,
editContext: [{
featureIndex: featureIndex,
editHandleIndex: insertIndex,
screenCoords: props.viewport && props.viewport.project(insertMapCoords),
mapCoords: insertMapCoords
}]
});
}
});
_defineProperty(_assertThisInitialized(_this), "_handleDragging", function (event, props) {
var onEdit = props.onEdit;
var selectedFeature = _this.getSelectedFeature(props); // nothing clicked
var isDragging = event.isDragging,
pointerDownPicks = event.pointerDownPicks,
screenCoords = event.screenCoords;
var lastPointerMoveEvent = props.lastPointerMoveEvent;
var clickedObject = pointerDownPicks && pointerDownPicks[0] && pointerDownPicks[0].object;
if (!clickedObject || !(0, _utils.isNumeric)(clickedObject.featureIndex)) {
return;
}
var editHandleIndex = clickedObject.index;
console.log('editmode _handleDragging', selectedFeature, event); // not dragging
var updatedData = null;
var editType = isDragging ? _constants.EDIT_TYPE.MOVE_POSITION : _constants.EDIT_TYPE.FINISH_MOVE_POSITION;
switch (clickedObject.type) {
case _constants.ELEMENT_TYPE.FEATURE:
case _constants.ELEMENT_TYPE.FILL:
case _constants.ELEMENT_TYPE.SEGMENT:
// dragging feature
var dx = screenCoords[0] - lastPointerMoveEvent.screenCoords[0];
var dy = screenCoords[1] - lastPointerMoveEvent.screenCoords[1];
updatedData = _this._updateFeature(props, 'feature', {
dx: dx,
dy: dy
});
console.log('editmode updateData', updatedData);
onEdit({
editType: editType,
updatedData: updatedData,
editContext: null
});
break;
case _constants.ELEMENT_TYPE.EDIT_HANDLE:
// dragging editHandle
// dragging rectangle or other shapes
var updateType = selectedFeature.properties.renderType === _constants.RENDER_TYPE.RECTANGLE ? 'rectangle' : 'editHandle';
updatedData = _this._updateFeature(props, updateType, {
editHandleIndex: editHandleIndex,
mapCoords: event.mapCoords
});
onEdit({
editType: editType,
updatedData: updatedData,
editContext: null
});
break;
default:
}
});
_defineProperty(_assertThisInitialized(_this), "handlePointerMove", function (event, props) {
// no selected feature
var selectedFeature = _this.getSelectedFeature(props);
if (!selectedFeature) {
return;
}
if (!event.isDragging) {
return;
}
_this._handleDragging(event, props);
});
_defineProperty(_assertThisInitialized(_this), "_updateFeature", function (props, type) {
var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
var data = props.data,
selectedIndexes = props.selectedIndexes,
viewport = props.viewport;
var featureIndex = selectedIndexes && selectedIndexes[0];
var feature = _this.getSelectedFeature(props, featureIndex);
var geometry = null;
var coordinates = (0, _utils.getFeatureCoordinates)(feature);
if (!coordinates) {
return null;
}
var newCoordinates = _toConsumableArray(coordinates);
switch (type) {
case 'editHandle':
var positionIndexes = feature.geometry.type === _constants.GEOJSON_TYPE.POLYGON ? [0, options.editHandleIndex] : [options.editHandleIndex];
return data.replacePosition(featureIndex, positionIndexes, options.mapCoords).getObject();
case 'feature':
var dx = options.dx,
dy = options.dy;
newCoordinates = newCoordinates.map(function (mapCoords) {
var pixels = viewport && viewport.project(mapCoords);
if (pixels) {
pixels[0] += dx;
pixels[1] += dy;
return viewport && viewport.unproject(pixels);
}
return null;
}).filter(Boolean);
geometry = {
type: feature.geometry.type,
coordinates: feature.geometry.type === _constants.GEOJSON_TYPE.POLYGON ? [newCoordinates] : newCoordinates
};
return data.replaceGeometry(featureIndex, geometry).getObject();
case 'rectangle':
// moved editHandleIndex and destination mapCoords
newCoordinates = (0, _utils.updateRectanglePosition)(feature, options.editHandleIndex, options.mapCoords);
geometry = {
type: _constants.GEOJSON_TYPE.POLYGON,
coordinates: newCoordinates
};
return data.replaceGeometry(featureIndex, geometry).getObject();
default:
return data && data.getObject();
}
});
_defineProperty(_assertThisInitialized(_this), "_getCursorEditHandle", function (event, feature) {
var isDragging = event.isDragging,
picks = event.picks; // if not pick segment
var pickedObject = picks && picks[0] && picks[0].object;
if (!pickedObject || !(0, _utils.isNumeric)(pickedObject.featureIndex) || pickedObject.type !== _constants.ELEMENT_TYPE.SEGMENT) {
return null;
} // if dragging or feature is neither polygon nor line string
if (isDragging || feature.properties.renderType !== _constants.GEOJSON_TYPE.POLYGON && feature.properties.renderType !== _constants.GEOJSON_TYPE.LINE_STRING) {
return null;
}
var insertMapCoords = _this._getPointOnSegment(feature, pickedObject, event.mapCoords);
if (!insertMapCoords) {
return null;
}
return {
type: 'Feature',
properties: {
guideType: _constants.GUIDE_TYPE.CURSOR_EDIT_HANDLE,
renderType: feature.properties.renderType,
positionIndexes: [null]
},
geometry: {
type: _constants.GEOJSON_TYPE.POINT,
coordinates: [insertMapCoords]
}
};
});
_defineProperty(_assertThisInitialized(_this), "getGuides", function (props) {
var selectedFeature = _this.getSelectedFeature(props);
var selectedFeatureIndex = props.selectedIndexes && props.selectedIndexes[0];
if (!selectedFeature || selectedFeature.geometry.type === _constants.GEOJSON_TYPE.POINT) {
return null;
}
var event = props.lastPointerMoveEvent; // feature editHandles
var editHandles = _this.getEditHandlesFromFeature(selectedFeature, selectedFeatureIndex) || []; // cursor editHandle
var cursorEditHandle = _this._getCursorEditHandle(event, selectedFeature);
if (cursorEditHandle) {
editHandles.push(_this._getCursorEditHandle(event, selectedFeature));
}
return {
editHandles: editHandles.length ? editHandles : null
};
});
return _this;
}
_createClass(EditingMode, [{
key: "handleStopDragging",
value: function handleStopDragging(event, props) {
// replace point
var pickedObject = event.picks && event.picks[0] && event.picks[0].object;
if (!pickedObject || !(0, _utils.isNumeric)(pickedObject.featureIndex)) {
return;
}
switch (pickedObject.type) {
case _constants.ELEMENT_TYPE.FEATURE:
case _constants.ELEMENT_TYPE.EDIT_HANDLE:
this._handleDragging(event, props);
break;
default:
}
}
}, {
key: "_getPointOnSegment",
value: function _getPointOnSegment(feature, pickedObject, pickedMapCoords) {
var coordinates = (0, _utils.getFeatureCoordinates)(feature);
if (!coordinates) {
return null;
}
var srcVertexIndex = pickedObject.index;
var targetVertexIndex = pickedObject.index + 1;
return (0, _utils.findClosestPointOnLineSegment)(coordinates[srcVertexIndex], coordinates[targetVertexIndex], pickedMapCoords);
}
}]);
return EditingMode;
}(_baseMode["default"]);
exports["default"] = EditingMode;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9lZGl0LW1vZGVzL2VkaXRpbmctbW9kZS5qcyJdLCJuYW1lcyI6WyJFZGl0aW5nTW9kZSIsImV2ZW50IiwicHJvcHMiLCJwaWNrZWRPYmplY3QiLCJwaWNrcyIsIm9iamVjdCIsInNlbGVjdGVkRmVhdHVyZUluZGV4Iiwic2VsZWN0ZWRJbmRleGVzIiwiZmVhdHVyZUluZGV4IiwiaW5kZXgiLCJmZWF0dXJlIiwiZ2V0U2VsZWN0ZWRGZWF0dXJlIiwiZ2VvbWV0cnkiLCJ0eXBlIiwiUkVOREVSX1RZUEUiLCJQT0xZR09OIiwiTElORV9TVFJJTkciLCJFTEVNRU5UX1RZUEUiLCJTRUdNRU5UIiwiY29vcmRpbmF0ZXMiLCJpbnNlcnRJbmRleCIsImxlbmd0aCIsInBvc2l0aW9uSW5kZXhlcyIsImluc2VydE1hcENvb3JkcyIsIl9nZXRQb2ludE9uU2VnbWVudCIsIm1hcENvb3JkcyIsInVwZGF0ZWREYXRhIiwiZGF0YSIsImFkZFBvc2l0aW9uIiwiZ2V0T2JqZWN0Iiwib25FZGl0IiwiZWRpdFR5cGUiLCJFRElUX1RZUEUiLCJBRERfUE9TSVRJT04iLCJlZGl0Q29udGV4dCIsImVkaXRIYW5kbGVJbmRleCIsInNjcmVlbkNvb3JkcyIsInZpZXdwb3J0IiwicHJvamVjdCIsInNlbGVjdGVkRmVhdHVyZSIsImlzRHJhZ2dpbmciLCJwb2ludGVyRG93blBpY2tzIiwibGFzdFBvaW50ZXJNb3ZlRXZlbnQiLCJjbGlja2VkT2JqZWN0IiwiY29uc29sZSIsImxvZyIsIk1PVkVfUE9TSVRJT04iLCJGSU5JU0hfTU9WRV9QT1NJVElPTiIsIkZFQVRVUkUiLCJGSUxMIiwiZHgiLCJkeSIsIl91cGRhdGVGZWF0dXJlIiwiRURJVF9IQU5ETEUiLCJ1cGRhdGVUeXBlIiwicHJvcGVydGllcyIsInJlbmRlclR5cGUiLCJSRUNUQU5HTEUiLCJfaGFuZGxlRHJhZ2dpbmciLCJvcHRpb25zIiwibmV3Q29vcmRpbmF0ZXMiLCJHRU9KU09OX1RZUEUiLCJyZXBsYWNlUG9zaXRpb24iLCJtYXAiLCJwaXhlbHMiLCJ1bnByb2plY3QiLCJmaWx0ZXIiLCJCb29sZWFuIiwicmVwbGFjZUdlb21ldHJ5IiwiZ3VpZGVUeXBlIiwiR1VJREVfVFlQRSIsIkNVUlNPUl9FRElUX0hBTkRMRSIsIlBPSU5UIiwiZWRpdEhhbmRsZXMiLCJnZXRFZGl0SGFuZGxlc0Zyb21GZWF0dXJlIiwiY3Vyc29yRWRpdEhhbmRsZSIsIl9nZXRDdXJzb3JFZGl0SGFuZGxlIiwicHVzaCIsInBpY2tlZE1hcENvb3JkcyIsInNyY1ZlcnRleEluZGV4IiwidGFyZ2V0VmVydGV4SW5kZXgiLCJCYXNlTW9kZSJdLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQVlBOztBQUNBOztBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztJQU9xQkEsVzs7Ozs7Ozs7Ozs7Ozs7Ozs7O2tFQUNMLFVBQUNDLEtBQUQsRUFBb0JDLEtBQXBCLEVBQTREO0FBQ3hFLFVBQU1DLFlBQVksR0FBR0YsS0FBSyxDQUFDRyxLQUFOLElBQWVILEtBQUssQ0FBQ0csS0FBTixDQUFZLENBQVosQ0FBZixJQUFpQ0gsS0FBSyxDQUFDRyxLQUFOLENBQVksQ0FBWixFQUFlQyxNQUFyRTtBQUNBLFVBQU1DLG9CQUFvQixHQUFHSixLQUFLLENBQUNLLGVBQU4sSUFBeUJMLEtBQUssQ0FBQ0ssZUFBTixDQUFzQixDQUF0QixDQUF0RDs7QUFDQSxVQUFJLENBQUNKLFlBQUQsSUFBaUJBLFlBQVksQ0FBQ0ssWUFBYixLQUE4QkYsb0JBQW5ELEVBQXlFO0FBQ3ZFO0FBQ0Q7O0FBTHVFLFVBT2hFRSxZQVBnRSxHQU94Q0wsWUFQd0MsQ0FPaEVLLFlBUGdFO0FBQUEsVUFPbERDLEtBUGtELEdBT3hDTixZQVB3QyxDQU9sRE0sS0FQa0Q7O0FBUXhFLFVBQU1DLE9BQU8sR0FBRyxNQUFLQyxrQkFBTCxDQUF3QlQsS0FBeEIsRUFBK0JNLFlBQS9CLENBQWhCOztBQUNBLFVBQ0VFLE9BQU8sS0FDTkEsT0FBTyxDQUFDRSxRQUFSLENBQWlCQyxJQUFq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XG4gIEZlYXR1cmVDb2xsZWN0aW9uLFxuICBDbGlja0V2ZW50LFxuICBTdG9wRHJhZ2dpbmdFdmVudCxcbiAgUG9pbnRlck1vdmVFdmVudCxcbiAgUG9zaXRpb25cbn0gZnJvbSAnQG5lYnVsYS5nbC9lZGl0LW1vZGVzJztcbmltcG9ydCB0eXBlIHsgTW9kZVByb3BzIH0gZnJvbSAnLi4vdHlwZXMnO1xuXG5pbXBvcnQgeyBSRU5ERVJfVFlQRSwgRURJVF9UWVBFLCBFTEVNRU5UX1RZUEUsIEdFT0pTT05fVFlQRSwgR1VJREVfVFlQRSB9IGZyb20gJy4uL2NvbnN0YW50cyc7XG5pbXBvcnQgQmFzZU1vZGUgZnJvbSAnLi9iYXNlLW1vZGUnO1xuaW1wb3J0IHtcbiAgZmluZENsb3Nlc3RQb2ludE9uTGluZVNlZ21lbnQsXG4gIGdldEZlYXR1cmVDb29yZGluYXRlcyxcbiAgaXNOdW1lcmljLFxuICB1cGRhdGVSZWN0YW5nbGVQb3NpdGlvblxufSBmcm9tICcuL3V0aWxzJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRWRpdGluZ01vZGUgZXh0ZW5kcyBCYXNlTW9kZSB7XG4gIGhhbmRsZUNsaWNrID0gKGV2ZW50OiBDbGlja0V2ZW50LCBwcm9wczogTW9kZVByb3BzPEZlYXR1cmVDb2xsZWN0aW9uPikgPT4ge1xuICAgIGNvbnN0IHBpY2tlZE9iamVjdCA9IGV2ZW50LnBpY2tzICYmIGV2ZW50LnBpY2tzWzBdICYmIGV2ZW50LnBpY2tzWzBdLm9iamVjdDtcbiAgICBjb25zdCBzZWxlY3RlZEZlYXR1cmVJbmRleCA9IHByb3BzLnNlbGVjdGVkSW5kZXhlcyAmJiBwcm9wcy5zZWxlY3RlZEluZGV4ZXNbMF07XG4gICAgaWYgKCFwaWNrZWRPYmplY3QgfHwgcGlja2VkT2JqZWN0LmZlYXR1cmVJbmRleCAhPT0gc2VsZWN0ZWRGZWF0dXJlSW5kZXgpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCB7IGZlYXR1cmVJbmRleCwgaW5kZXggfSA9IHBpY2tlZE9iamVjdDtcbiAgICBjb25zdCBmZWF0dXJlID0gdGhpcy5nZXRTZWxlY3RlZEZlYXR1cmUocHJvcHMsIGZlYXR1cmVJbmRleCk7XG4gICAgaWYgKFxuICAgICAgZmVhdHVyZSAmJlxuICAgICAgKGZlYXR1cmUuZ2VvbWV0cnkudHlwZSA9PT0gUkVOREVSX1RZUEUuUE9MWUdPTiB8fFxuICAgICAgICBmZWF0dXJlLmdlb21ldHJ5LnR5cGUgPT09IFJFTkRFUl9UWVBFLkxJTkVfU1RSSU5HKSAmJlxuICAgICAgcGlja2VkT2JqZWN0LnR5cGUgPT09IEVMRU1FTlRfVFlQRS5TRUdNRU5UXG4gICAgKSB7XG4gICAgICBjb25zdCBjb29yZGluYXRlcyA9IGdldEZlYXR1cmVDb29yZGluYXRlcyhmZWF0dXJlKTtcbiAgICAgIGlmICghY29vcmRpbmF0ZXMpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3QgaW5zZXJ0SW5kZXggPSAoaW5kZXggKyAxKSAlIGNvb3JkaW5hdGVzLmxlbmd0aDtcbiAgICAgIGNvbnN0IHBvc2l0aW9uSW5kZXhlcyA9XG4gICAgICAgIGZlYXR1cmUuZ2VvbWV0cnkudHlwZSA9PT0gUkVOREVSX1RZUEUuUE9MWUdPTiA/IFswLCBpbnNlcnRJbmRleF0gOiBbaW5zZXJ0SW5kZXhdO1xuICAgICAgY29uc3QgaW5zZXJ0TWFwQ29vcmRzID0gdGhpcy5fZ2V0UG9pbnRPblNlZ21lbnQoZmVhdHVyZSwgcGlja2VkT2JqZWN0LCBldmVudC5tYXBDb29yZHMpO1xuXG4gICAgICBjb25zdCB1cGRhdGVkRGF0YSA9IHByb3BzLmRhdGFcbiAgICAgICAgLmFkZFBvc2l0aW9uKGZlYXR1cmVJbmRleCwgcG9zaXRpb25JbmRleGVzLCBpbnNlcnRNYXBDb29yZHMpXG4gICAgICAgIC5nZXRPYmplY3QoKTtcblxuICAgICAgcHJvcHMub25FZGl0KHtcbiAgICAgICAgZWRpdFR5cGU6IEVESVRfVFlQRS5BRERfUE9TSVRJT04sXG4gICAgICAgIHVwZGF0ZWREYXRhLFxuICAgICAgICBlZGl0Q29udGV4dDogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGZlYXR1cmVJbmRleCxcbiAgICAgICAgICAgIGVkaXRIYW5kbGVJbmRleDogaW5zZXJ0SW5kZXgsXG4gICAgICAgICAgICBzY3JlZW5Db29yZHM6IHByb3BzLnZpZXdwb3J0ICYmIHByb3BzLnZpZXdwb3J0LnByb2plY3QoaW5zZXJ0TWFwQ29vcmRzKSxcbiAgICAgICAgICAgIG1hcENvb3JkczogaW5zZXJ0TWFwQ29vcmRzXG4gICAgICAgICAgfVxuICAgICAgICBdXG4gICAgICB9KTtcbiAgICB9XG4gIH07XG5cbiAgaGFuZGxlU3RvcERyYWdnaW5nKGV2ZW50OiBTdG9wRHJhZ2dpbmdFdmVudCwgcHJvcHM6IE1vZGVQcm9wczxGZWF0dXJlQ29sbGVjdGlvbj4pIHtcbiAgICAvLyByZXBsYWNlIHBvaW50XG4gICAgY29uc3QgcGlja2VkT2JqZWN0ID0gZXZlbnQucGlja3MgJiYgZXZlbnQucGlja3NbMF0gJiYgZXZlbnQucGlja3NbMF0ub2JqZWN0O1xuICAgIGlmICghcGlja2VkT2JqZWN0IHx8ICFpc051bWVyaWMocGlja2VkT2JqZWN0LmZlYXR1cmVJbmRleCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBzd2l0Y2ggKHBpY2tlZE9iamVjdC50eXBlKSB7XG4gICAgICBjYXNlIEVMRU1FTlRfVFlQRS5GRUFUVVJFOlxuICAgICAgY2FzZSBFTEVNRU5UX1RZUEUuRURJVF9IQU5ETEU6XG4gICAgICAgIHRoaXMuX2hhbmRsZURyYWdnaW5nKGV2ZW50LCBwcm9wcyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICB9XG4gIH1cblxuICBfaGFuZGxlRHJhZ2dpbmcgPSAoXG4gICAgZXZlbnQ6IFBvaW50ZXJNb3ZlRXZlbnQgfCBTdG9wRHJhZ2dpbmdFdmVudCxcbiAgICBwcm9wczogTW9kZVByb3BzPEZlYXR1cmVDb2xsZWN0aW9uPlxuICApID0+IHtcbiAgICBjb25zdCB7IG9uRWRpdCB9ID0gcHJvcHM7XG4gICAgY29uc3Qgc2VsZWN0ZWRGZWF0dXJlID0gdGhpcy5nZXRTZWxlY3RlZEZlYXR1cmUocHJvcHMpO1xuICAgIC8vIG5vdGhpbmcgY2xpY2tlZFxuICAgIGNvbnN0IHsgaXNEcmFnZ2luZywgcG9pbnRlckRvd25QaWNrcywgc2NyZWVuQ29vcmRzIH0gPSBldmVudDtcbiAgICBjb25zdCB7IGxhc3RQb2ludGVyTW92ZUV2ZW50IH0gPSBwcm9wcztcblxuICAgIGNvbnN0IGNsaWNrZWRPYmplY3QgPSBwb2ludGVyRG93blBpY2tzICYmIHBvaW50ZXJEb3duUGlja3NbMF0gJiYgcG9pbnRlckRvd25QaWNrc1swXS5vYmplY3Q7XG4gICAgaWYgKCFjbGlja2VkT2JqZWN0IHx8ICFpc051bWVyaWMoY2xpY2tlZE9iamVjdC5mZWF0dXJlSW5kZXgpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgZWRpdEhhbmRsZUluZGV4ID0gY2xpY2tlZE9iamVjdC5pbmRleDtcblxuICAgIGNvbnNvbGUubG9nKCdlZGl0bW9kZSBfaGFuZGxlRHJhZ2dpbmcnLCBzZWxlY3RlZEZlYXR1cmUsIGV2ZW50LCApXG4gICAgLy8gbm90IGRyYWdnaW5nXG4gICAgbGV0IHVwZGF0ZWREYXRhID0gbnVsbDtcbiAgICBjb25zdCBlZGl0VHlwZSA9IGlzRHJhZ2dpbmcgPyBFRElUX1RZUEUuTU9WRV9QT1NJVElPTiA6IEVESVRfVFlQRS5GSU5JU0hfTU9WRV9QT1NJVElPTjtcblxuICAgIHN3aXRjaCAoY2xpY2tlZE9iamVjdC50eXBlKSB7XG4gICAgICBjYXNlIEVMRU1FTlRfVFlQRS5GRUFUVVJFOlxuICAgICAgY2FzZSBFTEVNRU5UX1RZUEUuRklMTDpcbiAgICAgIGNhc2UgRUxFTUVOVF9UWVBFLlNFR01FTlQ6XG4gICAgICAgIC8vIGRyYWdnaW5nIGZlYXR1cmVcbiAgICAgICAgY29uc3QgZHggPSBzY3JlZW5Db29yZHNbMF0gLSBsYXN0UG9pbnRlck1vdmVFdmVudC5zY3JlZW5Db29yZHNbMF07XG4gICAgICAgIGNvbnN0IGR5ID0gc2NyZWVuQ29vcmRzWzFdIC0gbGFzdFBvaW50ZXJNb3ZlRXZlbnQuc2NyZWVuQ29vcmRzWzFdO1xuICAgICAgICB1cGRhdGVkRGF0YSA9IHRoaXMuX3VwZGF0ZUZlYXR1cmUocHJvcHMsICdmZWF0dXJlJywgeyBkeCwgZHkgfSk7XG4gICAgICAgIGNvbnNvbGUubG9nKCdlZGl0bW9kZSB1cGRhdGVEYXRhJywgdXBkYXRlZERhdGEpXG4gICAgICAgIG9uRWRpdCh7XG4gICAgICAgICAgZWRpdFR5cGUsXG4gICAgICAgICAgdXBkYXRlZERhdGEsXG4gICAgICAgICAgZWRpdENvbnRleHQ6IG51bGxcbiAgICAgICAgfSk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIEVMRU1FTlRfVFlQRS5FRElUX0hBTkRMRTpcbiAgICAgICAgLy8gZHJhZ2dpbmcgZWRpdEhhbmRsZVxuICAgICAgICAvLyBkcmFnZ2luZyByZWN0YW5nbGUgb3Igb3RoZXIgc2hhcGVzXG4gICAgICAgIGNvbnN0IHVwZGF0ZVR5cGUgPVxuICAgICAgICAgIHNlbGVjdGVkRmVhdHVyZS5wcm9wZXJ0aWVzLnJlbmRlclR5cGUgPT09IFJFTkRFUl9UWVBFLlJFQ1RBTkdMRVxuICAgICAgICAgICAgPyAncmVjdGFuZ2xlJ1xuICAgICAgICAgICAgOiAnZWRpdEhhbmRsZSc7XG4gICAgICAgIHVwZGF0ZWREYXRhID0gdGhpcy5fdXBkYXRlRmVhdHVyZShwcm9wcywgdXBkYXRlVHlwZSwge1xuICAgICAgICAgIGVkaXRIYW5kbGVJbmRleCxcbiAgICAgICAgICBtYXBDb29yZHM6IGV2ZW50Lm1hcENvb3Jkc1xuICAgICAgICB9KTtcblxuICAgICAgICBvbkVkaXQoe1xuICAgICAgICAgIGVkaXRUeXBlLFxuICAgICAgICAgIHVwZGF0ZWREYXRhLFxuICAgICAgICAgIGVkaXRDb250ZXh0OiBudWxsXG4gICAgICAgIH0pO1xuICAgICAgICBicmVhaztcblxuICAgICAgZGVmYXVsdDpcbiAgICB9XG4gIH07XG5cbiAgaGFuZGxlUG9pbnRlck1vdmUgPSAoZXZlbnQ6IFBvaW50ZXJNb3ZlRXZlbnQsIHByb3BzOiBNb2RlUHJvcHM8RmVhdHVyZUNvbGxlY3Rpb24+KSA9PiB7XG4gICAgLy8gbm8gc2VsZWN0ZWQgZmVhdHVyZVxuICAgIGNvbnN0IHNlbGVjdGVkRmVhdHVyZSA9IHRoaXMuZ2V0U2VsZWN0ZWRGZWF0dXJlKHByb3BzKTtcbiAgICBpZiAoIXNlbGVjdGVkRmVhdHVyZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICghZXZlbnQuaXNEcmFnZ2luZykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuX2hhbmRsZURyYWdnaW5nKGV2ZW50LCBwcm9wcyk7XG4gIH07XG5cbiAgLy8gVE9ETyAtIHJlZmFjdG9yXG4gIF91cGRhdGVGZWF0dXJlID0gKHByb3BzOiBNb2RlUHJvcHM8RmVhdHVyZUNvbGxlY3Rpb24+LCB0eXBlOiBzdHJpbmcsIG9wdGlvbnM6IGFueSA9IHt9KSA9PiB7XG4gICAgY29uc3QgeyBkYXRhLCBzZWxlY3RlZEluZGV4ZXMsIHZpZXdwb3J0IH0gPSBwcm9wcztcblxuICAgIGNvbnN0IGZlYXR1cmVJbmRleCA9IHNlbGVjdGVkSW5kZXhlcyAmJiBzZWxlY3RlZEluZGV4ZXNbMF07XG4gICAgY29uc3QgZmVhdHVyZSA9IHRoaXMuZ2V0U2VsZWN0ZWRGZWF0dXJlKHByb3BzLCBmZWF0dXJlSW5kZXgpO1xuXG4gICAgbGV0IGdlb21ldHJ5ID0gbnVsbDtcbiAgICBjb25zdCBjb29yZGluYXRlcyA9IGdldEZlYXR1cmVDb29yZGluYXRlcyhmZWF0dXJlKTtcbiAgICBpZiAoIWNvb3JkaW5hdGVzKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBsZXQgbmV3Q29vcmRpbmF0ZXMgPSBbLi4uY29vcmRpbmF0ZXNdO1xuXG4gICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICBjYXNlICdlZGl0SGFuZGxlJzpcbiAgICAgICAgY29uc3QgcG9zaXRpb25JbmRleGVzID1cbiAgICAgICAgICBmZWF0dXJlLmdlb21ldHJ5LnR5cGUgPT09IEdFT0pTT05fVFlQRS5QT0xZR09OXG4gICAgICAgICAgICA/IFswLCBvcHRpb25zLmVkaXRIYW5kbGVJbmRleF1cbiAgICAgICAgICAgIDogW29wdGlvbnMuZWRpdEhhbmRsZUluZGV4XTtcblxuICAgICAgICByZXR1cm4gZGF0YS5yZXBsYWNlUG9zaXRpb24oZmVhdHVyZUluZGV4LCBwb3NpdGlvbkluZGV4ZXMsIG9wdGlvbnMubWFwQ29vcmRzKS5nZXRPYmplY3QoKTtcblxuICAgICAgY2FzZSAnZmVhdHVyZSc6XG4gICAgICAgIGNvbnN0IHsgZHgsIGR5IH0gPSBvcHRpb25zO1xuICAgICAgICBuZXdDb29yZGluYXRlcyA9IG5ld0Nvb3JkaW5hdGVzXG4gICAgICAgICAgLm1hcChtYXBDb29yZHMgPT4ge1xuICAgICAgICAgICAgY29uc3QgcGl4ZWxzID0gdmlld3BvcnQgJiYgdmlld3BvcnQucHJvamVjdChtYXBDb29yZHMpO1xuICAgICAgICAgICAgaWYgKHBpeGVscykge1xuICAgICAgICAgICAgICBwaXhlbHNbMF0gKz0gZHg7XG4gICAgICAgICAgICAgIHBpeGVsc1sxXSArPSBkeTtcbiAgICAgICAgICAgICAgcmV0dXJuIHZpZXdwb3J0ICYmIHZpZXdwb3J0LnVucHJvamVjdChwaXhlbHMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgfSlcbiAgICAgICAgICAuZmlsdGVyKEJvb2xlYW4pO1xuXG4gICAgICAgIGdlb21ldHJ5ID0ge1xuICAgICAgICAgIHR5cGU6IGZlYXR1cmUuZ2VvbWV0cnkudHlwZSxcbiAgICAgICAgICBjb29yZGluYXRlczpcbiAgICAgICAgICAgIGZlYXR1cmUuZ2VvbWV0cnkudHlwZSA9PT0gR0VPSlNPTl9UWVBFLlBPTFlHT04gPyBbbmV3Q29vcmRpbmF0ZXNdIDogbmV3Q29vcmRpbmF0ZXNcbiAgICAgICAgfTtcblxuICAgICAgICByZXR1cm4gZGF0YS5yZXBsYWNlR2VvbWV0cnkoZmVhdHVyZUluZGV4LCBnZW9tZXRyeSkuZ2V0T2JqZWN0KCk7XG5cbiAgICAgIGNhc2UgJ3JlY3RhbmdsZSc6XG4gICAgICAgIC8vIG1vdmVkIGVkaXRIYW5kbGVJbmRleCBhbmQgZGVzdGluYXRpb24gbWFwQ29vcmRzXG4gICAgICAgIG5ld0Nvb3JkaW5hdGVzID0gdXBkYXRlUmVjdGFuZ2xlUG9zaXRpb24oXG4gICAgICAgICAgZmVhdHVyZSxcbiAgICAgICAgICBvcHRpb25zLmVkaXRIYW5kbGVJbmRleCxcbiAgICAgICAgICBvcHRpb25zLm1hcENvb3Jkc1xuICAgICAgICApO1xuXG4gICAgICAgIGdlb21ldHJ5ID0ge1xuICAgICAgICAgIHR5cGU6IEdFT0pTT05fVFlQRS5QT0xZR09OLFxuICAgICAgICAgIGNvb3JkaW5hdGVzOiBuZXdDb29yZGluYXRlc1xuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiBkYXRhLnJlcGxhY2VHZW9tZXRyeShmZWF0dXJlSW5kZXgsIGdlb21ldHJ5KS5nZXRPYmplY3QoKTtcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIGRhdGEgJiYgZGF0YS5nZXRPYmplY3QoKTtcbiAgICB9XG4gIH07XG5cbiAgX2dldFBvaW50T25TZWdtZW50KGZlYXR1cmU6IEZlYXR1cmUsIHBpY2tlZE9iamVjdDogYW55LCBwaWNrZWRNYXBDb29yZHM6IFBvc2l0aW9uKSB7XG4gICAgY29uc3QgY29vcmRpbmF0ZXMgPSBnZXRGZWF0dXJlQ29vcmRpbmF0ZXMoZmVhdHVyZSk7XG4gICAgaWYgKCFjb29yZGluYXRlcykge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGNvbnN0IHNyY1ZlcnRleEluZGV4ID0gcGlja2VkT2JqZWN0LmluZGV4O1xuICAgIGNvbnN0IHRhcmdldFZlcnRleEluZGV4ID0gcGlja2VkT2JqZWN0LmluZGV4ICsgMTtcbiAgICByZXR1cm4gZmluZENsb3Nlc3RQb2ludE9uTGluZVNlZ21lbnQoXG4gICAgICBjb29yZGluYXRlc1tzcmNWZXJ0ZXhJbmRleF0sXG4gICAgICBjb29yZGluYXRlc1t0YXJnZXRWZXJ0ZXhJbmRleF0sXG4gICAgICBwaWNrZWRNYXBDb29yZHNcbiAgICApO1xuICB9XG5cbiAgX2dldEN1cnNvckVkaXRIYW5kbGUgPSAoZXZlbnQ6IFBvaW50ZXJNb3ZlRXZlbnQsIGZlYXR1cmU6IEZlYXR1cmUpID0+IHtcbiAgICBjb25zdCB7IGlzRHJhZ2dpbmcsIHBpY2tzIH0gPSBldmVudDtcbiAgICAvLyBpZiBub3QgcGljayBzZWdtZW50XG4gICAgY29uc3QgcGlja2VkT2JqZWN0ID0gcGlja3MgJiYgcGlja3NbMF0gJiYgcGlja3NbMF0ub2JqZWN0O1xuICAgIGlmIChcbiAgICAgICFwaWNrZWRPYmplY3QgfHxcbiAgICAgICFpc051bWVyaWMocGlja2VkT2JqZWN0LmZlYXR1cmVJbmRleCkgfHxcbiAgICAgIHBpY2tlZE9iamVjdC50eXBlICE9PSBFTEVNRU5UX1RZUEUuU0VHTUVOVFxuICAgICkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgLy8gaWYgZHJhZ2dpbmcgb3IgZmVhdHVyZSBpcyBuZWl0aGVyIHBvbHlnb24gbm9yIGxpbmUgc3RyaW5nXG4gICAgaWYgKFxuICAgICAgaXNEcmFnZ2luZyB8fFxuICAgICAgKGZlYXR1cmUucHJvcGVydGllcy5yZW5kZXJUeXBlICE9PSBHRU9KU09OX1RZUEUuUE9MWUdPTiAmJlxuICAgICAgICBmZWF0dXJlLnByb3BlcnRpZXMucmVuZGVyVHlwZSAhPT0gR0VPSlNPTl9UWVBFLkxJTkVfU1RSSU5HKVxuICAgICkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgY29uc3QgaW5zZXJ0TWFwQ29vcmRzID0gdGhpcy5fZ2V0UG9pbnRPblNlZ21lbnQoZmVhdHVyZSwgcGlja2VkT2JqZWN0LCBldmVudC5tYXBDb29yZHMpO1xuXG4gICAgaWYgKCFpbnNlcnRNYXBDb29yZHMpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICB0eXBlOiAnRmVhdHVyZScsXG4gICAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICAgIGd1aWRlVHlwZTogR1VJREVfVFlQRS5DVVJTT1JfRURJVF9IQU5ETEUsXG4gICAgICAgIHJlbmRlclR5cGU6IGZlYXR1cmUucHJvcGVydGllcy5yZW5kZXJUeXBlLFxuICAgICAgICBwb3NpdGlvbkluZGV4ZXM6IFtudWxsXVxuICAgICAgfSxcbiAgICAgIGdlb21ldHJ5OiB7XG4gICAgICAgIHR5cGU6IEdFT0pTT05fVFlQRS5QT0lOVCxcbiAgICAgICAgY29vcmRpbmF0ZXM6IFtpbnNlcnRNYXBDb29yZHNdXG4gICAgICB9XG4gICAgfTtcbiAgfTtcblxuICBnZXRHdWlkZXMgPSAocHJvcHM6IE1vZGVQcm9wczxGZWF0dXJlQ29sbGVjdGlvbj4pID0+IHtcbiAgICBjb25zdCBzZWxlY3RlZEZlYXR1cmUgPSB0aGlzLmdldFNlbGVjdGVkRmVhdHVyZShwcm9wcyk7XG4gICAgY29uc3Qgc2VsZWN0ZWRGZWF0dXJlSW5kZXggPSBwcm9wcy5zZWxlY3RlZEluZGV4ZXMgJiYgcHJvcHMuc2VsZWN0ZWRJbmRleGVzWzBdO1xuXG4gICAgaWYgKCFzZWxlY3RlZEZlYXR1cmUgfHwgc2VsZWN0ZWRGZWF0dXJlLmdlb21ldHJ5LnR5cGUgPT09IEdFT0pTT05fVFlQRS5QT0lOVCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgY29uc3QgZXZlbnQgPSBwcm9wcy5sYXN0UG9pbnRlck1vdmVFdmVudDtcblxuICAgIC8vIGZlYXR1cmUgZWRpdEhhbmRsZXNcbiAgICBjb25zdCBlZGl0SGFuZGxlcyA9IHRoaXMuZ2V0RWRpdEhhbmRsZXNGcm9tRmVhdHVyZShzZWxlY3RlZEZlYXR1cmUsIHNlbGVjdGVkRmVhdHVyZUluZGV4KSB8fCBbXTtcblxuICAgIC8vIGN1cnNvciBlZGl0SGFuZGxlXG4gICAgY29uc3QgY3Vyc29yRWRpdEhhbmRsZSA9IHRoaXMuX2dldEN1cnNvckVkaXRIYW5kbGUoZXZlbnQsIHNlbGVjdGVkRmVhdHVyZSk7XG4gICAgaWYgKGN1cnNvckVkaXRIYW5kbGUpIHtcbiAgICAgIGVkaXRIYW5kbGVzLnB1c2godGhpcy5fZ2V0Q3Vyc29yRWRpdEhhbmRsZShldmVudCwgc2VsZWN0ZWRGZWF0dXJlKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGVkaXRIYW5kbGVzOiBlZGl0SGFuZGxlcy5sZW5ndGggPyBlZGl0SGFuZGxlcyA6IG51bGxcbiAgICB9O1xuICB9O1xufVxuIl19