@colijnit/corecomponents_v12 255.1.10 → 255.1.11
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/bundles/colijnit-corecomponents_v12.umd.js +104 -35
- package/bundles/colijnit-corecomponents_v12.umd.js.map +1 -1
- package/colijnit-corecomponents_v12.metadata.json +1 -1
- package/esm2015/lib/components/hour-scheduling/hour-scheduling.component.js +170 -59
- package/fesm2015/colijnit-corecomponents_v12.js +169 -58
- package/fesm2015/colijnit-corecomponents_v12.js.map +1 -1
- package/lib/components/hour-scheduling/hour-scheduling.component.d.ts +19 -7
- package/lib/components/hour-scheduling/style/_layout.scss +30 -13
- package/package.json +1 -1
|
@@ -5,45 +5,57 @@ export class HourSchedulingComponent {
|
|
|
5
5
|
this.cdRef = cdRef;
|
|
6
6
|
this.datePipe = datePipe;
|
|
7
7
|
this.showClass = true;
|
|
8
|
-
this.
|
|
8
|
+
this.hourLabels = [];
|
|
9
9
|
this.scheduledObjects = {};
|
|
10
|
+
this.activeHour = null;
|
|
11
|
+
this.activeHalfHour = null;
|
|
10
12
|
this.draggedObject = null;
|
|
11
13
|
this.customTemplateUsed = false;
|
|
12
14
|
this.timeChangeEvent = new EventEmitter();
|
|
15
|
+
this.newObjectPlanEvent = new EventEmitter();
|
|
16
|
+
document.addEventListener('click', this.onDocumentClick.bind(this));
|
|
13
17
|
}
|
|
14
18
|
ngOnInit() {
|
|
15
|
-
if (!this.childProp) {
|
|
16
|
-
this.startTime = parseInt(this.datePipe.transform(new Date(this.schedule[this.startTimeProp]).toISOString(), 'H:mm'));
|
|
17
|
-
this.endTime = parseInt(this.datePipe.transform(new Date(this.schedule[this.endTimeProp]).toISOString(), 'H:mm'));
|
|
18
|
-
}
|
|
19
|
-
else {
|
|
20
|
-
this.startTime = parseInt(this.datePipe.transform(new Date(this.schedule[this.childProp][this.startTimeProp]).toISOString(), 'H:mm'));
|
|
21
|
-
this.endTime = parseInt(this.datePipe.transform(new Date(this.schedule[this.childProp][this.endTimeProp]).toISOString(), 'H:mm'));
|
|
22
|
-
}
|
|
23
19
|
this.generateTimeBlocks();
|
|
20
|
+
this.generateScheduledObjects();
|
|
21
|
+
}
|
|
22
|
+
ngOnDestroy() {
|
|
23
|
+
document.removeEventListener('click', this.onDocumentClick.bind(this));
|
|
24
24
|
}
|
|
25
25
|
generateTimeBlocks() {
|
|
26
|
+
let startUnix = !this.childProp ? this.dateToUnixEpoch(new Date(this.schedule[this.startTimeProp])) : this.dateToUnixEpoch(new Date(this.schedule[this.childProp][this.startTimeProp]));
|
|
27
|
+
let endUnix = !this.childProp ? this.dateToUnixEpoch(new Date(this.schedule[this.endTimeProp])) : this.dateToUnixEpoch(new Date(this.schedule[this.childProp][this.endTimeProp]));
|
|
28
|
+
let interval = 60 * 60;
|
|
29
|
+
for (let hourCount = startUnix; hourCount <= endUnix; hourCount += interval) {
|
|
30
|
+
let hour = new Date(hourCount * 1000);
|
|
31
|
+
let hourString = `${hour.getHours()}:${hour.getMinutes() === 0 ? '00' : hour.getMinutes()}`;
|
|
32
|
+
this.hourLabels.push(hourString);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
generateScheduledObjects() {
|
|
26
36
|
const objectsList = this.schedule[this.objectsProp];
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
37
|
+
let startUnix = !this.childProp ? this.dateToUnixEpoch(new Date(this.schedule[this.startTimeProp])) : this.dateToUnixEpoch(new Date(this.schedule[this.childProp][this.startTimeProp]));
|
|
38
|
+
let endUnix = !this.childProp ? this.dateToUnixEpoch(new Date(this.schedule[this.endTimeProp])) : this.dateToUnixEpoch(new Date(this.schedule[this.childProp][this.endTimeProp]));
|
|
39
|
+
let interval = 30 * 60;
|
|
40
|
+
for (let hourCount = startUnix; hourCount <= endUnix; hourCount += interval) {
|
|
41
|
+
let hour = new Date(hourCount * 1000);
|
|
42
|
+
let hourString = `${hour.getHours()}:${hour.getMinutes() === 0 ? '00' : hour.getMinutes()}`;
|
|
43
|
+
this.scheduledObjects[hourString] = this._getObjectsForHourAndMinutes(hour.getHours(), hour.getMinutes(), objectsList);
|
|
30
44
|
}
|
|
31
45
|
}
|
|
32
|
-
|
|
46
|
+
_getObjectsForHourAndMinutes(hour, minutes, objectsList) {
|
|
33
47
|
const objectsForHour = [];
|
|
34
48
|
objectsList.forEach((obj) => {
|
|
35
|
-
|
|
49
|
+
let split = this.convertToHourNotation(obj[this.startTimeProp]).split(':');
|
|
50
|
+
if (parseInt(split[0]) === hour && parseInt(split[1]) === minutes) {
|
|
36
51
|
objectsForHour.push(Object.assign({}, obj));
|
|
37
52
|
}
|
|
38
53
|
});
|
|
39
54
|
return objectsForHour;
|
|
40
55
|
}
|
|
41
|
-
formatHour(hour) {
|
|
42
|
-
return `${hour}:00`;
|
|
43
|
-
}
|
|
44
56
|
onDragStart(event, obj) {
|
|
45
57
|
const currentTarget = event.currentTarget;
|
|
46
|
-
const currentHourSpan = currentTarget.parentElement.parentElement.querySelector('.hour-label
|
|
58
|
+
const currentHourSpan = currentTarget.parentElement.parentElement.querySelector('.hidden-hour-label');
|
|
47
59
|
const currentHour = currentHourSpan.textContent;
|
|
48
60
|
this.draggedObject = obj;
|
|
49
61
|
event.dataTransfer.setData('text', JSON.stringify({ obj: this.draggedObject, currentHour }));
|
|
@@ -53,30 +65,39 @@ export class HourSchedulingComponent {
|
|
|
53
65
|
}
|
|
54
66
|
onDragOver(event) {
|
|
55
67
|
event.preventDefault();
|
|
68
|
+
const currentTarget = event.currentTarget;
|
|
69
|
+
currentTarget.classList.add('drag-over');
|
|
70
|
+
}
|
|
71
|
+
onDragLeave(event) {
|
|
72
|
+
const currentTarget = event.currentTarget;
|
|
73
|
+
currentTarget.classList.remove('drag-over'); // Remove 'drag-over' class
|
|
56
74
|
}
|
|
57
75
|
onDrop(event, hour) {
|
|
58
76
|
event.preventDefault();
|
|
59
77
|
event.stopPropagation();
|
|
60
|
-
const
|
|
61
|
-
|
|
78
|
+
const currentTarget = event.currentTarget;
|
|
79
|
+
currentTarget.classList.remove('drag-over');
|
|
80
|
+
let parsed = this.tryParseJSONObject(event.dataTransfer.getData("text"));
|
|
81
|
+
if (!parsed) {
|
|
82
|
+
this.newObjectPlanEvent.emit({ currentHour: hour, data: parsed.toString() });
|
|
62
83
|
return;
|
|
63
84
|
}
|
|
64
|
-
const
|
|
65
|
-
const
|
|
66
|
-
const
|
|
85
|
+
const splitHour = hour.split(':');
|
|
86
|
+
const newEndMinutes = splitHour[1] === "00" ? 30 : 0;
|
|
87
|
+
const newEndHour = splitHour[1] === "30" ? (parseInt(splitHour[0]) + 1) : parseInt(splitHour[0]);
|
|
88
|
+
const originalStartHour = this.convertToHourNotation(parsed.obj[this.startTimeProp]);
|
|
67
89
|
// Get the unique identifier value from the object using the `idProp`
|
|
68
|
-
const objId =
|
|
90
|
+
const objId = parsed.obj[this.idProp];
|
|
69
91
|
// Ensure we create a new object to avoid mutation issues
|
|
70
|
-
const updatedObject = Object.assign(Object.assign({},
|
|
92
|
+
const updatedObject = Object.assign(Object.assign({}, parsed.obj), { [this.startTimeProp]: this.createDate(parseInt(splitHour[0]), parseInt(splitHour[1])), [this.endTimeProp]: this.createDate(newEndHour, newEndMinutes) });
|
|
71
93
|
// Remove the object from its old hour block using its unique id
|
|
72
|
-
const originalHourBlock = this.formatHour(originalStartHour);
|
|
94
|
+
const originalHourBlock = this.formatHour(parseInt(originalStartHour.split(':')[0]), parseInt(originalStartHour.split(':')[1]));
|
|
73
95
|
this.scheduledObjects[originalHourBlock] = this.scheduledObjects[originalHourBlock].filter(o => o[this.idProp] !== objId);
|
|
74
96
|
// Add the object to the new hour block
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
this.scheduledObjects[newHourBlock] = [];
|
|
97
|
+
if (!this.scheduledObjects[hour]) {
|
|
98
|
+
this.scheduledObjects[hour] = [];
|
|
78
99
|
}
|
|
79
|
-
this.scheduledObjects[
|
|
100
|
+
this.scheduledObjects[hour].push(updatedObject);
|
|
80
101
|
// Clear the dragged object
|
|
81
102
|
this.draggedObject = null;
|
|
82
103
|
this.timeChangeEvent.emit(updatedObject);
|
|
@@ -84,50 +105,139 @@ export class HourSchedulingComponent {
|
|
|
84
105
|
this.cdRef.detectChanges();
|
|
85
106
|
}
|
|
86
107
|
convertToHourNotation(date) {
|
|
87
|
-
return
|
|
108
|
+
return this.datePipe.transform(new Date(date).toISOString(), 'HH:mm');
|
|
88
109
|
}
|
|
89
|
-
createDate(hours) {
|
|
110
|
+
createDate(hours, minutes) {
|
|
90
111
|
let date = new Date();
|
|
91
112
|
date.setHours(hours);
|
|
92
|
-
date.setMinutes(
|
|
113
|
+
date.setMinutes(minutes ? minutes : 0);
|
|
93
114
|
return date;
|
|
94
115
|
}
|
|
116
|
+
dateToUnixEpoch(date) {
|
|
117
|
+
return Math.floor(date.getTime()) / 1000;
|
|
118
|
+
}
|
|
119
|
+
formatHour(hour, minutes) {
|
|
120
|
+
return `${hour}:${minutes ? minutes : '00'}`;
|
|
121
|
+
}
|
|
122
|
+
addMinutes(hour) {
|
|
123
|
+
let split = hour.split(":");
|
|
124
|
+
split[1] = "30";
|
|
125
|
+
return split.join(':');
|
|
126
|
+
}
|
|
127
|
+
onDocumentClick(event) {
|
|
128
|
+
const targetElement = event.target;
|
|
129
|
+
// Clear active state when clicking outside
|
|
130
|
+
if (!targetElement.closest('.object-display')) {
|
|
131
|
+
this.activeHalfHour = null;
|
|
132
|
+
this.cdRef.detectChanges();
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
onObjectDisplayClick(hour, half) {
|
|
136
|
+
var _a, _b;
|
|
137
|
+
const halfHourIdentifier = `${hour}-${half}`;
|
|
138
|
+
if (this.activeHalfHour === halfHourIdentifier) {
|
|
139
|
+
// Deactivate if clicked again
|
|
140
|
+
this.activeHalfHour = null;
|
|
141
|
+
}
|
|
142
|
+
else if (((_a = this.scheduledObjects[hour]) === null || _a === void 0 ? void 0 : _a.length) > 0 || ((_b = this.scheduledObjects[this.addMinutes(hour)]) === null || _b === void 0 ? void 0 : _b.length) > 0) {
|
|
143
|
+
// Activate the half-hour if there are objects
|
|
144
|
+
this.activeHalfHour = halfHourIdentifier;
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
tryParseJSONObject(jsonString) {
|
|
148
|
+
try {
|
|
149
|
+
let o = JSON.parse(jsonString);
|
|
150
|
+
// Handle non-exception-throwing cases:
|
|
151
|
+
// Neither JSON.parse(false) or JSON.parse(1234) throw errors, hence the type-checking,
|
|
152
|
+
// but... JSON.parse(null) returns null, and typeof null === "object",
|
|
153
|
+
// so we must check for that, too. Thankfully, null is falsey, so this suffices:
|
|
154
|
+
if (o && typeof o === "object") {
|
|
155
|
+
return o;
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
catch (e) {
|
|
159
|
+
}
|
|
160
|
+
return false;
|
|
161
|
+
}
|
|
162
|
+
;
|
|
95
163
|
}
|
|
96
164
|
HourSchedulingComponent.decorators = [
|
|
97
165
|
{ type: Component, args: [{
|
|
98
166
|
selector: 'co-hour-scheduling',
|
|
99
167
|
template: `
|
|
100
|
-
<div class="time-block" *ngFor="let hour of
|
|
168
|
+
<div class="time-block" *ngFor="let hour of hourLabels">
|
|
101
169
|
<div class="hour-label"><span [textContent]="hour"></span></div>
|
|
102
|
-
<div
|
|
103
|
-
class="object-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
class="
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
170
|
+
<div class="object-display">
|
|
171
|
+
<div class="first-half-hour object-half"
|
|
172
|
+
[ngClass]="{'has-objects': scheduledObjects[hour]?.length > 0, 'active': activeHalfHour === hour + '-firstHalf'}"
|
|
173
|
+
(dragover)="onDragOver($event)"
|
|
174
|
+
(dragleave)="onDragLeave($event)"
|
|
175
|
+
(click)="onObjectDisplayClick(hour, 'firstHalf')"
|
|
176
|
+
(drop)="onDrop($event, hour)">
|
|
177
|
+
<ng-container *ngIf="!customTemplateUsed">
|
|
178
|
+
<ng-container *ngIf="scheduledObjects[hour]">
|
|
179
|
+
<span class="hidden-hour-label" [hidden]="true" [textContent]="hour"></span>
|
|
180
|
+
<div
|
|
181
|
+
*ngFor="let obj of scheduledObjects[hour]"
|
|
182
|
+
class="scheduled-object"
|
|
183
|
+
[draggable]="true"
|
|
184
|
+
(dragstart)="onDragStart($event, obj)"
|
|
185
|
+
>
|
|
186
|
+
<span class="hidden-hour-label" [hidden]="true" [textContent]="addMinutes(hour)"></span>
|
|
187
|
+
<span class="title" [textContent]="obj.title"></span>
|
|
188
|
+
<span class="sub-title" [textContent]="obj.subTitle"></span>
|
|
189
|
+
</div>
|
|
190
|
+
</ng-container>
|
|
118
191
|
</ng-container>
|
|
119
|
-
</ng-container>
|
|
120
192
|
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
193
|
+
<ng-container *ngIf="customTemplateUsed">
|
|
194
|
+
<ng-template
|
|
195
|
+
[ngTemplateOutlet]="customTemplate"
|
|
196
|
+
[ngTemplateOutletContext]="{
|
|
125
197
|
hour: hour,
|
|
198
|
+
hiddenHour: hour,
|
|
126
199
|
objects: scheduledObjects[hour]
|
|
127
200
|
}"
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
201
|
+
>
|
|
202
|
+
</ng-template>
|
|
203
|
+
</ng-container>
|
|
204
|
+
</div>
|
|
205
|
+
|
|
206
|
+
<div class="second-half-hour object-half"
|
|
207
|
+
[ngClass]="{'has-objects': scheduledObjects[addMinutes(hour)]?.length > 0, 'active': activeHalfHour === hour + '-secondHalf'}"
|
|
208
|
+
(dragover)="onDragOver($event)"
|
|
209
|
+
(dragleave)="onDragLeave($event)"
|
|
210
|
+
(click)="onObjectDisplayClick(hour, 'secondHalf')"
|
|
211
|
+
(drop)="onDrop($event, addMinutes(hour))">
|
|
212
|
+
<ng-container *ngIf="!customTemplateUsed">
|
|
213
|
+
<ng-container *ngIf="scheduledObjects[addMinutes(hour)]">
|
|
214
|
+
<div
|
|
215
|
+
*ngFor="let obj of scheduledObjects[addMinutes(hour)]"
|
|
216
|
+
class="scheduled-object"
|
|
217
|
+
[draggable]="true"
|
|
218
|
+
(dragstart)="onDragStart($event, obj)"
|
|
219
|
+
>
|
|
220
|
+
<span class="title" [textContent]="obj.title"></span>
|
|
221
|
+
<span class="sub-title" [textContent]="obj.subTitle"></span>
|
|
222
|
+
<span class="hidden-hour-label" [hidden]="true" [textContent]="addMinutes(hour)"></span>
|
|
223
|
+
</div>
|
|
224
|
+
</ng-container>
|
|
225
|
+
</ng-container>
|
|
226
|
+
|
|
227
|
+
<ng-container *ngIf="customTemplateUsed">
|
|
228
|
+
<ng-template
|
|
229
|
+
[ngTemplateOutlet]="customTemplate"
|
|
230
|
+
[ngTemplateOutletContext]="{
|
|
231
|
+
hour: hour,
|
|
232
|
+
hiddenHour: addMinutes(hour),
|
|
233
|
+
objects: scheduledObjects[addMinutes(hour)]
|
|
234
|
+
}"
|
|
235
|
+
>
|
|
236
|
+
</ng-template>
|
|
237
|
+
</ng-container>
|
|
238
|
+
</div>
|
|
239
|
+
|
|
240
|
+
|
|
131
241
|
</div>
|
|
132
242
|
</div>
|
|
133
243
|
`,
|
|
@@ -148,6 +258,7 @@ HourSchedulingComponent.propDecorators = {
|
|
|
148
258
|
customTemplateUsed: [{ type: Input }],
|
|
149
259
|
idProp: [{ type: Input }],
|
|
150
260
|
timeChangeEvent: [{ type: Output }],
|
|
261
|
+
newObjectPlanEvent: [{ type: Output }],
|
|
151
262
|
generateTimeBlocks: [{ type: HostBinding, args: ['class.co-hour-scheduling',] }]
|
|
152
263
|
};
|
|
153
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaG91ci1zY2hlZHVsaW5nLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NvcmVjb21wb25lbnRzL3NyYy9saWIvY29tcG9uZW50cy9ob3VyLXNjaGVkdWxpbmcvaG91ci1zY2hlZHVsaW5nLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUNULEtBQUssRUFFTCxXQUFXLEVBQ1gsaUJBQWlCLEVBQ2pCLGlCQUFpQixFQUNKLE1BQU0sRUFBRSxZQUFZLEdBQ2xDLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBQyxRQUFRLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQW1EekMsTUFBTSxPQUFPLHVCQUF1QjtJQXFCbEMsWUFBb0IsS0FBd0IsRUFBVSxRQUFrQjtRQUFwRCxVQUFLLEdBQUwsS0FBSyxDQUFtQjtRQUFVLGFBQVEsR0FBUixRQUFRLENBQVU7UUFuQmpFLGNBQVMsR0FBRyxJQUFJLENBQUM7UUFHakIsVUFBSyxHQUFhLEVBQUUsQ0FBQztRQUNyQixxQkFBZ0IsR0FBMkMsRUFBRSxDQUFDO1FBRTdELGtCQUFhLEdBQWUsSUFBSSxDQUFDO1FBUXpCLHVCQUFrQixHQUFZLEtBQUssQ0FBQztRQUduQyxvQkFBZSxHQUF5QixJQUFJLFlBQVksRUFBVSxDQUFDO0lBR3BGLENBQUM7SUFFRCxRQUFRO1FBQ04sSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUU7WUFDbkIsSUFBSSxDQUFDLFNBQVMsR0FBRyxRQUFRLENBQ3ZCLElBQUksQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUNyQixJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLFdBQVcsRUFBRSxFQUN6RCxNQUFNLENBQ1AsQ0FDRixDQUFDO1lBQ0YsSUFBSSxDQUFDLE9BQU8sR0FBRyxRQUFRLENBQ3JC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Z0JBQ1QsUUFBUSxFQUFFLG9CQUFvQjtnQkFDOUIsUUFBUSxFQUFFOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBa0NUO2dCQUNELGFBQWEsRUFBRSxpQkFBaUIsQ0FBQyxJQUFJO2FBQ3RDOzs7WUFyREMsaUJBQWlCO1lBR1gsUUFBUTs7O3VCQTZEYixLQUFLOzRCQUNMLEtBQUs7MEJBQ0wsS0FBSzswQkFDTCxLQUFLO3dCQUNMLEtBQUs7NkJBQ0wsS0FBSztpQ0FDTCxLQUFLO3FCQUNMLEtBQUs7OEJBRUwsTUFBTTtpQ0FvQ04sV0FBVyxTQUFDLDBCQUEwQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XHJcbiAgQ29tcG9uZW50LFxyXG4gIElucHV0LFxyXG4gIE9uSW5pdCxcclxuICBIb3N0QmluZGluZyxcclxuICBWaWV3RW5jYXBzdWxhdGlvbixcclxuICBDaGFuZ2VEZXRlY3RvclJlZixcclxuICBUZW1wbGF0ZVJlZiwgT3V0cHV0LCBFdmVudEVtaXR0ZXIsXHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7RGF0ZVBpcGV9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XHJcbmltcG9ydCB7T1VUUFVUfSBmcm9tIFwidGhyZWUvZXhhbXBsZXMvanNtL3Bvc3Rwcm9jZXNzaW5nL1NBT1Bhc3NcIjtcclxuXHJcbmludGVyZmFjZSBTY2hlZHVsaW5nT2JqZWN0IHtcclxuICBzdGFydDogbnVtYmVyO1xyXG4gIGVuZDogbnVtYmVyO1xyXG4gIHRpdGxlPzogc3RyaW5nO1xyXG4gIHN1YlRpdGxlPzogc3RyaW5nO1xyXG5cclxuICBba2V5OiBzdHJpbmddOiBhbnk7IC8vIEFsbG93cyBkeW5hbWljIHByb3BlcnRpZXMgaW5jbHVkaW5nIHVuaXF1ZSBpZGVudGlmaWVyc1xyXG59XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2NvLWhvdXItc2NoZWR1bGluZycsXHJcbiAgdGVtcGxhdGU6IGBcclxuICAgIDxkaXYgY2xhc3M9XCJ0aW1lLWJsb2NrXCIgKm5nRm9yPVwibGV0IGhvdXIgb2YgaG91cnNcIj5cclxuICAgICAgPGRpdiBjbGFzcz1cImhvdXItbGFiZWxcIj48c3BhbiBbdGV4dENvbnRlbnRdPVwiaG91clwiPjwvc3Bhbj48L2Rpdj5cclxuICAgICAgPGRpdlxyXG4gICAgICAgIGNsYXNzPVwib2JqZWN0LWRpc3BsYXlcIlxyXG4gICAgICAgIChkcmFnb3Zlcik9XCJvbkRyYWdPdmVyKCRldmVudClcIlxyXG4gICAgICAgIChkcm9wKT1cIm9uRHJvcCgkZXZlbnQsIGhvdXIpXCJcclxuICAgICAgPlxyXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhY3VzdG9tVGVtcGxhdGVVc2VkXCI+XHJcbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwic2NoZWR1bGVkT2JqZWN0c1tob3VyXVwiPlxyXG4gICAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IG9iaiBvZiBzY2hlZHVsZWRPYmplY3RzW2hvdXJdXCJcclxuICAgICAgICAgICAgICBjbGFzcz1cInNjaGVkdWxlZC1vYmplY3RcIlxyXG4gICAgICAgICAgICAgIFtkcmFnZ2FibGVdPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgKGRyYWdzdGFydCk9XCJvbkRyYWdTdGFydCgkZXZlbnQsIG9iailcIlxyXG4gICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0aXRsZVwiIFt0ZXh0Q29udGVudF09XCJvYmoudGl0bGVcIj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzdWItdGl0bGVcIiBbdGV4dENvbnRlbnRdPVwib2JqLnN1YlRpdGxlXCI+PC9zcGFuPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY3VzdG9tVGVtcGxhdGVVc2VkXCI+XHJcbiAgICAgICAgICA8bmctdGVtcGxhdGVcclxuICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRdPVwiY3VzdG9tVGVtcGxhdGVcIlxyXG4gICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwie1xyXG4gICAgICAgICAgICAgIGhvdXI6IGhvdXIsXHJcbiAgICAgICAgICAgICAgb2JqZWN0czogc2NoZWR1bGVkT2JqZWN0c1tob3VyXVxyXG4gICAgICAgICAgICB9XCJcclxuICAgICAgICAgID5cclxuICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgYCxcclxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgSG91clNjaGVkdWxpbmdDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xyXG5cclxuICBwdWJsaWMgc2hvd0NsYXNzID0gdHJ1ZTtcclxuICBwdWJsaWMgc3RhcnRUaW1lOiBudW1iZXI7XHJcbiAgcHVibGljIGVuZFRpbWU6IG51bWJlcjtcclxuICBwdWJsaWMgaG91cnM6IHN0cmluZ1tdID0gW107XHJcbiAgcHVibGljIHNjaGVkdWxlZE9iamVjdHM6IHsgW2hvdXI6IHN0cmluZ106IFNjaGVkdWxpbmdPYmplY3RbXSB9ID0ge307XHJcblxyXG4gIHByaXZhdGUgZHJhZ2dlZE9iamVjdDogYW55IHwgbnVsbCA9IG51bGw7XHJcblxyXG4gIEBJbnB1dCgpIHB1YmxpYyBzY2hlZHVsZTogYW55O1xyXG4gIEBJbnB1dCgpIHB1YmxpYyBzdGFydFRpbWVQcm9wOiBzdHJpbmc7XHJcbiAgQElucHV0KCkgcHVibGljIGVuZFRpbWVQcm9wOiBzdHJpbmc7XHJcbiAgQElucHV0KCkgcHVibGljIG9iamVjdHNQcm9wOiBzdHJpbmc7XHJcbiAgQElucHV0KCkgcHVibGljIGNoaWxkUHJvcDogc3RyaW5nO1xyXG4gIEBJbnB1dCgpIHB1YmxpYyBjdXN0b21UZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PjtcclxuICBASW5wdXQoKSBwdWJsaWMgY3VzdG9tVGVtcGxhdGVVc2VkOiBib29sZWFuID0gZmFsc2U7XHJcbiAgQElucHV0KCkgcHVibGljIGlkUHJvcDogc3RyaW5nOyAgLy8gSW5wdXQgZm9yIHVuaXF1ZSBpZGVudGlmaWVyIHByb3BlcnR5XHJcblxyXG4gIEBPdXRwdXQoKSBwdWJsaWMgdGltZUNoYW5nZUV2ZW50OiBFdmVudEVtaXR0ZXI8T2JqZWN0PiA9IG5ldyBFdmVudEVtaXR0ZXI8T2JqZWN0PigpO1xyXG5cclxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGNkUmVmOiBDaGFuZ2VEZXRlY3RvclJlZiwgcHJpdmF0ZSBkYXRlUGlwZTogRGF0ZVBpcGUpIHtcclxuICB9XHJcblxyXG4gIG5nT25Jbml0KCkge1xyXG4gICAgaWYgKCF0aGlzLmNoaWxkUHJvcCkge1xyXG4gICAgICB0aGlzLnN0YXJ0VGltZSA9IHBhcnNlSW50KFxyXG4gICAgICAgIHRoaXMuZGF0ZVBpcGUudHJhbnNmb3JtKFxyXG4gICAgICAgICAgbmV3IERhdGUodGhpcy5zY2hlZHVsZVt0aGlzLnN0YXJ0VGltZVByb3BdKS50b0lTT1N0cmluZygpLFxyXG4gICAgICAgICAgJ0g6bW0nXHJcbiAgICAgICAgKVxyXG4gICAgICApO1xyXG4gICAgICB0aGlzLmVuZFRpbWUgPSBwYXJzZUludChcclxuICAgICAgICB0aGlzLmRhdGVQaXBlLnRyYW5zZm9ybShcclxuICAgICAgICAgIG5ldyBEYXRlKHRoaXMuc2NoZWR1bGVbdGhpcy5lbmRUaW1lUHJvcF0pLnRvSVNPU3RyaW5nKCksXHJcbiAgICAgICAgICAnSDptbSdcclxuICAgICAgICApXHJcbiAgICAgICk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLnN0YXJ0VGltZSA9IHBhcnNlSW50KFxyXG4gICAgICAgIHRoaXMuZGF0ZVBpcGUudHJhbnNmb3JtKFxyXG4gICAgICAgICAgbmV3IERhdGUodGhpcy5zY2hlZHVsZVt0aGlzLmNoaWxkUHJvcF1bdGhpcy5zdGFydFRpbWVQcm9wXSkudG9JU09TdHJpbmcoKSxcclxuICAgICAgICAgICdIOm1tJ1xyXG4gICAgICAgIClcclxuICAgICAgKTtcclxuICAgICAgdGhpcy5lbmRUaW1lID0gcGFyc2VJbnQoXHJcbiAgICAgICAgdGhpcy5kYXRlUGlwZS50cmFuc2Zvcm0oXHJcbiAgICAgICAgICBuZXcgRGF0ZSh0aGlzLnNjaGVkdWxlW3RoaXMuY2hpbGRQcm9wXVt0aGlzLmVuZFRpbWVQcm9wXSkudG9JU09TdHJpbmcoKSxcclxuICAgICAgICAgICdIOm1tJ1xyXG4gICAgICAgIClcclxuICAgICAgKTtcclxuICAgIH1cclxuICAgIHRoaXMuZ2VuZXJhdGVUaW1lQmxvY2tzKCk7XHJcbiAgfVxyXG5cclxuICBASG9zdEJpbmRpbmcoJ2NsYXNzLmNvLWhvdXItc2NoZWR1bGluZycpXHJcblxyXG4gIHB1YmxpYyBnZW5lcmF0ZVRpbWVCbG9ja3MoKSB7XHJcbiAgICBjb25zdCBvYmplY3RzTGlzdCA9IHRoaXMuc2NoZWR1bGVbdGhpcy5vYmplY3RzUHJvcF07XHJcblxyXG4gICAgZm9yIChsZXQgaG91ciA9IHRoaXMuc3RhcnRUaW1lOyBob3VyIDw9IHRoaXMuZW5kVGltZTsgaG91cisrKSB7XHJcbiAgICAgIHRoaXMuaG91cnMucHVzaCh0aGlzLmZvcm1hdEhvdXIoaG91cikpO1xyXG4gICAgICB0aGlzLnNjaGVkdWxlZE9iamVjdHNbdGhpcy5mb3JtYXRIb3VyKGhvdXIpXSA9IHRoaXMuX2dldE9iamVjdHNGb3JIb3VyKFxyXG4gICAgICAgIGhvdXIsXHJcbiAgICAgICAgb2JqZWN0c0xpc3RcclxuICAgICAgKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2dldE9iamVjdHNGb3JIb3VyKFxyXG4gICAgaG91cjogbnVtYmVyLFxyXG4gICAgb2JqZWN0c0xpc3Q6IGFueVtdXHJcbiAgKTogU2NoZWR1bGluZ09iamVjdFtdIHtcclxuICAgIGNvbnN0IG9iamVjdHNGb3JIb3VyOiBTY2hlZHVsaW5nT2JqZWN0W10gPSBbXTtcclxuXHJcbiAgICBvYmplY3RzTGlzdC5mb3JFYWNoKChvYmopID0+IHtcclxuICAgICAgaWYgKHRoaXMuY29udmVydFRvSG91ck5vdGF0aW9uKG9ialt0aGlzLnN0YXJ0VGltZVByb3BdKSA9PT0gaG91cikge1xyXG4gICAgICAgIG9iamVjdHNGb3JIb3VyLnB1c2goey4uLm9ian0pO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICByZXR1cm4gb2JqZWN0c0ZvckhvdXI7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZm9ybWF0SG91cihob3VyOiBudW1iZXIpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIGAke2hvdXJ9OjAwYDtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBvbkRyYWdTdGFydChldmVudDogRHJhZ0V2ZW50LCBvYmo6IGFueSkge1xyXG4gICAgY29uc3QgY3VycmVudFRhcmdldCA9IGV2ZW50LmN1cnJlbnRUYXJnZXQgYXMgSFRNTEVsZW1lbnQ7XHJcbiAgICBjb25zdCBjdXJyZW50SG91clNwYW4gPVxyXG4gICAgICBjdXJyZW50VGFyZ2V0LnBhcmVudEVsZW1lbnQhLnBhcmVudEVsZW1lbnQhLnF1ZXJ5U2VsZWN0b3IoXHJcbiAgICAgICAgJy5ob3VyLWxhYmVsIHNwYW4nXHJcbiAgICAgICkhO1xyXG4gICAgY29uc3QgY3VycmVudEhvdXIgPSBjdXJyZW50SG91clNwYW4udGV4dENvbnRlbnQhO1xyXG5cclxuICAgIHRoaXMuZHJhZ2dlZE9iamVjdCA9IG9iajtcclxuICAgIGV2ZW50LmRhdGFUcmFuc2ZlciEuc2V0RGF0YShcclxuICAgICAgJ3RleHQnLFxyXG4gICAgICBKU09OLnN0cmluZ2lmeSh7b2JqOiB0aGlzLmRyYWdnZWRPYmplY3QsIGN1cnJlbnRIb3VyfSlcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgb25DdXN0b21EcmFnU3RhcnQoZXZlbnQ6IERyYWdFdmVudCwgb2JqOiBTY2hlZHVsaW5nT2JqZWN0KSB7XHJcbiAgICB0aGlzLm9uRHJhZ1N0YXJ0KGV2ZW50LCBvYmopO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIG9uRHJhZ092ZXIoZXZlbnQ6IERyYWdFdmVudCkge1xyXG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBvbkRyb3AoZXZlbnQ6IERyYWdFdmVudCwgaG91cjogc3RyaW5nKSB7XHJcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcblxyXG4gICAgY29uc3QgZGF0YSA9IEpTT04ucGFyc2UoZXZlbnQuZGF0YVRyYW5zZmVyIS5nZXREYXRhKCd0ZXh0JykpIGFzIHtcclxuICAgICAgb2JqOiBhbnk7XHJcbiAgICAgIGN1cnJlbnRIb3VyOiBzdHJpbmc7XHJcbiAgICB9O1xyXG5cclxuICAgIGlmICghZGF0YSB8fCAhZGF0YS5vYmopIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IG5ld1N0YXJ0SG91ciA9IHBhcnNlSW50KGhvdXIuc3BsaXQoJzonKVswXSwgMTApO1xyXG4gICAgY29uc3QgbmV3RW5kSG91ciA9IG5ld1N0YXJ0SG91ciArIDE7XHJcblxyXG4gICAgY29uc3Qgb3JpZ2luYWxTdGFydEhvdXIgPSB0aGlzLmNvbnZlcnRUb0hvdXJOb3RhdGlvbihkYXRhLm9ialt0aGlzLnN0YXJ0VGltZVByb3BdKTtcclxuXHJcbiAgICAvLyBHZXQgdGhlIHVuaXF1ZSBpZGVudGlmaWVyIHZhbHVlIGZyb20gdGhlIG9iamVjdCB1c2luZyB0aGUgYGlkUHJvcGBcclxuICAgIGNvbnN0IG9iaklkID0gZGF0YS5vYmpbdGhpcy5pZFByb3BdO1xyXG5cclxuICAgIC8vIEVuc3VyZSB3ZSBjcmVhdGUgYSBuZXcgb2JqZWN0IHRvIGF2b2lkIG11dGF0aW9uIGlzc3Vlc1xyXG5cclxuICAgIGNvbnN0IHVwZGF0ZWRPYmplY3QgPSB7XHJcbiAgICAgIC4uLmRhdGEub2JqLFxyXG4gICAgICBbdGhpcy5zdGFydFRpbWVQcm9wXTogdGhpcy5jcmVhdGVEYXRlKG5ld1N0YXJ0SG91ciksXHJcbiAgICAgIFt0aGlzLmVuZFRpbWVQcm9wXTogdGhpcy5jcmVhdGVEYXRlKG5ld0VuZEhvdXIpXHJcbiAgICB9O1xyXG5cclxuXHJcbiAgICAvLyBSZW1vdmUgdGhlIG9iamVjdCBmcm9tIGl0cyBvbGQgaG91ciBibG9jayB1c2luZyBpdHMgdW5pcXVlIGlkXHJcbiAgICBjb25zdCBvcmlnaW5hbEhvdXJCbG9jayA9IHRoaXMuZm9ybWF0SG91cihvcmlnaW5hbFN0YXJ0SG91cik7XHJcbiAgICB0aGlzLnNjaGVkdWxlZE9iamVjdHNbb3JpZ2luYWxIb3VyQmxvY2tdID0gdGhpcy5zY2hlZHVsZWRPYmplY3RzW29yaWdpbmFsSG91ckJsb2NrXS5maWx0ZXIobyA9PiBvW3RoaXMuaWRQcm9wXSAhPT0gb2JqSWQpO1xyXG5cclxuICAgIC8vIEFkZCB0aGUgb2JqZWN0IHRvIHRoZSBuZXcgaG91ciBibG9ja1xyXG4gICAgY29uc3QgbmV3SG91ckJsb2NrID0gdGhpcy5mb3JtYXRIb3VyKG5ld1N0YXJ0SG91cik7XHJcbiAgICBpZiAoIXRoaXMuc2NoZWR1bGVkT2JqZWN0c1tuZXdIb3VyQmxvY2tdKSB7XHJcbiAgICAgIHRoaXMuc2NoZWR1bGVkT2JqZWN0c1tuZXdIb3VyQmxvY2tdID0gW107XHJcbiAgICB9XHJcbiAgICB0aGlzLnNjaGVkdWxlZE9iamVjdHNbbmV3SG91ckJsb2NrXS5wdXNoKHVwZGF0ZWRPYmplY3QpO1xyXG5cclxuICAgIC8vIENsZWFyIHRoZSBkcmFnZ2VkIG9iamVjdFxyXG4gICAgdGhpcy5kcmFnZ2VkT2JqZWN0ID0gbnVsbDtcclxuXHJcbiAgICB0aGlzLnRpbWVDaGFuZ2VFdmVudC5lbWl0KHVwZGF0ZWRPYmplY3QpO1xyXG4gICAgLy8gVHJpZ2dlciBjaGFuZ2UgZGV0ZWN0aW9uIHRvIHVwZGF0ZSB0aGUgdmlld1xyXG4gICAgdGhpcy5jZFJlZi5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgY29udmVydFRvSG91ck5vdGF0aW9uKGRhdGU6IERhdGUpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHBhcnNlSW50KHRoaXMuZGF0ZVBpcGUudHJhbnNmb3JtKG5ldyBEYXRlKGRhdGUpLnRvSVNPU3RyaW5nKCksICdIOm1tJykpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGNyZWF0ZURhdGUoaG91cnM6IG51bWJlcikge1xyXG4gICAgbGV0IGRhdGUgPSBuZXcgRGF0ZSgpO1xyXG4gICAgZGF0ZS5zZXRIb3Vycyhob3Vycyk7XHJcbiAgICBkYXRlLnNldE1pbnV0ZXMoMCwgMCwgMCk7XHJcbiAgICByZXR1cm4gZGF0ZTtcclxuICB9XHJcbn1cclxuIl19
|
|
264
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaG91ci1zY2hlZHVsaW5nLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NvcmVjb21wb25lbnRzL3NyYy9saWIvY29tcG9uZW50cy9ob3VyLXNjaGVkdWxpbmcvaG91ci1zY2hlZHVsaW5nLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUNULEtBQUssRUFFTCxXQUFXLEVBQ1gsaUJBQWlCLEVBQ2pCLGlCQUFpQixFQUNKLE1BQU0sRUFBRSxZQUFZLEdBQ2xDLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBQyxRQUFRLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQStGekMsTUFBTSxPQUFPLHVCQUF1QjtJQTBCbEMsWUFBb0IsS0FBd0IsRUFBVSxRQUFrQjtRQUFwRCxVQUFLLEdBQUwsS0FBSyxDQUFtQjtRQUFVLGFBQVEsR0FBUixRQUFRLENBQVU7UUF4QmpFLGNBQVMsR0FBRyxJQUFJLENBQUM7UUFDakIsZUFBVSxHQUFhLEVBQUUsQ0FBQztRQUMxQixxQkFBZ0IsR0FBMkMsRUFBRSxDQUFDO1FBQzlELGVBQVUsR0FBa0IsSUFBSSxDQUFDO1FBQ2pDLG1CQUFjLEdBQWtCLElBQUksQ0FBQztRQUVwQyxrQkFBYSxHQUFlLElBQUksQ0FBQztRQVF6Qix1QkFBa0IsR0FBWSxLQUFLLENBQUM7UUFHbkMsb0JBQWUsR0FBeUIsSUFBSSxZQUFZLEVBQVUsQ0FBQztRQUNuRSx1QkFBa0IsR0FBd0QsSUFBSSxZQUFZLEVBR3ZHLENBQUM7UUFJSCxRQUFRLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7SUFDdEUsQ0FBQztJQUVELFFBQVE7UUFDTixJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztRQUMxQixJQUFJLENBQUMsd0JBQXdCLEVB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SzswQkFDTCxLQUFLO3dCQUNMLEtBQUs7NkJBQ0wsS0FBSztpQ0FDTCxLQUFLO3FCQUNMLEtBQUs7OEJBRUwsTUFBTTtpQ0FDTixNQUFNO2lDQW1CTixXQUFXLFNBQUMsMEJBQTBCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcclxuICBDb21wb25lbnQsXHJcbiAgSW5wdXQsXHJcbiAgT25Jbml0LFxyXG4gIEhvc3RCaW5kaW5nLFxyXG4gIFZpZXdFbmNhcHN1bGF0aW9uLFxyXG4gIENoYW5nZURldGVjdG9yUmVmLFxyXG4gIFRlbXBsYXRlUmVmLCBPdXRwdXQsIEV2ZW50RW1pdHRlcixcclxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHtEYXRlUGlwZX0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcclxuaW1wb3J0IHtPVVRQVVR9IGZyb20gXCJ0aHJlZS9leGFtcGxlcy9qc20vcG9zdHByb2Nlc3NpbmcvU0FPUGFzc1wiO1xyXG5pbXBvcnQge21pbn0gZnJvbSBcInRocmVlL2V4YW1wbGVzL2pzbS9ub2Rlcy9tYXRoL01hdGhOb2RlXCI7XHJcbmltcG9ydCB7cGFyc2V9IGZyb20gXCJAYW5ndWxhci9jb21waWxlci9zcmMvcmVuZGVyMy92aWV3L3N0eWxlX3BhcnNlclwiO1xyXG5cclxuaW50ZXJmYWNlIFNjaGVkdWxpbmdPYmplY3Qge1xyXG4gIHN0YXJ0OiBudW1iZXI7XHJcbiAgZW5kOiBudW1iZXI7XHJcbiAgdGl0bGU/OiBzdHJpbmc7XHJcbiAgc3ViVGl0bGU/OiBzdHJpbmc7XHJcblxyXG4gIFtrZXk6IHN0cmluZ106IGFueTsgLy8gQWxsb3dzIGR5bmFtaWMgcHJvcGVydGllcyBpbmNsdWRpbmcgdW5pcXVlIGlkZW50aWZpZXJzXHJcbn1cclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnY28taG91ci1zY2hlZHVsaW5nJyxcclxuICB0ZW1wbGF0ZTogYFxyXG4gICAgPGRpdiBjbGFzcz1cInRpbWUtYmxvY2tcIiAqbmdGb3I9XCJsZXQgaG91ciBvZiBob3VyTGFiZWxzXCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJob3VyLWxhYmVsXCI+PHNwYW4gW3RleHRDb250ZW50XT1cImhvdXJcIj48L3NwYW4+PC9kaXY+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJvYmplY3QtZGlzcGxheVwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJmaXJzdC1oYWxmLWhvdXIgb2JqZWN0LWhhbGZcIlxyXG4gICAgICAgICAgICAgW25nQ2xhc3NdPVwieydoYXMtb2JqZWN0cyc6IHNjaGVkdWxlZE9iamVjdHNbaG91cl0/Lmxlbmd0aCA+IDAsICdhY3RpdmUnOiBhY3RpdmVIYWxmSG91ciA9PT0gaG91ciArICctZmlyc3RIYWxmJ31cIlxyXG4gICAgICAgICAgICAgKGRyYWdvdmVyKT1cIm9uRHJhZ092ZXIoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAoZHJhZ2xlYXZlKT1cIm9uRHJhZ0xlYXZlKCRldmVudClcIlxyXG4gICAgICAgICAgICAgKGNsaWNrKT1cIm9uT2JqZWN0RGlzcGxheUNsaWNrKGhvdXIsICdmaXJzdEhhbGYnKVwiXHJcbiAgICAgICAgICAgICAoZHJvcCk9XCJvbkRyb3AoJGV2ZW50LCBob3VyKVwiPlxyXG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFjdXN0b21UZW1wbGF0ZVVzZWRcIj5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInNjaGVkdWxlZE9iamVjdHNbaG91cl1cIj5cclxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImhpZGRlbi1ob3VyLWxhYmVsXCIgW2hpZGRlbl09XCJ0cnVlXCIgW3RleHRDb250ZW50XT1cImhvdXJcIj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgPGRpdlxyXG4gICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IG9iaiBvZiBzY2hlZHVsZWRPYmplY3RzW2hvdXJdXCJcclxuICAgICAgICAgICAgICAgIGNsYXNzPVwic2NoZWR1bGVkLW9iamVjdFwiXHJcbiAgICAgICAgICAgICAgICBbZHJhZ2dhYmxlXT1cInRydWVcIlxyXG4gICAgICAgICAgICAgICAgKGRyYWdzdGFydCk9XCJvbkRyYWdTdGFydCgkZXZlbnQsIG9iailcIlxyXG4gICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaGlkZGVuLWhvdXItbGFiZWxcIiBbaGlkZGVuXT1cInRydWVcIiBbdGV4dENvbnRlbnRdPVwiYWRkTWludXRlcyhob3VyKVwiPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidGl0bGVcIiBbdGV4dENvbnRlbnRdPVwib2JqLnRpdGxlXCI+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzdWItdGl0bGVcIiBbdGV4dENvbnRlbnRdPVwib2JqLnN1YlRpdGxlXCI+PC9zcGFuPlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjdXN0b21UZW1wbGF0ZVVzZWRcIj5cclxuICAgICAgICAgICAgPG5nLXRlbXBsYXRlXHJcbiAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRdPVwiY3VzdG9tVGVtcGxhdGVcIlxyXG4gICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7XHJcbiAgICAgICAgICAgICAgaG91cjogaG91cixcclxuICAgICAgICAgICAgICBoaWRkZW5Ib3VyOiBob3VyLFxyXG4gICAgICAgICAgICAgIG9iamVjdHM6IHNjaGVkdWxlZE9iamVjdHNbaG91cl1cclxuICAgICAgICAgICAgfVwiXHJcbiAgICAgICAgICAgID5cclxuICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwic2Vjb25kLWhhbGYtaG91ciBvYmplY3QtaGFsZlwiXHJcbiAgICAgICAgICAgICBbbmdDbGFzc109XCJ7J2hhcy1vYmplY3RzJzogc2NoZWR1bGVkT2JqZWN0c1thZGRNaW51dGVzKGhvdXIpXT8ubGVuZ3RoID4gMCwgJ2FjdGl2ZSc6IGFjdGl2ZUhhbGZIb3VyID09PSBob3VyICsgJy1zZWNvbmRIYWxmJ31cIlxyXG4gICAgICAgICAgICAgKGRyYWdvdmVyKT1cIm9uRHJhZ092ZXIoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAoZHJhZ2xlYXZlKT1cIm9uRHJhZ0xlYXZlKCRldmVudClcIlxyXG4gICAgICAgICAgICAgKGNsaWNrKT1cIm9uT2JqZWN0RGlzcGxheUNsaWNrKGhvdXIsICdzZWNvbmRIYWxmJylcIlxyXG4gICAgICAgICAgICAgKGRyb3ApPVwib25Ecm9wKCRldmVudCwgYWRkTWludXRlcyhob3VyKSlcIj5cclxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhY3VzdG9tVGVtcGxhdGVVc2VkXCI+XHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJzY2hlZHVsZWRPYmplY3RzW2FkZE1pbnV0ZXMoaG91cildXCI+XHJcbiAgICAgICAgICAgICAgPGRpdlxyXG4gICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IG9iaiBvZiBzY2hlZHVsZWRPYmplY3RzW2FkZE1pbnV0ZXMoaG91cildXCJcclxuICAgICAgICAgICAgICAgIGNsYXNzPVwic2NoZWR1bGVkLW9iamVjdFwiXHJcbiAgICAgICAgICAgICAgICBbZHJhZ2dhYmxlXT1cInRydWVcIlxyXG4gICAgICAgICAgICAgICAgKGRyYWdzdGFydCk9XCJvbkRyYWdTdGFydCgkZXZlbnQsIG9iailcIlxyXG4gICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidGl0bGVcIiBbdGV4dENvbnRlbnRdPVwib2JqLnRpdGxlXCI+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzdWItdGl0bGVcIiBbdGV4dENvbnRlbnRdPVwib2JqLnN1YlRpdGxlXCI+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJoaWRkZW4taG91ci1sYWJlbFwiIFtoaWRkZW5dPVwidHJ1ZVwiIFt0ZXh0Q29udGVudF09XCJhZGRNaW51dGVzKGhvdXIpXCI+PC9zcGFuPlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjdXN0b21UZW1wbGF0ZVVzZWRcIj5cclxuICAgICAgICAgICAgPG5nLXRlbXBsYXRlXHJcbiAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRdPVwiY3VzdG9tVGVtcGxhdGVcIlxyXG4gICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7XHJcbiAgICAgICAgICAgICAgaG91cjogaG91cixcclxuICAgICAgICAgICAgICBoaWRkZW5Ib3VyOiBhZGRNaW51dGVzKGhvdXIpLFxyXG4gICAgICAgICAgICAgIG9iamVjdHM6IHNjaGVkdWxlZE9iamVjdHNbYWRkTWludXRlcyhob3VyKV1cclxuICAgICAgICAgICAgfVwiXHJcbiAgICAgICAgICAgID5cclxuICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuXHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgYCxcclxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgSG91clNjaGVkdWxpbmdDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xyXG5cclxuICBwdWJsaWMgc2hvd0NsYXNzID0gdHJ1ZTtcclxuICBwdWJsaWMgaG91ckxhYmVsczogc3RyaW5nW10gPSBbXTtcclxuICBwdWJsaWMgc2NoZWR1bGVkT2JqZWN0czogeyBbaG91cjogc3RyaW5nXTogU2NoZWR1bGluZ09iamVjdFtdIH0gPSB7fTtcclxuICBwdWJsaWMgYWN0aXZlSG91cjogc3RyaW5nIHwgbnVsbCA9IG51bGw7XHJcbiAgcHVibGljIGFjdGl2ZUhhbGZIb3VyOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcclxuXHJcbiAgcHJpdmF0ZSBkcmFnZ2VkT2JqZWN0OiBhbnkgfCBudWxsID0gbnVsbDtcclxuXHJcbiAgQElucHV0KCkgcHVibGljIHNjaGVkdWxlOiBhbnk7XHJcbiAgQElucHV0KCkgcHVibGljIHN0YXJ0VGltZVByb3A6IHN0cmluZztcclxuICBASW5wdXQoKSBwdWJsaWMgZW5kVGltZVByb3A6IHN0cmluZztcclxuICBASW5wdXQoKSBwdWJsaWMgb2JqZWN0c1Byb3A6IHN0cmluZztcclxuICBASW5wdXQoKSBwdWJsaWMgY2hpbGRQcm9wOiBzdHJpbmc7XHJcbiAgQElucHV0KCkgcHVibGljIGN1c3RvbVRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+O1xyXG4gIEBJbnB1dCgpIHB1YmxpYyBjdXN0b21UZW1wbGF0ZVVzZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBASW5wdXQoKSBwdWJsaWMgaWRQcm9wOiBzdHJpbmc7ICAvLyBJbnB1dCBmb3IgdW5pcXVlIGlkZW50aWZpZXIgcHJvcGVydHlcclxuXHJcbiAgQE91dHB1dCgpIHB1YmxpYyB0aW1lQ2hhbmdlRXZlbnQ6IEV2ZW50RW1pdHRlcjxPYmplY3Q+ID0gbmV3IEV2ZW50RW1pdHRlcjxPYmplY3Q+KCk7XHJcbiAgQE91dHB1dCgpIHB1YmxpYyBuZXdPYmplY3RQbGFuRXZlbnQ6IEV2ZW50RW1pdHRlcjx7IGN1cnJlbnRIb3VyOiBzdHJpbmcsIGRhdGE6IHN0cmluZyB9PiA9IG5ldyBFdmVudEVtaXR0ZXI8e1xyXG4gICAgY3VycmVudEhvdXI6IHN0cmluZyxcclxuICAgIGRhdGE6IHN0cmluZ1xyXG4gIH0+KCk7XHJcblxyXG5cclxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGNkUmVmOiBDaGFuZ2VEZXRlY3RvclJlZiwgcHJpdmF0ZSBkYXRlUGlwZTogRGF0ZVBpcGUpIHtcclxuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5vbkRvY3VtZW50Q2xpY2suYmluZCh0aGlzKSk7XHJcbiAgfVxyXG5cclxuICBuZ09uSW5pdCgpIHtcclxuICAgIHRoaXMuZ2VuZXJhdGVUaW1lQmxvY2tzKCk7XHJcbiAgICB0aGlzLmdlbmVyYXRlU2NoZWR1bGVkT2JqZWN0cygpO1xyXG4gIH1cclxuXHJcbiAgbmdPbkRlc3Ryb3koKSB7XHJcbiAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMub25Eb2N1bWVudENsaWNrLmJpbmQodGhpcykpO1xyXG4gIH1cclxuXHJcbiAgQEhvc3RCaW5kaW5nKCdjbGFzcy5jby1ob3VyLXNjaGVkdWxpbmcnKVxyXG5cclxuICBwdWJsaWMgZ2VuZXJhdGVUaW1lQmxvY2tzKCkge1xyXG4gICAgbGV0IHN0YXJ0VW5peDogbnVtYmVyID0gIXRoaXMuY2hpbGRQcm9wID8gdGhpcy5kYXRlVG9Vbml4RXBvY2gobmV3IERhdGUodGhpcy5zY2hlZHVsZVt0aGlzLnN0YXJ0VGltZVByb3BdKSkgOiB0aGlzLmRhdGVUb1VuaXhFcG9jaChuZXcgRGF0ZSh0aGlzLnNjaGVkdWxlW3RoaXMuY2hpbGRQcm9wXVt0aGlzLnN0YXJ0VGltZVByb3BdKSk7XHJcbiAgICBsZXQgZW5kVW5peDogbnVtYmVyID0gIXRoaXMuY2hpbGRQcm9wID8gdGhpcy5kYXRlVG9Vbml4RXBvY2gobmV3IERhdGUodGhpcy5zY2hlZHVsZVt0aGlzLmVuZFRpbWVQcm9wXSkpIDogdGhpcy5kYXRlVG9Vbml4RXBvY2gobmV3IERhdGUodGhpcy5zY2hlZHVsZVt0aGlzLmNoaWxkUHJvcF1bdGhpcy5lbmRUaW1lUHJvcF0pKTtcclxuXHJcbiAgICBsZXQgaW50ZXJ2YWwgPSA2MCAqIDYwO1xyXG5cclxuICAgIGZvciAobGV0IGhvdXJDb3VudCA9IHN0YXJ0VW5peDsgaG91ckNvdW50IDw9IGVuZFVuaXg7IGhvdXJDb3VudCArPSBpbnRlcnZhbCkge1xyXG4gICAgICBsZXQgaG91ciA9IG5ldyBEYXRlKGhvdXJDb3VudCAqIDEwMDApXHJcbiAgICAgIGxldCBob3VyU3RyaW5nID0gYCR7aG91ci5nZXRIb3VycygpfToke2hvdXIuZ2V0TWludXRlcygpID09PSAwID8gJzAwJyA6IGhvdXIuZ2V0TWludXRlcygpfWA7XHJcbiAgICAgIHRoaXMuaG91ckxhYmVscy5wdXNoKGhvdXJTdHJpbmcpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIGdlbmVyYXRlU2NoZWR1bGVkT2JqZWN0cygpIHtcclxuICAgIGNvbnN0IG9iamVjdHNMaXN0ID0gdGhpcy5zY2hlZHVsZVt0aGlzLm9iamVjdHNQcm9wXTtcclxuXHJcbiAgICBsZXQgc3RhcnRVbml4OiBudW1iZXIgPSAhdGhpcy5jaGlsZFByb3AgPyB0aGlzLmRhdGVUb1VuaXhFcG9jaChuZXcgRGF0ZSh0aGlzLnNjaGVkdWxlW3RoaXMuc3RhcnRUaW1lUHJvcF0pKSA6IHRoaXMuZGF0ZVRvVW5peEVwb2NoKG5ldyBEYXRlKHRoaXMuc2NoZWR1bGVbdGhpcy5jaGlsZFByb3BdW3RoaXMuc3RhcnRUaW1lUHJvcF0pKTtcclxuICAgIGxldCBlbmRVbml4OiBudW1iZXIgPSAhdGhpcy5jaGlsZFByb3AgPyB0aGlzLmRhdGVUb1VuaXhFcG9jaChuZXcgRGF0ZSh0aGlzLnNjaGVkdWxlW3RoaXMuZW5kVGltZVByb3BdKSkgOiB0aGlzLmRhdGVUb1VuaXhFcG9jaChuZXcgRGF0ZSh0aGlzLnNjaGVkdWxlW3RoaXMuY2hpbGRQcm9wXVt0aGlzLmVuZFRpbWVQcm9wXSkpO1xyXG5cclxuICAgIGxldCBpbnRlcnZhbCA9IDMwICogNjA7XHJcblxyXG4gICAgZm9yIChsZXQgaG91ckNvdW50ID0gc3RhcnRVbml4OyBob3VyQ291bnQgPD0gZW5kVW5peDsgaG91ckNvdW50ICs9IGludGVydmFsKSB7XHJcbiAgICAgIGxldCBob3VyID0gbmV3IERhdGUoaG91ckNvdW50ICogMTAwMClcclxuICAgICAgbGV0IGhvdXJTdHJpbmcgPSBgJHtob3VyLmdldEhvdXJzKCl9OiR7aG91ci5nZXRNaW51dGVzKCkgPT09IDAgPyAnMDAnIDogaG91ci5nZXRNaW51dGVzKCl9YDtcclxuICAgICAgdGhpcy5zY2hlZHVsZWRPYmplY3RzW2hvdXJTdHJpbmddID0gdGhpcy5fZ2V0T2JqZWN0c0ZvckhvdXJBbmRNaW51dGVzKFxyXG4gICAgICAgIGhvdXIuZ2V0SG91cnMoKSxcclxuICAgICAgICBob3VyLmdldE1pbnV0ZXMoKSxcclxuICAgICAgICBvYmplY3RzTGlzdFxyXG4gICAgICApO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfZ2V0T2JqZWN0c0ZvckhvdXJBbmRNaW51dGVzKFxyXG4gICAgaG91cjogbnVtYmVyLFxyXG4gICAgbWludXRlczogbnVtYmVyLFxyXG4gICAgb2JqZWN0c0xpc3Q6IGFueVtdXHJcbiAgKTogU2NoZWR1bGluZ09iamVjdFtdIHtcclxuICAgIGNvbnN0IG9iamVjdHNGb3JIb3VyOiBTY2hlZHVsaW5nT2JqZWN0W10gPSBbXTtcclxuICAgIG9iamVjdHNMaXN0LmZvckVhY2goKG9iaikgPT4ge1xyXG4gICAgICBsZXQgc3BsaXQgPSB0aGlzLmNvbnZlcnRUb0hvdXJOb3RhdGlvbihvYmpbdGhpcy5zdGFydFRpbWVQcm9wXSkuc3BsaXQoJzonKTtcclxuICAgICAgaWYgKHBhcnNlSW50KHNwbGl0WzBdKSA9PT0gaG91ciAmJiBwYXJzZUludChzcGxpdFsxXSkgPT09IG1pbnV0ZXMpIHtcclxuICAgICAgICBvYmplY3RzRm9ySG91ci5wdXNoKHsuLi5vYmp9KTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgcmV0dXJuIG9iamVjdHNGb3JIb3VyO1xyXG4gIH1cclxuXHJcblxyXG4gIHB1YmxpYyBvbkRyYWdTdGFydChldmVudDogRHJhZ0V2ZW50LCBvYmo6IGFueSkge1xyXG4gICAgY29uc3QgY3VycmVudFRhcmdldCA9IGV2ZW50LmN1cnJlbnRUYXJnZXQgYXMgSFRNTEVsZW1lbnQ7XHJcbiAgICBjb25zdCBjdXJyZW50SG91clNwYW4gPVxyXG4gICAgICBjdXJyZW50VGFyZ2V0LnBhcmVudEVsZW1lbnQhLnBhcmVudEVsZW1lbnQhLnF1ZXJ5U2VsZWN0b3IoXHJcbiAgICAgICAgJy5oaWRkZW4taG91ci1sYWJlbCdcclxuICAgICAgKSE7XHJcbiAgICBjb25zdCBjdXJyZW50SG91ciA9IGN1cnJlbnRIb3VyU3Bhbi50ZXh0Q29udGVudCE7XHJcblxyXG4gICAgdGhpcy5kcmFnZ2VkT2JqZWN0ID0gb2JqO1xyXG4gICAgZXZlbnQuZGF0YVRyYW5zZmVyIS5zZXREYXRhKFxyXG4gICAgICAndGV4dCcsXHJcbiAgICAgIEpTT04uc3RyaW5naWZ5KHtvYmo6IHRoaXMuZHJhZ2dlZE9iamVjdCwgY3VycmVudEhvdXJ9KVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBvbkN1c3RvbURyYWdTdGFydChldmVudDogRHJhZ0V2ZW50LCBvYmo6IFNjaGVkdWxpbmdPYmplY3QpIHtcclxuICAgIHRoaXMub25EcmFnU3RhcnQoZXZlbnQsIG9iaik7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgb25EcmFnT3ZlcihldmVudDogRHJhZ0V2ZW50KSB7XHJcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgY29uc3QgY3VycmVudFRhcmdldCA9IGV2ZW50LmN1cnJlbnRUYXJnZXQgYXMgSFRNTEVsZW1lbnQ7XHJcbiAgICBjdXJyZW50VGFyZ2V0LmNsYXNzTGlzdC5hZGQoJ2RyYWctb3ZlcicpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIG9uRHJhZ0xlYXZlKGV2ZW50OiBEcmFnRXZlbnQpIHtcclxuICAgIGNvbnN0IGN1cnJlbnRUYXJnZXQgPSBldmVudC5jdXJyZW50VGFyZ2V0IGFzIEhUTUxFbGVtZW50O1xyXG4gICAgY3VycmVudFRhcmdldC5jbGFzc0xpc3QucmVtb3ZlKCdkcmFnLW92ZXInKTsgIC8vIFJlbW92ZSAnZHJhZy1vdmVyJyBjbGFzc1xyXG4gIH1cclxuXHJcbiAgcHVibGljIG9uRHJvcChldmVudDogRHJhZ0V2ZW50LCBob3VyOiBzdHJpbmcpIHtcclxuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuXHJcbiAgICBjb25zdCBjdXJyZW50VGFyZ2V0ID0gZXZlbnQuY3VycmVudFRhcmdldCBhcyBIVE1MRWxlbWVudDtcclxuICAgIGN1cnJlbnRUYXJnZXQuY2xhc3NMaXN0LnJlbW92ZSgnZHJhZy1vdmVyJyk7XHJcblxyXG4gICAgbGV0IHBhcnNlZCA9IHRoaXMudHJ5UGFyc2VKU09OT2JqZWN0KGV2ZW50LmRhdGFUcmFuc2ZlciEuZ2V0RGF0YShcInRleHRcIikpO1xyXG5cclxuICAgIGlmICghcGFyc2VkKSB7XHJcbiAgICAgIHRoaXMubmV3T2JqZWN0UGxhbkV2ZW50LmVtaXQoe2N1cnJlbnRIb3VyOiBob3VyLCBkYXRhOiBwYXJzZWQudG9TdHJpbmcoKX0pO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG5cclxuICAgIGNvbnN0IHNwbGl0SG91ciA9IGhvdXIuc3BsaXQoJzonKTtcclxuXHJcbiAgICBjb25zdCBuZXdFbmRNaW51dGVzID0gc3BsaXRIb3VyWzFdID09PSBcIjAwXCIgPyAzMCA6IDA7XHJcbiAgICBjb25zdCBuZXdFbmRIb3VyID0gc3BsaXRIb3VyWzFdID09PSBcIjMwXCIgPyAocGFyc2VJbnQoc3BsaXRIb3VyWzBdKSArIDEpIDogcGFyc2VJbnQoc3BsaXRIb3VyWzBdKTtcclxuXHJcbiAgICBjb25zdCBvcmlnaW5hbFN0YXJ0SG91ciA9IHRoaXMuY29udmVydFRvSG91ck5vdGF0aW9uKHBhcnNlZC5vYmpbdGhpcy5zdGFydFRpbWVQcm9wXSk7XHJcbiAgICAvLyBHZXQgdGhlIHVuaXF1ZSBpZGVudGlmaWVyIHZhbHVlIGZyb20gdGhlIG9iamVjdCB1c2luZyB0aGUgYGlkUHJvcGBcclxuICAgIGNvbnN0IG9iaklkID0gcGFyc2VkLm9ialt0aGlzLmlkUHJvcF07XHJcblxyXG4gICAgLy8gRW5zdXJlIHdlIGNyZWF0ZSBhIG5ldyBvYmplY3QgdG8gYXZvaWQgbXV0YXRpb24gaXNzdWVzXHJcblxyXG4gICAgY29uc3QgdXBkYXRlZE9iamVjdCA9IHtcclxuICAgICAgLi4ucGFyc2VkLm9iaixcclxuICAgICAgW3RoaXMuc3RhcnRUaW1lUHJvcF06IHRoaXMuY3JlYXRlRGF0ZShwYXJzZUludChzcGxpdEhvdXJbMF0pLCBwYXJzZUludChzcGxpdEhvdXJbMV0pKSxcclxuICAgICAgW3RoaXMuZW5kVGltZVByb3BdOiB0aGlzLmNyZWF0ZURhdGUobmV3RW5kSG91ciwgbmV3RW5kTWludXRlcylcclxuICAgIH07XHJcblxyXG5cclxuICAgIC8vIFJlbW92ZSB0aGUgb2JqZWN0IGZyb20gaXRzIG9sZCBob3VyIGJsb2NrIHVzaW5nIGl0cyB1bmlxdWUgaWRcclxuICAgIGNvbnN0IG9yaWdpbmFsSG91ckJsb2NrID0gdGhpcy5mb3JtYXRIb3VyKHBhcnNlSW50KG9yaWdpbmFsU3RhcnRIb3VyLnNwbGl0KCc6JylbMF0pLCBwYXJzZUludChvcmlnaW5hbFN0YXJ0SG91ci5zcGxpdCgnOicpWzFdKSk7XHJcbiAgICB0aGlzLnNjaGVkdWxlZE9iamVjdHNbb3JpZ2luYWxIb3VyQmxvY2tdID0gdGhpcy5zY2hlZHVsZWRPYmplY3RzW29yaWdpbmFsSG91ckJsb2NrXS5maWx0ZXIobyA9PiBvW3RoaXMuaWRQcm9wXSAhPT0gb2JqSWQpO1xyXG5cclxuICAgIC8vIEFkZCB0aGUgb2JqZWN0IHRvIHRoZSBuZXcgaG91ciBibG9ja1xyXG5cclxuICAgIGlmICghdGhpcy5zY2hlZHVsZWRPYmplY3RzW2hvdXJdKSB7XHJcbiAgICAgIHRoaXMuc2NoZWR1bGVkT2JqZWN0c1tob3VyXSA9IFtdO1xyXG4gICAgfVxyXG4gICAgdGhpcy5zY2hlZHVsZWRPYmplY3RzW2hvdXJdLnB1c2godXBkYXRlZE9iamVjdCk7XHJcblxyXG4gICAgLy8gQ2xlYXIgdGhlIGRyYWdnZWQgb2JqZWN0XHJcbiAgICB0aGlzLmRyYWdnZWRPYmplY3QgPSBudWxsO1xyXG5cclxuICAgIHRoaXMudGltZUNoYW5nZUV2ZW50LmVtaXQodXBkYXRlZE9iamVjdCk7XHJcbiAgICAvLyBUcmlnZ2VyIGNoYW5nZSBkZXRlY3Rpb24gdG8gdXBkYXRlIHRoZSB2aWV3XHJcbiAgICB0aGlzLmNkUmVmLmRldGVjdENoYW5nZXMoKTtcclxuXHJcbiAgfVxyXG5cclxuICBwdWJsaWMgY29udmVydFRvSG91ck5vdGF0aW9uKGRhdGU6IERhdGUpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMuZGF0ZVBpcGUudHJhbnNmb3JtKG5ldyBEYXRlKGRhdGUpLnRvSVNPU3RyaW5nKCksICdISDptbScpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGNyZWF0ZURhdGUoaG91cnM6IG51bWJlciwgbWludXRlcz86IG51bWJlcikge1xyXG4gICAgbGV0IGRhdGUgPSBuZXcgRGF0ZSgpO1xyXG4gICAgZGF0ZS5zZXRIb3Vycyhob3Vycyk7XHJcbiAgICBkYXRlLnNldE1pbnV0ZXMobWludXRlcyA/IG1pbnV0ZXMgOiAwKTtcclxuICAgIHJldHVybiBkYXRlO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGRhdGVUb1VuaXhFcG9jaChkYXRlOiBEYXRlKTogbnVtYmVyIHtcclxuICAgIHJldHVybiBNYXRoLmZsb29yKGRhdGUuZ2V0VGltZSgpKSAvIDEwMDA7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZm9ybWF0SG91cihob3VyOiBudW1iZXIsIG1pbnV0ZXM/OiBudW1iZXIpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIGAke2hvdXJ9OiR7bWludXRlcyA/IG1pbnV0ZXMgOiAnMDAnfWA7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYWRkTWludXRlcyhob3VyOiBzdHJpbmcpIHtcclxuICAgIGxldCBzcGxpdCA9IGhvdXIuc3BsaXQoXCI6XCIpO1xyXG4gICAgc3BsaXRbMV0gPSBcIjMwXCI7XHJcbiAgICByZXR1cm4gc3BsaXQuam9pbignOicpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIG9uRG9jdW1lbnRDbGljayhldmVudDogRXZlbnQpIHtcclxuICAgIGNvbnN0IHRhcmdldEVsZW1lbnQgPSBldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQ7XHJcblxyXG4gICAgLy8gQ2xlYXIgYWN0aXZlIHN0YXRlIHdoZW4gY2xpY2tpbmcgb3V0c2lkZVxyXG4gICAgaWYgKCF0YXJnZXRFbGVtZW50LmNsb3Nlc3QoJy5vYmplY3QtZGlzcGxheScpKSB7XHJcbiAgICAgIHRoaXMuYWN0aXZlSGFsZkhvdXIgPSBudWxsO1xyXG4gICAgICB0aGlzLmNkUmVmLmRldGVjdENoYW5nZXMoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBvbk9iamVjdERpc3BsYXlDbGljayhob3VyOiBzdHJpbmcsIGhhbGY6ICdmaXJzdEhhbGYnIHwgJ3NlY29uZEhhbGYnKSB7XHJcbiAgICBjb25zdCBoYWxmSG91cklkZW50aWZpZXIgPSBgJHtob3VyfS0ke2hhbGZ9YDtcclxuXHJcbiAgICBpZiAodGhpcy5hY3RpdmVIYWxmSG91ciA9PT0gaGFsZkhvdXJJZGVudGlmaWVyKSB7XHJcbiAgICAgIC8vIERlYWN0aXZhdGUgaWYgY2xpY2tlZCBhZ2FpblxyXG4gICAgICB0aGlzLmFjdGl2ZUhhbGZIb3VyID0gbnVsbDtcclxuICAgIH0gZWxzZSBpZiAodGhpcy5zY2hlZHVsZWRPYmplY3RzW2hvdXJdPy5sZW5ndGggPiAwIHx8IHRoaXMuc2NoZWR1bGVkT2JqZWN0c1t0aGlzLmFkZE1pbnV0ZXMoaG91cildPy5sZW5ndGggPiAwKSB7XHJcbiAgICAgIC8vIEFjdGl2YXRlIHRoZSBoYWxmLWhvdXIgaWYgdGhlcmUgYXJlIG9iamVjdHNcclxuICAgICAgdGhpcy5hY3RpdmVIYWxmSG91ciA9IGhhbGZIb3VySWRlbnRpZmllcjtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyB0cnlQYXJzZUpTT05PYmplY3QoanNvblN0cmluZzogc3RyaW5nKSB7XHJcbiAgICB0cnkge1xyXG4gICAgICBsZXQgbyA9IEpTT04ucGFyc2UoanNvblN0cmluZyk7XHJcblxyXG4gICAgICAvLyBIYW5kbGUgbm9uLWV4Y2VwdGlvbi10aHJvd2luZyBjYXNlczpcclxuICAgICAgLy8gTmVpdGhlciBKU09OLnBhcnNlKGZhbHNlKSBvciBKU09OLnBhcnNlKDEyMzQpIHRocm93IGVycm9ycywgaGVuY2UgdGhlIHR5cGUtY2hlY2tpbmcsXHJcbiAgICAgIC8vIGJ1dC4uLiBKU09OLnBhcnNlKG51bGwpIHJldHVybnMgbnVsbCwgYW5kIHR5cGVvZiBudWxsID09PSBcIm9iamVjdFwiLFxyXG4gICAgICAvLyBzbyB3ZSBtdXN0IGNoZWNrIGZvciB0aGF0LCB0b28uIFRoYW5rZnVsbHksIG51bGwgaXMgZmFsc2V5LCBzbyB0aGlzIHN1ZmZpY2VzOlxyXG4gICAgICBpZiAobyAmJiB0eXBlb2YgbyA9PT0gXCJvYmplY3RcIikge1xyXG4gICAgICAgIHJldHVybiBvO1xyXG4gICAgICB9XHJcbiAgICB9IGNhdGNoIChlKSB7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH07XHJcbn1cclxuIl19
|