@provoly/dashboard 0.14.11 → 0.14.13
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.
- package/admin/admin.module.d.ts +2 -1
- package/admin/components/admin-classes/admin-classes-form/admin-classes-form.component.d.ts +1 -0
- package/admin/components/admin-classes/store/admin-class.actions.d.ts +11 -0
- package/admin/components/admin-classes/store/admin-class.effects.d.ts +5 -0
- package/admin/components/admin-classes/store/admin-class.reducer.d.ts +1 -0
- package/admin/components/admin-classes/store/admin-class.selectors.d.ts +1 -0
- package/admin/i18n/en.translations.d.ts +11 -0
- package/admin/i18n/fr.translations.d.ts +11 -0
- package/admin/store/admin.service.d.ts +1 -0
- package/esm2022/admin/admin.module.mjs +8 -4
- package/esm2022/admin/components/admin-classes/admin-classes-form/admin-classes-form.component.mjs +8 -4
- package/esm2022/admin/components/admin-classes/store/admin-class.actions.mjs +5 -2
- package/esm2022/admin/components/admin-classes/store/admin-class.effects.mjs +4 -1
- package/esm2022/admin/components/admin-classes/store/admin-class.reducer.mjs +6 -2
- package/esm2022/admin/components/admin-classes/store/admin-class.selectors.mjs +4 -2
- package/esm2022/admin/i18n/en.translations.mjs +12 -1
- package/esm2022/admin/i18n/fr.translations.mjs +12 -1
- package/esm2022/admin/store/admin.service.mjs +6 -1
- package/esm2022/dataset/components/dataset-detail/dataset-detail.component.mjs +2 -1
- package/esm2022/dataset/i18n/fr.translations.mjs +2 -2
- package/esm2022/lib/core/components/about/about.component.mjs +14 -9
- package/esm2022/lib/core/i18n/en.translations.mjs +3 -2
- package/esm2022/lib/core/i18n/fr.translations.mjs +3 -2
- package/esm2022/lib/core/model/widget-aggregated-chart-manifest.interface.mjs +2 -1
- package/esm2022/lib/core/model/widget-map-manifest.interface.mjs +2 -1
- package/esm2022/lib/core/public-api.mjs +4 -1
- package/esm2022/lib/core/store/aggregation/backend-aggregation.service.mjs +101 -0
- package/esm2022/lib/core/store/aggregation/base-aggregation.service.mjs +16 -0
- package/esm2022/lib/core/store/aggregation/frontend-aggregation.service.mjs +210 -0
- package/esm2022/lib/core/store/class/class.interface.mjs +1 -1
- package/esm2022/lib/core/store/config/config.service.mjs +13 -13
- package/esm2022/lib/core/store/config/versions.interface.mjs +1 -1
- package/esm2022/lib/core/store/context-menu/context-menu.actions.mjs +1 -1
- package/esm2022/lib/core/store/context-menu/context-menu.reducer.mjs +5 -3
- package/esm2022/lib/core/store/context-menu/context-menu.selectors.mjs +4 -2
- package/esm2022/lib/core/store/field/field.interface.mjs +1 -1
- package/esm2022/lib/dashboard/components/context-menu/context-menu.component.mjs +23 -17
- package/esm2022/lib/dashboard/components/context-menu/object-edition/object-edition.component.mjs +1 -1
- package/esm2022/lib/dashboard/components/widgets/data-widget.component.mjs +1 -1
- package/esm2022/lib/dashboard/store/dashboard.reducers.mjs +4 -3
- package/esm2022/lib/dashboard/store/dashboard.selectors.mjs +5 -3
- package/esm2022/toolbox/components/save-view/save-view.component.mjs +5 -4
- package/esm2022/widgets/widget-aggregated-chart/component/widget-aggregated-chart.component.mjs +8 -9
- package/esm2022/widgets/widget-aggregated-chart/public-api.mjs +1 -4
- package/esm2022/widgets/widget-aggregated-chart/widget-aggregated-chart.module.mjs +2 -3
- package/esm2022/widgets/widget-detail/component/widget-detail.component.mjs +2 -2
- package/esm2022/widgets/widget-graph/component/widget-graph.component.mjs +3 -2
- package/esm2022/widgets/widget-map/component/widget-map-layer.service.mjs +2 -1
- package/esm2022/widgets/widget-map/component/widget-map.component.mjs +94 -34
- package/esm2022/widgets/widget-map/interaction/interaction-manager.class.mjs +3 -2
- package/esm2022/widgets/widget-map/utils/xml-utils.class.mjs +3 -2
- package/esm2022/widgets/widget-table/component/widget-table.component.mjs +47 -52
- package/esm2022/widgets/widget-tile/component/widget-tile.component.mjs +3 -2
- package/esm2022/widgets/widget-vega/i18n/en.translations.mjs +4 -2
- package/esm2022/widgets/widget-vega/i18n/fr.translations.mjs +4 -2
- package/fesm2022/provoly-dashboard-admin.mjs +55 -9
- package/fesm2022/provoly-dashboard-admin.mjs.map +1 -1
- package/fesm2022/provoly-dashboard-dataset.mjs +2 -1
- package/fesm2022/provoly-dashboard-dataset.mjs.map +1 -1
- package/fesm2022/provoly-dashboard-toolbox.mjs +4 -3
- package/fesm2022/provoly-dashboard-toolbox.mjs.map +1 -1
- package/fesm2022/provoly-dashboard-widgets-widget-aggregated-chart.mjs +10 -313
- package/fesm2022/provoly-dashboard-widgets-widget-aggregated-chart.mjs.map +1 -1
- package/fesm2022/provoly-dashboard-widgets-widget-detail.mjs +1 -1
- package/fesm2022/provoly-dashboard-widgets-widget-detail.mjs.map +1 -1
- package/fesm2022/provoly-dashboard-widgets-widget-graph.mjs +2 -1
- package/fesm2022/provoly-dashboard-widgets-widget-graph.mjs.map +1 -1
- package/fesm2022/provoly-dashboard-widgets-widget-map.mjs +98 -36
- package/fesm2022/provoly-dashboard-widgets-widget-map.mjs.map +1 -1
- package/fesm2022/provoly-dashboard-widgets-widget-table.mjs +47 -52
- package/fesm2022/provoly-dashboard-widgets-widget-table.mjs.map +1 -1
- package/fesm2022/provoly-dashboard-widgets-widget-tile.mjs +2 -1
- package/fesm2022/provoly-dashboard-widgets-widget-tile.mjs.map +1 -1
- package/fesm2022/provoly-dashboard-widgets-widget-vega.mjs +6 -2
- package/fesm2022/provoly-dashboard-widgets-widget-vega.mjs.map +1 -1
- package/fesm2022/provoly-dashboard.mjs +420 -99
- package/fesm2022/provoly-dashboard.mjs.map +1 -1
- package/lib/core/components/about/about.component.d.ts +3 -1
- package/lib/core/i18n/en.translations.d.ts +1 -0
- package/lib/core/i18n/fr.translations.d.ts +1 -0
- package/lib/core/model/widget-aggregated-chart-manifest.interface.d.ts +2 -1
- package/lib/core/model/widget-map-manifest.interface.d.ts +1 -0
- package/lib/core/public-api.d.ts +3 -0
- package/{widgets/widget-aggregated-chart/service → lib/core/store/aggregation}/backend-aggregation.service.d.ts +4 -1
- package/{widgets/widget-aggregated-chart/service → lib/core/store/aggregation}/base-aggregation.service.d.ts +14 -1
- package/{widgets/widget-aggregated-chart/service → lib/core/store/aggregation}/frontend-aggregation.service.d.ts +3 -2
- package/lib/core/store/class/class.interface.d.ts +1 -0
- package/lib/core/store/config/config.service.d.ts +2 -1
- package/lib/core/store/config/versions.interface.d.ts +3 -3
- package/lib/core/store/context-menu/context-menu.actions.d.ts +2 -0
- package/lib/core/store/context-menu/context-menu.reducer.d.ts +1 -0
- package/lib/core/store/context-menu/context-menu.selectors.d.ts +1 -0
- package/lib/core/store/field/field.interface.d.ts +1 -0
- package/lib/dashboard/components/context-menu/context-menu.component.d.ts +1 -0
- package/lib/dashboard/store/dashboard.selectors.d.ts +6 -1
- package/package.json +1 -1
- package/styles/base/_utils.scss +4 -0
- package/styles/components/_o-pry-admin-classes-customize.scss +6 -4
- package/toolbox/components/save-view/save-view.component.d.ts +2 -1
- package/widgets/widget-aggregated-chart/component/widget-aggregated-chart.component.d.ts +1 -7
- package/widgets/widget-aggregated-chart/public-api.d.ts +0 -3
- package/widgets/widget-map/component/widget-map.component.d.ts +14 -3
- package/widgets/widget-table/component/widget-table.component.d.ts +6 -1
- package/widgets/widget-vega/i18n/en.translations.d.ts +2 -0
- package/widgets/widget-vega/i18n/fr.translations.d.ts +2 -0
- package/esm2022/widgets/widget-aggregated-chart/service/backend-aggregation.service.mjs +0 -96
- package/esm2022/widgets/widget-aggregated-chart/service/base-aggregation.service.mjs +0 -16
- package/esm2022/widgets/widget-aggregated-chart/service/frontend-aggregation.service.mjs +0 -206
|
@@ -1,206 +0,0 @@
|
|
|
1
|
-
import { Injectable } from '@angular/core';
|
|
2
|
-
import { ClassSelectors, DashboardSelectors, ItemUtils, Operation, ResultsetUtils } from '@provoly/dashboard';
|
|
3
|
-
import { combineLatest, map } from 'rxjs';
|
|
4
|
-
import { PryAggregationService } from './base-aggregation.service';
|
|
5
|
-
import * as i0 from "@angular/core";
|
|
6
|
-
import * as i1 from "@ngrx/store";
|
|
7
|
-
export class PryFrontendAggregationService extends PryAggregationService {
|
|
8
|
-
constructor(store) {
|
|
9
|
-
super();
|
|
10
|
-
this.store = store;
|
|
11
|
-
}
|
|
12
|
-
// @ts-ignore
|
|
13
|
-
aggregate(datasource, options) {
|
|
14
|
-
return combineLatest([
|
|
15
|
-
this.store.select(DashboardSelectors.resultSets),
|
|
16
|
-
this.store.select(ClassSelectors.classes)
|
|
17
|
-
]).pipe(map(([resultSets, classes]) => {
|
|
18
|
-
const abscissa = classes
|
|
19
|
-
.map((clazz) => clazz.attributes.find((attr) => attr.id === options.abscissa.attribute))
|
|
20
|
-
.find((attr) => !!attr)?.name;
|
|
21
|
-
const ordinate = classes
|
|
22
|
-
.map((clazz) => clazz.attributes.find((attr) => attr.id === options.ordinate.attribute))
|
|
23
|
-
.find((attr) => !!attr)?.name;
|
|
24
|
-
if (!abscissa || !ordinate) {
|
|
25
|
-
throw new Error('abscissaorodinateinvalid');
|
|
26
|
-
}
|
|
27
|
-
let data = datasource.map((rsName) => resultSets[rsName ?? '']).filter((rsName) => !!rsName);
|
|
28
|
-
const resultSet = data.reduce((rs1, rs2) => ResultsetUtils.mergeResultSets(rs1, rs2), {
|
|
29
|
-
items: {},
|
|
30
|
-
relations: [],
|
|
31
|
-
merged: data.length
|
|
32
|
-
});
|
|
33
|
-
let items = Object.keys(resultSet.items)
|
|
34
|
-
.map((classId) => resultSet.items[classId])
|
|
35
|
-
.reduce((prev, curr) => [...prev, ...curr], []);
|
|
36
|
-
if (!!options.groupBy) {
|
|
37
|
-
const groupBy = classes
|
|
38
|
-
.map((clazz) => clazz.attributes.find((attr) => attr.id === options.groupBy?.attribute))
|
|
39
|
-
.find((attr) => !!attr)?.name;
|
|
40
|
-
if (!groupBy) {
|
|
41
|
-
throw new Error('groupByAttributeisinvalid');
|
|
42
|
-
}
|
|
43
|
-
const itemsGrouped = this.groupBy(items, groupBy);
|
|
44
|
-
const values = [];
|
|
45
|
-
Object.keys(itemsGrouped).forEach((key) => {
|
|
46
|
-
values.push({
|
|
47
|
-
key,
|
|
48
|
-
groupBy: this.getValueFromOperation(itemsGrouped[key], options.ordinate.operation, abscissa, ordinate, options.abscissa.limit)
|
|
49
|
-
});
|
|
50
|
-
});
|
|
51
|
-
return { operation: options.ordinate.operation, values: values };
|
|
52
|
-
}
|
|
53
|
-
const values = this.getValueFromOperation(items, options.ordinate.operation, abscissa, ordinate, options.abscissa.limit);
|
|
54
|
-
return { operation: options.ordinate.operation, values: values };
|
|
55
|
-
}));
|
|
56
|
-
}
|
|
57
|
-
getValueFromOperation(items, operation, abscissa, ordinate, limit) {
|
|
58
|
-
let result = [];
|
|
59
|
-
const groupByAbscissa = this.groupBy(items, abscissa);
|
|
60
|
-
groupByAbscissa.map((test) => console.log(groupByAbscissa[test]));
|
|
61
|
-
switch (operation) {
|
|
62
|
-
case Operation.COUNT:
|
|
63
|
-
result.push(...Object.keys(groupByAbscissa).map((key) => ({
|
|
64
|
-
key: key,
|
|
65
|
-
value: groupByAbscissa[key].length
|
|
66
|
-
})));
|
|
67
|
-
break;
|
|
68
|
-
case Operation.SUM:
|
|
69
|
-
result.push(...Object.keys(groupByAbscissa).map((key) => ({
|
|
70
|
-
key: key,
|
|
71
|
-
value: this.getSum(groupByAbscissa[key], ordinate)
|
|
72
|
-
})));
|
|
73
|
-
break;
|
|
74
|
-
case Operation.DISTINCT:
|
|
75
|
-
result.push(...Object.keys(groupByAbscissa).map((key) => ({
|
|
76
|
-
key: key,
|
|
77
|
-
value: this.getDistinct(groupByAbscissa[key], ordinate)
|
|
78
|
-
})));
|
|
79
|
-
break;
|
|
80
|
-
case Operation.AVERAGE:
|
|
81
|
-
result.push(...Object.keys(groupByAbscissa).map((key) => ({
|
|
82
|
-
key: key,
|
|
83
|
-
value: this.getAverage(groupByAbscissa[key], ordinate)
|
|
84
|
-
})));
|
|
85
|
-
break;
|
|
86
|
-
case Operation.MEDIAN:
|
|
87
|
-
result.push(...Object.keys(groupByAbscissa).map((key) => ({
|
|
88
|
-
key: key,
|
|
89
|
-
value: this.getQuartile(groupByAbscissa[key], ordinate, 0.5)
|
|
90
|
-
})));
|
|
91
|
-
break;
|
|
92
|
-
case Operation.Q1:
|
|
93
|
-
result.push(...Object.keys(groupByAbscissa).map((key) => ({
|
|
94
|
-
key: key,
|
|
95
|
-
value: this.getQuartile(groupByAbscissa[key], ordinate, 0.25)
|
|
96
|
-
})));
|
|
97
|
-
break;
|
|
98
|
-
case Operation.Q3:
|
|
99
|
-
result.push(...Object.keys(groupByAbscissa).map((key) => ({
|
|
100
|
-
key: key,
|
|
101
|
-
value: this.getQuartile(groupByAbscissa[key], ordinate, 0.75)
|
|
102
|
-
})));
|
|
103
|
-
break;
|
|
104
|
-
case Operation.MIN:
|
|
105
|
-
result.push(...Object.keys(groupByAbscissa).map((key) => ({
|
|
106
|
-
key: key,
|
|
107
|
-
value: this.getMin(groupByAbscissa[key], ordinate)
|
|
108
|
-
})));
|
|
109
|
-
break;
|
|
110
|
-
default:
|
|
111
|
-
result.push(...Object.keys(groupByAbscissa).map((key) => ({
|
|
112
|
-
key: key,
|
|
113
|
-
value: this.getMax(groupByAbscissa[key], ordinate)
|
|
114
|
-
})));
|
|
115
|
-
break;
|
|
116
|
-
}
|
|
117
|
-
if (limit) {
|
|
118
|
-
result = this.formatByLimit(result, limit);
|
|
119
|
-
}
|
|
120
|
-
return result;
|
|
121
|
-
}
|
|
122
|
-
groupBy(items, attribute) {
|
|
123
|
-
let distincts = [];
|
|
124
|
-
items.forEach((item) => {
|
|
125
|
-
let value = this.getValueFromAttribute(item, attribute);
|
|
126
|
-
if (distincts[value.value]) {
|
|
127
|
-
distincts[value.value].push(item);
|
|
128
|
-
}
|
|
129
|
-
else {
|
|
130
|
-
distincts[value.value] = [item];
|
|
131
|
-
}
|
|
132
|
-
});
|
|
133
|
-
return distincts;
|
|
134
|
-
}
|
|
135
|
-
getValueFromAttribute(item, attribute) {
|
|
136
|
-
let value = ItemUtils.getAttributeValue(item, attribute);
|
|
137
|
-
return Array.isArray(value) ? value[0] : value;
|
|
138
|
-
}
|
|
139
|
-
getSum(items, attribute) {
|
|
140
|
-
let sum = 0;
|
|
141
|
-
items.forEach((item) => {
|
|
142
|
-
sum += this.getValueFromAttribute(item, attribute).value;
|
|
143
|
-
});
|
|
144
|
-
return sum;
|
|
145
|
-
}
|
|
146
|
-
getMin(items, attribute) {
|
|
147
|
-
const result = items.reduce((prev, curr) => {
|
|
148
|
-
const prevValue = this.getValueFromAttribute(prev, attribute).value;
|
|
149
|
-
const currValue = this.getValueFromAttribute(curr, attribute).value;
|
|
150
|
-
return prevValue < currValue ? prev : curr;
|
|
151
|
-
});
|
|
152
|
-
return this.getValueFromAttribute(result, attribute).value;
|
|
153
|
-
}
|
|
154
|
-
getMax(items, attribute) {
|
|
155
|
-
const result = items.reduce((prev, curr) => {
|
|
156
|
-
const prevValue = this.getValueFromAttribute(prev, attribute).value;
|
|
157
|
-
const currValue = this.getValueFromAttribute(curr, attribute).value;
|
|
158
|
-
return prevValue > currValue ? prev : curr;
|
|
159
|
-
});
|
|
160
|
-
return this.getValueFromAttribute(result, attribute).value;
|
|
161
|
-
}
|
|
162
|
-
getAverage(items, attribute) {
|
|
163
|
-
const allValues = items.map((item) => this.getValueFromAttribute(item, attribute).value);
|
|
164
|
-
return allValues.reduce((acc, val) => acc + val, 0) / allValues.length;
|
|
165
|
-
}
|
|
166
|
-
getDistinct(items, attribute) {
|
|
167
|
-
return [...new Set(items.map((item) => this.getValueFromAttribute(item, attribute).value))].length;
|
|
168
|
-
}
|
|
169
|
-
getQuartile(items, attribute, q) {
|
|
170
|
-
const allValues = items.map((item) => this.getValueFromAttribute(item, attribute).value);
|
|
171
|
-
const allValuesSorted = allValues.sort((a, b) => a - b);
|
|
172
|
-
let pos = (allValuesSorted.length - 1) * q;
|
|
173
|
-
if (pos % 1 === 0) {
|
|
174
|
-
return allValuesSorted[pos];
|
|
175
|
-
}
|
|
176
|
-
pos = Math.floor(pos);
|
|
177
|
-
if (allValuesSorted[pos + 1] !== undefined) {
|
|
178
|
-
return (allValuesSorted[pos] + allValuesSorted[pos + 1]) / 2;
|
|
179
|
-
}
|
|
180
|
-
return allValuesSorted[pos];
|
|
181
|
-
}
|
|
182
|
-
getPercentile(items, attribute, q) {
|
|
183
|
-
const allValues = items.map((item) => this.getValueFromAttribute(item, attribute).value);
|
|
184
|
-
const allValuesSorted = allValues.sort((a, b) => a - b);
|
|
185
|
-
return ((100 * allValuesSorted.reduce((acc, v) => acc + (v < q ? 1 : 0) + (v === q ? 0.5 : 0), 0)) /
|
|
186
|
-
allValuesSorted.length);
|
|
187
|
-
}
|
|
188
|
-
formatByLimit(data, limit) {
|
|
189
|
-
if (!limit.isTimeLimit) {
|
|
190
|
-
data
|
|
191
|
-
.sort((a, b) => (limit.order === 'asc' ? (a.value > b.value ? 1 : -1) : a.value < b.value ? 1 : -1))
|
|
192
|
-
.splice(limit.at);
|
|
193
|
-
return data;
|
|
194
|
-
}
|
|
195
|
-
return data;
|
|
196
|
-
}
|
|
197
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.6", ngImport: i0, type: PryFrontendAggregationService, deps: [{ token: i1.Store }], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
198
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.1.6", ngImport: i0, type: PryFrontendAggregationService, providedIn: 'root' }); }
|
|
199
|
-
}
|
|
200
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.6", ngImport: i0, type: PryFrontendAggregationService, decorators: [{
|
|
201
|
-
type: Injectable,
|
|
202
|
-
args: [{
|
|
203
|
-
providedIn: 'root'
|
|
204
|
-
}]
|
|
205
|
-
}], ctorParameters: function () { return [{ type: i1.Store }]; } });
|
|
206
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnJvbnRlbmQtYWdncmVnYXRpb24uc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3Byb3ZvbHkvZGFzaGJvYXJkL3dpZGdldHMvd2lkZ2V0LWFnZ3JlZ2F0ZWQtY2hhcnQvc2VydmljZS9mcm9udGVuZC1hZ2dyZWdhdGlvbi5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFM0MsT0FBTyxFQUdMLGNBQWMsRUFDZCxrQkFBa0IsRUFFbEIsU0FBUyxFQUNULFNBQVMsRUFDVCxjQUFjLEVBR2YsTUFBTSxvQkFBb0IsQ0FBQztBQUM1QixPQUFPLEVBQUUsYUFBYSxFQUFFLEdBQUcsRUFBYyxNQUFNLE1BQU0sQ0FBQztBQUN0RCxPQUFPLEVBQXFCLHFCQUFxQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7OztBQUt0RixNQUFNLE9BQU8sNkJBQThCLFNBQVEscUJBQXFCO0lBQ3RFLFlBQW9CLEtBQVk7UUFDOUIsS0FBSyxFQUFFLENBQUM7UUFEVSxVQUFLLEdBQUwsS0FBSyxDQUFPO0lBRWhDLENBQUM7SUFFRCxhQUFhO0lBQ0osU0FBUyxDQUFDLFVBQW9CLEVBQUUsT0FBcUM7UUFDNUUsT0FBTyxhQUFhLENBQUM7WUFDbkIsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsa0JBQWtCLENBQUMsVUFBVSxDQUFDO1lBQ2hELElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUM7U0FDMUMsQ0FBQyxDQUFDLElBQUksQ0FDTCxHQUFHLENBQUMsQ0FBQyxDQUFDLFVBQVUsRUFBRSxPQUFPLENBQUMsRUFBRSxFQUFFO1lBQzVCLE1BQU0sUUFBUSxHQUFHLE9BQU87aUJBQ3JCLEdBQUcsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLEtBQUssT0FBTyxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQztpQkFDdkYsSUFBSSxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsSUFBSSxDQUFDO1lBQ2hDLE1BQU0sUUFBUSxHQUFHLE9BQU87aUJBQ3JCLEdBQUcsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLEtBQUssT0FBTyxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQztpQkFDdkYsSUFBSSxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsSUFBSSxDQUFDO1lBQ2hDLElBQUksQ0FBQyxRQUFRLElBQUksQ0FBQyxRQUFRLEVBQUU7Z0JBQzFCLE1BQU0sSUFBSSxLQUFLLENBQUMsMEJBQTBCLENBQUMsQ0FBQzthQUM3QztZQUNELElBQUksSUFBSSxHQUFHLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLFVBQVUsQ0FBQyxNQUFNLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUM3RixNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUMsY0FBYyxDQUFDLGVBQWUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUU7Z0JBQ3BGLEtBQUssRUFBRSxFQUFFO2dCQUNULFNBQVMsRUFBRSxFQUFFO2dCQUNiLE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBTTthQUNwQixDQUFDLENBQUM7WUFDSCxJQUFJLEtBQUssR0FBVyxNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUM7aUJBQzdDLEdBQUcsQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztpQkFDMUMsTUFBTSxDQUFDLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQyxHQUFHLElBQUksRUFBRSxHQUFHLElBQUksQ0FBQyxFQUFFLEVBQUUsQ0FBVyxDQUFDO1lBQzVELElBQUksQ0FBQyxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUU7Z0JBQ3JCLE1BQU0sT0FBTyxHQUFHLE9BQU87cUJBQ3BCLEdBQUcsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLEtBQUssT0FBTyxDQUFDLE9BQU8sRUFBRSxTQUFTLENBQUMsQ0FBQztxQkFDdkYsSUFBSSxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsSUFBSSxDQUFDO2dCQUNoQyxJQUFJLENBQUMsT0FBTyxFQUFFO29CQUNaLE1BQU0sSUFBSSxLQUFLLENBQUMsMkJBQTJCLENBQUMsQ0FBQztpQkFDOUM7Z0JBQ0QsTUFBTSxZQUFZLEdBQXVDLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxDQUFDO2dCQUN0RixNQUFNLE1BQU0sR0FBd0MsRUFBRSxDQUFDO2dCQUN2RCxNQUFNLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFO29CQUN4QyxNQUFNLENBQUMsSUFBSSxDQUFDO3dCQUNWLEdBQUc7d0JBQ0gsT0FBTyxFQUFFLElBQUksQ0FBQyxxQkFBcUIsQ0FDakMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxFQUNqQixPQUFPLENBQUMsUUFBUSxDQUFDLFNBQVMsRUFDMUIsUUFBUSxFQUNSLFFBQVEsRUFDUixPQUFPLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FDdkI7cUJBQ0YsQ0FBQyxDQUFDO2dCQUNMLENBQUMsQ0FBQyxDQUFDO2dCQUNILE9BQU8sRUFBRSxTQUFTLEVBQUUsT0FBTyxDQUFDLFFBQVEsQ0FBQyxTQUFTLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBdUIsQ0FBQzthQUN2RjtZQUNELE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxxQkFBcUIsQ0FDdkMsS0FBSyxFQUNMLE9BQU8sQ0FBQyxRQUFRLENBQUMsU0FBUyxFQUMxQixRQUFRLEVBQ1IsUUFBUSxFQUNSLE9BQU8sQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUN2QixDQUFDO1lBQ0YsT0FBTyxFQUFFLFNBQVMsRUFBRSxPQUFPLENBQUMsUUFBUSxDQUFDLFNBQVMsRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUF1QixDQUFDO1FBQ3hGLENBQUMsQ0FBQyxDQUNILENBQUM7SUFDSixDQUFDO0lBRUQscUJBQXFCLENBQ25CLEtBQWEsRUFDYixTQUFvQixFQUNwQixRQUFnQixFQUNoQixRQUFnQixFQUNoQixLQUEyQjtRQUUzQixJQUFJLE1BQU0sR0FBMkMsRUFBRSxDQUFDO1FBQ3hELE1BQU0sZUFBZSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQ3RELGVBQWUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFTLEVBQUUsRUFBRSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN2RSxRQUFRLFNBQVMsRUFBRTtZQUNqQixLQUFLLFNBQVMsQ0FBQyxLQUFLO2dCQUNsQixNQUFNLENBQUMsSUFBSSxDQUNULEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLENBQUM7b0JBQzVDLEdBQUcsRUFBRSxHQUFHO29CQUNSLEtBQUssRUFBRSxlQUFlLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTTtpQkFDbkMsQ0FBQyxDQUFDLENBQ0osQ0FBQztnQkFDRixNQUFNO1lBQ1IsS0FBSyxTQUFTLENBQUMsR0FBRztnQkFDaEIsTUFBTSxDQUFDLElBQUksQ0FDVCxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxDQUFDO29CQUM1QyxHQUFHLEVBQUUsR0FBRztvQkFDUixLQUFLLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxlQUFlLENBQUMsR0FBRyxDQUFDLEVBQUUsUUFBUSxDQUFDO2lCQUNuRCxDQUFDLENBQUMsQ0FDSixDQUFDO2dCQUNGLE1BQU07WUFDUixLQUFLLFNBQVMsQ0FBQyxRQUFRO2dCQUNyQixNQUFNLENBQUMsSUFBSSxDQUNULEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLENBQUM7b0JBQzVDLEdBQUcsRUFBRSxHQUFHO29CQUNSLEtBQUssRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLGVBQWUsQ0FBQyxHQUFHLENBQUMsRUFBRSxRQUFRLENBQUM7aUJBQ3hELENBQUMsQ0FBQyxDQUNKLENBQUM7Z0JBQ0YsTUFBTTtZQUNSLEtBQUssU0FBUyxDQUFDLE9BQU87Z0JBQ3BCLE1BQU0sQ0FBQyxJQUFJLENBQ1QsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsQ0FBQztvQkFDNUMsR0FBRyxFQUFFLEdBQUc7b0JBQ1IsS0FBSyxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsZUFBZSxDQUFDLEdBQUcsQ0FBQyxFQUFFLFFBQVEsQ0FBQztpQkFDdkQsQ0FBQyxDQUFDLENBQ0osQ0FBQztnQkFDRixNQUFNO1lBQ1IsS0FBSyxTQUFTLENBQUMsTUFBTTtnQkFDbkIsTUFBTSxDQUFDLElBQUksQ0FDVCxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxDQUFDO29CQUM1QyxHQUFHLEVBQUUsR0FBRztvQkFDUixLQUFLLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxlQUFlLENBQUMsR0FBRyxDQUFDLEVBQUUsUUFBUSxFQUFFLEdBQUcsQ0FBQztpQkFDN0QsQ0FBQyxDQUFDLENBQ0osQ0FBQztnQkFDRixNQUFNO1lBQ1IsS0FBSyxTQUFTLENBQUMsRUFBRTtnQkFDZixNQUFNLENBQUMsSUFBSSxDQUNULEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLENBQUM7b0JBQzVDLEdBQUcsRUFBRSxHQUFHO29CQUNSLEtBQUssRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLGVBQWUsQ0FBQyxHQUFHLENBQUMsRUFBRSxRQUFRLEVBQUUsSUFBSSxDQUFDO2lCQUM5RCxDQUFDLENBQUMsQ0FDSixDQUFDO2dCQUNGLE1BQU07WUFDUixLQUFLLFNBQVMsQ0FBQyxFQUFFO2dCQUNmLE1BQU0sQ0FBQyxJQUFJLENBQ1QsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsQ0FBQztvQkFDNUMsR0FBRyxFQUFFLEdBQUc7b0JBQ1IsS0FBSyxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsZUFBZSxDQUFDLEdBQUcsQ0FBQyxFQUFFLFFBQVEsRUFBRSxJQUFJLENBQUM7aUJBQzlELENBQUMsQ0FBQyxDQUNKLENBQUM7Z0JBQ0YsTUFBTTtZQUNSLEtBQUssU0FBUyxDQUFDLEdBQUc7Z0JBQ2hCLE1BQU0sQ0FBQyxJQUFJLENBQ1QsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsQ0FBQztvQkFDNUMsR0FBRyxFQUFFLEdBQUc7b0JBQ1IsS0FBSyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsZUFBZSxDQUFDLEdBQUcsQ0FBQyxFQUFFLFFBQVEsQ0FBQztpQkFDbkQsQ0FBQyxDQUFDLENBQ0osQ0FBQztnQkFDRixNQUFNO1lBQ1I7Z0JBQ0UsTUFBTSxDQUFDLElBQUksQ0FDVCxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxDQUFDO29CQUM1QyxHQUFHLEVBQUUsR0FBRztvQkFDUixLQUFLLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxlQUFlLENBQUMsR0FBRyxDQUFDLEVBQUUsUUFBUSxDQUFDO2lCQUNuRCxDQUFDLENBQUMsQ0FDSixDQUFDO2dCQUNGLE1BQU07U0FDVDtRQUNELElBQUksS0FBSyxFQUFFO1lBQ1QsTUFBTSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxDQUFDO1NBQzVDO1FBQ0QsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQztJQUVELE9BQU8sQ0FBQyxLQUFhLEVBQUUsU0FBaUI7UUFDdEMsSUFBSSxTQUFTLEdBQVEsRUFBRSxDQUFDO1FBQ3hCLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFVLEVBQUUsRUFBRTtZQUMzQixJQUFJLEtBQUssR0FBRyxJQUFJLENBQUMscUJBQXFCLENBQUMsSUFBSSxFQUFFLFNBQVMsQ0FBQyxDQUFDO1lBQ3hELElBQUksU0FBUyxDQUFDLEtBQUssQ0FBQyxLQUF3QixDQUFDLEVBQUU7Z0JBQzdDLFNBQVMsQ0FBQyxLQUFLLENBQUMsS0FBd0IsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQzthQUN0RDtpQkFBTTtnQkFDTCxTQUFTLENBQUMsS0FBSyxDQUFDLEtBQXdCLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO2FBQ3BEO1FBQ0gsQ0FBQyxDQUFDLENBQUM7UUFDSCxPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDO0lBRUQscUJBQXFCLENBQUMsSUFBVSxFQUFFLFNBQWlCO1FBQ2pELElBQUksS0FBSyxHQUFHLFNBQVMsQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFDekQsT0FBTyxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztJQUNqRCxDQUFDO0lBRUQsTUFBTSxDQUFDLEtBQWEsRUFBRSxTQUFpQjtRQUNyQyxJQUFJLEdBQUcsR0FBVyxDQUFDLENBQUM7UUFDcEIsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFO1lBQ3JCLEdBQUcsSUFBSSxJQUFJLENBQUMscUJBQXFCLENBQUMsSUFBSSxFQUFFLFNBQVMsQ0FBQyxDQUFDLEtBQWUsQ0FBQztRQUNyRSxDQUFDLENBQUMsQ0FBQztRQUNILE9BQU8sR0FBRyxDQUFDO0lBQ2IsQ0FBQztJQUVELE1BQU0sQ0FBQyxLQUFhLEVBQUUsU0FBaUI7UUFDckMsTUFBTSxNQUFNLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQVMsRUFBRSxJQUFTLEVBQUUsRUFBRTtZQUNuRCxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMscUJBQXFCLENBQUMsSUFBSSxFQUFFLFNBQVMsQ0FBQyxDQUFDLEtBQUssQ0FBQztZQUNwRSxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMscUJBQXFCLENBQUMsSUFBSSxFQUFFLFNBQVMsQ0FBQyxDQUFDLEtBQUssQ0FBQztZQUNwRSxPQUFPLFNBQVMsR0FBRyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO1FBQzdDLENBQUMsQ0FBQyxDQUFDO1FBQ0gsT0FBTyxJQUFJLENBQUMscUJBQXFCLENBQUMsTUFBTSxFQUFFLFNBQVMsQ0FBQyxDQUFDLEtBQUssQ0FBQztJQUM3RCxDQUFDO0lBRUQsTUFBTSxDQUFDLEtBQWEsRUFBRSxTQUFpQjtRQUNyQyxNQUFNLE1BQU0sR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBUyxFQUFFLElBQVMsRUFBRSxFQUFFO1lBQ25ELE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxJQUFJLEVBQUUsU0FBUyxDQUFDLENBQUMsS0FBSyxDQUFDO1lBQ3BFLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxJQUFJLEVBQUUsU0FBUyxDQUFDLENBQUMsS0FBSyxDQUFDO1lBQ3BFLE9BQU8sU0FBUyxHQUFHLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7UUFDN0MsQ0FBQyxDQUFDLENBQUM7UUFDSCxPQUFPLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxNQUFNLEVBQUUsU0FBUyxDQUFDLENBQUMsS0FBSyxDQUFDO0lBQzdELENBQUM7SUFFRCxVQUFVLENBQUMsS0FBYSxFQUFFLFNBQWlCO1FBQ3pDLE1BQU0sU0FBUyxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxJQUFJLEVBQUUsU0FBUyxDQUFDLENBQUMsS0FBZSxDQUFDLENBQUM7UUFDbkcsT0FBTyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUMsR0FBRyxHQUFHLEdBQUcsRUFBRSxDQUFDLENBQUMsR0FBRyxTQUFTLENBQUMsTUFBTSxDQUFDO0lBQ3pFLENBQUM7SUFFRCxXQUFXLENBQUMsS0FBYSxFQUFFLFNBQWlCO1FBQzFDLE9BQU8sQ0FBQyxHQUFHLElBQUksR0FBRyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxJQUFJLEVBQUUsU0FBUyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQztJQUNyRyxDQUFDO0lBRUQsV0FBVyxDQUFDLEtBQWEsRUFBRSxTQUFpQixFQUFFLENBQVM7UUFDckQsTUFBTSxTQUFTLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLHFCQUFxQixDQUFDLElBQUksRUFBRSxTQUFTLENBQUMsQ0FBQyxLQUFlLENBQUMsQ0FBQztRQUNuRyxNQUFNLGVBQWUsR0FBRyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBUyxFQUFFLENBQVMsRUFBRSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBRXhFLElBQUksR0FBRyxHQUFHLENBQUMsZUFBZSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDM0MsSUFBSSxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsRUFBRTtZQUNqQixPQUFPLGVBQWUsQ0FBQyxHQUFHLENBQUMsQ0FBQztTQUM3QjtRQUVELEdBQUcsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3RCLElBQUksZUFBZSxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsS0FBSyxTQUFTLEVBQUU7WUFDMUMsT0FBTyxDQUFDLGVBQWUsQ0FBQyxHQUFHLENBQUMsR0FBRyxlQUFlLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1NBQzlEO1FBRUQsT0FBTyxlQUFlLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDOUIsQ0FBQztJQUVELGFBQWEsQ0FBQyxLQUFhLEVBQUUsU0FBaUIsRUFBRSxDQUFTO1FBQ3ZELE1BQU0sU0FBUyxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxJQUFJLEVBQUUsU0FBUyxDQUFDLENBQUMsS0FBZSxDQUFDLENBQUM7UUFDbkcsTUFBTSxlQUFlLEdBQUcsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQVMsRUFBRSxDQUFTLEVBQUUsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUN4RSxPQUFPLENBQ0wsQ0FBQyxHQUFHLEdBQUcsZUFBZSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQzFGLGVBQWUsQ0FBQyxNQUFNLENBQ3ZCLENBQUM7SUFDSixDQUFDO0lBRUQsYUFBYSxDQUFDLElBQTRDLEVBQUUsS0FBMEI7UUFDcEYsSUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFXLEVBQUU7WUFDdEIsSUFBSTtpQkFDRCxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxLQUFLLEtBQUssS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztpQkFDbkcsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUNwQixPQUFPLElBQUksQ0FBQztTQUNiO1FBQ0QsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDOzhHQWxQVSw2QkFBNkI7a0hBQTdCLDZCQUE2QixjQUY1QixNQUFNOzsyRkFFUCw2QkFBNkI7a0JBSHpDLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgU3RvcmUgfSBmcm9tICdAbmdyeC9zdG9yZSc7XG5pbXBvcnQge1xuICBBdExpbWl0LFxuICBDaGFydEFnZ3JlZ2F0ZWRXaWRnZXRPcHRpb25zLFxuICBDbGFzc1NlbGVjdG9ycyxcbiAgRGFzaGJvYXJkU2VsZWN0b3JzLFxuICBJdGVtLFxuICBJdGVtVXRpbHMsXG4gIE9wZXJhdGlvbixcbiAgUmVzdWx0c2V0VXRpbHMsXG4gIFRpbWVMaW1pdCxcbiAgVmFsdWVUeXBlXG59IGZyb20gJ0Bwcm92b2x5L2Rhc2hib2FyZCc7XG5pbXBvcnQgeyBjb21iaW5lTGF0ZXN0LCBtYXAsIE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IEFnZ3JlZ2F0aW9uUmVzdWx0LCBQcnlBZ2dyZWdhdGlvblNlcnZpY2UgfSBmcm9tICcuL2Jhc2UtYWdncmVnYXRpb24uc2VydmljZSc7XG5cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnXG59KVxuZXhwb3J0IGNsYXNzIFByeUZyb250ZW5kQWdncmVnYXRpb25TZXJ2aWNlIGV4dGVuZHMgUHJ5QWdncmVnYXRpb25TZXJ2aWNlIHtcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBzdG9yZTogU3RvcmUpIHtcbiAgICBzdXBlcigpO1xuICB9XG5cbiAgLy8gQHRzLWlnbm9yZVxuICBvdmVycmlkZSBhZ2dyZWdhdGUoZGF0YXNvdXJjZTogc3RyaW5nW10sIG9wdGlvbnM6IENoYXJ0QWdncmVnYXRlZFdpZGdldE9wdGlvbnMpOiBPYnNlcnZhYmxlPEFnZ3JlZ2F0aW9uUmVzdWx0PiB7XG4gICAgcmV0dXJuIGNvbWJpbmVMYXRlc3QoW1xuICAgICAgdGhpcy5zdG9yZS5zZWxlY3QoRGFzaGJvYXJkU2VsZWN0b3JzLnJlc3VsdFNldHMpLFxuICAgICAgdGhpcy5zdG9yZS5zZWxlY3QoQ2xhc3NTZWxlY3RvcnMuY2xhc3NlcylcbiAgICBdKS5waXBlKFxuICAgICAgbWFwKChbcmVzdWx0U2V0cywgY2xhc3Nlc10pID0+IHtcbiAgICAgICAgY29uc3QgYWJzY2lzc2EgPSBjbGFzc2VzXG4gICAgICAgICAgLm1hcCgoY2xhenopID0+IGNsYXp6LmF0dHJpYnV0ZXMuZmluZCgoYXR0cikgPT4gYXR0ci5pZCA9PT0gb3B0aW9ucy5hYnNjaXNzYS5hdHRyaWJ1dGUpKVxuICAgICAgICAgIC5maW5kKChhdHRyKSA9PiAhIWF0dHIpPy5uYW1lO1xuICAgICAgICBjb25zdCBvcmRpbmF0ZSA9IGNsYXNzZXNcbiAgICAgICAgICAubWFwKChjbGF6eikgPT4gY2xhenouYXR0cmlidXRlcy5maW5kKChhdHRyKSA9PiBhdHRyLmlkID09PSBvcHRpb25zLm9yZGluYXRlLmF0dHJpYnV0ZSkpXG4gICAgICAgICAgLmZpbmQoKGF0dHIpID0+ICEhYXR0cik/Lm5hbWU7XG4gICAgICAgIGlmICghYWJzY2lzc2EgfHwgIW9yZGluYXRlKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdhYnNjaXNzYW9yb2RpbmF0ZWludmFsaWQnKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgZGF0YSA9IGRhdGFzb3VyY2UubWFwKChyc05hbWUpID0+IHJlc3VsdFNldHNbcnNOYW1lID8/ICcnXSkuZmlsdGVyKChyc05hbWUpID0+ICEhcnNOYW1lKTtcbiAgICAgICAgY29uc3QgcmVzdWx0U2V0ID0gZGF0YS5yZWR1Y2UoKHJzMSwgcnMyKSA9PiBSZXN1bHRzZXRVdGlscy5tZXJnZVJlc3VsdFNldHMocnMxLCByczIpLCB7XG4gICAgICAgICAgaXRlbXM6IHt9LFxuICAgICAgICAgIHJlbGF0aW9uczogW10sXG4gICAgICAgICAgbWVyZ2VkOiBkYXRhLmxlbmd0aFxuICAgICAgICB9KTtcbiAgICAgICAgbGV0IGl0ZW1zOiBJdGVtW10gPSBPYmplY3Qua2V5cyhyZXN1bHRTZXQuaXRlbXMpXG4gICAgICAgICAgLm1hcCgoY2xhc3NJZCkgPT4gcmVzdWx0U2V0Lml0ZW1zW2NsYXNzSWRdKVxuICAgICAgICAgIC5yZWR1Y2UoKHByZXYsIGN1cnIpID0+IFsuLi5wcmV2LCAuLi5jdXJyXSwgW10pIGFzIEl0ZW1bXTtcbiAgICAgICAgaWYgKCEhb3B0aW9ucy5ncm91cEJ5KSB7XG4gICAgICAgICAgY29uc3QgZ3JvdXBCeSA9IGNsYXNzZXNcbiAgICAgICAgICAgIC5tYXAoKGNsYXp6KSA9PiBjbGF6ei5hdHRyaWJ1dGVzLmZpbmQoKGF0dHIpID0+IGF0dHIuaWQgPT09IG9wdGlvbnMuZ3JvdXBCeT8uYXR0cmlidXRlKSlcbiAgICAgICAgICAgIC5maW5kKChhdHRyKSA9PiAhIWF0dHIpPy5uYW1lO1xuICAgICAgICAgIGlmICghZ3JvdXBCeSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdncm91cEJ5QXR0cmlidXRlaXNpbnZhbGlkJyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IGl0ZW1zR3JvdXBlZDogeyBba2V5OiBzdHJpbmcgfCBudW1iZXJdOiBJdGVtW10gfSA9IHRoaXMuZ3JvdXBCeShpdGVtcywgZ3JvdXBCeSk7XG4gICAgICAgICAgY29uc3QgdmFsdWVzOiB7IGtleTogVmFsdWVUeXBlOyBncm91cEJ5OiB7fVtdIH1bXSA9IFtdO1xuICAgICAgICAgIE9iamVjdC5rZXlzKGl0ZW1zR3JvdXBlZCkuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICAgICAgICB2YWx1ZXMucHVzaCh7XG4gICAgICAgICAgICAgIGtleSxcbiAgICAgICAgICAgICAgZ3JvdXBCeTogdGhpcy5nZXRWYWx1ZUZyb21PcGVyYXRpb24oXG4gICAgICAgICAgICAgICAgaXRlbXNHcm91cGVkW2tleV0sXG4gICAgICAgICAgICAgICAgb3B0aW9ucy5vcmRpbmF0ZS5vcGVyYXRpb24sXG4gICAgICAgICAgICAgICAgYWJzY2lzc2EsXG4gICAgICAgICAgICAgICAgb3JkaW5hdGUsXG4gICAgICAgICAgICAgICAgb3B0aW9ucy5hYnNjaXNzYS5saW1pdFxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICByZXR1cm4geyBvcGVyYXRpb246IG9wdGlvbnMub3JkaW5hdGUub3BlcmF0aW9uLCB2YWx1ZXM6IHZhbHVlcyB9IGFzIEFnZ3JlZ2F0aW9uUmVzdWx0O1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHZhbHVlcyA9IHRoaXMuZ2V0VmFsdWVGcm9tT3BlcmF0aW9uKFxuICAgICAgICAgIGl0ZW1zLFxuICAgICAgICAgIG9wdGlvbnMub3JkaW5hdGUub3BlcmF0aW9uLFxuICAgICAgICAgIGFic2Npc3NhLFxuICAgICAgICAgIG9yZGluYXRlLFxuICAgICAgICAgIG9wdGlvbnMuYWJzY2lzc2EubGltaXRcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIHsgb3BlcmF0aW9uOiBvcHRpb25zLm9yZGluYXRlLm9wZXJhdGlvbiwgdmFsdWVzOiB2YWx1ZXMgfSBhcyBBZ2dyZWdhdGlvblJlc3VsdDtcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIGdldFZhbHVlRnJvbU9wZXJhdGlvbihcbiAgICBpdGVtczogSXRlbVtdLFxuICAgIG9wZXJhdGlvbjogT3BlcmF0aW9uLFxuICAgIGFic2Npc3NhOiBzdHJpbmcsXG4gICAgb3JkaW5hdGU6IHN0cmluZyxcbiAgICBsaW1pdD86IEF0TGltaXQgfCBUaW1lTGltaXRcbiAgKSB7XG4gICAgbGV0IHJlc3VsdDogeyBrZXk6IFZhbHVlVHlwZTsgdmFsdWU6IFZhbHVlVHlwZSB9W10gPSBbXTtcbiAgICBjb25zdCBncm91cEJ5QWJzY2lzc2EgPSB0aGlzLmdyb3VwQnkoaXRlbXMsIGFic2Npc3NhKTtcbiAgICBncm91cEJ5QWJzY2lzc2EubWFwKCh0ZXN0OiBhbnkpID0+IGNvbnNvbGUubG9nKGdyb3VwQnlBYnNjaXNzYVt0ZXN0XSkpO1xuICAgIHN3aXRjaCAob3BlcmF0aW9uKSB7XG4gICAgICBjYXNlIE9wZXJhdGlvbi5DT1VOVDpcbiAgICAgICAgcmVzdWx0LnB1c2goXG4gICAgICAgICAgLi4uT2JqZWN0LmtleXMoZ3JvdXBCeUFic2Npc3NhKS5tYXAoKGtleSkgPT4gKHtcbiAgICAgICAgICAgIGtleToga2V5LFxuICAgICAgICAgICAgdmFsdWU6IGdyb3VwQnlBYnNjaXNzYVtrZXldLmxlbmd0aFxuICAgICAgICAgIH0pKVxuICAgICAgICApO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgT3BlcmF0aW9uLlNVTTpcbiAgICAgICAgcmVzdWx0LnB1c2goXG4gICAgICAgICAgLi4uT2JqZWN0LmtleXMoZ3JvdXBCeUFic2Npc3NhKS5tYXAoKGtleSkgPT4gKHtcbiAgICAgICAgICAgIGtleToga2V5LFxuICAgICAgICAgICAgdmFsdWU6IHRoaXMuZ2V0U3VtKGdyb3VwQnlBYnNjaXNzYVtrZXldLCBvcmRpbmF0ZSlcbiAgICAgICAgICB9KSlcbiAgICAgICAgKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIE9wZXJhdGlvbi5ESVNUSU5DVDpcbiAgICAgICAgcmVzdWx0LnB1c2goXG4gICAgICAgICAgLi4uT2JqZWN0LmtleXMoZ3JvdXBCeUFic2Npc3NhKS5tYXAoKGtleSkgPT4gKHtcbiAgICAgICAgICAgIGtleToga2V5LFxuICAgICAgICAgICAgdmFsdWU6IHRoaXMuZ2V0RGlzdGluY3QoZ3JvdXBCeUFic2Npc3NhW2tleV0sIG9yZGluYXRlKVxuICAgICAgICAgIH0pKVxuICAgICAgICApO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgT3BlcmF0aW9uLkFWRVJBR0U6XG4gICAgICAgIHJlc3VsdC5wdXNoKFxuICAgICAgICAgIC4uLk9iamVjdC5rZXlzKGdyb3VwQnlBYnNjaXNzYSkubWFwKChrZXkpID0+ICh7XG4gICAgICAgICAgICBrZXk6IGtleSxcbiAgICAgICAgICAgIHZhbHVlOiB0aGlzLmdldEF2ZXJhZ2UoZ3JvdXBCeUFic2Npc3NhW2tleV0sIG9yZGluYXRlKVxuICAgICAgICAgIH0pKVxuICAgICAgICApO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgT3BlcmF0aW9uLk1FRElBTjpcbiAgICAgICAgcmVzdWx0LnB1c2goXG4gICAgICAgICAgLi4uT2JqZWN0LmtleXMoZ3JvdXBCeUFic2Npc3NhKS5tYXAoKGtleSkgPT4gKHtcbiAgICAgICAgICAgIGtleToga2V5LFxuICAgICAgICAgICAgdmFsdWU6IHRoaXMuZ2V0UXVhcnRpbGUoZ3JvdXBCeUFic2Npc3NhW2tleV0sIG9yZGluYXRlLCAwLjUpXG4gICAgICAgICAgfSkpXG4gICAgICAgICk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBPcGVyYXRpb24uUTE6XG4gICAgICAgIHJlc3VsdC5wdXNoKFxuICAgICAgICAgIC4uLk9iamVjdC5rZXlzKGdyb3VwQnlBYnNjaXNzYSkubWFwKChrZXkpID0+ICh7XG4gICAgICAgICAgICBrZXk6IGtleSxcbiAgICAgICAgICAgIHZhbHVlOiB0aGlzLmdldFF1YXJ0aWxlKGdyb3VwQnlBYnNjaXNzYVtrZXldLCBvcmRpbmF0ZSwgMC4yNSlcbiAgICAgICAgICB9KSlcbiAgICAgICAgKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIE9wZXJhdGlvbi5RMzpcbiAgICAgICAgcmVzdWx0LnB1c2goXG4gICAgICAgICAgLi4uT2JqZWN0LmtleXMoZ3JvdXBCeUFic2Npc3NhKS5tYXAoKGtleSkgPT4gKHtcbiAgICAgICAgICAgIGtleToga2V5LFxuICAgICAgICAgICAgdmFsdWU6IHRoaXMuZ2V0UXVhcnRpbGUoZ3JvdXBCeUFic2Npc3NhW2tleV0sIG9yZGluYXRlLCAwLjc1KVxuICAgICAgICAgIH0pKVxuICAgICAgICApO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgT3BlcmF0aW9uLk1JTjpcbiAgICAgICAgcmVzdWx0LnB1c2goXG4gICAgICAgICAgLi4uT2JqZWN0LmtleXMoZ3JvdXBCeUFic2Npc3NhKS5tYXAoKGtleSkgPT4gKHtcbiAgICAgICAgICAgIGtleToga2V5LFxuICAgICAgICAgICAgdmFsdWU6IHRoaXMuZ2V0TWluKGdyb3VwQnlBYnNjaXNzYVtrZXldLCBvcmRpbmF0ZSlcbiAgICAgICAgICB9KSlcbiAgICAgICAgKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXN1bHQucHVzaChcbiAgICAgICAgICAuLi5PYmplY3Qua2V5cyhncm91cEJ5QWJzY2lzc2EpLm1hcCgoa2V5KSA9PiAoe1xuICAgICAgICAgICAga2V5OiBrZXksXG4gICAgICAgICAgICB2YWx1ZTogdGhpcy5nZXRNYXgoZ3JvdXBCeUFic2Npc3NhW2tleV0sIG9yZGluYXRlKVxuICAgICAgICAgIH0pKVxuICAgICAgICApO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gICAgaWYgKGxpbWl0KSB7XG4gICAgICByZXN1bHQgPSB0aGlzLmZvcm1hdEJ5TGltaXQocmVzdWx0LCBsaW1pdCk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBncm91cEJ5KGl0ZW1zOiBJdGVtW10sIGF0dHJpYnV0ZTogc3RyaW5nKSB7XG4gICAgbGV0IGRpc3RpbmN0czogYW55ID0gW107XG4gICAgaXRlbXMuZm9yRWFjaCgoaXRlbTogSXRlbSkgPT4ge1xuICAgICAgbGV0IHZhbHVlID0gdGhpcy5nZXRWYWx1ZUZyb21BdHRyaWJ1dGUoaXRlbSwgYXR0cmlidXRlKTtcbiAgICAgIGlmIChkaXN0aW5jdHNbdmFsdWUudmFsdWUgYXMgc3RyaW5nIHwgbnVtYmVyXSkge1xuICAgICAgICBkaXN0aW5jdHNbdmFsdWUudmFsdWUgYXMgc3RyaW5nIHwgbnVtYmVyXS5wdXNoKGl0ZW0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGlzdGluY3RzW3ZhbHVlLnZhbHVlIGFzIHN0cmluZyB8IG51bWJlcl0gPSBbaXRlbV07XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIGRpc3RpbmN0cztcbiAgfVxuXG4gIGdldFZhbHVlRnJvbUF0dHJpYnV0ZShpdGVtOiBJdGVtLCBhdHRyaWJ1dGU6IHN0cmluZykge1xuICAgIGxldCB2YWx1ZSA9IEl0ZW1VdGlscy5nZXRBdHRyaWJ1dGVWYWx1ZShpdGVtLCBhdHRyaWJ1dGUpO1xuICAgIHJldHVybiBBcnJheS5pc0FycmF5KHZhbHVlKSA/IHZhbHVlWzBdIDogdmFsdWU7XG4gIH1cblxuICBnZXRTdW0oaXRlbXM6IEl0ZW1bXSwgYXR0cmlidXRlOiBzdHJpbmcpIHtcbiAgICBsZXQgc3VtOiBudW1iZXIgPSAwO1xuICAgIGl0ZW1zLmZvckVhY2goKGl0ZW0pID0+IHtcbiAgICAgIHN1bSArPSB0aGlzLmdldFZhbHVlRnJvbUF0dHJpYnV0ZShpdGVtLCBhdHRyaWJ1dGUpLnZhbHVlIGFzIG51bWJlcjtcbiAgICB9KTtcbiAgICByZXR1cm4gc3VtO1xuICB9XG5cbiAgZ2V0TWluKGl0ZW1zOiBJdGVtW10sIGF0dHJpYnV0ZTogc3RyaW5nKSB7XG4gICAgY29uc3QgcmVzdWx0ID0gaXRlbXMucmVkdWNlKChwcmV2OiBhbnksIGN1cnI6IGFueSkgPT4ge1xuICAgICAgY29uc3QgcHJldlZhbHVlID0gdGhpcy5nZXRWYWx1ZUZyb21BdHRyaWJ1dGUocHJldiwgYXR0cmlidXRlKS52YWx1ZTtcbiAgICAgIGNvbnN0IGN1cnJWYWx1ZSA9IHRoaXMuZ2V0VmFsdWVGcm9tQXR0cmlidXRlKGN1cnIsIGF0dHJpYnV0ZSkudmFsdWU7XG4gICAgICByZXR1cm4gcHJldlZhbHVlIDwgY3VyclZhbHVlID8gcHJldiA6IGN1cnI7XG4gICAgfSk7XG4gICAgcmV0dXJuIHRoaXMuZ2V0VmFsdWVGcm9tQXR0cmlidXRlKHJlc3VsdCwgYXR0cmlidXRlKS52YWx1ZTtcbiAgfVxuXG4gIGdldE1heChpdGVtczogSXRlbVtdLCBhdHRyaWJ1dGU6IHN0cmluZykge1xuICAgIGNvbnN0IHJlc3VsdCA9IGl0ZW1zLnJlZHVjZSgocHJldjogYW55LCBjdXJyOiBhbnkpID0+IHtcbiAgICAgIGNvbnN0IHByZXZWYWx1ZSA9IHRoaXMuZ2V0VmFsdWVGcm9tQXR0cmlidXRlKHByZXYsIGF0dHJpYnV0ZSkudmFsdWU7XG4gICAgICBjb25zdCBjdXJyVmFsdWUgPSB0aGlzLmdldFZhbHVlRnJvbUF0dHJpYnV0ZShjdXJyLCBhdHRyaWJ1dGUpLnZhbHVlO1xuICAgICAgcmV0dXJuIHByZXZWYWx1ZSA+IGN1cnJWYWx1ZSA/IHByZXYgOiBjdXJyO1xuICAgIH0pO1xuICAgIHJldHVybiB0aGlzLmdldFZhbHVlRnJvbUF0dHJpYnV0ZShyZXN1bHQsIGF0dHJpYnV0ZSkudmFsdWU7XG4gIH1cblxuICBnZXRBdmVyYWdlKGl0ZW1zOiBJdGVtW10sIGF0dHJpYnV0ZTogc3RyaW5nKSB7XG4gICAgY29uc3QgYWxsVmFsdWVzID0gaXRlbXMubWFwKChpdGVtKSA9PiB0aGlzLmdldFZhbHVlRnJvbUF0dHJpYnV0ZShpdGVtLCBhdHRyaWJ1dGUpLnZhbHVlIGFzIG51bWJlcik7XG4gICAgcmV0dXJuIGFsbFZhbHVlcy5yZWR1Y2UoKGFjYywgdmFsKSA9PiBhY2MgKyB2YWwsIDApIC8gYWxsVmFsdWVzLmxlbmd0aDtcbiAgfVxuXG4gIGdldERpc3RpbmN0KGl0ZW1zOiBJdGVtW10sIGF0dHJpYnV0ZTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIFsuLi5uZXcgU2V0KGl0ZW1zLm1hcCgoaXRlbSkgPT4gdGhpcy5nZXRWYWx1ZUZyb21BdHRyaWJ1dGUoaXRlbSwgYXR0cmlidXRlKS52YWx1ZSkpXS5sZW5ndGg7XG4gIH1cblxuICBnZXRRdWFydGlsZShpdGVtczogSXRlbVtdLCBhdHRyaWJ1dGU6IHN0cmluZywgcTogbnVtYmVyKSB7XG4gICAgY29uc3QgYWxsVmFsdWVzID0gaXRlbXMubWFwKChpdGVtKSA9PiB0aGlzLmdldFZhbHVlRnJvbUF0dHJpYnV0ZShpdGVtLCBhdHRyaWJ1dGUpLnZhbHVlIGFzIG51bWJlcik7XG4gICAgY29uc3QgYWxsVmFsdWVzU29ydGVkID0gYWxsVmFsdWVzLnNvcnQoKGE6IG51bWJlciwgYjogbnVtYmVyKSA9PiBhIC0gYik7XG5cbiAgICBsZXQgcG9zID0gKGFsbFZhbHVlc1NvcnRlZC5sZW5ndGggLSAxKSAqIHE7XG4gICAgaWYgKHBvcyAlIDEgPT09IDApIHtcbiAgICAgIHJldHVybiBhbGxWYWx1ZXNTb3J0ZWRbcG9zXTtcbiAgICB9XG5cbiAgICBwb3MgPSBNYXRoLmZsb29yKHBvcyk7XG4gICAgaWYgKGFsbFZhbHVlc1NvcnRlZFtwb3MgKyAxXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gKGFsbFZhbHVlc1NvcnRlZFtwb3NdICsgYWxsVmFsdWVzU29ydGVkW3BvcyArIDFdKSAvIDI7XG4gICAgfVxuXG4gICAgcmV0dXJuIGFsbFZhbHVlc1NvcnRlZFtwb3NdO1xuICB9XG5cbiAgZ2V0UGVyY2VudGlsZShpdGVtczogSXRlbVtdLCBhdHRyaWJ1dGU6IHN0cmluZywgcTogbnVtYmVyKSB7XG4gICAgY29uc3QgYWxsVmFsdWVzID0gaXRlbXMubWFwKChpdGVtKSA9PiB0aGlzLmdldFZhbHVlRnJvbUF0dHJpYnV0ZShpdGVtLCBhdHRyaWJ1dGUpLnZhbHVlIGFzIG51bWJlcik7XG4gICAgY29uc3QgYWxsVmFsdWVzU29ydGVkID0gYWxsVmFsdWVzLnNvcnQoKGE6IG51bWJlciwgYjogbnVtYmVyKSA9PiBhIC0gYik7XG4gICAgcmV0dXJuIChcbiAgICAgICgxMDAgKiBhbGxWYWx1ZXNTb3J0ZWQucmVkdWNlKChhY2MsIHYpID0+IGFjYyArICh2IDwgcSA/IDEgOiAwKSArICh2ID09PSBxID8gMC41IDogMCksIDApKSAvXG4gICAgICBhbGxWYWx1ZXNTb3J0ZWQubGVuZ3RoXG4gICAgKTtcbiAgfVxuXG4gIGZvcm1hdEJ5TGltaXQoZGF0YTogeyBrZXk6IFZhbHVlVHlwZTsgdmFsdWU6IFZhbHVlVHlwZSB9W10sIGxpbWl0OiBBdExpbWl0IHwgVGltZUxpbWl0KSB7XG4gICAgaWYgKCFsaW1pdC5pc1RpbWVMaW1pdCkge1xuICAgICAgZGF0YVxuICAgICAgICAuc29ydCgoYSwgYikgPT4gKGxpbWl0Lm9yZGVyID09PSAnYXNjJyA/IChhLnZhbHVlID4gYi52YWx1ZSA/IDEgOiAtMSkgOiBhLnZhbHVlIDwgYi52YWx1ZSA/IDEgOiAtMSkpXG4gICAgICAgIC5zcGxpY2UobGltaXQuYXQpO1xuICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfVxuICAgIHJldHVybiBkYXRhO1xuICB9XG59XG4iXX0=
|