ngx-frappe-chart
Version:
A simple and easy to use angular wrapper on top of frappe for generating awesome graphs.
370 lines (358 loc) • 29.8 kB
JavaScript
import { Component, Input, Directive, ElementRef, NgModule } from '@angular/core';
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingReturn,uselessCode} checked by tsc
*/
class FrappeChartsHeatmapComponent {
}
FrappeChartsHeatmapComponent.decorators = [
{ type: Component, args: [{
selector: 'ngx-frappe-charts-heatmap',
template: `
<div
ngxFrappeChartsHeatmap
[title]="title"
[countLabel]="countLabel"
[discreteDomains]="discreteDomains"
[colors]="colors"
[data]="data"
></div>
`
},] },
];
FrappeChartsHeatmapComponent.propDecorators = {
data: [{ type: Input }],
title: [{ type: Input }],
countLabel: [{ type: Input }],
discreteDomains: [{ type: Input }],
colors: [{ type: Input }]
};
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingReturn,uselessCode} checked by tsc
*/
class FrappeChartsPercentageComponent {
}
FrappeChartsPercentageComponent.decorators = [
{ type: Component, args: [{
selector: 'ngx-frappe-charts-percentage',
template: `
<div
ngxFrappeChartsPercentage
[title]="title"
[colors]="colors"
[height]="height"
[data]="data"
[type]="type"
[barOptions]="barOptions"
></div>
`
},] },
];
FrappeChartsPercentageComponent.propDecorators = {
data: [{ type: Input }],
title: [{ type: Input }],
colors: [{ type: Input }],
height: [{ type: Input }],
type: [{ type: Input }],
maxSlices: [{ type: Input }],
barOptions: [{ type: Input }]
};
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingReturn,uselessCode} checked by tsc
*/
class FrappeChartsBarComponent {
}
FrappeChartsBarComponent.decorators = [
{ type: Component, args: [{
selector: 'ngx-frappe-charts-bar',
template: `
<div
ngxFrappeChartsAxis
[title]="title"
[colors]="colors"
[height]="height"
[data]="data"
[type]="type"
[isNavigable]="isNavigable"
[valuesOverPoints]="valuesOverPoints"
[axisOptions]="axisOptions"
[tooltipOptions]="tooltipOptions"
[barOptions]="barOptions"
[lineOptions]="lineOptions"
[yMarkers]="yMarkers"
[yRegions]="yRegions"
></div>
`
},] },
];
FrappeChartsBarComponent.propDecorators = {
data: [{ type: Input }],
title: [{ type: Input }],
type: [{ type: Input }],
colors: [{ type: Input }],
height: [{ type: Input }],
isNavigable: [{ type: Input }],
valuesOverPoints: [{ type: Input }],
axisOptions: [{ type: Input }],
tooltipOptions: [{ type: Input }],
barOptions: [{ type: Input }],
lineOptions: [{ type: Input }],
yMarkers: [{ type: Input }],
yRegions: [{ type: Input }]
};
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingReturn,uselessCode} checked by tsc
*/
// just to avoid error marked by editor. Optional declaration
class FrappeChartsHeatmapDirective {
/**
* @param {?} el
*/
constructor(el) {
this.el = el;
this.type = 'heatmap';
}
/**
* @return {?}
*/
ngOnChanges() {
/** @type {?} */
const chart = new frappe.Chart(this.el.nativeElement, this.getHeatmapInputs());
}
/**
* @return {?}
*/
getHeatmapInputs() {
/** @type {?} */
const heatmapobject = {};
heatmapobject['countLabel'] = this.countLabel;
heatmapobject['discreteDomains'] = this.discreteDomains;
heatmapobject['colors'] = this.colors;
heatmapobject['type'] = this.type;
heatmapobject['title'] = this.title;
heatmapobject['data'] = this.data;
return heatmapobject;
}
}
FrappeChartsHeatmapDirective.decorators = [
{ type: Directive, args: [{
selector: '[ngxFrappeChartsHeatmap]'
},] },
];
FrappeChartsHeatmapDirective.ctorParameters = () => [
{ type: ElementRef }
];
FrappeChartsHeatmapDirective.propDecorators = {
title: [{ type: Input }],
data: [{ type: Input }],
countLabel: [{ type: Input }],
discreteDomains: [{ type: Input }],
colors: [{ type: Input }]
};
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingReturn,uselessCode} checked by tsc
*/
/** @type {?} */
const FrappeChartsConstants = {
chartType: {
percentage: 'percentage',
pie: 'pie',
bar: 'bar',
line: 'line',
axismixed: 'axis-mixed'
}
};
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingReturn,uselessCode} checked by tsc
*/
class FrappeChartsPercentageDirective {
/**
* @param {?} el
*/
constructor(el) {
this.el = el;
}
/**
* @return {?}
*/
ngOnChanges() {
/** @type {?} */
const chart = new frappe.Chart(this.el.nativeElement, this.getPieInputs());
}
/**
* @return {?}
*/
getPieInputs() {
/** @type {?} */
const pieobject = {};
pieobject['colors'] = this.colors;
pieobject['type'] = this.type;
pieobject['title'] = this.title;
pieobject['data'] = this.data;
pieobject['height'] = this.height;
pieobject['maxSlices'] = this.maxSlices;
this.addBarOptions(pieobject);
return pieobject;
}
/**
* @param {?} pieobject
* @return {?}
*/
addBarOptions(pieobject) {
if (this.type === FrappeChartsConstants.chartType.percentage) {
pieobject['barOptions'] = this.barOptions;
}
}
}
FrappeChartsPercentageDirective.decorators = [
{ type: Directive, args: [{
selector: '[ngxFrappeChartsPercentage]'
},] },
];
FrappeChartsPercentageDirective.ctorParameters = () => [
{ type: ElementRef }
];
FrappeChartsPercentageDirective.propDecorators = {
title: [{ type: Input }],
data: [{ type: Input }],
colors: [{ type: Input }],
height: [{ type: Input }],
type: [{ type: Input }],
maxSlices: [{ type: Input }],
barOptions: [{ type: Input }]
};
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingReturn,uselessCode} checked by tsc
*/
class FrappeChartsAxisDirective {
/**
* @param {?} el
*/
constructor(el) {
this.el = el;
}
/**
* @return {?}
*/
ngOnChanges() {
/** @type {?} */
const chart = new frappe.Chart(this.el.nativeElement, this.getAxisInputs());
}
/**
* @return {?}
*/
getAxisInputs() {
/** @type {?} */
const barObject = {};
barObject['colors'] = this.colors;
barObject['type'] = this.type;
barObject['title'] = this.title;
barObject['height'] = this.height;
barObject['isNavigable'] = this.isNavigable;
barObject['valuesOverPoints'] = this.valuesOverPoints;
barObject['axisOptions'] = this.axisOptions;
barObject['tooltipOptions'] = this.tooltipOptions;
this.addGraphData(barObject);
this.addLineOptions(barObject);
this.addBarOptions(barObject);
return barObject;
}
/**
* @param {?} barObject
* @return {?}
*/
addLineOptions(barObject) {
if (this.type === FrappeChartsConstants.chartType.line ||
this.type === FrappeChartsConstants.chartType.axismixed) {
barObject['lineOptions'] = this.lineOptions;
}
}
/**
* @param {?} barObject
* @return {?}
*/
addBarOptions(barObject) {
if (this.type === FrappeChartsConstants.chartType.bar ||
this.type === FrappeChartsConstants.chartType.axismixed) {
barObject['barOptions'] = this.barOptions;
}
}
/**
* @param {?} barObject
* @return {?}
*/
addGraphData(barObject) {
/** @type {?} */
const data = this.data;
if (this.yMarkers) {
data['yMarkers'] = this.yMarkers;
}
if (this.yRegions) {
data['yRegions'] = this.yRegions;
}
barObject['data'] = data;
}
}
FrappeChartsAxisDirective.decorators = [
{ type: Directive, args: [{
selector: '[ngxFrappeChartsAxis]'
},] },
];
FrappeChartsAxisDirective.ctorParameters = () => [
{ type: ElementRef }
];
FrappeChartsAxisDirective.propDecorators = {
data: [{ type: Input }],
type: [{ type: Input }],
title: [{ type: Input }],
colors: [{ type: Input }],
height: [{ type: Input }],
isNavigable: [{ type: Input }],
valuesOverPoints: [{ type: Input }],
axisOptions: [{ type: Input }],
tooltipOptions: [{ type: Input }],
barOptions: [{ type: Input }],
lineOptions: [{ type: Input }],
yMarkers: [{ type: Input }],
yRegions: [{ type: Input }]
};
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingReturn,uselessCode} checked by tsc
*/
class FrappeChartsModule {
}
FrappeChartsModule.decorators = [
{ type: NgModule, args: [{
imports: [],
declarations: [
FrappeChartsHeatmapComponent,
FrappeChartsPercentageComponent,
FrappeChartsBarComponent,
FrappeChartsHeatmapDirective,
FrappeChartsPercentageDirective,
FrappeChartsAxisDirective
],
exports: [
FrappeChartsHeatmapComponent,
FrappeChartsPercentageComponent,
FrappeChartsBarComponent
]
},] },
];
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingReturn,uselessCode} checked by tsc
*/
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingReturn,uselessCode} checked by tsc
*/
export { FrappeChartsHeatmapComponent, FrappeChartsPercentageComponent, FrappeChartsBarComponent, FrappeChartsModule, FrappeChartsAxisDirective as ɵc, FrappeChartsHeatmapDirective as ɵa, FrappeChartsPercentageDirective as ɵb };
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd4LWZyYXBwZS1jaGFydC5qcy5tYXAiLCJzb3VyY2VzIjpbIm5nOi8vbmd4LWZyYXBwZS1jaGFydC9saWIvY29tcG9uZW50cy9mcmFwcGUtY2hhcnRzLWhlYXRtYXAuY29tcG9uZW50LnRzIiwibmc6Ly9uZ3gtZnJhcHBlLWNoYXJ0L2xpYi9jb21wb25lbnRzL2ZyYXBwZS1jaGFydHMtcGVyY2VudGFnZS5jb21wb25lbnQudHMiLCJuZzovL25neC1mcmFwcGUtY2hhcnQvbGliL2NvbXBvbmVudHMvZnJhcHBlLWNoYXJ0cy1iYXIuY29tcG9uZW50LnRzIiwibmc6Ly9uZ3gtZnJhcHBlLWNoYXJ0L2xpYi9kaXJlY3RpdmVzL2ZyYXBwZS1jaGFydHMtaGVhdG1hcC5kaXJlY3RpdmUudHMiLCJuZzovL25neC1mcmFwcGUtY2hhcnQvbGliL2NvbnN0YW50cy9mcmFwcGUtY2hhcnRzLmNvbnN0YW50cy50cyIsIm5nOi8vbmd4LWZyYXBwZS1jaGFydC9saWIvZGlyZWN0aXZlcy9mcmFwcGUtY2hhcnRzLXBlcmNlbnRhZ2UuZGlyZWN0aXZlLnRzIiwibmc6Ly9uZ3gtZnJhcHBlLWNoYXJ0L2xpYi9kaXJlY3RpdmVzL2ZyYXBwZS1jaGFydHMtYXhpcy5kaXJlY3RpdmUudHMiLCJuZzovL25neC1mcmFwcGUtY2hhcnQvbGliL2ZyYXBwZS1jaGFydHMubW9kdWxlLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgSW5wdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEhlYXRtYXBEYXRhTW9kZWwgfSBmcm9tICcuLi9pbnRlcmZhY2VzL2hlYXRtYXAtZGF0YS5tb2RlbCc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ25neC1mcmFwcGUtY2hhcnRzLWhlYXRtYXAnLFxuICB0ZW1wbGF0ZTogYFxuICAgIDxkaXZcbiAgICAgIG5neEZyYXBwZUNoYXJ0c0hlYXRtYXBcbiAgICAgIFt0aXRsZV09XCJ0aXRsZVwiXG4gICAgICBbY291bnRMYWJlbF09XCJjb3VudExhYmVsXCJcbiAgICAgIFtkaXNjcmV0ZURvbWFpbnNdPVwiZGlzY3JldGVEb21haW5zXCJcbiAgICAgIFtjb2xvcnNdPVwiY29sb3JzXCJcbiAgICAgIFtkYXRhXT1cImRhdGFcIlxuICAgID48L2Rpdj5cbiAgYFxufSlcbmV4cG9ydCBjbGFzcyBGcmFwcGVDaGFydHNIZWF0bWFwQ29tcG9uZW50IHtcbiAgQElucHV0KCkgZGF0YTogSGVhdG1hcERhdGFNb2RlbDtcbiAgQElucHV0KCkgdGl0bGU/OiBzdHJpbmc7XG4gIEBJbnB1dCgpIGNvdW50TGFiZWw/OiBzdHJpbmc7XG4gIEBJbnB1dCgpIGRpc2NyZXRlRG9tYWlucz86IG51bWJlcjtcbiAgQElucHV0KCkgY29sb3JzPzogc3RyaW5nWzVdO1xufVxuXG4iLCJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBCYXJPcHRpb25zIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9wZXJjZW50YWdlLWJhci1vcHRpb25zLm1vZGVsJztcbmltcG9ydCB7IEdyYXBoRGF0YU1vZGVsIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9ncmFwaC1kYXRhLm1vZGVsJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnbmd4LWZyYXBwZS1jaGFydHMtcGVyY2VudGFnZScsXG4gIHRlbXBsYXRlOiBgXG4gICAgPGRpdlxuICAgICAgbmd4RnJhcHBlQ2hhcnRzUGVyY2VudGFnZVxuICAgICAgW3RpdGxlXT1cInRpdGxlXCJcbiAgICAgIFtjb2xvcnNdPVwiY29sb3JzXCJcbiAgICAgIFtoZWlnaHRdPVwiaGVpZ2h0XCJcbiAgICAgIFtkYXRhXT1cImRhdGFcIlxuICAgICAgW3R5cGVdPVwidHlwZVwiXG4gICAgICBbYmFyT3B0aW9uc109XCJiYXJPcHRpb25zXCJcbiAgICA+PC9kaXY+XG4gIGBcbn0pXG5leHBvcnQgY2xhc3MgRnJhcHBlQ2hhcnRzUGVyY2VudGFnZUNvbXBvbmVudCB7XG4gIEBJbnB1dCgpIGRhdGE6IEdyYXBoRGF0YU1vZGVsO1xuICBASW5wdXQoKSB0aXRsZT86IHN0cmluZztcbiAgQElucHV0KCkgY29sb3JzPzogc3RyaW5nW107XG4gIEBJbnB1dCgpIGhlaWdodD86IG51bWJlcjtcbiAgQElucHV0KCkgdHlwZT86IHN0cmluZzsgLy8gcGllICwgcGVyY2VudGFnZVxuICBASW5wdXQoKSBtYXhTbGljZXM/OiBudW1iZXI7IC8vIHJlc3RyaWN0IG51bWJlciBvZiBzbGljZXNcbiAgQElucHV0KCkgYmFyT3B0aW9ucz86IEJhck9wdGlvbnM7XG59XG4iLCJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBBeGlzT3B0aW9ucyB9IGZyb20gJy4uL2ludGVyZmFjZXMvYXhpcy1vcHRpb25zLm1vZGVsJztcbmltcG9ydCB7IFRvb2x0aXBPcHRpb25zIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy90b29sdGlwLW9wdGlvbnMubW9kZWwnO1xuaW1wb3J0IHsgQmFyT3B0aW9ucyB9IGZyb20gJy4uL2ludGVyZmFjZXMvYmFyLW9wdGlvbnMubW9kZWwnO1xuaW1wb3J0IHsgTGluZU9wdGlvbnMgfSBmcm9tICcuLi9pbnRlcmZhY2VzL2xpbmUtb3B0aW9ucy5tb2RlbCc7XG5pbXBvcnQgeyBZTWFya2VycyB9IGZyb20gJy4uL2ludGVyZmFjZXMveS1tYXJrZXJzLm1vZGVsJztcbmltcG9ydCB7IFlSZWdpb25zIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy95LXJlZ2lvbnMubW9kZWwnO1xuaW1wb3J0IHsgR3JhcGhEYXRhTW9kZWwgfSBmcm9tICcuLi9pbnRlcmZhY2VzL2dyYXBoLWRhdGEubW9kZWwnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICduZ3gtZnJhcHBlLWNoYXJ0cy1iYXInLFxuICB0ZW1wbGF0ZTogYFxuICAgIDxkaXZcbiAgICAgIG5neEZyYXBwZUNoYXJ0c0F4aXNcbiAgICAgIFt0aXRsZV09XCJ0aXRsZVwiXG4gICAgICBbY29sb3JzXT1cImNvbG9yc1wiXG4gICAgICBbaGVpZ2h0XT1cImhlaWdodFwiXG4gICAgICBbZGF0YV09XCJkYXRhXCJcbiAgICAgIFt0eXBlXT1cInR5cGVcIlxuICAgICAgW2lzTmF2aWdhYmxlXT1cImlzTmF2aWdhYmxlXCJcbiAgICAgIFt2YWx1ZXNPdmVyUG9pbnRzXT1cInZhbHVlc092ZXJQb2ludHNcIlxuICAgICAgW2F4aXNPcHRpb25zXT1cImF4aXNPcHRpb25zXCJcbiAgICAgIFt0b29sdGlwT3B0aW9uc109XCJ0b29sdGlwT3B0aW9uc1wiXG4gICAgICBbYmFyT3B0aW9uc109XCJiYXJPcHRpb25zXCJcbiAgICAgIFtsaW5lT3B0aW9uc109XCJsaW5lT3B0aW9uc1wiXG4gICAgICBbeU1hcmtlcnNdPVwieU1hcmtlcnNcIlxuICAgICAgW3lSZWdpb25zXT1cInlSZWdpb25zXCJcbiAgICA+PC9kaXY+XG4gIGBcbn0pXG5leHBvcnQgY2xhc3MgRnJhcHBlQ2hhcnRzQmFyQ29tcG9uZW50IHtcbiAgQElucHV0KCkgZGF0YTogR3JhcGhEYXRhTW9kZWw7XG4gIEBJbnB1dCgpIHRpdGxlPzogc3RyaW5nO1xuICBASW5wdXQoKSB0eXBlPzogc3RyaW5nO1xuICBASW5wdXQoKSBjb2xvcnM/OiBzdHJpbmdbXTtcbiAgQElucHV0KCkgaGVpZ2h0PzogbnVtYmVyOyAvLyAyNDA7XG4gIEBJbnB1dCgpIGlzTmF2aWdhYmxlPzogYm9vbGVhbjsgLy8gZmFsc2U7XG4gIEBJbnB1dCgpIHZhbHVlc092ZXJQb2ludHM/OiBib29sZWFuOyAvLyBmYWxzZTtcbiAgQElucHV0KCkgYXhpc09wdGlvbnM/OiBBeGlzT3B0aW9ucztcbiAgQElucHV0KCkgdG9vbHRpcE9wdGlvbnM/OiBUb29sdGlwT3B0aW9ucztcbiAgQElucHV0KCkgYmFyT3B0aW9ucz86IEJhck9wdGlvbnM7XG4gIEBJbnB1dCgpIGxpbmVPcHRpb25zPzogTGluZU9wdGlvbnM7XG4gIEBJbnB1dCgpIHlNYXJrZXJzOiBZTWFya2Vyc1tdO1xuICBASW5wdXQoKSB5UmVnaW9uczogWVJlZ2lvbnNbXTtcbn1cbiIsImltcG9ydCB7IERpcmVjdGl2ZSwgRWxlbWVudFJlZiwgSW5wdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE9uQ2hhbmdlcyB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5kZWNsYXJlIHZhciBmcmFwcGU6IGFueTsgLy8ganVzdCB0byBhdm9pZCBlcnJvciBtYXJrZWQgYnkgZWRpdG9yLiBPcHRpb25hbCBkZWNsYXJhdGlvblxuXG5ARGlyZWN0aXZlKHtcbiAgc2VsZWN0b3I6ICdbbmd4RnJhcHBlQ2hhcnRzSGVhdG1hcF0nXG59KVxuZXhwb3J0IGNsYXNzIEZyYXBwZUNoYXJ0c0hlYXRtYXBEaXJlY3RpdmUgaW1wbGVtZW50cyBPbkNoYW5nZXMge1xuICBASW5wdXQoKSB0aXRsZT86IHN0cmluZztcbiAgQElucHV0KCkgZGF0YTogYW55O1xuICBASW5wdXQoKSBjb3VudExhYmVsPzogc3RyaW5nO1xuICBASW5wdXQoKSBkaXNjcmV0ZURvbWFpbnM/OiBudW1iZXI7XG4gIEBJbnB1dCgpIGNvbG9ycz86IHN0cmluZ1s1XTtcbiAgcHVibGljIHJlYWRvbmx5IHR5cGUgPSAnaGVhdG1hcCc7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBlbDogRWxlbWVudFJlZikge31cblxuICBuZ09uQ2hhbmdlcygpIHtcbiAgICBjb25zdCBjaGFydCA9IG5ldyBmcmFwcGUuQ2hhcnQoXG4gICAgICB0aGlzLmVsLm5hdGl2ZUVsZW1lbnQsXG4gICAgICB0aGlzLmdldEhlYXRtYXBJbnB1dHMoKVxuICAgICk7XG4gIH1cblxuICBnZXRIZWF0bWFwSW5wdXRzKCk6IGFueSB7XG4gICAgY29uc3QgaGVhdG1hcG9iamVjdCA9IHt9O1xuICAgIGhlYXRtYXBvYmplY3RbJ2NvdW50TGFiZWwnXSA9IHRoaXMuY291bnRMYWJlbDtcbiAgICBoZWF0bWFwb2JqZWN0WydkaXNjcmV0ZURvbWFpbnMnXSA9IHRoaXMuZGlzY3JldGVEb21haW5zO1xuICAgIGhlYXRtYXBvYmplY3RbJ2NvbG9ycyddID0gdGhpcy5jb2xvcnM7XG4gICAgaGVhdG1hcG9iamVjdFsndHlwZSddID0gdGhpcy50eXBlO1xuICAgIGhlYXRtYXBvYmplY3RbJ3RpdGxlJ10gPSB0aGlzLnRpdGxlO1xuICAgIGhlYXRtYXBvYmplY3RbJ2RhdGEnXSA9IHRoaXMuZGF0YTtcbiAgICByZXR1cm4gaGVhdG1hcG9iamVjdDtcbiAgfVxufVxuIiwiZXhwb3J0IGNvbnN0IEZyYXBwZUNoYXJ0c0NvbnN0YW50cyA9IHtcclxuICBjaGFydFR5cGU6IHtcclxuICAgIHBlcmNlbnRhZ2U6ICdwZXJjZW50YWdlJyxcclxuICAgIHBpZTogJ3BpZScsXHJcbiAgICBiYXI6ICdiYXInLFxyXG4gICAgbGluZTogJ2xpbmUnLFxyXG4gICAgYXhpc21peGVkOiAnYXhpcy1taXhlZCdcclxuICB9XHJcbn07XHJcbiIsImltcG9ydCB7IERpcmVjdGl2ZSwgRWxlbWVudFJlZiwgSW5wdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE9uQ2hhbmdlcyB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRnJhcHBlQ2hhcnRzQ29uc3RhbnRzIH0gZnJvbSAnLi4vY29uc3RhbnRzL2ZyYXBwZS1jaGFydHMuY29uc3RhbnRzJztcbmltcG9ydCB7IEJhck9wdGlvbnMgfSBmcm9tICcuLi9pbnRlcmZhY2VzL3BlcmNlbnRhZ2UtYmFyLW9wdGlvbnMubW9kZWwnO1xuaW1wb3J0IHsgR3JhcGhEYXRhTW9kZWwgfSBmcm9tICcuLi9pbnRlcmZhY2VzL2dyYXBoLWRhdGEubW9kZWwnO1xuXG5kZWNsYXJlIHZhciBmcmFwcGU6IGFueTtcblxuQERpcmVjdGl2ZSh7XG4gIHNlbGVjdG9yOiAnW25neEZyYXBwZUNoYXJ0c1BlcmNlbnRhZ2VdJ1xufSlcbmV4cG9ydCBjbGFzcyBGcmFwcGVDaGFydHNQZXJjZW50YWdlRGlyZWN0aXZlIGltcGxlbWVudHMgT25DaGFuZ2VzIHtcbiAgQElucHV0KCkgdGl0bGU/OiBzdHJpbmc7XG4gIEBJbnB1dCgpIGRhdGE6IEdyYXBoRGF0YU1vZGVsO1xuICBASW5wdXQoKSBjb2xvcnM/OiBzdHJpbmdbXTtcbiAgQElucHV0KCkgaGVpZ2h0PzogbnVtYmVyO1xuICBASW5wdXQoKSB0eXBlOiBzdHJpbmc7IC8vIHBpZSAsIHBlcmNlbnRhZ2VcbiAgQElucHV0KCkgbWF4U2xpY2VzPzogbnVtYmVyOyAvLyByZXN0cmljdCBudW1iZXIgb2Ygc2xpY2VzXG4gIEBJbnB1dCgpIGJhck9wdGlvbnM/OiBCYXJPcHRpb25zO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgZWw6IEVsZW1lbnRSZWYpIHt9XG5cbiAgbmdPbkNoYW5nZXMoKSB7XG4gICAgY29uc3QgY2hhcnQgPSBuZXcgZnJhcHBlLkNoYXJ0KHRoaXMuZWwubmF0aXZlRWxlbWVudCwgdGhpcy5nZXRQaWVJbnB1dHMoKSk7XG4gIH1cblxuICBnZXRQaWVJbnB1dHMoKTogYW55IHtcbiAgICBjb25zdCBwaWVvYmplY3QgPSB7fTtcbiAgICBwaWVvYmplY3RbJ2NvbG9ycyddID0gdGhpcy5jb2xvcnM7XG4gICAgcGllb2JqZWN0Wyd0eXBlJ10gPSB0aGlzLnR5cGU7XG4gICAgcGllb2JqZWN0Wyd0aXRsZSddID0gdGhpcy50aXRsZTtcbiAgICBwaWVvYmplY3RbJ2RhdGEnXSA9IHRoaXMuZGF0YTtcbiAgICBwaWVvYmplY3RbJ2hlaWdodCddID0gdGhpcy5oZWlnaHQ7XG4gICAgcGllb2JqZWN0WydtYXhTbGljZXMnXSA9IHRoaXMubWF4U2xpY2VzO1xuICAgIHRoaXMuYWRkQmFyT3B0aW9ucyhwaWVvYmplY3QpO1xuICAgIHJldHVybiBwaWVvYmplY3Q7XG4gIH1cblxuICBhZGRCYXJPcHRpb25zKHBpZW9iamVjdCkge1xuICAgIGlmICh0aGlzLnR5cGUgPT09IEZyYXBwZUNoYXJ0c0NvbnN0YW50cy5jaGFydFR5cGUucGVyY2VudGFnZSkge1xuICAgICAgcGllb2JqZWN0WydiYXJPcHRpb25zJ10gPSB0aGlzLmJhck9wdGlvbnM7XG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQgeyBEaXJlY3RpdmUsIEVsZW1lbnRSZWYsIElucHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBPbkNoYW5nZXMgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgQXhpc09wdGlvbnMgfSBmcm9tICcuLi9pbnRlcmZhY2VzL2F4aXMtb3B0aW9ucy5tb2RlbCc7XG5pbXBvcnQgeyBUb29sdGlwT3B0aW9ucyB9IGZyb20gJy4uL2ludGVyZmFjZXMvdG9vbHRpcC1vcHRpb25zLm1vZGVsJztcbmltcG9ydCB7IEJhck9wdGlvbnMgfSBmcm9tICcuLi9pbnRlcmZhY2VzL2Jhci1vcHRpb25zLm1vZGVsJztcbmltcG9ydCB7IExpbmVPcHRpb25zIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9saW5lLW9wdGlvbnMubW9kZWwnO1xuaW1wb3J0IHsgWU1hcmtlcnMgfSBmcm9tICcuLi9pbnRlcmZhY2VzL3ktbWFya2Vycy5tb2RlbCc7XG5pbXBvcnQgeyBZUmVnaW9ucyB9IGZyb20gJy4uL2ludGVyZmFjZXMveS1yZWdpb25zLm1vZGVsJztcbmltcG9ydCB7IEZyYXBwZUNoYXJ0c0NvbnN0YW50cyB9IGZyb20gJy4uL2NvbnN0YW50cy9mcmFwcGUtY2hhcnRzLmNvbnN0YW50cyc7XG5pbXBvcnQgeyBHcmFwaERhdGFNb2RlbCB9IGZyb20gJy4uL2ludGVyZmFjZXMvZ3JhcGgtZGF0YS5tb2RlbCc7XG5cbmRlY2xhcmUgdmFyIGZyYXBwZTogYW55O1xuXG5ARGlyZWN0aXZlKHtcbiAgc2VsZWN0b3I6ICdbbmd4RnJhcHBlQ2hhcnRzQXhpc10nXG59KVxuZXhwb3J0IGNsYXNzIEZyYXBwZUNoYXJ0c0F4aXNEaXJlY3RpdmUgaW1wbGVtZW50cyBPbkNoYW5nZXMge1xuICBASW5wdXQoKSBkYXRhOiBHcmFwaERhdGFNb2RlbDtcbiAgQElucHV0KCkgdHlwZTogc3RyaW5nOyAvLyAnbGluZSdcbiAgQElucHV0KCkgdGl0bGU/OiBzdHJpbmc7XG4gIEBJbnB1dCgpIGNvbG9ycz86IHN0cmluZ1tdO1xuICBASW5wdXQoKSBoZWlnaHQ/OiBudW1iZXI7IC8vIDI0MDtcbiAgQElucHV0KCkgaXNOYXZpZ2FibGU/OiBib29sZWFuOyAvLyBmYWxzZTtcbiAgQElucHV0KCkgdmFsdWVzT3ZlclBvaW50cz86IGJvb2xlYW47IC8vIGZhbHNlO1xuICBASW5wdXQoKSBheGlzT3B0aW9ucz86IEF4aXNPcHRpb25zO1xuICBASW5wdXQoKSB0b29sdGlwT3B0aW9ucz86IFRvb2x0aXBPcHRpb25zO1xuICBASW5wdXQoKSBiYXJPcHRpb25zPzogQmFyT3B0aW9ucztcbiAgQElucHV0KCkgbGluZU9wdGlvbnM/OiBMaW5lT3B0aW9ucztcbiAgQElucHV0KCkgeU1hcmtlcnM6IFlNYXJrZXJzW107XG4gIEBJbnB1dCgpIHlSZWdpb25zOiBZUmVnaW9uc1tdO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgZWw6IEVsZW1lbnRSZWYpIHt9XG5cbiAgbmdPbkNoYW5nZXMoKSB7XG4gICAgY29uc3QgY2hhcnQgPSBuZXcgZnJhcHBlLkNoYXJ0KHRoaXMuZWwubmF0aXZlRWxlbWVudCwgdGhpcy5nZXRBeGlzSW5wdXRzKCkpO1xuICB9XG5cbiAgZ2V0QXhpc0lucHV0cygpOiBhbnkge1xuICAgIGNvbnN0IGJhck9iamVjdCA9IHt9O1xuICAgIGJhck9iamVjdFsnY29sb3JzJ10gPSB0aGlzLmNvbG9ycztcbiAgICBiYXJPYmplY3RbJ3R5cGUnXSA9IHRoaXMudHlwZTtcbiAgICBiYXJPYmplY3RbJ3RpdGxlJ10gPSB0aGlzLnRpdGxlO1xuICAgIGJhck9iamVjdFsnaGVpZ2h0J10gPSB0aGlzLmhlaWdodDtcbiAgICBiYXJPYmplY3RbJ2lzTmF2aWdhYmxlJ10gPSB0aGlzLmlzTmF2aWdhYmxlO1xuICAgIGJhck9iamVjdFsndmFsdWVzT3ZlclBvaW50cyddID0gdGhpcy52YWx1ZXNPdmVyUG9pbnRzO1xuICAgIGJhck9iamVjdFsnYXhpc09wdGlvbnMnXSA9IHRoaXMuYXhpc09wdGlvbnM7XG4gICAgYmFyT2JqZWN0Wyd0b29sdGlwT3B0aW9ucyddID0gdGhpcy50b29sdGlwT3B0aW9ucztcblxuICAgIHRoaXMuYWRkR3JhcGhEYXRhKGJhck9iamVjdCk7XG4gICAgdGhpcy5hZGRMaW5lT3B0aW9ucyhiYXJPYmplY3QpO1xuICAgIHRoaXMuYWRkQmFyT3B0aW9ucyhiYXJPYmplY3QpO1xuXG4gICAgcmV0dXJuIGJhck9iamVjdDtcbiAgfVxuXG4gIGFkZExpbmVPcHRpb25zKGJhck9iamVjdCkge1xuICAgIGlmIChcbiAgICAgIHRoaXMudHlwZSA9PT0gRnJhcHBlQ2hhcnRzQ29uc3RhbnRzLmNoYXJ0VHlwZS5saW5lIHx8XG4gICAgICB0aGlzLnR5cGUgPT09IEZyYXBwZUNoYXJ0c0NvbnN0YW50cy5jaGFydFR5cGUuYXhpc21peGVkXG4gICAgKSB7XG4gICAgICBiYXJPYmplY3RbJ2xpbmVPcHRpb25zJ10gPSB0aGlzLmxpbmVPcHRpb25zO1xuICAgIH1cbiAgfVxuXG4gIGFkZEJhck9wdGlvbnMoYmFyT2JqZWN0KSB7XG4gICAgaWYgKFxuICAgICAgdGhpcy50eXBlID09PSBGcmFwcGVDaGFydHNDb25zdGFudHMuY2hhcnRUeXBlLmJhciB8fFxuICAgICAgdGhpcy50eXBlID09PSBGcmFwcGVDaGFydHNDb25zdGFudHMuY2hhcnRUeXBlLmF4aXNtaXhlZFxuICAgICkge1xuICAgICAgYmFyT2JqZWN0WydiYXJPcHRpb25zJ10gPSB0aGlzLmJhck9wdGlvbnM7XG4gICAgfVxuICB9XG5cbiAgYWRkR3JhcGhEYXRhKGJhck9iamVjdCkge1xuICAgIGNvbnN0IGRhdGEgPSB0aGlzLmRhdGE7XG4gICAgaWYgKHRoaXMueU1hcmtlcnMpIHtcbiAgICAgIGRhdGFbJ3lNYXJrZXJzJ10gPSB0aGlzLnlNYXJrZXJzO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnlSZWdpb25zKSB7XG4gICAgICBkYXRhWyd5UmVnaW9ucyddID0gdGhpcy55UmVnaW9ucztcbiAgICB9XG5cbiAgICBiYXJPYmplY3RbJ2RhdGEnXSA9IGRhdGE7XG4gIH1cbn1cbiIsImltcG9ydCB7IE5nTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBGcmFwcGVDaGFydHNIZWF0bWFwQ29tcG9uZW50IH0gZnJvbSAnLi9jb21wb25lbnRzL2ZyYXBwZS1jaGFydHMtaGVhdG1hcC5jb21wb25lbnQnO1xuaW1wb3J0IHsgRnJhcHBlQ2hhcnRzSGVhdG1hcERpcmVjdGl2ZSB9IGZyb20gJy4vZGlyZWN0aXZlcy9mcmFwcGUtY2hhcnRzLWhlYXRtYXAuZGlyZWN0aXZlJztcbmltcG9ydCB7IEZyYXBwZUNoYXJ0c1BlcmNlbnRhZ2VDb21wb25lbnQgfSBmcm9tICcuL2NvbXBvbmVudHMvZnJhcHBlLWNoYXJ0cy1wZXJjZW50YWdlLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBGcmFwcGVDaGFydHNQZXJjZW50YWdlRGlyZWN0aXZlIH0gZnJvbSAnLi9kaXJlY3RpdmVzL2ZyYXBwZS1jaGFydHMtcGVyY2VudGFnZS5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgRnJhcHBlQ2hhcnRzQmFyQ29tcG9uZW50IH0gZnJvbSAnLi9jb21wb25lbnRzL2ZyYXBwZS1jaGFydHMtYmFyLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBGcmFwcGVDaGFydHNBeGlzRGlyZWN0aXZlIH0gZnJvbSAnLi9kaXJlY3RpdmVzL2ZyYXBwZS1jaGFydHMtYXhpcy5kaXJlY3RpdmUnO1xuXG5ATmdNb2R1bGUoe1xuICBpbXBvcnRzOiBbXSxcbiAgZGVjbGFyYXRpb25zOiBbXG4gICAgRnJhcHBlQ2hhcnRzSGVhdG1hcENvbXBvbmVudCxcbiAgICBGcmFwcGVDaGFydHNQZXJjZW50YWdlQ29tcG9uZW50LFxuICAgIEZyYXBwZUNoYXJ0c0JhckNvbXBvbmVudCxcbiAgICBGcmFwcGVDaGFydHNIZWF0bWFwRGlyZWN0aXZlLFxuICAgIEZyYXBwZUNoYXJ0c1BlcmNlbnRhZ2VEaXJlY3RpdmUsXG4gICAgRnJhcHBlQ2hhcnRzQXhpc0RpcmVjdGl2ZVxuICBdLFxuICBleHBvcnRzOiBbXG4gICAgRnJhcHBlQ2hhcnRzSGVhdG1hcENvbXBvbmVudCxcbiAgICBGcmFwcGVDaGFydHNQZXJjZW50YWdlQ29tcG9uZW50LFxuICAgIEZyYXBwZUNoYXJ0c0JhckNvbXBvbmVudFxuICBdXG59KVxuZXhwb3J0IGNsYXNzIEZyYXBwZUNoYXJ0c01vZHVsZSB7fVxuIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBOzs7WUFHQyxTQUFTLFNBQUM7Z0JBQ1QsUUFBUSxFQUFFLDJCQUEyQjtnQkFDckMsUUFBUSxFQUFFOzs7Ozs7Ozs7R0FTVDthQUNGOzs7bUJBRUUsS0FBSztvQkFDTCxLQUFLO3lCQUNMLEtBQUs7OEJBQ0wsS0FBSztxQkFDTCxLQUFLOzs7Ozs7O0FDckJSOzs7WUFJQyxTQUFTLFNBQUM7Z0JBQ1QsUUFBUSxFQUFFLDhCQUE4QjtnQkFDeEMsUUFBUSxFQUFFOzs7Ozs7Ozs7O0dBVVQ7YUFDRjs7O21CQUVFLEtBQUs7b0JBQ0wsS0FBSztxQkFDTCxLQUFLO3FCQUNMLEtBQUs7bUJBQ0wsS0FBSzt3QkFDTCxLQUFLO3lCQUNMLEtBQUs7Ozs7Ozs7QUN6QlI7OztZQVNDLFNBQVMsU0FBQztnQkFDVCxRQUFRLEVBQUUsdUJBQXVCO2dCQUNqQyxRQUFRLEVBQUU7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBaUJUO2FBQ0Y7OzttQkFFRSxLQUFLO29CQUNMLEtBQUs7bUJBQ0wsS0FBSztxQkFDTCxLQUFLO3FCQUNMLEtBQUs7MEJBQ0wsS0FBSzsrQkFDTCxLQUFLOzBCQUNMLEtBQUs7NkJBQ0wsS0FBSzt5QkFDTCxLQUFLOzBCQUNMLEtBQUs7dUJBQ0wsS0FBSzt1QkFDTCxLQUFLOzs7Ozs7O0FDM0NSO0FBUUE7Ozs7SUFRRSxZQUFvQixFQUFjO1FBQWQsT0FBRSxHQUFGLEVBQUUsQ0FBWTtRQUZsQixTQUFJLEdBQUcsU0FBUyxDQUFDO0tBRUs7Ozs7SUFFdEMsV0FBVzs7Y0FDSCxLQUFLLEdB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