UNPKG

ng-d3-graphs

Version:

<img src="./assets/ng-d3.png" alt="drawing" width="250" height="250"/>

159 lines 20.4 kB
import * as tslib_1 from "tslib"; import { ChangeDetectionStrategy, Component, ElementRef, HostListener, Input, OnInit, ViewEncapsulation, } from '@angular/core'; import * as d3 from 'd3'; import { Subject } from 'rxjs'; import { debounceTime } from 'rxjs/operators'; let PieComponent = class PieComponent { constructor(container) { this.container = container; this.labels = []; this.data = []; this.backgroundColors = d3.schemeSet2; this.radius = 100; this.options = {}; this.color = this.interpolateColor(); // range [0,1] -> builtin range of colors. this.defaultSliceColor = 'steerblue'; this.labelsAndData = []; this.viewBox = {}; this._options = { width: 300, height: 300, margin: { top: 50, right: 50, bottom: 50, left: 50 }, }; this.onResize$ = new Subject(); } onResize() { this.onResize$.next(); } ngOnInit() { this.options = Object.assign({}, this._options, this.options); this.viewBox = { minX: -this.options.margin.left, minY: 0, width: Number(this.options.width) + Number(this.options.margin.left) + Number(this.options.margin.right), height: this.options.height, }; this.onBgdColorUndefined(); this.onResizeEvent(); this.render(); } onBgdColorUndefined() { if (this.backgroundColors.length === 0) { // TODO: check linter // for (let index = 0; index < this.data.length; index++) { // this.backgroundColors.push(this.defaultSliceColor); // } for (const iterator of this.data) { this.backgroundColors.push(this.defaultSliceColor); } } } render() { const currentWidth = parseInt(d3.select(this.container.nativeElement).select('div').style('width'), 10); const currentHeight = parseInt(d3.select(this.container.nativeElement).select('div').style('height'), 10); const radius = Math.min(this.options.width, this.options.height) / 2 - this.options.margin.top; const svg = d3 .select(this.container.nativeElement) .select('div') .append('svg') .attr('width', currentWidth) .attr('height', currentHeight) .attr('viewBox', `${this.viewBox.minX} ${this.viewBox.minY} ${this.viewBox.width} ${this.viewBox.height}`) .classed('svg-content', true) .append('g') .attr('transform', 'translate(' + this.options.width / 2 + ',' + this.options.height / 2 + ')'); const color = d3.scaleOrdinal().domain(this.data).range(this.backgroundColors); const pie = d3.pie().value((d) => d.value); const pieData = pie(d3.entries(this.data)); const arcGenerator = d3.arc().innerRadius(0).outerRadius(radius); svg .selectAll('slices') .data(pieData) .enter() .append('path') .attr('d', arcGenerator) .attr('fill', (d) => this.backgroundColors[d.index]) .attr('stroke', 'black') .style('stroke-width', '2px') .style('opacity', 0.7); svg .selectAll('slices') .data(pieData) .enter() .append('text') .text((d) => this.labels[d.index]) .attr('transform', (d) => { return ('translate(' + arcGenerator.centroid({ startAngle: d.startAngle, endAngle: d.endAngle, }) + ')'); }) .style('text-anchor', 'middle') .style('font-size', 17); this.addLabelAxisX(svg, this.options.width, this.options.height); } addLabelAxisX(svg, width, height) { svg .append('text') .attr('transform', `translate(${0}, ${this.options.margin.top * 2.5})`) .style('text-anchor', 'middle') .text(this.options.xAxisLabel); } /** * range [0, 1] */ interpolateColor() { return d3.interpolateCool; } combineLabelsDataToOne() { const result = []; const N = this.data.length; for (let index = 0; index < N; index++) { result.push({ x: this.labels[index], y: this.data[index] }); } return result; } onResizeEvent() { this.onResize$.pipe(debounceTime(200)).subscribe(() => { const svgExist = d3.select(this.container.nativeElement).select('svg'); if (svgExist) { svgExist.remove(); } this.render(); }); } }; PieComponent.ctorParameters = () => [ { type: ElementRef } ]; tslib_1.__decorate([ Input() ], PieComponent.prototype, "labels", void 0); tslib_1.__decorate([ Input() ], PieComponent.prototype, "data", void 0); tslib_1.__decorate([ Input() ], PieComponent.prototype, "backgroundColors", void 0); tslib_1.__decorate([ Input() ], PieComponent.prototype, "radius", void 0); tslib_1.__decorate([ Input() ], PieComponent.prototype, "options", void 0); tslib_1.__decorate([ HostListener('window:resize') ], PieComponent.prototype, "onResize", null); PieComponent = tslib_1.__decorate([ Component({ selector: 'ng-pie', template: "<div class=\"svg-container\"></div>\n", encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, styles: [".svg-container{display:inline-block;position:relative;width:100%;height:100%;padding-bottom:100%;vertical-align:top;overflow:hidden}.svg-content{display:inline-block;position:absolute;top:0;left:0}.grid line{stroke:#d3d3d3;stroke-opacity:.4;shape-rendering:crispEdges}.grid path{stroke-width:0}.grid text{display:none}svg{background-color:transparent!important}.slice text{font-size:16pt;font-family:Arial}"] }) ], PieComponent); export { PieComponent }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGllLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL25nLWQzLWdyYXBocy8iLCJzb3VyY2VzIjpbInBpZS9waWUuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQ0wsdUJBQXVCLEVBQ3ZCLFNBQVMsRUFDVCxVQUFVLEVBQ1YsWUFBWSxFQUNaLEtBQUssRUFDTCxNQUFNLEVBQ04saUJBQWlCLEdBQ2xCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sS0FBSyxFQUFFLE1BQU0sSUFBSSxDQUFDO0FBQ3pCLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDL0IsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBOEI5QyxJQUFhLFlBQVksR0FBekIsTUFBYSxZQUFZO0lBdUJ2QixZQUFvQixTQUFxQjtRQUFyQixjQUFTLEdBQVQsU0FBUyxDQUFZO1FBdEJoQyxXQUFNLEdBQWEsRUFBRSxDQUFDO1FBQ3RCLFNBQUksR0FBVSxFQUFFLENBQUM7UUFDakIscUJBQWdCLEdBQVEsRUFBRSxDQUFDLFVBQVUsQ0FBQztRQUN0QyxXQUFNLEdBQVcsR0FBRyxDQUFDO1FBQ3JCLFlBQU8sR0FBaUIsRUFBa0IsQ0FBQztRQUNwRCxVQUFLLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUMsQ0FBQywwQ0FBMEM7UUFDM0Usc0JBQWlCLEdBQUcsV0FBVyxDQUFDO1FBQ2hDLGtCQUFhLEdBQW9CLEVBQUUsQ0FBQztRQUNwQyxZQUFPLEdBQVksRUFBYSxDQUFDO1FBRXpCLGFBQVEsR0FBaUI7WUFDL0IsS0FBSyxFQUFFLEdBQUc7WUFDVixNQUFNLEVBQUUsR0FBRztZQUNYLE1BQU0sRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxFQUFFLEVBQUU7U0FDckQsQ0FBQztRQUVGLGNBQVMsR0FBRyxJQUFJLE9BQU8sRUFBUSxDQUFDO0lBTVksQ0FBQztJQUo3QyxRQUFRO1FBQ04sSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUN4QixDQUFDO0lBSUQsUUFBUTtRQUNOLElBQUksQ0FBQyxPQUFPLHFCQUFRLElBQUksQ0FBQyxRQUFRLEVBQUssSUFBSSxDQUFDLE9BQU8sQ0FBRSxDQUFDO1FBQ3JELElBQUksQ0FBQyxPQUFPLEdBQUc7WUFDYixJQUFJLEVBQUUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxJQUFJO1lBQy9CLElBQUksRUFBRSxDQUFDO1lBQ1AsS0FBSyxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDO1lBQ3hHLE1BQU0sRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU07U0FDNUIsQ0FBQztRQUNGLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1FBRTNCLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUVyQixJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7SUFDaEIsQ0FBQztJQUVPLG1CQUFtQjtRQUN6QixJQUFJLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO1lBQ3RDLHFCQUFxQjtZQUNyQiwyREFBMkQ7WUFDM0Qsd0RBQXdEO1lBQ3hELElBQUk7WUFDSixLQUFLLE1BQU0sUUFBUSxJQUFJLElBQUksQ0FBQyxJQUFJLEVBQUU7Z0JBQ2hDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUM7YUFDcEQ7U0FDRjtJQUNILENBQUM7SUFFRCxNQUFNO1FBQ0osTUFBTSxZQUFZLEdBQUcsUUFBUSxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ3hHLE1BQU0sYUFBYSxHQUFHLFFBQVEsQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsYUFBYSxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUUxRyxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQztRQUMvRixNQUFNLEdBQUcsR0FBRyxFQUFFO2FBQ1gsTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsYUFBYSxDQUFDO2FBQ3BDLE1BQU0sQ0FBQyxLQUFLLENBQUM7YUFDYixNQUFNLENBQUMsS0FBSyxDQUFDO2FBQ2IsSUFBSSxDQUFDLE9BQU8sRUFBRSxZQUFZLENBQUM7YUFDM0IsSUFBSSxDQUFDLFFBQVEsRUFBRSxhQUFhLENBQUM7YUFDN0IsSUFBSSxDQUFDLFNBQVMsRUFBRSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUM7YUFDekcsT0FBTyxDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUM7YUFDNUIsTUFBTSxDQUFDLEdBQUcsQ0FBQzthQUNYLElBQUksQ0FBQyxXQUFXLEVBQUUsWUFBWSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDO1FBRWxHLE1BQU0sS0FBSyxHQUFHLEVBQUUsQ0FBQyxZQUFZLEVBQUUsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztRQUUvRSxNQUFNLEdBQUcsR0FBRyxFQUFFLENBQUMsR0FBRyxFQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7UUFFaEQsTUFBTSxPQUFPLEdBQUcsR0FBRyxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7UUFFM0MsTUFBTSxZQUFZLEdBQUcsRUFBRSxDQUFDLEdBQUcsRUFBTyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUM7UUFFdEUsR0FBRzthQUNBLFNBQVMsQ0FBQyxRQUFRLENBQUM7YUFDbkIsSUFBSSxDQUFDLE9BQU8sQ0FBQzthQUNiLEtBQUssRUFBRTthQUNQLE1BQU0sQ0FBQyxNQUFNLENBQUM7YUFDZCxJQUFJLENBQUMsR0FBRyxFQUFFLFlBQVksQ0FBQzthQUN2QixJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO2FBQ25ELElBQUksQ0FBQyxRQUFRLEVBQUUsT0FBTyxDQUFDO2FBQ3ZCLEtBQUssQ0FBQyxjQUFjLEVBQUUsS0FBSyxDQUFDO2FBQzVCLEtBQUssQ0FBQyxTQUFTLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFFekIsR0FBRzthQUNBLFNBQVMsQ0FBQyxRQUFRLENBQUM7YUFDbkIsSUFBSSxDQUFDLE9BQU8sQ0FBQzthQUNiLEtBQUssRUFBRTthQUNQLE1BQU0sQ0FBQyxNQUFNLENBQUM7YUFDZCxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO2FBQ2pDLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRTtZQUN2QixPQUFPLENBQ0wsWUFBWTtnQkFDWixZQUFZLENBQUMsUUFBUSxDQUFDO29CQUNwQixVQUFVLEVBQUUsQ0FBQyxDQUFDLFVBQVU7b0JBQ3hCLFFBQVEsRUFBRSxDQUFDLENBQUMsUUFBUTtpQkFDckIsQ0FBQztnQkFDRixHQUFHLENBQ0osQ0FBQztRQUNKLENBQUMsQ0FBQzthQUNELEtBQUssQ0FBQyxhQUFhLEVBQUUsUUFBUSxDQUFDO2FBQzlCLEtBQUssQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFFMUIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUNuRSxDQUFDO0lBRU8sYUFBYSxDQUFDLEdBQXdELEVBQUUsS0FBYSxFQUFFLE1BQWM7UUFDM0csR0FBRzthQUNBLE1BQU0sQ0FBQyxNQUFNLENBQUM7YUFDZCxJQUFJLENBQUMsV0FBVyxFQUFFLGFBQWEsQ0FBQyxLQUFLLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQzthQUN0RSxLQUFLLENBQUMsYUFBYSxFQUFFLFFBQVEsQ0FBQzthQUM5QixJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUNuQyxDQUFDO0lBRUQ7O09BRUc7SUFDSCxnQkFBZ0I7UUFDZCxPQUFPLEVBQUUsQ0FBQyxlQUFlLENBQUM7SUFDNUIsQ0FBQztJQUVPLHNCQUFzQjtRQUM1QixNQUFNLE1BQU0sR0FBRyxFQUFFLENBQUM7UUFDbEIsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUM7UUFDM0IsS0FBSyxJQUFJLEtBQUssR0FBRyxDQUFDLEVBQUUsS0FBSyxHQUFHLENBQUMsRUFBRSxLQUFLLEVBQUUsRUFBRTtZQUN0QyxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1NBQzdEO1FBQ0QsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQztJQUVELGFBQWE7UUFDWCxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFO1lBQ3BELE1BQU0sUUFBUSxHQUFHLEVBQUUsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDdkUsSUFBSSxRQUFRLEVBQUU7Z0JBQ1osUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDO2FBQ25CO1lBQ0QsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ2hCLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztDQUNGLENBQUE7O1lBdkhnQyxVQUFVOztBQXRCaEM7SUFBUixLQUFLLEVBQUU7NENBQXVCO0FBQ3RCO0lBQVIsS0FBSyxFQUFFOzBDQUFrQjtBQUNqQjtJQUFSLEtBQUssRUFBRTtzREFBdUM7QUFDdEM7SUFBUixLQUFLLEVBQUU7NENBQXNCO0FBQ3JCO0lBQVIsS0FBSyxFQUFFOzZDQUE0QztBQWNwRDtJQURDLFlBQVksQ0FBQyxlQUFlLENBQUM7NENBRzdCO0FBckJVLFlBQVk7SUFQeEIsU0FBUyxDQUFDO1FBQ1QsUUFBUSxFQUFFLFFBQVE7UUFDbEIsaURBQW1DO1FBRW5DLGFBQWEsRUFBRSxpQkFBaUIsQ0FBQyxJQUFJO1FBQ3JDLGVBQWUsRUFBRSx1QkFBdUIsQ0FBQyxNQUFNOztLQUNoRCxDQUFDO0dBQ1csWUFBWSxDQThJeEI7U0E5SVksWUFBWSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDb21wb25lbnQsXG4gIEVsZW1lbnRSZWYsXG4gIEhvc3RMaXN0ZW5lcixcbiAgSW5wdXQsXG4gIE9uSW5pdCxcbiAgVmlld0VuY2Fwc3VsYXRpb24sXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0ICogYXMgZDMgZnJvbSAnZDMnO1xuaW1wb3J0IHsgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgZGVib3VuY2VUaW1lIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5pbXBvcnQgeyBHcmFwaE9wdGlvbnMgfSBmcm9tICcuLi9zaGFyZWQvbW9kZWxzL2dyYXBoLW9wdGlvbnMuaW50ZXJmYWNlJztcbmltcG9ydCB7IFZpZXdCb3ggfSBmcm9tICcuLi9zaGFyZWQvbW9kZWxzL3ZpZXdib3guaW50ZXJmYWNlJztcblxuZXhwb3J0IGludGVyZmFjZSBQaWUge1xuICBsYWJlbHM6IHN0cmluZ1tdO1xuICBkYXRhOiBhbnlbXTtcbiAgYmFja2dyb3VuZENvbG9ycz86IHN0cmluZ1tdO1xuICBvcHRpb25zOiBHcmFwaE9wdGlvbnM7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTGFiZWwge1xuICB0ZXh0OiBzdHJpbmc7XG4gIHg6IG51bWJlcjtcbiAgeTogbnVtYmVyO1xufVxuXG5pbnRlcmZhY2UgTGFiZWxzQW5kRGF0YSB7XG4gIHg6IGFueTtcbiAgeTogYW55O1xufVxuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICduZy1waWUnLFxuICB0ZW1wbGF0ZVVybDogJy4vcGllLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vcGllLmNvbXBvbmVudC5zY3NzJ10sXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxufSlcbmV4cG9ydCBjbGFzcyBQaWVDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuICBASW5wdXQoKSBsYWJlbHM6IHN0cmluZ1tdID0gW107XG4gIEBJbnB1dCgpIGRhdGE6IGFueVtdID0gW107XG4gIEBJbnB1dCgpIGJhY2tncm91bmRDb2xvcnM6IGFueSA9IGQzLnNjaGVtZVNldDI7XG4gIEBJbnB1dCgpIHJhZGl1czogbnVtYmVyID0gMTAwO1xuICBASW5wdXQoKSBvcHRpb25zOiBHcmFwaE9wdGlvbnMgPSB7fSBhcyBHcmFwaE9wdGlvbnM7XG4gIGNvbG9yID0gdGhpcy5pbnRlcnBvbGF0ZUNvbG9yKCk7IC8vIHJhbmdlIFswLDFdIC0+IGJ1aWx0aW4gcmFuZ2Ugb2YgY29sb3JzLlxuICBkZWZhdWx0U2xpY2VDb2xvciA9ICdzdGVlcmJsdWUnO1xuICBsYWJlbHNBbmREYXRhOiBMYWJlbHNBbmREYXRhW10gPSBbXTtcbiAgdmlld0JveDogVmlld0JveCA9IHt9IGFzIFZpZXdCb3g7XG5cbiAgcHJpdmF0ZSBfb3B0aW9uczogR3JhcGhPcHRpb25zID0ge1xuICAgIHdpZHRoOiAzMDAsXG4gICAgaGVpZ2h0OiAzMDAsXG4gICAgbWFyZ2luOiB7IHRvcDogNTAsIHJpZ2h0OiA1MCwgYm90dG9tOiA1MCwgbGVmdDogNTAgfSxcbiAgfTtcblxuICBvblJlc2l6ZSQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuICBASG9zdExpc3RlbmVyKCd3aW5kb3c6cmVzaXplJylcbiAgb25SZXNpemUoKTogdm9pZCB7XG4gICAgdGhpcy5vblJlc2l6ZSQubmV4dCgpO1xuICB9XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBjb250YWluZXI6IEVsZW1lbnRSZWYpIHt9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgdGhpcy5vcHRpb25zID0geyAuLi50aGlzLl9vcHRpb25zLCAuLi50aGlzLm9wdGlvbnMgfTtcbiAgICB0aGlzLnZpZXdCb3ggPSB7XG4gICAgICBtaW5YOiAtdGhpcy5vcHRpb25zLm1hcmdpbi5sZWZ0LFxuICAgICAgbWluWTogMCxcbiAgICAgIHdpZHRoOiBOdW1iZXIodGhpcy5vcHRpb25zLndpZHRoKSArIE51bWJlcih0aGlzLm9wdGlvbnMubWFyZ2luLmxlZnQpICsgTnVtYmVyKHRoaXMub3B0aW9ucy5tYXJnaW4ucmlnaHQpLFxuICAgICAgaGVpZ2h0OiB0aGlzLm9wdGlvbnMuaGVpZ2h0LFxuICAgIH07XG4gICAgdGhpcy5vbkJnZENvbG9yVW5kZWZpbmVkKCk7XG5cbiAgICB0aGlzLm9uUmVzaXplRXZlbnQoKTtcblxuICAgIHRoaXMucmVuZGVyKCk7XG4gIH1cblxuICBwcml2YXRlIG9uQmdkQ29sb3JVbmRlZmluZWQoKSB7XG4gICAgaWYgKHRoaXMuYmFja2dyb3VuZENvbG9ycy5sZW5ndGggPT09IDApIHtcbiAgICAgIC8vIFRPRE86IGNoZWNrIGxpbnRlclxuICAgICAgLy8gZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IHRoaXMuZGF0YS5sZW5ndGg7IGluZGV4KyspIHtcbiAgICAgIC8vICAgdGhpcy5iYWNrZ3JvdW5kQ29sb3JzLnB1c2godGhpcy5kZWZhdWx0U2xpY2VDb2xvcik7XG4gICAgICAvLyB9XG4gICAgICBmb3IgKGNvbnN0IGl0ZXJhdG9yIG9mIHRoaXMuZGF0YSkge1xuICAgICAgICB0aGlzLmJhY2tncm91bmRDb2xvcnMucHVzaCh0aGlzLmRlZmF1bHRTbGljZUNvbG9yKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZW5kZXIoKSB7XG4gICAgY29uc3QgY3VycmVudFdpZHRoID0gcGFyc2VJbnQoZDMuc2VsZWN0KHRoaXMuY29udGFpbmVyLm5hdGl2ZUVsZW1lbnQpLnNlbGVjdCgnZGl2Jykuc3R5bGUoJ3dpZHRoJyksIDEwKTtcbiAgICBjb25zdCBjdXJyZW50SGVpZ2h0ID0gcGFyc2VJbnQoZDMuc2VsZWN0KHRoaXMuY29udGFpbmVyLm5hdGl2ZUVsZW1lbnQpLnNlbGVjdCgnZGl2Jykuc3R5bGUoJ2hlaWdodCcpLCAxMCk7XG5cbiAgICBjb25zdCByYWRpdXMgPSBNYXRoLm1pbih0aGlzLm9wdGlvbnMud2lkdGgsIHRoaXMub3B0aW9ucy5oZWlnaHQpIC8gMiAtIHRoaXMub3B0aW9ucy5tYXJnaW4udG9wO1xuICAgIGNvbnN0IHN2ZyA9IGQzXG4gICAgICAuc2VsZWN0KHRoaXMuY29udGFpbmVyLm5hdGl2ZUVsZW1lbnQpXG4gICAgICAuc2VsZWN0KCdkaXYnKVxuICAgICAgLmFwcGVuZCgnc3ZnJylcbiAgICAgIC5hdHRyKCd3aWR0aCcsIGN1cnJlbnRXaWR0aClcbiAgICAgIC5hdHRyKCdoZWlnaHQnLCBjdXJyZW50SGVpZ2h0KVxuICAgICAgLmF0dHIoJ3ZpZXdCb3gnLCBgJHt0aGlzLnZpZXdCb3gubWluWH0gJHt0aGlzLnZpZXdCb3gubWluWX0gJHt0aGlzLnZpZXdCb3gud2lkdGh9ICR7dGhpcy52aWV3Qm94LmhlaWdodH1gKVxuICAgICAgLmNsYXNzZWQoJ3N2Zy1jb250ZW50JywgdHJ1ZSlcbiAgICAgIC5hcHBlbmQoJ2cnKVxuICAgICAgLmF0dHIoJ3RyYW5zZm9ybScsICd0cmFuc2xhdGUoJyArIHRoaXMub3B0aW9ucy53aWR0aCAvIDIgKyAnLCcgKyB0aGlzLm9wdGlvbnMuaGVpZ2h0IC8gMiArICcpJyk7XG5cbiAgICBjb25zdCBjb2xvciA9IGQzLnNjYWxlT3JkaW5hbCgpLmRvbWFpbih0aGlzLmRhdGEpLnJhbmdlKHRoaXMuYmFja2dyb3VuZENvbG9ycyk7XG5cbiAgICBjb25zdCBwaWUgPSBkMy5waWU8YW55PigpLnZhbHVlKChkKSA9PiBkLnZhbHVlKTtcblxuICAgIGNvbnN0IHBpZURhdGEgPSBwaWUoZDMuZW50cmllcyh0aGlzLmRhdGEpKTtcblxuICAgIGNvbnN0IGFyY0dlbmVyYXRvciA9IGQzLmFyYzxhbnk+KCkuaW5uZXJSYWRpdXMoMCkub3V0ZXJSYWRpdXMocmFkaXVzKTtcblxuICAgIHN2Z1xuICAgICAgLnNlbGVjdEFsbCgnc2xpY2VzJylcbiAgICAgIC5kYXRhKHBpZURhdGEpXG4gICAgICAuZW50ZXIoKVxuICAgICAgLmFwcGVuZCgncGF0aCcpXG4gICAgICAuYXR0cignZCcsIGFyY0dlbmVyYXRvcilcbiAgICAgIC5hdHRyKCdmaWxsJywgKGQpID0+IHRoaXMuYmFja2dyb3VuZENvbG9yc1tkLmluZGV4XSlcbiAgICAgIC5hdHRyKCdzdHJva2UnLCAnYmxhY2snKVxuICAgICAgLnN0eWxlKCdzdHJva2Utd2lkdGgnLCAnMnB4JylcbiAgICAgIC5zdHlsZSgnb3BhY2l0eScsIDAuNyk7XG5cbiAgICBzdmdcbiAgICAgIC5zZWxlY3RBbGwoJ3NsaWNlcycpXG4gICAgICAuZGF0YShwaWVEYXRhKVxuICAgICAgLmVudGVyKClcbiAgICAgIC5hcHBlbmQoJ3RleHQnKVxuICAgICAgLnRleHQoKGQpID0+IHRoaXMubGFiZWxzW2QuaW5kZXhdKVxuICAgICAgLmF0dHIoJ3RyYW5zZm9ybScsIChkKSA9PiB7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgJ3RyYW5zbGF0ZSgnICtcbiAgICAgICAgICBhcmNHZW5lcmF0b3IuY2VudHJvaWQoe1xuICAgICAgICAgICAgc3RhcnRBbmdsZTogZC5zdGFydEFuZ2xlLFxuICAgICAgICAgICAgZW5kQW5nbGU6IGQuZW5kQW5nbGUsXG4gICAgICAgICAgfSkgK1xuICAgICAgICAgICcpJ1xuICAgICAgICApO1xuICAgICAgfSlcbiAgICAgIC5zdHlsZSgndGV4dC1hbmNob3InLCAnbWlkZGxlJylcbiAgICAgIC5zdHlsZSgnZm9udC1zaXplJywgMTcpO1xuXG4gICAgdGhpcy5hZGRMYWJlbEF4aXNYKHN2ZywgdGhpcy5vcHRpb25zLndpZHRoLCB0aGlzLm9wdGlvbnMuaGVpZ2h0KTtcbiAgfVxuXG4gIHByaXZhdGUgYWRkTGFiZWxBeGlzWChzdmc6IGQzLlNlbGVjdGlvbjxTVkdHRWxlbWVudCwgdW5rbm93biwgbnVsbCwgdW5kZWZpbmVkPiwgd2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIpIHtcbiAgICBzdmdcbiAgICAgIC5hcHBlbmQoJ3RleHQnKVxuICAgICAgLmF0dHIoJ3RyYW5zZm9ybScsIGB0cmFuc2xhdGUoJHswfSwgJHt0aGlzLm9wdGlvbnMubWFyZ2luLnRvcCAqIDIuNX0pYClcbiAgICAgIC5zdHlsZSgndGV4dC1hbmNob3InLCAnbWlkZGxlJylcbiAgICAgIC50ZXh0KHRoaXMub3B0aW9ucy54QXhpc0xhYmVsKTtcbiAgfVxuXG4gIC8qKlxuICAgKiByYW5nZSBbMCwgMV1cbiAgICovXG4gIGludGVycG9sYXRlQ29sb3IoKTogYW55IHtcbiAgICByZXR1cm4gZDMuaW50ZXJwb2xhdGVDb29sO1xuICB9XG5cbiAgcHJpdmF0ZSBjb21iaW5lTGFiZWxzRGF0YVRvT25lKCk6IExhYmVsc0FuZERhdGFbXSB7XG4gICAgY29uc3QgcmVzdWx0ID0gW107XG4gICAgY29uc3QgTiA9IHRoaXMuZGF0YS5sZW5ndGg7XG4gICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IE47IGluZGV4KyspIHtcbiAgICAgIHJlc3VsdC5wdXNoKHsgeDogdGhpcy5sYWJlbHNbaW5kZXhdLCB5OiB0aGlzLmRhdGFbaW5kZXhdIH0pO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgb25SZXNpemVFdmVudCgpOiB2b2lkIHtcbiAgICB0aGlzLm9uUmVzaXplJC5waXBlKGRlYm91bmNlVGltZSgyMDApKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgY29uc3Qgc3ZnRXhpc3QgPSBkMy5zZWxlY3QodGhpcy5jb250YWluZXIubmF0aXZlRWxlbWVudCkuc2VsZWN0KCdzdmcnKTtcbiAgICAgIGlmIChzdmdFeGlzdCkge1xuICAgICAgICBzdmdFeGlzdC5yZW1vdmUoKTtcbiAgICAgIH1cbiAgICAgIHRoaXMucmVuZGVyKCk7XG4gICAgfSk7XG4gIH1cbn1cbiJdfQ==