@libs-ui/components-checkbox-group 0.2.355-9 → 0.2.356-1

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/README.md CHANGED
@@ -1,3 +1,125 @@
1
- # checkbox-group
1
+ # @libs-ui/components-checkbox-group
2
2
 
3
- This library was generated with [Nx](https://nx.dev).
3
+ > Component quản nhóm các checkbox với tính năng validation và cấu hình layout linh hoạt cho Angular.
4
+
5
+ ## Giới thiệu
6
+
7
+ `LibsUiComponentsCheckboxGroupComponent` là một standalone component cho phép hiển thị và quản lý một tập hợp các checkbox. Nó kế thừa đầy đủ sức mạnh của `CheckboxSingleComponent` cho mỗi item trong nhóm và bổ sung các tính năng quản lý tập trung:
8
+
9
+ - ✅ Quản lý trạng thái chọn hàng loạt thông qua `model`.
10
+ - ✅ Hỗ trợ validation bắt buộc chọn (Required selection).
11
+ - ✅ Cấu hình giao diện hàng ngang hoặc hàng dọc.
12
+ - ✅ Tích hợp nhanh với danh sách keys để set trạng thái chọn/vô hiệu hóa.
13
+ - ✅ Hỗ trợ nội dung bổ sung (subText/subTemplate) cho mỗi item.
14
+
15
+ ## Cài đặt
16
+
17
+ ```bash
18
+ # npm
19
+ npm install @libs-ui/components-checkbox-group
20
+
21
+ # yarn
22
+ yarn add @libs-ui/components-checkbox-group
23
+ ```
24
+
25
+ ## Sử dụng
26
+
27
+ ### Import Component
28
+
29
+ ```typescript
30
+ import { Component, signal } from '@angular/core';
31
+ import { LibsUiComponentsCheckboxGroupComponent, ICheckboxGroupItem } from '@libs-ui/components-checkbox-group';
32
+
33
+ @Component({
34
+ selector: 'app-example',
35
+ standalone: true,
36
+ imports: [LibsUiComponentsCheckboxGroupComponent],
37
+ template: `
38
+ <libs_ui-components-checkbox-group
39
+ [(groups)]="options"
40
+ [labelConfig]="{ label: 'Chọn sở thích' }"></libs_ui-components-checkbox-group>
41
+ `,
42
+ })
43
+ export class ExampleComponent {
44
+ options = signal<ICheckboxGroupItem[]>([{ item: { key: 'music', label: 'Âm nhạc' } }, { item: { key: 'sport', label: 'Thể thao' } }, { item: { key: 'reading', label: 'Đọc sách' } }]);
45
+ }
46
+ ```
47
+
48
+ ## API Reference
49
+
50
+ ### Inputs
51
+
52
+ | Tên | Kiểu | Mặc định | Mô tả |
53
+ | ------------------------------ | ----------------------------- | ------------- | -------------------------------------------------------------- |
54
+ | `classGroupWhenModeHorizontal` | `string` | `'flex'` | Class CSS cho wrapper khi ở chế độ chiều ngang. |
55
+ | `classInclude` | `string` | `undefined` | Class CSS bổ sung cho container chính. |
56
+ | `classItemWhenModeHorizontal` | `string` | `'mr-[24px]'` | Class CSS cho mỗi item khi ở chế độ chiều ngang. |
57
+ | `classLabelInclude` | `string` | `undefined` | Class CSS cho nhãn tổng quát của nhóm. |
58
+ | `clickExactly` | `boolean` | `true` | Nếu `true`, chỉ click vào checkbox/label mới đổi trạng thái. |
59
+ | `disable` | `boolean` | `false` | Vô hiệu hóa tương tác cho toàn bộ nhóm. |
60
+ | `fieldKey` | `string` | `'key'` | Tên thuộc tính dùng làm khóa định danh cho item dữ liệu. |
61
+ | `groups` | `model<ICheckboxGroupItem[]>` | _required_ | Danh sách các item trong nhóm (hỗ trợ two-way binding). |
62
+ | `horizontal` | `boolean` | `false` | Nếu `true`, hiển thị các item theo hàng ngang. |
63
+ | `keysChecked` | `string[]` | `undefined` | Danh sách keys của các item cần được chọn sẵn. |
64
+ | `keysDisable` | `string[]` | `undefined` | Danh sách keys của các item cần được vô hiệu hóa. |
65
+ | `labelConfig` | `ILabel` | `undefined` | Cấu hình cho component Label hiển thị trên cùng của nhóm. |
66
+ | `modeBorder` | `boolean` | `false` | Hiển thị viền bao quanh component. |
67
+ | `showValidateBottom` | `boolean` | `false` | Hiển thị thông báo lỗi validation ở dưới cùng. |
68
+ | `validRequired` | `ICheckboxGroupValidRequired` | `undefined` | Cấu hình validation bắt buộc người dùng chọn ít nhất một item. |
69
+
70
+ ### Outputs
71
+
72
+ | Tên | Kiểu | Mô tả |
73
+ | --------------------- | ------------------------------------ | ---------------------------------------------------------------------------- |
74
+ | `outChange` | `ICheckboxEvent` | Phát ra khi bất kỳ checkbox nào trong nhóm thay đổi trạng thái. |
75
+ | `outFunctionsControl` | `ICheckboxGroupFunctionControlEvent` | Cung cấp các hàm điều khiển (API) như `checkIsValid`, `reset`, `resetError`. |
76
+
77
+ ## Interfaces & Types
78
+
79
+ ### ICheckboxGroupItem
80
+
81
+ ```typescript
82
+ interface ICheckboxGroupItem {
83
+ item: ICheckboxItem; // Cấu hình checkbox (xem CheckboxSingle)
84
+ subText?: string; // Văn bản bổ sung
85
+ subTemplate?: TemplateRef; // Template tùy chỉnh bổ sung
86
+ disableByKeys?: boolean; // Trạng thái disable tự động theo keysDisable
87
+ }
88
+ ```
89
+
90
+ ### ICheckboxGroupFunctionControlEvent
91
+
92
+ ```typescript
93
+ interface ICheckboxGroupFunctionControlEvent {
94
+ checkIsValid: () => Promise<boolean>; // Kiểm tra tính hợp lệ (validation)
95
+ resetError: () => Promise<void>; // Xóa hiển thị lỗi
96
+ reset: () => Promise<void>; // Reset toàn bộ về trạng thái chưa chọn
97
+ }
98
+ ```
99
+
100
+ ## Công nghệ sử dụng
101
+
102
+ - **Angular 18+** - Standalone Components
103
+ - **Angular Signals & Model** - Modern reactive state management
104
+ - **NG-Zorro Style Integration**
105
+
106
+ ## Demo
107
+
108
+ Demo có sẵn trong ứng dụng `core-ui`:
109
+
110
+ ```bash
111
+ npx nx serve core-ui
112
+ ```
113
+
114
+ **File demo:** `apps/core-ui/src/app/components/checkbox-group/checkbox-group.component.ts`
115
+
116
+ ### Tính năng Demo
117
+
118
+ - 🎮 **Basic Group**: Sử dụng cơ bản với danh sách dọc.
119
+ - ↔️ **Horizontal Layout**: Hiển thị items theo hàng ngang.
120
+ - ⚠️ **Validation**: Demo tính năng bắt buộc chọn với thông báo lỗi.
121
+ - 🛠️ **External Control**: Điều khiển nhóm checkbox bằng API (Reset, Validate).
122
+
123
+ ## License
124
+
125
+ MIT
@@ -5,25 +5,64 @@ import { TYPE_POPOVER_EVENT } from '@libs-ui/components-popover';
5
5
  import { ICheckboxGroupFunctionControlEvent } from './interfaces/function-control.interface';
6
6
  import { ICheckboxGroupItem, ICheckboxGroupValidRequired, ICheckboxItem } from './interfaces/group.interface';
7
7
  import * as i0 from "@angular/core";
8
+ /**
9
+ * Checkbox Group Component - Một tập hợp các checkbox đơn lẻ trong một nhóm.
10
+ *
11
+ * @description
12
+ * Hỗ trợ quản lý danh sách các checkbox, xử lý trạng thái chọn hàng loạt,
13
+ * cấu hình layout (ngang/dọc), và tích hợp validation bắt buộc chọn.
14
+ *
15
+ * @example
16
+ * ```html
17
+ * <libs_ui-components-checkbox-group
18
+ * [(groups)]="options"
19
+ * [labelConfig]="{ label: 'Chọn kỹ năng' }"
20
+ * (outChange)="onSelectionChange($event)"
21
+ * />
22
+ * ```
23
+ *
24
+ * @publicApi
25
+ */
8
26
  export declare class LibsUiComponentsCheckboxGroupComponent implements OnInit {
9
27
  protected readonly ERROR_MESSAGE_EMPTY_VALID = "i18n_valid_empty_message";
28
+ /** Signal điều khiển trạng thái hiển thị lỗi validation */
10
29
  protected error: import("@angular/core").WritableSignal<boolean>;
30
+ /**
31
+ * Danh sách các item trong nhóm checkbox.
32
+ * Model hỗ trợ two-way binding để cập nhật trạng thái checked của các item.
33
+ */
11
34
  readonly groups: import("@angular/core").ModelSignal<ICheckboxGroupItem[]>;
35
+ /** Tên trường đóng vai trò là khóa định danh trong item dữ liệu (mặc định: 'key') */
12
36
  readonly fieldKey: import("@angular/core").InputSignalWithTransform<string, string>;
37
+ /** Danh sách các keys cần được set trạng thái checked khi khởi tạo hoặc thay đổi */
13
38
  readonly keysChecked: import("@angular/core").InputSignal<string[] | undefined>;
39
+ /** Danh sách các keys cần được set trạng thái disable */
14
40
  readonly keysDisable: import("@angular/core").InputSignal<string[] | undefined>;
41
+ /** Trạng thái vô hiệu hóa toàn bộ nhóm checkbox */
15
42
  readonly disable: import("@angular/core").InputSignalWithTransform<boolean | undefined, boolean | undefined>;
43
+ /** Nếu true, chỉ click vào checkbox/label mới đổi trạng thái. Nếu false, click vào vùng bao quanh item sẽ trigger */
16
44
  readonly clickExactly: import("@angular/core").InputSignalWithTransform<boolean | undefined, boolean | undefined>;
45
+ /** Hiển thị các checkbox theo hàng ngang (mặc định: dọc) */
17
46
  readonly horizontal: import("@angular/core").InputSignalWithTransform<boolean | undefined, boolean | undefined>;
47
+ /** Cấu hình nhãn (Label) tổng quát cho toàn bộ nhóm */
18
48
  readonly labelConfig: import("@angular/core").InputSignal<ILabel | undefined>;
49
+ /** Cấu hình validation bắt buộc người dùng phải chọn ít nhất một item */
19
50
  readonly validRequired: import("@angular/core").InputSignal<ICheckboxGroupValidRequired | undefined>;
51
+ /** Class CSS bổ sung cho container chính của nhóm */
20
52
  readonly classInclude: import("@angular/core").InputSignal<string | undefined>;
53
+ /** Class CSS bổ sung cho nhãn của nhóm */
21
54
  readonly classLabelInclude: import("@angular/core").InputSignal<string | undefined>;
55
+ /** Hiển thị thông báo lỗi validation ở phía dưới nhóm */
22
56
  readonly showValidateBottom: import("@angular/core").InputSignal<boolean | undefined>;
57
+ /** Class CSS cho item khi hiển thị ở chế độ nằm ngang */
23
58
  readonly classItemWhenModeHorizontal: import("@angular/core").InputSignal<string>;
59
+ /** Class CSS cho wrapper nhóm khi hiển thị ở chế độ nằm ngang */
24
60
  readonly classGroupWhenModeHorizontal: import("@angular/core").InputSignal<string>;
61
+ /** Hiển thị viền bao quanh toàn bộ nhóm component */
25
62
  readonly modeBorder: import("@angular/core").InputSignal<boolean | undefined>;
63
+ /** Phát ra khi bất kỳ checkbox nào trong nhóm thay đổi trạng thái */
26
64
  readonly outChange: import("@angular/core").OutputEmitterRef<ICheckboxEvent>;
65
+ /** Phát ra object chứa các hàm điều khiển (API) của component lên component cha */
27
66
  readonly outFunctionsControl: import("@angular/core").OutputEmitterRef<ICheckboxGroupFunctionControlEvent>;
28
67
  constructor();
29
68
  ngOnInit(): void;
@@ -6,28 +6,67 @@ import { ERROR_MESSAGE_EMPTY_VALID } from '@libs-ui/utils';
6
6
  import { TranslateModule } from '@ngx-translate/core';
7
7
  import * as i0 from "@angular/core";
8
8
  import * as i1 from "@ngx-translate/core";
9
+ /**
10
+ * Checkbox Group Component - Một tập hợp các checkbox đơn lẻ trong một nhóm.
11
+ *
12
+ * @description
13
+ * Hỗ trợ quản lý danh sách các checkbox, xử lý trạng thái chọn hàng loạt,
14
+ * cấu hình layout (ngang/dọc), và tích hợp validation bắt buộc chọn.
15
+ *
16
+ * @example
17
+ * ```html
18
+ * <libs_ui-components-checkbox-group
19
+ * [(groups)]="options"
20
+ * [labelConfig]="{ label: 'Chọn kỹ năng' }"
21
+ * (outChange)="onSelectionChange($event)"
22
+ * />
23
+ * ```
24
+ *
25
+ * @publicApi
26
+ */
9
27
  export class LibsUiComponentsCheckboxGroupComponent {
10
28
  // #region PROPERTY
11
29
  ERROR_MESSAGE_EMPTY_VALID = ERROR_MESSAGE_EMPTY_VALID;
30
+ /** Signal điều khiển trạng thái hiển thị lỗi validation */
12
31
  error = signal(false);
13
32
  // #region INPUT
33
+ /**
34
+ * Danh sách các item trong nhóm checkbox.
35
+ * Model hỗ trợ two-way binding để cập nhật trạng thái checked của các item.
36
+ */
14
37
  groups = model.required();
38
+ /** Tên trường đóng vai trò là khóa định danh trong item dữ liệu (mặc định: 'key') */
15
39
  fieldKey = input('key', { transform: (value) => value || 'key' });
40
+ /** Danh sách các keys cần được set trạng thái checked khi khởi tạo hoặc thay đổi */
16
41
  keysChecked = input();
42
+ /** Danh sách các keys cần được set trạng thái disable */
17
43
  keysDisable = input();
44
+ /** Trạng thái vô hiệu hóa toàn bộ nhóm checkbox */
18
45
  disable = input(false, { transform: (value) => value ?? false });
46
+ /** Nếu true, chỉ click vào checkbox/label mới đổi trạng thái. Nếu false, click vào vùng bao quanh item sẽ trigger */
19
47
  clickExactly = input(true, { transform: (value) => value ?? true });
48
+ /** Hiển thị các checkbox theo hàng ngang (mặc định: dọc) */
20
49
  horizontal = input(false, { transform: (value) => value ?? false });
50
+ /** Cấu hình nhãn (Label) tổng quát cho toàn bộ nhóm */
21
51
  labelConfig = input();
52
+ /** Cấu hình validation bắt buộc người dùng phải chọn ít nhất một item */
22
53
  validRequired = input();
54
+ /** Class CSS bổ sung cho container chính của nhóm */
23
55
  classInclude = input();
56
+ /** Class CSS bổ sung cho nhãn của nhóm */
24
57
  classLabelInclude = input();
58
+ /** Hiển thị thông báo lỗi validation ở phía dưới nhóm */
25
59
  showValidateBottom = input();
60
+ /** Class CSS cho item khi hiển thị ở chế độ nằm ngang */
26
61
  classItemWhenModeHorizontal = input('mr-[24px]');
62
+ /** Class CSS cho wrapper nhóm khi hiển thị ở chế độ nằm ngang */
27
63
  classGroupWhenModeHorizontal = input('flex');
64
+ /** Hiển thị viền bao quanh toàn bộ nhóm component */
28
65
  modeBorder = input();
29
66
  // #region OUTPUT
67
+ /** Phát ra khi bất kỳ checkbox nào trong nhóm thay đổi trạng thái */
30
68
  outChange = output();
69
+ /** Phát ra object chứa các hàm điều khiển (API) của component lên component cha */
31
70
  outFunctionsControl = output();
32
71
  constructor() {
33
72
  effect(() => {
@@ -112,4 +151,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
112
151
  type: Component,
113
152
  args: [{ selector: 'libs_ui-components-checkbox-group', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, imports: [TranslateModule, NgTemplateOutlet, LibsUiComponentsLabelComponent, LibsUiComponentsCheckboxSingleComponent], template: "<div class=\"flex flex-col w-full\">\n @if (labelConfig(); as labelConfig) {\n <libs_ui-components-label\n [classInclude]=\"labelConfig.classInclude\"\n [labelLeft]=\"labelConfig.labelLeft\"\n [labelLeftClass]=\"labelConfig.labelLeftClass\"\n [required]=\"labelConfig.required\"\n [description]=\"labelConfig.description\"\n [labelRight]=\"labelConfig.labelRight\"\n [labelRightClass]=\"labelConfig.labelRightClass\"\n [onlyShowCount]=\"labelConfig.onlyShowCount\"\n [buttonsLeft]=\"labelConfig.buttonsLeft\"\n [disableButtonsLeft]=\"labelConfig.disableButtonsLeft || disable()\"\n [hasToggle]=\"labelConfig.hasToggle\"\n [toggleActive]=\"labelConfig.toggleActive\"\n [toggleDisable]=\"labelConfig.toggleDisable || disable()\"\n [popover]=\"labelConfig.popover\"\n [iconPopoverClass]=\"labelConfig.iconPopoverClass\"\n [onlyShowCount]=\"labelConfig.onlyShowCount\"\n [limitLength]=\"labelConfig.limitLength\"\n [buttonsDescription]=\"labelConfig.buttonsDescription\"\n [disableButtonsDescription]=\"labelConfig.disableButtonsDescription || disable()\"\n [buttonsDescriptionContainerClass]=\"labelConfig.buttonsDescriptionContainerClass\"\n [count]=\"labelConfig.count\" />\n }\n @if (!showValidateBottom()) {\n <ng-container *ngTemplateOutlet=\"templateValidate\"></ng-container>\n }\n <div class=\"libs-ui-checkbox-group {{ horizontal() ? classGroupWhenModeHorizontal() : '' }}\">\n @for (group of groups(); track group) {\n <div [class]=\"horizontal() ? classItemWhenModeHorizontal() : ''\">\n <div class=\"py-[4px] {{ group.item.classIncludeWrapper || '' }}\">\n <libs_ui-components-checkbox-single\n [label]=\"group.item.label || ' '\"\n [checked]=\"group.item.checked || false\"\n [key]=\"group.item[fieldKey()]\"\n [disable]=\"group.disableByKeys || disable() || group.item.disable || false\"\n [disableLabel]=\"group.item.disableLabel || false\"\n [classLabelInclude]=\"classLabelInclude() || group.item.classLabelInclude || ''\"\n [classInclude]=\"classInclude() || group.item.classInclude || ''\"\n [popover]=\"group.item.popover\"\n [avatarConfig]=\"group.item.avatarConfig\"\n [description]=\"group.item.description\"\n [typeLabelPopover]=\"group.item.typeLabelPopover || 'text'\"\n [ignoreShowPopoverLabel]=\"group.item.ignoreShowPopoverLabel || false\"\n [clickExactly]=\"clickExactly()\"\n [modeBorder]=\"modeBorder()\"\n [showBorderError]=\"error() && validRequired()?.hasBorderErrorCheckbox\"\n (outChange)=\"handlerChange($event, group.item)\"\n (outEventPopover)=\"handlerEventPopover($event, group.item)\" />\n </div>\n @if (group.item.checked) {\n @if (group.subText) {\n <div\n class=\"libs-ui-checkbox-group-sub-text libs-ui-font-h7r {{ group.classIncludeSubText || '' }}\"\n [innerHtml]=\"group.subText\"></div>\n }\n <ng-container *ngTemplateOutlet=\"group?.subTemplate || null; context: { item: group.item }\"></ng-container>\n }\n </div>\n }\n </div>\n @if (showValidateBottom()) {\n <ng-container *ngTemplateOutlet=\"templateValidate\"></ng-container>\n }\n</div>\n\n<ng-template #templateValidate>\n @if (error()) {\n <div\n class=\"flex items-center\"\n [class.mb-[8px]]=\"!showValidateBottom()\"\n [class.mt-[8px]]=\"showValidateBottom()\">\n @let constHtmlMessage = validRequired()?.message || ERROR_MESSAGE_EMPTY_VALID;\n <span\n class=\"libs-ui-text-error libs-ui-font-h7r\"\n [innerHtml]=\"constHtmlMessage | translate: validRequired()?.interpolateParams\"></span>\n </div>\n }\n</ng-template>\n", styles: [".libs-ui-checkbox-group .libs-ui-checkbox-group-sub-text{color:#9ca2ad;margin-left:24px;margin-bottom:4px;width:100%}\n"] }]
114
153
  }], ctorParameters: () => [] });
115
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hlY2tib3gtZ3JvdXAuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy11aS9jb21wb25lbnRzL2NoZWNrYm94L2dyb3VwL3NyYy9jaGVja2JveC1ncm91cC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9saWJzLXVpL2NvbXBvbmVudHMvY2hlY2tib3gvZ3JvdXAvc3JjL2NoZWNrYm94LWdyb3VwLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ25ELE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQVUsTUFBTSxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDNUgsT0FBTyxFQUFrQix1Q0FBdUMsRUFBRSxNQUFNLHFDQUFxQyxDQUFDO0FBQzlHLE9BQU8sRUFBVSw4QkFBOEIsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBRW5GLE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzNELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQzs7O0FBYXRELE1BQU0sT0FBTyxzQ0FBc0M7SUFDakQsbUJBQW1CO0lBQ0EseUJBQXlCLEdBQUcseUJBQXlCLENBQUM7SUFDL0QsS0FBSyxHQUFHLE1BQU0sQ0FBVSxLQUFLLENBQUMsQ0FBQztJQUV6QyxnQkFBZ0I7SUFDUCxNQUFNLEdBQUcsS0FBSyxDQUFDLFFBQVEsRUFBNkIsQ0FBQztJQUNyRCxRQUFRLEdBQUcsS0FBSyxDQUFpQixLQUFLLEVBQUUsRUFBRSxTQUFTLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLEtBQUssSUFBSSxLQUFLLEVBQUUsQ0FBQyxDQUFDO0lBQ2xGLFdBQVcsR0FBRyxLQUFL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SUFBSSxtQkFDQyx1QkFBdUIsQ0FBQyxNQUFNLFdBQ3RDLENBQUMsZUFBZSxFQUFFLGdCQUFnQixFQUFFLDhCQUE4QixFQUFFLHVDQUF1QyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTmdUZW1wbGF0ZU91dGxldCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ29tcG9uZW50LCBlZmZlY3QsIGlucHV0LCBtb2RlbCwgT25Jbml0LCBvdXRwdXQsIHNpZ25hbCwgdW50cmFja2VkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBJQ2hlY2tib3hFdmVudCwgTGlic1VpQ29tcG9uZW50c0NoZWNrYm94U2luZ2xlQ29tcG9uZW50IH0gZnJvbSAnQGxpYnMtdWkvY29tcG9uZW50cy1jaGVja2JveC1zaW5nbGUnO1xuaW1wb3J0IHsgSUxhYmVsLCBMaWJzVWlDb21wb25lbnRzTGFiZWxDb21wb25lbnQgfSBmcm9tICdAbGlicy11aS9jb21wb25lbnRzLWxhYmVsJztcbmltcG9ydCB7IFRZUEVfUE9QT1ZFUl9FVkVOVCB9IGZyb20gJ0BsaWJzLXVpL2NvbXBvbmVudHMtcG9wb3Zlcic7XG5pbXBvcnQgeyBFUlJPUl9NRVNTQUdFX0VNUFRZX1ZBTElEIH0gZnJvbSAnQGxpYnMtdWkvdXRpbHMnO1xuaW1wb3J0IHsgVHJhbnNsYXRlTW9kdWxlIH0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XG5pbXBvcnQgeyBJQ2hlY2tib3hHcm91cEZ1bmN0aW9uQ29udHJvbEV2ZW50IH0gZnJvbSAnLi9pbnRlcmZhY2VzL2Z1bmN0aW9uLWNvbnRyb2wuaW50ZXJmYWNlJztcbmltcG9ydCB7IElDaGVja2JveEdyb3VwSXRlbSwgSUNoZWNrYm94R3JvdXBWYWxpZFJlcXVpcmVkLCBJQ2hlY2tib3hJdGVtIH0gZnJvbSAnLi9pbnRlcmZhY2VzL2dyb3VwLmludGVyZmFjZSc7XG5cbkBDb21wb25lbnQoe1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQGFuZ3VsYXItZXNsaW50L2NvbXBvbmVudC1zZWxlY3RvclxuICBzZWxlY3RvcjogJ2xpYnNfdWktY29tcG9uZW50cy1jaGVja2JveC1ncm91cCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9jaGVja2JveC1ncm91cC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsOiAnLi9jaGVja2JveC1ncm91cC5jb21wb25lbnQuc2NzcycsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICBpbXBvcnRzOiBbVHJhbnNsYXRlTW9kdWxlLCBOZ1RlbXBsYXRlT3V0bGV0LCBMaWJzVWlDb21wb25lbnRzTGFiZWxDb21wb25lbnQsIExpYnNVaUNvbXBvbmVudHNDaGVja2JveFNpbmdsZUNvbXBvbmVudF0sXG59KVxuZXhwb3J0IGNsYXNzIExpYnNVaUNvbXBvbmVudHNDaGVja2JveEdyb3VwQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcbiAgLy8gI3JlZ2lvbiBQUk9QRVJUWVxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgRVJST1JfTUVTU0FHRV9FTVBUWV9WQUxJRCA9IEVSUk9SX01FU1NBR0VfRU1QVFlfVkFMSUQ7XG4gIHByb3RlY3RlZCBlcnJvciA9IHNpZ25hbDxib29sZWFuPihmYWxzZSk7XG5cbiAgLy8gI3JlZ2lvbiBJTlBVVFxuICByZWFkb25seSBncm91cHMgPSBtb2RlbC5yZXF1aXJlZDxBcnJheTxJQ2hlY2tib3hHcm91cEl0ZW0+PigpO1xuICByZWFkb25seSBmaWVsZEtleSA9IGlucHV0PHN0cmluZywgc3RyaW5nPigna2V5JywgeyB0cmFuc2Zvcm06ICh2YWx1ZSkgPT4gdmFsdWUgfHwgJ2tleScgfSk7XG4gIHJlYWRvbmx5IGtleXNDaGVja2VkID0gaW5wdXQ8QXJyYXk8c3RyaW5nPj4oKTtcbiAgcmVhZG9ubHkga2V5c0Rpc2FibGUgPSBpbnB1dDxBcnJheTxzdHJpbmc+PigpO1xuICByZWFkb25seSBkaXNhYmxlID0gaW5wdXQ8Ym9vbGVhbiB8IHVuZGVmaW5lZCwgYm9vbGVhbiB8IHVuZGVmaW5lZD4oZmFsc2UsIHsgdHJhbnNmb3JtOiAodmFsdWUpID0+IHZhbHVlID8/IGZhbHNlIH0pO1xuICByZWFkb25seSBjbGlja0V4YWN0bHkgPSBpbnB1dDxib29sZWFuIHwgdW5kZWZpbmVkLCBib29sZWFuIHwgdW5kZWZpbmVkPih0cnVlLCB7IHRyYW5zZm9ybTogKHZhbHVlKSA9PiB2YWx1ZSA/PyB0cnVlIH0pO1xuICByZWFkb25seSBob3Jpem9udGFsID0gaW5wdXQ8Ym9vbGVhbiB8IHVuZGVmaW5lZCwgYm9vbGVhbiB8IHVuZGVmaW5lZD4oZmFsc2UsIHsgdHJhbnNmb3JtOiAodmFsdWUpID0+IHZhbHVlID8/IGZhbHNlIH0pO1xuICByZWFkb25seSBsYWJlbENvbmZpZyA9IGlucHV0PElMYWJlbD4oKTtcbiAgcmVhZG9ubHkgdmFsaWRSZXF1aXJlZCA9IGlucHV0PElDaGVja2JveEdyb3VwVmFsaWRSZXF1aXJlZD4oKTtcbiAgcmVhZG9ubHkgY2xhc3NJbmNsdWRlID0gaW5wdXQ8c3RyaW5nPigpO1xuICByZWFkb25seSBjbGFzc0xhYmVsSW5jbHVkZSA9IGlucHV0PHN0cmluZz4oKTtcbiAgcmVhZG9ubHkgc2hvd1ZhbGlkYXRlQm90dG9tID0gaW5wdXQ8Ym9vbGVhbj4oKTtcbiAgcmVhZG9ubHkgY2xhc3NJdGVtV2hlbk1vZGVIb3Jpem9udGFsID0gaW5wdXQ8c3RyaW5nPignbXItWzI0cHhdJyk7XG4gIHJlYWRvbmx5IGNsYXNzR3JvdXBXaGVuTW9kZUhvcml6b250YWwgPSBpbnB1dDxzdHJpbmc+KCdmbGV4Jyk7XG4gIHJlYWRvbmx5IG1vZGVCb3JkZXIgPSBpbnB1dDxib29sZWFuPigpO1xuXG4gIC8vICNyZWdpb24gT1VUUFVUXG4gIHJlYWRvbmx5IG91dENoYW5nZSA9IG91dHB1dDxJQ2hlY2tib3hFdmVudD4oKTtcbiAgcmVhZG9ubHkgb3V0RnVuY3Rpb25zQ29udHJvbCA9IG91dHB1dDxJQ2hlY2tib3hHcm91cEZ1bmN0aW9uQ29udHJvbEV2ZW50PigpO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIGVmZmVjdCgoKSA9PiB7XG4gICAgICBpZiAoIUFycmF5LmlzQXJyYXkodGhpcy5rZXlzQ2hlY2tlZCgpKSB8fCAhdGhpcy5maWVsZEtleSgpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHVudHJhY2tlZCgoKSA9PiB7XG4gICAgICAgIHRoaXMuZ3JvdXBzLnVwZGF0ZSgoZGF0YSkgPT4ge1xuICAgICAgICAgIHJldHVybiBkYXRhLm1hcCgoZ3JvdXApID0+IHtcbiAgICAgICAgICAgIGdyb3VwLml0ZW0uY2hlY2tlZCA9IHRoaXMua2V5c0NoZWNrZWQoKT8uc29tZSgoa2V5KSA9PiBrZXkgPT09IGdyb3VwLml0ZW1bdGhpcy5maWVsZEtleSgpXSk7XG5cbiAgICAgICAgICAgIHJldHVybiBncm91cDtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGVmZmVjdCgoKSA9PiB7XG4gICAgICBpZiAoIUFycmF5LmlzQXJyYXkodGhpcy5rZXlzRGlzYWJsZSgpKSB8fCAhdGhpcy5maWVsZEtleSgpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHVudHJhY2tlZCgoKSA9PiB7XG4gICAgICAgIHRoaXMuZ3JvdXBzLnVwZGF0ZSgoZGF0YSkgPT4ge1xuICAgICAgICAgIHJldHVybiBkYXRhLm1hcCgoZ3JvdXApID0+IHtcbiAgICAgICAgICAgIGdyb3VwLmRpc2FibGVCeUtleXMgPSBmYWxzZTtcbiAgICAgICAgICAgIGlmIChncm91cC5pdGVtICYmIHRoaXMua2V5c0Rpc2FibGUoKT8uaW5jbHVkZXMoZ3JvdXAuaXRlbVt0aGlzLmZpZWxkS2V5KCldKSkge1xuICAgICAgICAgICAgICBncm91cC5kaXNhYmxlQnlLZXlzID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBncm91cDtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qIEZVTkNUSU9OUyAqL1xuICBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLm91dEZ1bmN0aW9uc0NvbnRyb2wuZW1pdCh0aGlzLkZ1bmN0aW9uc0NvbnRyb2wpO1xuICB9XG5cbiAgcHVibGljIGdldCBGdW5jdGlvbnNDb250cm9sKCk6IElDaGVja2JveEdyb3VwRnVuY3Rpb25Db250cm9sRXZlbnQge1xuICAgIHJldHVybiB7XG4gICAgICBjaGVja0lzVmFsaWQ6IHRoaXMuY2hlY2tWYWxpZC5iaW5kKHRoaXMpLFxuICAgICAgcmVzZXRFcnJvcjogdGhpcy5yZXNldEVycm9yLmJpbmQodGhpcyksXG4gICAgICByZXNldDogYXN5bmMgKCkgPT4ge1xuICAgICAgICB0aGlzLmdyb3Vwcy51cGRhdGUoKGRhdGEpID0+IHtcbiAgICAgICAgICByZXR1cm4gZGF0YS5tYXAoKGdyb3VwKSA9PiB7XG4gICAgICAgICAgICBncm91cC5pdGVtLmNoZWNrZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIHJldHVybiBncm91cDtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMucmVzZXRFcnJvcigpO1xuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgLy8gI3JlZ2lvbiBGVU5DVElPTlNcbiAgcHJvdGVjdGVkIGhhbmRsZXJDaGFuZ2UoZXZlbnQ6IElDaGVja2JveEV2ZW50LCBpdGVtOiBJQ2hlY2tib3hJdGVtKSB7XG4gICAgaWYgKHRoaXMuZGlzYWJsZSgpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGl0ZW0uY2hlY2tlZCA9IGV2ZW50LmNoZWNrZWQ7XG4gICAgZXZlbnQuYWxsQ2hlY2tib3hDaGVja2VkID0gdGhpcy5ncm91cHMoKVxuICAgICAgLmZpbHRlcigoZ3JvdXApID0+IGdyb3VwLml0ZW0uY2hlY2tlZClcbiAgICAgIC5tYXAoKGdyb3VwKSA9PiAoeyBrZXk6IGdyb3VwLml0ZW1bdGhpcy5maWVsZEtleSgpXSwgaXRlbTogZ3JvdXAuaXRlbSB9KSk7XG4gICAgdGhpcy5vdXRDaGFuZ2UuZW1pdChldmVudCk7XG4gICAgdGhpcy5jaGVja1ZhbGlkKCk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGNoZWNrVmFsaWQoKSB7XG4gICAgdGhpcy5lcnJvci5zZXQoZmFsc2UpO1xuICAgIGlmICghdGhpcy52YWxpZFJlcXVpcmVkKCkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICB0aGlzLmVycm9yLnNldCghdGhpcy5ncm91cHMoKS5zb21lKChncm91cCkgPT4gZ3JvdXAuaXRlbS5jaGVja2VkKSk7XG5cbiAgICByZXR1cm4gIXRoaXMuZXJyb3IoKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcmVzZXRFcnJvcigpIHtcbiAgICB0aGlzLmVycm9yLnNldChmYWxzZSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgaGFuZGxlckV2ZW50UG9wb3ZlcihldmVudDogVFlQRV9QT1BPVkVSX0VWRU5ULCBpdGVtOiBJQ2hlY2tib3hJdGVtKSB7XG4gICAgaXRlbS5vdXRFdmVudFBvcG92ZXI/LihldmVudCk7XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sIHctZnVsbFwiPlxuICBAaWYgKGxhYmVsQ29uZmlnKCk7IGFzIGxhYmVsQ29uZmlnKSB7XG4gICAgPGxpYnNfdWktY29tcG9uZW50cy1sYWJlbFxuICAgICAgW2NsYXNzSW5jbHVkZV09XCJsYWJlbENvbmZpZy5jbGFzc0luY2x1ZGVcIlxuICAgICAgW2xhYmVsTGVmdF09XCJsYWJlbENvbmZpZy5sYWJlbExlZnRcIlxuICAgICAgW2xhYmVsTGVmdENsYXNzXT1cImxhYmVsQ29uZmlnLmxhYmVsTGVmdENsYXNzXCJcbiAgICAgIFtyZXF1aXJlZF09XCJsYWJlbENvbmZpZy5yZXF1aXJlZFwiXG4gICAgICBbZGVzY3JpcHRpb25dPVwibGFiZWxDb25maWcuZGVzY3JpcHRpb25cIlxuICAgICAgW2xhYmVsUmlnaHRdPVwibGFiZWxDb25maWcubGFiZWxSaWdodFwiXG4gICAgICBbbGFiZWxSaWdodENsYXNzXT1cImxhYmVsQ29uZmlnLmxhYmVsUmlnaHRDbGFzc1wiXG4gICAgICBbb25seVNob3dDb3VudF09XCJsYWJlbENvbmZpZy5vbmx5U2hvd0NvdW50XCJcbiAgICAgIFtidXR0b25zTGVmdF09XCJsYWJlbENvbmZpZy5idXR0b25zTGVmdFwiXG4gICAgICBbZGlzYWJsZUJ1dHRvbnNMZWZ0XT1cImxhYmVsQ29uZmlnLmRpc2FibGVCdXR0b25zTGVmdCB8fCBkaXNhYmxlKClcIlxuICAgICAgW2hhc1RvZ2dsZV09XCJsYWJlbENvbmZpZy5oYXNUb2dnbGVcIlxuICAgICAgW3RvZ2dsZUFjdGl2ZV09XCJsYWJlbENvbmZpZy50b2dnbGVBY3RpdmVcIlxuICAgICAgW3RvZ2dsZURpc2FibGVdPVwibGFiZWxDb25maWcudG9nZ2xlRGlzYWJsZSB8fCBkaXNhYmxlKClcIlxuICAgICAgW3BvcG92ZXJdPVwibGFiZWxDb25maWcucG9wb3ZlclwiXG4gICAgICBbaWNvblBvcG92ZXJDbGFzc109XCJsYWJlbENvbmZpZy5pY29uUG9wb3ZlckNsYXNzXCJcbiAgICAgIFtvbmx5U2hvd0NvdW50XT1cImxhYmVsQ29uZmlnLm9ubHlTaG93Q291bnRcIlxuICAgICAgW2xpbWl0TGVuZ3RoXT1cImxhYmVsQ29uZmlnLmxpbWl0TGVuZ3RoXCJcbiAgICAgIFtidXR0b25zRGVzY3JpcHRpb25dPVwibGFiZWxDb25maWcuYnV0dG9uc0Rlc2NyaXB0aW9uXCJcbiAgICAgIFtkaXNhYmxlQnV0dG9uc0Rlc2NyaXB0aW9uXT1cImxhYmVsQ29uZmlnLmRpc2FibGVCdXR0b25zRGVzY3JpcHRpb24gfHwgZGlzYWJsZSgpXCJcbiAgICAgIFtidXR0b25zRGVzY3JpcHRpb25Db250YWluZXJDbGFzc109XCJsYWJlbENvbmZpZy5idXR0b25zRGVzY3JpcHRpb25Db250YWluZXJDbGFzc1wiXG4gICAgICBbY291bnRdPVwibGFiZWxDb25maWcuY291bnRcIiAvPlxuICB9XG4gIEBpZiAoIXNob3dWYWxpZGF0ZUJvdHRvbSgpKSB7XG4gICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInRlbXBsYXRlVmFsaWRhdGVcIj48L25nLWNvbnRhaW5lcj5cbiAgfVxuICA8ZGl2IGNsYXNzPVwibGlicy11aS1jaGVja2JveC1ncm91cCB7eyBob3Jpem9udGFsKCkgPyBjbGFzc0dyb3VwV2hlbk1vZGVIb3Jpem9udGFsKCkgOiAnJyB9fVwiPlxuICAgIEBmb3IgKGdyb3VwIG9mIGdyb3VwcygpOyB0cmFjayBncm91cCkge1xuICAgICAgPGRpdiBbY2xhc3NdPVwiaG9yaXpvbnRhbCgpID8gY2xhc3NJdGVtV2hlbk1vZGVIb3Jpem9udGFsKCkgOiAnJ1wiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwicHktWzRweF0ge3sgZ3JvdXAuaXRlbS5jbGFzc0luY2x1ZGVXcmFwcGVyIHx8ICcnIH19XCI+XG4gICAgICAgICAgPGxpYnNfdWktY29tcG9uZW50cy1jaGVja2JveC1zaW5nbGVcbiAgICAgICAgICAgIFtsYWJlbF09XCJncm91cC5pdGVtLmxhYmVsIHx8ICcgJ1wiXG4gICAgICAgICAgICBbY2hlY2tlZF09XCJncm91cC5pdGVtLmNoZWNrZWQgfHwgZmFsc2VcIlxuICAgICAgICAgICAgW2tleV09XCJncm91cC5pdGVtW2ZpZWxkS2V5KCldXCJcbiAgICAgICAgICAgIFtkaXNhYmxlXT1cImdyb3VwLmRpc2FibGVCeUtleXMgfHwgZGlzYWJsZSgpIHx8IGdyb3VwLml0ZW0uZGlzYWJsZSB8fCBmYWxzZVwiXG4gICAgICAgICAgICBbZGlzYWJsZUxhYmVsXT1cImdyb3VwLml0ZW0uZGlzYWJsZUxhYmVsIHx8IGZhbHNlXCJcbiAgICAgICAgICAgIFtjbGFzc0xhYmVsSW5jbHVkZV09XCJjbGFzc0xhYmVsSW5jbHVkZSgpIHx8IGdyb3VwLml0ZW0uY2xhc3NMYWJlbEluY2x1ZGUgfHwgJydcIlxuICAgICAgICAgICAgW2NsYXNzSW5jbHVkZV09XCJjbGFzc0luY2x1ZGUoKSB8fCBncm91cC5pdGVtLmNsYXNzSW5jbHVkZSB8fCAnJ1wiXG4gICAgICAgICAgICBbcG9wb3Zlcl09XCJncm91cC5pdGVtLnBvcG92ZXJcIlxuICAgICAgICAgICAgW2F2YXRhckNvbmZpZ109XCJncm91cC5pdGVtLmF2YXRhckNvbmZpZ1wiXG4gICAgICAgICAgICBbZGVzY3JpcHRpb25dPVwiZ3JvdXAuaXRlbS5kZXNjcmlwdGlvblwiXG4gICAgICAgICAgICBbdHlwZUxhYmVsUG9wb3Zlcl09XCJncm91cC5pdGVtLnR5cGVMYWJlbFBvcG92ZXIgfHwgJ3RleHQnXCJcbiAgICAgICAgICAgIFtpZ25vcmVTaG93UG9wb3ZlckxhYmVsXT1cImdyb3VwLml0ZW0uaWdub3JlU2hvd1BvcG92ZXJMYWJlbCB8fCBmYWxzZVwiXG4gICAgICAgICAgICBbY2xpY2tFeGFjdGx5XT1cImNsaWNrRXhhY3RseSgpXCJcbiAgICAgICAgICAgIFttb2RlQm9yZGVyXT1cIm1vZGVCb3JkZXIoKVwiXG4gICAgICAgICAgICBbc2hvd0JvcmRlckVycm9yXT1cImVycm9yKCkgJiYgdmFsaWRSZXF1aXJlZCgpPy5oYXNCb3JkZXJFcnJvckNoZWNrYm94XCJcbiAgICAgICAgICAgIChvdXRDaGFuZ2UpPVwiaGFuZGxlckNoYW5nZSgkZXZlbnQsIGdyb3VwLml0ZW0pXCJcbiAgICAgICAgICAgIChvdXRFdmVudFBvcG92ZXIpPVwiaGFuZGxlckV2ZW50UG9wb3ZlcigkZXZlbnQsIGdyb3VwLml0ZW0pXCIgLz5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIEBpZiAoZ3JvdXAuaXRlbS5jaGVja2VkKSB7XG4gICAgICAgICAgQGlmIChncm91cC5zdWJUZXh0KSB7XG4gICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgIGNsYXNzPVwibGlicy11aS1jaGVja2JveC1ncm91cC1zdWItdGV4dCBsaWJzLXVpLWZvbnQtaDdyIHt7IGdyb3VwLmNsYXNzSW5jbHVkZVN1YlRleHQgfHwgJycgfX1cIlxuICAgICAgICAgICAgICBbaW5uZXJIdG1sXT1cImdyb3VwLnN1YlRleHRcIj48L2Rpdj5cbiAgICAgICAgICB9XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImdyb3VwPy5zdWJUZW1wbGF0ZSB8fCBudWxsOyBjb250ZXh0OiB7IGl0ZW06IGdyb3VwLml0ZW0gfVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICB9XG4gICAgICA8L2Rpdj5cbiAgICB9XG4gIDwvZGl2PlxuICBAaWYgKHNob3dWYWxpZGF0ZUJvdHRvbSgpKSB7XG4gICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInRlbXBsYXRlVmFsaWRhdGVcIj48L25nLWNvbnRhaW5lcj5cbiAgfVxuPC9kaXY+XG5cbjxuZy10ZW1wbGF0ZSAjdGVtcGxhdGVWYWxpZGF0ZT5cbiAgQGlmIChlcnJvcigpKSB7XG4gICAgPGRpdlxuICAgICAgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlclwiXG4gICAgICBbY2xhc3MubWItWzhweF1dPVwiIXNob3dWYWxpZGF0ZUJvdHRvbSgpXCJcbiAgICAgIFtjbGFzcy5tdC1bOHB4XV09XCJzaG93VmFsaWRhdGVCb3R0b20oKVwiPlxuICAgICAgQGxldCBjb25zdEh0bWxNZXNzYWdlID0gdmFsaWRSZXF1aXJlZCgpPy5tZXNzYWdlIHx8IEVSUk9SX01FU1NBR0VfRU1QVFlfVkFMSUQ7XG4gICAgICA8c3BhblxuICAgICAgICBjbGFzcz1cImxpYnMtdWktdGV4dC1lcnJvciBsaWJzLXVpLWZvbnQtaDdyXCJcbiAgICAgICAgW2lubmVySHRtbF09XCJjb25zdEh0bWxNZXNzYWdlIHwgdHJhbnNsYXRlOiB2YWxpZFJlcXVpcmVkKCk/LmludGVycG9sYXRlUGFyYW1zXCI+PC9zcGFuPlxuICAgIDwvZGl2PlxuICB9XG48L25nLXRlbXBsYXRlPlxuIl19
154
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hlY2tib3gtZ3JvdXAuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy11aS9jb21wb25lbnRzL2NoZWNrYm94L2dyb3VwL3NyYy9jaGVja2JveC1ncm91cC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9saWJzLXVpL2NvbXBvbmVudHMvY2hlY2tib3gvZ3JvdXAvc3JjL2NoZWNrYm94LWdyb3VwLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ25ELE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQVUsTUFBTSxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDNUgsT0FBTyxFQUFrQix1Q0FBdUMsRUFBRSxNQUFNLHFDQUFxQyxDQUFDO0FBQzlHLE9BQU8sRUFBVSw4QkFBOEIsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBRW5GLE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzNELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQzs7O0FBSXREOzs7Ozs7Ozs7Ozs7Ozs7OztHQWlCRztBQVVILE1BQU0sT0FBTyxzQ0FBc0M7SUFDakQsbUJBQW1CO0lBQ0EseUJBQXlCLEdBQUcseUJBQXlCLENBQUM7SUFDekUsMkRBQTJEO0lBQ2pELEtBQUssR0FBRyxNQUFNLENBQVUsS0FBSyxDQUFDLENBQUM7SUFFekMsZ0JBQWdCO0lBQ2hCOzs7T0FHRztJQUNNLE1BQU0sR0FBRyxLQUFLLENBQUMsUUFBUSxFQUE2QixDQUFDO0lBQzlELHFGQUFxRjtJQUM1RSxRQUFRLEdBQUcsS0FBSyxDQUFpQixLQUFLLEVBQUUsRUFBRSxTQUFTLEVBQUUsQ0FBQyxLQUFL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QyxLQUFLLENBQUMsQ0FBQztJQUN4QixDQUFDO0lBRVMsbUJBQW1CLENBQUMsS0FBeUIsRUFBRSxJQUFtQjtRQUMxRSxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDaEMsQ0FBQzt3R0FuSVUsc0NBQXNDOzRGQUF0QyxzQ0FBc0MsbTFFQ3JDbkQsZzBIQWdGQSxnTEQ3Q1ksZUFBZSw0RkFBRSxnQkFBZ0Isb0pBQUUsOEJBQThCLDRxQkFBRSx1Q0FBdUM7OzRGQUV6RyxzQ0FBc0M7a0JBVGxELFNBQVM7K0JBRUUsbUNBQW1DLGNBR2pDLElBQUksbUJBQ0MsdUJBQXVCLENBQUMsTUFBTSxXQUN0QyxDQUFDLGVBQWUsRUFBRSxnQkFBZ0IsRUFBRSw4QkFBOEIsRUFBRSx1Q0FBdUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE5nVGVtcGxhdGVPdXRsZXQgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENvbXBvbmVudCwgZWZmZWN0LCBpbnB1dCwgbW9kZWwsIE9uSW5pdCwgb3V0cHV0LCBzaWduYWwsIHVudHJhY2tlZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgSUNoZWNrYm94RXZlbnQsIExpYnNVaUNvbXBvbmVudHNDaGVja2JveFNpbmdsZUNvbXBvbmVudCB9IGZyb20gJ0BsaWJzLXVpL2NvbXBvbmVudHMtY2hlY2tib3gtc2luZ2xlJztcbmltcG9ydCB7IElMYWJlbCwgTGlic1VpQ29tcG9uZW50c0xhYmVsQ29tcG9uZW50IH0gZnJvbSAnQGxpYnMtdWkvY29tcG9uZW50cy1sYWJlbCc7XG5pbXBvcnQgeyBUWVBFX1BPUE9WRVJfRVZFTlQgfSBmcm9tICdAbGlicy11aS9jb21wb25lbnRzLXBvcG92ZXInO1xuaW1wb3J0IHsgRVJST1JfTUVTU0FHRV9FTVBUWV9WQUxJRCB9IGZyb20gJ0BsaWJzLXVpL3V0aWxzJztcbmltcG9ydCB7IFRyYW5zbGF0ZU1vZHVsZSB9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xuaW1wb3J0IHsgSUNoZWNrYm94R3JvdXBGdW5jdGlvbkNvbnRyb2xFdmVudCB9IGZyb20gJy4vaW50ZXJmYWNlcy9mdW5jdGlvbi1jb250cm9sLmludGVyZmFjZSc7XG5pbXBvcnQgeyBJQ2hlY2tib3hHcm91cEl0ZW0sIElDaGVja2JveEdyb3VwVmFsaWRSZXF1aXJlZCwgSUNoZWNrYm94SXRlbSB9IGZyb20gJy4vaW50ZXJmYWNlcy9ncm91cC5pbnRlcmZhY2UnO1xuXG4vKipcbiAqIENoZWNrYm94IEdyb3VwIENvbXBvbmVudCAtIE3hu5l0IHThuq1wIGjhu6NwIGPDoWMgY2hlY2tib3ggxJHGoW4gbOG6uyB0cm9uZyBt4buZdCBuaMOzbS5cbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIEjhu5cgdHLhu6MgcXXhuqNuIGzDvSBkYW5oIHPDoWNoIGPDoWMgY2hlY2tib3gsIHjhu60gbMO9IHRy4bqhbmcgdGjDoWkgY2jhu41uIGjDoG5nIGxv4bqhdCxcbiAqIGPhuqV1IGjDrG5oIGxheW91dCAobmdhbmcvZOG7jWMpLCB2w6AgdMOtY2ggaOG7o3AgdmFsaWRhdGlvbiBi4bqvdCBideG7mWMgY2jhu41uLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGBodG1sXG4gKiA8bGlic191aS1jb21wb25lbnRzLWNoZWNrYm94LWdyb3VwXG4gKiAgIFsoZ3JvdXBzKV09XCJvcHRpb25zXCJcbiAqICAgW2xhYmVsQ29uZmlnXT1cInsgbGFiZWw6ICdDaOG7jW4ga+G7uSBuxINuZycgfVwiXG4gKiAgIChvdXRDaGFuZ2UpPVwib25TZWxlY3Rpb25DaGFuZ2UoJGV2ZW50KVwiXG4gKiAvPlxuICogYGBgXG4gKlxuICogQHB1YmxpY0FwaVxuICovXG5AQ29tcG9uZW50KHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBhbmd1bGFyLWVzbGludC9jb21wb25lbnQtc2VsZWN0b3JcbiAgc2VsZWN0b3I6ICdsaWJzX3VpLWNvbXBvbmVudHMtY2hlY2tib3gtZ3JvdXAnLFxuICB0ZW1wbGF0ZVVybDogJy4vY2hlY2tib3gtZ3JvdXAuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybDogJy4vY2hlY2tib3gtZ3JvdXAuY29tcG9uZW50LnNjc3MnLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgaW1wb3J0czogW1RyYW5zbGF0ZU1vZHVsZSwgTmdUZW1wbGF0ZU91dGxldCwgTGlic1VpQ29tcG9uZW50c0xhYmVsQ29tcG9uZW50LCBMaWJzVWlDb21wb25lbnRzQ2hlY2tib3hTaW5nbGVDb21wb25lbnRdLFxufSlcbmV4cG9ydCBjbGFzcyBMaWJzVWlDb21wb25lbnRzQ2hlY2tib3hHcm91cENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIC8vICNyZWdpb24gUFJPUEVSVFlcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IEVSUk9SX01FU1NBR0VfRU1QVFlfVkFMSUQgPSBFUlJPUl9NRVNTQUdFX0VNUFRZX1ZBTElEO1xuICAvKiogU2lnbmFsIMSRaeG7gXUga2hp4buDbiB0cuG6oW5nIHRow6FpIGhp4buDbiB0aOG7iyBs4buXaSB2YWxpZGF0aW9uICovXG4gIHByb3RlY3RlZCBlcnJvciA9IHNpZ25hbDxib29sZWFuPihmYWxzZSk7XG5cbiAgLy8gI3JlZ2lvbiBJTlBVVFxuICAvKipcbiAgICogRGFuaCBzw6FjaCBjw6FjIGl0ZW0gdHJvbmcgbmjDs20gY2hlY2tib3guXG4gICAqIE1vZGVsIGjhu5cgdHLhu6MgdHdvLXdheSBiaW5kaW5nIMSR4buDIGPhuq1wIG5o4bqtdCB0cuG6oW5nIHRow6FpIGNoZWNrZWQgY+G7p2EgY8OhYyBpdGVtLlxuICAgKi9cbiAgcmVhZG9ubHkgZ3JvdXBzID0gbW9kZWwucmVxdWlyZWQ8QXJyYXk8SUNoZWNrYm94R3JvdXBJdGVtPj4oKTtcbiAgLyoqIFTDqm4gdHLGsOG7nW5nIMSRw7NuZyB2YWkgdHLDsiBsw6Aga2jDs2EgxJHhu4tuaCBkYW5oIHRyb25nIGl0ZW0gZOG7ryBsaeG7h3UgKG3hurdjIMSR4buLbmg6ICdrZXknKSAqL1xuICByZWFkb25seSBmaWVsZEtleSA9IGlucHV0PHN0cmluZywgc3RyaW5nPigna2V5JywgeyB0cmFuc2Zvcm06ICh2YWx1ZSkgPT4gdmFsdWUgfHwgJ2tleScgfSk7XG4gIC8qKiBEYW5oIHPDoWNoIGPDoWMga2V5cyBj4bqnbiDEkcaw4bujYyBzZXQgdHLhuqFuZyB0aMOhaSBjaGVja2VkIGtoaSBraOG7n2kgdOG6oW8gaG/hurdjIHRoYXkgxJHhu5VpICovXG4gIHJlYWRvbmx5IGtleXNDaGVja2VkID0gaW5wdXQ8QXJyYXk8c3RyaW5nPj4oKTtcbiAgLyoqIERhbmggc8OhY2ggY8OhYyBrZXlzIGPhuqduIMSRxrDhu6NjIHNldCB0cuG6oW5nIHRow6FpIGRpc2FibGUgKi9cbiAgcmVhZG9ubHkga2V5c0Rpc2FibGUgPSBpbnB1dDxBcnJheTxzdHJpbmc+PigpO1xuICAvKiogVHLhuqFuZyB0aMOhaSB2w7QgaGnhu4d1IGjDs2EgdG/DoG4gYuG7mSBuaMOzbSBjaGVja2JveCAqL1xuICByZWFkb25seSBkaXNhYmxlID0gaW5wdXQ8Ym9vbGVhbiB8IHVuZGVmaW5lZCwgYm9vbGVhbiB8IHVuZGVmaW5lZD4oZmFsc2UsIHsgdHJhbnNmb3JtOiAodmFsdWUpID0+IHZhbHVlID8/IGZhbHNlIH0pO1xuICAvKiogTuG6v3UgdHJ1ZSwgY2jhu4kgY2xpY2sgdsOgbyBjaGVja2JveC9sYWJlbCBt4bubaSDEkeG7lWkgdHLhuqFuZyB0aMOhaS4gTuG6v3UgZmFsc2UsIGNsaWNrIHbDoG8gdsO5bmcgYmFvIHF1YW5oIGl0ZW0gc+G6vSB0cmlnZ2VyICovXG4gIHJlYWRvbmx5IGNsaWNrRXhhY3RseSA9IGlucHV0PGJvb2xlYW4gfCB1bmRlZmluZWQsIGJvb2xlYW4gfCB1bmRlZmluZWQ+KHRydWUsIHsgdHJhbnNmb3JtOiAodmFsdWUpID0+IHZhbHVlID8/IHRydWUgfSk7XG4gIC8qKiBIaeG7g24gdGjhu4sgY8OhYyBjaGVja2JveCB0aGVvIGjDoG5nIG5nYW5nICht4bq3YyDEkeG7i25oOiBk4buNYykgKi9cbiAgcmVhZG9ubHkgaG9yaXpvbnRhbCA9IGlucHV0PGJvb2xlYW4gfCB1bmRlZmluZWQsIGJvb2xlYW4gfCB1bmRlZmluZWQ+KGZhbHNlLCB7IHRyYW5zZm9ybTogKHZhbHVlKSA9PiB2YWx1ZSA/PyBmYWxzZSB9KTtcbiAgLyoqIEPhuqV1IGjDrG5oIG5ow6NuIChMYWJlbCkgdOG7lW5nIHF1w6F0IGNobyB0b8OgbiBi4buZIG5ow7NtICovXG4gIHJlYWRvbmx5IGxhYmVsQ29uZmlnID0gaW5wdXQ8SUxhYmVsPigpO1xuICAvKiogQ+G6pXUgaMOsbmggdmFsaWRhdGlvbiBi4bqvdCBideG7mWMgbmfGsOG7nWkgZMO5bmcgcGjhuqNpIGNo4buNbiDDrXQgbmjhuqV0IG3hu5l0IGl0ZW0gKi9cbiAgcmVhZG9ubHkgdmFsaWRSZXF1aXJlZCA9IGlucHV0PElDaGVja2JveEdyb3VwVmFsaWRSZXF1aXJlZD4oKTtcbiAgLyoqIENsYXNzIENTUyBi4buVIHN1bmcgY2hvIGNvbnRhaW5lciBjaMOtbmggY+G7p2EgbmjDs20gKi9cbiAgcmVhZG9ubHkgY2xhc3NJbmNsdWRlID0gaW5wdXQ8c3RyaW5nPigpO1xuICAvKiogQ2xhc3MgQ1NTIGLhu5Ugc3VuZyBjaG8gbmjDo24gY+G7p2EgbmjDs20gKi9cbiAgcmVhZG9ubHkgY2xhc3NMYWJlbEluY2x1ZGUgPSBpbnB1dDxzdHJpbmc+KCk7XG4gIC8qKiBIaeG7g24gdGjhu4sgdGjDtG5nIGLDoW8gbOG7l2kgdmFsaWRhdGlvbiDhu58gcGjDrWEgZMaw4bubaSBuaMOzbSAqL1xuICByZWFkb25seSBzaG93VmFsaWRhdGVCb3R0b20gPSBpbnB1dDxib29sZWFuPigpO1xuICAvKiogQ2xhc3MgQ1NTIGNobyBpdGVtIGtoaSBoaeG7g24gdGjhu4sg4bufIGNo4bq/IMSR4buZIG7hurFtIG5nYW5nICovXG4gIHJlYWRvbmx5IGNsYXNzSXRlbVdoZW5Nb2RlSG9yaXpvbnRhbCA9IGlucHV0PHN0cmluZz4oJ21yLVsyNHB4XScpO1xuICAvKiogQ2xhc3MgQ1NTIGNobyB3cmFwcGVyIG5ow7NtIGtoaSBoaeG7g24gdGjhu4sg4bufIGNo4bq/IMSR4buZIG7hurFtIG5nYW5nICovXG4gIHJlYWRvbmx5IGNsYXNzR3JvdXBXaGVuTW9kZUhvcml6b250YWwgPSBpbnB1dDxzdHJpbmc+KCdmbGV4Jyk7XG4gIC8qKiBIaeG7g24gdGjhu4sgdmnhu4FuIGJhbyBxdWFuaCB0b8OgbiBi4buZIG5ow7NtIGNvbXBvbmVudCAqL1xuICByZWFkb25seSBtb2RlQm9yZGVyID0gaW5wdXQ8Ym9vbGVhbj4oKTtcblxuICAvLyAjcmVnaW9uIE9VVFBVVFxuICAvKiogUGjDoXQgcmEga2hpIGLhuqV0IGvhu7MgY2hlY2tib3ggbsOgbyB0cm9uZyBuaMOzbSB0aGF5IMSR4buVaSB0cuG6oW5nIHRow6FpICovXG4gIHJlYWRvbmx5IG91dENoYW5nZSA9IG91dHB1dDxJQ2hlY2tib3hFdmVudD4oKTtcbiAgLyoqIFBow6F0IHJhIG9iamVjdCBjaOG7qWEgY8OhYyBow6BtIMSRaeG7gXUga2hp4buDbiAoQVBJKSBj4bunYSBjb21wb25lbnQgbMOqbiBjb21wb25lbnQgY2hhICovXG4gIHJlYWRvbmx5IG91dEZ1bmN0aW9uc0NvbnRyb2wgPSBvdXRwdXQ8SUNoZWNrYm94R3JvdXBGdW5jdGlvbkNvbnRyb2xFdmVudD4oKTtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBlZmZlY3QoKCkgPT4ge1xuICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHRoaXMua2V5c0NoZWNrZWQoKSkgfHwgIXRoaXMuZmllbGRLZXkoKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB1bnRyYWNrZWQoKCkgPT4ge1xuICAgICAgICB0aGlzLmdyb3Vwcy51cGRhdGUoKGRhdGEpID0+IHtcbiAgICAgICAgICByZXR1cm4gZGF0YS5tYXAoKGdyb3VwKSA9PiB7XG4gICAgICAgICAgICBncm91cC5pdGVtLmNoZWNrZWQgPSB0aGlzLmtleXNDaGVja2VkKCk/LnNvbWUoKGtleSkgPT4ga2V5ID09PSBncm91cC5pdGVtW3RoaXMuZmllbGRLZXkoKV0pO1xuXG4gICAgICAgICAgICByZXR1cm4gZ3JvdXA7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBlZmZlY3QoKCkgPT4ge1xuICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHRoaXMua2V5c0Rpc2FibGUoKSkgfHwgIXRoaXMuZmllbGRLZXkoKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB1bnRyYWNrZWQoKCkgPT4ge1xuICAgICAgICB0aGlzLmdyb3Vwcy51cGRhdGUoKGRhdGEpID0+IHtcbiAgICAgICAgICByZXR1cm4gZGF0YS5tYXAoKGdyb3VwKSA9PiB7XG4gICAgICAgICAgICBncm91cC5kaXNhYmxlQnlLZXlzID0gZmFsc2U7XG4gICAgICAgICAgICBpZiAoZ3JvdXAuaXRlbSAmJiB0aGlzLmtleXNEaXNhYmxlKCk/LmluY2x1ZGVzKGdyb3VwLml0ZW1bdGhpcy5maWVsZEtleSgpXSkpIHtcbiAgICAgICAgICAgICAgZ3JvdXAuZGlzYWJsZUJ5S2V5cyA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZ3JvdXA7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICAvKiBGVU5DVElPTlMgKi9cbiAgbmdPbkluaXQoKSB7XG4gICAgdGhpcy5vdXRGdW5jdGlvbnNDb250cm9sLmVtaXQodGhpcy5GdW5jdGlvbnNDb250cm9sKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgRnVuY3Rpb25zQ29udHJvbCgpOiBJQ2hlY2tib3hHcm91cEZ1bmN0aW9uQ29udHJvbEV2ZW50IHtcbiAgICByZXR1cm4ge1xuICAgICAgY2hlY2tJc1ZhbGlkOiB0aGlzLmNoZWNrVmFsaWQuYmluZCh0aGlzKSxcbiAgICAgIHJlc2V0RXJyb3I6IHRoaXMucmVzZXRFcnJvci5iaW5kKHRoaXMpLFxuICAgICAgcmVzZXQ6IGFzeW5jICgpID0+IHtcbiAgICAgICAgdGhpcy5ncm91cHMudXBkYXRlKChkYXRhKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIGRhdGEubWFwKChncm91cCkgPT4ge1xuICAgICAgICAgICAgZ3JvdXAuaXRlbS5jaGVja2VkID0gZmFsc2U7XG4gICAgICAgICAgICByZXR1cm4gZ3JvdXA7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLnJlc2V0RXJyb3IoKTtcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIC8vICNyZWdpb24gRlVOQ1RJT05TXG4gIHByb3RlY3RlZCBoYW5kbGVyQ2hhbmdlKGV2ZW50OiBJQ2hlY2tib3hFdmVudCwgaXRlbTogSUNoZWNrYm94SXRlbSkge1xuICAgIGlmICh0aGlzLmRpc2FibGUoKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpdGVtLmNoZWNrZWQgPSBldmVudC5jaGVja2VkO1xuICAgIGV2ZW50LmFsbENoZWNrYm94Q2hlY2tlZCA9IHRoaXMuZ3JvdXBzKClcbiAgICAgIC5maWx0ZXIoKGdyb3VwKSA9PiBncm91cC5pdGVtLmNoZWNrZWQpXG4gICAgICAubWFwKChncm91cCkgPT4gKHsga2V5OiBncm91cC5pdGVtW3RoaXMuZmllbGRLZXkoKV0sIGl0ZW06IGdyb3VwLml0ZW0gfSkpO1xuICAgIHRoaXMub3V0Q2hhbmdlLmVtaXQoZXZlbnQpO1xuICAgIHRoaXMuY2hlY2tWYWxpZCgpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBjaGVja1ZhbGlkKCkge1xuICAgIHRoaXMuZXJyb3Iuc2V0KGZhbHNlKTtcbiAgICBpZiAoIXRoaXMudmFsaWRSZXF1aXJlZCgpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgdGhpcy5lcnJvci5zZXQoIXRoaXMuZ3JvdXBzKCkuc29tZSgoZ3JvdXApID0+IGdyb3VwLml0ZW0uY2hlY2tlZCkpO1xuXG4gICAgcmV0dXJuICF0aGlzLmVycm9yKCk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHJlc2V0RXJyb3IoKSB7XG4gICAgdGhpcy5lcnJvci5zZXQoZmFsc2UpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGhhbmRsZXJFdmVudFBvcG92ZXIoZXZlbnQ6IFRZUEVfUE9QT1ZFUl9FVkVOVCwgaXRlbTogSUNoZWNrYm94SXRlbSkge1xuICAgIGl0ZW0ub3V0RXZlbnRQb3BvdmVyPy4oZXZlbnQpO1xuICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbCB3LWZ1bGxcIj5cbiAgQGlmIChsYWJlbENvbmZpZygpOyBhcyBsYWJlbENvbmZpZykge1xuICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtbGFiZWxcbiAgICAgIFtjbGFzc0luY2x1ZGVdPVwibGFiZWxDb25maWcuY2xhc3NJbmNsdWRlXCJcbiAgICAgIFtsYWJlbExlZnRdPVwibGFiZWxDb25maWcubGFiZWxMZWZ0XCJcbiAgICAgIFtsYWJlbExlZnRDbGFzc109XCJsYWJlbENvbmZpZy5sYWJlbExlZnRDbGFzc1wiXG4gICAgICBbcmVxdWlyZWRdPVwibGFiZWxDb25maWcucmVxdWlyZWRcIlxuICAgICAgW2Rlc2NyaXB0aW9uXT1cImxhYmVsQ29uZmlnLmRlc2NyaXB0aW9uXCJcbiAgICAgIFtsYWJlbFJpZ2h0XT1cImxhYmVsQ29uZmlnLmxhYmVsUmlnaHRcIlxuICAgICAgW2xhYmVsUmlnaHRDbGFzc109XCJsYWJlbENvbmZpZy5sYWJlbFJpZ2h0Q2xhc3NcIlxuICAgICAgW29ubHlTaG93Q291bnRdPVwibGFiZWxDb25maWcub25seVNob3dDb3VudFwiXG4gICAgICBbYnV0dG9uc0xlZnRdPVwibGFiZWxDb25maWcuYnV0dG9uc0xlZnRcIlxuICAgICAgW2Rpc2FibGVCdXR0b25zTGVmdF09XCJsYWJlbENvbmZpZy5kaXNhYmxlQnV0dG9uc0xlZnQgfHwgZGlzYWJsZSgpXCJcbiAgICAgIFtoYXNUb2dnbGVdPVwibGFiZWxDb25maWcuaGFzVG9nZ2xlXCJcbiAgICAgIFt0b2dnbGVBY3RpdmVdPVwibGFiZWxDb25maWcudG9nZ2xlQWN0aXZlXCJcbiAgICAgIFt0b2dnbGVEaXNhYmxlXT1cImxhYmVsQ29uZmlnLnRvZ2dsZURpc2FibGUgfHwgZGlzYWJsZSgpXCJcbiAgICAgIFtwb3BvdmVyXT1cImxhYmVsQ29uZmlnLnBvcG92ZXJcIlxuICAgICAgW2ljb25Qb3BvdmVyQ2xhc3NdPVwibGFiZWxDb25maWcuaWNvblBvcG92ZXJDbGFzc1wiXG4gICAgICBbb25seVNob3dDb3VudF09XCJsYWJlbENvbmZpZy5vbmx5U2hvd0NvdW50XCJcbiAgICAgIFtsaW1pdExlbmd0aF09XCJsYWJlbENvbmZpZy5saW1pdExlbmd0aFwiXG4gICAgICBbYnV0dG9uc0Rlc2NyaXB0aW9uXT1cImxhYmVsQ29uZmlnLmJ1dHRvbnNEZXNjcmlwdGlvblwiXG4gICAgICBbZGlzYWJsZUJ1dHRvbnNEZXNjcmlwdGlvbl09XCJsYWJlbENvbmZpZy5kaXNhYmxlQnV0dG9uc0Rlc2NyaXB0aW9uIHx8IGRpc2FibGUoKVwiXG4gICAgICBbYnV0dG9uc0Rlc2NyaXB0aW9uQ29udGFpbmVyQ2xhc3NdPVwibGFiZWxDb25maWcuYnV0dG9uc0Rlc2NyaXB0aW9uQ29udGFpbmVyQ2xhc3NcIlxuICAgICAgW2NvdW50XT1cImxhYmVsQ29uZmlnLmNvdW50XCIgLz5cbiAgfVxuICBAaWYgKCFzaG93VmFsaWRhdGVCb3R0b20oKSkge1xuICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJ0ZW1wbGF0ZVZhbGlkYXRlXCI+PC9uZy1jb250YWluZXI+XG4gIH1cbiAgPGRpdiBjbGFzcz1cImxpYnMtdWktY2hlY2tib3gtZ3JvdXAge3sgaG9yaXpvbnRhbCgpID8gY2xhc3NHcm91cFdoZW5Nb2RlSG9yaXpvbnRhbCgpIDogJycgfX1cIj5cbiAgICBAZm9yIChncm91cCBvZiBncm91cHMoKTsgdHJhY2sgZ3JvdXApIHtcbiAgICAgIDxkaXYgW2NsYXNzXT1cImhvcml6b250YWwoKSA/IGNsYXNzSXRlbVdoZW5Nb2RlSG9yaXpvbnRhbCgpIDogJydcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInB5LVs0cHhdIHt7IGdyb3VwLml0ZW0uY2xhc3NJbmNsdWRlV3JhcHBlciB8fCAnJyB9fVwiPlxuICAgICAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtY2hlY2tib3gtc2luZ2xlXG4gICAgICAgICAgICBbbGFiZWxdPVwiZ3JvdXAuaXRlbS5sYWJlbCB8fCAnICdcIlxuICAgICAgICAgICAgW2NoZWNrZWRdPVwiZ3JvdXAuaXRlbS5jaGVja2VkIHx8IGZhbHNlXCJcbiAgICAgICAgICAgIFtrZXldPVwiZ3JvdXAuaXRlbVtmaWVsZEtleSgpXVwiXG4gICAgICAgICAgICBbZGlzYWJsZV09XCJncm91cC5kaXNhYmxlQnlLZXlzIHx8IGRpc2FibGUoKSB8fCBncm91cC5pdGVtLmRpc2FibGUgfHwgZmFsc2VcIlxuICAgICAgICAgICAgW2Rpc2FibGVMYWJlbF09XCJncm91cC5pdGVtLmRpc2FibGVMYWJlbCB8fCBmYWxzZVwiXG4gICAgICAgICAgICBbY2xhc3NMYWJlbEluY2x1ZGVdPVwiY2xhc3NMYWJlbEluY2x1ZGUoKSB8fCBncm91cC5pdGVtLmNsYXNzTGFiZWxJbmNsdWRlIHx8ICcnXCJcbiAgICAgICAgICAgIFtjbGFzc0luY2x1ZGVdPVwiY2xhc3NJbmNsdWRlKCkgfHwgZ3JvdXAuaXRlbS5jbGFzc0luY2x1ZGUgfHwgJydcIlxuICAgICAgICAgICAgW3BvcG92ZXJdPVwiZ3JvdXAuaXRlbS5wb3BvdmVyXCJcbiAgICAgICAgICAgIFthdmF0YXJDb25maWddPVwiZ3JvdXAuaXRlbS5hdmF0YXJDb25maWdcIlxuICAgICAgICAgICAgW2Rlc2NyaXB0aW9uXT1cImdyb3VwLml0ZW0uZGVzY3JpcHRpb25cIlxuICAgICAgICAgICAgW3R5cGVMYWJlbFBvcG92ZXJdPVwiZ3JvdXAuaXRlbS50eXBlTGFiZWxQb3BvdmVyIHx8ICd0ZXh0J1wiXG4gICAgICAgICAgICBbaWdub3JlU2hvd1BvcG92ZXJMYWJlbF09XCJncm91cC5pdGVtLmlnbm9yZVNob3dQb3BvdmVyTGFiZWwgfHwgZmFsc2VcIlxuICAgICAgICAgICAgW2NsaWNrRXhhY3RseV09XCJjbGlja0V4YWN0bHkoKVwiXG4gICAgICAgICAgICBbbW9kZUJvcmRlcl09XCJtb2RlQm9yZGVyKClcIlxuICAgICAgICAgICAgW3Nob3dCb3JkZXJFcnJvcl09XCJlcnJvcigpICYmIHZhbGlkUmVxdWlyZWQoKT8uaGFzQm9yZGVyRXJyb3JDaGVja2JveFwiXG4gICAgICAgICAgICAob3V0Q2hhbmdlKT1cImhhbmRsZXJDaGFuZ2UoJGV2ZW50LCBncm91cC5pdGVtKVwiXG4gICAgICAgICAgICAob3V0RXZlbnRQb3BvdmVyKT1cImhhbmRsZXJFdmVudFBvcG92ZXIoJGV2ZW50LCBncm91cC5pdGVtKVwiIC8+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICBAaWYgKGdyb3VwLml0ZW0uY2hlY2tlZCkge1xuICAgICAgICAgIEBpZiAoZ3JvdXAuc3ViVGV4dCkge1xuICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICBjbGFzcz1cImxpYnMtdWktY2hlY2tib3gtZ3JvdXAtc3ViLXRleHQgbGlicy11aS1mb250LWg3ciB7eyBncm91cC5jbGFzc0luY2x1ZGVTdWJUZXh0IHx8ICcnIH19XCJcbiAgICAgICAgICAgICAgW2lubmVySHRtbF09XCJncm91cC5zdWJUZXh0XCI+PC9kaXY+XG4gICAgICAgICAgfVxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJncm91cD8uc3ViVGVtcGxhdGUgfHwgbnVsbDsgY29udGV4dDogeyBpdGVtOiBncm91cC5pdGVtIH1cIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgfVxuICAgICAgPC9kaXY+XG4gICAgfVxuICA8L2Rpdj5cbiAgQGlmIChzaG93VmFsaWRhdGVCb3R0b20oKSkge1xuICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJ0ZW1wbGF0ZVZhbGlkYXRlXCI+PC9uZy1jb250YWluZXI+XG4gIH1cbjwvZGl2PlxuXG48bmctdGVtcGxhdGUgI3RlbXBsYXRlVmFsaWRhdGU+XG4gIEBpZiAoZXJyb3IoKSkge1xuICAgIDxkaXZcbiAgICAgIGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXJcIlxuICAgICAgW2NsYXNzLm1iLVs4cHhdXT1cIiFzaG93VmFsaWRhdGVCb3R0b20oKVwiXG4gICAgICBbY2xhc3MubXQtWzhweF1dPVwic2hvd1ZhbGlkYXRlQm90dG9tKClcIj5cbiAgICAgIEBsZXQgY29uc3RIdG1sTWVzc2FnZSA9IHZhbGlkUmVxdWlyZWQoKT8ubWVzc2FnZSB8fCBFUlJPUl9NRVNTQUdFX0VNUFRZX1ZBTElEO1xuICAgICAgPHNwYW5cbiAgICAgICAgY2xhc3M9XCJsaWJzLXVpLXRleHQtZXJyb3IgbGlicy11aS1mb250LWg3clwiXG4gICAgICAgIFtpbm5lckh0bWxdPVwiY29uc3RIdG1sTWVzc2FnZSB8IHRyYW5zbGF0ZTogdmFsaWRSZXF1aXJlZCgpPy5pbnRlcnBvbGF0ZVBhcmFtc1wiPjwvc3Bhbj5cbiAgICA8L2Rpdj5cbiAgfVxuPC9uZy10ZW1wbGF0ZT5cbiJdfQ==
@@ -1,2 +1,2 @@
1
1
  export {};
2
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JvdXAuaW50ZXJmYWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy11aS9jb21wb25lbnRzL2NoZWNrYm94L2dyb3VwL3NyYy9pbnRlcmZhY2VzL2dyb3VwLmludGVyZmFjZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgVGVtcGxhdGVSZWYgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IElBdmF0YXJDb25maWcgfSBmcm9tICdAbGlicy11aS9jb21wb25lbnRzLWF2YXRhcic7XG5pbXBvcnQgeyBJQ2hlY2tib3hCdWxsZXQsIElDaGVja2JveEl0ZW1EZXNjcmlwdGlvbiB9IGZyb20gJ0BsaWJzLXVpL2NvbXBvbmVudHMtY2hlY2tib3gtc2luZ2xlJztcbmltcG9ydCB7IElQb3BvdmVyLCBUWVBFX1BPUE9WRVJfRVZFTlQsIFRZUEVfUE9QT1ZFUl9UWVBFIH0gZnJvbSAnQGxpYnMtdWkvY29tcG9uZW50cy1wb3BvdmVyJztcbmltcG9ydCB7IFRZUEVfVEVNUExBVEVfUkVGIH0gZnJvbSAnQGxpYnMtdWkvaW50ZXJmYWNlcy10eXBlcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUNoZWNrYm94R3JvdXBJdGVtIHtcbiAgaXRlbTogSUNoZWNrYm94SXRlbTtcbiAgc3ViVGV4dD86IHN0cmluZztcbiAgY2xhc3NJbmNsdWRlU3ViVGV4dD86IHN0cmluZztcbiAgc3ViVGVtcGxhdGU/OiBUZW1wbGF0ZVJlZjxUWVBFX1RFTVBMQVRFX1JFRj47XG4gIGRpc2FibGVCeUtleXM/OiBib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElDaGVja2JveEdyb3VwVmFsaWRSZXF1aXJlZCB7XG4gIG1lc3NhZ2U/OiBzdHJpbmc7XG4gIGhhc0JvcmRlckVycm9yQ2hlY2tib3g/OiBib29sZWFuO1xuICBpbnRlcnBvbGF0ZVBhcmFtcz86IGFueTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJQ2hlY2tib3hJdGVtIHtcbiAga2V5Pzogc3RyaW5nO1xuICBjaGVja2VkPzogYm9vbGVhbjtcbiAgbGFiZWw/OiBzdHJpbmc7XG4gIGNsYXNzTGFiZWxJbmNsdWRlPzogc3RyaW5nO1xuICBwb3BvdmVyPzogSVBvcG92ZXI7XG4gIGF2YXRhckNvbmZpZz86IElBdmF0YXJDb25maWc7XG4gIGxpbmtJbWFnZT86IHN0cmluZztcbiAgbGlua0ltYWdlRXJyb3I/OiBzdHJpbmc7XG4gIGNsYXNzSW1hZ2VJbmNsdWRlPzogc3RyaW5nO1xuICBidWxsZXQ/OiBJQ2hlY2tib3hCdWxsZXQ7XG4gIGNsYXNzSW5jbHVkZT86IHN0cmluZztcbiAgY2xpY2tFeGFjdGx5PzogYm9vbGVhbjtcbiAgZGlzYWJsZT86IGJvb2xlYW47XG4gIGRpc2FibGVMYWJlbD86IGJvb2xlYW47XG4gIGlnbm9yZVBvcG92ZXJMYWJlbD86IGJvb2xlYW47XG4gIG91dEV2ZW50UG9wb3Zlcj86IChldmVudDogVFlQRV9QT1BPVkVSX0VWRU5UKSA9PiB2b2lkO1xuICBkZXNjcmlwdGlvbj86IElDaGVja2JveEl0ZW1EZXNjcmlwdGlvbjtcbiAgY2xhc3NJbmNsdWRlV3JhcHBlcj86IHN0cmluZztcbiAgdHlwZUxhYmVsUG9wb3Zlcj86IFRZUEVfUE9QT1ZFUl9UWVBFO1xuICBpZ25vcmVTaG93UG9wb3ZlckxhYmVsPzogYm9vbGVhbjtcbiAgW2tleTogc3RyaW5nXTogYW55O1xufVxuIl19
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JvdXAuaW50ZXJmYWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy11aS9jb21wb25lbnRzL2NoZWNrYm94L2dyb3VwL3NyYy9pbnRlcmZhY2VzL2dyb3VwLmludGVyZmFjZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgVGVtcGxhdGVSZWYgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IElBdmF0YXJDb25maWcgfSBmcm9tICdAbGlicy11aS9jb21wb25lbnRzLWF2YXRhcic7XG5pbXBvcnQgeyBJQ2hlY2tib3hCdWxsZXQsIElDaGVja2JveEl0ZW1EZXNjcmlwdGlvbiB9IGZyb20gJ0BsaWJzLXVpL2NvbXBvbmVudHMtY2hlY2tib3gtc2luZ2xlJztcbmltcG9ydCB7IElQb3BvdmVyLCBUWVBFX1BPUE9WRVJfRVZFTlQsIFRZUEVfUE9QT1ZFUl9UWVBFIH0gZnJvbSAnQGxpYnMtdWkvY29tcG9uZW50cy1wb3BvdmVyJztcbmltcG9ydCB7IFRZUEVfVEVNUExBVEVfUkVGIH0gZnJvbSAnQGxpYnMtdWkvaW50ZXJmYWNlcy10eXBlcyc7XG5cbi8qKlxuICogQ+G6pXUgaMOsbmggY2hvIG3hu5l0IGl0ZW0gdHJvbmcgbmjDs20gY2hlY2tib3hcbiAqIEBpbnRlcmZhY2UgSUNoZWNrYm94R3JvdXBJdGVtXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSUNoZWNrYm94R3JvdXBJdGVtIHtcbiAgLyoqIEPhuqV1IGjDrG5oIGNoaSB0aeG6v3QgY+G7p2EgY2hlY2tib3ggaXRlbSAoZOG7sWEgdHLDqm4gTGlic1VpQ29tcG9uZW50c0NoZWNrYm94U2luZ2xlQ29tcG9uZW50KSAqL1xuICBpdGVtOiBJQ2hlY2tib3hJdGVtO1xuICAvKiogVsSDbiBi4bqjbiBi4buVIHN1bmcgaGnhu4NuIHRo4buLIGLDqm4gZMaw4bubaSBob+G6t2MgYsOqbiBj4bqhbmggaXRlbSAodMO5eSB0ZW1wbGF0ZSkgKi9cbiAgc3ViVGV4dD86IHN0cmluZztcbiAgLyoqIENsYXNzIENTUyBi4buVIHN1bmcgY2hvIHBo4bqnbiBzdWJUZXh0ICovXG4gIGNsYXNzSW5jbHVkZVN1YlRleHQ/OiBzdHJpbmc7XG4gIC8qKiBUZW1wbGF0ZSB0w7l5IGNo4buJbmggxJHhu4MgcmVuZGVyIG7hu5lpIGR1bmcgYuG7lSBzdW5nIGNobyBpdGVtICovXG4gIHN1YlRlbXBsYXRlPzogVGVtcGxhdGVSZWY8VFlQRV9URU1QTEFURV9SRUY+O1xuICAvKiogVHLhuqFuZyB0aMOhaSB2w7QgaGnhu4d1IGjDs2EgZOG7sWEgdHLDqm4gZGFuaCBzw6FjaCBjw6FjIGtleXMgYuG7iyBraMOzYSAqL1xuICBkaXNhYmxlQnlLZXlzPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBD4bqldSBow6xuaCB2YWxpZGF0aW9uIGLhuq90IGJ14buZYyBjaOG7jW4gY2hvIG5ow7NtIGNoZWNrYm94XG4gKiBAaW50ZXJmYWNlIElDaGVja2JveEdyb3VwVmFsaWRSZXF1aXJlZFxuICovXG5leHBvcnQgaW50ZXJmYWNlIElDaGVja2JveEdyb3VwVmFsaWRSZXF1aXJlZCB7XG4gIC8qKiBUaMO0bmcgYsOhbyBs4buXaSBraGkga2jDtG5nIGPDsyBpdGVtIG7DoG8gxJHGsOG7o2MgY2jhu41uICovXG4gIG1lc3NhZ2U/OiBzdHJpbmc7XG4gIC8qKiBIaeG7g24gdGjhu4sgdmnhu4FuIMSR4buPIGNobyBjw6FjIMO0IGNoZWNrYm94IGtoaSBjw7MgbOG7l2kgdmFsaWRhdGlvbiAqL1xuICBoYXNCb3JkZXJFcnJvckNoZWNrYm94PzogYm9vbGVhbjtcbiAgLyoqIEPDoWMgdGhhbSBz4buRIG7hu5lpIHN1eSBjaG8gdGjDtG5nIGLDoW8gbOG7l2kgKHPhu60gZOG7pW5nIHbhu5tpIGkxOG4pICovXG4gIGludGVycG9sYXRlUGFyYW1zPzogYW55O1xufVxuXG4vKipcbiAqIEPhuqV1IGjDrG5oIGThu68gbGnhu4d1IGNobyBt4buZdCBjaGVja2JveCBpdGVtIHRyb25nIG5ow7NtXG4gKiBAaW50ZXJmYWNlIElDaGVja2JveEl0ZW1cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJQ2hlY2tib3hJdGVtIHtcbiAgLyoqIEtow7NhIMSR4buLbmggZGFuaCBkdXkgbmjhuqV0IGPhu6dhIGl0ZW0gKi9cbiAga2V5Pzogc3RyaW5nO1xuICAvKiogVHLhuqFuZyB0aMOhaSBjaOG7jW4gY+G7p2EgY2hlY2tib3ggKi9cbiAgY2hlY2tlZD86IGJvb2xlYW47XG4gIC8qKiBOaMOjbiB2xINuIGLhuqNuIGhp4buDbiB0aOG7iyBj4bqhbmggY2hlY2tib3ggKi9cbiAgbGFiZWw/OiBzdHJpbmc7XG4gIC8qKiBDbGFzcyBDU1MgYuG7lSBzdW5nIGNobyBuaMOjbiAqL1xuICBjbGFzc0xhYmVsSW5jbHVkZT86IHN0cmluZztcbiAgLyoqIEPhuqV1IGjDrG5oIHBvcG92ZXIga2hpIGRpIGNodeG7mXQgdsOgbyBuaMOjbiAqL1xuICBwb3BvdmVyPzogSVBvcG92ZXI7XG4gIC8qKiBD4bqldSBow6xuaCBBdmF0YXIgaGnhu4NuIHRo4buLIGPhuqFuaCBjaGVja2JveCAqL1xuICBhdmF0YXJDb25maWc/OiBJQXZhdGFyQ29uZmlnO1xuICAvKiogVVJMIGjDrG5oIOG6o25oIGhp4buDbiB0aOG7iyBj4bqhbmggY2hlY2tib3ggKi9cbiAgbGlua0ltYWdlPzogc3RyaW5nO1xuICAvKiogVVJMIGjDrG5oIOG6o25oIGThu7EgcGjDsm5nIGtoaSBsb2FkIGzhu5dpICovXG4gIGxpbmtJbWFnZUVycm9yPzogc3RyaW5nO1xuICAvKiogQ2xhc3MgQ1NTIGLhu5Ugc3VuZyBjaG8gcGjhuqduIGjDrG5oIOG6o25oICovXG4gIGNsYXNzSW1hZ2VJbmNsdWRlPzogc3RyaW5nO1xuICAvKiogQ+G6pXUgaMOsbmggYnVsbGV0IChjaOG6pW0gdHLDsm4gbcOgdSkgKi9cbiAgYnVsbGV0PzogSUNoZWNrYm94QnVsbGV0O1xuICAvKiogQ2xhc3MgQ1NTIGLhu5Ugc3VuZyBjaG8gd3JhcHBlciBj4bunYSBjaGVja2JveCBpdGVtICovXG4gIGNsYXNzSW5jbHVkZT86IHN0cmluZztcbiAgLyoqIE7hur91IHRydWUsIGNo4buJIGNsaWNrIHbDoG8gY2hlY2tib3gvbGFiZWwgbeG7m2kgxJHhu5VpIHRy4bqhbmcgdGjDoWkgKi9cbiAgY2xpY2tFeGFjdGx5PzogYm9vbGVhbjtcbiAgLyoqIFRy4bqhbmcgdGjDoWkgdsO0IGhp4buHdSBow7NhIGPhu6dhIGNoZWNrYm94ICovXG4gIGRpc2FibGU/OiBib29sZWFuO1xuICAvKiogVHLhuqFuZyB0aMOhaSB2w7QgaGnhu4d1IGjDs2EgdMawxqFuZyB0w6FjIGNsaWNrIHRyw6puIG5ow6NuICovXG4gIGRpc2FibGVMYWJlbD86IGJvb2xlYW47XG4gIC8qKiBC4buPIHF1YSB2aeG7h2MgaGnhu4NuIHRo4buLIHBvcG92ZXIgdHLDqm4gbmjDo24gKi9cbiAgaWdub3JlUG9wb3ZlckxhYmVsPzogYm9vbGVhbjtcbiAgLyoqIENhbGxiYWNrIHjhu60gbMO9IHPhu7Ega2nhu4duIHThu6sgcG9wb3ZlciAqL1xuICBvdXRFdmVudFBvcG92ZXI/OiAoZXZlbnQ6IFRZUEVfUE9QT1ZFUl9FVkVOVCkgPT4gdm9pZDtcbiAgLyoqIE3DtCB04bqjIGNoaSB0aeG6v3QgaGnhu4NuIHRo4buLIGTGsOG7m2kgbmjDo24gKi9cbiAgZGVzY3JpcHRpb24/OiBJQ2hlY2tib3hJdGVtRGVzY3JpcHRpb247XG4gIC8qKiBDbGFzcyBDU1MgYuG7lSBzdW5nIGNobyBwaOG6p24gYmFvIHF1YW5oIGl0ZW0gKi9cbiAgY2xhc3NJbmNsdWRlV3JhcHBlcj86IHN0cmluZztcbiAgLyoqIExv4bqhaSBu4buZaSBkdW5nIHBvcG92ZXIgKCd0ZXh0JyB8ICdjb21wb25lbnQnKSAqL1xuICB0eXBlTGFiZWxQb3BvdmVyPzogVFlQRV9QT1BPVkVSX1RZUEU7XG4gIC8qKiDhuqhuIHBvcG92ZXIga2hpIGRpIGNodeG7mXQgdsOgbyBuaMOjbiAqL1xuICBpZ25vcmVTaG93UG9wb3ZlckxhYmVsPzogYm9vbGVhbjtcbiAgLyoqIEPDoWMgdGh14buZYyB0w61uaCBt4bufIHLhu5luZyBraMOhYyAqL1xuICBba2V5OiBzdHJpbmddOiBhbnk7XG59XG4iXX0=
@@ -7,28 +7,67 @@ import { ERROR_MESSAGE_EMPTY_VALID } from '@libs-ui/utils';
7
7
  import * as i1 from '@ngx-translate/core';
8
8
  import { TranslateModule } from '@ngx-translate/core';
9
9
 
10
+ /**
11
+ * Checkbox Group Component - Một tập hợp các checkbox đơn lẻ trong một nhóm.
12
+ *
13
+ * @description
14
+ * Hỗ trợ quản lý danh sách các checkbox, xử lý trạng thái chọn hàng loạt,
15
+ * cấu hình layout (ngang/dọc), và tích hợp validation bắt buộc chọn.
16
+ *
17
+ * @example
18
+ * ```html
19
+ * <libs_ui-components-checkbox-group
20
+ * [(groups)]="options"
21
+ * [labelConfig]="{ label: 'Chọn kỹ năng' }"
22
+ * (outChange)="onSelectionChange($event)"
23
+ * />
24
+ * ```
25
+ *
26
+ * @publicApi
27
+ */
10
28
  class LibsUiComponentsCheckboxGroupComponent {
11
29
  // #region PROPERTY
12
30
  ERROR_MESSAGE_EMPTY_VALID = ERROR_MESSAGE_EMPTY_VALID;
31
+ /** Signal điều khiển trạng thái hiển thị lỗi validation */
13
32
  error = signal(false);
14
33
  // #region INPUT
34
+ /**
35
+ * Danh sách các item trong nhóm checkbox.
36
+ * Model hỗ trợ two-way binding để cập nhật trạng thái checked của các item.
37
+ */
15
38
  groups = model.required();
39
+ /** Tên trường đóng vai trò là khóa định danh trong item dữ liệu (mặc định: 'key') */
16
40
  fieldKey = input('key', { transform: (value) => value || 'key' });
41
+ /** Danh sách các keys cần được set trạng thái checked khi khởi tạo hoặc thay đổi */
17
42
  keysChecked = input();
43
+ /** Danh sách các keys cần được set trạng thái disable */
18
44
  keysDisable = input();
45
+ /** Trạng thái vô hiệu hóa toàn bộ nhóm checkbox */
19
46
  disable = input(false, { transform: (value) => value ?? false });
47
+ /** Nếu true, chỉ click vào checkbox/label mới đổi trạng thái. Nếu false, click vào vùng bao quanh item sẽ trigger */
20
48
  clickExactly = input(true, { transform: (value) => value ?? true });
49
+ /** Hiển thị các checkbox theo hàng ngang (mặc định: dọc) */
21
50
  horizontal = input(false, { transform: (value) => value ?? false });
51
+ /** Cấu hình nhãn (Label) tổng quát cho toàn bộ nhóm */
22
52
  labelConfig = input();
53
+ /** Cấu hình validation bắt buộc người dùng phải chọn ít nhất một item */
23
54
  validRequired = input();
55
+ /** Class CSS bổ sung cho container chính của nhóm */
24
56
  classInclude = input();
57
+ /** Class CSS bổ sung cho nhãn của nhóm */
25
58
  classLabelInclude = input();
59
+ /** Hiển thị thông báo lỗi validation ở phía dưới nhóm */
26
60
  showValidateBottom = input();
61
+ /** Class CSS cho item khi hiển thị ở chế độ nằm ngang */
27
62
  classItemWhenModeHorizontal = input('mr-[24px]');
63
+ /** Class CSS cho wrapper nhóm khi hiển thị ở chế độ nằm ngang */
28
64
  classGroupWhenModeHorizontal = input('flex');
65
+ /** Hiển thị viền bao quanh toàn bộ nhóm component */
29
66
  modeBorder = input();
30
67
  // #region OUTPUT
68
+ /** Phát ra khi bất kỳ checkbox nào trong nhóm thay đổi trạng thái */
31
69
  outChange = output();
70
+ /** Phát ra object chứa các hàm điều khiển (API) của component lên component cha */
32
71
  outFunctionsControl = output();
33
72
  constructor() {
34
73
  effect(() => {
@@ -1 +1 @@
1
- {"version":3,"file":"libs-ui-components-checkbox-group.mjs","sources":["../../../../../../libs-ui/components/checkbox/group/src/checkbox-group.component.ts","../../../../../../libs-ui/components/checkbox/group/src/checkbox-group.component.html","../../../../../../libs-ui/components/checkbox/group/src/libs-ui-components-checkbox-group.ts"],"sourcesContent":["import { NgTemplateOutlet } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, effect, input, model, OnInit, output, signal, untracked } from '@angular/core';\nimport { ICheckboxEvent, LibsUiComponentsCheckboxSingleComponent } from '@libs-ui/components-checkbox-single';\nimport { ILabel, LibsUiComponentsLabelComponent } from '@libs-ui/components-label';\nimport { TYPE_POPOVER_EVENT } from '@libs-ui/components-popover';\nimport { ERROR_MESSAGE_EMPTY_VALID } from '@libs-ui/utils';\nimport { TranslateModule } from '@ngx-translate/core';\nimport { ICheckboxGroupFunctionControlEvent } from './interfaces/function-control.interface';\nimport { ICheckboxGroupItem, ICheckboxGroupValidRequired, ICheckboxItem } from './interfaces/group.interface';\n\n@Component({\n // eslint-disable-next-line @angular-eslint/component-selector\n selector: 'libs_ui-components-checkbox-group',\n templateUrl: './checkbox-group.component.html',\n styleUrl: './checkbox-group.component.scss',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [TranslateModule, NgTemplateOutlet, LibsUiComponentsLabelComponent, LibsUiComponentsCheckboxSingleComponent],\n})\nexport class LibsUiComponentsCheckboxGroupComponent implements OnInit {\n // #region PROPERTY\n protected readonly ERROR_MESSAGE_EMPTY_VALID = ERROR_MESSAGE_EMPTY_VALID;\n protected error = signal<boolean>(false);\n\n // #region INPUT\n readonly groups = model.required<Array<ICheckboxGroupItem>>();\n readonly fieldKey = input<string, string>('key', { transform: (value) => value || 'key' });\n readonly keysChecked = input<Array<string>>();\n readonly keysDisable = input<Array<string>>();\n readonly disable = input<boolean | undefined, boolean | undefined>(false, { transform: (value) => value ?? false });\n readonly clickExactly = input<boolean | undefined, boolean | undefined>(true, { transform: (value) => value ?? true });\n readonly horizontal = input<boolean | undefined, boolean | undefined>(false, { transform: (value) => value ?? false });\n readonly labelConfig = input<ILabel>();\n readonly validRequired = input<ICheckboxGroupValidRequired>();\n readonly classInclude = input<string>();\n readonly classLabelInclude = input<string>();\n readonly showValidateBottom = input<boolean>();\n readonly classItemWhenModeHorizontal = input<string>('mr-[24px]');\n readonly classGroupWhenModeHorizontal = input<string>('flex');\n readonly modeBorder = input<boolean>();\n\n // #region OUTPUT\n readonly outChange = output<ICheckboxEvent>();\n readonly outFunctionsControl = output<ICheckboxGroupFunctionControlEvent>();\n\n constructor() {\n effect(() => {\n if (!Array.isArray(this.keysChecked()) || !this.fieldKey()) {\n return;\n }\n untracked(() => {\n this.groups.update((data) => {\n return data.map((group) => {\n group.item.checked = this.keysChecked()?.some((key) => key === group.item[this.fieldKey()]);\n\n return group;\n });\n });\n });\n });\n\n effect(() => {\n if (!Array.isArray(this.keysDisable()) || !this.fieldKey()) {\n return;\n }\n untracked(() => {\n this.groups.update((data) => {\n return data.map((group) => {\n group.disableByKeys = false;\n if (group.item && this.keysDisable()?.includes(group.item[this.fieldKey()])) {\n group.disableByKeys = true;\n }\n return group;\n });\n });\n });\n });\n }\n\n /* FUNCTIONS */\n ngOnInit() {\n this.outFunctionsControl.emit(this.FunctionsControl);\n }\n\n public get FunctionsControl(): ICheckboxGroupFunctionControlEvent {\n return {\n checkIsValid: this.checkValid.bind(this),\n resetError: this.resetError.bind(this),\n reset: async () => {\n this.groups.update((data) => {\n return data.map((group) => {\n group.item.checked = false;\n return group;\n });\n });\n this.resetError();\n },\n };\n }\n\n // #region FUNCTIONS\n protected handlerChange(event: ICheckboxEvent, item: ICheckboxItem) {\n if (this.disable()) {\n return;\n }\n item.checked = event.checked;\n event.allCheckboxChecked = this.groups()\n .filter((group) => group.item.checked)\n .map((group) => ({ key: group.item[this.fieldKey()], item: group.item }));\n this.outChange.emit(event);\n this.checkValid();\n }\n\n private async checkValid() {\n this.error.set(false);\n if (!this.validRequired()) {\n return true;\n }\n this.error.set(!this.groups().some((group) => group.item.checked));\n\n return !this.error();\n }\n\n private async resetError() {\n this.error.set(false);\n }\n\n protected handlerEventPopover(event: TYPE_POPOVER_EVENT, item: ICheckboxItem) {\n item.outEventPopover?.(event);\n }\n}\n","<div class=\"flex flex-col w-full\">\n @if (labelConfig(); as labelConfig) {\n <libs_ui-components-label\n [classInclude]=\"labelConfig.classInclude\"\n [labelLeft]=\"labelConfig.labelLeft\"\n [labelLeftClass]=\"labelConfig.labelLeftClass\"\n [required]=\"labelConfig.required\"\n [description]=\"labelConfig.description\"\n [labelRight]=\"labelConfig.labelRight\"\n [labelRightClass]=\"labelConfig.labelRightClass\"\n [onlyShowCount]=\"labelConfig.onlyShowCount\"\n [buttonsLeft]=\"labelConfig.buttonsLeft\"\n [disableButtonsLeft]=\"labelConfig.disableButtonsLeft || disable()\"\n [hasToggle]=\"labelConfig.hasToggle\"\n [toggleActive]=\"labelConfig.toggleActive\"\n [toggleDisable]=\"labelConfig.toggleDisable || disable()\"\n [popover]=\"labelConfig.popover\"\n [iconPopoverClass]=\"labelConfig.iconPopoverClass\"\n [onlyShowCount]=\"labelConfig.onlyShowCount\"\n [limitLength]=\"labelConfig.limitLength\"\n [buttonsDescription]=\"labelConfig.buttonsDescription\"\n [disableButtonsDescription]=\"labelConfig.disableButtonsDescription || disable()\"\n [buttonsDescriptionContainerClass]=\"labelConfig.buttonsDescriptionContainerClass\"\n [count]=\"labelConfig.count\" />\n }\n @if (!showValidateBottom()) {\n <ng-container *ngTemplateOutlet=\"templateValidate\"></ng-container>\n }\n <div class=\"libs-ui-checkbox-group {{ horizontal() ? classGroupWhenModeHorizontal() : '' }}\">\n @for (group of groups(); track group) {\n <div [class]=\"horizontal() ? classItemWhenModeHorizontal() : ''\">\n <div class=\"py-[4px] {{ group.item.classIncludeWrapper || '' }}\">\n <libs_ui-components-checkbox-single\n [label]=\"group.item.label || ' '\"\n [checked]=\"group.item.checked || false\"\n [key]=\"group.item[fieldKey()]\"\n [disable]=\"group.disableByKeys || disable() || group.item.disable || false\"\n [disableLabel]=\"group.item.disableLabel || false\"\n [classLabelInclude]=\"classLabelInclude() || group.item.classLabelInclude || ''\"\n [classInclude]=\"classInclude() || group.item.classInclude || ''\"\n [popover]=\"group.item.popover\"\n [avatarConfig]=\"group.item.avatarConfig\"\n [description]=\"group.item.description\"\n [typeLabelPopover]=\"group.item.typeLabelPopover || 'text'\"\n [ignoreShowPopoverLabel]=\"group.item.ignoreShowPopoverLabel || false\"\n [clickExactly]=\"clickExactly()\"\n [modeBorder]=\"modeBorder()\"\n [showBorderError]=\"error() && validRequired()?.hasBorderErrorCheckbox\"\n (outChange)=\"handlerChange($event, group.item)\"\n (outEventPopover)=\"handlerEventPopover($event, group.item)\" />\n </div>\n @if (group.item.checked) {\n @if (group.subText) {\n <div\n class=\"libs-ui-checkbox-group-sub-text libs-ui-font-h7r {{ group.classIncludeSubText || '' }}\"\n [innerHtml]=\"group.subText\"></div>\n }\n <ng-container *ngTemplateOutlet=\"group?.subTemplate || null; context: { item: group.item }\"></ng-container>\n }\n </div>\n }\n </div>\n @if (showValidateBottom()) {\n <ng-container *ngTemplateOutlet=\"templateValidate\"></ng-container>\n }\n</div>\n\n<ng-template #templateValidate>\n @if (error()) {\n <div\n class=\"flex items-center\"\n [class.mb-[8px]]=\"!showValidateBottom()\"\n [class.mt-[8px]]=\"showValidateBottom()\">\n @let constHtmlMessage = validRequired()?.message || ERROR_MESSAGE_EMPTY_VALID;\n <span\n class=\"libs-ui-text-error libs-ui-font-h7r\"\n [innerHtml]=\"constHtmlMessage | translate: validRequired()?.interpolateParams\"></span>\n </div>\n }\n</ng-template>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"libs-ui-components-checkbox-group.mjs","sources":["../../../../../../libs-ui/components/checkbox/group/src/checkbox-group.component.ts","../../../../../../libs-ui/components/checkbox/group/src/checkbox-group.component.html","../../../../../../libs-ui/components/checkbox/group/src/libs-ui-components-checkbox-group.ts"],"sourcesContent":["import { NgTemplateOutlet } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, effect, input, model, OnInit, output, signal, untracked } from '@angular/core';\nimport { ICheckboxEvent, LibsUiComponentsCheckboxSingleComponent } from '@libs-ui/components-checkbox-single';\nimport { ILabel, LibsUiComponentsLabelComponent } from '@libs-ui/components-label';\nimport { TYPE_POPOVER_EVENT } from '@libs-ui/components-popover';\nimport { ERROR_MESSAGE_EMPTY_VALID } from '@libs-ui/utils';\nimport { TranslateModule } from '@ngx-translate/core';\nimport { ICheckboxGroupFunctionControlEvent } from './interfaces/function-control.interface';\nimport { ICheckboxGroupItem, ICheckboxGroupValidRequired, ICheckboxItem } from './interfaces/group.interface';\n\n/**\n * Checkbox Group Component - Một tập hợp các checkbox đơn lẻ trong một nhóm.\n *\n * @description\n * Hỗ trợ quản lý danh sách các checkbox, xử lý trạng thái chọn hàng loạt,\n * cấu hình layout (ngang/dọc), và tích hợp validation bắt buộc chọn.\n *\n * @example\n * ```html\n * <libs_ui-components-checkbox-group\n * [(groups)]=\"options\"\n * [labelConfig]=\"{ label: 'Chọn kỹ năng' }\"\n * (outChange)=\"onSelectionChange($event)\"\n * />\n * ```\n *\n * @publicApi\n */\n@Component({\n // eslint-disable-next-line @angular-eslint/component-selector\n selector: 'libs_ui-components-checkbox-group',\n templateUrl: './checkbox-group.component.html',\n styleUrl: './checkbox-group.component.scss',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [TranslateModule, NgTemplateOutlet, LibsUiComponentsLabelComponent, LibsUiComponentsCheckboxSingleComponent],\n})\nexport class LibsUiComponentsCheckboxGroupComponent implements OnInit {\n // #region PROPERTY\n protected readonly ERROR_MESSAGE_EMPTY_VALID = ERROR_MESSAGE_EMPTY_VALID;\n /** Signal điều khiển trạng thái hiển thị lỗi validation */\n protected error = signal<boolean>(false);\n\n // #region INPUT\n /**\n * Danh sách các item trong nhóm checkbox.\n * Model hỗ trợ two-way binding để cập nhật trạng thái checked của các item.\n */\n readonly groups = model.required<Array<ICheckboxGroupItem>>();\n /** Tên trường đóng vai trò là khóa định danh trong item dữ liệu (mặc định: 'key') */\n readonly fieldKey = input<string, string>('key', { transform: (value) => value || 'key' });\n /** Danh sách các keys cần được set trạng thái checked khi khởi tạo hoặc thay đổi */\n readonly keysChecked = input<Array<string>>();\n /** Danh sách các keys cần được set trạng thái disable */\n readonly keysDisable = input<Array<string>>();\n /** Trạng thái vô hiệu hóa toàn bộ nhóm checkbox */\n readonly disable = input<boolean | undefined, boolean | undefined>(false, { transform: (value) => value ?? false });\n /** Nếu true, chỉ click vào checkbox/label mới đổi trạng thái. Nếu false, click vào vùng bao quanh item sẽ trigger */\n readonly clickExactly = input<boolean | undefined, boolean | undefined>(true, { transform: (value) => value ?? true });\n /** Hiển thị các checkbox theo hàng ngang (mặc định: dọc) */\n readonly horizontal = input<boolean | undefined, boolean | undefined>(false, { transform: (value) => value ?? false });\n /** Cấu hình nhãn (Label) tổng quát cho toàn bộ nhóm */\n readonly labelConfig = input<ILabel>();\n /** Cấu hình validation bắt buộc người dùng phải chọn ít nhất một item */\n readonly validRequired = input<ICheckboxGroupValidRequired>();\n /** Class CSS bổ sung cho container chính của nhóm */\n readonly classInclude = input<string>();\n /** Class CSS bổ sung cho nhãn của nhóm */\n readonly classLabelInclude = input<string>();\n /** Hiển thị thông báo lỗi validation ở phía dưới nhóm */\n readonly showValidateBottom = input<boolean>();\n /** Class CSS cho item khi hiển thị ở chế độ nằm ngang */\n readonly classItemWhenModeHorizontal = input<string>('mr-[24px]');\n /** Class CSS cho wrapper nhóm khi hiển thị ở chế độ nằm ngang */\n readonly classGroupWhenModeHorizontal = input<string>('flex');\n /** Hiển thị viền bao quanh toàn bộ nhóm component */\n readonly modeBorder = input<boolean>();\n\n // #region OUTPUT\n /** Phát ra khi bất kỳ checkbox nào trong nhóm thay đổi trạng thái */\n readonly outChange = output<ICheckboxEvent>();\n /** Phát ra object chứa các hàm điều khiển (API) của component lên component cha */\n readonly outFunctionsControl = output<ICheckboxGroupFunctionControlEvent>();\n\n constructor() {\n effect(() => {\n if (!Array.isArray(this.keysChecked()) || !this.fieldKey()) {\n return;\n }\n untracked(() => {\n this.groups.update((data) => {\n return data.map((group) => {\n group.item.checked = this.keysChecked()?.some((key) => key === group.item[this.fieldKey()]);\n\n return group;\n });\n });\n });\n });\n\n effect(() => {\n if (!Array.isArray(this.keysDisable()) || !this.fieldKey()) {\n return;\n }\n untracked(() => {\n this.groups.update((data) => {\n return data.map((group) => {\n group.disableByKeys = false;\n if (group.item && this.keysDisable()?.includes(group.item[this.fieldKey()])) {\n group.disableByKeys = true;\n }\n return group;\n });\n });\n });\n });\n }\n\n /* FUNCTIONS */\n ngOnInit() {\n this.outFunctionsControl.emit(this.FunctionsControl);\n }\n\n public get FunctionsControl(): ICheckboxGroupFunctionControlEvent {\n return {\n checkIsValid: this.checkValid.bind(this),\n resetError: this.resetError.bind(this),\n reset: async () => {\n this.groups.update((data) => {\n return data.map((group) => {\n group.item.checked = false;\n return group;\n });\n });\n this.resetError();\n },\n };\n }\n\n // #region FUNCTIONS\n protected handlerChange(event: ICheckboxEvent, item: ICheckboxItem) {\n if (this.disable()) {\n return;\n }\n item.checked = event.checked;\n event.allCheckboxChecked = this.groups()\n .filter((group) => group.item.checked)\n .map((group) => ({ key: group.item[this.fieldKey()], item: group.item }));\n this.outChange.emit(event);\n this.checkValid();\n }\n\n private async checkValid() {\n this.error.set(false);\n if (!this.validRequired()) {\n return true;\n }\n this.error.set(!this.groups().some((group) => group.item.checked));\n\n return !this.error();\n }\n\n private async resetError() {\n this.error.set(false);\n }\n\n protected handlerEventPopover(event: TYPE_POPOVER_EVENT, item: ICheckboxItem) {\n item.outEventPopover?.(event);\n }\n}\n","<div class=\"flex flex-col w-full\">\n @if (labelConfig(); as labelConfig) {\n <libs_ui-components-label\n [classInclude]=\"labelConfig.classInclude\"\n [labelLeft]=\"labelConfig.labelLeft\"\n [labelLeftClass]=\"labelConfig.labelLeftClass\"\n [required]=\"labelConfig.required\"\n [description]=\"labelConfig.description\"\n [labelRight]=\"labelConfig.labelRight\"\n [labelRightClass]=\"labelConfig.labelRightClass\"\n [onlyShowCount]=\"labelConfig.onlyShowCount\"\n [buttonsLeft]=\"labelConfig.buttonsLeft\"\n [disableButtonsLeft]=\"labelConfig.disableButtonsLeft || disable()\"\n [hasToggle]=\"labelConfig.hasToggle\"\n [toggleActive]=\"labelConfig.toggleActive\"\n [toggleDisable]=\"labelConfig.toggleDisable || disable()\"\n [popover]=\"labelConfig.popover\"\n [iconPopoverClass]=\"labelConfig.iconPopoverClass\"\n [onlyShowCount]=\"labelConfig.onlyShowCount\"\n [limitLength]=\"labelConfig.limitLength\"\n [buttonsDescription]=\"labelConfig.buttonsDescription\"\n [disableButtonsDescription]=\"labelConfig.disableButtonsDescription || disable()\"\n [buttonsDescriptionContainerClass]=\"labelConfig.buttonsDescriptionContainerClass\"\n [count]=\"labelConfig.count\" />\n }\n @if (!showValidateBottom()) {\n <ng-container *ngTemplateOutlet=\"templateValidate\"></ng-container>\n }\n <div class=\"libs-ui-checkbox-group {{ horizontal() ? classGroupWhenModeHorizontal() : '' }}\">\n @for (group of groups(); track group) {\n <div [class]=\"horizontal() ? classItemWhenModeHorizontal() : ''\">\n <div class=\"py-[4px] {{ group.item.classIncludeWrapper || '' }}\">\n <libs_ui-components-checkbox-single\n [label]=\"group.item.label || ' '\"\n [checked]=\"group.item.checked || false\"\n [key]=\"group.item[fieldKey()]\"\n [disable]=\"group.disableByKeys || disable() || group.item.disable || false\"\n [disableLabel]=\"group.item.disableLabel || false\"\n [classLabelInclude]=\"classLabelInclude() || group.item.classLabelInclude || ''\"\n [classInclude]=\"classInclude() || group.item.classInclude || ''\"\n [popover]=\"group.item.popover\"\n [avatarConfig]=\"group.item.avatarConfig\"\n [description]=\"group.item.description\"\n [typeLabelPopover]=\"group.item.typeLabelPopover || 'text'\"\n [ignoreShowPopoverLabel]=\"group.item.ignoreShowPopoverLabel || false\"\n [clickExactly]=\"clickExactly()\"\n [modeBorder]=\"modeBorder()\"\n [showBorderError]=\"error() && validRequired()?.hasBorderErrorCheckbox\"\n (outChange)=\"handlerChange($event, group.item)\"\n (outEventPopover)=\"handlerEventPopover($event, group.item)\" />\n </div>\n @if (group.item.checked) {\n @if (group.subText) {\n <div\n class=\"libs-ui-checkbox-group-sub-text libs-ui-font-h7r {{ group.classIncludeSubText || '' }}\"\n [innerHtml]=\"group.subText\"></div>\n }\n <ng-container *ngTemplateOutlet=\"group?.subTemplate || null; context: { item: group.item }\"></ng-container>\n }\n </div>\n }\n </div>\n @if (showValidateBottom()) {\n <ng-container *ngTemplateOutlet=\"templateValidate\"></ng-container>\n }\n</div>\n\n<ng-template #templateValidate>\n @if (error()) {\n <div\n class=\"flex items-center\"\n [class.mb-[8px]]=\"!showValidateBottom()\"\n [class.mt-[8px]]=\"showValidateBottom()\">\n @let constHtmlMessage = validRequired()?.message || ERROR_MESSAGE_EMPTY_VALID;\n <span\n class=\"libs-ui-text-error libs-ui-font-h7r\"\n [innerHtml]=\"constHtmlMessage | translate: validRequired()?.interpolateParams\"></span>\n </div>\n }\n</ng-template>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
@@ -3,38 +3,79 @@ import { IAvatarConfig } from '@libs-ui/components-avatar';
3
3
  import { ICheckboxBullet, ICheckboxItemDescription } from '@libs-ui/components-checkbox-single';
4
4
  import { IPopover, TYPE_POPOVER_EVENT, TYPE_POPOVER_TYPE } from '@libs-ui/components-popover';
5
5
  import { TYPE_TEMPLATE_REF } from '@libs-ui/interfaces-types';
6
+ /**
7
+ * Cấu hình cho một item trong nhóm checkbox
8
+ * @interface ICheckboxGroupItem
9
+ */
6
10
  export interface ICheckboxGroupItem {
11
+ /** Cấu hình chi tiết của checkbox item (dựa trên LibsUiComponentsCheckboxSingleComponent) */
7
12
  item: ICheckboxItem;
13
+ /** Văn bản bổ sung hiển thị bên dưới hoặc bên cạnh item (tùy template) */
8
14
  subText?: string;
15
+ /** Class CSS bổ sung cho phần subText */
9
16
  classIncludeSubText?: string;
17
+ /** Template tùy chỉnh để render nội dung bổ sung cho item */
10
18
  subTemplate?: TemplateRef<TYPE_TEMPLATE_REF>;
19
+ /** Trạng thái vô hiệu hóa dựa trên danh sách các keys bị khóa */
11
20
  disableByKeys?: boolean;
12
21
  }
22
+ /**
23
+ * Cấu hình validation bắt buộc chọn cho nhóm checkbox
24
+ * @interface ICheckboxGroupValidRequired
25
+ */
13
26
  export interface ICheckboxGroupValidRequired {
27
+ /** Thông báo lỗi khi không có item nào được chọn */
14
28
  message?: string;
29
+ /** Hiển thị viền đỏ cho các ô checkbox khi có lỗi validation */
15
30
  hasBorderErrorCheckbox?: boolean;
31
+ /** Các tham số nội suy cho thông báo lỗi (sử dụng với i18n) */
16
32
  interpolateParams?: any;
17
33
  }
34
+ /**
35
+ * Cấu hình dữ liệu cho một checkbox item trong nhóm
36
+ * @interface ICheckboxItem
37
+ */
18
38
  export interface ICheckboxItem {
39
+ /** Khóa định danh duy nhất của item */
19
40
  key?: string;
41
+ /** Trạng thái chọn của checkbox */
20
42
  checked?: boolean;
43
+ /** Nhãn văn bản hiển thị cạnh checkbox */
21
44
  label?: string;
45
+ /** Class CSS bổ sung cho nhãn */
22
46
  classLabelInclude?: string;
47
+ /** Cấu hình popover khi di chuột vào nhãn */
23
48
  popover?: IPopover;
49
+ /** Cấu hình Avatar hiển thị cạnh checkbox */
24
50
  avatarConfig?: IAvatarConfig;
51
+ /** URL hình ảnh hiển thị cạnh checkbox */
25
52
  linkImage?: string;
53
+ /** URL hình ảnh dự phòng khi load lỗi */
26
54
  linkImageError?: string;
55
+ /** Class CSS bổ sung cho phần hình ảnh */
27
56
  classImageInclude?: string;
57
+ /** Cấu hình bullet (chấm tròn màu) */
28
58
  bullet?: ICheckboxBullet;
59
+ /** Class CSS bổ sung cho wrapper của checkbox item */
29
60
  classInclude?: string;
61
+ /** Nếu true, chỉ click vào checkbox/label mới đổi trạng thái */
30
62
  clickExactly?: boolean;
63
+ /** Trạng thái vô hiệu hóa của checkbox */
31
64
  disable?: boolean;
65
+ /** Trạng thái vô hiệu hóa tương tác click trên nhãn */
32
66
  disableLabel?: boolean;
67
+ /** Bỏ qua việc hiển thị popover trên nhãn */
33
68
  ignorePopoverLabel?: boolean;
69
+ /** Callback xử lý sự kiện từ popover */
34
70
  outEventPopover?: (event: TYPE_POPOVER_EVENT) => void;
71
+ /** Mô tả chi tiết hiển thị dưới nhãn */
35
72
  description?: ICheckboxItemDescription;
73
+ /** Class CSS bổ sung cho phần bao quanh item */
36
74
  classIncludeWrapper?: string;
75
+ /** Loại nội dung popover ('text' | 'component') */
37
76
  typeLabelPopover?: TYPE_POPOVER_TYPE;
77
+ /** Ẩn popover khi di chuột vào nhãn */
38
78
  ignoreShowPopoverLabel?: boolean;
79
+ /** Các thuộc tính mở rộng khác */
39
80
  [key: string]: any;
40
81
  }
package/package.json CHANGED
@@ -1,16 +1,16 @@
1
1
  {
2
2
  "name": "@libs-ui/components-checkbox-group",
3
- "version": "0.2.355-9",
3
+ "version": "0.2.356-1",
4
4
  "peerDependencies": {
5
5
  "@angular/common": ">=18.0.0",
6
6
  "@angular/core": ">=18.0.0",
7
- "@libs-ui/components-checkbox-single": "0.2.355-9",
8
- "@libs-ui/components-label": "0.2.355-9",
9
- "@libs-ui/components-popover": "0.2.355-9",
10
- "@libs-ui/utils": "0.2.355-9",
7
+ "@libs-ui/components-checkbox-single": "0.2.356-1",
8
+ "@libs-ui/components-label": "0.2.356-1",
9
+ "@libs-ui/components-popover": "0.2.356-1",
10
+ "@libs-ui/utils": "0.2.356-1",
11
11
  "@ngx-translate/core": "^15.0.0",
12
- "@libs-ui/components-avatar": "0.2.355-9",
13
- "@libs-ui/interfaces-types": "0.2.355-9"
12
+ "@libs-ui/components-avatar": "0.2.356-1",
13
+ "@libs-ui/interfaces-types": "0.2.356-1"
14
14
  },
15
15
  "sideEffects": false,
16
16
  "module": "fesm2022/libs-ui-components-checkbox-group.mjs",