valtech-components 4.0.227 → 4.0.228

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 (27) hide show
  1. package/esm2022/lib/components/molecules/chat-input/chat-input.component.mjs +9 -1
  2. package/esm2022/lib/components/molecules/message-bubble/message-bubble.component.mjs +191 -274
  3. package/esm2022/lib/components/molecules/typing-indicator/typing-indicator.component.mjs +12 -11
  4. package/esm2022/lib/components/organisms/chat-window/chat-window.component.mjs +203 -216
  5. package/esm2022/lib/components/organisms/thread-panel/thread-panel.component.mjs +10 -10
  6. package/esm2022/lib/services/chat/conversation.service.mjs +14 -37
  7. package/esm2022/lib/services/chat/types.mjs +1 -1
  8. package/esm2022/lib/services/i18n/default-content.mjs +1 -5
  9. package/esm2022/lib/shared/utils/datetime.mjs +1 -54
  10. package/esm2022/lib/version.mjs +2 -2
  11. package/esm2022/public-api.mjs +2 -4
  12. package/fesm2022/valtech-components.mjs +428 -1080
  13. package/fesm2022/valtech-components.mjs.map +1 -1
  14. package/lib/components/molecules/message-bubble/message-bubble.component.d.ts +32 -34
  15. package/lib/components/molecules/typing-indicator/typing-indicator.component.d.ts +4 -5
  16. package/lib/components/organisms/chat-window/chat-window.component.d.ts +56 -52
  17. package/lib/services/chat/conversation.service.d.ts +5 -12
  18. package/lib/services/chat/types.d.ts +52 -86
  19. package/lib/shared/utils/datetime.d.ts +0 -19
  20. package/lib/version.d.ts +1 -1
  21. package/package.json +1 -1
  22. package/public-api.d.ts +1 -3
  23. package/src/lib/services/firebase/firebase-messaging-sw.js +125 -70
  24. package/esm2022/lib/components/molecules/chat-composer/chat-composer.component.mjs +0 -391
  25. package/esm2022/lib/components/molecules/conversation-list-item/conversation-list-item.component.mjs +0 -108
  26. package/lib/components/molecules/chat-composer/chat-composer.component.d.ts +0 -63
  27. package/lib/components/molecules/conversation-list-item/conversation-list-item.component.d.ts +0 -30
@@ -1,4 +1,4 @@
1
- import { Component, computed, inject, input } from '@angular/core';
1
+ import { Component, Input, inject, computed } from '@angular/core';
2
2
  import { CommonModule } from '@angular/common';
3
3
  import { I18nService } from '../../../services/i18n';
4
4
  import * as i0 from "@angular/core";
@@ -17,9 +17,8 @@ const TYPING_I18N = {
17
17
  /**
18
18
  * val-typing-indicator
19
19
  *
20
- * Muestra quienes estan escribiendo con animacion de tres puntos. Se oculta
21
- * si `typingUsers` esta vacio. Usa signal input para que `typingText` (computed)
22
- * recompute al cambiar la lista.
20
+ * Muestra quienes estan escribiendo en el chat con animacion de tres puntos.
21
+ * Se oculta automaticamente si typingUsers esta vacio.
23
22
  *
24
23
  * @example
25
24
  * <val-typing-indicator [typingUsers]="['Maria', 'Carlos']" />
@@ -27,10 +26,10 @@ const TYPING_I18N = {
27
26
  export class TypingIndicatorComponent {
28
27
  constructor() {
29
28
  this.i18n = inject(I18nService);
30
- this.typingUsers = input([]);
29
+ this.typingUsers = [];
31
30
  this.typingText = computed(() => {
32
31
  this.i18n.lang();
33
- const users = this.typingUsers();
32
+ const users = this.typingUsers ?? [];
34
33
  if (users.length === 0)
35
34
  return '';
36
35
  if (users.length === 1) {
@@ -44,8 +43,8 @@ export class TypingIndicatorComponent {
44
43
  this.i18n.registerDefaults('TypingIndicator', TYPING_I18N);
45
44
  }
46
45
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: TypingIndicatorComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
47
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: TypingIndicatorComponent, isStandalone: true, selector: "val-typing-indicator", inputs: { typingUsers: { classPropertyName: "typingUsers", publicName: "typingUsers", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: `
48
- @if (typingUsers().length > 0) {
46
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: TypingIndicatorComponent, isStandalone: true, selector: "val-typing-indicator", inputs: { typingUsers: "typingUsers" }, ngImport: i0, template: `
47
+ @if (typingUsers && typingUsers.length > 0) {
49
48
  <div class="typing-indicator">
50
49
  <div class="dots">
51
50
  <span></span>
@@ -60,7 +59,7 @@ export class TypingIndicatorComponent {
60
59
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: TypingIndicatorComponent, decorators: [{
61
60
  type: Component,
62
61
  args: [{ selector: 'val-typing-indicator', standalone: true, imports: [CommonModule], template: `
63
- @if (typingUsers().length > 0) {
62
+ @if (typingUsers && typingUsers.length > 0) {
64
63
  <div class="typing-indicator">
65
64
  <div class="dots">
66
65
  <span></span>
@@ -71,5 +70,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
71
70
  </div>
72
71
  }
73
72
  `, styles: [".typing-indicator{display:flex;align-items:center;gap:8px;padding:4px 12px;min-height:28px}.typing-text{font-size:.8125rem;color:var(--ion-color-medium, #92949c);font-style:italic}.dots{display:flex;align-items:center;gap:3px}.dots span{display:inline-block;width:5px;height:5px;border-radius:50%;background:var(--ion-color-medium, #92949c);animation:typing-dot 1.2s infinite ease-in-out}.dots span:nth-child(1){animation-delay:0s}.dots span:nth-child(2){animation-delay:.2s}.dots span:nth-child(3){animation-delay:.4s}@keyframes typing-dot{0%,60%,to{transform:translateY(0);opacity:.4}30%{transform:translateY(-4px);opacity:1}}\n"] }]
74
- }], ctorParameters: () => [] });
75
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwaW5nLWluZGljYXRvci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL2NvbXBvbmVudHMvbW9sZWN1bGVzL3R5cGluZy1pbmRpY2F0b3IvdHlwaW5nLWluZGljYXRvci5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNuRSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHdCQUF3QixDQUFDOztBQUVyRCxNQUFNLFdBQVcsR0FBRztJQUNsQixFQUFFLEVBQUU7UUFDRixHQUFHLEVBQUUseUJBQXlCO1FBQzlCLEdBQUcsRUFBRSxvQ0FBb0M7UUFDekMsSUFBSSxFQUFFLDBCQUEwQjtLQUNqQztJQUNELEVBQUUsRUFBRTtRQUNGLEdBQUcsRUFBRSxrQkFBa0I7UUFDdkIsR0FBRyxFQUFFLCtCQUErQjtRQUNwQyxJQUFJLEVBQUUsMkJBQTJCO0tBQ2xDO0NBQ0YsQ0FBQztBQUVGOzs7Ozs7Ozs7R0FTRztBQW1CSCxNQUFNLE9BQU8sd0JBQXdCO0lBS25DO1FBSlUsU0FBSSxHQUFHLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUU1QixnQkFBVyxHQUFHLEtBQUssQ0FBVyxFQUFFLENBQUMsQ0FBQztRQU1qQyxlQUFVLEdBQUcsUUFBUSxDQUFDLEdBQUcsRUFBRTtZQUNuQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ2pCLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUNqQyxJQUFJLEtBQUssQ0FBQyxNQUFNLEtBQUssQ0FBQztnQkFBRSxPQUFPLEVBQUUsQ0FBQztZQUNsQyxJQUFJLEtBQUssQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7Z0JBQ3ZCLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLGlCQUFpQixFQUFFLEVBQUUsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDbkUsQ0FBQztZQUNELElBQUksS0FBSyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztnQkFDdkIsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsaUJBQWlCLEVBQUUsRUFBRSxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ3BGLENBQUM7WUFDRCxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxpQkFBaUIsQ0FBQyxDQUFDO1FBQ2hELENBQUMsQ0FBQyxDQUFDO1FBZEQsSUFBSSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxpQkFBaUIsRUFBRSxXQUFXLENBQUMsQ0FBQztJQUM3RCxDQUFDOytHQVBVLHdCQUF3QjttR0FBeEIsd0JBQXdCLHNPQWR6Qjs7Ozs7Ozs7Ozs7R0FXVCwrckJBWlMsWUFBWTs7NEZBZVgsd0JBQXdCO2tCQWxCcEMsU0FBUzsrQkFDRSxzQkFBc0IsY0FDcEIsSUFBSSxXQUNQLENBQUMsWUFBWSxDQUFDLFlBQ2I7Ozs7Ozs7Ozs7O0dBV1QiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIGNvbXB1dGVkLCBpbmplY3QsIGlucHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgSTE4blNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9pMThuJztcblxuY29uc3QgVFlQSU5HX0kxOE4gPSB7XG4gIGVzOiB7XG4gICAgb25lOiAne25hbWV9IGVzdGEgZXNjcmliaWVuZG8nLFxuICAgIHR3bzogJ3tuYW1lfSB5IHtvdGhlcn0gZXN0YW4gZXNjcmliaWVuZG8nLFxuICAgIG1hbnk6ICdWYXJpb3MgZXN0YW4gZXNjcmliaWVuZG8nLFxuICB9LFxuICBlbjoge1xuICAgIG9uZTogJ3tuYW1lfSBpcyB0eXBpbmcnLFxuICAgIHR3bzogJ3tuYW1lfSBhbmQge290aGVyfSBhcmUgdHlwaW5nJyxcbiAgICBtYW55OiAnU2V2ZXJhbCBwZW9wbGUgYXJlIHR5cGluZycsXG4gIH0sXG59O1xuXG4vKipcbiAqIHZhbC10eXBpbmctaW5kaWNhdG9yXG4gKlxuICogTXVlc3RyYSBxdWllbmVzIGVzdGFuIGVzY3JpYmllbmRvIGNvbiBhbmltYWNpb24gZGUgdHJlcyBwdW50b3MuIFNlIG9jdWx0YVxuICogc2kgYHR5cGluZ1VzZXJzYCBlc3RhIHZhY2lvLiBVc2Egc2lnbmFsIGlucHV0IHBhcmEgcXVlIGB0eXBpbmdUZXh0YCAoY29tcHV0ZWQpXG4gKiByZWNvbXB1dGUgYWwgY2FtYmlhciBsYSBsaXN0YS5cbiAqXG4gKiBAZXhhbXBsZVxuICogPHZhbC10eXBpbmctaW5kaWNhdG9yIFt0eXBpbmdVc2Vyc109XCJbJ01hcmlhJywgJ0NhcmxvcyddXCIgLz5cbiAqL1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAndmFsLXR5cGluZy1pbmRpY2F0b3InLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlXSxcbiAgdGVtcGxhdGU6IGBcbiAgICBAaWYgKHR5cGluZ1VzZXJzKCkubGVuZ3RoID4gMCkge1xuICAgICAgPGRpdiBjbGFzcz1cInR5cGluZy1pbmRpY2F0b3JcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImRvdHNcIj5cbiAgICAgICAgICA8c3Bhbj48L3NwYW4+XG4gICAgICAgICAgPHNwYW4+PC9zcGFuPlxuICAgICAgICAgIDxzcGFuPjwvc3Bhbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwidHlwaW5nLXRleHRcIj57eyB0eXBpbmdUZXh0KCkgfX08L3NwYW4+XG4gICAgICA8L2Rpdj5cbiAgICB9XG4gIGAsXG4gIHN0eWxlVXJsczogWycuL3R5cGluZy1pbmRpY2F0b3IuY29tcG9uZW50LnNjc3MnXSxcbn0pXG5leHBvcnQgY2xhc3MgVHlwaW5nSW5kaWNhdG9yQ29tcG9uZW50IHtcbiAgcHJvdGVjdGVkIGkxOG4gPSBpbmplY3QoSTE4blNlcnZpY2UpO1xuXG4gIHJlYWRvbmx5IHR5cGluZ1VzZXJzID0gaW5wdXQ8c3RyaW5nW10+KFtdKTtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLmkxOG4ucmVnaXN0ZXJEZWZhdWx0cygnVHlwaW5nSW5kaWNhdG9yJywgVFlQSU5HX0kxOE4pO1xuICB9XG5cbiAgcHJvdGVjdGVkIHR5cGluZ1RleHQgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgdGhpcy5pMThuLmxhbmcoKTtcbiAgICBjb25zdCB1c2VycyA9IHRoaXMudHlwaW5nVXNlcnMoKTtcbiAgICBpZiAodXNlcnMubGVuZ3RoID09PSAwKSByZXR1cm4gJyc7XG4gICAgaWYgKHVzZXJzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgcmV0dXJuIHRoaXMuaTE4bi50KCdvbmUnLCAnVHlwaW5nSW5kaWNhdG9yJywgeyBuYW1lOiB1c2Vyc1swXSB9KTtcbiAgICB9XG4gICAgaWYgKHVzZXJzLmxlbmd0aCA9PT0gMikge1xuICAgICAgcmV0dXJuIHRoaXMuaTE4bi50KCd0d28nLCAnVHlwaW5nSW5kaWNhdG9yJywgeyBuYW1lOiB1c2Vyc1swXSwgb3RoZXI6IHVzZXJzWzFdIH0pO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5pMThuLnQoJ21hbnknLCAnVHlwaW5nSW5kaWNhdG9yJyk7XG4gIH0pO1xufVxuIl19
73
+ }], ctorParameters: () => [], propDecorators: { typingUsers: [{
74
+ type: Input
75
+ }] } });
76
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwaW5nLWluZGljYXRvci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL2NvbXBvbmVudHMvbW9sZWN1bGVzL3R5cGluZy1pbmRpY2F0b3IvdHlwaW5nLWluZGljYXRvci5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNuRSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHdCQUF3QixDQUFDOztBQUVyRCxNQUFNLFdBQVcsR0FBRztJQUNsQixFQUFFLEVBQUU7UUFDRixHQUFHLEVBQUUseUJBQXlCO1FBQzlCLEdBQUcsRUFBRSxvQ0FBb0M7UUFDekMsSUFBSSxFQUFFLDBCQUEwQjtLQUNqQztJQUNELEVBQUUsRUFBRTtRQUNGLEdBQUcsRUFBRSxrQkFBa0I7UUFDdkIsR0FBRyxFQUFFLCtCQUErQjtRQUNwQyxJQUFJLEVBQUUsMkJBQTJCO0tBQ2xDO0NBQ0YsQ0FBQztBQUVGOzs7Ozs7OztHQVFHO0FBbUJILE1BQU0sT0FBTyx3QkFBd0I7SUFLbkM7UUFKVSxTQUFJLEdBQUcsTUFBTSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBRTVCLGdCQUFXLEdBQWEsRUFBRSxDQUFDO1FBTTFCLGVBQVUsR0FBRyxRQUFRLENBQUMsR0FBRyxFQUFFO1lBQ25DLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDakIsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLFdBQVcsSUFBSSxFQUFFLENBQUM7WUFDckMsSUFBSSxLQUFLLENBQUMsTUFBTSxLQUFLLENBQUM7Z0JBQUUsT0FBTyxFQUFFLENBQUM7WUFDbEMsSUFBSSxLQUFLLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO2dCQUN2QixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxpQkFBaUIsRUFBRSxFQUFFLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ25FLENBQUM7WUFDRCxJQUFJLEtBQUssQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7Z0JBQ3ZCLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLGlCQUFpQixFQUFFLEVBQUUsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUNwRixDQUFDO1lBQ0QsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUUsaUJBQWlCLENBQUMsQ0FBQztRQUNoRCxDQUFDLENBQUMsQ0FBQztRQWRELElBQUksQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsaUJBQWlCLEVBQUUsV0FBVyxDQUFDLENBQUM7SUFDN0QsQ0FBQzsrR0FQVSx3QkFBd0I7bUdBQXhCLHdCQUF3Qix3SEFkekI7Ozs7Ozs7Ozs7O0dBV1QsK3JCQVpTLFlBQVk7OzRGQWVYLHdCQUF3QjtrQkFsQnBDLFNBQVM7K0JBQ0Usc0JBQXNCLGNBQ3BCLElBQUksV0FDUCxDQUFDLFlBQVksQ0FBQyxZQUNiOzs7Ozs7Ozs7OztHQVdUO3dEQU1RLFdBQVc7c0JBQW5CLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0LCBpbmplY3QsIGNvbXB1dGVkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgSTE4blNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9pMThuJztcblxuY29uc3QgVFlQSU5HX0kxOE4gPSB7XG4gIGVzOiB7XG4gICAgb25lOiAne25hbWV9IGVzdGEgZXNjcmliaWVuZG8nLFxuICAgIHR3bzogJ3tuYW1lfSB5IHtvdGhlcn0gZXN0YW4gZXNjcmliaWVuZG8nLFxuICAgIG1hbnk6ICdWYXJpb3MgZXN0YW4gZXNjcmliaWVuZG8nLFxuICB9LFxuICBlbjoge1xuICAgIG9uZTogJ3tuYW1lfSBpcyB0eXBpbmcnLFxuICAgIHR3bzogJ3tuYW1lfSBhbmQge290aGVyfSBhcmUgdHlwaW5nJyxcbiAgICBtYW55OiAnU2V2ZXJhbCBwZW9wbGUgYXJlIHR5cGluZycsXG4gIH0sXG59O1xuXG4vKipcbiAqIHZhbC10eXBpbmctaW5kaWNhdG9yXG4gKlxuICogTXVlc3RyYSBxdWllbmVzIGVzdGFuIGVzY3JpYmllbmRvIGVuIGVsIGNoYXQgY29uIGFuaW1hY2lvbiBkZSB0cmVzIHB1bnRvcy5cbiAqIFNlIG9jdWx0YSBhdXRvbWF0aWNhbWVudGUgc2kgdHlwaW5nVXNlcnMgZXN0YSB2YWNpby5cbiAqXG4gKiBAZXhhbXBsZVxuICogPHZhbC10eXBpbmctaW5kaWNhdG9yIFt0eXBpbmdVc2Vyc109XCJbJ01hcmlhJywgJ0NhcmxvcyddXCIgLz5cbiAqL1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAndmFsLXR5cGluZy1pbmRpY2F0b3InLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlXSxcbiAgdGVtcGxhdGU6IGBcbiAgICBAaWYgKHR5cGluZ1VzZXJzICYmIHR5cGluZ1VzZXJzLmxlbmd0aCA+IDApIHtcbiAgICAgIDxkaXYgY2xhc3M9XCJ0eXBpbmctaW5kaWNhdG9yXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJkb3RzXCI+XG4gICAgICAgICAgPHNwYW4+PC9zcGFuPlxuICAgICAgICAgIDxzcGFuPjwvc3Bhbj5cbiAgICAgICAgICA8c3Bhbj48L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8c3BhbiBjbGFzcz1cInR5cGluZy10ZXh0XCI+e3sgdHlwaW5nVGV4dCgpIH19PC9zcGFuPlxuICAgICAgPC9kaXY+XG4gICAgfVxuICBgLFxuICBzdHlsZVVybHM6IFsnLi90eXBpbmctaW5kaWNhdG9yLmNvbXBvbmVudC5zY3NzJ10sXG59KVxuZXhwb3J0IGNsYXNzIFR5cGluZ0luZGljYXRvckNvbXBvbmVudCB7XG4gIHByb3RlY3RlZCBpMThuID0gaW5qZWN0KEkxOG5TZXJ2aWNlKTtcblxuICBASW5wdXQoKSB0eXBpbmdVc2Vyczogc3RyaW5nW10gPSBbXTtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLmkxOG4ucmVnaXN0ZXJEZWZhdWx0cygnVHlwaW5nSW5kaWNhdG9yJywgVFlQSU5HX0kxOE4pO1xuICB9XG5cbiAgcHJvdGVjdGVkIHR5cGluZ1RleHQgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgdGhpcy5pMThuLmxhbmcoKTtcbiAgICBjb25zdCB1c2VycyA9IHRoaXMudHlwaW5nVXNlcnMgPz8gW107XG4gICAgaWYgKHVzZXJzLmxlbmd0aCA9PT0gMCkgcmV0dXJuICcnO1xuICAgIGlmICh1c2Vycy5sZW5ndGggPT09IDEpIHtcbiAgICAgIHJldHVybiB0aGlzLmkxOG4udCgnb25lJywgJ1R5cGluZ0luZGljYXRvcicsIHsgbmFtZTogdXNlcnNbMF0gfSk7XG4gICAgfVxuICAgIGlmICh1c2Vycy5sZW5ndGggPT09IDIpIHtcbiAgICAgIHJldHVybiB0aGlzLmkxOG4udCgndHdvJywgJ1R5cGluZ0luZGljYXRvcicsIHsgbmFtZTogdXNlcnNbMF0sIG90aGVyOiB1c2Vyc1sxXSB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuaTE4bi50KCdtYW55JywgJ1R5cGluZ0luZGljYXRvcicpO1xuICB9KTtcbn1cbiJdfQ==