fantasy-ngzorro 2.2.3 → 2.2.4

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,22 +3,45 @@
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 { Component, EventEmitter, Inject, Input, Optional, Output } from '@angular/core';
7
7
  import { FormBuilder } from '@angular/forms';
8
+ import { FilterListType } from './hd-filter.service';
8
9
  import { getCascaderMenuClassName, getCascaderMenuStyle, getCascaderShowSearch, } from '../utils/cascader.util';
9
10
  import { Subject } from 'rxjs';
10
11
  import { debounceTime } from 'rxjs/operators';
12
+ import { InputBoolean } from 'ng-zorro-antd';
13
+ import { HD_FILTER_DEFAULT_SCHEME_NAME, HD_FILTER_SCHEME_STORE, HdFilterSchemeStore } from './hd-filter-scheme';
11
14
  var HdFilterComponent = /** @class */ (function () {
12
- function HdFilterComponent(fb) {
15
+ function HdFilterComponent(fb, schemeStore) {
13
16
  var _this = this;
14
17
  this.fb = fb;
18
+ this.schemeStore = schemeStore;
19
+ /**
20
+ * 是否启用筛选组(默认关闭)
21
+ */
22
+ this.enableFilterScheme = false;
15
23
  this.searchEvent = new EventEmitter();
16
24
  this.resetEvent = new EventEmitter();
17
25
  this.isShowMore = true;
18
- // 对filterList取模运算
19
26
  this.filterListModular = 0;
20
27
  this.searchSubject = new Subject();
21
- this.debounceTimeout = 0; // 默认防抖时间
28
+ this.debounceTimeout = 0;
29
+ /**
30
+ * 页面配置的初始值(虚拟「默认条件」)
31
+ */
32
+ this.defaultFilterValues = {};
33
+ this.defaultValuesCaptured = false;
34
+ this.schemeList = [];
35
+ this.currentScheme = null;
36
+ this.currentSchemeName = HD_FILTER_DEFAULT_SCHEME_NAME;
37
+ this.schemeLoading = false;
38
+ this.schemeSaving = false;
39
+ this.switchModalVisible = false;
40
+ this.switchKeyword = '';
41
+ this.switchSelectedUuid = null;
42
+ this.saveAsModalVisible = false;
43
+ this.saveAsName = '';
44
+ this.defaultSchemeName = HD_FILTER_DEFAULT_SCHEME_NAME;
22
45
  this.getCascaderShowSearch = getCascaderShowSearch;
23
46
  this.getCascaderMenuClassName = getCascaderMenuClassName;
24
47
  this.getCascaderMenuStyle = getCascaderMenuStyle;
@@ -39,16 +62,72 @@ var HdFilterComponent = /** @class */ (function () {
39
62
  */
40
63
  function () {
41
64
  this.init();
65
+ this.tryLoadSchemes(true);
42
66
  };
43
67
  /**
68
+ * @param {?} changes
44
69
  * @return {?}
45
70
  */
46
71
  HdFilterComponent.prototype.ngOnChanges = /**
72
+ * @param {?} changes
73
+ * @return {?}
74
+ */
75
+ function (changes) {
76
+ if (changes['filterList']) {
77
+ this.init();
78
+ }
79
+ if (changes['enableFilterScheme'] || changes['filterSchemeKey']) {
80
+ this.tryLoadSchemes(true);
81
+ }
82
+ };
83
+ /**
84
+ * @return {?}
85
+ */
86
+ HdFilterComponent.prototype.ngOnDestroy = /**
47
87
  * @return {?}
48
88
  */
49
89
  function () {
50
- this.init();
90
+ if (this.searchSubscription) {
91
+ this.searchSubscription.unsubscribe();
92
+ }
93
+ if (this.schemeLoadSub) {
94
+ this.schemeLoadSub.unsubscribe();
95
+ }
96
+ if (this.schemeActionSub) {
97
+ this.schemeActionSub.unsubscribe();
98
+ }
51
99
  };
100
+ Object.defineProperty(HdFilterComponent.prototype, "canUseScheme", {
101
+ get: /**
102
+ * @return {?}
103
+ */
104
+ function () {
105
+ return !!(this.enableFilterScheme && this.filterSchemeKey && this.schemeStore);
106
+ },
107
+ enumerable: true,
108
+ configurable: true
109
+ });
110
+ Object.defineProperty(HdFilterComponent.prototype, "filteredSwitchList", {
111
+ get: /**
112
+ * @return {?}
113
+ */
114
+ function () {
115
+ /** @type {?} */
116
+ var list = this.getDisplaySchemeList();
117
+ /** @type {?} */
118
+ var kw = (this.switchKeyword || '').trim();
119
+ if (!kw) {
120
+ return list;
121
+ }
122
+ return list.filter((/**
123
+ * @param {?} item
124
+ * @return {?}
125
+ */
126
+ function (item) { return (item.templateName || '').indexOf(kw) >= 0; }));
127
+ },
128
+ enumerable: true,
129
+ configurable: true
130
+ });
52
131
  /**
53
132
  * @private
54
133
  * @return {?}
@@ -60,12 +139,13 @@ var HdFilterComponent = /** @class */ (function () {
60
139
  function () {
61
140
  var _this = this;
62
141
  this.isShowMore = true;
63
- // 异常捕获
64
142
  if (!this.checkList(this.filterList)) {
65
143
  throw 'filter组件数据格式不规范';
66
144
  }
145
+ if (!this.filterList) {
146
+ this.filterList = [];
147
+ }
67
148
  this.filterListModular = this.filterList.length % 4;
68
- // 首先根据定义的组件数组 去初始化表单
69
149
  /** @type {?} */
70
150
  var formGroupList = {};
71
151
  this.filterList.forEach((/**
@@ -75,10 +155,13 @@ var HdFilterComponent = /** @class */ (function () {
75
155
  */
76
156
  function (item, index) {
77
157
  formGroupList[item.name] = _this.fb.control(item.value, []);
78
- // 初始化控件显影
79
158
  item.show = index < 7;
80
159
  }));
81
160
  this.validateFilterForm = this.fb.group(formGroupList);
161
+ if (!this.defaultValuesCaptured) {
162
+ this.defaultFilterValues = this.clonePlain(this.getFilterData());
163
+ this.defaultValuesCaptured = true;
164
+ }
82
165
  this.filterList.forEach((/**
83
166
  * @param {?} item
84
167
  * @return {?}
@@ -121,13 +204,10 @@ var HdFilterComponent = /** @class */ (function () {
121
204
  function (fn, event, onSearchEventDebounceTime, selectOption) {
122
205
  var _this = this;
123
206
  if (onSearchEventDebounceTime) {
124
- // 更新防抖时间
125
207
  this.debounceTimeout = onSearchEventDebounceTime;
126
- // 取消之前的订阅
127
208
  if (this.searchSubscription) {
128
209
  this.searchSubscription.unsubscribe();
129
210
  }
130
- // 创建新的订阅
131
211
  this.searchSubscription = this.searchSubject.pipe(debounceTime(this.debounceTimeout)).subscribe((/**
132
212
  * @param {?} __0
133
213
  * @return {?}
@@ -136,7 +216,6 @@ var HdFilterComponent = /** @class */ (function () {
136
216
  var fn = _a.fn, event = _a.event, selectOption = _a.selectOption;
137
217
  return _this.triggerEvent(fn, event, selectOption);
138
218
  }));
139
- // 发送事件
140
219
  this.searchSubject.next({ fn: fn, event: event, selectOption: selectOption });
141
220
  }
142
221
  else {
@@ -173,7 +252,6 @@ var HdFilterComponent = /** @class */ (function () {
173
252
  * @return {?}
174
253
  */
175
254
  function () {
176
- // 特殊处理下等于4个选项的情况
177
255
  if (this.filterList.length === 4) {
178
256
  return 18;
179
257
  }
@@ -200,17 +278,11 @@ var HdFilterComponent = /** @class */ (function () {
200
278
  * @return {?}
201
279
  */
202
280
  function (item) {
203
- // 校验单项选择器
204
- // if (item.type === FilterListType.Select && (!item.selectOption.selectList || (item.selectOption.selectList && item.selectOption.selectList.length === 0))) {
205
- // throw 'filter组件数据格式不规范,存在单项选择器没有传入选项!'
206
- // }
207
281
  nameList.push(item.name);
208
282
  }));
209
- // 校验name是否重复
210
283
  if (tslib_1.__spread(new Set(nameList)).length !== list.length) {
211
284
  throw 'filter组件数据格式不规范,存在重复name值!';
212
285
  }
213
- // ...more check
214
286
  return true;
215
287
  };
216
288
  /**
@@ -230,25 +302,17 @@ var HdFilterComponent = /** @class */ (function () {
230
302
  */
231
303
  function () {
232
304
  this.resetFilterFormWithValue();
233
- // this.validateFilterForm.reset();
234
305
  if (this.resetEvent.observers.length > 0) {
235
- // 如果有父组件绑定了 resetEvent 的处理器
236
306
  this.resetEvent.emit(this.validateFilterForm.getRawValue());
237
307
  }
238
308
  else {
239
- // 如果没有绑定处理器,则触发 searchEvent
240
309
  this.searchEvent.emit(this.validateFilterForm.getRawValue());
241
310
  }
242
311
  };
243
312
  /**
244
- * 带初始值重置表单
245
- */
246
- /**
247
- * 带初始值重置表单
248
313
  * @return {?}
249
314
  */
250
315
  HdFilterComponent.prototype.resetFilterFormWithValue = /**
251
- * 带初始值重置表单
252
316
  * @return {?}
253
317
  */
254
318
  function () {
@@ -261,7 +325,6 @@ var HdFilterComponent = /** @class */ (function () {
261
325
  function (item) {
262
326
  resetValue[item.name] = item.value;
263
327
  }));
264
- // 重置表单值(会触发valueChanges事件)
265
328
  this.validateFilterForm.patchValue(resetValue);
266
329
  };
267
330
  /**
@@ -306,15 +369,10 @@ var HdFilterComponent = /** @class */ (function () {
306
369
  this.validateFilterForm.patchValue(patchObject);
307
370
  };
308
371
  /**
309
- * 是否允许清空:优先 Filter.hdAllowClear,其次 selectOption.hdAllowClear,默认 true
310
- */
311
- /**
312
- * 是否允许清空:优先 Filter.hdAllowClear,其次 selectOption.hdAllowClear,默认 true
313
372
  * @param {?} item
314
373
  * @return {?}
315
374
  */
316
375
  HdFilterComponent.prototype.isAllowClear = /**
317
- * 是否允许清空:优先 Filter.hdAllowClear,其次 selectOption.hdAllowClear,默认 true
318
376
  * @param {?} item
319
377
  * @return {?}
320
378
  */
@@ -330,28 +388,652 @@ var HdFilterComponent = /** @class */ (function () {
330
388
  }
331
389
  return true;
332
390
  };
391
+ // ---------- 筛选组 ----------
392
+ // ---------- 筛选组 ----------
393
+ /**
394
+ * @private
395
+ * @param {?} applyDefault
396
+ * @return {?}
397
+ */
398
+ HdFilterComponent.prototype.tryLoadSchemes =
399
+ // ---------- 筛选组 ----------
400
+ /**
401
+ * @private
402
+ * @param {?} applyDefault
403
+ * @return {?}
404
+ */
405
+ function (applyDefault) {
406
+ var _this = this;
407
+ if (!this.canUseScheme) {
408
+ this.schemeList = [];
409
+ this.currentScheme = null;
410
+ this.currentSchemeName = HD_FILTER_DEFAULT_SCHEME_NAME;
411
+ return;
412
+ }
413
+ this.schemeLoading = true;
414
+ if (this.schemeLoadSub) {
415
+ this.schemeLoadSub.unsubscribe();
416
+ }
417
+ this.schemeLoadSub = this.schemeStore.queryByFilterKey(this.filterSchemeKey).subscribe((/**
418
+ * @param {?} list
419
+ * @return {?}
420
+ */
421
+ function (list) {
422
+ _this.schemeLoading = false;
423
+ _this.schemeList = list || [];
424
+ if (applyDefault) {
425
+ _this.applySchemeByName(HD_FILTER_DEFAULT_SCHEME_NAME, true);
426
+ }
427
+ else if (_this.currentScheme && _this.currentScheme.uuid) {
428
+ /** @type {?} */
429
+ var found = _this.schemeList.find((/**
430
+ * @param {?} s
431
+ * @return {?}
432
+ */
433
+ function (s) { return s.uuid === _this.currentScheme.uuid; }));
434
+ _this.currentScheme = found || null;
435
+ _this.currentSchemeName = found ? found.templateName : HD_FILTER_DEFAULT_SCHEME_NAME;
436
+ }
437
+ }), (/**
438
+ * @param {?} err
439
+ * @return {?}
440
+ */
441
+ function (err) {
442
+ _this.schemeLoading = false;
443
+ _this.showError('加载筛选模版失败:' + (err || ''));
444
+ if (applyDefault) {
445
+ _this.applySchemeByName(HD_FILTER_DEFAULT_SCHEME_NAME, true);
446
+ }
447
+ }));
448
+ };
449
+ /** 展示用列表:保证有「默认条件」 */
450
+ /**
451
+ * 展示用列表:保证有「默认条件」
452
+ * @return {?}
453
+ */
454
+ HdFilterComponent.prototype.getDisplaySchemeList = /**
455
+ * 展示用列表:保证有「默认条件」
456
+ * @return {?}
457
+ */
458
+ function () {
459
+ /** @type {?} */
460
+ var result = [];
461
+ /** @type {?} */
462
+ var fromDb = this.schemeList.find((/**
463
+ * @param {?} s
464
+ * @return {?}
465
+ */
466
+ function (s) { return s.templateName === HD_FILTER_DEFAULT_SCHEME_NAME; }));
467
+ if (fromDb) {
468
+ result.push(fromDb);
469
+ }
470
+ else {
471
+ result.push({
472
+ filterKey: this.filterSchemeKey,
473
+ templateName: HD_FILTER_DEFAULT_SCHEME_NAME,
474
+ filterValue: JSON.stringify(this.defaultFilterValues || {})
475
+ });
476
+ }
477
+ (this.schemeList || []).forEach((/**
478
+ * @param {?} s
479
+ * @return {?}
480
+ */
481
+ function (s) {
482
+ if (s.templateName !== HD_FILTER_DEFAULT_SCHEME_NAME) {
483
+ result.push(s);
484
+ }
485
+ }));
486
+ return result;
487
+ };
488
+ /**
489
+ * @return {?}
490
+ */
491
+ HdFilterComponent.prototype.openSwitchModal = /**
492
+ * @return {?}
493
+ */
494
+ function () {
495
+ if (!this.canUseScheme) {
496
+ return;
497
+ }
498
+ this.switchKeyword = '';
499
+ this.switchSelectedUuid = this.currentScheme && this.currentScheme.uuid
500
+ ? this.currentScheme.uuid
501
+ : null;
502
+ // 虚拟默认条件:uuid 为空时用空串标记
503
+ if (!this.currentScheme || !this.currentScheme.uuid) {
504
+ if (this.currentSchemeName === HD_FILTER_DEFAULT_SCHEME_NAME) {
505
+ this.switchSelectedUuid = '';
506
+ }
507
+ }
508
+ this.switchModalVisible = true;
509
+ };
510
+ /**
511
+ * @return {?}
512
+ */
513
+ HdFilterComponent.prototype.closeSwitchModal = /**
514
+ * @return {?}
515
+ */
516
+ function () {
517
+ this.switchModalVisible = false;
518
+ };
519
+ /**
520
+ * @param {?} item
521
+ * @return {?}
522
+ */
523
+ HdFilterComponent.prototype.selectSwitchItem = /**
524
+ * @param {?} item
525
+ * @return {?}
526
+ */
527
+ function (item) {
528
+ this.switchSelectedUuid = item.uuid ? item.uuid : '';
529
+ };
530
+ /**
531
+ * @return {?}
532
+ */
533
+ HdFilterComponent.prototype.confirmSwitch = /**
534
+ * @return {?}
535
+ */
536
+ function () {
537
+ var _this = this;
538
+ /** @type {?} */
539
+ var list = this.getDisplaySchemeList();
540
+ /** @type {?} */
541
+ var target = null;
542
+ if (this.switchSelectedUuid === '' || this.switchSelectedUuid == null) {
543
+ target = list.find((/**
544
+ * @param {?} s
545
+ * @return {?}
546
+ */
547
+ function (s) { return s.templateName === HD_FILTER_DEFAULT_SCHEME_NAME && !s.uuid; }))
548
+ || list.find((/**
549
+ * @param {?} s
550
+ * @return {?}
551
+ */
552
+ function (s) { return s.templateName === HD_FILTER_DEFAULT_SCHEME_NAME; }));
553
+ }
554
+ else {
555
+ target = list.find((/**
556
+ * @param {?} s
557
+ * @return {?}
558
+ */
559
+ function (s) { return s.uuid === _this.switchSelectedUuid; }));
560
+ }
561
+ if (!target) {
562
+ this.showError('请选择筛选模版');
563
+ return;
564
+ }
565
+ this.applyScheme(target, true);
566
+ this.switchModalVisible = false;
567
+ };
568
+ /**
569
+ * @param {?} item
570
+ * @return {?}
571
+ */
572
+ HdFilterComponent.prototype.isDefaultScheme = /**
573
+ * @param {?} item
574
+ * @return {?}
575
+ */
576
+ function (item) {
577
+ return !!(item && item.templateName === HD_FILTER_DEFAULT_SCHEME_NAME);
578
+ };
579
+ /**
580
+ * @return {?}
581
+ */
582
+ HdFilterComponent.prototype.canDeleteCurrent = /**
583
+ * @return {?}
584
+ */
585
+ function () {
586
+ return !!(this.currentScheme && this.currentScheme.uuid
587
+ && this.currentScheme.templateName !== HD_FILTER_DEFAULT_SCHEME_NAME);
588
+ };
589
+ /**
590
+ * @return {?}
591
+ */
592
+ HdFilterComponent.prototype.saveCurrentScheme = /**
593
+ * @return {?}
594
+ */
595
+ function () {
596
+ var _this = this;
597
+ if (!this.canUseScheme) {
598
+ return;
599
+ }
600
+ /** @type {?} */
601
+ var name = this.currentSchemeName || HD_FILTER_DEFAULT_SCHEME_NAME;
602
+ /** @type {?} */
603
+ var body = {
604
+ uuid: this.currentScheme && this.currentScheme.uuid ? this.currentScheme.uuid : null,
605
+ filterKey: this.filterSchemeKey,
606
+ templateName: name,
607
+ filterValue: this.serializeFilterValue()
608
+ };
609
+ this.schemeSaving = true;
610
+ if (this.schemeActionSub) {
611
+ this.schemeActionSub.unsubscribe();
612
+ }
613
+ this.schemeActionSub = this.schemeStore.save(body).subscribe((/**
614
+ * @param {?} saved
615
+ * @return {?}
616
+ */
617
+ function (saved) {
618
+ _this.schemeSaving = false;
619
+ _this.showSuccess('保存成功');
620
+ _this.currentScheme = saved;
621
+ _this.currentSchemeName = saved.templateName;
622
+ _this.refreshSchemeListKeepCurrent();
623
+ }), (/**
624
+ * @param {?} err
625
+ * @return {?}
626
+ */
627
+ function (err) {
628
+ _this.schemeSaving = false;
629
+ _this.showError('保存失败:' + (err || ''));
630
+ }));
631
+ };
632
+ /**
633
+ * @return {?}
634
+ */
635
+ HdFilterComponent.prototype.openSaveAsModal = /**
636
+ * @return {?}
637
+ */
638
+ function () {
639
+ this.saveAsName = '';
640
+ this.saveAsModalVisible = true;
641
+ };
642
+ /**
643
+ * @return {?}
644
+ */
645
+ HdFilterComponent.prototype.closeSaveAsModal = /**
646
+ * @return {?}
647
+ */
648
+ function () {
649
+ this.saveAsModalVisible = false;
650
+ };
651
+ /**
652
+ * @return {?}
653
+ */
654
+ HdFilterComponent.prototype.confirmSaveAs = /**
655
+ * @return {?}
656
+ */
657
+ function () {
658
+ var _this = this;
659
+ /** @type {?} */
660
+ var name = (this.saveAsName || '').trim();
661
+ if (!name) {
662
+ this.showError('请输入模版名称');
663
+ return;
664
+ }
665
+ if (name === HD_FILTER_DEFAULT_SCHEME_NAME) {
666
+ this.showError('不能使用「默认条件」作为模版名称,请使用「保存为当前」覆盖默认条件');
667
+ return;
668
+ }
669
+ /** @type {?} */
670
+ var exists = (this.schemeList || []).some((/**
671
+ * @param {?} s
672
+ * @return {?}
673
+ */
674
+ function (s) { return s.templateName === name; }));
675
+ if (exists) {
676
+ this.showError('模版名称已存在');
677
+ return;
678
+ }
679
+ /** @type {?} */
680
+ var body = {
681
+ filterKey: this.filterSchemeKey,
682
+ templateName: name,
683
+ filterValue: this.serializeFilterValue()
684
+ };
685
+ this.schemeSaving = true;
686
+ if (this.schemeActionSub) {
687
+ this.schemeActionSub.unsubscribe();
688
+ }
689
+ this.schemeActionSub = this.schemeStore.save(body).subscribe((/**
690
+ * @param {?} saved
691
+ * @return {?}
692
+ */
693
+ function (saved) {
694
+ _this.schemeSaving = false;
695
+ _this.saveAsModalVisible = false;
696
+ _this.showSuccess('另存为成功');
697
+ _this.currentScheme = saved;
698
+ _this.currentSchemeName = saved.templateName;
699
+ _this.refreshSchemeListKeepCurrent();
700
+ }), (/**
701
+ * @param {?} err
702
+ * @return {?}
703
+ */
704
+ function (err) {
705
+ _this.schemeSaving = false;
706
+ _this.showError('另存为失败:' + (err || ''));
707
+ }));
708
+ };
709
+ /**
710
+ * @return {?}
711
+ */
712
+ HdFilterComponent.prototype.deleteCurrentScheme = /**
713
+ * @return {?}
714
+ */
715
+ function () {
716
+ var _this = this;
717
+ if (!this.canDeleteCurrent()) {
718
+ return;
719
+ }
720
+ /** @type {?} */
721
+ var uuid = this.currentScheme.uuid;
722
+ this.schemeSaving = true;
723
+ if (this.schemeActionSub) {
724
+ this.schemeActionSub.unsubscribe();
725
+ }
726
+ this.schemeActionSub = this.schemeStore.delete(uuid).subscribe((/**
727
+ * @return {?}
728
+ */
729
+ function () {
730
+ _this.schemeSaving = false;
731
+ _this.showSuccess('删除成功');
732
+ _this.schemeList = (_this.schemeList || []).filter((/**
733
+ * @param {?} s
734
+ * @return {?}
735
+ */
736
+ function (s) { return s.uuid !== uuid; }));
737
+ _this.applySchemeByName(HD_FILTER_DEFAULT_SCHEME_NAME, true);
738
+ }), (/**
739
+ * @param {?} err
740
+ * @return {?}
741
+ */
742
+ function (err) {
743
+ _this.schemeSaving = false;
744
+ _this.showError('删除失败:' + (err || ''));
745
+ }));
746
+ };
747
+ /**
748
+ * @private
749
+ * @return {?}
750
+ */
751
+ HdFilterComponent.prototype.refreshSchemeListKeepCurrent = /**
752
+ * @private
753
+ * @return {?}
754
+ */
755
+ function () {
756
+ var _this = this;
757
+ if (!this.canUseScheme) {
758
+ return;
759
+ }
760
+ this.schemeStore.queryByFilterKey(this.filterSchemeKey).subscribe((/**
761
+ * @param {?} list
762
+ * @return {?}
763
+ */
764
+ function (list) {
765
+ _this.schemeList = list || [];
766
+ if (_this.currentScheme && _this.currentScheme.uuid) {
767
+ /** @type {?} */
768
+ var found = _this.schemeList.find((/**
769
+ * @param {?} s
770
+ * @return {?}
771
+ */
772
+ function (s) { return s.uuid === _this.currentScheme.uuid; }));
773
+ if (found) {
774
+ _this.currentScheme = found;
775
+ _this.currentSchemeName = found.templateName;
776
+ }
777
+ }
778
+ }), (/**
779
+ * @return {?}
780
+ */
781
+ function () { }));
782
+ };
783
+ /**
784
+ * @private
785
+ * @param {?} name
786
+ * @param {?} emitSearch
787
+ * @return {?}
788
+ */
789
+ HdFilterComponent.prototype.applySchemeByName = /**
790
+ * @private
791
+ * @param {?} name
792
+ * @param {?} emitSearch
793
+ * @return {?}
794
+ */
795
+ function (name, emitSearch) {
796
+ /** @type {?} */
797
+ var list = this.getDisplaySchemeList();
798
+ /** @type {?} */
799
+ var target = list.find((/**
800
+ * @param {?} s
801
+ * @return {?}
802
+ */
803
+ function (s) { return s.templateName === name; }));
804
+ if (target) {
805
+ this.applyScheme(target, emitSearch);
806
+ }
807
+ };
808
+ /**
809
+ * @private
810
+ * @param {?} scheme
811
+ * @param {?} emitSearch
812
+ * @return {?}
813
+ */
814
+ HdFilterComponent.prototype.applyScheme = /**
815
+ * @private
816
+ * @param {?} scheme
817
+ * @param {?} emitSearch
818
+ * @return {?}
819
+ */
820
+ function (scheme, emitSearch) {
821
+ this.currentScheme = scheme && scheme.uuid ? scheme : {
822
+ filterKey: this.filterSchemeKey,
823
+ templateName: scheme ? scheme.templateName : HD_FILTER_DEFAULT_SCHEME_NAME,
824
+ filterValue: scheme ? scheme.filterValue : JSON.stringify(this.defaultFilterValues || {})
825
+ };
826
+ this.currentSchemeName = this.currentScheme.templateName || HD_FILTER_DEFAULT_SCHEME_NAME;
827
+ /** @type {?} */
828
+ var values = {};
829
+ if (this.currentSchemeName === HD_FILTER_DEFAULT_SCHEME_NAME && !(scheme && scheme.uuid)) {
830
+ values = this.clonePlain(this.defaultFilterValues || {});
831
+ }
832
+ else {
833
+ try {
834
+ values = JSON.parse(scheme.filterValue || '{}');
835
+ }
836
+ catch (e) {
837
+ values = {};
838
+ }
839
+ if (this.currentSchemeName === HD_FILTER_DEFAULT_SCHEME_NAME) {
840
+ // 库中默认条件覆盖初始值:以默认值为底,再叠加库值
841
+ values = Object.assign({}, this.defaultFilterValues || {}, values || {});
842
+ }
843
+ }
844
+ this.patchFilterValues(values);
845
+ if (emitSearch) {
846
+ this.submitForm();
847
+ }
848
+ };
849
+ /**
850
+ * @private
851
+ * @return {?}
852
+ */
853
+ HdFilterComponent.prototype.serializeFilterValue = /**
854
+ * @private
855
+ * @return {?}
856
+ */
857
+ function () {
858
+ return JSON.stringify(this.getFilterData() || {});
859
+ };
860
+ /**
861
+ * @private
862
+ * @param {?} values
863
+ * @return {?}
864
+ */
865
+ HdFilterComponent.prototype.patchFilterValues = /**
866
+ * @private
867
+ * @param {?} values
868
+ * @return {?}
869
+ */
870
+ function (values) {
871
+ var _this = this;
872
+ if (!this.validateFilterForm || !this.filterList) {
873
+ return;
874
+ }
875
+ /** @type {?} */
876
+ var patch = {};
877
+ this.filterList.forEach((/**
878
+ * @param {?} item
879
+ * @return {?}
880
+ */
881
+ function (item) {
882
+ if (values && Object.prototype.hasOwnProperty.call(values, item.name)) {
883
+ patch[item.name] = _this.reviveFilterValue(item, values[item.name]);
884
+ }
885
+ }));
886
+ this.validateFilterForm.patchValue(patch);
887
+ };
888
+ /**
889
+ * @private
890
+ * @param {?} filter
891
+ * @param {?} value
892
+ * @return {?}
893
+ */
894
+ HdFilterComponent.prototype.reviveFilterValue = /**
895
+ * @private
896
+ * @param {?} filter
897
+ * @param {?} value
898
+ * @return {?}
899
+ */
900
+ function (filter, value) {
901
+ var _this = this;
902
+ if (value == null) {
903
+ return value;
904
+ }
905
+ if (filter.type === FilterListType.DateRange) {
906
+ if (Array.isArray(value)) {
907
+ return value.map((/**
908
+ * @param {?} v
909
+ * @return {?}
910
+ */
911
+ function (v) { return _this.parseDateLike(v); }));
912
+ }
913
+ return value;
914
+ }
915
+ if (filter.type === FilterListType.Date || filter.type === FilterListType.Month) {
916
+ return this.parseDateLike(value);
917
+ }
918
+ return value;
919
+ };
920
+ /**
921
+ * @private
922
+ * @param {?} value
923
+ * @return {?}
924
+ */
925
+ HdFilterComponent.prototype.parseDateLike = /**
926
+ * @private
927
+ * @param {?} value
928
+ * @return {?}
929
+ */
930
+ function (value) {
931
+ if (value == null || value instanceof Date) {
932
+ return value;
933
+ }
934
+ if (typeof value === 'string' && /^\d{4}-\d{2}-\d{2}/.test(value)) {
935
+ /** @type {?} */
936
+ var d = new Date(value);
937
+ return isNaN(d.getTime()) ? value : d;
938
+ }
939
+ if (typeof value === 'number') {
940
+ /** @type {?} */
941
+ var d = new Date(value);
942
+ return isNaN(d.getTime()) ? value : d;
943
+ }
944
+ return value;
945
+ };
946
+ /**
947
+ * @private
948
+ * @param {?} obj
949
+ * @return {?}
950
+ */
951
+ HdFilterComponent.prototype.clonePlain = /**
952
+ * @private
953
+ * @param {?} obj
954
+ * @return {?}
955
+ */
956
+ function (obj) {
957
+ try {
958
+ return JSON.parse(JSON.stringify(obj == null ? {} : obj));
959
+ }
960
+ catch (e) {
961
+ return {};
962
+ }
963
+ };
964
+ /**
965
+ * @private
966
+ * @param {?} msg
967
+ * @return {?}
968
+ */
969
+ HdFilterComponent.prototype.showSuccess = /**
970
+ * @private
971
+ * @param {?} msg
972
+ * @return {?}
973
+ */
974
+ function (msg) {
975
+ if (typeof window !== 'undefined' && ((/** @type {?} */ (window))).hdMessageService) {
976
+ ((/** @type {?} */ (window))).hdMessageService.prototype.success(msg);
977
+ }
978
+ };
979
+ /**
980
+ * @private
981
+ * @param {?} msg
982
+ * @return {?}
983
+ */
984
+ HdFilterComponent.prototype.showError = /**
985
+ * @private
986
+ * @param {?} msg
987
+ * @return {?}
988
+ */
989
+ function (msg) {
990
+ if (typeof window !== 'undefined' && ((/** @type {?} */ (window))).hdMessageService) {
991
+ ((/** @type {?} */ (window))).hdMessageService.prototype.error(msg);
992
+ }
993
+ else {
994
+ // eslint-disable-next-line no-console
995
+ console.error(msg);
996
+ }
997
+ };
333
998
  HdFilterComponent.decorators = [
334
999
  { type: Component, args: [{
335
1000
  selector: 'hd-filter',
336
- template: "<form nz-form [formGroup]=\"validateFilterForm\" class=\"ant-advanced-search-form hd-filter-container\">\n <!-- \u6574\u4F53\u7ED3\u6784 -->\n <div nz-row [nzGutter]=\"24\">\n <!-- \u5BF9\u7EC4\u4EF6\u5217\u8868\u5FAA\u73AF\u5904\u7406 -->\n <ng-container *ngFor=\"let filter of filterList\">\n <div nz-col [nzSpan]=\"6\" [hidden]=\"!filter.show\">\n <nz-form-item nzFlex>\n <nz-form-label class=\"hd-filter-label\" [nzNoColon]=\"true\"><span class=\"hd-red\" *ngIf=\"filter.require\">*</span>{{ filter.label }}\n </nz-form-label>\n <nz-form-control class=\"hd-filter-control\">\n <ng-container [ngSwitch]=\"filter.type\">\n <!-- \u8FD9\u91CC\u6570\u5B57\u5BF9\u5E94\u679A\u4E3E\u7C7B\u578B\uFF0C\u53EF\u5728hd-filter.service.ts\u6587\u4EF6\u4E2D\u67E5\u770B\u5BF9\u5E94\u5173\u7CFB -->\n <ng-container *ngSwitchCase=\"0\">\n <nz-input-group [nzSuffix]=\"inputCleanTemplate\">\n <input nz-input [placeholder]=\"filter.placeholder ? filter.placeholder : '\u8BF7\u8F93\u5165' + filter.label\"\n [formControlName]=\"filter.name\"\n (blur)=\"triggerEvent(filter.onBlurEvent || null, validateFilterForm.get(filter.name).value)\"/>\n </nz-input-group>\n <ng-template #inputCleanTemplate><i nz-icon nz-tooltip class=\"ant-input-clear-icon\" nzTheme=\"fill\"\n nzType=\"close-circle\" *ngIf=\"isAllowClear(filter) && validateFilterForm.get(filter.name).value\"\n (click)=\"inputClean(filter)\"></i></ng-template>\n </ng-container>\n <ng-container *ngSwitchCase=\"1\">\n <nz-select\n [nzShowSearch]=\"filter.selectOption.hdShowSearch != null ? filter.selectOption.hdShowSearch : true\"\n [nzAllowClear]=\"isAllowClear(filter)\"\n [nzServerSearch]=\"filter.selectOption.hdServerSearch || false\"\n [nzDropdownMatchSelectWidth]=\"filter.selectOption.hdDropdownMatchSelectWidth ? filter.selectOption.hdDropdownMatchSelectWidth : false\"\n (nzOnSearch)=\"onSearchEvent(filter.onSearchEvent || null, $event, filter.onSearchEventEventDebounceTime, filter.selectOption)\"\n [nzPlaceHolder]=\"filter.placeholder ? filter.placeholder : '\u8BF7\u9009\u62E9' + filter.label\"\n [formControlName]=\"filter.name\">\n <nz-option *ngFor=\"let selectItem of filter.selectOption.selectList\"\n [nzValue]=\"selectItem[filter.selectOption.value]\" [nzLabel]=\"filter.selectOption.showLabelAndValue ? '['+ selectItem[filter.selectOption.value] +']' +\n selectItem[filter.selectOption.label] : selectItem[filter.selectOption.label]\"></nz-option>\n </nz-select>\n </ng-container>\n <ng-container *ngSwitchCase=\"2\">\n <nz-date-picker *ngIf=\"filter.showTime\"\n [nzPlaceHolder]=\"filter.placeholder ? filter.placeholder : '\u8BF7\u9009\u62E9' + filter.label\"\n [formControlName]=\"filter.name\" [nzDisabledDate]=\"filter.hdDisabledDate\"\n [nzAllowClear]=\"isAllowClear(filter)\"\n nzShowTime nzFormat=\"yyyy-MM-dd HH:mm:ss\">\n </nz-date-picker>\n <nz-date-picker *ngIf=\"!filter.showTime\"\n [nzPlaceHolder]=\"filter.placeholder ? filter.placeholder : '\u8BF7\u9009\u62E9' + filter.label\"\n [formControlName]=\"filter.name\" [nzDisabledDate]=\"filter.hdDisabledDate\"\n [nzAllowClear]=\"isAllowClear(filter)\">\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']\" [nzDisabledDate]=\"filter.hdDisabledDate\"\n [nzAllowClear]=\"isAllowClear(filter)\" [formControlName]=\"filter.name\">\n </nz-range-picker>\n </ng-container>\n <!-- \u591A\u9879\u9009\u62E9\u5668 -->\n <ng-container *ngSwitchCase=\"4\">\n <nz-select\n [nzDropdownMatchSelectWidth]=\"filter.selectOption.hdDropdownMatchSelectWidth ? filter.selectOption.hdDropdownMatchSelectWidth : false\"\n nzMode=\"multiple\"\n [nzShowSearch]=\"filter.selectOption.hdShowSearch != null ? filter.selectOption.hdShowSearch : true\"\n [nzAllowClear]=\"isAllowClear(filter)\"\n [nzPlaceHolder]=\"filter.placeholder ? filter.placeholder : '\u8BF7\u9009\u62E9' + filter.label\"\n [formControlName]=\"filter.name\" [nzServerSearch]=\"filter.selectOption.hdServerSearch || false\"\n (nzOnSearch)=\"onSearchEvent(filter.onSearchEvent || null, $event, filter.onSearchEventEventDebounceTime, filter.selectOption)\">\n <nz-option *ngFor=\"let selectItem of filter.selectOption.selectList\"\n [nzValue]=\"selectItem[filter.selectOption.value]\" [nzLabel]=\"filter.selectOption.showLabelAndValue ? '['+ selectItem[filter.selectOption.value] +']' +\n selectItem[filter.selectOption.label] : selectItem[filter.selectOption.label]\"></nz-option>\n </nz-select>\n </ng-container>\n <ng-container *ngSwitchCase=\"5\">\n <nz-cascader [nzOptions]=\"filter.cascaderOption.options\" [formControlName]=\"filter.name\"\n [nzAllowClear]=\"isAllowClear(filter)\"\n [nzShowSearch]=\"getCascaderShowSearch(filter.cascaderOption)\"\n [nzMenuClassName]=\"getCascaderMenuClassName(filter.cascaderOption)\"\n [nzMenuStyle]=\"getCascaderMenuStyle(filter.cascaderOption)\"\n [nzPlaceHolder]=\"filter.placeholder ? filter.placeholder : '\u8BF7\u9009\u62E9' + filter.label\">\n </nz-cascader>\n </ng-container>\n <ng-container *ngSwitchCase=\"6\">\n <nz-month-picker [formControlName]=\"filter.name\"\n [nzAllowClear]=\"isAllowClear(filter)\"\n [nzPlaceHolder]=\"filter.placeholder ? filter.placeholder : '\u8BF7\u9009\u62E9' + filter.label\"></nz-month-picker>\n </ng-container>\n <ng-container *ngSwitchCase=\"7\">\n <nz-input-number [formControlName]=\"filter.name\" [nzMin]=\"filter?.inputNumber?.min || 0\"\n [nzMax]=\"filter?.inputNumber?.max || 99999999\" [nzStep]=\"filter?.inputNumber?.step || 1\"\n [nzPlaceHolder]=\"'\u8BF7\u8F93\u5165' + filter.label\"\n [nzPrecision]=\"filter?.inputNumber?.precision != null ? filter.inputNumber.precision : 4\"\n (nzBlur)=\"triggerEvent(filter.onBlurEvent || null, validateFilterForm.get(filter.name).value)\">\n </nz-input-number>\n </ng-container>\n </ng-container>\n </nz-form-control>\n </nz-form-item>\n </div>\n </ng-container>\n\n <div class=\"hd-filter-btn\" nz-col [nzSpan]=\"6\" [nzOffset]=\"computeOffset()\">\n <a *ngIf=\"filterList.length > 7\" class=\"hd-filter-more\" (click)=\"showMore()\">\n {{ isShowMore ? '\u5C55\u5F00' : '\u6536\u8D77' }}\n <i nz-icon [nzType]=\"isShowMore ? 'down' : 'up'\"></i>\n </a>\n <hd-button type=\"primary\" (click)=\"submitForm()\">\u67E5\u8BE2</hd-button>\n <hd-button type=\"reset\" (click)=\"resetForm()\">\u91CD\u7F6E</hd-button>\n </div>\n </div>\n</form>\n",
337
- styles: ["::ng-deep .common-btn-group>a{font-size:14px;font-weight:400;color:#20b95d!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;font-size:14px}::ng-deep .ant-input-number-input{height:32px}::ng-deep .ant-input-number{height:32px}textarea.ant-input{height:auto;min-height:32px}::ng-deep .ant-select-selection--multiple{min-height:32px}::ng-deep .ant-select-selection__rendered>ul>li{height:26px!important;margin-top:3px!important;line-height:26px!important}::ng-deep .ant-advanced-search-form .ant-form-item{margin-bottom:0!important}::ng-deep .ant-select-selection--single{height:32px!important}::ng-deep .ant-input{height:32px}::ng-deep .ant-input[disabled]:hover{border-color:#d9d9d9!important}::ng-deep .ant-select-selection__rendered{line-height:32px!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}::ng-deep .hd-table-container .ant-table-td-left-sticky,::ng-deep .hd-table-container .ant-table-td-right-sticky,::ng-deep .hd-table-container .ant-table-th-left-sticky,::ng-deep .hd-table-container .ant-table-th-right-sticky{z-index:2;transform:translateZ(0)}::ng-deep .hd-table-container .ant-table-thead>tr>th.ant-table-th-left-sticky,::ng-deep .hd-table-container .ant-table-thead>tr>th.ant-table-th-right-sticky{background:#f5f8f6!important}::ng-deep .hd-table-container .ant-table-tbody>tr>td.ant-table-td-left-sticky,::ng-deep .hd-table-container .ant-table-tbody>tr>td.ant-table-td-right-sticky{background:#fff}::ng-deep .hd-table-container .ant-table-tbody>tr.ant-table-row-hover>td.ant-table-td-left-sticky,::ng-deep .hd-table-container .ant-table-tbody>tr.ant-table-row-hover>td.ant-table-td-right-sticky,::ng-deep .hd-table-container .ant-table-tbody>tr:hover>td.ant-table-td-left-sticky,::ng-deep .hd-table-container .ant-table-tbody>tr:hover>td.ant-table-td-right-sticky{background:#ecf8f1!important}::ng-deep .hd-table-container .ant-table-scroll-position-left .ant-table-td-right-sticky,::ng-deep .hd-table-container .ant-table-scroll-position-left .ant-table-th-right-sticky,::ng-deep .hd-table-container .ant-table-scroll-position-middle .ant-table-td-right-sticky,::ng-deep .hd-table-container .ant-table-scroll-position-middle .ant-table-th-right-sticky,::ng-deep .hd-table-container .ant-table-scroll-position-right .ant-table-td-right-sticky,::ng-deep .hd-table-container .ant-table-scroll-position-right .ant-table-th-right-sticky{box-shadow:none!important}::ng-deep .hd-table-container .ant-table-fixed-right{right:0!important}:host ::ng-deep th{background:#f5f8f6!important;font-weight:700!important;white-space:nowrap;font-size:14px;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:14px;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-pagination-options .ant-select,::ng-deep .ant-pagination-options .ant-select-selection--single{min-width:100px}::ng-deep .ant-pagination-options-size-changer.ant-select{min-width:100px}::ng-deep .ant-time-picker{width:100%}::ng-deep .cdk-overlay-pane .hd-cascader-menus.ant-cascader-menus>.ant-cascader-menu:only-child{width:-webkit-max-content!important;width:-moz-max-content!important;width:max-content!important;min-width:var(--hd-cascader-menu-min-width,auto);max-width:560px}::ng-deep .cdk-overlay-pane .hd-cascader-menus.ant-cascader-menus>.ant-cascader-menu:only-child .ant-cascader-menu-item{white-space:nowrap}.ant-input-number-disabled,.ant-input[disabled],.ant-select-disabled{color:#4b504e}.hd-filter-container{padding:20px 23px;background:#fff;border-radius:4px;margin-bottom:8px!important;font-size:14px}.hd-filter-container .ant-row{display:flex;flex-wrap:wrap;align-items:flex-start;row-gap:4px;margin-right:0!important;margin-left:0!important}.hd-filter-container .ant-row::after,.hd-filter-container .ant-row::before{display:none}.hd-filter-container .ant-col-6{float:none;padding-left:0!important;padding-right:0!important}.hd-filter-container .hd-filter-label{width:124px;word-break:break-all;font-size:14px}.hd-filter-container .hd-filter-label ::ng-deep label{font-size:14px}.hd-filter-container .hd-filter-control{width:calc(100% - 124px)}.hd-filter-container ::ng-deep .ant-calendar-picker{width:100%}.hd-filter-container .hd-filter-more{color:#20b95d}.hd-filter-container .hd-filter-btn{height:40px;display:inline-flex;align-items:center;justify-content:flex-end}.hd-filter-container hd-button{margin-left:12px}.hd-filter-container ::ng-deep .ant-advanced-search-form .ant-form-item{margin-bottom:0!important}.hd-filter-container ::ng-deep .ant-select-selection--single{height:32px!important}.hd-filter-container ::ng-deep .ant-input{height:32px!important}.hd-filter-container ::ng-deep .ant-calendar-range-picker-input{text-align:left!important}.hd-filter-container .ant-input-number{width:100%}.hd-filter-container .hd-red{color:#f5222d}"]
1001
+ template: "<form nz-form [formGroup]=\"validateFilterForm\" class=\"ant-advanced-search-form hd-filter-container\">\n <!-- \u6574\u4F53\u7ED3\u6784 -->\n <div nz-row [nzGutter]=\"24\">\n <!-- \u5BF9\u7EC4\u4EF6\u5217\u8868\u5FAA\u73AF\u5904\u7406 -->\n <ng-container *ngFor=\"let filter of filterList\">\n <div nz-col [nzSpan]=\"6\" [hidden]=\"!filter.show\">\n <nz-form-item nzFlex>\n <nz-form-label class=\"hd-filter-label\" [nzNoColon]=\"true\"><span class=\"hd-red\" *ngIf=\"filter.require\">*</span>{{ filter.label }}\n </nz-form-label>\n <nz-form-control class=\"hd-filter-control\">\n <ng-container [ngSwitch]=\"filter.type\">\n <!-- \u8FD9\u91CC\u6570\u5B57\u5BF9\u5E94\u679A\u4E3E\u7C7B\u578B\uFF0C\u53EF\u5728hd-filter.service.ts\u6587\u4EF6\u4E2D\u67E5\u770B\u5BF9\u5E94\u5173\u7CFB -->\n <ng-container *ngSwitchCase=\"0\">\n <nz-input-group [nzSuffix]=\"inputCleanTemplate\">\n <input nz-input [placeholder]=\"filter.placeholder ? filter.placeholder : '\u8BF7\u8F93\u5165' + filter.label\"\n [formControlName]=\"filter.name\"\n (blur)=\"triggerEvent(filter.onBlurEvent || null, validateFilterForm.get(filter.name).value)\"/>\n </nz-input-group>\n <ng-template #inputCleanTemplate><i nz-icon nz-tooltip class=\"ant-input-clear-icon\" nzTheme=\"fill\"\n nzType=\"close-circle\" *ngIf=\"isAllowClear(filter) && validateFilterForm.get(filter.name).value\"\n (click)=\"inputClean(filter)\"></i></ng-template>\n </ng-container>\n <ng-container *ngSwitchCase=\"1\">\n <nz-select\n [nzShowSearch]=\"filter.selectOption.hdShowSearch != null ? filter.selectOption.hdShowSearch : true\"\n [nzAllowClear]=\"isAllowClear(filter)\"\n [nzServerSearch]=\"filter.selectOption.hdServerSearch || false\"\n [nzDropdownMatchSelectWidth]=\"filter.selectOption.hdDropdownMatchSelectWidth ? filter.selectOption.hdDropdownMatchSelectWidth : false\"\n (nzOnSearch)=\"onSearchEvent(filter.onSearchEvent || null, $event, filter.onSearchEventEventDebounceTime, filter.selectOption)\"\n [nzPlaceHolder]=\"filter.placeholder ? filter.placeholder : '\u8BF7\u9009\u62E9' + filter.label\"\n [formControlName]=\"filter.name\">\n <nz-option *ngFor=\"let selectItem of filter.selectOption.selectList\"\n [nzValue]=\"selectItem[filter.selectOption.value]\" [nzLabel]=\"filter.selectOption.showLabelAndValue ? '['+ selectItem[filter.selectOption.value] +']' +\n selectItem[filter.selectOption.label] : selectItem[filter.selectOption.label]\"></nz-option>\n </nz-select>\n </ng-container>\n <ng-container *ngSwitchCase=\"2\">\n <nz-date-picker *ngIf=\"filter.showTime\"\n [nzPlaceHolder]=\"filter.placeholder ? filter.placeholder : '\u8BF7\u9009\u62E9' + filter.label\"\n [formControlName]=\"filter.name\" [nzDisabledDate]=\"filter.hdDisabledDate\"\n [nzAllowClear]=\"isAllowClear(filter)\"\n nzShowTime nzFormat=\"yyyy-MM-dd HH:mm:ss\">\n </nz-date-picker>\n <nz-date-picker *ngIf=\"!filter.showTime\"\n [nzPlaceHolder]=\"filter.placeholder ? filter.placeholder : '\u8BF7\u9009\u62E9' + filter.label\"\n [formControlName]=\"filter.name\" [nzDisabledDate]=\"filter.hdDisabledDate\"\n [nzAllowClear]=\"isAllowClear(filter)\">\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']\" [nzDisabledDate]=\"filter.hdDisabledDate\"\n [nzAllowClear]=\"isAllowClear(filter)\" [formControlName]=\"filter.name\">\n </nz-range-picker>\n </ng-container>\n <!-- \u591A\u9879\u9009\u62E9\u5668 -->\n <ng-container *ngSwitchCase=\"4\">\n <nz-select\n [nzDropdownMatchSelectWidth]=\"filter.selectOption.hdDropdownMatchSelectWidth ? filter.selectOption.hdDropdownMatchSelectWidth : false\"\n nzMode=\"multiple\"\n [nzShowSearch]=\"filter.selectOption.hdShowSearch != null ? filter.selectOption.hdShowSearch : true\"\n [nzAllowClear]=\"isAllowClear(filter)\"\n [nzPlaceHolder]=\"filter.placeholder ? filter.placeholder : '\u8BF7\u9009\u62E9' + filter.label\"\n [formControlName]=\"filter.name\" [nzServerSearch]=\"filter.selectOption.hdServerSearch || false\"\n (nzOnSearch)=\"onSearchEvent(filter.onSearchEvent || null, $event, filter.onSearchEventEventDebounceTime, filter.selectOption)\">\n <nz-option *ngFor=\"let selectItem of filter.selectOption.selectList\"\n [nzValue]=\"selectItem[filter.selectOption.value]\" [nzLabel]=\"filter.selectOption.showLabelAndValue ? '['+ selectItem[filter.selectOption.value] +']' +\n selectItem[filter.selectOption.label] : selectItem[filter.selectOption.label]\"></nz-option>\n </nz-select>\n </ng-container>\n <ng-container *ngSwitchCase=\"5\">\n <nz-cascader [nzOptions]=\"filter.cascaderOption.options\" [formControlName]=\"filter.name\"\n [nzAllowClear]=\"isAllowClear(filter)\"\n [nzShowSearch]=\"getCascaderShowSearch(filter.cascaderOption)\"\n [nzMenuClassName]=\"getCascaderMenuClassName(filter.cascaderOption)\"\n [nzMenuStyle]=\"getCascaderMenuStyle(filter.cascaderOption)\"\n [nzPlaceHolder]=\"filter.placeholder ? filter.placeholder : '\u8BF7\u9009\u62E9' + filter.label\">\n </nz-cascader>\n </ng-container>\n <ng-container *ngSwitchCase=\"6\">\n <nz-month-picker [formControlName]=\"filter.name\"\n [nzAllowClear]=\"isAllowClear(filter)\"\n [nzPlaceHolder]=\"filter.placeholder ? filter.placeholder : '\u8BF7\u9009\u62E9' + filter.label\"></nz-month-picker>\n </ng-container>\n <ng-container *ngSwitchCase=\"7\">\n <nz-input-number [formControlName]=\"filter.name\" [nzMin]=\"filter?.inputNumber?.min || 0\"\n [nzMax]=\"filter?.inputNumber?.max || 99999999\" [nzStep]=\"filter?.inputNumber?.step || 1\"\n [nzPlaceHolder]=\"'\u8BF7\u8F93\u5165' + filter.label\"\n [nzPrecision]=\"filter?.inputNumber?.precision != null ? filter.inputNumber.precision : 4\"\n (nzBlur)=\"triggerEvent(filter.onBlurEvent || null, validateFilterForm.get(filter.name).value)\">\n </nz-input-number>\n </ng-container>\n </ng-container>\n </nz-form-control>\n </nz-form-item>\n </div>\n </ng-container>\n\n <div class=\"hd-filter-btn\" nz-col [nzSpan]=\"6\" [nzOffset]=\"computeOffset()\">\n <a *ngIf=\"filterList.length > 7\" class=\"hd-filter-more\" (click)=\"showMore()\">\n {{ isShowMore ? '\u5C55\u5F00' : '\u6536\u8D77' }}\n <i nz-icon [nzType]=\"isShowMore ? 'down' : 'up'\"></i>\n </a>\n <ng-container *ngIf=\"canUseScheme\">\n <a class=\"hd-filter-scheme-name\" (click)=\"openSwitchModal()\" nz-tooltip [nzTitle]=\"'\u5207\u6362\u7B5B\u9009\u7EC4'\">\n {{ currentSchemeName }}\n <i nz-icon nzType=\"down\"></i>\n </a>\n <a class=\"hd-filter-scheme-op\" nz-dropdown [nzDropdownMenu]=\"schemeOpMenu\" nzTrigger=\"click\">\n \u64CD\u4F5C\n <i nz-icon nzType=\"down\"></i>\n </a>\n <nz-dropdown-menu #schemeOpMenu=\"nzDropdownMenu\">\n <ul nz-menu>\n <li nz-menu-item (click)=\"saveCurrentScheme()\">\u4FDD\u5B58\u4E3A\u5F53\u524D</li>\n <li nz-menu-item (click)=\"openSaveAsModal()\">\u53E6\u5B58\u4E3A</li>\n <li nz-menu-item *ngIf=\"canDeleteCurrent()\"\n nz-popconfirm\n nzTitle=\"\u786E\u5B9A\u5220\u9664\u5F53\u524D\u7B5B\u9009\u7EC4\u5417\uFF1F\"\n nzPopconfirmPlacement=\"bottomRight\"\n (nzOnConfirm)=\"deleteCurrentScheme()\">\u5220\u9664</li>\n </ul>\n </nz-dropdown-menu>\n </ng-container>\n <hd-button type=\"primary\" (click)=\"submitForm()\">\u67E5\u8BE2</hd-button>\n <hd-button type=\"reset\" (click)=\"resetForm()\">\u91CD\u7F6E</hd-button>\n </div>\n </div>\n</form>\n\n<!-- \u5207\u6362\u7B5B\u9009\u7EC4 -->\n<nz-modal\n [(nzVisible)]=\"switchModalVisible\"\n nzTitle=\"\u5207\u6362\u7B5B\u9009\u7EC4\"\n nzWidth=\"480px\"\n [nzOkLoading]=\"schemeLoading\"\n (nzOnCancel)=\"closeSwitchModal()\"\n (nzOnOk)=\"confirmSwitch()\">\n <div class=\"hd-filter-scheme-switch\">\n <input nz-input placeholder=\"\u641C\u7D22\u6A21\u7248\u540D\u79F0\" [(ngModel)]=\"switchKeyword\" />\n <div class=\"hd-filter-scheme-switch-list\">\n <div\n class=\"hd-filter-scheme-switch-item\"\n *ngFor=\"let item of filteredSwitchList\"\n [class.active]=\"(item.uuid && item.uuid === switchSelectedUuid) || (!item.uuid && switchSelectedUuid === '')\"\n (click)=\"selectSwitchItem(item)\">\n <span>{{ item.templateName }}</span>\n <span class=\"hd-filter-scheme-tag\" *ngIf=\"isDefaultScheme(item)\">\u9ED8\u8BA4</span>\n </div>\n <div class=\"hd-filter-scheme-empty\" *ngIf=\"!filteredSwitchList.length\">\u6682\u65E0\u5339\u914D\u6A21\u7248</div>\n </div>\n </div>\n</nz-modal>\n\n<!-- \u53E6\u5B58\u4E3A -->\n<nz-modal\n [(nzVisible)]=\"saveAsModalVisible\"\n nzTitle=\"\u53E6\u5B58\u4E3A\u7B5B\u9009\u7EC4\"\n nzWidth=\"420px\"\n [nzOkLoading]=\"schemeSaving\"\n (nzOnCancel)=\"closeSaveAsModal()\"\n (nzOnOk)=\"confirmSaveAs()\">\n <div class=\"hd-filter-scheme-save-as\">\n <nz-form-item nzFlex>\n <nz-form-label [nzNoColon]=\"true\" [nzRequired]=\"true\">\u6A21\u7248\u540D\u79F0</nz-form-label>\n <nz-form-control>\n <input nz-input maxlength=\"100\" placeholder=\"\u8BF7\u8F93\u5165\u6A21\u7248\u540D\u79F0\" [(ngModel)]=\"saveAsName\" />\n </nz-form-control>\n </nz-form-item>\n </div>\n</nz-modal>\n",
1002
+ styles: ["::ng-deep .common-btn-group>a{font-size:14px;font-weight:400;color:#20b95d!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;font-size:14px}::ng-deep .ant-input-number-input{height:32px}::ng-deep .ant-input-number{height:32px}textarea.ant-input{height:auto;min-height:32px}::ng-deep .ant-select-selection--multiple{min-height:32px}::ng-deep .ant-select-selection__rendered>ul>li{height:26px!important;margin-top:3px!important;line-height:26px!important}::ng-deep .ant-advanced-search-form .ant-form-item{margin-bottom:0!important}::ng-deep .ant-select-selection--single{height:32px!important}::ng-deep .ant-input{height:32px}::ng-deep .ant-input[disabled]:hover{border-color:#d9d9d9!important}::ng-deep .ant-select-selection__rendered{line-height:32px!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}::ng-deep .hd-table-container .ant-table-td-left-sticky,::ng-deep .hd-table-container .ant-table-td-right-sticky,::ng-deep .hd-table-container .ant-table-th-left-sticky,::ng-deep .hd-table-container .ant-table-th-right-sticky{z-index:2;transform:translateZ(0)}::ng-deep .hd-table-container .ant-table-thead>tr>th.ant-table-th-left-sticky,::ng-deep .hd-table-container .ant-table-thead>tr>th.ant-table-th-right-sticky{background:#f5f8f6!important}::ng-deep .hd-table-container .ant-table-tbody>tr>td.ant-table-td-left-sticky,::ng-deep .hd-table-container .ant-table-tbody>tr>td.ant-table-td-right-sticky{background:#fff}::ng-deep .hd-table-container .ant-table-tbody>tr.ant-table-row-hover>td.ant-table-td-left-sticky,::ng-deep .hd-table-container .ant-table-tbody>tr.ant-table-row-hover>td.ant-table-td-right-sticky,::ng-deep .hd-table-container .ant-table-tbody>tr:hover>td.ant-table-td-left-sticky,::ng-deep .hd-table-container .ant-table-tbody>tr:hover>td.ant-table-td-right-sticky{background:#ecf8f1!important}::ng-deep .hd-table-container .ant-table-scroll-position-left .ant-table-td-right-sticky,::ng-deep .hd-table-container .ant-table-scroll-position-left .ant-table-th-right-sticky,::ng-deep .hd-table-container .ant-table-scroll-position-middle .ant-table-td-right-sticky,::ng-deep .hd-table-container .ant-table-scroll-position-middle .ant-table-th-right-sticky,::ng-deep .hd-table-container .ant-table-scroll-position-right .ant-table-td-right-sticky,::ng-deep .hd-table-container .ant-table-scroll-position-right .ant-table-th-right-sticky{box-shadow:none!important}::ng-deep .hd-table-container .ant-table-fixed-right{right:0!important}:host ::ng-deep th{background:#f5f8f6!important;font-weight:700!important;white-space:nowrap;font-size:14px;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:14px;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-pagination-options .ant-select,::ng-deep .ant-pagination-options .ant-select-selection--single{min-width:100px}::ng-deep .ant-pagination-options-size-changer.ant-select{min-width:100px}::ng-deep .ant-time-picker{width:100%}::ng-deep .cdk-overlay-pane .hd-cascader-menus.ant-cascader-menus>.ant-cascader-menu:only-child{width:-webkit-max-content!important;width:-moz-max-content!important;width:max-content!important;min-width:var(--hd-cascader-menu-min-width,auto);max-width:560px}::ng-deep .cdk-overlay-pane .hd-cascader-menus.ant-cascader-menus>.ant-cascader-menu:only-child .ant-cascader-menu-item{white-space:nowrap}.ant-input-number-disabled,.ant-input[disabled],.ant-select-disabled{color:#4b504e}.hd-filter-container{padding:20px 23px;background:#fff;border-radius:4px;margin-bottom:8px!important;font-size:14px}.hd-filter-container .ant-row{display:flex;flex-wrap:wrap;align-items:flex-start;row-gap:4px;margin-right:0!important;margin-left:0!important}.hd-filter-container .ant-row::after,.hd-filter-container .ant-row::before{display:none}.hd-filter-container .ant-col-6{float:none;padding-left:0!important;padding-right:0!important}.hd-filter-container .hd-filter-label{width:124px;word-break:break-all;font-size:14px}.hd-filter-container .hd-filter-label ::ng-deep label{font-size:14px}.hd-filter-container .hd-filter-control{width:calc(100% - 124px)}.hd-filter-container ::ng-deep .ant-calendar-picker{width:100%}.hd-filter-container .hd-filter-more{color:#20b95d}.hd-filter-container .hd-filter-btn{height:40px;display:inline-flex;align-items:center;justify-content:flex-end}.hd-filter-container hd-button{margin-left:12px}.hd-filter-container ::ng-deep .ant-advanced-search-form .ant-form-item{margin-bottom:0!important}.hd-filter-container ::ng-deep .ant-select-selection--single{height:32px!important}.hd-filter-container ::ng-deep .ant-input{height:32px!important}.hd-filter-container ::ng-deep .ant-calendar-range-picker-input{text-align:left!important}.hd-filter-container .ant-input-number{width:100%}.hd-filter-container .hd-red{color:#f5222d}.hd-filter-container .hd-filter-scheme-name,.hd-filter-container .hd-filter-scheme-op{color:#20b95d;margin-left:12px;white-space:nowrap}.hd-filter-scheme-switch input{margin-bottom:12px}.hd-filter-scheme-switch .hd-filter-scheme-switch-list{max-height:320px;overflow:auto;border:1px solid #e8e8e8;border-radius:4px}.hd-filter-scheme-switch .hd-filter-scheme-switch-item{display:flex;align-items:center;justify-content:space-between;padding:10px 12px;cursor:pointer;border-bottom:1px solid #f0f0f0}.hd-filter-scheme-switch .hd-filter-scheme-switch-item:last-child{border-bottom:none}.hd-filter-scheme-switch .hd-filter-scheme-switch-item.active,.hd-filter-scheme-switch .hd-filter-scheme-switch-item:hover{background:#e6f7ff}.hd-filter-scheme-switch .hd-filter-scheme-tag{color:#20b95d;font-size:12px}.hd-filter-scheme-switch .hd-filter-scheme-empty{padding:24px;text-align:center;color:rgba(0,0,0,.45)}.hd-filter-scheme-save-as .ant-form-item{margin-bottom:0}"]
338
1003
  }] }
339
1004
  ];
340
1005
  /** @nocollapse */
341
1006
  HdFilterComponent.ctorParameters = function () { return [
342
- { type: FormBuilder }
1007
+ { type: FormBuilder },
1008
+ { type: HdFilterSchemeStore, decorators: [{ type: Optional }, { type: Inject, args: [HD_FILTER_SCHEME_STORE,] }] }
343
1009
  ]; };
344
1010
  HdFilterComponent.propDecorators = {
345
1011
  filterList: [{ type: Input }],
1012
+ enableFilterScheme: [{ type: Input }],
1013
+ filterSchemeKey: [{ type: Input }],
346
1014
  searchEvent: [{ type: Output }],
347
1015
  resetEvent: [{ type: Output }]
348
1016
  };
1017
+ tslib_1.__decorate([
1018
+ InputBoolean(),
1019
+ tslib_1.__metadata("design:type", Object)
1020
+ ], HdFilterComponent.prototype, "enableFilterScheme", void 0);
349
1021
  return HdFilterComponent;
350
1022
  }());
351
1023
  export { HdFilterComponent };
352
1024
  if (false) {
353
1025
  /** @type {?} */
354
1026
  HdFilterComponent.prototype.filterList;
1027
+ /**
1028
+ * 是否启用筛选组(默认关闭)
1029
+ * @type {?}
1030
+ */
1031
+ HdFilterComponent.prototype.enableFilterScheme;
1032
+ /**
1033
+ * 筛选器标识,开启筛选组时必传
1034
+ * @type {?}
1035
+ */
1036
+ HdFilterComponent.prototype.filterSchemeKey;
355
1037
  /** @type {?} */
356
1038
  HdFilterComponent.prototype.searchEvent;
357
1039
  /** @type {?} */
@@ -377,6 +1059,49 @@ if (false) {
377
1059
  * @private
378
1060
  */
379
1061
  HdFilterComponent.prototype.searchSubscription;
1062
+ /**
1063
+ * @type {?}
1064
+ * @private
1065
+ */
1066
+ HdFilterComponent.prototype.schemeLoadSub;
1067
+ /**
1068
+ * @type {?}
1069
+ * @private
1070
+ */
1071
+ HdFilterComponent.prototype.schemeActionSub;
1072
+ /**
1073
+ * 页面配置的初始值(虚拟「默认条件」)
1074
+ * @type {?}
1075
+ * @private
1076
+ */
1077
+ HdFilterComponent.prototype.defaultFilterValues;
1078
+ /**
1079
+ * @type {?}
1080
+ * @private
1081
+ */
1082
+ HdFilterComponent.prototype.defaultValuesCaptured;
1083
+ /** @type {?} */
1084
+ HdFilterComponent.prototype.schemeList;
1085
+ /** @type {?} */
1086
+ HdFilterComponent.prototype.currentScheme;
1087
+ /** @type {?} */
1088
+ HdFilterComponent.prototype.currentSchemeName;
1089
+ /** @type {?} */
1090
+ HdFilterComponent.prototype.schemeLoading;
1091
+ /** @type {?} */
1092
+ HdFilterComponent.prototype.schemeSaving;
1093
+ /** @type {?} */
1094
+ HdFilterComponent.prototype.switchModalVisible;
1095
+ /** @type {?} */
1096
+ HdFilterComponent.prototype.switchKeyword;
1097
+ /** @type {?} */
1098
+ HdFilterComponent.prototype.switchSelectedUuid;
1099
+ /** @type {?} */
1100
+ HdFilterComponent.prototype.saveAsModalVisible;
1101
+ /** @type {?} */
1102
+ HdFilterComponent.prototype.saveAsName;
1103
+ /** @type {?} */
1104
+ HdFilterComponent.prototype.defaultSchemeName;
380
1105
  /** @type {?} */
381
1106
  HdFilterComponent.prototype.getCascaderShowSearch;
382
1107
  /** @type {?} */
@@ -388,5 +1113,10 @@ if (false) {
388
1113
  * @private
389
1114
  */
390
1115
  HdFilterComponent.prototype.fb;
1116
+ /**
1117
+ * @type {?}
1118
+ * @private
1119
+ */
1120
+ HdFilterComponent.prototype.schemeStore;
391
1121
  }
392
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGQtZmlsdGVyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL2ZhbnRhc3ktbmd6b3Jyby8iLCJzb3VyY2VzIjpbImhkLWZpbHRlci9oZC1maWx0ZXIuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFVLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMvRSxPQUFPLEVBQUUsV0FBVyxFQUFhLE1BQU0sZ0JBQWdCLENBQUM7QUFFeEQsT0FBTyxFQUNMLHdCQUF3QixFQUN4QixvQkFBb0IsRUFDcEIscUJBQXFCLEdBQ3RCLE1BQU0sd0JBQXdCLENBQUM7QUFDaEMsT0FBTyxFQUFFLE9BQU8sRUFBZ0IsTUFBTSxNQUFNLENBQUM7QUFDN0MsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRTlDO0lBbUJFLDJCQUFvQixFQUFlO1FBQW5DLGlCQUlDO1FBSm1CLE9BQUUsR0FBRixFQUFFLENBQWE7UUFYekIsZ0JBQVcsR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDO1FBQ2pDLGVBQVUsR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDO1FBRzFDLGVBQVUsR0FBWSxJQUFJLENBQUM7O1FBRTNCLHNCQUFpQixHQUFXLENBQUMsQ0FBQztRQUN0QixrQkFBYSxHQUFHLElBQUksT0FBTyxFQUFnRCxDQUFDO1FBQzVFLG9CQUFlLEdBQVcsQ0FBQyxDQUFDLENBQUUsU0FBUztRQXlLL0MsMEJBQXFCLEdBQUcscUJBQXFCLENBQUM7UUFDOUMsNkJBQXdCLEdBQUcsd0JBQXdCLENBQUM7UUFDcEQseUJBQW9CLEdBQUcsb0JBQW9CLENBQUM7UUF2SzFDLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FDL0MsWUFBWSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FDbkMsQ0FBQyxTQUFTOzs7O1FBQUMsVUFBQyxFQUEyQjtnQkFBekIsVUFBRSxFQUFFLGdCQUFLLEVBQUUsOEJBQVk7WUFBTyxPQUFBLEtBQUksQ0FBQyxZQUFZLENBQUMsRUFBRSxFQUFFLEtBQUssRUFBRSxZQUFZLENBQUM7UUFBMUMsQ0FBMEMsRUFBQyxDQUFDO0lBQzNGLENBQUM7Ozs7SUFFRCxvQ0FBUTs7O0lBQVI7UUFDRSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDZCxDQUFDOzs7O0lBRUQsdUNBQVc7OztJQUFYO1FBQ0UsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO0lBQ2QsQ0FBQzs7Ozs7SUFFTyxnQ0FBSTs7OztJQUFaO1FBQUEsaUJBNEJDO1FBM0JDLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDO1FBQ3ZCLE9BQU87UUFDUCxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEVBQUU7WUFDcEMsTUFBTSxpQkFBaUIsQ0FBQztTQUN6QjtRQUNELElBQUksQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7OztZQUVoRCxhQUFhLEdBQUcsRUFBRTtRQUN0QixJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU87Ozs7O1FBQUMsVUFBQyxJQUFJLEVBQUUsS0FBSztZQUNsQyxhQUFhLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLEtBQUksQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDM0QsVUFBVTtZQUNWLElBQUksQ0FBQyxJQUFJLEdBQUcsS0FBSyxHQUFHLENBQUMsQ0FBQztRQUN4QixDQUFDLEVBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxrQkFBa0IsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUN2RCxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU87Ozs7UUFBQyxVQUFDLElBQUk7WUFDM0IsSUFBSSxJQUFJLENBQUMsYUFBYSxFQUFFO2dCQUN0QixJQUFJLElBQUksQ0FBQyx5QkFBeUIsRUFBRTtvQkFDbEMsS0FBSSxDQUFDLGtCQUFrQixDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsWUFBWTt5QkFDaEQsSUFBSSxDQUNILFlBQVksQ0FBQyxJQUFJLENBQUMseUJBQXlCLENBQUMsQ0FDN0M7eUJBQ0EsU0FBUzs7OztvQkFBQyxVQUFBLEtBQUssSUFBSSxPQUFBLEtBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxLQUFLLENBQUMsRUFBNUMsQ0FBNEMsRUFBQyxDQUFDO2lCQUNyRTtxQkFBTTtvQkFDTCxLQUFJLENBQUMsa0JBQWtCLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxZQUFZLENBQUMsU0FBUzs7OztvQkFBQyxVQUFBLEtBQUssSUFBSSxPQUFBLEtBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxLQUFLLENBQUMsRUFBNUMsQ0FBNEMsRUFBQyxDQUFDO2lCQUN0SDthQUNGO1FBQ0gsQ0FBQyxFQUFDLENBQUM7SUFDTCxDQUFDOzs7Ozs7OztJQUVELHlDQUFhOzs7Ozs7O0lBQWIsVUFBYyxFQUFPLEVBQUUsS0FBVSxFQUFFLHlCQUE4QixFQUFFLFlBQWtCO1FBQXJGLGlCQW9CQztRQW5CQyxJQUFJLHlCQUF5QixFQUFFO1lBQzdCLFNBQVM7WUFDVCxJQUFJLENBQUMsZUFBZSxHQUFHLHlCQUF5QixDQUFDO1lBRWpELFVBQVU7WUFDVixJQUFJLElBQUksQ0FBQyxrQkFBa0IsRUFBRTtnQkFDM0IsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFdBQVcsRUFBRSxDQUFDO2FBQ3ZDO1lBRUQsU0FBUztZQUNULElBQUksQ0FBQyxrQkFBa0IsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FDL0MsWUFBWSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FDbkMsQ0FBQyxTQUFTOzs7O1lBQUMsVUFBQyxFQUEyQjtvQkFBekIsVUFBRSxFQUFFLGdCQUFLLEVBQUUsOEJBQVk7Z0JBQU8sT0FBQSxLQUFJLENBQUMsWUFBWSxDQUFDLEVBQUUsRUFBRSxLQUFLLEVBQUUsWUFBWSxDQUFDO1lBQTFDLENBQTBDLEVBQUMsQ0FBQztZQUV6RixPQUFPO1lBQ1AsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsRUFBRSxFQUFFLElBQUEsRUFBRSxLQUFLLE9BQUEsRUFBRSxZQUFZLGNBQUEsRUFBRSxDQUFDLENBQUM7U0FDdEQ7YUFBTTtZQUNMLElBQUksQ0FBQyxZQUFZLENBQUMsRUFBRSxFQUFFLEtBQUssRUFBRSxZQUFZLENBQUMsQ0FBQztTQUM1QztJQUNILENBQUM7Ozs7Ozs7SUFFRCx3Q0FBWTs7Ozs7O0lBQVosVUFBYSxFQUFPLEVBQUUsS0FBVSxFQUFFLFlBQWtCO1FBQ2xELElBQUksRUFBRSxJQUFJLFlBQVksRUFBRTtZQUN0QixFQUFFLENBQUMsS0FBSyxFQUFFLFlBQVksQ0FBQyxDQUFDO1NBQ3pCO2FBQU0sSUFBSSxFQUFFLEVBQUU7WUFDYixFQUFFLENBQUMsS0FBSyxDQUFDLENBQUM7U0FDWDthQUFNO1lBQ0wsT0FBTztTQUNSO0lBQ0gsQ0FBQzs7OztJQUVELHlDQUFhOzs7SUFBYjtRQUNFLGlCQUFpQjtRQUNqQixJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtZQUNoQyxPQUFPLEVBQUUsQ0FBQztTQUNYO1FBQ0QsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGlCQUFpQixLQUFLLENBQUMsSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQzFNLENBQUM7Ozs7OztJQUVPLHFDQUFTOzs7OztJQUFqQixVQUFrQixJQUFtQjtRQUNuQyxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxNQUFNLEtBQUssQ0FBQyxDQUFDLEVBQUU7WUFDeEMsT0FBTyxJQUFJLENBQUM7U0FDYjs7WUFDRyxRQUFRLEdBQUcsRUFBRTtRQUNqQixJQUFJLENBQUMsT0FBTzs7OztRQUFDLFVBQUMsSUFBSTtZQUNoQixVQUFVO1lBQ1YsK0pBQStKO1lBQy9KLDJDQUEyQztZQUMzQyxJQUFJO1lBQ0osUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDM0IsQ0FBQyxFQUFDLENBQUM7UUFDSCxhQUFhO1FBQ2IsSUFBSSxpQkFBSSxJQUFJLEdBQUcsQ0FBQyxRQUFRLENBQUMsRUFBRSxNQUFNLEtBQUssSUFBSSxDQUFDLE1BQU0sRUFBRTtZQUNqRCxNQUFNLDRCQUE0QixDQUFDO1NBQ3BDO1FBQ0QsZ0JBQWdCO1FBQ2hCLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQzs7OztJQUVNLHNDQUFVOzs7SUFBakI7UUFDRSxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQztJQUMvRCxDQUFDOzs7O0lBRU0scUNBQVM7OztJQUFoQjtRQUNFLElBQUksQ0FBQyx3QkFBd0IsRUFBRSxDQUFDO1FBQ2hDLG1DQUFtQztRQUNuQyxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7WUFDeEMsNEJBQTRCO1lBQzVCLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDO1NBQzdEO2FBQU07WUFDTCw0QkFBNEI7WUFDNUIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUM7U0FDOUQ7SUFDSCxDQUFDO0lBRUQ7O09BRUc7Ozs7O0lBQ0ksb0RBQXdCOzs7O0lBQS9COztZQUNRLFVBQVUsR0FBMkIsRUFBRTtRQUM3QyxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU87Ozs7UUFBQyxVQUFDLElBQUk7WUFDM0IsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDO1FBQ3JDLENBQUMsRUFBQyxDQUFDO1FBQ0gsMkJBQTJCO1FBQzNCLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDakQsQ0FBQzs7OztJQUVNLHlDQUFhOzs7SUFBcEI7UUFDRSxPQUFPLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUMvQyxDQUFDOzs7O0lBRU0sb0NBQVE7OztJQUFmO1FBQUEsaUJBS0M7UUFKQyxJQUFJLENBQUMsVUFBVSxHQUFHLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQztRQUNuQyxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU87Ozs7O1FBQUMsVUFBQyxJQUFJLEVBQUUsS0FBSztZQUNsQyxJQUFJLENBQUMsSUFBSSxHQUFHLEtBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztRQUNqRCxDQUFDLEVBQUMsQ0FBQztJQUNMLENBQUM7Ozs7O0lBRU0sc0NBQVU7Ozs7SUFBakIsVUFBa0IsTUFBYzs7WUFDeEIsV0FBVyxHQUFHLEVBQUU7UUFDdEIsV0FBVyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUM7UUFFaEMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUNsRCxDQUFDO0lBRUQ7O09BRUc7Ozs7OztJQUNILHdDQUFZOzs7OztJQUFaLFVBQWEsSUFBWTtRQUN2QixJQUFJLENBQUMsSUFBSSxFQUFFO1lBQ1QsT0FBTyxJQUFJLENBQUM7U0FDYjtRQUNELElBQUksSUFBSSxDQUFDLFlBQVksSUFBSSxJQUFJLEVBQUU7WUFDN0IsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQztTQUM1QjtRQUNELElBQUksSUFBSSxDQUFDLFlBQVksSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLFlBQVksSUFBSSxJQUFJLEVBQUU7WUFDL0QsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxZQUFZLENBQUM7U0FDekM7UUFDRCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7O2dCQXZMRixTQUFTLFNBQUM7b0JBQ1QsUUFBUSxFQUFFLFdBQVc7b0JBQ3JCLGltUEFBeUM7O2lCQUUxQzs7OztnQkFkUSxXQUFXOzs7NkJBaUJqQixLQUFLOzhCQUNMLE1BQU07NkJBQ04sTUFBTTs7SUFtTFQsd0JBQUM7Q0FBQSxBQTVMRCxJQTRMQztTQXZMWSxpQkFBaUI7OztJQUU1Qix1Q0FBbUM7O0lBQ25DLHdDQUEyQzs7SUFDM0MsdUNBQTBDOztJQUUxQywrQ0FBOEI7O0lBQzlCLHVDQUEyQjs7SUFFM0IsOENBQThCOzs7OztJQUM5QiwwQ0FBb0Y7Ozs7O0lBQ3BGLDRDQUFvQzs7Ozs7SUFFcEMsK0NBQXFEOztJQXVLckQsa0RBQThDOztJQUM5QyxxREFBb0Q7O0lBQ3BELGlEQUE0Qzs7Ozs7SUF4S2hDLCtCQUF1QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT25Jbml0LCBPdXRwdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZvcm1CdWlsZGVyLCBGb3JtR3JvdXAgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBGaWx0ZXIgfSBmcm9tICcuL2hkLWZpbHRlci5zZXJ2aWNlJztcbmltcG9ydCB7XG4gIGdldENhc2NhZGVyTWVudUNsYXNzTmFtZSxcbiAgZ2V0Q2FzY2FkZXJNZW51U3R5bGUsXG4gIGdldENhc2NhZGVyU2hvd1NlYXJjaCxcbn0gZnJvbSAnLi4vdXRpbHMvY2FzY2FkZXIudXRpbCc7XG5pbXBvcnQgeyBTdWJqZWN0LCBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGRlYm91bmNlVGltZSB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnaGQtZmlsdGVyJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2hkLWZpbHRlci5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2hkLWZpbHRlci5jb21wb25lbnQubGVzcyddXG59KVxuZXhwb3J0IGNsYXNzIEhkRmlsdGVyQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcblxuICBASW5wdXQoKSBmaWx0ZXJMaXN0OiBBcnJheTxGaWx0ZXI+O1xuICBAT3V0cHV0KCkgc2VhcmNoRXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIEBPdXRwdXQoKSByZXNldEV2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gIHZhbGlkYXRlRmlsdGVyRm9ybTogRm9ybUdyb3VwO1xuICBpc1Nob3dNb3JlOiBib29sZWFuID0gdHJ1ZTtcbiAgLy8g5a+5ZmlsdGVyTGlzdOWPluaooei/kOeul1xuICBmaWx0ZXJMaXN0TW9kdWxhcjogbnVtYmVyID0gMDtcbiAgcHJpdmF0ZSBzZWFyY2hTdWJqZWN0ID0gbmV3IFN1YmplY3Q8eyBmbjogYW55LCBldmVudDogYW55LCBzZWxlY3RPcHRpb24/OiBhbnk7IH0+KCk7XG4gIHByaXZhdGUgZGVib3VuY2VUaW1lb3V0OiBudW1iZXIgPSAwOyAgLy8g6buY6K6k6Ziy5oqW5pe26Ze0XG5cbiAgcHJpdmF0ZSBzZWFyY2hTdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbiB8IHVuZGVmaW5lZDtcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBmYjogRm9ybUJ1aWxkZXIpIHtcbiAgICB0aGlzLnNlYXJjaFN1YnNjcmlwdGlvbiA9IHRoaXMuc2VhcmNoU3ViamVjdC5waXBlKFxuICAgICAgZGVib3VuY2VUaW1lKHRoaXMuZGVib3VuY2VUaW1lb3V0KVxuICAgICkuc3Vic2NyaWJlKCh7IGZuLCBldmVudCwgc2VsZWN0T3B0aW9uIH0pID0+IHRoaXMudHJpZ2dlckV2ZW50KGZuLCBldmVudCwgc2VsZWN0T3B0aW9uKSk7XG4gIH1cblxuICBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLmluaXQoKTtcbiAgfVxuXG4gIG5nT25DaGFuZ2VzKCkge1xuICAgIHRoaXMuaW5pdCgpO1xuICB9XG5cbiAgcHJpdmF0ZSBpbml0KCk6IHZvaWQge1xuICAgIHRoaXMuaXNTaG93TW9yZSA9IHRydWU7XG4gICAgLy8g5byC5bi45o2V6I63XG4gICAgaWYgKCF0aGlzLmNoZWNrTGlzdCh0aGlzLmZpbHRlckxpc3QpKSB7XG4gICAgICB0aHJvdyAnZmlsdGVy57uE5Lu25pWw5o2u5qC85byP5LiN6KeE6IyDJztcbiAgICB9XG4gICAgdGhpcy5maWx0ZXJMaXN0TW9kdWxhciA9IHRoaXMuZmlsdGVyTGlzdC5sZW5ndGggJSA0O1xuICAgIC8vIOmmluWFiOagueaNruWumuS5ieeahOe7hOS7tuaVsOe7hCAg5Y675Yid5aeL5YyW6KGo5Y2VXG4gICAgbGV0IGZvcm1Hcm91cExpc3QgPSB7fTtcbiAgICB0aGlzLmZpbHRlckxpc3QuZm9yRWFjaCgoaXRlbSwgaW5kZXgpID0+IHtcbiAgICAgIGZvcm1Hcm91cExpc3RbaXRlbS5uYW1lXSA9IHRoaXMuZmIuY29udHJvbChpdGVtLnZhbHVlLCBbXSk7XG4gICAgICAvLyDliJ3lp4vljJbmjqfku7bmmL7lvbFcbiAgICAgIGl0ZW0uc2hvdyA9IGluZGV4IDwgNztcbiAgICB9KTtcbiAgICB0aGlzLnZhbGlkYXRlRmlsdGVyRm9ybSA9IHRoaXMuZmIuZ3JvdXAoZm9ybUdyb3VwTGlzdCk7XG4gICAgdGhpcy5maWx0ZXJMaXN0LmZvckVhY2goKGl0ZW0pID0+IHtcbiAgICAgIGlmIChpdGVtLm9uQ2hhbmdlRXZlbnQpIHtcbiAgICAgICAgaWYgKGl0ZW0ub25DaGFuZ2VFdmVudERlYm91bmNlVGltZSkge1xuICAgICAgICAgIHRoaXMudmFsaWRhdGVGaWx0ZXJGb3JtLmdldChpdGVtLm5hbWUpLnZhbHVlQ2hhbmdlc1xuICAgICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICAgIGRlYm91bmNlVGltZShpdGVtLm9uQ2hhbmdlRXZlbnREZWJvdW5jZVRpbWUpXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAuc3Vic2NyaWJlKHZhbHVlID0+IHRoaXMudHJpZ2dlckV2ZW50KGl0ZW0ub25DaGFuZ2VFdmVudCwgdmFsdWUpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLnZhbGlkYXRlRmlsdGVyRm9ybS5nZXQoaXRlbS5uYW1lKS52YWx1ZUNoYW5nZXMuc3Vic2NyaWJlKHZhbHVlID0+IHRoaXMudHJpZ2dlckV2ZW50KGl0ZW0ub25DaGFuZ2VFdmVudCwgdmFsdWUpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgb25TZWFyY2hFdmVudChmbjogYW55LCBldmVudDogYW55LCBvblNlYXJjaEV2ZW50RGVib3VuY2VUaW1lOiBhbnksIHNlbGVjdE9wdGlvbj86IGFueSkge1xuICAgIGlmIChvblNlYXJjaEV2ZW50RGVib3VuY2VUaW1lKSB7XG4gICAgICAvLyDmm7TmlrDpmLLmipbml7bpl7RcbiAgICAgIHRoaXMuZGVib3VuY2VUaW1lb3V0ID0gb25TZWFyY2hFdmVudERlYm91bmNlVGltZTtcblxuICAgICAgLy8g5Y+W5raI5LmL5YmN55qE6K6i6ZiFXG4gICAgICBpZiAodGhpcy5zZWFyY2hTdWJzY3JpcHRpb24pIHtcbiAgICAgICAgdGhpcy5zZWFyY2hTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICAgIH1cblxuICAgICAgLy8g5Yib5bu65paw55qE6K6i6ZiFXG4gICAgICB0aGlzLnNlYXJjaFN1YnNjcmlwdGlvbiA9IHRoaXMuc2VhcmNoU3ViamVjdC5waXBlKFxuICAgICAgICBkZWJvdW5jZVRpbWUodGhpcy5kZWJvdW5jZVRpbWVvdXQpXG4gICAgICApLnN1YnNjcmliZSgoeyBmbiwgZXZlbnQsIHNlbGVjdE9wdGlvbiB9KSA9PiB0aGlzLnRyaWdnZXJFdmVudChmbiwgZXZlbnQsIHNlbGVjdE9wdGlvbikpO1xuXG4gICAgICAvLyDlj5HpgIHkuovku7ZcbiAgICAgIHRoaXMuc2VhcmNoU3ViamVjdC5uZXh0KHsgZm4sIGV2ZW50LCBzZWxlY3RPcHRpb24gfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMudHJpZ2dlckV2ZW50KGZuLCBldmVudCwgc2VsZWN0T3B0aW9uKTtcbiAgICB9XG4gIH1cblxuICB0cmlnZ2VyRXZlbnQoZm46IGFueSwgZXZlbnQ6IGFueSwgc2VsZWN0T3B0aW9uPzogYW55KSB7XG4gICAgaWYgKGZuICYmIHNlbGVjdE9wdGlvbikge1xuICAgICAgZm4oZXZlbnQsIHNlbGVjdE9wdGlvbik7XG4gICAgfSBlbHNlIGlmIChmbikge1xuICAgICAgZm4oZXZlbnQpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICB9XG5cbiAgY29tcHV0ZU9mZnNldCgpIHtcbiAgICAvLyDnibnmrorlpITnkIbkuIvnrYnkuo405Liq6YCJ6aG555qE5oOF5Ya1XG4gICAgaWYgKHRoaXMuZmlsdGVyTGlzdC5sZW5ndGggPT09IDQpIHtcbiAgICAgIHJldHVybiAxODtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuaXNTaG93TW9yZSA/ICgodGhpcy5maWx0ZXJMaXN0TW9kdWxhciA9PT0gMCB8fCB0aGlzLmZpbHRlckxpc3QubGVuZ3RoID4gNykgPyAwIDogKDMgLSB0aGlzLmZpbHRlckxpc3RNb2R1bGFyKSAqIDYpIDogKHRoaXMuZmlsdGVyTGlzdE1vZHVsYXIgPT09IDAgPyAxOCA6ICgzIC0gdGhpcy5maWx0ZXJMaXN0TW9kdWxhcikgKiA2KTtcbiAgfVxuXG4gIHByaXZhdGUgY2hlY2tMaXN0KGxpc3Q6IEFycmF5PEZpbHRlcj4pOiBib29sZWFuIHtcbiAgICBpZiAoIWxpc3QgfHwgKGxpc3QgJiYgbGlzdC5sZW5ndGggPT09IDApKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgbGV0IG5hbWVMaXN0ID0gW107XG4gICAgbGlzdC5mb3JFYWNoKChpdGVtKSA9PiB7XG4gICAgICAvLyDmoKHpqozljZXpobnpgInmi6nlmahcbiAgICAgIC8vIGlmIChpdGVtLnR5cGUgPT09IEZpbHRlckxpc3RUeXBlLlNlbGVjdCAmJiAoIWl0ZW0uc2VsZWN0T3B0aW9uLnNlbGVjdExpc3QgfHwgKGl0ZW0uc2VsZWN0T3B0aW9uLnNlbGVjdExpc3QgJiYgaXRlbS5zZWxlY3RPcHRpb24uc2VsZWN0TGlzdC5sZW5ndGggPT09IDApKSkge1xuICAgICAgLy8gICB0aHJvdyAnZmlsdGVy57uE5Lu25pWw5o2u5qC85byP5LiN6KeE6IyD77yM5a2Y5Zyo5Y2V6aG56YCJ5oup5Zmo5rKh5pyJ5Lyg5YWl6YCJ6aG5ISdcbiAgICAgIC8vIH1cbiAgICAgIG5hbWVMaXN0LnB1c2goaXRlbS5uYW1lKTtcbiAgICB9KTtcbiAgICAvLyDmoKHpqoxuYW1l5piv5ZCm6YeN5aSNXG4gICAgaWYgKFsuLi5uZXcgU2V0KG5hbWVMaXN0KV0ubGVuZ3RoICE9PSBsaXN0Lmxlbmd0aCkge1xuICAgICAgdGhyb3cgJ2ZpbHRlcue7hOS7tuaVsOaNruagvOW8j+S4jeinhOiMg++8jOWtmOWcqOmHjeWkjW5hbWXlgLwhJztcbiAgICB9XG4gICAgLy8gLi4ubW9yZSBjaGVja1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcHVibGljIHN1Ym1pdEZvcm0oKTogdm9pZCB7XG4gICAgdGhpcy5zZWFyY2hFdmVudC5lbWl0KHRoaXMudmFsaWRhdGVGaWx0ZXJGb3JtLmdldFJhd1ZhbHVlKCkpO1xuICB9XG5cbiAgcHVibGljIHJlc2V0Rm9ybSgpOiB2b2lkIHtcbiAgICB0aGlzLnJlc2V0RmlsdGVyRm9ybVdpdGhWYWx1ZSgpO1xuICAgIC8vIHRoaXMudmFsaWRhdGVGaWx0ZXJGb3JtLnJlc2V0KCk7XG4gICAgaWYgKHRoaXMucmVzZXRFdmVudC5vYnNlcnZlcnMubGVuZ3RoID4gMCkge1xuICAgICAgLy8g5aaC5p6c5pyJ54i257uE5Lu257uR5a6a5LqGIHJlc2V0RXZlbnQg55qE5aSE55CG5ZmoXG4gICAgICB0aGlzLnJlc2V0RXZlbnQuZW1pdCh0aGlzLnZhbGlkYXRlRmlsdGVyRm9ybS5nZXRSYXdWYWx1ZSgpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8g5aaC5p6c5rKh5pyJ57uR5a6a5aSE55CG5Zmo77yM5YiZ6Kem5Y+RIHNlYXJjaEV2ZW50XG4gICAgICB0aGlzLnNlYXJjaEV2ZW50LmVtaXQodGhpcy52YWxpZGF0ZUZpbHRlckZvcm0uZ2V0UmF3VmFsdWUoKSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIOW4puWIneWni+WAvOmHjee9ruihqOWNlVxuICAgKi9cbiAgcHVibGljIHJlc2V0RmlsdGVyRm9ybVdpdGhWYWx1ZSgpIHtcbiAgICBjb25zdCByZXNldFZhbHVlOiB7IFtrZXk6IHN0cmluZ106IGFueSB9ID0ge307XG4gICAgdGhpcy5maWx0ZXJMaXN0LmZvckVhY2goKGl0ZW0pID0+IHtcbiAgICAgIHJlc2V0VmFsdWVbaXRlbS5uYW1lXSA9IGl0ZW0udmFsdWU7XG4gICAgfSk7XG4gICAgLy8g6YeN572u6KGo5Y2V5YC877yI5Lya6Kem5Y+RdmFsdWVDaGFuZ2Vz5LqL5Lu277yJXG4gICAgdGhpcy52YWxpZGF0ZUZpbHRlckZvcm0ucGF0Y2hWYWx1ZShyZXNldFZhbHVlKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRGaWx0ZXJEYXRhKCkge1xuICAgIHJldHVybiB0aGlzLnZhbGlkYXRlRmlsdGVyRm9ybS5nZXRSYXdWYWx1ZSgpO1xuICB9XG5cbiAgcHVibGljIHNob3dNb3JlKCk6IHZvaWQge1xuICAgIHRoaXMuaXNTaG93TW9yZSA9ICF0aGlzLmlzU2hvd01vcmU7XG4gICAgdGhpcy5maWx0ZXJMaXN0LmZvckVhY2goKGl0ZW0sIGluZGV4KSA9PiB7XG4gICAgICBpdGVtLnNob3cgPSB0aGlzLmlzU2hvd01vcmUgPyBpbmRleCA8IDcgOiB0cnVlO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGlucHV0Q2xlYW4oZmlsdGVyOiBGaWx0ZXIpOiB2b2lkIHtcbiAgICBjb25zdCBwYXRjaE9iamVjdCA9IHt9O1xuICAgIHBhdGNoT2JqZWN0W2ZpbHRlci5uYW1lXSA9IG51bGw7XG5cbiAgICB0aGlzLnZhbGlkYXRlRmlsdGVyRm9ybS5wYXRjaFZhbHVlKHBhdGNoT2JqZWN0KTtcbiAgfVxuXG4gIC8qKlxuICAgKiDmmK/lkKblhYHorrjmuIXnqbrvvJrkvJjlhYggRmlsdGVyLmhkQWxsb3dDbGVhcu+8jOWFtuasoSBzZWxlY3RPcHRpb24uaGRBbGxvd0NsZWFy77yM6buY6K6kIHRydWVcbiAgICovXG4gIGlzQWxsb3dDbGVhcihpdGVtOiBGaWx0ZXIpOiBib29sZWFuIHtcbiAgICBpZiAoIWl0ZW0pIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBpZiAoaXRlbS5oZEFsbG93Q2xlYXIgIT0gbnVsbCkge1xuICAgICAgcmV0dXJuICEhaXRlbS5oZEFsbG93Q2xlYXI7XG4gICAgfVxuICAgIGlmIChpdGVtLnNlbGVjdE9wdGlvbiAmJiBpdGVtLnNlbGVjdE9wdGlvbi5oZEFsbG93Q2xlYXIgIT0gbnVsbCkge1xuICAgICAgcmV0dXJuICEhaXRlbS5zZWxlY3RPcHRpb24uaGRBbGxvd0NsZWFyO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGdldENhc2NhZGVyU2hvd1NlYXJjaCA9IGdldENhc2NhZGVyU2hvd1NlYXJjaDtcbiAgZ2V0Q2FzY2FkZXJNZW51Q2xhc3NOYW1lID0gZ2V0Q2FzY2FkZXJNZW51Q2xhc3NOYW1lO1xuICBnZXRDYXNjYWRlck1lbnVTdHlsZSA9IGdldENhc2NhZGVyTWVudVN0eWxlO1xufVxuIl19
1122
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGQtZmlsdGVyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL2ZhbnRhc3ktbmd6b3Jyby8iLCJzb3VyY2VzIjpbImhkLWZpbHRlci9oZC1maWx0ZXIuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsT0FBTyxFQUNMLFNBQVMsRUFDVCxZQUFZLEVBQ1osTUFBTSxFQUNOLEtBQUssRUFJTCxRQUFRLEVBQ1IsTUFBTSxFQUVQLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxXQUFXLEVBQWEsTUFBTSxnQkFBZ0IsQ0FBQztBQUN4RCxPQUFPLEVBQVUsY0FBYyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDN0QsT0FBTyxFQUNMLHdCQUF3QixFQUN4QixvQkFBb0IsRUFDcEIscUJBQXFCLEdBQ3RCLE1BQU0sd0JBQXdCLENBQUM7QUFDaEMsT0FBTyxFQUFFLE9BQU8sRUFBZ0IsTUFBTSxNQUFNLENBQUM7QUFDN0MsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzlDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDN0MsT0FBTyxFQUNMLDZCQUE2QixFQUM3QixzQkFBc0IsRUFFdEIsbUJBQW1CLEVBQ3BCLE1BQU0sb0JBQW9CLENBQUM7QUFFNUI7SUE2Q0UsMkJBQ1UsRUFBZSxFQUM2QixXQUFnQztRQUZ0RixpQkFPQztRQU5TLE9BQUUsR0FBRixFQUFFLENBQWE7UUFDNkIsZ0JBQVcsR0FBWCxXQUFXLENBQXFCOzs7O1FBdEM3RCx1QkFBa0IsR0FBRyxLQUFLLENBQUM7UUFJMUMsZ0JBQVcsR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDO1FBQ2pDLGVBQVUsR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDO1FBRzFDLGVBQVUsR0FBWSxJQUFJLENBQUM7UUFDM0Isc0JBQWlCLEdBQVcsQ0FBQyxDQUFDO1FBQ3RCLGtCQUFhLEdBQUcsSUFBSSxPQUFPLEVBQWdELENBQUM7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REFBNEM7Ozs7O0lBbmdCMUMsK0JBQXVCOzs7OztJQUN2Qix3Q0FBb0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDb21wb25lbnQsXG4gIEV2ZW50RW1pdHRlcixcbiAgSW5qZWN0LFxuICBJbnB1dCxcbiAgT25DaGFuZ2VzLFxuICBPbkRlc3Ryb3ksXG4gIE9uSW5pdCxcbiAgT3B0aW9uYWwsXG4gIE91dHB1dCxcbiAgU2ltcGxlQ2hhbmdlc1xufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZvcm1CdWlsZGVyLCBGb3JtR3JvdXAgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBGaWx0ZXIsIEZpbHRlckxpc3RUeXBlIH0gZnJvbSAnLi9oZC1maWx0ZXIuc2VydmljZSc7XG5pbXBvcnQge1xuICBnZXRDYXNjYWRlck1lbnVDbGFzc05hbWUsXG4gIGdldENhc2NhZGVyTWVudVN0eWxlLFxuICBnZXRDYXNjYWRlclNob3dTZWFyY2gsXG59IGZyb20gJy4uL3V0aWxzL2Nhc2NhZGVyLnV0aWwnO1xuaW1wb3J0IHsgU3ViamVjdCwgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBkZWJvdW5jZVRpbWUgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBJbnB1dEJvb2xlYW4gfSBmcm9tICduZy16b3Jyby1hbnRkJztcbmltcG9ydCB7XG4gIEhEX0ZJTFRFUl9ERUZBVUxUX1NDSEVNRV9OQU1FLFxuICBIRF9GSUxURVJfU0NIRU1FX1NUT1JFLFxuICBIZEZpbHRlclNjaGVtZSxcbiAgSGRGaWx0ZXJTY2hlbWVTdG9yZVxufSBmcm9tICcuL2hkLWZpbHRlci1zY2hlbWUnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdoZC1maWx0ZXInLFxuICB0ZW1wbGF0ZVVybDogJy4vaGQtZmlsdGVyLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vaGQtZmlsdGVyLmNvbXBvbmVudC5sZXNzJ11cbn0pXG5leHBvcnQgY2xhc3MgSGRGaWx0ZXJDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcywgT25EZXN0cm95IHtcblxuICBASW5wdXQoKSBmaWx0ZXJMaXN0OiBBcnJheTxGaWx0ZXI+O1xuICAvKiog5piv5ZCm5ZCv55So562b6YCJ57uE77yI6buY6K6k5YWz6Zet77yJICovXG4gIEBJbnB1dCgpIEBJbnB1dEJvb2xlYW4oKSBlbmFibGVGaWx0ZXJTY2hlbWUgPSBmYWxzZTtcbiAgLyoqIOetm+mAieWZqOagh+ivhu+8jOW8gOWQr+etm+mAiee7hOaXtuW/heS8oCAqL1xuICBASW5wdXQoKSBmaWx0ZXJTY2hlbWVLZXk6IHN0cmluZztcblxuICBAT3V0cHV0KCkgc2VhcmNoRXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIEBPdXRwdXQoKSByZXNldEV2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gIHZhbGlkYXRlRmlsdGVyRm9ybTogRm9ybUdyb3VwO1xuICBpc1Nob3dNb3JlOiBib29sZWFuID0gdHJ1ZTtcbiAgZmlsdGVyTGlzdE1vZHVsYXI6IG51bWJlciA9IDA7XG4gIHByaXZhdGUgc2VhcmNoU3ViamVjdCA9IG5ldyBTdWJqZWN0PHsgZm46IGFueSwgZXZlbnQ6IGFueSwgc2VsZWN0T3B0aW9uPzogYW55OyB9PigpO1xuICBwcml2YXRlIGRlYm91bmNlVGltZW91dDogbnVtYmVyID0gMDtcblxuICBwcml2YXRlIHNlYXJjaFN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uIHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIHNjaGVtZUxvYWRTdWI6IFN1YnNjcmlwdGlvbiB8IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSBzY2hlbWVBY3Rpb25TdWI6IFN1YnNjcmlwdGlvbiB8IHVuZGVmaW5lZDtcblxuICAvKiog6aG16Z2i6YWN572u55qE5Yid5aeL5YC877yI6Jma5ouf44CM6buY6K6k5p2h5Lu244CN77yJICovXG4gIHByaXZhdGUgZGVmYXVsdEZpbHRlclZhbHVlczogeyBba2V5OiBzdHJpbmddOiBhbnkgfSA9IHt9O1xuICBwcml2YXRlIGRlZmF1bHRWYWx1ZXNDYXB0dXJlZCA9IGZhbHNlO1xuXG4gIHNjaGVtZUxpc3Q6IEFycmF5PEhkRmlsdGVyU2NoZW1lPiA9IFtdO1xuICBjdXJyZW50U2NoZW1lOiBIZEZpbHRlclNjaGVtZSA9IG51bGw7XG4gIGN1cnJlbnRTY2hlbWVOYW1lID0gSERfRklMVEVSX0RFRkFVTFRfU0NIRU1FX05BTUU7XG4gIHNjaGVtZUxvYWRpbmcgPSBmYWxzZTtcbiAgc2NoZW1lU2F2aW5nID0gZmFsc2U7XG5cbiAgc3dpdGNoTW9kYWxWaXNpYmxlID0gZmFsc2U7XG4gIHN3aXRjaEtleXdvcmQgPSAnJztcbiAgc3dpdGNoU2VsZWN0ZWRVdWlkOiBzdHJpbmcgPSBudWxsO1xuXG4gIHNhdmVBc01vZGFsVmlzaWJsZSA9IGZhbHNlO1xuICBzYXZlQXNOYW1lID0gJyc7XG5cbiAgcmVhZG9ubHkgZGVmYXVsdFNjaGVtZU5hbWUgPSBIRF9GSUxURVJfREVGQVVMVF9TQ0hFTUVfTkFNRTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGZiOiBGb3JtQnVpbGRlcixcbiAgICBAT3B0aW9uYWwoKSBASW5qZWN0KEhEX0ZJTFRFUl9TQ0hFTUVfU1RPUkUpIHByaXZhdGUgc2NoZW1lU3RvcmU6IEhkRmlsdGVyU2NoZW1lU3RvcmVcbiAgKSB7XG4gICAgdGhpcy5zZWFyY2hTdWJzY3JpcHRpb24gPSB0aGlzLnNlYXJjaFN1YmplY3QucGlwZShcbiAgICAgIGRlYm91bmNlVGltZSh0aGlzLmRlYm91bmNlVGltZW91dClcbiAgICApLnN1YnNjcmliZSgoeyBmbiwgZXZlbnQsIHNlbGVjdE9wdGlvbiB9KSA9PiB0aGlzLnRyaWdnZXJFdmVudChmbiwgZXZlbnQsIHNlbGVjdE9wdGlvbikpO1xuICB9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgdGhpcy5pbml0KCk7XG4gICAgdGhpcy50cnlMb2FkU2NoZW1lcyh0cnVlKTtcbiAgfVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpIHtcbiAgICBpZiAoY2hhbmdlc1snZmlsdGVyTGlzdCddKSB7XG4gICAgICB0aGlzLmluaXQoKTtcbiAgICB9XG4gICAgaWYgKGNoYW5nZXNbJ2VuYWJsZUZpbHRlclNjaGVtZSddIHx8IGNoYW5nZXNbJ2ZpbHRlclNjaGVtZUtleSddKSB7XG4gICAgICB0aGlzLnRyeUxvYWRTY2hlbWVzKHRydWUpO1xuICAgIH1cbiAgfVxuXG4gIG5nT25EZXN0cm95KCkge1xuICAgIGlmICh0aGlzLnNlYXJjaFN1YnNjcmlwdGlvbikge1xuICAgICAgdGhpcy5zZWFyY2hTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuc2NoZW1lTG9hZFN1Yikge1xuICAgICAgdGhpcy5zY2hlbWVMb2FkU3ViLnVuc3Vic2NyaWJlKCk7XG4gICAgfVxuICAgIGlmICh0aGlzLnNjaGVtZUFjdGlvblN1Yikge1xuICAgICAgdGhpcy5zY2hlbWVBY3Rpb25TdWIudW5zdWJzY3JpYmUoKTtcbiAgICB9XG4gIH1cblxuICBnZXQgY2FuVXNlU2NoZW1lKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhISh0aGlzLmVuYWJsZUZpbHRlclNjaGVtZSAmJiB0aGlzLmZpbHRlclNjaGVtZUtleSAmJiB0aGlzLnNjaGVtZVN0b3JlKTtcbiAgfVxuXG4gIGdldCBmaWx0ZXJlZFN3aXRjaExpc3QoKTogQXJyYXk8SGRGaWx0ZXJTY2hlbWU+IHtcbiAgICBjb25zdCBsaXN0ID0gdGhpcy5nZXREaXNwbGF5U2NoZW1lTGlzdCgpO1xuICAgIGNvbnN0IGt3ID0gKHRoaXMuc3dpdGNoS2V5d29yZCB8fCAnJykudHJpbSgpO1xuICAgIGlmICgha3cpIHtcbiAgICAgIHJldHVybiBsaXN0O1xuICAgIH1cbiAgICByZXR1cm4gbGlzdC5maWx0ZXIoaXRlbSA9PiAoaXRlbS50ZW1wbGF0ZU5hbWUgfHwgJycpLmluZGV4T2Yoa3cpID49IDApO1xuICB9XG5cbiAgcHJpdmF0ZSBpbml0KCk6IHZvaWQge1xuICAgIHRoaXMuaXNTaG93TW9yZSA9IHRydWU7XG4gICAgaWYgKCF0aGlzLmNoZWNrTGlzdCh0aGlzLmZpbHRlckxpc3QpKSB7XG4gICAgICB0aHJvdyAnZmlsdGVy57uE5Lu25pWw5o2u5qC85byP5LiN6KeE6IyDJztcbiAgICB9XG4gICAgaWYgKCF0aGlzLmZpbHRlckxpc3QpIHtcbiAgICAgIHRoaXMuZmlsdGVyTGlzdCA9IFtdO1xuICAgIH1cbiAgICB0aGlzLmZpbHRlckxpc3RNb2R1bGFyID0gdGhpcy5maWx0ZXJMaXN0Lmxlbmd0aCAlIDQ7XG4gICAgY29uc3QgZm9ybUdyb3VwTGlzdCA9IHt9O1xuICAgIHRoaXMuZmlsdGVyTGlzdC5mb3JFYWNoKChpdGVtLCBpbmRleCkgPT4ge1xuICAgICAgZm9ybUdyb3VwTGlzdFtpdGVtLm5hbWVdID0gdGhpcy5mYi5jb250cm9sKGl0ZW0udmFsdWUsIFtdKTtcbiAgICAgIGl0ZW0uc2hvdyA9IGluZGV4IDwgNztcbiAgICB9KTtcbiAgICB0aGlzLnZhbGlkYXRlRmlsdGVyRm9ybSA9IHRoaXMuZmIuZ3JvdXAoZm9ybUdyb3VwTGlzdCk7XG4gICAgaWYgKCF0aGlzLmRlZmF1bHRWYWx1ZXNDYXB0dXJlZCkge1xuICAgICAgdGhpcy5kZWZhdWx0RmlsdGVyVmFsdWVzID0gdGhpcy5jbG9uZVBsYWluKHRoaXMuZ2V0RmlsdGVyRGF0YSgpKTtcbiAgICAgIHRoaXMuZGVmYXVsdFZhbHVlc0NhcHR1cmVkID0gdHJ1ZTtcbiAgICB9XG4gICAgdGhpcy5maWx0ZXJMaXN0LmZvckVhY2goKGl0ZW0pID0+IHtcbiAgICAgIGlmIChpdGVtLm9uQ2hhbmdlRXZlbnQpIHtcbiAgICAgICAgaWYgKGl0ZW0ub25DaGFuZ2VFdmVudERlYm91bmNlVGltZSkge1xuICAgICAgICAgIHRoaXMudmFsaWRhdGVGaWx0ZXJGb3JtLmdldChpdGVtLm5hbWUpLnZhbHVlQ2hhbmdlc1xuICAgICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICAgIGRlYm91bmNlVGltZShpdGVtLm9uQ2hhbmdlRXZlbnREZWJvdW5jZVRpbWUpXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAuc3Vic2NyaWJlKHZhbHVlID0+IHRoaXMudHJpZ2dlckV2ZW50KGl0ZW0ub25DaGFuZ2VFdmVudCwgdmFsdWUpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLnZhbGlkYXRlRmlsdGVyRm9ybS5nZXQoaXRlbS5uYW1lKS52YWx1ZUNoYW5nZXMuc3Vic2NyaWJlKHZhbHVlID0+IHRoaXMudHJpZ2dlckV2ZW50KGl0ZW0ub25DaGFuZ2VFdmVudCwgdmFsdWUpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgb25TZWFyY2hFdmVudChmbjogYW55LCBldmVudDogYW55LCBvblNlYXJjaEV2ZW50RGVib3VuY2VUaW1lOiBhbnksIHNlbGVjdE9wdGlvbj86IGFueSkge1xuICAgIGlmIChvblNlYXJjaEV2ZW50RGVib3VuY2VUaW1lKSB7XG4gICAgICB0aGlzLmRlYm91bmNlVGltZW91dCA9IG9uU2VhcmNoRXZlbnREZWJvdW5jZVRpbWU7XG4gICAgICBpZiAodGhpcy5zZWFyY2hTdWJzY3JpcHRpb24pIHtcbiAgICAgICAgdGhpcy5zZWFyY2hTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuc2VhcmNoU3Vic2NyaXB0aW9uID0gdGhpcy5zZWFyY2hTdWJqZWN0LnBpcGUoXG4gICAgICAgIGRlYm91bmNlVGltZSh0aGlzLmRlYm91bmNlVGltZW91dClcbiAgICAgICkuc3Vic2NyaWJlKCh7IGZuLCBldmVudCwgc2VsZWN0T3B0aW9uIH0pID0+IHRoaXMudHJpZ2dlckV2ZW50KGZuLCBldmVudCwgc2VsZWN0T3B0aW9uKSk7XG4gICAgICB0aGlzLnNlYXJjaFN1YmplY3QubmV4dCh7IGZuLCBldmVudCwgc2VsZWN0T3B0aW9uIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnRyaWdnZXJFdmVudChmbiwgZXZlbnQsIHNlbGVjdE9wdGlvbik7XG4gICAgfVxuICB9XG5cbiAgdHJpZ2dlckV2ZW50KGZuOiBhbnksIGV2ZW50OiBhbnksIHNlbGVjdE9wdGlvbj86IGFueSkge1xuICAgIGlmIChmbiAmJiBzZWxlY3RPcHRpb24pIHtcbiAgICAgIGZuKGV2ZW50LCBzZWxlY3RPcHRpb24pO1xuICAgIH0gZWxzZSBpZiAoZm4pIHtcbiAgICAgIGZuKGV2ZW50KTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfVxuXG4gIGNvbXB1dGVPZmZzZXQoKSB7XG4gICAgaWYgKHRoaXMuZmlsdGVyTGlzdC5sZW5ndGggPT09IDQpIHtcbiAgICAgIHJldHVybiAxODtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuaXNTaG93TW9yZSA/ICgodGhpcy5maWx0ZXJMaXN0TW9kdWxhciA9PT0gMCB8fCB0aGlzLmZpbHRlckxpc3QubGVuZ3RoID4gNykgPyAwIDogKDMgLSB0aGlzLmZpbHRlckxpc3RNb2R1bGFyKSAqIDYpIDogKHRoaXMuZmlsdGVyTGlzdE1vZHVsYXIgPT09IDAgPyAxOCA6ICgzIC0gdGhpcy5maWx0ZXJMaXN0TW9kdWxhcikgKiA2KTtcbiAgfVxuXG4gIHByaXZhdGUgY2hlY2tMaXN0KGxpc3Q6IEFycmF5PEZpbHRlcj4pOiBib29sZWFuIHtcbiAgICBpZiAoIWxpc3QgfHwgKGxpc3QgJiYgbGlzdC5sZW5ndGggPT09IDApKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgY29uc3QgbmFtZUxpc3QgPSBbXTtcbiAgICBsaXN0LmZvckVhY2goKGl0ZW0pID0+IHtcbiAgICAgIG5hbWVMaXN0LnB1c2goaXRlbS5uYW1lKTtcbiAgICB9KTtcbiAgICBpZiAoWy4uLm5ldyBTZXQobmFtZUxpc3QpXS5sZW5ndGggIT09IGxpc3QubGVuZ3RoKSB7XG4gICAgICB0aHJvdyAnZmlsdGVy57uE5Lu25pWw5o2u5qC85byP5LiN6KeE6IyD77yM5a2Y5Zyo6YeN5aSNbmFtZeWAvCEnO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHB1YmxpYyBzdWJtaXRGb3JtKCk6IHZvaWQge1xuICAgIHRoaXMuc2VhcmNoRXZlbnQuZW1pdCh0aGlzLnZhbGlkYXRlRmlsdGVyRm9ybS5nZXRSYXdWYWx1ZSgpKTtcbiAgfVxuXG4gIHB1YmxpYyByZXNldEZvcm0oKTogdm9pZCB7XG4gICAgdGhpcy5yZXNldEZpbHRlckZvcm1XaXRoVmFsdWUoKTtcbiAgICBpZiAodGhpcy5yZXNldEV2ZW50Lm9ic2VydmVycy5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLnJlc2V0RXZlbnQuZW1pdCh0aGlzLnZhbGlkYXRlRmlsdGVyRm9ybS5nZXRSYXdWYWx1ZSgpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zZWFyY2hFdmVudC5lbWl0KHRoaXMudmFsaWRhdGVGaWx0ZXJGb3JtLmdldFJhd1ZhbHVlKCkpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyByZXNldEZpbHRlckZvcm1XaXRoVmFsdWUoKSB7XG4gICAgY29uc3QgcmVzZXRWYWx1ZTogeyBba2V5OiBzdHJpbmddOiBhbnkgfSA9IHt9O1xuICAgIHRoaXMuZmlsdGVyTGlzdC5mb3JFYWNoKChpdGVtKSA9PiB7XG4gICAgICByZXNldFZhbHVlW2l0ZW0ubmFtZV0gPSBpdGVtLnZhbHVlO1xuICAgIH0pO1xuICAgIHRoaXMudmFsaWRhdGVGaWx0ZXJGb3JtLnBhdGNoVmFsdWUocmVzZXRWYWx1ZSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0RmlsdGVyRGF0YSgpIHtcbiAgICByZXR1cm4gdGhpcy52YWxpZGF0ZUZpbHRlckZvcm0uZ2V0UmF3VmFsdWUoKTtcbiAgfVxuXG4gIHB1YmxpYyBzaG93TW9yZSgpOiB2b2lkIHtcbiAgICB0aGlzLmlzU2hvd01vcmUgPSAhdGhpcy5pc1Nob3dNb3JlO1xuICAgIHRoaXMuZmlsdGVyTGlzdC5mb3JFYWNoKChpdGVtLCBpbmRleCkgPT4ge1xuICAgICAgaXRlbS5zaG93ID0gdGhpcy5pc1Nob3dNb3JlID8gaW5kZXggPCA3IDogdHJ1ZTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBpbnB1dENsZWFuKGZpbHRlcjogRmlsdGVyKTogdm9pZCB7XG4gICAgY29uc3QgcGF0Y2hPYmplY3QgPSB7fTtcbiAgICBwYXRjaE9iamVjdFtmaWx0ZXIubmFtZV0gPSBudWxsO1xuICAgIHRoaXMudmFsaWRhdGVGaWx0ZXJGb3JtLnBhdGNoVmFsdWUocGF0Y2hPYmplY3QpO1xuICB9XG5cbiAgaXNBbGxvd0NsZWFyKGl0ZW06IEZpbHRlcik6IGJvb2xlYW4ge1xuICAgIGlmICghaXRlbSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGlmIChpdGVtLmhkQWxsb3dDbGVhciAhPSBudWxsKSB7XG4gICAgICByZXR1cm4gISFpdGVtLmhkQWxsb3dDbGVhcjtcbiAgICB9XG4gICAgaWYgKGl0ZW0uc2VsZWN0T3B0aW9uICYmIGl0ZW0uc2VsZWN0T3B0aW9uLmhkQWxsb3dDbGVhciAhPSBudWxsKSB7XG4gICAgICByZXR1cm4gISFpdGVtLnNlbGVjdE9wdGlvbi5oZEFsbG93Q2xlYXI7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLy8gLS0tLS0tLS0tLSDnrZvpgInnu4QgLS0tLS0tLS0tLVxuXG4gIHByaXZhdGUgdHJ5TG9hZFNjaGVtZXMoYXBwbHlEZWZhdWx0OiBib29sZWFuKSB7XG4gICAgaWYgKCF0aGlzLmNhblVzZVNjaGVtZSkge1xuICAgICAgdGhpcy5zY2hlbWVMaXN0ID0gW107XG4gICAgICB0aGlzLmN1cnJlbnRTY2hlbWUgPSBudWxsO1xuICAgICAgdGhpcy5jdXJyZW50U2NoZW1lTmFtZSA9IEhEX0ZJTFRFUl9ERUZBVUxUX1NDSEVNRV9OQU1FO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnNjaGVtZUxvYWRpbmcgPSB0cnVlO1xuICAgIGlmICh0aGlzLnNjaGVtZUxvYWRTdWIpIHtcbiAgICAgIHRoaXMuc2NoZW1lTG9hZFN1Yi51bnN1YnNjcmliZSgpO1xuICAgIH1cbiAgICB0aGlzLnNjaGVtZUxvYWRTdWIgPSB0aGlzLnNjaGVtZVN0b3JlLnF1ZXJ5QnlGaWx0ZXJLZXkodGhpcy5maWx0ZXJTY2hlbWVLZXkpLnN1YnNjcmliZShcbiAgICAgIChsaXN0KSA9PiB7XG4gICAgICAgIHRoaXMuc2NoZW1lTG9hZGluZyA9IGZhbHNlO1xuICAgICAgICB0aGlzLnNjaGVtZUxpc3QgPSBsaXN0IHx8IFtdO1xuICAgICAgICBpZiAoYXBwbHlEZWZhdWx0KSB7XG4gICAgICAgICAgdGhpcy5hcHBseVNjaGVtZUJ5TmFtZShIRF9GSUxURVJfREVGQVVMVF9TQ0hFTUVfTkFNRSwgdHJ1ZSk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5jdXJyZW50U2NoZW1lICYmIHRoaXMuY3VycmVudFNjaGVtZS51dWlkKSB7XG4gICAgICAgICAgY29uc3QgZm91bmQgPSB0aGlzLnNjaGVtZUxpc3QuZmluZChzID0+IHMudXVpZCA9PT0gdGhpcy5jdXJyZW50U2NoZW1lLnV1aWQpO1xuICAgICAgICAgIHRoaXMuY3VycmVudFNjaGVtZSA9IGZvdW5kIHx8IG51bGw7XG4gICAgICAgICAgdGhpcy5jdXJyZW50U2NoZW1lTmFtZSA9IGZvdW5kID8gZm91bmQudGVtcGxhdGVOYW1lIDogSERfRklMVEVSX0RFRkFVTFRfU0NIRU1FX05BTUU7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICAoZXJyKSA9PiB7XG4gICAgICAgIHRoaXMuc2NoZW1lTG9hZGluZyA9IGZhbHNlO1xuICAgICAgICB0aGlzLnNob3dFcnJvcign5Yqg6L29562b6YCJ5qih54mI5aSx6LSl77yaJyArIChlcnIgfHwgJycpKTtcbiAgICAgICAgaWYgKGFwcGx5RGVmYXVsdCkge1xuICAgICAgICAgIHRoaXMuYXBwbHlTY2hlbWVCeU5hbWUoSERfRklMVEVSX0RFRkFVTFRfU0NIRU1FX05BTUUsIHRydWUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgKTtcbiAgfVxuXG4gIC8qKiDlsZXnpLrnlKjliJfooajvvJrkv53or4HmnInjgIzpu5jorqTmnaHku7bjgI0gKi9cbiAgZ2V0RGlzcGxheVNjaGVtZUxpc3QoKTogQXJyYXk8SGRGaWx0ZXJTY2hlbWU+IHtcbiAgICBjb25zdCByZXN1bHQ6IEFycmF5PEhkRmlsdGVyU2NoZW1lPiA9IFtdO1xuICAgIGNvbnN0IGZyb21EYiA9IHRoaXMuc2NoZW1lTGlzdC5maW5kKHMgPT4gcy50ZW1wbGF0ZU5hbWUgPT09IEhEX0ZJTFRFUl9ERUZBVUxUX1NDSEVNRV9OQU1FKTtcbiAgICBpZiAoZnJvbURiKSB7XG4gICAgICByZXN1bHQucHVzaChmcm9tRGIpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXN1bHQucHVzaCh7XG4gICAgICAgIGZpbHRlcktleTogdGhpcy5maWx0ZXJTY2hlbWVLZXksXG4gICAgICAgIHRlbXBsYXRlTmFtZTogSERfRklMVEVSX0RFRkFVTFRfU0NIRU1FX05BTUUsXG4gICAgICAgIGZpbHRlclZhbHVlOiBKU09OLnN0cmluZ2lmeSh0aGlzLmRlZmF1bHRGaWx0ZXJWYWx1ZXMgfHwge30pXG4gICAgICB9KTtcbiAgICB9XG4gICAgKHRoaXMuc2NoZW1lTGlzdCB8fCBbXSkuZm9yRWFjaChzID0+IHtcbiAgICAgIGlmIChzLnRlbXBsYXRlTmFtZSAhPT0gSERfRklMVEVSX0RFRkFVTFRfU0NIRU1FX05BTUUpIHtcbiAgICAgICAgcmVzdWx0LnB1c2gocyk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIG9wZW5Td2l0Y2hNb2RhbCgpIHtcbiAgICBpZiAoIXRoaXMuY2FuVXNlU2NoZW1lKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuc3dpdGNoS2V5d29yZCA9ICcnO1xuICAgIHRoaXMuc3dpdGNoU2VsZWN0ZWRVdWlkID0gdGhpcy5jdXJyZW50U2NoZW1lICYmIHRoaXMuY3VycmVudFNjaGVtZS51dWlkXG4gICAgICA/IHRoaXMuY3VycmVudFNjaGVtZS51dWlkXG4gICAgICA6IG51bGw7XG4gICAgLy8g6Jma5ouf6buY6K6k5p2h5Lu277yadXVpZCDkuLrnqbrml7bnlKjnqbrkuLLmoIforrBcbiAgICBpZiAoIXRoaXMuY3VycmVudFNjaGVtZSB8fCAhdGhpcy5jdXJyZW50U2NoZW1lLnV1aWQpIHtcbiAgICAgIGlmICh0aGlzLmN1cnJlbnRTY2hlbWVOYW1lID09PSBIRF9GSUxURVJfREVGQVVMVF9TQ0hFTUVfTkFNRSkge1xuICAgICAgICB0aGlzLnN3aXRjaFNlbGVjdGVkVXVpZCA9ICcnO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLnN3aXRjaE1vZGFsVmlzaWJsZSA9IHRydWU7XG4gIH1cblxuICBjbG9zZVN3aXRjaE1vZGFsKCkge1xuICAgIHRoaXMuc3dpdGNoTW9kYWxWaXNpYmxlID0gZmFsc2U7XG4gIH1cblxuICBzZWxlY3RTd2l0Y2hJdGVtKGl0ZW06IEhkRmlsdGVyU2NoZW1lKSB7XG4gICAgdGhpcy5zd2l0Y2hTZWxlY3RlZFV1aWQgPSBpdGVtLnV1aWQgPyBpdGVtLnV1aWQgOiAnJztcbiAgfVxuXG4gIGNvbmZpcm1Td2l0Y2goKSB7XG4gICAgY29uc3QgbGlzdCA9IHRoaXMuZ2V0RGlzcGxheVNjaGVtZUxpc3QoKTtcbiAgICBsZXQgdGFyZ2V0OiBIZEZpbHRlclNjaGVtZSA9IG51bGw7XG4gICAgaWYgKHRoaXMuc3dpdGNoU2VsZWN0ZWRVdWlkID09PSAnJyB8fCB0aGlzLnN3aXRjaFNlbGVjdGVkVXVpZCA9PSBudWxsKSB7XG4gICAgICB0YXJnZXQgPSBsaXN0LmZpbmQocyA9PiBzLnRlbXBsYXRlTmFtZSA9PT0gSERfRklMVEVSX0RFRkFVTFRfU0NIRU1FX05BTUUgJiYgIXMudXVpZClcbiAgICAgICAgfHwgbGlzdC5maW5kKHMgPT4gcy50ZW1wbGF0ZU5hbWUgPT09IEhEX0ZJTFRFUl9ERUZBVUxUX1NDSEVNRV9OQU1FKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGFyZ2V0ID0gbGlzdC5maW5kKHMgPT4gcy51dWlkID09PSB0aGlzLnN3aXRjaFNlbGVjdGVkVXVpZCk7XG4gICAgfVxuICAgIGlmICghdGFyZ2V0KSB7XG4gICAgICB0aGlzLnNob3dFcnJvcign6K+36YCJ5oup562b6YCJ5qih54mIJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuYXBwbHlTY2hlbWUodGFyZ2V0LCB0cnVlKTtcbiAgICB0aGlzLnN3aXRjaE1vZGFsVmlzaWJsZSA9IGZhbHNlO1xuICB9XG5cbiAgaXNEZWZhdWx0U2NoZW1lKGl0ZW06IEhkRmlsdGVyU2NoZW1lKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhKGl0ZW0gJiYgaXRlbS50ZW1wbGF0ZU5hbWUgPT09IEhEX0ZJTFRFUl9ERUZBVUxUX1NDSEVNRV9OQU1FKTtcbiAgfVxuXG4gIGNhbkRlbGV0ZUN1cnJlbnQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhKHRoaXMuY3VycmVudFNjaGVtZSAmJiB0aGlzLmN1cnJlbnRTY2hlbWUudXVpZFxuICAgICAgJiYgdGhpcy5jdXJyZW50U2NoZW1lLnRlbXBsYXRlTmFtZSAhPT0gSERfRklMVEVSX0RFRkFVTFRfU0NIRU1FX05BTUUpO1xuICB9XG5cbiAgc2F2ZUN1cnJlbnRTY2hlbWUoKSB7XG4gICAgaWYgKCF0aGlzLmNhblVzZVNjaGVtZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBuYW1lID0gdGhpcy5jdXJyZW50U2NoZW1lTmFtZSB8fCBIRF9GSUxURVJfREVGQVVMVF9TQ0hFTUVfTkFNRTtcbiAgICBjb25zdCBib2R5OiBIZEZpbHRlclNjaGVtZSA9IHtcbiAgICAgIHV1aWQ6IHRoaXMuY3VycmVudFNjaGVtZSAmJiB0aGlzLmN1cnJlbnRTY2hlbWUudXVpZCA/IHRoaXMuY3VycmVudFNjaGVtZS51dWlkIDogbnVsbCxcbiAgICAgIGZpbHRlcktleTogdGhpcy5maWx0ZXJTY2hlbWVLZXksXG4gICAgICB0ZW1wbGF0ZU5hbWU6IG5hbWUsXG4gICAgICBmaWx0ZXJWYWx1ZTogdGhpcy5zZXJpYWxpemVGaWx0ZXJWYWx1ZSgpXG4gICAgfTtcbiAgICB0aGlzLnNjaGVtZVNhdmluZyA9IHRydWU7XG4gICAgaWYgKHRoaXMuc2NoZW1lQWN0aW9uU3ViKSB7XG4gICAgICB0aGlzLnNjaGVtZUFjdGlvblN1Yi51bnN1YnNjcmliZSgpO1xuICAgIH1cbiAgICB0aGlzLnNjaGVtZUFjdGlvblN1YiA9IHRoaXMuc2NoZW1lU3RvcmUuc2F2ZShib2R5KS5zdWJzY3JpYmUoXG4gICAgICAoc2F2ZWQpID0+IHtcbiAgICAgICAgdGhpcy5zY2hlbWVTYXZpbmcgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5zaG93U3VjY2Vzcygn5L+d5a2Y5oiQ5YqfJyk7XG4gICAgICAgIHRoaXMuY3VycmVudFNjaGVtZSA9IHNhdmVkO1xuICAgICAgICB0aGlzLmN1cnJlbnRTY2hlbWVOYW1lID0gc2F2ZWQudGVtcGxhdGVOYW1lO1xuICAgICAgICB0aGlzLnJlZnJlc2hTY2hlbWVMaXN0S2VlcEN1cnJlbnQoKTtcbiAgICAgIH0sXG4gICAgICAoZXJyKSA9PiB7XG4gICAgICAgIHRoaXMuc2NoZW1lU2F2aW5nID0gZmFsc2U7XG4gICAgICAgIHRoaXMuc2hvd0Vycm9yKCfkv53lrZjlpLHotKXvvJonICsgKGVyciB8fCAnJykpO1xuICAgICAgfVxuICAgICk7XG4gIH1cblxuICBvcGVuU2F2ZUFzTW9kYWwoKSB7XG4gICAgdGhpcy5zYXZlQXNOYW1lID0gJyc7XG4gICAgdGhpcy5zYXZlQXNNb2RhbFZpc2libGUgPSB0cnVlO1xuICB9XG5cbiAgY2xvc2VTYXZlQXNNb2RhbCgpIHtcbiAgICB0aGlzLnNhdmVBc01vZGFsVmlzaWJsZSA9IGZhbHNlO1xuICB9XG5cbiAgY29uZmlybVNhdmVBcygpIHtcbiAgICBjb25zdCBuYW1lID0gKHRoaXMuc2F2ZUFzTmFtZSB8fCAnJykudHJpbSgpO1xuICAgIGlmICghbmFtZSkge1xuICAgICAgdGhpcy5zaG93RXJyb3IoJ+ivt+i+k+WFpeaooeeJiOWQjeensCcpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAobmFtZSA9PT0gSERfRklMVEVSX0RFRkFVTFRfU0NIRU1FX05BTUUpIHtcbiAgICAgIHRoaXMuc2hvd0Vycm9yKCfkuI3og73kvb/nlKjjgIzpu5jorqTmnaHku7bjgI3kvZzkuLrmqKHniYjlkI3np7DvvIzor7fkvb/nlKjjgIzkv53lrZjkuLrlvZPliY3jgI3opobnm5bpu5jorqTmnaHku7YnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgZXhpc3RzID0gKHRoaXMuc2NoZW1lTGlzdCB8fCBbXSkuc29tZShzID0+IHMudGVtcGxhdGVOYW1lID09PSBuYW1lKTtcbiAgICBpZiAoZXhpc3RzKSB7XG4gICAgICB0aGlzLnNob3dFcnJvcign5qih54mI5ZCN56ew5bey5a2Y5ZyoJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGJvZHk6IEhkRmlsdGVyU2NoZW1lID0ge1xuICAgICAgZmlsdGVyS2V5OiB0aGlzLmZpbHRlclNjaGVtZUtleSxcbiAgICAgIHRlbXBsYXRlTmFtZTogbmFtZSxcbiAgICAgIGZpbHRlclZhbHVlOiB0aGlzLnNlcmlhbGl6ZUZpbHRlclZhbHVlKClcbiAgICB9O1xuICAgIHRoaXMuc2NoZW1lU2F2aW5nID0gdHJ1ZTtcbiAgICBpZiAodGhpcy5zY2hlbWVBY3Rpb25TdWIpIHtcbiAgICAgIHRoaXMuc2NoZW1lQWN0aW9uU3ViLnVuc3Vic2NyaWJlKCk7XG4gICAgfVxuICAgIHRoaXMuc2NoZW1lQWN0aW9uU3ViID0gdGhpcy5zY2hlbWVTdG9yZS5zYXZlKGJvZHkpLnN1YnNjcmliZShcbiAgICAgIChzYXZlZCkgPT4ge1xuICAgICAgICB0aGlzLnNjaGVtZVNhdmluZyA9IGZhbHNlO1xuICAgICAgICB0aGlzLnNhdmVBc01vZGFsVmlzaWJsZSA9IGZhbHNlO1xuICAgICAgICB0aGlzLnNob3dTdWNjZXNzKCflj6blrZjkuLrmiJDlip8nKTtcbiAgICAgICAgdGhpcy5jdXJyZW50U2NoZW1lID0gc2F2ZWQ7XG4gICAgICAgIHRoaXMuY3VycmVudFNjaGVtZU5hbWUgPSBzYXZlZC50ZW1wbGF0ZU5hbWU7XG4gICAgICAgIHRoaXMucmVmcmVzaFNjaGVtZUxpc3RLZWVwQ3VycmVudCgpO1xuICAgICAgfSxcbiAgICAgIChlcnIpID0+IHtcbiAgICAgICAgdGhpcy5zY2hlbWVTYXZpbmcgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5zaG93RXJyb3IoJ+WPpuWtmOS4uuWksei0pe+8micgKyAoZXJyIHx8ICcnKSk7XG4gICAgICB9XG4gICAgKTtcbiAgfVxuXG4gIGRlbGV0ZUN1cnJlbnRTY2hlbWUoKSB7XG4gICAgaWYgKCF0aGlzLmNhbkRlbGV0ZUN1cnJlbnQoKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCB1dWlkID0gdGhpcy5jdXJyZW50U2NoZW1lLnV1aWQ7XG4gICAgdGhpcy5zY2hlbWVTYXZpbmcgPSB0cnVlO1xuICAgIGlmICh0aGlzLnNjaGVtZUFjdGlvblN1Yikge1xuICAgICAgdGhpcy5zY2hlbWVBY3Rpb25TdWIudW5zdWJzY3JpYmUoKTtcbiAgICB9XG4gICAgdGhpcy5zY2hlbWVBY3Rpb25TdWIgPSB0aGlzLnNjaGVtZVN0b3JlLmRlbGV0ZSh1dWlkKS5zdWJzY3JpYmUoXG4gICAgICAoKSA9PiB7XG4gICAgICAgIHRoaXMuc2NoZW1lU2F2aW5nID0gZmFsc2U7XG4gICAgICAgIHRoaXMuc2hvd1N1Y2Nlc3MoJ+WIoOmZpOaIkOWKnycpO1xuICAgICAgICB0aGlzLnNjaGVtZUxpc3QgPSAodGhpcy5zY2hlbWVMaXN0IHx8IFtdKS5maWx0ZXIocyA9PiBzLnV1aWQgIT09IHV1aWQpO1xuICAgICAgICB0aGlzLmFwcGx5U2NoZW1lQnlOYW1lKEhEX0ZJTFRFUl9ERUZBVUxUX1NDSEVNRV9OQU1FLCB0cnVlKTtcbiAgICAgIH0sXG4gICAgICAoZXJyKSA9PiB7XG4gICAgICAgIHRoaXMuc2NoZW1lU2F2aW5nID0gZmFsc2U7XG4gICAgICAgIHRoaXMuc2hvd0Vycm9yKCfliKDpmaTlpLHotKXvvJonICsgKGVyciB8fCAnJykpO1xuICAgICAgfVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIHJlZnJlc2hTY2hlbWVMaXN0S2VlcEN1cnJlbnQoKSB7XG4gICAgaWYgKCF0aGlzLmNhblVzZVNjaGVtZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnNjaGVtZVN0b3JlLnF1ZXJ5QnlGaWx0ZXJLZXkodGhpcy5maWx0ZXJTY2hlbWVLZXkpLnN1YnNjcmliZShcbiAgICAgIChsaXN0KSA9PiB7XG4gICAgICAgIHRoaXMuc2NoZW1lTGlzdCA9IGxpc3QgfHwgW107XG4gICAgICAgIGlmICh0aGlzLmN1cnJlbnRTY2hlbWUgJiYgdGhpcy5jdXJyZW50U2NoZW1lLnV1aWQpIHtcbiAgICAgICAgICBjb25zdCBmb3VuZCA9IHRoaXMuc2NoZW1lTGlzdC5maW5kKHMgPT4gcy51dWlkID09PSB0aGlzLmN1cnJlbnRTY2hlbWUudXVpZCk7XG4gICAgICAgICAgaWYgKGZvdW5kKSB7XG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRTY2hlbWUgPSBmb3VuZDtcbiAgICAgICAgICAgIHRoaXMuY3VycmVudFNjaGVtZU5hbWUgPSBmb3VuZC50ZW1wbGF0ZU5hbWU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgKCkgPT4geyAvKiBpZ25vcmUgKi8gfVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGFwcGx5U2NoZW1lQnlOYW1lKG5hbWU6IHN0cmluZywgZW1pdFNlYXJjaDogYm9vbGVhbikge1xuICAgIGNvbnN0IGxpc3QgPSB0aGlzLmdldERpc3BsYXlTY2hlbWVMaXN0KCk7XG4gICAgY29uc3QgdGFyZ2V0ID0gbGlzdC5maW5kKHMgPT4gcy50ZW1wbGF0ZU5hbWUgPT09IG5hbWUpO1xuICAgIGlmICh0YXJnZXQpIHtcbiAgICAgIHRoaXMuYXBwbHlTY2hlbWUodGFyZ2V0LCBlbWl0U2VhcmNoKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFwcGx5U2NoZW1lKHNjaGVtZTogSGRGaWx0ZXJTY2hlbWUsIGVtaXRTZWFyY2g6IGJvb2xlYW4pIHtcbiAgICB0aGlzLmN1cnJlbnRTY2hlbWUgPSBzY2hlbWUgJiYgc2NoZW1lLnV1aWQgPyBzY2hlbWUgOiB7XG4gICAgICBmaWx0ZXJLZXk6IHRoaXMuZmlsdGVyU2NoZW1lS2V5LFxuICAgICAgdGVtcGxhdGVOYW1lOiBzY2hlbWUgPyBzY2hlbWUudGVtcGxhdGVOYW1lIDogSERfRklMVEVSX0RFRkFVTFRfU0NIRU1FX05BTUUsXG4gICAgICBmaWx0ZXJWYWx1ZTogc2NoZW1lID8gc2NoZW1lLmZpbHRlclZhbHVlIDogSlNPTi5zdHJpbmdpZnkodGhpcy5kZWZhdWx0RmlsdGVyVmFsdWVzIHx8IHt9KVxuICAgIH07XG4gICAgdGhpcy5jdXJyZW50U2NoZW1lTmFtZSA9IHRoaXMuY3VycmVudFNjaGVtZS50ZW1wbGF0ZU5hbWUgfHwgSERfRklMVEVSX0RFRkFVTFRfU0NIRU1FX05BTUU7XG5cbiAgICBsZXQgdmFsdWVzOiBhbnkgPSB7fTtcbiAgICBpZiAodGhpcy5jdXJyZW50U2NoZW1lTmFtZSA9PT0gSERfRklMVEVSX0RFRkFVTFRfU0NIRU1FX05BTUUgJiYgIShzY2hlbWUgJiYgc2NoZW1lLnV1aWQpKSB7XG4gICAgICB2YWx1ZXMgPSB0aGlzLmNsb25lUGxhaW4odGhpcy5kZWZhdWx0RmlsdGVyVmFsdWVzIHx8IHt9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdHJ5IHtcbiAgICAgICAgdmFsdWVzID0gSlNPTi5wYXJzZShzY2hlbWUuZmlsdGVyVmFsdWUgfHwgJ3t9Jyk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHZhbHVlcyA9IHt9O1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMuY3VycmVudFNjaGVtZU5hbWUgPT09IEhEX0ZJTFRFUl9ERUZBVUxUX1NDSEVNRV9OQU1FKSB7XG4gICAgICAgIC8vIOW6k+S4rem7mOiupOadoeS7tuimhuebluWIneWni+WAvO+8muS7pem7mOiupOWAvOS4uuW6le+8jOWGjeWPoOWKoOW6k+WAvFxuICAgICAgICB2YWx1ZXMgPSBPYmplY3QuYXNzaWduKHt9LCB0aGlzLmRlZmF1bHRGaWx0ZXJWYWx1ZXMgfHwge30sIHZhbHVlcyB8fCB7fSk7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMucGF0Y2hGaWx0ZXJWYWx1ZXModmFsdWVzKTtcbiAgICBpZiAoZW1pdFNlYXJjaCkge1xuICAgICAgdGhpcy5zdWJtaXRGb3JtKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzZXJpYWxpemVGaWx0ZXJWYWx1ZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh0aGlzLmdldEZpbHRlckRhdGEoKSB8fCB7fSk7XG4gIH1cblxuICBwcml2YXRlIHBhdGNoRmlsdGVyVmFsdWVzKHZhbHVlczogeyBba2V5OiBzdHJpbmddOiBhbnkgfSkge1xuICAgIGlmICghdGhpcy52YWxpZGF0ZUZpbHRlckZvcm0gfHwgIXRoaXMuZmlsdGVyTGlzdCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBwYXRjaDogeyBba2V5OiBzdHJpbmddOiBhbnkgfSA9IHt9O1xuICAgIHRoaXMuZmlsdGVyTGlzdC5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgaWYgKHZhbHVlcyAmJiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodmFsdWVzLCBpdGVtLm5hbWUpKSB7XG4gICAgICAgIHBhdGNoW2l0ZW0ubmFtZV0gPSB0aGlzLnJldml2ZUZpbHRlclZhbHVlKGl0ZW0sIHZhbHVlc1tpdGVtLm5hbWVdKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICB0aGlzLnZhbGlkYXRlRmlsdGVyRm9ybS5wYXRjaFZhbHVlKHBhdGNoKTtcbiAgfVxuXG4gIHByaXZhdGUgcmV2aXZlRmlsdGVyVmFsdWUoZmlsdGVyOiBGaWx0ZXIsIHZhbHVlOiBhbnkpOiBhbnkge1xuICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7XG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuICAgIGlmIChmaWx0ZXIudHlwZSA9PT0gRmlsdGVyTGlzdFR5cGUuRGF0ZVJhbmdlKSB7XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlLm1hcCh2ID0+IHRoaXMucGFyc2VEYXRlTGlrZSh2KSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuICAgIGlmIChmaWx0ZXIudHlwZSA9PT0gRmlsdGVyTGlzdFR5cGUuRGF0ZSB8fCBmaWx0ZXIudHlwZSA9PT0gRmlsdGVyTGlzdFR5cGUuTW9udGgpIHtcbiAgICAgIHJldHVybiB0aGlzLnBhcnNlRGF0ZUxpa2UodmFsdWUpO1xuICAgIH1cbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cblxuICBwcml2YXRlIHBhcnNlRGF0ZUxpa2UodmFsdWU6IGFueSk6IGFueSB7XG4gICAgaWYgKHZhbHVlID09IG51bGwgfHwgdmFsdWUgaW5zdGFuY2VvZiBEYXRlKSB7XG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnICYmIC9eXFxkezR9LVxcZHsyfS1cXGR7Mn0vLnRlc3QodmFsdWUpKSB7XG4gICAgICBjb25zdCBkID0gbmV3IERhdGUodmFsdWUpO1xuICAgICAgcmV0dXJuIGlzTmFOKGQuZ2V0VGltZSgpKSA/IHZhbHVlIDogZDtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHtcbiAgICAgIGNvbnN0IGQgPSBuZXcgRGF0ZSh2YWx1ZSk7XG4gICAgICByZXR1cm4gaXNOYU4oZC5nZXRUaW1lKCkpID8gdmFsdWUgOiBkO1xuICAgIH1cbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cblxuICBwcml2YXRlIGNsb25lUGxhaW4ob2JqOiBhbnkpOiBhbnkge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShvYmogPT0gbnVsbCA/IHt9IDogb2JqKSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgcmV0dXJuIHt9O1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc2hvd1N1Y2Nlc3MobXNnOiBzdHJpbmcpIHtcbiAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgKHdpbmRvdyBhcyBhbnkpLmhkTWVzc2FnZVNlcnZpY2UpIHtcbiAgICAgICh3aW5kb3cgYXMgYW55KS5oZE1lc3NhZ2VTZXJ2aWNlLnByb3RvdHlwZS5zdWNjZXNzKG1zZyk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzaG93RXJyb3IobXNnOiBzdHJpbmcpIHtcbiAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgKHdpbmRvdyBhcyBhbnkpLmhkTWVzc2FnZVNlcnZpY2UpIHtcbiAgICAgICh3aW5kb3cgYXMgYW55KS5oZE1lc3NhZ2VTZXJ2aWNlLnByb3RvdHlwZS5lcnJvcihtc2cpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICAgICAgY29uc29sZS5lcnJvcihtc2cpO1xuICAgIH1cbiAgfVxuXG4gIGdldENhc2NhZGVyU2hvd1NlYXJjaCA9IGdldENhc2NhZGVyU2hvd1NlYXJjaDtcbiAgZ2V0Q2FzY2FkZXJNZW51Q2xhc3NOYW1lID0gZ2V0Q2FzY2FkZXJNZW51Q2xhc3NOYW1lO1xuICBnZXRDYXNjYWRlck1lbnVTdHlsZSA9IGdldENhc2NhZGVyTWVudVN0eWxlO1xufVxuIl19