@fundamental-ngx/core 0.35.2-rc.30 → 0.35.2-rc.33

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.
Files changed (115) hide show
  1. package/action-bar/package.json +1 -1
  2. package/action-sheet/package.json +1 -1
  3. package/alert/package.json +1 -1
  4. package/avatar/package.json +1 -1
  5. package/avatar-group/package.json +1 -1
  6. package/bar/package.json +1 -1
  7. package/breadcrumb/package.json +1 -1
  8. package/busy-indicator/package.json +1 -1
  9. package/button/package.json +1 -1
  10. package/calendar/package.json +1 -1
  11. package/card/package.json +1 -1
  12. package/carousel/package.json +1 -1
  13. package/checkbox/package.json +1 -1
  14. package/combobox/package.json +1 -1
  15. package/content-density/package.json +3 -3
  16. package/date-picker/package.json +1 -1
  17. package/datetime/package.json +1 -1
  18. package/datetime-picker/package.json +1 -1
  19. package/dialog/package.json +1 -1
  20. package/dynamic-page/package.json +1 -1
  21. package/dynamic-side-content/package.json +1 -1
  22. package/esm2020/fixed-card-layout/fixed-card-layout.component.mjs +22 -33
  23. package/esm2020/time/time-column/time-column.component.mjs +21 -11
  24. package/facets/package.json +1 -1
  25. package/feed-input/package.json +1 -1
  26. package/feed-list-item/package.json +1 -1
  27. package/fesm2015/fundamental-ngx-core-fixed-card-layout.mjs +21 -32
  28. package/fesm2015/fundamental-ngx-core-fixed-card-layout.mjs.map +1 -1
  29. package/fesm2015/fundamental-ngx-core-time.mjs +20 -10
  30. package/fesm2015/fundamental-ngx-core-time.mjs.map +1 -1
  31. package/fesm2020/fundamental-ngx-core-fixed-card-layout.mjs +21 -32
  32. package/fesm2020/fundamental-ngx-core-fixed-card-layout.mjs.map +1 -1
  33. package/fesm2020/fundamental-ngx-core-time.mjs +20 -10
  34. package/fesm2020/fundamental-ngx-core-time.mjs.map +1 -1
  35. package/file-uploader/package.json +1 -1
  36. package/fixed-card-layout/esm2020/fixed-card-layout.component.mjs +22 -33
  37. package/fixed-card-layout/fesm2015/fundamental-ngx-core-fixed-card-layout.mjs +21 -32
  38. package/fixed-card-layout/fesm2015/fundamental-ngx-core-fixed-card-layout.mjs.map +1 -1
  39. package/fixed-card-layout/fesm2020/fundamental-ngx-core-fixed-card-layout.mjs +21 -32
  40. package/fixed-card-layout/fesm2020/fundamental-ngx-core-fixed-card-layout.mjs.map +1 -1
  41. package/fixed-card-layout/fixed-card-layout.component.d.ts +4 -6
  42. package/fixed-card-layout/package.json +1 -1
  43. package/flexible-column-layout/package.json +1 -1
  44. package/form/package.json +1 -1
  45. package/formatted-text/package.json +1 -1
  46. package/grid-list/package.json +1 -1
  47. package/icon/package.json +1 -1
  48. package/illustrated-message/package.json +1 -1
  49. package/infinite-scroll/package.json +1 -1
  50. package/info-label/package.json +1 -1
  51. package/inline-help/package.json +1 -1
  52. package/input-group/package.json +1 -1
  53. package/layout-grid/package.json +1 -1
  54. package/layout-panel/package.json +1 -1
  55. package/link/package.json +1 -1
  56. package/list/package.json +1 -1
  57. package/menu/package.json +1 -1
  58. package/message-box/package.json +1 -1
  59. package/message-strip/package.json +1 -1
  60. package/message-toast/package.json +1 -1
  61. package/micro-process-flow/package.json +1 -1
  62. package/mobile-mode/package.json +1 -1
  63. package/multi-input/package.json +1 -1
  64. package/nested-list/package.json +1 -1
  65. package/notification/package.json +1 -1
  66. package/object-identifier/package.json +1 -1
  67. package/object-marker/package.json +1 -1
  68. package/object-number/package.json +1 -1
  69. package/object-status/package.json +1 -1
  70. package/overflow-layout/package.json +13 -13
  71. package/package.json +1 -1
  72. package/pagination/package.json +1 -1
  73. package/panel/package.json +1 -1
  74. package/popover/package.json +1 -1
  75. package/product-switch/package.json +1 -1
  76. package/progress-indicator/package.json +1 -1
  77. package/quick-view/package.json +1 -1
  78. package/radio/package.json +1 -1
  79. package/rating-indicator/package.json +1 -1
  80. package/resizable-card-layout/package.json +1 -1
  81. package/scroll-spy/package.json +1 -1
  82. package/scrollbar/package.json +1 -1
  83. package/segmented-button/package.json +1 -1
  84. package/select/package.json +1 -1
  85. package/shared/package.json +1 -1
  86. package/shellbar/package.json +1 -1
  87. package/side-navigation/package.json +1 -1
  88. package/slider/package.json +1 -1
  89. package/split-button/package.json +1 -1
  90. package/splitter/package.json +1 -1
  91. package/status-indicator/package.json +1 -1
  92. package/step-input/package.json +1 -1
  93. package/switch/package.json +1 -1
  94. package/table/package.json +1 -1
  95. package/tabs/package.json +1 -1
  96. package/text/package.json +1 -1
  97. package/theming/package.json +1 -1
  98. package/tile/package.json +1 -1
  99. package/time/esm2020/time-column/time-column.component.mjs +21 -11
  100. package/time/fesm2015/fundamental-ngx-core-time.mjs +20 -10
  101. package/time/fesm2015/fundamental-ngx-core-time.mjs.map +1 -1
  102. package/time/fesm2020/fundamental-ngx-core-time.mjs +20 -10
  103. package/time/fesm2020/fundamental-ngx-core-time.mjs.map +1 -1
  104. package/time/package.json +1 -1
  105. package/time/time-column/time-column.component.d.ts +3 -2
  106. package/time-picker/package.json +1 -1
  107. package/timeline/package.json +1 -1
  108. package/title/package.json +1 -1
  109. package/token/package.json +1 -1
  110. package/toolbar/package.json +1 -1
  111. package/tree/package.json +1 -1
  112. package/upload-collection/package.json +1 -1
  113. package/utils/package.json +1 -1
  114. package/vertical-navigation/package.json +1 -1
  115. package/wizard/package.json +1 -1
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fundamental-ngx/core/action-bar",
3
- "version": "0.35.2-rc.30",
3
+ "version": "0.35.2-rc.33",
4
4
  "peerDependencies": {
5
5
  "@angular/common": "^13.0.0",
6
6
  "@angular/core": "^13.0.0"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fundamental-ngx/core/action-sheet",
3
- "version": "0.35.2-rc.30",
3
+ "version": "0.35.2-rc.33",
4
4
  "peerDependencies": {
5
5
  "@angular/common": "^13.0.0",
6
6
  "@angular/core": "^13.0.0"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fundamental-ngx/core/alert",
3
- "version": "0.35.2-rc.30",
3
+ "version": "0.35.2-rc.33",
4
4
  "peerDependencies": {
5
5
  "@angular/common": "^13.0.0",
6
6
  "@angular/core": "^13.0.0"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fundamental-ngx/core/avatar",
3
- "version": "0.35.2-rc.30",
3
+ "version": "0.35.2-rc.33",
4
4
  "peerDependencies": {
5
5
  "@angular/common": "^13.0.0",
6
6
  "@angular/core": "^13.0.0"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fundamental-ngx/core/avatar-group",
3
- "version": "0.35.2-rc.30",
3
+ "version": "0.35.2-rc.33",
4
4
  "peerDependencies": {
5
5
  "@angular/common": "^13.0.0",
6
6
  "@angular/core": "^13.0.0"
package/bar/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fundamental-ngx/core/bar",
3
- "version": "0.35.2-rc.30",
3
+ "version": "0.35.2-rc.33",
4
4
  "peerDependencies": {
5
5
  "@angular/common": "^13.0.0",
6
6
  "@angular/core": "^13.0.0"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fundamental-ngx/core/breadcrumb",
3
- "version": "0.35.2-rc.30",
3
+ "version": "0.35.2-rc.33",
4
4
  "peerDependencies": {
5
5
  "@angular/common": "^13.0.0",
6
6
  "@angular/core": "^13.0.0"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fundamental-ngx/core/busy-indicator",
3
- "version": "0.35.2-rc.30",
3
+ "version": "0.35.2-rc.33",
4
4
  "peerDependencies": {
5
5
  "@angular/common": "^13.0.0",
6
6
  "@angular/core": "^13.0.0"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fundamental-ngx/core/button",
3
- "version": "0.35.2-rc.30",
3
+ "version": "0.35.2-rc.33",
4
4
  "peerDependencies": {
5
5
  "@angular/common": "^13.0.0",
6
6
  "@angular/core": "^13.0.0"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fundamental-ngx/core/calendar",
3
- "version": "0.35.2-rc.30",
3
+ "version": "0.35.2-rc.33",
4
4
  "peerDependencies": {
5
5
  "@angular/common": "^13.0.0",
6
6
  "@angular/core": "^13.0.0"
package/card/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fundamental-ngx/core/card",
3
- "version": "0.35.2-rc.30",
3
+ "version": "0.35.2-rc.33",
4
4
  "peerDependencies": {
5
5
  "@angular/common": "^13.0.0",
6
6
  "@angular/core": "^13.0.0"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fundamental-ngx/core/carousel",
3
- "version": "0.35.2-rc.30",
3
+ "version": "0.35.2-rc.33",
4
4
  "peerDependencies": {
5
5
  "@angular/common": "^13.0.0",
6
6
  "@angular/core": "^13.0.0"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fundamental-ngx/core/checkbox",
3
- "version": "0.35.2-rc.30",
3
+ "version": "0.35.2-rc.33",
4
4
  "peerDependencies": {
5
5
  "@angular/common": "^13.0.0",
6
6
  "@angular/core": "^13.0.0"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fundamental-ngx/core/combobox",
3
- "version": "0.35.2-rc.30",
3
+ "version": "0.35.2-rc.33",
4
4
  "peerDependencies": {
5
5
  "@angular/common": "^13.0.0",
6
6
  "@angular/core": "^13.0.0"
@@ -1,13 +1,13 @@
1
1
  {
2
2
  "name": "@fundamental-ngx/core/content-density",
3
- "version": "0.35.2-rc.30",
3
+ "version": "0.35.2-rc.33",
4
4
  "peerDependencies": {
5
5
  "@angular/common": "^13.0.0",
6
6
  "@angular/core": "^13.0.0",
7
7
  "rxjs": "7.5.4",
8
8
  "@angular/cdk": "~13.2.4",
9
- "@fundamental-ngx/core/utils": "0.35.2-rc.30",
10
- "@fundamental-ngx/core/shared": "0.35.2-rc.30",
9
+ "@fundamental-ngx/core/utils": "0.35.2-rc.33",
10
+ "@fundamental-ngx/core/shared": "0.35.2-rc.33",
11
11
  "core-js": "3.21.1",
12
12
  "zone.js": "0.11.4",
13
13
  "@angular/platform-browser-dynamic": "~13.2.4",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fundamental-ngx/core/date-picker",
3
- "version": "0.35.2-rc.30",
3
+ "version": "0.35.2-rc.33",
4
4
  "peerDependencies": {
5
5
  "@angular/common": "^13.0.0",
6
6
  "@angular/core": "^13.0.0"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fundamental-ngx/core/datetime",
3
- "version": "0.35.2-rc.30",
3
+ "version": "0.35.2-rc.33",
4
4
  "peerDependencies": {
5
5
  "@angular/common": "^13.0.0",
6
6
  "@angular/core": "^13.0.0"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fundamental-ngx/core/datetime-picker",
3
- "version": "0.35.2-rc.30",
3
+ "version": "0.35.2-rc.33",
4
4
  "peerDependencies": {
5
5
  "@angular/common": "^13.0.0",
6
6
  "@angular/core": "^13.0.0"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fundamental-ngx/core/dialog",
3
- "version": "0.35.2-rc.30",
3
+ "version": "0.35.2-rc.33",
4
4
  "peerDependencies": {
5
5
  "@angular/common": "^13.0.0",
6
6
  "@angular/core": "^13.0.0"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fundamental-ngx/core/dynamic-page",
3
- "version": "0.35.2-rc.30",
3
+ "version": "0.35.2-rc.33",
4
4
  "peerDependencies": {
5
5
  "@angular/common": "^13.0.0",
6
6
  "@angular/core": "^13.0.0"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fundamental-ngx/core/dynamic-side-content",
3
- "version": "0.35.2-rc.30",
3
+ "version": "0.35.2-rc.33",
4
4
  "peerDependencies": {
5
5
  "@angular/common": "^13.0.0",
6
6
  "@angular/core": "^13.0.0"
@@ -2,7 +2,7 @@ import { ChangeDetectionStrategy, ChangeDetectorRef, Component, ContentChildren,
2
2
  import { FocusKeyManager } from '@angular/cdk/a11y';
3
3
  import { CdkDrag } from '@angular/cdk/drag-drop';
4
4
  import { Subject, Subscription } from 'rxjs';
5
- import { debounceTime, delay, distinct, takeUntil } from 'rxjs/operators';
5
+ import { debounceTime, distinct, filter, takeUntil } from 'rxjs/operators';
6
6
  import { resizeObservable, RtlService, getDocumentFontSize } from '@fundamental-ngx/core/utils';
7
7
  import { FixedCardLayoutItemComponent } from './fixed-card-layout-item/fixed-card-layout-item.component';
8
8
  import { coerceNumberProperty } from '@angular/cdk/coercion';
@@ -70,6 +70,8 @@ export class FixedCardLayoutComponent {
70
70
  /** @hidden */
71
71
  this._columnsWidth = new Map();
72
72
  /** @hidden */
73
+ this._skipListenResize = false;
74
+ /** @hidden */
73
75
  this._cardMinimumWidth = CARD_MINIMUM_WIDTH;
74
76
  /** @hidden */
75
77
  this._cardsSizeChangeSubscription = new Subscription();
@@ -114,7 +116,6 @@ export class FixedCardLayoutComponent {
114
116
  /** @hidden */
115
117
  ngAfterViewInit() {
116
118
  this._processCards();
117
- this.updateLayout();
118
119
  this._listenOnResize();
119
120
  this._listenOnCardsChange();
120
121
  this._accessibilitySetup();
@@ -129,7 +130,7 @@ export class FixedCardLayoutComponent {
129
130
  this.updateLayout();
130
131
  }
131
132
  else if ('columnsWidthConfig' in changes) {
132
- this._setColumnsWidth();
133
+ this._setCardColumnsWidth();
133
134
  }
134
135
  }
135
136
  /** @hidden */
@@ -147,7 +148,7 @@ export class FixedCardLayoutComponent {
147
148
  }
148
149
  /** Distribute cards on window resize */
149
150
  updateLayout() {
150
- if (!this._cards.length || !this._availableWidth) {
151
+ if (!this._cards.length) {
151
152
  return;
152
153
  }
153
154
  const possibleNumberOfColumns = getNumberOfColumns(this._availableWidth, this.cardMinimumWidth);
@@ -156,12 +157,9 @@ export class FixedCardLayoutComponent {
156
157
  numberOfColumns: this._numberOfColumns,
157
158
  screenSize: this._availableWidth
158
159
  });
159
- if (this._previousNumberOfColumns !== this._numberOfColumns) {
160
- this._previousNumberOfColumns = this._numberOfColumns;
161
- this._updateColumns();
162
- return;
163
- }
164
- this._setColumnsWidth();
160
+ this._setCardColumns();
161
+ this._setCardColumnsWidth();
162
+ this._setContainerHeight();
165
163
  }
166
164
  /** @hidden */
167
165
  _onDropListEntered(event) {
@@ -172,7 +170,7 @@ export class FixedCardLayoutComponent {
172
170
  const spaceToAdd = event.item.element.nativeElement.getBoundingClientRect().height +
173
171
  (event.container.getSortedItems().length ? REM_IN_PX : 0);
174
172
  // When we move the card into a certain column we should increase the height of that column by the card height
175
- this._calculateContainerHeight(columnIndexToAddSpace, spaceToAdd);
173
+ this._setContainerHeight(columnIndexToAddSpace, spaceToAdd);
176
174
  }
177
175
  /** @hidden */
178
176
  _onDragDropped(event) {
@@ -210,7 +208,7 @@ export class FixedCardLayoutComponent {
210
208
  layoutColumns: this._numberOfColumns,
211
209
  items: this._cards.toArray()
212
210
  });
213
- this._updateColumns();
211
+ this.updateLayout();
214
212
  }
215
213
  /** @hidden */
216
214
  _accessibilitySetup() {
@@ -226,27 +224,19 @@ export class FixedCardLayoutComponent {
226
224
  /** @hidden Listen window resize and distribute cards on column change */
227
225
  _listenOnResize() {
228
226
  resizeObservable(this._layout.nativeElement)
229
- .pipe(debounceTime(60), takeUntil(this._onDestroy$))
227
+ .pipe(debounceTime(60), filter(() => this._skipListenResize), takeUntil(this._onDestroy$))
230
228
  .subscribe(() => this.updateLayout());
231
229
  }
232
230
  /** @hidden Listen card change and distribute cards on column change */
233
231
  _listenOnCardsChange() {
234
- this._cards.changes.pipe(delay(0)).subscribe(() => {
235
- this._processCards();
236
- this._updateColumns();
237
- });
238
- }
239
- /** @hidden Renders layout on column changes */
240
- _updateColumns() {
241
- this._setCardColumns();
242
- this._setColumnsWidth(false);
243
- this._calculateContainerHeight();
232
+ this._cards.changes.subscribe(() => this._processCards());
244
233
  }
245
234
  /** @hidden */
246
235
  _processCards() {
247
236
  this._cardsArray = this._cards
248
237
  .toArray()
249
238
  .sort((firstCard, secondCard) => firstCard.fdCardDef - secondCard.fdCardDef);
239
+ this.updateLayout();
250
240
  }
251
241
  /** @hidden Distribute cards among columns to arrange them in "Z" flow */
252
242
  _setCardColumns() {
@@ -263,14 +253,14 @@ export class FixedCardLayoutComponent {
263
253
  });
264
254
  this._cardColumns = columns;
265
255
  this._cardColumns.forEach((column) => {
266
- if (column.length > 0 && column.length < 2) {
256
+ if (column.length === 1) {
267
257
  this._singleItemColumns.add(column[0].fdCardDef);
268
258
  }
269
259
  });
270
- this._listenToCardsSizeChange();
260
+ this._listenOnCardsSizeChange();
271
261
  }
272
262
  /** @hidden */
273
- _setColumnsWidth(detectChanges = true) {
263
+ _setCardColumnsWidth() {
274
264
  this._columnsWidth = new Map();
275
265
  const configPresent = this.columnsWidthConfig &&
276
266
  typeof this.columnsWidthConfig === 'object' &&
@@ -285,16 +275,14 @@ export class FixedCardLayoutComponent {
285
275
  const columnWidth = Math.round(this.cardMinimumWidth + (freeSpace / totalWidthModifiers) * fixedWidthModifiers[index]);
286
276
  column.forEach((card) => this._columnsWidth.set(card.fdCardDef, columnWidth));
287
277
  });
288
- if (detectChanges) {
289
- this._changeDetector.detectChanges();
290
- }
291
278
  }
292
279
  /**
293
280
  * @hidden
294
281
  * Calculate container height accordingly to the the card columns height
295
282
  * Parameters used to increase the height of the column where drag'n'drop placeholder currently is
296
283
  */
297
- _calculateContainerHeight(columnIndexToAddSpace = -1, spaceToAdd = 0) {
284
+ _setContainerHeight(columnIndexToAddSpace = -1, spaceToAdd = 0) {
285
+ this._skipListenResize = true;
298
286
  this._changeDetector.detectChanges();
299
287
  const cardColumns = this._cardColumns.map((column) => column
300
288
  .map((card) => this._dragList.find((drag) => !drag._dragRef.isDragging() && drag.data === card)?.element)
@@ -306,9 +294,10 @@ export class FixedCardLayoutComponent {
306
294
  // +4px because it's the top & bottom borders of card placeholder
307
295
  this._containerHeight = Math.max(...columnsHeights) + 4;
308
296
  this._changeDetector.detectChanges();
297
+ this._skipListenResize = false;
309
298
  }
310
299
  /** @hidden */
311
- _listenToCardsSizeChange() {
300
+ _listenOnCardsSizeChange() {
312
301
  this._cardsSizeChangeSubscription.unsubscribe();
313
302
  this._cardsSizeChangeSubscription = new Subscription();
314
303
  this._changeDetector.detectChanges();
@@ -318,7 +307,7 @@ export class FixedCardLayoutComponent {
318
307
  .forEach((card) => {
319
308
  this._cardsSizeChangeSubscription.add(resizeObservable(card.nativeElement)
320
309
  .pipe(distinct((resizeEntry) => resizeEntry[0].contentRect.height))
321
- .subscribe(() => this._calculateContainerHeight()));
310
+ .subscribe(() => this._setContainerHeight()));
322
311
  }));
323
312
  }
324
313
  }
@@ -387,4 +376,4 @@ function adjustCardRank(draggedCard, replacedCard) {
387
376
  draggedCard.fdCardDef = replacedCard.fdCardDef;
388
377
  replacedCard.fdCardDef = draggedCardRank;
389
378
  }
390
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZml4ZWQtY2FyZC1sYXlvdXQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vbGlicy9jb3JlL3NyYy9saWIvZml4ZWQtY2FyZC1sYXlvdXQvZml4ZWQtY2FyZC1sYXlvdXQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vbGlicy9jb3JlL3NyYy9saWIvZml4ZWQtY2FyZC1sYXlvdXQvZml4ZWQtY2FyZC1sYXlvdXQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUVILHVCQUF1QixFQUN2QixpQkFBaUIsRUFDakIsU0FBUyxFQUNULGVBQWUsRUFDZixTQUFTLEVBQ1QsVUFBVSxFQUNWLFlBQVksRUFDWixZQUFZLEVBQ1osS0FBSyxFQUlMLFFBQVEsRUFDUixNQUFNLEVBQ04sU0FBUyxFQUVULFdBQVcsRUFDWCxTQUFTLEVBQ1QsWUFBWSxFQUNaLGlCQUFpQixFQUNwQixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDcEQsT0FBTyxFQUFFLE9BQU8sRUFBNkIsTUFBTSx3QkFBd0IsQ0FBQztBQUM1RSxPQUFPLEVBQUUsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUM3QyxPQUFPLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFMUUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLFVBQVUsRUFBRSxtQkFBbUIsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQ2hHLE9BQU8sRUFBRSw0QkFBNEIsRUFBRSxNQUFNLDJEQUEyRCxDQUFDO0FBQ3pHLE9BQU8sRUFBRSxvQkFBb0IsRUFBZSxNQUFNLHVCQUF1QixDQUFDOzs7Ozs7QUFFMUUsTUFBTSxTQUFTLEdBQUcsbUJBQW1CLEVBQUUsQ0FBQztBQUN4QyxNQUFNLGtCQUFr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QUFjLEdBQUcsU0FBUyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyx5QkFBeUI7SUFDN0csTUFBTSxvQkFBb0IsR0FBRyxzQkFBc0IsR0FBRyxTQUFTLEdBQUcsQ0FBQyxzQkFBc0IsR0FBRyxDQUFDLENBQUMsR0FBRyxjQUFjLENBQUM7SUFDaEgsTUFBTSxXQUFXLEdBQUcsb0JBQW9CLEdBQUcsY0FBYyxDQUFDLENBQUMsQ0FBQyxzQkFBc0IsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLHNCQUFzQixDQUFDO0lBRWhILE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDcEMsQ0FBQztBQUVELDREQUE0RDtBQUM1RCxTQUFTLGNBQWMsQ0FBQyxXQUFvQyxFQUFFLFlBQXFDO0lBQy9GLE1BQU0sZUFBZSxHQUFHLFdBQVcsQ0FBQyxTQUFTLENBQUM7SUFDOUMsV0FBVyxDQUFDLFNBQVMsR0FBRyxZQUFZLENBQUMsU0FBUyxDQUFDO0lBQy9DLFlBQVksQ0FBQyxTQUFTLEdBQUcsZUFBZSxDQUFDO0FBQzdDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICAgIEFmdGVyVmlld0luaXQsXG4gICAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gICAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgQ29tcG9uZW50LFxuICAgIENvbnRlbnRDaGlsZHJlbixcbiAgICBEaXJlY3RpdmUsXG4gICAgRWxlbWVudFJlZixcbiAgICBFdmVudEVtaXR0ZXIsXG4gICAgSG9zdExpc3RlbmVyLFxuICAgIElucHV0LFxuICAgIE9uQ2hhbmdlcyxcbiAgICBPbkRlc3Ryb3ksXG4gICAgT25Jbml0LFxuICAgIE9wdGlvbmFsLFxuICAgIE91dHB1dCxcbiAgICBRdWVyeUxpc3QsXG4gICAgU2ltcGxlQ2hhbmdlcyxcbiAgICBUZW1wbGF0ZVJlZixcbiAgICBWaWV3Q2hpbGQsXG4gICAgVmlld0NoaWxkcmVuLFxuICAgIFZpZXdFbmNhcHN1bGF0aW9uXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRm9jdXNLZXlNYW5hZ2VyIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2ExMXknO1xuaW1wb3J0IHsgQ2RrRHJhZywgQ2RrRHJhZ0Ryb3AsIENka0RyYWdFbnRlciB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9kcmFnLWRyb3AnO1xuaW1wb3J0IHsgU3ViamVjdCwgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBkZWJvdW5jZVRpbWUsIGRlbGF5LCBkaXN0aW5jdCwgdGFrZVVudGlsIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5pbXBvcnQgeyByZXNpemVPYnNlcnZhYmxlLCBSdGxTZXJ2aWNlLCBnZXREb2N1bWVudEZvbnRTaXplIH0gZnJvbSAnQGZ1bmRhbWVudGFsLW5neC9jb3JlL3V0aWxzJztcbmltcG9ydCB7IEZpeGVkQ2FyZExheW91dEl0ZW1Db21wb25lbnQgfSBmcm9tICcuL2ZpeGVkLWNhcmQtbGF5b3V0LWl0ZW0vZml4ZWQtY2FyZC1sYXlvdXQtaXRlbS5jb21wb25lbnQnO1xuaW1wb3J0IHsgY29lcmNlTnVtYmVyUHJvcGVydHksIE51bWJlcklucHV0IH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2NvZXJjaW9uJztcblxuY29uc3QgUkVNX0lOX1BYID0gZ2V0RG9jdW1lbnRGb250U2l6ZSgpO1xuY29uc3QgQ0FSRF9NSU5JTVVNX1dJRFRIID0gUkVNX0lOX1BYICogMjA7IC8vIDIwcmVtXG5jb25zdCBDQVJEX0dBUF9XSURUSCA9IFJFTV9JTl9QWDsgLy8gMXJlbVxuY29uc3QgRFJBR19TVEFSVF9ERUxBWSA9IDIwMDsgLy8gaW4gbXNcbmNvbnN0IE1BWF9DT0xVTU5TID0gMTA7XG5cbmxldCBjYXJkUmFuayA9IDE7XG5cbkBEaXJlY3RpdmUoeyBzZWxlY3RvcjogJ1tmZENhcmREZWZdJyB9KVxuZXhwb3J0IGNsYXNzIENhcmREZWZpbml0aW9uRGlyZWN0aXZlIHtcbiAgICAvKipcbiAgICAgKiBCZWhhdmVzIGxpa2UgcmFuayBvZiBjYXJkLlxuICAgICAqIFVzZWZ1bCBpbiBjcmVhdGluZyBsYXlvdXQgYWdhaW4gYWZ0ZXIgZHJhZyBhbmQgZHJvcC5cbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHNldCBmZENhcmREZWYodmFsdWU6IE51bWJlcklucHV0KSB7XG4gICAgICAgIGlmICghdmFsdWUpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX2ZkQ2FyZERlZiA9IGNvZXJjZU51bWJlclByb3BlcnR5KHZhbHVlKTtcbiAgICB9XG4gICAgZ2V0IGZkQ2FyZERlZigpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5fZmRDYXJkRGVmO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgcHJpdmF0ZSBfZmRDYXJkRGVmOiBudW1iZXIgPSBjYXJkUmFuaysrO1xuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgdGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT4pIHt9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTGF5b3V0IHtcbiAgICBudW1iZXJPZkNvbHVtbnM/OiBudW1iZXI7XG4gICAgc2NyZWVuU2l6ZTogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENhcmREcm9wcGVkIHtcbiAgICBwcmV2aW91c0luZGV4OiBudW1iZXI7XG4gICAgY3VycmVudEluZGV4OiBudW1iZXI7XG4gICAgbGF5b3V0Q29sdW1uczogbnVtYmVyO1xuICAgIGl0ZW1zOiBDYXJkRGVmaW5pdGlvbkRpcmVjdGl2ZVtdO1xufVxuXG50eXBlIENvbHVtbnMgPSAxIHwgMiB8IDMgfCA0IHwgNSB8IDYgfCA3IHwgOCB8IDkgfCAxMDtcblxuZXhwb3J0IHR5cGUgQ29sdW1uc1dpZHRoQ29uZmlnID0geyBbQyBpbiBDb2x1bW5zXT86IG51bWJlciB9O1xuXG50eXBlIENhcmRDb2x1bW4gPSBDYXJkRGVmaW5pdGlvbkRpcmVjdGl2ZVtdO1xuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ2ZkLWZpeGVkLWNhcmQtbGF5b3V0JyxcbiAgICB0ZW1wbGF0ZVVybDogJy4vZml4ZWQtY2FyZC1sYXlvdXQuY29tcG9uZW50Lmh0bWwnLFxuICAgIHN0eWxlVXJsczogWycuL2ZpeGVkLWNhcmQtbGF5b3V0LmNvbXBvbmVudC5zY3NzJ10sXG4gICAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gICAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcbiAgICBob3N0OiB7XG4gICAgICAgIGNsYXNzOiAnZmQtZml4ZWQtY2FyZC1sYXlvdXQnXG4gICAgfVxufSlcbmV4cG9ydCBjbGFzcyBGaXhlZENhcmRMYXlvdXRDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIEFmdGVyVmlld0luaXQsIE9uQ2hhbmdlcywgT25EZXN0cm95IHtcbiAgICAvKiogRHJhZyBkcm9wIGJlaGF2aW9yIGNhbiBiZSBkaXNhYmxlZCAqL1xuICAgIEBJbnB1dCgpXG4gICAgZGlzYWJsZURyYWdEcm9wOiBib29sZWFuO1xuXG4gICAgLyoqIERyYWcgc3RhcnQgZGVsYXkgaW4gbWlsbGlzZWNvbmRzLCBkZWZhdWx0IHRvIDIwMG1zIGZvciBzYWZlIHNjcm9sbGluZyBvbiBtb2JpbGUgd2l0aCB0b3VjaHNjcmVlbiAqL1xuICAgIEBJbnB1dCgpXG4gICAgZHJhZ1N0YXJ0RGVsYXkgPSBEUkFHX1NUQVJUX0RFTEFZO1xuXG4gICAgLyoqIENhcmQncyBtaW5pbXVtIHdpZHRoIGluIHBpeGVscy4gKi9cbiAgICBASW5wdXQoKVxuICAgIHNldCBjYXJkTWluaW11bVdpZHRoKHZhbHVlOiBOdW1iZXJJbnB1dCkge1xuICAgICAgICBjb25zdCBjb2VyY2VkVmFsdWUgPSBjb2VyY2VOdW1iZXJQcm9wZXJ0eSh2YWx1ZSk7XG5cbiAgICAgICAgaWYgKGNvZXJjZWRWYWx1ZSA8IENBUkRfTUlOSU1VTV9XSURUSCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fY2FyZE1pbmltdW1XaWR0aCA9IGNvZXJjZWRWYWx1ZTtcbiAgICB9XG4gICAgZ2V0IGNhcmRNaW5pbXVtV2lkdGgoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NhcmRNaW5pbXVtV2lkdGg7XG4gICAgfVxuXG4gICAgLyoqIENvbmZpZyB3aXRoIHRoZSB3aWR0aCByYXRpb3MgdGhhdCBzaG91bGQgdGFrZSBldmVyeSBjb2x1bW4uIEZsZXgtZ3JvdyBwcmluY2lwZS4gTWlzc2VkIHZhbHVlcyBzZXQgdG8gMC4gcyovXG4gICAgQElucHV0KClcbiAgICBjb2x1bW5zV2lkdGhDb25maWc6IENvbHVtbnNXaWR0aENvbmZpZztcblxuICAgIC8qKiBMaW1pdCB0aGUgbnVtYmVyIG9mIGNvbHVtbnMuIERlZmF1bHQgaXMgMTAuICovXG4gICAgQElucHV0KClcbiAgICBtYXhDb2x1bW5zID0gTUFYX0NPTFVNTlM7XG5cbiAgICAvKiogRXZlbnQgdG8gZW1pdCwgd2hlbiBsYXlvdXQgY2hhbmdlcyAqL1xuICAgIEBPdXRwdXQoKVxuICAgIGxheW91dENoYW5nZTogRXZlbnRFbWl0dGVyPExheW91dD4gPSBuZXcgRXZlbnRFbWl0dGVyPExheW91dD4oKTtcblxuICAgIC8qKiBFdmVudCB0byBlbWl0IG9uIENhcmQgZHJhZ2dlZCBhbmQgZHJvcHBlZCAqL1xuICAgIEBPdXRwdXQoKVxuICAgIGNhcmREcmFnZ2VkRHJvcHBlZDogRXZlbnRFbWl0dGVyPENhcmREcm9wcGVkPiA9IG5ldyBFdmVudEVtaXR0ZXI8Q2FyZERyb3BwZWQ+KCk7XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIEBDb250ZW50Q2hpbGRyZW4oQ2FyZERlZmluaXRpb25EaXJlY3RpdmUpXG4gICAgX2NhcmRzOiBRdWVyeUxpc3Q8Q2FyZERlZmluaXRpb25EaXJlY3RpdmU+O1xuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBAVmlld0NoaWxkcmVuKEZpeGVkQ2FyZExheW91dEl0ZW1Db21wb25lbnQpXG4gICAgX2NhcmRDb250YWluZXJzOiBRdWVyeUxpc3Q8Rml4ZWRDYXJkTGF5b3V0SXRlbUNvbXBvbmVudD47XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIEBWaWV3Q2hpbGRyZW4oQ2RrRHJhZylcbiAgICBfZHJhZ0xpc3Q6IFF1ZXJ5TGlzdDxDZGtEcmFnPjtcblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgQFZpZXdDaGlsZCgnbGF5b3V0JylcbiAgICBfbGF5b3V0OiBFbGVtZW50UmVmO1xuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBfY2FyZHNBcnJheTogQ2FyZERlZmluaXRpb25EaXJlY3RpdmVbXTtcblxuICAgIC8qKiBAaGlkZGVuIE51bWJlciBvZiBDb2x1bW5zIGluIGxheW91dCAqL1xuICAgIF9udW1iZXJPZkNvbHVtbnM6IG51bWJlcjtcblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgX2NhcmRDb2x1bW5zOiBDYXJkQ29sdW1uW107XG5cbiAgICAvKiogQGhpZGRlbiovXG4gICAgX2NvbnRhaW5lckhlaWdodDogbnVtYmVyO1xuXG4gICAgLyoqIEBoaWRkZW4gaGFuZGxlcyBydGwgc2VydmljZSAqL1xuICAgIF9kaXIgPSAnbHRyJztcblxuICAgIC8qKiBAaGlkZGVuIGZpcnN0IG51bWJlciBpcyB0aGUgQ2FyZERlZmluaXRpb24gcmFuaywgaS5lLiBpZCAqL1xuICAgIF9ncm91cEluZGV4ZXMgPSBuZXcgTWFwPG51bWJlciwgbnVtYmVyPigpO1xuXG4gICAgLyoqIEBoaWRkZW4gZmlyc3QgbnVtYmVyIGlzIHRoZSBDYXJkRGVmaW5pdGlvbiByYW5rLCBpLmUuIGlkICovXG4gICAgX2l0ZW1JbmRleGVzID0gbmV3IE1hcDxudW1iZXIsIG51bWJlcj4oKTtcblxuICAgIC8qKiBAaGlkZGVuIGZpcnN0IG51bWJlciBpcyB0aGUgQ2FyZERlZmluaXRpb24gcmFuaywgaS5lLiBpZCAqL1xuICAgIF9zaW5nbGVJdGVtQ29sdW1ucyA9IG5ldyBTZXQ8bnVtYmVyPigpO1xuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBfY29sdW1uc1dpZHRoID0gbmV3IE1hcDxudW1iZXIsIG51bWJlcj4oKTtcblxuICAgIC8qKiBAaGlkZGVuIFJldHVybiBhdmFpbGFibGUgd2lkdGggZm9yIGZpeGVkIGNhcmQgbGF5b3V0ICovXG4gICAgZ2V0IF9hdmFpbGFibGVXaWR0aCgpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5fbGF5b3V0Lm5hdGl2ZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGg7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBfcGxhY2Vob2xkZXJNYXJnaW46IGJvb2xlYW47XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHByaXZhdGUgX3ByZXZpb3VzTnVtYmVyT2ZDb2x1bW5zOiBudW1iZXI7XG5cbiAgICAvKiogQGhpZGRlbiBGb2N1c0tleU1hbmFnZXIgaW5zdGFuY2UgKi9cbiAgICBwcml2YXRlIF9rZXlib2FyZEV2ZW50c01hbmFnZXI6IEZvY3VzS2V5TWFuYWdlcjxGaXhlZENhcmRMYXlvdXRJdGVtQ29tcG9uZW50PjtcblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgcHJpdmF0ZSBfY2FyZE1pbmltdW1XaWR0aCA9IENBUkRfTUlOSU1VTV9XSURUSDtcblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgcHJpdmF0ZSBfY2FyZHNTaXplQ2hhbmdlU3Vic2NyaXB0aW9uID0gbmV3IFN1YnNjcmlwdGlvbigpO1xuXG4gICAgLyoqIEBoaWRkZW4gQW4gUnhKUyBTdWJqZWN0IHRoYXQgd2lsbCBraWxsIHRoZSBkYXRhIHN0cmVhbSB1cG9uIGNvbXBvbmVudOKAmXMgZGVzdHJ1Y3Rpb24gKGZvciB1bnN1YnNjcmliaW5nKSAgKi9cbiAgICBwcml2YXRlIHJlYWRvbmx5IF9vbkRlc3Ryb3kkOiBTdWJqZWN0PHZvaWQ+ID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgX2NoYW5nZURldGVjdG9yOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICAgICAgQE9wdGlvbmFsKCkgcHJpdmF0ZSByZWFkb25seSBfcnRsU2VydmljZTogUnRsU2VydmljZVxuICAgICkge31cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX3N1YnNjcmliZVRvUnRsKCk7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX3Byb2Nlc3NDYXJkcygpO1xuICAgICAgICB0aGlzLnVwZGF0ZUxheW91dCgpO1xuXG4gICAgICAgIHRoaXMuX2xpc3Rlbk9uUmVzaXplKCk7XG4gICAgICAgIHRoaXMuX2xpc3Rlbk9uQ2FyZHNDaGFuZ2UoKTtcbiAgICAgICAgdGhpcy5fYWNjZXNzaWJpbGl0eVNldHVwKCk7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgICAgIC8vIFNraXAgYWxsIGNoYW5nZXMgdW5sZXNzIHdlIGRvbid0IGhhdmUgaW5pdGlhbCBsYXlvdXQgY3JlYXRlZFxuICAgICAgICBpZiAoIXRoaXMuX2NhcmRzQXJyYXkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICgnbWF4Q29sdW1ucycgaW4gY2hhbmdlcyB8fCAnY2FyZE1pbmltdW1XaWR0aCcgaW4gY2hhbmdlcykge1xuICAgICAgICAgICAgdGhpcy51cGRhdGVMYXlvdXQoKTtcbiAgICAgICAgfSBlbHNlIGlmICgnY29sdW1uc1dpZHRoQ29uZmlnJyBpbiBjaGFuZ2VzKSB7XG4gICAgICAgICAgICB0aGlzLl9zZXRDb2x1bW5zV2lkdGgoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX2NhcmRzU2l6ZUNoYW5nZVN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuXG4gICAgICAgIHRoaXMuX29uRGVzdHJveSQubmV4dCgpO1xuICAgICAgICB0aGlzLl9vbkRlc3Ryb3kkLmNvbXBsZXRlKCk7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBASG9zdExpc3RlbmVyKCdrZXlkb3duJywgWyckZXZlbnQnXSlcbiAgICBoYW5kbGVLZXlkb3duKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgICAgIGV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xuXG4gICAgICAgIGlmICh0aGlzLl9rZXlib2FyZEV2ZW50c01hbmFnZXIpIHtcbiAgICAgICAgICAgIHRoaXMuX2tleWJvYXJkRXZlbnRzTWFuYWdlci5vbktleWRvd24oZXZlbnQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqIERpc3RyaWJ1dGUgY2FyZHMgb24gd2luZG93IHJlc2l6ZSAqL1xuICAgIHVwZGF0ZUxheW91dCgpOiB2b2lkIHtcbiAgICAgICAgaWYgKCF0aGlzLl9jYXJkcy5sZW5ndGggfHwgIXRoaXMuX2F2YWlsYWJsZVdpZHRoKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBwb3NzaWJsZU51bWJlck9mQ29sdW1ucyA9IGdldE51bWJlck9mQ29sdW1ucyh0aGlzLl9hdmFpbGFibGVXaWR0aCwgdGhpcy5jYXJkTWluaW11bVdpZHRoKTtcblxuICAgICAgICB0aGlzLl9udW1iZXJPZkNvbHVtbnMgPSBNYXRoLm1pbihcbiAgICAgICAgICAgIHBvc3NpYmxlTnVtYmVyT2ZDb2x1bW5zLFxuICAgICAgICAgICAgdGhpcy5fY2FyZHMubGVuZ3RoLFxuICAgICAgICAgICAgdGhpcy5tYXhDb2x1bW5zIHx8IE1BWF9DT0xVTU5TLFxuICAgICAgICAgICAgTUFYX0NPTFVNTlNcbiAgICAgICAgKTtcblxuICAgICAgICB0aGlzLmxheW91dENoYW5nZS5lbWl0KHtcbiAgICAgICAgICAgIG51bWJlck9mQ29sdW1uczogdGhpcy5fbnVtYmVyT2ZDb2x1bW5zLFxuICAgICAgICAgICAgc2NyZWVuU2l6ZTogdGhpcy5fYXZhaWxhYmxlV2lkdGhcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKHRoaXMuX3ByZXZpb3VzTnVtYmVyT2ZDb2x1bW5zICE9PSB0aGlzLl9udW1iZXJPZkNvbHVtbnMpIHtcbiAgICAgICAgICAgIHRoaXMuX3ByZXZpb3VzTnVtYmVyT2ZDb2x1bW5zID0gdGhpcy5fbnVtYmVyT2ZDb2x1bW5zO1xuICAgICAgICAgICAgdGhpcy5fdXBkYXRlQ29sdW1ucygpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fc2V0Q29sdW1uc1dpZHRoKCk7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBfb25Ecm9wTGlzdEVudGVyZWQoZXZlbnQ6IENka0RyYWdFbnRlcik6IHZvaWQge1xuICAgICAgICBjb25zdCBjb250YWluZXJJdGVtQ2FyZERlZiA9IChldmVudC5jb250YWluZXIuZ2V0U29ydGVkSXRlbXMoKVswXS5kYXRhIGFzIENhcmREZWZpbml0aW9uRGlyZWN0aXZlKS5mZENhcmREZWY7XG4gICAgICAgIGNvbnN0IGRyYWdJdGVtQ2FyZERlZiA9IChldmVudC5pdGVtLmRhdGEgYXMgQ2FyZERlZmluaXRpb25EaXJlY3RpdmUpLmZkQ2FyZERlZjtcblxuICAgICAgICB0aGlzLl9wbGFjZWhvbGRlck1hcmdpbiA9IGNvbnRhaW5lckl0ZW1DYXJkRGVmICE9PSBkcmFnSXRlbUNhcmREZWY7XG5cbiAgICAgICAgY29uc3QgY29sdW1uSW5kZXhUb0FkZFNwYWNlID0gdGhpcy5fY2FyZENvbHVtbnMuZmluZEluZGV4KChjb2x1bW4pID0+XG4gICAgICAgICAgICBjb2x1bW4uZmluZCgoY2FyZCkgPT4gZXZlbnQuY29udGFpbmVyLmdldFNvcnRlZEl0ZW1zKClbMF0uZGF0YSA9PT0gY2FyZClcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3Qgc3BhY2VUb0FkZCA9XG4gICAgICAgICAgICBldmVudC5pdGVtLmVsZW1lbnQubmF0aXZlRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5oZWlnaHQgK1xuICAgICAgICAgICAgKGV2ZW50LmNvbnRhaW5lci5nZXRTb3J0ZWRJdGVtcygpLmxlbmd0aCA/IFJFTV9JTl9QWCA6IDApO1xuXG4gICAgICAgIC8vIFdoZW4gd2UgbW92ZSB0aGUgY2FyZCBpbnRvIGEgY2VydGFpbiBjb2x1bW4gd2Ugc2hvdWxkIGluY3JlYXNlIHRoZSBoZWlnaHQgb2YgdGhhdCBjb2x1bW4gYnkgdGhlIGNhcmQgaGVpZ2h0XG4gICAgICAgIHRoaXMuX2NhbGN1bGF0ZUNvbnRhaW5lckhlaWdodChjb2x1bW5JbmRleFRvQWRkU3BhY2UsIHNwYWNlVG9BZGQpO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgX29uRHJhZ0Ryb3BwZWQoZXZlbnQ6IENka0RyYWdEcm9wPG51bWJlciwgbnVtYmVyPik6IHZvaWQge1xuICAgICAgICBpZiAoZXZlbnQuY29udGFpbmVyLmRhdGEgPT09IGV2ZW50LnByZXZpb3VzQ29udGFpbmVyLmRhdGEpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX3BsYWNlaG9sZGVyTWFyZ2luID0gZmFsc2U7XG5cbiAgICAgICAgY29uc3QgbW92ZWRDYXJkID0gZXZlbnQucHJldmlvdXNDb250YWluZXIuZ2V0U29ydGVkSXRlbXMoKVswXS5kYXRhO1xuICAgICAgICBjb25zdCByZXBsYWNlZENhcmQgPSBldmVudC5jb250YWluZXIuZ2V0U29ydGVkSXRlbXMoKVswXS5kYXRhO1xuXG4gICAgICAgIGNvbnN0IG1vdmVkQ2FyZENvbHVtbiA9IHRoaXMuX2NhcmRDb2x1bW5zLmZpbmQoKGNvbHVtbikgPT5cbiAgICAgICAgICAgIGNvbHVtbi5maW5kKChjYXJkKSA9PiBjYXJkLmZkQ2FyZERlZiA9PT0gbW92ZWRDYXJkLmZkQ2FyZERlZilcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3QgcmVwbGFjZWRDYXJkQ29sdW1uID0gdGhpcy5fY2FyZENvbHVtbnMuZmluZCgoY29sdW1uKSA9PlxuICAgICAgICAgICAgY29sdW1uLmZpbmQoKGNhcmQpID0+IGNhcmQuZmRDYXJkRGVmID09PSByZXBsYWNlZENhcmQuZmRDYXJkRGVmKVxuICAgICAgICApO1xuXG4gICAgICAgIC8vIElmIHdlIGRyYWdnZWQgdGhlIGNhcmQgZnJvbSB0aGUgc2FtZSBjb2x1bW4gYXMgdGhlIGNvbHVtbiB3ZSdyZSBkcm9wcGluZyBpbnRvXG4gICAgICAgIC8vIFRoZXJlIG1heSBiZSBhIHNpdHVhdGlvbiB3aGVyZSB0aGUgb3JkZXIgc2hvdWxkbid0IGNoYW5nZSBidXQgc2luY2UgdGhlcmUgYXJlIGEgZGlmZmVyZW50IGRyb3AgbGlzdHMgaXQgd2lsbCBjaGFuZ2VcbiAgICAgICAgLy8gV2Ugc2hvdWxkIHByZXZlbnQgdGhpc1xuICAgICAgICBpZiAobW92ZWRDYXJkQ29sdW1uID09PSByZXBsYWNlZENhcmRDb2x1bW4gJiYgbW92ZWRDYXJkQ29sdW1uPy5sZW5ndGggPT09IDIpIHtcbiAgICAgICAgICAgIGlmIChtb3ZlZENhcmQuZmRDYXJkRGVmIDwgcmVwbGFjZWRDYXJkLmZkQ2FyZERlZiAmJiBldmVudC5wcmV2aW91c0NvbnRhaW5lci5kYXRhIDwgZXZlbnQuY29udGFpbmVyLmRhdGEpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChtb3ZlZENhcmQuZmRDYXJkRGVmID4gcmVwbGFjZWRDYXJkLmZkQ2FyZERlZiAmJiBldmVudC5wcmV2aW91c0NvbnRhaW5lci5kYXRhID4gZXZlbnQuY29udGFpbmVyLmRhdGEpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9wcm9jZXNzRHJhZ0Ryb3AoZXZlbnQucHJldmlvdXNDb250YWluZXIuZGF0YSwgZXZlbnQuY29udGFpbmVyLmRhdGEsIG1vdmVkQ2FyZCwgcmVwbGFjZWRDYXJkKTtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiBGb3IgdGhlIGtleWJvYXJkIGRyYWcmZHJvcCBkaXJlY3RpdmUgKi9cbiAgICBfY3VzdG9tTW92ZUZuID0gKGdyb3VwOiBDYXJkQ29sdW1uLCBpbmRleEZyb206IG51bWJlciwgaW5kZXhUbzogbnVtYmVyKTogdm9pZCA9PiB7XG4gICAgICAgIGNvbnN0IG1vdmVkQ2FyZCA9IGdyb3VwW2luZGV4RnJvbV07XG4gICAgICAgIGNvbnN0IHJlcGxhY2VkQ2FyZCA9IGdyb3VwW2luZGV4VG9dO1xuXG4gICAgICAgIGNvbnN0IGluZGV4RnJvbUFycmF5ID0gdGhpcy5fY2FyZHNBcnJheS5maW5kSW5kZXgoKGNhcmQpID0+IGNhcmQuZmRDYXJkRGVmID09PSBtb3ZlZENhcmQuZmRDYXJkRGVmKTtcbiAgICAgICAgY29uc3QgaW5kZXhUb0FycmF5ID0gdGhpcy5fY2FyZHNBcnJheS5maW5kSW5kZXgoKGNhcmQpID0+IGNhcmQuZmRDYXJkRGVmID09PSByZXBsYWNlZENhcmQuZmRDYXJkRGVmKTtcblxuICAgICAgICB0aGlzLl9wcm9jZXNzRHJhZ0Ryb3AoaW5kZXhGcm9tQXJyYXksIGluZGV4VG9BcnJheSwgbW92ZWRDYXJkLCByZXBsYWNlZENhcmQpO1xuICAgIH07XG5cbiAgICAvKiogQGhpZGRlbiBGb3IgdGhlIGtleWJvYXJkIGRyYWcmZHJvcCBkaXJlY3RpdmUgKi9cbiAgICBfY3VzdG9tVHJhbnNmZXJGbiA9IChwcmV2R3JvdXA6IENhcmRDb2x1bW4sIG5leHRHcm91cDogQ2FyZENvbHVtbiwgaW5kZXhGcm9tOiBudW1iZXIsIGluZGV4VG86IG51bWJlcik6IHZvaWQgPT4ge1xuICAgICAgICBjb25zdCBtb3ZlZENhcmQgPSBwcmV2R3JvdXBbaW5kZXhGcm9tXTtcbiAgICAgICAgY29uc3QgcmVwbGFjZWRDYXJkID0gbmV4dEdyb3VwW2luZGV4VG9dO1xuXG4gICAgICAgIGNvbnN0IGluZGV4RnJvbUFycmF5ID0gdGhpcy5fY2FyZHNBcnJheS5maW5kSW5kZXgoKGNhcmQpID0+IGNhcmQuZmRDYXJkRGVmID09PSBtb3ZlZENhcmQuZmRDYXJkRGVmKTtcbiAgICAgICAgY29uc3QgaW5kZXhUb0FycmF5ID0gdGhpcy5fY2FyZHNBcnJheS5maW5kSW5kZXgoKGNhcmQpID0+IGNhcmQuZmRDYXJkRGVmID09PSByZXBsYWNlZENhcmQuZmRDYXJkRGVmKTtcblxuICAgICAgICB0aGlzLl9wcm9jZXNzRHJhZ0Ryb3AoaW5kZXhGcm9tQXJyYXksIGluZGV4VG9BcnJheSwgbW92ZWRDYXJkLCByZXBsYWNlZENhcmQpO1xuICAgIH07XG5cbiAgICAvKiogQGhpZGRlbiBBcnJhbmdlcyBjYXJkcyBvbiBkcm9wIG9mIGRyYWdnZWQgY2FyZCAqL1xuICAgIHByaXZhdGUgX3Byb2Nlc3NEcmFnRHJvcChcbiAgICAgICAgcHJldkluZGV4OiBudW1iZXIsXG4gICAgICAgIG5ld0luZGV4OiBudW1iZXIsXG4gICAgICAgIHByZXZDYXJkOiBDYXJkRGVmaW5pdGlvbkRpcmVjdGl2ZSxcbiAgICAgICAgbmV3Q2FyZDogQ2FyZERlZmluaXRpb25EaXJlY3RpdmVcbiAgICApOiB2b2lkIHtcbiAgICAgICAgLy8gbW92ZUl0ZW1JbkFycmF5IGZyb20gQ0RLIHdvbid0IHdvcmsgYXMgaXQgY2hhbmdlcyBvcmRlciBvZiBvdGhlciBjYXJkc1xuICAgICAgICBjb25zdCByZXBsYWNlZENhcmQgPSB0aGlzLl9jYXJkc0FycmF5W25ld0luZGV4XTtcbiAgICAgICAgdGhpcy5fY2FyZHNBcnJheVtuZXdJbmRleF0gPSB0aGlzLl9jYXJkc0FycmF5W3ByZXZJbmRleF07XG4gICAgICAgIHRoaXMuX2NhcmRzQXJyYXlbcHJldkluZGV4XSA9IHJlcGxhY2VkQ2FyZDtcblxuICAgICAgICBhZGp1c3RDYXJkUmFuayhwcmV2Q2FyZCwgbmV3Q2FyZCk7XG5cbiAgICAgICAgdGhpcy5jYXJkRHJhZ2dlZERyb3BwZWQuZW1pdCh7XG4gICAgICAgICAgICBwcmV2aW91c0luZGV4OiBwcmV2SW5kZXgsXG4gICAgICAgICAgICBjdXJyZW50SW5kZXg6IG5ld0luZGV4LFxuICAgICAgICAgICAgbGF5b3V0Q29sdW1uczogdGhpcy5fbnVtYmVyT2ZDb2x1bW5zLFxuICAgICAgICAgICAgaXRlbXM6IHRoaXMuX2NhcmRzLnRvQXJyYXkoKVxuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLl91cGRhdGVDb2x1bW5zKCk7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBwcml2YXRlIF9hY2Nlc3NpYmlsaXR5U2V0dXAoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX2tleWJvYXJkRXZlbnRzTWFuYWdlciA9IG5ldyBGb2N1c0tleU1hbmFnZXIodGhpcy5fY2FyZENvbnRhaW5lcnMpLndpdGhXcmFwKCk7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gUnRsIGNoYW5nZSBzdWJzY3JpcHRpb24gKi9cbiAgICBwcml2YXRlIF9zdWJzY3JpYmVUb1J0bCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fcnRsU2VydmljZT8ucnRsLnBpcGUodGFrZVVudGlsKHRoaXMuX29uRGVzdHJveSQpKS5zdWJzY3JpYmUoKGlzUnRsKSA9PiB7XG4gICAgICAgICAgICB0aGlzLl9kaXIgPSBpc1J0bCA/ICdydGwnIDogJ2x0cic7XG4gICAgICAgICAgICB0aGlzLl9jaGFuZ2VEZXRlY3Rvci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuIExpc3RlbiB3aW5kb3cgcmVzaXplIGFuZCBkaXN0cmlidXRlIGNhcmRzIG9uIGNvbHVtbiBjaGFuZ2UgKi9cbiAgICBwcml2YXRlIF9saXN0ZW5PblJlc2l6ZSgpOiB2b2lkIHtcbiAgICAgICAgcmVzaXplT2JzZXJ2YWJsZSh0aGlzLl9sYXlvdXQubmF0aXZlRWxlbWVudClcbiAgICAgICAgICAgIC5waXBlKGRlYm91bmNlVGltZSg2MCksIHRha2VVbnRpbCh0aGlzLl9vbkRlc3Ryb3kkKSlcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKCkgPT4gdGhpcy51cGRhdGVMYXlvdXQoKSk7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gTGlzdGVuIGNhcmQgY2hhbmdlIGFuZCBkaXN0cmlidXRlIGNhcmRzIG9uIGNvbHVtbiBjaGFuZ2UgKi9cbiAgICBwcml2YXRlIF9saXN0ZW5PbkNhcmRzQ2hhbmdlKCk6IHZvaWQge1xuICAgICAgICB0aGlzLl9jYXJkcy5jaGFuZ2VzLnBpcGUoZGVsYXkoMCkpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLl9wcm9jZXNzQ2FyZHMoKTtcbiAgICAgICAgICAgIHRoaXMuX3VwZGF0ZUNvbHVtbnMoKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gUmVuZGVycyBsYXlvdXQgb24gY29sdW1uIGNoYW5nZXMgKi9cbiAgICBwcml2YXRlIF91cGRhdGVDb2x1bW5zKCk6IHZvaWQge1xuICAgICAgICB0aGlzLl9zZXRDYXJkQ29sdW1ucygpO1xuICAgICAgICB0aGlzLl9zZXRDb2x1bW5zV2lkdGgoZmFsc2UpO1xuICAgICAgICB0aGlzLl9jYWxjdWxhdGVDb250YWluZXJIZWlnaHQoKTtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHByaXZhdGUgX3Byb2Nlc3NDYXJkcygpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fY2FyZHNBcnJheSA9IHRoaXMuX2NhcmRzXG4gICAgICAgICAgICAudG9BcnJheSgpXG4gICAgICAgICAgICAuc29ydCgoZmlyc3RDYXJkLCBzZWNvbmRDYXJkKSA9PiBmaXJzdENhcmQuZmRDYXJkRGVmIC0gc2Vjb25kQ2FyZC5mZENhcmREZWYpO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuIERpc3RyaWJ1dGUgY2FyZHMgYW1vbmcgY29sdW1ucyB0byBhcnJhbmdlIHRoZW0gaW4gXCJaXCIgZmxvdyAqL1xuICAgIHByaXZhdGUgX3NldENhcmRDb2x1bW5zKCk6IHZvaWQge1xuICAgICAgICB0aGlzLl9ncm91cEluZGV4ZXMgPSBuZXcgTWFwPG51bWJlciwgbnVtYmVyPigpO1xuICAgICAgICB0aGlzLl9pdGVtSW5kZXhlcyA9IG5ldyBNYXA8bnVtYmVyLCBudW1iZXI+KCk7XG4gICAgICAgIHRoaXMuX3NpbmdsZUl0ZW1Db2x1bW5zID0gbmV3IFNldDxudW1iZXI+KCk7XG5cbiAgICAgICAgY29uc3QgY29sdW1uczogQ2FyZENvbHVtbltdID0gbmV3IEFycmF5KHRoaXMuX251bWJlck9mQ29sdW1ucykuZmlsbCgwKS5tYXAoKCkgPT4gbmV3IEFycmF5KDApKTtcblxuICAgICAgICB0aGlzLl9jYXJkc0FycmF5LmZvckVhY2goKGNhcmQsIGkpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGN1cnJDb2x1bW5JbmRleCA9IGkgJSB0aGlzLl9udW1iZXJPZkNvbHVtbnM7XG4gICAgICAgICAgICBjb25zdCBpdGVtSW5kZXggPSBjb2x1bW5zW2N1cnJDb2x1bW5JbmRleF0ubGVuZ3RoO1xuXG4gICAgICAgICAgICBjb2x1bW5zW2N1cnJDb2x1bW5JbmRleF0ucHVzaChjYXJkKTtcblxuICAgICAgICAgICAgdGhpcy5fZ3JvdXBJbmRleGVzLnNldChjYXJkLmZkQ2FyZERlZiwgY3VyckNvbHVtbkluZGV4KTtcbiAgICAgICAgICAgIHRoaXMuX2l0ZW1JbmRleGVzLnNldChjYXJkLmZkQ2FyZERlZiwgaXRlbUluZGV4KTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5fY2FyZENvbHVtbnMgPSBjb2x1bW5zO1xuXG4gICAgICAgIHRoaXMuX2NhcmRDb2x1bW5zLmZvckVhY2goKGNvbHVtbikgPT4ge1xuICAgICAgICAgICAgaWYgKGNvbHVtbi5sZW5ndGggPiAwICYmIGNvbHVtbi5sZW5ndGggPCAyKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fc2luZ2xlSXRlbUNvbHVtbnMuYWRkKGNvbHVtblswXS5mZENhcmREZWYpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLl9saXN0ZW5Ub0NhcmRzU2l6ZUNoYW5nZSgpO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgcHJpdmF0ZSBfc2V0Q29sdW1uc1dpZHRoKGRldGVjdENoYW5nZXMgPSB0cnVlKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX2NvbHVtbnNXaWR0aCA9IG5ldyBNYXAoKTtcblxuICAgICAgICBjb25zdCBjb25maWdQcmVzZW50ID1cbiAgICAgICAgICAgIHRoaXMuY29sdW1uc1dpZHRoQ29uZmlnICYmXG4gICAgICAgICAgICB0eXBlb2YgdGhpcy5jb2x1bW5zV2lkdGhDb25maWcgPT09ICdvYmplY3QnICYmXG4gICAgICAgICAgICBPYmplY3Qua2V5cyh0aGlzLmNvbHVtbnNXaWR0aENvbmZpZykubGVuZ3RoO1xuXG4gICAgICAgIGlmICghY29uZmlnUHJlc2VudCB8fCB0aGlzLl9udW1iZXJPZkNvbHVtbnMgPT09IDEpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGZpeGVkV2lkdGhNb2RpZmllcnMgPSBmaXhXaWR0aE1vZGlmaWVycyh0aGlzLmNvbHVtbnNXaWR0aENvbmZpZywgdGhpcy5fbnVtYmVyT2ZDb2x1bW5zKTtcbiAgICAgICAgY29uc3QgdG90YWxXaWR0aE1vZGlmaWVycyA9IGZpeGVkV2lkdGhNb2RpZmllcnMucmVkdWNlKChzdW0sIHdpZHRoKSA9PiAoc3VtICs9IHdpZHRoKSwgMCk7XG4gICAgICAgIGNvbnN0IGZyZWVTcGFjZSA9IHRoaXMuX2F2YWlsYWJsZVdpZHRoIC0gdGhpcy5jYXJkTWluaW11bVdpZHRoICogdGhpcy5fbnVtYmVyT2ZDb2x1bW5zO1xuXG4gICAgICAgIHRoaXMuX2NhcmRDb2x1bW5zLmZvckVhY2goKGNvbHVtbiwgaW5kZXgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGNvbHVtbldpZHRoID0gTWF0aC5yb3VuZChcbiAgICAgICAgICAgICAgICB0aGlzLmNhcmRNaW5pbXVtV2lkdGggKyAoZnJlZVNwYWNlIC8gdG90YWxXaWR0aE1vZGlmaWVycykgKiBmaXhlZFdpZHRoTW9kaWZpZXJzW2luZGV4XVxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgY29sdW1uLmZvckVhY2goKGNhcmQpID0+IHRoaXMuX2NvbHVtbnNXaWR0aC5zZXQoY2FyZC5mZENhcmREZWYsIGNvbHVtbldpZHRoKSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmIChkZXRlY3RDaGFuZ2VzKSB7XG4gICAgICAgICAgICB0aGlzLl9jaGFuZ2VEZXRlY3Rvci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogQ2FsY3VsYXRlIGNvbnRhaW5lciBoZWlnaHQgYWNjb3JkaW5nbHkgdG8gdGhlIHRoZSBjYXJkIGNvbHVtbnMgaGVpZ2h0XG4gICAgICogUGFyYW1ldGVycyB1c2VkIHRvIGluY3JlYXNlIHRoZSBoZWlnaHQgb2YgdGhlIGNvbHVtbiB3aGVyZSBkcmFnJ24nZHJvcCBwbGFjZWhvbGRlciBjdXJyZW50bHkgaXNcbiAgICAgKi9cbiAgICBwcml2YXRlIF9jYWxjdWxhdGVDb250YWluZXJIZWlnaHQoY29sdW1uSW5kZXhUb0FkZFNwYWNlID0gLTEsIHNwYWNlVG9BZGQgPSAwKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX2NoYW5nZURldGVjdG9yLmRldGVjdENoYW5nZXMoKTtcblxuICAgICAgICBjb25zdCBjYXJkQ29sdW1ucyA9IHRoaXMuX2NhcmRDb2x1bW5zLm1hcCgoY29sdW1uKSA9PlxuICAgICAgICAgICAgY29sdW1uXG4gICAgICAgICAgICAgICAgLm1hcChcbiAgICAgICAgICAgICAgICAgICAgKGNhcmQpID0+IHRoaXMuX2RyYWdMaXN0LmZpbmQoKGRyYWcpID0+ICFkcmFnLl9kcmFnUmVmLmlzRHJhZ2dpbmcoKSAmJiBkcmFnLmRhdGEgPT09IGNhcmQpPy5lbGVtZW50XG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIC5maWx0ZXIoKGNhcmQpOiBjYXJkIGlzIEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+ID0+ICEhY2FyZClcbiAgICAgICAgKTtcblxuICAgICAgICBjb25zdCBjb2x1bW5zSGVpZ2h0cyA9IGNhcmRDb2x1bW5zXG4gICAgICAgICAgICAubWFwKChjb2x1bW4pID0+IGNvbHVtbi5tYXAoKGNhcmQpID0+IGNhcmQubmF0aXZlRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5oZWlnaHQpKVxuICAgICAgICAgICAgLm1hcChcbiAgICAgICAgICAgICAgICAoY29sdW1uLCBjb2x1bW5JbmRleCkgPT5cbiAgICAgICAgICAgICAgICAgICAgY29sdW1uLnJlZHVjZSgoY2FyZHNIZWlnaHQsIGhlaWdodCkgPT4gKGNhcmRzSGVpZ2h0ICs9IGhlaWdodCArIFJFTV9JTl9QWCksIDApICtcbiAgICAgICAgICAgICAgICAgICAgKGNvbHVtbkluZGV4ID09PSBjb2x1bW5JbmRleFRvQWRkU3BhY2UgPyBzcGFjZVRvQWRkIDogMClcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgLy8gKzRweCBiZWNhdXNlIGl0J3MgdGhlIHRvcCAmIGJvdHRvbSBib3JkZXJzIG9mIGNhcmQgcGxhY2Vob2xkZXJcbiAgICAgICAgdGhpcy5fY29udGFpbmVySGVpZ2h0ID0gTWF0aC5tYXgoLi4uY29sdW1uc0hlaWdodHMpICsgNDtcblxuICAgICAgICB0aGlzLl9jaGFuZ2VEZXRlY3Rvci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBwcml2YXRlIF9saXN0ZW5Ub0NhcmRzU2l6ZUNoYW5nZSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fY2FyZHNTaXplQ2hhbmdlU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgIHRoaXMuX2NhcmRzU2l6ZUNoYW5nZVN1YnNjcmlwdGlvbiA9IG5ldyBTdWJzY3JpcHRpb24oKTtcblxuICAgICAgICB0aGlzLl9jaGFuZ2VEZXRlY3Rvci5kZXRlY3RDaGFuZ2VzKCk7XG5cbiAgICAgICAgdGhpcy5fY2FyZENvbHVtbnMuZm9yRWFjaCgoY29sdW1uKSA9PlxuICAgICAgICAgICAgY29sdW1uXG4gICAgICAgICAgICAgICAgLm1hcCgoY2FyZCkgPT4gdGhpcy5fZHJhZ0xpc3QuZmluZCgod3JhcHBlcikgPT4gd3JhcHBlci5kYXRhID09PSBjYXJkKT8uZWxlbWVudClcbiAgICAgICAgICAgICAgICAuZmlsdGVyKCh2KTogdiBpcyBFbGVtZW50UmVmPEhUTUxFbGVtZW50PiA9PiAhIXYpXG4gICAgICAgICAgICAgICAgLmZvckVhY2goKGNhcmQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fY2FyZHNTaXplQ2hhbmdlU3Vic2NyaXB0aW9uLmFkZChcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc2l6ZU9ic2VydmFibGUoY2FyZC5uYXRpdmVFbGVtZW50KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5waXBlKGRpc3RpbmN0KChyZXNpemVFbnRyeSkgPT4gcmVzaXplRW50cnlbMF0uY29udGVudFJlY3QuaGVpZ2h0KSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHRoaXMuX2NhbGN1bGF0ZUNvbnRhaW5lckhlaWdodCgpKVxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICk7XG4gICAgfVxufVxuXG4vKiogQGhpZGRlbiAqL1xuZnVuY3Rpb24gZml4V2lkdGhNb2RpZmllcnMoY29uZmlnOiBDb2x1bW5zV2lkdGhDb25maWcsIG51bWJlck9mQ29sdW1uczogbnVtYmVyKTogbnVtYmVyW10ge1xuICAgIGNvbnN0IG1vZGlmaWVycyA9IG5ldyBBcnJheShudW1iZXJPZkNvbHVtbnMpLmZpbGwoMCk7XG5cbiAgICByZXR1cm4gbW9kaWZpZXJzLm1hcCgoXywgaW5kZXgpID0+IHtcbiAgICAgICAgY29uc3QgY29sdW1uV2lkdGhNb2RpZmllciA9IGNvbmZpZ1tpbmRleCArIDFdO1xuXG4gICAgICAgIGlmICghY29sdW1uV2lkdGhNb2RpZmllciB8fCBjb2x1bW5XaWR0aE1vZGlmaWVyIDwgMCkge1xuICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gY29sdW1uV2lkdGhNb2RpZmllcjtcbiAgICB9KTtcbn1cblxuLyoqIEBoaWRkZW4gUmV0dXJucyBudW1iZXIgb2YgY29sdW1ucyB0aGF0IGNhbiBmaXQgaW4gY3VycmVudCBhdmFpbGFibGUgd2lkdGggZm9yIGZkLWNhcmQtbGF5b3V0ICovXG5mdW5jdGlvbiBnZXROdW1iZXJPZkNvbHVtbnMoY29udGFpbmVyV2lkdGg6IG51bWJlciwgY2FyZFdpZHRoOiBudW1iZXIpOiBudW1iZXIge1xuICAgIGNvbnRhaW5lcldpZHRoID0gY29udGFpbmVyV2lkdGggfHwgMTtcbiAgICBjYXJkV2lkdGggPSBjYXJkV2lkdGggfHwgMTtcblxuICAgIGNvbnN0IG51bWJlck9mQ2FyZHNXaXRoTm9HYXAgPSBNYXRoLm1heChNYXRoLmZsb29yKGNvbnRhaW5lcldpZHRoIC8gY2FyZFdpZHRoKSwgMSk7IC8vIEV4YW1wbGU6IDk2MCAvIDMyMCA9IDNcbiAgICBjb25zdCByZXF1aXJlZFdpZHRoV2l0aEdhcCA9IG51bWJlck9mQ2FyZHNXaXRoTm9HYXAgKiBjYXJkV2lkdGggKyAobnVtYmVyT2ZDYXJkc1dpdGhOb0dhcCAtIDEpICogQ0FSRF9HQVBfV0lEVEg7XG4gICAgY29uc3QgY29sdW1uQ291bnQgPSByZXF1aXJlZFdpZHRoV2l0aEdhcCA+IGNvbnRhaW5lcldpZHRoID8gbnVtYmVyT2ZDYXJkc1dpdGhOb0dhcCAtIDEgOiBudW1iZXJPZkNhcmRzV2l0aE5vR2FwO1xuXG4gICAgcmV0dXJuIE1hdGgubWF4KGNvbHVtbkNvdW50LCAxKTtcbn1cblxuLyoqIEBoaWRkZW4gTWV0aG9kIHRvIHVwZGF0ZSByYW5rIGFmdGVyIGNhcmRzIGFyZSBkcmFnZ2VkICovXG5mdW5jdGlvbiBhZGp1c3RDYXJkUmFuayhkcmFnZ2VkQ2FyZDogQ2FyZERlZmluaXRpb25EaXJlY3RpdmUsIHJlcGxhY2VkQ2FyZDogQ2FyZERlZmluaXRpb25EaXJlY3RpdmUpOiB2b2lkIHtcbiAgICBjb25zdCBkcmFnZ2VkQ2FyZFJhbmsgPSBkcmFnZ2VkQ2FyZC5mZENhcmREZWY7XG4gICAgZHJhZ2dlZENhcmQuZmRDYXJkRGVmID0gcmVwbGFjZWRDYXJkLmZkQ2FyZERlZjtcbiAgICByZXBsYWNlZENhcmQuZmRDYXJkRGVmID0gZHJhZ2dlZENhcmRSYW5rO1xufVxuIiwiPGRpdlxuICAgICNsYXlvdXRcbiAgICBjZGtEcm9wTGlzdEdyb3VwXG4gICAgZmREbmRLZXlib2FyZEdyb3VwXG4gICAgY2xhc3M9XCJmZC1maXhlZC1jYXJkLWxheW91dF9fY2FyZC1sYXlvdXQgZmQtZml4ZWQtY2FyZC1sYXlvdXRfX2NhcmQtbGF5b3V0LS1jb2x1bW5zLXt7IHRoaXMuX251bWJlck9mQ29sdW1ucyB9fVwiXG4gICAgW3N0eWxlLmhlaWdodF09XCJfY29udGFpbmVySGVpZ2h0ICsgJ3B4J1wiXG4gICAgW2dyb3Vwc109XCJfY2FyZENvbHVtbnNcIlxuICAgIG9yaWVudGF0aW9uPVwiaG9yaXpvbnRhbFwiXG4gICAgW2N1c3RvbU1vdmVGbl09XCJfY3VzdG9tTW92ZUZuXCJcbiAgICBbY3VzdG9tVHJhbnNmZXJGbl09XCJfY3VzdG9tVHJhbnNmZXJGblwiXG4gICAgW2Rpc2FibGVLZXlib2FyZERyYWdEcm9wXT1cImRpc2FibGVEcmFnRHJvcFwiXG4gICAgW2Nka0Ryb3BMaXN0R3JvdXBEaXNhYmxlZF09XCJkaXNhYmxlRHJhZ0Ryb3BcIlxuICAgIFthdHRyLmRpcl09XCJfZGlyXCJcbj5cbiAgICA8ZGl2XG4gICAgICAgICpuZ0Zvcj1cImxldCBjYXJkIG9mIF9jYXJkc0FycmF5OyBsZXQgY2FyZEluZGV4ID0gaW5kZXhcIlxuICAgICAgICBjZGtEcm9wTGlzdFxuICAgICAgICBjZGtEcm9wTGlzdFNvcnRpbmdEaXNhYmxlZFxuICAgICAgICBjbGFzcz1cImZkLWZpeGVkLWNhcmQtbGF5b3V0X19jYXJkXCJcbiAgICAgICAgW2NsYXNzLmZkLWZpeGVkLWNhcmQtbGF5b3V0X19jYXJkLS1zaW5nbGVdPVwiX3NpbmdsZUl0ZW1Db2x1bW5zLmhhcyhjYXJkLmZkQ2FyZERlZilcIlxuICAgICAgICBbc3R5bGUubWluLXdpZHRoLnB4XT1cIl9jb2x1bW5zV2lkdGguZ2V0KGNhcmQuZmRDYXJkRGVmKVwiXG4gICAgICAgIFtzdHlsZS5tYXgtd2lkdGgucHhdPVwiX2NvbHVtbnNXaWR0aC5nZXQoY2FyZC5mZENhcmREZWYpXCJcbiAgICAgICAgW2Nka0Ryb3BMaXN0RGF0YV09XCJjYXJkSW5kZXhcIlxuICAgICAgICAoY2RrRHJvcExpc3RFbnRlcmVkKT1cIl9vbkRyb3BMaXN0RW50ZXJlZCgkZXZlbnQpXCJcbiAgICA+XG4gICAgICAgIDxkaXZcbiAgICAgICAgICAgIGNka0RyYWdcbiAgICAgICAgICAgIGZkRG5kS2V5Ym9hcmRJdGVtXG4gICAgICAgICAgICB0YWJpbmRleD1cIjBcIlxuICAgICAgICAgICAgY2RrRHJhZ1ByZXZpZXdDbGFzcz1cImZkLWZpeGVkLWNhcmQtbGF5b3V0X19jYXJkLXByZXZpZXdcIlxuICAgICAgICAgICAgW2Nka0RyYWdEYXRhXT1cImNhcmRcIlxuICAgICAgICAgICAgW2Nka0RyYWdTdGFydERlbGF5XT1cImRyYWdTdGFydERlbGF5XCJcbiAgICAgICAgICAgIFtpdGVtSW5kZXhdPVwiX2l0ZW1JbmRleGVzLmdldChjYXJkLmZkQ2FyZERlZikhXCJcbiAgICAgICAgICAgIFtncm91cEluZGV4XT1cIl9ncm91cEluZGV4ZXMuZ2V0KGNhcmQuZmRDYXJkRGVmKSFcIlxuICAgICAgICAgICAgKGNka0RyYWdEcm9wcGVkKT1cIl9vbkRyYWdEcm9wcGVkKCRldmVudClcIlxuICAgICAgICA+XG4gICAgICAgICAgICA8ZmQtZml4ZWQtY2FyZC1sYXlvdXQtaXRlbT5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiY2FyZD8udGVtcGxhdGUgfHwgbnVsbFwiPiA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDwvZmQtZml4ZWQtY2FyZC1sYXlvdXQtaXRlbT5cblxuICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICpjZGtEcmFnUGxhY2Vob2xkZXJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImZkLWZpeGVkLWNhcmQtbGF5b3V0X19jYXJkLXBsYWNlaG9sZGVyXCJcbiAgICAgICAgICAgICAgICBbc3R5bGUubWFyZ2luLWJvdHRvbS5yZW1dPVwiK19wbGFjZWhvbGRlck1hcmdpblwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImNhcmQ/LnRlbXBsYXRlIHx8IG51bGxcIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGNvbHVtbiBvZiBfY2FyZENvbHVtbnM7IGxldCBsYXN0ID0gbGFzdDsgbGV0IGluZGV4ID0gaW5kZXhcIj5cbiAgICAgICAgPGRpdiAqbmdJZj1cIiFsYXN0XCIgY2xhc3M9XCJmZC1maXhlZC1jYXJkLWxheW91dF9fY2xlYXJmaXhcIiBbc3R5bGUub3JkZXJdPVwiaW5kZXggKyAxXCI+PC9kaXY+XG4gICAgPC9uZy1jb250YWluZXI+XG48L2Rpdj5cbiJdfQ==
379
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZml4ZWQtY2FyZC1sYXlvdXQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vbGlicy9jb3JlL3NyYy9saWIvZml4ZWQtY2FyZC1sYXlvdXQvZml4ZWQtY2FyZC1sYXlvdXQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vbGlicy9jb3JlL3NyYy9saWIvZml4ZWQtY2FyZC1sYXlvdXQvZml4ZWQtY2FyZC1sYXlvdXQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUVILHVCQUF1QixFQUN2QixpQkFBaUIsRUFDakIsU0FBUyxFQUNULGVBQWUsRUFDZixTQUFTLEVBQ1QsVUFBVSxFQUNWLFlBQVksRUFDWixZQUFZLEVBQ1osS0FBSyxFQUlMLFFBQVEsRUFDUixNQUFNLEVBQ04sU0FBUyxFQUVULFdBQVcsRUFDWCxTQUFTLEVBQ1QsWUFBWSxFQUNaLGlCQUFpQixFQUNwQixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDcEQsT0FBTyxFQUFFLE9BQU8sRUFBNkIsTUFBTSx3QkFBd0IsQ0FBQztBQUM1RSxPQUFPLEVBQUUsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUM3QyxPQUFPLEVBQUUsWUFBWSxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFM0UsT0FBTyxFQUFFLGdCQUFnQixFQUFFLFVBQVUsRUFBRSxtQkFBbUIsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQ2hHLE9BQU8sRUFBRSw0QkFBNEIsRUFBRSxNQUFNLDJEQUEyRCxDQUFDO0FBQ3pHLE9BQU8sRUFBRSxvQkFBb0IsRUFBZSxNQUFNLHVCQUF1QixDQUFDOzs7Ozs7QUFFMUUsTUFBTSxTQUFTLEdBQUcsbUJBQW1CLEVBQUUsQ0FBQztBQUN4QyxNQUFNLGtCQUFr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QztBQUNwQyxDQUFDO0FBRUQsNERBQTREO0FBQzVELFNBQVMsY0FBYyxDQUFDLFdBQW9DLEVBQUUsWUFBcUM7SUFDL0YsTUFBTSxlQUFlLEdBQUcsV0FBVyxDQUFDLFNBQVMsQ0FBQztJQUM5QyxXQUFXLENBQUMsU0FBUyxHQUFHLFlBQVksQ0FBQyxTQUFTLENBQUM7SUFDL0MsWUFBWSxDQUFDLFNBQVMsR0FBRyxlQUFlLENBQUM7QUFDN0MsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gICAgQWZ0ZXJWaWV3SW5pdCxcbiAgICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBDb21wb25lbnQsXG4gICAgQ29udGVudENoaWxkcmVuLFxuICAgIERpcmVjdGl2ZSxcbiAgICBFbGVtZW50UmVmLFxuICAgIEV2ZW50RW1pdHRlcixcbiAgICBIb3N0TGlzdGVuZXIsXG4gICAgSW5wdXQsXG4gICAgT25DaGFuZ2VzLFxuICAgIE9uRGVzdHJveSxcbiAgICBPbkluaXQsXG4gICAgT3B0aW9uYWwsXG4gICAgT3V0cHV0LFxuICAgIFF1ZXJ5TGlzdCxcbiAgICBTaW1wbGVDaGFuZ2VzLFxuICAgIFRlbXBsYXRlUmVmLFxuICAgIFZpZXdDaGlsZCxcbiAgICBWaWV3Q2hpbGRyZW4sXG4gICAgVmlld0VuY2Fwc3VsYXRpb25cbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBGb2N1c0tleU1hbmFnZXIgfSBmcm9tICdAYW5ndWxhci9jZGsvYTExeSc7XG5pbXBvcnQgeyBDZGtEcmFnLCBDZGtEcmFnRHJvcCwgQ2RrRHJhZ0VudGVyIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2RyYWctZHJvcCc7XG5pbXBvcnQgeyBTdWJqZWN0LCBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGRlYm91bmNlVGltZSwgZGlzdGluY3QsIGZpbHRlciwgdGFrZVVudGlsIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5pbXBvcnQgeyByZXNpemVPYnNlcnZhYmxlLCBSdGxTZXJ2aWNlLCBnZXREb2N1bWVudEZvbnRTaXplIH0gZnJvbSAnQGZ1bmRhbWVudGFsLW5neC9jb3JlL3V0aWxzJztcbmltcG9ydCB7IEZpeGVkQ2FyZExheW91dEl0ZW1Db21wb25lbnQgfSBmcm9tICcuL2ZpeGVkLWNhcmQtbGF5b3V0LWl0ZW0vZml4ZWQtY2FyZC1sYXlvdXQtaXRlbS5jb21wb25lbnQnO1xuaW1wb3J0IHsgY29lcmNlTnVtYmVyUHJvcGVydHksIE51bWJlcklucHV0IH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2NvZXJjaW9uJztcblxuY29uc3QgUkVNX0lOX1BYID0gZ2V0RG9jdW1lbnRGb250U2l6ZSgpO1xuY29uc3QgQ0FSRF9NSU5JTVVNX1dJRFRIID0gUkVNX0lOX1BYICogMjA7IC8vIDIwcmVtXG5jb25zdCBDQVJEX0dBUF9XSURUSCA9IFJFTV9JTl9QWDsgLy8gMXJlbVxuY29uc3QgRFJBR19TVEFSVF9ERUxBWSA9IDIwMDsgLy8gaW4gbXNcbmNvbnN0IE1BWF9DT0xVTU5TID0gMTA7XG5cbmxldCBjYXJkUmFuayA9IDE7XG5cbkBEaXJlY3RpdmUoeyBzZWxlY3RvcjogJ1tmZENhcmREZWZdJyB9KVxuZXhwb3J0IGNsYXNzIENhcmREZWZpbml0aW9uRGlyZWN0aXZlIHtcbiAgICAvKipcbiAgICAgKiBCZWhhdmVzIGxpa2UgcmFuayBvZiBjYXJkLlxuICAgICAqIFVzZWZ1bCBpbiBjcmVhdGluZyBsYXlvdXQgYWdhaW4gYWZ0ZXIgZHJhZyBhbmQgZHJvcC5cbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHNldCBmZENhcmREZWYodmFsdWU6IE51bWJlcklucHV0KSB7XG4gICAgICAgIGlmICghdmFsdWUpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX2ZkQ2FyZERlZiA9IGNvZXJjZU51bWJlclByb3BlcnR5KHZhbHVlKTtcbiAgICB9XG4gICAgZ2V0IGZkQ2FyZERlZigpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5fZmRDYXJkRGVmO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgcHJpdmF0ZSBfZmRDYXJkRGVmOiBudW1iZXIgPSBjYXJkUmFuaysrO1xuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgdGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT4pIHt9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTGF5b3V0IHtcbiAgICBudW1iZXJPZkNvbHVtbnM/OiBudW1iZXI7XG4gICAgc2NyZWVuU2l6ZTogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENhcmREcm9wcGVkIHtcbiAgICBwcmV2aW91c0luZGV4OiBudW1iZXI7XG4gICAgY3VycmVudEluZGV4OiBudW1iZXI7XG4gICAgbGF5b3V0Q29sdW1uczogbnVtYmVyO1xuICAgIGl0ZW1zOiBDYXJkRGVmaW5pdGlvbkRpcmVjdGl2ZVtdO1xufVxuXG50eXBlIENvbHVtbnMgPSAxIHwgMiB8IDMgfCA0IHwgNSB8IDYgfCA3IHwgOCB8IDkgfCAxMDtcblxuZXhwb3J0IHR5cGUgQ29sdW1uc1dpZHRoQ29uZmlnID0geyBbQyBpbiBDb2x1bW5zXT86IG51bWJlciB9O1xuXG50eXBlIENhcmRDb2x1bW4gPSBDYXJkRGVmaW5pdGlvbkRpcmVjdGl2ZVtdO1xuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ2ZkLWZpeGVkLWNhcmQtbGF5b3V0JyxcbiAgICB0ZW1wbGF0ZVVybDogJy4vZml4ZWQtY2FyZC1sYXlvdXQuY29tcG9uZW50Lmh0bWwnLFxuICAgIHN0eWxlVXJsczogWycuL2ZpeGVkLWNhcmQtbGF5b3V0LmNvbXBvbmVudC5zY3NzJ10sXG4gICAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gICAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcbiAgICBob3N0OiB7XG4gICAgICAgIGNsYXNzOiAnZmQtZml4ZWQtY2FyZC1sYXlvdXQnXG4gICAgfVxufSlcbmV4cG9ydCBjbGFzcyBGaXhlZENhcmRMYXlvdXRDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIEFmdGVyVmlld0luaXQsIE9uQ2hhbmdlcywgT25EZXN0cm95IHtcbiAgICAvKiogRHJhZyBkcm9wIGJlaGF2aW9yIGNhbiBiZSBkaXNhYmxlZCAqL1xuICAgIEBJbnB1dCgpXG4gICAgZGlzYWJsZURyYWdEcm9wOiBib29sZWFuO1xuXG4gICAgLyoqIERyYWcgc3RhcnQgZGVsYXkgaW4gbWlsbGlzZWNvbmRzLCBkZWZhdWx0IHRvIDIwMG1zIGZvciBzYWZlIHNjcm9sbGluZyBvbiBtb2JpbGUgd2l0aCB0b3VjaHNjcmVlbiAqL1xuICAgIEBJbnB1dCgpXG4gICAgZHJhZ1N0YXJ0RGVsYXkgPSBEUkFHX1NUQVJUX0RFTEFZO1xuXG4gICAgLyoqIENhcmQncyBtaW5pbXVtIHdpZHRoIGluIHBpeGVscy4gKi9cbiAgICBASW5wdXQoKVxuICAgIHNldCBjYXJkTWluaW11bVdpZHRoKHZhbHVlOiBOdW1iZXJJbnB1dCkge1xuICAgICAgICBjb25zdCBjb2VyY2VkVmFsdWUgPSBjb2VyY2VOdW1iZXJQcm9wZXJ0eSh2YWx1ZSk7XG5cbiAgICAgICAgaWYgKGNvZXJjZWRWYWx1ZSA8IENBUkRfTUlOSU1VTV9XSURUSCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fY2FyZE1pbmltdW1XaWR0aCA9IGNvZXJjZWRWYWx1ZTtcbiAgICB9XG4gICAgZ2V0IGNhcmRNaW5pbXVtV2lkdGgoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NhcmRNaW5pbXVtV2lkdGg7XG4gICAgfVxuXG4gICAgLyoqIENvbmZpZyB3aXRoIHRoZSB3aWR0aCByYXRpb3MgdGhhdCBzaG91bGQgdGFrZSBldmVyeSBjb2x1bW4uIEZsZXgtZ3JvdyBwcmluY2lwZS4gTWlzc2VkIHZhbHVlcyBzZXQgdG8gMC4gcyovXG4gICAgQElucHV0KClcbiAgICBjb2x1bW5zV2lkdGhDb25maWc6IENvbHVtbnNXaWR0aENvbmZpZztcblxuICAgIC8qKiBMaW1pdCB0aGUgbnVtYmVyIG9mIGNvbHVtbnMuIERlZmF1bHQgaXMgMTAuICovXG4gICAgQElucHV0KClcbiAgICBtYXhDb2x1bW5zID0gTUFYX0NPTFVNTlM7XG5cbiAgICAvKiogRXZlbnQgdG8gZW1pdCwgd2hlbiBsYXlvdXQgY2hhbmdlcyAqL1xuICAgIEBPdXRwdXQoKVxuICAgIGxheW91dENoYW5nZTogRXZlbnRFbWl0dGVyPExheW91dD4gPSBuZXcgRXZlbnRFbWl0dGVyPExheW91dD4oKTtcblxuICAgIC8qKiBFdmVudCB0byBlbWl0IG9uIENhcmQgZHJhZ2dlZCBhbmQgZHJvcHBlZCAqL1xuICAgIEBPdXRwdXQoKVxuICAgIGNhcmREcmFnZ2VkRHJvcHBlZDogRXZlbnRFbWl0dGVyPENhcmREcm9wcGVkPiA9IG5ldyBFdmVudEVtaXR0ZXI8Q2FyZERyb3BwZWQ+KCk7XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIEBDb250ZW50Q2hpbGRyZW4oQ2FyZERlZmluaXRpb25EaXJlY3RpdmUpXG4gICAgX2NhcmRzOiBRdWVyeUxpc3Q8Q2FyZERlZmluaXRpb25EaXJlY3RpdmU+O1xuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBAVmlld0NoaWxkcmVuKEZpeGVkQ2FyZExheW91dEl0ZW1Db21wb25lbnQpXG4gICAgX2NhcmRDb250YWluZXJzOiBRdWVyeUxpc3Q8Rml4ZWRDYXJkTGF5b3V0SXRlbUNvbXBvbmVudD47XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIEBWaWV3Q2hpbGRyZW4oQ2RrRHJhZylcbiAgICBfZHJhZ0xpc3Q6IFF1ZXJ5TGlzdDxDZGtEcmFnPjtcblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgQFZpZXdDaGlsZCgnbGF5b3V0JylcbiAgICBfbGF5b3V0OiBFbGVtZW50UmVmO1xuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBfY2FyZHNBcnJheTogQ2FyZERlZmluaXRpb25EaXJlY3RpdmVbXTtcblxuICAgIC8qKiBAaGlkZGVuIE51bWJlciBvZiBDb2x1bW5zIGluIGxheW91dCAqL1xuICAgIF9udW1iZXJPZkNvbHVtbnM6IG51bWJlcjtcblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgX2NhcmRDb2x1bW5zOiBDYXJkQ29sdW1uW107XG5cbiAgICAvKiogQGhpZGRlbiovXG4gICAgX2NvbnRhaW5lckhlaWdodDogbnVtYmVyO1xuXG4gICAgLyoqIEBoaWRkZW4gaGFuZGxlcyBydGwgc2VydmljZSAqL1xuICAgIF9kaXIgPSAnbHRyJztcblxuICAgIC8qKiBAaGlkZGVuIGZpcnN0IG51bWJlciBpcyB0aGUgQ2FyZERlZmluaXRpb24gcmFuaywgaS5lLiBpZCAqL1xuICAgIF9ncm91cEluZGV4ZXMgPSBuZXcgTWFwPG51bWJlciwgbnVtYmVyPigpO1xuXG4gICAgLyoqIEBoaWRkZW4gZmlyc3QgbnVtYmVyIGlzIHRoZSBDYXJkRGVmaW5pdGlvbiByYW5rLCBpLmUuIGlkICovXG4gICAgX2l0ZW1JbmRleGVzID0gbmV3IE1hcDxudW1iZXIsIG51bWJlcj4oKTtcblxuICAgIC8qKiBAaGlkZGVuIGZpcnN0IG51bWJlciBpcyB0aGUgQ2FyZERlZmluaXRpb24gcmFuaywgaS5lLiBpZCAqL1xuICAgIF9zaW5nbGVJdGVtQ29sdW1ucyA9IG5ldyBTZXQ8bnVtYmVyPigpO1xuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBfY29sdW1uc1dpZHRoID0gbmV3IE1hcDxudW1iZXIsIG51bWJlcj4oKTtcblxuICAgIC8qKiBAaGlkZGVuIFJldHVybiBhdmFpbGFibGUgd2lkdGggZm9yIGZpeGVkIGNhcmQgbGF5b3V0ICovXG4gICAgZ2V0IF9hdmFpbGFibGVXaWR0aCgpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5fbGF5b3V0Lm5hdGl2ZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGg7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBfcGxhY2Vob2xkZXJNYXJnaW46IGJvb2xlYW47XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIF9za2lwTGlzdGVuUmVzaXplID0gZmFsc2U7XG5cbiAgICAvKiogQGhpZGRlbiBGb2N1c0tleU1hbmFnZXIgaW5zdGFuY2UgKi9cbiAgICBwcml2YXRlIF9rZXlib2FyZEV2ZW50c01hbmFnZXI6IEZvY3VzS2V5TWFuYWdlcjxGaXhlZENhcmRMYXlvdXRJdGVtQ29tcG9uZW50PjtcblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgcHJpdmF0ZSBfY2FyZE1pbmltdW1XaWR0aCA9IENBUkRfTUlOSU1VTV9XSURUSDtcblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgcHJpdmF0ZSBfY2FyZHNTaXplQ2hhbmdlU3Vic2NyaXB0aW9uID0gbmV3IFN1YnNjcmlwdGlvbigpO1xuXG4gICAgLyoqIEBoaWRkZW4gQW4gUnhKUyBTdWJqZWN0IHRoYXQgd2lsbCBraWxsIHRoZSBkYXRhIHN0cmVhbSB1cG9uIGNvbXBvbmVudOKAmXMgZGVzdHJ1Y3Rpb24gKGZvciB1bnN1YnNjcmliaW5nKSAgKi9cbiAgICBwcml2YXRlIHJlYWRvbmx5IF9vbkRlc3Ryb3kkOiBTdWJqZWN0PHZvaWQ+ID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgX2NoYW5nZURldGVjdG9yOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICAgICAgQE9wdGlvbmFsKCkgcHJpdmF0ZSByZWFkb25seSBfcnRsU2VydmljZTogUnRsU2VydmljZVxuICAgICkge31cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX3N1YnNjcmliZVRvUnRsKCk7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX3Byb2Nlc3NDYXJkcygpO1xuXG4gICAgICAgIHRoaXMuX2xpc3Rlbk9uUmVzaXplKCk7XG4gICAgICAgIHRoaXMuX2xpc3Rlbk9uQ2FyZHNDaGFuZ2UoKTtcbiAgICAgICAgdGhpcy5fYWNjZXNzaWJpbGl0eVNldHVwKCk7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgICAgIC8vIFNraXAgYWxsIGNoYW5nZXMgdW5sZXNzIHdlIGRvbid0IGhhdmUgaW5pdGlhbCBsYXlvdXQgY3JlYXRlZFxuICAgICAgICBpZiAoIXRoaXMuX2NhcmRzQXJyYXkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICgnbWF4Q29sdW1ucycgaW4gY2hhbmdlcyB8fCAnY2FyZE1pbmltdW1XaWR0aCcgaW4gY2hhbmdlcykge1xuICAgICAgICAgICAgdGhpcy51cGRhdGVMYXlvdXQoKTtcbiAgICAgICAgfSBlbHNlIGlmICgnY29sdW1uc1dpZHRoQ29uZmlnJyBpbiBjaGFuZ2VzKSB7XG4gICAgICAgICAgICB0aGlzLl9zZXRDYXJkQ29sdW1uc1dpZHRoKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgICAgICB0aGlzLl9jYXJkc1NpemVDaGFuZ2VTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcblxuICAgICAgICB0aGlzLl9vbkRlc3Ryb3kkLm5leHQoKTtcbiAgICAgICAgdGhpcy5fb25EZXN0cm95JC5jb21wbGV0ZSgpO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgQEhvc3RMaXN0ZW5lcigna2V5ZG93bicsIFsnJGV2ZW50J10pXG4gICAgaGFuZGxlS2V5ZG93bihldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgICAgICBldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcblxuICAgICAgICBpZiAodGhpcy5fa2V5Ym9hcmRFdmVudHNNYW5hZ2VyKSB7XG4gICAgICAgICAgICB0aGlzLl9rZXlib2FyZEV2ZW50c01hbmFnZXIub25LZXlkb3duKGV2ZW50KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBEaXN0cmlidXRlIGNhcmRzIG9uIHdpbmRvdyByZXNpemUgKi9cbiAgICB1cGRhdGVMYXlvdXQoKTogdm9pZCB7XG4gICAgICAgIGlmICghdGhpcy5fY2FyZHMubGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBwb3NzaWJsZU51bWJlck9mQ29sdW1ucyA9IGdldE51bWJlck9mQ29sdW1ucyh0aGlzLl9hdmFpbGFibGVXaWR0aCwgdGhpcy5jYXJkTWluaW11bVdpZHRoKTtcblxuICAgICAgICB0aGlzLl9udW1iZXJPZkNvbHVtbnMgPSBNYXRoLm1pbihcbiAgICAgICAgICAgIHBvc3NpYmxlTnVtYmVyT2ZDb2x1bW5zLFxuICAgICAgICAgICAgdGhpcy5fY2FyZHMubGVuZ3RoLFxuICAgICAgICAgICAgdGhpcy5tYXhDb2x1bW5zIHx8IE1BWF9DT0xVTU5TLFxuICAgICAgICAgICAgTUFYX0NPTFVNTlNcbiAgICAgICAgKTtcblxuICAgICAgICB0aGlzLmxheW91dENoYW5nZS5lbWl0KHtcbiAgICAgICAgICAgIG51bWJlck9mQ29sdW1uczogdGhpcy5fbnVtYmVyT2ZDb2x1bW5zLFxuICAgICAgICAgICAgc2NyZWVuU2l6ZTogdGhpcy5fYXZhaWxhYmxlV2lkdGhcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5fc2V0Q2FyZENvbHVtbnMoKTtcbiAgICAgICAgdGhpcy5fc2V0Q2FyZENvbHVtbnNXaWR0aCgpO1xuICAgICAgICB0aGlzLl9zZXRDb250YWluZXJIZWlnaHQoKTtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIF9vbkRyb3BMaXN0RW50ZXJlZChldmVudDogQ2RrRHJhZ0VudGVyKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGNvbnRhaW5lckl0ZW1DYXJkRGVmID0gKGV2ZW50LmNvbnRhaW5lci5nZXRTb3J0ZWRJdGVtcygpWzBdLmRhdGEgYXMgQ2FyZERlZmluaXRpb25EaXJlY3RpdmUpLmZkQ2FyZERlZjtcbiAgICAgICAgY29uc3QgZHJhZ0l0ZW1DYXJkRGVmID0gKGV2ZW50Lml0ZW0uZGF0YSBhcyBDYXJkRGVmaW5pdGlvbkRpcmVjdGl2ZSkuZmRDYXJkRGVmO1xuXG4gICAgICAgIHRoaXMuX3BsYWNlaG9sZGVyTWFyZ2luID0gY29udGFpbmVySXRlbUNhcmREZWYgIT09IGRyYWdJdGVtQ2FyZERlZjtcblxuICAgICAgICBjb25zdCBjb2x1bW5JbmRleFRvQWRkU3BhY2UgPSB0aGlzLl9jYXJkQ29sdW1ucy5maW5kSW5kZXgoKGNvbHVtbikgPT5cbiAgICAgICAgICAgIGNvbHVtbi5maW5kKChjYXJkKSA9PiBldmVudC5jb250YWluZXIuZ2V0U29ydGVkSXRlbXMoKVswXS5kYXRhID09PSBjYXJkKVxuICAgICAgICApO1xuICAgICAgICBjb25zdCBzcGFjZVRvQWRkID1cbiAgICAgICAgICAgIGV2ZW50Lml0ZW0uZWxlbWVudC5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmhlaWdodCArXG4gICAgICAgICAgICAoZXZlbnQuY29udGFpbmVyLmdldFNvcnRlZEl0ZW1zKCkubGVuZ3RoID8gUkVNX0lOX1BYIDogMCk7XG5cbiAgICAgICAgLy8gV2hlbiB3ZSBtb3ZlIHRoZSBjYXJkIGludG8gYSBjZXJ0YWluIGNvbHVtbiB3ZSBzaG91bGQgaW5jcmVhc2UgdGhlIGhlaWdodCBvZiB0aGF0IGNvbHVtbiBieSB0aGUgY2FyZCBoZWlnaHRcbiAgICAgICAgdGhpcy5fc2V0Q29udGFpbmVySGVpZ2h0KGNvbHVtbkluZGV4VG9BZGRTcGFjZSwgc3BhY2VUb0FkZCk7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBfb25EcmFnRHJvcHBlZChldmVudDogQ2RrRHJhZ0Ryb3A8bnVtYmVyLCBudW1iZXI+KTogdm9pZCB7XG4gICAgICAgIGlmIChldmVudC5jb250YWluZXIuZGF0YSA9PT0gZXZlbnQucHJldmlvdXNDb250YWluZXIuZGF0YSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fcGxhY2Vob2xkZXJNYXJnaW4gPSBmYWxzZTtcblxuICAgICAgICBjb25zdCBtb3ZlZENhcmQgPSBldmVudC5wcmV2aW91c0NvbnRhaW5lci5nZXRTb3J0ZWRJdGVtcygpWzBdLmRhdGE7XG4gICAgICAgIGNvbnN0IHJlcGxhY2VkQ2FyZCA9IGV2ZW50LmNvbnRhaW5lci5nZXRTb3J0ZWRJdGVtcygpWzBdLmRhdGE7XG5cbiAgICAgICAgY29uc3QgbW92ZWRDYXJkQ29sdW1uID0gdGhpcy5fY2FyZENvbHVtbnMuZmluZCgoY29sdW1uKSA9PlxuICAgICAgICAgICAgY29sdW1uLmZpbmQoKGNhcmQpID0+IGNhcmQuZmRDYXJkRGVmID09PSBtb3ZlZENhcmQuZmRDYXJkRGVmKVxuICAgICAgICApO1xuICAgICAgICBjb25zdCByZXBsYWNlZENhcmRDb2x1bW4gPSB0aGlzLl9jYXJkQ29sdW1ucy5maW5kKChjb2x1bW4pID0+XG4gICAgICAgICAgICBjb2x1bW4uZmluZCgoY2FyZCkgPT4gY2FyZC5mZENhcmREZWYgPT09IHJlcGxhY2VkQ2FyZC5mZENhcmREZWYpXG4gICAgICAgICk7XG5cbiAgICAgICAgLy8gSWYgd2UgZHJhZ2dlZCB0aGUgY2FyZCBmcm9tIHRoZSBzYW1lIGNvbHVtbiBhcyB0aGUgY29sdW1uIHdlJ3JlIGRyb3BwaW5nIGludG9cbiAgICAgICAgLy8gVGhlcmUgbWF5IGJlIGEgc2l0dWF0aW9uIHdoZXJlIHRoZSBvcmRlciBzaG91bGRuJ3QgY2hhbmdlIGJ1dCBzaW5jZSB0aGVyZSBhcmUgYSBkaWZmZXJlbnQgZHJvcCBsaXN0cyBpdCB3aWxsIGNoYW5nZVxuICAgICAgICAvLyBXZSBzaG91bGQgcHJldmVudCB0aGlzXG4gICAgICAgIGlmIChtb3ZlZENhcmRDb2x1bW4gPT09IHJlcGxhY2VkQ2FyZENvbHVtbiAmJiBtb3ZlZENhcmRDb2x1bW4/Lmxlbmd0aCA9PT0gMikge1xuICAgICAgICAgICAgaWYgKG1vdmVkQ2FyZC5mZENhcmREZWYgPCByZXBsYWNlZENhcmQuZmRDYXJkRGVmICYmIGV2ZW50LnByZXZpb3VzQ29udGFpbmVyLmRhdGEgPCBldmVudC5jb250YWluZXIuZGF0YSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKG1vdmVkQ2FyZC5mZENhcmREZWYgPiByZXBsYWNlZENhcmQuZmRDYXJkRGVmICYmIGV2ZW50LnByZXZpb3VzQ29udGFpbmVyLmRhdGEgPiBldmVudC5jb250YWluZXIuZGF0YSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX3Byb2Nlc3NEcmFnRHJvcChldmVudC5wcmV2aW91c0NvbnRhaW5lci5kYXRhLCBldmVudC5jb250YWluZXIuZGF0YSwgbW92ZWRDYXJkLCByZXBsYWNlZENhcmQpO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuIEZvciB0aGUga2V5Ym9hcmQgZHJhZyZkcm9wIGRpcmVjdGl2ZSAqL1xuICAgIF9jdXN0b21Nb3ZlRm4gPSAoZ3JvdXA6IENhcmRDb2x1bW4sIGluZGV4RnJvbTogbnVtYmVyLCBpbmRleFRvOiBudW1iZXIpOiB2b2lkID0+IHtcbiAgICAgICAgY29uc3QgbW92ZWRDYXJkID0gZ3JvdXBbaW5kZXhGcm9tXTtcbiAgICAgICAgY29uc3QgcmVwbGFjZWRDYXJkID0gZ3JvdXBbaW5kZXhUb107XG5cbiAgICAgICAgY29uc3QgaW5kZXhGcm9tQXJyYXkgPSB0aGlzLl9jYXJkc0FycmF5LmZpbmRJbmRleCgoY2FyZCkgPT4gY2FyZC5mZENhcmREZWYgPT09IG1vdmVkQ2FyZC5mZENhcmREZWYpO1xuICAgICAgICBjb25zdCBpbmRleFRvQXJyYXkgPSB0aGlzLl9jYXJkc0FycmF5LmZpbmRJbmRleCgoY2FyZCkgPT4gY2FyZC5mZENhcmREZWYgPT09IHJlcGxhY2VkQ2FyZC5mZENhcmREZWYpO1xuXG4gICAgICAgIHRoaXMuX3Byb2Nlc3NEcmFnRHJvcChpbmRleEZyb21BcnJheSwgaW5kZXhUb0FycmF5LCBtb3ZlZENhcmQsIHJlcGxhY2VkQ2FyZCk7XG4gICAgfTtcblxuICAgIC8qKiBAaGlkZGVuIEZvciB0aGUga2V5Ym9hcmQgZHJhZyZkcm9wIGRpcmVjdGl2ZSAqL1xuICAgIF9jdXN0b21UcmFuc2ZlckZuID0gKHByZXZHcm91cDogQ2FyZENvbHVtbiwgbmV4dEdyb3VwOiBDYXJkQ29sdW1uLCBpbmRleEZyb206IG51bWJlciwgaW5kZXhUbzogbnVtYmVyKTogdm9pZCA9PiB7XG4gICAgICAgIGNvbnN0IG1vdmVkQ2FyZCA9IHByZXZHcm91cFtpbmRleEZyb21dO1xuICAgICAgICBjb25zdCByZXBsYWNlZENhcmQgPSBuZXh0R3JvdXBbaW5kZXhUb107XG5cbiAgICAgICAgY29uc3QgaW5kZXhGcm9tQXJyYXkgPSB0aGlzLl9jYXJkc0FycmF5LmZpbmRJbmRleCgoY2FyZCkgPT4gY2FyZC5mZENhcmREZWYgPT09IG1vdmVkQ2FyZC5mZENhcmREZWYpO1xuICAgICAgICBjb25zdCBpbmRleFRvQXJyYXkgPSB0aGlzLl9jYXJkc0FycmF5LmZpbmRJbmRleCgoY2FyZCkgPT4gY2FyZC5mZENhcmREZWYgPT09IHJlcGxhY2VkQ2FyZC5mZENhcmREZWYpO1xuXG4gICAgICAgIHRoaXMuX3Byb2Nlc3NEcmFnRHJvcChpbmRleEZyb21BcnJheSwgaW5kZXhUb0FycmF5LCBtb3ZlZENhcmQsIHJlcGxhY2VkQ2FyZCk7XG4gICAgfTtcblxuICAgIC8qKiBAaGlkZGVuIEFycmFuZ2VzIGNhcmRzIG9uIGRyb3Agb2YgZHJhZ2dlZCBjYXJkICovXG4gICAgcHJpdmF0ZSBfcHJvY2Vzc0RyYWdEcm9wKFxuICAgICAgICBwcmV2SW5kZXg6IG51bWJlcixcbiAgICAgICAgbmV3SW5kZXg6IG51bWJlcixcbiAgICAgICAgcHJldkNhcmQ6IENhcmREZWZpbml0aW9uRGlyZWN0aXZlLFxuICAgICAgICBuZXdDYXJkOiBDYXJkRGVmaW5pdGlvbkRpcmVjdGl2ZVxuICAgICk6IHZvaWQge1xuICAgICAgICAvLyBtb3ZlSXRlbUluQXJyYXkgZnJvbSBDREsgd29uJ3Qgd29yayBhcyBpdCBjaGFuZ2VzIG9yZGVyIG9mIG90aGVyIGNhcmRzXG4gICAgICAgIGNvbnN0IHJlcGxhY2VkQ2FyZCA9IHRoaXMuX2NhcmRzQXJyYXlbbmV3SW5kZXhdO1xuICAgICAgICB0aGlzLl9jYXJkc0FycmF5W25ld0luZGV4XSA9IHRoaXMuX2NhcmRzQXJyYXlbcHJldkluZGV4XTtcbiAgICAgICAgdGhpcy5fY2FyZHNBcnJheVtwcmV2SW5kZXhdID0gcmVwbGFjZWRDYXJkO1xuXG4gICAgICAgIGFkanVzdENhcmRSYW5rKHByZXZDYXJkLCBuZXdDYXJkKTtcblxuICAgICAgICB0aGlzLmNhcmREcmFnZ2VkRHJvcHBlZC5lbWl0KHtcbiAgICAgICAgICAgIHByZXZpb3VzSW5kZXg6IHByZXZJbmRleCxcbiAgICAgICAgICAgIGN1cnJlbnRJbmRleDogbmV3SW5kZXgsXG4gICAgICAgICAgICBsYXlvdXRDb2x1bW5zOiB0aGlzLl9udW1iZXJPZkNvbHVtbnMsXG4gICAgICAgICAgICBpdGVtczogdGhpcy5fY2FyZHMudG9BcnJheSgpXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMudXBkYXRlTGF5b3V0KCk7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBwcml2YXRlIF9hY2Nlc3NpYmlsaXR5U2V0dXAoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX2tleWJvYXJkRXZlbnRzTWFuYWdlciA9IG5ldyBGb2N1c0tleU1hbmFnZXIodGhpcy5fY2FyZENvbnRhaW5lcnMpLndpdGhXcmFwKCk7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gUnRsIGNoYW5nZSBzdWJzY3JpcHRpb24gKi9cbiAgICBwcml2YXRlIF9zdWJzY3JpYmVUb1J0bCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fcnRsU2VydmljZT8ucnRsLnBpcGUodGFrZVVudGlsKHRoaXMuX29uRGVzdHJveSQpKS5zdWJzY3JpYmUoKGlzUnRsKSA9PiB7XG4gICAgICAgICAgICB0aGlzLl9kaXIgPSBpc1J0bCA/ICdydGwnIDogJ2x0cic7XG4gICAgICAgICAgICB0aGlzLl9jaGFuZ2VEZXRlY3Rvci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuIExpc3RlbiB3aW5kb3cgcmVzaXplIGFuZCBkaXN0cmlidXRlIGNhcmRzIG9uIGNvbHVtbiBjaGFuZ2UgKi9cbiAgICBwcml2YXRlIF9saXN0ZW5PblJlc2l6ZSgpOiB2b2lkIHtcbiAgICAgICAgcmVzaXplT2JzZXJ2YWJsZSh0aGlzLl9sYXlvdXQubmF0aXZlRWxlbWVudClcbiAgICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgICAgIGRlYm91bmNlVGltZSg2MCksXG4gICAgICAgICAgICAgICAgZmlsdGVyKCgpID0+IHRoaXMuX3NraXBMaXN0ZW5SZXNpemUpLFxuICAgICAgICAgICAgICAgIHRha2VVbnRpbCh0aGlzLl9vbkRlc3Ryb3kkKVxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB0aGlzLnVwZGF0ZUxheW91dCgpKTtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiBMaXN0ZW4gY2FyZCBjaGFuZ2UgYW5kIGRpc3RyaWJ1dGUgY2FyZHMgb24gY29sdW1uIGNoYW5nZSAqL1xuICAgIHByaXZhdGUgX2xpc3Rlbk9uQ2FyZHNDaGFuZ2UoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX2NhcmRzLmNoYW5nZXMuc3Vic2NyaWJlKCgpID0+IHRoaXMuX3Byb2Nlc3NDYXJkcygpKTtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHByaXZhdGUgX3Byb2Nlc3NDYXJkcygpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fY2FyZHNBcnJheSA9IHRoaXMuX2NhcmRzXG4gICAgICAgICAgICAudG9BcnJheSgpXG4gICAgICAgICAgICAuc29ydCgoZmlyc3RDYXJkLCBzZWNvbmRDYXJkKSA9PiBmaXJzdENhcmQuZmRDYXJkRGVmIC0gc2Vjb25kQ2FyZC5mZENhcmREZWYpO1xuXG4gICAgICAgIHRoaXMudXBkYXRlTGF5b3V0KCk7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gRGlzdHJpYnV0ZSBjYXJkcyBhbW9uZyBjb2x1bW5zIHRvIGFycmFuZ2UgdGhlbSBpbiBcIlpcIiBmbG93ICovXG4gICAgcHJpdmF0ZSBfc2V0Q2FyZENvbHVtbnMoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX2dyb3VwSW5kZXhlcyA9IG5ldyBNYXA8bnVtYmVyLCBudW1iZXI+KCk7XG4gICAgICAgIHRoaXMuX2l0ZW1JbmRleGVzID0gbmV3IE1hcDxudW1iZXIsIG51bWJlcj4oKTtcbiAgICAgICAgdGhpcy5fc2luZ2xlSXRlbUNvbHVtbnMgPSBuZXcgU2V0PG51bWJlcj4oKTtcblxuICAgICAgICBjb25zdCBjb2x1bW5zOiBDYXJkQ29sdW1uW10gPSBuZXcgQXJyYXkodGhpcy5fbnVtYmVyT2ZDb2x1bW5zKS5maWxsKDApLm1hcCgoKSA9PiBuZXcgQXJyYXkoMCkpO1xuXG4gICAgICAgIHRoaXMuX2NhcmRzQXJyYXkuZm9yRWFjaCgoY2FyZCwgaSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgY3VyckNvbHVtbkluZGV4ID0gaSAlIHRoaXMuX251bWJlck9mQ29sdW1ucztcbiAgICAgICAgICAgIGNvbnN0IGl0ZW1JbmRleCA9IGNvbHVtbnNbY3VyckNvbHVtbkluZGV4XS5sZW5ndGg7XG5cbiAgICAgICAgICAgIGNvbHVtbnNbY3VyckNvbHVtbkluZGV4XS5wdXNoKGNhcmQpO1xuXG4gICAgICAgICAgICB0aGlzLl9ncm91cEluZGV4ZXMuc2V0KGNhcmQuZmRDYXJkRGVmLCBjdXJyQ29sdW1uSW5kZXgpO1xuICAgICAgICAgICAgdGhpcy5faXRlbUluZGV4ZXMuc2V0KGNhcmQuZmRDYXJkRGVmLCBpdGVtSW5kZXgpO1xuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLl9jYXJkQ29sdW1ucyA9IGNvbHVtbnM7XG5cbiAgICAgICAgdGhpcy5fY2FyZENvbHVtbnMuZm9yRWFjaCgoY29sdW1uKSA9PiB7XG4gICAgICAgICAgICBpZiAoY29sdW1uLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX3NpbmdsZUl0ZW1Db2x1bW5zLmFkZChjb2x1bW5bMF0uZmRDYXJkRGVmKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5fbGlzdGVuT25DYXJkc1NpemVDaGFuZ2UoKTtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHByaXZhdGUgX3NldENhcmRDb2x1bW5zV2lkdGgoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX2NvbHVtbnNXaWR0aCA9IG5ldyBNYXAoKTtcblxuICAgICAgICBjb25zdCBjb25maWdQcmVzZW50ID1cbiAgICAgICAgICAgIHRoaXMuY29sdW1uc1dpZHRoQ29uZmlnICYmXG4gICAgICAgICAgICB0eXBlb2YgdGhpcy5jb2x1bW5zV2lkdGhDb25maWcgPT09ICdvYmplY3QnICYmXG4gICAgICAgICAgICBPYmplY3Qua2V5cyh0aGlzLmNvbHVtbnNXaWR0aENvbmZpZykubGVuZ3RoO1xuXG4gICAgICAgIGlmICghY29uZmlnUHJlc2VudCB8fCB0aGlzLl9udW1iZXJPZkNvbHVtbnMgPT09IDEpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGZpeGVkV2lkdGhNb2RpZmllcnMgPSBmaXhXaWR0aE1vZGlmaWVycyh0aGlzLmNvbHVtbnNXaWR0aENvbmZpZywgdGhpcy5fbnVtYmVyT2ZDb2x1bW5zKTtcbiAgICAgICAgY29uc3QgdG90YWxXaWR0aE1vZGlmaWVycyA9IGZpeGVkV2lkdGhNb2RpZmllcnMucmVkdWNlKChzdW0sIHdpZHRoKSA9PiAoc3VtICs9IHdpZHRoKSwgMCk7XG4gICAgICAgIGNvbnN0IGZyZWVTcGFjZSA9IHRoaXMuX2F2YWlsYWJsZVdpZHRoIC0gdGhpcy5jYXJkTWluaW11bVdpZHRoICogdGhpcy5fbnVtYmVyT2ZDb2x1bW5zO1xuXG4gICAgICAgIHRoaXMuX2NhcmRDb2x1bW5zLmZvckVhY2goKGNvbHVtbiwgaW5kZXgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGNvbHVtbldpZHRoID0gTWF0aC5yb3VuZChcbiAgICAgICAgICAgICAgICB0aGlzLmNhcmRNaW5pbXVtV2lkdGggKyAoZnJlZVNwYWNlIC8gdG90YWxXaWR0aE1vZGlmaWVycykgKiBmaXhlZFdpZHRoTW9kaWZpZXJzW2luZGV4XVxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgY29sdW1uLmZvckVhY2goKGNhcmQpID0+IHRoaXMuX2NvbHVtbnNXaWR0aC5zZXQoY2FyZC5mZENhcmREZWYsIGNvbHVtbldpZHRoKSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBDYWxjdWxhdGUgY29udGFpbmVyIGhlaWdodCBhY2NvcmRpbmdseSB0byB0aGUgdGhlIGNhcmQgY29sdW1ucyBoZWlnaHRcbiAgICAgKiBQYXJhbWV0ZXJzIHVzZWQgdG8gaW5jcmVhc2UgdGhlIGhlaWdodCBvZiB0aGUgY29sdW1uIHdoZXJlIGRyYWcnbidkcm9wIHBsYWNlaG9sZGVyIGN1cnJlbnRseSBpc1xuICAgICAqL1xuICAgIHByaXZhdGUgX3NldENvbnRhaW5lckhlaWdodChjb2x1bW5JbmRleFRvQWRkU3BhY2UgPSAtMSwgc3BhY2VUb0FkZCA9IDApOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fc2tpcExpc3RlblJlc2l6ZSA9IHRydWU7XG5cbiAgICAgICAgdGhpcy5fY2hhbmdlRGV0ZWN0b3IuZGV0ZWN0Q2hhbmdlcygpO1xuXG4gICAgICAgIGNvbnN0IGNhcmRDb2x1bW5zID0gdGhpcy5fY2FyZENvbHVtbnMubWFwKChjb2x1bW4pID0+XG4gICAgICAgICAgICBjb2x1bW5cbiAgICAgICAgICAgICAgICAubWFwKFxuICAgICAgICAgICAgICAgICAgICAoY2FyZCkgPT4gdGhpcy5fZHJhZ0xpc3QuZmluZCgoZHJhZykgPT4gIWRyYWcuX2RyYWdSZWYuaXNEcmFnZ2luZygpICYmIGRyYWcuZGF0YSA9PT0gY2FyZCk/LmVsZW1lbnRcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgLmZpbHRlcigoY2FyZCk6IGNhcmQgaXMgRWxlbWVudFJlZjxIVE1MRWxlbWVudD4gPT4gISFjYXJkKVxuICAgICAgICApO1xuXG4gICAgICAgIGNvbnN0IGNvbHVtbnNIZWlnaHRzID0gY2FyZENvbHVtbnNcbiAgICAgICAgICAgIC5tYXAoKGNvbHVtbikgPT4gY29sdW1uLm1hcCgoY2FyZCkgPT4gY2FyZC5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmhlaWdodCkpXG4gICAgICAgICAgICAubWFwKFxuICAgICAgICAgICAgICAgIChjb2x1bW4sIGNvbHVtbkluZGV4KSA9PlxuICAgICAgICAgICAgICAgICAgICBjb2x1bW4ucmVkdWNlKChjYXJkc0hlaWdodCwgaGVpZ2h0KSA9PiAoY2FyZHNIZWlnaHQgKz0gaGVpZ2h0ICsgUkVNX0lOX1BYKSwgMCkgK1xuICAgICAgICAgICAgICAgICAgICAoY29sdW1uSW5kZXggPT09IGNvbHVtbkluZGV4VG9BZGRTcGFjZSA/IHNwYWNlVG9BZGQgOiAwKVxuICAgICAgICAgICAgKTtcblxuICAgICAgICAvLyArNHB4IGJlY2F1c2UgaXQncyB0aGUgdG9wICYgYm90dG9tIGJvcmRlcnMgb2YgY2FyZCBwbGFjZWhvbGRlclxuICAgICAgICB0aGlzLl9jb250YWluZXJIZWlnaHQgPSBNYXRoLm1heCguLi5jb2x1bW5zSGVpZ2h0cykgKyA0O1xuXG4gICAgICAgIHRoaXMuX2NoYW5nZURldGVjdG9yLmRldGVjdENoYW5nZXMoKTtcblxuICAgICAgICB0aGlzLl9za2lwTGlzdGVuUmVzaXplID0gZmFsc2U7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBwcml2YXRlIF9saXN0ZW5PbkNhcmRzU2l6ZUNoYW5nZSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fY2FyZHNTaXplQ2hhbmdlU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgIHRoaXMuX2NhcmRzU2l6ZUNoYW5nZVN1YnNjcmlwdGlvbiA9IG5ldyBTdWJzY3JpcHRpb24oKTtcblxuICAgICAgICB0aGlzLl9jaGFuZ2VEZXRlY3Rvci5kZXRlY3RDaGFuZ2VzKCk7XG5cbiAgICAgICAgdGhpcy5fY2FyZENvbHVtbnMuZm9yRWFjaCgoY29sdW1uKSA9PlxuICAgICAgICAgICAgY29sdW1uXG4gICAgICAgICAgICAgICAgLm1hcCgoY2FyZCkgPT4gdGhpcy5fZHJhZ0xpc3QuZmluZCgod3JhcHBlcikgPT4gd3JhcHBlci5kYXRhID09PSBjYXJkKT8uZWxlbWVudClcbiAgICAgICAgICAgICAgICAuZmlsdGVyKCh2KTogdiBpcyBFbGVtZW50UmVmPEhUTUxFbGVtZW50PiA9PiAhIXYpXG4gICAgICAgICAgICAgICAgLmZvckVhY2goKGNhcmQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fY2FyZHNTaXplQ2hhbmdlU3Vic2NyaXB0aW9uLmFkZChcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc2l6ZU9ic2VydmFibGUoY2FyZC5uYXRpdmVFbGVtZW50KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5waXBlKGRpc3RpbmN0KChyZXNpemVFbnRyeSkgPT4gcmVzaXplRW50cnlbMF0uY29udGVudFJlY3QuaGVpZ2h0KSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHRoaXMuX3NldENvbnRhaW5lckhlaWdodCgpKVxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICk7XG4gICAgfVxufVxuXG4vKiogQGhpZGRlbiAqL1xuZnVuY3Rpb24gZml4V2lkdGhNb2RpZmllcnMoY29uZmlnOiBDb2x1bW5zV2lkdGhDb25maWcsIG51bWJlck9mQ29sdW1uczogbnVtYmVyKTogbnVtYmVyW10ge1xuICAgIGNvbnN0IG1vZGlmaWVycyA9IG5ldyBBcnJheShudW1iZXJPZkNvbHVtbnMpLmZpbGwoMCk7XG5cbiAgICByZXR1cm4gbW9kaWZpZXJzLm1hcCgoXywgaW5kZXgpID0+IHtcbiAgICAgICAgY29uc3QgY29sdW1uV2lkdGhNb2RpZmllciA9IGNvbmZpZ1tpbmRleCArIDFdO1xuXG4gICAgICAgIGlmICghY29sdW1uV2lkdGhNb2RpZmllciB8fCBjb2x1bW5XaWR0aE1vZGlmaWVyIDwgMCkge1xuICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gY29sdW1uV2lkdGhNb2RpZmllcjtcbiAgICB9KTtcbn1cblxuLyoqIEBoaWRkZW4gUmV0dXJucyBudW1iZXIgb2YgY29sdW1ucyB0aGF0IGNhbiBmaXQgaW4gY3VycmVudCBhdmFpbGFibGUgd2lkdGggZm9yIGZkLWNhcmQtbGF5b3V0ICovXG5mdW5jdGlvbiBnZXROdW1iZXJPZkNvbHVtbnMoY29udGFpbmVyV2lkdGg6IG51bWJlciwgY2FyZFdpZHRoOiBudW1iZXIpOiBudW1iZXIge1xuICAgIGNvbnRhaW5lcldpZHRoID0gY29udGFpbmVyV2lkdGggfHwgMTtcbiAgICBjYXJkV2lkdGggPSBjYXJkV2lkdGggfHwgMTtcblxuICAgIGNvbnN0IG51bWJlck9mQ2FyZHNXaXRoTm9HYXAgPSBNYXRoLm1heChNYXRoLmZsb29yKGNvbnRhaW5lcldpZHRoIC8gY2FyZFdpZHRoKSwgMSk7IC8vIEV4YW1wbGU6IDk2MCAvIDMyMCA9IDNcbiAgICBjb25zdCByZXF1aXJlZFdpZHRoV2l0aEdhcCA9IG51bWJlck9mQ2FyZHNXaXRoTm9HYXAgKiBjYXJkV2lkdGggKyAobnVtYmVyT2ZDYXJkc1dpdGhOb0dhcCAtIDEpICogQ0FSRF9HQVBfV0lEVEg7XG4gICAgY29uc3QgY29sdW1uQ291bnQgPSByZXF1aXJlZFdpZHRoV2l0aEdhcCA+IGNvbnRhaW5lcldpZHRoID8gbnVtYmVyT2ZDYXJkc1dpdGhOb0dhcCAtIDEgOiBudW1iZXJPZkNhcmRzV2l0aE5vR2FwO1xuXG4gICAgcmV0dXJuIE1hdGgubWF4KGNvbHVtbkNvdW50LCAxKTtcbn1cblxuLyoqIEBoaWRkZW4gTWV0aG9kIHRvIHVwZGF0ZSByYW5rIGFmdGVyIGNhcmRzIGFyZSBkcmFnZ2VkICovXG5mdW5jdGlvbiBhZGp1c3RDYXJkUmFuayhkcmFnZ2VkQ2FyZDogQ2FyZERlZmluaXRpb25EaXJlY3RpdmUsIHJlcGxhY2VkQ2FyZDogQ2FyZERlZmluaXRpb25EaXJlY3RpdmUpOiB2b2lkIHtcbiAgICBjb25zdCBkcmFnZ2VkQ2FyZFJhbmsgPSBkcmFnZ2VkQ2FyZC5mZENhcmREZWY7XG4gICAgZHJhZ2dlZENhcmQuZmRDYXJkRGVmID0gcmVwbGFjZWRDYXJkLmZkQ2FyZERlZjtcbiAgICByZXBsYWNlZENhcmQuZmRDYXJkRGVmID0gZHJhZ2dlZENhcmRSYW5rO1xufVxuIiwiPGRpdlxuICAgICNsYXlvdXRcbiAgICBjZGtEcm9wTGlzdEdyb3VwXG4gICAgZmREbmRLZXlib2FyZEdyb3VwXG4gICAgY2xhc3M9XCJmZC1maXhlZC1jYXJkLWxheW91dF9fY2FyZC1sYXlvdXQgZmQtZml4ZWQtY2FyZC1sYXlvdXRfX2NhcmQtbGF5b3V0LS1jb2x1bW5zLXt7IHRoaXMuX251bWJlck9mQ29sdW1ucyB9fVwiXG4gICAgW3N0eWxlLmhlaWdodF09XCJfY29udGFpbmVySGVpZ2h0ICsgJ3B4J1wiXG4gICAgW2dyb3Vwc109XCJfY2FyZENvbHVtbnNcIlxuICAgIG9yaWVudGF0aW9uPVwiaG9yaXpvbnRhbFwiXG4gICAgW2N1c3RvbU1vdmVGbl09XCJfY3VzdG9tTW92ZUZuXCJcbiAgICBbY3VzdG9tVHJhbnNmZXJGbl09XCJfY3VzdG9tVHJhbnNmZXJGblwiXG4gICAgW2Rpc2FibGVLZXlib2FyZERyYWdEcm9wXT1cImRpc2FibGVEcmFnRHJvcFwiXG4gICAgW2Nka0Ryb3BMaXN0R3JvdXBEaXNhYmxlZF09XCJkaXNhYmxlRHJhZ0Ryb3BcIlxuICAgIFthdHRyLmRpcl09XCJfZGlyXCJcbj5cbiAgICA8ZGl2XG4gICAgICAgICpuZ0Zvcj1cImxldCBjYXJkIG9mIF9jYXJkc0FycmF5OyBsZXQgY2FyZEluZGV4ID0gaW5kZXhcIlxuICAgICAgICBjZGtEcm9wTGlzdFxuICAgICAgICBjZGtEcm9wTGlzdFNvcnRpbmdEaXNhYmxlZFxuICAgICAgICBjbGFzcz1cImZkLWZpeGVkLWNhcmQtbGF5b3V0X19jYXJkXCJcbiAgICAgICAgW2NsYXNzLmZkLWZpeGVkLWNhcmQtbGF5b3V0X19jYXJkLS1zaW5nbGVdPVwiX3NpbmdsZUl0ZW1Db2x1bW5zLmhhcyhjYXJkLmZkQ2FyZERlZilcIlxuICAgICAgICBbc3R5bGUubWluLXdpZHRoLnB4XT1cIl9jb2x1bW5zV2lkdGguZ2V0KGNhcmQuZmRDYXJkRGVmKVwiXG4gICAgICAgIFtzdHlsZS5tYXgtd2lkdGgucHhdPVwiX2NvbHVtbnNXaWR0aC5nZXQoY2FyZC5mZENhcmREZWYpXCJcbiAgICAgICAgW2Nka0Ryb3BMaXN0RGF0YV09XCJjYXJkSW5kZXhcIlxuICAgICAgICAoY2RrRHJvcExpc3RFbnRlcmVkKT1cIl9vbkRyb3BMaXN0RW50ZXJlZCgkZXZlbnQpXCJcbiAgICA+XG4gICAgICAgIDxkaXZcbiAgICAgICAgICAgIGNka0RyYWdcbiAgICAgICAgICAgIGZkRG5kS2V5Ym9hcmRJdGVtXG4gICAgICAgICAgICB0YWJpbmRleD1cIjBcIlxuICAgICAgICAgICAgY2RrRHJhZ1ByZXZpZXdDbGFzcz1cImZkLWZpeGVkLWNhcmQtbGF5b3V0X19jYXJkLXByZXZpZXdcIlxuICAgICAgICAgICAgW2Nka0RyYWdEYXRhXT1cImNhcmRcIlxuICAgICAgICAgICAgW2Nka0RyYWdTdGFydERlbGF5XT1cImRyYWdTdGFydERlbGF5XCJcbiAgICAgICAgICAgIFtpdGVtSW5kZXhdPVwiX2l0ZW1JbmRleGVzLmdldChjYXJkLmZkQ2FyZERlZikhXCJcbiAgICAgICAgICAgIFtncm91cEluZGV4XT1cIl9ncm91cEluZGV4ZXMuZ2V0KGNhcmQuZmRDYXJkRGVmKSFcIlxuICAgICAgICAgICAgKGNka0RyYWdEcm9wcGVkKT1cIl9vbkRyYWdEcm9wcGVkKCRldmVudClcIlxuICAgICAgICA+XG4gICAgICAgICAgICA8ZmQtZml4ZWQtY2FyZC1sYXlvdXQtaXRlbT5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiY2FyZD8udGVtcGxhdGUgfHwgbnVsbFwiPiA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDwvZmQtZml4ZWQtY2FyZC1sYXlvdXQtaXRlbT5cblxuICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICpjZGtEcmFnUGxhY2Vob2xkZXJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImZkLWZpeGVkLWNhcmQtbGF5b3V0X19jYXJkLXBsYWNlaG9sZGVyXCJcbiAgICAgICAgICAgICAgICBbc3R5bGUubWFyZ2luLWJvdHRvbS5yZW1dPVwiK19wbGFjZWhvbGRlck1hcmdpblwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImNhcmQ/LnRlbXBsYXRlIHx8IG51bGxcIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGNvbHVtbiBvZiBfY2FyZENvbHVtbnM7IGxldCBsYXN0ID0gbGFzdDsgbGV0IGluZGV4ID0gaW5kZXhcIj5cbiAgICAgICAgPGRpdiAqbmdJZj1cIiFsYXN0XCIgY2xhc3M9XCJmZC1maXhlZC1jYXJkLWxheW91dF9fY2xlYXJmaXhcIiBbc3R5bGUub3JkZXJdPVwiaW5kZXggKyAxXCI+PC9kaXY+XG4gICAgPC9uZy1jb250YWluZXI+XG48L2Rpdj5cbiJdfQ==