@seniorsistemas/angular-components 19.9.2 → 19.9.3-feat-sds-595-78653c0e

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 (56) hide show
  1. package/README.md +99 -13
  2. package/checkbox/lib/checkbox/checkbox.component.d.ts +1 -6
  3. package/esm2022/checkbox/lib/checkbox/checkbox.component.mjs +3 -9
  4. package/esm2022/dynamic-form/dynamic-form/components/lookup/lookup.component.mjs +3 -3
  5. package/esm2022/dynamic-form/dynamic-form/components/structure/fieldset/fieldset.component.mjs +4 -3
  6. package/esm2022/dynamic-form/dynamic-form/form-field/fields/currency/currency-field.component.mjs +3 -3
  7. package/esm2022/dynamic-form/dynamic-form/form-field/fields/number/number-field.component.mjs +3 -3
  8. package/esm2022/editor/lib/editor/editor.component.mjs +4 -4
  9. package/esm2022/fieldset/lib/fieldset/fieldset.component.mjs +45 -34
  10. package/esm2022/file-picker/lib/file-picker/file-picker.component.mjs +4 -4
  11. package/esm2022/global-search/lib/global-search/components/dropdown/global-search-dropdown-item.component.mjs +4 -4
  12. package/esm2022/global-search/lib/global-search/global-search.module.mjs +2 -2
  13. package/esm2022/inline-edit/lib/inline-edit/components/fields/inline-edit-number/inline-edit-number.component.mjs +3 -3
  14. package/esm2022/inline-edit/lib/inline-edit/components/fields/inline-edit-text/inline-edit-text.component.mjs +2 -3
  15. package/esm2022/profile-picture-picker/lib/profile-picture-picker/profile-picture-picker.component.mjs +6 -8
  16. package/esm2022/profile-picture-picker/lib/profile-picture-picker/profile-picture-picker.module.mjs +3 -4
  17. package/esm2022/table-header/lib/table-header/table-header-checkbox.component.mjs +14 -21
  18. package/esm2022/tooltip/lib/tooltip/tooltip.directive.mjs +3 -2
  19. package/fesm2022/seniorsistemas-angular-components-checkbox.mjs +2 -8
  20. package/fesm2022/seniorsistemas-angular-components-checkbox.mjs.map +1 -1
  21. package/fesm2022/seniorsistemas-angular-components-dynamic-form.mjs +10 -10
  22. package/fesm2022/seniorsistemas-angular-components-dynamic-form.mjs.map +1 -1
  23. package/fesm2022/seniorsistemas-angular-components-editor.mjs +3 -3
  24. package/fesm2022/seniorsistemas-angular-components-editor.mjs.map +1 -1
  25. package/fesm2022/seniorsistemas-angular-components-fieldset.mjs +44 -33
  26. package/fesm2022/seniorsistemas-angular-components-fieldset.mjs.map +1 -1
  27. package/fesm2022/seniorsistemas-angular-components-file-picker.mjs +3 -3
  28. package/fesm2022/seniorsistemas-angular-components-file-picker.mjs.map +1 -1
  29. package/fesm2022/seniorsistemas-angular-components-global-search.mjs +3 -3
  30. package/fesm2022/seniorsistemas-angular-components-global-search.mjs.map +1 -1
  31. package/fesm2022/seniorsistemas-angular-components-inline-edit.mjs +3 -4
  32. package/fesm2022/seniorsistemas-angular-components-inline-edit.mjs.map +1 -1
  33. package/fesm2022/seniorsistemas-angular-components-profile-picture-picker.mjs +7 -9
  34. package/fesm2022/seniorsistemas-angular-components-profile-picture-picker.mjs.map +1 -1
  35. package/fesm2022/seniorsistemas-angular-components-table-header.mjs +13 -20
  36. package/fesm2022/seniorsistemas-angular-components-table-header.mjs.map +1 -1
  37. package/fesm2022/seniorsistemas-angular-components-tooltip.mjs +2 -1
  38. package/fesm2022/seniorsistemas-angular-components-tooltip.mjs.map +1 -1
  39. package/fieldset/README.md +77 -15
  40. package/fieldset/lib/fieldset/fieldset.component.d.ts +28 -14
  41. package/global-search/lib/global-search/global-search.module.d.ts +1 -1
  42. package/package.json +1 -3
  43. package/profile-picture-picker/lib/profile-picture-picker/profile-picture-picker.component.d.ts +1 -1
  44. package/schematics/collection.json +26 -1
  45. package/schematics/migrations/migrate-dynamic-form-v19/index.js +15 -34
  46. package/schematics/migrations/migrate-dynamic-form-v19/index.js.map +1 -1
  47. package/schematics/migrations/migrate-fieldset-body-template/index.d.ts +2 -0
  48. package/schematics/migrations/migrate-fieldset-body-template/index.js +421 -0
  49. package/schematics/migrations/migrate-fieldset-body-template/index.js.map +1 -0
  50. package/schematics/migrations/migrate-steps-to-stepper/index.js +1 -19
  51. package/schematics/migrations/migrate-steps-to-stepper/index.js.map +1 -1
  52. package/schematics/migrations.json +5 -0
  53. package/schematics/utils/ast-utils.d.ts +33 -1
  54. package/schematics/utils/ast-utils.js +175 -4
  55. package/schematics/utils/ast-utils.js.map +1 -1
  56. package/table-header/lib/table-header/table-header-checkbox.component.d.ts +1 -4
package/README.md CHANGED
@@ -1,25 +1,111 @@
1
- # AngularComponents
1
+ # @seniorsistemas/angular-components
2
2
 
3
- This library was generated with [Angular CLI](https://github.com/angular/angular-cli) version 18.2.0.
3
+ Biblioteca de componentes Angular reutilizáveis da Senior Sistemas, construída com Angular 18 e Tailwind CSS.
4
4
 
5
- ## Code scaffolding
5
+ Inclui mais de 70 componentes, diretivas e pipes para construção de interfaces — desde inputs e formulários dinâmicos até tabelas, kanban, chat e muito mais.
6
6
 
7
- Run `ng generate component component-name --project angular-components` to generate a new component. You can also use `ng generate directive|pipe|service|class|guard|interface|enum|module --project angular-components`.
7
+ ## Documentação
8
8
 
9
- > Note: Don't forget to add `--project angular-components` or else it will be added to the default project in your `angular.json` file.
9
+ A documentação oficial é feita via **Storybook**. Cada componente tem stories com exemplos interativos, descrição de inputs/outputs e variantes visuais.
10
10
 
11
- ## Build
11
+ ### Rodar o Storybook localmente
12
12
 
13
- Run `ng build angular-components` to build the project. The build artifacts will be stored in the `dist/` directory.
13
+ ```bash
14
+ npm run storybook
15
+ ```
14
16
 
15
- ## Publishing
17
+ Acesse em `http://localhost:6006`.
16
18
 
17
- After building your library with `ng build angular-components`, go to the dist folder `cd dist/angular-components` and run `npm publish`.
19
+ ### Build do Storybook
18
20
 
19
- ## Running unit tests
21
+ ```bash
22
+ npm run build-storybook
23
+ ```
20
24
 
21
- Run `ng test angular-components` to execute the unit tests via [Karma](https://karma-runner.github.io).
25
+ O output é gerado em `storybook-static/`.
22
26
 
23
- ## Further help
27
+ ## Showcase
28
+
29
+ Além do Storybook, há um projeto de showcase com exemplos reais de uso:
30
+
31
+ ```bash
32
+ npm run start
33
+ ```
34
+
35
+ Acesse em `http://localhost:4200`.
36
+
37
+ ## Estrutura do monorepo
38
+
39
+ ```
40
+ projects/
41
+ angular-components/ # Biblioteca de componentes
42
+ <nome-componente>/ # Cada componente é um sub-pacote independente
43
+ src/lib/
44
+ ng-package.json
45
+ showcase/ # Aplicação de demonstração
46
+ ```
47
+
48
+ ## Instalação
49
+
50
+ ```bash
51
+ npm install @seniorsistemas/angular-components
52
+ ```
53
+
54
+ Cada componente é importado individualmente pelo seu sub-pacote:
55
+
56
+ ```typescript
57
+ import { ButtonModule } from '@seniorsistemas/angular-components/button';
58
+ import { DynamicFormModule } from '@seniorsistemas/angular-components/dynamic-form';
59
+ ```
60
+
61
+ ## Schematics de migração
62
+
63
+ A biblioteca oferece schematics de migração via `ng update`, então é boa prática sempre atualizar a versão instalada com esse comando em vez de só trocar o número no `package.json` — além de atualizar a dependência, ele aplica automaticamente as migrations necessárias no seu projeto e mostra o que há de novo relevante para o seu código:
64
+
65
+ ```bash
66
+ ng update @seniorsistemas/angular-components
67
+ ```
68
+
69
+ Migrations disponíveis (por versão em que passam a ser aplicadas):
70
+
71
+ | Versão | Migration | O que faz |
72
+ | -------- | ------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
73
+ | `19.0.0` | `migration-v19-0-0-dynamic-form` | Migra o `DynamicForm` de v18 para v19: construtores → plain objects, enums → string literals, `[fields]` → `[configs]`, `Editor` → `provideEditorField()`, estilos → `angular.json` |
74
+ | `19.0.0` | `migration-v19-0-0-steps-to-stepper` | Migra `Steps` para `Stepper`: `<s-steps>` → `<s-stepper>`, import de `.../steps` → `.../stepper`, `StepsComponent` → `StepperComponent`, e remove o `StepsModule` (componente agora standalone) substituindo por `StepperComponent` |
75
+ | `19.6.0` | `migration-v19-6-0-p-datepicker` | Migra `p-datepicker` (PrimeNG) para `s-datepicker` (`@seniorsistemas/angular-components`) |
76
+ | `19.6.0` | `migration-v19-6-0-p-editor` | Migra `p-editor` (PrimeNG/Quill) para `s-editor`: renomeia tag e eventos, remove atributos sem equivalente, limpa configs legadas do `DynamicForm` e atualiza dependências do `package.json` |
77
+ | `19.6.2` | `migration-v19-6-2-s-chips-outputs` | Renomeia outputs legados do `s-chips`: `onAdd`→`added`, `onRemove`→`removed`, `onChipClick`→`chipClicked`, `onFocus`→`focused`, `onBlur`→`focusLost` |
78
+ | `19.9.3` | `migration-v19-9-3-fieldset-body-template` | Envolve o conteúdo projetado do `s-fieldset` em `<ng-template sTemplate="body">`, mantendo templates de slot como `sTemplate="header"` fora do body, e garante o `TemplateDirective` no escopo do componente (standalone ou via `NgModule`) |
79
+
80
+ A lista completa, com a `version` que dispara cada migration e a `factory` correspondente, fica em [`projects/angular-components/schematics/migrations.json`](projects/angular-components/schematics/migrations.json).
81
+
82
+ ### Executando uma migration individualmente
83
+
84
+ Se você já está na versão instalada (não chegou até ela via `ng update`) e só precisa aplicar uma migration específica no seu projeto, sem atualizar nada, há duas formas:
85
+
86
+ **Via `ng generate`** (mais simples) — cada migration também está disponível com um nome curto, sem o prefixo de versão (`migrate-<nome>` em vez de `migration-v<versão>-<nome>`):
87
+
88
+ ```bash
89
+ ng generate @seniorsistemas/angular-components:migrate-fieldset-body-template
90
+ ```
91
+
92
+ **Via `ng update --name`** (mais completo) — usa o nome versionado, o mesmo que aparece na tabela acima:
93
+
94
+ ```bash
95
+ ng update @seniorsistemas/angular-components --name migration-v19-9-3-fieldset-body-template
96
+ ```
97
+
98
+ Os dois rodam exatamente a mesma migration e nenhum dos dois altera a versão instalada ou reinstala dependências.
99
+
100
+ ## Build da biblioteca
101
+
102
+ ```bash
103
+ npm run build
104
+ ```
105
+
106
+ ## Testes
107
+
108
+ ```bash
109
+ npm run test
110
+ ```
24
111
 
25
- To get more help on the Angular CLI use `ng help` or go check out the [Angular CLI Overview and Command Reference](https://angular.dev/tools/cli) page.
@@ -28,11 +28,6 @@ export declare class CheckboxComponent implements ControlValueAccessor {
28
28
  ariaLabel: import("@angular/core").InputSignal<string | undefined>;
29
29
  /** @description ID do elemento que descreve o checkbox (para usar `<label for="...">`). Opcional. */
30
30
  ariaLabelledBy: import("@angular/core").InputSignal<string | undefined>;
31
- /**
32
- * @description Emitido quando o valor do checkbox é alterado pelo usuário.
33
- * Emite o novo valor booleano (`true` para marcado, `false` para desmarcado).
34
- */
35
- readonly checkedChange: import("@angular/core").OutputEmitterRef<boolean>;
36
31
  private _onChange;
37
32
  private _onTouched;
38
33
  private _hasUserInteracted;
@@ -49,5 +44,5 @@ export declare class CheckboxComponent implements ControlValueAccessor {
49
44
  setDisabledState(disabled: boolean): void;
50
45
  onBlur(): void;
51
46
  static ɵfac: i0.ɵɵFactoryDeclaration<CheckboxComponent, never>;
52
- static ɵcmp: i0.ɵɵComponentDeclaration<CheckboxComponent, "s-checkbox", never, { "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "checked": { "alias": "checked"; "required": false; "isSignal": true; }; "indeterminate": { "alias": "indeterminate"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; "ariaLabelledBy": { "alias": "ariaLabelledBy"; "required": false; "isSignal": true; }; }, { "disabled": "disabledChange"; "checked": "checkedChange"; "checkedChange": "checkedChange"; }, never, never, true, never>;
47
+ static ɵcmp: i0.ɵɵComponentDeclaration<CheckboxComponent, "s-checkbox", never, { "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "checked": { "alias": "checked"; "required": false; "isSignal": true; }; "indeterminate": { "alias": "indeterminate"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; "ariaLabelledBy": { "alias": "ariaLabelledBy"; "required": false; "isSignal": true; }; }, { "disabled": "disabledChange"; "checked": "checkedChange"; }, never, never, true, never>;
53
48
  }
@@ -1,4 +1,4 @@
1
- import { Component, computed, forwardRef, input, model, output, signal } from '@angular/core';
1
+ import { Component, computed, forwardRef, input, model, signal } from '@angular/core';
2
2
  import { NG_VALUE_ACCESSOR } from '@angular/forms';
3
3
  import * as i0 from "@angular/core";
4
4
  /**
@@ -29,11 +29,6 @@ export class CheckboxComponent {
29
29
  ariaLabel = input(undefined);
30
30
  /** @description ID do elemento que descreve o checkbox (para usar `<label for="...">`). Opcional. */
31
31
  ariaLabelledBy = input(undefined);
32
- /**
33
- * @description Emitido quando o valor do checkbox é alterado pelo usuário.
34
- * Emite o novo valor booleano (`true` para marcado, `false` para desmarcado).
35
- */
36
- checkedChange = output();
37
32
  _onChange = () => { };
38
33
  _onTouched = () => { };
39
34
  _hasUserInteracted = signal(false);
@@ -59,7 +54,6 @@ export class CheckboxComponent {
59
54
  }
60
55
  emit(value) {
61
56
  this._onChange(value);
62
- this.checkedChange.emit(value);
63
57
  }
64
58
  writeValue(value) {
65
59
  this.checked.set(!!value);
@@ -77,7 +71,7 @@ export class CheckboxComponent {
77
71
  this._onTouched();
78
72
  }
79
73
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: CheckboxComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
80
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: CheckboxComponent, isStandalone: true, selector: "s-checkbox", inputs: { disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, checked: { classPropertyName: "checked", publicName: "checked", isSignal: true, isRequired: false, transformFunction: null }, indeterminate: { classPropertyName: "indeterminate", publicName: "indeterminate", isSignal: true, isRequired: false, transformFunction: null }, label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: false, transformFunction: null }, ariaLabel: { classPropertyName: "ariaLabel", publicName: "ariaLabel", isSignal: true, isRequired: false, transformFunction: null }, ariaLabelledBy: { classPropertyName: "ariaLabelledBy", publicName: "ariaLabelledBy", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { disabled: "disabledChange", checked: "checkedChange", checkedChange: "checkedChange" }, providers: [
74
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: CheckboxComponent, isStandalone: true, selector: "s-checkbox", inputs: { disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, checked: { classPropertyName: "checked", publicName: "checked", isSignal: true, isRequired: false, transformFunction: null }, indeterminate: { classPropertyName: "indeterminate", publicName: "indeterminate", isSignal: true, isRequired: false, transformFunction: null }, label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: false, transformFunction: null }, ariaLabel: { classPropertyName: "ariaLabel", publicName: "ariaLabel", isSignal: true, isRequired: false, transformFunction: null }, ariaLabelledBy: { classPropertyName: "ariaLabelledBy", publicName: "ariaLabelledBy", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { disabled: "disabledChange", checked: "checkedChange" }, providers: [
81
75
  {
82
76
  provide: NG_VALUE_ACCESSOR,
83
77
  useExisting: forwardRef(() => CheckboxComponent),
@@ -95,4 +89,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
95
89
  },
96
90
  ], template: "<div\n class=\"group flex cursor-pointer select-none gap-3 outline-none\"\n [class.cursor-not-allowed]=\"disabled()\"\n tabindex=\"0\"\n role=\"checkbox\"\n [attr.aria-checked]=\"isIndeterminate() ? 'mixed' : checked()\"\n [attr.aria-disabled]=\"disabled()\"\n [attr.aria-label]=\"ariaLabel() || label() || null\"\n [attr.aria-labelledby]=\"ariaLabelledBy() || null\"\n (click)=\"toggle()\"\n (keydown.space)=\"toggle(); $event.preventDefault()\"\n (blur)=\"onBlur()\"\n>\n <div\n class=\"rounded flex h-5 w-5 flex-shrink-0 items-center justify-center border border-grayscale-30\n transition-all duration-200 hover:border-grayscale-50\n group-focus-visible:ring-2 group-focus-visible:ring-primary group-focus-visible:ring-offset-1\"\n [class.bg-primary]=\"checked() || isIndeterminate()\"\n [class.hover:bg-tarawera-500]=\"checked() || isIndeterminate()\"\n [class.bg-grayscale-0]=\"!checked() && !isIndeterminate()\"\n [class.border-primary]=\"checked() || isIndeterminate()\"\n [class.hover:border-tarawera-500]=\"checked() || isIndeterminate()\"\n [class.opacity-50]=\"disabled()\"\n >\n @if (isIndeterminate()) {\n <svg\n class=\"h-3 w-3 text-grayscale-0\"\n fill=\"none\"\n stroke=\"white\"\n stroke-width=\"4\"\n viewBox=\"0 0 24 24\"\n aria-hidden=\"true\"\n >\n <path d=\"M6 12h12\" />\n </svg>\n } @else {\n @if (checked()) {\n <svg\n class=\"text-grayscale-0 h-3 w-3\"\n fill=\"none\"\n stroke=\"white\"\n stroke-width=\"4\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n viewBox=\"0 0 24 24\"\n aria-hidden=\"true\"\n >\n <path d=\"M4.5 12.75l5.5 5.5 9.5-9.5\" />\n </svg>\n }\n }\n </div>\n\n @if (label()) {\n <span\n [class.opacity-50]=\"disabled()\"\n class=\"text-grayscale-90 ml-2\"\n aria-hidden=\"true\"\n >\n {{ label() }}\n </span>\n }\n</div>\n" }]
97
91
  }] });
98
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hlY2tib3guY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYW5ndWxhci1jb21wb25lbnRzL2NoZWNrYm94L3NyYy9saWIvY2hlY2tib3gvY2hlY2tib3guY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYW5ndWxhci1jb21wb25lbnRzL2NoZWNrYm94L3NyYy9saWIvY2hlY2tib3gvY2hlY2tib3guY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM5RixPQUFPLEVBQXdCLGlCQUFpQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7O0FBRXpFOzs7Ozs7Ozs7Ozs7OztHQWNHO0FBY0gsTUFBTSxPQUFPLGlCQUFpQjtJQUMxQixzRkFBc0Y7SUFDL0UsUUFBUSxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUMvQiw0RkFBNEY7SUFDckYsT0FBTyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUM5Qix3SUFBd0k7SUFDakksYUFBYSxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNwQywyRUFBMkU7SUFDcEUsS0FBSyxHQUFHLEtBQUssQ0FBUyxFQUFFLENBQUMsQ0FBQztJQUNqQyx3R0FBd0c7SUFDakcsU0FBUyxHQUFHLEtBQUssQ0FBcUIsU0FBUyxDQUFDLENBQUM7SUFDeEQscUdBQXFHO0lBQzlGLGNBQWMsR0FBRyxLQUFLLENBQXFCLFNBQVMsQ0FBQyxDQUFDO0lBRTdEOzs7T0FHRztJQUNhLGFBQWEsR0FBRyxNQUFNLEVBQVcsQ0FBQztJQUUxQyxTQUFTLEdBQTZCLEdBQUcsRUFBRSxHQUFFLENBQUMsQ0FBQztJQUMvQyxVQUFVLEdBQWUsR0FBRyxFQUFFLEdBQUUsQ0FBQyxDQUFDO0lBQ2xDLGtCQUFrQixHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUUzQzs7O09BR0c7SUFDYSxlQUFlLEdBQUcsUUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDLENBQUM7SUFFOUYsTUFBTTtRQUNULElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUM7WUFDbEIsT0FBTztRQUNYLENBQUM7UUFFRCxJQUFJLElBQUksQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxFQUFFLENBQUM7WUFDckQsSUFBSSxDQUFDLGtCQUFrQixDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNsQyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUN2QixJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3BCLENBQUM7YUFBTSxDQUFDO1lBQ0osTUFBTSxRQUFRLEdBQUcsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDakMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDM0IsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUN4QixDQUFDO0lBQ0wsQ0FBQztJQUVPLElBQUksQ0FBQyxLQUFjO1FBQ3ZCLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDdEIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDbkMsQ0FBQztJQUVNLFVBQVUsQ0FBQyxLQUFVO1FBQ3hCLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUM5QixDQUFDO0lBRU0sZ0JBQWdCLENBQUMsUUFBa0M7UUFDdEQsSUFBSSxDQUFDLFNBQVMsR0FBRyxRQUFRLENBQUM7SUFDOUIsQ0FBQztJQUVNLGlCQUFpQixDQUFDLFNBQXFCO1FBQzFDLElBQUksQ0FBQyxVQUFVLEdBQUcsU0FBUyxDQUFDO0lBQ2hDLENBQUM7SUFFTSxnQkFBZ0IsQ0FBQyxRQUFpQjtRQUNyQyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUNoQyxDQUFDO0lBRU0sTUFBTTtRQUNULElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztJQUN0QixDQUFDO3dHQXJFUSxpQkFBaUI7NEZBQWpCLGlCQUFpQixzOEJBVGY7WUFDUDtnQkFDSSxPQUFPLEVBQUUsaUJBQWlCO2dCQUMxQixXQUFXLEVBQUUsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLGlCQUFpQixDQUFDO2dCQUNoRCxLQUFLLEVBQUUsSUFBSTthQUNkO1NBQ0osMEJDNUJMLDZ6RUErREE7OzRGRGhDYSxpQkFBaUI7a0JBYjdCLFNBQVM7K0JBQ0ksWUFBWSxjQUNWLElBQUksV0FDUCxFQUFFLGFBQ0E7d0JBQ1A7NEJBQ0ksT0FBTyxFQUFFLGlCQUFpQjs0QkFDMUIsV0FBVyxFQUFFLFVBQVUsQ0FBQyxHQUFHLEVBQUUsa0JBQWtCLENBQUM7NEJBQ2hELEtBQUssRUFBRSxJQUFJO3lCQUNkO3FCQUNKIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBjb21wdXRlZCwgZm9yd2FyZFJlZiwgaW5wdXQsIG1vZGVsLCBvdXRwdXQsIHNpZ25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBDb250cm9sVmFsdWVBY2Nlc3NvciwgTkdfVkFMVUVfQUNDRVNTT1IgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcblxyXG4vKipcclxuICogQGRlc2NyaXB0aW9uIENvbXBvbmVudGUgZGUgY2FpeGEgZGUgc2VsZcOnw6NvIChjaGVja2JveCkgY29tIHN1cG9ydGUgYSB0csOqcyBlc3RhZG9zOlxyXG4gKiBtYXJjYWRvLCBkZXNtYXJjYWRvIGUgaW5kZXRlcm1pbmFkby4gSW1wbGVtZW50YSB7QGxpbmsgQ29udHJvbFZhbHVlQWNjZXNzb3J9IHBhcmFcclxuICogaW50ZWdyYcOnw6NvIGNvbSBSZWFjdGl2ZSBGb3JtcyBlIFRlbXBsYXRlLWRyaXZlbiBGb3JtcyBkbyBBbmd1bGFyLlxyXG4gKlxyXG4gKiBAZXhhbXBsZVxyXG4gKiBgYGBodG1sXHJcbiAqIDxzLWNoZWNrYm94XHJcbiAqICAgZm9ybUNvbnRyb2xOYW1lPVwiYWNlaXRvXCJcclxuICogICBsYWJlbD1cIkFjZWl0byBvcyB0ZXJtb3MgZGUgdXNvXCJcclxuICogICBbaW5kZXRlcm1pbmF0ZV09XCJwYXJjaWFsbWVudGVTZWxlY2lvbmFkb1wiIC8+XHJcbiAqIGBgYFxyXG4gKlxyXG4gKiBAY2F0ZWdvcnkgSW5wdXRzXHJcbiAqL1xyXG5AQ29tcG9uZW50KHtcclxuICAgIHNlbGVjdG9yOiAncy1jaGVja2JveCcsXHJcbiAgICBzdGFuZGFsb25lOiB0cnVlLFxyXG4gICAgaW1wb3J0czogW10sXHJcbiAgICBwcm92aWRlcnM6IFtcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxyXG4gICAgICAgICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBDaGVja2JveENvbXBvbmVudCksXHJcbiAgICAgICAgICAgIG11bHRpOiB0cnVlLFxyXG4gICAgICAgIH0sXHJcbiAgICBdLFxyXG4gICAgdGVtcGxhdGVVcmw6ICcuL2NoZWNrYm94LmNvbXBvbmVudC5odG1sJyxcclxufSlcclxuZXhwb3J0IGNsYXNzIENoZWNrYm94Q29tcG9uZW50IGltcGxlbWVudHMgQ29udHJvbFZhbHVlQWNjZXNzb3Ige1xyXG4gICAgLyoqIEBkZXNjcmlwdGlvbiBDb250cm9sYSBvIGVzdGFkbyBkZXNhYmlsaXRhZG8gdmlhIHR3by13YXkgYmluZGluZy4gQGRlZmF1bHQgZmFsc2UgKi9cclxuICAgIHB1YmxpYyBkaXNhYmxlZCA9IG1vZGVsKGZhbHNlKTtcclxuICAgIC8qKiBAZGVzY3JpcHRpb24gVmFsb3IgbWFyY2Fkby9kZXNtYXJjYWRvIGRvIGNoZWNrYm94IHZpYSB0d28td2F5IGJpbmRpbmcuIEBkZWZhdWx0IGZhbHNlICovXHJcbiAgICBwdWJsaWMgY2hlY2tlZCA9IG1vZGVsKGZhbHNlKTtcclxuICAgIC8qKiBAZGVzY3JpcHRpb24gUXVhbmRvIGB0cnVlYCwgbyBjaGVja2JveCBpbmljaWEgbm8gZXN0YWRvIGluZGV0ZXJtaW5hZG8gKHRyYcOnbykgYXTDqSBhIHByaW1laXJhIGludGVyYcOnw6NvIGRvIHVzdcOhcmlvLiBAZGVmYXVsdCBmYWxzZSAqL1xyXG4gICAgcHVibGljIGluZGV0ZXJtaW5hdGUgPSBpbnB1dChmYWxzZSk7XHJcbiAgICAvKiogQGRlc2NyaXB0aW9uIFRleHRvIGRvIGxhYmVsIGV4aWJpZG8gYW8gbGFkbyBkbyBjaGVja2JveC4gQGRlZmF1bHQgJycgKi9cclxuICAgIHB1YmxpYyBsYWJlbCA9IGlucHV0PHN0cmluZz4oJycpO1xyXG4gICAgLyoqIEBkZXNjcmlwdGlvbiBSw7N0dWxvIGFjZXNzw612ZWwgcGFyYSBsZWl0b3JlcyBkZSB0ZWxhLiBPcGNpb25hbCwgcG9yIHBhZHLDo28gdXNhIG8gdmFsb3IgZGUgYGxhYmVsYC4gKi9cclxuICAgIHB1YmxpYyBhcmlhTGFiZWwgPSBpbnB1dDxzdHJpbmcgfCB1bmRlZmluZWQ+KHVuZGVmaW5lZCk7XHJcbiAgICAvKiogQGRlc2NyaXB0aW9uIElEIGRvIGVsZW1lbnRvIHF1ZSBkZXNjcmV2ZSBvIGNoZWNrYm94IChwYXJhIHVzYXIgYDxsYWJlbCBmb3I9XCIuLi5cIj5gKS4gT3BjaW9uYWwuICovXHJcbiAgICBwdWJsaWMgYXJpYUxhYmVsbGVkQnkgPSBpbnB1dDxzdHJpbmcgfCB1bmRlZmluZWQ+KHVuZGVmaW5lZCk7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gRW1pdGlkbyBxdWFuZG8gbyB2YWxvciBkbyBjaGVja2JveCDDqSBhbHRlcmFkbyBwZWxvIHVzdcOhcmlvLlxyXG4gICAgICogRW1pdGUgbyBub3ZvIHZhbG9yIGJvb2xlYW5vIChgdHJ1ZWAgcGFyYSBtYXJjYWRvLCBgZmFsc2VgIHBhcmEgZGVzbWFyY2FkbykuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyByZWFkb25seSBjaGVja2VkQ2hhbmdlID0gb3V0cHV0PGJvb2xlYW4+KCk7XHJcblxyXG4gICAgcHJpdmF0ZSBfb25DaGFuZ2U6ICh2YWx1ZTogYm9vbGVhbikgPT4gdm9pZCA9ICgpID0+IHt9O1xyXG4gICAgcHJpdmF0ZSBfb25Ub3VjaGVkOiAoKSA9PiB2b2lkID0gKCkgPT4ge307XHJcbiAgICBwcml2YXRlIF9oYXNVc2VySW50ZXJhY3RlZCA9IHNpZ25hbChmYWxzZSk7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gQ29tcHV0ZWQgcXVlIGluZGljYSBzZSBvIGVzdGFkbyBpbmRldGVybWluYWRvIGRldmUgc2VyIGV4aWJpZG8uXHJcbiAgICAgKiBSZXRvcm5hIGB0cnVlYCBlbnF1YW50byBgaW5kZXRlcm1pbmF0ZWAgZm9yIGB0cnVlYCBlIG8gdXN1w6FyaW8gbsOjbyB0aXZlciBpbnRlcmFnaWRvLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgcmVhZG9ubHkgaXNJbmRldGVybWluYXRlID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5pbmRldGVybWluYXRlKCkgJiYgIXRoaXMuX2hhc1VzZXJJbnRlcmFjdGVkKCkpO1xyXG5cclxuICAgIHB1YmxpYyB0b2dnbGUoKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKHRoaXMuZGlzYWJsZWQoKSkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5pbmRldGVybWluYXRlKCkgJiYgIXRoaXMuX2hhc1VzZXJJbnRlcmFjdGVkKCkpIHtcclxuICAgICAgICAgICAgdGhpcy5faGFzVXNlckludGVyYWN0ZWQuc2V0KHRydWUpO1xyXG4gICAgICAgICAgICB0aGlzLmNoZWNrZWQuc2V0KHRydWUpO1xyXG4gICAgICAgICAgICB0aGlzLmVtaXQodHJ1ZSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgY29uc3QgbmV3VmFsdWUgPSAhdGhpcy5jaGVja2VkKCk7XHJcbiAgICAgICAgICAgIHRoaXMuY2hlY2tlZC5zZXQobmV3VmFsdWUpO1xyXG4gICAgICAgICAgICB0aGlzLmVtaXQobmV3VmFsdWUpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGVtaXQodmFsdWU6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgICAgICB0aGlzLl9vbkNoYW5nZSh2YWx1ZSk7XHJcbiAgICAgICAgdGhpcy5jaGVja2VkQ2hhbmdlLmVtaXQodmFsdWUpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyB3cml0ZVZhbHVlKHZhbHVlOiBhbnkpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLmNoZWNrZWQuc2V0KCEhdmFsdWUpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyByZWdpc3Rlck9uQ2hhbmdlKG9uQ2hhbmdlOiAodmFsdWU6IGJvb2xlYW4pID0+IHZvaWQpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLl9vbkNoYW5nZSA9IG9uQ2hhbmdlO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyByZWdpc3Rlck9uVG91Y2hlZChvblRvdWNoZWQ6ICgpID0+IHZvaWQpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLl9vblRvdWNoZWQgPSBvblRvdWNoZWQ7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHNldERpc2FibGVkU3RhdGUoZGlzYWJsZWQ6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgICAgICB0aGlzLmRpc2FibGVkLnNldChkaXNhYmxlZCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIG9uQmx1cigpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLl9vblRvdWNoZWQoKTtcclxuICAgIH1cclxufVxyXG4iLCI8ZGl2XG4gICAgY2xhc3M9XCJncm91cCBmbGV4IGN1cnNvci1wb2ludGVyIHNlbGVjdC1ub25lIGdhcC0zIG91dGxpbmUtbm9uZVwiXG4gICAgW2NsYXNzLmN1cnNvci1ub3QtYWxsb3dlZF09XCJkaXNhYmxlZCgpXCJcbiAgICB0YWJpbmRleD1cIjBcIlxuICAgIHJvbGU9XCJjaGVja2JveFwiXG4gICAgW2F0dHIuYXJpYS1jaGVja2VkXT1cImlzSW5kZXRlcm1pbmF0ZSgpID8gJ21peGVkJyA6IGNoZWNrZWQoKVwiXG4gICAgW2F0dHIuYXJpYS1kaXNhYmxlZF09XCJkaXNhYmxlZCgpXCJcbiAgICBbYXR0ci5hcmlhLWxhYmVsXT1cImFyaWFMYWJlbCgpIHx8IGxhYmVsKCkgfHwgbnVsbFwiXG4gICAgW2F0dHIuYXJpYS1sYWJlbGxlZGJ5XT1cImFyaWFMYWJlbGxlZEJ5KCkgfHwgbnVsbFwiXG4gICAgKGNsaWNrKT1cInRvZ2dsZSgpXCJcbiAgICAoa2V5ZG93bi5zcGFjZSk9XCJ0b2dnbGUoKTsgJGV2ZW50LnByZXZlbnREZWZhdWx0KClcIlxuICAgIChibHVyKT1cIm9uQmx1cigpXCJcbj5cbiAgICA8ZGl2XG4gICAgICAgIGNsYXNzPVwicm91bmRlZCBmbGV4IGgtNSB3LTUgZmxleC1zaHJpbmstMCBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgYm9yZGVyIGJvcmRlci1ncmF5c2NhbGUtMzBcbiAgICAgICAgICAgICAgIHRyYW5zaXRpb24tYWxsIGR1cmF0aW9uLTIwMCBob3Zlcjpib3JkZXItZ3JheXNjYWxlLTUwXG4gICAgICAgICAgICAgICBncm91cC1mb2N1cy12aXNpYmxlOnJpbmctMiBncm91cC1mb2N1cy12aXNpYmxlOnJpbmctcHJpbWFyeSBncm91cC1mb2N1cy12aXNpYmxlOnJpbmctb2Zmc2V0LTFcIlxuICAgICAgICBbY2xhc3MuYmctcHJpbWFyeV09XCJjaGVja2VkKCkgfHwgaXNJbmRldGVybWluYXRlKClcIlxuICAgICAgICBbY2xhc3MuaG92ZXI6YmctdGFyYXdlcmEtNTAwXT1cImNoZWNrZWQoKSB8fCBpc0luZGV0ZXJtaW5hdGUoKVwiXG4gICAgICAgIFtjbGFzcy5iZy1ncmF5c2NhbGUtMF09XCIhY2hlY2tlZCgpICYmICFpc0luZGV0ZXJtaW5hdGUoKVwiXG4gICAgICAgIFtjbGFzcy5ib3JkZXItcHJpbWFyeV09XCJjaGVja2VkKCkgfHwgaXNJbmRldGVybWluYXRlKClcIlxuICAgICAgICBbY2xhc3MuaG92ZXI6Ym9yZGVyLXRhcmF3ZXJhLTUwMF09XCJjaGVja2VkKCkgfHwgaXNJbmRldGVybWluYXRlKClcIlxuICAgICAgICBbY2xhc3Mub3BhY2l0eS01MF09XCJkaXNhYmxlZCgpXCJcbiAgICA+XG4gICAgICAgIEBpZiAoaXNJbmRldGVybWluYXRlKCkpIHtcbiAgICAgICAgICAgIDxzdmdcbiAgICAgICAgICAgICAgICBjbGFzcz1cImgtMyB3LTMgdGV4dC1ncmF5c2NhbGUtMFwiXG4gICAgICAgICAgICAgICAgZmlsbD1cIm5vbmVcIlxuICAgICAgICAgICAgICAgIHN0cm9rZT1cIndoaXRlXCJcbiAgICAgICAgICAgICAgICBzdHJva2Utd2lkdGg9XCI0XCJcbiAgICAgICAgICAgICAgICB2aWV3Qm94PVwiMCAwIDI0IDI0XCJcbiAgICAgICAgICAgICAgICBhcmlhLWhpZGRlbj1cInRydWVcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNNiAxMmgxMlwiIC8+XG4gICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgICBAaWYgKGNoZWNrZWQoKSkge1xuICAgICAgICAgICAgICAgIDxzdmdcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ0ZXh0LWdyYXlzY2FsZS0wIGgtMyB3LTNcIlxuICAgICAgICAgICAgICAgICAgICBmaWxsPVwibm9uZVwiXG4gICAgICAgICAgICAgICAgICAgIHN0cm9rZT1cIndoaXRlXCJcbiAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLXdpZHRoPVwiNFwiXG4gICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIlxuICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiXG4gICAgICAgICAgICAgICAgICAgIHZpZXdCb3g9XCIwIDAgMjQgMjRcIlxuICAgICAgICAgICAgICAgICAgICBhcmlhLWhpZGRlbj1cInRydWVcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk00LjUgMTIuNzVsNS41IDUuNSA5LjUtOS41XCIgLz5cbiAgICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIDwvZGl2PlxuXG4gICAgQGlmIChsYWJlbCgpKSB7XG4gICAgICAgIDxzcGFuXG4gICAgICAgICAgICBbY2xhc3Mub3BhY2l0eS01MF09XCJkaXNhYmxlZCgpXCJcbiAgICAgICAgICAgIGNsYXNzPVwidGV4dC1ncmF5c2NhbGUtOTAgbWwtMlwiXG4gICAgICAgICAgICBhcmlhLWhpZGRlbj1cInRydWVcIlxuICAgICAgICA+XG4gICAgICAgICAgICB7eyBsYWJlbCgpIH19XG4gICAgICAgIDwvc3Bhbj5cbiAgICB9XG48L2Rpdj5cbiJdfQ==
92
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hlY2tib3guY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYW5ndWxhci1jb21wb25lbnRzL2NoZWNrYm94L3NyYy9saWIvY2hlY2tib3gvY2hlY2tib3guY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYW5ndWxhci1jb21wb25lbnRzL2NoZWNrYm94L3NyYy9saWIvY2hlY2tib3gvY2hlY2tib3guY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3RGLE9BQU8sRUFBd0IsaUJBQWlCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7QUFFekU7Ozs7Ozs7Ozs7Ozs7O0dBY0c7QUFjSCxNQUFNLE9BQU8saUJBQWlCO0lBQzFCLHNGQUFzRjtJQUMvRSxRQUFRLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQy9CLDRGQUE0RjtJQUNyRixPQUFPLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzlCLHdJQUF3STtJQUNqSSxhQUFhLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3BDLDJFQUEyRTtJQUNwRSxLQUFLLEdBQUcsS0FBSyxDQUFTLEVBQUUsQ0FBQyxDQUFDO0lBQ2pDLHdHQUF3RztJQUNqRyxTQUFTLEdBQUcsS0FBSyxDQUFxQixTQUFTLENBQUMsQ0FBQztJQUN4RCxxR0FBcUc7SUFDOUYsY0FBYyxHQUFHLEtBQUssQ0FBcUIsU0FBUyxDQUFDLENBQUM7SUFFckQsU0FBUyxHQUE2QixHQUFHLEVBQUUsR0FBRSxDQUFDLENBQUM7SUFDL0MsVUFBVSxHQUFlLEdBQUcsRUFBRSxHQUFFLENBQUMsQ0FBQztJQUNsQyxrQkFBa0IsR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7SUFFM0M7OztPQUdHO0lBQ2EsZUFBZSxHQUFHLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQyxDQUFDO0lBRTlGLE1BQU07UUFDVCxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDO1lBQ2xCLE9BQU87UUFDWCxDQUFDO1FBRUQsSUFBSSxJQUFJLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsa0JBQWtCLEVBQUUsRUFBRSxDQUFDO1lBQ3JELElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDbEMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDdkIsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNwQixDQUFDO2FBQU0sQ0FBQztZQUNKLE1BQU0sUUFBUSxHQUFHLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ2pDLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQzNCLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDeEIsQ0FBQztJQUNMLENBQUM7SUFFTyxJQUFJLENBQUMsS0FBYztRQUN2QixJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzFCLENBQUM7SUFFTSxVQUFVLENBQUMsS0FBVTtRQUN4QixJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDOUIsQ0FBQztJQUVNLGdCQUFnQixDQUFDLFFBQWtDO1FBQ3RELElBQUksQ0FBQyxTQUFTLEdBQUcsUUFBUSxDQUFDO0lBQzlCLENBQUM7SUFFTSxpQkFBaUIsQ0FBQyxTQUFxQjtRQUMxQyxJQUFJLENBQUMsVUFBVSxHQUFHLFNBQVMsQ0FBQztJQUNoQyxDQUFDO0lBRU0sZ0JBQWdCLENBQUMsUUFBaUI7UUFDckMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDaEMsQ0FBQztJQUVNLE1BQU07UUFDVCxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7SUFDdEIsQ0FBQzt3R0E5RFEsaUJBQWlCOzRGQUFqQixpQkFBaUIsczZCQVRmO1lBQ1A7Z0JBQ0ksT0FBTyxFQUFFLGlCQUFpQjtnQkFDMUIsV0FBVyxFQUFFLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxpQkFBaUIsQ0FBQztnQkFDaEQsS0FBSyxFQUFFLElBQUk7YUFDZDtTQUNKLDBCQzVCTCw2ekVBK0RBOzs0RkRoQ2EsaUJBQWlCO2tCQWI3QixTQUFTOytCQUNJLFlBQVksY0FDVixJQUFJLFdBQ1AsRUFBRSxhQUNBO3dCQUNQOzRCQUNJLE9BQU8sRUFBRSxpQkFBaUI7NEJBQzFCLFdBQVcsRUFBRSxVQUFVLENBQUMsR0FBRyxFQUFFLGtCQUFrQixDQUFDOzRCQUNoRCxLQUFLLEVBQUUsSUFBSTt5QkFDZDtxQkFDSiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgY29tcHV0ZWQsIGZvcndhcmRSZWYsIGlucHV0LCBtb2RlbCwgc2lnbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBOR19WQUxVRV9BQ0NFU1NPUiB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuXHJcbi8qKlxyXG4gKiBAZGVzY3JpcHRpb24gQ29tcG9uZW50ZSBkZSBjYWl4YSBkZSBzZWxlw6fDo28gKGNoZWNrYm94KSBjb20gc3Vwb3J0ZSBhIHRyw6pzIGVzdGFkb3M6XHJcbiAqIG1hcmNhZG8sIGRlc21hcmNhZG8gZSBpbmRldGVybWluYWRvLiBJbXBsZW1lbnRhIHtAbGluayBDb250cm9sVmFsdWVBY2Nlc3Nvcn0gcGFyYVxyXG4gKiBpbnRlZ3Jhw6fDo28gY29tIFJlYWN0aXZlIEZvcm1zIGUgVGVtcGxhdGUtZHJpdmVuIEZvcm1zIGRvIEFuZ3VsYXIuXHJcbiAqXHJcbiAqIEBleGFtcGxlXHJcbiAqIGBgYGh0bWxcclxuICogPHMtY2hlY2tib3hcclxuICogICBmb3JtQ29udHJvbE5hbWU9XCJhY2VpdG9cIlxyXG4gKiAgIGxhYmVsPVwiQWNlaXRvIG9zIHRlcm1vcyBkZSB1c29cIlxyXG4gKiAgIFtpbmRldGVybWluYXRlXT1cInBhcmNpYWxtZW50ZVNlbGVjaW9uYWRvXCIgLz5cclxuICogYGBgXHJcbiAqXHJcbiAqIEBjYXRlZ29yeSBJbnB1dHNcclxuICovXHJcbkBDb21wb25lbnQoe1xyXG4gICAgc2VsZWN0b3I6ICdzLWNoZWNrYm94JyxcclxuICAgIHN0YW5kYWxvbmU6IHRydWUsXHJcbiAgICBpbXBvcnRzOiBbXSxcclxuICAgIHByb3ZpZGVyczogW1xyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXHJcbiAgICAgICAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IENoZWNrYm94Q29tcG9uZW50KSxcclxuICAgICAgICAgICAgbXVsdGk6IHRydWUsXHJcbiAgICAgICAgfSxcclxuICAgIF0sXHJcbiAgICB0ZW1wbGF0ZVVybDogJy4vY2hlY2tib3guY29tcG9uZW50Lmh0bWwnLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgQ2hlY2tib3hDb21wb25lbnQgaW1wbGVtZW50cyBDb250cm9sVmFsdWVBY2Nlc3NvciB7XHJcbiAgICAvKiogQGRlc2NyaXB0aW9uIENvbnRyb2xhIG8gZXN0YWRvIGRlc2FiaWxpdGFkbyB2aWEgdHdvLXdheSBiaW5kaW5nLiBAZGVmYXVsdCBmYWxzZSAqL1xyXG4gICAgcHVibGljIGRpc2FibGVkID0gbW9kZWwoZmFsc2UpO1xyXG4gICAgLyoqIEBkZXNjcmlwdGlvbiBWYWxvciBtYXJjYWRvL2Rlc21hcmNhZG8gZG8gY2hlY2tib3ggdmlhIHR3by13YXkgYmluZGluZy4gQGRlZmF1bHQgZmFsc2UgKi9cclxuICAgIHB1YmxpYyBjaGVja2VkID0gbW9kZWwoZmFsc2UpO1xyXG4gICAgLyoqIEBkZXNjcmlwdGlvbiBRdWFuZG8gYHRydWVgLCBvIGNoZWNrYm94IGluaWNpYSBubyBlc3RhZG8gaW5kZXRlcm1pbmFkbyAodHJhw6dvKSBhdMOpIGEgcHJpbWVpcmEgaW50ZXJhw6fDo28gZG8gdXN1w6FyaW8uIEBkZWZhdWx0IGZhbHNlICovXHJcbiAgICBwdWJsaWMgaW5kZXRlcm1pbmF0ZSA9IGlucHV0KGZhbHNlKTtcclxuICAgIC8qKiBAZGVzY3JpcHRpb24gVGV4dG8gZG8gbGFiZWwgZXhpYmlkbyBhbyBsYWRvIGRvIGNoZWNrYm94LiBAZGVmYXVsdCAnJyAqL1xyXG4gICAgcHVibGljIGxhYmVsID0gaW5wdXQ8c3RyaW5nPignJyk7XHJcbiAgICAvKiogQGRlc2NyaXB0aW9uIFLDs3R1bG8gYWNlc3PDrXZlbCBwYXJhIGxlaXRvcmVzIGRlIHRlbGEuIE9wY2lvbmFsLCBwb3IgcGFkcsOjbyB1c2EgbyB2YWxvciBkZSBgbGFiZWxgLiAqL1xyXG4gICAgcHVibGljIGFyaWFMYWJlbCA9IGlucHV0PHN0cmluZyB8IHVuZGVmaW5lZD4odW5kZWZpbmVkKTtcclxuICAgIC8qKiBAZGVzY3JpcHRpb24gSUQgZG8gZWxlbWVudG8gcXVlIGRlc2NyZXZlIG8gY2hlY2tib3ggKHBhcmEgdXNhciBgPGxhYmVsIGZvcj1cIi4uLlwiPmApLiBPcGNpb25hbC4gKi9cclxuICAgIHB1YmxpYyBhcmlhTGFiZWxsZWRCeSA9IGlucHV0PHN0cmluZyB8IHVuZGVmaW5lZD4odW5kZWZpbmVkKTtcclxuXHJcbiAgICBwcml2YXRlIF9vbkNoYW5nZTogKHZhbHVlOiBib29sZWFuKSA9PiB2b2lkID0gKCkgPT4ge307XHJcbiAgICBwcml2YXRlIF9vblRvdWNoZWQ6ICgpID0+IHZvaWQgPSAoKSA9PiB7fTtcclxuICAgIHByaXZhdGUgX2hhc1VzZXJJbnRlcmFjdGVkID0gc2lnbmFsKGZhbHNlKTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvbiBDb21wdXRlZCBxdWUgaW5kaWNhIHNlIG8gZXN0YWRvIGluZGV0ZXJtaW5hZG8gZGV2ZSBzZXIgZXhpYmlkby5cclxuICAgICAqIFJldG9ybmEgYHRydWVgIGVucXVhbnRvIGBpbmRldGVybWluYXRlYCBmb3IgYHRydWVgIGUgbyB1c3XDoXJpbyBuw6NvIHRpdmVyIGludGVyYWdpZG8uXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyByZWFkb25seSBpc0luZGV0ZXJtaW5hdGUgPSBjb21wdXRlZCgoKSA9PiB0aGlzLmluZGV0ZXJtaW5hdGUoKSAmJiAhdGhpcy5faGFzVXNlckludGVyYWN0ZWQoKSk7XHJcblxyXG4gICAgcHVibGljIHRvZ2dsZSgpOiB2b2lkIHtcclxuICAgICAgICBpZiAodGhpcy5kaXNhYmxlZCgpKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmluZGV0ZXJtaW5hdGUoKSAmJiAhdGhpcy5faGFzVXNlckludGVyYWN0ZWQoKSkge1xyXG4gICAgICAgICAgICB0aGlzLl9oYXNVc2VySW50ZXJhY3RlZC5zZXQodHJ1ZSk7XHJcbiAgICAgICAgICAgIHRoaXMuY2hlY2tlZC5zZXQodHJ1ZSk7XHJcbiAgICAgICAgICAgIHRoaXMuZW1pdCh0cnVlKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBjb25zdCBuZXdWYWx1ZSA9ICF0aGlzLmNoZWNrZWQoKTtcclxuICAgICAgICAgICAgdGhpcy5jaGVja2VkLnNldChuZXdWYWx1ZSk7XHJcbiAgICAgICAgICAgIHRoaXMuZW1pdChuZXdWYWx1ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgZW1pdCh2YWx1ZTogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuX29uQ2hhbmdlKHZhbHVlKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgd3JpdGVWYWx1ZSh2YWx1ZTogYW55KTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5jaGVja2VkLnNldCghIXZhbHVlKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgcmVnaXN0ZXJPbkNoYW5nZShvbkNoYW5nZTogKHZhbHVlOiBib29sZWFuKSA9PiB2b2lkKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5fb25DaGFuZ2UgPSBvbkNoYW5nZTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgcmVnaXN0ZXJPblRvdWNoZWQob25Ub3VjaGVkOiAoKSA9PiB2b2lkKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5fb25Ub3VjaGVkID0gb25Ub3VjaGVkO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzZXREaXNhYmxlZFN0YXRlKGRpc2FibGVkOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5kaXNhYmxlZC5zZXQoZGlzYWJsZWQpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBvbkJsdXIoKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5fb25Ub3VjaGVkKCk7XHJcbiAgICB9XHJcbn1cclxuIiwiPGRpdlxuICAgIGNsYXNzPVwiZ3JvdXAgZmxleCBjdXJzb3ItcG9pbnRlciBzZWxlY3Qtbm9uZSBnYXAtMyBvdXRsaW5lLW5vbmVcIlxuICAgIFtjbGFzcy5jdXJzb3Itbm90LWFsbG93ZWRdPVwiZGlzYWJsZWQoKVwiXG4gICAgdGFiaW5kZXg9XCIwXCJcbiAgICByb2xlPVwiY2hlY2tib3hcIlxuICAgIFthdHRyLmFyaWEtY2hlY2tlZF09XCJpc0luZGV0ZXJtaW5hdGUoKSA/ICdtaXhlZCcgOiBjaGVja2VkKClcIlxuICAgIFthdHRyLmFyaWEtZGlzYWJsZWRdPVwiZGlzYWJsZWQoKVwiXG4gICAgW2F0dHIuYXJpYS1sYWJlbF09XCJhcmlhTGFiZWwoKSB8fCBsYWJlbCgpIHx8IG51bGxcIlxuICAgIFthdHRyLmFyaWEtbGFiZWxsZWRieV09XCJhcmlhTGFiZWxsZWRCeSgpIHx8IG51bGxcIlxuICAgIChjbGljayk9XCJ0b2dnbGUoKVwiXG4gICAgKGtleWRvd24uc3BhY2UpPVwidG9nZ2xlKCk7ICRldmVudC5wcmV2ZW50RGVmYXVsdCgpXCJcbiAgICAoYmx1cik9XCJvbkJsdXIoKVwiXG4+XG4gICAgPGRpdlxuICAgICAgICBjbGFzcz1cInJvdW5kZWQgZmxleCBoLTUgdy01IGZsZXgtc2hyaW5rLTAgaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIGJvcmRlciBib3JkZXItZ3JheXNjYWxlLTMwXG4gICAgICAgICAgICAgICB0cmFuc2l0aW9uLWFsbCBkdXJhdGlvbi0yMDAgaG92ZXI6Ym9yZGVyLWdyYXlzY2FsZS01MFxuICAgICAgICAgICAgICAgZ3JvdXAtZm9jdXMtdmlzaWJsZTpyaW5nLTIgZ3JvdXAtZm9jdXMtdmlzaWJsZTpyaW5nLXByaW1hcnkgZ3JvdXAtZm9jdXMtdmlzaWJsZTpyaW5nLW9mZnNldC0xXCJcbiAgICAgICAgW2NsYXNzLmJnLXByaW1hcnldPVwiY2hlY2tlZCgpIHx8IGlzSW5kZXRlcm1pbmF0ZSgpXCJcbiAgICAgICAgW2NsYXNzLmhvdmVyOmJnLXRhcmF3ZXJhLTUwMF09XCJjaGVja2VkKCkgfHwgaXNJbmRldGVybWluYXRlKClcIlxuICAgICAgICBbY2xhc3MuYmctZ3JheXNjYWxlLTBdPVwiIWNoZWNrZWQoKSAmJiAhaXNJbmRldGVybWluYXRlKClcIlxuICAgICAgICBbY2xhc3MuYm9yZGVyLXByaW1hcnldPVwiY2hlY2tlZCgpIHx8IGlzSW5kZXRlcm1pbmF0ZSgpXCJcbiAgICAgICAgW2NsYXNzLmhvdmVyOmJvcmRlci10YXJhd2VyYS01MDBdPVwiY2hlY2tlZCgpIHx8IGlzSW5kZXRlcm1pbmF0ZSgpXCJcbiAgICAgICAgW2NsYXNzLm9wYWNpdHktNTBdPVwiZGlzYWJsZWQoKVwiXG4gICAgPlxuICAgICAgICBAaWYgKGlzSW5kZXRlcm1pbmF0ZSgpKSB7XG4gICAgICAgICAgICA8c3ZnXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJoLTMgdy0zIHRleHQtZ3JheXNjYWxlLTBcIlxuICAgICAgICAgICAgICAgIGZpbGw9XCJub25lXCJcbiAgICAgICAgICAgICAgICBzdHJva2U9XCJ3aGl0ZVwiXG4gICAgICAgICAgICAgICAgc3Ryb2tlLXdpZHRoPVwiNFwiXG4gICAgICAgICAgICAgICAgdmlld0JveD1cIjAgMCAyNCAyNFwiXG4gICAgICAgICAgICAgICAgYXJpYS1oaWRkZW49XCJ0cnVlXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTYgMTJoMTJcIiAvPlxuICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAgQGlmIChjaGVja2VkKCkpIHtcbiAgICAgICAgICAgICAgICA8c3ZnXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwidGV4dC1ncmF5c2NhbGUtMCBoLTMgdy0zXCJcbiAgICAgICAgICAgICAgICAgICAgZmlsbD1cIm5vbmVcIlxuICAgICAgICAgICAgICAgICAgICBzdHJva2U9XCJ3aGl0ZVwiXG4gICAgICAgICAgICAgICAgICAgIHN0cm9rZS13aWR0aD1cIjRcIlxuICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcbiAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIlxuICAgICAgICAgICAgICAgICAgICB2aWV3Qm94PVwiMCAwIDI0IDI0XCJcbiAgICAgICAgICAgICAgICAgICAgYXJpYS1oaWRkZW49XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNNC41IDEyLjc1bDUuNSA1LjUgOS41LTkuNVwiIC8+XG4gICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICA8L2Rpdj5cblxuICAgIEBpZiAobGFiZWwoKSkge1xuICAgICAgICA8c3BhblxuICAgICAgICAgICAgW2NsYXNzLm9wYWNpdHktNTBdPVwiZGlzYWJsZWQoKVwiXG4gICAgICAgICAgICBjbGFzcz1cInRleHQtZ3JheXNjYWxlLTkwIG1sLTJcIlxuICAgICAgICAgICAgYXJpYS1oaWRkZW49XCJ0cnVlXCJcbiAgICAgICAgPlxuICAgICAgICAgICAge3sgbGFiZWwoKSB9fVxuICAgICAgICA8L3NwYW4+XG4gICAgfVxuPC9kaXY+XG4iXX0=