@ngneat/helipopper 9.2.0 → 10.0.0-alpha.0

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,34 +1,98 @@
1
- import { booleanAttribute, Directive, EventEmitter, Inject, Injector, Input, Output, PLATFORM_ID, } from '@angular/core';
1
+ import { computed, DestroyRef, Directive, effect, EventEmitter, inject, Inject, Injector, input, model, Output, PLATFORM_ID, untracked, } from '@angular/core';
2
2
  import { isPlatformServer } from '@angular/common';
3
- import tippy from 'tippy.js';
3
+ import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
4
4
  import { fromEvent, merge, Observable, Subject } from 'rxjs';
5
5
  import { filter, map, switchMap, takeUntil } from 'rxjs/operators';
6
- import { isComponent, isString, isTemplateRef } from '@ngneat/overview';
6
+ import { isComponent, isString, isTemplateRef, } from '@ngneat/overview';
7
7
  import { coerceCssPixelValue, dimensionsChanges, inView, isElementOverflow, normalizeClassName, observeVisibility, onlyTippyProps, overflowChanges, } from './utils';
8
- import { TIPPY_CONFIG, TIPPY_REF } from './tippy.types';
8
+ import { TIPPY_CONFIG, TIPPY_REF, } from './tippy.types';
9
+ import { TippyFactory } from './tippy.factory';
10
+ import { coerceBooleanAttribute } from './coercion';
9
11
  import * as i0 from "@angular/core";
10
12
  import * as i1 from "@ngneat/overview";
11
13
  export class TippyDirective {
12
- set appendTo(appendTo) {
13
- this.updateProps({ appendTo });
14
+ // It should be a getter because computations are cached until
15
+ // any of the producers change.
16
+ get hostWidth() {
17
+ return this.host().getBoundingClientRect().width;
14
18
  }
15
- constructor(platformId, globalConfig, injector, viewService, vcr, zone, hostRef) {
16
- this.platformId = platformId;
19
+ constructor(globalConfig, injector, viewService, vcr, ngZone, hostRef) {
17
20
  this.globalConfig = globalConfig;
18
21
  this.injector = injector;
19
22
  this.viewService = viewService;
20
23
  this.vcr = vcr;
21
- this.zone = zone;
24
+ this.ngZone = ngZone;
22
25
  this.hostRef = hostRef;
23
- this.onlyTextOverflow = false;
24
- this.staticWidthHost = false;
25
- this.useHostWidth = false;
26
- this.hideOnEscape = false;
27
- this.detectChangesComponent = true;
28
- this.isVisible = false;
26
+ // Note that default values are not provided for these bindings because `tippy.js`
27
+ // has its own default values and checks whether the provided props are `undefined`.
28
+ // We should keep `undefined` as the default value.
29
+ this.appendTo = input(undefined, { alias: 'tpAppendTo' });
30
+ this.content = input(undefined, { alias: 'tp' });
31
+ this.delay = input(undefined, { alias: 'tpDelay' });
32
+ this.duration = input(undefined, { alias: 'tpDuration' });
33
+ this.hideOnClick = input(undefined, {
34
+ alias: 'tpHideOnClick',
35
+ });
36
+ this.interactive = input(undefined, {
37
+ alias: 'tpInteractive',
38
+ });
39
+ this.interactiveBorder = input(undefined, {
40
+ alias: 'tpInteractiveBorder',
41
+ });
42
+ this.maxWidth = input(undefined, { alias: 'tpMaxWidth' });
43
+ // Note that some of the input signal types are declared explicitly because the compiler
44
+ // also uses types from `@popperjs/core` and requires a type annotation.
45
+ this.offset = input(undefined, { alias: 'tpOffset' });
46
+ this.placement = input(undefined, {
47
+ alias: 'tpPlacement',
48
+ });
49
+ this.popperOptions = input(undefined, {
50
+ alias: 'tpPopperOptions',
51
+ });
52
+ this.showOnCreate = input(undefined, {
53
+ alias: 'tpShowOnCreate',
54
+ });
55
+ this.trigger = input(undefined, { alias: 'tpTrigger' });
56
+ this.triggerTarget = input(undefined, {
57
+ alias: 'tpTriggerTarget',
58
+ });
59
+ this.zIndex = input(undefined, { alias: 'tpZIndex' });
60
+ this.animation = input(undefined, {
61
+ alias: 'tpAnimation',
62
+ });
63
+ this.useTextContent = input(false, {
64
+ transform: coerceBooleanAttribute,
65
+ alias: 'tpUseTextContent',
66
+ });
67
+ this.isLazy = input(false, {
68
+ transform: coerceBooleanAttribute,
69
+ alias: 'tpIsLazy',
70
+ });
71
+ this.variation = input(undefined, { alias: 'tpVariation' });
72
+ this.isEnabled = input(true, { alias: 'tpIsEnabled' });
73
+ this.className = input('', { alias: 'tpClassName' });
74
+ this.onlyTextOverflow = input(false, {
75
+ transform: coerceBooleanAttribute,
76
+ alias: 'tpOnlyTextOverflow',
77
+ });
78
+ this.staticWidthHost = input(false, {
79
+ transform: coerceBooleanAttribute,
80
+ alias: 'tpStaticWidthHost',
81
+ });
82
+ this.data = input(undefined, { alias: 'tpData' });
83
+ this.useHostWidth = input(false, {
84
+ transform: coerceBooleanAttribute,
85
+ alias: 'tpUseHostWidth',
86
+ });
87
+ this.hideOnEscape = input(false, {
88
+ transform: coerceBooleanAttribute,
89
+ alias: 'tpHideOnEscape',
90
+ });
91
+ this.detectChangesComponent = input(true, { alias: 'tpDetectChangesComponent' });
92
+ this.popperWidth = input(undefined, { alias: 'tpPopperWidth' });
93
+ this.customHost = input(undefined, { alias: 'tpHost' });
94
+ this.isVisible = model(false, { alias: 'tpIsVisible' });
29
95
  this.visible = new EventEmitter();
30
- this.destroyed = new Subject();
31
- this.enabled = true;
32
96
  this.variationDefined = false;
33
97
  /**
34
98
  * We had use `visible` event emitter previously as a `takeUntil` subscriber in multiple places
@@ -39,10 +103,26 @@ export class TippyDirective {
39
103
  */
40
104
  this.visibleInternal = new Subject();
41
105
  this.contentChanged = new Subject();
106
+ this.host = computed(() => this.customHost() || this.hostRef.nativeElement);
107
+ this.destroyRef = inject(DestroyRef);
108
+ this.isServer = isPlatformServer(inject(PLATFORM_ID));
109
+ this.tippyFactory = inject(TippyFactory);
110
+ if (this.isServer)
111
+ return;
112
+ this.setupListeners();
113
+ this.destroyRef.onDestroy(() => {
114
+ this.instance?.destroy();
115
+ this.destroyView();
116
+ this.visibilityObserverCleanup?.();
117
+ });
42
118
  }
43
119
  ngOnChanges(changes) {
44
- if (this.isServerSide)
120
+ if (this.isServer)
45
121
  return;
122
+ // TODO: we can update it later.
123
+ // We need to go over class properties, check whether it's a signal (`isSignal(prop)`)
124
+ // and construct a record where `Record<string, Signal>`.
125
+ // Follow-up changes would be to have a computation and an effect.
46
126
  let props = Object.keys(changes).reduce((acc, change) => {
47
127
  if (change === 'isVisible')
48
128
  return acc;
@@ -50,9 +130,6 @@ export class TippyDirective {
50
130
  return acc;
51
131
  }, {});
52
132
  let variation;
53
- if (isChanged('content', changes)) {
54
- this.contentChanged.next();
55
- }
56
133
  if (isChanged('variation', changes)) {
57
134
  variation = changes.variation.currentValue;
58
135
  this.variationDefined = true;
@@ -67,57 +144,41 @@ export class TippyDirective {
67
144
  ...props,
68
145
  };
69
146
  }
70
- if (isChanged('isEnabled', changes)) {
71
- this.enabled = changes.isEnabled.currentValue;
72
- this.setStatus();
73
- }
74
- if (isChanged('isVisible', changes)) {
75
- this.isVisible ? this.show() : this.hide();
76
- }
77
147
  this.updateProps(props);
78
148
  }
79
149
  ngOnInit() {
80
- if (this.useHostWidth) {
150
+ if (this.useHostWidth()) {
81
151
  this.props.maxWidth = this.hostWidth;
82
152
  }
83
153
  }
84
154
  ngAfterViewInit() {
85
- if (this.isServerSide)
155
+ if (this.isServer)
86
156
  return;
87
- this.zone.runOutsideAngular(() => {
88
- if (this.isLazy) {
89
- if (this.onlyTextOverflow) {
90
- inView(this.host)
91
- .pipe(switchMap(() => this.isOverflowing$()), takeUntil(this.destroyed))
92
- .subscribe((isElementOverflow) => {
93
- this.checkOverflow(isElementOverflow);
94
- });
95
- }
96
- else {
97
- inView(this.host)
98
- .pipe(takeUntil(this.destroyed))
99
- .subscribe(() => {
100
- this.createInstance();
101
- });
102
- }
103
- }
104
- else if (this.onlyTextOverflow) {
105
- this.isOverflowing$()
106
- .pipe(takeUntil(this.destroyed))
157
+ if (this.isLazy()) {
158
+ const hostInView$ = inView(this.host());
159
+ if (this.onlyTextOverflow()) {
160
+ hostInView$
161
+ .pipe(switchMap(() => this.isOverflowing$()), takeUntilDestroyed(this.destroyRef))
107
162
  .subscribe((isElementOverflow) => {
108
163
  this.checkOverflow(isElementOverflow);
109
164
  });
110
165
  }
111
166
  else {
112
- this.createInstance();
167
+ hostInView$.pipe(takeUntilDestroyed(this.destroyRef)).subscribe(() => {
168
+ this.createInstance();
169
+ });
113
170
  }
114
- });
115
- }
116
- ngOnDestroy() {
117
- this.destroyed.next();
118
- this.instance?.destroy();
119
- this.destroyView();
120
- this.visibilityObserverCleanup?.();
171
+ }
172
+ else if (this.onlyTextOverflow()) {
173
+ this.isOverflowing$()
174
+ .pipe(takeUntilDestroyed(this.destroyRef))
175
+ .subscribe((isElementOverflow) => {
176
+ this.checkOverflow(isElementOverflow);
177
+ });
178
+ }
179
+ else {
180
+ this.createInstance();
181
+ }
121
182
  }
122
183
  destroyView() {
123
184
  this.viewOptions$ = null;
@@ -130,27 +191,24 @@ export class TippyDirective {
130
191
  * For example, if you have a grid row with an element that you toggle using the display CSS property on hover.
131
192
  */
132
193
  observeHostVisibility() {
133
- if (this.isServerSide)
194
+ if (this.isServer)
134
195
  return;
135
196
  // We don't want to observe the host visibility if we are appending to the body.
136
197
  if (this.props.appendTo && this.props.appendTo !== document.body) {
137
198
  this.visibilityObserverCleanup?.();
138
199
  return this.visibleInternal
139
- .asObservable()
140
- .pipe(takeUntil(this.destroyed))
200
+ .pipe(takeUntilDestroyed(this.destroyRef))
141
201
  .subscribe((isVisible) => {
142
202
  if (isVisible) {
143
- this.zone.runOutsideAngular(() => {
144
- this.visibilityObserverCleanup = observeVisibility(this.instance.reference, () => {
145
- this.hide();
146
- // Because we have animation on the popper it doesn't close immediately doesn't trigger the `tpVisible` event.
147
- // Tippy is relying on the transitionend event to trigger the `onHidden` callback.
148
- // https://github.com/atomiks/tippyjs/blob/master/src/dom-utils.ts#L117
149
- // This event never fires because the popper is removed from the DOM before the transition ends.
150
- if (this.props.animation) {
151
- this.onHidden();
152
- }
153
- });
203
+ this.visibilityObserverCleanup = observeVisibility(this.instance.reference, () => {
204
+ this.hide();
205
+ // Because we have animation on the popper it doesn't close immediately doesn't trigger the `tpVisible` event.
206
+ // Tippy is relying on the transitionend event to trigger the `onHidden` callback.
207
+ // https://github.com/atomiks/tippyjs/blob/master/src/dom-utils.ts#L117
208
+ // This event never fires because the popper is removed from the DOM before the transition ends.
209
+ if (this.props.animation) {
210
+ this.onHidden();
211
+ }
154
212
  });
155
213
  }
156
214
  else {
@@ -178,85 +236,86 @@ export class TippyDirective {
178
236
  this.props = props;
179
237
  this.instance?.setProps(onlyTippyProps(props));
180
238
  }
181
- setStatus() {
182
- this.enabled ? this.instance?.enable() : this.instance?.disable();
183
- }
184
- get host() {
185
- return this.customHost || this.hostRef.nativeElement;
186
- }
187
- get hostWidth() {
188
- return this.host.getBoundingClientRect().width;
239
+ setStatus(isEnabled) {
240
+ isEnabled ? this.instance?.enable() : this.instance?.disable();
189
241
  }
190
242
  createInstance() {
191
- if (!this.content && !this.useTextContent) {
243
+ if (!this.content() && !this.useTextContent()) {
192
244
  return;
193
245
  }
194
- this.zone.runOutsideAngular(() => {
195
- this.instance = tippy(this.host, {
196
- allowHTML: true,
197
- appendTo: document.body,
198
- ...(this.globalConfig.zIndexGetter ? { zIndex: this.globalConfig.zIndexGetter() } : {}),
199
- ...onlyTippyProps(this.globalConfig),
200
- ...onlyTippyProps(this.props),
201
- onMount: (instance) => {
202
- this.isVisible = true;
203
- this.visibleInternal.next(this.isVisible);
204
- if (this.visible.observed) {
205
- this.zone.run(() => this.visible.next(this.isVisible));
206
- }
207
- this.useHostWidth && this.listenToHostResize();
208
- this.globalConfig.onMount?.(instance);
209
- },
210
- onCreate: (instance) => {
211
- instance.popper.classList.add(`tippy-variation-${this.variation || this.globalConfig.defaultVariation}`);
212
- if (this.className) {
213
- for (const klass of normalizeClassName(this.className)) {
214
- instance.popper.classList.add(klass);
215
- }
216
- }
217
- this.globalConfig.onCreate?.(instance);
218
- if (this.isVisible === true) {
219
- instance.show();
246
+ this.tippyFactory
247
+ .create(this.host(), {
248
+ allowHTML: true,
249
+ appendTo: document.body,
250
+ ...(this.globalConfig.zIndexGetter
251
+ ? { zIndex: this.globalConfig.zIndexGetter() }
252
+ : {}),
253
+ ...onlyTippyProps(this.globalConfig),
254
+ ...onlyTippyProps(this.props),
255
+ onMount: (instance) => {
256
+ const isVisible = true;
257
+ this.isVisible.set(isVisible);
258
+ this.visibleInternal.next(isVisible);
259
+ if (this.visible.observed) {
260
+ this.ngZone.run(() => this.visible.next(isVisible));
261
+ }
262
+ this.useHostWidth() && this.listenToHostResize();
263
+ this.globalConfig.onMount?.(instance);
264
+ },
265
+ onCreate: (instance) => {
266
+ instance.popper.classList.add(`tippy-variation-${this.variation() || this.globalConfig.defaultVariation}`);
267
+ if (this.className()) {
268
+ for (const klass of normalizeClassName(this.className())) {
269
+ instance.popper.classList.add(klass);
220
270
  }
221
- },
222
- onShow: (instance) => {
223
- instance.reference.setAttribute('data-tippy-open', '');
224
- this.zone.run(() => {
225
- const content = this.resolveContent(instance);
226
- if (isString(content)) {
227
- instance.setProps({ allowHTML: false });
228
- if (!content?.trim()) {
229
- this.disable();
230
- }
231
- else {
232
- this.enable();
233
- }
234
- }
235
- instance.setContent(content);
236
- this.hideOnEscape && this.handleEscapeButton();
237
- });
238
- if (this.useHostWidth) {
239
- this.setInstanceWidth(instance, this.hostWidth);
271
+ }
272
+ this.globalConfig.onCreate?.(instance);
273
+ if (this.isVisible() === true) {
274
+ instance.show();
275
+ }
276
+ },
277
+ onShow: (instance) => {
278
+ instance.reference.setAttribute('data-tippy-open', '');
279
+ // We're re-entering because we might create an Angular component,
280
+ // which should be done within the zone.
281
+ const content = this.ngZone.run(() => this.resolveContent(instance));
282
+ if (isString(content)) {
283
+ instance.setProps({ allowHTML: false });
284
+ if (!content?.trim()) {
285
+ this.disable();
240
286
  }
241
- else if (this.popperWidth) {
242
- this.setInstanceWidth(instance, this.popperWidth);
287
+ else {
288
+ this.enable();
243
289
  }
244
- this.globalConfig.onShow?.(instance);
245
- },
246
- onHide(instance) {
247
- instance.reference.removeAttribute('data-tippy-open');
248
- },
249
- onHidden: (instance) => {
250
- this.onHidden(instance);
251
- },
252
- });
253
- this.setStatus();
290
+ }
291
+ instance.setContent(content);
292
+ this.hideOnEscape() && this.handleEscapeButton();
293
+ if (this.useHostWidth()) {
294
+ this.setInstanceWidth(instance, this.hostWidth);
295
+ }
296
+ else if (this.popperWidth()) {
297
+ this.setInstanceWidth(instance, this.popperWidth());
298
+ }
299
+ this.globalConfig.onShow?.(instance);
300
+ },
301
+ onHide(instance) {
302
+ instance.reference.removeAttribute('data-tippy-open');
303
+ },
304
+ onHidden: (instance) => {
305
+ this.onHidden(instance);
306
+ },
307
+ })
308
+ .pipe(takeUntilDestroyed(this.destroyRef))
309
+ .subscribe((instance) => {
310
+ this.instance = instance;
311
+ this.setStatus(this.isEnabled());
254
312
  this.setProps(this.props);
255
- this.variation === 'contextMenu' && this.handleContextMenu();
313
+ this.variation() === 'contextMenu' && this.handleContextMenu();
256
314
  });
257
315
  }
258
316
  resolveContent(instance) {
259
- if (!this.viewOptions$ && !isString(this.content)) {
317
+ const content = this.content();
318
+ if (!this.viewOptions$ && !isString(content)) {
260
319
  const injector = Injector.create({
261
320
  providers: [
262
321
  {
@@ -266,42 +325,43 @@ export class TippyDirective {
266
325
  ],
267
326
  parent: this.injector,
268
327
  });
269
- if (isComponent(this.content)) {
270
- this.instance.data = this.data;
328
+ const data = this.data();
329
+ if (isComponent(content)) {
330
+ this.instance.data = data;
271
331
  this.viewOptions$ = {
272
332
  injector,
273
333
  };
274
334
  }
275
- else if (isTemplateRef(this.content)) {
335
+ else if (isTemplateRef(content)) {
276
336
  this.viewOptions$ = {
277
337
  injector,
278
338
  context: {
339
+ data,
279
340
  $implicit: this.hide.bind(this),
280
- data: this.data,
281
341
  },
282
342
  };
283
343
  }
284
344
  }
285
- this.viewRef = this.viewService.createView(this.content, {
345
+ this.viewRef = this.viewService.createView(content, {
286
346
  vcr: this.vcr,
287
347
  ...this.viewOptions$,
288
348
  });
289
349
  // We need to call detectChanges for onPush components to update the content
290
- if (this.detectChangesComponent && isComponent(this.content)) {
350
+ if (this.detectChangesComponent() && isComponent(content)) {
291
351
  this.viewRef.detectChanges();
292
352
  }
293
- let content = this.viewRef.getElement();
294
- if (this.useTextContent) {
295
- content = instance.reference.textContent;
353
+ let newContent = this.viewRef.getElement();
354
+ if (this.useTextContent()) {
355
+ newContent = instance.reference.textContent;
296
356
  }
297
- if (isString(content) && this.globalConfig.beforeRender) {
298
- content = this.globalConfig.beforeRender(content);
357
+ if (isString(newContent) && this.globalConfig.beforeRender) {
358
+ newContent = this.globalConfig.beforeRender(newContent);
299
359
  }
300
- return content;
360
+ return newContent;
301
361
  }
302
362
  handleContextMenu() {
303
- fromEvent(this.host, 'contextmenu')
304
- .pipe(takeUntil(this.destroyed))
363
+ fromEvent(this.host(), 'contextmenu')
364
+ .pipe(takeUntilDestroyed(this.destroyRef))
305
365
  .subscribe((event) => {
306
366
  event.preventDefault();
307
367
  this.instance.setProps({
@@ -318,11 +378,9 @@ export class TippyDirective {
318
378
  });
319
379
  }
320
380
  handleEscapeButton() {
321
- this.zone.runOutsideAngular(() => {
322
- fromEvent(document.body, 'keydown')
323
- .pipe(filter(({ code }) => code === 'Escape'), takeUntil(merge(this.destroyed, this.visibleInternal.pipe(filter((v) => !v)))))
324
- .subscribe(() => this.hide());
325
- });
381
+ fromEvent(document.body, 'keydown')
382
+ .pipe(filter(({ code }) => code === 'Escape'), takeUntil(this.visibleInternal.pipe(filter((v) => !v))), takeUntilDestroyed(this.destroyRef))
383
+ .subscribe(() => this.hide());
326
384
  }
327
385
  checkOverflow(isElementOverflow) {
328
386
  if (isElementOverflow) {
@@ -338,8 +396,8 @@ export class TippyDirective {
338
396
  }
339
397
  }
340
398
  listenToHostResize() {
341
- dimensionsChanges(this.host)
342
- .pipe(takeUntil(merge(this.destroyed, this.visibleInternal)))
399
+ dimensionsChanges(this.host())
400
+ .pipe(takeUntil(this.visibleInternal), takeUntilDestroyed(this.destroyRef))
343
401
  .subscribe(() => {
344
402
  this.setInstanceWidth(this.instance, this.hostWidth);
345
403
  });
@@ -350,23 +408,22 @@ export class TippyDirective {
350
408
  instance.popper.style.maxWidth = inPixels;
351
409
  instance.popper.firstElementChild.style.maxWidth = inPixels;
352
410
  }
353
- get isServerSide() {
354
- return isPlatformServer(this.platformId);
355
- }
356
411
  onHidden(instance = this.instance) {
357
412
  this.destroyView();
358
- this.isVisible = false;
359
- this.visibleInternal.next(this.isVisible);
413
+ const isVisible = false;
414
+ this.isVisible.set(isVisible);
415
+ this.visibleInternal.next(isVisible);
360
416
  if (this.visible.observed) {
361
- this.zone.run(() => this.visible.next(this.isVisible));
417
+ this.ngZone.run(() => this.visible.next(isVisible));
362
418
  }
363
419
  this.globalConfig.onHidden?.(instance);
364
420
  }
365
421
  isOverflowing$() {
366
- const notifiers$ = [overflowChanges(this.host)];
422
+ const host = this.host();
423
+ const notifiers$ = [overflowChanges(host)];
367
424
  // We need to handle cases where the host has a static width but the content might change
368
- if (this.staticWidthHost) {
369
- notifiers$.push(this.contentChanged.asObservable().pipe(
425
+ if (this.staticWidthHost()) {
426
+ notifiers$.push(this.contentChanged.pipe(
370
427
  // We need to wait for the content to be rendered before we can check if it's overflowing.
371
428
  switchMap(() => {
372
429
  return new Observable((subscriber) => {
@@ -376,14 +433,30 @@ export class TippyDirective {
376
433
  });
377
434
  return () => cancelAnimationFrame(id);
378
435
  });
379
- }), map(() => isElementOverflow(this.host))));
436
+ }), map(() => isElementOverflow(host))));
380
437
  }
381
438
  return merge(...notifiers$);
382
439
  }
383
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.4", ngImport: i0, type: TippyDirective, deps: [{ token: PLATFORM_ID }, { token: TIPPY_CONFIG }, { token: i0.Injector }, { token: i1.ViewService }, { token: i0.ViewContainerRef }, { token: i0.NgZone }, { token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Directive }); }
384
- static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "16.1.0", version: "17.0.4", type: TippyDirective, isStandalone: true, selector: "[tp]", inputs: { appendTo: ["tpAppendTo", "appendTo"], content: ["tp", "content"], delay: ["tpDelay", "delay"], duration: ["tpDuration", "duration"], hideOnClick: ["tpHideOnClick", "hideOnClick"], interactive: ["tpInteractive", "interactive"], interactiveBorder: ["tpInteractiveBorder", "interactiveBorder"], maxWidth: ["tpMaxWidth", "maxWidth"], offset: ["tpOffset", "offset"], placement: ["tpPlacement", "placement"], popperOptions: ["tpPopperOptions", "popperOptions"], showOnCreate: ["tpShowOnCreate", "showOnCreate"], trigger: ["tpTrigger", "trigger"], triggerTarget: ["tpTriggerTarget", "triggerTarget"], zIndex: ["tpZIndex", "zIndex"], animation: ["tpAnimation", "animation"], useTextContent: ["tpUseTextContent", "useTextContent", booleanAttribute], isLazy: ["tpIsLazy", "isLazy", booleanAttribute], variation: ["tpVariation", "variation"], isEnabled: ["tpIsEnabled", "isEnabled"], className: ["tpClassName", "className"], onlyTextOverflow: ["tpOnlyTextOverflow", "onlyTextOverflow", booleanAttribute], staticWidthHost: ["tpStaticWidthHost", "staticWidthHost", booleanAttribute], data: ["tpData", "data"], useHostWidth: ["tpUseHostWidth", "useHostWidth", booleanAttribute], hideOnEscape: ["tpHideOnEscape", "hideOnEscape", booleanAttribute], detectChangesComponent: ["tpDetectChangesComponent", "detectChangesComponent"], popperWidth: ["tpPopperWidth", "popperWidth"], customHost: ["tpHost", "customHost"], isVisible: ["tpIsVisible", "isVisible", booleanAttribute] }, outputs: { visible: "tpVisible" }, exportAs: ["tippy"], usesOnChanges: true, ngImport: i0 }); }
440
+ setupListeners() {
441
+ effect(() => {
442
+ const appendTo = this.appendTo();
443
+ this.updateProps({ appendTo });
444
+ });
445
+ effect(() => {
446
+ // Capture signal read to track its changes.
447
+ this.content();
448
+ untracked(() => this.contentChanged.next());
449
+ });
450
+ effect(() => this.setStatus(this.isEnabled()));
451
+ effect(() => {
452
+ const isVisible = this.isVisible();
453
+ isVisible ? this.show() : this.hide();
454
+ });
455
+ }
456
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.6", ngImport: i0, type: TippyDirective, deps: [{ token: TIPPY_CONFIG }, { token: i0.Injector }, { token: i1.ViewService }, { token: i0.ViewContainerRef }, { token: i0.NgZone }, { token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Directive }); }
457
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "18.0.6", type: TippyDirective, isStandalone: true, selector: "[tp]", inputs: { appendTo: { classPropertyName: "appendTo", publicName: "tpAppendTo", isSignal: true, isRequired: false, transformFunction: null }, content: { classPropertyName: "content", publicName: "tp", isSignal: true, isRequired: false, transformFunction: null }, delay: { classPropertyName: "delay", publicName: "tpDelay", isSignal: true, isRequired: false, transformFunction: null }, duration: { classPropertyName: "duration", publicName: "tpDuration", isSignal: true, isRequired: false, transformFunction: null }, hideOnClick: { classPropertyName: "hideOnClick", publicName: "tpHideOnClick", isSignal: true, isRequired: false, transformFunction: null }, interactive: { classPropertyName: "interactive", publicName: "tpInteractive", isSignal: true, isRequired: false, transformFunction: null }, interactiveBorder: { classPropertyName: "interactiveBorder", publicName: "tpInteractiveBorder", isSignal: true, isRequired: false, transformFunction: null }, maxWidth: { classPropertyName: "maxWidth", publicName: "tpMaxWidth", isSignal: true, isRequired: false, transformFunction: null }, offset: { classPropertyName: "offset", publicName: "tpOffset", isSignal: true, isRequired: false, transformFunction: null }, placement: { classPropertyName: "placement", publicName: "tpPlacement", isSignal: true, isRequired: false, transformFunction: null }, popperOptions: { classPropertyName: "popperOptions", publicName: "tpPopperOptions", isSignal: true, isRequired: false, transformFunction: null }, showOnCreate: { classPropertyName: "showOnCreate", publicName: "tpShowOnCreate", isSignal: true, isRequired: false, transformFunction: null }, trigger: { classPropertyName: "trigger", publicName: "tpTrigger", isSignal: true, isRequired: false, transformFunction: null }, triggerTarget: { classPropertyName: "triggerTarget", publicName: "tpTriggerTarget", isSignal: true, isRequired: false, transformFunction: null }, zIndex: { classPropertyName: "zIndex", publicName: "tpZIndex", isSignal: true, isRequired: false, transformFunction: null }, animation: { classPropertyName: "animation", publicName: "tpAnimation", isSignal: true, isRequired: false, transformFunction: null }, useTextContent: { classPropertyName: "useTextContent", publicName: "tpUseTextContent", isSignal: true, isRequired: false, transformFunction: null }, isLazy: { classPropertyName: "isLazy", publicName: "tpIsLazy", isSignal: true, isRequired: false, transformFunction: null }, variation: { classPropertyName: "variation", publicName: "tpVariation", isSignal: true, isRequired: false, transformFunction: null }, isEnabled: { classPropertyName: "isEnabled", publicName: "tpIsEnabled", isSignal: true, isRequired: false, transformFunction: null }, className: { classPropertyName: "className", publicName: "tpClassName", isSignal: true, isRequired: false, transformFunction: null }, onlyTextOverflow: { classPropertyName: "onlyTextOverflow", publicName: "tpOnlyTextOverflow", isSignal: true, isRequired: false, transformFunction: null }, staticWidthHost: { classPropertyName: "staticWidthHost", publicName: "tpStaticWidthHost", isSignal: true, isRequired: false, transformFunction: null }, data: { classPropertyName: "data", publicName: "tpData", isSignal: true, isRequired: false, transformFunction: null }, useHostWidth: { classPropertyName: "useHostWidth", publicName: "tpUseHostWidth", isSignal: true, isRequired: false, transformFunction: null }, hideOnEscape: { classPropertyName: "hideOnEscape", publicName: "tpHideOnEscape", isSignal: true, isRequired: false, transformFunction: null }, detectChangesComponent: { classPropertyName: "detectChangesComponent", publicName: "tpDetectChangesComponent", isSignal: true, isRequired: false, transformFunction: null }, popperWidth: { classPropertyName: "popperWidth", publicName: "tpPopperWidth", isSignal: true, isRequired: false, transformFunction: null }, customHost: { classPropertyName: "customHost", publicName: "tpHost", isSignal: true, isRequired: false, transformFunction: null }, isVisible: { classPropertyName: "isVisible", publicName: "tpIsVisible", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { isVisible: "tpIsVisibleChange", visible: "tpVisible" }, exportAs: ["tippy"], usesOnChanges: true, ngImport: i0 }); }
385
458
  }
386
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.4", ngImport: i0, type: TippyDirective, decorators: [{
459
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.6", ngImport: i0, type: TippyDirective, decorators: [{
387
460
  type: Directive,
388
461
  args: [{
389
462
  // eslint-disable-next-line @angular-eslint/directive-selector
@@ -392,106 +465,13 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.4", ngImpor
392
465
  standalone: true,
393
466
  }]
394
467
  }], ctorParameters: () => [{ type: undefined, decorators: [{
395
- type: Inject,
396
- args: [PLATFORM_ID]
397
- }] }, { type: undefined, decorators: [{
398
468
  type: Inject,
399
469
  args: [TIPPY_CONFIG]
400
- }] }, { type: i0.Injector }, { type: i1.ViewService }, { type: i0.ViewContainerRef }, { type: i0.NgZone }, { type: i0.ElementRef }], propDecorators: { appendTo: [{
401
- type: Input,
402
- args: ['tpAppendTo']
403
- }], content: [{
404
- type: Input,
405
- args: ['tp']
406
- }], delay: [{
407
- type: Input,
408
- args: ['tpDelay']
409
- }], duration: [{
410
- type: Input,
411
- args: ['tpDuration']
412
- }], hideOnClick: [{
413
- type: Input,
414
- args: ['tpHideOnClick']
415
- }], interactive: [{
416
- type: Input,
417
- args: ['tpInteractive']
418
- }], interactiveBorder: [{
419
- type: Input,
420
- args: ['tpInteractiveBorder']
421
- }], maxWidth: [{
422
- type: Input,
423
- args: ['tpMaxWidth']
424
- }], offset: [{
425
- type: Input,
426
- args: ['tpOffset']
427
- }], placement: [{
428
- type: Input,
429
- args: ['tpPlacement']
430
- }], popperOptions: [{
431
- type: Input,
432
- args: ['tpPopperOptions']
433
- }], showOnCreate: [{
434
- type: Input,
435
- args: ['tpShowOnCreate']
436
- }], trigger: [{
437
- type: Input,
438
- args: ['tpTrigger']
439
- }], triggerTarget: [{
440
- type: Input,
441
- args: ['tpTriggerTarget']
442
- }], zIndex: [{
443
- type: Input,
444
- args: ['tpZIndex']
445
- }], animation: [{
446
- type: Input,
447
- args: ['tpAnimation']
448
- }], useTextContent: [{
449
- type: Input,
450
- args: [{ transform: booleanAttribute, alias: 'tpUseTextContent' }]
451
- }], isLazy: [{
452
- type: Input,
453
- args: [{ transform: booleanAttribute, alias: 'tpIsLazy' }]
454
- }], variation: [{
455
- type: Input,
456
- args: ['tpVariation']
457
- }], isEnabled: [{
458
- type: Input,
459
- args: ['tpIsEnabled']
460
- }], className: [{
461
- type: Input,
462
- args: ['tpClassName']
463
- }], onlyTextOverflow: [{
464
- type: Input,
465
- args: [{ transform: booleanAttribute, alias: 'tpOnlyTextOverflow' }]
466
- }], staticWidthHost: [{
467
- type: Input,
468
- args: [{ transform: booleanAttribute, alias: 'tpStaticWidthHost' }]
469
- }], data: [{
470
- type: Input,
471
- args: ['tpData']
472
- }], useHostWidth: [{
473
- type: Input,
474
- args: [{ transform: booleanAttribute, alias: 'tpUseHostWidth' }]
475
- }], hideOnEscape: [{
476
- type: Input,
477
- args: [{ transform: booleanAttribute, alias: 'tpHideOnEscape' }]
478
- }], detectChangesComponent: [{
479
- type: Input,
480
- args: ['tpDetectChangesComponent']
481
- }], popperWidth: [{
482
- type: Input,
483
- args: ['tpPopperWidth']
484
- }], customHost: [{
485
- type: Input,
486
- args: ['tpHost']
487
- }], isVisible: [{
488
- type: Input,
489
- args: [{ transform: booleanAttribute, alias: 'tpIsVisible' }]
490
- }], visible: [{
470
+ }] }, { type: i0.Injector }, { type: i1.ViewService }, { type: i0.ViewContainerRef }, { type: i0.NgZone }, { type: i0.ElementRef }], propDecorators: { visible: [{
491
471
  type: Output,
492
472
  args: ['tpVisible']
493
473
  }] } });
494
474
  function isChanged(key, changes) {
495
475
  return key in changes;
496
476
  }
497
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGlwcHkuZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmduZWF0L2hlbGlwb3BwZXIvc3JjL2xpYi90aXBweS5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUVMLGdCQUFnQixFQUNoQixTQUFTLEVBRVQsWUFBWSxFQUNaLE1BQU0sRUFDTixRQUFRLEVBQ1IsS0FBSyxFQUtMLE1BQU0sRUFDTixXQUFXLEdBRVosTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDbkQsT0FBTyxLQUFtQixNQUFNLFVBQVUsQ0FBQztBQUMzQyxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzdELE9BQU8sRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNuRSxPQUFPLEVBQVcsV0FBVyxFQUFFLFFBQVEsRUFBRSxhQUFhLEVBQXFDLE1BQU0sa0JBQWtCLENBQUM7QUFFcEgsT0FBTyxFQUNMLG1CQUFtQixFQUNuQixpQkFBaUIsRUFDakIsTUFBTSxFQUNOLGlCQUFpQixFQUNqQixrQkFBa0IsRUFDbEIsaUJBQWlCLEVBQ2pCLGNBQWMsRUFDZCxlQUFlLEdBQ2hCLE1BQU0sU0FBUyxDQUFDO0FBQ2pCLE9BQU8sRUFBYSxZQUFZLEVBQUUsU0FBUyxFQUEwQyxNQUFNLGVBQWUsQ0FBQzs7O0FBUTNHLE1BQU0sT0FBTyxjQUFjO0lBQ3pCLElBQXlCLFFBQVEsQ0FBQyxRQUFnQztRQUNoRSxJQUFJLENBQUMsV0FBVyxDQUFDLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQztJQUNqQyxDQUFDO0lBb0RELFlBQ2lDLFVBQWtCLEVBQ2pCLFlBQXlCLEVBQy9DLFFBQWtCLEVBQ2xCLFdBQXdCLEVBQ3hCLEdBQXFCLEVBQ3JCLElBQVksRUFDWixPQUFtQjtRQU5FLGVBQVUsR0FBVixVQUFVLENBQVE7UUFDakIsaUJBQVksR0FBWixZQUFZLENBQWE7UUFDL0MsYUFBUSxHQUFSLFFBQVEsQ0FBVTtRQUNsQixnQkFBVyxHQUFYLFdBQVcsQ0FBYTtRQUN4QixRQUFHLEdBQUgsR0FBRyxDQUFrQjtRQUNyQixTQUFJLEdBQUosSUFBSSxDQUFRO1FBQ1osWUFBTyxHQUFQLE9BQU8sQ0FBWTtRQXRDc0MscUJBQWdCLEdBQUcsS0FBSyxDQUFDO1FBQzFCLG9CQUFlLEdBQUcsS0FBSyxDQUFDO1FBRTNCLGlCQUFZLEdBQUcsS0FBSyxDQUFDO1FBQ3JCLGlCQUFZLEdBQUcsS0FBSyxDQUFDO1FBQ25ELDJCQUFzQixHQUFHLElBQUksQ0FBQztRQUdILGNBQVMsR0FBRyxLQUFLLENBQUM7UUFFM0QsWUFBTyxHQUFHLElBQUksWUFBWSxFQUFXLENBQUM7UUFJakQsY0FBUyxHQUFHLElBQUksT0FBTyxFQUFRLENBQUM7UUFFaEMsWUFBTyxHQUFHLElBQUksQ0FBQztRQUNmLHFCQUFnQixHQUFHLEtBQUssQ0FBQztRQUduQzs7Ozs7O1dBTUc7UUFDTyxvQkFBZSxHQUFHLElBQUksT0FBTyxFQUFXLENBQUM7UUFFM0MsbUJBQWMsR0FBRyxJQUFJLE9BQU8sRUFBUSxDQUFDO0lBVTFDLENBQUM7SUFFSixXQUFXLENBQUMsT0FBa0M7UUFDNUMsSUFBSSxJQUFJLENBQUMsWUFBWTtZQUFFLE9BQU87UUFFOUIsSUFBSSxLQUFLLEdBQXlCLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxFQUFFLE1BQU0sRUFBRSxFQUFFO1lBQzVFLElBQUksTUFBTSxLQUFLLFdBQVc7Z0JBQUUsT0FBTyxHQUFHLENBQUM7WUFFdkMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxZQUFZLENBQUM7WUFFM0MsT0FBTyxHQUFHLENBQUM7UUFDYixDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFFUCxJQUFJLFNBQWlCLENBQUM7UUFFdEIsSUFBSSxTQUFTLENBQUMsU0FBUyxFQUFFLE9BQU8sQ0FBQyxFQUFFO1lBQ2pDLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxFQUFFLENBQUM7U0FDNUI7UUFFRCxJQUFJLFNBQVMsQ0FBQyxXQUFXLEVBQUUsT0FBTyxDQUFDLEVBQUU7WUFDbkMsU0FBUyxHQUFHLE9BQU8sQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDO1lBQzNDLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLENBQUM7U0FDOUI7YUFBTSxJQUFJLENBQUMsSUFBSSxDQUFDLGdCQUFnQixFQUFFO1lBQ2pDLFNBQVMsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLGdCQUFnQixDQUFDO1lBQy9DLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLENBQUM7U0FDOUI7UUFFRCxJQUFJLFNBQVMsRUFBRTtZQUNiLEtBQUssR0FBRztnQkFDTixHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQztnQkFDMUMsR0FBRyxLQUFLO2FBQ1QsQ0FBQztTQUNIO1FBRUQsSUFBSSxTQUFTLENBQUMsV0FBVyxFQUFFLE9BQU8sQ0FBQyxFQUFFO1lBQ25DLElBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDLFNBQVMsQ0FBQyxZQUFZLENBQUM7WUFDOUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1NBQ2xCO1FBRUQsSUFBSSxTQUFTLENBQUMsV0FBVyxFQUFFLE9BQU8sQ0FBQyxFQUFFO1lBQ25DLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1NBQzVDO1FBRUQsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUMxQixDQUFDO0lBRUQsUUFBUTtRQUNOLElBQUksSUFBSSxDQUFDLFlBQVksRUFBRTtZQUNyQixJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDO1NBQ3RDO0lBQ0gsQ0FBQztJQUVELGVBQWU7UUFDYixJQUFJLElBQUksQ0FBQyxZQUFZO1lBQUUsT0FBTztRQUU5QixJQUFJLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsRUFBRTtZQUMvQixJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUU7Z0JBQ2YsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLEVBQUU7b0JBQ3pCLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDO3lCQUNkLElBQUksQ0FDSCxTQUFTLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDLEVBQ3RDLFNBQVMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQzFCO3lCQUNBLFNBQVMsQ0FBQyxDQUFDLGlCQUFpQixFQUFFLEVBQUU7d0JBQy9CLElBQUksQ0FBQyxhQUFhLENBQUMsaUJBQWlCLENBQUMsQ0FBQztvQkFDeEMsQ0FBQyxDQUFDLENBQUM7aUJBQ047cUJBQU07b0JBQ0wsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7eUJBQ2QsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7eUJBQy9CLFNBQVMsQ0FBQyxHQUFHLEVBQUU7d0JBQ2QsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO29CQUN4QixDQUFDLENBQUMsQ0FBQztpQkFDTjthQUNGO2lCQUFNLElBQUksSUFBSSxDQUFDLGdCQUFnQixFQUFFO2dCQUNoQyxJQUFJLENBQUMsY0FBYyxFQUFFO3FCQUNsQixJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztxQkFDL0IsU0FBUyxDQUFDLENBQUMsaUJBQWlCLEVBQUUsRUFBRTtvQkFDL0IsSUFBSSxDQUFDLGFBQWEsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO2dCQUN4QyxDQUFDLENBQUMsQ0FBQzthQUNOO2lCQUFNO2dCQUNMLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQzthQUN2QjtRQUNILENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELFdBQVc7UUFDVCxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ3RCLElBQUksQ0FBQyxRQUFRLEVBQUUsT0FBTyxFQUFFLENBQUM7UUFDekIsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ25CLElBQUksQ0FBQyx5QkFBeUIsRUFBRSxFQUFFLENBQUM7SUFDckMsQ0FBQztJQUVELFdBQVc7UUFDVCxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQztRQUN6QixJQUFJLENBQUMsT0FBTyxFQUFFLE9BQU8sRUFBRSxDQUFDO1FBQ3hCLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDO0lBQ3RCLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gscUJBQXFCO1FBQ25CLElBQUksSUFBSSxDQUFDLFlBQVk7WUFBRSxPQUFPO1FBQzlCLGdGQUFnRjtRQUNoRixJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxLQUFLLFFBQVEsQ0FBQyxJQUFJLEVBQUU7WUFDaEUsSUFBSSxDQUFDLHlCQUF5QixFQUFFLEVBQUUsQ0FBQztZQUNuQyxPQUFPLElBQUksQ0FBQyxlQUFlO2lCQUN4QixZQUFZLEVBQUU7aUJBQ2QsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7aUJBQy9CLFNBQVMsQ0FBQyxDQUFDLFNBQVMsRUFBRSxFQUFFO2dCQUN2QixJQUFJLFNBQVMsRUFBRTtvQkFDYixJQUFJLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsRUFBRTt3QkFDL0IsSUFBSSxDQUFDLHlCQUF5QixHQUFHLGlCQUFpQixDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsU0FBUyxFQUFFLEdBQUcsRUFBRTs0QkFDL0UsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDOzRCQUNaLDhHQUE4Rzs0QkFDOUcsa0ZBQWtGOzRCQUNsRix1RUFBdUU7NEJBQ3ZFLGdHQUFnRzs0QkFDaEcsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsRUFBRTtnQ0FDeEIsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDOzZCQUNqQjt3QkFDSCxDQUFDLENBQUMsQ0FBQztvQkFDTCxDQUFDLENBQUMsQ0FBQztpQkFDSjtxQkFBTTtvQkFDTCxJQUFJLENBQUMseUJBQXlCLEVBQUUsRUFBRSxDQUFDO2lCQUNwQztZQUNILENBQUMsQ0FBQyxDQUFDO1NBQ047SUFDSCxDQUFDO0lBRUQsSUFBSTtRQUNGLElBQUksQ0FBQyxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUM7SUFDeEIsQ0FBQztJQUVELElBQUk7UUFDRixJQUFJLENBQUMsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDO0lBQ3hCLENBQUM7SUFFRCxNQUFNO1FBQ0osSUFBSSxDQUFDLFFBQVEsRUFBRSxNQUFNLEVBQUUsQ0FBQztJQUMxQixDQUFDO0lBRUQsT0FBTztRQUNMLElBQUksQ0FBQyxRQUFRLEVBQUUsT0FBTyxFQUFFLENBQUM7SUFDM0IsQ0FBQztJQUVTLFdBQVcsQ0FBQyxLQUEyQjtRQUMvQyxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsS0FBSyxFQUFFLEdBQUcsS0FBSyxFQUFFLENBQUMsQ0FBQztJQUM3QyxDQUFDO0lBRVMsUUFBUSxDQUFDLEtBQTJCO1FBQzVDLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO1FBQ25CLElBQUksQ0FBQyxRQUFRLEVBQUUsUUFBUSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO0lBQ2pELENBQUM7SUFFUyxTQUFTO1FBQ2pCLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsT0FBTyxFQUFFLENBQUM7SUFDcEUsQ0FBQztJQUVELElBQWMsSUFBSTtRQUNoQixPQUFPLElBQUksQ0FBQyxVQUFVLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUM7SUFDdkQsQ0FBQztJQUVELElBQWMsU0FBUztRQUNyQixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMscUJBQXFCLEVBQUUsQ0FBQyxLQUFLLENBQUM7SUFDakQsQ0FBQztJQUVTLGNBQWM7UUFDdEIsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxFQUFFO1lBQ3pDLE9BQU87U0FDUjtRQUVELElBQUksQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsR0FBRyxFQUFFO1lBQy9CLElBQUksQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUU7Z0JBQy9CLFNBQVMsRUFBRSxJQUFJO2dCQUNmLFFBQVEsRUFBRSxRQUFRLENBQUMsSUFBSTtnQkFDdkIsR0FBRyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxFQUFFLE1BQU0sRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLFlBQVksRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztnQkFDdkYsR0FBRyxjQUFjLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQztnQkFDcEMsR0FBRyxjQUFjLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQztnQkFDN0IsT0FBTyxFQUFFLENBQUMsUUFBUSxFQUFFLEVBQUU7b0JBQ3BCLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDO29CQUN0QixJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7b0JBQzFDLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLEVBQUU7d0JBQ3pCLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO3FCQUN4RDtvQkFDRCxJQUFJLENBQUMsWUFBWSxJQUFJLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO29CQUMvQyxJQUFJLENBQUMsWUFBWSxDQUFDLE9BQU8sRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDO2dCQUN4QyxDQUFDO2dCQUNELFFBQVEsRUFBRSxDQUFDLFFBQVEsRUFBRSxFQUFFO29CQUNyQixRQUFRLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsbUJBQW1CLElBQUksQ0FBQyxTQUFTLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDLENBQUM7b0JBQ3pHLElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRTt3QkFDbEIsS0FBSyxNQUFNLEtBQUssSUFBSSxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUU7NEJBQ3RELFFBQVEsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQzt5QkFDdEM7cUJBQ0Y7b0JBQ0QsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQztvQkFDdkMsSUFBSSxJQUFJLENBQUMsU0FBUyxLQUFLLElBQUksRUFBRTt3QkFDM0IsUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDO3FCQUNqQjtnQkFDSCxDQUFDO2dCQUNELE1BQU0sRUFBRSxDQUFDLFFBQVEsRUFBRSxFQUFFO29CQUNuQixRQUFRLENBQUMsU0FBUyxDQUFDLFlBQVksQ0FBQyxpQkFBaUIsRUFBRSxFQUFFLENBQUMsQ0FBQztvQkFDdkQsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFO3dCQUNqQixNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLFFBQVEsQ0FBQyxDQUFDO3dCQUM5QyxJQUFJLFFBQVEsQ0FBQyxPQUFPLENBQUMsRUFBRTs0QkFDckIsUUFBUSxDQUFDLFFBQVEsQ0FBQyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDOzRCQUV4QyxJQUFJLENBQUMsT0FBTyxFQUFFLElBQUksRUFBRSxFQUFFO2dDQUNwQixJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7NkJBQ2hCO2lDQUFNO2dDQUNMLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQzs2QkFDZjt5QkFDRjt3QkFFRCxRQUFRLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDO3dCQUM3QixJQUFJLENBQUMsWUFBWSxJQUFJLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO29CQUNqRCxDQUFDLENBQUMsQ0FBQztvQkFDSCxJQUFJLElBQUksQ0FBQyxZQUFZLEVBQUU7d0JBQ3JCLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO3FCQUNqRDt5QkFBTSxJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUU7d0JBQzNCLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO3FCQUNuRDtvQkFDRCxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDO2dCQUN2QyxDQUFDO2dCQUNELE1BQU0sQ0FBQyxRQUFRO29CQUNiLFFBQVEsQ0FBQyxTQUFTLENBQUMsZUFBZSxDQUFDLGlCQUFpQixDQUFDLENBQUM7Z0JBQ3hELENBQUM7Z0JBQ0QsUUFBUSxFQUFFLENBQUMsUUFBUSxFQUFFLEVBQUU7b0JBQ3JCLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUM7Z0JBQzFCLENBQUM7YUFDRixDQUFDLENBQUM7WUFFSCxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDakIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7WUFFMUIsSUFBSSxDQUFDLFNBQVMsS0FBSyxhQUFhLElBQUksSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7UUFDL0QsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRVMsY0FBYyxDQUFDLFFBQXVCO1FBQzlDLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRTtZQUNqRCxNQUFNLFFBQVEsR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDO2dCQUMvQixTQUFTLEVBQUU7b0JBQ1Q7d0JBQ0UsT0FBTyxFQUFFLFNBQVM7d0JBQ2xCLFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUTtxQkFDeEI7aUJBQ0Y7Z0JBQ0QsTUFBTSxFQUFFLElBQUksQ0FBQyxRQUFRO2FBQ3RCLENBQUMsQ0FBQztZQUNILElBQUksV0FBVyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRTtnQkFDN0IsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQztnQkFFL0IsSUFBSSxDQUFDLFlBQVksR0FBRztvQkFDbEIsUUFBUTtpQkFDVCxDQUFDO2FBQ0g7aUJBQU0sSUFBSSxhQUFhLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFO2dCQUN0QyxJQUFJLENBQUMsWUFBWSxHQUFHO29CQUNsQixRQUFRO29CQUNSLE9BQU8sRUFBRTt3QkFDUCxTQUFTLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDO3dCQUMvQixJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUk7cUJBQ2hCO2lCQUNGLENBQUM7YUFDSDtTQUNGO1FBRUQsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFO1lBQ3ZELEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRztZQUNiLEdBQUcsSUFBSSxDQUFDLFlBQVk7U0FDckIsQ0FBQyxDQUFDO1FBRUgsNEVBQTRFO1FBQzVFLElBQUksSUFBSSxDQUFDLHNCQUFzQixJQUFJLFdBQVcsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUU7WUFDNUQsSUFBSSxDQUFDLE9BQU8sQ0FBQyxhQUFhLEVBQUUsQ0FBQztTQUM5QjtRQUVELElBQUksT0FBTyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxFQUFFLENBQUM7UUFFeEMsSUFBSSxJQUFJLENBQUMsY0FBYyxFQUFFO1lBQ3ZCLE9BQU8sR0FBRyxRQUFRLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQztTQUMxQztRQUVELElBQUksUUFBUSxDQUFDLE9BQU8sQ0FBQyxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsWUFBWSxFQUFFO1lBQ3ZELE9BQU8sR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsQ0FBQztTQUNuRDtRQUVELE9BQU8sT0FBTyxDQUFDO0lBQ2pCLENBQUM7SUFFUyxpQkFBaUI7UUFDekIsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsYUFBYSxDQUFDO2FBQ2hDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO2FBQy9CLFNBQVMsQ0FBQyxDQUFDLEtBQWlCLEVBQUUsRUFBRTtZQUMvQixLQUFLLENBQUMsY0FBYyxFQUFFLENBQUM7WUFFdkIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUM7Z0JBQ3JCLHNCQUFzQixFQUFFLEdBQUcsRUFBRSxDQUMzQixDQUFDO29CQUNDLEtBQUssRUFBRSxDQUFDO29CQUNSLE1BQU0sRUFBRSxDQUFDO29CQUNULEdBQUcsRUFBRSxLQUFLLENBQUMsT0FBTztvQkFDbEIsTUFBTSxFQUFFLEtBQUssQ0FBQyxPQUFPO29CQUNyQixJQUFJLEVBQUUsS0FBSyxDQUFDLE9BQU87b0JBQ25CLEtBQUssRUFBRSxLQUFLLENBQUMsT0FBTztpQkFDRCxDQUFBO2FBQ3hCLENBQUMsQ0FBQztZQUVILElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDdkIsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO0lBRVMsa0JBQWtCO1FBQzFCLElBQUksQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsR0FBRyxFQUFFO1lBQy9CLFNBQVMsQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLFNBQVMsQ0FBQztpQkFDaEMsSUFBSSxDQUNILE1BQU0sQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFpQixFQUFFLEVBQUUsQ0FBQyxJQUFJLEtBQUssUUFBUSxDQUFDLEVBQ3RELFNBQVMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQy9FO2lCQUNBLFNBQVMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUNsQyxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFUyxhQUFhLENBQUMsaUJBQTBCO1FBQ2hELElBQUksaUJBQWlCLEVBQUU7WUFDckIsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUU7Z0JBQ2xCLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQzthQUN2QjtpQkFBTTtnQkFDTCxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDO2FBQ3hCO1NBQ0Y7YUFBTTtZQUNMLElBQUksQ0FBQyxRQUFRLEVBQUUsT0FBTyxFQUFFLENBQUM7U0FDMUI7SUFDSCxDQUFDO0lBRVMsa0JBQWtCO1FBQzFCLGlCQUFpQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7YUFDekIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQzthQUM1RCxTQUFTLENBQUMsR0FBRyxFQUFFO1lBQ2QsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ3ZELENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUVTLGdCQUFnQixDQUFDLFFBQWtCLEVBQUUsS0FBc0I7UUFDbkUsTUFBTSxRQUFRLEdBQUcsbUJBQW1CLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDNUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsS0FBSyxHQUFHLFFBQVEsQ0FBQztRQUN2QyxRQUFRLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDO1FBQ3pDLFFBQVEsQ0FBQyxNQUFNLENBQUMsaUJBQWlDLENBQUMsS0FBSyxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUM7SUFDL0UsQ0FBQztJQUVELElBQVksWUFBWTtRQUN0QixPQUFPLGdCQUFnQixDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUMzQyxDQUFDO0lBRU8sUUFBUSxDQUFDLFdBQTBCLElBQUksQ0FBQyxRQUFRO1FBQ3RELElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUNuQixJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQztRQUN2QixJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDMUMsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsRUFBRTtZQUN6QixJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztTQUN4RDtRQUNELElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDekMsQ0FBQztJQUVPLGNBQWM7UUFDcEIsTUFBTSxVQUFVLEdBQUcsQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7UUFFaEQseUZBQXlGO1FBQ3pGLElBQUksSUFBSSxDQUFDLGVBQWUsRUFBRTtZQUN4QixVQUFVLENBQUMsSUFBSSxDQUNiLElBQUksQ0FBQyxjQUFjLENBQUMsWUFBWSxFQUFFLENBQUMsSUFBSTtZQUNyQywwRkFBMEY7WUFDMUYsU0FBUyxDQUFDLEdBQUcsRUFBRTtnQkFDYixPQUFPLElBQUksVUFBVSxDQUFDLENBQUMsVUFBVSxFQUFFLEVBQUU7b0JBQ25DLE1BQU0sRUFBRSxHQUFHLE1BQU0sQ0FBQyxxQkFBcUIsQ0FBQyxHQUFHLEVBQUU7d0JBQzNDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsQ0FBQzt3QkFDbEIsVUFBVSxDQUFDLFFBQVEsRUFBRSxDQUFDO29CQUN4QixDQUFDLENBQUMsQ0FBQztvQkFFSCxPQUFPLEdBQUcsRUFBRSxDQUFDLG9CQUFvQixDQUFDLEVBQUUsQ0FBQyxDQUFDO2dCQUN4QyxDQUFDLENBQUMsQ0FBQztZQUNMLENBQUMsQ0FBQyxFQUNGLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FDeEMsQ0FDRixDQUFDO1NBQ0g7UUFFRCxPQUFPLEtBQUssQ0FBQyxHQUFHLFVBQVUsQ0FBQyxDQUFDO0lBQzlCLENBQUM7OEdBcmNVLGNBQWMsa0JBd0RmLFdBQVcsYUFDWCxZQUFZO2tHQXpEWCxjQUFjLG93QkFtQkwsZ0JBQWdCLGtDQUNoQixnQkFBZ0IsMkxBSWhCLGdCQUFnQiw2REFDaEIsZ0JBQWdCLDhFQUVoQixnQkFBZ0Isb0RBQ2hCLGdCQUFnQixnTkFJaEIsZ0JBQWdCOzsyRkFoQ3pCLGNBQWM7a0JBTjFCLFNBQVM7bUJBQUM7b0JBQ1QsOERBQThEO29CQUM5RCxRQUFRLEVBQUUsTUFBTTtvQkFDaEIsUUFBUSxFQUFFLE9BQU87b0JBQ2pCLFVBQVUsRUFBRSxJQUFJO2lCQUNqQjs7MEJBeURJLE1BQU07MkJBQUMsV0FBVzs7MEJBQ2xCLE1BQU07MkJBQUMsWUFBWTt1S0F4REcsUUFBUTtzQkFBaEMsS0FBSzt1QkFBQyxZQUFZO2dCQUdOLE9BQU87c0JBQW5CLEtBQUs7dUJBQUMsSUFBSTtnQkFDTyxLQUFLO3NCQUF0QixLQUFLO3VCQUFDLFNBQVM7Z0JBQ0ssUUFBUTtzQkFBNUIsS0FBSzt1QkFBQyxZQUFZO2dCQUNLLFdBQVc7c0JBQWxDLEtBQUs7dUJBQUMsZUFBZTtnQkFDRSxXQUFXO3NCQUFsQyxLQUFLO3VCQUFDLGVBQWU7Z0JBQ1EsaUJBQWlCO3NCQUE5QyxLQUFLO3VCQUFDLHFCQUFxQjtnQkFDUCxRQUFRO3NCQUE1QixLQUFLO3VCQUFDLFlBQVk7Z0JBQ0EsTUFBTTtzQkFBeEIsS0FBSzt1QkFBQyxVQUFVO2dCQUNLLFNBQVM7c0JBQTlCLEtBQUs7dUJBQUMsYUFBYTtnQkFDTSxhQUFhO3NCQUF0QyxLQUFLO3VCQUFDLGlCQUFpQjtnQkFDQyxZQUFZO3NCQUFwQyxLQUFLO3VCQUFDLGdCQUFnQjtnQkFDSCxPQUFPO3NCQUExQixLQUFLO3VCQUFDLFdBQVc7Z0JBQ1EsYUFBYTtzQkFBdEMsS0FBSzt1QkFBQyxpQkFBaUI7Z0JBQ0wsTUFBTTtzQkFBeEIsS0FBSzt1QkFBQyxVQUFVO2dCQUNLLFNBQVM7c0JBQTlCLEtBQUs7dUJBQUMsYUFBYTtnQkFDK0MsY0FBYztzQkFBaEYsS0FBSzt1QkFBQyxFQUFFLFNBQVMsRUFBRSxnQkFBZ0IsRUFBRSxLQUFLLEVBQUUsa0JBQWtCLEVBQUU7Z0JBQ04sTUFBTTtzQkFBaEUsS0FBSzt1QkFBQyxFQUFFLFNBQVMsRUFBRSxnQkFBZ0IsRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFO2dCQUNuQyxTQUFTO3NCQUE5QixLQUFLO3VCQUFDLGFBQWE7Z0JBQ0UsU0FBUztzQkFBOUIsS0FBSzt1QkFBQyxhQUFhO2dCQUNFLFNBQVM7c0JBQTlCLEtBQUs7dUJBQUMsYUFBYTtnQkFDaUQsZ0JBQWdCO3NCQUFwRixLQUFLO3VCQUFDLEVBQUUsU0FBUyxFQUFFLGdCQUFnQixFQUFFLEtBQUssRUFBRSxvQkFBb0IsRUFBRTtnQkFDQyxlQUFlO3NCQUFsRixLQUFLO3VCQUFDLEVBQUUsU0FBUyxFQUFFLGdCQUFnQixFQUFFLEtBQUssRUFBRSxtQkFBbUIsRUFBRTtnQkFDakQsSUFBSTtzQkFBcEIsS0FBSzt1QkFBQyxRQUFRO2dCQUNrRCxZQUFZO3NCQUE1RSxLQUFLO3VCQUFDLEVBQUUsU0FBUyxFQUFFLGdCQUFnQixFQUFFLEtBQUssRUFBRSxnQkFBZ0IsRUFBRTtnQkFDRSxZQUFZO3NCQUE1RSxLQUFLO3VCQUFDLEVBQUUsU0FBUyxFQUFFLGdCQUFnQixFQUFFLEtBQUssRUFBRSxnQkFBZ0IsRUFBRTtnQkFDNUIsc0JBQXNCO3NCQUF4RCxLQUFLO3VCQUFDLDBCQUEwQjtnQkFDVCxXQUFXO3NCQUFsQyxLQUFLO3VCQUFDLGVBQWU7Z0JBQ0wsVUFBVTtzQkFBMUIsS0FBSzt1QkFBQyxRQUFRO2dCQUMrQyxTQUFTO3NCQUF0RSxLQUFLO3VCQUFDLEVBQUUsU0FBUyxFQUFFLGdCQUFnQixFQUFFLEtBQUssRUFBRSxhQUFhLEVBQUU7Z0JBRXZDLE9BQU87c0JBQTNCLE1BQU07dUJBQUMsV0FBVzs7QUFzYXJCLFNBQVMsU0FBUyxDQUFDLEdBQW9DLEVBQUUsT0FBa0M7SUFDekYsT0FBTyxHQUFHLElBQUksT0FBTyxDQUFDO0FBQ3hCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBBZnRlclZpZXdJbml0LFxuICBib29sZWFuQXR0cmlidXRlLFxuICBEaXJlY3RpdmUsXG4gIEVsZW1lbnRSZWYsXG4gIEV2ZW50RW1pdHRlcixcbiAgSW5qZWN0LFxuICBJbmplY3RvcixcbiAgSW5wdXQsXG4gIE5nWm9uZSxcbiAgT25DaGFuZ2VzLFxuICBPbkRlc3Ryb3ksXG4gIE9uSW5pdCxcbiAgT3V0cHV0LFxuICBQTEFURk9STV9JRCxcbiAgVmlld0NvbnRhaW5lclJlZixcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBpc1BsYXRmb3JtU2VydmVyIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB0aXBweSwgeyBJbnN0YW5jZSB9IGZyb20gJ3RpcHB5LmpzJztcbmltcG9ydCB7IGZyb21FdmVudCwgbWVyZ2UsIE9ic2VydmFibGUsIFN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGZpbHRlciwgbWFwLCBzd2l0Y2hNYXAsIHRha2VVbnRpbCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IENvbnRlbnQsIGlzQ29tcG9uZW50LCBpc1N0cmluZywgaXNUZW1wbGF0ZVJlZiwgVmlld09wdGlvbnMsIFZpZXdSZWYsIFZpZXdTZXJ2aWNlIH0gZnJvbSAnQG5nbmVhdC9vdmVydmlldyc7XG5cbmltcG9ydCB7XG4gIGNvZXJjZUNzc1BpeGVsVmFsdWUsXG4gIGRpbWVuc2lvbnNDaGFuZ2VzLFxuICBpblZpZXcsXG4gIGlzRWxlbWVudE92ZXJmbG93LFxuICBub3JtYWxpemVDbGFzc05hbWUsXG4gIG9ic2VydmVWaXNpYmlsaXR5LFxuICBvbmx5VGlwcHlQcm9wcyxcbiAgb3ZlcmZsb3dDaGFuZ2VzLFxufSBmcm9tICcuL3V0aWxzJztcbmltcG9ydCB7IE5nQ2hhbmdlcywgVElQUFlfQ09ORklHLCBUSVBQWV9SRUYsIFRpcHB5Q29uZmlnLCBUaXBweUluc3RhbmNlLCBUaXBweVByb3BzIH0gZnJvbSAnLi90aXBweS50eXBlcyc7XG5cbkBEaXJlY3RpdmUoe1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQGFuZ3VsYXItZXNsaW50L2RpcmVjdGl2ZS1zZWxlY3RvclxuICBzZWxlY3RvcjogJ1t0cF0nLFxuICBleHBvcnRBczogJ3RpcHB5JyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbn0pXG5leHBvcnQgY2xhc3MgVGlwcHlEaXJlY3RpdmUgaW1wbGVtZW50cyBPbkNoYW5nZXMsIEFmdGVyVmlld0luaXQsIE9uRGVzdHJveSwgT25Jbml0IHtcbiAgQElucHV0KCd0cEFwcGVuZFRvJykgc2V0IGFwcGVuZFRvKGFwcGVuZFRvOiBUaXBweVByb3BzWydhcHBlbmRUbyddKSB7XG4gICAgdGhpcy51cGRhdGVQcm9wcyh7IGFwcGVuZFRvIH0pO1xuICB9XG4gIEBJbnB1dCgndHAnKSBjb250ZW50OiBDb250ZW50IHwgdW5kZWZpbmVkIHwgbnVsbDtcbiAgQElucHV0KCd0cERlbGF5JykgZGVsYXk6IFRpcHB5UHJvcHNbJ2RlbGF5J107XG4gIEBJbnB1dCgndHBEdXJhdGlvbicpIGR1cmF0aW9uOiBUaXBweVByb3BzWydkdXJhdGlvbiddO1xuICBASW5wdXQoJ3RwSGlkZU9uQ2xpY2snKSBoaWRlT25DbGljazogVGlwcHlQcm9wc1snaGlkZU9uQ2xpY2snXTtcbiAgQElucHV0KCd0cEludGVyYWN0aXZlJykgaW50ZXJhY3RpdmU6IFRpcHB5UHJvcHNbJ2ludGVyYWN0aXZlJ107XG4gIEBJbnB1dCgndHBJbnRlcmFjdGl2ZUJvcmRlcicpIGludGVyYWN0aXZlQm9yZGVyOiBUaXBweVByb3BzWydpbnRlcmFjdGl2ZUJvcmRlciddO1xuICBASW5wdXQoJ3RwTWF4V2lkdGgnKSBtYXhXaWR0aDogVGlwcHlQcm9wc1snbWF4V2lkdGgnXTtcbiAgQElucHV0KCd0cE9mZnNldCcpIG9mZnNldDogVGlwcHlQcm9wc1snb2Zmc2V0J107XG4gIEBJbnB1dCgndHBQbGFjZW1lbnQnKSBwbGFjZW1lbnQ6IFRpcHB5UHJvcHNbJ3BsYWNlbWVudCddO1xuICBASW5wdXQoJ3RwUG9wcGVyT3B0aW9ucycpIHBvcHBlck9wdGlvbnM6IFRpcHB5UHJvcHNbJ3BvcHBlck9wdGlvbnMnXTtcbiAgQElucHV0KCd0cFNob3dPbkNyZWF0ZScpIHNob3dPbkNyZWF0ZTogVGlwcHlQcm9wc1snc2hvd09uQ3JlYXRlJ107XG4gIEBJbnB1dCgndHBUcmlnZ2VyJykgdHJpZ2dlcjogVGlwcHlQcm9wc1sndHJpZ2dlciddO1xuICBASW5wdXQoJ3RwVHJpZ2dlclRhcmdldCcpIHRyaWdnZXJUYXJnZXQ6IFRpcHB5UHJvcHNbJ3RyaWdnZXJUYXJnZXQnXTtcbiAgQElucHV0KCd0cFpJbmRleCcpIHpJbmRleDogVGlwcHlQcm9wc1snekluZGV4J107XG4gIEBJbnB1dCgndHBBbmltYXRpb24nKSBhbmltYXRpb246IFRpcHB5UHJvcHNbJ2FuaW1hdGlvbiddO1xuICBASW5wdXQoeyB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUsIGFsaWFzOiAndHBVc2VUZXh0Q29udGVudCcgfSkgdXNlVGV4dENvbnRlbnQ6IGJvb2xlYW47XG4gIEBJbnB1dCh7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSwgYWxpYXM6ICd0cElzTGF6eScgfSkgaXNMYXp5OiBib29sZWFuO1xuICBASW5wdXQoJ3RwVmFyaWF0aW9uJykgdmFyaWF0aW9uOiBzdHJpbmc7XG4gIEBJbnB1dCgndHBJc0VuYWJsZWQnKSBpc0VuYWJsZWQ6IGJvb2xlYW47XG4gIEBJbnB1dCgndHBDbGFzc05hbWUnKSBjbGFzc05hbWU6IHN0cmluZyB8IHN0cmluZ1tdO1xuICBASW5wdXQoeyB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUsIGFsaWFzOiAndHBPbmx5VGV4dE92ZXJmbG93JyB9KSBvbmx5VGV4dE92ZXJmbG93ID0gZmFsc2U7XG4gIEBJbnB1dCh7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSwgYWxpYXM6ICd0cFN0YXRpY1dpZHRoSG9zdCcgfSkgc3RhdGljV2lkdGhIb3N0ID0gZmFsc2U7XG4gIEBJbnB1dCgndHBEYXRhJykgZGF0YTogYW55O1xuICBASW5wdXQoeyB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUsIGFsaWFzOiAndHBVc2VIb3N0V2lkdGgnIH0pIHVzZUhvc3RXaWR0aCA9IGZhbHNlO1xuICBASW5wdXQoeyB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUsIGFsaWFzOiAndHBIaWRlT25Fc2NhcGUnIH0pIGhpZGVPbkVzY2FwZSA9IGZhbHNlO1xuICBASW5wdXQoJ3RwRGV0ZWN0Q2hhbmdlc0NvbXBvbmVudCcpIGRldGVjdENoYW5nZXNDb21wb25lbnQgPSB0cnVlO1xuICBASW5wdXQoJ3RwUG9wcGVyV2lkdGgnKSBwb3BwZXJXaWR0aDogbnVtYmVyIHwgc3RyaW5nO1xuICBASW5wdXQoJ3RwSG9zdCcpIGN1c3RvbUhvc3Q6IEhUTUxFbGVtZW50O1xuICBASW5wdXQoeyB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUsIGFsaWFzOiAndHBJc1Zpc2libGUnIH0pIGlzVmlzaWJsZSA9IGZhbHNlO1xuXG4gIEBPdXRwdXQoJ3RwVmlzaWJsZScpIHZpc2libGUgPSBuZXcgRXZlbnRFbWl0dGVyPGJvb2xlYW4+KCk7XG5cbiAgcHJvdGVjdGVkIGluc3RhbmNlOiBUaXBweUluc3RhbmNlO1xuICBwcm90ZWN0ZWQgdmlld1JlZjogVmlld1JlZjtcbiAgcHJvdGVjdGVkIGRlc3Ryb3llZCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG4gIHByb3RlY3RlZCBwcm9wczogUGFydGlhbDxUaXBweUNvbmZpZz47XG4gIHByb3RlY3RlZCBlbmFibGVkID0gdHJ1ZTtcbiAgcHJvdGVjdGVkIHZhcmlhdGlvbkRlZmluZWQgPSBmYWxzZTtcbiAgcHJvdGVjdGVkIHZpZXdPcHRpb25zJDogVmlld09wdGlvbnM7XG5cbiAgLyoqXG4gICAqIFdlIGhhZCB1c2UgYHZpc2libGVgIGV2ZW50IGVtaXR0ZXIgcHJldmlvdXNseSBhcyBhIGB0YWtlVW50aWxgIHN1YnNjcmliZXIgaW4gbXVsdGlwbGUgcGxhY2VzXG4gICAqIHdpdGhpbiB0aGUgZGlyZWN0aXZlLlxuICAgKiBUaGlzIGlzIGZvciBpbnRlcm5hbCB1c2Ugb25seTsgdGh1cyB3ZSBkb24ndCBoYXZlIHRvIGRlYWwgd2l0aCB0aGUgYHZpc2libGVgIGV2ZW50IGVtaXR0ZXJcbiAgICogYW5kIHRyaWdnZXIgY2hhbmdlIGRldGVjdGlvbnMgb25seSB3aGVuIHRoZSBgdmlzaWJsZWAgZXZlbnQgaXMgYmVpbmcgbGlzdGVuZWQgb3V0c2lkZVxuICAgKiBpbiB0aGUgdGVtcGxhdGUgKGA8YnV0dG9uIFt0aXBweV09XCIuLi5cIiAodmlzaWJsZSk9XCIuLi5cIj48L2J1dHRvbj5gKS5cbiAgICovXG4gIHByb3RlY3RlZCB2aXNpYmxlSW50ZXJuYWwgPSBuZXcgU3ViamVjdDxib29sZWFuPigpO1xuICBwcml2YXRlIHZpc2liaWxpdHlPYnNlcnZlckNsZWFudXA6ICgpID0+IHZvaWQgfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgY29udGVudENoYW5nZWQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIEBJbmplY3QoUExBVEZPUk1fSUQpIHByb3RlY3RlZCBwbGF0Zm9ybUlkOiBzdHJpbmcsXG4gICAgQEluamVjdChUSVBQWV9DT05GSUcpIHByb3RlY3RlZCBnbG9iYWxDb25maWc6IFRpcHB5Q29uZmlnLFxuICAgIHByb3RlY3RlZCBpbmplY3RvcjogSW5qZWN0b3IsXG4gICAgcHJvdGVjdGVkIHZpZXdTZXJ2aWNlOiBWaWV3U2VydmljZSxcbiAgICBwcm90ZWN0ZWQgdmNyOiBWaWV3Q29udGFpbmVyUmVmLFxuICAgIHByb3RlY3RlZCB6b25lOiBOZ1pvbmUsXG4gICAgcHJvdGVjdGVkIGhvc3RSZWY6IEVsZW1lbnRSZWZcbiAgKSB7fVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IE5nQ2hhbmdlczxUaXBweURpcmVjdGl2ZT4pIHtcbiAgICBpZiAodGhpcy5pc1NlcnZlclNpZGUpIHJldHVybjtcblxuICAgIGxldCBwcm9wczogUGFydGlhbDxUaXBweUNvbmZpZz4gPSBPYmplY3Qua2V5cyhjaGFuZ2VzKS5yZWR1Y2UoKGFjYywgY2hhbmdlKSA9PiB7XG4gICAgICBpZiAoY2hhbmdlID09PSAnaXNWaXNpYmxlJykgcmV0dXJuIGFjYztcblxuICAgICAgYWNjW2NoYW5nZV0gPSBjaGFuZ2VzW2NoYW5nZV0uY3VycmVudFZhbHVlO1xuXG4gICAgICByZXR1cm4gYWNjO1xuICAgIH0sIHt9KTtcblxuICAgIGxldCB2YXJpYXRpb246IHN0cmluZztcblxuICAgIGlmIChpc0NoYW5nZWQoJ2NvbnRlbnQnLCBjaGFuZ2VzKSkge1xuICAgICAgdGhpcy5jb250ZW50Q2hhbmdlZC5uZXh0KCk7XG4gICAgfVxuXG4gICAgaWYgKGlzQ2hhbmdlZCgndmFyaWF0aW9uJywgY2hhbmdlcykpIHtcbiAgICAgIHZhcmlhdGlvbiA9IGNoYW5nZXMudmFyaWF0aW9uLmN1cnJlbnRWYWx1ZTtcbiAgICAgIHRoaXMudmFyaWF0aW9uRGVmaW5lZCA9IHRydWU7XG4gICAgfSBlbHNlIGlmICghdGhpcy52YXJpYXRpb25EZWZpbmVkKSB7XG4gICAgICB2YXJpYXRpb24gPSB0aGlzLmdsb2JhbENvbmZpZy5kZWZhdWx0VmFyaWF0aW9uO1xuICAgICAgdGhpcy52YXJpYXRpb25EZWZpbmVkID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAodmFyaWF0aW9uKSB7XG4gICAgICBwcm9wcyA9IHtcbiAgICAgICAgLi4udGhpcy5nbG9iYWxDb25maWcudmFyaWF0aW9uc1t2YXJpYXRpb25dLFxuICAgICAgICAuLi5wcm9wcyxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgaWYgKGlzQ2hhbmdlZCgnaXNFbmFibGVkJywgY2hhbmdlcykpIHtcbiAgICAgIHRoaXMuZW5hYmxlZCA9IGNoYW5nZXMuaXNFbmFibGVkLmN1cnJlbnRWYWx1ZTtcbiAgICAgIHRoaXMuc2V0U3RhdHVzKCk7XG4gICAgfVxuXG4gICAgaWYgKGlzQ2hhbmdlZCgnaXNWaXNpYmxlJywgY2hhbmdlcykpIHtcbiAgICAgIHRoaXMuaXNWaXNpYmxlID8gdGhpcy5zaG93KCkgOiB0aGlzLmhpZGUoKTtcbiAgICB9XG5cbiAgICB0aGlzLnVwZGF0ZVByb3BzKHByb3BzKTtcbiAgfVxuXG4gIG5nT25Jbml0KCkge1xuICAgIGlmICh0aGlzLnVzZUhvc3RXaWR0aCkge1xuICAgICAgdGhpcy5wcm9wcy5tYXhXaWR0aCA9IHRoaXMuaG9zdFdpZHRoO1xuICAgIH1cbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcbiAgICBpZiAodGhpcy5pc1NlcnZlclNpZGUpIHJldHVybjtcblxuICAgIHRoaXMuem9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICBpZiAodGhpcy5pc0xhenkpIHtcbiAgICAgICAgaWYgKHRoaXMub25seVRleHRPdmVyZmxvdykge1xuICAgICAgICAgIGluVmlldyh0aGlzLmhvc3QpXG4gICAgICAgICAgICAucGlwZShcbiAgICAgICAgICAgICAgc3dpdGNoTWFwKCgpID0+IHRoaXMuaXNPdmVyZmxvd2luZyQoKSksXG4gICAgICAgICAgICAgIHRha2VVbnRpbCh0aGlzLmRlc3Ryb3llZClcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKGlzRWxlbWVudE92ZXJmbG93KSA9PiB7XG4gICAgICAgICAgICAgIHRoaXMuY2hlY2tPdmVyZmxvdyhpc0VsZW1lbnRPdmVyZmxvdyk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpblZpZXcodGhpcy5ob3N0KVxuICAgICAgICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveWVkKSlcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgICB0aGlzLmNyZWF0ZUluc3RhbmNlKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmICh0aGlzLm9ubHlUZXh0T3ZlcmZsb3cpIHtcbiAgICAgICAgdGhpcy5pc092ZXJmbG93aW5nJCgpXG4gICAgICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveWVkKSlcbiAgICAgICAgICAuc3Vic2NyaWJlKChpc0VsZW1lbnRPdmVyZmxvdykgPT4ge1xuICAgICAgICAgICAgdGhpcy5jaGVja092ZXJmbG93KGlzRWxlbWVudE92ZXJmbG93KTtcbiAgICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuY3JlYXRlSW5zdGFuY2UoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCkge1xuICAgIHRoaXMuZGVzdHJveWVkLm5leHQoKTtcbiAgICB0aGlzLmluc3RhbmNlPy5kZXN0cm95KCk7XG4gICAgdGhpcy5kZXN0cm95VmlldygpO1xuICAgIHRoaXMudmlzaWJpbGl0eU9ic2VydmVyQ2xlYW51cD8uKCk7XG4gIH1cblxuICBkZXN0cm95VmlldygpIHtcbiAgICB0aGlzLnZpZXdPcHRpb25zJCA9IG51bGw7XG4gICAgdGhpcy52aWV3UmVmPy5kZXN0cm95KCk7XG4gICAgdGhpcy52aWV3UmVmID0gbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGlzIG1ldGhvZCBpcyB1c2VmdWwgd2hlbiB5b3UgYXBwZW5kIHRvIGFuIGVsZW1lbnQgdGhhdCB5b3UgbWlnaHQgcmVtb3ZlIGZyb20gdGhlIERPTS5cbiAgICogSW4gc3VjaCBjYXNlcyB3ZSB3YW50IHRvIGhpZGUgdGhlIHRvb2x0aXAgYW5kIGxldCBpdCBnbyB0aHJvdWdoIHRoZSBkZXN0cm95IGxpZmVjeWNsZS5cbiAgICogRm9yIGV4YW1wbGUsIGlmIHlvdSBoYXZlIGEgZ3JpZCByb3cgd2l0aCBhbiBlbGVtZW50IHRoYXQgeW91IHRvZ2dsZSB1c2luZyB0aGUgZGlzcGxheSBDU1MgcHJvcGVydHkgb24gaG92ZXIuXG4gICAqL1xuICBvYnNlcnZlSG9zdFZpc2liaWxpdHkoKSB7XG4gICAgaWYgKHRoaXMuaXNTZXJ2ZXJTaWRlKSByZXR1cm47XG4gICAgLy8gV2UgZG9uJ3Qgd2FudCB0byBvYnNlcnZlIHRoZSBob3N0IHZpc2liaWxpdHkgaWYgd2UgYXJlIGFwcGVuZGluZyB0byB0aGUgYm9keS5cbiAgICBpZiAodGhpcy5wcm9wcy5hcHBlbmRUbyAmJiB0aGlzLnByb3BzLmFwcGVuZFRvICE9PSBkb2N1bWVudC5ib2R5KSB7XG4gICAgICB0aGlzLnZpc2liaWxpdHlPYnNlcnZlckNsZWFudXA/LigpO1xuICAgICAgcmV0dXJuIHRoaXMudmlzaWJsZUludGVybmFsXG4gICAgICAgIC5hc09ic2VydmFibGUoKVxuICAgICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95ZWQpKVxuICAgICAgICAuc3Vic2NyaWJlKChpc1Zpc2libGUpID0+IHtcbiAgICAgICAgICBpZiAoaXNWaXNpYmxlKSB7XG4gICAgICAgICAgICB0aGlzLnpvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgICAgICAgICB0aGlzLnZpc2liaWxpdHlPYnNlcnZlckNsZWFudXAgPSBvYnNlcnZlVmlzaWJpbGl0eSh0aGlzLmluc3RhbmNlLnJlZmVyZW5jZSwgKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuaGlkZSgpO1xuICAgICAgICAgICAgICAgIC8vIEJlY2F1c2Ugd2UgaGF2ZSBhbmltYXRpb24gb24gdGhlIHBvcHBlciBpdCBkb2Vzbid0IGNsb3NlIGltbWVkaWF0ZWx5IGRvZXNuJ3QgdHJpZ2dlciB0aGUgYHRwVmlzaWJsZWAgZXZlbnQuXG4gICAgICAgICAgICAgICAgLy8gVGlwcHkgaXMgcmVseWluZyBvbiB0aGUgdHJhbnNpdGlvbmVuZCBldmVudCB0byB0cmlnZ2VyIHRoZSBgb25IaWRkZW5gIGNhbGxiYWNrLlxuICAgICAgICAgICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hdG9taWtzL3RpcHB5anMvYmxvYi9tYXN0ZXIvc3JjL2RvbS11dGlscy50cyNMMTE3XG4gICAgICAgICAgICAgICAgLy8gVGhpcyBldmVudCBuZXZlciBmaXJlcyBiZWNhdXNlIHRoZSBwb3BwZXIgaXMgcmVtb3ZlZCBmcm9tIHRoZSBET00gYmVmb3JlIHRoZSB0cmFuc2l0aW9uIGVuZHMuXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMucHJvcHMuYW5pbWF0aW9uKSB7XG4gICAgICAgICAgICAgICAgICB0aGlzLm9uSGlkZGVuKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnZpc2liaWxpdHlPYnNlcnZlckNsZWFudXA/LigpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgc2hvdygpIHtcbiAgICB0aGlzLmluc3RhbmNlPy5zaG93KCk7XG4gIH1cblxuICBoaWRlKCkge1xuICAgIHRoaXMuaW5zdGFuY2U/LmhpZGUoKTtcbiAgfVxuXG4gIGVuYWJsZSgpIHtcbiAgICB0aGlzLmluc3RhbmNlPy5lbmFibGUoKTtcbiAgfVxuXG4gIGRpc2FibGUoKSB7XG4gICAgdGhpcy5pbnN0YW5jZT8uZGlzYWJsZSgpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHVwZGF0ZVByb3BzKHByb3BzOiBQYXJ0aWFsPFRpcHB5Q29uZmlnPikge1xuICAgIHRoaXMuc2V0UHJvcHMoeyAuLi50aGlzLnByb3BzLCAuLi5wcm9wcyB9KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBzZXRQcm9wcyhwcm9wczogUGFydGlhbDxUaXBweUNvbmZpZz4pIHtcbiAgICB0aGlzLnByb3BzID0gcHJvcHM7XG4gICAgdGhpcy5pbnN0YW5jZT8uc2V0UHJvcHMob25seVRpcHB5UHJvcHMocHJvcHMpKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBzZXRTdGF0dXMoKSB7XG4gICAgdGhpcy5lbmFibGVkID8gdGhpcy5pbnN0YW5jZT8uZW5hYmxlKCkgOiB0aGlzLmluc3RhbmNlPy5kaXNhYmxlKCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0IGhvc3QoKTogSFRNTEVsZW1lbnQge1xuICAgIHJldHVybiB0aGlzLmN1c3RvbUhvc3QgfHwgdGhpcy5ob3N0UmVmLm5hdGl2ZUVsZW1lbnQ7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0IGhvc3RXaWR0aCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmhvc3QuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGg7XG4gIH1cblxuICBwcm90ZWN0ZWQgY3JlYXRlSW5zdGFuY2UoKSB7XG4gICAgaWYgKCF0aGlzLmNvbnRlbnQgJiYgIXRoaXMudXNlVGV4dENvbnRlbnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLnpvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgdGhpcy5pbnN0YW5jZSA9IHRpcHB5KHRoaXMuaG9zdCwge1xuICAgICAgICBhbGxvd0hUTUw6IHRydWUsXG4gICAgICAgIGFwcGVuZFRvOiBkb2N1bWVudC5ib2R5LFxuICAgICAgICAuLi4odGhpcy5nbG9iYWxDb25maWcuekluZGV4R2V0dGVyID8geyB6SW5kZXg6IHRoaXMuZ2xvYmFsQ29uZmlnLnpJbmRleEdldHRlcigpIH0gOiB7fSksXG4gICAgICAgIC4uLm9ubHlUaXBweVByb3BzKHRoaXMuZ2xvYmFsQ29uZmlnKSxcbiAgICAgICAgLi4ub25seVRpcHB5UHJvcHModGhpcy5wcm9wcyksXG4gICAgICAgIG9uTW91bnQ6IChpbnN0YW5jZSkgPT4ge1xuICAgICAgICAgIHRoaXMuaXNWaXNpYmxlID0gdHJ1ZTtcbiAgICAgICAgICB0aGlzLnZpc2libGVJbnRlcm5hbC5uZXh0KHRoaXMuaXNWaXNpYmxlKTtcbiAgICAgICAgICBpZiAodGhpcy52aXNpYmxlLm9ic2VydmVkKSB7XG4gICAgICAgICAgICB0aGlzLnpvbmUucnVuKCgpID0+IHRoaXMudmlzaWJsZS5uZXh0KHRoaXMuaXNWaXNpYmxlKSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMudXNlSG9zdFdpZHRoICYmIHRoaXMubGlzdGVuVG9Ib3N0UmVzaXplKCk7XG4gICAgICAgICAgdGhpcy5nbG9iYWxDb25maWcub25Nb3VudD8uKGluc3RhbmNlKTtcbiAgICAgICAgfSxcbiAgICAgICAgb25DcmVhdGU6IChpbnN0YW5jZSkgPT4ge1xuICAgICAgICAgIGluc3RhbmNlLnBvcHBlci5jbGFzc0xpc3QuYWRkKGB0aXBweS12YXJpYXRpb24tJHt0aGlzLnZhcmlhdGlvbiB8fCB0aGlzLmdsb2JhbENvbmZpZy5kZWZhdWx0VmFyaWF0aW9ufWApO1xuICAgICAgICAgIGlmICh0aGlzLmNsYXNzTmFtZSkge1xuICAgICAgICAgICAgZm9yIChjb25zdCBrbGFzcyBvZiBub3JtYWxpemVDbGFzc05hbWUodGhpcy5jbGFzc05hbWUpKSB7XG4gICAgICAgICAgICAgIGluc3RhbmNlLnBvcHBlci5jbGFzc0xpc3QuYWRkKGtsYXNzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5nbG9iYWxDb25maWcub25DcmVhdGU/LihpbnN0YW5jZSk7XG4gICAgICAgICAgaWYgKHRoaXMuaXNWaXNpYmxlID09PSB0cnVlKSB7XG4gICAgICAgICAgICBpbnN0YW5jZS5zaG93KCk7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBvblNob3c6IChpbnN0YW5jZSkgPT4ge1xuICAgICAgICAgIGluc3RhbmNlLnJlZmVyZW5jZS5zZXRBdHRyaWJ1dGUoJ2RhdGEtdGlwcHktb3BlbicsICcnKTtcbiAgICAgICAgICB0aGlzLnpvbmUucnVuKCgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGNvbnRlbnQgPSB0aGlzLnJlc29sdmVDb250ZW50KGluc3RhbmNlKTtcbiAgICAgICAgICAgIGlmIChpc1N0cmluZyhjb250ZW50KSkge1xuICAgICAgICAgICAgICBpbnN0YW5jZS5zZXRQcm9wcyh7IGFsbG93SFRNTDogZmFsc2UgfSk7XG5cbiAgICAgICAgICAgICAgaWYgKCFjb250ZW50Py50cmltKCkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmRpc2FibGUoKTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmVuYWJsZSgpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGluc3RhbmNlLnNldENvbnRlbnQoY29udGVudCk7XG4gICAgICAgICAgICB0aGlzLmhpZGVPbkVzY2FwZSAmJiB0aGlzLmhhbmRsZUVzY2FwZUJ1dHRvbigpO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIGlmICh0aGlzLnVzZUhvc3RXaWR0aCkge1xuICAgICAgICAgICAgdGhpcy5zZXRJbnN0YW5jZVdpZHRoKGluc3RhbmNlLCB0aGlzLmhvc3RXaWR0aCk7XG4gICAgICAgICAgfSBlbHNlIGlmICh0aGlzLnBvcHBlcldpZHRoKSB7XG4gICAgICAgICAgICB0aGlzLnNldEluc3RhbmNlV2lkdGgoaW5zdGFuY2UsIHRoaXMucG9wcGVyV2lkdGgpO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLmdsb2JhbENvbmZpZy5vblNob3c/LihpbnN0YW5jZSk7XG4gICAgICAgIH0sXG4gICAgICAgIG9uSGlkZShpbnN0YW5jZSkge1xuICAgICAgICAgIGluc3RhbmNlLnJlZmVyZW5jZS5yZW1vdmVBdHRyaWJ1dGUoJ2RhdGEtdGlwcHktb3BlbicpO1xuICAgICAgICB9LFxuICAgICAgICBvbkhpZGRlbjogKGluc3RhbmNlKSA9PiB7XG4gICAgICAgICAgdGhpcy5vbkhpZGRlbihpbnN0YW5jZSk7XG4gICAgICAgIH0sXG4gICAgICB9KTtcblxuICAgICAgdGhpcy5zZXRTdGF0dXMoKTtcbiAgICAgIHRoaXMuc2V0UHJvcHModGhpcy5wcm9wcyk7XG5cbiAgICAgIHRoaXMudmFyaWF0aW9uID09PSAnY29udGV4dE1lbnUnICYmIHRoaXMuaGFuZGxlQ29udGV4dE1lbnUoKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByb3RlY3RlZCByZXNvbHZlQ29udGVudChpbnN0YW5jZTogVGlwcHlJbnN0YW5jZSkge1xuICAgIGlmICghdGhpcy52aWV3T3B0aW9ucyQgJiYgIWlzU3RyaW5nKHRoaXMuY29udGVudCkpIHtcbiAgICAgIGNvbnN0IGluamVjdG9yID0gSW5qZWN0b3IuY3JlYXRlKHtcbiAgICAgICAgcHJvdmlkZXJzOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgcHJvdmlkZTogVElQUFlfUkVGLFxuICAgICAgICAgICAgdXNlVmFsdWU6IHRoaXMuaW5zdGFuY2UsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgICAgcGFyZW50OiB0aGlzLmluamVjdG9yLFxuICAgICAgfSk7XG4gICAgICBpZiAoaXNDb21wb25lbnQodGhpcy5jb250ZW50KSkge1xuICAgICAgICB0aGlzLmluc3RhbmNlLmRhdGEgPSB0aGlzLmRhdGE7XG5cbiAgICAgICAgdGhpcy52aWV3T3B0aW9ucyQgPSB7XG4gICAgICAgICAgaW5qZWN0b3IsXG4gICAgICAgIH07XG4gICAgICB9IGVsc2UgaWYgKGlzVGVtcGxhdGVSZWYodGhpcy5jb250ZW50KSkge1xuICAgICAgICB0aGlzLnZpZXdPcHRpb25zJCA9IHtcbiAgICAgICAgICBpbmplY3RvcixcbiAgICAgICAgICBjb250ZXh0OiB7XG4gICAgICAgICAgICAkaW1wbGljaXQ6IHRoaXMuaGlkZS5iaW5kKHRoaXMpLFxuICAgICAgICAgICAgZGF0YTogdGhpcy5kYXRhLFxuICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy52aWV3UmVmID0gdGhpcy52aWV3U2VydmljZS5jcmVhdGVWaWV3KHRoaXMuY29udGVudCwge1xuICAgICAgdmNyOiB0aGlzLnZjcixcbiAgICAgIC4uLnRoaXMudmlld09wdGlvbnMkLFxuICAgIH0pO1xuXG4gICAgLy8gV2UgbmVlZCB0byBjYWxsIGRldGVjdENoYW5nZXMgZm9yIG9uUHVzaCBjb21wb25lbnRzIHRvIHVwZGF0ZSB0aGUgY29udGVudFxuICAgIGlmICh0aGlzLmRldGVjdENoYW5nZXNDb21wb25lbnQgJiYgaXNDb21wb25lbnQodGhpcy5jb250ZW50KSkge1xuICAgICAgdGhpcy52aWV3UmVmLmRldGVjdENoYW5nZXMoKTtcbiAgICB9XG5cbiAgICBsZXQgY29udGVudCA9IHRoaXMudmlld1JlZi5nZXRFbGVtZW50KCk7XG5cbiAgICBpZiAodGhpcy51c2VUZXh0Q29udGVudCkge1xuICAgICAgY29udGVudCA9IGluc3RhbmNlLnJlZmVyZW5jZS50ZXh0Q29udGVudDtcbiAgICB9XG5cbiAgICBpZiAoaXNTdHJpbmcoY29udGVudCkgJiYgdGhpcy5nbG9iYWxDb25maWcuYmVmb3JlUmVuZGVyKSB7XG4gICAgICBjb250ZW50ID0gdGhpcy5nbG9iYWxDb25maWcuYmVmb3JlUmVuZGVyKGNvbnRlbnQpO1xuICAgIH1cblxuICAgIHJldHVybiBjb250ZW50O1xuICB9XG5cbiAgcHJvdGVjdGVkIGhhbmRsZUNvbnRleHRNZW51KCkge1xuICAgIGZyb21FdmVudCh0aGlzLmhvc3QsICdjb250ZXh0bWVudScpXG4gICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95ZWQpKVxuICAgICAgLnN1YnNjcmliZSgoZXZlbnQ6IE1vdXNlRXZlbnQpID0+IHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuICAgICAgICB0aGlzLmluc3RhbmNlLnNldFByb3BzKHtcbiAgICAgICAgICBnZXRSZWZlcmVuY2VDbGllbnRSZWN0OiAoKSA9PlxuICAgICAgICAgICAgKHtcbiAgICAgICAgICAgICAgd2lkdGg6IDAsXG4gICAgICAgICAgICAgIGhlaWdodDogMCxcbiAgICAgICAgICAgICAgdG9wOiBldmVudC5jbGllbnRZLFxuICAgICAgICAgICAgICBib3R0b206IGV2ZW50LmNsaWVudFksXG4gICAgICAgICAgICAgIGxlZnQ6IGV2ZW50LmNsaWVudFgsXG4gICAgICAgICAgICAgIHJpZ2h0OiBldmVudC5jbGllbnRYLFxuICAgICAgICAgICAgfSBhcyBET01SZWN0UmVhZE9ubHkpLFxuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLmluc3RhbmNlLnNob3coKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIGhhbmRsZUVzY2FwZUJ1dHRvbigpOiB2b2lkIHtcbiAgICB0aGlzLnpvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgZnJvbUV2ZW50KGRvY3VtZW50LmJvZHksICdrZXlkb3duJylcbiAgICAgICAgLnBpcGUoXG4gICAgICAgICAgZmlsdGVyKCh7IGNvZGUgfTogS2V5Ym9hcmRFdmVudCkgPT4gY29kZSA9PT0gJ0VzY2FwZScpLFxuICAgICAgICAgIHRha2VVbnRpbChtZXJnZSh0aGlzLmRlc3Ryb3llZCwgdGhpcy52aXNpYmxlSW50ZXJuYWwucGlwZShmaWx0ZXIoKHYpID0+ICF2KSkpKVxuICAgICAgICApXG4gICAgICAgIC5zdWJzY3JpYmUoKCkgPT4gdGhpcy5oaWRlKCkpO1xuICAgIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIGNoZWNrT3ZlcmZsb3coaXNFbGVtZW50T3ZlcmZsb3c6IGJvb2xlYW4pIHtcbiAgICBpZiAoaXNFbGVtZW50T3ZlcmZsb3cpIHtcbiAgICAgIGlmICghdGhpcy5pbnN0YW5jZSkge1xuICAgICAgICB0aGlzLmNyZWF0ZUluc3RhbmNlKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmluc3RhbmNlLmVuYWJsZSgpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmluc3RhbmNlPy5kaXNhYmxlKCk7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIGxpc3RlblRvSG9zdFJlc2l6ZSgpIHtcbiAgICBkaW1lbnNpb25zQ2hhbmdlcyh0aGlzLmhvc3QpXG4gICAgICAucGlwZSh0YWtlVW50aWwobWVyZ2UodGhpcy5kZXN0cm95ZWQsIHRoaXMudmlzaWJsZUludGVybmFsKSkpXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgdGhpcy5zZXRJbnN0YW5jZVdpZHRoKHRoaXMuaW5zdGFuY2UsIHRoaXMuaG9zdFdpZHRoKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIHNldEluc3RhbmNlV2lkdGgoaW5zdGFuY2U6IEluc3RhbmNlLCB3aWR0aDogc3RyaW5nIHwgbnVtYmVyKSB7XG4gICAgY29uc3QgaW5QaXhlbHMgPSBjb2VyY2VDc3NQaXhlbFZhbHVlKHdpZHRoKTtcbiAgICBpbnN0YW5jZS5wb3BwZXIuc3R5bGUud2lkdGggPSBpblBpeGVscztcbiAgICBpbnN0YW5jZS5wb3BwZXIuc3R5bGUubWF4V2lkdGggPSBpblBpeGVscztcbiAgICAoaW5zdGFuY2UucG9wcGVyLmZpcnN0RWxlbWVudENoaWxkIGFzIEhUTUxFbGVtZW50KS5zdHlsZS5tYXhXaWR0aCA9IGluUGl4ZWxzO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXQgaXNTZXJ2ZXJTaWRlKCkge1xuICAgIHJldHVybiBpc1BsYXRmb3JtU2VydmVyKHRoaXMucGxhdGZvcm1JZCk7XG4gIH1cblxuICBwcml2YXRlIG9uSGlkZGVuKGluc3RhbmNlOiBUaXBweUluc3RhbmNlID0gdGhpcy5pbnN0YW5jZSkge1xuICAgIHRoaXMuZGVzdHJveVZpZXcoKTtcbiAgICB0aGlzLmlzVmlzaWJsZSA9IGZhbHNlO1xuICAgIHRoaXMudmlzaWJsZUludGVybmFsLm5leHQodGhpcy5pc1Zpc2libGUpO1xuICAgIGlmICh0aGlzLnZpc2libGUub2JzZXJ2ZWQpIHtcbiAgICAgIHRoaXMuem9uZS5ydW4oKCkgPT4gdGhpcy52aXNpYmxlLm5leHQodGhpcy5pc1Zpc2libGUpKTtcbiAgICB9XG4gICAgdGhpcy5nbG9iYWxDb25maWcub25IaWRkZW4/LihpbnN0YW5jZSk7XG4gIH1cblxuICBwcml2YXRlIGlzT3ZlcmZsb3dpbmckKCkge1xuICAgIGNvbnN0IG5vdGlmaWVycyQgPSBbb3ZlcmZsb3dDaGFuZ2VzKHRoaXMuaG9zdCldO1xuXG4gICAgLy8gV2UgbmVlZCB0byBoYW5kbGUgY2FzZXMgd2hlcmUgdGhlIGhvc3QgaGFzIGEgc3RhdGljIHdpZHRoIGJ1dCB0aGUgY29udGVudCBtaWdodCBjaGFuZ2VcbiAgICBpZiAodGhpcy5zdGF0aWNXaWR0aEhvc3QpIHtcbiAgICAgIG5vdGlmaWVycyQucHVzaChcbiAgICAgICAgdGhpcy5jb250ZW50Q2hhbmdlZC5hc09ic2VydmFibGUoKS5waXBlKFxuICAgICAgICAgIC8vIFdlIG5lZWQgdG8gd2FpdCBmb3IgdGhlIGNvbnRlbnQgdG8gYmUgcmVuZGVyZWQgYmVmb3JlIHdlIGNhbiBjaGVjayBpZiBpdCdzIG92ZXJmbG93aW5nLlxuICAgICAgICAgIHN3aXRjaE1hcCgoKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IE9ic2VydmFibGUoKHN1YnNjcmliZXIpID0+IHtcbiAgICAgICAgICAgICAgY29uc3QgaWQgPSB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgICAgICAgICAgICBzdWJzY3JpYmVyLm5leHQoKTtcbiAgICAgICAgICAgICAgICBzdWJzY3JpYmVyLmNvbXBsZXRlKCk7XG4gICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgIHJldHVybiAoKSA9PiBjYW5jZWxBbmltYXRpb25GcmFtZShpZCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9KSxcbiAgICAgICAgICBtYXAoKCkgPT4gaXNFbGVtZW50T3ZlcmZsb3codGhpcy5ob3N0KSlcbiAgICAgICAgKVxuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbWVyZ2UoLi4ubm90aWZpZXJzJCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gaXNDaGFuZ2VkKGtleToga2V5b2YgTmdDaGFuZ2VzPFRpcHB5RGlyZWN0aXZlPiwgY2hhbmdlczogTmdDaGFuZ2VzPFRpcHB5RGlyZWN0aXZlPikge1xuICByZXR1cm4ga2V5IGluIGNoYW5nZXM7XG59XG4iXX0=
477
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGlwcHkuZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmduZWF0L2hlbGlwb3BwZXIvc3JjL2xpYi90aXBweS5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUVMLFFBQVEsRUFDUixVQUFVLEVBQ1YsU0FBUyxFQUNULE1BQU0sRUFFTixZQUFZLEVBQ1osTUFBTSxFQUNOLE1BQU0sRUFDTixRQUFRLEVBQ1IsS0FBSyxFQUVMLEtBQUssRUFJTCxNQUFNLEVBQ04sV0FBVyxFQUNYLFNBQVMsR0FFVixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNuRCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUVoRSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzdELE9BQU8sRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNuRSxPQUFPLEVBRUwsV0FBVyxFQUNYLFFBQVEsRUFDUixhQUFhLEdBSWQsTUFBTSxrQkFBa0IsQ0FBQztBQUUxQixPQUFPLEVBQ0wsbUJBQW1CLEVBQ25CLGlCQUFpQixFQUNqQixNQUFNLEVBQ04saUJBQWlCLEVBQ2pCLGtCQUFrQixFQUNsQixpQkFBaUIsRUFDakIsY0FBYyxFQUNkLGVBQWUsR0FDaEIsTUFBTSxTQUFTLENBQUM7QUFDakIsT0FBTyxFQUVMLFlBQVksRUFDWixTQUFTLEdBSVYsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLFlBQVksQ0FBQzs7O0FBUXBELE1BQU0sT0FB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LEVBQUUsTUFBTTtvQkFDaEIsUUFBUSxFQUFFLE9BQU87b0JBQ2pCLFVBQVUsRUFBRSxJQUFJO2lCQUNqQjs7MEJBK0lJLE1BQU07MkJBQUMsWUFBWTt1S0FsQ0QsT0FBTztzQkFBM0IsTUFBTTt1QkFBQyxXQUFXOztBQWtjckIsU0FBUyxTQUFTLENBQ2hCLEdBQW9DLEVBQ3BDLE9BQWtDO0lBRWxDLE9BQU8sR0FBRyxJQUFJLE9BQU8sQ0FBQztBQUN4QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQWZ0ZXJWaWV3SW5pdCxcbiAgY29tcHV0ZWQsXG4gIERlc3Ryb3lSZWYsXG4gIERpcmVjdGl2ZSxcbiAgZWZmZWN0LFxuICBFbGVtZW50UmVmLFxuICBFdmVudEVtaXR0ZXIsXG4gIGluamVjdCxcbiAgSW5qZWN0LFxuICBJbmplY3RvcixcbiAgaW5wdXQsXG4gIElucHV0U2lnbmFsLFxuICBtb2RlbCxcbiAgTmdab25lLFxuICBPbkNoYW5nZXMsXG4gIE9uSW5pdCxcbiAgT3V0cHV0LFxuICBQTEFURk9STV9JRCxcbiAgdW50cmFja2VkLFxuICBWaWV3Q29udGFpbmVyUmVmLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IGlzUGxhdGZvcm1TZXJ2ZXIgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgdGFrZVVudGlsRGVzdHJveWVkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZS9yeGpzLWludGVyb3AnO1xuaW1wb3J0IHR5cGUgeyBJbnN0YW5jZSB9IGZyb20gJ3RpcHB5LmpzJztcbmltcG9ydCB7IGZyb21FdmVudCwgbWVyZ2UsIE9ic2VydmFibGUsIFN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGZpbHRlciwgbWFwLCBzd2l0Y2hNYXAsIHRha2VVbnRpbCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7XG4gIENvbnRlbnQsXG4gIGlzQ29tcG9uZW50LFxuICBpc1N0cmluZyxcbiAgaXNUZW1wbGF0ZVJlZixcbiAgVmlld09wdGlvbnMsXG4gIFZpZXdSZWYsXG4gIFZpZXdTZXJ2aWNlLFxufSBmcm9tICdAbmduZWF0L292ZXJ2aWV3JztcblxuaW1wb3J0IHtcbiAgY29lcmNlQ3NzUGl4ZWxWYWx1ZSxcbiAgZGltZW5zaW9uc0NoYW5nZXMsXG4gIGluVmlldyxcbiAgaXNFbGVtZW50T3ZlcmZsb3csXG4gIG5vcm1hbGl6ZUNsYXNzTmFtZSxcbiAgb2JzZXJ2ZVZpc2liaWxpdHksXG4gIG9ubHlUaXBweVByb3BzLFxuICBvdmVyZmxvd0NoYW5nZXMsXG59IGZyb20gJy4vdXRpbHMnO1xuaW1wb3J0IHtcbiAgTmdDaGFuZ2VzLFxuICBUSVBQWV9DT05GSUcsXG4gIFRJUFBZX1JFRixcbiAgVGlwcHlDb25maWcsXG4gIFRpcHB5SW5zdGFuY2UsXG4gIFRpcHB5UHJvcHMsXG59IGZyb20gJy4vdGlwcHkudHlwZXMnO1xuaW1wb3J0IHsgVGlwcHlGYWN0b3J5IH0gZnJvbSAnLi90aXBweS5mYWN0b3J5JztcbmltcG9ydCB7IGNvZXJjZUJvb2xlYW5BdHRyaWJ1dGUgfSBmcm9tICcuL2NvZXJjaW9uJztcblxuQERpcmVjdGl2ZSh7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAYW5ndWxhci1lc2xpbnQvZGlyZWN0aXZlLXNlbGVjdG9yXG4gIHNlbGVjdG9yOiAnW3RwXScsXG4gIGV4cG9ydEFzOiAndGlwcHknLFxuICBzdGFuZGFsb25lOiB0cnVlLFxufSlcbmV4cG9ydCBjbGFzcyBUaXBweURpcmVjdGl2ZSBpbXBsZW1lbnRzIE9uQ2hhbmdlcywgQWZ0ZXJWaWV3SW5pdCwgT25Jbml0IHtcbiAgLy8gTm90ZSB0aGF0IGRlZmF1bHQgdmFsdWVzIGFyZSBub3QgcHJvdmlkZWQgZm9yIHRoZXNlIGJpbmRpbmdzIGJlY2F1c2UgYHRpcHB5LmpzYFxuICAvLyBoYXMgaXRzIG93biBkZWZhdWx0IHZhbHVlcyBhbmQgY2hlY2tzIHdoZXRoZXIgdGhlIHByb3ZpZGVkIHByb3BzIGFyZSBgdW5kZWZpbmVkYC5cbiAgLy8gV2Ugc2hvdWxkIGtlZXAgYHVuZGVmaW5lZGAgYXMgdGhlIGRlZmF1bHQgdmFsdWUuXG5cbiAgcmVhZG9ubHkgYXBwZW5kVG8gPSBpbnB1dDxUaXBweVByb3BzWydhcHBlbmRUbyddPih1bmRlZmluZWQsIHsgYWxpYXM6ICd0cEFwcGVuZFRvJyB9KTtcblxuICByZWFkb25seSBjb250ZW50ID0gaW5wdXQ8Q29udGVudCB8IHVuZGVmaW5lZCB8IG51bGw+KHVuZGVmaW5lZCwgeyBhbGlhczogJ3RwJyB9KTtcblxuICByZWFkb25seSBkZWxheSA9IGlucHV0PFRpcHB5UHJvcHNbJ2RlbGF5J10+KHVuZGVmaW5lZCwgeyBhbGlhczogJ3RwRGVsYXknIH0pO1xuXG4gIHJlYWRvbmx5IGR1cmF0aW9uID0gaW5wdXQ8VGlwcHlQcm9wc1snZHVyYXRpb24nXT4odW5kZWZpbmVkLCB7IGFsaWFzOiAndHBEdXJhdGlvbicgfSk7XG5cbiAgcmVhZG9ubHkgaGlkZU9uQ2xpY2sgPSBpbnB1dDxUaXBweVByb3BzWydoaWRlT25DbGljayddPih1bmRlZmluZWQsIHtcbiAgICBhbGlhczogJ3RwSGlkZU9uQ2xpY2snLFxuICB9KTtcblxuICByZWFkb25seSBpbnRlcmFjdGl2ZSA9IGlucHV0PFRpcHB5UHJvcHNbJ2ludGVyYWN0aXZlJ10+KHVuZGVmaW5lZCwge1xuICAgIGFsaWFzOiAndHBJbnRlcmFjdGl2ZScsXG4gIH0pO1xuXG4gIHJlYWRvbmx5IGludGVyYWN0aXZlQm9yZGVyID0gaW5wdXQ8VGlwcHlQcm9wc1snaW50ZXJhY3RpdmVCb3JkZXInXT4odW5kZWZpbmVkLCB7XG4gICAgYWxpYXM6ICd0cEludGVyYWN0aXZlQm9yZGVyJyxcbiAgfSk7XG5cbiAgcmVhZG9ubHkgbWF4V2lkdGggPSBpbnB1dDxUaXBweVByb3BzWydtYXhXaWR0aCddPih1bmRlZmluZWQsIHsgYWxpYXM6ICd0cE1heFdpZHRoJyB9KTtcblxuICAvLyBOb3RlIHRoYXQgc29tZSBvZiB0aGUgaW5wdXQgc2lnbmFsIHR5cGVzIGFyZSBkZWNsYXJlZCBleHBsaWNpdGx5IGJlY2F1c2UgdGhlIGNvbXBpbGVyXG4gIC8vIGFsc28gdXNlcyB0eXBlcyBmcm9tIGBAcG9wcGVyanMvY29yZWAgYW5kIHJlcXVpcmVzIGEgdHlwZSBhbm5vdGF0aW9uLlxuICByZWFkb25seSBvZmZzZXQ6IElucHV0U2lnbmFsPFRpcHB5UHJvcHNbJ29mZnNldCddPiA9IGlucHV0PFRpcHB5UHJvcHNbJ29mZnNldCddPihcbiAgICB1bmRlZmluZWQsXG4gICAgeyBhbGlhczogJ3RwT2Zmc2V0JyB9XG4gICk7XG5cbiAgcmVhZG9ubHkgcGxhY2VtZW50OiBJbnB1dFNpZ25hbDxUaXBweVByb3BzWydwbGFjZW1lbnQnXT4gPSBpbnB1dDxcbiAgICBUaXBweVByb3BzWydwbGFjZW1lbnQnXVxuICA+KHVuZGVmaW5lZCwge1xuICAgIGFsaWFzOiAndHBQbGFjZW1lbnQnLFxuICB9KTtcblxuICByZWFkb25seSBwb3BwZXJPcHRpb25zOiBJbnB1dFNpZ25hbDxUaXBweVByb3BzWydwb3BwZXJPcHRpb25zJ10+ID0gaW5wdXQ8XG4gICAgVGlwcHlQcm9wc1sncG9wcGVyT3B0aW9ucyddXG4gID4odW5kZWZpbmVkLCB7XG4gICAgYWxpYXM6ICd0cFBvcHBlck9wdGlvbnMnLFxuICB9KTtcblxuICByZWFkb25seSBzaG93T25DcmVhdGUgPSBpbnB1dDxUaXBweVByb3BzWydzaG93T25DcmVhdGUnXT4odW5kZWZpbmVkLCB7XG4gICAgYWxpYXM6ICd0cFNob3dPbkNyZWF0ZScsXG4gIH0pO1xuXG4gIHJlYWRvbmx5IHRyaWdnZXIgPSBpbnB1dDxUaXBweVByb3BzWyd0cmlnZ2VyJ10+KHVuZGVmaW5lZCwgeyBhbGlhczogJ3RwVHJpZ2dlcicgfSk7XG5cbiAgcmVhZG9ubHkgdHJpZ2dlclRhcmdldCA9IGlucHV0PFRpcHB5UHJvcHNbJ3RyaWdnZXJUYXJnZXQnXT4odW5kZWZpbmVkLCB7XG4gICAgYWxpYXM6ICd0cFRyaWdnZXJUYXJnZXQnLFxuICB9KTtcblxuICByZWFkb25seSB6SW5kZXggPSBpbnB1dDxUaXBweVByb3BzWyd6SW5kZXgnXT4odW5kZWZpbmVkLCB7IGFsaWFzOiAndHBaSW5kZXgnIH0pO1xuXG4gIHJlYWRvbmx5IGFuaW1hdGlvbiA9IGlucHV0PFRpcHB5UHJvcHNbJ2FuaW1hdGlvbiddPih1bmRlZmluZWQsIHtcbiAgICBhbGlhczogJ3RwQW5pbWF0aW9uJyxcbiAgfSk7XG5cbiAgcmVhZG9ubHkgdXNlVGV4dENvbnRlbnQgPSBpbnB1dChmYWxzZSwge1xuICAgIHRyYW5zZm9ybTogY29lcmNlQm9vbGVhbkF0dHJpYnV0ZSxcbiAgICBhbGlhczogJ3RwVXNlVGV4dENvbnRlbnQnLFxuICB9KTtcblxuICByZWFkb25seSBpc0xhenkgPSBpbnB1dChmYWxzZSwge1xuICAgIHRyYW5zZm9ybTogY29lcmNlQm9vbGVhbkF0dHJpYnV0ZSxcbiAgICBhbGlhczogJ3RwSXNMYXp5JyxcbiAgfSk7XG5cbiAgcmVhZG9ubHkgdmFyaWF0aW9uID0gaW5wdXQ8c3RyaW5nPih1bmRlZmluZWQsIHsgYWxpYXM6ICd0cFZhcmlhdGlvbicgfSk7XG5cbiAgcmVhZG9ubHkgaXNFbmFibGVkID0gaW5wdXQodHJ1ZSwgeyBhbGlhczogJ3RwSXNFbmFibGVkJyB9KTtcblxuICByZWFkb25seSBjbGFzc05hbWUgPSBpbnB1dDxzdHJpbmcgfCBzdHJpbmdbXT4oJycsIHsgYWxpYXM6ICd0cENsYXNzTmFtZScgfSk7XG5cbiAgcmVhZG9ubHkgb25seVRleHRPdmVyZmxvdyA9IGlucHV0KGZhbHNlLCB7XG4gICAgdHJhbnNmb3JtOiBjb2VyY2VCb29sZWFuQXR0cmlidXRlLFxuICAgIGFsaWFzOiAndHBPbmx5VGV4dE92ZXJmbG93JyxcbiAgfSk7XG5cbiAgcmVhZG9ubHkgc3RhdGljV2lkdGhIb3N0ID0gaW5wdXQoZmFsc2UsIHtcbiAgICB0cmFuc2Zvcm06IGNvZXJjZUJvb2xlYW5BdHRyaWJ1dGUsXG4gICAgYWxpYXM6ICd0cFN0YXRpY1dpZHRoSG9zdCcsXG4gIH0pO1xuXG4gIHJlYWRvbmx5IGRhdGEgPSBpbnB1dDxhbnk+KHVuZGVmaW5lZCwgeyBhbGlhczogJ3RwRGF0YScgfSk7XG5cbiAgcmVhZG9ubHkgdXNlSG9zdFdpZHRoID0gaW5wdXQoZmFsc2UsIHtcbiAgICB0cmFuc2Zvcm06IGNvZXJjZUJvb2xlYW5BdHRyaWJ1dGUsXG4gICAgYWxpYXM6ICd0cFVzZUhvc3RXaWR0aCcsXG4gIH0pO1xuXG4gIHJlYWRvbmx5IGhpZGVPbkVzY2FwZSA9IGlucHV0KGZhbHNlLCB7XG4gICAgdHJhbnNmb3JtOiBjb2VyY2VCb29sZWFuQXR0cmlidXRlLFxuICAgIGFsaWFzOiAndHBIaWRlT25Fc2NhcGUnLFxuICB9KTtcblxuICByZWFkb25seSBkZXRlY3RDaGFuZ2VzQ29tcG9uZW50ID0gaW5wdXQodHJ1ZSwgeyBhbGlhczogJ3RwRGV0ZWN0Q2hhbmdlc0NvbXBvbmVudCcgfSk7XG5cbiAgcmVhZG9ubHkgcG9wcGVyV2lkdGggPSBpbnB1dDxudW1iZXIgfCBzdHJpbmc+KHVuZGVmaW5lZCwgeyBhbGlhczogJ3RwUG9wcGVyV2lkdGgnIH0pO1xuXG4gIHJlYWRvbmx5IGN1c3RvbUhvc3QgPSBpbnB1dDxIVE1MRWxlbWVudD4odW5kZWZpbmVkLCB7IGFsaWFzOiAndHBIb3N0JyB9KTtcblxuICByZWFkb25seSBpc1Zpc2libGUgPSBtb2RlbChmYWxzZSwgeyBhbGlhczogJ3RwSXNWaXNpYmxlJyB9KTtcblxuICBAT3V0cHV0KCd0cFZpc2libGUnKSB2aXNpYmxlID0gbmV3IEV2ZW50RW1pdHRlcjxib29sZWFuPigpO1xuXG4gIHByb3RlY3RlZCBpbnN0YW5jZTogVGlwcHlJbnN0YW5jZTtcbiAgcHJvdGVjdGVkIHZpZXdSZWY6IFZpZXdSZWY7XG4gIHByb3RlY3RlZCBwcm9wczogUGFydGlhbDxUaXBweUNvbmZpZz47XG4gIHByb3RlY3RlZCB2YXJpYXRpb25EZWZpbmVkID0gZmFsc2U7XG4gIHByb3RlY3RlZCB2aWV3T3B0aW9ucyQ6IFZpZXdPcHRpb25zO1xuXG4gIC8qKlxuICAgKiBXZSBoYWQgdXNlIGB2aXNpYmxlYCBldmVudCBlbWl0dGVyIHByZXZpb3VzbHkgYXMgYSBgdGFrZVVudGlsYCBzdWJzY3JpYmVyIGluIG11bHRpcGxlIHBsYWNlc1xuICAgKiB3aXRoaW4gdGhlIGRpcmVjdGl2ZS5cbiAgICogVGhpcyBpcyBmb3IgaW50ZXJuYWwgdXNlIG9ubHk7IHRodXMgd2UgZG9uJ3QgaGF2ZSB0byBkZWFsIHdpdGggdGhlIGB2aXNpYmxlYCBldmVudCBlbWl0dGVyXG4gICAqIGFuZCB0cmlnZ2VyIGNoYW5nZSBkZXRlY3Rpb25zIG9ubHkgd2hlbiB0aGUgYHZpc2libGVgIGV2ZW50IGlzIGJlaW5nIGxpc3RlbmVkIG91dHNpZGVcbiAgICogaW4gdGhlIHRlbXBsYXRlIChgPGJ1dHRvbiBbdGlwcHldPVwiLi4uXCIgKHZpc2libGUpPVwiLi4uXCI+PC9idXR0b24+YCkuXG4gICAqL1xuICBwcm90ZWN0ZWQgdmlzaWJsZUludGVybmFsID0gbmV3IFN1YmplY3Q8Ym9vbGVhbj4oKTtcbiAgcHJpdmF0ZSB2aXNpYmlsaXR5T2JzZXJ2ZXJDbGVhbnVwOiAoKSA9PiB2b2lkIHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIGNvbnRlbnRDaGFuZ2VkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcblxuICBwcml2YXRlIGhvc3QgPSBjb21wdXRlZDxIVE1MRWxlbWVudD4oXG4gICAgKCkgPT4gdGhpcy5jdXN0b21Ib3N0KCkgfHwgdGhpcy5ob3N0UmVmLm5hdGl2ZUVsZW1lbnRcbiAgKTtcblxuICAvLyBJdCBzaG91bGQgYmUgYSBnZXR0ZXIgYmVjYXVzZSBjb21wdXRhdGlvbnMgYXJlIGNhY2hlZCB1bnRpbFxuICAvLyBhbnkgb2YgdGhlIHByb2R1Y2VycyBjaGFuZ2UuXG4gIHByaXZhdGUgZ2V0IGhvc3RXaWR0aCgpIHtcbiAgICByZXR1cm4gdGhpcy5ob3N0KCkuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGg7XG4gIH1cblxuICBwcml2YXRlIGRlc3Ryb3lSZWYgPSBpbmplY3QoRGVzdHJveVJlZik7XG4gIHByaXZhdGUgaXNTZXJ2ZXIgPSBpc1BsYXRmb3JtU2VydmVyKGluamVjdChQTEFURk9STV9JRCkpO1xuICBwcml2YXRlIHRpcHB5RmFjdG9yeSA9IGluamVjdChUaXBweUZhY3RvcnkpO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIEBJbmplY3QoVElQUFlfQ09ORklHKSBwcm90ZWN0ZWQgZ2xvYmFsQ29uZmlnOiBUaXBweUNvbmZpZyxcbiAgICBwcm90ZWN0ZWQgaW5qZWN0b3I6IEluamVjdG9yLFxuICAgIHByb3RlY3RlZCB2aWV3U2VydmljZTogVmlld1NlcnZpY2UsXG4gICAgcHJvdGVjdGVkIHZjcjogVmlld0NvbnRhaW5lclJlZixcbiAgICBwcm90ZWN0ZWQgbmdab25lOiBOZ1pvbmUsXG4gICAgcHJvdGVjdGVkIGhvc3RSZWY6IEVsZW1lbnRSZWZcbiAgKSB7XG4gICAgaWYgKHRoaXMuaXNTZXJ2ZXIpIHJldHVybjtcblxuICAgIHRoaXMuc2V0dXBMaXN0ZW5lcnMoKTtcblxuICAgIHRoaXMuZGVzdHJveVJlZi5vbkRlc3Ryb3koKCkgPT4ge1xuICAgICAgdGhpcy5pbnN0YW5jZT8uZGVzdHJveSgpO1xuICAgICAgdGhpcy5kZXN0cm95VmlldygpO1xuICAgICAgdGhpcy52aXNpYmlsaXR5T2JzZXJ2ZXJDbGVhbnVwPy4oKTtcbiAgICB9KTtcbiAgfVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IE5nQ2hhbmdlczxUaXBweURpcmVjdGl2ZT4pIHtcbiAgICBpZiAodGhpcy5pc1NlcnZlcikgcmV0dXJuO1xuXG4gICAgLy8gVE9ETzogd2UgY2FuIHVwZGF0ZSBpdCBsYXRlci5cbiAgICAvLyBXZSBuZWVkIHRvIGdvIG92ZXIgY2xhc3MgcHJvcGVydGllcywgY2hlY2sgd2hldGhlciBpdCdzIGEgc2lnbmFsIChgaXNTaWduYWwocHJvcClgKVxuICAgIC8vIGFuZCBjb25zdHJ1Y3QgYSByZWNvcmQgd2hlcmUgYFJlY29yZDxzdHJpbmcsIFNpZ25hbD5gLlxuICAgIC8vIEZvbGxvdy11cCBjaGFuZ2VzIHdvdWxkIGJlIHRvIGhhdmUgYSBjb21wdXRhdGlvbiBhbmQgYW4gZWZmZWN0LlxuICAgIGxldCBwcm9wczogUGFydGlhbDxUaXBweUNvbmZpZz4gPSBPYmplY3Qua2V5cyhjaGFuZ2VzKS5yZWR1Y2UoKGFjYywgY2hhbmdlKSA9PiB7XG4gICAgICBpZiAoY2hhbmdlID09PSAnaXNWaXNpYmxlJykgcmV0dXJuIGFjYztcblxuICAgICAgYWNjW2NoYW5nZV0gPSBjaGFuZ2VzW2NoYW5nZV0uY3VycmVudFZhbHVlO1xuXG4gICAgICByZXR1cm4gYWNjO1xuICAgIH0sIHt9KTtcblxuICAgIGxldCB2YXJpYXRpb246IHN0cmluZztcblxuICAgIGlmIChpc0NoYW5nZWQoJ3ZhcmlhdGlvbicsIGNoYW5nZXMpKSB7XG4gICAgICB2YXJpYXRpb24gPSBjaGFuZ2VzLnZhcmlhdGlvbi5jdXJyZW50VmFsdWU7XG4gICAgICB0aGlzLnZhcmlhdGlvbkRlZmluZWQgPSB0cnVlO1xuICAgIH0gZWxzZSBpZiAoIXRoaXMudmFyaWF0aW9uRGVmaW5lZCkge1xuICAgICAgdmFyaWF0aW9uID0gdGhpcy5nbG9iYWxDb25maWcuZGVmYXVsdFZhcmlhdGlvbjtcbiAgICAgIHRoaXMudmFyaWF0aW9uRGVmaW5lZCA9IHRydWU7XG4gICAgfVxuXG4gICAgaWYgKHZhcmlhdGlvbikge1xuICAgICAgcHJvcHMgPSB7XG4gICAgICAgIC4uLnRoaXMuZ2xvYmFsQ29uZmlnLnZhcmlhdGlvbnNbdmFyaWF0aW9uXSxcbiAgICAgICAgLi4ucHJvcHMsXG4gICAgICB9O1xuICAgIH1cblxuICAgIHRoaXMudXBkYXRlUHJvcHMocHJvcHMpO1xuICB9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgaWYgKHRoaXMudXNlSG9zdFdpZHRoKCkpIHtcbiAgICAgIHRoaXMucHJvcHMubWF4V2lkdGggPSB0aGlzLmhvc3RXaWR0aDtcbiAgICB9XG4gIH1cblxuICBuZ0FmdGVyVmlld0luaXQoKSB7XG4gICAgaWYgKHRoaXMuaXNTZXJ2ZXIpIHJldHVybjtcblxuICAgIGlmICh0aGlzLmlzTGF6eSgpKSB7XG4gICAgICBjb25zdCBob3N0SW5WaWV3JCA9IGluVmlldyh0aGlzLmhvc3QoKSk7XG5cbiAgICAgIGlmICh0aGlzLm9ubHlUZXh0T3ZlcmZsb3coKSkge1xuICAgICAgICBob3N0SW5WaWV3JFxuICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgc3dpdGNoTWFwKCgpID0+IHRoaXMuaXNPdmVyZmxvd2luZyQoKSksXG4gICAgICAgICAgICB0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5kZXN0cm95UmVmKVxuICAgICAgICAgIClcbiAgICAgICAgICAuc3Vic2NyaWJlKChpc0VsZW1lbnRPdmVyZmxvdykgPT4ge1xuICAgICAgICAgICAgdGhpcy5jaGVja092ZXJmbG93KGlzRWxlbWVudE92ZXJmbG93KTtcbiAgICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGhvc3RJblZpZXckLnBpcGUodGFrZVVudGlsRGVzdHJveWVkKHRoaXMuZGVzdHJveVJlZikpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgdGhpcy5jcmVhdGVJbnN0YW5jZSgpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHRoaXMub25seVRleHRPdmVyZmxvdygpKSB7XG4gICAgICB0aGlzLmlzT3ZlcmZsb3dpbmckKClcbiAgICAgICAgLnBpcGUodGFrZVVudGlsRGVzdHJveWVkKHRoaXMuZGVzdHJveVJlZikpXG4gICAgICAgIC5zdWJzY3JpYmUoKGlzRWxlbWVudE92ZXJmbG93KSA9PiB7XG4gICAgICAgICAgdGhpcy5jaGVja092ZXJmbG93KGlzRWxlbWVudE92ZXJmbG93KTtcbiAgICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuY3JlYXRlSW5zdGFuY2UoKTtcbiAgICB9XG4gIH1cblxuICBkZXN0cm95VmlldygpIHtcbiAgICB0aGlzLnZpZXdPcHRpb25zJCA9IG51bGw7XG4gICAgdGhpcy52aWV3UmVmPy5kZXN0cm95KCk7XG4gICAgdGhpcy52aWV3UmVmID0gbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGlzIG1ldGhvZCBpcyB1c2VmdWwgd2hlbiB5b3UgYXBwZW5kIHRvIGFuIGVsZW1lbnQgdGhhdCB5b3UgbWlnaHQgcmVtb3ZlIGZyb20gdGhlIERPTS5cbiAgICogSW4gc3VjaCBjYXNlcyB3ZSB3YW50IHRvIGhpZGUgdGhlIHRvb2x0aXAgYW5kIGxldCBpdCBnbyB0aHJvdWdoIHRoZSBkZXN0cm95IGxpZmVjeWNsZS5cbiAgICogRm9yIGV4YW1wbGUsIGlmIHlvdSBoYXZlIGEgZ3JpZCByb3cgd2l0aCBhbiBlbGVtZW50IHRoYXQgeW91IHRvZ2dsZSB1c2luZyB0aGUgZGlzcGxheSBDU1MgcHJvcGVydHkgb24gaG92ZXIuXG4gICAqL1xuICBvYnNlcnZlSG9zdFZpc2liaWxpdHkoKSB7XG4gICAgaWYgKHRoaXMuaXNTZXJ2ZXIpIHJldHVybjtcbiAgICAvLyBXZSBkb24ndCB3YW50IHRvIG9ic2VydmUgdGhlIGhvc3QgdmlzaWJpbGl0eSBpZiB3ZSBhcmUgYXBwZW5kaW5nIHRvIHRoZSBib2R5LlxuICAgIGlmICh0aGlzLnByb3BzLmFwcGVuZFRvICYmIHRoaXMucHJvcHMuYXBwZW5kVG8gIT09IGRvY3VtZW50LmJvZHkpIHtcbiAgICAgIHRoaXMudmlzaWJpbGl0eU9ic2VydmVyQ2xlYW51cD8uKCk7XG4gICAgICByZXR1cm4gdGhpcy52aXNpYmxlSW50ZXJuYWxcbiAgICAgICAgLnBpcGUodGFrZVVudGlsRGVzdHJveWVkKHRoaXMuZGVzdHJveVJlZikpXG4gICAgICAgIC5zdWJzY3JpYmUoKGlzVmlzaWJsZSkgPT4ge1xuICAgICAgICAgIGlmIChpc1Zpc2libGUpIHtcbiAgICAgICAgICAgIHRoaXMudmlzaWJpbGl0eU9ic2VydmVyQ2xlYW51cCA9IG9ic2VydmVWaXNpYmlsaXR5KFxuICAgICAgICAgICAgICB0aGlzLmluc3RhbmNlLnJlZmVyZW5jZSxcbiAgICAgICAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuaGlkZSgpO1xuICAgICAgICAgICAgICAgIC8vIEJlY2F1c2Ugd2UgaGF2ZSBhbmltYXRpb24gb24gdGhlIHBvcHBlciBpdCBkb2Vzbid0IGNsb3NlIGltbWVkaWF0ZWx5IGRvZXNuJ3QgdHJpZ2dlciB0aGUgYHRwVmlzaWJsZWAgZXZlbnQuXG4gICAgICAgICAgICAgICAgLy8gVGlwcHkgaXMgcmVseWluZyBvbiB0aGUgdHJhbnNpdGlvbmVuZCBldmVudCB0byB0cmlnZ2VyIHRoZSBgb25IaWRkZW5gIGNhbGxiYWNrLlxuICAgICAgICAgICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hdG9taWtzL3RpcHB5anMvYmxvYi9tYXN0ZXIvc3JjL2RvbS11dGlscy50cyNMMTE3XG4gICAgICAgICAgICAgICAgLy8gVGhpcyBldmVudCBuZXZlciBmaXJlcyBiZWNhdXNlIHRoZSBwb3BwZXIgaXMgcmVtb3ZlZCBmcm9tIHRoZSBET00gYmVmb3JlIHRoZSB0cmFuc2l0aW9uIGVuZHMuXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMucHJvcHMuYW5pbWF0aW9uKSB7XG4gICAgICAgICAgICAgICAgICB0aGlzLm9uSGlkZGVuKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnZpc2liaWxpdHlPYnNlcnZlckNsZWFudXA/LigpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgc2hvdygpIHtcbiAgICB0aGlzLmluc3RhbmNlPy5zaG93KCk7XG4gIH1cblxuICBoaWRlKCkge1xuICAgIHRoaXMuaW5zdGFuY2U/LmhpZGUoKTtcbiAgfVxuXG4gIGVuYWJsZSgpIHtcbiAgICB0aGlzLmluc3RhbmNlPy5lbmFibGUoKTtcbiAgfVxuXG4gIGRpc2FibGUoKSB7XG4gICAgdGhpcy5pbnN0YW5jZT8uZGlzYWJsZSgpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHVwZGF0ZVByb3BzKHByb3BzOiBQYXJ0aWFsPFRpcHB5Q29uZmlnPikge1xuICAgIHRoaXMuc2V0UHJvcHMoeyAuLi50aGlzLnByb3BzLCAuLi5wcm9wcyB9KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBzZXRQcm9wcyhwcm9wczogUGFydGlhbDxUaXBweUNvbmZpZz4pIHtcbiAgICB0aGlzLnByb3BzID0gcHJvcHM7XG4gICAgdGhpcy5pbnN0YW5jZT8uc2V0UHJvcHMob25seVRpcHB5UHJvcHMocHJvcHMpKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBzZXRTdGF0dXMoaXNFbmFibGVkOiBib29sZWFuKSB7XG4gICAgaXNFbmFibGVkID8gdGhpcy5pbnN0YW5jZT8uZW5hYmxlKCkgOiB0aGlzLmluc3RhbmNlPy5kaXNhYmxlKCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgY3JlYXRlSW5zdGFuY2UoKSB7XG4gICAgaWYgKCF0aGlzLmNvbnRlbnQoKSAmJiAhdGhpcy51c2VUZXh0Q29udGVudCgpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy50aXBweUZhY3RvcnlcbiAgICAgIC5jcmVhdGUodGhpcy5ob3N0KCksIHtcbiAgICAgICAgYWxsb3dIVE1MOiB0cnVlLFxuICAgICAgICBhcHBlbmRUbzogZG9jdW1lbnQuYm9keSxcbiAgICAgICAgLi4uKHRoaXMuZ2xvYmFsQ29uZmlnLnpJbmRleEdldHRlclxuICAgICAgICAgID8geyB6SW5kZXg6IHRoaXMuZ2xvYmFsQ29uZmlnLnpJbmRleEdldHRlcigpIH1cbiAgICAgICAgICA6IHt9KSxcbiAgICAgICAgLi4ub25seVRpcHB5UHJvcHModGhpcy5nbG9iYWxDb25maWcpLFxuICAgICAgICAuLi5vbmx5VGlwcHlQcm9wcyh0aGlzLnByb3BzKSxcbiAgICAgICAgb25Nb3VudDogKGluc3RhbmNlKSA9PiB7XG4gICAgICAgICAgY29uc3QgaXNWaXNpYmxlID0gdHJ1ZTtcbiAgICAgICAgICB0aGlzLmlzVmlzaWJsZS5zZXQoaXNWaXNpYmxlKTtcbiAgICAgICAgICB0aGlzLnZpc2libGVJbnRlcm5hbC5uZXh0KGlzVmlzaWJsZSk7XG4gICAgICAgICAgaWYgKHRoaXMudmlzaWJsZS5vYnNlcnZlZCkge1xuICAgICAgICAgICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+IHRoaXMudmlzaWJsZS5uZXh0KGlzVmlzaWJsZSkpO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLnVzZUhvc3RXaWR0aCgpICYmIHRoaXMubGlzdGVuVG9Ib3N0UmVzaXplKCk7XG4gICAgICAgICAgdGhpcy5nbG9iYWxDb25maWcub25Nb3VudD8uKGluc3RhbmNlKTtcbiAgICAgICAgfSxcbiAgICAgICAgb25DcmVhdGU6IChpbnN0YW5jZSkgPT4ge1xuICAgICAgICAgIGluc3RhbmNlLnBvcHBlci5jbGFzc0xpc3QuYWRkKFxuICAgICAgICAgICAgYHRpcHB5LXZhcmlhdGlvbi0ke3RoaXMudmFyaWF0aW9uKCkgfHwgdGhpcy5nbG9iYWxDb25maWcuZGVmYXVsdFZhcmlhdGlvbn1gXG4gICAgICAgICAgKTtcbiAgICAgICAgICBpZiAodGhpcy5jbGFzc05hbWUoKSkge1xuICAgICAgICAgICAgZm9yIChjb25zdCBrbGFzcyBvZiBub3JtYWxpemVDbGFzc05hbWUodGhpcy5jbGFzc05hbWUoKSkpIHtcbiAgICAgICAgICAgICAgaW5zdGFuY2UucG9wcGVyLmNsYXNzTGlzdC5hZGQoa2xhc3MpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLmdsb2JhbENvbmZpZy5vbkNyZWF0ZT8uKGluc3RhbmNlKTtcbiAgICAgICAgICBpZiAodGhpcy5pc1Zpc2libGUoKSA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgaW5zdGFuY2Uuc2hvdygpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgb25TaG93OiAoaW5zdGFuY2UpID0+IHtcbiAgICAgICAgICBpbnN0YW5jZS5yZWZlcmVuY2Uuc2V0QXR0cmlidXRlKCdkYXRhLXRpcHB5LW9wZW4nLCAnJyk7XG5cbiAgICAgICAgICAvLyBXZSdyZSByZS1lbnRlcmluZyBiZWNhdXNlIHdlIG1pZ2h0IGNyZWF0ZSBhbiBBbmd1bGFyIGNvbXBvbmVudCxcbiAgICAgICAgICAvLyB3aGljaCBzaG91bGQgYmUgZG9uZSB3aXRoaW4gdGhlIHpvbmUuXG4gICAgICAgICAgY29uc3QgY29udGVudCA9IHRoaXMubmdab25lLnJ1bigoKSA9PiB0aGlzLnJlc29sdmVDb250ZW50KGluc3RhbmNlKSk7XG5cbiAgICAgICAgICBpZiAoaXNTdHJpbmcoY29udGVudCkpIHtcbiAgICAgICAgICAgIGluc3RhbmNlLnNldFByb3BzKHsgYWxsb3dIVE1MOiBmYWxzZSB9KTtcblxuICAgICAgICAgICAgaWYgKCFjb250ZW50Py50cmltKCkpIHtcbiAgICAgICAgICAgICAgdGhpcy5kaXNhYmxlKCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB0aGlzLmVuYWJsZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGluc3RhbmNlLnNldENvbnRlbnQoY29udGVudCk7XG4gICAgICAgICAgdGhpcy5oaWRlT25Fc2NhcGUoKSAmJiB0aGlzLmhhbmRsZUVzY2FwZUJ1dHRvbigpO1xuXG4gICAgICAgICAgaWYgKHRoaXMudXNlSG9zdFdpZHRoKCkpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0SW5zdGFuY2VXaWR0aChpbnN0YW5jZSwgdGhpcy5ob3N0V2lkdGgpO1xuICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5wb3BwZXJXaWR0aCgpKSB7XG4gICAgICAgICAgICB0aGlzLnNldEluc3RhbmNlV2lkdGgoaW5zdGFuY2UsIHRoaXMucG9wcGVyV2lkdGgoKSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMuZ2xvYmFsQ29uZmlnLm9uU2hvdz8uKGluc3RhbmNlKTtcbiAgICAgICAgfSxcbiAgICAgICAgb25IaWRlKGluc3RhbmNlKSB7XG4gICAgICAgICAgaW5zdGFuY2UucmVmZXJlbmNlLnJlbW92ZUF0dHJpYnV0ZSgnZGF0YS10aXBweS1vcGVuJyk7XG4gICAgICAgIH0sXG4gICAgICAgIG9uSGlkZGVuOiAoaW5zdGFuY2UpID0+IHtcbiAgICAgICAgICB0aGlzLm9uSGlkZGVuKGluc3RhbmNlKTtcbiAgICAgICAgfSxcbiAgICAgIH0pXG4gICAgICAucGlwZSh0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5kZXN0cm95UmVmKSlcbiAgICAgIC5zdWJzY3JpYmUoKGluc3RhbmNlKSA9PiB7XG4gICAgICAgIHRoaXMuaW5zdGFuY2UgPSBpbnN0YW5jZTtcblxuICAgICAgICB0aGlzLnNldFN0YXR1cyh0aGlzLmlzRW5hYmxlZCgpKTtcbiAgICAgICAgdGhpcy5zZXRQcm9wcyh0aGlzLnByb3BzKTtcblxuICAgICAgICB0aGlzLnZhcmlhdGlvbigpID09PSAnY29udGV4dE1lbnUnICYmIHRoaXMuaGFuZGxlQ29udGV4dE1lbnUoKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIHJlc29sdmVDb250ZW50KGluc3RhbmNlOiBUaXBweUluc3RhbmNlKSB7XG4gICAgY29uc3QgY29udGVudCA9IHRoaXMuY29udGVudCgpO1xuXG4gICAgaWYgKCF0aGlzLnZpZXdPcHRpb25zJCAmJiAhaXNTdHJpbmcoY29udGVudCkpIHtcbiAgICAgIGNvbnN0IGluamVjdG9yID0gSW5qZWN0b3IuY3JlYXRlKHtcbiAgICAgICAgcHJvdmlkZXJzOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgcHJvdmlkZTogVElQUFlfUkVGLFxuICAgICAgICAgICAgdXNlVmFsdWU6IHRoaXMuaW5zdGFuY2UsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgICAgcGFyZW50OiB0aGlzLmluamVjdG9yLFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IGRhdGEgPSB0aGlzLmRhdGEoKTtcblxuICAgICAgaWYgKGlzQ29tcG9uZW50KGNvbnRlbnQpKSB7XG4gICAgICAgIHRoaXMuaW5zdGFuY2UuZGF0YSA9IGRhdGE7XG5cbiAgICAgICAgdGhpcy52aWV3T3B0aW9ucyQgPSB7XG4gICAgICAgICAgaW5qZWN0b3IsXG4gICAgICAgIH07XG4gICAgICB9IGVsc2UgaWYgKGlzVGVtcGxhdGVSZWYoY29udGVudCkpIHtcbiAgICAgICAgdGhpcy52aWV3T3B0aW9ucyQgPSB7XG4gICAgICAgICAgaW5qZWN0b3IsXG4gICAgICAgICAgY29udGV4dDoge1xuICAgICAgICAgICAgZGF0YSxcbiAgICAgICAgICAgICRpbXBsaWNpdDogdGhpcy5oaWRlLmJpbmQodGhpcyksXG4gICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLnZpZXdSZWYgPSB0aGlzLnZpZXdTZXJ2aWNlLmNyZWF0ZVZpZXcoY29udGVudCwge1xuICAgICAgdmNyOiB0aGlzLnZjcixcbiAgICAgIC4uLnRoaXMudmlld09wdGlvbnMkLFxuICAgIH0pO1xuXG4gICAgLy8gV2UgbmVlZCB0byBjYWxsIGRldGVjdENoYW5nZXMgZm9yIG9uUHVzaCBjb21wb25lbnRzIHRvIHVwZGF0ZSB0aGUgY29udGVudFxuICAgIGlmICh0aGlzLmRldGVjdENoYW5nZXNDb21wb25lbnQoKSAmJiBpc0NvbXBvbmVudChjb250ZW50KSkge1xuICAgICAgdGhpcy52aWV3UmVmLmRldGVjdENoYW5nZXMoKTtcbiAgICB9XG5cbiAgICBsZXQgbmV3Q29udGVudCA9IHRoaXMudmlld1JlZi5nZXRFbGVtZW50KCk7XG5cbiAgICBpZiAodGhpcy51c2VUZXh0Q29udGVudCgpKSB7XG4gICAgICBuZXdDb250ZW50ID0gaW5zdGFuY2UucmVmZXJlbmNlLnRleHRDb250ZW50O1xuICAgIH1cblxuICAgIGlmIChpc1N0cmluZyhuZXdDb250ZW50KSAmJiB0aGlzLmdsb2JhbENvbmZpZy5iZWZvcmVSZW5kZXIpIHtcbiAgICAgIG5ld0NvbnRlbnQgPSB0aGlzLmdsb2JhbENvbmZpZy5iZWZvcmVSZW5kZXIobmV3Q29udGVudCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ld0NvbnRlbnQ7XG4gIH1cblxuICBwcm90ZWN0ZWQgaGFuZGxlQ29udGV4dE1lbnUoKSB7XG4gICAgZnJvbUV2ZW50KHRoaXMuaG9zdCgpLCAnY29udGV4dG1lbnUnKVxuICAgICAgLnBpcGUodGFrZVVudGlsRGVzdHJveWVkKHRoaXMuZGVzdHJveVJlZikpXG4gICAgICAuc3Vic2NyaWJlKChldmVudDogTW91c2VFdmVudCkgPT4ge1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgICAgIHRoaXMuaW5zdGFuY2Uuc2V0UHJvcHMoe1xuICAgICAgICAgIGdldFJlZmVyZW5jZUNsaWVudFJlY3Q6ICgpID0+XG4gICAgICAgICAgICAoe1xuICAgICAgICAgICAgICB3aWR0aDogMCxcbiAgICAgICAgICAgICAgaGVpZ2h0OiAwLFxuICAgICAgICAgICAgICB0b3A6IGV2ZW50LmNsaWVudFksXG4gICAgICAgICAgICAgIGJvdHRvbTogZXZlbnQuY2xpZW50WSxcbiAgICAgICAgICAgICAgbGVmdDogZXZlbnQuY2xpZW50WCxcbiAgICAgICAgICAgICAgcmlnaHQ6IGV2ZW50LmNsaWVudFgsXG4gICAgICAgICAgICB9IGFzIERPTVJlY3RSZWFkT25seSksXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuaW5zdGFuY2Uuc2hvdygpO1xuICAgICAgfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgaGFuZGxlRXNjYXBlQnV0dG9uKCk6IHZvaWQge1xuICAgIGZyb21FdmVudChkb2N1bWVudC5ib2R5LCAna2V5ZG93bicpXG4gICAgICAucGlwZShcbiAgICAgICAgZmlsdGVyKCh7IGNvZGUgfTogS2V5Ym9hcmRFdmVudCkgPT4gY29kZSA9PT0gJ0VzY2FwZScpLFxuICAgICAgICB0YWtlVW50aWwodGhpcy52aXNpYmxlSW50ZXJuYWwucGlwZShmaWx0ZXIoKHYpID0+ICF2KSkpLFxuICAgICAgICB0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5kZXN0cm95UmVmKVxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgoKSA9PiB0aGlzLmhpZGUoKSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgY2hlY2tPdmVyZmxvdyhpc0VsZW1lbnRPdmVyZmxvdzogYm9vbGVhbikge1xuICAgIGlmIChpc0VsZW1lbnRPdmVyZmxvdykge1xuICAgICAgaWYgKCF0aGlzLmluc3RhbmNlKSB7XG4gICAgICAgIHRoaXMuY3JlYXRlSW5zdGFuY2UoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuaW5zdGFuY2UuZW5hYmxlKCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuaW5zdGFuY2U/LmRpc2FibGUoKTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgbGlzdGVuVG9Ib3N0UmVzaXplKCkge1xuICAgIGRpbWVuc2lvbnNDaGFuZ2VzKHRoaXMuaG9zdCgpKVxuICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMudmlzaWJsZUludGVybmFsKSwgdGFrZVVudGlsRGVzdHJveWVkKHRoaXMuZGVzdHJveVJlZikpXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgdGhpcy5zZXRJbnN0YW5jZVdpZHRoKHRoaXMuaW5zdGFuY2UsIHRoaXMuaG9zdFdpZHRoKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIHNldEluc3RhbmNlV2lkdGgoaW5zdGFuY2U6IEluc3RhbmNlLCB3aWR0aDogc3RyaW5nIHwgbnVtYmVyKSB7XG4gICAgY29uc3QgaW5QaXhlbHMgPSBjb2VyY2VDc3NQaXhlbFZhbHVlKHdpZHRoKTtcbiAgICBpbnN0YW5jZS5wb3BwZXIuc3R5bGUud2lkdGggPSBpblBpeGVscztcbiAgICBpbnN0YW5jZS5wb3BwZXIuc3R5bGUubWF4V2lkdGggPSBpblBpeGVscztcbiAgICAoaW5zdGFuY2UucG9wcGVyLmZpcnN0RWxlbWVudENoaWxkIGFzIEhUTUxFbGVtZW50KS5zdHlsZS5tYXhXaWR0aCA9IGluUGl4ZWxzO1xuICB9XG5cbiAgcHJpdmF0ZSBvbkhpZGRlbihpbnN0YW5jZTogVGlwcHlJbnN0YW5jZSA9IHRoaXMuaW5zdGFuY2UpIHtcbiAgICB0aGlzLmRlc3Ryb3lWaWV3KCk7XG4gICAgY29uc3QgaXNWaXNpYmxlID0gZmFsc2U7XG4gICAgdGhpcy5pc1Zpc2libGUuc2V0KGlzVmlzaWJsZSk7XG4gICAgdGhpcy52aXNpYmxlSW50ZXJuYWwubmV4dChpc1Zpc2libGUpO1xuICAgIGlmICh0aGlzLnZpc2libGUub2JzZXJ2ZWQpIHtcbiAgICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB0aGlzLnZpc2libGUubmV4dChpc1Zpc2libGUpKTtcbiAgICB9XG4gICAgdGhpcy5nbG9iYWxDb25maWcub25IaWRkZW4/LihpbnN0YW5jZSk7XG4gIH1cblxuICBwcml2YXRlIGlzT3ZlcmZsb3dpbmckKCkge1xuICAgIGNvbnN0IGhvc3QgPSB0aGlzLmhvc3QoKTtcbiAgICBjb25zdCBub3RpZmllcnMkID0gW292ZXJmbG93Q2hhbmdlcyhob3N0KV07XG5cbiAgICAvLyBXZSBuZWVkIHRvIGhhbmRsZSBjYXNlcyB3aGVyZSB0aGUgaG9zdCBoYXMgYSBzdGF0aWMgd2lkdGggYnV0IHRoZSBjb250ZW50IG1pZ2h0IGNoYW5nZVxuICAgIGlmICh0aGlzLnN0YXRpY1dpZHRoSG9zdCgpKSB7XG4gICAgICBub3RpZmllcnMkLnB1c2goXG4gICAgICAgIHRoaXMuY29udGVudENoYW5nZWQucGlwZShcbiAgICAgICAgICAvLyBXZSBuZWVkIHRvIHdhaXQgZm9yIHRoZSBjb250ZW50IHRvIGJlIHJlbmRlcmVkIGJlZm9yZSB3ZSBjYW4gY2hlY2sgaWYgaXQncyBvdmVyZmxvd2luZy5cbiAgICAgICAgICBzd2l0Y2hNYXAoKCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBPYnNlcnZhYmxlKChzdWJzY3JpYmVyKSA9PiB7XG4gICAgICAgICAgICAgIGNvbnN0IGlkID0gd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgc3Vic2NyaWJlci5uZXh0KCk7XG4gICAgICAgICAgICAgICAgc3Vic2NyaWJlci5jb21wbGV0ZSgpO1xuICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICByZXR1cm4gKCkgPT4gY2FuY2VsQW5pbWF0aW9uRnJhbWUoaWQpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSksXG4gICAgICAgICAgbWFwKCgpID0+IGlzRWxlbWVudE92ZXJmbG93KGhvc3QpKVxuICAgICAgICApXG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiBtZXJnZSguLi5ub3RpZmllcnMkKTtcbiAgfVxuXG4gIHByaXZhdGUgc2V0dXBMaXN0ZW5lcnMoKTogdm9pZCB7XG4gICAgZWZmZWN0KCgpID0+IHtcbiAgICAgIGNvbnN0IGFwcGVuZFRvID0gdGhpcy5hcHBlbmRUbygpO1xuICAgICAgdGhpcy51cGRhdGVQcm9wcyh7IGFwcGVuZFRvIH0pO1xuICAgIH0pO1xuXG4gICAgZWZmZWN0KCgpID0+IHtcbiAgICAgIC8vIENhcHR1cmUgc2lnbmFsIHJlYWQgdG8gdHJhY2sgaXRzIGNoYW5nZXMuXG4gICAgICB0aGlzLmNvbnRlbnQoKTtcbiAgICAgIHVudHJhY2tlZCgoKSA9PiB0aGlzLmNvbnRlbnRDaGFuZ2VkLm5leHQoKSk7XG4gICAgfSk7XG5cbiAgICBlZmZlY3QoKCkgPT4gdGhpcy5zZXRTdGF0dXModGhpcy5pc0VuYWJsZWQoKSkpO1xuXG4gICAgZWZmZWN0KCgpID0+IHtcbiAgICAgIGNvbnN0IGlzVmlzaWJsZSA9IHRoaXMuaXNWaXNpYmxlKCk7XG4gICAgICBpc1Zpc2libGUgPyB0aGlzLnNob3coKSA6IHRoaXMuaGlkZSgpO1xuICAgIH0pO1xuICB9XG59XG5cbmZ1bmN0aW9uIGlzQ2hhbmdlZChcbiAga2V5OiBrZXlvZiBOZ0NoYW5nZXM8VGlwcHlEaXJlY3RpdmU+LFxuICBjaGFuZ2VzOiBOZ0NoYW5nZXM8VGlwcHlEaXJlY3RpdmU+XG4pIHtcbiAgcmV0dXJuIGtleSBpbiBjaGFuZ2VzO1xufVxuIl19