@sumit_yewale/angular 1.1.18 → 1.1.20

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.
@@ -3,15 +3,133 @@
3
3
  * Generated from: lib/csvbox-button.component.ts
4
4
  * @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
5
5
  */
6
- import { Component, ViewChild, Input, SecurityContext } from '@angular/core';
6
+ import { Component, Input, SecurityContext, ChangeDetectorRef, NgZone } from '@angular/core';
7
7
  import { DomSanitizer } from '@angular/platform-browser';
8
8
  import { insertCSS } from '../utlis/insertCSS';
9
- import { buildImportUrl, generateUuid, buildInitPayload, classifyStructuredMessage } from '@sumit_yewale/adapter-core';
9
+ import { buildImportUrl, generateUuid, buildInitPayload, createFileSender, classifyStructuredMessage, classifyLegacyMessage } from '@sumit_yewale/adapter-core';
10
+ // How long we wait for the importer to confirm a file it was sent before giving up on it.
10
11
  /** @type {?} */
11
- var appVersion = '1.1.16';
12
+ var FILE_ACK_TIMEOUT_MS = 8000;
13
+ /**
14
+ * @record
15
+ */
16
+ function OpenImporterEntry() { }
17
+ if (false) {
18
+ /** @type {?} */
19
+ OpenImporterEntry.prototype.getHolder;
20
+ }
21
+ /**
22
+ * @record
23
+ */
24
+ function OpenImporters() { }
25
+ if (false) {
26
+ /** @type {?} */
27
+ OpenImporters.prototype.open;
28
+ /** @type {?} */
29
+ OpenImporters.prototype.listeners;
30
+ }
31
+ /** @type {?} */
32
+ var OPEN_IMPORTERS_KEY = '__csvboxOpenImporters';
33
+ /** @type {?} */
34
+ var TOP_Z_INDEX = 2147483647;
35
+ /**
36
+ * @return {?}
37
+ */
38
+ function openImporters() {
39
+ /** @type {?} */
40
+ var w = (/** @type {?} */ (window));
41
+ if (!w[OPEN_IMPORTERS_KEY])
42
+ w[OPEN_IMPORTERS_KEY] = { open: [], listeners: [] };
43
+ return w[OPEN_IMPORTERS_KEY];
44
+ }
45
+ /**
46
+ * @param {?} reg
47
+ * @return {?}
48
+ */
49
+ function restackOpenImporters(reg) {
50
+ reg.open.forEach((/**
51
+ * @param {?} entry
52
+ * @param {?} i
53
+ * @return {?}
54
+ */
55
+ function (entry, i) {
56
+ /** @type {?} */
57
+ var holder = entry.getHolder();
58
+ if (holder)
59
+ holder.style.zIndex = String(TOP_Z_INDEX - (reg.open.length - 1 - i));
60
+ }));
61
+ }
62
+ /**
63
+ * @param {?} entry
64
+ * @return {?}
65
+ */
66
+ function registerOpenImporter(entry) {
67
+ /** @type {?} */
68
+ var reg = openImporters();
69
+ if (reg.open.indexOf(entry) >= 0)
70
+ return;
71
+ reg.open.push(entry);
72
+ restackOpenImporters(reg);
73
+ reg.listeners.slice().forEach((/**
74
+ * @param {?} fn
75
+ * @return {?}
76
+ */
77
+ function (fn) { return fn(); }));
78
+ }
79
+ /**
80
+ * @param {?} entry
81
+ * @return {?}
82
+ */
83
+ function unregisterOpenImporter(entry) {
84
+ /** @type {?} */
85
+ var reg = openImporters();
86
+ /** @type {?} */
87
+ var i = reg.open.indexOf(entry);
88
+ if (i < 0)
89
+ return;
90
+ reg.open.splice(i, 1);
91
+ restackOpenImporters(reg);
92
+ reg.listeners.slice().forEach((/**
93
+ * @param {?} fn
94
+ * @return {?}
95
+ */
96
+ function (fn) { return fn(); }));
97
+ }
98
+ /**
99
+ * @param {?} entry
100
+ * @return {?}
101
+ */
102
+ function isBlockedByOpenImporter(entry) {
103
+ /** @type {?} */
104
+ var reg = openImporters();
105
+ return reg.open.length > 0 && reg.open.indexOf(entry) < 0;
106
+ }
107
+ /**
108
+ * @param {?} fn
109
+ * @return {?}
110
+ */
111
+ function subscribeOpenImporters(fn) {
112
+ /** @type {?} */
113
+ var reg = openImporters();
114
+ reg.listeners.push(fn);
115
+ return (/**
116
+ * @return {?}
117
+ */
118
+ function () {
119
+ /** @type {?} */
120
+ var i = reg.listeners.indexOf(fn);
121
+ if (i >= 0)
122
+ reg.listeners.splice(i, 1);
123
+ });
124
+ }
125
+ /** @type {?} */
126
+ var appVersion = '1.1.20';
12
127
  var CSVBoxButtonComponent = /** @class */ (function () {
13
- function CSVBoxButtonComponent(sanitizer) {
128
+ function CSVBoxButtonComponent(sanitizer, cdr, zone) {
129
+ var _this = this;
14
130
  this.sanitizer = sanitizer;
131
+ this.cdr = cdr;
132
+ this.zone = zone;
15
133
  this.isModalShown = false;
16
134
  this.licenseKey = null;
17
135
  this.uuid = null;
@@ -24,6 +142,165 @@ var CSVBoxButtonComponent = /** @class */ (function () {
24
142
  this.lazy = false;
25
143
  this.iframe = null;
26
144
  this.disabled = true;
145
+ // True while a different importer on the page is open: the button stays disabled.
146
+ this.blockedByOther = false;
147
+ this.registryEntry = { getHolder: (/**
148
+ * @return {?}
149
+ */
150
+ function () { return _this.holder; }) };
151
+ this.fileSender = createFileSender({
152
+ getIframe: (/**
153
+ * @return {?}
154
+ */
155
+ function () { return _this.iframe; }),
156
+ getToken: (/**
157
+ * @return {?}
158
+ */
159
+ function () { return (/** @type {?} */ (_this.uuid)); }),
160
+ getTargetOrigin: (/**
161
+ * @return {?}
162
+ */
163
+ function () { return (/** @type {?} */ (_this.targetOrigin)); }),
164
+ getBaseDomain: (/**
165
+ * @return {?}
166
+ */
167
+ function () { return _this.baseDomain; }),
168
+ takeFile: (/**
169
+ * @return {?}
170
+ */
171
+ function () {
172
+ /** @type {?} */
173
+ var file = _this.pendingFile;
174
+ _this.pendingFile = null;
175
+ return file;
176
+ }),
177
+ onSent: (/**
178
+ * @return {?}
179
+ */
180
+ function () { return _this.startFileAckTimer(); })
181
+ });
182
+ this.unsubscribeOpenImporters = null;
183
+ this.pendingFile = null;
184
+ // Data-location sheets redirect to another host, so the iframe origin can differ from
185
+ // targetOrigin. baseDomain is used to check the real origin before trusting it.
186
+ this.baseDomain = "app.csvbox.io";
187
+ this.fileAckTimer = null;
188
+ this.messageListener = (/**
189
+ * @param {?} event
190
+ * @return {?}
191
+ */
192
+ function (event) {
193
+ // Older importers send these as bare strings, without a token.
194
+ /** @type {?} */
195
+ var legacy = classifyLegacyMessage(event.data);
196
+ if (legacy) {
197
+ // Legacy messages carry no token, so the only way to tell which importer sent one is its
198
+ // window. Ignore those that came from another instance's iframe (or anywhere else).
199
+ if (!_this.iframe || event.source !== _this.iframe.contentWindow) {
200
+ return;
201
+ }
202
+ if (legacy.type === "mainModalHidden") {
203
+ _this.handleModalClosed();
204
+ }
205
+ else if (legacy.type === "uploadSuccessful") {
206
+ if (_this.onImport)
207
+ _this.onImport(true);
208
+ if (_this.isImported)
209
+ _this.isImported(true);
210
+ if (_this.imported)
211
+ _this.imported(true);
212
+ }
213
+ else if (legacy.type === "uploadFailed") {
214
+ if (_this.onImport)
215
+ _this.onImport(false);
216
+ if (_this.isImported)
217
+ _this.isImported(false);
218
+ if (_this.imported)
219
+ _this.imported(false);
220
+ }
221
+ return;
222
+ }
223
+ // Set-file handshake messages. The shared core does not classify these, so they are
224
+ // read here, behind the same unique_token check the core applies.
225
+ /** @type {?} */
226
+ var raw = event.data;
227
+ if (raw && typeof raw === "object" && raw.data && raw.data.unique_token == _this.uuid) {
228
+ _this.fileSender.learnOrigin(event);
229
+ if (raw.type === "csvbox-set-file-rejected" && raw.data.reason === "not-a-file") {
230
+ // Reply to our probe (it has no file). It only tells us the origin, so do nothing.
231
+ return;
232
+ }
233
+ if (raw.type === "csvbox-modal-shown") {
234
+ _this.clearFileAckTimer();
235
+ registerOpenImporter(_this.registryEntry);
236
+ // What the file path in openModal() is waiting for. display as well as
237
+ // pointer-events: a second file declined while the first was still opening the
238
+ // modal has put the holder away in the meantime.
239
+ _this.isModalShown = true;
240
+ if (_this.holder) {
241
+ _this.holder.style.display = 'block';
242
+ _this.holder.style.pointerEvents = 'auto';
243
+ }
244
+ return;
245
+ }
246
+ if (raw.type === "csvbox-set-file-rejected") {
247
+ _this.clearFileAckTimer();
248
+ // The importer has the file and will not take it. Put the holder away only if the
249
+ // modal was never confirmed up: a file declined while it is open leaves that modal
250
+ // where it is, and its own 'csvbox-modal-hidden' will put the holder away.
251
+ if (!_this.isModalShown && _this.holder) {
252
+ _this.holder.style.display = 'none';
253
+ _this.holder.style.pointerEvents = 'auto';
254
+ unregisterOpenImporter(_this.registryEntry);
255
+ }
256
+ console.warn("[csvbox] importer declined the supplied file: " + raw.data.reason);
257
+ return;
258
+ }
259
+ }
260
+ /** @type {?} */
261
+ var message = classifyStructuredMessage(event.data, (/** @type {?} */ (_this.uuid)));
262
+ if (!message) {
263
+ return;
264
+ }
265
+ if (message.type === "data-on-submit") {
266
+ if (_this.onSubmit)
267
+ _this.onSubmit(message.metadata);
268
+ if (_this.isSubmitted)
269
+ _this.isSubmitted(message.metadata);
270
+ if (_this.submitted)
271
+ _this.submitted(message.metadata);
272
+ }
273
+ else if (message.type === "data-push-status") {
274
+ if (!message.success) {
275
+ delete message.metadata["unique_token"];
276
+ }
277
+ if (_this.onImport)
278
+ _this.onImport(message.success, message.metadata);
279
+ if (_this.isImported)
280
+ _this.isImported(message.success, message.metadata);
281
+ if (_this.imported)
282
+ _this.imported(message.success, message.metadata);
283
+ }
284
+ else if (message.type === "csvbox-modal-hidden") {
285
+ _this.handleModalClosed();
286
+ }
287
+ else if (message.type === "csvbox-upload-successful") {
288
+ if (_this.onImport)
289
+ _this.onImport(true);
290
+ if (_this.isImported)
291
+ _this.isImported(true);
292
+ if (_this.imported)
293
+ _this.imported(true);
294
+ }
295
+ else if (message.type === "csvbox-upload-failed") {
296
+ if (_this.onImport)
297
+ _this.onImport(false);
298
+ if (_this.isImported)
299
+ _this.isImported(false);
300
+ if (_this.imported)
301
+ _this.imported(false);
302
+ }
303
+ });
27
304
  }
28
305
  /**
29
306
  * @return {?}
@@ -42,6 +319,9 @@ var CSVBoxButtonComponent = /** @class */ (function () {
42
319
  theme: this.theme,
43
320
  environment: this.environment
44
321
  }, "angular", appVersion);
322
+ // Default place to send the file. A file is only ever sent to a named origin, never "*".
323
+ this.targetOrigin = new URL(iframeUrl).origin;
324
+ this.baseDomain = this.customDomain || "app.csvbox.io";
45
325
  this.safeUrl = this.sanitizer.sanitize(SecurityContext.RESOURCE_URL, this.sanitizer.bypassSecurityTrustResourceUrl(iframeUrl));
46
326
  };
47
327
  /**
@@ -81,55 +361,12 @@ var CSVBoxButtonComponent = /** @class */ (function () {
81
361
  */
82
362
  function () {
83
363
  var _this = this;
84
- window.addEventListener("message", (/**
85
- * @param {?} event
364
+ window.addEventListener("message", this.messageListener, false);
365
+ this.syncBlocked();
366
+ this.unsubscribeOpenImporters = subscribeOpenImporters((/**
86
367
  * @return {?}
87
368
  */
88
- function (event) {
89
- /** @type {?} */
90
- var message = classifyStructuredMessage(event.data, (/** @type {?} */ (_this.uuid)));
91
- if (!message) {
92
- return;
93
- }
94
- if (message.type === "data-on-submit") {
95
- if (_this.onSubmit)
96
- _this.onSubmit(message.metadata);
97
- if (_this.isSubmitted)
98
- _this.isSubmitted(message.metadata);
99
- if (_this.submitted)
100
- _this.submitted(message.metadata);
101
- }
102
- else if (message.type === "data-push-status") {
103
- if (!message.success) {
104
- delete message.metadata["unique_token"];
105
- }
106
- if (_this.onImport)
107
- _this.onImport(message.success, message.metadata);
108
- if (_this.isImported)
109
- _this.isImported(message.success, message.metadata);
110
- if (_this.imported)
111
- _this.imported(message.success, message.metadata);
112
- }
113
- else if (message.type === "csvbox-modal-hidden") {
114
- _this.handleModalClosed();
115
- }
116
- else if (message.type === "csvbox-upload-successful") {
117
- if (_this.onImport)
118
- _this.onImport(true);
119
- if (_this.isImported)
120
- _this.isImported(true);
121
- if (_this.imported)
122
- _this.imported(true);
123
- }
124
- else if (message.type === "csvbox-upload-failed") {
125
- if (_this.onImport)
126
- _this.onImport(false);
127
- if (_this.isImported)
128
- _this.isImported(false);
129
- if (_this.imported)
130
- _this.imported(false);
131
- }
132
- }), false);
369
+ function () { return _this.syncBlocked(); }));
133
370
  if (this.lazy) {
134
371
  this.disabled = false;
135
372
  }
@@ -145,8 +382,10 @@ var CSVBoxButtonComponent = /** @class */ (function () {
145
382
  * @return {?}
146
383
  */
147
384
  function () {
148
- if (this.holder)
385
+ if (this.holder) {
149
386
  this.holder.style.display = 'none';
387
+ this.holder.style.pointerEvents = 'auto';
388
+ }
150
389
  this.isModalShown = false;
151
390
  this.isIframeLoaded = false;
152
391
  this.openModalOnIframeLoad = false;
@@ -154,6 +393,9 @@ var CSVBoxButtonComponent = /** @class */ (function () {
154
393
  this.holder.remove();
155
394
  this.holder = null;
156
395
  this.iframe = null;
396
+ // A new iframe is built on the next open, so the origin is learned again.
397
+ this.clearProbeTimer();
398
+ unregisterOpenImporter(this.registryEntry);
157
399
  if (this.onClose)
158
400
  this.onClose();
159
401
  if (this.isClosed)
@@ -176,6 +418,7 @@ var CSVBoxButtonComponent = /** @class */ (function () {
176
418
  var iframe = document.createElement("iframe");
177
419
  this.iframe = iframe;
178
420
  iframe.setAttribute("src", this.safeUrl);
421
+ iframe.setAttribute("allow", "clipboard-read; clipboard-write *");
179
422
  iframe.frameBorder = "0";
180
423
  /** @type {?} */
181
424
  var self = this;
@@ -203,6 +446,8 @@ var CSVBoxButtonComponent = /** @class */ (function () {
203
446
  this.holder.setAttribute('id', "csvbox-embed-" + this.uuid);
204
447
  this.holder.appendChild(iframe);
205
448
  document.body.insertAdjacentElement('beforeend', this.holder);
449
+ // The holder did not exist yet if openModal() asked for the importer before it was built.
450
+ restackOpenImporters(openImporters());
206
451
  };
207
452
  /**
208
453
  * @return {?}
@@ -211,6 +456,9 @@ var CSVBoxButtonComponent = /** @class */ (function () {
211
456
  * @return {?}
212
457
  */
213
458
  function () {
459
+ // Counts as open from the moment it is requested, so the other buttons are disabled while
460
+ // this importer is still loading, and so it is stacked above any importer opened earlier.
461
+ registerOpenImporter(this.registryEntry);
214
462
  if (!this.iframe) {
215
463
  this.openModalOnIframeLoad = true;
216
464
  this.initImporter();
@@ -218,11 +466,36 @@ var CSVBoxButtonComponent = /** @class */ (function () {
218
466
  }
219
467
  if (!this.isModalShown) {
220
468
  if (this.isIframeLoaded) {
221
- this.isModalShown = true;
222
- if (this.holder)
223
- this.holder.style.display = 'block';
224
- if (this.iframe && this.iframe.contentWindow) {
225
- this.iframe.contentWindow.postMessage('openModal', '*');
469
+ if (this.pendingFile) {
470
+ // The importer opens its own modal once it has the file, so that it can inject on
471
+ // 'shown.bs.modal'. Sending 'openModal' as well would race that.
472
+ //
473
+ // It can also decline: wrong step, an import file URL configured on the sheet, or
474
+ // an importer too old to know the message at all. So the holder goes up
475
+ // click-through and stays that way until 'csvbox-modal-shown' confirms the modal
476
+ // is really up. It covers the viewport at z-index 2147483647 and the importer
477
+ // renders transparent with its modal closed, so arming it on an unanswered message
478
+ // leaves an invisible sheet over the host page eating every click.
479
+ //
480
+ // display:block regardless, so the iframe lays out and animates normally; only
481
+ // pointer-events is held back. isModalShown likewise waits for the confirmation,
482
+ // or a declined file would latch the importer shut for good.
483
+ if (this.holder) {
484
+ this.holder.style.pointerEvents = 'none';
485
+ this.holder.style.display = 'block';
486
+ }
487
+ this.fileSender.send();
488
+ }
489
+ else {
490
+ this.isModalShown = true;
491
+ if (this.holder) {
492
+ // Explicit: a previously declined file leaves the holder click-through.
493
+ this.holder.style.pointerEvents = 'auto';
494
+ this.holder.style.display = 'block';
495
+ }
496
+ if (this.iframe && this.iframe.contentWindow) {
497
+ this.iframe.contentWindow.postMessage('openModal', '*');
498
+ }
226
499
  }
227
500
  }
228
501
  else {
@@ -230,18 +503,176 @@ var CSVBoxButtonComponent = /** @class */ (function () {
230
503
  }
231
504
  }
232
505
  };
506
+ /**
507
+ * Open the importer on a File the host page already has, instead of the file picker.
508
+ *
509
+ * Reachable through a template reference (`#importer` then `importer.openModalWithFile(file)`)
510
+ * or `@ViewChild(CSVBoxButtonComponent)`.
511
+ *
512
+ * The File crosses to the iframe by structured clone, so the importer receives the real
513
+ * object and applies its own extension, worksheet and size rules to it -- this does not
514
+ * bypass any of them. Pass a File; a Blob has no name for the importer to read an
515
+ * extension from.
516
+ */
517
+ /**
518
+ * Open the importer on a File the host page already has, instead of the file picker.
519
+ *
520
+ * Reachable through a template reference (`#importer` then `importer.openModalWithFile(file)`)
521
+ * or `\@ViewChild(CSVBoxButtonComponent)`.
522
+ *
523
+ * The File crosses to the iframe by structured clone, so the importer receives the real
524
+ * object and applies its own extension, worksheet and size rules to it -- this does not
525
+ * bypass any of them. Pass a File; a Blob has no name for the importer to read an
526
+ * extension from.
527
+ * @param {?} file
528
+ * @return {?}
529
+ */
530
+ CSVBoxButtonComponent.prototype.openModalWithFile = /**
531
+ * Open the importer on a File the host page already has, instead of the file picker.
532
+ *
533
+ * Reachable through a template reference (`#importer` then `importer.openModalWithFile(file)`)
534
+ * or `\@ViewChild(CSVBoxButtonComponent)`.
535
+ *
536
+ * The File crosses to the iframe by structured clone, so the importer receives the real
537
+ * object and applies its own extension, worksheet and size rules to it -- this does not
538
+ * bypass any of them. Pass a File; a Blob has no name for the importer to read an
539
+ * extension from.
540
+ * @param {?} file
541
+ * @return {?}
542
+ */
543
+ function (file) {
544
+ if (typeof File === 'undefined' || !(file instanceof File)) {
545
+ return;
546
+ }
547
+ this.pendingFile = file;
548
+ // Already open: hand it over now rather than holding it for the next open. The importer
549
+ // takes it only while it is still on the upload step, and ignores it once the user has a
550
+ // dataset and a mapping in progress.
551
+ if (this.isModalShown && this.iframe && this.isIframeLoaded) {
552
+ this.fileSender.send();
553
+ return;
554
+ }
555
+ this.openModal();
556
+ };
557
+ /**
558
+ * @return {?}
559
+ */
560
+ CSVBoxButtonComponent.prototype.clearProbeTimer = /**
561
+ * @return {?}
562
+ */
563
+ function () {
564
+ this.clearFileAckTimer();
565
+ this.fileSender.reset();
566
+ };
567
+ /**
568
+ * @return {?}
569
+ */
570
+ CSVBoxButtonComponent.prototype.startFileAckTimer = /**
571
+ * @return {?}
572
+ */
573
+ function () {
574
+ var _this = this;
575
+ this.clearFileAckTimer();
576
+ this.fileAckTimer = setTimeout((/**
577
+ * @return {?}
578
+ */
579
+ function () {
580
+ _this.fileAckTimer = null;
581
+ _this.giveUpOnFile();
582
+ }), FILE_ACK_TIMEOUT_MS);
583
+ };
584
+ /**
585
+ * @return {?}
586
+ */
587
+ CSVBoxButtonComponent.prototype.clearFileAckTimer = /**
588
+ * @return {?}
589
+ */
590
+ function () {
591
+ if (this.fileAckTimer) {
592
+ clearTimeout(this.fileAckTimer);
593
+ this.fileAckTimer = null;
594
+ }
595
+ };
596
+ // The importer never confirmed the file it was sent (an origin we do not trust, or an importer too
597
+ // old to know the message). Without this the holder would stay up, invisible and click-through,
598
+ // and the other instances' buttons would stay disabled for good.
599
+ // The importer never confirmed the file it was sent (an origin we do not trust, or an importer too
600
+ // old to know the message). Without this the holder would stay up, invisible and click-through,
601
+ // and the other instances' buttons would stay disabled for good.
602
+ /**
603
+ * @return {?}
604
+ */
605
+ CSVBoxButtonComponent.prototype.giveUpOnFile =
606
+ // The importer never confirmed the file it was sent (an origin we do not trust, or an importer too
607
+ // old to know the message). Without this the holder would stay up, invisible and click-through,
608
+ // and the other instances' buttons would stay disabled for good.
609
+ /**
610
+ * @return {?}
611
+ */
612
+ function () {
613
+ if (this.isModalShown) {
614
+ return;
615
+ }
616
+ /** @type {?} */
617
+ var holder = this.holder;
618
+ if (holder) {
619
+ holder.style.display = 'none';
620
+ holder.style.pointerEvents = 'auto';
621
+ }
622
+ unregisterOpenImporter(this.registryEntry);
623
+ console.warn("[csvbox] the importer did not respond to the supplied file");
624
+ };
625
+ /**
626
+ * @private
627
+ * @return {?}
628
+ */
629
+ CSVBoxButtonComponent.prototype.syncBlocked = /**
630
+ * @private
631
+ * @return {?}
632
+ */
633
+ function () {
634
+ var _this = this;
635
+ /** @type {?} */
636
+ var blocked = isBlockedByOpenImporter(this.registryEntry);
637
+ if (blocked !== this.blockedByOther) {
638
+ // The registry can call back from outside Angular's zone (another instance, another app).
639
+ this.zone.run((/**
640
+ * @return {?}
641
+ */
642
+ function () {
643
+ _this.blockedByOther = blocked;
644
+ _this.cdr.markForCheck();
645
+ }));
646
+ }
647
+ };
648
+ /**
649
+ * @return {?}
650
+ */
651
+ CSVBoxButtonComponent.prototype.ngOnDestroy = /**
652
+ * @return {?}
653
+ */
654
+ function () {
655
+ this.clearProbeTimer();
656
+ window.removeEventListener("message", this.messageListener);
657
+ unregisterOpenImporter(this.registryEntry);
658
+ if (this.unsubscribeOpenImporters) {
659
+ this.unsubscribeOpenImporters();
660
+ this.unsubscribeOpenImporters = null;
661
+ }
662
+ };
233
663
  CSVBoxButtonComponent.decorators = [
234
664
  { type: Component, args: [{
235
665
  selector: 'csvbox-button',
236
- template: "\n <div>\n <button [disabled]=\"disabled\" #initiator (click)=\"openModal()\" [attr.data-csvbox-token]=\"uuid\">\n <ng-content></ng-content>\n </button>\n </div>\n "
666
+ template: "\n <div>\n <button [disabled]=\"disabled || blockedByOther\" (click)=\"openModal()\" [attr.data-csvbox-token]=\"uuid\">\n <ng-content></ng-content>\n </button>\n </div>\n "
237
667
  }] }
238
668
  ];
239
669
  /** @nocollapse */
240
670
  CSVBoxButtonComponent.ctorParameters = function () { return [
241
- { type: DomSanitizer }
671
+ { type: DomSanitizer },
672
+ { type: ChangeDetectorRef },
673
+ { type: NgZone }
242
674
  ]; };
243
675
  CSVBoxButtonComponent.propDecorators = {
244
- initiator: [{ type: ViewChild, args: ['initiator', { static: false },] }],
245
676
  onImport: [{ type: Input }],
246
677
  onReady: [{ type: Input }],
247
678
  onClose: [{ type: Input }],
@@ -277,8 +708,6 @@ if (false) {
277
708
  /** @type {?} */
278
709
  CSVBoxButtonComponent.prototype.isModalShown;
279
710
  /** @type {?} */
280
- CSVBoxButtonComponent.prototype.initiator;
281
- /** @type {?} */
282
711
  CSVBoxButtonComponent.prototype.onImport;
283
712
  /** @type {?} */
284
713
  CSVBoxButtonComponent.prototype.onReady;
@@ -337,8 +766,51 @@ if (false) {
337
766
  /** @type {?} */
338
767
  CSVBoxButtonComponent.prototype.disabled;
339
768
  /** @type {?} */
769
+ CSVBoxButtonComponent.prototype.blockedByOther;
770
+ /**
771
+ * @type {?}
772
+ * @private
773
+ */
774
+ CSVBoxButtonComponent.prototype.registryEntry;
775
+ /**
776
+ * @type {?}
777
+ * @private
778
+ */
779
+ CSVBoxButtonComponent.prototype.fileSender;
780
+ /**
781
+ * @type {?}
782
+ * @private
783
+ */
784
+ CSVBoxButtonComponent.prototype.unsubscribeOpenImporters;
785
+ /** @type {?} */
340
786
  CSVBoxButtonComponent.prototype.holder;
341
787
  /** @type {?} */
788
+ CSVBoxButtonComponent.prototype.pendingFile;
789
+ /** @type {?} */
790
+ CSVBoxButtonComponent.prototype.targetOrigin;
791
+ /** @type {?} */
792
+ CSVBoxButtonComponent.prototype.baseDomain;
793
+ /**
794
+ * @type {?}
795
+ * @private
796
+ */
797
+ CSVBoxButtonComponent.prototype.fileAckTimer;
798
+ /**
799
+ * @type {?}
800
+ * @private
801
+ */
802
+ CSVBoxButtonComponent.prototype.messageListener;
803
+ /** @type {?} */
342
804
  CSVBoxButtonComponent.prototype.sanitizer;
805
+ /**
806
+ * @type {?}
807
+ * @private
808
+ */
809
+ CSVBoxButtonComponent.prototype.cdr;
810
+ /**
811
+ * @type {?}
812
+ * @private
813
+ */
814
+ CSVBoxButtonComponent.prototype.zone;
343
815
  }
344
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3N2Ym94LWJ1dHRvbi5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9Ac3VtaXRfeWV3YWxlL2FuZ3VsYXIvIiwic291cmNlcyI6WyJsaWIvY3N2Ym94LWJ1dHRvbi5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUVULFNBQVMsRUFDVCxLQUFLLEVBR0wsZUFBZSxFQUVoQixNQUFNLGVBQWUsQ0FBQztBQUV2QixPQUFPLEVBQUUsWUFBWSxFQUFXLE1BQU0sMkJBQTJCLENBQUM7QUFDbEUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxjQUFjLEVBQUUsWUFBWSxFQUFFLGdCQUFnQixFQUFFLHlCQUF5QixFQUFFLE1BQU0sNEJBQTRCLENBQUM7O0lBRWpILFVBQVUsR0FBRyxRQUFRO0FBRTNCO0lBdURFLCtCQUFtQixTQUFzQjtRQUF0QixjQUFTLEdBQVQsU0FBUyxDQUFhO1FBMUN6QyxpQkFBWSxHQUFHLEtBQUssQ0FBQztRQXFCWixlQUFVLEdBQWtCLElBQUksQ0FBQztRQUVqQyxTQUFJLEdBQWtCLElBQUksQ0FBQztRQUMzQixpQkFBWSxHQUFrQixJQUFJLENBQUM7UUFDbkMsaUJBQVksR0FBa0IsSUFBSSxDQUFDO1FBQ25DLGFBQVEsR0FBa0IsSUFBSSxDQUFDO1FBRy9CLFVBQUssR0FBa0IsSUFBSSxDQUFDO1FBRTVCLG1CQUFjLEdBQVksS0FBSyxDQUFDO1FBQ2hDLDBCQUFxQixHQUFZLEtBQUssQ0FBQztRQUV2QyxTQUFJLEdBQVksS0FBSyxDQUFDO1FBSS9CLFdBQU0sR0FBNkIsSUFBSSxDQUFDO1FBRS9CLGFBQVEsR0FBWSxJQUFJLENBQUM7SUFFVSxDQUFDOzs7O0lBSTdDLHdDQUFROzs7SUFBUjtRQUNFLElBQUksQ0FBQyxJQUFJLEdBQUcsWUFBWSxFQUFFLENBQUM7O1lBQ3ZCLFNBQVMsR0FBRyxjQUFjLENBQzVCO1lB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QUE0Qjs7SUFDNUIseUNBQTZCOztJQUU3QiwyQ0FBK0I7O0lBQy9CLHdDQUE0Qjs7SUFDNUIseUNBQTZCOztJQUM3Qiw0Q0FBZ0M7O0lBRWhDLDhDQUFrQzs7SUFDbEMsdUNBQTJCOztJQUMzQiwwQ0FBOEI7O0lBQzlCLHlDQUE2Qjs7SUFDN0IsNENBQWdDOztJQUVoQyxxQ0FBdUI7O0lBQ3ZCLCtDQUFpQzs7SUFDakMsMkNBQTBDOztJQUMxQyx3Q0FBMEI7O0lBQzFCLHFDQUFvQzs7SUFDcEMsNkNBQTRDOztJQUM1Qyw2Q0FBNEM7O0lBQzVDLHlDQUF3Qzs7SUFDeEMsNENBQThCOztJQUU5QixzQ0FBcUM7O0lBRXJDLCtDQUF5Qzs7SUFDekMsc0RBQWdEOztJQUVoRCxxQ0FBK0I7O0lBRS9CLHdDQUFhOztJQUViLHVDQUF3Qzs7SUFFeEMseUNBQWtDOztJQUlsQyx1Q0FBWTs7SUFGQSwwQ0FBNkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDb21wb25lbnQsXG4gIE9uSW5pdCxcbiAgVmlld0NoaWxkLFxuICBJbnB1dCxcbiAgT25DaGFuZ2VzLFxuICBTaW1wbGVDaGFuZ2VzLFxuICBTZWN1cml0eUNvbnRleHQsXG4gIEFmdGVyQ29udGVudEluaXRcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7IERvbVNhbml0aXplciwgU2FmZVVybCB9IGZyb20gJ0Bhbmd1bGFyL3BsYXRmb3JtLWJyb3dzZXInO1xuaW1wb3J0IHsgaW5zZXJ0Q1NTIH0gZnJvbSAnLi4vdXRsaXMvaW5zZXJ0Q1NTJztcbmltcG9ydCB7IGJ1aWxkSW1wb3J0VXJsLCBnZW5lcmF0ZVV1aWQsIGJ1aWxkSW5pdFBheWxvYWQsIGNsYXNzaWZ5U3RydWN0dXJlZE1lc3NhZ2UgfSBmcm9tICdAc3VtaXRfeWV3YWxlL2FkYXB0ZXItY29yZSc7XG5cbmNvbnN0IGFwcFZlcnNpb24gPSAnMS4xLjE2JztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnY3N2Ym94LWJ1dHRvbicsXG4gIHRlbXBsYXRlOiBgXG4gICAgPGRpdj5cbiAgICAgIDxidXR0b24gW2Rpc2FibGVkXT1cImRpc2FibGVkXCIgI2luaXRpYXRvciAoY2xpY2spPVwib3Blbk1vZGFsKClcIiBbYXR0ci5kYXRhLWNzdmJveC10b2tlbl09XCJ1dWlkXCI+XG4gICAgICAgIDxuZy1jb250ZW50PjwvbmctY29udGVudD5cbiAgICAgIDwvYnV0dG9uPlxuICAgIDwvZGl2PlxuICBgXG59KVxuXG5leHBvcnQgY2xhc3MgQ1NWQm94QnV0dG9uQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMsIEFmdGVyQ29udGVudEluaXQge1xuXG4gIGlzTW9kYWxTaG93biA9IGZhbHNlO1xuXG4gIEBWaWV3Q2hpbGQoJ2luaXRpYXRvcicsIHtzdGF0aWM6IGZhbHNlfSkgaW5pdGlhdG9yOiBhbnk7XG4gIEBJbnB1dCgpIG9uSW1wb3J0PzogRnVuY3Rpb247XG4gIEBJbnB1dCgpIG9uUmVhZHk/OiBGdW5jdGlvbjtcbiAgQElucHV0KCkgb25DbG9zZT86IEZ1bmN0aW9uO1xuICBASW5wdXQoKSBvblN1Ym1pdD86IEZ1bmN0aW9uO1xuXG4gIEBJbnB1dCgpIGlzSW1wb3J0ZWQ/OiBGdW5jdGlvbjtcbiAgQElucHV0KCkgaXNSZWFkeT86IEZ1bmN0aW9uO1xuICBASW5wdXQoKSBpc0Nsb3NlZD86IEZ1bmN0aW9uO1xuICBASW5wdXQoKSBpc1N1Ym1pdHRlZD86IEZ1bmN0aW9uO1xuXG4gIEBJbnB1dCgpIGltcG9ydGVyUmVhZHk/OiBGdW5jdGlvbjtcbiAgQElucHV0KCkgY2xvc2VkPzogRnVuY3Rpb247XG4gIEBJbnB1dCgpIHN1Ym1pdHRlZD86IEZ1bmN0aW9uO1xuICBASW5wdXQoKSBpbXBvcnRlZD86IEZ1bmN0aW9uO1xuICBASW5wdXQoKSBsb2FkU3RhcnRlZD86IEZ1bmN0aW9uO1xuXG4gIEBJbnB1dCgpIHVzZXI/OiBvYmplY3Q7XG4gIEBJbnB1dCgpIGR5bmFtaWNDb2x1bW5zPzogb2JqZWN0O1xuICBASW5wdXQoKSBsaWNlbnNlS2V5OiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgQElucHV0KCkgb3B0aW9ucz86IG9iamVjdDtcbiAgQElucHV0KCkgdXVpZDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIEBJbnB1dCgpIGN1c3RvbURvbWFpbjogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIEBJbnB1dCgpIGRhdGFMb2NhdGlvbjogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIEBJbnB1dCgpIGxhbmd1YWdlOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgQElucHV0KCkgZW52aXJvbm1lbnQ/OiBvYmplY3Q7XG5cbiAgQElucHV0KCkgdGhlbWU6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuXG4gIEBJbnB1dCgpIGlzSWZyYW1lTG9hZGVkOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIG9wZW5Nb2RhbE9uSWZyYW1lTG9hZDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIEBJbnB1dCgpIGxhenk6IGJvb2xlYW4gPSBmYWxzZTtcblxuICBzYWZlVXJsOiBhbnk7XG5cbiAgaWZyYW1lOiBIVE1MSUZyYW1lRWxlbWVudCB8IG51bGwgPSBudWxsO1xuXG4gIEBJbnB1dCgpIGRpc2FibGVkOiBib29sZWFuID0gdHJ1ZTtcblxuICBjb25zdHJ1Y3RvcihwdWJsaWMgc2FuaXRpemVyOkRvbVNhbml0aXplcikge31cblxuICBob2xkZXI6IGFueTtcblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLnV1aWQgPSBnZW5lcmF0ZVV1aWQoKTtcbiAgICBsZXQgaWZyYW1lVXJsID0gYnVpbGRJbXBvcnRVcmwoXG4gICAgICB7XG4gICAgICAgIGxpY2Vuc2VLZXk6IHRoaXMubGljZW5zZUtleSxcbiAgICAgICAgY3VzdG9tRG9tYWluOiB0aGlzLmN1c3RvbURvbWFpbixcbiAgICAgICAgZGF0YUxvY2F0aW9uOiB0aGlzLmRhdGFMb2NhdGlvbixcbiAgICAgICAgbGFuZ3VhZ2U6IHRoaXMubGFuZ3VhZ2UsXG4gICAgICAgIHRoZW1lOiB0aGlzLnRoZW1lLFxuICAgICAgICBlbnZpcm9ubWVudDogdGhpcy5lbnZpcm9ubWVudFxuICAgICAgfSxcbiAgICAgIFwiYW5ndWxhclwiLFxuICAgICAgYXBwVmVyc2lvblxuICAgICk7XG4gICAgdGhpcy5zYWZlVXJsID0gdGhpcy5zYW5pdGl6ZXIuc2FuaXRpemUoU2VjdXJpdHlDb250ZXh0LlJFU09VUkNFX1VSTCwgdGhpcy5zYW5pdGl6ZXIuYnlwYXNzU2VjdXJpdHlUcnVzdFJlc291cmNlVXJsKGlmcmFtZVVybCkpO1xuICB9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcykge1xuICAgIGlmKGNoYW5nZXNbXCJ1c2VyXCJdICYmIGNoYW5nZXNbJ3VzZXInXS5jdXJyZW50VmFsdWUgIT0gY2hhbmdlc1sndXNlciddLnByZXZpb3VzVmFsdWUpIHtcbiAgICAgIHRoaXMudXBkYXRlVXNlclZhcmlhYmUoY2hhbmdlc1sndXNlciddLmN1cnJlbnRWYWx1ZSk7XG4gICAgfVxuICB9XG5cbiAgdXBkYXRlVXNlclZhcmlhYmUoZGF0YTogYW55KTogdm9pZCB7XG4gICAgdGhpcy51c2VyID0gZGF0YTtcbiAgICBpZiAodGhpcy5pZnJhbWUgJiYgdGhpcy5pZnJhbWUuY29udGVudFdpbmRvdykge1xuICAgICAgdGhpcy5pZnJhbWUuY29udGVudFdpbmRvdy5wb3N0TWVzc2FnZSh7XG4gICAgICAgIFwiY3VzdG9tZXJcIiA6IGRhdGFcbiAgICAgIH0sIFwiKlwiKTtcbiAgICB9XG4gIH1cblxuICBuZ0FmdGVyQ29udGVudEluaXQoKTogdm9pZCB7XG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJtZXNzYWdlXCIsIChldmVudCkgPT4ge1xuICAgICAgbGV0IG1lc3NhZ2UgPSBjbGFzc2lmeVN0cnVjdHVyZWRNZXNzYWdlKGV2ZW50LmRhdGEsIHRoaXMudXVpZCEpO1xuICAgICAgaWYgKCFtZXNzYWdlKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKG1lc3NhZ2UudHlwZSA9PT0gXCJkYXRhLW9uLXN1Ym1pdFwiKSB7XG4gICAgICAgIGlmICh0aGlzLm9uU3VibWl0KSB0aGlzLm9uU3VibWl0KG1lc3NhZ2UubWV0YWRhdGEpO1xuICAgICAgICBpZiAodGhpcy5pc1N1Ym1pdHRlZCkgdGhpcy5pc1N1Ym1pdHRlZChtZXNzYWdlLm1ldGFkYXRhKTtcbiAgICAgICAgaWYgKHRoaXMuc3VibWl0dGVkKSB0aGlzLnN1Ym1pdHRlZChtZXNzYWdlLm1ldGFkYXRhKTtcbiAgICAgIH0gZWxzZSBpZiAobWVzc2FnZS50eXBlID09PSBcImRhdGEtcHVzaC1zdGF0dXNcIikge1xuICAgICAgICBpZiAoIW1lc3NhZ2Uuc3VjY2Vzcykge1xuICAgICAgICAgIGRlbGV0ZSBtZXNzYWdlLm1ldGFkYXRhW1widW5pcXVlX3Rva2VuXCJdO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLm9uSW1wb3J0KSB0aGlzLm9uSW1wb3J0KG1lc3NhZ2Uuc3VjY2VzcywgbWVzc2FnZS5tZXRhZGF0YSk7XG4gICAgICAgIGlmICh0aGlzLmlzSW1wb3J0ZWQpIHRoaXMuaXNJbXBvcnRlZChtZXNzYWdlLnN1Y2Nlc3MsIG1lc3NhZ2UubWV0YWRhdGEpO1xuICAgICAgICBpZiAodGhpcy5pbXBvcnRlZCkgdGhpcy5pbXBvcnRlZChtZXNzYWdlLnN1Y2Nlc3MsIG1lc3NhZ2UubWV0YWRhdGEpO1xuICAgICAgfSBlbHNlIGlmIChtZXNzYWdlLnR5cGUgPT09IFwiY3N2Ym94LW1vZGFsLWhpZGRlblwiKSB7XG4gICAgICAgIHRoaXMuaGFuZGxlTW9kYWxDbG9zZWQoKTtcbiAgICAgIH0gZWxzZSBpZiAobWVzc2FnZS50eXBlID09PSBcImNzdmJveC11cGxvYWQtc3VjY2Vzc2Z1bFwiKSB7XG4gICAgICAgICAgaWYgKHRoaXMub25JbXBvcnQpIHRoaXMub25JbXBvcnQodHJ1ZSk7XG4gICAgICAgICAgaWYgKHRoaXMuaXNJbXBvcnRlZCkgdGhpcy5pc0ltcG9ydGVkKHRydWUpO1xuICAgICAgICAgIGlmICh0aGlzLmltcG9ydGVkKSB0aGlzLmltcG9ydGVkKHRydWUpO1xuICAgICAgfSBlbHNlIGlmIChtZXNzYWdlLnR5cGUgPT09IFwiY3N2Ym94LXVwbG9hZC1mYWlsZWRcIikge1xuICAgICAgICAgIGlmICh0aGlzLm9uSW1wb3J0KSB0aGlzLm9uSW1wb3J0KGZhbHNlKTtcbiAgICAgICAgICBpZiAodGhpcy5pc0ltcG9ydGVkKSB0aGlzLmlzSW1wb3J0ZWQoZmFsc2UpO1xuICAgICAgICAgIGlmICh0aGlzLmltcG9ydGVkKSB0aGlzLmltcG9ydGVkKGZhbHNlKTtcbiAgICAgIH1cbiAgICB9LCBmYWxzZSk7XG5cbiAgICBpZih0aGlzLmxhenkpIHtcbiAgICAgIHRoaXMuZGlzYWJsZWQgPSBmYWxzZTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5kaXNhYmxlZCA9IHRydWU7XG4gICAgICB0aGlzLmluaXRJbXBvcnRlcigpO1xuICAgIH1cbiAgfVxuXG4gIGhhbmRsZU1vZGFsQ2xvc2VkKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmhvbGRlcikgdGhpcy5ob2xkZXIuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICB0aGlzLmlzTW9kYWxTaG93biA9IGZhbHNlO1xuICAgIHRoaXMuaXNJZnJhbWVMb2FkZWQgPSBmYWxzZTtcbiAgICB0aGlzLm9wZW5Nb2RhbE9uSWZyYW1lTG9hZCA9IGZhbHNlO1xuICAgIGlmICh0aGlzLmhvbGRlcikgdGhpcy5ob2xkZXIucmVtb3ZlKCk7XG4gICAgdGhpcy5ob2xkZXIgPSBudWxsO1xuICAgIHRoaXMuaWZyYW1lID0gbnVsbDtcbiAgICBpZiAodGhpcy5vbkNsb3NlKSB0aGlzLm9uQ2xvc2UoKTtcbiAgICBpZiAodGhpcy5pc0Nsb3NlZCkgdGhpcy5pc0Nsb3NlZCgpO1xuICAgIGlmICh0aGlzLmNsb3NlZCkgdGhpcy5jbG9zZWQoKTtcbiAgfVxuXG4gIGluaXRJbXBvcnRlcigpIHtcbiAgICBpZiAodGhpcy5sb2FkU3RhcnRlZCkgdGhpcy5sb2FkU3RhcnRlZCgpO1xuXG4gICAgdGhpcy51dWlkID0gZ2VuZXJhdGVVdWlkKCk7XG5cbiAgICBpbnNlcnRDU1MoKTtcblxuICAgIGxldCBpZnJhbWUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiaWZyYW1lXCIpO1xuICAgIHRoaXMuaWZyYW1lID0gaWZyYW1lO1xuICAgIGlmcmFtZS5zZXRBdHRyaWJ1dGUoXCJzcmNcIiwgdGhpcy5zYWZlVXJsKTtcbiAgICBpZnJhbWUuZnJhbWVCb3JkZXIgPSBcIjBcIjtcblxuICAgIGxldCBzZWxmID0gdGhpcztcbiAgICBpZnJhbWUub25sb2FkID0gZnVuY3Rpb24gKCkge1xuICAgICAgaWYgKHNlbGYub25SZWFkeSkgc2VsZi5vblJlYWR5KCk7XG4gICAgICBpZiAoc2VsZi5pc1JlYWR5KSBzZWxmLmlzUmVhZHkoKTtcbiAgICAgIGlmIChzZWxmLmltcG9ydGVyUmVhZHkpIHNlbGYuaW1wb3J0ZXJSZWFkeSgpO1xuXG4gICAgICBzZWxmLmRpc2FibGVkID0gZmFsc2U7XG4gICAgICBzZWxmLmlzSWZyYW1lTG9hZGVkID0gdHJ1ZTtcbiAgICAgIGlmIChzZWxmLmlmcmFtZSAmJiBzZWxmLmlmcmFtZS5jb250ZW50V2luZG93KSB7XG4gICAgICAgIHNlbGYuaWZyYW1lLmNvbnRlbnRXaW5kb3cucG9zdE1lc3NhZ2UoYnVpbGRJbml0UGF5bG9hZChzZWxmLnVzZXIsIHNlbGYuZHluYW1pY0NvbHVtbnMsIHNlbGYub3B0aW9ucywgc2VsZi51dWlkISksIFwiKlwiKTtcbiAgICAgIH1cbiAgICAgIGlmKHNlbGYub3Blbk1vZGFsT25JZnJhbWVMb2FkKSB7XG4gICAgICAgIHNlbGYub3Blbk1vZGFsKCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5ob2xkZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICB0aGlzLmhvbGRlci5jbGFzc0xpc3QuYWRkKCdjc3Zib3gtaG9sZGVyJyk7XG4gICAgdGhpcy5ob2xkZXIuc2V0QXR0cmlidXRlKCdpZCcsIGBjc3Zib3gtZW1iZWQtJHt0aGlzLnV1aWR9YCk7XG4gICAgdGhpcy5ob2xkZXIuYXBwZW5kQ2hpbGQoaWZyYW1lKTtcblxuICAgIGRvY3VtZW50LmJvZHkuaW5zZXJ0QWRqYWNlbnRFbGVtZW50KFxuICAgICAgJ2JlZm9yZWVuZCcsIHRoaXMuaG9sZGVyXG4gICAgKTtcbiAgfVxuXG4gIG9wZW5Nb2RhbCgpOiB2b2lkIHtcbiAgICBpZighdGhpcy5pZnJhbWUpIHtcbiAgICAgICAgdGhpcy5vcGVuTW9kYWxPbklmcmFtZUxvYWQgPSB0cnVlO1xuICAgICAgICB0aGlzLmluaXRJbXBvcnRlcigpO1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmKCF0aGlzLmlzTW9kYWxTaG93bikge1xuICAgICAgaWYodGhpcy5pc0lmcmFtZUxvYWRlZCkge1xuICAgICAgICAgIHRoaXMuaXNNb2RhbFNob3duID0gdHJ1ZTtcbiAgICAgICAgICBpZih0aGlzLmhvbGRlcikgdGhpcy5ob2xkZXIuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG4gICAgICAgICAgaWYodGhpcy5pZnJhbWUgJiYgdGhpcy5pZnJhbWUuY29udGVudFdpbmRvdykge1xuICAgICAgICAgICAgdGhpcy5pZnJhbWUuY29udGVudFdpbmRvdy5wb3N0TWVzc2FnZSgnb3Blbk1vZGFsJywgJyonKTtcbiAgICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMub3Blbk1vZGFsT25JZnJhbWVMb2FkID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxufVxuIl19
816
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3N2Ym94LWJ1dHRvbi5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9Ac3VtaXRfeWV3YWxlL2FuZ3VsYXIvIiwic291cmNlcyI6WyJsaWIvY3N2Ym94LWJ1dHRvbi5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUVULEtBQUssRUFHTCxlQUFlLEVBR2YsaUJBQWlCLEVBQ2pCLE1BQU0sRUFDUCxNQUFNLGVBQWUsQ0FBQztBQUV2QixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDekQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxjQUFjLEVBQUUsWUFBWSxFQUFFLGdCQUFnQixFQUFFLGdCQUFnQixFQUFFLHlCQUF5QixFQUFFLHFCQUFxQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7OztJQUcxSixtQkFBbUIsR0FBRyxJQUFJOzs7O0FBT2hDLGdDQUFvRTs7O0lBQXRDLHNDQUFvQzs7Ozs7QUFDbEUsNEJBQW9GOzs7SUFBMUQsNkJBQTBCOztJQUFDLGtDQUE2Qjs7O0lBQzVFLGtCQUFrQixHQUFHLHVCQUF1Qjs7SUFDNUMsV0FBVyxHQUFHLFVBQVU7Ozs7QUFFOUIsU0FBUyxhQUFhOztRQUNkLENBQUMsR0FBRyxtQkFBQSxNQUFNLEVBQU87SUFDdkIsSUFBSSxDQUFDLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQztRQUFFLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxHQUFHLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFBRSxTQUFTLEVBQUUsRUFBRSxFQUFFLENBQUM7SUFDaEYsT0FBTyxDQUFDLENBQUMsa0JBQWtCLENBQUMsQ0FBQztBQUMvQixDQUFDOzs7OztBQUVELFNBQVMsb0JBQW9CLENBQUMsR0FBa0I7SUFDOUMsR0FBRyxDQUFDLElBQUksQ0FBQyxPQUFPOzs7OztJQUFDLFVBQUMsS0FBSyxFQUFFLENBQUM7O1lB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Szt1QkFFTCxLQUFLO2lDQUNMLEtBQUs7NkJBQ0wsS0FBSzswQkFDTCxLQUFLO3VCQUNMLEtBQUs7K0JBQ0wsS0FBSzsrQkFDTCxLQUFLOzJCQUNMLEtBQUs7OEJBQ0wsS0FBSzt3QkFFTCxLQUFLO2lDQUVMLEtBQUs7d0NBQ0wsS0FBSzt1QkFFTCxLQUFLOzJCQU1MLEtBQUs7O0lBOFdSLDRCQUFDO0NBQUEsQUFsYUQsSUFrYUM7U0F2WlkscUJBQXFCOzs7SUFFaEMsNkNBQXFCOztJQUVyQix5Q0FBNkI7O0lBQzdCLHdDQUE0Qjs7SUFDNUIsd0NBQTRCOztJQUM1Qix5Q0FBNkI7O0lBRTdCLDJDQUErQjs7SUFDL0Isd0NBQTRCOztJQUM1Qix5Q0FBNkI7O0lBQzdCLDRDQUFnQzs7SUFFaEMsOENBQWtDOztJQUNsQyx1Q0FBMkI7O0lBQzNCLDBDQUE4Qjs7SUFDOUIseUNBQTZCOztJQUM3Qiw0Q0FBZ0M7O0lBRWhDLHFDQUF1Qjs7SUFDdkIsK0NBQWlDOztJQUNqQywyQ0FBMEM7O0lBQzFDLHdDQUEwQjs7SUFDMUIscUNBQW9DOztJQUNwQyw2Q0FBNEM7O0lBQzVDLDZDQUE0Qzs7SUFDNUMseUNBQXdDOztJQUN4Qyw0Q0FBOEI7O0lBRTlCLHNDQUFxQzs7SUFFckMsK0NBQXlDOztJQUN6QyxzREFBZ0Q7O0lBRWhELHFDQUErQjs7SUFFL0Isd0NBQWE7O0lBRWIsdUNBQXdDOztJQUV4Qyx5Q0FBa0M7O0lBS2xDLCtDQUFnQzs7Ozs7SUFFaEMsOENBQTRFOzs7OztJQUU1RSwyQ0FXRzs7Ozs7SUFFSCx5REFBNkQ7O0lBRTdELHVDQUFZOztJQUVaLDRDQUFnQzs7SUFFaEMsNkNBQWlDOztJQUlqQywyQ0FBcUM7Ozs7O0lBRXJDLDZDQUFpQzs7Ozs7SUFxQ2pDLGdEQXdGRTs7SUE3SlUsMENBQTZCOzs7OztJQUFFLG9DQUE4Qjs7Ozs7SUFBRSxxQ0FBb0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDb21wb25lbnQsXG4gIE9uSW5pdCxcbiAgSW5wdXQsXG4gIE9uQ2hhbmdlcyxcbiAgU2ltcGxlQ2hhbmdlcyxcbiAgU2VjdXJpdHlDb250ZXh0LFxuICBBZnRlckNvbnRlbnRJbml0LFxuICBPbkRlc3Ryb3ksXG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBOZ1pvbmVcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7IERvbVNhbml0aXplciB9IGZyb20gJ0Bhbmd1bGFyL3BsYXRmb3JtLWJyb3dzZXInO1xuaW1wb3J0IHsgaW5zZXJ0Q1NTIH0gZnJvbSAnLi4vdXRsaXMvaW5zZXJ0Q1NTJztcbmltcG9ydCB7IGJ1aWxkSW1wb3J0VXJsLCBnZW5lcmF0ZVV1aWQsIGJ1aWxkSW5pdFBheWxvYWQsIGNyZWF0ZUZpbGVTZW5kZXIsIGNsYXNzaWZ5U3RydWN0dXJlZE1lc3NhZ2UsIGNsYXNzaWZ5TGVnYWN5TWVzc2FnZSB9IGZyb20gJ0BzdW1pdF95ZXdhbGUvYWRhcHRlci1jb3JlJztcblxuLy8gSG93IGxvbmcgd2Ugd2FpdCBmb3IgdGhlIGltcG9ydGVyIHRvIGNvbmZpcm0gYSBmaWxlIGl0IHdhcyBzZW50IGJlZm9yZSBnaXZpbmcgdXAgb24gaXQuXG5jb25zdCBGSUxFX0FDS19USU1FT1VUX01TID0gODAwMDtcblxuLy8gUGFnZS13aWRlIHJlY29yZCBvZiB0aGUgaW1wb3J0ZXJzIHRoYXQgYXJlIG9wZW4gb3Igb3BlbmluZywgc2hhcmVkIGJ5IGV2ZXJ5IENTVkJveCBhZGFwdGVyXG4vLyBvbiB0aGUgcGFnZSAoaXQgbGl2ZXMgb24gd2luZG93IHNvIHNlcGFyYXRlIGNvcGllcyBvZiBhbiBhZGFwdGVyIHNlZSB0aGUgc2FtZSBsaXN0KS4gSXQgZG9lc1xuLy8gdHdvIHRoaW5nczogdGhlIG5ld2VzdCBpbXBvcnRlciBpcyBzdGFja2VkIG9uIHRvcCAoZXZlcnkgaG9sZGVyIGlzIGZpeGVkLCBmdWxsIHNjcmVlbiBhbmRcbi8vIHotaW5kZXggMjE0NzQ4MzY0Nywgc28gZXF1YWwgei1pbmRleGVzIHdvdWxkIGxlYXZlIHRoZSBvbmUgdGhhdCBjb21lcyBmaXJzdCBpbiB0aGUgRE9NIG9uXG4vLyB0b3ApLCBhbmQgdGhlIG90aGVyIGluc3RhbmNlcyBsZWFybiB0aGF0IGFuIGltcG9ydGVyIGlzIG9wZW4gc28gdGhleSBjYW4gZGlzYWJsZSB0aGVpciBidXR0b24uXG5pbnRlcmZhY2UgT3BlbkltcG9ydGVyRW50cnkgeyBnZXRIb2xkZXI6ICgpID0+IEhUTUxFbGVtZW50IHwgbnVsbDsgfVxuaW50ZXJmYWNlIE9wZW5JbXBvcnRlcnMgeyBvcGVuOiBPcGVuSW1wb3J0ZXJFbnRyeVtdOyBsaXN0ZW5lcnM6IEFycmF5PCgpID0+IHZvaWQ+OyB9XG5jb25zdCBPUEVOX0lNUE9SVEVSU19LRVkgPSAnX19jc3Zib3hPcGVuSW1wb3J0ZXJzJztcbmNvbnN0IFRPUF9aX0lOREVYID0gMjE0NzQ4MzY0NztcblxuZnVuY3Rpb24gb3BlbkltcG9ydGVycygpOiBPcGVuSW1wb3J0ZXJzIHtcbiAgY29uc3QgdyA9IHdpbmRvdyBhcyBhbnk7XG4gIGlmICghd1tPUEVOX0lNUE9SVEVSU19LRVldKSB3W09QRU5fSU1QT1JURVJTX0tFWV0gPSB7IG9wZW46IFtdLCBsaXN0ZW5lcnM6IFtdIH07XG4gIHJldHVybiB3W09QRU5fSU1QT1JURVJTX0tFWV07XG59XG5cbmZ1bmN0aW9uIHJlc3RhY2tPcGVuSW1wb3J0ZXJzKHJlZzogT3BlbkltcG9ydGVycyk6IHZvaWQge1xuICByZWcub3Blbi5mb3JFYWNoKChlbnRyeSwgaSkgPT4ge1xuICAgIGNvbnN0IGhvbGRlciA9IGVudHJ5LmdldEhvbGRlcigpO1xuICAgIGlmIChob2xkZXIpIGhvbGRlci5zdHlsZS56SW5kZXggPSBTdHJpbmcoVE9QX1pfSU5ERVggLSAocmVnLm9wZW4ubGVuZ3RoIC0gMSAtIGkpKTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHJlZ2lzdGVyT3BlbkltcG9ydGVyKGVudHJ5OiBPcGVuSW1wb3J0ZXJFbnRyeSk6IHZvaWQge1xuICBjb25zdCByZWcgPSBvcGVuSW1wb3J0ZXJzKCk7XG4gIGlmIChyZWcub3Blbi5pbmRleE9mKGVudHJ5KSA+PSAwKSByZXR1cm47XG4gIHJlZy5vcGVuLnB1c2goZW50cnkpO1xuICByZXN0YWNrT3BlbkltcG9ydGVycyhyZWcpO1xuICByZWcubGlzdGVuZXJzLnNsaWNlKCkuZm9yRWFjaChmbiA9PiBmbigpKTtcbn1cblxuZnVuY3Rpb24gdW5yZWdpc3Rlck9wZW5JbXBvcnRlcihlbnRyeTogT3BlbkltcG9ydGVyRW50cnkpOiB2b2lkIHtcbiAgY29uc3QgcmVnID0gb3BlbkltcG9ydGVycygpO1xuICBjb25zdCBpID0gcmVnLm9wZW4uaW5kZXhPZihlbnRyeSk7XG4gIGlmIChpIDwgMCkgcmV0dXJuO1xuICByZWcub3Blbi5zcGxpY2UoaSwgMSk7XG4gIHJlc3RhY2tPcGVuSW1wb3J0ZXJzKHJlZyk7XG4gIHJlZy5saXN0ZW5lcnMuc2xpY2UoKS5mb3JFYWNoKGZuID0+IGZuKCkpO1xufVxuXG5mdW5jdGlvbiBpc0Jsb2NrZWRCeU9wZW5JbXBvcnRlcihlbnRyeTogT3BlbkltcG9ydGVyRW50cnkpOiBib29sZWFuIHtcbiAgY29uc3QgcmVnID0gb3BlbkltcG9ydGVycygpO1xuICByZXR1cm4gcmVnLm9wZW4ubGVuZ3RoID4gMCAmJiByZWcub3Blbi5pbmRleE9mKGVudHJ5KSA8IDA7XG59XG5cbmZ1bmN0aW9uIHN1YnNjcmliZU9wZW5JbXBvcnRlcnMoZm46ICgpID0+IHZvaWQpOiAoKSA9PiB2b2lkIHtcbiAgY29uc3QgcmVnID0gb3BlbkltcG9ydGVycygpO1xuICByZWcubGlzdGVuZXJzLnB1c2goZm4pO1xuICByZXR1cm4gKCkgPT4ge1xuICAgIGNvbnN0IGkgPSByZWcubGlzdGVuZXJzLmluZGV4T2YoZm4pO1xuICAgIGlmIChpID49IDApIHJlZy5saXN0ZW5lcnMuc3BsaWNlKGksIDEpO1xuICB9O1xufVxuXG5jb25zdCBhcHBWZXJzaW9uID0gJzEuMS4yMCc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2NzdmJveC1idXR0b24nLFxuICB0ZW1wbGF0ZTogYFxuICAgIDxkaXY+XG4gICAgICA8YnV0dG9uIFtkaXNhYmxlZF09XCJkaXNhYmxlZCB8fCBibG9ja2VkQnlPdGhlclwiIChjbGljayk9XCJvcGVuTW9kYWwoKVwiIFthdHRyLmRhdGEtY3N2Ym94LXRva2VuXT1cInV1aWRcIj5cbiAgICAgICAgPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PlxuICAgICAgPC9idXR0b24+XG4gICAgPC9kaXY+XG4gIGBcbn0pXG5cbmV4cG9ydCBjbGFzcyBDU1ZCb3hCdXR0b25Db21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcywgQWZ0ZXJDb250ZW50SW5pdCwgT25EZXN0cm95IHtcblxuICBpc01vZGFsU2hvd24gPSBmYWxzZTtcblxuICBASW5wdXQoKSBvbkltcG9ydD86IEZ1bmN0aW9uO1xuICBASW5wdXQoKSBvblJlYWR5PzogRnVuY3Rpb247XG4gIEBJbnB1dCgpIG9uQ2xvc2U/OiBGdW5jdGlvbjtcbiAgQElucHV0KCkgb25TdWJtaXQ/OiBGdW5jdGlvbjtcblxuICBASW5wdXQoKSBpc0ltcG9ydGVkPzogRnVuY3Rpb247XG4gIEBJbnB1dCgpIGlzUmVhZHk/OiBGdW5jdGlvbjtcbiAgQElucHV0KCkgaXNDbG9zZWQ/OiBGdW5jdGlvbjtcbiAgQElucHV0KCkgaXNTdWJtaXR0ZWQ/OiBGdW5jdGlvbjtcblxuICBASW5wdXQoKSBpbXBvcnRlclJlYWR5PzogRnVuY3Rpb247XG4gIEBJbnB1dCgpIGNsb3NlZD86IEZ1bmN0aW9uO1xuICBASW5wdXQoKSBzdWJtaXR0ZWQ/OiBGdW5jdGlvbjtcbiAgQElucHV0KCkgaW1wb3J0ZWQ/OiBGdW5jdGlvbjtcbiAgQElucHV0KCkgbG9hZFN0YXJ0ZWQ/OiBGdW5jdGlvbjtcblxuICBASW5wdXQoKSB1c2VyPzogb2JqZWN0O1xuICBASW5wdXQoKSBkeW5hbWljQ29sdW1ucz86IG9iamVjdDtcbiAgQElucHV0KCkgbGljZW5zZUtleTogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIEBJbnB1dCgpIG9wdGlvbnM/OiBvYmplY3Q7XG4gIEBJbnB1dCgpIHV1aWQ6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICBASW5wdXQoKSBjdXN0b21Eb21haW46IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICBASW5wdXQoKSBkYXRhTG9jYXRpb246IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICBASW5wdXQoKSBsYW5ndWFnZTogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIEBJbnB1dCgpIGVudmlyb25tZW50Pzogb2JqZWN0O1xuXG4gIEBJbnB1dCgpIHRoZW1lOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcblxuICBASW5wdXQoKSBpc0lmcmFtZUxvYWRlZDogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSBvcGVuTW9kYWxPbklmcmFtZUxvYWQ6IGJvb2xlYW4gPSBmYWxzZTtcblxuICBASW5wdXQoKSBsYXp5OiBib29sZWFuID0gZmFsc2U7XG5cbiAgc2FmZVVybDogYW55O1xuXG4gIGlmcmFtZTogSFRNTElGcmFtZUVsZW1lbnQgfCBudWxsID0gbnVsbDtcblxuICBASW5wdXQoKSBkaXNhYmxlZDogYm9vbGVhbiA9IHRydWU7XG5cbiAgY29uc3RydWN0b3IocHVibGljIHNhbml0aXplcjpEb21TYW5pdGl6ZXIsIHByaXZhdGUgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZiwgcHJpdmF0ZSB6b25lOiBOZ1pvbmUpIHt9XG5cbiAgLy8gVHJ1ZSB3aGlsZSBhIGRpZmZlcmVudCBpbXBvcnRlciBvbiB0aGUgcGFnZSBpcyBvcGVuOiB0aGUgYnV0dG9uIHN0YXlzIGRpc2FibGVkLlxuICBibG9ja2VkQnlPdGhlcjogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIHByaXZhdGUgcmVnaXN0cnlFbnRyeTogT3BlbkltcG9ydGVyRW50cnkgPSB7IGdldEhvbGRlcjogKCkgPT4gdGhpcy5ob2xkZXIgfTtcblxuICBwcml2YXRlIGZpbGVTZW5kZXIgPSBjcmVhdGVGaWxlU2VuZGVyKHtcbiAgICBnZXRJZnJhbWU6ICgpID0+IHRoaXMuaWZyYW1lLFxuICAgIGdldFRva2VuOiAoKSA9PiB0aGlzLnV1aWQgYXMgc3RyaW5nLFxuICAgIGdldFRhcmdldE9yaWdpbjogKCkgPT4gdGhpcy50YXJnZXRPcmlnaW4gYXMgc3RyaW5nLFxuICAgIGdldEJhc2VEb21haW46ICgpID0+IHRoaXMuYmFzZURvbWFpbixcbiAgICB0YWtlRmlsZTogKCkgPT4ge1xuICAgICAgY29uc3QgZmlsZSA9IHRoaXMucGVuZGluZ0ZpbGU7XG4gICAgICB0aGlzLnBlbmRpbmdGaWxlID0gbnVsbDtcbiAgICAgIHJldHVybiBmaWxlO1xuICAgIH0sXG4gICAgb25TZW50OiAoKSA9PiB0aGlzLnN0YXJ0RmlsZUFja1RpbWVyKClcbiAgfSk7XG5cbiAgcHJpdmF0ZSB1bnN1YnNjcmliZU9wZW5JbXBvcnRlcnM6ICgoKSA9PiB2b2lkKSB8IG51bGwgPSBudWxsO1xuXG4gIGhvbGRlcjogYW55O1xuXG4gIHBlbmRpbmdGaWxlOiBGaWxlIHwgbnVsbCA9IG51bGw7XG5cbiAgdGFyZ2V0T3JpZ2luOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgLy8gRGF0YS1sb2NhdGlvbiBzaGVldHMgcmVkaXJlY3QgdG8gYW5vdGhlciBob3N0LCBzbyB0aGUgaWZyYW1lIG9yaWdpbiBjYW4gZGlmZmVyIGZyb21cbiAgLy8gdGFyZ2V0T3JpZ2luLiBiYXNlRG9tYWluIGlzIHVzZWQgdG8gY2hlY2sgdGhlIHJlYWwgb3JpZ2luIGJlZm9yZSB0cnVzdGluZyBpdC5cbiAgYmFzZURvbWFpbjogc3RyaW5nID0gXCJhcHAuY3N2Ym94LmlvXCI7XG5cbiAgcHJpdmF0ZSBmaWxlQWNrVGltZXI6IGFueSA9IG51bGw7XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy51dWlkID0gZ2VuZXJhdGVVdWlkKCk7XG4gICAgbGV0IGlmcmFtZVVybCA9IGJ1aWxkSW1wb3J0VXJsKFxuICAgICAge1xuICAgICAgICBsaWNlbnNlS2V5OiB0aGlzLmxpY2Vuc2VLZXksXG4gICAgICAgIGN1c3RvbURvbWFpbjogdGhpcy5jdXN0b21Eb21haW4sXG4gICAgICAgIGRhdGFMb2NhdGlvbjogdGhpcy5kYXRhTG9jYXRpb24sXG4gICAgICAgIGxhbmd1YWdlOiB0aGlzLmxhbmd1YWdlLFxuICAgICAgICB0aGVtZTogdGhpcy50aGVtZSxcbiAgICAgICAgZW52aXJvbm1lbnQ6IHRoaXMuZW52aXJvbm1lbnRcbiAgICAgIH0sXG4gICAgICBcImFuZ3VsYXJcIixcbiAgICAgIGFwcFZlcnNpb25cbiAgICApO1xuICAgIC8vIERlZmF1bHQgcGxhY2UgdG8gc2VuZCB0aGUgZmlsZS4gQSBmaWxlIGlzIG9ubHkgZXZlciBzZW50IHRvIGEgbmFtZWQgb3JpZ2luLCBuZXZlciBcIipcIi5cbiAgICB0aGlzLnRhcmdldE9yaWdpbiA9IG5ldyBVUkwoaWZyYW1lVXJsKS5vcmlnaW47XG4gICAgdGhpcy5iYXNlRG9tYWluID0gdGhpcy5jdXN0b21Eb21haW4gfHwgXCJhcHAuY3N2Ym94LmlvXCI7XG4gICAgdGhpcy5zYWZlVXJsID0gdGhpcy5zYW5pdGl6ZXIuc2FuaXRpemUoU2VjdXJpdHlDb250ZXh0LlJFU09VUkNFX1VSTCwgdGhpcy5zYW5pdGl6ZXIuYnlwYXNzU2VjdXJpdHlUcnVzdFJlc291cmNlVXJsKGlmcmFtZVVybCkpO1xuICB9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcykge1xuICAgIGlmKGNoYW5nZXNbXCJ1c2VyXCJdICYmIGNoYW5nZXNbJ3VzZXInXS5jdXJyZW50VmFsdWUgIT0gY2hhbmdlc1sndXNlciddLnByZXZpb3VzVmFsdWUpIHtcbiAgICAgIHRoaXMudXBkYXRlVXNlclZhcmlhYmUoY2hhbmdlc1sndXNlciddLmN1cnJlbnRWYWx1ZSk7XG4gICAgfVxuICB9XG5cbiAgdXBkYXRlVXNlclZhcmlhYmUoZGF0YTogYW55KTogdm9pZCB7XG4gICAgdGhpcy51c2VyID0gZGF0YTtcbiAgICBpZiAodGhpcy5pZnJhbWUgJiYgdGhpcy5pZnJhbWUuY29udGVudFdpbmRvdykge1xuICAgICAgdGhpcy5pZnJhbWUuY29udGVudFdpbmRvdy5wb3N0TWVzc2FnZSh7XG4gICAgICAgIFwiY3VzdG9tZXJcIiA6IGRhdGFcbiAgICAgIH0sIFwiKlwiKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIG1lc3NhZ2VMaXN0ZW5lciA9IChldmVudDogTWVzc2FnZUV2ZW50KSA9PiB7XG4gICAgLy8gT2xkZXIgaW1wb3J0ZXJzIHNlbmQgdGhlc2UgYXMgYmFyZSBzdHJpbmdzLCB3aXRob3V0IGEgdG9rZW4uXG4gICAgY29uc3QgbGVnYWN5ID0gY2xhc3NpZnlMZWdhY3lNZXNzYWdlKGV2ZW50LmRhdGEpO1xuICAgIGlmIChsZWdhY3kpIHtcbiAgICAgIC8vIExlZ2FjeSBtZXNzYWdlcyBjYXJyeSBubyB0b2tlbiwgc28gdGhlIG9ubHkgd2F5IHRvIHRlbGwgd2hpY2ggaW1wb3J0ZXIgc2VudCBvbmUgaXMgaXRzXG4gICAgICAvLyB3aW5kb3cuIElnbm9yZSB0aG9zZSB0aGF0IGNhbWUgZnJvbSBhbm90aGVyIGluc3RhbmNlJ3MgaWZyYW1lIChvciBhbnl3aGVyZSBlbHNlKS5cbiAgICAgIGlmICghdGhpcy5pZnJhbWUgfHwgZXZlbnQuc291cmNlICE9PSB0aGlzLmlmcmFtZS5jb250ZW50V2luZG93KSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmIChsZWdhY3kudHlwZSA9PT0gXCJtYWluTW9kYWxIaWRkZW5cIikge1xuICAgICAgICB0aGlzLmhhbmRsZU1vZGFsQ2xvc2VkKCk7XG4gICAgICB9IGVsc2UgaWYgKGxlZ2FjeS50eXBlID09PSBcInVwbG9hZFN1Y2Nlc3NmdWxcIikge1xuICAgICAgICBpZiAodGhpcy5vbkltcG9ydCkgdGhpcy5vbkltcG9ydCh0cnVlKTtcbiAgICAgICAgaWYgKHRoaXMuaXNJbXBvcnRlZCkgdGhpcy5pc0ltcG9ydGVkKHRydWUpO1xuICAgICAgICBpZiAodGhpcy5pbXBvcnRlZCkgdGhpcy5pbXBvcnRlZCh0cnVlKTtcbiAgICAgIH0gZWxzZSBpZiAobGVnYWN5LnR5cGUgPT09IFwidXBsb2FkRmFpbGVkXCIpIHtcbiAgICAgICAgaWYgKHRoaXMub25JbXBvcnQpIHRoaXMub25JbXBvcnQoZmFsc2UpO1xuICAgICAgICBpZiAodGhpcy5pc0ltcG9ydGVkKSB0aGlzLmlzSW1wb3J0ZWQoZmFsc2UpO1xuICAgICAgICBpZiAodGhpcy5pbXBvcnRlZCkgdGhpcy5pbXBvcnRlZChmYWxzZSk7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gU2V0LWZpbGUgaGFuZHNoYWtlIG1lc3NhZ2VzLiBUaGUgc2hhcmVkIGNvcmUgZG9lcyBub3QgY2xhc3NpZnkgdGhlc2UsIHNvIHRoZXkgYXJlXG4gICAgLy8gcmVhZCBoZXJlLCBiZWhpbmQgdGhlIHNhbWUgdW5pcXVlX3Rva2VuIGNoZWNrIHRoZSBjb3JlIGFwcGxpZXMuXG4gICAgY29uc3QgcmF3ID0gZXZlbnQuZGF0YTtcbiAgICBpZiAocmF3ICYmIHR5cGVvZiByYXcgPT09IFwib2JqZWN0XCIgJiYgcmF3LmRhdGEgJiYgcmF3LmRhdGEudW5pcXVlX3Rva2VuID09IHRoaXMudXVpZCkge1xuICAgICAgdGhpcy5maWxlU2VuZGVyLmxlYXJuT3JpZ2luKGV2ZW50KTtcblxuICAgICAgaWYgKHJhdy50eXBlID09PSBcImNzdmJveC1zZXQtZmlsZS1yZWplY3RlZFwiICYmIHJhdy5kYXRhLnJlYXNvbiA9PT0gXCJub3QtYS1maWxlXCIpIHtcbiAgICAgICAgLy8gUmVwbHkgdG8gb3VyIHByb2JlIChpdCBoYXMgbm8gZmlsZSkuIEl0IG9ubHkgdGVsbHMgdXMgdGhlIG9yaWdpbiwgc28gZG8gbm90aGluZy5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKHJhdy50eXBlID09PSBcImNzdmJveC1tb2RhbC1zaG93blwiKSB7XG4gICAgICAgIHRoaXMuY2xlYXJGaWxlQWNrVGltZXIoKTtcbiAgICAgICAgcmVnaXN0ZXJPcGVuSW1wb3J0ZXIodGhpcy5yZWdpc3RyeUVudHJ5KTtcbiAgICAgICAgLy8gV2hhdCB0aGUgZmlsZSBwYXRoIGluIG9wZW5Nb2RhbCgpIGlzIHdhaXRpbmcgZm9yLiBkaXNwbGF5IGFzIHdlbGwgYXNcbiAgICAgICAgLy8gcG9pbnRlci1ldmVudHM6IGEgc2Vjb25kIGZpbGUgZGVjbGluZWQgd2hpbGUgdGhlIGZpcnN0IHdhcyBzdGlsbCBvcGVuaW5nIHRoZVxuICAgICAgICAvLyBtb2RhbCBoYXMgcHV0IHRoZSBob2xkZXIgYXdheSBpbiB0aGUgbWVhbnRpbWUuXG4gICAgICAgIHRoaXMuaXNNb2RhbFNob3duID0gdHJ1ZTtcbiAgICAgICAgaWYgKHRoaXMuaG9sZGVyKSB7XG4gICAgICAgICAgdGhpcy5ob2xkZXIuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG4gICAgICAgICAgdGhpcy5ob2xkZXIuc3R5bGUucG9pbnRlckV2ZW50cyA9ICdhdXRvJztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAocmF3LnR5cGUgPT09IFwiY3N2Ym94LXNldC1maWxlLXJlamVjdGVkXCIpIHtcbiAgICAgICAgdGhpcy5jbGVhckZpbGVBY2tUaW1lcigpO1xuICAgICAgICAvLyBUaGUgaW1wb3J0ZXIgaGFzIHRoZSBmaWxlIGFuZCB3aWxsIG5vdCB0YWtlIGl0LiBQdXQgdGhlIGhvbGRlciBhd2F5IG9ubHkgaWYgdGhlXG4gICAgICAgIC8vIG1vZGFsIHdhcyBuZXZlciBjb25maXJtZWQgdXA6IGEgZmlsZSBkZWNsaW5lZCB3aGlsZSBpdCBpcyBvcGVuIGxlYXZlcyB0aGF0IG1vZGFsXG4gICAgICAgIC8vIHdoZXJlIGl0IGlzLCBhbmQgaXRzIG93biAnY3N2Ym94LW1vZGFsLWhpZGRlbicgd2lsbCBwdXQgdGhlIGhvbGRlciBhd2F5LlxuICAgICAgICBpZiAoIXRoaXMuaXNNb2RhbFNob3duICYmIHRoaXMuaG9sZGVyKSB7XG4gICAgICAgICAgdGhpcy5ob2xkZXIuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICAgICAgICB0aGlzLmhvbGRlci5zdHlsZS5wb2ludGVyRXZlbnRzID0gJ2F1dG8nO1xuICAgICAgICAgIHVucmVnaXN0ZXJPcGVuSW1wb3J0ZXIodGhpcy5yZWdpc3RyeUVudHJ5KTtcbiAgICAgICAgfVxuICAgICAgICBjb25zb2xlLndhcm4oXCJbY3N2Ym94XSBpbXBvcnRlciBkZWNsaW5lZCB0aGUgc3VwcGxpZWQgZmlsZTogXCIgKyByYXcuZGF0YS5yZWFzb24pO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuXG4gICAgbGV0IG1lc3NhZ2UgPSBjbGFzc2lmeVN0cnVjdHVyZWRNZXNzYWdlKGV2ZW50LmRhdGEsIHRoaXMudXVpZCEpO1xuICAgIGlmICghbWVzc2FnZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChtZXNzYWdlLnR5cGUgPT09IFwiZGF0YS1vbi1zdWJtaXRcIikge1xuICAgICAgaWYgKHRoaXMub25TdWJtaXQpIHRoaXMub25TdWJtaXQobWVzc2FnZS5tZXRhZGF0YSk7XG4gICAgICBpZiAodGhpcy5pc1N1Ym1pdHRlZCkgdGhpcy5pc1N1Ym1pdHRlZChtZXNzYWdlLm1ldGFkYXRhKTtcbiAgICAgIGlmICh0aGlzLnN1Ym1pdHRlZCkgdGhpcy5zdWJtaXR0ZWQobWVzc2FnZS5tZXRhZGF0YSk7XG4gICAgfSBlbHNlIGlmIChtZXNzYWdlLnR5cGUgPT09IFwiZGF0YS1wdXNoLXN0YXR1c1wiKSB7XG4gICAgICBpZiAoIW1lc3NhZ2Uuc3VjY2Vzcykge1xuICAgICAgICBkZWxldGUgbWVzc2FnZS5tZXRhZGF0YVtcInVuaXF1ZV90b2tlblwiXTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLm9uSW1wb3J0KSB0aGlzLm9uSW1wb3J0KG1lc3NhZ2Uuc3VjY2VzcywgbWVzc2FnZS5tZXRhZGF0YSk7XG4gICAgICBpZiAodGhpcy5pc0ltcG9ydGVkKSB0aGlzLmlzSW1wb3J0ZWQobWVzc2FnZS5zdWNjZXNzLCBtZXNzYWdlLm1ldGFkYXRhKTtcbiAgICAgIGlmICh0aGlzLmltcG9ydGVkKSB0aGlzLmltcG9ydGVkKG1lc3NhZ2Uuc3VjY2VzcywgbWVzc2FnZS5tZXRhZGF0YSk7XG4gICAgfSBlbHNlIGlmIChtZXNzYWdlLnR5cGUgPT09IFwiY3N2Ym94LW1vZGFsLWhpZGRlblwiKSB7XG4gICAgICB0aGlzLmhhbmRsZU1vZGFsQ2xvc2VkKCk7XG4gICAgfSBlbHNlIGlmIChtZXNzYWdlLnR5cGUgPT09IFwiY3N2Ym94LXVwbG9hZC1zdWNjZXNzZnVsXCIpIHtcbiAgICAgICAgaWYgKHRoaXMub25JbXBvcnQpIHRoaXMub25JbXBvcnQodHJ1ZSk7XG4gICAgICAgIGlmICh0aGlzLmlzSW1wb3J0ZWQpIHRoaXMuaXNJbXBvcnRlZCh0cnVlKTtcbiAgICAgICAgaWYgKHRoaXMuaW1wb3J0ZWQpIHRoaXMuaW1wb3J0ZWQodHJ1ZSk7XG4gICAgfSBlbHNlIGlmIChtZXNzYWdlLnR5cGUgPT09IFwiY3N2Ym94LXVwbG9hZC1mYWlsZWRcIikge1xuICAgICAgICBpZiAodGhpcy5vbkltcG9ydCkgdGhpcy5vbkltcG9ydChmYWxzZSk7XG4gICAgICAgIGlmICh0aGlzLmlzSW1wb3J0ZWQpIHRoaXMuaXNJbXBvcnRlZChmYWxzZSk7XG4gICAgICAgIGlmICh0aGlzLmltcG9ydGVkKSB0aGlzLmltcG9ydGVkKGZhbHNlKTtcbiAgICB9XG4gIH07XG5cbiAgbmdBZnRlckNvbnRlbnRJbml0KCk6IHZvaWQge1xuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwibWVzc2FnZVwiLCB0aGlzLm1lc3NhZ2VMaXN0ZW5lciwgZmFsc2UpO1xuICAgIHRoaXMuc3luY0Jsb2NrZWQoKTtcbiAgICB0aGlzLnVuc3Vic2NyaWJlT3BlbkltcG9ydGVycyA9IHN1YnNjcmliZU9wZW5JbXBvcnRlcnMoKCkgPT4gdGhpcy5zeW5jQmxvY2tlZCgpKTtcblxuICAgIGlmKHRoaXMubGF6eSkge1xuICAgICAgdGhpcy5kaXNhYmxlZCA9IGZhbHNlO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmRpc2FibGVkID0gdHJ1ZTtcbiAgICAgIHRoaXMuaW5pdEltcG9ydGVyKCk7XG4gICAgfVxuICB9XG5cbiAgaGFuZGxlTW9kYWxDbG9zZWQoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaG9sZGVyKSB7XG4gICAgICB0aGlzLmhvbGRlci5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgICAgdGhpcy5ob2xkZXIuc3R5bGUucG9pbnRlckV2ZW50cyA9ICdhdXRvJztcbiAgICB9XG4gICAgdGhpcy5pc01vZGFsU2hvd24gPSBmYWxzZTtcbiAgICB0aGlzLmlzSWZyYW1lTG9hZGVkID0gZmFsc2U7XG4gICAgdGhpcy5vcGVuTW9kYWxPbklmcmFtZUxvYWQgPSBmYWxzZTtcbiAgICBpZiAodGhpcy5ob2xkZXIpIHRoaXMuaG9sZGVyLnJlbW92ZSgpO1xuICAgIHRoaXMuaG9sZGVyID0gbnVsbDtcbiAgICB0aGlzLmlmcmFtZSA9IG51bGw7XG4gICAgLy8gQSBuZXcgaWZyYW1lIGlzIGJ1aWx0IG9uIHRoZSBuZXh0IG9wZW4sIHNvIHRoZSBvcmlnaW4gaXMgbGVhcm5lZCBhZ2Fpbi5cbiAgICB0aGlzLmNsZWFyUHJvYmVUaW1lcigpO1xuICAgIHVucmVnaXN0ZXJPcGVuSW1wb3J0ZXIodGhpcy5yZWdpc3RyeUVudHJ5KTtcbiAgICBpZiAodGhpcy5vbkNsb3NlKSB0aGlzLm9uQ2xvc2UoKTtcbiAgICBpZiAodGhpcy5pc0Nsb3NlZCkgdGhpcy5pc0Nsb3NlZCgpO1xuICAgIGlmICh0aGlzLmNsb3NlZCkgdGhpcy5jbG9zZWQoKTtcbiAgfVxuXG4gIGluaXRJbXBvcnRlcigpIHtcbiAgICBpZiAodGhpcy5sb2FkU3RhcnRlZCkgdGhpcy5sb2FkU3RhcnRlZCgpO1xuXG4gICAgdGhpcy51dWlkID0gZ2VuZXJhdGVVdWlkKCk7XG5cbiAgICBpbnNlcnRDU1MoKTtcblxuICAgIGxldCBpZnJhbWUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiaWZyYW1lXCIpO1xuICAgIHRoaXMuaWZyYW1lID0gaWZyYW1lO1xuICAgIGlmcmFtZS5zZXRBdHRyaWJ1dGUoXCJzcmNcIiwgdGhpcy5zYWZlVXJsKTtcbiAgICBpZnJhbWUuc2V0QXR0cmlidXRlKFwiYWxsb3dcIiwgXCJjbGlwYm9hcmQtcmVhZDsgY2xpcGJvYXJkLXdyaXRlICpcIik7XG4gICAgaWZyYW1lLmZyYW1lQm9yZGVyID0gXCIwXCI7XG5cbiAgICBsZXQgc2VsZiA9IHRoaXM7XG4gICAgaWZyYW1lLm9ubG9hZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmIChzZWxmLm9uUmVhZHkpIHNlbGYub25SZWFkeSgpO1xuICAgICAgaWYgKHNlbGYuaXNSZWFkeSkgc2VsZi5pc1JlYWR5KCk7XG4gICAgICBpZiAoc2VsZi5pbXBvcnRlclJlYWR5KSBzZWxmLmltcG9ydGVyUmVhZHkoKTtcblxuICAgICAgc2VsZi5kaXNhYmxlZCA9IGZhbHNlO1xuICAgICAgc2VsZi5pc0lmcmFtZUxvYWRlZCA9IHRydWU7XG4gICAgICBpZiAoc2VsZi5pZnJhbWUgJiYgc2VsZi5pZnJhbWUuY29udGVudFdpbmRvdykge1xuICAgICAgICBzZWxmLmlmcmFtZS5jb250ZW50V2luZG93LnBvc3RNZXNzYWdlKGJ1aWxkSW5pdFBheWxvYWQoc2VsZi51c2VyLCBzZWxmLmR5bmFtaWNDb2x1bW5zLCBzZWxmLm9wdGlvbnMsIHNlbGYudXVpZCEpLCBcIipcIik7XG4gICAgICB9XG4gICAgICBpZihzZWxmLm9wZW5Nb2RhbE9uSWZyYW1lTG9hZCkge1xuICAgICAgICBzZWxmLm9wZW5Nb2RhbCgpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuaG9sZGVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgdGhpcy5ob2xkZXIuY2xhc3NMaXN0LmFkZCgnY3N2Ym94LWhvbGRlcicpO1xuICAgIHRoaXMuaG9sZGVyLnNldEF0dHJpYnV0ZSgnaWQnLCBgY3N2Ym94LWVtYmVkLSR7dGhpcy51dWlkfWApO1xuICAgIHRoaXMuaG9sZGVyLmFwcGVuZENoaWxkKGlmcmFtZSk7XG5cbiAgICBkb2N1bWVudC5ib2R5Lmluc2VydEFkamFjZW50RWxlbWVudChcbiAgICAgICdiZWZvcmVlbmQnLCB0aGlzLmhvbGRlclxuICAgICk7XG4gICAgLy8gVGhlIGhvbGRlciBkaWQgbm90IGV4aXN0IHlldCBpZiBvcGVuTW9kYWwoKSBhc2tlZCBmb3IgdGhlIGltcG9ydGVyIGJlZm9yZSBpdCB3YXMgYnVpbHQuXG4gICAgcmVzdGFja09wZW5JbXBvcnRlcnMob3BlbkltcG9ydGVycygpKTtcbiAgfVxuXG4gIG9wZW5Nb2RhbCgpOiB2b2lkIHtcbiAgICAvLyBDb3VudHMgYXMgb3BlbiBmcm9tIHRoZSBtb21lbnQgaXQgaXMgcmVxdWVzdGVkLCBzbyB0aGUgb3RoZXIgYnV0dG9ucyBhcmUgZGlzYWJsZWQgd2hpbGVcbiAgICAvLyB0aGlzIGltcG9ydGVyIGlzIHN0aWxsIGxvYWRpbmcsIGFuZCBzbyBpdCBpcyBzdGFja2VkIGFib3ZlIGFueSBpbXBvcnRlciBvcGVuZWQgZWFybGllci5cbiAgICByZWdpc3Rlck9wZW5JbXBvcnRlcih0aGlzLnJlZ2lzdHJ5RW50cnkpO1xuICAgIGlmKCF0aGlzLmlmcmFtZSkge1xuICAgICAgICB0aGlzLm9wZW5Nb2RhbE9uSWZyYW1lTG9hZCA9IHRydWU7XG4gICAgICAgIHRoaXMuaW5pdEltcG9ydGVyKCk7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYoIXRoaXMuaXNNb2RhbFNob3duKSB7XG4gICAgICBpZih0aGlzLmlzSWZyYW1lTG9hZGVkKSB7XG4gICAgICAgIGlmKHRoaXMucGVuZGluZ0ZpbGUpIHtcbiAgICAgICAgICAvLyBUaGUgaW1wb3J0ZXIgb3BlbnMgaXRzIG93biBtb2RhbCBvbmNlIGl0IGhhcyB0aGUgZmlsZSwgc28gdGhhdCBpdCBjYW4gaW5qZWN0IG9uXG4gICAgICAgICAgLy8gJ3Nob3duLmJzLm1vZGFsJy4gU2VuZGluZyAnb3Blbk1vZGFsJyBhcyB3ZWxsIHdvdWxkIHJhY2UgdGhhdC5cbiAgICAgICAgICAvL1xuICAgICAgICAgIC8vIEl0IGNhbiBhbHNvIGRlY2xpbmU6IHdyb25nIHN0ZXAsIGFuIGltcG9ydCBmaWxlIFVSTCBjb25maWd1cmVkIG9uIHRoZSBzaGVldCwgb3JcbiAgICAgICAgICAvLyBhbiBpbXBvcnRlciB0b28gb2xkIHRvIGtub3cgdGhlIG1lc3NhZ2UgYXQgYWxsLiBTbyB0aGUgaG9sZGVyIGdvZXMgdXBcbiAgICAgICAgICAvLyBjbGljay10aHJvdWdoIGFuZCBzdGF5cyB0aGF0IHdheSB1bnRpbCAnY3N2Ym94LW1vZGFsLXNob3duJyBjb25maXJtcyB0aGUgbW9kYWxcbiAgICAgICAgICAvLyBpcyByZWFsbHkgdXAuIEl0IGNvdmVycyB0aGUgdmlld3BvcnQgYXQgei1pbmRleCAyMTQ3NDgzNjQ3IGFuZCB0aGUgaW1wb3J0ZXJcbiAgICAgICAgICAvLyByZW5kZXJzIHRyYW5zcGFyZW50IHdpdGggaXRzIG1vZGFsIGNsb3NlZCwgc28gYXJtaW5nIGl0IG9uIGFuIHVuYW5zd2VyZWQgbWVzc2FnZVxuICAgICAgICAgIC8vIGxlYXZlcyBhbiBpbnZpc2libGUgc2hlZXQgb3ZlciB0aGUgaG9zdCBwYWdlIGVhdGluZyBldmVyeSBjbGljay5cbiAgICAgICAgICAvL1xuICAgICAgICAgIC8vIGRpc3BsYXk6YmxvY2sgcmVnYXJkbGVzcywgc28gdGhlIGlmcmFtZSBsYXlzIG91dCBhbmQgYW5pbWF0ZXMgbm9ybWFsbHk7IG9ubHlcbiAgICAgICAgICAvLyBwb2ludGVyLWV2ZW50cyBpcyBoZWxkIGJhY2suIGlzTW9kYWxTaG93biBsaWtld2lzZSB3YWl0cyBmb3IgdGhlIGNvbmZpcm1hdGlvbixcbiAgICAgICAgICAvLyBvciBhIGRlY2xpbmVkIGZpbGUgd291bGQgbGF0Y2ggdGhlIGltcG9ydGVyIHNodXQgZm9yIGdvb2QuXG4gICAgICAgICAgaWYodGhpcy5ob2xkZXIpIHtcbiAgICAgICAgICAgIHRoaXMuaG9sZGVyLnN0eWxlLnBvaW50ZXJFdmVudHMgPSAnbm9uZSc7XG4gICAgICAgICAgICB0aGlzLmhvbGRlci5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5maWxlU2VuZGVyLnNlbmQoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmlzTW9kYWxTaG93biA9IHRydWU7XG4gICAgICAgICAgaWYodGhpcy5ob2xkZXIpIHtcbiAgICAgICAgICAgIC8vIEV4cGxpY2l0OiBhIHByZXZpb3VzbHkgZGVjbGluZWQgZmlsZSBsZWF2ZXMgdGhlIGhvbGRlciBjbGljay10aHJvdWdoLlxuICAgICAgICAgICAgdGhpcy5ob2xkZXIuc3R5bGUucG9pbnRlckV2ZW50cyA9ICdhdXRvJztcbiAgICAgICAgICAgIHRoaXMuaG9sZGVyLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZih0aGlzLmlmcmFtZSAmJiB0aGlzLmlmcmFtZS5jb250ZW50V2luZG93KSB7XG4gICAgICAgICAgICB0aGlzLmlmcmFtZS5jb250ZW50V2luZG93LnBvc3RNZXNzYWdlKCdvcGVuTW9kYWwnLCAnKicpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLm9wZW5Nb2RhbE9uSWZyYW1lTG9hZCA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIE9wZW4gdGhlIGltcG9ydGVyIG9uIGEgRmlsZSB0aGUgaG9zdCBwYWdlIGFscmVhZHkgaGFzLCBpbnN0ZWFkIG9mIHRoZSBmaWxlIHBpY2tlci5cbiAgICpcbiAgICogUmVhY2hhYmxlIHRocm91Z2ggYSB0ZW1wbGF0ZSByZWZlcmVuY2UgKGAjaW1wb3J0ZXJgIHRoZW4gYGltcG9ydGVyLm9wZW5Nb2RhbFdpdGhGaWxlKGZpbGUpYClcbiAgICogb3IgYEBWaWV3Q2hpbGQoQ1NWQm94QnV0dG9uQ29tcG9uZW50KWAuXG4gICAqXG4gICAqIFRoZSBGaWxlIGNyb3NzZXMgdG8gdGhlIGlmcmFtZSBieSBzdHJ1Y3R1cmVkIGNsb25lLCBzbyB0aGUgaW1wb3J0ZXIgcmVjZWl2ZXMgdGhlIHJlYWxcbiAgICogb2JqZWN0IGFuZCBhcHBsaWVzIGl0cyBvd24gZXh0ZW5zaW9uLCB3b3Jrc2hlZXQgYW5kIHNpemUgcnVsZXMgdG8gaXQgLS0gdGhpcyBkb2VzIG5vdFxuICAgKiBieXBhc3MgYW55IG9mIHRoZW0uIFBhc3MgYSBGaWxlOyBhIEJsb2IgaGFzIG5vIG5hbWUgZm9yIHRoZSBpbXBvcnRlciB0byByZWFkIGFuXG4gICAqIGV4dGVuc2lvbiBmcm9tLlxuICAgKi9cbiAgb3Blbk1vZGFsV2l0aEZpbGUoZmlsZTogRmlsZSk6IHZvaWQge1xuICAgIGlmKHR5cGVvZiBGaWxlID09PSAndW5kZWZpbmVkJyB8fCAhKGZpbGUgaW5zdGFuY2VvZiBGaWxlKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMucGVuZGluZ0ZpbGUgPSBmaWxlO1xuXG4gICAgLy8gQWxyZWFkeSBvcGVuOiBoYW5kIGl0IG92ZXIgbm93IHJhdGhlciB0aGFuIGhvbGRpbmcgaXQgZm9yIHRoZSBuZXh0IG9wZW4uIFRoZSBpbXBvcnRlclxuICAgIC8vIHRha2VzIGl0IG9ubHkgd2hpbGUgaXQgaXMgc3RpbGwgb24gdGhlIHVwbG9hZCBzdGVwLCBhbmQgaWdub3JlcyBpdCBvbmNlIHRoZSB1c2VyIGhhcyBhXG4gICAgLy8gZGF0YXNldCBhbmQgYSBtYXBwaW5nIGluIHByb2dyZXNzLlxuICAgIGlmKHRoaXMuaXNNb2RhbFNob3duICYmIHRoaXMuaWZyYW1lICYmIHRoaXMuaXNJZnJhbWVMb2FkZWQpIHtcbiAgICAgIHRoaXMuZmlsZVNlbmRlci5zZW5kKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5vcGVuTW9kYWwoKTtcbiAgfVxuXG4gIGNsZWFyUHJvYmVUaW1lcigpOiB2b2lkIHtcbiAgICB0aGlzLmNsZWFyRmlsZUFja1RpbWVyKCk7XG4gICAgdGhpcy5maWxlU2VuZGVyLnJlc2V0KCk7XG4gIH1cblxuICBzdGFydEZpbGVBY2tUaW1lcigpOiB2b2lkIHtcbiAgICB0aGlzLmNsZWFyRmlsZUFja1RpbWVyKCk7XG4gICAgdGhpcy5maWxlQWNrVGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMuZmlsZUFja1RpbWVyID0gbnVsbDtcbiAgICAgIHRoaXMuZ2l2ZVVwT25GaWxlKCk7XG4gICAgfSwgRklMRV9BQ0tfVElNRU9VVF9NUyk7XG4gIH1cblxuICBjbGVhckZpbGVBY2tUaW1lcigpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5maWxlQWNrVGltZXIpIHtcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLmZpbGVBY2tUaW1lcik7XG4gICAgICB0aGlzLmZpbGVBY2tUaW1lciA9IG51bGw7XG4gICAgfVxuICB9XG5cbiAgLy8gVGhlIGltcG9ydGVyIG5ldmVyIGNvbmZpcm1lZCB0aGUgZmlsZSBpdCB3YXMgc2VudCAoYW4gb3JpZ2luIHdlIGRvIG5vdCB0cnVzdCwgb3IgYW4gaW1wb3J0ZXIgdG9vXG4gIC8vIG9sZCB0byBrbm93IHRoZSBtZXNzYWdlKS4gV2l0aG91dCB0aGlzIHRoZSBob2xkZXIgd291bGQgc3RheSB1cCwgaW52aXNpYmxlIGFuZCBjbGljay10aHJvdWdoLFxuICAvLyBhbmQgdGhlIG90aGVyIGluc3RhbmNlcycgYnV0dG9ucyB3b3VsZCBzdGF5IGRpc2FibGVkIGZvciBnb29kLlxuICBnaXZlVXBPbkZpbGUoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaXNNb2RhbFNob3duKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGhvbGRlciA9IHRoaXMuaG9sZGVyO1xuICAgIGlmIChob2xkZXIpIHtcbiAgICAgIGhvbGRlci5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgICAgaG9sZGVyLnN0eWxlLnBvaW50ZXJFdmVudHMgPSAnYXV0byc7XG4gICAgfVxuICAgIHVucmVnaXN0ZXJPcGVuSW1wb3J0ZXIodGhpcy5yZWdpc3RyeUVudHJ5KTtcbiAgICBjb25zb2xlLndhcm4oXCJbY3N2Ym94XSB0aGUgaW1wb3J0ZXIgZGlkIG5vdCByZXNwb25kIHRvIHRoZSBzdXBwbGllZCBmaWxlXCIpO1xuICB9XG5cbiAgcHJpdmF0ZSBzeW5jQmxvY2tlZCgpOiB2b2lkIHtcbiAgICBjb25zdCBibG9ja2VkID0gaXNCbG9ja2VkQnlPcGVuSW1wb3J0ZXIodGhpcy5yZWdpc3RyeUVudHJ5KTtcbiAgICBpZiAoYmxvY2tlZCAhPT0gdGhpcy5ibG9ja2VkQnlPdGhlcikge1xuICAgICAgLy8gVGhlIHJlZ2lzdHJ5IGNhbiBjYWxsIGJhY2sgZnJvbSBvdXRzaWRlIEFuZ3VsYXIncyB6b25lIChhbm90aGVyIGluc3RhbmNlLCBhbm90aGVyIGFwcCkuXG4gICAgICB0aGlzLnpvbmUucnVuKCgpID0+IHtcbiAgICAgICAgdGhpcy5ibG9ja2VkQnlPdGhlciA9IGJsb2NrZWQ7XG4gICAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5jbGVhclByb2JlVGltZXIoKTtcbiAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihcIm1lc3NhZ2VcIiwgdGhpcy5tZXNzYWdlTGlzdGVuZXIpO1xuICAgIHVucmVnaXN0ZXJPcGVuSW1wb3J0ZXIodGhpcy5yZWdpc3RyeUVudHJ5KTtcbiAgICBpZiAodGhpcy51bnN1YnNjcmliZU9wZW5JbXBvcnRlcnMpIHtcbiAgICAgIHRoaXMudW5zdWJzY3JpYmVPcGVuSW1wb3J0ZXJzKCk7XG4gICAgICB0aGlzLnVuc3Vic2NyaWJlT3BlbkltcG9ydGVycyA9IG51bGw7XG4gICAgfVxuICB9XG59XG4iXX0=