@ctrl/ngx-emoji-mart 5.1.2 → 6.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (73) hide show
  1. package/README.md +11 -19
  2. package/anchors.component.d.ts +3 -0
  3. package/category.component.d.ts +7 -2
  4. package/ctrl-ngx-emoji-mart.d.ts +1 -0
  5. package/emoji-frequently.service.d.ts +3 -0
  6. package/emoji-search.service.d.ts +3 -0
  7. package/esm2020/anchors.component.mjs +83 -0
  8. package/esm2020/category.component.mjs +386 -0
  9. package/{esm2015/ctrl-ngx-emoji-mart.js → esm2020/ctrl-ngx-emoji-mart.mjs} +0 -0
  10. package/{esm2015/emoji-frequently.service.js → esm2020/emoji-frequently.service.mjs} +10 -8
  11. package/esm2020/emoji-search.service.mjs +177 -0
  12. package/{esm2015/ngx-emoji/ctrl-ngx-emoji-mart-ngx-emoji.js → esm2020/ngx-emoji/ctrl-ngx-emoji-mart-ngx-emoji.mjs} +0 -0
  13. package/{esm2015/ngx-emoji/data/categories.js → esm2020/ngx-emoji/data/categories.mjs} +4 -4
  14. package/{esm2015/ngx-emoji/data/data.interfaces.js → esm2020/ngx-emoji/data/data.interfaces.mjs} +0 -0
  15. package/esm2020/ngx-emoji/data/emojis.mjs +29543 -0
  16. package/{esm2015/ngx-emoji/data/skins.js → esm2020/ngx-emoji/data/skins.mjs} +0 -0
  17. package/esm2020/ngx-emoji/emoji.component.mjs +236 -0
  18. package/esm2020/ngx-emoji/emoji.module.mjs +18 -0
  19. package/esm2020/ngx-emoji/emoji.service.mjs +144 -0
  20. package/{esm2015/ngx-emoji/index.js → esm2020/ngx-emoji/index.mjs} +0 -0
  21. package/esm2020/picker.component.mjs +505 -0
  22. package/esm2020/picker.module.mjs +49 -0
  23. package/esm2020/preview.component.mjs +187 -0
  24. package/{esm2015/public_api.js → esm2020/public_api.mjs} +0 -0
  25. package/esm2020/search.component.mjs +165 -0
  26. package/esm2020/skins.component.mjs +108 -0
  27. package/esm2020/svgs/index.mjs +18 -0
  28. package/{esm2015/utils/index.js → esm2020/utils/index.mjs} +0 -0
  29. package/fesm2015/{ctrl-ngx-emoji-mart-ngx-emoji.js → ctrl-ngx-emoji-mart-ngx-emoji.mjs} +24809 -18497
  30. package/fesm2015/ctrl-ngx-emoji-mart-ngx-emoji.mjs.map +1 -0
  31. package/fesm2015/{ctrl-ngx-emoji-mart.js → ctrl-ngx-emoji-mart.mjs} +676 -329
  32. package/fesm2015/ctrl-ngx-emoji-mart.mjs.map +1 -0
  33. package/fesm2020/ctrl-ngx-emoji-mart-ngx-emoji.mjs +31829 -0
  34. package/fesm2020/ctrl-ngx-emoji-mart-ngx-emoji.mjs.map +1 -0
  35. package/fesm2020/ctrl-ngx-emoji-mart.mjs +1757 -0
  36. package/fesm2020/ctrl-ngx-emoji-mart.mjs.map +1 -0
  37. package/ngx-emoji/ctrl-ngx-emoji-mart-ngx-emoji.d.ts +1 -0
  38. package/ngx-emoji/emoji.component.d.ts +3 -0
  39. package/ngx-emoji/emoji.module.d.ts +6 -0
  40. package/ngx-emoji/emoji.service.d.ts +3 -0
  41. package/ngx-emoji/package.json +6 -7
  42. package/package.json +29 -10
  43. package/picker.component.d.ts +3 -0
  44. package/picker.css +0 -1
  45. package/picker.module.d.ts +13 -0
  46. package/preview.component.d.ts +4 -1
  47. package/search.component.d.ts +3 -0
  48. package/skins.component.d.ts +6 -3
  49. package/bundles/ctrl-ngx-emoji-mart-ngx-emoji.umd.js +0 -25822
  50. package/bundles/ctrl-ngx-emoji-mart-ngx-emoji.umd.js.map +0 -1
  51. package/bundles/ctrl-ngx-emoji-mart-ngx-emoji.umd.min.js +0 -2
  52. package/bundles/ctrl-ngx-emoji-mart-ngx-emoji.umd.min.js.map +0 -1
  53. package/bundles/ctrl-ngx-emoji-mart.umd.js +0 -1695
  54. package/bundles/ctrl-ngx-emoji-mart.umd.js.map +0 -1
  55. package/bundles/ctrl-ngx-emoji-mart.umd.min.js +0 -2
  56. package/bundles/ctrl-ngx-emoji-mart.umd.min.js.map +0 -1
  57. package/ctrl-ngx-emoji-mart.metadata.json +0 -1
  58. package/esm2015/anchors.component.js +0 -54
  59. package/esm2015/category.component.js +0 -276
  60. package/esm2015/emoji-search.service.js +0 -179
  61. package/esm2015/ngx-emoji/data/emojis.js +0 -23289
  62. package/esm2015/ngx-emoji/emoji.component.js +0 -174
  63. package/esm2015/ngx-emoji/emoji.module.js +0 -13
  64. package/esm2015/ngx-emoji/emoji.service.js +0 -143
  65. package/esm2015/picker.component.js +0 -459
  66. package/esm2015/picker.module.js +0 -34
  67. package/esm2015/preview.component.js +0 -113
  68. package/esm2015/search.component.js +0 -115
  69. package/esm2015/skins.component.js +0 -76
  70. package/esm2015/svgs/index.js +0 -18
  71. package/fesm2015/ctrl-ngx-emoji-mart-ngx-emoji.js.map +0 -1
  72. package/fesm2015/ctrl-ngx-emoji-mart.js.map +0 -1
  73. package/ngx-emoji/ctrl-ngx-emoji-mart-ngx-emoji.metadata.json +0 -1
package/README.md CHANGED
@@ -8,16 +8,7 @@
8
8
 
9
9
  **DEMO**: https://ngx-emoji-mart.vercel.app
10
10
 
11
- This project is a port of [emoji-mart](https://github.com/missive/emoji-mart) by missive
12
-
13
- - [Installation](#installation)
14
- - [Components](#components)
15
- - [Picker](#picker)
16
- - [Emoji](#emoji)
17
- - [Custom emojis](#custom-emojis)
18
- - [Headless search](#headless-search)
19
- - [Storage](#storage)
20
- - [Features](#features)
11
+ This project is a port of [emoji-mart](https://github.com/missive/emoji-mart) by missive.
21
12
 
22
13
  ## Installation
23
14
 
@@ -29,12 +20,13 @@ npm install @ctrl/ngx-emoji-mart
29
20
 
30
21
  Latest version available for each version of Angular
31
22
 
32
- | @ctrl/ngx-emoji-mart | Angular |
33
- | -------------------- | ------- |
34
- | 0.17.0 | 6.x 7.x |
35
- | 1.0.6 | 8.x |
36
- | 3.1.0 | 9.x |
37
- | current | >= 10.x |
23
+ | @ctrl/ngx-emoji-mart | Angular |
24
+ | -------------------- | --------- |
25
+ | 0.17.0 | 6.x 7.x |
26
+ | 1.0.6 | 8.x |
27
+ | 3.1.0 | 9.x |
28
+ | 5.1.2 | 10.x 11.x |
29
+ | current | >= 12.x |
38
30
 
39
31
  ## Components
40
32
 
@@ -109,7 +101,7 @@ use component
109
101
  | **useButton** | `false` | Uses button elements for emoji instead of spans |
110
102
  | **enableFrequentEmojiSort** | `false` | Enables re-sorting of emoji on click |
111
103
  | **virtualize** | `false` | Enables experimental virtualized rendering to render only emoji categories in view |
112
- | **virtualizeOffset** | `0` | use with virtualize option to add or subtract the amount of pixels used to determine whether or not render the category |
104
+ | **virtualizeOffset** | `0` | use with virtualize option to add or subtract the amount of pixels used to determine whether or not render the category |
113
105
 
114
106
  #### I18n
115
107
 
@@ -214,7 +206,7 @@ import { EmojiModule } from '@ctrl/ngx-emoji-mart/ngx-emoji';
214
206
  ```
215
207
 
216
208
  | Prop | Required | Default | Description |
217
- | -------------------------------------------- | :------: | ------------------------- | ---------------------------------------------------------------------------------------------------------------- | --- |
209
+ | -------------------------------------------- | :------: | ------------------------- | ------------------------------------------------------------------------------ |
218
210
  | **emoji** | ✓ | | Either a string or an `emoji` object |
219
211
  | **size** | ✓ | | The emoji width and height. |
220
212
  | **isNative** | | `false` | Renders the native unicode emoji |
@@ -264,7 +256,7 @@ const customEmojis = [
264
256
  text: '',
265
257
  emoticons: [],
266
258
  keywords: ['test', 'flag'],
267
- spriteUrl: 'https://unpkg.com/emoji-datasource-twitter@6.0.0/img/twitter/sheets-256/64.png',
259
+ spriteUrl: 'https://unpkg.com/emoji-datasource-twitter@6.0.1/img/twitter/sheets-256/64.png',
268
260
  sheet_x: 1,
269
261
  sheet_y: 1,
270
262
  size: 64,
@@ -1,5 +1,6 @@
1
1
  import { EventEmitter } from '@angular/core';
2
2
  import { EmojiCategory } from '@ctrl/ngx-emoji-mart/ngx-emoji';
3
+ import * as i0 from "@angular/core";
3
4
  export declare class AnchorsComponent {
4
5
  categories: EmojiCategory[];
5
6
  color?: string;
@@ -14,4 +15,6 @@ export declare class AnchorsComponent {
14
15
  }>;
15
16
  trackByFn(idx: number, cat: EmojiCategory): string;
16
17
  handleClick($event: Event, index: number): void;
18
+ static ɵfac: i0.ɵɵFactoryDeclaration<AnchorsComponent, never>;
19
+ static ɵcmp: i0.ɵɵComponentDeclaration<AnchorsComponent, "emoji-mart-anchors", never, { "categories": "categories"; "color": "color"; "selected": "selected"; "i18n": "i18n"; "icons": "icons"; }, { "anchorClick": "anchorClick"; }, never, never>;
17
20
  }
@@ -2,11 +2,12 @@ import { Emoji, EmojiService } from '@ctrl/ngx-emoji-mart/ngx-emoji';
2
2
  import { AfterViewInit, ChangeDetectorRef, ElementRef, OnChanges, OnInit, SimpleChanges } from '@angular/core';
3
3
  import { Observable } from 'rxjs';
4
4
  import { EmojiFrequentlyService } from './emoji-frequently.service';
5
+ import * as i0 from "@angular/core";
5
6
  export declare class CategoryComponent implements OnChanges, OnInit, AfterViewInit {
6
7
  ref: ChangeDetectorRef;
7
8
  private emojiService;
8
9
  private frequently;
9
- emojis?: any[] | null;
10
+ emojis: any[] | null;
10
11
  hasStickyPosition: boolean;
11
12
  name: string;
12
13
  perLine: number;
@@ -35,6 +36,7 @@ export declare class CategoryComponent implements OnChanges, OnInit, AfterViewIn
35
36
  container: ElementRef;
36
37
  label: ElementRef;
37
38
  containerStyles: any;
39
+ emojisToDisplay: any[];
38
40
  private filteredEmojisSubject;
39
41
  filteredEmojis$: Observable<any[] | null | undefined>;
40
42
  labelStyles: any;
@@ -48,10 +50,13 @@ export declare class CategoryComponent implements OnChanges, OnInit, AfterViewIn
48
50
  ngOnInit(): void;
49
51
  ngOnChanges(changes: SimpleChanges): void;
50
52
  ngAfterViewInit(): void;
53
+ get noEmojiToDisplay(): boolean;
51
54
  memoizeSize(): void;
52
55
  handleScroll(scrollTop: number): boolean;
53
- getEmojis(): any[];
56
+ updateRecentEmojis(): void;
54
57
  updateDisplay(display: 'none' | 'block'): void;
55
58
  trackById(index: number, item: any): any;
56
59
  private filterEmojis;
60
+ static ɵfac: i0.ɵɵFactoryDeclaration<CategoryComponent, never>;
61
+ static ɵcmp: i0.ɵɵComponentDeclaration<CategoryComponent, "emoji-category", never, { "emojis": "emojis"; "hasStickyPosition": "hasStickyPosition"; "name": "name"; "perLine": "perLine"; "totalFrequentLines": "totalFrequentLines"; "recent": "recent"; "custom": "custom"; "i18n": "i18n"; "id": "id"; "hideObsolete": "hideObsolete"; "notFoundEmoji": "notFoundEmoji"; "virtualize": "virtualize"; "virtualizeOffset": "virtualizeOffset"; "emojiIsNative": "emojiIsNative"; "emojiSkin": "emojiSkin"; "emojiSize": "emojiSize"; "emojiSet": "emojiSet"; "emojiSheetSize": "emojiSheetSize"; "emojiForceSize": "emojiForceSize"; "emojiTooltip": "emojiTooltip"; "emojiBackgroundImageFn": "emojiBackgroundImageFn"; "emojiImageUrlFn": "emojiImageUrlFn"; "emojiUseButton": "emojiUseButton"; }, { "emojiOver": "emojiOver"; "emojiLeave": "emojiLeave"; "emojiClick": "emojiClick"; }, never, never>;
57
62
  }
@@ -1,4 +1,5 @@
1
1
  /**
2
2
  * Generated bundle index. Do not edit.
3
3
  */
4
+ /// <amd-module name="@ctrl/ngx-emoji-mart" />
4
5
  export * from './public_api';
@@ -1,4 +1,5 @@
1
1
  import { EmojiData } from '@ctrl/ngx-emoji-mart/ngx-emoji';
2
+ import * as i0 from "@angular/core";
2
3
  export declare class EmojiFrequentlyService {
3
4
  private platformId;
4
5
  NAMESPACE: string;
@@ -14,4 +15,6 @@ export declare class EmojiFrequentlyService {
14
15
  init(): void;
15
16
  add(emoji: EmojiData): void;
16
17
  get(perLine: number, totalLines: number): any[];
18
+ static ɵfac: i0.ɵɵFactoryDeclaration<EmojiFrequentlyService, never>;
19
+ static ɵprov: i0.ɵɵInjectableDeclaration<EmojiFrequentlyService>;
17
20
  }
@@ -1,4 +1,5 @@
1
1
  import { EmojiData, EmojiService } from '@ctrl/ngx-emoji-mart/ngx-emoji';
2
+ import * as i0 from "@angular/core";
2
3
  export declare class EmojiSearch {
3
4
  private emojiService;
4
5
  originalPool: any;
@@ -20,4 +21,6 @@ export declare class EmojiSearch {
20
21
  addCustomToPool(custom: any, pool: any): void;
21
22
  search(value: string, emojisToShowFilter?: (x: any) => boolean, maxResults?: number, include?: any[], exclude?: any[], custom?: any[]): EmojiData[] | null;
22
23
  buildSearch(shortNames: string[], name: string, id: string, keywords: string[], emoticons: string[]): string;
24
+ static ɵfac: i0.ɵɵFactoryDeclaration<EmojiSearch, never>;
25
+ static ɵprov: i0.ɵɵInjectableDeclaration<EmojiSearch>;
23
26
  }
@@ -0,0 +1,83 @@
1
+ import { ChangeDetectionStrategy, Component, EventEmitter, Input, Output, } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ import * as i1 from "@angular/common";
4
+ export class AnchorsComponent {
5
+ constructor() {
6
+ this.categories = [];
7
+ this.icons = {};
8
+ this.anchorClick = new EventEmitter();
9
+ }
10
+ trackByFn(idx, cat) {
11
+ return cat.id;
12
+ }
13
+ handleClick($event, index) {
14
+ this.anchorClick.emit({
15
+ category: this.categories[index],
16
+ index,
17
+ });
18
+ }
19
+ }
20
+ AnchorsComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.0.1", ngImport: i0, type: AnchorsComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
21
+ AnchorsComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.0.1", type: AnchorsComponent, selector: "emoji-mart-anchors", inputs: { categories: "categories", color: "color", selected: "selected", i18n: "i18n", icons: "icons" }, outputs: { anchorClick: "anchorClick" }, ngImport: i0, template: `
22
+ <div class="emoji-mart-anchors">
23
+ <ng-template ngFor let-category [ngForOf]="categories" let-idx="index" [ngForTrackBy]="trackByFn">
24
+ <span
25
+ *ngIf="category.anchor !== false"
26
+ [attr.title]="i18n.categories[category.id]"
27
+ (click)="this.handleClick($event, idx)"
28
+ class="emoji-mart-anchor"
29
+ [class.emoji-mart-anchor-selected]="category.name === selected"
30
+ [style.color]="category.name === selected ? color : null"
31
+ >
32
+ <div>
33
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="24" height="24">
34
+ <path [attr.d]="icons[category.id]" />
35
+ </svg>
36
+ </div>
37
+ <span class="emoji-mart-anchor-bar" [style.background-color]="color"></span>
38
+ </span>
39
+ </ng-template>
40
+ </div>
41
+ `, isInline: true, directives: [{ type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
42
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.0.1", ngImport: i0, type: AnchorsComponent, decorators: [{
43
+ type: Component,
44
+ args: [{
45
+ selector: 'emoji-mart-anchors',
46
+ template: `
47
+ <div class="emoji-mart-anchors">
48
+ <ng-template ngFor let-category [ngForOf]="categories" let-idx="index" [ngForTrackBy]="trackByFn">
49
+ <span
50
+ *ngIf="category.anchor !== false"
51
+ [attr.title]="i18n.categories[category.id]"
52
+ (click)="this.handleClick($event, idx)"
53
+ class="emoji-mart-anchor"
54
+ [class.emoji-mart-anchor-selected]="category.name === selected"
55
+ [style.color]="category.name === selected ? color : null"
56
+ >
57
+ <div>
58
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="24" height="24">
59
+ <path [attr.d]="icons[category.id]" />
60
+ </svg>
61
+ </div>
62
+ <span class="emoji-mart-anchor-bar" [style.background-color]="color"></span>
63
+ </span>
64
+ </ng-template>
65
+ </div>
66
+ `,
67
+ changeDetection: ChangeDetectionStrategy.OnPush,
68
+ preserveWhitespaces: false,
69
+ }]
70
+ }], propDecorators: { categories: [{
71
+ type: Input
72
+ }], color: [{
73
+ type: Input
74
+ }], selected: [{
75
+ type: Input
76
+ }], i18n: [{
77
+ type: Input
78
+ }], icons: [{
79
+ type: Input
80
+ }], anchorClick: [{
81
+ type: Output
82
+ }] } });
83
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW5jaG9ycy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbGliL3BpY2tlci9hbmNob3JzLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsdUJBQXVCLEVBQ3ZCLFNBQVMsRUFDVCxZQUFZLEVBQ1osS0FBSyxFQUNMLE1BQU0sR0FDUCxNQUFNLGVBQWUsQ0FBQzs7O0FBOEJ2QixNQUFNLE9BQU8sZ0JBQWdCO0lBMUI3QjtRQTJCVyxlQUFVLEdBQW9CLEVBQUUsQ0FBQztRQUlqQyxVQUFLLEdBQThCLEVBQUUsQ0FBQztRQUNyQyxnQkFBVyxHQUFHLElBQUksWUFBWSxFQUE4QyxDQUFDO0tBV3hGO0lBVEMsU0FBUyxDQUFDLEdBQVcsRUFBRSxHQUFrQjtRQUN2QyxPQUFPLEdBQUcsQ0FBQyxFQUFFLENBQUM7SUFDaEIsQ0FBQztJQUNELFdBQVcsQ0FBQyxNQUFhLEVBQUUsS0FBYTtRQUN0QyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQztZQUNwQixRQUFRLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUM7WUFDaEMsS0FBSztTQUNOLENBQUMsQ0FBQztJQUNMLENBQUM7OzZHQWhCVSxnQkFBZ0I7aUdBQWhCLGdCQUFnQiw2TUF4QmpCOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW9CVDsyRkFJVSxnQkFBZ0I7a0JBMUI1QixTQUFTO21CQUFDO29CQUNULFFBQVEsRUFBRSxvQkFBb0I7b0JBQzlCLFFBQVEsRUFBRTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FvQlQ7b0JBQ0QsZUFBZSxFQUFFLHVCQUF1QixDQUFDLE1BQU07b0JBQy9DLG1CQUFtQixFQUFFLEtBQUs7aUJBQzNCOzhCQUVVLFVBQVU7c0JBQWxCLEtBQUs7Z0JBQ0csS0FBSztzQkFBYixLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csSUFBSTtzQkFBWixLQUFLO2dCQUNHLEtBQUs7c0JBQWIsS0FBSztnQkFDSSxXQUFXO3NCQUFwQixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENvbXBvbmVudCxcbiAgRXZlbnRFbWl0dGVyLFxuICBJbnB1dCxcbiAgT3V0cHV0LFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgRW1vamlDYXRlZ29yeSB9IGZyb20gJ0BjdHJsL25neC1lbW9qaS1tYXJ0L25neC1lbW9qaSc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2Vtb2ppLW1hcnQtYW5jaG9ycycsXG4gIHRlbXBsYXRlOiBgXG4gIDxkaXYgY2xhc3M9XCJlbW9qaS1tYXJ0LWFuY2hvcnNcIj5cbiAgICA8bmctdGVtcGxhdGUgbmdGb3IgbGV0LWNhdGVnb3J5IFtuZ0Zvck9mXT1cImNhdGVnb3JpZXNcIiBsZXQtaWR4PVwiaW5kZXhcIiBbbmdGb3JUcmFja0J5XT1cInRyYWNrQnlGblwiPlxuICAgICAgPHNwYW5cbiAgICAgICAgKm5nSWY9XCJjYXRlZ29yeS5hbmNob3IgIT09IGZhbHNlXCJcbiAgICAgICAgW2F0dHIudGl0bGVdPVwiaTE4bi5jYXRlZ29yaWVzW2NhdGVnb3J5LmlkXVwiXG4gICAgICAgIChjbGljayk9XCJ0aGlzLmhhbmRsZUNsaWNrKCRldmVudCwgaWR4KVwiXG4gICAgICAgIGNsYXNzPVwiZW1vamktbWFydC1hbmNob3JcIlxuICAgICAgICBbY2xhc3MuZW1vamktbWFydC1hbmNob3Itc2VsZWN0ZWRdPVwiY2F0ZWdvcnkubmFtZSA9PT0gc2VsZWN0ZWRcIlxuICAgICAgICBbc3R5bGUuY29sb3JdPVwiY2F0ZWdvcnkubmFtZSA9PT0gc2VsZWN0ZWQgPyBjb2xvciA6IG51bGxcIlxuICAgICAgPlxuICAgICAgICA8ZGl2PlxuICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiB3aWR0aD1cIjI0XCIgaGVpZ2h0PVwiMjRcIj5cbiAgICAgICAgICAgIDxwYXRoIFthdHRyLmRdPVwiaWNvbnNbY2F0ZWdvcnkuaWRdXCIgLz5cbiAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwiZW1vamktbWFydC1hbmNob3ItYmFyXCIgW3N0eWxlLmJhY2tncm91bmQtY29sb3JdPVwiY29sb3JcIj48L3NwYW4+XG4gICAgICA8L3NwYW4+XG4gICAgPC9uZy10ZW1wbGF0ZT5cbiAgPC9kaXY+XG4gIGAsXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICBwcmVzZXJ2ZVdoaXRlc3BhY2VzOiBmYWxzZSxcbn0pXG5leHBvcnQgY2xhc3MgQW5jaG9yc0NvbXBvbmVudCB7XG4gIEBJbnB1dCgpIGNhdGVnb3JpZXM6IEVtb2ppQ2F0ZWdvcnlbXSA9IFtdO1xuICBASW5wdXQoKSBjb2xvcj86IHN0cmluZztcbiAgQElucHV0KCkgc2VsZWN0ZWQ/OiBzdHJpbmc7XG4gIEBJbnB1dCgpIGkxOG46IGFueTtcbiAgQElucHV0KCkgaWNvbnM6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0gPSB7fTtcbiAgQE91dHB1dCgpIGFuY2hvckNsaWNrID0gbmV3IEV2ZW50RW1pdHRlcjx7IGNhdGVnb3J5OiBFbW9qaUNhdGVnb3J5LCBpbmRleDogbnVtYmVyIH0+KCk7XG5cbiAgdHJhY2tCeUZuKGlkeDogbnVtYmVyLCBjYXQ6IEVtb2ppQ2F0ZWdvcnkpIHtcbiAgICByZXR1cm4gY2F0LmlkO1xuICB9XG4gIGhhbmRsZUNsaWNrKCRldmVudDogRXZlbnQsIGluZGV4OiBudW1iZXIpIHtcbiAgICB0aGlzLmFuY2hvckNsaWNrLmVtaXQoe1xuICAgICAgY2F0ZWdvcnk6IHRoaXMuY2F0ZWdvcmllc1tpbmRleF0sXG4gICAgICBpbmRleCxcbiAgICB9KTtcbiAgfVxufVxuIl19