fantasy-ngzorro 1.2.19 → 1.3.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.
@@ -3,18 +3,21 @@
3
3
  * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
4
4
  */
5
5
  import * as tslib_1 from "tslib";
6
- import { Component, EventEmitter, Input, Output } from '@angular/core';
6
+ import { ChangeDetectorRef, Component, ElementRef, EventEmitter, Input, Output, QueryList, ViewChildren } from '@angular/core';
7
7
  import { FormBuilder, Validators } from '@angular/forms';
8
8
  import { round } from 'lodash';
9
- import { InputBoolean } from 'ng-zorro-antd';
9
+ import { InputBoolean, NzDatePickerComponent, NzInputNumberComponent, NzRangePickerComponent, NzSelectComponent, NzTimePickerComponent } from 'ng-zorro-antd';
10
10
  import { Subject } from 'rxjs';
11
11
  import { debounceTime } from 'rxjs/operators';
12
+ import { FormLineType } from './hd-form-lines.service';
12
13
  export class HdFormLinesComponent {
13
14
  /**
14
15
  * @param {?} fb
16
+ * @param {?} cdr
15
17
  */
16
- constructor(fb) {
18
+ constructor(fb, cdr) {
17
19
  this.fb = fb;
20
+ this.cdr = cdr;
18
21
  this.tableLoading = false;
19
22
  this.showSearch = false;
20
23
  this.operateButtons = ['add', 'delete'];
@@ -22,7 +25,8 @@ export class HdFormLinesComponent {
22
25
  this.changeEvent = new EventEmitter();
23
26
  this.showDeleteConfirm = false;
24
27
  this.paginationPageIndex = 1;
25
- this.paginationPageSize = 10;
28
+ // TODO:这里暂时变成2条去处理,做完之后需要改成10
29
+ this.paginationPageSize = 3;
26
30
  // 合计区域
27
31
  this.showTotal = false;
28
32
  this.totalOption = [];
@@ -41,6 +45,13 @@ export class HdFormLinesComponent {
41
45
  // 表单当前的状态
42
46
  this.searchSubject = new Subject();
43
47
  this.debounceTimeout = 0; // 默认防抖时间
48
+ // 当前页的dom二维数组
49
+ this.collectDomList = [];
50
+ // 当前聚焦的dom元素坐标
51
+ this.activeDomX = null;
52
+ this.activeDomY = null;
53
+ this.activeDom = null;
54
+ this.activeSelectedComponentOpen = false;
44
55
  this.textWidthCache = {};
45
56
  this.searchSubscription = this.searchSubject.pipe(debounceTime(this.debounceTimeout)).subscribe((/**
46
57
  * @param {?} __0
@@ -56,6 +67,424 @@ export class HdFormLinesComponent {
56
67
  this.storeFormLinesData = this.formLinesData;
57
68
  this.init();
58
69
  }
70
+ /**
71
+ * @return {?}
72
+ */
73
+ ngAfterViewInit() {
74
+ this.collectDomData();
75
+ }
76
+ /**
77
+ * @return {?}
78
+ */
79
+ get formLinesLength() {
80
+ return this.linesFormArray.controls.length;
81
+ }
82
+ /**
83
+ * @return {?}
84
+ */
85
+ collectDomData() {
86
+ this.collectDomList = [];
87
+ /** @type {?} */
88
+ const pageDomList = this.formInputDomList.toArray();
89
+ // Step 1: 获取当前页的数据量
90
+ /** @type {?} */
91
+ const startIndex = (this.paginationPageIndex - 1) * this.paginationPageSize;
92
+ /** @type {?} */
93
+ const endIndex = this.paginationPageIndex * this.paginationPageSize;
94
+ /** @type {?} */
95
+ const adjustedEndIndex = endIndex > this.formLinesLength ? this.formLinesLength : endIndex;
96
+ /** @type {?} */
97
+ const pageLinesLength = adjustedEndIndex - startIndex;
98
+ /** @type {?} */
99
+ const interval = pageDomList.length / pageLinesLength;
100
+ // Step 2: 拆分formInputDomList
101
+ for (let i = 0; i < pageLinesLength; i++) {
102
+ this.collectDomList.push(pageDomList.splice(0, interval));
103
+ }
104
+ // 关闭所有NzInputNumberComponent的键盘上下箭头触发+-的功能
105
+ for (let i = 0; i < this.collectDomList.length; i++) {
106
+ for (let j = 0; j < this.collectDomList[i].length; j++) {
107
+ /** @type {?} */
108
+ const dom = this.collectDomList[i][j];
109
+ if (dom instanceof NzInputNumberComponent) {
110
+ dom.down = (/**
111
+ * @return {?}
112
+ */
113
+ () => { });
114
+ dom.up = (/**
115
+ * @return {?}
116
+ */
117
+ () => { });
118
+ }
119
+ }
120
+ }
121
+ }
122
+ // 聚焦下一个dom
123
+ /**
124
+ * @param {?} x
125
+ * @param {?} y
126
+ * @return {?}
127
+ */
128
+ jumpToNextInput(x, y) {
129
+ if (x === null || y === null || !this.collectDomList || this.collectDomList.length === 0) {
130
+ return;
131
+ }
132
+ // 如果是最后一个可输入元素,新增行
133
+ if (x === this.collectDomList.length - 1 && y === this.collectDomList[0].length - 1) {
134
+ this.addNewLineAndFocus();
135
+ }
136
+ else {
137
+ if (y === this.collectDomList[0].length - 1) {
138
+ // 如果是最后一列,则跳转到下一行第一个输入框
139
+ this.focusDom(x + 1, 0, 'right');
140
+ }
141
+ else {
142
+ // 如果不是最后一列,则跳转到当前行下一个输入框
143
+ this.focusDom(x, y + 1, 'right');
144
+ }
145
+ }
146
+ }
147
+ /**
148
+ * 增加新行并且聚焦到第一个元素,
149
+ * 这里要注意,如果存在翻页情况,需要处理
150
+ * @return {?}
151
+ */
152
+ addNewLineAndFocus() {
153
+ // 当前行为当前页最后一行的时候,判断下一页是否有数据
154
+ // 1、如果有:翻页+聚焦第一行第一个元素
155
+ // 2、如果没有:新增行+翻页+聚焦第一行第一个元素
156
+ if (this.activeDomX === this.paginationPageSize - 1) {
157
+ // 判断下一页是否有数据
158
+ if (this.paginationPageIndex < Math.ceil(this.formLinesLength / this.paginationPageSize)) {
159
+ // 翻页+聚焦第一行第一个元素
160
+ this.paginationPageIndex++;
161
+ setTimeout((/**
162
+ * @return {?}
163
+ */
164
+ () => {
165
+ this.collectDomData();
166
+ this.focusDom(0, 0, 'right');
167
+ }), 0);
168
+ }
169
+ else {
170
+ // 新增行+翻页+聚焦第一行第一个元素
171
+ this.addFormLine();
172
+ this.paginationPageIndex++;
173
+ setTimeout((/**
174
+ * @return {?}
175
+ */
176
+ () => {
177
+ this.collectDomData();
178
+ this.focusDom(0, 0);
179
+ }), 0);
180
+ }
181
+ }
182
+ else {
183
+ this.addFormLine();
184
+ }
185
+ }
186
+ // 聚焦到上一个dom
187
+ /**
188
+ * @param {?} x
189
+ * @param {?} y
190
+ * @return {?}
191
+ */
192
+ jumpToPrevInput(x, y) {
193
+ if (x === null || y === null || !this.collectDomList || this.collectDomList.length === 0) {
194
+ return;
195
+ }
196
+ if (x === 0 && y === 0) {
197
+ // 如果是第一个可输入元素, 判断是否有上一页, 如果有,则翻页+聚焦到上一页最后一个元素
198
+ if (this.paginationPageIndex > 1) {
199
+ // 翻页+聚焦到上一页最后一个元素
200
+ this.paginationPageIndex--;
201
+ setTimeout((/**
202
+ * @return {?}
203
+ */
204
+ () => {
205
+ this.collectDomData();
206
+ this.focusDom(this.collectDomList.length - 1, this.collectDomList[0].length - 1);
207
+ }), 0);
208
+ }
209
+ return;
210
+ }
211
+ else {
212
+ if (y === 0) {
213
+ // 如果是第一列,则跳转到上一行最后一个输入框
214
+ this.focusDom(x - 1, this.collectDomList[0].length - 1, 'left');
215
+ }
216
+ else {
217
+ // 如果不是第一列,则跳转到当前行上一个输入框
218
+ this.focusDom(x, y - 1, 'left');
219
+ }
220
+ }
221
+ }
222
+ /**
223
+ * 聚焦到某个dom
224
+ * @param {?} x 坐标x
225
+ * @param {?} y 坐标y
226
+ * @param {?=} jumpDirection 跳转方向
227
+ * @return {?}
228
+ */
229
+ focusDom(x, y, jumpDirection = 'right') {
230
+ if (x === null || y === null || !this.collectDomList || this.collectDomList.length === 0) {
231
+ return;
232
+ }
233
+ // 先清除一下当前的焦点
234
+ this.cleanFocusDom(this.activeDomX, this.activeDomY);
235
+ if (this.collectDomList[x] && this.collectDomList[x][y]) {
236
+ /** @type {?} */
237
+ const dom = this.collectDomList[x][y];
238
+ // 需要判断下一个focus的dom是否是禁用状态,如果是禁用状态需要跳过
239
+ if (dom instanceof NzSelectComponent) {
240
+ if (dom.nzDisabled) {
241
+ if (jumpDirection === 'right') {
242
+ this.jumpToNextInput(x, y);
243
+ }
244
+ else if (jumpDirection === 'left') {
245
+ this.jumpToPrevInput(x, y);
246
+ }
247
+ return;
248
+ }
249
+ dom.nzSelectTopControlComponent.inputElement.nativeElement.scrollIntoView({ behavior: 'smooth', block: 'center', inline: 'center' });
250
+ // 这里多选框需要额外处理下,因为向下的时候会触发内部Input的聚焦,把下一个dom的focus放到宏任务中,延迟处理。
251
+ if (dom.nzSelectService.mode === 'multiple') {
252
+ setTimeout((/**
253
+ * @return {?}
254
+ */
255
+ () => {
256
+ dom.focus();
257
+ }), 0);
258
+ }
259
+ else {
260
+ dom.focus();
261
+ }
262
+ }
263
+ else if (dom instanceof NzInputNumberComponent) {
264
+ if (dom.nzDisabled) {
265
+ if (jumpDirection === 'right') {
266
+ this.jumpToNextInput(x, y);
267
+ }
268
+ else if (jumpDirection === 'left') {
269
+ this.jumpToPrevInput(x, y);
270
+ }
271
+ return;
272
+ }
273
+ /** @type {?} */
274
+ const inputDom = document.getElementById(dom.nzId);
275
+ inputDom.focus();
276
+ inputDom.scrollIntoView({ behavior: 'smooth', block: 'center', inline: 'center' });
277
+ setTimeout((/**
278
+ * @return {?}
279
+ */
280
+ () => {
281
+ inputDom.select();
282
+ }), 0);
283
+ }
284
+ else if (dom instanceof ElementRef) {
285
+ if (dom.nativeElement.disabled) {
286
+ if (jumpDirection === 'right') {
287
+ this.jumpToNextInput(x, y);
288
+ }
289
+ else if (jumpDirection === 'left') {
290
+ this.jumpToPrevInput(x, y);
291
+ }
292
+ return;
293
+ }
294
+ dom.nativeElement.focus();
295
+ dom.nativeElement.scrollIntoView({ behavior: 'smooth', block: 'center', inline: 'center' });
296
+ setTimeout((/**
297
+ * @return {?}
298
+ */
299
+ () => {
300
+ dom.nativeElement.select();
301
+ }), 0);
302
+ }
303
+ else if (dom instanceof NzDatePickerComponent || dom instanceof NzRangePickerComponent || dom instanceof NzTimePickerComponent) {
304
+ // TODO:在ngzorro8.5.x版本,时间相关的选择器没有暴露出open方法,暂时先不处理。(10.x及以上版本提供了open方法)
305
+ if (jumpDirection === 'right') {
306
+ this.jumpToNextInput(x, y);
307
+ }
308
+ else if (jumpDirection === 'left') {
309
+ this.jumpToPrevInput(x, y);
310
+ }
311
+ return;
312
+ }
313
+ this.setActiveDom(x, y);
314
+ }
315
+ else {
316
+ // 没有dom的场景下,需要判断是左还是右,
317
+ }
318
+ }
319
+ /**
320
+ * @param {?} x
321
+ * @param {?} y
322
+ * @return {?}
323
+ */
324
+ cleanFocusDom(x, y) {
325
+ if (x === null || y === null || !this.collectDomList || this.collectDomList.length === 0) {
326
+ return;
327
+ }
328
+ if (this.collectDomList[x] && this.collectDomList[x][y]) {
329
+ /** @type {?} */
330
+ const dom = this.collectDomList[x][y];
331
+ if (dom instanceof NzSelectComponent) {
332
+ dom.blur();
333
+ dom.nzOpen = false;
334
+ }
335
+ else if (dom instanceof NzInputNumberComponent) {
336
+ dom.nzOpen = false;
337
+ dom.blur();
338
+ }
339
+ else if (dom instanceof ElementRef) {
340
+ dom.nativeElement.blur();
341
+ }
342
+ else { }
343
+ }
344
+ }
345
+ /**
346
+ * @param {?} x
347
+ * @param {?} y
348
+ * @return {?}
349
+ */
350
+ setActiveDom(x, y) {
351
+ this.activeDomX = x;
352
+ this.activeDomY = y;
353
+ this.activeDom = this.collectDomList[this.activeDomX][this.activeDomY];
354
+ if (this.activeDom instanceof NzSelectComponent) {
355
+ this.activeSelectedComponentOpen = this.activeDom.open;
356
+ }
357
+ }
358
+ /**
359
+ * 根据行号和列号名称获取当前聚焦的dom位置
360
+ * @param {?} rowNumber 行号
361
+ * @param {?} colNumber 列号
362
+ * @return {?}
363
+ */
364
+ setActiveDomInFormLines(rowNumber, colNumber) {
365
+ this.activeDomX = rowNumber;
366
+ this.activeDomY = this.getDomIndex(colNumber, this.formLines);
367
+ this.setActiveDom(this.activeDomX, this.activeDomY);
368
+ }
369
+ /**
370
+ * 键盘点击事件
371
+ * @param {?} event 键盘事件
372
+ * @return {?}
373
+ */
374
+ onKeyDown(event) {
375
+ if (this.activeDomX === null || this.activeDomY === null) {
376
+ return;
377
+ }
378
+ switch (event.key) {
379
+ case 'ArrowUp':
380
+ if (this.activeDom instanceof NzSelectComponent && this.activeSelectedComponentOpen) {
381
+ return;
382
+ }
383
+ if (this.activeDomX !== 0) {
384
+ this.focusDom(this.activeDomX - 1, this.activeDomY);
385
+ }
386
+ break;
387
+ case 'ArrowDown':
388
+ // 判断是否在最后一行,如果在最后一行,直接+行翻页
389
+ if (this.activeDom instanceof NzSelectComponent && this.activeSelectedComponentOpen) {
390
+ return;
391
+ }
392
+ if (this.activeDomX !== this.collectDomList.length - 1) {
393
+ this.focusDom(this.activeDomX + 1, this.activeDomY);
394
+ }
395
+ break;
396
+ case 'ArrowLeft':
397
+ this.jumpToPrevInput(this.activeDomX, this.activeDomY);
398
+ break;
399
+ case 'ArrowRight':
400
+ this.jumpToNextInput(this.activeDomX, this.activeDomY);
401
+ break;
402
+ case 'Enter':
403
+ if (this.activeDom instanceof NzSelectComponent) {
404
+ this.activeSelectedComponentOpen = this.activeDom.open;
405
+ if (this.activeSelectedComponentOpen === false) {
406
+ this.focusDom(this.activeDomX, this.activeDomY);
407
+ }
408
+ break;
409
+ }
410
+ if (this.activeDomX === this.collectDomList.length - 1) {
411
+ this.addNewLineAndFocus();
412
+ }
413
+ break;
414
+ case 'Escape':
415
+ if (this.activeDom instanceof NzSelectComponent) {
416
+ /** @type {?} */
417
+ const nowActiveDom = (/** @type {?} */ (this.activeDom));
418
+ setTimeout((/**
419
+ * @return {?}
420
+ */
421
+ () => {
422
+ this.activeSelectedComponentOpen = nowActiveDom.open;
423
+ if (this.activeSelectedComponentOpen === false) {
424
+ if (nowActiveDom.nzSelectService.mode === 'multiple') {
425
+ setTimeout((/**
426
+ * @return {?}
427
+ */
428
+ () => {
429
+ this.focusDom(this.activeDomX, this.activeDomY);
430
+ }), 0);
431
+ }
432
+ else {
433
+ this.focusDom(this.activeDomX, this.activeDomY);
434
+ }
435
+ }
436
+ }), 0);
437
+ }
438
+ break;
439
+ default:
440
+ // 如果当前聚焦的是选择框,且键入0-9a-zA-Z,则弹出
441
+ if (this.activeDom instanceof NzSelectComponent && this.activeSelectedComponentOpen === false && /^[0-9a-zA-Z]$/.test(event.key)) {
442
+ /** @type {?} */
443
+ const dom = this.activeDom;
444
+ dom.nzOpen = true;
445
+ this.activeSelectedComponentOpen = true;
446
+ // // TODO:这里暂时注释,不能直接带入键入值,这样会导致输入中文的时候带入英文字符,不符合预期
447
+ // dom.nzSelectTopControlComponent.inputValue = event.key;
448
+ // // 获取 input 元素
449
+ // const inputElement = dom.nzSelectTopControlComponent.inputElement.nativeElement;
450
+ // setTimeout(() => {
451
+ // // 触发输入事件,以确保 Angular 检测到值的变化
452
+ // const eventInput = new Event('input', { bubbles: true });
453
+ // inputElement.dispatchEvent(eventInput);
454
+ // }, 0);
455
+ }
456
+ break;
457
+ }
458
+ }
459
+ /**
460
+ * 根据在初始dom下标和数据集 获取在collectDomList中的下标
461
+ * @private
462
+ * @param {?} index 初始下标
463
+ * @param {?} list 数据集
464
+ * @return {?}
465
+ */
466
+ getDomIndex(index, list) {
467
+ /** @type {?} */
468
+ const typeList = ['Input', 'Select', 'Date', 'DateRange', 'TextArea', 'InputNumber', 'MultipleSelect'];
469
+ /** @type {?} */
470
+ let filterList = [];
471
+ for (let i = 0; i < list.length; i++) {
472
+ if (i === index) {
473
+ return filterList.length;
474
+ }
475
+ if (typeList.includes(list[i].type)) {
476
+ filterList.push(list[i]);
477
+ }
478
+ }
479
+ return null;
480
+ }
481
+ // TODO:待删
482
+ /**
483
+ * @return {?}
484
+ */
485
+ testPage() {
486
+ this.paginationPageIndex++;
487
+ }
59
488
  /**
60
489
  * @return {?}
61
490
  */
@@ -155,14 +584,18 @@ export class HdFormLinesComponent {
155
584
  * @param {?} value
156
585
  * @return {?}
157
586
  */
158
- value => this.triggerEvent(item.onChangeEvent, value, formGroupTmp)));
587
+ value => {
588
+ this.triggerEvent(item.onChangeEvent, value, formGroupTmp);
589
+ }));
159
590
  }
160
591
  else {
161
592
  formGroupTmp.get(item.name).valueChanges.subscribe((/**
162
593
  * @param {?} value
163
594
  * @return {?}
164
595
  */
165
- value => this.triggerEvent(item.onChangeEvent, value, formGroupTmp)));
596
+ value => {
597
+ this.triggerEvent(item.onChangeEvent, value, formGroupTmp);
598
+ }));
166
599
  }
167
600
  }
168
601
  }));
@@ -273,13 +706,10 @@ export class HdFormLinesComponent {
273
706
  * @return {?}
274
707
  */
275
708
  ngOnChanges(changes) {
276
- console.log('changes', changes);
277
709
  if (changes['formLinesData'] && JSON.stringify(changes['formLinesData'].currentValue) !== JSON.stringify(changes['formLinesData'].previousValue)) {
278
710
  if (this.storeFormLinesData && this.storeFormLinesData.length === 0) {
279
- console.log('1');
280
711
  this.storeFormLinesData = this.formLinesData;
281
712
  }
282
- console.log('2');
283
713
  this.init();
284
714
  }
285
715
  if (changes['totalOption'] && JSON.stringify(changes['totalOption'].currentValue) !== JSON.stringify(changes['totalOption'].previousValue)) {
@@ -372,9 +802,10 @@ export class HdFormLinesComponent {
372
802
  let formGroupSubmit = this.fb.group(formGroupObj);
373
803
  this.formLines.forEach((/**
374
804
  * @param {?} item
805
+ * @param {?} innerIndex
375
806
  * @return {?}
376
807
  */
377
- (item) => {
808
+ (item, innerIndex) => {
378
809
  if (item.onChangeEvent) {
379
810
  if (item.onChangeEvent) {
380
811
  if (item.onChangeEventDebounceTime) {
@@ -382,14 +813,24 @@ export class HdFormLinesComponent {
382
813
  * @param {?} value
383
814
  * @return {?}
384
815
  */
385
- value => this.triggerEvent(item.onChangeEvent, value, formGroupSubmit)));
816
+ value => {
817
+ if (item.type === FormLineType.Select && value !== null) {
818
+ this.jumpToNextInput(this.activeDomX, this.activeDomY);
819
+ }
820
+ this.triggerEvent(item.onChangeEvent, value, formGroupSubmit);
821
+ }));
386
822
  }
387
823
  else {
388
824
  formGroupSubmit.get(item.name).valueChanges.subscribe((/**
389
825
  * @param {?} value
390
826
  * @return {?}
391
827
  */
392
- value => this.triggerEvent(item.onChangeEvent, value, formGroupSubmit)));
828
+ value => {
829
+ if (item.type === FormLineType.Select && value !== null) {
830
+ this.jumpToNextInput(this.activeDomX, this.activeDomY);
831
+ }
832
+ this.triggerEvent(item.onChangeEvent, value, formGroupSubmit);
833
+ }));
393
834
  }
394
835
  }
395
836
  }
@@ -417,9 +858,10 @@ export class HdFormLinesComponent {
417
858
  addFormLineWithData() {
418
859
  this.formLinesData.forEach((/**
419
860
  * @param {?} formLinesDataItem
861
+ * @param {?} index
420
862
  * @return {?}
421
863
  */
422
- (formLinesDataItem) => {
864
+ (formLinesDataItem, index) => {
423
865
  /** @type {?} */
424
866
  let formGroupObj = {};
425
867
  this.formLines.forEach((/**
@@ -438,9 +880,10 @@ export class HdFormLinesComponent {
438
880
  let formGroupTmp = this.fb.group(formGroupObj);
439
881
  this.formLines.forEach((/**
440
882
  * @param {?} item
883
+ * @param {?} innerIndex
441
884
  * @return {?}
442
885
  */
443
- (item) => {
886
+ (item, innerIndex) => {
444
887
  if (item.onChangeEvent) {
445
888
  if (item.onChangeEventDebounceTime) {
446
889
  formGroupTmp.get(item.name).valueChanges.pipe(debounceTime(item.onChangeEventDebounceTime)).subscribe((/**
@@ -448,6 +891,9 @@ export class HdFormLinesComponent {
448
891
  * @return {?}
449
892
  */
450
893
  value => {
894
+ if (item.type === FormLineType.Select && value !== null) {
895
+ this.jumpToNextInput(this.activeDomX, this.activeDomY);
896
+ }
451
897
  this.triggerEvent(item.onChangeEvent, value, formGroupTmp);
452
898
  }));
453
899
  }
@@ -457,6 +903,9 @@ export class HdFormLinesComponent {
457
903
  * @return {?}
458
904
  */
459
905
  value => {
906
+ if (item.type === FormLineType.Select && value !== null) {
907
+ this.jumpToNextInput(this.activeDomX, this.activeDomY);
908
+ }
460
909
  this.triggerEvent(item.onChangeEvent, value, formGroupTmp);
461
910
  }));
462
911
  }
@@ -474,6 +923,20 @@ export class HdFormLinesComponent {
474
923
  addFormLine(index) {
475
924
  this.linesFormArray.insert(index || this.linesFormArray.controls.length, this.newLineItem());
476
925
  this.calculateLineNumber();
926
+ setTimeout((/**
927
+ * @return {?}
928
+ */
929
+ () => {
930
+ this.collectDomData();
931
+ if (index !== null && index !== undefined) {
932
+ this.activeDomX = index;
933
+ }
934
+ else {
935
+ this.activeDomX = this.collectDomList.length - 1;
936
+ }
937
+ this.activeDomY = 0;
938
+ this.focusDom(this.activeDomX, this.activeDomY);
939
+ }), 0);
477
940
  }
478
941
  /**
479
942
  * @param {?} index
@@ -491,6 +954,12 @@ export class HdFormLinesComponent {
491
954
  }
492
955
  this.calculateLineNumber();
493
956
  }
957
+ setTimeout((/**
958
+ * @return {?}
959
+ */
960
+ () => {
961
+ this.collectDomData();
962
+ }), 0);
494
963
  }
495
964
  /**
496
965
  * @param {?} event
@@ -498,6 +967,12 @@ export class HdFormLinesComponent {
498
967
  */
499
968
  pageIndexChange(event) {
500
969
  this.paginationPageIndex = event;
970
+ setTimeout((/**
971
+ * @return {?}
972
+ */
973
+ () => {
974
+ this.collectDomData();
975
+ }), 0);
501
976
  }
502
977
  /**
503
978
  * @param {?} event
@@ -505,6 +980,12 @@ export class HdFormLinesComponent {
505
980
  */
506
981
  pageSizeChange(event) {
507
982
  this.paginationPageSize = event;
983
+ setTimeout((/**
984
+ * @return {?}
985
+ */
986
+ () => {
987
+ this.collectDomData();
988
+ }), 0);
508
989
  }
509
990
  /**
510
991
  * @private
@@ -702,12 +1183,15 @@ export class HdFormLinesComponent {
702
1183
  }
703
1184
  /**
704
1185
  * @param {?} id
1186
+ * @param {?} rowNumber
1187
+ * @param {?} colNumber
705
1188
  * @return {?}
706
1189
  */
707
- selectValue(id) {
1190
+ selectValue(id, rowNumber, colNumber) {
708
1191
  /** @type {?} */
709
1192
  const inputDom = document.querySelector(id);
710
1193
  inputDom.select();
1194
+ this.setActiveDomInFormLines(rowNumber, colNumber);
711
1195
  }
712
1196
  /**
713
1197
  * @param {?} text
@@ -752,15 +1236,17 @@ export class HdFormLinesComponent {
752
1236
  HdFormLinesComponent.decorators = [
753
1237
  { type: Component, args: [{
754
1238
  selector: 'hd-form-lines',
755
- template: "<hd-button-group *ngIf=\"showForm && showSearch\">\n <ng-template #buttonGroupLeft>\n <nz-input-group [nzSuffix]=\"suffixIconSearch\">\n <input type=\"text\" nz-input (keyup.enter)=\"searchLines()\" placeholder=\"\u8BF7\u8F93\u5165\u5185\u5BB9\u641C\u7D22\" style=\"width: 300px;\"\n [(ngModel)]=\"filterStr\" />\n </nz-input-group>\n <ng-template #suffixIconSearch>\n <i nz-icon nzType=\"search\" (click)=\"searchLines()\"></i>\n </ng-template>\n </ng-template>\n</hd-button-group>\n<hd-space background=\"transparent\" type=\"row\" size=\"16\"></hd-space>\n<form *ngIf=\"showForm\" nz-form [formGroup]=\"validateHdFormLines\"\n class=\"ant-advanced-search-form hd-formLines-container\">\n <nz-table nzTemplateMode [nzFrontPagination]=\"false\" [nzLoading]=\"tableLoading\" [nzScroll]=\"scroll\">\n <thead>\n <tr>\n <th nzWidth=\"58px\" nzLeft=\"0px\">\u5E8F\u53F7</th>\n <ng-container *ngFor=\"let item of formLines\">\n <th *ngIf=\"!item.hide\" [nzAlign]=\"item.align ? item.align : 'left'\">\n <span *ngIf=\"item.require\" style=\"color: red;\">*</span>{{item.label}}\n </th>\n </ng-container>\n <th style=\"width: 80px\" nzRight=\"0\">\u64CD\u4F5C</th>\n </tr>\n </thead>\n <tbody>\n <ng-container\n *ngFor=\"let line of linesFormArray.controls.slice((paginationPageIndex - 1) * paginationPageSize, (paginationPageIndex - 1) * paginationPageSize + paginationPageSize);index as dataIndex\"\n formArrayName=\"lines\">\n <tr [formGroup]=\"line\">\n <td nzWidth=\"58px\" nzLeft=\"0px\">\n {{line.get('lineIndex').value}}\n </td>\n <ng-container *ngFor=\"let formItem of formLines\">\n <td *ngIf=\"!formItem.hide\" [nzAlign]=\"formItem.align ? formItem.align : 'left'\">\n <nz-form-item>\n <nz-form-control [nzErrorTip]=\"formItem.label + '\u4E0D\u80FD\u4E3A\u7A7A'\">\n <ng-container [ngSwitch]=\"formItem.type\">\n <ng-container *ngSwitchCase=\"0\">\n <nz-input-group [nzSuffix]=\"inputCleanTemplate\">\n <input [ngStyle]=\"getStyle(line, formItem, '100px')\" nz-input\n [ngStyle]=\"{'color': formItem?.colorOption?.name ? line.get(formItem.colorOption.name ).value : null}\"\n [id]=\"'input-' + formItem.name + line.get('lineIndex').value\"\n (click)=\"formItem.isSelect ? selectValue('#input-' + formItem.name + line.get('lineIndex').value) : null\"\n [maxlength]=\"formItem.maxLength || null\"\n [placeholder]=\"formItem.placeholder ? formItem.placeholder : '\u8BF7\u8F93\u5165' + formItem.label\"\n [formControlName]=\"formItem.name\" />\n </nz-input-group>\n <ng-template #inputCleanTemplate>\n <i nz-icon nz-tooltip class=\"ant-input-clear-icon\" nzTheme=\"fill\" nzType=\"close-circle\"\n *ngIf=\"line.get(formItem.name).value && !line.get(formItem.name).disabled\"\n (click)=\"inputClean(formItem ,line)\"></i>\n </ng-template>\n </ng-container>\n <ng-container *ngSwitchCase=\"1\">\n <nz-select nzDropdownClassName=\"hd-select-table\"\n *ngIf=\"formItem.selectOption.tableColumns;else nomarlSelectTemplate\"\n [nzShowSearch]=\"formItem.selectOption.hdShowSearch != null ? formItem.selectOption.hdShowSearch : true\"\n [nzAllowClear]=\"formItem.selectOption.hdAllowClear != null ? formItem.selectOption.hdAllowClear : true\"\n [nzServerSearch]=\"formItem.selectOption.hdServerSearch || false\"\n [nzDropdownMatchSelectWidth]=\"formItem.selectOption.hdDropdownMatchSelectWidth ? formItem.selectOption.hdDropdownMatchSelectWidth : false\"\n [nzPlaceHolder]=\"formItem.placeholder ? formItem.placeholder : '\u8BF7\u9009\u62E9' + formItem.label\"\n [formControlName]=\"formItem.name\"\n (nzOnSearch)=\"onSearchEvent(formItem.onSearchEvent || null, $event, line, formItem.onSearchEventEventDebounceTime)\"\n [ngStyle]=\"getStyle(line, formItem, '200px')\">\n <nz-option nzCustomContent nzDisabled>\n <div class=\"hd-option-header\"\n *ngIf=\"(formItem.selectOption?.selectList?.length > 0 || line.get(formItem.selectOption.selectListName)?.value?.length > 0);else emptyTemplate\">\n <div class=\"hd-option-header-column\"\n *ngFor=\"let selectOptionTableColumn of formItem.selectOption.tableColumns;index as index \"\n [ngStyle]=\"{'width': selectOptionTableColumn?.width ? (selectOptionTableColumn.width + ((index === 0 && !selectOptionTableColumn.label) ? 12 : 0) + 'px') : 'unset'}\">\n {{selectOptionTableColumn.label}}\n </div>\n </div>\n <ng-template #emptyTemplate>\n <div class=\"hd-select-empty\">\n <img\n src=\"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iNjRweCIgaGVpZ2h0PSI0MXB4IiB2aWV3Qm94PSIwIDAgNjQgNDEiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiAgICA8IS0tIEdlbmVyYXRvcjogU2tldGNoIDUyLjUgKDY3NDY5KSAtIGh0dHA6Ly93d3cuYm9oZW1pYW5jb2RpbmcuY29tL3NrZXRjaCAtLT4KICAgIDxnIHN0cm9rZT0ibm9uZSIgc3Ryb2tlLXdpZHRoPSIxIiBmaWxsPSJub25lIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiPgogICAgICAgIDxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKC00NzIuMDAwMDAwLCAtMTMzNS4wMDAwMDApIj4KICAgICAgICAgICAgPGcgIHRyYW5zZm9ybT0idHJhbnNsYXRlKDY0LjAwMDAwMCwgMTExNC4wMDAwMDApIj4KICAgICAgICAgICAgICAgIDxnICB0cmFuc2Zvcm09InRyYW5zbGF0ZSg0MC4wMDAwMDAsIDc4LjAwMDAwMCkiPgogICAgICAgICAgICAgICAgICAgIDxnICB0cmFuc2Zvcm09InRyYW5zbGF0ZSgzNjguMDAwMDAwLCAxNDQuMDAwMDAwKSI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxnID4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlbGxpcHNlICBmaWxsPSIjRjVGNUY1IiBjeD0iMzIiIGN5PSIzMyIgcng9IjMyIiByeT0iNyI+PC9lbGxpcHNlPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGcgICB0cmFuc2Zvcm09InRyYW5zbGF0ZSg5LjAwMDAwMCwgMC4wMDAwMDApIiBmaWxsLXJ1bGU9Im5vbnplcm8iIHN0cm9rZT0iI0Q5RDlEOSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD0iTTQ2LDEyLjc2MDU2MDQgTDM1Ljg1NDMwNDcsMS4yNTczOTYzMyBDMzUuMzY3NDQxNCwwLjQ3MzgyNjYwNSAzNC42NTU4Nzg5LDAgMzMuOTA2NzYxNywwIEwxMi4wOTMyMzgzLDAgQzExLjM0NDEyMTEsMCAxMC42MzI1NTg2LDAuNDczOTUwMjU1IDEwLjE0NTY5NTMsMS4yNTczOTYzMyBMMi42MTQ3OTcyN2UtMTIsMTIuNzYwNTYwNCBMMCwyMiBMNDYsMjIgTDQ2LDEyLjc2MDU2MDQgWiIgID48L3BhdGg+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD0iTTMyLjYxMzI4MTMsMTUuOTMxNSBDMzIuNjEzMjgxMywxNC4zMjU4NTExIDMzLjYwNjk1MzEsMTMuMDAwMjM0IDM0LjgzOTY5OTIsMTMgTDQ2LDEzIEw0NiwzMS4xMzcxMjc3IEM0NiwzMy4yNTg5NTc0IDQ0LjY3OTM4NjcsMzUgNDMuMDUwNDI5NywzNSBMMi45NDk1NzAzMSwzNSBDMS4zMjA1MjM0NCwzNSAwLDMzLjI1ODg0MDQgMCwzMS4xMzcxMjc3IEwwLDEzIEwxMS4xNjAzMDA4LDEzIEMxMi4zOTMwNDY5LDEzIDEzLjM4NjcxODgsMTQuMzIyODA4NSAxMy4zODY3MTg4LDE1LjkyODQ1NzQgTDEzLjM4NjcxODgsMTUuOTQ5NjM4MyBDMTMuMzg2NzE4OCwxNy41NTUyODcyIDE0LjM5MTcxMDksMTguODUxMTgwOSAxNS42MjQ0NTcsMTguODUxMTgwOSBMMzAuMzc1NTQzLDE4Ljg1MTE4MDkgQzMxLjYwODI4OTEsMTguODUxMTgwOSAzMi42MTMyODEzLDE3LjU0MzM1MTEgMzIuNjEzMjgxMywxNS45Mzc3MDIxIEwzMi42MTMyODEzLDE1LjkzMTUgWiIgIGZpbGw9IiNGQUZBRkEiPjwvcGF0aD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZz4KICAgICAgICAgICAgICAgICAgICAgICAgPC9nPgogICAgICAgICAgICAgICAgICAgIDwvZz4KICAgICAgICAgICAgICAgIDwvZz4KICAgICAgICAgICAgPC9nPgogICAgICAgIDwvZz4KICAgIDwvZz4KPC9zdmc+\"\n alt=\"empty\">\n <p class=\"ant-empty-description\">\u6682\u65E0\u6570\u636E</p>\n </div>\n </ng-template>\n </nz-option>\n\n <nz-option nzCustomContent\n *ngFor=\"let selectItem of (formItem.selectOption.selectList || line.get(formItem.selectOption.selectListName).value)\"\n [nzValue]=\"selectItem[formItem.selectOption.value]\" [nzLabel]=\"formItem.selectOption.showLabelAndValue ? '['+ selectItem[formItem.selectOption.value] +']' +\n selectItem[formItem.selectOption.label] : selectItem[formItem.selectOption.label]\">\n <div class=\"hd-option-line\">\n <div *ngFor=\"let selectOptionTableColumn of formItem.selectOption.tableColumns\"\n [ngStyle]=\"{'width': selectOptionTableColumn?.width ? selectOptionTableColumn.width + 'px' : 'unset'}\">\n <ng-container *ngIf=\"selectOptionTableColumn.icons;else notPictureTemplate\">\n <ng-container *ngFor=\"let icon of selectOptionTableColumn.icons\">\n <img *ngIf=\"icon.iconName === 'hd-recommend-star' && selectItem[icon.fieldName]\"\n src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAVpJREFUOE+l07FLQkEcB/Dv7713Zg1GQ0SgW9AmTYVp1BRUokZBEI1u/QVBUBD1D0Rt0dQaPYmotXza1tKQzQ1Fk0iDHr5vPEOTUpO88e77+9zvjjtBh8HTOb8e0hu0eN8Xzz22ikonoGzHdgXcAVB16S75U/mbn/m2AK+mglqbBUAGvCIRuVCJ7HLXQCUTPQOxXi8Q4FolnYWuAH0+HaEpjrdxAyC3VSq33xKgPTWiYYUai8IjUCabw4Zw1XWNF2+OZrXoi+cLImBth4odfQAw0elCW6zdKvU2/wVkYs8ggzBlRqrcI/DrrK1wQ7DWAIToV8lsqGxHDwTY6qYbA1jpCVAux3oBSirhDPYCOL6kE/s/QB77UrnNJoDDVkCN6pI+BJH+6xINQdpKOCf1d/AEYBxgUUQC5PcLbPMDXy1lhGXx7r0G6ExklpBwI0xh2w7ID+UzL71iL/MJdzuZdDL/kXcAAAAASUVORK5CYII=\"\n style=\"width: 16px;height: 16px;\">\n <img *ngIf=\"icon.iconName === 'hd-img-star' && selectItem[icon.fieldName]\"\n src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAyhJREFUWEe1ll1o1XYYxp8nPUmUihdCV3bAirvYzUC80Xpy3KwTZNR2CdOhDkTBwe6G32XzwqpjE3Qt4pUKZQqDyQZNTp1uY8yCJG0F2d2+LlWOOkShovQkaV45lcJpTdOTHJubBPI+z/Pj//H+/0TGR66uf8sPoz8A/Kstkp38YORxFitmEVU1vm1cBPlp9ZuQXtX0jmfxygQgvxSWBRWlDECvhgrwQFuqLufG4TAtRCaAwCl+IcDXtWEi2KFb7pUFBxCBEpSMMsDWGWEiNzXLe2/BASp2cTuJH+KCRMJ3dGvsrzQQqafAtw0XpBEfIhc00/tswQD8QWM1FP45d4A8V9XJN9k5Nl4vRKoR8G3jMshdyebRPs0cOftaAaRUbAsRrRRRhuczFsF/lPATNQrL3Hr7/nz1lGvvtkwGUSEC8gLkWfMGkAfQMp9J0n8ByhS5J+QDVr+BshBlUu6q3d5v9G3jIcg3GgnJqp2C853iCIB1WU0a1F2iOO2tPnK3CLQ1aJZKLpCfddPrmtoF8uuqZn9iyfcEzVQumYtlQDO9vS8PsprHd4xvAR7I7FuHUIBvdNP9crr0lT7g24U+UNlfh1f6Esrn2ofeuVphbCPyneJuAN+lT0jokZCduum9cobM2Qn9krEGEa6+hi36jEC3aro34vASW3FoG9si8sdGRoKCY6rlnpjLIxGgYhunSPY0AiAiP+mW93EmAN8ujoJobwgAuKOb7orUAHKjY1EwHjwFkGsEoKpVJ6WVH3n/p1oDwVBhk0TK742GV/UKYOZMt5QKoGIbX5E8mgwg4wCbADQn1c1uPvP2gWqB7xjDADck7OwBVan0QFFyQaj2A9wxV60A13XT7Uw1Ar5TlDiBQP6hRHs0a3Ss9n8wuK4jYtN5Em/H6B5ppht7r4jvhEOFtYiUGQEAnhDoV033ZNJwB45xRAS9IBfX1qnhRD7uhhQLENiFQ0Ll9LSBCM7olnu43gUpTjEfiPSB3D6tUQRbcpZ7bbZHLEBYKnRFogxV505rmjzIrtG/6w2fMS0l430RHAVoULBZtdybdQFkCcuqSXUtzxqSpHsBfmUdgJhaiDQAAAAASUVORK5CYII=\"\n style=\"width: 16px;height: 16px;\">\n </ng-container>\n </ng-container>\n <ng-template #notPictureTemplate>\n <ng-container\n *ngIf=\"!isTextOverflow(selectOptionTableColumn.render ? selectOptionTableColumn.render(selectItem) : selectItem[selectOptionTableColumn.name], selectOptionTableColumn.width);else overflowTemplate\">\n <div>{{ judgeColEmpty(selectOptionTableColumn.render ?\n selectOptionTableColumn.render(selectItem) :\n selectItem[selectOptionTableColumn.name])}}</div>\n </ng-container>\n <ng-template #overflowTemplate>\n <div class=\"hd-option-overflow\" nz-tooltip\n [nzTooltipTitle]=\"selectOptionTableColumn.render ? selectOptionTableColumn.render(selectItem) : selectItem[selectOptionTableColumn.name]\">\n {{\n judgeColEmpty(selectOptionTableColumn.render ?\n selectOptionTableColumn.render(selectItem) :\n selectItem[selectOptionTableColumn.name])}}</div>\n </ng-template>\n </ng-template>\n </div>\n </div>\n </nz-option>\n <nz-option\n *ngIf=\"formItem.selectOption.label && line.get(formItem.name) && line.get(formItem.selectOption.label)?.value && line.get(formItem.selectOption.value)?.value\"\n [nzLabel]=\"(formItem.selectOption.value === 'code' || formItem.selectOption.value === 'productCode' || formItem.selectOption.hdShowItemCode) ? ('['+ line.get(formItem.selectOption.value).value + ']' + line.get(formItem.selectOption.label).value) : line.get(formItem.selectOption.label).value\"\n [nzValue]=\"line.get(formItem.selectOption.value).value\" nzHide></nz-option>\n </nz-select>\n <ng-template #nomarlSelectTemplate>\n <nz-select\n [nzShowSearch]=\"formItem.selectOption.hdShowSearch != null ? formItem.selectOption.hdShowSearch : true\"\n [nzAllowClear]=\"formItem.selectOption.hdAllowClear != null ? formItem.selectOption.hdAllowClear : true\"\n [nzServerSearch]=\"formItem.selectOption.hdServerSearch || false\"\n [nzDropdownMatchSelectWidth]=\"formItem.selectOption.hdDropdownMatchSelectWidth ? formItem.selectOption.hdDropdownMatchSelectWidth : false\"\n [nzPlaceHolder]=\"formItem.placeholder ? formItem.placeholder : '\u8BF7\u9009\u62E9' + formItem.label\"\n [formControlName]=\"formItem.name\"\n (nzOnSearch)=\"onSearchEvent(formItem.onSearchEvent || null, $event, line, formItem.onSearchEventEventDebounceTime)\"\n [ngStyle]=\"getStyle(line, formItem, '200px')\">\n <nz-option\n *ngFor=\"let selectItem of (formItem.selectOption.selectList || line.get(formItem.selectOption.selectListName).value)\"\n [nzValue]=\"selectItem[formItem.selectOption.value]\" [nzLabel]=\"formItem.selectOption.showLabelAndValue ? '['+ selectItem[formItem.selectOption.value] +']' +\n selectItem[formItem.selectOption.label] : selectItem[formItem.selectOption.label]\">\n </nz-option>\n <nz-option\n *ngIf=\"formItem.selectOption.label && line.get(formItem.name) && line.get(formItem.selectOption.label)?.value && line.get(formItem.selectOption.value)?.value\"\n [nzLabel]=\"(formItem.selectOption.value === 'code' || formItem.selectOption.value === 'productCode' || formItem.selectOption.hdShowItemCode) ? ('['+ line.get(formItem.selectOption.value).value + ']' + line.get(formItem.selectOption.label).value) : line.get(formItem.selectOption.label).value\"\n [nzValue]=\"line.get(formItem.selectOption.value).value\" nzHide></nz-option>\n </nz-select>\n </ng-template>\n\n </ng-container>\n <ng-container *ngSwitchCase=\"2\">\n <nz-date-picker *ngIf=\"formItem.showTime\"\n [nzPlaceHolder]=\"formItem.placeholder ? formItem.placeholder : '\u8BF7\u9009\u62E9' + formItem.label\"\n [formControlName]=\"formItem.name\" [nzDisabledDate]=\"formItem.hdDisabledDate\" nzShowTime\n nzFormat=\"yyyy-MM-dd HH:mm:ss\">\n </nz-date-picker>\n <nz-date-picker *ngIf=\"!formItem.showTime\"\n [nzPlaceHolder]=\"formItem.placeholder ? formItem.placeholder : '\u8BF7\u9009\u62E9' + formItem.label\"\n [formControlName]=\"formItem.name\" [nzDisabledDate]=\"formItem.hdDisabledDate\">\n </nz-date-picker>\n </ng-container>\n <ng-container *ngSwitchCase=\"3\">\n <nz-range-picker [nzPlaceHolder]=\"['\u5F00\u59CB\u65E5\u671F','\u7ED3\u675F\u65E5\u671F']\" [formControlName]=\"formItem.name\">\n </nz-range-picker>\n </ng-container>\n <ng-container *ngSwitchCase=\"4\">\n <textarea\n [ngStyle]=\"{'color': formItem?.colorOption?.name ? line.get(formItem.colorOption.name).value : null}\"\n [placeholder]=\"formItem.placeholder ? formItem.placeholder : '\u8BF7\u8F93\u5165' + formItem.label\"\n [maxlength]=\"formItem.maxLength || null\" rows=\"4\" nz-input\n [maxlength]=\"formItem.maxLength || null\" [formControlName]=\"formItem.name\"></textarea>\n </ng-container>\n <ng-container *ngSwitchCase=\"5\">\n <div style=\"display: flex;align-items: center;\">\n <nz-input-number [ngStyle]=\"getStyle(line, formItem, '100px')\"\n [maxlength]=\"formItem.maxLength || null\" [formControlName]=\"formItem.name\"\n [nzMin]=\"formItem?.inputNumber?.min || 0\" [nzMax]=\"formItem?.inputNumber?.max || 99999999\"\n [nzStep]=\"formItem?.inputNumber?.step || 1\"\n [nzPrecision]=\"formItem?.inputNumber?.precision || 2\"\n [nzPlaceHolder]=\"formItem.placeholder ? formItem.placeholder : '\u8BF7\u8F93\u5165' + formItem.label\"\n [nzId]=\"'inputNumber-' + formItem.name + line.get('lineIndex').value\"\n (click)=\"formItem.isSelect ? selectValue('#inputNumber-' + formItem.name + line.get('lineIndex').value) : null\">\n </nz-input-number>\n <div *ngIf=\"formItem?.explainOptionRight?.show\"\n [style.color]=\"formItem?.explainOptionRight?.color ? formItem.explainOptionRight.color : null\">\n &nbsp;&nbsp;{{line.get(formItem.explainOptionRight.name).value}}</div>\n </div>\n </ng-container>\n <ng-container *ngSwitchCase=\"6\">\n <nz-select nzMode=\"multiple\" [nzServerSearch]=\"formItem.selectOption.hdServerSearch || false\"\n [nzDropdownMatchSelectWidth]=\"formItem.selectOption.hdDropdownMatchSelectWidth ? formItem.selectOption.hdDropdownMatchSelectWidth : false\"\n [nzShowSearch]=\"formItem.selectOption.hdShowSearch != null ? formItem.selectOption.hdShowSearch : true\"\n [nzAllowClear]=\"formItem.selectOption.hdAllowClear != null ? formItem.selectOption.hdAllowClear : true\"\n [nzPlaceHolder]=\"formItem.placeholder ? formItem.placeholder : '\u8BF7\u9009\u62E9' + formItem.label\"\n [formControlName]=\"formItem.name\" [ngStyle]=\"getStyle(line, formItem, '200px')\"\n (nzOnSearch)=\"onSearchEvent(formItem.onSearchEvent || null, $event, line, formItem.onSearchEventEventDebounceTime)\">\n <nz-option *ngFor=\"let selectItem of formItem.selectOption.selectList\"\n [nzValue]=\"selectItem[formItem.selectOption.value]\" [nzLabel]=\"formItem.selectOption.showLabelAndValue ? '['+ selectItem[formItem.selectOption.value] +']' +\n selectItem[formItem.selectOption.label] : selectItem[formItem.selectOption.label]\"></nz-option>\n <ng-container\n *ngIf=\"formItem.selectOption.label && line.get(formItem.name) && line.get(formItem.selectOption.label)?.value && line.get(formItem.selectOption.value)?.value\">\n <nz-option *ngFor=\"let option of line.get(formItem.selectOption.value).value;index as i\"\n [nzLabel]=\"line.get(formItem.selectOption.label).value[i]\" [nzValue]=\"option\" nzHide>\n </nz-option>\n </ng-container>\n </nz-select>\n </ng-container>\n <ng-container *ngSwitchCase=\"7\">\n {{(formItem.preserveNumber && line.get(formItem.name).value) ?\n LodashRound(line.get(formItem.name).value,formItem.preserveNumber).toFixed(formItem.preserveNumber)\n : line.get(formItem.name).value}}\n </ng-container>\n <ng-container *ngSwitchCase=\"8\">\n <nz-switch [formControlName]=\"formItem.name\"></nz-switch>\n </ng-container>\n <ng-container *ngSwitchCase=\"9\">\n <nz-time-picker [formControlName]=\"formItem.name\"></nz-time-picker>\n </ng-container>\n </ng-container>\n </nz-form-control>\n </nz-form-item>\n <div *ngIf=\"formItem?.explainOption?.show\"\n [style.color]=\"formItem?.explainOption?.color ? formItem.explainOption.color : null\">\n {{line.get(formItem.explainOption.name).value}}</div>\n </td>\n </ng-container>\n <td style=\"width: 80px\" nzRight=\"0\">\n <span class=\"common-btn-group\">\n <a *ngIf=\"operateButtons.includes('add')\" (click)=\"addFormLine(line.get('lineIndex').value)\">\u6DFB\u52A0</a>\n <a class=\"common-danger-btn\" *ngIf=\"operateButtons.includes('delete') && !showDeleteConfirm\"\n (click)=\"deleteFormLine(line.get('lineIndex').value)\">\u5220\u9664</a>\n <a class=\"common-danger-btn\" *ngIf=\"operateButtons.includes('delete') && showDeleteConfirm\" nz-popconfirm\n nzPopconfirmTitle=\"\u786E\u8BA4\u8981\u5220\u9664\u8BE5\u884C\u5417?\" nzPopconfirmPlacement=\"bottom\"\n (nzOnConfirm)=\"deleteFormLine(line.get('lineIndex').value)\">\u5220\u9664</a>\n </span>\n </td>\n </tr>\n </ng-container>\n <!-- \u5408\u8BA1\u533A\u57DF -->\n <tr *ngIf=\"showTotal\" class=\"hd-table-total\">\n <td>\u5408\u8BA1</td>\n <ng-container *ngFor=\"let totalOption of totalOptionList\">\n <td [nzAlign]=\"totalOption.align ? totalOption.align : 'left'\">{{ (totalOption.value || totalOption.value ===\n 0) ? (((totalOption.value % 1 === 0) && !totalOption.showDecimal ) ? totalOption.value :\n LodashRound(totalOption.value,2).toFixed(2)) : '' }} </td>\n </ng-container>\n </tr>\n </tbody>\n </nz-table>\n <nz-list\n *ngIf=\"linesFormArray.controls.slice((paginationPageIndex - 1) * paginationPageSize, (paginationPageIndex - 1) * paginationPageSize + paginationPageSize).length === 0\"\n [nzDataSource]=\"[]\"></nz-list>\n <ng-container>\n <hd-space background=\"transparent\" type=\"row\" size=\"16\"></hd-space>\n <nz-pagination [nzSize]=\"'small'\" style=\"text-align: right;\" [nzPageIndex]=\"paginationPageIndex\"\n [nzPageSize]=\"paginationPageSize\" [nzPageSizeOptions]=\"[10, 20, 30, 40, 50]\"\n [nzTotal]=\"linesFormArray.controls.length\" nzShowSizeChanger (nzPageIndexChange)=\"pageIndexChange($event)\"\n (nzPageSizeChange)=\"pageSizeChange($event)\" [nzShowTotal]=\"totalTemplate\"></nz-pagination>\n <ng-template #totalTemplate let-total>\u5171 {{linesFormArray.controls.length}} \u6761\u6570\u636E</ng-template>\n </ng-container>\n</form>",
1239
+ template: "<hd-button-group *ngIf=\"showForm && showSearch\">\n <ng-template #buttonGroupLeft>\n <nz-input-group [nzSuffix]=\"suffixIconSearch\">\n <input type=\"text\" nz-input (keyup.enter)=\"searchLines()\" placeholder=\"\u8BF7\u8F93\u5165\u5185\u5BB9\u641C\u7D22\" style=\"width: 300px;\"\n [(ngModel)]=\"filterStr\" />\n </nz-input-group>\n <ng-template #suffixIconSearch>\n <i nz-icon nzType=\"search\" (click)=\"searchLines()\"></i>\n </ng-template>\n </ng-template>\n</hd-button-group>\n<!-- TODO: \u6D4B\u8BD5\u6309\u94AE\u7EC4 -->\n<hd-button-group>\n <ng-template #buttonGroupLeft>\n <hd-button type=\"primary\" (clickAction)=\"testPage()\">\u6D4B\u8BD5\u7FFB\u9875\u6309\u94AE</hd-button>\n <hd-button type=\"primary\" (clickAction)=\"focusDom(0, 0)\">\u6D4B\u8BD5\u805A\u7126\u9009\u62E9\u6846</hd-button>\n <hd-button type=\"primary\" (clickAction)=\"focusDom(0, 2)\">\u6D4B\u8BD5\u805A\u7126\u666E\u901A\u9009\u62E9\u6846</hd-button>\n <hd-button type=\"primary\" (clickAction)=\"focusDom(0, 3)\">\u6D4B\u8BD5\u805A\u7126\u591A\u9879\u9009\u62E9\u6846</hd-button>\n <hd-button type=\"primary\" (clickAction)=\"focusDom(0, 4)\">\u6D4B\u8BD5\u805A\u7126\u7981\u7528\u8F93\u5165\u6846</hd-button>\n <hd-button type=\"primary\" (clickAction)=\"focusDom(0, 7)\">\u6D4B\u8BD5\u805A\u7126\u6570\u5B57\u8F93\u5165\u6846</hd-button>\n <hd-button type=\"primary\" (clickAction)=\"jumpToNextInput(0, 1)\">\u6D4B\u8BD5\u805A\u7126\u4E0B\u4E00\u4E2A</hd-button>\n </ng-template>\n</hd-button-group>\n\n<hd-space background=\"transparent\" type=\"row\" size=\"16\"></hd-space>\n<form *ngIf=\"showForm\" nz-form [formGroup]=\"validateHdFormLines\" class=\"ant-advanced-search-form hd-formLines-container\"\n (keydown)=\"onKeyDown($event)\">\n <nz-table nzTemplateMode [nzFrontPagination]=\"false\" [nzLoading]=\"tableLoading\" [nzScroll]=\"scroll\">\n <thead>\n <tr>\n <th nzWidth=\"58px\" nzLeft=\"0px\">\u5E8F\u53F7</th>\n <ng-container *ngFor=\"let item of formLines\">\n <th *ngIf=\"!item.hide\" [nzAlign]=\"item.align ? item.align : 'left'\">\n <span *ngIf=\"item.require\" style=\"color: red;\">*</span>{{item.label}}\n </th>\n </ng-container>\n <th style=\"width: 80px\" nzRight=\"0\">\u64CD\u4F5C</th>\n </tr>\n </thead>\n <tbody>\n <ng-container\n *ngFor=\"let line of linesFormArray.controls.slice((paginationPageIndex - 1) * paginationPageSize, (paginationPageIndex - 1) * paginationPageSize + paginationPageSize);index as dataIndex\"\n formArrayName=\"lines\">\n <tr [formGroup]=\"line\">\n <td nzWidth=\"58px\" nzLeft=\"0px\">\n {{line.get('lineIndex').value}}\n </td>\n <ng-container *ngFor=\"let formItem of formLines; index as innerIndex\">\n <td *ngIf=\"!formItem.hide\" [nzAlign]=\"formItem.align ? formItem.align : 'left'\">\n <nz-form-item>\n <nz-form-control [nzErrorTip]=\"formItem.label + '\u4E0D\u80FD\u4E3A\u7A7A'\">\n <ng-container [ngSwitch]=\"formItem.type\">\n <ng-container *ngSwitchCase=\"'Input'\">\n <nz-input-group [nzSuffix]=\"inputCleanTemplate\">\n <input #formInputDom (click)=\"setActiveDomInFormLines(dataIndex , innerIndex)\"\n [ngStyle]=\"getStyle(line, formItem, '100px')\" nz-input\n [ngStyle]=\"{'color': formItem?.colorOption?.name ? line.get(formItem.colorOption.name ).value : null}\"\n [id]=\"'input-' + formItem.name + line.get('lineIndex').value\"\n (click)=\"formItem.isSelect ? selectValue('#input-' + formItem.name + line.get('lineIndex').value, dataIndex , innerIndex) : null\"\n [maxlength]=\"formItem.maxLength || null\"\n [placeholder]=\"formItem.placeholder ? formItem.placeholder : '\u8BF7\u8F93\u5165' + formItem.label\"\n [formControlName]=\"formItem.name\" />\n </nz-input-group>\n <ng-template #inputCleanTemplate>\n <i nz-icon nz-tooltip class=\"ant-input-clear-icon\" nzTheme=\"fill\" nzType=\"close-circle\"\n *ngIf=\"line.get(formItem.name).value && !line.get(formItem.name).disabled\"\n (click)=\"inputClean(formItem ,line)\"></i>\n </ng-template>\n </ng-container>\n <ng-container *ngSwitchCase=\"'Select'\">\n <nz-select #formInputDom (click)=\"setActiveDomInFormLines(dataIndex , innerIndex)\"\n nzDropdownClassName=\"hd-select-table\"\n *ngIf=\"formItem.selectOption.tableColumns;else nomarlSelectTemplate\"\n [nzShowSearch]=\"formItem.selectOption.hdShowSearch != null ? formItem.selectOption.hdShowSearch : true\"\n [nzAllowClear]=\"formItem.selectOption.hdAllowClear != null ? formItem.selectOption.hdAllowClear : true\"\n [nzServerSearch]=\"formItem.selectOption.hdServerSearch || false\"\n [nzDropdownMatchSelectWidth]=\"formItem.selectOption.hdDropdownMatchSelectWidth ? formItem.selectOption.hdDropdownMatchSelectWidth : false\"\n [nzPlaceHolder]=\"formItem.placeholder ? formItem.placeholder : '\u8BF7\u9009\u62E9' + formItem.label\"\n [formControlName]=\"formItem.name\"\n (nzOnSearch)=\"onSearchEvent(formItem.onSearchEvent || null, $event, line, formItem.onSearchEventEventDebounceTime)\"\n [ngStyle]=\"getStyle(line, formItem, '200px')\">\n <nz-option nzCustomContent nzDisabled>\n <div class=\"hd-option-header\"\n *ngIf=\"(formItem.selectOption?.selectList?.length > 0 || line.get(formItem.selectOption.selectListName)?.value?.length > 0);else emptyTemplate\">\n <div class=\"hd-option-header-column\"\n *ngFor=\"let selectOptionTableColumn of formItem.selectOption.tableColumns;index as index \"\n [ngStyle]=\"{'width': selectOptionTableColumn?.width ? (selectOptionTableColumn.width + ((index === 0 && !selectOptionTableColumn.label) ? 12 : 0) + 'px') : 'unset'}\">\n {{selectOptionTableColumn.label}}\n </div>\n </div>\n <ng-template #emptyTemplate>\n <div class=\"hd-select-empty\">\n <img\n src=\"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iNjRweCIgaGVpZ2h0PSI0MXB4IiB2aWV3Qm94PSIwIDAgNjQgNDEiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiAgICA8IS0tIEdlbmVyYXRvcjogU2tldGNoIDUyLjUgKDY3NDY5KSAtIGh0dHA6Ly93d3cuYm9oZW1pYW5jb2RpbmcuY29tL3NrZXRjaCAtLT4KICAgIDxnIHN0cm9rZT0ibm9uZSIgc3Ryb2tlLXdpZHRoPSIxIiBmaWxsPSJub25lIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiPgogICAgICAgIDxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKC00NzIuMDAwMDAwLCAtMTMzNS4wMDAwMDApIj4KICAgICAgICAgICAgPGcgIHRyYW5zZm9ybT0idHJhbnNsYXRlKDY0LjAwMDAwMCwgMTExNC4wMDAwMDApIj4KICAgICAgICAgICAgICAgIDxnICB0cmFuc2Zvcm09InRyYW5zbGF0ZSg0MC4wMDAwMDAsIDc4LjAwMDAwMCkiPgogICAgICAgICAgICAgICAgICAgIDxnICB0cmFuc2Zvcm09InRyYW5zbGF0ZSgzNjguMDAwMDAwLCAxNDQuMDAwMDAwKSI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxnID4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlbGxpcHNlICBmaWxsPSIjRjVGNUY1IiBjeD0iMzIiIGN5PSIzMyIgcng9IjMyIiByeT0iNyI+PC9lbGxpcHNlPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGcgICB0cmFuc2Zvcm09InRyYW5zbGF0ZSg5LjAwMDAwMCwgMC4wMDAwMDApIiBmaWxsLXJ1bGU9Im5vbnplcm8iIHN0cm9rZT0iI0Q5RDlEOSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD0iTTQ2LDEyLjc2MDU2MDQgTDM1Ljg1NDMwNDcsMS4yNTczOTYzMyBDMzUuMzY3NDQxNCwwLjQ3MzgyNjYwNSAzNC42NTU4Nzg5LDAgMzMuOTA2NzYxNywwIEwxMi4wOTMyMzgzLDAgQzExLjM0NDEyMTEsMCAxMC42MzI1NTg2LDAuNDczOTUwMjU1IDEwLjE0NTY5NTMsMS4yNTczOTYzMyBMMi42MTQ3OTcyN2UtMTIsMTIuNzYwNTYwNCBMMCwyMiBMNDYsMjIgTDQ2LDEyLjc2MDU2MDQgWiIgID48L3BhdGg+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD0iTTMyLjYxMzI4MTMsMTUuOTMxNSBDMzIuNjEzMjgxMywxNC4zMjU4NTExIDMzLjYwNjk1MzEsMTMuMDAwMjM0IDM0LjgzOTY5OTIsMTMgTDQ2LDEzIEw0NiwzMS4xMzcxMjc3IEM0NiwzMy4yNTg5NTc0IDQ0LjY3OTM4NjcsMzUgNDMuMDUwNDI5NywzNSBMMi45NDk1NzAzMSwzNSBDMS4zMjA1MjM0NCwzNSAwLDMzLjI1ODg0MDQgMCwzMS4xMzcxMjc3IEwwLDEzIEwxMS4xNjAzMDA4LDEzIEMxMi4zOTMwNDY5LDEzIDEzLjM4NjcxODgsMTQuMzIyODA4NSAxMy4zODY3MTg4LDE1LjkyODQ1NzQgTDEzLjM4NjcxODgsMTUuOTQ5NjM4MyBDMTMuMzg2NzE4OCwxNy41NTUyODcyIDE0LjM5MTcxMDksMTguODUxMTgwOSAxNS42MjQ0NTcsMTguODUxMTgwOSBMMzAuMzc1NTQzLDE4Ljg1MTE4MDkgQzMxLjYwODI4OTEsMTguODUxMTgwOSAzMi42MTMyODEzLDE3LjU0MzM1MTEgMzIuNjEzMjgxMywxNS45Mzc3MDIxIEwzMi42MTMyODEzLDE1LjkzMTUgWiIgIGZpbGw9IiNGQUZBRkEiPjwvcGF0aD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZz4KICAgICAgICAgICAgICAgICAgICAgICAgPC9nPgogICAgICAgICAgICAgICAgICAgIDwvZz4KICAgICAgICAgICAgICAgIDwvZz4KICAgICAgICAgICAgPC9nPgogICAgICAgIDwvZz4KICAgIDwvZz4KPC9zdmc+\"\n alt=\"empty\">\n <p class=\"ant-empty-description\">\u6682\u65E0\u6570\u636E</p>\n </div>\n </ng-template>\n </nz-option>\n\n <nz-option nzCustomContent\n *ngFor=\"let selectItem of (formItem.selectOption.selectList || line.get(formItem.selectOption.selectListName).value)\"\n [nzValue]=\"selectItem[formItem.selectOption.value]\" [nzLabel]=\"formItem.selectOption.showLabelAndValue ? '['+ selectItem[formItem.selectOption.value] +']' +\n selectItem[formItem.selectOption.label] : selectItem[formItem.selectOption.label]\">\n <div class=\"hd-option-line\">\n <div *ngFor=\"let selectOptionTableColumn of formItem.selectOption.tableColumns\"\n [ngStyle]=\"{'width': selectOptionTableColumn?.width ? selectOptionTableColumn.width + 'px' : 'unset'}\">\n <ng-container *ngIf=\"selectOptionTableColumn.icons;else notPictureTemplate\">\n <ng-container *ngFor=\"let icon of selectOptionTableColumn.icons\">\n <img *ngIf=\"icon.iconName === 'hd-recommend-star' && selectItem[icon.fieldName]\"\n src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAVpJREFUOE+l07FLQkEcB/Dv7713Zg1GQ0SgW9AmTYVp1BRUokZBEI1u/QVBUBD1D0Rt0dQaPYmotXza1tKQzQ1Fk0iDHr5vPEOTUpO88e77+9zvjjtBh8HTOb8e0hu0eN8Xzz22ikonoGzHdgXcAVB16S75U/mbn/m2AK+mglqbBUAGvCIRuVCJ7HLXQCUTPQOxXi8Q4FolnYWuAH0+HaEpjrdxAyC3VSq33xKgPTWiYYUai8IjUCabw4Zw1XWNF2+OZrXoi+cLImBth4odfQAw0elCW6zdKvU2/wVkYs8ggzBlRqrcI/DrrK1wQ7DWAIToV8lsqGxHDwTY6qYbA1jpCVAux3oBSirhDPYCOL6kE/s/QB77UrnNJoDDVkCN6pI+BJH+6xINQdpKOCf1d/AEYBxgUUQC5PcLbPMDXy1lhGXx7r0G6ExklpBwI0xh2w7ID+UzL71iL/MJdzuZdDL/kXcAAAAASUVORK5CYII=\"\n style=\"width: 16px;height: 16px;\">\n <img *ngIf=\"icon.iconName === 'hd-img-star' && selectItem[icon.fieldName]\"\n src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAyhJREFUWEe1ll1o1XYYxp8nPUmUihdCV3bAirvYzUC80Xpy3KwTZNR2CdOhDkTBwe6G32XzwqpjE3Qt4pUKZQqDyQZNTp1uY8yCJG0F2d2+LlWOOkShovQkaV45lcJpTdOTHJubBPI+z/Pj//H+/0TGR66uf8sPoz8A/Kstkp38YORxFitmEVU1vm1cBPlp9ZuQXtX0jmfxygQgvxSWBRWlDECvhgrwQFuqLufG4TAtRCaAwCl+IcDXtWEi2KFb7pUFBxCBEpSMMsDWGWEiNzXLe2/BASp2cTuJH+KCRMJ3dGvsrzQQqafAtw0XpBEfIhc00/tswQD8QWM1FP45d4A8V9XJN9k5Nl4vRKoR8G3jMshdyebRPs0cOftaAaRUbAsRrRRRhuczFsF/lPATNQrL3Hr7/nz1lGvvtkwGUSEC8gLkWfMGkAfQMp9J0n8ByhS5J+QDVr+BshBlUu6q3d5v9G3jIcg3GgnJqp2C853iCIB1WU0a1F2iOO2tPnK3CLQ1aJZKLpCfddPrmtoF8uuqZn9iyfcEzVQumYtlQDO9vS8PsprHd4xvAR7I7FuHUIBvdNP9crr0lT7g24U+UNlfh1f6Esrn2ofeuVphbCPyneJuAN+lT0jokZCduum9cobM2Qn9krEGEa6+hi36jEC3aro34vASW3FoG9si8sdGRoKCY6rlnpjLIxGgYhunSPY0AiAiP+mW93EmAN8ujoJobwgAuKOb7orUAHKjY1EwHjwFkGsEoKpVJ6WVH3n/p1oDwVBhk0TK742GV/UKYOZMt5QKoGIbX5E8mgwg4wCbADQn1c1uPvP2gWqB7xjDADck7OwBVan0QFFyQaj2A9wxV60A13XT7Uw1Ar5TlDiBQP6hRHs0a3Ss9n8wuK4jYtN5Em/H6B5ppht7r4jvhEOFtYiUGQEAnhDoV033ZNJwB45xRAS9IBfX1qnhRD7uhhQLENiFQ0Ll9LSBCM7olnu43gUpTjEfiPSB3D6tUQRbcpZ7bbZHLEBYKnRFogxV505rmjzIrtG/6w2fMS0l430RHAVoULBZtdybdQFkCcuqSXUtzxqSpHsBfmUdgJhaiDQAAAAASUVORK5CYII=\"\n style=\"width: 16px;height: 16px;\">\n </ng-container>\n </ng-container>\n <ng-template #notPictureTemplate>\n <ng-container\n *ngIf=\"!isTextOverflow(selectOptionTableColumn.render ? selectOptionTableColumn.render(selectItem) : selectItem[selectOptionTableColumn.name], selectOptionTableColumn.width);else overflowTemplate\">\n <div>{{ judgeColEmpty(selectOptionTableColumn.render ?\n selectOptionTableColumn.render(selectItem) :\n selectItem[selectOptionTableColumn.name])}}</div>\n </ng-container>\n <ng-template #overflowTemplate>\n <div class=\"hd-option-overflow\" nz-tooltip\n [nzTooltipTitle]=\"selectOptionTableColumn.render ? selectOptionTableColumn.render(selectItem) : selectItem[selectOptionTableColumn.name]\">\n {{\n judgeColEmpty(selectOptionTableColumn.render ?\n selectOptionTableColumn.render(selectItem) :\n selectItem[selectOptionTableColumn.name])}}</div>\n </ng-template>\n </ng-template>\n </div>\n </div>\n </nz-option>\n <nz-option\n *ngIf=\"formItem.selectOption.label && line.get(formItem.name) && line.get(formItem.selectOption.label)?.value && line.get(formItem.selectOption.value)?.value\"\n [nzLabel]=\"(formItem.selectOption.value === 'code' || formItem.selectOption.value === 'productCode' || formItem.selectOption.hdShowItemCode) ? ('['+ line.get(formItem.selectOption.value).value + ']' + line.get(formItem.selectOption.label).value) : line.get(formItem.selectOption.label).value\"\n [nzValue]=\"line.get(formItem.selectOption.value).value\" nzHide></nz-option>\n </nz-select>\n <ng-template #nomarlSelectTemplate>\n <nz-select #formInputDom (click)=\"setActiveDomInFormLines(dataIndex , innerIndex)\"\n [nzShowSearch]=\"formItem.selectOption.hdShowSearch != null ? formItem.selectOption.hdShowSearch : true\"\n [nzAllowClear]=\"formItem.selectOption.hdAllowClear != null ? formItem.selectOption.hdAllowClear : true\"\n [nzServerSearch]=\"formItem.selectOption.hdServerSearch || false\"\n [nzDropdownMatchSelectWidth]=\"formItem.selectOption.hdDropdownMatchSelectWidth ? formItem.selectOption.hdDropdownMatchSelectWidth : false\"\n [nzPlaceHolder]=\"formItem.placeholder ? formItem.placeholder : '\u8BF7\u9009\u62E9' + formItem.label\"\n [formControlName]=\"formItem.name\"\n (nzOnSearch)=\"onSearchEvent(formItem.onSearchEvent || null, $event, line, formItem.onSearchEventEventDebounceTime)\"\n [ngStyle]=\"getStyle(line, formItem, '200px')\">\n <nz-option\n *ngFor=\"let selectItem of (formItem.selectOption.selectList || line.get(formItem.selectOption.selectListName).value)\"\n [nzValue]=\"selectItem[formItem.selectOption.value]\" [nzLabel]=\"formItem.selectOption.showLabelAndValue ? '['+ selectItem[formItem.selectOption.value] +']' +\n selectItem[formItem.selectOption.label] : selectItem[formItem.selectOption.label]\">\n </nz-option>\n <nz-option\n *ngIf=\"formItem.selectOption.label && line.get(formItem.name) && line.get(formItem.selectOption.label)?.value && line.get(formItem.selectOption.value)?.value\"\n [nzLabel]=\"(formItem.selectOption.value === 'code' || formItem.selectOption.value === 'productCode' || formItem.selectOption.hdShowItemCode) ? ('['+ line.get(formItem.selectOption.value).value + ']' + line.get(formItem.selectOption.label).value) : line.get(formItem.selectOption.label).value\"\n [nzValue]=\"line.get(formItem.selectOption.value).value\" nzHide></nz-option>\n </nz-select>\n </ng-template>\n\n </ng-container>\n <ng-container *ngSwitchCase=\"'Date'\">\n <nz-date-picker #formInputDom (click)=\"setActiveDomInFormLines(dataIndex , innerIndex)\"\n *ngIf=\"formItem.showTime\" [ngStyle]=\"getStyle(line, formItem, '150px')\"\n [nzPlaceHolder]=\"formItem.placeholder ? formItem.placeholder : '\u8BF7\u9009\u62E9' + formItem.label\"\n [formControlName]=\"formItem.name\" [nzDisabledDate]=\"formItem.hdDisabledDate\" nzShowTime\n nzFormat=\"yyyy-MM-dd HH:mm:ss\">\n </nz-date-picker>\n <nz-date-picker #formInputDom *ngIf=\"!formItem.showTime\"\n [ngStyle]=\"getStyle(line, formItem, '150px')\"\n (click)=\"setActiveDomInFormLines(dataIndex , innerIndex)\"\n [nzPlaceHolder]=\"formItem.placeholder ? formItem.placeholder : '\u8BF7\u9009\u62E9' + formItem.label\"\n [formControlName]=\"formItem.name\" [nzDisabledDate]=\"formItem.hdDisabledDate\">\n </nz-date-picker>\n </ng-container>\n <ng-container *ngSwitchCase=\"'DateRange'\">\n <nz-range-picker #formInputDom [ngStyle]=\"getStyle(line, formItem, '200px')\"\n (click)=\"setActiveDomInFormLines(dataIndex , innerIndex)\" [nzPlaceHolder]=\"['\u5F00\u59CB\u65E5\u671F','\u7ED3\u675F\u65E5\u671F']\"\n [formControlName]=\"formItem.name\">\n </nz-range-picker>\n </ng-container>\n <ng-container *ngSwitchCase=\"'TextArea'\">\n <textarea #formInputDom (click)=\"setActiveDomInFormLines(dataIndex , innerIndex)\"\n [ngStyle]=\"{'color': formItem?.colorOption?.name ? line.get(formItem.colorOption.name).value : null}\"\n [placeholder]=\"formItem.placeholder ? formItem.placeholder : '\u8BF7\u8F93\u5165' + formItem.label\"\n [maxlength]=\"formItem.maxLength || null\" rows=\"4\" nz-input\n [maxlength]=\"formItem.maxLength || null\" [formControlName]=\"formItem.name\"></textarea>\n </ng-container>\n <ng-container *ngSwitchCase=\"'InputNumber'\">\n <div style=\"display: flex;align-items: center;\">\n <nz-input-number #formInputDom [ngStyle]=\"getStyle(line, formItem, '100px')\"\n [maxlength]=\"formItem.maxLength || null\" [formControlName]=\"formItem.name\"\n [nzMin]=\"formItem?.inputNumber?.min || 0\" [nzMax]=\"formItem?.inputNumber?.max || 99999999\"\n [nzStep]=\"formItem?.inputNumber?.step || 1\"\n [nzPrecision]=\"formItem?.inputNumber?.precision || 2\"\n [nzPlaceHolder]=\"formItem.placeholder ? formItem.placeholder : '\u8BF7\u8F93\u5165' + formItem.label\"\n [nzId]=\"'inputNumber-' + formItem.name + line.get('lineIndex').value\"\n (click)=\"formItem.isSelect ? selectValue('#inputNumber-' + formItem.name + line.get('lineIndex').value, dataIndex , innerIndex) : setActiveDomInFormLines(dataIndex , innerIndex)\">\n </nz-input-number>\n <div *ngIf=\"formItem?.explainOptionRight?.show\"\n [style.color]=\"formItem?.explainOptionRight?.color ? formItem.explainOptionRight.color : null\">\n &nbsp;&nbsp;{{line.get(formItem.explainOptionRight.name).value}}</div>\n </div>\n </ng-container>\n <ng-container *ngSwitchCase=\"'MultipleSelect'\">\n <nz-select #formInputDom (click)=\"setActiveDomInFormLines(dataIndex , innerIndex)\"\n nzMode=\"multiple\" [nzServerSearch]=\"formItem.selectOption.hdServerSearch || false\"\n [nzDropdownMatchSelectWidth]=\"formItem.selectOption.hdDropdownMatchSelectWidth ? formItem.selectOption.hdDropdownMatchSelectWidth : false\"\n [nzShowSearch]=\"formItem.selectOption.hdShowSearch != null ? formItem.selectOption.hdShowSearch : true\"\n [nzAllowClear]=\"formItem.selectOption.hdAllowClear != null ? formItem.selectOption.hdAllowClear : true\"\n [nzPlaceHolder]=\"formItem.placeholder ? formItem.placeholder : '\u8BF7\u9009\u62E9' + formItem.label\"\n [formControlName]=\"formItem.name\" [ngStyle]=\"getStyle(line, formItem, '200px')\"\n (nzOnSearch)=\"onSearchEvent(formItem.onSearchEvent || null, $event, line, formItem.onSearchEventEventDebounceTime)\">\n <nz-option *ngFor=\"let selectItem of formItem.selectOption.selectList\"\n [nzValue]=\"selectItem[formItem.selectOption.value]\" [nzLabel]=\"formItem.selectOption.showLabelAndValue ? '['+ selectItem[formItem.selectOption.value] +']' +\n selectItem[formItem.selectOption.label] : selectItem[formItem.selectOption.label]\"></nz-option>\n <ng-container\n *ngIf=\"formItem.selectOption.label && line.get(formItem.name) && line.get(formItem.selectOption.label)?.value && line.get(formItem.selectOption.value)?.value\">\n <nz-option *ngFor=\"let option of line.get(formItem.selectOption.value).value;index as i\"\n [nzLabel]=\"line.get(formItem.selectOption.label).value[i]\" [nzValue]=\"option\" nzHide>\n </nz-option>\n </ng-container>\n </nz-select>\n </ng-container>\n <ng-container *ngSwitchCase=\"'ViewDom'\">\n {{(formItem.preserveNumber && line.get(formItem.name).value) ?\n LodashRound(line.get(formItem.name).value,formItem.preserveNumber).toFixed(formItem.preserveNumber)\n : line.get(formItem.name).value}}\n </ng-container>\n <ng-container *ngSwitchCase=\"'Switch'\">\n <nz-switch (click)=\"setActiveDomInFormLines(dataIndex , innerIndex)\"\n [formControlName]=\"formItem.name\"></nz-switch>\n </ng-container>\n <ng-container *ngSwitchCase=\"'Time' \">\n <nz-time-picker #formInputDom [ngStyle]=\"getStyle(line, formItem, '200px')\"\n (click)=\"setActiveDomInFormLines(dataIndex , innerIndex)\"\n [formControlName]=\"formItem.name\"></nz-time-picker>\n </ng-container>\n </ng-container>\n </nz-form-control>\n </nz-form-item>\n <div *ngIf=\"formItem?.explainOption?.show\"\n [style.color]=\"formItem?.explainOption?.color ? formItem.explainOption.color : null\">\n {{line.get(formItem.explainOption.name).value}}</div>\n </td>\n </ng-container>\n <td style=\"width: 80px\" nzRight=\"0\">\n <span class=\"common-btn-group\">\n <a *ngIf=\"operateButtons.includes('add')\" (click)=\"addFormLine(line.get('lineIndex').value)\">\u6DFB\u52A0</a>\n <a class=\"common-danger-btn\" *ngIf=\"operateButtons.includes('delete') && !showDeleteConfirm\"\n (click)=\"deleteFormLine(line.get('lineIndex').value)\">\u5220\u9664</a>\n <a class=\"common-danger-btn\" *ngIf=\"operateButtons.includes('delete') && showDeleteConfirm\" nz-popconfirm\n nzPopconfirmTitle=\"\u786E\u8BA4\u8981\u5220\u9664\u8BE5\u884C\u5417?\" nzPopconfirmPlacement=\"bottom\"\n (nzOnConfirm)=\"deleteFormLine(line.get('lineIndex').value)\">\u5220\u9664</a>\n </span>\n </td>\n </tr>\n </ng-container>\n <!-- \u5408\u8BA1\u533A\u57DF -->\n <tr *ngIf=\"showTotal\" class=\"hd-table-total\">\n <td>\u5408\u8BA1</td>\n <ng-container *ngFor=\"let totalOption of totalOptionList\">\n <td [nzAlign]=\"totalOption.align ? totalOption.align : 'left'\">{{ (totalOption.value || totalOption.value ===\n 0) ? (((totalOption.value % 1 === 0) && !totalOption.showDecimal ) ? totalOption.value :\n LodashRound(totalOption.value,2).toFixed(2)) : '' }} </td>\n </ng-container>\n </tr>\n </tbody>\n </nz-table>\n <nz-list\n *ngIf=\"linesFormArray.controls.slice((paginationPageIndex - 1) * paginationPageSize, (paginationPageIndex - 1) * paginationPageSize + paginationPageSize).length === 0\"\n [nzDataSource]=\"[]\"></nz-list>\n <ng-container>\n <hd-space background=\"transparent\" type=\"row\" size=\"16\"></hd-space>\n <nz-pagination [nzSize]=\"'small'\" style=\"text-align: right;\" [nzPageIndex]=\"paginationPageIndex\"\n [nzPageSize]=\"paginationPageSize\" [nzPageSizeOptions]=\"[2, 10, 20, 30, 40, 50]\"\n [nzTotal]=\"linesFormArray.controls.length\" nzShowSizeChanger (nzPageIndexChange)=\"pageIndexChange($event)\"\n (nzPageSizeChange)=\"pageSizeChange($event)\" [nzShowTotal]=\"totalTemplate\"></nz-pagination>\n <ng-template #totalTemplate let-total>\u5171 {{linesFormArray.controls.length}} \u6761\u6570\u636E</ng-template>\n </ng-container>\n</form>",
756
1240
  styles: ["::ng-deep .common-btn-group>a{font-size:12px;font-weight:400;color:#12a34f!important;white-space:nowrap}::ng-deep .common-btn-group .common-danger-btn:hover{color:#f05b24!important}::ng-deep .common-btn-group>a:hover{color:#20bd62!important}::ng-deep .common-btn-group>a:not(:last-child)::after{content:'';margin:0 2px}::ng-deep .common-billNumber>a{color:#3b77e3}button{box-shadow:unset;text-shadow:unset}::ng-deep .ant-form-item-label>label{color:#4b504e}::ng-deep .ant-input-number-input{height:28px}::ng-deep .ant-input-number{height:28px}textarea.ant-input{height:auto;min-height:28px}::ng-deep .ant-select-selection--multiple{min-height:28px}::ng-deep .ant-select-selection__rendered>ul>li{height:22px!important;margin-top:3px!important;line-height:22px!important}::ng-deep .ant-advanced-search-form .ant-form-item{margin-bottom:0!important}::ng-deep .ant-select-selection--single{height:28px!important}::ng-deep .ant-input{height:28px}::ng-deep .ant-input[disabled]:hover{border-color:#d9d9d9!important}::ng-deep .ant-select-selection__rendered{line-height:28px!important}::ng-deep .ant-calendar-range-picker-input{text-align:left!important}::ng-deep .ant-calendar-picker{width:100%!important}::ng-deep .ant-row{margin-right:0!important;margin-left:0!important}::ng-deep .ant-col-6{padding-left:12px;padding-right:12px}::ng-deep .ant-col-12{padding-left:12px;padding-right:12px}::ng-deep .ant-col-18{padding-left:12px;padding-right:12px}::ng-deep .ant-col-24{padding-left:12px;padding-right:12px}::ng-deep .ant-alert-info{background-color:#f5f8f6;border:1px solid #cfe3d4}:host ::ng-deep th{background:#f5f8f6!important;font-weight:700!important;white-space:nowrap;font-size:12px;font-family:PingFangSC-Medium,PingFang SC;color:#2a3634;padding:8px!important;box-sizing:border-box}:host ::ng-deep td{font-weight:400;font-style:normal;font-size:12px;color:#2a3634;text-align:left;white-space:nowrap;padding:8px!important;box-sizing:border-box}::ng-deep .ant-pagination-options{display:inline-flex;align-items:center}::ng-deep .ant-time-picker{width:100%}.hd-formLines-container ::ng-deep td{padding:1.5px 8px!important}.hd-formLines-container .ant-table-tbody>tr>td,.hd-formLines-container ::ng-deep .ant-table-thead>tr>th{padding:16px 8px}.hd-formLines-container ::ng-deep .hd-table-total>td{border:0!important}.hd-formLines-container .ant-input-number{width:100%}::ng-deep .hd-select-table .ant-select-dropdown-menu-item-disabled{background:#f5f8f6!important;border-bottom:1px solid #e8e8e8;position:-webkit-sticky;position:sticky;top:0;z-index:10;padding:0}::ng-deep .hd-select-table .ant-select-dropdown-menu-item-disabled:hover{background:#f5f8f6!important}.hd-option-header{display:flex;align-items:center;color:rgba(0,0,0,.85);background:#f5f8f6}.hd-option-header-column{padding:5px 0}.hd-option-line{display:flex;align-items:center}.hd-option-overflow{overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.hd-select-empty{display:flex;align-items:center;flex-direction:column;padding:20px 0;background:#fff}::ng-deep .ant-empty-small{background:#fff!important;padding:8px 0;margin:0}"]
757
1241
  }] }
758
1242
  ];
759
1243
  /** @nocollapse */
760
1244
  HdFormLinesComponent.ctorParameters = () => [
761
- { type: FormBuilder }
1245
+ { type: FormBuilder },
1246
+ { type: ChangeDetectorRef }
762
1247
  ];
763
1248
  HdFormLinesComponent.propDecorators = {
1249
+ formInputDomList: [{ type: ViewChildren, args: ['formInputDom',] }],
764
1250
  tableLoading: [{ type: Input }],
765
1251
  showSearch: [{ type: Input }],
766
1252
  formLines: [{ type: Input }],
@@ -790,6 +1276,8 @@ tslib_1.__decorate([
790
1276
  tslib_1.__metadata("design:type", Boolean)
791
1277
  ], HdFormLinesComponent.prototype, "showTotal", void 0);
792
1278
  if (false) {
1279
+ /** @type {?} */
1280
+ HdFormLinesComponent.prototype.formInputDomList;
793
1281
  /** @type {?} */
794
1282
  HdFormLinesComponent.prototype.tableLoading;
795
1283
  /** @type {?} */
@@ -853,6 +1341,16 @@ if (false) {
853
1341
  * @private
854
1342
  */
855
1343
  HdFormLinesComponent.prototype.searchSubscription;
1344
+ /** @type {?} */
1345
+ HdFormLinesComponent.prototype.collectDomList;
1346
+ /** @type {?} */
1347
+ HdFormLinesComponent.prototype.activeDomX;
1348
+ /** @type {?} */
1349
+ HdFormLinesComponent.prototype.activeDomY;
1350
+ /** @type {?} */
1351
+ HdFormLinesComponent.prototype.activeDom;
1352
+ /** @type {?} */
1353
+ HdFormLinesComponent.prototype.activeSelectedComponentOpen;
856
1354
  /**
857
1355
  * @type {?}
858
1356
  * @private
@@ -863,5 +1361,10 @@ if (false) {
863
1361
  * @private
864
1362
  */
865
1363
  HdFormLinesComponent.prototype.fb;
1364
+ /**
1365
+ * @type {?}
1366
+ * @private
1367
+ */
1368
+ HdFormLinesComponent.prototype.cdr;
866
1369
  }
867
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGQtZm9ybS1saW5lcy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9mYW50YXN5LW5nem9ycm8vIiwic291cmNlcyI6WyJoZC1mb3JtLWxpbmVzL2hkLWZvcm0tbGluZXMuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFVLE1BQU0sRUFBaUIsTUFBTSxlQUFlLENBQUM7QUFDOUYsT0FBTyxFQUFhLFdBQVcsRUFBYSxVQUFVLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUMvRSxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sUUFBUSxDQUFDO0FBQy9CLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDN0MsT0FBTyxFQUFFLE9BQU8sRUFBZ0IsTUFBTSxNQUFNLENBQUM7QUFDN0MsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBUTlDLE1BQU0sT0FBTyxvQkFBb0I7Ozs7SUFpQy9CLFlBQW9CLEVBQWU7UUFBZixPQUFFLEdBQUYsRUFBRSxDQUFhO1FBaENWLGlCQUFZLEdBQVksS0FBSyxDQUFDO1FBQzlCLGVBQVUsR0FBWSxLQUFLLENBQUM7UUFJNUMsbUJBQWMsR0FBa0IsQ0FBQyxLQUFLLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFDbEQsV0FBTSxHQUErQixFQUFFLENBQUMsRUFBRSxLQUFLLEVBQUUsQ0FBQztRQUNqRCxnQkFBVyxHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7UUFDbEIsc0JBQWlCLEdBQVksS0FBSyxDQUFDO1FBQzVELHdCQUFtQixHQUFXLENBQUMsQ0FBQztRQUNoQyx1QkFBa0IsR0FBVyxFQUFFLENBQUM7O1FBTVAsY0FBUyxHQUFZLEtBQUssQ0FBQztRQUMzQyxnQkFBVyxHQUF1QixFQUFFLENBQUM7UUFDckMsa0JBQWEsR0FBb0IsQ0FBQyxDQUFDO1FBQzVDLG9CQUFlLEdBQUcsRUFB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WUFDcEIsT0FBTyxHQUFHLENBQUM7U0FDWjthQUFNO1lBQ0wsT0FBTyxLQUFLLENBQUM7U0FDZDtJQUNILENBQUM7OztZQWxoQkYsU0FBUyxTQUFDO2dCQUNULFFBQVEsRUFBRSxlQUFlO2dCQUN6Qiw4aHdCQUE2Qzs7YUFFOUM7Ozs7WUFYbUIsV0FBVzs7OzJCQWE1QixLQUFLO3lCQUNMLEtBQUs7d0JBQ0wsS0FBSzs0QkFFTCxLQUFLOzZCQUNMLEtBQUs7cUJBQ0wsS0FBSzswQkFDTCxNQUFNO2dDQUNOLEtBQUs7d0JBUUwsS0FBSzswQkFDTCxLQUFLOzRCQUNMLEtBQUs7O0FBbEJtQjtJQUFmLFlBQVksRUFBRTs7MERBQStCO0FBQzlCO0lBQWYsWUFBWSxFQUFFOzt3REFBNkI7QUFPNUI7SUFBZixZQUFZLEVBQUU7OytEQUFvQztBQVFuQztJQUFmLFlBQVksRUFBRTs7dURBQTRCOzs7SUFoQnBELDRDQUF1RDs7SUFDdkQsMENBQXFEOztJQUNyRCx5Q0FBb0M7O0lBRXBDLDZDQUE0Qjs7SUFDNUIsOENBQTJEOztJQUMzRCxzQ0FBMkQ7O0lBQzNELDJDQUEyQzs7SUFDM0MsaURBQTREOztJQUM1RCxtREFBZ0M7O0lBQ2hDLGtEQUFnQzs7SUFDaEMsbURBQStCOztJQUMvQix1Q0FBYTs7SUFDYiwwQ0FBbUI7O0lBR25CLHlDQUFvRDs7SUFDcEQsMkNBQThDOztJQUM5Qyw2Q0FBNEM7O0lBQzVDLCtDQUFxQjs7SUFFckIsd0NBQTBCOztJQUMxQix5Q0FBa0I7O0lBQ2xCLGtEQUE2Qjs7SUFDN0Isd0RBQW1DOztJQUNuQyxnREFBcUM7O0lBQ3JDLDRDQUE4Qjs7SUFDOUIseUNBQTJCOzs7OztJQUMzQiw2Q0FBMkU7Ozs7O0lBQzNFLCtDQUFvQzs7Ozs7SUFFcEMsa0RBQXFEOzs7OztJQWlkckQsOENBQXdEOzs7OztJQWhkNUMsa0NBQXVCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIElucHV0LCBPbkluaXQsIE91dHB1dCwgU2ltcGxlQ2hhbmdlcyB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRm9ybUFycmF5LCBGb3JtQnVpbGRlciwgRm9ybUdyb3VwLCBWYWxpZGF0b3JzIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgcm91bmQgfSBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsgSW5wdXRCb29sZWFuIH0gZnJvbSAnbmctem9ycm8tYW50ZCc7XG5pbXBvcnQgeyBTdWJqZWN0LCBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGRlYm91bmNlVGltZSB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IFRvdGFsT3B0aW9uIH0gZnJvbSAnLi4vaGQtZGV0YWlsLWxpbmVzL2hkLWRldGFpbC1saW5lcy5zZXJ2aWNlJztcbmltcG9ydCB7IEZvcm1MaW5lIH0gZnJvbSAnLi9oZC1mb3JtLWxpbmVzLnNlcnZpY2UnO1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnaGQtZm9ybS1saW5lcycsXG4gIHRlbXBsYXRlVXJsOiAnLi9oZC1mb3JtLWxpbmVzLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vaGQtZm9ybS1saW5lcy5jb21wb25lbnQubGVzcyddXG59KVxuZXhwb3J0IGNsYXNzIEhkRm9ybUxpbmVzQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcbiAgQElucHV0KCkgQElucHV0Qm9vbGVhbigpIHRhYmxlTG9hZGluZzogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSBASW5wdXRCb29sZWFuKCkgc2hvd1NlYXJjaDogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSBmb3JtTGluZXM6IEFycmF5PEZvcm1MaW5lPjtcbiAgLy8g6ZKI5a+5Zm9ybUxpbmVz6YeM6Z2i5omA5pyJ55qEbmFtZe+8jFxuICBASW5wdXQoKSBmb3JtTGluZXNEYXRhOiBhbnk7XG4gIEBJbnB1dCgpIG9wZXJhdGVCdXR0b25zOiBBcnJheTxzdHJpbmc+ID0gWydhZGQnLCAnZGVsZXRlJ107XG4gIEBJbnB1dCgpIHNjcm9sbDogeyBba2V5OiBzdHJpbmddOiBzdHJpbmc7IH0gPSB7IHg6ICcxcHgnIH07XG4gIEBPdXRwdXQoKSBjaGFuZ2VFdmVudCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgQElucHV0KCkgQElucHV0Qm9vbGVhbigpIHNob3dEZWxldGVDb25maXJtOiBib29sZWFuID0gZmFsc2U7XG4gIHBhZ2luYXRpb25QYWdlSW5kZXg6IG51bWJlciA9IDE7XG4gIHBhZ2luYXRpb25QYWdlU2l6ZTogbnVtYmVyID0gMTA7XG4gIHZhbGlkYXRlSGRGb3JtTGluZXM6IEZvcm1Hcm91cDtcbiAgbmV3TGluZTogYW55O1xuICBpbnB1dFZhbHVlOiBzdHJpbmc7XG5cbiAgLy8g5ZCI6K6h5Yy65Z+fXG4gIEBJbnB1dCgpIEBJbnB1dEJvb2xlYW4oKSBzaG93VG90YWw6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KCkgdG90YWxPcHRpb246IEFycmF5PFRvdGFsT3B0aW9uPiA9IFtdO1xuICBASW5wdXQoKSBjb2x1bW5zTnVtYmVyOiBudW1iZXIgfCBzdHJpbmcgPSAwO1xuICB0b3RhbE9wdGlvbkxpc3QgPSBbXTtcblxuICBzaG93Rm9ybTogYm9vbGVhbiA9IGZhbHNlO1xuICBmaWx0ZXJTdHI6IHN0cmluZztcbiAgc3RvcmVGb3JtTGluZXNEYXRhOiBhbnkgPSBbXTsgLy8g57yT5a2Y55qE5oC755qE6KGo5Y2V5pWw5o2uXG4gIGZpbHRlclN0b3JlRm9ybUxpbmVzRGF0YTogYW55ID0gW107IC8vIOetm+mAieWHuuadpeeahOaVsOaNruWIl+ihqFxuICBmaWx0ZXJJbmRleFN0b3JlOiBBcnJheTxudW1iZXI+ID0gW107IC8vIOetm+mAieWHuuadpeeahOaVsOaNruWcqOWOn+Wni+WIl+ihqOS4reeahOS4i+agh1xuICBpc0ZpbHRlckRhdGE6IGJvb2xlYW4gPSBmYWxzZTsgLy8g5piv5ZCm5piv5bey57uP562b6YCJ6L+H55qE5pWw5o2uXG4gIGZvcm1WYWxpZDogYm9vbGVhbiA9IGZhbHNlOyAvLyDooajljZXlvZPliY3nmoTnirbmgIFcbiAgcHJpdmF0ZSBzZWFyY2hTdWJqZWN0ID0gbmV3IFN1YmplY3Q8eyBmbjogYW55LCBldmVudDogYW55LCBsaW5lOiBhbnk7IH0+KCk7XG4gIHByaXZhdGUgZGVib3VuY2VUaW1lb3V0OiBudW1iZXIgPSAwOyAgLy8g6buY6K6k6Ziy5oqW5pe26Ze0XG5cbiAgcHJpdmF0ZSBzZWFyY2hTdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbiB8IHVuZGVmaW5lZDtcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBmYjogRm9ybUJ1aWxkZXIpIHtcbiAgICB0aGlzLnNlYXJjaFN1YnNjcmlwdGlvbiA9IHRoaXMuc2VhcmNoU3ViamVjdC5waXBlKFxuICAgICAgZGVib3VuY2VUaW1lKHRoaXMuZGVib3VuY2VUaW1lb3V0KVxuICAgICkuc3Vic2NyaWJlKCh7IGZuLCBldmVudCwgbGluZSB9KSA9PiB0aGlzLnRyaWdnZXJFdmVudChmbiwgZXZlbnQsIGxpbmUpKTtcbiAgfVxuXG4gIG5nT25Jbml0KCkge1xuICAgIC8vIOe8k+WtmOS4gOS4i+aAu+eahOihqOWNleaVsOaNrlxuICAgIHRoaXMuc3RvcmVGb3JtTGluZXNEYXRhID0gdGhpcy5mb3JtTGluZXNEYXRhO1xuICAgIHRoaXMuaW5pdCgpO1xuICB9XG5cbiAgZ2V0IGxpbmVzRm9ybUFycmF5KCk6IGFueSB7XG4gICAgcmV0dXJuIHRoaXMudmFsaWRhdGVIZEZvcm1MaW5lcy5nZXQoJ2xpbmVzJykgYXMgRm9ybUFycmF5O1xuICB9XG5cbiAgZ2V0IExvZGFzaFJvdW5kKCkge1xuICAgIHJldHVybiByb3VuZDtcbiAgfVxuXG4gIC8vIOaatOmcsueahOaWueazle+8jOeUqOS6juiOt+WPluaJgOacieaVsOaNrueahHZhbGlk54q25oCBXG4gIHB1YmxpYyBnZXRWYWxpZCgpIHtcbiAgICByZXR1cm4gdGhpcy5mb3JtVmFsaWQ7XG4gIH1cblxuICBvblNlYXJjaEV2ZW50KGZuOiBhbnksIGV2ZW50OiBhbnksIGxpbmU6IGFueSwgb25TZWFyY2hFdmVudERlYm91bmNlVGltZTogYW55KSB7XG4gICAgaWYgKG9uU2VhcmNoRXZlbnREZWJvdW5jZVRpbWUpIHtcbiAgICAgIC8vIOabtOaWsOmYsuaKluaXtumXtFxuICAgICAgdGhpcy5kZWJvdW5jZVRpbWVvdXQgPSBvblNlYXJjaEV2ZW50RGVib3VuY2VUaW1lO1xuXG4gICAgICAvLyDlj5bmtojkuYvliY3nmoTorqLpmIVcbiAgICAgIGlmICh0aGlzLnNlYXJjaFN1YnNjcmlwdGlvbikge1xuICAgICAgICB0aGlzLnNlYXJjaFN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgICAgfVxuXG4gICAgICAvLyDliJvlu7rmlrDnmoTorqLpmIVcbiAgICAgIHRoaXMuc2VhcmNoU3Vic2NyaXB0aW9uID0gdGhpcy5zZWFyY2hTdWJqZWN0LnBpcGUoXG4gICAgICAgIGRlYm91bmNlVGltZSh0aGlzLmRlYm91bmNlVGltZW91dClcbiAgICAgICkuc3Vic2NyaWJlKCh7IGZuLCBldmVudCwgbGluZSB9KSA9PiB0aGlzLnRyaWdnZXJFdmVudChmbiwgZXZlbnQsIGxpbmUpKTtcblxuICAgICAgLy8g5Y+R6YCB5LqL5Lu2XG4gICAgICB0aGlzLnNlYXJjaFN1YmplY3QubmV4dCh7IGZuLCBldmVudCwgbGluZSB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy50cmlnZ2VyRXZlbnQoZm4sIGV2ZW50LCBsaW5lKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICpcbiAgICogQHBhcmFtIGZuIOeItue7hOS7tuWHveaVsFxuICAgKiBAcGFyYW0gZXZlbnQg5LqL5Lu25YC8XG4gICAqIEBwYXJhbSBsaW5lIOinpuWPkeeahOihjFxuICAgKi9cbiAgdHJpZ2dlckV2ZW50KGZuOiBhbnksIGV2ZW50OiBhbnksIGxpbmU6IGFueSkge1xuICAgIGlmIChmbikge1xuICAgICAgZm4oZXZlbnQsIGxpbmUpO1xuICAgIH1cbiAgfVxuXG4gIGlubmVyR2V0VmFsaWQoKSB7XG4gICAgbGV0IHRtcFZhbGlkYXRlSGRGb3JtTGluZXMgPSB0aGlzLmZiLmdyb3VwKHtcbiAgICAgICdsaW5lcyc6IHRoaXMuZmIuYXJyYXkoW10pXG4gICAgfSk7XG4gICAgdGhpcy5zdG9yZUZvcm1MaW5lc0RhdGEuZm9yRWFjaCgoZm9ybUxpbmVzRGF0YUl0ZW0pID0+IHtcbiAgICAgIGxldCBmb3JtR3JvdXBPYmo6IGFueSA9IHt9O1xuICAgICAgdGhpcy5mb3JtTGluZXMuZm9yRWFjaCgoaXRlbSkgPT4ge1xuICAgICAgICAvLyDmlrDlop7ooYwg5Yid5aeL5pWw5o2u6YO95Li6bnVsbFxuICAgICAgICBmb3JtR3JvdXBPYmpbaXRlbS5uYW1lXSA9IHRoaXMuZmIuY29udHJvbCh7IHZhbHVlOiBmb3JtTGluZXNEYXRhSXRlbVtpdGVtLm5hbWVdID09PSAwID8gMCA6IChmb3JtTGluZXNEYXRhSXRlbVtpdGVtLm5hbWVdIHx8IGl0ZW0udmFsdWUgfHwgbnVsbCksIGRpc2FibGVkOiBpdGVtLmRpc2FibGVkIH0sIGl0ZW0ucmVxdWlyZSA/IFtWYWxpZGF0b3JzLnJlcXVpcmVkXSA6IFtdKTtcbiAgICAgICAgaWYgKGl0ZW0uc2VsZWN0T3B0aW9uICYmIGl0ZW0uc2VsZWN0T3B0aW9uLmxhYmVsKSB7XG4gICAgICAgICAgZm9ybUdyb3VwT2JqW2l0ZW0uc2VsZWN0T3B0aW9uLmxhYmVsXSA9IHRoaXMuZmIuY29udHJvbChmb3JtTGluZXNEYXRhSXRlbVtpdGVtLnNlbGVjdE9wdGlvbi5sYWJlbF0gfHwgbnVsbCwgW10pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIGZvcm1Hcm91cE9iai5saW5lSW5kZXggPSB0aGlzLmZiLmNvbnRyb2woKHRtcFZhbGlkYXRlSGRGb3JtTGluZXMuZ2V0KCdsaW5lcycpIGFzIEZvcm1BcnJheSkuY29udHJvbHMubGVuZ3RoLCBbXSk7XG4gICAgICBsZXQgZm9ybUdyb3VwVG1wID0gdGhpcy5mYi5ncm91cChmb3JtR3JvdXBPYmopO1xuICAgICAgdGhpcy5mb3JtTGluZXMuZm9yRWFjaCgoaXRlbSkgPT4ge1xuICAgICAgICBpZiAoaXRlbS5vbkNoYW5nZUV2ZW50KSB7XG4gICAgICAgICAgaWYgKGl0ZW0ub25DaGFuZ2VFdmVudERlYm91bmNlVGltZSkge1xuICAgICAgICAgICAgZm9ybUdyb3VwVG1wLmdldChpdGVtLm5hbWUpLnZhbHVlQ2hhbmdlcy5waXBlKFxuICAgICAgICAgICAgICBkZWJvdW5jZVRpbWUoaXRlbS5vbkNoYW5nZUV2ZW50RGVib3VuY2VUaW1lKVxuICAgICAgICAgICAgKS5zdWJzY3JpYmUodmFsdWUgPT4gdGhpcy50cmlnZ2VyRXZlbnQoaXRlbS5vbkNoYW5nZUV2ZW50LCB2YWx1ZSwgZm9ybUdyb3VwVG1wKSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGZvcm1Hcm91cFRtcC5nZXQoaXRlbS5uYW1lKS52YWx1ZUNoYW5nZXMuc3Vic2NyaWJlKHZhbHVlID0+IHRoaXMudHJpZ2dlckV2ZW50KGl0ZW0ub25DaGFuZ2VFdmVudCwgdmFsdWUsIGZvcm1Hcm91cFRtcCkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICAodG1wVmFsaWRhdGVIZEZvcm1MaW5lcy5nZXQoJ2xpbmVzJykgYXMgRm9ybUFycmF5KS5pbnNlcnQoKHRtcFZhbGlkYXRlSGRGb3JtTGluZXMuZ2V0KCdsaW5lcycpIGFzIEZvcm1BcnJheSkuY29udHJvbHMubGVuZ3RoLCBmb3JtR3JvdXBUbXApO1xuICAgIH0pO1xuICAgIHJldHVybiB0bXBWYWxpZGF0ZUhkRm9ybUxpbmVzLnZhbGlkO1xuICB9XG5cbiAgLy8g5pq06Zyy55qE5pa55rOV77yM55So5LqO6I635Y+W5omA5pyJ5pWw5o2uXG4gIHB1YmxpYyBnZXRMaW5lcygpIHtcbiAgICBsZXQgYWxsTGluZXMgPSBbXTtcbiAgICB0aGlzLnN0b3JlRm9ybUxpbmVzRGF0YS5mb3JFYWNoKChmb3JtTGluZXNEYXRhSXRlbSkgPT4ge1xuICAgICAgbGV0IGZvcm1Hcm91cE9iajogYW55ID0ge307XG4gICAgICB0aGlzLmZvcm1MaW5lcy5mb3JFYWNoKChpdGVtKSA9PiB7XG4gICAgICAgIC8vIOaWsOWinuihjCDliJ3lp4vmlbDmja7pg73kuLpudWxsXG4gICAgICAgIGZvcm1Hcm91cE9ialtpdGVtLm5hbWVdID0gZm9ybUxpbmVzRGF0YUl0ZW1baXRlbS5uYW1lXTtcbiAgICAgIH0pO1xuICAgICAgZm9ybUdyb3VwT2JqLmxpbmVJbmRleCA9IGZvcm1MaW5lc0RhdGFJdGVtLmxpbmVJbmRleDtcbiAgICAgIGFsbExpbmVzLnB1c2goZm9ybUdyb3VwT2JqKTtcbiAgICB9KTtcbiAgICByZXR1cm4gYWxsTGluZXM7XG4gIH1cblxuICAvLyDlhajlsYDmgKfnmoTmkJzntKLvvIjmtrXnm5bpobXpnaLkuIrmiYDmnInnmoTlj6/op4bmloflrZfvvIlcbiAgc2VhcmNoTGluZXMoKSB7XG4gICAgaWYgKHRoaXMuc3RvcmVGb3JtTGluZXNEYXRhLmxlbmd0aCA8IDEpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy50YWJsZUxvYWRpbmcgPSB0cnVlO1xuICAgIC8vIOWmguaenOayoeaciei+k+WFpeaQnOe0ouWtl+espuS4su+8jOWImeaYvuekuue8k+WtmOWGheeahOaJgOacieaVsOaNrlxuICAgIGlmICghdGhpcy5maWx0ZXJTdHIpIHtcbiAgICAgIHRoaXMuaXNGaWx0ZXJEYXRhID0gZmFsc2U7XG4gICAgICB0aGlzLnNldFN0b3JlRGF0YSgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBmaWx0ZXJWYWx1ZSA9IHRoaXMuZmlsdGVyU3RyLnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xuICAgIHRoaXMuaXNGaWx0ZXJEYXRhID0gdHJ1ZTtcbiAgICB0aGlzLmZpbHRlckluZGV4U3RvcmUgPSBbXTtcblxuICAgIC8vIOagueaNruaQnOe0ouWtl+espuS4sui/h+a7pOaVsOaNrlxuICAgIGNvbnN0IGZpbHRlcmVkRGF0YSA9IHRoaXMuc3RvcmVGb3JtTGluZXNEYXRhLmZpbHRlcigoZGF0YTogYW55LCBpbmRleDogbnVtYmVyKSA9PiB7XG4gICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgdGhpcy5mb3JtTGluZXMpIHtcbiAgICAgICAgaWYgKChpdGVtLmhpZGUgJiYgaXRlbS5jYW5TZWFyY2gpIHx8ICghaXRlbS5oaWRlICYmIGl0ZW0ubmFtZSAhPT0gJ3V1aWQnKSkge1xuICAgICAgICAgIGNvbnN0IHZhbHVlID0gZGF0YVtpdGVtLm5hbWVdID8gZGF0YVtpdGVtLm5hbWVdLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKSA6ICcnO1xuICAgICAgICAgIGlmICh2YWx1ZS5pbmNsdWRlcyhmaWx0ZXJWYWx1ZSkpIHtcbiAgICAgICAgICAgIHRoaXMuZmlsdGVySW5kZXhTdG9yZS5wdXNoKGluZGV4KTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0pO1xuICAgIC8vIOe8k+WtmOS4gOS4i+etm+mAieWQjueahOihqOWNleaVsOaNrlxuICAgIHRoaXMuZmlsdGVyU3RvcmVGb3JtTGluZXNEYXRhID0gZmlsdGVyZWREYXRhO1xuICAgIC8vIOWkhOeQhuetm+mAieWlveeahOaVsOaNriDnhLblkI7ph43mlrDmuLLmn5NcbiAgICB0aGlzLmZvcm1MaW5lc0RhdGEgPSBmaWx0ZXJlZERhdGE7XG4gICAgdGhpcy5pbml0KHRydWUpO1xuICB9XG5cbiAgc2V0U3RvcmVEYXRhKCkge1xuICAgIHRoaXMuZm9ybUxpbmVzRGF0YSA9IHRoaXMuc3RvcmVGb3JtTGluZXNEYXRhO1xuICAgIHRoaXMuaW5pdCh0cnVlKTtcbiAgfVxuXG4gIGdldFN0eWxlKGxpbmU6IEZvcm1Hcm91cCwgZm9ybUl0ZW06IGFueSwgd2lkdGg6IHN0cmluZykge1xuICAgIGxldCBzdHlsZU9iaiA9IHtcbiAgICAgICdtaW4td2lkdGgnOiB3aWR0aFxuICAgIH07XG4gICAgaWYgKGZvcm1JdGVtLnN0eWxlKSB7XG4gICAgICBzdHlsZU9iaiA9IHsgLi4uc3R5bGVPYmosIC4uLmZvcm1JdGVtLnN0eWxlIH07XG4gICAgfVxuICAgIGlmIChmb3JtSXRlbS5jb2xvck9wdGlvbiAmJiBmb3JtSXRlbS5jb2xvck9wdGlvbi5uYW1lICYmIGxpbmUuZ2V0KGZvcm1JdGVtLmNvbG9yT3B0aW9uLm5hbWUpLnZhbHVlKSB7XG4gICAgICBzdHlsZU9iaiA9IHsgLi4uc3R5bGVPYmosIC4uLnsgJ2NvbG9yJzogbGluZS5nZXQoZm9ybUl0ZW0uY29sb3JPcHRpb24ubmFtZSkudmFsdWUgfSB9O1xuICAgIH1cbiAgICByZXR1cm4gc3R5bGVPYmo7XG4gIH1cblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKSB7XG4gICAgY29uc29sZS5sb2coJ2NoYW5nZXMnLCBjaGFuZ2VzKTtcbiAgICBpZiAoY2hhbmdlc1snZm9ybUxpbmVzRGF0YSddICYmIEpTT04uc3RyaW5naWZ5KGNoYW5nZXNbJ2Zvcm1MaW5lc0RhdGEnXS5jdXJyZW50VmFsdWUpICE9PSBKU09OLnN0cmluZ2lmeShjaGFuZ2VzWydmb3JtTGluZXNEYXRhJ10ucHJldmlvdXNWYWx1ZSkpIHtcbiAgICAgIGlmICh0aGlzLnN0b3JlRm9ybUxpbmVzRGF0YSAmJiB0aGlzLnN0b3JlRm9ybUxpbmVzRGF0YS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgY29uc29sZS5sb2coJzEnKTtcbiAgICAgICAgdGhpcy5zdG9yZUZvcm1MaW5lc0RhdGEgPSB0aGlzLmZvcm1MaW5lc0RhdGE7XG4gICAgICB9XG4gICAgICBjb25zb2xlLmxvZygnMicpO1xuICAgICAgdGhpcy5pbml0KCk7XG4gICAgfVxuICAgIGlmIChjaGFuZ2VzWyd0b3RhbE9wdGlvbiddICYmIEpTT04uc3RyaW5naWZ5KGNoYW5nZXNbJ3RvdGFsT3B0aW9uJ10uY3VycmVudFZhbHVlKSAhPT0gSlNPTi5zdHJpbmdpZnkoY2hhbmdlc1sndG90YWxPcHRpb24nXS5wcmV2aW91c1ZhbHVlKSkge1xuICAgICAgdGhpcy5jYWxjdWxhdGVUb3RhbCgpO1xuICAgIH1cbiAgfVxuXG4gIGNhbGN1bGF0ZVRvdGFsKCkge1xuICAgIC8vIOi/memHjOWkhOeQhuWQiOiuoeaVsOaNrlxuICAgIGlmICh0aGlzLnNob3dUb3RhbCkge1xuICAgICAgdGhpcy50b3RhbE9wdGlvbkxpc3QgPSBuZXcgQXJyYXkoTnVtYmVyKHRoaXMuY29sdW1uc051bWJlcikgLSAxKS5maWxsKCcnKTtcbiAgICAgIHRoaXMudG90YWxPcHRpb24uZm9yRWFjaChpdGVtID0+IHtcbiAgICAgICAgaWYgKGl0ZW0uaW5zZXJ0SW5kZXggJiYgKGl0ZW0uaW5zZXJ0VmFsdWUgfHwgaXRlbS5pbnNlcnRWYWx1ZSA9PT0gMCkpIHtcbiAgICAgICAgICB0aGlzLnRvdGFsT3B0aW9uTGlzdFtpdGVtLmluc2VydEluZGV4IC0gMV0gPSB7XG4gICAgICAgICAgICB2YWx1ZTogaXRlbS5pbnNlcnRWYWx1ZSxcbiAgICAgICAgICAgIGFsaWduOiBpdGVtLmFsaWduIHx8ICdsZWZ0JyxcbiAgICAgICAgICAgIHNob3dEZWNpbWFsOiBpdGVtLnNob3dEZWNpbWFsIHx8IGZhbHNlXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBpbml0KGlzRWRpdDogYm9vbGVhbiA9IGZhbHNlKTogdm9pZCB7XG4gICAgdGhpcy5wYWdpbmF0aW9uUGFnZUluZGV4ID0gMTtcbiAgICAvLyDlvILluLjmjZXojrdcbiAgICBpZiAoIXRoaXMuY2hlY2tMaXN0KHRoaXMuZm9ybUxpbmVzKSkge1xuICAgICAgdGhpcy50YWJsZUxvYWRpbmcgPSBmYWxzZTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5jcmVhdGVGb3JtKCk7XG4gICAgLy8g5aaC5p6c5rKh5pyJZm9ybUxpbmVzRGF0Ye+8jOWImeiupOS4uuaYr+aWsOWinlxuICAgIGlmICghaXNFZGl0ICYmICghdGhpcy5mb3JtTGluZXNEYXRhIHx8ICh0aGlzLmZvcm1MaW5lc0RhdGEgJiYgdGhpcy5mb3JtTGluZXNEYXRhLmxlbmd0aCA9PT0gMCkpKSB7XG4gICAgICB0aGlzLnRhYmxlTG9hZGluZyA9IGZhbHNlO1xuICAgICAgdGhpcy5hZGRGb3JtTGluZSgpO1xuICAgICAgdGhpcy5zaG93Rm9ybSA9IHRydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIOe8lui+kemAu+i+kVxuICAgICAgdGhpcy5hZGRGb3JtTGluZVdpdGhEYXRhKCk7XG4gICAgfVxuICAgIHRoaXMudmFsaWRhdGVIZEZvcm1MaW5lcy52YWx1ZUNoYW5nZXMuc3Vic2NyaWJlKGRhdGEgPT4gdGhpcy5vbkhkRm9ybVZhbHVlQ2hhbmdlZChkYXRhKSk7XG4gICAgdGhpcy5vbkhkRm9ybVZhbHVlQ2hhbmdlZCgpO1xuICB9XG5cblxuICAvKipcbiAgICog5Yib5bu66KGo5Y2VXG4gICAqL1xuICBwcml2YXRlIGNyZWF0ZUZvcm0oKSB7XG4gICAgdGhpcy52YWxpZGF0ZUhkRm9ybUxpbmVzID0gdGhpcy5mYi5ncm91cCh7XG4gICAgICAnbGluZXMnOiB0aGlzLmZiLmFycmF5KFtdKVxuICAgIH0pO1xuICAgIHRoaXMubmV3TGluZSA9IHRoaXMubmV3TGluZUl0ZW0oKTtcbiAgfVxuXG4gIC8qKlxuICAqIOWumuS5ieepuueahG5ld0xpbmVJdGVtIOe7k+aehFxuICAqL1xuICBwcml2YXRlIG5ld0xpbmVJdGVtKCk6IEZvcm1Hcm91cCB7XG4gICAgbGV0IGZvcm1Hcm91cE9iajogYW55ID0ge307XG4gICAgdGhpcy5mb3JtTGluZXMuZm9yRWFjaCgoaXRlbSkgPT4ge1xuICAgICAgLy8g5paw5aKe6KGMIOWIneWni+aVsOaNrumDveS4um51bGxcbiAgICAgIGZvcm1Hcm91cE9ialtpdGVtLm5hbWVdID0gdGhpcy5mYi5jb250cm9sKHsgdmFsdWU6IGl0ZW0udmFsdWUsIGRpc2FibGVkOiBpdGVtLmRpc2FibGVkIH0gfHwgbnVsbCwgaXRlbS5yZXF1aXJlICYmICFpdGVtLmhpZGUgPyBbVmFsaWRhdG9ycy5yZXF1aXJlZF0gOiBbXSk7XG4gICAgfSk7XG4gICAgZm9ybUdyb3VwT2JqLmxpbmVJbmRleCA9IHRoaXMuZmIuY29udHJvbCh0aGlzLmxpbmVzRm9ybUFycmF5LmNvbnRyb2xzLmxlbmd0aCwgW10pO1xuICAgIC8vIOeUqOadpeagh+ivhuaYr+WQpuaYr+aQnOe0oueKtuaAgeS4i+aWsOWinueahOihjFxuICAgIGZvcm1Hcm91cE9iai5pc0hkRm9ybUxpbmVTZWFyY2hBZGQgPSB0aGlzLmZiLmNvbnRyb2wodGhpcy5pc0ZpbHRlckRhdGEsIFtdKTtcbiAgICBsZXQgZm9ybUdyb3VwU3VibWl0ID0gdGhpcy5mYi5ncm91cChmb3JtR3JvdXBPYmopO1xuICAgIHRoaXMuZm9ybUxpbmVzLmZvckVhY2goKGl0ZW0pID0+IHtcbiAgICAgIGlmIChpdGVtLm9uQ2hhbmdlRXZlbnQpIHtcbiAgICAgICAgaWYgKGl0ZW0ub25DaGFuZ2VFdmVudCkge1xuICAgICAgICAgIGlmIChpdGVtLm9uQ2hhbmdlRXZlbnREZWJvdW5jZVRpbWUpIHtcbiAgICAgICAgICAgIGZvcm1Hcm91cFN1Ym1pdC5nZXQoaXRlbS5uYW1lKS52YWx1ZUNoYW5nZXMucGlwZShcbiAgICAgICAgICAgICAgZGVib3VuY2VUaW1lKGl0ZW0ub25DaGFuZ2VFdmVudERlYm91bmNlVGltZSlcbiAgICAgICAgICAgICkuc3Vic2NyaWJlKHZhbHVlID0+IHRoaXMudHJpZ2dlckV2ZW50KGl0ZW0ub25DaGFuZ2VFdmVudCwgdmFsdWUsIGZvcm1Hcm91cFN1Ym1pdCkpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBmb3JtR3JvdXBTdWJtaXQuZ2V0KGl0ZW0ubmFtZSkudmFsdWVDaGFuZ2VzLnN1YnNjcmliZSh2YWx1ZSA9PiB0aGlzLnRyaWdnZXJFdmVudChpdGVtLm9uQ2hhbmdlRXZlbnQsIHZhbHVlLCBmb3JtR3JvdXBTdWJtaXQpKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gZm9ybUdyb3VwU3VibWl0O1xuICB9XG5cbiAgcHJpdmF0ZSBjYWxjdWxhdGVMaW5lTnVtYmVyKCkge1xuICAgIHRoaXMubGluZXNGb3JtQXJyYXkuY29udHJvbHMuZm9yRWFjaCgoaXRlbSwgaW5kZXgpID0+IHtcbiAgICAgIGl0ZW0uZ2V0KCdsaW5lSW5kZXgnKS5zZXRWYWx1ZShpbmRleCArIDEsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiDnvJbovpHnmoTml7blgJnmlbDmja7lpITnkIZcbiAgICovXG4gIGFkZEZvcm1MaW5lV2l0aERhdGEoKSB7XG4gICAgdGhpcy5mb3JtTGluZXNEYXRhLmZvckVhY2goKGZvcm1MaW5lc0RhdGFJdGVtKSA9PiB7XG4gICAgICBsZXQgZm9ybUdyb3VwT2JqOiBhbnkgPSB7fTtcbiAgICAgIHRoaXMuZm9ybUxpbmVzLmZvckVhY2goKGl0ZW0pID0+IHtcbiAgICAgICAgLy8g5paw5aKe6KGMIOWIneWni+aVsOaNrumDveS4um51bGxcbiAgICAgICAgZm9ybUdyb3VwT2JqW2l0ZW0ubmFtZV0gPSB0aGlzLmZiLmNvbnRyb2woeyB2YWx1ZTogZm9ybUxpbmVzRGF0YUl0ZW1baXRlbS5uYW1lXSA9PT0gMCA/IDAgOiAoZm9ybUxpbmVzRGF0YUl0ZW1baXRlbS5uYW1lXSB8fCBpdGVtLnZhbHVlIHx8IG51bGwpLCBkaXNhYmxlZDogaXRlbS5kaXNhYmxlZCB9LCBpdGVtLnJlcXVpcmUgPyBbVmFsaWRhdG9ycy5yZXF1aXJlZF0gOiBbXSk7XG4gICAgICAgIGlmIChpdGVtLnNlbGVjdE9wdGlvbiAmJiBpdGVtLnNlbGVjdE9wdGlvbi5sYWJlbCkge1xuICAgICAgICAgIGZvcm1Hcm91cE9ialtpdGVtLnNlbGVjdE9wdGlvbi5sYWJlbF0gPSB0aGlzLmZiLmNvbnRyb2woZm9ybUxpbmVzRGF0YUl0ZW1baXRlbS5zZWxlY3RPcHRpb24ubGFiZWxdIHx8IG51bGwsIFtdKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBmb3JtR3JvdXBPYmoubGluZUluZGV4ID0gdGhpcy5mYi5jb250cm9sKHRoaXMubGluZXNGb3JtQXJyYXkuY29udHJvbHMubGVuZ3RoICsgMSwgW10pO1xuICAgICAgbGV0IGZvcm1Hcm91cFRtcCA9IHRoaXMuZmIuZ3JvdXAoZm9ybUdyb3VwT2JqKTtcbiAgICAgIHRoaXMuZm9ybUxpbmVzLmZvckVhY2goKGl0ZW0pID0+IHtcbiAgICAgICAgaWYgKGl0ZW0ub25DaGFuZ2VFdmVudCkge1xuICAgICAgICAgIGlmIChpdGVtLm9uQ2hhbmdlRXZlbnREZWJvdW5jZVRpbWUpIHtcbiAgICAgICAgICAgIGZvcm1Hcm91cFRtcC5nZXQoaXRlbS5uYW1lKS52YWx1ZUNoYW5nZXMucGlwZShcbiAgICAgICAgICAgICAgZGVib3VuY2VUaW1lKGl0ZW0ub25DaGFuZ2VFdmVudERlYm91bmNlVGltZSlcbiAgICAgICAgICAgICkuc3Vic2NyaWJlKHZhbHVlID0+IHtcbiAgICAgICAgICAgICAgdGhpcy50cmlnZ2VyRXZlbnQoaXRlbS5vbkNoYW5nZUV2ZW50LCB2YWx1ZSwgZm9ybUdyb3VwVG1wKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBmb3JtR3JvdXBUbXAuZ2V0KGl0ZW0ubmFtZSkudmFsdWVDaGFuZ2VzLnN1YnNjcmliZSh2YWx1ZSA9PiB7XG4gICAgICAgICAgICAgIHRoaXMudHJpZ2dlckV2ZW50KGl0ZW0ub25DaGFuZ2VFdmVudCwgdmFsdWUsIGZvcm1Hcm91cFRtcCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgdGhpcy5saW5lc0Zvcm1BcnJheS5pbnNlcnQodGhpcy5saW5lc0Zvcm1BcnJheS5jb250cm9scy5sZW5ndGgsIGZvcm1Hcm91cFRtcCk7XG4gICAgfSk7XG4gICAgdGhpcy50YWJsZUxvYWRpbmcgPSBmYWxzZTtcbiAgICB0aGlzLnNob3dGb3JtID0gdHJ1ZTtcbiAgfVxuXG4gIGFkZEZvcm1MaW5lKGluZGV4PzogYW55KSB7XG4gICAgdGhpcy5saW5lc0Zvcm1BcnJheS5pbnNlcnQoaW5kZXggfHwgdGhpcy5saW5lc0Zvcm1BcnJheS5jb250cm9scy5sZW5ndGgsIHRoaXMubmV3TGluZUl0ZW0oKSk7XG4gICAgdGhpcy5jYWxjdWxhdGVMaW5lTnVtYmVyKCk7XG4gIH1cblxuICBkZWxldGVGb3JtTGluZShpbmRleDogYW55KSB7XG4gICAgdGhpcy5saW5lc0Zvcm1BcnJheS5yZW1vdmVBdChpbmRleCAtIDEpO1xuICAgIGlmICghdGhpcy5pc0ZpbHRlckRhdGEgJiYgdGhpcy5saW5lc0Zvcm1BcnJheS5jb250cm9scyAmJiB0aGlzLmxpbmVzRm9ybUFycmF5LmNvbnRyb2xzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhpcy5hZGRGb3JtTGluZSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyDliKDpmaTlsL7pobXnmoTmnIDlkI7kuIDkuKrlhYPntKDliqjkvZxcbiAgICAgIGlmICh0aGlzLnBhZ2luYXRpb25QYWdlSW5kZXggKiB0aGlzLnBhZ2luYXRpb25QYWdlU2l6ZSA9PT0gKHRoaXMubGluZXNGb3JtQXJyYXkuY29udHJvbHMubGVuZ3RoICsgdGhpcy5wYWdpbmF0aW9uUGFnZVNpemUpKSB7XG4gICAgICAgIHRoaXMucGFnaW5hdGlvblBhZ2VJbmRleC0tO1xuICAgICAgfVxuICAgICAgdGhpcy5jYWxjdWxhdGVMaW5lTnVtYmVyKCk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHBhZ2VJbmRleENoYW5nZShldmVudDogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5wYWdpbmF0aW9uUGFnZUluZGV4ID0gZXZlbnQ7XG4gIH1cblxuICBwdWJsaWMgcGFnZVNpemVDaGFuZ2UoZXZlbnQ6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMucGFnaW5hdGlvblBhZ2VTaXplID0gZXZlbnQ7XG4gIH1cblxuICBwcml2YXRlIG9uSGRGb3JtVmFsdWVDaGFuZ2VkKGRhdGE/OiBhbnkpIHtcbiAgICBpZiAodGhpcy5pc0ZpbHRlckRhdGEpIHtcbiAgICAgIGlmIChkYXRhICYmIGRhdGEubGluZXMgJiYgdGhpcy5maWx0ZXJJbmRleFN0b3JlLmxlbmd0aCAhPT0gMCkge1xuICAgICAgICBjb25zdCBsaW5lcyA9IGRhdGEubGluZXM7XG4gICAgICAgIGlmIChsaW5lcy5sZW5ndGggPT09IHRoaXMuZmlsdGVySW5kZXhTdG9yZS5sZW5ndGgpIHtcbiAgICAgICAgICB0aGlzLmZpbHRlckluZGV4U3RvcmUuZm9yRWFjaCgoaXRlbSwgaW5kZXgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuc3RvcmVGb3JtTGluZXNEYXRhW2l0ZW1dID0geyAuLi50aGlzLmZpbHRlclN0b3JlRm9ybUxpbmVzRGF0YVtpbmRleF0sIC4uLmxpbmVzW2luZGV4XSB9O1xuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2UgaWYgKGxpbmVzLmxlbmd0aCA+IHRoaXMuZmlsdGVySW5kZXhTdG9yZS5sZW5ndGgpIHtcbiAgICAgICAgICAvLyDmnInmlrDlop7mlbDmja7nmoTmg4XlhrVcbiAgICAgICAgICAvLyBzdGVwIDE6IOWFiOaJvuaWsOWinueahGluZGV45LiL5qCHXG4gICAgICAgICAgY29uc3QgZ2V0Tm93TGluZXMgPSB0aGlzLnZhbGlkYXRlSGRGb3JtTGluZXMuZ2V0UmF3VmFsdWUoKS5saW5lcztcbiAgICAgICAgICBsZXQgYWRkSW5kZXggPSAtMTtcbiAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGdldE5vd0xpbmVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoZ2V0Tm93TGluZXNbaV0uaXNIZEZvcm1MaW5lU2VhcmNoQWRkKSB7XG4gICAgICAgICAgICAgIGFkZEluZGV4ID0gaTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChhZGRJbmRleCAhPT0gLTEpIHtcbiAgICAgICAgICAgIHRoaXMuc3RvcmVGb3JtTGluZXNEYXRhLnNwbGljZSh0aGlzLmZpbHRlckluZGV4U3RvcmVbYWRkSW5kZXggLSAxXSArIDEsIDAsIGdldE5vd0xpbmVzW2FkZEluZGV4XSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMuZmlsdGVySW5kZXhTdG9yZS5wdXNoKHRoaXMuZmlsdGVySW5kZXhTdG9yZVthZGRJbmRleCAtIDFdICsgMSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8g5pyJ5Yig6Zmk5pWw5o2u55qE5oOF5Ya1XG4gICAgICAgICAgLy8gc3RlcCAxOuWFiOaJvuWIsOWIoOmZpOeahGluZGV45LiL5qCHXG4gICAgICAgICAgbGV0IGRlbGV0ZWRJbmRleCA9IC0xO1xuICAgICAgICAgIGxldCBjb3VudCA9IDA7XG4gICAgICAgICAgaWYgKGxpbmVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgZGVsZXRlZEluZGV4ID0gMDtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaW5lcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICBpZiAobGluZXNbaV0ubGluZUluZGV4IC0gY291bnQgPiAxKSB7XG4gICAgICAgICAgICAgICAgZGVsZXRlZEluZGV4ID0gaTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBjb3VudCsrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoZGVsZXRlZEluZGV4ICE9PSAtMSkge1xuICAgICAgICAgICAgLy8gc3RlcCAyOiDliKDpmaTmgLvmlbDmja7kuK3nmoTlr7nlupTmlbDmja4sIOaKiuS4i+agh+aVsOe7hOWSjGxpbmVz6ZW/5bqm5a+56b2Q77yM5ZCM5pe25oqK5LiL5qCH5pWw57uE5ZyoZGVsZXRlZEluZGV45ZCO6Z2i55qE5YC85YWo6YO9LTFcbiAgICAgICAgICAgIHRoaXMuc3RvcmVGb3JtTGluZXNEYXRhID0gdGhpcy5zdG9yZUZvcm1MaW5lc0RhdGEuZmlsdGVyKChpdGVtLCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgICByZXR1cm4gaW5kZXggIT09IHRoaXMuZmlsdGVySW5kZXhTdG9yZVtkZWxldGVkSW5kZXhdO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aGlzLmZpbHRlckluZGV4U3RvcmUuc3BsaWNlKGRlbGV0ZWRJbmRleCwgMSk7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuZmlsdGVySW5kZXhTdG9yZS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICBpZiAoaSA+PSBkZWxldGVkSW5kZXgpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmZpbHRlckluZGV4U3RvcmVbaV0tLTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBzdGVwIDI6IOayoeacieaJvuWIsGRlbGV0ZWRJbmRleOivtOaYjuWIoOmZpOaTjeS9nOWcqOacgOWQjuS4gOihjFxuICAgICAgICAgICAgY29uc3QgZmlsdGVySW5kZXggPSB0aGlzLmZpbHRlckluZGV4U3RvcmVbdGhpcy5maWx0ZXJJbmRleFN0b3JlLmxlbmd0aCAtIDFdO1xuICAgICAgICAgICAgdGhpcy5zdG9yZUZvcm1MaW5lc0RhdGEgPSB0aGlzLnN0b3JlRm9ybUxpbmVzRGF0YS5maWx0ZXIoKGl0ZW0sIGluZGV4KSA9PiB7XG4gICAgICAgICAgICAgIHJldHVybiBpbmRleCAhPT0gZmlsdGVySW5kZXg7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRoaXMuZmlsdGVySW5kZXhTdG9yZS5wb3AoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChkYXRhICYmIGRhdGEubGluZXMpIHtcbiAgICAgICAgICB0aGlzLnN0b3JlRm9ybUxpbmVzRGF0YSA9IGRhdGEubGluZXM7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKGRhdGEgJiYgZGF0YS5saW5lcykge1xuICAgICAgICB0aGlzLnN0b3JlRm9ybUxpbmVzRGF0YSA9IGRhdGEubGluZXM7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8g5oC76KGo5Y2VXG4gICAgaWYgKCF0aGlzLmlzRmlsdGVyRGF0YSkge1xuICAgICAgdGhpcy5mb3JtVmFsaWQgPSB0aGlzLnZhbGlkYXRlSGRGb3JtTGluZXMudmFsaWQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICh0aGlzLmZvcm1WYWxpZCkge1xuICAgICAgICAvLyDlpoLmnpzmlbTkvZPooajljZXmmK90cnVl77yM5LiN566h5a2Q6KGo5Y2V5piv5LuA5LmI77yM6YO95Y+Y5oiQ5a2Q6KGo5Y2V55qE54q25oCBXG4gICAgICAgIHRoaXMuZm9ybVZhbGlkID0gdGhpcy52YWxpZGF0ZUhkRm9ybUxpbmVzLnZhbGlkO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8g5aaC5p6c5pW05L2T6KGo5Y2V5pivZmFsc2XvvJox44CB5a2Q6KGo5Y2V5Li6dHJ1Ze+8jOmcgOimgemHjeeul++8mzLjgIHlrZDooajljZXkuLpmYWxzZe+8jOeUqOWtkOihqOWNleeKtuaAgVxuICAgICAgICBpZiAodGhpcy52YWxpZGF0ZUhkRm9ybUxpbmVzLnZhbGlkKSB7XG4gICAgICAgICAgdGhpcy5mb3JtVmFsaWQgPSB0aGlzLmlubmVyR2V0VmFsaWQoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmZvcm1WYWxpZCA9IHRoaXMudmFsaWRhdGVIZEZvcm1MaW5lcy52YWxpZDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICAvLyB0aGlzLmNhbGN1bGF0ZUxpbmVOdW1iZXIoKTtcbiAgICB0aGlzLmNoYW5nZUV2ZW50LmVtaXQodGhpcy52YWxpZGF0ZUhkRm9ybUxpbmVzKTtcbiAgfVxuXG4gIHByaXZhdGUgY2hlY2tMaXN0KGxpc3Q6IEFycmF5PEZvcm1MaW5lPik6IGJvb2xlYW4ge1xuICAgIGlmICghbGlzdCB8fCAobGlzdCAmJiBsaXN0Lmxlbmd0aCA9PT0gMCkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgbGV0IG5hbWVMaXN0ID0gW107XG4gICAgbGV0IHNlbGVjdE9wdGlvbkNoZWNrTGlzdCA9IFtdO1xuICAgIGxpc3QuZm9yRWFjaCgoaXRlbSkgPT4ge1xuICAgICAgLy8g5qCh6aqM5Y2V6aG56YCJ5oup5ZmoXG4gICAgICAvLyBpZiAoaXRlbS50eXBlID09PSBGb3JtTGluZVR5cGUuU2VsZWN0ICYmICghaXRlbS5zZWxlY3RMaXN0IHx8IChpdGVtLnNlbGVjdExpc3QgJiYgaXRlbS5zZWxlY3RMaXN0Lmxlbmd0aCA9PT0gMCkpKSB7XG4gICAgICAvLyAgIHRocm93ICdmb3JtTGluZXPnu4Tku7bmlbDmja7moLzlvI/kuI3op4TojIPvvIzlrZjlnKjljZXpobnpgInmi6nlmajmsqHmnInkvKDlhaXpgInpobkhJ1xuICAgICAgLy8gfVxuICAgICAgbmFtZUxpc3QucHVzaChpdGVtLm5hbWUpO1xuXG4gICAgICAvLyDmoKHpqozmnIlvblNlYXJjaOeahOWtl+auteeahHNlbGVjdE9wdGlvbueahHZhbHVl44CBbGFiZWzmmK/lkKblnKhmb3JtTGluZemHjOmdoumDveWumuS5ieS6hlxuICAgICAgaWYgKGl0ZW0ub25TZWFyY2hFdmVudCAmJiBpdGVtLnNlbGVjdE9wdGlvbikge1xuICAgICAgICBzZWxlY3RPcHRpb25DaGVja0xpc3QgPSBbXTtcbiAgICAgICAgbGlzdC5mb3JFYWNoKGlubmVySXRlbSA9PiB7XG4gICAgICAgICAgaWYgKGlubmVySXRlbS5uYW1lID09PSBpdGVtLnNlbGVjdE9wdGlvbi52YWx1ZSB8fCBpbm5lckl0ZW0ubmFtZSA9PT0gaXRlbS5zZWxlY3RPcHRpb24ubGFiZWwpIHtcbiAgICAgICAgICAgIHNlbGVjdE9wdGlvbkNoZWNrTGlzdC5wdXNoKGlubmVySXRlbS5uYW1lKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoc2VsZWN0T3B0aW9uQ2hlY2tMaXN0Lmxlbmd0aCA8IDIpIHtcbiAgICAgICAgICB0aHJvdyBgZm9ybUxpbmVz57uE5Lu25pWw5o2u5qC85byP5LiN6KeE6IyD77yM5a2X5q61JHtpdGVtLm5hbWV955qEc2VsZWN0T3B0aW9u55qEdmFsdWXjgIFsYWJlbOWtl+auteacquiDveWcqGZvcm1MaW5lc+S4reaJvuWIsOWvueW6lOWtl+aute+8gWA7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgICAvLyDmoKHpqoxuYW1l5piv5ZCm6YeN5aSNXG4gICAgaWYgKFsuLi5uZXcgU2V0KG5hbWVMaXN0KV0ubGVuZ3RoICE9PSBsaXN0Lmxlbmd0aCkge1xuICAgICAgdGhyb3cgJ2Zvcm1MaW5lc+e7hOS7tuaVsOaNruagvOW8j+S4jeinhOiMg++8jOWtmOWcqOmHjeWkjW5hbWXlgLwhJztcbiAgICB9XG4gICAgLy8gLi4ubW9yZSBjaGVja1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcHVibGljIHN1Ym1pdEZvcm0oKTogdm9pZCB7XG4gICAgdGhpcy5jaGFuZ2VFdmVudC5lbWl0KHRoaXMudmFsaWRhdGVIZEZvcm1MaW5lcy5nZXRSYXdWYWx1ZSgpKTtcbiAgfVxuXG4gIHB1YmxpYyByZXNldEZvcm0oKTogdm9pZCB7XG4gICAgLy8g5Yig6ZmkXG4gICAgZm9yIChsZXQgaSA9IHRoaXMubGluZXNGb3JtQXJyYXkuY29udHJvbHMubGVuZ3RoOyBpID49IDA7IGktLSkge1xuICAgICAgdGhpcy5kZWxldGVGb3JtTGluZShpKTtcbiAgICB9XG4gICAgdGhpcy5wYWdpbmF0aW9uUGFnZUluZGV4ID0gMTtcbiAgfVxuXG4gIHB1YmxpYyBpbnB1dENsZWFuKGZvcm1JdGVtOiBhbnksIGxpbmU6IGFueSk6IHZvaWQge1xuICAgIGxpbmUuZ2V0KGZvcm1JdGVtLm5hbWUpLnNldFZhbHVlKG51bGwpO1xuICB9XG5cbiAgcHVibGljIHNlbGVjdFZhbHVlKGlkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBpbnB1dERvbTogYW55ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihpZCk7XG4gICAgaW5wdXREb20uc2VsZWN0KCk7XG4gIH1cblxuICBwcml2YXRlIHRleHRXaWR0aENhY2hlOiB7IFtrZXk6IHN0cmluZ106IG51bWJlcjsgfSA9IHt9O1xuICBpc1RleHRPdmVyZmxvdyh0ZXh0OiBzdHJpbmcsIG1heFdpZHRoOiBudW1iZXIpOiBib29sZWFuIHtcbiAgICBjb25zdCBjYWNoZWRXaWR0aCA9IHRoaXMudGV4dFdpZHRoQ2FjaGVbdGV4dF07XG4gICAgaWYgKGNhY2hlZFdpZHRoICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBjYWNoZWRXaWR0aCArIDE1ID49IG1heFdpZHRoO1xuICAgIH1cblxuICAgIGNvbnN0IHNwYW4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7XG4gICAgc3Bhbi5zdHlsZS52aXNpYmlsaXR5ID0gJ2hpZGRlbic7XG4gICAgc3Bhbi5zdHlsZS5wb3NpdGlvbiA9ICdhYnNvbHV0ZSc7XG4gICAgc3Bhbi5zdHlsZS53aGl0ZVNwYWNlID0gJ25vd3JhcCc7XG4gICAgc3Bhbi5zdHlsZS5mb250U2l6ZSA9ICcxMnB4JztcbiAgICBzcGFuLnN0eWxlLmRpc3BsYXkgPSAnaW5saW5lLWJsb2NrJzsgLy8g5bCG5qC35byP5L+u5pS55Li6IGlubGluZS1ibG9ja1xuICAgIHNwYW4uaW5uZXJUZXh0ID0gdGV4dDtcbiAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHNwYW4pO1xuICAgIGNvbnN0IGlzT3ZlcmZsb3cgPSBzcGFuLm9mZnNldFdpZHRoICsgMTUgPj0gbWF4V2lkdGg7XG4gICAgdGhpcy50ZXh0V2lkdGhDYWNoZVt0ZXh0XSA9IHNwYW4ub2Zmc2V0V2lkdGg7XG4gICAgc3Bhbi5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoc3Bhbik7XG4gICAgcmV0dXJuIGlzT3ZlcmZsb3c7XG4gIH1cblxuICBqdWRnZUNvbEVtcHR5KHN0cjogYW55KSB7XG4gICAgaWYgKHN0ciB8fCBzdHIgPT09IDApIHtcbiAgICAgIHJldHVybiBzdHI7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiAnPOepuj4nO1xuICAgIH1cbiAgfVxufVxuIl19
1370
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGQtZm9ybS1saW5lcy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9mYW50YXN5LW5nem9ycm8vIiwic291cmNlcyI6WyJoZC1mb3JtLWxpbmVzL2hkLWZvcm0tbGluZXMuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsT0FBTyxFQUFFLGlCQUFpQixFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBVSxNQUFNLEVBQUUsU0FBUyxFQUFpQixZQUFZLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDdEosT0FBTyxFQUFhLFdBQVcsRUFBYSxVQUFVLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUMvRSxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sUUFBUSxDQUFDO0FBQy9CLE9BQU8sRUFBRSxZQUFZLEVBQUUscUJBQXFCLEVBQUUsc0JBQXNCLEVBQUUsc0JBQXNCLEVBQUUsaUJBQWlCLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDOUosT0FBTyxFQUFFLE9BQU8sRUFBZ0IsTUFBTSxNQUFNLENBQUM7QUFDN0MsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRTlDLE9BQU8sRUFBWSxZQUFZLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQU1qRSxNQUFNLE9BQU8sb0JBQW9COzs7OztJQTZDL0IsWUFBb0IsRUFBZSxFQUFVLEdBQXNCO1FBQS9DLE9BQUUsR0FBRixFQUFFLENBQWE7UUFBVSxRQUFHLEdBQUgsR0FBRyxDQUFtQjtRQTFDMUMsaUJBQVksR0FBWSxLQUFLLENBQUM7UUFDOUIsZUFBVSxHQUFZLEtBQUssQ0FBQztRQUk1QyxtQkFBYyxHQUFrQixDQUFDLEtBQUssRUFBRSxRQUFRLENBQUMsQ0FBQztRQUNsRCxXQUFNLEdBQStCLEVBQUUsQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDO1FBQ2pELGdCQUFXLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQztR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Q0wsS0FBSzs7QUFuQm1CO0lBQWYsWUFBWSxFQUFFOzswREFBK0I7QUFDOUI7SUFBZixZQUFZLEVBQUU7O3dEQUE2QjtBQU81QjtJQUFmLFlBQVksRUFBRTs7K0RBQW9DO0FBU25DO0lBQWYsWUFBWSxFQUFFOzt1REFBNEI7OztJQW5CcEQsZ0RBQXVFOztJQUV2RSw0Q0FBdUQ7O0lBQ3ZELDBDQUFxRDs7SUFDckQseUNBQW9DOztJQUVwQyw2Q0FBNEI7O0lBQzVCLDhDQUEyRDs7SUFDM0Qsc0NBQTJEOztJQUMzRCwyQ0FBMkM7O0lBQzNDLGlEQUE0RDs7SUFDNUQsbURBQWdDOztJQUVoQyxrREFBK0I7O0lBQy9CLG1EQUErQjs7SUFDL0IsdUNBQWE7O0lBQ2IsMENBQW1COztJQUduQix5Q0FBb0Q7O0lBQ3BELDJDQUE4Qzs7SUFDOUMsNkNBQTRDOztJQUM1QywrQ0FBcUI7O0lBRXJCLHdDQUEwQjs7SUFDMUIseUNBQWtCOztJQUNsQixrREFBNkI7O0lBQzdCLHdEQUFtQzs7SUFDbkMsZ0RBQXFDOztJQUNyQyw0Q0FBOEI7O0lBQzlCLHlDQUEyQjs7Ozs7SUFDM0IsNkNBQTJFOzs7OztJQUMzRSwrQ0FBb0M7Ozs7O0lBRXBDLGtEQUFxRDs7SUFHckQsOENBQW9LOztJQUVwSywwQ0FBMEI7O0lBQzFCLDBDQUEwQjs7SUFDMUIseUNBQW1KOztJQUNuSiwyREFBNkM7Ozs7O0lBbzBCN0MsOENBQXdEOzs7OztJQWwwQjVDLGtDQUF1Qjs7Ozs7SUFBRSxtQ0FBOEIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDaGFuZ2VEZXRlY3RvclJlZiwgQ29tcG9uZW50LCBFbGVtZW50UmVmLCBFdmVudEVtaXR0ZXIsIElucHV0LCBPbkluaXQsIE91dHB1dCwgUXVlcnlMaXN0LCBTaW1wbGVDaGFuZ2VzLCBWaWV3Q2hpbGRyZW4gfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZvcm1BcnJheSwgRm9ybUJ1aWxkZXIsIEZvcm1Hcm91cCwgVmFsaWRhdG9ycyB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IHJvdW5kIH0gZnJvbSAnbG9kYXNoJztcbmltcG9ydCB7IElucHV0Qm9vbGVhbiwgTnpEYXRlUGlja2VyQ29tcG9uZW50LCBOeklucHV0TnVtYmVyQ29tcG9uZW50LCBOelJhbmdlUGlja2VyQ29tcG9uZW50LCBOelNlbGVjdENvbXBvbmVudCwgTnpUaW1lUGlja2VyQ29tcG9uZW50IH0gZnJvbSAnbmctem9ycm8tYW50ZCc7XG5pbXBvcnQgeyBTdWJqZWN0LCBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGRlYm91bmNlVGltZSB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IFRvdGFsT3B0aW9uIH0gZnJvbSAnLi4vaGQtZGV0YWlsLWxpbmVzL2hkLWRldGFpbC1saW5lcy5zZXJ2aWNlJztcbmltcG9ydCB7IEZvcm1MaW5lLCBGb3JtTGluZVR5cGUgfSBmcm9tICcuL2hkLWZvcm0tbGluZXMuc2VydmljZSc7XG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdoZC1mb3JtLWxpbmVzJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2hkLWZvcm0tbGluZXMuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9oZC1mb3JtLWxpbmVzLmNvbXBvbmVudC5sZXNzJ11cbn0pXG5leHBvcnQgY2xhc3MgSGRGb3JtTGluZXNDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuICBAVmlld0NoaWxkcmVuKCdmb3JtSW5wdXREb20nKSBmb3JtSW5wdXREb21MaXN0ITogUXVlcnlMaXN0PEVsZW1lbnRSZWY+O1xuXG4gIEBJbnB1dCgpIEBJbnB1dEJvb2xlYW4oKSB0YWJsZUxvYWRpbmc6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KCkgQElucHV0Qm9vbGVhbigpIHNob3dTZWFyY2g6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KCkgZm9ybUxpbmVzOiBBcnJheTxGb3JtTGluZT47XG4gIC8vIOmSiOWvuWZvcm1MaW5lc+mHjOmdouaJgOacieeahG5hbWXvvIxcbiAgQElucHV0KCkgZm9ybUxpbmVzRGF0YTogYW55O1xuICBASW5wdXQoKSBvcGVyYXRlQnV0dG9uczogQXJyYXk8c3RyaW5nPiA9IFsnYWRkJywgJ2RlbGV0ZSddO1xuICBASW5wdXQoKSBzY3JvbGw6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nOyB9ID0geyB4OiAnMXB4JyB9O1xuICBAT3V0cHV0KCkgY2hhbmdlRXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIEBJbnB1dCgpIEBJbnB1dEJvb2xlYW4oKSBzaG93RGVsZXRlQ29uZmlybTogYm9vbGVhbiA9IGZhbHNlO1xuICBwYWdpbmF0aW9uUGFnZUluZGV4OiBudW1iZXIgPSAxO1xuICAvLyBUT0RPOui/memHjOaaguaXtuWPmOaIkDLmnaHljrvlpITnkIbvvIzlgZrlrozkuYvlkI7pnIDopoHmlLnmiJAxMFxuICBwYWdpbmF0aW9uUGFnZVNpemU6IG51bWJlciA9IDM7XG4gIHZhbGlkYXRlSGRGb3JtTGluZXM6IEZvcm1Hcm91cDtcbiAgbmV3TGluZTogYW55O1xuICBpbnB1dFZhbHVlOiBzdHJpbmc7XG5cbiAgLy8g5ZCI6K6h5Yy65Z+fXG4gIEBJbnB1dCgpIEBJbnB1dEJvb2xlYW4oKSBzaG93VG90YWw6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KCkgdG90YWxPcHRpb246IEFycmF5PFRvdGFsT3B0aW9uPiA9IFtdO1xuICBASW5wdXQoKSBjb2x1bW5zTnVtYmVyOiBudW1iZXIgfCBzdHJpbmcgPSAwO1xuICB0b3RhbE9wdGlvbkxpc3QgPSBbXTtcblxuICBzaG93Rm9ybTogYm9vbGVhbiA9IGZhbHNlO1xuICBmaWx0ZXJTdHI6IHN0cmluZztcbiAgc3RvcmVGb3JtTGluZXNEYXRhOiBhbnkgPSBbXTsgLy8g57yT5a2Y55qE5oC755qE6KGo5Y2V5pWw5o2uXG4gIGZpbHRlclN0b3JlRm9ybUxpbmVzRGF0YTogYW55ID0gW107IC8vIOetm+mAieWHuuadpeeahOaVsOaNruWIl+ihqFxuICBmaWx0ZXJJbmRleFN0b3JlOiBBcnJheTxudW1iZXI+ID0gW107IC8vIOetm+mAieWHuuadpeeahOaVsOaNruWcqOWOn+Wni+WIl+ihqOS4reeahOS4i+agh1xuICBpc0ZpbHRlckRhdGE6IGJvb2xlYW4gPSBmYWxzZTsgLy8g5piv5ZCm5piv5bey57uP562b6YCJ6L+H55qE5pWw5o2uXG4gIGZvcm1WYWxpZDogYm9vbGVhbiA9IGZhbHNlOyAvLyDooajljZXlvZPliY3nmoTnirbmgIFcbiAgcHJpdmF0ZSBzZWFyY2hTdWJqZWN0ID0gbmV3IFN1YmplY3Q8eyBmbjogYW55LCBldmVudDogYW55LCBsaW5lOiBhbnk7IH0+KCk7XG4gIHByaXZhdGUgZGVib3VuY2VUaW1lb3V0OiBudW1iZXIgPSAwOyAgLy8g6buY6K6k6Ziy5oqW5pe26Ze0XG5cbiAgcHJpdmF0ZSBzZWFyY2hTdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbiB8IHVuZGVmaW5lZDtcblxuICAvLyDlvZPliY3pobXnmoRkb23kuoznu7TmlbDnu4RcbiAgY29sbGVjdERvbUxpc3Q6IEFycmF5PEFycmF5PEVsZW1lbnRSZWYgfCBOelNlbGVjdENvbXBvbmVudCB8IE56SW5wdXROdW1iZXJDb21wb25lbnQgfCBOekRhdGVQaWNrZXJDb21wb25lbnQgfCBOelJhbmdlUGlja2VyQ29tcG9uZW50IHwgTnpUaW1lUGlja2VyQ29tcG9uZW50Pj4gPSBbXTtcbiAgLy8g5b2T5YmN6IGa54Sm55qEZG9t5YWD57Sg5Z2Q5qCHXG4gIGFjdGl2ZURvbVg6IG51bWJlciA9IG51bGw7XG4gIGFjdGl2ZURvbVk6IG51bWJlciA9IG51bGw7XG4gIGFjdGl2ZURvbTogRWxlbWVudFJlZiB8IE56U2VsZWN0Q29tcG9uZW50IHwgTnpJbnB1dE51bWJlckNvbXBvbmVudCB8IE56RGF0ZVBpY2tlckNvbXBvbmVudCB8IE56UmFuZ2VQaWNrZXJDb21wb25lbnQgfCBOelRpbWVQaWNrZXJDb21wb25lbnQgPSBudWxsO1xuICBhY3RpdmVTZWxlY3RlZENvbXBvbmVudE9wZW46IGJvb2xlYW4gPSBmYWxzZTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGZiOiBGb3JtQnVpbGRlciwgcHJpdmF0ZSBjZHI6IENoYW5nZURldGVjdG9yUmVmKSB7XG4gICAgdGhpcy5zZWFyY2hTdWJzY3JpcHRpb24gPSB0aGlzLnNlYXJjaFN1YmplY3QucGlwZShcbiAgICAgIGRlYm91bmNlVGltZSh0aGlzLmRlYm91bmNlVGltZW91dClcbiAgICApLnN1YnNjcmliZSgoeyBmbiwgZXZlbnQsIGxpbmUgfSkgPT4gdGhpcy50cmlnZ2VyRXZlbnQoZm4sIGV2ZW50LCBsaW5lKSk7XG4gIH1cblxuICBuZ09uSW5pdCgpIHtcbiAgICAvLyDnvJPlrZjkuIDkuIvmgLvnmoTooajljZXmlbDmja5cbiAgICB0aGlzLnN0b3JlRm9ybUxpbmVzRGF0YSA9IHRoaXMuZm9ybUxpbmVzRGF0YTtcbiAgICB0aGlzLmluaXQoKTtcbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcbiAgICB0aGlzLmNvbGxlY3REb21EYXRhKCk7XG4gIH1cblxuICBnZXQgZm9ybUxpbmVzTGVuZ3RoKCkge1xuICAgIHJldHVybiB0aGlzLmxpbmVzRm9ybUFycmF5LmNvbnRyb2xzLmxlbmd0aDtcbiAgfVxuXG4gIGNvbGxlY3REb21EYXRhKCkge1xuICAgIHRoaXMuY29sbGVjdERvbUxpc3QgPSBbXTtcbiAgICBjb25zdCBwYWdlRG9tTGlzdCA9IHRoaXMuZm9ybUlucHV0RG9tTGlzdC50b0FycmF5KCk7XG4gICAgLy8gU3RlcCAxOiDojrflj5blvZPliY3pobXnmoTmlbDmja7ph49cbiAgICBjb25zdCBzdGFydEluZGV4ID0gKHRoaXMucGFnaW5hdGlvblBhZ2VJbmRleCAtIDEpICogdGhpcy5wYWdpbmF0aW9uUGFnZVNpemU7XG4gICAgY29uc3QgZW5kSW5kZXggPSB0aGlzLnBhZ2luYXRpb25QYWdlSW5kZXggKiB0aGlzLnBhZ2luYXRpb25QYWdlU2l6ZTtcbiAgICBjb25zdCBhZGp1c3RlZEVuZEluZGV4ID0gZW5kSW5kZXggPiB0aGlzLmZvcm1MaW5lc0xlbmd0aCA/IHRoaXMuZm9ybUxpbmVzTGVuZ3RoIDogZW5kSW5kZXg7XG4gICAgY29uc3QgcGFnZUxpbmVzTGVuZ3RoID0gYWRqdXN0ZWRFbmRJbmRleCAtIHN0YXJ0SW5kZXg7XG5cbiAgICBjb25zdCBpbnRlcnZhbCA9IHBhZ2VEb21MaXN0Lmxlbmd0aCAvIHBhZ2VMaW5lc0xlbmd0aDtcbiAgICAvLyBTdGVwIDI6IOaLhuWIhmZvcm1JbnB1dERvbUxpc3RcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBhZ2VMaW5lc0xlbmd0aDsgaSsrKSB7XG4gICAgICB0aGlzLmNvbGxlY3REb21MaXN0LnB1c2gocGFnZURvbUxpc3Quc3BsaWNlKDAsIGludGVydmFsKSk7XG4gICAgfVxuICAgIC8vIOWFs+mXreaJgOaciU56SW5wdXROdW1iZXJDb21wb25lbnTnmoTplK7nm5jkuIrkuIvnrq3lpLTop6blj5ErLeeahOWKn+iDvVxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5jb2xsZWN0RG9tTGlzdC5sZW5ndGg7IGkrKykge1xuICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCB0aGlzLmNvbGxlY3REb21MaXN0W2ldLmxlbmd0aDsgaisrKSB7XG4gICAgICAgIGNvbnN0IGRvbSA9IHRoaXMuY29sbGVjdERvbUxpc3RbaV1bal07XG4gICAgICAgIGlmIChkb20gaW5zdGFuY2VvZiBOeklucHV0TnVtYmVyQ29tcG9uZW50KSB7XG4gICAgICAgICAgZG9tLmRvd24gPSAoKSA9PiB7IH07XG4gICAgICAgICAgZG9tLnVwID0gKCkgPT4geyB9O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8g6IGa54Sm5LiL5LiA5LiqZG9tXG4gIGp1bXBUb05leHRJbnB1dCh4OiBudW1iZXIsIHk6IG51bWJlcikge1xuICAgIGlmICh4ID09PSBudWxsIHx8IHkgPT09IG51bGwgfHwgIXRoaXMuY29sbGVjdERvbUxpc3QgfHwgdGhpcy5jb2xsZWN0RG9tTGlzdC5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8g5aaC5p6c5piv5pyA5ZCO5LiA5Liq5Y+v6L6T5YWl5YWD57Sg77yM5paw5aKe6KGMXG4gICAgaWYgKHggPT09IHRoaXMuY29sbGVjdERvbUxpc3QubGVuZ3RoIC0gMSAmJiB5ID09PSB0aGlzLmNvbGxlY3REb21MaXN0WzBdLmxlbmd0aCAtIDEpIHtcbiAgICAgIHRoaXMuYWRkTmV3TGluZUFuZEZvY3VzKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICh5ID09PSB0aGlzLmNvbGxlY3REb21MaXN0WzBdLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgLy8g5aaC5p6c5piv5pyA5ZCO5LiA5YiX77yM5YiZ6Lez6L2s5Yiw5LiL5LiA6KGM56ys5LiA5Liq6L6T5YWl5qGGXG4gICAgICAgIHRoaXMuZm9jdXNEb20oeCArIDEsIDAsICdyaWdodCcpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8g5aaC5p6c5LiN5piv5pyA5ZCO5LiA5YiX77yM5YiZ6Lez6L2s5Yiw5b2T5YmN6KGM5LiL5LiA5Liq6L6T5YWl5qGGXG4gICAgICAgIHRoaXMuZm9jdXNEb20oeCwgeSArIDEsICdyaWdodCcpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiDlop7liqDmlrDooYzlubbkuJTogZrnhKbliLDnrKzkuIDkuKrlhYPntKDvvIxcbiAgICog6L+Z6YeM6KaB5rOo5oSP77yM5aaC5p6c5a2Y5Zyo57+76aG15oOF5Ya177yM6ZyA6KaB5aSE55CGXG4gICAqL1xuICBhZGROZXdMaW5lQW5kRm9jdXMoKSB7XG4gICAgLy8g5b2T5YmN6KGM5Li65b2T5YmN6aG15pyA5ZCO5LiA6KGM55qE5pe25YCZ77yM5Yik5pat5LiL5LiA6aG15piv5ZCm5pyJ5pWw5o2uXG4gICAgLy8gMeOAgeWmguaenOacie+8mue/u+mhtSvogZrnhKbnrKzkuIDooYznrKzkuIDkuKrlhYPntKBcbiAgICAvLyAy44CB5aaC5p6c5rKh5pyJ77ya5paw5aKe6KGMK+e/u+mhtSvogZrnhKbnrKzkuIDooYznrKzkuIDkuKrlhYPntKBcbiAgICBpZiAodGhpcy5hY3RpdmVEb21YID09PSB0aGlzLnBhZ2luYXRpb25QYWdlU2l6ZSAtIDEpIHtcbiAgICAgIC8vIOWIpOaWreS4i+S4gOmhteaYr+WQpuacieaVsOaNrlxuICAgICAgaWYgKHRoaXMucGFnaW5hdGlvblBhZ2VJbmRleCA8IE1hdGguY2VpbCh0aGlzLmZvcm1MaW5lc0xlbmd0aCAvIHRoaXMucGFnaW5hdGlvblBhZ2VTaXplKSkge1xuICAgICAgICAvLyDnv7vpobUr6IGa54Sm56ys5LiA6KGM56ys5LiA5Liq5YWD57SgXG4gICAgICAgIHRoaXMucGFnaW5hdGlvblBhZ2VJbmRleCsrO1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICB0aGlzLmNvbGxlY3REb21EYXRhKCk7XG4gICAgICAgICAgdGhpcy5mb2N1c0RvbSgwLCAwLCAncmlnaHQnKTtcbiAgICAgICAgfSwgMCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyDmlrDlop7ooYwr57+76aG1K+iBmueEpuesrOS4gOihjOesrOS4gOS4quWFg+e0oFxuICAgICAgICB0aGlzLmFkZEZvcm1MaW5lKCk7XG4gICAgICAgIHRoaXMucGFnaW5hdGlvblBhZ2VJbmRleCsrO1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICB0aGlzLmNvbGxlY3REb21EYXRhKCk7XG4gICAgICAgICAgdGhpcy5mb2N1c0RvbSgwLCAwKTtcbiAgICAgICAgfSwgMCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuYWRkRm9ybUxpbmUoKTtcbiAgICB9XG4gIH1cblxuICAvLyDogZrnhKbliLDkuIrkuIDkuKpkb21cbiAganVtcFRvUHJldklucHV0KHg6IG51bWJlciwgeTogbnVtYmVyKSB7XG4gICAgaWYgKHggPT09IG51bGwgfHwgeSA9PT0gbnVsbCB8fCAhdGhpcy5jb2xsZWN0RG9tTGlzdCB8fCB0aGlzLmNvbGxlY3REb21MaXN0Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoeCA9PT0gMCAmJiB5ID09PSAwKSB7XG4gICAgICAvLyDlpoLmnpzmmK/nrKzkuIDkuKrlj6/ovpPlhaXlhYPntKDvvIwg5Yik5pat5piv5ZCm5pyJ5LiK5LiA6aG177yMIOWmguaenOacie+8jOWImee/u+mhtSvogZrnhKbliLDkuIrkuIDpobXmnIDlkI7kuIDkuKrlhYPntKBcbiAgICAgIGlmICh0aGlzLnBhZ2luYXRpb25QYWdlSW5kZXggPiAxKSB7XG4gICAgICAgIC8vIOe/u+mhtSvogZrnhKbliLDkuIrkuIDpobXmnIDlkI7kuIDkuKrlhYPntKBcbiAgICAgICAgdGhpcy5wYWdpbmF0aW9uUGFnZUluZGV4LS07XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIHRoaXMuY29sbGVjdERvbURhdGEoKTtcbiAgICAgICAgICB0aGlzLmZvY3VzRG9tKHRoaXMuY29sbGVjdERvbUxpc3QubGVuZ3RoIC0gMSwgdGhpcy5jb2xsZWN0RG9tTGlzdFswXS5sZW5ndGggLSAxKTtcbiAgICAgICAgfSwgMCk7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICh5ID09PSAwKSB7XG4gICAgICAgIC8vIOWmguaenOaYr+esrOS4gOWIl++8jOWImei3s+i9rOWIsOS4iuS4gOihjOacgOWQjuS4gOS4qui+k+WFpeahhlxuICAgICAgICB0aGlzLmZvY3VzRG9tKHggLSAxLCB0aGlzLmNvbGxlY3REb21MaXN0WzBdLmxlbmd0aCAtIDEsICdsZWZ0Jyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyDlpoLmnpzkuI3mmK/nrKzkuIDliJfvvIzliJnot7PovazliLDlvZPliY3ooYzkuIrkuIDkuKrovpPlhaXmoYZcbiAgICAgICAgdGhpcy5mb2N1c0RvbSh4LCB5IC0gMSwgJ2xlZnQnKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICog6IGa54Sm5Yiw5p+Q5LiqZG9tXG4gICAqIEBwYXJhbSB4IOWdkOagh3hcbiAgICogQHBhcmFtIHkg5Z2Q5qCHeVxuICAgKiBAcGFyYW0ganVtcERpcmVjdGlvbiDot7PovazmlrnlkJFcbiAgICovXG4gIGZvY3VzRG9tKHg6IG51bWJlciwgeTogbnVtYmVyLCBqdW1wRGlyZWN0aW9uOiBzdHJpbmcgPSAncmlnaHQnKSB7XG4gICAgaWYgKHggPT09IG51bGwgfHwgeSA9PT0gbnVsbCB8fCAhdGhpcy5jb2xsZWN0RG9tTGlzdCB8fCB0aGlzLmNvbGxlY3REb21MaXN0Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyDlhYjmuIXpmaTkuIDkuIvlvZPliY3nmoTnhKbngrlcbiAgICB0aGlzLmNsZWFuRm9jdXNEb20odGhpcy5hY3RpdmVEb21YLCB0aGlzLmFjdGl2ZURvbVkpO1xuICAgIGlmICh0aGlzLmNvbGxlY3REb21MaXN0W3hdICYmIHRoaXMuY29sbGVjdERvbUxpc3RbeF1beV0pIHtcbiAgICAgIGNvbnN0IGRvbSA9IHRoaXMuY29sbGVjdERvbUxpc3RbeF1beV07XG4gICAgICAvLyDpnIDopoHliKTmlq3kuIvkuIDkuKpmb2N1c+eahGRvbeaYr+WQpuaYr+emgeeUqOeKtuaAge+8jOWmguaenOaYr+emgeeUqOeKtuaAgemcgOimgei3s+i/h1xuICAgICAgaWYgKGRvbSBpbnN0YW5jZW9mIE56U2VsZWN0Q29tcG9uZW50KSB7XG4gICAgICAgIGlmIChkb20ubnpEaXNhYmxlZCkge1xuICAgICAgICAgIGlmIChqdW1wRGlyZWN0aW9uID09PSAncmlnaHQnKSB7XG4gICAgICAgICAgICB0aGlzLmp1bXBUb05leHRJbnB1dCh4LCB5KTtcbiAgICAgICAgICB9IGVsc2UgaWYgKGp1bXBEaXJlY3Rpb24gPT09ICdsZWZ0Jykge1xuICAgICAgICAgICAgdGhpcy5qdW1wVG9QcmV2SW5wdXQoeCwgeSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBkb20ubnpTZWxlY3RUb3BDb250cm9sQ29tcG9uZW50LmlucHV0RWxlbWVudC5uYXRpdmVFbGVtZW50LnNjcm9sbEludG9WaWV3KHsgYmVoYXZpb3I6ICdzbW9vdGgnLCBibG9jazogJ2NlbnRlcicsIGlubGluZTogJ2NlbnRlcicgfSk7XG4gICAgICAgIC8vIOi/memHjOWkmumAieahhumcgOimgemineWkluWkhOeQhuS4i++8jOWboOS4uuWQkeS4i+eahOaXtuWAmeS8muinpuWPkeWGhemDqElucHV055qE6IGa54Sm77yM5oqK5LiL5LiA5LiqZG9t55qEZm9jdXPmlL7liLDlro/ku7vliqHkuK3vvIzlu7bov5/lpITnkIbjgIJcbiAgICAgICAgaWYgKGRvbS5uelNlbGVjdFNlcnZpY2UubW9kZSA9PT0gJ211bHRpcGxlJykge1xuICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgZG9tLmZvY3VzKCk7XG4gICAgICAgICAgfSwgMCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZG9tLmZvY3VzKCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoZG9tIGluc3RhbmNlb2YgTnpJbnB1dE51bWJlckNvbXBvbmVudCkge1xuICAgICAgICBpZiAoZG9tLm56RGlzYWJsZWQpIHtcbiAgICAgICAgICBpZiAoanVtcERpcmVjdGlvbiA9PT0gJ3JpZ2h0Jykge1xuICAgICAgICAgICAgdGhpcy5qdW1wVG9OZXh0SW5wdXQoeCwgeSk7XG4gICAgICAgICAgfSBlbHNlIGlmIChqdW1wRGlyZWN0aW9uID09PSAnbGVmdCcpIHtcbiAgICAgICAgICAgIHRoaXMuanVtcFRvUHJldklucHV0KHgsIHkpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgaW5wdXREb206IGFueSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGRvbS5ueklkKTtcbiAgICAgICAgaW5wdXREb20uZm9jdXMoKTtcbiAgICAgICAgaW5wdXREb20uc2Nyb2xsSW50b1ZpZXcoeyBiZWhhdmlvcjogJ3Ntb290aCcsIGJsb2NrOiAnY2VudGVyJywgaW5saW5lOiAnY2VudGVyJyB9KTtcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgaW5wdXREb20uc2VsZWN0KCk7XG4gICAgICAgIH0sIDApO1xuICAgICAgfSBlbHNlIGlmIChkb20gaW5zdGFuY2VvZiBFbGVtZW50UmVmKSB7XG4gICAgICAgIGlmIChkb20ubmF0aXZlRWxlbWVudC5kaXNhYmxlZCkge1xuICAgICAgICAgIGlmIChqdW1wRGlyZWN0aW9uID09PSAncmlnaHQnKSB7XG4gICAgICAgICAgICB0aGlzLmp1bXBUb05leHRJbnB1dCh4LCB5KTtcbiAgICAgICAgICB9IGVsc2UgaWYgKGp1bXBEaXJlY3Rpb24gPT09ICdsZWZ0Jykge1xuICAgICAgICAgICAgdGhpcy5qdW1wVG9QcmV2SW5wdXQoeCwgeSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBkb20ubmF0aXZlRWxlbWVudC5mb2N1cygpO1xuICAgICAgICBkb20ubmF0aXZlRWxlbWVudC5zY3JvbGxJbnRvVmlldyh7IGJlaGF2aW9yOiAnc21vb3RoJywgYmxvY2s6ICdjZW50ZXInLCBpbmxpbmU6ICdjZW50ZXInIH0pO1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICBkb20ubmF0aXZlRWxlbWVudC5zZWxlY3QoKTtcbiAgICAgICAgfSwgMCk7XG4gICAgICB9IGVsc2UgaWYgKGRvbSBpbnN0YW5jZW9mIE56RGF0ZVBpY2tlckNvbXBvbmVudCB8fCBkb20gaW5zdGFuY2VvZiBOelJhbmdlUGlja2VyQ29tcG9uZW50IHx8IGRvbSBpbnN0YW5jZW9mIE56VGltZVBpY2tlckNvbXBvbmVudCkge1xuICAgICAgICAvLyBUT0RPOuWcqG5nem9ycm84LjUueOeJiOacrO+8jOaXtumXtOebuOWFs+eahOmAieaLqeWZqOayoeacieaatOmcsuWHum9wZW7mlrnms5XvvIzmmoLml7blhYjkuI3lpITnkIbjgILvvIgxMC545Y+K5Lul5LiK54mI5pys5o+Q5L6b5LqGb3BlbuaWueazle+8iVxuICAgICAgICBpZiAoanVtcERpcmVjdGlvbiA9PT0gJ3JpZ2h0Jykge1xuICAgICAgICAgIHRoaXMuanVtcFRvTmV4dElucHV0KHgsIHkpO1xuICAgICAgICB9IGVsc2UgaWYgKGp1bXBEaXJlY3Rpb24gPT09ICdsZWZ0Jykge1xuICAgICAgICAgIHRoaXMuanVtcFRvUHJldklucHV0KHgsIHkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRoaXMuc2V0QWN0aXZlRG9tKHgsIHkpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyDmsqHmnIlkb23nmoTlnLrmma/kuIvvvIzpnIDopoHliKTmlq3mmK/lt6bov5jmmK/lj7PvvIxcbiAgICB9XG4gIH1cblxuICBjbGVhbkZvY3VzRG9tKHg6IG51bWJlciwgeTogbnVtYmVyKSB7XG4gICAgaWYgKHggPT09IG51bGwgfHwgeSA9PT0gbnVsbCB8fCAhdGhpcy5jb2xsZWN0RG9tTGlzdCB8fCB0aGlzLmNvbGxlY3REb21MaXN0Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodGhpcy5jb2xsZWN0RG9tTGlzdFt4XSAmJiB0aGlzLmNvbGxlY3REb21MaXN0W3hdW3ldKSB7XG4gICAgICBjb25zdCBkb20gPSB0aGlzLmNvbGxlY3REb21MaXN0W3hdW3ldO1xuICAgICAgaWYgKGRvbSBpbnN0YW5jZW9mIE56U2VsZWN0Q29tcG9uZW50KSB7XG4gICAgICAgIGRvbS5ibHVyKCk7XG4gICAgICAgIGRvbS5uek9wZW4gPSBmYWxzZTtcbiAgICAgIH0gZWxzZSBpZiAoZG9tIGluc3RhbmNlb2YgTnpJbnB1dE51bWJlckNvbXBvbmVudCkge1xuICAgICAgICBkb20ubnpPcGVuID0gZmFsc2U7XG4gICAgICAgIGRvbS5ibHVyKCk7XG4gICAgICB9IGVsc2UgaWYgKGRvbSBpbnN0YW5jZW9mIEVsZW1lbnRSZWYpIHtcbiAgICAgICAgZG9tLm5hdGl2ZUVsZW1lbnQuYmx1cigpO1xuICAgICAgfSBlbHNlIHsgfVxuICAgIH1cbiAgfVxuXG4gIHNldEFjdGl2ZURvbSh4OiBudW1iZXIsIHk6IG51bWJlcikge1xuICAgIHRoaXMuYWN0aXZlRG9tWCA9IHg7XG4gICAgdGhpcy5hY3RpdmVEb21ZID0geTtcbiAgICB0aGlzLmFjdGl2ZURvbSA9IHRoaXMuY29sbGVjdERvbUxpc3RbdGhpcy5hY3RpdmVEb21YXVt0aGlzLmFjdGl2ZURvbVldO1xuICAgIGlmICh0aGlzLmFjdGl2ZURvbSBpbnN0YW5jZW9mIE56U2VsZWN0Q29tcG9uZW50KSB7XG4gICAgICB0aGlzLmFjdGl2ZVNlbGVjdGVkQ29tcG9uZW50T3BlbiA9IHRoaXMuYWN0aXZlRG9tLm9wZW47XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIOagueaNruihjOWPt+WSjOWIl+WPt+WQjeensOiOt+WPluW9k+WJjeiBmueEpueahGRvbeS9jee9rlxuICAgKiBAcGFyYW0gcm93TnVtYmVyIOihjOWPt1xuICAgKiBAcGFyYW0gY29sTnVtYmVyIOWIl+WPtyBcbiAgICovXG4gIHNldEFjdGl2ZURvbUluRm9ybUxpbmVzKHJvd051bWJlcjogbnVtYmVyLCBjb2xOdW1iZXI6IG51bWJlcikge1xuICAgIHRoaXMuYWN0aXZlRG9tWCA9IHJvd051bWJlcjtcbiAgICB0aGlzLmFjdGl2ZURvbVkgPSB0aGlzLmdldERvbUluZGV4KGNvbE51bWJlciwgdGhpcy5mb3JtTGluZXMpO1xuICAgIHRoaXMuc2V0QWN0aXZlRG9tKHRoaXMuYWN0aXZlRG9tWCwgdGhpcy5hY3RpdmVEb21ZKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDplK7nm5jngrnlh7vkuovku7ZcbiAgICogQHBhcmFtIGV2ZW50IOmUruebmOS6i+S7tlxuICAgKiBAcmV0dXJucyBcbiAgICovXG4gIG9uS2V5RG93bihldmVudDogS2V5Ym9hcmRFdmVudCkge1xuICAgIGlmICh0aGlzLmFjdGl2ZURvbVggPT09IG51bGwgfHwgdGhpcy5hY3RpdmVEb21ZID09PSBudWxsKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHN3aXRjaCAoZXZlbnQua2V5KSB7XG4gICAgICBjYXNlICdBcnJvd1VwJzpcbiAgICAgICAgaWYgKHRoaXMuYWN0aXZlRG9tIGluc3RhbmNlb2YgTnpTZWxlY3RDb21wb25lbnQgJiYgdGhpcy5hY3RpdmVTZWxlY3RlZENvbXBvbmVudE9wZW4pIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuYWN0aXZlRG9tWCAhPT0gMCkge1xuICAgICAgICAgIHRoaXMuZm9jdXNEb20odGhpcy5hY3RpdmVEb21YIC0gMSwgdGhpcy5hY3RpdmVEb21ZKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ0Fycm93RG93bic6XG4gICAgICAgIC8vIOWIpOaWreaYr+WQpuWcqOacgOWQjuS4gOihjO+8jOWmguaenOWcqOacgOWQjuS4gOihjO+8jOebtOaOpSvooYznv7vpobVcbiAgICAgICAgaWYgKHRoaXMuYWN0aXZlRG9tIGluc3RhbmNlb2YgTnpTZWxlY3RDb21wb25lbnQgJiYgdGhpcy5hY3RpdmVTZWxlY3RlZENvbXBvbmVudE9wZW4pIHtcblxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5hY3RpdmVEb21YICE9PSB0aGlzLmNvbGxlY3REb21MaXN0Lmxlbmd0aCAtIDEpIHtcbiAgICAgICAgICB0aGlzLmZvY3VzRG9tKHRoaXMuYWN0aXZlRG9tWCArIDEsIHRoaXMuYWN0aXZlRG9tWSk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdBcnJvd0xlZnQnOlxuICAgICAgICB0aGlzLmp1bXBUb1ByZXZJbnB1dCh0aGlzLmFjdGl2ZURvbVgsIHRoaXMuYWN0aXZlRG9tWSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnQXJyb3dSaWdodCc6XG4gICAgICAgIHRoaXMuanVtcFRvTmV4dElucHV0KHRoaXMuYWN0aXZlRG9tWCwgdGhpcy5hY3RpdmVEb21ZKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdFbnRlcic6XG4gICAgICAgIGlmICh0aGlzLmFjdGl2ZURvbSBpbnN0YW5jZW9mIE56U2VsZWN0Q29tcG9uZW50KSB7XG4gICAgICAgICAgdGhpcy5hY3RpdmVTZWxlY3RlZENvbXBvbmVudE9wZW4gPSB0aGlzLmFjdGl2ZURvbS5vcGVuO1xuICAgICAgICAgIGlmICh0aGlzLmFjdGl2ZVNlbGVjdGVkQ29tcG9uZW50T3BlbiA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIHRoaXMuZm9jdXNEb20odGhpcy5hY3RpdmVEb21YLCB0aGlzLmFjdGl2ZURvbVkpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5hY3RpdmVEb21YID09PSB0aGlzLmNvbGxlY3REb21MaXN0Lmxlbmd0aCAtIDEpIHtcbiAgICAgICAgICB0aGlzLmFkZE5ld0xpbmVBbmRGb2N1cygpO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnRXNjYXBlJzpcbiAgICAgICAgaWYgKHRoaXMuYWN0aXZlRG9tIGluc3RhbmNlb2YgTnpTZWxlY3RDb21wb25lbnQpIHtcbiAgICAgICAgICBjb25zdCBub3dBY3RpdmVEb20gPSB0aGlzLmFjdGl2ZURvbSBhcyBOelNlbGVjdENvbXBvbmVudDtcbiAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuYWN0aXZlU2VsZWN0ZWRDb21wb25lbnRPcGVuID0gbm93QWN0aXZlRG9tLm9wZW47XG4gICAgICAgICAgICBpZiAodGhpcy5hY3RpdmVTZWxlY3RlZENvbXBvbmVudE9wZW4gPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgIGlmIChub3dBY3RpdmVEb20ubnpTZWxlY3RTZXJ2aWNlLm1vZGUgPT09ICdtdWx0aXBsZScpIHtcbiAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICAgIHRoaXMuZm9jdXNEb20odGhpcy5hY3RpdmVEb21YLCB0aGlzLmFjdGl2ZURvbVkpO1xuICAgICAgICAgICAgICAgIH0sIDApO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuZm9jdXNEb20odGhpcy5hY3RpdmVEb21YLCB0aGlzLmFjdGl2ZURvbVkpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSwgMCk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICAvLyDlpoLmnpzlvZPliY3ogZrnhKbnmoTmmK/pgInmi6nmoYbvvIzkuJTplK7lhaUwLTlhLXpBLVrvvIzliJnlvLnlh7pcbiAgICAgICAgaWYgKHRoaXMuYWN0aXZlRG9tIGluc3RhbmNlb2YgTnpTZWxlY3RDb21wb25lbnQgJiYgdGhpcy5hY3RpdmVTZWxlY3RlZENvbXBvbmVudE9wZW4gPT09IGZhbHNlICYmIC9eWzAtOWEtekEtWl0kLy50ZXN0KGV2ZW50LmtleSkpIHtcbiAgICAgICAgICBjb25zdCBkb20gPSB0aGlzLmFjdGl2ZURvbTtcbiAgICAgICAgICBkb20ubnpPcGVuID0gdHJ1ZTtcbiAgICAgICAgICB0aGlzLmFjdGl2ZVNlbGVjdGVkQ29tcG9uZW50T3BlbiA9IHRydWU7XG4gICAgICAgICAgLy8gLy8gVE9ETzrov5nph4zmmoLml7bms6jph4rvvIzkuI3og73nm7TmjqXluKblhaXplK7lhaXlgLzvvIzov5nmoLfkvJrlr7zoh7TovpPlhaXkuK3mlofnmoTml7blgJnluKblhaXoi7HmloflrZfnrKbvvIzkuI3nrKblkIjpooTmnJ9cbiAgICAgICAgICAvLyBkb20ubnpTZWxlY3RUb3BDb250cm9sQ29tcG9uZW50LmlucHV0VmFsdWUgPSBldmVudC5rZXk7XG4gICAgICAgICAgLy8gLy8g6I635Y+WIGlucHV0IOWFg+e0oFxuICAgICAgICAgIC8vIGNvbnN0IGlucHV0RWxlbWVudCA9IGRvbS5uelNlbGVjdFRvcENvbnRyb2xDb21wb25lbnQuaW5wdXRFbGVtZW50Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgICAgICAgLy8gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgLy8gICAvLyDop6blj5HovpPlhaXkuovku7bvvIzku6Xnoa7kv50gQW5ndWxhciDmo4DmtYvliLDlgLznmoTlj5jljJZcbiAgICAgICAgICAvLyAgIGNvbnN0IGV2ZW50SW5wdXQgPSBuZXcgRXZlbnQoJ2lucHV0JywgeyBidWJibGVzOiB0cnVlIH0pO1xuICAgICAgICAgIC8vICAgaW5wdXRFbGVtZW50LmRpc3BhdGNoRXZlbnQoZXZlbnRJbnB1dCk7XG4gICAgICAgICAgLy8gfSwgMCk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG4gIC8qKlxuICAgKiDmoLnmja7lnKjliJ3lp4tkb23kuIvmoIflkozmlbDmja7pm4Yg6I635Y+W5ZyoY29sbGVjdERvbUxpc3TkuK3nmoTkuIvmoIdcbiAgICogQHBhcmFtIGluZGV4IOWIneWni+S4i+agh1xuICAgKiBAcGFyYW0gbGlzdCDmlbDmja7pm4ZcbiAgICogQHJldHVybnMgXG4gICAqL1xuICBwcml2YXRlIGdldERvbUluZGV4KGluZGV4OiBudW1iZXIsIGxpc3Q6IEFycmF5PEZvcm1MaW5lPik6IG51bWJlciB7XG4gICAgY29uc3QgdHlwZUxpc3QgPSBbJ0lucHV0JywgJ1NlbGVjdCcsICdEYXRlJywgJ0RhdGVSYW5nZScsICdUZXh0QXJlYScsICdJbnB1dE51bWJlcicsICdNdWx0aXBsZVNlbGVjdCddO1xuICAgIGxldCBmaWx0ZXJMaXN0ID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoaSA9PT0gaW5kZXgpIHtcbiAgICAgICAgcmV0dXJuIGZpbHRlckxpc3QubGVuZ3RoO1xuICAgICAgfVxuICAgICAgaWYgKHR5cGVMaXN0LmluY2x1ZGVzKGxpc3RbaV0udHlwZSkpIHtcbiAgICAgICAgZmlsdGVyTGlzdC5wdXNoKGxpc3RbaV0pO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIC8vIFRPRE865b6F5YigXG4gIHRlc3RQYWdlKCkge1xuICAgIHRoaXMucGFnaW5hdGlvblBhZ2VJbmRleCsrO1xuICB9XG5cbiAgZ2V0IGxpbmVzRm9ybUFycmF5KCk6IGFueSB7XG4gICAgcmV0dXJuIHRoaXMudmFsaWRhdGVIZEZvcm1MaW5lcy5nZXQoJ2xpbmVzJykgYXMgRm9ybUFycmF5O1xuICB9XG5cbiAgZ2V0IExvZGFzaFJvdW5kKCkge1xuICAgIHJldHVybiByb3VuZDtcbiAgfVxuXG4gIC8vIOaatOmcsueahOaWueazle+8jOeUqOS6juiOt+WPluaJgOacieaVsOaNrueahHZhbGlk54q25oCBXG4gIHB1YmxpYyBnZXRWYWxpZCgpIHtcbiAgICByZXR1cm4gdGhpcy5mb3JtVmFsaWQ7XG4gIH1cblxuICBvblNlYXJjaEV2ZW50KGZuOiBhbnksIGV2ZW50OiBhbnksIGxpbmU6IGFueSwgb25TZWFyY2hFdmVudERlYm91bmNlVGltZTogYW55KSB7XG4gICAgaWYgKG9uU2VhcmNoRXZlbnREZWJvdW5jZVRpbWUpIHtcbiAgICAgIC8vIOabtOaWsOmYsuaKluaXtumXtFxuICAgICAgdGhpcy5kZWJvdW5jZVRpbWVvdXQgPSBvblNlYXJjaEV2ZW50RGVib3VuY2VUaW1lO1xuXG4gICAgICAvLyDlj5bmtojkuYvliY3nmoTorqLpmIVcbiAgICAgIGlmICh0aGlzLnNlYXJjaFN1YnNjcmlwdGlvbikge1xuICAgICAgICB0aGlzLnNlYXJjaFN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgICAgfVxuXG4gICAgICAvLyDliJvlu7rmlrDnmoTorqLpmIVcbiAgICAgIHRoaXMuc2VhcmNoU3Vic2NyaXB0aW9uID0gdGhpcy5zZWFyY2hTdWJqZWN0LnBpcGUoXG4gICAgICAgIGRlYm91bmNlVGltZSh0aGlzLmRlYm91bmNlVGltZW91dClcbiAgICAgICkuc3Vic2NyaWJlKCh7IGZuLCBldmVudCwgbGluZSB9KSA9PiB0aGlzLnRyaWdnZXJFdmVudChmbiwgZXZlbnQsIGxpbmUpKTtcblxuICAgICAgLy8g5Y+R6YCB5LqL5Lu2XG4gICAgICB0aGlzLnNlYXJjaFN1YmplY3QubmV4dCh7IGZuLCBldmVudCwgbGluZSB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy50cmlnZ2VyRXZlbnQoZm4sIGV2ZW50LCBsaW5lKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICpcbiAgICogQHBhcmFtIGZuIOeItue7hOS7tuWHveaVsFxuICAgKiBAcGFyYW0gZXZlbnQg5LqL5Lu25YC8XG4gICAqIEBwYXJhbSBsaW5lIOinpuWPkeeahOihjFxuICAgKi9cbiAgdHJpZ2dlckV2ZW50KGZuOiBhbnksIGV2ZW50OiBhbnksIGxpbmU6IGFueSkge1xuICAgIGlmIChmbikge1xuICAgICAgZm4oZXZlbnQsIGxpbmUpO1xuICAgIH1cbiAgfVxuXG4gIGlubmVyR2V0VmFsaWQoKSB7XG4gICAgbGV0IHRtcFZhbGlkYXRlSGRGb3JtTGluZXMgPSB0aGlzLmZiLmdyb3VwKHtcbiAgICAgICdsaW5lcyc6IHRoaXMuZmIuYXJyYXkoW10pXG4gICAgfSk7XG4gICAgdGhpcy5zdG9yZUZvcm1MaW5lc0RhdGEuZm9yRWFjaCgoZm9ybUxpbmVzRGF0YUl0ZW0pID0+IHtcbiAgICAgIGxldCBmb3JtR3JvdXBPYmo6IGFueSA9IHt9O1xuICAgICAgdGhpcy5mb3JtTGluZXMuZm9yRWFjaCgoaXRlbSkgPT4ge1xuICAgICAgICAvLyDmlrDlop7ooYwg5Yid5aeL5pWw5o2u6YO95Li6bnVsbFxuICAgICAgICBmb3JtR3JvdXBPYmpbaXRlbS5uYW1lXSA9IHRoaXMuZmIuY29udHJvbCh7IHZhbHVlOiBmb3JtTGluZXNEYXRhSXRlbVtpdGVtLm5hbWVdID09PSAwID8gMCA6IChmb3JtTGluZXNEYXRhSXRlbVtpdGVtLm5hbWVdIHx8IGl0ZW0udmFsdWUgfHwgbnVsbCksIGRpc2FibGVkOiBpdGVtLmRpc2FibGVkIH0sIGl0ZW0ucmVxdWlyZSA/IFtWYWxpZGF0b3JzLnJlcXVpcmVkXSA6IFtdKTtcbiAgICAgICAgaWYgKGl0ZW0uc2VsZWN0T3B0aW9uICYmIGl0ZW0uc2VsZWN0T3B0aW9uLmxhYmVsKSB7XG4gICAgICAgICAgZm9ybUdyb3VwT2JqW2l0ZW0uc2VsZWN0T3B0aW9uLmxhYmVsXSA9IHRoaXMuZmIuY29udHJvbChmb3JtTGluZXNEYXRhSXRlbVtpdGVtLnNlbGVjdE9wdGlvbi5sYWJlbF0gfHwgbnVsbCwgW10pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIGZvcm1Hcm91cE9iai5saW5lSW5kZXggPSB0aGlzLmZiLmNvbnRyb2woKHRtcFZhbGlkYXRlSGRGb3JtTGluZXMuZ2V0KCdsaW5lcycpIGFzIEZvcm1BcnJheSkuY29udHJvbHMubGVuZ3RoLCBbXSk7XG4gICAgICBsZXQgZm9ybUdyb3VwVG1wID0gdGhpcy5mYi5ncm91cChmb3JtR3JvdXBPYmopO1xuICAgICAgdGhpcy5mb3JtTGluZXMuZm9yRWFjaCgoaXRlbSkgPT4ge1xuICAgICAgICBpZiAoaXRlbS5vbkNoYW5nZUV2ZW50KSB7XG4gICAgICAgICAgaWYgKGl0ZW0ub25DaGFuZ2VFdmVudERlYm91bmNlVGltZSkge1xuICAgICAgICAgICAgZm9ybUdyb3VwVG1wLmdldChpdGVtLm5hbWUpLnZhbHVlQ2hhbmdlcy5waXBlKFxuICAgICAgICAgICAgICBkZWJvdW5jZVRpbWUoaXRlbS5vbkNoYW5nZUV2ZW50RGVib3VuY2VUaW1lKVxuICAgICAgICAgICAgKS5zdWJzY3JpYmUodmFsdWUgPT4ge1xuICAgICAgICAgICAgICB0aGlzLnRyaWdnZXJFdmVudChpdGVtLm9uQ2hhbmdlRXZlbnQsIHZhbHVlLCBmb3JtR3JvdXBUbXApO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGZvcm1Hcm91cFRtcC5nZXQoaXRlbS5uYW1lKS52YWx1ZUNoYW5nZXMuc3Vic2NyaWJlKHZhbHVlID0+IHtcbiAgICAgICAgICAgICAgdGhpcy50cmlnZ2VyRXZlbnQoaXRlbS5vbkNoYW5nZUV2ZW50LCB2YWx1ZSwgZm9ybUdyb3VwVG1wKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICAodG1wVmFsaWRhdGVIZEZvcm1MaW5lcy5nZXQoJ2xpbmVzJykgYXMgRm9ybUFycmF5KS5pbnNlcnQoKHRtcFZhbGlkYXRlSGRGb3JtTGluZXMuZ2V0KCdsaW5lcycpIGFzIEZvcm1BcnJheSkuY29udHJvbHMubGVuZ3RoLCBmb3JtR3JvdXBUbXApO1xuICAgIH0pO1xuICAgIHJldHVybiB0bXBWYWxpZGF0ZUhkRm9ybUxpbmVzLnZhbGlkO1xuICB9XG5cbiAgLy8g5pq06Zyy55qE5pa55rOV77yM55So5LqO6I635Y+W5omA5pyJ5pWw5o2uXG4gIHB1YmxpYyBnZXRMaW5lcygpIHtcbiAgICBsZXQgYWxsTGluZXMgPSBbXTtcbiAgICB0aGlzLnN0b3JlRm9ybUxpbmVzRGF0YS5mb3JFYWNoKChmb3JtTGluZXNEYXRhSXRlbSkgPT4ge1xuICAgICAgbGV0IGZvcm1Hcm91cE9iajogYW55ID0ge307XG4gICAgICB0aGlzLmZvcm1MaW5lcy5mb3JFYWNoKChpdGVtKSA9PiB7XG4gICAgICAgIC8vIOaWsOWinuihjCDliJ3lp4vmlbDmja7pg73kuLpudWxsXG4gICAgICAgIGZvcm1Hcm91cE9ialtpdGVtLm5hbWVdID0gZm9ybUxpbmVzRGF0YUl0ZW1baXRlbS5uYW1lXTtcbiAgICAgIH0pO1xuICAgICAgZm9ybUdyb3VwT2JqLmxpbmVJbmRleCA9IGZvcm1MaW5lc0RhdGFJdGVtLmxpbmVJbmRleDtcbiAgICAgIGFsbExpbmVzLnB1c2goZm9ybUdyb3VwT2JqKTtcbiAgICB9KTtcbiAgICByZXR1cm4gYWxsTGluZXM7XG4gIH1cblxuICAvLyDlhajlsYDmgKfnmoTmkJzntKLvvIjmtrXnm5bpobXpnaLkuIrmiYDmnInnmoTlj6/op4bmloflrZfvvIlcbiAgc2VhcmNoTGluZXMoKSB7XG4gICAgaWYgKHRoaXMuc3RvcmVGb3JtTGluZXNEYXRhLmxlbmd0aCA8IDEpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy50YWJsZUxvYWRpbmcgPSB0cnVlO1xuICAgIC8vIOWmguaenOayoeaciei+k+WFpeaQnOe0ouWtl+espuS4su+8jOWImeaYvuekuue8k+WtmOWGheeahOaJgOacieaVsOaNrlxuICAgIGlmICghdGhpcy5maWx0ZXJTdHIpIHtcbiAgICAgIHRoaXMuaXNGaWx0ZXJEYXRhID0gZmFsc2U7XG4gICAgICB0aGlzLnNldFN0b3JlRGF0YSgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBmaWx0ZXJWYWx1ZSA9IHRoaXMuZmlsdGVyU3RyLnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xuICAgIHRoaXMuaXNGaWx0ZXJEYXRhID0gdHJ1ZTtcbiAgICB0aGlzLmZpbHRlckluZGV4U3RvcmUgPSBbXTtcblxuICAgIC8vIOagueaNruaQnOe0ouWtl+espuS4sui/h+a7pOaVsOaNrlxuICAgIGNvbnN0IGZpbHRlcmVkRGF0YSA9IHRoaXMuc3RvcmVGb3JtTGluZXNEYXRhLmZpbHRlcigoZGF0YTogYW55LCBpbmRleDogbnVtYmVyKSA9PiB7XG4gICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgdGhpcy5mb3JtTGluZXMpIHtcbiAgICAgICAgaWYgKChpdGVtLmhpZGUgJiYgaXRlbS5jYW5TZWFyY2gpIHx8ICghaXRlbS5oaWRlICYmIGl0ZW0ubmFtZSAhPT0gJ3V1aWQnKSkge1xuICAgICAgICAgIGNvbnN0IHZhbHVlID0gZGF0YVtpdGVtLm5hbWVdID8gZGF0YVtpdGVtLm5hbWVdLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKSA6ICcnO1xuICAgICAgICAgIGlmICh2YWx1ZS5pbmNsdWRlcyhmaWx0ZXJWYWx1ZSkpIHtcbiAgICAgICAgICAgIHRoaXMuZmlsdGVySW5kZXhTdG9yZS5wdXNoKGluZGV4KTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0pO1xuICAgIC8vIOe8k+WtmOS4gOS4i+etm+mAieWQjueahOihqOWNleaVsOaNrlxuICAgIHRoaXMuZmlsdGVyU3RvcmVGb3JtTGluZXNEYXRhID0gZmlsdGVyZWREYXRhO1xuICAgIC8vIOWkhOeQhuetm+mAieWlveeahOaVsOaNriDnhLblkI7ph43mlrDmuLLmn5NcbiAgICB0aGlzLmZvcm1MaW5lc0RhdGEgPSBmaWx0ZXJlZERhdGE7XG4gICAgdGhpcy5pbml0KHRydWUpO1xuICB9XG5cbiAgc2V0U3RvcmVEYXRhKCkge1xuICAgIHRoaXMuZm9ybUxpbmVzRGF0YSA9IHRoaXMuc3RvcmVGb3JtTGluZXNEYXRhO1xuICAgIHRoaXMuaW5pdCh0cnVlKTtcbiAgfVxuXG4gIGdldFN0eWxlKGxpbmU6IEZvcm1Hcm91cCwgZm9ybUl0ZW06IGFueSwgd2lkdGg6IHN0cmluZykge1xuICAgIGxldCBzdHlsZU9iaiA9IHtcbiAgICAgICdtaW4td2lkdGgnOiB3aWR0aFxuICAgIH07XG4gICAgaWYgKGZvcm1JdGVtLnN0eWxlKSB7XG4gICAgICBzdHlsZU9iaiA9IHsgLi4uc3R5bGVPYmosIC4uLmZvcm1JdGVtLnN0eWxlIH07XG4gICAgfVxuICAgIGlmIChmb3JtSXRlbS5jb2xvck9wdGlvbiAmJiBmb3JtSXRlbS5jb2xvck9wdGlvbi5uYW1lICYmIGxpbmUuZ2V0KGZvcm1JdGVtLmNvbG9yT3B0aW9uLm5hbWUpLnZhbHVlKSB7XG4gICAgICBzdHlsZU9iaiA9IHsgLi4uc3R5bGVPYmosIC4uLnsgJ2NvbG9yJzogbGluZS5nZXQoZm9ybUl0ZW0uY29sb3JPcHRpb24ubmFtZSkudmFsdWUgfSB9O1xuICAgIH1cbiAgICByZXR1cm4gc3R5bGVPYmo7XG4gIH1cblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKSB7XG4gICAgaWYgKGNoYW5nZXNbJ2Zvcm1MaW5lc0RhdGEnXSAmJiBKU09OLnN0cmluZ2lmeShjaGFuZ2VzWydmb3JtTGluZXNEYXRhJ10uY3VycmVudFZhbHVlKSAhPT0gSlNPTi5zdHJpbmdpZnkoY2hhbmdlc1snZm9ybUxpbmVzRGF0YSddLnByZXZpb3VzVmFsdWUpKSB7XG4gICAgICBpZiAodGhpcy5zdG9yZUZvcm1MaW5lc0RhdGEgJiYgdGhpcy5zdG9yZUZvcm1MaW5lc0RhdGEubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHRoaXMuc3RvcmVGb3JtTGluZXNEYXRhID0gdGhpcy5mb3JtTGluZXNEYXRhO1xuICAgICAgfVxuICAgICAgdGhpcy5pbml0KCk7XG4gICAgfVxuICAgIGlmIChjaGFuZ2VzWyd0b3RhbE9wdGlvbiddICYmIEpTT04uc3RyaW5naWZ5KGNoYW5nZXNbJ3RvdGFsT3B0aW9uJ10uY3VycmVudFZhbHVlKSAhPT0gSlNPTi5zdHJpbmdpZnkoY2hhbmdlc1sndG90YWxPcHRpb24nXS5wcmV2aW91c1ZhbHVlKSkge1xuICAgICAgdGhpcy5jYWxjdWxhdGVUb3RhbCgpO1xuICAgIH1cbiAgfVxuXG4gIGNhbGN1bGF0ZVRvdGFsKCkge1xuICAgIC8vIOi/memHjOWkhOeQhuWQiOiuoeaVsOaNrlxuICAgIGlmICh0aGlzLnNob3dUb3RhbCkge1xuICAgICAgdGhpcy50b3RhbE9wdGlvbkxpc3QgPSBuZXcgQXJyYXkoTnVtYmVyKHRoaXMuY29sdW1uc051bWJlcikgLSAxKS5maWxsKCcnKTtcbiAgICAgIHRoaXMudG90YWxPcHRpb24uZm9yRWFjaChpdGVtID0+IHtcbiAgICAgICAgaWYgKGl0ZW0uaW5zZXJ0SW5kZXggJiYgKGl0ZW0uaW5zZXJ0VmFsdWUgfHwgaXRlbS5pbnNlcnRWYWx1ZSA9PT0gMCkpIHtcbiAgICAgICAgICB0aGlzLnRvdGFsT3B0aW9uTGlzdFtpdGVtLmluc2VydEluZGV4IC0gMV0gPSB7XG4gICAgICAgICAgICB2YWx1ZTogaXRlbS5pbnNlcnRWYWx1ZSxcbiAgICAgICAgICAgIGFsaWduOiBpdGVtLmFsaWduIHx8ICdsZWZ0JyxcbiAgICAgICAgICAgIHNob3dEZWNpbWFsOiBpdGVtLnNob3dEZWNpbWFsIHx8IGZhbHNlXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBpbml0KGlzRWRpdDogYm9vbGVhbiA9IGZhbHNlKTogdm9pZCB7XG4gICAgdGhpcy5wYWdpbmF0aW9uUGFnZUluZGV4ID0gMTtcbiAgICAvLyDlvILluLjmjZXojrdcbiAgICBpZiAoIXRoaXMuY2hlY2tMaXN0KHRoaXMuZm9ybUxpbmVzKSkge1xuICAgICAgdGhpcy50YWJsZUxvYWRpbmcgPSBmYWxzZTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5jcmVhdGVGb3JtKCk7XG4gICAgLy8g5aaC5p6c5rKh5pyJZm9ybUxpbmVzRGF0Ye+8jOWImeiupOS4uuaYr+aWsOWinlxuICAgIGlmICghaXNFZGl0ICYmICghdGhpcy5mb3JtTGluZXNEYXRhIHx8ICh0aGlzLmZvcm1MaW5lc0RhdGEgJiYgdGhpcy5mb3JtTGluZXNEYXRhLmxlbmd0aCA9PT0gMCkpKSB7XG4gICAgICB0aGlzLnRhYmxlTG9hZGluZyA9IGZhbHNlO1xuICAgICAgdGhpcy5hZGRGb3JtTGluZSgpO1xuICAgICAgdGhpcy5zaG93Rm9ybSA9IHRydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIOe8lui+kemAu+i+kVxuICAgICAgdGhpcy5hZGRGb3JtTGluZVdpdGhEYXRhKCk7XG4gICAgfVxuICAgIHRoaXMudmFsaWRhdGVIZEZvcm1MaW5lcy52YWx1ZUNoYW5nZXMuc3Vic2NyaWJlKGRhdGEgPT4gdGhpcy5vbkhkRm9ybVZhbHVlQ2hhbmdlZChkYXRhKSk7XG4gICAgdGhpcy5vbkhkRm9ybVZhbHVlQ2hhbmdlZCgpO1xuICB9XG5cblxuICAvKipcbiAgICog5Yib5bu66KGo5Y2VXG4gICAqL1xuICBwcml2YXRlIGNyZWF0ZUZvcm0oKSB7XG4gICAgdGhpcy52YWxpZGF0ZUhkRm9ybUxpbmVzID0gdGhpcy5mYi5ncm91cCh7XG4gICAgICAnbGluZXMnOiB0aGlzLmZiLmFycmF5KFtdKVxuICAgIH0pO1xuICAgIHRoaXMubmV3TGluZSA9IHRoaXMubmV3TGluZUl0ZW0oKTtcbiAgfVxuXG4gIC8qKlxuICAqIOWumuS5ieepuueahG5ld0xpbmVJdGVtIOe7k+aehFxuICAqL1xuICBwcml2YXRlIG5ld0xpbmVJdGVtKCk6IEZvcm1Hcm91cCB7XG4gICAgbGV0IGZvcm1Hcm91cE9iajogYW55ID0ge307XG4gICAgdGhpcy5mb3JtTGluZXMuZm9yRWFjaCgoaXRlbSkgPT4ge1xuICAgICAgLy8g5paw5aKe6KGMIOWIneWni+aVsOaNrumDveS4um51bGxcbiAgICAgIGZvcm1Hcm91cE9ialtpdGVtLm5hbWVdID0gdGhpcy5mYi5jb250cm9sKHsgdmFsdWU6IGl0ZW0udmFsdWUsIGRpc2FibGVkOiBpdGVtLmRpc2FibGVkIH0gfHwgbnVsbCwgaXRlbS5yZXF1aXJlICYmICFpdGVtLmhpZGUgPyBbVmFsaWRhdG9ycy5yZXF1aXJlZF0gOiBbXSk7XG4gICAgfSk7XG4gICAgZm9ybUdyb3VwT2JqLmxpbmVJbmRleCA9IHRoaXMuZmIuY29udHJvbCh0aGlzLmxpbmVzRm9ybUFycmF5LmNvbnRyb2xzLmxlbmd0aCwgW10pO1xuICAgIC8vIOeUqOadpeagh+ivhuaYr+WQpuaYr+aQnOe0oueKtuaAgeS4i+aWsOWinueahOihjFxuICAgIGZvcm1Hcm91cE9iai5pc0hkRm9ybUxpbmVTZWFyY2hBZGQgPSB0aGlzLmZiLmNvbnRyb2wodGhpcy5pc0ZpbHRlckRhdGEsIFtdKTtcbiAgICBsZXQgZm9ybUdyb3VwU3VibWl0ID0gdGhpcy5mYi5ncm91cChmb3JtR3JvdXBPYmopO1xuICAgIHRoaXMuZm9ybUxpbmVzLmZvckVhY2goKGl0ZW0sIGlubmVySW5kZXgpID0+IHtcbiAgICAgIGlmIChpdGVtLm9uQ2hhbmdlRXZlbnQpIHtcbiAgICAgICAgaWYgKGl0ZW0ub25DaGFuZ2VFdmVudCkge1xuICAgICAgICAgIGlmIChpdGVtLm9uQ2hhbmdlRXZlbnREZWJvdW5jZVRpbWUpIHtcbiAgICAgICAgICAgIGZvcm1Hcm91cFN1Ym1pdC5nZXQoaXRlbS5uYW1lKS52YWx1ZUNoYW5nZXMucGlwZShcbiAgICAgICAgICAgICAgZGVib3VuY2VUaW1lKGl0ZW0ub25DaGFuZ2VFdmVudERlYm91bmNlVGltZSlcbiAgICAgICAgICAgICkuc3Vic2NyaWJlKHZhbHVlID0+IHtcbiAgICAgICAgICAgICAgaWYgKGl0ZW0udHlwZSA9PT0gRm9ybUxpbmVUeXBlLlNlbGVjdCAmJiB2YWx1ZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHRoaXMuanVtcFRvTmV4dElucHV0KHRoaXMuYWN0aXZlRG9tWCwgdGhpcy5hY3RpdmVEb21ZKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB0aGlzLnRyaWdnZXJFdmVudChpdGVtLm9uQ2hhbmdlRXZlbnQsIHZhbHVlLCBmb3JtR3JvdXBTdWJtaXQpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGZvcm1Hcm91cFN1Ym1pdC5nZXQoaXRlbS5uYW1lKS52YWx1ZUNoYW5nZXMuc3Vic2NyaWJlKHZhbHVlID0+IHtcbiAgICAgICAgICAgICAgaWYgKGl0ZW0udHlwZSA9PT0gRm9ybUxpbmVUeXBlLlNlbGVjdCAmJiB2YWx1ZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHRoaXMuanVtcFRvTmV4dElucHV0KHRoaXMuYWN0aXZlRG9tWCwgdGhpcy5hY3RpdmVEb21ZKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB0aGlzLnRyaWdnZXJFdmVudChpdGVtLm9uQ2hhbmdlRXZlbnQsIHZhbHVlLCBmb3JtR3JvdXBTdWJtaXQpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIGZvcm1Hcm91cFN1Ym1pdDtcbiAgfVxuXG4gIHByaXZhdGUgY2FsY3VsYXRlTGluZU51bWJlcigpIHtcbiAgICB0aGlzLmxpbmVzRm9ybUFycmF5LmNvbnRyb2xzLmZvckVhY2goKGl0ZW0sIGluZGV4KSA9PiB7XG4gICAgICBpdGVtLmdldCgnbGluZUluZGV4Jykuc2V0VmFsdWUoaW5kZXggKyAxLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICog57yW6L6R55qE5pe25YCZ5pWw5o2u5aSE55CGXG4gICAqL1xuICBhZGRGb3JtTGluZVdpdGhEYXRhKCkge1xuICAgIHRoaXMuZm9ybUxpbmVzRGF0YS5mb3JFYWNoKChmb3JtTGluZXNEYXRhSXRlbSwgaW5kZXgpID0+IHtcbiAgICAgIGxldCBmb3JtR3JvdXBPYmo6IGFueSA9IHt9O1xuICAgICAgdGhpcy5mb3JtTGluZXMuZm9yRWFjaCgoaXRlbSkgPT4ge1xuICAgICAgICAvLyDmlrDlop7ooYwg5Yid5aeL5pWw5o2u6YO95Li6bnVsbFxuICAgICAgICBmb3JtR3JvdXBPYmpbaXRlbS5uYW1lXSA9IHRoaXMuZmIuY29udHJvbCh7IHZhbHVlOiBmb3JtTGluZXNEYXRhSXRlbVtpdGVtLm5hbWVdID09PSAwID8gMCA6IChmb3JtTGluZXNEYXRhSXRlbVtpdGVtLm5hbWVdIHx8IGl0ZW0udmFsdWUgfHwgbnVsbCksIGRpc2FibGVkOiBpdGVtLmRpc2FibGVkIH0sIGl0ZW0ucmVxdWlyZSA/IFtWYWxpZGF0b3JzLnJlcXVpcmVkXSA6IFtdKTtcbiAgICAgICAgaWYgKGl0ZW0uc2VsZWN0T3B0aW9uICYmIGl0ZW0uc2VsZWN0T3B0aW9uLmxhYmVsKSB7XG4gICAgICAgICAgZm9ybUdyb3VwT2JqW2l0ZW0uc2VsZWN0T3B0aW9uLmxhYmVsXSA9IHRoaXMuZmIuY29udHJvbChmb3JtTGluZXNEYXRhSXRlbVtpdGVtLnNlbGVjdE9wdGlvbi5sYWJlbF0gfHwgbnVsbCwgW10pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIGZvcm1Hcm91cE9iai5saW5lSW5kZXggPSB0aGlzLmZiLmNvbnRyb2wodGhpcy5saW5lc0Zvcm1BcnJheS5jb250cm9scy5sZW5ndGggKyAxLCBbXSk7XG4gICAgICBsZXQgZm9ybUdyb3VwVG1wID0gdGhpcy5mYi5ncm91cChmb3JtR3JvdXBPYmopO1xuICAgICAgdGhpcy5mb3JtTGluZXMuZm9yRWFjaCgoaXRlbSwgaW5uZXJJbmRleCkgPT4ge1xuICAgICAgICBpZiAoaXRlbS5vbkNoYW5nZUV2ZW50KSB7XG4gICAgICAgICAgaWYgKGl0ZW0ub25DaGFuZ2VFdmVudERlYm91bmNlVGltZSkge1xuICAgICAgICAgICAgZm9ybUdyb3VwVG1wLmdldChpdGVtLm5hbWUpLnZhbHVlQ2hhbmdlcy5waXBlKFxuICAgICAgICAgICAgICBkZWJvdW5jZVRpbWUoaXRlbS5vbkNoYW5nZUV2ZW50RGVib3VuY2VUaW1lKVxuICAgICAgICAgICAgKS5zdWJzY3JpYmUodmFsdWUgPT4ge1xuICAgICAgICAgICAgICBpZiAoaXRlbS50eXBlID09PSBGb3JtTGluZVR5cGUuU2VsZWN0ICYmIHZhbHVlICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5qdW1wVG9OZXh0SW5wdXQodGhpcy5hY3RpdmVEb21YLCB0aGlzLmFjdGl2ZURvbVkpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHRoaXMudHJpZ2dlckV2ZW50KGl0ZW0ub25DaGFuZ2VFdmVudCwgdmFsdWUsIGZvcm1Hcm91cFRtcCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZm9ybUdyb3VwVG1wLmdldChpdGVtLm5hbWUpLnZhbHVlQ2hhbmdlcy5zdWJzY3JpYmUodmFsdWUgPT4ge1xuICAgICAgICAgICAgICBpZiAoaXRlbS50eXBlID09PSBGb3JtTGluZVR5cGUuU2VsZWN0ICYmIHZhbHVlICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5qdW1wVG9OZXh0SW5wdXQodGhpcy5hY3RpdmVEb21YLCB0aGlzLmFjdGl2ZURvbVkpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHRoaXMudHJpZ2dlckV2ZW50KGl0ZW0ub25DaGFuZ2VFdmVudCwgdmFsdWUsIGZvcm1Hcm91cFRtcCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgdGhpcy5saW5lc0Zvcm1BcnJheS5pbnNlcnQodGhpcy5saW5lc0Zvcm1BcnJheS5jb250cm9scy5sZW5ndGgsIGZvcm1Hcm91cFRtcCk7XG4gICAgfSk7XG4gICAgdGhpcy50YWJsZUxvYWRpbmcgPSBmYWxzZTtcbiAgICB0aGlzLnNob3dGb3JtID0gdHJ1ZTtcbiAgfVxuXG4gIGFkZEZvcm1MaW5lKGluZGV4PzogYW55KSB7XG4gICAgdGhpcy5saW5lc0Zvcm1BcnJheS5pbnNlcnQoaW5kZXggfHwgdGhpcy5saW5lc0Zvcm1BcnJheS5jb250cm9scy5sZW5ndGgsIHRoaXMubmV3TGluZUl0ZW0oKSk7XG4gICAgdGhpcy5jYWxjdWxhdGVMaW5lTnVtYmVyKCk7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLmNvbGxlY3REb21EYXRhKCk7XG4gICAgICBpZiAoaW5kZXggIT09IG51bGwgJiYgaW5kZXggIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aGlzLmFjdGl2ZURvbVggPSBpbmRleDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuYWN0aXZlRG9tWCA9IHRoaXMuY29sbGVjdERvbUxpc3QubGVuZ3RoIC0gMTtcbiAgICAgIH1cbiAgICAgIHRoaXMuYWN0aXZlRG9tWSA9IDA7XG4gICAgICB0aGlzLmZvY3VzRG9tKHRoaXMuYWN0aXZlRG9tWCwgdGhpcy5hY3RpdmVEb21ZKTtcbiAgICB9LCAwKTtcbiAgfVxuXG4gIGRlbGV0ZUZvcm1MaW5lKGluZGV4OiBhbnkpIHtcbiAgICB0aGlzLmxpbmVzRm9ybUFycmF5LnJlbW92ZUF0KGluZGV4IC0gMSk7XG4gICAgaWYgKCF0aGlzLmlzRmlsdGVyRGF0YSAmJiB0aGlzLmxpbmVzRm9ybUFycmF5LmNvbnRyb2xzICYmIHRoaXMubGluZXNGb3JtQXJyYXkuY29udHJvbHMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aGlzLmFkZEZvcm1MaW5lKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIOWIoOmZpOWwvumhteeahOacgOWQjuS4gOS4quWFg+e0oOWKqOS9nFxuICAgICAgaWYgKHRoaXMucGFnaW5hdGlvblBhZ2VJbmRleCAqIHRoaXMucGFnaW5hdGlvblBhZ2VTaXplID09PSAodGhpcy5saW5lc0Zvcm1BcnJheS5jb250cm9scy5sZW5ndGggKyB0aGlzLnBhZ2luYXRpb25QYWdlU2l6ZSkpIHtcbiAgICAgICAgdGhpcy5wYWdpbmF0aW9uUGFnZUluZGV4LS07XG4gICAgICB9XG4gICAgICB0aGlzLmNhbGN1bGF0ZUxpbmVOdW1iZXIoKTtcbiAgICB9XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLmNvbGxlY3REb21EYXRhKCk7XG4gICAgfSwgMCk7XG4gIH1cblxuICBwdWJsaWMgcGFnZUluZGV4Q2hhbmdlKGV2ZW50OiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLnBhZ2luYXRpb25QYWdlSW5kZXggPSBldmVudDtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMuY29sbGVjdERvbURhdGEoKTtcbiAgICB9LCAwKTtcbiAgfVxuXG4gIHB1YmxpYyBwYWdlU2l6ZUNoYW5nZShldmVudDogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5wYWdpbmF0aW9uUGFnZVNpemUgPSBldmVudDtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMuY29sbGVjdERvbURhdGEoKTtcbiAgICB9LCAwKTtcbiAgfVxuXG4gIHByaXZhdGUgb25IZEZvcm1WYWx1ZUNoYW5nZWQoZGF0YT86IGFueSkge1xuICAgIGlmICh0aGlzLmlzRmlsdGVyRGF0YSkge1xuICAgICAgaWYgKGRhdGEgJiYgZGF0YS5saW5lcyAmJiB0aGlzLmZpbHRlckluZGV4U3RvcmUubGVuZ3RoICE9PSAwKSB7XG4gICAgICAgIGNvbnN0IGxpbmVzID0gZGF0YS5saW5lcztcbiAgICAgICAgaWYgKGxpbmVzLmxlbmd0aCA9PT0gdGhpcy5maWx0ZXJJbmRleFN0b3JlLmxlbmd0aCkge1xuICAgICAgICAgIHRoaXMuZmlsdGVySW5kZXhTdG9yZS5mb3JFYWNoKChpdGVtLCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5zdG9yZUZvcm1MaW5lc0RhdGFbaXRlbV0gPSB7IC4uLnRoaXMuZmlsdGVyU3RvcmVGb3JtTGluZXNEYXRhW2luZGV4XSwgLi4ubGluZXNbaW5kZXhdIH07XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSBpZiAobGluZXMubGVuZ3RoID4gdGhpcy5maWx0ZXJJbmRleFN0b3JlLmxlbmd0aCkge1xuICAgICAgICAgIC8vIOacieaWsOWinuaVsOaNrueahOaDheWGtVxuICAgICAgICAgIC8vIHN0ZXAgMTog5YWI5om+5paw5aKe55qEaW5kZXjkuIvmoIdcbiAgICAgICAgICBjb25zdCBnZXROb3dMaW5lcyA9IHRoaXMudmFsaWRhdGVIZEZvcm1MaW5lcy5nZXRSYXdWYWx1ZSgpLmxpbmVzO1xuICAgICAgICAgIGxldCBhZGRJbmRleCA9IC0xO1xuICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZ2V0Tm93TGluZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmIChnZXROb3dMaW5lc1tpXS5pc0hkRm9ybUxpbmVTZWFyY2hBZGQpIHtcbiAgICAgICAgICAgICAgYWRkSW5kZXggPSBpO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGFkZEluZGV4ICE9PSAtMSkge1xuICAgICAgICAgICAgdGhpcy5zdG9yZUZvcm1MaW5lc0RhdGEuc3BsaWNlKHRoaXMuZmlsdGVySW5kZXhTdG9yZVthZGRJbmRleCAtIDFdICsgMSwgMCwgZ2V0Tm93TGluZXNbYWRkSW5kZXhdKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5maWx0ZXJJbmRleFN0b3JlLnB1c2godGhpcy5maWx0ZXJJbmRleFN0b3JlW2FkZEluZGV4IC0gMV0gKyAxKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyDmnInliKDpmaTmlbDmja7nmoTmg4XlhrVcbiAgICAgICAgICAvLyBzdGVwIDE65YWI5om+5Yiw5Yig6Zmk55qEaW5kZXjkuIvmoIdcbiAgICAgICAgICBsZXQgZGVsZXRlZEluZGV4ID0gLTE7XG4gICAgICAgICAgbGV0IGNvdW50ID0gMDtcbiAgICAgICAgICBpZiAobGluZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICBkZWxldGVkSW5kZXggPSAwO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxpbmVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgIGlmIChsaW5lc1tpXS5saW5lSW5kZXggLSBjb3VudCA+IDEpIHtcbiAgICAgICAgICAgICAgICBkZWxldGVkSW5kZXggPSBpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGNvdW50Kys7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChkZWxldGVkSW5kZXggIT09IC0xKSB7XG4gICAgICAgICAgICAvLyBzdGVwIDI6IOWIoOmZpOaAu+aVsOaNruS4reeahOWvueW6lOaVsOaNriwg5oqK5LiL5qCH5pWw57uE5ZKMbGluZXPplb/luqblr7npvZDvvIzlkIzml7bmiorkuIvmoIfmlbDnu4TlnKhkZWxldGVkSW5kZXjlkI7pnaLnmoTlgLzlhajpg70tMVxuICAgICAgICAgICAgdGhpcy5zdG9yZUZvcm1MaW5lc0RhdGEgPSB0aGlzLnN0b3JlRm9ybUxpbmVzRGF0YS5maWx0ZXIoKGl0ZW0sIGluZGV4KSA9PiB7XG4gICAgICAgICAgICAgIHJldHVybiBpbmRleCAhPT0gdGhpcy5maWx0ZXJJbmRleFN0b3JlW2RlbGV0ZWRJbmRleF07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRoaXMuZmlsdGVySW5kZXhTdG9yZS5zcGxpY2UoZGVsZXRlZEluZGV4LCAxKTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5maWx0ZXJJbmRleFN0b3JlLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgIGlmIChpID49IGRlbGV0ZWRJbmRleCkge1xuICAgICAgICAgICAgICAgIHRoaXMuZmlsdGVySW5kZXhTdG9yZVtpXS0tO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIHN0ZXAgMjog5rKh5pyJ5om+5YiwZGVsZXRlZEluZGV46K+05piO5Yig6Zmk5pON5L2c5Zyo5pyA5ZCO5LiA6KGMXG4gICAgICAgICAgICBjb25zdCBmaWx0ZXJJbmRleCA9IHRoaXMuZmlsdGVySW5kZXhTdG9yZVt0aGlzLmZpbHRlckluZGV4U3RvcmUubGVuZ3RoIC0gMV07XG4gICAgICAgICAgICB0aGlzLnN0b3JlRm9ybUxpbmVzRGF0YSA9IHRoaXMuc3RvcmVGb3JtTGluZXNEYXRhLmZpbHRlcigoaXRlbSwgaW5kZXgpID0+IHtcbiAgICAgICAgICAgICAgcmV0dXJuIGluZGV4ICE9PSBmaWx0ZXJJbmRleDtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhpcy5maWx0ZXJJbmRleFN0b3JlLnBvcCgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKGRhdGEgJiYgZGF0YS5saW5lcykge1xuICAgICAgICAgIHRoaXMuc3RvcmVGb3JtTGluZXNEYXRhID0gZGF0YS5saW5lcztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoZGF0YSAmJiBkYXRhLmxpbmVzKSB7XG4gICAgICAgIHRoaXMuc3RvcmVGb3JtTGluZXNEYXRhID0gZGF0YS5saW5lcztcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyDmgLvooajljZVcbiAgICBpZiAoIXRoaXMuaXNGaWx0ZXJEYXRhKSB7XG4gICAgICB0aGlzLmZvcm1WYWxpZCA9IHRoaXMudmFsaWRhdGVIZEZvcm1MaW5lcy52YWxpZDtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHRoaXMuZm9ybVZhbGlkKSB7XG4gICAgICAgIC8vIOWmguaenOaVtOS9k+ihqOWNleaYr3RydWXvvIzkuI3nrqHlrZDooajljZXmmK/ku4DkuYjvvIzpg73lj5jmiJDlrZDooajljZXnmoTnirbmgIFcbiAgICAgICAgdGhpcy5mb3JtVmFsaWQgPSB0aGlzLnZhbGlkYXRlSGRGb3JtTGluZXMudmFsaWQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyDlpoLmnpzmlbTkvZPooajljZXmmK9mYWxzZe+8mjHjgIHlrZDooajljZXkuLp0cnVl77yM6ZyA6KaB6YeN566X77ybMuOAgeWtkOihqOWNleS4umZhbHNl77yM55So5a2Q6KGo5Y2V54q25oCBXG4gICAgICAgIGlmICh0aGlzLnZhbGlkYXRlSGRGb3JtTGluZXMudmFsaWQpIHtcbiAgICAgICAgICB0aGlzLmZvcm1WYWxpZCA9IHRoaXMuaW5uZXJHZXRWYWxpZCgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuZm9ybVZhbGlkID0gdGhpcy52YWxpZGF0ZUhkRm9ybUxpbmVzLnZhbGlkO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIC8vIHRoaXMuY2FsY3VsYXRlTGluZU51bWJlcigpO1xuICAgIHRoaXMuY2hhbmdlRXZlbnQuZW1pdCh0aGlzLnZhbGlkYXRlSGRGb3JtTGluZXMpO1xuICB9XG5cbiAgcHJpdmF0ZSBjaGVja0xpc3QobGlzdDogQXJyYXk8Rm9ybUxpbmU+KTogYm9vbGVhbiB7XG4gICAgaWYgKCFsaXN0IHx8IChsaXN0ICYmIGxpc3QubGVuZ3RoID09PSAwKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBsZXQgbmFtZUxpc3QgPSBbXTtcbiAgICBsZXQgc2VsZWN0T3B0aW9uQ2hlY2tMaXN0ID0gW107XG4gICAgbGlzdC5mb3JFYWNoKChpdGVtKSA9PiB7XG4gICAgICAvLyDmoKHpqozljZXpobnpgInmi6nlmahcbiAgICAgIC8vIGlmIChpdGVtLnR5cGUgPT09IEZvcm1MaW5lVHlwZS5TZWxlY3QgJiYgKCFpdGVtLnNlbGVjdExpc3QgfHwgKGl0ZW0uc2VsZWN0TGlzdCAmJiBpdGVtLnNlbGVjdExpc3QubGVuZ3RoID09PSAwKSkpIHtcbiAgICAgIC8vICAgdGhyb3cgJ2Zvcm1MaW5lc+e7hOS7tuaVsOaNruagvOW8j+S4jeinhOiMg++8jOWtmOWcqOWNlemhuemAieaLqeWZqOayoeacieS8oOWFpemAiemhuSEnXG4gICAgICAvLyB9XG4gICAgICBuYW1lTGlzdC5wdXNoKGl0ZW0ubmFtZSk7XG5cbiAgICAgIC8vIOagoemqjOaciW9uU2VhcmNo55qE5a2X5q6155qEc2VsZWN0T3B0aW9u55qEdmFsdWXjgIFsYWJlbOaYr+WQpuWcqGZvcm1MaW5l6YeM6Z2i6YO95a6a5LmJ5LqGXG4gICAgICBpZiAoaXRlbS5vblNlYXJjaEV2ZW50ICYmIGl0ZW0uc2VsZWN0T3B0aW9uKSB7XG4gICAgICAgIHNlbGVjdE9wdGlvbkNoZWNrTGlzdCA9IFtdO1xuICAgICAgICBsaXN0LmZvckVhY2goaW5uZXJJdGVtID0+IHtcbiAgICAgICAgICBpZiAoaW5uZXJJdGVtLm5hbWUgPT09IGl0ZW0uc2VsZWN0T3B0aW9uLnZhbHVlIHx8IGlubmVySXRlbS5uYW1lID09PSBpdGVtLnNlbGVjdE9wdGlvbi5sYWJlbCkge1xuICAgICAgICAgICAgc2VsZWN0T3B0aW9uQ2hlY2tMaXN0LnB1c2goaW5uZXJJdGVtLm5hbWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChzZWxlY3RPcHRpb25DaGVja0xpc3QubGVuZ3RoIDwgMikge1xuICAgICAgICAgIHRocm93IGBmb3JtTGluZXPnu4Tku7bmlbDmja7moLzlvI/kuI3op4TojIPvvIzlrZfmrrUke2l0ZW0ubmFtZX3nmoRzZWxlY3RPcHRpb27nmoR2YWx1ZeOAgWxhYmVs5a2X5q615pyq6IO95ZyoZm9ybUxpbmVz5Lit5om+5Yiw5a+55bqU5a2X5q6177yBYDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICAgIC8vIOagoemqjG5hbWXmmK/lkKbph43lpI1cbiAgICBpZiAoWy4uLm5ldyBTZXQobmFtZUxpc3QpXS5sZW5ndGggIT09IGxpc3QubGVuZ3RoKSB7XG4gICAgICB0aHJvdyAnZm9ybUxpbmVz57uE5Lu25pWw5o2u5qC85byP5LiN6KeE6IyD77yM5a2Y5Zyo6YeN5aSNbmFtZeWAvCEnO1xuICAgIH1cbiAgICAvLyAuLi5tb3JlIGNoZWNrXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBwdWJsaWMgc3VibWl0Rm9ybSgpOiB2b2lkIHtcbiAgICB0aGlzLmNoYW5nZUV2ZW50LmVtaXQodGhpcy52YWxpZGF0ZUhkRm9ybUxpbmVzLmdldFJhd1ZhbHVlKCkpO1xuICB9XG5cbiAgcHVibGljIHJlc2V0Rm9ybSgpOiB2b2lkIHtcbiAgICAvLyDliKDpmaRcbiAgICBmb3IgKGxldCBpID0gdGhpcy5saW5lc0Zvcm1BcnJheS5jb250cm9scy5sZW5ndGg7IGkgPj0gMDsgaS0tKSB7XG4gICAgICB0aGlzLmRlbGV0ZUZvcm1MaW5lKGkpO1xuICAgIH1cbiAgICB0aGlzLnBhZ2luYXRpb25QYWdlSW5kZXggPSAxO1xuICB9XG5cbiAgcHVibGljIGlucHV0Q2xlYW4oZm9ybUl0ZW06IGFueSwgbGluZTogYW55KTogdm9pZCB7XG4gICAgbGluZS5nZXQoZm9ybUl0ZW0ubmFtZSkuc2V0VmFsdWUobnVsbCk7XG4gIH1cblxuICBwdWJsaWMgc2VsZWN0VmFsdWUoaWQ6IHN0cmluZywgcm93TnVtYmVyOiBudW1iZXIsIGNvbE51bWJlcjogbnVtYmVyKTogdm9pZCB7XG4gICAgY29uc3QgaW5wdXREb206IGFueSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoaWQpO1xuICAgIGlucHV0RG9tLnNlbGVjdCgpO1xuICAgIHRoaXMuc2V0QWN0aXZlRG9tSW5Gb3JtTGluZXMocm93TnVtYmVyLCBjb2xOdW1iZXIpO1xuICB9XG5cbiAgcHJpdmF0ZSB0ZXh0V2lkdGhDYWNoZTogeyBba2V5OiBzdHJpbmddOiBudW1iZXI7IH0gPSB7fTtcbiAgaXNUZXh0T3ZlcmZsb3codGV4dDogc3RyaW5nLCBtYXhXaWR0aDogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgY29uc3QgY2FjaGVkV2lkdGggPSB0aGlzLnRleHRXaWR0aENhY2hlW3RleHRdO1xuICAgIGlmIChjYWNoZWRXaWR0aCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gY2FjaGVkV2lkdGggKyAxNSA+PSBtYXhXaWR0aDtcbiAgICB9XG5cbiAgICBjb25zdCBzcGFuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpO1xuICAgIHNwYW4uc3R5bGUudmlzaWJpbGl0eSA9ICdoaWRkZW4nO1xuICAgIHNwYW4uc3R5bGUucG9zaXRpb24gPSAnYWJzb2x1dGUnO1xuICAgIHNwYW4uc3R5bGUud2hpdGVTcGFjZSA9ICdub3dyYXAnO1xuICAgIHNwYW4uc3R5bGUuZm9udFNpemUgPSAnMTJweCc7XG4gICAgc3Bhbi5zdHlsZS5kaXNwbGF5ID0gJ2lubGluZS1ibG9jayc7IC8vIOWwhuagt+W8j+S/ruaUueS4uiBpbmxpbmUtYmxvY2tcbiAgICBzcGFuLmlubmVyVGV4dCA9IHRleHQ7XG4gICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChzcGFuKTtcbiAgICBjb25zdCBpc092ZXJmbG93ID0gc3Bhbi5vZmZzZXRXaWR0aCArIDE1ID49IG1heFdpZHRoO1xuICAgIHRoaXMudGV4dFdpZHRoQ2FjaGVbdGV4dF0gPSBzcGFuLm9mZnNldFdpZHRoO1xuICAgIHNwYW4uc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICBkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKHNwYW4pO1xuICAgIHJldHVybiBpc092ZXJmbG93O1xuICB9XG5cbiAganVkZ2VDb2xFbXB0eShzdHI6IGFueSkge1xuICAgIGlmIChzdHIgfHwgc3RyID09PSAwKSB7XG4gICAgICByZXR1cm4gc3RyO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gJzznqbo+JztcbiAgICB9XG4gIH1cbn1cbiJdfQ==