@seniorsistemas/angular-components 19.9.8 → 19.9.9

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 (166) hide show
  1. package/card/lib/card/card.component.d.ts +6 -2
  2. package/country-phone-picker/lib/country-phone-picker/country-phone-picker.component.d.ts +0 -1
  3. package/datepicker/README.md +6 -2
  4. package/datepicker/lib/datepicker/date-segment-input.d.ts +7 -1
  5. package/datepicker/lib/datepicker/datepicker.component.d.ts +137 -3
  6. package/dialog/lib/src/dialog/services/dialog.service.d.ts +2 -0
  7. package/esm2022/accordion/lib/accordion/components/accordion-panel/accordion-panel.component.mjs +3 -3
  8. package/esm2022/autocomplete/lib/autocomplete/autocomplete.component.mjs +8 -3
  9. package/esm2022/autocomplete/lib/autocomplete/components/autocomplete-chip/autocomplete-chip.component.mjs +4 -3
  10. package/esm2022/breadcrumb/lib/breadcrumb/breadcrumb.component.mjs +3 -3
  11. package/esm2022/breadcrumb/lib/dynamic-breadcrumb/dynamic-breadcrumb.component.mjs +4 -2
  12. package/esm2022/button/lib/button/button.component.mjs +3 -3
  13. package/esm2022/card/lib/card/card.component.mjs +13 -5
  14. package/esm2022/checkbox/lib/checkbox/checkbox.component.mjs +3 -3
  15. package/esm2022/checkbox-list/lib/checkbox-list/checkbox-list.component.mjs +3 -3
  16. package/esm2022/chips/lib/chips/chip-item/chip-item.component.mjs +3 -3
  17. package/esm2022/chips/lib/chips/chips/chips.component.mjs +3 -3
  18. package/esm2022/code-editor/lib/code-editor/infra/cores/codemirror-6/themes/sds-light/sds-light-style.mjs +3 -2
  19. package/esm2022/collapse-link/lib/collapse-link/collapse-link.component.mjs +3 -3
  20. package/esm2022/country-phone-picker/lib/country-phone-picker/country-phone-picker.component.mjs +14 -9
  21. package/esm2022/datepicker/lib/datepicker/date-segment-input.mjs +19 -2
  22. package/esm2022/datepicker/lib/datepicker/datepicker.component.mjs +405 -38
  23. package/esm2022/dialog/lib/src/dialog/dialog.component.mjs +3 -3
  24. package/esm2022/dialog/lib/src/dialog/services/dialog.service.mjs +13 -1
  25. package/esm2022/drawer/lib/drawer/drawer.component.mjs +3 -3
  26. package/esm2022/dynamic-form/dynamic-form/components/lookup/lookup.component.mjs +3 -3
  27. package/esm2022/dynamic-form/dynamic-form/form-field/fields/bignumber/bignumber-field.component.mjs +3 -3
  28. package/esm2022/dynamic-form/dynamic-form/form-field/fields/currency/currency-field.component.mjs +3 -3
  29. package/esm2022/dynamic-form/dynamic-form/form-field/fields/number/number-field.component.mjs +3 -3
  30. package/esm2022/dynamic-form/dynamic-form/form-field/fields/password/password-field.component.mjs +3 -3
  31. package/esm2022/dynamic-form/dynamic-form/form-field/fields/text/text-field.component.mjs +3 -3
  32. package/esm2022/editor/lib/editor/editor.component.mjs +3 -3
  33. package/esm2022/editor/lib/editor/toolbar-button/editor-toolbar-button.component.mjs +3 -3
  34. package/esm2022/fieldset/lib/fieldset/fieldset.component.mjs +3 -3
  35. package/esm2022/file-picker/lib/file-picker/file-picker.component.mjs +3 -3
  36. package/esm2022/gantt/lib/gantt/components/gantt/bar.mjs +2 -1
  37. package/esm2022/gantt/lib/gantt/gantt.component.mjs +3 -3
  38. package/esm2022/global-search/lib/global-search/global-search.component.mjs +16 -25
  39. package/esm2022/grid-menu/lib/grid-menu/components/grid-menu-item/grid-menu-item.component.mjs +3 -3
  40. package/esm2022/input-text/lib/input-text/input-text.directive.mjs +3 -3
  41. package/esm2022/lib/locale/fallback.mjs +40 -13
  42. package/esm2022/navigation-button/lib/navigation-button/navigation-button.component.mjs +3 -3
  43. package/esm2022/object-card/lib/object-card/object-card.component.mjs +3 -3
  44. package/esm2022/paginator/lib/paginator/paginator.component.mjs +3 -3
  45. package/esm2022/pin-code-field/lib/pin-code-field/pin-code-field.component.mjs +3 -3
  46. package/esm2022/radio-button/lib/radio-button/radio-button.component.mjs +4 -10
  47. package/esm2022/rating-scale/lib/rating-scale/rating-scale.component.mjs +3 -3
  48. package/esm2022/select/lib/select/select.component.mjs +3 -3
  49. package/esm2022/select-button/lib/select-button/components/select-button-item/select-button-item.component.mjs +3 -3
  50. package/esm2022/shared/lib/accessibility/datepicker-no-period-tab.directive.mjs +6 -6
  51. package/esm2022/side-sheet/lib/side-sheet/side-sheet.component.mjs +3 -3
  52. package/esm2022/slider/lib/slider/slider.component.mjs +67 -65
  53. package/esm2022/slider/lib/slider/slider.module.mjs +2 -2
  54. package/esm2022/split-button/lib/split-button/split-button.component.mjs +3 -3
  55. package/esm2022/star-rating/star-rating/star-rating.component.mjs +3 -3
  56. package/esm2022/stepper/lib/stepper/stepper.component.mjs +3 -3
  57. package/esm2022/switch/lib/switch/switch.component.mjs +5 -19
  58. package/esm2022/tabs/lib/tabs/tabs.component.mjs +3 -3
  59. package/esm2022/text-area/lib/text-area/text-area.component.mjs +3 -3
  60. package/esm2022/thumbnail/lib/thumbnail/thumbnail.component.mjs +10 -3
  61. package/esm2022/thumbnails/lib/thumbnails/components/thumbnail-item/thumbnail-item.component.mjs +3 -3
  62. package/esm2022/tiered-menu/lib/tiered-menu/components/tiered-menu-item/tiered-menu-item.component.mjs +3 -3
  63. package/esm2022/tiered-menu/lib/tiered-menu/services/tiered-menu.global.service.mjs +4 -3
  64. package/esm2022/tile/lib/tile/tile.component.mjs +3 -3
  65. package/esm2022/tree/lib/tree/components/tree-node-item/tree-node-item.component.mjs +20 -3
  66. package/esm2022/workspace-switch/lib/workspace-switch/workspace-switch.component.mjs +3 -3
  67. package/fesm2022/seniorsistemas-angular-components-accordion.mjs +2 -2
  68. package/fesm2022/seniorsistemas-angular-components-accordion.mjs.map +1 -1
  69. package/fesm2022/seniorsistemas-angular-components-autocomplete.mjs +10 -5
  70. package/fesm2022/seniorsistemas-angular-components-autocomplete.mjs.map +1 -1
  71. package/fesm2022/seniorsistemas-angular-components-breadcrumb.mjs +5 -3
  72. package/fesm2022/seniorsistemas-angular-components-breadcrumb.mjs.map +1 -1
  73. package/fesm2022/seniorsistemas-angular-components-button.mjs +2 -2
  74. package/fesm2022/seniorsistemas-angular-components-button.mjs.map +1 -1
  75. package/fesm2022/seniorsistemas-angular-components-card.mjs +12 -4
  76. package/fesm2022/seniorsistemas-angular-components-card.mjs.map +1 -1
  77. package/fesm2022/seniorsistemas-angular-components-checkbox-list.mjs +2 -2
  78. package/fesm2022/seniorsistemas-angular-components-checkbox-list.mjs.map +1 -1
  79. package/fesm2022/seniorsistemas-angular-components-checkbox.mjs +2 -2
  80. package/fesm2022/seniorsistemas-angular-components-checkbox.mjs.map +1 -1
  81. package/fesm2022/seniorsistemas-angular-components-chips.mjs +4 -4
  82. package/fesm2022/seniorsistemas-angular-components-chips.mjs.map +1 -1
  83. package/fesm2022/seniorsistemas-angular-components-code-editor.mjs +2 -1
  84. package/fesm2022/seniorsistemas-angular-components-code-editor.mjs.map +1 -1
  85. package/fesm2022/seniorsistemas-angular-components-collapse-link.mjs +2 -2
  86. package/fesm2022/seniorsistemas-angular-components-collapse-link.mjs.map +1 -1
  87. package/fesm2022/seniorsistemas-angular-components-country-phone-picker.mjs +13 -8
  88. package/fesm2022/seniorsistemas-angular-components-country-phone-picker.mjs.map +1 -1
  89. package/fesm2022/seniorsistemas-angular-components-datepicker.mjs +422 -38
  90. package/fesm2022/seniorsistemas-angular-components-datepicker.mjs.map +1 -1
  91. package/fesm2022/seniorsistemas-angular-components-dialog.mjs +14 -2
  92. package/fesm2022/seniorsistemas-angular-components-dialog.mjs.map +1 -1
  93. package/fesm2022/seniorsistemas-angular-components-drawer.mjs +2 -2
  94. package/fesm2022/seniorsistemas-angular-components-drawer.mjs.map +1 -1
  95. package/fesm2022/seniorsistemas-angular-components-dynamic-form.mjs +12 -12
  96. package/fesm2022/seniorsistemas-angular-components-dynamic-form.mjs.map +1 -1
  97. package/fesm2022/seniorsistemas-angular-components-editor.mjs +4 -4
  98. package/fesm2022/seniorsistemas-angular-components-editor.mjs.map +1 -1
  99. package/fesm2022/seniorsistemas-angular-components-fieldset.mjs +2 -2
  100. package/fesm2022/seniorsistemas-angular-components-fieldset.mjs.map +1 -1
  101. package/fesm2022/seniorsistemas-angular-components-file-picker.mjs +2 -2
  102. package/fesm2022/seniorsistemas-angular-components-file-picker.mjs.map +1 -1
  103. package/fesm2022/seniorsistemas-angular-components-gantt.mjs +3 -2
  104. package/fesm2022/seniorsistemas-angular-components-gantt.mjs.map +1 -1
  105. package/fesm2022/seniorsistemas-angular-components-global-search.mjs +14 -23
  106. package/fesm2022/seniorsistemas-angular-components-global-search.mjs.map +1 -1
  107. package/fesm2022/seniorsistemas-angular-components-grid-menu.mjs +2 -2
  108. package/fesm2022/seniorsistemas-angular-components-grid-menu.mjs.map +1 -1
  109. package/fesm2022/seniorsistemas-angular-components-input-text.mjs +2 -2
  110. package/fesm2022/seniorsistemas-angular-components-input-text.mjs.map +1 -1
  111. package/fesm2022/seniorsistemas-angular-components-navigation-button.mjs +2 -2
  112. package/fesm2022/seniorsistemas-angular-components-navigation-button.mjs.map +1 -1
  113. package/fesm2022/seniorsistemas-angular-components-object-card.mjs +2 -2
  114. package/fesm2022/seniorsistemas-angular-components-object-card.mjs.map +1 -1
  115. package/fesm2022/seniorsistemas-angular-components-paginator.mjs +2 -2
  116. package/fesm2022/seniorsistemas-angular-components-paginator.mjs.map +1 -1
  117. package/fesm2022/seniorsistemas-angular-components-pin-code-field.mjs +2 -2
  118. package/fesm2022/seniorsistemas-angular-components-pin-code-field.mjs.map +1 -1
  119. package/fesm2022/seniorsistemas-angular-components-radio-button.mjs +3 -9
  120. package/fesm2022/seniorsistemas-angular-components-radio-button.mjs.map +1 -1
  121. package/fesm2022/seniorsistemas-angular-components-rating-scale.mjs +2 -2
  122. package/fesm2022/seniorsistemas-angular-components-rating-scale.mjs.map +1 -1
  123. package/fesm2022/seniorsistemas-angular-components-select-button.mjs +2 -2
  124. package/fesm2022/seniorsistemas-angular-components-select-button.mjs.map +1 -1
  125. package/fesm2022/seniorsistemas-angular-components-select.mjs +2 -2
  126. package/fesm2022/seniorsistemas-angular-components-select.mjs.map +1 -1
  127. package/fesm2022/seniorsistemas-angular-components-shared.mjs +5 -5
  128. package/fesm2022/seniorsistemas-angular-components-shared.mjs.map +1 -1
  129. package/fesm2022/seniorsistemas-angular-components-side-sheet.mjs +2 -2
  130. package/fesm2022/seniorsistemas-angular-components-side-sheet.mjs.map +1 -1
  131. package/fesm2022/seniorsistemas-angular-components-slider.mjs +67 -65
  132. package/fesm2022/seniorsistemas-angular-components-slider.mjs.map +1 -1
  133. package/fesm2022/seniorsistemas-angular-components-split-button.mjs +2 -2
  134. package/fesm2022/seniorsistemas-angular-components-split-button.mjs.map +1 -1
  135. package/fesm2022/seniorsistemas-angular-components-star-rating.mjs +2 -2
  136. package/fesm2022/seniorsistemas-angular-components-star-rating.mjs.map +1 -1
  137. package/fesm2022/seniorsistemas-angular-components-stepper.mjs +2 -2
  138. package/fesm2022/seniorsistemas-angular-components-stepper.mjs.map +1 -1
  139. package/fesm2022/seniorsistemas-angular-components-switch.mjs +4 -18
  140. package/fesm2022/seniorsistemas-angular-components-switch.mjs.map +1 -1
  141. package/fesm2022/seniorsistemas-angular-components-tabs.mjs +2 -2
  142. package/fesm2022/seniorsistemas-angular-components-tabs.mjs.map +1 -1
  143. package/fesm2022/seniorsistemas-angular-components-text-area.mjs +2 -2
  144. package/fesm2022/seniorsistemas-angular-components-text-area.mjs.map +1 -1
  145. package/fesm2022/seniorsistemas-angular-components-thumbnail.mjs +9 -2
  146. package/fesm2022/seniorsistemas-angular-components-thumbnail.mjs.map +1 -1
  147. package/fesm2022/seniorsistemas-angular-components-thumbnails.mjs +2 -2
  148. package/fesm2022/seniorsistemas-angular-components-thumbnails.mjs.map +1 -1
  149. package/fesm2022/seniorsistemas-angular-components-tiered-menu.mjs +5 -4
  150. package/fesm2022/seniorsistemas-angular-components-tiered-menu.mjs.map +1 -1
  151. package/fesm2022/seniorsistemas-angular-components-tile.mjs +2 -2
  152. package/fesm2022/seniorsistemas-angular-components-tile.mjs.map +1 -1
  153. package/fesm2022/seniorsistemas-angular-components-tree.mjs +20 -3
  154. package/fesm2022/seniorsistemas-angular-components-tree.mjs.map +1 -1
  155. package/fesm2022/seniorsistemas-angular-components-workspace-switch.mjs +2 -2
  156. package/fesm2022/seniorsistemas-angular-components-workspace-switch.mjs.map +1 -1
  157. package/fesm2022/seniorsistemas-angular-components.mjs +39 -12
  158. package/fesm2022/seniorsistemas-angular-components.mjs.map +1 -1
  159. package/global-search/lib/global-search/global-search.component.d.ts +7 -3
  160. package/package.json +1 -1
  161. package/radio-button/lib/radio-button/radio-button.component.d.ts +0 -1
  162. package/slider/lib/slider/slider.component.d.ts +25 -7
  163. package/styles.css +5 -0
  164. package/switch/lib/switch/switch.component.d.ts +0 -2
  165. package/thumbnail/lib/thumbnail/thumbnail.component.d.ts +1 -0
  166. package/tree/lib/tree/components/tree-node-item/tree-node-item.component.d.ts +4 -0
@@ -1,4 +1,4 @@
1
- import { AfterContentInit, QueryList, TemplateRef } from '@angular/core';
1
+ import { AfterContentInit, EventEmitter, QueryList, TemplateRef } from '@angular/core';
2
2
  import { TemplateDirective } from '@seniorsistemas/angular-components/template';
3
3
  import * as i0 from "@angular/core";
4
4
  /**
@@ -19,6 +19,10 @@ export declare class CardComponent implements AfterContentInit {
19
19
  bannerImage?: string;
20
20
  /** @description Faz o card ocupar 100% da largura disponível. @default false */
21
21
  fullWidth: boolean;
22
+ /** @description Torna o card interativo, habilitando foco por teclado e clique no elemento raiz. @default false */
23
+ clickable: boolean;
24
+ /** @description Emitido quando o usuário clica ou pressiona Enter/Espaço no card (requer `clickable = true`). */
25
+ clicked: EventEmitter<MouseEvent>;
22
26
  /** @description Título exibido no cabeçalho do card. @default '' */
23
27
  title: string;
24
28
  /** @description Subtítulo exibido abaixo do título. @default '' */
@@ -40,5 +44,5 @@ export declare class CardComponent implements AfterContentInit {
40
44
  private _setTemplates;
41
45
  private _setShowBanner;
42
46
  static ɵfac: i0.ɵɵFactoryDeclaration<CardComponent, never>;
43
- static ɵcmp: i0.ɵɵComponentDeclaration<CardComponent, "s-card", never, { "bannerImage": { "alias": "bannerImage"; "required": false; }; "fullWidth": { "alias": "fullWidth"; "required": false; }; "title": { "alias": "title"; "required": false; }; "subtitle": { "alias": "subtitle"; "required": false; }; "icon": { "alias": "icon"; "required": false; }; }, {}, ["templates"], ["*"], true, never>;
47
+ static ɵcmp: i0.ɵɵComponentDeclaration<CardComponent, "s-card", never, { "bannerImage": { "alias": "bannerImage"; "required": false; }; "fullWidth": { "alias": "fullWidth"; "required": false; }; "clickable": { "alias": "clickable"; "required": false; }; "title": { "alias": "title"; "required": false; }; "subtitle": { "alias": "subtitle"; "required": false; }; "icon": { "alias": "icon"; "required": false; }; }, { "clicked": "clicked"; }, ["templates"], ["*"], true, never>;
44
48
  }
@@ -52,7 +52,6 @@ export declare class CountryPhonePickerComponent implements OnInit, ControlValue
52
52
  focusLost: EventEmitter<PhoneSelectionData | null>;
53
53
  phoneInput: ElementRef | null;
54
54
  private readonly filterInput;
55
- isFocused: boolean;
56
55
  disabled: boolean;
57
56
  mask: string | null;
58
57
  selectedItem: CountryPhoneData | null;
@@ -208,12 +208,16 @@ Em dispositivos touch (`(pointer: coarse)`), o campo cai automaticamente para o
208
208
 
209
209
  - O trigger usa `role="combobox"` com `aria-haspopup="grid"`, `aria-expanded` e `aria-controls` apontando para o painel
210
210
  - O painel usa `role="dialog"` com `aria-label` traduzido e `cdkTrapFocus` para prender o foco dentro do popup
211
- - Ao abrir o painel, o foco é movido automaticamente para o primeiro botão do calendário ou para o botão de incremento de horas no modo `time`
212
- - Ao fechar o painel, o foco retorna ao botão de ícone do input trigger
211
+ - Ao abrir o painel, o foco é movido automaticamente: no modo `time`, para o botão de incremento de horas; nos modos `month`/`year`, para o botão de navegação (ano/década anterior) do cabeçalho, em vez do mês/ano já selecionado na grade, permitindo trocar o ano/década antes de escolher a célula; nos demais modos, para o dia selecionado (ou hoje) na grade do calendário
212
+ - Ao fechar o painel, o foco só é movido se estiver dentro do painel (prestes a sumir do DOM) — nesse caso, volta pro elemento que tinha foco quando o painel abriu (o input segmentado, se abriu por foco/clique nele; o botão de ícone, se abriu por clique nele), em vez de sempre forçar pro botão de ícone
213
213
  - Tecla `Escape` fecha o painel e devolve o foco ao trigger
214
214
  - Dias do calendário usam `role="gridcell"` com `aria-label` contendo a data por extenso, `aria-selected` e `aria-disabled`
215
215
  - Cabeçalhos dos dias da semana usam `role="columnheader"` com `aria-label`
216
216
  - Setas do time picker têm `aria-label` descritivos; as horas/minutos têm `aria-live="polite"`
217
+ - No input segmentado (dia/mês/ano/hora/minuto/segundo), o `LiveAnnouncer` do `@angular/cdk/a11y` anuncia "{rótulo do segmento}, {valor}" (ex.: "Dia, 03") a cada troca de segmento ou de valor, já que a seleção do segmento é feita por `setSelectionRange` num único `<input>` e leitores de tela não anunciam qual campo está selecionado sem esse reforço
218
+ - No primeiro foco genuíno do input segmentado, o `LiveAnnouncer` também anuncia um resumo humanizado do valor inteiro (ex.: "10 de outubro de 2020" ou "Nenhum valor selecionado"), já que o `<input>` só expõe ao leitor de tela o valor bruto (esqueleto de sublinhados quando vazio, dígitos separados por barra quando completo)
219
+ - Ao cruzar uma fronteira de mês na grade do calendário (seta ou botões `<`/`>`), o `LiveAnnouncer` anuncia distintamente o novo mês/ano, já que essa informação fica "enterrada" no meio do `aria-label` longo de cada dia
220
+ - Os botões de navegação de ano (`mode="month"`) e de década (`mode="year"`) incluem o ano/intervalo de destino no próprio `aria-label` (ex.: "Ano anterior, 2025", "Década anterior, 2010 a 2021"), em vez de só "Ano anterior"/"Década anterior" sem indicar pra onde o botão leva
217
221
  - Todos os ícones decorativos têm `aria-hidden="true"`
218
222
 
219
223
  ## Componentes relacionados
@@ -41,6 +41,8 @@ export declare class DateSegmentEngine {
41
41
  getLastEditableIndex(): number;
42
42
  getActiveIndex(): number | null;
43
43
  activeKind(): SegmentKind | null;
44
+ /** Texto bruto (sem padding de sublinhado) do segmento ativo — usado pelo anúncio de acessibilidade. */
45
+ getActiveSegmentText(): string | null;
44
46
  selectSegmentAt(charIndex: number): number;
45
47
  private nearestEditableFrom;
46
48
  selectSegment(index: number): void;
@@ -53,7 +55,11 @@ export declare class DateSegmentEngine {
53
55
  clearActiveSegment(kind: 'backspace' | 'delete'): void;
54
56
  /** Limpa todos os segmentos editáveis (usado quando o campo inteiro está selecionado, ex.: Ctrl+A). */
55
57
  clearAll(): void;
56
- /** Incrementa/decrementa o segmento ativo, dando a volta (wrap) dentro do range válido. */
58
+ /**
59
+ * Incrementa/decrementa o segmento ativo, dando a volta (wrap) dentro do range válido.
60
+ * Exceção: ano vazio sempre pousa no ano atual do sistema na primeira seta (up ou down),
61
+ * em vez de 0000/9999 — só passa a incrementar/decrementar a partir da segunda seta.
62
+ */
57
63
  incrementActiveSegment(delta: 1 | -1): void;
58
64
  /** Pad/clamp do segmento ativo (ex.: "2" -> "02", "45" no dia -> clamp para daysInMonth). */
59
65
  commitActiveSegment(): void;
@@ -155,10 +155,18 @@ export declare class DatepickerComponent implements ControlValueAccessor, Valida
155
155
  private readonly hostElement;
156
156
  private readonly translateService;
157
157
  private readonly destroyRef;
158
+ private readonly liveAnnouncer;
158
159
  private readonly currentLang;
159
160
  /** Reflete `(pointer: coarse)` — dispositivos touch preferem o popup do calendário ao teclado. */
160
161
  protected readonly isTouchDevice: import("@angular/core").WritableSignal<boolean>;
161
162
  private readonly segmentEngine;
163
+ /** Elemento que tinha foco antes do painel abrir — ver `captureFocusOrigin`/`closePanel`. */
164
+ private elementToRestoreFocusTo;
165
+ /** `true` só durante o `.focus()` programático de restauração em `closePanel()` — evita que
166
+ * `handleInputFocus` interprete esse foco como um foco genuíno do usuário e reabra o painel
167
+ * na hora via `showOnFocus` (ex.: selecionar uma data devolve o foco pro input, que senão
168
+ * reabriria o painel imediatamente depois de fechá-lo). */
169
+ private isRestoringFocusOnClose;
162
170
  private lastSegmentConfig;
163
171
  private measureCanvas?;
164
172
  /** Incrementado a cada mutação do usuário — invalida callbacks de clique/foco adiados que ficaram obsoletos. */
@@ -171,6 +179,7 @@ export declare class DatepickerComponent implements ControlValueAccessor, Valida
171
179
  protected readonly resolvedDateFormat: import("@angular/core").Signal<string>;
172
180
  /** `hourFormat` explícito ou resolvido a partir do locale ativo (fallback `'24'`). */
173
181
  protected readonly resolvedHourFormat: import("@angular/core").Signal<"12" | "24">;
182
+ private static readonly SEGMENT_LABEL_KEYS;
174
183
  /** Modos cujo formato de exibição é resolvido pela engine de segmentos (independente de touch/readonly). */
175
184
  protected readonly isSegmentModeCandidate: import("@angular/core").Signal<boolean>;
176
185
  /** Interatividade de digitação por segmento — desligada em touch ou quando `readonlyInput` é usado. */
@@ -181,17 +190,61 @@ export declare class DatepickerComponent implements ControlValueAccessor, Valida
181
190
  protected readonly displayHours: import("@angular/core").Signal<number>;
182
191
  /** Meridiano atual derivado da hora interna (0–23). */
183
192
  protected readonly amPm: import("@angular/core").Signal<"PM" | "AM">;
193
+ private displayHourFor;
194
+ private meridiemFor;
195
+ /** Texto (com AM/PM quando aplicável) da hora de destino do botão "aumentar"/"diminuir hora"
196
+ * — mesma motivação de `prevMonthTarget`/`nextMonthTarget`/`prevYearTarget`/`nextYearTarget`:
197
+ * sem isso, o botão só diz "aumentar hora", sem dizer qual hora vai resultar. */
198
+ private formatHourTarget;
199
+ protected readonly prevHourTarget: import("@angular/core").Signal<string>;
200
+ protected readonly nextHourTarget: import("@angular/core").Signal<string>;
201
+ /** Mesma motivação, para os botões de minuto/segundo/AM-PM. */
202
+ protected readonly prevMinuteTarget: import("@angular/core").Signal<string>;
203
+ protected readonly nextMinuteTarget: import("@angular/core").Signal<string>;
204
+ protected readonly prevSecondTarget: import("@angular/core").Signal<string>;
205
+ protected readonly nextSecondTarget: import("@angular/core").Signal<string>;
206
+ protected readonly nextMeridiemTarget: import("@angular/core").Signal<"PM" | "AM">;
184
207
  protected readonly positions: ConnectedPosition[];
185
208
  protected readonly popupId: import("@angular/core").Signal<string>;
186
209
  protected readonly currentMonthIndex: import("@angular/core").Signal<number>;
187
210
  protected readonly currentYear: import("@angular/core").Signal<number>;
188
211
  protected readonly currentMonthKey: import("@angular/core").Signal<string>;
212
+ /** Ano de destino do botão "ano anterior"/"próximo ano" (view de meses) — pro aria-label
213
+ * anunciar pra onde o botão vai, já que "Ano anterior" sozinho não diz qual ano é esse. */
214
+ protected readonly prevYearTarget: import("@angular/core").Signal<number>;
215
+ protected readonly nextYearTarget: import("@angular/core").Signal<number>;
216
+ /** Mês/ano de destino do botão "mês anterior"/"próximo mês" (view de calendário) — mesma
217
+ * motivação de `prevYearTarget`/`nextYearTarget`: "Mês anterior" sozinho não diz qual mês é
218
+ * esse, e cruzar a fronteira do ano (ex.: janeiro → dezembro do ano anterior) tornaria essa
219
+ * falta de contexto ainda mais confusa sem o ano junto. */
220
+ protected readonly prevMonthTarget: import("@angular/core").Signal<string>;
221
+ protected readonly nextMonthTarget: import("@angular/core").Signal<string>;
189
222
  protected readonly showCalendar: import("@angular/core").Signal<boolean>;
190
223
  protected readonly showTimePicker: import("@angular/core").Signal<boolean>;
191
224
  /** Seleção múltipla ativa: apenas no modo `date` com `selectionMode = 'multiple'`. */
192
225
  protected readonly isMultipleMode: import("@angular/core").Signal<boolean>;
226
+ /** Instrução lida junto do rótulo da grade de dias — cada modo com semântica de seleção não
227
+ * óbvia (múltipla, intervalo) ganha uma frase própria; `range` ainda se divide em duas fases
228
+ * (escolhendo início vs. já com `pendingRangeStart`, escolhendo fim). */
229
+ protected readonly calendarGridAriaLabelKey: import("@angular/core").Signal<"platform.angular_components.datepicker_calendar_label_multiple" | "platform.angular_components.datepicker_calendar_label_range_pending" | "platform.angular_components.datepicker_calendar_label_range" | "platform.angular_components.datepicker_calendar_label">;
193
230
  protected readonly orderedWeekDayKeys: import("@angular/core").Signal<string[]>;
194
- protected readonly dialogAriaLabelKey: import("@angular/core").Signal<"platform.angular_components.datepicker_select_range" | "platform.angular_components.datepicker_select_date">;
231
+ /** Ciente da fase de seleção em `range`: enquanto não há `pendingRangeStart`, é a mesma chave
232
+ * de sempre ("selecionar intervalo"); depois do primeiro clique, muda pra uma chave que cita
233
+ * a data inicial já escolhida, já que reabrir/reentrar no diálogo nesse meio-tempo não dava
234
+ * nenhuma pista de que a segunda metade do fluxo era a que faltava. */
235
+ protected readonly dialogAriaLabelKey: import("@angular/core").Signal<"platform.angular_components.datepicker_select_date" | "platform.angular_components.datepicker_select_range_end" | "platform.angular_components.datepicker_select_range">;
236
+ protected readonly dialogAriaLabelParams: import("@angular/core").Signal<{
237
+ date?: string;
238
+ }>;
239
+ protected readonly rangeStatusElementId: import("@angular/core").Signal<string>;
240
+ /** Texto do `<span>` `sr-only` referenciado por `aria-describedby` no `<input>` — dá ao campo
241
+ * um conteúdo persistente e acessível enquanto só a data inicial do intervalo foi escolhida,
242
+ * já que `inputDate` só reflete o valor completo depois da segunda escolha (a atualização
243
+ * parcial em `selectDate()` cobre o texto visível; isto cobre o que um leitor de tela lê ao
244
+ * focar/reler o campo). Usa `aria-describedby`, não `aria-label`, pra só ACRESCENTAR
245
+ * informação sem sobrescrever o nome acessível que integrações (dynamic-form, showcase)
246
+ * já controlam por fora do componente. */
247
+ protected readonly rangePendingStatusText: import("@angular/core").Signal<string>;
195
248
  protected readonly placeholderKey: import("@angular/core").Signal<string>;
196
249
  protected readonly effectiveRange: import("@angular/core").Signal<{
197
250
  start: Date | null;
@@ -203,6 +256,19 @@ export declare class DatepickerComponent implements ControlValueAccessor, Valida
203
256
  index: number;
204
257
  }[][]>;
205
258
  protected readonly currentDecadeStart: import("@angular/core").Signal<number>;
259
+ /** Intervalo de destino do botão "década anterior"/"próxima década" (view de anos) — mesma
260
+ * motivação de `prevYearTarget`/`nextYearTarget`. `navigatePrev`/`navigateNext` deslocam
261
+ * `viewDate` em ±10 anos (não ±12) nessa view; o grid exibido é que mostra 12 anos por
262
+ * página (ver `yearsGrid`) — daí o intervalo ir de `currentDecadeStart() ± 10` até
263
+ * `+ 11` pra bater exatamente com a página que o clique realmente abre. */
264
+ protected readonly prevDecadeRange: import("@angular/core").Signal<{
265
+ startYear: number;
266
+ endYear: number;
267
+ }>;
268
+ protected readonly nextDecadeRange: import("@angular/core").Signal<{
269
+ startYear: number;
270
+ endYear: number;
271
+ }>;
206
272
  protected readonly yearsGrid: import("@angular/core").Signal<number[][]>;
207
273
  protected readonly prevDisabled: import("@angular/core").Signal<boolean>;
208
274
  protected readonly nextDisabled: import("@angular/core").Signal<boolean>;
@@ -216,14 +282,29 @@ export declare class DatepickerComponent implements ControlValueAccessor, Valida
216
282
  validate(control: AbstractControl): ValidationErrors | null;
217
283
  registerOnValidatorChange(fn: () => void): void;
218
284
  protected open(): void;
219
- /** Abre o painel sem transferir o foco para o dropdown (usado pelo showOnFocus). */
285
+ /** Abre o painel sem transferir o foco por padrão (usado pelo showOnFocus). Em modos sem
286
+ * digitação por segmento (multiple/range/year/touch) o foco segue pro calendário igual em
287
+ * open(); em modo segmentado o foco permanece no input pra continuar digitando. */
220
288
  private openOnFocus;
289
+ private focusPanelAfterOpen;
290
+ /** Guarda o elemento focado no momento em que o painel abre, pra devolver o foco pra lá ao
291
+ * fechar em vez de sempre forçar pro botão do ícone — ver `closePanel()`. */
292
+ private captureFocusOrigin;
221
293
  /**
222
294
  * Define a view inicial do painel e posiciona o calendário no `defaultDate`
223
295
  * quando nenhum valor está selecionado.
224
296
  */
225
297
  private prepareOpenView;
226
298
  private focusBestCalendarTarget;
299
+ /** Zera o estado de intervalo em andamento — usado tanto pelo fechamento total do painel
300
+ * (`closePanel`, onde não faz sentido anunciar nada porque o diálogo inteiro está sumindo)
301
+ * quanto pelo cancelamento leve via Escape dentro da grade (`cancelPendingRangeStart`), que
302
+ * mantém o painel aberto e por isso anuncia a mudança separadamente. */
303
+ private resetPendingRangeSelection;
304
+ /** Cancelamento leve de uma seleção de intervalo em andamento (ver `handleCalendarGridKeydown`,
305
+ * tecla Escape) — ao contrário de `closePanel`, o painel continua aberto, então aqui faz
306
+ * sentido anunciar a mudança de estado. */
307
+ private cancelPendingRangeStart;
227
308
  protected closePanel(): void;
228
309
  /**
229
310
  * O backdrop do CDK Overlay cobre a tela inteira, incluindo o próprio trigger — clicar no
@@ -283,10 +364,38 @@ export declare class DatepickerComponent implements ControlValueAccessor, Valida
283
364
  /** Sincroniza o DOM com o estado atual da engine (valor + seleção do segmento ativo) após uma mutação. */
284
365
  private syncSegmentedInput;
285
366
  private selectActiveSegmentRange;
367
+ /** "{rótulo do segmento}, {valor}" (ex.: "Dia, 03") — texto do anúncio de nível de segmento. */
368
+ private buildSegmentAnnouncementText;
369
+ /** Anuncia via LiveAnnouncer o segmento ativo — chamado em todo ponto que muda o segmento ativo/seu
370
+ * valor DEPOIS do primeiro foco genuíno (que já recebe esse mesmo texto embutido em `announceGenuineFocus`). */
371
+ private announceActiveSegment;
372
+ /** Resumo humanizado do valor inteiro (ex.: "10 de outubro de 2020", ou a frase genérica de campo
373
+ * vazio) — complementa o `<input>` segmentado, que o leitor de tela lê de forma literal/pouco
374
+ * natural (esqueleto de sublinhados quando vazio, dígitos separados por barra quando completo).
375
+ * Formatação pura via `Intl`, sem chaves de tradução novas (exceto a frase de campo vazio).
376
+ * Espelha `formatDayAriaLabel` pro modo `date`. */
377
+ private describeWholeValue;
378
+ /** Anúncio combinado no primeiro foco genuíno do campo: resumo do valor inteiro + segmento ativo,
379
+ * numa ÚNICA chamada a `announce` (evita duas regiões concorrentes/uma cortando a outra). */
380
+ private announceGenuineFocus;
286
381
  /** Propaga o valor da engine para o modelo (CVA) assim que todos os segmentos estiverem completos. */
287
382
  private commitSegmentedValueIfComplete;
288
383
  protected navigatePrev(): void;
289
384
  protected navigateNext(): void;
385
+ /** Anuncia só "{mês} de {ano}" (ex.: "outubro de 2026") ao cruzar fronteira de mês na grade de dias.
386
+ * O novo foco (button[role="gridcell"]) já carrega essa info dentro do aria-label longo de
387
+ * `formatDayAriaLabel`, mas o nome do mês fica "enterrado" no meio da frase e passa despercebido
388
+ * (confirmado com teste manual via Orca). Sem prefixo tipo "agora exibindo", mesma convenção
389
+ * adotada por outros calendários acessíveis (ex.: react-aria). */
390
+ private announceMonthChange;
391
+ /** Anuncia o ano atualmente exibido ao paginar a view 'months' (ex.: "2025"). O `<span>` central
392
+ * que mostra esse ano no cabeçalho não é focável, e o aria-label dos botões de navegação só
393
+ * fala o ano de DESTINO ("Ano anterior, 2025") — sem isso, o leitor de tela nunca confirma o
394
+ * ano que passou a estar em exibição, só os alvos "anterior"/"próximo". */
395
+ private announceYearChange;
396
+ /** Mesma motivação de `announceYearChange`, para a view 'years' (paginação de década) — anuncia
397
+ * o intervalo atualmente exibido (ex.: "2020 – 2031"), espelhando o texto do `<span>` central. */
398
+ private announceDecadeChange;
290
399
  protected handleCalendarGridKeydown(event: KeyboardEvent): void;
291
400
  private static findEnabled;
292
401
  protected switchToMonths(): void;
@@ -294,6 +403,24 @@ export declare class DatepickerComponent implements ControlValueAccessor, Valida
294
403
  protected selectDate(day: CalendarDay): void;
295
404
  /** Adiciona/remove uma data da seleção múltipla. O painel permanece aberto. */
296
405
  private toggleMultipleDate;
406
+ /** Anuncia via LiveAnnouncer a data completa (dia da semana, dia, mês, ano) e se ela acabou
407
+ * de ser selecionada ou desmarcada — pro usuário de leitor de tela saber exatamente o que
408
+ * mudou antes de seguir escolhendo a próxima data. */
409
+ private announceMultipleDateToggle;
410
+ /** Texto compartilhado entre o anúncio transitório de início de intervalo escolhido
411
+ * (`announceRangeStartSelected`) e o status persistente exposto via `aria-describedby` no
412
+ * `<input>` (`rangePendingStatusText`) — mesma redação nos dois lugares de propósito, pra não
413
+ * soarem como dois estados diferentes pro mesmo momento. */
414
+ private buildRangeStartSelectedText;
415
+ /** Anuncia que a data INICIAL do intervalo foi escolhida — o primeiro clique em `range` era
416
+ * mudo (ao contrário do toggle em modo `multiple`, sempre anunciado). Recebe um `Date` puro,
417
+ * não um clique: `selectToday()` chama `selectDate()` internamente e herda este anúncio de
418
+ * graça, sem precisar de uma segunda chamada. */
419
+ private announceRangeStartSelected;
420
+ /** Anuncia o intervalo concluído, chamado antes de `closePanel()` — o `LiveAnnouncer` escreve
421
+ * numa região `aria-live` própria e desacoplada do foco, então não é cortado pela restauração
422
+ * de foco que `closePanel()` agenda um tick depois via `afterNextRender`. */
423
+ private announceRangeCompleted;
297
424
  protected selectYear(year: number): void;
298
425
  protected selectMonth(monthIndex: number): void;
299
426
  protected selectToday(): void;
@@ -321,7 +448,14 @@ export declare class DatepickerComponent implements ControlValueAccessor, Valida
321
448
  protected isMonthSelected(monthIndex: number): boolean;
322
449
  protected isMonthDisabled(monthIndex: number): boolean;
323
450
  protected padTime(value: number): string;
324
- protected formatDayAriaLabel(date: Date): string;
451
+ /** `day` é opcional e só usado em `mode="range"` — os demais call sites (resumo do valor
452
+ * segmentado, anúncio de toggle em modo `multiple`) nunca têm um `CalendarDay` à mão e nunca
453
+ * rodam em `range`, então continuam recebendo exatamente o texto de sempre. */
454
+ protected formatDayAriaLabel(date: Date, day?: CalendarDay): string;
455
+ /** Sufixo que diz o papel do dia dentro do intervalo selecionado — sem isso, toda célula da
456
+ * grade soa idêntica pro leitor de tela, e o único jeito de saber onde está o início/fim é
457
+ * enxergando o destaque visual. */
458
+ private rangeDayStatusSuffix;
325
459
  /** Formata o valor para exibição no input, aplicando rangeSeparator, dateFormat e multipleSeparator. */
326
460
  private formatForDisplay;
327
461
  /**
@@ -1,3 +1,4 @@
1
+ import { FocusTrapFactory } from '@angular/cdk/a11y';
1
2
  import { Overlay, OverlayRef } from '@angular/cdk/overlay';
2
3
  import { Injector, Type } from '@angular/core';
3
4
  import { ActiveDialog } from '../models/active-dialog';
@@ -7,6 +8,7 @@ export declare class DialogService {
7
8
  protected readonly activeDialogInstances: ActiveDialog[];
8
9
  protected readonly overlay: Overlay;
9
10
  protected readonly injector: Injector;
11
+ protected readonly focusTrapFactory: FocusTrapFactory;
10
12
  constructor();
11
13
  open<T>(componentRef: Type<T>, options?: DialogOptions): DialogRef<T>;
12
14
  protected createComponent<T>(componentRef: Type<T>, dialogOptions?: DialogOptions): {
@@ -149,7 +149,7 @@ export class AccordionPanelComponent {
149
149
  }
150
150
  }
151
151
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: AccordionPanelComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
152
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: AccordionPanelComponent, isStandalone: true, selector: "s-accordion-panel", inputs: { header: "header", badgeConfig: "badgeConfig", buttons: "buttons", disabled: "disabled", switchControl: "switchControl", validationMessage: "validationMessage", cache: "cache", validationMessageIcon: "validationMessageIcon", validationMessageIconColor: "validationMessageIconColor" }, outputs: { panelOpened: "panelOpened", panelClosed: "panelClosed" }, usesOnChanges: true, ngImport: i0, template: "<div\n class=\"accordion-panel border-b border-grayscale-30\"\n [class.accordion-panel--open]=\"isOpen\"\n [class.accordion-panel--disabled]=\"disabled\"\n>\n <div\n class=\"header flex select-none items-center justify-between border-grayscale-30 bg-grayscale-0 p-4\"\n [class.bg-grayscale-10]=\"isOpen\"\n [class.border-b]=\"isOpen\"\n [class.cursor-pointer]=\"!disabled\"\n [class.cursor-auto]=\"disabled\"\n >\n <div\n class=\"header__trigger flex items-center flex-1 flex-nowrap focus-visible:outline focus-visible:outline-2 focus-visible:outline-primary focus-visible:[outline-offset:-2px]\"\n [class.cursor-pointer]=\"!disabled\"\n [class.cursor-auto]=\"disabled\"\n role=\"button\"\n [tabindex]=\"disabled ? -1 : 0\"\n [attr.aria-expanded]=\"isOpen\"\n [attr.aria-controls]=\"'accordion-panel-content-' + panelId\"\n [attr.aria-disabled]=\"disabled\"\n (click)=\"onTabClick()\"\n (keydown)=\"onHeaderKeydown($event)\"\n >\n <span\n class=\"icon fas text-base mr-3\"\n [class.fa-minus]=\"isOpen\"\n [class.fa-plus]=\"!isOpen\"\n [class.text-grayscale-90]=\"!disabled\"\n [class.text-grayscale-30]=\"disabled\"\n aria-hidden=\"true\"\n >\n </span>\n @if (validationMessage) {\n <span\n class=\"exclamation-icon text-base mr-3\"\n [class]=\"validationMessageIcon\"\n [sTooltip]=\"validationMessage\"\n [class.exclamation-icon-red]=\"validationMessageIconColor === 'Red'\"\n [class.text-criticality-red]=\"validationMessageIconColor === 'Red'\"\n [class.exclamation-icon-orange]=\"validationMessageIconColor === 'Orange'\"\n [class.text-criticality-orange]=\"validationMessageIconColor === 'Orange'\"\n [class.exclamation-icon-yellow]=\"validationMessageIconColor === 'Yellow'\"\n [class.text-criticality-yellow]=\"validationMessageIconColor === 'Yellow'\"\n [class.exclamation-icon-green]=\"validationMessageIconColor === 'Green'\"\n [class.text-criticality-green]=\"validationMessageIconColor === 'Green'\"\n [class.exclamation-icon-blue]=\"validationMessageIconColor === 'Blue'\"\n [class.text-primary]=\"validationMessageIconColor === 'Blue'\"\n [class.opacity-50]=\"disabled\"\n aria-hidden=\"true\"\n >\n </span>\n }\n <span\n class=\"title font-open-sans text-sm font-bold uppercase leading-normal\"\n [class.text-grayscale-30]=\"disabled\"\n [id]=\"'accordion-panel-header-' + panelId\"\n >{{ header }}</span\n >\n </div>\n <div class=\"header__controls flex items-center ml-4\">\n @if (badgeConfig) {\n <s-badge\n [color]=\"badgeConfig.color\"\n [text]=\"badgeConfig.text\"\n ></s-badge>\n }\n\n @for (button of buttons; track button.icon) {\n <button\n class=\"icon-button text-base ml-3 p-1 border-0 bg-transparent\"\n [class.text-grayscale-90]=\"!disabled\"\n [class.text-grayscale-30]=\"disabled\"\n [class.cursor-pointer]=\"!disabled\"\n [class.cursor-auto]=\"disabled\"\n [ngClass]=\"button.icon\"\n [attr.aria-label]=\"button.label\"\n (click)=\"onIconButtonsClick($event, button.onClick)\"\n ></button>\n }\n\n @if (switchControl) {\n <s-switch\n class=\"switch pl-4\"\n [formControl]=\"switchControl\"\n (click)=\"$event.stopPropagation()\"\n >\n </s-switch>\n }\n </div>\n </div>\n\n @if (cache) {\n <div\n class=\"content bg-grayscale-0 overflow-hidden\"\n role=\"region\"\n [attr.aria-labelledby]=\"'accordion-panel-header-' + panelId\"\n [id]=\"'accordion-panel-content-' + panelId\"\n [@cacheAnimation]=\"isOpen\"\n [@.disabled]=\"isContentAnimationDisabled\"\n (@cacheAnimation.start)=\"onContentAnimationStart()\"\n (@cacheAnimation.done)=\"onContentAnimationDone()\"\n >\n <div class=\"content-container m-5\">\n <ng-container [ngTemplateOutlet]=\"panelContent\"></ng-container>\n </div>\n </div>\n } @else {\n @if (isOpen) {\n <div\n class=\"content bg-grayscale-0 overflow-hidden\"\n role=\"region\"\n [attr.aria-labelledby]=\"'accordion-panel-header-' + panelId\"\n [id]=\"'accordion-panel-content-' + panelId\"\n @cachelessAnimation\n [@.disabled]=\"isContentAnimationDisabled\"\n (@cachelessAnimation.start)=\"onContentAnimationStart()\"\n (@cachelessAnimation.done)=\"onContentAnimationDone()\"\n >\n <div class=\"content-container m-5\">\n <ng-container [ngTemplateOutlet]=\"panelContent\"></ng-container>\n </div>\n </div>\n }\n }\n</div>\n\n<ng-template #panelContent>\n <ng-content></ng-content>\n</ng-template>\n", dependencies: [{ kind: "directive", type: TooltipDirective, selector: "[sTooltip]", inputs: ["sTooltip", "tooltipPosition", "showDelay", "displayTime", "tooltipEvent", "escape", "visible", "mobileBehavior", "focusedInputRef", "checkTruncatedText"] }, { kind: "component", type: BadgeComponent, selector: "s-badge", inputs: ["type", "color", "title", "text", "selectable", "iconClass", "iconPosition", "infoSign", "enableTruncateText"], outputs: ["selected"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "component", type: SwitchComponent, selector: "s-switch", inputs: ["readonly", "trueLabel", "falseLabel", "inputId", "label", "inputName", "disabled", "value", "showStatusLabel"], outputs: ["valueChanged"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }], animations: [
152
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: AccordionPanelComponent, isStandalone: true, selector: "s-accordion-panel", inputs: { header: "header", badgeConfig: "badgeConfig", buttons: "buttons", disabled: "disabled", switchControl: "switchControl", validationMessage: "validationMessage", cache: "cache", validationMessageIcon: "validationMessageIcon", validationMessageIconColor: "validationMessageIconColor" }, outputs: { panelOpened: "panelOpened", panelClosed: "panelClosed" }, usesOnChanges: true, ngImport: i0, template: "<div\n class=\"accordion-panel border-b border-grayscale-30\"\n [class.accordion-panel--open]=\"isOpen\"\n [class.accordion-panel--disabled]=\"disabled\"\n>\n <div\n class=\"header flex select-none items-center justify-between border-grayscale-30 bg-grayscale-0 p-4\"\n [class.bg-grayscale-10]=\"isOpen\"\n [class.border-b]=\"isOpen\"\n [class.cursor-pointer]=\"!disabled\"\n [class.cursor-auto]=\"disabled\"\n >\n <div\n class=\"header__trigger flex items-center flex-1 flex-nowrap focus-visible:outline focus-visible:outline-2 focus-visible:outline-[var(--s-focus-ring-color,#0090ff)] focus-visible:[outline-offset:-2px]\"\n [class.cursor-pointer]=\"!disabled\"\n [class.cursor-auto]=\"disabled\"\n role=\"button\"\n [tabindex]=\"disabled ? -1 : 0\"\n [attr.aria-expanded]=\"isOpen\"\n [attr.aria-controls]=\"'accordion-panel-content-' + panelId\"\n [attr.aria-disabled]=\"disabled\"\n (click)=\"onTabClick()\"\n (keydown)=\"onHeaderKeydown($event)\"\n >\n <span\n class=\"icon fas text-base mr-3\"\n [class.fa-minus]=\"isOpen\"\n [class.fa-plus]=\"!isOpen\"\n [class.text-grayscale-90]=\"!disabled\"\n [class.text-grayscale-30]=\"disabled\"\n aria-hidden=\"true\"\n >\n </span>\n @if (validationMessage) {\n <span\n class=\"exclamation-icon text-base mr-3\"\n [class]=\"validationMessageIcon\"\n [sTooltip]=\"validationMessage\"\n [class.exclamation-icon-red]=\"validationMessageIconColor === 'Red'\"\n [class.text-criticality-red]=\"validationMessageIconColor === 'Red'\"\n [class.exclamation-icon-orange]=\"validationMessageIconColor === 'Orange'\"\n [class.text-criticality-orange]=\"validationMessageIconColor === 'Orange'\"\n [class.exclamation-icon-yellow]=\"validationMessageIconColor === 'Yellow'\"\n [class.text-criticality-yellow]=\"validationMessageIconColor === 'Yellow'\"\n [class.exclamation-icon-green]=\"validationMessageIconColor === 'Green'\"\n [class.text-criticality-green]=\"validationMessageIconColor === 'Green'\"\n [class.exclamation-icon-blue]=\"validationMessageIconColor === 'Blue'\"\n [class.text-primary]=\"validationMessageIconColor === 'Blue'\"\n [class.opacity-50]=\"disabled\"\n aria-hidden=\"true\"\n >\n </span>\n }\n <span\n class=\"title font-open-sans text-sm font-bold uppercase leading-normal\"\n [class.text-grayscale-30]=\"disabled\"\n [id]=\"'accordion-panel-header-' + panelId\"\n >{{ header }}</span\n >\n </div>\n <div class=\"header__controls flex items-center ml-4\">\n @if (badgeConfig) {\n <s-badge\n [color]=\"badgeConfig.color\"\n [text]=\"badgeConfig.text\"\n ></s-badge>\n }\n\n @for (button of buttons; track button.icon) {\n <button\n class=\"icon-button text-base ml-3 p-1 border-0 bg-transparent rounded-[50%] focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-[3px] focus-visible:outline-[var(--s-focus-ring-color,#0090ff)]\"\n [class.text-grayscale-90]=\"!disabled\"\n [class.text-grayscale-30]=\"disabled\"\n [class.cursor-pointer]=\"!disabled\"\n [class.cursor-auto]=\"disabled\"\n [ngClass]=\"button.icon\"\n [attr.aria-label]=\"button.label\"\n (click)=\"onIconButtonsClick($event, button.onClick)\"\n ></button>\n }\n\n @if (switchControl) {\n <s-switch\n class=\"switch pl-4\"\n [formControl]=\"switchControl\"\n (click)=\"$event.stopPropagation()\"\n >\n </s-switch>\n }\n </div>\n </div>\n\n @if (cache) {\n <div\n class=\"content bg-grayscale-0 overflow-hidden\"\n role=\"region\"\n [attr.aria-labelledby]=\"'accordion-panel-header-' + panelId\"\n [id]=\"'accordion-panel-content-' + panelId\"\n [@cacheAnimation]=\"isOpen\"\n [@.disabled]=\"isContentAnimationDisabled\"\n (@cacheAnimation.start)=\"onContentAnimationStart()\"\n (@cacheAnimation.done)=\"onContentAnimationDone()\"\n >\n <div class=\"content-container m-5\">\n <ng-container [ngTemplateOutlet]=\"panelContent\"></ng-container>\n </div>\n </div>\n } @else {\n @if (isOpen) {\n <div\n class=\"content bg-grayscale-0 overflow-hidden\"\n role=\"region\"\n [attr.aria-labelledby]=\"'accordion-panel-header-' + panelId\"\n [id]=\"'accordion-panel-content-' + panelId\"\n @cachelessAnimation\n [@.disabled]=\"isContentAnimationDisabled\"\n (@cachelessAnimation.start)=\"onContentAnimationStart()\"\n (@cachelessAnimation.done)=\"onContentAnimationDone()\"\n >\n <div class=\"content-container m-5\">\n <ng-container [ngTemplateOutlet]=\"panelContent\"></ng-container>\n </div>\n </div>\n }\n }\n</div>\n\n<ng-template #panelContent>\n <ng-content></ng-content>\n</ng-template>\n", dependencies: [{ kind: "directive", type: TooltipDirective, selector: "[sTooltip]", inputs: ["sTooltip", "tooltipPosition", "showDelay", "displayTime", "tooltipEvent", "escape", "visible", "mobileBehavior", "focusedInputRef", "checkTruncatedText"] }, { kind: "component", type: BadgeComponent, selector: "s-badge", inputs: ["type", "color", "title", "text", "selectable", "iconClass", "iconPosition", "infoSign", "enableTruncateText"], outputs: ["selected"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "component", type: SwitchComponent, selector: "s-switch", inputs: ["readonly", "trueLabel", "falseLabel", "inputId", "label", "inputName", "disabled", "value", "showStatusLabel"], outputs: ["valueChanged"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }], animations: [
153
153
  trigger('cachelessAnimation', [
154
154
  transition(':enter', [style({ height: '0' }), animate('200ms linear', style({ height: '*' }))]),
155
155
  transition(':leave', [style({ height: '*' }), animate('200ms linear', style({ height: '0' }))]),
@@ -181,7 +181,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
181
181
  FormsModule,
182
182
  ReactiveFormsModule,
183
183
  NgTemplateOutlet,
184
- ], template: "<div\n class=\"accordion-panel border-b border-grayscale-30\"\n [class.accordion-panel--open]=\"isOpen\"\n [class.accordion-panel--disabled]=\"disabled\"\n>\n <div\n class=\"header flex select-none items-center justify-between border-grayscale-30 bg-grayscale-0 p-4\"\n [class.bg-grayscale-10]=\"isOpen\"\n [class.border-b]=\"isOpen\"\n [class.cursor-pointer]=\"!disabled\"\n [class.cursor-auto]=\"disabled\"\n >\n <div\n class=\"header__trigger flex items-center flex-1 flex-nowrap focus-visible:outline focus-visible:outline-2 focus-visible:outline-primary focus-visible:[outline-offset:-2px]\"\n [class.cursor-pointer]=\"!disabled\"\n [class.cursor-auto]=\"disabled\"\n role=\"button\"\n [tabindex]=\"disabled ? -1 : 0\"\n [attr.aria-expanded]=\"isOpen\"\n [attr.aria-controls]=\"'accordion-panel-content-' + panelId\"\n [attr.aria-disabled]=\"disabled\"\n (click)=\"onTabClick()\"\n (keydown)=\"onHeaderKeydown($event)\"\n >\n <span\n class=\"icon fas text-base mr-3\"\n [class.fa-minus]=\"isOpen\"\n [class.fa-plus]=\"!isOpen\"\n [class.text-grayscale-90]=\"!disabled\"\n [class.text-grayscale-30]=\"disabled\"\n aria-hidden=\"true\"\n >\n </span>\n @if (validationMessage) {\n <span\n class=\"exclamation-icon text-base mr-3\"\n [class]=\"validationMessageIcon\"\n [sTooltip]=\"validationMessage\"\n [class.exclamation-icon-red]=\"validationMessageIconColor === 'Red'\"\n [class.text-criticality-red]=\"validationMessageIconColor === 'Red'\"\n [class.exclamation-icon-orange]=\"validationMessageIconColor === 'Orange'\"\n [class.text-criticality-orange]=\"validationMessageIconColor === 'Orange'\"\n [class.exclamation-icon-yellow]=\"validationMessageIconColor === 'Yellow'\"\n [class.text-criticality-yellow]=\"validationMessageIconColor === 'Yellow'\"\n [class.exclamation-icon-green]=\"validationMessageIconColor === 'Green'\"\n [class.text-criticality-green]=\"validationMessageIconColor === 'Green'\"\n [class.exclamation-icon-blue]=\"validationMessageIconColor === 'Blue'\"\n [class.text-primary]=\"validationMessageIconColor === 'Blue'\"\n [class.opacity-50]=\"disabled\"\n aria-hidden=\"true\"\n >\n </span>\n }\n <span\n class=\"title font-open-sans text-sm font-bold uppercase leading-normal\"\n [class.text-grayscale-30]=\"disabled\"\n [id]=\"'accordion-panel-header-' + panelId\"\n >{{ header }}</span\n >\n </div>\n <div class=\"header__controls flex items-center ml-4\">\n @if (badgeConfig) {\n <s-badge\n [color]=\"badgeConfig.color\"\n [text]=\"badgeConfig.text\"\n ></s-badge>\n }\n\n @for (button of buttons; track button.icon) {\n <button\n class=\"icon-button text-base ml-3 p-1 border-0 bg-transparent\"\n [class.text-grayscale-90]=\"!disabled\"\n [class.text-grayscale-30]=\"disabled\"\n [class.cursor-pointer]=\"!disabled\"\n [class.cursor-auto]=\"disabled\"\n [ngClass]=\"button.icon\"\n [attr.aria-label]=\"button.label\"\n (click)=\"onIconButtonsClick($event, button.onClick)\"\n ></button>\n }\n\n @if (switchControl) {\n <s-switch\n class=\"switch pl-4\"\n [formControl]=\"switchControl\"\n (click)=\"$event.stopPropagation()\"\n >\n </s-switch>\n }\n </div>\n </div>\n\n @if (cache) {\n <div\n class=\"content bg-grayscale-0 overflow-hidden\"\n role=\"region\"\n [attr.aria-labelledby]=\"'accordion-panel-header-' + panelId\"\n [id]=\"'accordion-panel-content-' + panelId\"\n [@cacheAnimation]=\"isOpen\"\n [@.disabled]=\"isContentAnimationDisabled\"\n (@cacheAnimation.start)=\"onContentAnimationStart()\"\n (@cacheAnimation.done)=\"onContentAnimationDone()\"\n >\n <div class=\"content-container m-5\">\n <ng-container [ngTemplateOutlet]=\"panelContent\"></ng-container>\n </div>\n </div>\n } @else {\n @if (isOpen) {\n <div\n class=\"content bg-grayscale-0 overflow-hidden\"\n role=\"region\"\n [attr.aria-labelledby]=\"'accordion-panel-header-' + panelId\"\n [id]=\"'accordion-panel-content-' + panelId\"\n @cachelessAnimation\n [@.disabled]=\"isContentAnimationDisabled\"\n (@cachelessAnimation.start)=\"onContentAnimationStart()\"\n (@cachelessAnimation.done)=\"onContentAnimationDone()\"\n >\n <div class=\"content-container m-5\">\n <ng-container [ngTemplateOutlet]=\"panelContent\"></ng-container>\n </div>\n </div>\n }\n }\n</div>\n\n<ng-template #panelContent>\n <ng-content></ng-content>\n</ng-template>\n" }]
184
+ ], template: "<div\n class=\"accordion-panel border-b border-grayscale-30\"\n [class.accordion-panel--open]=\"isOpen\"\n [class.accordion-panel--disabled]=\"disabled\"\n>\n <div\n class=\"header flex select-none items-center justify-between border-grayscale-30 bg-grayscale-0 p-4\"\n [class.bg-grayscale-10]=\"isOpen\"\n [class.border-b]=\"isOpen\"\n [class.cursor-pointer]=\"!disabled\"\n [class.cursor-auto]=\"disabled\"\n >\n <div\n class=\"header__trigger flex items-center flex-1 flex-nowrap focus-visible:outline focus-visible:outline-2 focus-visible:outline-[var(--s-focus-ring-color,#0090ff)] focus-visible:[outline-offset:-2px]\"\n [class.cursor-pointer]=\"!disabled\"\n [class.cursor-auto]=\"disabled\"\n role=\"button\"\n [tabindex]=\"disabled ? -1 : 0\"\n [attr.aria-expanded]=\"isOpen\"\n [attr.aria-controls]=\"'accordion-panel-content-' + panelId\"\n [attr.aria-disabled]=\"disabled\"\n (click)=\"onTabClick()\"\n (keydown)=\"onHeaderKeydown($event)\"\n >\n <span\n class=\"icon fas text-base mr-3\"\n [class.fa-minus]=\"isOpen\"\n [class.fa-plus]=\"!isOpen\"\n [class.text-grayscale-90]=\"!disabled\"\n [class.text-grayscale-30]=\"disabled\"\n aria-hidden=\"true\"\n >\n </span>\n @if (validationMessage) {\n <span\n class=\"exclamation-icon text-base mr-3\"\n [class]=\"validationMessageIcon\"\n [sTooltip]=\"validationMessage\"\n [class.exclamation-icon-red]=\"validationMessageIconColor === 'Red'\"\n [class.text-criticality-red]=\"validationMessageIconColor === 'Red'\"\n [class.exclamation-icon-orange]=\"validationMessageIconColor === 'Orange'\"\n [class.text-criticality-orange]=\"validationMessageIconColor === 'Orange'\"\n [class.exclamation-icon-yellow]=\"validationMessageIconColor === 'Yellow'\"\n [class.text-criticality-yellow]=\"validationMessageIconColor === 'Yellow'\"\n [class.exclamation-icon-green]=\"validationMessageIconColor === 'Green'\"\n [class.text-criticality-green]=\"validationMessageIconColor === 'Green'\"\n [class.exclamation-icon-blue]=\"validationMessageIconColor === 'Blue'\"\n [class.text-primary]=\"validationMessageIconColor === 'Blue'\"\n [class.opacity-50]=\"disabled\"\n aria-hidden=\"true\"\n >\n </span>\n }\n <span\n class=\"title font-open-sans text-sm font-bold uppercase leading-normal\"\n [class.text-grayscale-30]=\"disabled\"\n [id]=\"'accordion-panel-header-' + panelId\"\n >{{ header }}</span\n >\n </div>\n <div class=\"header__controls flex items-center ml-4\">\n @if (badgeConfig) {\n <s-badge\n [color]=\"badgeConfig.color\"\n [text]=\"badgeConfig.text\"\n ></s-badge>\n }\n\n @for (button of buttons; track button.icon) {\n <button\n class=\"icon-button text-base ml-3 p-1 border-0 bg-transparent rounded-[50%] focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-[3px] focus-visible:outline-[var(--s-focus-ring-color,#0090ff)]\"\n [class.text-grayscale-90]=\"!disabled\"\n [class.text-grayscale-30]=\"disabled\"\n [class.cursor-pointer]=\"!disabled\"\n [class.cursor-auto]=\"disabled\"\n [ngClass]=\"button.icon\"\n [attr.aria-label]=\"button.label\"\n (click)=\"onIconButtonsClick($event, button.onClick)\"\n ></button>\n }\n\n @if (switchControl) {\n <s-switch\n class=\"switch pl-4\"\n [formControl]=\"switchControl\"\n (click)=\"$event.stopPropagation()\"\n >\n </s-switch>\n }\n </div>\n </div>\n\n @if (cache) {\n <div\n class=\"content bg-grayscale-0 overflow-hidden\"\n role=\"region\"\n [attr.aria-labelledby]=\"'accordion-panel-header-' + panelId\"\n [id]=\"'accordion-panel-content-' + panelId\"\n [@cacheAnimation]=\"isOpen\"\n [@.disabled]=\"isContentAnimationDisabled\"\n (@cacheAnimation.start)=\"onContentAnimationStart()\"\n (@cacheAnimation.done)=\"onContentAnimationDone()\"\n >\n <div class=\"content-container m-5\">\n <ng-container [ngTemplateOutlet]=\"panelContent\"></ng-container>\n </div>\n </div>\n } @else {\n @if (isOpen) {\n <div\n class=\"content bg-grayscale-0 overflow-hidden\"\n role=\"region\"\n [attr.aria-labelledby]=\"'accordion-panel-header-' + panelId\"\n [id]=\"'accordion-panel-content-' + panelId\"\n @cachelessAnimation\n [@.disabled]=\"isContentAnimationDisabled\"\n (@cachelessAnimation.start)=\"onContentAnimationStart()\"\n (@cachelessAnimation.done)=\"onContentAnimationDone()\"\n >\n <div class=\"content-container m-5\">\n <ng-container [ngTemplateOutlet]=\"panelContent\"></ng-container>\n </div>\n </div>\n }\n }\n</div>\n\n<ng-template #panelContent>\n <ng-content></ng-content>\n</ng-template>\n" }]
185
185
  }], propDecorators: { header: [{
186
186
  type: Input,
187
187
  args: [{ required: true }]
@@ -206,4 +206,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
206
206
  }], panelClosed: [{
207
207
  type: Output
208
208
  }] } });
209
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWNjb3JkaW9uLXBhbmVsLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2FuZ3VsYXItY29tcG9uZW50cy9hY2NvcmRpb24vc3JjL2xpYi9hY2NvcmRpb24vY29tcG9uZW50cy9hY2NvcmRpb24tcGFuZWwvYWNjb3JkaW9uLXBhbmVsLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2FuZ3VsYXItY29tcG9uZW50cy9hY2NvcmRpb24vc3JjL2xpYi9hY2NvcmRpb24vY29tcG9uZW50cy9hY2NvcmRpb24tcGFuZWwvYWNjb3JkaW9uLXBhbmVsLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBaUIsU0FBUyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQWEsTUFBTSxFQUFpQixNQUFNLGVBQWUsQ0FBQztBQUNoSCxPQUFPLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBRWpGLE9BQU8sRUFBc0IsV0FBVyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFdEYsT0FBTyxFQUFlLGNBQWMsRUFBRSxNQUFNLDBDQUEwQyxDQUFDO0FBQ3ZGLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDRDQUE0QyxDQUFDO0FBQzlFLE9BQU8sRUFBRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUM1RCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sMkNBQTJDLENBQUM7OztBQUU1RSxJQUFJLFdBQVcsR0FBRyxDQUFDLENBQUM7QUFFcEI7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBaUJHO0FBMEJILE1BQU0sT0FBTyx1QkFBdUI7SUFDaEM7O09BRUc7SUFFSSxNQUFNLENBQVU7SUFFdkI7OztPQUdHO0lBRUks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Z0JBVUMsS0FBSztzQkFEWCxLQUFLO2dCQVFHLHFCQUFxQjtzQkFBN0IsS0FBSztnQkFPRywwQkFBMEI7c0JBQWxDLEtBQUs7Z0JBTUMsV0FBVztzQkFEakIsTUFBTTtnQkFPQSxXQUFXO3NCQURqQixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQWZ0ZXJWaWV3SW5pdCwgQ29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIElucHV0LCBPbkNoYW5nZXMsIE91dHB1dCwgU2ltcGxlQ2hhbmdlcyB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyB0cmlnZ2VyLCBzdHlsZSwgYW5pbWF0ZSwgdHJhbnNpdGlvbiwgc3RhdGUgfSBmcm9tICdAYW5ndWxhci9hbmltYXRpb25zJztcclxuXHJcbmltcG9ydCB7IFVudHlwZWRGb3JtQ29udHJvbCwgRm9ybXNNb2R1bGUsIFJlYWN0aXZlRm9ybXNNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcbmltcG9ydCB7IEFjY29yZGlvbkJ1dHRvblNldHRpbmdzLCBWYWxpZGF0aW9uTWVzc2FnZUljb25Db2xvciB9IGZyb20gJy4uLy4uL21vZGVscy9hY2NvcmRpb24tYnV0dG9uLXNldHRpbmdzJztcclxuaW1wb3J0IHsgQmFkZ2VDb2xvcnMsIEJhZGdlQ29tcG9uZW50IH0gZnJvbSAnQHNlbmlvcnNpc3RlbWFzL2FuZ3VsYXItY29tcG9uZW50cy9iYWRnZSc7XHJcbmltcG9ydCB7IFRvb2x0aXBEaXJlY3RpdmUgfSBmcm9tICdAc2VuaW9yc2lzdGVtYXMvYW5ndWxhci1jb21wb25lbnRzL3Rvb2x0aXAnO1xyXG5pbXBvcnQgeyBOZ0NsYXNzLCBOZ1RlbXBsYXRlT3V0bGV0IH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcclxuaW1wb3J0IHsgU3dpdGNoQ29tcG9uZW50IH0gZnJvbSAnQHNlbmlvcnNpc3RlbWFzL2FuZ3VsYXItY29tcG9uZW50cy9zd2l0Y2gnO1xyXG5cclxubGV0IG5leHRQYW5lbElkID0gMDtcclxuXHJcbi8qKlxyXG4gKiBAZGVzY3JpcHRpb24gUGFpbmVsIGluZGl2aWR1YWwgZG8ge0BsaW5rIEFjY29yZGlvbkNvbXBvbmVudH0uIEdlcmVuY2lhIG8gZXN0YWRvIGRlXHJcbiAqIGFiZXJ0dXJhL2ZlY2hhbWVudG8gY29tIGFuaW1hw6fDo28sIHBvZGVuZG8gY29udGVyIHVtIHN3aXRjaCBkZSBjb250cm9sZSB2aWEgYHN3aXRjaENvbnRyb2xgLFxyXG4gKiBib3TDtWVzIGRlIGHDp8OjbyBjb25maWd1csOhdmVpcyBlIHVtYSBtZW5zYWdlbSBkZSB2YWxpZGHDp8OjbyBjb20gw61jb25lLlxyXG4gKlxyXG4gKiBAZXhhbXBsZVxyXG4gKiBgYGBodG1sXHJcbiAqIDxzLWFjY29yZGlvbi1wYW5lbFxyXG4gKiAgIGhlYWRlcj1cIkNvbmZpZ3VyYcOnw7Vlc1wiXHJcbiAqICAgW2Rpc2FibGVkXT1cImZhbHNlXCJcclxuICogICAocGFuZWxPcGVuZWQpPVwib25PcGVuKClcIlxyXG4gKiAgIChwYW5lbENsb3NlZCk9XCJvbkNsb3NlKClcIj5cclxuICogICA8cD5Db250ZcO6ZG8gZG8gcGFpbmVsPC9wPlxyXG4gKiA8L3MtYWNjb3JkaW9uLXBhbmVsPlxyXG4gKiBgYGBcclxuICpcclxuICogQGNhdGVnb3J5IElucHV0c1xyXG4gKi9cclxuQENvbXBvbmVudCh7XHJcbiAgICBzZWxlY3RvcjogJ3MtYWNjb3JkaW9uLXBhbmVsJyxcclxuICAgIHRlbXBsYXRlVXJsOiAnLi9hY2NvcmRpb24tcGFuZWwuY29tcG9uZW50Lmh0bWwnLFxyXG4gICAgYW5pbWF0aW9uczogW1xyXG4gICAgICAgIHRyaWdnZXIoJ2NhY2hlbGVzc0FuaW1hdGlvbicsIFtcclxuICAgICAgICAgICAgdHJhbnNpdGlvbignOmVudGVyJywgW3N0eWxlKHsgaGVpZ2h0OiAnMCcgfSksIGFuaW1hdGUoJzIwMG1zIGxpbmVhcicsIHN0eWxlKHsgaGVpZ2h0OiAnKicgfSkpXSksXHJcbiAgICAgICAgICAgIHRyYW5zaXRpb24oJzpsZWF2ZScsIFtzdHlsZSh7IGhlaWdodDogJyonIH0pLCBhbmltYXRlKCcyMDBtcyBsaW5lYXInLCBzdHlsZSh7IGhlaWdodDogJzAnIH0pKV0pLFxyXG4gICAgICAgIF0pLFxyXG4gICAgICAgIHRyaWdnZXIoJ2NhY2hlQW5pbWF0aW9uJywgW1xyXG4gICAgICAgICAgICBzdGF0ZSgndHJ1ZScsIHN0eWxlKHsgaGVpZ2h0OiAnKicgfSkpLFxyXG4gICAgICAgICAgICBzdGF0ZSgnZmFsc2UnLCBzdHlsZSh7IGhlaWdodDogJzBweCcgfSkpLFxyXG4gICAgICAgICAgICB0cmFuc2l0aW9uKCcqID0+IConLCBhbmltYXRlKCcyMDBtcycpKSxcclxuICAgICAgICBdKSxcclxuICAgIF0sXHJcbiAgICBzdGFuZGFsb25lOiB0cnVlLFxyXG4gICAgaW1wb3J0czogW1xyXG4gICAgICAgIFRvb2x0aXBEaXJlY3RpdmUsXHJcbiAgICAgICAgQmFkZ2VDb21wb25lbnQsXHJcbiAgICAgICAgTmdDbGFzcyxcclxuICAgICAgICBTd2l0Y2hDb21wb25lbnQsXHJcbiAgICAgICAgRm9ybXNNb2R1bGUsXHJcbiAgICAgICAgUmVhY3RpdmVGb3Jtc01vZHVsZSxcclxuICAgICAgICBOZ1RlbXBsYXRlT3V0bGV0LFxyXG4gICAgXSxcclxufSlcclxuZXhwb3J0IGNsYXNzIEFjY29yZGlvblBhbmVsQ29tcG9uZW50IGltcGxlbWVudHMgT25DaGFuZ2VzLCBBZnRlclZpZXdJbml0IHtcclxuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIFTDrXR1bG8gZXhpYmlkbyBubyBjYWJlw6dhbGhvIGRvIHBhaW5lbC4gQ2FtcG8gb2JyaWdhdMOzcmlvLlxyXG4gICAgICovXHJcbiAgICBASW5wdXQoeyByZXF1aXJlZDogdHJ1ZSB9KVxyXG4gICAgcHVibGljIGhlYWRlciE6IHN0cmluZztcclxuXHJcbiAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvbiBDcmlhIHVtIGNvbXBvbmVudGUgQmFkZ2UgYW8gbGFkbyBkb3MgYm90w7VlcyBkZSBhw6fDo28gbm8gY2FiZcOnYWxobyBkbyBwYWluZWwuXHJcbiAgICAgKiBPIG9iamV0byBkZSBjb25maWd1cmHDp8OjbyBkZXZlIGNvbnRlciBvIHRleHRvIGUgYSBjb3IgZG8gYmFkZ2UuXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpXHJcbiAgICBwdWJsaWMgYmFkZ2VDb25maWc/OiB7IHRleHQ6IHN0cmluZzsgY29sb3I6IEJhZGdlQ29sb3JzIH07XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gTGlzdGEgZGUgYm90w7VlcyBkZSBhw6fDo28gZXhpYmlkb3Mgbm8gY2FiZcOnYWxobyBkbyBwYWluZWwsXHJcbiAgICAgKiDDoCBkaXJlaXRhIGRvIHTDrXR1bG8uIENhZGEgaXRlbSBkZWZpbmUgw61jb25lLCB0b29sdGlwIGUgY2FsbGJhY2sgZGUgY2xpcXVlLlxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKVxyXG4gICAgcHVibGljIGJ1dHRvbnM/OiBBY2NvcmRpb25CdXR0b25TZXR0aW5nc1tdO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIERlc2FiaWxpdGEgYSBpbnRlcmHDp8OjbyBkbyB1c3XDoXJpbyBjb20gbyBwYWluZWwsIGltcGVkaW5kbyBhYmVydHVyYSBlIGZlY2hhbWVudG8uXHJcbiAgICAgKlxyXG4gICAgICogQGRlZmF1bHQgZmFsc2VcclxuICAgICAqL1xyXG4gICAgQElucHV0KClcclxuICAgIHB1YmxpYyBkaXNhYmxlZCA9IGZhbHNlO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIGBGb3JtQ29udHJvbGAgdmluY3VsYWRvIGEgdW0gc3dpdGNoIGV4aWJpZG8gbm8gY2FiZcOnYWxobyBkbyBwYWluZWwuXHJcbiAgICAgKiBQZXJtaXRlIGhhYmlsaXRhci9kZXNhYmlsaXRhciBvIGNvbnRlw7pkbyBkbyBwYWluZWwgdmlhIHRvZ2dsZS5cclxuICAgICAqL1xyXG4gICAgQElucHV0KClcclxuICAgIHB1YmxpYyBzd2l0Y2hDb250cm9sPzogVW50eXBlZEZvcm1Db250cm9sO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIE1lbnNhZ2VtIGRlIHZhbGlkYcOnw6NvIGV4aWJpZGEgYWJhaXhvIGRvIGNhYmXDp2FsaG8sIGFjb21wYW5oYWRhIGRlIHVtIMOtY29uZS5cclxuICAgICAqIMOadGlsIHBhcmEgaW5kaWNhciBlcnJvcyBvdSBhbGVydGFzIHJlbGFjaW9uYWRvcyBhbyBjb250ZcO6ZG8gZG8gcGFpbmVsLlxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKVxyXG4gICAgcHVibGljIHZhbGlkYXRpb25NZXNzYWdlPzogc3RyaW5nO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIE1hbnTDqW0gbyBjb250ZcO6ZG8gZG8gcGFpbmVsIG5vIERPTSBtZXNtbyBxdWFuZG8gZmVjaGFkbyAobW9kbyBjYWNoZSkuXHJcbiAgICAgKiDDmnRpbCBwYXJhIHByZXNlcnZhciBvIGVzdGFkbyBkZSBjb21wb25lbnRlcyBpbnRlcm5vcyBhbyByZWFicmlyIG8gcGFpbmVsLlxyXG4gICAgICpcclxuICAgICAqIEBkZWZhdWx0IGZhbHNlXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpXHJcbiAgICBwdWJsaWMgY2FjaGUgPSBmYWxzZTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvbiBDbGFzc2UgZG8gw61jb25lIGV4aWJpZG8gYW8gbGFkbyBkYSBtZW5zYWdlbSBkZSB2YWxpZGHDp8Ojby5cclxuICAgICAqXHJcbiAgICAgKiBAZGVmYXVsdCAnZmFzIGZhLWV4Y2xhbWF0aW9uLWNpcmNsZSdcclxuICAgICAqL1xyXG4gICAgQElucHV0KCkgdmFsaWRhdGlvbk1lc3NhZ2VJY29uID0gJ2ZhcyBmYS1leGNsYW1hdGlvbi1jaXJjbGUnO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIENvciBkbyDDrWNvbmUgZGEgbWVuc2FnZW0gZGUgdmFsaWRhw6fDo28uXHJcbiAgICAgKlxyXG4gICAgICogQGRlZmF1bHQgJ1JlZCdcclxuICAgICAqL1xyXG4gICAgQElucHV0KCkgdmFsaWRhdGlvbk1lc3NhZ2VJY29uQ29sb3I6IFZhbGlkYXRpb25NZXNzYWdlSWNvbkNvbG9yID0gJ1JlZCc7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gRW1pdGlkbyBxdWFuZG8gbyBwYWluZWwgw6kgYWJlcnRvIHBlbG8gdXN1w6FyaW8uXHJcbiAgICAgKi9cclxuICAgIEBPdXRwdXQoKVxyXG4gICAgcHVibGljIHBhbmVsT3BlbmVkID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIEVtaXRpZG8gcXVhbmRvIG8gcGFpbmVsIMOpIGZlY2hhZG8gcGVsbyB1c3XDoXJpby5cclxuICAgICAqL1xyXG4gICAgQE91dHB1dCgpXHJcbiAgICBwdWJsaWMgcGFuZWxDbG9zZWQgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XHJcblxyXG4gICAgcHVibGljIGlzQW5pbWF0aW5nID0gZmFsc2U7XHJcbiAgICBwdWJsaWMgaXNDb250ZW50QW5pbWF0aW9uRGlzYWJsZWQgPSB0cnVlO1xyXG4gICAgcHVibGljIHJlYWRvbmx5IHBhbmVsSWQgPSBuZXh0UGFuZWxJZCsrO1xyXG5cclxuICAgIHByaXZhdGUgX2lzT3BlbiA9IGZhbHNlO1xyXG5cclxuICAgIHB1YmxpYyBnZXQgaXNPcGVuKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9pc09wZW47XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHNldCBpc09wZW4oaXNPcGVuOiBib29sZWFuKSB7XHJcbiAgICAgICAgdGhpcy5faXNPcGVuID0gaXNPcGVuO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKCdkaXNhYmxlZCcgaW4gY2hhbmdlcyAmJiB0aGlzLnN3aXRjaENvbnRyb2wpIHtcclxuICAgICAgICAgICAgaWYgKGNoYW5nZXNbJ2Rpc2FibGVkJ10uY3VycmVudFZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnN3aXRjaENvbnRyb2wuZGlzYWJsZSh7IGVtaXRFdmVudDogZmFsc2UgfSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnN3aXRjaENvbnRyb2wuZW5hYmxlKHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKCdzd2l0Y2gnIGluIGNoYW5nZXMgJiYgJ3N3aXRjaENvbnRyb2wnIGluIGNoYW5nZXMpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiWW91IGNhbid0IHNldCBzd2l0Y2ggYW5kIHN3aXRjaENvbnRyb2wgdG9nZXRoZXIuXCIpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xyXG4gICAgICAgIC8vIHRvIGV4ZWN1dGVkIGF0IGEgc2FmZSB0aW1lIHByaW9yIHRvIGNvbnRyb2wgcmV0dXJuaW5nIHRvIHRoZSBicm93c2VyJ3MgZXZlbnQgbG9vcFxyXG4gICAgICAgIHF1ZXVlTWljcm90YXNrKCgpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5pc0NvbnRlbnRBbmltYXRpb25EaXNhYmxlZCA9IGZhbHNlO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBvbkljb25CdXR0b25zQ2xpY2soZXZlbnQ6IEV2ZW50LCBjYWxsYmFjazogVm9pZEZ1bmN0aW9uKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuZGlzYWJsZWQpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICAgICAgY2FsbGJhY2soKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgb25UYWJDbGljaygpIHtcclxuICAgICAgICBpZiAodGhpcy5kaXNhYmxlZCB8fCB0aGlzLmlzQW5pbWF0aW5nKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5pc09wZW4gPSAhdGhpcy5pc09wZW47XHJcbiAgICAgICAgdGhpcy5fZW1pdFBhbmVsRXZlbnQoKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgb25IZWFkZXJLZXlkb3duKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XHJcbiAgICAgICAgaWYgKGV2ZW50LmtleSA9PT0gJ0VudGVyJyB8fCBldmVudC5rZXkgPT09ICcgJykge1xyXG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgICB0aGlzLm9uVGFiQ2xpY2soKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIG9uQ29udGVudEFuaW1hdGlvblN0YXJ0KCkge1xyXG4gICAgICAgIHRoaXMuaXNBbmltYXRpbmcgPSB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBvbkNvbnRlbnRBbmltYXRpb25Eb25lKCkge1xyXG4gICAgICAgIHRoaXMuaXNBbmltYXRpbmcgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgdGhpcy5fZW1pdFBhbmVsRXZlbnQoKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIF9lbWl0UGFuZWxFdmVudCgpIHtcclxuICAgICAgICBpZiAodGhpcy5pc09wZW4pIHtcclxuICAgICAgICAgICAgdGhpcy5wYW5lbE9wZW5lZC5lbWl0KCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5wYW5lbENsb3NlZC5lbWl0KCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XHJcbiIsIjxkaXZcbiAgICBjbGFzcz1cImFjY29yZGlvbi1wYW5lbCBib3JkZXItYiBib3JkZXItZ3JheXNjYWxlLTMwXCJcbiAgICBbY2xhc3MuYWNjb3JkaW9uLXBhbmVsLS1vcGVuXT1cImlzT3BlblwiXG4gICAgW2NsYXNzLmFjY29yZGlvbi1wYW5lbC0tZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxuPlxuICAgIDxkaXZcbiAgICAgICAgY2xhc3M9XCJoZWFkZXIgZmxleCBzZWxlY3Qtbm9uZSBpdGVtcy1jZW50ZXIganVzdGlmeS1iZXR3ZWVuIGJvcmRlci1ncmF5c2NhbGUtMzAgYmctZ3JheXNjYWxlLTAgcC00XCJcbiAgICAgICAgW2NsYXNzLmJnLWdyYXlzY2FsZS0xMF09XCJpc09wZW5cIlxuICAgICAgICBbY2xhc3MuYm9yZGVyLWJdPVwiaXNPcGVuXCJcbiAgICAgICAgW2NsYXNzLmN1cnNvci1wb2ludGVyXT1cIiFkaXNhYmxlZFwiXG4gICAgICAgIFtjbGFzcy5jdXJzb3ItYXV0b109XCJkaXNhYmxlZFwiXG4gICAgPlxuICAgICAgICA8ZGl2XG4gICAgICAgICAgICBjbGFzcz1cImhlYWRlcl9fdHJpZ2dlciBmbGV4IGl0ZW1zLWNlbnRlciBmbGV4LTEgZmxleC1ub3dyYXAgZm9jdXMtdmlzaWJsZTpvdXRsaW5lIGZvY3VzLXZpc2libGU6b3V0bGluZS0yIGZvY3VzLXZpc2libGU6b3V0bGluZS1wcmltYXJ5IGZvY3VzLXZpc2libGU6W291dGxpbmUtb2Zmc2V0Oi0ycHhdXCJcbiAgICAgICAgICAgIFtjbGFzcy5jdXJzb3ItcG9pbnRlcl09XCIhZGlzYWJsZWRcIlxuICAgICAgICAgICAgW2NsYXNzLmN1cnNvci1hdXRvXT1cImRpc2FibGVkXCJcbiAgICAgICAgICAgIHJvbGU9XCJidXR0b25cIlxuICAgICAgICAgICAgW3RhYmluZGV4XT1cImRpc2FibGVkID8gLTEgOiAwXCJcbiAgICAgICAgICAgIFthdHRyLmFyaWEtZXhwYW5kZWRdPVwiaXNPcGVuXCJcbiAgICAgICAgICAgIFthdHRyLmFyaWEtY29udHJvbHNdPVwiJ2FjY29yZGlvbi1wYW5lbC1jb250ZW50LScgKyBwYW5lbElkXCJcbiAgICAgICAgICAgIFthdHRyLmFyaWEtZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxuICAgICAgICAgICAgKGNsaWNrKT1cIm9uVGFiQ2xpY2soKVwiXG4gICAgICAgICAgICAoa2V5ZG93bik9XCJvbkhlYWRlcktleWRvd24oJGV2ZW50KVwiXG4gICAgICAgID5cbiAgICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJpY29uIGZhcyB0ZXh0LWJhc2UgbXItM1wiXG4gICAgICAgICAgICAgICAgW2NsYXNzLmZhLW1pbnVzXT1cImlzT3BlblwiXG4gICAgICAgICAgICAgICAgW2NsYXNzLmZhLXBsdXNdPVwiIWlzT3BlblwiXG4gICAgICAgICAgICAgICAgW2NsYXNzLnRleHQtZ3JheXNjYWxlLTkwXT1cIiFkaXNhYmxlZFwiXG4gICAgICAgICAgICAgICAgW2NsYXNzLnRleHQtZ3JheXNjYWxlLTMwXT1cImRpc2FibGVkXCJcbiAgICAgICAgICAgICAgICBhcmlhLWhpZGRlbj1cInRydWVcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgQGlmICh2YWxpZGF0aW9uTWVzc2FnZSkge1xuICAgICAgICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZXhjbGFtYXRpb24taWNvbiB0ZXh0LWJhc2UgbXItM1wiXG4gICAgICAgICAgICAgICAgICAgIFtjbGFzc109XCJ2YWxpZGF0aW9uTWVzc2FnZUljb25cIlxuICAgICAgICAgICAgICAgICAgICBbc1Rvb2x0aXBdPVwidmFsaWRhdGlvbk1lc3NhZ2VcIlxuICAgICAgICAgICAgICAgICAgICBbY2xhc3MuZXhjbGFtYXRpb24taWNvbi1yZWRdPVwidmFsaWRhdGlvbk1lc3NhZ2VJY29uQ29sb3IgPT09ICdSZWQnXCJcbiAgICAgICAgICAgICAgICAgICAgW2NsYXNzLnRleHQtY3JpdGljYWxpdHktcmVkXT1cInZhbGlkYXRpb25NZXNzYWdlSWNvbkNvbG9yID09PSAnUmVkJ1wiXG4gICAgICAgICAgICAgICAgICAgIFtjbGFzcy5leGNsYW1hdGlvbi1pY29uLW9yYW5nZV09XCJ2YWxpZGF0aW9uTWVzc2FnZUljb25Db2xvciA9PT0gJ09yYW5nZSdcIlxuICAgICAgICAgICAgICAgICAgICBbY2xhc3MudGV4dC1jcml0aWNhbGl0eS1vcmFuZ2VdPVwidmFsaWRhdGlvbk1lc3NhZ2VJY29uQ29sb3IgPT09ICdPcmFuZ2UnXCJcbiAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmV4Y2xhbWF0aW9uLWljb24teWVsbG93XT1cInZhbGlkYXRpb25NZXNzYWdlSWNvbkNvbG9yID09PSAnWWVsbG93J1wiXG4gICAgICAgICAgICAgICAgICAgIFtjbGFzcy50ZXh0LWNyaXRpY2FsaXR5LXllbGxvd109XCJ2YWxpZGF0aW9uTWVzc2FnZUljb25Db2xvciA9PT0gJ1llbGxvdydcIlxuICAgICAgICAgICAgICAgICAgICBbY2xhc3MuZXhjbGFtYXRpb24taWNvbi1ncmVlbl09XCJ2YWxpZGF0aW9uTWVzc2FnZUljb25Db2xvciA9PT0gJ0dyZWVuJ1wiXG4gICAgICAgICAgICAgICAgICAgIFtjbGFzcy50ZXh0LWNyaXRpY2FsaXR5LWdyZWVuXT1cInZhbGlkYXRpb25NZXNzYWdlSWNvbkNvbG9yID09PSAnR3JlZW4nXCJcbiAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmV4Y2xhbWF0aW9uLWljb24tYmx1ZV09XCJ2YWxpZGF0aW9uTWVzc2FnZUljb25Db2xvciA9PT0gJ0JsdWUnXCJcbiAgICAgICAgICAgICAgICAgICAgW2NsYXNzLnRleHQtcHJpbWFyeV09XCJ2YWxpZGF0aW9uTWVzc2FnZUljb25Db2xvciA9PT0gJ0JsdWUnXCJcbiAgICAgICAgICAgICAgICAgICAgW2NsYXNzLm9wYWNpdHktNTBdPVwiZGlzYWJsZWRcIlxuICAgICAgICAgICAgICAgICAgICBhcmlhLWhpZGRlbj1cInRydWVcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgICAgIGNsYXNzPVwidGl0bGUgZm9udC1vcGVuLXNhbnMgdGV4dC1zbSBmb250LWJvbGQgdXBwZXJjYXNlIGxlYWRpbmctbm9ybWFsXCJcbiAgICAgICAgICAgICAgICBbY2xhc3MudGV4dC1ncmF5c2NhbGUtMzBdPVwiZGlzYWJsZWRcIlxuICAgICAgICAgICAgICAgIFtpZF09XCInYWNjb3JkaW9uLXBhbmVsLWhlYWRlci0nICsgcGFuZWxJZFwiXG4gICAgICAgICAgICAgICAgPnt7IGhlYWRlciB9fTwvc3BhblxuICAgICAgICAgICAgPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImhlYWRlcl9fY29udHJvbHMgZmxleCBpdGVtcy1jZW50ZXIgbWwtNFwiPlxuICAgICAgICAgICAgQGlmIChiYWRnZUNvbmZpZykge1xuICAgICAgICAgICAgICAgIDxzLWJhZGdlXG4gICAgICAgICAgICAgICAgICAgIFtjb2xvcl09XCJiYWRnZUNvbmZpZy5jb2xvclwiXG4gICAgICAgICAgICAgICAgICAgIFt0ZXh0XT1cImJhZGdlQ29uZmlnLnRleHRcIlxuICAgICAgICAgICAgICAgID48L3MtYmFkZ2U+XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIEBmb3IgKGJ1dHRvbiBvZiBidXR0b25zOyB0cmFjayBidXR0b24uaWNvbikge1xuICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJpY29uLWJ1dHRvbiB0ZXh0LWJhc2UgbWwtMyBwLTEgYm9yZGVyLTAgYmctdHJhbnNwYXJlbnRcIlxuICAgICAgICAgICAgICAgICAgICBbY2xhc3MudGV4dC1ncmF5c2NhbGUtOTBdPVwiIWRpc2FibGVkXCJcbiAgICAgICAgICAgICAgICAgICAgW2NsYXNzLnRleHQtZ3JheXNjYWxlLTMwXT1cImRpc2FibGVkXCJcbiAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmN1cnNvci1wb2ludGVyXT1cIiFkaXNhYmxlZFwiXG4gICAgICAgICAgICAgICAgICAgIFtjbGFzcy5jdXJzb3ItYXV0b109XCJkaXNhYmxlZFwiXG4gICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cImJ1dHRvbi5pY29uXCJcbiAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJidXR0b24ubGFiZWxcIlxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwib25JY29uQnV0dG9uc0NsaWNrKCRldmVudCwgYnV0dG9uLm9uQ2xpY2spXCJcbiAgICAgICAgICAgICAgICA+PC9idXR0b24+XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIEBpZiAoc3dpdGNoQ29udHJvbCkge1xuICAgICAgICAgICAgICAgIDxzLXN3aXRjaFxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInN3aXRjaCBwbC00XCJcbiAgICAgICAgICAgICAgICAgICAgW2Zvcm1Db250cm9sXT1cInN3aXRjaENvbnRyb2xcIlxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPC9zLXN3aXRjaD5cbiAgICAgICAgICAgIH1cbiAgICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgICBAaWYgKGNhY2hlKSB7XG4gICAgICAgIDxkaXZcbiAgICAgICAgICAgIGNsYXNzPVwiY29udGVudCBiZy1ncmF5c2NhbGUtMCBvdmVyZmxvdy1oaWRkZW5cIlxuICAgICAgICAgICAgcm9sZT1cInJlZ2lvblwiXG4gICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsbGVkYnldPVwiJ2FjY29yZGlvbi1wYW5lbC1oZWFkZXItJyArIHBhbmVsSWRcIlxuICAgICAgICAgICAgW2lkXT1cIidhY2NvcmRpb24tcGFuZWwtY29udGVudC0nICsgcGFuZWxJZFwiXG4gICAgICAgICAgICBbQGNhY2hlQW5pbWF0aW9uXT1cImlzT3BlblwiXG4gICAgICAgICAgICBbQC5kaXNhYmxlZF09XCJpc0NvbnRlbnRBbmltYXRpb25EaXNhYmxlZFwiXG4gICAgICAgICAgICAoQGNhY2hlQW5pbWF0aW9uLnN0YXJ0KT1cIm9uQ29udGVudEFuaW1hdGlvblN0YXJ0KClcIlxuICAgICAgICAgICAgKEBjYWNoZUFuaW1hdGlvbi5kb25lKT1cIm9uQ29udGVudEFuaW1hdGlvbkRvbmUoKVwiXG4gICAgICAgID5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb250ZW50LWNvbnRhaW5lciBtLTVcIj5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyIFtuZ1RlbXBsYXRlT3V0bGV0XT1cInBhbmVsQ29udGVudFwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgIH0gQGVsc2Uge1xuICAgICAgICBAaWYgKGlzT3Blbikge1xuICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgIGNsYXNzPVwiY29udGVudCBiZy1ncmF5c2NhbGUtMCBvdmVyZmxvdy1oaWRkZW5cIlxuICAgICAgICAgICAgICAgIHJvbGU9XCJyZWdpb25cIlxuICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxsZWRieV09XCInYWNjb3JkaW9uLXBhbmVsLWhlYWRlci0nICsgcGFuZWxJZFwiXG4gICAgICAgICAgICAgICAgW2lkXT1cIidhY2NvcmRpb24tcGFuZWwtY29udGVudC0nICsgcGFuZWxJZFwiXG4gICAgICAgICAgICAgICAgQGNhY2hlbGVzc0FuaW1hdGlvblxuICAgICAgICAgICAgICAgIFtALmRpc2FibGVkXT1cImlzQ29udGVudEFuaW1hdGlvbkRpc2FibGVkXCJcbiAgICAgICAgICAgICAgICAoQGNhY2hlbGVzc0FuaW1hdGlvbi5zdGFydCk9XCJvbkNvbnRlbnRBbmltYXRpb25TdGFydCgpXCJcbiAgICAgICAgICAgICAgICAoQGNhY2hlbGVzc0FuaW1hdGlvbi5kb25lKT1cIm9uQ29udGVudEFuaW1hdGlvbkRvbmUoKVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbnRlbnQtY29udGFpbmVyIG0tNVwiPlxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyIFtuZ1RlbXBsYXRlT3V0bGV0XT1cInBhbmVsQ29udGVudFwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIH1cbiAgICB9XG48L2Rpdj5cblxuPG5nLXRlbXBsYXRlICNwYW5lbENvbnRlbnQ+XG4gICAgPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PlxuPC9uZy10ZW1wbGF0ZT5cbiJdfQ==
209
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWNjb3JkaW9uLXBhbmVsLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2FuZ3VsYXItY29tcG9uZW50cy9hY2NvcmRpb24vc3JjL2xpYi9hY2NvcmRpb24vY29tcG9uZW50cy9hY2NvcmRpb24tcGFuZWwvYWNjb3JkaW9uLXBhbmVsLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2FuZ3VsYXItY29tcG9uZW50cy9hY2NvcmRpb24vc3JjL2xpYi9hY2NvcmRpb24vY29tcG9uZW50cy9hY2NvcmRpb24tcGFuZWwvYWNjb3JkaW9uLXBhbmVsLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBaUIsU0FBUyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQWEsTUFBTSxFQUFpQixNQUFNLGVBQWUsQ0FBQztBQUNoSCxPQUFPLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBRWpGLE9BQU8sRUFBc0IsV0FBVyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFdEYsT0FBTyxFQUFlLGNBQWMsRUFBRSxNQUFNLDBDQUEwQyxDQUFDO0FBQ3ZGLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDRDQUE0QyxDQUFDO0FBQzlFLE9BQU8sRUFBRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUM1RCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sMkNBQTJDLENBQUM7OztBQUU1RSxJQUFJLFdBQVcsR0FBRyxDQUFDLENBQUM7QUFFcEI7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBaUJHO0FBMEJILE1BQU0sT0FBTyx1QkFBdUI7SUFDaEM7O09BRUc7SUFFSSxNQUFNLENBQVU7SUFFdkI7OztPQUdHO0lBRUks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Z0JBVUMsS0FBSztzQkFEWCxLQUFLO2dCQVFHLHFCQUFxQjtzQkFBN0IsS0FBSztnQkFPRywwQkFBMEI7c0JBQWxDLEtBQUs7Z0JBTUMsV0FBVztzQkFEakIsTUFBTTtnQkFPQSxXQUFXO3NCQURqQixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQWZ0ZXJWaWV3SW5pdCwgQ29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIElucHV0LCBPbkNoYW5nZXMsIE91dHB1dCwgU2ltcGxlQ2hhbmdlcyB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyB0cmlnZ2VyLCBzdHlsZSwgYW5pbWF0ZSwgdHJhbnNpdGlvbiwgc3RhdGUgfSBmcm9tICdAYW5ndWxhci9hbmltYXRpb25zJztcclxuXHJcbmltcG9ydCB7IFVudHlwZWRGb3JtQ29udHJvbCwgRm9ybXNNb2R1bGUsIFJlYWN0aXZlRm9ybXNNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcbmltcG9ydCB7IEFjY29yZGlvbkJ1dHRvblNldHRpbmdzLCBWYWxpZGF0aW9uTWVzc2FnZUljb25Db2xvciB9IGZyb20gJy4uLy4uL21vZGVscy9hY2NvcmRpb24tYnV0dG9uLXNldHRpbmdzJztcclxuaW1wb3J0IHsgQmFkZ2VDb2xvcnMsIEJhZGdlQ29tcG9uZW50IH0gZnJvbSAnQHNlbmlvcnNpc3RlbWFzL2FuZ3VsYXItY29tcG9uZW50cy9iYWRnZSc7XHJcbmltcG9ydCB7IFRvb2x0aXBEaXJlY3RpdmUgfSBmcm9tICdAc2VuaW9yc2lzdGVtYXMvYW5ndWxhci1jb21wb25lbnRzL3Rvb2x0aXAnO1xyXG5pbXBvcnQgeyBOZ0NsYXNzLCBOZ1RlbXBsYXRlT3V0bGV0IH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcclxuaW1wb3J0IHsgU3dpdGNoQ29tcG9uZW50IH0gZnJvbSAnQHNlbmlvcnNpc3RlbWFzL2FuZ3VsYXItY29tcG9uZW50cy9zd2l0Y2gnO1xyXG5cclxubGV0IG5leHRQYW5lbElkID0gMDtcclxuXHJcbi8qKlxyXG4gKiBAZGVzY3JpcHRpb24gUGFpbmVsIGluZGl2aWR1YWwgZG8ge0BsaW5rIEFjY29yZGlvbkNvbXBvbmVudH0uIEdlcmVuY2lhIG8gZXN0YWRvIGRlXHJcbiAqIGFiZXJ0dXJhL2ZlY2hhbWVudG8gY29tIGFuaW1hw6fDo28sIHBvZGVuZG8gY29udGVyIHVtIHN3aXRjaCBkZSBjb250cm9sZSB2aWEgYHN3aXRjaENvbnRyb2xgLFxyXG4gKiBib3TDtWVzIGRlIGHDp8OjbyBjb25maWd1csOhdmVpcyBlIHVtYSBtZW5zYWdlbSBkZSB2YWxpZGHDp8OjbyBjb20gw61jb25lLlxyXG4gKlxyXG4gKiBAZXhhbXBsZVxyXG4gKiBgYGBodG1sXHJcbiAqIDxzLWFjY29yZGlvbi1wYW5lbFxyXG4gKiAgIGhlYWRlcj1cIkNvbmZpZ3VyYcOnw7Vlc1wiXHJcbiAqICAgW2Rpc2FibGVkXT1cImZhbHNlXCJcclxuICogICAocGFuZWxPcGVuZWQpPVwib25PcGVuKClcIlxyXG4gKiAgIChwYW5lbENsb3NlZCk9XCJvbkNsb3NlKClcIj5cclxuICogICA8cD5Db250ZcO6ZG8gZG8gcGFpbmVsPC9wPlxyXG4gKiA8L3MtYWNjb3JkaW9uLXBhbmVsPlxyXG4gKiBgYGBcclxuICpcclxuICogQGNhdGVnb3J5IElucHV0c1xyXG4gKi9cclxuQENvbXBvbmVudCh7XHJcbiAgICBzZWxlY3RvcjogJ3MtYWNjb3JkaW9uLXBhbmVsJyxcclxuICAgIHRlbXBsYXRlVXJsOiAnLi9hY2NvcmRpb24tcGFuZWwuY29tcG9uZW50Lmh0bWwnLFxyXG4gICAgYW5pbWF0aW9uczogW1xyXG4gICAgICAgIHRyaWdnZXIoJ2NhY2hlbGVzc0FuaW1hdGlvbicsIFtcclxuICAgICAgICAgICAgdHJhbnNpdGlvbignOmVudGVyJywgW3N0eWxlKHsgaGVpZ2h0OiAnMCcgfSksIGFuaW1hdGUoJzIwMG1zIGxpbmVhcicsIHN0eWxlKHsgaGVpZ2h0OiAnKicgfSkpXSksXHJcbiAgICAgICAgICAgIHRyYW5zaXRpb24oJzpsZWF2ZScsIFtzdHlsZSh7IGhlaWdodDogJyonIH0pLCBhbmltYXRlKCcyMDBtcyBsaW5lYXInLCBzdHlsZSh7IGhlaWdodDogJzAnIH0pKV0pLFxyXG4gICAgICAgIF0pLFxyXG4gICAgICAgIHRyaWdnZXIoJ2NhY2hlQW5pbWF0aW9uJywgW1xyXG4gICAgICAgICAgICBzdGF0ZSgndHJ1ZScsIHN0eWxlKHsgaGVpZ2h0OiAnKicgfSkpLFxyXG4gICAgICAgICAgICBzdGF0ZSgnZmFsc2UnLCBzdHlsZSh7IGhlaWdodDogJzBweCcgfSkpLFxyXG4gICAgICAgICAgICB0cmFuc2l0aW9uKCcqID0+IConLCBhbmltYXRlKCcyMDBtcycpKSxcclxuICAgICAgICBdKSxcclxuICAgIF0sXHJcbiAgICBzdGFuZGFsb25lOiB0cnVlLFxyXG4gICAgaW1wb3J0czogW1xyXG4gICAgICAgIFRvb2x0aXBEaXJlY3RpdmUsXHJcbiAgICAgICAgQmFkZ2VDb21wb25lbnQsXHJcbiAgICAgICAgTmdDbGFzcyxcclxuICAgICAgICBTd2l0Y2hDb21wb25lbnQsXHJcbiAgICAgICAgRm9ybXNNb2R1bGUsXHJcbiAgICAgICAgUmVhY3RpdmVGb3Jtc01vZHVsZSxcclxuICAgICAgICBOZ1RlbXBsYXRlT3V0bGV0LFxyXG4gICAgXSxcclxufSlcclxuZXhwb3J0IGNsYXNzIEFjY29yZGlvblBhbmVsQ29tcG9uZW50IGltcGxlbWVudHMgT25DaGFuZ2VzLCBBZnRlclZpZXdJbml0IHtcclxuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIFTDrXR1bG8gZXhpYmlkbyBubyBjYWJlw6dhbGhvIGRvIHBhaW5lbC4gQ2FtcG8gb2JyaWdhdMOzcmlvLlxyXG4gICAgICovXHJcbiAgICBASW5wdXQoeyByZXF1aXJlZDogdHJ1ZSB9KVxyXG4gICAgcHVibGljIGhlYWRlciE6IHN0cmluZztcclxuXHJcbiAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvbiBDcmlhIHVtIGNvbXBvbmVudGUgQmFkZ2UgYW8gbGFkbyBkb3MgYm90w7VlcyBkZSBhw6fDo28gbm8gY2FiZcOnYWxobyBkbyBwYWluZWwuXHJcbiAgICAgKiBPIG9iamV0byBkZSBjb25maWd1cmHDp8OjbyBkZXZlIGNvbnRlciBvIHRleHRvIGUgYSBjb3IgZG8gYmFkZ2UuXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpXHJcbiAgICBwdWJsaWMgYmFkZ2VDb25maWc/OiB7IHRleHQ6IHN0cmluZzsgY29sb3I6IEJhZGdlQ29sb3JzIH07XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gTGlzdGEgZGUgYm90w7VlcyBkZSBhw6fDo28gZXhpYmlkb3Mgbm8gY2FiZcOnYWxobyBkbyBwYWluZWwsXHJcbiAgICAgKiDDoCBkaXJlaXRhIGRvIHTDrXR1bG8uIENhZGEgaXRlbSBkZWZpbmUgw61jb25lLCB0b29sdGlwIGUgY2FsbGJhY2sgZGUgY2xpcXVlLlxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKVxyXG4gICAgcHVibGljIGJ1dHRvbnM/OiBBY2NvcmRpb25CdXR0b25TZXR0aW5nc1tdO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIERlc2FiaWxpdGEgYSBpbnRlcmHDp8OjbyBkbyB1c3XDoXJpbyBjb20gbyBwYWluZWwsIGltcGVkaW5kbyBhYmVydHVyYSBlIGZlY2hhbWVudG8uXHJcbiAgICAgKlxyXG4gICAgICogQGRlZmF1bHQgZmFsc2VcclxuICAgICAqL1xyXG4gICAgQElucHV0KClcclxuICAgIHB1YmxpYyBkaXNhYmxlZCA9IGZhbHNlO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIGBGb3JtQ29udHJvbGAgdmluY3VsYWRvIGEgdW0gc3dpdGNoIGV4aWJpZG8gbm8gY2FiZcOnYWxobyBkbyBwYWluZWwuXHJcbiAgICAgKiBQZXJtaXRlIGhhYmlsaXRhci9kZXNhYmlsaXRhciBvIGNvbnRlw7pkbyBkbyBwYWluZWwgdmlhIHRvZ2dsZS5cclxuICAgICAqL1xyXG4gICAgQElucHV0KClcclxuICAgIHB1YmxpYyBzd2l0Y2hDb250cm9sPzogVW50eXBlZEZvcm1Db250cm9sO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIE1lbnNhZ2VtIGRlIHZhbGlkYcOnw6NvIGV4aWJpZGEgYWJhaXhvIGRvIGNhYmXDp2FsaG8sIGFjb21wYW5oYWRhIGRlIHVtIMOtY29uZS5cclxuICAgICAqIMOadGlsIHBhcmEgaW5kaWNhciBlcnJvcyBvdSBhbGVydGFzIHJlbGFjaW9uYWRvcyBhbyBjb250ZcO6ZG8gZG8gcGFpbmVsLlxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKVxyXG4gICAgcHVibGljIHZhbGlkYXRpb25NZXNzYWdlPzogc3RyaW5nO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIE1hbnTDqW0gbyBjb250ZcO6ZG8gZG8gcGFpbmVsIG5vIERPTSBtZXNtbyBxdWFuZG8gZmVjaGFkbyAobW9kbyBjYWNoZSkuXHJcbiAgICAgKiDDmnRpbCBwYXJhIHByZXNlcnZhciBvIGVzdGFkbyBkZSBjb21wb25lbnRlcyBpbnRlcm5vcyBhbyByZWFicmlyIG8gcGFpbmVsLlxyXG4gICAgICpcclxuICAgICAqIEBkZWZhdWx0IGZhbHNlXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpXHJcbiAgICBwdWJsaWMgY2FjaGUgPSBmYWxzZTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvbiBDbGFzc2UgZG8gw61jb25lIGV4aWJpZG8gYW8gbGFkbyBkYSBtZW5zYWdlbSBkZSB2YWxpZGHDp8Ojby5cclxuICAgICAqXHJcbiAgICAgKiBAZGVmYXVsdCAnZmFzIGZhLWV4Y2xhbWF0aW9uLWNpcmNsZSdcclxuICAgICAqL1xyXG4gICAgQElucHV0KCkgdmFsaWRhdGlvbk1lc3NhZ2VJY29uID0gJ2ZhcyBmYS1leGNsYW1hdGlvbi1jaXJjbGUnO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIENvciBkbyDDrWNvbmUgZGEgbWVuc2FnZW0gZGUgdmFsaWRhw6fDo28uXHJcbiAgICAgKlxyXG4gICAgICogQGRlZmF1bHQgJ1JlZCdcclxuICAgICAqL1xyXG4gICAgQElucHV0KCkgdmFsaWRhdGlvbk1lc3NhZ2VJY29uQ29sb3I6IFZhbGlkYXRpb25NZXNzYWdlSWNvbkNvbG9yID0gJ1JlZCc7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gRW1pdGlkbyBxdWFuZG8gbyBwYWluZWwgw6kgYWJlcnRvIHBlbG8gdXN1w6FyaW8uXHJcbiAgICAgKi9cclxuICAgIEBPdXRwdXQoKVxyXG4gICAgcHVibGljIHBhbmVsT3BlbmVkID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIEVtaXRpZG8gcXVhbmRvIG8gcGFpbmVsIMOpIGZlY2hhZG8gcGVsbyB1c3XDoXJpby5cclxuICAgICAqL1xyXG4gICAgQE91dHB1dCgpXHJcbiAgICBwdWJsaWMgcGFuZWxDbG9zZWQgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XHJcblxyXG4gICAgcHVibGljIGlzQW5pbWF0aW5nID0gZmFsc2U7XHJcbiAgICBwdWJsaWMgaXNDb250ZW50QW5pbWF0aW9uRGlzYWJsZWQgPSB0cnVlO1xyXG4gICAgcHVibGljIHJlYWRvbmx5IHBhbmVsSWQgPSBuZXh0UGFuZWxJZCsrO1xyXG5cclxuICAgIHByaXZhdGUgX2lzT3BlbiA9IGZhbHNlO1xyXG5cclxuICAgIHB1YmxpYyBnZXQgaXNPcGVuKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9pc09wZW47XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHNldCBpc09wZW4oaXNPcGVuOiBib29sZWFuKSB7XHJcbiAgICAgICAgdGhpcy5faXNPcGVuID0gaXNPcGVuO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKCdkaXNhYmxlZCcgaW4gY2hhbmdlcyAmJiB0aGlzLnN3aXRjaENvbnRyb2wpIHtcclxuICAgICAgICAgICAgaWYgKGNoYW5nZXNbJ2Rpc2FibGVkJ10uY3VycmVudFZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnN3aXRjaENvbnRyb2wuZGlzYWJsZSh7IGVtaXRFdmVudDogZmFsc2UgfSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnN3aXRjaENvbnRyb2wuZW5hYmxlKHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKCdzd2l0Y2gnIGluIGNoYW5nZXMgJiYgJ3N3aXRjaENvbnRyb2wnIGluIGNoYW5nZXMpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiWW91IGNhbid0IHNldCBzd2l0Y2ggYW5kIHN3aXRjaENvbnRyb2wgdG9nZXRoZXIuXCIpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xyXG4gICAgICAgIC8vIHRvIGV4ZWN1dGVkIGF0IGEgc2FmZSB0aW1lIHByaW9yIHRvIGNvbnRyb2wgcmV0dXJuaW5nIHRvIHRoZSBicm93c2VyJ3MgZXZlbnQgbG9vcFxyXG4gICAgICAgIHF1ZXVlTWljcm90YXNrKCgpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5pc0NvbnRlbnRBbmltYXRpb25EaXNhYmxlZCA9IGZhbHNlO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBvbkljb25CdXR0b25zQ2xpY2soZXZlbnQ6IEV2ZW50LCBjYWxsYmFjazogVm9pZEZ1bmN0aW9uKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuZGlzYWJsZWQpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICAgICAgY2FsbGJhY2soKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgb25UYWJDbGljaygpIHtcclxuICAgICAgICBpZiAodGhpcy5kaXNhYmxlZCB8fCB0aGlzLmlzQW5pbWF0aW5nKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5pc09wZW4gPSAhdGhpcy5pc09wZW47XHJcbiAgICAgICAgdGhpcy5fZW1pdFBhbmVsRXZlbnQoKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgb25IZWFkZXJLZXlkb3duKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XHJcbiAgICAgICAgaWYgKGV2ZW50LmtleSA9PT0gJ0VudGVyJyB8fCBldmVudC5rZXkgPT09ICcgJykge1xyXG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgICB0aGlzLm9uVGFiQ2xpY2soKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIG9uQ29udGVudEFuaW1hdGlvblN0YXJ0KCkge1xyXG4gICAgICAgIHRoaXMuaXNBbmltYXRpbmcgPSB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBvbkNvbnRlbnRBbmltYXRpb25Eb25lKCkge1xyXG4gICAgICAgIHRoaXMuaXNBbmltYXRpbmcgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgdGhpcy5fZW1pdFBhbmVsRXZlbnQoKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIF9lbWl0UGFuZWxFdmVudCgpIHtcclxuICAgICAgICBpZiAodGhpcy5pc09wZW4pIHtcclxuICAgICAgICAgICAgdGhpcy5wYW5lbE9wZW5lZC5lbWl0KCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5wYW5lbENsb3NlZC5lbWl0KCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XHJcbiIsIjxkaXZcbiAgICBjbGFzcz1cImFjY29yZGlvbi1wYW5lbCBib3JkZXItYiBib3JkZXItZ3JheXNjYWxlLTMwXCJcbiAgICBbY2xhc3MuYWNjb3JkaW9uLXBhbmVsLS1vcGVuXT1cImlzT3BlblwiXG4gICAgW2NsYXNzLmFjY29yZGlvbi1wYW5lbC0tZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxuPlxuICAgIDxkaXZcbiAgICAgICAgY2xhc3M9XCJoZWFkZXIgZmxleCBzZWxlY3Qtbm9uZSBpdGVtcy1jZW50ZXIganVzdGlmeS1iZXR3ZWVuIGJvcmRlci1ncmF5c2NhbGUtMzAgYmctZ3JheXNjYWxlLTAgcC00XCJcbiAgICAgICAgW2NsYXNzLmJnLWdyYXlzY2FsZS0xMF09XCJpc09wZW5cIlxuICAgICAgICBbY2xhc3MuYm9yZGVyLWJdPVwiaXNPcGVuXCJcbiAgICAgICAgW2NsYXNzLmN1cnNvci1wb2ludGVyXT1cIiFkaXNhYmxlZFwiXG4gICAgICAgIFtjbGFzcy5jdXJzb3ItYXV0b109XCJkaXNhYmxlZFwiXG4gICAgPlxuICAgICAgICA8ZGl2XG4gICAgICAgICAgICBjbGFzcz1cImhlYWRlcl9fdHJpZ2dlciBmbGV4IGl0ZW1zLWNlbnRlciBmbGV4LTEgZmxleC1ub3dyYXAgZm9jdXMtdmlzaWJsZTpvdXRsaW5lIGZvY3VzLXZpc2libGU6b3V0bGluZS0yIGZvY3VzLXZpc2libGU6b3V0bGluZS1bdmFyKC0tcy1mb2N1cy1yaW5nLWNvbG9yLCMwMDkwZmYpXSBmb2N1cy12aXNpYmxlOltvdXRsaW5lLW9mZnNldDotMnB4XVwiXG4gICAgICAgICAgICBbY2xhc3MuY3Vyc29yLXBvaW50ZXJdPVwiIWRpc2FibGVkXCJcbiAgICAgICAgICAgIFtjbGFzcy5jdXJzb3ItYXV0b109XCJkaXNhYmxlZFwiXG4gICAgICAgICAgICByb2xlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgIFt0YWJpbmRleF09XCJkaXNhYmxlZCA/IC0xIDogMFwiXG4gICAgICAgICAgICBbYXR0ci5hcmlhLWV4cGFuZGVkXT1cImlzT3BlblwiXG4gICAgICAgICAgICBbYXR0ci5hcmlhLWNvbnRyb2xzXT1cIidhY2NvcmRpb24tcGFuZWwtY29udGVudC0nICsgcGFuZWxJZFwiXG4gICAgICAgICAgICBbYXR0ci5hcmlhLWRpc2FibGVkXT1cImRpc2FibGVkXCJcbiAgICAgICAgICAgIChjbGljayk9XCJvblRhYkNsaWNrKClcIlxuICAgICAgICAgICAgKGtleWRvd24pPVwib25IZWFkZXJLZXlkb3duKCRldmVudClcIlxuICAgICAgICA+XG4gICAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgICAgIGNsYXNzPVwiaWNvbiBmYXMgdGV4dC1iYXNlIG1yLTNcIlxuICAgICAgICAgICAgICAgIFtjbGFzcy5mYS1taW51c109XCJpc09wZW5cIlxuICAgICAgICAgICAgICAgIFtjbGFzcy5mYS1wbHVzXT1cIiFpc09wZW5cIlxuICAgICAgICAgICAgICAgIFtjbGFzcy50ZXh0LWdyYXlzY2FsZS05MF09XCIhZGlzYWJsZWRcIlxuICAgICAgICAgICAgICAgIFtjbGFzcy50ZXh0LWdyYXlzY2FsZS0zMF09XCJkaXNhYmxlZFwiXG4gICAgICAgICAgICAgICAgYXJpYS1oaWRkZW49XCJ0cnVlXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgIEBpZiAodmFsaWRhdGlvbk1lc3NhZ2UpIHtcbiAgICAgICAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImV4Y2xhbWF0aW9uLWljb24gdGV4dC1iYXNlIG1yLTNcIlxuICAgICAgICAgICAgICAgICAgICBbY2xhc3NdPVwidmFsaWRhdGlvbk1lc3NhZ2VJY29uXCJcbiAgICAgICAgICAgICAgICAgICAgW3NUb29sdGlwXT1cInZhbGlkYXRpb25NZXNzYWdlXCJcbiAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmV4Y2xhbWF0aW9uLWljb24tcmVkXT1cInZhbGlkYXRpb25NZXNzYWdlSWNvbkNvbG9yID09PSAnUmVkJ1wiXG4gICAgICAgICAgICAgICAgICAgIFtjbGFzcy50ZXh0LWNyaXRpY2FsaXR5LXJlZF09XCJ2YWxpZGF0aW9uTWVzc2FnZUljb25Db2xvciA9PT0gJ1JlZCdcIlxuICAgICAgICAgICAgICAgICAgICBbY2xhc3MuZXhjbGFtYXRpb24taWNvbi1vcmFuZ2VdPVwidmFsaWRhdGlvbk1lc3NhZ2VJY29uQ29sb3IgPT09ICdPcmFuZ2UnXCJcbiAgICAgICAgICAgICAgICAgICAgW2NsYXNzLnRleHQtY3JpdGljYWxpdHktb3JhbmdlXT1cInZhbGlkYXRpb25NZXNzYWdlSWNvbkNvbG9yID09PSAnT3JhbmdlJ1wiXG4gICAgICAgICAgICAgICAgICAgIFtjbGFzcy5leGNsYW1hdGlvbi1pY29uLXllbGxvd109XCJ2YWxpZGF0aW9uTWVzc2FnZUljb25Db2xvciA9PT0gJ1llbGxvdydcIlxuICAgICAgICAgICAgICAgICAgICBbY2xhc3MudGV4dC1jcml0aWNhbGl0eS15ZWxsb3ddPVwidmFsaWRhdGlvbk1lc3NhZ2VJY29uQ29sb3IgPT09ICdZZWxsb3cnXCJcbiAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmV4Y2xhbWF0aW9uLWljb24tZ3JlZW5dPVwidmFsaWRhdGlvbk1lc3NhZ2VJY29uQ29sb3IgPT09ICdHcmVlbidcIlxuICAgICAgICAgICAgICAgICAgICBbY2xhc3MudGV4dC1jcml0aWNhbGl0eS1ncmVlbl09XCJ2YWxpZGF0aW9uTWVzc2FnZUljb25Db2xvciA9PT0gJ0dyZWVuJ1wiXG4gICAgICAgICAgICAgICAgICAgIFtjbGFzcy5leGNsYW1hdGlvbi1pY29uLWJsdWVdPVwidmFsaWRhdGlvbk1lc3NhZ2VJY29uQ29sb3IgPT09ICdCbHVlJ1wiXG4gICAgICAgICAgICAgICAgICAgIFtjbGFzcy50ZXh0LXByaW1hcnldPVwidmFsaWRhdGlvbk1lc3NhZ2VJY29uQ29sb3IgPT09ICdCbHVlJ1wiXG4gICAgICAgICAgICAgICAgICAgIFtjbGFzcy5vcGFjaXR5LTUwXT1cImRpc2FibGVkXCJcbiAgICAgICAgICAgICAgICAgICAgYXJpYS1oaWRkZW49XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICAgICBjbGFzcz1cInRpdGxlIGZvbnQtb3Blbi1zYW5zIHRleHQtc20gZm9udC1ib2xkIHVwcGVyY2FzZSBsZWFkaW5nLW5vcm1hbFwiXG4gICAgICAgICAgICAgICAgW2NsYXNzLnRleHQtZ3JheXNjYWxlLTMwXT1cImRpc2FibGVkXCJcbiAgICAgICAgICAgICAgICBbaWRdPVwiJ2FjY29yZGlvbi1wYW5lbC1oZWFkZXItJyArIHBhbmVsSWRcIlxuICAgICAgICAgICAgICAgID57eyBoZWFkZXIgfX08L3NwYW5cbiAgICAgICAgICAgID5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJoZWFkZXJfX2NvbnRyb2xzIGZsZXggaXRlbXMtY2VudGVyIG1sLTRcIj5cbiAgICAgICAgICAgIEBpZiAoYmFkZ2VDb25maWcpIHtcbiAgICAgICAgICAgICAgICA8cy1iYWRnZVxuICAgICAgICAgICAgICAgICAgICBbY29sb3JdPVwiYmFkZ2VDb25maWcuY29sb3JcIlxuICAgICAgICAgICAgICAgICAgICBbdGV4dF09XCJiYWRnZUNvbmZpZy50ZXh0XCJcbiAgICAgICAgICAgICAgICA+PC9zLWJhZGdlPlxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBAZm9yIChidXR0b24gb2YgYnV0dG9uczsgdHJhY2sgYnV0dG9uLmljb24pIHtcbiAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiaWNvbi1idXR0b24gdGV4dC1iYXNlIG1sLTMgcC0xIGJvcmRlci0wIGJnLXRyYW5zcGFyZW50IHJvdW5kZWQtWzUwJV0gZm9jdXMtdmlzaWJsZTpvdXRsaW5lIGZvY3VzLXZpc2libGU6b3V0bGluZS0yIGZvY3VzLXZpc2libGU6b3V0bGluZS1vZmZzZXQtWzNweF0gZm9jdXMtdmlzaWJsZTpvdXRsaW5lLVt2YXIoLS1zLWZvY3VzLXJpbmctY29sb3IsIzAwOTBmZildXCJcbiAgICAgICAgICAgICAgICAgICAgW2NsYXNzLnRleHQtZ3JheXNjYWxlLTkwXT1cIiFkaXNhYmxlZFwiXG4gICAgICAgICAgICAgICAgICAgIFtjbGFzcy50ZXh0LWdyYXlzY2FsZS0zMF09XCJkaXNhYmxlZFwiXG4gICAgICAgICAgICAgICAgICAgIFtjbGFzcy5jdXJzb3ItcG9pbnRlcl09XCIhZGlzYWJsZWRcIlxuICAgICAgICAgICAgICAgICAgICBbY2xhc3MuY3Vyc29yLWF1dG9dPVwiZGlzYWJsZWRcIlxuICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJidXR0b24uaWNvblwiXG4gICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiYnV0dG9uLmxhYmVsXCJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uSWNvbkJ1dHRvbnNDbGljaygkZXZlbnQsIGJ1dHRvbi5vbkNsaWNrKVwiXG4gICAgICAgICAgICAgICAgPjwvYnV0dG9uPlxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBAaWYgKHN3aXRjaENvbnRyb2wpIHtcbiAgICAgICAgICAgICAgICA8cy1zd2l0Y2hcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJzd2l0Y2ggcGwtNFwiXG4gICAgICAgICAgICAgICAgICAgIFtmb3JtQ29udHJvbF09XCJzd2l0Y2hDb250cm9sXCJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDwvcy1zd2l0Y2g+XG4gICAgICAgICAgICB9XG4gICAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuXG4gICAgQGlmIChjYWNoZSkge1xuICAgICAgICA8ZGl2XG4gICAgICAgICAgICBjbGFzcz1cImNvbnRlbnQgYmctZ3JheXNjYWxlLTAgb3ZlcmZsb3ctaGlkZGVuXCJcbiAgICAgICAgICAgIHJvbGU9XCJyZWdpb25cIlxuICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbGxlZGJ5XT1cIidhY2NvcmRpb24tcGFuZWwtaGVhZGVyLScgKyBwYW5lbElkXCJcbiAgICAgICAgICAgIFtpZF09XCInYWNjb3JkaW9uLXBhbmVsLWNvbnRlbnQtJyArIHBhbmVsSWRcIlxuICAgICAgICAgICAgW0BjYWNoZUFuaW1hdGlvbl09XCJpc09wZW5cIlxuICAgICAgICAgICAgW0AuZGlzYWJsZWRdPVwiaXNDb250ZW50QW5pbWF0aW9uRGlzYWJsZWRcIlxuICAgICAgICAgICAgKEBjYWNoZUFuaW1hdGlvbi5zdGFydCk9XCJvbkNvbnRlbnRBbmltYXRpb25TdGFydCgpXCJcbiAgICAgICAgICAgIChAY2FjaGVBbmltYXRpb24uZG9uZSk9XCJvbkNvbnRlbnRBbmltYXRpb25Eb25lKClcIlxuICAgICAgICA+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29udGVudC1jb250YWluZXIgbS01XCI+XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdUZW1wbGF0ZU91dGxldF09XCJwYW5lbENvbnRlbnRcIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICB9IEBlbHNlIHtcbiAgICAgICAgQGlmIChpc09wZW4pIHtcbiAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICBjbGFzcz1cImNvbnRlbnQgYmctZ3JheXNjYWxlLTAgb3ZlcmZsb3ctaGlkZGVuXCJcbiAgICAgICAgICAgICAgICByb2xlPVwicmVnaW9uXCJcbiAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsbGVkYnldPVwiJ2FjY29yZGlvbi1wYW5lbC1oZWFkZXItJyArIHBhbmVsSWRcIlxuICAgICAgICAgICAgICAgIFtpZF09XCInYWNjb3JkaW9uLXBhbmVsLWNvbnRlbnQtJyArIHBhbmVsSWRcIlxuICAgICAgICAgICAgICAgIEBjYWNoZWxlc3NBbmltYXRpb25cbiAgICAgICAgICAgICAgICBbQC5kaXNhYmxlZF09XCJpc0NvbnRlbnRBbmltYXRpb25EaXNhYmxlZFwiXG4gICAgICAgICAgICAgICAgKEBjYWNoZWxlc3NBbmltYXRpb24uc3RhcnQpPVwib25Db250ZW50QW5pbWF0aW9uU3RhcnQoKVwiXG4gICAgICAgICAgICAgICAgKEBjYWNoZWxlc3NBbmltYXRpb24uZG9uZSk9XCJvbkNvbnRlbnRBbmltYXRpb25Eb25lKClcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb250ZW50LWNvbnRhaW5lciBtLTVcIj5cbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdUZW1wbGF0ZU91dGxldF09XCJwYW5lbENvbnRlbnRcIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICB9XG4gICAgfVxuPC9kaXY+XG5cbjxuZy10ZW1wbGF0ZSAjcGFuZWxDb250ZW50PlxuICAgIDxuZy1jb250ZW50PjwvbmctY29udGVudD5cbjwvbmctdGVtcGxhdGU+XG4iXX0=