ng-color-scale
Version:
[](https://www.npmjs.com/package/ng-color-scale) [](https://npmjs.org/ng-color-scale)  {
this.host = host;
this.minVal = -1;
this.maxVal = 1;
this.hideAxis = false;
this.colorList = ["#9E0142", "#D53E4F",
"#F46D43", "#FDAE61",
"#FEE08B", "#FFFFBF",
"#E6F598", "#ABDDA4",
"#66C2A5", "#6AA84F",
"#38761D"];
this._margin = { top: 50, right: 50, bottom: 30, left: 50 };
this._textHeight = 35;
this._axisHeight = 45;
this._axisOffset = 130;
}
ngOnChanges() {
if (this._chart) {
this._createChart();
}
}
ngOnInit() {
this._id = 'id' + (new Date()).getTime();
if (this.data) {
this._createChart();
}
}
_createChart() {
d3.select(`#${this._id}`).remove();
this._width = this.host.nativeElement.clientWidth;
this._height = this.host.nativeElement.clientHeight;
this._barWidth = this._width - (this._margin.left + this._margin.right);
this._svg = d3.select(this.host.nativeElement)
.append('div')
.attr('id', `${this._id}`)
.attr('transform', `translate(${this._margin.left}, ${this._margin.top})`)
.style('position', 'relative')
.append("svg:svg")
.attr("width", this._width)
.attr("height", this._height);
this._chart = this._svg.append('g')
.attr('transform', `translate(${this._margin.left}, ${this._margin.top})`);
this._xScale = d3.scaleLinear()
.domain([this.minVal, this.maxVal])
.range([0, this._barWidth]);
this._colors = d3.scaleLinear().domain([this.minVal, this.maxVal]).range(this.colorList);
if (!this.hideAxis) {
this._drawAxis();
}
this._drawLabels();
this._drawcolorBar();
}
_drawAxis() {
var xAxis = d3.axisBottom(this._xScale)
.tickPadding(5)
.ticks(5);
this._chart.append('g')
.attr("class", "axis")
.style("font-size", 12)
.attr('transform', `translate(0, ${this._axisHeight + 5})`)
.call(xAxis);
}
_drawcolorBar() {
var tempColorList = this.colorList;
var tempId = `${this._id}-grad`;
var grad = this._chart.append('defs')
.append('linearGradient')
.attr('id', tempId)
.attr('x1', '0%')
.attr('x2', '100%')
.attr('y1', '0%')
.attr('y2', '0%');
grad.selectAll('stop')
.data(tempColorList)
.enter()
.append('stop')
.style('stop-color', function (d) { return d; })
.attr('offset', function (d, i) {
return 100 * (i / (tempColorList.length - 1)) + '%';
});
var gradValue = `url(#${tempId})`;
var tipId = this._id;
var color_bar = this._chart.append('rect')
.attr('class', 'bg-rect')
.attr('rx', 5)
.attr('ry', 5)
.style('opacity', 1)
.style('fill', gradValue)
.attr('height', 15)
.attr('width', this._barWidth)
.attr('x', 0)
.on("mouseover", function (d) {
d3.select(`#${tipId} > div.tip`).transition()
.duration(300)
.style("opacity", .9);
pickerTip.transition()
.duration(300)
.style("opacity", .9);
d3.select(this).transition()
.duration(150)
.style("opacity", .8);
})
.on("mouseout", function (d) {
d3.select(`#${tipId} > div.tip`).transition()
.duration(500)
.style("opacity", 0);
pickerTip.transition()
.duration(500)
.style("opacity", 0.7);
d3.select(this).transition()
.duration(500)
.style("opacity", 1);
});
var pickerTip = this._chart.append('rect')
.attr('class', 'picker-tip')
.attr('rx', 4)
.attr('ry', 4)
.style('fill', '#333')
.style('opacity', 0.7)
.attr('height', 25)
.attr('width', 10)
.attr('y', -5)
.attr('x', this._xScale(this.data) - 5);
d3.select(`#${this._id}`)
.append('div')
.attr('class', 'tip')
.style('position', 'absolute')
.style('border-radius', '10px')
.style('background-color', '#e8f2fa')
.style('padding', '10px')
.style('top', `${-5}px`)
.style('opacity', 0)
.style('left', `${this._xScale(this.data) + 50}px`)
.html(this.data.toFixed(2));
}
_drawLabels() {
//left label
this._chart.append('text')
.attr('x', 0)
.attr('y', this._textHeight)
.attr('text-anchor', 'middle')
.attr('font-family', 'Roboto')
.attr('font-weight', 200)
.attr('class', 'left-label')
.text(this.leftLabel);
// right label
this._chart.append('text')
.attr('x', this._barWidth)
.attr('y', this._textHeight)
.attr('text-anchor', 'middle')
.attr('font-family', 'Roboto')
.attr('class', 'right-label')
.text(this.rightLabel);
// middle label
this._chart.append('text')
.attr('x', this._barWidth / 2)
.attr('y', this._textHeight)
.attr('font-family', 'Roboto')
.attr('text-anchor', 'middle')
.attr('class', 'middle-label')
.text(this.middleLabel);
// display meta
d3.select(`#${this._id}`)
.append('div')
.style('position', 'absolute')
.style('font-family', 'Roboto')
.style('text-align', 'center')
.style('width', '100%')
.style('top', `${this._axisOffset}px`)
.html(this.displayMeta);
}
_onResize(event) {
this._createChart();
}
};
NgColorScaleComponent.ctorParameters = () => [
{ type: ElementRef }
];
__decorate([
Input()
], NgColorScaleComponent.prototype, "data", void 0);
__decorate([
Input()
], NgColorScaleComponent.prototype, "leftLabel", void 0);
__decorate([
Input()
], NgColorScaleComponent.prototype, "rightLabel", void 0);
__decorate([
Input()
], NgColorScaleComponent.prototype, "middleLabel", void 0);
__decorate([
Input()
], NgColorScaleComponent.prototype, "minVal", void 0);
__decorate([
Input()
], NgColorScaleComponent.prototype, "maxVal", void 0);
__decorate([
Input()
], NgColorScaleComponent.prototype, "hideAxis", void 0);
__decorate([
Input()
], NgColorScaleComponent.prototype, "colorList", void 0);
__decorate([
Input()
], NgColorScaleComponent.prototype, "displayMeta", void 0);
__decorate([
HostListener('window:resize', ['$event'])
], NgColorScaleComponent.prototype, "_onResize", null);
NgColorScaleComponent = __decorate([
Component({
selector: 'ng-color-scale',
template: "",
changeDetection: ChangeDetectionStrategy.OnPush,
styles: ["@import url(https://fonts.googleapis.com/css?family=Roboto:400,700);:host{width:100%;height:100%;min-height:150px;max-width:1500px;display:block;font-family:Roboto}"]
})
], NgColorScaleComponent);
export { NgColorScaleComponent };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmctY29sb3Itc2NhbGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vbmctY29sb3Itc2NhbGUvIiwic291cmNlcyI6WyJsaWIvbmctY29sb3Itc2NhbGUuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLHVCQUF1QixFQUFFLGFBQWEsRUFBRSxVQUFVLEVBQUUsWUFBWSxFQUFFLGlCQUFpQixFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQ3hKLE9BQU8sS0FBSyxFQUFFLE1BQU0sSUFBSSxDQUFDO0FBUXpCLElBQWEscUJBQXFCLEdBQWxDLE1BQWEscUJBQXFCO0lBOEJoQyxZQUNVLElBQWU7UUFBZixTQUFJLEdBQUosSUFBSSxDQUFXO1FBekJoQixXQUFNLEdBQVcsQ0FBQyxDQUFDLENBQUM7UUFDcEIsV0FBTSxHQUFXLENBQUMsQ0FBQztRQUNuQixhQUFRLEdBQVksS0FBSyxDQUFDO1FBQzFCLGNBQVMsR0FBYSxDQUFDLFNBQVMsRUFBRSxTQUFTO1lBQ2xDLFNBQVMsRUFBRSxTQUFTO1lBQ3BCLFNBQVMsRUFBRSxTQUFTO1lBQ3BCLFNBQVMsRUFBRSxTQUFTO1lBQ3BCLFNBQVMsRUFBRSxTQUFTO1lBQ3BCLFNBQVMsQ0FBQyxDQUFBO1FBR3BCLFlBQU8sR0FBRyxFQUFDLEdBQUcsRUFBRSxFQUFFLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxFQUFFLEVBQUMsQ0FBQztRQVFyRCxnQkFBVyxHQUFHLEVBQUUsQ0FBQztRQUNqQixnQkFBVyxHQUFHLEVBQUUsQ0FBQztRQUNqQixnQkFBVyxHQUFHLEdBQUcsQ0FBQztJQUlFLENBQUM7SUFFN0IsV0FBVztRQUNULElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRTtZQUNmLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztTQUNyQjtJQUNILENB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QUNwQjtJQUFSLEtBQUssRUFBRTtxREFBb0I7QUFDbkI7SUFBUixLQUFLLEVBQUU7dURBQTJCO0FBQzFCO0lBQVIsS0FBSyxFQUFFO3dEQUtvQjtBQUNuQjtJQUFSLEtBQUssRUFBRTswREFBcUI7QUE4TTdCO0lBREMsWUFBWSxDQUFDLGVBQWUsRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDO3NEQUd6QztBQS9OVSxxQkFBcUI7SUFOakMsU0FBUyxDQUFDO1FBQ1QsUUFBUSxFQUFFLGdCQUFnQjtRQUMxQixZQUE4QztRQUM5QyxlQUFlLEVBQUUsdUJBQXVCLENBQUMsTUFBTTs7S0FFaEQsQ0FBQztHQUNXLHFCQUFxQixDQWtPakM7U0FsT1kscUJBQXFCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBPbkNoYW5nZXMsIElucHV0LCBPbkluaXQsIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBTaW1wbGVDaGFuZ2VzLCBFbGVtZW50UmVmLCBIb3N0TGlzdGVuZXIsIFZpZXdFbmNhcHN1bGF0aW9ufSBmcm9tICdAYW5ndWxhci9jb3JlJzsgIFxuaW1wb3J0ICogYXMgZDMgZnJvbSAnZDMnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICduZy1jb2xvci1zY2FsZScsXG4gIHRlbXBsYXRlVXJsOiAnLi9uZy1jb2xvci1zY2FsZS5jb21wb25lbnQuaHRtbCcsXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICBzdHlsZVVybHM6IFsnLi9uZy1jb2xvci1zY2FsZS5jb21wb25lbnQuc2NzcyddXG59KVxuZXhwb3J0IGNsYXNzIE5nQ29sb3JTY2FsZUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uQ2hhbmdlcyB7XG5cbiAgQElucHV0KCkgZGF0YSA6IG51bWJlcjtcbiAgQElucHV0KCkgbGVmdExhYmVsOiBzdHJpbmc7XG4gIEBJbnB1dCgpIHJpZ2h0TGFiZWw6IHN0cmluZztcbiAgQElucHV0KCkgbWlkZGxlTGFiZWw6IHN0cmluZztcbiAgQElucHV0KCkgbWluVmFsOiBudW1iZXIgPSAtMTtcbiAgQElucHV0KCkgbWF4VmFsOiBudW1iZXIgPSAxO1xuICBASW5wdXQoKSBoaWRlQXhpczogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSBjb2xvckxpc3Q6IHN0cmluZ1tdID0gW1wiIzlFMDE0MlwiLCBcIiNENTNFNEZcIixcbiAgICAgICAgICAgICAgICAgICAgXCIjRjQ2RDQzXCIsIFwiI0ZEQUU2MVwiLFxuICAgICAgICAgICAgICAgICAgICBcIiNGRUUwOEJcIiwgXCIjRkZGRkJGXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiI0U2RjU5OFwiLCBcIiNBQkREQTRcIiwgXG4gICAgICAgICAgICAgICAgICAgIFwiIzY2QzJBNVwiLCBcIiM2QUE4NEZcIixcbiAgICAgICAgICAgICAgICAgICAgXCIjMzg3NjFEXCJdXG4gIEBJbnB1dCgpIGRpc3BsYXlNZXRhOiBzdHJpbmc7XG5cbiAgcHJpdmF0ZSBfbWFyZ2luID0ge3RvcDogNTAsIHJpZ2h0OiA1MCwgYm90dG9tOiAzMCwgbGVmdDogNTB9OyAgXG4gIHByaXZhdGUgX3N2ZzogYW55OyBcbiAgcHJpdmF0ZSBfY2hhcnQ6IGFueTtcbiAgcHJpdmF0ZSBfd2lkdGg6IG51bWJlcjtcbiAgcHJpdmF0ZSBfaGVpZ2h0Om51bWJlcjtcbiAgcHJpdmF0ZSBfYmFyV2lkdGg6IG51bWJlcjtcbiAgcHJpdmF0ZSBfeFNjYWxlOiBhbnk7XG4gIHByaXZhdGUgX2NvbG9yczogYW55O1xuICBwcml2YXRlIF90ZXh0SGVpZ2h0ID0gMzU7XG4gIHByaXZhdGUgX2F4aXNIZWlnaHQgPSA0NTtcbiAgcHJpdmF0ZSBfYXhpc09mZnNldCA9IDEzMDtcbiAgcHJpdmF0ZSBfaWQ6IGFueTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGhvc3Q6RWxlbWVudFJlZikge31cblxuICBuZ09uQ2hhbmdlcygpIHtcbiAgICBpZiAodGhpcy5fY2hhcnQpIHtcbiAgICAgIHRoaXMuX2NyZWF0ZUNoYXJ0KCk7XG4gICAgfVxuICB9XG5cbiAgbmdPbkluaXQoKXtcbiAgICB0aGlzLl9pZCA9J2lkJyArIChuZXcgRGF0ZSgpKS5nZXRUaW1lKCk7XG4gICAgaWYodGhpcy5kYXRhKXtcbiAgICAgIHRoaXMuX2NyZWF0ZUNoYXJ0KCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfY3JlYXRlQ2hhcnQoKXtcbiAgICBkMy5zZWxlY3QoYCMke3RoaXMuX2lkfWApLnJlbW92ZSgpOyAgXG4gICAgXG4gICAgdGhpcy5fd2lkdGggPSB0aGlzLmhvc3QubmF0aXZlRWxlbWVudC5jbGllbnRXaWR0aDtcbiAgICB0aGlzLl9oZWlnaHQgPSB0aGlzLmhvc3QubmF0aXZlRWxlbWVudC5jbGllbnRIZWlnaHQ7XG4gICAgdGhpcy5fYmFyV2lkdGggPSB0aGlzLl93aWR0aCAtICh0aGlzLl9tYXJnaW4ubGVmdCArIHRoaXMuX21hcmdpbi5yaWdodClcblxuICAgIHRoaXMuX3N2ZyA9IGQzLnNlbGVjdCh0aGlzLmhvc3QubmF0aXZlRWxlbWVudClcbiAgICAgICAgICAuYXBwZW5kKCdkaXYnKVxuICAgICAgICAgIC5hdHRyKCdpZCcsIGAke3RoaXMuX2lkfWApXG4gICAgICAgICAgLmF0dHIoJ3RyYW5zZm9ybScsIGB0cmFuc2xhdGUoJHt0aGlzLl9tYXJnaW4ubGVmdH0sICR7dGhpcy5fbWFyZ2luLnRvcH0pYClcbiAgICAgICAgICAuc3R5bGUoJ3Bvc2l0aW9uJywgJ3JlbGF0aXZlJylcbiAgICAgICAgICAuYXBwZW5kKFwic3ZnOnN2Z1wiKSBcbiAgICAgICAgICAuYXR0cihcIndpZHRoXCIsIHRoaXMuX3dpZHRoKVxuICAgICAgICAgIC5hdHRyKFwiaGVpZ2h0XCIsIHRoaXMuX2hlaWdodClcblxuICAgIHRoaXMuX2NoYXJ0ID0gdGhpcy5fc3ZnLmFwcGVuZCgnZycpICBcbiAgICAgICAgICAuYXR0cigndHJhbnNmb3JtJywgYHRyYW5zbGF0ZSgke3RoaXMuX21hcmdpbi5sZWZ0fSwgJHt0aGlzLl9tYXJnaW4udG9wfSlgKTtcblxuICAgIHRoaXMuX3hTY2FsZSA9IGQzLnNjYWxlTGluZWFyKClcbiAgICAgICAgLmRvbWFpbihbdGhpcy5taW5WYWwsIHRoaXMubWF4VmFsXSlcbiAgICAgICAgLnJhbmdlKFswLCB0aGlzLl9iYXJXaWR0aF0pXG5cbiAgICB0aGlzLl9jb2xvcnMgPSBkMy5zY2FsZUxpbmVhcigpLmRvbWFpbihbdGhpcy5taW5WYWwsIHRoaXMubWF4VmFsXSkucmFuZ2UoPGFueVtdPnRoaXMuY29sb3JMaXN0KTtcblxuICAgIGlmKCF0aGlzLmhpZGVBeGlzKXtcbiAgICAgIHRoaXMuX2RyYXdBeGlzKClcbiAgICB9XG5cbiAgICB0aGlzLl9kcmF3TGFiZWxzKCk7XG4gICAgdGhpcy5fZHJhd2NvbG9yQmFyKCk7XG4gIH1cblxuICBwcml2YXRlIF9kcmF3QXhpcygpe1xuICAgICAgdmFyIHhBeGlzID0gZDMuYXhpc0JvdHRvbSh0aGlzLl94U2NhbGUpXG4gICAgICAgIC50aWNrUGFkZGluZyg1KVxuICAgICAgICAudGlja3MoNSlcblxuICAgICAgdGhpcy5fY2hhcnQuYXBwZW5kKCdnJylcbiAgICAgICAgLmF0dHIoXCJjbGFzc1wiLCBcImF4aXNcIilcbiAgICAgICAgLnN0eWxlKFwiZm9udC1zaXplXCIsIDEyKVxuICAgICAgICAuYXR0cigndHJhbnNmb3JtJywgYHRyYW5zbGF0ZSgwLCAke3RoaXMuX2F4aXNIZWlnaHQgKyA1fSlgKVxuICAgICAgICAuY2FsbCh4QXhpcylcbiAgfVxuXG4gIHByaXZhdGUgX2RyYXdjb2xvckJhcigpe1xuICAgICAgXG4gICAgICB2YXIgdGVtcENvbG9yTGlzdCA9IHRoaXMuY29sb3JMaXN0XG4gICAgICB2YXIgdGVtcElkID0gYCR7dGhpcy5faWR9LWdyYWRgO1xuXG4gICAgICB2YXIgZ3JhZCA9IHRoaXMuX2NoYXJ0LmFwcGVuZCgnZGVmcycpXG4gICAgICAgIC5hcHBlbmQoJ2xpbmVhckdyYWRpZW50JylcbiAgICAgICAgLmF0dHIoJ2lkJywgdGVtcElkKVxuICAgICAgICAuYXR0cigneDEnLCAnMCUnKVxuICAgICAgICAuYXR0cigneDInLCAnMTAwJScpXG4gICAgICAgIC5hdHRyKCd5MScsICcwJScpXG4gICAgICAgIC5hdHRyKCd5MicsICcwJScpO1xuXG4gICAgICBncmFkLnNlbGVjdEFsbCgnc3RvcCcpXG4gICAgICAgIC5kYXRhKHRlbXBDb2xvckxpc3QpXG4gICAgICAgIC5lbnRlcigpXG4gICAgICAgIC5hcHBlbmQoJ3N0b3AnKVxuICAgICAgICAuc3R5bGUoJ3N0b3AtY29sb3InLCBmdW5jdGlvbihkKXsgcmV0dXJuIGQ7IH0pXG4gICAgICAgIC5hdHRyKCdvZmZzZXQnLCBmdW5jdGlvbihkLGkpe1xuICAgICAgICAgIHJldHVybiAxMDAgKiAoaSAvICh0ZW1wQ29sb3JMaXN0Lmxlbmd0aCAtIDEpKSArICclJztcbiAgICAgICAgfSlcblxuICAgICAgdmFyIGdyYWRWYWx1ZSA9IGB1cmwoIyR7dGVtcElkfSlgO1xuICAgICAgdmFyIHRpcElkID0gdGhpcy5faWRcblxuICAgICAgdmFyIGNvbG9yX2JhciA9IHRoaXMuX2NoYXJ0LmFwcGVuZCgncmVjdCcpXG4gICAgICAgIC5hdHRyKCdjbGFzcycsICdiZy1yZWN0JylcbiAgICAgICAgLmF0dHIoJ3J4JywgNSlcbiAgICAgICAgLmF0dHIoJ3J5JywgNSlcbiAgICAgICAgLnN0eWxlKCdvcGFjaXR5JywgMSlcbiAgICAgICAgLnN0eWxlKCdmaWxsJywgZ3JhZFZhbHVlKVxuICAgICAgICAuYXR0cignaGVpZ2h0JywgMTUpXG4gICAgICAgIC5hdHRyKCd3aWR0aCcsIHRoaXMuX2JhcldpZHRoKVxuICAgICAgICAuYXR0cigneCcsIDApXG4gICAgICAgIC5vbihcIm1vdXNlb3ZlclwiLCBmdW5jdGlvbihkKSB7ICAgXG4gICAgICAgICAgZDMuc2VsZWN0KGAjJHt0aXBJZH0gPiBkaXYudGlwYCkudHJhbnNpdGlvbigpXG4gICAgICAgICAgICAuZHVyYXRpb24oMzAwKVxuICAgICAgICAgICAgLnN0eWxlKFwib3BhY2l0eVwiLCAuOSk7ICAgICAgXG4gICAgICAgICAgXG4gICAgICAgICAgcGlja2VyVGlwLnRyYW5zaXRpb24oKVxuICAgICAgICAgICAgLmR1cmF0aW9uKDMwMCkgICAgXG4gICAgICAgICAgICAuc3R5bGUoXCJvcGFjaXR5XCIsIC45KTsgIFxuXG4gICAgICAgICAgZDMuc2VsZWN0KHRoaXMpLnRyYW5zaXRpb24oKSAgICBcbiAgICAgICAgICAgIC5kdXJhdGlvbigxNTApICAgIFxuICAgICAgICAgICAgLnN0eWxlKFwib3BhY2l0eVwiLCAuOCk7ICAgICAgXG4gICAgICAgIH0pICAgICAgICAgIFxuICAgICAgICAub24oXCJtb3VzZW91dFwiLCBmdW5jdGlvbihkKSB7ICAgIFxuICAgICAgICAgIGQzLnNlbGVjdChgIyR7dGlwSWR9ID4gZGl2LnRpcGApLnRyYW5zaXRpb24oKSAgICBcbiAgICAgICAgICAgICAgLmR1cmF0aW9uKDUwMCkgICAgXG4gICAgICAgICAgICAgIC5zdHlsZShcIm9wYWNpdHlcIiwgMCk7XG5cbiAgICAgICAgICBwaWNrZXJUaXAudHJhbnNpdGlvbigpICAgIFxuICAgICAgICAgICAgICAuZHVyYXRpb24oNTAwKSAgICBcbiAgICAgICAgICAgICAgLnN0eWxlKFwib3BhY2l0eVwiLCAwLjcpO1xuXG4gICAgICAgICAgZDMuc2VsZWN0KHRoaXMpLnRyYW5zaXRpb24oKSAgICBcbiAgICAgICAgICAgIC5kdXJhdGlvbig1MDApICAgIFxuICAgICAgICAgICAgLnN0eWxlKFwib3BhY2l0eVwiLCAxKTtcbiAgICAgICAgfSk7XG4gICAgICBcblxuICAgICAgdmFyIHBpY2tlclRpcCA9IHRoaXMuX2NoYXJ0LmFwcGVuZCgncmVjdCcpXG4gICAgICAgIC5hdHRyKCdjbGFzcycsICdwaWNrZXItdGlwJylcbiAgICAgICAgLmF0dHIoJ3J4JywgNClcbiAgICAgICAgLmF0dHIoJ3J5JywgNClcbiAgICAgICAgLnN0eWxlKCdmaWxsJywgJyMzMzMnKVxuICAgICAgICAuc3R5bGUoJ29wYWNpdHknLCAwLjcpXG4gICAgICAgIC5hdHRyKCdoZWlnaHQnLCAyNSlcbiAgICAgICAgLmF0dHIoJ3dpZHRoJywgMTApXG4gICAgICAgIC5hdHRyKCd5JywgLTUpXG4gICAgICAgIC5hdHRyKCd4JywgdGhpcy5feFNjYWxlKHRoaXMuZGF0YSkgLTUpXG5cbiAgICAgIGQzLnNlbGVjdChgIyR7dGhpcy5faWR9YClcbiAgICAgICAgLmFwcGVuZCgnZGl2JylcbiAgICAgICAgLmF0dHIoJ2NsYXNzJywgJ3RpcCcpXG4gICAgICAgIC5zdHlsZSgncG9zaXRpb24nLCdhYnNvbHV0ZScpXG4gICAgICAgIC5zdHlsZSgnYm9yZGVyLXJhZGl1cycsICcxMHB4JylcbiAgICAgICAgLnN0eWxlKCdiYWNrZ3JvdW5kLWNvbG9yJywgJyNlOGYyZmEnKVxuICAgICAgICAuc3R5bGUoJ3BhZGRpbmcnLCAnMTBweCcpXG4gICAgICAgIC5zdHlsZSgndG9wJywgYCR7LTV9cHhgKVxuICAgICAgICAuc3R5bGUoJ29wYWNpdHknLCAwKVxuICAgICAgICAuc3R5bGUoJ2xlZnQnLCBgJHt0aGlzLl94U2NhbGUodGhpcy5kYXRhKSArNTB9cHhgKVxuICAgICAgICAuaHRtbCh0aGlzLmRhdGEudG9GaXhlZCgyKSlcblxuICB9XG5cblxuICBwcml2YXRlIF9kcmF3TGFiZWxzKCl7XG4gICAgLy9sZWZ0IGxhYmVsXG4gICAgdGhpcy5fY2hhcnQuYXBwZW5kKCd0ZXh0JylcbiAgICAgIC5hdHRyKCd4JywgMClcbiAgICAgIC5hdHRyKCd5JywgdGhpcy5fdGV4dEhlaWdodClcbiAgICAgIC5hdHRyKCd0ZXh0LWFuY2hvcicsICdtaWRkbGUnKVxuICAgICAgLmF0dHIoJ2ZvbnQtZmFtaWx5JywgJ1JvYm90bycpXG4gICAgICAuYXR0cignZm9udC13ZWlnaHQnLCAyMDApXG4gICAgICAuYXR0cignY2xhc3MnLCAnbGVmdC1sYWJlbCcpXG4gICAgICAudGV4dCh0aGlzLmxlZnRMYWJlbCk7XG5cbiAgICAvLyByaWdodCBsYWJlbFxuICAgIHRoaXMuX2NoYXJ0LmFwcGVuZCgndGV4dCcpXG4gICAgICAuYXR0cigneCcsIHRoaXMuX2JhcldpZHRoKVxuICAgICAgLmF0dHIoJ3knLCB0aGlzLl90ZXh0SGVpZ2h0KVxuICAgICAgLmF0dHIoJ3RleHQtYW5jaG9yJywgJ21pZGRsZScpXG4gICAgICAuYXR0cignZm9udC1mYW1pbHknLCAnUm9ib3RvJylcbiAgICAgIC5hdHRyKCdjbGFzcycsICdyaWdodC1sYWJlbCcpXG4gICAgICAudGV4dCh0aGlzLnJpZ2h0TGFiZWwpO1xuXG4gICAgLy8gbWlkZGxlIGxhYmVsXG4gICAgdGhpcy5fY2hhcnQuYXBwZW5kKCd0ZXh0JylcbiAgICAgIC5hdHRyKCd4Jyx0aGlzLl9iYXJXaWR0aC8yKVxuICAgICAgLmF0dHIoJ3knLCB0aGlzLl90ZXh0SGVpZ2h0KVxuICAgICAgLmF0dHIoJ2ZvbnQtZmFtaWx5JywgJ1JvYm90bycpXG4gICAgICAuYXR0cigndGV4dC1hbmNob3InLCAnbWlkZGxlJylcbiAgICAgIC5hdHRyKCdjbGFzcycsICdtaWRkbGUtbGFiZWwnKVxuICAgICAgLnRleHQodGhpcy5taWRkbGVMYWJlbCk7XG5cbiAgICAvLyBkaXNwbGF5IG1ldGFcbiAgICBkMy5zZWxlY3QoYCMke3RoaXMuX2lkfWApXG4gICAgICAuYXBwZW5kKCdkaXYnKVxuICAgICAgLnN0eWxlKCdwb3NpdGlvbicsJ2Fic29sdXRlJylcbiAgICAgIC5zdHlsZSgnZm9udC1mYW1pbHknLCAnUm9ib3RvJylcbiAgICAgIC5zdHlsZSgndGV4dC1hbGlnbicsICdjZW50ZXInKVxuICAgICAgLnN0eWxlKCd3aWR0aCcsICcxMDAlJykgICAgXG4gICAgICAuc3R5bGUoJ3RvcCcsIGAke3RoaXMuX2F4aXNPZmZzZXR9cHhgKVxuICAgICAgLmh0bWwodGhpcy5kaXNwbGF5TWV0YSlcbiAgICAgIFxuICAgIH1cblxuICBASG9zdExpc3RlbmVyKCd3aW5kb3c6cmVzaXplJywgWyckZXZlbnQnXSlcbiAgcHVibGljIF9vblJlc2l6ZShldmVudCkge1xuICAgIHRoaXMuX2NyZWF0ZUNoYXJ0KCk7XG4gIH1cblxuXG59XG5cbiJdfQ==