iceye-angular-cesium-fork
Version:
Angular library for working with Cesium.
353 lines • 51.3 kB
JavaScript
import { from as observableFrom, merge as observableMerge, Subject } from 'rxjs';
import { takeUntil } from 'rxjs/operators';
// tslint:disable
import { BillboardDrawerService } from '../../services/drawers/billboard-drawer/billboard-drawer.service';
import { ChangeDetectionStrategy, Component, Input } from '@angular/core';
import { LayerService } from '../../services/layer-service/layer-service.service';
import { ActionType } from '../../models/action-type.enum';
import { ComputationCache } from '../../services/computation-cache/computation-cache.service';
import { LabelDrawerService } from '../../services/drawers/label-drawer/label-drawer.service';
import { EllipseDrawerService } from '../../services/drawers/ellipse-drawer/ellipse-drawer.service';
import { PolylineDrawerService } from '../../services/drawers/polyline-drawer/polyline-drawer.service';
import { ArcDrawerService } from '../../services/drawers/arc-drawer/arc-drawer.service';
import { PointDrawerService } from '../../services/drawers/point-drawer/point-drawer.service';
import { PolygonDrawerService } from '../../services/drawers/polygon-drawer/polygon-drawer.service';
import { DynamicEllipseDrawerService } from '../../services/drawers/static-dynamic/ellipse-drawer/dynamic-ellipse-drawer.service';
import { DynamicPolylineDrawerService } from '../../services/drawers/static-dynamic/dynamic-polyline-drawer/dynamic-polyline-drawer.service';
import { StaticCircleDrawerService } from '../../services/drawers/static-dynamic/static-circle-drawer/static-circle-drawer.service';
import { StaticPolylineDrawerService } from '../../services/drawers/static-dynamic/static-polyline-drawer/static-polyline-drawer.service';
import { StaticPolygonDrawerService } from '../../services/drawers/static-dynamic/static-polygon-drawer/polygon-drawer.service';
import { StaticEllipseDrawerService } from '../../services/drawers/static-dynamic/ellipse-drawer/ellipse-drawer.service';
import { ModelDrawerService } from '../../services/drawers/model-drawer/model-drawer.service';
import { BoxDrawerService } from '../../services/drawers/box-dawer/box-drawer.service';
import { CorridorDrawerService } from '../../services/drawers/corridor-dawer/corridor-drawer.service';
import { CylinderDrawerService } from '../../services/drawers/cylinder-dawer/cylinder-drawer.service';
import { EllipsoidDrawerService } from '../../services/drawers/ellipoid-drawer/ellipsoid-drawer.service';
import { PolylineVolumeDrawerService } from '../../services/drawers/polyline-volume-dawer/polyline-volume-drawer.service';
import { WallDrawerService } from '../../services/drawers/wall-dawer/wall-drawer.service';
import { RectangleDrawerService } from '../../services/drawers/rectangle-dawer/rectangle-drawer.service';
import { PolylinePrimitiveDrawerService } from '../../services/drawers/polyline-primitive-drawer/polyline-primitive-drawer.service';
import { LabelPrimitiveDrawerService } from '../../services/drawers/label-primitive-drawer/label-primitive-drawer.service';
import { BillboardPrimitiveDrawerService } from '../../services/drawers/billboard-primitive-drawer/billboard-primitive-drawer.service';
import { MapLayersService } from '../../services/map-layers/map-layers.service';
import { PointPrimitiveDrawerService } from '../../services/drawers/point-primitive-drawer/point-primitive-drawer.service';
import { HtmlDrawerService } from '../../services/drawers/html-drawer/html-drawer.service';
import { CzmlDrawerService } from '../../services/drawers/czml-drawer/czml-drawer.service';
// tslint:enable
/**
* This is a ac-layer implementation.
* The ac-layer element must be a child of ac-map element.
* + acFor `{string}` - get the tracked observable and entityName (see the example).
* + show `{boolean}` - show/hide layer's entities.
* + context `{any}` - get the context layer that will use the componnet (most of the time equal to "this").
* + options `{LayerOptions}` - sets the layer options for each drawer.
* + zIndex `{number}` - controls the zIndex (order) of the layer, layers with greater zIndex will be in front of layers with lower zIndex
* (Exception For `Billboard` and `Label`, should use `[eyeOffset]` prop instead)</br>
* zIndex won't work for pritimitve descs (like ac-primitive-polyline...)
* + debug `{boolean}` - prints every acNotification
*
*
* __Usage :__
* ```
* <ac-map>
* <ac-layer acFor="let track of tracks$" [show]="show" [context]="this" [options]="options" [zIndex]="1">
* <ac-billboard-desc props="{
* image: track.image,
* position: track.position,
* scale: track.scale,
* color: track.color,
* name: track.name
* }">
* </ac-billboard-desc>
* <ac-label-desc props="{
* position: track.position,
* pixelOffset : [-15,20] | pixelOffset,
* text: track.name,
* font: '15px sans-serif'
* }">
* </ac-label-desc>
* </ac-layer>
* </ac-map>
* ```
*/
export class AcLayerComponent {
constructor(layerService, _computationCache, mapLayersService, billboardDrawerService, labelDrawerService, ellipseDrawerService, polylineDrawerService, polygonDrawerService, arcDrawerService, pointDrawerService, modelDrawerService, boxDrawerService, corridorDrawerService, cylinderDrawerService, ellipsoidDrawerSerice, polylineVolumeDrawerService, wallDrawerService, rectangleDrawerService, dynamicEllipseDrawerService, dynamicPolylineDrawerService, staticCircleDrawerService, staticPolylineDrawerService, staticPolygonDrawerService, staticEllipseDrawerService, polylinePrimitiveDrawerService, labelPrimitiveDrawerService, billboardPrimitiveDrawerService, pointPrimitiveDrawerService, htmlDrawerService, czmlDrawerService) {
this.layerService = layerService;
this._computationCache = _computationCache;
this.mapLayersService = mapLayersService;
this.show = true;
this.store = false;
this.zIndex = 0;
this.debug = false;
this.acForRgx = /^let\s+.+\s+of\s+.+$/;
this.stopObservable = new Subject();
this._updateStream = new Subject();
this.entitiesStore = new Map();
this.layerDrawerDataSources = [];
this._drawerList = new Map([
['billboard', billboardDrawerService],
['label', labelDrawerService],
['ellipse', ellipseDrawerService],
['polyline', polylineDrawerService],
['polygon', polygonDrawerService],
['arc', arcDrawerService],
['point', pointDrawerService],
['model', modelDrawerService],
['box', boxDrawerService],
['corridor', corridorDrawerService],
['cylinder', cylinderDrawerService],
['ellipsoid', ellipsoidDrawerSerice],
['polylineVolume', polylineVolumeDrawerService],
['rectangle', rectangleDrawerService],
['wall', wallDrawerService],
['polylinePrimitive', polylinePrimitiveDrawerService],
['labelPrimitive', labelPrimitiveDrawerService],
['billboardPrimitive', billboardPrimitiveDrawerService],
['pointPrimitive', pointPrimitiveDrawerService],
['html', htmlDrawerService],
['czml', czmlDrawerService],
['dynamicEllipse', dynamicEllipseDrawerService],
['dynamicPolyline', dynamicPolylineDrawerService],
['staticCircle', staticCircleDrawerService],
['staticPolyline', staticPolylineDrawerService],
['staticPolygon', staticPolygonDrawerService],
['staticEllipse', staticEllipseDrawerService],
]);
}
init() {
this.initValidParams();
observableMerge(this._updateStream, this.observable).pipe(takeUntil(this.stopObservable)).subscribe((notification) => {
this._computationCache.clear();
if (this.debug) {
console.log('AcLayer received notification:', notification);
}
let contextEntity = notification.entity;
if (this.store) {
contextEntity = this.updateStore(notification);
}
this.context[this.entityName] = contextEntity;
this.layerService.getDescriptions().forEach((descriptionComponent) => {
switch (notification.actionType) {
case ActionType.ADD_UPDATE:
descriptionComponent.draw(this.context, notification.id, contextEntity);
break;
case ActionType.DELETE:
descriptionComponent.remove(notification.id);
break;
default:
console.error('[ac-layer] unknown AcNotification.actionType for notification: ' + notification);
}
});
});
}
updateStore(notification) {
if (notification.actionType === ActionType.DELETE) {
this.entitiesStore.delete(notification.id);
return undefined;
}
else {
if (this.entitiesStore.has(notification.id)) {
const entity = this.entitiesStore.get(notification.id);
Object.assign(entity, notification.entity);
return entity;
}
else {
this.entitiesStore.set(notification.id, notification.entity);
return notification.entity;
}
}
}
initValidParams() {
if (!this.context) {
throw new Error('ac-layer: must initialize [context] ');
}
if (!this.acForRgx.test(this.acFor)) {
throw new Error(`ac-layer: Invalid [acFor] syntax. Expected: [acFor]="let item of observable" .Instead received: ${this.acFor}`);
}
const acForArr = this.acFor.split(' ');
this.observable = this.context[acForArr[3]];
this.entityName = acForArr[1];
if (!this.isObservable(this.observable)) {
throw new Error('ac-layer: must initailize [acFor] with rx observable, instead received: ' + this.observable);
}
this.layerService.context = this.context;
this.layerService.setEntityName(this.entityName);
}
/** Test for a rxjs Observable */
isObservable(obj) {
/* check via duck-typing rather than instance of
* to allow passing between window contexts */
return obj && typeof obj.subscribe === 'function';
}
ngAfterContentInit() {
this.init();
}
ngOnInit() {
this.layerService.context = this.context;
this.layerService.options = this.options;
this.layerService.show = this.show;
this.layerService.zIndex = this.zIndex;
this._drawerList.forEach((drawer, drawerName) => {
const initOptions = this.options ? this.options[drawerName] : undefined;
const drawerDataSources = drawer.init(initOptions);
// only entities drawers create data sources
if (drawerDataSources) {
// this.mapLayersService.registerLayerDataSources(drawerDataSources, this.zIndex);
// TODO: Check if the following line causes Bad Performance
this.layerDrawerDataSources.push(...drawerDataSources);
}
drawer.setShow(this.show);
});
}
ngOnChanges(changes) {
if (changes.show && !changes.show.firstChange) {
const showValue = changes['show'].currentValue;
this.layerService.show = showValue;
this._drawerList.forEach((drawer) => drawer.setShow(showValue));
}
if (changes.zIndex && !changes.zIndex.firstChange) {
const zIndexValue = changes['zIndex'].currentValue;
this.layerService.zIndex = zIndexValue;
this.mapLayersService.updateAndRefresh(this.layerDrawerDataSources, zIndexValue);
}
}
ngOnDestroy() {
this.mapLayersService.removeDataSources(this.layerDrawerDataSources);
this.stopObservable.next(true);
this.removeAll();
}
getLayerService() {
return this.layerService;
}
/**
* Returns an array of DataSources registered by a drawer of this layer
* @return Array of Cesium.DataSources
*/
getLayerDrawerDataSources() {
return this.layerDrawerDataSources;
}
/**
* Returns an Array of DataSources of the drawer with the provided DataSource.name
* Example: getDataSourceOfDrawer('polyline') returns the dataSource of polyline drawer
* @return Array of Cesium.DataSources
*/
getDrawerDataSourcesByName(name) {
return this.layerDrawerDataSources.filter(d => d.name === name);
}
/**
* Returns the store.
*/
getStore() {
return this.entitiesStore;
}
/**
* Remove all the entities from the layer.
*/
removeAll() {
this.layerService.getDescriptions().forEach((description) => description.removeAll());
this.entitiesStore.clear();
}
/**
* remove entity from the layer
*/
remove(entityId) {
this._updateStream.next({ id: entityId, actionType: ActionType.DELETE });
this.entitiesStore.delete(entityId);
}
/**
* add/update entity to/from the layer
*/
updateNotification(notification) {
this._updateStream.next(notification);
}
/**
* add/update entity to/from the layer
*/
update(entity, id) {
this._updateStream.next({ entity, id, actionType: ActionType.ADD_UPDATE });
}
refreshAll(collection) {
// TODO make entity interface: collection of type entity not notification
observableFrom(collection).subscribe((entity) => this._updateStream.next(entity));
}
}
AcLayerComponent.decorators = [
{ type: Component, args: [{
selector: 'ac-layer',
template: '<ng-content></ng-content>',
providers: [
LayerService,
ComputationCache,
BillboardDrawerService,
LabelDrawerService,
EllipseDrawerService,
PolylineDrawerService,
ArcDrawerService,
PointDrawerService,
PolygonDrawerService,
ModelDrawerService,
BoxDrawerService,
CorridorDrawerService,
CylinderDrawerService,
EllipsoidDrawerService,
PolylineVolumeDrawerService,
WallDrawerService,
RectangleDrawerService,
PolylinePrimitiveDrawerService,
LabelPrimitiveDrawerService,
BillboardPrimitiveDrawerService,
PointPrimitiveDrawerService,
HtmlDrawerService,
CzmlDrawerService,
DynamicEllipseDrawerService,
DynamicPolylineDrawerService,
StaticCircleDrawerService,
StaticPolylineDrawerService,
StaticPolygonDrawerService,
StaticEllipseDrawerService,
],
changeDetection: ChangeDetectionStrategy.OnPush
},] }
];
AcLayerComponent.ctorParameters = () => [
{ type: LayerService },
{ type: ComputationCache },
{ type: MapLayersService },
{ type: BillboardDrawerService },
{ type: LabelDrawerService },
{ type: EllipseDrawerService },
{ type: PolylineDrawerService },
{ type: PolygonDrawerService },
{ type: ArcDrawerService },
{ type: PointDrawerService },
{ type: ModelDrawerService },
{ type: BoxDrawerService },
{ type: CorridorDrawerService },
{ type: CylinderDrawerService },
{ type: EllipsoidDrawerService },
{ type: PolylineVolumeDrawerService },
{ type: WallDrawerService },
{ type: RectangleDrawerService },
{ type: DynamicEllipseDrawerService },
{ type: DynamicPolylineDrawerService },
{ type: StaticCircleDrawerService },
{ type: StaticPolylineDrawerService },
{ type: StaticPolygonDrawerService },
{ type: StaticEllipseDrawerService },
{ type: PolylinePrimitiveDrawerService },
{ type: LabelPrimitiveDrawerService },
{ type: BillboardPrimitiveDrawerService },
{ type: PointPrimitiveDrawerService },
{ type: HtmlDrawerService },
{ type: CzmlDrawerService }
];
AcLayerComponent.propDecorators = {
show: [{ type: Input }],
acFor: [{ type: Input }],
context: [{ type: Input }],
store: [{ type: Input }],
options: [{ type: Input }],
zIndex: [{ type: Input }],
debug: [{ type: Input }]
};
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWMtbGF5ZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYW5ndWxhci1jZXNpdW0vc3JjL2xpYi9hbmd1bGFyLWNlc2l1bS9jb21wb25lbnRzL2FjLWxheWVyL2FjLWxheWVyLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsSUFBSSxJQUFJLGNBQWMsRUFBRSxLQUFLLElBQUksZUFBZSxFQUFjLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUU3RixPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDM0MsaUJBQWlCO0FBQ2pCLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLGtFQUFrRSxDQUFDO0FBQzFHLE9BQU8sRUFBb0IsdUJBQXVCLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBK0MsTUFBTSxlQUFlLENBQUM7QUFDekksT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLG9EQUFvRCxDQUFDO0FBRWxGLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUMzRCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSw0REFBNEQsQ0FBQztBQUM5RixPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSwwREFBMEQsQ0FBQztBQUM5RixPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSw4REFBOEQsQ0FBQztBQUNwRyxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxnRUFBZ0UsQ0FBQztBQUN2RyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxzREFBc0QsQ0FBQztBQUN4RixPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSwwREFBMEQsQ0FBQztBQUc5RixPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSw4REFBOEQsQ0FBQztBQUVwRyxPQUFPLEVBQUUsMkJBQTJCLEVBQUUsTUFBTSxxRkFBcUYsQ0FBQztB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WUEyQmhCLGdCQUFnQjtZQWhDaEIsc0JBQXNCO1lBTXRCLGtCQUFrQjtZQUNsQixvQkFBb0I7WUFDcEIscUJBQXFCO1lBS3JCLG9CQUFvQjtZQUpwQixnQkFBZ0I7WUFDaEIsa0JBQWtCO1lBV2xCLGtCQUFrQjtZQUNsQixnQkFBZ0I7WUFDaEIscUJBQXFCO1lBQ3JCLHFCQUFxQjtZQUNyQixzQkFBc0I7WUFDdEIsMkJBQTJCO1lBQzNCLGlCQUFpQjtZQUNqQixzQkFBc0I7WUFidEIsMkJBQTJCO1lBQzNCLDRCQUE0QjtZQUM1Qix5QkFBeUI7WUFDekIsMkJBQTJCO1lBQzNCLDBCQUEwQjtZQUMxQiwwQkFBMEI7WUFTMUIsOEJBQThCO1lBQzlCLDJCQUEyQjtZQUMzQiwrQkFBK0I7WUFFL0IsMkJBQTJCO1lBQzNCLGlCQUFpQjtZQUNqQixpQkFBaUI7OzttQkE2RXZCLEtBQUs7b0JBRUwsS0FBSztzQkFFTCxLQUFLO29CQUVMLEtBQUs7c0JBRUwsS0FBSztxQkFFTCxLQUFLO29CQUVMLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBmcm9tIGFzIG9ic2VydmFibGVGcm9tLCBtZXJnZSBhcyBvYnNlcnZhYmxlTWVyZ2UsIE9ic2VydmFibGUsIFN1YmplY3QgfSBmcm9tICdyeGpzJztcblxuaW1wb3J0IHsgdGFrZVVudGlsIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuLy8gdHNsaW50OmRpc2FibGVcbmltcG9ydCB7IEJpbGxib2FyZERyYXdlclNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9kcmF3ZXJzL2JpbGxib2FyZC1kcmF3ZXIvYmlsbGJvYXJkLWRyYXdlci5zZXJ2aWNlJztcbmltcG9ydCB7IEFmdGVyQ29udGVudEluaXQsIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDb21wb25lbnQsIElucHV0LCBPbkNoYW5nZXMsIE9uRGVzdHJveSwgT25Jbml0LCBTaW1wbGVDaGFuZ2VzIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBMYXllclNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9sYXllci1zZXJ2aWNlL2xheWVyLXNlcnZpY2Uuc2VydmljZSc7XG5pbXBvcnQgeyBBY05vdGlmaWNhdGlvbiB9IGZyb20gJy4uLy4uL21vZGVscy9hYy1ub3RpZmljYXRpb24nO1xuaW1wb3J0IHsgQWN0aW9uVHlwZSB9IGZyb20gJy4uLy4uL21vZGVscy9hY3Rpb24tdHlwZS5lbnVtJztcbmltcG9ydCB7IENvbXB1dGF0aW9uQ2FjaGUgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9jb21wdXRhdGlvbi1jYWNoZS9jb21wdXRhdGlvbi1jYWNoZS5zZXJ2aWNlJztcbmltcG9ydCB7IExhYmVsRHJhd2VyU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2RyYXdlcnMvbGFiZWwtZHJhd2VyL2xhYmVsLWRyYXdlci5zZXJ2aWNlJztcbmltcG9ydCB7IEVsbGlwc2VEcmF3ZXJTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvZHJhd2Vycy9lbGxpcHNlLWRyYXdlci9lbGxpcHNlLWRyYXdlci5zZXJ2aWNlJztcbmltcG9ydCB7IFBvbHlsaW5lRHJhd2VyU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2RyYXdlcnMvcG9seWxpbmUtZHJhd2VyL3BvbHlsaW5lLWRyYXdlci5zZXJ2aWNlJztcbmltcG9ydCB7IEFyY0RyYXdlclNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9kcmF3ZXJzL2FyYy1kcmF3ZXIvYXJjLWRyYXdlci5zZXJ2aWNlJztcbmltcG9ydCB7IFBvaW50RHJhd2VyU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2RyYXdlcnMvcG9pbnQtZHJhd2VyL3BvaW50LWRyYXdlci5zZXJ2aWNlJztcbmltcG9ydCB7IEFjRW50aXR5IH0gZnJvbSAnLi4vLi4vbW9kZWxzL2FjLWVudGl0eSc7XG5pbXBvcnQgeyBCYXNpY0RyYXdlclNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9kcmF3ZXJzL2Jhc2ljLWRyYXdlci9iYXNpYy1kcmF3ZXIuc2VydmljZSc7XG5pbXBvcnQgeyBQb2x5Z29uRHJhd2VyU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2RyYXdlcnMvcG9seWdvbi1kcmF3ZXIvcG9seWdvbi1kcmF3ZXIuc2VydmljZSc7XG5pbXBvcnQgeyBMYXllck9wdGlvbnMgfSBmcm9tICcuLi8uLi9tb2RlbHMvbGF5ZXItb3B0aW9ucyc7XG5pbXBvcnQgeyBEeW5hbWljRWxsaXBzZURyYXdlclNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9kcmF3ZXJzL3N0YXRpYy1keW5hbWljL2VsbGlwc2UtZHJhd2VyL2R5bmFtaWMtZWxsaXBzZS1kcmF3ZXIuc2VydmljZSc7XG5pbXBvcnQgeyBEeW5hbWljUG9seWxpbmVEcmF3ZXJTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvZHJhd2Vycy9zdGF0aWMtZHluYW1pYy9keW5hbWljLXBvbHlsaW5lLWRyYXdlci9keW5hbWljLXBvbHlsaW5lLWRyYXdlci5zZXJ2aWNlJztcbmltcG9ydCB7IFN0YXRpY0NpcmNsZURyYXdlclNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9kcmF3ZXJzL3N0YXRpYy1keW5hbWljL3N0YXRpYy1jaXJjbGUtZHJhd2VyL3N0YXRpYy1jaXJjbGUtZHJhd2VyLnNlcnZpY2UnO1xuaW1wb3J0IHsgU3RhdGljUG9seWxpbmVEcmF3ZXJTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvZHJhd2Vycy9zdGF0aWMtZHluYW1pYy9zdGF0aWMtcG9seWxpbmUtZHJhd2VyL3N0YXRpYy1wb2x5bGluZS1kcmF3ZXIuc2VydmljZSc7XG5pbXBvcnQgeyBTdGF0aWNQb2x5Z29uRHJhd2VyU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2RyYXdlcnMvc3RhdGljLWR5bmFtaWMvc3RhdGljLXBvbHlnb24tZHJhd2VyL3BvbHlnb24tZHJhd2VyLnNlcnZpY2UnO1xuaW1wb3J0IHsgU3RhdGljRWxsaXBzZURyYXdlclNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9kcmF3ZXJzL3N0YXRpYy1keW5hbWljL2VsbGlwc2UtZHJhd2VyL2VsbGlwc2UtZHJhd2VyLnNlcnZpY2UnO1xuaW1wb3J0IHsgTW9kZWxEcmF3ZXJTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvZHJhd2Vycy9tb2RlbC1kcmF3ZXIvbW9kZWwtZHJhd2VyLnNlcnZpY2UnO1xuaW1wb3J0IHsgQm94RHJhd2VyU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2RyYXdlcnMvYm94LWRhd2VyL2JveC1kcmF3ZXIuc2VydmljZSc7XG5pbXBvcnQgeyBDb3JyaWRvckRyYXdlclNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9kcmF3ZXJzL2NvcnJpZG9yLWRhd2VyL2NvcnJpZG9yLWRyYXdlci5zZXJ2aWNlJztcbmltcG9ydCB7IEN5bGluZGVyRHJhd2VyU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2RyYXdlcnMvY3lsaW5kZXItZGF3ZXIvY3lsaW5kZXItZHJhd2VyLnNlcnZpY2UnO1xuaW1wb3J0IHsgRWxsaXBzb2lkRHJhd2VyU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2RyYXdlcnMvZWxsaXBvaWQtZHJhd2VyL2VsbGlwc29pZC1kcmF3ZXIuc2VydmljZSc7XG5pbXBvcnQgeyBQb2x5bGluZVZvbHVtZURyYXdlclNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9kcmF3ZXJzL3BvbHlsaW5lLXZvbHVtZS1kYXdlci9wb2x5bGluZS12b2x1bWUtZHJhd2VyLnNlcnZpY2UnO1xuaW1wb3J0IHsgV2FsbERyYXdlclNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9kcmF3ZXJzL3dhbGwtZGF3ZXIvd2FsbC1kcmF3ZXIuc2VydmljZSc7XG5pbXBvcnQgeyBSZWN0YW5nbGVEcmF3ZXJTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvZHJhd2Vycy9yZWN0YW5nbGUtZGF3ZXIvcmVjdGFuZ2xlLWRyYXdlci5zZXJ2aWNlJztcbmltcG9ydCB7IFBvbHlsaW5lUHJpbWl0aXZlRHJhd2VyU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2RyYXdlcnMvcG9seWxpbmUtcHJpbWl0aXZlLWRyYXdlci9wb2x5bGluZS1wcmltaXRpdmUtZHJhd2VyLnNlcnZpY2UnO1xuaW1wb3J0IHsgTGFiZWxQcmltaXRpdmVEcmF3ZXJTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvZHJhd2Vycy9sYWJlbC1wcmltaXRpdmUtZHJhd2VyL2xhYmVsLXByaW1pdGl2ZS1kcmF3ZXIuc2VydmljZSc7XG5pbXBvcnQgeyBCaWxsYm9hcmRQcmltaXRpdmVEcmF3ZXJTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvZHJhd2Vycy9iaWxsYm9hcmQtcHJpbWl0aXZlLWRyYXdlci9iaWxsYm9hcmQtcHJpbWl0aXZlLWRyYXdlci5zZXJ2aWNlJztcbmltcG9ydCB7IE1hcExheWVyc1NlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9tYXAtbGF5ZXJzL21hcC1sYXllcnMuc2VydmljZSc7XG5pbXBvcnQgeyBQb2ludFByaW1pdGl2ZURyYXdlclNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9kcmF3ZXJzL3BvaW50LXByaW1pdGl2ZS1kcmF3ZXIvcG9pbnQtcHJpbWl0aXZlLWRyYXdlci5zZXJ2aWNlJztcbmltcG9ydCB7IEh0bWxEcmF3ZXJTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvZHJhd2Vycy9odG1sLWRyYXdlci9odG1sLWRyYXdlci5zZXJ2aWNlJztcbmltcG9ydCB7IEN6bWxEcmF3ZXJTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvZHJhd2Vycy9jem1sLWRyYXdlci9jem1sLWRyYXdlci5zZXJ2aWNlJztcblxuLy8gdHNsaW50OmVuYWJsZVxuLyoqXG4gKiAgVGhpcyBpcyBhIGFjLWxheWVyIGltcGxlbWVudGF0aW9uLlxuICogIFRoZSBhYy1sYXllciBlbGVtZW50IG11c3QgYmUgYSBjaGlsZCBvZiBhYy1tYXAgZWxlbWVudC5cbiAqICArIGFjRm9yIGB7c3RyaW5nfWAgLSBnZXQgdGhlIHRyYWNrZWQgb2JzZXJ2YWJsZSBhbmQgZW50aXR5TmFtZSAoc2VlIHRoZSBleGFtcGxlKS5cbiAqICArIHNob3cgYHtib29sZWFufWAgLSBzaG93L2hpZGUgbGF5ZXIncyBlbnRpdGllcy5cbiAqICArIGNvbnRleHQgYHthbnl9YCAtIGdldCB0aGUgY29udGV4dCBsYXllciB0aGF0IHdpbGwgdXNlIHRoZSBjb21wb25uZXQgKG1vc3Qgb2YgdGhlIHRpbWUgZXF1YWwgdG8gXCJ0aGlzXCIpLlxuICogICsgb3B0aW9ucyBge0xheWVyT3B0aW9uc31gIC0gc2V0cyB0aGUgbGF5ZXIgb3B0aW9ucyBmb3IgZWFjaCBkcmF3ZXIuXG4gKiAgKyB6SW5kZXggYHtudW1iZXJ9YCAtIGNvbnRyb2xzIHRoZSB6SW5kZXggKG9yZGVyKSBvZiB0aGUgbGF5ZXIsIGxheWVycyB3aXRoIGdyZWF0ZXIgekluZGV4IHdpbGwgYmUgaW4gZnJvbnQgb2YgbGF5ZXJzIHdpdGggbG93ZXIgekluZGV4XG4gKiAgICAoRXhjZXB0aW9uIEZvciBgQmlsbGJvYXJkYCBhbmQgYExhYmVsYCwgc2hvdWxkIHVzZSBgW2V5ZU9mZnNldF1gIHByb3AgaW5zdGVhZCk8L2JyPlxuICogICAgekluZGV4IHdvbid0IHdvcmsgZm9yIHByaXRpbWl0dmUgZGVzY3MgKGxpa2UgYWMtcHJpbWl0aXZlLXBvbHlsaW5lLi4uKVxuICogICsgZGVidWcgYHtib29sZWFufWAgLSBwcmludHMgZXZlcnkgYWNOb3RpZmljYXRpb25cbiAqXG4gKlxuICogIF9fVXNhZ2UgOl9fXG4gKiAgYGBgXG4gKiAgPGFjLW1hcD5cbiAqICAgIDxhYy1sYXllciBhY0Zvcj1cImxldCB0cmFjayBvZiB0cmFja3MkXCIgW3Nob3ddPVwic2hvd1wiIFtjb250ZXh0XT1cInRoaXNcIiBbb3B0aW9uc109XCJvcHRpb25zXCIgW3pJbmRleF09XCIxXCI+XG4gKiAgICAgIDxhYy1iaWxsYm9hcmQtZGVzYyBwcm9wcz1cIntcbiAqICAgICAgICBpbWFnZTogdHJhY2suaW1hZ2UsXG4gKiAgICAgICAgcG9zaXRpb246IHRyYWNrLnBvc2l0aW9uLFxuICogICAgICAgIHNjYWxlOiB0cmFjay5zY2FsZSxcbiAqICAgICAgICBjb2xvcjogdHJhY2suY29sb3IsXG4gKiAgICAgICAgbmFtZTogdHJhY2submFtZVxuICogICAgICB9XCI+XG4gKiAgICAgIDwvYWMtYmlsbGJvYXJkLWRlc2M+XG4gKiAgICAgICAgPGFjLWxhYmVsLWRlc2MgcHJvcHM9XCJ7XG4gKiAgICAgICAgICBwb3NpdGlvbjogdHJhY2sucG9zaXRpb24sXG4gKiAgICAgICAgICBwaXhlbE9mZnNldCA6IFstMTUsMjBdIHwgcGl4ZWxPZmZzZXQsXG4gKiAgICAgICAgICB0ZXh0OiB0cmFjay5uYW1lLFxuICogICAgICAgICAgZm9udDogJzE1cHggc2Fucy1zZXJpZidcbiAqICAgICAgICB9XCI+XG4gKiAgICAgIDwvYWMtbGFiZWwtZGVzYz5cbiAqICAgIDwvYWMtbGF5ZXI+XG4gKiAgPC9hYy1tYXA+XG4gKiAgYGBgXG4gKi9cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2FjLWxheWVyJyxcbiAgdGVtcGxhdGU6ICc8bmctY29udGVudD48L25nLWNvbnRlbnQ+JyxcbiAgcHJvdmlkZXJzOiBbXG4gICAgTGF5ZXJTZXJ2aWNlLFxuICAgIENvbXB1dGF0aW9uQ2FjaGUsXG4gICAgQmlsbGJvYXJkRHJhd2VyU2VydmljZSxcbiAgICBMYWJlbERyYXdlclNlcnZpY2UsXG4gICAgRWxsaXBzZURyYXdlclNlcnZpY2UsXG4gICAgUG9seWxpbmVEcmF3ZXJTZXJ2aWNlLFxuICAgIEFyY0RyYXdlclNlcnZpY2UsXG4gICAgUG9pbnREcmF3ZXJTZXJ2aWNlLFxuICAgIFBvbHlnb25EcmF3ZXJTZXJ2aWNlLFxuICAgIE1vZGVsRHJhd2VyU2VydmljZSxcbiAgICBCb3hEcmF3ZXJTZXJ2aWNlLFxuICAgIENvcnJpZG9yRHJhd2VyU2VydmljZSxcbiAgICBDeWxpbmRlckRyYXdlclNlcnZpY2UsXG4gICAgRWxsaXBzb2lkRHJhd2VyU2VydmljZSxcbiAgICBQb2x5bGluZVZvbHVtZURyYXdlclNlcnZpY2UsXG4gICAgV2FsbERyYXdlclNlcnZpY2UsXG4gICAgUmVjdGFuZ2xlRHJhd2VyU2VydmljZSxcbiAgICBQb2x5bGluZVByaW1pdGl2ZURyYXdlclNlcnZpY2UsXG4gICAgTGFiZWxQcmltaXRpdmVEcmF3ZXJTZXJ2aWNlLFxuICAgIEJpbGxib2FyZFByaW1pdGl2ZURyYXdlclNlcnZpY2UsXG4gICAgUG9pbnRQcmltaXRpdmVEcmF3ZXJTZXJ2aWNlLFxuICAgIEh0bWxEcmF3ZXJTZXJ2aWNlLFxuICAgIEN6bWxEcmF3ZXJTZXJ2aWNlLFxuXG4gICAgRHluYW1pY0VsbGlwc2VEcmF3ZXJTZXJ2aWNlLFxuICAgIER5bmFtaWNQb2x5bGluZURyYXdlclNlcnZpY2UsXG4gICAgU3RhdGljQ2lyY2xlRHJhd2VyU2VydmljZSxcbiAgICBTdGF0aWNQb2x5bGluZURyYXdlclNlcnZpY2UsXG4gICAgU3RhdGljUG9seWdvbkRyYXdlclNlcnZpY2UsXG4gICAgU3RhdGljRWxsaXBzZURyYXdlclNlcnZpY2UsXG4gIF0sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxufSlcbmV4cG9ydCBjbGFzcyBBY0xheWVyQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMsIEFmdGVyQ29udGVudEluaXQsIE9uRGVzdHJveSB7XG4gIEBJbnB1dCgpXG4gIHNob3cgPSB0cnVlO1xuICBASW5wdXQoKVxuICBhY0Zvcjogc3RyaW5nO1xuICBASW5wdXQoKVxuICBjb250ZXh0OiBhbnk7XG4gIEBJbnB1dCgpXG4gIHN0b3JlID0gZmFsc2U7XG4gIEBJbnB1dCgpXG4gIG9wdGlvbnM6IExheWVyT3B0aW9ucztcbiAgQElucHV0KClcbiAgekluZGV4ID0gMDtcbiAgQElucHV0KClcbiAgZGVidWcgPSBmYWxzZTtcblxuICBwcml2YXRlIHJlYWRvbmx5IGFjRm9yUmd4ID0gL15sZXRcXHMrLitcXHMrb2ZcXHMrLiskLztcbiAgcHJpdmF0ZSBlbnRpdHlOYW1lOiBzdHJpbmc7XG4gIHByaXZhdGUgc3RvcE9ic2VydmFibGUgPSBuZXcgU3ViamVjdDxhbnk+KCk7XG4gIHByaXZhdGUgb2JzZXJ2YWJsZTogT2JzZXJ2YWJsZTxBY05vdGlmaWNhdGlvbj47XG4gIHByaXZhdGUgX2RyYXdlckxpc3Q6IE1hcDxzdHJpbmcsIEJhc2ljRHJhd2VyU2VydmljZT47XG4gIHByaXZhdGUgX3VwZGF0ZVN0cmVhbTogU3ViamVjdDxBY05vdGlmaWNhdGlvbj4gPSBuZXcgU3ViamVjdDxBY05vdGlmaWNhdGlvbj4oKTtcbiAgcHJpdmF0ZSBlbnRpdGllc1N0b3JlID0gbmV3IE1hcDxzdHJpbmcsIGFueT4oKTtcbiAgcHJpdmF0ZSBsYXllckRyYXdlckRhdGFTb3VyY2VzOiBhbnlbXSA9IFtdO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgbGF5ZXJTZXJ2aWNlOiBMYXllclNlcnZpY2UsXG4gICAgICAgICAgICAgIHByaXZhdGUgX2NvbXB1dGF0aW9uQ2FjaGU6IENvbXB1dGF0aW9uQ2FjaGUsXG4gICAgICAgICAgICAgIHByaXZhdGUgbWFwTGF5ZXJzU2VydmljZTogTWFwTGF5ZXJzU2VydmljZSxcbiAgICAgICAgICAgICAgYmlsbGJvYXJkRHJhd2VyU2VydmljZTogQmlsbGJvYXJkRHJhd2VyU2VydmljZSxcbiAgICAgICAgICAgICAgbGFiZWxEcmF3ZXJTZXJ2aWNlOiBMYWJlbERyYXdlclNlcnZpY2UsXG4gICAgICAgICAgICAgIGVsbGlwc2VEcmF3ZXJTZXJ2aWNlOiBFbGxpcHNlRHJhd2VyU2VydmljZSxcbiAgICAgICAgICAgICAgcG9seWxpbmVEcmF3ZXJTZXJ2aWNlOiBQb2x5bGluZURyYXdlclNlcnZpY2UsXG4gICAgICAgICAgICAgIHBvbHlnb25EcmF3ZXJTZXJ2aWNlOiBQb2x5Z29uRHJhd2VyU2VydmljZSxcbiAgICAgICAgICAgICAgYXJjRHJhd2VyU2VydmljZTogQXJjRHJhd2VyU2VydmljZSxcbiAgICAgICAgICAgICAgcG9pbnREcmF3ZXJTZXJ2aWNlOiBQb2ludERyYXdlclNlcnZpY2UsXG4gICAgICAgICAgICAgIG1vZGVsRHJhd2VyU2VydmljZTogTW9kZWxEcmF3ZXJTZXJ2aWNlLFxuICAgICAgICAgICAgICBib3hEcmF3ZXJTZXJ2aWNlOiBCb3hEcmF3ZXJTZXJ2aWNlLFxuICAgICAgICAgICAgICBjb3JyaWRvckRyYXdlclNlcnZpY2U6IENvcnJpZG9yRHJhd2VyU2VydmljZSxcbiAgICAgICAgICAgICAgY3lsaW5kZXJEcmF3ZXJTZXJ2aWNlOiBDeWxpbmRlckRyYXdlclNlcnZpY2UsXG4gICAgICAgICAgICAgIGVsbGlwc29pZERyYXdlclNlcmljZTogRWxsaXBzb2lkRHJhd2VyU2VydmljZSxcbiAgICAgICAgICAgICAgcG9seWxpbmVWb2x1bWVEcmF3ZXJTZXJ2aWNlOiBQb2x5bGluZVZvbHVtZURyYXdlclNlcnZpY2UsXG4gICAgICAgICAgICAgIHdhbGxEcmF3ZXJTZXJ2aWNlOiBXYWxsRHJhd2VyU2VydmljZSxcbiAgICAgICAgICAgICAgcmVjdGFuZ2xlRHJhd2VyU2VydmljZTogUmVjdGFuZ2xlRHJhd2VyU2VydmljZSxcbiAgICAgICAgICAgICAgZHluYW1pY0VsbGlwc2VEcmF3ZXJTZXJ2aWNlOiBEeW5hbWljRWxsaXBzZURyYXdlclNlcnZpY2UsXG4gICAgICAgICAgICAgIGR5bmFtaWNQb2x5bGluZURyYXdlclNlcnZpY2U6IER5bmFtaWNQb2x5bGluZURyYXdlclNlcnZpY2UsXG4gICAgICAgICAgICAgIHN0YXRpY0NpcmNsZURyYXdlclNlcnZpY2U6IFN0YXRpY0NpcmNsZURyYXdlclNlcnZpY2UsXG4gICAgICAgICAgICAgIHN0YXRpY1BvbHlsaW5lRHJhd2VyU2VydmljZTogU3RhdGljUG9seWxpbmVEcmF3ZXJTZXJ2aWNlLFxuICAgICAgICAgICAgICBzdGF0aWNQb2x5Z29uRHJhd2VyU2VydmljZTogU3RhdGljUG9seWdvbkRyYXdlclNlcnZpY2UsXG4gICAgICAgICAgICAgIHN0YXRpY0VsbGlwc2VEcmF3ZXJTZXJ2aWNlOiBTdGF0aWNFbGxpcHNlRHJhd2VyU2VydmljZSxcbiAgICAgICAgICAgICAgcG9seWxpbmVQcmltaXRpdmVEcmF3ZXJTZXJ2aWNlOiBQb2x5bGluZVByaW1pdGl2ZURyYXdlclNlcnZpY2UsXG4gICAgICAgICAgICAgIGxhYmVsUHJpbWl0aXZlRHJhd2VyU2VydmljZTogTGFiZWxQcmltaXRpdmVEcmF3ZXJTZXJ2aWNlLFxuICAgICAgICAgICAgICBiaWxsYm9hcmRQcmltaXRpdmVEcmF3ZXJTZXJ2aWNlOiBCaWxsYm9hcmRQcmltaXRpdmVEcmF3ZXJTZXJ2aWNlLFxuICAgICAgICAgICAgICBwb2ludFByaW1pdGl2ZURyYXdlclNlcnZpY2U6IFBvaW50UHJpbWl0aXZlRHJhd2VyU2VydmljZSxcbiAgICAgICAgICAgICAgaHRtbERyYXdlclNlcnZpY2U6IEh0bWxEcmF3ZXJTZXJ2aWNlLFxuICAgICAgICAgICAgICBjem1sRHJhd2VyU2VydmljZTogQ3ptbERyYXdlclNlcnZpY2VcbiAgKSB7XG4gICAgdGhpcy5fZHJhd2VyTGlzdCA9IG5ldyBNYXAoW1xuICAgICAgWydiaWxsYm9hcmQnLCBiaWxsYm9hcmREcmF3ZXJTZXJ2aWNlXSxcbiAgICAgIFsnbGFiZWwnLCBsYWJlbERyYXdlclNlcnZpY2VdLFxuICAgICAgWydlbGxpcHNlJywgZWxsaXBzZURyYXdlclNlcnZpY2VdLFxuICAgICAgWydwb2x5bGluZScsIHBvbHlsaW5lRHJhd2VyU2VydmljZV0sXG4gICAgICBbJ3BvbHlnb24nLCBwb2x5Z29uRHJhd2VyU2VydmljZSBhcyBCYXNpY0RyYXdlclNlcnZpY2VdLFxuICAgICAgWydhcmMnLCBhcmNEcmF3ZXJTZXJ2aWNlXSxcbiAgICAgIFsncG9pbnQnLCBwb2ludERyYXdlclNlcnZpY2VdLFxuICAgICAgWydtb2RlbCcsIG1vZGVsRHJhd2VyU2VydmljZV0sXG4gICAgICBbJ2JveCcsIGJveERyYXdlclNlcnZpY2VdLFxuICAgICAgWydjb3JyaWRvcicsIGNvcnJpZG9yRHJhd2VyU2VydmljZV0sXG4gICAgICBbJ2N5bGluZGVyJywgY3lsaW5kZXJEcmF3ZXJTZXJ2aWNlXSxcbiAgICAgIFsnZWxsaXBzb2lkJywgZWxsaXBzb2lkRHJhd2VyU2VyaWNlXSxcbiAgICAgIFsncG9seWxpbmVWb2x1bWUnLCBwb2x5bGluZVZvbHVtZURyYXdlclNlcnZpY2VdLFxuICAgICAgWydyZWN0YW5nbGUnLCByZWN0YW5nbGVEcmF3ZXJTZXJ2aWNlXSxcbiAgICAgIFsnd2FsbCcsIHdhbGxEcmF3ZXJTZXJ2aWNlXSxcbiAgICAgIFsncG9seWxpbmVQcmltaXRpdmUnLCBwb2x5bGluZVByaW1pdGl2ZURyYXdlclNlcnZpY2VdLFxuICAgICAgWydsYWJlbFByaW1pdGl2ZScsIGxhYmVsUHJpbWl0aXZlRHJhd2VyU2VydmljZV0sXG4gICAgICBbJ2JpbGxib2FyZFByaW1pdGl2ZScsIGJpbGxib2FyZFByaW1pdGl2ZURyYXdlclNlcnZpY2VdLFxuICAgICAgWydwb2ludFByaW1pdGl2ZScsIHBvaW50UHJpbWl0aXZlRHJhd2VyU2VydmljZV0sXG4gICAgICBbJ2h0bWwnLCBodG1sRHJhd2VyU2VydmljZV0sXG4gICAgICBbJ2N6bWwnLCBjem1sRHJhd2VyU2VydmljZV0sXG5cbiAgICAgIFsnZHluYW1pY0VsbGlwc2UnLCBkeW5hbWljRWxsaXBzZURyYXdlclNlcnZpY2VdLFxuICAgICAgWydkeW5hbWljUG9seWxpbmUnLCBkeW5hbWljUG9seWxpbmVEcmF3ZXJTZXJ2aWNlXSxcbiAgICAgIFsnc3RhdGljQ2lyY2xlJywgc3RhdGljQ2lyY2xlRHJhd2VyU2VydmljZV0sXG4gICAgICBbJ3N0YXRpY1BvbHlsaW5lJywgc3RhdGljUG9seWxpbmVEcmF3ZXJTZXJ2aWNlXSxcbiAgICAgIFsnc3RhdGljUG9seWdvbicsIHN0YXRpY1BvbHlnb25EcmF3ZXJTZXJ2aWNlXSxcbiAgICAgIFsnc3RhdGljRWxsaXBzZScsIHN0YXRpY0VsbGlwc2VEcmF3ZXJTZXJ2aWNlXSxcbiAgICBdKTtcbiAgfVxuXG4gIGluaXQoKSB7XG4gICAgdGhpcy5pbml0VmFsaWRQYXJhbXMoKTtcblxuICAgIG9ic2VydmFibGVNZXJnZSh0aGlzLl91cGRhdGVTdHJlYW0sIHRoaXMub2JzZXJ2YWJsZSkucGlwZTxBY05vdGlmaWNhdGlvbj4odGFrZVVudGlsKHRoaXMuc3RvcE9ic2VydmFibGUpKS5zdWJzY3JpYmUoKG5vdGlmaWNhdGlvbikgPT4ge1xuICAgICAgdGhpcy5fY29tcHV0YXRpb25DYWNoZS5jbGVhcigpO1xuXG4gICAgICBpZiAodGhpcy5kZWJ1Zykge1xuICAgICAgICBjb25zb2xlLmxvZygnQWNMYXllciByZWNlaXZlZCBub3RpZmljYXRpb246Jywgbm90aWZpY2F0aW9uKTtcbiAgICAgIH1cblxuICAgICAgbGV0IGNvbnRleHRFbnRpdHkgPSBub3RpZmljYXRpb24uZW50aXR5O1xuICAgICAgaWYgKHRoaXMuc3RvcmUpIHtcbiAgICAgICAgY29udGV4dEVudGl0eSA9IHRoaXMudXBkYXRlU3RvcmUobm90aWZpY2F0aW9uKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5jb250ZXh0W3RoaXMuZW50aXR5TmFtZV0gPSBjb250ZXh0RW50aXR5O1xuICAgICAgdGhpcy5sYXllclNlcnZpY2UuZ2V0RGVzY3JpcHRpb25zKCkuZm9yRWFjaCgoZGVzY3JpcHRpb25Db21wb25lbnQpID0+IHtcbiAgICAgICAgc3dpdGNoIChub3RpZmljYXRpb24uYWN0aW9uVHlwZSkge1xuICAgICAgICAgIGNhc2UgQWN0aW9uVHlwZS5BRERfVVBEQVRFOlxuICAgICAgICAgICAgZGVzY3JpcHRpb25Db21wb25lbnQuZHJhdyh0aGlzLmNvbnRleHQsIG5vdGlmaWNhdGlvbi5pZCwgY29udGV4dEVudGl0eSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIEFjdGlvblR5cGUuREVMRVRFOlxuICAgICAgICAgICAgZGVzY3JpcHRpb25Db21wb25lbnQucmVtb3ZlKG5vdGlmaWNhdGlvbi5pZCk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgY29uc29sZS5lcnJvcignW2FjLWxheWVyXSB1bmtub3duIEFjTm90aWZpY2F0aW9uLmFjdGlvblR5cGUgZm9yIG5vdGlmaWNhdGlvbjogJyArIG5vdGlmaWNhdGlvbik7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVTdG9yZShub3RpZmljYXRpb246IEFjTm90aWZpY2F0aW9uKTogYW55IHtcbiAgICBpZiAobm90aWZpY2F0aW9uLmFjdGlvblR5cGUgPT09IEFjdGlvblR5cGUuREVMRVRFKSB7XG4gICAgICB0aGlzLmVudGl0aWVzU3RvcmUuZGVsZXRlKG5vdGlmaWNhdGlvbi5pZCk7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAodGhpcy5lbnRpdGllc1N0b3JlLmhhcyhub3RpZmljYXRpb24uaWQpKSB7XG4gICAgICAgIGNvbnN0IGVudGl0eSA9IHRoaXMuZW50aXRpZXNTdG9yZS5nZXQobm90aWZpY2F0aW9uLmlkKTtcbiAgICAgICAgT2JqZWN0LmFzc2lnbihlbnRpdHksIG5vdGlmaWNhdGlvbi5lbnRpdHkpO1xuICAgICAgICByZXR1cm4gZW50aXR5O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5lbnRpdGllc1N0b3JlLnNldChub3RpZmljYXRpb24uaWQsIG5vdGlmaWNhdGlvbi5lbnRpdHkpO1xuICAgICAgICByZXR1cm4gbm90aWZpY2F0aW9uLmVudGl0eTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGluaXRWYWxpZFBhcmFtcygpIHtcbiAgICBpZiAoIXRoaXMuY29udGV4dCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdhYy1sYXllcjogbXVzdCBpbml0aWFsaXplIFtjb250ZXh0XSAnKTtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuYWNGb3JSZ3gudGVzdCh0aGlzLmFjRm9yKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBhYy1sYXllcjogSW52YWxpZCBbYWNGb3JdIHN5bnRheC4gRXhwZWN0ZWQ6IFthY0Zvcl09XCJsZXQgaXRlbSBvZiBvYnNlcnZhYmxlXCIgLkluc3RlYWQgcmVjZWl2ZWQ6ICR7dGhpcy5hY0Zvcn1gKTtcbiAgICB9XG4gICAgY29uc3QgYWNGb3JBcnIgPSB0aGlzLmFjRm9yLnNwbGl0KCcgJyk7XG4gICAgdGhpcy5vYnNlcnZhYmxlID0gdGhpcy5jb250ZXh0W2FjRm9yQXJyWzNdXTtcbiAgICB0aGlzLmVudGl0eU5hbWUgPSBhY0ZvckFyclsxXTtcbiAgICBpZiAoIXRoaXMuaXNPYnNlcnZhYmxlKHRoaXMub2JzZXJ2YWJsZSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignYWMtbGF5ZXI6IG11c3QgaW5pdGFpbGl6ZSBbYWNGb3JdIHdpdGggcnggb2JzZXJ2YWJsZSwgaW5zdGVhZCByZWNlaXZlZDogJyArIHRoaXMub2JzZXJ2YWJsZSk7XG4gICAgfVxuXG4gICAgdGhpcy5sYXllclNlcnZpY2UuY29udGV4dCA9IHRoaXMuY29udGV4dDtcbiAgICB0aGlzLmxheWVyU2VydmljZS5zZXRFbnRpdHlOYW1lKHRoaXMuZW50aXR5TmFtZSk7XG4gIH1cblxuICAvKiogVGVzdCBmb3IgYSByeGpzIE9ic2VydmFibGUgKi9cbiAgcHJpdmF0ZSBpc09ic2VydmFibGUob2JqOiBhbnkpOiBib29sZWFuIHtcbiAgICAvKiBjaGVjayB2aWEgZHVjay10eXBpbmcgcmF0aGVyIHRoYW4gaW5zdGFuY2Ugb2ZcbiAgICAgKiB0byBhbGxvdyBwYXNzaW5nIGJldHdlZW4gd2luZG93IGNvbnRleHRzICovXG4gICAgcmV0dXJuIG9iaiAmJiB0eXBlb2Ygb2JqLnN1YnNjcmliZSA9PT0gJ2Z1bmN0aW9uJztcbiAgfVxuXG4gIG5nQWZ0ZXJDb250ZW50SW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLmluaXQoKTtcbiAgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMubGF5ZXJTZXJ2aWNlLmNvbnRleHQgPSB0aGlzLmNvbnRleHQ7XG4gICAgdGhpcy5sYXllclNlcnZpY2Uub3B0aW9ucyA9IHRoaXMub3B0aW9ucztcbiAgICB0aGlzLmxheWVyU2VydmljZS5zaG93ID0gdGhpcy5zaG93O1xuICAgIHRoaXMubGF5ZXJTZXJ2aWNlLnpJbmRleCA9IHRoaXMuekluZGV4O1xuICAgIHRoaXMuX2RyYXdlckxpc3QuZm9yRWFjaCgoZHJhd2VyLCBkcmF3ZXJOYW1lKSA9PiB7XG4gICAgICBjb25zdCBpbml0T3B0aW9ucyA9IHRoaXMub3B0aW9ucyA/IHRoaXMub3B0aW9uc1tkcmF3ZXJOYW1lXSA6IHVuZGVmaW5lZDtcbiAgICAgIGNvbnN0IGRyYXdlckRhdGFTb3VyY2VzID0gZHJhd2VyLmluaXQoaW5pdE9wdGlvbnMpO1xuICAgICAgLy8gb25seSBlbnRpdGllcyBkcmF3ZXJzIGNyZWF0ZSBkYXRhIHNvdXJjZXNcbiAgICAgIGlmIChkcmF3ZXJEYXRhU291cmNlcykge1xuICAgICAgICAvLyB0aGlzLm1hcExheWVyc1NlcnZpY2UucmVnaXN0ZXJMYXllckRhdGFTb3VyY2VzKGRyYXdlckRhdGFTb3VyY2VzLCB0aGlzLnpJbmRleCk7XG4gICAgICAgIC8vIFRPRE86IENoZWNrIGlmIHRoZSBmb2xsb3dpbmcgbGluZSBjYXVzZXMgQmFkIFBlcmZvcm1hbmNlXG4gICAgICAgIHRoaXMubGF5ZXJEcmF3ZXJEYXRhU291cmNlcy5wdXNoKC4uLmRyYXdlckRhdGFTb3VyY2VzKTtcbiAgICAgIH1cbiAgICAgIGRyYXdlci5zZXRTaG93KHRoaXMuc2hvdyk7XG4gICAgfSk7XG4gIH1cblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgaWYgKGNoYW5nZXMuc2hvdyAmJiAhY2hhbmdlcy5zaG93LmZpcnN0Q2hhbmdlKSB7XG4gICAgICBjb25zdCBzaG93VmFsdWUgPSBjaGFuZ2VzWydzaG93J10uY3VycmVudFZhbHVlO1xuICAgICAgdGhpcy5sYXllclNlcnZpY2Uuc2hvdyA9IHNob3dWYWx1ZTtcbiAgICAgIHRoaXMuX2RyYXdlckxpc3QuZm9yRWFjaCgoZHJhd2VyKSA9PiBkcmF3ZXIuc2V0U2hvdyhzaG93VmFsdWUpKTtcbiAgICB9XG5cbiAgICBpZiAoY2hhbmdlcy56SW5kZXggJiYgIWNoYW5nZXMuekluZGV4LmZpcnN0Q2hhbmdlKSB7XG4gICAgICBjb25zdCB6SW5kZXhWYWx1ZSA9IGNoYW5nZXNbJ3pJbmRleCddLmN1cnJlbnRWYWx1ZTtcbiAgICAgIHRoaXMubGF5ZXJTZXJ2aWNlLnpJbmRleCA9IHpJbmRleFZhbHVlO1xuICAgICAgdGhpcy5tYXBMYXllcnNTZXJ2aWNlLnVwZGF0ZUFuZFJlZnJlc2godGhpcy5sYXllckRyYXdlckRhdGFTb3VyY2VzLCB6SW5kZXhWYWx1ZSk7XG4gICAgfVxuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5tYXBMYXllcnNTZXJ2aWNlLnJlbW92ZURhdGFTb3VyY2VzKHRoaXMubGF5ZXJEcmF3ZXJEYXRhU291cmNlcyk7XG4gICAgdGhpcy5zdG9wT2JzZXJ2YWJsZS5uZXh0KHRydWUpO1xuICAgIHRoaXMucmVtb3ZlQWxsKCk7XG4gIH1cblxuICBnZXRMYXllclNlcnZpY2UoKTogTGF5ZXJTZXJ2aWNlIHtcbiAgICByZXR1cm4gdGhpcy5sYXllclNlcnZpY2U7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhbiBhcnJheSBvZiBEYXRhU291cmNlcyByZWdpc3RlcmVkIGJ5IGEgZHJhd2VyIG9mIHRoaXMgbGF5ZXJcbiAgICogQHJldHVybiBBcnJheSBvZiBDZXNpdW0uRGF0YVNvdXJjZXNcbiAgICovXG4gIGdldExheWVyRHJhd2VyRGF0YVNvdXJjZXMoKTogYW55W10ge1xuICAgIHJldHVybiB0aGlzLmxheWVyRHJhd2VyRGF0YVNvdXJjZXM7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhbiBBcnJheSBvZiBEYXRhU291cmNlcyBvZiB0aGUgZHJhd2VyIHdpdGggdGhlIHByb3ZpZGVkIERhdGFTb3VyY2UubmFtZVxuICAgKiBFeGFtcGxlOiBnZXREYXRhU291cmNlT2ZEcmF3ZXIoJ3BvbHlsaW5lJykgcmV0dXJucyB0aGUgZGF0YVNvdXJjZSBvZiBwb2x5bGluZSBkcmF3ZXJcbiAgICogQHJldHVybiBBcnJheSBvZiBDZXNpdW0uRGF0YVNvdXJjZXNcbiAgICovXG4gIGdldERyYXdlckRhdGFTb3VyY2VzQnlOYW1lKG5hbWU6IHN0cmluZyk6IGFueVtdIHtcbiAgICByZXR1cm4gdGhpcy5sYXllckRyYXdlckRhdGFTb3VyY2VzLmZpbHRlcihkID0+IGQubmFtZSA9PT0gbmFtZSk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgc3RvcmUuXG4gICAqL1xuICBnZXRTdG9yZSgpOiBNYXA8c3RyaW5nLCBhbnk+IHtcbiAgICByZXR1cm4gdGhpcy5lbnRpdGllc1N0b3JlO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZSBhbGwgdGhlIGVudGl0aWVzIGZyb20