nuxeo-development-framework 4.5.3 → 4.5.5

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,14 +1,14 @@
1
- import { __awaiter } from "tslib";
2
- import { Component, EventEmitter, Inject, Input, Output, ViewChild, } from '@angular/core';
1
+ var _PdftronComponent_instances, _PdftronComponent_updateSilentPdfTron, _PdftronComponent_afterLoadWebViewer, _PdftronComponent_docLoaded, _PdftronComponent_reset;
2
+ import { __awaiter, __classPrivateFieldGet } from "tslib";
3
+ import { Component, EventEmitter, Inject, Input, Output, ViewChild } from '@angular/core';
3
4
  import WebViewer from '@pdftron/webviewer';
4
5
  import { APP_BASE_HREF } from '@angular/common';
5
6
  import { SecurePipe } from '../../../pipes/secure.pipe';
6
7
  import * as i0 from "@angular/core";
7
8
  import * as i1 from "./pdftron.service";
8
9
  import * as i2 from "../../../core/services/nuxeo/nuxeo.service";
9
- import * as i3 from "../../../pipes/secure.pipe";
10
- import * as i4 from "../../../core/services/translation/translation.service";
11
- import * as i5 from "../../custom-toastr/services/custom-toastr.service";
10
+ import * as i3 from "../../../core/services/translation/translation.service";
11
+ import * as i4 from "./silent-pdftron.service";
12
12
  /**
13
13
  * A reusable file viewer based on PDFTron Library
14
14
  * @title
@@ -23,15 +23,15 @@ import * as i5 from "../../custom-toastr/services/custom-toastr.service";
23
23
  * </app-pdftron>
24
24
  */
25
25
  export class PdftronComponent {
26
- constructor(cdr, pdftronService, nuxeo, baseHref, securePipe, translationService, toaster, environment) {
26
+ constructor(cdr, pdftronService, nuxeo, baseHref, translationService, silentPdfTronService, environment) {
27
27
  this.cdr = cdr;
28
28
  this.pdftronService = pdftronService;
29
29
  this.nuxeo = nuxeo;
30
30
  this.baseHref = baseHref;
31
- this.securePipe = securePipe;
32
31
  this.translationService = translationService;
33
- this.toaster = toaster;
32
+ this.silentPdfTronService = silentPdfTronService;
34
33
  this.environment = environment;
34
+ _PdftronComponent_instances.add(this);
35
35
  this.actionClicked = false; // used to know if there is action clicked outside to start edit mode or not
36
36
  this.DOCUMENT_TYPE = 'application/pdf';
37
37
  this.fitMode = 'FitWidth';
@@ -46,8 +46,18 @@ export class PdftronComponent {
46
46
  this.events = new EventEmitter();
47
47
  this.SignatureEvent = new EventEmitter(); // used to export signature to outside
48
48
  this.firstTimeLoad = true; //flage to control importing signatures in the first time load only
49
- this.firstSignatureLoad = true; // flage to pass first load of imported signatures without emitting the event
49
+ this.firstSignatureLoad = true; // flage to pass first load of imported signatures without emitting the event
50
50
  this.newSignCreation = false; // flage to indicate signature creation is created or choosed from stored ones
51
+ _PdftronComponent_docLoaded.set(this, () => {
52
+ let fitMode = this.webViewerInstance.FitMode.FitWidth;
53
+ if (this.fitMode === 'FitPage') {
54
+ fitMode = this.webViewerInstance.FitMode.FitPage;
55
+ }
56
+ else if (this.fitMode === 'Zoom') {
57
+ fitMode = this.webViewerInstance.FitMode.Zoom;
58
+ }
59
+ this.webViewerInstance.setFitMode(fitMode);
60
+ });
51
61
  this.savedAnotations = [];
52
62
  this.fileWithOcr = false;
53
63
  this.newAnnotations = [];
@@ -56,7 +66,7 @@ export class PdftronComponent {
56
66
  this.searchFn = (searchValue, options) => {
57
67
  this.mySearchStringResults = [];
58
68
  if (this.savedAnotations.length > 0) {
59
- this.savedAnotations.map(annotation => {
69
+ this.savedAnotations.map((annotation) => {
60
70
  annotation.Hidden = true;
61
71
  // Always redraw annotation if rendering was updated
62
72
  this.webViewerInstance.annotManager.redrawAnnotation(annotation);
@@ -73,13 +83,13 @@ export class PdftronComponent {
73
83
  this.pages.pages.forEach((page, index) => {
74
84
  this.pageHeight = page.page_height;
75
85
  this.pageWidth = page.page_width;
76
- this.standardHeight = this.webViewerInstance.docViewer.getPageHeight((index + 1));
77
- this.standardWidth = this.webViewerInstance.docViewer.getPageWidth((index + 1));
78
- page.zones.forEach(zone => {
79
- zone.paragraphs.forEach(paragraph => {
80
- paragraph.lines.forEach(line => {
86
+ this.standardHeight = this.webViewerInstance.docViewer.getPageHeight(index + 1);
87
+ this.standardWidth = this.webViewerInstance.docViewer.getPageWidth(index + 1);
88
+ page.zones.forEach((zone) => {
89
+ zone.paragraphs.forEach((paragraph) => {
90
+ paragraph.lines.forEach((line) => {
81
91
  if (line.text.includes(searchValue)) {
82
- this.SearchForWordInLine(mySearch, line, (index + 1), page);
92
+ this.SearchForWordInLine(mySearch, line, index + 1, page);
83
93
  }
84
94
  });
85
95
  });
@@ -87,7 +97,7 @@ export class PdftronComponent {
87
97
  });
88
98
  }
89
99
  else {
90
- // then i am searching with only one word
100
+ // then i am searching with only one word
91
101
  this.searchForWordInAllPages(searchValue);
92
102
  }
93
103
  this.webViewerInstance.docViewer.clearSearchResults();
@@ -101,69 +111,44 @@ export class PdftronComponent {
101
111
  }
102
112
  ngOnInit() {
103
113
  return __awaiter(this, void 0, void 0, function* () {
104
- this.transelationSubscrition = this.translationService.isArabic.subscribe(res => {
114
+ this.transelationSubscrition = this.translationService.isArabic.subscribe((res) => {
105
115
  this.isArabic = res;
106
116
  });
107
- });
108
- }
109
- ngAfterViewInit() {
110
- return __awaiter(this, void 0, void 0, function* () {
111
117
  this.recivedSearchStringsArray = this.searchString.trim() ? this.searchString.split(',') : [];
112
118
  if (this.fileTitle) {
113
119
  if (this.fileTitle.endsWith('.ppt')) {
114
120
  this.DOCUMENT_TYPE = 'application/vnd.ms-powerpoint';
115
121
  }
116
122
  else if (this.fileTitle.endsWith('.pptx')) {
117
- this.DOCUMENT_TYPE =
118
- 'application/vnd.openxmlformats-officedocument.presentationml.presentation';
123
+ this.DOCUMENT_TYPE = 'application/vnd.openxmlformats-officedocument.presentationml.presentation';
119
124
  }
120
125
  else if (this.fileTitle.endsWith('.doc')) {
121
126
  this.DOCUMENT_TYPE = 'application/msword';
122
127
  }
123
128
  else if (this.fileTitle.endsWith('.docx')) {
124
- this.DOCUMENT_TYPE =
125
- 'application/vnd.openxmlformats-officedocument.wordprocessingml.document';
129
+ this.DOCUMENT_TYPE = 'application/vnd.openxmlformats-officedocument.wordprocessingml.document';
126
130
  }
131
+ }
132
+ if (this.silentPdfTronService.isEnabled) {
133
+ [this.silentPdfTron, this.webViewerInstance] = yield this.silentPdfTronService.getWebViewer();
134
+ __classPrivateFieldGet(this, _PdftronComponent_instances, "m", _PdftronComponent_afterLoadWebViewer).call(this, this.webViewerInstance);
135
+ this.resizeObserver = new ResizeObserver(() => __classPrivateFieldGet(this, _PdftronComponent_instances, "m", _PdftronComponent_updateSilentPdfTron).call(this));
136
+ this.resizeObserver.observe(this.viewerRef.nativeElement);
137
+ __classPrivateFieldGet(this, _PdftronComponent_instances, "m", _PdftronComponent_updateSilentPdfTron).call(this);
138
+ }
139
+ else {
127
140
  WebViewer({
128
141
  path: this.baseHref + '/assets/pdftrons',
129
142
  forceClientSideInit: true,
130
143
  streaming: true,
131
144
  licenseKey: this.environment.pdftronLicenceKey,
132
- css: this.isArabic ? (this.baseHref + '/assets/styles/ar-mypdftron.css') : (this.baseHref + '/assets/styles/en-mypdftron.css'),
145
+ css: this.isArabic
146
+ ? this.baseHref + '/assets/styles/ar-mypdftron.css'
147
+ : this.baseHref + '/assets/styles/en-mypdftron.css',
133
148
  annotationUser: this.nuxeo.nuxeoClient.user.properties.firstName + ' ' + this.nuxeo.nuxeoClient.user.properties.lastName,
134
- disabledElements: ['downloadButton', 'printButton'],
149
+ disabledElements: ['downloadButton', 'printButton']
135
150
  }, this.viewerRef.nativeElement).then((instance) => __awaiter(this, void 0, void 0, function* () {
136
- this.isArabic ? instance.setLanguage('ar') : instance.setLanguage('en');
137
- this.pdftronService.instance = this.webViewerInstance = instance;
138
- if (this.correspondance.facets.indexOf('ctocr') > -1) {
139
- this.fileWithOcr = true;
140
- this.pages = JSON.parse(this.correspondance.properties['ctocr:recognizedJson']);
141
- // override search funtion to use our search in ocr not defult search
142
- instance.overrideSearchExecution(this.searchFn);
143
- }
144
- else {
145
- // if no ocr then add search lisner to lisne to internal search and catch results
146
- this.addSearchListner();
147
- }
148
- this.addPrintButton();
149
- this.addDownloadButton();
150
- this.importSignature();
151
- this.exportingSignature();
152
- this.deleteAnnotation();
153
- this.exportingSavedSignature();
154
- if (this.useOutsideAnotations) {
155
- this.importAnotationsFromOutside();
156
- this.exportAnotationsToOutside();
157
- }
158
- this.webViewerInstance.docViewer.setSearchHighlightColors({
159
- // setSearchHighlightColors accepts both Annotations.Color objects or 'rgba' strings
160
- searchResult: new this.webViewerInstance.Annotations.Color(250, 206, 0, 0.50196),
161
- activeSearchResult: new this.webViewerInstance.Annotations.Color(250, 206, 0, 0.50196),
162
- });
163
- if (this.recivedSearchStringsArray.length !== 0) {
164
- this.automaticSearch(this.recivedSearchStringsArray);
165
- }
166
- this.loadDocument();
151
+ __classPrivateFieldGet(this, _PdftronComponent_instances, "m", _PdftronComponent_afterLoadWebViewer).call(this, instance);
167
152
  }));
168
153
  }
169
154
  });
@@ -184,7 +169,7 @@ export class PdftronComponent {
184
169
  this.webViewerInstance.annotManager.on('annotationChanged', (annotations, action, { imported }) => {
185
170
  if (imported)
186
171
  return;
187
- this.webViewerInstance.annotManager.exportAnnotations().then(exctractedAnotations => {
172
+ this.webViewerInstance.annotManager.exportAnnotations().then((exctractedAnotations) => {
188
173
  this.onAddingAnotation.emit(exctractedAnotations);
189
174
  });
190
175
  // if tracking signature location is enable then emit signature outside with every changes in it
@@ -213,7 +198,6 @@ export class PdftronComponent {
213
198
  }
214
199
  this.firstSignatureLoad = false;
215
200
  });
216
- ;
217
201
  }
218
202
  exportingSignature() {
219
203
  const documentViewer = this.webViewerInstance.docViewer;
@@ -225,11 +209,10 @@ export class PdftronComponent {
225
209
  console.log(annotation);
226
210
  }
227
211
  });
228
- ;
229
212
  }
230
213
  extractAnotation(annotation, documentViewer) {
231
214
  if (annotation['image']) {
232
- // convert base64 signature into file and emit it to out side
215
+ // convert base64 signature into file and emit it to out side
233
216
  let base64Img = annotation['image']['currentSrc'];
234
217
  var arr = base64Img.split(','), mime = arr[0].match(/:(.*?);/)[1], bstr = atob(arr[1]), n = bstr.length, u8arr = new Uint8Array(n);
235
218
  while (n--) {
@@ -276,7 +259,10 @@ export class PdftronComponent {
276
259
  });
277
260
  }
278
261
  addDownloadButton() {
279
- if (this.allowDownloadSecretFile || (!this.allowDownloadSecretFile && this.correspondance.properties[this.secrecyProperty] && this.correspondance.properties[this.secrecyProperty] === 'Normal')) {
262
+ if (this.allowDownloadSecretFile ||
263
+ (!this.allowDownloadSecretFile &&
264
+ this.correspondance.properties[this.secrecyProperty] &&
265
+ this.correspondance.properties[this.secrecyProperty] === 'Normal')) {
280
266
  this.webViewerInstance.setHeaderItems((header) => {
281
267
  header.push({
282
268
  type: 'actionButton',
@@ -309,29 +295,30 @@ export class PdftronComponent {
309
295
  // this.events.next('download');
310
296
  // });
311
297
  // }
312
- }),
298
+ })
313
299
  });
314
300
  });
315
301
  }
316
302
  }
317
303
  addPrintButton() {
318
- if (this.allowPrintSecretFile || (!this.allowPrintSecretFile && this.correspondance.properties[this.secrecyProperty] && this.correspondance.properties[this.secrecyProperty] === 'Normal')) {
304
+ if (this.allowPrintSecretFile ||
305
+ (!this.allowPrintSecretFile &&
306
+ this.correspondance.properties[this.secrecyProperty] &&
307
+ this.correspondance.properties[this.secrecyProperty] === 'Normal')) {
319
308
  this.webViewerInstance.setHeaderItems((header) => {
320
309
  header.push({
321
310
  type: 'actionButton',
322
311
  img: '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><defs><style>.cls-1{fill:#abb0c4;}</style></defs><title>icon - header - print - line</title><path class="cls-1" d="M20,6H18V2H6V6H4A2,2,0,0,0,2,8v9a2,2,0,0,0,2,2H6v3H18V19h2a2,2,0,0,0,2-2V8A2,2,0,0,0,20,6ZM8,4h8V6H8Zm8,16H8V16h8Zm4-3H18V14H6v3H4V8H20Zm-4-7h2v2H16Zm-3,0h2v2H13Z"></path></svg>',
323
- title: this.isArabic ? "طباعة" : 'Print',
312
+ title: this.isArabic ? 'طباعة' : 'Print',
324
313
  onClick: () => {
325
314
  this.pdftronService.instance.print();
326
315
  this.events.next('print');
327
- },
316
+ }
328
317
  });
329
318
  });
330
319
  }
331
320
  else {
332
- this.webViewerInstance.disableElements([
333
- 'printModal',
334
- ]);
321
+ this.webViewerInstance.disableElements(['printModal']);
335
322
  }
336
323
  }
337
324
  addWatermark() {
@@ -347,16 +334,7 @@ export class PdftronComponent {
347
334
  return;
348
335
  }
349
336
  const { docViewer, annotManager, Annotations } = this.webViewerInstance;
350
- docViewer.on('documentLoaded', () => {
351
- let fitMode = this.webViewerInstance.FitMode.FitWidth;
352
- if (this.fitMode === 'FitPage') {
353
- fitMode = this.webViewerInstance.FitMode.FitPage;
354
- }
355
- else if (this.fitMode === 'Zoom') {
356
- fitMode = this.webViewerInstance.FitMode.Zoom;
357
- }
358
- this.webViewerInstance.setFitMode(fitMode);
359
- });
337
+ docViewer.on('documentLoaded', __classPrivateFieldGet(this, _PdftronComponent_docLoaded, "f"));
360
338
  if (!this.editMode) {
361
339
  this.webViewerInstance.annotManager.setReadOnly(true);
362
340
  // instance.enableTools([]);
@@ -365,24 +343,25 @@ export class PdftronComponent {
365
343
  this.webViewerInstance.loadDocument(this.fileURL, {
366
344
  xodstreaming: true,
367
345
  customHeaders: {
368
- Authorization: this.authHeader,
369
- },
346
+ Authorization: this.authHeader
347
+ }
370
348
  // withCredentials: true,
371
349
  });
372
350
  }
373
351
  else {
374
352
  this.webViewerInstance.loadDocument(new Blob([new Uint8Array(this.fileData)], { type: this.DOCUMENT_TYPE }), {
375
- filename: this.fileTitle,
353
+ filename: this.fileTitle
376
354
  });
377
355
  }
378
356
  this.isFetching = false;
379
357
  // if not negelcting adding water mark then check conditions for adding it
380
358
  if (!this.negelectAddingWaterMark) {
381
359
  if (this.correspondance !== undefined) {
382
- // if we need to check on secrecy level for adding water mark or not
360
+ // if we need to check on secrecy level for adding water mark or not
383
361
  if (this.environment.enableViewerWaterMark && this.secrecyProperty) {
384
362
  // check for secrecy level befor adding watermark
385
- if (this.correspondance.properties[this.secrecyProperty] && this.correspondance.properties[this.secrecyProperty] !== 'Normal') {
363
+ if (this.correspondance.properties[this.secrecyProperty] &&
364
+ this.correspondance.properties[this.secrecyProperty] !== 'Normal') {
386
365
  this.addWatermark();
387
366
  }
388
367
  }
@@ -399,7 +378,7 @@ export class PdftronComponent {
399
378
  const xfdfString = yield this.webViewerInstance.annotManager.exportAnnotations();
400
379
  const data = yield doc.getFileData({
401
380
  // saves the document with annotations in it
402
- xfdfString,
381
+ xfdfString
403
382
  });
404
383
  const arr = new Uint8Array(data);
405
384
  const blob = new Blob([arr], { type: this.DOCUMENT_TYPE });
@@ -413,7 +392,7 @@ export class PdftronComponent {
413
392
  'toolbarGroup-Shapes',
414
393
  'toolbarGroup-Edit',
415
394
  'toolbarGroup-Insert',
416
- 'toolbarGroup-Annotate',
395
+ 'toolbarGroup-Annotate'
417
396
  ]);
418
397
  this.webViewerInstance.annotManager.setReadOnly(true);
419
398
  }
@@ -424,20 +403,14 @@ export class PdftronComponent {
424
403
  'toolbarGroup-Shapes',
425
404
  'toolbarGroup-Edit',
426
405
  'toolbarGroup-Insert',
427
- 'toolbarGroup-Annotate',
406
+ 'toolbarGroup-Annotate'
428
407
  ]);
429
408
  let group;
430
409
  if (this.editingType === 'signDoc') {
431
- this.webViewerInstance.enableElements([
432
- 'toolbarGroup-Insert'
433
- ]);
410
+ this.webViewerInstance.enableElements(['toolbarGroup-Insert']);
434
411
  }
435
412
  else if (this.editingType === 'annotate') {
436
- this.webViewerInstance.enableElements([
437
- 'toolbarGroup-Shapes',
438
- 'toolbarGroup-Edit',
439
- 'toolbarGroup-Annotate',
440
- ]);
413
+ this.webViewerInstance.enableElements(['toolbarGroup-Shapes', 'toolbarGroup-Edit', 'toolbarGroup-Annotate']);
441
414
  }
442
415
  }
443
416
  else {
@@ -445,7 +418,7 @@ export class PdftronComponent {
445
418
  'toolbarGroup-Shapes',
446
419
  'toolbarGroup-Edit',
447
420
  'toolbarGroup-Insert',
448
- 'toolbarGroup-Annotate',
421
+ 'toolbarGroup-Annotate'
449
422
  ]);
450
423
  }
451
424
  this.webViewerInstance.annotManager.setReadOnly(false);
@@ -457,11 +430,9 @@ export class PdftronComponent {
457
430
  this.toggleEdit();
458
431
  if (changes.urlFileContent &&
459
432
  changes.urlFileContent.previousValue &&
460
- changes.urlFileContent.previousValue !==
461
- changes.urlFileContent.currentValue) {
433
+ changes.urlFileContent.previousValue !== changes.urlFileContent.currentValue) {
462
434
  this.ngOnDestroy();
463
435
  this.ngOnInit();
464
- this.ngAfterViewInit();
465
436
  }
466
437
  }
467
438
  }
@@ -477,7 +448,7 @@ export class PdftronComponent {
477
448
  const searchListener = (searchPattern, options, results) => {
478
449
  this.mySearchStringResults = [];
479
450
  if (this.savedAnotations.length > 0) {
480
- this.savedAnotations.map(annotation => {
451
+ this.savedAnotations.map((annotation) => {
481
452
  annotation.Hidden = true;
482
453
  // Always redraw annotation if rendering was updated
483
454
  annotManager.redrawAnnotation(annotation);
@@ -486,9 +457,9 @@ export class PdftronComponent {
486
457
  // don't do any search until there is a search pattern
487
458
  if (searchPattern.trim().length > 0) {
488
459
  // add redaction annotation for each search result
489
- this.newAnnotations = results.map(result => {
460
+ this.newAnnotations = results.map((result) => {
490
461
  const annotation = new Annotations.TextHighlightAnnotation();
491
- annotation.Quads = result.quads.map(quad => quad.getPoints());
462
+ annotation.Quads = result.quads.map((quad) => quad.getPoints());
492
463
  annotation.PageNumber = result.pageNum;
493
464
  annotation.StrokeColor = new Annotations.Color(250, 206, 0, 0.50196);
494
465
  annotation.Author = this.webViewerInstance.annotManager.getCurrentUser();
@@ -506,31 +477,33 @@ export class PdftronComponent {
506
477
  this.webViewerInstance.addSearchListener(searchListener);
507
478
  });
508
479
  }
509
- // perform automatic search when intering the page
480
+ // perform automatic search when intering the page
510
481
  automaticSearch(searchTextArray) {
511
482
  const { annotManager, docViewer, Annotations } = this.webViewerInstance;
512
483
  let searchOptions;
513
484
  this.webViewerInstance.openElements(['searchPanel']);
514
485
  docViewer.on('documentLoaded', () => {
515
- const mode = this.webViewerInstance.CoreControls.Search.Mode.PAGE_STOP | this.webViewerInstance.CoreControls.Search.Mode.HIGHLIGHT | this.webViewerInstance.CoreControls.Search.Mode.AMBIENT_STRING;
486
+ const mode = this.webViewerInstance.CoreControls.Search.Mode.PAGE_STOP |
487
+ this.webViewerInstance.CoreControls.Search.Mode.HIGHLIGHT |
488
+ this.webViewerInstance.CoreControls.Search.Mode.AMBIENT_STRING;
516
489
  this.mySearchStringResults = []; // empty my search result when starting new search
517
490
  if (this.fileWithOcr) {
518
491
  // add redaction annotation for each search result
519
492
  const annotation = new Annotations.TextHighlightAnnotation();
520
- searchTextArray.map(searchText => {
493
+ searchTextArray.map((searchText) => {
521
494
  let mySearch = searchText.split(' ');
522
495
  if (mySearch.length > 1) {
523
496
  // then i am searching with more than one word
524
497
  this.pages.pages.forEach((page, index) => {
525
498
  this.pageHeight = page.page_height;
526
499
  this.pageWidth = page.page_width;
527
- this.standardHeight = this.webViewerInstance.docViewer.getPageHeight((index + 1));
528
- this.standardWidth = this.webViewerInstance.docViewer.getPageWidth((index + 1));
529
- page.zones.forEach(zone => {
530
- zone.paragraphs.forEach(paragraph => {
531
- paragraph.lines.forEach(line => {
500
+ this.standardHeight = this.webViewerInstance.docViewer.getPageHeight(index + 1);
501
+ this.standardWidth = this.webViewerInstance.docViewer.getPageWidth(index + 1);
502
+ page.zones.forEach((zone) => {
503
+ zone.paragraphs.forEach((paragraph) => {
504
+ paragraph.lines.forEach((line) => {
532
505
  if (line.text.includes(searchText)) {
533
- this.SearchForWordInLine(mySearch, line, (index + 1), page);
506
+ this.SearchForWordInLine(mySearch, line, index + 1, page);
534
507
  }
535
508
  });
536
509
  });
@@ -538,7 +511,7 @@ export class PdftronComponent {
538
511
  });
539
512
  }
540
513
  else {
541
- // then i am searching with only one word
514
+ // then i am searching with only one word
542
515
  this.searchForWordInAllPages(searchText);
543
516
  }
544
517
  });
@@ -550,11 +523,11 @@ export class PdftronComponent {
550
523
  // If true, a search of the entire document will be performed. Otherwise, a single search will be performed.
551
524
  fullSearch: true,
552
525
  // The callback function that is called when the search returns a result.
553
- onResult: result => {
526
+ onResult: (result) => {
554
527
  // with 'PAGE_STOP' mode, the callback is invoked after each page has been searched.
555
528
  if (result.resultCode === this.webViewerInstance.CoreControls.Search.ResultCode.FOUND) {
556
529
  const annotation = new Annotations.TextHighlightAnnotation();
557
- annotation.Quads = result.quads.map(quad => quad.getPoints());
530
+ annotation.Quads = result.quads.map((quad) => quad.getPoints());
558
531
  console.log(annotation.Quads);
559
532
  annotation.PageNumber = result.pageNum;
560
533
  annotation.StrokeColor = new Annotations.Color(250, 206, 0, 0.50196);
@@ -566,37 +539,39 @@ export class PdftronComponent {
566
539
  }
567
540
  }
568
541
  };
569
- searchTextArray.map(searchedText => {
542
+ searchTextArray.map((searchedText) => {
570
543
  docViewer.textSearchInit(searchedText, mode, searchOptions);
571
544
  });
572
545
  }
573
546
  });
574
547
  }
575
- // search for single word in all pages
548
+ // search for single word in all pages
576
549
  searchForWordInAllPages(searchedWord) {
577
550
  this.pages.pages.forEach((page, index) => {
578
551
  this.pageHeight = page.page_height;
579
552
  this.pageWidth = page.page_width;
580
- this.standardHeight = this.webViewerInstance.docViewer.getPageHeight((index + 1));
581
- this.standardWidth = this.webViewerInstance.docViewer.getPageWidth((index + 1));
582
- const x = (this.pageWidth / this.standardWidth); // width ratio
583
- const y = (this.pageHeight / this.standardHeight); // height ratio
584
- page.zones.forEach(zone => {
585
- zone.paragraphs.forEach(paragraph => {
586
- paragraph.lines.forEach(line => {
587
- line.words.forEach(word => {
553
+ this.standardHeight = this.webViewerInstance.docViewer.getPageHeight(index + 1);
554
+ this.standardWidth = this.webViewerInstance.docViewer.getPageWidth(index + 1);
555
+ const x = this.pageWidth / this.standardWidth; // width ratio
556
+ const y = this.pageHeight / this.standardHeight; // height ratio
557
+ page.zones.forEach((zone) => {
558
+ zone.paragraphs.forEach((paragraph) => {
559
+ paragraph.lines.forEach((line) => {
560
+ line.words.forEach((word) => {
588
561
  if (word.text.includes(searchedWord)) {
589
562
  // annotation.PageNumber = index+1;
590
- let quads = [{
591
- x1: (word.coordinates.upper_left.x / x),
592
- x2: (word.coordinates.bottom_right.x / x),
593
- x3: (word.coordinates.bottom_right.x / x),
594
- x4: (word.coordinates.upper_left.x / x),
595
- y1: (word.coordinates.upper_left.y / y),
596
- y2: (word.coordinates.upper_left.y / y),
597
- y3: (word.coordinates.bottom_right.y / y),
598
- y4: (word.coordinates.bottom_right.y / y),
599
- }];
563
+ let quads = [
564
+ {
565
+ x1: word.coordinates.upper_left.x / x,
566
+ x2: word.coordinates.bottom_right.x / x,
567
+ x3: word.coordinates.bottom_right.x / x,
568
+ x4: word.coordinates.upper_left.x / x,
569
+ y1: word.coordinates.upper_left.y / y,
570
+ y2: word.coordinates.upper_left.y / y,
571
+ y3: word.coordinates.bottom_right.y / y,
572
+ y4: word.coordinates.bottom_right.y / y
573
+ }
574
+ ];
600
575
  this.higlightText(quads, index + 1);
601
576
  this.constructSearchResult(searchedWord, index + 1, quads, line.text);
602
577
  }
@@ -606,14 +581,14 @@ export class PdftronComponent {
606
581
  });
607
582
  });
608
583
  }
609
- // search for word in single line
584
+ // search for word in single line
610
585
  SearchForWordInLine(listOfSearchedWords, line, pagenumber, page) {
611
586
  this.pageHeight = page.page_height;
612
587
  this.pageWidth = page.page_width;
613
- this.standardHeight = this.webViewerInstance.docViewer.getPageHeight((pagenumber));
614
- this.standardWidth = this.webViewerInstance.docViewer.getPageWidth((pagenumber));
615
- const x = (this.pageWidth / this.standardWidth); // width ratio
616
- const y = (this.pageHeight / this.standardHeight); // height ratio
588
+ this.standardHeight = this.webViewerInstance.docViewer.getPageHeight(pagenumber);
589
+ this.standardWidth = this.webViewerInstance.docViewer.getPageWidth(pagenumber);
590
+ const x = this.pageWidth / this.standardWidth; // width ratio
591
+ const y = this.pageHeight / this.standardHeight; // height ratio
617
592
  // find only words related to my search form the line
618
593
  let myFoundedResults = [];
619
594
  let correctResults = [];
@@ -624,27 +599,29 @@ export class PdftronComponent {
624
599
  });
625
600
  // find only words exist in my search sentence and not single and repeated word
626
601
  myFoundedResults.map((result, index) => {
627
- if ((myFoundedResults[index]['wordIndex'] - 1 === (myFoundedResults[index - 1] && myFoundedResults[index - 1]['wordIndex'])) ||
628
- (myFoundedResults[index + 1] && (myFoundedResults[index + 1]['wordIndex'] - 1 === myFoundedResults[index]['wordIndex']))) {
602
+ if (myFoundedResults[index]['wordIndex'] - 1 ===
603
+ (myFoundedResults[index - 1] && myFoundedResults[index - 1]['wordIndex']) ||
604
+ (myFoundedResults[index + 1] &&
605
+ myFoundedResults[index + 1]['wordIndex'] - 1 === myFoundedResults[index]['wordIndex'])) {
629
606
  correctResults.push(result);
630
607
  }
631
608
  });
632
609
  // highliht these words after eleminating all repeated and related words
633
610
  // must be for loop sp i can control the step in each loop
634
611
  let quads = [];
635
- for (let i = 0; i < correctResults.length; (i = i + listOfSearchedWords.length)) {
612
+ for (let i = 0; i < correctResults.length; i = i + listOfSearchedWords.length) {
636
613
  quads.push({
637
- x1: (correctResults[((i + listOfSearchedWords.length) - 1)].word.coordinates.upper_left.x / x),
638
- x2: (correctResults[i].word.coordinates.bottom_right.x / x),
639
- x3: (correctResults[i].word.coordinates.bottom_right.x / x),
640
- x4: (correctResults[((i + listOfSearchedWords.length) - 1)].word.coordinates.upper_left.x / x),
641
- y1: (correctResults[i].word.coordinates.upper_left.y / y),
642
- y2: (correctResults[((i + listOfSearchedWords.length) - 1)].word.coordinates.upper_left.y / y),
643
- y3: (correctResults[((i + listOfSearchedWords.length) - 1)].word.coordinates.bottom_right.y / y),
644
- y4: (correctResults[i].word.coordinates.bottom_right.y / y),
614
+ x1: correctResults[i + listOfSearchedWords.length - 1].word.coordinates.upper_left.x / x,
615
+ x2: correctResults[i].word.coordinates.bottom_right.x / x,
616
+ x3: correctResults[i].word.coordinates.bottom_right.x / x,
617
+ x4: correctResults[i + listOfSearchedWords.length - 1].word.coordinates.upper_left.x / x,
618
+ y1: correctResults[i].word.coordinates.upper_left.y / y,
619
+ y2: correctResults[i + listOfSearchedWords.length - 1].word.coordinates.upper_left.y / y,
620
+ y3: correctResults[i + listOfSearchedWords.length - 1].word.coordinates.bottom_right.y / y,
621
+ y4: correctResults[i].word.coordinates.bottom_right.y / y
645
622
  });
646
623
  this.higlightText(quads, pagenumber);
647
- this.constructSearchResult(listOfSearchedWords.join(" "), pagenumber, quads, line.text);
624
+ this.constructSearchResult(listOfSearchedWords.join(' '), pagenumber, quads, line.text);
648
625
  }
649
626
  }
650
627
  constructSearchResult(searchedText, pageNum, quads, line) {
@@ -657,7 +634,8 @@ export class PdftronComponent {
657
634
  resultStrEnd: mySeearchedTextEndIndex,
658
635
  pageNum: pageNum,
659
636
  resultCode: 2,
660
- quads: [{
637
+ quads: [
638
+ {
661
639
  ea: quads[0]['y3'],
662
640
  fa: quads[0]['y4'],
663
641
  ha: quads[0]['x1'],
@@ -666,7 +644,8 @@ export class PdftronComponent {
666
644
  qB: quads[0]['x4'],
667
645
  rB: quads[0]['y1'],
668
646
  sB: quads[0]['y2']
669
- }]
647
+ }
648
+ ]
670
649
  };
671
650
  this.mySearchStringResults.push(searchResultObject);
672
651
  console.log(this.mySearchStringResults);
@@ -690,34 +669,97 @@ export class PdftronComponent {
690
669
  }
691
670
  // ------------------------------------------------------------------------ ------------------------------------------
692
671
  ngOnDestroy() {
693
- if (this.webViewerInstance) {
694
- this.webViewerInstance.closeDocument().then(() => {
695
- console.log('document closed!');
696
- });
697
- this.pdftronService.instance = this.webViewerInstance = null;
672
+ if (this.silentPdfTronService.isEnabled) {
673
+ __classPrivateFieldGet(this, _PdftronComponent_instances, "m", _PdftronComponent_reset).call(this);
674
+ }
675
+ else {
676
+ if (this.webViewerInstance) {
677
+ this.webViewerInstance.closeDocument().then(() => {
678
+ console.log('document closed!');
679
+ });
680
+ this.pdftronService.instance = this.webViewerInstance = null;
681
+ }
682
+ this.transelationSubscrition ? this.transelationSubscrition.unsubscribe() : null;
698
683
  }
699
- this.transelationSubscrition ? this.transelationSubscrition.unsubscribe() : null;
700
684
  }
701
685
  }
702
- PdftronComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: PdftronComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: i1.PdftronService }, { token: i2.NuxeoService }, { token: APP_BASE_HREF }, { token: i3.SecurePipe }, { token: i4.TranslationService }, { token: i5.CustomToastrService }, { token: 'environment' }], target: i0.ɵɵFactoryTarget.Component });
703
- PdftronComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.17", type: PdftronComponent, selector: "app-pdftron", inputs: { editMode: "editMode", actionClicked: "actionClicked", fileTitle: "fileTitle", docId: "docId", DOCUMENT_TYPE: "DOCUMENT_TYPE", fileData: "fileData", fitMode: "fitMode", authHeader: "authHeader", fileURL: "fileURL", correspondance: "correspondance", secrecyProperty: "secrecyProperty", editingType: "editingType", userSignatures: "userSignatures", searchString: "searchString", trackSignature: "trackSignature", useOutsideAnotations: "useOutsideAnotations", importedAnotations: "importedAnotations", allowDownloadSecretFile: "allowDownloadSecretFile", allowPrintSecretFile: "allowPrintSecretFile", negelectAddingWaterMark: "negelectAddingWaterMark" }, outputs: { onSignatureTracking: "onSignatureTracking", onAddingAnotation: "onAddingAnotation", events: "events", SignatureEvent: "SignatureEvent" }, providers: [SecurePipe], viewQueries: [{ propertyName: "viewerRef", first: true, predicate: ["fileViewer"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div #fileViewer style=\"width: 100%; height: 100%;\"></div>\r\n", styles: [""] });
686
+ _PdftronComponent_docLoaded = new WeakMap(), _PdftronComponent_instances = new WeakSet(), _PdftronComponent_updateSilentPdfTron = function _PdftronComponent_updateSilentPdfTron() {
687
+ const rect = this.viewerRef.nativeElement.getBoundingClientRect();
688
+ Object.assign(this.silentPdfTron.style, {
689
+ position: 'absolute',
690
+ top: `${rect.top}px`,
691
+ left: `${rect.left}px`,
692
+ width: `${rect.width}px`,
693
+ height: `${rect.height}px`,
694
+ zIndex: '9999',
695
+ display: 'block'
696
+ });
697
+ }, _PdftronComponent_afterLoadWebViewer = function _PdftronComponent_afterLoadWebViewer(instance) {
698
+ this.isArabic ? instance.setLanguage('ar') : instance.setLanguage('en');
699
+ this.pdftronService.instance = this.webViewerInstance = instance;
700
+ if (this.correspondance.facets.indexOf('ctocr') > -1) {
701
+ this.fileWithOcr = true;
702
+ this.pages = JSON.parse(this.correspondance.properties['ctocr:recognizedJson']);
703
+ // override search funtion to use our search in ocr not defult search
704
+ instance.overrideSearchExecution(this.searchFn);
705
+ }
706
+ else {
707
+ // if no ocr then add search lisner to lisne to internal search and catch results
708
+ this.addSearchListner();
709
+ }
710
+ this.addPrintButton();
711
+ this.addDownloadButton();
712
+ this.importSignature();
713
+ this.exportingSignature();
714
+ this.deleteAnnotation();
715
+ this.exportingSavedSignature();
716
+ if (this.useOutsideAnotations) {
717
+ this.importAnotationsFromOutside();
718
+ this.exportAnotationsToOutside();
719
+ }
720
+ this.webViewerInstance.docViewer.setSearchHighlightColors({
721
+ // setSearchHighlightColors accepts both Annotations.Color objects or 'rgba' strings
722
+ searchResult: new this.webViewerInstance.Annotations.Color(250, 206, 0, 0.50196),
723
+ activeSearchResult: new this.webViewerInstance.Annotations.Color(250, 206, 0, 0.50196)
724
+ });
725
+ if (this.recivedSearchStringsArray.length !== 0) {
726
+ this.automaticSearch(this.recivedSearchStringsArray);
727
+ }
728
+ this.loadDocument();
729
+ }, _PdftronComponent_reset = function _PdftronComponent_reset() {
730
+ var _a;
731
+ this.webViewerInstance.closeDocument().then(() => {
732
+ console.log('document closed!');
733
+ });
734
+ this.pdftronService.instance = null;
735
+ this.transelationSubscrition ? this.transelationSubscrition.unsubscribe() : null;
736
+ this.silentPdfTron.style.display = 'none';
737
+ (_a = this.resizeObserver) === null || _a === void 0 ? void 0 : _a.disconnect();
738
+ this.webViewerInstance.setHeaderItems((header) => {
739
+ header.headers.default = header.headers.default.filter((q) => { var _a; return !((_a = q.img) === null || _a === void 0 ? void 0 : _a.includes('<svg')); });
740
+ });
741
+ this.webViewerInstance.docViewer.off('documentLoaded', __classPrivateFieldGet(this, _PdftronComponent_docLoaded, "f"));
742
+ // maybe will need to reset signature & annotations
743
+ };
744
+ PdftronComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: PdftronComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: i1.PdftronService }, { token: i2.NuxeoService }, { token: APP_BASE_HREF }, { token: i3.TranslationService }, { token: i4.SilentPdfTronService }, { token: 'environment' }], target: i0.ɵɵFactoryTarget.Component });
745
+ PdftronComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.17", type: PdftronComponent, selector: "app-pdftron", inputs: { editMode: "editMode", actionClicked: "actionClicked", fileTitle: "fileTitle", docId: "docId", DOCUMENT_TYPE: "DOCUMENT_TYPE", fileData: "fileData", fitMode: "fitMode", authHeader: "authHeader", fileURL: "fileURL", correspondance: "correspondance", secrecyProperty: "secrecyProperty", editingType: "editingType", userSignatures: "userSignatures", searchString: "searchString", trackSignature: "trackSignature", useOutsideAnotations: "useOutsideAnotations", importedAnotations: "importedAnotations", allowDownloadSecretFile: "allowDownloadSecretFile", allowPrintSecretFile: "allowPrintSecretFile", negelectAddingWaterMark: "negelectAddingWaterMark" }, outputs: { onSignatureTracking: "onSignatureTracking", onAddingAnotation: "onAddingAnotation", events: "events", SignatureEvent: "SignatureEvent" }, providers: [SecurePipe], viewQueries: [{ propertyName: "viewerRef", first: true, predicate: ["fileViewer"], descendants: true, static: true }], usesOnChanges: true, ngImport: i0, template: "<div #fileViewer style=\"width: 100%; height: 100%;\"></div>\r\n", styles: [""] });
704
746
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: PdftronComponent, decorators: [{
705
747
  type: Component,
706
748
  args: [{
707
749
  selector: 'app-pdftron',
708
750
  templateUrl: './pdftron.component.html',
709
751
  styleUrls: ['./pdftron.component.scss'],
710
- providers: [SecurePipe],
752
+ providers: [SecurePipe]
711
753
  }]
712
754
  }], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }, { type: i1.PdftronService }, { type: i2.NuxeoService }, { type: undefined, decorators: [{
713
755
  type: Inject,
714
756
  args: [APP_BASE_HREF]
715
- }] }, { type: i3.SecurePipe }, { type: i4.TranslationService }, { type: i5.CustomToastrService }, { type: undefined, decorators: [{
757
+ }] }, { type: i3.TranslationService }, { type: i4.SilentPdfTronService }, { type: undefined, decorators: [{
716
758
  type: Inject,
717
759
  args: ['environment']
718
760
  }] }]; }, propDecorators: { viewerRef: [{
719
761
  type: ViewChild,
720
- args: ['fileViewer']
762
+ args: ['fileViewer', { static: true }]
721
763
  }], editMode: [{
722
764
  type: Input
723
765
  }], actionClicked: [{
@@ -767,4 +809,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.17", ngImpo
767
809
  }], SignatureEvent: [{
768
810
  type: Output
769
811
  }] } });
770
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGRmdHJvbi5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9udXhlby1kZXZlbG9wbWVudC1mcmFtZXdvcmsvc3JjL2xpYi9jb21wb25lbnRzL3BkZi10cm9uL3BkZnRyb24vcGRmdHJvbi5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9udXhlby1kZXZlbG9wbWVudC1mcmFtZXdvcmsvc3JjL2xpYi9jb21wb25lbnRzL3BkZi10cm9uL3BkZnRyb24vcGRmdHJvbi5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUdMLFNBQVMsRUFFVCxZQUFZLEVBQ1osTUFBTSxFQUNOLEtBQUssRUFJTCxNQUFNLEVBQ04sU0FBUyxHQUNWLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sU0FBMkIsTUFBTSxvQkFBb0IsQ0FBQztBQUc3RCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDaEQsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLDRCQUE0QixDQUFDOzs7Ozs7O0FBTXhEOzs7Ozs7Ozs7Ozs7R0FZRztBQU9ILE1BQU0sT0FBTyxnQkFBZ0I7SUFvRDNCLFlBQ1MsR0FBc0IsRUFDckIsY0FBOEIsRUFDOUIsS0FBbUIsRUFDSSxRQUFnQixFQUN2QyxVQUFzQixFQUN0QixrQkFBc0MsRUFDdEMsT0FBNEIsRUFDTCxXQUFXO1FBUG5DLFFBQUcsR0FBSCxHQUFHLENBQW1CO1FBQ3JCLG1CQUFjLEdBQWQsY0FBYyxDQUFnQjtRQUM5QixVQUFLLEdBQUwsS0FBSyxDQUFjO1FBQ0ksYUFBUSxHQUFSLFFBQVEsQ0FBUTtRQUN2QyxlQUFVLEdBQVYsVUFBVSxDQUFZO1FBQ3RCLHVCQUFrQixHQUFsQixrQkFBa0IsQ0FBb0I7UUFDdEMsWUFBTyxHQUFQLE9BQU8sQ0FBcUI7UUFDTCxnQkFBVyxHQUFYLFdB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aWV3SW5pdCxcclxuICBDaGFuZ2VEZXRlY3RvclJlZixcclxuICBDb21wb25lbnQsXHJcbiAgRWxlbWVudFJlZixcclxuICBFdmVudEVtaXR0ZXIsXHJcbiAgSW5qZWN0LFxyXG4gIElucHV0LFxyXG4gIE9uQ2hhbmdlcyxcclxuICBPbkRlc3Ryb3ksXHJcbiAgT25Jbml0LFxyXG4gIE91dHB1dCxcclxuICBWaWV3Q2hpbGQsXHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCBXZWJWaWV3ZXIsIHsgQ29yZUNvbnRyb2xzIH0gZnJvbSAnQHBkZnRyb24vd2Vidmlld2VyJztcclxuaW1wb3J0IHsgTnV4ZW9TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vY29yZS9zZXJ2aWNlcy9udXhlby9udXhlby5zZXJ2aWNlJztcclxuaW1wb3J0IHsgUGRmdHJvblNlcnZpY2UgfSBmcm9tICcuL3BkZnRyb24uc2VydmljZSc7XHJcbmltcG9ydCB7IEFQUF9CQVNFX0hSRUYgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xyXG5pbXBvcnQgeyBTZWN1cmVQaXBlIH0gZnJvbSAnLi4vLi4vLi4vcGlwZXMvc2VjdXJlLnBpcGUnO1xyXG5pbXBvcnQgeyBUaHJvd1N0bXQgfSBmcm9tICdAYW5ndWxhci9jb21waWxlcic7XHJcbmltcG9ydCB7IFRyYW5zbGF0aW9uU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL2NvcmUvc2VydmljZXMvdHJhbnNsYXRpb24vdHJhbnNsYXRpb24uc2VydmljZSc7XHJcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBDdXN0b21Ub2FzdHJTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vY3VzdG9tLXRvYXN0ci9zZXJ2aWNlcy9jdXN0b20tdG9hc3RyLnNlcnZpY2UnO1xyXG5cclxuLyoqXHJcbiAqIEEgcmV1c2FibGUgZmlsZSB2aWV3ZXIgYmFzZWQgb24gUERGVHJvbiBMaWJyYXJ5XHJcbiAqIEB0aXRsZVxyXG4gKiBQREZUcm9uIFZpZXdlclxyXG4gKiBAZXhhbXBsZVxyXG4gKiA8YXBwLXBkZnRyb25cclxuICogICBbZmlsZURhdGFdPVwiZmlsZURhdGFcIlxyXG4gKiAgIFtlZGl0TW9kZV09XCJmYWxzZVwiXHJcbiAqICAgW2RvY0lkXT1cImZpbGVJZFwiXHJcbiAqICAgW2ZpbGVUaXRsZV09XCJmaWxlLnRpdGxlXCJcclxuICogPlxyXG4gKiA8L2FwcC1wZGZ0cm9uPlxyXG4gKi9cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdhcHAtcGRmdHJvbicsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL3BkZnRyb24uY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL3BkZnRyb24uY29tcG9uZW50LnNjc3MnXSxcclxuICBwcm92aWRlcnM6IFtTZWN1cmVQaXBlXSxcclxufSlcclxuZXhwb3J0IGNsYXNzIFBkZnRyb25Db21wb25lbnRcclxuICBpbXBsZW1lbnRzIE9uSW5pdCwgQWZ0ZXJWaWV3SW5pdCwgT25EZXN0cm95LCBPbkNoYW5nZXMge1xyXG4gIEBWaWV3Q2hpbGQoJ2ZpbGVWaWV3ZXInKSB2aWV3ZXJSZWY6IEVsZW1lbnRSZWY7XHJcbiAgd2ViVmlld2VySW5zdGFuY2U7XHJcbiAgLyoqIERpc2FibGUvRW5hYmxlIEFubm90YXRpb24gKi9cclxuICBASW5wdXQoKVxyXG4gIGVkaXRNb2RlOiBib29sZWFuO1xyXG4gIEBJbnB1dCgpIGFjdGlvbkNsaWNrZWQgPSBmYWxzZTsgLy8gdXNlZCB0byBrbm93IGlmIHRoZXJlIGlzIGFjdGlvbiBjbGlja2VkIG91dHNpZGUgdG8gc3RhcnQgZWRpdCBtb2RlIG9yIG5vdFxyXG4gIGlzRG9jdW1lbnRMb2FkaW5nOiBib29sZWFuO1xyXG4gIGlzRmV0Y2hpbmc6IGJvb2xlYW47XHJcbiAgLyoqIERvY3VtZW50IHRpdGxlICovXHJcbiAgQElucHV0KClcclxuICBmaWxlVGl0bGU6IHN0cmluZztcclxuICAvKiogRG9jdW1lbnQgSUQgKi9cclxuICBASW5wdXQoKVxyXG4gIGRvY0lkOiBzdHJpbmc7XHJcbiAgQElucHV0KClcclxuICBET0NVTUVOVF9UWVBFID0gJ2FwcGxpY2F0aW9uL3BkZic7XHJcbiAgQElucHV0KClcclxuICBmaWxlRGF0YTtcclxuICBASW5wdXQoKVxyXG4gIGZpdE1vZGU6ICdGaXRXaWR0aCcgfCAnRml0UGFnZScgfCAnWm9vbScgPSAnRml0V2lkdGgnO1xyXG4gIEBJbnB1dCgpXHJcbiAgYXV0aEhlYWRlcjogc3RyaW5nO1xyXG4gIEBJbnB1dCgpXHJcbiAgZmlsZVVSTDogc3RyaW5nO1xyXG4gIEBJbnB1dCgpXHJcbiAgY29ycmVzcG9uZGFuY2U7XHJcblxyXG4gIEBJbnB1dCgpIHNlY3JlY3lQcm9wZXJ0eTsgLy8gdXNlZCB0byBhZGQgd2F0ZXJtYXJrIGFjb3JkaW5nIGNlcnRhaW4gc2VjcmVjeSBsZXZlbFxyXG4gIEBJbnB1dCgpIGVkaXRpbmdUeXBlO1xyXG4gIEBJbnB1dCgpIHVzZXJTaWduYXR1cmVzO1xyXG4gIEBJbnB1dCgpIHNlYXJjaFN0cmluZyA9ICcnOyAvLyBzdHJpbmcgdG8gc2VhcmNoIGZvciBpdCBpbiB0aGUgZG9jdW1lbnRcclxuXHJcbiAgQElucHV0KCkgdHJhY2tTaWduYXR1cmUgPSBmYWxzZTsgLy8gdG8gZW5hYmxlIHRyYWNraW5nIHNpZ25hdHVyZSBwb3NpdGlvbiBhbmQgZW1pdCBpdCBhZnRlciBldmVyeSBjaGFuZ2UgaXQgc2lnbmF0dXJlXHJcbiAgQE91dHB1dCgpIG9uU2lnbmF0dXJlVHJhY2tpbmcgPSBuZXcgRXZlbnRFbWl0dGVyKCk7IC8vIGV2ZW50IHRvIGVtaXQgc2lnbmF0dXJlIGNoYW5nZXNcclxuXHJcbiAgQElucHV0KCkgdXNlT3V0c2lkZUFub3RhdGlvbnMgPSBmYWxzZTsgLy8gZmxhZ2UgdG8gaW5kaWNhdCBpZiB1c2luZyBvdXQgc2lkZSBhbm90YXRpb25zIG9yIG5vdFxyXG4gIEBJbnB1dCgpIGltcG9ydGVkQW5vdGF0aW9uczsgLy8gaW1wb3J0ZWQgYW5vdGF0aW9ucyBmcm9tIG91dHNpZGVcclxuICBASW5wdXQoKSBhbGxvd0Rvd25sb2FkU2VjcmV0RmlsZSA9IHRydWU7IC8vIGFsbG93IG9yIHByZXZlbnQgZG93bmxvYWQgc2NyZWN0IGZpbGVzXHJcbiAgQElucHV0KCkgYWxsb3dQcmludFNlY3JldEZpbGUgPSB0cnVlOyAvLyBhbGxvdyBvciBwcmV2ZW50IHByaW50IHNjcmVjdCBmaWxlc1xyXG4gIEBJbnB1dCgpIG5lZ2VsZWN0QWRkaW5nV2F0ZXJNYXJrID0gZmFsc2U7IC8vIGRvbid0IGFkZCB3YXRlcm1hcmsgaGVyZSB3aGF0ZXZlciBlYXMgdGhlIGNvbmRpdGlvbnMgKHdlIG1heSBhZGQgaXQgZnJvbSBvdXRzaWRlIG9yIG5vdCBhZGQgaXQgYXQgYWxsKVxyXG5cclxuICBAT3V0cHV0KCkgb25BZGRpbmdBbm90YXRpb24gPSBuZXcgRXZlbnRFbWl0dGVyKCk7IC8vIHVzZWQgdG8gZXhwb3J0IGFsbCBhbm90YXRpb25zIHRvIG91dHNpZGVcclxuICBAT3V0cHV0KClcclxuICBldmVudHMgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcbiAgQE91dHB1dCgpIFNpZ25hdHVyZUV2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcigpOyAvLyB1c2VkIHRvIGV4cG9ydCBzaWduYXR1cmUgdG8gb3V0c2lkZVxyXG4gIGZpcnN0VGltZUxvYWQgPSB0cnVlOyAvL2ZsYWdlIHRvIGNvbnRyb2wgaW1wb3J0aW5nIHNpZ25hdHVyZXMgaW4gdGhlIGZpcnN0IHRpbWUgbG9hZCBvbmx5XHJcbiAgZmlyc3RTaWduYXR1cmVMb2FkID0gdHJ1ZTsgLy8gZmxhZ2UgdG8gcGFzcyBmaXJzdCBsb2FkIG9mIGltcG9ydGVkIHNpZ25hdHVyZXMgd2l0aG91dCBlbWl0dGluZyB0aGUgZXZlbnQgXHJcbiAgbmV3U2lnbkNyZWF0aW9uID0gZmFsc2U7IC8vIGZsYWdlIHRvIGluZGljYXRlIHNpZ25hdHVyZSBjcmVhdGlvbiBpcyBjcmVhdGVkIG9yIGNob29zZWQgZnJvbSBzdG9yZWQgb25lc1xyXG4gIHRyYW5zZWxhdGlvblN1YnNjcml0aW9uOiBTdWJzY3JpcHRpb247XHJcbiAgaXNBcmFiaWM7XHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwdWJsaWMgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZixcclxuICAgIHByaXZhdGUgcGRmdHJvblNlcnZpY2U6IFBkZnRyb25TZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBudXhlbzogTnV4ZW9TZXJ2aWNlLFxyXG4gICAgQEluamVjdChBUFBfQkFTRV9IUkVGKSBwcml2YXRlIGJhc2VIcmVmOiBzdHJpbmcsXHJcbiAgICBwcml2YXRlIHNlY3VyZVBpcGU6IFNlY3VyZVBpcGUsXHJcbiAgICBwcml2YXRlIHRyYW5zbGF0aW9uU2VydmljZTogVHJhbnNsYXRpb25TZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSB0b2FzdGVyOiBDdXN0b21Ub2FzdHJTZXJ2aWNlLFxyXG4gICAgQEluamVjdCgnZW52aXJvbm1lbnQnKSBwcml2YXRlIGVudmlyb25tZW50XHJcbiAgKSB7IH1cclxuXHJcbiAgYXN5bmMgbmdPbkluaXQoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICB0aGlzLnRyYW5zZWxhdGlvblN1YnNjcml0aW9uID0gdGhpcy50cmFuc2xhdGlvblNlcnZpY2UuaXNBcmFiaWMuc3Vic2NyaWJlKHJlcyA9PiB7XHJcbiAgICAgIHRoaXMuaXNBcmFiaWMgPSByZXM7XHJcbiAgICB9KVxyXG4gIH1cclxuXHJcbiAgYXN5bmMgbmdBZnRlclZpZXdJbml0KCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgdGhpcy5yZWNpdmVkU2VhcmNoU3RyaW5nc0FycmF5ID0gdGhpcy5zZWFyY2hTdHJpbmcudHJpbSgpID8gdGhpcy5zZWFyY2hTdHJpbmcuc3BsaXQoJywnKSA6IFtdO1xyXG4gICAgaWYodGhpcy5maWxlVGl0bGUpe1xyXG4gICAgICBpZiAodGhpcy5maWxlVGl0bGUuZW5kc1dpdGgoJy5wcHQnKSkge1xyXG4gICAgICAgIHRoaXMuRE9DVU1FTlRfVFlQRSA9ICdhcHBsaWNhdGlvbi92bmQubXMtcG93ZXJwb2ludCc7XHJcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5maWxlVGl0bGUuZW5kc1dpdGgoJy5wcHR4JykpIHtcclxuICAgICAgICB0aGlzLkRPQ1VNRU5UX1RZUEUgPVxyXG4gICAgICAgICAgJ2FwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC5wcmVzZW50YXRpb25tbC5wcmVzZW50YXRpb24nO1xyXG4gICAgICB9IGVsc2UgaWYgKHRoaXMuZmlsZVRpdGxlLmVuZHNXaXRoKCcuZG9jJykpIHtcclxuICAgICAgICB0aGlzLkRPQ1VNRU5UX1RZUEUgPSAnYXBwbGljYXRpb24vbXN3b3JkJztcclxuICAgICAgfSBlbHNlIGlmICh0aGlzLmZpbGVUaXRsZS5lbmRzV2l0aCgnLmRvY3gnKSkge1xyXG4gICAgICAgIHRoaXMuRE9DVU1FTlRfVFlQRSA9XHJcbiAgICAgICAgICAnYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLW9mZmljZWRvY3VtZW50LndvcmRwcm9jZXNzaW5nbWwuZG9jdW1lbnQnO1xyXG4gICAgICB9XHJcbiAgICAgIFdlYlZpZXdlcihcclxuICAgICAgICB7XHJcbiAgICAgICAgICBwYXRoOiB0aGlzLmJhc2VIcmVmICsgJy9hc3NldHMvcGRmdHJvbnMnLFxyXG4gICAgICAgICAgZm9yY2VDbGllbnRTaWRlSW5pdDogdHJ1ZSxcclxuICAgICAgICAgIHN0cmVhbWluZzogdHJ1ZSxcclxuICAgICAgICAgIGxpY2Vuc2VLZXk6IHRoaXMuZW52aXJvbm1lbnQucGRmdHJvbkxpY2VuY2VLZXksXHJcbiAgICAgICAgICBjc3M6IHRoaXMuaXNBcmFiaWMgPyAodGhpcy5iYXNlSHJlZiArICcvYXNzZXRzL3N0eWxlcy9hci1teXBkZnRyb24uY3NzJykgOiAodGhpcy5iYXNlSHJlZiArICcvYXNzZXRzL3N0eWxlcy9lbi1teXBkZnRyb24uY3NzJyksXHJcbiAgICAgICAgICBhbm5vdGF0aW9uVXNlcjogdGhpcy5udXhlby5udXhlb0NsaWVudC51c2VyLnByb3BlcnRpZXMuZmlyc3ROYW1lICsgJyAnICsgdGhpcy5udXhlby5udXhlb0NsaWVudC51c2VyLnByb3BlcnRpZXMubGFzdE5hbWUsXHJcbiAgICAgICAgICBkaXNhYmxlZEVsZW1lbnRzOiBbJ2Rvd25sb2FkQnV0dG9uJywgJ3ByaW50QnV0dG9uJ10sXHJcbiAgXHJcbiAgICAgICAgfSxcclxuICAgICAgICB0aGlzLnZpZXdlclJlZi5uYXRpdmVFbGVtZW50XHJcbiAgICAgICkudGhlbihhc3luYyAoaW5zdGFuY2UpID0+IHtcclxuICAgICAgICB0aGlzLmlzQXJhYmljID8gaW5zdGFuY2Uuc2V0TGFuZ3VhZ2UoJ2FyJykgOiBpbnN0YW5jZS5zZXRMYW5ndWFnZSgnZW4nKTtcclxuICAgICAgICB0aGlzLnBkZnRyb25TZXJ2aWNlLmluc3RhbmNlID0gdGhpcy53ZWJWaWV3ZXJJbnN0YW5jZSA9IGluc3RhbmNlO1xyXG4gICAgICAgIGlmICh0aGlzLmNvcnJlc3BvbmRhbmNlLmZhY2V0cy5pbmRleE9mKCdjdG9jcicpID4gLTEpIHtcclxuICAgICAgICAgIHRoaXMuZmlsZVdpdGhPY3IgPSB0cnVlO1xyXG4gICAgICAgICAgdGhpcy5wYWdlcyA9IEpTT04ucGFyc2UodGhpcy5jb3JyZXNwb25kYW5jZS5wcm9wZXJ0aWVzWydjdG9jcjpyZWNvZ25pemVkSnNvbiddKTtcclxuICAgICAgICAgIC8vIG92ZXJyaWRlIHNlYXJjaCBmdW50aW9uIHRvIHVzZSBvdXIgc2VhcmNoIGluIG9jciBub3QgZGVmdWx0IHNlYXJjaFxyXG4gICAgICAgICAgaW5zdGFuY2Uub3ZlcnJpZGVTZWFyY2hFeGVjdXRpb24odGhpcy5zZWFyY2hGbik7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIC8vIGlmIG5vIG9jciB0aGVuIGFkZCBzZWFyY2ggbGlzbmVyIHRvIGxpc25lIHRvIGludGVybmFsIHNlYXJjaCBhbmQgY2F0Y2ggcmVzdWx0c1xyXG4gICAgICAgICAgdGhpcy5hZGRTZWFyY2hMaXN0bmVyKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuYWRkUHJpbnRCdXR0b24oKTtcclxuICAgICAgICB0aGlzLmFkZERvd25sb2FkQnV0dG9uKCk7XHJcbiAgICAgICAgdGhpcy5pbXBvcnRTaWduYXR1cmUoKTtcclxuICAgICAgICB0aGlzLmV4cG9ydGluZ1NpZ25hdHVyZSgpO1xyXG4gICAgICAgIHRoaXMuZGVsZXRlQW5ub3RhdGlvbigpO1xyXG4gICAgICAgIHRoaXMuZXhwb3J0aW5nU2F2ZWRTaWduYXR1cmUoKTtcclxuICAgICAgICBpZiAodGhpcy51c2VPdXRzaWRlQW5vdGF0aW9ucykge1xyXG4gICAgICAgICAgdGhpcy5pbXBvcnRBbm90YXRpb25zRnJvbU91dHNpZGUoKTtcclxuICAgICAgICAgIHRoaXMuZXhwb3J0QW5vdGF0aW9uc1RvT3V0c2lkZSgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLndlYlZpZXdlckluc3RhbmNlLmRvY1ZpZXdlci5zZXRTZWFyY2hIaWdobGlnaHRDb2xvcnMoe1xyXG4gICAgICAgICAgLy8gc2V0U2VhcmNoSGlnaGxpZ2h0Q29sb3JzIGFjY2VwdHMgYm90aCBBbm5vdGF0aW9ucy5Db2xvciBvYmplY3RzIG9yICdyZ2JhJyBzdHJpbmdzXHJcbiAgICAgICAgICBzZWFyY2hSZXN1bHQ6IG5ldyB0aGlzLndlYlZpZXdlckluc3RhbmNlLkFubm90YXRpb25zLkNvbG9yKDI1MCwgMjA2LCAwLCAwLjUwMTk2KSxcclxuICAgICAgICAgIGFjdGl2ZVNlYXJjaFJlc3VsdDogbmV3IHRoaXMud2ViVmlld2VySW5zdGFuY2UuQW5ub3RhdGlvbnMuQ29sb3IoMjUwLCAyMDYsIDAsIDAuNTAxOTYpLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGlmICh0aGlzLnJlY2l2ZWRTZWFyY2hTdHJpbmdzQXJyYXkubGVuZ3RoICE9PSAwKSB7XHJcbiAgICAgICAgICB0aGlzLmF1dG9tYXRpY1NlYXJjaCh0aGlzLnJlY2l2ZWRTZWFyY2hTdHJpbmdzQXJyYXkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmxvYWREb2N1bWVudCgpO1xyXG4gIFxyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGltcG9ydEFub3RhdGlvbnNGcm9tT3V0c2lkZSgpIHtcclxuICAgIGNvbnN0IGRvY3VtZW50Vmlld2VyID0gdGhpcy53ZWJWaWV3ZXJJbnN0YW5jZS5kb2NWaWV3ZXI7XHJcblxyXG4gICAgZG9jdW1lbnRWaWV3ZXIub24oJ2RvY3VtZW50TG9hZGVkJywgKCkgPT4ge1xyXG4gICAgICB0aGlzLndlYlZpZXdlckluc3RhbmNlLmFubm90TWFuYWdlci5pbXBvcnRBbm5vdGF0aW9ucyh0aGlzLmltcG9ydGVkQW5vdGF0aW9ucylcclxuICAgIH0pXHJcbiAgICAvLyAudGhlbihhbm5vdGF0aW9ucyA9PiB7XHJcbiAgICAvLyAgIGFubm90YXRpb25zLmZvckVhY2goYW5ub3RhdGlvbiA9PiB7XHJcbiAgICAvLyAgICAgdGhpcy53ZWJWaWV3ZXJJbnN0YW5jZS5hbm5vdE1hbmFnZXIucmVkcmF3QW5ub3RhdGlvbihhbm5vdGF0aW9uKTtcclxuICAgIC8vICAgfSk7XHJcbiAgICAvLyB9KTtcclxuICB9XHJcblxyXG4gIC8vIGV4Y3RyYWN0IGFsbCBhbm90YXRpb25zIG9uIHRoZSBmaWxlIGFuZCBzZW5kIGl0IG91dCBzaWRlIHRvIGJlIHNhdmVkIGFuZCBsZWF2ZSB0aGUgZmlsZSBhcyBpdCBpcyB3aXRob3V0IGFueSBhbm90YXRpb25zIG9uIGl0XHJcbiAgZXhwb3J0QW5vdGF0aW9uc1RvT3V0c2lkZSgpIHtcclxuICAgIHRoaXMud2ViVmlld2VySW5zdGFuY2UuYW5ub3RNYW5hZ2VyLm9uKCdhbm5vdGF0aW9uQ2hhbmdlZCcsIChhbm5vdGF0aW9ucywgYWN0aW9uLCB7IGltcG9ydGVkIH0pID0+IHtcclxuICAgICAgaWYgKGltcG9ydGVkKSByZXR1cm47XHJcbiAgICAgIHRoaXMud2ViVmlld2VySW5zdGFuY2UuYW5ub3RNYW5hZ2VyLmV4cG9ydEFubm90YXRpb25zKCkudGhlbihleGN0cmFjdGVkQW5vdGF0aW9ucyA9PiB7XHJcbiAgICAgICAgdGhpcy5vbkFkZGluZ0Fub3RhdGlvbi5lbWl0KGV4Y3RyYWN0ZWRBbm90YXRpb25zKTtcclxuICAgICAgfSk7XHJcbiAgICAgIC8vIGlmIHRyYWNraW5nIHNpZ25hdHVyZSBsb2NhdGlvbiBpcyBlbmFibGUgdGhlbiBlbWl0IHNpZ25hdHVyZSBvdXRzaWRlIHdpdGggZXZlcnkgY2hhbmdlcyBpbiBpdFxyXG4gICAgICBpZiAodGhpcy50cmFja1NpZ25hdHVyZSkge1xyXG4gICAgICAgIHRoaXMub25TaWduYXR1cmVUcmFja2luZy5lbWl0KHsgYW5vdGF0aW9uczogYW5ub3RhdGlvbnMsIGFjdGlvbjogYWN0aW9uIH0pXHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgaW1wb3J0U2lnbmF0dXJlKCkge1xyXG4gICAgY29uc3QgZG9jdW1lbnRWaWV3ZXIgPSB0aGlzLndlYlZpZXdlckluc3RhbmNlLmRvY1ZpZXdlcjtcclxuICAgIGNvbnN0IHNpZ25hdHVyZVRvb2wgPSBkb2N1bWVudFZpZXdlci5nZXRUb29sKCdBbm5vdGF0aW9uQ3JlYXRlU2lnbmF0dXJlJyk7XHJcblxyXG4gICAgZG9jdW1lbnRWaWV3ZXIub24oJ2RvY3VtZW50TG9hZGVkJywgKCkgPT4ge1xyXG4gICAgICBpZiAodGhpcy5maXJzdFRpbWVMb2FkKSB7XHJcbiAgICAgICAgc2lnbmF0dXJlVG9vbC5pbXBvcnRTaWduYXR1cmVzKFsuLi50aGlzLnVzZXJTaWduYXR1cmVzXSk7XHJcbiAgICAgICAgdGhpcy5maXJzdFRpbWVMb2FkID0gZmFsc2U7XHJcbiAgICAgIH1cclxuICAgIH0pXHJcbiAgfVxyXG5cclxuICBleHBvcnRpbmdTYXZlZFNpZ25hdHVyZSgpIHtcclxuICAgIGNvbnN0IGRvY3VtZW50Vmlld2VyID0gdGhpcy53ZWJWaWV3ZXJJbnN0YW5jZS5kb2NWaWV3ZXI7XHJcbiAgICBjb25zdCBTaWduYXR1cmVDcmVhdGVUb29sID0gZG9jdW1lbnRWaWV3ZXIuZ2V0VG9vbCgnQW5ub3RhdGlvbkNyZWF0ZVNpZ25hdHVyZScpXHJcbiAgICBTaWduYXR1cmVDcmVhdGVUb29sLm9uKCdzaWduYXR1cmVTYXZlZCcsIChhbm5vdGF0aW9uKSA9PiB7XHJcbiAgICAgIGlmICghdGhpcy5maXJzdFNpZ25hdHVyZUxvYWQpIHtcclxuICAgICAgICBjb25zb2xlLmxvZygnc2lnbmF0dXJlIHNhdmVkIHRyaWdlcmVkJyk7XHJcbiAgICAgICAgdGhpcy5uZXdTaWduQ3JlYXRpb24gPSB0cnVlO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuZmlyc3RTaWduYXR1cmVMb2FkID0gZmFsc2U7XHJcbiAgICB9KTs7XHJcbiAgfVxyXG5cclxuICBleHBvcnRpbmdTaWduYXR1cmUoKSB7XHJcbiAgICBjb25zdCBkb2N1bWVudFZpZXdlciA9IHRoaXMud2ViVmlld2VySW5zdGFuY2UuZG9jVmlld2VyO1xyXG4gICAgY29uc3QgU2lnbmF0dXJlQ3JlYXRlVG9vbCA9IGRvY3VtZW50Vmlld2VyLmdldFRvb2woJ0Fubm90YXRpb25DcmVhdGVTaWduYXR1cmUnKVxyXG4gICAgU2lnbmF0dXJlQ3JlYXRlVG9vbC5vbignYW5ub3RhdGlvbkFkZGVkJywgKGFubm90YXRpb24pID0+IHtcclxuICAgICAgaWYgKGFubm90YXRpb24gJiYgdGhpcy5uZXdTaWduQ3JlYXRpb24pIHtcclxuICAgICAgICB0aGlzLm5ld1NpZ25DcmVhdGlvbiA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuZXh0cmFjdEFub3RhdGlvbihhbm5vdGF0aW9uLCBkb2N1bWVudFZpZXdlcik7XHJcbiAgICAgICAgY29uc29sZS5sb2coYW5ub3RhdGlvbilcclxuICAgICAgfVxyXG4gICAgfSk7O1xyXG4gIH1cclxuXHJcbiAgZXh0cmFjdEFub3RhdGlvbihhbm5vdGF0aW9uLCBkb2N1bWVudFZpZXdlcikge1xyXG4gICAgaWYgKGFubm90YXRpb25bJ2ltYWdlJ10pIHtcclxuICAgICAgLy8gY29udmVydCBiYXNlNjQgc2lnbmF0dXJlIGludG8gZmlsZSBhbmQgZW1pdCBpdCB0byBvdXQgc2lkZSBcclxuICAgICAgbGV0IGJhc2U2NEltZyA9IGFubm90YXRpb25bJ2ltYWdlJ11bJ2N1cnJlbnRTcmMnXTtcclxuICAgICAgdmFyIGFyciA9IGJhc2U2NEltZy5zcGxpdCgnLCcpLFxyXG4gICAgICAgIG1pbWUgPSBhcnJbMF0ubWF0Y2goLzooLio/KTsvKVsxXSxcclxuICAgICAgICBic3RyID0gYXRvYihhcnJbMV0pLFxyXG4gICAgICAgIG4gPSBic3RyLmxlbmd0aCxcclxuICAgICAgICB1OGFyciA9IG5ldyBVaW50OEFycmF5KG4pO1xyXG4gICAgICB3aGlsZSAobi0tKSB7XHJcbiAgICAgICAgdThhcnJbbl0gPSBic3RyLmNoYXJDb2RlQXQobik7XHJcbiAgICAgIH1cclxuICAgICAgbGV0IG5hbWUgPSBtaW1lLnJlcGxhY2UoJy8nLCAnLicpXHJcbiAgICAgIGxldCBteUZpbGUgPSBuZXcgRmlsZShbdThhcnJdLCAnbXlTaWduYXR1cmUucG5nJywgeyB0eXBlOiBtaW1lIH0pO1xyXG4gICAgICB0aGlzLlNpZ25hdHVyZUV2ZW50LmVtaXQoeyBkYXRhOiBteUZpbGUsIGV2ZW50TmFtZTogJ2V4cG9ydCcgfSk7XHJcblxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5leHRyYWN0QW5ub3RhdGlvblNpZ25hdHVyZShhbm5vdGF0aW9uLCBkb2N1bWVudFZpZXdlcilcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGFzeW5jIGV4dHJhY3RBbm5vdGF0aW9uU2lnbmF0dXJlKGFubm90YXRpb24sIGRvY1ZpZXdlcikge1xyXG4gICAgLy8gQ3JlYXRlIGEgbmV3IENhbnZhcyB0byBkcmF3IHRoZSBBbm5vdGF0aW9uIG9uXHJcbiAgICBjb25zdCBjYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTtcclxuICAgIC8vIFJlZmVyZW5jZSB0aGUgYW5ub3RhdGlvbiBmcm9tIHRoZSBEb2N1bWVudFxyXG4gICAgY29uc3QgcGFnZU1hdHJpeCA9IGRvY1ZpZXdlci5nZXREb2N1bWVudCgpLmdldFBhZ2VNYXRyaXgoYW5ub3RhdGlvbi5QYWdlTnVtYmVyKTtcclxuICAgIC8vIFNldCB0aGUgaGVpZ2h0ICYgd2lkdGggb2YgdGhlIGNhbnZhcyB0byBtYWRlbGV0ZVNhdmVkU2lnbmF0dXJldGNoIHRoZSBhbm5vdGF0aW9uXHJcbiAgICBjYW52YXMuaGVpZ2h0ID0gYW5ub3RhdGlvbi5IZWlnaHQ7XHJcbiAgICBjYW52YXMud2lkdGggPSBhbm5vdGF0aW9uLldpZHRoO1xyXG4gICAgY29uc3QgY3R4ID0gY2FudmFzLmdldENvbnRleHQoJzJkJyk7XHJcbiAgICAvLyBUcmFuc2xhdGUgdGhlIEFubm90YXRpb24gdG8gdGhlIHRvcCBUb3AgTGVmdCBDb3JuZXIgb2YgdGhlIENhbnZhcyBpZSAoMCwgMClcclxuICAgIGN0eC50cmFuc2xhdGUoLWFubm90YXRpb24uWCwgLWFubm90YXRpb24uWSk7XHJcbiAgICAvLyBEcmF3IHRoZSBBbm5vdGF0aW9uIG9udG8gdGhlIENhbnZhc1xyXG4gICAgYW5ub3RhdGlvbi5kcmF3KGN0eCwgcGFnZU1hdHJpeCk7XHJcbiAgICAvLyBDb252ZXJ0IHRoZSBDYW52YXMgdG8gYSBCbG9iIE9iamVjdCBmb3IgVXBsb2FkXHJcbiAgICBjYW52YXMudG9CbG9iKChibG9iKSA9PiB7XHJcbiAgICAgIC8vIENhbGwgeW91ciBCbG9iIFN0b3JhZ2UgVXBsb2FkIEZ1bmN0aW9uXHJcbiAgICAgIGxldCBuYW1lID0gYmxvYi50eXBlLnJlcGxhY2UoJy8nLCAnLicpXHJcbiAgICAgIGxldCBteUZpbGUgPSBuZXcgRmlsZShbYmxvYl0sIG5hbWUpO1xyXG4gICAgICB0aGlzLlNpZ25hdHVyZUV2ZW50LmVtaXQoeyBkYXRhOiBteUZpbGUsIGV2ZW50TmFtZTogJ2V4cG9ydCcgfSk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGRlbGV0ZUFubm90YXRpb24oKSB7XHJcbiAgICBjb25zdCBkb2N1bWVudFZpZXdlciA9IHRoaXMud2ViVmlld2VySW5zdGFuY2UuZG9jVmlld2VyO1xyXG4gICAgY29uc3QgU2lnbmF0dXJlQ3JlYXRlVG9vbCA9IGRvY3VtZW50Vmlld2VyLmdldFRvb2woJ0Fubm90YXRpb25DcmVhdGVTaWduYXR1cmUnKTtcclxuICAgIFNpZ25hdHVyZUNyZWF0ZVRvb2wub24oJ3NpZ25hdHVyZURlbGV0ZWQnLCAoYW5ub3RhdGlvbiwgaW5kZXgpID0+IHtcclxuICAgICAgY29uc29sZS5sb2coJ3RoZXJlIHdlcmUgYW5ub3RhdGlvbnMgZGVsZXRlZCcpO1xyXG4gICAgICB0aGlzLnVzZXJTaWduYXR1cmVzLnNwbGljZShpbmRleCwgMSk7XHJcbiAgICAgIHRoaXMuU2lnbmF0dXJlRXZlbnQuZW1pdCh7IGRhdGE6IHsgc2lnbmF0dXJlOiBhbm5vdGF0aW9uLCBpbmRleDogaW5kZXggfSwgZXZlbnROYW1lOiAnZGVsZXRlJyB9KTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgYWRkRG93bmxvYWRCdXR0b24oKSB7XHJcbiAgICBpZiAodGhpcy5hbGxvd0Rvd25sb2FkU2VjcmV0RmlsZSB8fCAoIXRoaXMuYWxsb3dEb3dubG9hZFNlY3JldEZpbGUgJiYgdGhpcy5jb3JyZXNwb25kYW5jZS5wcm9wZXJ0aWVzW3RoaXMuc2VjcmVjeVByb3BlcnR5XSAmJiB0aGlzLmNvcnJlc3BvbmRhbmNlLnByb3BlcnRpZXNbdGhpcy5zZWNyZWN5UHJvcGVydHldID09PSAnTm9ybWFsJykpIHtcclxuICAgICAgdGhpcy53ZWJWaWV3ZXJJbnN0YW5jZS5zZXRIZWFkZXJJdGVtcygoaGVhZGVyKSA9PiB7XHJcbiAgICAgICAgaGVhZGVyLnB1c2goe1xyXG4gICAgICAgICAgdHlwZTogJ2FjdGlvbkJ1dHRvbicsXHJcbiAgICAgICAgICBpbWc6ICc8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjIwXCIgaGVpZ2h0PVwiMjBcIiBmaWxsPVwiY3VycmVudENvbG9yXCIgY2xhc3M9XCJiaSBiaS1maWxlLWVhcm1hcmstYXJyb3ctZG93blwiIHZpZXdCb3g9XCIwIDAgMTYgMTZcIj4gPHBhdGggZD1cIk04LjUgNi41YS41LjUgMCAwIDAtMSAwdjMuNzkzTDYuMzU0IDkuMTQ2YS41LjUgMCAxIDAtLjcwOC43MDhsMiAyYS41LjUgMCAwIDAgLjcwOCAwbDItMmEuNS41IDAgMCAwLS43MDgtLjcwOEw4LjUgMTAuMjkzVjYuNXpcIi8+IDxwYXRoIGQ9XCJNMTQgMTRWNC41TDkuNSAwSDRhMiAyIDAgMCAwLTIgMnYxMmEyIDIgMCAwIDAgMiAyaDhhMiAyIDAgMCAwIDItMnpNOS41IDNBMS41IDEuNSAwIDAgMCAxMSA0LjVoMlYxNGExIDEgMCAwIDEtMSAxSDRhMSAxIDAgMCAxLTEtMVYyYTEgMSAwIDAgMSAxLTFoNS41djJ6XCIvPjwvc3ZnPicsXHJcbiAgICAgICAgICB0aXRsZTogdGhpcy5pc0FyYWJpYyA/ICfYqtmG2LLZitmEJyA6ICdEb3dubG9hZCcsXHJcbiAgICAgICAgICBvbkNsaWNrOiBhc3luYyAoKSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IHsgRG9jdW1lbnRWaWV3ZXIsIEFubm90YXRpb25NYW5hZ2VyLCBTYXZlT3B0aW9ucyB9ID0gdGhpcy53ZWJWaWV3ZXJJbnN0YW5jZS5Db3JlQ29udHJvbHM7XHJcbiAgICAgICAgICAgIC8vIGNvbnN0IHhmZGZTdHJpbmcgPSBhd2FpdCBBbm5vdGF0aW9uTWFuYWdlci5leHBvcnRBbm5vdGF0aW9ucygpO1xyXG4gICAgICAgICAgICBjb25zdCBzYXZlT3B0aW9ucyA9IFNhdmVPcHRpb25zO1xyXG4gICAgICAgICAgICBjb25zdCBvcHRpb25zID0ge1xyXG4gICAgICAgICAgICAgIGZpbGVuYW1lOiB0aGlzLmNvcnJlc3BvbmRhbmNlLnRpdGxlID8gdGhpcy5jb3JyZXNwb25kYW5jZS50aXRsZSA6ICdteURvY3VtZW50LnBkZicsXHJcbiAgICAgICAgICAgICAgLy8geGZkZlN0cmluZyxcclxuICAgICAgICAgICAgICBmbGFnczogc2F2ZU9wdGlvbnMuTElORUFSSVpFRCxcclxuICAgICAgICAgICAgICBkb3dubG9hZFR5cGU6ICdwZGYnXHJcbiAgICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgICB0aGlzLnBkZnRyb25TZXJ2aWNlLmluc3RhbmNlLmRvd25sb2FkUGRmKG9wdGlvbnMpO1xyXG4gICAgICAgICAgICB0aGlzLmV2ZW50cy5uZXh0KCdkb3dubG9hZCcpO1xyXG5cclxuXHJcbiAgICAgICAgICAgIC8vIGxldCB1cmwgPSB0aGlzLmNvcnJlc3BvbmRhbmNlLnByb3BlcnRpZXMuY29udGVudC5kYXRhO1xyXG4gICAgICAgICAgICAvLyBsZXQgZmlsZU5hbWUgPSB0aGlzLmNvcnJlc3BvbmRhbmNlLnByb3BlcnRpZXMuY29udGVudC5uYW1lO1xyXG4gICAgICAgICAgICAvLyBpZiAodXJsICYmIGZpbGVOYW1lKSB7XHJcbiAgICAgICAgICAgIC8vICAgbGV0IHNhZmVVcmwgPSB0aGlzLnNlY3VyZVBpcGUudHJhbnNmb3JtKHVybCk7XHJcbiAgICAgICAgICAgIC8vICAgc2FmZVVybC5zdWJzY3JpYmUoKHVybDogYW55KSA9PiB7XHJcbiAgICAgICAgICAgIC8vICAgICBjb25zdCBsaW5rID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpO1xyXG4gICAgICAgICAgICAvLyAgICAgbGluay5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xyXG4gICAgICAgICAgICAvLyAgICAgbGluay5ocmVmID0gdXJsLmNoYW5naW5nVGhpc0JyZWFrc0FwcGxpY2F0aW9uU2VjdXJpdHk7XHJcbiAgICAgICAgICAgIC8vICAgICBsaW5rLmRvd25sb2FkID0gZmlsZU5hbWU7XHJcbiAgICAgICAgICAgIC8vICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGxpbmspO1xyXG4gICAgICAgICAgICAvLyAgICAgbGluay5jbGljaygpO1xyXG4gICAgICAgICAgICAvLyAgICAgZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChsaW5rKTtcclxuICAgICAgICAgICAgLy8gICAgIHRoaXMuZXZlbnRzLm5leHQoJ2Rvd25sb2FkJyk7XHJcbiAgICAgICAgICAgIC8vICAgfSk7XHJcbiAgICAgICAgICAgIC8vIH1cclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgYWRkUHJpbnRCdXR0b24oKSB7XHJcbiAgICBpZiAodGhpcy5hbGxvd1ByaW50U2VjcmV0RmlsZSB8fCAoIXRoaXMuYWxsb3dQcmludFNlY3JldEZpbGUgJiYgdGhpcy5jb3JyZXNwb25kYW5jZS5wcm9wZXJ0aWVzW3RoaXMuc2VjcmVjeVByb3BlcnR5XSAmJiB0aGlzLmNvcnJlc3BvbmRhbmNlLnByb3BlcnRpZXNbdGhpcy5zZWNyZWN5UHJvcGVydHldID09PSAnTm9ybWFsJykpIHtcclxuICAgICAgdGhpcy53ZWJWaWV3ZXJJbnN0YW5jZS5zZXRIZWFkZXJJdGVtcygoaGVhZGVyKSA9PiB7XHJcbiAgICAgICAgaGVhZGVyLnB1c2goe1xyXG4gICAgICAgICAgdHlwZTogJ2FjdGlvbkJ1dHRvbicsXHJcbiAgICAgICAgICBpbWc6ICc8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOiNhYmIwYzQ7fTwvc3R5bGU+PC9kZWZzPjx0aXRsZT5pY29uIC0gaGVhZGVyIC0gcHJpbnQgLSBsaW5lPC90aXRsZT48cGF0aCBjbGFzcz1cImNscy0xXCIgZD1cIk0yMCw2SDE4VjJINlY2SDRBMiwyLDAsMCwwLDIsOHY5YTIsMiwwLDAsMCwyLDJINnYzSDE4VjE5aDJhMiwyLDAsMCwwLDItMlY4QTIsMiwwLDAsMCwyMCw2Wk04LDRoOFY2SDhabTgsMTZIOFYxNmg4Wm00LTNIMThWMTRINnYzSDRWOEgyMFptLTQtN2gydjJIMTZabS0zLDBoMnYySDEzWlwiPjwvcGF0aD48L3N2Zz4nLFxyXG4gICAgICAgICAgdGl0bGU6IHRoaXMuaXNBcmFiaWMgPyBcIti32KjYp9i52KlcIiA6ICdQcmludCcsXHJcbiAgICAgICAgICBvbkNsaWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMucGRmdHJvblNlcnZpY2UuaW5zdGFuY2UucHJpbnQoKTtcclxuICAgICAgICAgICAgdGhpcy5ldmVudHMubmV4dCgncHJpbnQnKTtcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH0pO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy53ZWJWaWV3ZXJJbnN0YW5jZS5kaXNhYmxlRWxlbWVudHMoW1xyXG4gICAgICAgICdwcmludE1vZGFsJyxcclxuICAgICAgXSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBhZGRXYXRlcm1hcmsoKSB7XHJcbiAgICBjb25zdCB1c2VyaW5mbyA9IHRoaXMubnV4ZW8ubnV4ZW9DbGllbnQudXNlci5wcm9wZXJ0aWVzO1xyXG4gICAgdGhpcy5wZGZ0cm9uU2VydmljZS5hZGRXYXRlcm1hcmsoXHJcbiAgICAgIGAke3VzZXJpbmZvLnVzZXJuYW1lfSAgICBgXHJcbiAgICAgIC8vIGAke3VzZXJpbmZvLmZpcnN0TmFtZX0gJHtcclxuICAgICAgLy8gICB1c2VyaW5mby5sYXN0TmFtZVxyXG4gICAgICAvLyB9IGBcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBsb2FkRG9jdW1lbnQoKTogdm9pZCB7XHJcbiAgICBpZiAoIXRoaXMud2ViVmlld2VySW5zdGFuY2UgfHwgKCF0aGlzLmZpbGVEYXRhICYmICF0aGlzLmZpbGVVUkwpKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGNvbnN0IHsgZG9jVmlld2VyLCBhbm5vdE1hbmFnZXIsIEFubm90YXRpb25zIH0gPSB0aGlzLndlYlZpZXdlckluc3RhbmNlO1xyXG4gICAgZG9jVmlld2VyLm9uKCdkb2N1bWVudExvYWRlZCcsICgpID0+IHtcclxuICAgICAgbGV0IGZpdE1vZGUgPSB0aGlzLndlYlZpZXdlckluc3RhbmNlLkZpdE1vZGUuRml0V2lkdGg7XHJcbiAgICAgIGlmICh0aGlzLmZpdE1vZGUgPT09ICdGaXRQYWdlJykge1xyXG4gICAgICAgIGZpdE1vZGUgPSB0aGlzLndlYlZpZXdlckluc3RhbmNlLkZpdE1vZGUuRml0UGFnZTtcclxuICAgICAgfSBlbHNlIGlmICh0aGlzLmZpdE1vZGUgPT09ICdab29tJykge1xyXG4gICAgICAgIGZpdE1vZGUgPSB0aGlzLndlYlZpZXdlckluc3RhbmNlLkZpdE1vZGUuWm9vbTtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLndlYlZpZXdlckluc3RhbmNlLnNldEZpdE1vZGUoZml0TW9kZSk7XHJcbiAgICB9KTtcclxuICAgIGlmICghdGhpcy5lZGl0TW9kZSkge1xyXG4gICAgICB0aGlzLndlYlZpZXdlckluc3RhbmNlLmFubm90TWFuYWdlci5zZXRSZWFkT25seSh0cnVlKTtcclxuICAgICAgLy8gaW5zdGFuY2UuZW5hYmxlVG9vbHMoW10pO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMuZmlsZVVSTCAmJiB0aGlzLmZpbGVVUkwubGVuZ3RoKSB7XHJcbiAgICAgIHRoaXMud2ViVmlld2VySW5zdGFuY2UubG9hZERvY3VtZW50KHRoaXMuZmlsZVVSTCwge1xyXG4gICAgICAgIHhvZHN0cmVhbWluZzogdHJ1ZSxcclxuICAgICAgICBjdXN0b21IZWFkZXJzOiB7XHJcbiAgICAgICAgICBBdXRob3JpemF0aW9uOiB0aGlzLmF1dGhIZWFkZXIsXHJcbiAgICAgICAgfSxcclxuICAgICAgICAvLyB3aXRoQ3JlZGVudGlhbHM6IHRydWUsXHJcbiAgICAgIH0pO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy53ZWJWaWV3ZXJJbnN0YW5jZS5sb2FkRG9jdW1lbnQoXHJcbiAgICAgICAgbmV3IEJsb2IoW25ldyBVaW50OEFycmF5KHRoaXMuZmlsZURhdGEpXSwgeyB0eXBlOiB0aGlzLkRPQ1VNRU5UX1RZUEUgfSksXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgZmlsZW5hbWU6IHRoaXMuZmlsZVRpdGxlLFxyXG4gICAgICAgIH1cclxuICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmlzRmV0Y2hpbmcgPSBmYWxzZTtcclxuICAgIC8vIGlmIG5vdCBuZWdlbGN0aW5nIGFkZGluZyB3YXRlciBtYXJrIHRoZW4gY2hlY2sgY29uZGl0aW9ucyBmb3IgYWRkaW5nIGl0XHJcbiAgICBpZighdGhpcy5uZWdlbGVjdEFkZGluZ1dhdGVyTWFyayl7XHJcbiAgICAgIGlmICh0aGlzLmNvcnJlc3BvbmRhbmNlICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAvLyBpZiB3ZSBuZWVkIHRvIGNoZWNrIG9uIHNlY3JlY3kgbGV2ZWwgZm9yIGFkZGluZyB3YXRlciBtYXJrIG9yIG5vdCBcclxuICAgICAgICBpZiAodGhpcy5lbnZpcm9ubWVudC5lbmFibGVWaWV3ZXJXYXRlck1hcmsgJiYgdGhpcy5zZWNyZWN5UHJvcGVydHkpIHtcclxuICAgICAgICAgIC8vIGNoZWNrIGZvciBzZWNyZWN5IGxldmVsIGJlZm9yIGFkZGluZyB3YXRlcm1hcmtcclxuICAgICAgICAgIGlmICh0aGlzLmNvcnJlc3BvbmRhbmNlLnByb3BlcnRpZXNbdGhpcy5zZWNyZWN5UHJvcGVydHldICYmIHRoaXMuY29ycmVzcG9uZGFuY2UucHJvcGVydGllc1t0aGlzLnNlY3JlY3lQcm9wZXJ0eV0gIT09ICdOb3JtYWwnKSB7XHJcbiAgICAgICAgICAgIHRoaXMuYWRkV2F0ZXJtYXJrKClcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAodGhpcy5lbnZpcm9ubWVudC5lbmFibGVWaWV3ZXJXYXRlck1hcmsgJiYgIXRoaXMuc2VjcmVjeVByb3BlcnR5KSB7XHJcbiAgICAgICAgICB0aGlzLmFkZFdhdGVybWFyaygpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgZXhwb3J0QXNCbG9iKCk6IFByb21pc2U8QmxvYj4ge1xyXG4gICAgY29uc3QgZG9jID0gdGhpcy53ZWJWaWV3ZXJJbnN0YW5jZS5kb2NWaWV3ZXIuZ2V0RG9jdW1lbnQoKTtcclxuICAgIGNvbnN0IHhmZGZTdHJpbmcgPVxyXG4gICAgICBhd2FpdCB0aGlzLndlYlZpZXdlckluc3RhbmNlLmFubm90TWFuYWdlci5leHBvcnRBbm5vdGF0aW9ucygpO1xyXG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IGRvYy5nZXRGaWxlRGF0YSh7XHJcbiAgICAgIC8vIHNhdmVzIHRoZSBkb2N1bWVudCB3aXRoIGFubm90YXRpb25zIGluIGl0XHJcbiAgICAgIHhmZGZTdHJpbmcsXHJcbiAgICB9KTtcclxuICAgIGNvbnN0IGFyciA9IG5ldyBVaW50OEFycmF5KGRhdGEpO1xyXG4gICAgY29uc3QgYmxvYiA9IG5ldyBCbG9iKFthcnJdLCB7IHR5cGU6IHRoaXMuRE9DVU1FTlRfVFlQRSB9KTtcclxuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoYmxvYik7XHJcbiAgfVxyXG5cclxuICB0b2dnbGVFZGl0KCk6IHZvaWQge1xyXG4gICAgaWYgKCF0aGlzLmFjdGlvbkNsaWNrZWQpIHtcclxuICAgICAgLy8gYWN0aW9uIGNsaWNrZWQgaXMgbm90IGNsaWNrZWQgdGhlbiBubyB1cGRhdGUgbW9kZSBvcGVuZWRcclxuICAgICAgdGhpcy53ZWJWaWV3ZXJJbnN0YW5jZS5kaXNhYmxlRWxlbWVudHMoW1xyXG4gICAgICAgICd0b29sYmFyR3JvdXAtU2hhcGVzJyxcclxuICAgICAgICAndG9vbGJhckdyb3VwLUVkaXQnLFxyXG4gICAgICAgICd0b29sYmFyR3JvdXAtSW5zZXJ0JyxcclxuICAgICAgICAndG9vbGJhckdyb3VwLUFubm90YXRlJyxcclxuICAgICAgXSk7XHJcbiAgICAgIHRoaXMud2ViVmlld2VySW5zdGFuY2UuYW5ub3RNYW5hZ2VyLnNldFJlYWRPbmx5KHRydWUpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgLy8gZWRpdCBtb2RlIG9wZW5lZCBhbmQgbXVzdCBiZSB3aGVuIGFjdGlvbiBpcyBjbGlja2VkXHJcbiAgICAgIGlmICh0aGlzLmVkaXRpbmdUeXBlKSB7XHJcbiAgICAgICAgdGhpcy53ZWJWaWV3ZXJJbnN0YW5jZS5kaXNhYmxlRWxlbWVudHMoW1xyXG4gICAgICAgICAgJ3Rvb2xiYXJHcm91cC1TaGFwZXMnLFxyXG4gICAgICAgICAgJ3Rvb2xiYXJHcm91cC1FZGl0JyxcclxuICAgICAgICAgICd0b29sYmFyR3JvdXAtSW5zZXJ0JyxcclxuICAgICAgICAgICd0b29sYmFyR3JvdXAtQW5ub3RhdGUnLFxyXG4gICAgICAgIF0pO1xyXG4gICAgICAgIGxldCBncm91cDtcclxuICAgICAgICBpZiAodGhpcy5lZGl0aW5nVHlwZSA9PT0gJ3NpZ25Eb2MnKSB7XHJcbiAgICAgICAgICB0aGlzLndlYlZpZXdlckluc3RhbmNlLmVuYWJsZUVsZW1lbnRzKFtcclxuICAgICAgICAgICAgJ3Rvb2xiYXJHcm91cC1JbnNlcnQnXHJcbiAgICAgICAgICBdKTtcclxuXHJcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmVkaXRpbmdUeXBlID09PSAnYW5ub3RhdGUnKSB7XHJcbiAgICAgICAgICB0aGlzLndlYlZpZXdlckluc3RhbmNlLmVuYWJsZUVsZW1lbnRzKFtcclxuICAgICAgICAgICAgJ3Rvb2xiYXJHcm91cC1TaGFwZXMnLFxyXG4gICAgICAgICAgICAndG9vbGJhckdyb3VwLUVkaXQnLFxyXG4gICAgICAgICAgICAndG9vbGJhckdyb3VwLUFubm90YXRlJyxcclxuICAgICAgICAgIF0pO1xyXG4gICAgICAgIH1cclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLndlYlZpZXdlckluc3RhbmNlLmVuYWJsZUVsZW1lbnRzKFtcclxuICAgICAgICAgICd0b29sYmFyR3JvdXAtU2hhcGVzJyxcclxuICAgICAgICAgICd0b29sYmFyR3JvdXAtRWRpdCcsXHJcbiAgICAgICAgICAndG9vbGJhckdyb3VwLUluc2VydCcsXHJcbiAgICAgICAgICAndG9vbGJhckdyb3VwLUFubm90YXRlJyxcclxuICAgICAgICBdKTtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLndlYlZpZXdlckluc3RhbmNlLmFubm90TWFuYWdlci5zZXRSZWFkT25seShmYWxzZSk7XHJcbiAgICAgIC8vIHRoaXMud2ViVmlld2VySW5zdGFuY2Uuc2V0VG9vbGJhckdyb3VwKCd0b29sYmFyR3JvdXAtQW5ub3RhdGUnKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXMpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLndlYlZpZXdlckluc3RhbmNlKSB7XHJcbiAgICAgIHRoaXMudG9nZ2xlRWRpdCgpO1xyXG4gICAgICBpZiAoXHJcbiAgICAgICAgY2hhbmdlcy51cmxGaWxlQ29udGVudCAmJlxyXG4gICAgICAgIGNoYW5nZXMudXJsRmlsZUNvbnRlbnQucHJldmlvdXNWYWx1ZSAmJlxyXG4gICAgICAgIGNoYW5nZXMudXJsRmlsZUNvbnRlbnQucHJldmlvdXNWYWx1ZSAhPT1cclxuICAgICAgICBjaGFuZ2VzLnVybEZpbGVDb250ZW50LmN1cnJlbnRWYWx1ZVxyXG4gICAgICApIHtcclxuICAgICAgICB0aGlzLm5nT25EZXN0cm95KCk7XHJcbiAgICAgICAgdGhpcy5uZ09uSW5pdCgpO1xyXG4gICAgICAgIHRoaXMubmdBZnRlclZpZXdJbml0KCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgcGRmVHJvbkV2ZW50KGV2ZW50KSB7XHJcbiAgICBpZiAodGhpc1tldmVudC5hY3Rpb25dKSB7XHJcbiAgICAgIC8vIG1ldGhvZCBleGlzdHMgaW4gdGhlIGNvbXBvbmVudFxyXG4gICAgICAvLyAgdGhpc1tldmVudC5hY3Rpb25dKGV2ZW50LnBhcmFtcyk7IC8vIGNhbGwgaXRcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gc2VhcmNoIHJlc3VsdHMgc2VjdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuXHJcbiAgcGFnZXM6IGFueTtcclxuICBzdGFuZGFyZEhlaWdodDtcclxuICBzdGFuZGFyZFdpZHRoO1xyXG4gIHBhZ2VIZWlnaHQ7XHJcbiAgcGFnZVdpZHRoO1xyXG4gIHNhdmVkQW5vdGF0aW9ucyA9IFtdO1xyXG4gIGZpbGVXaXRoT2NyID0gZmFsc2U7XHJcbiAgbmV3QW5ub3RhdGlvbnMgPSBbXTtcclxuICBteVNlYXJjaFN0cmluZ1Jlc3VsdHMgPSBbXTtcclxuICByZWNpdmVkU2VhcmNoU3RyaW5nc0FycmF5ID0gW107XHJcblxyXG4gIC8vIGFkZGluZyBzZWFyY2ggbGlzbmVyIHRvIGxpc2VuIHRvIGludGVybmFsIHNlYXJjaCBmcm9tIHVpIGFuZCB3aXRob3V0IG9jclxyXG4gIGFkZFNlYXJjaExpc3RuZXIoKSB7XHJcbiAgICBjb25zdCB7IGFubm90TWFuYWdlciwgZG9jVmlld2VyLCBBbm5vdGF0aW9ucyB9ID0gdGhpcy53ZWJWaWV3ZXJJbnN0YW5jZTtcclxuICAgIGNvbnN0IHNlYXJjaExpc3RlbmVyID0gKHNlYXJjaFBhdHRlcm4sIG9wdGlvbnMsIHJlc3VsdHMpID0+IHtcclxuXHJcbiAgICAgIHRoaXMubXlTZWFyY2hTdHJpbmdSZXN1bHRzID0gW107XHJcbiAgICAgIGlmICh0aGlzLnNhdmVkQW5vdGF0aW9ucy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgdGhpcy5zYXZlZEFub3RhdGlvbnMubWFwKGFubm90YXRpb24gPT4ge1xyXG4gICAgICAgICAgYW5ub3RhdGlvbi5IaWRkZW4gPSB0cnVlO1xyXG4gICAgICAgICAgLy8gQWx3YXlzIHJlZHJhdyBhbm5vdGF0aW9uIGlmIHJlbmRlcmluZyB3YXMgdXBkYXRlZFxyXG4gICAgICAgICAgYW5ub3RNYW5hZ2VyLnJlZHJhd0Fubm90YXRpb24oYW5ub3RhdGlvbik7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgICAgLy8gZG9uJ3QgZG8gYW55IHNlYXJjaCB1bnRpbCB0aGVyZSBpcyBhIHNlYXJjaCBwYXR0ZXJuXHJcbiAgICAgIGlmIChzZWFyY2hQYXR0ZXJuLnRyaW0oKS5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgLy8gYWRkIHJlZGFjdGlvbiBhbm5vdGF0aW9uIGZvciBlYWNoIHNlYXJjaCByZXN1bHRcclxuICAgICAgICB0aGlzLm5ld0Fubm90YXRpb25zID0gcmVzdWx0cy5tYXAocmVzdWx0ID0+IHtcclxuICAgICAgICAgIGNvbnN0IGFubm90YXRpb24gPSBuZXcgQW5ub3RhdGlvbnMuVGV4dEhpZ2hsaWdodEFubm90YXRpb24oKTtcclxuICAgICAgICAgIGFubm90YXRpb24uUXVhZHMgPSByZXN1bHQucXVhZHMubWFwKHF1YWQgPT4gcXVhZC5nZXRQb2ludHMoKSk7XHJcbiAgICAgICAgICBhbm5vdGF0aW9uLlBhZ2VOdW1iZXIgPSByZXN1bHQucGFnZU51bTtcclxuICAgICAgICAgIGFubm90YXRpb24uU3Ryb2tlQ29sb3IgPSBuZXcgQW5ub3RhdGlvbnMuQ29sb3IoMjUwLCAyMDYsIDAsIDAuNTAxOTYpO1xyXG4gICAgICAgICAgYW5ub3RhdGlvbi5BdXRob3IgPSB0aGlzLndlYlZpZXdlckluc3RhbmNlLmFubm90TWFuYWdlci5nZXRDdXJyZW50VXNlcigpO1xyXG4gICAgICAgICAgcmV0dXJuIGFubm90YXRpb247XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgdGhpcy5zYXZlZEFub3RhdGlvbnMucHVzaCguLi50aGlzLm5ld0Fubm90YXRpb25zKTtcclxuICAgICAgICBhbm5vdE1hbmFnZXIuYWRkQW5ub3RhdGlvbnModGhpcy5uZXdBbm5vdGF0aW9ucyk7XHJcbiAgICAgICAgYW5ub3RNYW5hZ2VyLmRyYXdBbm5vdGF0aW9uc0Zyb21MaXN0KHRoaXMubmV3QW5ub3RhdGlvbnMpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGRvY1ZpZXdlci5jbGVhclNlYXJjaFJlc3VsdHMoKTtcclxuICAgICAgfVxyXG4gICAgfTtcclxuXHJcbiAgICBkb2NWaWV3ZXIub24oJ2RvY3VtZW50TG9hZGVkJywgKCkgPT4ge1xyXG4gICAgICB0aGlzLndlYlZpZXdlckluc3RhbmNlLmFkZFNlYXJjaExpc3RlbmVyKHNlYXJjaExpc3RlbmVyKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLy8gcGVyZm9ybSBhdXRvbWF0aWMgc2VhcmNoIHdoZW4gaW50ZXJpbmcgdGhlIHBhZ2UgXHJcbiAgYXV0b21hdGljU2VhcmNoKHNlYXJjaFRleHRBcnJheSkge1xyXG4gICAgY29uc3QgeyBhbm5vdE1hbmFnZXIsIGRvY1ZpZXdlciwgQW5ub3RhdGlvbnMgfSA9IHRoaXMud2ViVmlld2VySW5zdGFuY2U7XHJcbiAgICBsZXQgc2VhcmNoT3B0aW9ucztcclxuICAgIHRoaXMud2ViVmlld2VySW5zdGFuY2Uub3BlbkVsZW1lbnRzKFsnc2VhcmNoUGFuZWwnXSk7XHJcbiAgICBkb2NWaWV3ZXIub24oJ2RvY3VtZW50TG9hZGVkJywgKCkgPT4ge1xyXG4gICAgICBjb25zdCBtb2RlID0gdGhpcy53ZWJWaWV3ZXJJbnN0YW5jZS5Db3JlQ29udHJvbHMuU2VhcmNoLk1vZGUuUEFHRV9TVE9QIHwgdGhpcy53ZWJWaWV3ZXJJbnN0YW5jZS5Db3JlQ29udHJvbHMuU2VhcmNoLk1vZGUuSElHSExJR0hUIHwgdGhpcy53ZWJWaWV3ZXJJbnN0YW5jZS5Db3JlQ29udHJvbHMuU2VhcmNoLk1vZGUuQU1CSUVOVF9TVFJJTkc7XHJcbiAgICAgIHRoaXMubXlTZWFyY2hTdHJpbmdSZXN1bHRzID0gW107IC8vIGVtcHR5IG15IHNlYXJjaCByZXN1bHQgd2hlbiBzdGFydGluZyBuZXcgc2VhcmNoXHJcbiAgICAgIGlmICh0aGlzLmZpbGVXaXRoT2NyKSB7XHJcblxyXG4gICAgICAgIC8vIGFkZCByZWRhY3Rpb24gYW5ub3RhdGlvbiBmb3IgZWFjaCBzZWFyY2ggcmVzdWx0XHJcbiAgICAgICAgY29uc3QgYW5ub3RhdGlvbiA9IG5ldyBBbm5vdGF0aW9ucy5UZXh0SGlnaGxpZ2h0QW5ub3RhdGlvbigpO1xyXG4gICAgICAgIHNlYXJjaFRleHRBcnJheS5tYXAoc2VhcmNoVGV4dCA9PiB7XHJcbiAgICAgICAgICBsZXQgbXlTZWFyY2ggPSBzZWFyY2hUZXh0LnNwbGl0KCcgJyk7XHJcbiAgICAgICAgICBpZiAobXlTZWFyY2gubGVuZ3RoID4gMSkge1xyXG4gICAgICAgICAgICAvLyB0aGVuIGkgYW0gc2VhcmNoaW5nIHdpdGggbW9yZSB0aGFuIG9uZSB3b3JkXHJcbiAgICAgICAgICAgIHRoaXMucGFnZXMucGFnZXMuZm9yRWFjaCgocGFnZSwgaW5kZXgpID0+IHtcclxuICAgICAgICAgICAgICB0aGlzLnBhZ2VIZWlnaHQgPSBwYWdlLnBhZ2VfaGVpZ2h0O1xyXG4gICAgICAgICAgICAgIHRoaXMucGFnZVdpZHRoID0gcGFnZS5wYWdlX3dpZHRoO1xyXG4gICAgICAgICAgICAgIHRoaXMuc3RhbmRhcmRIZWlnaHQgPSB0aGlzLndlYlZpZXdlckluc3RhbmNlLmRvY1ZpZXdlci5nZXRQYWdlSGVpZ2h0KChpbmRleCArIDEpKTtcclxuICAgICAgICAgICAgICB0aGlzLnN0YW5kYXJkV2lkdGggPSB0aGlzLndlYlZpZXdlckluc3RhbmNlLmRvY1ZpZXdlci5nZXRQYWdlV2lkdGgoKGluZGV4ICsgMSkpO1xyXG4gICAgICAgICAgICAgIHBhZ2Uuem9uZXMuZm9yRWFjaCh6b25lID0+IHtcclxuICAgICAgICAgICAgICAgIHpvbmUucGFyYWdyYXBocy5mb3JFYWNoKHBhcmFncmFwaCA9PiB7XHJcbiAgICAgICAgICAgICAgICAgIHBhcmFncmFwaC5saW5lcy5mb3JFYWNoKGxpbmUgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChsaW5lLnRleHQuaW5jbHVkZXMoc2VhcmNoVGV4dCkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgIHRoaXMuU2VhcmNoRm9yV29yZEluTGluZShteVNlYXJjaCwgbGluZSwgKGluZGV4ICsgMSksIHBhZ2UpXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAvLyB0aGVuIGkgYW0gc2VhcmNoaW5nIHdpdGggb25seSBvbmUgd29yZCBcclxuICAgICAgICAgICAgdGhpcy5zZWFyY2hGb3JXb3JkSW5BbGxQYWdlcyhzZWFyY2hUZXh0KVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pXHJcbiAgICAgICAgZG9jVmlld2VyLmNsZWFyU2VhcmNoUmVzdWx0cygpO1xyXG4gICAgICAgIHRoaXMuZGlzcGFsYXlTZWFyY2hSZXN1bHRzKGRvY1ZpZXdlcik7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgc2VhcmNoT3B0aW9ucyA9IHtcclxuICAgICAgICAgIC8vIElmIHRydWUsIGEgc2VhcmNoIG9mIHRoZSBlbnRpcmUgZG9jdW1lbnQgd2lsbCBiZSBwZXJmb3JtZWQuIE90aGVyd2lzZSwgYSBzaW5nbGUgc2VhcmNoIHdpbGwgYmUgcGVyZm9ybWVkLlxyXG4gICAgICAgICAgZnVsbFNlYXJjaDogdHJ1ZSxcclxuICAgICAgICAgIC8vIFRoZSBjYWxsYmFjayBmdW5jdGlvbiB0aGF0IGlzIGNhbGxlZCB3aGVuIHRoZSBzZWFyY2ggcmV0dXJucyBhIHJlc3VsdC5cclxuICAgICAgICAgIG9uUmVzdWx0OiByZXN1bHQgPT4ge1xyXG4gICAgICAgICAgICAvLyB3aXRoICdQQUdFX1NUT1AnIG1vZGUsIHRoZSBjYWxsYmFjayBpcyBpbnZva2VkIGFmdGVyIGVhY2ggcGFnZSBoYXMgYmVlbiBzZWFyY2hlZC5cclxuICAgICAgICAgICAgaWYgKHJlc3VsdC5yZXN1bHRDb2RlID09PSB0aGlzLndlYlZpZXdlckluc3RhbmNlLkNvcmVDb250cm9scy5TZWFyY2guUmVzdWx0Q29kZS5GT1VORCkge1xyXG4gICAgICAgICAgICAgIGNvbnN0IGFubm90YXRpb24gPSBuZXcgQW5ub3RhdGlvbnMuVGV4dEhpZ2hsaWdodEFubm90YXRpb24oKTtcclxuICAgICAgICAgICAgICBhbm5vdGF0aW9uLlF1YWRzID0gcmVzdWx0LnF1YWRzLm1hcChxdWFkID0+IHF1YWQuZ2V0UG9pbnRzKCkpO1xyXG4gICAgICAgICAgICAgIGNvbnNvbGUubG9nKGFubm90YXRpb24uUXVhZHMpO1xyXG4gICAgICAgICAgICAgIGFubm90YXRpb24uUGFnZU51bWJlciA9IHJlc3VsdC5wYWdlTnVtO1xyXG4gICAgICAgICAgICAgIGFubm90YXRpb24uU3Ryb2tlQ29sb3IgPSBuZXcgQW5ub3RhdGlvbnMuQ29sb3IoMjUwLCAyMDYsIDAsIDAuNTAxOTYpO1xyXG4gICAgICAgICAgICAgIGFubm90YXRpb24uQXV0aG9yID0gdGhpcy53ZWJWaWV3ZXJJbnN0YW5jZS5hbm5vdE1hbmFnZXIuZ2V0Q3VycmVudFVzZXIoKTtcclxuICAgICAgICAgICAgICB0aGlzLnNhdmVkQW5vdGF0aW9ucy5wdXNoKGFubm90YXRpb24pO1xyXG4gICAgICAgICAgICAgIGFubm90TWFuYWdlci5hZGRBbm5vdGF0aW9ucyhbYW5ub3RhdGlvbl0pO1xyXG4gICAgICAgICAgICAgIGFubm90TWFuYWdlci5kcmF3QW5ub3RhdGlvbnNGcm9tTGlzdChbYW5ub3RhdGlvbl0pO1xyXG4gICAgICAgICAgICAgIGRvY1ZpZXdlci5kaXNwbGF5QWRkaXRpb25hbFNlYXJjaFJlc3VsdHMoW3Jlc3VsdF0pO1xyXG5cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH07XHJcbiAgICAgICAgc2VhcmNoVGV4dEFycmF5Lm1hcChzZWFyY2hlZFRleHQgPT4ge1xyXG4gICAgICAgICAgZG9jVmlld2VyLnRleHRTZWFyY2hJbml0KHNlYXJjaGVkVGV4dCwgbW9kZSwgc2VhcmNoT3B0aW9ucyk7XHJcbiAgICAgICAgfSlcclxuICAgICAgfVxyXG4gICAgfSlcclxuICB9XHJcblxyXG4gIC8vIHNlYXJjaCBmb3Igc2luZ2xlIHdvcmQgaW4gYWxsIHBhZ2VzIFxyXG4gIHNlYXJjaEZvcldvcmRJbkFsbFBhZ2VzKHNlYXJjaGVkV29yZCkge1xyXG4gICAgdGhpcy5wYWdlcy5wYWdlcy5mb3JFYWNoKChwYWdlLCBpbmRleCkgPT4ge1xyXG4gICAgICB0aGlzLnBhZ2VIZWlnaHQgPSBwYWdlLnBhZ2VfaGVpZ2h0O1xyXG4gICAgICB0aGlzLnBhZ2VXaWR0aCA9IHBhZ2UucGFnZV93aWR0aDtcclxuICAgICAgdGhpcy5zdGFuZGFyZEhlaWdodCA9IHRoaXMud2ViVmlld2VySW5zdGFuY2UuZG9jVmlld2VyLmdldFBhZ2VIZWlnaHQoKGluZGV4ICsgMSkpO1xyXG4gICAgICB0aGlzLnN0YW5kYXJkV2lkdGggPSB0aGlzLndlYlZpZXdlckluc3RhbmNlLmRvY1ZpZXdlci5nZXRQYWdlV2lkdGgoKGluZGV4ICsgMSkpO1xyXG4gICAgICBjb25zdCB4ID0gKHRoaXMucGFnZVdpZHRoIC8gdGhpcy5zdGFuZGFyZFdpZHRoKTsgLy8gd2lkdGggcmF0aW9cclxuICAgICAgY29uc3QgeSA9ICh0aGlzLnBhZ2VIZWlnaHQgLyB0aGlzLnN0YW5kYXJkSGVpZ2h0KTsgLy8gaGVpZ2h0IHJhdGlvXHJcbiAgICAgIHBhZ2Uuem9uZXMuZm9yRWFjaCh6b25lID0+IHtcclxuICAgICAgICB6b25lLnBhcmFncmFwaHMuZm9yRWFjaChwYXJhZ3JhcGggPT4ge1xyXG4gICAgICAgICAgcGFyYWdyYXBoLmxpbmVzLmZvckVhY2gobGluZSA9PiB7XHJcbiAgICAgICAgICAgIGxpbmUud29yZHMuZm9yRWFjaCh3b3JkID0+IHtcclxuICAgICAgICAgICAgICBpZiAod29yZC50ZXh0LmluY2x1ZGVzKHNlYXJjaGVkV29yZCkpIHtcclxuICAgICAgICAgICAgICAgIC8vIGFubm90YXRpb24uUGFnZU51bWJlciA9IGluZGV4KzE7XHJcbiAgICAgICAgICAgICAgICBsZXQgcXVhZHMgPSBbe1xyXG4gICAgICAgICAgICAgICAgICB4MTogKHdvcmQuY29vcmRpbmF0ZXMudXBwZXJfbGVmdC54IC8geCksXHJcbiAgICAgICAgICAgICAgICAgIHgyOiAod29yZC5jb29yZGluYXRlcy5ib3R0b21fcmlnaHQueCAvIHgpLFxyXG4gICAgICAgICAgICAgICAgICB4MzogKHdvcmQuY29vcmRpbmF0ZXMuYm90dG9tX3JpZ2h0LnggLyB4KSxcclxuICAgICAgICAgICAgICAgICAgeDQ6ICh3b3JkLmNvb3JkaW5hdGVzLnVwcGVyX2xlZnQueCAvIHgpLFxyXG4gICAgICAgICAgICAgICAgICB5MTogKHdvcmQuY29vcmRpbmF0ZXMudXBwZXJfbGVmdC55IC8geSksXHJcbiAgICAgICAgICAgICAgICAgIHkyOiAod29yZC5jb29yZGluYXRlcy51cHBlcl9sZWZ0LnkgLyB5KSxcclxuICAgICAgICAgICAgICAgICAgeTM6ICh3b3JkLmNvb3JkaW5hdGVzLmJvdHRvbV9yaWdodC55IC8geSksXHJcbiAgICAgICAgICAgICAgICAgIHk0OiAod29yZC5jb29yZGluYXRlcy5ib3R0b21fcmlnaHQueSAvIHkpLFxyXG4gICAgICAgICAgICAgICAgfV1cclxuICAgICAgICAgICAgICAgIHRoaXMuaGlnbGlnaHRUZXh0KFxyXG4gICAgICAgICAgICAgICAgICBxdWFkcyxcclxuICAgICAgICAgICAgICAgICAgaW5kZXggKyAxXHJcbiAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jb25zdHJ1Y3RTZWFyY2hSZXN1bHQoc2VhcmNoZWRXb3JkLCBpbmRleCArIDEsIHF1YWRzLCBsaW5lLnRleHQpO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9KTtcclxuICAgICAgfSlcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLy8gc2VhcmNoIGZvciB3b3JkIGluIHNpbmdsZSBsaW5lIFxyXG4gIFNlYXJjaEZvcldvcmRJbkxpbmUobGlzdE9mU2VhcmNoZWRXb3JkcywgbGluZSwgcGFnZW51bWJlciwgcGFnZSkge1xyXG4gICAgdGhpcy5wYWdlSGVpZ2h0ID0gcGFnZS5wYWdlX2hlaWdodDtcclxuICAgIHRoaXMucGFnZVdpZHRoID0gcGFnZS5wYWdlX3dpZHRoO1xyXG4gICAgdGhpcy5zdGFuZGFyZEhlaWdodCA9IHRoaXMud2ViVmlld2VySW5zdGFuY2UuZG9jVmlld2VyLmdldFBhZ2VIZWlnaHQoKHBhZ2VudW1iZXIpKTtcclxuICAgIHRoaXMuc3RhbmRhcmRXaWR0aCA9IHRoaXMud2ViVmlld2VySW5zdGFuY2UuZG9jVmlld2VyLmdldFBhZ2VXaWR0aCgocGFnZW51bWJlcikpO1xyXG4gICAgY29uc3QgeCA9ICh0aGlzLnBhZ2VXaWR0aCAvIHRoaXMuc3RhbmRhcmRXaWR0aCk7IC8vIHdpZHRoIHJhdGlvXHJcbiAgICBjb25zdCB5ID0gKHRoaXMucGFnZUhlaWdodCAvIHRoaXMuc3RhbmRhcmRIZWlnaHQpOyAvLyBoZWlnaHQgcmF0aW9cclxuICAgIC8vIGZpbmQgb25seSB3b3JkcyByZWxhdGVkIHRvIG15IHNlYXJjaCBmb3JtIHRoZSBsaW5lXHJcbiAgICBsZXQgbXlGb3VuZGVkUmVzdWx0cyA9IFtdO1xyXG4gICAgbGV0IGNvcnJlY3RSZXN1bHRzID0gW107XHJcbiAgICBsaW5lLndvcmRzLmZvckVhY2goKHdvcmQsIHdvcmRJbmRleCkgPT4ge1xyXG4gICAgICBpZiAobGlzdE9mU2VhcmNoZWRXb3Jkcy5pbmRleE9mKHdvcmQudGV4dCkgPiAtMSkge1xyXG4gICAgICAgIG15Rm91bmRlZFJlc3VsdHMucHVzaCh7IHdvcmQ6IHdvcmQsIHdvcmRJbmRleDogd29yZEluZGV4IH0pXHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIC8vIGZpbmQgb25seSB3b3JkcyBleGlzdCBpbiBteSBzZWFyY2ggc2VudGVuY2UgYW5kIG5vdCBzaW5nbGUgYW5kIHJlcGVhdGVkIHdvcmRcclxuICAgIG15Rm91bmRlZFJlc3VsdHMubWFwKChyZXN1bHQsIGluZGV4KSA9PiB7XHJcbiAgICAgIGlmICgobXlGb3VuZGVkUmVzdWx0c1tpbmRleF1bJ3dvcmRJbmRleCddIC0gMSA9PT0gKG15Rm91bmRlZFJlc3VsdHNbaW5kZXggLSAxXSAmJiBteUZvdW5kZWRSZXN1bHRzW2luZGV4IC0gMV1bJ3dvcmRJbmRleCddKSkgfHxcclxuICAgICAgICAobXlGb3VuZGVkUmVzdWx0c1tpbmRleCArIDFdICYmIChteUZvdW5kZWRSZXN1bHRzW2luZGV4ICsgMV1bJ3dvcmRJbmRleCddIC0gMSA9PT0gbXlGb3VuZGVkUmVzdWx0c1tpbmRleF1bJ3dvcmRJbmRleCddKSkpIHtcclxuICAgICAgICBjb3JyZWN0UmVzdWx0cy5wdXNoKHJlc3VsdClcclxuICAgICAgfVxyXG4gICAgfSlcclxuXHJcbiAgICAvLyBoaWdobGlodCB0aGVzZSB3b3JkcyBhZnRlciBlbGVtaW5hdGluZyBhbGwgcmVwZWF0ZWQgYW5kIHJlbGF0ZWQgd29yZHNcclxuICAgIC8vIG11c3QgYmUgZm9yIGxvb3Agc3AgaSBjYW4gY29udHJvbCB0aGUgc3RlcCBpbiBlYWNoIGxvb3BcclxuICAgIGxldCBxdWFkcyA9IFtdO1xyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb3JyZWN0UmVzdWx0cy5sZW5ndGg7IChpID0gaSArIGxpc3RPZlNlYXJjaGVkV29yZHMubGVuZ3RoKSkge1xyXG4gICAgICBxdWFkcy5wdXNoKFxyXG4gICAgICAgIHtcclxuICAgICAgICAgIHgxOiAoY29ycmVjdFJlc3VsdHNbKChpICsgbGlzdE9mU2VhcmNoZWRXb3Jkcy5sZW5ndGgpIC0gMSldLndvcmQuY29vcmRpbmF0ZXMudXBwZXJfbGVmdC54IC8geCksXHJcbiAgICAgICAgICB4MjogKGNvcnJlY3RSZXN1bHRzW2ldLndvcmQuY29vcmRpbmF0ZXMuYm90dG9tX3JpZ2h0LnggLyB4KSxcclxuICAgICAgICAgIHgzOiAoY29ycmVjdFJlc3VsdHNbaV0ud29yZC5jb29yZGluYXRlcy5ib3R0b21fcmlnaHQueCAvIHgpLFxyXG4gICAgICAgICAgeDQ6IChjb3JyZWN0UmVzdWx0c1soKGkgKyBsaXN0T2ZTZWFyY2hlZFdvcmRzLmxlbmd0aCkgLSAxKV0ud29yZC5jb29yZGluYXRlcy51cHBlcl9sZWZ0LnggLyB4KSxcclxuICAgICAgICAgIHkxOiAoY29ycmVjdFJlc3VsdHNbaV0ud29yZC5jb29yZGluYXRlcy51cHBlcl9sZWZ0LnkgLyB5KSxcclxuICAgICAgICAgIHkyOiAoY29ycmVjdFJlc3VsdHNbKChpICsgbGlzdE9mU2VhcmNoZWRXb3Jkcy5sZW5ndGgpIC0gMSldLndvcmQuY29vcmRpbmF0ZXMudXBwZXJfbGVmdC55IC8geSksXHJcbiAgICAgICAgICB5MzogKGNvcnJlY3RSZXN1bHRzWygoaSArIGxpc3RPZlNlYXJjaGVkV29yZHMubGVuZ3RoKSAtIDEpXS53b3JkLmNvb3JkaW5hdGVzLmJvdHRvbV9yaWdodC55IC8geSksXHJcbiAgICAgICAgICB5NDogKGNvcnJlY3RSZXN1bHRzW2ldLndvcmQuY29vcmRpbmF0ZXMuYm90dG9tX3JpZ2h0LnkgLyB5KSxcclxuICAgICAgICB9KTtcclxuICAgICAgdGhpcy5oaWdsaWdodFRleHQoXHJcbiAgICAgICAgcXVhZHMsXHJcbiAgICAgICAgcGFnZW51bWJlclxyXG4gICAgICApO1xyXG4gICAgICB0aGlzLmNvbnN0cnVjdFNlYXJjaFJlc3VsdChsaXN0T2ZTZWFyY2hlZFdvcmRzLmpvaW4oXCIgXCIpLCBwYWdlbnVtYmVyLCBxdWFkcywgbGluZS50ZXh0KVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgY29uc3RydWN0U2VhcmNoUmVzdWx0KHNlYXJjaGVkVGV4dCwgcGFnZU51bSwgcXVhZHMsIGxpbmUpIHtcclxuICAgIGxldCBteVNlYXJjaFN0YXJ0VGV4dEluZGV4ID0gbGluZS5pbmRleE9mKHNlYXJjaGVkVGV4dCk7XHJcbiAgICBsZXQgbXlTZWVhcmNoZWRUZXh0RW5kSW5kZXggPSBteVNlYXJjaFN0YXJ0VGV4dEluZGV4ICsgc2VhcmNoZWRUZXh0Lmxlbmd0aDtcclxuICAgIGxldCBzZWFyY2hSZXN1bHRPYmplY3QgPSB7XHJcbiAgICAgIGFtYmllbnRTdHI6IGxpbmUsXHJcbiAgICAgIHJlc3VsdFN0cjogc2VhcmNoZWRUZXh0LFxyXG4gICAgICByZXN1bHRTdHJTdGFydDogbXlTZWFyY2hTdGFydFRleHRJbmRleCxcclxuICAgICAgcmVzdWx0U3RyRW5kOiBteVNlZWFyY2hlZFRleHRFbmRJbmRleCxcclxuICAgICAgcGFnZU51bTogcGFnZU51bSxcclxuICAgICAgcmVzdWx0Q29kZTogMixcclxuICAgICAgcXVhZHM6IFt7XHJcbiAgICAgICAgZWE6IHF1YWRzWzBdWyd5MyddLFxyXG4gICAgICAgIGZhOiBxdWFkc1swXVsneTQnXSxcclxuICAgICAgICBoYTogcXVhZHNbMF1bJ3gxJ10sXHJcbiAgICAgICAgaWE6IHF1YWRzWzBdWyd4MiddLFxyXG4gICAgICAgIHBCOiBxdWFkc1swXVsneDMnXSxcclxuICAgICAgICBxQjogcXVhZHNbMF1bJ3g0J10sXHJcbiAgICAgICAgckI6IHF1YWRzWzBdWyd5MSddLFxyXG4gICAgICAgIHNCOiBxdWFkc1swXVsneTInXVxyXG4gICAgICB9XVxyXG4gICAgfVxyXG4gICAgdGhpcy5teVNlYXJjaFN0cmluZ1Jlc3VsdHMucHVzaChzZWFyY2hSZXN1bHRPYmplY3QpO1xyXG4gICAgY29uc29sZS5sb2codGhpcy5teVNlYXJjaFN0cmluZ1Jlc3VsdHMpO1xyXG4gIH1cclxuXHJcbiAgZGlzcGFsYXlTZWFyY2hSZXN1bHRzKGRvY1ZpZXdlcikge1xyXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgIGRvY1ZpZXdlci5kaXNwbGF5QWRkaXRpb25hbFNlYXJjaFJlc3VsdHModGhpcy5teVNlYXJjaFN0cmluZ1Jlc3VsdHMpO1xyXG4gICAgfSwgNTAwKTtcclxuICB9XHJcblxyXG4gIC8vIGRyYXcgaGlsaWd0aGluZyBhcm91bmQgY2VydGFpbiBjaGFyYXRhY3RlcnNcclxuICBoaWdsaWdodFRleHQocXVhZHMsIHBhZ2VOdW1iZXIpIHtcclxuICAgIGNvbnN0IGhpZ2hsaWdodGluZ0Fubm90ID0gbmV3IHRoaXMud2ViVmlld2VySW5zdGFuY2UuQW5ub3RhdGlvbnMuVGV4dEhpZ2hsaWdodEFubm90YXRpb24oKTtcclxuICAgIGhpZ2hsaWdodGluZ0Fubm90LlN0cm9rZUNvbG9yID0gbmV3IHRoaXMud2ViVmlld2VySW5zdGFuY2UuQW5ub3RhdGlvbnMuQ29sb3IoMjUwLCAyMDYsIDAsIDAuNTAxOTYpO1xyXG4gICAgaGlnaGxpZ2h0aW5nQW5ub3QuUXVhZHMgPSBxdWFkcztcclxuICAgIGhpZ2hsaWdodGluZ0Fubm90LlBhZ2VOdW1iZXIgPSBwYWdlTnVtYmVyO1xyXG4gICAgaGlnaGxpZ2h0aW5nQW5ub3QuQXV0aG9yID0gdGhpcy53ZWJWaWV3ZXJJbnN0YW5jZS5hbm5vdE1hbmFnZXIuZ2V0Q3VycmVudFVzZXIoKTtcclxuICAgIHRoaXMuc2F2ZWRBbm90YXRpb25zLnB1c2goaGlnaGxpZ2h0aW5nQW5ub3QpO1xyXG4gICAgdGhpcy53ZWJWaWV3ZXJJbnN0YW5jZS5hbm5vdE1hbmFnZXIuYWRkQW5ub3RhdGlvbihoaWdobGlnaHRpbmdBbm5vdCk7XHJcblxyXG4gICAgLy8gbmVlZCB0byBkcmF3IHRoZSBhbm5vdGF0aW9uIG90aGVyd2lzZSBpdCB3b24ndCBzaG93IHVwIHVudGlsIHRoZSBwYWdlIGlzIHJlZnJlc2hlZFxyXG4gICAgdGhpcy53ZWJWaWV3ZXJJbnN0YW5jZS5hbm5vdE1hbmFnZXIucmVkcmF3QW5ub3RhdGlvbihoaWdobGlnaHRpbmdBbm5vdCk7XHJcbiAgfVxyXG5cclxuICBzZWFyY2hGbiA9IChzZWFyY2hWYWx1ZSwgb3B0aW9ucykgPT4ge1xyXG4gICAgdGhpcy5teVNlYXJjaFN0cmluZ1Jlc3VsdHMgPSBbXTtcclxuICAgIGlmICh0aGlzLnNhdmVkQW5vdGF0aW9ucy5sZW5ndGggPiAwKSB7XHJcbiAgICAgIHRoaXMuc2F2ZWRBbm90YXRpb25zLm1hcChhbm5vdGF0aW9uID0+IHtcclxuICAgICAgICBhbm5vdGF0aW9uLkhpZGRlbiA9IHRydWU7XHJcbiAgICAgICAgLy8gQWx3YXlzIHJlZHJhdyBhbm5vdGF0aW9uIGlmIHJlbmRlcmluZyB3YXMgdXBkYXRlZFxyXG4gICAgICAgIHRoaXMud2ViVmlld2VySW5zdGFuY2UuYW5ub3RNYW5hZ2VyLnJlZHJhd0Fubm90YXRpb24oYW5ub3RhdGlvbik7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgLy8gZG9uJ3QgZG8gYW55IHNlYXJjaCB1bnRpbCB0aGVyZSBpcyBhIHNlYXJjaCBwYXR0ZXJuXHJcbiAgICBpZiAoc2VhcmNoVmFsdWUudHJpbSgpLmxlbmd0aCA+IDApIHtcclxuICAgICAgaWYgKHRoaXMuZmlsZVdpdGhPY3IpIHtcclxuICAgICAgICAvLyBhZGQgcmVkYWN0aW9uIGFubm90YXRpb24gZm9yIGVhY2ggc2VhcmNoIHJlc3VsdFxyXG4gICAgICAgIC8vIGNvbnN0IGFubm90YXRpb24gPSBuZXcgQW5ub3RhdGlvbnMuVGV4dEhpZ2hsaWdodEFubm90YXRpb24oKTtcclxuICAgICAgICBsZXQgbXlTZWFyY2ggPSBzZWFyY2hWYWx1ZS5zcGxpdCgnICcpO1xyXG4gICAgICAgIGlmIChteVNlYXJjaC5sZW5ndGggPiAxKSB7XHJcbiAgICAgICAgICAvLyB0aGVuIGkgYW0gc2VhcmNoaW5nIHdpdGggbW9yZSB0aGFuIG9uZSB3b3JkXHJcbiAgICAgICAgICB0aGlzLnBhZ2VzLnBhZ2VzLmZvckVhY2goKHBhZ2UsIGluZGV4KSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMucGFnZUhlaWdodCA9IHBhZ2UucGFnZV9oZWlnaHQ7XHJcbiAgICAgICAgICAgIHRoaXMucGFnZVdpZHRoID0gcGFnZS5wYWdlX3dpZHRoO1xyXG4gICAgICAgICAgICB0aGlzLnN0YW5kYXJkSGVpZ2h0ID0gdGhpcy53ZWJWaWV3ZXJJbnN0YW5jZS5kb2NWaWV3ZXIuZ2V0UGFnZUhlaWdodCgoaW5kZXggKyAxKSk7XHJcbiAgICAgICAgICAgIHRoaXMuc3RhbmRhcmRXaWR0aCA9IHRoaXMud2ViVmlld2VySW5zdGFuY2UuZG9jVmlld2VyLmdldFBhZ2VXaWR0aCgoaW5kZXggKyAxKSk7XHJcbiAgICAgICAgICAgIHBhZ2Uuem9uZXMuZm9yRWFjaCh6b25lID0+IHtcclxuICAgICAgICAgICAgICB6b25lLnBhcmFncmFwaHMuZm9yRWFjaChwYXJhZ3JhcGggPT4ge1xyXG4gICAgICAgICAgICAgICAgcGFyYWdyYXBoLmxpbmVzLmZvckVhY2gobGluZSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgIGlmIChsaW5lLnRleHQuaW5jbHVkZXMoc2VhcmNoVmFsdWUpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5TZWFyY2hGb3JXb3JkSW5MaW5lKG15U2VhcmNoLCBsaW5lLCAoaW5kZXggKyAxKSwgcGFnZSlcclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfSlcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAvLyB0aGVuIGkgYW0gc2VhcmNoaW5nIHdpdGggb25seSBvbmUgd29yZCBcclxuICAgICAgICAgIHRoaXMuc2VhcmNoRm9yV29yZEluQWxsUGFnZXMoc2VhcmNoVmFsdWUpXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMud2ViVmlld2VySW5zdGFuY2UuZG9jVmlld2VyLmNsZWFyU2VhcmNoUmVzdWx0cygpO1xyXG4gICAgICAgIHRoaXMuZGlzcGFsYXlTZWFyY2hSZXN1bHRzKHRoaXMud2ViVmlld2VySW5zdGFuY2UuZG9jVmlld2VyKTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy53ZWJWaWV3ZXJJbnN0YW5jZS5kb2NWaWV3ZXIuY2xlYXJTZWFyY2hSZXN1bHRzKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcblxyXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMud2ViVmlld2VySW5zdGFuY2UpIHtcclxuICAgICAgdGhpcy53ZWJWaWV3ZXJJbnN0YW5jZS5jbG9zZURvY3VtZW50KCkudGhlbigoKSA9PiB7XHJcbiAgICAgICAgY29uc29sZS5sb2coJ2RvY3VtZW50IGNsb3NlZCEnKTtcclxuICAgICAgfSk7XHJcbiAgICAgIHRoaXMucGRmdHJvblNlcnZpY2UuaW5zdGFuY2UgPSB0aGlzLndlYlZpZXdlckluc3RhbmNlID0gbnVsbDtcclxuICAgIH1cclxuICAgIHRoaXMudHJhbnNlbGF0aW9uU3Vic2NyaXRpb24gPyB0aGlzLnRyYW5zZWxhdGlvblN1YnNjcml0aW9uLnVuc3Vic2NyaWJlKCkgOiBudWxsO1xyXG4gIH1cclxufVxyXG4iLCI8ZGl2ICNmaWxlVmlld2VyIHN0eWxlPVwid2lkdGg6IDEwMCU7IGhlaWdodDogMTAwJTtcIj48L2Rpdj5cclxuIl19
812
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGRmdHJvbi5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9udXhlby1kZXZlbG9wbWVudC1mcmFtZXdvcmsvc3JjL2xpYi9jb21wb25lbnRzL3BkZi10cm9uL3BkZnRyb24vcGRmdHJvbi5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9udXhlby1kZXZlbG9wbWVudC1mcmFtZXdvcmsvc3JjL2xpYi9jb21wb25lbnRzL3BkZi10cm9uL3BkZnRyb24vcGRmdHJvbi5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLE9BQU8sRUFHTixTQUFTLEVBRVQsWUFBWSxFQUNaLE1BQU0sRUFDTixLQUFLLEVBSUwsTUFBTSxFQUNOLFNBQVMsRUFDVCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLFNBQVMsTUFBTSxvQkFBb0IsQ0FBQztBQUczQyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDaEQsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLDRCQUE0QixDQUFDOzs7Ozs7QUFLeEQ7Ozs7Ozs7Ozs7OztHQVlHO0FBT0gsTUFBTSxPQUFPLGdCQUFnQjtJQXdENUIsWUFDUSxHQUFzQixFQUNyQixjQUE4QixFQUM5QixLQUFtQixFQUNJLFFBQWdCLEVBQ3ZDLGtCQUFzQyxFQUN0QyxvQkFBMEMsRUFDbkIsV0FBVztRQU5uQyxRQUFHLEdBQUgsR0FBRyxDQUFtQjtRQUNyQixtQkFBYyxHQUFkLGNBQWMsQ0FBZ0I7UUFDOUIsVUFBSyxHQUFMLEtBQUssQ0FBYztRQUNJLGFBQVEsR0FBUixRQUFRLENBQVE7UUFDdkMsdUJBQWtCLEdBQWxCLGtCQUFrQixDQUFvQjtRQUN0Qyx5QkFBb0IsR0FBcEIsb0JBQW9CLENBQXNCO1FBQ25CLGdCQUFXLEdBQVgsV0FBVyxDQUFBOztRQXpEbEMsa0JBQWEsR0FBRyxLQUFLLENBQUMsQ0FBQyw0RUFBNEU7UUFVNUcsa0JBQWEsR0FBRyxpQkFBaUIsQ0FBQztRQUlsQyxZQUFPLEdBQW9DLFVBQVUsQ0FBQztRQVc3QyxpQkFBWSxHQUFHLEVBQUUsQ0FBQyxDQUFDLDBDQUEwQztRQUU3RCxtQkFBYyxHQUFHLEtBQUssQ0FBQyxDQUFDLG9GQUFvRjtRQUMzRyx3QkFBbUIsR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDLENBQUMsa0NBQWtDO1FBRTdFLHlCQUFvQixHQUFHLEtBQUssQ0FBQyxDQUFDLHVEQUF1RDtRQUVyRiw0QkFBdUIsR0FBRyxJQUFJLENBQUMsQ0FBQyx5Q0FBeUM7UUFDekUseUJBQW9CLEdBQUcsSUFBSSxDQUFDLENBQUMsc0NBQXNDO1FBQ25FLDRCQUF1QixHQUFHLEtBQUssQ0FBQyxDQUFDLHlHQUF5RztRQUV6SSxzQkFBaUIsR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDLENBQUMsMkNBQTJDO1FBRTdGLFdBQU0sR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDO1FBQ2xCLG1CQUFjLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQyxDQUFDLHNDQUFzQztRQUNyRixrQkFBYSxHQUFHLElBQUksQ0FBQyxDQUFDLG1FQUFtRTtRQUN6Rix1QkFBa0IsR0FBRyxJQUFJLENBQUMsQ0FBQyw2RUFBNkU7UUFDeEcsb0JBQWUsR0FBRyxLQUFLLENBQUMsQ0FBQyw4RUFBOEU7UUErU3ZHLHNDQUFhLEdBQUcsRUFBRTtZQUNqQixJQUFJLE9BQU8sR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQztZQUN0RCxJQUFJLElBQUksQ0FBQyxPQUFPLEtBQUssU0FBUyxFQUFFO2dCQUMvQixPQUFPLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUM7YUFDakQ7aUJBQU0sSUFBSSxJQUFJLENBQUMsT0FBTyxLQUFLLE1BQU0sRUFBRTtnQkFDbkMsT0FBTyxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDO2FBQzlDO1lBQ0QsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUM1QyxDQUFDLEVBQUM7UUE0SEYsb0JBQWUsR0FBRyxFQUFFLENBQUM7UUFDckIsZ0JBQVcsR0FBRyxLQUFLLENBQUM7UUFDcEIsbUJBQWMsR0FBRyxFQUFFLENBQUM7UUFDcEIsMEJBQXFCLEdBQUcsRUFBRSxDQUFDO1FBQzNCLDhCQUF5QixHQUFHLEVBQUUsQ0FBQztRQThPL0IsYUFBUSxHQUFHLENBQUMsV0FBVyxFQUFFLE9BQU8sRUFBRSxFQUFFO1lBQ25DLElBQUksQ0FBQyxxQkFBcUIsR0FBRyxFQUFFLENBQUM7WUFDaEMsSUFBSSxJQUFJLENBQUMsZUFBZSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7Z0JBQ3BDLElBQUksQ0FBQyxlQUFlLENBQUMsR0FBRyxDQUFDLENBQUMsVUFBVSxFQUFFLEVBQUU7b0JBQ3ZDLFVBQVUsQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDO29CQUN6QixvREFBb0Q7b0JBQ3BELElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxZQUFZLENBQUMsZ0JBQWdCLENBQUMsVUFBVSxDQUFDLENBQUM7Z0JBQ2xFLENBQUMsQ0FBQyxDQUFDO2FBQ0g7WUFDRCxzREFBc0Q7WUFDdEQsSUFBSSxXQUFXLENBQUMsSUFBSSxFQUFFLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtnQkFDbEMsSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFO29CQUNyQixrREFBa0Q7b0JBQ2xELGdFQUFnRTtvQkFDaEUsSUFBSSxRQUFRLEdBQUcsV0FBVyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztvQkFDdEMsSUFBSSxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTt3QkFDeEIsOENBQThDO3dCQUM5QyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLEVBQUU7NEJBQ3hDLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQzs0QkFDbkMsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDOzRCQUNqQyxJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxTQUFTLENBQUMsYUFBYSxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQzs0QkFDaEYsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsU0FBUyxDQUFDLFlBQVksQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUM7NEJBQzlFLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUU7Z0NBQzNCLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUMsU0FBUyxFQUFFLEVBQUU7b0NBQ3JDLFNBQVMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUU7d0NBQ2hDLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLEVBQUU7NENBQ3BDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxRQUFRLEVBQUUsSUFBSSxFQUFFLEtBQUssR0FBRyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7eUNBQzFEO29DQUNGLENBQUMsQ0FBQyxDQUFDO2dDQUNKLENBQUMsQ0FBQyxDQUFDOzRCQUNKLENBQUMsQ0FBQyxDQUFDO3dCQUNKLENBQUMsQ0FBQyxDQUFDO3FCQUNIO3lCQUFNO3dCQUNOLHlDQUF5Qzt3QkFDekMsSUFBSSxDQUFDLHVCQUF1QixDQUFDLFdBQVcsQ0FBQyxDQUFDO3FCQUMxQztvQkFDRCxJQUFJLENBQUMsaUJBQWlCLENBQUMsU0FBUyxDQUFDLGtCQUFrQixFQUFFLENBQUM7b0JBQ3RELElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsU0FBUyxDQUFDLENBQUM7aUJBQzdEO2FBQ0Q7aUJBQU07Z0JBQ04sSUFBSSxDQUFDLGlCQUFpQixDQUFDLFNBQVMsQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO2FBQ3REO1FBQ0YsQ0FBQyxDQUFDO0lBL3JCQyxDQUFDO0lBRUUsUUFBUTs7WUFDYixJQUFJLENBQUMsdUJBQXVCLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRTtnQkFDakYsSUFBSSxDQUFDLFFBQVEsR0FBRyxHQUFHLENBQUM7WUFDckIsQ0FBQyxDQUFDLENBQUM7WUFFSCxJQUFJLENBQUMseUJBQXlCLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUM5RixJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUU7Z0JBQ25CLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLEVBQUU7b0JBQ3BDLElBQUksQ0FBQyxhQUFhLEdBQUcsK0JBQStCLENBQUM7aUJBQ3JEO3FCQUFNLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLEVBQUU7b0JBQzVDLElBQUksQ0FBQyxhQUFhLEdBQUcsMkVBQTJFLENBQUM7aUJBQ2pHO3FCQUFNLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLEVBQUU7b0JBQzNDLElBQUksQ0FBQyxhQUFhLEdBQUcsb0JBQW9CLENBQUM7aUJBQzFDO3FCQUFNLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLEVBQUU7b0JBQzVDLElBQUksQ0FBQyxhQUFhLEdBQUcseUVBQXlFLENBQUM7aUJBQy9GO2FBQ0Q7WUFFRCxJQUFJLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxTQUFTLEVBQUU7Z0JBQ3hDLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsaUJBQWlCLENBQUMsR0FBRyxNQUFNLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxZQUFZLEVBQUUsQ0FBQztnQkFDOUYsdUJBQUEsSUFBSSx5RUFBb0IsTUFBeEIsSUFBSSxFQUFxQixJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQztnQkFDakQsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLGNBQWMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyx1QkFBQSxJQUFJLDBFQUFxQixNQUF6QixJQUFJLENBQXVCLENBQUMsQ0FBQztnQkFDNUUsSUFBSSxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMsQ0FBQztnQkFDMUQsdUJBQUEsSUFBSSwwRUFBcUIsTUFBekIsSUFBSSxDQUF1QixDQUFDO2FBQzVCO2lCQUFNO2dCQUNOLFNBQVMsQ0FDUjtvQkFDQyxJQUFJLEVBQUUsSUFBSSxDQUFDLFFBQVEsR0FBRyxrQkFBa0I7b0JBQ3hDLG1CQUFtQixFQUFFLElBQUk7b0JBQ3pCLFNBQVMsRUFBRSxJQUFJO29CQUNmLFVBQVUsRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLGlCQUFpQjtvQkFDOUMsR0FBRyxFQUFFLElBQUksQ0FBQyxRQUFRO3dCQUNqQixDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsR0FBRyxpQ0FBaUM7d0JBQ25ELENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxHQUFHLGlDQUFpQztvQkFDcEQsY0FBYyxFQUNiLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsU0FBUyxHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVE7b0JBQ3pHLGdCQUFnQixFQUFFLENBQUMsZ0JBQWdCLEVBQUUsYUFBYSxDQUFDO2lCQUNuRCxFQUNELElBQUksQ0FBQyxTQUFTLENBQUMsYUFBYSxDQUM1QixDQUFDLElBQUksQ0FBQyxDQUFPLFFBQVEsRUFBRSxFQUFFO29CQUN6Qix1QkFBQSxJQUFJLHlFQUFvQixNQUF4QixJQUFJLEVBQXFCLFFBQVEsQ0FBQyxDQUFDO2dCQUNwQyxDQUFDLENBQUEsQ0FBQyxDQUFDO2FBQ0g7UUFDRixDQUFDO0tBQUE7SUErQ0QsMkJBQTJCO1FBQzFCLE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxTQUFTLENBQUM7UUFFeEQsY0FBYyxDQUFDLEVBQUUsQ0FBQyxnQkFBZ0IsRUFBRSxHQUFHLEVBQUU7WUFDeEMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFlBQVksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsQ0FBQztRQUNoRixDQUFDLENBQUMsQ0FBQztRQUNILHlCQUF5QjtRQUN6Qix3Q0FBd0M7UUFDeEMsd0VBQXdFO1FBQ3hFLFFBQVE7UUFDUixNQUFNO0lBQ1AsQ0FBQztJQUVELGdJQUFnSTtJQUNoSSx5QkFBeUI7UUFDeEIsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUMsbUJBQW1CLEVBQUUsQ0FBQyxXQUFXLEVBQUUsTUFBTSxFQUFFLEVBQUUsUUFBUSxFQUFFLEVBQUUsRUFBRTtZQUNqRyxJQUFJLFFBQVE7Z0JBQUUsT0FBTztZQUNyQixJQUFJLENBQUMsaUJBQWlCLENBQUMsWUFBWSxDQUFDLGlCQUFpQixFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsb0JBQW9CLEVBQUUsRUFBRTtnQkFDckYsSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO1lBQ25ELENBQUMsQ0FBQyxDQUFDO1lBQ0gsZ0dBQWdHO1lBQ2hHLElBQUksSUFBSSxDQUFDLGNBQWMsRUFBRTtnQkFDeEIsSUFBSSxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxFQUFFLFVBQVUsRUFBRSxXQUFXLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUM7YUFDM0U7UUFDRixDQUFDLENBQUMsQ0FBQztJQUNKLENBQUM7SUFFRCxlQUFlO1FBQ2QsTUFBTSxjQUFjLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFNBQVMsQ0FBQztRQUN4RCxNQUFNLGFBQWEsR0FBRyxjQUFjLENBQUMsT0FBTyxDQUFDLDJCQUEyQixDQUFDLENBQUM7UUFFMUUsY0FBYyxDQUFDLEVBQUUsQ0FBQyxnQkFBZ0IsRUFBRSxHQUFHLEVBQUU7WUFDeEMsSUFBSSxJQUFJLENBQUMsYUFBYSxFQUFFO2dCQUN2QixhQUFhLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDO2dCQUN6RCxJQUFJLENBQUMsYUFBYSxHQUFHLEtBQUssQ0FBQzthQUMzQjtRQUNGLENBQUMsQ0FBQyxDQUFDO0lBQ0osQ0FBQztJQUVELHVCQUF1QjtRQUN0QixNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsU0FBUyxDQUFDO1FBQ3hELE1BQU0sbUJBQW1CLEdBQUcsY0FBYyxDQUFDLE9BQU8sQ0FBQywyQkFBMkIsQ0FBQyxDQUFDO1FBQ2hGLG1CQUFtQixDQUFDLEVBQUUsQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDLFVBQVUsRUFBRSxFQUFFO1lBQ3ZELElBQUksQ0FBQyxJQUFJLENBQUMsa0JBQWtCLEVBQUU7Z0JBQzdCLE9BQU8sQ0FBQyxHQUFHLENBQUMsMEJBQTBCLENBQUMsQ0FBQztnQkFDeEMsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUM7YUFDNUI7WUFDRCxJQUFJLENBQUMsa0JBQWtCLEdBQUcsS0FBSyxDQUFDO1FBQ2pDLENBQUMsQ0FBQyxDQUFDO0lBQ0osQ0FBQztJQUVELGtCQUFrQjtRQUNqQixNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsU0FBUyxDQUFDO1FBQ3hELE1BQU0sbUJBQW1CLEdBQUcsY0FBYyxDQUFDLE9BQU8sQ0FBQywyQkFBMkIsQ0FBQyxDQUFDO1FBQ2hGLG1CQUFtQixDQUFDLEVBQUUsQ0FBQyxpQkFBaUIsRUFBRSxDQUFDLFVBQVUsRUFBRSxFQUFFO1lBQ3hELElBQUksVUFBVSxJQUFJLElBQUksQ0FBQyxlQUFlLEVBQUU7Z0JBQ3ZDLElBQUksQ0FBQyxlQUFlLEdBQUcsS0FBSyxDQUFDO2dCQUM3QixJQUFJLENBQUMsZ0JBQWdCLENBQUMsVUFBVSxFQUFFLGNBQWMsQ0FBQyxDQUFDO2dCQUNsRCxPQUFPLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDO2FBQ3hCO1FBQ0YsQ0FBQyxDQUFDLENBQUM7SUFDSixDQUFDO0lBRUQsZ0JBQWdCLENBQUMsVUFBVSxFQUFFLGNBQWM7UUFDMUMsSUFBSSxVQUFVLENBQUMsT0FBTyxDQUFDLEVBQUU7WUFDeEIsNkRBQTZEO1lBQzdELElBQUksU0FBUyxHQUFHLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQztZQUNsRCxJQUFJLEdBQUcsR0FBRyxTQUFTLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxFQUM3QixJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFDakMsSUFBSSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFDbkIsQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQ2YsS0FBSyxHQUFHLElBQUksVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzNCLE9BQU8sQ0FBQyxFQUFFLEVBQUU7Z0JBQ1gsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUM7YUFDOUI7WUFDRCxJQUFJLElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztZQUNsQyxJQUFJLE1BQU0sR0FBRyxJQUFJLElBQUksQ0FBQyxDQUFDLEtBQUssQ0FBQyxFQUFFLGlCQUFpQixFQUFFLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7WUFDbEUsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFDO1NBQ2hFO2FBQU07WUFDTixJQUFJLENBQUMsMEJBQTBCLENBQUMsVUFBVSxFQUFFLGNBQWMsQ0FBQyxDQUFDO1NBQzVEO0lBQ0YsQ0FBQztJQUVLLDBCQUEwQixDQUFDLFVBQVUsRUFBRSxTQUFTOztZQUNyRCxnREFBZ0Q7WUFDaEQsTUFBTSxNQUFNLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUNoRCw2Q0FBNkM7WUFDN0MsTUFBTSxVQUFVLEdBQUcsU0FBUyxDQUFDLFdBQVcsRUFBRSxDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLENBQUM7WUFDaEYsbUZBQW1GO1lBQ25GLE1BQU0sQ0FBQyxNQUFNLEdBQUcsVUFBVSxDQUFDLE1BQU0sQ0FBQztZQUNsQyxNQUFNLENBQUMsS0FBSyxHQUFHLFVBQVUsQ0FBQyxLQUFLLENBQUM7WUFDaEMsTUFBTSxHQUFHLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNwQyw4RUFBOEU7WUFDOUUsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDNUMsc0NBQXNDO1lBQ3RDLFVBQVUsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLFVBQVUsQ0FBQyxDQUFDO1lBQ2pDLGlEQUFpRDtZQUNqRCxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUU7Z0JBQ3RCLHlDQUF5QztnQkFDekMsSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO2dCQUN2QyxJQUFJLE1BQU0sR0FBRyxJQUFJLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO2dCQUNwQyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUM7WUFDakUsQ0FBQyxDQUFDLENBQUM7UUFDSixDQUFDO0tBQUE7SUFFRCxnQkFBZ0I7UUFDZixNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsU0FBUyxDQUFDO1FBQ3hELE1BQU0sbUJBQW1CLEdBQUcsY0FBYyxDQUFDLE9BQU8sQ0FBQywyQkFBMkIsQ0FBQyxDQUFDO1FBQ2hGLG1CQUFtQixDQUFDLEVBQUUsQ0FBQyxrQkFBa0IsRUFBRSxDQUFDLFVBQVUsRUFBRSxLQUFLLEVBQUUsRUFBRTtZQUNoRSxPQUFPLENBQUMsR0FBRyxDQUFDLGdDQUFnQyxDQUFDLENBQUM7WUFDOUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ3JDLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLEVBQUUsSUFBSSxFQUFFLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUM7UUFDbEcsQ0FBQyxDQUFDLENBQUM7SUFDSixDQUFDO0lBRUQsaUJBQWlCO1FBQ2hCLElBQ0MsSUFBSSxDQUFDLHVCQUF1QjtZQUM1QixDQUFDLENBQUMsSUFBSSxDQUFDLHVCQUF1QjtnQkFDN0IsSUFBSSxDQUFDLGNBQWMsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQztnQkFDcEQsSUFBSSxDQUFDLGNBQWMsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxLQUFLLFFBQVEsQ0FBQyxFQUNsRTtZQUNELElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxjQUFjLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRTtnQkFDaEQsTUFBTSxDQUFDLElBQUksQ0FBQztvQkFDWCxJQUFJLEVBQUUsY0FBYztvQkFDcEIsR0FBRyxFQUFFLGtjQUFrYztvQkFDdmMsS0FBSyxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsVUFBVTtvQkFDM0MsT0FBTyxFQUFFLEdBQVMsRUFBRTt3QkFDbkIsTUFBTSxFQUFFLGNBQWMsRUFBRSxpQkFBaUIsRUFBRSxXQUFXLEVBQUUsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsWUFBWSxDQUFDO3dCQUMvRixrRUFBa0U7d0JBQ2xFLE1BQU0sV0FBVyxHQUFHLFdBQVcsQ0FBQzt3QkFDaEMsTUFBTSxPQUFPLEdBQUc7NEJBQ2YsUUFBUSxFQUFFLElBQUksQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsZ0JBQWdCOzRCQUNsRixjQUFjOzRCQUNkLEtBQUssRUFBRSxXQUFXLENBQUMsVUFBVTs0QkFDN0IsWUFBWSxFQUFFLEtBQUs7eUJBQ25CLENBQUM7d0JBRUYsSUFBSSxDQUFDLGNBQWMsQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDO3dCQUNsRCxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQzt3QkFFN0IseURBQXlEO3dCQUN6RCw4REFBOEQ7d0JBQzlELHlCQUF5Qjt3QkFDekIsa0RBQWtEO3dCQUNsRCxzQ0FBc0M7d0JBQ3RDLGdEQUFnRDt3QkFDaEQsbUNBQW1DO3dCQUNuQyw2REFBNkQ7d0JBQzdELGdDQUFnQzt3QkFDaEMsdUNBQXVDO3dCQUN2QyxvQkFBb0I7d0JBQ3BCLHVDQUF1Qzt3QkFDdkMsb0NBQW9DO3dCQUNwQyxRQUFRO3dCQUNSLElBQUk7b0JBQ0wsQ0FBQyxDQUFBO2lCQUNELENBQUMsQ0FBQztZQUNKLENBQUMsQ0FBQyxDQUFDO1NBQ0g7SUFDRixDQUFDO0lBRUQsY0FBYztRQUNiLElBQ0MsSUFBSSxDQUFDLG9CQUFvQjtZQUN6QixDQUFDLENBQUMsSUFBSSxDQUFDLG9CQUFvQjtnQkFDMUIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQztnQkFDcEQsSUFBSSxDQUFDLGNBQWMsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxLQUFLLFFBQVEsQ0FBQyxFQUNsRTtZQUNELElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxjQUFjLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRTtnQkFDaEQsTUFBTSxDQUFDLElBQUksQ0FBQztvQkFDWCxJQUFJLEVBQUUsY0FBYztvQkFDcEIsR0FBRyxFQUFFLGtXQUFrVztvQkFDdlcsS0FBSyxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsT0FBTztvQkFDeEMsT0FBTyxFQUFFLEdBQUcsRUFBRTt3QkFDYixJQUFJLENBQUMsY0FBYyxDQUFDLFFBQVEsQ0FBQyxLQUFLLEVBQUUsQ0FBQzt3QkFDckMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7b0JBQzNCLENBQUM7aUJBQ0QsQ0FBQyxDQUFDO1lBQ0osQ0FBQyxDQUFDLENBQUM7U0FDSDthQUFNO1lBQ04sSUFBSSxDQUFDLGlCQUFpQixDQUFDLGVBQWUsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUM7U0FDdkQ7SUFDRixDQUFDO0lBRUQsWUFBWTtRQUNYLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUM7UUFDeEQsSUFBSSxDQUFDLGNBQWMsQ0FBQyxZQUFZLENBQy9CLEdBQUcsUUFBUSxDQUFDLFFBQVEsTUFBTTtRQUMxQiw0QkFBNEI7UUFDNUIsc0JBQXNCO1FBQ3RCLE1BQU07U0FDTixDQUFDO0lBQ0gsQ0FBQztJQVdELFlBQVk7UUFDWCxJQUFJLENBQUMsSUFBSSxDQUFDLGlCQUFpQixJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFO1lBQ2pFLE9BQU87U0FDUDtRQUNELE1BQU0sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLFdBQVcsRUFBRSxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQztRQUN4RSxTQUFTLENBQUMsRUFBRSxDQUFDLGdCQUFnQixFQUFFLHVCQUFBLElBQUksbUNBQVcsQ0FBQyxDQUFDO1FBQ2hELElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFO1lBQ25CLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxZQUFZLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3RELDRCQUE0QjtTQUM1QjtRQUNELElBQUksSUFBSSxDQUFDLE9BQU8sSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRTtZQUN4QyxJQUFJLENBQUMsaUJBQWlCLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUU7Z0JBQ2pELFlBQVksRUFBRSxJQUFJO2dCQUNsQixhQUFhLEVBQUU7b0JBQ2QsYUFBYSxFQUFFLElBQUksQ0FBQyxVQUFVO2lCQUM5QjtnQkFDRCx5QkFBeUI7YUFDekIsQ0FBQyxDQUFDO1NBQ0g7YUFBTTtZQUNOLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxZQUFZLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxJQUFJLFVBQVUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUMsRUFBRTtnQkFDNUcsUUFBUSxFQUFFLElBQUksQ0FBQyxTQUFTO2FBQ3hCLENBQUMsQ0FBQztTQUNIO1FBRUQsSUFBSSxDQUFDLFVBQVUsR0FBRyxLQUFLLENBQUM7UUFDeEIsMEVBQTBFO1FBQzFFLElBQUksQ0FBQyxJQUFJLENBQUMsdUJBQXVCLEVBQUU7WUFDbEMsSUFBSSxJQUFJLENBQUMsY0FBYyxLQUFLLFNBQVMsRUFBRTtnQkFDdEMsb0VBQW9FO2dCQUNwRSxJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMscUJBQXFCLElBQUksSUFBSSxDQUFDLGVBQWUsRUFBRTtvQkFDbkUsaURBQWlEO29CQUNqRCxJQUNDLElBQUksQ0FBQyxjQUFjLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUM7d0JBQ3BELElBQUksQ0FBQyxjQUFjLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsS0FBSyxRQUFRLEVBQ2hFO3dCQUNELElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztxQkFDcEI7aUJBQ0Q7cUJBQU0sSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLHFCQUFxQixJQUFJLENBQUMsSUFBSSxDQUFDLGVBQWUsRUFBRTtvQkFDM0UsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO2lCQUNwQjthQUNEO1NBQ0Q7UUFDRCxJQUFJLENBQUMsR0FBRyxDQUFDLGFBQWEsRUFBRSxDQUFDO0lBQzFCLENBQUM7SUFFSyxZQUFZOztZQUNqQixNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsU0FBUyxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQzNELE1BQU0sVUFBVSxHQUFHLE1BQU0sSUFBSSxDQUFDLGlCQUFpQixDQUFDLFlBQVksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1lBQ2pGLE1BQU0sSUFBSSxHQUFHLE1BQU0sR0FBRyxDQUFDLFdBQVcsQ0FBQztnQkFDbEMsNENBQTRDO2dCQUM1QyxVQUFVO2FBQ1YsQ0FBQyxDQUFDO1lBQ0gsTUFBTSxHQUFHLEdBQUcsSUFBSSxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDakMsTUFBTSxJQUFJLEdBQUcsSUFBSSxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUMsQ0FBQztZQUMzRCxPQUFPLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDOUIsQ0FBQztLQUFBO0lBRUQsVUFBVTtRQUNULElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxFQUFFO1lBQ3hCLDJEQUEyRDtZQUMzRCxJQUFJLENBQUMsaUJBQWlCLENBQUMsZUFBZSxDQUFDO2dCQUN0QyxxQkFBcUI7Z0JBQ3JCLG1CQUFtQjtnQkFDbkIscUJBQXFCO2dCQUNyQix1QkFBdUI7YUFDdkIsQ0FBQyxDQUFDO1lBQ0gsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFlBQVksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDdEQ7YUFBTTtZQUNOLHNEQUFzRDtZQUN0RCxJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUU7Z0JBQ3JCLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxlQUFlLENBQUM7b0JBQ3RDLHFCQUFxQjtvQkFDckIsbUJBQW1CO29CQUNuQixxQkFBcUI7b0JBQ3JCLHVCQUF1QjtpQkFDdkIsQ0FBQyxDQUFDO2dCQUNILElBQUksS0FBSyxDQUFDO2dCQUNWLElBQUksSUFBSSxDQUFDLFdBQVcsS0FBSyxTQUFTLEVBQUU7b0JBQ25DLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxjQUFjLENBQUMsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDLENBQUM7aUJBQy9EO3FCQUFNLElBQUksSUFBSSxDQUFDLFdBQVcsS0FBSyxVQUFVLEVBQUU7b0JBQzNDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxjQUFjLENBQUMsQ0FBQyxxQkFBcUIsRUFBRSxtQkFBbUIsRUFBRSx1QkFBdUIsQ0FBQyxDQUFDLENBQUM7aUJBQzdHO2FBQ0Q7aUJBQU07Z0JBQ04sSUFBSSxDQUFDLGlCQUFpQixDQUFDLGNBQWMsQ0FBQztvQkFDckMscUJBQXFCO29CQUNyQixtQkFBbUI7b0JBQ25CLHFCQUFxQjtvQkFDckIsdUJBQXVCO2lCQUN2QixDQUFDLENBQUM7YUFDSDtZQUNELElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxZQUFZLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ3ZELG1FQUFtRTtTQUNuRTtJQUNGLENBQUM7SUFFRCxXQUFXLENBQUMsT0FBTztRQUNsQixJQUFJLElBQUksQ0FBQyxpQkFBaUIsRUFBRTtZQUMzQixJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDbEIsSUFDQyxPQUFPLENBQUMsY0FBYztnQkFDdEIsT0FBTyxDQUFDLGNBQWMsQ0FBQyxhQUFhO2dCQUNwQyxPQUFPLENBQUMsY0FBYyxDQUFDLGFBQWEsS0FBSyxPQUFPLENBQUMsY0FBYyxDQUFDLFlBQVksRUFDM0U7Z0JBQ0QsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO2dCQUNuQixJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7YUFDaEI7U0FDRDtJQUNGLENBQUM7SUFFTyxZQUFZLENBQUMsS0FBSztRQUN6QixJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLEVBQUU7WUFDdkIsaUNBQWlDO1lBQ2pDLGdEQUFnRDtTQUNoRDtJQUNGLENBQUM7SUFlRCwyRUFBMkU7SUFDM0UsZ0JBQWdCO1FBQ2YsTUFBTSxFQUFFLFlBQVksRUFBRSxTQUFTLEVBQUUsV0FBVyxFQUFFLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDO1FBQ3hFLE1BQU0sY0FBYyxHQUFHLENBQUMsYUFBYSxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsRUFBRTtZQUMxRCxJQUFJLENBQUMscUJBQXFCLEdBQUcsRUFBRSxDQUFDO1lBQ2hDLElBQUksSUFBSSxDQUFDLGVBQWUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO2dCQUNwQyxJQUFJLENBQUMsZUFBZSxDQUFDLEdBQUcsQ0FBQyxDQUFDLFVBQVUsRUFBRSxFQUFFO29CQUN2QyxVQUFVLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQztvQkFDekIsb0RBQW9EO29CQUNwRCxZQUFZLENBQUMsZ0JBQWdCLENBQUMsVUFBVSxDQUFDLENBQUM7Z0JBQzNDLENBQUMsQ0FBQyxDQUFDO2FBQ0g7WUFDRCxzREFBc0Q7WUFDdEQsSUFBSSxhQUFhLENBQUMsSUFBSSxFQUFFLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtnQkFDcEMsa0RBQWtEO2dCQUNsRCxJQUFJLENBQUMsY0FBYyxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRTtvQkFDNUMsTUFBTSxVQUFVLEdBQUcsSUFBSSxXQUFXLENBQUMsdUJBQXVCLEVBQUUsQ0FBQztvQkFDN0QsVUFBVSxDQUFDLEtBQUssR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUM7b0JBQ2hFLFVBQVUsQ0FBQyxVQUFVLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQztvQkFDdkMsVUFBVSxDQUFDLFdBQVcsR0FBRyxJQUFJLFdBQVcsQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUM7b0JBQ3JFLFVBQVUsQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFlBQVksQ0FBQyxjQUFjLEVBQUUsQ0FBQztvQkFDekUsT0FBTyxVQUFVLENBQUM7Z0JBQ25CLENBQUMsQ0FBQyxDQUFDO2dCQUNILElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDO2dCQUNsRCxZQUFZLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQztnQkFDakQsWUFBWSxDQUFDLHVCQUF1QixDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQzthQUMxRDtpQkFBTTtnQkFDTixTQUFTLENBQUMsa0JBQWtCLEVBQUUsQ0FBQzthQUMvQjtRQUNGLENBQUMsQ0FBQztRQUVGLFNBQVMsQ0FBQyxFQUFFLENBQUMsZ0JBQWdCLEVBQUUsR0FBRyxFQUFFO1lBQ25DLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxpQkFBaUIsQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUMxRCxDQUFDLENBQUMsQ0FBQztJQUNKLENBQUM7SUFFRCxrREFBa0Q7SUFDbEQsZUFBZSxDQUFDLGVBQWU7UUFDOUIsTUFBTSxFQUFFLFlBQVksRUFBRSxTQUFTLEVBQUUsV0FBVyxFQUFFLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDO1FBQ3hFLElBQUksYUFBYSxDQUFDO1FBQ2xCLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxZQUFZLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDO1FBQ3JELFNBQVMsQ0FBQyxFQUFFLENBQUMsZ0JBQWdCLEVBQUUsR0FBRyxFQUFFO1lBQ25DLE1BQU0sSUFBSSxHQUNULElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTO2dCQUN6RCxJQUFJLENBQUMsaUJBQWlCLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsU0FBUztnQkFDekQsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQztZQUNoRSxJQUFJLENBQUMscUJBQXFCLEdBQUcsRUFBRSxDQUFDLENBQUMsa0RBQWtEO1lBQ25GLElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRTtnQkFDckIsa0RBQWtEO2dCQUNsRCxNQUFNLFVBQVUsR0FBRyxJQUFJLFdBQVcsQ0FBQyx1QkFBdUIsRUFBRSxDQUFDO2dCQUM3RCxlQUFlLENBQUMsR0FBRyxDQUFDLENBQUMsVUFBVSxFQUFFLEVBQUU7b0JBQ2xDLElBQUksUUFBUSxHQUFHLFVBQVUsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7b0JBQ3JDLElBQUksUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7d0JBQ3hCLDhDQUE4Qzt3QkFDOUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxFQUFFOzRCQUN4QyxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUM7NEJBQ25DLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQzs0QkFDakMsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsU0FBUyxDQUFDLGFBQWEsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUM7NEJBQ2hGLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFNBQVMsQ0FBQyxZQUFZLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDOzRCQUM5RSxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFO2dDQUMzQixJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDLFNBQVMsRUFBRSxFQUFFO29DQUNyQyxTQUFTLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFO3dDQUNoQyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxFQUFFOzRDQUNuQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsUUFBUSxFQUFFLElBQUksRUFBRSxLQUFLLEdBQUcsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO3lDQUMxRDtvQ0FDRixDQUFDLENBQUMsQ0FBQztnQ0FDSixDQUFDLENBQUMsQ0FBQzs0QkFDSixDQUFDLENBQUMsQ0FBQzt3QkFDSixDQUFDLENBQUMsQ0FBQztxQkFDSDt5QkFBTTt3QkFDTix5Q0FBeUM7d0JBQ3pDLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxVQUFVLENBQUMsQ0FBQztxQkFDekM7Z0JBQ0YsQ0FBQyxDQUFDLENBQUM7Z0JBQ0gsU0FBUyxDQUFDLGtCQUFrQixFQUFFLENBQUM7Z0JBQy9CLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxTQUFTLENBQUMsQ0FBQzthQUN0QztpQkFBTTtnQkFDTixhQUFhLEdBQUc7b0JBQ2YsNEdBQTRHO29CQUM1RyxVQUFVLEVBQUUsSUFBSTtvQkFDaEIseUVBQXlFO29CQUN6RSxRQUFRLEVBQUUsQ0FBQyxNQUFNLEVBQUUsRUFBRTt3QkFDcEIsb0ZBQW9GO3dCQUNwRixJQUFJLE1BQU0sQ0FBQyxVQUFVLEtBQUssSUFBSSxDQUFDLGlCQUFpQixDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLEtBQUssRUFBRTs0QkFDdEYsTUFBTSxVQUFVLEdBQUcsSUFBSSxXQUFXLENBQUMsdUJBQXVCLEVBQUUsQ0FBQzs0QkFDN0QsVUFBVSxDQUFDLEtBQUssR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUM7NEJBQ2hFLE9BQU8sQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDOzRCQUM5QixVQUFVLENBQUMsVUFBVSxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUM7NEJBQ3ZDLFVBQVUsQ0FBQyxXQUFXLEdBQUcsSUFBSSxXQUFXLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDOzRCQUNyRSxVQUFVLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxZQUFZLENBQUMsY0FBYyxFQUFFLENBQUM7NEJBQ3pFLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDOzRCQUN0QyxZQUFZLENBQUMsY0FBYyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQzs0QkFDMUMsWUFBWSxDQUFDLHVCQUF1QixDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQzs0QkFDbkQsU0FBUyxDQUFDLDhCQUE4QixDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQzt5QkFDbkQ7b0JBQ0YsQ0FBQztpQkFDRCxDQUFDO2dCQUNGLGVBQWUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxZQUFZLEVBQUUsRUFBRTtvQkFDcEMsU0FBUyxDQUFDLGNBQWMsQ0FBQyxZQUFZLEVBQUUsSUFBSSxFQUFFLGFBQWEsQ0FBQyxDQUFDO2dCQUM3RCxDQUFDLENBQUMsQ0FBQzthQUNIO1FBQ0YsQ0FBQyxDQUFDLENBQUM7SUFDSixDQUFDO0lBRUQsc0NBQXNDO0lBQ3RDLHVCQUF1QixDQUFDLFlBQVk7UUFDbkMsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxFQUFFO1lBQ3hDLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQztZQUNuQyxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUM7WUFDakMsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsU0FBUyxDQUFDLGFBQWEsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDaEYsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsU0FBUyxDQUFDLFlBQVksQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDOUUsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsY0FBYztZQUM3RCxNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxlQUFlO1lBQ2hFLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUU7Z0JBQzNCLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUMsU0FBUyxFQUFFLEVBQUU7b0JBQ3JDLFNBQVMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUU7d0JBQ2hDLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUU7NEJBQzNCLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLEVBQUU7Z0NBQ3JDLG1DQUFtQztnQ0FDbkMsSUFBSSxLQUFLLEdBQUc7b0NBQ1g7d0NBQ0MsRUFBRSxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsVUFBVSxDQUFDLENBQUMsR0FBRyxDQUFDO3dDQUNyQyxFQUFFLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxZQUFZLENBQUMsQ0FBQyxHQUFHLENBQUM7d0NBQ3ZDLEVBQUUsRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLFlBQVksQ0FBQyxDQUFDLEdBQUcsQ0FBQzt3Q0FDdkMsRUFBRSxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsVUFBVSxDQUFDLENBQUMsR0FBRyxDQUFDO3dDQUNyQyxFQUFFLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxVQUFVLENBQUMsQ0FBQyxHQUFHLENBQUM7d0NBQ3JDLEVBQUUsRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBQyxDQUFDLEdBQUcsQ0FBQzt3Q0FDckMsRUFBRSxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsWUFBWSxDQUFDLENBQUMsR0FBRyxDQUFDO3dDQUN2QyxFQUFFLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxZQUFZLENBQUMsQ0FBQyxHQUFHLENBQUM7cUNBQ3ZDO2lDQUNELENBQUM7Z0NBQ0YsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLEVBQUUsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDO2dDQUNwQyxJQUFJLENBQUMscUJBQXFCLENBQUMsWUFBWSxFQUFFLEtBQUssR0FBRyxDQUFDLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQzs2QkFDdEU7d0JBQ0YsQ0FBQyxDQUFDLENBQUM7b0JBQ0osQ0FBQyxDQUFDLENBQUM7Z0JBQ0osQ0FBQyxDQUFDLENBQUM7WUFDSixDQUFDLENBQUMsQ0FBQztRQUNKLENBQUMsQ0FBQyxDQUFDO0lBQ0osQ0FBQztJQUVELGlDQUFpQztJQUNqQyxtQkFBbUIsQ0FBQyxtQkFBbUIsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLElBQUk7UUFDOUQsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDO1FBQ25DLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQztRQUNqQyxJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxTQUFTLENBQUMsYUFBYSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ2pGLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFNBQVMsQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDL0UsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsY0FBYztRQUM3RCxNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxlQUFlO1FBQ2hFLHFEQUFxRDtRQUNyRCxJQUFJLGdCQUFnQixHQUFHLEVBQUUsQ0FBQztRQUMxQixJQUFJLGNBQWMsR0FBRyxFQUFFLENBQUM7UUFDeEIsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLEVBQUUsU0FBUyxFQUFFLEVBQUU7WUFDdEMsSUFBSSxtQkFBbUIsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFO2dCQUNoRCxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDO2FBQzVEO1FBQ0YsQ0FBQyxDQUFDLENBQUM7UUFFSCwrRUFBK0U7UUFDL0UsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBRSxFQUFFO1lBQ3RDLElBQ0MsZ0JBQWdCLENBQUMsS0FBSyxDQUFDLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQztnQkFDdkMsQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLElBQUksZ0JBQWdCLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDO2dCQUMxRSxDQUFDLGdCQUFnQixDQUFDLEtBQUssR0FBRyxDQUFDLENBQUM7b0JBQzNCLGdCQUFnQixDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLEtBQUssZ0JBQWdCLENBQUMsS0FBSyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsRUFDdEY7Z0JBQ0QsY0FBYyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQzthQUM1QjtRQUNGLENBQUMsQ0FBQyxDQUFDO1FBRUgsd0VBQXdFO1FBQ3hFLDBEQUEwRDtRQUMxRCxJQUFJLEtBQUssR0FBRyxFQUFFLENBQUM7UUFDZixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsY0FBYyxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLG1CQUFtQixDQUFDLE1BQU0sRUFBRTtZQUM5RSxLQUFLLENBQUMsSUFBSSxDQUFDO2dCQUNWLEVBQUUsRUFBRSxjQUFjLENBQUMsQ0FBQyxHQUFHLG1CQUFtQixDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBQyxDQUFDLEdBQUcsQ0FBQztnQkFDeEYsRUFBRSxFQUFFLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLFlBQVksQ0FBQyxDQUFDLEdBQUcsQ0FBQztnQkFDekQsRUFBRSxFQUFFLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLFlBQVksQ0FBQyxDQUFDLEdBQUcsQ0FBQztnQkFDekQsRUFBRSxFQUFFLGNBQWMsQ0FBQyxDQUFDLEdBQUcsbUJBQW1CLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsVUFBVSxDQUFDLENBQUMsR0FBRyxDQUFDO2dCQUN4RixFQUFFLEVBQUUsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsVUFBVSxDQUFDLENBQUMsR0FBRyxDQUFDO2dCQUN2RCxFQUFFLEVBQUUsY0FBYyxDQUFDLENBQUMsR0FBRyxtQkFBbUIsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxVQUFVLENBQUMsQ0FBQyxHQUFHLENBQUM7Z0JBQ3hGLEVBQUUsRUFBRSxjQUFjLENBQUMsQ0FBQyxHQUFHLG1CQUFtQixDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLFlBQVksQ0FBQyxDQUFDLEdBQUcsQ0FBQztnQkFDMUYsRUFBRSxFQUFFLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLFlBQVksQ0FBQyxDQUFDLEdBQUcsQ0FBQzthQUN6RCxDQUFDLENBQUM7WUFDSCxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssRUFBRSxVQUFVLENBQUMsQ0FBQztZQUNyQyxJQUFJLENBQUMscUJBQXFCLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLFVBQVUsRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1NBQ3hGO0lBQ0YsQ0FBQztJQUVELHFCQUFxQixDQUFDLFlBQVksRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLElBQUk7UUFDdkQsSUFBSSxzQkFBc0IsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQ3hELElBQUksdUJBQXVCLEdBQUcsc0JBQXNCLEdBQUcsWUFBWSxDQUFDLE1BQU0sQ0FBQztRQUMzRSxJQUFJLGtCQUFrQixHQUFHO1lBQ3hCLFVBQVUsRUFBRSxJQUFJO1lBQ2hCLFNBQVMsRUFBRSxZQUFZO1lBQ3ZCLGNBQWMsRUFBRSxzQkFBc0I7WUFDdEMsWUFBWSxFQUFFLHVCQUF1QjtZQUNyQyxPQUFPLEVBQUUsT0FBTztZQUNoQixVQUFVLEVBQUUsQ0FBQztZQUNiLEtBQUssRUFBRTtnQkFDTjtvQkFDQyxFQUFFLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztvQkFDbEIsRUFBRSxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7b0JBQ2xCLEVBQUUsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO29CQUNsQixFQUFFLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztvQkFDbEIsRUFBRSxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7b0JBQ2xCLEVBQUUsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO29CQUNsQixFQUFFLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztvQkFDbEIsRUFBRSxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7aUJBQ2xCO2FBQ0Q7U0FDRCxDQUFDO1FBQ0YsSUFBSSxDQUFDLHFCQUFxQixDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1FBQ3BELE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLHFCQUFxQixDQUFDLENBQUM7SUFDekMsQ0FBQztJQUVELHFCQUFxQixDQUFDLFNBQVM7UUFDOUIsVUFBVSxDQUFDLEdBQUcsRUFBRTtZQUNmLFNBQVMsQ0FBQyw4QkFBOEIsQ0FBQyxJQUFJLENBQUMscUJBQXFCLENBQUMsQ0FBQztRQUN0RSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDVCxDQUFDO0lBRUQsOENBQThDO0lBQzlDLFlBQVksQ0FBQyxLQUFLLEVBQUUsVUFBVTtRQUM3QixNQUFNLGlCQUFpQixHQUFHLElBQUksSUFBSSxDQUFDLGlCQUFpQixDQUFDLFdBQVcsQ0FBQyx1QkFBdUIsRUFBRSxDQUFDO1FBQzNGLGlCQUFpQixDQUFDLFdBQVcsR0FBRyxJQUFJLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQ25HLGlCQUFpQixDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7UUFDaEMsaUJBQWlCLENBQUMsVUFBVSxHQUFHLFVBQVUsQ0FBQztRQUMxQyxpQkFBaUIsQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFlBQVksQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUNoRixJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1FBQzdDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxZQUFZLENBQUMsYUFBYSxDQUFDLGlCQUFpQixDQUFDLENBQUM7UUFFckUscUZBQXFGO1FBQ3JGLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxZQUFZLENBQUMsZ0JBQWdCLENBQUMsaUJBQWlCLENBQUMsQ0FBQztJQUN6RSxDQUFDO0lBOENELHNIQUFzSDtJQUV0SCxXQUFXO1FBQ1YsSUFBSSxJQUFJLENBQUMsb0JBQW9CLENBQUMsU0FBUyxFQUFFO1lBQ3hDLHVCQUFBLElBQUksNERBQU8sTUFBWCxJQUFJLENBQVMsQ0FBQztTQUNkO2FBQU07WUFDTixJQUFJLElBQUksQ0FBQyxpQkFBaUIsRUFBRTtnQkFDM0IsSUFBSSxDQUFDLGlCQUFpQixDQUFDLGFBQWEsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUU7b0JBQ2hELE9BQU8sQ0FBQyxHQUFHLENBQUMsa0JBQWtCLENBQUMsQ0FBQztnQkFDakMsQ0FBQyxDQUFDLENBQUM7Z0JBQ0gsSUFBSSxDQUFDLGNBQWMsQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQzthQUM3RDtZQUNELElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLHVCQUF1QixDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7U0FDakY7SUFDRixDQUFDOzs7SUFocUJBLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsYUFBYSxDQUFDLHFCQUFxQixFQUFFLENBQUM7SUFDbEUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssRUFBRTtRQUN2QyxRQUFRLEVBQUUsVUFBVTtRQUNwQixHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUMsR0FBRyxJQUFJO1FBQ3BCLElBQUksRUFBRSxHQUFHLElBQUksQ0FBQyxJQUFJLElBQUk7UUFDdEIsS0FBSyxFQUFFLEdBQUcsSUFBSSxDQUFDLEtBQUssSUFBSTtRQUN4QixNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsTUFBTSxJQUFJO1FBQzFCLE1BQU0sRUFBRSxNQUFNO1FBQ2QsT0FBTyxFQUFFLE9BQU87S0FDaEIsQ0FBQyxDQUFDO0FBQ0osQ0FBQyx1RkFFbUIsUUFBUTtJQUMzQixJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3hFLElBQUksQ0FBQyxjQUFjLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxRQUFRLENBQUM7SUFDakUsSUFBSSxJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUU7UUFDckQsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUM7UUFDeEIsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsVUFBVSxDQUFDLHNCQUFzQixDQUFDLENBQUMsQ0FBQztRQUNoRixxRUFBcUU7UUFDckUsUUFBUSxDQUFDLHVCQUF1QixDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztLQUNoRDtTQUFNO1FBQ04saUZBQWlGO1FBQ2pGLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO0tBQ3hCO0lBQ0QsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO0lBQ3RCLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO0lBQ3pCLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztJQUN2QixJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztJQUMxQixJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztJQUN4QixJQUFJLENBQUMsdUJBQXVCLEVBQUUsQ0FBQztJQUMvQixJQUFJLElBQUksQ0FBQyxvQkFBb0IsRUFBRTtRQUM5QixJQUFJLENBQUMsMkJBQTJCLEVBQUUsQ0FBQztRQUNuQyxJQUFJLENBQUMseUJBQXlCLEVBQUUsQ0FBQztLQUNqQztJQUNELElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxTQUFTLENBQUMsd0JBQXdCLENBQUM7UUFDekQsb0ZBQW9GO1FBQ3BGLFlBQVksRUFBRSxJQUFJLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLE9BQU8sQ0FBQztRQUNoRixrQkFBa0IsRUFBRSxJQUFJLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLE9BQU8sQ0FBQztLQUN0RixDQUFDLENBQUM7SUFDSCxJQUFJLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO1FBQ2hELElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLHlCQUF5QixDQUFDLENBQUM7S0FDckQ7SUFDRCxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7QUFDckIsQ0FBQzs7SUF3bkJBLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxhQUFhLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFO1FBQ2hELE9BQU8sQ0FBQyxHQUFHLENBQUMsa0JBQWtCLENBQUMsQ0FBQztJQUNqQyxDQUFDLENBQUMsQ0FBQztJQUNILElBQUksQ0FBQyxjQUFjLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQztJQUNwQyxJQUFJLENBQUMsdUJBQXVCLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO0lBRWpGLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUM7SUFDMUMsTUFBQSxJQUFJLENBQUMsY0FBYywwQ0FBRSxVQUFVLEVBQUUsQ0FBQztJQUVsQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsY0FBYyxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUU7UUFDaEQsTUFBTSxDQUFDLE9BQU8sQ0FBQyxPQUFPLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsV0FBQyxPQUFBLENBQUMsQ0FBQSxNQUFBLENBQUMsQ0FBQyxHQUFHLDBDQUFFLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQSxDQUFBLEVBQUEsQ0FBQyxDQUFDO0lBQ3pGLENBQUMsQ0FBQyxDQUFDO0lBQ0gsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLEVBQUUsdUJBQUEsSUFBSSxtQ0FBVyxDQUFDLENBQUM7SUFDeEUsbURBQW1EO0FBQ3BELENBQUM7OEdBaHlCVyxnQkFBZ0IsNkdBNERuQixhQUFhLG1GQUdiLGFBQWE7a0dBL0RWLGdCQUFnQiwrMEJBRmpCLENBQUMsVUFBVSxDQUFDLHNLQ3hDeEIsa0VBQ0E7NEZEeUNhLGdCQUFnQjtrQkFONUIsU0FBUzttQkFBQztvQkFDVixRQUFRLEVBQUUsYUFBYTtvQkFDdkIsV0FBVyxFQUFFLDBCQUEwQjtvQkFDdkMsU0FBUyxFQUFFLENBQUMsMEJBQTBCLENBQUM7b0JBQ3ZDLFNBQVMsRUFBRSxDQUFDLFVBQVUsQ0FBQztpQkFDdkI7OzBCQTZERSxNQUFNOzJCQUFDLGFBQWE7OzBCQUdwQixNQUFNOzJCQUFDLGFBQWE7NENBOURxQixTQUFTO3NCQUFuRCxTQUFTO3VCQUFDLFlBQVksRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUU7Z0JBSXpDLFFBQVE7c0JBRFAsS0FBSztnQkFFRyxhQUFhO3NCQUFyQixLQUFLO2dCQUtOLFNBQVM7c0JBRFIsS0FBSztnQkFJTixLQUFLO3NCQURKLEtBQUs7Z0JBR04sYUFBYTtzQkFEWixLQUFLO2dCQUdOLFFBQVE7c0JBRFAsS0FBSztnQkFHTixPQUFPO3NCQUROLEtBQUs7Z0JBR04sVUFBVTtzQkFEVCxLQUFLO2dCQUdOLE9BQU87c0JBRE4sS0FBSztnQkFHTixjQUFjO3NCQURiLEtBQUs7Z0JBR0csZUFBZTtzQkFBdkIsS0FBSztnQkFDRyxXQUFXO3NCQUFuQixLQUFLO2dCQUNHLGNBQWM7c0JBQXRCLEtBQUs7Z0JBQ0csWUFBWTtzQkFBcEIsS0FBSztnQkFFRyxjQUFjO3NCQUF0QixLQUFLO2dCQUNJLG1CQUFtQjtzQkFBNUIsTUFBTTtnQkFFRSxvQkFBb0I7c0JBQTVCLEtBQUs7Z0JBQ0csa0JBQWtCO3NCQUExQixLQUFLO2dCQUNHLHVCQUF1QjtzQkFBL0IsS0FBSztnQkFDRyxvQkFBb0I7c0JBQTVCLEtBQUs7Z0JBQ0csdUJBQXVCO3NCQUEvQixLQUFLO2dCQUVJLGlCQUFpQjtzQkFBMUIsTUFBTTtnQkFFUCxNQUFNO3NCQURMLE1BQU07Z0JBRUcsY0FBYztzQkFBdkIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XHJcblx0QWZ0ZXJWaWV3SW5pdCxcclxuXHRDaGFuZ2VEZXRlY3RvclJlZixcclxuXHRDb21wb25lbnQsXHJcblx0RWxlbWVudFJlZixcclxuXHRFdmVudEVtaXR0ZXIsXHJcblx0SW5qZWN0LFxyXG5cdElucHV0LFxyXG5cdE9uQ2hhbmdlcyxcclxuXHRPbkRlc3Ryb3ksXHJcblx0T25Jbml0LFxyXG5cdE91dHB1dCxcclxuXHRWaWV3Q2hpbGRcclxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IFdlYlZpZXdlciBmcm9tICdAcGRmdHJvbi93ZWJ2aWV3ZXInO1xyXG5pbXBvcnQgeyBOdXhlb1NlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9jb3JlL3NlcnZpY2VzL251eGVvL251eGVvLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBQZGZ0cm9uU2VydmljZSB9IGZyb20gJy4vcGRmdHJvbi5zZXJ2aWNlJztcclxuaW1wb3J0IHsgQVBQX0JBU0VfSFJFRiB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XHJcbmltcG9ydCB7IFNlY3VyZVBpcGUgfSBmcm9tICcuLi8uLi8uLi9waXBlcy9zZWN1cmUucGlwZSc7XHJcbmltcG9ydCB7IFRyYW5zbGF0aW9uU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL2NvcmUvc2VydmljZXMvdHJhbnNsYXRpb24vdHJhbnNsYXRpb24uc2VydmljZSc7XHJcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBTaWxlbnRQZGZUcm9uU2VydmljZSB9IGZyb20gJy4vc2lsZW50LXBkZnRyb24uc2VydmljZSc7XHJcblxyXG4vKipcclxuICogQSByZXVzYWJsZSBmaWxlIHZpZXdlciBiYXNlZCBvbiBQREZUcm9uIExpYnJhcnlcclxuICogQHRpdGxlXHJcbiAqIFBERlRyb24gVmlld2VyXHJcbiAqIEBleGFtcGxlXHJcbiAqIDxhcHAtcGRmdHJvblxyXG4gKiAgIFtmaWxlRGF0YV09XCJmaWxlRGF0YVwiXHJcbiAqICAgW2VkaXRNb2RlXT1cImZhbHNlXCJcclxuICogICBbZG9jSWRdPVwiZmlsZUlkXCJcclxuICogICBbZmlsZVRpdGxlXT1cImZpbGUudGl0bGVcIlxyXG4gKiA+XHJcbiAqIDwvYXBwLXBkZnRyb24+XHJcbiAqL1xyXG5AQ29tcG9uZW50KHtcclxuXHRzZWxlY3RvcjogJ2FwcC1wZGZ0cm9uJyxcclxuXHR0ZW1wbGF0ZVVybDogJy4vcGRmdHJvbi5jb21wb25lbnQuaHRtbCcsXHJcblx0c3R5bGVVcmxzOiBbJy4vcGRmdHJvbi5jb21wb25lbnQuc2NzcyddLFxyXG5cdHByb3ZpZGVyczogW1NlY3VyZVBpcGVdXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBQZGZ0cm9uQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3ksIE9uQ2hhbmdlcyB7XHJcblx0QFZpZXdDaGlsZCgnZmlsZVZpZXdlcicsIHsgc3RhdGljOiB0cnVlIH0pIHZpZXdlclJlZjogRWxlbWVudFJlZjtcclxuXHR3ZWJWaWV3ZXJJbnN0YW5jZTtcclxuXHQvKiogRGlzYWJsZS9FbmFibGUgQW5ub3RhdGlvbiAqL1xyXG5cdEBJbnB1dCgpXHJcblx0ZWRpdE1vZGU6IGJvb2xlYW47XHJcblx0QElucHV0KCkgYWN0aW9uQ2xpY2tlZCA9IGZhbHNlOyAvLyB1c2VkIHRvIGtub3cgaWYgdGhlcmUgaXMgYWN0aW9uIGNsaWNrZWQgb3V0c2lkZSB0byBzdGFydCBlZGl0IG1vZGUgb3Igbm90XHJcblx0aXNEb2N1bWVudExvYWRpbmc6IGJvb2xlYW47XHJcblx0aXNGZXRjaGluZzogYm9vbGVhbjtcclxuXHQvKiogRG9jdW1lbnQgdGl0bGUgKi9cclxuXHRASW5wdXQoKVxyXG5cdGZpbGVUaXRsZTogc3RyaW5nO1xyXG5cdC8qKiBEb2N1bWVudCBJRCAqL1xyXG5cdEBJbnB1dCgpXHJcblx0ZG9jSWQ6IHN0cmluZztcclxuXHRASW5wdXQoKVxyXG5cdERPQ1VNRU5UX1RZUEUgPSAnYXBwbGljYXRpb24vcGRmJztcclxuXHRASW5wdXQoKVxyXG5cdGZpbGVEYXRhO1xyXG5cdEBJbnB1dCgpXHJcblx0Zml0TW9kZTogJ0ZpdFdpZHRoJyB8ICdGaXRQYWdlJyB8ICdab29tJyA9ICdGaXRXaWR0aCc7XHJcblx0QElucHV0KClcclxuXHRhdXRoSGVhZGVyOiBzdHJpbmc7XHJcblx0QElucHV0KClcclxuXHRmaWxlVVJMOiBzdHJpbmc7XHJcblx0QElucHV0KClcclxuXHRjb3JyZXNwb25kYW5jZTtcclxuXHJcblx0QElucHV0KCkgc2VjcmVjeVByb3BlcnR5OyAvLyB1c2VkIHRvIGFkZCB3YXRlcm1hcmsgYWNvcmRpbmcgY2VydGFpbiBzZWNyZWN5IGxldmVsXHJcblx0QElucHV0KCkgZWRpdGluZ1R5cGU7XHJcblx0QElucHV0KCkgdXNlclNpZ25hdHVyZXM7XHJcblx0QElucHV0KCkgc2VhcmNoU3RyaW5nID0gJyc7IC8vIHN0cmluZyB0byBzZWFyY2ggZm9yIGl0IGluIHRoZSBkb2N1bWVudFxyXG5cclxuXHRASW5wdXQoKSB0cmFja1NpZ25hdHVyZSA9IGZhbHNlOyAvLyB0byBlbmFibGUgdHJhY2tpbmcgc2lnbmF0dXJlIHBvc2l0aW9uIGFuZCBlbWl0IGl0IGFmdGVyIGV2ZXJ5IGNoYW5nZSBpdCBzaWduYXR1cmVcclxuXHRAT3V0cHV0KCkgb25TaWduYXR1cmVUcmFja2luZyA9IG5ldyBFdmVudEVtaXR0ZXIoKTsgLy8gZXZlbnQgdG8gZW1pdCBzaWduYXR1cmUgY2hhbmdlc1xyXG5cclxuXHRASW5wdXQoKSB1c2VPdXRzaWRlQW5vdGF0aW9ucyA9IGZhbHNlOyAvLyBmbGFnZSB0byBpbmRpY2F0IGlmIHVzaW5nIG91dCBzaWRlIGFub3RhdGlvbnMgb3Igbm90XHJcblx0QElucHV0KCkgaW1wb3J0ZWRBbm90YXRpb25zOyAvLyBpbXBvcnRlZCBhbm90YXRpb25zIGZyb20gb3V0c2lkZVxyXG5cdEBJbnB1dCgpIGFsbG93RG93bmxvYWRTZWNyZXRGaWxlID0gdHJ1ZTsgLy8gYWxsb3cgb3IgcHJldmVudCBkb3dubG9hZCBzY3JlY3QgZmlsZXNcclxuXHRASW5wdXQoKSBhbGxvd1ByaW50U2VjcmV0RmlsZSA9IHRydWU7IC8vIGFsbG93IG9yIHByZXZlbnQgcHJpbnQgc2NyZWN0IGZpbGVzXHJcblx0QElucHV0KCkgbmVnZWxlY3RBZGRpbmdXYXRlck1hcmsgPSBmYWxzZTsgLy8gZG9uJ3QgYWRkIHdhdGVybWFyayBoZXJlIHdoYXRldmVyIGVhcyB0aGUgY29uZGl0aW9ucyAod2UgbWF5IGFkZCBpdCBmcm9tIG91dHNpZGUgb3Igbm90IGFkZCBpdCBhdCBhbGwpXHJcblxyXG5cdEBPdXRwdXQoKSBvbkFkZGluZ0Fub3RhdGlvbiA9IG5ldyBFdmVudEVtaXR0ZXIoKTsgLy8gdXNlZCB0byBleHBvcnQgYWxsIGFub3RhdGlvbnMgdG8gb3V0c2lkZVxyXG5cdEBPdXRwdXQoKVxyXG5cdGV2ZW50cyA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuXHRAT3V0cHV0KCkgU2lnbmF0dXJlRXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyKCk7IC8vIHVzZWQgdG8gZXhwb3J0IHNpZ25hdHVyZSB0byBvdXRzaWRlXHJcblx0Zmlyc3RUaW1lTG9hZCA9IHRydWU7IC8vZmxhZ2UgdG8gY29udHJvbCBpbXBvcnRpbmcgc2lnbmF0dXJlcyBpbiB0aGUgZmlyc3QgdGltZSBsb2FkIG9ubHlcclxuXHRmaXJzdFNpZ25hdHVyZUxvYWQgPSB0cnVlOyAvLyBmbGFnZSB0byBwYXNzIGZpcnN0IGxvYWQgb2YgaW1wb3J0ZWQgc2lnbmF0dXJlcyB3aXRob3V0IGVtaXR0aW5nIHRoZSBldmVudFxyXG5cdG5ld1NpZ25DcmVhdGlvbiA9IGZhbHNlOyAvLyBmbGFnZSB0byBpbmRpY2F0ZSBzaWduYXR1cmUgY3JlYXRpb24gaXMgY3JlYXRlZCBvciBjaG9vc2VkIGZyb20gc3RvcmVkIG9uZXNcclxuXHR0cmFuc2VsYXRpb25TdWJzY3JpdGlvbjogU3Vic2NyaXB0aW9uO1xyXG5cdGlzQXJhYmljO1xyXG5cclxuXHQvL3NpbGVudCBwZGZUcm9uXHJcblx0c2lsZW50UGRmVHJvbjogSFRNTEVsZW1lbnQ7XHJcblx0cmVzaXplT2JzZXJ2ZXI6IFJlc2l6ZU9ic2VydmVyO1xyXG5cclxuXHRjb25zdHJ1Y3RvcihcclxuXHRcdHB1YmxpYyBjZHI6IENoYW5nZURldGVjdG9yUmVmLFxyXG5cdFx0cHJpdmF0ZSBwZGZ0cm9uU2VydmljZTogUGRmdHJvblNlcnZpY2UsXHJcblx0XHRwcml2YXRlIG51eGVvOiBOdXhlb1NlcnZpY2UsXHJcblx0XHRASW5qZWN0KEFQUF9CQVNFX0hSRUYpIHByaXZhdGUgYmFzZUhyZWY6IHN0cmluZyxcclxuXHRcdHByaXZhdGUgdHJhbnNsYXRpb25TZXJ2aWNlOiBUcmFuc2xhdGlvblNlcnZpY2UsXHJcblx0XHRwcml2YXRlIHNpbGVudFBkZlRyb25TZXJ2aWNlOiBTaWxlbnRQZGZUcm9uU2VydmljZSxcclxuXHRcdEBJbmplY3QoJ2Vudmlyb25tZW50JykgcHJpdmF0ZSBlbnZpcm9ubWVudFxyXG5cdCkge31cclxuXHJcblx0YXN5bmMgbmdPbkluaXQoKTogUHJvbWlzZTx2b2lkPiB7XHJcblx0XHR0aGlzLnRyYW5zZWxhdGlvblN1YnNjcml0aW9uID0gdGhpcy50cmFuc2xhdGlvblNlcnZpY2UuaXNBcmFiaWMuc3Vic2NyaWJlKChyZXMpID0+IHtcclxuXHRcdFx0dGhpcy5pc0FyYWJpYyA9IHJlcztcclxuXHRcdH0pO1xyXG5cclxuXHRcdHRoaXMucmVjaXZlZFNlYXJjaFN0cmluZ3NBcnJheSA9IHRoaXMuc2VhcmNoU3RyaW5nLnRyaW0oKSA/IHRoaXMuc2VhcmNoU3RyaW5nLnNwbGl0KCcsJykgOiBbXTtcclxuXHRcdGlmICh0aGlzLmZpbGVUaXRsZSkge1xyXG5cdFx0XHRpZiAodGhpcy5maWxlVGl0bGUuZW5kc1dpdGgoJy5wcHQnKSkge1xyXG5cdFx0XHRcdHRoaXMuRE9DVU1FTlRfVFlQRSA9ICdhcHBsaWNhdGlvbi92bmQubXMtcG93ZXJwb2ludCc7XHJcblx0XHRcdH0gZWxzZSBpZiAodGhpcy5maWxlVGl0bGUuZW5kc1dpdGgoJy5wcHR4JykpIHtcclxuXHRcdFx0XHR0aGlzLkRPQ1VNRU5UX1RZUEUgPSAnYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLW9mZmljZWRvY3VtZW50LnByZXNlbnRhdGlvbm1sLnByZXNlbnRhdGlvbic7XHJcblx0XHRcdH0gZWxzZSBpZiAodGhpcy5maWxlVGl0bGUuZW5kc1dpdGgoJy5kb2MnKSkge1xyXG5cdFx0XHRcdHRoaXMuRE9DVU1FTlRfVFlQRSA9ICdhcHBsaWNhdGlvbi9tc3dvcmQnO1xyXG5cdFx0XHR9IGVsc2UgaWYgKHRoaXMuZmlsZVRpdGxlLmVuZHNXaXRoKCcuZG9jeCcpKSB7XHJcblx0XHRcdFx0dGhpcy5ET0NVTUVOVF9UWVBFID0gJ2FwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC53b3JkcHJvY2Vzc2luZ21sLmRvY3VtZW50JztcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cclxuXHRcdGlmICh0aGlzLnNpbGVudFBkZlRyb25TZXJ2aWNlLmlzRW5hYmxlZCkge1xyXG5cdFx0XHRbdGhpcy5zaWxlbnRQZGZUcm9uLCB0aGlzLndlYlZpZXdlckluc3RhbmNlXSA9IGF3YWl0IHRoaXMuc2lsZW50UGRmVHJvblNlcnZpY2UuZ2V0V2ViVmlld2VyKCk7XHJcblx0XHRcdHRoaXMuI2FmdGVyTG9hZFdlYlZpZXdlcih0aGlzLndlYlZpZXdlckluc3RhbmNlKTtcclxuXHRcdFx0dGhpcy5yZXNpemVPYnNlcnZlciA9IG5ldyBSZXNpemVPYnNlcnZlcigoKSA9PiB0aGlzLiN1cGRhdGVTaWxlbnRQZGZUcm9uKCkpO1xyXG5cdFx0XHR0aGlzLnJlc2l6ZU9ic2VydmVyLm9ic2VydmUodGhpcy52aWV3ZXJSZWYubmF0aXZlRWxlbWVudCk7XHJcblx0XHRcdHRoaXMuI3VwZGF0ZVNpbGVudFBkZlRyb24oKTtcclxuXHRcdH0gZWxzZSB7XHJcblx0XHRcdFdlYlZpZXdlcihcclxuXHRcdFx0XHR7XHJcblx0XHRcdFx0XHRwYXRoOiB0aGlzLmJhc2VIcmVmICsgJy9hc3NldHMvcGRmdHJvbnMnLFxyXG5cdFx0XHRcdFx0Zm9yY2VDbGllbnRTaWRlSW5pdDogdHJ1ZSxcclxuXHRcdFx0XHRcdHN0cmVhbWluZzogdHJ1ZSxcclxuXHRcdFx0XHRcdGxpY2Vuc2VLZXk6IHRoaXMuZW52aXJvbm1lbnQucGRmdHJvbkxpY2VuY2VLZXksXHJcblx0XHRcdFx0XHRjc3M6IHRoaXMuaXNBcmFiaWNcclxuXHRcdFx0XHRcdFx0PyB0aGlzLmJhc2VIcmVmICsgJy9hc3NldHMvc3R5bGVzL2FyLW15cGRmdHJvbi5jc3MnXHJcblx0XHRcdFx0XHRcdDogdGhpcy5iYXNlSHJlZiArICcvYXNzZXRzL3N0eWxlcy9lbi1teXBkZnRyb24uY3NzJyxcclxuXHRcdFx0XHRcdGFubm90YXRpb25Vc2VyOlxyXG5cdFx0XHRcdFx0XHR0aGlzLm51eGVvLm51eGVvQ2xpZW50LnVzZXIucHJvcGVydGllcy5maXJzdE5hbWUgKyAnICcgKyB0aGlzLm51eGVvLm51eGVvQ2xpZW50LnVzZXIucHJvcGVydGllcy5sYXN0TmFtZSxcclxuXHRcdFx0XHRcdGRpc2FibGVkRWxlbWVudHM6IFsnZG93bmxvYWRCdXR0b24nLCAncHJpbnRCdXR0b24nXVxyXG5cdFx0XHRcdH0sXHJcblx0XHRcdFx0dGhpcy52aWV3ZXJSZWYubmF0aXZlRWxlbWVudFxyXG5cdFx0XHQpLnRoZW4oYXN5bmMgKGluc3RhbmNlKSA9PiB7XHJcblx0XHRcdFx0dGhpcy4jYWZ0ZXJMb2FkV2ViVmlld2VyKGluc3RhbmNlKTtcclxuXHRcdFx0fSk7XHJcblx0XHR9XHJcblx0fVxyXG5cdCN1cGRhdGVTaWxlbnRQZGZUcm9uKCkge1xyXG5cdFx0Y29uc3QgcmVjdCA9IHRoaXMudmlld2VyUmVmLm5hdGl2ZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XHJcblx0XHRPYmplY3QuYXNzaWduKHRoaXMuc2lsZW50UGRmVHJvbi5zdHlsZSwge1xyXG5cdFx0XHRwb3NpdGlvbjogJ2Fic29sdXRlJyxcclxuXHRcdFx0dG9wOiBgJHtyZWN0LnRvcH1weGAsXHJcblx0XHRcdGxlZnQ6IGAke3JlY3QubGVmdH1weGAsXHJcblx0XHRcdHdpZHRoOiBgJHtyZWN0LndpZHRofXB4YCxcclxuXHRcdFx0aGVpZ2h0OiBgJHtyZWN0LmhlaWdodH1weGAsXHJcblx0XHRcdHpJbmRleDogJzk5OTknLFxyXG5cdFx0XHRkaXNwbGF5OiAnYmxvY2snXHJcblx0XHR9KTtcclxuXHR9XHJcblxyXG5cdCNhZnRlckxvYWRXZWJWaWV3ZXIoaW5zdGFuY2UpIHtcclxuXHRcdHRoaXMuaXNBcmFiaWMgPyBpbnN0YW5jZS5zZXRMYW5ndWFnZSgnYXInKSA6IGluc3RhbmNlLnNldExhbmd1YWdlKCdlbicpO1xyXG5cdFx0dGhpcy5wZGZ0cm9uU2VydmljZS5pbnN0YW5jZSA9IHRoaXMud2ViVmlld2VySW5zdGFuY2UgPSBpbnN0YW5jZTtcclxuXHRcdGlmICh0aGlzLmNvcnJlc3BvbmRhbmNlLmZhY2V0cy5pbmRleE9mKCdjdG9jcicpID4gLTEpIHtcclxuXHRcdFx0dGhpcy5maWxlV2l0aE9jciA9IHRydWU7XHJcblx0XHRcdHRoaXMucGFnZXMgPSBKU09OLnBhcnNlKHRoaXMuY29ycmVzcG9uZGFuY2UucHJvcGVydGllc1snY3RvY3I6cmVjb2duaXplZEpzb24nXSk7XHJcblx0XHRcdC8vIG92ZXJyaWRlIHNlYXJjaCBmdW50aW9uIHRvIHVzZSBvdXIgc2VhcmNoIGluIG9jciBub3QgZGVmdWx0IHNlYXJjaFxyXG5cdFx0XHRpbnN0YW5jZS5vdmVycmlkZVNlYXJjaEV4ZWN1dGlvbih0aGlzLnNlYXJjaEZuKTtcclxuXHRcdH0gZWxzZSB7XHJcblx0XHRcdC8vIGlmIG5vIG9jciB0aGVuIGFkZCBzZWFyY2ggbGlzbmVyIHRvIGxpc25lIHRvIGludGVybmFsIHNlYXJjaCBhbmQgY2F0Y2ggcmVzdWx0c1xyXG5cdFx0XHR0aGlzLmFkZFNlYXJjaExpc3RuZXIoKTtcclxuXHRcdH1cclxuXHRcdHRoaXMuYWRkUHJpbnRCdXR0b24oKTtcclxuXHRcdHRoaXMuYWRkRG93bmxvYWRCdXR0b24oKTtcclxuXHRcdHRoaXMuaW1wb3J0U2lnbmF0dXJlKCk7XHJcblx0XHR0aGlzLmV4cG9ydGluZ1NpZ25hdHVyZSgpO1xyXG5cdFx0dGhpcy5kZWxldGVBbm5vdGF0aW9uKCk7XHJcblx0XHR0aGlzLmV4cG9ydGluZ1NhdmVkU2lnbmF0dXJlKCk7XHJcblx0XHRpZiAodGhpcy51c2VPdXRzaWRlQW5vdGF0aW9ucykge1xyXG5cdFx0XHR0aGlzLmltcG9ydEFub3RhdGlvbnNGcm9tT3V0c2lkZSgpO1xyXG5cdFx0XHR0aGlzLmV4cG9ydEFub3RhdGlvbnNUb091dHNpZGUoKTtcclxuXHRcdH1cclxuXHRcdHRoaXMud2ViVmlld2VySW5zdGFuY2UuZG9jVmlld2VyLnNldFNlYXJjaEhpZ2hsaWdodENvbG9ycyh7XHJcblx0XHRcdC8vIHNldFNlYXJjaEhpZ2hsaWdodENvbG9ycyBhY2NlcHRzIGJvdGggQW5ub3RhdGlvbnMuQ29sb3Igb2JqZWN0cyBvciAncmdiYScgc3RyaW5nc1xyXG5cdFx0XHRzZWFyY2hSZXN1bHQ6IG5ldyB0aGlzLndlYlZpZXdlckluc3RhbmNlLkFubm90YXRpb25zLkNvbG9yKDI1MCwgMjA2LCAwLCAwLjUwMTk2KSxcclxuXHRcdFx0YWN0aXZlU2VhcmNoUmVzdWx0OiBuZXcgdGhpcy53ZWJWaWV3ZXJJbnN0YW5jZS5Bbm5vdGF0aW9ucy5Db2xvcigyNTAsIDIwNiwgMCwgMC41MDE5NilcclxuXHRcdH0pO1xyXG5cdFx0aWYgKHRoaXMucmVjaXZlZFNlYXJjaFN0cmluZ3NBcnJheS5sZW5ndGggIT09IDApIHtcclxuXHRcdFx0dGhpcy5hdXRvbWF0aWNTZWFyY2godGhpcy5yZWNpdmVkU2VhcmNoU3RyaW5nc0FycmF5KTtcclxuXHRcdH1cclxuXHRcdHRoaXMubG9hZERvY3VtZW50KCk7XHJcblx0fVxyXG5cclxuXHRpbXBvcnRBbm90YXRpb25zRnJvbU91dHNpZGUoKSB7XHJcblx0XHRjb25zdCBkb2N1bWVudFZpZXdlciA9IHRoaXMud2ViVmlld2VySW5zdGFuY2UuZG9jVmlld2VyO1xyXG5cclxuXHRcdGRvY3VtZW50Vmlld2VyLm9uKCdkb2N1bWVudExvYWRlZCcsICgpID0+IHtcclxuXHRcdFx0dGhpcy53ZWJWaWV3ZXJJbnN0YW5jZS5hbm5vdE1hbmFnZXIuaW1wb3J0QW5ub3RhdGlvbnModGhpcy5pbXBvcnRlZEFub3RhdGlvbnMpO1xyXG5cdFx0fSk7XHJcblx0XHQvLyAudGhlbihhbm5vdGF0aW9ucyA9PiB7XHJcblx0XHQvLyAgIGFubm90YXRpb25zLmZvckVhY2goYW5ub3RhdGlvbiA9PiB7XHJcblx0XHQvLyAgICAgdGhpcy53ZWJWaWV3ZXJJbnN0YW5jZS5hbm5vdE1hbmFnZXIucmVkcmF3QW5ub3RhdGlvbihhbm5vdGF0aW9uKTtcclxuXHRcdC8vICAgfSk7XHJcblx0XHQvLyB9KTtcclxuXHR9XHJcblxyXG5cdC8vIGV4Y3RyYWN0IGFsbCBhbm90YXRpb25zIG9uIHRoZSBmaWxlIGFuZCBzZW5kIGl0IG91dCBzaWRlIHRvIGJlIHNhdmVkIGFuZCBsZWF2ZSB0aGUgZmlsZSBhcyBpdCBpcyB3aXRob3V0IGFueSBhbm90YXRpb25zIG9uIGl0XHJcblx0ZXhwb3J0QW5vdGF0aW9uc1RvT3V0c2lkZSgpIHtcclxuXHRcdHRoaXMud2ViVmlld2VySW5zdGFuY2UuYW5ub3RNYW5hZ2VyLm9uKCdhbm5vdGF0aW9uQ2hhbmdlZCcsIChhbm5vdGF0aW9ucywgYWN0aW9uLCB7IGltcG9ydGVkIH0pID0+IHtcclxuXHRcdFx0aWYgKGltcG9ydGVkKSByZXR1cm47XHJcblx0XHRcdHRoaXMud2ViVmlld2VySW5zdGFuY2UuYW5ub3RNYW5hZ2VyLmV4cG9ydEFubm90YXRpb25zKCkudGhlbigoZXhjdHJhY3RlZEFub3RhdGlvbnMpID0+IHtcclxuXHRcdFx0XHR0aGlzLm9uQWRkaW5nQW5vdGF0aW9uLmVtaXQoZXhjdHJhY3RlZEFub3RhdGlvbnMpO1xyXG5cdFx0XHR9KTtcclxuXHRcdFx0Ly8gaWYgdHJhY2tpbmcgc2lnbmF0dXJlIGxvY2F0aW9uIGlzIGVuYWJsZSB0aGVuIGVtaXQgc2lnbmF0dXJlIG91dHNpZGUgd2l0aCBldmVyeSBjaGFuZ2VzIGluIGl0XHJcblx0XHRcdGlmICh0aGlzLnRyYWNrU2lnbmF0dXJlKSB7XHJcblx0XHRcdFx0dGhpcy5vblNpZ25hdHVyZVRyYWNraW5nLmVtaXQoeyBhbm90YXRpb25zOiBhbm5vdGF0aW9ucywgYWN0aW9uOiBhY3Rpb24gfSk7XHJcblx0XHRcdH1cclxuXHRcdH0pO1xyXG5cdH1cclxuXHJcblx0aW1wb3J0U2lnbmF0dXJlKCkge1xyXG5cdFx0Y29uc3QgZG9jdW1lbnRWaWV3ZXIgPSB0aGlzLndlYlZpZXdlckluc3RhbmNlLmRvY1ZpZXdlcjtcclxuXHRcdGNvbnN0IHNpZ25hdHVyZVRvb2wgPSBkb2N1bWVudFZpZXdlci5nZXRUb29sKCdBbm5vdGF0aW9uQ3JlYXRlU2lnbmF0dXJlJyk7XHJcblxyXG5cdFx0ZG9jdW1lbnRWaWV3ZXIub24oJ2RvY3VtZW50TG9hZGVkJywgKCkgPT4ge1xyXG5cdFx0XHRpZiAodGhpcy5maXJzdFRpbWVMb2FkKSB7XHJcblx0XHRcdFx0c2lnbmF0dXJlVG9vbC5pbXBvcnRTaWduYXR1cmVzKFsuLi50aGlzLnVzZXJTaWduYXR1cmVzXSk7XHJcblx0XHRcdFx0dGhpcy5maXJzdFRpbWVMb2FkID0gZmFsc2U7XHJcblx0XHRcdH1cclxuXHRcdH0pO1xyXG5cdH1cclxuXHJcblx0ZXhwb3J0aW5nU2F2ZWRTaWduYXR1cmUoKSB7XHJcblx0XHRjb25zdCBkb2N1bWVudFZpZXdlciA9IHRoaXMud2ViVmlld2VySW5zdGFuY2UuZG9jVmlld2VyO1xyXG5cdFx0Y29uc3QgU2lnbmF0dXJlQ3JlYXRlVG9vbCA9IGRvY3VtZW50Vmlld2VyLmdldFRvb2woJ0Fubm90YXRpb25DcmVhdGVTaWduYXR1cmUnKTtcclxuXHRcdFNpZ25hdHVyZUNyZWF0ZVRvb2wub24oJ3NpZ25hdHVyZVNhdmVkJywgKGFubm90YXRpb24pID0+IHtcclxuXHRcdFx0aWYgKCF0aGlzLmZpcnN0U2lnbmF0dXJlTG9hZCkge1xyXG5cdFx0XHRcdGNvbnNvbGUubG9nKCdzaWduYXR1cmUgc2F2ZWQgdHJpZ2VyZWQnKTtcclxuXHRcdFx0XHR0aGlzLm5ld1NpZ25DcmVhdGlvbiA9IHRydWU7XHJcblx0XHRcdH1cclxuXHRcdFx0dGhpcy5maXJzdFNpZ25hdHVyZUxvYWQgPSBmYWxzZTtcclxuXHRcdH0pO1xyXG5cdH1cclxuXHJcblx0ZXhwb3J0aW5nU2lnbmF0dXJlKCkge1xyXG5cdFx0Y29uc3QgZG9jdW1lbnRWaWV3ZXIgPSB0aGlzLndlYlZpZXdlckluc3RhbmNlLmRvY1ZpZXdlcjtcclxuXHRcdGNvbnN0IFNpZ25hdHVyZUNyZWF0ZVRvb2wgPSBkb2N1bWVudFZpZXdlci5nZXRUb29sKCdBbm5vdGF0aW9uQ3JlYXRlU2lnbmF0dXJlJyk7XHJcblx0XHRTaWduYXR1cmVDcmVhdGVUb29sLm9uKCdhbm5vdGF0aW9uQWRkZWQnLCAoYW5ub3RhdGlvbikgPT4ge1xyXG5cdFx0XHRpZiAoYW5ub3RhdGlvbiAmJiB0aGlzLm5ld1NpZ25DcmVhdGlvbikge1xyXG5cdFx0XHRcdHRoaXMubmV3U2lnbkNyZWF0aW9uID0gZmFsc2U7XHJcblx0XHRcdFx0dGhpcy5leHRyYWN0QW5vdGF0aW9uKGFubm90YXRpb24sIGRvY3VtZW50Vmlld2VyKTtcclxuXHRcdFx0XHRjb25zb2xlLmxvZyhhbm5vdGF0aW9uKTtcclxuXHRcdFx0fVxyXG5cdFx0fSk7XHJcblx0fVxyXG5cclxuXHRleHRyYWN0QW5vdGF0aW9uKGFubm90YXRpb24sIGRvY3VtZW50Vmlld2VyKSB7XHJcblx0XHRpZiAoYW5ub3RhdGlvblsnaW1hZ2UnXSkge1xyXG5cdFx0XHQvLyBjb252ZXJ0IGJhc2U2NCBzaWduYXR1cmUgaW50byBmaWxlIGFuZCBlbWl0IGl0IHRvIG91dCBzaWRlXHJcblx0XHRcdGxldCBiYXNlNjRJbWcgPSBhbm5vdGF0aW9uWydpbWFnZSddWydjdXJyZW50U3JjJ107XHJcblx0XHRcdHZhciBhcnIgPSBiYXNlNjRJbWcuc3BsaXQoJywnKSxcclxuXHRcdFx0XHRtaW1lID0gYXJyWzBdLm1hdGNoKC86KC4qPyk7LylbMV0sXHJcblx0XHRcdFx0YnN0ciA9IGF0b2IoYXJyWzFdKSxcclxuXHRcdFx0XHRuID0gYnN0ci5sZW5ndGgsXHJcblx0XHRcdFx0dThhcnIgPSBuZXcgVWludDhBcnJheShuKTtcclxuXHRcdFx0d2hpbGUgKG4tLSkge1xyXG5cdFx0XHRcdHU4YXJyW25dID0gYnN0ci5jaGFyQ29kZUF0KG4pO1xyXG5cdFx0XHR9XHJcblx0XHRcdGxldCBuYW1lID0gbWltZS5yZXBsYWNlKCcvJywgJy4nKTtcclxuXHRcdFx0bGV0IG15RmlsZSA9IG5ldyBGaWxlKFt1OGFycl0sICdteVNpZ25hdHVyZS5wbmcnLCB7IHR5cGU6IG1pbWUgfSk7XHJcblx0XHRcdHRoaXMuU2lnbmF0dXJlRXZlbnQuZW1pdCh7IGRhdGE6IG15RmlsZSwgZXZlbnROYW1lOiAnZXhwb3J0JyB9KTtcclxuXHRcdH0gZWxzZSB7XHJcblx0XHRcdHRoaXMuZXh0cmFjdEFubm90YXRpb25TaWduYXR1cmUoYW5ub3RhdGlvbiwgZG9jdW1lbnRWaWV3ZXIpO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0YXN5bmMgZXh0cmFjdEFubm90YXRpb25TaWduYXR1cmUoYW5ub3RhdGlvbiwgZG9jVmlld2VyKSB7XHJcblx0XHQvLyBDcmVhdGUgYSBuZXcgQ2FudmFzIHRvIGRyYXcgdGhlIEFubm90YXRpb24gb25cclxuXHRcdGNvbnN0IGNhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpO1xyXG5cdFx0Ly8gUmVmZXJlbmNlIHRoZSBhbm5vdGF0aW9uIGZyb20gdGhlIERvY3VtZW50XHJcblx0XHRjb25zdCBwYWdlTWF0cml4ID0gZG9jVmlld2VyLmdldERvY3VtZW50KCkuZ2V0UGFnZU1hdHJpeChhbm5vdGF0aW9uLlBhZ2VOdW1iZXIpO1xyXG5cdFx0Ly8gU2V0IHRoZSBoZWlnaHQgJiB3aWR0aCBvZiB0aGUgY2FudmFzIHRvIG1hZGVsZXRlU2F2ZWRTaWduYXR1cmV0Y2ggdGhlIGFubm90YXRpb25cclxuXHRcdGNhbnZhcy5oZWlnaHQgPSBhbm5vdGF0aW9uLkhlaWdodDtcclxuXHRcdGNhbnZhcy53aWR0aCA9IGFubm90YXRpb24uV2lkdGg7XHJcblx0XHRjb25zdCBjdHggPSBjYW52YXMuZ2V0Q29udGV4dCgnMmQnKTtcclxuXHRcdC8vIFRyYW5zbGF0ZSB0aGUgQW5ub3RhdGlvbiB0byB0aGUgdG9wIFRvcCBMZWZ0IENvcm5lciBvZiB0aGUgQ2FudmFzIGllICgwLCAwKVxyXG5cdFx0Y3R4LnRyYW5zbGF0ZSgtYW5ub3RhdGlvbi5YLCAtYW5ub3RhdGlvbi5ZKTtcclxuXHRcdC8vIERyYXcgdGhlIEFubm90YXRpb24gb250byB0aGUgQ2FudmFzXHJcblx0XHRhbm5vdGF0aW9uLmRyYXcoY3R4LCBwYWdlTWF0cml4KTtcclxuXHRcdC8vIENvbnZlcnQgdGhlIENhbnZhcyB0byBhIEJsb2IgT2JqZWN0IGZvciBVcGxvYWRcclxuXHRcdGNhbnZhcy50b0Jsb2IoKGJsb2IpID0+IHtcclxuXHRcdFx0Ly8gQ2FsbCB5b3VyIEJsb2IgU3RvcmFnZSBVcGxvYWQgRnVuY3Rpb25cclxuXHRcdFx0bGV0IG5hbWUgPSBibG9iLnR5cGUucmVwbGFjZSgnLycsICcuJyk7XHJcblx0XHRcdGxldCBteUZpbGUgPSBuZXcgRmlsZShbYmxvYl0sIG5hbWUpO1xyXG5cdFx0XHR0aGlzLlNpZ25hdHVyZUV2ZW50LmVtaXQoeyBkYXRhOiBteUZpbGUsIGV2ZW50TmFtZTogJ2V4cG9ydCcgfSk7XHJcblx0XHR9KTtcclxuXHR9XHJcblxyXG5cdGRlbGV0ZUFubm90YXRpb24oKSB7XHJcblx0XHRjb25zdCBkb2N1bWVudFZpZXdlciA9IHRoaXMud2ViVmlld2VySW5zdGFuY2UuZG9jVmlld2VyO1xyXG5cdFx0Y29uc3QgU2lnbmF0dXJlQ3JlYXRlVG9vbCA9IGRvY3VtZW50Vmlld2VyLmdldFRvb2woJ0Fubm90YXRpb25DcmVhdGVTaWduYXR1cmUnKTtcclxuXHRcdFNpZ25hdHVyZUNyZWF0ZVRvb2wub24oJ3NpZ25hdHVyZURlbGV0ZWQnLCAoYW5ub3RhdGlvbiwgaW5kZXgpID0+IHtcclxuXHRcdFx0Y29uc29sZS5sb2coJ3RoZXJlIHdlcmUgYW5ub3RhdGlvbnMgZGVsZXRlZCcpO1xyXG5cdFx0XHR0aGlzLnVzZXJTaWduYXR1cmVzLnNwbGljZShpbmRleCwgMSk7XHJcblx0XHRcdHRoaXMuU2lnbmF0dXJlRXZlbnQuZW1pdCh7IGRhdGE6IHsgc2lnbmF0dXJlOiBhbm5vdGF0aW9uLCBpbmRleDogaW5kZXggfSwgZXZlbnROYW1lOiAnZGVsZXRlJyB9KTtcclxuXHRcdH0pO1xyXG5cdH1cclxuXHJcblx0YWRkRG93bmxvYWRCdXR0b24oKSB7XHJcblx0XHRpZiAoXHJcblx0XHRcdHRoaXMuYWxsb3dEb3dubG9hZFNlY3JldEZpbGUgfHxcclxuXHRcdFx0KCF0aGlzLmFsbG93RG93bmxvYWRTZWNyZXRGaWxlICYmXHJcblx0XHRcdFx0dGhpcy5jb3JyZXNwb25kYW5jZS5wcm9wZXJ0aWVzW3RoaXMuc2VjcmVjeVByb3BlcnR5XSAmJlxyXG5cdFx0XHRcdHRoaXMuY29ycmVzcG9uZGFuY2UucHJvcGVydGllc1t0aGlzLnNlY3JlY3lQcm9wZXJ0eV0gPT09ICdOb3JtYWwnKVxyXG5cdFx0KSB7XHJcblx0XHRcdHRoaXMud2ViVmlld2VySW5zdGFuY2Uuc2V0SGVhZGVySXRlbXMoKGhlYWRlcikgPT4ge1xyXG5cdFx0XHRcdGhlYWRlci5wdXNoKHtcclxuXHRcdFx0XHRcdHR5cGU6ICdhY3Rpb25CdXR0b24nLFxyXG5cdFx0XHRcdFx0aW1nOiAnPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIyMFwiIGhlaWdodD1cIjIwXCIgZmlsbD1cImN1cnJlbnRDb2xvclwiIGNsYXNzPVwiYmkgYmktZmlsZS1lYXJtYXJrLWFycm93LWRvd25cIiB2aWV3Qm94PVwiMCAwIDE2IDE2XCI+IDxwYXRoIGQ9XCJNOC41IDYuNWEuNS41IDAgMCAwLTEgMHYzLjc5M0w2LjM1NCA5LjE0NmEuNS41IDAgMSAwLS43MDguNzA4bDIgMmEuNS41IDAgMCAwIC43MDggMGwyLTJhLjUuNSAwIDAgMC0uNzA4LS43MDhMOC41IDEwLjI5M1Y2LjV6XCIvPiA8cGF0aCBkPVwiTTE0IDE0VjQuNUw5LjUgMEg0YTIgMiAwIDAgMC0yIDJ2MTJhMiAyIDAgMCAwIDIgMmg4YTIgMiAwIDAgMCAyLTJ6TTkuNSAzQTEuNSAxLjUgMCAwIDAgMTEgNC41aDJWMTRhMSAxIDAgMCAxLTEgMUg0YTEgMSAwIDAgMS0xLTFWMmExIDEgMCAwIDEgMS0xaDUuNXYyelwiLz48L3N2Zz4nLFxyXG5cdFx0XHRcdFx0dGl0bGU6IHRoaXMuaXNBcmFiaWMgPyAn2KrZhtiy2YrZhCcgOiAnRG93bmxvYWQnLFxyXG5cdFx0XHRcdFx0b25DbGljazogYXN5bmMgKCkgPT4ge1xyXG5cdFx0XHRcdFx0XHRjb25zdCB7IERvY3VtZW50Vmlld2VyLCBBbm5vdGF0aW9uTWFuYWdlciwgU2F2ZU9wdGlvbnMgfSA9IHRoaXMud2ViVmlld2VySW5zdGFuY2UuQ29yZUNvbnRyb2xzO1xyXG5cdFx0XHRcdFx0XHQvLyBjb25zdCB4ZmRmU3RyaW5nID0gYXdhaXQgQW5ub3RhdGlvbk1hbmFnZXIuZXhwb3J0QW5ub3RhdGlvbnMoKTtcclxuXHRcdFx0XHRcdFx0Y29uc3Qgc2F2ZU9wdGlvbnMgPSBTYXZlT3B0aW9ucztcclxuXHRcdFx0XHRcdFx0Y29uc3Qgb3B0aW9ucyA9IHtcclxuXHRcdFx0XHRcdFx0XHRmaWxlbmFtZTogdGhpcy5jb3JyZXNwb25kYW5jZS50aXRsZSA/IHRoaXMuY29ycmVzcG9uZGFuY2UudGl0bGUgOiAnbXlEb2N1bWVudC5wZGYnLFxyXG5cdFx0XHRcdFx0XHRcdC8vIHhmZGZTdHJpbmcsXHJcblx0XHRcdFx0XHRcdFx0ZmxhZ3M6IHNhdmVPcHRpb25zLkxJTkVBUklaRUQsXHJcblx0XHRcdFx0XHRcdFx0ZG93bmxvYWRUeXBlOiAncGRmJ1xyXG5cdFx0XHRcdFx0XHR9O1xyXG5cclxuXHRcdFx0XHRcdFx0dGhpcy5wZGZ0cm9uU2VydmljZS5pbnN0YW5jZS5kb3dubG9hZFBkZihvcHRpb25zKTtcclxuXHRcdFx0XHRcdFx0dGhpcy5ldmVudHMubmV4dCgnZG93bmxvYWQnKTtcclxuXHJcblx0XHRcdFx0XHRcdC8vIGxldCB1cmwgPSB0aGlzLmNvcnJlc3BvbmRhbmNlLnByb3BlcnRpZXMuY29udGVudC5kYXRhO1xyXG5cdFx0XHRcdFx0XHQvLyBsZXQgZmlsZU5hbWUgPSB0aGlzLmNvcnJlc3BvbmRhbmNlLnByb3BlcnRpZXMuY29udGVudC5uYW1lO1xyXG5cdFx0XHRcdFx0XHQvLyBpZiAodXJsICYmIGZpbGVOYW1lKSB7XHJcblx0XHRcdFx0XHRcdC8vICAgbGV0IHNhZmVVcmwgPSB0aGlzLnNlY3VyZVBpcGUudHJhbnNmb3JtKHVybCk7XHJcblx0XHRcdFx0XHRcdC8vICAgc2FmZVVybC5zdWJzY3JpYmUoKHVybDogYW55KSA9PiB7XHJcblx0XHRcdFx0XHRcdC8vICAgICBjb25zdCBsaW5rID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpO1xyXG5cdFx0XHRcdFx0XHQvLyAgICAgbGluay5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xyXG5cdFx0XHRcdFx0XHQvLyAgICAgbGluay5ocmVmID0gdXJsLmNoYW5naW5nVGhpc0JyZWFrc0FwcGxpY2F0aW9uU2VjdXJpdHk7XHJcblx0XHRcdFx0XHRcdC8vICAgICBsaW5rLmRvd25sb2FkID0gZmlsZU5hbWU7XHJcblx0XHRcdFx0XHRcdC8vICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGxpbmspO1xyXG5cdFx0XHRcdFx0XHQvLyAgICAgbGluay5jbGljaygpO1xyXG5cdFx0XHRcdFx0XHQvLyAgICAgZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChsaW5rKTtcclxuXHRcdFx0XHRcdFx0Ly8gICAgIHRoaXMuZXZlbnRzLm5leHQoJ2Rvd25sb2FkJyk7XHJcblx0XHRcdFx0XHRcdC8vICAgfSk7XHJcblx0XHRcdFx0XHRcdC8vIH1cclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9KTtcclxuXHRcdFx0fSk7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHRhZGRQcmludEJ1dHRvbigpIHtcclxuXHRcdGlmIChcclxuXHRcdFx0dGhpcy5hbGxvd1ByaW50U2VjcmV0RmlsZSB8fFxyXG5cdFx0XHQoIXRoaXMuYWxsb3dQcmludFNlY3JldEZpbGUgJiZcclxuXHRcdFx0XHR0aGlzLmNvcnJlc3BvbmRhbmNlLnByb3BlcnRpZXNbdGhpcy5zZWNyZWN5UHJvcGVydHldICYmXHJcblx0XHRcdFx0dGhpcy5jb3JyZXNwb25kYW5jZS5wcm9wZXJ0aWVzW3RoaXMuc2VjcmVjeVByb3BlcnR5XSA9PT0gJ05vcm1hbCcpXHJcblx0XHQpIHtcclxuXHRcdFx0dGhpcy53ZWJWaWV3ZXJJbnN0YW5jZS5zZXRIZWFkZXJJdGVtcygoaGVhZGVyKSA9PiB7XHJcblx0XHRcdFx0aGVhZGVyLnB1c2goe1xyXG5cdFx0XHRcdFx0dHlwZTogJ2FjdGlvbkJ1dHRvbicsXHJcblx0XHRcdFx0XHRpbWc6ICc8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOiNhYmIwYzQ7fTwvc3R5bGU+PC9kZWZzPjx0aXRsZT5pY29uIC0gaGVhZGVyIC0gcHJpbnQgLSBsaW5lPC90aXRsZT48cGF0aCBjbGFzcz1cImNscy0xXCIgZD1cIk0yMCw2SDE4VjJINlY2SDRBMiwyLDAsMCwwLDIsOHY5YTIsMiwwLDAsMCwyLDJINnYzSDE4VjE5aDJhMiwyLDAsMCwwLDItMlY4QTIsMiwwLDAsMCwyMCw2Wk04LDRoOFY2SDhabTgsMTZIOFYxNmg4Wm00LTNIMThWMTRINnYzSDRWOEgyMFptLTQtN2gydjJIMTZabS0zLDBoMnYySDEzWlwiPjwvcGF0aD48L3N2Zz4nLFxyXG5cdFx0XHRcdFx0dGl0bGU6IHRoaXMuaXNBcmFiaWMgPyAn2LfYqNin2LnYqScgOiAnUHJpbnQnLFxyXG5cdFx0XHRcdFx0b25DbGljazogKCkgPT4ge1xyXG5cdFx0XHRcdFx0XHR0aGlzLnBkZnRyb25TZXJ2aWNlLmluc3RhbmNlLnByaW50KCk7XHJcblx0XHRcdFx0XHRcdHRoaXMuZXZlbnRzLm5leHQoJ3ByaW50Jyk7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fSk7XHJcblx0XHRcdH0pO1xyXG5cdFx0fSBlbHNlIHtcclxuXHRcdFx0dGhpcy53ZWJWaWV3ZXJJbnN0YW5jZS5kaXNhYmxlRWxlbWVudHMoWydwcmludE1vZGFsJ10pO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0YWRkV2F0ZXJtYXJrKCkge1xyXG5cdFx0Y29uc3QgdXNlcmluZm8gPSB0aGlzLm51eGVvLm51eGVvQ2xpZW50LnVzZXIucHJvcGVydGllcztcclxuXHRcdHRoaXMucGRmdHJvblNlcnZpY2UuYWRkV2F0ZXJtYXJrKFxyXG5cdFx0XHRgJHt1c2VyaW5mby51c2VybmFtZX0gICAgYFxyXG5cdFx0XHQvLyBgJHt1c2VyaW5mby5maXJzdE5hbWV9ICR7XHJcblx0XHRcdC8vICAgdXNlcmluZm8ubGFzdE5hbWVcclxuXHRcdFx0Ly8gfSBgXHJcblx0XHQpO1xyXG5cdH1cclxuXHJcblx0I2RvY0xvYWRlZCA9ICgpID0+IHtcclxuXHRcdGxldCBmaXRNb2RlID0gdGhpcy53ZWJWaWV3ZXJJbnN0YW5jZS5GaXRNb2RlLkZpdFdpZHRoO1xyXG5cdFx0aWYgKHRoaXMuZml0TW9kZSA9PT0gJ0ZpdFBhZ2UnKSB7XHJcblx0XHRcdGZpdE1vZGUgPSB0aGlzLndlYlZpZXdlckluc3RhbmNlLkZpdE1vZGUuRml0UGFnZTtcclxuXHRcdH0gZWxzZSBpZiAodGhpcy5maXRNb2RlID09PSAnWm9vbScpIHtcclxuXHRcdFx0Zml0TW9kZSA9IHRoaXMud2ViVmlld2VySW5zdGFuY2UuRml0TW9kZS5ab29tO1xyXG5cdFx0fVxyXG5cdFx0dGhpcy53ZWJWaWV3ZXJJbnN0YW5jZS5zZXRGaXRNb2RlKGZpdE1vZGUpO1xyXG5cdH07XHJcblx0bG9hZERvY3VtZW50KCk6IHZvaWQge1xyXG5cdFx0aWYgKCF0aGlzLndlYlZpZXdlckluc3RhbmNlIHx8ICghdGhpcy5maWxlRGF0YSAmJiAhdGhpcy5maWxlVVJMKSkge1xyXG5cdFx0XHRyZXR1cm47XHJcblx0XHR9XHJcblx0XHRjb25zdCB7IGRvY1ZpZXdlciwgYW5ub3RNYW5hZ2VyLCBBbm5vdGF0aW9ucyB9ID0gdGhpcy53ZWJWaWV3ZXJJbnN0YW5jZTtcclxuXHRcdGRvY1ZpZXdlci5vbignZG9jdW1lbnRMb2FkZWQnLCB0aGlzLiNkb2NMb2FkZWQpO1xyXG5cdFx0aWYgKCF0aGlzLmVkaXRNb2RlKSB7XHJcblx0XHRcdHRoaXMud2ViVmlld2VySW5zdGFuY2UuYW5ub3RNYW5hZ2VyLnNldFJlYWRPbmx5KHRydWUpO1xyXG5cdFx0XHQvLyBpbnN0YW5jZS5lbmFibGVUb29scyhbXSk7XHJcblx0XHR9XHJcblx0XHRpZiAodGhpcy5maWxlVVJMICYmIHRoaXMuZmlsZVVSTC5sZW5ndGgpIHtcclxuXHRcdFx0dGhpcy53ZWJWaWV3ZXJJbnN0YW5jZS5sb2FkRG9jdW1lbnQodGhpcy5maWxlVVJMLCB7XHJcblx0XHRcdFx0eG9kc3RyZWFtaW5nOiB0cnVlLFxyXG5cdFx0XHRcdGN1c3RvbUhlYWRlcnM6IHtcclxuXHRcdFx0XHRcdEF1dGhvcml6YXRpb246IHRoaXMuYXV0aEhlYWRlclxyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHQvLyB3aXRoQ3JlZGVudGlhbHM6IHRydWUsXHJcblx0XHRcdH0pO1xyXG5cdFx0fSBlbHNlIHtcclxuXHRcdFx0dGhpcy53ZWJWaWV3ZXJJbnN0YW5jZS5sb2FkRG9jdW1lbnQobmV3IEJsb2IoW25ldyBVaW50OEFycmF5KHRoaXMuZmlsZURhdGEpXSwgeyB0eXBlOiB0aGlzLkRPQ1VNRU5UX1RZUEUgfSksIHtcclxuXHRcdFx0XHRmaWxlbmFtZTogdGhpcy5maWxlVGl0bGVcclxuXHRcdFx0fSk7XHJcblx0XHR9XHJcblxyXG5cdFx0dGhpcy5pc0ZldGNoaW5nID0gZmFsc2U7XHJcblx0XHQvLyBpZiBub3QgbmVnZWxjdGluZyBhZGRpbmcgd2F0ZXIgbWFyayB0aGVuIGNoZWNrIGNvbmRpdGlvbnMgZm9yIGFkZGluZyBpdFxyXG5cdFx0aWYgKCF0aGlzLm5lZ2VsZWN0QWRkaW5nV2F0ZXJNYXJrKSB7XHJcblx0XHRcdGlmICh0aGlzLmNvcnJlc3BvbmRhbmNlICE9PSB1bmRlZmluZWQpIHtcclxuXHRcdFx0XHQvLyBpZiB3ZSBuZWVkIHRvIGNoZWNrIG9uIHNlY3JlY3kgbGV2ZWwgZm9yIGFkZGluZyB3YXRlciBtYXJrIG9yIG5vdFxyXG5cdFx0XHRcdGlmICh0aGlzLmVudmlyb25tZW50LmVuYWJsZVZpZXdlcldhdGVyTWFyayAmJiB0aGlzLnNlY3JlY3lQcm9wZXJ0eSkge1xyXG5cdFx0XHRcdFx0Ly8gY2hlY2sgZm9yIHNlY3JlY3kgbGV2ZWwgYmVmb3IgYWRkaW5nIHdhdGVybWFya1xyXG5cdFx0XHRcdFx0aWYgKFxyXG5cdFx0XHRcdFx0XHR0aGlzLmNvcnJlc3BvbmRhbmNlLnByb3BlcnRpZXNbdGhpcy5zZWNyZWN5UHJvcGVydHldICYmXHJcblx0XHRcdFx0XHRcdHRoaXMuY29ycmVzcG9uZGFuY2UucHJvcGVydGllc1t0aGlzLnNlY3JlY3lQcm9wZXJ0eV0gIT09ICdOb3JtYWwnXHJcblx0XHRcdFx0XHQpIHtcclxuXHRcdFx0XHRcdFx0dGhpcy5hZGRXYXRlcm1hcmsoKTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9IGVsc2UgaWYgKHRoaXMuZW52aXJvbm1lbnQuZW5hYmxlVmlld2VyV2F0ZXJNYXJrICYmICF0aGlzLnNlY3JlY3lQcm9wZXJ0eSkge1xyXG5cdFx0XHRcdFx0dGhpcy5hZGRXYXRlcm1hcmsoKTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHRcdHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcclxuXHR9XHJcblxyXG5cdGFzeW5jIGV4cG9ydEFzQmxvYigpOiBQcm9taXNlPEJsb2I+IHtcclxuXHRcdGNvbnN0IGRvYyA9IHRoaXMud2ViVmlld2VySW5zdGFuY2UuZG9jVmlld2VyLmdldERvY3VtZW50KCk7XHJcblx0XHRjb25zdCB4ZmRmU3RyaW5nID0gYXdhaXQgdGhpcy53ZWJWaWV3ZXJJbnN0YW5jZS5hbm5vdE1hbmFnZXIuZXhwb3J0QW5ub3RhdGlvbnMoKTtcclxuXHRcdGNvbnN0IGRhdGEgPSBhd2FpdCBkb2MuZ2V0RmlsZURhdGEoe1xyXG5cdFx0XHQvLyBzYXZlcyB0aGUgZG9jdW1lbnQgd2l0aCBhbm5vdGF0aW9ucyBpbiBpdFxyXG5cdFx0XHR4ZmRmU3RyaW5nXHJcblx0XHR9KTtcclxuXHRcdGNvbnN0IGFyciA9IG5ldyBVaW50OEFycmF5KGRhdGEpO1xyXG5cdFx0Y29uc3QgYmxvYiA9IG5ldyBCbG9iKFthcnJdLCB7IHR5cGU6IHRoaXMuRE9DVU1FTlRfVFlQRSB9KTtcclxuXHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUoYmxvYik7XHJcblx0fVxyXG5cclxuXHR0b2dnbGVFZGl0KCk6IHZvaWQge1xyXG5cdFx0aWYgKCF0aGlzLmFjdGlvbkNsaWNrZWQpIHtcclxuXHRcdFx0Ly8gYWN0aW9uIGNsaWNrZWQgaXMgbm90IGNsaWNrZWQgdGhlbiBubyB1cGRhdGUgbW9kZSBvcGVuZWRcclxuXHRcdFx0dGhpcy53ZWJWaWV3ZXJJbnN0YW5jZS5kaXNhYmxlRWxlbWVudHMoW1xyXG5cdFx0XHRcdCd0b29sYmFyR3JvdXAtU2hhcGVzJyxcclxuXHRcdFx0XHQndG9vbGJhckdyb3VwLUVkaXQnLFxyXG5cdFx0XHRcdCd0b29sYmFyR3JvdXAtSW5zZXJ0JyxcclxuXHRcdFx0XHQndG9vbGJhckdyb3VwLUFubm90YXRlJ1xyXG5cdFx0XHRdKTtcclxuXHRcdFx0dGhpcy53ZWJWaWV3ZXJJbnN0YW5jZS5hbm5vdE1hbmFnZXIuc2V0UmVhZE9ubHkodHJ1ZSk7XHJcblx0XHR9IGVsc2Uge1xyXG5cdFx0XHQvLyBlZGl0IG1vZGUgb3BlbmVkIGFuZCBtdXN0IGJlIHdoZW4gYWN0aW9uIGlzIGNsaWNrZWRcclxuXHRcdFx0aWYgKHRoaXMuZWRpdGluZ1R5cGUpIHtcclxuXHRcdFx0XHR0aGlzLndlYlZpZXdlckluc3RhbmNlLmRpc2FibGVFbGVtZW50cyhbXHJcblx0XHRcdFx0XHQndG9vbGJhckdyb3VwLVNoYXBlcycsXHJcblx0XHRcdFx0XHQndG9vbGJhckdyb3VwLUVkaXQnLFxyXG5cdFx0XHRcdFx0J3Rvb2xiYXJHcm91cC1JbnNlcnQnLFxyXG5cdFx0XHRcdFx0J3Rvb2xiYXJHcm91cC1Bbm5vdGF0ZSdcclxuXHRcdFx0XHRdKTtcclxuXHRcdFx0XHRsZXQgZ3JvdXA7XHJcblx0XHRcdFx0aWYgKHRoaXMuZWRpdGluZ1R5cGUgPT09ICdzaWduRG9jJykge1xyXG5cdFx0XHRcdFx0dGhpcy53ZWJWaWV3ZXJJbnN0YW5jZS5lbmFibGVFbGVtZW50cyhbJ3Rvb2xiYXJHcm91cC1JbnNlcnQnXSk7XHJcblx0XHRcdFx0fSBlbHNlIGlmICh0aGlzLmVkaXRpbmdUeXBlID09PSAnYW5ub3RhdGUnKSB7XHJcblx0XHRcdFx0XHR0aGlzLndlYlZpZXdlckluc3RhbmNlLmVuYWJsZUVsZW1lbnRzKFsndG9vbGJhckdyb3VwLVNoYXBlcycsICd0b29sYmFyR3JvdXAtRWRpdCcsICd0b29sYmFyR3JvdXAtQW5ub3RhdGUnXSk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdHRoaXMud2ViVmlld2VySW5zdGFuY2UuZW5hYmxlRWxlbWVudHMoW1xyXG5cdFx0XHRcdFx0J3Rvb2xiYXJHcm91cC1TaGFwZXMnLFxyXG5cdFx0XHRcdFx0J3Rvb2xiYXJHcm91cC1FZGl0JyxcclxuXHRcdFx0XHRcdCd0b29sYmFyR3JvdXAtSW5zZXJ0JyxcclxuXHRcdFx0XHRcdCd0b29sYmFyR3JvdXAtQW5ub3RhdGUnXHJcblx0XHRcdFx0XSk7XHJcblx0XHRcdH1cclxuXHRcdFx0dGhpcy53ZWJWaWV3ZXJJbnN0YW5jZS5hbm5vdE1hbmFnZXIuc2V0UmVhZE9ubHkoZmFsc2UpO1xyXG5cdFx0XHQvLyB0aGlzLndlYlZpZXdlckluc3RhbmNlLnNldFRvb2xiYXJHcm91cCgndG9vbGJhckdyb3VwLUFubm90YXRlJyk7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHRuZ09uQ2hhbmdlcyhjaGFuZ2VzKTogdm9pZCB7XHJcblx0XHRpZiAodGhpcy53ZWJWaWV3ZXJJbnN0YW5jZSkge1xyXG5cdFx0XHR0aGlzLnRvZ2dsZUVkaXQoKTtcclxuXHRcdFx0aWYgKFxyXG5cdFx0XHRcdGNoYW5nZXMudXJsRmlsZUNvbnRlbnQgJiZcclxuXHRcdFx0XHRjaGFuZ2VzLnVybEZpbGVDb250ZW50LnByZXZpb3VzVmFsdWUgJiZcclxuXHRcdFx0XHRjaGFuZ2VzLnVybEZpbGVDb250ZW50LnByZXZpb3VzVmFsdWUgIT09IGNoYW5nZXMudXJsRmlsZUNvbnRlbnQuY3VycmVudFZhbHVlXHJcblx0XHRcdCkge1xyXG5cdFx0XHRcdHRoaXMubmdPbkRlc3Ryb3koKTtcclxuXHRcdFx0XHR0aGlzLm5nT25Jbml0KCk7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdHByaXZhdGUgcGRmVHJvbkV2ZW50KGV2ZW50KSB7XHJcblx0XHRpZiAodGhpc1tldmVudC5hY3Rpb25dKSB7XHJcblx0XHRcdC8vIG1ldGhvZCBleGlzdHMgaW4gdGhlIGNvbXBvbmVudFxyXG5cdFx0XHQvLyAgdGhpc1tldmVudC5hY3Rpb25dKGV2ZW50LnBhcmFtcyk7IC8vIGNhbGwgaXRcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gc2VhcmNoIHJlc3VsdHMgc2VjdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuXHJcblx0cGFnZXM6IGFueTtcclxuXHRzdGFuZGFyZEhlaWdodDtcclxuXHRzdGFuZGFyZFdpZHRoO1xyXG5cdHBhZ2VIZWlnaHQ7XHJcblx0cGFnZVdpZHRoO1xyXG5cdHNhdmVkQW5vdGF0aW9ucyA9IFtdO1xyXG5cdGZpbGVXaXRoT2NyID0gZmFsc2U7XHJcblx0bmV3QW5ub3RhdGlvbnMgPSBbXTtcclxuXHRteVNlYXJjaFN0cmluZ1Jlc3VsdHMgPSBbXTtcclxuXHRyZWNpdmVkU2VhcmNoU3RyaW5nc0FycmF5ID0gW107XHJcblxyXG5cdC8vIGFkZGluZyBzZWFyY2ggbGlzbmVyIHRvIGxpc2VuIHRvIGludGVybmFsIHNlYXJjaCBmcm9tIHVpIGFuZCB3aXRob3V0IG9jclxyXG5cdGFkZFNlYXJjaExpc3RuZXIoKSB7XHJcblx0XHRjb25zdCB7IGFubm90TWFuYWdlciwgZG9jVmlld2VyLCBBbm5vdGF0aW9ucyB9ID0gdGhpcy53ZWJWaWV3ZXJJbnN0YW5jZTtcclxuXHRcdGNvbnN0IHNlYXJjaExpc3RlbmVyID0gKHNlYXJjaFBhdHRlcm4sIG9wdGlvbnMsIHJlc3VsdHMpID0+IHtcclxuXHRcdFx0dGhpcy5teVNlYXJjaFN0cmluZ1Jlc3VsdHMgPSBbXTtcclxuXHRcdFx0aWYgKHRoaXMuc2F2ZWRBbm90YXRpb25zLmxlbmd0aCA+IDApIHtcclxuXHRcdFx0XHR0aGlzLnNhdmVkQW5vdGF0aW9ucy5tYXAoKGFubm90YXRpb24pID0+IHtcclxuXHRcdFx0XHRcdGFubm90YXRpb24uSGlkZGVuID0gdHJ1ZTtcclxuXHRcdFx0XHRcdC8vIEFsd2F5cyByZWRyYXcgYW5ub3RhdGlvbiBpZiByZW5kZXJpbmcgd2FzIHVwZGF0ZWRcclxuXHRcdFx0XHRcdGFubm90TWFuYWdlci5yZWRyYXdBbm5vdGF0aW9uKGFubm90YXRpb24pO1xyXG5cdFx0XHRcdH0pO1xyXG5cdFx0XHR9XHJcblx0XHRcdC8vIGRvbid0IGRvIGFueSBzZWFyY2ggdW50aWwgdGhlcmUgaXMgYSBzZWFyY2ggcGF0dGVyblxyXG5cdFx0XHRpZiAoc2VhcmNoUGF0dGVybi50cmltKCkubGVuZ3RoID4gMCkge1xyXG5cdFx0XHRcdC8vIGFkZCByZWRhY3Rpb24gYW5ub3RhdGlvbiBmb3IgZWFjaCBzZWFyY2ggcmVzdWx0XHJcblx0XHRcdFx0dGhpcy5uZXdBbm5vdGF0aW9ucyA9IHJlc3VsdHMubWFwKChyZXN1bHQpID0+IHtcclxuXHRcdFx0XHRcdGNvbnN0IGFubm90YXRpb24gPSBuZXcgQW5ub3RhdGlvbnMuVGV4dEhpZ2hsaWdodEFubm90YXRpb24oKTtcclxuXHRcdFx0XHRcdGFubm90YXRpb24uUXVhZHMgPSByZXN1bHQucXVhZHMubWFwKChxdWFkKSA9PiBxdWFkLmdldFBvaW50cygpKTtcclxuXHRcdFx0XHRcdGFubm90YXRpb24uUGFnZU51bWJlciA9IHJlc3VsdC5wYWdlTnVtO1xyXG5cdFx0XHRcdFx0YW5ub3RhdGlvbi5TdHJva2VDb2xvciA9IG5ldyBBbm5vdGF0aW9ucy5Db2xvcigyNTAsIDIwNiwgMCwgMC41MDE5Nik7XHJcblx0XHRcdFx0XHRhbm5vdGF0aW9uLkF1dGhvciA9IHRoaXMud2ViVmlld2VySW5zdGFuY2UuYW5ub3RNYW5hZ2VyLmdldEN1cnJlbnRVc2VyKCk7XHJcblx0XHRcdFx0XHRyZXR1cm4gYW5ub3RhdGlvbjtcclxuXHRcdFx0XHR9KTtcclxuXHRcdFx0XHR0aGlzLnNhdmVkQW5vdGF0aW9ucy5wdXNoKC4uLnRoaXMubmV3QW5ub3RhdGlvbnMpO1xyXG5cdFx0XHRcdGFubm90TWFuYWdlci5hZGRBbm5vdGF0aW9ucyh0aGlzLm5ld0Fubm90YXRpb25zKTtcclxuXHRcdFx0XHRhbm5vdE1hbmFnZXIuZHJhd0Fubm90YXRpb25zRnJvbUxpc3QodGhpcy5uZXdBbm5vdGF0aW9ucyk7XHJcblx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0ZG9jVmlld2VyLmNsZWFyU2VhcmNoUmVzdWx0cygpO1xyXG5cdFx0XHR9XHJcblx0XHR9O1xyXG5cclxuXHRcdGRvY1ZpZXdlci5vbignZG9jdW1lbnRMb2FkZWQnLCAoKSA9PiB7XHJcblx0XHRcdHRoaXMud2ViVmlld2VySW5zdGFuY2UuYWRkU2VhcmNoTGlzdGVuZXIoc2VhcmNoTGlzdGVuZXIpO1xyXG5cdFx0fSk7XHJcblx0fVxyXG5cclxuXHQvLyBwZXJmb3JtIGF1dG9tYXRpYyBzZWFyY2ggd2hlbiBpbnRlcmluZyB0aGUgcGFnZVxyXG5cdGF1dG9tYXRpY1NlYXJjaChzZWFyY2hUZXh0QXJyYXkpIHtcclxuXHRcdGNvbnN0IHsgYW5ub3RNYW5hZ2VyLCBkb2NWaWV3ZXIsIEFubm90YXRpb25zIH0gPSB0aGlzLndlYlZpZXdlckluc3RhbmNlO1xyXG5cdFx0bGV0IHNlYXJjaE9wdGlvbnM7XHJcblx0XHR0aGlzLndlYlZpZXdlckluc3RhbmNlLm9wZW5FbGVtZW50cyhbJ3NlYXJjaFBhbmVsJ10pO1xyXG5cdFx0ZG9jVmlld2VyLm9uKCdkb2N1bWVudExvYWRlZCcsICgpID0+IHtcclxuXHRcdFx0Y29uc3QgbW9kZSA9XHJcblx0XHRcdFx0dGhpcy53ZWJWaWV3ZXJJbnN0YW5jZS5Db3JlQ29udHJvbHMuU2VhcmNoLk1vZGUuUEFHRV9TVE9QIHxcclxuXHRcdFx0XHR0aGlzLndlYlZpZXdlckluc3RhbmNlLkNvcmVDb250cm9scy5TZWFyY2guTW9kZS5ISUdITElHSFQgfFxyXG5cdFx0XHRcdHRoaXMud2ViVmlld2VySW5zdGFuY2UuQ29yZUNvbnRyb2xzLlNlYXJjaC5Nb2RlLkFNQklFTlRfU1RSSU5HO1xyXG5cdFx0XHR0aGlzLm15U2VhcmNoU3RyaW5nUmVzdWx0cyA9IFtdOyAvLyBlbXB0eSBteSBzZWFyY2ggcmVzdWx0IHdoZW4gc3RhcnRpbmcgbmV3IHNlYXJjaFxyXG5cdFx0XHRpZiAodGhpcy5maWxlV2l0aE9jcikge1xyXG5cdFx0XHRcdC8vIGFkZCByZWRhY3Rpb24gYW5ub3RhdGlvbiBmb3IgZWFjaCBzZWFyY2ggcmVzdWx0XHJcblx0XHRcdFx0Y29uc3QgYW5ub3RhdGlvbiA9IG5ldyBBbm5vdGF0aW9ucy5UZXh0SGlnaGxpZ2h0QW5ub3RhdGlvbigpO1xyXG5cdFx0XHRcdHNlYXJjaFRleHRBcnJheS5tYXAoKHNlYXJjaFRleHQpID0+IHtcclxuXHRcdFx0XHRcdGxldCBteVNlYXJjaCA9IHNlYXJjaFRleHQuc3BsaXQoJyAnKTtcclxuXHRcdFx0XHRcdGlmIChteVNlYXJjaC5sZW5ndGggPiAxKSB7XHJcblx0XHRcdFx0XHRcdC8vIHRoZW4gaSBhbSBzZWFyY2hpbmcgd2l0aCBtb3JlIHRoYW4gb25lIHdvcmRcclxuXHRcdFx0XHRcdFx0dGhpcy5wYWdlcy5wYWdlcy5mb3JFYWNoKChwYWdlLCBpbmRleCkgPT4ge1xyXG5cdFx0XHRcdFx0XHRcdHRoaXMucGFnZUhlaWdodCA9IHBhZ2UucGFnZV9oZWlnaHQ7XHJcblx0XHRcdFx0XHRcdFx0dGhpcy5wYWdlV2lkdGggPSBwYWdlLnBhZ2Vfd2lkdGg7XHJcblx0XHRcdFx0XHRcdFx0dGhpcy5zdGFuZGFyZEhlaWdodCA9IHRoaXMud2ViVmlld2VySW5zdGFuY2UuZG9jVmlld2VyLmdldFBhZ2VIZWlnaHQoaW5kZXggKyAxKTtcclxuXHRcdFx0XHRcdFx0XHR0aGlzLnN0YW5kYXJkV2lkdGggPSB0aGlzLndlYlZpZXdlckluc3RhbmNlLmRvY1ZpZXdlci5nZXRQYWdlV2lkdGgoaW5kZXggKyAxKTtcclxuXHRcdFx0XHRcdFx0XHRwYWdlLnpvbmVzLmZvckVhY2goKHpvbmUpID0+IHtcclxuXHRcdFx0XHRcdFx0XHRcdHpvbmUucGFyYWdyYXBocy5mb3JFYWNoKChwYXJhZ3JhcGgpID0+IHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0cGFyYWdyYXBoLmxpbmVzLmZvckVhY2goKGxpbmUpID0+IHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAobGluZS50ZXh0LmluY2x1ZGVzKHNlYXJjaFRleHQpKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR0aGlzLlNlYXJjaEZvcldvcmRJbkxpbmUobXlTZWFyY2gsIGxpbmUsIGluZGV4ICsgMSwgcGFnZSk7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdFx0XHR9KTtcclxuXHRcdFx0XHRcdFx0XHRcdH0pO1xyXG5cdFx0XHRcdFx0XHRcdH0pO1xyXG5cdFx0XHRcdFx0XHR9KTtcclxuXHRcdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHRcdC8vIHRoZW4gaSBhbSBzZWFyY2hpbmcgd2l0aCBvbmx5IG9uZSB3b3JkXHJcblx0XHRcdFx0XHRcdHRoaXMuc2VhcmNoRm9yV29yZEluQWxsUGFnZXMoc2VhcmNoVGV4dCk7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fSk7XHJcblx0XHRcdFx0ZG9jVmlld2VyLmNsZWFyU2VhcmNoUmVzdWx0cygpO1xyXG5cdFx0XHRcdHRoaXMuZGlzcGFsYXlTZWFyY2hSZXN1bHRzKGRvY1ZpZXdlcik7XHJcblx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0c2VhcmNoT3B0aW9ucyA9IHtcclxuXHRcdFx0XHRcdC8vIElmIHRydWUsIGEgc2VhcmNoIG9mIHRoZSBlbnRpcmUgZG9jdW1lbnQgd2lsbCBiZSBwZXJmb3JtZWQuIE90aGVyd2lzZSwgYSBzaW5nbGUgc2VhcmNoIHdpbGwgYmUgcGVyZm9ybWVkLlxyXG5cdFx0XHRcdFx0ZnVsbFNlYXJjaDogdHJ1ZSxcclxuXHRcdFx0XHRcdC8vIFRoZSBjYWxsYmFjayBmdW5jdGlvbiB0aGF0IGlzIGNhbGxlZCB3aGVuIHRoZSBzZWFyY2ggcmV0dXJucyBhIHJlc3VsdC5cclxuXHRcdFx0XHRcdG9uUmVzdWx0OiAocmVzdWx0KSA9PiB7XHJcblx0XHRcdFx0XHRcdC8vIHdpdGggJ1BBR0VfU1RPUCcgbW9kZSwgdGhlIGNhbGxiYWNrIGlzIGludm9rZWQgYWZ0ZXIgZWFjaCBwYWdlIGhhcyBiZWVuIHNlYXJjaGVkLlxyXG5cdFx0XHRcdFx0XHRpZiAocmVzdWx0LnJlc3VsdENvZGUgPT09IHRoaXMud2ViVmlld2VySW5zdGFuY2UuQ29yZUNvbnRyb2xzLlNlYXJjaC5SZXN1bHRDb2RlLkZPVU5EKSB7XHJcblx0XHRcdFx0XHRcdFx0Y29uc3QgYW5ub3RhdGlvbiA9IG5ldyBBbm5vdGF0aW9ucy5UZXh0SGlnaGxpZ2h0QW5ub3RhdGlvbigpO1xyXG5cdFx0XHRcdFx0XHRcdGFubm90YXRpb24uUXVhZHMgPSByZXN1bHQucXVhZHMubWFwKChxdWFkKSA9PiBxdWFkLmdldFBvaW50cygpKTtcclxuXHRcdFx0XHRcdFx0XHRjb25zb2xlLmxvZyhhbm5vdGF0aW9uLlF1YWRzKTtcclxuXHRcdFx0XHRcdFx0XHRhbm5vdGF0aW9uLlBhZ2VOdW1iZXIgPSByZXN1bHQucGFnZU51bTtcclxuXHRcdFx0XHRcdFx0XHRhbm5vdGF0aW9uLlN0cm9rZUNvbG9yID0gbmV3IEFubm90YXRpb25zLkNvbG9yKDI1MCwgMjA2LCAwLCAwLjUwMTk2KTtcclxuXHRcdFx0XHRcdFx0XHRhbm5vdGF0aW9uLkF1dGhvciA9IHRoaXMud2ViVmlld2VySW5zdGFuY2UuYW5ub3RNYW5hZ2VyLmdldEN1cnJlbnRVc2VyKCk7XHJcblx0XHRcdFx0XHRcdFx0dGhpcy5zYXZlZEFub3RhdGlvbnMucHVzaChhbm5vdGF0aW9uKTtcclxuXHRcdFx0XHRcdFx0XHRhbm5vdE1hbmFnZXIuYWRkQW5ub3RhdGlvbnMoW2Fubm90YXRpb25dKTtcclxuXHRcdFx0XHRcdFx0XHRhbm5vdE1hbmFnZXIuZHJhd0Fubm90YXRpb25zRnJvbUxpc3QoW2Fubm90YXRpb25dKTtcclxuXHRcdFx0XHRcdFx0XHRkb2NWaWV3ZXIuZGlzcGxheUFkZGl0aW9uYWxTZWFyY2hSZXN1bHRzKFtyZXN1bHRdKTtcclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH07XHJcblx0XHRcdFx0c2VhcmNoVGV4dEFycmF5Lm1hcCgoc2VhcmNoZWRUZXh0KSA9PiB7XHJcblx0XHRcdFx0XHRkb2NWaWV3ZXIudGV4dFNlYXJjaEluaXQoc2VhcmNoZWRUZXh0LCBtb2RlLCBzZWFyY2hPcHRpb25zKTtcclxuXHRcdFx0XHR9KTtcclxuXHRcdFx0fVxyXG5cdFx0fSk7XHJcblx0fVxyXG5cclxuXHQvLyBzZWFyY2ggZm9yIHNpbmdsZSB3b3JkIGluIGFsbCBwYWdlc1xyXG5cdHNlYXJjaEZvcldvcmRJbkFsbFBhZ2VzKHNlYXJjaGVkV29yZCkge1xyXG5cdFx0dGhpcy5wYWdlcy5wYWdlcy5mb3JFYWNoKChwYWdlLCBpbmRleCkgPT4ge1xyXG5cdFx0XHR0aGlzLnBhZ2VIZWlnaHQgPSBwYWdlLnBhZ2VfaGVpZ2h0O1xyXG5cdFx0XHR0aGlzLnBhZ2VXaWR0aCA9IHBhZ2UucGFnZV93aWR0aDtcclxuXHRcdFx0dGhpcy5zdGFuZGFyZEhlaWdodCA9IHRoaXMud2ViVmlld2VySW5zdGFuY2UuZG9jVmlld2VyLmdldFBhZ2VIZWlnaHQoaW5kZXggKyAxKTtcclxuXHRcdFx0dGhpcy5zdGFuZGFyZFdpZHRoID0gdGhpcy53ZWJWaWV3ZXJJbnN0YW5jZS5kb2NWaWV3ZXIuZ2V0UGFnZVdpZHRoKGluZGV4ICsgMSk7XHJcblx0XHRcdGNvbnN0IHggPSB0aGlzLnBhZ2VXaWR0aCAvIHRoaXMuc3RhbmRhcmRXaWR0aDsgLy8gd2lkdGggcmF0aW9cclxuXHRcdFx0Y29uc3QgeSA9IHRoaXMucGFnZUhlaWdodCAvIHRoaXMuc3RhbmRhcmRIZWlnaHQ7IC8vIGhlaWdodCByYXRpb1xyXG5cdFx0XHRwYWdlLnpvbmVzLmZvckVhY2goKHpvbmUpID0+IHtcclxuXHRcdFx0XHR6b25lLnBhcmFncmFwaHMuZm9yRWFjaCgocGFyYWdyYXBoKSA9PiB7XHJcblx0XHRcdFx0XHRwYXJhZ3JhcGgubGluZXMuZm9yRWFjaCgobGluZSkgPT4ge1xyXG5cdFx0XHRcdFx0XHRsaW5lLndvcmRzLmZvckVhY2goKHdvcmQpID0+IHtcclxuXHRcdFx0XHRcdFx0XHRpZiAod29yZC50ZXh0LmluY2x1ZGVzKHNlYXJjaGVkV29yZCkpIHtcclxuXHRcdFx0XHRcdFx0XHRcdC8vIGFubm90YXRpb24uUGFnZU51bWJlciA9IGluZGV4KzE7XHJcblx0XHRcdFx0XHRcdFx0XHRsZXQgcXVhZHMgPSBbXHJcblx0XHRcdFx0XHRcdFx0XHRcdHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHR4MTogd29yZC5jb29yZGluYXRlcy51cHBlcl9sZWZ0LnggLyB4LFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHgyOiB3b3JkLmNvb3JkaW5hdGVzLmJvdHRvbV9yaWdodC54IC8geCxcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHR4Mzogd29yZC5jb29yZGluYXRlcy5ib3R0b21fcmlnaHQueCAvIHgsXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0eDQ6IHdvcmQuY29vcmRpbmF0ZXMudXBwZXJfbGVmdC54IC8geCxcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHR5MTogd29yZC5jb29yZGluYXRlcy51cHBlcl9sZWZ0LnkgLyB5LFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHkyOiB3b3JkLmNvb3JkaW5hdGVzLnVwcGVyX2xlZnQueSAvIHksXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0eTM6IHdvcmQuY29vcmRpbmF0ZXMuYm90dG9tX3JpZ2h0LnkgLyB5LFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHk0OiB3b3JkLmNvb3JkaW5hdGVzLmJvdHRvbV9yaWdodC55IC8geVxyXG5cdFx0XHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0XHRdO1xyXG5cdFx0XHRcdFx0XHRcdFx0dGhpcy5oaWdsaWdodFRleHQocXVhZHMsIGluZGV4ICsgMSk7XHJcblx0XHRcdFx0XHRcdFx0XHR0aGlzLmNvbnN0cnVjdFNlYXJjaFJlc3VsdChzZWFyY2hlZFdvcmQsIGluZGV4ICsgMSwgcXVhZHMsIGxpbmUudGV4dCk7XHJcblx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHR9KTtcclxuXHRcdFx0XHRcdH0pO1xyXG5cdFx0XHRcdH0pO1xyXG5cdFx0XHR9KTtcclxuXHRcdH0pO1xyXG5cdH1cclxuXHJcblx0Ly8gc2VhcmNoIGZvciB3b3JkIGluIHNpbmdsZSBsaW5lXHJcblx0U2VhcmNoRm9yV29yZEluTGluZShsaXN0T2ZTZWFyY2hlZFdvcmRzLCBsaW5lLCBwYWdlbnVtYmVyLCBwYWdlKSB7XHJcblx0XHR0aGlzLnBhZ2VIZWlnaHQgPSBwYWdlLnBhZ2VfaGVpZ2h0O1xyXG5cdFx0dGhpcy5wYWdlV2lkdGggPSBwYWdlLnBhZ2Vfd2lkdGg7XHJcblx0XHR0aGlzLnN0YW5kYXJkSGVpZ2h0ID0gdGhpcy53ZWJWaWV3ZXJJbnN0YW5jZS5kb2NWaWV3ZXIuZ2V0UGFnZUhlaWdodChwYWdlbnVtYmVyKTtcclxuXHRcdHRoaXMuc3RhbmRhcmRXaWR0aCA9IHRoaXMud2ViVmlld2VySW5zdGFuY2UuZG9jVmlld2VyLmdldFBhZ2VXaWR0aChwYWdlbnVtYmVyKTtcclxuXHRcdGNvbnN0IHggPSB0aGlzLnBhZ2VXaWR0aCAvIHRoaXMuc3RhbmRhcmRXaWR0aDsgLy8gd2lkdGggcmF0aW9cclxuXHRcdGNvbnN0IHkgPSB0aGlzLnBhZ2VIZWlnaHQgLyB0aGlzLnN0YW5kYXJkSGVpZ2h0OyAvLyBoZWlnaHQgcmF0aW9cclxuXHRcdC8vIGZpbmQgb25seSB3b3JkcyByZWxhdGVkIHRvIG15IHNlYXJjaCBmb3JtIHRoZSBsaW5lXHJcblx0XHRsZXQgbXlGb3VuZGVkUmVzdWx0cyA9IFtdO1xyXG5cdFx0bGV0IGNvcnJlY3RSZXN1bHRzID0gW107XHJcblx0XHRsaW5lLndvcmRzLmZvckVhY2goKHdvcmQsIHdvcmRJbmRleCkgPT4ge1xyXG5cdFx0XHRpZiAobGlzdE9mU2VhcmNoZWRXb3Jkcy5pbmRleE9mKHdvcmQudGV4dCkgPiAtMSkge1xyXG5cdFx0XHRcdG15Rm91bmRlZFJlc3VsdHMucHVzaCh7IHdvcmQ6IHdvcmQsIHdvcmRJbmRleDogd29yZEluZGV4IH0pO1xyXG5cdFx0XHR9XHJcblx0XHR9KTtcclxuXHJcblx0XHQvLyBmaW5kIG9ubHkgd29yZHMgZXhpc3QgaW4gbXkgc2VhcmNoIHNlbnRlbmNlIGFuZCBub3Qgc2luZ2xlIGFuZCByZXBlYXRlZCB3b3JkXHJcblx0XHRteUZvdW5kZWRSZXN1bHRzLm1hcCgocmVzdWx0LCBpbmRleCkgPT4ge1xyXG5cdFx0XHRpZiAoXHJcblx0XHRcdFx0bXlGb3VuZGVkUmVzdWx0c1tpbmRleF1bJ3dvcmRJbmRleCddIC0gMSA9PT1cclxuXHRcdFx0XHRcdChteUZvdW5kZWRSZXN1bHRzW2luZGV4IC0gMV0gJiYgbXlGb3VuZGVkUmVzdWx0c1tpbmRleCAtIDFdWyd3b3JkSW5kZXgnXSkgfHxcclxuXHRcdFx0XHQobXlGb3VuZGVkUmVzdWx0c1tpbmRleCArIDFdICYmXHJcblx0XHRcdFx0XHRteUZvdW5kZWRSZXN1bHRzW2luZGV4ICsgMV1bJ3dvcmRJbmRleCddIC0gMSA9PT0gbXlGb3VuZGVkUmVzdWx0c1tpbmRleF1bJ3dvcmRJbmRleCddKVxyXG5cdFx0XHQpIHtcclxuXHRcdFx0XHRjb3JyZWN0UmVzdWx0cy5wdXNoKHJlc3VsdCk7XHJcblx0XHRcdH1cclxuXHRcdH0pO1xyXG5cclxuXHRcdC8vIGhpZ2hsaWh0IHRoZXNlIHdvcmRzIGFmdGVyIGVsZW1pbmF0aW5nIGFsbCByZXBlYXRlZCBhbmQgcmVsYXRlZCB3b3Jkc1xyXG5cdFx0Ly8gbXVzdCBiZSBmb3IgbG9vcCBzcCBpIGNhbiBjb250cm9sIHRoZSBzdGVwIGluIGVhY2ggbG9vcFxyXG5cdFx0bGV0IHF1YWRzID0gW107XHJcblx0XHRmb3IgKGxldCBpID0gMDsgaSA8IGNvcnJlY3RSZXN1bHRzLmxlbmd0aDsgaSA9IGkgKyBsaXN0T2ZTZWFyY2hlZFdvcmRzLmxlbmd0aCkge1xyXG5cdFx0XHRxdWFkcy5wdXNoKHtcclxuXHRcdFx0XHR4MTogY29ycmVjdFJlc3VsdHNbaSArIGxpc3RPZlNlYXJjaGVkV29yZHMubGVuZ3RoIC0gMV0ud29yZC5jb29yZGluYXRlcy51cHBlcl9sZWZ0LnggLyB4LFxyXG5cdFx0XHRcdHgyOiBjb3JyZWN0UmVzdWx0c1tpXS53b3JkLmNvb3JkaW5hdGVzLmJvdHRvbV9yaWdodC54IC8geCxcclxuXHRcdFx0XHR4MzogY29ycmVjdFJlc3VsdHNbaV0ud29yZC5jb29yZGluYXRlcy5ib3R0b21fcmlnaHQueCAvIHgsXHJcblx0XHRcdFx0eDQ6IGNvcnJlY3RSZXN1bHRzW2kgKyBsaXN0T2ZTZWFyY2hlZFdvcmRzLmxlbmd0aCAtIDFdLndvcmQuY29vcmRpbmF0ZXMudXBwZXJfbGVmdC54IC8geCxcclxuXHRcdFx0XHR5MTogY29ycmVjdFJlc3VsdHNbaV0ud29yZC5jb29yZGluYXRlcy51cHBlcl9sZWZ0LnkgLyB5LFxyXG5cdFx0XHRcdHkyOiBjb3JyZWN0UmVzdWx0c1tpICsgbGlzdE9mU2VhcmNoZWRXb3Jkcy5sZW5ndGggLSAxXS53b3JkLmNvb3JkaW5hdGVzLnVwcGVyX2xlZnQueSAvIHksXHJcblx0XHRcdFx0eTM6IGNvcnJlY3RSZXN1bHRzW2kgKyBsaXN0T2ZTZWFyY2hlZFdvcmRzLmxlbmd0aCAtIDFdLndvcmQuY29vcmRpbmF0ZXMuYm90dG9tX3JpZ2h0LnkgLyB5LFxyXG5cdFx0XHRcdHk0OiBjb3JyZWN0UmVzdWx0c1tpXS53b3JkLmNvb3JkaW5hdGVzLmJvdHRvbV9yaWdodC55IC8geVxyXG5cdFx0XHR9KTtcclxuXHRcdFx0dGhpcy5oaWdsaWdodFRleHQocXVhZHMsIHBhZ2VudW1iZXIpO1xyXG5cdFx0XHR0aGlzLmNvbnN0cnVjdFNlYXJjaFJlc3VsdChsaXN0T2ZTZWFyY2hlZFdvcmRzLmpvaW4oJyAnKSwgcGFnZW51bWJlciwgcXVhZHMsIGxpbmUudGV4dCk7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHRjb25zdHJ1Y3RTZWFyY2hSZXN1bHQoc2VhcmNoZWRUZXh0LCBwYWdlTnVtLCBxdWFkcywgbGluZSkge1xyXG5cdFx0bGV0IG15U2VhcmNoU3RhcnRUZXh0SW5kZXggPSBsaW5lLmluZGV4T2Yoc2VhcmNoZWRUZXh0KTtcclxuXHRcdGxldCBteVNlZWFyY2hlZFRleHRFbmRJbmRleCA9IG15U2VhcmNoU3RhcnRUZXh0SW5kZXggKyBzZWFyY2hlZFRleHQubGVuZ3RoO1xyXG5cdFx0bGV0IHNlYXJjaFJlc3VsdE9iamVjdCA9IHtcclxuXHRcdFx0YW1iaWVudFN0cjogbGluZSxcclxuXHRcdFx0cmVzdWx0U3RyOiBzZWFyY2hlZFRleHQsXHJcblx0XHRcdHJlc3VsdFN0clN0YXJ0OiBteVNlYXJjaFN0YXJ0VGV4dEluZGV4LFxyXG5cdFx0XHRyZXN1bHRTdHJFbmQ6IG15U2VlYXJjaGVkVGV4dEVuZEluZGV4LFxyXG5cdFx0XHRwYWdlTnVtOiBwYWdlTnVtLFxyXG5cdFx0XHRyZXN1bHRDb2RlOiAyLFxyXG5cdFx0XHRxdWFkczogW1xyXG5cdFx0XHRcdHtcclxuXHRcdFx0XHRcdGVhOiBxdWFkc1swXVsneTMnXSxcclxuXHRcdFx0XHRcdGZhOiBxdWFkc1swXVsneTQnXSxcclxuXHRcdFx0XHRcdGhhOiBxdWFkc1swXVsneDEnXSxcclxuXHRcdFx0XHRcdGlhOiBxdWFkc1swXVsneDInXSxcclxuXHRcdFx0XHRcdHBCOiBxdWFkc1swXVsneDMnXSxcclxuXHRcdFx0XHRcdHFCOiBxdWFkc1swXVsneDQnXSxcclxuXHRcdFx0XHRcdHJCOiBxdWFkc1swXVsneTEnXSxcclxuXHRcdFx0XHRcdHNCOiBxdWFkc1swXVsneTInXVxyXG5cdFx0XHRcdH1cclxuXHRcdFx0XVxyXG5cdFx0fTtcclxuXHRcdHRoaXMubXlTZWFyY2hTdHJpbmdSZXN1bHRzLnB1c2goc2VhcmNoUmVzdWx0T2JqZWN0KTtcclxuXHRcdGNvbnNvbGUubG9nKHRoaXMubXlTZWFyY2hTdHJpbmdSZXN1bHRzKTtcclxuXHR9XHJcblxyXG5cdGRpc3BhbGF5U2VhcmNoUmVzdWx0cyhkb2NWaWV3ZXIpIHtcclxuXHRcdHNldFRpbWVvdXQoKCkgPT4ge1xyXG5cdFx0XHRkb2NWaWV3ZXIuZGlzcGxheUFkZGl0aW9uYWxTZWFyY2hSZXN1bHRzKHRoaXMubXlTZWFyY2hTdHJpbmdSZXN1bHRzKTtcclxuXHRcdH0sIDUwMCk7XHJcblx0fVxyXG5cclxuXHQvLyBkcmF3IGhpbGlndGhpbmcgYXJvdW5kIGNlcnRhaW4gY2hhcmF0YWN0ZXJzXHJcblx0aGlnbGlnaHRUZXh0KHF1YWRzLCBwYWdlTnVtYmVyKSB7XHJcblx0XHRjb25zdCBoaWdobGlnaHRpbmdBbm5vdCA9IG5ldyB0aGlzLndlYlZpZXdlckluc3RhbmNlLkFubm90YXRpb25zLlRleHRIaWdobGlnaHRBbm5vdGF0aW9uKCk7XHJcblx0XHRoaWdobGlnaHRpbmdBbm5vdC5TdHJva2VDb2xvciA9IG5ldyB0aGlzLndlYlZpZXdlckluc3RhbmNlLkFubm90YXRpb25zLkNvbG9yKDI1MCwgMjA2LCAwLCAwLjUwMTk2KTtcclxuXHRcdGhpZ2hsaWdodGluZ0Fubm90LlF1YWRzID0gcXVhZHM7XHJcblx0XHRoaWdobGlnaHRpbmdBbm5vdC5QYWdlTnVtYmVyID0gcGFnZU51bWJlcjtcclxuXHRcdGhpZ2hsaWdodGluZ0Fubm90LkF1dGhvciA9IHRoaXMud2ViVmlld2VySW5zdGFuY2UuYW5ub3RNYW5hZ2VyLmdldEN1cnJlbnRVc2VyKCk7XHJcblx0XHR0aGlzLnNhdmVkQW5vdGF0aW9ucy5wdXNoKGhpZ2hsaWdodGluZ0Fubm90KTtcclxuXHRcdHRoaXMud2ViVmlld2VySW5zdGFuY2UuYW5ub3RNYW5hZ2VyLmFkZEFubm90YXRpb24oaGlnaGxpZ2h0aW5nQW5ub3QpO1xyXG5cclxuXHRcdC8vIG5lZWQgdG8gZHJhdyB0aGUgYW5ub3RhdGlvbiBvdGhlcndpc2UgaXQgd29uJ3Qgc2hvdyB1cCB1bnRpbCB0aGUgcGFnZSBpcyByZWZyZXNoZWRcclxuXHRcdHRoaXMud2ViVmlld2VySW5zdGFuY2UuYW5ub3RNYW5hZ2VyLnJlZHJhd0Fubm90YXRpb24oaGlnaGxpZ2h0aW5nQW5ub3QpO1xyXG5cdH1cclxuXHJcblx0c2VhcmNoRm4gPSAoc2VhcmNoVmFsdWUsIG9wdGlvbnMpID0+IHtcclxuXHRcdHRoaXMubXlTZWFyY2hTdHJpbmdSZXN1bHRzID0gW107XHJcblx0XHRpZiAodGhpcy5zYXZlZEFub3RhdGlvbnMubGVuZ3RoID4gMCkge1xyXG5cdFx0XHR0aGlzLnNhdmVkQW5vdGF0aW9ucy5tYXAoKGFubm90YXRpb24pID0+IHtcclxuXHRcdFx0XHRhbm5vdGF0aW9uLkhpZGRlbiA9IHRydWU7XHJcblx0XHRcdFx0Ly8gQWx3YXlzIHJlZHJhdyBhbm5vdGF0aW9uIGlmIHJlbmRlcmluZyB3YXMgdXBkYXRlZFxyXG5cdFx0XHRcdHRoaXMud2ViVmlld2VySW5zdGFuY2UuYW5ub3RNYW5hZ2VyLnJlZHJhd0Fubm90YXRpb24oYW5ub3RhdGlvbik7XHJcblx0XHRcdH0pO1xyXG5cdFx0fVxyXG5cdFx0Ly8gZG9uJ3QgZG8gYW55IHNlYXJjaCB1bnRpbCB0aGVyZSBpcyBhIHNlYXJjaCBwYXR0ZXJuXHJcblx0XHRpZiAoc2VhcmNoVmFsdWUudHJpbSgpLmxlbmd0aCA+IDApIHtcclxuXHRcdFx0aWYgKHRoaXMuZmlsZVdpdGhPY3IpIHtcclxuXHRcdFx0XHQvLyBhZGQgcmVkYWN0aW9uIGFubm90YXRpb24gZm9yIGVhY2ggc2VhcmNoIHJlc3VsdFxyXG5cdFx0XHRcdC8vIGNvbnN0IGFubm90YXRpb24gPSBuZXcgQW5ub3RhdGlvbnMuVGV4dEhpZ2hsaWdodEFubm90YXRpb24oKTtcclxuXHRcdFx0XHRsZXQgbXlTZWFyY2ggPSBzZWFyY2hWYWx1ZS5zcGxpdCgnICcpO1xyXG5cdFx0XHRcdGlmIChteVNlYXJjaC5sZW5ndGggPiAxKSB7XHJcblx0XHRcdFx0XHQvLyB0aGVuIGkgYW0gc2VhcmNoaW5nIHdpdGggbW9yZSB0aGFuIG9uZSB3b3JkXHJcblx0XHRcdFx0XHR0aGlzLnBhZ2VzLnBhZ2VzLmZvckVhY2goKHBhZ2UsIGluZGV4KSA9PiB7XHJcblx0XHRcdFx0XHRcdHRoaXMucGFnZUhlaWdodCA9IHBhZ2UucGFnZV9oZWlnaHQ7XHJcblx0XHRcdFx0XHRcdHRoaXMucGFnZVdpZHRoID0gcGFnZS5wYWdlX3dpZHRoO1xyXG5cdFx0XHRcdFx0XHR0aGlzLnN0YW5kYXJkSGVpZ2h0ID0gdGhpcy53ZWJWaWV3ZXJJbnN0YW5jZS5kb2NWaWV3ZXIuZ2V0UGFnZUhlaWdodChpbmRleCArIDEpO1xyXG5cdFx0XHRcdFx0XHR0aGlzLnN0YW5kYXJkV2lkdGggPSB0aGlzLndlYlZpZXdlckluc3RhbmNlLmRvY1ZpZXdlci5nZXRQYWdlV2lkdGgoaW5kZXggKyAxKTtcclxuXHRcdFx0XHRcdFx0cGFnZS56b25lcy5mb3JFYWNoKCh6b25lKSA9PiB7XHJcblx0XHRcdFx0XHRcdFx0em9uZS5wYXJhZ3JhcGhzLmZvckVhY2goKHBhcmFncmFwaCkgPT4ge1xyXG5cdFx0XHRcdFx0XHRcdFx0cGFyYWdyYXBoLmxpbmVzLmZvckVhY2goKGxpbmUpID0+IHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0aWYgKGxpbmUudGV4dC5pbmNsdWRlcyhzZWFyY2hWYWx1ZSkpIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHR0aGlzLlNlYXJjaEZvcldvcmRJbkxpbmUobXlTZWFyY2gsIGxpbmUsIGluZGV4ICsgMSwgcGFnZSk7XHJcblx0XHRcdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHRcdH0pO1xyXG5cdFx0XHRcdFx0XHRcdH0pO1xyXG5cdFx0XHRcdFx0XHR9KTtcclxuXHRcdFx0XHRcdH0pO1xyXG5cdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHQvLyB0aGVuIGkgYW0gc2VhcmNoaW5nIHdpdGggb25seSBvbmUgd29yZFxyXG5cdFx0XHRcdFx0dGhpcy5zZWFyY2hGb3JXb3JkSW5BbGxQYWdlcyhzZWFyY2hWYWx1ZSk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdHRoaXMud2ViVmlld2VySW5zdGFuY2UuZG9jVmlld2VyLmNsZWFyU2VhcmNoUmVzdWx0cygpO1xyXG5cdFx0XHRcdHRoaXMuZGlzcGFsYXlTZWFyY2hSZXN1bHRzKHRoaXMud2ViVmlld2VySW5zdGFuY2UuZG9jVmlld2VyKTtcclxuXHRcdFx0fVxyXG5cdFx0fSBlbHNlIHtcclxuXHRcdFx0dGhpcy53ZWJWaWV3ZXJJbnN0YW5jZS5kb2NWaWV3ZXIuY2xlYXJTZWFyY2hSZXN1bHRzKCk7XHJcblx0XHR9XHJcblx0fTtcclxuXHJcblx0Ly8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5cclxuXHRuZ09uRGVzdHJveSgpOiB2b2lkIHtcclxuXHRcdGlmICh0aGlzLnNpbGVudFBkZlRyb25TZXJ2aWNlLmlzRW5hYmxlZCkge1xyXG5cdFx0XHR0aGlzLiNyZXNldCgpO1xyXG5cdFx0fSBlbHNlIHtcclxuXHRcdFx0aWYgKHRoaXMud2ViVmlld2VySW5zdGFuY2UpIHtcclxuXHRcdFx0XHR0aGlzLndlYlZpZXdlckluc3RhbmNlLmNsb3NlRG9jdW1lbnQoKS50aGVuKCgpID0+IHtcclxuXHRcdFx0XHRcdGNvbnNvbGUubG9nKCdkb2N1bWVudCBjbG9zZWQhJyk7XHJcblx0XHRcdFx0fSk7XHJcblx0XHRcdFx0dGhpcy5wZGZ0cm9uU2VydmljZS5pbnN0YW5jZSA9IHRoaXMud2ViVmlld2VySW5zdGFuY2UgPSBudWxsO1xyXG5cdFx0XHR9XHJcblx0XHRcdHRoaXMudHJhbnNlbGF0aW9uU3Vic2NyaXRpb24gPyB0aGlzLnRyYW5zZWxhdGlvblN1YnNjcml0aW9uLnVuc3Vic2NyaWJlKCkgOiBudWxsO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0I3Jlc2V0KCkge1xyXG5cdFx0dGhpcy53ZWJWaWV3ZXJJbnN0YW5jZS5jbG9zZURvY3VtZW50KCkudGhlbigoKSA9PiB7XHJcblx0XHRcdGNvbnNvbGUubG9nKCdkb2N1bWVudCBjbG9zZWQhJyk7XHJcblx0XHR9KTtcclxuXHRcdHRoaXMucGRmdHJvblNlcnZpY2UuaW5zdGFuY2UgPSBudWxsO1xyXG5cdFx0dGhpcy50cmFuc2VsYXRpb25TdWJzY3JpdGlvbiA/IHRoaXMudHJhbnNlbGF0aW9uU3Vic2NyaXRpb24udW5zdWJzY3JpYmUoKSA6IG51bGw7XHJcblxyXG5cdFx0dGhpcy5zaWxlbnRQZGZUcm9uLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XHJcblx0XHR0aGlzLnJlc2l6ZU9ic2VydmVyPy5kaXNjb25uZWN0KCk7XHJcblxyXG5cdFx0dGhpcy53ZWJWaWV3ZXJJbnN0YW5jZS5zZXRIZWFkZXJJdGVtcygoaGVhZGVyKSA9PiB7XHJcblx0XHRcdGhlYWRlci5oZWFkZXJzLmRlZmF1bHQgPSBoZWFkZXIuaGVhZGVycy5kZWZhdWx0LmZpbHRlcigocSkgPT4gIXEuaW1nPy5pbmNsdWRlcygnPHN2ZycpKTtcclxuXHRcdH0pO1xyXG5cdFx0dGhpcy53ZWJWaWV3ZXJJbnN0YW5jZS5kb2NWaWV3ZXIub2ZmKCdkb2N1bWVudExvYWRlZCcsIHRoaXMuI2RvY0xvYWRlZCk7XHJcblx0XHQvLyBtYXliZSB3aWxsIG5lZWQgdG8gcmVzZXQgc2lnbmF0dXJlICYgYW5ub3RhdGlvbnNcclxuXHR9XHJcbn1cclxuIiwiPGRpdiAjZmlsZVZpZXdlciBzdHlsZT1cIndpZHRoOiAxMDAlOyBoZWlnaHQ6IDEwMCU7XCI+PC9kaXY+XHJcbiJdfQ==