UNPKG

controlled-rising-skyline

Version:

This library provides a rising skyline chart with an horizontal control panel control. This widget is linked to a dynamic history of buildings. An animation displays the rising of the skyline.

172 lines 16.9 kB
import { Component, EventEmitter, HostBinding, Input, Output } from '@angular/core'; import { RisingSkylineService } from 'rising-skyline'; import { BehaviorSubject } from 'rxjs'; export class ControlledRisingSkylineComponent { constructor(skylineService) { this.skylineService = skylineService; /** * The width of the container, with its units of mesure (px, %, em...). * Defaut value is __'600px'__; */ this.width = '600px'; /** * The height of the container, with its units of mesure (px, %, em...). * Defaut value is _'400px'_; */ this.height = '400px'; /** * The margin around the container. * Defaut value is _'10px'_; */ this.margin = '10px'; /** /** * The width of each building on the skyline without the unit of measure. * Defaut value is __40__; */ this.buildingWidth = 40; /** * This behaviorSubject emits the complete story of the rising skyline. * * This reveived array will be passed to the __SkylineService__. */ this.risingSkylineHistory$ = new BehaviorSubject([]); /** * Starting speed of the animation in ms. * Default value is _30_ */ this.speed = 30; /** * __Starting__ color of the color gradation. * Default value is _ping_ */ this.startingColor = 'red'; /** * __Ending__ color of the color gradation. * Default value is _blue_ */ this.endingColor = 'green'; /** * Always display the vertical title on top of each building. * * Default value is **false**. */ this.displayVerticalTitle = false; /** * Display the vertical title when the building height reaches this value. * * Default value is **10**. */ this.buildingMinimumHeightVerticalTitle = 10; /** * Color of the skyline container */ this.skylineBackgroundColor = 'transparent'; /** * Color of the skyline control panel */ this.controlBackgroundColor = 'lightGrey'; /** * __Slider__ color. * Default value is _violet_ */ this.sliderColor = 'violet'; /** * (_Internal_) debug mode. * Default value is **false** */ this.debug = false; /** * This messenger wil inform the parent container that the user has clicked a building. */ this.onClickBuilding = new EventEmitter(); /** * This messenger will inform the parent container that the user is entering on a building. */ this.onEnterBuilding = new EventEmitter(); /** * This messenger wil inform the parent container that the user is entering on a building. */ this.onLeaveBuilding = new EventEmitter(); /** * The current position of floor _(or episode)_ being drawn. */ this.positionOfFloor = 0; } ngOnInit() { if (this.debug) { console.log('Skyline w ' + this.width + ', h ' + this.height); } this.subscriptionSkyline = this.skylineService.episode$ .subscribe({ next: floors => this.positionOfFloor++ }); } /** * After view initialization : Here, we set the width of the container. */ ngAfterViewInit() { const mainDiv = document.getElementById('mainDiv'); if (mainDiv) { mainDiv.setAttribute('style', 'width:' + this.width + 'px;height:' + this.height + 'px'); if (this.debug) { console.log(mainDiv.getAttribute('style')); } } else { console.error('INTERNAL ERROR : Did not retrieve the main div'); } } /** * Mouse is entering the building. */ mouseEnterBuilding($event) { this.onEnterBuilding.emit($event); } /** * Mouse is leaving the building. */ mouseLeaveBuilding($event) { this.onLeaveBuilding.emit($event); } /** * Mouse is clicking the building. */ mouseClickBuilding($event) { this.onClickBuilding.emit($event); } ngOnDestroy() { this.subscriptionSkyline.unsubscribe(); } } ControlledRisingSkylineComponent.decorators = [ { type: Component, args: [{ selector: 'controlled-rising-skyline', template: "<div id=\"mainDiv\" >\n\n\t<rising-skyline\n\t\t[width] = width\n\t\t[height] = height\n\t\t[margin] = margin\n\t\t[risingSkylineHistory$] = risingSkylineHistory$\n\t\t[speed] = speed\n\t\t[displayVerticalTitle] = displayVerticalTitle\n\t\t[buildingMinimumHeightVerticalTitle]=buildingMinimumHeightVerticalTitle\n\t\t[startingColor] = startingColor\n\t\t[endingColor] = endingColor\n\t\t[font] = font\n\t\t(onClickBuilding)=\"mouseClickBuilding($event)\"\n\t\t(onEnterBuilding)=\"mouseEnterBuilding($event)\"\n\t\t(onLeaveBuilding)=\"mouseLeaveBuilding($event)\">\t\t\n\t</rising-skyline>\n\n\t<app-panel-control \n\t\t[backgroundColor] = controlBackgroundColor\n\t\t[sliderColor] = sliderColor\n\t\t[debug] = debug>\n\t</app-panel-control>\n</div>", styles: ["#mainDiv{background-color:var(--skyline-background-color);width:var(--mainDiv-width);height:var(--mainDiv-height)}\n"] },] } ]; ControlledRisingSkylineComponent.ctorParameters = () => [ { type: RisingSkylineService } ]; ControlledRisingSkylineComponent.propDecorators = { width: [{ type: Input }, { type: HostBinding, args: ['style.--mainDiv-width',] }], height: [{ type: Input }, { type: HostBinding, args: ['style.--mainDiv-height',] }], margin: [{ type: Input }], buildingWidth: [{ type: Input }], risingSkylineHistory$: [{ type: Input }], speed: [{ type: Input }], startingColor: [{ type: Input }], endingColor: [{ type: Input }], displayVerticalTitle: [{ type: Input }], buildingMinimumHeightVerticalTitle: [{ type: Input }], font: [{ type: Input }], skylineBackgroundColor: [{ type: HostBinding, args: ['style.--skyline-background-color',] }, { type: Input }], controlBackgroundColor: [{ type: Input }], sliderColor: [{ type: Input }], debug: [{ type: Input }], onClickBuilding: [{ type: Output }], onEnterBuilding: [{ type: Output }], onLeaveBuilding: [{ type: Output }] }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udHJvbGxlZC1yaXNpbmctc2t5bGluZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9jb250cm9sbGVkLXJpc2luZy1za3lsaW5lL3NyYy9saWIvY29udHJvbGxlZC1yaXNpbmctc2t5bGluZS5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFpQixTQUFTLEVBQUUsWUFBWSxFQUFFLFdBQVcsRUFBRSxLQUFLLEVBQXFCLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN0SCxPQUFPLEVBQThCLG9CQUFvQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDbEYsT0FBTyxFQUFFLGVBQWUsRUFBZ0IsTUFBTSxNQUFNLENBQUM7QUFPckQsTUFBTSxPQUFPLGdDQUFnQztJQXdJNUMsWUFBbUIsY0FBb0M7UUFBcEMsbUJBQWMsR0FBZCxjQUFjLENBQXNCO1FBdEl2RDs7O1dBR0c7UUFHSSxVQUFLLEdBQUcsT0FBTyxDQUFDO1FBRXZCOzs7V0FHRztRQUdJLFdBQU0sR0FBRyxPQUFPLENBQUM7UUFFeEI7OztXQUdHO1FBRUksV0FBTSxHQUFHLE1BQU0sQ0FBQztRQUV2Qjs7OztXQUlHO1FBRUksa0JBQWEsR0FBRyxFQUFFLENBQUM7UUFFMUI7Ozs7V0FJRztRQUVJLDBCQUFxQixHQUFHLElBQUksZUFBZSxDQUFhLEVBQUUsQ0FBQyxDQUFDO1FBRW5FOzs7V0FHRztRQUVJLFVBQUssR0FBRyxFQUFFLENBQUM7UUFFbEI7OztXQUdHO1FBRUksa0JBQWEsR0FBRyxLQUFLLENBQUM7UUFFN0I7OztXQUdHO1FBRUksZ0JBQVcsR0FBRyxPQUFPLENBQUM7UUFFN0I7Ozs7V0FJRztRQUNNLHlCQUFvQixHQUFHLEtBQUssQ0FBQztRQUV0Qzs7OztXQUlHO1FBQ00sdUNBQWtDLEdBQUcsRUFBRSxDQUFDO1FBT2pEOztXQUVHO1FBRU0sMkJBQXNCLEdBQUcsYUFBYSxDQUFDO1FBRWhEOztXQUVHO1FBQ00sMkJBQXNCLEdBQUcsV0FBVyxDQUFDO1FBRTlDOzs7V0FHRztRQUVJLGdCQUFXLEdBQUcsUUFBUSxDQUFDO1FBRTlCOzs7V0FHRztRQUVJLFVBQUssR0FBRyxLQUFLLENBQUM7UUFFckI7O1dBRUc7UUFDTyxvQkFBZSxHQUFHLElBQUksWUFBWSxFQUFvQixDQUFDO1FBRWpFOztXQUVHO1FBQ08sb0JBQWUsR0FBRyxJQUFJLFlBQVksRUFBb0IsQ0FBQztRQUVqRTs7V0FFRztRQUNPLG9CQUFlLEdBQUcsSUFBSSxZQUFZLEVBQW9CLENBQUM7UUFPakU7O1dBRUc7UUFDSSxvQkFBZSxHQUFHLENBQUMsQ0FBQztJQVEzQixDQUFDO0lBR0QsUUFBUTtRQUNQLElBQUksSUFBSSxDQUFDLEtBQUssRUFBRTtZQUNmLE9BQU8sQ0FBQyxHQUFHLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxLQUFLLEdBQUcsTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztTQUM5RDtRQUVELElBQUksQ0FBQyxtQkFBbUIsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLFFBQVE7YUFDckQsU0FBUyxDQUFDO1lBQ1YsSUFBSSxFQUFFLE1BQU0sQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLGVBQWUsRUFBRTtTQUN0QyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBR0Q7O09BRUc7SUFDSCxlQUFlO1FBQ2QsTUFBTSxPQUFPLEdBQUcsUUFBUSxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUNuRCxJQUFJLE9BQU8sRUFBRTtZQUNaLE9BQU8sQ0FBQyxZQUFZLENBQUMsT0FBTyxFQUFFLFFBQVEsR0FBRyxJQUFJLENBQUMsS0FBSyxHQUFHLFlBQVksR0FBRyxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxDQUFDO1lBQ3pGLElBQUksSUFBSSxDQUFDLEtBQUssRUFBRTtnQkFDZixPQUFPLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQzthQUMzQztTQUNEO2FBQU07WUFDTixPQUFPLENBQUMsS0FBSyxDQUFDLGdEQUFnRCxDQUFDLENBQUM7U0FDaEU7SUFDRixDQUFDO0lBRUQ7O09BRUc7SUFDSSxrQkFBa0IsQ0FBQyxNQUF3QjtRQUNqRCxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUNuQyxDQUFDO0lBRUQ7O09BRUc7SUFDSSxrQkFBa0IsQ0FBQyxNQUF3QjtRQUNqRCxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUNuQyxDQUFDO0lBRUQ7O09BRUc7SUFDSSxrQkFBa0IsQ0FBQyxNQUF3QjtRQUNqRCxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUNuQyxDQUFDO0lBR0QsV0FBVztRQUNWLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUN4QyxDQUFDOzs7WUFwTUQsU0FBUyxTQUFDO2dCQUNWLFFBQVEsRUFBRSwyQkFBMkI7Z0JBQ3JDLHd2QkFBK0M7O2FBRS9DOzs7WUFQb0Msb0JBQW9COzs7b0JBY3ZELEtBQUssWUFDTCxXQUFXLFNBQUMsdUJBQXVCO3FCQU9uQyxLQUFLLFlBQ0wsV0FBVyxTQUFDLHdCQUF3QjtxQkFPcEMsS0FBSzs0QkFRTCxLQUFLO29DQVFMLEtBQUs7b0JBT0wsS0FBSzs0QkFPTCxLQUFLOzBCQU9MLEtBQUs7bUNBUUwsS0FBSztpREFPTCxLQUFLO21CQUtMLEtBQUs7cUNBS0wsV0FBVyxTQUFDLGtDQUFrQyxjQUM5QyxLQUFLO3FDQUtMLEtBQUs7MEJBTUwsS0FBSztvQkFPTCxLQUFLOzhCQU1MLE1BQU07OEJBS04sTUFBTTs4QkFLTixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQWZ0ZXJWaWV3SW5pdCwgQ29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIEhvc3RCaW5kaW5nLCBJbnB1dCwgT25EZXN0cm95LCBPbkluaXQsIE91dHB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQnVpbGRpbmcsIEJ1aWxkaW5nU2VsZWN0ZWQsIFJpc2luZ1NreWxpbmVTZXJ2aWNlIH0gZnJvbSAncmlzaW5nLXNreWxpbmUnO1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcblxuQENvbXBvbmVudCh7XG5cdHNlbGVjdG9yOiAnY29udHJvbGxlZC1yaXNpbmctc2t5bGluZScsXG5cdHRlbXBsYXRlVXJsOiAnLi9jb250cm9sbGVkLXJpc2luZy1za3lsaW5lLmh0bWwnLFxuXHRzdHlsZVVybHM6IFsnLi9jb250cm9sbGVkLXJpc2luZy1za3lsaW5lLmNzcyddXG59KVxuZXhwb3J0IGNsYXNzIENvbnRyb2xsZWRSaXNpbmdTa3lsaW5lQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3kge1xuXG5cdC8qKlxuXHQgKiBUaGUgd2lkdGggb2YgdGhlIGNvbnRhaW5lciwgd2l0aCBpdHMgdW5pdHMgb2YgbWVzdXJlIChweCwgJSwgZW0uLi4pLlxuXHQgKiBEZWZhdXQgdmFsdWUgaXMgX18nNjAwcHgnX187XG5cdCAqL1xuXHRASW5wdXQoKVxuXHRASG9zdEJpbmRpbmcoJ3N0eWxlLi0tbWFpbkRpdi13aWR0aCcpXG5cdHB1YmxpYyB3aWR0aCA9ICc2MDBweCc7XG5cblx0LyoqXG5cdCAqIFRoZSBoZWlnaHQgb2YgdGhlIGNvbnRhaW5lciwgd2l0aCBpdHMgdW5pdHMgb2YgbWVzdXJlIChweCwgJSwgZW0uLi4pLlxuXHQgKiBEZWZhdXQgdmFsdWUgaXMgXyc0MDBweCdfO1xuXHQgKi9cblx0QElucHV0KClcblx0QEhvc3RCaW5kaW5nKCdzdHlsZS4tLW1haW5EaXYtaGVpZ2h0Jylcblx0cHVibGljIGhlaWdodCA9ICc0MDBweCc7XG5cblx0LyoqXG5cdCAqIFRoZSBtYXJnaW4gYXJvdW5kIHRoZSBjb250YWluZXIuXG5cdCAqIERlZmF1dCB2YWx1ZSBpcyBfJzEwcHgnXztcblx0ICovXG5cdEBJbnB1dCgpXG5cdHB1YmxpYyBtYXJnaW4gPSAnMTBweCc7XG5cblx0LyoqXG5cdC8qKlxuXHQgKiBUaGUgd2lkdGggb2YgZWFjaCBidWlsZGluZyBvbiB0aGUgc2t5bGluZSB3aXRob3V0IHRoZSB1bml0IG9mIG1lYXN1cmUuXG5cdCAqIERlZmF1dCB2YWx1ZSBpcyBfXzQwX187XG5cdCAqL1xuXHRASW5wdXQoKVxuXHRwdWJsaWMgYnVpbGRpbmdXaWR0aCA9IDQwO1xuXG5cdC8qKlxuXHQgKiBUaGlzIGJlaGF2aW9yU3ViamVjdCBlbWl0cyB0aGUgY29tcGxldGUgc3Rvcnkgb2YgdGhlIHJpc2luZyBza3lsaW5lLlxuXHQgKlxuXHQgKiBUaGlzIHJldmVpdmVkIGFycmF5IHdpbGwgYmUgcGFzc2VkIHRvIHRoZSBfX1NreWxpbmVTZXJ2aWNlX18uXG5cdCAqL1xuXHRASW5wdXQoKVxuXHRwdWJsaWMgcmlzaW5nU2t5bGluZUhpc3RvcnkkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxCdWlsZGluZ1tdPihbXSk7XG5cblx0LyoqXG5cdCAqIFN0YXJ0aW5nIHNwZWVkIG9mIHRoZSBhbmltYXRpb24gaW4gbXMuXG5cdCAqIERlZmF1bHQgdmFsdWUgaXMgXzMwX1xuXHQgKi9cblx0QElucHV0KClcblx0cHVibGljIHNwZWVkID0gMzA7XG5cblx0LyoqXG5cdCAqIF9fU3RhcnRpbmdfXyBjb2xvciBvZiB0aGUgY29sb3IgZ3JhZGF0aW9uLlxuXHQgKiBEZWZhdWx0IHZhbHVlIGlzIF9waW5nX1xuXHQgKi9cblx0QElucHV0KClcblx0cHVibGljIHN0YXJ0aW5nQ29sb3IgPSAncmVkJztcblxuXHQvKipcblx0ICogIF9fRW5kaW5nX18gY29sb3Igb2YgdGhlIGNvbG9yIGdyYWRhdGlvbi5cblx0ICogRGVmYXVsdCB2YWx1ZSBpcyBfYmx1ZV9cblx0ICovXG5cdEBJbnB1dCgpXG5cdHB1YmxpYyBlbmRpbmdDb2xvciA9ICdncmVlbic7XG5cblx0LyoqXG5cdCAqIEFsd2F5cyBkaXNwbGF5IHRoZSB2ZXJ0aWNhbCB0aXRsZSBvbiB0b3Agb2YgZWFjaCBidWlsZGluZy5cblx0ICogXG5cdCAqIERlZmF1bHQgdmFsdWUgaXMgKipmYWxzZSoqLlxuXHQgKi9cblx0QElucHV0KCkgZGlzcGxheVZlcnRpY2FsVGl0bGUgPSBmYWxzZTtcblxuXHQvKipcblx0ICogRGlzcGxheSB0aGUgdmVydGljYWwgdGl0bGUgd2hlbiB0aGUgYnVpbGRpbmcgaGVpZ2h0IHJlYWNoZXMgdGhpcyB2YWx1ZS5cblx0ICogXG5cdCAqIERlZmF1bHQgdmFsdWUgaXMgKioxMCoqLlxuXHQgKi9cblx0QElucHV0KCkgYnVpbGRpbmdNaW5pbXVtSGVpZ2h0VmVydGljYWxUaXRsZSA9IDEwO1xuXG5cdC8qKlxuXHQgKiBUaGUgZm9udCB0byB1c2UgZm9yIHRoZSB2ZXJ0aWNhbCB0aXRsZVxuXHQgKi9cblx0QElucHV0KCkgZm9udDogc3RyaW5nO1xuXG5cdC8qKlxuXHQgKiBDb2xvciBvZiB0aGUgc2t5bGluZSBjb250YWluZXJcblx0ICovXG5cdEBIb3N0QmluZGluZygnc3R5bGUuLS1za3lsaW5lLWJhY2tncm91bmQtY29sb3InKVxuXHRASW5wdXQoKSBza3lsaW5lQmFja2dyb3VuZENvbG9yID0gJ3RyYW5zcGFyZW50JztcblxuXHQvKipcblx0ICogQ29sb3Igb2YgdGhlIHNreWxpbmUgY29udHJvbCBwYW5lbFxuXHQgKi9cblx0QElucHV0KCkgY29udHJvbEJhY2tncm91bmRDb2xvciA9ICdsaWdodEdyZXknO1xuXG5cdC8qKlxuXHQgKiAgX19TbGlkZXJfXyBjb2xvci5cblx0ICogRGVmYXVsdCB2YWx1ZSBpcyBfdmlvbGV0X1xuXHQgKi9cblx0QElucHV0KClcblx0cHVibGljIHNsaWRlckNvbG9yID0gJ3Zpb2xldCc7XG5cblx0LyoqXG5cdCAqICAoX0ludGVybmFsXykgZGVidWcgbW9kZS5cblx0ICogRGVmYXVsdCB2YWx1ZSBpcyAqKmZhbHNlKipcblx0ICovXG5cdEBJbnB1dCgpXG5cdHB1YmxpYyBkZWJ1ZyA9IGZhbHNlO1xuXG5cdC8qKlxuXHQgKiBUaGlzIG1lc3NlbmdlciB3aWwgaW5mb3JtIHRoZSBwYXJlbnQgY29udGFpbmVyIHRoYXQgdGhlIHVzZXIgaGFzIGNsaWNrZWQgYSBidWlsZGluZy5cblx0ICovXG5cdEBPdXRwdXQoKSBvbkNsaWNrQnVpbGRpbmcgPSBuZXcgRXZlbnRFbWl0dGVyPEJ1aWxkaW5nU2VsZWN0ZWQ+KCk7XG5cblx0LyoqXG5cdCAqIFRoaXMgbWVzc2VuZ2VyIHdpbGwgaW5mb3JtIHRoZSBwYXJlbnQgY29udGFpbmVyIHRoYXQgdGhlIHVzZXIgaXMgZW50ZXJpbmcgb24gYSBidWlsZGluZy5cblx0ICovXG5cdEBPdXRwdXQoKSBvbkVudGVyQnVpbGRpbmcgPSBuZXcgRXZlbnRFbWl0dGVyPEJ1aWxkaW5nU2VsZWN0ZWQ+KCk7XG5cblx0LyoqXG5cdCAqIFRoaXMgbWVzc2VuZ2VyIHdpbCBpbmZvcm0gdGhlIHBhcmVudCBjb250YWluZXIgdGhhdCB0aGUgdXNlciBpcyBlbnRlcmluZyBvbiBhIGJ1aWxkaW5nLlxuXHQgKi9cblx0QE91dHB1dCgpIG9uTGVhdmVCdWlsZGluZyA9IG5ldyBFdmVudEVtaXR0ZXI8QnVpbGRpbmdTZWxlY3RlZD4oKTtcblxuXHQvKipcblx0ICogVGhlIG51bWJlciBvZiBmbG9vcnMgXyhvciBlcGlzb2RlcylfIGludm9sdmVkIGluIHRoZSBza3lsaW5lLCBzdGFydGluZyBmcm9tIHNreWxpbmUuc3RhcnREYXRlIHRvIHNreWxpbmUubGFzdERhdGVcblx0ICovXG5cdHB1YmxpYyBudW1iZXJPZkZsb29ycztcblxuXHQvKipcblx0ICogVGhlIGN1cnJlbnQgcG9zaXRpb24gb2YgZmxvb3IgXyhvciBlcGlzb2RlKV8gYmVpbmcgZHJhd24uXG5cdCAqL1xuXHRwdWJsaWMgcG9zaXRpb25PZkZsb29yID0gMDtcblxuXHQvKipcblx0ICogVGhlIHN1YnNjcmlwdGlvbiBvbiB0aGUgc2t5bGluZSByaXNpbmcuXG5cdCAqL1xuXHRwcml2YXRlIHN1YnNjcmlwdGlvblNreWxpbmU6IFN1YnNjcmlwdGlvbjtcblxuXHRjb25zdHJ1Y3RvcihwdWJsaWMgc2t5bGluZVNlcnZpY2U6IFJpc2luZ1NreWxpbmVTZXJ2aWNlKSB7XG5cdH1cblxuXG5cdG5nT25Jbml0KCk6IHZvaWQge1xuXHRcdGlmICh0aGlzLmRlYnVnKSB7XG5cdFx0XHRjb25zb2xlLmxvZygnU2t5bGluZSB3ICcgKyB0aGlzLndpZHRoICsgJywgaCAnICsgdGhpcy5oZWlnaHQpO1xuXHRcdH1cblxuXHRcdHRoaXMuc3Vic2NyaXB0aW9uU2t5bGluZSA9IHRoaXMuc2t5bGluZVNlcnZpY2UuZXBpc29kZSRcblx0XHRcdC5zdWJzY3JpYmUoe1xuXHRcdFx0XHRuZXh0OiBmbG9vcnMgPT4gdGhpcy5wb3NpdGlvbk9mRmxvb3IrK1xuXHRcdFx0fSk7XG5cdH1cblxuXG5cdC8qKlxuXHQgKiBBZnRlciB2aWV3IGluaXRpYWxpemF0aW9uIDogSGVyZSwgd2Ugc2V0IHRoZSB3aWR0aCBvZiB0aGUgY29udGFpbmVyLlxuXHQgKi9cblx0bmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuXHRcdGNvbnN0IG1haW5EaXYgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWFpbkRpdicpO1xuXHRcdGlmIChtYWluRGl2KSB7XG5cdFx0XHRtYWluRGl2LnNldEF0dHJpYnV0ZSgnc3R5bGUnLCAnd2lkdGg6JyArIHRoaXMud2lkdGggKyAncHg7aGVpZ2h0OicgKyB0aGlzLmhlaWdodCArICdweCcpO1xuXHRcdFx0aWYgKHRoaXMuZGVidWcpIHtcblx0XHRcdFx0Y29uc29sZS5sb2cobWFpbkRpdi5nZXRBdHRyaWJ1dGUoJ3N0eWxlJykpO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHRjb25zb2xlLmVycm9yKCdJTlRFUk5BTCBFUlJPUiA6IERpZCBub3QgcmV0cmlldmUgdGhlIG1haW4gZGl2Jyk7XG5cdFx0fVxuXHR9XG5cdFxuXHQvKipcblx0ICogTW91c2UgaXMgZW50ZXJpbmcgdGhlIGJ1aWxkaW5nLlxuXHQgKi9cblx0cHVibGljIG1vdXNlRW50ZXJCdWlsZGluZygkZXZlbnQ6IEJ1aWxkaW5nU2VsZWN0ZWQpOiB2b2lkIHtcblx0XHR0aGlzLm9uRW50ZXJCdWlsZGluZy5lbWl0KCRldmVudCk7XG5cdH1cblxuXHQvKipcblx0ICogTW91c2UgaXMgbGVhdmluZyB0aGUgYnVpbGRpbmcuXG5cdCAqL1xuXHRwdWJsaWMgbW91c2VMZWF2ZUJ1aWxkaW5nKCRldmVudDogQnVpbGRpbmdTZWxlY3RlZCk6IHZvaWQge1xuXHRcdHRoaXMub25MZWF2ZUJ1aWxkaW5nLmVtaXQoJGV2ZW50KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBNb3VzZSBpcyBjbGlja2luZyB0aGUgYnVpbGRpbmcuXG5cdCAqL1xuXHRwdWJsaWMgbW91c2VDbGlja0J1aWxkaW5nKCRldmVudDogQnVpbGRpbmdTZWxlY3RlZCk6IHZvaWQge1xuXHRcdHRoaXMub25DbGlja0J1aWxkaW5nLmVtaXQoJGV2ZW50KTtcblx0fVxuXG5cblx0bmdPbkRlc3Ryb3koKTogdm9pZCB7XG5cdFx0dGhpcy5zdWJzY3JpcHRpb25Ta3lsaW5lLnVuc3Vic2NyaWJlKCk7XG5cdH1cbn1cbiJdfQ==