igniteui-angular-extras 16.1.0 → 17.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (29) hide show
  1. package/esm2022/igniteui-angular-extras.mjs +4 -4
  2. package/esm2022/images/charts.mjs +17 -17
  3. package/esm2022/images/conditions.mjs +11 -11
  4. package/esm2022/lib/context-menu/chart-dialog/chart-dialog.component.mjs +67 -67
  5. package/esm2022/lib/context-menu/context-menu.component.mjs +176 -176
  6. package/esm2022/lib/context-menu/igx-context-menu.directive.mjs +154 -154
  7. package/esm2022/lib/directives/chart-integration/chart-integration.directive.mjs +312 -312
  8. package/esm2022/lib/directives/chart-integration/chart-types.mjs +27 -27
  9. package/esm2022/lib/directives/chart-integration/initializers.mjs +102 -102
  10. package/esm2022/lib/directives/conditional-formatting/conditional-formatting.directive.mjs +303 -303
  11. package/esm2022/lib/igniteui-angular-extras.module.mjs +107 -107
  12. package/esm2022/lib/pipes/svg.pipe.mjs +19 -19
  13. package/esm2022/public-api.mjs +20 -20
  14. package/fesm2022/igniteui-angular-extras.mjs +1228 -1228
  15. package/fesm2022/igniteui-angular-extras.mjs.map +1 -1
  16. package/images/charts.d.ts +16 -16
  17. package/images/conditions.d.ts +10 -10
  18. package/index.d.ts +5 -5
  19. package/lib/context-menu/chart-dialog/chart-dialog.component.d.ts +31 -31
  20. package/lib/context-menu/context-menu.component.d.ts +37 -37
  21. package/lib/context-menu/igx-context-menu.directive.d.ts +33 -33
  22. package/lib/directives/chart-integration/chart-integration.directive.d.ts +52 -52
  23. package/lib/directives/chart-integration/chart-types.d.ts +25 -25
  24. package/lib/directives/chart-integration/initializers.d.ts +39 -39
  25. package/lib/directives/conditional-formatting/conditional-formatting.directive.d.ts +95 -95
  26. package/lib/igniteui-angular-extras.module.d.ts +15 -15
  27. package/lib/pipes/svg.pipe.d.ts +10 -10
  28. package/package.json +6 -6
  29. package/public-api.d.ts +17 -17
@@ -1,312 +1,312 @@
1
- import { Directive, EventEmitter, Input, Output } from '@angular/core';
2
- import { IgxAreaSeriesComponent, IgxBarSeriesComponent, IgxBubbleSeriesComponent, IgxColumnSeriesComponent, IgxDataChartComponent, IgxItemLegendComponent, IgxLegendComponent, IgxLineSeriesComponent, IgxPieChartComponent, IgxScatterLineSeriesComponent, IgxScatterSeriesComponent, IgxSizeScaleComponent, IgxStacked100AreaSeriesComponent, IgxStacked100BarSeriesComponent, IgxStacked100ColumnSeriesComponent, IgxStacked100LineSeriesComponent, IgxStackedAreaSeriesComponent, IgxStackedBarSeriesComponent, IgxStackedColumnSeriesComponent, IgxStackedLineSeriesComponent } from 'igniteui-angular-charts';
3
- import { CHART_TYPE } from './chart-types';
4
- import { IgxDataChartInitializer, IgxPieChartInitializer, IgxStackedDataChartInitializer } from './initializers';
5
- import * as i0 from "@angular/core";
6
- export class IgxChartIntegrationDirective {
7
- get chartData() {
8
- return this._chartData;
9
- }
10
- set chartData(selectedData) {
11
- const charts = new Set(this._dataChartTypes);
12
- const dataModel = selectedData.length ? selectedData[0] : {};
13
- this._labelMemberPaths = Object.keys(dataModel).filter(key => typeof dataModel[key] === 'string');
14
- this._valueMemberPaths = Object.keys(dataModel).filter(key => typeof dataModel[key] === 'number');
15
- this._chartData = selectedData.map((dataRecord, index) => this.addIndexMemberPath(dataRecord, index + 1));
16
- const args = {
17
- chartsAvailabilty: new Map(),
18
- chartsForCreation: []
19
- };
20
- if (selectedData.length === 0 || this._valueMemberPaths.length === 0) {
21
- this.onChartTypesDetermined.emit(args);
22
- return;
23
- }
24
- if (selectedData.length === 1) {
25
- charts.forEach((chart, _, set) => {
26
- const isColumnChart = chart.indexOf('Column') !== -1;
27
- const isBarChart = chart.indexOf('Bar') !== -1;
28
- const isPieChart = chart.indexOf('Pie') !== -1;
29
- if (!(isColumnChart || isBarChart || isPieChart)) {
30
- set.delete(chart);
31
- }
32
- });
33
- }
34
- // Config pie chart
35
- const cannotCreatePieChart = selectedData.some(record => record[this._valueMemberPaths[0]] <= 0);
36
- if (cannotCreatePieChart) {
37
- charts.delete(CHART_TYPE.PIE);
38
- }
39
- // Config scatter chart member paths
40
- const canCreateScatterChart = this._valueMemberPaths.length >= 2;
41
- const canCreateBubbleChart = this._valueMemberPaths.length >= 3;
42
- if (!canCreateScatterChart) {
43
- charts.delete(CHART_TYPE.SCATTER_BUBBLE);
44
- charts.delete(CHART_TYPE.SCATTER_LINE);
45
- charts.delete(CHART_TYPE.SCATTER_POINT);
46
- }
47
- if (!canCreateBubbleChart) {
48
- charts.delete(CHART_TYPE.SCATTER_BUBBLE);
49
- }
50
- args.chartsAvailabilty = this.chartTypesAvailability;
51
- args.chartsForCreation = [...charts];
52
- this.onChartTypesDetermined.emit(args);
53
- }
54
- set scatterChartYAxisValueMemberPath(path) {
55
- this._scatterChartYAxisValueMemberPath = path;
56
- }
57
- get scatterChartYAxisValueMemberPath() {
58
- return this._scatterChartYAxisValueMemberPath &&
59
- this._valueMemberPaths.indexOf(this._scatterChartYAxisValueMemberPath) !== -1 ?
60
- this._scatterChartYAxisValueMemberPath : this._valueMemberPaths[0];
61
- }
62
- set bubbleChartRadiusMemberPath(path) {
63
- this._bubbleChartRadiusMemberPath = path;
64
- }
65
- get bubbleChartRadiusMemberPath() {
66
- return this._bubbleChartRadiusMemberPath &&
67
- this._valueMemberPaths.indexOf(this._bubbleChartRadiusMemberPath) !== -1 ?
68
- this._bubbleChartRadiusMemberPath : this._valueMemberPaths[1];
69
- }
70
- get _labelMemberPath() {
71
- return this.defaultLabelMemberPath && this._chartData.some(r => r[this.defaultLabelMemberPath] !== undefined) ?
72
- this.defaultLabelMemberPath : this._labelMemberPaths.length > 0 ? this._labelMemberPaths[0] : 'Index';
73
- }
74
- get pieChartOptions() {
75
- return {
76
- width: '85%',
77
- height: '75%',
78
- dataSource: this.chartData,
79
- valueMemberPath: this._valueMemberPaths[0],
80
- legendLabelMemberPath: this._labelMemberPath,
81
- labelMemberPath: this._labelMemberPath,
82
- };
83
- }
84
- get dataChartOptions() {
85
- return {
86
- width: '100%',
87
- height: '85%',
88
- autoMarginWidth: 50,
89
- isVerticalZoomEnabled: true,
90
- isHorizontalZoomEnabled: true,
91
- dataSource: this.chartData
92
- };
93
- }
94
- constructor(factoryResolver) {
95
- this.factoryResolver = factoryResolver;
96
- this.onChartTypesDetermined = new EventEmitter();
97
- this.onChartCreationDone = new EventEmitter();
98
- this.useLegend = true;
99
- this.defaultLabelMemberPath = undefined;
100
- this.chartTypesAvailability = new Map();
101
- this.customChartComponentOptions = new Map();
102
- this.dataCharts = new Map();
103
- this._scatterChartYAxisValueMemberPath = undefined;
104
- this._bubbleChartRadiusMemberPath = undefined;
105
- this._valueMemberPaths = [];
106
- this._labelMemberPaths = [];
107
- this._sizeScale = new IgxSizeScaleComponent();
108
- this._dataChartTypes = new Set();
109
- this.dataChartSeriesOptionsModel = {
110
- isHighlightingEnabled: true,
111
- areaFillOpacity: .4,
112
- markerType: 3,
113
- showDefaultTooltip: true
114
- };
115
- this.scatterChartSeriesOptionsModel = {
116
- markerType: 3,
117
- showDefaultTooltip: true
118
- };
119
- this.bubbleChartSeriesOptionsModel = {
120
- radiusScale: this._sizeScale
121
- };
122
- this.dataCharts.set(CHART_TYPE.COLUMN_GROUPED, IgxColumnSeriesComponent);
123
- this.dataCharts.set(CHART_TYPE.AREA_GROUPED, IgxAreaSeriesComponent);
124
- this.dataCharts.set(CHART_TYPE.LINE_GROUPED, IgxLineSeriesComponent);
125
- this.dataCharts.set(CHART_TYPE.BAR_GROUPED, IgxBarSeriesComponent);
126
- this.dataCharts.set(CHART_TYPE.COLUMN_STACKED, IgxStackedColumnSeriesComponent);
127
- this.dataCharts.set(CHART_TYPE.AREA_STACKED, IgxStackedAreaSeriesComponent);
128
- this.dataCharts.set(CHART_TYPE.LINE_STACKED, IgxStackedLineSeriesComponent);
129
- this.dataCharts.set(CHART_TYPE.BAR_STACKED, IgxStackedBarSeriesComponent);
130
- this.dataCharts.set(CHART_TYPE.COLUMN_100_STACKED, IgxStacked100ColumnSeriesComponent);
131
- this.dataCharts.set(CHART_TYPE.AREA_100_STACKED, IgxStacked100AreaSeriesComponent);
132
- this.dataCharts.set(CHART_TYPE.LINE_100_STACKED, IgxStacked100LineSeriesComponent);
133
- this.dataCharts.set(CHART_TYPE.BAR_100_STACKED, IgxStacked100BarSeriesComponent);
134
- this.dataCharts.set(CHART_TYPE.SCATTER_POINT, IgxScatterSeriesComponent);
135
- this.dataCharts.set(CHART_TYPE.SCATTER_BUBBLE, IgxBubbleSeriesComponent);
136
- this.dataCharts.set(CHART_TYPE.SCATTER_LINE, IgxScatterLineSeriesComponent);
137
- this.dataCharts.set(CHART_TYPE.PIE, IgxPieChartComponent);
138
- const iterable = this.dataCharts.keys();
139
- for (let head = iterable.next().value; head !== undefined; head = iterable.next().value) {
140
- this._dataChartTypes.add(head);
141
- this.chartTypesAvailability.set(head, true);
142
- this.customChartComponentOptions.set(head, {});
143
- }
144
- }
145
- getAvailableCharts() {
146
- const res = [];
147
- this.chartTypesAvailability.forEach((isAvailable, chartType) => {
148
- if (isAvailable) {
149
- res.push(chartType);
150
- }
151
- });
152
- return res;
153
- }
154
- disableCharts(types) {
155
- types.forEach(type => {
156
- if (this.chartTypesAvailability.get(type)) {
157
- this.chartTypesAvailability.set(type, false);
158
- }
159
- });
160
- }
161
- enableCharts(types) {
162
- types.forEach(type => {
163
- if (!this.chartTypesAvailability.get(type)) {
164
- this.chartTypesAvailability.set(type, true);
165
- }
166
- });
167
- }
168
- chartFactory(type, viewContainerRef) {
169
- if (!this.chartTypesAvailability.get(type)) {
170
- return;
171
- }
172
- let componentFactory;
173
- let componentRef;
174
- this._sizeScale.maximumValue = 60;
175
- this._sizeScale.minimumValue = 10;
176
- const chartType = this.dataCharts.get(type);
177
- if (type === CHART_TYPE.PIE) {
178
- componentFactory = this.factoryResolver.resolveComponentFactory(IgxPieChartComponent);
179
- componentRef = viewContainerRef.createComponent(componentFactory);
180
- }
181
- else {
182
- componentFactory = this.factoryResolver.resolveComponentFactory(IgxDataChartComponent);
183
- componentRef = viewContainerRef.createComponent(componentFactory);
184
- }
185
- const options = this.getChartOptions(type);
186
- const initializer = this.getInitializer(type, chartType);
187
- if (this.useLegend) {
188
- const legendType = type === CHART_TYPE.PIE ? IgxItemLegendComponent : IgxLegendComponent;
189
- const legendFactory = this.factoryResolver.resolveComponentFactory(legendType);
190
- const legendComponentRef = viewContainerRef.createComponent(legendFactory);
191
- options.chartOptions['legend'] = legendComponentRef.instance;
192
- }
193
- const chart = initializer.initChart(componentRef.instance, options);
194
- this.onChartCreationDone.emit(chart);
195
- }
196
- getInitializer(chartType, componentClassRef) {
197
- if (chartType.includes('Pie')) {
198
- return new IgxPieChartInitializer();
199
- }
200
- else if (chartType.includes('Stacked')) {
201
- return new IgxStackedDataChartInitializer(componentClassRef);
202
- }
203
- else {
204
- return new IgxDataChartInitializer(componentClassRef);
205
- }
206
- }
207
- getChartOptions(type) {
208
- const chartComponentOptions = {};
209
- return type === CHART_TYPE.PIE ? this.addPieChartDataOptions(chartComponentOptions) :
210
- this.addDataChartDataOptions(type, chartComponentOptions, type.includes('Stacked'));
211
- }
212
- addPieChartDataOptions(chartComponentOptions) {
213
- // tslint:disable-next-line: max-line-length
214
- chartComponentOptions.chartOptions = Object.assign(this.pieChartOptions, this.customChartComponentOptions.get(CHART_TYPE.PIE).chartOptions);
215
- return chartComponentOptions;
216
- }
217
- addDataChartDataOptions(type, chartComponentOptions, stacked) {
218
- chartComponentOptions.chartOptions = Object.assign(this.dataChartOptions, this.customChartComponentOptions.get(type));
219
- if (type.indexOf('Scatter') !== -1) {
220
- this.addScatterChartDataOptions(type, chartComponentOptions);
221
- }
222
- else {
223
- // tslint:disable-next-line: max-line-length
224
- chartComponentOptions.seriesModel = Object.assign(this.dataChartSeriesOptionsModel, this.customChartComponentOptions.get(type).seriesModel);
225
- this.setAxisLabelOption(type, chartComponentOptions);
226
- const options = [];
227
- this._valueMemberPaths.forEach(valueMemberPath => {
228
- const dataOptions = {
229
- title: valueMemberPath,
230
- valueMemberPath
231
- };
232
- if (stacked) {
233
- options.push({ ...dataOptions });
234
- }
235
- else {
236
- options.push({ ...dataOptions, ...chartComponentOptions.seriesModel });
237
- }
238
- });
239
- stacked ? chartComponentOptions.stackedFragmentOptions = options :
240
- chartComponentOptions.seriesOptions = options;
241
- }
242
- return chartComponentOptions;
243
- }
244
- addScatterChartDataOptions(scatterChart, chartComponentOptions) {
245
- // tslint:disable-next-line: max-line-length
246
- chartComponentOptions.seriesModel = Object.assign(this.scatterChartSeriesOptionsModel, this.customChartComponentOptions.get(scatterChart).seriesModel);
247
- chartComponentOptions.seriesModel['yMemberPath'] = this.scatterChartYAxisValueMemberPath;
248
- if (scatterChart === CHART_TYPE.SCATTER_BUBBLE) {
249
- chartComponentOptions.seriesModel = Object.assign(chartComponentOptions.seriesModel, this.bubbleChartSeriesOptionsModel);
250
- chartComponentOptions.seriesModel['radiusMemberPath'] = this.bubbleChartRadiusMemberPath;
251
- }
252
- const model = chartComponentOptions.seriesModel;
253
- const seriesOptions = [];
254
- this._valueMemberPaths.filter(v => !(v === model['yMemberPath'] ||
255
- v === model['radiusMemberPath'])).forEach(valueMemberPath => {
256
- const dataOptions = {
257
- title: `${model['yMemberPath']} vs ${valueMemberPath}`,
258
- xMemberPath: valueMemberPath,
259
- labelMemberPath: this._labelMemberPath
260
- };
261
- seriesOptions.push({ ...dataOptions, ...model });
262
- });
263
- chartComponentOptions.seriesOptions = seriesOptions;
264
- }
265
- addIndexMemberPath(dataRecord, index) {
266
- dataRecord = { ...{ [this._labelMemberPath]: index }, ...dataRecord };
267
- return dataRecord;
268
- }
269
- setAxisLabelOption(type, options) {
270
- if (type.indexOf('Bar') !== -1) {
271
- options.yAxisOptions = Object.assign({
272
- label: this._labelMemberPath
273
- }, this.customChartComponentOptions.get(type).yAxisOptions);
274
- }
275
- else {
276
- options.xAxisOptions = Object.assign({
277
- label: this._labelMemberPath
278
- }, this.customChartComponentOptions.get(type).xAxisOptions);
279
- }
280
- }
281
- setChartComponentOptions(chart, optionsType, options) {
282
- if (!this.customChartComponentOptions.get(chart)[optionsType]) {
283
- this.customChartComponentOptions.get(chart)[optionsType] = {};
284
- }
285
- Object.keys(options).forEach(property => {
286
- this.customChartComponentOptions.get(chart)[optionsType][property] = options[property];
287
- });
288
- }
289
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.5", ngImport: i0, type: IgxChartIntegrationDirective, deps: [{ token: i0.ComponentFactoryResolver }], target: i0.ɵɵFactoryTarget.Directive }); }
290
- static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "16.2.5", type: IgxChartIntegrationDirective, selector: "[igxChartIntegration]", inputs: { chartData: "chartData", useLegend: "useLegend", defaultLabelMemberPath: "defaultLabelMemberPath", scatterChartYAxisValueMemberPath: "scatterChartYAxisValueMemberPath", bubbleChartRadiusMemberPath: "bubbleChartRadiusMemberPath" }, outputs: { onChartTypesDetermined: "onChartTypesDetermined", onChartCreationDone: "onChartCreationDone" }, ngImport: i0 }); }
291
- }
292
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.5", ngImport: i0, type: IgxChartIntegrationDirective, decorators: [{
293
- type: Directive,
294
- args: [{
295
- selector: '[igxChartIntegration]'
296
- }]
297
- }], ctorParameters: function () { return [{ type: i0.ComponentFactoryResolver }]; }, propDecorators: { chartData: [{
298
- type: Input
299
- }], onChartTypesDetermined: [{
300
- type: Output
301
- }], onChartCreationDone: [{
302
- type: Output
303
- }], useLegend: [{
304
- type: Input
305
- }], defaultLabelMemberPath: [{
306
- type: Input
307
- }], scatterChartYAxisValueMemberPath: [{
308
- type: Input
309
- }], bubbleChartRadiusMemberPath: [{
310
- type: Input
311
- }] } });
312
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhcnQtaW50ZWdyYXRpb24uZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvaWduaXRldWktYW5ndWxhci1leHRyYXMvc3JjL2xpYi9kaXJlY3RpdmVzL2NoYXJ0LWludGVncmF0aW9uL2NoYXJ0LWludGVncmF0aW9uLmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQTRELFNBQVMsRUFDeEUsWUFBWSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQTBCLE1BQU0sZUFBZSxDQUFDO0FBQy9FLE9BQU8sRUFDSCxzQkFBc0IsRUFBRSxxQkFBcUIsRUFBRSx3QkFBd0IsRUFBRSx3QkFBd0IsRUFDakcscUJBQXFCLEVBQUUsc0JBQXNCLEVBQUUsa0JBQWtCLEVBQUUsc0JBQXNCLEVBQUUsb0JBQW9CLEVBQy9HLDZCQUE2QixFQUFFLHlCQUF5QixFQUFFLHFCQUFxQixFQUFFLGdDQUFnQyxFQUNqSCwrQkFBK0IsRUFBRSxrQ0FBa0MsRUFBRSxnQ0FBZ0MsRUFDckcsNkJBQTZCLEVBQUUsNEJBQTRCLEVBQUUsK0JBQStCLEVBQzVGLDZCQUE2QixFQUNoQyxNQUFNLHlCQUF5QixDQUFDO0FBQ2pDLE9BQU8sRUFBRSxVQUFVLEVBQWdCLE1BQU0sZUFBZSxDQUFDO0FBQ3pELE9BQU8sRUFBNEMsdUJBQXVCLEVBQ3RFLHNCQUFzQixFQUFFLDhCQUE4QixFQUFZLE1BQU0sZ0JBQWdCLENBQUM7O0FBVTdGLE1BQU0sT0FBTyw0QkFBNEI7SUFDckMsSUFDVyxTQUFTO1FBQ2hCLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQztJQUMzQixDQUFDO0lBRUQsSUFBVyxTQUFTLENBQUMsWUFBbUI7UUFDcEMsTUFBTSxNQUFNLEdBQUcsSUFBSSxHQUFHLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDO1FBQzdDLE1BQU0sU0FBUyxHQUFHLFlBQVksQ0FBQyxNQUFNLENBQUMs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LENBQUMsSUFBSSxDQUFDLDJCQUEyQixDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxXQUFXLENBQUMsRUFBRTtZQUMzRCxJQUFJLENBQUMsMkJBQTJCLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLFdBQVcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztTQUNqRTtRQUNELE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxFQUFFO1lBQ2hDLElBQUksQ0FBQywyQkFBMkIsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsUUFBUSxDQUFDLEdBQUcsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQy9GLENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQzs4R0E5VFEsNEJBQTRCO2tHQUE1Qiw0QkFBNEI7OzJGQUE1Qiw0QkFBNEI7a0JBSHhDLFNBQVM7bUJBQUM7b0JBQ1AsUUFBUSxFQUFFLHVCQUF1QjtpQkFDcEM7K0dBR2MsU0FBUztzQkFEbkIsS0FBSztnQkFxREMsc0JBQXNCO3NCQUQ1QixNQUFNO2dCQUlBLG1CQUFtQjtzQkFEekIsTUFBTTtnQkFJQSxTQUFTO3NCQURmLEtBQUs7Z0JBSUMsc0JBQXNCO3NCQUQ1QixLQUFLO2dCQUlLLGdDQUFnQztzQkFEMUMsS0FBSztnQkFZSywyQkFBMkI7c0JBRHJDLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnRGYWN0b3J5LCBDb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIsIENvbXBvbmVudFJlZiwgRGlyZWN0aXZlLFxyXG4gICAgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT3V0cHV0LCBUeXBlLCBWaWV3Q29udGFpbmVyUmVmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7XHJcbiAgICBJZ3hBcmVhU2VyaWVzQ29tcG9uZW50LCBJZ3hCYXJTZXJpZXNDb21wb25lbnQsIElneEJ1YmJsZVNlcmllc0NvbXBvbmVudCwgSWd4Q29sdW1uU2VyaWVzQ29tcG9uZW50LFxyXG4gICAgSWd4RGF0YUNoYXJ0Q29tcG9uZW50LCBJZ3hJdGVtTGVnZW5kQ29tcG9uZW50LCBJZ3hMZWdlbmRDb21wb25lbnQsIElneExpbmVTZXJpZXNDb21wb25lbnQsIElneFBpZUNoYXJ0Q29tcG9uZW50LFxyXG4gICAgSWd4U2NhdHRlckxpbmVTZXJpZXNDb21wb25lbnQsIElneFNjYXR0ZXJTZXJpZXNDb21wb25lbnQsIElneFNpemVTY2FsZUNvbXBvbmVudCwgSWd4U3RhY2tlZDEwMEFyZWFTZXJpZXNDb21wb25lbnQsXHJcbiAgICBJZ3hTdGFja2VkMTAwQmFyU2VyaWVzQ29tcG9uZW50LCBJZ3hTdGFja2VkMTAwQ29sdW1uU2VyaWVzQ29tcG9uZW50LCBJZ3hTdGFja2VkMTAwTGluZVNlcmllc0NvbXBvbmVudCxcclxuICAgIElneFN0YWNrZWRBcmVhU2VyaWVzQ29tcG9uZW50LCBJZ3hTdGFja2VkQmFyU2VyaWVzQ29tcG9uZW50LCBJZ3hTdGFja2VkQ29sdW1uU2VyaWVzQ29tcG9uZW50LFxyXG4gICAgSWd4U3RhY2tlZExpbmVTZXJpZXNDb21wb25lbnRcclxufSBmcm9tICdpZ25pdGV1aS1hbmd1bGFyLWNoYXJ0cyc7XHJcbmltcG9ydCB7IENIQVJUX1RZUEUsIE9QVElPTlNfVFlQRSB9IGZyb20gJy4vY2hhcnQtdHlwZXMnO1xyXG5pbXBvcnQgeyBDaGFydEluaXRpYWxpemVyLCBJQ2hhcnRDb21wb25lbnRPcHRpb25zLCBJZ3hEYXRhQ2hhcnRJbml0aWFsaXplcixcclxuICAgIElneFBpZUNoYXJ0SW5pdGlhbGl6ZXIsIElneFN0YWNrZWREYXRhQ2hhcnRJbml0aWFsaXplciwgSU9wdGlvbnMgfSBmcm9tICcuL2luaXRpYWxpemVycyc7XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElEZXRlcm1pbmVkQ2hhcnRUeXBlc0FyZ3Mge1xyXG4gICAgY2hhcnRzQXZhaWxhYmlsdHk6IE1hcDxDSEFSVF9UWVBFLCBib29sZWFuPjtcclxuICAgIGNoYXJ0c0ZvckNyZWF0aW9uOiBDSEFSVF9UWVBFW107XHJcbn1cclxuXHJcbkBEaXJlY3RpdmUoe1xyXG4gICAgc2VsZWN0b3I6ICdbaWd4Q2hhcnRJbnRlZ3JhdGlvbl0nXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBJZ3hDaGFydEludGVncmF0aW9uRGlyZWN0aXZlIHtcclxuICAgIEBJbnB1dCgpXHJcbiAgICBwdWJsaWMgZ2V0IGNoYXJ0RGF0YSgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fY2hhcnREYXRhO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzZXQgY2hhcnREYXRhKHNlbGVjdGVkRGF0YTogYW55W10pIHtcclxuICAgICAgICBjb25zdCBjaGFydHMgPSBuZXcgU2V0KHRoaXMuX2RhdGFDaGFydFR5cGVzKTtcclxuICAgICAgICBjb25zdCBkYXRhTW9kZWwgPSBzZWxlY3RlZERhdGEubGVuZ3RoID8gc2VsZWN0ZWREYXRhWzBdIDoge307XHJcbiAgICAgICAgdGhpcy5fbGFiZWxNZW1iZXJQYXRocyA9IE9iamVjdC5rZXlzKGRhdGFNb2RlbCkuZmlsdGVyKGtleSA9PiB0eXBlb2YgZGF0YU1vZGVsW2tleV0gPT09ICdzdHJpbmcnKTtcclxuICAgICAgICB0aGlzLl92YWx1ZU1lbWJlclBhdGhzID0gT2JqZWN0LmtleXMoZGF0YU1vZGVsKS5maWx0ZXIoa2V5ID0+IHR5cGVvZiBkYXRhTW9kZWxba2V5XSA9PT0gJ251bWJlcicpO1xyXG4gICAgICAgIHRoaXMuX2NoYXJ0RGF0YSA9IHNlbGVjdGVkRGF0YS5tYXAoKGRhdGFSZWNvcmQsIGluZGV4KSA9PiB0aGlzLmFkZEluZGV4TWVtYmVyUGF0aChkYXRhUmVjb3JkLCBpbmRleCArIDEpKTtcclxuICAgICAgICBjb25zdCBhcmdzOiBJRGV0ZXJtaW5lZENoYXJ0VHlwZXNBcmdzID0ge1xyXG4gICAgICAgICAgICBjaGFydHNBdmFpbGFiaWx0eTogbmV3IE1hcDxDSEFSVF9UWVBFLCBib29sZWFuPigpLFxyXG4gICAgICAgICAgICBjaGFydHNGb3JDcmVhdGlvbjogW11cclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICBpZiAoc2VsZWN0ZWREYXRhLmxlbmd0aCA9PT0gMCB8fCB0aGlzLl92YWx1ZU1lbWJlclBhdGhzLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICAgICAgICB0aGlzLm9uQ2hhcnRUeXBlc0RldGVybWluZWQuZW1pdChhcmdzKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoc2VsZWN0ZWREYXRhLmxlbmd0aCA9PT0gMSkge1xyXG4gICAgICAgICAgICBjaGFydHMuZm9yRWFjaCgoY2hhcnQsIF8sIHNldCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgaXNDb2x1bW5DaGFydCA9IGNoYXJ0LmluZGV4T2YoJ0NvbHVtbicpICE9PSAtMTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGlzQmFyQ2hhcnQgPSBjaGFydC5pbmRleE9mKCdCYXInKSAhPT0gLTE7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBpc1BpZUNoYXJ0ID0gY2hhcnQuaW5kZXhPZignUGllJykgIT09IC0xO1xyXG4gICAgICAgICAgICAgICAgaWYgKCEoaXNDb2x1bW5DaGFydCB8fCBpc0JhckNoYXJ0IHx8IGlzUGllQ2hhcnQpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgc2V0LmRlbGV0ZShjaGFydCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBDb25maWcgcGllIGNoYXJ0XHJcbiAgICAgICAgY29uc3QgY2Fubm90Q3JlYXRlUGllQ2hhcnQgPSBzZWxlY3RlZERhdGEuc29tZShyZWNvcmQgPT4gcmVjb3JkW3RoaXMuX3ZhbHVlTWVtYmVyUGF0aHNbMF1dIDw9IDApO1xyXG4gICAgICAgIGlmIChjYW5ub3RDcmVhdGVQaWVDaGFydCkge1xyXG4gICAgICAgICAgICBjaGFydHMuZGVsZXRlKENIQVJUX1RZUEUuUElFKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gQ29uZmlnIHNjYXR0ZXIgY2hhcnQgbWVtYmVyIHBhdGhzXHJcbiAgICAgICAgY29uc3QgY2FuQ3JlYXRlU2NhdHRlckNoYXJ0ID0gdGhpcy5fdmFsdWVNZW1iZXJQYXRocy5sZW5ndGggPj0gMjtcclxuICAgICAgICBjb25zdCBjYW5DcmVhdGVCdWJibGVDaGFydCA9IHRoaXMuX3ZhbHVlTWVtYmVyUGF0aHMubGVuZ3RoID49IDM7XHJcbiAgICAgICAgaWYgKCFjYW5DcmVhdGVTY2F0dGVyQ2hhcnQpIHtcclxuICAgICAgICAgICAgY2hhcnRzLmRlbGV0ZShDSEFSVF9UWVBFLlNDQVRURVJfQlVCQkxFKTtcclxuICAgICAgICAgICAgY2hhcnRzLmRlbGV0ZShDSEFSVF9UWVBFLlNDQVRURVJfTElORSk7XHJcbiAgICAgICAgICAgIGNoYXJ0cy5kZWxldGUoQ0hBUlRfVFlQRS5TQ0FUVEVSX1BPSU5UKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCFjYW5DcmVhdGVCdWJibGVDaGFydCkge1xyXG4gICAgICAgICAgICBjaGFydHMuZGVsZXRlKENIQVJUX1RZUEUuU0NBVFRFUl9CVUJCTEUpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgYXJncy5jaGFydHNBdmFpbGFiaWx0eSA9IHRoaXMuY2hhcnRUeXBlc0F2YWlsYWJpbGl0eTtcclxuICAgICAgICBhcmdzLmNoYXJ0c0ZvckNyZWF0aW9uID0gWy4uLmNoYXJ0c107XHJcbiAgICAgICAgdGhpcy5vbkNoYXJ0VHlwZXNEZXRlcm1pbmVkLmVtaXQoYXJncyk7XHJcbiAgICB9XHJcblxyXG4gICAgQE91dHB1dCgpXHJcbiAgICBwdWJsaWMgb25DaGFydFR5cGVzRGV0ZXJtaW5lZCA9IG5ldyBFdmVudEVtaXR0ZXI8SURldGVybWluZWRDaGFydFR5cGVzQXJncz4oKTtcclxuXHJcbiAgICBAT3V0cHV0KClcclxuICAgIHB1YmxpYyBvbkNoYXJ0Q3JlYXRpb25Eb25lID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcblxyXG4gICAgQElucHV0KClcclxuICAgIHB1YmxpYyB1c2VMZWdlbmQgPSB0cnVlO1xyXG5cclxuICAgIEBJbnB1dCgpXHJcbiAgICBwdWJsaWMgZGVmYXVsdExhYmVsTWVtYmVyUGF0aDogc3RyaW5nID0gdW5kZWZpbmVkO1xyXG5cclxuICAgIEBJbnB1dCgpXHJcbiAgICBwdWJsaWMgc2V0IHNjYXR0ZXJDaGFydFlBeGlzVmFsdWVNZW1iZXJQYXRoKHBhdGg6IHN0cmluZykge1xyXG4gICAgICAgIHRoaXMuX3NjYXR0ZXJDaGFydFlBeGlzVmFsdWVNZW1iZXJQYXRoID0gcGF0aDtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0IHNjYXR0ZXJDaGFydFlBeGlzVmFsdWVNZW1iZXJQYXRoKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9zY2F0dGVyQ2hhcnRZQXhpc1ZhbHVlTWVtYmVyUGF0aCAmJlxyXG4gICAgICAgICAgICB0aGlzLl92YWx1ZU1lbWJlclBhdGhzLmluZGV4T2YodGhpcy5fc2NhdHRlckNoYXJ0WUF4aXNWYWx1ZU1lbWJlclBhdGgpICE9PSAtMSA/XHJcbiAgICAgICAgICAgIHRoaXMuX3NjYXR0ZXJDaGFydFlBeGlzVmFsdWVNZW1iZXJQYXRoIDogdGhpcy5fdmFsdWVNZW1iZXJQYXRoc1swXTtcclxuICAgIH1cclxuXHJcbiAgICBASW5wdXQoKVxyXG4gICAgcHVibGljIHNldCBidWJibGVDaGFydFJhZGl1c01lbWJlclBhdGgocGF0aDogc3RyaW5nKSB7XHJcbiAgICAgICAgdGhpcy5fYnViYmxlQ2hhcnRSYWRpdXNNZW1iZXJQYXRoID0gcGF0aDtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0IGJ1YmJsZUNoYXJ0UmFkaXVzTWVtYmVyUGF0aCgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fYnViYmxlQ2hhcnRSYWRpdXNNZW1iZXJQYXRoICYmXHJcbiAgICAgICAgICAgIHRoaXMuX3ZhbHVlTWVtYmVyUGF0aHMuaW5kZXhPZih0aGlzLl9idWJibGVDaGFydFJhZGl1c01lbWJlclBhdGgpICE9PSAtMSA/XHJcbiAgICAgICAgICAgIHRoaXMuX2J1YmJsZUNoYXJ0UmFkaXVzTWVtYmVyUGF0aCA6IHRoaXMuX3ZhbHVlTWVtYmVyUGF0aHNbMV07XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBjaGFydFR5cGVzQXZhaWxhYmlsaXR5ID0gbmV3IE1hcDxDSEFSVF9UWVBFLCBib29sZWFuPigpO1xyXG4gICAgcHJpdmF0ZSBjdXN0b21DaGFydENvbXBvbmVudE9wdGlvbnMgPSBuZXcgTWFwPENIQVJUX1RZUEUsIElDaGFydENvbXBvbmVudE9wdGlvbnM+KCk7XHJcbiAgICBwcml2YXRlIGRhdGFDaGFydHMgPSBuZXcgTWFwPHN0cmluZywgVHlwZTxhbnk+PigpO1xyXG4gICAgcHJpdmF0ZSBfc2NhdHRlckNoYXJ0WUF4aXNWYWx1ZU1lbWJlclBhdGggPSB1bmRlZmluZWQ7XHJcbiAgICBwcml2YXRlIF9idWJibGVDaGFydFJhZGl1c01lbWJlclBhdGggPSB1bmRlZmluZWQ7XHJcbiAgICBwcml2YXRlIF92YWx1ZU1lbWJlclBhdGhzID0gW107XHJcbiAgICBwcml2YXRlIF9sYWJlbE1lbWJlclBhdGhzID0gW107XHJcbiAgICBwcml2YXRlIF9jaGFydERhdGE6IGFueVtdO1xyXG4gICAgcHJpdmF0ZSBfc2l6ZVNjYWxlID0gbmV3IElneFNpemVTY2FsZUNvbXBvbmVudCgpO1xyXG4gICAgcHJpdmF0ZSBfZGF0YUNoYXJ0VHlwZXMgPSBuZXcgU2V0PENIQVJUX1RZUEU+KCk7XHJcbiAgICBwcml2YXRlIGdldCBfbGFiZWxNZW1iZXJQYXRoKCk6IHN0cmluZyB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZGVmYXVsdExhYmVsTWVtYmVyUGF0aCAmJiB0aGlzLl9jaGFydERhdGEuc29tZShyID0+IHJbdGhpcy5kZWZhdWx0TGFiZWxNZW1iZXJQYXRoXSAhPT0gdW5kZWZpbmVkKSA/XHJcbiAgICAgICAgICAgIHRoaXMuZGVmYXVsdExhYmVsTWVtYmVyUGF0aCA6IHRoaXMuX2xhYmVsTWVtYmVyUGF0aHMubGVuZ3RoID4gMCA/IHRoaXMuX2xhYmVsTWVtYmVyUGF0aHNbMF0gOiAnSW5kZXgnO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgZ2V0IHBpZUNoYXJ0T3B0aW9ucygpOiBJT3B0aW9ucyB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgd2lkdGg6ICc4NSUnLFxyXG4gICAgICAgICAgICBoZWlnaHQ6ICc3NSUnLFxyXG4gICAgICAgICAgICBkYXRhU291cmNlOiB0aGlzLmNoYXJ0RGF0YSxcclxuICAgICAgICAgICAgdmFsdWVNZW1iZXJQYXRoOiB0aGlzLl92YWx1ZU1lbWJlclBhdGhzWzBdLFxyXG4gICAgICAgICAgICBsZWdlbmRMYWJlbE1lbWJlclBhdGg6IHRoaXMuX2xhYmVsTWVtYmVyUGF0aCxcclxuICAgICAgICAgICAgbGFiZWxNZW1iZXJQYXRoOiB0aGlzLl9sYWJlbE1lbWJlclBhdGgsXHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGRhdGFDaGFydFNlcmllc09wdGlvbnNNb2RlbDogSU9wdGlvbnMgPSB7XHJcbiAgICAgICAgaXNIaWdobGlnaHRpbmdFbmFibGVkOiB0cnVlLFxyXG4gICAgICAgIGFyZWFGaWxsT3BhY2l0eTogLjQsXHJcbiAgICAgICAgbWFya2VyVHlwZTogMyxcclxuICAgICAgICBzaG93RGVmYXVsdFRvb2x0aXA6IHRydWVcclxuICAgIH07XHJcblxyXG4gICAgcHJpdmF0ZSBzY2F0dGVyQ2hhcnRTZXJpZXNPcHRpb25zTW9kZWw6IElPcHRpb25zID0ge1xyXG4gICAgICAgIG1hcmtlclR5cGU6IDMsXHJcbiAgICAgICAgc2hvd0RlZmF1bHRUb29sdGlwOiB0cnVlXHJcbiAgICB9O1xyXG5cclxuICAgIHByaXZhdGUgYnViYmxlQ2hhcnRTZXJpZXNPcHRpb25zTW9kZWw6IElPcHRpb25zID0ge1xyXG4gICAgICAgIHJhZGl1c1NjYWxlOiB0aGlzLl9zaXplU2NhbGVcclxuICAgIH07XHJcblxyXG4gICAgcHJpdmF0ZSBnZXQgZGF0YUNoYXJ0T3B0aW9ucygpOiBJT3B0aW9ucyB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgd2lkdGg6ICcxMDAlJyxcclxuICAgICAgICAgICAgaGVpZ2h0OiAnODUlJyxcclxuICAgICAgICAgICAgYXV0b01hcmdpbldpZHRoOiA1MCxcclxuICAgICAgICAgICAgaXNWZXJ0aWNhbFpvb21FbmFibGVkOiB0cnVlLFxyXG4gICAgICAgICAgICBpc0hvcml6b250YWxab29tRW5hYmxlZDogdHJ1ZSxcclxuICAgICAgICAgICAgZGF0YVNvdXJjZTogdGhpcy5jaGFydERhdGFcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSBmYWN0b3J5UmVzb2x2ZXI6IENvbXBvbmVudEZhY3RvcnlSZXNvbHZlcikge1xyXG4gICAgICAgIHRoaXMuZGF0YUNoYXJ0cy5zZXQoQ0hBUlRfVFlQRS5DT0xVTU5fR1JPVVBFRCwgSWd4Q29sdW1uU2VyaWVzQ29tcG9uZW50KTtcclxuICAgICAgICB0aGlzLmRhdGFDaGFydHMuc2V0KENIQVJUX1RZUEUuQVJFQV9HUk9VUEVELCBJZ3hBcmVhU2VyaWVzQ29tcG9uZW50KTtcclxuICAgICAgICB0aGlzLmRhdGFDaGFydHMuc2V0KENIQVJUX1RZUEUuTElORV9HUk9VUEVELCBJZ3hMaW5lU2VyaWVzQ29tcG9uZW50KTtcclxuICAgICAgICB0aGlzLmRhdGFDaGFydHMuc2V0KENIQVJUX1RZUEUuQkFSX0dST1VQRUQsIElneEJhclNlcmllc0NvbXBvbmVudCk7XHJcblxyXG4gICAgICAgIHRoaXMuZGF0YUNoYXJ0cy5zZXQoQ0hBUlRfVFlQRS5DT0xVTU5fU1RBQ0tFRCwgSWd4U3RhY2tlZENvbHVtblNlcmllc0NvbXBvbmVudCk7XHJcbiAgICAgICAgdGhpcy5kYXRhQ2hhcnRzLnNldChDSEFSVF9UWVBFLkFSRUFfU1RBQ0tFRCwgSWd4U3RhY2tlZEFyZWFTZXJpZXNDb21wb25lbnQpO1xyXG4gICAgICAgIHRoaXMuZGF0YUNoYXJ0cy5zZXQoQ0hBUlRfVFlQRS5MSU5FX1NUQUNLRUQsIElneFN0YWNrZWRMaW5lU2VyaWVzQ29tcG9uZW50KTtcclxuICAgICAgICB0aGlzLmRhdGFDaGFydHMuc2V0KENIQVJUX1RZUEUuQkFSX1NUQUNLRUQsIElneFN0YWNrZWRCYXJTZXJpZXNDb21wb25lbnQpO1xyXG5cclxuICAgICAgICB0aGlzLmRhdGFDaGFydHMuc2V0KENIQVJUX1RZUEUuQ09MVU1OXzEwMF9TVEFDS0VELCBJZ3hTdGFja2VkMTAwQ29sdW1uU2VyaWVzQ29tcG9uZW50KTtcclxuICAgICAgICB0aGlzLmRhdGFDaGFydHMuc2V0KENIQVJUX1RZUEUuQVJFQV8xMDBfU1RBQ0tFRCwgSWd4U3RhY2tlZDEwMEFyZWFTZXJpZXNDb21wb25lbnQpO1xyXG4gICAgICAgIHRoaXMuZGF0YUNoYXJ0cy5zZXQoQ0hBUlRfVFlQRS5MSU5FXzEwMF9TVEFDS0VELCBJZ3hTdGFja2VkMTAwTGluZVNlcmllc0NvbXBvbmVudCk7XHJcbiAgICAgICAgdGhpcy5kYXRhQ2hhcnRzLnNldChDSEFSVF9UWVBFLkJBUl8xMDBfU1RBQ0tFRCwgSWd4U3RhY2tlZDEwMEJhclNlcmllc0NvbXBvbmVudCk7XHJcblxyXG4gICAgICAgIHRoaXMuZGF0YUNoYXJ0cy5zZXQoQ0hBUlRfVFlQRS5TQ0FUVEVSX1BPSU5ULCBJZ3hTY2F0dGVyU2VyaWVzQ29tcG9uZW50KTtcclxuICAgICAgICB0aGlzLmRhdGFDaGFydHMuc2V0KENIQVJUX1RZUEUuU0NBVFRFUl9CVUJCTEUsIElneEJ1YmJsZVNlcmllc0NvbXBvbmVudCk7XHJcbiAgICAgICAgdGhpcy5kYXRhQ2hhcnRzLnNldChDSEFSVF9UWVBFLlNDQVRURVJfTElORSwgSWd4U2NhdHRlckxpbmVTZXJpZXNDb21wb25lbnQpO1xyXG5cclxuICAgICAgICB0aGlzLmRhdGFDaGFydHMuc2V0KENIQVJUX1RZUEUuUElFLCBJZ3hQaWVDaGFydENvbXBvbmVudCk7XHJcbiAgICAgICAgY29uc3QgaXRlcmFibGUgPSB0aGlzLmRhdGFDaGFydHMua2V5cygpO1xyXG4gICAgICAgIGZvciAobGV0IGhlYWQgPSBpdGVyYWJsZS5uZXh0KCkudmFsdWU7IGhlYWQgIT09IHVuZGVmaW5lZDsgaGVhZCA9IGl0ZXJhYmxlLm5leHQoKS52YWx1ZSkge1xyXG4gICAgICAgICAgICB0aGlzLl9kYXRhQ2hhcnRUeXBlcy5hZGQoaGVhZCk7XHJcbiAgICAgICAgICAgIHRoaXMuY2hhcnRUeXBlc0F2YWlsYWJpbGl0eS5zZXQoaGVhZCwgdHJ1ZSk7XHJcbiAgICAgICAgICAgIHRoaXMuY3VzdG9tQ2hhcnRDb21wb25lbnRPcHRpb25zLnNldChoZWFkLCB7fSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRBdmFpbGFibGVDaGFydHMoKSB7XHJcbiAgICAgICAgY29uc3QgcmVzID0gW107XHJcbiAgICAgICAgdGhpcy5jaGFydFR5cGVzQXZhaWxhYmlsaXR5LmZvckVhY2goKGlzQXZhaWxhYmxlLCBjaGFydFR5cGUpID0+IHtcclxuICAgICAgICAgICAgaWYgKGlzQXZhaWxhYmxlKSB7XHJcbiAgICAgICAgICAgICAgICByZXMucHVzaChjaGFydFR5cGUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgcmV0dXJuIHJlcztcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZGlzYWJsZUNoYXJ0cyh0eXBlczogQ0hBUlRfVFlQRVtdKSB7XHJcbiAgICAgICAgdHlwZXMuZm9yRWFjaCh0eXBlID0+IHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuY2hhcnRUeXBlc0F2YWlsYWJpbGl0eS5nZXQodHlwZSkpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuY2hhcnRUeXBlc0F2YWlsYWJpbGl0eS5zZXQodHlwZSwgZmFsc2UpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGVuYWJsZUNoYXJ0cyh0eXBlczogQ0hBUlRfVFlQRVtdKSB7XHJcbiAgICAgICAgdHlwZXMuZm9yRWFjaCh0eXBlID0+IHtcclxuICAgICAgICAgICAgaWYgKCF0aGlzLmNoYXJ0VHlwZXNBdmFpbGFiaWxpdHkuZ2V0KHR5cGUpKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNoYXJ0VHlwZXNBdmFpbGFiaWxpdHkuc2V0KHR5cGUsIHRydWUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGNoYXJ0RmFjdG9yeSh0eXBlOiBDSEFSVF9UWVBFLCB2aWV3Q29udGFpbmVyUmVmOiBWaWV3Q29udGFpbmVyUmVmKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLmNoYXJ0VHlwZXNBdmFpbGFiaWxpdHkuZ2V0KHR5cGUpKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgbGV0IGNvbXBvbmVudEZhY3Rvcnk6IENvbXBvbmVudEZhY3Rvcnk8YW55PjtcclxuICAgICAgICBsZXQgY29tcG9uZW50UmVmOiBDb21wb25lbnRSZWY8YW55PjtcclxuICAgICAgICB0aGlzLl9zaXplU2NhbGUubWF4aW11bVZhbHVlID0gNjA7XHJcbiAgICAgICAgdGhpcy5fc2l6ZVNjYWxlLm1pbmltdW1WYWx1ZSA9IDEwO1xyXG4gICAgICAgIGNvbnN0IGNoYXJ0VHlwZSA9IHRoaXMuZGF0YUNoYXJ0cy5nZXQodHlwZSk7XHJcblxyXG4gICAgICAgIGlmICh0eXBlID09PSBDSEFSVF9UWVBFLlBJRSkge1xyXG4gICAgICAgICAgICBjb21wb25lbnRGYWN0b3J5ID0gdGhpcy5mYWN0b3J5UmVzb2x2ZXIucmVzb2x2ZUNvbXBvbmVudEZhY3RvcnkoSWd4UGllQ2hhcnRDb21wb25lbnQpO1xyXG4gICAgICAgICAgICBjb21wb25lbnRSZWYgPSB2aWV3Q29udGFpbmVyUmVmLmNyZWF0ZUNvbXBvbmVudChjb21wb25lbnRGYWN0b3J5KTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBjb21wb25lbnRGYWN0b3J5ID0gdGhpcy5mYWN0b3J5UmVzb2x2ZXIucmVzb2x2ZUNvbXBvbmVudEZhY3RvcnkoSWd4RGF0YUNoYXJ0Q29tcG9uZW50KTtcclxuICAgICAgICAgICAgY29tcG9uZW50UmVmID0gdmlld0NvbnRhaW5lclJlZi5jcmVhdGVDb21wb25lbnQoY29tcG9uZW50RmFjdG9yeSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IG9wdGlvbnM6IElDaGFydENvbXBvbmVudE9wdGlvbnMgPSB0aGlzLmdldENoYXJ0T3B0aW9ucyh0eXBlKTtcclxuICAgICAgICBjb25zdCBpbml0aWFsaXplcjogQ2hhcnRJbml0aWFsaXplciA9IHRoaXMuZ2V0SW5pdGlhbGl6ZXIodHlwZSwgY2hhcnRUeXBlKTtcclxuICAgICAgICBpZiAodGhpcy51c2VMZWdlbmQpIHtcclxuICAgICAgICAgICAgY29uc3QgbGVnZW5kVHlwZSA9IHR5cGUgPT09IENIQVJUX1RZUEUuUElFID8gSWd4SXRlbUxlZ2VuZENvbXBvbmVudCA6IElneExlZ2VuZENvbXBvbmVudDtcclxuICAgICAgICAgICAgY29uc3QgbGVnZW5kRmFjdG9yeSA9IHRoaXMuZmFjdG9yeVJlc29sdmVyLnJlc29sdmVDb21wb25lbnRGYWN0b3J5KGxlZ2VuZFR5cGUgYXMgYW55KTtcclxuICAgICAgICAgICAgY29uc3QgbGVnZW5kQ29tcG9uZW50UmVmOiBDb21wb25lbnRSZWY8YW55PiA9IHZpZXdDb250YWluZXJSZWYuY3JlYXRlQ29tcG9uZW50KGxlZ2VuZEZhY3RvcnkpO1xyXG4gICAgICAgICAgICBvcHRpb25zLmNoYXJ0T3B0aW9uc1snbGVnZW5kJ10gPSBsZWdlbmRDb21wb25lbnRSZWYuaW5zdGFuY2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGNoYXJ0ID0gaW5pdGlhbGl6ZXIuaW5pdENoYXJ0KGNvbXBvbmVudFJlZi5pbnN0YW5jZSwgb3B0aW9ucyk7XHJcbiAgICAgICAgdGhpcy5vbkNoYXJ0Q3JlYXRpb25Eb25lLmVtaXQoY2hhcnQpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgZ2V0SW5pdGlhbGl6ZXIoY2hhcnRUeXBlOiBDSEFSVF9UWVBFLCBjb21wb25lbnRDbGFzc1JlZik6IENoYXJ0SW5pdGlhbGl6ZXIge1xyXG4gICAgICAgIGlmIChjaGFydFR5cGUuaW5jbHVkZXMoJ1BpZScpKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBuZXcgSWd4UGllQ2hhcnRJbml0aWFsaXplcigpO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoY2hhcnRUeXBlLmluY2x1ZGVzKCdTdGFja2VkJykpIHtcclxuICAgICAgICAgICAgcmV0dXJuIG5ldyBJZ3hTdGFja2VkRGF0YUNoYXJ0SW5pdGlhbGl6ZXIoY29tcG9uZW50Q2xhc3NSZWYpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiBuZXcgSWd4RGF0YUNoYXJ0SW5pdGlhbGl6ZXIoY29tcG9uZW50Q2xhc3NSZWYpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGdldENoYXJ0T3B0aW9ucyh0eXBlOiBDSEFSVF9UWVBFKTogSUNoYXJ0Q29tcG9uZW50T3B0aW9ucyB7XHJcbiAgICAgICAgY29uc3QgY2hhcnRDb21wb25lbnRPcHRpb25zOiBJQ2hhcnRDb21wb25lbnRPcHRpb25zID0ge307XHJcbiAgICAgICAgcmV0dXJuIHR5cGUgPT09IENIQVJUX1RZUEUuUElFID8gdGhpcy5hZGRQaWVDaGFydERhdGFPcHRpb25zKGNoYXJ0Q29tcG9uZW50T3B0aW9ucykgOlxyXG4gICAgICAgICAgICB0aGlzLmFkZERhdGFDaGFydERhdGFPcHRpb25zKHR5cGUsIGNoYXJ0Q29tcG9uZW50T3B0aW9ucywgdHlwZS5pbmNsdWRlcygnU3RhY2tlZCcpKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGFkZFBpZUNoYXJ0RGF0YU9wdGlvbnMoY2hhcnRDb21wb25lbnRPcHRpb25zOiBJQ2hhcnRDb21wb25lbnRPcHRpb25zKSB7XHJcbiAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBtYXgtbGluZS1sZW5ndGhcclxuICAgICAgICBjaGFydENvbXBvbmVudE9wdGlvbnMuY2hhcnRPcHRpb25zID0gT2JqZWN0LmFzc2lnbih0aGlzLnBpZUNoYXJ0T3B0aW9ucywgdGhpcy5jdXN0b21DaGFydENvbXBvbmVudE9wdGlvbnMuZ2V0KENIQVJUX1RZUEUuUElFKS5jaGFydE9wdGlvbnMpO1xyXG4gICAgICAgIHJldHVybiBjaGFydENvbXBvbmVudE9wdGlvbnM7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBhZGREYXRhQ2hhcnREYXRhT3B0aW9ucyh0eXBlOiBDSEFSVF9UWVBFLCBjaGFydENvbXBvbmVudE9wdGlvbnM6IElDaGFydENvbXBvbmVudE9wdGlvbnMsIHN0YWNrZWQ6IGJvb2xlYW4pIHtcclxuICAgICAgICBjaGFydENvbXBvbmVudE9wdGlvbnMuY2hhcnRPcHRpb25zID0gT2JqZWN0LmFzc2lnbih0aGlzLmRhdGFDaGFydE9wdGlvbnMsIHRoaXMuY3VzdG9tQ2hhcnRDb21wb25lbnRPcHRpb25zLmdldCh0eXBlKSk7XHJcbiAgICAgICAgaWYgKHR5cGUuaW5kZXhPZignU2NhdHRlcicpICE9PSAtMSkge1xyXG4gICAgICAgICAgICB0aGlzLmFkZFNjYXR0ZXJDaGFydERhdGFPcHRpb25zKHR5cGUsIGNoYXJ0Q29tcG9uZW50T3B0aW9ucyk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBtYXgtbGluZS1sZW5ndGhcclxuICAgICAgICAgICAgY2hhcnRDb21wb25lbnRPcHRpb25zLnNlcmllc01vZGVsID0gT2JqZWN0LmFzc2lnbih0aGlzLmRhdGFDaGFydFNlcmllc09wdGlvbnNNb2RlbCwgdGhpcy5jdXN0b21DaGFydENvbXBvbmVudE9wdGlvbnMuZ2V0KHR5cGUpLnNlcmllc01vZGVsKTtcclxuICAgICAgICAgICAgdGhpcy5zZXRBeGlzTGFiZWxPcHRpb24odHlwZSwgY2hhcnRDb21wb25lbnRPcHRpb25zKTtcclxuICAgICAgICAgICAgY29uc3Qgb3B0aW9uczogSU9wdGlvbnNbXSA9IFtdO1xyXG4gICAgICAgICAgICB0aGlzLl92YWx1ZU1lbWJlclBhdGhzLmZvckVhY2godmFsdWVNZW1iZXJQYXRoID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGRhdGFPcHRpb25zID0ge1xyXG4gICAgICAgICAgICAgICAgICAgIHRpdGxlOiB2YWx1ZU1lbWJlclBhdGgsXHJcbiAgICAgICAgICAgICAgICAgICAgdmFsdWVNZW1iZXJQYXRoXHJcbiAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgICAgaWYgKHN0YWNrZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnB1c2goeyAuLi5kYXRhT3B0aW9ucyB9KTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5wdXNoKHsgLi4uZGF0YU9wdGlvbnMsIC4uLmNoYXJ0Q29tcG9uZW50T3B0aW9ucy5zZXJpZXNNb2RlbCB9KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIHN0YWNrZWQgPyBjaGFydENvbXBvbmVudE9wdGlvbnMuc3RhY2tlZEZyYWdtZW50T3B0aW9ucyA9IG9wdGlvbnMgOlxyXG4gICAgICAgICAgICBjaGFydENvbXBvbmVudE9wdGlvbnMuc2VyaWVzT3B0aW9ucyA9IG9wdGlvbnM7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBjaGFydENvbXBvbmVudE9wdGlvbnM7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBhZGRTY2F0dGVyQ2hhcnREYXRhT3B0aW9ucyhzY2F0dGVyQ2hhcnQ6IENIQVJUX1RZUEUsIGNoYXJ0Q29tcG9uZW50T3B0aW9uczogSUNoYXJ0Q29tcG9uZW50T3B0aW9ucykge1xyXG4gICAgICAgICAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBtYXgtbGluZS1sZW5ndGhcclxuICAgICAgICBjaGFydENvbXBvbmVudE9wdGlvbnMuc2VyaWVzTW9kZWwgPSBPYmplY3QuYXNzaWduKHRoaXMuc2NhdHRlckNoYXJ0U2VyaWVzT3B0aW9uc01vZGVsLCB0aGlzLmN1c3RvbUNoYXJ0Q29tcG9uZW50T3B0aW9ucy5nZXQoc2NhdHRlckNoYXJ0KS5zZXJpZXNNb2RlbCk7XHJcbiAgICAgICAgY2hhcnRDb21wb25lbnRPcHRpb25zLnNlcmllc01vZGVsWyd5TWVtYmVyUGF0aCddID0gdGhpcy5zY2F0dGVyQ2hhcnRZQXhpc1ZhbHVlTWVtYmVyUGF0aDtcclxuICAgICAgICBpZiAoc2NhdHRlckNoYXJ0ID09PSBDSEFSVF9UWVBFLlNDQVRURVJfQlVCQkxFKSB7XHJcbiAgICAgICAgICAgIGNoYXJ0Q29tcG9uZW50T3B0aW9ucy5zZXJpZXNNb2RlbCA9IE9iamVjdC5hc3NpZ24oY2hhcnRDb21wb25lbnRPcHRpb25zLnNlcmllc01vZGVsLCB0aGlzLmJ1YmJsZUNoYXJ0U2VyaWVzT3B0aW9uc01vZGVsKTtcclxuICAgICAgICAgICAgY2hhcnRDb21wb25lbnRPcHRpb25zLnNlcmllc01vZGVsWydyYWRpdXNNZW1iZXJQYXRoJ10gPSB0aGlzLmJ1YmJsZUNoYXJ0UmFkaXVzTWVtYmVyUGF0aDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IG1vZGVsID0gY2hhcnRDb21wb25lbnRPcHRpb25zLnNlcmllc01vZGVsO1xyXG4gICAgICAgIGNvbnN0IHNlcmllc09wdGlvbnM6IElPcHRpb25zW10gPSBbXTtcclxuICAgICAgICB0aGlzLl92YWx1ZU1lbWJlclBhdGhzLmZpbHRlcih2ID0+ICEodiA9PT0gbW9kZWxbJ3lNZW1iZXJQYXRoJ10gfHxcclxuICAgICAgICAgICAgdiA9PT0gbW9kZWxbJ3JhZGl1c01lbWJlclBhdGgnXSkpLmZvckVhY2godmFsdWVNZW1iZXJQYXRoID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGRhdGFPcHRpb25zID0ge1xyXG4gICAgICAgICAgICAgICAgICAgIHRpdGxlOiBgJHttb2RlbFsneU1lbWJlclBhdGgnXX0gdnMgJHt2YWx1ZU1lbWJlclBhdGh9YCxcclxuICAgICAgICAgICAgICAgICAgICB4TWVtYmVyUGF0aDogdmFsdWVNZW1iZXJQYXRoLFxyXG4gICAgICAgICAgICAgICAgICAgIGxhYmVsTWVtYmVyUGF0aDogdGhpcy5fbGFiZWxNZW1iZXJQYXRoXHJcbiAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgICAgc2VyaWVzT3B0aW9ucy5wdXNoKHsgLi4uZGF0YU9wdGlvbnMsIC4uLm1vZGVsIH0pO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICBjaGFydENvbXBvbmVudE9wdGlvbnMuc2VyaWVzT3B0aW9ucyA9IHNlcmllc09wdGlvbnM7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBhZGRJbmRleE1lbWJlclBhdGgoZGF0YVJlY29yZCwgaW5kZXgpIHtcclxuICAgICAgICBkYXRhUmVjb3JkID0geyAuLi57IFt0aGlzLl9sYWJlbE1lbWJlclBhdGhdOiBpbmRleCB9LCAuLi5kYXRhUmVjb3JkIH07XHJcbiAgICAgICAgcmV0dXJuIGRhdGFSZWNvcmQ7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBzZXRBeGlzTGFiZWxPcHRpb24odHlwZTogQ0hBUlRfVFlQRSwgb3B0aW9uczogSUNoYXJ0Q29tcG9uZW50T3B0aW9ucykge1xyXG4gICAgICAgIGlmICh0eXBlLmluZGV4T2YoJ0JhcicpICE9PSAtMSkge1xyXG4gICAgICAgICAgICBvcHRpb25zLnlBeGlzT3B0aW9ucyA9IE9iamVjdC5hc3NpZ24oe1xyXG4gICAgICAgICAgICAgICAgbGFiZWw6IHRoaXMuX2xhYmVsTWVtYmVyUGF0aFxyXG4gICAgICAgICAgICB9LCB0aGlzLmN1c3RvbUNoYXJ0Q29tcG9uZW50T3B0aW9ucy5nZXQodHlwZSkueUF4aXNPcHRpb25zKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBvcHRpb25zLnhBeGlzT3B0aW9ucyA9IE9iamVjdC5hc3NpZ24oe1xyXG4gICAgICAgICAgICAgICAgbGFiZWw6IHRoaXMuX2xhYmVsTWVtYmVyUGF0aFxyXG4gICAgICAgICAgICB9LCB0aGlzLmN1c3RvbUNoYXJ0Q29tcG9uZW50T3B0aW9ucy5nZXQodHlwZSkueEF4aXNPcHRpb25zKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHNldENoYXJ0Q29tcG9uZW50T3B0aW9ucyhjaGFydDogQ0hBUlRfVFlQRSwgb3B0aW9uc1R5cGU6IE9QVElPTlNfVFlQRSwgb3B0aW9uczogSU9wdGlvbnMpIHtcclxuICAgICAgICBpZiAoIXRoaXMuY3VzdG9tQ2hhcnRDb21wb25lbnRPcHRpb25zLmdldChjaGFydClbb3B0aW9uc1R5cGVdKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY3VzdG9tQ2hhcnRDb21wb25lbnRPcHRpb25zLmdldChjaGFydClbb3B0aW9uc1R5cGVdID0ge307XHJcbiAgICAgICAgfVxyXG4gICAgICAgIE9iamVjdC5rZXlzKG9wdGlvbnMpLmZvckVhY2gocHJvcGVydHkgPT4ge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jdXN0b21DaGFydENvbXBvbmVudE9wdGlvbnMuZ2V0KGNoYXJ0KVtvcHRpb25zVHlwZV1bcHJvcGVydHldID0gb3B0aW9uc1twcm9wZXJ0eV07XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG59XHJcbiJdfQ==
1
+ import { Directive, EventEmitter, Input, Output } from '@angular/core';
2
+ import { IgxAreaSeriesComponent, IgxBarSeriesComponent, IgxBubbleSeriesComponent, IgxColumnSeriesComponent, IgxDataChartComponent, IgxItemLegendComponent, IgxLegendComponent, IgxLineSeriesComponent, IgxPieChartComponent, IgxScatterLineSeriesComponent, IgxScatterSeriesComponent, IgxSizeScaleComponent, IgxStacked100AreaSeriesComponent, IgxStacked100BarSeriesComponent, IgxStacked100ColumnSeriesComponent, IgxStacked100LineSeriesComponent, IgxStackedAreaSeriesComponent, IgxStackedBarSeriesComponent, IgxStackedColumnSeriesComponent, IgxStackedLineSeriesComponent } from 'igniteui-angular-charts';
3
+ import { CHART_TYPE } from './chart-types';
4
+ import { IgxDataChartInitializer, IgxPieChartInitializer, IgxStackedDataChartInitializer } from './initializers';
5
+ import * as i0 from "@angular/core";
6
+ export class IgxChartIntegrationDirective {
7
+ get chartData() {
8
+ return this._chartData;
9
+ }
10
+ set chartData(selectedData) {
11
+ const charts = new Set(this._dataChartTypes);
12
+ const dataModel = selectedData.length ? selectedData[0] : {};
13
+ this._labelMemberPaths = Object.keys(dataModel).filter(key => typeof dataModel[key] === 'string');
14
+ this._valueMemberPaths = Object.keys(dataModel).filter(key => typeof dataModel[key] === 'number');
15
+ this._chartData = selectedData.map((dataRecord, index) => this.addIndexMemberPath(dataRecord, index + 1));
16
+ const args = {
17
+ chartsAvailabilty: new Map(),
18
+ chartsForCreation: []
19
+ };
20
+ if (selectedData.length === 0 || this._valueMemberPaths.length === 0) {
21
+ this.onChartTypesDetermined.emit(args);
22
+ return;
23
+ }
24
+ if (selectedData.length === 1) {
25
+ charts.forEach((chart, _, set) => {
26
+ const isColumnChart = chart.indexOf('Column') !== -1;
27
+ const isBarChart = chart.indexOf('Bar') !== -1;
28
+ const isPieChart = chart.indexOf('Pie') !== -1;
29
+ if (!(isColumnChart || isBarChart || isPieChart)) {
30
+ set.delete(chart);
31
+ }
32
+ });
33
+ }
34
+ // Config pie chart
35
+ const cannotCreatePieChart = selectedData.some(record => record[this._valueMemberPaths[0]] <= 0);
36
+ if (cannotCreatePieChart) {
37
+ charts.delete(CHART_TYPE.PIE);
38
+ }
39
+ // Config scatter chart member paths
40
+ const canCreateScatterChart = this._valueMemberPaths.length >= 2;
41
+ const canCreateBubbleChart = this._valueMemberPaths.length >= 3;
42
+ if (!canCreateScatterChart) {
43
+ charts.delete(CHART_TYPE.SCATTER_BUBBLE);
44
+ charts.delete(CHART_TYPE.SCATTER_LINE);
45
+ charts.delete(CHART_TYPE.SCATTER_POINT);
46
+ }
47
+ if (!canCreateBubbleChart) {
48
+ charts.delete(CHART_TYPE.SCATTER_BUBBLE);
49
+ }
50
+ args.chartsAvailabilty = this.chartTypesAvailability;
51
+ args.chartsForCreation = [...charts];
52
+ this.onChartTypesDetermined.emit(args);
53
+ }
54
+ set scatterChartYAxisValueMemberPath(path) {
55
+ this._scatterChartYAxisValueMemberPath = path;
56
+ }
57
+ get scatterChartYAxisValueMemberPath() {
58
+ return this._scatterChartYAxisValueMemberPath &&
59
+ this._valueMemberPaths.indexOf(this._scatterChartYAxisValueMemberPath) !== -1 ?
60
+ this._scatterChartYAxisValueMemberPath : this._valueMemberPaths[0];
61
+ }
62
+ set bubbleChartRadiusMemberPath(path) {
63
+ this._bubbleChartRadiusMemberPath = path;
64
+ }
65
+ get bubbleChartRadiusMemberPath() {
66
+ return this._bubbleChartRadiusMemberPath &&
67
+ this._valueMemberPaths.indexOf(this._bubbleChartRadiusMemberPath) !== -1 ?
68
+ this._bubbleChartRadiusMemberPath : this._valueMemberPaths[1];
69
+ }
70
+ get _labelMemberPath() {
71
+ return this.defaultLabelMemberPath && this._chartData.some(r => r[this.defaultLabelMemberPath] !== undefined) ?
72
+ this.defaultLabelMemberPath : this._labelMemberPaths.length > 0 ? this._labelMemberPaths[0] : 'Index';
73
+ }
74
+ get pieChartOptions() {
75
+ return {
76
+ width: '85%',
77
+ height: '75%',
78
+ dataSource: this.chartData,
79
+ valueMemberPath: this._valueMemberPaths[0],
80
+ legendLabelMemberPath: this._labelMemberPath,
81
+ labelMemberPath: this._labelMemberPath,
82
+ };
83
+ }
84
+ get dataChartOptions() {
85
+ return {
86
+ width: '100%',
87
+ height: '85%',
88
+ autoMarginWidth: 50,
89
+ isVerticalZoomEnabled: true,
90
+ isHorizontalZoomEnabled: true,
91
+ dataSource: this.chartData
92
+ };
93
+ }
94
+ constructor(factoryResolver) {
95
+ this.factoryResolver = factoryResolver;
96
+ this.onChartTypesDetermined = new EventEmitter();
97
+ this.onChartCreationDone = new EventEmitter();
98
+ this.useLegend = true;
99
+ this.defaultLabelMemberPath = undefined;
100
+ this.chartTypesAvailability = new Map();
101
+ this.customChartComponentOptions = new Map();
102
+ this.dataCharts = new Map();
103
+ this._scatterChartYAxisValueMemberPath = undefined;
104
+ this._bubbleChartRadiusMemberPath = undefined;
105
+ this._valueMemberPaths = [];
106
+ this._labelMemberPaths = [];
107
+ this._sizeScale = new IgxSizeScaleComponent();
108
+ this._dataChartTypes = new Set();
109
+ this.dataChartSeriesOptionsModel = {
110
+ isHighlightingEnabled: true,
111
+ areaFillOpacity: .4,
112
+ markerType: 3,
113
+ showDefaultTooltip: true
114
+ };
115
+ this.scatterChartSeriesOptionsModel = {
116
+ markerType: 3,
117
+ showDefaultTooltip: true
118
+ };
119
+ this.bubbleChartSeriesOptionsModel = {
120
+ radiusScale: this._sizeScale
121
+ };
122
+ this.dataCharts.set(CHART_TYPE.COLUMN_GROUPED, IgxColumnSeriesComponent);
123
+ this.dataCharts.set(CHART_TYPE.AREA_GROUPED, IgxAreaSeriesComponent);
124
+ this.dataCharts.set(CHART_TYPE.LINE_GROUPED, IgxLineSeriesComponent);
125
+ this.dataCharts.set(CHART_TYPE.BAR_GROUPED, IgxBarSeriesComponent);
126
+ this.dataCharts.set(CHART_TYPE.COLUMN_STACKED, IgxStackedColumnSeriesComponent);
127
+ this.dataCharts.set(CHART_TYPE.AREA_STACKED, IgxStackedAreaSeriesComponent);
128
+ this.dataCharts.set(CHART_TYPE.LINE_STACKED, IgxStackedLineSeriesComponent);
129
+ this.dataCharts.set(CHART_TYPE.BAR_STACKED, IgxStackedBarSeriesComponent);
130
+ this.dataCharts.set(CHART_TYPE.COLUMN_100_STACKED, IgxStacked100ColumnSeriesComponent);
131
+ this.dataCharts.set(CHART_TYPE.AREA_100_STACKED, IgxStacked100AreaSeriesComponent);
132
+ this.dataCharts.set(CHART_TYPE.LINE_100_STACKED, IgxStacked100LineSeriesComponent);
133
+ this.dataCharts.set(CHART_TYPE.BAR_100_STACKED, IgxStacked100BarSeriesComponent);
134
+ this.dataCharts.set(CHART_TYPE.SCATTER_POINT, IgxScatterSeriesComponent);
135
+ this.dataCharts.set(CHART_TYPE.SCATTER_BUBBLE, IgxBubbleSeriesComponent);
136
+ this.dataCharts.set(CHART_TYPE.SCATTER_LINE, IgxScatterLineSeriesComponent);
137
+ this.dataCharts.set(CHART_TYPE.PIE, IgxPieChartComponent);
138
+ const iterable = this.dataCharts.keys();
139
+ for (let head = iterable.next().value; head !== undefined; head = iterable.next().value) {
140
+ this._dataChartTypes.add(head);
141
+ this.chartTypesAvailability.set(head, true);
142
+ this.customChartComponentOptions.set(head, {});
143
+ }
144
+ }
145
+ getAvailableCharts() {
146
+ const res = [];
147
+ this.chartTypesAvailability.forEach((isAvailable, chartType) => {
148
+ if (isAvailable) {
149
+ res.push(chartType);
150
+ }
151
+ });
152
+ return res;
153
+ }
154
+ disableCharts(types) {
155
+ types.forEach(type => {
156
+ if (this.chartTypesAvailability.get(type)) {
157
+ this.chartTypesAvailability.set(type, false);
158
+ }
159
+ });
160
+ }
161
+ enableCharts(types) {
162
+ types.forEach(type => {
163
+ if (!this.chartTypesAvailability.get(type)) {
164
+ this.chartTypesAvailability.set(type, true);
165
+ }
166
+ });
167
+ }
168
+ chartFactory(type, viewContainerRef) {
169
+ if (!this.chartTypesAvailability.get(type)) {
170
+ return;
171
+ }
172
+ let componentFactory;
173
+ let componentRef;
174
+ this._sizeScale.maximumValue = 60;
175
+ this._sizeScale.minimumValue = 10;
176
+ const chartType = this.dataCharts.get(type);
177
+ if (type === CHART_TYPE.PIE) {
178
+ componentFactory = this.factoryResolver.resolveComponentFactory(IgxPieChartComponent);
179
+ componentRef = viewContainerRef.createComponent(componentFactory);
180
+ }
181
+ else {
182
+ componentFactory = this.factoryResolver.resolveComponentFactory(IgxDataChartComponent);
183
+ componentRef = viewContainerRef.createComponent(componentFactory);
184
+ }
185
+ const options = this.getChartOptions(type);
186
+ const initializer = this.getInitializer(type, chartType);
187
+ if (this.useLegend) {
188
+ const legendType = type === CHART_TYPE.PIE ? IgxItemLegendComponent : IgxLegendComponent;
189
+ const legendFactory = this.factoryResolver.resolveComponentFactory(legendType);
190
+ const legendComponentRef = viewContainerRef.createComponent(legendFactory);
191
+ options.chartOptions['legend'] = legendComponentRef.instance;
192
+ }
193
+ const chart = initializer.initChart(componentRef.instance, options);
194
+ this.onChartCreationDone.emit(chart);
195
+ }
196
+ getInitializer(chartType, componentClassRef) {
197
+ if (chartType.includes('Pie')) {
198
+ return new IgxPieChartInitializer();
199
+ }
200
+ else if (chartType.includes('Stacked')) {
201
+ return new IgxStackedDataChartInitializer(componentClassRef);
202
+ }
203
+ else {
204
+ return new IgxDataChartInitializer(componentClassRef);
205
+ }
206
+ }
207
+ getChartOptions(type) {
208
+ const chartComponentOptions = {};
209
+ return type === CHART_TYPE.PIE ? this.addPieChartDataOptions(chartComponentOptions) :
210
+ this.addDataChartDataOptions(type, chartComponentOptions, type.includes('Stacked'));
211
+ }
212
+ addPieChartDataOptions(chartComponentOptions) {
213
+ // tslint:disable-next-line: max-line-length
214
+ chartComponentOptions.chartOptions = Object.assign(this.pieChartOptions, this.customChartComponentOptions.get(CHART_TYPE.PIE).chartOptions);
215
+ return chartComponentOptions;
216
+ }
217
+ addDataChartDataOptions(type, chartComponentOptions, stacked) {
218
+ chartComponentOptions.chartOptions = Object.assign(this.dataChartOptions, this.customChartComponentOptions.get(type));
219
+ if (type.indexOf('Scatter') !== -1) {
220
+ this.addScatterChartDataOptions(type, chartComponentOptions);
221
+ }
222
+ else {
223
+ // tslint:disable-next-line: max-line-length
224
+ chartComponentOptions.seriesModel = Object.assign(this.dataChartSeriesOptionsModel, this.customChartComponentOptions.get(type).seriesModel);
225
+ this.setAxisLabelOption(type, chartComponentOptions);
226
+ const options = [];
227
+ this._valueMemberPaths.forEach(valueMemberPath => {
228
+ const dataOptions = {
229
+ title: valueMemberPath,
230
+ valueMemberPath
231
+ };
232
+ if (stacked) {
233
+ options.push({ ...dataOptions });
234
+ }
235
+ else {
236
+ options.push({ ...dataOptions, ...chartComponentOptions.seriesModel });
237
+ }
238
+ });
239
+ stacked ? chartComponentOptions.stackedFragmentOptions = options :
240
+ chartComponentOptions.seriesOptions = options;
241
+ }
242
+ return chartComponentOptions;
243
+ }
244
+ addScatterChartDataOptions(scatterChart, chartComponentOptions) {
245
+ // tslint:disable-next-line: max-line-length
246
+ chartComponentOptions.seriesModel = Object.assign(this.scatterChartSeriesOptionsModel, this.customChartComponentOptions.get(scatterChart).seriesModel);
247
+ chartComponentOptions.seriesModel['yMemberPath'] = this.scatterChartYAxisValueMemberPath;
248
+ if (scatterChart === CHART_TYPE.SCATTER_BUBBLE) {
249
+ chartComponentOptions.seriesModel = Object.assign(chartComponentOptions.seriesModel, this.bubbleChartSeriesOptionsModel);
250
+ chartComponentOptions.seriesModel['radiusMemberPath'] = this.bubbleChartRadiusMemberPath;
251
+ }
252
+ const model = chartComponentOptions.seriesModel;
253
+ const seriesOptions = [];
254
+ this._valueMemberPaths.filter(v => !(v === model['yMemberPath'] ||
255
+ v === model['radiusMemberPath'])).forEach(valueMemberPath => {
256
+ const dataOptions = {
257
+ title: `${model['yMemberPath']} vs ${valueMemberPath}`,
258
+ xMemberPath: valueMemberPath,
259
+ labelMemberPath: this._labelMemberPath
260
+ };
261
+ seriesOptions.push({ ...dataOptions, ...model });
262
+ });
263
+ chartComponentOptions.seriesOptions = seriesOptions;
264
+ }
265
+ addIndexMemberPath(dataRecord, index) {
266
+ dataRecord = { ...{ [this._labelMemberPath]: index }, ...dataRecord };
267
+ return dataRecord;
268
+ }
269
+ setAxisLabelOption(type, options) {
270
+ if (type.indexOf('Bar') !== -1) {
271
+ options.yAxisOptions = Object.assign({
272
+ label: this._labelMemberPath
273
+ }, this.customChartComponentOptions.get(type).yAxisOptions);
274
+ }
275
+ else {
276
+ options.xAxisOptions = Object.assign({
277
+ label: this._labelMemberPath
278
+ }, this.customChartComponentOptions.get(type).xAxisOptions);
279
+ }
280
+ }
281
+ setChartComponentOptions(chart, optionsType, options) {
282
+ if (!this.customChartComponentOptions.get(chart)[optionsType]) {
283
+ this.customChartComponentOptions.get(chart)[optionsType] = {};
284
+ }
285
+ Object.keys(options).forEach(property => {
286
+ this.customChartComponentOptions.get(chart)[optionsType][property] = options[property];
287
+ });
288
+ }
289
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.0", ngImport: i0, type: IgxChartIntegrationDirective, deps: [{ token: i0.ComponentFactoryResolver }], target: i0.ɵɵFactoryTarget.Directive }); }
290
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "17.0.0", type: IgxChartIntegrationDirective, selector: "[igxChartIntegration]", inputs: { chartData: "chartData", useLegend: "useLegend", defaultLabelMemberPath: "defaultLabelMemberPath", scatterChartYAxisValueMemberPath: "scatterChartYAxisValueMemberPath", bubbleChartRadiusMemberPath: "bubbleChartRadiusMemberPath" }, outputs: { onChartTypesDetermined: "onChartTypesDetermined", onChartCreationDone: "onChartCreationDone" }, ngImport: i0 }); }
291
+ }
292
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.0", ngImport: i0, type: IgxChartIntegrationDirective, decorators: [{
293
+ type: Directive,
294
+ args: [{
295
+ selector: '[igxChartIntegration]'
296
+ }]
297
+ }], ctorParameters: () => [{ type: i0.ComponentFactoryResolver }], propDecorators: { chartData: [{
298
+ type: Input
299
+ }], onChartTypesDetermined: [{
300
+ type: Output
301
+ }], onChartCreationDone: [{
302
+ type: Output
303
+ }], useLegend: [{
304
+ type: Input
305
+ }], defaultLabelMemberPath: [{
306
+ type: Input
307
+ }], scatterChartYAxisValueMemberPath: [{
308
+ type: Input
309
+ }], bubbleChartRadiusMemberPath: [{
310
+ type: Input
311
+ }] } });
312
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhcnQtaW50ZWdyYXRpb24uZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvaWduaXRldWktYW5ndWxhci1leHRyYXMvc3JjL2xpYi9kaXJlY3RpdmVzL2NoYXJ0LWludGVncmF0aW9uL2NoYXJ0LWludGVncmF0aW9uLmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQTRELFNBQVMsRUFDeEUsWUFBWSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQTBCLE1BQU0sZUFBZSxDQUFDO0FBQy9FLE9BQU8sRUFDSCxzQkFBc0IsRUFBRSxxQkFBcUIsRUFBRSx3QkFBd0IsRUFBRSx3QkFBd0IsRUFDakcscUJBQXFCLEVBQUUsc0JBQXNCLEVBQUUsa0JBQWtCLEVBQUUsc0JBQXNCLEVBQUUsb0JBQW9CLEVBQy9HLDZCQUE2QixFQUFFLHlCQUF5QixFQUFFLHFCQUFxQixFQUFFLGdDQUFnQyxFQUNqSCwrQkFBK0IsRUFBRSxrQ0FBa0MsRUFBRSxnQ0FBZ0MsRUFDckcsNkJBQTZCLEVBQUUsNEJBQTRCLEVBQUUsK0JBQStCLEVBQzVGLDZCQUE2QixFQUNoQyxNQUFNLHlCQUF5QixDQUFDO0FBQ2pDLE9BQU8sRUFBRSxVQUFVLEVBQWdCLE1BQU0sZUFBZSxDQUFDO0FBQ3pELE9BQU8sRUFBNEMsdUJBQXVCLEVBQ3RFLHNCQUFzQixFQUFFLDhCQUE4QixFQUFZLE1BQU0sZ0JBQWdCLENBQUM7O0FBVTdGLE1BQU0sT0FBTyw0QkFBNEI7SUFDckMsSUFDVyxTQUFTO1FBQ2hCLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQztJQUMzQixDQUFDO0lBRUQsSUFBVyxTQUFTLENBQUMsWUFBbUI7UUFDcEMsTUFBTSxNQUFNLEdBQUcsSUFBSSxHQUFHLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDO1FBQzdDLE1BQU0sU0FBUyxHQUFHLFlBQVksQ0FBQyxNQUFNLENBQUMs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LENBQUMsSUFBSSxDQUFDLDJCQUEyQixDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxXQUFXLENBQUMsRUFBRTtZQUMzRCxJQUFJLENBQUMsMkJBQTJCLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLFdBQVcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztTQUNqRTtRQUNELE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxFQUFFO1lBQ2hDLElBQUksQ0FBQywyQkFBMkIsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsUUFBUSxDQUFDLEdBQUcsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQy9GLENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQzs4R0E5VFEsNEJBQTRCO2tHQUE1Qiw0QkFBNEI7OzJGQUE1Qiw0QkFBNEI7a0JBSHhDLFNBQVM7bUJBQUM7b0JBQ1AsUUFBUSxFQUFFLHVCQUF1QjtpQkFDcEM7NkZBR2MsU0FBUztzQkFEbkIsS0FBSztnQkFxREMsc0JBQXNCO3NCQUQ1QixNQUFNO2dCQUlBLG1CQUFtQjtzQkFEekIsTUFBTTtnQkFJQSxTQUFTO3NCQURmLEtBQUs7Z0JBSUMsc0JBQXNCO3NCQUQ1QixLQUFLO2dCQUlLLGdDQUFnQztzQkFEMUMsS0FBSztnQkFZSywyQkFBMkI7c0JBRHJDLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnRGYWN0b3J5LCBDb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIsIENvbXBvbmVudFJlZiwgRGlyZWN0aXZlLFxyXG4gICAgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT3V0cHV0LCBUeXBlLCBWaWV3Q29udGFpbmVyUmVmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7XHJcbiAgICBJZ3hBcmVhU2VyaWVzQ29tcG9uZW50LCBJZ3hCYXJTZXJpZXNDb21wb25lbnQsIElneEJ1YmJsZVNlcmllc0NvbXBvbmVudCwgSWd4Q29sdW1uU2VyaWVzQ29tcG9uZW50LFxyXG4gICAgSWd4RGF0YUNoYXJ0Q29tcG9uZW50LCBJZ3hJdGVtTGVnZW5kQ29tcG9uZW50LCBJZ3hMZWdlbmRDb21wb25lbnQsIElneExpbmVTZXJpZXNDb21wb25lbnQsIElneFBpZUNoYXJ0Q29tcG9uZW50LFxyXG4gICAgSWd4U2NhdHRlckxpbmVTZXJpZXNDb21wb25lbnQsIElneFNjYXR0ZXJTZXJpZXNDb21wb25lbnQsIElneFNpemVTY2FsZUNvbXBvbmVudCwgSWd4U3RhY2tlZDEwMEFyZWFTZXJpZXNDb21wb25lbnQsXHJcbiAgICBJZ3hTdGFja2VkMTAwQmFyU2VyaWVzQ29tcG9uZW50LCBJZ3hTdGFja2VkMTAwQ29sdW1uU2VyaWVzQ29tcG9uZW50LCBJZ3hTdGFja2VkMTAwTGluZVNlcmllc0NvbXBvbmVudCxcclxuICAgIElneFN0YWNrZWRBcmVhU2VyaWVzQ29tcG9uZW50LCBJZ3hTdGFja2VkQmFyU2VyaWVzQ29tcG9uZW50LCBJZ3hTdGFja2VkQ29sdW1uU2VyaWVzQ29tcG9uZW50LFxyXG4gICAgSWd4U3RhY2tlZExpbmVTZXJpZXNDb21wb25lbnRcclxufSBmcm9tICdpZ25pdGV1aS1hbmd1bGFyLWNoYXJ0cyc7XHJcbmltcG9ydCB7IENIQVJUX1RZUEUsIE9QVElPTlNfVFlQRSB9IGZyb20gJy4vY2hhcnQtdHlwZXMnO1xyXG5pbXBvcnQgeyBDaGFydEluaXRpYWxpemVyLCBJQ2hhcnRDb21wb25lbnRPcHRpb25zLCBJZ3hEYXRhQ2hhcnRJbml0aWFsaXplcixcclxuICAgIElneFBpZUNoYXJ0SW5pdGlhbGl6ZXIsIElneFN0YWNrZWREYXRhQ2hhcnRJbml0aWFsaXplciwgSU9wdGlvbnMgfSBmcm9tICcuL2luaXRpYWxpemVycyc7XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElEZXRlcm1pbmVkQ2hhcnRUeXBlc0FyZ3Mge1xyXG4gICAgY2hhcnRzQXZhaWxhYmlsdHk6IE1hcDxDSEFSVF9UWVBFLCBib29sZWFuPjtcclxuICAgIGNoYXJ0c0ZvckNyZWF0aW9uOiBDSEFSVF9UWVBFW107XHJcbn1cclxuXHJcbkBEaXJlY3RpdmUoe1xyXG4gICAgc2VsZWN0b3I6ICdbaWd4Q2hhcnRJbnRlZ3JhdGlvbl0nXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBJZ3hDaGFydEludGVncmF0aW9uRGlyZWN0aXZlIHtcclxuICAgIEBJbnB1dCgpXHJcbiAgICBwdWJsaWMgZ2V0IGNoYXJ0RGF0YSgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fY2hhcnREYXRhO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzZXQgY2hhcnREYXRhKHNlbGVjdGVkRGF0YTogYW55W10pIHtcclxuICAgICAgICBjb25zdCBjaGFydHMgPSBuZXcgU2V0KHRoaXMuX2RhdGFDaGFydFR5cGVzKTtcclxuICAgICAgICBjb25zdCBkYXRhTW9kZWwgPSBzZWxlY3RlZERhdGEubGVuZ3RoID8gc2VsZWN0ZWREYXRhWzBdIDoge307XHJcbiAgICAgICAgdGhpcy5fbGFiZWxNZW1iZXJQYXRocyA9IE9iamVjdC5rZXlzKGRhdGFNb2RlbCkuZmlsdGVyKGtleSA9PiB0eXBlb2YgZGF0YU1vZGVsW2tleV0gPT09ICdzdHJpbmcnKTtcclxuICAgICAgICB0aGlzLl92YWx1ZU1lbWJlclBhdGhzID0gT2JqZWN0LmtleXMoZGF0YU1vZGVsKS5maWx0ZXIoa2V5ID0+IHR5cGVvZiBkYXRhTW9kZWxba2V5XSA9PT0gJ251bWJlcicpO1xyXG4gICAgICAgIHRoaXMuX2NoYXJ0RGF0YSA9IHNlbGVjdGVkRGF0YS5tYXAoKGRhdGFSZWNvcmQsIGluZGV4KSA9PiB0aGlzLmFkZEluZGV4TWVtYmVyUGF0aChkYXRhUmVjb3JkLCBpbmRleCArIDEpKTtcclxuICAgICAgICBjb25zdCBhcmdzOiBJRGV0ZXJtaW5lZENoYXJ0VHlwZXNBcmdzID0ge1xyXG4gICAgICAgICAgICBjaGFydHNBdmFpbGFiaWx0eTogbmV3IE1hcDxDSEFSVF9UWVBFLCBib29sZWFuPigpLFxyXG4gICAgICAgICAgICBjaGFydHNGb3JDcmVhdGlvbjogW11cclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICBpZiAoc2VsZWN0ZWREYXRhLmxlbmd0aCA9PT0gMCB8fCB0aGlzLl92YWx1ZU1lbWJlclBhdGhzLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICAgICAgICB0aGlzLm9uQ2hhcnRUeXBlc0RldGVybWluZWQuZW1pdChhcmdzKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoc2VsZWN0ZWREYXRhLmxlbmd0aCA9PT0gMSkge1xyXG4gICAgICAgICAgICBjaGFydHMuZm9yRWFjaCgoY2hhcnQsIF8sIHNldCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgaXNDb2x1bW5DaGFydCA9IGNoYXJ0LmluZGV4T2YoJ0NvbHVtbicpICE9PSAtMTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGlzQmFyQ2hhcnQgPSBjaGFydC5pbmRleE9mKCdCYXInKSAhPT0gLTE7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBpc1BpZUNoYXJ0ID0gY2hhcnQuaW5kZXhPZignUGllJykgIT09IC0xO1xyXG4gICAgICAgICAgICAgICAgaWYgKCEoaXNDb2x1bW5DaGFydCB8fCBpc0JhckNoYXJ0IHx8IGlzUGllQ2hhcnQpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgc2V0LmRlbGV0ZShjaGFydCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBDb25maWcgcGllIGNoYXJ0XHJcbiAgICAgICAgY29uc3QgY2Fubm90Q3JlYXRlUGllQ2hhcnQgPSBzZWxlY3RlZERhdGEuc29tZShyZWNvcmQgPT4gcmVjb3JkW3RoaXMuX3ZhbHVlTWVtYmVyUGF0aHNbMF1dIDw9IDApO1xyXG4gICAgICAgIGlmIChjYW5ub3RDcmVhdGVQaWVDaGFydCkge1xyXG4gICAgICAgICAgICBjaGFydHMuZGVsZXRlKENIQVJUX1RZUEUuUElFKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gQ29uZmlnIHNjYXR0ZXIgY2hhcnQgbWVtYmVyIHBhdGhzXHJcbiAgICAgICAgY29uc3QgY2FuQ3JlYXRlU2NhdHRlckNoYXJ0ID0gdGhpcy5fdmFsdWVNZW1iZXJQYXRocy5sZW5ndGggPj0gMjtcclxuICAgICAgICBjb25zdCBjYW5DcmVhdGVCdWJibGVDaGFydCA9IHRoaXMuX3ZhbHVlTWVtYmVyUGF0aHMubGVuZ3RoID49IDM7XHJcbiAgICAgICAgaWYgKCFjYW5DcmVhdGVTY2F0dGVyQ2hhcnQpIHtcclxuICAgICAgICAgICAgY2hhcnRzLmRlbGV0ZShDSEFSVF9UWVBFLlNDQVRURVJfQlVCQkxFKTtcclxuICAgICAgICAgICAgY2hhcnRzLmRlbGV0ZShDSEFSVF9UWVBFLlNDQVRURVJfTElORSk7XHJcbiAgICAgICAgICAgIGNoYXJ0cy5kZWxldGUoQ0hBUlRfVFlQRS5TQ0FUVEVSX1BPSU5UKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCFjYW5DcmVhdGVCdWJibGVDaGFydCkge1xyXG4gICAgICAgICAgICBjaGFydHMuZGVsZXRlKENIQVJUX1RZUEUuU0NBVFRFUl9CVUJCTEUpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgYXJncy5jaGFydHNBdmFpbGFiaWx0eSA9IHRoaXMuY2hhcnRUeXBlc0F2YWlsYWJpbGl0eTtcclxuICAgICAgICBhcmdzLmNoYXJ0c0ZvckNyZWF0aW9uID0gWy4uLmNoYXJ0c107XHJcbiAgICAgICAgdGhpcy5vbkNoYXJ0VHlwZXNEZXRlcm1pbmVkLmVtaXQoYXJncyk7XHJcbiAgICB9XHJcblxyXG4gICAgQE91dHB1dCgpXHJcbiAgICBwdWJsaWMgb25DaGFydFR5cGVzRGV0ZXJtaW5lZCA9IG5ldyBFdmVudEVtaXR0ZXI8SURldGVybWluZWRDaGFydFR5cGVzQXJncz4oKTtcclxuXHJcbiAgICBAT3V0cHV0KClcclxuICAgIHB1YmxpYyBvbkNoYXJ0Q3JlYXRpb25Eb25lID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcblxyXG4gICAgQElucHV0KClcclxuICAgIHB1YmxpYyB1c2VMZWdlbmQgPSB0cnVlO1xyXG5cclxuICAgIEBJbnB1dCgpXHJcbiAgICBwdWJsaWMgZGVmYXVsdExhYmVsTWVtYmVyUGF0aDogc3RyaW5nID0gdW5kZWZpbmVkO1xyXG5cclxuICAgIEBJbnB1dCgpXHJcbiAgICBwdWJsaWMgc2V0IHNjYXR0ZXJDaGFydFlBeGlzVmFsdWVNZW1iZXJQYXRoKHBhdGg6IHN0cmluZykge1xyXG4gICAgICAgIHRoaXMuX3NjYXR0ZXJDaGFydFlBeGlzVmFsdWVNZW1iZXJQYXRoID0gcGF0aDtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0IHNjYXR0ZXJDaGFydFlBeGlzVmFsdWVNZW1iZXJQYXRoKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9zY2F0dGVyQ2hhcnRZQXhpc1ZhbHVlTWVtYmVyUGF0aCAmJlxyXG4gICAgICAgICAgICB0aGlzLl92YWx1ZU1lbWJlclBhdGhzLmluZGV4T2YodGhpcy5fc2NhdHRlckNoYXJ0WUF4aXNWYWx1ZU1lbWJlclBhdGgpICE9PSAtMSA/XHJcbiAgICAgICAgICAgIHRoaXMuX3NjYXR0ZXJDaGFydFlBeGlzVmFsdWVNZW1iZXJQYXRoIDogdGhpcy5fdmFsdWVNZW1iZXJQYXRoc1swXTtcclxuICAgIH1cclxuXHJcbiAgICBASW5wdXQoKVxyXG4gICAgcHVibGljIHNldCBidWJibGVDaGFydFJhZGl1c01lbWJlclBhdGgocGF0aDogc3RyaW5nKSB7XHJcbiAgICAgICAgdGhpcy5fYnViYmxlQ2hhcnRSYWRpdXNNZW1iZXJQYXRoID0gcGF0aDtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0IGJ1YmJsZUNoYXJ0UmFkaXVzTWVtYmVyUGF0aCgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fYnViYmxlQ2hhcnRSYWRpdXNNZW1iZXJQYXRoICYmXHJcbiAgICAgICAgICAgIHRoaXMuX3ZhbHVlTWVtYmVyUGF0aHMuaW5kZXhPZih0aGlzLl9idWJibGVDaGFydFJhZGl1c01lbWJlclBhdGgpICE9PSAtMSA/XHJcbiAgICAgICAgICAgIHRoaXMuX2J1YmJsZUNoYXJ0UmFkaXVzTWVtYmVyUGF0aCA6IHRoaXMuX3ZhbHVlTWVtYmVyUGF0aHNbMV07XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBjaGFydFR5cGVzQXZhaWxhYmlsaXR5ID0gbmV3IE1hcDxDSEFSVF9UWVBFLCBib29sZWFuPigpO1xyXG4gICAgcHJpdmF0ZSBjdXN0b21DaGFydENvbXBvbmVudE9wdGlvbnMgPSBuZXcgTWFwPENIQVJUX1RZUEUsIElDaGFydENvbXBvbmVudE9wdGlvbnM+KCk7XHJcbiAgICBwcml2YXRlIGRhdGFDaGFydHMgPSBuZXcgTWFwPHN0cmluZywgVHlwZTxhbnk+PigpO1xyXG4gICAgcHJpdmF0ZSBfc2NhdHRlckNoYXJ0WUF4aXNWYWx1ZU1lbWJlclBhdGggPSB1bmRlZmluZWQ7XHJcbiAgICBwcml2YXRlIF9idWJibGVDaGFydFJhZGl1c01lbWJlclBhdGggPSB1bmRlZmluZWQ7XHJcbiAgICBwcml2YXRlIF92YWx1ZU1lbWJlclBhdGhzID0gW107XHJcbiAgICBwcml2YXRlIF9sYWJlbE1lbWJlclBhdGhzID0gW107XHJcbiAgICBwcml2YXRlIF9jaGFydERhdGE6IGFueVtdO1xyXG4gICAgcHJpdmF0ZSBfc2l6ZVNjYWxlID0gbmV3IElneFNpemVTY2FsZUNvbXBvbmVudCgpO1xyXG4gICAgcHJpdmF0ZSBfZGF0YUNoYXJ0VHlwZXMgPSBuZXcgU2V0PENIQVJUX1RZUEU+KCk7XHJcbiAgICBwcml2YXRlIGdldCBfbGFiZWxNZW1iZXJQYXRoKCk6IHN0cmluZyB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZGVmYXVsdExhYmVsTWVtYmVyUGF0aCAmJiB0aGlzLl9jaGFydERhdGEuc29tZShyID0+IHJbdGhpcy5kZWZhdWx0TGFiZWxNZW1iZXJQYXRoXSAhPT0gdW5kZWZpbmVkKSA/XHJcbiAgICAgICAgICAgIHRoaXMuZGVmYXVsdExhYmVsTWVtYmVyUGF0aCA6IHRoaXMuX2xhYmVsTWVtYmVyUGF0aHMubGVuZ3RoID4gMCA/IHRoaXMuX2xhYmVsTWVtYmVyUGF0aHNbMF0gOiAnSW5kZXgnO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgZ2V0IHBpZUNoYXJ0T3B0aW9ucygpOiBJT3B0aW9ucyB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgd2lkdGg6ICc4NSUnLFxyXG4gICAgICAgICAgICBoZWlnaHQ6ICc3NSUnLFxyXG4gICAgICAgICAgICBkYXRhU291cmNlOiB0aGlzLmNoYXJ0RGF0YSxcclxuICAgICAgICAgICAgdmFsdWVNZW1iZXJQYXRoOiB0aGlzLl92YWx1ZU1lbWJlclBhdGhzWzBdLFxyXG4gICAgICAgICAgICBsZWdlbmRMYWJlbE1lbWJlclBhdGg6IHRoaXMuX2xhYmVsTWVtYmVyUGF0aCxcclxuICAgICAgICAgICAgbGFiZWxNZW1iZXJQYXRoOiB0aGlzLl9sYWJlbE1lbWJlclBhdGgsXHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGRhdGFDaGFydFNlcmllc09wdGlvbnNNb2RlbDogSU9wdGlvbnMgPSB7XHJcbiAgICAgICAgaXNIaWdobGlnaHRpbmdFbmFibGVkOiB0cnVlLFxyXG4gICAgICAgIGFyZWFGaWxsT3BhY2l0eTogLjQsXHJcbiAgICAgICAgbWFya2VyVHlwZTogMyxcclxuICAgICAgICBzaG93RGVmYXVsdFRvb2x0aXA6IHRydWVcclxuICAgIH07XHJcblxyXG4gICAgcHJpdmF0ZSBzY2F0dGVyQ2hhcnRTZXJpZXNPcHRpb25zTW9kZWw6IElPcHRpb25zID0ge1xyXG4gICAgICAgIG1hcmtlclR5cGU6IDMsXHJcbiAgICAgICAgc2hvd0RlZmF1bHRUb29sdGlwOiB0cnVlXHJcbiAgICB9O1xyXG5cclxuICAgIHByaXZhdGUgYnViYmxlQ2hhcnRTZXJpZXNPcHRpb25zTW9kZWw6IElPcHRpb25zID0ge1xyXG4gICAgICAgIHJhZGl1c1NjYWxlOiB0aGlzLl9zaXplU2NhbGVcclxuICAgIH07XHJcblxyXG4gICAgcHJpdmF0ZSBnZXQgZGF0YUNoYXJ0T3B0aW9ucygpOiBJT3B0aW9ucyB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgd2lkdGg6ICcxMDAlJyxcclxuICAgICAgICAgICAgaGVpZ2h0OiAnODUlJyxcclxuICAgICAgICAgICAgYXV0b01hcmdpbldpZHRoOiA1MCxcclxuICAgICAgICAgICAgaXNWZXJ0aWNhbFpvb21FbmFibGVkOiB0cnVlLFxyXG4gICAgICAgICAgICBpc0hvcml6b250YWxab29tRW5hYmxlZDogdHJ1ZSxcclxuICAgICAgICAgICAgZGF0YVNvdXJjZTogdGhpcy5jaGFydERhdGFcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSBmYWN0b3J5UmVzb2x2ZXI6IENvbXBvbmVudEZhY3RvcnlSZXNvbHZlcikge1xyXG4gICAgICAgIHRoaXMuZGF0YUNoYXJ0cy5zZXQoQ0hBUlRfVFlQRS5DT0xVTU5fR1JPVVBFRCwgSWd4Q29sdW1uU2VyaWVzQ29tcG9uZW50KTtcclxuICAgICAgICB0aGlzLmRhdGFDaGFydHMuc2V0KENIQVJUX1RZUEUuQVJFQV9HUk9VUEVELCBJZ3hBcmVhU2VyaWVzQ29tcG9uZW50KTtcclxuICAgICAgICB0aGlzLmRhdGFDaGFydHMuc2V0KENIQVJUX1RZUEUuTElORV9HUk9VUEVELCBJZ3hMaW5lU2VyaWVzQ29tcG9uZW50KTtcclxuICAgICAgICB0aGlzLmRhdGFDaGFydHMuc2V0KENIQVJUX1RZUEUuQkFSX0dST1VQRUQsIElneEJhclNlcmllc0NvbXBvbmVudCk7XHJcblxyXG4gICAgICAgIHRoaXMuZGF0YUNoYXJ0cy5zZXQoQ0hBUlRfVFlQRS5DT0xVTU5fU1RBQ0tFRCwgSWd4U3RhY2tlZENvbHVtblNlcmllc0NvbXBvbmVudCk7XHJcbiAgICAgICAgdGhpcy5kYXRhQ2hhcnRzLnNldChDSEFSVF9UWVBFLkFSRUFfU1RBQ0tFRCwgSWd4U3RhY2tlZEFyZWFTZXJpZXNDb21wb25lbnQpO1xyXG4gICAgICAgIHRoaXMuZGF0YUNoYXJ0cy5zZXQoQ0hBUlRfVFlQRS5MSU5FX1NUQUNLRUQsIElneFN0YWNrZWRMaW5lU2VyaWVzQ29tcG9uZW50KTtcclxuICAgICAgICB0aGlzLmRhdGFDaGFydHMuc2V0KENIQVJUX1RZUEUuQkFSX1NUQUNLRUQsIElneFN0YWNrZWRCYXJTZXJpZXNDb21wb25lbnQpO1xyXG5cclxuICAgICAgICB0aGlzLmRhdGFDaGFydHMuc2V0KENIQVJUX1RZUEUuQ09MVU1OXzEwMF9TVEFDS0VELCBJZ3hTdGFja2VkMTAwQ29sdW1uU2VyaWVzQ29tcG9uZW50KTtcclxuICAgICAgICB0aGlzLmRhdGFDaGFydHMuc2V0KENIQVJUX1RZUEUuQVJFQV8xMDBfU1RBQ0tFRCwgSWd4U3RhY2tlZDEwMEFyZWFTZXJpZXNDb21wb25lbnQpO1xyXG4gICAgICAgIHRoaXMuZGF0YUNoYXJ0cy5zZXQoQ0hBUlRfVFlQRS5MSU5FXzEwMF9TVEFDS0VELCBJZ3hTdGFja2VkMTAwTGluZVNlcmllc0NvbXBvbmVudCk7XHJcbiAgICAgICAgdGhpcy5kYXRhQ2hhcnRzLnNldChDSEFSVF9UWVBFLkJBUl8xMDBfU1RBQ0tFRCwgSWd4U3RhY2tlZDEwMEJhclNlcmllc0NvbXBvbmVudCk7XHJcblxyXG4gICAgICAgIHRoaXMuZGF0YUNoYXJ0cy5zZXQoQ0hBUlRfVFlQRS5TQ0FUVEVSX1BPSU5ULCBJZ3hTY2F0dGVyU2VyaWVzQ29tcG9uZW50KTtcclxuICAgICAgICB0aGlzLmRhdGFDaGFydHMuc2V0KENIQVJUX1RZUEUuU0NBVFRFUl9CVUJCTEUsIElneEJ1YmJsZVNlcmllc0NvbXBvbmVudCk7XHJcbiAgICAgICAgdGhpcy5kYXRhQ2hhcnRzLnNldChDSEFSVF9UWVBFLlNDQVRURVJfTElORSwgSWd4U2NhdHRlckxpbmVTZXJpZXNDb21wb25lbnQpO1xyXG5cclxuICAgICAgICB0aGlzLmRhdGFDaGFydHMuc2V0KENIQVJUX1RZUEUuUElFLCBJZ3hQaWVDaGFydENvbXBvbmVudCk7XHJcbiAgICAgICAgY29uc3QgaXRlcmFibGUgPSB0aGlzLmRhdGFDaGFydHMua2V5cygpO1xyXG4gICAgICAgIGZvciAobGV0IGhlYWQgPSBpdGVyYWJsZS5uZXh0KCkudmFsdWU7IGhlYWQgIT09IHVuZGVmaW5lZDsgaGVhZCA9IGl0ZXJhYmxlLm5leHQoKS52YWx1ZSkge1xyXG4gICAgICAgICAgICB0aGlzLl9kYXRhQ2hhcnRUeXBlcy5hZGQoaGVhZCk7XHJcbiAgICAgICAgICAgIHRoaXMuY2hhcnRUeXBlc0F2YWlsYWJpbGl0eS5zZXQoaGVhZCwgdHJ1ZSk7XHJcbiAgICAgICAgICAgIHRoaXMuY3VzdG9tQ2hhcnRDb21wb25lbnRPcHRpb25zLnNldChoZWFkLCB7fSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRBdmFpbGFibGVDaGFydHMoKSB7XHJcbiAgICAgICAgY29uc3QgcmVzID0gW107XHJcbiAgICAgICAgdGhpcy5jaGFydFR5cGVzQXZhaWxhYmlsaXR5LmZvckVhY2goKGlzQXZhaWxhYmxlLCBjaGFydFR5cGUpID0+IHtcclxuICAgICAgICAgICAgaWYgKGlzQXZhaWxhYmxlKSB7XHJcbiAgICAgICAgICAgICAgICByZXMucHVzaChjaGFydFR5cGUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgcmV0dXJuIHJlcztcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZGlzYWJsZUNoYXJ0cyh0eXBlczogQ0hBUlRfVFlQRVtdKSB7XHJcbiAgICAgICAgdHlwZXMuZm9yRWFjaCh0eXBlID0+IHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuY2hhcnRUeXBlc0F2YWlsYWJpbGl0eS5nZXQodHlwZSkpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuY2hhcnRUeXBlc0F2YWlsYWJpbGl0eS5zZXQodHlwZSwgZmFsc2UpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGVuYWJsZUNoYXJ0cyh0eXBlczogQ0hBUlRfVFlQRVtdKSB7XHJcbiAgICAgICAgdHlwZXMuZm9yRWFjaCh0eXBlID0+IHtcclxuICAgICAgICAgICAgaWYgKCF0aGlzLmNoYXJ0VHlwZXNBdmFpbGFiaWxpdHkuZ2V0KHR5cGUpKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNoYXJ0VHlwZXNBdmFpbGFiaWxpdHkuc2V0KHR5cGUsIHRydWUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGNoYXJ0RmFjdG9yeSh0eXBlOiBDSEFSVF9UWVBFLCB2aWV3Q29udGFpbmVyUmVmOiBWaWV3Q29udGFpbmVyUmVmKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLmNoYXJ0VHlwZXNBdmFpbGFiaWxpdHkuZ2V0KHR5cGUpKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgbGV0IGNvbXBvbmVudEZhY3Rvcnk6IENvbXBvbmVudEZhY3Rvcnk8YW55PjtcclxuICAgICAgICBsZXQgY29tcG9uZW50UmVmOiBDb21wb25lbnRSZWY8YW55PjtcclxuICAgICAgICB0aGlzLl9zaXplU2NhbGUubWF4aW11bVZhbHVlID0gNjA7XHJcbiAgICAgICAgdGhpcy5fc2l6ZVNjYWxlLm1pbmltdW1WYWx1ZSA9IDEwO1xyXG4gICAgICAgIGNvbnN0IGNoYXJ0VHlwZSA9IHRoaXMuZGF0YUNoYXJ0cy5nZXQodHlwZSk7XHJcblxyXG4gICAgICAgIGlmICh0eXBlID09PSBDSEFSVF9UWVBFLlBJRSkge1xyXG4gICAgICAgICAgICBjb21wb25lbnRGYWN0b3J5ID0gdGhpcy5mYWN0b3J5UmVzb2x2ZXIucmVzb2x2ZUNvbXBvbmVudEZhY3RvcnkoSWd4UGllQ2hhcnRDb21wb25lbnQpO1xyXG4gICAgICAgICAgICBjb21wb25lbnRSZWYgPSB2aWV3Q29udGFpbmVyUmVmLmNyZWF0ZUNvbXBvbmVudChjb21wb25lbnRGYWN0b3J5KTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBjb21wb25lbnRGYWN0b3J5ID0gdGhpcy5mYWN0b3J5UmVzb2x2ZXIucmVzb2x2ZUNvbXBvbmVudEZhY3RvcnkoSWd4RGF0YUNoYXJ0Q29tcG9uZW50KTtcclxuICAgICAgICAgICAgY29tcG9uZW50UmVmID0gdmlld0NvbnRhaW5lclJlZi5jcmVhdGVDb21wb25lbnQoY29tcG9uZW50RmFjdG9yeSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IG9wdGlvbnM6IElDaGFydENvbXBvbmVudE9wdGlvbnMgPSB0aGlzLmdldENoYXJ0T3B0aW9ucyh0eXBlKTtcclxuICAgICAgICBjb25zdCBpbml0aWFsaXplcjogQ2hhcnRJbml0aWFsaXplciA9IHRoaXMuZ2V0SW5pdGlhbGl6ZXIodHlwZSwgY2hhcnRUeXBlKTtcclxuICAgICAgICBpZiAodGhpcy51c2VMZWdlbmQpIHtcclxuICAgICAgICAgICAgY29uc3QgbGVnZW5kVHlwZSA9IHR5cGUgPT09IENIQVJUX1RZUEUuUElFID8gSWd4SXRlbUxlZ2VuZENvbXBvbmVudCA6IElneExlZ2VuZENvbXBvbmVudDtcclxuICAgICAgICAgICAgY29uc3QgbGVnZW5kRmFjdG9yeSA9IHRoaXMuZmFjdG9yeVJlc29sdmVyLnJlc29sdmVDb21wb25lbnRGYWN0b3J5KGxlZ2VuZFR5cGUgYXMgYW55KTtcclxuICAgICAgICAgICAgY29uc3QgbGVnZW5kQ29tcG9uZW50UmVmOiBDb21wb25lbnRSZWY8YW55PiA9IHZpZXdDb250YWluZXJSZWYuY3JlYXRlQ29tcG9uZW50KGxlZ2VuZEZhY3RvcnkpO1xyXG4gICAgICAgICAgICBvcHRpb25zLmNoYXJ0T3B0aW9uc1snbGVnZW5kJ10gPSBsZWdlbmRDb21wb25lbnRSZWYuaW5zdGFuY2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGNoYXJ0ID0gaW5pdGlhbGl6ZXIuaW5pdENoYXJ0KGNvbXBvbmVudFJlZi5pbnN0YW5jZSwgb3B0aW9ucyk7XHJcbiAgICAgICAgdGhpcy5vbkNoYXJ0Q3JlYXRpb25Eb25lLmVtaXQoY2hhcnQpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgZ2V0SW5pdGlhbGl6ZXIoY2hhcnRUeXBlOiBDSEFSVF9UWVBFLCBjb21wb25lbnRDbGFzc1JlZik6IENoYXJ0SW5pdGlhbGl6ZXIge1xyXG4gICAgICAgIGlmIChjaGFydFR5cGUuaW5jbHVkZXMoJ1BpZScpKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBuZXcgSWd4UGllQ2hhcnRJbml0aWFsaXplcigpO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoY2hhcnRUeXBlLmluY2x1ZGVzKCdTdGFja2VkJykpIHtcclxuICAgICAgICAgICAgcmV0dXJuIG5ldyBJZ3hTdGFja2VkRGF0YUNoYXJ0SW5pdGlhbGl6ZXIoY29tcG9uZW50Q2xhc3NSZWYpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiBuZXcgSWd4RGF0YUNoYXJ0SW5pdGlhbGl6ZXIoY29tcG9uZW50Q2xhc3NSZWYpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGdldENoYXJ0T3B0aW9ucyh0eXBlOiBDSEFSVF9UWVBFKTogSUNoYXJ0Q29tcG9uZW50T3B0aW9ucyB7XHJcbiAgICAgICAgY29uc3QgY2hhcnRDb21wb25lbnRPcHRpb25zOiBJQ2hhcnRDb21wb25lbnRPcHRpb25zID0ge307XHJcbiAgICAgICAgcmV0dXJuIHR5cGUgPT09IENIQVJUX1RZUEUuUElFID8gdGhpcy5hZGRQaWVDaGFydERhdGFPcHRpb25zKGNoYXJ0Q29tcG9uZW50T3B0aW9ucykgOlxyXG4gICAgICAgICAgICB0aGlzLmFkZERhdGFDaGFydERhdGFPcHRpb25zKHR5cGUsIGNoYXJ0Q29tcG9uZW50T3B0aW9ucywgdHlwZS5pbmNsdWRlcygnU3RhY2tlZCcpKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGFkZFBpZUNoYXJ0RGF0YU9wdGlvbnMoY2hhcnRDb21wb25lbnRPcHRpb25zOiBJQ2hhcnRDb21wb25lbnRPcHRpb25zKSB7XHJcbiAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBtYXgtbGluZS1sZW5ndGhcclxuICAgICAgICBjaGFydENvbXBvbmVudE9wdGlvbnMuY2hhcnRPcHRpb25zID0gT2JqZWN0LmFzc2lnbih0aGlzLnBpZUNoYXJ0T3B0aW9ucywgdGhpcy5jdXN0b21DaGFydENvbXBvbmVudE9wdGlvbnMuZ2V0KENIQVJUX1RZUEUuUElFKS5jaGFydE9wdGlvbnMpO1xyXG4gICAgICAgIHJldHVybiBjaGFydENvbXBvbmVudE9wdGlvbnM7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBhZGREYXRhQ2hhcnREYXRhT3B0aW9ucyh0eXBlOiBDSEFSVF9UWVBFLCBjaGFydENvbXBvbmVudE9wdGlvbnM6IElDaGFydENvbXBvbmVudE9wdGlvbnMsIHN0YWNrZWQ6IGJvb2xlYW4pIHtcclxuICAgICAgICBjaGFydENvbXBvbmVudE9wdGlvbnMuY2hhcnRPcHRpb25zID0gT2JqZWN0LmFzc2lnbih0aGlzLmRhdGFDaGFydE9wdGlvbnMsIHRoaXMuY3VzdG9tQ2hhcnRDb21wb25lbnRPcHRpb25zLmdldCh0eXBlKSk7XHJcbiAgICAgICAgaWYgKHR5cGUuaW5kZXhPZignU2NhdHRlcicpICE9PSAtMSkge1xyXG4gICAgICAgICAgICB0aGlzLmFkZFNjYXR0ZXJDaGFydERhdGFPcHRpb25zKHR5cGUsIGNoYXJ0Q29tcG9uZW50T3B0aW9ucyk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBtYXgtbGluZS1sZW5ndGhcclxuICAgICAgICAgICAgY2hhcnRDb21wb25lbnRPcHRpb25zLnNlcmllc01vZGVsID0gT2JqZWN0LmFzc2lnbih0aGlzLmRhdGFDaGFydFNlcmllc09wdGlvbnNNb2RlbCwgdGhpcy5jdXN0b21DaGFydENvbXBvbmVudE9wdGlvbnMuZ2V0KHR5cGUpLnNlcmllc01vZGVsKTtcclxuICAgICAgICAgICAgdGhpcy5zZXRBeGlzTGFiZWxPcHRpb24odHlwZSwgY2hhcnRDb21wb25lbnRPcHRpb25zKTtcclxuICAgICAgICAgICAgY29uc3Qgb3B0aW9uczogSU9wdGlvbnNbXSA9IFtdO1xyXG4gICAgICAgICAgICB0aGlzLl92YWx1ZU1lbWJlclBhdGhzLmZvckVhY2godmFsdWVNZW1iZXJQYXRoID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGRhdGFPcHRpb25zID0ge1xyXG4gICAgICAgICAgICAgICAgICAgIHRpdGxlOiB2YWx1ZU1lbWJlclBhdGgsXHJcbiAgICAgICAgICAgICAgICAgICAgdmFsdWVNZW1iZXJQYXRoXHJcbiAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgICAgaWYgKHN0YWNrZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnB1c2goeyAuLi5kYXRhT3B0aW9ucyB9KTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5wdXNoKHsgLi4uZGF0YU9wdGlvbnMsIC4uLmNoYXJ0Q29tcG9uZW50T3B0aW9ucy5zZXJpZXNNb2RlbCB9KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIHN0YWNrZWQgPyBjaGFydENvbXBvbmVudE9wdGlvbnMuc3RhY2tlZEZyYWdtZW50T3B0aW9ucyA9IG9wdGlvbnMgOlxyXG4gICAgICAgICAgICBjaGFydENvbXBvbmVudE9wdGlvbnMuc2VyaWVzT3B0aW9ucyA9IG9wdGlvbnM7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBjaGFydENvbXBvbmVudE9wdGlvbnM7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBhZGRTY2F0dGVyQ2hhcnREYXRhT3B0aW9ucyhzY2F0dGVyQ2hhcnQ6IENIQVJUX1RZUEUsIGNoYXJ0Q29tcG9uZW50T3B0aW9uczogSUNoYXJ0Q29tcG9uZW50T3B0aW9ucykge1xyXG4gICAgICAgICAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBtYXgtbGluZS1sZW5ndGhcclxuICAgICAgICBjaGFydENvbXBvbmVudE9wdGlvbnMuc2VyaWVzTW9kZWwgPSBPYmplY3QuYXNzaWduKHRoaXMuc2NhdHRlckNoYXJ0U2VyaWVzT3B0aW9uc01vZGVsLCB0aGlzLmN1c3RvbUNoYXJ0Q29tcG9uZW50T3B0aW9ucy5nZXQoc2NhdHRlckNoYXJ0KS5zZXJpZXNNb2RlbCk7XHJcbiAgICAgICAgY2hhcnRDb21wb25lbnRPcHRpb25zLnNlcmllc01vZGVsWyd5TWVtYmVyUGF0aCddID0gdGhpcy5zY2F0dGVyQ2hhcnRZQXhpc1ZhbHVlTWVtYmVyUGF0aDtcclxuICAgICAgICBpZiAoc2NhdHRlckNoYXJ0ID09PSBDSEFSVF9UWVBFLlNDQVRURVJfQlVCQkxFKSB7XHJcbiAgICAgICAgICAgIGNoYXJ0Q29tcG9uZW50T3B0aW9ucy5zZXJpZXNNb2RlbCA9IE9iamVjdC5hc3NpZ24oY2hhcnRDb21wb25lbnRPcHRpb25zLnNlcmllc01vZGVsLCB0aGlzLmJ1YmJsZUNoYXJ0U2VyaWVzT3B0aW9uc01vZGVsKTtcclxuICAgICAgICAgICAgY2hhcnRDb21wb25lbnRPcHRpb25zLnNlcmllc01vZGVsWydyYWRpdXNNZW1iZXJQYXRoJ10gPSB0aGlzLmJ1YmJsZUNoYXJ0UmFkaXVzTWVtYmVyUGF0aDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IG1vZGVsID0gY2hhcnRDb21wb25lbnRPcHRpb25zLnNlcmllc01vZGVsO1xyXG4gICAgICAgIGNvbnN0IHNlcmllc09wdGlvbnM6IElPcHRpb25zW10gPSBbXTtcclxuICAgICAgICB0aGlzLl92YWx1ZU1lbWJlclBhdGhzLmZpbHRlcih2ID0+ICEodiA9PT0gbW9kZWxbJ3lNZW1iZXJQYXRoJ10gfHxcclxuICAgICAgICAgICAgdiA9PT0gbW9kZWxbJ3JhZGl1c01lbWJlclBhdGgnXSkpLmZvckVhY2godmFsdWVNZW1iZXJQYXRoID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGRhdGFPcHRpb25zID0ge1xyXG4gICAgICAgICAgICAgICAgICAgIHRpdGxlOiBgJHttb2RlbFsneU1lbWJlclBhdGgnXX0gdnMgJHt2YWx1ZU1lbWJlclBhdGh9YCxcclxuICAgICAgICAgICAgICAgICAgICB4TWVtYmVyUGF0aDogdmFsdWVNZW1iZXJQYXRoLFxyXG4gICAgICAgICAgICAgICAgICAgIGxhYmVsTWVtYmVyUGF0aDogdGhpcy5fbGFiZWxNZW1iZXJQYXRoXHJcbiAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgICAgc2VyaWVzT3B0aW9ucy5wdXNoKHsgLi4uZGF0YU9wdGlvbnMsIC4uLm1vZGVsIH0pO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICBjaGFydENvbXBvbmVudE9wdGlvbnMuc2VyaWVzT3B0aW9ucyA9IHNlcmllc09wdGlvbnM7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBhZGRJbmRleE1lbWJlclBhdGgoZGF0YVJlY29yZCwgaW5kZXgpIHtcclxuICAgICAgICBkYXRhUmVjb3JkID0geyAuLi57IFt0aGlzLl9sYWJlbE1lbWJlclBhdGhdOiBpbmRleCB9LCAuLi5kYXRhUmVjb3JkIH07XHJcbiAgICAgICAgcmV0dXJuIGRhdGFSZWNvcmQ7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBzZXRBeGlzTGFiZWxPcHRpb24odHlwZTogQ0hBUlRfVFlQRSwgb3B0aW9uczogSUNoYXJ0Q29tcG9uZW50T3B0aW9ucykge1xyXG4gICAgICAgIGlmICh0eXBlLmluZGV4T2YoJ0JhcicpICE9PSAtMSkge1xyXG4gICAgICAgICAgICBvcHRpb25zLnlBeGlzT3B0aW9ucyA9IE9iamVjdC5hc3NpZ24oe1xyXG4gICAgICAgICAgICAgICAgbGFiZWw6IHRoaXMuX2xhYmVsTWVtYmVyUGF0aFxyXG4gICAgICAgICAgICB9LCB0aGlzLmN1c3RvbUNoYXJ0Q29tcG9uZW50T3B0aW9ucy5nZXQodHlwZSkueUF4aXNPcHRpb25zKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBvcHRpb25zLnhBeGlzT3B0aW9ucyA9IE9iamVjdC5hc3NpZ24oe1xyXG4gICAgICAgICAgICAgICAgbGFiZWw6IHRoaXMuX2xhYmVsTWVtYmVyUGF0aFxyXG4gICAgICAgICAgICB9LCB0aGlzLmN1c3RvbUNoYXJ0Q29tcG9uZW50T3B0aW9ucy5nZXQodHlwZSkueEF4aXNPcHRpb25zKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHNldENoYXJ0Q29tcG9uZW50T3B0aW9ucyhjaGFydDogQ0hBUlRfVFlQRSwgb3B0aW9uc1R5cGU6IE9QVElPTlNfVFlQRSwgb3B0aW9uczogSU9wdGlvbnMpIHtcclxuICAgICAgICBpZiAoIXRoaXMuY3VzdG9tQ2hhcnRDb21wb25lbnRPcHRpb25zLmdldChjaGFydClbb3B0aW9uc1R5cGVdKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY3VzdG9tQ2hhcnRDb21wb25lbnRPcHRpb25zLmdldChjaGFydClbb3B0aW9uc1R5cGVdID0ge307XHJcbiAgICAgICAgfVxyXG4gICAgICAgIE9iamVjdC5rZXlzKG9wdGlvbnMpLmZvckVhY2gocHJvcGVydHkgPT4ge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jdXN0b21DaGFydENvbXBvbmVudE9wdGlvbnMuZ2V0KGNoYXJ0KVtvcHRpb25zVHlwZV1bcHJvcGVydHldID0gb3B0aW9uc1twcm9wZXJ0eV07XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG59XHJcbiJdfQ==