ngx-tethys 15.2.7 → 15.2.8

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.
package/CHANGELOG.md CHANGED
@@ -2,6 +2,25 @@
2
2
 
3
3
  All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines.
4
4
 
5
+ ## [15.2.8](https://github.com/atinc/ngx-tethys/compare/15.2.4...15.2.8) (2023-05-05)
6
+
7
+
8
+ ### Bug Fixes
9
+
10
+ * **date-picker:** compatibility null values at updateHourMinute ([#2633](https://github.com/atinc/ngx-tethys/issues/2633)) ([1207c47](https://github.com/atinc/ngx-tethys/commit/1207c473f98c18d8a30dc4d2e00b002b86aeb246))
11
+ * **layout:** collapse dom appears when the mouse hovers over the sidebar #INFR-5569 ([#2616](https://github.com/atinc/ngx-tethys/issues/2616)) ([e9b925d](https://github.com/atinc/ngx-tethys/commit/e9b925dce96175ac8f2b6eb1a48503391f877fc3)), closes [#INFR-5569](https://github.com/atinc/ngx-tethys/issues/INFR-5569) [#INFR-5569](https://github.com/atinc/ngx-tethys/issues/INFR-5569)
12
+ * **layout:** fix can't operate layout content ([#2635](https://github.com/atinc/ngx-tethys/issues/2635)) ([0c7ce6f](https://github.com/atinc/ngx-tethys/commit/0c7ce6f506db35fec9f523b2b3f5087df8810d64))
13
+ * **tree:** fix the problem of clicking to disable the parent node #INFR-7545 ([#2639](https://github.com/atinc/ngx-tethys/issues/2639)) ([4936aba](https://github.com/atinc/ngx-tethys/commit/4936aba4890c891f5792bf46d6df86802e095e3a)), closes [#INFR-7545](https://github.com/atinc/ngx-tethys/issues/INFR-7545)
14
+
15
+
16
+ ### Features
17
+
18
+ * **cascader:** support search #INFR-7498 ([#2644](https://github.com/atinc/ngx-tethys/issues/2644)) ([f490007](https://github.com/atinc/ngx-tethys/commit/f4900077721f2a95bf8116a93e351f767d637b78)), closes [#INFR-7498](https://github.com/atinc/ngx-tethys/issues/INFR-7498)
19
+ * **color-picker:** support hover trigger #INFR-7525 ([#2642](https://github.com/atinc/ngx-tethys/issues/2642)) ([78b5c7a](https://github.com/atinc/ngx-tethys/commit/78b5c7ac34e5fc897cbdac40579c12aeee25d991)), closes [#INFR-7525](https://github.com/atinc/ngx-tethys/issues/INFR-7525)
20
+ * **color-picker:** support thyPlacement params #INFR-7526 ([#2637](https://github.com/atinc/ngx-tethys/issues/2637)) ([366f742](https://github.com/atinc/ngx-tethys/commit/366f742859fd39c4f61ff04c2715aae96632a05b)), closes [#INFR-7526](https://github.com/atinc/ngx-tethys/issues/INFR-7526)
21
+
22
+
23
+
5
24
  ## [15.2.7](https://github.com/atinc/ngx-tethys/compare/15.2.4...15.2.7) (2023-05-04)
6
25
 
7
26
 
@@ -0,0 +1,21 @@
1
+ import { EventEmitter, OnInit } from '@angular/core';
2
+ import { ThyCascaderSearchOption } from './types';
3
+ import * as i0 from "@angular/core";
4
+ /**
5
+ * @internal
6
+ */
7
+ export declare class ThyCascaderSearchOptionComponent implements OnInit {
8
+ option: ThyCascaderSearchOption;
9
+ multiple: boolean;
10
+ isOnlySelectLeaf: boolean;
11
+ className: string;
12
+ active: boolean;
13
+ toggleClick($event: Event): void;
14
+ toggleSelectChange: EventEmitter<ThyCascaderSearchOption>;
15
+ constructor();
16
+ ngOnInit(): void;
17
+ clickCheckbox(event: Event): void;
18
+ toggleOption(value: boolean): void;
19
+ static ɵfac: i0.ɵɵFactoryDeclaration<ThyCascaderSearchOptionComponent, never>;
20
+ static ɵcmp: i0.ɵɵComponentDeclaration<ThyCascaderSearchOptionComponent, "[thy-cascader-search-option]", never, { "option": "option"; "multiple": "multiple"; "isOnlySelectLeaf": "isOnlySelectLeaf"; "active": "active"; }, { "toggleSelectChange": "toggleSelectChange"; }, never, never, true, never>;
21
+ }
@@ -4,7 +4,7 @@ import { SelectionModel } from '@angular/cdk/collections';
4
4
  import { CdkConnectedOverlay, ConnectedOverlayPositionChange, ConnectionPositionPair, ViewportRuler } from '@angular/cdk/overlay';
5
5
  import { ChangeDetectorRef, ElementRef, EventEmitter, OnDestroy, OnInit, QueryList, TemplateRef } from '@angular/core';
6
6
  import { ControlValueAccessor } from '@angular/forms';
7
- import { ThyCascaderExpandTrigger, ThyCascaderOption, ThyCascaderTriggerType } from './types';
7
+ import { ThyCascaderExpandTrigger, ThyCascaderOption, ThyCascaderSearchOption, ThyCascaderTriggerType } from './types';
8
8
  import * as i0 from "@angular/core";
9
9
  declare const _MixinBase: Constructor<ThyHasTabIndex> & Constructor<ThyCanDisable> & typeof AbstractControlValueAccessor;
10
10
  /**
@@ -118,6 +118,11 @@ export declare class ThyCascaderComponent extends _MixinBase implements ControlV
118
118
  * @private 当多选时是否只能选择叶子项, 暂无实现
119
119
  */
120
120
  thyIsOnlySelectLeaf: boolean;
121
+ /**
122
+ * 是否支持搜索
123
+ * @default false
124
+ */
125
+ thyShowSearch: boolean;
121
126
  /**
122
127
  * 值发生变化时触发,返回选择项的值
123
128
  */
@@ -180,6 +185,9 @@ export declare class ThyCascaderComponent extends _MixinBase implements ControlV
180
185
  private isMultiple;
181
186
  private prevSelectedOptions;
182
187
  menuMinWidth: number;
188
+ private searchText$;
189
+ searchResultList: ThyCascaderSearchOption[];
190
+ isShowSearchPanel: boolean;
183
191
  ngOnInit(): void;
184
192
  private initSelectionModel;
185
193
  private initPosition;
@@ -196,6 +204,7 @@ export declare class ThyCascaderComponent extends _MixinBase implements ControlV
196
204
  getOptionValue(option: ThyCascaderOption): any;
197
205
  isActivatedOption(option: ThyCascaderOption, index: number): boolean;
198
206
  attached(): void;
207
+ private scrollActiveElementIntoView;
199
208
  private findOption;
200
209
  private buildDisplayLabel;
201
210
  isMenuVisible(): boolean;
@@ -217,7 +226,7 @@ export declare class ThyCascaderComponent extends _MixinBase implements ControlV
217
226
  mouseoverOption(option: ThyCascaderOption, index: number, event: Event): void;
218
227
  mouseleaveMenu(event: Event): void;
219
228
  onBlur(event?: FocusEvent): void;
220
- onFocus(event?: Event): void;
229
+ onFocus(event?: FocusEvent): void;
221
230
  closeMenu(): void;
222
231
  setActiveOption(option: ThyCascaderOption, index: number, select: boolean, loadChildren?: boolean): void;
223
232
  private selectOption;
@@ -236,8 +245,13 @@ export declare class ThyCascaderComponent extends _MixinBase implements ControlV
236
245
  private getSubmitValue;
237
246
  constructor(cdr: ChangeDetectorRef, viewPortRuler: ViewportRuler, elementRef: ElementRef);
238
247
  trackByFn(index: number, item: ThyCascaderOption): any;
248
+ searchFilter(searchText: string): void;
249
+ private initSearch;
250
+ private searchInLocal;
251
+ private resetSearch;
252
+ selectSearchResult(selectOptionData: ThyCascaderSearchOption): void;
239
253
  ngOnDestroy(): void;
240
254
  static ɵfac: i0.ɵɵFactoryDeclaration<ThyCascaderComponent, never>;
241
- static ɵcmp: i0.ɵɵComponentDeclaration<ThyCascaderComponent, "thy-cascader,[thy-cascader]", never, { "thyValueProperty": "thyValueProperty"; "thyLabelProperty": "thyLabelProperty"; "thyPlaceholder": "thyPlaceholder"; "thySize": "thySize"; "thyOptions": "thyOptions"; "thyChangeOn": "thyChangeOn"; "thyChangeOnSelect": "thyChangeOnSelect"; "thyShowInput": "thyShowInput"; "thyLabelRender": "thyLabelRender"; "thyLoadData": "thyLoadData"; "thyTriggerAction": "thyTriggerAction"; "thyExpandTriggerAction": "thyExpandTriggerAction"; "thyMenuStyle": "thyMenuStyle"; "thyMenuClassName": "thyMenuClassName"; "thyColumnClassName": "thyColumnClassName"; "thyDisabled": "thyDisabled"; "thyEmptyStateText": "thyEmptyStateText"; "thyMultiple": "thyMultiple"; "thyMaxTagCount": "thyMaxTagCount"; "thyIsOnlySelectLeaf": "thyIsOnlySelectLeaf"; }, { "thyChange": "thyChange"; "thySelectionChange": "thySelectionChange"; "thySelect": "thySelect"; "thyDeselect": "thyDeselect"; "thyClear": "thyClear"; }, never, never, true, never>;
255
+ static ɵcmp: i0.ɵɵComponentDeclaration<ThyCascaderComponent, "thy-cascader,[thy-cascader]", never, { "thyValueProperty": "thyValueProperty"; "thyLabelProperty": "thyLabelProperty"; "thyPlaceholder": "thyPlaceholder"; "thySize": "thySize"; "thyOptions": "thyOptions"; "thyChangeOn": "thyChangeOn"; "thyChangeOnSelect": "thyChangeOnSelect"; "thyShowInput": "thyShowInput"; "thyLabelRender": "thyLabelRender"; "thyLoadData": "thyLoadData"; "thyTriggerAction": "thyTriggerAction"; "thyExpandTriggerAction": "thyExpandTriggerAction"; "thyMenuStyle": "thyMenuStyle"; "thyMenuClassName": "thyMenuClassName"; "thyColumnClassName": "thyColumnClassName"; "thyDisabled": "thyDisabled"; "thyEmptyStateText": "thyEmptyStateText"; "thyMultiple": "thyMultiple"; "thyMaxTagCount": "thyMaxTagCount"; "thyIsOnlySelectLeaf": "thyIsOnlySelectLeaf"; "thyShowSearch": "thyShowSearch"; }, { "thyChange": "thyChange"; "thySelectionChange": "thySelectionChange"; "thySelect": "thySelect"; "thyDeselect": "thyDeselect"; "thyClear": "thyClear"; }, never, never, true, never>;
242
256
  }
243
257
  export {};
@@ -10,8 +10,9 @@ import * as i8 from "ngx-tethys/checkbox";
10
10
  import * as i9 from "ngx-tethys/flexible-text";
11
11
  import * as i10 from "./cascader.component";
12
12
  import * as i11 from "./cascader-li.component";
13
+ import * as i12 from "./cascader-search-option.component";
13
14
  export declare class ThyCascaderModule {
14
15
  static ɵfac: i0.ɵɵFactoryDeclaration<ThyCascaderModule, never>;
15
- static ɵmod: i0.ɵɵNgModuleDeclaration<ThyCascaderModule, never, [typeof i1.CommonModule, typeof i2.FormsModule, typeof i3.OverlayModule, typeof i4.ThyInputModule, typeof i5.ThyIconModule, typeof i6.ThyEmptyModule, typeof i7.ThySelectCommonModule, typeof i8.ThyCheckboxModule, typeof i9.ThyFlexibleTextModule, typeof i10.ThyCascaderComponent, typeof i11.ThyCascaderOptionComponent], [typeof i10.ThyCascaderComponent]>;
16
+ static ɵmod: i0.ɵɵNgModuleDeclaration<ThyCascaderModule, never, [typeof i1.CommonModule, typeof i2.FormsModule, typeof i3.OverlayModule, typeof i4.ThyInputModule, typeof i5.ThyIconModule, typeof i6.ThyEmptyModule, typeof i7.ThySelectCommonModule, typeof i8.ThyCheckboxModule, typeof i9.ThyFlexibleTextModule, typeof i10.ThyCascaderComponent, typeof i11.ThyCascaderOptionComponent, typeof i12.ThyCascaderSearchOptionComponent], [typeof i10.ThyCascaderComponent]>;
16
17
  static ɵinj: i0.ɵɵInjectorDeclaration<ThyCascaderModule>;
17
18
  }
@@ -1,4 +1,4 @@
1
- @use "../../styles/variables";
1
+ @use '../../styles/variables';
2
2
 
3
3
  .thy-cascader {
4
4
  outline: none;
@@ -116,4 +116,20 @@
116
116
  color: #e6f7ff;
117
117
  }
118
118
  }
119
+ &-search-list {
120
+ height: 180px;
121
+ overflow: auto;
122
+ min-width: 122px;
123
+ }
124
+
125
+ &-search-list-item {
126
+ height: 36px;
127
+ &:hover {
128
+ background-color: variables.$action-menu-item-hover-bg;
129
+ }
130
+ &.active:not(.multiple) {
131
+ background: rgba(variables.$primary, 0.1);
132
+ color: variables.$primary;
133
+ }
134
+ }
119
135
  }
@@ -1,3 +1,4 @@
1
+ import { Id } from 'ngx-tethys/types';
1
2
  export interface ThyCascaderOption {
2
3
  value?: any;
3
4
  label?: string;
@@ -11,3 +12,9 @@ export interface ThyCascaderOption {
11
12
  }
12
13
  export type ThyCascaderTriggerType = 'click' | 'hover';
13
14
  export type ThyCascaderExpandTrigger = 'click' | 'hover';
15
+ export interface ThyCascaderSearchOption {
16
+ labelList: string[];
17
+ valueList: Id[];
18
+ selected: boolean;
19
+ thyRowValue: ThyCascaderOption[];
20
+ }
@@ -0,0 +1,90 @@
1
+ import { __decorate, __metadata } from "tslib";
2
+ import { NgFor, NgIf } from '@angular/common';
3
+ import { ChangeDetectionStrategy, Component, EventEmitter, HostBinding, HostListener, Input, Output, ViewEncapsulation } from '@angular/core';
4
+ import { FormsModule } from '@angular/forms';
5
+ import { ThyBreadcrumbComponent, ThyBreadcrumbItemComponent } from 'ngx-tethys/breadcrumb';
6
+ import { ThyCheckboxComponent } from 'ngx-tethys/checkbox';
7
+ import { InputBoolean } from 'ngx-tethys/core';
8
+ import { ThyFlexibleTextComponent } from 'ngx-tethys/flexible-text';
9
+ import { ThyIconComponent } from 'ngx-tethys/icon';
10
+ import * as i0 from "@angular/core";
11
+ import * as i1 from "@angular/forms";
12
+ /**
13
+ * @internal
14
+ */
15
+ export class ThyCascaderSearchOptionComponent {
16
+ toggleClick($event) {
17
+ if (this.multiple) {
18
+ return;
19
+ }
20
+ this.toggleSelectChange.emit(this.option);
21
+ }
22
+ constructor() {
23
+ this.multiple = false;
24
+ this.isOnlySelectLeaf = true;
25
+ this.className = 'thy-cascader-search-list-item px-4 d-flex align-items-center cursor-pointer';
26
+ this.active = false;
27
+ this.toggleSelectChange = new EventEmitter();
28
+ }
29
+ ngOnInit() { }
30
+ clickCheckbox(event) {
31
+ // 已选中的在搜索情况下不能取消选择
32
+ if (this.active) {
33
+ event.preventDefault();
34
+ event.stopPropagation();
35
+ }
36
+ }
37
+ toggleOption(value) {
38
+ this.toggleSelectChange.emit(this.option);
39
+ }
40
+ }
41
+ ThyCascaderSearchOptionComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ThyCascaderSearchOptionComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
42
+ ThyCascaderSearchOptionComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.2", type: ThyCascaderSearchOptionComponent, isStandalone: true, selector: "[thy-cascader-search-option]", inputs: { option: "option", multiple: "multiple", isOnlySelectLeaf: "isOnlySelectLeaf", active: "active" }, outputs: { toggleSelectChange: "toggleSelectChange" }, host: { listeners: { "click": "toggleClick($event)" }, properties: { "class.multiple": "this.multiple", "class": "this.className", "class.active": "this.active" } }, ngImport: i0, template: "<label\n *ngIf=\"multiple\"\n class=\"mr-1\"\n thyCheckbox\n [disabled]=\"option.thyRowValue[option.thyRowValue.length - 1].disabled\"\n [ngModel]=\"active\"\n (click)=\"clickCheckbox($event)\"\n (ngModelChange)=\"toggleOption($event)\"\n [thyLabelText]=\"''\"></label>\n\n<thy-breadcrumb thySeparator=\"slash\">\n <ng-container *ngFor=\"let label of option.labelList; index as i\">\n <ng-container *ngIf=\"option.thyRowValue[i].isLeaf && isOnlySelectLeaf; else notLeafOptionTpl\">\n <thy-breadcrumb-item\n ><span>{{ label }}</span></thy-breadcrumb-item\n >\n </ng-container>\n <ng-template #notLeafOptionTpl>\n <thy-breadcrumb-item class=\"text-muted\"\n ><span>{{ label }}</span></thy-breadcrumb-item\n >\n </ng-template>\n </ng-container>\n</thy-breadcrumb>\n", dependencies: [{ kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: NgFor, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "component", type: ThyCheckboxComponent, selector: "thy-checkbox,[thy-checkbox],[thyCheckbox]", inputs: ["thyIndeterminate"] }, { kind: "component", type: ThyBreadcrumbComponent, selector: "thy-breadcrumb", inputs: ["thyIcon", "thySeparator"], exportAs: ["ThyBreadcrumb"] }, { kind: "component", type: ThyBreadcrumbItemComponent, selector: "thy-breadcrumb-item,[thyBreadcrumbItem]", exportAs: ["ThyBreadcrumbItem"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
43
+ __decorate([
44
+ InputBoolean(),
45
+ __metadata("design:type", Object)
46
+ ], ThyCascaderSearchOptionComponent.prototype, "multiple", void 0);
47
+ __decorate([
48
+ InputBoolean(),
49
+ __metadata("design:type", Object)
50
+ ], ThyCascaderSearchOptionComponent.prototype, "isOnlySelectLeaf", void 0);
51
+ __decorate([
52
+ InputBoolean(),
53
+ __metadata("design:type", Boolean)
54
+ ], ThyCascaderSearchOptionComponent.prototype, "active", void 0);
55
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ThyCascaderSearchOptionComponent, decorators: [{
56
+ type: Component,
57
+ args: [{ changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, selector: '[thy-cascader-search-option]', standalone: true, imports: [
58
+ NgIf,
59
+ NgFor,
60
+ ThyFlexibleTextComponent,
61
+ ThyCheckboxComponent,
62
+ ThyBreadcrumbComponent,
63
+ ThyBreadcrumbItemComponent,
64
+ ThyIconComponent,
65
+ FormsModule
66
+ ], template: "<label\n *ngIf=\"multiple\"\n class=\"mr-1\"\n thyCheckbox\n [disabled]=\"option.thyRowValue[option.thyRowValue.length - 1].disabled\"\n [ngModel]=\"active\"\n (click)=\"clickCheckbox($event)\"\n (ngModelChange)=\"toggleOption($event)\"\n [thyLabelText]=\"''\"></label>\n\n<thy-breadcrumb thySeparator=\"slash\">\n <ng-container *ngFor=\"let label of option.labelList; index as i\">\n <ng-container *ngIf=\"option.thyRowValue[i].isLeaf && isOnlySelectLeaf; else notLeafOptionTpl\">\n <thy-breadcrumb-item\n ><span>{{ label }}</span></thy-breadcrumb-item\n >\n </ng-container>\n <ng-template #notLeafOptionTpl>\n <thy-breadcrumb-item class=\"text-muted\"\n ><span>{{ label }}</span></thy-breadcrumb-item\n >\n </ng-template>\n </ng-container>\n</thy-breadcrumb>\n" }]
67
+ }], ctorParameters: function () { return []; }, propDecorators: { option: [{
68
+ type: Input
69
+ }], multiple: [{
70
+ type: HostBinding,
71
+ args: ['class.multiple']
72
+ }, {
73
+ type: Input
74
+ }], isOnlySelectLeaf: [{
75
+ type: Input
76
+ }], className: [{
77
+ type: HostBinding,
78
+ args: ['class']
79
+ }], active: [{
80
+ type: HostBinding,
81
+ args: ['class.active']
82
+ }, {
83
+ type: Input
84
+ }], toggleClick: [{
85
+ type: HostListener,
86
+ args: ['click', ['$event']]
87
+ }], toggleSelectChange: [{
88
+ type: Output
89
+ }] } });
90
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FzY2FkZXItc2VhcmNoLW9wdGlvbi5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvY2FzY2FkZXIvY2FzY2FkZXItc2VhcmNoLW9wdGlvbi5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9zcmMvY2FzY2FkZXIvY2FzY2FkZXItc2VhcmNoLW9wdGlvbi5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUM5QyxPQUFPLEVBQ0gsdUJBQXVCLEVBQ3ZCLFNBQVMsRUFDVCxZQUFZLEVBQ1osV0FBVyxFQUNYLFlBQVksRUFDWixLQUFLLEVBRUwsTUFBTSxFQUNOLGlCQUFpQixFQUNwQixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDN0MsT0FBTyxFQUFFLHNCQUFzQixFQUFFLDBCQUEwQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDM0YsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDM0QsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ3BFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGlCQUFpQixDQUFDOzs7QUFHbkQ7O0dBRUc7QUFtQkgsTUFBTSxPQUFPLGdDQUFnQztJQW1CbEMsV0FBVyxDQUFDLE1BQWE7UUFDNUIsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFO1lBQ2YsT0FBTztTQUNWO1FBQ0QsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDOUMsQ0FBQztJQUlEO1FBdEJBLGFBQVEsR0FBRyxLQUFLLENBQUM7UUFJakIscUJBQWdCLEdBQUcsSUFBSSxDQUFDO1FBQ0YsY0FBUyxHQUFHLDZFQUE2RSxDQUFDO1FBS2hILFdBQU0sR0FBWSxLQUFLLENBQUM7UUFVZCx1QkFBa0IsR0FBMEMsSUFBSSxZQUFZLEVBQUUsQ0FBQztJQUUxRSxDQUFDO0lBRWhCLFFBQVEsS0FBSSxDQUFDO0lBRU4sYUFBYSxDQUFDLEtBQVk7UUFDN0IsbUJBQW1CO1FBQ25CLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRTtZQUNiLEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUN2QixLQUFLLENBQUMsZUFBZSxFQUFFLENBQUM7U0FDM0I7SUFDTCxDQUFDO0lBRU0sWUFBWSxDQUFDLEtBQWM7UUFDOUIsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDOUMsQ0FBQzs7NkhBMUNRLGdDQUFnQztpSEFBaEMsZ0NBQWdDLGlhQ3pDN0Msb3pCQXdCQSw0Q0RPUSxJQUFJLDZGQUNKLEtBQUssbUhBRUwsb0JBQW9CLG9IQUNwQixzQkFBc0IsNkhBQ3RCLDBCQUEwQixvSEFFMUIsV0FBVztBQU1mO0lBRUMsWUFBWSxFQUFFOztrRUFDRTtBQUVqQjtJQUNDLFlBQVksRUFBRTs7MEVBQ1M7QUFHeEI7SUFFQyxZQUFZLEVBQUU7O2dFQUNTOzJGQWhCZixnQ0FBZ0M7a0JBbEI1QyxTQUFTO3NDQUNXLHVCQUF1QixDQUFDLE1BQU0saUJBQ2hDLGlCQUFpQixDQUFDLElBQUksWUFFM0IsOEJBQThCLGNBRTVCLElBQUksV0FDUDt3QkFDTCxJQUFJO3dCQUNKLEtBQUs7d0JBQ0wsd0JBQXdCO3dCQUN4QixvQkFBb0I7d0JBQ3BCLHNCQUFzQjt3QkFDdEIsMEJBQTBCO3dCQUMxQixnQkFBZ0I7d0JBQ2hCLFdBQVc7cUJBQ2Q7MEVBR1EsTUFBTTtzQkFBZCxLQUFLO2dCQUtOLFFBQVE7c0JBSFAsV0FBVzt1QkFBQyxnQkFBZ0I7O3NCQUM1QixLQUFLO2dCQU1OLGdCQUFnQjtzQkFGZixLQUFLO2dCQUdnQixTQUFTO3NCQUE5QixXQUFXO3VCQUFDLE9BQU87Z0JBS3BCLE1BQU07c0JBSEwsV0FBVzt1QkFBQyxjQUFjOztzQkFDMUIsS0FBSztnQkFLQyxXQUFXO3NCQURqQixZQUFZO3VCQUFDLE9BQU8sRUFBRSxDQUFDLFFBQVEsQ0FBQztnQkFRdkIsa0JBQWtCO3NCQUEzQixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTmdGb3IsIE5nSWYgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHtcbiAgICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgICBDb21wb25lbnQsXG4gICAgRXZlbnRFbWl0dGVyLFxuICAgIEhvc3RCaW5kaW5nLFxuICAgIEhvc3RMaXN0ZW5lcixcbiAgICBJbnB1dCxcbiAgICBPbkluaXQsXG4gICAgT3V0cHV0LFxuICAgIFZpZXdFbmNhcHN1bGF0aW9uXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRm9ybXNNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBUaHlCcmVhZGNydW1iQ29tcG9uZW50LCBUaHlCcmVhZGNydW1iSXRlbUNvbXBvbmVudCB9IGZyb20gJ25neC10ZXRoeXMvYnJlYWRjcnVtYic7XG5pbXBvcnQgeyBUaHlDaGVja2JveENvbXBvbmVudCB9IGZyb20gJ25neC10ZXRoeXMvY2hlY2tib3gnO1xuaW1wb3J0IHsgSW5wdXRCb29sZWFuIH0gZnJvbSAnbmd4LXRldGh5cy9jb3JlJztcbmltcG9ydCB7IFRoeUZsZXhpYmxlVGV4dENvbXBvbmVudCB9IGZyb20gJ25neC10ZXRoeXMvZmxleGlibGUtdGV4dCc7XG5pbXBvcnQgeyBUaHlJY29uQ29tcG9uZW50IH0gZnJvbSAnbmd4LXRldGh5cy9pY29uJztcbmltcG9ydCB7IFRoeUNhc2NhZGVyU2VhcmNoT3B0aW9uIH0gZnJvbSAnLi90eXBlcyc7XG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbkBDb21wb25lbnQoe1xuICAgIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICAgIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBhbmd1bGFyLWVzbGludC9jb21wb25lbnQtc2VsZWN0b3JcbiAgICBzZWxlY3RvcjogJ1t0aHktY2FzY2FkZXItc2VhcmNoLW9wdGlvbl0nLFxuICAgIHRlbXBsYXRlVXJsOiAnLi9jYXNjYWRlci1zZWFyY2gtb3B0aW9uLmNvbXBvbmVudC5odG1sJyxcbiAgICBzdGFuZGFsb25lOiB0cnVlLFxuICAgIGltcG9ydHM6IFtcbiAgICAgICAgTmdJZixcbiAgICAgICAgTmdGb3IsXG4gICAgICAgIFRoeUZsZXhpYmxlVGV4dENvbXBvbmVudCxcbiAgICAgICAgVGh5Q2hlY2tib3hDb21wb25lbnQsXG4gICAgICAgIFRoeUJyZWFkY3J1bWJDb21wb25lbnQsXG4gICAgICAgIFRoeUJyZWFkY3J1bWJJdGVtQ29tcG9uZW50LFxuICAgICAgICBUaHlJY29uQ29tcG9uZW50LFxuICAgICAgICBGb3Jtc01vZHVsZVxuICAgIF1cbn0pXG5leHBvcnQgY2xhc3MgVGh5Q2FzY2FkZXJTZWFyY2hPcHRpb25Db21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuICAgIEBJbnB1dCgpIG9wdGlvbjogVGh5Q2FzY2FkZXJTZWFyY2hPcHRpb247XG5cbiAgICBASG9zdEJpbmRpbmcoJ2NsYXNzLm11bHRpcGxlJylcbiAgICBASW5wdXQoKVxuICAgIEBJbnB1dEJvb2xlYW4oKVxuICAgIG11bHRpcGxlID0gZmFsc2U7XG5cbiAgICBASW5wdXQoKVxuICAgIEBJbnB1dEJvb2xlYW4oKVxuICAgIGlzT25seVNlbGVjdExlYWYgPSB0cnVlO1xuICAgIEBIb3N0QmluZGluZygnY2xhc3MnKSBjbGFzc05hbWUgPSAndGh5LWNhc2NhZGVyLXNlYXJjaC1saXN0LWl0ZW0gcHgtNCBkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGN1cnNvci1wb2ludGVyJztcblxuICAgIEBIb3N0QmluZGluZygnY2xhc3MuYWN0aXZlJylcbiAgICBASW5wdXQoKVxuICAgIEBJbnB1dEJvb2xlYW4oKVxuICAgIGFjdGl2ZTogYm9vbGVhbiA9IGZhbHNlO1xuXG4gICAgQEhvc3RMaXN0ZW5lcignY2xpY2snLCBbJyRldmVudCddKVxuICAgIHB1YmxpYyB0b2dnbGVDbGljaygkZXZlbnQ6IEV2ZW50KSB7XG4gICAgICAgIGlmICh0aGlzLm11bHRpcGxlKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy50b2dnbGVTZWxlY3RDaGFuZ2UuZW1pdCh0aGlzLm9wdGlvbik7XG4gICAgfVxuXG4gICAgQE91dHB1dCgpIHRvZ2dsZVNlbGVjdENoYW5nZTogRXZlbnRFbWl0dGVyPFRoeUNhc2NhZGVyU2VhcmNoT3B0aW9uPiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICAgIGNvbnN0cnVjdG9yKCkge31cblxuICAgIG5nT25Jbml0KCkge31cblxuICAgIHB1YmxpYyBjbGlja0NoZWNrYm94KGV2ZW50OiBFdmVudCkge1xuICAgICAgICAvLyDlt7LpgInkuK3nmoTlnKjmkJzntKLmg4XlhrXkuIvkuI3og73lj5bmtojpgInmi6lcbiAgICAgICAgaWYgKHRoaXMuYWN0aXZlKSB7XG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgdG9nZ2xlT3B0aW9uKHZhbHVlOiBib29sZWFuKSB7XG4gICAgICAgIHRoaXMudG9nZ2xlU2VsZWN0Q2hhbmdlLmVtaXQodGhpcy5vcHRpb24pO1xuICAgIH1cbn1cbiIsIjxsYWJlbFxuICAqbmdJZj1cIm11bHRpcGxlXCJcbiAgY2xhc3M9XCJtci0xXCJcbiAgdGh5Q2hlY2tib3hcbiAgW2Rpc2FibGVkXT1cIm9wdGlvbi50aHlSb3dWYWx1ZVtvcHRpb24udGh5Um93VmFsdWUubGVuZ3RoIC0gMV0uZGlzYWJsZWRcIlxuICBbbmdNb2RlbF09XCJhY3RpdmVcIlxuICAoY2xpY2spPVwiY2xpY2tDaGVja2JveCgkZXZlbnQpXCJcbiAgKG5nTW9kZWxDaGFuZ2UpPVwidG9nZ2xlT3B0aW9uKCRldmVudClcIlxuICBbdGh5TGFiZWxUZXh0XT1cIicnXCI+PC9sYWJlbD5cblxuPHRoeS1icmVhZGNydW1iIHRoeVNlcGFyYXRvcj1cInNsYXNoXCI+XG4gIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGxhYmVsIG9mIG9wdGlvbi5sYWJlbExpc3Q7IGluZGV4IGFzIGlcIj5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwib3B0aW9uLnRoeVJvd1ZhbHVlW2ldLmlzTGVhZiAmJiBpc09ubHlTZWxlY3RMZWFmOyBlbHNlIG5vdExlYWZPcHRpb25UcGxcIj5cbiAgICAgIDx0aHktYnJlYWRjcnVtYi1pdGVtXG4gICAgICAgID48c3Bhbj57eyBsYWJlbCB9fTwvc3Bhbj48L3RoeS1icmVhZGNydW1iLWl0ZW1cbiAgICAgID5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8bmctdGVtcGxhdGUgI25vdExlYWZPcHRpb25UcGw+XG4gICAgICA8dGh5LWJyZWFkY3J1bWItaXRlbSBjbGFzcz1cInRleHQtbXV0ZWRcIlxuICAgICAgICA+PHNwYW4+e3sgbGFiZWwgfX08L3NwYW4+PC90aHktYnJlYWRjcnVtYi1pdGVtXG4gICAgICA+XG4gICAgPC9uZy10ZW1wbGF0ZT5cbiAgPC9uZy1jb250YWluZXI+XG48L3RoeS1icmVhZGNydW1iPlxuIl19