UNPKG

chi-app-lib

Version:

This is a custom component (input dropdown grid textarea map captcha) published to npm.

370 lines 31 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import { Component, Input, Output, EventEmitter } from '@angular/core'; import * as mapboxgl from 'mapbox-gl'; export class ChiMapComponent { constructor() { this.marker = []; this.id = this.idGenerator(); this.maxZoom = 18; this.minZoom = 5; this.zoom = 5; this.center = [51.4, 35.7]; this.southWest = { lat: 24.350969, lng: 44.0 }; this.northEast = { lat: 39.912996, lng: 63.5 }; this.mode = 'select'; // view // view this.zoomControl = true; this.dragging = true; this.zoomMarker = 17; this.showMarker = true; this.coordinate = new EventEmitter(); this.getMap = new EventEmitter(); // (mapboxgl as any).accessToken = 'pk.eyJ1IjoiZGFuc3dpY2siLCJhIjoieUZiWmwtVSJ9.0cPQywdbPVmvHiHJ6NwdXA'; } /** * @param {?} changes * @return {?} */ ngOnChanges(changes) { /** @type {?} */ const height = changes.height; /** @type {?} */ const isDrag = changes.dragging; /** @type {?} */ const coordinateOrigin = changes.resetCoordinate; if ((coordinateOrigin || {})['currentValue']) { this.resetMarker(); } if ((isDrag || {})['currentValue'] === false || (isDrag || {})['currentValue'] === true) { this.disabledDrag(); } } /** * @return {?} */ ngOnInit() { setTimeout((/** * @param {?} _ * @return {?} */ _ => { this.initMap(); }), 100); } /** * @return {?} */ idGenerator() { /** @type {?} */ const number = Math.random(); number.toString(36); return number.toString(36).substr(2, 9); } /** * @return {?} */ disabledDrag() { if (!this.map) { return; } if (!this.dragging) { this.map.dragPan.disable(); } else { this.map.dragPan.enable(); } } /** * @param {?} url * @param {?} resourceType * @return {?} */ encryptTileUrl(url, resourceType) { if (resourceType === 'Tile' && url.match('hash')) { /** @type {?} */ const arr = url.split('/'); url = url.split('hash')[0] + 'hash/' + hashThis(arr[arr.length - 3] + '/' + arr[arr.length - 2] + '/' + arr[arr.length - 1], true); return { url: url }; } if (resourceType === 'Tile' && url.match('google')) { /** @type {?} */ const arr = (url.split('pl&'))[1].split('/'); /** @type {?} */ const a = url.split('&'); url = (a[0] + '&' + a[1] + '&x=' + arr[arr.length - 2] + '&y=' + arr[arr.length - 1] + '&z=' + arr[arr.length - 3]).replace('.jpeg', ''); return { url: url }; } else { return { url: url }; } } /** * @return {?} */ initMap() { this.map = new mapboxgl.Map({ transformRequest: this.encryptTileUrl, container: 'chi-map' + this.id, // container id style: { 'version': 8, 'sources': { 'simple-tiles': { 'type': 'raster', // point to our third-party tiles. Note that some examples // show a 'url' property. This only applies to tilesets with // corresponding TileJSON (such as mapbox tiles). 'tiles': [this.mapUrl], 'tileSize': 256 } }, 'layers': [{ 'id': 'simple-tiles', 'type': 'raster', 'source': 'simple-tiles' }] }, center: this.center, zoom: this.minZoom, // starting zoom minZoom: this.minZoom, maxZoom: this.maxZoom, maxBounds: [[this.southWest.lng, this.southWest.lat], [this.northEast.lng, this.northEast.lat]] }); this.map.scrollZoom.setWheelZoomRate(1); /** @type {?} */ const nav = new mapboxgl.NavigationControl({ showCompass: false, showZoom: this.zoomControl }); this.map.addControl(nav, 'top-left'); // disable map rotation using right click + drag this.map.dragRotate.disable(); // disable map rotation using touch rotation gesture this.map.touchZoomRotate.disableRotation(); this.map.dragRotate.disable(); if (this.zoomControl) { this.map.scrollZoom.enable(); } else { this.map.scrollZoom.disable(); } this.disabledDrag(); if (this.mode === 'select') { this.map.on('dragstart', (/** * @param {?} evt * @return {?} */ (evt) => { this.updateCoordinate(); })); this.map.on('drag', (/** * @param {?} evt * @return {?} */ (evt) => { this.updateCoordinate(); })); this.map.on('dragend', (/** * @param {?} evt * @return {?} */ (evt) => { this.updateCoordinate(); })); this.map.on('zoomend', (/** * @param {?} evt * @return {?} */ (evt) => { this.updateCoordinate(); })); } if (this.showMarker) { this.setMarker(); } this.getMap.emit(this.map); } /** * @return {?} */ updateCoordinate() { /** @type {?} */ const center = this.map.getCenter(); this.updatePositionMarker(center.lat, center.lng); this.coordinate.emit(center); } /** * @return {?} */ setMarker() { /** @type {?} */ const positionMarker = this.coordinateMarker || this.map.getCenter(); /** @type {?} */ const geojson = { 'type': 'FeatureCollection', 'features': [ { 'type': 'Feature', 'properties': { 'iconSize': this.markerSize }, 'geometry': { 'type': 'Point', 'coordinates': positionMarker } } ] }; // add markers to map geojson.features.forEach((/** * @param {?} marker * @return {?} */ marker => { // create a DOM element for the marker /** @type {?} */ const el = document.createElement('div'); el.className = 'marker'; el.style.backgroundImage = 'url(' + this.markerUrl + ')'; el.style.width = marker.properties.iconSize[0] + 'px'; el.style.height = marker.properties.iconSize[1] + 'px'; el.draggable = false; // add marker to map /** @type {?} */ const markerIcon = new mapboxgl.Marker(el, { offset: this.markerAnchor }) .setLngLat(marker.geometry.coordinates) .addTo(this.map); this.marker.push(markerIcon); })); this.paneToMarker(positionMarker.lat, positionMarker.lng || positionMarker.lon); this.coordinate.emit(positionMarker); } /** * @param {?} lat * @param {?} lng * @return {?} */ paneToMarker(lat, lng) { this.map.flyTo({ // These options control the ending camera position: centered at // the target, at zoom level 9, and north up. center: [lng, lat], zoom: this.zoomMarker }); } /** * @param {?} lat * @param {?} lng * @return {?} */ updatePositionMarker(lat, lng) { for (let i = 0; i < this.marker.length; i++) { this.marker[i]._lngLat = { lat: lat, lng: lng }; this.marker[i]._update(); } } /** * @return {?} */ resetMarker() { this.updatePositionMarker(this.coordinateMarker.lat, this.coordinateMarker.lng); this.paneToMarker(this.coordinateMarker.lat, this.coordinateMarker.lng || this.coordinateMarker.lon); } } ChiMapComponent.decorators = [ { type: Component, args: [{ selector: 'lib-chi-map', template: "<div id=\"chi-map{{id}}\" [ngStyle]=\"{'width': width , 'height': height}\" class=\"chi-map\"></div>\n", styles: [".chi-map{position:relative;direction:rtl;z-index:10021;transition:height .5s ease-in-out}"] }] } ]; /** @nocollapse */ ChiMapComponent.ctorParameters = () => []; ChiMapComponent.propDecorators = { mapUrl: [{ type: Input }], maxZoom: [{ type: Input }], minZoom: [{ type: Input }], zoom: [{ type: Input }], center: [{ type: Input }], southWest: [{ type: Input }], northEast: [{ type: Input }], mode: [{ type: Input }], zoomControl: [{ type: Input }], dragging: [{ type: Input }], markerUrl: [{ type: Input }], markerSize: [{ type: Input }], markerAnchor: [{ type: Input }], coordinateMarker: [{ type: Input }], resetCoordinate: [{ type: Input }], zoomMarker: [{ type: Input }], width: [{ type: Input }], height: [{ type: Input }], showMarker: [{ type: Input }], coordinate: [{ type: Output }], getMap: [{ type: Output }] }; if (false) { /** @type {?} */ ChiMapComponent.prototype.map; /** @type {?} */ ChiMapComponent.prototype.baseMaps; /** @type {?} */ ChiMapComponent.prototype.mapOptions; /** @type {?} */ ChiMapComponent.prototype.marker; /** @type {?} */ ChiMapComponent.prototype.id; /** @type {?} */ ChiMapComponent.prototype.mapUrl; /** @type {?} */ ChiMapComponent.prototype.maxZoom; /** @type {?} */ ChiMapComponent.prototype.minZoom; /** @type {?} */ ChiMapComponent.prototype.zoom; /** @type {?} */ ChiMapComponent.prototype.center; /** @type {?} */ ChiMapComponent.prototype.southWest; /** @type {?} */ ChiMapComponent.prototype.northEast; /** @type {?} */ ChiMapComponent.prototype.mode; /** @type {?} */ ChiMapComponent.prototype.zoomControl; /** @type {?} */ ChiMapComponent.prototype.dragging; /** @type {?} */ ChiMapComponent.prototype.markerUrl; /** @type {?} */ ChiMapComponent.prototype.markerSize; /** @type {?} */ ChiMapComponent.prototype.markerAnchor; /** @type {?} */ ChiMapComponent.prototype.coordinateMarker; /** @type {?} */ ChiMapComponent.prototype.resetCoordinate; /** @type {?} */ ChiMapComponent.prototype.zoomMarker; /** @type {?} */ ChiMapComponent.prototype.width; /** @type {?} */ ChiMapComponent.prototype.height; /** @type {?} */ ChiMapComponent.prototype.showMarker; /** @type {?} */ ChiMapComponent.prototype.coordinate; /** @type {?} */ ChiMapComponent.prototype.getMap; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hpLW1hcC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9jaGktYXBwLWxpYi8iLCJzb3VyY2VzIjpbImxpYi9jaGktbWFwL2NoaS1tYXAuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSxPQUFPLEVBQUMsU0FBUyxFQUFVLEtBQUssRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUF5QyxNQUFNLGVBQWUsQ0FBQztBQUNySCxPQUFPLEtBQUssUUFBUSxNQUFNLFdBQVcsQ0FBQztBQVF0QyxNQUFNLE9BQU8sZUFBZTtJQThCMUI7UUF6QkEsV0FBTSxHQUFHLEVBQUUsQ0FBQztRQUNaLE9BQUUsR0FBRyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7UUFFZixZQUFPLEdBQUcsRUFBRSxDQUFDO1FBQ2IsWUFBTyxHQUFHLENBQUMsQ0FBQztRQUNaLFNBQUksR0FBRyxDQUFDLENBQUM7UUFDVCxXQUFNLEdBQVEsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDM0IsY0FBUyxHQUFHLEVBQUMsR0FBRyxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFDLENBQUM7UUFDeEMsY0FBUyxHQUFHLEVBQUMsR0FBRyxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFDLENBQUM7UUFDeEMsU0FBSSxHQUFHLFFBQVEsQ0FBQyxDQUFDLE9BQU87O1FBQ3hCLGdCQUFXLEdBQUcsSUFBSSxDQUFDO1FBQ25CLGFBQVEsR0FBRyxJQUFJLENBQUM7UUFNaEIsZUFBVSxHQUFHLEVBQUUsQ0FBQztRQUdoQixlQUFVLEdBQUcsSUFBSSxDQUFDO1FBQ2pCLGVBQVUsR0FBRyxJQUFJLFlBQVksRUFBTyxDQUFDO1FBQ3JDLFdBQU0sR0FBRyxJQUFJLFlBQVksRUFBTyxDQUFDO1FBS3pDLHdHQUF3RztJQUMxRyxDQUFDOzs7OztJQUVELFdBQVcsQ0FBQyxPQUFzQjs7Y0FDMUIsTUFBTSxHQUFpQixPQUFPLENBQUMsTUFBTTs7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NkJBQXdCOztJQUN4QixpQ0FBZ0I7O0lBQ2hCLGtDQUFzQjs7SUFDdEIsa0NBQXFCOztJQUNyQiwrQkFBa0I7O0lBQ2xCLGlDQUFvQzs7SUFDcEMsb0NBQWlEOztJQUNqRCxvQ0FBaUQ7O0lBQ2pELCtCQUF5Qjs7SUFDekIsc0NBQTRCOztJQUM1QixtQ0FBeUI7O0lBQ3pCLG9DQUFtQjs7SUFDbkIscUNBQW9COztJQUNwQix1Q0FBc0I7O0lBQ3RCLDJDQUEwQjs7SUFDMUIsMENBQXlCOztJQUN6QixxQ0FBeUI7O0lBQ3pCLGdDQUFlOztJQUNmLGlDQUFnQjs7SUFDaEIscUNBQTJCOztJQUMzQixxQ0FBK0M7O0lBQy9DLGlDQUEyQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7Q29tcG9uZW50LCBPbkluaXQsIElucHV0LCBPdXRwdXQsIEV2ZW50RW1pdHRlciwgT25DaGFuZ2VzLCBTaW1wbGVDaGFuZ2VzLCBTaW1wbGVDaGFuZ2V9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0ICogYXMgbWFwYm94Z2wgZnJvbSAnbWFwYm94LWdsJztcbmRlY2xhcmUgZnVuY3Rpb24gaGFzaFRoaXModGV4dCwgZW5jcnlwdCk6IGFueTtcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnbGliLWNoaS1tYXAnLFxuICB0ZW1wbGF0ZVVybDogJy4vY2hpLW1hcC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2NoaS1tYXAuY29tcG9uZW50LnNjc3MnXVxufSlcbmV4cG9ydCBjbGFzcyBDaGlNYXBDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcyB7XG5cbiAgcHVibGljIG1hcDtcbiAgcHVibGljIGJhc2VNYXBzOiBhbnk7XG4gIG1hcE9wdGlvbnM7XG4gIG1hcmtlciA9IFtdO1xuICBpZCA9IHRoaXMuaWRHZW5lcmF0b3IoKTtcbiAgQElucHV0KCkgbWFwVXJsO1xuICBASW5wdXQoKSBtYXhab29tID0gMTg7XG4gIEBJbnB1dCgpIG1pblpvb20gPSA1O1xuICBASW5wdXQoKSB6b29tID0gNTtcbiAgQElucHV0KCkgY2VudGVyOiBhbnkgPSBbNTEuNCwgMzUuN107XG4gIEBJbnB1dCgpIHNvdXRoV2VzdCA9IHtsYXQ6IDI0LjM1MDk2OSwgbG5nOiA0NC4wfTtcbiAgQElucHV0KCkgbm9ydGhFYXN0ID0ge2xhdDogMzkuOTEyOTk2LCBsbmc6IDYzLjV9O1xuICBASW5wdXQoKSBtb2RlID0gJ3NlbGVjdCc7IC8vIHZpZXdcbiAgQElucHV0KCkgem9vbUNvbnRyb2wgPSB0cnVlO1xuICBASW5wdXQoKSBkcmFnZ2luZyA9IHRydWU7XG4gIEBJbnB1dCgpIG1hcmtlclVybDtcbiAgQElucHV0KCkgbWFya2VyU2l6ZTtcbiAgQElucHV0KCkgbWFya2VyQW5jaG9yO1xuICBASW5wdXQoKSBjb29yZGluYXRlTWFya2VyO1xuICBASW5wdXQoKSByZXNldENvb3JkaW5hdGU7XG4gIEBJbnB1dCgpIHpvb21NYXJrZXIgPSAxNztcbiAgQElucHV0KCkgd2lkdGg7XG4gIEBJbnB1dCgpIGhlaWdodDtcbiAgQElucHV0KCkgc2hvd01hcmtlciA9IHRydWU7XG4gIEBPdXRwdXQoKSBjb29yZGluYXRlID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG4gIEBPdXRwdXQoKSBnZXRNYXAgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcblxuXG4gIGNvbnN0cnVjdG9yKCkge1xuXG4gICAgLy8gKG1hcGJveGdsIGFzIGFueSkuYWNjZXNzVG9rZW4gPSAncGsuZXlKMUlqb2laR0Z1YzNkcFkyc2lMQ0poSWpvaWVVWmlXbXd0VlNKOS4wY1BReXdkYlBWbXZIaUhKNk53ZFhBJztcbiAgfVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpIHtcbiAgICBjb25zdCBoZWlnaHQ6IFNpbXBsZUNoYW5nZSA9IGNoYW5nZXMuaGVpZ2h0O1xuICAgIGNvbnN0IGlzRHJhZzogU2ltcGxlQ2hhbmdlID0gY2hhbmdlcy5kcmFnZ2luZztcbiAgICBjb25zdCBjb29yZGluYXRlT3JpZ2luOiBTaW1wbGVDaGFuZ2UgPSBjaGFuZ2VzLnJlc2V0Q29vcmRpbmF0ZTtcbiAgICBpZiAoKGNvb3JkaW5hdGVPcmlnaW4gfHwge30pWydjdXJyZW50VmFsdWUnXSkge1xuICAgICAgdGhpcy5yZXNldE1hcmtlcigpO1xuICAgIH1cbiAgICBpZiAoKGlzRHJhZyB8fCB7fSlbJ2N1cnJlbnRWYWx1ZSddID09PSBmYWxzZSB8fCAoaXNEcmFnIHx8IHt9KVsnY3VycmVudFZhbHVlJ10gPT09IHRydWUpIHtcbiAgICAgIHRoaXMuZGlzYWJsZWREcmFnKCk7XG4gICAgfVxuICB9XG5cbiAgbmdPbkluaXQoKSB7XG5cbiAgICBzZXRUaW1lb3V0KF8gPT4ge1xuICAgICAgdGhpcy5pbml0TWFwKCk7XG4gICAgfSwgMTAwKTtcblxuICB9XG5cbiAgaWRHZW5lcmF0b3IoKSB7XG4gICAgY29uc3QgbnVtYmVyID0gTWF0aC5yYW5kb20oKTtcbiAgICBudW1iZXIudG9TdHJpbmcoMzYpO1xuICAgIHJldHVybiBudW1iZXIudG9TdHJpbmcoMzYpLnN1YnN0cigyLCA5KTtcbiAgfVxuXG4gIGRpc2FibGVkRHJhZygpIHtcbiAgICBpZiAoIXRoaXMubWFwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICghdGhpcy5kcmFnZ2luZykge1xuICAgICAgdGhpcy5tYXAuZHJhZ1Bhbi5kaXNhYmxlKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMubWFwLmRyYWdQYW4uZW5hYmxlKCk7XG4gICAgfVxuICB9XG5cbiAgZW5jcnlwdFRpbGVVcmwodXJsLCByZXNvdXJjZVR5cGUpIHtcblxuICAgIGlmIChyZXNvdXJjZVR5cGUgPT09ICdUaWxlJyAmJiB1cmwubWF0Y2goJ2hhc2gnKSkge1xuXG4gICAgICBjb25zdCBhcnIgPSB1cmwuc3BsaXQoJy8nKTtcbiAgICAgIHVybCA9IHVybC5zcGxpdCgnaGFzaCcpWzBdICsgJ2hhc2gvJyArIGhhc2hUaGlzKGFyclthcnIubGVuZ3RoIC0gM10gKyAnLycgKyBhcnJbYXJyLmxlbmd0aCAtIDJdICsgJy8nICsgYXJyW2Fyci5sZW5ndGggLSAxXSwgdHJ1ZSk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB1cmw6IHVybFxuICAgICAgfTtcbiAgICB9XG4gICAgaWYgKHJlc291cmNlVHlwZSA9PT0gJ1RpbGUnICYmIHVybC5tYXRjaCgnZ29vZ2xlJykpIHtcblxuICAgICAgY29uc3QgYXJyID0gKHVybC5zcGxpdCgncGwmJykpWzFdLnNwbGl0KCcvJyk7XG4gICAgICBjb25zdCBhID0gdXJsLnNwbGl0KCcmJyk7XG4gICAgICB1cmwgPSAoYVswXSArICcmJyArIGFbMV0gKyAnJng9JyArIGFyclthcnIubGVuZ3RoIC0gMl0gKyAnJnk9JyArIGFyclthcnIubGVuZ3RoIC0gMV0gKyAnJno9JyArIGFyclthcnIubGVuZ3RoIC0gM10pLnJlcGxhY2UoJy5qcGVnJywgJycpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdXJsOiB1cmxcbiAgICAgIH07XG5cbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdXJsOiB1cmxcbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgaW5pdE1hcCgpIHtcbiAgICB0aGlzLm1hcCA9IG5ldyBtYXBib3hnbC5NYXAoe1xuICAgICAgdHJhbnNmb3JtUmVxdWVzdDogdGhpcy5lbmNyeXB0VGlsZVVybCxcbiAgICAgIGNvbnRhaW5lcjogJ2NoaS1tYXAnICsgdGhpcy5pZCwgLy8gY29udGFpbmVyIGlkXG4gICAgICBzdHlsZToge1xuICAgICAgICAndmVyc2lvbic6IDgsXG4gICAgICAgICdzb3VyY2VzJzoge1xuICAgICAgICAgICdzaW1wbGUtdGlsZXMnOiB7XG4gICAgICAgICAgICAndHlwZSc6ICdyYXN0ZXInLFxuICAgICAgICAgICAgLy8gcG9pbnQgdG8gb3VyIHRoaXJkLXBhcnR5IHRpbGVzLiBOb3RlIHRoYXQgc29tZSBleGFtcGxlc1xuICAgICAgICAgICAgLy8gc2hvdyBhICd1cmwnIHByb3BlcnR5LiBUaGlzIG9ubHkgYXBwbGllcyB0byB0aWxlc2V0cyB3aXRoXG4gICAgICAgICAgICAvLyBjb3JyZXNwb25kaW5nIFRpbGVKU09OIChzdWNoIGFzIG1hcGJveCB0aWxlcykuXG4gICAgICAgICAgICAndGlsZXMnOiBbdGhpcy5tYXBVcmxdLFxuICAgICAgICAgICAgJ3RpbGVTaXplJzogMjU2XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICAnbGF5ZXJzJzogW3tcbiAgICAgICAgICAnaWQnOiAnc2ltcGxlLXRpbGVzJyxcbiAgICAgICAgICAndHlwZSc6ICdyYXN0ZXInLFxuICAgICAgICAgICdzb3VyY2UnOiAnc2ltcGxlLXRpbGVzJ1xuICAgICAgICB9XVxuICAgICAgfSxcbiAgICAgIGNlbnRlcjogdGhpcy5jZW50ZXIsXG4gICAgICB6b29tOiB0aGlzLm1pblpvb20sIC8vIHN0YXJ0aW5nIHpvb21cbiAgICAgIG1pblpvb206IHRoaXMubWluWm9vbSxcbiAgICAgIG1heFpvb206IHRoaXMubWF4Wm9vbSxcbiAgICAgIG1heEJvdW5kczogW1t0aGlzLnNvdXRoV2VzdC5sbmcsIHRoaXMuc291dGhXZXN0LmxhdF0sIFt0aGlzLm5vcnRoRWFzdC5sbmcsIHRoaXMubm9ydGhFYXN0LmxhdF1dXG4gICAgfSk7XG4gICAgdGhpcy5tYXAuc2Nyb2xsWm9vbS5zZXRXaGVlbFpvb21SYXRlKDEpO1xuXG4gICAgY29uc3QgbmF2ID0gbmV3IG1hcGJveGdsLk5hdmlnYXRpb25Db250cm9sKHtcbiAgICAgIHNob3dDb21wYXNzOiBmYWxzZSxcbiAgICAgIHNob3dab29tOiB0aGlzLnpvb21Db250cm9sXG4gICAgfSk7XG4gICAgdGhpcy5tYXAuYWRkQ29udHJvbChuYXYsICd0b3AtbGVmdCcpO1xuICAgIC8vIGRpc2FibGUgbWFwIHJvdGF0aW9uIHVzaW5nIHJpZ2h0IGNsaWNrICsgZHJhZ1xuICAgIHRoaXMubWFwLmRyYWdSb3RhdGUuZGlzYWJsZSgpO1xuXG4gICAgLy8gZGlzYWJsZSBtYXAgcm90YXRpb24gdXNpbmcgdG91Y2ggcm90YXRpb24gZ2VzdHVyZVxuICAgIHRoaXMubWFwLnRvdWNoWm9vbVJvdGF0ZS5kaXNhYmxlUm90YXRpb24oKTtcbiAgICB0aGlzLm1hcC5kcmFnUm90YXRlLmRpc2FibGUoKTtcblxuICAgIGlmICh0aGlzLnpvb21Db250cm9sKSB7XG4gICAgICB0aGlzLm1hcC5zY3JvbGxab29tLmVuYWJsZSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLm1hcC5zY3JvbGxab29tLmRpc2FibGUoKTtcbiAgICB9XG5cblxuICAgIHRoaXMuZGlzYWJsZWREcmFnKCk7XG5cbiAgICBpZiAodGhpcy5tb2RlID09PSAnc2VsZWN0Jykge1xuXG4gICAgICB0aGlzLm1hcC5vbignZHJhZ3N0YXJ0JywgKGV2dCkgPT4ge1xuXG4gICAgICAgIHRoaXMudXBkYXRlQ29vcmRpbmF0ZSgpO1xuICAgICAgfSk7XG4gICAgICB0aGlzLm1hcC5vbignZHJhZycsIChldnQpID0+IHtcblxuICAgICAgICB0aGlzLnVwZGF0ZUNvb3JkaW5hdGUoKTtcbiAgICAgIH0pO1xuICAgICAgdGhpcy5tYXAub24oJ2RyYWdlbmQnLCAoZXZ0KSA9PiB7XG4gICAgICAgIHRoaXMudXBkYXRlQ29vcmRpbmF0ZSgpO1xuICAgICAgfSk7XG4gICAgICB0aGlzLm1hcC5vbignem9vbWVuZCcsIChldnQpID0+IHtcbiAgICAgICAgdGhpcy51cGRhdGVDb29yZGluYXRlKCk7XG4gICAgICB9KTtcblxuICAgIH1cblxuICAgIGlmICh0aGlzLnNob3dNYXJrZXIpIHtcbiAgICAgIHRoaXMuc2V0TWFya2VyKCk7XG4gICAgfVxuICAgIHRoaXMuZ2V0TWFwLmVtaXQodGhpcy5tYXApO1xuXG4gIH1cblxuICB1cGRhdGVDb29yZGluYXRlKCkge1xuICAgIGNvbnN0IGNlbnRlciA9IHRoaXMubWFwLmdldENlbnRlcigpO1xuICAgIHRoaXMudXBkYXRlUG9zaXRpb25NYXJrZXIoY2VudGVyLmxhdCwgY2VudGVyLmxuZyk7XG4gICAgdGhpcy5jb29yZGluYXRlLmVtaXQoY2VudGVyKTtcbiAgfVxuXG4gIHNldE1hcmtlcigpIHtcblxuICAgIGNvbnN0IHBvc2l0aW9uTWFya2VyID0gdGhpcy5jb29yZGluYXRlTWFya2VyIHx8IHRoaXMubWFwLmdldENlbnRlcigpO1xuICAgIGNvbnN0IGdlb2pzb24gPSB7XG4gICAgICAndHlwZSc6ICdGZWF0dXJlQ29sbGVjdGlvbicsXG4gICAgICAnZmVhdHVyZXMnOiBbXG4gICAgICAgIHtcbiAgICAgICAgICAndHlwZSc6ICdGZWF0dXJlJyxcbiAgICAgICAgICAncHJvcGVydGllcyc6IHtcbiAgICAgICAgICAgICdpY29uU2l6ZSc6IHRoaXMubWFya2VyU2l6ZVxuICAgICAgICAgIH0sXG4gICAgICAgICAgJ2dlb21ldHJ5Jzoge1xuICAgICAgICAgICAgJ3R5cGUnOiAnUG9pbnQnLFxuICAgICAgICAgICAgJ2Nvb3JkaW5hdGVzJzogcG9zaXRpb25NYXJrZXJcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIF1cbiAgICB9O1xuXG4gICAgLy8gYWRkIG1hcmtlcnMgdG8gbWFwXG4gICAgZ2VvanNvbi5mZWF0dXJlcy5mb3JFYWNoKG1hcmtlciA9PiB7XG4gICAgICAvLyBjcmVhdGUgYSBET00gZWxlbWVudCBmb3IgdGhlIG1hcmtlclxuICAgICAgY29uc3QgZWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgIGVsLmNsYXNzTmFtZSA9ICdtYXJrZXInO1xuICAgICAgZWwuc3R5bGUuYmFja2dyb3VuZEltYWdlID0gJ3VybCgnICsgdGhpcy5tYXJrZXJVcmwgKyAnKSc7XG4gICAgICBlbC5zdHlsZS53aWR0aCA9IG1hcmtlci5wcm9wZXJ0aWVzLmljb25TaXplWzBdICsgJ3B4JztcbiAgICAgIGVsLnN0eWxlLmhlaWdodCA9IG1hcmtlci5wcm9wZXJ0aWVzLmljb25TaXplWzFdICsgJ3B4JztcbiAgICAgIGVsLmRyYWdnYWJsZSA9IGZhbHNlO1xuXG4gICAgICAvLyBhZGQgbWFya2VyIHRvIG1hcFxuXG5cbiAgICAgIGNvbnN0IG1hcmtlckljb24gPSBuZXcgbWFwYm94Z2wuTWFya2VyKGVsLCB7b2Zmc2V0OiB0aGlzLm1hcmtlckFuY2hvcn0pXG4gICAgICAgIC5zZXRMbmdMYXQobWFya2VyLmdlb21ldHJ5LmNvb3JkaW5hdGVzKVxuICAgICAgICAuYWRkVG8odGhpcy5tYXApO1xuICAgICAgdGhpcy5tYXJrZXIucHVzaChtYXJrZXJJY29uKTtcblxuICAgIH0pO1xuXG4gICAgdGhpcy5wYW5lVG9NYXJrZXIocG9zaXRpb25NYXJrZXIubGF0LCBwb3NpdGlvbk1hcmtlci5sbmcgfHwgcG9zaXRpb25NYXJrZXIubG9uKTtcbiAgICB0aGlzLmNvb3JkaW5hdGUuZW1pdChwb3NpdGlvbk1hcmtlcik7XG4gIH1cblxuICBwYW5lVG9NYXJrZXIobGF0LCBsbmcpIHtcbiAgICB0aGlzLm1hcC5mbHlUbyh7XG4gICAgICAvLyBUaGVzZSBvcHRpb25zIGNvbnRyb2wgdGhlIGVuZGluZyBjYW1lcmEgcG9zaXRpb246IGNlbnRlcmVkIGF0XG4gICAgICAvLyB0aGUgdGFyZ2V0LCBhdCB6b29tIGxldmVsIDksIGFuZCBub3J0aCB1cC5cbiAgICAgIGNlbnRlcjogW2xuZywgbGF0XSxcbiAgICAgIHpvb206IHRoaXMuem9vbU1hcmtlclxuICAgIH0pO1xuICB9XG5cbiAgdXBkYXRlUG9zaXRpb25NYXJrZXIobGF0LCBsbmcpIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMubWFya2VyLmxlbmd0aDsgaSsrKSB7XG4gICAgICB0aGlzLm1hcmtlcltpXS5fbG5nTGF0ID0ge2xhdDogbGF0LCBsbmc6IGxuZ307XG4gICAgICB0aGlzLm1hcmtlcltpXS5fdXBkYXRlKCk7XG4gICAgfVxuICB9XG5cbiAgcmVzZXRNYXJrZXIoKSB7XG4gICAgdGhpcy51cGRhdGVQb3NpdGlvbk1hcmtlcih0aGlzLmNvb3JkaW5hdGVNYXJrZXIubGF0LCB0aGlzLmNvb3JkaW5hdGVNYXJrZXIubG5nKTtcbiAgICB0aGlzLnBhbmVUb01hcmtlcih0aGlzLmNvb3JkaW5hdGVNYXJrZXIubGF0LCB0aGlzLmNvb3JkaW5hdGVNYXJrZXIubG5nIHx8IHRoaXMuY29vcmRpbmF0ZU1hcmtlci5sb24pO1xuICB9XG5cblxufVxuIl19