ngx-ntk-icon-picker 18.26.4 → 20.25.2

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.
Files changed (36) hide show
  1. package/README.md +63 -24
  2. package/fesm2022/ngx-ntk-icon-picker.mjs +45053 -45026
  3. package/fesm2022/ngx-ntk-icon-picker.mjs.map +1 -1
  4. package/index.d.ts +158 -5
  5. package/package.json +6 -8
  6. package/esm2022/lib/icon-picker.component.mjs +0 -240
  7. package/esm2022/lib/icon-picker.directive.mjs +0 -136
  8. package/esm2022/lib/icon-picker.module.mjs +0 -43
  9. package/esm2022/lib/icon-picker.service.mjs +0 -74
  10. package/esm2022/lib/icon.mjs +0 -18
  11. package/esm2022/lib/icons-pack.mjs +0 -2
  12. package/esm2022/lib/index.mjs +0 -6
  13. package/esm2022/lib/pack/font-awesome4-icons-pack.mjs +0 -4791
  14. package/esm2022/lib/pack/font-awesome5-icons-pack.mjs +0 -18193
  15. package/esm2022/lib/pack/font-awesome6-icons-pack.mjs +0 -16828
  16. package/esm2022/lib/pack/material-icons-pack.mjs +0 -3735
  17. package/esm2022/lib/pack/prime-icons-pack.mjs +0 -951
  18. package/esm2022/lib/search-icon.pipe.mjs +0 -38
  19. package/esm2022/lib/text.directive.mjs +0 -26
  20. package/esm2022/ngx-ntk-icon-picker.mjs +0 -5
  21. package/esm2022/public-api.mjs +0 -5
  22. package/lib/icon-picker.component.d.ts +0 -59
  23. package/lib/icon-picker.directive.d.ts +0 -40
  24. package/lib/icon-picker.module.d.ts +0 -12
  25. package/lib/icon-picker.service.d.ts +0 -15
  26. package/lib/icon.d.ts +0 -17
  27. package/lib/icons-pack.d.ts +0 -4
  28. package/lib/index.d.ts +0 -5
  29. package/lib/pack/font-awesome4-icons-pack.d.ts +0 -5
  30. package/lib/pack/font-awesome5-icons-pack.d.ts +0 -5
  31. package/lib/pack/font-awesome6-icons-pack.d.ts +0 -5
  32. package/lib/pack/material-icons-pack.d.ts +0 -5
  33. package/lib/pack/prime-icons-pack.d.ts +0 -5
  34. package/lib/search-icon.pipe.d.ts +0 -9
  35. package/lib/text.directive.d.ts +0 -9
  36. package/public-api.d.ts +0 -1
package/index.d.ts CHANGED
@@ -1,5 +1,158 @@
1
- /**
2
- * Generated bundle index. Do not edit.
3
- */
4
- /// <amd-module name="ngx-ntk-icon-picker" />
5
- export * from './public-api';
1
+ import { IconName } from '@fortawesome/fontawesome-svg-core';
2
+ import * as i0 from '@angular/core';
3
+ import { OnInit, ElementRef, ChangeDetectorRef, OnChanges, EventEmitter, ViewContainerRef, PipeTransform } from '@angular/core';
4
+ import * as i2 from '@fortawesome/angular-fontawesome';
5
+ import { FaIconLibrary } from '@fortawesome/angular-fontawesome';
6
+ import * as i1 from '@angular/common';
7
+
8
+ declare class Icon {
9
+ name: string;
10
+ id: string;
11
+ filter?: string[];
12
+ aliases?: string[];
13
+ type?: IconType;
14
+ iconName?: IconName;
15
+ prefix?: string;
16
+ }
17
+ declare enum IconType {
18
+ FontAwesome = 0,
19
+ FontAwesome5 = 2,
20
+ Material = 3,
21
+ FontAwesome6 = 4,
22
+ PrimeIcons = 5
23
+ }
24
+
25
+ declare class IconPickerService {
26
+ protected faIconLibrary: FaIconLibrary;
27
+ private fa4IconsPack;
28
+ private fa5IconsPack;
29
+ private fa6IconsPack;
30
+ private matIconsPack;
31
+ private primeIconsPack;
32
+ constructor(faIconLibrary: FaIconLibrary);
33
+ getIcons(ipIconPacks: string[]): Icon[];
34
+ private isIconAvailable;
35
+ static ɵfac: i0.ɵɵFactoryDeclaration<IconPickerService, never>;
36
+ static ɵprov: i0.ɵɵInjectableDeclaration<IconPickerService>;
37
+ }
38
+
39
+ declare class IconPickerComponent implements OnInit {
40
+ private el;
41
+ private cdr;
42
+ private service;
43
+ dialogElement: any;
44
+ ipPosition: string;
45
+ ipHeight: number;
46
+ ipMaxHeight: number;
47
+ ipWidth: number;
48
+ ipIconSize: number;
49
+ ipIconVerticalPadding: number;
50
+ ipIconHorizontalPadding: number;
51
+ ipButtonStyleClass: string;
52
+ ipInputSearchStyleClass: string;
53
+ ipDivSearchStyleClass: string;
54
+ ipUseRootViewContainer: boolean;
55
+ ipKeepSearchFilter: boolean;
56
+ ipPlaceHolder: string;
57
+ ipFallbackIcon: string;
58
+ ipIconPack: string[];
59
+ show: boolean;
60
+ hidden: boolean;
61
+ top: number;
62
+ left: number;
63
+ position: string;
64
+ arrowTop: number;
65
+ selectedIcon: Icon;
66
+ iconType: typeof IconType;
67
+ buttonWidth: number;
68
+ buttonHeight: number;
69
+ icons: Icon[];
70
+ search: string;
71
+ private directiveInstance;
72
+ private initialIcon;
73
+ private directiveElementRef;
74
+ private listenerMouseDown;
75
+ private listenerResize;
76
+ private dialogArrowSize;
77
+ constructor(el: ElementRef, cdr: ChangeDetectorRef, service: IconPickerService);
78
+ setDialog(instance: any, elementRef: ElementRef, icon: string, ipPosition: string, ipHeight: string, ipMaxHeight: string, ipWidth: string, ipPlaceHolder: string, ipFallbackIcon: string, ipIconPack: string[], ipIconSize: string, ipIconVerticalPadding: string, ipIconHorizontalPadding: string, ipButtonStyleClass: string, ipDivSearchStyleClass: string, ipInputSearchStyleClass: string, ipKeepSearchFilter: string, ipUseRootViewContainer?: boolean): void;
79
+ ngOnInit(): void;
80
+ setInitialIcon(icon: string): void;
81
+ openDialog(icon: string): void;
82
+ setSearch(val: string): void;
83
+ selectIcon(icon: Icon): void;
84
+ onMouseDown(event: any): void;
85
+ openIconPicker(): void;
86
+ closeIconPicker(): void;
87
+ onResize(): void;
88
+ setDialogPosition(): void;
89
+ isDescendant(parent: any, child: any): boolean;
90
+ createBox(element: any, offset: boolean): any;
91
+ onIconError(event: any): void;
92
+ getFontAwesome6Icon(iconName: string): any;
93
+ shouldShowFontAwesome6Icon(icon: any): boolean;
94
+ static ɵfac: i0.ɵɵFactoryDeclaration<IconPickerComponent, never>;
95
+ static ɵcmp: i0.ɵɵComponentDeclaration<IconPickerComponent, "icon-picker", never, {}, {}, never, never, true, never>;
96
+ }
97
+
98
+ declare class IconPickerDirective implements OnInit, OnChanges {
99
+ private vcRef;
100
+ private el;
101
+ iconPicker: string;
102
+ ipPlaceHolder: string;
103
+ ipPosition: string;
104
+ ipFallbackIcon: string;
105
+ ipHeight: string;
106
+ ipMaxHeight: string;
107
+ ipWidth: string;
108
+ ipIconSize: string;
109
+ ipIconVerticalPadding: string;
110
+ ipIconHorizontalPadding: string;
111
+ ipIconPack: string[];
112
+ ipKeepSearchFilter: string;
113
+ ipUseRootViewContainer: boolean;
114
+ ipButtonStyleClass: string;
115
+ ipDivSearchStyleClass: string;
116
+ ipInputSearchStyleClass: string;
117
+ iconPickerSelect: EventEmitter<string>;
118
+ iconPickerOpen: EventEmitter<void>;
119
+ iconPickerClose: EventEmitter<void>;
120
+ iconPickerFocus: EventEmitter<void>;
121
+ handleFocus(): void;
122
+ private dialog;
123
+ private created;
124
+ private ignoreChanges;
125
+ constructor(vcRef: ViewContainerRef, el: ElementRef);
126
+ onClick(): void;
127
+ ngOnChanges(changes: any): void;
128
+ ngOnInit(): void;
129
+ openDialog(): void;
130
+ iconSelected(icon: string): void;
131
+ stateChanged(state: boolean): void;
132
+ elementFocus(): void;
133
+ static ɵfac: i0.ɵɵFactoryDeclaration<IconPickerDirective, never>;
134
+ static ɵdir: i0.ɵɵDirectiveDeclaration<IconPickerDirective, "[iconPicker]", never, { "iconPicker": { "alias": "iconPicker"; "required": false; }; "ipPlaceHolder": { "alias": "ipPlaceHolder"; "required": false; }; "ipPosition": { "alias": "ipPosition"; "required": false; }; "ipFallbackIcon": { "alias": "ipFallbackIcon"; "required": false; }; "ipHeight": { "alias": "ipHeight"; "required": false; }; "ipMaxHeight": { "alias": "ipMaxHeight"; "required": false; }; "ipWidth": { "alias": "ipWidth"; "required": false; }; "ipIconSize": { "alias": "ipIconSize"; "required": false; }; "ipIconVerticalPadding": { "alias": "ipIconVerticalPadding"; "required": false; }; "ipIconHorizontalPadding": { "alias": "ipIconHorizontalPadding"; "required": false; }; "ipIconPack": { "alias": "ipIconPack"; "required": false; }; "ipKeepSearchFilter": { "alias": "ipKeepSearchFilter"; "required": false; }; "ipUseRootViewContainer": { "alias": "ipUseRootViewContainer"; "required": false; }; "ipButtonStyleClass": { "alias": "ipButtonStyleClass"; "required": false; }; "ipDivSearchStyleClass": { "alias": "ipDivSearchStyleClass"; "required": false; }; "ipInputSearchStyleClass": { "alias": "ipInputSearchStyleClass"; "required": false; }; }, { "iconPickerSelect": "iconPickerSelect"; "iconPickerOpen": "iconPickerOpen"; "iconPickerClose": "iconPickerClose"; "iconPickerFocus": "iconPickerFocus"; }, never, never, true, never>;
135
+ }
136
+
137
+ declare class TextDirective {
138
+ newValue: EventEmitter<string>;
139
+ text: string;
140
+ changeInput(value: string): void;
141
+ static ɵfac: i0.ɵɵFactoryDeclaration<TextDirective, never>;
142
+ static ɵdir: i0.ɵɵDirectiveDeclaration<TextDirective, "[text]", never, { "text": { "alias": "text"; "required": false; }; }, { "newValue": "newValue"; }, never, never, true, never>;
143
+ }
144
+
145
+ declare class SearchIconPipe implements PipeTransform {
146
+ transform(value: Icon[], search: string): Icon[];
147
+ clean(value: string): string;
148
+ static ɵfac: i0.ɵɵFactoryDeclaration<SearchIconPipe, never>;
149
+ static ɵpipe: i0.ɵɵPipeDeclaration<SearchIconPipe, "searchIcon", true>;
150
+ }
151
+
152
+ declare class IconPickerModule {
153
+ static ɵfac: i0.ɵɵFactoryDeclaration<IconPickerModule, never>;
154
+ static ɵmod: i0.ɵɵNgModuleDeclaration<IconPickerModule, never, [typeof i1.CommonModule, typeof i2.FontAwesomeModule, typeof IconPickerComponent, typeof IconPickerDirective, typeof TextDirective, typeof SearchIconPipe], never>;
155
+ static ɵinj: i0.ɵɵInjectorDeclaration<IconPickerModule>;
156
+ }
157
+
158
+ export { Icon, IconPickerComponent, IconPickerDirective, IconPickerModule, IconPickerService, IconType };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ngx-ntk-icon-picker",
3
- "version": "18.26.4",
3
+ "version": "20.25.2",
4
4
  "description": "Ntk Cms Api And Model For Typscript",
5
5
  "author": "Alireza-Karavi",
6
6
  "license": "ISC",
@@ -12,16 +12,17 @@
12
12
  "api"
13
13
  ],
14
14
  "peerDependencies": {
15
- "@angular/common": ">=10.0.0",
16
- "@angular/core": ">=10.0.0",
15
+ "@angular/common": "^20.1.0",
16
+ "@angular/core": "^20.1.0",
17
17
  "@fortawesome/angular-fontawesome": ">=0.10.2",
18
18
  "@fortawesome/fontawesome-svg-core": ">=6.1.1",
19
19
  "@fortawesome/free-solid-svg-icons": ">=6.1.1",
20
20
  "primeicons": ">=5.0.0"
21
21
  },
22
22
  "dependencies": {
23
- "tslib": "^2.5.0"
23
+ "tslib": "^2.3.0"
24
24
  },
25
+ "sideEffects": false,
25
26
  "module": "fesm2022/ngx-ntk-icon-picker.mjs",
26
27
  "typings": "index.d.ts",
27
28
  "exports": {
@@ -30,10 +31,7 @@
30
31
  },
31
32
  ".": {
32
33
  "types": "./index.d.ts",
33
- "esm2022": "./esm2022/ngx-ntk-icon-picker.mjs",
34
- "esm": "./esm2022/ngx-ntk-icon-picker.mjs",
35
34
  "default": "./fesm2022/ngx-ntk-icon-picker.mjs"
36
35
  }
37
- },
38
- "sideEffects": false
36
+ }
39
37
  }
@@ -1,240 +0,0 @@
1
- import { Component, ViewChild } from '@angular/core';
2
- import { IconType } from './icon';
3
- import * as i0 from "@angular/core";
4
- import * as i1 from "./icon-picker.service";
5
- import * as i2 from "@angular/common";
6
- import * as i3 from "@fortawesome/angular-fontawesome";
7
- import * as i4 from "./text.directive";
8
- import * as i5 from "./search-icon.pipe";
9
- export class IconPickerComponent {
10
- el;
11
- cdr;
12
- service;
13
- dialogElement;
14
- // Popover
15
- ipPosition;
16
- ipHeight;
17
- ipMaxHeight;
18
- ipWidth;
19
- // Icon css
20
- ipIconSize;
21
- ipIconVerticalPadding;
22
- ipIconHorizontalPadding;
23
- // Item Style ie input and button
24
- ipButtonStyleClass;
25
- ipInputSearchStyleClass;
26
- ipDivSearchStyleClass;
27
- ipUseRootViewContainer = false;
28
- // Icon and behaviors
29
- ipKeepSearchFilter;
30
- ipPlaceHolder;
31
- ipFallbackIcon;
32
- ipIconPack;
33
- show;
34
- hidden;
35
- top;
36
- left;
37
- position;
38
- arrowTop;
39
- selectedIcon;
40
- iconType = IconType;
41
- buttonWidth;
42
- buttonHeight;
43
- icons = [];
44
- search = '';
45
- directiveInstance;
46
- initialIcon;
47
- directiveElementRef;
48
- listenerMouseDown;
49
- listenerResize;
50
- dialogArrowSize = 10;
51
- constructor(el, cdr, service) {
52
- this.el = el;
53
- this.cdr = cdr;
54
- this.service = service;
55
- }
56
- setDialog(instance, elementRef, icon, ipPosition, ipHeight, ipMaxHeight, ipWidth, ipPlaceHolder, ipFallbackIcon, ipIconPack, ipIconSize, ipIconVerticalPadding, ipIconHorizontalPadding, ipButtonStyleClass, ipDivSearchStyleClass, ipInputSearchStyleClass, ipKeepSearchFilter, ipUseRootViewContainer) {
57
- this.directiveInstance = instance;
58
- this.setInitialIcon(icon);
59
- this.directiveElementRef = elementRef;
60
- this.ipPosition = ipPosition;
61
- this.ipHeight = parseInt(ipHeight, 10);
62
- this.ipMaxHeight = parseInt(ipMaxHeight, 10);
63
- this.ipWidth = parseInt(ipWidth, 10);
64
- if (!this.ipWidth) {
65
- this.ipWidth = elementRef.nativeElement.offsetWidth;
66
- }
67
- this.ipIconSize = parseInt(ipIconSize, 10);
68
- this.ipIconVerticalPadding = parseInt(ipIconVerticalPadding, 10);
69
- this.ipIconHorizontalPadding = parseInt(ipIconHorizontalPadding, 10);
70
- this.ipKeepSearchFilter = JSON.parse(ipKeepSearchFilter);
71
- this.ipPlaceHolder = ipPlaceHolder;
72
- this.ipFallbackIcon = ipFallbackIcon;
73
- this.ipIconPack = ipIconPack;
74
- this.ipButtonStyleClass = ipButtonStyleClass;
75
- this.ipInputSearchStyleClass = ipInputSearchStyleClass;
76
- this.ipDivSearchStyleClass = ipDivSearchStyleClass;
77
- this.ipUseRootViewContainer = ipUseRootViewContainer;
78
- this.buttonHeight = this.ipIconSize + 2 * this.ipIconVerticalPadding;
79
- this.buttonWidth = this.ipIconSize + 2 * this.ipIconHorizontalPadding;
80
- }
81
- ngOnInit() {
82
- this.icons = this.service.getIcons(this.ipIconPack);
83
- this.listenerMouseDown = (event) => this.onMouseDown(event);
84
- this.listenerResize = () => this.onResize();
85
- this.openDialog(this.initialIcon);
86
- }
87
- setInitialIcon(icon) {
88
- this.initialIcon = icon;
89
- this.selectedIcon = this.icons.find(el => el ?
90
- `fa fa-${el.id}` === icon || `pi pi-${el.id}` === icon || `${el.id}` === icon :
91
- false);
92
- if (this.ipKeepSearchFilter && this.selectedIcon && icon !== this.ipFallbackIcon) {
93
- this.search = this.selectedIcon.id;
94
- }
95
- else {
96
- this.search = '';
97
- }
98
- }
99
- openDialog(icon) {
100
- this.setInitialIcon(icon);
101
- this.openIconPicker();
102
- }
103
- setSearch(val) {
104
- this.search = val;
105
- }
106
- selectIcon(icon) {
107
- if (icon.type === IconType.FontAwesome) {
108
- this.directiveInstance.iconSelected(`fa fa-${icon.id}`);
109
- }
110
- else if (icon.type === IconType.FontAwesome5) {
111
- this.directiveInstance.iconSelected(`${icon.id}`);
112
- }
113
- else if (icon.type === IconType.FontAwesome6) {
114
- this.directiveInstance.iconSelected(`${icon.id}`);
115
- }
116
- else if (icon.type === IconType.Material) {
117
- this.directiveInstance.iconSelected(`${icon.id}`);
118
- }
119
- else if (icon.type === IconType.PrimeIcons) {
120
- this.directiveInstance.iconSelected(`pi pi-${icon.id}`);
121
- }
122
- this.closeIconPicker();
123
- }
124
- onMouseDown(event) {
125
- if (!this.isDescendant(this.el.nativeElement, event.target) && event.target !== this.directiveElementRef.nativeElement) {
126
- this.closeIconPicker();
127
- }
128
- }
129
- openIconPicker() {
130
- if (!this.show) {
131
- this.show = true;
132
- this.hidden = true;
133
- setTimeout(() => {
134
- this.setDialogPosition();
135
- this.hidden = false;
136
- this.cdr.detectChanges();
137
- }, 0);
138
- this.directiveInstance.stateChanged(true);
139
- document.addEventListener('mousedown', this.listenerMouseDown);
140
- window.addEventListener('resize', this.listenerResize);
141
- }
142
- }
143
- closeIconPicker() {
144
- if (this.show) {
145
- this.show = false;
146
- this.directiveInstance.stateChanged(false);
147
- document.removeEventListener('mousedown', this.listenerMouseDown);
148
- window.removeEventListener('resize', this.listenerResize);
149
- this.cdr.detectChanges();
150
- }
151
- }
152
- onResize() {
153
- if (this.position === 'fixed') {
154
- this.setDialogPosition();
155
- }
156
- }
157
- setDialogPosition() {
158
- const dialogHeight = this.dialogElement.nativeElement.offsetHeight;
159
- let node = this.directiveElementRef.nativeElement;
160
- let position = 'static';
161
- let transform = '';
162
- let parentNode = null;
163
- let transformNode = null;
164
- let style = null;
165
- while (node !== null && node.tagName !== 'HTML') {
166
- style = window.getComputedStyle(node);
167
- position = style.getPropertyValue('position');
168
- transform = style.getPropertyValue('transform');
169
- if (position !== 'static' && parentNode === null) {
170
- parentNode = node;
171
- }
172
- if (transform && transform !== 'none' && transformNode === null) {
173
- transformNode = node;
174
- }
175
- if (position === 'fixed') {
176
- parentNode = transformNode;
177
- break;
178
- }
179
- node = node.parentNode;
180
- }
181
- const boxDirective = this.createBox(this.directiveElementRef.nativeElement, (position !== 'fixed'));
182
- if (this.ipUseRootViewContainer || (position === 'fixed' &&
183
- (!parentNode || parentNode instanceof HTMLUnknownElement))) {
184
- this.top = boxDirective.top;
185
- this.left = boxDirective.left;
186
- }
187
- else {
188
- if (parentNode === null) {
189
- parentNode = node;
190
- }
191
- const boxParent = this.createBox(parentNode, (position !== 'fixed'));
192
- this.top = boxDirective.top - boxParent.top;
193
- this.left = boxDirective.left - boxParent.left;
194
- }
195
- if (position === 'fixed') {
196
- this.position = 'fixed';
197
- }
198
- if (this.ipPosition === 'left') {
199
- this.left -= this.ipWidth + this.dialogArrowSize - 2;
200
- }
201
- else if (this.ipPosition === 'top') {
202
- this.top -= dialogHeight + this.dialogArrowSize;
203
- this.arrowTop = dialogHeight - 1;
204
- }
205
- else if (this.ipPosition === 'bottom') {
206
- this.top += boxDirective.height + this.dialogArrowSize;
207
- }
208
- else {
209
- this.left += boxDirective.width + this.dialogArrowSize - 2;
210
- }
211
- }
212
- isDescendant(parent, child) {
213
- let node = child.parentNode;
214
- while (node !== null) {
215
- if (node === parent) {
216
- return true;
217
- }
218
- node = node.parentNode;
219
- }
220
- return false;
221
- }
222
- createBox(element, offset) {
223
- return {
224
- top: element.getBoundingClientRect().top + (offset ? window.pageYOffset : 0),
225
- left: element.getBoundingClientRect().left + (offset ? window.pageXOffset : 0),
226
- width: element.offsetWidth,
227
- height: element.offsetHeight
228
- };
229
- }
230
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: IconPickerComponent, deps: [{ token: i0.ElementRef }, { token: i0.ChangeDetectorRef }, { token: i1.IconPickerService }], target: i0.ɵɵFactoryTarget.Component });
231
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: IconPickerComponent, selector: "icon-picker", viewQueries: [{ propertyName: "dialogElement", first: true, predicate: ["dialogPopup"], descendants: true }], ngImport: i0, template: "<div class=\"icon-picker\" #dialogPopup\r\n [hidden]=\"!show\"\r\n [style.visibility]=\"this.hidden ? 'hidden' : 'visible'\"\r\n [style.height.px]=\"ipHeight\"\r\n [style.width.px]=\"ipWidth\"\r\n [style.top.px]=\"top\"\r\n [style.left.px]=\"left\"\r\n [style.position]=\"position\">\r\n\r\n <div class=\"arrow arrow-{{ipPosition}}\" [style.top.px]=\"arrowTop\"></div>\r\n\r\n <div class=\"icon-search {{ipDivSearchStyleClass}}\">\r\n <input type=\"text\" class=\"{{ipInputSearchStyleClass}}\" [text] [value]=\"search\" (newValue)=\"setSearch($event)\"\r\n [placeholder]=\"ipPlaceHolder\">\r\n </div>\r\n <div class=\"icon-grid\" [ngStyle]=\"{'max-height.px': ipMaxHeight}\">\r\n <div *ngFor=\"let icon of icons | searchIcon:search\">\r\n <button *ngIf=\"icon\" class=\"ip-button-icon {{ipButtonStyleClass}}\" type=\"button\" title=\"{{ icon.name }}\"\r\n [ngClass]=\"{active : icon === selectedIcon}\"\r\n [style.width.px]=\"buttonWidth\"\r\n [style.height.px]=\"buttonHeight\"\r\n [style.padding-top.px]=\"ipIconVerticalPadding\"\r\n [style.padding-bottom.px]=\"ipIconVerticalPadding\"\r\n [style.padding-left.px]=\"ipIconHorizontalPadding\"\r\n [style.padding-right.px]=\"ipIconHorizontalPadding\"\r\n (click)=\"selectIcon(icon)\">\r\n <span *ngIf=\"icon.type === iconType.FontAwesome\" class=\"fa fa-{{icon.id}}\"\r\n [style.font-size.px]=\"ipIconSize\"></span>\r\n <span *ngIf=\"icon.type === iconType.FontAwesome5\" class=\"{{icon.id}}\"\r\n [style.font-size.px]=\"ipIconSize\"></span>\r\n <span *ngIf=\"icon.type === iconType.FontAwesome6\" [style.font-size.px]=\"ipIconSize\">\r\n <fa-icon [icon]=\"['fas', icon.iconName]\"></fa-icon>\r\n </span>\r\n <span *ngIf=\"icon.type === iconType.Material\" class=\"material-icons\"\r\n [style.font-size.px]=\"ipIconSize\">{{icon.id}}</span>\r\n <span *ngIf=\"icon.type === iconType.PrimeIcons\" class=\"pi pi-{{icon.id}}\"\r\n [style.font-size.px]=\"ipIconSize\"></span>\r\n </button>\r\n </div>\r\n </div>\r\n\r\n</div>\r\n", styles: [".icon-picker{box-sizing:border-box;margin:0;position:absolute;z-index:100000;top:250px;left:30px;width:230px;height:auto;border:#777 solid 1px;cursor:default;background-color:#fff;-webkit-user-select:none;user-select:none}.icon-picker i{position:relative;cursor:default}.icon-picker .arrow{position:absolute;z-index:999999;width:0;height:0;border-style:solid}.icon-picker .arrow-right{top:10px;left:-20px;border-width:5px 10px;border-color:rgba(0,0,0,0) #777 rgba(0,0,0,0) rgba(0,0,0,0)}.icon-picker .arrow-left{top:10px;left:100%;border-width:5px 10px;border-color:rgba(0,0,0,0) rgba(0,0,0,0) rgba(0,0,0,0) #777}.icon-picker .arrow-bottom{top:-20px;left:10px;border-width:10px 5px;border-color:rgba(0,0,0,0) rgba(0,0,0,0) #777 rgba(0,0,0,0)}.icon-picker .arrow-top{left:10px;border-width:10px 5px;border-color:#777 rgba(0,0,0,0) rgba(0,0,0,0) rgba(0,0,0,0)}.icon-picker div.icon-search{padding:5px}.icon-picker div.icon-grid{display:flex;overflow-y:auto;flex-direction:row;flex-wrap:wrap;padding:5px}.icon-picker div.icon-grid div{margin:2px}.icon-picker div.cursor-sv{position:relative;width:15px;height:15px;border-radius:50%;border:#ddd solid 1px;cursor:default}.icon-picker div.cursor{position:relative;width:16px;height:16px;border-radius:50%;border:#222 solid 2px;cursor:default}\n"], dependencies: [{ kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: i3.FaIconComponent, selector: "fa-icon", inputs: ["icon", "title", "spin", "pulse", "mask", "styles", "flip", "size", "pull", "border", "inverse", "symbol", "rotate", "fixedWidth", "classes", "transform", "a11yRole"] }, { kind: "directive", type: i4.TextDirective, selector: "[text]", inputs: ["text"], outputs: ["newValue"] }, { kind: "pipe", type: i5.SearchIconPipe, name: "searchIcon" }] });
232
- }
233
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: IconPickerComponent, decorators: [{
234
- type: Component,
235
- args: [{ selector: 'icon-picker', template: "<div class=\"icon-picker\" #dialogPopup\r\n [hidden]=\"!show\"\r\n [style.visibility]=\"this.hidden ? 'hidden' : 'visible'\"\r\n [style.height.px]=\"ipHeight\"\r\n [style.width.px]=\"ipWidth\"\r\n [style.top.px]=\"top\"\r\n [style.left.px]=\"left\"\r\n [style.position]=\"position\">\r\n\r\n <div class=\"arrow arrow-{{ipPosition}}\" [style.top.px]=\"arrowTop\"></div>\r\n\r\n <div class=\"icon-search {{ipDivSearchStyleClass}}\">\r\n <input type=\"text\" class=\"{{ipInputSearchStyleClass}}\" [text] [value]=\"search\" (newValue)=\"setSearch($event)\"\r\n [placeholder]=\"ipPlaceHolder\">\r\n </div>\r\n <div class=\"icon-grid\" [ngStyle]=\"{'max-height.px': ipMaxHeight}\">\r\n <div *ngFor=\"let icon of icons | searchIcon:search\">\r\n <button *ngIf=\"icon\" class=\"ip-button-icon {{ipButtonStyleClass}}\" type=\"button\" title=\"{{ icon.name }}\"\r\n [ngClass]=\"{active : icon === selectedIcon}\"\r\n [style.width.px]=\"buttonWidth\"\r\n [style.height.px]=\"buttonHeight\"\r\n [style.padding-top.px]=\"ipIconVerticalPadding\"\r\n [style.padding-bottom.px]=\"ipIconVerticalPadding\"\r\n [style.padding-left.px]=\"ipIconHorizontalPadding\"\r\n [style.padding-right.px]=\"ipIconHorizontalPadding\"\r\n (click)=\"selectIcon(icon)\">\r\n <span *ngIf=\"icon.type === iconType.FontAwesome\" class=\"fa fa-{{icon.id}}\"\r\n [style.font-size.px]=\"ipIconSize\"></span>\r\n <span *ngIf=\"icon.type === iconType.FontAwesome5\" class=\"{{icon.id}}\"\r\n [style.font-size.px]=\"ipIconSize\"></span>\r\n <span *ngIf=\"icon.type === iconType.FontAwesome6\" [style.font-size.px]=\"ipIconSize\">\r\n <fa-icon [icon]=\"['fas', icon.iconName]\"></fa-icon>\r\n </span>\r\n <span *ngIf=\"icon.type === iconType.Material\" class=\"material-icons\"\r\n [style.font-size.px]=\"ipIconSize\">{{icon.id}}</span>\r\n <span *ngIf=\"icon.type === iconType.PrimeIcons\" class=\"pi pi-{{icon.id}}\"\r\n [style.font-size.px]=\"ipIconSize\"></span>\r\n </button>\r\n </div>\r\n </div>\r\n\r\n</div>\r\n", styles: [".icon-picker{box-sizing:border-box;margin:0;position:absolute;z-index:100000;top:250px;left:30px;width:230px;height:auto;border:#777 solid 1px;cursor:default;background-color:#fff;-webkit-user-select:none;user-select:none}.icon-picker i{position:relative;cursor:default}.icon-picker .arrow{position:absolute;z-index:999999;width:0;height:0;border-style:solid}.icon-picker .arrow-right{top:10px;left:-20px;border-width:5px 10px;border-color:rgba(0,0,0,0) #777 rgba(0,0,0,0) rgba(0,0,0,0)}.icon-picker .arrow-left{top:10px;left:100%;border-width:5px 10px;border-color:rgba(0,0,0,0) rgba(0,0,0,0) rgba(0,0,0,0) #777}.icon-picker .arrow-bottom{top:-20px;left:10px;border-width:10px 5px;border-color:rgba(0,0,0,0) rgba(0,0,0,0) #777 rgba(0,0,0,0)}.icon-picker .arrow-top{left:10px;border-width:10px 5px;border-color:#777 rgba(0,0,0,0) rgba(0,0,0,0) rgba(0,0,0,0)}.icon-picker div.icon-search{padding:5px}.icon-picker div.icon-grid{display:flex;overflow-y:auto;flex-direction:row;flex-wrap:wrap;padding:5px}.icon-picker div.icon-grid div{margin:2px}.icon-picker div.cursor-sv{position:relative;width:15px;height:15px;border-radius:50%;border:#ddd solid 1px;cursor:default}.icon-picker div.cursor{position:relative;width:16px;height:16px;border-radius:50%;border:#222 solid 2px;cursor:default}\n"] }]
236
- }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.ChangeDetectorRef }, { type: i1.IconPickerService }]; }, propDecorators: { dialogElement: [{
237
- type: ViewChild,
238
- args: ['dialogPopup']
239
- }] } });
240
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaWNvbi1waWNrZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LW50ay1pY29uLXBpY2tlci9zcmMvbGliL2ljb24tcGlja2VyLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1udGstaWNvbi1waWNrZXIvc3JjL2xpYi9pY29uLXBpY2tlci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQXFCLFNBQVMsRUFBc0IsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRzVGLE9BQU8sRUFBUSxRQUFRLEVBQUUsTUFBTSxRQUFRLENBQUM7Ozs7Ozs7QUFTeEMsTUFBTSxPQUFPLG1CQUFtQjtJQStDcEI7SUFDQTtJQUNBO0lBaERnQixhQUFhLENBQU07SUFFN0MsVUFBVTtJQUNILFVBQVUsQ0FBUztJQUNuQixRQUFRLENBQVM7SUFDakIsV0FBVyxDQUFTO0lBQ3BCLE9BQU8sQ0FBUztJQUN2QixXQUFXO0lBQ0osVUFBVSxDQUFTO0lBQ25CLHFCQUFxQixDQUFTO0lBQzlCLHVCQUF1QixDQUFTO0lBQ3ZDLGlDQUFpQztJQUMxQixrQkFBa0IsQ0FBUztJQUMzQix1QkFBdUIsQ0FBUztJQUNoQyxxQkFBcUIsQ0FBUztJQUM5QixzQkFBc0IsR0FBWSxLQUFLLENBQUM7SUFDL0MscUJBQXFCO0lBQ2Qsa0JBQWtCLENBQVU7SUFDNUIsYUFBYSxDQUFTO0lBQ3RCLGNBQWMsQ0FBUztJQUN2QixVQUFVLENBQVc7SUFFckIsSUFBSSxDQUFVO0lBQ2QsTUFBTSxDQUFVO0lBQ2hCLEdBQUcsQ0FBUztJQUNaLElBQUksQ0FBUztJQUNiLFFBQVEsQ0FBUztJQUNqQixRQUFRLENBQVM7SUFDakIsWUFBWSxDQUFPO0lBQ25CLFFBQVEsR0FBRyxRQUFRLENBQUM7SUFDcEIsV0FBVyxDQUFTO0lBQ3BCLFlBQVksQ0FBUztJQUU1QixLQUFLLEdBQVcs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QUcsSUFBSSxDQUFDLGVBQWUsR0FBRyxDQUFDLENBQUM7U0FDNUQ7SUFDSCxDQUFDO0lBRUQsWUFBWSxDQUFDLE1BQVcsRUFBRSxLQUFVO1FBQ2xDLElBQUksSUFBSSxHQUFRLEtBQUssQ0FBQyxVQUFVLENBQUM7UUFDakMsT0FBTyxJQUFJLEtBQUssSUFBSSxFQUFFO1lBQ3BCLElBQUksSUFBSSxLQUFLLE1BQU0sRUFBRTtnQkFDbkIsT0FBTyxJQUFJLENBQUM7YUFDYjtZQUNELElBQUksR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDO1NBQ3hCO1FBQ0QsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBRUQsU0FBUyxDQUFDLE9BQVksRUFBRSxNQUFlO1FBQ3JDLE9BQU87WUFDTCxHQUFHLEVBQUUsT0FBTyxDQUFDLHFCQUFxQixFQUFFLENBQUMsR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDNUUsSUFBSSxFQUFFLE9BQU8sQ0FBQyxxQkFBcUIsRUFBRSxDQUFDLElBQUksR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzlFLEtBQUssRUFBRSxPQUFPLENBQUMsV0FBVztZQUMxQixNQUFNLEVBQUUsT0FBTyxDQUFDLFlBQVk7U0FDN0IsQ0FBQztJQUNKLENBQUM7d0dBN09VLG1CQUFtQjs0RkFBbkIsbUJBQW1CLGlLQ1poQyxxc0VBMENBOzs0RkQ5QmEsbUJBQW1CO2tCQVAvQixTQUFTOytCQUVFLGFBQWE7aUtBTUcsYUFBYTtzQkFBdEMsU0FBUzt1QkFBQyxhQUFhIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0b3JSZWYsIENvbXBvbmVudCwgRWxlbWVudFJlZiwgT25Jbml0LCBWaWV3Q2hpbGQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuXHJcbmltcG9ydCB7IEljb25QaWNrZXJTZXJ2aWNlIH0gZnJvbSAnLi9pY29uLXBpY2tlci5zZXJ2aWNlJztcclxuaW1wb3J0IHsgSWNvbiwgSWNvblR5cGUgfSBmcm9tICcuL2ljb24nO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBhbmd1bGFyLWVzbGludC9jb21wb25lbnQtc2VsZWN0b3JcclxuICBzZWxlY3RvcjogJ2ljb24tcGlja2VyJyxcclxuICB0ZW1wbGF0ZVVybDogJy4vaWNvbi1waWNrZXIuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL2ljb24tcGlja2VyLmNvbXBvbmVudC5zY3NzJ11cclxufSlcclxuXHJcbmV4cG9ydCBjbGFzcyBJY29uUGlja2VyQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcclxuICBAVmlld0NoaWxkKCdkaWFsb2dQb3B1cCcpIGRpYWxvZ0VsZW1lbnQ6IGFueTtcclxuXHJcbiAgLy8gUG9wb3ZlclxyXG4gIHB1YmxpYyBpcFBvc2l0aW9uOiBzdHJpbmc7XHJcbiAgcHVibGljIGlwSGVpZ2h0OiBudW1iZXI7XHJcbiAgcHVibGljIGlwTWF4SGVpZ2h0OiBudW1iZXI7XHJcbiAgcHVibGljIGlwV2lkdGg6IG51bWJlcjtcclxuICAvLyBJY29uIGNzc1xyXG4gIHB1YmxpYyBpcEljb25TaXplOiBudW1iZXI7XHJcbiAgcHVibGljIGlwSWNvblZlcnRpY2FsUGFkZGluZzogbnVtYmVyO1xyXG4gIHB1YmxpYyBpcEljb25Ib3Jpem9udGFsUGFkZGluZzogbnVtYmVyO1xyXG4gIC8vIEl0ZW0gU3R5bGUgaWUgaW5wdXQgYW5kIGJ1dHRvblxyXG4gIHB1YmxpYyBpcEJ1dHRvblN0eWxlQ2xhc3M6IHN0cmluZztcclxuICBwdWJsaWMgaXBJbnB1dFNlYXJjaFN0eWxlQ2xhc3M6IHN0cmluZztcclxuICBwdWJsaWMgaXBEaXZTZWFyY2hTdHlsZUNsYXNzOiBzdHJpbmc7XHJcbiAgcHVibGljIGlwVXNlUm9vdFZpZXdDb250YWluZXI6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAvLyBJY29uIGFuZCBiZWhhdmlvcnNcclxuICBwdWJsaWMgaXBLZWVwU2VhcmNoRmlsdGVyOiBib29sZWFuO1xyXG4gIHB1YmxpYyBpcFBsYWNlSG9sZGVyOiBzdHJpbmc7XHJcbiAgcHVibGljIGlwRmFsbGJhY2tJY29uOiBzdHJpbmc7XHJcbiAgcHVibGljIGlwSWNvblBhY2s6IHN0cmluZ1tdO1xyXG5cclxuICBwdWJsaWMgc2hvdzogYm9vbGVhbjtcclxuICBwdWJsaWMgaGlkZGVuOiBib29sZWFuO1xyXG4gIHB1YmxpYyB0b3A6IG51bWJlcjtcclxuICBwdWJsaWMgbGVmdDogbnVtYmVyO1xyXG4gIHB1YmxpYyBwb3NpdGlvbjogc3RyaW5nO1xyXG4gIHB1YmxpYyBhcnJvd1RvcDogbnVtYmVyO1xyXG4gIHB1YmxpYyBzZWxlY3RlZEljb246IEljb247XHJcbiAgcHVibGljIGljb25UeXBlID0gSWNvblR5cGU7XHJcbiAgcHVibGljIGJ1dHRvbldpZHRoOiBudW1iZXI7XHJcbiAgcHVibGljIGJ1dHRvbkhlaWdodDogbnVtYmVyO1xyXG5cclxuICBpY29uczogSWNvbltdID0gW107XHJcbiAgc2VhcmNoID0gJyc7XHJcblxyXG4gIHByaXZhdGUgZGlyZWN0aXZlSW5zdGFuY2U6IGFueTtcclxuICBwcml2YXRlIGluaXRpYWxJY29uOiBzdHJpbmc7XHJcbiAgcHJpdmF0ZSBkaXJlY3RpdmVFbGVtZW50UmVmOiBFbGVtZW50UmVmO1xyXG5cclxuICBwcml2YXRlIGxpc3RlbmVyTW91c2VEb3duOiBhbnk7XHJcbiAgcHJpdmF0ZSBsaXN0ZW5lclJlc2l6ZTogYW55O1xyXG5cclxuICBwcml2YXRlIGRpYWxvZ0Fycm93U2l6ZSA9IDEwO1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByaXZhdGUgZWw6IEVsZW1lbnRSZWYsXHJcbiAgICBwcml2YXRlIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYsXHJcbiAgICBwcml2YXRlIHNlcnZpY2U6IEljb25QaWNrZXJTZXJ2aWNlKSB7XHJcbiAgfVxyXG5cclxuICBzZXREaWFsb2coaW5zdGFuY2U6IGFueSwgZWxlbWVudFJlZjogRWxlbWVudFJlZiwgaWNvbjogc3RyaW5nLCBpcFBvc2l0aW9uOiBzdHJpbmcsIGlwSGVpZ2h0OiBzdHJpbmcsIGlwTWF4SGVpZ2h0OiBzdHJpbmcsXHJcbiAgICAgICAgICAgIGlwV2lkdGg6IHN0cmluZywgaXBQbGFjZUhvbGRlcjogc3RyaW5nLCBpcEZhbGxiYWNrSWNvbjogc3RyaW5nLCBpcEljb25QYWNrOiBzdHJpbmdbXSwgaXBJY29uU2l6ZTogc3RyaW5nLFxyXG4gICAgICAgICAgICBpcEljb25WZXJ0aWNhbFBhZGRpbmc6IHN0cmluZywgaXBJY29uSG9yaXpvbnRhbFBhZGRpbmc6IHN0cmluZywgaXBCdXR0b25TdHlsZUNsYXNzOiBzdHJpbmcsIGlwRGl2U2VhcmNoU3R5bGVDbGFzczogc3RyaW5nLFxyXG4gICAgICAgICAgICBpcElucHV0U2VhcmNoU3R5bGVDbGFzczogc3RyaW5nLCBpcEtlZXBTZWFyY2hGaWx0ZXI6IHN0cmluZywgaXBVc2VSb290Vmlld0NvbnRhaW5lcj86IGJvb2xlYW4pIHtcclxuICAgIHRoaXMuZGlyZWN0aXZlSW5zdGFuY2UgPSBpbnN0YW5jZTtcclxuICAgIHRoaXMuc2V0SW5pdGlhbEljb24oaWNvbik7XHJcbiAgICB0aGlzLmRpcmVjdGl2ZUVsZW1lbnRSZWYgPSBlbGVtZW50UmVmO1xyXG4gICAgdGhpcy5pcFBvc2l0aW9uID0gaXBQb3NpdGlvbjtcclxuICAgIHRoaXMuaXBIZWlnaHQgPSBwYXJzZUludChpcEhlaWdodCwgMTApO1xyXG4gICAgdGhpcy5pcE1heEhlaWdodCA9IHBhcnNlSW50KGlwTWF4SGVpZ2h0LCAxMCk7XHJcbiAgICB0aGlzLmlwV2lkdGggPSBwYXJzZUludChpcFdpZHRoLCAxMCk7XHJcbiAgICBpZiAoIXRoaXMuaXBXaWR0aCkge1xyXG4gICAgICB0aGlzLmlwV2lkdGggPSBlbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQub2Zmc2V0V2lkdGg7XHJcbiAgICB9XHJcbiAgICB0aGlzLmlwSWNvblNpemUgPSBwYXJzZUludChpcEljb25TaXplLCAxMCk7XHJcbiAgICB0aGlzLmlwSWNvblZlcnRpY2FsUGFkZGluZyA9IHBhcnNlSW50KGlwSWNvblZlcnRpY2FsUGFkZGluZywgMTApO1xyXG4gICAgdGhpcy5pcEljb25Ib3Jpem9udGFsUGFkZGluZyA9IHBhcnNlSW50KGlwSWNvbkhvcml6b250YWxQYWRkaW5nLCAxMCk7XHJcbiAgICB0aGlzLmlwS2VlcFNlYXJjaEZpbHRlciA9IEpTT04ucGFyc2UoaXBLZWVwU2VhcmNoRmlsdGVyKTtcclxuICAgIHRoaXMuaXBQbGFjZUhvbGRlciA9IGlwUGxhY2VIb2xkZXI7XHJcbiAgICB0aGlzLmlwRmFsbGJhY2tJY29uID0gaXBGYWxsYmFja0ljb247XHJcbiAgICB0aGlzLmlwSWNvblBhY2sgPSBpcEljb25QYWNrO1xyXG4gICAgdGhpcy5pcEJ1dHRvblN0eWxlQ2xhc3MgPSBpcEJ1dHRvblN0eWxlQ2xhc3M7XHJcbiAgICB0aGlzLmlwSW5wdXRTZWFyY2hTdHlsZUNsYXNzID0gaXBJbnB1dFNlYXJjaFN0eWxlQ2xhc3M7XHJcbiAgICB0aGlzLmlwRGl2U2VhcmNoU3R5bGVDbGFzcyA9IGlwRGl2U2VhcmNoU3R5bGVDbGFzcztcclxuICAgIHRoaXMuaXBVc2VSb290Vmlld0NvbnRhaW5lciA9IGlwVXNlUm9vdFZpZXdDb250YWluZXI7XHJcblxyXG5cclxuICAgIHRoaXMuYnV0dG9uSGVpZ2h0ID0gdGhpcy5pcEljb25TaXplICsgMiAqIHRoaXMuaXBJY29uVmVydGljYWxQYWRkaW5nO1xyXG4gICAgdGhpcy5idXR0b25XaWR0aCA9IHRoaXMuaXBJY29uU2l6ZSArIDIgKiB0aGlzLmlwSWNvbkhvcml6b250YWxQYWRkaW5nO1xyXG4gIH1cclxuXHJcbiAgbmdPbkluaXQoKSB7XHJcbiAgICB0aGlzLmljb25zID0gdGhpcy5zZXJ2aWNlLmdldEljb25zKHRoaXMuaXBJY29uUGFjayk7XHJcbiAgICB0aGlzLmxpc3RlbmVyTW91c2VEb3duID0gKGV2ZW50OiBhbnkpID0+IHRoaXMub25Nb3VzZURvd24oZXZlbnQpO1xyXG4gICAgdGhpcy5saXN0ZW5lclJlc2l6ZSA9ICgpID0+IHRoaXMub25SZXNpemUoKTtcclxuICAgIHRoaXMub3BlbkRpYWxvZyh0aGlzLmluaXRpYWxJY29uKTtcclxuICB9XHJcblxyXG4gIHNldEluaXRpYWxJY29uKGljb246IHN0cmluZykge1xyXG4gICAgdGhpcy5pbml0aWFsSWNvbiA9IGljb247XHJcbiAgICB0aGlzLnNlbGVjdGVkSWNvbiA9IHRoaXMuaWNvbnMuZmluZChlbCA9PiBlbCA/XHJcbiAgICAgIGBmYSBmYS0ke2VsLmlkfWAgPT09IGljb24gfHwgYHBpIHBpLSR7ZWwuaWR9YCA9PT0gaWNvbiB8fCBgJHtlbC5pZH1gID09PSBpY29uIDpcclxuICAgICAgZmFsc2VcclxuICAgICk7XHJcbiAgICBpZiAodGhpcy5pcEtlZXBTZWFyY2hGaWx0ZXIgJiYgdGhpcy5zZWxlY3RlZEljb24gJiYgaWNvbiAhPT0gdGhpcy5pcEZhbGxiYWNrSWNvbikge1xyXG4gICAgICB0aGlzLnNlYXJjaCA9IHRoaXMuc2VsZWN0ZWRJY29uLmlkO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5zZWFyY2ggPSAnJztcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG9wZW5EaWFsb2coaWNvbjogc3RyaW5nKSB7XHJcbiAgICB0aGlzLnNldEluaXRpYWxJY29uKGljb24pO1xyXG4gICAgdGhpcy5vcGVuSWNvblBpY2tlcigpO1xyXG4gIH1cclxuXHJcbiAgc2V0U2VhcmNoKHZhbDogc3RyaW5nKSB7XHJcbiAgICB0aGlzLnNlYXJjaCA9IHZhbDtcclxuICB9XHJcblxyXG4gIHNlbGVjdEljb24oaWNvbjogSWNvbik6IHZvaWQge1xyXG4gICAgaWYgKGljb24udHlwZSA9PT0gSWNvblR5cGUuRm9udEF3ZXNvbWUpIHtcclxuICAgICAgdGhpcy5kaXJlY3RpdmVJbnN0YW5jZS5pY29uU2VsZWN0ZWQoYGZhIGZhLSR7aWNvbi5pZH1gKTtcclxuICAgIH0gZWxzZSBpZiAoaWNvbi50eXBlID09PSBJY29uVHlwZS5Gb250QXdlc29tZTUpIHtcclxuICAgICAgdGhpcy5kaXJlY3RpdmVJbnN0YW5jZS5pY29uU2VsZWN0ZWQoYCR7aWNvbi5pZH1gKTtcclxuICAgIH0gZWxzZSBpZiAoaWNvbi50eXBlID09PSBJY29uVHlwZS5Gb250QXdlc29tZTYpIHtcclxuICAgICAgdGhpcy5kaXJlY3RpdmVJbnN0YW5jZS5pY29uU2VsZWN0ZWQoYCR7aWNvbi5pZH1gKTtcclxuICAgIH0gZWxzZSBpZiAoaWNvbi50eXBlID09PSBJY29uVHlwZS5NYXRlcmlhbCkge1xyXG4gICAgICB0aGlzLmRpcmVjdGl2ZUluc3RhbmNlLmljb25TZWxlY3RlZChgJHtpY29uLmlkfWApO1xyXG4gICAgfSBlbHNlIGlmIChpY29uLnR5cGUgPT09IEljb25UeXBlLlByaW1lSWNvbnMpIHtcclxuICAgICAgdGhpcy5kaXJlY3RpdmVJbnN0YW5jZS5pY29uU2VsZWN0ZWQoYHBpIHBpLSR7aWNvbi5pZH1gKTtcclxuICAgIH1cclxuICAgIHRoaXMuY2xvc2VJY29uUGlja2VyKCk7XHJcbiAgfVxyXG5cclxuICBvbk1vdXNlRG93bihldmVudDogYW55KSB7XHJcbiAgICBpZiAoIXRoaXMuaXNEZXNjZW5kYW50KHRoaXMuZWwubmF0aXZlRWxlbWVudCwgZXZlbnQudGFyZ2V0KSAmJiBldmVudC50YXJnZXQgIT09IHRoaXMuZGlyZWN0aXZlRWxlbWVudFJlZi5uYXRpdmVFbGVtZW50KSB7XHJcbiAgICAgIHRoaXMuY2xvc2VJY29uUGlja2VyKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBvcGVuSWNvblBpY2tlcigpIHtcclxuICAgIGlmICghdGhpcy5zaG93KSB7XHJcbiAgICAgIHRoaXMuc2hvdyA9IHRydWU7XHJcbiAgICAgIHRoaXMuaGlkZGVuID0gdHJ1ZTtcclxuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgdGhpcy5zZXREaWFsb2dQb3NpdGlvbigpO1xyXG4gICAgICAgIHRoaXMuaGlkZGVuID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgICB9LCAwKTtcclxuICAgICAgdGhpcy5kaXJlY3RpdmVJbnN0YW5jZS5zdGF0ZUNoYW5nZWQodHJ1ZSk7XHJcbiAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlZG93bicsIHRoaXMubGlzdGVuZXJNb3VzZURvd24pO1xyXG4gICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigncmVzaXplJywgdGhpcy5saXN0ZW5lclJlc2l6ZSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBjbG9zZUljb25QaWNrZXIoKSB7XHJcbiAgICBpZiAodGhpcy5zaG93KSB7XHJcbiAgICAgIHRoaXMuc2hvdyA9IGZhbHNlO1xyXG4gICAgICB0aGlzLmRpcmVjdGl2ZUluc3RhbmNlLnN0YXRlQ2hhbmdlZChmYWxzZSk7XHJcbiAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlZG93bicsIHRoaXMubGlzdGVuZXJNb3VzZURvd24pO1xyXG4gICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigncmVzaXplJywgdGhpcy5saXN0ZW5lclJlc2l6ZSk7XHJcbiAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG9uUmVzaXplKCkge1xyXG4gICAgaWYgKHRoaXMucG9zaXRpb24gPT09ICdmaXhlZCcpIHtcclxuICAgICAgdGhpcy5zZXREaWFsb2dQb3NpdGlvbigpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgc2V0RGlhbG9nUG9zaXRpb24oKSB7XHJcbiAgICBjb25zdCBkaWFsb2dIZWlnaHQgPSB0aGlzLmRpYWxvZ0VsZW1lbnQubmF0aXZlRWxlbWVudC5vZmZzZXRIZWlnaHQ7XHJcbiAgICBsZXQgbm9kZSA9IHRoaXMuZGlyZWN0aXZlRWxlbWVudFJlZi5uYXRpdmVFbGVtZW50O1xyXG4gICAgbGV0IHBvc2l0aW9uID0gJ3N0YXRpYyc7XHJcbiAgICBsZXQgdHJhbnNmb3JtID0gJyc7XHJcbiAgICBsZXQgcGFyZW50Tm9kZTogYW55ID0gbnVsbDtcclxuICAgIGxldCB0cmFuc2Zvcm1Ob2RlOiBhbnkgPSBudWxsO1xyXG4gICAgbGV0IHN0eWxlOiBhbnkgPSBudWxsO1xyXG4gICAgd2hpbGUgKG5vZGUgIT09IG51bGwgJiYgbm9kZS50YWdOYW1lICE9PSAnSFRNTCcpIHtcclxuICAgICAgc3R5bGUgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShub2RlKTtcclxuICAgICAgcG9zaXRpb24gPSBzdHlsZS5nZXRQcm9wZXJ0eVZhbHVlKCdwb3NpdGlvbicpO1xyXG4gICAgICB0cmFuc2Zvcm0gPSBzdHlsZS5nZXRQcm9wZXJ0eVZhbHVlKCd0cmFuc2Zvcm0nKTtcclxuICAgICAgaWYgKHBvc2l0aW9uICE9PSAnc3RhdGljJyAmJiBwYXJlbnROb2RlID09PSBudWxsKSB7XHJcbiAgICAgICAgcGFyZW50Tm9kZSA9IG5vZGU7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKHRyYW5zZm9ybSAmJiB0cmFuc2Zvcm0gIT09ICdub25lJyAmJiB0cmFuc2Zvcm1Ob2RlID09PSBudWxsKSB7XHJcbiAgICAgICAgdHJhbnNmb3JtTm9kZSA9IG5vZGU7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKHBvc2l0aW9uID09PSAnZml4ZWQnKSB7XHJcbiAgICAgICAgcGFyZW50Tm9kZSA9IHRyYW5zZm9ybU5vZGU7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgICAgbm9kZSA9IG5vZGUucGFyZW50Tm9kZTtcclxuICAgIH1cclxuICAgIGNvbnN0IGJveERpcmVjdGl2ZSA9IHRoaXMuY3JlYXRlQm94KHRoaXMuZGlyZWN0aXZlRWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LCAocG9zaXRpb24gIT09ICdmaXhlZCcpKTtcclxuICAgIGlmICh0aGlzLmlwVXNlUm9vdFZpZXdDb250YWluZXIgfHwgKHBvc2l0aW9uID09PSAnZml4ZWQnICYmXHJcbiAgICAgICghcGFyZW50Tm9kZSB8fCBwYXJlbnROb2RlIGluc3RhbmNlb2YgSFRNTFVua25vd25FbGVtZW50KSkpIHtcclxuICAgICAgdGhpcy50b3AgPSBib3hEaXJlY3RpdmUudG9wO1xyXG4gICAgICB0aGlzLmxlZnQgPSBib3hEaXJlY3RpdmUubGVmdDtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGlmIChwYXJlbnROb2RlID09PSBudWxsKSB7XHJcbiAgICAgICAgcGFyZW50Tm9kZSA9IG5vZGU7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGNvbnN0IGJveFBhcmVudCA9IHRoaXMuY3JlYXRlQm94KHBhcmVudE5vZGUsIChwb3NpdGlvbiAhPT0gJ2ZpeGVkJykpO1xyXG5cclxuICAgICAgdGhpcy50b3AgPSBib3hEaXJlY3RpdmUudG9wIC0gYm94UGFyZW50LnRvcDtcclxuICAgICAgdGhpcy5sZWZ0ID0gYm94RGlyZWN0aXZlLmxlZnQgLSBib3hQYXJlbnQubGVmdDtcclxuICAgIH1cclxuXHJcbiAgICBpZiAocG9zaXRpb24gPT09ICdmaXhlZCcpIHtcclxuICAgICAgdGhpcy5wb3NpdGlvbiA9ICdmaXhlZCc7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5pcFBvc2l0aW9uID09PSAnbGVmdCcpIHtcclxuICAgICAgdGhpcy5sZWZ0IC09IHRoaXMuaXBXaWR0aCArIHRoaXMuZGlhbG9nQXJyb3dTaXplIC0gMjtcclxuICAgIH0gZWxzZSBpZiAodGhpcy5pcFBvc2l0aW9uID09PSAndG9wJykge1xyXG4gICAgICB0aGlzLnRvcCAtPSBkaWFsb2dIZWlnaHQgKyB0aGlzLmRpYWxvZ0Fycm93U2l6ZTtcclxuICAgICAgdGhpcy5hcnJvd1RvcCA9IGRpYWxvZ0hlaWdodCAtIDE7XHJcbiAgICB9IGVsc2UgaWYgKHRoaXMuaXBQb3NpdGlvbiA9PT0gJ2JvdHRvbScpIHtcclxuICAgICAgdGhpcy50b3AgKz0gYm94RGlyZWN0aXZlLmhlaWdodCArIHRoaXMuZGlhbG9nQXJyb3dTaXplO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5sZWZ0ICs9IGJveERpcmVjdGl2ZS53aWR0aCArIHRoaXMuZGlhbG9nQXJyb3dTaXplIC0gMjtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGlzRGVzY2VuZGFudChwYXJlbnQ6IGFueSwgY2hpbGQ6IGFueSk6IGJvb2xlYW4ge1xyXG4gICAgbGV0IG5vZGU6IGFueSA9IGNoaWxkLnBhcmVudE5vZGU7XHJcbiAgICB3aGlsZSAobm9kZSAhPT0gbnVsbCkge1xyXG4gICAgICBpZiAobm9kZSA9PT0gcGFyZW50KSB7XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgIH1cclxuICAgICAgbm9kZSA9IG5vZGUucGFyZW50Tm9kZTtcclxuICAgIH1cclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcblxyXG4gIGNyZWF0ZUJveChlbGVtZW50OiBhbnksIG9mZnNldDogYm9vbGVhbik6IGFueSB7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICB0b3A6IGVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wICsgKG9mZnNldCA/IHdpbmRvdy5wYWdlWU9mZnNldCA6IDApLFxyXG4gICAgICBsZWZ0OiBlbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnQgKyAob2Zmc2V0ID8gd2luZG93LnBhZ2VYT2Zmc2V0IDogMCksXHJcbiAgICAgIHdpZHRoOiBlbGVtZW50Lm9mZnNldFdpZHRoLFxyXG4gICAgICBoZWlnaHQ6IGVsZW1lbnQub2Zmc2V0SGVpZ2h0XHJcbiAgICB9O1xyXG4gIH1cclxufVxyXG4iLCI8ZGl2IGNsYXNzPVwiaWNvbi1waWNrZXJcIiAjZGlhbG9nUG9wdXBcclxuICAgICBbaGlkZGVuXT1cIiFzaG93XCJcclxuICAgICBbc3R5bGUudmlzaWJpbGl0eV09XCJ0aGlzLmhpZGRlbiA/ICdoaWRkZW4nIDogJ3Zpc2libGUnXCJcclxuICAgICBbc3R5bGUuaGVpZ2h0LnB4XT1cImlwSGVpZ2h0XCJcclxuICAgICBbc3R5bGUud2lkdGgucHhdPVwiaXBXaWR0aFwiXHJcbiAgICAgW3N0eWxlLnRvcC5weF09XCJ0b3BcIlxyXG4gICAgIFtzdHlsZS5sZWZ0LnB4XT1cImxlZnRcIlxyXG4gICAgIFtzdHlsZS5wb3NpdGlvbl09XCJwb3NpdGlvblwiPlxyXG5cclxuICA8ZGl2IGNsYXNzPVwiYXJyb3cgYXJyb3cte3tpcFBvc2l0aW9ufX1cIiBbc3R5bGUudG9wLnB4XT1cImFycm93VG9wXCI+PC9kaXY+XHJcblxyXG4gIDxkaXYgY2xhc3M9XCJpY29uLXNlYXJjaCB7e2lwRGl2U2VhcmNoU3R5bGVDbGFzc319XCI+XHJcbiAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz1cInt7aXBJbnB1dFNlYXJjaFN0eWxlQ2xhc3N9fVwiIFt0ZXh0XSBbdmFsdWVdPVwic2VhcmNoXCIgKG5ld1ZhbHVlKT1cInNldFNlYXJjaCgkZXZlbnQpXCJcclxuICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwiaXBQbGFjZUhvbGRlclwiPlxyXG4gIDwvZGl2PlxyXG4gIDxkaXYgY2xhc3M9XCJpY29uLWdyaWRcIiBbbmdTdHlsZV09XCJ7J21heC1oZWlnaHQucHgnOiBpcE1heEhlaWdodH1cIj5cclxuICAgIDxkaXYgKm5nRm9yPVwibGV0IGljb24gb2YgaWNvbnMgfCBzZWFyY2hJY29uOnNlYXJjaFwiPlxyXG4gICAgICA8YnV0dG9uICpuZ0lmPVwiaWNvblwiIGNsYXNzPVwiaXAtYnV0dG9uLWljb24ge3tpcEJ1dHRvblN0eWxlQ2xhc3N9fVwiIHR5cGU9XCJidXR0b25cIiB0aXRsZT1cInt7IGljb24ubmFtZSB9fVwiXHJcbiAgICAgICAgICAgICAgW25nQ2xhc3NdPVwie2FjdGl2ZSA6IGljb24gPT09IHNlbGVjdGVkSWNvbn1cIlxyXG4gICAgICAgICAgICAgIFtzdHlsZS53aWR0aC5weF09XCJidXR0b25XaWR0aFwiXHJcbiAgICAgICAgICAgICAgW3N0eWxlLmhlaWdodC5weF09XCJidXR0b25IZWlnaHRcIlxyXG4gICAgICAgICAgICAgIFtzdHlsZS5wYWRkaW5nLXRvcC5weF09XCJpcEljb25WZXJ0aWNhbFBhZGRpbmdcIlxyXG4gICAgICAgICAgICAgIFtzdHlsZS5wYWRkaW5nLWJvdHRvbS5weF09XCJpcEljb25WZXJ0aWNhbFBhZGRpbmdcIlxyXG4gICAgICAgICAgICAgIFtzdHlsZS5wYWRkaW5nLWxlZnQucHhdPVwiaXBJY29uSG9yaXpvbnRhbFBhZGRpbmdcIlxyXG4gICAgICAgICAgICAgIFtzdHlsZS5wYWRkaW5nLXJpZ2h0LnB4XT1cImlwSWNvbkhvcml6b250YWxQYWRkaW5nXCJcclxuICAgICAgICAgICAgICAoY2xpY2spPVwic2VsZWN0SWNvbihpY29uKVwiPlxyXG4gICAgICAgIDxzcGFuICpuZ0lmPVwiaWNvbi50eXBlID09PSBpY29uVHlwZS5Gb250QXdlc29tZVwiIGNsYXNzPVwiZmEgZmEte3tpY29uLmlkfX1cIlxyXG4gICAgICAgICAgICAgIFtzdHlsZS5mb250LXNpemUucHhdPVwiaXBJY29uU2l6ZVwiPjwvc3Bhbj5cclxuICAgICAgICA8c3BhbiAqbmdJZj1cImljb24udHlwZSA9PT0gaWNvblR5cGUuRm9udEF3ZXNvbWU1XCIgY2xhc3M9XCJ7e2ljb24uaWR9fVwiXHJcbiAgICAgICAgICAgICAgW3N0eWxlLmZvbnQtc2l6ZS5weF09XCJpcEljb25TaXplXCI+PC9zcGFuPlxyXG4gICAgICAgIDxzcGFuICpuZ0lmPVwiaWNvbi50eXBlID09PSBpY29uVHlwZS5Gb250QXdlc29tZTZcIiBbc3R5bGUuZm9udC1zaXplLnB4XT1cImlwSWNvblNpemVcIj5cclxuICAgICAgICAgIDxmYS1pY29uIFtpY29uXT1cIlsnZmFzJywgaWNvbi5pY29uTmFtZV1cIj48L2ZhLWljb24+XHJcbiAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgIDxzcGFuICpuZ0lmPVwiaWNvbi50eXBlID09PSBpY29uVHlwZS5NYXRlcmlhbFwiIGNsYXNzPVwibWF0ZXJpYWwtaWNvbnNcIlxyXG4gICAgICAgICAgICAgIFtzdHlsZS5mb250LXNpemUucHhdPVwiaXBJY29uU2l6ZVwiPnt7aWNvbi5pZH19PC9zcGFuPlxyXG4gICAgICAgIDxzcGFuICpuZ0lmPVwiaWNvbi50eXBlID09PSBpY29uVHlwZS5QcmltZUljb25zXCIgY2xhc3M9XCJwaSBwaS17e2ljb24uaWR9fVwiXHJcbiAgICAgICAgICAgICAgW3N0eWxlLmZvbnQtc2l6ZS5weF09XCJpcEljb25TaXplXCI+PC9zcGFuPlxyXG4gICAgICA8L2J1dHRvbj5cclxuICAgIDwvZGl2PlxyXG4gIDwvZGl2PlxyXG5cclxuPC9kaXY+XHJcbiJdfQ==