@greenmice/ngx-cesium
Version:
Angular library for working with Cesium.
211 lines • 26.9 kB
JavaScript
import { AcEntity } from '../../angular-cesium/models/ac-entity';
import { EditPoint } from './edit-point';
import { GeoUtilsService } from '../../angular-cesium/services/geo-utils/geo-utils.service';
import { EditArc } from './edit-arc';
import { defaultLabelProps } from './label-props';
export class EditableCircle extends AcEntity {
constructor(id, circlesLayer, pointsLayer, arcsLayer, options) {
super();
this.id = id;
this.circlesLayer = circlesLayer;
this.pointsLayer = pointsLayer;
this.arcsLayer = arcsLayer;
this.options = options;
this.doneCreation = false;
this._enableEdit = true;
this._labels = [];
this._circleProps = { ...options.circleProps };
this._pointProps = { ...options.pointProps };
this._polylineProps = { ...options.polylineProps };
}
get labels() {
return this._labels;
}
set labels(labels) {
if (!labels || !this._center || !this._radiusPoint) {
return;
}
this._labels = labels.map((label, index) => {
if (!label.position) {
if (index !== labels.length - 1) {
label.position = this._center.getPosition();
}
else {
label.position = this._radiusPoint.getPosition();
}
}
return Object.assign({}, defaultLabelProps, label);
});
}
get polylineProps() {
return this._polylineProps;
}
set polylineProps(value) {
this._polylineProps = value;
}
get pointProps() {
return this._pointProps;
}
set pointProps(value) {
this._pointProps = value;
}
get circleProps() {
return this._circleProps;
}
set circleProps(value) {
this._circleProps = value;
}
get center() {
return this._center;
}
get radiusPoint() {
return this._radiusPoint;
}
get enableEdit() {
return this._enableEdit;
}
set enableEdit(value) {
this._enableEdit = value;
this._center.show = value;
this._radiusPoint.show = value;
this.updatePointsLayer();
}
setManually(center, radiusPoint, centerPointProp = this.pointProps, radiusPointProp = this.pointProps, circleProp = this.circleProps) {
if (!this._center) {
this._center = new EditPoint(this.id, center, centerPointProp);
}
else {
this._center.setPosition(center);
}
if (!this._radiusPoint) {
this._radiusPoint = new EditPoint(this.id, radiusPoint, radiusPointProp);
}
else {
this._radiusPoint.setPosition(radiusPoint);
}
if (!this._outlineArc) {
this.createOutlineArc();
}
else {
this._outlineArc.radius = this.getRadius();
}
this.circleProps = circleProp;
this.doneCreation = true;
this.updateArcsLayer();
this.updatePointsLayer();
this.updateCirclesLayer();
}
addPoint(position) {
if (this.doneCreation) {
return;
}
if (!this._center) {
this._center = new EditPoint(this.id, position, this.pointProps);
this._radiusPoint = new EditPoint(this.id, position.clone(), this.pointProps);
if (!this._outlineArc) {
this.createOutlineArc();
}
}
this.updateArcsLayer();
this.updatePointsLayer();
this.updateCirclesLayer();
}
addLastPoint(position) {
if (this.doneCreation || !this._center || !this._radiusPoint) {
return;
}
this._radiusPoint.setPosition(position);
this.doneCreation = true;
this.updatePointsLayer();
this.updateCirclesLayer();
}
movePoint(toPosition) {
if (!this._center || !this._radiusPoint) {
return;
}
this._radiusPoint.setPosition(toPosition);
this._outlineArc.radius = this.getRadius();
this.updateArcsLayer();
this.updatePointsLayer();
this.updateCirclesLayer();
}
moveCircle(dragStartPosition, dragEndPosition) {
if (!this.doneCreation) {
return;
}
if (!this.lastDraggedToPosition) {
this.lastDraggedToPosition = dragStartPosition;
}
const radius = this.getRadius();
const delta = GeoUtilsService.getPositionsDelta(this.lastDraggedToPosition, dragEndPosition);
const newCenterPosition = GeoUtilsService.addDeltaToPosition(this.getCenter(), delta, true);
this._center.setPosition(newCenterPosition);
this.radiusPoint.setPosition(GeoUtilsService.pointByLocationDistanceAndAzimuth(this.getCenter(), radius, Math.PI / 2, true));
this._outlineArc.radius = this.getRadius();
this._outlineArc.center = this._center.getPosition();
this.updateArcsLayer();
this.updatePointsLayer();
this.updateCirclesLayer();
this.lastDraggedToPosition = dragEndPosition;
}
endMovePolygon() {
this.lastDraggedToPosition = undefined;
}
getRadius() {
if (!this._center || !this._radiusPoint) {
return 0;
}
return GeoUtilsService.distance(this._center.getPosition(), this._radiusPoint.getPosition());
}
getRadiusCallbackProperty() {
return new Cesium.CallbackProperty(this.getRadius.bind(this), false);
}
getCenter() {
return this._center ? this._center.getPosition() : undefined;
}
getCenterCallbackProperty() {
return new Cesium.CallbackProperty(this.getCenter.bind(this), false);
}
getRadiusPoint() {
return this._radiusPoint ? this._radiusPoint.getPosition() : undefined;
}
dispose() {
if (this._center) {
this.pointsLayer.remove(this._center.getId());
}
if (this._radiusPoint) {
this.pointsLayer.remove(this._radiusPoint.getId());
}
if (this._outlineArc) {
this.arcsLayer.remove(this._outlineArc.getId());
}
this.circlesLayer.remove(this.id);
}
getId() {
return this.id;
}
updateCirclesLayer() {
this.circlesLayer.update(this, this.id);
}
updatePointsLayer() {
if (this._center) {
this.pointsLayer.update(this._center, this._center.getId());
}
if (this._radiusPoint) {
this.pointsLayer.update(this._radiusPoint, this._radiusPoint.getId());
}
}
updateArcsLayer() {
if (!this._outlineArc) {
return;
}
this.arcsLayer.update(this._outlineArc, this._outlineArc.getId());
}
createOutlineArc() {
if (!this._center || !this._radiusPoint) {
return;
}
this._outlineArc = new EditArc(this.id, this.getCenter(), this.getRadius(), Math.PI * 2, 0, this.polylineProps);
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWRpdGFibGUtY2lyY2xlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYW5ndWxhci1jZXNpdW0vc3JjL2xpYi9hbmd1bGFyLWNlc2l1bS13aWRnZXRzL21vZGVscy9lZGl0YWJsZS1jaXJjbGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLHVDQUF1QyxDQUFDO0FBQ2pFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFHekMsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDJEQUEyRCxDQUFDO0FBQzVGLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFJckMsT0FBTyxFQUFFLGlCQUFpQixFQUFjLE1BQU0sZUFBZSxDQUFDO0FBRzlELE1BQU0sT0FBTyxjQUFlLFNBQVEsUUFBUTtJQVkxQyxZQUNVLEVBQVUsRUFDVixZQUE4QixFQUM5QixXQUE2QixFQUM3QixTQUEyQixFQUMzQixPQUEwQjtRQUVsQyxLQUFLLEVBQUUsQ0FBQztRQU5BLE9BQUUsR0FBRixFQUFFLENBQVE7UUFDVixpQkFBWSxHQUFaLFlBQVksQ0FBa0I7UUFDOUIsZ0JBQVcsR0FBWCxXQUFXLENBQWtCO1FBQzdCLGNBQVMsR0FBVCxTQUFTLENBQWtCO1FBQzNCLFlBQU8sR0FBUCxPQUFPLENBQW1CO1FBYjVCLGlCQUFZLEdBQUcsS0FBSyxDQUFDO1FBQ3JCLGdCQUFXLEdBQUcsSUFBSSxDQUFDO1FBS25CLFlBQU8sR0FBaUIsRUFBRSxDQUFDO1FBVWpDLElBQUksQ0FBQyxZQUFZLEdBQUcsRUFBQyxHQUFHLE9BQU8sQ0FBQyxXQUFXLEVBQUMsQ0FBQztRQUM3QyxJQUFJLENBQUMsV0FBVyxHQUFHLEVBQUMsR0FBRyxPQUFPLENBQUMsVUFBVSxFQUFDLENBQUM7UUFDM0MsSUFBSSxDQUFDLGNBQWMsR0FBRyxFQUFDLEdBQUcsT0FBTyxDQUFD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RSxFQUFFLElBQUksQ0FBQyxTQUFTLEVBQUUsRUFBRSxJQUFJLENBQUMsU0FBUyxFQUFFLEVBQUUsSUFBSSxDQUFDLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztJQUNsSCxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBY0VudGl0eSB9IGZyb20gJy4uLy4uL2FuZ3VsYXItY2VzaXVtL21vZGVscy9hYy1lbnRpdHknO1xuaW1wb3J0IHsgRWRpdFBvaW50IH0gZnJvbSAnLi9lZGl0LXBvaW50JztcbmltcG9ydCB7IEFjTGF5ZXJDb21wb25lbnQgfSBmcm9tICcuLi8uLi9hbmd1bGFyLWNlc2l1bS9jb21wb25lbnRzL2FjLWxheWVyL2FjLWxheWVyLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBDYXJ0ZXNpYW4zIH0gZnJvbSAnLi4vLi4vYW5ndWxhci1jZXNpdW0vbW9kZWxzL2NhcnRlc2lhbjMnO1xuaW1wb3J0IHsgR2VvVXRpbHNTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vYW5ndWxhci1jZXNpdW0vc2VydmljZXMvZ2VvLXV0aWxzL2dlby11dGlscy5zZXJ2aWNlJztcbmltcG9ydCB7IEVkaXRBcmMgfSBmcm9tICcuL2VkaXQtYXJjJztcbmltcG9ydCB7IENpcmNsZUVkaXRPcHRpb25zIH0gZnJvbSAnLi9jaXJjbGUtZWRpdC1vcHRpb25zJztcbmltcG9ydCB7IFBvaW50UHJvcHMgfSBmcm9tICcuL3BvaW50LWVkaXQtb3B0aW9ucyc7XG5pbXBvcnQgeyBQb2x5bGluZVByb3BzIH0gZnJvbSAnLi9wb2x5bGluZS1lZGl0LW9wdGlvbnMnO1xuaW1wb3J0IHsgZGVmYXVsdExhYmVsUHJvcHMsIExhYmVsUHJvcHMgfSBmcm9tICcuL2xhYmVsLXByb3BzJztcbmltcG9ydCB7IEVsbGlwc2VQcm9wcyB9IGZyb20gJy4vZWxsaXBzZS1lZGl0LW9wdGlvbnMnO1xuXG5leHBvcnQgY2xhc3MgRWRpdGFibGVDaXJjbGUgZXh0ZW5kcyBBY0VudGl0eSB7XG4gIHByaXZhdGUgX2NlbnRlcjogRWRpdFBvaW50O1xuICBwcml2YXRlIF9yYWRpdXNQb2ludDogRWRpdFBvaW50O1xuICBwcml2YXRlIF9vdXRsaW5lQXJjOiBFZGl0QXJjO1xuICBwcml2YXRlIGRvbmVDcmVhdGlvbiA9IGZhbHNlO1xuICBwcml2YXRlIF9lbmFibGVFZGl0ID0gdHJ1ZTtcbiAgcHJpdmF0ZSBsYXN0RHJhZ2dlZFRvUG9zaXRpb246IGFueTtcbiAgcHJpdmF0ZSBfY2lyY2xlUHJvcHM6IEVsbGlwc2VQcm9wcztcbiAgcHJpdmF0ZSBfcG9pbnRQcm9wczogUG9pbnRQcm9wcztcbiAgcHJpdmF0ZSBfcG9seWxpbmVQcm9wczogUG9seWxpbmVQcm9wcztcbiAgcHJpdmF0ZSBfbGFiZWxzOiBMYWJlbFByb3BzW10gPSBbXTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGlkOiBzdHJpbmcsXG4gICAgcHJpdmF0ZSBjaXJjbGVzTGF5ZXI6IEFjTGF5ZXJDb21wb25lbnQsXG4gICAgcHJpdmF0ZSBwb2ludHNMYXllcjogQWNMYXllckNvbXBvbmVudCxcbiAgICBwcml2YXRlIGFyY3NMYXllcjogQWNMYXllckNvbXBvbmVudCxcbiAgICBwcml2YXRlIG9wdGlvbnM6IENpcmNsZUVkaXRPcHRpb25zLFxuICApIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuX2NpcmNsZVByb3BzID0gey4uLm9wdGlvbnMuY2lyY2xlUHJvcHN9O1xuICAgIHRoaXMuX3BvaW50UHJvcHMgPSB7Li4ub3B0aW9ucy5wb2ludFByb3BzfTtcbiAgICB0aGlzLl9wb2x5bGluZVByb3BzID0gey4uLm9wdGlvbnMucG9seWxpbmVQcm9wc307XG4gIH1cblxuICBnZXQgbGFiZWxzKCk6IExhYmVsUHJvcHNbXSB7XG4gICAgcmV0dXJuIHRoaXMuX2xhYmVscztcbiAgfVxuXG4gIHNldCBsYWJlbHMobGFiZWxzOiBMYWJlbFByb3BzW10pIHtcbiAgICBpZiAoIWxhYmVscyB8fCAhdGhpcy5fY2VudGVyIHx8ICF0aGlzLl9yYWRpdXNQb2ludCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLl9sYWJlbHMgPSBsYWJlbHMubWFwKChsYWJlbCwgaW5kZXgpID0+IHtcbiAgICAgIGlmICghbGFiZWwucG9zaXRpb24pIHtcbiAgICAgICAgaWYgKGluZGV4ICE9PSBsYWJlbHMubGVuZ3RoIC0gMSkge1xuICAgICAgICAgIGxhYmVsLnBvc2l0aW9uID0gdGhpcy5fY2VudGVyLmdldFBvc2l0aW9uKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbGFiZWwucG9zaXRpb24gPSB0aGlzLl9yYWRpdXNQb2ludC5nZXRQb3NpdGlvbigpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCBkZWZhdWx0TGFiZWxQcm9wcywgbGFiZWwpO1xuICAgIH0pO1xuICB9XG5cbiAgZ2V0IHBvbHlsaW5lUHJvcHMoKTogUG9seWxpbmVQcm9wcyB7XG4gICAgcmV0dXJuIHRoaXMuX3BvbHlsaW5lUHJvcHM7XG4gIH1cblxuICBzZXQgcG9seWxpbmVQcm9wcyh2YWx1ZTogUG9seWxpbmVQcm9wcykge1xuICAgIHRoaXMuX3BvbHlsaW5lUHJvcHMgPSB2YWx1ZTtcbiAgfVxuXG4gIGdldCBwb2ludFByb3BzKCk6IFBvaW50UHJvcHMge1xuICAgIHJldHVybiB0aGlzLl9wb2ludFByb3BzO1xuICB9XG5cbiAgc2V0IHBvaW50UHJvcHModmFsdWU6IFBvaW50UHJvcHMpIHtcbiAgICB0aGlzLl9wb2ludFByb3BzID0gdmFsdWU7XG4gIH1cblxuICBnZXQgY2lyY2xlUHJvcHMoKTogRWxsaXBzZVByb3BzIHtcbiAgICByZXR1cm4gdGhpcy5fY2lyY2xlUHJvcHM7XG4gIH1cblxuICBzZXQgY2lyY2xlUHJvcHModmFsdWU6IEVsbGlwc2VQcm9wcykge1xuICAgIHRoaXMuX2NpcmNsZVByb3BzID0gdmFsdWU7XG4gIH1cblxuICBnZXQgY2VudGVyKCk6IEVkaXRQb2ludCB7XG4gICAgcmV0dXJuIHRoaXMuX2NlbnRlcjtcbiAgfVxuXG4gIGdldCByYWRpdXNQb2ludCgpOiBFZGl0UG9pbnQge1xuICAgIHJldHVybiB0aGlzLl9yYWRpdXNQb2ludDtcbiAgfVxuXG4gIGdldCBlbmFibGVFZGl0KCkge1xuICAgIHJldHVybiB0aGlzLl9lbmFibGVFZGl0O1xuICB9XG5cbiAgc2V0IGVuYWJsZUVkaXQodmFsdWU6IGJvb2xlYW4pIHtcbiAgICB0aGlzLl9lbmFibGVFZGl0ID0gdmFsdWU7XG4gICAgdGhpcy5fY2VudGVyLnNob3cgPSB2YWx1ZTtcbiAgICB0aGlzLl9yYWRpdXNQb2ludC5zaG93ID0gdmFsdWU7XG4gICAgdGhpcy51cGRhdGVQb2ludHNMYXllcigpO1xuICB9XG5cbiAgc2V0TWFudWFsbHkoXG4gICAgY2VudGVyOiBDYXJ0ZXNpYW4zLFxuICAgIHJhZGl1c1BvaW50OiBDYXJ0ZXNpYW4zLFxuICAgIGNlbnRlclBvaW50UHJvcCA9IHRoaXMucG9pbnRQcm9wcyxcbiAgICByYWRpdXNQb2ludFByb3AgPSB0aGlzLnBvaW50UHJvcHMsXG4gICAgY2lyY2xlUHJvcCA9IHRoaXMuY2lyY2xlUHJvcHMsXG4gICkge1xuICAgIGlmICghdGhpcy5fY2VudGVyKSB7XG4gICAgICB0aGlzLl9jZW50ZXIgPSBuZXcgRWRpdFBvaW50KHRoaXMuaWQsIGNlbnRlciwgY2VudGVyUG9pbnRQcm9wKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fY2VudGVyLnNldFBvc2l0aW9uKGNlbnRlcik7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLl9yYWRpdXNQb2ludCkge1xuICAgICAgdGhpcy5fcmFkaXVzUG9pbnQgPSBuZXcgRWRpdFBvaW50KHRoaXMuaWQsIHJhZGl1c1BvaW50LCByYWRpdXNQb2ludFByb3ApO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9yYWRpdXNQb2ludC5zZXRQb3NpdGlvbihyYWRpdXNQb2ludCk7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLl9vdXRsaW5lQXJjKSB7XG4gICAgICB0aGlzLmNyZWF0ZU91dGxpbmVBcmMoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fb3V0bGluZUFyYy5yYWRpdXMgPSB0aGlzLmdldFJhZGl1cygpO1xuICAgIH1cblxuICAgIHRoaXMuY2lyY2xlUHJvcHMgPSBjaXJjbGVQcm9wO1xuICAgIHRoaXMuZG9uZUNyZWF0aW9uID0gdHJ1ZTtcbiAgICB0aGlzLnVwZGF0ZUFyY3NMYXllcigpO1xuICAgIHRoaXMudXBkYXRlUG9pbnRzTGF5ZXIoKTtcbiAgICB0aGlzLnVwZGF0ZUNpcmNsZXNMYXllcigpO1xuICB9XG5cbiAgYWRkUG9pbnQocG9zaXRpb246IENhcnRlc2lhbjMpIHtcbiAgICBpZiAodGhpcy5kb25lQ3JlYXRpb24pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuX2NlbnRlcikge1xuICAgICAgdGhpcy5fY2VudGVyID0gbmV3IEVkaXRQb2ludCh0aGlzLmlkLCBwb3NpdGlvbiwgdGhpcy5wb2ludFByb3BzKTtcbiAgICAgIHRoaXMuX3JhZGl1c1BvaW50ID0gbmV3IEVkaXRQb2ludCh0aGlzLmlkLCBwb3NpdGlvbi5jbG9uZSgpLCB0aGlzLnBvaW50UHJvcHMpO1xuICAgICAgaWYgKCF0aGlzLl9vdXRsaW5lQXJjKSB7XG4gICAgICAgIHRoaXMuY3JlYXRlT3V0bGluZUFyYygpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMudXBkYXRlQXJjc0xheWVyKCk7XG4gICAgdGhpcy51cGRhdGVQb2ludHNMYXllcigpO1xuICAgIHRoaXMudXBkYXRlQ2lyY2xlc0xheWVyKCk7XG4gIH1cblxuICBhZGRMYXN0UG9pbnQocG9zaXRpb246IENhcnRlc2lhbjMpIHtcbiAgICBpZiAodGhpcy5kb25lQ3JlYXRpb24gfHwgIXRoaXMuX2NlbnRlciB8fCAhdGhpcy5fcmFkaXVzUG9pbnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLl9yYWRpdXNQb2ludC5zZXRQb3NpdGlvbihwb3NpdGlvbik7XG4gICAgdGhpcy5kb25lQ3JlYXRpb24gPSB0cnVlO1xuXG4gICAgdGhpcy51cGRhdGVQb2ludHNMYXllcigpO1xuICAgIHRoaXMudXBkYXRlQ2lyY2xlc0xheWVyKCk7XG4gIH1cblxuICBtb3ZlUG9pbnQodG9Qb3NpdGlvbjogQ2FydGVzaWFuMykge1xuICAgIGlmICghdGhpcy5fY2VudGVyIHx8ICF0aGlzLl9yYWRpdXNQb2ludCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuX3JhZGl1c1BvaW50LnNldFBvc2l0aW9uKHRvUG9zaXRpb24pO1xuICAgIHRoaXMuX291dGxpbmVBcmMucmFkaXVzID0gdGhpcy5nZXRSYWRpdXMoKTtcblxuICAgIHRoaXMudXBkYXRlQXJjc0xheWVyKCk7XG4gICAgdGhpcy51cGRhdGVQb2ludHNMYXllcigpO1xuICAgIHRoaXMudXBkYXRlQ2lyY2xlc0xheWVyKCk7XG4gIH1cblxuICBtb3ZlQ2lyY2xlKGRyYWdTdGFydFBvc2l0aW9uOiBDYXJ0ZXNpYW4zLCBkcmFnRW5kUG9zaXRpb246IENhcnRlc2lhbjMpIHtcbiAgICBpZiAoIXRoaXMuZG9uZUNyZWF0aW9uKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICghdGhpcy5sYXN0RHJhZ2dlZFRvUG9zaXRpb24pIHtcbiAgICAgIHRoaXMubGFzdERyYWdnZWRUb1Bvc2l0aW9uID0gZHJhZ1N0YXJ0UG9zaXRpb247XG4gICAgfVxuXG4gICAgY29uc3QgcmFkaXVzID0gdGhpcy5nZXRSYWRpdXMoKTtcbiAgICBjb25zdCBkZWx0YSA9IEdlb1V0aWxzU2VydmljZS5nZXRQb3NpdGlvbnNEZWx0YSh0aGlzLmxhc3REcmFnZ2VkVG9Qb3NpdGlvbiwgZHJhZ0VuZFBvc2l0aW9uKTtcbiAgICBjb25zdCBuZXdDZW50ZXJQb3NpdGlvbiA9IEdlb1V0aWxzU2VydmljZS5hZGREZWx0YVRvUG9zaXRpb24odGhpcy5nZXRDZW50ZXIoKSwgZGVsdGEsIHRydWUpO1xuICAgIHRoaXMuX2NlbnRlci5zZXRQb3NpdGlvbihuZXdDZW50ZXJQb3NpdGlvbik7XG4gICAgdGhpcy5yYWRpdXNQb2ludC5zZXRQb3NpdGlvbihHZW9VdGlsc1NlcnZpY2UucG9pbnRCeUxvY2F0aW9uRGlzdGFuY2VBbmRBemltdXRoKHRoaXMuZ2V0Q2VudGVyKCksIHJhZGl1cywgTWF0aC5QSSAvIDIsIHRydWUpKTtcbiAgICB0aGlzLl9vdXRsaW5lQXJjLnJhZGl1cyA9IHRoaXMuZ2V0UmFkaXVzKCk7XG4gICAgdGhpcy5fb3V0bGluZUFyYy5jZW50ZXIgPSB0aGlzLl9jZW50ZXIuZ2V0UG9zaXRpb24oKTtcbiAgICB0aGlzLnVwZGF0ZUFyY3NMYXllcigpO1xuICAgIHRoaXMudXBkYXRlUG9pbnRzTGF5ZXIoKTtcbiAgICB0aGlzLnVwZGF0ZUNpcmNsZXNMYXllcigpO1xuICAgIHRoaXMubGFzdERyYWdnZWRUb1Bvc2l0aW9uID0gZHJhZ0VuZFBvc2l0aW9uO1xuICB9XG5cbiAgZW5kTW92ZVBvbHlnb24oKSB7XG4gICAgdGhpcy5sYXN0RHJhZ2dlZFRvUG9zaXRpb24gPSB1bmRlZmluZWQ7XG4gIH1cblxuICBnZXRSYWRpdXMoKTogbnVtYmVyIHtcbiAgICBpZiAoIXRoaXMuX2NlbnRlciB8fCAhdGhpcy5fcmFkaXVzUG9pbnQpIHtcbiAgICAgIHJldHVybiAwO1xuICAgIH1cbiAgICByZXR1cm4gR2VvVXRpbHNTZXJ2aWNlLmRpc3RhbmNlKHRoaXMuX2NlbnRlci5nZXRQb3NpdGlvbigpLCB0aGlzLl9yYWRpdXNQb2ludC5nZXRQb3NpdGlvbigpKTtcbiAgfVxuXG4gIGdldFJhZGl1c0NhbGxiYWNrUHJvcGVydHkoKSB7XG4gICAgcmV0dXJuIG5ldyBDZXNpdW0uQ2FsbGJhY2tQcm9wZXJ0eSh0aGlzLmdldFJhZGl1cy5iaW5kKHRoaXMpLCBmYWxzZSk7XG4gIH1cblxuICBnZXRDZW50ZXIoKTogQ2FydGVzaWFuMyB7XG4gICAgcmV0dXJuIHRoaXMuX2NlbnRlciA/IHRoaXMuX2NlbnRlci5nZXRQb3NpdGlvbigpIDogdW5kZWZpbmVkO1xuICB9XG5cbiAgZ2V0Q2VudGVyQ2FsbGJhY2tQcm9wZXJ0eSgpIHtcbiAgICByZXR1cm4gbmV3IENlc2l1bS5DYWxsYmFja1Byb3BlcnR5KHRoaXMuZ2V0Q2VudGVyLmJpbmQodGhpcyksIGZhbHNlKTtcbiAgfVxuXG4gIGdldFJhZGl1c1BvaW50KCk6IENhcnRlc2lhbjMge1xuICAgIHJldHVybiB0aGlzLl9yYWRpdXNQb2ludCA/IHRoaXMuX3JhZGl1c1BvaW50LmdldFBvc2l0aW9uKCkgOiB1bmRlZmluZWQ7XG4gIH1cblxuICBkaXNwb3NlKCkge1xuICAgIGlmICh0aGlzLl9jZW50ZXIpIHtcbiAgICAgIHRoaXMucG9pbnRzTGF5ZXIucmVtb3ZlKHRoaXMuX2NlbnRlci5nZXRJZCgpKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5fcmFkaXVzUG9pbnQpIHtcbiAgICAgIHRoaXMucG9pbnRzTGF5ZXIucmVtb3ZlKHRoaXMuX3JhZGl1c1BvaW50LmdldElkKCkpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLl9vdXRsaW5lQXJjKSB7XG4gICAgICB0aGlzLmFyY3NMYXllci5yZW1vdmUodGhpcy5fb3V0bGluZUFyYy5nZXRJZCgpKTtcbiAgICB9XG5cbiAgICB0aGlzLmNpcmNsZXNMYXllci5yZW1vdmUodGhpcy5pZCk7XG4gIH1cblxuICBnZXRJZCgpIHtcbiAgICByZXR1cm4gdGhpcy5pZDtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlQ2lyY2xlc0xheWVyKCkge1xuICAgIHRoaXMuY2lyY2xlc0xheWVyLnVwZGF0ZSh0aGlzLCB0aGlzLmlkKTtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlUG9pbnRzTGF5ZXIoKSB7XG4gICAgaWYgKHRoaXMuX2NlbnRlcikge1xuICAgICAgdGhpcy5wb2ludHNMYXllci51cGRhdGUodGhpcy5fY2VudGVyLCB0aGlzLl9jZW50ZXIuZ2V0SWQoKSk7XG4gICAgfVxuICAgIGlmICh0aGlzLl9yYWRpdXNQb2ludCkge1xuICAgICAgdGhpcy5wb2ludHNMYXllci51cGRhdGUodGhpcy5fcmFkaXVzUG9pbnQsIHRoaXMuX3JhZGl1c1BvaW50LmdldElkKCkpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlQXJjc0xheWVyKCkge1xuICAgIGlmICghdGhpcy5fb3V0bGluZUFyYykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmFyY3NMYXllci51cGRhdGUodGhpcy5fb3V0bGluZUFyYywgdGhpcy5fb3V0bGluZUFyYy5nZXRJZCgpKTtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlT3V0bGluZUFyYygpIHtcbiAgICBpZiAoIXRoaXMuX2NlbnRlciB8fCAhdGhpcy5fcmFkaXVzUG9pbnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5fb3V0bGluZUFyYyA9IG5ldyBFZGl0QXJjKHRoaXMuaWQsIHRoaXMuZ2V0Q2VudGVyKCksIHRoaXMuZ2V0UmFkaXVzKCksIE1hdGguUEkgKiAyLCAwLCB0aGlzLnBvbHlsaW5lUHJvcHMpO1xuICB9XG59XG4iXX0=