@libs-ui/components-inputs-emoji 0.2.356-41 → 0.2.356-43

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,34 +1,33 @@
1
1
  # @libs-ui/components-inputs-emoji
2
2
 
3
- > Component chọn Emoji (Emoji Picker) tích hợp trong Popover với tính năng tìm kiếm và phân loại.
3
+ > Component chọn Emoji (Emoji Picker) tích hợp trong Popover với tính năng tìm kiếm, phân loại lazy loading.
4
4
 
5
5
  ## Giới thiệu
6
6
 
7
- `LibsUiComponentsEmojiComponent` cung cấp một giao diện chọn emoji trực quan, hỗ trợ đầy đủ các nhóm emoji tiêu chuẩn, tìm kiếm theo tên và tối ưu hóa hiệu năng bằng lazy loading khi cuộn danh sách.
7
+ `LibsUiComponentsEmojiComponent` cung cấp giao diện chọn emoji trực quan ẩn trong một Popover, hỗ trợ duyệt emoji theo nhóm danh mục, tìm kiếm nhanh theo tên, và tối ưu hiệu năng bằng cơ chế lazy loading khi cuộn danh sách. Component phù hợp tích hợp vào mọi giao diện nhập liệu như chat, bình luận, hoặc soạn thảo văn bản.
8
8
 
9
- ### Tính năng
9
+ ## Tính năng
10
10
 
11
- - ✅ Danh sách Emoji đầy đủ, phân loại theo nhóm
12
- - ✅ Tìm kiếm Emoji nhanh chóng
13
- - ✅ Tích hợp sẵn Popover thông minh
14
- - ✅ Lazy loading (scroll to load more) tối ưu hiệu năng
11
+ - ✅ Danh sách Emoji đầy đủ, phân loại theo nhóm chuẩn Unicode
12
+ - ✅ Tìm kiếm Emoji nhanh chóng theo tên (có xử lý unicode)
13
+ - ✅ Tích hợp sẵn Popover với animation mượt mà
14
+ - ✅ Lazy loading (scroll to load more) tối ưu hiệu năng với danh sách lớn
15
15
  - ✅ Hỗ trợ Custom Trigger qua `ng-content`
16
- - ✅ Tùy chỉnh linh hoạt kích thước vị trí popup
16
+ - ✅ Tùy chỉnh linh hoạt kích thước, vị trí và z-index của popup
17
+ - ✅ Hỗ trợ điều khiển Popover từ bên ngoài qua `FunctionsControl` getter
18
+ - ✅ Standalone component, tương thích Angular 17+ Signals & OnPush
17
19
 
18
20
  ## Khi nào sử dụng
19
21
 
20
- - Khi cần cho phép người dùng chèn cảm xúc (emoji) vào nội dung văn bản.
21
- - Phù hợp cho ứng dụng Chat, Comment, Social Media.
22
- - Khi cần một bộ chọn emoji chuyên nghiệp nhưng vẫn tiết kiệm diện tích giao diện.
22
+ - Tích hợp tính năng chèn emoji trong các ứng dụng chat, bình luận, social media
23
+ - Cần một bộ chọn emoji gọn nhẹ, tiết kiệm diện tích (ẩn trong popover cho đến khi cần)
24
+ - Cần hiệu năng cao với danh sách emoji lớn (lazy loading tự động)
25
+ - Muốn tùy chỉnh trigger button theo thiết kế riêng thay vì dùng icon mặc định
23
26
 
24
27
  ## Cài đặt
25
28
 
26
29
  ```bash
27
- # npm
28
30
  npm install @libs-ui/components-inputs-emoji
29
-
30
- # yarn
31
- yarn add @libs-ui/components-inputs-emoji
32
31
  ```
33
32
 
34
33
  ## Import
@@ -44,101 +43,256 @@ import { LibsUiComponentsEmojiComponent } from '@libs-ui/components-inputs-emoji
44
43
  export class YourComponent {}
45
44
  ```
46
45
 
47
- ## Ví dụ
46
+ ## Ví dụ sử dụng
47
+
48
+ ### 1. Cơ bản — Icon mặc định làm trigger
49
+
50
+ ```typescript
51
+ // component.ts
52
+ import { Component, signal } from '@angular/core';
53
+ import { LibsUiComponentsEmojiComponent } from '@libs-ui/components-inputs-emoji';
54
+
55
+ @Component({
56
+ selector: 'app-chat-input',
57
+ standalone: true,
58
+ imports: [LibsUiComponentsEmojiComponent],
59
+ templateUrl: './chat-input.component.html',
60
+ })
61
+ export class ChatInputComponent {
62
+ protected selectedEmoji = signal('');
63
+
64
+ protected handlerSelectEmoji(emoji: string): void {
65
+ this.selectedEmoji.set(emoji);
66
+ }
67
+ }
68
+ ```
69
+
70
+ ```html
71
+ <!-- chat-input.component.html -->
72
+ <div class="flex items-center gap-3">
73
+ <libs_ui-components-emoji (outEventEmoji)="handlerSelectEmoji($event)" />
74
+ <span class="text-gray-600">Emoji đã chọn: {{ selectedEmoji() || '(chưa chọn)' }}</span>
75
+ </div>
76
+ ```
77
+
78
+ ### 2. Custom Trigger — Dùng nội dung bất kỳ làm trigger
79
+
80
+ ```typescript
81
+ // component.ts
82
+ import { Component, signal } from '@angular/core';
83
+ import { LibsUiComponentsEmojiComponent } from '@libs-ui/components-inputs-emoji';
84
+
85
+ @Component({
86
+ selector: 'app-comment-box',
87
+ standalone: true,
88
+ imports: [LibsUiComponentsEmojiComponent],
89
+ templateUrl: './comment-box.component.html',
90
+ })
91
+ export class CommentBoxComponent {
92
+ protected message = signal('');
93
+
94
+ protected handlerInsertEmoji(emoji: string): void {
95
+ this.message.update((current) => `${current}${emoji}`);
96
+ }
97
+ }
98
+ ```
99
+
100
+ ```html
101
+ <!-- comment-box.component.html -->
102
+ <div class="flex items-center gap-2 border rounded-lg p-2">
103
+ <input
104
+ class="flex-1 outline-none text-sm"
105
+ [value]="message()"
106
+ placeholder="Nhập bình luận..." />
107
+
108
+ <libs_ui-components-emoji
109
+ [isNgContent]="true"
110
+ (outEventEmoji)="handlerInsertEmoji($event)">
111
+ <button class="px-3 py-1 bg-blue-500 text-white rounded text-sm hover:bg-blue-600">
112
+ 😊 Emoji
113
+ </button>
114
+ </libs_ui-components-emoji>
115
+ </div>
116
+ ```
117
+
118
+ ### 3. Tùy chỉnh kích thước Popup và vị trí
119
+
120
+ ```typescript
121
+ // component.ts
122
+ import { Component, signal } from '@angular/core';
123
+ import { LibsUiComponentsEmojiComponent } from '@libs-ui/components-inputs-emoji';
48
124
 
49
- ### Cơ bản
125
+ @Component({
126
+ selector: 'app-editor-toolbar',
127
+ standalone: true,
128
+ imports: [LibsUiComponentsEmojiComponent],
129
+ templateUrl: './editor-toolbar.component.html',
130
+ })
131
+ export class EditorToolbarComponent {
132
+ protected selectedEmoji = signal('');
133
+
134
+ protected handlerPickEmoji(emoji: string): void {
135
+ this.selectedEmoji.set(emoji);
136
+ }
137
+ }
138
+ ```
50
139
 
51
140
  ```html
52
- <libs_ui-components-emoji (outEventEmoji)="onSelect($event)" />
141
+ <!-- editor-toolbar.component.html -->
142
+ <libs_ui-components-emoji
143
+ classPopup="w-[400px] h-[350px]"
144
+ modePopoverPosition="center"
145
+ [zIndex]="1500"
146
+ (outEventEmoji)="handlerPickEmoji($event)" />
53
147
  ```
54
148
 
55
- ### Custom Trigger
149
+ ### 4. Điều khiển Popover từ bên ngoài qua ViewChild
150
+
151
+ ```typescript
152
+ // component.ts
153
+ import { Component, viewChild } from '@angular/core';
154
+ import { LibsUiComponentsEmojiComponent } from '@libs-ui/components-inputs-emoji';
155
+ import { IPopoverFunctionControlEvent } from '@libs-ui/components-popover';
156
+
157
+ @Component({
158
+ selector: 'app-controlled-emoji',
159
+ standalone: true,
160
+ imports: [LibsUiComponentsEmojiComponent],
161
+ templateUrl: './controlled-emoji.component.html',
162
+ })
163
+ export class ControlledEmojiComponent {
164
+ private readonly emojiRef = viewChild<LibsUiComponentsEmojiComponent>('emojiRef');
165
+ protected selectedEmoji = '';
166
+
167
+ protected handlerSelectEmoji(emoji: string): void {
168
+ this.selectedEmoji = emoji;
169
+ // Đóng popover sau khi chọn
170
+ this.emojiRef()?.FunctionsControl?.removePopoverOverlay();
171
+ }
172
+
173
+ openPicker(): void {
174
+ this.emojiRef()?.FunctionsControl?.showPopoverOverlay();
175
+ }
176
+ }
177
+ ```
56
178
 
57
179
  ```html
180
+ <!-- controlled-emoji.component.html -->
181
+ <button (click)="openPicker()">Mở Emoji Picker</button>
58
182
  <libs_ui-components-emoji
59
- [isNgContent]="true"
60
- (outEventEmoji)="onSelect($event)">
61
- <button>Chọn Emoji</button>
62
- </libs_ui-components-emoji>
183
+ #emojiRef
184
+ (outEventEmoji)="handlerSelectEmoji($event)" />
63
185
  ```
64
186
 
65
- ## API
187
+ ## @Input()
188
+
189
+ | Input | Type | Default | Mô tả | Ví dụ |
190
+ |---|---|---|---|---|
191
+ | `[classIconInclude]` | `string` | `'libs-ui-icon-add'` | CSS class cho icon trigger mặc định (khi không dùng ng-content) | `[classIconInclude]="'libs-ui-icon-smile'"` |
192
+ | `[classInclude]` | `string` | `''` | CSS class bổ sung cho container của trigger button | `[classInclude]="'ml-2'"` |
193
+ | `[classPopup]` | `string` | `'w-[290px] h-[245px]'` | CSS class cho container của popup chọn emoji, kiểm soát kích thước | `classPopup="w-[400px] h-[350px]"` |
194
+ | `[configPopover]` | `IPopoverOverlay` | `defaultConfigPopover()` | Cấu hình đầy đủ cho Popover overlay (direction, position, animation,...) | `[configPopover]="myPopoverConfig"` |
195
+ | `[isNgContent]` | `boolean` | `undefined` | Khi `true`, ẩn icon mặc định và dùng nội dung `ng-content` làm trigger | `[isNgContent]="true"` |
196
+ | `[modePopoverPosition]` | `'start' \| 'center' \| 'end'` | `undefined` | Chế độ căn lề ngang của popup so với trigger | `modePopoverPosition="center"` |
197
+ | `[zIndex]` | `number` | `0` | Z-index nền của popup. Content bên trong sẽ tự động được offset thêm `+5` | `[zIndex]="1500"` |
198
+ | `[ignoreShowPopoverText]` | `boolean` | `undefined` | Ẩn tooltip text "Emoji" khi hover trigger | `[ignoreShowPopoverText]="true"` |
199
+
200
+ ## @Output()
66
201
 
67
- ### libs_ui-components-emoji
202
+ | Output | Type | Mô tả | Handler TS | Binding HTML |
203
+ |---|---|---|---|---|
204
+ | `(outEventEmoji)` | `string` | Emit ký tự emoji khi người dùng nhấn chọn một emoji trong picker | `handlerSelectEmoji(emoji: string): void { this.selectedEmoji.set(emoji); }` | `(outEventEmoji)="handlerSelectEmoji($event)"` |
205
+ | `(outFunctionsControl)` | `IPopoverFunctionControlEvent` | Emit object chứa các hàm điều khiển Popover (`showPopoverOverlay`, `removePopoverOverlay`) | `handlerFunctionsControl(ctrl: IPopoverFunctionControlEvent): void { this.popoverCtrl = ctrl; }` | `(outFunctionsControl)="handlerFunctionsControl($event)"` |
206
+ | `(outFlagMouse)` | `IFlagMouse` | Emit trạng thái chuột (hover) trên vùng popover | `handlerFlagMouse(flag: IFlagMouse): void { this.mouseFlag = flag; }` | `(outFlagMouse)="handlerFlagMouse($event)"` |
68
207
 
69
- #### Inputs
208
+ ## Methods (FunctionsControl)
70
209
 
71
- | Property | Type | Default | Description |
72
- | ----------------------- | ------------------------------ | ------------------------ | -------------------------------------------- |
73
- | `[classIconInclude]` | `string` | `'libs-ui-icon-add'` | CSS class cho icon trigger mặc định |
74
- | `[classInclude]` | `string` | `''` | CSS class bổ sung cho trigger container |
75
- | `[classPopup]` | `string` | `'w-[290px] h-[245px]'` | CSS class cho container của popup chọn emoji |
76
- | `[configPopover]` | `IPopoverOverlay` | `defaultConfigPopover()` | Cấu hình overlay cho Popover |
77
- | `[isNgContent]` | `boolean` | `false` | Sử dụng ng-content làm trigger thay vì icon |
78
- | `[modePopoverPosition]` | `'start' \| 'center' \| 'end'` | `undefined` | Chế độ căn lề cho Popover |
79
- | `[zIndex]` | `number` | `0` | Giá trị Z-index nền của popup |
210
+ Truy cập qua `ViewChild` để điều khiển Popover theo chương trình:
80
211
 
81
- #### Outputs
212
+ ```typescript
213
+ private readonly emojiRef = viewChild<LibsUiComponentsEmojiComponent>('emojiRef');
214
+
215
+ // Mở picker
216
+ this.emojiRef()?.FunctionsControl?.showPopoverOverlay();
217
+
218
+ // Đóng picker
219
+ this.emojiRef()?.FunctionsControl?.removePopoverOverlay();
220
+ ```
82
221
 
83
- | Property | Type | Description |
84
- | ----------------------- | ------------------------------ | --------------------------------------------------- |
85
- | `(outEventEmoji)` | `string` | Emit khi người dùng chọn một emoji |
86
- | `(outFunctionsControl)` | `IPopoverFunctionControlEvent` | Emit các functions điều khiển Popover (show/remove) |
222
+ | Getter | Return Type | Mô tả |
223
+ |---|---|---|
224
+ | `FunctionsControl` | `IPopoverFunctionControlEvent \| undefined` | Trả về object chứa hàm điều khiển Popover. Có giá trị sau khi Popover đã được khởi tạo. |
87
225
 
88
226
  ## Types & Interfaces
89
227
 
90
228
  ```typescript
91
- // Interface configure Popover
229
+ import { IPopoverOverlay, IPopoverFunctionControlEvent, IFlagMouse } from '@libs-ui/components-popover';
230
+ import { IEmoji, IGroupEmoji } from '@libs-ui/components-inputs-emoji';
231
+ ```
232
+
233
+ ```typescript
234
+ /** Cấu hình Popover overlay */
92
235
  export interface IPopoverOverlay {
93
- isAddContentToParentDocument?: boolean;
94
- classInclude?: string;
95
- widthByParent?: boolean;
96
- width?: number;
97
- minWidth?: number;
98
- maxWidth?: number;
99
- maxHeight?: number | null;
100
- zIndex?: number;
101
236
  direction?: 'top' | 'right' | 'bottom' | 'left';
237
+ directionDistance?: number;
102
238
  position?: {
103
239
  mode: 'start' | 'center' | 'end';
104
240
  distance: number;
105
241
  };
106
- // ... (see @libs-ui/components-popover for full list)
242
+ zIndex?: number;
243
+ maxWidth?: number;
244
+ maxHeight?: number | null;
245
+ width?: number;
246
+ minWidth?: number;
247
+ widthByParent?: boolean;
248
+ whiteTheme?: boolean;
249
+ ignoreArrow?: boolean;
250
+ classInclude?: string;
251
+ animationConfig?: object;
107
252
  }
108
253
 
254
+ /** Các hàm điều khiển Popover (nhận qua outFunctionsControl hoặc FunctionsControl getter) */
109
255
  export interface IPopoverFunctionControlEvent {
110
256
  showPopoverOverlay: () => void;
111
257
  removePopoverOverlay: () => void;
112
258
  }
259
+
260
+ /** Thông tin một Emoji */
261
+ export interface IEmoji {
262
+ /** Ký tự emoji thực tế (vd: '😀') */
263
+ emoji: string;
264
+ /** Mô tả emoji bằng tiếng Anh (vd: 'grinning face') */
265
+ description: string;
266
+ /** Danh mục (vd: 'Smileys & Emotion') */
267
+ category: string;
268
+ display?: boolean;
269
+ }
270
+
271
+ /** Thông tin một nhóm Emoji */
272
+ export interface IGroupEmoji {
273
+ /** Tên nhóm (vd: 'Smileys & Emotion') */
274
+ group_name: string;
275
+ /** Danh sách emoji trong nhóm */
276
+ emojis: Array<IEmoji>;
277
+ /** Ký tự đại diện cho nhóm */
278
+ iconGroup?: string;
279
+ }
113
280
  ```
114
281
 
115
- ## Công nghệ
282
+ ## Lưu ý quan trọng
116
283
 
117
- | Technology | Version | Purpose |
118
- | --------------- | ------- | ---------------- |
119
- | Angular | 18+ | Framework |
120
- | Angular Signals | - | State management |
121
- | TailwindCSS | 3.x | Styling |
122
- | OnPush | - | Change Detection |
284
+ ⚠️ **Z-index offset**: Z-index của nội dung bên trong popup luôn được offset thêm `+5` so với giá trị `[zIndex]` truyền vào. Khi dùng chung với modal hoặc overlay khác, hãy tính toán `zIndex` sao cho tránh bị che khuất.
123
285
 
124
- ## Demo
286
+ ⚠️ **isNgContent**: Khi truyền `[isNgContent]="true"`, component sẽ ẩn hoàn toàn icon trigger mặc định và hiển thị phần tử con trong `ng-content`. Nếu `ng-content` rỗng, khu vực trigger sẽ không hiển thị gì.
125
287
 
126
- ```bash
127
- npx nx serve core-ui
128
- ```
288
+ ⚠️ **FunctionsControl timing**: Getter `FunctionsControl` trả về `undefined` cho đến khi sự kiện `(outFunctionsControl)` được emit lần đầu tiên (sau khi Popover khởi tạo). Hãy kiểm tra `?.` trước khi gọi.
129
289
 
130
- Truy cập: `http://localhost:4500/inputs/emoji`
290
+ ⚠️ **configPopover mutable**: `IPopoverOverlay` được xử lý theo dạng mutable object bên trong component. Không nên tái sử dụng cùng một object config cho nhiều instance Emoji Picker.
131
291
 
132
- ## Unit Tests
292
+ ## Demo
133
293
 
134
294
  ```bash
135
- # Chạy tests
136
- npx nx test components-inputs-emoji
137
-
138
- # Coverage
139
- npx nx test components-inputs-emoji --coverage
295
+ npx nx serve core-ui
140
296
  ```
141
297
 
142
- ## License
143
-
144
- MIT
298
+ Truy cập: http://localhost:4500/inputs/emoji
@@ -105,10 +105,10 @@ export class LibsUiComponentsEmojiComponent {
105
105
  this.dataEmojiView.update((item) => ({ ...item, allData: emojiMatch, dataView: page ? [...item.dataView, ...dataInPage] : dataInPage }));
106
106
  }
107
107
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: LibsUiComponentsEmojiComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
108
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: LibsUiComponentsEmojiComponent, isStandalone: true, selector: "libs_ui-components-emoji", inputs: { configPopover: { classPropertyName: "configPopover", publicName: "configPopover", isSignal: true, isRequired: false, transformFunction: null }, isNgContent: { classPropertyName: "isNgContent", publicName: "isNgContent", isSignal: true, isRequired: false, transformFunction: null }, zIndex: { classPropertyName: "zIndex", publicName: "zIndex", isSignal: true, isRequired: false, transformFunction: null }, ignoreShowPopoverText: { classPropertyName: "ignoreShowPopoverText", publicName: "ignoreShowPopoverText", isSignal: true, isRequired: false, transformFunction: null }, modePopoverPosition: { classPropertyName: "modePopoverPosition", publicName: "modePopoverPosition", isSignal: true, isRequired: false, transformFunction: null }, classPopup: { classPropertyName: "classPopup", publicName: "classPopup", isSignal: true, isRequired: false, transformFunction: null }, classInclude: { classPropertyName: "classInclude", publicName: "classInclude", isSignal: true, isRequired: false, transformFunction: null }, classIconInclude: { classPropertyName: "classIconInclude", publicName: "classIconInclude", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { outEventEmoji: "outEventEmoji", outFunctionsControl: "outFunctionsControl", outFlagMouse: "outFlagMouse" }, viewQueries: [{ propertyName: "emojiRef", first: true, predicate: ["emojiRef"], descendants: true, isSignal: true }, { propertyName: "elementViewEmoji", first: true, predicate: ["elementViewEmoji"], descendants: true, isSignal: true }], ngImport: i0, template: "<libs_ui-components-popover\n [classInclude]=\"classInclude()\"\n [config]=\"{\n content: 'i18n_text_emoji',\n zIndex: (zIndex() || 1200) + 4,\n }\"\n [ignoreShowPopover]=\"ignoreShowPopoverText()\"\n (outFunctionsControl)=\"handlerFunctionsControl($event)\">\n <libs_ui-components-popover\n type=\"other\"\n mode=\"click-toggle\"\n class=\"flex\"\n [ignoreHiddenPopoverContentWhenMouseLeave]=\"true\"\n [config]=\"configPopover()\"\n [debugId]=\"'debug icon emoij'\"\n (outChangStageFlagMouse)=\"handlerFlagMouse($event)\"\n (outFunctionsControl)=\"handlerFunctionsControl($event)\">\n @if (!isNgContent()) {\n <i class=\"before:!text-[16px] before:!text-[#6a7383] {{ classIconInclude() }}\"></i>\n } @else {\n <ng-content></ng-content>\n }\n </libs_ui-components-popover>\n</libs_ui-components-popover>\n<ng-template #emojiRef>\n <div class=\"py-[10px] flex flex-col {{ classPopup() }}\">\n <div class=\"mx-[10px] mb-[12px]\">\n <div\n class=\"flex\"\n LibsUiComponentsScrollOverlayDirective>\n @for (category of emojisCategories(); track category) {\n <div\n class=\"grow p-[4px] rounded-[4px] bg-[#ffffff] libs-ui-bg-list-hover\"\n [class.libs-ui-bg-list-active]=\"filter().groupSelected === category.group_name\"\n (click)=\"handlerChooseCategory($event, category)\"\n (keyup.enter)=\"handlerChooseCategory($event, category)\">\n <div class=\"mt-[1px] cursor-pointer text-[18px]\">\n {{ category.iconGroup }}\n </div>\n </div>\n }\n </div>\n </div>\n <div class=\"mx-[10px] mb-[12px]\">\n <libs_ui-components-inputs-search\n [searchConfig]=\"{\n placeholder: 'i18n_search',\n }\"\n [debounceTime]=\"0\"\n (outSearch)=\"handlerSearchEmoji($event)\" />\n </div>\n <div class=\"h-full w-full relative\">\n <div\n #elementViewEmoji\n class=\"w-full h-full px-[10px] absolute\"\n LibsUiComponentsScrollOverlayDirective\n (outScrollBottom)=\"handlerScrollBottom()\">\n @if (dataEmojiView().dataView.length) {\n @for (item of dataEmojiView().dataView; track $index) {\n <!-- set ignoreShowPopover to false to enable tooltip hover -->\n <span\n LibsUiComponentsPopoverDirective\n [ignoreShowPopover]=\"true\"\n [config]=\"{ content: item.description, zIndex: (zIndex() || 1200) + 5 }\"\n class=\"cursor-pointer flex shrink-0 h-fit m-[2px] float-left\"\n (click)=\"handlerAddEmoji(item)\"\n (keyup.enter)=\"handlerAddEmoji(item)\">\n {{ item.emoji }}\n </span>\n }\n } @else {\n <div class=\"libs-ui-font-h5r text-[#9ca2ad] h-full w-full items-center justify-center\">\n {{ 'i18n_no_result' | translate }}\n </div>\n }\n </div>\n </div>\n </div>\n</ng-template>\n", dependencies: [{ kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1.TranslatePipe, name: "translate" }, { kind: "component", type: LibsUiComponentsInputsSearchComponent, selector: "libs_ui-components-inputs-search", inputs: ["disable", "readonly", "searchConfig", "ignoreAutoComplete", "debounceTime", "ignoreStopPropagationEvent", "focusTimeOut", "blurTimeOut"], outputs: ["outSearch", "outValueChange", "outIconLeft", "outIconRight", "outFocusAndBlur", "outFunctionsControl"] }, { kind: "component", type: LibsUiComponentsPopoverComponent, selector: "libs_ui-components-popover,[LibsUiComponentsPopoverDirective]", inputs: ["debugId", "flagMouse", "type", "mode", "config", "ignoreShowPopover", "elementRefCustom", "initEventInElementRefCustom", "classInclude", "ignoreHiddenPopoverContentWhenMouseLeave", "ignoreStopPropagationEvent", "ignoreCursorPointerModeLikeClick", "isAddContentToParentDocument", "ignoreClickOutside"], outputs: ["outEvent", "outChangStageFlagMouse", "outEventPopoverContent", "outFunctionsControl"] }, { kind: "directive", type: LibsUiComponentsScrollOverlayDirective, selector: "[LibsUiComponentsScrollOverlayDirective]", inputs: ["debugMode", "ignoreInit", "classContainer", "options", "elementCheckScrollX", "elementCheckScrollY", "elementScroll"], outputs: ["outScroll", "outScrollX", "outScrollY", "outScrollTop", "outScrollBottom"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
108
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: LibsUiComponentsEmojiComponent, isStandalone: true, selector: "libs_ui-components-emoji", inputs: { configPopover: { classPropertyName: "configPopover", publicName: "configPopover", isSignal: true, isRequired: false, transformFunction: null }, isNgContent: { classPropertyName: "isNgContent", publicName: "isNgContent", isSignal: true, isRequired: false, transformFunction: null }, zIndex: { classPropertyName: "zIndex", publicName: "zIndex", isSignal: true, isRequired: false, transformFunction: null }, ignoreShowPopoverText: { classPropertyName: "ignoreShowPopoverText", publicName: "ignoreShowPopoverText", isSignal: true, isRequired: false, transformFunction: null }, modePopoverPosition: { classPropertyName: "modePopoverPosition", publicName: "modePopoverPosition", isSignal: true, isRequired: false, transformFunction: null }, classPopup: { classPropertyName: "classPopup", publicName: "classPopup", isSignal: true, isRequired: false, transformFunction: null }, classInclude: { classPropertyName: "classInclude", publicName: "classInclude", isSignal: true, isRequired: false, transformFunction: null }, classIconInclude: { classPropertyName: "classIconInclude", publicName: "classIconInclude", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { outEventEmoji: "outEventEmoji", outFunctionsControl: "outFunctionsControl", outFlagMouse: "outFlagMouse" }, viewQueries: [{ propertyName: "emojiRef", first: true, predicate: ["emojiRef"], descendants: true, isSignal: true }, { propertyName: "elementViewEmoji", first: true, predicate: ["elementViewEmoji"], descendants: true, isSignal: true }], ngImport: i0, template: "<libs_ui-components-popover\n [classInclude]=\"classInclude()\"\n [config]=\"{\n content: 'i18n_text_emoji',\n zIndex: (zIndex() || 1200) + 4,\n }\"\n [ignoreShowPopover]=\"ignoreShowPopoverText()\"\n (outFunctionsControl)=\"handlerFunctionsControl($event)\">\n <libs_ui-components-popover\n type=\"other\"\n mode=\"click-toggle\"\n class=\"flex\"\n [ignoreHiddenPopoverContentWhenMouseLeave]=\"true\"\n [config]=\"configPopover()\"\n [debugId]=\"'debug icon emoij'\"\n (outChangStageFlagMouse)=\"handlerFlagMouse($event)\"\n (outFunctionsControl)=\"handlerFunctionsControl($event)\">\n @if (!isNgContent()) {\n <i class=\"before:!text-[16px] before:!text-[#6a7383] {{ classIconInclude() }}\"></i>\n } @else {\n <ng-content></ng-content>\n }\n </libs_ui-components-popover>\n</libs_ui-components-popover>\n<ng-template #emojiRef>\n <div class=\"py-[10px] flex flex-col {{ classPopup() }}\">\n <div class=\"mx-[10px] mb-[12px]\">\n <div\n class=\"flex\"\n LibsUiComponentsScrollOverlayDirective>\n @for (category of emojisCategories(); track category) {\n <div\n class=\"grow p-[4px] rounded-[4px] bg-[#ffffff] libs-ui-bg-list-hover\"\n [class.libs-ui-bg-list-active]=\"filter().groupSelected === category.group_name\"\n (click)=\"handlerChooseCategory($event, category)\"\n (keydown.enter)=\"handlerChooseCategory($event, category)\">\n <div class=\"mt-[1px] cursor-pointer text-[18px]\">\n {{ category.iconGroup }}\n </div>\n </div>\n }\n </div>\n </div>\n <div class=\"mx-[10px] mb-[12px]\">\n <libs_ui-components-inputs-search\n [searchConfig]=\"{\n placeholder: 'i18n_search',\n }\"\n [debounceTime]=\"0\"\n (outSearch)=\"handlerSearchEmoji($event)\" />\n </div>\n <div class=\"h-full w-full relative\">\n <div\n #elementViewEmoji\n class=\"w-full h-full px-[10px] absolute\"\n LibsUiComponentsScrollOverlayDirective\n (outScrollBottom)=\"handlerScrollBottom()\">\n @if (dataEmojiView().dataView.length) {\n @for (item of dataEmojiView().dataView; track $index) {\n <!-- set ignoreShowPopover to false to enable tooltip hover -->\n <span\n LibsUiComponentsPopoverDirective\n [ignoreShowPopover]=\"true\"\n [config]=\"{ content: item.description, zIndex: (zIndex() || 1200) + 5 }\"\n class=\"cursor-pointer flex shrink-0 h-fit m-[2px] float-left\"\n (click)=\"handlerAddEmoji(item)\"\n (keydown.enter)=\"handlerAddEmoji(item)\">\n {{ item.emoji }}\n </span>\n }\n } @else {\n <div class=\"libs-ui-font-h5r text-[#9ca2ad] h-full w-full items-center justify-center\">\n {{ 'i18n_no_result' | translate }}\n </div>\n }\n </div>\n </div>\n </div>\n</ng-template>\n", dependencies: [{ kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1.TranslatePipe, name: "translate" }, { kind: "component", type: LibsUiComponentsInputsSearchComponent, selector: "libs_ui-components-inputs-search", inputs: ["disable", "readonly", "searchConfig", "ignoreAutoComplete", "debounceTime", "ignoreStopPropagationEvent", "focusTimeOut", "blurTimeOut"], outputs: ["outSearch", "outValueChange", "outIconLeft", "outIconRight", "outFocusAndBlur", "outFunctionsControl"] }, { kind: "component", type: LibsUiComponentsPopoverComponent, selector: "libs_ui-components-popover,[LibsUiComponentsPopoverDirective]", inputs: ["debugId", "flagMouse", "type", "mode", "config", "ignoreShowPopover", "elementRefCustom", "initEventInElementRefCustom", "classInclude", "ignoreHiddenPopoverContentWhenMouseLeave", "ignoreStopPropagationEvent", "ignoreCursorPointerModeLikeClick", "isAddContentToParentDocument", "ignoreClickOutside"], outputs: ["outEvent", "outChangStageFlagMouse", "outEventPopoverContent", "outFunctionsControl"] }, { kind: "directive", type: LibsUiComponentsScrollOverlayDirective, selector: "[LibsUiComponentsScrollOverlayDirective]", inputs: ["debugMode", "ignoreInit", "classContainer", "options", "elementCheckScrollX", "elementCheckScrollY", "elementScroll"], outputs: ["outScroll", "outScrollX", "outScrollY", "outScrollTop", "outScrollBottom"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
109
109
  }
110
110
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: LibsUiComponentsEmojiComponent, decorators: [{
111
111
  type: Component,
112
- args: [{ selector: 'libs_ui-components-emoji', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, imports: [TranslateModule, LibsUiComponentsInputsSearchComponent, LibsUiComponentsPopoverComponent, LibsUiComponentsScrollOverlayDirective], template: "<libs_ui-components-popover\n [classInclude]=\"classInclude()\"\n [config]=\"{\n content: 'i18n_text_emoji',\n zIndex: (zIndex() || 1200) + 4,\n }\"\n [ignoreShowPopover]=\"ignoreShowPopoverText()\"\n (outFunctionsControl)=\"handlerFunctionsControl($event)\">\n <libs_ui-components-popover\n type=\"other\"\n mode=\"click-toggle\"\n class=\"flex\"\n [ignoreHiddenPopoverContentWhenMouseLeave]=\"true\"\n [config]=\"configPopover()\"\n [debugId]=\"'debug icon emoij'\"\n (outChangStageFlagMouse)=\"handlerFlagMouse($event)\"\n (outFunctionsControl)=\"handlerFunctionsControl($event)\">\n @if (!isNgContent()) {\n <i class=\"before:!text-[16px] before:!text-[#6a7383] {{ classIconInclude() }}\"></i>\n } @else {\n <ng-content></ng-content>\n }\n </libs_ui-components-popover>\n</libs_ui-components-popover>\n<ng-template #emojiRef>\n <div class=\"py-[10px] flex flex-col {{ classPopup() }}\">\n <div class=\"mx-[10px] mb-[12px]\">\n <div\n class=\"flex\"\n LibsUiComponentsScrollOverlayDirective>\n @for (category of emojisCategories(); track category) {\n <div\n class=\"grow p-[4px] rounded-[4px] bg-[#ffffff] libs-ui-bg-list-hover\"\n [class.libs-ui-bg-list-active]=\"filter().groupSelected === category.group_name\"\n (click)=\"handlerChooseCategory($event, category)\"\n (keyup.enter)=\"handlerChooseCategory($event, category)\">\n <div class=\"mt-[1px] cursor-pointer text-[18px]\">\n {{ category.iconGroup }}\n </div>\n </div>\n }\n </div>\n </div>\n <div class=\"mx-[10px] mb-[12px]\">\n <libs_ui-components-inputs-search\n [searchConfig]=\"{\n placeholder: 'i18n_search',\n }\"\n [debounceTime]=\"0\"\n (outSearch)=\"handlerSearchEmoji($event)\" />\n </div>\n <div class=\"h-full w-full relative\">\n <div\n #elementViewEmoji\n class=\"w-full h-full px-[10px] absolute\"\n LibsUiComponentsScrollOverlayDirective\n (outScrollBottom)=\"handlerScrollBottom()\">\n @if (dataEmojiView().dataView.length) {\n @for (item of dataEmojiView().dataView; track $index) {\n <!-- set ignoreShowPopover to false to enable tooltip hover -->\n <span\n LibsUiComponentsPopoverDirective\n [ignoreShowPopover]=\"true\"\n [config]=\"{ content: item.description, zIndex: (zIndex() || 1200) + 5 }\"\n class=\"cursor-pointer flex shrink-0 h-fit m-[2px] float-left\"\n (click)=\"handlerAddEmoji(item)\"\n (keyup.enter)=\"handlerAddEmoji(item)\">\n {{ item.emoji }}\n </span>\n }\n } @else {\n <div class=\"libs-ui-font-h5r text-[#9ca2ad] h-full w-full items-center justify-center\">\n {{ 'i18n_no_result' | translate }}\n </div>\n }\n </div>\n </div>\n </div>\n</ng-template>\n" }]
112
+ args: [{ selector: 'libs_ui-components-emoji', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, imports: [TranslateModule, LibsUiComponentsInputsSearchComponent, LibsUiComponentsPopoverComponent, LibsUiComponentsScrollOverlayDirective], template: "<libs_ui-components-popover\n [classInclude]=\"classInclude()\"\n [config]=\"{\n content: 'i18n_text_emoji',\n zIndex: (zIndex() || 1200) + 4,\n }\"\n [ignoreShowPopover]=\"ignoreShowPopoverText()\"\n (outFunctionsControl)=\"handlerFunctionsControl($event)\">\n <libs_ui-components-popover\n type=\"other\"\n mode=\"click-toggle\"\n class=\"flex\"\n [ignoreHiddenPopoverContentWhenMouseLeave]=\"true\"\n [config]=\"configPopover()\"\n [debugId]=\"'debug icon emoij'\"\n (outChangStageFlagMouse)=\"handlerFlagMouse($event)\"\n (outFunctionsControl)=\"handlerFunctionsControl($event)\">\n @if (!isNgContent()) {\n <i class=\"before:!text-[16px] before:!text-[#6a7383] {{ classIconInclude() }}\"></i>\n } @else {\n <ng-content></ng-content>\n }\n </libs_ui-components-popover>\n</libs_ui-components-popover>\n<ng-template #emojiRef>\n <div class=\"py-[10px] flex flex-col {{ classPopup() }}\">\n <div class=\"mx-[10px] mb-[12px]\">\n <div\n class=\"flex\"\n LibsUiComponentsScrollOverlayDirective>\n @for (category of emojisCategories(); track category) {\n <div\n class=\"grow p-[4px] rounded-[4px] bg-[#ffffff] libs-ui-bg-list-hover\"\n [class.libs-ui-bg-list-active]=\"filter().groupSelected === category.group_name\"\n (click)=\"handlerChooseCategory($event, category)\"\n (keydown.enter)=\"handlerChooseCategory($event, category)\">\n <div class=\"mt-[1px] cursor-pointer text-[18px]\">\n {{ category.iconGroup }}\n </div>\n </div>\n }\n </div>\n </div>\n <div class=\"mx-[10px] mb-[12px]\">\n <libs_ui-components-inputs-search\n [searchConfig]=\"{\n placeholder: 'i18n_search',\n }\"\n [debounceTime]=\"0\"\n (outSearch)=\"handlerSearchEmoji($event)\" />\n </div>\n <div class=\"h-full w-full relative\">\n <div\n #elementViewEmoji\n class=\"w-full h-full px-[10px] absolute\"\n LibsUiComponentsScrollOverlayDirective\n (outScrollBottom)=\"handlerScrollBottom()\">\n @if (dataEmojiView().dataView.length) {\n @for (item of dataEmojiView().dataView; track $index) {\n <!-- set ignoreShowPopover to false to enable tooltip hover -->\n <span\n LibsUiComponentsPopoverDirective\n [ignoreShowPopover]=\"true\"\n [config]=\"{ content: item.description, zIndex: (zIndex() || 1200) + 5 }\"\n class=\"cursor-pointer flex shrink-0 h-fit m-[2px] float-left\"\n (click)=\"handlerAddEmoji(item)\"\n (keydown.enter)=\"handlerAddEmoji(item)\">\n {{ item.emoji }}\n </span>\n }\n } @else {\n <div class=\"libs-ui-font-h5r text-[#9ca2ad] h-full w-full items-center justify-center\">\n {{ 'i18n_no_result' | translate }}\n </div>\n }\n </div>\n </div>\n </div>\n</ng-template>\n" }]
113
113
  }], ctorParameters: () => [] });
114
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW1vamkuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy11aS9jb21wb25lbnRzL2lucHV0cy9lbW9qaS9zcmMvZW1vamkuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy11aS9jb21wb25lbnRzL2lucHV0cy9lbW9qaS9zcmMvZW1vamkuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFpQix1QkFBdUIsRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFjLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFlLFNBQVMsRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDaEssT0FBTyxFQUFFLHFDQUFxQyxFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDMUYsT0FBTyxFQUE2RCxnQ0FBZ0MsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQzFJLE9BQU8sRUFBRSxzQ0FBc0MsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBRTVGLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUMvQyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDdEQsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sRUFBRSxNQUFNLHdCQUF3QixDQUFDOzs7QUFFdEU7OztHQUdHO0FBU0gsTUFBTSxPQUFPLDhCQUE4QjtJQUN6QyxtQkFBbUI7SUFDRixnQkFBZ0IsR0FBRyxNQUFNLENBQTJDLFNBQVMsQ0FBQyxDQUFDO0lBRXRGLGdCQUFnQixHQUFHLE1BQU0sQ0FBcUIsSUFBSSxLQUFLLEVBQWUsQ0FBQyxDQUFDO0lBQ3hFLE1BQU0sR0FBRyxNQUFNLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFFLFNBQVMsRUFBRSxFQUFFLEVBQUUsYUFBYSxFQUFFLG1CQUFtQixFQUFFLE9BQU8sRUFBRSxHQUFHLEVBQUUsQ0FBQyxD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LElBQUksRUFBRSxPQUFPLEVBQUUsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDeEMsTUFBTSxVQUFVLEdBQUcsVUFBVSxDQUFDLEtBQUssQ0FBQyxJQUFJLEdBQUcsT0FBTyxFQUFFLElBQUksR0FBRyxPQUFPLEdBQUcsT0FBTyxDQUFDLENBQUM7UUFFOUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxHQUFHLElBQUksRUFBRSxPQUFPLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsUUFBUSxFQUFFLEdBQUcsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUMzSSxDQUFDO3dHQXhIVSw4QkFBOEI7NEZBQTlCLDhCQUE4QixnbERDckIzQyxvK0ZBK0VBLDJDRDVEWSxlQUFlLDRGQUFFLHFDQUFxQyxvVkFBRSxnQ0FBZ0Msb2dCQUFFLHNDQUFzQzs7NEZBRS9ILDhCQUE4QjtrQkFSMUMsU0FBUzsrQkFFRSwwQkFBMEIsY0FFeEIsSUFBSSxtQkFDQyx1QkFBdUIsQ0FBQyxNQUFNLFdBQ3RDLENBQUMsZUFBZSxFQUFFLHFDQUFxQyxFQUFFLGdDQUFnQyxFQUFFLHNDQUFzQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQWZ0ZXJWaWV3SW5pdCwgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENvbXBvbmVudCwgZWZmZWN0LCBFbGVtZW50UmVmLCBpbnB1dCwgb3V0cHV0LCBzaWduYWwsIFRlbXBsYXRlUmVmLCB1bnRyYWNrZWQsIHZpZXdDaGlsZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTGlic1VpQ29tcG9uZW50c0lucHV0c1NlYXJjaENvbXBvbmVudCB9IGZyb20gJ0BsaWJzLXVpL2NvbXBvbmVudHMtaW5wdXRzLXNlYXJjaCc7XG5pbXBvcnQgeyBJRmxhZ01vdXNlLCBJUG9wb3ZlckZ1bmN0aW9uQ29udHJvbEV2ZW50LCBJUG9wb3Zlck92ZXJsYXksIExpYnNVaUNvbXBvbmVudHNQb3BvdmVyQ29tcG9uZW50IH0gZnJvbSAnQGxpYnMtdWkvY29tcG9uZW50cy1wb3BvdmVyJztcbmltcG9ydCB7IExpYnNVaUNvbXBvbmVudHNTY3JvbGxPdmVybGF5RGlyZWN0aXZlIH0gZnJvbSAnQGxpYnMtdWkvY29tcG9uZW50cy1zY3JvbGwtb3ZlcmxheSc7XG5pbXBvcnQgeyBUWVBFX1RFTVBMQVRFX1JFRiB9IGZyb20gJ0BsaWJzLXVpL2ludGVyZmFjZXMtdHlwZXMnO1xuaW1wb3J0IHsgZGVsZXRlVW5pY29kZSB9IGZyb20gJ0BsaWJzLXVpL3V0aWxzJztcbmltcG9ydCB7IFRyYW5zbGF0ZU1vZHVsZSB9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xuaW1wb3J0IHsgZGVmYXVsdENvbmZpZ1BvcG92ZXIsIGVtb2ppcyB9IGZyb20gJy4vZGVmaW5lcy9lbW9qaS5kZWZpbmUnO1xuaW1wb3J0IHsgSUVtb2ppLCBJR3JvdXBFbW9qaSB9IGZyb20gJy4vaW50ZXJmYWNlcy9lbW9qaS5pbnRlcmZhY2UnO1xuLyoqXG4gKiBDb21wb25lbnQgY2jhu41uIEVtb2ppIChFbW9qaSBQaWNrZXIpIHbhu5tpIHTDrW5oIG7Eg25nIHTDrG0ga2nhur9tIHbDoCBwaMOibiBsb+G6oWlcbiAqIEjhu5cgdHLhu6MgaGnhu4NuIHRo4buLIHRyb25nIFBvcG92ZXIgaG/DoG4gY2jhu4luaCB24bubaSBsYXp5IGxvYWRpbmcgZGFuaCBzw6FjaCBlbW9qaVxuICovXG5AQ29tcG9uZW50KHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBhbmd1bGFyLWVzbGludC9jb21wb25lbnQtc2VsZWN0b3JcbiAgc2VsZWN0b3I6ICdsaWJzX3VpLWNvbXBvbmVudHMtZW1vamknLFxuICB0ZW1wbGF0ZVVybDogJy4vZW1vamkuY29tcG9uZW50Lmh0bWwnLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgaW1wb3J0czogW1RyYW5zbGF0ZU1vZHVsZSwgTGlic1VpQ29tcG9uZW50c0lucHV0c1NlYXJjaENvbXBvbmVudCwgTGlic1VpQ29tcG9uZW50c1BvcG92ZXJDb21wb25lbnQsIExpYnNVaUNvbXBvbmVudHNTY3JvbGxPdmVybGF5RGlyZWN0aXZlXSxcbn0pXG5leHBvcnQgY2xhc3MgTGlic1VpQ29tcG9uZW50c0Vtb2ppQ29tcG9uZW50IGltcGxlbWVudHMgQWZ0ZXJWaWV3SW5pdCB7XG4gIC8vICNyZWdpb24gUFJPUEVSVFlcbiAgcHJpdmF0ZSByZWFkb25seSBmdW5jdGlvbnNDb250cm9sID0gc2lnbmFsPElQb3BvdmVyRnVuY3Rpb25Db250cm9sRXZlbnQgfCB1bmRlZmluZWQ+KHVuZGVmaW5lZCk7XG5cbiAgcHJvdGVjdGVkIGVtb2ppc0NhdGVnb3JpZXMgPSBzaWduYWw8QXJyYXk8SUdyb3VwRW1vamk+PihuZXcgQXJyYXk8SUdyb3VwRW1vamk+KCkpO1xuICBwcm90ZWN0ZWQgZmlsdGVyID0gc2lnbmFsKHsgcGFnZTogMCwga2V5U2VhcmNoOiAnJywgZ3JvdXBTZWxlY3RlZDogJ1NtaWxleXMgJiBFbW90aW9uJywgcGVyUGFnZTogMTcwIH0pO1xuICBwcm90ZWN0ZWQgZGF0YUVtb2ppVmlldyA9IHNpZ25hbDx7IGRhdGFWaWV3OiBBcnJheTxJRW1vamk+OyBhbGxEYXRhOiBBcnJheTxJRW1vamk+IH0+KHsgZGF0YVZpZXc6IFtdLCBhbGxEYXRhOiBbXSB9KTtcblxuICAvLyAjcmVnaW9uIElOUFVUXG4gIC8qKiBD4bqldSBow6xuaCBvdmVybGF5IGNobyBQb3BvdmVyIGNo4bupYSBFbW9qaSBQaWNrZXIgKi9cbiAgcmVhZG9ubHkgY29uZmlnUG9wb3ZlciA9IGlucHV0PElQb3BvdmVyT3ZlcmxheSwgSVBvcG92ZXJPdmVybGF5IHwgdW5kZWZpbmVkPihkZWZhdWx0Q29uZmlnUG9wb3ZlcigpLCB7IHRyYW5zZm9ybTogKHZhbHVlKSA9PiB2YWx1ZSA/PyBkZWZhdWx0Q29uZmlnUG9wb3ZlcigpIH0pO1xuXG4gIC8qKiBT4butIGThu6VuZyBuZy1jb250ZW50IGzDoG0gdHJpZ2dlciB0aGF5IHbDrCBpY29uIG3hurdjIMSR4buLbmggKi9cbiAgcmVhZG9ubHkgaXNOZ0NvbnRlbnQgPSBpbnB1dDxib29sZWFuPigpO1xuXG4gIC8qKiBHacOhIHRy4buLIFotaW5kZXggY2hvIHBvcHVwLiBU4buxIMSR4buZbmcgb2Zmc2V0ICs1IGNobyBjb250ZW50LiAqL1xuICByZWFkb25seSB6SW5kZXggPSBpbnB1dDxudW1iZXIsIG51bWJlciB8IHVuZGVmaW5lZD4oMCwgeyB0cmFuc2Zvcm06ICh2YWx1ZSkgPT4gdmFsdWUgPz8gMCB9KTtcbiAgcmVhZG9ubHkgaWdub3JlU2hvd1BvcG92ZXJUZXh0ID0gaW5wdXQ8Ym9vbGVhbj4oKTtcblxuICAvKiogQ2jhur8gxJHhu5kgY8SDbiBs4buBIGNobyBQb3BvdmVyIChzdGFydCB8IGNlbnRlciB8IGVuZCkgKi9cbiAgcmVhZG9ubHkgbW9kZVBvcG92ZXJQb3NpdGlvbiA9IGlucHV0PCdzdGFydCcgfCAnY2VudGVyJyB8ICdlbmQnIHwgdW5kZWZpbmVkPigpO1xuXG4gIC8qKiBDU1MgY2xhc3MgY2hvIGNvbnRhaW5lciBj4bunYSBwb3B1cCBjaOG7jW4gZW1vamkgKi9cbiAgcmVhZG9ubHkgY2xhc3NQb3B1cCA9IGlucHV0PHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPigndy1bMjkwcHhdIGgtWzI0NXB4XScsIHsgdHJhbnNmb3JtOiAodmFsKSA9PiB2YWwgPz8gJ3ctWzI5MHB4XSBoLVsyNDVweF0nIH0pO1xuXG4gIC8qKiBDU1MgY2xhc3MgYuG7lSBzdW5nIGNobyB0cmlnZ2VyIGNvbnRhaW5lciAqL1xuICByZWFkb25seSBjbGFzc0luY2x1ZGUgPSBpbnB1dDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4oJycsIHsgdHJhbnNmb3JtOiAodmFsKSA9PiB2YWwgPz8gJycgfSk7XG5cbiAgLyoqIENTUyBjbGFzcyBjaG8gaWNvbiB0cmlnZ2VyICht4bq3YyDEkeG7i25oOiBsaWJzLXVpLWljb24tYWRkKSAqL1xuICByZWFkb25seSBjbGFzc0ljb25JbmNsdWRlID0gaW5wdXQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+KCdsaWJzLXVpLWljb24tYWRkJywgeyB0cmFuc2Zvcm06ICh2YWwpID0+IHZhbCA/PyAnbGlicy11aS1pY29uLWFkZCcgfSk7XG5cbiAgLy8gI3JlZ2lvbiBPVVRQVVRcbiAgLyoqIEV2ZW50IGVtaXQga2hpIG5nxrDhu51pIGTDuW5nIGNo4buNbiBt4buZdCBlbW9qaS4gVHLhuqMgduG7gSBrw70gdOG7sSBlbW9qaS4gKi9cbiAgcmVhZG9ubHkgb3V0RXZlbnRFbW9qaSA9IG91dHB1dDxzdHJpbmc+KCk7XG5cbiAgLyoqIEVtaXQgY8OhYyBmdW5jdGlvbnMgxJFp4buBdSBraGnhu4NuIFBvcG92ZXIgKHNob3cvcmVtb3ZlKSAqL1xuICByZWFkb25seSBvdXRGdW5jdGlvbnNDb250cm9sID0gb3V0cHV0PElQb3BvdmVyRnVuY3Rpb25Db250cm9sRXZlbnQ+KCk7XG4gIHJlYWRvbmx5IG91dEZsYWdNb3VzZSA9IG91dHB1dDxJRmxhZ01vdXNlPigpO1xuXG4gIC8qIFZJRVcgQ0hJTEQgKi9cbiAgcHJpdmF0ZSByZWFkb25seSBlbW9qaVJlZiA9IHZpZXdDaGlsZDxUZW1wbGF0ZVJlZjxUWVBFX1RFTVBMQVRFX1JFRj4+KCdlbW9qaVJlZicpO1xuICBwcml2YXRlIHJlYWRvbmx5IGVsZW1lbnRWaWV3RW1vamkgPSB2aWV3Q2hpbGQ8RWxlbWVudFJlZjxUWVBFX1RFTVBMQVRFX1JFRj4+KCdlbGVtZW50Vmlld0Vtb2ppJyk7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5lbW9qaXNDYXRlZ29yaWVzLnNldChcbiAgICAgIGVtb2ppcygpLm1hcCgoaXRlbSkgPT4gKHtcbiAgICAgICAgLi4uaXRlbSxcbiAgICAgICAgaWNvbkdyb3VwOiBpdGVtLmVtb2ppc1swXS5lbW9qaSxcbiAgICAgICAgZW1vamlzOiBuZXcgQXJyYXk8SUVtb2ppPigpLFxuICAgICAgfSkpXG4gICAgKTtcblxuICAgIGVmZmVjdCgoKSA9PiB7XG4gICAgICBpZiAodGhpcy56SW5kZXgoKSkge1xuICAgICAgICB1bnRyYWNrZWQoKCkgPT4ge1xuICAgICAgICAgIHRoaXMuY29uZmlnUG9wb3ZlcigpLnpJbmRleCA9IHRoaXMuekluZGV4KCkgKyA1O1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMubW9kZVBvcG92ZXJQb3NpdGlvbigpICYmIHRoaXMuY29uZmlnUG9wb3ZlcigpLnBvc2l0aW9uKSB7XG4gICAgICAgIHVudHJhY2tlZCgoKSA9PiB7XG4gICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgICAgICAodGhpcy5jb25maWdQb3BvdmVyKCkgYXMgYW55KS5wb3NpdGlvbi5tb2RlID0gdGhpcy5tb2RlUG9wb3ZlclBvc2l0aW9uKCk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5jb25maWdQb3BvdmVyKCkpIHtcbiAgICAgICAgdGhpcy5jb25maWdQb3BvdmVyKCkudGVtcGxhdGUgPSB0aGlzLmVtb2ppUmVmKCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XG4gICAgdGhpcy5nZXREYXRhVmlldygpO1xuICB9XG5cbiAgLyogRlVOQ1RJT05TICovXG4gIHByb3RlY3RlZCBhc3luYyBoYW5kbGVyQWRkRW1vamkoZGF0YTogSUVtb2ppKSB7XG4gICAgdGhpcy5vdXRFdmVudEVtb2ppLmVtaXQoZGF0YS5lbW9qaSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgaGFuZGxlckZ1bmN0aW9uc0NvbnRyb2woZXZlbnQ6IElQb3BvdmVyRnVuY3Rpb25Db250cm9sRXZlbnQpIHtcbiAgICB0aGlzLmZ1bmN0aW9uc0NvbnRyb2wuc2V0KGV2ZW50KTtcbiAgICB0aGlzLm91dEZ1bmN0aW9uc0NvbnRyb2wuZW1pdChldmVudCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IEZ1bmN0aW9uc0NvbnRyb2woKTogSVBvcG92ZXJGdW5jdGlvbkNvbnRyb2xFdmVudCB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuZnVuY3Rpb25zQ29udHJvbCgpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIGhhbmRsZXJGbGFnTW91c2UoZmxhZ01vdXNlOiBJRmxhZ01vdXNlKSB7XG4gICAgdGhpcy5vdXRGbGFnTW91c2UuZW1pdChmbGFnTW91c2UpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIGhhbmRsZXJDaG9vc2VDYXRlZ29yeShldmVudDogRXZlbnQsIGNhdGVnb3J5OiBJR3JvdXBFbW9qaSkge1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIHRoaXMuZmlsdGVyLnVwZGF0ZSgoZGF0YSkgPT4gKHsgLi4uZGF0YSwgcGFnZTogMCwgZ3JvdXBTZWxlY3RlZDogY2F0ZWdvcnkuZ3JvdXBfbmFtZSB9KSk7XG4gICAgdGhpcy5nZXREYXRhVmlldygpO1xuICAgIHRoaXMuZWxlbWVudFZpZXdFbW9qaSgpPy5uYXRpdmVFbGVtZW50LnNjcm9sbCh7IHRvcDogMCB9KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyBoYW5kbGVyU2VhcmNoRW1vamkoa2V5U2VhcmNoOiBzdHJpbmcpIHtcbiAgICB0aGlzLmZpbHRlci51cGRhdGUoKGRhdGEpID0+ICh7IC4uLmRhdGEsIHBhZ2U6IDAsIGtleVNlYXJjaDoga2V5U2VhcmNoLnRyaW0oKSB9KSk7XG4gICAgdGhpcy5nZXREYXRhVmlldygpO1xuICAgIHRoaXMuZWxlbWVudFZpZXdFbW9qaSgpPy5uYXRpdmVFbGVtZW50LnNjcm9sbCh7IHRvcDogMCB9KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBoYW5kbGVyU2Nyb2xsQm90dG9tKCkge1xuICAgIHRoaXMuZmlsdGVyLnVwZGF0ZSgoZGF0YSkgPT4gKHsgLi4uZGF0YSwgcGFnZTogZGF0YS5wYWdlICsgMSB9KSk7XG4gICAgdGhpcy5nZXREYXRhVmlldygpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXREYXRhVmlldygpIHtcbiAgICBjb25zdCBlbW9qaUJ5R3JvdXAgPSBlbW9qaXMoKS5maW5kKChpdGVtKSA9PiBpdGVtLmdyb3VwX25hbWUgPT09IHRoaXMuZmlsdGVyKCkuZ3JvdXBTZWxlY3RlZCkgYXMgSUdyb3VwRW1vamk7XG4gICAgY29uc3QgZW1vamlNYXRjaCA9IGVtb2ppQnlHcm91cC5lbW9qaXMuZmlsdGVyKChpdGVtKSA9PiBkZWxldGVVbmljb2RlKGl0ZW0uZGVzY3JpcHRpb24pLnRvTG9jYWxlTG93ZXJDYXNlKCkuaW5jbHVkZXMoZGVsZXRlVW5pY29kZSh0aGlzLmZpbHRlcigpLmtleVNlYXJjaC50b0xvY2FsZUxvd2VyQ2FzZSgpKSkpO1xuXG4gICAgY29uc3QgeyBwYWdlLCBwZXJQYWdlIH0gPSB0aGlzLmZpbHRlcigpO1xuICAgIGNvbnN0IGRhdGFJblBhZ2UgPSBlbW9qaU1hdGNoLnNsaWNlKHBhZ2UgKiBwZXJQYWdlLCBwYWdlICogcGVyUGFnZSArIHBlclBhZ2UpO1xuXG4gICAgdGhpcy5kYXRhRW1vamlWaWV3LnVwZGF0ZSgoaXRlbSkgPT4gKHsgLi4uaXRlbSwgYWxsRGF0YTogZW1vamlNYXRjaCwgZGF0YVZpZXc6IHBhZ2UgPyBbLi4uaXRlbS5kYXRhVmlldywgLi4uZGF0YUluUGFnZV0gOiBkYXRhSW5QYWdlIH0pKTtcbiAgfVxufVxuIiwiPGxpYnNfdWktY29tcG9uZW50cy1wb3BvdmVyXG4gIFtjbGFzc0luY2x1ZGVdPVwiY2xhc3NJbmNsdWRlKClcIlxuICBbY29uZmlnXT1cIntcbiAgICBjb250ZW50OiAnaTE4bl90ZXh0X2Vtb2ppJyxcbiAgICB6SW5kZXg6ICh6SW5kZXgoKSB8fCAxMjAwKSArIDQsXG4gIH1cIlxuICBbaWdub3JlU2hvd1BvcG92ZXJdPVwiaWdub3JlU2hvd1BvcG92ZXJUZXh0KClcIlxuICAob3V0RnVuY3Rpb25zQ29udHJvbCk9XCJoYW5kbGVyRnVuY3Rpb25zQ29udHJvbCgkZXZlbnQpXCI+XG4gIDxsaWJzX3VpLWNvbXBvbmVudHMtcG9wb3ZlclxuICAgIHR5cGU9XCJvdGhlclwiXG4gICAgbW9kZT1cImNsaWNrLXRvZ2dsZVwiXG4gICAgY2xhc3M9XCJmbGV4XCJcbiAgICBbaWdub3JlSGlkZGVuUG9wb3ZlckNvbnRlbnRXaGVuTW91c2VMZWF2ZV09XCJ0cnVlXCJcbiAgICBbY29uZmlnXT1cImNvbmZpZ1BvcG92ZXIoKVwiXG4gICAgW2RlYnVnSWRdPVwiJ2RlYnVnIGljb24gZW1vaWonXCJcbiAgICAob3V0Q2hhbmdTdGFnZUZsYWdNb3VzZSk9XCJoYW5kbGVyRmxhZ01vdXNlKCRldmVudClcIlxuICAgIChvdXRGdW5jdGlvbnNDb250cm9sKT1cImhhbmRsZXJGdW5jdGlvbnNDb250cm9sKCRldmVudClcIj5cbiAgICBAaWYgKCFpc05nQ29udGVudCgpKSB7XG4gICAgICA8aSBjbGFzcz1cImJlZm9yZTohdGV4dC1bMTZweF0gYmVmb3JlOiF0ZXh0LVsjNmE3MzgzXSB7eyBjbGFzc0ljb25JbmNsdWRlKCkgfX1cIj48L2k+XG4gICAgfSBAZWxzZSB7XG4gICAgICA8bmctY29udGVudD48L25nLWNvbnRlbnQ+XG4gICAgfVxuICA8L2xpYnNfdWktY29tcG9uZW50cy1wb3BvdmVyPlxuPC9saWJzX3VpLWNvbXBvbmVudHMtcG9wb3Zlcj5cbjxuZy10ZW1wbGF0ZSAjZW1vamlSZWY+XG4gIDxkaXYgY2xhc3M9XCJweS1bMTBweF0gZmxleCBmbGV4LWNvbCB7eyBjbGFzc1BvcHVwKCkgfX1cIj5cbiAgICA8ZGl2IGNsYXNzPVwibXgtWzEwcHhdIG1iLVsxMnB4XVwiPlxuICAgICAgPGRpdlxuICAgICAgICBjbGFzcz1cImZsZXhcIlxuICAgICAgICBMaWJzVWlDb21wb25lbnRzU2Nyb2xsT3ZlcmxheURpcmVjdGl2ZT5cbiAgICAgICAgQGZvciAoY2F0ZWdvcnkgb2YgZW1vamlzQ2F0ZWdvcmllcygpOyB0cmFjayBjYXRlZ29yeSkge1xuICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgIGNsYXNzPVwiZ3JvdyBwLVs0cHhdIHJvdW5kZWQtWzRweF0gYmctWyNmZmZmZmZdIGxpYnMtdWktYmctbGlzdC1ob3ZlclwiXG4gICAgICAgICAgICBbY2xhc3MubGlicy11aS1iZy1saXN0LWFjdGl2ZV09XCJmaWx0ZXIoKS5ncm91cFNlbGVjdGVkID09PSBjYXRlZ29yeS5ncm91cF9uYW1lXCJcbiAgICAgICAgICAgIChjbGljayk9XCJoYW5kbGVyQ2hvb3NlQ2F0ZWdvcnkoJGV2ZW50LCBjYXRlZ29yeSlcIlxuICAgICAgICAgICAgKGtleXVwLmVudGVyKT1cImhhbmRsZXJDaG9vc2VDYXRlZ29yeSgkZXZlbnQsIGNhdGVnb3J5KVwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm10LVsxcHhdIGN1cnNvci1wb2ludGVyIHRleHQtWzE4cHhdXCI+XG4gICAgICAgICAgICAgIHt7IGNhdGVnb3J5Lmljb25Hcm91cCB9fVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIH1cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJteC1bMTBweF0gbWItWzEycHhdXCI+XG4gICAgICA8bGlic191aS1jb21wb25lbnRzLWlucHV0cy1zZWFyY2hcbiAgICAgICAgW3NlYXJjaENvbmZpZ109XCJ7XG4gICAgICAgICAgcGxhY2Vob2xkZXI6ICdpMThuX3NlYXJjaCcsXG4gICAgICAgIH1cIlxuICAgICAgICBbZGVib3VuY2VUaW1lXT1cIjBcIlxuICAgICAgICAob3V0U2VhcmNoKT1cImhhbmRsZXJTZWFyY2hFbW9qaSgkZXZlbnQpXCIgLz5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwiaC1mdWxsIHctZnVsbCByZWxhdGl2ZVwiPlxuICAgICAgPGRpdlxuICAgICAgICAjZWxlbWVudFZpZXdFbW9qaVxuICAgICAgICBjbGFzcz1cInctZnVsbCBoLWZ1bGwgcHgtWzEwcHhdIGFic29sdXRlXCJcbiAgICAgICAgTGlic1VpQ29tcG9uZW50c1Njcm9sbE92ZXJsYXlEaXJlY3RpdmVcbiAgICAgICAgKG91dFNjcm9sbEJvdHRvbSk9XCJoYW5kbGVyU2Nyb2xsQm90dG9tKClcIj5cbiAgICAgICAgQGlmIChkYXRhRW1vamlWaWV3KCkuZGF0YVZpZXcubGVuZ3RoKSB7XG4gICAgICAgICAgQGZvciAoaXRlbSBvZiBkYXRhRW1vamlWaWV3KCkuZGF0YVZpZXc7IHRyYWNrICRpbmRleCkge1xuICAgICAgICAgICAgPCEtLSBzZXQgaWdub3JlU2hvd1BvcG92ZXIgdG8gZmFsc2UgdG8gZW5hYmxlIHRvb2x0aXAgaG92ZXIgLS0+XG4gICAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgICBMaWJzVWlDb21wb25lbnRzUG9wb3ZlckRpcmVjdGl2ZVxuICAgICAgICAgICAgICBbaWdub3JlU2hvd1BvcG92ZXJdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgIFtjb25maWddPVwieyBjb250ZW50OiBpdGVtLmRlc2NyaXB0aW9uLCB6SW5kZXg6ICh6SW5kZXgoKSB8fCAxMjAwKSArIDUgfVwiXG4gICAgICAgICAgICAgIGNsYXNzPVwiY3Vyc29yLXBvaW50ZXIgZmxleCBzaHJpbmstMCBoLWZpdCBtLVsycHhdIGZsb2F0LWxlZnRcIlxuICAgICAgICAgICAgICAoY2xpY2spPVwiaGFuZGxlckFkZEVtb2ppKGl0ZW0pXCJcbiAgICAgICAgICAgICAgKGtleXVwLmVudGVyKT1cImhhbmRsZXJBZGRFbW9qaShpdGVtKVwiPlxuICAgICAgICAgICAgICB7eyBpdGVtLmVtb2ppIH19XG4gICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgfVxuICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwibGlicy11aS1mb250LWg1ciB0ZXh0LVsjOWNhMmFkXSBoLWZ1bGwgdy1mdWxsIGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlclwiPlxuICAgICAgICAgICAge3sgJ2kxOG5fbm9fcmVzdWx0JyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICB9XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuIl19
114
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW1vamkuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy11aS9jb21wb25lbnRzL2lucHV0cy9lbW9qaS9zcmMvZW1vamkuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy11aS9jb21wb25lbnRzL2lucHV0cy9lbW9qaS9zcmMvZW1vamkuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFpQix1QkFBdUIsRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFjLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFlLFNBQVMsRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDaEssT0FBTyxFQUFFLHFDQUFxQyxFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDMUYsT0FBTyxFQUE2RCxnQ0FBZ0MsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQzFJLE9BQU8sRUFBRSxzQ0FBc0MsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBRTVGLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUMvQyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDdEQsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sRUFBRSxNQUFNLHdCQUF3QixDQUFDOzs7QUFFdEU7OztHQUdHO0FBU0gsTUFBTSxPQUFPLDhCQUE4QjtJQUN6QyxtQkFBbUI7SUFDRixnQkFBZ0IsR0FBRyxNQUFNLENBQTJDLFNBQVMsQ0FBQyxDQUFDO0lBRXRGLGdCQUFnQixHQUFHLE1BQU0sQ0FBcUIsSUFBSSxLQUFLLEVBQWUsQ0FBQyxDQUFDO0lBQ3hFLE1BQU0sR0FBRyxNQUFNLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFFLFNBQVMsRUFBRSxFQUFFLEVBQUUsYUFBYSxFQUFFLG1CQUFtQixFQUFFLE9BQU8sRUFBRSxHQUFHLEVBQUUsQ0FBQyxD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LElBQUksRUFBRSxPQUFPLEVBQUUsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDeEMsTUFBTSxVQUFVLEdBQUcsVUFBVSxDQUFDLEtBQUssQ0FBQyxJQUFJLEdBQUcsT0FBTyxFQUFFLElBQUksR0FBRyxPQUFPLEdBQUcsT0FBTyxDQUFDLENBQUM7UUFFOUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxHQUFHLElBQUksRUFBRSxPQUFPLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsUUFBUSxFQUFFLEdBQUcsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUMzSSxDQUFDO3dHQXhIVSw4QkFBOEI7NEZBQTlCLDhCQUE4QixnbERDckIzQyx3K0ZBK0VBLDJDRDVEWSxlQUFlLDRGQUFFLHFDQUFxQyxvVkFBRSxnQ0FBZ0Msb2dCQUFFLHNDQUFzQzs7NEZBRS9ILDhCQUE4QjtrQkFSMUMsU0FBUzsrQkFFRSwwQkFBMEIsY0FFeEIsSUFBSSxtQkFDQyx1QkFBdUIsQ0FBQyxNQUFNLFdBQ3RDLENBQUMsZUFBZSxFQUFFLHFDQUFxQyxFQUFFLGdDQUFnQyxFQUFFLHNDQUFzQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQWZ0ZXJWaWV3SW5pdCwgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENvbXBvbmVudCwgZWZmZWN0LCBFbGVtZW50UmVmLCBpbnB1dCwgb3V0cHV0LCBzaWduYWwsIFRlbXBsYXRlUmVmLCB1bnRyYWNrZWQsIHZpZXdDaGlsZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTGlic1VpQ29tcG9uZW50c0lucHV0c1NlYXJjaENvbXBvbmVudCB9IGZyb20gJ0BsaWJzLXVpL2NvbXBvbmVudHMtaW5wdXRzLXNlYXJjaCc7XG5pbXBvcnQgeyBJRmxhZ01vdXNlLCBJUG9wb3ZlckZ1bmN0aW9uQ29udHJvbEV2ZW50LCBJUG9wb3Zlck92ZXJsYXksIExpYnNVaUNvbXBvbmVudHNQb3BvdmVyQ29tcG9uZW50IH0gZnJvbSAnQGxpYnMtdWkvY29tcG9uZW50cy1wb3BvdmVyJztcbmltcG9ydCB7IExpYnNVaUNvbXBvbmVudHNTY3JvbGxPdmVybGF5RGlyZWN0aXZlIH0gZnJvbSAnQGxpYnMtdWkvY29tcG9uZW50cy1zY3JvbGwtb3ZlcmxheSc7XG5pbXBvcnQgeyBUWVBFX1RFTVBMQVRFX1JFRiB9IGZyb20gJ0BsaWJzLXVpL2ludGVyZmFjZXMtdHlwZXMnO1xuaW1wb3J0IHsgZGVsZXRlVW5pY29kZSB9IGZyb20gJ0BsaWJzLXVpL3V0aWxzJztcbmltcG9ydCB7IFRyYW5zbGF0ZU1vZHVsZSB9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xuaW1wb3J0IHsgZGVmYXVsdENvbmZpZ1BvcG92ZXIsIGVtb2ppcyB9IGZyb20gJy4vZGVmaW5lcy9lbW9qaS5kZWZpbmUnO1xuaW1wb3J0IHsgSUVtb2ppLCBJR3JvdXBFbW9qaSB9IGZyb20gJy4vaW50ZXJmYWNlcy9lbW9qaS5pbnRlcmZhY2UnO1xuLyoqXG4gKiBDb21wb25lbnQgY2jhu41uIEVtb2ppIChFbW9qaSBQaWNrZXIpIHbhu5tpIHTDrW5oIG7Eg25nIHTDrG0ga2nhur9tIHbDoCBwaMOibiBsb+G6oWlcbiAqIEjhu5cgdHLhu6MgaGnhu4NuIHRo4buLIHRyb25nIFBvcG92ZXIgaG/DoG4gY2jhu4luaCB24bubaSBsYXp5IGxvYWRpbmcgZGFuaCBzw6FjaCBlbW9qaVxuICovXG5AQ29tcG9uZW50KHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBhbmd1bGFyLWVzbGludC9jb21wb25lbnQtc2VsZWN0b3JcbiAgc2VsZWN0b3I6ICdsaWJzX3VpLWNvbXBvbmVudHMtZW1vamknLFxuICB0ZW1wbGF0ZVVybDogJy4vZW1vamkuY29tcG9uZW50Lmh0bWwnLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgaW1wb3J0czogW1RyYW5zbGF0ZU1vZHVsZSwgTGlic1VpQ29tcG9uZW50c0lucHV0c1NlYXJjaENvbXBvbmVudCwgTGlic1VpQ29tcG9uZW50c1BvcG92ZXJDb21wb25lbnQsIExpYnNVaUNvbXBvbmVudHNTY3JvbGxPdmVybGF5RGlyZWN0aXZlXSxcbn0pXG5leHBvcnQgY2xhc3MgTGlic1VpQ29tcG9uZW50c0Vtb2ppQ29tcG9uZW50IGltcGxlbWVudHMgQWZ0ZXJWaWV3SW5pdCB7XG4gIC8vICNyZWdpb24gUFJPUEVSVFlcbiAgcHJpdmF0ZSByZWFkb25seSBmdW5jdGlvbnNDb250cm9sID0gc2lnbmFsPElQb3BvdmVyRnVuY3Rpb25Db250cm9sRXZlbnQgfCB1bmRlZmluZWQ+KHVuZGVmaW5lZCk7XG5cbiAgcHJvdGVjdGVkIGVtb2ppc0NhdGVnb3JpZXMgPSBzaWduYWw8QXJyYXk8SUdyb3VwRW1vamk+PihuZXcgQXJyYXk8SUdyb3VwRW1vamk+KCkpO1xuICBwcm90ZWN0ZWQgZmlsdGVyID0gc2lnbmFsKHsgcGFnZTogMCwga2V5U2VhcmNoOiAnJywgZ3JvdXBTZWxlY3RlZDogJ1NtaWxleXMgJiBFbW90aW9uJywgcGVyUGFnZTogMTcwIH0pO1xuICBwcm90ZWN0ZWQgZGF0YUVtb2ppVmlldyA9IHNpZ25hbDx7IGRhdGFWaWV3OiBBcnJheTxJRW1vamk+OyBhbGxEYXRhOiBBcnJheTxJRW1vamk+IH0+KHsgZGF0YVZpZXc6IFtdLCBhbGxEYXRhOiBbXSB9KTtcblxuICAvLyAjcmVnaW9uIElOUFVUXG4gIC8qKiBD4bqldSBow6xuaCBvdmVybGF5IGNobyBQb3BvdmVyIGNo4bupYSBFbW9qaSBQaWNrZXIgKi9cbiAgcmVhZG9ubHkgY29uZmlnUG9wb3ZlciA9IGlucHV0PElQb3BvdmVyT3ZlcmxheSwgSVBvcG92ZXJPdmVybGF5IHwgdW5kZWZpbmVkPihkZWZhdWx0Q29uZmlnUG9wb3ZlcigpLCB7IHRyYW5zZm9ybTogKHZhbHVlKSA9PiB2YWx1ZSA/PyBkZWZhdWx0Q29uZmlnUG9wb3ZlcigpIH0pO1xuXG4gIC8qKiBT4butIGThu6VuZyBuZy1jb250ZW50IGzDoG0gdHJpZ2dlciB0aGF5IHbDrCBpY29uIG3hurdjIMSR4buLbmggKi9cbiAgcmVhZG9ubHkgaXNOZ0NvbnRlbnQgPSBpbnB1dDxib29sZWFuPigpO1xuXG4gIC8qKiBHacOhIHRy4buLIFotaW5kZXggY2hvIHBvcHVwLiBU4buxIMSR4buZbmcgb2Zmc2V0ICs1IGNobyBjb250ZW50LiAqL1xuICByZWFkb25seSB6SW5kZXggPSBpbnB1dDxudW1iZXIsIG51bWJlciB8IHVuZGVmaW5lZD4oMCwgeyB0cmFuc2Zvcm06ICh2YWx1ZSkgPT4gdmFsdWUgPz8gMCB9KTtcbiAgcmVhZG9ubHkgaWdub3JlU2hvd1BvcG92ZXJUZXh0ID0gaW5wdXQ8Ym9vbGVhbj4oKTtcblxuICAvKiogQ2jhur8gxJHhu5kgY8SDbiBs4buBIGNobyBQb3BvdmVyIChzdGFydCB8IGNlbnRlciB8IGVuZCkgKi9cbiAgcmVhZG9ubHkgbW9kZVBvcG92ZXJQb3NpdGlvbiA9IGlucHV0PCdzdGFydCcgfCAnY2VudGVyJyB8ICdlbmQnIHwgdW5kZWZpbmVkPigpO1xuXG4gIC8qKiBDU1MgY2xhc3MgY2hvIGNvbnRhaW5lciBj4bunYSBwb3B1cCBjaOG7jW4gZW1vamkgKi9cbiAgcmVhZG9ubHkgY2xhc3NQb3B1cCA9IGlucHV0PHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPigndy1bMjkwcHhdIGgtWzI0NXB4XScsIHsgdHJhbnNmb3JtOiAodmFsKSA9PiB2YWwgPz8gJ3ctWzI5MHB4XSBoLVsyNDVweF0nIH0pO1xuXG4gIC8qKiBDU1MgY2xhc3MgYuG7lSBzdW5nIGNobyB0cmlnZ2VyIGNvbnRhaW5lciAqL1xuICByZWFkb25seSBjbGFzc0luY2x1ZGUgPSBpbnB1dDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4oJycsIHsgdHJhbnNmb3JtOiAodmFsKSA9PiB2YWwgPz8gJycgfSk7XG5cbiAgLyoqIENTUyBjbGFzcyBjaG8gaWNvbiB0cmlnZ2VyICht4bq3YyDEkeG7i25oOiBsaWJzLXVpLWljb24tYWRkKSAqL1xuICByZWFkb25seSBjbGFzc0ljb25JbmNsdWRlID0gaW5wdXQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+KCdsaWJzLXVpLWljb24tYWRkJywgeyB0cmFuc2Zvcm06ICh2YWwpID0+IHZhbCA/PyAnbGlicy11aS1pY29uLWFkZCcgfSk7XG5cbiAgLy8gI3JlZ2lvbiBPVVRQVVRcbiAgLyoqIEV2ZW50IGVtaXQga2hpIG5nxrDhu51pIGTDuW5nIGNo4buNbiBt4buZdCBlbW9qaS4gVHLhuqMgduG7gSBrw70gdOG7sSBlbW9qaS4gKi9cbiAgcmVhZG9ubHkgb3V0RXZlbnRFbW9qaSA9IG91dHB1dDxzdHJpbmc+KCk7XG5cbiAgLyoqIEVtaXQgY8OhYyBmdW5jdGlvbnMgxJFp4buBdSBraGnhu4NuIFBvcG92ZXIgKHNob3cvcmVtb3ZlKSAqL1xuICByZWFkb25seSBvdXRGdW5jdGlvbnNDb250cm9sID0gb3V0cHV0PElQb3BvdmVyRnVuY3Rpb25Db250cm9sRXZlbnQ+KCk7XG4gIHJlYWRvbmx5IG91dEZsYWdNb3VzZSA9IG91dHB1dDxJRmxhZ01vdXNlPigpO1xuXG4gIC8qIFZJRVcgQ0hJTEQgKi9cbiAgcHJpdmF0ZSByZWFkb25seSBlbW9qaVJlZiA9IHZpZXdDaGlsZDxUZW1wbGF0ZVJlZjxUWVBFX1RFTVBMQVRFX1JFRj4+KCdlbW9qaVJlZicpO1xuICBwcml2YXRlIHJlYWRvbmx5IGVsZW1lbnRWaWV3RW1vamkgPSB2aWV3Q2hpbGQ8RWxlbWVudFJlZjxUWVBFX1RFTVBMQVRFX1JFRj4+KCdlbGVtZW50Vmlld0Vtb2ppJyk7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5lbW9qaXNDYXRlZ29yaWVzLnNldChcbiAgICAgIGVtb2ppcygpLm1hcCgoaXRlbSkgPT4gKHtcbiAgICAgICAgLi4uaXRlbSxcbiAgICAgICAgaWNvbkdyb3VwOiBpdGVtLmVtb2ppc1swXS5lbW9qaSxcbiAgICAgICAgZW1vamlzOiBuZXcgQXJyYXk8SUVtb2ppPigpLFxuICAgICAgfSkpXG4gICAgKTtcblxuICAgIGVmZmVjdCgoKSA9PiB7XG4gICAgICBpZiAodGhpcy56SW5kZXgoKSkge1xuICAgICAgICB1bnRyYWNrZWQoKCkgPT4ge1xuICAgICAgICAgIHRoaXMuY29uZmlnUG9wb3ZlcigpLnpJbmRleCA9IHRoaXMuekluZGV4KCkgKyA1O1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMubW9kZVBvcG92ZXJQb3NpdGlvbigpICYmIHRoaXMuY29uZmlnUG9wb3ZlcigpLnBvc2l0aW9uKSB7XG4gICAgICAgIHVudHJhY2tlZCgoKSA9PiB7XG4gICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgICAgICAodGhpcy5jb25maWdQb3BvdmVyKCkgYXMgYW55KS5wb3NpdGlvbi5tb2RlID0gdGhpcy5tb2RlUG9wb3ZlclBvc2l0aW9uKCk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5jb25maWdQb3BvdmVyKCkpIHtcbiAgICAgICAgdGhpcy5jb25maWdQb3BvdmVyKCkudGVtcGxhdGUgPSB0aGlzLmVtb2ppUmVmKCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XG4gICAgdGhpcy5nZXREYXRhVmlldygpO1xuICB9XG5cbiAgLyogRlVOQ1RJT05TICovXG4gIHByb3RlY3RlZCBhc3luYyBoYW5kbGVyQWRkRW1vamkoZGF0YTogSUVtb2ppKSB7XG4gICAgdGhpcy5vdXRFdmVudEVtb2ppLmVtaXQoZGF0YS5lbW9qaSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgaGFuZGxlckZ1bmN0aW9uc0NvbnRyb2woZXZlbnQ6IElQb3BvdmVyRnVuY3Rpb25Db250cm9sRXZlbnQpIHtcbiAgICB0aGlzLmZ1bmN0aW9uc0NvbnRyb2wuc2V0KGV2ZW50KTtcbiAgICB0aGlzLm91dEZ1bmN0aW9uc0NvbnRyb2wuZW1pdChldmVudCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IEZ1bmN0aW9uc0NvbnRyb2woKTogSVBvcG92ZXJGdW5jdGlvbkNvbnRyb2xFdmVudCB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuZnVuY3Rpb25zQ29udHJvbCgpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIGhhbmRsZXJGbGFnTW91c2UoZmxhZ01vdXNlOiBJRmxhZ01vdXNlKSB7XG4gICAgdGhpcy5vdXRGbGFnTW91c2UuZW1pdChmbGFnTW91c2UpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIGhhbmRsZXJDaG9vc2VDYXRlZ29yeShldmVudDogRXZlbnQsIGNhdGVnb3J5OiBJR3JvdXBFbW9qaSkge1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIHRoaXMuZmlsdGVyLnVwZGF0ZSgoZGF0YSkgPT4gKHsgLi4uZGF0YSwgcGFnZTogMCwgZ3JvdXBTZWxlY3RlZDogY2F0ZWdvcnkuZ3JvdXBfbmFtZSB9KSk7XG4gICAgdGhpcy5nZXREYXRhVmlldygpO1xuICAgIHRoaXMuZWxlbWVudFZpZXdFbW9qaSgpPy5uYXRpdmVFbGVtZW50LnNjcm9sbCh7IHRvcDogMCB9KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyBoYW5kbGVyU2VhcmNoRW1vamkoa2V5U2VhcmNoOiBzdHJpbmcpIHtcbiAgICB0aGlzLmZpbHRlci51cGRhdGUoKGRhdGEpID0+ICh7IC4uLmRhdGEsIHBhZ2U6IDAsIGtleVNlYXJjaDoga2V5U2VhcmNoLnRyaW0oKSB9KSk7XG4gICAgdGhpcy5nZXREYXRhVmlldygpO1xuICAgIHRoaXMuZWxlbWVudFZpZXdFbW9qaSgpPy5uYXRpdmVFbGVtZW50LnNjcm9sbCh7IHRvcDogMCB9KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBoYW5kbGVyU2Nyb2xsQm90dG9tKCkge1xuICAgIHRoaXMuZmlsdGVyLnVwZGF0ZSgoZGF0YSkgPT4gKHsgLi4uZGF0YSwgcGFnZTogZGF0YS5wYWdlICsgMSB9KSk7XG4gICAgdGhpcy5nZXREYXRhVmlldygpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXREYXRhVmlldygpIHtcbiAgICBjb25zdCBlbW9qaUJ5R3JvdXAgPSBlbW9qaXMoKS5maW5kKChpdGVtKSA9PiBpdGVtLmdyb3VwX25hbWUgPT09IHRoaXMuZmlsdGVyKCkuZ3JvdXBTZWxlY3RlZCkgYXMgSUdyb3VwRW1vamk7XG4gICAgY29uc3QgZW1vamlNYXRjaCA9IGVtb2ppQnlHcm91cC5lbW9qaXMuZmlsdGVyKChpdGVtKSA9PiBkZWxldGVVbmljb2RlKGl0ZW0uZGVzY3JpcHRpb24pLnRvTG9jYWxlTG93ZXJDYXNlKCkuaW5jbHVkZXMoZGVsZXRlVW5pY29kZSh0aGlzLmZpbHRlcigpLmtleVNlYXJjaC50b0xvY2FsZUxvd2VyQ2FzZSgpKSkpO1xuXG4gICAgY29uc3QgeyBwYWdlLCBwZXJQYWdlIH0gPSB0aGlzLmZpbHRlcigpO1xuICAgIGNvbnN0IGRhdGFJblBhZ2UgPSBlbW9qaU1hdGNoLnNsaWNlKHBhZ2UgKiBwZXJQYWdlLCBwYWdlICogcGVyUGFnZSArIHBlclBhZ2UpO1xuXG4gICAgdGhpcy5kYXRhRW1vamlWaWV3LnVwZGF0ZSgoaXRlbSkgPT4gKHsgLi4uaXRlbSwgYWxsRGF0YTogZW1vamlNYXRjaCwgZGF0YVZpZXc6IHBhZ2UgPyBbLi4uaXRlbS5kYXRhVmlldywgLi4uZGF0YUluUGFnZV0gOiBkYXRhSW5QYWdlIH0pKTtcbiAgfVxufVxuIiwiPGxpYnNfdWktY29tcG9uZW50cy1wb3BvdmVyXG4gIFtjbGFzc0luY2x1ZGVdPVwiY2xhc3NJbmNsdWRlKClcIlxuICBbY29uZmlnXT1cIntcbiAgICBjb250ZW50OiAnaTE4bl90ZXh0X2Vtb2ppJyxcbiAgICB6SW5kZXg6ICh6SW5kZXgoKSB8fCAxMjAwKSArIDQsXG4gIH1cIlxuICBbaWdub3JlU2hvd1BvcG92ZXJdPVwiaWdub3JlU2hvd1BvcG92ZXJUZXh0KClcIlxuICAob3V0RnVuY3Rpb25zQ29udHJvbCk9XCJoYW5kbGVyRnVuY3Rpb25zQ29udHJvbCgkZXZlbnQpXCI+XG4gIDxsaWJzX3VpLWNvbXBvbmVudHMtcG9wb3ZlclxuICAgIHR5cGU9XCJvdGhlclwiXG4gICAgbW9kZT1cImNsaWNrLXRvZ2dsZVwiXG4gICAgY2xhc3M9XCJmbGV4XCJcbiAgICBbaWdub3JlSGlkZGVuUG9wb3ZlckNvbnRlbnRXaGVuTW91c2VMZWF2ZV09XCJ0cnVlXCJcbiAgICBbY29uZmlnXT1cImNvbmZpZ1BvcG92ZXIoKVwiXG4gICAgW2RlYnVnSWRdPVwiJ2RlYnVnIGljb24gZW1vaWonXCJcbiAgICAob3V0Q2hhbmdTdGFnZUZsYWdNb3VzZSk9XCJoYW5kbGVyRmxhZ01vdXNlKCRldmVudClcIlxuICAgIChvdXRGdW5jdGlvbnNDb250cm9sKT1cImhhbmRsZXJGdW5jdGlvbnNDb250cm9sKCRldmVudClcIj5cbiAgICBAaWYgKCFpc05nQ29udGVudCgpKSB7XG4gICAgICA8aSBjbGFzcz1cImJlZm9yZTohdGV4dC1bMTZweF0gYmVmb3JlOiF0ZXh0LVsjNmE3MzgzXSB7eyBjbGFzc0ljb25JbmNsdWRlKCkgfX1cIj48L2k+XG4gICAgfSBAZWxzZSB7XG4gICAgICA8bmctY29udGVudD48L25nLWNvbnRlbnQ+XG4gICAgfVxuICA8L2xpYnNfdWktY29tcG9uZW50cy1wb3BvdmVyPlxuPC9saWJzX3VpLWNvbXBvbmVudHMtcG9wb3Zlcj5cbjxuZy10ZW1wbGF0ZSAjZW1vamlSZWY+XG4gIDxkaXYgY2xhc3M9XCJweS1bMTBweF0gZmxleCBmbGV4LWNvbCB7eyBjbGFzc1BvcHVwKCkgfX1cIj5cbiAgICA8ZGl2IGNsYXNzPVwibXgtWzEwcHhdIG1iLVsxMnB4XVwiPlxuICAgICAgPGRpdlxuICAgICAgICBjbGFzcz1cImZsZXhcIlxuICAgICAgICBMaWJzVWlDb21wb25lbnRzU2Nyb2xsT3ZlcmxheURpcmVjdGl2ZT5cbiAgICAgICAgQGZvciAoY2F0ZWdvcnkgb2YgZW1vamlzQ2F0ZWdvcmllcygpOyB0cmFjayBjYXRlZ29yeSkge1xuICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgIGNsYXNzPVwiZ3JvdyBwLVs0cHhdIHJvdW5kZWQtWzRweF0gYmctWyNmZmZmZmZdIGxpYnMtdWktYmctbGlzdC1ob3ZlclwiXG4gICAgICAgICAgICBbY2xhc3MubGlicy11aS1iZy1saXN0LWFjdGl2ZV09XCJmaWx0ZXIoKS5ncm91cFNlbGVjdGVkID09PSBjYXRlZ29yeS5ncm91cF9uYW1lXCJcbiAgICAgICAgICAgIChjbGljayk9XCJoYW5kbGVyQ2hvb3NlQ2F0ZWdvcnkoJGV2ZW50LCBjYXRlZ29yeSlcIlxuICAgICAgICAgICAgKGtleWRvd24uZW50ZXIpPVwiaGFuZGxlckNob29zZUNhdGVnb3J5KCRldmVudCwgY2F0ZWdvcnkpXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibXQtWzFweF0gY3Vyc29yLXBvaW50ZXIgdGV4dC1bMThweF1cIj5cbiAgICAgICAgICAgICAge3sgY2F0ZWdvcnkuaWNvbkdyb3VwIH19XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgfVxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cIm14LVsxMHB4XSBtYi1bMTJweF1cIj5cbiAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtaW5wdXRzLXNlYXJjaFxuICAgICAgICBbc2VhcmNoQ29uZmlnXT1cIntcbiAgICAgICAgICBwbGFjZWhvbGRlcjogJ2kxOG5fc2VhcmNoJyxcbiAgICAgICAgfVwiXG4gICAgICAgIFtkZWJvdW5jZVRpbWVdPVwiMFwiXG4gICAgICAgIChvdXRTZWFyY2gpPVwiaGFuZGxlclNlYXJjaEVtb2ppKCRldmVudClcIiAvPlxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJoLWZ1bGwgdy1mdWxsIHJlbGF0aXZlXCI+XG4gICAgICA8ZGl2XG4gICAgICAgICNlbGVtZW50Vmlld0Vtb2ppXG4gICAgICAgIGNsYXNzPVwidy1mdWxsIGgtZnVsbCBweC1bMTBweF0gYWJzb2x1dGVcIlxuICAgICAgICBMaWJzVWlDb21wb25lbnRzU2Nyb2xsT3ZlcmxheURpcmVjdGl2ZVxuICAgICAgICAob3V0U2Nyb2xsQm90dG9tKT1cImhhbmRsZXJTY3JvbGxCb3R0b20oKVwiPlxuICAgICAgICBAaWYgKGRhdGFFbW9qaVZpZXcoKS5kYXRhVmlldy5sZW5ndGgpIHtcbiAgICAgICAgICBAZm9yIChpdGVtIG9mIGRhdGFFbW9qaVZpZXcoKS5kYXRhVmlldzsgdHJhY2sgJGluZGV4KSB7XG4gICAgICAgICAgICA8IS0tIHNldCBpZ25vcmVTaG93UG9wb3ZlciB0byBmYWxzZSB0byBlbmFibGUgdG9vbHRpcCBob3ZlciAtLT5cbiAgICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICAgIExpYnNVaUNvbXBvbmVudHNQb3BvdmVyRGlyZWN0aXZlXG4gICAgICAgICAgICAgIFtpZ25vcmVTaG93UG9wb3Zlcl09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgW2NvbmZpZ109XCJ7IGNvbnRlbnQ6IGl0ZW0uZGVzY3JpcHRpb24sIHpJbmRleDogKHpJbmRleCgpIHx8IDEyMDApICsgNSB9XCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJjdXJzb3ItcG9pbnRlciBmbGV4IHNocmluay0wIGgtZml0IG0tWzJweF0gZmxvYXQtbGVmdFwiXG4gICAgICAgICAgICAgIChjbGljayk9XCJoYW5kbGVyQWRkRW1vamkoaXRlbSlcIlxuICAgICAgICAgICAgICAoa2V5ZG93bi5lbnRlcik9XCJoYW5kbGVyQWRkRW1vamkoaXRlbSlcIj5cbiAgICAgICAgICAgICAge3sgaXRlbS5lbW9qaSB9fVxuICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgIH1cbiAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImxpYnMtdWktZm9udC1oNXIgdGV4dC1bIzljYTJhZF0gaC1mdWxsIHctZnVsbCBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXJcIj5cbiAgICAgICAgICAgIHt7ICdpMThuX25vX3Jlc3VsdCcgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgfVxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cbiJdfQ==
@@ -1,5 +1,5 @@
1
1
  import * as i0 from '@angular/core';
2
- import { signal, input, output, viewChild, effect, untracked, ChangeDetectionStrategy, Component } from '@angular/core';
2
+ import { signal, input, output, viewChild, effect, untracked, Component, ChangeDetectionStrategy } from '@angular/core';
3
3
  import { LibsUiComponentsInputsSearchComponent } from '@libs-ui/components-inputs-search';
4
4
  import { LibsUiComponentsPopoverComponent } from '@libs-ui/components-popover';
5
5
  import { LibsUiComponentsScrollOverlayDirective } from '@libs-ui/components-scroll-overlay';
@@ -1903,11 +1903,11 @@ class LibsUiComponentsEmojiComponent {
1903
1903
  this.dataEmojiView.update((item) => ({ ...item, allData: emojiMatch, dataView: page ? [...item.dataView, ...dataInPage] : dataInPage }));
1904
1904
  }
1905
1905
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: LibsUiComponentsEmojiComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
1906
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: LibsUiComponentsEmojiComponent, isStandalone: true, selector: "libs_ui-components-emoji", inputs: { configPopover: { classPropertyName: "configPopover", publicName: "configPopover", isSignal: true, isRequired: false, transformFunction: null }, isNgContent: { classPropertyName: "isNgContent", publicName: "isNgContent", isSignal: true, isRequired: false, transformFunction: null }, zIndex: { classPropertyName: "zIndex", publicName: "zIndex", isSignal: true, isRequired: false, transformFunction: null }, ignoreShowPopoverText: { classPropertyName: "ignoreShowPopoverText", publicName: "ignoreShowPopoverText", isSignal: true, isRequired: false, transformFunction: null }, modePopoverPosition: { classPropertyName: "modePopoverPosition", publicName: "modePopoverPosition", isSignal: true, isRequired: false, transformFunction: null }, classPopup: { classPropertyName: "classPopup", publicName: "classPopup", isSignal: true, isRequired: false, transformFunction: null }, classInclude: { classPropertyName: "classInclude", publicName: "classInclude", isSignal: true, isRequired: false, transformFunction: null }, classIconInclude: { classPropertyName: "classIconInclude", publicName: "classIconInclude", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { outEventEmoji: "outEventEmoji", outFunctionsControl: "outFunctionsControl", outFlagMouse: "outFlagMouse" }, viewQueries: [{ propertyName: "emojiRef", first: true, predicate: ["emojiRef"], descendants: true, isSignal: true }, { propertyName: "elementViewEmoji", first: true, predicate: ["elementViewEmoji"], descendants: true, isSignal: true }], ngImport: i0, template: "<libs_ui-components-popover\n [classInclude]=\"classInclude()\"\n [config]=\"{\n content: 'i18n_text_emoji',\n zIndex: (zIndex() || 1200) + 4,\n }\"\n [ignoreShowPopover]=\"ignoreShowPopoverText()\"\n (outFunctionsControl)=\"handlerFunctionsControl($event)\">\n <libs_ui-components-popover\n type=\"other\"\n mode=\"click-toggle\"\n class=\"flex\"\n [ignoreHiddenPopoverContentWhenMouseLeave]=\"true\"\n [config]=\"configPopover()\"\n [debugId]=\"'debug icon emoij'\"\n (outChangStageFlagMouse)=\"handlerFlagMouse($event)\"\n (outFunctionsControl)=\"handlerFunctionsControl($event)\">\n @if (!isNgContent()) {\n <i class=\"before:!text-[16px] before:!text-[#6a7383] {{ classIconInclude() }}\"></i>\n } @else {\n <ng-content></ng-content>\n }\n </libs_ui-components-popover>\n</libs_ui-components-popover>\n<ng-template #emojiRef>\n <div class=\"py-[10px] flex flex-col {{ classPopup() }}\">\n <div class=\"mx-[10px] mb-[12px]\">\n <div\n class=\"flex\"\n LibsUiComponentsScrollOverlayDirective>\n @for (category of emojisCategories(); track category) {\n <div\n class=\"grow p-[4px] rounded-[4px] bg-[#ffffff] libs-ui-bg-list-hover\"\n [class.libs-ui-bg-list-active]=\"filter().groupSelected === category.group_name\"\n (click)=\"handlerChooseCategory($event, category)\"\n (keyup.enter)=\"handlerChooseCategory($event, category)\">\n <div class=\"mt-[1px] cursor-pointer text-[18px]\">\n {{ category.iconGroup }}\n </div>\n </div>\n }\n </div>\n </div>\n <div class=\"mx-[10px] mb-[12px]\">\n <libs_ui-components-inputs-search\n [searchConfig]=\"{\n placeholder: 'i18n_search',\n }\"\n [debounceTime]=\"0\"\n (outSearch)=\"handlerSearchEmoji($event)\" />\n </div>\n <div class=\"h-full w-full relative\">\n <div\n #elementViewEmoji\n class=\"w-full h-full px-[10px] absolute\"\n LibsUiComponentsScrollOverlayDirective\n (outScrollBottom)=\"handlerScrollBottom()\">\n @if (dataEmojiView().dataView.length) {\n @for (item of dataEmojiView().dataView; track $index) {\n <!-- set ignoreShowPopover to false to enable tooltip hover -->\n <span\n LibsUiComponentsPopoverDirective\n [ignoreShowPopover]=\"true\"\n [config]=\"{ content: item.description, zIndex: (zIndex() || 1200) + 5 }\"\n class=\"cursor-pointer flex shrink-0 h-fit m-[2px] float-left\"\n (click)=\"handlerAddEmoji(item)\"\n (keyup.enter)=\"handlerAddEmoji(item)\">\n {{ item.emoji }}\n </span>\n }\n } @else {\n <div class=\"libs-ui-font-h5r text-[#9ca2ad] h-full w-full items-center justify-center\">\n {{ 'i18n_no_result' | translate }}\n </div>\n }\n </div>\n </div>\n </div>\n</ng-template>\n", dependencies: [{ kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1.TranslatePipe, name: "translate" }, { kind: "component", type: LibsUiComponentsInputsSearchComponent, selector: "libs_ui-components-inputs-search", inputs: ["disable", "readonly", "searchConfig", "ignoreAutoComplete", "debounceTime", "ignoreStopPropagationEvent", "focusTimeOut", "blurTimeOut"], outputs: ["outSearch", "outValueChange", "outIconLeft", "outIconRight", "outFocusAndBlur", "outFunctionsControl"] }, { kind: "component", type: LibsUiComponentsPopoverComponent, selector: "libs_ui-components-popover,[LibsUiComponentsPopoverDirective]", inputs: ["debugId", "flagMouse", "type", "mode", "config", "ignoreShowPopover", "elementRefCustom", "initEventInElementRefCustom", "classInclude", "ignoreHiddenPopoverContentWhenMouseLeave", "ignoreStopPropagationEvent", "ignoreCursorPointerModeLikeClick", "isAddContentToParentDocument", "ignoreClickOutside"], outputs: ["outEvent", "outChangStageFlagMouse", "outEventPopoverContent", "outFunctionsControl"] }, { kind: "directive", type: LibsUiComponentsScrollOverlayDirective, selector: "[LibsUiComponentsScrollOverlayDirective]", inputs: ["debugMode", "ignoreInit", "classContainer", "options", "elementCheckScrollX", "elementCheckScrollY", "elementScroll"], outputs: ["outScroll", "outScrollX", "outScrollY", "outScrollTop", "outScrollBottom"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
1906
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: LibsUiComponentsEmojiComponent, isStandalone: true, selector: "libs_ui-components-emoji", inputs: { configPopover: { classPropertyName: "configPopover", publicName: "configPopover", isSignal: true, isRequired: false, transformFunction: null }, isNgContent: { classPropertyName: "isNgContent", publicName: "isNgContent", isSignal: true, isRequired: false, transformFunction: null }, zIndex: { classPropertyName: "zIndex", publicName: "zIndex", isSignal: true, isRequired: false, transformFunction: null }, ignoreShowPopoverText: { classPropertyName: "ignoreShowPopoverText", publicName: "ignoreShowPopoverText", isSignal: true, isRequired: false, transformFunction: null }, modePopoverPosition: { classPropertyName: "modePopoverPosition", publicName: "modePopoverPosition", isSignal: true, isRequired: false, transformFunction: null }, classPopup: { classPropertyName: "classPopup", publicName: "classPopup", isSignal: true, isRequired: false, transformFunction: null }, classInclude: { classPropertyName: "classInclude", publicName: "classInclude", isSignal: true, isRequired: false, transformFunction: null }, classIconInclude: { classPropertyName: "classIconInclude", publicName: "classIconInclude", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { outEventEmoji: "outEventEmoji", outFunctionsControl: "outFunctionsControl", outFlagMouse: "outFlagMouse" }, viewQueries: [{ propertyName: "emojiRef", first: true, predicate: ["emojiRef"], descendants: true, isSignal: true }, { propertyName: "elementViewEmoji", first: true, predicate: ["elementViewEmoji"], descendants: true, isSignal: true }], ngImport: i0, template: "<libs_ui-components-popover\n [classInclude]=\"classInclude()\"\n [config]=\"{\n content: 'i18n_text_emoji',\n zIndex: (zIndex() || 1200) + 4,\n }\"\n [ignoreShowPopover]=\"ignoreShowPopoverText()\"\n (outFunctionsControl)=\"handlerFunctionsControl($event)\">\n <libs_ui-components-popover\n type=\"other\"\n mode=\"click-toggle\"\n class=\"flex\"\n [ignoreHiddenPopoverContentWhenMouseLeave]=\"true\"\n [config]=\"configPopover()\"\n [debugId]=\"'debug icon emoij'\"\n (outChangStageFlagMouse)=\"handlerFlagMouse($event)\"\n (outFunctionsControl)=\"handlerFunctionsControl($event)\">\n @if (!isNgContent()) {\n <i class=\"before:!text-[16px] before:!text-[#6a7383] {{ classIconInclude() }}\"></i>\n } @else {\n <ng-content></ng-content>\n }\n </libs_ui-components-popover>\n</libs_ui-components-popover>\n<ng-template #emojiRef>\n <div class=\"py-[10px] flex flex-col {{ classPopup() }}\">\n <div class=\"mx-[10px] mb-[12px]\">\n <div\n class=\"flex\"\n LibsUiComponentsScrollOverlayDirective>\n @for (category of emojisCategories(); track category) {\n <div\n class=\"grow p-[4px] rounded-[4px] bg-[#ffffff] libs-ui-bg-list-hover\"\n [class.libs-ui-bg-list-active]=\"filter().groupSelected === category.group_name\"\n (click)=\"handlerChooseCategory($event, category)\"\n (keydown.enter)=\"handlerChooseCategory($event, category)\">\n <div class=\"mt-[1px] cursor-pointer text-[18px]\">\n {{ category.iconGroup }}\n </div>\n </div>\n }\n </div>\n </div>\n <div class=\"mx-[10px] mb-[12px]\">\n <libs_ui-components-inputs-search\n [searchConfig]=\"{\n placeholder: 'i18n_search',\n }\"\n [debounceTime]=\"0\"\n (outSearch)=\"handlerSearchEmoji($event)\" />\n </div>\n <div class=\"h-full w-full relative\">\n <div\n #elementViewEmoji\n class=\"w-full h-full px-[10px] absolute\"\n LibsUiComponentsScrollOverlayDirective\n (outScrollBottom)=\"handlerScrollBottom()\">\n @if (dataEmojiView().dataView.length) {\n @for (item of dataEmojiView().dataView; track $index) {\n <!-- set ignoreShowPopover to false to enable tooltip hover -->\n <span\n LibsUiComponentsPopoverDirective\n [ignoreShowPopover]=\"true\"\n [config]=\"{ content: item.description, zIndex: (zIndex() || 1200) + 5 }\"\n class=\"cursor-pointer flex shrink-0 h-fit m-[2px] float-left\"\n (click)=\"handlerAddEmoji(item)\"\n (keydown.enter)=\"handlerAddEmoji(item)\">\n {{ item.emoji }}\n </span>\n }\n } @else {\n <div class=\"libs-ui-font-h5r text-[#9ca2ad] h-full w-full items-center justify-center\">\n {{ 'i18n_no_result' | translate }}\n </div>\n }\n </div>\n </div>\n </div>\n</ng-template>\n", dependencies: [{ kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1.TranslatePipe, name: "translate" }, { kind: "component", type: LibsUiComponentsInputsSearchComponent, selector: "libs_ui-components-inputs-search", inputs: ["disable", "readonly", "searchConfig", "ignoreAutoComplete", "debounceTime", "ignoreStopPropagationEvent", "focusTimeOut", "blurTimeOut"], outputs: ["outSearch", "outValueChange", "outIconLeft", "outIconRight", "outFocusAndBlur", "outFunctionsControl"] }, { kind: "component", type: LibsUiComponentsPopoverComponent, selector: "libs_ui-components-popover,[LibsUiComponentsPopoverDirective]", inputs: ["debugId", "flagMouse", "type", "mode", "config", "ignoreShowPopover", "elementRefCustom", "initEventInElementRefCustom", "classInclude", "ignoreHiddenPopoverContentWhenMouseLeave", "ignoreStopPropagationEvent", "ignoreCursorPointerModeLikeClick", "isAddContentToParentDocument", "ignoreClickOutside"], outputs: ["outEvent", "outChangStageFlagMouse", "outEventPopoverContent", "outFunctionsControl"] }, { kind: "directive", type: LibsUiComponentsScrollOverlayDirective, selector: "[LibsUiComponentsScrollOverlayDirective]", inputs: ["debugMode", "ignoreInit", "classContainer", "options", "elementCheckScrollX", "elementCheckScrollY", "elementScroll"], outputs: ["outScroll", "outScrollX", "outScrollY", "outScrollTop", "outScrollBottom"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
1907
1907
  }
1908
1908
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: LibsUiComponentsEmojiComponent, decorators: [{
1909
1909
  type: Component,
1910
- args: [{ selector: 'libs_ui-components-emoji', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, imports: [TranslateModule, LibsUiComponentsInputsSearchComponent, LibsUiComponentsPopoverComponent, LibsUiComponentsScrollOverlayDirective], template: "<libs_ui-components-popover\n [classInclude]=\"classInclude()\"\n [config]=\"{\n content: 'i18n_text_emoji',\n zIndex: (zIndex() || 1200) + 4,\n }\"\n [ignoreShowPopover]=\"ignoreShowPopoverText()\"\n (outFunctionsControl)=\"handlerFunctionsControl($event)\">\n <libs_ui-components-popover\n type=\"other\"\n mode=\"click-toggle\"\n class=\"flex\"\n [ignoreHiddenPopoverContentWhenMouseLeave]=\"true\"\n [config]=\"configPopover()\"\n [debugId]=\"'debug icon emoij'\"\n (outChangStageFlagMouse)=\"handlerFlagMouse($event)\"\n (outFunctionsControl)=\"handlerFunctionsControl($event)\">\n @if (!isNgContent()) {\n <i class=\"before:!text-[16px] before:!text-[#6a7383] {{ classIconInclude() }}\"></i>\n } @else {\n <ng-content></ng-content>\n }\n </libs_ui-components-popover>\n</libs_ui-components-popover>\n<ng-template #emojiRef>\n <div class=\"py-[10px] flex flex-col {{ classPopup() }}\">\n <div class=\"mx-[10px] mb-[12px]\">\n <div\n class=\"flex\"\n LibsUiComponentsScrollOverlayDirective>\n @for (category of emojisCategories(); track category) {\n <div\n class=\"grow p-[4px] rounded-[4px] bg-[#ffffff] libs-ui-bg-list-hover\"\n [class.libs-ui-bg-list-active]=\"filter().groupSelected === category.group_name\"\n (click)=\"handlerChooseCategory($event, category)\"\n (keyup.enter)=\"handlerChooseCategory($event, category)\">\n <div class=\"mt-[1px] cursor-pointer text-[18px]\">\n {{ category.iconGroup }}\n </div>\n </div>\n }\n </div>\n </div>\n <div class=\"mx-[10px] mb-[12px]\">\n <libs_ui-components-inputs-search\n [searchConfig]=\"{\n placeholder: 'i18n_search',\n }\"\n [debounceTime]=\"0\"\n (outSearch)=\"handlerSearchEmoji($event)\" />\n </div>\n <div class=\"h-full w-full relative\">\n <div\n #elementViewEmoji\n class=\"w-full h-full px-[10px] absolute\"\n LibsUiComponentsScrollOverlayDirective\n (outScrollBottom)=\"handlerScrollBottom()\">\n @if (dataEmojiView().dataView.length) {\n @for (item of dataEmojiView().dataView; track $index) {\n <!-- set ignoreShowPopover to false to enable tooltip hover -->\n <span\n LibsUiComponentsPopoverDirective\n [ignoreShowPopover]=\"true\"\n [config]=\"{ content: item.description, zIndex: (zIndex() || 1200) + 5 }\"\n class=\"cursor-pointer flex shrink-0 h-fit m-[2px] float-left\"\n (click)=\"handlerAddEmoji(item)\"\n (keyup.enter)=\"handlerAddEmoji(item)\">\n {{ item.emoji }}\n </span>\n }\n } @else {\n <div class=\"libs-ui-font-h5r text-[#9ca2ad] h-full w-full items-center justify-center\">\n {{ 'i18n_no_result' | translate }}\n </div>\n }\n </div>\n </div>\n </div>\n</ng-template>\n" }]
1910
+ args: [{ selector: 'libs_ui-components-emoji', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, imports: [TranslateModule, LibsUiComponentsInputsSearchComponent, LibsUiComponentsPopoverComponent, LibsUiComponentsScrollOverlayDirective], template: "<libs_ui-components-popover\n [classInclude]=\"classInclude()\"\n [config]=\"{\n content: 'i18n_text_emoji',\n zIndex: (zIndex() || 1200) + 4,\n }\"\n [ignoreShowPopover]=\"ignoreShowPopoverText()\"\n (outFunctionsControl)=\"handlerFunctionsControl($event)\">\n <libs_ui-components-popover\n type=\"other\"\n mode=\"click-toggle\"\n class=\"flex\"\n [ignoreHiddenPopoverContentWhenMouseLeave]=\"true\"\n [config]=\"configPopover()\"\n [debugId]=\"'debug icon emoij'\"\n (outChangStageFlagMouse)=\"handlerFlagMouse($event)\"\n (outFunctionsControl)=\"handlerFunctionsControl($event)\">\n @if (!isNgContent()) {\n <i class=\"before:!text-[16px] before:!text-[#6a7383] {{ classIconInclude() }}\"></i>\n } @else {\n <ng-content></ng-content>\n }\n </libs_ui-components-popover>\n</libs_ui-components-popover>\n<ng-template #emojiRef>\n <div class=\"py-[10px] flex flex-col {{ classPopup() }}\">\n <div class=\"mx-[10px] mb-[12px]\">\n <div\n class=\"flex\"\n LibsUiComponentsScrollOverlayDirective>\n @for (category of emojisCategories(); track category) {\n <div\n class=\"grow p-[4px] rounded-[4px] bg-[#ffffff] libs-ui-bg-list-hover\"\n [class.libs-ui-bg-list-active]=\"filter().groupSelected === category.group_name\"\n (click)=\"handlerChooseCategory($event, category)\"\n (keydown.enter)=\"handlerChooseCategory($event, category)\">\n <div class=\"mt-[1px] cursor-pointer text-[18px]\">\n {{ category.iconGroup }}\n </div>\n </div>\n }\n </div>\n </div>\n <div class=\"mx-[10px] mb-[12px]\">\n <libs_ui-components-inputs-search\n [searchConfig]=\"{\n placeholder: 'i18n_search',\n }\"\n [debounceTime]=\"0\"\n (outSearch)=\"handlerSearchEmoji($event)\" />\n </div>\n <div class=\"h-full w-full relative\">\n <div\n #elementViewEmoji\n class=\"w-full h-full px-[10px] absolute\"\n LibsUiComponentsScrollOverlayDirective\n (outScrollBottom)=\"handlerScrollBottom()\">\n @if (dataEmojiView().dataView.length) {\n @for (item of dataEmojiView().dataView; track $index) {\n <!-- set ignoreShowPopover to false to enable tooltip hover -->\n <span\n LibsUiComponentsPopoverDirective\n [ignoreShowPopover]=\"true\"\n [config]=\"{ content: item.description, zIndex: (zIndex() || 1200) + 5 }\"\n class=\"cursor-pointer flex shrink-0 h-fit m-[2px] float-left\"\n (click)=\"handlerAddEmoji(item)\"\n (keydown.enter)=\"handlerAddEmoji(item)\">\n {{ item.emoji }}\n </span>\n }\n } @else {\n <div class=\"libs-ui-font-h5r text-[#9ca2ad] h-full w-full items-center justify-center\">\n {{ 'i18n_no_result' | translate }}\n </div>\n }\n </div>\n </div>\n </div>\n</ng-template>\n" }]
1911
1911
  }], ctorParameters: () => [] });
1912
1912
 
1913
1913
  /**