angular-cesium
Version:
Angular library for working with Cesium.
273 lines • 31.9 kB
JavaScript
import { __decorate, __metadata } from "tslib";
import { Injectable } from '@angular/core';
import { SceneMode } from '../../models/scene-mode.enum';
/**
* The service exposes the scene's camera and screenSpaceCameraController
* SceneMode.PERFORMANCE_SCENE2D - is a 3D scene mode that acts like Cesium 2D mode,
* but is more efficient performance wise.
*/
var CameraService = /** @class */ (function () {
function CameraService() {
this.isSceneModePerformance2D = false;
}
CameraService_1 = CameraService;
CameraService.prototype.init = function (cesiumService) {
this.viewer = cesiumService.getViewer();
this.scene = cesiumService.getScene();
this.screenSpaceCameraController = this.scene.screenSpaceCameraController;
this.camera = this.scene.camera;
this.lastRotate = this.screenSpaceCameraController.enableRotate;
this.lastTilt = this.screenSpaceCameraController.enableTilt;
this.lastLook = this.screenSpaceCameraController.enableLook;
};
CameraService.prototype._listenToSceneModeMorph = function (callback) {
this.morphListenerCancelFn = this.scene.morphStart.addEventListener(callback);
};
CameraService.prototype._revertCameraProperties = function () {
this.isSceneModePerformance2D = false;
this.enableTilt(this.lastTilt);
this.enableRotate(this.lastRotate);
this.enableLook(this.lastLook);
};
/**
* Gets the scene's camera
*/
CameraService.prototype.getCamera = function () {
return this.camera;
};
/**
* Gets the scene's screenSpaceCameraController
*/
CameraService.prototype.getScreenSpaceCameraController = function () {
return this.screenSpaceCameraController;
};
/**
* Gets the minimum zoom value in meters
*/
CameraService.prototype.getMinimumZoom = function () {
return this.screenSpaceCameraController.minimumZoomDistance;
};
/**
* Sets the minimum zoom value in meters
* @param zoom amount
*/
CameraService.prototype.setMinimumZoom = function (amount) {
this.screenSpaceCameraController.minimumZoomDistance = amount;
};
/**
* Gets the maximum zoom value in meters
*/
CameraService.prototype.getMaximumZoom = function () {
return this.screenSpaceCameraController.maximumZoomDistance;
};
/**
* Sets the maximum zoom value in meters
* @param zoom amount
*/
CameraService.prototype.setMaximumZoom = function (amount) {
this.screenSpaceCameraController.maximumZoomDistance = amount;
};
/**
* Sets if the camera is able to tilt
*/
CameraService.prototype.enableTilt = function (tilt) {
this.screenSpaceCameraController.enableTilt = tilt;
};
/**
* Sets if the camera is able to rotate
*/
CameraService.prototype.enableRotate = function (rotate) {
this.screenSpaceCameraController.enableRotate = rotate;
};
/**
* Sets if the camera is able to free-look
*/
CameraService.prototype.enableLook = function (lock) {
this.screenSpaceCameraController.enableLook = lock;
};
/**
* Sets if the camera is able to translate
*/
CameraService.prototype.enableTranslate = function (translate) {
this.screenSpaceCameraController.enableTranslate = translate;
};
/**
* Sets if the camera is able to zoom
*/
CameraService.prototype.enableZoom = function (zoom) {
this.screenSpaceCameraController.enableZoom = zoom;
};
/**
* Sets if the camera receives inputs
*/
CameraService.prototype.enableInputs = function (inputs) {
this.screenSpaceCameraController.enableInputs = inputs;
};
/**
* Sets the map's SceneMode
* @param sceneMode - The SceneMode to morph the scene into.
* @param duration - The duration of scene morph animations, in seconds
*/
CameraService.prototype.setSceneMode = function (sceneMode, duration) {
var _this = this;
switch (sceneMode) {
case SceneMode.SCENE3D: {
if (this.isSceneModePerformance2D) {
this._revertCameraProperties();
}
this.scene.morphTo3D(duration);
break;
}
case SceneMode.COLUMBUS_VIEW: {
if (this.isSceneModePerformance2D) {
this._revertCameraProperties();
}
this.scene.morphToColumbusView(duration);
break;
}
case SceneMode.SCENE2D: {
if (this.isSceneModePerformance2D) {
this._revertCameraProperties();
}
this.scene.morphTo2D(duration);
break;
}
case SceneMode.PERFORMANCE_SCENE2D: {
this.isSceneModePerformance2D = true;
this.lastLook = this.screenSpaceCameraController.enableLook;
this.lastTilt = this.screenSpaceCameraController.enableTilt;
this.lastRotate = this.screenSpaceCameraController.enableRotate;
this.screenSpaceCameraController.enableTilt = false;
this.screenSpaceCameraController.enableRotate = false;
this.screenSpaceCameraController.enableLook = false;
if (this.morphListenerCancelFn) {
this.morphListenerCancelFn();
}
this.scene.morphToColumbusView(duration);
var morphCompleteEventListener_1 = this.scene.morphComplete.addEventListener(function () {
_this.camera.setView({
destination: Cesium.Cartesian3.fromDegrees(0.0, 0.0, Math.min(CameraService_1.PERFORMANCE_2D_ALTITUDE, _this.getMaximumZoom())),
orientation: {
pitch: Cesium.Math.toRadians(-90)
}
});
morphCompleteEventListener_1();
_this._listenToSceneModeMorph(_this._revertCameraProperties.bind(_this));
});
break;
}
}
};
/**
* Flies the camera to a destination
* API: https://cesiumjs.org/Cesium/Build/Documentation/Camera.html?classFilter=cam#flyTo
*/
CameraService.prototype.cameraFlyTo = function (options) {
return this.camera.flyTo(options);
};
/**
* Flies the camera to a target
* API: https://cesiumjs.org/Cesium/Build/Documentation/Viewer.html?classFilter=viewer#flyTo
* @returns Promise<boolean>
*/
CameraService.prototype.flyTo = function (target, options) {
return this.viewer.flyTo(target, options);
};
/**
* Zooms amount along the camera's view vector.
* API: https://cesiumjs.org/Cesium/Build/Documentation/Camera.html#zoomIn
*/
CameraService.prototype.zoomIn = function (amount) {
return this.camera.zoomIn(amount || this.camera.defaultZoomAmount);
};
/**
* Zooms amount along the opposite direction of the camera's view vector.
* API: https://cesiumjs.org/Cesium/Build/Documentation/Camera.html#zoomOut
*/
CameraService.prototype.zoomOut = function (amount) {
return this.camera.zoomOut(amount || this.camera.defaultZoomAmount);
};
/**
* Zoom the camera to a target
* API: https://cesiumjs.org/Cesium/Build/Documentation/Viewer.html?classFilter=viewer#zoomTo
* @returns Promise<boolean>
*/
CameraService.prototype.zoomTo = function (target, offset) {
return this.viewer.zoomTo(target, offset);
};
/**
* Flies the camera to a destination
* API: https://cesiumjs.org/Cesium/Build/Documentation/Camera.html?classFilter=camera#setView
* @param options viewer options
*/
CameraService.prototype.setView = function (options) {
this.camera.setView(options);
};
/**
* Set camera's rotation
*/
CameraService.prototype.setRotation = function (degreesInRadians) {
this.setView({ orientation: { heading: degreesInRadians } });
};
/**
* Locks or unlocks camera rotation
*/
CameraService.prototype.lockRotation = function (lock) {
this.scene.screenSpaceCameraController.enableRotate = !lock;
};
/**
* Make the camera track a specific entity
* API: https://cesiumjs.org/Cesium/Build/Documentation/Viewer.html?classFilter=viewer#trackedEntity
* @param cesiumEntity - cesium entity( billboard, polygon...) to track
* @param options - track entity options
*/
CameraService.prototype.trackEntity = function (cesiumEntity, options) {
var _this = this;
var flyTo = (options && options.flyTo) || false;
this.viewer.trackedEntity = undefined;
return new Promise(function (resolve) {
if (flyTo) {
var flyToDuration = (options && options.flyToDuration) || 1;
var altitude = (options && options.altitude) || 10000;
// Calc entity flyTo position and wanted altitude
var entPosCar3 = cesiumEntity.position.getValue(Cesium.JulianDate.now());
var entPosCart = Cesium.Cartographic.fromCartesian(entPosCar3);
var zoomAmount_1 = altitude - entPosCart.height;
entPosCart.height = altitude;
var flyToPosition = Cesium.Cartesian3.fromRadians(entPosCart.longitude, entPosCart.latitude, entPosCart.height);
_this.cameraFlyTo({
duration: flyToDuration,
destination: flyToPosition,
complete: function () {
_this.viewer.trackedEntity = cesiumEntity;
setTimeout(function () {
if (zoomAmount_1 > 0) {
_this.camera.zoomOut(zoomAmount_1);
}
else {
_this.camera.zoomIn(zoomAmount_1);
}
}, 0);
resolve();
}
});
}
else {
_this.viewer.trackedEntity = cesiumEntity;
resolve();
}
});
};
CameraService.prototype.untrackEntity = function () {
this.trackEntity();
};
var CameraService_1;
CameraService.PERFORMANCE_2D_ALTITUDE = 25000000;
CameraService = CameraService_1 = __decorate([
Injectable(),
__metadata("design:paramtypes", [])
], CameraService);
return CameraService;
}());
export { CameraService };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FtZXJhLnNlcnZpY2UuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9hbmd1bGFyLWNlc2l1bS8iLCJzb3VyY2VzIjpbImxpYi9hbmd1bGFyLWNlc2l1bS9zZXJ2aWNlcy9jYW1lcmEvY2FtZXJhLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFM0MsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBRXpEOzs7O0dBSUc7QUFFSDtJQWFFO1FBRlEsNkJBQXdCLEdBQUcsS0FBSyxDQUFDO0lBR3pDLENBQUM7c0JBZFUsYUFBYTtJQWdCeEIsNEJBQUksR0FBSixVQUFLLGFBQTRCO1FBQy9CLElBQUksQ0FBQyxNQUFNLEdBQUcsYUFBYSxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBQ3hDLElBQUksQ0FBQyxLQUFLLEdBQUcsYUFBYSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ3RDLElBQUksQ0FBQywyQkFBMkIsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLDJCQUEyQixDQUFDO1FBQzFFLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUM7UUFDaEMsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsMkJBQTJCLENBQUMsWUFBWSxDQUFDO1FBQ2hFLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLDJCQUEyQixDQUFDLFVBQVUsQ0FBQztRQUM1RCxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQywyQkFBMkIsQ0FBQyxVQUFVLENBQUM7SUFDOUQsQ0FBQztJQUVELCtDQUF1QixHQUF2QixVQUF3QixRQUFrQjtRQUN4QyxJQUFJLENBQUMscUJBQXFCLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsZ0JBQWdCLENBQ2pFLFFBQVEsQ0FDVCxDQUFDO0lBQ0osQ0FBQztJQUVELCtDQUF1QixHQUF2QjtR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cmUnO1xuaW1wb3J0IHsgQ2VzaXVtU2VydmljZSB9IGZyb20gJy4uL2Nlc2l1bS9jZXNpdW0uc2VydmljZSc7XG5pbXBvcnQgeyBTY2VuZU1vZGUgfSBmcm9tICcuLi8uLi9tb2RlbHMvc2NlbmUtbW9kZS5lbnVtJztcblxuLyoqXG4gKiAgVGhlIHNlcnZpY2UgZXhwb3NlcyB0aGUgc2NlbmUncyBjYW1lcmEgYW5kIHNjcmVlblNwYWNlQ2FtZXJhQ29udHJvbGxlclxuICogIFNjZW5lTW9kZS5QRVJGT1JNQU5DRV9TQ0VORTJEIC0gIGlzIGEgM0Qgc2NlbmUgbW9kZSB0aGF0IGFjdHMgbGlrZSBDZXNpdW0gMkQgbW9kZSxcbiAqICBidXQgaXMgbW9yZSBlZmZpY2llbnQgcGVyZm9ybWFuY2Ugd2lzZS5cbiAqL1xuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIENhbWVyYVNlcnZpY2Uge1xuICBzdGF0aWMgUEVSRk9STUFOQ0VfMkRfQUxUSVRVREUgPSAyNTAwMDAwMDtcblxuICBwcml2YXRlIHZpZXdlcjogYW55O1xuICBwcml2YXRlIHNjZW5lOiBhbnk7XG4gIHByaXZhdGUgY2FtZXJhOiBhbnk7XG4gIHByaXZhdGUgc2NyZWVuU3BhY2VDYW1lcmFDb250cm9sbGVyOiBhbnk7XG4gIHByaXZhdGUgbW9ycGhMaXN0ZW5lckNhbmNlbEZuOiBhbnk7XG4gIHByaXZhdGUgbGFzdFJvdGF0ZTogYm9vbGVhbjtcbiAgcHJpdmF0ZSBsYXN0VGlsdDogYm9vbGVhbjtcbiAgcHJpdmF0ZSBsYXN0TG9vazogYm9vbGVhbjtcbiAgcHJpdmF0ZSBpc1NjZW5lTW9kZVBlcmZvcm1hbmNlMkQgPSBmYWxzZTtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgfVxuXG4gIGluaXQoY2VzaXVtU2VydmljZTogQ2VzaXVtU2VydmljZSkge1xuICAgIHRoaXMudmlld2VyID0gY2VzaXVtU2VydmljZS5nZXRWaWV3ZXIoKTtcbiAgICB0aGlzLnNjZW5lID0gY2VzaXVtU2VydmljZS5nZXRTY2VuZSgpO1xuICAgIHRoaXMuc2NyZWVuU3BhY2VDYW1lcmFDb250cm9sbGVyID0gdGhpcy5zY2VuZS5zY3JlZW5TcGFjZUNhbWVyYUNvbnRyb2xsZXI7XG4gICAgdGhpcy5jYW1lcmEgPSB0aGlzLnNjZW5lLmNhbWVyYTtcbiAgICB0aGlzLmxhc3RSb3RhdGUgPSB0aGlzLnNjcmVlblNwYWNlQ2FtZXJhQ29udHJvbGxlci5lbmFibGVSb3RhdGU7XG4gICAgdGhpcy5sYXN0VGlsdCA9IHRoaXMuc2NyZWVuU3BhY2VDYW1lcmFDb250cm9sbGVyLmVuYWJsZVRpbHQ7XG4gICAgdGhpcy5sYXN0TG9vayA9IHRoaXMuc2NyZWVuU3BhY2VDYW1lcmFDb250cm9sbGVyLmVuYWJsZUxvb2s7XG4gIH1cblxuICBfbGlzdGVuVG9TY2VuZU1vZGVNb3JwaChjYWxsYmFjazogRnVuY3Rpb24pIHtcbiAgICB0aGlzLm1vcnBoTGlzdGVuZXJDYW5jZWxGbiA9IHRoaXMuc2NlbmUubW9ycGhTdGFydC5hZGRFdmVudExpc3RlbmVyKFxuICAgICAgY2FsbGJhY2tcbiAgICApO1xuICB9XG5cbiAgX3JldmVydENhbWVyYVByb3BlcnRpZXMoKSB7XG4gICAgdGhpcy5pc1NjZW5lTW9kZVBlcmZvcm1hbmNlMkQgPSBmYWxzZTtcbiAgICB0aGlzLmVuYWJsZVRpbHQodGhpcy5sYXN0VGlsdCk7XG4gICAgdGhpcy5lbmFibGVSb3RhdGUodGhpcy5sYXN0Um90YXRlKTtcbiAgICB0aGlzLmVuYWJsZUxvb2sodGhpcy5sYXN0TG9vayk7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgc2NlbmUncyBjYW1lcmFcbiAgICovXG4gIGdldENhbWVyYSgpIHtcbiAgICByZXR1cm4gdGhpcy5jYW1lcmE7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgc2NlbmUncyBzY3JlZW5TcGFjZUNhbWVyYUNvbnRyb2xsZXJcbiAgICovXG4gIGdldFNjcmVlblNwYWNlQ2FtZXJhQ29udHJvbGxlcigpIHtcbiAgICByZXR1cm4gdGhpcy5zY3JlZW5TcGFjZUNhbWVyYUNvbnRyb2xsZXI7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgbWluaW11bSB6b29tIHZhbHVlIGluIG1ldGVyc1xuICAgKi9cbiAgZ2V0TWluaW11bVpvb20oKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5zY3JlZW5TcGFjZUNhbWVyYUNvbnRyb2xsZXIubWluaW11bVpvb21EaXN0YW5jZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSBtaW5pbXVtIHpvb20gdmFsdWUgaW4gbWV0ZXJzXG4gICAqIEBwYXJhbSB6b29tIGFtb3VudFxuICAgKi9cbiAgc2V0TWluaW11bVpvb20oYW1vdW50OiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLnNjcmVlblNwYWNlQ2FtZXJhQ29udHJvbGxlci5taW5pbXVtWm9vbURpc3RhbmNlID0gYW1vdW50O1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIG1heGltdW0gem9vbSB2YWx1ZSBpbiBtZXRlcnNcbiAgICovXG4gIGdldE1heGltdW1ab29tKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuc2NyZWVuU3BhY2VDYW1lcmFDb250cm9sbGVyLm1heGltdW1ab29tRGlzdGFuY2U7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGUgbWF4aW11bSB6b29tIHZhbHVlIGluIG1ldGVyc1xuICAgKiBAcGFyYW0gem9vbSBhbW91bnRcbiAgICovXG4gIHNldE1heGltdW1ab29tKGFtb3VudDogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5zY3JlZW5TcGFjZUNhbWVyYUNvbnRyb2xsZXIubWF4aW11bVpvb21EaXN0YW5jZSA9IGFtb3VudDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIGlmIHRoZSBjYW1lcmEgaXMgYWJsZSB0byB0aWx0XG4gICAqL1xuICBlbmFibGVUaWx0KHRpbHQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLnNjcmVlblNwYWNlQ2FtZXJhQ29udHJvbGxlci5lbmFibGVUaWx0ID0gdGlsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIGlmIHRoZSBjYW1lcmEgaXMgYWJsZSB0byByb3RhdGVcbiAgICovXG4gIGVuYWJsZVJvdGF0ZShyb3RhdGU6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLnNjcmVlblNwYWNlQ2FtZXJhQ29udHJvbGxlci5lbmFibGVSb3RhdGUgPSByb3RhdGU7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyBpZiB0aGUgY2FtZXJhIGlzIGFibGUgdG8gZnJlZS1sb29rXG4gICAqL1xuICBlbmFibGVMb29rKGxvY2s6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLnNjcmVlblNwYWNlQ2FtZXJhQ29udHJvbGxlci5lbmFibGVMb29rID0gbG9jaztcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIGlmIHRoZSBjYW1lcmEgaXMgYWJsZSB0byB0cmFuc2xhdGVcbiAgICovXG4gIGVuYWJsZVRyYW5zbGF0ZSh0cmFuc2xhdGU6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLnNjcmVlblNwYWNlQ2FtZXJhQ29udHJvbGxlci5lbmFibGVUcmFuc2xhdGUgPSB0cmFuc2xhdGU7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyBpZiB0aGUgY2FtZXJhIGlzIGFibGUgdG8gem9vbVxuICAgKi9cbiAgZW5hYmxlWm9vbSh6b29tOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5zY3JlZW5TcGFjZUNhbWVyYUNvbnRyb2xsZXIuZW5hYmxlWm9vbSA9IHpvb207XG4gIH1cblxuICAvKipcbiAgICogU2V0cyBpZiB0aGUgY2FtZXJhIHJlY2VpdmVzIGlucHV0c1xuICAgKi9cbiAgZW5hYmxlSW5wdXRzKGlucHV0czogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMuc2NyZWVuU3BhY2VDYW1lcmFDb250cm9sbGVyLmVuYWJsZUlucHV0cyA9IGlucHV0cztcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSBtYXAncyBTY2VuZU1vZGVcbiAgICogQHBhcmFtIHNjZW5lTW9kZSAtIFRoZSBTY2VuZU1vZGUgdG8gbW9ycGggdGhlIHNjZW5lIGludG8uXG4gICAqIEBwYXJhbSBkdXJhdGlvbiAtIFRoZSBkdXJhdGlvbiBvZiBzY2VuZSBtb3JwaCBhbmltYXRpb25zLCBpbiBzZWNvbmRzXG4gICAqL1xuICBzZXRTY2VuZU1vZGUoc2NlbmVNb2RlOiBTY2VuZU1vZGUsIGR1cmF0aW9uPzogbnVtYmVyKSB7XG4gICAgc3dpdGNoIChzY2VuZU1vZGUpIHtcbiAgICAgIGNhc2UgU2NlbmVNb2RlLlNDRU5FM0Q6IHtcbiAgICAgICAgaWYgKHRoaXMuaXNTY2VuZU1vZGVQZXJmb3JtYW5jZTJEKSB7XG4gICAgICAgICAgdGhpcy5fcmV2ZXJ0Q2FtZXJhUHJvcGVydGllcygpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5zY2VuZS5tb3JwaFRvM0QoZHVyYXRpb24pO1xuXG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSBTY2VuZU1vZGUuQ09MVU1CVVNfVklFVzoge1xuICAgICAgICBpZiAodGhpcy5pc1NjZW5lTW9kZVBlcmZvcm1hbmNlMkQpIHtcbiAgICAgICAgICB0aGlzLl9yZXZlcnRDYW1lcmFQcm9wZXJ0aWVzKCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnNjZW5lLm1vcnBoVG9Db2x1bWJ1c1ZpZXcoZHVyYXRpb24pO1xuXG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSBTY2VuZU1vZGUuU0NFTkUyRDoge1xuICAgICAgICBpZiAodGhpcy5pc1NjZW5lTW9kZVBlcmZvcm1hbmNlMkQpIHtcbiAgICAgICAgICB0aGlzLl9yZXZlcnRDYW1lcmFQcm9wZXJ0aWVzKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zY2VuZS5tb3JwaFRvMkQoZHVyYXRpb24pO1xuXG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSBTY2VuZU1vZGUuUEVSRk9STUFOQ0VfU0NFTkUyRDoge1xuICAgICAgICB0aGlzLmlzU2NlbmVNb2RlUGVyZm9ybWFuY2UyRCA9IHRydWU7XG4gICAgICAgIHRoaXMubGFzdExvb2sgPSB0aGlzLnNjcmVlblNwYWNlQ2FtZXJhQ29udHJvbGxlci5lbmFibGVMb29rO1xuICAgICAgICB0aGlzLmxhc3RUaWx0ID0gdGhpcy5zY3JlZW5TcGFjZUNhbWVyYUNvbnRyb2xsZXIuZW5hYmxlVGlsdDtcbiAgICAgICAgdGhpcy5sYXN0Um90YXRlID0gdGhpcy5zY3JlZW5TcGFjZUNhbWVyYUNvbnRyb2xsZXIuZW5hYmxlUm90YXRlO1xuICAgICAgICB0aGlzLnNjcmVlblNwYWNlQ2FtZXJhQ29udHJvbGxlci5lbmFibGVUaWx0ID0gZmFsc2U7XG4gICAgICAgIHRoaXMuc2NyZWVuU3BhY2VDYW1lcmFDb250cm9sbGVyLmVuYWJsZVJvdGF0ZSA9IGZhbHNlO1xuICAgICAgICB0aGlzLnNjcmVlblNwYWNlQ2FtZXJhQ29udHJvbGxlci5lbmFibGVMb29rID0gZmFsc2U7XG4gICAgICAgIGlmICh0aGlzLm1vcnBoTGlzdGVuZXJDYW5jZWxGbikge1xuICAgICAgICAgIHRoaXMubW9ycGhMaXN0ZW5lckNhbmNlbEZuKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zY2VuZS5tb3JwaFRvQ29sdW1idXNWaWV3KGR1cmF0aW9uKTtcbiAgICAgICAgY29uc3QgbW9ycGhDb21wbGV0ZUV2ZW50TGlzdGVuZXIgPSB0aGlzLnNjZW5lLm1vcnBoQ29tcGxldGUuYWRkRXZlbnRMaXN0ZW5lcihcbiAgICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmNhbWVyYS5zZXRWaWV3KHtcbiAgICAgICAgICAgICAgZGVzdGluYXRpb246IENlc2l1bS5DYXJ0ZXNpYW4zLmZyb21EZWdyZWVzKFxuICAgICAgICAgICAgICAgIDAuMCxcbiAgICAgICAgICAgICAgICAwLjAsXG4gICAgICAgICAgICAgICAgTWF0aC5taW4oXG4gICAgICAgICAgICAgICAgICBDYW1lcmFTZXJ2aWNlLlBFUkZPUk1BTkNFXzJEX0FMVElUVURFLFxuICAgICAgICAgICAgICAgICAgdGhpcy5nZXRNYXhpbXVtWm9vbSgpXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICBvcmllbnRhdGlvbjoge1xuICAgICAgICAgICAgICAgIHBpdGNoOiBDZXNpdW0uTWF0aC50b1JhZGlhbnMoLTkwKVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIG1vcnBoQ29tcGxldGVFdmVudExpc3RlbmVyKCk7XG4gICAgICAgICAgICB0aGlzLl9saXN0ZW5Ub1NjZW5lTW9kZU1vcnBoKFxuICAgICAgICAgICAgICB0aGlzLl9yZXZlcnRDYW1lcmFQcm9wZXJ0aWVzLmJpbmQodGhpcylcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICApO1xuXG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBGbGllcyB0aGUgY2FtZXJhIHRvIGEgZGVzdGluYXRpb25cbiAgICogQVBJOiBodHRwczovL2Nlc2l1bWpzLm9yZy9DZXNpdW0vQnVpbGQvRG9jdW1lbnRhdGlvbi9DYW1lcmEuaHRtbD9jbGFzc0ZpbHRlcj1jYW0jZmx5VG9cbiAgICovXG4gIGNhbWVyYUZseVRvKG9wdGlvbnM6IGFueSkge1xuICAgIHJldHVybiB0aGlzLmNhbWVyYS5mbHlUbyhvcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGbGllcyB0aGUgY2FtZXJhIHRvIGEgdGFyZ2V0XG4gICAqIEFQSTogaHR0cHM6Ly9jZXNpdW1qcy5vcmcvQ2VzaXVtL0J1aWxkL0RvY3VtZW50YXRpb24vVmlld2VyLmh0bWw/Y2xhc3NGaWx0ZXI9dmlld2VyI2ZseVRvXG4gICAqIEByZXR1cm5zIFByb21pc2U8Ym9vbGVhbj5cbiAgICovXG4gIGZseVRvKHRhcmdldDogYW55LCBvcHRpb25zPzogYW55KSB7XG4gICAgcmV0dXJuIHRoaXMudmlld2VyLmZseVRvKHRhcmdldCwgb3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogWm9vbXMgYW1vdW50IGFsb25nIHRoZSBjYW1lcmEncyB2aWV3IHZlY3Rvci5cbiAgICogQVBJOiBodHRwczovL2Nlc2l1bWpzLm9yZy9DZXNpdW0vQnVpbGQvRG9jdW1lbnRhdGlvbi9DYW1lcmEuaHRtbCN6b29tSW5cbiAgICovXG4gIHpvb21JbihhbW91bnQ6IG51bWJlcikge1xuICAgIHJldHVybiB0aGlzLmNhbWVyYS56b29tSW4oYW1vdW50IHx8IHRoaXMuY2FtZXJhLmRlZmF1bHRab29tQW1vdW50KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBab29tcyBhbW91bnQgYWxvbmcgdGhlIG9wcG9zaXRlIGRpcmVjdGlvbiBvZiB0aGUgY2FtZXJhJ3MgdmlldyB2ZWN0b3IuXG4gICAqIEFQSTogaHR0cHM6Ly9jZXNpdW1qcy5vcmcvQ2VzaXVtL0J1aWxkL0RvY3VtZW50YXRpb24vQ2FtZXJhLmh0bWwjem9vbU91dFxuICAgKi9cbiAgem9vbU91dChhbW91bnQ6IG51bWJlcikge1xuICAgIHJldHVybiB0aGlzLmNhbWVyYS56b29tT3V0KGFtb3VudCB8fCB0aGlzLmNhbWVyYS5kZWZhdWx0Wm9vbUFtb3VudCk7XG4gIH1cblxuICAvKipcbiAgICogWm9vbSB0aGUgY2FtZXJhIHRvIGEgdGFyZ2V0XG4gICAqIEFQSTogaHR0cHM6Ly9jZXNpdW1qcy5vcmcvQ2VzaXVtL0J1aWxkL0RvY3VtZW50YXRpb24vVmlld2VyLmh0bWw/Y2xhc3NGaWx0ZXI9dmlld2VyI3pvb21Ub1xuICAgKiBAcmV0dXJucyBQcm9taXNlPGJvb2xlYW4+XG4gICAqL1xuICB6b29tVG8odGFyZ2V0OiBhbnksIG9mZnNldD86IGFueSkge1xuICAgIHJldHVybiB0aGlzLnZpZXdlci56b29tVG8odGFyZ2V0LCBvZmZzZXQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZsaWVzIHRoZSBjYW1lcmEgdG8gYSBkZXN0aW5hdGlvblxuICAgKiBBUEk6IGh0dHBzOi8vY2VzaXVtanMub3JnL0Nlc2l1bS9CdWlsZC9Eb2N1bWVudGF0aW9uL0NhbWVyYS5odG1sP2NsYXNzRmlsdGVyPWNhbWVyYSNzZXRWaWV3XG4gICAqIEBwYXJhbSBvcHRpb25zIHZpZXdlciBvcHRpb25zXG4gICAqL1xuICBzZXRWaWV3KG9wdGlvbnM6IGFueSkge1xuICAgIHRoaXMuY2FtZXJhLnNldFZpZXcob3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogU2V0IGNhbWVyYSdzIHJvdGF0aW9uXG4gICAqL1xuICBzZXRSb3RhdGlvbihkZWdyZWVzSW5SYWRpYW5zOiBudW1iZXIpIHtcbiAgICB0aGlzLnNldFZpZXcoe29yaWVudGF0aW9uOiB7aGVhZGluZzogZGVncmVlc0luUmFkaWFuc319KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMb2NrcyBvciB1bmxvY2tzIGNhbWVyYSByb3RhdGlvblxuICAgKi9cbiAgbG9ja1JvdGF0aW9uKGxvY2s6IGJvb2xlYW4pIHtcbiAgICB0aGlzLnNjZW5lLnNjcmVlblNwYWNlQ2FtZXJhQ29udHJvbGxlci5lbmFibGVSb3RhdGUgPSAhbG9jaztcbiAgfVxuXG4gIC8qKlxuICAgKiBNYWtlIHRoZSBjYW1lcmEgdHJhY2sgYSBzcGVjaWZpYyBlbnRpdHlcbiAgICogQVBJOiBodHRwczovL2Nlc2l1bWpzLm9yZy9DZXNpdW0vQnVpbGQvRG9jdW1lbnRhdGlvbi9WaWV3ZXIuaHRtbD9jbGFzc0ZpbHRlcj12aWV3ZXIjdHJhY2tlZEVudGl0eVxuICAgKiBAcGFyYW0gY2VzaXVtRW50aXR5IC0gY2VzaXVtIGVudGl0eSggYmlsbGJvYXJkLCBwb2x5Z29uLi4uKSB0byB0cmFja1xuICAgKiBAcGFyYW0gb3B0aW9ucyAtIHRyYWNrIGVudGl0eSBvcHRpb25zXG4gICAqL1xuICB0cmFja0VudGl0eShcbiAgICBjZXNpdW1FbnRpdHk/OiBhbnksXG4gICAgb3B0aW9ucz86IHsgZmx5VG86IGJvb2xlYW47IGZseVRvRHVyYXRpb24/OiBudW1iZXI7IGFsdGl0dWRlPzogbnVtYmVyIH1cbiAgKSB7XG4gICAgY29uc3QgZmx5VG8gPSAob3B0aW9ucyAmJiBvcHRpb25zLmZseVRvKSB8fCBmYWxzZTtcblxuICAgIHRoaXMudmlld2VyLnRyYWNrZWRFbnRpdHkgPSB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKHJlc29sdmUgPT4ge1xuICAgICAgaWYgKGZseVRvKSB7XG4gICAgICAgIGNvbnN0IGZseVRvRHVyYXRpb24gPSAob3B0aW9ucyAmJiBvcHRpb25zLmZseVRvRHVyYXRpb24pIHx8IDE7XG4gICAgICAgIGNvbnN0IGFsdGl0dWRlID0gKG9wdGlvbnMgJiYgb3B0aW9ucy5hbHRpdHVkZSkgfHwgMTAwMDA7XG5cbiAgICAgICAgLy8gQ2FsYyBlbnRpdHkgZmx5VG8gcG9zaXRpb24gYW5kIHdhbnRlZCBhbHRpdHVkZVxuICAgICAgICBjb25zdCBlbnRQb3NDYXIzID0gY2VzaXVtRW50aXR5LnBvc2l0aW9uLmdldFZhbHVlKENlc2l1bS5KdWxpYW5EYXRlLm5vdygpKTtcbiAgICAgICAgY29uc3QgZW50UG9zQ2FydCA9IENlc2l1bS5DYXJ0b2dyYXBoaWMuZnJvbUNhcnRlc2lhbihlbnRQb3NDYXIzKTtcbiAgICAgICAgY29uc3Qgem9vbUFtb3VudCA9IGFsdGl0dWRlIC0gZW50UG9zQ2FydC5oZWlnaHQ7XG4gICAgICAgIGVudFBvc0NhcnQuaGVpZ2h0ID0gYWx0aXR1ZGU7XG4gICAgICAgIGNvbnN0IGZseVRvUG9zaXRpb24gPSBDZXNpdW0uQ2FydGVzaWFuMy5mcm9tUmFkaWFucyhcbiAgICAgICAgICBlbnRQb3NDYXJ0LmxvbmdpdHVkZSxcbiAgICAgICAgICBlbnRQb3NDYXJ0LmxhdGl0dWRlLFxuICAgICAgICAgIGVudFBvc0NhcnQuaGVpZ2h0XG4gICAgICAgICk7XG5cbiAgICAgICAgdGhpcy5jYW1lcmFGbHlUbyh7XG4gICAgICAgICAgZHVyYXRpb246IGZseVRvRHVyYXRpb24sXG4gICAgICAgICAgZGVzdGluYXRpb246IGZseVRvUG9zaXRpb24sXG4gICAgICAgICAgY29tcGxldGU6ICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMudmlld2VyLnRyYWNrZWRFbnRpdHkgPSBjZXNpdW1FbnRpdHk7XG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgaWYgKHpvb21BbW91bnQgPiAwKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jYW1lcmEuem9vbU91dCh6b29tQW1vdW50KTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNhbWVyYS56b29tSW4oem9vbUFtb3VudCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sIDApO1xuICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnZpZXdlci50cmFja2VkRW50aXR5ID0gY2VzaXVtRW50aXR5O1xuICAgICAgICByZXNvbHZlKCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICB1bnRyYWNrRW50aXR5KCkge1xuICAgIHRoaXMudHJhY2tFbnRpdHkoKTtcbiAgfVxufVxuIl19