@daypilot/daypilot-lite-angular 5.9.0 → 5.10.0-sandbox.850

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.
@@ -1,5 +1,5 @@
1
1
  import { Component, EventEmitter, Input, Output } from "@angular/core";
2
- import { effect } from '@angular/core';
2
+ import { effect } from "@angular/core";
3
3
  import { DayPilot } from "./core/daypilot-core";
4
4
  import { optHash, rand } from "./util";
5
5
  import * as i0 from "@angular/core";
@@ -9,66 +9,92 @@ class DayPilotSchedulerComponent {
9
9
  config;
10
10
  _requestUpdateFull = false;
11
11
  _requestUpdateEvents = false;
12
+ _requestUpdateResources = false;
12
13
  _requestViewChange = false;
14
+ _visibleRange = {
15
+ start: new DayPilot.Date(),
16
+ end: new DayPilot.Date()
17
+ };
13
18
  _hashOptions = "";
14
19
  _hashEvents = "";
20
+ _hashResources = "";
15
21
  _eventsSet = false;
22
+ _resourcesSet = false;
16
23
  _events = [];
24
+ _resources = [];
25
+ _signalInitialized = false;
26
+ _signalConfig = undefined;
27
+ _signalEvents = undefined;
28
+ _signalResources = undefined;
29
+ _id = "dp_" + new Date().getTime() + rand();
17
30
  get events() {
18
- if (typeof this._events === 'function') {
19
- return this._events();
20
- }
21
31
  return this._events;
22
32
  }
23
33
  set events(value) {
24
34
  this._eventsSet = true;
25
35
  this._events = value;
26
36
  }
27
- _id = "dp_" + new Date().getTime() + rand();
37
+ get resources() {
38
+ return this._resources;
39
+ }
40
+ set resources(value) {
41
+ this._resourcesSet = true;
42
+ this._resources = value;
43
+ }
28
44
  get configResolved() {
29
- return typeof this.config === 'function' ? this.config() : this.config;
45
+ return typeof this.config === "function"
46
+ ? this.config()
47
+ : this.config;
48
+ }
49
+ get eventsResolved() {
50
+ return typeof this._events === "function"
51
+ ? this._events()
52
+ : this._events;
53
+ }
54
+ get resourcesResolved() {
55
+ return typeof this._resources === "function"
56
+ ? this._resources()
57
+ : this._resources;
30
58
  }
31
59
  get id() {
32
60
  return this._id;
33
61
  }
34
62
  constructor() {
35
63
  effect(() => {
36
- if (typeof this._events !== 'function') {
37
- return;
38
- }
39
- const control = this.control;
40
- const events = this._events();
41
- if (control) {
42
- control.internal.upd({ events });
43
- }
44
- });
45
- effect(() => {
46
- if (typeof this.config !== 'function') {
64
+ const update = this.signalUpdateResolved();
65
+ if (!update) {
47
66
  return;
48
67
  }
49
68
  const control = this.control;
50
- const config = this.config();
51
69
  if (control) {
52
- control.internal.upd(config);
70
+ control.internal.upd(update);
53
71
  }
54
72
  });
55
73
  }
56
- async ngOnInit() { }
74
+ async ngOnInit() {
75
+ }
57
76
  ngOnDestroy() {
58
77
  this.dispose();
59
78
  }
60
79
  ngAfterViewInit() {
61
80
  this.control = new DayPilot.Scheduler(this.id);
81
+ const control = this.control;
82
+ control.internal.enableAngular2();
62
83
  this.updateOptions();
84
+ this.updateResources();
63
85
  this.updateEvents();
64
- this._requestUpdateFull = false; // config just loaded and calling init(), no need to call update again
65
- this._requestUpdateEvents = false; // config just loaded and calling init(), no need to call update again
86
+ // The configuration and standalone inputs have just been loaded.
87
+ // init() performs the initial rendering, so no additional update is needed.
88
+ this._requestUpdateFull = false;
89
+ this._requestUpdateResources = false;
90
+ this._requestUpdateEvents = false;
66
91
  this.control.init();
67
92
  }
68
93
  ngDoCheck() {
69
- const eventsAsSignal = typeof this._events === 'function' || !this._eventsSet;
70
- const configAsSignal = typeof this.config === 'function' || !this.config;
71
- if (eventsAsSignal && configAsSignal) {
94
+ const eventsAsSignal = typeof this._events === "function" || !this._eventsSet;
95
+ const resourcesAsSignal = typeof this._resources === "function" || !this._resourcesSet;
96
+ const configAsSignal = typeof this.config === "function" || !this.config;
97
+ if (eventsAsSignal && resourcesAsSignal && configAsSignal) {
72
98
  return;
73
99
  }
74
100
  if (!this.control) {
@@ -77,69 +103,219 @@ class DayPilotSchedulerComponent {
77
103
  if (!configAsSignal) {
78
104
  this.updateOptions();
79
105
  }
106
+ if (!resourcesAsSignal) {
107
+ this.updateResources();
108
+ }
80
109
  if (!eventsAsSignal) {
81
110
  this.updateEvents();
82
111
  }
83
112
  const control = this.control;
84
113
  if (this._requestUpdateFull) {
85
114
  control.internal.upd();
115
+ control.internal.postInit();
86
116
  this._requestUpdateFull = false;
117
+ this._requestUpdateResources = false;
87
118
  this._requestUpdateEvents = false;
88
119
  }
89
- else if (this._requestUpdateEvents) {
90
- control.internal.upd({ "events": this.events });
91
- this._requestUpdateEvents = false;
120
+ else {
121
+ const update = {};
122
+ if (this._requestUpdateResources) {
123
+ update.resources = this.resourcesResolved;
124
+ }
125
+ if (this._requestUpdateEvents) {
126
+ update.events = this.eventsResolved;
127
+ }
128
+ if (this._requestUpdateResources || this._requestUpdateEvents) {
129
+ control.internal.upd(update);
130
+ this._requestUpdateResources = false;
131
+ this._requestUpdateEvents = false;
132
+ }
92
133
  }
93
134
  if (this._requestViewChange) {
94
135
  this._requestViewChange = false;
95
136
  const args = {};
137
+ args.visibleRangeChanged =
138
+ this._visibleRange.start !== this.control.visibleStart() ||
139
+ this._visibleRange.end !== this.control.visibleEnd();
140
+ this._visibleRange.start = this.control.visibleStart();
141
+ this._visibleRange.end = this.control.visibleEnd();
96
142
  this.viewChange.emit(args);
97
143
  }
98
144
  }
99
145
  dispose() {
100
146
  if (this.control) {
101
147
  this.control.dispose();
102
- //@ts-ignore
148
+ // @ts-ignore
103
149
  this.control = null;
104
150
  }
105
151
  }
106
- updateOptions() {
152
+ /**
153
+ * Resolves signal inputs and returns a single Scheduler update.
154
+ *
155
+ * A standalone events/resources input takes precedence over the same
156
+ * property supplied through config.
157
+ */
158
+ signalUpdateResolved() {
159
+ const configIsSignal = typeof this.config === "function";
160
+ const eventsIsSignal = typeof this._events === "function";
161
+ const resourcesIsSignal = typeof this._resources === "function";
162
+ if (!configIsSignal && !eventsIsSignal && !resourcesIsSignal) {
163
+ return null;
164
+ }
165
+ const config = configIsSignal
166
+ ? this.configResolved
167
+ : undefined;
168
+ const events = eventsIsSignal
169
+ ? this.eventsResolved
170
+ : undefined;
171
+ const resources = resourcesIsSignal
172
+ ? this.resourcesResolved
173
+ : undefined;
174
+ const configChanged = configIsSignal && config !== this._signalConfig;
175
+ const eventsChanged = eventsIsSignal && events !== this._signalEvents;
176
+ const resourcesChanged = resourcesIsSignal && resources !== this._signalResources;
177
+ this._signalConfig = config;
178
+ this._signalEvents = events;
179
+ this._signalResources = resources;
180
+ if (!this._signalInitialized) {
181
+ this._signalInitialized = true;
182
+ return null;
183
+ }
184
+ if (!configChanged && !eventsChanged && !resourcesChanged) {
185
+ return null;
186
+ }
187
+ if (configChanged) {
188
+ return this.fullSignalUpdateResolved();
189
+ }
190
+ const update = {};
191
+ if (eventsChanged) {
192
+ update.events = events;
193
+ }
194
+ if (resourcesChanged) {
195
+ update.resources = resources;
196
+ }
197
+ return update;
198
+ }
199
+ /**
200
+ * Creates a full update when a signal-based config changes.
201
+ *
202
+ * Explicit standalone inputs override config.events and
203
+ * config.resources.
204
+ */
205
+ fullSignalUpdateResolved() {
107
206
  const config = this.configResolved;
207
+ const update = config ? { ...config } : {};
208
+ if (this._eventsSet) {
209
+ update.events = this.eventsResolved;
210
+ }
211
+ if (this._resourcesSet) {
212
+ update.resources = this.resourcesResolved;
213
+ }
214
+ return update;
215
+ }
216
+ /**
217
+ * Removes properties from config that are supplied using standalone
218
+ * Angular inputs.
219
+ */
220
+ configResolvedForUpdate() {
221
+ const config = this.configResolved;
222
+ if (!config) {
223
+ return config;
224
+ }
225
+ if (!this._eventsSet && !this._resourcesSet) {
226
+ return config;
227
+ }
228
+ const result = { ...config };
229
+ if (this._eventsSet) {
230
+ delete result.events;
231
+ }
232
+ if (this._resourcesSet) {
233
+ delete result.resources;
234
+ }
235
+ return result;
236
+ }
237
+ updateOptions() {
238
+ const config = this.configResolvedForUpdate();
108
239
  const hash = optHash(config);
109
240
  if (hash !== this._hashOptions) {
110
241
  const control = this.control;
111
- control.internal.loadOptions(config);
112
- this._requestUpdateFull = true;
113
- this._requestViewChange = true;
242
+ if (config && config.resources && !this._resourcesSet) {
243
+ control.internal.resourcesFromAttr();
244
+ }
245
+ if (control.internal.skipUpdate()) {
246
+ control.internal.skipped();
247
+ }
248
+ else {
249
+ control.internal.loadOptions(config);
250
+ this._requestUpdateFull = true;
251
+ this._requestViewChange = true;
252
+ }
114
253
  }
115
254
  this._hashOptions = hash;
116
255
  }
256
+ updateResources() {
257
+ if (!this._resourcesSet) {
258
+ return;
259
+ }
260
+ const resources = this.resourcesResolved;
261
+ const hash = optHash(resources);
262
+ if (hash === this._hashResources) {
263
+ return;
264
+ }
265
+ const control = this.control;
266
+ control.resources = resources;
267
+ control.internal.resourcesFromAttr();
268
+ if (control.internal.skipUpdate()) {
269
+ control.internal.skipped();
270
+ this._hashResources = hash;
271
+ return;
272
+ }
273
+ this._requestUpdateResources = true;
274
+ this._requestViewChange = true;
275
+ this._hashResources = hash;
276
+ }
277
+ /**
278
+ * Replaces the complete event list.
279
+ *
280
+ * No individual event diffing is performed. Signal inputs are detected
281
+ * by reference in signalUpdateResolved(); ordinary array inputs are
282
+ * checked using optHash() from ngDoCheck().
283
+ */
117
284
  updateEvents() {
118
285
  if (!this._eventsSet) {
119
286
  return;
120
287
  }
121
- const hash = optHash(this.events);
122
- if (hash !== this._hashEvents) {
123
- const control = this.control;
124
- control.events.list = this.events;
125
- this._requestUpdateEvents = true;
288
+ const events = this.eventsResolved;
289
+ const hash = optHash(events);
290
+ if (hash === this._hashEvents) {
291
+ return;
126
292
  }
293
+ const control = this.control;
294
+ control.events.list = events;
295
+ if (control.internal.skipUpdate()) {
296
+ control.internal.skipped();
297
+ this._hashEvents = hash;
298
+ return;
299
+ }
300
+ this._requestUpdateEvents = true;
127
301
  this._hashEvents = hash;
128
302
  }
129
303
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: DayPilotSchedulerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
130
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: DayPilotSchedulerComponent, selector: "daypilot-scheduler", inputs: { config: "config", events: "events" }, outputs: { viewChange: "viewChange" }, ngImport: i0, template: `
131
- <div id='{{id}}'></div>`, isInline: true, styles: [""] });
304
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: DayPilotSchedulerComponent, selector: "daypilot-scheduler", inputs: { config: "config", events: "events", resources: "resources" }, outputs: { viewChange: "viewChange" }, ngImport: i0, template: `
305
+ <div id="{{id}}"></div>`, isInline: true, styles: [""] });
132
306
  }
133
307
  export { DayPilotSchedulerComponent };
134
308
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: DayPilotSchedulerComponent, decorators: [{
135
309
  type: Component,
136
- args: [{ selector: 'daypilot-scheduler', template: `
137
- <div id='{{id}}'></div>` }]
310
+ args: [{ selector: "daypilot-scheduler", template: `
311
+ <div id="{{id}}"></div>` }]
138
312
  }], ctorParameters: function () { return []; }, propDecorators: { viewChange: [{
139
313
  type: Output
140
314
  }], config: [{
141
315
  type: Input
142
316
  }], events: [{
143
317
  type: Input
318
+ }], resources: [{
319
+ type: Input
144
320
  }] } });
145
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF5cGlsb3Qtc2NoZWR1bGVyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2RheXBpbG90L2RheXBpbG90LWxpdGUtYW5ndWxhci9zcmMvbGliL2RheXBpbG90LXNjaGVkdWxlci5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFnQixTQUFTLEVBQVcsWUFBWSxFQUFFLEtBQUssRUFBcUIsTUFBTSxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQ2hILE9BQU8sRUFBRSxNQUFNLEVBQUcsTUFBTSxlQUFlLENBQUM7QUFDeEMsT0FBTyxFQUFDLFFBQVEsRUFBQyxNQUFNLHNCQUFzQixDQUFDO0FBQzlDLE9BQU8sRUFBQyxPQUFPLEVBQUUsSUFBSSxFQUE0QixNQUFNLFFBQVEsQ0FBQzs7QUFFaEUsTUFNYSwwQkFBMEI7SUFFOUIsT0FBTyxDQUFzQjtJQUMxQixVQUFVLEdBQWdDLElBQUksWUFBWSxFQUFpQixDQUFDO0lBQzdFLE1BQU0sQ0FBc0I7SUFDN0Isa0JBQWtCLEdBQVksS0FBSyxDQUFDO0lBQ3BDLG9CQUFvQixHQUFZLEtBQUssQ0FBQztJQUN0QyxrQkFBa0IsR0FBWSxLQUFLLENBQUM7SUFDcEMsWUFBWSxHQUFXLEVBQUUsQ0FBQztJQUMxQixXQUFXLEdBQVcsRUFBRSxDQUFDO0lBQ3pCLFVBQVUsR0FBWSxLQUFLLENBQUM7SUFFNUIsT0FBTyxHQUF5QyxFQUFFLENBQUM7SUFFM0QsSUFBVyxNQUFNO1FBQ2YsSUFBSSxPQUFPLElBQUksQ0FBQyxPQUFPLEtBQUssVUFBVSxFQUFFO1lBQ3RDLE9BQU8sSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1NBQ3ZCO1FBQ0QsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDO0lBQ3RCLENBQUM7SUFFRCxJQUNXLE1BQU0sQ0FBQyxLQUEyQztRQUMzRCxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQztRQUN2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LElBQUksQ0FBQyxVQUFVLEVBQUU7WUFDcEIsT0FBTztTQUNSO1FBRUQsTUFBTSxJQUFJLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNsQyxJQUFJLElBQUksS0FBSyxJQUFJLENBQUMsV0FBVyxFQUFFO1lBQzdCLE1BQU0sT0FBTyxHQUFRLElBQUksQ0FBQyxPQUFPLENBQUM7WUFDbEMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQztZQUNsQyxJQUFJLENBQUMsb0JBQW9CLEdBQUcsSUFBSSxDQUFDO1NBQ2xDO1FBQ0QsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUM7SUFDMUIsQ0FBQzt3R0FwSlUsMEJBQTBCOzRGQUExQiwwQkFBMEIsaUpBSjNCOzRCQUNnQjs7U0FHZiwwQkFBMEI7NEZBQTFCLDBCQUEwQjtrQkFOdEMsU0FBUzsrQkFDRSxvQkFBb0IsWUFDcEI7NEJBQ2dCOzBFQU1oQixVQUFVO3NCQUFuQixNQUFNO2dCQUNFLE1BQU07c0JBQWQsS0FBSztnQkFrQkssTUFBTTtzQkFEaEIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7QWZ0ZXJWaWV3SW5pdCwgQ29tcG9uZW50LCBEb0NoZWNrLCBFdmVudEVtaXR0ZXIsIElucHV0LCBPbkRlc3Ryb3ksIE9uSW5pdCwgT3V0cHV0fSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xuaW1wb3J0IHsgZWZmZWN0ICB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtEYXlQaWxvdH0gZnJvbSBcIi4vY29yZS9kYXlwaWxvdC1jb3JlXCI7XG5pbXBvcnQge29wdEhhc2gsIHJhbmQsIEV2ZW50RGlmZiwgT3B0aW9uYWxTaWduYWx9IGZyb20gXCIuL3V0aWxcIjtcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnZGF5cGlsb3Qtc2NoZWR1bGVyJyxcbiAgdGVtcGxhdGU6IGBcbiAgICA8ZGl2IGlkPSd7e2lkfX0nPjwvZGl2PmAsXG4gIHN0eWxlczogW2BgXVxufSlcbmV4cG9ydCBjbGFzcyBEYXlQaWxvdFNjaGVkdWxlckNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95LCBBZnRlclZpZXdJbml0LCBEb0NoZWNrIHtcblxuICBwdWJsaWMgY29udHJvbCE6IERheVBpbG90LlNjaGVkdWxlcjtcbiAgQE91dHB1dCgpIHZpZXdDaGFuZ2U6IEV2ZW50RW1pdHRlcjxEYXlQaWxvdC5EYXRlPiA9IG5ldyBFdmVudEVtaXR0ZXI8RGF5UGlsb3QuRGF0ZT4oKTtcbiAgQElucHV0KCkgY29uZmlnOiBPcHRpb25hbFNpZ25hbDxhbnk+O1xuICBwcml2YXRlIF9yZXF1ZXN0VXBkYXRlRnVsbDogYm9vbGVhbiA9IGZhbHNlO1xuICBwcml2YXRlIF9yZXF1ZXN0VXBkYXRlRXZlbnRzOiBib29sZWFuID0gZmFsc2U7XG4gIHByaXZhdGUgX3JlcXVlc3RWaWV3Q2hhbmdlOiBib29sZWFuID0gZmFsc2U7XG4gIHByaXZhdGUgX2hhc2hPcHRpb25zOiBzdHJpbmcgPSBcIlwiO1xuICBwcml2YXRlIF9oYXNoRXZlbnRzOiBzdHJpbmcgPSBcIlwiO1xuICBwcml2YXRlIF9ldmVudHNTZXQ6IGJvb2xlYW4gPSBmYWxzZTtcblxuICBwcml2YXRlIF9ldmVudHM6IE9wdGlvbmFsU2lnbmFsPERheVBpbG90LkV2ZW50RGF0YVtdPiA9IFtdO1xuXG4gIHB1YmxpYyBnZXQgZXZlbnRzKCk6IERheVBpbG90LkV2ZW50RGF0YVtdIHtcbiAgICBpZiAodHlwZW9mIHRoaXMuX2V2ZW50cyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcmV0dXJuIHRoaXMuX2V2ZW50cygpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fZXZlbnRzO1xuICB9XG5cbiAgQElucHV0KClcbiAgcHVibGljIHNldCBldmVudHModmFsdWU6IE9wdGlvbmFsU2lnbmFsPERheVBpbG90LkV2ZW50RGF0YVtdPikge1xuICAgIHRoaXMuX2V2ZW50c1NldCA9IHRydWU7XG4gICAgdGhpcy5fZXZlbnRzID0gdmFsdWU7XG4gIH1cblxuICBwcml2YXRlIF9pZDogc3RyaW5nID0gXCJkcF9cIiArIG5ldyBEYXRlKCkuZ2V0VGltZSgpICsgcmFuZCgpO1xuXG4gIHByaXZhdGUgZ2V0IGNvbmZpZ1Jlc29sdmVkKCkge1xuICAgIHJldHVybiB0eXBlb2YgdGhpcy5jb25maWcgPT09ICdmdW5jdGlvbicgPyB0aGlzLmNvbmZpZygpIDogdGhpcy5jb25maWc7XG4gIH1cblxuICBnZXQgaWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2lkO1xuICB9XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgZWZmZWN0KCgpID0+IHtcbiAgICAgIGlmICh0eXBlb2YgdGhpcy5fZXZlbnRzICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGNvbnRyb2w6IGFueSA9IHRoaXMuY29udHJvbDtcbiAgICAgIGNvbnN0IGV2ZW50cyA9ICg8YW55PnRoaXMuX2V2ZW50cykoKTtcbiAgICAgIGlmIChjb250cm9sKSB7XG4gICAgICAgICAgY29udHJvbC5pbnRlcm5hbC51cGQoe2V2ZW50c30pO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgZWZmZWN0KCgpID0+IHtcbiAgICAgIGlmICh0eXBlb2YgdGhpcy5jb25maWcgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3QgY29udHJvbDogYW55ID0gdGhpcy5jb250cm9sO1xuICAgICAgY29uc3QgY29uZmlnID0gKDxhbnk+dGhpcy5jb25maWcpKCk7XG4gICAgICBpZiAoY29udHJvbCkge1xuICAgICAgICAgIGNvbnRyb2wuaW50ZXJuYWwudXBkKGNvbmZpZyk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBhc3luYyBuZ09uSW5pdCgpIHsgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuZGlzcG9zZSgpO1xuICB9XG5cbiAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuICAgIHRoaXMuY29udHJvbCA9IG5ldyBEYXlQaWxvdC5TY2hlZHVsZXIodGhpcy5pZCk7XG4gICAgdGhpcy51cGRhdGVPcHRpb25zKCk7XG4gICAgdGhpcy51cGRhdGVFdmVudHMoKTtcbiAgICB0aGlzLl9yZXF1ZXN0VXBkYXRlRnVsbCA9IGZhbHNlOyAvLyBjb25maWcganVzdCBsb2FkZWQgYW5kIGNhbGxpbmcgaW5pdCgpLCBubyBuZWVkIHRvIGNhbGwgdXBkYXRlIGFnYWluXG4gICAgdGhpcy5fcmVxdWVzdFVwZGF0ZUV2ZW50cyA9IGZhbHNlOyAvLyBjb25maWcganVzdCBsb2FkZWQgYW5kIGNhbGxpbmcgaW5pdCgpLCBubyBuZWVkIHRvIGNhbGwgdXBkYXRlIGFnYWluXG4gICAgdGhpcy5jb250cm9sLmluaXQoKTtcbiAgfVxuXG4gIG5nRG9DaGVjaygpOiB2b2lkIHtcblxuICAgIGNvbnN0IGV2ZW50c0FzU2lnbmFsID0gdHlwZW9mIHRoaXMuX2V2ZW50cyA9PT0gJ2Z1bmN0aW9uJyB8fCAhdGhpcy5fZXZlbnRzU2V0O1xuICAgIGNvbnN0IGNvbmZpZ0FzU2lnbmFsID0gdHlwZW9mIHRoaXMuY29uZmlnID09PSAnZnVuY3Rpb24nIHx8ICF0aGlzLmNvbmZpZztcblxuICAgIGlmIChldmVudHNBc1NpZ25hbCAmJiBjb25maWdBc1NpZ25hbCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5jb250cm9sKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKCFjb25maWdBc1NpZ25hbCkge1xuICAgICAgdGhpcy51cGRhdGVPcHRpb25zKCk7XG4gICAgfVxuICAgIGlmICghZXZlbnRzQXNTaWduYWwpIHtcbiAgICAgIHRoaXMudXBkYXRlRXZlbnRzKCk7XG4gICAgfVxuXG4gICAgY29uc3QgY29udHJvbDogYW55ID0gdGhpcy5jb250cm9sO1xuXG4gICAgaWYgKHRoaXMuX3JlcXVlc3RVcGRhdGVGdWxsKSB7XG4gICAgICBjb250cm9sLmludGVybmFsLnVwZCgpO1xuICAgICAgdGhpcy5fcmVxdWVzdFVwZGF0ZUZ1bGwgPSBmYWxzZTtcbiAgICAgIHRoaXMuX3JlcXVlc3RVcGRhdGVFdmVudHMgPSBmYWxzZTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuX3JlcXVlc3RVcGRhdGVFdmVudHMpIHtcbiAgICAgIGNvbnRyb2wuaW50ZXJuYWwudXBkKHtcImV2ZW50c1wiOiB0aGlzLmV2ZW50c30pO1xuICAgICAgdGhpcy5fcmVxdWVzdFVwZGF0ZUV2ZW50cyA9IGZhbHNlO1xuICAgIH1cbiAgICBpZiAodGhpcy5fcmVxdWVzdFZpZXdDaGFuZ2UpIHtcbiAgICAgIHRoaXMuX3JlcXVlc3RWaWV3Q2hhbmdlID0gZmFsc2U7XG4gICAgICBjb25zdCBhcmdzOiBhbnkgPSB7fTtcbiAgICAgIHRoaXMudmlld0NoYW5nZS5lbWl0KGFyZ3MpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZGlzcG9zZSgpIHtcbiAgICBpZiAodGhpcy5jb250cm9sKSB7XG4gICAgICB0aGlzLmNvbnRyb2wuZGlzcG9zZSgpO1xuICAgICAgLy9AdHMtaWdub3JlXG4gICAgICB0aGlzLmNvbnRyb2wgPSBudWxsO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlT3B0aW9ucygpOiB2b2lkIHtcblxuICAgIGNvbnN0IGNvbmZpZyA9IHRoaXMuY29uZmlnUmVzb2x2ZWQ7XG5cbiAgICBjb25zdCBoYXNoID0gb3B0SGFzaChjb25maWcpO1xuICAgIGlmIChoYXNoICE9PSB0aGlzLl9oYXNoT3B0aW9ucykge1xuICAgICAgY29uc3QgY29udHJvbDogYW55ID0gdGhpcy5jb250cm9sO1xuICAgICAgY29udHJvbC5pbnRlcm5hbC5sb2FkT3B0aW9ucyhjb25maWcpO1xuICAgICAgdGhpcy5fcmVxdWVzdFVwZGF0ZUZ1bGwgPSB0cnVlO1xuICAgICAgdGhpcy5fcmVxdWVzdFZpZXdDaGFuZ2UgPSB0cnVlO1xuICAgIH1cbiAgICB0aGlzLl9oYXNoT3B0aW9ucyA9IGhhc2g7XG5cbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlRXZlbnRzKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5fZXZlbnRzU2V0KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgaGFzaCA9IG9wdEhhc2godGhpcy5ldmVudHMpO1xuICAgIGlmIChoYXNoICE9PSB0aGlzLl9oYXNoRXZlbnRzKSB7XG4gICAgICBjb25zdCBjb250cm9sOiBhbnkgPSB0aGlzLmNvbnRyb2w7XG4gICAgICBjb250cm9sLmV2ZW50cy5saXN0ID0gdGhpcy5ldmVudHM7XG4gICAgICB0aGlzLl9yZXF1ZXN0VXBkYXRlRXZlbnRzID0gdHJ1ZTtcbiAgICB9XG4gICAgdGhpcy5faGFzaEV2ZW50cyA9IGhhc2g7XG4gIH1cbn1cbiJdfQ==
321
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF5cGlsb3Qtc2NoZWR1bGVyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2RheXBpbG90L2RheXBpbG90LWxpdGUtYW5ndWxhci9zcmMvbGliL2RheXBpbG90LXNjaGVkdWxlci5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUVMLFNBQVMsRUFFVCxZQUFZLEVBQ1osS0FBSyxFQUdMLE1BQU0sRUFDUCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3ZDLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNoRCxPQUFPLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBa0IsTUFBTSxRQUFRLENBQUM7O0FBRXZELE1BTWEsMEJBQTBCO0lBRTlCLE9BQU8sQ0FBc0I7SUFHcEMsVUFBVSxHQUFnQyxJQUFJLFlBQVksRUFBaUIsQ0FBQztJQUc1RSxNQUFNLENBQXNCO0lBRXBCLGtCQUFrQixHQUFZLEtBQUssQ0FBQztJQUNwQyxvQkFBb0IsR0FBWSxLQUFLLENBQUM7SUFDdEMsdUJBQXVCLEdBQVksS0FBSyxDQUFDO0lBQ3pDLGtCQUFrQixHQUFZLEtBQUssQ0FBQztJQUVwQyxhQUFhLEdBQUc7UUFDdEIsS0FBSyxFQUFFLElBQUksUUFBUSxDQUFDLElBQUksRUFBRTtRQUMxQixHQUFHLEVBQUUsSUFBSSxRQUFRLENBQUMsSUFBSSxFQUFFO0tBQ3pCLENBQUM7SUFFTSxZQUFZLEdBQVcsRUFBRSxDQUFDO0lBQzFCLFdBQVcsR0FBVyxFQUFFLENBQUM7SUFDekIsY0FBYyxHQUFXLEVBQUUsQ0FBQztJQUU1QixVQUFVLEdBQVksS0FBSyxDQUFDO0lBQzVCLGFBQWEsR0FBWSxLQUFLLENBQUM7SUFFL0IsT0FBTyxHQUF5QyxFQUFFLENBQUM7SUFDbkQsVUFBVSxHQUE0QyxFQUFFLENB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O1lBQ2pDLE9BQU8sQ0FBQyxRQUFRLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDM0IsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUM7WUFDeEIsT0FBTztTQUNSO1FBRUQsSUFBSSxDQUFDLG9CQUFvQixHQUFHLElBQUksQ0FBQztRQUNqQyxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQztJQUMxQixDQUFDO3dHQWpaVSwwQkFBMEI7NEZBQTFCLDBCQUEwQix5S0FKM0I7NEJBQ2dCOztTQUdmLDBCQUEwQjs0RkFBMUIsMEJBQTBCO2tCQU50QyxTQUFTOytCQUNFLG9CQUFvQixZQUNwQjs0QkFDZ0I7MEVBUTFCLFVBQVU7c0JBRFQsTUFBTTtnQkFJUCxNQUFNO3NCQURMLEtBQUs7Z0JBbUNLLE1BQU07c0JBRGhCLEtBQUs7Z0JBV0ssU0FBUztzQkFEbkIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEFmdGVyVmlld0luaXQsXG4gIENvbXBvbmVudCxcbiAgRG9DaGVjayxcbiAgRXZlbnRFbWl0dGVyLFxuICBJbnB1dCxcbiAgT25EZXN0cm95LFxuICBPbkluaXQsXG4gIE91dHB1dFxufSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xuaW1wb3J0IHsgZWZmZWN0IH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcbmltcG9ydCB7IERheVBpbG90IH0gZnJvbSBcIi4vY29yZS9kYXlwaWxvdC1jb3JlXCI7XG5pbXBvcnQgeyBvcHRIYXNoLCByYW5kLCBPcHRpb25hbFNpZ25hbCB9IGZyb20gXCIuL3V0aWxcIjtcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiBcImRheXBpbG90LXNjaGVkdWxlclwiLFxuICB0ZW1wbGF0ZTogYFxuICAgIDxkaXYgaWQ9XCJ7e2lkfX1cIj48L2Rpdj5gLFxuICBzdHlsZXM6IFtgYF1cbn0pXG5leHBvcnQgY2xhc3MgRGF5UGlsb3RTY2hlZHVsZXJDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSwgQWZ0ZXJWaWV3SW5pdCwgRG9DaGVjayB7XG5cbiAgcHVibGljIGNvbnRyb2whOiBEYXlQaWxvdC5TY2hlZHVsZXI7XG5cbiAgQE91dHB1dCgpXG4gIHZpZXdDaGFuZ2U6IEV2ZW50RW1pdHRlcjxEYXlQaWxvdC5EYXRlPiA9IG5ldyBFdmVudEVtaXR0ZXI8RGF5UGlsb3QuRGF0ZT4oKTtcblxuICBASW5wdXQoKVxuICBjb25maWc6IE9wdGlvbmFsU2lnbmFsPGFueT47XG5cbiAgcHJpdmF0ZSBfcmVxdWVzdFVwZGF0ZUZ1bGw6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHJpdmF0ZSBfcmVxdWVzdFVwZGF0ZUV2ZW50czogYm9vbGVhbiA9IGZhbHNlO1xuICBwcml2YXRlIF9yZXF1ZXN0VXBkYXRlUmVzb3VyY2VzOiBib29sZWFuID0gZmFsc2U7XG4gIHByaXZhdGUgX3JlcXVlc3RWaWV3Q2hhbmdlOiBib29sZWFuID0gZmFsc2U7XG5cbiAgcHJpdmF0ZSBfdmlzaWJsZVJhbmdlID0ge1xuICAgIHN0YXJ0OiBuZXcgRGF5UGlsb3QuRGF0ZSgpLFxuICAgIGVuZDogbmV3IERheVBpbG90LkRhdGUoKVxuICB9O1xuXG4gIHByaXZhdGUgX2hhc2hPcHRpb25zOiBzdHJpbmcgPSBcIlwiO1xuICBwcml2YXRlIF9oYXNoRXZlbnRzOiBzdHJpbmcgPSBcIlwiO1xuICBwcml2YXRlIF9oYXNoUmVzb3VyY2VzOiBzdHJpbmcgPSBcIlwiO1xuXG4gIHByaXZhdGUgX2V2ZW50c1NldDogYm9vbGVhbiA9IGZhbHNlO1xuICBwcml2YXRlIF9yZXNvdXJjZXNTZXQ6IGJvb2xlYW4gPSBmYWxzZTtcblxuICBwcml2YXRlIF9ldmVudHM6IE9wdGlvbmFsU2lnbmFsPERheVBpbG90LkV2ZW50RGF0YVtdPiA9IFtdO1xuICBwcml2YXRlIF9yZXNvdXJjZXM6IE9wdGlvbmFsU2lnbmFsPERheVBpbG90LlJlc291cmNlRGF0YVtdPiA9IFtdO1xuXG4gIHByaXZhdGUgX3NpZ25hbEluaXRpYWxpemVkOiBib29sZWFuID0gZmFsc2U7XG4gIHByaXZhdGUgX3NpZ25hbENvbmZpZzogYW55ID0gdW5kZWZpbmVkO1xuICBwcml2YXRlIF9zaWduYWxFdmVudHM6IERheVBpbG90LkV2ZW50RGF0YVtdIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuICBwcml2YXRlIF9zaWduYWxSZXNvdXJjZXM6IERheVBpbG90LlJlc291cmNlRGF0YVtdIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuXG4gIHByaXZhdGUgX2lkOiBzdHJpbmcgPSBcImRwX1wiICsgbmV3IERhdGUoKS5nZXRUaW1lKCkgKyByYW5kKCk7XG5cbiAgcHVibGljIGdldCBldmVudHMoKTogT3B0aW9uYWxTaWduYWw8RGF5UGlsb3QuRXZlbnREYXRhW10+IHtcbiAgICByZXR1cm4gdGhpcy5fZXZlbnRzO1xuICB9XG5cbiAgQElucHV0KClcbiAgcHVibGljIHNldCBldmVudHModmFsdWU6IE9wdGlvbmFsU2lnbmFsPERheVBpbG90LkV2ZW50RGF0YVtdPikge1xuICAgIHRoaXMuX2V2ZW50c1NldCA9IHRydWU7XG4gICAgdGhpcy5fZXZlbnRzID0gdmFsdWU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHJlc291cmNlcygpOiBPcHRpb25hbFNpZ25hbDxEYXlQaWxvdC5SZXNvdXJjZURhdGFbXT4ge1xuICAgIHJldHVybiB0aGlzLl9yZXNvdXJjZXM7XG4gIH1cblxuICBASW5wdXQoKVxuICBwdWJsaWMgc2V0IHJlc291cmNlcyh2YWx1ZTogT3B0aW9uYWxTaWduYWw8RGF5UGlsb3QuUmVzb3VyY2VEYXRhW10+KSB7XG4gICAgdGhpcy5fcmVzb3VyY2VzU2V0ID0gdHJ1ZTtcbiAgICB0aGlzLl9yZXNvdXJjZXMgPSB2YWx1ZTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0IGNvbmZpZ1Jlc29sdmVkKCk6IGFueSB7XG4gICAgcmV0dXJuIHR5cGVvZiB0aGlzLmNvbmZpZyA9PT0gXCJmdW5jdGlvblwiXG4gICAgICA/IHRoaXMuY29uZmlnKClcbiAgICAgIDogdGhpcy5jb25maWc7XG4gIH1cblxuICBwcml2YXRlIGdldCBldmVudHNSZXNvbHZlZCgpOiBEYXlQaWxvdC5FdmVudERhdGFbXSB7XG4gICAgcmV0dXJuIHR5cGVvZiB0aGlzLl9ldmVudHMgPT09IFwiZnVuY3Rpb25cIlxuICAgICAgPyB0aGlzLl9ldmVudHMoKVxuICAgICAgOiB0aGlzLl9ldmVudHM7XG4gIH1cblxuICBwcml2YXRlIGdldCByZXNvdXJjZXNSZXNvbHZlZCgpOiBEYXlQaWxvdC5SZXNvdXJjZURhdGFbXSB7XG4gICAgcmV0dXJuIHR5cGVvZiB0aGlzLl9yZXNvdXJjZXMgPT09IFwiZnVuY3Rpb25cIlxuICAgICAgPyB0aGlzLl9yZXNvdXJjZXMoKVxuICAgICAgOiB0aGlzLl9yZXNvdXJjZXM7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGlkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2lkO1xuICB9XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgZWZmZWN0KCgpID0+IHtcbiAgICAgIGNvbnN0IHVwZGF0ZSA9IHRoaXMuc2lnbmFsVXBkYXRlUmVzb2x2ZWQoKTtcblxuICAgICAgaWYgKCF1cGRhdGUpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBjb250cm9sOiBhbnkgPSB0aGlzLmNvbnRyb2w7XG5cbiAgICAgIGlmIChjb250cm9sKSB7XG4gICAgICAgIGNvbnRyb2wuaW50ZXJuYWwudXBkKHVwZGF0ZSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBhc3luYyBuZ09uSW5pdCgpIHtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuZGlzcG9zZSgpO1xuICB9XG5cbiAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuICAgIHRoaXMuY29udHJvbCA9IG5ldyBEYXlQaWxvdC5TY2hlZHVsZXIodGhpcy5pZCk7XG5cbiAgICBjb25zdCBjb250cm9sOiBhbnkgPSB0aGlzLmNvbnRyb2w7XG4gICAgY29udHJvbC5pbnRlcm5hbC5lbmFibGVBbmd1bGFyMigpO1xuXG4gICAgdGhpcy51cGRhdGVPcHRpb25zKCk7XG4gICAgdGhpcy51cGRhdGVSZXNvdXJjZXMoKTtcbiAgICB0aGlzLnVwZGF0ZUV2ZW50cygpO1xuXG4gICAgLy8gVGhlIGNvbmZpZ3VyYXRpb24gYW5kIHN0YW5kYWxvbmUgaW5wdXRzIGhhdmUganVzdCBiZWVuIGxvYWRlZC5cbiAgICAvLyBpbml0KCkgcGVyZm9ybXMgdGhlIGluaXRpYWwgcmVuZGVyaW5nLCBzbyBubyBhZGRpdGlvbmFsIHVwZGF0ZSBpcyBuZWVkZWQuXG4gICAgdGhpcy5fcmVxdWVzdFVwZGF0ZUZ1bGwgPSBmYWxzZTtcbiAgICB0aGlzLl9yZXF1ZXN0VXBkYXRlUmVzb3VyY2VzID0gZmFsc2U7XG4gICAgdGhpcy5fcmVxdWVzdFVwZGF0ZUV2ZW50cyA9IGZhbHNlO1xuXG4gICAgdGhpcy5jb250cm9sLmluaXQoKTtcbiAgfVxuXG4gIG5nRG9DaGVjaygpOiB2b2lkIHtcbiAgICBjb25zdCBldmVudHNBc1NpZ25hbCA9XG4gICAgICB0eXBlb2YgdGhpcy5fZXZlbnRzID09PSBcImZ1bmN0aW9uXCIgfHwgIXRoaXMuX2V2ZW50c1NldDtcblxuICAgIGNvbnN0IHJlc291cmNlc0FzU2lnbmFsID1cbiAgICAgIHR5cGVvZiB0aGlzLl9yZXNvdXJjZXMgPT09IFwiZnVuY3Rpb25cIiB8fCAhdGhpcy5fcmVzb3VyY2VzU2V0O1xuXG4gICAgY29uc3QgY29uZmlnQXNTaWduYWwgPVxuICAgICAgdHlwZW9mIHRoaXMuY29uZmlnID09PSBcImZ1bmN0aW9uXCIgfHwgIXRoaXMuY29uZmlnO1xuXG4gICAgaWYgKGV2ZW50c0FzU2lnbmFsICYmIHJlc291cmNlc0FzU2lnbmFsICYmIGNvbmZpZ0FzU2lnbmFsKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLmNvbnRyb2wpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoIWNvbmZpZ0FzU2lnbmFsKSB7XG4gICAgICB0aGlzLnVwZGF0ZU9wdGlvbnMoKTtcbiAgICB9XG5cbiAgICBpZiAoIXJlc291cmNlc0FzU2lnbmFsKSB7XG4gICAgICB0aGlzLnVwZGF0ZVJlc291cmNlcygpO1xuICAgIH1cblxuICAgIGlmICghZXZlbnRzQXNTaWduYWwpIHtcbiAgICAgIHRoaXMudXBkYXRlRXZlbnRzKCk7XG4gICAgfVxuXG4gICAgY29uc3QgY29udHJvbDogYW55ID0gdGhpcy5jb250cm9sO1xuXG4gICAgaWYgKHRoaXMuX3JlcXVlc3RVcGRhdGVGdWxsKSB7XG4gICAgICBjb250cm9sLmludGVybmFsLnVwZCgpO1xuICAgICAgY29udHJvbC5pbnRlcm5hbC5wb3N0SW5pdCgpO1xuXG4gICAgICB0aGlzLl9yZXF1ZXN0VXBkYXRlRnVsbCA9IGZhbHNlO1xuICAgICAgdGhpcy5fcmVxdWVzdFVwZGF0ZVJlc291cmNlcyA9IGZhbHNlO1xuICAgICAgdGhpcy5fcmVxdWVzdFVwZGF0ZUV2ZW50cyA9IGZhbHNlO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCB1cGRhdGU6IGFueSA9IHt9O1xuXG4gICAgICBpZiAodGhpcy5fcmVxdWVzdFVwZGF0ZVJlc291cmNlcykge1xuICAgICAgICB1cGRhdGUucmVzb3VyY2VzID0gdGhpcy5yZXNvdXJjZXNSZXNvbHZlZDtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuX3JlcXVlc3RVcGRhdGVFdmVudHMpIHtcbiAgICAgICAgdXBkYXRlLmV2ZW50cyA9IHRoaXMuZXZlbnRzUmVzb2x2ZWQ7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLl9yZXF1ZXN0VXBkYXRlUmVzb3VyY2VzIHx8IHRoaXMuX3JlcXVlc3RVcGRhdGVFdmVudHMpIHtcbiAgICAgICAgY29udHJvbC5pbnRlcm5hbC51cGQodXBkYXRlKTtcblxuICAgICAgICB0aGlzLl9yZXF1ZXN0VXBkYXRlUmVzb3VyY2VzID0gZmFsc2U7XG4gICAgICAgIHRoaXMuX3JlcXVlc3RVcGRhdGVFdmVudHMgPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodGhpcy5fcmVxdWVzdFZpZXdDaGFuZ2UpIHtcbiAgICAgIHRoaXMuX3JlcXVlc3RWaWV3Q2hhbmdlID0gZmFsc2U7XG5cbiAgICAgIGNvbnN0IGFyZ3M6IGFueSA9IHt9O1xuXG4gICAgICBhcmdzLnZpc2libGVSYW5nZUNoYW5nZWQgPVxuICAgICAgICB0aGlzLl92aXNpYmxlUmFuZ2Uuc3RhcnQgIT09IHRoaXMuY29udHJvbC52aXNpYmxlU3RhcnQoKSB8fFxuICAgICAgICB0aGlzLl92aXNpYmxlUmFuZ2UuZW5kICE9PSB0aGlzLmNvbnRyb2wudmlzaWJsZUVuZCgpO1xuXG4gICAgICB0aGlzLl92aXNpYmxlUmFuZ2Uuc3RhcnQgPSB0aGlzLmNvbnRyb2wudmlzaWJsZVN0YXJ0KCk7XG4gICAgICB0aGlzLl92aXNpYmxlUmFuZ2UuZW5kID0gdGhpcy5jb250cm9sLnZpc2libGVFbmQoKTtcblxuICAgICAgdGhpcy52aWV3Q2hhbmdlLmVtaXQoYXJncyk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBkaXNwb3NlKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmNvbnRyb2wpIHtcbiAgICAgIHRoaXMuY29udHJvbC5kaXNwb3NlKCk7XG5cbiAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgIHRoaXMuY29udHJvbCA9IG51bGw7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmVzIHNpZ25hbCBpbnB1dHMgYW5kIHJldHVybnMgYSBzaW5nbGUgU2NoZWR1bGVyIHVwZGF0ZS5cbiAgICpcbiAgICogQSBzdGFuZGFsb25lIGV2ZW50cy9yZXNvdXJjZXMgaW5wdXQgdGFrZXMgcHJlY2VkZW5jZSBvdmVyIHRoZSBzYW1lXG4gICAqIHByb3BlcnR5IHN1cHBsaWVkIHRocm91Z2ggY29uZmlnLlxuICAgKi9cbiAgcHJpdmF0ZSBzaWduYWxVcGRhdGVSZXNvbHZlZCgpOiBhbnkgfCBudWxsIHtcbiAgICBjb25zdCBjb25maWdJc1NpZ25hbCA9IHR5cGVvZiB0aGlzLmNvbmZpZyA9PT0gXCJmdW5jdGlvblwiO1xuICAgIGNvbnN0IGV2ZW50c0lzU2lnbmFsID0gdHlwZW9mIHRoaXMuX2V2ZW50cyA9PT0gXCJmdW5jdGlvblwiO1xuICAgIGNvbnN0IHJlc291cmNlc0lzU2lnbmFsID0gdHlwZW9mIHRoaXMuX3Jlc291cmNlcyA9PT0gXCJmdW5jdGlvblwiO1xuXG4gICAgaWYgKCFjb25maWdJc1NpZ25hbCAmJiAhZXZlbnRzSXNTaWduYWwgJiYgIXJlc291cmNlc0lzU2lnbmFsKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCBjb25maWcgPSBjb25maWdJc1NpZ25hbFxuICAgICAgPyB0aGlzLmNvbmZpZ1Jlc29sdmVkXG4gICAgICA6IHVuZGVmaW5lZDtcblxuICAgIGNvbnN0IGV2ZW50cyA9IGV2ZW50c0lzU2lnbmFsXG4gICAgICA/IHRoaXMuZXZlbnRzUmVzb2x2ZWRcbiAgICAgIDogdW5kZWZpbmVkO1xuXG4gICAgY29uc3QgcmVzb3VyY2VzID0gcmVzb3VyY2VzSXNTaWduYWxcbiAgICAgID8gdGhpcy5yZXNvdXJjZXNSZXNvbHZlZFxuICAgICAgOiB1bmRlZmluZWQ7XG5cbiAgICBjb25zdCBjb25maWdDaGFuZ2VkID1cbiAgICAgIGNvbmZpZ0lzU2lnbmFsICYmIGNvbmZpZyAhPT0gdGhpcy5fc2lnbmFsQ29uZmlnO1xuXG4gICAgY29uc3QgZXZlbnRzQ2hhbmdlZCA9XG4gICAgICBldmVudHNJc1NpZ25hbCAmJiBldmVudHMgIT09IHRoaXMuX3NpZ25hbEV2ZW50cztcblxuICAgIGNvbnN0IHJlc291cmNlc0NoYW5nZWQgPVxuICAgICAgcmVzb3VyY2VzSXNTaWduYWwgJiYgcmVzb3VyY2VzICE9PSB0aGlzLl9zaWduYWxSZXNvdXJjZXM7XG5cbiAgICB0aGlzLl9zaWduYWxDb25maWcgPSBjb25maWc7XG4gICAgdGhpcy5fc2lnbmFsRXZlbnRzID0gZXZlbnRzO1xuICAgIHRoaXMuX3NpZ25hbFJlc291cmNlcyA9IHJlc291cmNlcztcblxuICAgIGlmICghdGhpcy5fc2lnbmFsSW5pdGlhbGl6ZWQpIHtcbiAgICAgIHRoaXMuX3NpZ25hbEluaXRpYWxpemVkID0gdHJ1ZTtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGlmICghY29uZmlnQ2hhbmdlZCAmJiAhZXZlbnRzQ2hhbmdlZCAmJiAhcmVzb3VyY2VzQ2hhbmdlZCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgaWYgKGNvbmZpZ0NoYW5nZWQpIHtcbiAgICAgIHJldHVybiB0aGlzLmZ1bGxTaWduYWxVcGRhdGVSZXNvbHZlZCgpO1xuICAgIH1cblxuICAgIGNvbnN0IHVwZGF0ZTogYW55ID0ge307XG5cbiAgICBpZiAoZXZlbnRzQ2hhbmdlZCkge1xuICAgICAgdXBkYXRlLmV2ZW50cyA9IGV2ZW50cztcbiAgICB9XG5cbiAgICBpZiAocmVzb3VyY2VzQ2hhbmdlZCkge1xuICAgICAgdXBkYXRlLnJlc291cmNlcyA9IHJlc291cmNlcztcbiAgICB9XG5cbiAgICByZXR1cm4gdXBkYXRlO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBmdWxsIHVwZGF0ZSB3aGVuIGEgc2lnbmFsLWJhc2VkIGNvbmZpZyBjaGFuZ2VzLlxuICAgKlxuICAgKiBFeHBsaWNpdCBzdGFuZGFsb25lIGlucHV0cyBvdmVycmlkZSBjb25maWcuZXZlbnRzIGFuZFxuICAgKiBjb25maWcucmVzb3VyY2VzLlxuICAgKi9cbiAgcHJpdmF0ZSBmdWxsU2lnbmFsVXBkYXRlUmVzb2x2ZWQoKTogYW55IHtcbiAgICBjb25zdCBjb25maWcgPSB0aGlzLmNvbmZpZ1Jlc29sdmVkO1xuICAgIGNvbnN0IHVwZGF0ZTogYW55ID0gY29uZmlnID8geyAuLi5jb25maWcgfSA6IHt9O1xuXG4gICAgaWYgKHRoaXMuX2V2ZW50c1NldCkge1xuICAgICAgdXBkYXRlLmV2ZW50cyA9IHRoaXMuZXZlbnRzUmVzb2x2ZWQ7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX3Jlc291cmNlc1NldCkge1xuICAgICAgdXBkYXRlLnJlc291cmNlcyA9IHRoaXMucmVzb3VyY2VzUmVzb2x2ZWQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIHVwZGF0ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmVzIHByb3BlcnRpZXMgZnJvbSBjb25maWcgdGhhdCBhcmUgc3VwcGxpZWQgdXNpbmcgc3RhbmRhbG9uZVxuICAgKiBBbmd1bGFyIGlucHV0cy5cbiAgICovXG4gIHByaXZhdGUgY29uZmlnUmVzb2x2ZWRGb3JVcGRhdGUoKTogYW55IHtcbiAgICBjb25zdCBjb25maWcgPSB0aGlzLmNvbmZpZ1Jlc29sdmVkO1xuXG4gICAgaWYgKCFjb25maWcpIHtcbiAgICAgIHJldHVybiBjb25maWc7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLl9ldmVudHNTZXQgJiYgIXRoaXMuX3Jlc291cmNlc1NldCkge1xuICAgICAgcmV0dXJuIGNvbmZpZztcbiAgICB9XG5cbiAgICBjb25zdCByZXN1bHQgPSB7IC4uLmNvbmZpZyB9O1xuXG4gICAgaWYgKHRoaXMuX2V2ZW50c1NldCkge1xuICAgICAgZGVsZXRlIHJlc3VsdC5ldmVudHM7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX3Jlc291cmNlc1NldCkge1xuICAgICAgZGVsZXRlIHJlc3VsdC5yZXNvdXJjZXM7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlT3B0aW9ucygpOiB2b2lkIHtcbiAgICBjb25zdCBjb25maWcgPSB0aGlzLmNvbmZpZ1Jlc29sdmVkRm9yVXBkYXRlKCk7XG4gICAgY29uc3QgaGFzaCA9IG9wdEhhc2goY29uZmlnKTtcblxuICAgIGlmIChoYXNoICE9PSB0aGlzLl9oYXNoT3B0aW9ucykge1xuICAgICAgY29uc3QgY29udHJvbDogYW55ID0gdGhpcy5jb250cm9sO1xuXG4gICAgICBpZiAoY29uZmlnICYmIGNvbmZpZy5yZXNvdXJjZXMgJiYgIXRoaXMuX3Jlc291cmNlc1NldCkge1xuICAgICAgICBjb250cm9sLmludGVybmFsLnJlc291cmNlc0Zyb21BdHRyKCk7XG4gICAgICB9XG5cbiAgICAgIGlmIChjb250cm9sLmludGVybmFsLnNraXBVcGRhdGUoKSkge1xuICAgICAgICBjb250cm9sLmludGVybmFsLnNraXBwZWQoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnRyb2wuaW50ZXJuYWwubG9hZE9wdGlvbnMoY29uZmlnKTtcbiAgICAgICAgdGhpcy5fcmVxdWVzdFVwZGF0ZUZ1bGwgPSB0cnVlO1xuICAgICAgICB0aGlzLl9yZXF1ZXN0Vmlld0NoYW5nZSA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5faGFzaE9wdGlvbnMgPSBoYXNoO1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVSZXNvdXJjZXMoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLl9yZXNvdXJjZXNTZXQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCByZXNvdXJjZXMgPSB0aGlzLnJlc291cmNlc1Jlc29sdmVkO1xuICAgIGNvbnN0IGhhc2ggPSBvcHRIYXNoKHJlc291cmNlcyk7XG5cbiAgICBpZiAoaGFzaCA9PT0gdGhpcy5faGFzaFJlc291cmNlcykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGNvbnRyb2w6IGFueSA9IHRoaXMuY29udHJvbDtcblxuICAgIGNvbnRyb2wucmVzb3VyY2VzID0gcmVzb3VyY2VzO1xuICAgIGNvbnRyb2wuaW50ZXJuYWwucmVzb3VyY2VzRnJvbUF0dHIoKTtcblxuICAgIGlmIChjb250cm9sLmludGVybmFsLnNraXBVcGRhdGUoKSkge1xuICAgICAgY29udHJvbC5pbnRlcm5hbC5za2lwcGVkKCk7XG4gICAgICB0aGlzLl9oYXNoUmVzb3VyY2VzID0gaGFzaDtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLl9yZXF1ZXN0VXBkYXRlUmVzb3VyY2VzID0gdHJ1ZTtcbiAgICB0aGlzLl9yZXF1ZXN0Vmlld0NoYW5nZSA9IHRydWU7XG4gICAgdGhpcy5faGFzaFJlc291cmNlcyA9IGhhc2g7XG4gIH1cblxuICAvKipcbiAgICogUmVwbGFjZXMgdGhlIGNvbXBsZXRlIGV2ZW50IGxpc3QuXG4gICAqXG4gICAqIE5vIGluZGl2aWR1YWwgZXZlbnQgZGlmZmluZyBpcyBwZXJmb3JtZWQuIFNpZ25hbCBpbnB1dHMgYXJlIGRldGVjdGVkXG4gICAqIGJ5IHJlZmVyZW5jZSBpbiBzaWduYWxVcGRhdGVSZXNvbHZlZCgpOyBvcmRpbmFyeSBhcnJheSBpbnB1dHMgYXJlXG4gICAqIGNoZWNrZWQgdXNpbmcgb3B0SGFzaCgpIGZyb20gbmdEb0NoZWNrKCkuXG4gICAqL1xuICBwcml2YXRlIHVwZGF0ZUV2ZW50cygpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuX2V2ZW50c1NldCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGV2ZW50cyA9IHRoaXMuZXZlbnRzUmVzb2x2ZWQ7XG4gICAgY29uc3QgaGFzaCA9IG9wdEhhc2goZXZlbnRzKTtcblxuICAgIGlmIChoYXNoID09PSB0aGlzLl9oYXNoRXZlbnRzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgY29udHJvbDogYW55ID0gdGhpcy5jb250cm9sO1xuXG4gICAgY29udHJvbC5ldmVudHMubGlzdCA9IGV2ZW50cztcblxuICAgIGlmIChjb250cm9sLmludGVybmFsLnNraXBVcGRhdGUoKSkge1xuICAgICAgY29udHJvbC5pbnRlcm5hbC5za2lwcGVkKCk7XG4gICAgICB0aGlzLl9oYXNoRXZlbnRzID0gaGFzaDtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLl9yZXF1ZXN0VXBkYXRlRXZlbnRzID0gdHJ1ZTtcbiAgICB0aGlzLl9oYXNoRXZlbnRzID0gaGFzaDtcbiAgfVxufVxuIl19