@sumaris-net/ngx-components 18.23.48 → 18.23.50

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 (78) hide show
  1. package/doc/changelog.md +4 -0
  2. package/esm2022/public_api.mjs +2 -1
  3. package/esm2022/src/app/admin/users/users.mjs +25 -22
  4. package/esm2022/src/app/core/account/new-token.form.mjs +12 -9
  5. package/esm2022/src/app/core/account/token.table.mjs +14 -11
  6. package/esm2022/src/app/core/form/array/testing/form-array.test.mjs +9 -6
  7. package/esm2022/src/app/core/form/buttons/form-buttons-bar.component.mjs +8 -5
  8. package/esm2022/src/app/core/form/list/list.form.mjs +8 -5
  9. package/esm2022/src/app/core/form/properties/properties.form.mjs +12 -9
  10. package/esm2022/src/app/core/form/properties/properties.table.mjs +15 -12
  11. package/esm2022/src/app/core/form/text-popover/text-popover.component.mjs +10 -7
  12. package/esm2022/src/app/core/home/home.mjs +21 -18
  13. package/esm2022/src/app/core/menu/menu.component.mjs +10 -7
  14. package/esm2022/src/app/core/settings/settings.page.mjs +10 -7
  15. package/esm2022/src/app/core/table/column/actions-column.component.mjs +8 -5
  16. package/esm2022/src/app/core/table/column/nav-actions-column.component.mjs +9 -6
  17. package/esm2022/src/app/core/table/testing/table.testing.mjs +27 -23
  18. package/esm2022/src/app/core/table/testing/table2.testing.mjs +25 -22
  19. package/esm2022/src/app/shared/constants.mjs +3 -1
  20. package/esm2022/src/app/shared/directives/autotooltip.directive.mjs +35 -0
  21. package/esm2022/src/app/shared/directives/directives.module.mjs +33 -4
  22. package/esm2022/src/app/shared/functions.mjs +2 -2
  23. package/esm2022/src/app/shared/image/gallery/image-gallery.component.mjs +15 -12
  24. package/esm2022/src/app/shared/material/autocomplete/material.autocomplete.mjs +13 -11
  25. package/esm2022/src/app/shared/material/autocomplete/material.autocomplete.module.mjs +4 -2
  26. package/esm2022/src/app/shared/material/boolean/boolean.module.mjs +5 -2
  27. package/esm2022/src/app/shared/material/boolean/material.boolean.mjs +9 -6
  28. package/esm2022/src/app/shared/material/boolean/testing/boolean.test.page.mjs +15 -4
  29. package/esm2022/src/app/shared/material/chips/chips.module.mjs +5 -2
  30. package/esm2022/src/app/shared/material/chips/material.chips.mjs +14 -12
  31. package/esm2022/src/app/shared/named-filter/named-filter-selector.component.mjs +8 -5
  32. package/esm2022/src/app/shared/storage/storage-explorer.component.mjs +11 -9
  33. package/esm2022/src/app/social/feed/feed.component.mjs +15 -12
  34. package/esm2022/src/app/social/job/progression/job-progression.icon.mjs +11 -8
  35. package/esm2022/src/app/social/job/progression/job-progression.list.mjs +12 -9
  36. package/esm2022/src/app/social/user-event/notification/user-event-notification.icon.mjs +12 -8
  37. package/esm2022/src/app/social/user-event/notification/user-event-notification.list.mjs +12 -9
  38. package/esm2022/src/app/social/user-event/notification/user-event-notification.modal.mjs +9 -6
  39. package/fesm2022/sumaris-net.ngx-components.mjs +195 -90
  40. package/fesm2022/sumaris-net.ngx-components.mjs.map +1 -1
  41. package/package.json +1 -1
  42. package/public_api.d.ts +1 -0
  43. package/src/app/admin/users/users.d.ts +1 -0
  44. package/src/app/core/account/new-token.form.d.ts +1 -0
  45. package/src/app/core/account/token.table.d.ts +1 -0
  46. package/src/app/core/form/array/testing/form-array.test.d.ts +1 -0
  47. package/src/app/core/form/buttons/form-buttons-bar.component.d.ts +1 -0
  48. package/src/app/core/form/list/list.form.d.ts +1 -0
  49. package/src/app/core/form/properties/properties.form.d.ts +1 -0
  50. package/src/app/core/form/properties/properties.table.d.ts +1 -0
  51. package/src/app/core/form/text-popover/text-popover.component.d.ts +1 -0
  52. package/src/app/core/home/home.d.ts +1 -0
  53. package/src/app/core/menu/menu.component.d.ts +1 -0
  54. package/src/app/core/settings/settings.page.d.ts +1 -0
  55. package/src/app/core/table/column/actions-column.component.d.ts +1 -0
  56. package/src/app/core/table/column/nav-actions-column.component.d.ts +1 -0
  57. package/src/app/core/table/testing/table.testing.d.ts +1 -0
  58. package/src/app/core/table/testing/table2.testing.d.ts +1 -0
  59. package/src/app/shared/constants.d.ts +2 -0
  60. package/src/app/shared/directives/autotooltip.directive.d.ts +14 -0
  61. package/src/app/shared/directives/directives.module.d.ts +4 -3
  62. package/src/app/shared/image/gallery/image-gallery.component.d.ts +1 -0
  63. package/src/app/shared/material/autocomplete/material.autocomplete.d.ts +1 -0
  64. package/src/app/shared/material/autocomplete/material.autocomplete.module.d.ts +2 -1
  65. package/src/app/shared/material/boolean/boolean.module.d.ts +2 -1
  66. package/src/app/shared/material/boolean/material.boolean.d.ts +1 -0
  67. package/src/app/shared/material/boolean/testing/boolean.test.page.d.ts +5 -0
  68. package/src/app/shared/material/chips/chips.module.d.ts +2 -1
  69. package/src/app/shared/material/chips/material.chips.d.ts +1 -0
  70. package/src/app/shared/named-filter/named-filter-selector.component.d.ts +1 -0
  71. package/src/app/shared/storage/storage-explorer.component.d.ts +1 -0
  72. package/src/app/social/feed/feed.component.d.ts +1 -0
  73. package/src/app/social/job/progression/job-progression.icon.d.ts +1 -0
  74. package/src/app/social/job/progression/job-progression.list.d.ts +1 -0
  75. package/src/app/social/user-event/notification/user-event-notification.icon.d.ts +1 -0
  76. package/src/app/social/user-event/notification/user-event-notification.list.d.ts +2 -0
  77. package/src/app/social/user-event/notification/user-event-notification.modal.d.ts +1 -0
  78. package/src/assets/manifest.json +1 -1
@@ -1,8 +1,9 @@
1
- import { Component } from '@angular/core';
1
+ import { Component, inject } from '@angular/core';
2
2
  import { Subscription } from 'rxjs';
3
3
  import { isNilOrBlank, trimEmptyToNull } from '../../../../shared/functions';
4
4
  import { AppForm } from '../../form.class';
5
5
  import { AppFormArray } from '../form-array';
6
+ import { SHOW_TOOLTIP } from '../../../../shared/constants';
6
7
  import * as i0 from "@angular/core";
7
8
  import * as i1 from "@angular/forms";
8
9
  import * as i2 from "../../../services/platform.service";
@@ -12,8 +13,9 @@ import * as i5 from "@angular/material/form-field";
12
13
  import * as i6 from "@angular/material/input";
13
14
  import * as i7 from "@angular/material/icon";
14
15
  import * as i8 from "@angular/material/button";
15
- import * as i9 from "@ngx-translate/core";
16
- import * as i10 from "../../../../shared/pipes/form.pipes";
16
+ import * as i9 from "@angular/material/tooltip";
17
+ import * as i10 from "@ngx-translate/core";
18
+ import * as i11 from "../../../../shared/pipes/form.pipes";
17
19
  export class ArrayFormTestPage extends AppForm {
18
20
  formBuilder;
19
21
  platform;
@@ -35,6 +37,7 @@ export class ArrayFormTestPage extends AppForm {
35
37
  get valueToAddControl() {
36
38
  return this.form?.get('valueToAdd');
37
39
  }
40
+ showTooltip = inject(SHOW_TOOLTIP);
38
41
  constructor(formBuilder, platform, injection, cd) {
39
42
  super(injection, formBuilder.group({
40
43
  default: new AppFormArray((value) => this.formBuilder.control(value), (v1, v2) => v1 === v2, (value) => isNilOrBlank(value)),
@@ -85,10 +88,10 @@ export class ArrayFormTestPage extends AppForm {
85
88
  this.cd.markForCheck();
86
89
  }
87
90
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ArrayFormTestPage, deps: [{ token: i1.UntypedFormBuilder }, { token: i2.PlatformService }, { token: i0.Injector }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
88
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: ArrayFormTestPage, selector: "app-array-test", usesInheritance: true, ngImport: i0, template: "<ion-header>\n <ion-toolbar color=\"primary\">\n <ion-buttons slot=\"start\">\n <ion-back-button></ion-back-button>\n </ion-buttons>\n\n <ion-title>Form Array test page</ion-title>\n </ion-toolbar>\n</ion-header>\n\n<ion-content>\n <form class=\"form-container ion-padding\" [formGroup]=\"form\">\n <ion-grid>\n <ion-row>\n <!-- Default -->\n <ion-col size=\"6\">\n <ng-container\n *ngTemplateOutlet=\"\n arrayCard;\n context: { $implicit: defaultFormArray, title: 'Default behavior', showSetValue: true }\n \"\n ></ng-container>\n </ion-col>\n\n <!-- Not empty array -->\n <ion-col size=\"6\">\n <ng-container\n *ngTemplateOutlet=\"\n arrayCard;\n context: { $implicit: notEmptyFormArray, title: 'Not empty array', showSetValue: true }\n \"\n ></ng-container>\n </ion-col>\n\n <!-- Allow null values -->\n <ion-col size=\"6\">\n <ng-container\n *ngTemplateOutlet=\"\n arrayCard;\n context: {\n $implicit: nullValuesFormArray,\n title: 'Allow many null values',\n showAddToolbar: true,\n showResizeToolbar: true,\n showSetValue: true\n }\n \"\n ></ng-container>\n </ion-col>\n\n <!-- Allow duplicated value -->\n <ion-col size=\"6\">\n <ng-container\n *ngTemplateOutlet=\"\n arrayCard;\n context: {\n $implicit: duplicatedValuesFormArray,\n title: 'Allow duplicated values',\n showAddToolbar: true,\n showResizeToolbar: true,\n showSetValue: true\n }\n \"\n ></ng-container>\n </ion-col>\n </ion-row>\n </ion-grid>\n </form>\n</ion-content>\n\n<ng-template\n #arrayCard\n let-formArray\n let-title=\"title\"\n let-showAddToolbar=\"showAddToolbar\"\n let-showResizeToolbar=\"showResizeToolbar\"\n let-showSetValue=\"showSetValue\"\n>\n <ion-card>\n <ion-card-header>\n <ion-card-title>{{ title }}</ion-card-title>\n </ion-card-header>\n <ion-card-content>\n @for (\n control of (formArray | formGetArray).controls;\n track i;\n let i = $index;\n let first = $first;\n let last = $last\n ) {\n <ion-row>\n <ion-col>\n <mat-form-field>\n <mat-label>Value #{{ i + 1 }}</mat-label>\n <input matInput [formControl]=\"control | formGetControl\" />\n </mat-form-field>\n </ion-col>\n <ion-col size=\"auto\">\n @if (last && !showAddToolbar) {\n <button type=\"button\" mat-icon-button [title]=\"'COMMON.BTN_ADD' | translate\" (click)=\"formArray.add()\">\n <mat-icon>add</mat-icon>\n </button>\n }\n <button\n type=\"button\"\n mat-icon-button\n [title]=\"'COMMON.BTN_DELETE' | translate\"\n (click)=\"formArray.removeAt(i) && markAsDirty()\"\n >\n <mat-icon>close</mat-icon>\n </button>\n </ion-col>\n </ion-row>\n }\n\n @if (formArray.length === 0 && !showAddToolbar) {\n <button type=\"button\" mat-icon-button [title]=\"'COMMON.BTN_ADD' | translate\" (click)=\"formArray.add()\">\n <mat-icon>add</mat-icon>\n </button>\n }\n </ion-card-content>\n\n @if (showAddToolbar || showResizeToolbar || showSetValue) {\n <ion-toolbar>\n <!-- Set array value -->\n <ion-row *ngIf=\"showSetValue\">\n <ion-col>\n <mat-form-field>\n <mat-label>Set Value</mat-label>\n <input\n #setValueInput\n matInput\n type=\"text\"\n placeholder=\"Comma separated values\"\n (keydown.enter)=\"setFormArrayValue(formArray, setValueInput.value)\"\n />\n </mat-form-field>\n </ion-col>\n <ion-col size=\"auto\">\n <button\n type=\"button\"\n mat-icon-button\n title=\"Set value\"\n (click)=\"setFormArrayValue(formArray, setValueInput.value)\"\n >\n <mat-icon>checkmark</mat-icon>\n </button>\n </ion-col>\n </ion-row>\n\n <!-- Resize the array -->\n <ion-row *ngIf=\"showResizeToolbar\">\n <ion-col>\n <mat-form-field>\n <mat-label>Resize</mat-label>\n <input\n #sizeInput\n matInput\n type=\"number\"\n step=\"1\"\n min=\"0\"\n placeholder=\"New array length\"\n (keydown.enter)=\"formArray.resize(sizeInput.value)\"\n />\n </mat-form-field>\n </ion-col>\n <ion-col size=\"auto\">\n <button type=\"button\" mat-icon-button title=\"Resize\" (click)=\"formArray.resize(sizeInput.value)\">\n <mat-icon>checkmark</mat-icon>\n </button>\n </ion-col>\n </ion-row>\n\n <!-- Add a item with a value -->\n <ion-row *ngIf=\"showAddToolbar\">\n <ion-col>\n <mat-form-field>\n <mat-label>Value to add</mat-label>\n <input #valueInput matInput type=\"text\" (keydown.enter)=\"formArray.add(valueInput.value)\" />\n </mat-form-field>\n </ion-col>\n <ion-col size=\"auto\">\n <button\n type=\"button\"\n mat-icon-button\n [title]=\"'COMMON.BTN_ADD' | translate\"\n (click)=\"formArray.add(valueInput.value)\"\n >\n <mat-icon>add</mat-icon>\n </button>\n </ion-col>\n </ion-row>\n </ion-toolbar>\n }\n </ion-card>\n</ng-template>\n", dependencies: [{ kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: i4.IonButtons, selector: "ion-buttons", inputs: ["collapse"] }, { kind: "component", type: i4.IonCard, selector: "ion-card", inputs: ["button", "color", "disabled", "download", "href", "mode", "rel", "routerAnimation", "routerDirection", "target", "type"] }, { kind: "component", type: i4.IonCardContent, selector: "ion-card-content", inputs: ["mode"] }, { kind: "component", type: i4.IonCardHeader, selector: "ion-card-header", inputs: ["color", "mode", "translucent"] }, { kind: "component", type: i4.IonCardTitle, selector: "ion-card-title", inputs: ["color", "mode"] }, { kind: "component", type: i4.IonCol, selector: "ion-col", inputs: ["offset", "offsetLg", "offsetMd", "offsetSm", "offsetXl", "offsetXs", "pull", "pullLg", "pullMd", "pullSm", "pullXl", "pullXs", "push", "pushLg", "pushMd", "pushSm", "pushXl", "pushXs", "size", "sizeLg", "sizeMd", "sizeSm", "sizeXl", "sizeXs"] }, { kind: "component", type: i4.IonContent, selector: "ion-content", inputs: ["color", "forceOverscroll", "fullscreen", "scrollEvents", "scrollX", "scrollY"] }, { kind: "component", type: i4.IonGrid, selector: "ion-grid", inputs: ["fixed"] }, { kind: "component", type: i4.IonHeader, selector: "ion-header", inputs: ["collapse", "mode", "translucent"] }, { kind: "component", type: i4.IonRow, selector: "ion-row" }, { kind: "component", type: i4.IonTitle, selector: "ion-title", inputs: ["color", "size"] }, { kind: "component", type: i4.IonToolbar, selector: "ion-toolbar", inputs: ["color", "mode"] }, { kind: "component", type: i4.IonBackButton, selector: "ion-back-button" }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "component", type: i5.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i5.MatLabel, selector: "mat-label" }, { kind: "directive", type: i6.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "component", type: i7.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i8.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "pipe", type: i9.TranslatePipe, name: "translate" }, { kind: "pipe", type: i10.FormGetControlPipe, name: "formGetControl" }, { kind: "pipe", type: i10.FormGetArrayPipe, name: "formGetArray" }] });
91
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: ArrayFormTestPage, selector: "app-array-test", usesInheritance: true, ngImport: i0, template: "<ion-header>\n <ion-toolbar color=\"primary\">\n <ion-buttons slot=\"start\">\n <ion-back-button></ion-back-button>\n </ion-buttons>\n\n <ion-title>Form Array test page</ion-title>\n </ion-toolbar>\n</ion-header>\n\n<ion-content>\n <form class=\"form-container ion-padding\" [formGroup]=\"form\">\n <ion-grid>\n <ion-row>\n <!-- Default -->\n <ion-col size=\"6\">\n <ng-container\n *ngTemplateOutlet=\"\n arrayCard;\n context: { $implicit: defaultFormArray, title: 'Default behavior', showSetValue: true }\n \"\n ></ng-container>\n </ion-col>\n\n <!-- Not empty array -->\n <ion-col size=\"6\">\n <ng-container\n *ngTemplateOutlet=\"\n arrayCard;\n context: { $implicit: notEmptyFormArray, title: 'Not empty array', showSetValue: true }\n \"\n ></ng-container>\n </ion-col>\n\n <!-- Allow null values -->\n <ion-col size=\"6\">\n <ng-container\n *ngTemplateOutlet=\"\n arrayCard;\n context: {\n $implicit: nullValuesFormArray,\n title: 'Allow many null values',\n showAddToolbar: true,\n showResizeToolbar: true,\n showSetValue: true\n }\n \"\n ></ng-container>\n </ion-col>\n\n <!-- Allow duplicated value -->\n <ion-col size=\"6\">\n <ng-container\n *ngTemplateOutlet=\"\n arrayCard;\n context: {\n $implicit: duplicatedValuesFormArray,\n title: 'Allow duplicated values',\n showAddToolbar: true,\n showResizeToolbar: true,\n showSetValue: true\n }\n \"\n ></ng-container>\n </ion-col>\n </ion-row>\n </ion-grid>\n </form>\n</ion-content>\n\n<ng-template\n #arrayCard\n let-formArray\n let-title=\"title\"\n let-showAddToolbar=\"showAddToolbar\"\n let-showResizeToolbar=\"showResizeToolbar\"\n let-showSetValue=\"showSetValue\"\n>\n <ion-card>\n <ion-card-header>\n <ion-card-title>{{ title }}</ion-card-title>\n </ion-card-header>\n <ion-card-content>\n @for (\n control of (formArray | formGetArray).controls;\n track i;\n let i = $index;\n let first = $first;\n let last = $last\n ) {\n <ion-row>\n <ion-col>\n <mat-form-field>\n <mat-label>Value #{{ i + 1 }}</mat-label>\n <input matInput [formControl]=\"control | formGetControl\" />\n </mat-form-field>\n </ion-col>\n <ion-col size=\"auto\">\n @if (last && !showAddToolbar) {\n <button\n type=\"button\"\n mat-icon-button\n [title]=\"!showTooltip ? ('COMMON.BTN_ADD' | translate) : ''\"\n [matTooltip]=\"showTooltip ? ('COMMON.BTN_ADD' | translate) : ''\"\n (click)=\"formArray.add()\"\n >\n <mat-icon>add</mat-icon>\n </button>\n }\n <button\n type=\"button\"\n mat-icon-button\n [title]=\"!showTooltip ? ('COMMON.BTN_DELETE' | translate) : ''\"\n [matTooltip]=\"showTooltip ? ('COMMON.BTN_DELETE' | translate) : ''\"\n (click)=\"formArray.removeAt(i) && markAsDirty()\"\n >\n <mat-icon>close</mat-icon>\n </button>\n </ion-col>\n </ion-row>\n }\n\n @if (formArray.length === 0 && !showAddToolbar) {\n <button\n type=\"button\"\n mat-icon-button\n [title]=\"!showTooltip ? ('COMMON.BTN_ADD' | translate) : ''\"\n [matTooltip]=\"showTooltip ? ('COMMON.BTN_ADD' | translate) : ''\"\n (click)=\"formArray.add()\"\n >\n <mat-icon>add</mat-icon>\n </button>\n }\n </ion-card-content>\n\n @if (showAddToolbar || showResizeToolbar || showSetValue) {\n <ion-toolbar>\n <!-- Set array value -->\n <ion-row *ngIf=\"showSetValue\">\n <ion-col>\n <mat-form-field>\n <mat-label>Set Value</mat-label>\n <input\n #setValueInput\n matInput\n type=\"text\"\n placeholder=\"Comma separated values\"\n (keydown.enter)=\"setFormArrayValue(formArray, setValueInput.value)\"\n />\n </mat-form-field>\n </ion-col>\n <ion-col size=\"auto\">\n <button\n type=\"button\"\n mat-icon-button\n title=\"Set value\"\n (click)=\"setFormArrayValue(formArray, setValueInput.value)\"\n >\n <mat-icon>checkmark</mat-icon>\n </button>\n </ion-col>\n </ion-row>\n\n <!-- Resize the array -->\n <ion-row *ngIf=\"showResizeToolbar\">\n <ion-col>\n <mat-form-field>\n <mat-label>Resize</mat-label>\n <input\n #sizeInput\n matInput\n type=\"number\"\n step=\"1\"\n min=\"0\"\n placeholder=\"New array length\"\n (keydown.enter)=\"formArray.resize(sizeInput.value)\"\n />\n </mat-form-field>\n </ion-col>\n <ion-col size=\"auto\">\n <button type=\"button\" mat-icon-button title=\"Resize\" (click)=\"formArray.resize(sizeInput.value)\">\n <mat-icon>checkmark</mat-icon>\n </button>\n </ion-col>\n </ion-row>\n\n <!-- Add a item with a value -->\n <ion-row *ngIf=\"showAddToolbar\">\n <ion-col>\n <mat-form-field>\n <mat-label>Value to add</mat-label>\n <input #valueInput matInput type=\"text\" (keydown.enter)=\"formArray.add(valueInput.value)\" />\n </mat-form-field>\n </ion-col>\n <ion-col size=\"auto\">\n <button\n type=\"button\"\n mat-icon-button\n [title]=\"!showTooltip ? ('COMMON.BTN_ADD' | translate) : ''\"\n [matTooltip]=\"showTooltip ? ('COMMON.BTN_ADD' | translate) : ''\"\n (click)=\"formArray.add(valueInput.value)\"\n >\n <mat-icon>add</mat-icon>\n </button>\n </ion-col>\n </ion-row>\n </ion-toolbar>\n }\n </ion-card>\n</ng-template>\n", dependencies: [{ kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: i4.IonButtons, selector: "ion-buttons", inputs: ["collapse"] }, { kind: "component", type: i4.IonCard, selector: "ion-card", inputs: ["button", "color", "disabled", "download", "href", "mode", "rel", "routerAnimation", "routerDirection", "target", "type"] }, { kind: "component", type: i4.IonCardContent, selector: "ion-card-content", inputs: ["mode"] }, { kind: "component", type: i4.IonCardHeader, selector: "ion-card-header", inputs: ["color", "mode", "translucent"] }, { kind: "component", type: i4.IonCardTitle, selector: "ion-card-title", inputs: ["color", "mode"] }, { kind: "component", type: i4.IonCol, selector: "ion-col", inputs: ["offset", "offsetLg", "offsetMd", "offsetSm", "offsetXl", "offsetXs", "pull", "pullLg", "pullMd", "pullSm", "pullXl", "pullXs", "push", "pushLg", "pushMd", "pushSm", "pushXl", "pushXs", "size", "sizeLg", "sizeMd", "sizeSm", "sizeXl", "sizeXs"] }, { kind: "component", type: i4.IonContent, selector: "ion-content", inputs: ["color", "forceOverscroll", "fullscreen", "scrollEvents", "scrollX", "scrollY"] }, { kind: "component", type: i4.IonGrid, selector: "ion-grid", inputs: ["fixed"] }, { kind: "component", type: i4.IonHeader, selector: "ion-header", inputs: ["collapse", "mode", "translucent"] }, { kind: "component", type: i4.IonRow, selector: "ion-row" }, { kind: "component", type: i4.IonTitle, selector: "ion-title", inputs: ["color", "size"] }, { kind: "component", type: i4.IonToolbar, selector: "ion-toolbar", inputs: ["color", "mode"] }, { kind: "component", type: i4.IonBackButton, selector: "ion-back-button" }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "component", type: i5.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i5.MatLabel, selector: "mat-label" }, { kind: "directive", type: i6.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "component", type: i7.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i8.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "directive", type: i9.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "pipe", type: i10.TranslatePipe, name: "translate" }, { kind: "pipe", type: i11.FormGetControlPipe, name: "formGetControl" }, { kind: "pipe", type: i11.FormGetArrayPipe, name: "formGetArray" }] });
89
92
  }
90
93
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ArrayFormTestPage, decorators: [{
91
94
  type: Component,
92
- args: [{ selector: 'app-array-test', template: "<ion-header>\n <ion-toolbar color=\"primary\">\n <ion-buttons slot=\"start\">\n <ion-back-button></ion-back-button>\n </ion-buttons>\n\n <ion-title>Form Array test page</ion-title>\n </ion-toolbar>\n</ion-header>\n\n<ion-content>\n <form class=\"form-container ion-padding\" [formGroup]=\"form\">\n <ion-grid>\n <ion-row>\n <!-- Default -->\n <ion-col size=\"6\">\n <ng-container\n *ngTemplateOutlet=\"\n arrayCard;\n context: { $implicit: defaultFormArray, title: 'Default behavior', showSetValue: true }\n \"\n ></ng-container>\n </ion-col>\n\n <!-- Not empty array -->\n <ion-col size=\"6\">\n <ng-container\n *ngTemplateOutlet=\"\n arrayCard;\n context: { $implicit: notEmptyFormArray, title: 'Not empty array', showSetValue: true }\n \"\n ></ng-container>\n </ion-col>\n\n <!-- Allow null values -->\n <ion-col size=\"6\">\n <ng-container\n *ngTemplateOutlet=\"\n arrayCard;\n context: {\n $implicit: nullValuesFormArray,\n title: 'Allow many null values',\n showAddToolbar: true,\n showResizeToolbar: true,\n showSetValue: true\n }\n \"\n ></ng-container>\n </ion-col>\n\n <!-- Allow duplicated value -->\n <ion-col size=\"6\">\n <ng-container\n *ngTemplateOutlet=\"\n arrayCard;\n context: {\n $implicit: duplicatedValuesFormArray,\n title: 'Allow duplicated values',\n showAddToolbar: true,\n showResizeToolbar: true,\n showSetValue: true\n }\n \"\n ></ng-container>\n </ion-col>\n </ion-row>\n </ion-grid>\n </form>\n</ion-content>\n\n<ng-template\n #arrayCard\n let-formArray\n let-title=\"title\"\n let-showAddToolbar=\"showAddToolbar\"\n let-showResizeToolbar=\"showResizeToolbar\"\n let-showSetValue=\"showSetValue\"\n>\n <ion-card>\n <ion-card-header>\n <ion-card-title>{{ title }}</ion-card-title>\n </ion-card-header>\n <ion-card-content>\n @for (\n control of (formArray | formGetArray).controls;\n track i;\n let i = $index;\n let first = $first;\n let last = $last\n ) {\n <ion-row>\n <ion-col>\n <mat-form-field>\n <mat-label>Value #{{ i + 1 }}</mat-label>\n <input matInput [formControl]=\"control | formGetControl\" />\n </mat-form-field>\n </ion-col>\n <ion-col size=\"auto\">\n @if (last && !showAddToolbar) {\n <button type=\"button\" mat-icon-button [title]=\"'COMMON.BTN_ADD' | translate\" (click)=\"formArray.add()\">\n <mat-icon>add</mat-icon>\n </button>\n }\n <button\n type=\"button\"\n mat-icon-button\n [title]=\"'COMMON.BTN_DELETE' | translate\"\n (click)=\"formArray.removeAt(i) && markAsDirty()\"\n >\n <mat-icon>close</mat-icon>\n </button>\n </ion-col>\n </ion-row>\n }\n\n @if (formArray.length === 0 && !showAddToolbar) {\n <button type=\"button\" mat-icon-button [title]=\"'COMMON.BTN_ADD' | translate\" (click)=\"formArray.add()\">\n <mat-icon>add</mat-icon>\n </button>\n }\n </ion-card-content>\n\n @if (showAddToolbar || showResizeToolbar || showSetValue) {\n <ion-toolbar>\n <!-- Set array value -->\n <ion-row *ngIf=\"showSetValue\">\n <ion-col>\n <mat-form-field>\n <mat-label>Set Value</mat-label>\n <input\n #setValueInput\n matInput\n type=\"text\"\n placeholder=\"Comma separated values\"\n (keydown.enter)=\"setFormArrayValue(formArray, setValueInput.value)\"\n />\n </mat-form-field>\n </ion-col>\n <ion-col size=\"auto\">\n <button\n type=\"button\"\n mat-icon-button\n title=\"Set value\"\n (click)=\"setFormArrayValue(formArray, setValueInput.value)\"\n >\n <mat-icon>checkmark</mat-icon>\n </button>\n </ion-col>\n </ion-row>\n\n <!-- Resize the array -->\n <ion-row *ngIf=\"showResizeToolbar\">\n <ion-col>\n <mat-form-field>\n <mat-label>Resize</mat-label>\n <input\n #sizeInput\n matInput\n type=\"number\"\n step=\"1\"\n min=\"0\"\n placeholder=\"New array length\"\n (keydown.enter)=\"formArray.resize(sizeInput.value)\"\n />\n </mat-form-field>\n </ion-col>\n <ion-col size=\"auto\">\n <button type=\"button\" mat-icon-button title=\"Resize\" (click)=\"formArray.resize(sizeInput.value)\">\n <mat-icon>checkmark</mat-icon>\n </button>\n </ion-col>\n </ion-row>\n\n <!-- Add a item with a value -->\n <ion-row *ngIf=\"showAddToolbar\">\n <ion-col>\n <mat-form-field>\n <mat-label>Value to add</mat-label>\n <input #valueInput matInput type=\"text\" (keydown.enter)=\"formArray.add(valueInput.value)\" />\n </mat-form-field>\n </ion-col>\n <ion-col size=\"auto\">\n <button\n type=\"button\"\n mat-icon-button\n [title]=\"'COMMON.BTN_ADD' | translate\"\n (click)=\"formArray.add(valueInput.value)\"\n >\n <mat-icon>add</mat-icon>\n </button>\n </ion-col>\n </ion-row>\n </ion-toolbar>\n }\n </ion-card>\n</ng-template>\n" }]
95
+ args: [{ selector: 'app-array-test', template: "<ion-header>\n <ion-toolbar color=\"primary\">\n <ion-buttons slot=\"start\">\n <ion-back-button></ion-back-button>\n </ion-buttons>\n\n <ion-title>Form Array test page</ion-title>\n </ion-toolbar>\n</ion-header>\n\n<ion-content>\n <form class=\"form-container ion-padding\" [formGroup]=\"form\">\n <ion-grid>\n <ion-row>\n <!-- Default -->\n <ion-col size=\"6\">\n <ng-container\n *ngTemplateOutlet=\"\n arrayCard;\n context: { $implicit: defaultFormArray, title: 'Default behavior', showSetValue: true }\n \"\n ></ng-container>\n </ion-col>\n\n <!-- Not empty array -->\n <ion-col size=\"6\">\n <ng-container\n *ngTemplateOutlet=\"\n arrayCard;\n context: { $implicit: notEmptyFormArray, title: 'Not empty array', showSetValue: true }\n \"\n ></ng-container>\n </ion-col>\n\n <!-- Allow null values -->\n <ion-col size=\"6\">\n <ng-container\n *ngTemplateOutlet=\"\n arrayCard;\n context: {\n $implicit: nullValuesFormArray,\n title: 'Allow many null values',\n showAddToolbar: true,\n showResizeToolbar: true,\n showSetValue: true\n }\n \"\n ></ng-container>\n </ion-col>\n\n <!-- Allow duplicated value -->\n <ion-col size=\"6\">\n <ng-container\n *ngTemplateOutlet=\"\n arrayCard;\n context: {\n $implicit: duplicatedValuesFormArray,\n title: 'Allow duplicated values',\n showAddToolbar: true,\n showResizeToolbar: true,\n showSetValue: true\n }\n \"\n ></ng-container>\n </ion-col>\n </ion-row>\n </ion-grid>\n </form>\n</ion-content>\n\n<ng-template\n #arrayCard\n let-formArray\n let-title=\"title\"\n let-showAddToolbar=\"showAddToolbar\"\n let-showResizeToolbar=\"showResizeToolbar\"\n let-showSetValue=\"showSetValue\"\n>\n <ion-card>\n <ion-card-header>\n <ion-card-title>{{ title }}</ion-card-title>\n </ion-card-header>\n <ion-card-content>\n @for (\n control of (formArray | formGetArray).controls;\n track i;\n let i = $index;\n let first = $first;\n let last = $last\n ) {\n <ion-row>\n <ion-col>\n <mat-form-field>\n <mat-label>Value #{{ i + 1 }}</mat-label>\n <input matInput [formControl]=\"control | formGetControl\" />\n </mat-form-field>\n </ion-col>\n <ion-col size=\"auto\">\n @if (last && !showAddToolbar) {\n <button\n type=\"button\"\n mat-icon-button\n [title]=\"!showTooltip ? ('COMMON.BTN_ADD' | translate) : ''\"\n [matTooltip]=\"showTooltip ? ('COMMON.BTN_ADD' | translate) : ''\"\n (click)=\"formArray.add()\"\n >\n <mat-icon>add</mat-icon>\n </button>\n }\n <button\n type=\"button\"\n mat-icon-button\n [title]=\"!showTooltip ? ('COMMON.BTN_DELETE' | translate) : ''\"\n [matTooltip]=\"showTooltip ? ('COMMON.BTN_DELETE' | translate) : ''\"\n (click)=\"formArray.removeAt(i) && markAsDirty()\"\n >\n <mat-icon>close</mat-icon>\n </button>\n </ion-col>\n </ion-row>\n }\n\n @if (formArray.length === 0 && !showAddToolbar) {\n <button\n type=\"button\"\n mat-icon-button\n [title]=\"!showTooltip ? ('COMMON.BTN_ADD' | translate) : ''\"\n [matTooltip]=\"showTooltip ? ('COMMON.BTN_ADD' | translate) : ''\"\n (click)=\"formArray.add()\"\n >\n <mat-icon>add</mat-icon>\n </button>\n }\n </ion-card-content>\n\n @if (showAddToolbar || showResizeToolbar || showSetValue) {\n <ion-toolbar>\n <!-- Set array value -->\n <ion-row *ngIf=\"showSetValue\">\n <ion-col>\n <mat-form-field>\n <mat-label>Set Value</mat-label>\n <input\n #setValueInput\n matInput\n type=\"text\"\n placeholder=\"Comma separated values\"\n (keydown.enter)=\"setFormArrayValue(formArray, setValueInput.value)\"\n />\n </mat-form-field>\n </ion-col>\n <ion-col size=\"auto\">\n <button\n type=\"button\"\n mat-icon-button\n title=\"Set value\"\n (click)=\"setFormArrayValue(formArray, setValueInput.value)\"\n >\n <mat-icon>checkmark</mat-icon>\n </button>\n </ion-col>\n </ion-row>\n\n <!-- Resize the array -->\n <ion-row *ngIf=\"showResizeToolbar\">\n <ion-col>\n <mat-form-field>\n <mat-label>Resize</mat-label>\n <input\n #sizeInput\n matInput\n type=\"number\"\n step=\"1\"\n min=\"0\"\n placeholder=\"New array length\"\n (keydown.enter)=\"formArray.resize(sizeInput.value)\"\n />\n </mat-form-field>\n </ion-col>\n <ion-col size=\"auto\">\n <button type=\"button\" mat-icon-button title=\"Resize\" (click)=\"formArray.resize(sizeInput.value)\">\n <mat-icon>checkmark</mat-icon>\n </button>\n </ion-col>\n </ion-row>\n\n <!-- Add a item with a value -->\n <ion-row *ngIf=\"showAddToolbar\">\n <ion-col>\n <mat-form-field>\n <mat-label>Value to add</mat-label>\n <input #valueInput matInput type=\"text\" (keydown.enter)=\"formArray.add(valueInput.value)\" />\n </mat-form-field>\n </ion-col>\n <ion-col size=\"auto\">\n <button\n type=\"button\"\n mat-icon-button\n [title]=\"!showTooltip ? ('COMMON.BTN_ADD' | translate) : ''\"\n [matTooltip]=\"showTooltip ? ('COMMON.BTN_ADD' | translate) : ''\"\n (click)=\"formArray.add(valueInput.value)\"\n >\n <mat-icon>add</mat-icon>\n </button>\n </ion-col>\n </ion-row>\n </ion-toolbar>\n }\n </ion-card>\n</ng-template>\n" }]
93
96
  }], ctorParameters: () => [{ type: i1.UntypedFormBuilder }, { type: i2.PlatformService }, { type: i0.Injector }, { type: i0.ChangeDetectorRef }] });
94
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS1hcnJheS50ZXN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9jb3JlL2Zvcm0vYXJyYXkvdGVzdGluZy9mb3JtLWFycmF5LnRlc3QudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBwL2NvcmUvZm9ybS9hcnJheS90ZXN0aW5nL2Zvcm0tYXJyYXkudGVzdC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBcUIsU0FBUyxFQUErQixNQUFNLGVBQWUsQ0FBQztBQUkxRixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3BDLE9BQU8sRUFBRSxZQUFZLEVBQUUsZUFBZSxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDN0UsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQzNDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxlQUFlLENBQUM7Ozs7Ozs7Ozs7OztBQU03QyxNQUFNLE9BQU8saUJBQWtCLFNBQVEsT0FBWTtJQXdCckM7SUFDQTtJQUNBO0lBQ0E7SUExQkosWUFBWSxHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7SUFFMUMsSUFBSSxnQkFBZ0I7UUFDbEIsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQTJCLENBQUM7SUFDNUQsQ0FBQztJQUVELElBQUksaUJBQWlCO1FBQ25CLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUEyQixDQUFDO0lBQzdELENBQUM7SUFFRCxJQUFJLG1CQUFtQjtRQUNyQixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBMkIsQ0FBQztJQUMvRCxDQUFDO0lBRUQsSUFBSSx5QkFBeUI7UUFDM0IsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxrQkFBa0IsQ0FBMkIsQ0FB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QUFDO1lBQ2xELGlCQUFpQjtZQUNqQixVQUFVLEVBQUUsSUFBSTtTQUNqQixDQUFDLENBQUM7SUFDTCxDQUFDO0lBRVMsaUJBQWlCLENBQUMsU0FBaUMsRUFBRSxNQUF5QjtRQUN0RixNQUFNLFdBQVcsR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLGVBQWUsQ0FBQyxDQUFDO1FBQzdGLFNBQVMsQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDbEMsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQ3JCLENBQUM7SUFFRCw2QkFBNkI7SUFFbkIsWUFBWTtRQUNwQixJQUFJLENBQUMsRUFBRSxDQUFDLFlBQVksRUFBRSxDQUFDO0lBQ3pCLENBQUM7d0dBeEdVLGlCQUFpQjs0RkFBakIsaUJBQWlCLDZFQ2I5QixraU1Bb01BOzs0RkR2TGEsaUJBQWlCO2tCQUo3QixTQUFTOytCQUNFLGdCQUFnQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENoYW5nZURldGVjdG9yUmVmLCBDb21wb25lbnQsIEluamVjdG9yLCBPbkRlc3Ryb3ksIE9uSW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgVW50eXBlZEZvcm1CdWlsZGVyLCBVbnR5cGVkRm9ybUNvbnRyb2wgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5cbmltcG9ydCB7IFBsYXRmb3JtU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL3BsYXRmb3JtLnNlcnZpY2UnO1xuaW1wb3J0IHsgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBpc05pbE9yQmxhbmssIHRyaW1FbXB0eVRvTnVsbCB9IGZyb20gJy4uLy4uLy4uLy4uL3NoYXJlZC9mdW5jdGlvbnMnO1xuaW1wb3J0IHsgQXBwRm9ybSB9IGZyb20gJy4uLy4uL2Zvcm0uY2xhc3MnO1xuaW1wb3J0IHsgQXBwRm9ybUFycmF5IH0gZnJvbSAnLi4vZm9ybS1hcnJheSc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2FwcC1hcnJheS10ZXN0JyxcbiAgdGVtcGxhdGVVcmw6ICcuL2Zvcm0tYXJyYXkudGVzdC5odG1sJyxcbn0pXG5leHBvcnQgY2xhc3MgQXJyYXlGb3JtVGVzdFBhZ2UgZXh0ZW5kcyBBcHBGb3JtPGFueT4gaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XG4gIHByaXZhdGUgc3Vic2NyaXB0aW9uID0gbmV3IFN1YnNjcmlwdGlvbigpO1xuXG4gIGdldCBkZWZhdWx0Rm9ybUFycmF5KCk6IEFwcEZvcm1BcnJheTxhbnksIGFueT4ge1xuICAgIHJldHVybiB0aGlzLmZvcm0uZ2V0KCdkZWZhdWx0JykgYXMgQXBwRm9ybUFycmF5PGFueSwgYW55PjtcbiAgfVxuXG4gIGdldCBub3RFbXB0eUZvcm1BcnJheSgpOiBBcHBGb3JtQXJyYXk8YW55LCBhbnk+IHtcbiAgICByZXR1cm4gdGhpcy5mb3JtLmdldCgnbm90RW1wdHknKSBhcyBBcHBGb3JtQXJyYXk8YW55LCBhbnk+O1xuICB9XG5cbiAgZ2V0IG51bGxWYWx1ZXNGb3JtQXJyYXkoKTogQXBwRm9ybUFycmF5PGFueSwgYW55PiB7XG4gICAgcmV0dXJuIHRoaXMuZm9ybS5nZXQoJ251bGxWYWx1ZXMnKSBhcyBBcHBGb3JtQXJyYXk8YW55LCBhbnk+O1xuICB9XG5cbiAgZ2V0IGR1cGxpY2F0ZWRWYWx1ZXNGb3JtQXJyYXkoKTogQXBwRm9ybUFycmF5PGFueSwgYW55PiB7XG4gICAgcmV0dXJuIHRoaXMuZm9ybS5nZXQoJ2R1cGxpY2F0ZWRWYWx1ZXMnKSBhcyBBcHBGb3JtQXJyYXk8YW55LCBhbnk+O1xuICB9XG5cbiAgZ2V0IHZhbHVlVG9BZGRDb250cm9sKCk6IFVudHlwZWRGb3JtQ29udHJvbCB7XG4gICAgcmV0dXJuIHRoaXMuZm9ybT8uZ2V0KCd2YWx1ZVRvQWRkJykgYXMgVW50eXBlZEZvcm1Db250cm9sO1xuICB9XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJvdGVjdGVkIGZvcm1CdWlsZGVyOiBVbnR5cGVkRm9ybUJ1aWxkZXIsXG4gICAgcHJvdGVjdGVkIHBsYXRmb3JtOiBQbGF0Zm9ybVNlcnZpY2UsXG4gICAgcHJvdGVjdGVkIGluamVjdGlvbjogSW5qZWN0b3IsXG4gICAgcHJvdGVjdGVkIGNkOiBDaGFuZ2VEZXRlY3RvclJlZlxuICApIHtcbiAgICBzdXBlcihcbiAgICAgIGluamVjdGlvbixcbiAgICAgIGZvcm1CdWlsZGVyLmdyb3VwKHtcbiAgICAgICAgZGVmYXVsdDogbmV3IEFwcEZvcm1BcnJheShcbiAgICAgICAgICAodmFsdWUpID0+IHRoaXMuZm9ybUJ1aWxkZXIuY29udHJvbCh2YWx1ZSksXG4gICAgICAgICAgKHYxLCB2MikgPT4gdjEgPT09IHYyLFxuICAgICAgICAgICh2YWx1ZSkgPT4gaXNOaWxPckJsYW5rKHZhbHVlKVxuICAgICAgICApLFxuXG4gICAgICAgIG5vdEVtcHR5OiBuZXcgQXBwRm9ybUFycmF5KFxuICAgICAgICAgICh2YWx1ZSkgPT4gdGhpcy5mb3JtQnVpbGRlci5jb250cm9sKHZhbHVlKSxcbiAgICAgICAgICAodjEsIHYyKSA9PiB2MSA9PT0gdjIsXG4gICAgICAgICAgKHZhbHVlKSA9PiBpc05pbE9yQmxhbmsodmFsdWUpLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGFsbG93RW1wdHlBcnJheTogZmFsc2UsXG4gICAgICAgICAgfVxuICAgICAgICApLFxuXG4gICAgICAgIG51bGxWYWx1ZXM6IG5ldyBBcHBGb3JtQXJyYXkoXG4gICAgICAgICAgKHZhbHVlKSA9PiB0aGlzLmZvcm1CdWlsZGVyLmNvbnRyb2wodmFsdWUpLFxuICAgICAgICAgICh2MSwgdjIpID0+IHYxID09PSB2MixcbiAgICAgICAgICAodmFsdWUpID0+IGlzTmlsT3JCbGFuayh2YWx1ZSksXG4gICAgICAgICAge1xuICAgICAgICAgICAgYWxsb3dFbXB0eUFycmF5OiBmYWxzZSxcbiAgICAgICAgICAgIGFsbG93TWFueU51bGxWYWx1ZXM6IHRydWUsXG4gICAgICAgICAgfVxuICAgICAgICApLFxuXG4gICAgICAgIGR1cGxpY2F0ZWRWYWx1ZXM6IG5ldyBBcHBGb3JtQXJyYXkoXG4gICAgICAgICAgKHZhbHVlKSA9PiB0aGlzLmZvcm1CdWlsZGVyLmNvbnRyb2wodmFsdWUpLFxuICAgICAgICAgICh2MSwgdjIpID0+IHYxID09PSB2MixcbiAgICAgICAgICAodmFsdWUpID0+IGlzTmlsT3JCbGFuayh2YWx1ZSksXG4gICAgICAgICAge1xuICAgICAgICAgICAgYWxsb3dFbXB0eUFycmF5OiBmYWxzZSxcbiAgICAgICAgICAgIGFsbG93TWFueU51bGxWYWx1ZXM6IHRydWUsXG4gICAgICAgICAgICBhbGxvd0R1cGxpY2F0ZVZhbHVlOiB0cnVlLFxuICAgICAgICAgIH1cbiAgICAgICAgKSxcblxuICAgICAgICAvLyBWYWx1ZSB0byBhZGRcbiAgICAgICAgdmFsdWVUb0FkZDogZm9ybUJ1aWxkZXIuY29udHJvbChudWxsLCBbXSksXG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBuZ09uSW5pdCgpIHtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMubG9hZERhdGEoKSwgMjUwKTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCkge1xuICAgIHRoaXMuc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gIH1cblxuICAvLyBMb2FkIHRoZSBmb3JtIHdpdGggZGF0YVxuICBhc3luYyBsb2FkRGF0YSgpIHtcbiAgICB0aGlzLnNldFZhbHVlKHtcbiAgICAgIGRlZmF1bHQ6IFsnVEVTVElOR18xJywgJ1RFU1RJTkdfMiddLFxuICAgICAgbm90RW1wdHk6IFsnVEVTVElOR18xJywgJ1RFU1RJTkdfMiddLFxuICAgICAgbnVsbFZhbHVlczogWydURVNUSU5HXzEnLCBudWxsLCAnVEVTVElOR180J10sXG4gICAgICBkdXBsaWNhdGVkVmFsdWVzOiBbJ1RFU1RJTkdfMScsIG51bGwsICdURVNUSU5HXzEnXSxcbiAgICAgIC8vIEFkZCB3aXRoIHZhbHVlXG4gICAgICB2YWx1ZVRvQWRkOiBudWxsLFxuICAgIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIHNldEZvcm1BcnJheVZhbHVlKGZvcm1BcnJheTogQXBwRm9ybUFycmF5PGFueSwgYW55PiwgdmFsdWVzOiBzdHJpbmcgfCBzdHJpbmdbXSkge1xuICAgIGNvbnN0IGFycmF5VmFsdWVzID0gQXJyYXkuaXNBcnJheSh2YWx1ZXMpID8gdmFsdWVzIDogdmFsdWVzPy5zcGxpdCgnLCcpLm1hcCh0cmltRW1wdHlUb051bGwpO1xuICAgIGZvcm1BcnJheS5wYXRjaFZhbHVlKGFycmF5VmFsdWVzKTtcbiAgICB0aGlzLm1hcmtBc0RpcnR5KCk7XG4gIH1cblxuICAvKiAtLSBwcm90ZWN0ZWQgbWV0aG9kcyAtLSAqL1xuXG4gIHByb3RlY3RlZCBtYXJrRm9yQ2hlY2soKSB7XG4gICAgdGhpcy5jZC5tYXJrRm9yQ2hlY2soKTtcbiAgfVxufVxuIiwiPGlvbi1oZWFkZXI+XG4gIDxpb24tdG9vbGJhciBjb2xvcj1cInByaW1hcnlcIj5cbiAgICA8aW9uLWJ1dHRvbnMgc2xvdD1cInN0YXJ0XCI+XG4gICAgICA8aW9uLWJhY2stYnV0dG9uPjwvaW9uLWJhY2stYnV0dG9uPlxuICAgIDwvaW9uLWJ1dHRvbnM+XG5cbiAgICA8aW9uLXRpdGxlPkZvcm0gQXJyYXkgdGVzdCBwYWdlPC9pb24tdGl0bGU+XG4gIDwvaW9uLXRvb2xiYXI+XG48L2lvbi1oZWFkZXI+XG5cbjxpb24tY29udGVudD5cbiAgPGZvcm0gY2xhc3M9XCJmb3JtLWNvbnRhaW5lciBpb24tcGFkZGluZ1wiIFtmb3JtR3JvdXBdPVwiZm9ybVwiPlxuICAgIDxpb24tZ3JpZD5cbiAgICAgIDxpb24tcm93PlxuICAgICAgICA8IS0tIERlZmF1bHQgLS0+XG4gICAgICAgIDxpb24tY29sIHNpemU9XCI2XCI+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgKm5nVGVtcGxhdGVPdXRsZXQ9XCJcbiAgICAgICAgICAgICAgYXJyYXlDYXJkO1xuICAgICAgICAgICAgICBjb250ZXh0OiB7ICRpbXBsaWNpdDogZGVmYXVsdEZvcm1BcnJheSwgdGl0bGU6ICdEZWZhdWx0IGJlaGF2aW9yJywgc2hvd1NldFZhbHVlOiB0cnVlIH1cbiAgICAgICAgICAgIFwiXG4gICAgICAgICAgPjwvbmctY29udGFpbmVyPlxuICAgICAgICA8L2lvbi1jb2w+XG5cbiAgICAgICAgPCEtLSBOb3QgZW1wdHkgYXJyYXkgLS0+XG4gICAgICAgIDxpb24tY29sIHNpemU9XCI2XCI+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgKm5nVGVtcGxhdGVPdXRsZXQ9XCJcbiAgICAgICAgICAgICAgYXJyYXlDYXJkO1xuICAgICAgICAgICAgICBjb250ZXh0OiB7ICRpbXBsaWNpdDogbm90RW1wdHlGb3JtQXJyYXksIHRpdGxlOiAnTm90IGVtcHR5IGFycmF5Jywgc2hvd1NldFZhbHVlOiB0cnVlIH1cbiAgICAgICAgICAgIFwiXG4gICAgICAgICAgPjwvbmctY29udGFpbmVyPlxuICAgICAgICA8L2lvbi1jb2w+XG5cbiAgICAgICAgPCEtLSBBbGxvdyBudWxsIHZhbHVlcyAtLT5cbiAgICAgICAgPGlvbi1jb2wgc2l6ZT1cIjZcIj5cbiAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAqbmdUZW1wbGF0ZU91dGxldD1cIlxuICAgICAgICAgICAgICBhcnJheUNhcmQ7XG4gICAgICAgICAgICAgIGNvbnRleHQ6IHtcbiAgICAgICAgICAgICAgICAkaW1wbGljaXQ6IG51bGxWYWx1ZXNGb3JtQXJyYXksXG4gICAgICAgICAgICAgICAgdGl0bGU6ICdBbGxvdyBtYW55IG51bGwgdmFsdWVzJyxcbiAgICAgICAgICAgICAgICBzaG93QWRkVG9vbGJhcjogdHJ1ZSxcbiAgICAgICAgICAgICAgICBzaG93UmVzaXplVG9vbGJhcjogdHJ1ZSxcbiAgICAgICAgICAgICAgICBzaG93U2V0VmFsdWU6IHRydWVcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXCJcbiAgICAgICAgICA+PC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvaW9uLWNvbD5cblxuICAgICAgICA8IS0tIEFsbG93IGR1cGxpY2F0ZWQgdmFsdWUgLS0+XG4gICAgICAgIDxpb24tY29sIHNpemU9XCI2XCI+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgKm5nVGVtcGxhdGVPdXRsZXQ9XCJcbiAgICAgICAgICAgICAgYXJyYXlDYXJkO1xuICAgICAgICAgICAgICBjb250ZXh0OiB7XG4gICAgICAgICAgICAgICAgJGltcGxpY2l0OiBkdXBsaWNhdGVkVmFsdWVzRm9ybUFycmF5LFxuICAgICAgICAgICAgICAgIHRpdGxlOiAnQWxsb3cgZHVwbGljYXRlZCB2YWx1ZXMnLFxuICAgICAgICAgICAgICAgIHNob3dBZGRUb29sYmFyOiB0cnVlLFxuICAgICAgICAgICAgICAgIHNob3dSZXNpemVUb29sYmFyOiB0cnVlLFxuICAgICAgICAgICAgICAgIHNob3dTZXRWYWx1ZTogdHJ1ZVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBcIlxuICAgICAgICAgID48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9pb24tY29sPlxuICAgICAgPC9pb24tcm93PlxuICAgIDwvaW9uLWdyaWQ+XG4gIDwvZm9ybT5cbjwvaW9uLWNvbnRlbnQ+XG5cbjxuZy10ZW1wbGF0ZVxuICAjYXJyYXlDYXJkXG4gIGxldC1mb3JtQXJyYXlcbiAgbGV0LXRpdGxlPVwidGl0bGVcIlxuICBsZXQtc2hvd0FkZFRvb2xiYXI9XCJzaG93QWRkVG9vbGJhclwiXG4gIGxldC1zaG93UmVzaXplVG9vbGJhcj1cInNob3dSZXNpemVUb29sYmFyXCJcbiAgbGV0LXNob3dTZXRWYWx1ZT1cInNob3dTZXRWYWx1ZVwiXG4+XG4gIDxpb24tY2FyZD5cbiAgICA8aW9uLWNhcmQtaGVhZGVyPlxuICAgICAgPGlvbi1jYXJkLXRpdGxlPnt7IHRpdGxlIH19PC9pb24tY2FyZC10aXRsZT5cbiAgICA8L2lvbi1jYXJkLWhlYWRlcj5cbiAgICA8aW9uLWNhcmQtY29udGVudD5cbiAgICAgIEBmb3IgKFxuICAgICAgICBjb250cm9sIG9mIChmb3JtQXJyYXkgfCBmb3JtR2V0QXJyYXkpLmNvbnRyb2xzO1xuICAgICAgICB0cmFjayBpO1xuICAgICAgICBsZXQgaSA9ICRpbmRleDtcbiAgICAgICAgbGV0IGZpcnN0ID0gJGZpcnN0O1xuICAgICAgICBsZXQgbGFzdCA9ICRsYXN0XG4gICAgICApIHtcbiAgICAgICAgPGlvbi1yb3c+XG4gICAgICAgICAgPGlvbi1jb2w+XG4gICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQ+XG4gICAgICAgICAgICAgIDxtYXQtbGFiZWw+VmFsdWUgI3t7IGkgKyAxIH19PC9tYXQtbGFiZWw+XG4gICAgICAgICAgICAgIDxpbnB1dCBtYXRJbnB1dCBbZm9ybUNvbnRyb2xdPVwiY29udHJvbCB8IGZvcm1HZXRDb250cm9sXCIgLz5cbiAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICAgICAgPC9pb24tY29sPlxuICAgICAgICAgIDxpb24tY29sIHNpemU9XCJhdXRvXCI+XG4gICAgICAgICAgICBAaWYgKGxhc3QgJiYgIXNob3dBZGRUb29sYmFyKSB7XG4gICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIG1hdC1pY29uLWJ1dHRvbiBbdGl0bGVdPVwiJ0NPTU1PTi5CVE5fQUREJyB8IHRyYW5zbGF0ZVwiIChjbGljayk9XCJmb3JtQXJyYXkuYWRkKClcIj5cbiAgICAgICAgICAgICAgICA8bWF0LWljb24+YWRkPC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICBtYXQtaWNvbi1idXR0b25cbiAgICAgICAgICAgICAgW3RpdGxlXT1cIidDT01NT04uQlROX0RFTEVURScgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAoY2xpY2spPVwiZm9ybUFycmF5LnJlbW92ZUF0KGkpICYmIG1hcmtBc0RpcnR5KClcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8bWF0LWljb24+Y2xvc2U8L21hdC1pY29uPlxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgPC9pb24tY29sPlxuICAgICAgICA8L2lvbi1yb3c+XG4gICAgICB9XG5cbiAgICAgIEBpZiAoZm9ybUFycmF5Lmxlbmd0aCA9PT0gMCAmJiAhc2hvd0FkZFRvb2xiYXIpIHtcbiAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgbWF0LWljb24tYnV0dG9uIFt0aXRsZV09XCInQ09NTU9OLkJUTl9BREQnIHwgdHJhbnNsYXRlXCIgKGNsaWNrKT1cImZvcm1BcnJheS5hZGQoKVwiPlxuICAgICAgICAgIDxtYXQtaWNvbj5hZGQ8L21hdC1pY29uPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIH1cbiAgICA8L2lvbi1jYXJkLWNvbnRlbnQ+XG5cbiAgICBAaWYgKHNob3dBZGRUb29sYmFyIHx8IHNob3dSZXNpemVUb29sYmFyIHx8IHNob3dTZXRWYWx1ZSkge1xuICAgICAgPGlvbi10b29sYmFyPlxuICAgICAgICA8IS0tIFNldCBhcnJheSB2YWx1ZSAtLT5cbiAgICAgICAgPGlvbi1yb3cgKm5nSWY9XCJzaG93U2V0VmFsdWVcIj5cbiAgICAgICAgICA8aW9uLWNvbD5cbiAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICAgICAgPG1hdC1sYWJlbD5TZXQgVmFsdWU8L21hdC1sYWJlbD5cbiAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgI3NldFZhbHVlSW5wdXRcbiAgICAgICAgICAgICAgICBtYXRJbnB1dFxuICAgICAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIkNvbW1hIHNlcGFyYXRlZCB2YWx1ZXNcIlxuICAgICAgICAgICAgICAgIChrZXlkb3duLmVudGVyKT1cInNldEZvcm1BcnJheVZhbHVlKGZvcm1BcnJheSwgc2V0VmFsdWVJbnB1dC52YWx1ZSlcIlxuICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICA8L2lvbi1jb2w+XG4gICAgICAgICAgPGlvbi1jb2wgc2l6ZT1cImF1dG9cIj5cbiAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgIG1hdC1pY29uLWJ1dHRvblxuICAgICAgICAgICAgICB0aXRsZT1cIlNldCB2YWx1ZVwiXG4gICAgICAgICAgICAgIChjbGljayk9XCJzZXRGb3JtQXJyYXlWYWx1ZShmb3JtQXJyYXksIHNldFZhbHVlSW5wdXQudmFsdWUpXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPG1hdC1pY29uPmNoZWNrbWFyazwvbWF0LWljb24+XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8L2lvbi1jb2w+XG4gICAgICAgIDwvaW9uLXJvdz5cblxuICAgICAgICA8IS0tIFJlc2l6ZSB0aGUgYXJyYXkgLS0+XG4gICAgICAgIDxpb24tcm93ICpuZ0lmPVwic2hvd1Jlc2l6ZVRvb2xiYXJcIj5cbiAgICAgICAgICA8aW9uLWNvbD5cbiAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICAgICAgPG1hdC1sYWJlbD5SZXNpemU8L21hdC1sYWJlbD5cbiAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgI3NpemVJbnB1dFxuICAgICAgICAgICAgICAgIG1hdElucHV0XG4gICAgICAgICAgICAgICAgdHlwZT1cIm51bWJlclwiXG4gICAgICAgICAgICAgICAgc3RlcD1cIjFcIlxuICAgICAgICAgICAgICAgIG1pbj1cIjBcIlxuICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiTmV3IGFycmF5IGxlbmd0aFwiXG4gICAgICAgICAgICAgICAgKGtleWRvd24uZW50ZXIpPVwiZm9ybUFycmF5LnJlc2l6ZShzaXplSW5wdXQudmFsdWUpXCJcbiAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICAgICAgPC9pb24tY29sPlxuICAgICAgICAgIDxpb24tY29sIHNpemU9XCJhdXRvXCI+XG4gICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBtYXQtaWNvbi1idXR0b24gdGl0bGU9XCJSZXNpemVcIiAoY2xpY2spPVwiZm9ybUFycmF5LnJlc2l6ZShzaXplSW5wdXQudmFsdWUpXCI+XG4gICAgICAgICAgICAgIDxtYXQtaWNvbj5jaGVja21hcms8L21hdC1pY29uPlxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgPC9pb24tY29sPlxuICAgICAgICA8L2lvbi1yb3c+XG5cbiAgICAgICAgPCEtLSBBZGQgYSBpdGVtIHdpdGggYSB2YWx1ZSAtLT5cbiAgICAgICAgPGlvbi1yb3cgKm5nSWY9XCJzaG93QWRkVG9vbGJhclwiPlxuICAgICAgICAgIDxpb24tY29sPlxuICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgICAgICA8bWF0LWxhYmVsPlZhbHVlIHRvIGFkZDwvbWF0LWxhYmVsPlxuICAgICAgICAgICAgICA8aW5wdXQgI3ZhbHVlSW5wdXQgbWF0SW5wdXQgdHlwZT1cInRleHRcIiAoa2V5ZG93bi5lbnRlcik9XCJmb3JtQXJyYXkuYWRkKHZhbHVlSW5wdXQudmFsdWUpXCIgLz5cbiAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICAgICAgPC9pb24tY29sPlxuICAgICAgICAgIDxpb24tY29sIHNpemU9XCJhdXRvXCI+XG4gICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICBtYXQtaWNvbi1idXR0b25cbiAgICAgICAgICAgICAgW3RpdGxlXT1cIidDT01NT04uQlROX0FERCcgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAoY2xpY2spPVwiZm9ybUFycmF5LmFkZCh2YWx1ZUlucHV0LnZhbHVlKVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxtYXQtaWNvbj5hZGQ8L21hdC1pY29uPlxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgPC9pb24tY29sPlxuICAgICAgICA8L2lvbi1yb3c+XG4gICAgICA8L2lvbi10b29sYmFyPlxuICAgIH1cbiAgPC9pb24tY2FyZD5cbjwvbmctdGVtcGxhdGU+XG4iXX0=
97
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS1hcnJheS50ZXN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9jb3JlL2Zvcm0vYXJyYXkvdGVzdGluZy9mb3JtLWFycmF5LnRlc3QudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBwL2NvcmUvZm9ybS9hcnJheS90ZXN0aW5nL2Zvcm0tYXJyYXkudGVzdC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBcUIsU0FBUyxFQUFFLE1BQU0sRUFBK0IsTUFBTSxlQUFlLENBQUM7QUFJbEcsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNwQyxPQUFPLEVBQUUsWUFBWSxFQUFFLGVBQWUsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQzdFLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUMzQyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRTdDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQzs7Ozs7Ozs7Ozs7OztBQU01RCxNQUFNLE9BQU8saUJBQWtCLFNBQVEsT0FBWTtJQTBCckM7SUFDQTtJQUNBO0lBQ0E7SUE1QkosWUFBWSxHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7SUFFMUMsSUFBSSxnQkFBZ0I7UUFDbEIsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQTJCLENBQUM7SUFDNUQsQ0FBQztJQUVELElBQUksaUJBQWlCO1FBQ25CLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUEyQixDQUFDO0lBQzdELENBQUM7SUFFRCxJQUFJLG1CQUFtQjtRQUNyQixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBMkIsQ0FBQztJQUMvRCxDQUFDO0lBRUQsSUFBSSx5QkFBeUI7UUFD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LFVBQVUsRUFBRSxDQUFDLFdBQVcsRUFBRSxJQUFJLEVBQUUsV0FBVyxDQUFDO1lBQzVDLGdCQUFnQixFQUFFLENBQUMsV0FBVyxFQUFFLElBQUksRUFBRSxXQUFXLENBQUM7WUFDbEQsaUJBQWlCO1lBQ2pCLFVBQVUsRUFBRSxJQUFJO1NBQ2pCLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFUyxpQkFBaUIsQ0FBQyxTQUFpQyxFQUFFLE1BQXlCO1FBQ3RGLE1BQU0sV0FBVyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsZUFBZSxDQUFDLENBQUM7UUFDN0YsU0FBUyxDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUNsQyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDckIsQ0FBQztJQUVELDZCQUE2QjtJQUVuQixZQUFZO1FBQ3BCLElBQUksQ0FBQyxFQUFFLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDekIsQ0FBQzt3R0ExR1UsaUJBQWlCOzRGQUFqQixpQkFBaUIsNkVDZjlCLDZrTkFrTkE7OzRGRG5NYSxpQkFBaUI7a0JBSjdCLFNBQVM7K0JBQ0UsZ0JBQWdCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0b3JSZWYsIENvbXBvbmVudCwgaW5qZWN0LCBJbmplY3RvciwgT25EZXN0cm95LCBPbkluaXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFVudHlwZWRGb3JtQnVpbGRlciwgVW50eXBlZEZvcm1Db250cm9sIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuXG5pbXBvcnQgeyBQbGF0Zm9ybVNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9wbGF0Zm9ybS5zZXJ2aWNlJztcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgaXNOaWxPckJsYW5rLCB0cmltRW1wdHlUb051bGwgfSBmcm9tICcuLi8uLi8uLi8uLi9zaGFyZWQvZnVuY3Rpb25zJztcbmltcG9ydCB7IEFwcEZvcm0gfSBmcm9tICcuLi8uLi9mb3JtLmNsYXNzJztcbmltcG9ydCB7IEFwcEZvcm1BcnJheSB9IGZyb20gJy4uL2Zvcm0tYXJyYXknO1xuXG5pbXBvcnQgeyBTSE9XX1RPT0xUSVAgfSBmcm9tICcuLi8uLi8uLi8uLi9zaGFyZWQvY29uc3RhbnRzJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYXBwLWFycmF5LXRlc3QnLFxuICB0ZW1wbGF0ZVVybDogJy4vZm9ybS1hcnJheS50ZXN0Lmh0bWwnLFxufSlcbmV4cG9ydCBjbGFzcyBBcnJheUZvcm1UZXN0UGFnZSBleHRlbmRzIEFwcEZvcm08YW55PiBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcbiAgcHJpdmF0ZSBzdWJzY3JpcHRpb24gPSBuZXcgU3Vic2NyaXB0aW9uKCk7XG5cbiAgZ2V0IGRlZmF1bHRGb3JtQXJyYXkoKTogQXBwRm9ybUFycmF5PGFueSwgYW55PiB7XG4gICAgcmV0dXJuIHRoaXMuZm9ybS5nZXQoJ2RlZmF1bHQnKSBhcyBBcHBGb3JtQXJyYXk8YW55LCBhbnk+O1xuICB9XG5cbiAgZ2V0IG5vdEVtcHR5Rm9ybUFycmF5KCk6IEFwcEZvcm1BcnJheTxhbnksIGFueT4ge1xuICAgIHJldHVybiB0aGlzLmZvcm0uZ2V0KCdub3RFbXB0eScpIGFzIEFwcEZvcm1BcnJheTxhbnksIGFueT47XG4gIH1cblxuICBnZXQgbnVsbFZhbHVlc0Zvcm1BcnJheSgpOiBBcHBGb3JtQXJyYXk8YW55LCBhbnk+IHtcbiAgICByZXR1cm4gdGhpcy5mb3JtLmdldCgnbnVsbFZhbHVlcycpIGFzIEFwcEZvcm1BcnJheTxhbnksIGFueT47XG4gIH1cblxuICBnZXQgZHVwbGljYXRlZFZhbHVlc0Zvcm1BcnJheSgpOiBBcHBGb3JtQXJyYXk8YW55LCBhbnk+IHtcbiAgICByZXR1cm4gdGhpcy5mb3JtLmdldCgnZHVwbGljYXRlZFZhbHVlcycpIGFzIEFwcEZvcm1BcnJheTxhbnksIGFueT47XG4gIH1cblxuICBnZXQgdmFsdWVUb0FkZENvbnRyb2woKTogVW50eXBlZEZvcm1Db250cm9sIHtcbiAgICByZXR1cm4gdGhpcy5mb3JtPy5nZXQoJ3ZhbHVlVG9BZGQnKSBhcyBVbnR5cGVkRm9ybUNvbnRyb2w7XG4gIH1cblxuICBzaG93VG9vbHRpcCA9IGluamVjdChTSE9XX1RPT0xUSVApO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByb3RlY3RlZCBmb3JtQnVpbGRlcjogVW50eXBlZEZvcm1CdWlsZGVyLFxuICAgIHByb3RlY3RlZCBwbGF0Zm9ybTogUGxhdGZvcm1TZXJ2aWNlLFxuICAgIHByb3RlY3RlZCBpbmplY3Rpb246IEluamVjdG9yLFxuICAgIHByb3RlY3RlZCBjZDogQ2hhbmdlRGV0ZWN0b3JSZWZcbiAgKSB7XG4gICAgc3VwZXIoXG4gICAgICBpbmplY3Rpb24sXG4gICAgICBmb3JtQnVpbGRlci5ncm91cCh7XG4gICAgICAgIGRlZmF1bHQ6IG5ldyBBcHBGb3JtQXJyYXkoXG4gICAgICAgICAgKHZhbHVlKSA9PiB0aGlzLmZvcm1CdWlsZGVyLmNvbnRyb2wodmFsdWUpLFxuICAgICAgICAgICh2MSwgdjIpID0+IHYxID09PSB2MixcbiAgICAgICAgICAodmFsdWUpID0+IGlzTmlsT3JCbGFuayh2YWx1ZSlcbiAgICAgICAgKSxcblxuICAgICAgICBub3RFbXB0eTogbmV3IEFwcEZvcm1BcnJheShcbiAgICAgICAgICAodmFsdWUpID0+IHRoaXMuZm9ybUJ1aWxkZXIuY29udHJvbCh2YWx1ZSksXG4gICAgICAgICAgKHYxLCB2MikgPT4gdjEgPT09IHYyLFxuICAgICAgICAgICh2YWx1ZSkgPT4gaXNOaWxPckJsYW5rKHZhbHVlKSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBhbGxvd0VtcHR5QXJyYXk6IGZhbHNlLFxuICAgICAgICAgIH1cbiAgICAgICAgKSxcblxuICAgICAgICBudWxsVmFsdWVzOiBuZXcgQXBwRm9ybUFycmF5KFxuICAgICAgICAgICh2YWx1ZSkgPT4gdGhpcy5mb3JtQnVpbGRlci5jb250cm9sKHZhbHVlKSxcbiAgICAgICAgICAodjEsIHYyKSA9PiB2MSA9PT0gdjIsXG4gICAgICAgICAgKHZhbHVlKSA9PiBpc05pbE9yQmxhbmsodmFsdWUpLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGFsbG93RW1wdHlBcnJheTogZmFsc2UsXG4gICAgICAgICAgICBhbGxvd01hbnlOdWxsVmFsdWVzOiB0cnVlLFxuICAgICAgICAgIH1cbiAgICAgICAgKSxcblxuICAgICAgICBkdXBsaWNhdGVkVmFsdWVzOiBuZXcgQXBwRm9ybUFycmF5KFxuICAgICAgICAgICh2YWx1ZSkgPT4gdGhpcy5mb3JtQnVpbGRlci5jb250cm9sKHZhbHVlKSxcbiAgICAgICAgICAodjEsIHYyKSA9PiB2MSA9PT0gdjIsXG4gICAgICAgICAgKHZhbHVlKSA9PiBpc05pbE9yQmxhbmsodmFsdWUpLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGFsbG93RW1wdHlBcnJheTogZmFsc2UsXG4gICAgICAgICAgICBhbGxvd01hbnlOdWxsVmFsdWVzOiB0cnVlLFxuICAgICAgICAgICAgYWxsb3dEdXBsaWNhdGVWYWx1ZTogdHJ1ZSxcbiAgICAgICAgICB9XG4gICAgICAgICksXG5cbiAgICAgICAgLy8gVmFsdWUgdG8gYWRkXG4gICAgICAgIHZhbHVlVG9BZGQ6IGZvcm1CdWlsZGVyLmNvbnRyb2wobnVsbCwgW10pLFxuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLmxvYWREYXRhKCksIDI1MCk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpIHtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICB9XG5cbiAgLy8gTG9hZCB0aGUgZm9ybSB3aXRoIGRhdGFcbiAgYXN5bmMgbG9hZERhdGEoKSB7XG4gICAgdGhpcy5zZXRWYWx1ZSh7XG4gICAgICBkZWZhdWx0OiBbJ1RFU1RJTkdfMScsICdURVNUSU5HXzInXSxcbiAgICAgIG5vdEVtcHR5OiBbJ1RFU1RJTkdfMScsICdURVNUSU5HXzInXSxcbiAgICAgIG51bGxWYWx1ZXM6IFsnVEVTVElOR18xJywgbnVsbCwgJ1RFU1RJTkdfNCddLFxuICAgICAgZHVwbGljYXRlZFZhbHVlczogWydURVNUSU5HXzEnLCBudWxsLCAnVEVTVElOR18xJ10sXG4gICAgICAvLyBBZGQgd2l0aCB2YWx1ZVxuICAgICAgdmFsdWVUb0FkZDogbnVsbCxcbiAgICB9KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBzZXRGb3JtQXJyYXlWYWx1ZShmb3JtQXJyYXk6IEFwcEZvcm1BcnJheTxhbnksIGFueT4sIHZhbHVlczogc3RyaW5nIHwgc3RyaW5nW10pIHtcbiAgICBjb25zdCBhcnJheVZhbHVlcyA9IEFycmF5LmlzQXJyYXkodmFsdWVzKSA/IHZhbHVlcyA6IHZhbHVlcz8uc3BsaXQoJywnKS5tYXAodHJpbUVtcHR5VG9OdWxsKTtcbiAgICBmb3JtQXJyYXkucGF0Y2hWYWx1ZShhcnJheVZhbHVlcyk7XG4gICAgdGhpcy5tYXJrQXNEaXJ0eSgpO1xuICB9XG5cbiAgLyogLS0gcHJvdGVjdGVkIG1ldGhvZHMgLS0gKi9cblxuICBwcm90ZWN0ZWQgbWFya0ZvckNoZWNrKCkge1xuICAgIHRoaXMuY2QubWFya0ZvckNoZWNrKCk7XG4gIH1cbn1cbiIsIjxpb24taGVhZGVyPlxuICA8aW9uLXRvb2xiYXIgY29sb3I9XCJwcmltYXJ5XCI+XG4gICAgPGlvbi1idXR0b25zIHNsb3Q9XCJzdGFydFwiPlxuICAgICAgPGlvbi1iYWNrLWJ1dHRvbj48L2lvbi1iYWNrLWJ1dHRvbj5cbiAgICA8L2lvbi1idXR0b25zPlxuXG4gICAgPGlvbi10aXRsZT5Gb3JtIEFycmF5IHRlc3QgcGFnZTwvaW9uLXRpdGxlPlxuICA8L2lvbi10b29sYmFyPlxuPC9pb24taGVhZGVyPlxuXG48aW9uLWNvbnRlbnQ+XG4gIDxmb3JtIGNsYXNzPVwiZm9ybS1jb250YWluZXIgaW9uLXBhZGRpbmdcIiBbZm9ybUdyb3VwXT1cImZvcm1cIj5cbiAgICA8aW9uLWdyaWQ+XG4gICAgICA8aW9uLXJvdz5cbiAgICAgICAgPCEtLSBEZWZhdWx0IC0tPlxuICAgICAgICA8aW9uLWNvbCBzaXplPVwiNlwiPlxuICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwiXG4gICAgICAgICAgICAgIGFycmF5Q2FyZDtcbiAgICAgICAgICAgICAgY29udGV4dDogeyAkaW1wbGljaXQ6IGRlZmF1bHRGb3JtQXJyYXksIHRpdGxlOiAnRGVmYXVsdCBiZWhhdmlvcicsIHNob3dTZXRWYWx1ZTogdHJ1ZSB9XG4gICAgICAgICAgICBcIlxuICAgICAgICAgID48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9pb24tY29sPlxuXG4gICAgICAgIDwhLS0gTm90IGVtcHR5IGFycmF5IC0tPlxuICAgICAgICA8aW9uLWNvbCBzaXplPVwiNlwiPlxuICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwiXG4gICAgICAgICAgICAgIGFycmF5Q2FyZDtcbiAgICAgICAgICAgICAgY29udGV4dDogeyAkaW1wbGljaXQ6IG5vdEVtcHR5Rm9ybUFycmF5LCB0aXRsZTogJ05vdCBlbXB0eSBhcnJheScsIHNob3dTZXRWYWx1ZTogdHJ1ZSB9XG4gICAgICAgICAgICBcIlxuICAgICAgICAgID48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9pb24tY29sPlxuXG4gICAgICAgIDwhLS0gQWxsb3cgbnVsbCB2YWx1ZXMgLS0+XG4gICAgICAgIDxpb24tY29sIHNpemU9XCI2XCI+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgKm5nVGVtcGxhdGVPdXRsZXQ9XCJcbiAgICAgICAgICAgICAgYXJyYXlDYXJkO1xuICAgICAgICAgICAgICBjb250ZXh0OiB7XG4gICAgICAgICAgICAgICAgJGltcGxpY2l0OiBudWxsVmFsdWVzRm9ybUFycmF5LFxuICAgICAgICAgICAgICAgIHRpdGxlOiAnQWxsb3cgbWFueSBudWxsIHZhbHVlcycsXG4gICAgICAgICAgICAgICAgc2hvd0FkZFRvb2xiYXI6IHRydWUsXG4gICAgICAgICAgICAgICAgc2hvd1Jlc2l6ZVRvb2xiYXI6IHRydWUsXG4gICAgICAgICAgICAgICAgc2hvd1NldFZhbHVlOiB0cnVlXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFwiXG4gICAgICAgICAgPjwvbmctY29udGFpbmVyPlxuICAgICAgICA8L2lvbi1jb2w+XG5cbiAgICAgICAgPCEtLSBBbGxvdyBkdXBsaWNhdGVkIHZhbHVlIC0tPlxuICAgICAgICA8aW9uLWNvbCBzaXplPVwiNlwiPlxuICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwiXG4gICAgICAgICAgICAgIGFycmF5Q2FyZDtcbiAgICAgICAgICAgICAgY29udGV4dDoge1xuICAgICAgICAgICAgICAgICRpbXBsaWNpdDogZHVwbGljYXRlZFZhbHVlc0Zvcm1BcnJheSxcbiAgICAgICAgICAgICAgICB0aXRsZTogJ0FsbG93IGR1cGxpY2F0ZWQgdmFsdWVzJyxcbiAgICAgICAgICAgICAgICBzaG93QWRkVG9vbGJhcjogdHJ1ZSxcbiAgICAgICAgICAgICAgICBzaG93UmVzaXplVG9vbGJhcjogdHJ1ZSxcbiAgICAgICAgICAgICAgICBzaG93U2V0VmFsdWU6IHRydWVcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXCJcbiAgICAgICAgICA+PC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvaW9uLWNvbD5cbiAgICAgIDwvaW9uLXJvdz5cbiAgICA8L2lvbi1ncmlkPlxuICA8L2Zvcm0+XG48L2lvbi1jb250ZW50PlxuXG48bmctdGVtcGxhdGVcbiAgI2FycmF5Q2FyZFxuICBsZXQtZm9ybUFycmF5XG4gIGxldC10aXRsZT1cInRpdGxlXCJcbiAgbGV0LXNob3dBZGRUb29sYmFyPVwic2hvd0FkZFRvb2xiYXJcIlxuICBsZXQtc2hvd1Jlc2l6ZVRvb2xiYXI9XCJzaG93UmVzaXplVG9vbGJhclwiXG4gIGxldC1zaG93U2V0VmFsdWU9XCJzaG93U2V0VmFsdWVcIlxuPlxuICA8aW9uLWNhcmQ+XG4gICAgPGlvbi1jYXJkLWhlYWRlcj5cbiAgICAgIDxpb24tY2FyZC10aXRsZT57eyB0aXRsZSB9fTwvaW9uLWNhcmQtdGl0bGU+XG4gICAgPC9pb24tY2FyZC1oZWFkZXI+XG4gICAgPGlvbi1jYXJkLWNvbnRlbnQ+XG4gICAgICBAZm9yIChcbiAgICAgICAgY29udHJvbCBvZiAoZm9ybUFycmF5IHwgZm9ybUdldEFycmF5KS5jb250cm9scztcbiAgICAgICAgdHJhY2sgaTtcbiAgICAgICAgbGV0IGkgPSAkaW5kZXg7XG4gICAgICAgIGxldCBmaXJzdCA9ICRmaXJzdDtcbiAgICAgICAgbGV0IGxhc3QgPSAkbGFzdFxuICAgICAgKSB7XG4gICAgICAgIDxpb24tcm93PlxuICAgICAgICAgIDxpb24tY29sPlxuICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgICAgICA8bWF0LWxhYmVsPlZhbHVlICN7eyBpICsgMSB9fTwvbWF0LWxhYmVsPlxuICAgICAgICAgICAgICA8aW5wdXQgbWF0SW5wdXQgW2Zvcm1Db250cm9sXT1cImNvbnRyb2wgfCBmb3JtR2V0Q29udHJvbFwiIC8+XG4gICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgIDwvaW9uLWNvbD5cbiAgICAgICAgICA8aW9uLWNvbCBzaXplPVwiYXV0b1wiPlxuICAgICAgICAgICAgQGlmIChsYXN0ICYmICFzaG93QWRkVG9vbGJhcikge1xuICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgbWF0LWljb24tYnV0dG9uXG4gICAgICAgICAgICAgICAgW3RpdGxlXT1cIiFzaG93VG9vbHRpcCA/ICgnQ09NTU9OLkJUTl9BREQnIHwgdHJhbnNsYXRlKSA6ICcnXCJcbiAgICAgICAgICAgICAgICBbbWF0VG9vbHRpcF09XCJzaG93VG9vbHRpcCA/ICgnQ09NTU9OLkJUTl9BREQnIHwgdHJhbnNsYXRlKSA6ICcnXCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwiZm9ybUFycmF5LmFkZCgpXCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxtYXQtaWNvbj5hZGQ8L21hdC1pY29uPlxuICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgIG1hdC1pY29uLWJ1dHRvblxuICAgICAgICAgICAgICBbdGl0bGVdPVwiIXNob3dUb29sdGlwID8gKCdDT01NT04uQlROX0RFTEVURScgfCB0cmFuc2xhdGUpIDogJydcIlxuICAgICAgICAgICAgICBbbWF0VG9vbHRpcF09XCJzaG93VG9vbHRpcCA/ICgnQ09NTU9OLkJUTl9ERUxFVEUnIHwgdHJhbnNsYXRlKSA6ICcnXCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cImZvcm1BcnJheS5yZW1vdmVBdChpKSAmJiBtYXJrQXNEaXJ0eSgpXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPG1hdC1pY29uPmNsb3NlPC9tYXQtaWNvbj5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIDwvaW9uLWNvbD5cbiAgICAgICAgPC9pb24tcm93PlxuICAgICAgfVxuXG4gICAgICBAaWYgKGZvcm1BcnJheS5sZW5ndGggPT09IDAgJiYgIXNob3dBZGRUb29sYmFyKSB7XG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICBtYXQtaWNvbi1idXR0b25cbiAgICAgICAgICBbdGl0bGVdPVwiIXNob3dUb29sdGlwID8gKCdDT01NT04uQlROX0FERCcgfCB0cmFuc2xhdGUpIDogJydcIlxuICAgICAgICAgIFttYXRUb29sdGlwXT1cInNob3dUb29sdGlwID8gKCdDT01NT04uQlROX0FERCcgfCB0cmFuc2xhdGUpIDogJydcIlxuICAgICAgICAgIChjbGljayk9XCJmb3JtQXJyYXkuYWRkKClcIlxuICAgICAgICA+XG4gICAgICAgICAgPG1hdC1pY29uPmFkZDwvbWF0LWljb24+XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgfVxuICAgIDwvaW9uLWNhcmQtY29udGVudD5cblxuICAgIEBpZiAoc2hvd0FkZFRvb2xiYXIgfHwgc2hvd1Jlc2l6ZVRvb2xiYXIgfHwgc2hvd1NldFZhbHVlKSB7XG4gICAgICA8aW9uLXRvb2xiYXI+XG4gICAgICAgIDwhLS0gU2V0IGFycmF5IHZhbHVlIC0tPlxuICAgICAgICA8aW9uLXJvdyAqbmdJZj1cInNob3dTZXRWYWx1ZVwiPlxuICAgICAgICAgIDxpb24tY29sPlxuICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgICAgICA8bWF0LWxhYmVsPlNldCBWYWx1ZTwvbWF0LWxhYmVsPlxuICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAjc2V0VmFsdWVJbnB1dFxuICAgICAgICAgICAgICAgIG1hdElucHV0XG4gICAgICAgICAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiQ29tbWEgc2VwYXJhdGVkIHZhbHVlc1wiXG4gICAgICAgICAgICAgICAgKGtleWRvd24uZW50ZXIpPVwic2V0Rm9ybUFycmF5VmFsdWUoZm9ybUFycmF5LCBzZXRWYWx1ZUlucHV0LnZhbHVlKVwiXG4gICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgIDwvaW9uLWNvbD5cbiAgICAgICAgICA8aW9uLWNvbCBzaXplPVwiYXV0b1wiPlxuICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgbWF0LWljb24tYnV0dG9uXG4gICAgICAgICAgICAgIHRpdGxlPVwiU2V0IHZhbHVlXCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cInNldEZvcm1BcnJheVZhbHVlKGZvcm1BcnJheSwgc2V0VmFsdWVJbnB1dC52YWx1ZSlcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8bWF0LWljb24+Y2hlY2ttYXJrPC9tYXQtaWNvbj5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIDwvaW9uLWNvbD5cbiAgICAgICAgPC9pb24tcm93PlxuXG4gICAgICAgIDwhLS0gUmVzaXplIHRoZSBhcnJheSAtLT5cbiAgICAgICAgPGlvbi1yb3cgKm5nSWY9XCJzaG93UmVzaXplVG9vbGJhclwiPlxuICAgICAgICAgIDxpb24tY29sPlxuICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgICAgICA8bWF0LWxhYmVsPlJlc2l6ZTwvbWF0LWxhYmVsPlxuICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAjc2l6ZUlucHV0XG4gICAgICAgICAgICAgICAgbWF0SW5wdXRcbiAgICAgICAgICAgICAgICB0eXBlPVwibnVtYmVyXCJcbiAgICAgICAgICAgICAgICBzdGVwPVwiMVwiXG4gICAgICAgICAgICAgICAgbWluPVwiMFwiXG4gICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJOZXcgYXJyYXkgbGVuZ3RoXCJcbiAgICAgICAgICAgICAgICAoa2V5ZG93bi5lbnRlcik9XCJmb3JtQXJyYXkucmVzaXplKHNpemVJbnB1dC52YWx1ZSlcIlxuICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICA8L2lvbi1jb2w+XG4gICAgICAgICAgPGlvbi1jb2wgc2l6ZT1cImF1dG9cIj5cbiAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIG1hdC1pY29uLWJ1dHRvbiB0aXRsZT1cIlJlc2l6ZVwiIChjbGljayk9XCJmb3JtQXJyYXkucmVzaXplKHNpemVJbnB1dC52YWx1ZSlcIj5cbiAgICAgICAgICAgICAgPG1hdC1pY29uPmNoZWNrbWFyazwvbWF0LWljb24+XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8L2lvbi1jb2w+XG4gICAgICAgIDwvaW9uLXJvdz5cblxuICAgICAgICA8IS0tIEFkZCBhIGl0ZW0gd2l0aCBhIHZhbHVlIC0tPlxuICAgICAgICA8aW9uLXJvdyAqbmdJZj1cInNob3dBZGRUb29sYmFyXCI+XG4gICAgICAgICAgPGlvbi1jb2w+XG4gICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQ+XG4gICAgICAgICAgICAgIDxtYXQtbGFiZWw+VmFsdWUgdG8gYWRkPC9tYXQtbGFiZWw+XG4gICAgICAgICAgICAgIDxpbnB1dCAjdmFsdWVJbnB1dCBtYXRJbnB1dCB0eXBlPVwidGV4dFwiIChrZXlkb3duLmVudGVyKT1cImZvcm1BcnJheS5hZGQodmFsdWVJbnB1dC52YWx1ZSlcIiAvPlxuICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICA8L2lvbi1jb2w+XG4gICAgICAgICAgPGlvbi1jb2wgc2l6ZT1cImF1dG9cIj5cbiAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgIG1hdC1pY29uLWJ1dHRvblxuICAgICAgICAgICAgICBbdGl0bGVdPVwiIXNob3dUb29sdGlwID8gKCdDT01NT04uQlROX0FERCcgfCB0cmFuc2xhdGUpIDogJydcIlxuICAgICAgICAgICAgICBbbWF0VG9vbHRpcF09XCJzaG93VG9vbHRpcCA/ICgnQ09NTU9OLkJUTl9BREQnIHwgdHJhbnNsYXRlKSA6ICcnXCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cImZvcm1BcnJheS5hZGQodmFsdWVJbnB1dC52YWx1ZSlcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8bWF0LWljb24+YWRkPC9tYXQtaWNvbj5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIDwvaW9uLWNvbD5cbiAgICAgICAgPC9pb24tcm93PlxuICAgICAgPC9pb24tdG9vbGJhcj5cbiAgICB9XG4gIDwvaW9uLWNhcmQ+XG48L25nLXRlbXBsYXRlPlxuIl19
@@ -1,6 +1,7 @@
1
- import { Component, EventEmitter, Input, Output } from '@angular/core';
1
+ import { Component, EventEmitter, inject, Input, Output } from '@angular/core';
2
2
  import { Subscription } from 'rxjs';
3
3
  import { debounceTime, filter } from 'rxjs/operators';
4
+ import { SHOW_TOOLTIP } from '../../../shared/constants';
4
5
  import * as i0 from "@angular/core";
5
6
  import * as i1 from "../../../shared/hotkeys/hotkeys.service";
6
7
  import * as i2 from "../../menu/menu.service";
@@ -8,7 +9,8 @@ import * as i3 from "@angular/common";
8
9
  import * as i4 from "@ionic/angular";
9
10
  import * as i5 from "@angular/material/icon";
10
11
  import * as i6 from "@angular/material/button";
11
- import * as i7 from "@ngx-translate/core";
12
+ import * as i7 from "@angular/material/tooltip";
13
+ import * as i8 from "@ngx-translate/core";
12
14
  export class FormButtonsBarToken {
13
15
  }
14
16
  export class FormButtonsBarComponent {
@@ -32,6 +34,7 @@ export class FormButtonsBarComponent {
32
34
  onBack = new EventEmitter();
33
35
  onSaveAndClose = new EventEmitter();
34
36
  onSaveAndNext = new EventEmitter();
37
+ showTooltip = inject(SHOW_TOOLTIP);
35
38
  constructor(hotkeys, menu) {
36
39
  this.menu = menu;
37
40
  // Ctrl+S
@@ -63,11 +66,11 @@ export class FormButtonsBarComponent {
63
66
  this.onSaveAndClose.complete();
64
67
  }
65
68
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: FormButtonsBarComponent, deps: [{ token: i1.Hotkeys }, { token: i2.MenuService }], target: i0.ɵɵFactoryTarget.Component });
66
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: FormButtonsBarComponent, selector: "app-form-buttons-bar", inputs: { disabled: "disabled", disabledCancel: "disabledCancel", disabledEscape: "disabledEscape", classList: "classList", saveButtonColor: "saveButtonColor", backText: "backText", cancelText: "cancelText", nextText: "nextText", showBack: "showBack", showCancel: "showCancel", showNext: "showNext", showSave: "showSave" }, outputs: { onCancel: "onCancel", onSave: "onSave", onNext: "onNext", onBack: "onBack", onSaveAndClose: "onSaveAndClose", onSaveAndNext: "onSaveAndNext" }, providers: [{ provide: FormButtonsBarToken, useExisting: FormButtonsBarComponent }], ngImport: i0, template: "<ion-toolbar [class]=\"classList\">\n <ion-row class=\"ion-no-padding\" nowrap>\n <!-- show menu button -->\n <ion-col size=\"auto\" class=\"hidden-xs hidden-sm\">\n <ion-menu-toggle>\n <button\n mat-icon-button\n color=\"accent\"\n [title]=\"'COMMON.BTN_SHOW_MENU' | translate\"\n (click)=\"menu.toggleSplitPaneWhen()\"\n >\n <mat-icon><span>&#xbb;</span></mat-icon>\n </button>\n </ion-menu-toggle>\n </ion-col>\n\n <ion-col class=\"app-form-buttons-bar-content\">\n <ng-content></ng-content>\n </ion-col>\n\n <ion-col size=\"auto\" class=\"app-form-buttons-bar-buttons\">\n <ng-content select=\"[slot=end]\"></ng-content>\n\n <!-- back -->\n <ion-button\n fill=\"clear\"\n color=\"dark\"\n (click)=\"onBack.emit($event)\"\n (keyup.enter)=\"onBack.emit($event)\"\n *ngIf=\"showBack && onBack.observed\"\n class=\"back\"\n >\n <ion-label>{{ backText | translate }}</ion-label>\n </ion-button>\n\n <!-- cancel -->\n <ion-button\n fill=\"clear\"\n color=\"dark\"\n *ngIf=\"showCancel\"\n (click)=\"onCancel.emit($event)\"\n (keyup.enter)=\"onCancel.emit($event)\"\n [disabled]=\"disabledCancel\"\n class=\"cancel\"\n >\n <ion-icon slot=\"start\" name=\"refresh\"></ion-icon>\n <ion-label>{{ cancelText | translate }}</ion-label>\n </ion-button>\n\n <!-- next -->\n <ion-button\n fill=\"solid\"\n *ngIf=\"showNext && onNext.observed\"\n (click)=\"onNext.emit($event)\"\n (keyup.enter)=\"onNext.emit($event)\"\n class=\"next\"\n >\n <ion-label>{{ nextText | translate }}</ion-label>\n <ion-icon slot=\"end\" name=\"arrow-forward\"></ion-icon>\n </ion-button>\n\n <!-- save -->\n @if (showSave && onSave.observed) {\n <ion-button\n [fill]=\"disabled ? 'clear' : 'solid'\"\n (click)=\"onSave.emit($event)\"\n (keyup.enter)=\"onSave.emit($event)\"\n [color]=\"saveButtonColor\"\n [disabled]=\"disabled\"\n [title]=\"'COMMON.BTN_SAVE_WITH_SHORTCUT_HELP' | translate\"\n class=\"save\"\n >\n <ion-label>\n <span [innerHTML]=\"'COMMON.BTN_SAVE_WITH_SHORTCUT' | translate\"></span>\n </ion-label>\n </ion-button>\n }\n\n <ng-content select=\"[slot=afterSave]\"></ng-content>\n </ion-col>\n </ion-row>\n</ion-toolbar>\n", styles: [":host{width:100%}:host ion-toolbar{height:var(--app-form-buttons-bar-height);padding:0 6px}:host ion-col{padding:0}:host ion-col:has(ion-button){align-content:center}:host ion-col ion-button{margin-top:0;margin-bottom:0}\n"], dependencies: [{ kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i4.IonButton, selector: "ion-button", inputs: ["buttonType", "color", "disabled", "download", "expand", "fill", "form", "href", "mode", "rel", "routerAnimation", "routerDirection", "shape", "size", "strong", "target", "type"] }, { kind: "component", type: i4.IonCol, selector: "ion-col", inputs: ["offset", "offsetLg", "offsetMd", "offsetSm", "offsetXl", "offsetXs", "pull", "pullLg", "pullMd", "pullSm", "pullXl", "pullXs", "push", "pushLg", "pushMd", "pushSm", "pushXl", "pushXs", "size", "sizeLg", "sizeMd", "sizeSm", "sizeXl", "sizeXs"] }, { kind: "component", type: i4.IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }, { kind: "component", type: i4.IonLabel, selector: "ion-label", inputs: ["color", "mode", "position"] }, { kind: "component", type: i4.IonMenuToggle, selector: "ion-menu-toggle", inputs: ["autoHide", "menu"] }, { kind: "component", type: i4.IonRow, selector: "ion-row" }, { kind: "component", type: i4.IonToolbar, selector: "ion-toolbar", inputs: ["color", "mode"] }, { kind: "component", type: i5.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i6.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "pipe", type: i7.TranslatePipe, name: "translate" }] });
69
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: FormButtonsBarComponent, selector: "app-form-buttons-bar", inputs: { disabled: "disabled", disabledCancel: "disabledCancel", disabledEscape: "disabledEscape", classList: "classList", saveButtonColor: "saveButtonColor", backText: "backText", cancelText: "cancelText", nextText: "nextText", showBack: "showBack", showCancel: "showCancel", showNext: "showNext", showSave: "showSave" }, outputs: { onCancel: "onCancel", onSave: "onSave", onNext: "onNext", onBack: "onBack", onSaveAndClose: "onSaveAndClose", onSaveAndNext: "onSaveAndNext" }, providers: [{ provide: FormButtonsBarToken, useExisting: FormButtonsBarComponent }], ngImport: i0, template: "<ion-toolbar [class]=\"classList\">\n <ion-row class=\"ion-no-padding\" nowrap>\n <!-- show menu button -->\n <ion-col size=\"auto\" class=\"hidden-xs hidden-sm\">\n <ion-menu-toggle>\n <button\n mat-icon-button\n color=\"accent\"\n [title]=\"!showTooltip ? ('COMMON.BTN_SHOW_MENU' | translate) : ''\"\n [matTooltip]=\"showTooltip ? ('COMMON.BTN_SHOW_MENU' | translate) : ''\"\n (click)=\"menu.toggleSplitPaneWhen()\"\n >\n <mat-icon><span>&#xbb;</span></mat-icon>\n </button>\n </ion-menu-toggle>\n </ion-col>\n\n <ion-col class=\"app-form-buttons-bar-content\">\n <ng-content></ng-content>\n </ion-col>\n\n <ion-col size=\"auto\" class=\"app-form-buttons-bar-buttons\">\n <ng-content select=\"[slot=end]\"></ng-content>\n\n <!-- back -->\n <ion-button\n fill=\"clear\"\n color=\"dark\"\n (click)=\"onBack.emit($event)\"\n (keyup.enter)=\"onBack.emit($event)\"\n *ngIf=\"showBack && onBack.observed\"\n class=\"back\"\n >\n <ion-label>{{ backText | translate }}</ion-label>\n </ion-button>\n\n <!-- cancel -->\n <ion-button\n fill=\"clear\"\n color=\"dark\"\n *ngIf=\"showCancel\"\n (click)=\"onCancel.emit($event)\"\n (keyup.enter)=\"onCancel.emit($event)\"\n [disabled]=\"disabledCancel\"\n class=\"cancel\"\n >\n <ion-icon slot=\"start\" name=\"refresh\"></ion-icon>\n <ion-label>{{ cancelText | translate }}</ion-label>\n </ion-button>\n\n <!-- next -->\n <ion-button\n fill=\"solid\"\n *ngIf=\"showNext && onNext.observed\"\n (click)=\"onNext.emit($event)\"\n (keyup.enter)=\"onNext.emit($event)\"\n class=\"next\"\n >\n <ion-label>{{ nextText | translate }}</ion-label>\n <ion-icon slot=\"end\" name=\"arrow-forward\"></ion-icon>\n </ion-button>\n\n <!-- save -->\n @if (showSave && onSave.observed) {\n <ion-button\n [fill]=\"disabled ? 'clear' : 'solid'\"\n (click)=\"onSave.emit($event)\"\n (keyup.enter)=\"onSave.emit($event)\"\n [color]=\"saveButtonColor\"\n [disabled]=\"disabled\"\n [title]=\"!showTooltip ? ('COMMON.BTN_SAVE_WITH_SHORTCUT_HELP' | translate) : ''\"\n [matTooltip]=\"showTooltip ? ('COMMON.BTN_SAVE_WITH_SHORTCUT_HELP' | translate) : ''\"\n class=\"save\"\n >\n <ion-label>\n <span [innerHTML]=\"'COMMON.BTN_SAVE_WITH_SHORTCUT' | translate\"></span>\n </ion-label>\n </ion-button>\n }\n\n <ng-content select=\"[slot=afterSave]\"></ng-content>\n </ion-col>\n </ion-row>\n</ion-toolbar>\n", styles: [":host{width:100%}:host ion-toolbar{height:var(--app-form-buttons-bar-height);padding:0 6px}:host ion-col{padding:0}:host ion-col:has(ion-button){align-content:center}:host ion-col ion-button{margin-top:0;margin-bottom:0}\n"], dependencies: [{ kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i4.IonButton, selector: "ion-button", inputs: ["buttonType", "color", "disabled", "download", "expand", "fill", "form", "href", "mode", "rel", "routerAnimation", "routerDirection", "shape", "size", "strong", "target", "type"] }, { kind: "component", type: i4.IonCol, selector: "ion-col", inputs: ["offset", "offsetLg", "offsetMd", "offsetSm", "offsetXl", "offsetXs", "pull", "pullLg", "pullMd", "pullSm", "pullXl", "pullXs", "push", "pushLg", "pushMd", "pushSm", "pushXl", "pushXs", "size", "sizeLg", "sizeMd", "sizeSm", "sizeXl", "sizeXs"] }, { kind: "component", type: i4.IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }, { kind: "component", type: i4.IonLabel, selector: "ion-label", inputs: ["color", "mode", "position"] }, { kind: "component", type: i4.IonMenuToggle, selector: "ion-menu-toggle", inputs: ["autoHide", "menu"] }, { kind: "component", type: i4.IonRow, selector: "ion-row" }, { kind: "component", type: i4.IonToolbar, selector: "ion-toolbar", inputs: ["color", "mode"] }, { kind: "component", type: i5.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i6.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "directive", type: i7.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "pipe", type: i8.TranslatePipe, name: "translate" }] });
67
70
  }
68
71
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: FormButtonsBarComponent, decorators: [{
69
72
  type: Component,
70
- args: [{ selector: 'app-form-buttons-bar', providers: [{ provide: FormButtonsBarToken, useExisting: FormButtonsBarComponent }], template: "<ion-toolbar [class]=\"classList\">\n <ion-row class=\"ion-no-padding\" nowrap>\n <!-- show menu button -->\n <ion-col size=\"auto\" class=\"hidden-xs hidden-sm\">\n <ion-menu-toggle>\n <button\n mat-icon-button\n color=\"accent\"\n [title]=\"'COMMON.BTN_SHOW_MENU' | translate\"\n (click)=\"menu.toggleSplitPaneWhen()\"\n >\n <mat-icon><span>&#xbb;</span></mat-icon>\n </button>\n </ion-menu-toggle>\n </ion-col>\n\n <ion-col class=\"app-form-buttons-bar-content\">\n <ng-content></ng-content>\n </ion-col>\n\n <ion-col size=\"auto\" class=\"app-form-buttons-bar-buttons\">\n <ng-content select=\"[slot=end]\"></ng-content>\n\n <!-- back -->\n <ion-button\n fill=\"clear\"\n color=\"dark\"\n (click)=\"onBack.emit($event)\"\n (keyup.enter)=\"onBack.emit($event)\"\n *ngIf=\"showBack && onBack.observed\"\n class=\"back\"\n >\n <ion-label>{{ backText | translate }}</ion-label>\n </ion-button>\n\n <!-- cancel -->\n <ion-button\n fill=\"clear\"\n color=\"dark\"\n *ngIf=\"showCancel\"\n (click)=\"onCancel.emit($event)\"\n (keyup.enter)=\"onCancel.emit($event)\"\n [disabled]=\"disabledCancel\"\n class=\"cancel\"\n >\n <ion-icon slot=\"start\" name=\"refresh\"></ion-icon>\n <ion-label>{{ cancelText | translate }}</ion-label>\n </ion-button>\n\n <!-- next -->\n <ion-button\n fill=\"solid\"\n *ngIf=\"showNext && onNext.observed\"\n (click)=\"onNext.emit($event)\"\n (keyup.enter)=\"onNext.emit($event)\"\n class=\"next\"\n >\n <ion-label>{{ nextText | translate }}</ion-label>\n <ion-icon slot=\"end\" name=\"arrow-forward\"></ion-icon>\n </ion-button>\n\n <!-- save -->\n @if (showSave && onSave.observed) {\n <ion-button\n [fill]=\"disabled ? 'clear' : 'solid'\"\n (click)=\"onSave.emit($event)\"\n (keyup.enter)=\"onSave.emit($event)\"\n [color]=\"saveButtonColor\"\n [disabled]=\"disabled\"\n [title]=\"'COMMON.BTN_SAVE_WITH_SHORTCUT_HELP' | translate\"\n class=\"save\"\n >\n <ion-label>\n <span [innerHTML]=\"'COMMON.BTN_SAVE_WITH_SHORTCUT' | translate\"></span>\n </ion-label>\n </ion-button>\n }\n\n <ng-content select=\"[slot=afterSave]\"></ng-content>\n </ion-col>\n </ion-row>\n</ion-toolbar>\n", styles: [":host{width:100%}:host ion-toolbar{height:var(--app-form-buttons-bar-height);padding:0 6px}:host ion-col{padding:0}:host ion-col:has(ion-button){align-content:center}:host ion-col ion-button{margin-top:0;margin-bottom:0}\n"] }]
73
+ args: [{ selector: 'app-form-buttons-bar', providers: [{ provide: FormButtonsBarToken, useExisting: FormButtonsBarComponent }], template: "<ion-toolbar [class]=\"classList\">\n <ion-row class=\"ion-no-padding\" nowrap>\n <!-- show menu button -->\n <ion-col size=\"auto\" class=\"hidden-xs hidden-sm\">\n <ion-menu-toggle>\n <button\n mat-icon-button\n color=\"accent\"\n [title]=\"!showTooltip ? ('COMMON.BTN_SHOW_MENU' | translate) : ''\"\n [matTooltip]=\"showTooltip ? ('COMMON.BTN_SHOW_MENU' | translate) : ''\"\n (click)=\"menu.toggleSplitPaneWhen()\"\n >\n <mat-icon><span>&#xbb;</span></mat-icon>\n </button>\n </ion-menu-toggle>\n </ion-col>\n\n <ion-col class=\"app-form-buttons-bar-content\">\n <ng-content></ng-content>\n </ion-col>\n\n <ion-col size=\"auto\" class=\"app-form-buttons-bar-buttons\">\n <ng-content select=\"[slot=end]\"></ng-content>\n\n <!-- back -->\n <ion-button\n fill=\"clear\"\n color=\"dark\"\n (click)=\"onBack.emit($event)\"\n (keyup.enter)=\"onBack.emit($event)\"\n *ngIf=\"showBack && onBack.observed\"\n class=\"back\"\n >\n <ion-label>{{ backText | translate }}</ion-label>\n </ion-button>\n\n <!-- cancel -->\n <ion-button\n fill=\"clear\"\n color=\"dark\"\n *ngIf=\"showCancel\"\n (click)=\"onCancel.emit($event)\"\n (keyup.enter)=\"onCancel.emit($event)\"\n [disabled]=\"disabledCancel\"\n class=\"cancel\"\n >\n <ion-icon slot=\"start\" name=\"refresh\"></ion-icon>\n <ion-label>{{ cancelText | translate }}</ion-label>\n </ion-button>\n\n <!-- next -->\n <ion-button\n fill=\"solid\"\n *ngIf=\"showNext && onNext.observed\"\n (click)=\"onNext.emit($event)\"\n (keyup.enter)=\"onNext.emit($event)\"\n class=\"next\"\n >\n <ion-label>{{ nextText | translate }}</ion-label>\n <ion-icon slot=\"end\" name=\"arrow-forward\"></ion-icon>\n </ion-button>\n\n <!-- save -->\n @if (showSave && onSave.observed) {\n <ion-button\n [fill]=\"disabled ? 'clear' : 'solid'\"\n (click)=\"onSave.emit($event)\"\n (keyup.enter)=\"onSave.emit($event)\"\n [color]=\"saveButtonColor\"\n [disabled]=\"disabled\"\n [title]=\"!showTooltip ? ('COMMON.BTN_SAVE_WITH_SHORTCUT_HELP' | translate) : ''\"\n [matTooltip]=\"showTooltip ? ('COMMON.BTN_SAVE_WITH_SHORTCUT_HELP' | translate) : ''\"\n class=\"save\"\n >\n <ion-label>\n <span [innerHTML]=\"'COMMON.BTN_SAVE_WITH_SHORTCUT' | translate\"></span>\n </ion-label>\n </ion-button>\n }\n\n <ng-content select=\"[slot=afterSave]\"></ng-content>\n </ion-col>\n </ion-row>\n</ion-toolbar>\n", styles: [":host{width:100%}:host ion-toolbar{height:var(--app-form-buttons-bar-height);padding:0 6px}:host ion-col{padding:0}:host ion-col:has(ion-button){align-content:center}:host ion-col ion-button{margin-top:0;margin-bottom:0}\n"] }]
71
74
  }], ctorParameters: () => [{ type: i1.Hotkeys }, { type: i2.MenuService }], propDecorators: { disabled: [{
72
75
  type: Input
73
76
  }], disabledCancel: [{
@@ -105,4 +108,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
105
108
  }], onSaveAndNext: [{
106
109
  type: Output
107
110
  }] } });
108
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS1idXR0b25zLWJhci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBwL2NvcmUvZm9ybS9idXR0b25zL2Zvcm0tYnV0dG9ucy1iYXIuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9jb3JlL2Zvcm0vYnV0dG9ucy9mb3JtLWJ1dHRvbnMtYmFyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBYSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFbEYsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNwQyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxNQUFNLGdCQUFnQixDQUFDOzs7Ozs7Ozs7QUFJdEQsTUFBTSxPQUFnQixtQkFBbUI7Q0FLeEM7QUFRRCxNQUFNLE9BQU8sdUJBQXVCO0lBNEJ0QjtJQTNCSixhQUFhLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQztJQUVsQyxRQUFRLEdBQUcsS0FBSyxDQUFDO0lBQ2pCLGNBQWMsR0FBRyxLQUFLLENBQUM7SUFDdkIsY0FBYyxHQUFHLEtBQUssQ0FBQztJQUN2QixTQUFTLENBQVM7SUFFbEIsZUFBZSxHQUFxQixRQUFRLENBQUM7SUFFN0MsUUFBUSxHQUFHLGtCQUFrQixDQUFDO0lBQzlCLFVBQVUsR0FBRyxrQkFBa0IsQ0FBQztJQUNoQyxRQUFRLEdBQUcsaUJBQWlCLENBQUM7SUFFN0IsUUFBUSxHQUFHLElBQUksQ0FBQztJQUNoQixVQUFVLEdBQUcsSUFBSSxDQUFDO0lBQ2xCLFFBQVEsR0FBRyxJQUFJLENBQUM7SUFDaEIsUUFBUSxHQUFHLElBQUksQ0FBQztJQUVmLFFBQVEsR0FBRyxJQUFJLFlBQVksRUFBUyxDQUFDO0lBQ3JDLE1BQU0sR0FBRyxJQUFJLFlBQVks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QixFQUFFLENBQUM7c0dBSzFFLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csY0FBYztzQkFBdEIsS0FBSztnQkFDRyxjQUFjO3NCQUF0QixLQUFLO2dCQUNHLFNBQVM7c0JBQWpCLEtBQUs7Z0JBRUcsZUFBZTtzQkFBdkIsS0FBSztnQkFFRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBQ0csUUFBUTtzQkFBaEIsS0FBSztnQkFFRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBQ0csUUFBUTtzQkFBaEIsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUVJLFFBQVE7c0JBQWpCLE1BQU07Z0JBQ0csTUFBTTtzQkFBZixNQUFNO2dCQUNHLE1BQU07c0JBQWYsTUFBTTtnQkFDRyxNQUFNO3NCQUFmLE1BQU07Z0JBQ0csY0FBYztzQkFBdkIsTUFBTTtnQkFDRyxhQUFhO3NCQUF0QixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIElucHV0LCBPbkRlc3Ryb3ksIE91dHB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgSG90a2V5cyB9IGZyb20gJy4uLy4uLy4uL3NoYXJlZC9ob3RrZXlzL2hvdGtleXMuc2VydmljZSc7XG5pbXBvcnQgeyBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGRlYm91bmNlVGltZSwgZmlsdGVyIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgTWVudVNlcnZpY2UgfSBmcm9tICcuLi8uLi9tZW51L21lbnUuc2VydmljZSc7XG5pbXBvcnQgeyBQcmVkZWZpbmVkQ29sb3JzIH0gZnJvbSAnQGlvbmljL2NvcmUnO1xuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgRm9ybUJ1dHRvbnNCYXJUb2tlbiB7XG4gIGFic3RyYWN0IG9uQ2FuY2VsOiBFdmVudEVtaXR0ZXI8RXZlbnQ+O1xuICBhYnN0cmFjdCBvblNhdmU6IEV2ZW50RW1pdHRlcjxFdmVudD47XG4gIGFic3RyYWN0IG9uTmV4dDogRXZlbnRFbWl0dGVyPEV2ZW50PjtcbiAgYWJzdHJhY3Qgb25CYWNrOiBFdmVudEVtaXR0ZXI8RXZlbnQ+O1xufVxuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdhcHAtZm9ybS1idXR0b25zLWJhcicsXG4gIHRlbXBsYXRlVXJsOiAnLi9mb3JtLWJ1dHRvbnMtYmFyLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vZm9ybS1idXR0b25zLWJhci5jb21wb25lbnQuc2NzcyddLFxuICBwcm92aWRlcnM6IFt7IHByb3ZpZGU6IEZvcm1CdXR0b25zQmFyVG9rZW4sIHVzZUV4aXN0aW5nOiBGb3JtQnV0dG9uc0JhckNvbXBvbmVudCB9XSxcbn0pXG5leHBvcnQgY2xhc3MgRm9ybUJ1dHRvbnNCYXJDb21wb25lbnQgaW1wbGVtZW50cyBGb3JtQnV0dG9uc0JhclRva2VuLCBPbkRlc3Ryb3kge1xuICBwcml2YXRlIF9zdWJzY3JpcHRpb24gPSBuZXcgU3Vic2NyaXB0aW9uKCk7XG5cbiAgQElucHV0KCkgZGlzYWJsZWQgPSBmYWxzZTtcbiAgQElucHV0KCkgZGlzYWJsZWRDYW5jZWwgPSBmYWxzZTtcbiAgQElucHV0KCkgZGlzYWJsZWRFc2NhcGUgPSBmYWxzZTtcbiAgQElucHV0KCkgY2xhc3NMaXN0OiBzdHJpbmc7XG5cbiAgQElucHV0KCkgc2F2ZUJ1dHRvbkNvbG9yOiBQcmVkZWZpbmVkQ29sb3JzID0gJ2Rhbmdlcic7XG5cbiAgQElucHV0KCkgYmFja1RleHQgPSAnQ09NTU9OLkJUTl9DTE9TRSc7XG4gIEBJbnB1dCgpIGNhbmNlbFRleHQgPSAnQ09NTU9OLkJUTl9SRVNFVCc7XG4gIEBJbnB1dCgpIG5leHRUZXh0ID0gJ0NPTU1PTi5CVE5fTkVYVCc7XG5cbiAgQElucHV0KCkgc2hvd0JhY2sgPSB0cnVlO1xuICBASW5wdXQoKSBzaG93Q2FuY2VsID0gdHJ1ZTtcbiAgQElucHV0KCkgc2hvd05leHQgPSB0cnVlO1xuICBASW5wdXQoKSBzaG93U2F2ZSA9IHRydWU7XG5cbiAgQE91dHB1dCgpIG9uQ2FuY2VsID0gbmV3IEV2ZW50RW1pdHRlcjxFdmVudD4oKTtcbiAgQE91dHB1dCgpIG9uU2F2ZSA9IG5ldyBFdmVudEVtaXR0ZXI8RXZlbnQ+KCk7XG4gIEBPdXRwdXQoKSBvbk5leHQgPSBuZXcgRXZlbnRFbWl0dGVyPEV2ZW50PigpO1xuICBAT3V0cHV0KCkgb25CYWNrID0gbmV3IEV2ZW50RW1pdHRlcjxFdmVudD4oKTtcbiAgQE91dHB1dCgpIG9uU2F2ZUFuZENsb3NlID0gbmV3IEV2ZW50RW1pdHRlcjxFdmVudD4oKTtcbiAgQE91dHB1dCgpIG9uU2F2ZUFuZE5leHQgPSBuZXcgRXZlbnRFbWl0dGVyPEV2ZW50PigpO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIGhvdGtleXM6IEhvdGtleXMsXG4gICAgcHJvdGVjdGVkIG1lbnU6IE1lbnVTZXJ2aWNlXG4gICkge1xuICAgIC8vIEN0cmwrU1xuICAgIHRoaXMuX3N1YnNjcmlwdGlvbi5hZGQoXG4gICAgICBob3RrZXlzXG4gICAgICAgIC5hZGRTaG9ydGN1dCh7IGtleXM6IGAke2hvdGtleXMuZGVmYXVsdENvbnRyb2xLZXl9LnNgLCBkZXNjcmlwdGlvbjogJ0NPTU1PTi5CVE5fU0FWRScgfSlcbiAgICAgICAgLnBpcGUoZmlsdGVyKChfKSA9PiAhdGhpcy5kaXNhYmxlZCkpXG4gICAgICAgIC5zdWJzY3JpYmUoKGV2ZW50KSA9PiB0aGlzLm9uU2F2ZS5lbWl0KGV2ZW50KSlcbiAgICApO1xuXG4gICAgLy8gQ3RybCtaXG4gICAgdGhpcy5fc3Vic2NyaXB0aW9uLmFkZChcbiAgICAgIGhvdGtleXNcbiAgICAgICAgLmFkZFNob3J0Y3V0KHsga2V5czogYCR7aG90a2V5cy5kZWZhdWx0Q29udHJvbEtleX0uemAsIGRlc2NyaXB0aW9uOiAnQ09NTU9OLkJUTl9SRVNFVCcgfSlcbiAgICAgICAgLnBpcGUoZmlsdGVyKChfKSA9PiAhdGhpcy5kaXNhYmxlZCAmJiAhdGhpcy5kaXNhYmxlZENhbmNlbCkpXG4gICAgICAgIC5zdWJzY3JpYmUoKGV2ZW50KSA9PiB0aGlzLm9uQ2FuY2VsLmVtaXQoZXZlbnQpKVxuICAgICk7XG5cbiAgICAvLyBFc2NhcGVcbiAgICB0aGlzLl9zdWJzY3JpcHRpb24uYWRkKFxuICAgICAgaG90a2V5c1xuICAgICAgICAuYWRkU2hvcnRjdXQoeyBrZXlzOiAnZXNjYXBlJywgZGVzY3JpcHRpb246ICdDT01NT04uQlROX0NMT1NFJywgcHJldmVudERlZmF1bHQ6IGZhbHNlIH0pXG4gICAgICAgIC5waXBlKFxuICAgICAgICAgIGRlYm91bmNlVGltZSgxMDApLCAvLyBBbGxvdyBvdGhlciBjb21wb25lbnRzIHRvIG1hbmFnZSB0aGUgZXZlbnRcbiAgICAgICAgICBmaWx0ZXIoKGUpID0+IHRoaXMuc2hvd0JhY2sgJiYgIWUuZGVmYXVsdFByZXZlbnRlZCAmJiAhdGhpcy5kaXNhYmxlZEVzY2FwZSlcbiAgICAgICAgICAvL3RhcCgoKSA9PiBjb25zb2xlLmRlYnVnKCdbZm9ybS1idXR0b25zLWJhcl0gRW1pdCBiYWNrIGV2ZW50IChrZXlkb3duLmVzY2FwZSknKSlcbiAgICAgICAgKVxuICAgICAgICAuc3Vic2NyaWJlKChldmVudCkgPT4gdGhpcy5vbkJhY2suZW1pdChldmVudCkpXG4gICAgKTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuX3N1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMub25DYW5jZWwuY29tcGxldGUoKTtcbiAgICB0aGlzLm9uU2F2ZS5jb21wbGV0ZSgpO1xuICAgIHRoaXMub25OZXh0LmNvbXBsZXRlKCk7XG4gICAgdGhpcy5vbkJhY2suY29tcGxldGUoKTtcbiAgICB0aGlzLm9uU2F2ZUFuZE5leHQuY29tcGxldGUoKTtcbiAgICB0aGlzLm9uU2F2ZUFuZENsb3NlLmNvbXBsZXRlKCk7XG4gIH1cbn1cbiIsIjxpb24tdG9vbGJhciBbY2xhc3NdPVwiY2xhc3NMaXN0XCI+XG4gIDxpb24tcm93IGNsYXNzPVwiaW9uLW5vLXBhZGRpbmdcIiBub3dyYXA+XG4gICAgPCEtLSBzaG93IG1lbnUgYnV0dG9uIC0tPlxuICAgIDxpb24tY29sIHNpemU9XCJhdXRvXCIgY2xhc3M9XCJoaWRkZW4teHMgaGlkZGVuLXNtXCI+XG4gICAgICA8aW9uLW1lbnUtdG9nZ2xlPlxuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgbWF0LWljb24tYnV0dG9uXG4gICAgICAgICAgY29sb3I9XCJhY2NlbnRcIlxuICAgICAgICAgIFt0aXRsZV09XCInQ09NTU9OLkJUTl9TSE9XX01FTlUnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAoY2xpY2spPVwibWVudS50b2dnbGVTcGxpdFBhbmVXaGVuKClcIlxuICAgICAgICA+XG4gICAgICAgICAgPG1hdC1pY29uPjxzcGFuPiYjeGJiOzwvc3Bhbj48L21hdC1pY29uPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIDwvaW9uLW1lbnUtdG9nZ2xlPlxuICAgIDwvaW9uLWNvbD5cblxuICAgIDxpb24tY29sIGNsYXNzPVwiYXBwLWZvcm0tYnV0dG9ucy1iYXItY29udGVudFwiPlxuICAgICAgPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PlxuICAgIDwvaW9uLWNvbD5cblxuICAgIDxpb24tY29sIHNpemU9XCJhdXRvXCIgY2xhc3M9XCJhcHAtZm9ybS1idXR0b25zLWJhci1idXR0b25zXCI+XG4gICAgICA8bmctY29udGVudCBzZWxlY3Q9XCJbc2xvdD1lbmRdXCI+PC9uZy1jb250ZW50PlxuXG4gICAgICA8IS0tIGJhY2sgLS0+XG4gICAgICA8aW9uLWJ1dHRvblxuICAgICAgICBmaWxsPVwiY2xlYXJcIlxuICAgICAgICBjb2xvcj1cImRhcmtcIlxuICAgICAgICAoY2xpY2spPVwib25CYWNrLmVtaXQoJGV2ZW50KVwiXG4gICAgICAgIChrZXl1cC5lbnRlcik9XCJvbkJhY2suZW1pdCgkZXZlbnQpXCJcbiAgICAgICAgKm5nSWY9XCJzaG93QmFjayAmJiBvbkJhY2sub2JzZXJ2ZWRcIlxuICAgICAgICBjbGFzcz1cImJhY2tcIlxuICAgICAgPlxuICAgICAgICA8aW9uLWxhYmVsPnt7IGJhY2tUZXh0IHwgdHJhbnNsYXRlIH19PC9pb24tbGFiZWw+XG4gICAgICA8L2lvbi1idXR0b24+XG5cbiAgICAgIDwhLS0gY2FuY2VsIC0tPlxuICAgICAgPGlvbi1idXR0b25cbiAgICAgICAgZmlsbD1cImNsZWFyXCJcbiAgICAgICAgY29sb3I9XCJkYXJrXCJcbiAgICAgICAgKm5nSWY9XCJzaG93Q2FuY2VsXCJcbiAgICAgICAgKGNsaWNrKT1cIm9uQ2FuY2VsLmVtaXQoJGV2ZW50KVwiXG4gICAgICAgIChrZXl1cC5lbnRlcik9XCJvbkNhbmNlbC5lbWl0KCRldmVudClcIlxuICAgICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRDYW5jZWxcIlxuICAgICAgICBjbGFzcz1cImNhbmNlbFwiXG4gICAgICA+XG4gICAgICAgIDxpb24taWNvbiBzbG90PVwic3RhcnRcIiBuYW1lPVwicmVmcmVzaFwiPjwvaW9uLWljb24+XG4gICAgICAgIDxpb24tbGFiZWw+e3sgY2FuY2VsVGV4dCB8IHRyYW5zbGF0ZSB9fTwvaW9uLWxhYmVsPlxuICAgICAgPC9pb24tYnV0dG9uPlxuXG4gICAgICA8IS0tIG5leHQgLS0+XG4gICAgICA8aW9uLWJ1dHRvblxuICAgICAgICBmaWxsPVwic29saWRcIlxuICAgICAgICAqbmdJZj1cInNob3dOZXh0ICYmIG9uTmV4dC5vYnNlcnZlZFwiXG4gICAgICAgIChjbGljayk9XCJvbk5leHQuZW1pdCgkZXZlbnQpXCJcbiAgICAgICAgKGtleXVwLmVudGVyKT1cIm9uTmV4dC5lbWl0KCRldmVudClcIlxuICAgICAgICBjbGFzcz1cIm5leHRcIlxuICAgICAgPlxuICAgICAgICA8aW9uLWxhYmVsPnt7IG5leHRUZXh0IHwgdHJhbnNsYXRlIH19PC9pb24tbGFiZWw+XG4gICAgICAgIDxpb24taWNvbiBzbG90PVwiZW5kXCIgbmFtZT1cImFycm93LWZvcndhcmRcIj48L2lvbi1pY29uPlxuICAgICAgPC9pb24tYnV0dG9uPlxuXG4gICAgICA8IS0tIHNhdmUgLS0+XG4gICAgICBAaWYgKHNob3dTYXZlICYmIG9uU2F2ZS5vYnNlcnZlZCkge1xuICAgICAgICA8aW9uLWJ1dHRvblxuICAgICAgICAgIFtmaWxsXT1cImRpc2FibGVkID8gJ2NsZWFyJyA6ICdzb2xpZCdcIlxuICAgICAgICAgIChjbGljayk9XCJvblNhdmUuZW1pdCgkZXZlbnQpXCJcbiAgICAgICAgICAoa2V5dXAuZW50ZXIpPVwib25TYXZlLmVtaXQoJGV2ZW50KVwiXG4gICAgICAgICAgW2NvbG9yXT1cInNhdmVCdXR0b25Db2xvclwiXG4gICAgICAgICAgW2Rpc2FibGVkXT1cImRpc2FibGVkXCJcbiAgICAgICAgICBbdGl0bGVdPVwiJ0NPTU1PTi5CVE5fU0FWRV9XSVRIX1NIT1JUQ1VUX0hFTFAnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICBjbGFzcz1cInNhdmVcIlxuICAgICAgICA+XG4gICAgICAgICAgPGlvbi1sYWJlbD5cbiAgICAgICAgICAgIDxzcGFuIFtpbm5lckhUTUxdPVwiJ0NPTU1PTi5CVE5fU0FWRV9XSVRIX1NIT1JUQ1VUJyB8IHRyYW5zbGF0ZVwiPjwvc3Bhbj5cbiAgICAgICAgICA8L2lvbi1sYWJlbD5cbiAgICAgICAgPC9pb24tYnV0dG9uPlxuICAgICAgfVxuXG4gICAgICA8bmctY29udGVudCBzZWxlY3Q9XCJbc2xvdD1hZnRlclNhdmVdXCI+PC9uZy1jb250ZW50PlxuICAgIDwvaW9uLWNvbD5cbiAgPC9pb24tcm93PlxuPC9pb24tdG9vbGJhcj5cbiJdfQ==
111
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS1idXR0b25zLWJhci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBwL2NvcmUvZm9ybS9idXR0b25zL2Zvcm0tYnV0dG9ucy1iYXIuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9jb3JlL2Zvcm0vYnV0dG9ucy9mb3JtLWJ1dHRvbnMtYmFyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQWEsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRTFGLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDcEMsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUl0RCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7Ozs7Ozs7Ozs7QUFFekQsTUFBTSxPQUFnQixtQkFBbUI7Q0FLeEM7QUFRRCxNQUFNLE9BQU8sdUJBQXVCO0lBOEJ0QjtJQTdCSixhQUFhLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQztJQUVsQyxRQUFRLEdBQUcsS0FBSyxDQUFDO0lBQ2pCLGNBQWMsR0FBRyxLQUFLLENBQUM7SUFDdkIsY0FBYyxHQUFHLEtBQUssQ0FBQztJQUN2QixTQUFTLENBQVM7SUFFbEIsZUFBZSxHQUFxQixRQUFRLENBQUM7SUFFN0MsUUFBUSxHQUFHLGtCQUFrQixDQUFDO0lBQzlCLFVBQVUsR0FBRyxrQkFBa0IsQ0FBQztJQUNoQyxRQUFRLEdBQUcsaUJBQWlCLENBQUM7SUFFN0IsUUFBUSxHQUFHLElBQUksQ0FBQztJQUNoQixVQUFVLEdBQUcsSUFBSSxDQUFDO0lBQ2xCLFFBQVEsR0FBRyxJQUFJLENBQUM7SUFDaEIsUUFBUSxHQUFHLElBQUksQ0FBQztJQUVmLFFB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dUZBb0ZBOzs0RkQ5RGEsdUJBQXVCO2tCQU5uQyxTQUFTOytCQUNFLHNCQUFzQixhQUdyQixDQUFDLEVBQUUsT0FBTyxFQUFFLG1CQUFtQixFQUFFLFdBQVcseUJBQXlCLEVBQUUsQ0FBQztzR0FLMUUsUUFBUTtzQkFBaEIsS0FBSztnQkFDRyxjQUFjO3NCQUF0QixLQUFLO2dCQUNHLGNBQWM7c0JBQXRCLEtBQUs7Z0JBQ0csU0FBUztzQkFBakIsS0FBSztnQkFFRyxlQUFlO3NCQUF2QixLQUFLO2dCQUVHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csVUFBVTtzQkFBbEIsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUVHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csVUFBVTtzQkFBbEIsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBRUksUUFBUTtzQkFBakIsTUFBTTtnQkFDRyxNQUFNO3NCQUFmLE1BQU07Z0JBQ0csTUFBTTtzQkFBZixNQUFNO2dCQUNHLE1BQU07c0JBQWYsTUFBTTtnQkFDRyxjQUFjO3NCQUF2QixNQUFNO2dCQUNHLGFBQWE7c0JBQXRCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgaW5qZWN0LCBJbnB1dCwgT25EZXN0cm95LCBPdXRwdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEhvdGtleXMgfSBmcm9tICcuLi8uLi8uLi9zaGFyZWQvaG90a2V5cy9ob3RrZXlzLnNlcnZpY2UnO1xuaW1wb3J0IHsgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBkZWJvdW5jZVRpbWUsIGZpbHRlciB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IE1lbnVTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vbWVudS9tZW51LnNlcnZpY2UnO1xuaW1wb3J0IHsgUHJlZGVmaW5lZENvbG9ycyB9IGZyb20gJ0Bpb25pYy9jb3JlJztcblxuaW1wb3J0IHsgU0hPV19UT09MVElQIH0gZnJvbSAnLi4vLi4vLi4vc2hhcmVkL2NvbnN0YW50cyc7XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBGb3JtQnV0dG9uc0JhclRva2VuIHtcbiAgYWJzdHJhY3Qgb25DYW5jZWw6IEV2ZW50RW1pdHRlcjxFdmVudD47XG4gIGFic3RyYWN0IG9uU2F2ZTogRXZlbnRFbWl0dGVyPEV2ZW50PjtcbiAgYWJzdHJhY3Qgb25OZXh0OiBFdmVudEVtaXR0ZXI8RXZlbnQ+O1xuICBhYnN0cmFjdCBvbkJhY2s6IEV2ZW50RW1pdHRlcjxFdmVudD47XG59XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2FwcC1mb3JtLWJ1dHRvbnMtYmFyJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2Zvcm0tYnV0dG9ucy1iYXIuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9mb3JtLWJ1dHRvbnMtYmFyLmNvbXBvbmVudC5zY3NzJ10sXG4gIHByb3ZpZGVyczogW3sgcHJvdmlkZTogRm9ybUJ1dHRvbnNCYXJUb2tlbiwgdXNlRXhpc3Rpbmc6IEZvcm1CdXR0b25zQmFyQ29tcG9uZW50IH1dLFxufSlcbmV4cG9ydCBjbGFzcyBGb3JtQnV0dG9uc0JhckNvbXBvbmVudCBpbXBsZW1lbnRzIEZvcm1CdXR0b25zQmFyVG9rZW4sIE9uRGVzdHJveSB7XG4gIHByaXZhdGUgX3N1YnNjcmlwdGlvbiA9IG5ldyBTdWJzY3JpcHRpb24oKTtcblxuICBASW5wdXQoKSBkaXNhYmxlZCA9IGZhbHNlO1xuICBASW5wdXQoKSBkaXNhYmxlZENhbmNlbCA9IGZhbHNlO1xuICBASW5wdXQoKSBkaXNhYmxlZEVzY2FwZSA9IGZhbHNlO1xuICBASW5wdXQoKSBjbGFzc0xpc3Q6IHN0cmluZztcblxuICBASW5wdXQoKSBzYXZlQnV0dG9uQ29sb3I6IFByZWRlZmluZWRDb2xvcnMgPSAnZGFuZ2VyJztcblxuICBASW5wdXQoKSBiYWNrVGV4dCA9ICdDT01NT04uQlROX0NMT1NFJztcbiAgQElucHV0KCkgY2FuY2VsVGV4dCA9ICdDT01NT04uQlROX1JFU0VUJztcbiAgQElucHV0KCkgbmV4dFRleHQgPSAnQ09NTU9OLkJUTl9ORVhUJztcblxuICBASW5wdXQoKSBzaG93QmFjayA9IHRydWU7XG4gIEBJbnB1dCgpIHNob3dDYW5jZWwgPSB0cnVlO1xuICBASW5wdXQoKSBzaG93TmV4dCA9IHRydWU7XG4gIEBJbnB1dCgpIHNob3dTYXZlID0gdHJ1ZTtcblxuICBAT3V0cHV0KCkgb25DYW5jZWwgPSBuZXcgRXZlbnRFbWl0dGVyPEV2ZW50PigpO1xuICBAT3V0cHV0KCkgb25TYXZlID0gbmV3IEV2ZW50RW1pdHRlcjxFdmVudD4oKTtcbiAgQE91dHB1dCgpIG9uTmV4dCA9IG5ldyBFdmVudEVtaXR0ZXI8RXZlbnQ+KCk7XG4gIEBPdXRwdXQoKSBvbkJhY2sgPSBuZXcgRXZlbnRFbWl0dGVyPEV2ZW50PigpO1xuICBAT3V0cHV0KCkgb25TYXZlQW5kQ2xvc2UgPSBuZXcgRXZlbnRFbWl0dGVyPEV2ZW50PigpO1xuICBAT3V0cHV0KCkgb25TYXZlQW5kTmV4dCA9IG5ldyBFdmVudEVtaXR0ZXI8RXZlbnQ+KCk7XG5cbiAgc2hvd1Rvb2x0aXAgPSBpbmplY3QoU0hPV19UT09MVElQKTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBob3RrZXlzOiBIb3RrZXlzLFxuICAgIHByb3RlY3RlZCBtZW51OiBNZW51U2VydmljZVxuICApIHtcbiAgICAvLyBDdHJsK1NcbiAgICB0aGlzLl9zdWJzY3JpcHRpb24uYWRkKFxuICAgICAgaG90a2V5c1xuICAgICAgICAuYWRkU2hvcnRjdXQoeyBrZXlzOiBgJHtob3RrZXlzLmRlZmF1bHRDb250cm9sS2V5fS5zYCwgZGVzY3JpcHRpb246ICdDT01NT04uQlROX1NBVkUnIH0pXG4gICAgICAgIC5waXBlKGZpbHRlcigoXykgPT4gIXRoaXMuZGlzYWJsZWQpKVxuICAgICAgICAuc3Vic2NyaWJlKChldmVudCkgPT4gdGhpcy5vblNhdmUuZW1pdChldmVudCkpXG4gICAgKTtcblxuICAgIC8vIEN0cmwrWlxuICAgIHRoaXMuX3N1YnNjcmlwdGlvbi5hZGQoXG4gICAgICBob3RrZXlzXG4gICAgICAgIC5hZGRTaG9ydGN1dCh7IGtleXM6IGAke2hvdGtleXMuZGVmYXVsdENvbnRyb2xLZXl9LnpgLCBkZXNjcmlwdGlvbjogJ0NPTU1PTi5CVE5fUkVTRVQnIH0pXG4gICAgICAgIC5waXBlKGZpbHRlcigoXykgPT4gIXRoaXMuZGlzYWJsZWQgJiYgIXRoaXMuZGlzYWJsZWRDYW5jZWwpKVxuICAgICAgICAuc3Vic2NyaWJlKChldmVudCkgPT4gdGhpcy5vbkNhbmNlbC5lbWl0KGV2ZW50KSlcbiAgICApO1xuXG4gICAgLy8gRXNjYXBlXG4gICAgdGhpcy5fc3Vic2NyaXB0aW9uLmFkZChcbiAgICAgIGhvdGtleXNcbiAgICAgICAgLmFkZFNob3J0Y3V0KHsga2V5czogJ2VzY2FwZScsIGRlc2NyaXB0aW9uOiAnQ09NTU9OLkJUTl9DTE9TRScsIHByZXZlbnREZWZhdWx0OiBmYWxzZSB9KVxuICAgICAgICAucGlwZShcbiAgICAgICAgICBkZWJvdW5jZVRpbWUoMTAwKSwgLy8gQWxsb3cgb3RoZXIgY29tcG9uZW50cyB0byBtYW5hZ2UgdGhlIGV2ZW50XG4gICAgICAgICAgZmlsdGVyKChlKSA9PiB0aGlzLnNob3dCYWNrICYmICFlLmRlZmF1bHRQcmV2ZW50ZWQgJiYgIXRoaXMuZGlzYWJsZWRFc2NhcGUpXG4gICAgICAgICAgLy90YXAoKCkgPT4gY29uc29sZS5kZWJ1ZygnW2Zvcm0tYnV0dG9ucy1iYXJdIEVtaXQgYmFjayBldmVudCAoa2V5ZG93bi5lc2NhcGUpJykpXG4gICAgICAgIClcbiAgICAgICAgLnN1YnNjcmliZSgoZXZlbnQpID0+IHRoaXMub25CYWNrLmVtaXQoZXZlbnQpKVxuICAgICk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLl9zdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICB0aGlzLm9uQ2FuY2VsLmNvbXBsZXRlKCk7XG4gICAgdGhpcy5vblNhdmUuY29tcGxldGUoKTtcbiAgICB0aGlzLm9uTmV4dC5jb21wbGV0ZSgpO1xuICAgIHRoaXMub25CYWNrLmNvbXBsZXRlKCk7XG4gICAgdGhpcy5vblNhdmVBbmROZXh0LmNvbXBsZXRlKCk7XG4gICAgdGhpcy5vblNhdmVBbmRDbG9zZS5jb21wbGV0ZSgpO1xuICB9XG59XG4iLCI8aW9uLXRvb2xiYXIgW2NsYXNzXT1cImNsYXNzTGlzdFwiPlxuICA8aW9uLXJvdyBjbGFzcz1cImlvbi1uby1wYWRkaW5nXCIgbm93cmFwPlxuICAgIDwhLS0gc2hvdyBtZW51IGJ1dHRvbiAtLT5cbiAgICA8aW9uLWNvbCBzaXplPVwiYXV0b1wiIGNsYXNzPVwiaGlkZGVuLXhzIGhpZGRlbi1zbVwiPlxuICAgICAgPGlvbi1tZW51LXRvZ2dsZT5cbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgIG1hdC1pY29uLWJ1dHRvblxuICAgICAgICAgIGNvbG9yPVwiYWNjZW50XCJcbiAgICAgICAgICBbdGl0bGVdPVwiIXNob3dUb29sdGlwID8gKCdDT01NT04uQlROX1NIT1dfTUVOVScgfCB0cmFuc2xhdGUpIDogJydcIlxuICAgICAgICAgIFttYXRUb29sdGlwXT1cInNob3dUb29sdGlwID8gKCdDT01NT04uQlROX1NIT1dfTUVOVScgfCB0cmFuc2xhdGUpIDogJydcIlxuICAgICAgICAgIChjbGljayk9XCJtZW51LnRvZ2dsZVNwbGl0UGFuZVdoZW4oKVwiXG4gICAgICAgID5cbiAgICAgICAgICA8bWF0LWljb24+PHNwYW4+JiN4YmI7PC9zcGFuPjwvbWF0LWljb24+XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgPC9pb24tbWVudS10b2dnbGU+XG4gICAgPC9pb24tY29sPlxuXG4gICAgPGlvbi1jb2wgY2xhc3M9XCJhcHAtZm9ybS1idXR0b25zLWJhci1jb250ZW50XCI+XG4gICAgICA8bmctY29udGVudD48L25nLWNvbnRlbnQ+XG4gICAgPC9pb24tY29sPlxuXG4gICAgPGlvbi1jb2wgc2l6ZT1cImF1dG9cIiBjbGFzcz1cImFwcC1mb3JtLWJ1dHRvbnMtYmFyLWJ1dHRvbnNcIj5cbiAgICAgIDxuZy1jb250ZW50IHNlbGVjdD1cIltzbG90PWVuZF1cIj48L25nLWNvbnRlbnQ+XG5cbiAgICAgIDwhLS0gYmFjayAtLT5cbiAgICAgIDxpb24tYnV0dG9uXG4gICAgICAgIGZpbGw9XCJjbGVhclwiXG4gICAgICAgIGNvbG9yPVwiZGFya1wiXG4gICAgICAgIChjbGljayk9XCJvbkJhY2suZW1pdCgkZXZlbnQpXCJcbiAgICAgICAgKGtleXVwLmVudGVyKT1cIm9uQmFjay5lbWl0KCRldmVudClcIlxuICAgICAgICAqbmdJZj1cInNob3dCYWNrICYmIG9uQmFjay5vYnNlcnZlZFwiXG4gICAgICAgIGNsYXNzPVwiYmFja1wiXG4gICAgICA+XG4gICAgICAgIDxpb24tbGFiZWw+e3sgYmFja1RleHQgfCB0cmFuc2xhdGUgfX08L2lvbi1sYWJlbD5cbiAgICAgIDwvaW9uLWJ1dHRvbj5cblxuICAgICAgPCEtLSBjYW5jZWwgLS0+XG4gICAgICA8aW9uLWJ1dHRvblxuICAgICAgICBmaWxsPVwiY2xlYXJcIlxuICAgICAgICBjb2xvcj1cImRhcmtcIlxuICAgICAgICAqbmdJZj1cInNob3dDYW5jZWxcIlxuICAgICAgICAoY2xpY2spPVwib25DYW5jZWwuZW1pdCgkZXZlbnQpXCJcbiAgICAgICAgKGtleXVwLmVudGVyKT1cIm9uQ2FuY2VsLmVtaXQoJGV2ZW50KVwiXG4gICAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZENhbmNlbFwiXG4gICAgICAgIGNsYXNzPVwiY2FuY2VsXCJcbiAgICAgID5cbiAgICAgICAgPGlvbi1pY29uIHNsb3Q9XCJzdGFydFwiIG5hbWU9XCJyZWZyZXNoXCI+PC9pb24taWNvbj5cbiAgICAgICAgPGlvbi1sYWJlbD57eyBjYW5jZWxUZXh0IHwgdHJhbnNsYXRlIH19PC9pb24tbGFiZWw+XG4gICAgICA8L2lvbi1idXR0b24+XG5cbiAgICAgIDwhLS0gbmV4dCAtLT5cbiAgICAgIDxpb24tYnV0dG9uXG4gICAgICAgIGZpbGw9XCJzb2xpZFwiXG4gICAgICAgICpuZ0lmPVwic2hvd05leHQgJiYgb25OZXh0Lm9ic2VydmVkXCJcbiAgICAgICAgKGNsaWNrKT1cIm9uTmV4dC5lbWl0KCRldmVudClcIlxuICAgICAgICAoa2V5dXAuZW50ZXIpPVwib25OZXh0LmVtaXQoJGV2ZW50KVwiXG4gICAgICAgIGNsYXNzPVwibmV4dFwiXG4gICAgICA+XG4gICAgICAgIDxpb24tbGFiZWw+e3sgbmV4dFRleHQgfCB0cmFuc2xhdGUgfX08L2lvbi1sYWJlbD5cbiAgICAgICAgPGlvbi1pY29uIHNsb3Q9XCJlbmRcIiBuYW1lPVwiYXJyb3ctZm9yd2FyZFwiPjwvaW9uLWljb24+XG4gICAgICA8L2lvbi1idXR0b24+XG5cbiAgICAgIDwhLS0gc2F2ZSAtLT5cbiAgICAgIEBpZiAoc2hvd1NhdmUgJiYgb25TYXZlLm9ic2VydmVkKSB7XG4gICAgICAgIDxpb24tYnV0dG9uXG4gICAgICAgICAgW2ZpbGxdPVwiZGlzYWJsZWQgPyAnY2xlYXInIDogJ3NvbGlkJ1wiXG4gICAgICAgICAgKGNsaWNrKT1cIm9uU2F2ZS5lbWl0KCRldmVudClcIlxuICAgICAgICAgIChrZXl1cC5lbnRlcik9XCJvblNhdmUuZW1pdCgkZXZlbnQpXCJcbiAgICAgICAgICBbY29sb3JdPVwic2F2ZUJ1dHRvbkNvbG9yXCJcbiAgICAgICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxuICAgICAgICAgIFt0aXRsZV09XCIhc2hvd1Rvb2x0aXAgPyAoJ0NPTU1PTi5CVE5fU0FWRV9XSVRIX1NIT1JUQ1VUX0hFTFAnIHwgdHJhbnNsYXRlKSA6ICcnXCJcbiAgICAgICAgICBbbWF0VG9vbHRpcF09XCJzaG93VG9vbHRpcCA/ICgnQ09NTU9OLkJUTl9TQVZFX1dJVEhfU0hPUlRDVVRfSEVMUCcgfCB0cmFuc2xhdGUpIDogJydcIlxuICAgICAgICAgIGNsYXNzPVwic2F2ZVwiXG4gICAgICAgID5cbiAgICAgICAgICA8aW9uLWxhYmVsPlxuICAgICAgICAgICAgPHNwYW4gW2lubmVySFRNTF09XCInQ09NTU9OLkJUTl9TQVZFX1dJVEhfU0hPUlRDVVQnIHwgdHJhbnNsYXRlXCI+PC9zcGFuPlxuICAgICAgICAgIDwvaW9uLWxhYmVsPlxuICAgICAgICA8L2lvbi1idXR0b24+XG4gICAgICB9XG5cbiAgICAgIDxuZy1jb250ZW50IHNlbGVjdD1cIltzbG90PWFmdGVyU2F2ZV1cIj48L25nLWNvbnRlbnQ+XG4gICAgPC9pb24tY29sPlxuICA8L2lvbi1yb3c+XG48L2lvbi10b29sYmFyPlxuIl19
@@ -1,4 +1,4 @@
1
- import { ChangeDetectionStrategy, Component, EventEmitter, Input, Optional, Output } from '@angular/core';
1
+ import { ChangeDetectionStrategy, Component, EventEmitter, inject, Input, Optional, Output } from '@angular/core';
2
2
  import { Validators } from '@angular/forms';
3
3
  import { referentialToString } from '../../services/model/referential.model';
4
4
  import { isNil } from '../../../shared/functions';
@@ -6,6 +6,7 @@ import { AppForm } from '../form.class';
6
6
  import { AppFormUtils } from '../form.utils';
7
7
  import { SelectionModel } from '@angular/cdk/collections';
8
8
  import { FormArrayHelper } from '../array/form-array';
9
+ import { SHOW_TOOLTIP } from '../../../shared/constants';
9
10
  import * as i0 from "@angular/core";
10
11
  import * as i1 from "@angular/forms";
11
12
  import * as i2 from "@angular/material/core";
@@ -13,7 +14,8 @@ import * as i3 from "../../services/local-settings.service";
13
14
  import * as i4 from "@angular/common";
14
15
  import * as i5 from "@ionic/angular";
15
16
  import * as i6 from "@ngx-translate/core";
16
- import * as i7 from "../../../shared/pipes/arrays.pipe";
17
+ import * as i7 from "@angular/material/tooltip";
18
+ import * as i8 from "../../../shared/pipes/arrays.pipe";
17
19
  export class AppListForm extends AppForm {
18
20
  injector;
19
21
  formBuilder;
@@ -74,6 +76,7 @@ export class AppListForm extends AppForm {
74
76
  if (!opts || opts.emitEvent !== false)
75
77
  this.markForCheck();
76
78
  }
79
+ showTooltip = inject(SHOW_TOOLTIP);
77
80
  constructor(injector, formBuilder, dateAdapter, settings, cd, formGroupDir) {
78
81
  super(injector, null);
79
82
  this.injector = injector;
@@ -210,11 +213,11 @@ export class AppListForm extends AppForm {
210
213
  this.cd.markForCheck();
211
214
  }
212
215
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: AppListForm, deps: [{ token: i0.Injector }, { token: i1.UntypedFormBuilder }, { token: i2.DateAdapter }, { token: i3.LocalSettingsService }, { token: i0.ChangeDetectorRef }, { token: i1.FormGroupDirective, optional: true }], target: i0.ɵɵFactoryTarget.Component });
213
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: AppListForm, selector: "app-list-form", inputs: { formArrayName: "formArrayName", formArray: "formArray", options: "options", displayWithFn: ["displayWith", "displayWithFn"], equalsFn: ["equals", "equalsFn"], isEmptyFn: ["isEmpty", "isEmptyFn"] }, outputs: { onNewItem: "onNewItem", selectionChanges: "selectionChanges" }, usesInheritance: true, ngImport: i0, template: "<ng-container *ngIf=\"!loading; else listSkeleton\">\n <!-- List -->\n <ion-list class=\"ion-no-padding\">\n <ng-container *ngFor=\"let itemControl of itemControls; index as i; last as last\">\n <ion-item\n *ngIf=\"itemControl.value; let item\"\n [class.disabled]=\"disabled\"\n tappable\n (click)=\"onItemClick($event, item)\"\n [color]=\"selection.isSelected(item) ? 'secondary100' : undefined\"\n [button]=\"selectionChanges.observers | isNotEmptyArray\"\n >\n <ion-label>{{ displayWith(item) }}</ion-label>\n\n <!-- buttons -->\n <ion-buttons slot=\"end\" *ngIf=\"enabled\" class=\"action-buttons\">\n <ion-button fill=\"clear\" (click)=\"removeAt(i)\">\n <ion-icon slot=\"icon-only\" name=\"trash\"></ion-icon>\n </ion-button>\n\n <ion-button\n *ngFor=\"let button of options.buttons\"\n fill=\"clear\"\n [color]=\"button.color\"\n [class.cdk-visually-hidden]=\"button.disabled | async\"\n (click)=\"onItemButtonClick(button, $event, item, i)\"\n [title]=\"button.title || '' | translate\"\n >\n <ion-icon slot=\"icon-only\" [name]=\"button.icon\"></ion-icon>\n </ion-button>\n </ion-buttons>\n </ion-item>\n </ng-container>\n </ion-list>\n\n <!-- Add button -->\n <ion-button\n color=\"tertiary\"\n fill=\"clear\"\n *ngIf=\"enabled && onNewItem.observed; else emptyText\"\n [title]=\"'COMMON.BTN_ADD' | translate\"\n (click)=\"onNewClick($event)\"\n >\n <ion-icon slot=\"start\" name=\"add\"></ion-icon>\n <ion-label translate>COMMON.BTN_ADD</ion-label>\n </ion-button>\n\n <!-- Empty (if readonly) -->\n <ng-template #emptyText>\n <ion-text *ngIf=\"!length\" color=\"medium\"><i translate>COMMON.EMPTY_OPTION</i></ion-text>\n </ng-template>\n</ng-container>\n\n<ng-template #listSkeleton>\n <ion-list>\n <ng-container *ngTemplateOutlet=\"itemSkeleton\"></ng-container>\n <ng-container *ngTemplateOutlet=\"itemSkeleton\"></ng-container>\n <ng-container *ngTemplateOutlet=\"itemSkeleton\"></ng-container>\n </ion-list>\n</ng-template>\n\n<ng-template #itemSkeleton>\n <ion-item>\n <ion-label>\n <ion-skeleton-text animated style=\"width: 60%\"></ion-skeleton-text>\n </ion-label>\n </ion-item>\n</ng-template>\n", styles: [":host{--ion-item-background-selected: var(--ion-color-secondary100);--ion-item-color-selected: var(--ion-color-secondary100-contrast)}ion-item.disabled ion-label{color:var(--ion-color-medium-shade, grey)}ion-item{--min-height: 48px;background-color:var(--ion-item-background)}ion-item ion-text,ion-item ion-label{color:var(--ion-item-color)}ion-item .action-buttons{visibility:hidden;display:none}ion-item:hover{height:var(--min-height);--ion-item-background-color: var(--ion-color-light);--ion-item-color: var(--ion-color-light-contrast)}ion-item:hover .action-buttons{margin-top:-1px;visibility:visible;display:block}ion-item.selected{--ion-item-background-color-hover: var(--ion-item-background-selected) !important;--ion-item-color-hover: var(--ion-item-color-selected) !important}\n"], dependencies: [{ kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i4.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: i5.IonButton, selector: "ion-button", inputs: ["buttonType", "color", "disabled", "download", "expand", "fill", "form", "href", "mode", "rel", "routerAnimation", "routerDirection", "shape", "size", "strong", "target", "type"] }, { kind: "component", type: i5.IonButtons, selector: "ion-buttons", inputs: ["collapse"] }, { kind: "component", type: i5.IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }, { kind: "component", type: i5.IonItem, selector: "ion-item", inputs: ["button", "color", "counter", "counterFormatter", "detail", "detailIcon", "disabled", "download", "fill", "href", "lines", "mode", "rel", "routerAnimation", "routerDirection", "shape", "target", "type"] }, { kind: "component", type: i5.IonLabel, selector: "ion-label", inputs: ["color", "mode", "position"] }, { kind: "component", type: i5.IonList, selector: "ion-list", inputs: ["inset", "lines", "mode"] }, { kind: "component", type: i5.IonSkeletonText, selector: "ion-skeleton-text", inputs: ["animated"] }, { kind: "component", type: i5.IonText, selector: "ion-text", inputs: ["color", "mode"] }, { kind: "directive", type: i6.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "pipe", type: i4.AsyncPipe, name: "async" }, { kind: "pipe", type: i6.TranslatePipe, name: "translate" }, { kind: "pipe", type: i7.NotEmptyArrayPipe, name: "isNotEmptyArray" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
216
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: AppListForm, selector: "app-list-form", inputs: { formArrayName: "formArrayName", formArray: "formArray", options: "options", displayWithFn: ["displayWith", "displayWithFn"], equalsFn: ["equals", "equalsFn"], isEmptyFn: ["isEmpty", "isEmptyFn"] }, outputs: { onNewItem: "onNewItem", selectionChanges: "selectionChanges" }, usesInheritance: true, ngImport: i0, template: "<ng-container *ngIf=\"!loading; else listSkeleton\">\n <!-- List -->\n <ion-list class=\"ion-no-padding\">\n <ng-container *ngFor=\"let itemControl of itemControls; index as i; last as last\">\n <ion-item\n *ngIf=\"itemControl.value; let item\"\n [class.disabled]=\"disabled\"\n tappable\n (click)=\"onItemClick($event, item)\"\n [color]=\"selection.isSelected(item) ? 'secondary100' : undefined\"\n [button]=\"selectionChanges.observers | isNotEmptyArray\"\n >\n <ion-label>{{ displayWith(item) }}</ion-label>\n\n <!-- buttons -->\n <ion-buttons slot=\"end\" *ngIf=\"enabled\" class=\"action-buttons\">\n <ion-button fill=\"clear\" (click)=\"removeAt(i)\">\n <ion-icon slot=\"icon-only\" name=\"trash\"></ion-icon>\n </ion-button>\n\n <ion-button\n *ngFor=\"let button of options.buttons\"\n fill=\"clear\"\n [color]=\"button.color\"\n [class.cdk-visually-hidden]=\"button.disabled | async\"\n (click)=\"onItemButtonClick(button, $event, item, i)\"\n [title]=\"!showTooltip ? (button.title || '' | translate) : ''\"\n [matTooltip]=\"showTooltip ? (button.title || '' | translate) : ''\"\n >\n <ion-icon slot=\"icon-only\" [name]=\"button.icon\"></ion-icon>\n </ion-button>\n </ion-buttons>\n </ion-item>\n </ng-container>\n </ion-list>\n\n <!-- Add button -->\n <ion-button\n color=\"tertiary\"\n fill=\"clear\"\n *ngIf=\"enabled && onNewItem.observed; else emptyText\"\n [title]=\"!showTooltip ? ('COMMON.BTN_ADD' | translate) : ''\"\n [matTooltip]=\"showTooltip ? ('COMMON.BTN_ADD' | translate) : ''\"\n (click)=\"onNewClick($event)\"\n >\n <ion-icon slot=\"start\" name=\"add\"></ion-icon>\n <ion-label translate>COMMON.BTN_ADD</ion-label>\n </ion-button>\n\n <!-- Empty (if readonly) -->\n <ng-template #emptyText>\n <ion-text *ngIf=\"!length\" color=\"medium\"><i translate>COMMON.EMPTY_OPTION</i></ion-text>\n </ng-template>\n</ng-container>\n\n<ng-template #listSkeleton>\n <ion-list>\n <ng-container *ngTemplateOutlet=\"itemSkeleton\"></ng-container>\n <ng-container *ngTemplateOutlet=\"itemSkeleton\"></ng-container>\n <ng-container *ngTemplateOutlet=\"itemSkeleton\"></ng-container>\n </ion-list>\n</ng-template>\n\n<ng-template #itemSkeleton>\n <ion-item>\n <ion-label>\n <ion-skeleton-text animated style=\"width: 60%\"></ion-skeleton-text>\n </ion-label>\n </ion-item>\n</ng-template>\n", styles: [":host{--ion-item-background-selected: var(--ion-color-secondary100);--ion-item-color-selected: var(--ion-color-secondary100-contrast)}ion-item.disabled ion-label{color:var(--ion-color-medium-shade, grey)}ion-item{--min-height: 48px;background-color:var(--ion-item-background)}ion-item ion-text,ion-item ion-label{color:var(--ion-item-color)}ion-item .action-buttons{visibility:hidden;display:none}ion-item:hover{height:var(--min-height);--ion-item-background-color: var(--ion-color-light);--ion-item-color: var(--ion-color-light-contrast)}ion-item:hover .action-buttons{margin-top:-1px;visibility:visible;display:block}ion-item.selected{--ion-item-background-color-hover: var(--ion-item-background-selected) !important;--ion-item-color-hover: var(--ion-item-color-selected) !important}\n"], dependencies: [{ kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i4.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: i5.IonButton, selector: "ion-button", inputs: ["buttonType", "color", "disabled", "download", "expand", "fill", "form", "href", "mode", "rel", "routerAnimation", "routerDirection", "shape", "size", "strong", "target", "type"] }, { kind: "component", type: i5.IonButtons, selector: "ion-buttons", inputs: ["collapse"] }, { kind: "component", type: i5.IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }, { kind: "component", type: i5.IonItem, selector: "ion-item", inputs: ["button", "color", "counter", "counterFormatter", "detail", "detailIcon", "disabled", "download", "fill", "href", "lines", "mode", "rel", "routerAnimation", "routerDirection", "shape", "target", "type"] }, { kind: "component", type: i5.IonLabel, selector: "ion-label", inputs: ["color", "mode", "position"] }, { kind: "component", type: i5.IonList, selector: "ion-list", inputs: ["inset", "lines", "mode"] }, { kind: "component", type: i5.IonSkeletonText, selector: "ion-skeleton-text", inputs: ["animated"] }, { kind: "component", type: i5.IonText, selector: "ion-text", inputs: ["color", "mode"] }, { kind: "directive", type: i6.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "directive", type: i7.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "pipe", type: i4.AsyncPipe, name: "async" }, { kind: "pipe", type: i6.TranslatePipe, name: "translate" }, { kind: "pipe", type: i8.NotEmptyArrayPipe, name: "isNotEmptyArray" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
214
217
  }
215
218
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: AppListForm, decorators: [{
216
219
  type: Component,
217
- args: [{ selector: 'app-list-form', changeDetection: ChangeDetectionStrategy.OnPush, template: "<ng-container *ngIf=\"!loading; else listSkeleton\">\n <!-- List -->\n <ion-list class=\"ion-no-padding\">\n <ng-container *ngFor=\"let itemControl of itemControls; index as i; last as last\">\n <ion-item\n *ngIf=\"itemControl.value; let item\"\n [class.disabled]=\"disabled\"\n tappable\n (click)=\"onItemClick($event, item)\"\n [color]=\"selection.isSelected(item) ? 'secondary100' : undefined\"\n [button]=\"selectionChanges.observers | isNotEmptyArray\"\n >\n <ion-label>{{ displayWith(item) }}</ion-label>\n\n <!-- buttons -->\n <ion-buttons slot=\"end\" *ngIf=\"enabled\" class=\"action-buttons\">\n <ion-button fill=\"clear\" (click)=\"removeAt(i)\">\n <ion-icon slot=\"icon-only\" name=\"trash\"></ion-icon>\n </ion-button>\n\n <ion-button\n *ngFor=\"let button of options.buttons\"\n fill=\"clear\"\n [color]=\"button.color\"\n [class.cdk-visually-hidden]=\"button.disabled | async\"\n (click)=\"onItemButtonClick(button, $event, item, i)\"\n [title]=\"button.title || '' | translate\"\n >\n <ion-icon slot=\"icon-only\" [name]=\"button.icon\"></ion-icon>\n </ion-button>\n </ion-buttons>\n </ion-item>\n </ng-container>\n </ion-list>\n\n <!-- Add button -->\n <ion-button\n color=\"tertiary\"\n fill=\"clear\"\n *ngIf=\"enabled && onNewItem.observed; else emptyText\"\n [title]=\"'COMMON.BTN_ADD' | translate\"\n (click)=\"onNewClick($event)\"\n >\n <ion-icon slot=\"start\" name=\"add\"></ion-icon>\n <ion-label translate>COMMON.BTN_ADD</ion-label>\n </ion-button>\n\n <!-- Empty (if readonly) -->\n <ng-template #emptyText>\n <ion-text *ngIf=\"!length\" color=\"medium\"><i translate>COMMON.EMPTY_OPTION</i></ion-text>\n </ng-template>\n</ng-container>\n\n<ng-template #listSkeleton>\n <ion-list>\n <ng-container *ngTemplateOutlet=\"itemSkeleton\"></ng-container>\n <ng-container *ngTemplateOutlet=\"itemSkeleton\"></ng-container>\n <ng-container *ngTemplateOutlet=\"itemSkeleton\"></ng-container>\n </ion-list>\n</ng-template>\n\n<ng-template #itemSkeleton>\n <ion-item>\n <ion-label>\n <ion-skeleton-text animated style=\"width: 60%\"></ion-skeleton-text>\n </ion-label>\n </ion-item>\n</ng-template>\n", styles: [":host{--ion-item-background-selected: var(--ion-color-secondary100);--ion-item-color-selected: var(--ion-color-secondary100-contrast)}ion-item.disabled ion-label{color:var(--ion-color-medium-shade, grey)}ion-item{--min-height: 48px;background-color:var(--ion-item-background)}ion-item ion-text,ion-item ion-label{color:var(--ion-item-color)}ion-item .action-buttons{visibility:hidden;display:none}ion-item:hover{height:var(--min-height);--ion-item-background-color: var(--ion-color-light);--ion-item-color: var(--ion-color-light-contrast)}ion-item:hover .action-buttons{margin-top:-1px;visibility:visible;display:block}ion-item.selected{--ion-item-background-color-hover: var(--ion-item-background-selected) !important;--ion-item-color-hover: var(--ion-item-color-selected) !important}\n"] }]
220
+ args: [{ selector: 'app-list-form', changeDetection: ChangeDetectionStrategy.OnPush, template: "<ng-container *ngIf=\"!loading; else listSkeleton\">\n <!-- List -->\n <ion-list class=\"ion-no-padding\">\n <ng-container *ngFor=\"let itemControl of itemControls; index as i; last as last\">\n <ion-item\n *ngIf=\"itemControl.value; let item\"\n [class.disabled]=\"disabled\"\n tappable\n (click)=\"onItemClick($event, item)\"\n [color]=\"selection.isSelected(item) ? 'secondary100' : undefined\"\n [button]=\"selectionChanges.observers | isNotEmptyArray\"\n >\n <ion-label>{{ displayWith(item) }}</ion-label>\n\n <!-- buttons -->\n <ion-buttons slot=\"end\" *ngIf=\"enabled\" class=\"action-buttons\">\n <ion-button fill=\"clear\" (click)=\"removeAt(i)\">\n <ion-icon slot=\"icon-only\" name=\"trash\"></ion-icon>\n </ion-button>\n\n <ion-button\n *ngFor=\"let button of options.buttons\"\n fill=\"clear\"\n [color]=\"button.color\"\n [class.cdk-visually-hidden]=\"button.disabled | async\"\n (click)=\"onItemButtonClick(button, $event, item, i)\"\n [title]=\"!showTooltip ? (button.title || '' | translate) : ''\"\n [matTooltip]=\"showTooltip ? (button.title || '' | translate) : ''\"\n >\n <ion-icon slot=\"icon-only\" [name]=\"button.icon\"></ion-icon>\n </ion-button>\n </ion-buttons>\n </ion-item>\n </ng-container>\n </ion-list>\n\n <!-- Add button -->\n <ion-button\n color=\"tertiary\"\n fill=\"clear\"\n *ngIf=\"enabled && onNewItem.observed; else emptyText\"\n [title]=\"!showTooltip ? ('COMMON.BTN_ADD' | translate) : ''\"\n [matTooltip]=\"showTooltip ? ('COMMON.BTN_ADD' | translate) : ''\"\n (click)=\"onNewClick($event)\"\n >\n <ion-icon slot=\"start\" name=\"add\"></ion-icon>\n <ion-label translate>COMMON.BTN_ADD</ion-label>\n </ion-button>\n\n <!-- Empty (if readonly) -->\n <ng-template #emptyText>\n <ion-text *ngIf=\"!length\" color=\"medium\"><i translate>COMMON.EMPTY_OPTION</i></ion-text>\n </ng-template>\n</ng-container>\n\n<ng-template #listSkeleton>\n <ion-list>\n <ng-container *ngTemplateOutlet=\"itemSkeleton\"></ng-container>\n <ng-container *ngTemplateOutlet=\"itemSkeleton\"></ng-container>\n <ng-container *ngTemplateOutlet=\"itemSkeleton\"></ng-container>\n </ion-list>\n</ng-template>\n\n<ng-template #itemSkeleton>\n <ion-item>\n <ion-label>\n <ion-skeleton-text animated style=\"width: 60%\"></ion-skeleton-text>\n </ion-label>\n </ion-item>\n</ng-template>\n", styles: [":host{--ion-item-background-selected: var(--ion-color-secondary100);--ion-item-color-selected: var(--ion-color-secondary100-contrast)}ion-item.disabled ion-label{color:var(--ion-color-medium-shade, grey)}ion-item{--min-height: 48px;background-color:var(--ion-item-background)}ion-item ion-text,ion-item ion-label{color:var(--ion-item-color)}ion-item .action-buttons{visibility:hidden;display:none}ion-item:hover{height:var(--min-height);--ion-item-background-color: var(--ion-color-light);--ion-item-color: var(--ion-color-light-contrast)}ion-item:hover .action-buttons{margin-top:-1px;visibility:visible;display:block}ion-item.selected{--ion-item-background-color-hover: var(--ion-item-background-selected) !important;--ion-item-color-hover: var(--ion-item-color-selected) !important}\n"] }]
218
221
  }], ctorParameters: () => [{ type: i0.Injector }, { type: i1.UntypedFormBuilder }, { type: i2.DateAdapter }, { type: i3.LocalSettingsService }, { type: i0.ChangeDetectorRef }, { type: i1.FormGroupDirective, decorators: [{
219
222
  type: Optional
220
223
  }] }], propDecorators: { formArrayName: [{
@@ -237,4 +240,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
237
240
  }], selectionChanges: [{
238
241
  type: Output
239
242
  }] } });
240
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGlzdC5mb3JtLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9jb3JlL2Zvcm0vbGlzdC9saXN0LmZvcm0udHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBwL2NvcmUvZm9ybS9saXN0L2xpc3QuZm9ybS5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSx1QkFBdUIsRUFBcUIsU0FBUyxFQUFFLFlBQVksRUFBWSxLQUFLLEVBQVUsUUFBUSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMvSSxPQUFPLEVBQStGLFVBQVUsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3pJLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHdDQUF3QyxDQUFDO0FBQzdFLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUlsRCxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3hDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDN0MsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBRzFELE9BQU8sRUFBRSxlQUFlLEVBQTBCLE1BQU0scUJBQXFCLENBQUM7Ozs7Ozs7OztBQXFCOUUsTUFBTSxPQUFPLFdBQXFCLFNBQVEsT0FBWTtJQXNFeEM7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNVO0lBMUV0QixNQUFNLENBQXFCO0lBQzNCLFNBQVMsR0FBRyxJQUFJLGNBQWMsQ0FBSSxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFFbkMsYUFBYSxDQUFTO0lBQ3RCLFNBQVMsQ0FBbUI7SUFDNUIsT0FBTyxDQUF3QjtJQUVsQixhQUFhLEdBQTBCLG1CQUFtQixDQUFDO0lBQ2hFLFFBQVEsQ0FBNEI7SUFDbkMsU0FBUyxDQUF1QjtJQUV4QyxTQUFTLEdBQUcsSUFBSSxZQUFZLEVBQVMsQ0FBQztJQUN0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QUFTO2dCQUVOLFNBQVM7c0JBQWxCLE1BQU07Z0JBQ0csZ0JBQWdCO3NCQUF6QixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENoYW5nZURldGVjdG9yUmVmLCBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgSW5qZWN0b3IsIElucHV0LCBPbkluaXQsIE9wdGlvbmFsLCBPdXRwdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEFic3RyYWN0Q29udHJvbCwgRm9ybUdyb3VwRGlyZWN0aXZlLCBVbnR5cGVkRm9ybUFycmF5LCBVbnR5cGVkRm9ybUJ1aWxkZXIsIFVudHlwZWRGb3JtR3JvdXAsIFZhbGlkYXRvcnMgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyByZWZlcmVudGlhbFRvU3RyaW5nIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvbW9kZWwvcmVmZXJlbnRpYWwubW9kZWwnO1xuaW1wb3J0IHsgaXNOaWwgfSBmcm9tICcuLi8uLi8uLi9zaGFyZWQvZnVuY3Rpb25zJztcbmltcG9ydCB7IERhdGVBZGFwdGVyIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvY29yZSc7XG5pbXBvcnQgeyBNb21lbnQgfSBmcm9tICdtb21lbnQnO1xuaW1wb3J0IHsgTG9jYWxTZXR0aW5nc1NlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9sb2NhbC1zZXR0aW5ncy5zZXJ2aWNlJztcbmltcG9ydCB7IEFwcEZvcm0gfSBmcm9tICcuLi9mb3JtLmNsYXNzJztcbmltcG9ydCB7IEFwcEZvcm1VdGlscyB9IGZyb20gJy4uL2Zvcm0udXRpbHMnO1xuaW1wb3J0IHsgU2VsZWN0aW9uTW9kZWwgfSBmcm9tICdAYW5ndWxhci9jZGsvY29sbGVjdGlvbnMnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgQ29sb3IgfSBmcm9tICdAaW9uaWMvY29yZSc7XG5pbXBvcnQgeyBGb3JtQXJyYXlIZWxwZXIsIEZvcm1BcnJheUhlbHBlck9wdGlvbnMgfSBmcm9tICcuLi9hcnJheS9mb3JtLWFycmF5JztcblxuZXhwb3J0IGRlY2xhcmUgaW50ZXJmYWNlIEl0ZW1CdXR0b248VCA9IGFueT4ge1xuICB0aXRsZT86IHN0cmluZztcbiAgY2xpY2s6IChldmVudDogRXZlbnQsIGl0ZW06IFQsIGluZGV4OiBudW1iZXIpID0+IHZvaWQ7XG4gIGljb246IHN0cmluZztcbiAgY29sb3I/OiBDb2xvcjtcbiAgZGlzYWJsZWQ/OiBPYnNlcnZhYmxlPGJvb2xlYW4+O1xufVxuXG5leHBvcnQgdHlwZSBBcHBMaXN0Rm9ybU9wdGlvbnM8VD4gPSBGb3JtQXJyYXlIZWxwZXJPcHRpb25zICYge1xuICBhbGxvd011bHRpcGxlU2VsZWN0aW9uPzogYm9vbGVhbjtcbiAgYnV0dG9ucz86IEl0ZW1CdXR0b248VD5bXTtcbn07XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2FwcC1saXN0LWZvcm0nLFxuICB0ZW1wbGF0ZVVybDogJ2xpc3QuZm9ybS5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vbGlzdC5mb3JtLnNjc3MnXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG59KVxuZXhwb3J0IGNsYXNzIEFwcExpc3RGb3JtPFQgPSBhbnk+IGV4dGVuZHMgQXBwRm9ybTxUW10+IGltcGxlbWVudHMgT25Jbml0IHtcbiAgaGVscGVyOiBGb3JtQXJyYXlIZWxwZXI8VD47XG4gIHNlbGVjdGlvbiA9IG5ldyBTZWxlY3Rpb25Nb2RlbDxUPih0cnVlLCBbXSk7XG5cbiAgQElucHV0KCkgZm9ybUFycmF5TmFtZTogc3RyaW5nO1xuICBASW5wdXQoKSBmb3JtQXJyYXk6IFVudHlwZWRGb3JtQXJyYXk7XG4gIEBJbnB1dCgpIG9wdGlvbnM6IEFwcExpc3RGb3JtT3B0aW9uczxUPjtcblxuICBASW5wdXQoJ2Rpc3BsYXlXaXRoJykgZGlzcGxheVdpdGhGbjogKGl0ZW06IGFueSkgPT4gc3RyaW5nID0gcmVmZXJlbnRpYWxUb1N0cmluZztcbiAgQElucHV0KCdlcXVhbHMnKSBlcXVhbHNGbjogKHYxOiBULCB2MjogVCkgPT4gYm9vbGVhbjtcbiAgQElucHV0KCdpc0VtcHR5JykgaXNFbXB0eUZuOiAoaXRlbTogVCkgPT4gYm9vbGVhbjtcblxuICBAT3V0cHV0KCkgb25OZXdJdGVtID0gbmV3IEV2ZW50RW1pdHRlcjxFdmVudD4oKTtcbiAgQE91dHB1dCgpIHNlbGVjdGlvbkNoYW5nZXMgPSBuZXcgRXZlbnRFbWl0dGVyPFRbXT4odHJ1ZSk7XG5cbiAgc2V0IHZhbHVlKGRhdGE6IFRbXSkge1xuICAgIHRoaXMuc2V0VmFsdWUoZGF0YSk7XG4gIH1cblxuICBnZXQgdmFsdWUoKTogVFtdIHtcbiAgICByZXR1cm4gdGhpcy5mb3JtQXJyYXkudmFsdWUgYXMgVFtdO1xuICB9XG5cbiAgZ2V0IGl0ZW1Db250cm9scygpOiBVbnR5cGVkRm9ybUdyb3VwW10ge1xuICAgIHJldHVybiB0aGlzLmZvcm1BcnJheSAmJiAodGhpcy5mb3JtQXJyYXkuY29udHJvbHMgYXMgVW50eXBlZEZvcm1Hcm91cFtdKTtcbiAgfVxuXG4gIGdldCBsZW5ndGgoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5oZWxwZXIgPyB0aGlzLmhlbHBlci5zaXplKCkgOiAwO1xuICB9XG5cbiAgZ2V0IGVtcHR5KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmxlbmd0aCA9PT0gMDtcbiAgfVxuXG4gIGdldCB0b3VjaGVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmZvcm1BcnJheSAmJiAodGhpcy5mb3JtQXJyYXkudG91Y2hlZCB8fCAodGhpcy5mb3JtQXJyYXkuY29udHJvbHMgfHwgW10pLmZpbmRJbmRleCgoYykgPT4gYy50b3VjaGVkKSAhPT0gLTEpO1xuICB9XG5cbiAgZ2V0IHVudG91Y2hlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gIXRoaXMuZm9ybUFycmF5IHx8IHRoaXMuZm9ybUFycmF5LnVudG91Y2hlZCB8fCAodGhpcy5mb3JtQXJyYXkuY29udHJvbHMgfHwgW10pLmZpbmRJbmRleCgoYykgPT4gYy50b3VjaGVkKSA9PT0gLTE7XG4gIH1cblxuICBnZXQgZGlydHkoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZm9ybUFycmF5ICYmIHRoaXMuZm9ybUFycmF5LmRpcnR5O1xuICB9XG5cbiAgZ2V0IGludmFsaWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICF0aGlzLmZvcm1BcnJheSB8fCB0aGlzLmZvcm1BcnJheS5pbnZhbGlkO1xuICB9XG5cbiAgZ2V0IHZhbGlkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmZvcm1BcnJheSAmJiB0aGlzLmZvcm1BcnJheS52YWxpZDtcbiAgfVxuXG4gIGdldCBwZW5kaW5nKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhdGhpcy5mb3JtQXJyYXkgfHwgdGhpcy5mb3JtQXJyYXkucGVuZGluZztcbiAgfVxuXG4gIG1hcmtBc1RvdWNoZWQob3B0cz86IHsgb25seVNlbGY/OiBib29sZWFuOyBlbWl0RXZlbnQ/OiBib29sZWFuIH0pIHtcbiAgICBBcHBGb3JtVXRpbHMubWFya0FzVG91Y2hlZCh0aGlzLmZvcm1BcnJheSwgb3B0cyk7XG4gICAgaWYgKCFvcHRzIHx8IG9wdHMuZW1pdEV2ZW50ICE9PSBmYWxzZSkgdGhpcy5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIG1hcmtBbGxBc1RvdWNoZWQob3B0cz86IHsgZW1pdEV2ZW50PzogYm9vbGVhbiB9KSB7XG4gICAgQXBwRm9ybVV0aWxzLm1hcmtBbGxBc1RvdWNoZWQodGhpcy5mb3JtQXJyYXksIG9wdHMpO1xuICAgIGlmICghb3B0cyB8fCBvcHRzLmVtaXRFdmVudCAhPT0gZmFsc2UpIHRoaXMubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcm90ZWN0ZWQgaW5qZWN0b3I6IEluamVjdG9yLFxuICAgIHByb3RlY3RlZCBmb3JtQnVpbGRlcjogVW50eXBlZEZvcm1CdWlsZGVyLFxuICAgIHByb3RlY3RlZCBkYXRlQWRhcHRlcjogRGF0ZUFkYXB0ZXI8TW9tZW50PixcbiAgICBwcm90ZWN0ZWQgc2V0dGluZ3M6IExvY2FsU2V0dGluZ3NTZXJ2aWNlLFxuICAgIHByb3RlY3RlZCBjZDogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgQE9wdGlvbmFsKCkgcHJpdmF0ZSBmb3JtR3JvdXBEaXI6IEZvcm1Hcm91cERpcmVjdGl2ZVxuICApIHtcbiAgICBzdXBlcihpbmplY3RvciwgbnVsbCk7XG5cbiAgICAvL3RoaXMuZGVidWcgPSAhZW52aXJvbm1lbnQucHJvZHVjdGlvbjtcbiAgfVxuXG4gIG5nT25Jbml0KCkge1xuICAgIHRoaXMub3B0aW9ucyA9IHtcbiAgICAgIGFsbG93RW1wdHlBcnJheTogdHJ1ZSxcbiAgICAgIGFsbG93TXVsdGlwbGVTZWxlY3Rpb246IHRydWUsXG4gICAgICBidXR0b25zOiBbXSxcbiAgICAgIC4uLnRoaXMub3B0aW9ucyxcbiAgICB9O1xuXG4gICAgLy8gUmV0cmlldmUgdGhlIGZvcm1cbiAgICBjb25zdCBmb3JtID1cbiAgICAgICh0aGlzLmZvcm1BcnJheSAmJiAodGhpcy5mb3JtQXJyYXkucGFyZW50IGFzIFVudHlwZWRGb3JtR3JvdXApKSB8fCAodGhpcy5mb3JtR3JvdXBEaXIgJiYgdGhpcy5mb3JtR3JvdXBEaXIuZm9ybSkgfHwgdGhpcy5mb3JtQnVpbGRlci5ncm91cCh7fSk7XG4gICAgdGhpcy5zZXRGb3JtKGZvcm0pO1xuXG4gICAgdGhpcy5mb3JtQXJyYXkgPSB0aGlzLmZvcm1BcnJheSB8fCAodGhpcy5mb3JtQXJyYXlOYW1lICYmIChmb3JtLmdldCh0aGlzLmZvcm1BcnJheU5hbWUpIGFzIFVudHlwZWRGb3JtQXJyYXkpKTtcbiAgICB0aGlzLmZvcm1BcnJheU5hbWUgPVxuICAgICAgdGhpcy5mb3JtQXJyYXlOYW1lIHx8ICh0aGlzLmZvcm1BcnJheSAmJiBPYmplY3Qua2V5cyhmb3JtLmNvbnRyb2xzKS5maW5kKChrZXkpID0+IGZvcm0uZ2V0KGtleSkgPT09IHRoaXMuZm9ybUFycmF5KSkgfHwgJ3Byb3BlcnRpZXMnO1xuICAgIGlmICghdGhpcy5mb3JtQXJyYXkpIHtcbiAgICAgIGNvbnNvbGUud2FybihgTWlzc2luZyBhcnJheSBjb250cm9sICcke3RoaXMuZm9ybUFycmF5TmFtZX0nLiBXaWxsIGNyZWF0ZSBpdCFgKTtcbiAgICAgIHRoaXMuZm9ybUFycmF5ID0gdGhpcy5mb3JtQnVpbGRlci5hcnJheShbXSk7XG4gICAgICB0aGlzLmZvcm0uYWRkQ29udHJvbCh0aGlzLmZvcm1BcnJheU5hbWUsIHRoaXMuZm9ybUFycmF5KTtcbiAgICB9XG5cbiAgICB0aGlzLmVxdWFsc0ZuID0gdGhpcy5lcXVhbHNGbiB8fCAoKHYxOiBhbnksIHYyOiBhbnkpID0+IChpc05pbCh2MSkgJiYgaXNOaWwodjIpKSB8fCB2MSA9PT0gdjIpO1xuICAgIHRoaXMuaXNFbXB0eUZuID0gdGhpcy5pc0VtcHR5Rm4gfHwgKChpdGVtOiBUKSA9PiBpc05pbChpdGVtKSk7XG4gICAgdGhpcy5oZWxwZXIgPSBuZXcgRm9ybUFycmF5SGVscGVyPFQ+KFxuICAgICAgdGhpcy5mb3JtQXJyYXksXG4gICAgICAodmFsdWUpID0+IHRoaXMuY3JlYXRlQ29udHJvbCh2YWx1ZSksXG4gICAgICB0aGlzLmVxdWFsc0ZuLFxuICAgICAgdGhpcy5pc0VtcHR5Rm4sXG4gICAgICB0aGlzLm9wdGlvbnNcbiAgICApO1xuXG4gICAgc3VwZXIubmdPbkluaXQoKTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCkge1xuICAgIHN1cGVyLm5nT25EZXN0cm95KCk7XG5cbiAgICB0aGlzLm9uTmV3SXRlbS5jb21wbGV0ZSgpO1xuICAgIHRoaXMub25OZXdJdGVtLnVuc3Vic2NyaWJlKCk7XG4gICAgdGhpcy5zZWxlY3Rpb25DaGFuZ2VzLmNvbXBsZXRlKCk7XG4gICAgdGhpcy5zZWxlY3Rpb25DaGFuZ2VzLnVuc3Vic2NyaWJlKCk7XG4gIH1cblxuICBzZXRWYWx1ZShkYXRhOiBUW10gfCBhbnkpIHtcbiAgICBkYXRhID0gZGF0YSB8fCBbXTtcblxuICAgIGlmICh0aGlzLmhlbHBlcikge1xuICAgICAgdGhpcy5oZWxwZXIucmVzaXplKGRhdGEubGVuZ3RoKTtcbiAgICAgIHRoaXMuaGVscGVyLmZvcm1BcnJheS5wYXRjaFZhbHVlKGRhdGEsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc29sZS53YXJuKCdUT0RPOiBjYW5ub3QgYXBwbGllZCBzZXRWYWx1ZSgpIG9uIGZyb21BcnJheSwgYmVjYXVzZSBmb3JtQXJyYXlIZWxwZXIgbm90IGV4aXN0cyB5ZXQgIScpO1xuICAgIH1cblxuICAgIHRoaXMuc2VsZWN0aW9uLmNsZWFyKCk7XG4gICAgdGhpcy5tYXJrQXNQcmlzdGluZSgpO1xuICAgIHRoaXMubWFya0FzTG9hZGVkKCk7XG4gIH1cblxuICAvKiogV2hldGhlciB0aGUgbnVtYmVyIG9mIHNlbGVjdGVkIGVsZW1lbnRzIG1hdGNoZXMgdGhlIHRvdGFsIG51bWJlciBvZiByb3dzLiAqL1xuICBpc0FsbFNlbGVjdGVkKCkge1xuICAgIHJldHVybiB0aGlzLnNlbGVjdGlvbi5zZWxlY3RlZC5sZW5ndGggPT09IHRoaXMubGVuZ3RoO1xuICB9XG5cbiAgYXN5bmMgbWFzdGVyVG9nZ2xlKG9wdHM/OiB7IGVtaXRFdmVudD86IGJvb2xlYW4gfSkge1xuICAgIGlmICh0aGlzLmxvYWRpbmcpIHJldHVybjtcbiAgICBpZiAodGhpcy5pc0FsbFNlbGVjdGVkKCkpIHtcbiAgICAgIHRoaXMuc2VsZWN0aW9uLmNsZWFyKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGl0ZW1zID0gdGhpcy52YWx1ZTtcbiAgICAgIGl0ZW1zLmZvckVhY2goKGl0ZW0pID0+IHRoaXMuc2VsZWN0aW9uLnNlbGVjdChpdGVtKSk7XG4gICAgfVxuXG4gICAgaWYgKCFvcHRzIHx8IG9wdHMuZW1pdEV2ZW50ICE9PSBmYWxzZSkge1xuICAgICAgdGhpcy5zZWxlY3Rpb25DaGFuZ2VzLmVtaXQodGhpcy5zZWxlY3Rpb24uc2VsZWN0ZWQpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIG9uSXRlbUNsaWNrKGV2ZW50OiBNb3VzZUV2ZW50LCBpdGVtOiBULCBvcHRzPzogeyBlbWl0RXZlbnQ/OiBib29sZWFuIH0pIHtcbiAgICBpZiAoIWl0ZW0gfHwgZXZlbnQuZGVmYXVsdFByZXZlbnRlZCB8fCAhdGhpcy5zZWxlY3Rpb25DaGFuZ2VzLm9ic2VydmVkKSByZXR1cm47XG5cbiAgICAvLyBNdWx0aXBsZSBzZWxlY3Rpb24gKGlmIGN0cmwrY2xpY2spXG4gICAgaWYgKGV2ZW50LmN0cmxLZXkgJiYgdGhpcy5vcHRpb25zLmFsbG93TXVsdGlwbGVTZWxlY3Rpb24pIHtcbiAgICAgIHRoaXMuc2VsZWN0aW9uLnRvZ2dsZShpdGVtKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gVW5zZWxlY3QgYWxsXG5cbiAgICAgIC8vIFNlbGVjdCB0aGUgaXRlbSAob3IgcmVzZWxlY3QpXG4gICAgICBpZiAoIXRoaXMuc2VsZWN0aW9uLmlzU2VsZWN0ZWQoaXRlbSkgfHwgKHRoaXMub3B0aW9ucy5hbGxvd011bHRpcGxlU2VsZWN0aW9uICYmIHRoaXMuc2VsZWN0aW9uLnNlbGVjdGVkLmxlbmd0aCA+IDEpKSB7XG4gICAgICAgIHRoaXMuc2VsZWN0aW9uLmNsZWFyKCk7XG4gICAgICAgIHRoaXMuc2VsZWN0aW9uLnNlbGVjdChpdGVtKTtcbiAgICAgIH1cbiAgICAgIC8vIFVuc2VsZWN0IGFsbFxuICAgICAgZWxzZSB7XG4gICAgICAgIHRoaXMuc2VsZWN0aW9uLmNsZWFyKCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCFvcHRzIHx8IG9wdHMuZW1pdEV2ZW50ICE9PSBmYWxzZSkge1xuICAgICAgdGhpcy5zZWxlY3Rpb25DaGFuZ2VzLmVtaXQodGhpcy5zZWxlY3Rpb24uc2VsZWN0ZWQpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIG9uSXRlbUJ1dHRvbkNsaWNrKGJ1dHRvbjogSXRlbUJ1dHRvbiwgZXZlbnQ6IE1vdXNlRXZlbnQsIGl0ZW06IFQsIGluZGV4OiBudW1iZXIpIHtcbiAgICBpZiAoYnV0dG9uLmNsaWNrKSBidXR0b24uY2xpY2soZXZlbnQsIGl0ZW0sIGluZGV4KTtcbiAgICBhd2FpdCB0aGlzLm9uSXRlbUNsaWNrKGV2ZW50LCBpdGVtKTtcbiAgfVxuXG4gIGhhc1NlbGVjdGlvbigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5zZWxlY3Rpb24uaGFzVmFsdWUoKTtcbiAgfVxuXG4gIG9uTmV3Q2xpY2soZXZlbnQpIHtcbiAgICB0aGlzLm9uTmV3SXRlbS5lbWl0KGV2ZW50KTtcbiAgfVxuXG4gIGFkZCh2YWx1ZTogVCwgb3B0cz86IHsgZW1pdEV2ZW50PzogYm9vbGVhbiB9KSB7XG4gICAgY29uc3QgZG9uZSA9IHRoaXMuaGVscGVyLmFkZCh2YWx1ZSwgeyBlbWl0RXZlbnQ6IHRydWUgfSk7XG4gICAgaWYgKGRvbmUpIHtcbiAgICAgIGlmICghdGhpcy5vcHRpb25zLmFsbG93TXVsdGlwbGVTZWxlY3Rpb24pIHtcbiAgICAgICAgdGhpcy5zZWxlY3Rpb24uY2xlYXIoKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuc2VsZWN0aW9uLnRvZ2dsZSh2YWx1ZSk7XG4gICAgICB0aGlzLm1hcmtGb3JDaGVjaygpO1xuXG4gICAgICBpZiAoIW9wdHMgfHwgb3B0cy5lbWl0RXZlbnQgIT09IGZhbHNlKSB7XG4gICAgICAgIHRoaXMuc2VsZWN0aW9uQ2hhbmdlcy5lbWl0KHRoaXMuc2VsZWN0aW9uLnNlbGVjdGVkKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZW1vdmVBdChpbmRleDogbnVtYmVyKSB7XG4gICAgY29uc3QgaXRlbSA9IHRoaXMuaGVscGVyLmF0KGluZGV4KS52YWx1ZTtcbiAgICBpZiAodGhpcy5zZWxlY3Rpb24uaXNTZWxlY3RlZChpdGVtKSkge1xuICAgICAgdGhpcy5zZWxlY3Rpb24uZGVzZWxlY3QoaXRlbSk7XG4gICAgfVxuICAgIHRoaXMuaGVscGVyLnJlbW92ZUF0KGluZGV4KTtcbiAgfVxuXG4gIGRpc3BsYXlXaXRoKHZhbHVlOiBUKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5kaXNwbGF5V2l0aEZuID8gdGhpcy5kaXNwbGF5V2l0aEZuKHZhbHVlKSA6ICh2YWx1ZSBhcyBhbnkpO1xuICB9XG5cbiAgLyogLS0gcHJvdGVjdGVkIG1ldGhvZHMgLS0gKi9cblxuICBwcm90ZWN0ZWQgY3JlYXRlQ29udHJvbChkYXRhPzogYW55KTogQWJzdHJhY3RDb250cm9sIHtcbiAgICByZXR1cm4gdGhpcy5mb3JtQnVpbGRlci5jb250cm9sKGRhdGEgfHwgbnVsbCwgVmFsaWRhdG9ycy5yZXF1aXJlZCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgbWFya0ZvckNoZWNrKCkge1xuICAgIHRoaXMuY2QubWFya0ZvckNoZWNrKCk7XG4gIH1cbn1cbiIsIjxuZy1jb250YWluZXIgKm5nSWY9XCIhbG9hZGluZzsgZWxzZSBsaXN0U2tlbGV0b25cIj5cbiAgPCEtLSBMaXN0IC0tPlxuICA8aW9uLWxpc3QgY2xhc3M9XCJpb24tbm8tcGFkZGluZ1wiPlxuICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGl0ZW1Db250cm9sIG9mIGl0ZW1Db250cm9sczsgaW5kZXggYXMgaTsgbGFzdCBhcyBsYXN0XCI+XG4gICAgICA8aW9uLWl0ZW1cbiAgICAgICAgKm5nSWY9XCJpdGVtQ29udHJvbC52YWx1ZTsgbGV0IGl0ZW1cIlxuICAgICAgICBbY2xhc3MuZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxuICAgICAgICB0YXBwYWJsZVxuICAgICAgICAoY2xpY2spPVwib25JdGVtQ2xpY2soJGV2ZW50LCBpdGVtKVwiXG4gICAgICAgIFtjb2xvcl09XCJzZWxlY3Rpb24uaXNTZWxlY3RlZChpdGVtKSA/ICdzZWNvbmRhcnkxMDAnIDogdW5kZWZpbmVkXCJcbiAgICAgICAgW2J1dHRvbl09XCJzZWxlY3Rpb25DaGFuZ2VzLm9ic2VydmVycyB8IGlzTm90RW1wdHlBcnJheVwiXG4gICAgICA+XG4gICAgICAgIDxpb24tbGFiZWw+e3sgZGlzcGxheVdpdGgoaXRlbSkgfX08L2lvbi1sYWJlbD5cblxuICAgICAgICA8IS0tIGJ1dHRvbnMgLS0+XG4gICAgICAgIDxpb24tYnV0dG9ucyBzbG90PVwiZW5kXCIgKm5nSWY9XCJlbmFibGVkXCIgY2xhc3M9XCJhY3Rpb24tYnV0dG9uc1wiPlxuICAgICAgICAgIDxpb24tYnV0dG9uIGZpbGw9XCJjbGVhclwiIChjbGljayk9XCJyZW1vdmVBdChpKVwiPlxuICAgICAgICAgICAgPGlvbi1pY29uIHNsb3Q9XCJpY29uLW9ubHlcIiBuYW1lPVwidHJhc2hcIj48L2lvbi1pY29uPlxuICAgICAgICAgIDwvaW9uLWJ1dHRvbj5cblxuICAgICAgICAgIDxpb24tYnV0dG9uXG4gICAgICAgICAgICAqbmdGb3I9XCJsZXQgYnV0dG9uIG9mIG9wdGlvbnMuYnV0dG9uc1wiXG4gICAgICAgICAgICBmaWxsPVwiY2xlYXJcIlxuICAgICAgICAgICAgW2NvbG9yXT1cImJ1dHRvbi5jb2xvclwiXG4gICAgICAgICAgICBbY2xhc3MuY2RrLXZpc3VhbGx5LWhpZGRlbl09XCJidXR0b24uZGlzYWJsZWQgfCBhc3luY1wiXG4gICAgICAgICAgICAoY2xpY2spPVwib25JdGVtQnV0dG9uQ2xpY2soYnV0dG9uLCAkZXZlbnQsIGl0ZW0sIGkpXCJcbiAgICAgICAgICAgIFt0aXRsZV09XCJidXR0b24udGl0bGUgfHwgJycgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxpb24taWNvbiBzbG90PVwiaWNvbi1vbmx5XCIgW25hbWVdPVwiYnV0dG9uLmljb25cIj48L2lvbi1pY29uPlxuICAgICAgICAgIDwvaW9uLWJ1dHRvbj5cbiAgICAgICAgPC9pb24tYnV0dG9ucz5cbiAgICAgIDwvaW9uLWl0ZW0+XG4gICAgPC9uZy1jb250YWluZXI+XG4gIDwvaW9uLWxpc3Q+XG5cbiAgPCEtLSBBZGQgYnV0dG9uIC0tPlxuICA8aW9uLWJ1dHRvblxuICAgIGNvbG9yPVwidGVydGlhcnlcIlxuICAgIGZpbGw9XCJjbGVhclwiXG4gICAgKm5nSWY9XCJlbmFibGVkICYmIG9uTmV3SXRlbS5vYnNlcnZlZDsgZWxzZSBlbXB0eVRleHRcIlxuICAgIFt0aXRsZV09XCInQ09NTU9OLkJUTl9BREQnIHwgdHJhbnNsYXRlXCJcbiAgICAoY2xpY2spPVwib25OZXdDbGljaygkZXZlbnQpXCJcbiAgPlxuICAgIDxpb24taWNvbiBzbG90PVwic3RhcnRcIiBuYW1lPVwiYWRkXCI+PC9pb24taWNvbj5cbiAgICA8aW9uLWxhYmVsIHRyYW5zbGF0ZT5DT01NT04uQlROX0FERDwvaW9uLWxhYmVsPlxuICA8L2lvbi1idXR0b24+XG5cbiAgPCEtLSBFbXB0eSAoaWYgcmVhZG9ubHkpIC0tPlxuICA8bmctdGVtcGxhdGUgI2VtcHR5VGV4dD5cbiAgICA8aW9uLXRleHQgKm5nSWY9XCIhbGVuZ3RoXCIgY29sb3I9XCJtZWRpdW1cIj48aSB0cmFuc2xhdGU+Q09NTU9OLkVNUFRZX09QVElPTjwvaT48L2lvbi10ZXh0PlxuICA8L25nLXRlbXBsYXRlPlxuPC9uZy1jb250YWluZXI+XG5cbjxuZy10ZW1wbGF0ZSAjbGlzdFNrZWxldG9uPlxuICA8aW9uLWxpc3Q+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cIml0ZW1Ta2VsZXRvblwiPjwvbmctY29udGFpbmVyPlxuICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJpdGVtU2tlbGV0b25cIj48L25nLWNvbnRhaW5lcj5cbiAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiaXRlbVNrZWxldG9uXCI+PC9uZy1jb250YWluZXI+XG4gIDwvaW9uLWxpc3Q+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI2l0ZW1Ta2VsZXRvbj5cbiAgPGlvbi1pdGVtPlxuICAgIDxpb24tbGFiZWw+XG4gICAgICA8aW9uLXNrZWxldG9uLXRleHQgYW5pbWF0ZWQgc3R5bGU9XCJ3aWR0aDogNjAlXCI+PC9pb24tc2tlbGV0b24tdGV4dD5cbiAgICA8L2lvbi1sYWJlbD5cbiAgPC9pb24taXRlbT5cbjwvbmctdGVtcGxhdGU+XG4iXX0=
243
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGlzdC5mb3JtLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9jb3JlL2Zvcm0vbGlzdC9saXN0LmZvcm0udHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBwL2NvcmUvZm9ybS9saXN0L2xpc3QuZm9ybS5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSx1QkFBdUIsRUFBcUIsU0FBUyxFQUFFLFlBQVksRUFDMUUsTUFBTSxFQUFZLEtBQUssRUFBVSxRQUFRLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNFLE9BQU8sRUFBK0YsVUFBVSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDekksT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sd0NBQXdDLENBQUM7QUFDN0UsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBSWxELE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDeEMsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM3QyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFHMUQsT0FBTyxFQUFFLGVBQWUsRUFBMEIsTUFBTSxxQkFBcUIsQ0FBQztBQUU5RSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7Ozs7Ozs7Ozs7QUFxQnpELE1BQU0sT0FBTyxXQUFxQixTQUFRLE9BQVk7SUF3RXhDO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDVTtJQTVFdEIsTUFBTSxDQUFxQjtJQUMzQixTQUFTLEdBQUcsSUFBSSxjQUFjLENBQUksSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBRW5DLGFBQWEsQ0FBUztJQUN0QixTQUFTLENBQW1CO0lBQzVCLE9BQU8sQ0FBd0I7SUFFbEIsYUFBYSxHQUEwQixtQkFBbUIsQ0FBQztJQUNoRSxRQUFRLENBQTRCO0lB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Z0IsYUFBYTtzQkFBbEMsS0FBSzt1QkFBQyxhQUFhO2dCQUNILFFBQVE7c0JBQXhCLEtBQUs7dUJBQUMsUUFBUTtnQkFDRyxTQUFTO3NCQUExQixLQUFLO3VCQUFDLFNBQVM7Z0JBRU4sU0FBUztzQkFBbEIsTUFBTTtnQkFDRyxnQkFBZ0I7c0JBQXpCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ2hhbmdlRGV0ZWN0b3JSZWYsIENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLFxuICBpbmplY3QsIEluamVjdG9yLCBJbnB1dCwgT25Jbml0LCBPcHRpb25hbCwgT3V0cHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBBYnN0cmFjdENvbnRyb2wsIEZvcm1Hcm91cERpcmVjdGl2ZSwgVW50eXBlZEZvcm1BcnJheSwgVW50eXBlZEZvcm1CdWlsZGVyLCBVbnR5cGVkRm9ybUdyb3VwLCBWYWxpZGF0b3JzIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgcmVmZXJlbnRpYWxUb1N0cmluZyB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL21vZGVsL3JlZmVyZW50aWFsLm1vZGVsJztcbmltcG9ydCB7IGlzTmlsIH0gZnJvbSAnLi4vLi4vLi4vc2hhcmVkL2Z1bmN0aW9ucyc7XG5pbXBvcnQgeyBEYXRlQWRhcHRlciB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2NvcmUnO1xuaW1wb3J0IHsgTW9tZW50IH0gZnJvbSAnbW9tZW50JztcbmltcG9ydCB7IExvY2FsU2V0dGluZ3NTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvbG9jYWwtc2V0dGluZ3Muc2VydmljZSc7XG5pbXBvcnQgeyBBcHBGb3JtIH0gZnJvbSAnLi4vZm9ybS5jbGFzcyc7XG5pbXBvcnQgeyBBcHBGb3JtVXRpbHMgfSBmcm9tICcuLi9mb3JtLnV0aWxzJztcbmltcG9ydCB7IFNlbGVjdGlvbk1vZGVsIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2NvbGxlY3Rpb25zJztcbmltcG9ydCB7IE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IENvbG9yIH0gZnJvbSAnQGlvbmljL2NvcmUnO1xuaW1wb3J0IHsgRm9ybUFycmF5SGVscGVyLCBGb3JtQXJyYXlIZWxwZXJPcHRpb25zIH0gZnJvbSAnLi4vYXJyYXkvZm9ybS1hcnJheSc7XG5cbmltcG9ydCB7IFNIT1dfVE9PTFRJUCB9IGZyb20gJy4uLy4uLy4uL3NoYXJlZC9jb25zdGFudHMnO1xuXG5leHBvcnQgZGVjbGFyZSBpbnRlcmZhY2UgSXRlbUJ1dHRvbjxUID0gYW55PiB7XG4gIHRpdGxlPzogc3RyaW5nO1xuICBjbGljazogKGV2ZW50OiBFdmVudCwgaXRlbTogVCwgaW5kZXg6IG51bWJlcikgPT4gdm9pZDtcbiAgaWNvbjogc3RyaW5nO1xuICBjb2xvcj86IENvbG9yO1xuICBkaXNhYmxlZD86IE9ic2VydmFibGU8Ym9vbGVhbj47XG59XG5cbmV4cG9ydCB0eXBlIEFwcExpc3RGb3JtT3B0aW9uczxUPiA9IEZvcm1BcnJheUhlbHBlck9wdGlvbnMgJiB7XG4gIGFsbG93TXVsdGlwbGVTZWxlY3Rpb24/OiBib29sZWFuO1xuICBidXR0b25zPzogSXRlbUJ1dHRvbjxUPltdO1xufTtcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYXBwLWxpc3QtZm9ybScsXG4gIHRlbXBsYXRlVXJsOiAnbGlzdC5mb3JtLmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9saXN0LmZvcm0uc2NzcyddLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbn0pXG5leHBvcnQgY2xhc3MgQXBwTGlzdEZvcm08VCA9IGFueT4gZXh0ZW5kcyBBcHBGb3JtPFRbXT4gaW1wbGVtZW50cyBPbkluaXQge1xuICBoZWxwZXI6IEZvcm1BcnJheUhlbHBlcjxUPjtcbiAgc2VsZWN0aW9uID0gbmV3IFNlbGVjdGlvbk1vZGVsPFQ+KHRydWUsIFtdKTtcblxuICBASW5wdXQoKSBmb3JtQXJyYXlOYW1lOiBzdHJpbmc7XG4gIEBJbnB1dCgpIGZvcm1BcnJheTogVW50eXBlZEZvcm1BcnJheTtcbiAgQElucHV0KCkgb3B0aW9uczogQXBwTGlzdEZvcm1PcHRpb25zPFQ+O1xuXG4gIEBJbnB1dCgnZGlzcGxheVdpdGgnKSBkaXNwbGF5V2l0aEZuOiAoaXRlbTogYW55KSA9PiBzdHJpbmcgPSByZWZlcmVudGlhbFRvU3RyaW5nO1xuICBASW5wdXQoJ2VxdWFscycpIGVxdWFsc0ZuOiAodjE6IFQsIHYyOiBUKSA9PiBib29sZWFuO1xuICBASW5wdXQoJ2lzRW1wdHknKSBpc0VtcHR5Rm46IChpdGVtOiBUKSA9PiBib29sZWFuO1xuXG4gIEBPdXRwdXQoKSBvbk5ld0l0ZW0gPSBuZXcgRXZlbnRFbWl0dGVyPEV2ZW50PigpO1xuICBAT3V0cHV0KCkgc2VsZWN0aW9uQ2hhbmdlcyA9IG5ldyBFdmVudEVtaXR0ZXI8VFtdPih0cnVlKTtcblxuICBzZXQgdmFsdWUoZGF0YTogVFtdKSB7XG4gICAgdGhpcy5zZXRWYWx1ZShkYXRhKTtcbiAgfVxuXG4gIGdldCB2YWx1ZSgpOiBUW10ge1xuICAgIHJldHVybiB0aGlzLmZvcm1BcnJheS52YWx1ZSBhcyBUW107XG4gIH1cblxuICBnZXQgaXRlbUNvbnRyb2xzKCk6IFVudHlwZWRGb3JtR3JvdXBbXSB7XG4gICAgcmV0dXJuIHRoaXMuZm9ybUFycmF5ICYmICh0aGlzLmZvcm1BcnJheS5jb250cm9scyBhcyBVbnR5cGVkRm9ybUdyb3VwW10pO1xuICB9XG5cbiAgZ2V0IGxlbmd0aCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmhlbHBlciA/IHRoaXMuaGVscGVyLnNpemUoKSA6IDA7XG4gIH1cblxuICBnZXQgZW1wdHkoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMubGVuZ3RoID09PSAwO1xuICB9XG5cbiAgZ2V0IHRvdWNoZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZm9ybUFycmF5ICYmICh0aGlzLmZvcm1BcnJheS50b3VjaGVkIHx8ICh0aGlzLmZvcm1BcnJheS5jb250cm9scyB8fCBbXSkuZmluZEluZGV4KChjKSA9PiBjLnRvdWNoZWQpICE9PSAtMSk7XG4gIH1cblxuICBnZXQgdW50b3VjaGVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhdGhpcy5mb3JtQXJyYXkgfHwgdGhpcy5mb3JtQXJyYXkudW50b3VjaGVkIHx8ICh0aGlzLmZvcm1BcnJheS5jb250cm9scyB8fCBbXSkuZmluZEluZGV4KChjKSA9PiBjLnRvdWNoZWQpID09PSAtMTtcbiAgfVxuXG4gIGdldCBkaXJ0eSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5mb3JtQXJyYXkgJiYgdGhpcy5mb3JtQXJyYXkuZGlydHk7XG4gIH1cblxuICBnZXQgaW52YWxpZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gIXRoaXMuZm9ybUFycmF5IHx8IHRoaXMuZm9ybUFycmF5LmludmFsaWQ7XG4gIH1cblxuICBnZXQgdmFsaWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZm9ybUFycmF5ICYmIHRoaXMuZm9ybUFycmF5LnZhbGlkO1xuICB9XG5cbiAgZ2V0IHBlbmRpbmcoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICF0aGlzLmZvcm1BcnJheSB8fCB0aGlzLmZvcm1BcnJheS5wZW5kaW5nO1xuICB9XG5cbiAgbWFya0FzVG91Y2hlZChvcHRzPzogeyBvbmx5U2VsZj86IGJvb2xlYW47IGVtaXRFdmVudD86IGJvb2xlYW4gfSkge1xuICAgIEFwcEZvcm1VdGlscy5tYXJrQXNUb3VjaGVkKHRoaXMuZm9ybUFycmF5LCBvcHRzKTtcbiAgICBpZiAoIW9wdHMgfHwgb3B0cy5lbWl0RXZlbnQgIT09IGZhbHNlKSB0aGlzLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgbWFya0FsbEFzVG91Y2hlZChvcHRzPzogeyBlbWl0RXZlbnQ/OiBib29sZWFuIH0pIHtcbiAgICBBcHBGb3JtVXRpbHMubWFya0FsbEFzVG91Y2hlZCh0aGlzLmZvcm1BcnJheSwgb3B0cyk7XG4gICAgaWYgKCFvcHRzIHx8IG9wdHMuZW1pdEV2ZW50ICE9PSBmYWxzZSkgdGhpcy5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIHNob3dUb29sdGlwID0gaW5qZWN0KFNIT1dfVE9PTFRJUCk7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJvdGVjdGVkIGluamVjdG9yOiBJbmplY3RvcixcbiAgICBwcm90ZWN0ZWQgZm9ybUJ1aWxkZXI6IFVudHlwZWRGb3JtQnVpbGRlcixcbiAgICBwcm90ZWN0ZWQgZGF0ZUFkYXB0ZXI6IERhdGVBZGFwdGVyPE1vbWVudD4sXG4gICAgcHJvdGVjdGVkIHNldHRpbmdzOiBMb2NhbFNldHRpbmdzU2VydmljZSxcbiAgICBwcm90ZWN0ZWQgY2Q6IENoYW5nZURldGVjdG9yUmVmLFxuICAgIEBPcHRpb25hbCgpIHByaXZhdGUgZm9ybUdyb3VwRGlyOiBGb3JtR3JvdXBEaXJlY3RpdmVcbiAgKSB7XG4gICAgc3VwZXIoaW5qZWN0b3IsIG51bGwpO1xuXG4gICAgLy90aGlzLmRlYnVnID0gIWVudmlyb25tZW50LnByb2R1Y3Rpb247XG4gIH1cblxuICBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLm9wdGlvbnMgPSB7XG4gICAgICBhbGxvd0VtcHR5QXJyYXk6IHRydWUsXG4gICAgICBhbGxvd011bHRpcGxlU2VsZWN0aW9uOiB0cnVlLFxuICAgICAgYnV0dG9uczogW10sXG4gICAgICAuLi50aGlzLm9wdGlvbnMsXG4gICAgfTtcblxuICAgIC8vIFJldHJpZXZlIHRoZSBmb3JtXG4gICAgY29uc3QgZm9ybSA9XG4gICAgICAodGhpcy5mb3JtQXJyYXkgJiYgKHRoaXMuZm9ybUFycmF5LnBhcmVudCBhcyBVbnR5cGVkRm9ybUdyb3VwKSkgfHwgKHRoaXMuZm9ybUdyb3VwRGlyICYmIHRoaXMuZm9ybUdyb3VwRGlyLmZvcm0pIHx8IHRoaXMuZm9ybUJ1aWxkZXIuZ3JvdXAoe30pO1xuICAgIHRoaXMuc2V0Rm9ybShmb3JtKTtcblxuICAgIHRoaXMuZm9ybUFycmF5ID0gdGhpcy5mb3JtQXJyYXkgfHwgKHRoaXMuZm9ybUFycmF5TmFtZSAmJiAoZm9ybS5nZXQodGhpcy5mb3JtQXJyYXlOYW1lKSBhcyBVbnR5cGVkRm9ybUFycmF5KSk7XG4gICAgdGhpcy5mb3JtQXJyYXlOYW1lID1cbiAgICAgIHRoaXMuZm9ybUFycmF5TmFtZSB8fCAodGhpcy5mb3JtQXJyYXkgJiYgT2JqZWN0LmtleXMoZm9ybS5jb250cm9scykuZmluZCgoa2V5KSA9PiBmb3JtLmdldChrZXkpID09PSB0aGlzLmZvcm1BcnJheSkpIHx8ICdwcm9wZXJ0aWVzJztcbiAgICBpZiAoIXRoaXMuZm9ybUFycmF5KSB7XG4gICAgICBjb25zb2xlLndhcm4oYE1pc3NpbmcgYXJyYXkgY29udHJvbCAnJHt0aGlzLmZvcm1BcnJheU5hbWV9Jy4gV2lsbCBjcmVhdGUgaXQhYCk7XG4gICAgICB0aGlzLmZvcm1BcnJheSA9IHRoaXMuZm9ybUJ1aWxkZXIuYXJyYXkoW10pO1xuICAgICAgdGhpcy5mb3JtLmFkZENvbnRyb2wodGhpcy5mb3JtQXJyYXlOYW1lLCB0aGlzLmZvcm1BcnJheSk7XG4gICAgfVxuXG4gICAgdGhpcy5lcXVhbHNGbiA9IHRoaXMuZXF1YWxzRm4gfHwgKCh2MTogYW55LCB2MjogYW55KSA9PiAoaXNOaWwodjEpICYmIGlzTmlsKHYyKSkgfHwgdjEgPT09IHYyKTtcbiAgICB0aGlzLmlzRW1wdHlGbiA9IHRoaXMuaXNFbXB0eUZuIHx8ICgoaXRlbTogVCkgPT4gaXNOaWwoaXRlbSkpO1xuICAgIHRoaXMuaGVscGVyID0gbmV3IEZvcm1BcnJheUhlbHBlcjxUPih0aGlzLmZvcm1BcnJheSwgKHZhbHVlKSA9PiB0aGlzLmNyZWF0ZUNvbnRyb2wodmFsdWUpLCB0aGlzLmVxdWFsc0ZuLCB0aGlzLmlzRW1wdHlGbiwgdGhpcy5vcHRpb25zKTtcblxuICAgIHN1cGVyLm5nT25Jbml0KCk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpIHtcbiAgICBzdXBlci5uZ09uRGVzdHJveSgpO1xuXG4gICAgdGhpcy5vbk5ld0l0ZW0uY29tcGxldGUoKTtcbiAgICB0aGlzLm9uTmV3SXRlbS51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMuc2VsZWN0aW9uQ2hhbmdlcy5jb21wbGV0ZSgpO1xuICAgIHRoaXMuc2VsZWN0aW9uQ2hhbmdlcy51bnN1YnNjcmliZSgpO1xuICB9XG5cbiAgc2V0VmFsdWUoZGF0YTogVFtdIHwgYW55KSB7XG4gICAgZGF0YSA9IGRhdGEgfHwgW107XG5cbiAgICBpZiAodGhpcy5oZWxwZXIpIHtcbiAgICAgIHRoaXMuaGVscGVyLnJlc2l6ZShkYXRhLmxlbmd0aCk7XG4gICAgICB0aGlzLmhlbHBlci5mb3JtQXJyYXkucGF0Y2hWYWx1ZShkYXRhLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnNvbGUud2FybignVE9ETzogY2Fubm90IGFwcGxpZWQgc2V0VmFsdWUoKSBvbiBmcm9tQXJyYXksIGJlY2F1c2UgZm9ybUFycmF5SGVscGVyIG5vdCBleGlzdHMgeWV0ICEnKTtcbiAgICB9XG5cbiAgICB0aGlzLnNlbGVjdGlvbi5jbGVhcigpO1xuICAgIHRoaXMubWFya0FzUHJpc3RpbmUoKTtcbiAgICB0aGlzLm1hcmtBc0xvYWRlZCgpO1xuICB9XG5cbiAgLyoqIFdoZXRoZXIgdGhlIG51bWJlciBvZiBzZWxlY3RlZCBlbGVtZW50cyBtYXRjaGVzIHRoZSB0b3RhbCBudW1iZXIgb2Ygcm93cy4gKi9cbiAgaXNBbGxTZWxlY3RlZCgpIHtcbiAgICByZXR1cm4gdGhpcy5zZWxlY3Rpb24uc2VsZWN0ZWQubGVuZ3RoID09PSB0aGlzLmxlbmd0aDtcbiAgfVxuXG4gIGFzeW5jIG1hc3RlclRvZ2dsZShvcHRzPzogeyBlbWl0RXZlbnQ/OiBib29sZWFuIH0pIHtcbiAgICBpZiAodGhpcy5sb2FkaW5nKSByZXR1cm47XG4gICAgaWYgKHRoaXMuaXNBbGxTZWxlY3RlZCgpKSB7XG4gICAgICB0aGlzLnNlbGVjdGlvbi5jbGVhcigpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBpdGVtcyA9IHRoaXMudmFsdWU7XG4gICAgICBpdGVtcy5mb3JFYWNoKChpdGVtKSA9PiB0aGlzLnNlbGVjdGlvbi5zZWxlY3QoaXRlbSkpO1xuICAgIH1cblxuICAgIGlmICghb3B0cyB8fCBvcHRzLmVtaXRFdmVudCAhPT0gZmFsc2UpIHtcbiAgICAgIHRoaXMuc2VsZWN0aW9uQ2hhbmdlcy5lbWl0KHRoaXMuc2VsZWN0aW9uLnNlbGVjdGVkKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBvbkl0ZW1DbGljayhldmVudDogTW91c2VFdmVudCwgaXRlbTogVCwgb3B0cz86IHsgZW1pdEV2ZW50PzogYm9vbGVhbiB9KSB7XG4gICAgaWYgKCFpdGVtIHx8IGV2ZW50LmRlZmF1bHRQcmV2ZW50ZWQgfHwgIXRoaXMuc2VsZWN0aW9uQ2hhbmdlcy5vYnNlcnZlZCkgcmV0dXJuO1xuXG4gICAgLy8gTXVsdGlwbGUgc2VsZWN0aW9uIChpZiBjdHJsK2NsaWNrKVxuICAgIGlmIChldmVudC5jdHJsS2V5ICYmIHRoaXMub3B0aW9ucy5hbGxvd011bHRpcGxlU2VsZWN0aW9uKSB7XG4gICAgICB0aGlzLnNlbGVjdGlvbi50b2dnbGUoaXRlbSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFVuc2VsZWN0IGFsbFxuXG4gICAgICAvLyBTZWxlY3QgdGhlIGl0ZW0gKG9yIHJlc2VsZWN0KVxuICAgICAgaWYgKCF0aGlzLnNlbGVjdGlvbi5pc1NlbGVjdGVkKGl0ZW0pIHx8ICh0aGlzLm9wdGlvbnMuYWxsb3dNdWx0aXBsZVNlbGVjdGlvbiAmJiB0aGlzLnNlbGVjdGlvbi5zZWxlY3RlZC5sZW5ndGggPiAxKSkge1xuICAgICAgICB0aGlzLnNlbGVjdGlvbi5jbGVhcigpO1xuICAgICAgICB0aGlzLnNlbGVjdGlvbi5zZWxlY3QoaXRlbSk7XG4gICAgICB9XG4gICAgICAvLyBVbnNlbGVjdCBhbGxcbiAgICAgIGVsc2Uge1xuICAgICAgICB0aGlzLnNlbGVjdGlvbi5jbGVhcigpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICghb3B0cyB8fCBvcHRzLmVtaXRFdmVudCAhPT0gZmFsc2UpIHtcbiAgICAgIHRoaXMuc2VsZWN0aW9uQ2hhbmdlcy5lbWl0KHRoaXMuc2VsZWN0aW9uLnNlbGVjdGVkKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBvbkl0ZW1CdXR0b25DbGljayhidXR0b246IEl0ZW1CdXR0b24sIGV2ZW50OiBNb3VzZUV2ZW50LCBpdGVtOiBULCBpbmRleDogbnVtYmVyKSB7XG4gICAgaWYgKGJ1dHRvbi5jbGljaykgYnV0dG9uLmNsaWNrKGV2ZW50LCBpdGVtLCBpbmRleCk7XG4gICAgYXdhaXQgdGhpcy5vbkl0ZW1DbGljayhldmVudCwgaXRlbSk7XG4gIH1cblxuICBoYXNTZWxlY3Rpb24oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuc2VsZWN0aW9uLmhhc1ZhbHVlKCk7XG4gIH1cblxuICBvbk5ld0NsaWNrKGV2ZW50KSB7XG4gICAgdGhpcy5vbk5ld0l0ZW0uZW1pdChldmVudCk7XG4gIH1cblxuICBhZGQodmFsdWU6IFQsIG9wdHM/OiB7IGVtaXRFdmVudD86IGJvb2xlYW4gfSkge1xuICAgIGNvbnN0IGRvbmUgPSB0aGlzLmhlbHBlci5hZGQodmFsdWUsIHsgZW1pdEV2ZW50OiB0cnVlIH0pO1xuICAgIGlmIChkb25lKSB7XG4gICAgICBpZiAoIXRoaXMub3B0aW9ucy5hbGxvd011bHRpcGxlU2VsZWN0aW9uKSB7XG4gICAgICAgIHRoaXMuc2VsZWN0aW9uLmNsZWFyKCk7XG4gICAgICB9XG4gICAgICB0aGlzLnNlbGVjdGlvbi50b2dnbGUodmFsdWUpO1xuICAgICAgdGhpcy5tYXJrRm9yQ2hlY2soKTtcblxuICAgICAgaWYgKCFvcHRzIHx8IG9wdHMuZW1pdEV2ZW50ICE9PSBmYWxzZSkge1xuICAgICAgICB0aGlzLnNlbGVjdGlvbkNoYW5nZXMuZW1pdCh0aGlzLnNlbGVjdGlvbi5zZWxlY3RlZCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmVtb3ZlQXQoaW5kZXg6IG51bWJlcikge1xuICAgIGNvbnN0IGl0ZW0gPSB0aGlzLmhlbHBlci5hdChpbmRleCkudmFsdWU7XG4gICAgaWYgKHRoaXMuc2VsZWN0aW9uLmlzU2VsZWN0ZWQoaXRlbSkpIHtcbiAgICAgIHRoaXMuc2VsZWN0aW9uLmRlc2VsZWN0KGl0ZW0pO1xuICAgIH1cbiAgICB0aGlzLmhlbHBlci5yZW1vdmVBdChpbmRleCk7XG4gIH1cblxuICBkaXNwbGF5V2l0aCh2YWx1ZTogVCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZGlzcGxheVdpdGhGbiA/IHRoaXMuZGlzcGxheVdpdGhGbih2YWx1ZSkgOiAodmFsdWUgYXMgYW55KTtcbiAgfVxuXG4gIC8qIC0tIHByb3RlY3RlZCBtZXRob2RzIC0tICovXG5cbiAgcHJvdGVjdGVkIGNyZWF0ZUNvbnRyb2woZGF0YT86IGFueSk6IEFic3RyYWN0Q29udHJvbCB7XG4gICAgcmV0dXJuIHRoaXMuZm9ybUJ1aWxkZXIuY29udHJvbChkYXRhIHx8IG51bGwsIFZhbGlkYXRvcnMucmVxdWlyZWQpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG1hcmtGb3JDaGVjaygpIHtcbiAgICB0aGlzLmNkLm1hcmtGb3JDaGVjaygpO1xuICB9XG59XG4iLCI8bmctY29udGFpbmVyICpuZ0lmPVwiIWxvYWRpbmc7IGVsc2UgbGlzdFNrZWxldG9uXCI+XG4gIDwhLS0gTGlzdCAtLT5cbiAgPGlvbi1saXN0IGNsYXNzPVwiaW9uLW5vLXBhZGRpbmdcIj5cbiAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBpdGVtQ29udHJvbCBvZiBpdGVtQ29udHJvbHM7IGluZGV4IGFzIGk7IGxhc3QgYXMgbGFzdFwiPlxuICAgICAgPGlvbi1pdGVtXG4gICAgICAgICpuZ0lmPVwiaXRlbUNvbnRyb2wudmFsdWU7IGxldCBpdGVtXCJcbiAgICAgICAgW2NsYXNzLmRpc2FibGVkXT1cImRpc2FibGVkXCJcbiAgICAgICAgdGFwcGFibGVcbiAgICAgICAgKGNsaWNrKT1cIm9uSXRlbUNsaWNrKCRldmVudCwgaXRlbSlcIlxuICAgICAgICBbY29sb3JdPVwic2VsZWN0aW9uLmlzU2VsZWN0ZWQoaXRlbSkgPyAnc2Vjb25kYXJ5MTAwJyA6IHVuZGVmaW5lZFwiXG4gICAgICAgIFtidXR0b25dPVwic2VsZWN0aW9uQ2hhbmdlcy5vYnNlcnZlcnMgfCBpc05vdEVtcHR5QXJyYXlcIlxuICAgICAgPlxuICAgICAgICA8aW9uLWxhYmVsPnt7IGRpc3BsYXlXaXRoKGl0ZW0pIH19PC9pb24tbGFiZWw+XG5cbiAgICAgICAgPCEtLSBidXR0b25zIC0tPlxuICAgICAgICA8aW9uLWJ1dHRvbnMgc2xvdD1cImVuZFwiICpuZ0lmPVwiZW5hYmxlZFwiIGNsYXNzPVwiYWN0aW9uLWJ1dHRvbnNcIj5cbiAgICAgICAgICA8aW9uLWJ1dHRvbiBmaWxsPVwiY2xlYXJcIiAoY2xpY2spPVwicmVtb3ZlQXQoaSlcIj5cbiAgICAgICAgICAgIDxpb24taWNvbiBzbG90PVwiaWNvbi1vbmx5XCIgbmFtZT1cInRyYXNoXCI+PC9pb24taWNvbj5cbiAgICAgICAgICA8L2lvbi1idXR0b24+XG5cbiAgICAgICAgICA8aW9uLWJ1dHRvblxuICAgICAgICAgICAgKm5nRm9yPVwibGV0IGJ1dHRvbiBvZiBvcHRpb25zLmJ1dHRvbnNcIlxuICAgICAgICAgICAgZmlsbD1cImNsZWFyXCJcbiAgICAgICAgICAgIFtjb2xvcl09XCJidXR0b24uY29sb3JcIlxuICAgICAgICAgICAgW2NsYXNzLmNkay12aXN1YWxseS1oaWRkZW5dPVwiYnV0dG9uLmRpc2FibGVkIHwgYXN5bmNcIlxuICAgICAgICAgICAgKGNsaWNrKT1cIm9uSXRlbUJ1dHRvbkNsaWNrKGJ1dHRvbiwgJGV2ZW50LCBpdGVtLCBpKVwiXG4gICAgICAgICAgICBbdGl0bGVdPVwiIXNob3dUb29sdGlwID8gKGJ1dHRvbi50aXRsZSB8fCAnJyB8IHRyYW5zbGF0ZSkgOiAnJ1wiXG4gICAgICAgICAgICBbbWF0VG9vbHRpcF09XCJzaG93VG9vbHRpcCA/IChidXR0b24udGl0bGUgfHwgJycgfCB0cmFuc2xhdGUpIDogJydcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxpb24taWNvbiBzbG90PVwiaWNvbi1vbmx5XCIgW25hbWVdPVwiYnV0dG9uLmljb25cIj48L2lvbi1pY29uPlxuICAgICAgICAgIDwvaW9uLWJ1dHRvbj5cbiAgICAgICAgPC9pb24tYnV0dG9ucz5cbiAgICAgIDwvaW9uLWl0ZW0+XG4gICAgPC9uZy1jb250YWluZXI+XG4gIDwvaW9uLWxpc3Q+XG5cbiAgPCEtLSBBZGQgYnV0dG9uIC0tPlxuICA8aW9uLWJ1dHRvblxuICAgIGNvbG9yPVwidGVydGlhcnlcIlxuICAgIGZpbGw9XCJjbGVhclwiXG4gICAgKm5nSWY9XCJlbmFibGVkICYmIG9uTmV3SXRlbS5vYnNlcnZlZDsgZWxzZSBlbXB0eVRleHRcIlxuICAgIFt0aXRsZV09XCIhc2hvd1Rvb2x0aXAgPyAoJ0NPTU1PTi5CVE5fQUREJyB8IHRyYW5zbGF0ZSkgOiAnJ1wiXG4gICAgW21hdFRvb2x0aXBdPVwic2hvd1Rvb2x0aXAgPyAoJ0NPTU1PTi5CVE5fQUREJyB8IHRyYW5zbGF0ZSkgOiAnJ1wiXG4gICAgKGNsaWNrKT1cIm9uTmV3Q2xpY2soJGV2ZW50KVwiXG4gID5cbiAgICA8aW9uLWljb24gc2xvdD1cInN0YXJ0XCIgbmFtZT1cImFkZFwiPjwvaW9uLWljb24+XG4gICAgPGlvbi1sYWJlbCB0cmFuc2xhdGU+Q09NTU9OLkJUTl9BREQ8L2lvbi1sYWJlbD5cbiAgPC9pb24tYnV0dG9uPlxuXG4gIDwhLS0gRW1wdHkgKGlmIHJlYWRvbmx5KSAtLT5cbiAgPG5nLXRlbXBsYXRlICNlbXB0eVRleHQ+XG4gICAgPGlvbi10ZXh0ICpuZ0lmPVwiIWxlbmd0aFwiIGNvbG9yPVwibWVkaXVtXCI+PGkgdHJhbnNsYXRlPkNPTU1PTi5FTVBUWV9PUFRJT048L2k+PC9pb24tdGV4dD5cbiAgPC9uZy10ZW1wbGF0ZT5cbjwvbmctY29udGFpbmVyPlxuXG48bmctdGVtcGxhdGUgI2xpc3RTa2VsZXRvbj5cbiAgPGlvbi1saXN0PlxuICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJpdGVtU2tlbGV0b25cIj48L25nLWNvbnRhaW5lcj5cbiAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiaXRlbVNrZWxldG9uXCI+PC9uZy1jb250YWluZXI+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cIml0ZW1Ta2VsZXRvblwiPjwvbmctY29udGFpbmVyPlxuICA8L2lvbi1saXN0PlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICNpdGVtU2tlbGV0b24+XG4gIDxpb24taXRlbT5cbiAgICA8aW9uLWxhYmVsPlxuICAgICAgPGlvbi1za2VsZXRvbi10ZXh0IGFuaW1hdGVkIHN0eWxlPVwid2lkdGg6IDYwJVwiPjwvaW9uLXNrZWxldG9uLXRleHQ+XG4gICAgPC9pb24tbGFiZWw+XG4gIDwvaW9uLWl0ZW0+XG48L25nLXRlbXBsYXRlPlxuIl19