@fundamental-ngx/platform 0.46.0-rc.2 → 0.46.0-rc.21

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 (207) hide show
  1. package/esm2022/approval-flow/approval-flow-add-node/approval-flow-add-node.component.mjs +1 -1
  2. package/esm2022/approval-flow/approval-flow.component.mjs +3 -3
  3. package/esm2022/form/auto-complete/auto-complete.directive.mjs +4 -3
  4. package/esm2022/form/auto-complete/auto-complete.module.mjs +4 -6
  5. package/esm2022/form/checkbox/checkbox.module.mjs +5 -8
  6. package/esm2022/form/checkbox-group/checkbox-group.module.mjs +5 -7
  7. package/esm2022/form/combobox/combobox/combobox.component.mjs +36 -14
  8. package/esm2022/form/combobox/combobox-mobile/combobox/combobox-mobile.component.mjs +19 -4
  9. package/esm2022/form/combobox/combobox-mobile/combobox-mobile.module.mjs +4 -9
  10. package/esm2022/form/combobox/combobox.module.mjs +5 -51
  11. package/esm2022/form/combobox/commons/base-combobox.mjs +9 -1
  12. package/esm2022/form/form-generator/form-generator/form-generator.component.mjs +3 -3
  13. package/esm2022/form/form-group/fdp-form.module.mjs +10 -42
  14. package/esm2022/form/form-group/form-field/form-field.component.mjs +47 -12
  15. package/esm2022/form/form-group/form-field-error/form-field-error-description.directive.mjs +4 -3
  16. package/esm2022/form/form-group/form-field-error/form-field-error-heading.directive.mjs +4 -3
  17. package/esm2022/form/form-group/form-field-error/form-field-error.directive.mjs +4 -3
  18. package/esm2022/form/form-group/form-field-extras/form-field-extras.component.mjs +3 -3
  19. package/esm2022/form/form-group/form-field-group/form-field-group.component.mjs +3 -3
  20. package/esm2022/form/form-group/form-group-header/form-group-header.component.mjs +8 -6
  21. package/esm2022/form/form-group/form-group.component.mjs +25 -10
  22. package/esm2022/form/form-group/pipes/field-group-row-value.pipe.mjs +6 -3
  23. package/esm2022/form/input/fdp-input.module.mjs +5 -11
  24. package/esm2022/form/input/input.component.mjs +5 -4
  25. package/esm2022/form/input-group/addon-body.component.mjs +6 -4
  26. package/esm2022/form/input-group/addon.component.mjs +4 -4
  27. package/esm2022/form/input-group/input-group.component.mjs +9 -10
  28. package/esm2022/form/input-group/input-group.module.mjs +5 -29
  29. package/esm2022/form/input-group/input.component.mjs +4 -3
  30. package/esm2022/form/input-message-group-with-template/input-message-group-with-template.component.mjs +5 -5
  31. package/esm2022/form/multi-combobox/commons/base-multi-combobox.mjs +9 -1
  32. package/esm2022/form/multi-combobox/multi-combobox/multi-combobox.component.mjs +44 -19
  33. package/esm2022/form/multi-combobox/multi-combobox-mobile/multi-combobox/multi-combobox-mobile.component.mjs +24 -5
  34. package/esm2022/form/multi-combobox/multi-combobox-mobile/multi-combobox-mobile.module.mjs +4 -10
  35. package/esm2022/form/multi-combobox/multi-combobox.module.mjs +5 -65
  36. package/esm2022/form/multi-input/multi-input-mobile/multi-input-mobile.component.mjs +11 -7
  37. package/esm2022/form/multi-input/multi-input-mobile/multi-input-mobile.module.mjs +4 -9
  38. package/esm2022/form/multi-input/multi-input.component.mjs +39 -20
  39. package/esm2022/form/multi-input/multi-input.module.mjs +5 -51
  40. package/esm2022/form/platform-file-uploader/platform-file-uploader.component.mjs +6 -5
  41. package/esm2022/form/platform-file-uploader/platform-file-uploader.module.mjs +5 -11
  42. package/esm2022/form/radio-group/radio/radio.component.mjs +10 -9
  43. package/esm2022/form/radio-group/radio-group.component.mjs +6 -6
  44. package/esm2022/form/radio-group/radio-group.module.mjs +5 -32
  45. package/esm2022/form/select/option/option.component.mjs +6 -3
  46. package/esm2022/form/select/select/select.component.mjs +20 -11
  47. package/esm2022/form/select/select.module.mjs +5 -54
  48. package/esm2022/form/step-input/number/number-step-input.component.mjs +25 -14
  49. package/esm2022/form/step-input/step-input-control.directive.mjs +4 -3
  50. package/esm2022/form/step-input/step-input-decrement.directive.mjs +4 -3
  51. package/esm2022/form/step-input/step-input-increment.directive.mjs +4 -3
  52. package/esm2022/form/step-input/step-input.module.mjs +13 -35
  53. package/esm2022/form/switch/switch/switch.component.mjs +4 -3
  54. package/esm2022/form/switch/switch.module.mjs +5 -11
  55. package/esm2022/form/text-area/text-area.component.mjs +12 -11
  56. package/esm2022/form/text-area/text-area.module.mjs +5 -32
  57. package/esm2022/form/time-picker/time-picker.component.mjs +5 -5
  58. package/esm2022/form/time-picker/time-picker.module.mjs +5 -11
  59. package/esm2022/list/list.component.mjs +3 -3
  60. package/esm2022/search-field/search-field.component.mjs +3 -3
  61. package/esm2022/settings-generator/controls/theme-selector-list/theme-selector-list.component.mjs +18 -9
  62. package/esm2022/settings-generator/layouts/settings-generator-sidebar-layout/settings-generator-sidebar-icon/settings-generator-sidebar-icon.component.mjs +8 -5
  63. package/esm2022/settings-generator/layouts/settings-generator-sidebar-layout/settings-generator-sidebar-layout.component.mjs +18 -10
  64. package/esm2022/settings-generator/settings-generator-content/settings-generator-content.component.mjs +22 -10
  65. package/esm2022/settings-generator/settings-generator-content/settings-generator-section/settings-generator-section.component.mjs +5 -6
  66. package/esm2022/settings-generator/settings-generator.component.mjs +3 -3
  67. package/esm2022/settings-generator/settings-generator.module.mjs +12 -54
  68. package/esm2022/shared/form/base.input.mjs +43 -13
  69. package/esm2022/shared/form/form-field.mjs +1 -1
  70. package/esm2022/slider/slider.component.mjs +4 -4
  71. package/esm2022/smart-filter-bar/components/smart-filter-bar-conditions-dialog/smart-filter-bar-conditions-dialog.component.mjs +3 -3
  72. package/esm2022/smart-filter-bar/components/smart-filter-bar-settings-dialog/smart-filter-bar-settings-dialog.component.mjs +3 -3
  73. package/esm2022/split-menu-button/split-menu-button.component.mjs +3 -3
  74. package/esm2022/table/components/table-cell-header-popover/table-cell-header-popover.component.mjs +3 -3
  75. package/esm2022/table/components/table-p13-dialog/filtering/filter-rule.component.mjs +1 -1
  76. package/esm2022/table/components/table-p13-dialog/grouping/grouping.component.mjs +1 -1
  77. package/esm2022/table/components/table-p13-dialog/sorting/sorting.component.mjs +2 -2
  78. package/esm2022/table/components/table-p13-dialog/table-p13-dialog.component.mjs +11 -11
  79. package/esm2022/table/components/table-row/table-row.component.mjs +3 -3
  80. package/esm2022/table/components/table-toolbar/table-toolbar.component.mjs +5 -5
  81. package/esm2022/table/components/table-toolbar/table-toolbar.mjs +1 -1
  82. package/esm2022/table/table.component.mjs +14 -5
  83. package/esm2022/upload-collection/upload-collection/upload-collection.component.mjs +3 -3
  84. package/esm2022/value-help-dialog/components/define-tab/define-tab.component.mjs +1 -1
  85. package/esm2022/value-help-dialog/components/select-tab/select-tab.component.mjs +3 -3
  86. package/esm2022/variant-management/components/manage-variants-dialog/manage-variants-dialog.component.mjs +1 -1
  87. package/esm2022/wizard-generator/components/dialog-wizard-generator/dialog-wizard-generator.component.mjs +41 -18
  88. package/esm2022/wizard-generator/components/wizard-body/wizard-body.component.mjs +20 -8
  89. package/esm2022/wizard-generator/components/wizard-generator/wizard-generator.component.mjs +10 -8
  90. package/esm2022/wizard-generator/components/wizard-generator-step/wizard-generator-step.component.mjs +5 -5
  91. package/esm2022/wizard-generator/components/wizard-summary-step/wizard-summary-section/wizard-summary-section.component.mjs +12 -9
  92. package/esm2022/wizard-generator/components/wizard-summary-step/wizard-summary-step.component.mjs +5 -5
  93. package/esm2022/wizard-generator/directives/wizard-generator-finish-button.directive.mjs +4 -3
  94. package/esm2022/wizard-generator/directives/wizard-generator-go-next-button.directive.mjs +4 -3
  95. package/esm2022/wizard-generator/directives/wizard-generator-review-button.directive.mjs +4 -3
  96. package/esm2022/wizard-generator/directives/wizard-generator-summary-step.directive.mjs +4 -3
  97. package/esm2022/wizard-generator/wizard-generator.module.mjs +13 -56
  98. package/fesm2022/fundamental-ngx-platform-approval-flow.mjs +3 -3
  99. package/fesm2022/fundamental-ngx-platform-approval-flow.mjs.map +1 -1
  100. package/fesm2022/fundamental-ngx-platform-form.mjs +541 -635
  101. package/fesm2022/fundamental-ngx-platform-form.mjs.map +1 -1
  102. package/fesm2022/fundamental-ngx-platform-list.mjs +2 -2
  103. package/fesm2022/fundamental-ngx-platform-list.mjs.map +1 -1
  104. package/fesm2022/fundamental-ngx-platform-search-field.mjs +2 -2
  105. package/fesm2022/fundamental-ngx-platform-search-field.mjs.map +1 -1
  106. package/fesm2022/fundamental-ngx-platform-settings-generator.mjs +69 -80
  107. package/fesm2022/fundamental-ngx-platform-settings-generator.mjs.map +1 -1
  108. package/fesm2022/fundamental-ngx-platform-shared.mjs +42 -12
  109. package/fesm2022/fundamental-ngx-platform-shared.mjs.map +1 -1
  110. package/fesm2022/fundamental-ngx-platform-slider.mjs.map +1 -1
  111. package/fesm2022/fundamental-ngx-platform-smart-filter-bar.mjs +4 -4
  112. package/fesm2022/fundamental-ngx-platform-smart-filter-bar.mjs.map +1 -1
  113. package/fesm2022/fundamental-ngx-platform-split-menu-button.mjs +2 -2
  114. package/fesm2022/fundamental-ngx-platform-split-menu-button.mjs.map +1 -1
  115. package/fesm2022/fundamental-ngx-platform-table.mjs +423 -414
  116. package/fesm2022/fundamental-ngx-platform-table.mjs.map +1 -1
  117. package/fesm2022/fundamental-ngx-platform-upload-collection.mjs +2 -2
  118. package/fesm2022/fundamental-ngx-platform-upload-collection.mjs.map +1 -1
  119. package/fesm2022/fundamental-ngx-platform-value-help-dialog.mjs +3 -3
  120. package/fesm2022/fundamental-ngx-platform-value-help-dialog.mjs.map +1 -1
  121. package/fesm2022/fundamental-ngx-platform-variant-management.mjs +1 -1
  122. package/fesm2022/fundamental-ngx-platform-variant-management.mjs.map +1 -1
  123. package/fesm2022/fundamental-ngx-platform-wizard-generator.mjs +226 -228
  124. package/fesm2022/fundamental-ngx-platform-wizard-generator.mjs.map +1 -1
  125. package/form/auto-complete/auto-complete.directive.d.ts +1 -1
  126. package/form/auto-complete/auto-complete.module.d.ts +1 -2
  127. package/form/checkbox/checkbox.module.d.ts +2 -5
  128. package/form/checkbox-group/checkbox-group.module.d.ts +2 -4
  129. package/form/combobox/combobox/combobox.component.d.ts +1 -1
  130. package/form/combobox/combobox-mobile/combobox/combobox-mobile.component.d.ts +1 -1
  131. package/form/combobox/combobox-mobile/combobox-mobile.module.d.ts +1 -5
  132. package/form/combobox/combobox.module.d.ts +1 -12
  133. package/form/combobox/commons/base-combobox.d.ts +2 -0
  134. package/form/form-group/fdp-form.module.d.ts +1 -9
  135. package/form/form-group/form-field/form-field.component.d.ts +12 -3
  136. package/form/form-group/form-field-error/form-field-error-description.directive.d.ts +1 -1
  137. package/form/form-group/form-field-error/form-field-error-heading.directive.d.ts +1 -1
  138. package/form/form-group/form-field-error/form-field-error.directive.d.ts +1 -1
  139. package/form/form-group/form-field-extras/form-field-extras.component.d.ts +1 -1
  140. package/form/form-group/form-field-group/form-field-group.component.d.ts +1 -1
  141. package/form/form-group/form-group-header/form-group-header.component.d.ts +1 -1
  142. package/form/form-group/form-group.component.d.ts +1 -1
  143. package/form/form-group/pipes/field-group-row-value.pipe.d.ts +1 -1
  144. package/form/input/fdp-input.module.d.ts +1 -6
  145. package/form/input/input.component.d.ts +1 -1
  146. package/form/input-group/addon-body.component.d.ts +1 -1
  147. package/form/input-group/addon.component.d.ts +1 -1
  148. package/form/input-group/input-group.component.d.ts +1 -1
  149. package/form/input-group/input-group.module.d.ts +1 -5
  150. package/form/input-group/input.component.d.ts +1 -1
  151. package/form/input-message-group-with-template/input-message-group-with-template.component.d.ts +1 -1
  152. package/form/multi-combobox/commons/base-multi-combobox.d.ts +2 -0
  153. package/form/multi-combobox/multi-combobox/multi-combobox.component.d.ts +1 -1
  154. package/form/multi-combobox/multi-combobox-mobile/multi-combobox/multi-combobox-mobile.component.d.ts +1 -1
  155. package/form/multi-combobox/multi-combobox-mobile/multi-combobox-mobile.module.d.ts +1 -6
  156. package/form/multi-combobox/multi-combobox.module.d.ts +1 -15
  157. package/form/multi-input/multi-input-mobile/multi-input-mobile.component.d.ts +1 -1
  158. package/form/multi-input/multi-input-mobile/multi-input-mobile.module.d.ts +1 -5
  159. package/form/multi-input/multi-input.component.d.ts +1 -1
  160. package/form/multi-input/multi-input.module.d.ts +1 -11
  161. package/form/platform-file-uploader/platform-file-uploader.component.d.ts +1 -1
  162. package/form/platform-file-uploader/platform-file-uploader.module.d.ts +1 -6
  163. package/form/radio-group/radio/radio.component.d.ts +1 -1
  164. package/form/radio-group/radio-group.component.d.ts +1 -1
  165. package/form/radio-group/radio-group.module.d.ts +1 -7
  166. package/form/select/option/option.component.d.ts +1 -1
  167. package/form/select/select/select.component.d.ts +3 -1
  168. package/form/select/select.module.d.ts +1 -12
  169. package/form/step-input/number/number-step-input.component.d.ts +1 -1
  170. package/form/step-input/step-input-control.directive.d.ts +1 -1
  171. package/form/step-input/step-input-decrement.directive.d.ts +1 -1
  172. package/form/step-input/step-input-increment.directive.d.ts +1 -1
  173. package/form/step-input/step-input.module.d.ts +1 -7
  174. package/form/switch/switch/switch.component.d.ts +1 -1
  175. package/form/switch/switch.module.d.ts +1 -6
  176. package/form/text-area/text-area.component.d.ts +1 -1
  177. package/form/text-area/text-area.module.d.ts +1 -7
  178. package/form/time-picker/time-picker.component.d.ts +1 -1
  179. package/form/time-picker/time-picker.module.d.ts +1 -6
  180. package/fundamental-ngx-platform-v0.46.0-rc.21.tgz +0 -0
  181. package/package.json +4 -4
  182. package/schematics/ng-add/index.js +1 -1
  183. package/settings-generator/controls/theme-selector-list/theme-selector-list.component.d.ts +2 -2
  184. package/settings-generator/layouts/settings-generator-sidebar-layout/settings-generator-sidebar-icon/settings-generator-sidebar-icon.component.d.ts +1 -1
  185. package/settings-generator/layouts/settings-generator-sidebar-layout/settings-generator-sidebar-layout.component.d.ts +1 -1
  186. package/settings-generator/settings-generator-content/settings-generator-content.component.d.ts +1 -1
  187. package/settings-generator/settings-generator-content/settings-generator-section/settings-generator-section.component.d.ts +1 -1
  188. package/settings-generator/settings-generator.component.d.ts +1 -1
  189. package/settings-generator/settings-generator.module.d.ts +9 -20
  190. package/shared/form/base.input.d.ts +42 -27
  191. package/shared/form/form-field.d.ts +22 -7
  192. package/table/components/table-p13-dialog/table-p13-dialog.component.d.ts +7 -7
  193. package/table/components/table-toolbar/table-toolbar.component.d.ts +3 -3
  194. package/table/components/table-toolbar/table-toolbar.d.ts +4 -1
  195. package/table/table.component.d.ts +9 -3
  196. package/wizard-generator/components/dialog-wizard-generator/dialog-wizard-generator.component.d.ts +5 -4
  197. package/wizard-generator/components/wizard-body/wizard-body.component.d.ts +1 -1
  198. package/wizard-generator/components/wizard-generator/wizard-generator.component.d.ts +1 -1
  199. package/wizard-generator/components/wizard-generator-step/wizard-generator-step.component.d.ts +1 -1
  200. package/wizard-generator/components/wizard-summary-step/wizard-summary-section/wizard-summary-section.component.d.ts +1 -1
  201. package/wizard-generator/components/wizard-summary-step/wizard-summary-step.component.d.ts +1 -1
  202. package/wizard-generator/directives/wizard-generator-finish-button.directive.d.ts +1 -1
  203. package/wizard-generator/directives/wizard-generator-go-next-button.directive.d.ts +1 -1
  204. package/wizard-generator/directives/wizard-generator-review-button.directive.d.ts +1 -1
  205. package/wizard-generator/directives/wizard-generator-summary-step.directive.d.ts +1 -1
  206. package/wizard-generator/wizard-generator.module.d.ts +12 -24
  207. package/fundamental-ngx-platform-v0.46.0-rc.2.tgz +0 -0
@@ -1,5 +1,5 @@
1
1
  import { ChangeDetectionStrategy, ChangeDetectorRef, Component, ElementRef, Host, Inject, Injector, isDevMode, Optional, Self, SkipSelf, TemplateRef, ViewChild, ViewContainerRef, ViewEncapsulation } from '@angular/core';
2
- import { ControlContainer, NgControl, NgForm } from '@angular/forms';
2
+ import { ControlContainer, NgControl, NgForm, FormsModule } from '@angular/forms';
3
3
  import { A, DOWN_ARROW, ENTER, ESCAPE, SPACE, TAB, UP_ARROW } from '@angular/cdk/keycodes';
4
4
  import { FD_FORM_FIELD, FD_FORM_FIELD_CONTROL } from '@fundamental-ngx/cdk/forms';
5
5
  import equal from 'fast-deep-equal';
@@ -11,24 +11,28 @@ import { MultiComboboxMobileComponent } from '../multi-combobox-mobile/multi-com
11
11
  import { PlatformMultiComboboxMobileModule } from '../multi-combobox-mobile/multi-combobox-mobile.module';
12
12
  import { MULTICOMBOBOX_COMPONENT } from '../multi-combobox.interface';
13
13
  import { MultiComboboxConfig } from '../multi-combobox.config';
14
- import { TokenizerComponent } from '@fundamental-ngx/core/token';
15
- import { ContentDensityObserver, contentDensityObserverProviders } from '@fundamental-ngx/core/content-density';
14
+ import { AutoCompleteDirective } from '../../auto-complete/auto-complete.directive';
15
+ import { TokenizerComponent, TokenModule } from '@fundamental-ngx/core/token';
16
+ import { ContentDensityModule, ContentDensityObserver, contentDensityObserverProviders } from '@fundamental-ngx/core/content-density';
17
+ import { FdTranslatePipe } from '@fundamental-ngx/i18n';
18
+ import { SearchHighlightPipe } from '@fundamental-ngx/cdk/utils';
19
+ import { NgIf, NgTemplateOutlet, NgFor, NgClass } from '@angular/common';
20
+ import { PopoverBodyComponent, PopoverComponent, PopoverControlComponent } from '@fundamental-ngx/core/popover';
21
+ import { FormControlModule, FormInputMessageGroupModule, FormMessageModule } from '@fundamental-ngx/core/form';
22
+ import { InputGroupModule } from '@fundamental-ngx/core/input-group';
23
+ import { ListModule, ListSecondaryDirective } from '@fundamental-ngx/core/list';
24
+ import { CheckboxComponent } from '@fundamental-ngx/core/checkbox';
16
25
  import * as i0 from "@angular/core";
17
26
  import * as i1 from "@angular/forms";
18
27
  import * as i2 from "@fundamental-ngx/core/dialog";
19
28
  import * as i3 from "@fundamental-ngx/cdk/utils";
20
29
  import * as i4 from "../multi-combobox.config";
21
30
  import * as i5 from "@fundamental-ngx/core/content-density";
22
- import * as i6 from "@angular/common";
23
- import * as i7 from "@fundamental-ngx/core/checkbox";
24
- import * as i8 from "@fundamental-ngx/core/input-group";
25
- import * as i9 from "@fundamental-ngx/core/token";
26
- import * as i10 from "@fundamental-ngx/core/list";
27
- import * as i11 from "@fundamental-ngx/core/form";
28
- import * as i12 from "@fundamental-ngx/core/popover";
29
- import * as i13 from "../../auto-complete/auto-complete.directive";
30
- import * as i14 from "@fundamental-ngx/i18n";
31
- import * as i15 from "@fundamental-ngx/platform/shared";
31
+ import * as i6 from "@fundamental-ngx/core/form";
32
+ import * as i7 from "@fundamental-ngx/core/input-group";
33
+ import * as i8 from "@fundamental-ngx/core/token";
34
+ import * as i9 from "@fundamental-ngx/core/list";
35
+ import * as i10 from "@fundamental-ngx/platform/shared";
32
36
  let deprecationWarningShown = false;
33
37
  /**
34
38
  * This component can work with both string primitives as well as with complex objects. In order
@@ -291,14 +295,14 @@ export class MultiComboboxComponent extends BaseMultiCombobox {
291
295
  await this._dynamicComponentService.createDynamicModule({ listTemplate: this.listTemplate, controlTemplate: this.mobileControlTemplate }, PlatformMultiComboboxMobileModule, MultiComboboxMobileComponent, this._viewContainerRef, injector);
292
296
  }
293
297
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.0", ngImport: i0, type: MultiComboboxComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: i0.ElementRef }, { token: i1.NgControl, optional: true, self: true }, { token: i1.ControlContainer, optional: true, skipSelf: true }, { token: i1.NgForm, optional: true, skipSelf: true }, { token: i2.DialogConfig, optional: true }, { token: i3.DynamicComponentService }, { token: DATA_PROVIDERS, optional: true }, { token: i4.MultiComboboxConfig }, { token: i0.ViewContainerRef }, { token: i0.Injector }, { token: FD_FORM_FIELD, host: true, optional: true, skipSelf: true }, { token: FD_FORM_FIELD_CONTROL, host: true, optional: true, skipSelf: true }, { token: MAP_LIMIT }, { token: i5.ContentDensityObserver }], target: i0.ɵɵFactoryTarget.Component }); }
294
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.0", type: MultiComboboxComponent, selector: "fdp-multi-combobox", providers: [
298
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.0", type: MultiComboboxComponent, isStandalone: true, selector: "fdp-multi-combobox", providers: [
295
299
  {
296
300
  provide: FD_FORM_FIELD_CONTROL,
297
301
  useExisting: MultiComboboxComponent,
298
302
  multi: true
299
303
  },
300
304
  contentDensityObserverProviders()
301
- ], viewQueries: [{ propertyName: "mobileControlTemplate", first: true, predicate: ["mobileControlTemplate"], descendants: true }, { propertyName: "listTemplate", first: true, predicate: ["listTemplate"], descendants: true }, { propertyName: "_tokenizer", first: true, predicate: TokenizerComponent, descendants: true }], usesInheritance: true, ngImport: i0, template: "<div class=\"fdp-multi-combobox\">\n <ng-container [ngTemplateOutlet]=\"controlTemplate\" *ngIf=\"mobile\"></ng-container>\n\n <fd-popover\n *ngIf=\"!mobile\"\n additionalBodyClass=\"fd-popover-custom-list fdp-multi-combobox__list-container\"\n (isOpenChange)=\"popoverOpenChangeHandle($event)\"\n [isOpen]=\"isOpen\"\n [triggers]=\"[]\"\n [disabled]=\"disabled\"\n [fillControlMode]=\"fillControlMode\"\n >\n <fd-popover-control>\n <ng-container>\n <ng-container *ngTemplateOutlet=\"controlTemplate\"></ng-container>\n </ng-container>\n </fd-popover-control>\n <fd-popover-body [style.width.%]=\"!autoResize && 100\">\n <ng-container *ngTemplateOutlet=\"listTemplate\"></ng-container>\n <ng-content></ng-content>\n </fd-popover-body>\n </fd-popover>\n</div>\n\n<ng-template #controlTemplate>\n <fd-form-input-message-group>\n <fd-input-group\n [id]=\"id + '-input-group-container'\"\n class=\"fdp-multi-combobox-input-group-custom\"\n [state]=\"state\"\n [buttonFocusable]=\"buttonFocusable\"\n [button]=\"!readonly\"\n [glyph]=\"!readonly ? 'navigation-down-arrow' : ' '\"\n [isControl]=\"true\"\n [disabled]=\"disabled || readonly\"\n [isExpanded]=\"!mobile && isOpen && _suggestions.length > 0\"\n [attr.aria-disabled]=\"disabled || readonly\"\n [attr.aria-readonly]=\"readonly\"\n [glyphAriaLabel]=\"ariaLabel || ('platformMultiCombobox.inputGlyphAriaLabel' | fdTranslate)\"\n [iconTitle]=\"addonIconTitle || ('platformMultiCombobox.inputGlyphAriaLabel' | fdTranslate)\"\n (addOnButtonClicked)=\"_addOnClicked($event)\"\n (click)=\"mobile && !isOpen && onPrimaryButtonClick(false)\"\n (keydown)=\"navigateByTokens($event)\"\n >\n <fd-tokenizer\n #tokenizer\n [compactCollapse]=\"true\"\n *ngIf=\"_selectedSuggestions\"\n [tokenizerFocusable]=\"false\"\n class=\"fdp-multi-combobox-tokenizer-custom\"\n (moreClickedEvent)=\"moreClicked()\"\n >\n <fd-token\n [readOnly]=\"disabled\"\n (onCloseClick)=\"removeToken(token, $event)\"\n *ngFor=\"let token of _selectedSuggestions\"\n >\n {{ token.label }}\n </fd-token>\n\n <input\n #searchInputElement\n fdp-auto-complete\n (onComplete)=\"onCompleteTerm($event)\"\n [options]=\"_suggestions\"\n [inputText]=\"inputText\"\n [mobile]=\"mobile\"\n type=\"text\"\n role=\"combobox\"\n autocomplete=\"off\"\n [attr.aria-label]=\"ariaLabel\"\n [attr.aria-labelledby]=\"ariaLabelledBy\"\n [attr.aria-autocomplete]=\"autoComplete && !mobile ? 'list' : null\"\n [attr.aria-owns]=\"autoComplete && !mobile ? id + '-result' : null\"\n [attr.aria-haspopup]=\"autoComplete && !mobile\"\n fd-form-control\n fd-input-group-input\n tabindex=\"0\"\n [id]=\"id\"\n [name]=\"name\"\n (keydown)=\"onInputKeydownHandler($event)\"\n [disabled]=\"disabled\"\n [(ngModel)]=\"inputText\"\n (ngModelChange)=\"searchTermChanged()\"\n [placeholder]=\"placeholder\"\n (focus)=\"onTouched(); tokenizer._showAllTokens()\"\n (blur)=\"!mobile && onBlur($event); tokenizer._hideTokens()\"\n [attr.aria-expanded]=\"isOpen\"\n [readonly]=\"readonly\"\n [attr.aria-readonly]=\"readonly\"\n [attr.aria-required]=\"required\"\n class=\"fd-tokenizer__input\"\n />\n </fd-tokenizer>\n </fd-input-group>\n\n <fd-form-message\n *ngIf=\"mobile && isOpen ? false : !!stateMessage\"\n [type]=\"state\"\n [innerHtml]=\"stateMessage\"\n ></fd-form-message>\n </fd-form-input-message-group>\n</ng-template>\n\n<ng-template #mobileControlTemplate>\n <fd-input-group\n [id]=\"id + '-input-group-container'\"\n class=\"fdp-multi-combobox-input-group-custom\"\n [state]=\"state\"\n [buttonFocusable]=\"false\"\n [isControl]=\"true\"\n [disabled]=\"disabled || readonly\"\n [isExpanded]=\"!mobile && isOpen && _suggestions.length > 0\"\n [attr.aria-disabled]=\"disabled || readonly\"\n [attr.aria-readonly]=\"readonly\"\n [glyphAriaLabel]=\"ariaLabel\"\n >\n <input\n fdp-auto-complete\n (onComplete)=\"onCompleteTerm($event)\"\n [options]=\"_suggestions\"\n [inputText]=\"inputText\"\n [mobile]=\"mobile\"\n type=\"text\"\n role=\"combobox\"\n autocomplete=\"off\"\n [attr.aria-label]=\"ariaLabel\"\n [attr.aria-labelledby]=\"ariaLabelledBy\"\n [attr.aria-autocomplete]=\"autoComplete && !mobile ? 'list' : null\"\n [attr.aria-owns]=\"autoComplete && !mobile ? id + '-result' : null\"\n [attr.aria-haspopup]=\"autoComplete && !mobile\"\n fd-form-control\n fd-input-group-input\n tabindex=\"0\"\n [id]=\"id\"\n [name]=\"name\"\n (keydown)=\"onInputKeydownHandler($event)\"\n [disabled]=\"disabled\"\n [(ngModel)]=\"inputText\"\n (ngModelChange)=\"searchTermChanged()\"\n [placeholder]=\"placeholder\"\n (focus)=\"onTouched()\"\n (blur)=\"!mobile && onBlur($event)\"\n [attr.aria-expanded]=\"isOpen\"\n [readonly]=\"readonly\"\n [attr.aria-readonly]=\"readonly\"\n />\n </fd-input-group>\n</ng-template>\n\n<ng-template #listTemplate>\n <ul\n fd-list\n [hasMessage]=\"!!stateMessage\"\n (focusEscapeList)=\"handleListFocusEscape($event)\"\n [dropdownMode]=\"true\"\n class=\"fdp-multi-combobox__list fd-list--multi-input\"\n [id]=\"id + '-result'\"\n role=\"listbox\"\n [style.maxHeight]=\"!mobile && maxHeight\"\n [style.minWidth]=\"!mobile && minWidth + 'px'\"\n [style.maxWidth]=\"autoResize && maxWidth + 'px'\"\n [attr.aria-labelledby]=\"id + '-search'\"\n aria-multiselectable=\"true\"\n >\n <li\n *ngIf=\"stateMessage\"\n [attr.aria-label]=\"stateMessage\"\n fd-list-message\n tabindex=\"-1\"\n role=\"presentation\"\n [type]=\"state || 'default'\"\n [innerHtml]=\"stateMessage\"\n ></li>\n\n <ng-content></ng-content>\n <ng-container *ngIf=\"isGroup\">\n <ng-container *ngFor=\"let group of _suggestions\">\n <ng-container *ngIf=\"!groupItemTemplate\">\n <label fd-list-item fd-list-group-header role=\"group\">\n <span fd-list-title>{{ group.label }}</span>\n </label>\n </ng-container>\n\n <ng-container *ngIf=\"groupItemTemplate\">\n <ng-container\n [ngTemplateOutlet]=\"groupItemTemplate\"\n [ngTemplateOutletContext]=\"{ $implicit: { label: group.label } }\"\n ></ng-container>\n </ng-container>\n\n <li\n *ngFor=\"let optionItem of group.children; let i = index\"\n fd-list-item\n role=\"option\"\n [tabindex]=\"0\"\n (click)=\"!mobile && close()\"\n (keyDown)=\"onItemKeyDownHandler($event, i)\"\n [selected]=\"!!optionItem.selected\"\n >\n <fd-checkbox\n (click)=\"onOptionCheckboxClicked($event, i)\"\n (ngModelChange)=\"toggleSelection(optionItem)\"\n [ngModel]=\"optionItem.selected\"\n >\n </fd-checkbox>\n <ng-container\n [ngTemplateOutlet]=\"listItem\"\n [ngTemplateOutletContext]=\"{ optionItem: optionItem, index: i }\"\n ></ng-container>\n </li>\n </ng-container>\n </ng-container>\n\n <ng-container *ngIf=\"!isGroup\">\n <li\n *ngFor=\"let optionItem of _suggestions; let i = index\"\n fd-list-item\n role=\"option\"\n [tabindex]=\"0\"\n (click)=\"!mobile && onOptionClicked($event, i)\"\n (keyDown)=\"onItemKeyDownHandler($event, i)\"\n [selected]=\"!!optionItem.selected\"\n >\n <fd-checkbox\n (click)=\"onOptionCheckboxClicked($event, i)\"\n (ngModelChange)=\"toggleSelection(optionItem)\"\n [ngModel]=\"optionItem.selected\"\n >\n </fd-checkbox>\n <ng-container\n [ngTemplateOutlet]=\"listItem\"\n [ngTemplateOutletContext]=\"{ optionItem: optionItem, index: i }\"\n ></ng-container>\n </li>\n </ng-container>\n </ul>\n</ng-template>\n\n<ng-template let-optionItem=\"optionItem\" let-index=\"index\" #listItem>\n <ng-container\n *ngIf=\"optionItem.selected && !!selectedItemTemplate\"\n [ngTemplateOutlet]=\"selectedItemTemplate\"\n [ngTemplateOutletContext]=\"{ $implicit: optionItem.value, index: index }\"\n ></ng-container>\n\n <ng-container *ngIf=\"!(optionItem.selected && selectedItemTemplate)\">\n <ng-container\n [ngTemplateOutlet]=\"optionItemSource\"\n [ngTemplateOutletContext]=\"{ optionItem: optionItem, index: index }\"\n ></ng-container>\n\n <ng-container\n [ngTemplateOutlet]=\"secondaryTextSource\"\n [ngTemplateOutletContext]=\"{ optionItem: optionItem }\"\n ></ng-container>\n </ng-container>\n</ng-template>\n\n<ng-template let-optionItem=\"optionItem\" let-index=\"index\" #optionItemSource>\n <ng-container *ngIf=\"!optionItemTemplate\">\n <span\n fd-list-title\n [attr.title]=\"optionItem.label\"\n [innerHTML]=\"optionItem.label | highlight : inputText\"\n ></span>\n </ng-container>\n\n <ng-container *ngIf=\"optionItemTemplate\">\n <ng-container\n [ngTemplateOutlet]=\"optionItemTemplate\"\n [ngTemplateOutletContext]=\"{ $implicit: optionItem.value, index: index }\"\n ></ng-container>\n </ng-container>\n</ng-template>\n\n<ng-template let-optionItem=\"optionItem\" #secondaryTextSource>\n <ng-container *ngIf=\"showSecondaryText\">\n <ng-container *ngIf=\"!secondaryItemTemplate\">\n <span\n [style.text-align]=\"secondaryTextAlignment\"\n fd-list-secondary\n [attr.title]=\"optionItem.secondaryText\"\n [innerHTML]=\"optionItem.secondaryText | highlight : inputText\"\n ></span>\n </ng-container>\n\n <ng-container *ngIf=\"secondaryItemTemplate\">\n <ng-container\n [ngTemplateOutlet]=\"secondaryItemTemplate\"\n [ngTemplateOutletContext]=\"{ $implicit: optionItem.value }\"\n ></ng-container>\n </ng-container>\n </ng-container>\n</ng-template>\n", styles: ["/*!\n * Fundamental Library Styles v0.30.2-rc.6\n * Copyright (c) 2023 SAP SE or an SAP affiliate company.\n * Licensed under Apache License 2.0 (https://github.com/SAP/fundamental-styles/blob/main/LICENSE)\n */.fd-margin--tiny{margin:.5rem!important}.fd-margin--sm{margin:1rem!important}.fd-margin--md{margin:2rem!important}.fd-margin--lg{margin:3rem!important}.fd-margin--none{margin:0!important}.fd-margin-top--tiny{margin-top:.5rem!important}.fd-margin-top--sm{margin-top:1rem!important}.fd-margin-top--md{margin-top:2rem!important}.fd-margin-top--lg{margin-top:3rem!important}.fd-margin-top--none{margin-top:0!important}.fd-margin-end--tiny{margin-right:.5rem!important}.fd-margin-end--tiny[dir=rtl],[dir=rtl] .fd-margin-end--tiny{margin-left:.5rem!important;margin-right:0!important}.fd-margin-end--sm{margin-right:1rem!important}.fd-margin-end--sm[dir=rtl],[dir=rtl] .fd-margin-end--sm{margin-left:1rem!important;margin-right:0!important}.fd-margin-end--md{margin-right:2rem!important}.fd-margin-end--md[dir=rtl],[dir=rtl] .fd-margin-end--md{margin-left:2rem!important;margin-right:0!important}.fd-margin-end--lg{margin-right:3rem!important}.fd-margin-end--lg[dir=rtl],[dir=rtl] .fd-margin-end--lg{margin-left:3rem!important;margin-right:0!important}.fd-margin-end--none{margin-right:0}.fd-margin-end--none[dir=rtl],[dir=rtl] .fd-margin-end--none{margin-left:0!important}.fd-margin-bottom--tiny{margin-bottom:.5rem!important}.fd-margin-bottom--sm{margin-bottom:1rem!important}.fd-margin-bottom--md{margin-bottom:2rem!important}.fd-margin-bottom--lg{margin-bottom:3rem!important}.fd-margin-bottom--none{margin-bottom:0!important}.fd-margin-begin--tiny{margin-left:.5rem!important}.fd-margin-begin--tiny[dir=rtl],[dir=rtl] .fd-margin-begin--tiny{margin-left:0!important;margin-right:.5rem!important}.fd-margin-begin--sm{margin-left:1rem!important}.fd-margin-begin--sm[dir=rtl],[dir=rtl] .fd-margin-begin--sm{margin-left:0!important;margin-right:1rem!important}.fd-margin-begin--md{margin-left:2rem!important}.fd-margin-begin--md[dir=rtl],[dir=rtl] .fd-margin-begin--md{margin-left:0!important;margin-right:2rem!important}.fd-margin-begin--lg{margin-left:3rem!important}.fd-margin-begin--lg[dir=rtl],[dir=rtl] .fd-margin-begin--lg{margin-left:0!important;margin-right:3rem!important}.fd-margin-begin--none{margin-left:0}.fd-margin-begin--none[dir=rtl],[dir=rtl] .fd-margin-begin--none{margin-right:0!important}.fd-margin-top-bottom--tiny{margin-bottom:.5rem!important;margin-top:.5rem!important}.fd-margin-top-bottom--sm{margin-bottom:1rem!important;margin-top:1rem!important}.fd-margin-top-bottom--md{margin-bottom:2rem!important;margin-top:2rem!important}.fd-margin-top-bottom--lg{margin-bottom:3rem!important;margin-top:3rem!important}.fd-margin-begin-end--tiny{margin-left:.5rem!important;margin-right:.5rem!important}.fd-margin-begin-end--sm{margin-left:1rem!important;margin-right:1rem!important}.fd-margin-begin-end--md{margin-left:2rem!important;margin-right:2rem!important}.fd-margin-begin-end--lg{margin-left:3rem!important;margin-right:3rem!important}.fd-margin-responsive--sm{margin:0 0 1rem!important}.fd-margin-responsive--md{margin:1rem!important}.fd-margin-responsive--lg{margin:1rem 2rem!important}.fd-margin-responsive--xl{margin:1rem 3rem!important}.fd-margin-negative-begin-end--tiny{margin:0 -.5rem!important}.fd-margin-negative-begin-end--sm{margin:0 -1rem!important}.fd-margin-negative-begin-end--md{margin:0 -2rem!important}.fd-margin-negative-begin-end--lg{margin:0 -3rem!important}.fdp-multi-combobox-tokenizer-custom{width:calc(100% - 2.25rem)}.fdp-multi-combobox-tokenizer-custom--compact{width:calc(100% - 2rem)}.fdp-multi-combobox__list-container .fd-list .fd-list__item.fd-list__group-header{padding:0 1rem}.fdp-multi-combobox__list-container .fd-list .fd-list__item .fd-list__title{max-width:inherit}.fdp-multi-combobox__list-container .fd-list.fd-list--compact .fd-list__item.fd-list__group-header{padding:0 .5rem}\n"], dependencies: [{ kind: "directive", type: i6.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i6.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i7.CheckboxComponent, selector: "fd-checkbox", inputs: ["wrapLabel", "valignLabel", "ariaLabel", "value", "ariaLabelledBy", "ariaDescribedBy", "title", "inputId", "state", "name", "label", "disabled", "tristate", "tristateSelectable", "labelClass", "required", "displayOnly", "values", "standalone"], outputs: ["focusChange"] }, { kind: "component", type: i8.InputGroupComponent, selector: "fd-input-group", inputs: ["placement", "required", "inline", "placeholder", "addOnText", "buttonFocusable", "type", "glyph", "button", "disabled", "readonly", "state", "isControl", "showFocus", "isExpanded", "glyphAriaLabel", "iconTitle", "ariaLabelledBy"], outputs: ["addOnButtonClicked", "search"] }, { kind: "directive", type: i8.InputGroupInputDirective, selector: "[fdInputGroupInput], [fd-input-group-input]", inputs: ["class"] }, { kind: "component", type: i9.TokenComponent, selector: "fd-token", inputs: ["disabled", "selected", "readOnly"], outputs: ["onCloseClick", "onRemove", "onTokenClick", "onTokenKeydown", "elementFocused"] }, { kind: "component", type: i9.TokenizerComponent, selector: "fd-tokenizer", inputs: ["class", "disableKeyboardDeletion", "compactCollapse", "tokenizerFocusable", "inputValue", "glyph", "moreTerm", "open"], outputs: ["moreClickedEvent"] }, { kind: "component", type: i10.ListComponent, selector: "[fd-list], [fdList]", inputs: ["dropdownMode", "multiInputMode", "mobileMode", "hasMessage", "noBorder", "navigationIndicator", "selection", "keyboardSupport", "byline", "unreadIndicator"], outputs: ["focusEscapeList"] }, { kind: "component", type: i10.ListItemComponent, selector: "[fdListItem] ,[fd-list-item]", inputs: ["selected", "noData", "action", "interactive", "growing", "counter", "unread", "byline"], outputs: ["keyDown"] }, { kind: "directive", type: i10.ListTitleDirective, selector: "[fd-list-title], [fdListTitle]", inputs: ["wrap"] }, { kind: "directive", type: i10.ListGroupHeaderDirective, selector: "[fdListGroupHeader], [fd-list-group-header]", inputs: ["nativeElementId"], outputs: ["keyDown"] }, { kind: "directive", type: i10.ListSecondaryDirective, selector: "[fd-list-secondary], [fdListSecondary]", inputs: ["type"] }, { kind: "directive", type: i10.ListMessageDirective, selector: "[fd-list-message], [fdListMessage]", inputs: ["type", "class"] }, { kind: "component", type: i11.FormControlComponent, selector: "[fd-form-control]", inputs: ["state", "type", "class", "ariaLabel", "ariaLabelledBy"] }, { kind: "directive", type: i11.InputFormControlDirective, selector: "input[fd-form-control]" }, { kind: "component", type: i11.FormMessageComponent, selector: "fd-form-message", inputs: ["type", "static", "embedded", "class"] }, { kind: "component", type: i11.FormInputMessageGroupComponent, selector: "fd-form-input-message-group", inputs: ["triggers", "closeOnOutsideClick", "fillControlMode", "noArrow", "closeOnEscapeKey", "placement", "placementContainer", "isOpen"], outputs: ["isOpenChange"] }, { kind: "component", type: i12.PopoverControlComponent, selector: "fd-popover-control" }, { kind: "component", type: i12.PopoverBodyComponent, selector: "fd-popover-body" }, { kind: "component", type: i12.PopoverComponent, selector: "fd-popover", inputs: ["title", "trigger", "fixedPosition", "id", "mobile", "mobileConfig"] }, { kind: "directive", type: i13.AutoCompleteDirective, selector: "[fdp-auto-complete]", inputs: ["options", "inputText", "mobile"], outputs: ["onComplete"] }, { kind: "pipe", type: i3.SearchHighlightPipe, name: "highlight" }, { kind: "pipe", type: i14.FdTranslatePipe, name: "fdTranslate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
305
+ ], viewQueries: [{ propertyName: "mobileControlTemplate", first: true, predicate: ["mobileControlTemplate"], descendants: true }, { propertyName: "listTemplate", first: true, predicate: ["listTemplate"], descendants: true }, { propertyName: "_tokenizer", first: true, predicate: TokenizerComponent, descendants: true }], usesInheritance: true, ngImport: i0, template: "<div class=\"fdp-multi-combobox\">\n <ng-container [ngTemplateOutlet]=\"controlTemplate\" *ngIf=\"mobile\"></ng-container>\n\n <fd-popover\n *ngIf=\"!mobile\"\n additionalBodyClass=\"fd-popover-custom-list fdp-multi-combobox__list-container\"\n (isOpenChange)=\"popoverOpenChangeHandle($event)\"\n [isOpen]=\"isOpen\"\n [triggers]=\"[]\"\n [disabled]=\"disabled\"\n [fillControlMode]=\"fillControlMode\"\n >\n <fd-popover-control>\n <ng-container>\n <ng-container *ngTemplateOutlet=\"controlTemplate\"></ng-container>\n </ng-container>\n </fd-popover-control>\n <fd-popover-body [style.width.%]=\"!autoResize && 100\">\n <ng-container *ngTemplateOutlet=\"listTemplate\"></ng-container>\n <ng-content></ng-content>\n </fd-popover-body>\n </fd-popover>\n</div>\n\n<ng-template #controlTemplate>\n <fd-form-input-message-group>\n <fd-input-group\n [id]=\"id + '-input-group-container'\"\n class=\"fdp-multi-combobox-input-group-custom\"\n [state]=\"state\"\n [buttonFocusable]=\"buttonFocusable\"\n [button]=\"!readonly\"\n [glyph]=\"!readonly ? 'navigation-down-arrow' : ' '\"\n [isControl]=\"true\"\n [disabled]=\"disabled || readonly\"\n [isExpanded]=\"!mobile && isOpen && _suggestions.length > 0\"\n [attr.aria-disabled]=\"disabled || readonly\"\n [attr.aria-readonly]=\"readonly\"\n [glyphAriaLabel]=\"ariaLabel || ('platformMultiCombobox.inputGlyphAriaLabel' | fdTranslate)\"\n [iconTitle]=\"addonIconTitle || ('platformMultiCombobox.inputGlyphAriaLabel' | fdTranslate)\"\n (addOnButtonClicked)=\"_addOnClicked($event)\"\n (click)=\"mobile && !isOpen && onPrimaryButtonClick(false)\"\n (keydown)=\"navigateByTokens($event)\"\n >\n <fd-tokenizer\n #tokenizer\n [compactCollapse]=\"true\"\n *ngIf=\"_selectedSuggestions\"\n [tokenizerFocusable]=\"false\"\n class=\"fdp-multi-combobox-tokenizer-custom\"\n (moreClickedEvent)=\"moreClicked()\"\n >\n <fd-token\n [readOnly]=\"disabled\"\n (onCloseClick)=\"removeToken(token, $event)\"\n *ngFor=\"let token of _selectedSuggestions\"\n >\n {{ token.label }}\n </fd-token>\n\n <input\n #searchInputElement\n fdp-auto-complete\n (onComplete)=\"onCompleteTerm($event)\"\n [options]=\"_suggestions\"\n [inputText]=\"inputText\"\n [mobile]=\"mobile\"\n type=\"text\"\n role=\"combobox\"\n autocomplete=\"off\"\n [attr.aria-label]=\"ariaLabel\"\n [attr.aria-labelledby]=\"ariaLabelledBy\"\n [attr.aria-autocomplete]=\"autoComplete && !mobile ? 'list' : null\"\n [attr.aria-owns]=\"autoComplete && !mobile ? id + '-result' : null\"\n [attr.aria-haspopup]=\"autoComplete && !mobile\"\n fd-form-control\n fd-input-group-input\n tabindex=\"0\"\n [id]=\"id\"\n [name]=\"name\"\n (keydown)=\"onInputKeydownHandler($event)\"\n [disabled]=\"disabled\"\n [(ngModel)]=\"inputText\"\n (ngModelChange)=\"searchTermChanged()\"\n [placeholder]=\"placeholder\"\n (focus)=\"onTouched(); tokenizer._showAllTokens()\"\n (blur)=\"!mobile && onBlur($event); tokenizer._hideTokens()\"\n [attr.aria-expanded]=\"isOpen\"\n [readonly]=\"readonly\"\n [attr.aria-readonly]=\"readonly\"\n [attr.aria-required]=\"required\"\n class=\"fd-tokenizer__input\"\n />\n </fd-tokenizer>\n </fd-input-group>\n\n <fd-form-message\n *ngIf=\"mobile && isOpen ? false : !!stateMessage\"\n [type]=\"state\"\n [innerHtml]=\"stateMessage\"\n ></fd-form-message>\n </fd-form-input-message-group>\n</ng-template>\n\n<ng-template #mobileControlTemplate>\n <fd-input-group\n [id]=\"id + '-input-group-container'\"\n class=\"fdp-multi-combobox-input-group-custom\"\n [state]=\"state\"\n [buttonFocusable]=\"false\"\n [isControl]=\"true\"\n [disabled]=\"disabled || readonly\"\n [isExpanded]=\"!mobile && isOpen && _suggestions.length > 0\"\n [attr.aria-disabled]=\"disabled || readonly\"\n [attr.aria-readonly]=\"readonly\"\n [glyphAriaLabel]=\"ariaLabel\"\n >\n <input\n fdp-auto-complete\n (onComplete)=\"onCompleteTerm($event)\"\n [options]=\"_suggestions\"\n [inputText]=\"inputText\"\n [mobile]=\"mobile\"\n type=\"text\"\n role=\"combobox\"\n autocomplete=\"off\"\n [attr.aria-label]=\"ariaLabel\"\n [attr.aria-labelledby]=\"ariaLabelledBy\"\n [attr.aria-autocomplete]=\"autoComplete && !mobile ? 'list' : null\"\n [attr.aria-owns]=\"autoComplete && !mobile ? id + '-result' : null\"\n [attr.aria-haspopup]=\"autoComplete && !mobile\"\n fd-form-control\n fd-input-group-input\n tabindex=\"0\"\n [id]=\"id\"\n [name]=\"name\"\n (keydown)=\"onInputKeydownHandler($event)\"\n [disabled]=\"disabled\"\n [(ngModel)]=\"inputText\"\n (ngModelChange)=\"searchTermChanged()\"\n [placeholder]=\"placeholder\"\n (focus)=\"onTouched()\"\n (blur)=\"!mobile && onBlur($event)\"\n [attr.aria-expanded]=\"isOpen\"\n [readonly]=\"readonly\"\n [attr.aria-readonly]=\"readonly\"\n />\n </fd-input-group>\n</ng-template>\n\n<ng-template #listTemplate>\n <ul\n fd-list\n [hasMessage]=\"!!stateMessage\"\n (focusEscapeList)=\"handleListFocusEscape($event)\"\n [dropdownMode]=\"true\"\n class=\"fdp-multi-combobox__list fd-list--multi-input\"\n [hasMessage]=\"!!stateMessage || (!!advancedStateMessage?.hasErrors && !!advancedStateMessage?.template)\"\n [id]=\"id + '-result'\"\n role=\"listbox\"\n [style.maxHeight]=\"!mobile && maxHeight\"\n [style.minWidth]=\"!mobile && minWidth + 'px'\"\n [style.maxWidth]=\"autoResize && maxWidth + 'px'\"\n [attr.aria-labelledby]=\"id + '-search'\"\n aria-multiselectable=\"true\"\n >\n <li\n *ngIf=\"stateMessage\"\n [attr.aria-label]=\"stateMessage\"\n fd-list-message\n tabindex=\"-1\"\n role=\"presentation\"\n [type]=\"state || 'default'\"\n [innerHtml]=\"stateMessage\"\n ></li>\n\n <li\n *ngIf=\"advancedStateMessage?.hasErrors && advancedStateMessage?.template\"\n fd-list-message\n tabindex=\"-1\"\n role=\"presentation\"\n [type]=\"state || 'default'\"\n >\n <ng-template [ngTemplateOutlet]=\"advancedStateMessage!.template!\"></ng-template>\n </li>\n\n <ng-content></ng-content>\n <ng-container *ngIf=\"isGroup\">\n <ng-container *ngFor=\"let group of _suggestions\">\n <ng-container *ngIf=\"!groupItemTemplate\">\n <label fd-list-item fd-list-group-header role=\"group\">\n <span fd-list-title>{{ group.label }}</span>\n </label>\n </ng-container>\n\n <ng-container *ngIf=\"groupItemTemplate\">\n <ng-container\n [ngTemplateOutlet]=\"groupItemTemplate\"\n [ngTemplateOutletContext]=\"{ $implicit: { label: group.label } }\"\n ></ng-container>\n </ng-container>\n\n <li\n *ngFor=\"let optionItem of group.children; let i = index\"\n fd-list-item\n role=\"option\"\n [tabindex]=\"0\"\n (click)=\"!mobile && close()\"\n (keyDown)=\"onItemKeyDownHandler($event, i)\"\n [selected]=\"!!optionItem.selected\"\n >\n <fd-checkbox\n (click)=\"onOptionCheckboxClicked($event, i)\"\n (ngModelChange)=\"toggleSelection(optionItem)\"\n [ngModel]=\"optionItem.selected\"\n >\n </fd-checkbox>\n <ng-container\n [ngTemplateOutlet]=\"listItem\"\n [ngTemplateOutletContext]=\"{ optionItem: optionItem, index: i }\"\n ></ng-container>\n </li>\n </ng-container>\n </ng-container>\n\n <ng-container *ngIf=\"!isGroup\">\n <li\n *ngFor=\"let optionItem of _suggestions; let i = index\"\n fd-list-item\n role=\"option\"\n [tabindex]=\"0\"\n (click)=\"!mobile && onOptionClicked($event, i)\"\n (keyDown)=\"onItemKeyDownHandler($event, i)\"\n [selected]=\"!!optionItem.selected\"\n >\n <fd-checkbox\n (click)=\"onOptionCheckboxClicked($event, i)\"\n (ngModelChange)=\"toggleSelection(optionItem)\"\n [ngModel]=\"optionItem.selected\"\n >\n </fd-checkbox>\n <ng-container\n [ngTemplateOutlet]=\"listItem\"\n [ngTemplateOutletContext]=\"{ optionItem: optionItem, index: i }\"\n ></ng-container>\n </li>\n </ng-container>\n </ul>\n</ng-template>\n\n<ng-template let-optionItem=\"optionItem\" let-index=\"index\" #listItem>\n <ng-container\n *ngIf=\"optionItem.selected && !!selectedItemTemplate\"\n [ngTemplateOutlet]=\"selectedItemTemplate\"\n [ngTemplateOutletContext]=\"{ $implicit: optionItem.value, index: index }\"\n ></ng-container>\n\n <ng-container *ngIf=\"!(optionItem.selected && selectedItemTemplate)\">\n <ng-container\n [ngTemplateOutlet]=\"optionItemSource\"\n [ngTemplateOutletContext]=\"{ optionItem: optionItem, index: index }\"\n ></ng-container>\n\n <ng-container\n [ngTemplateOutlet]=\"secondaryTextSource\"\n [ngTemplateOutletContext]=\"{ optionItem: optionItem }\"\n ></ng-container>\n </ng-container>\n</ng-template>\n\n<ng-template let-optionItem=\"optionItem\" let-index=\"index\" #optionItemSource>\n <ng-container *ngIf=\"!optionItemTemplate\">\n <span\n fd-list-title\n [attr.title]=\"optionItem.label\"\n [innerHTML]=\"optionItem.label | highlight : inputText\"\n ></span>\n </ng-container>\n\n <ng-container *ngIf=\"optionItemTemplate\">\n <ng-container\n [ngTemplateOutlet]=\"optionItemTemplate\"\n [ngTemplateOutletContext]=\"{ $implicit: optionItem.value, index: index }\"\n ></ng-container>\n </ng-container>\n</ng-template>\n\n<ng-template let-optionItem=\"optionItem\" #secondaryTextSource>\n <ng-container *ngIf=\"showSecondaryText\">\n <ng-container *ngIf=\"!secondaryItemTemplate\">\n <span\n [style.text-align]=\"secondaryTextAlignment\"\n fd-list-secondary\n [attr.title]=\"optionItem.secondaryText\"\n [innerHTML]=\"optionItem.secondaryText | highlight : inputText\"\n ></span>\n </ng-container>\n\n <ng-container *ngIf=\"secondaryItemTemplate\">\n <ng-container\n [ngTemplateOutlet]=\"secondaryItemTemplate\"\n [ngTemplateOutletContext]=\"{ $implicit: optionItem.value }\"\n ></ng-container>\n </ng-container>\n </ng-container>\n</ng-template>\n", styles: ["/*!\n * Fundamental Library Styles v0.30.2-rc.6\n * Copyright (c) 2023 SAP SE or an SAP affiliate company.\n * Licensed under Apache License 2.0 (https://github.com/SAP/fundamental-styles/blob/main/LICENSE)\n */.fd-margin--tiny{margin:.5rem!important}.fd-margin--sm{margin:1rem!important}.fd-margin--md{margin:2rem!important}.fd-margin--lg{margin:3rem!important}.fd-margin--none{margin:0!important}.fd-margin-top--tiny{margin-top:.5rem!important}.fd-margin-top--sm{margin-top:1rem!important}.fd-margin-top--md{margin-top:2rem!important}.fd-margin-top--lg{margin-top:3rem!important}.fd-margin-top--none{margin-top:0!important}.fd-margin-end--tiny{margin-right:.5rem!important}.fd-margin-end--tiny[dir=rtl],[dir=rtl] .fd-margin-end--tiny{margin-left:.5rem!important;margin-right:0!important}.fd-margin-end--sm{margin-right:1rem!important}.fd-margin-end--sm[dir=rtl],[dir=rtl] .fd-margin-end--sm{margin-left:1rem!important;margin-right:0!important}.fd-margin-end--md{margin-right:2rem!important}.fd-margin-end--md[dir=rtl],[dir=rtl] .fd-margin-end--md{margin-left:2rem!important;margin-right:0!important}.fd-margin-end--lg{margin-right:3rem!important}.fd-margin-end--lg[dir=rtl],[dir=rtl] .fd-margin-end--lg{margin-left:3rem!important;margin-right:0!important}.fd-margin-end--none{margin-right:0}.fd-margin-end--none[dir=rtl],[dir=rtl] .fd-margin-end--none{margin-left:0!important}.fd-margin-bottom--tiny{margin-bottom:.5rem!important}.fd-margin-bottom--sm{margin-bottom:1rem!important}.fd-margin-bottom--md{margin-bottom:2rem!important}.fd-margin-bottom--lg{margin-bottom:3rem!important}.fd-margin-bottom--none{margin-bottom:0!important}.fd-margin-begin--tiny{margin-left:.5rem!important}.fd-margin-begin--tiny[dir=rtl],[dir=rtl] .fd-margin-begin--tiny{margin-left:0!important;margin-right:.5rem!important}.fd-margin-begin--sm{margin-left:1rem!important}.fd-margin-begin--sm[dir=rtl],[dir=rtl] .fd-margin-begin--sm{margin-left:0!important;margin-right:1rem!important}.fd-margin-begin--md{margin-left:2rem!important}.fd-margin-begin--md[dir=rtl],[dir=rtl] .fd-margin-begin--md{margin-left:0!important;margin-right:2rem!important}.fd-margin-begin--lg{margin-left:3rem!important}.fd-margin-begin--lg[dir=rtl],[dir=rtl] .fd-margin-begin--lg{margin-left:0!important;margin-right:3rem!important}.fd-margin-begin--none{margin-left:0}.fd-margin-begin--none[dir=rtl],[dir=rtl] .fd-margin-begin--none{margin-right:0!important}.fd-margin-top-bottom--tiny{margin-bottom:.5rem!important;margin-top:.5rem!important}.fd-margin-top-bottom--sm{margin-bottom:1rem!important;margin-top:1rem!important}.fd-margin-top-bottom--md{margin-bottom:2rem!important;margin-top:2rem!important}.fd-margin-top-bottom--lg{margin-bottom:3rem!important;margin-top:3rem!important}.fd-margin-begin-end--tiny{margin-left:.5rem!important;margin-right:.5rem!important}.fd-margin-begin-end--sm{margin-left:1rem!important;margin-right:1rem!important}.fd-margin-begin-end--md{margin-left:2rem!important;margin-right:2rem!important}.fd-margin-begin-end--lg{margin-left:3rem!important;margin-right:3rem!important}.fd-margin-responsive--sm{margin:0 0 1rem!important}.fd-margin-responsive--md{margin:1rem!important}.fd-margin-responsive--lg{margin:1rem 2rem!important}.fd-margin-responsive--xl{margin:1rem 3rem!important}.fd-margin-negative-begin-end--tiny{margin:0 -.5rem!important}.fd-margin-negative-begin-end--sm{margin:0 -1rem!important}.fd-margin-negative-begin-end--md{margin:0 -2rem!important}.fd-margin-negative-begin-end--lg{margin:0 -3rem!important}.fdp-multi-combobox-tokenizer-custom{width:calc(100% - 2.25rem)}.fdp-multi-combobox-tokenizer-custom--compact{width:calc(100% - 2rem)}.fdp-multi-combobox__list-container .fd-list .fd-list__item.fd-list__group-header{padding:0 1rem}.fdp-multi-combobox__list-container .fd-list .fd-list__item .fd-list__title{max-width:inherit}.fdp-multi-combobox__list-container .fd-list.fd-list--compact .fd-list__item.fd-list__group-header{padding:0 .5rem}\n"], dependencies: [{ kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: PopoverComponent, selector: "fd-popover", inputs: ["title", "trigger", "fixedPosition", "id", "mobile", "mobileConfig"] }, { kind: "component", type: PopoverControlComponent, selector: "fd-popover-control" }, { kind: "component", type: PopoverBodyComponent, selector: "fd-popover-body" }, { kind: "ngmodule", type: FormInputMessageGroupModule }, { kind: "component", type: i6.FormInputMessageGroupComponent, selector: "fd-form-input-message-group", inputs: ["triggers", "closeOnOutsideClick", "fillControlMode", "noArrow", "closeOnEscapeKey", "placement", "placementContainer", "isOpen"], outputs: ["isOpenChange"] }, { kind: "ngmodule", type: InputGroupModule }, { kind: "component", type: i7.InputGroupComponent, selector: "fd-input-group", inputs: ["placement", "required", "inline", "placeholder", "addOnText", "buttonFocusable", "type", "glyph", "button", "disabled", "readonly", "state", "isControl", "showFocus", "isExpanded", "glyphAriaLabel", "iconTitle", "ariaLabelledBy"], outputs: ["addOnButtonClicked", "search"] }, { kind: "directive", type: i7.InputGroupInputDirective, selector: "[fdInputGroupInput], [fd-input-group-input]", inputs: ["class"] }, { kind: "ngmodule", type: TokenModule }, { kind: "component", type: i8.TokenComponent, selector: "fd-token", inputs: ["disabled", "selected", "readOnly"], outputs: ["onCloseClick", "onRemove", "onTokenClick", "onTokenKeydown", "elementFocused"] }, { kind: "component", type: i8.TokenizerComponent, selector: "fd-tokenizer", inputs: ["class", "disableKeyboardDeletion", "compactCollapse", "tokenizerFocusable", "inputValue", "glyph", "moreTerm", "open"], outputs: ["moreClickedEvent"] }, { kind: "directive", type: NgFor, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "ngmodule", type: FormControlModule }, { kind: "component", type: i6.FormControlComponent, selector: "[fd-form-control]", inputs: ["state", "type", "class", "ariaLabel", "ariaLabelledBy"] }, { kind: "directive", type: i6.InputFormControlDirective, selector: "input[fd-form-control]" }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: AutoCompleteDirective, selector: "[fdp-auto-complete]", inputs: ["options", "inputText", "mobile"], outputs: ["onComplete"] }, { kind: "ngmodule", type: FormMessageModule }, { kind: "component", type: i6.FormMessageComponent, selector: "fd-form-message", inputs: ["type", "static", "embedded", "class"] }, { kind: "ngmodule", type: ListModule }, { kind: "component", type: i9.ListComponent, selector: "[fd-list], [fdList]", inputs: ["dropdownMode", "multiInputMode", "mobileMode", "hasMessage", "noBorder", "navigationIndicator", "selection", "keyboardSupport", "byline", "unreadIndicator"], outputs: ["focusEscapeList"] }, { kind: "component", type: i9.ListItemComponent, selector: "[fdListItem] ,[fd-list-item]", inputs: ["selected", "noData", "action", "interactive", "growing", "counter", "unread", "byline"], outputs: ["keyDown"] }, { kind: "directive", type: i9.ListTitleDirective, selector: "[fd-list-title], [fdListTitle]", inputs: ["wrap"] }, { kind: "directive", type: i9.ListGroupHeaderDirective, selector: "[fdListGroupHeader], [fd-list-group-header]", inputs: ["nativeElementId"], outputs: ["keyDown"] }, { kind: "directive", type: i9.ListSecondaryDirective, selector: "[fd-list-secondary], [fdListSecondary]", inputs: ["type"] }, { kind: "directive", type: i9.ListMessageDirective, selector: "[fd-list-message], [fdListMessage]", inputs: ["type", "class"] }, { kind: "component", type: CheckboxComponent, selector: "fd-checkbox", inputs: ["wrapLabel", "valignLabel", "ariaLabel", "value", "ariaLabelledBy", "ariaDescribedBy", "title", "inputId", "state", "name", "label", "disabled", "tristate", "tristateSelectable", "labelClass", "required", "displayOnly", "values", "standalone"], outputs: ["focusChange"] }, { kind: "pipe", type: SearchHighlightPipe, name: "highlight" }, { kind: "pipe", type: FdTranslatePipe, name: "fdTranslate" }, { kind: "ngmodule", type: ContentDensityModule }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
302
306
  }
303
307
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.0", ngImport: i0, type: MultiComboboxComponent, decorators: [{
304
308
  type: Component,
@@ -309,7 +313,28 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.0", ngImpor
309
313
  multi: true
310
314
  },
311
315
  contentDensityObserverProviders()
312
- ], template: "<div class=\"fdp-multi-combobox\">\n <ng-container [ngTemplateOutlet]=\"controlTemplate\" *ngIf=\"mobile\"></ng-container>\n\n <fd-popover\n *ngIf=\"!mobile\"\n additionalBodyClass=\"fd-popover-custom-list fdp-multi-combobox__list-container\"\n (isOpenChange)=\"popoverOpenChangeHandle($event)\"\n [isOpen]=\"isOpen\"\n [triggers]=\"[]\"\n [disabled]=\"disabled\"\n [fillControlMode]=\"fillControlMode\"\n >\n <fd-popover-control>\n <ng-container>\n <ng-container *ngTemplateOutlet=\"controlTemplate\"></ng-container>\n </ng-container>\n </fd-popover-control>\n <fd-popover-body [style.width.%]=\"!autoResize && 100\">\n <ng-container *ngTemplateOutlet=\"listTemplate\"></ng-container>\n <ng-content></ng-content>\n </fd-popover-body>\n </fd-popover>\n</div>\n\n<ng-template #controlTemplate>\n <fd-form-input-message-group>\n <fd-input-group\n [id]=\"id + '-input-group-container'\"\n class=\"fdp-multi-combobox-input-group-custom\"\n [state]=\"state\"\n [buttonFocusable]=\"buttonFocusable\"\n [button]=\"!readonly\"\n [glyph]=\"!readonly ? 'navigation-down-arrow' : ' '\"\n [isControl]=\"true\"\n [disabled]=\"disabled || readonly\"\n [isExpanded]=\"!mobile && isOpen && _suggestions.length > 0\"\n [attr.aria-disabled]=\"disabled || readonly\"\n [attr.aria-readonly]=\"readonly\"\n [glyphAriaLabel]=\"ariaLabel || ('platformMultiCombobox.inputGlyphAriaLabel' | fdTranslate)\"\n [iconTitle]=\"addonIconTitle || ('platformMultiCombobox.inputGlyphAriaLabel' | fdTranslate)\"\n (addOnButtonClicked)=\"_addOnClicked($event)\"\n (click)=\"mobile && !isOpen && onPrimaryButtonClick(false)\"\n (keydown)=\"navigateByTokens($event)\"\n >\n <fd-tokenizer\n #tokenizer\n [compactCollapse]=\"true\"\n *ngIf=\"_selectedSuggestions\"\n [tokenizerFocusable]=\"false\"\n class=\"fdp-multi-combobox-tokenizer-custom\"\n (moreClickedEvent)=\"moreClicked()\"\n >\n <fd-token\n [readOnly]=\"disabled\"\n (onCloseClick)=\"removeToken(token, $event)\"\n *ngFor=\"let token of _selectedSuggestions\"\n >\n {{ token.label }}\n </fd-token>\n\n <input\n #searchInputElement\n fdp-auto-complete\n (onComplete)=\"onCompleteTerm($event)\"\n [options]=\"_suggestions\"\n [inputText]=\"inputText\"\n [mobile]=\"mobile\"\n type=\"text\"\n role=\"combobox\"\n autocomplete=\"off\"\n [attr.aria-label]=\"ariaLabel\"\n [attr.aria-labelledby]=\"ariaLabelledBy\"\n [attr.aria-autocomplete]=\"autoComplete && !mobile ? 'list' : null\"\n [attr.aria-owns]=\"autoComplete && !mobile ? id + '-result' : null\"\n [attr.aria-haspopup]=\"autoComplete && !mobile\"\n fd-form-control\n fd-input-group-input\n tabindex=\"0\"\n [id]=\"id\"\n [name]=\"name\"\n (keydown)=\"onInputKeydownHandler($event)\"\n [disabled]=\"disabled\"\n [(ngModel)]=\"inputText\"\n (ngModelChange)=\"searchTermChanged()\"\n [placeholder]=\"placeholder\"\n (focus)=\"onTouched(); tokenizer._showAllTokens()\"\n (blur)=\"!mobile && onBlur($event); tokenizer._hideTokens()\"\n [attr.aria-expanded]=\"isOpen\"\n [readonly]=\"readonly\"\n [attr.aria-readonly]=\"readonly\"\n [attr.aria-required]=\"required\"\n class=\"fd-tokenizer__input\"\n />\n </fd-tokenizer>\n </fd-input-group>\n\n <fd-form-message\n *ngIf=\"mobile && isOpen ? false : !!stateMessage\"\n [type]=\"state\"\n [innerHtml]=\"stateMessage\"\n ></fd-form-message>\n </fd-form-input-message-group>\n</ng-template>\n\n<ng-template #mobileControlTemplate>\n <fd-input-group\n [id]=\"id + '-input-group-container'\"\n class=\"fdp-multi-combobox-input-group-custom\"\n [state]=\"state\"\n [buttonFocusable]=\"false\"\n [isControl]=\"true\"\n [disabled]=\"disabled || readonly\"\n [isExpanded]=\"!mobile && isOpen && _suggestions.length > 0\"\n [attr.aria-disabled]=\"disabled || readonly\"\n [attr.aria-readonly]=\"readonly\"\n [glyphAriaLabel]=\"ariaLabel\"\n >\n <input\n fdp-auto-complete\n (onComplete)=\"onCompleteTerm($event)\"\n [options]=\"_suggestions\"\n [inputText]=\"inputText\"\n [mobile]=\"mobile\"\n type=\"text\"\n role=\"combobox\"\n autocomplete=\"off\"\n [attr.aria-label]=\"ariaLabel\"\n [attr.aria-labelledby]=\"ariaLabelledBy\"\n [attr.aria-autocomplete]=\"autoComplete && !mobile ? 'list' : null\"\n [attr.aria-owns]=\"autoComplete && !mobile ? id + '-result' : null\"\n [attr.aria-haspopup]=\"autoComplete && !mobile\"\n fd-form-control\n fd-input-group-input\n tabindex=\"0\"\n [id]=\"id\"\n [name]=\"name\"\n (keydown)=\"onInputKeydownHandler($event)\"\n [disabled]=\"disabled\"\n [(ngModel)]=\"inputText\"\n (ngModelChange)=\"searchTermChanged()\"\n [placeholder]=\"placeholder\"\n (focus)=\"onTouched()\"\n (blur)=\"!mobile && onBlur($event)\"\n [attr.aria-expanded]=\"isOpen\"\n [readonly]=\"readonly\"\n [attr.aria-readonly]=\"readonly\"\n />\n </fd-input-group>\n</ng-template>\n\n<ng-template #listTemplate>\n <ul\n fd-list\n [hasMessage]=\"!!stateMessage\"\n (focusEscapeList)=\"handleListFocusEscape($event)\"\n [dropdownMode]=\"true\"\n class=\"fdp-multi-combobox__list fd-list--multi-input\"\n [id]=\"id + '-result'\"\n role=\"listbox\"\n [style.maxHeight]=\"!mobile && maxHeight\"\n [style.minWidth]=\"!mobile && minWidth + 'px'\"\n [style.maxWidth]=\"autoResize && maxWidth + 'px'\"\n [attr.aria-labelledby]=\"id + '-search'\"\n aria-multiselectable=\"true\"\n >\n <li\n *ngIf=\"stateMessage\"\n [attr.aria-label]=\"stateMessage\"\n fd-list-message\n tabindex=\"-1\"\n role=\"presentation\"\n [type]=\"state || 'default'\"\n [innerHtml]=\"stateMessage\"\n ></li>\n\n <ng-content></ng-content>\n <ng-container *ngIf=\"isGroup\">\n <ng-container *ngFor=\"let group of _suggestions\">\n <ng-container *ngIf=\"!groupItemTemplate\">\n <label fd-list-item fd-list-group-header role=\"group\">\n <span fd-list-title>{{ group.label }}</span>\n </label>\n </ng-container>\n\n <ng-container *ngIf=\"groupItemTemplate\">\n <ng-container\n [ngTemplateOutlet]=\"groupItemTemplate\"\n [ngTemplateOutletContext]=\"{ $implicit: { label: group.label } }\"\n ></ng-container>\n </ng-container>\n\n <li\n *ngFor=\"let optionItem of group.children; let i = index\"\n fd-list-item\n role=\"option\"\n [tabindex]=\"0\"\n (click)=\"!mobile && close()\"\n (keyDown)=\"onItemKeyDownHandler($event, i)\"\n [selected]=\"!!optionItem.selected\"\n >\n <fd-checkbox\n (click)=\"onOptionCheckboxClicked($event, i)\"\n (ngModelChange)=\"toggleSelection(optionItem)\"\n [ngModel]=\"optionItem.selected\"\n >\n </fd-checkbox>\n <ng-container\n [ngTemplateOutlet]=\"listItem\"\n [ngTemplateOutletContext]=\"{ optionItem: optionItem, index: i }\"\n ></ng-container>\n </li>\n </ng-container>\n </ng-container>\n\n <ng-container *ngIf=\"!isGroup\">\n <li\n *ngFor=\"let optionItem of _suggestions; let i = index\"\n fd-list-item\n role=\"option\"\n [tabindex]=\"0\"\n (click)=\"!mobile && onOptionClicked($event, i)\"\n (keyDown)=\"onItemKeyDownHandler($event, i)\"\n [selected]=\"!!optionItem.selected\"\n >\n <fd-checkbox\n (click)=\"onOptionCheckboxClicked($event, i)\"\n (ngModelChange)=\"toggleSelection(optionItem)\"\n [ngModel]=\"optionItem.selected\"\n >\n </fd-checkbox>\n <ng-container\n [ngTemplateOutlet]=\"listItem\"\n [ngTemplateOutletContext]=\"{ optionItem: optionItem, index: i }\"\n ></ng-container>\n </li>\n </ng-container>\n </ul>\n</ng-template>\n\n<ng-template let-optionItem=\"optionItem\" let-index=\"index\" #listItem>\n <ng-container\n *ngIf=\"optionItem.selected && !!selectedItemTemplate\"\n [ngTemplateOutlet]=\"selectedItemTemplate\"\n [ngTemplateOutletContext]=\"{ $implicit: optionItem.value, index: index }\"\n ></ng-container>\n\n <ng-container *ngIf=\"!(optionItem.selected && selectedItemTemplate)\">\n <ng-container\n [ngTemplateOutlet]=\"optionItemSource\"\n [ngTemplateOutletContext]=\"{ optionItem: optionItem, index: index }\"\n ></ng-container>\n\n <ng-container\n [ngTemplateOutlet]=\"secondaryTextSource\"\n [ngTemplateOutletContext]=\"{ optionItem: optionItem }\"\n ></ng-container>\n </ng-container>\n</ng-template>\n\n<ng-template let-optionItem=\"optionItem\" let-index=\"index\" #optionItemSource>\n <ng-container *ngIf=\"!optionItemTemplate\">\n <span\n fd-list-title\n [attr.title]=\"optionItem.label\"\n [innerHTML]=\"optionItem.label | highlight : inputText\"\n ></span>\n </ng-container>\n\n <ng-container *ngIf=\"optionItemTemplate\">\n <ng-container\n [ngTemplateOutlet]=\"optionItemTemplate\"\n [ngTemplateOutletContext]=\"{ $implicit: optionItem.value, index: index }\"\n ></ng-container>\n </ng-container>\n</ng-template>\n\n<ng-template let-optionItem=\"optionItem\" #secondaryTextSource>\n <ng-container *ngIf=\"showSecondaryText\">\n <ng-container *ngIf=\"!secondaryItemTemplate\">\n <span\n [style.text-align]=\"secondaryTextAlignment\"\n fd-list-secondary\n [attr.title]=\"optionItem.secondaryText\"\n [innerHTML]=\"optionItem.secondaryText | highlight : inputText\"\n ></span>\n </ng-container>\n\n <ng-container *ngIf=\"secondaryItemTemplate\">\n <ng-container\n [ngTemplateOutlet]=\"secondaryItemTemplate\"\n [ngTemplateOutletContext]=\"{ $implicit: optionItem.value }\"\n ></ng-container>\n </ng-container>\n </ng-container>\n</ng-template>\n", styles: ["/*!\n * Fundamental Library Styles v0.30.2-rc.6\n * Copyright (c) 2023 SAP SE or an SAP affiliate company.\n * Licensed under Apache License 2.0 (https://github.com/SAP/fundamental-styles/blob/main/LICENSE)\n */.fd-margin--tiny{margin:.5rem!important}.fd-margin--sm{margin:1rem!important}.fd-margin--md{margin:2rem!important}.fd-margin--lg{margin:3rem!important}.fd-margin--none{margin:0!important}.fd-margin-top--tiny{margin-top:.5rem!important}.fd-margin-top--sm{margin-top:1rem!important}.fd-margin-top--md{margin-top:2rem!important}.fd-margin-top--lg{margin-top:3rem!important}.fd-margin-top--none{margin-top:0!important}.fd-margin-end--tiny{margin-right:.5rem!important}.fd-margin-end--tiny[dir=rtl],[dir=rtl] .fd-margin-end--tiny{margin-left:.5rem!important;margin-right:0!important}.fd-margin-end--sm{margin-right:1rem!important}.fd-margin-end--sm[dir=rtl],[dir=rtl] .fd-margin-end--sm{margin-left:1rem!important;margin-right:0!important}.fd-margin-end--md{margin-right:2rem!important}.fd-margin-end--md[dir=rtl],[dir=rtl] .fd-margin-end--md{margin-left:2rem!important;margin-right:0!important}.fd-margin-end--lg{margin-right:3rem!important}.fd-margin-end--lg[dir=rtl],[dir=rtl] .fd-margin-end--lg{margin-left:3rem!important;margin-right:0!important}.fd-margin-end--none{margin-right:0}.fd-margin-end--none[dir=rtl],[dir=rtl] .fd-margin-end--none{margin-left:0!important}.fd-margin-bottom--tiny{margin-bottom:.5rem!important}.fd-margin-bottom--sm{margin-bottom:1rem!important}.fd-margin-bottom--md{margin-bottom:2rem!important}.fd-margin-bottom--lg{margin-bottom:3rem!important}.fd-margin-bottom--none{margin-bottom:0!important}.fd-margin-begin--tiny{margin-left:.5rem!important}.fd-margin-begin--tiny[dir=rtl],[dir=rtl] .fd-margin-begin--tiny{margin-left:0!important;margin-right:.5rem!important}.fd-margin-begin--sm{margin-left:1rem!important}.fd-margin-begin--sm[dir=rtl],[dir=rtl] .fd-margin-begin--sm{margin-left:0!important;margin-right:1rem!important}.fd-margin-begin--md{margin-left:2rem!important}.fd-margin-begin--md[dir=rtl],[dir=rtl] .fd-margin-begin--md{margin-left:0!important;margin-right:2rem!important}.fd-margin-begin--lg{margin-left:3rem!important}.fd-margin-begin--lg[dir=rtl],[dir=rtl] .fd-margin-begin--lg{margin-left:0!important;margin-right:3rem!important}.fd-margin-begin--none{margin-left:0}.fd-margin-begin--none[dir=rtl],[dir=rtl] .fd-margin-begin--none{margin-right:0!important}.fd-margin-top-bottom--tiny{margin-bottom:.5rem!important;margin-top:.5rem!important}.fd-margin-top-bottom--sm{margin-bottom:1rem!important;margin-top:1rem!important}.fd-margin-top-bottom--md{margin-bottom:2rem!important;margin-top:2rem!important}.fd-margin-top-bottom--lg{margin-bottom:3rem!important;margin-top:3rem!important}.fd-margin-begin-end--tiny{margin-left:.5rem!important;margin-right:.5rem!important}.fd-margin-begin-end--sm{margin-left:1rem!important;margin-right:1rem!important}.fd-margin-begin-end--md{margin-left:2rem!important;margin-right:2rem!important}.fd-margin-begin-end--lg{margin-left:3rem!important;margin-right:3rem!important}.fd-margin-responsive--sm{margin:0 0 1rem!important}.fd-margin-responsive--md{margin:1rem!important}.fd-margin-responsive--lg{margin:1rem 2rem!important}.fd-margin-responsive--xl{margin:1rem 3rem!important}.fd-margin-negative-begin-end--tiny{margin:0 -.5rem!important}.fd-margin-negative-begin-end--sm{margin:0 -1rem!important}.fd-margin-negative-begin-end--md{margin:0 -2rem!important}.fd-margin-negative-begin-end--lg{margin:0 -3rem!important}.fdp-multi-combobox-tokenizer-custom{width:calc(100% - 2.25rem)}.fdp-multi-combobox-tokenizer-custom--compact{width:calc(100% - 2rem)}.fdp-multi-combobox__list-container .fd-list .fd-list__item.fd-list__group-header{padding:0 1rem}.fdp-multi-combobox__list-container .fd-list .fd-list__item .fd-list__title{max-width:inherit}.fdp-multi-combobox__list-container .fd-list.fd-list--compact .fd-list__item.fd-list__group-header{padding:0 .5rem}\n"] }]
316
+ ], standalone: true, imports: [
317
+ NgIf,
318
+ NgTemplateOutlet,
319
+ PopoverComponent,
320
+ PopoverControlComponent,
321
+ PopoverBodyComponent,
322
+ FormInputMessageGroupModule,
323
+ InputGroupModule,
324
+ TokenModule,
325
+ NgFor,
326
+ FormControlModule,
327
+ FormsModule,
328
+ AutoCompleteDirective,
329
+ FormMessageModule,
330
+ ListModule,
331
+ CheckboxComponent,
332
+ NgClass,
333
+ ListSecondaryDirective,
334
+ SearchHighlightPipe,
335
+ FdTranslatePipe,
336
+ ContentDensityModule
337
+ ], template: "<div class=\"fdp-multi-combobox\">\n <ng-container [ngTemplateOutlet]=\"controlTemplate\" *ngIf=\"mobile\"></ng-container>\n\n <fd-popover\n *ngIf=\"!mobile\"\n additionalBodyClass=\"fd-popover-custom-list fdp-multi-combobox__list-container\"\n (isOpenChange)=\"popoverOpenChangeHandle($event)\"\n [isOpen]=\"isOpen\"\n [triggers]=\"[]\"\n [disabled]=\"disabled\"\n [fillControlMode]=\"fillControlMode\"\n >\n <fd-popover-control>\n <ng-container>\n <ng-container *ngTemplateOutlet=\"controlTemplate\"></ng-container>\n </ng-container>\n </fd-popover-control>\n <fd-popover-body [style.width.%]=\"!autoResize && 100\">\n <ng-container *ngTemplateOutlet=\"listTemplate\"></ng-container>\n <ng-content></ng-content>\n </fd-popover-body>\n </fd-popover>\n</div>\n\n<ng-template #controlTemplate>\n <fd-form-input-message-group>\n <fd-input-group\n [id]=\"id + '-input-group-container'\"\n class=\"fdp-multi-combobox-input-group-custom\"\n [state]=\"state\"\n [buttonFocusable]=\"buttonFocusable\"\n [button]=\"!readonly\"\n [glyph]=\"!readonly ? 'navigation-down-arrow' : ' '\"\n [isControl]=\"true\"\n [disabled]=\"disabled || readonly\"\n [isExpanded]=\"!mobile && isOpen && _suggestions.length > 0\"\n [attr.aria-disabled]=\"disabled || readonly\"\n [attr.aria-readonly]=\"readonly\"\n [glyphAriaLabel]=\"ariaLabel || ('platformMultiCombobox.inputGlyphAriaLabel' | fdTranslate)\"\n [iconTitle]=\"addonIconTitle || ('platformMultiCombobox.inputGlyphAriaLabel' | fdTranslate)\"\n (addOnButtonClicked)=\"_addOnClicked($event)\"\n (click)=\"mobile && !isOpen && onPrimaryButtonClick(false)\"\n (keydown)=\"navigateByTokens($event)\"\n >\n <fd-tokenizer\n #tokenizer\n [compactCollapse]=\"true\"\n *ngIf=\"_selectedSuggestions\"\n [tokenizerFocusable]=\"false\"\n class=\"fdp-multi-combobox-tokenizer-custom\"\n (moreClickedEvent)=\"moreClicked()\"\n >\n <fd-token\n [readOnly]=\"disabled\"\n (onCloseClick)=\"removeToken(token, $event)\"\n *ngFor=\"let token of _selectedSuggestions\"\n >\n {{ token.label }}\n </fd-token>\n\n <input\n #searchInputElement\n fdp-auto-complete\n (onComplete)=\"onCompleteTerm($event)\"\n [options]=\"_suggestions\"\n [inputText]=\"inputText\"\n [mobile]=\"mobile\"\n type=\"text\"\n role=\"combobox\"\n autocomplete=\"off\"\n [attr.aria-label]=\"ariaLabel\"\n [attr.aria-labelledby]=\"ariaLabelledBy\"\n [attr.aria-autocomplete]=\"autoComplete && !mobile ? 'list' : null\"\n [attr.aria-owns]=\"autoComplete && !mobile ? id + '-result' : null\"\n [attr.aria-haspopup]=\"autoComplete && !mobile\"\n fd-form-control\n fd-input-group-input\n tabindex=\"0\"\n [id]=\"id\"\n [name]=\"name\"\n (keydown)=\"onInputKeydownHandler($event)\"\n [disabled]=\"disabled\"\n [(ngModel)]=\"inputText\"\n (ngModelChange)=\"searchTermChanged()\"\n [placeholder]=\"placeholder\"\n (focus)=\"onTouched(); tokenizer._showAllTokens()\"\n (blur)=\"!mobile && onBlur($event); tokenizer._hideTokens()\"\n [attr.aria-expanded]=\"isOpen\"\n [readonly]=\"readonly\"\n [attr.aria-readonly]=\"readonly\"\n [attr.aria-required]=\"required\"\n class=\"fd-tokenizer__input\"\n />\n </fd-tokenizer>\n </fd-input-group>\n\n <fd-form-message\n *ngIf=\"mobile && isOpen ? false : !!stateMessage\"\n [type]=\"state\"\n [innerHtml]=\"stateMessage\"\n ></fd-form-message>\n </fd-form-input-message-group>\n</ng-template>\n\n<ng-template #mobileControlTemplate>\n <fd-input-group\n [id]=\"id + '-input-group-container'\"\n class=\"fdp-multi-combobox-input-group-custom\"\n [state]=\"state\"\n [buttonFocusable]=\"false\"\n [isControl]=\"true\"\n [disabled]=\"disabled || readonly\"\n [isExpanded]=\"!mobile && isOpen && _suggestions.length > 0\"\n [attr.aria-disabled]=\"disabled || readonly\"\n [attr.aria-readonly]=\"readonly\"\n [glyphAriaLabel]=\"ariaLabel\"\n >\n <input\n fdp-auto-complete\n (onComplete)=\"onCompleteTerm($event)\"\n [options]=\"_suggestions\"\n [inputText]=\"inputText\"\n [mobile]=\"mobile\"\n type=\"text\"\n role=\"combobox\"\n autocomplete=\"off\"\n [attr.aria-label]=\"ariaLabel\"\n [attr.aria-labelledby]=\"ariaLabelledBy\"\n [attr.aria-autocomplete]=\"autoComplete && !mobile ? 'list' : null\"\n [attr.aria-owns]=\"autoComplete && !mobile ? id + '-result' : null\"\n [attr.aria-haspopup]=\"autoComplete && !mobile\"\n fd-form-control\n fd-input-group-input\n tabindex=\"0\"\n [id]=\"id\"\n [name]=\"name\"\n (keydown)=\"onInputKeydownHandler($event)\"\n [disabled]=\"disabled\"\n [(ngModel)]=\"inputText\"\n (ngModelChange)=\"searchTermChanged()\"\n [placeholder]=\"placeholder\"\n (focus)=\"onTouched()\"\n (blur)=\"!mobile && onBlur($event)\"\n [attr.aria-expanded]=\"isOpen\"\n [readonly]=\"readonly\"\n [attr.aria-readonly]=\"readonly\"\n />\n </fd-input-group>\n</ng-template>\n\n<ng-template #listTemplate>\n <ul\n fd-list\n [hasMessage]=\"!!stateMessage\"\n (focusEscapeList)=\"handleListFocusEscape($event)\"\n [dropdownMode]=\"true\"\n class=\"fdp-multi-combobox__list fd-list--multi-input\"\n [hasMessage]=\"!!stateMessage || (!!advancedStateMessage?.hasErrors && !!advancedStateMessage?.template)\"\n [id]=\"id + '-result'\"\n role=\"listbox\"\n [style.maxHeight]=\"!mobile && maxHeight\"\n [style.minWidth]=\"!mobile && minWidth + 'px'\"\n [style.maxWidth]=\"autoResize && maxWidth + 'px'\"\n [attr.aria-labelledby]=\"id + '-search'\"\n aria-multiselectable=\"true\"\n >\n <li\n *ngIf=\"stateMessage\"\n [attr.aria-label]=\"stateMessage\"\n fd-list-message\n tabindex=\"-1\"\n role=\"presentation\"\n [type]=\"state || 'default'\"\n [innerHtml]=\"stateMessage\"\n ></li>\n\n <li\n *ngIf=\"advancedStateMessage?.hasErrors && advancedStateMessage?.template\"\n fd-list-message\n tabindex=\"-1\"\n role=\"presentation\"\n [type]=\"state || 'default'\"\n >\n <ng-template [ngTemplateOutlet]=\"advancedStateMessage!.template!\"></ng-template>\n </li>\n\n <ng-content></ng-content>\n <ng-container *ngIf=\"isGroup\">\n <ng-container *ngFor=\"let group of _suggestions\">\n <ng-container *ngIf=\"!groupItemTemplate\">\n <label fd-list-item fd-list-group-header role=\"group\">\n <span fd-list-title>{{ group.label }}</span>\n </label>\n </ng-container>\n\n <ng-container *ngIf=\"groupItemTemplate\">\n <ng-container\n [ngTemplateOutlet]=\"groupItemTemplate\"\n [ngTemplateOutletContext]=\"{ $implicit: { label: group.label } }\"\n ></ng-container>\n </ng-container>\n\n <li\n *ngFor=\"let optionItem of group.children; let i = index\"\n fd-list-item\n role=\"option\"\n [tabindex]=\"0\"\n (click)=\"!mobile && close()\"\n (keyDown)=\"onItemKeyDownHandler($event, i)\"\n [selected]=\"!!optionItem.selected\"\n >\n <fd-checkbox\n (click)=\"onOptionCheckboxClicked($event, i)\"\n (ngModelChange)=\"toggleSelection(optionItem)\"\n [ngModel]=\"optionItem.selected\"\n >\n </fd-checkbox>\n <ng-container\n [ngTemplateOutlet]=\"listItem\"\n [ngTemplateOutletContext]=\"{ optionItem: optionItem, index: i }\"\n ></ng-container>\n </li>\n </ng-container>\n </ng-container>\n\n <ng-container *ngIf=\"!isGroup\">\n <li\n *ngFor=\"let optionItem of _suggestions; let i = index\"\n fd-list-item\n role=\"option\"\n [tabindex]=\"0\"\n (click)=\"!mobile && onOptionClicked($event, i)\"\n (keyDown)=\"onItemKeyDownHandler($event, i)\"\n [selected]=\"!!optionItem.selected\"\n >\n <fd-checkbox\n (click)=\"onOptionCheckboxClicked($event, i)\"\n (ngModelChange)=\"toggleSelection(optionItem)\"\n [ngModel]=\"optionItem.selected\"\n >\n </fd-checkbox>\n <ng-container\n [ngTemplateOutlet]=\"listItem\"\n [ngTemplateOutletContext]=\"{ optionItem: optionItem, index: i }\"\n ></ng-container>\n </li>\n </ng-container>\n </ul>\n</ng-template>\n\n<ng-template let-optionItem=\"optionItem\" let-index=\"index\" #listItem>\n <ng-container\n *ngIf=\"optionItem.selected && !!selectedItemTemplate\"\n [ngTemplateOutlet]=\"selectedItemTemplate\"\n [ngTemplateOutletContext]=\"{ $implicit: optionItem.value, index: index }\"\n ></ng-container>\n\n <ng-container *ngIf=\"!(optionItem.selected && selectedItemTemplate)\">\n <ng-container\n [ngTemplateOutlet]=\"optionItemSource\"\n [ngTemplateOutletContext]=\"{ optionItem: optionItem, index: index }\"\n ></ng-container>\n\n <ng-container\n [ngTemplateOutlet]=\"secondaryTextSource\"\n [ngTemplateOutletContext]=\"{ optionItem: optionItem }\"\n ></ng-container>\n </ng-container>\n</ng-template>\n\n<ng-template let-optionItem=\"optionItem\" let-index=\"index\" #optionItemSource>\n <ng-container *ngIf=\"!optionItemTemplate\">\n <span\n fd-list-title\n [attr.title]=\"optionItem.label\"\n [innerHTML]=\"optionItem.label | highlight : inputText\"\n ></span>\n </ng-container>\n\n <ng-container *ngIf=\"optionItemTemplate\">\n <ng-container\n [ngTemplateOutlet]=\"optionItemTemplate\"\n [ngTemplateOutletContext]=\"{ $implicit: optionItem.value, index: index }\"\n ></ng-container>\n </ng-container>\n</ng-template>\n\n<ng-template let-optionItem=\"optionItem\" #secondaryTextSource>\n <ng-container *ngIf=\"showSecondaryText\">\n <ng-container *ngIf=\"!secondaryItemTemplate\">\n <span\n [style.text-align]=\"secondaryTextAlignment\"\n fd-list-secondary\n [attr.title]=\"optionItem.secondaryText\"\n [innerHTML]=\"optionItem.secondaryText | highlight : inputText\"\n ></span>\n </ng-container>\n\n <ng-container *ngIf=\"secondaryItemTemplate\">\n <ng-container\n [ngTemplateOutlet]=\"secondaryItemTemplate\"\n [ngTemplateOutletContext]=\"{ $implicit: optionItem.value }\"\n ></ng-container>\n </ng-container>\n </ng-container>\n</ng-template>\n", styles: ["/*!\n * Fundamental Library Styles v0.30.2-rc.6\n * Copyright (c) 2023 SAP SE or an SAP affiliate company.\n * Licensed under Apache License 2.0 (https://github.com/SAP/fundamental-styles/blob/main/LICENSE)\n */.fd-margin--tiny{margin:.5rem!important}.fd-margin--sm{margin:1rem!important}.fd-margin--md{margin:2rem!important}.fd-margin--lg{margin:3rem!important}.fd-margin--none{margin:0!important}.fd-margin-top--tiny{margin-top:.5rem!important}.fd-margin-top--sm{margin-top:1rem!important}.fd-margin-top--md{margin-top:2rem!important}.fd-margin-top--lg{margin-top:3rem!important}.fd-margin-top--none{margin-top:0!important}.fd-margin-end--tiny{margin-right:.5rem!important}.fd-margin-end--tiny[dir=rtl],[dir=rtl] .fd-margin-end--tiny{margin-left:.5rem!important;margin-right:0!important}.fd-margin-end--sm{margin-right:1rem!important}.fd-margin-end--sm[dir=rtl],[dir=rtl] .fd-margin-end--sm{margin-left:1rem!important;margin-right:0!important}.fd-margin-end--md{margin-right:2rem!important}.fd-margin-end--md[dir=rtl],[dir=rtl] .fd-margin-end--md{margin-left:2rem!important;margin-right:0!important}.fd-margin-end--lg{margin-right:3rem!important}.fd-margin-end--lg[dir=rtl],[dir=rtl] .fd-margin-end--lg{margin-left:3rem!important;margin-right:0!important}.fd-margin-end--none{margin-right:0}.fd-margin-end--none[dir=rtl],[dir=rtl] .fd-margin-end--none{margin-left:0!important}.fd-margin-bottom--tiny{margin-bottom:.5rem!important}.fd-margin-bottom--sm{margin-bottom:1rem!important}.fd-margin-bottom--md{margin-bottom:2rem!important}.fd-margin-bottom--lg{margin-bottom:3rem!important}.fd-margin-bottom--none{margin-bottom:0!important}.fd-margin-begin--tiny{margin-left:.5rem!important}.fd-margin-begin--tiny[dir=rtl],[dir=rtl] .fd-margin-begin--tiny{margin-left:0!important;margin-right:.5rem!important}.fd-margin-begin--sm{margin-left:1rem!important}.fd-margin-begin--sm[dir=rtl],[dir=rtl] .fd-margin-begin--sm{margin-left:0!important;margin-right:1rem!important}.fd-margin-begin--md{margin-left:2rem!important}.fd-margin-begin--md[dir=rtl],[dir=rtl] .fd-margin-begin--md{margin-left:0!important;margin-right:2rem!important}.fd-margin-begin--lg{margin-left:3rem!important}.fd-margin-begin--lg[dir=rtl],[dir=rtl] .fd-margin-begin--lg{margin-left:0!important;margin-right:3rem!important}.fd-margin-begin--none{margin-left:0}.fd-margin-begin--none[dir=rtl],[dir=rtl] .fd-margin-begin--none{margin-right:0!important}.fd-margin-top-bottom--tiny{margin-bottom:.5rem!important;margin-top:.5rem!important}.fd-margin-top-bottom--sm{margin-bottom:1rem!important;margin-top:1rem!important}.fd-margin-top-bottom--md{margin-bottom:2rem!important;margin-top:2rem!important}.fd-margin-top-bottom--lg{margin-bottom:3rem!important;margin-top:3rem!important}.fd-margin-begin-end--tiny{margin-left:.5rem!important;margin-right:.5rem!important}.fd-margin-begin-end--sm{margin-left:1rem!important;margin-right:1rem!important}.fd-margin-begin-end--md{margin-left:2rem!important;margin-right:2rem!important}.fd-margin-begin-end--lg{margin-left:3rem!important;margin-right:3rem!important}.fd-margin-responsive--sm{margin:0 0 1rem!important}.fd-margin-responsive--md{margin:1rem!important}.fd-margin-responsive--lg{margin:1rem 2rem!important}.fd-margin-responsive--xl{margin:1rem 3rem!important}.fd-margin-negative-begin-end--tiny{margin:0 -.5rem!important}.fd-margin-negative-begin-end--sm{margin:0 -1rem!important}.fd-margin-negative-begin-end--md{margin:0 -2rem!important}.fd-margin-negative-begin-end--lg{margin:0 -3rem!important}.fdp-multi-combobox-tokenizer-custom{width:calc(100% - 2.25rem)}.fdp-multi-combobox-tokenizer-custom--compact{width:calc(100% - 2rem)}.fdp-multi-combobox__list-container .fd-list .fd-list__item.fd-list__group-header{padding:0 1rem}.fdp-multi-combobox__list-container .fd-list .fd-list__item .fd-list__title{max-width:inherit}.fdp-multi-combobox__list-container .fd-list.fd-list--compact .fd-list__item.fd-list__group-header{padding:0 .5rem}\n"] }]
313
338
  }], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }, { type: i0.ElementRef }, { type: i1.NgControl, decorators: [{
314
339
  type: Optional
315
340
  }, {
@@ -329,7 +354,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.0", ngImpor
329
354
  }, {
330
355
  type: Inject,
331
356
  args: [DATA_PROVIDERS]
332
- }] }, { type: i4.MultiComboboxConfig }, { type: i0.ViewContainerRef }, { type: i0.Injector }, { type: i15.PlatformFormField, decorators: [{
357
+ }] }, { type: i4.MultiComboboxConfig }, { type: i0.ViewContainerRef }, { type: i0.Injector }, { type: i10.PlatformFormField, decorators: [{
333
358
  type: Optional
334
359
  }, {
335
360
  type: SkipSelf
@@ -338,7 +363,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.0", ngImpor
338
363
  }, {
339
364
  type: Inject,
340
365
  args: [FD_FORM_FIELD]
341
- }] }, { type: i15.PlatformFormFieldControl, decorators: [{
366
+ }] }, { type: i10.PlatformFormFieldControl, decorators: [{
342
367
  type: Optional
343
368
  }, {
344
369
  type: SkipSelf
@@ -360,4 +385,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.0", ngImpor
360
385
  type: ViewChild,
361
386
  args: [TokenizerComponent]
362
387
  }] } });
363
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibXVsdGktY29tYm9ib3guY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9wbGF0Zm9ybS9zcmMvbGliL2Zvcm0vbXVsdGktY29tYm9ib3gvbXVsdGktY29tYm9ib3gvbXVsdGktY29tYm9ib3guY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9wbGF0Zm9ybS9zcmMvbGliL2Zvcm0vbXVsdGktY29tYm9ib3gvbXVsdGktY29tYm9ib3gvbXVsdGktY29tYm9ib3guY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUVILHVCQUF1QixFQUN2QixpQkFBaUIsRUFDakIsU0FBUyxFQUNULFVBQVUsRUFDVixJQUFJLEVBQ0osTUFBTSxFQUNOLFFBQVEsRUFDUixTQUFTLEVBRVQsUUFBUSxFQUNSLElBQUksRUFDSixRQUFRLEVBQ1IsV0FBVyxFQUNYLFNBQVMsRUFDVCxnQkFBZ0IsRUFDaEIsaUJBQWlCLEVBQ3BCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDckUsT0FBTyxFQUFFLENBQUMsRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLFFBQVEsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQzNGLE9BQU8sRUFBRSxhQUFhLEVBQUUscUJBQXFCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUNsRixPQUFPLEtBQUssTUFBTSxpQkFBaUIsQ0FBQztBQUVwQyxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ3hGLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUM1RCxPQUFPLEVBQ0gsY0FBYyxFQUVkLHVCQUF1QixFQUV2QixpQkFBaUIsRUFDakIsd0JBQXdCLEVBRTNCLE1BQU0sa0NBQWtDLENBQUM7QUFFMUMsT0FBTyxFQUFFLGlCQUFpQixFQUFFLFNBQVMsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQzlFLE9BQU8sRUFBRSw0QkFBNEIsRUFBRSxNQUFNLHlFQUF5RSxDQUFDO0FBQ3ZILE9BQU8sRUFBRSxpQ0FBaUMsRUFBRSxNQUFNLHVEQUF1RCxDQUFDO0FBQzFHLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQ3RFLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBRS9ELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQ2pFLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSwrQkFBK0IsRUFBRSxNQUFNLHVDQUF1QyxDQUFDOzs7Ozs7Ozs7Ozs7Ozs7OztBQUVoSCxJQUFJLHVCQUF1QixHQUFHLEtBQUssQ0FBQztBQUVwQzs7Ozs7O0dBTUc7QUFpQkgsTUFBTSxPQUFPLHNCQUF1QixTQUFRLGlCQUFpQjtJQW1CekQsY0FBYztJQUNkLFlBQ0ksRUFBcUIsRUFDWixVQUFzQixFQUNGLFNBQW9CLEVBQ3pCLGdCQUFrQyxFQUN6QixNQUFjLEVBQzFCLFlBQTBCLEVBQ3RDLHdCQUFpRCxFQUNkLFVBQTBDLEVBQzdFLG9CQUF5QyxFQUNqQyxpQkFBbUMsRUFDbkMsU0FBbUIsRUFDbUIsU0FBNEIsRUFDcEIsV0FBcUMsRUFDakYsU0FBaUIsRUFDM0Isc0JBQThDO1FBRXZELEtBQUssQ0FDRCxFQUFFLEVBQ0YsVUFBVSxFQUNWLFNBQVMsRUFDVCxnQkFBZ0IsRUFDaEIsTUFBTSxFQUNOLFlBQVksRUFDWixvQkFBb0IsRUFDcEIsU0FBUyxFQUNULFdBQVcsRUFDWCxTQUFTLENBQ1osQ0FBQztRQTFCTyxlQUFVLEdBQVYsVUFBVSxDQUFZO1FBQ0YsY0FBUyxHQUFULFNBQVMsQ0FBVztRQUVoQixXQUFNLEdBQU4sTUFBTSxDQUFRO1FBQzFCLGlCQUFZLEdBQVosWUFBWSxDQUFjO1FBQ3RDLDZCQUF3QixHQUF4Qix3QkFBd0IsQ0FBeUI7UUFDZCxlQUFVLEdBQVYsVUFBVSxDQUFnQztRQUM3RSx5QkFBb0IsR0FBcEIsb0JBQW9CLENBQXFCO1FBQ2pDLHNCQUFpQixHQUFqQixpQkFBaUIsQ0FBa0I7UUFDbkMsY0FBUyxHQUFULFNBQVMsQ0FBVTtRQUkzQiwyQkFBc0IsR0FBdEIsc0JBQXNCLENBQXdCO1FBdEIzRDs7O1dBR0c7UUFDSCx5QkFBb0IsR0FBMkIsRUFBRSxDQUFDO1FBaUM5QyxJQUFJLENBQUMsdUJBQXVCLElBQUksU0FBUyxFQUFFLEVBQUU7WUFDekMsUUFBUSxDQUNKLGdIQUFnSCxDQUNuSCxDQUFDO1lBQ0YsdUJBQXVCLEdBQUcsSUFBSSxDQUFDO1NBQ2xDO0lBQ0wsQ0FBQztJQUVELGNBQWM7SUFDZCxRQUFRO1FBQ0osS0FBSyxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBRWpCLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxVQUFVLEVBQUUsSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQztRQUN0RyxvQ0FBb0M7UUFDcEMsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLElBQUksSUFBSSxDQUFDLFdBQVcsSUFBSSxTQUFTLEVBQUUsR0FBRyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsRUFBRTtZQUMxRSxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksdUJBQXVCLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFFLENBQUMsQ0FBQztTQUNuRjtJQUNMLENBQUM7SUFFRCxjQUFjO0lBQ2QsZUFBZTtRQUNYLEtBQUssQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUV4QixJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUU7WUFDYixJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztTQUMzQjtRQUVELElBQUksQ0FBQyx1QkFBdUIsRUFBRSxDQUFDO1FBRS9CLElBQUksQ0FBQyxVQUFVLENBQUMsb0JBQW9CLEdBQUcsS0FBSyxDQUFDO0lBQ2pELENBQUM7SUFFRCxjQUFjO0lBQ2QsZUFBZSxDQUFDLElBQTBCO1FBQ3RDLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUVsRCxJQUFJLEdBQUcsS0FBSyxDQUFDLENBQUMsRUFBRTtZQUNaLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDeEM7YUFBTTtZQUNILElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDO1NBQzVDO1FBRUQsSUFBSSxDQUFDLFFBQVEsR0FBRyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUM7UUFFL0IsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7UUFFeEIsSUFBSSxDQUFDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxNQUFNLEVBQUU7WUFDbkMsSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7U0FDOUI7UUFFRCxJQUFJLENBQUMsR0FBRyxDQUFDLGFBQWEsRUFBRSxDQUFDO0lBQzdCLENBQUM7SUFFRCxjQUFjO0lBQ2QsdUJBQXVCLENBQUMsS0FBaUIsRUFBRSxLQUFhO1FBQ3BELEtBQUssQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUN4QixJQUFJLENBQUMscUJBQXFCLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQzdDLENBQUM7SUFFRCxjQUFjO0lBQ2QsY0FBYyxDQUFDLEtBQXdCO1FBQ25DLElBQUksS0FBSyxDQUFDLFVBQVUsRUFBRTtZQUNsQixJQUFJLENBQUMsMEJBQTBCLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQzVDLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztTQUNoQjtJQUNMLENBQUM7SUFFRCxjQUFjO0lBQ2QsMEJBQTBCLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxTQUFTO1FBQzVDLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNuRCxJQUFJLElBQUksRUFBRTtZQUNOLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDM0IsSUFBSSxDQUFDLFNBQVMsR0FBRyxFQUFFLENBQUM7U0FDdkI7SUFDTCxDQUFDO0lBRUQ7Ozs7U0FJSztJQUNMLG9CQUFvQixDQUFDLE1BQWU7UUFDaEMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUM7UUFDbEUsSUFBSSxDQUFDLG9CQUFvQixHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDckUsSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUU1QixJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztJQUM1QixDQUFDO0lBRUQsY0FBYztJQUNkLGdCQUFnQixDQUFDLEtBQW9CO1FBQ2pDLElBQUksT0FBTyxDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxVQUFVLEVBQUUsUUFBUSxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFO1lBQ2pFLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxLQUFLLEVBQUUsQ0FBQztTQUMzQztJQUNMLENBQUM7SUFFRCxjQUFjO0lBQ2QsV0FBVyxDQUFDLEtBQTJCLEVBQUUsS0FBa0I7UUFDdkQsSUFBSSxLQUFLLEVBQUU7WUFDUCxLQUFLLENBQUMsY0FBYyxFQUFFLENBQUM7U0FDMUI7UUFDRCxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssS0FBSyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDMUUsSUFBSSxVQUFVLEVBQUU7WUFDWixJQUFJLENBQUMsZUFBZSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBQ2pDLElBQUksQ0FBQyxjQUFjLENBQUMsS0FBSyxFQUFFLENBQUM7U0FDL0I7SUFDTCxDQUFDO0lBRUQsY0FBYztJQUNkLFdBQVc7UUFDUCxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxPQUFPO1lBQzVCLENBQUMsQ0FBQyxJQUFJLENBQUMsaUNBQWlDLENBQUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQzdGLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQy9CLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUMzRSxDQUFDO1FBRVIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNwQixJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUMvQixJQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksRUFBRSxDQUFDO0lBQzVCLENBQUM7SUFFRCxjQUFjO0lBQ2QsTUFBTSxDQUFDLEtBQWlCO1FBQ3BCLE1BQU0sTUFBTSxHQUFHLEtBQUssQ0FBQyxhQUE0QixDQUFDO1FBQ2xELElBQUksTUFBTSxFQUFFO1lBQ1IsTUFBTSxNQUFNLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMscUNBQXFDLENBQUMsQ0FBQztZQUN2RSxJQUFJLE1BQU0sRUFBRTtnQkFDUixPQUFPO2FBQ1Y7WUFDRCxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ3JCLElBQUksQ0FBQyxTQUFTLEdBQUcsRUFBRSxDQUFDO1NBQ3ZCO0lBQ0wsQ0FBQztJQUVEOzs7T0FHRztJQUNILDBCQUEwQixDQUFDLElBQWdCO1FBQ3ZDLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQztRQUU1QixJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUU7WUFDYixPQUFPO1NBQ1Y7UUFFRCxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3pCLENBQUM7SUFFRCxjQUFjO0lBQ2Qsb0JBQW9CLENBQUMsS0FBb0IsRUFBRSxLQUFhO1FBQ3BELElBQUksT0FBTyxDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLEVBQUU7WUFDbEMsSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7WUFDM0IsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1NBQ2hCO2FBQU0sSUFBSSxLQUFLLENBQUMsUUFBUSxJQUFJLE9BQU8sQ0FBQyxTQUFTLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxFQUFFO1lBQ3hELEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUN2QixJQUFJLENBQUMsYUFBYSxFQUFFLGFBQWEsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUM7U0FDaEQ7YUFBTSxJQUFJLE9BQU8sQ0FBQyxTQUFTLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxFQUFFO1lBQ3RDLEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUN2QixJQUFJLENBQUMsYUFBYSxFQUFFLGFBQWEsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUM7U0FDaEQ7YUFBTSxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksS0FBSyxDQUFDLFFBQVEsSUFBSSxPQUFPLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsRUFBRTtZQUMxRixLQUFLLENBQUMsY0FBYyxFQUFFLENBQUM7WUFDdkIsSUFBSSxDQUFDLG9CQUFvQixDQUFDLEtBQUssQ0FBQyxDQUFDO1NBQ3BDO2FBQU0sSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLE9BQU8sQ0FBQyxTQUFTLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxFQUFFO1lBQ3hFLEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUN2QixJQUFJLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDbkM7YUFBTSxJQUFJLE9BQU8sQ0FBQyxTQUFTLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxFQUFFO1lBQ3hDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFO2dCQUNkLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQzthQUNoQjtZQUNELElBQUksQ0FBQyxjQUFjLENBQUMsS0FBSyxFQUFFLENBQUM7U0FDL0I7YUFBTSxJQUFJLE9BQU8sQ0FBQyxTQUFTLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxFQUFFO1lBQ3hDLElBQUksQ0FBQyxjQUFjLENBQUMsS0FBSyxFQUFFLENBQUM7U0FDL0I7SUFDTCxDQUFDO0lBRUQsY0FBYztJQUNkLGVBQWUsQ0FBQyxLQUFpQixFQUFFLEtBQWE7UUFDNUMsSUFBSSxDQUFDLHFCQUFxQixDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQztRQUN6QyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDakIsQ0FBQztJQUVELGNBQWM7SUFDZCxhQUFhLENBQUMsS0FBWTtRQUN0QixJQUFJLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3BDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFO1lBQ2QsSUFBSSxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztTQUMxQztJQUNMLENBQUM7SUFFRDs7O09BR0c7SUFDSyxxQkFBcUIsQ0FBQyxLQUFpQixFQUFFLEtBQWE7UUFDMUQsaUVBQWlFO1FBQ2pFLE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUMsUUFBUSxDQUFDO1FBQ3pELElBQUksQ0FBQyxjQUFjLENBQUMscUJBQXFCLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ3hELE1BQU0sV0FBVyxHQUFHLElBQUksR0FBRyxFQUFFLENBQUM7UUFDOUIsSUFBSSxDQUFDLGNBQWMsQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFO1lBQ2hELE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDdkMsSUFBSSxPQUFPLENBQUMsUUFBUSxLQUFLLGNBQWMsRUFBRTtnQkFDckMsSUFBSSxPQUFPLENBQUMsUUFBUSxFQUFFO29CQUNsQiw0Q0FBNEM7b0JBQzVDLFdBQVcsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO2lCQUNsQztxQkFBTTtvQkFDSCxnREFBZ0Q7b0JBQ2hELElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7aUJBQzNDO2dCQUNELE9BQU8sQ0FBQyxRQUFRLEdBQUcsY0FBYyxDQUFDO2FBQ3JDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsb0JBQW9CLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBQy9GLGtFQUFrRTtRQUNsRSxNQUFNLFlBQVksR0FBRyxJQUFJLEdBQUcsQ0FBYyxJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDekYsSUFBSSxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBRSxHQUFHLFlBQVksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBRSxDQUFDLENBQUM7UUFDbEcsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7UUFFeEIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUUzQixJQUFJLENBQUMsVUFBVSxDQUFDLGdCQUFnQixDQUFDLGFBQWEsQ0FBQyxVQUFVO1lBQ3JELElBQUksQ0FBQyxVQUFVLENBQUMsZ0JBQWdCLENBQUMsYUFBYSxDQUFDLFdBQVcsQ0FBQztJQUNuRSxDQUFDO0lBRUQsNkVBQTZFO0lBQzdFLGFBQWEsQ0FBQyxNQUE4QjtRQUN4QyxJQUFJLENBQUMsb0JBQW9CLEdBQUcsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDO1FBQ3hDLElBQUksQ0FBQyxTQUFTLEdBQUcsRUFBRSxDQUFDO1FBQ3BCLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDckIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDcEMsQ0FBQztJQUVELGtGQUFrRjtJQUNsRixhQUFhO1FBQ1QsSUFBSSxDQUFDLFNBQVMsR0FBRyxFQUFFLENBQUM7UUFDcEIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNyQixJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDaEMsQ0FBQztJQUVELGNBQWM7SUFDTiwwQkFBMEIsQ0FBQyxJQUEwQjtRQUN6RCxPQUFPLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxTQUFTLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxFQUFFLEtBQUssSUFBSSxDQUFDLEVBQUUsSUFBSSxLQUFLLENBQUMsS0FBSyxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztJQUNsSCxDQUFDO0lBRUQsY0FBYztJQUNOLGtCQUFrQjtRQUN0QixNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsb0JBQW9CLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUM7UUFFMUUseUNBQXlDO1FBQ3pDLElBQUksQ0FBQyxLQUFLLEdBQUcsYUFBYSxDQUFDO1FBRTNCLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO0lBQzVCLENBQUM7SUFFRCxjQUFjO0lBQ04sZ0JBQWdCLENBQUMsWUFBc0I7UUFDM0MsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLElBQUksWUFBWSxFQUFFO1lBQzlCLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLENBQUM7WUFDekMsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7U0FDN0I7SUFDTCxDQUFDO0lBRUQsY0FBYztJQUNOLEtBQUssQ0FBQyxnQkFBZ0I7UUFDMUIsTUFBTSxRQUFRLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQztZQUM3QixTQUFTLEVBQUUsQ0FBQyxFQUFFLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUM7WUFDakUsTUFBTSxFQUFFLElBQUksQ0FBQyxTQUFTO1NBQ3pCLENBQUMsQ0FBQztRQUVILE1BQU0sSUFBSSxDQUFDLHdCQUF3QixDQUFDLG1CQUFtQixDQUNuRCxFQUFFLFlBQVksRUFBRSxJQUFJLENBQUMsWUFBWSxFQUFFLGVBQWUsRUFBRSxJQUFJLENBQUMscUJBQXFCLEVBQUUsRUFDaEYsaUNBQWlDLEVBQ2pDLDRCQUE0QixFQUM1QixJQUFJLENBQUMsaUJBQWlCLEVBQ3RCLFFBQVEsQ0FDWCxDQUFDO0lBQ04sQ0FBQzs4R0FyVVEsc0JBQXNCLDJVQTRCUCxjQUFjLHdIQUlNLGFBQWEseURBQ2IscUJBQXFCLHlEQUNyRCxTQUFTO2tHQWxDWixzQkFBc0IsNkNBVHBCO1lBQ1A7Z0JBQ0ksT0FBTyxFQUFFLHFCQUFxQjtnQkFDOUIsV0FBVyxFQUFFLHNCQUFzQjtnQkFDbkMsS0FBSyxFQUFFLElBQUk7YUFDZDtZQUNELCtCQUErQixFQUFFO1NBQ3BDLHNSQVlVLGtCQUFrQix1RUNoRmpDLGc1WEF1U0E7OzJGRGpPYSxzQkFBc0I7a0JBZmxDLFNBQVM7K0JBQ0ksb0JBQW9CLG1CQUdiLHVCQUF1QixDQUFDLE1BQU0saUJBQ2hDLGlCQUFpQixDQUFDLElBQUksYUFDMUI7d0JBQ1A7NEJBQ0ksT0FBTyxFQUFFLHFCQUFxQjs0QkFDOUIsV0FBVyx3QkFBd0I7NEJBQ25DLEtBQUssRUFBRSxJQUFJO3lCQUNkO3dCQUNELCtCQUErQixFQUFFO3FCQUNwQzs7MEJBeUJJLFFBQVE7OzBCQUFJLElBQUk7OzBCQUNoQixRQUFROzswQkFBSSxRQUFROzswQkFDcEIsUUFBUTs7MEJBQUksUUFBUTs7MEJBQ3BCLFFBQVE7OzBCQUVSLFFBQVE7OzBCQUFJLE1BQU07MkJBQUMsY0FBYzs7MEJBSWpDLFFBQVE7OzBCQUFJLFFBQVE7OzBCQUFJLElBQUk7OzBCQUFJLE1BQU07MkJBQUMsYUFBYTs7MEJBQ3BELFFBQVE7OzBCQUFJLFFBQVE7OzBCQUFJLElBQUk7OzBCQUFJLE1BQU07MkJBQUMscUJBQXFCOzswQkFDNUQsTUFBTTsyQkFBQyxTQUFTO2lGQS9CckIscUJBQXFCO3NCQURwQixTQUFTO3VCQUFDLHVCQUF1QjtnQkFLbEMsWUFBWTtzQkFEWCxTQUFTO3VCQUFDLGNBQWM7Z0JBS3pCLFVBQVU7c0JBRFQsU0FBUzt1QkFBQyxrQkFBa0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICAgIEFmdGVyVmlld0luaXQsXG4gICAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gICAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgQ29tcG9uZW50LFxuICAgIEVsZW1lbnRSZWYsXG4gICAgSG9zdCxcbiAgICBJbmplY3QsXG4gICAgSW5qZWN0b3IsXG4gICAgaXNEZXZNb2RlLFxuICAgIE9uSW5pdCxcbiAgICBPcHRpb25hbCxcbiAgICBTZWxmLFxuICAgIFNraXBTZWxmLFxuICAgIFRlbXBsYXRlUmVmLFxuICAgIFZpZXdDaGlsZCxcbiAgICBWaWV3Q29udGFpbmVyUmVmLFxuICAgIFZpZXdFbmNhcHN1bGF0aW9uXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29udHJvbENvbnRhaW5lciwgTmdDb250cm9sLCBOZ0Zvcm0gfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBBLCBET1dOX0FSUk9XLCBFTlRFUiwgRVNDQVBFLCBTUEFDRSwgVEFCLCBVUF9BUlJPVyB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9rZXljb2Rlcyc7XG5pbXBvcnQgeyBGRF9GT1JNX0ZJRUxELCBGRF9GT1JNX0ZJRUxEX0NPTlRST0wgfSBmcm9tICdAZnVuZGFtZW50YWwtbmd4L2Nkay9mb3Jtcyc7XG5pbXBvcnQgZXF1YWwgZnJvbSAnZmFzdC1kZWVwLWVxdWFsJztcblxuaW1wb3J0IHsgRHluYW1pY0NvbXBvbmVudFNlcnZpY2UsIEtleVV0aWwsIHdhcm5PbmNlIH0gZnJvbSAnQGZ1bmRhbWVudGFsLW5neC9jZGsvdXRpbHMnO1xuaW1wb3J0IHsgRGlhbG9nQ29uZmlnIH0gZnJvbSAnQGZ1bmRhbWVudGFsLW5neC9jb3JlL2RpYWxvZyc7XG5pbXBvcnQge1xuICAgIERBVEFfUFJPVklERVJTLFxuICAgIERhdGFQcm92aWRlcixcbiAgICBNdWx0aUNvbWJvQm94RGF0YVNvdXJjZSxcbiAgICBPcHRpb25JdGVtLFxuICAgIFBsYXRmb3JtRm9ybUZpZWxkLFxuICAgIFBsYXRmb3JtRm9ybUZpZWxkQ29udHJvbCxcbiAgICBTZWxlY3RhYmxlT3B0aW9uSXRlbVxufSBmcm9tICdAZnVuZGFtZW50YWwtbmd4L3BsYXRmb3JtL3NoYXJlZCc7XG5cbmltcG9ydCB7IEJhc2VNdWx0aUNvbWJvYm94LCBNQVBfTElNSVQgfSBmcm9tICcuLi9jb21tb25zL2Jhc2UtbXVsdGktY29tYm9ib3gnO1xuaW1wb3J0IHsgTXVsdGlDb21ib2JveE1vYmlsZUNvbXBvbmVudCB9IGZyb20gJy4uL211bHRpLWNvbWJvYm94LW1vYmlsZS9tdWx0aS1jb21ib2JveC9tdWx0aS1jb21ib2JveC1tb2JpbGUuY29tcG9uZW50JztcbmltcG9ydCB7IFBsYXRmb3JtTXVsdGlDb21ib2JveE1vYmlsZU1vZHVsZSB9IGZyb20gJy4uL211bHRpLWNvbWJvYm94LW1vYmlsZS9tdWx0aS1jb21ib2JveC1tb2JpbGUubW9kdWxlJztcbmltcG9ydCB7IE1VTFRJQ09NQk9CT1hfQ09NUE9ORU5UIH0gZnJvbSAnLi4vbXVsdGktY29tYm9ib3guaW50ZXJmYWNlJztcbmltcG9ydCB7IE11bHRpQ29tYm9ib3hDb25maWcgfSBmcm9tICcuLi9tdWx0aS1jb21ib2JveC5jb25maWcnO1xuaW1wb3J0IHsgQXV0b0NvbXBsZXRlRXZlbnQgfSBmcm9tICcuLi8uLi9hdXRvLWNvbXBsZXRlL2F1dG8tY29tcGxldGUuZGlyZWN0aXZlJztcbmltcG9ydCB7IFRva2VuaXplckNvbXBvbmVudCB9IGZyb20gJ0BmdW5kYW1lbnRhbC1uZ3gvY29yZS90b2tlbic7XG5pbXBvcnQgeyBDb250ZW50RGVuc2l0eU9ic2VydmVyLCBjb250ZW50RGVuc2l0eU9ic2VydmVyUHJvdmlkZXJzIH0gZnJvbSAnQGZ1bmRhbWVudGFsLW5neC9jb3JlL2NvbnRlbnQtZGVuc2l0eSc7XG5cbmxldCBkZXByZWNhdGlvbldhcm5pbmdTaG93biA9IGZhbHNlO1xuXG4vKipcbiAqIFRoaXMgY29tcG9uZW50IGNhbiB3b3JrIHdpdGggYm90aCBzdHJpbmcgcHJpbWl0aXZlcyBhcyB3ZWxsIGFzIHdpdGggY29tcGxleCBvYmplY3RzLiBJbiBvcmRlclxuICogdG8gdXNlIG9iamVjdHMgdXNlciBtdXN0IHByb3ZpZGUgYW4gdW5pcXVlIElEIHRvIGxvb2t1cGtleSwgd2hpY2ggd2lsbCBiZSB1c2VkIGluIGNvbXBhcmluZ1xuICogZWFjaCBpdGVtcyBvZiBhcnJheS4gSXQgaXMgaW1wb3J0YW50IHRvIHByb3ZpZGUgbG9va3Vwa2V5IHZhbHVlIGFzIHRoZXJlIG1pZ2h0IGJlIG11bHRpcGxlXG4gKiBpdGVtcyB3aXRoIHNhbWUgbmFtZSBidXQgZGlmZmVyZW50IHByb3BlcnRpZXMgd2hpY2ggaXMgdG8gYmUgZGlmZmVyZW50bHkgaWRlbnRpZmllZCBvdGhlcndpc2VcbiAqIGl0IHdpbGwgYmUgdHJlYXRlZCBhcyBzYW1lIG9iamVjdHMuXG4gKi9cblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICdmZHAtbXVsdGktY29tYm9ib3gnLFxuICAgIHRlbXBsYXRlVXJsOiAnLi9tdWx0aS1jb21ib2JveC5jb21wb25lbnQuaHRtbCcsXG4gICAgc3R5bGVVcmxzOiBbJy4vbXVsdGktY29tYm9ib3guY29tcG9uZW50LnNjc3MnXSxcbiAgICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxuICAgIHByb3ZpZGVyczogW1xuICAgICAgICB7XG4gICAgICAgICAgICBwcm92aWRlOiBGRF9GT1JNX0ZJRUxEX0NPTlRST0wsXG4gICAgICAgICAgICB1c2VFeGlzdGluZzogTXVsdGlDb21ib2JveENvbXBvbmVudCxcbiAgICAgICAgICAgIG11bHRpOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIGNvbnRlbnREZW5zaXR5T2JzZXJ2ZXJQcm92aWRlcnMoKVxuICAgIF1cbn0pXG5leHBvcnQgY2xhc3MgTXVsdGlDb21ib2JveENvbXBvbmVudCBleHRlbmRzIEJhc2VNdWx0aUNvbWJvYm94IGltcGxlbWVudHMgT25Jbml0LCBBZnRlclZpZXdJbml0IHtcbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIEBWaWV3Q2hpbGQoJ21vYmlsZUNvbnRyb2xUZW1wbGF0ZScpXG4gICAgbW9iaWxlQ29udHJvbFRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+O1xuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBAVmlld0NoaWxkKCdsaXN0VGVtcGxhdGUnKVxuICAgIGxpc3RUZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PjtcblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgQFZpZXdDaGlsZChUb2tlbml6ZXJDb21wb25lbnQpXG4gICAgX3Rva2VuaXplcjogVG9rZW5pemVyQ29tcG9uZW50O1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIExpc3Qgb2Ygc2VsZWN0ZWQgc3VnZ2VzdGlvbnNcbiAgICAgKi9cbiAgICBfc2VsZWN0ZWRTdWdnZXN0aW9uczogU2VsZWN0YWJsZU9wdGlvbkl0ZW1bXSA9IFtdO1xuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgY2Q6IENoYW5nZURldGVjdG9yUmVmLFxuICAgICAgICByZWFkb25seSBlbGVtZW50UmVmOiBFbGVtZW50UmVmLFxuICAgICAgICBAT3B0aW9uYWwoKSBAU2VsZigpIHJlYWRvbmx5IG5nQ29udHJvbDogTmdDb250cm9sLFxuICAgICAgICBAT3B0aW9uYWwoKSBAU2tpcFNlbGYoKSBjb250cm9sQ29udGFpbmVyOiBDb250cm9sQ29udGFpbmVyLFxuICAgICAgICBAT3B0aW9uYWwoKSBAU2tpcFNlbGYoKSByZWFkb25seSBuZ0Zvcm06IE5nRm9ybSxcbiAgICAgICAgQE9wdGlvbmFsKCkgcmVhZG9ubHkgZGlhbG9nQ29uZmlnOiBEaWFsb2dDb25maWcsXG4gICAgICAgIHJlYWRvbmx5IF9keW5hbWljQ29tcG9uZW50U2VydmljZTogRHluYW1pY0NvbXBvbmVudFNlcnZpY2UsXG4gICAgICAgIEBPcHRpb25hbCgpIEBJbmplY3QoREFUQV9QUk9WSURFUlMpIHByaXZhdGUgX3Byb3ZpZGVyczogTWFwPHN0cmluZywgRGF0YVByb3ZpZGVyPGFueT4+LFxuICAgICAgICByZWFkb25seSBfbXVsdGlDb21ib2JveENvbmZpZzogTXVsdGlDb21ib2JveENvbmZpZyxcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSBfdmlld0NvbnRhaW5lclJlZjogVmlld0NvbnRhaW5lclJlZixcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSBfaW5qZWN0b3I6IEluamVjdG9yLFxuICAgICAgICBAT3B0aW9uYWwoKSBAU2tpcFNlbGYoKSBASG9zdCgpIEBJbmplY3QoRkRfRk9STV9GSUVMRCkgZm9ybUZpZWxkOiBQbGF0Zm9ybUZvcm1GaWVsZCxcbiAgICAgICAgQE9wdGlvbmFsKCkgQFNraXBTZWxmKCkgQEhvc3QoKSBASW5qZWN0KEZEX0ZPUk1fRklFTERfQ09OVFJPTCkgZm9ybUNvbnRyb2w6IFBsYXRmb3JtRm9ybUZpZWxkQ29udHJvbCxcbiAgICAgICAgQEluamVjdChNQVBfTElNSVQpIF9tYXBMaW1pdDogbnVtYmVyLFxuICAgICAgICByZWFkb25seSBjb250ZW50RGVuc2l0eU9ic2VydmVyOiBDb250ZW50RGVuc2l0eU9ic2VydmVyXG4gICAgKSB7XG4gICAgICAgIHN1cGVyKFxuICAgICAgICAgICAgY2QsXG4gICAgICAgICAgICBlbGVtZW50UmVmLFxuICAgICAgICAgICAgbmdDb250cm9sLFxuICAgICAgICAgICAgY29udHJvbENvbnRhaW5lcixcbiAgICAgICAgICAgIG5nRm9ybSxcbiAgICAgICAgICAgIGRpYWxvZ0NvbmZpZyxcbiAgICAgICAgICAgIF9tdWx0aUNvbWJvYm94Q29uZmlnLFxuICAgICAgICAgICAgZm9ybUZpZWxkLFxuICAgICAgICAgICAgZm9ybUNvbnRyb2wsXG4gICAgICAgICAgICBfbWFwTGltaXRcbiAgICAgICAgKTtcblxuICAgICAgICBpZiAoIWRlcHJlY2F0aW9uV2FybmluZ1Nob3duICYmIGlzRGV2TW9kZSgpKSB7XG4gICAgICAgICAgICB3YXJuT25jZShcbiAgICAgICAgICAgICAgICBgW0RFUFJFQ0FUSU9OXSBQbGF0Zm9ybSBNdWx0aSBDb21ib2JveCBjb21wb25lbnQgaXMgZGVwcmVjYXRlZCBzaW5jZSB2MC4zOS4wLiBQbGVhc2UgbWlncmF0ZSB0byBDb3JlJ3MgdmVyc2lvbi5gXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgZGVwcmVjYXRpb25XYXJuaW5nU2hvd24gPSB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICAgICAgc3VwZXIubmdPbkluaXQoKTtcblxuICAgICAgICBjb25zdCBwcm92aWRlcnMgPSB0aGlzLl9wcm92aWRlcnM/LnNpemUgPT09IDAgPyB0aGlzLl9tdWx0aUNvbWJvYm94Q29uZmlnLnByb3ZpZGVycyA6IHRoaXMuX3Byb3ZpZGVycztcbiAgICAgICAgLy8gaWYgd2UgaGF2ZSBib3RoIHByZWZlciBkYXRhU291cmNlXG4gICAgICAgIGlmICghdGhpcy5kYXRhU291cmNlICYmIHRoaXMuZW50aXR5Q2xhc3MgJiYgcHJvdmlkZXJzPy5oYXModGhpcy5lbnRpdHlDbGFzcykpIHtcbiAgICAgICAgICAgIHRoaXMuZGF0YVNvdXJjZSA9IG5ldyBNdWx0aUNvbWJvQm94RGF0YVNvdXJjZShwcm92aWRlcnMuZ2V0KHRoaXMuZW50aXR5Q2xhc3MpISk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICAgICAgc3VwZXIubmdBZnRlclZpZXdJbml0KCk7XG5cbiAgICAgICAgaWYgKHRoaXMubW9iaWxlKSB7XG4gICAgICAgICAgICB0aGlzLl9zZXRVcE1vYmlsZU1vZGUoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX3NldFNlbGVjdGVkU3VnZ2VzdGlvbnMoKTtcblxuICAgICAgICB0aGlzLl90b2tlbml6ZXIuX3Nob3dPdmVyZmxvd1BvcG92ZXIgPSBmYWxzZTtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHRvZ2dsZVNlbGVjdGlvbihpdGVtOiBTZWxlY3RhYmxlT3B0aW9uSXRlbSk6IHZvaWQge1xuICAgICAgICBjb25zdCBpZHggPSB0aGlzLl9nZXRUb2tlbkluZGV4QnlJZGxPclZhbHVlKGl0ZW0pO1xuXG4gICAgICAgIGlmIChpZHggPT09IC0xKSB7XG4gICAgICAgICAgICB0aGlzLl9zZWxlY3RlZFN1Z2dlc3Rpb25zLnB1c2goaXRlbSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl9zZWxlY3RlZFN1Z2dlc3Rpb25zLnNwbGljZShpZHgsIDEpO1xuICAgICAgICB9XG5cbiAgICAgICAgaXRlbS5zZWxlY3RlZCA9ICFpdGVtLnNlbGVjdGVkO1xuXG4gICAgICAgIHRoaXMuX3Byb3BhZ2F0ZUNoYW5nZSgpO1xuXG4gICAgICAgIGlmICghdGhpcy5fc2VsZWN0ZWRTdWdnZXN0aW9ucy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXMuX2ZvY3VzVG9TZWFyY2hGaWVsZCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fY2QuZGV0ZWN0Q2hhbmdlcygpO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgb25PcHRpb25DaGVja2JveENsaWNrZWQoZXZlbnQ6IE1vdXNlRXZlbnQsIGluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIHRoaXMuX29uTGlzdEVsZW1lbnRDbGlja2VkKGV2ZW50LCBpbmRleCk7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBvbkNvbXBsZXRlVGVybShldmVudDogQXV0b0NvbXBsZXRlRXZlbnQpOiB2b2lkIHtcbiAgICAgICAgaWYgKGV2ZW50LmZvcmNlQ2xvc2UpIHtcbiAgICAgICAgICAgIHRoaXMudG9nZ2xlU2VsZWN0aW9uQnlJbnB1dFRleHQoZXZlbnQudGVybSk7XG4gICAgICAgICAgICB0aGlzLmNsb3NlKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHRvZ2dsZVNlbGVjdGlvbkJ5SW5wdXRUZXh0KHRleHQgPSB0aGlzLmlucHV0VGV4dCk6IHZvaWQge1xuICAgICAgICBjb25zdCBpdGVtID0gdGhpcy5fZ2V0U2VsZWN0SXRlbUJ5SW5wdXRWYWx1ZSh0ZXh0KTtcbiAgICAgICAgaWYgKGl0ZW0pIHtcbiAgICAgICAgICAgIHRoaXMudG9nZ2xlU2VsZWN0aW9uKGl0ZW0pO1xuICAgICAgICAgICAgdGhpcy5pbnB1dFRleHQgPSAnJztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBNZXRob2QgdGhhdCBzZWxlY3RzIGFsbCBwb3NzaWJsZSBvcHRpb25zLlxuICAgICAqICpzZWxlY3QqIGF0dHJpYnV0ZSDigJMgaWYgKnRydWUqIHNlbGVjdCBhbGwsIGlmICpmYWxzZSogdW5zZWxlY3QgYWxsXG4gICAgICogKi9cbiAgICBoYW5kbGVTZWxlY3RBbGxJdGVtcyhzZWxlY3Q6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fZmxhdFN1Z2dlc3Rpb25zLmZvckVhY2goKGl0ZW0pID0+IChpdGVtLnNlbGVjdGVkID0gc2VsZWN0KSk7XG4gICAgICAgIHRoaXMuX3NlbGVjdGVkU3VnZ2VzdGlvbnMgPSBzZWxlY3QgPyBbLi4udGhpcy5fZmxhdFN1Z2dlc3Rpb25zXSA6IFtdO1xuICAgICAgICB0aGlzLl9yYW5nZVNlbGVjdG9yLnJlc2V0KCk7XG5cbiAgICAgICAgdGhpcy5fcHJvcGFnYXRlQ2hhbmdlKCk7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBuYXZpZ2F0ZUJ5VG9rZW5zKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgICAgIGlmIChLZXlVdGlsLmlzS2V5Q29kZShldmVudCwgW0RPV05fQVJST1csIFVQX0FSUk9XXSkgJiYgdGhpcy5pc09wZW4pIHtcbiAgICAgICAgICAgIHRoaXMubGlzdENvbXBvbmVudC5pdGVtcz8uZmlyc3QuZm9jdXMoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgcmVtb3ZlVG9rZW4odG9rZW46IFNlbGVjdGFibGVPcHRpb25JdGVtLCBldmVudD86IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICAgICAgaWYgKGV2ZW50KSB7XG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG9wdGlvbkl0ZW0gPSB0aGlzLl9zdWdnZXN0aW9ucy5maW5kKChzKSA9PiBzLnZhbHVlID09PSB0b2tlbi52YWx1ZSk7XG4gICAgICAgIGlmIChvcHRpb25JdGVtKSB7XG4gICAgICAgICAgICB0aGlzLnRvZ2dsZVNlbGVjdGlvbihvcHRpb25JdGVtKTtcbiAgICAgICAgICAgIHRoaXMuX3JhbmdlU2VsZWN0b3IucmVzZXQoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgbW9yZUNsaWNrZWQoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX3N1Z2dlc3Rpb25zID0gdGhpcy5pc0dyb3VwXG4gICAgICAgICAgICA/IHRoaXMuX2NvbnZlcnRPYmplY3RzVG9Hcm91cE9wdGlvbkl0ZW1zKHRoaXMuX3NlbGVjdGVkU3VnZ2VzdGlvbnMubWFwKCh7IHZhbHVlIH0pID0+IHZhbHVlKSlcbiAgICAgICAgICAgIDogdGhpcy5fc3VnZ2VzdGlvbnMuZmlsdGVyKCh2YWx1ZSkgPT5cbiAgICAgICAgICAgICAgICAgIHRoaXMuX3NlbGVjdGVkU3VnZ2VzdGlvbnMuc29tZSgoaXRlbSkgPT4gZXF1YWwoaXRlbS52YWx1ZSwgdmFsdWUudmFsdWUpKVxuICAgICAgICAgICAgICApO1xuXG4gICAgICAgIHRoaXMuc2hvd0xpc3QodHJ1ZSk7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRTaG93biQubmV4dCh0cnVlKTtcbiAgICAgICAgdGhpcy5fY2QubWFya0ZvckNoZWNrKCk7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBvbkJsdXIoZXZlbnQ6IEZvY3VzRXZlbnQpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgdGFyZ2V0ID0gZXZlbnQucmVsYXRlZFRhcmdldCBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgaWYgKHRhcmdldCkge1xuICAgICAgICAgICAgY29uc3QgaXNMaXN0ID0gISF0YXJnZXQuY2xvc2VzdCgnLmZkcC1tdWx0aS1jb21ib2JveF9fbGlzdC1jb250YWluZXInKTtcbiAgICAgICAgICAgIGlmIChpc0xpc3QpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnNob3dMaXN0KGZhbHNlKTtcbiAgICAgICAgICAgIHRoaXMuaW5wdXRUZXh0ID0gJyc7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogTWV0aG9kIHRvIHNldCBpbnB1dCB0ZXh0IGFzIGl0ZW0gbGFiZWwuXG4gICAgICovXG4gICAgc2V0SW5wdXRUZXh0RnJvbU9wdGlvbkl0ZW0oaXRlbTogT3B0aW9uSXRlbSk6IHZvaWQge1xuICAgICAgICB0aGlzLmlucHV0VGV4dCA9IGl0ZW0ubGFiZWw7XG5cbiAgICAgICAgaWYgKHRoaXMubW9iaWxlKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnNob3dMaXN0KGZhbHNlKTtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIG9uSXRlbUtleURvd25IYW5kbGVyKGV2ZW50OiBLZXlib2FyZEV2ZW50LCBpbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIGlmIChLZXlVdGlsLmlzS2V5Q29kZShldmVudCwgRVNDQVBFKSkge1xuICAgICAgICAgICAgdGhpcy5fZm9jdXNUb1NlYXJjaEZpZWxkKCk7XG4gICAgICAgICAgICB0aGlzLmNsb3NlKCk7XG4gICAgICAgIH0gZWxzZSBpZiAoZXZlbnQuc2hpZnRLZXkgJiYgS2V5VXRpbC5pc0tleUNvZGUoZXZlbnQsIFRBQikpIHtcbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICB0aGlzLmxpc3RDb21wb25lbnQ/LnNldEl0ZW1BY3RpdmUoaW5kZXggLSAxKTtcbiAgICAgICAgfSBlbHNlIGlmIChLZXlVdGlsLmlzS2V5Q29kZShldmVudCwgVEFCKSkge1xuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIHRoaXMubGlzdENvbXBvbmVudD8uc2V0SXRlbUFjdGl2ZShpbmRleCArIDEpO1xuICAgICAgICB9IGVsc2UgaWYgKChldmVudC5jdHJsS2V5IHx8IGV2ZW50Lm1ldGFLZXkpICYmIGV2ZW50LnNoaWZ0S2V5ICYmIEtleVV0aWwuaXNLZXlDb2RlKGV2ZW50LCBBKSkge1xuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlU2VsZWN0QWxsSXRlbXMoZmFsc2UpO1xuICAgICAgICB9IGVsc2UgaWYgKChldmVudC5jdHJsS2V5IHx8IGV2ZW50Lm1ldGFLZXkpICYmIEtleVV0aWwuaXNLZXlDb2RlKGV2ZW50LCBBKSkge1xuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlU2VsZWN0QWxsSXRlbXModHJ1ZSk7XG4gICAgICAgIH0gZWxzZSBpZiAoS2V5VXRpbC5pc0tleUNvZGUoZXZlbnQsIEVOVEVSKSkge1xuICAgICAgICAgICAgaWYgKCF0aGlzLm1vYmlsZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuY2xvc2UoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuX3JhbmdlU2VsZWN0b3IucmVzZXQoKTtcbiAgICAgICAgfSBlbHNlIGlmIChLZXlVdGlsLmlzS2V5Q29kZShldmVudCwgU1BBQ0UpKSB7XG4gICAgICAgICAgICB0aGlzLl9yYW5nZVNlbGVjdG9yLnJlc2V0KCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIG9uT3B0aW9uQ2xpY2tlZChldmVudDogTW91c2VFdmVudCwgaW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgICAgICB0aGlzLl9vbkxpc3RFbGVtZW50Q2xpY2tlZChldmVudCwgaW5kZXgpO1xuICAgICAgICB0aGlzLmNsb3NlKCk7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBfYWRkT25DbGlja2VkKGV2ZW50OiBFdmVudCk6IHZvaWQge1xuICAgICAgICB0aGlzLmFkZE9uQnV0dG9uQ2xpY2tlZC5lbWl0KGV2ZW50KTtcbiAgICAgICAgaWYgKCF0aGlzLm1vYmlsZSkge1xuICAgICAgICAgICAgdGhpcy5vblByaW1hcnlCdXR0b25DbGljayh0aGlzLmlzT3Blbik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogYXBwbHlpbmcgcmFuZ2Ugc2VsZWN0aW9uLiBOb3RlLCB0aGF0IHRoaXMgZnVuY3Rpb24gd2lsbCBiZSBpbnZva2VkIGFmdGVyIGNvbWJvYm94IGl0ZW0ncyB2YWx1ZSBoYXMgYmVlbiBjaGFuZ2VkXG4gICAgICovXG4gICAgcHJpdmF0ZSBfb25MaXN0RWxlbWVudENsaWNrZWQoZXZlbnQ6IE1vdXNlRXZlbnQsIGluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgLy8gdmFsdWUgaGFzIGJlZW4gY2hhbmdlZCBhdCB0aGlzIHBvaW50LCBzbyBpdCBjYW4gYmUgc2FmZWx5IHVzZWRcbiAgICAgICAgY29uc3Qgc2VsZWN0aW9uU3RhdGUgPSB0aGlzLl9zdWdnZXN0aW9uc1tpbmRleF0uc2VsZWN0ZWQ7XG4gICAgICAgIHRoaXMuX3JhbmdlU2VsZWN0b3Iub25SYW5nZUVsZW1lbnRUb2dnbGVkKGluZGV4LCBldmVudCk7XG4gICAgICAgIGNvbnN0IHRvUmVtb3ZlU2V0ID0gbmV3IFNldCgpO1xuICAgICAgICB0aGlzLl9yYW5nZVNlbGVjdG9yLmFwcGx5VmFsdWVUb0VhY2hJblJhbmdlKChpZHgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGN1cnJlbnQgPSB0aGlzLl9zdWdnZXN0aW9uc1tpZHhdO1xuICAgICAgICAgICAgaWYgKGN1cnJlbnQuc2VsZWN0ZWQgIT09IHNlbGVjdGlvblN0YXRlKSB7XG4gICAgICAgICAgICAgICAgaWYgKGN1cnJlbnQuc2VsZWN0ZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gcmVtb3ZpbmcgZnJvbSBcIl9zZWxlY3RlZFN1Z2dlc3Rpb25zXCIgbGlzdFxuICAgICAgICAgICAgICAgICAgICB0b1JlbW92ZVNldC5hZGQoY3VycmVudC52YWx1ZSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gYWRkaW5nIGN1cnJlbnQgaXRlbSB0byBcIl9zZWxlY3RlZFN1Z2dlc3Rpb25zXCJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fc2VsZWN0ZWRTdWdnZXN0aW9ucy5wdXNoKGN1cnJlbnQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjdXJyZW50LnNlbGVjdGVkID0gc2VsZWN0aW9uU3RhdGU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLl9zZWxlY3RlZFN1Z2dlc3Rpb25zID0gdGhpcy5fc2VsZWN0ZWRTdWdnZXN0aW9ucy5maWx0ZXIoKHMpID0+ICF0b1JlbW92ZVNldC5oYXMocy52YWx1ZSkpO1xuICAgICAgICAvLyBzZWxlY3RlZCBpdGVtcyBzaG91bGQgYmUgZGlzcGxheWVkIGluIHRoZSBzYW1lIG9yZGVyIGFzIG9wdGlvbnNcbiAgICAgICAgY29uc3QgdmFsdWVJbmRleGVzID0gbmV3IE1hcDxhbnksIG51bWJlcj4odGhpcy5fc3VnZ2VzdGlvbnMubWFwKChzLCBpKSA9PiBbcy52YWx1ZSwgaV0pKTtcbiAgICAgICAgdGhpcy5fc2VsZWN0ZWRTdWdnZXN0aW9ucy5zb3J0KChhLCBiKSA9PiB2YWx1ZUluZGV4ZXMuZ2V0KGEudmFsdWUpISAtIHZhbHVlSW5kZXhlcy5nZXQoYi52YWx1ZSkhKTtcbiAgICAgICAgdGhpcy5fcHJvcGFnYXRlQ2hhbmdlKCk7XG5cbiAgICAgICAgdGhpcy5fdG9rZW5pemVyLm9uUmVzaXplKCk7XG5cbiAgICAgICAgdGhpcy5fdG9rZW5pemVyLnRva2VuaXplcklubmVyRWwubmF0aXZlRWxlbWVudC5zY3JvbGxMZWZ0ID1cbiAgICAgICAgICAgIHRoaXMuX3Rva2VuaXplci50b2tlbml6ZXJJbm5lckVsLm5hdGl2ZUVsZW1lbnQuc2Nyb2xsV2lkdGg7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gSGFuZGxlIGRpYWxvZyBkaXNtaXNzaW5nLCBjbG9zZXMgcG9wb3ZlciBhbmQgc2V0cyBiYWNrdXAgZGF0YS4gKi9cbiAgICBkaWFsb2dEaXNtaXNzKGJhY2t1cDogU2VsZWN0YWJsZU9wdGlvbkl0ZW1bXSk6IHZvaWQge1xuICAgICAgICB0aGlzLl9zZWxlY3RlZFN1Z2dlc3Rpb25zID0gWy4uLmJhY2t1cF07XG4gICAgICAgIHRoaXMuaW5wdXRUZXh0ID0gJyc7XG4gICAgICAgIHRoaXMuc2hvd0xpc3QoZmFsc2UpO1xuICAgICAgICB0aGlzLnNlbGVjdGVkU2hvd24kLm5leHQoZmFsc2UpO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuIEhhbmRsZSBkaWFsb2cgYXBwcm92YWwsIGNsb3NlcyBwb3BvdmVyIGFuZCBwcm9wYWdhdGVzIGRhdGEgY2hhbmdlcy4gKi9cbiAgICBkaWFsb2dBcHByb3ZlKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmlucHV0VGV4dCA9ICcnO1xuICAgICAgICB0aGlzLnNob3dMaXN0KGZhbHNlKTtcbiAgICAgICAgdGhpcy5fcHJvcGFnYXRlQ2hhbmdlKHRydWUpO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgcHJpdmF0ZSBfZ2V0VG9rZW5JbmRleEJ5SWRsT3JWYWx1ZShpdGVtOiBTZWxlY3RhYmxlT3B0aW9uSXRlbSk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zZWxlY3RlZFN1Z2dlc3Rpb25zLmZpbmRJbmRleCgodG9rZW4pID0+IHRva2VuLmlkID09PSBpdGVtLmlkIHx8IGVxdWFsKHRva2VuLnZhbHVlLCBpdGVtLnZhbHVlKSk7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBwcml2YXRlIF9tYXBBbmRVcGRhdGVNb2RlbCgpOiB2b2lkIHtcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWRJdGVtcyA9IHRoaXMuX3NlbGVjdGVkU3VnZ2VzdGlvbnMubWFwKCh7IHZhbHVlIH0pID0+IHZhbHVlKTtcblxuICAgICAgICAvLyBzZXR0aW5nIHZhbHVlLCBpdCB3aWxsIGNhbGwgc2V0VmFsdWUoKVxuICAgICAgICB0aGlzLnZhbHVlID0gc2VsZWN0ZWRJdGVtcztcblxuICAgICAgICB0aGlzLl9lbWl0Q2hhbmdlRXZlbnQoKTtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHByaXZhdGUgX3Byb3BhZ2F0ZUNoYW5nZShlbWl0SW5Nb2JpbGU/OiBib29sZWFuKTogdm9pZCB7XG4gICAgICAgIGlmICghdGhpcy5tb2JpbGUgfHwgZW1pdEluTW9iaWxlKSB7XG4gICAgICAgICAgICB0aGlzLm9uQ2hhbmdlKHRoaXMuX3NlbGVjdGVkU3VnZ2VzdGlvbnMpO1xuICAgICAgICAgICAgdGhpcy5fbWFwQW5kVXBkYXRlTW9kZWwoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgcHJpdmF0ZSBhc3luYyBfc2V0VXBNb2JpbGVNb2RlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBjb25zdCBpbmplY3RvciA9IEluamVjdG9yLmNyZWF0ZSh7XG4gICAgICAgICAgICBwcm92aWRlcnM6IFt7IHByb3ZpZGU6IE1VTFRJQ09NQk9CT1hfQ09NUE9ORU5ULCB1c2VWYWx1ZTogdGhpcyB9XSxcbiAgICAgICAgICAgIHBhcmVudDogdGhpcy5faW5qZWN0b3JcbiAgICAgICAgfSk7XG5cbiAgICAgICAgYXdhaXQgdGhpcy5fZHluYW1pY0NvbXBvbmVudFNlcnZpY2UuY3JlYXRlRHluYW1pY01vZHVsZShcbiAgICAgICAgICAgIHsgbGlzdFRlbXBsYXRlOiB0aGlzLmxpc3RUZW1wbGF0ZSwgY29udHJvbFRlbXBsYXRlOiB0aGlzLm1vYmlsZUNvbnRyb2xUZW1wbGF0ZSB9LFxuICAgICAgICAgICAgUGxhdGZvcm1NdWx0aUNvbWJvYm94TW9iaWxlTW9kdWxlLFxuICAgICAgICAgICAgTXVsdGlDb21ib2JveE1vYmlsZUNvbXBvbmVudCxcbiAgICAgICAgICAgIHRoaXMuX3ZpZXdDb250YWluZXJSZWYsXG4gICAgICAgICAgICBpbmplY3RvclxuICAgICAgICApO1xuICAgIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJmZHAtbXVsdGktY29tYm9ib3hcIj5cbiAgICA8bmctY29udGFpbmVyIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImNvbnRyb2xUZW1wbGF0ZVwiICpuZ0lmPVwibW9iaWxlXCI+PC9uZy1jb250YWluZXI+XG5cbiAgICA8ZmQtcG9wb3ZlclxuICAgICAgICAqbmdJZj1cIiFtb2JpbGVcIlxuICAgICAgICBhZGRpdGlvbmFsQm9keUNsYXNzPVwiZmQtcG9wb3Zlci1jdXN0b20tbGlzdCBmZHAtbXVsdGktY29tYm9ib3hfX2xpc3QtY29udGFpbmVyXCJcbiAgICAgICAgKGlzT3BlbkNoYW5nZSk9XCJwb3BvdmVyT3BlbkNoYW5nZUhhbmRsZSgkZXZlbnQpXCJcbiAgICAgICAgW2lzT3Blbl09XCJpc09wZW5cIlxuICAgICAgICBbdHJpZ2dlcnNdPVwiW11cIlxuICAgICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxuICAgICAgICBbZmlsbENvbnRyb2xNb2RlXT1cImZpbGxDb250cm9sTW9kZVwiXG4gICAgPlxuICAgICAgICA8ZmQtcG9wb3Zlci1jb250cm9sPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiY29udHJvbFRlbXBsYXRlXCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9mZC1wb3BvdmVyLWNvbnRyb2w+XG4gICAgICAgIDxmZC1wb3BvdmVyLWJvZHkgW3N0eWxlLndpZHRoLiVdPVwiIWF1dG9SZXNpemUgJiYgMTAwXCI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwibGlzdFRlbXBsYXRlXCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8bmctY29udGVudD48L25nLWNvbnRlbnQ+XG4gICAgICAgIDwvZmQtcG9wb3Zlci1ib2R5PlxuICAgIDwvZmQtcG9wb3Zlcj5cbjwvZGl2PlxuXG48bmctdGVtcGxhdGUgI2NvbnRyb2xUZW1wbGF0ZT5cbiAgICA8ZmQtZm9ybS1pbnB1dC1tZXNzYWdlLWdyb3VwPlxuICAgICAgICA8ZmQtaW5wdXQtZ3JvdXBcbiAgICAgICAgICAgIFtpZF09XCJpZCArICctaW5wdXQtZ3JvdXAtY29udGFpbmVyJ1wiXG4gICAgICAgICAgICBjbGFzcz1cImZkcC1tdWx0aS1jb21ib2JveC1pbnB1dC1ncm91cC1jdXN0b21cIlxuICAgICAgICAgICAgW3N0YXRlXT1cInN0YXRlXCJcbiAgICAgICAgICAgIFtidXR0b25Gb2N1c2FibGVdPVwiYnV0dG9uRm9jdXNhYmxlXCJcbiAgICAgICAgICAgIFtidXR0b25dPVwiIXJlYWRvbmx5XCJcbiAgICAgICAgICAgIFtnbHlwaF09XCIhcmVhZG9ubHkgPyAnbmF2aWdhdGlvbi1kb3duLWFycm93JyA6ICcgJ1wiXG4gICAgICAgICAgICBbaXNDb250cm9sXT1cInRydWVcIlxuICAgICAgICAgICAgW2Rpc2FibGVkXT1cImRpc2FibGVkIHx8IHJlYWRvbmx5XCJcbiAgICAgICAgICAgIFtpc0V4cGFuZGVkXT1cIiFtb2JpbGUgJiYgaXNPcGVuICYmIF9zdWdnZXN0aW9ucy5sZW5ndGggPiAwXCJcbiAgICAgICAgICAgIFthdHRyLmFyaWEtZGlzYWJsZWRdPVwiZGlzYWJsZWQgfHwgcmVhZG9ubHlcIlxuICAgICAgICAgICAgW2F0dHIuYXJpYS1yZWFkb25seV09XCJyZWFkb25seVwiXG4gICAgICAgICAgICBbZ2x5cGhBcmlhTGFiZWxdPVwiYXJpYUxhYmVsIHx8ICgncGxhdGZvcm1NdWx0aUNvbWJvYm94LmlucHV0R2x5cGhBcmlhTGFiZWwnIHwgZmRUcmFuc2xhdGUpXCJcbiAgICAgICAgICAgIFtpY29uVGl0bGVdPVwiYWRkb25JY29uVGl0bGUgfHwgKCdwbGF0Zm9ybU11bHRpQ29tYm9ib3guaW5wdXRHbHlwaEFyaWFMYWJlbCcgfCBmZFRyYW5zbGF0ZSlcIlxuICAgICAgICAgICAgKGFkZE9uQnV0dG9uQ2xpY2tlZCk9XCJfYWRkT25DbGlja2VkKCRldmVudClcIlxuICAgICAgICAgICAgKGNsaWNrKT1cIm1vYmlsZSAmJiAhaXNPcGVuICYmIG9uUHJpbWFyeUJ1dHRvbkNsaWNrKGZhbHNlKVwiXG4gICAgICAgICAgICAoa2V5ZG93bik9XCJuYXZpZ2F0ZUJ5VG9rZW5zKCRldmVudClcIlxuICAgICAgICA+XG4gICAgICAgICAgICA8ZmQtdG9rZW5pemVyXG4gICAgICAgICAgICAgICAgI3Rva2VuaXplclxuICAgICAgICAgICAgICAgIFtjb21wYWN0Q29sbGFwc2VdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgKm5nSWY9XCJfc2VsZWN0ZWRTdWdnZXN0aW9uc1wiXG4gICAgICAgICAgICAgICAgW3Rva2VuaXplckZvY3VzYWJsZV09XCJmYWxzZVwiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJmZHAtbXVsdGktY29tYm9ib3gtdG9rZW5pemVyLWN1c3RvbVwiXG4gICAgICAgICAgICAgICAgKG1vcmVDbGlja2VkRXZlbnQpPVwibW9yZUNsaWNrZWQoKVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPGZkLXRva2VuXG4gICAgICAgICAgICAgICAgICAgIFtyZWFkT25seV09XCJkaXNhYmxlZFwiXG4gICAgICAgICAgICAgICAgICAgIChvbkNsb3NlQ2xpY2spPVwicmVtb3ZlVG9rZW4odG9rZW4sICRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgdG9rZW4gb2YgX3NlbGVjdGVkU3VnZ2VzdGlvbnNcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAge3sgdG9rZW4ubGFiZWwgfX1cbiAgICAgICAgICAgICAgICA8L2ZkLXRva2VuPlxuXG4gICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICAgICNzZWFyY2hJbnB1dEVsZW1lbnRcbiAgICAgICAgICAgICAgICAgICAgZmRwLWF1dG8tY29tcGxldGVcbiAgICAgICAgICAgICAgICAgICAgKG9uQ29tcGxldGUpPVwib25Db21wbGV0ZVRlcm0oJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgIFtvcHRpb25zXT1cIl9zdWdnZXN0aW9uc1wiXG4gICAgICAgICAgICAgICAgICAgIFtpbnB1dFRleHRdPVwiaW5wdXRUZXh0XCJcbiAgICAgICAgICAgICAgICAgICAgW21vYmlsZV09XCJtb2JpbGVcIlxuICAgICAgICAgICAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICAgICAgICAgIHJvbGU9XCJjb21ib2JveFwiXG4gICAgICAgICAgICAgICAgICAgIGF1dG9jb21wbGV0ZT1cIm9mZlwiXG4gICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiYXJpYUxhYmVsXCJcbiAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbGxlZGJ5XT1cImFyaWFMYWJlbGxlZEJ5XCJcbiAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1hdXRvY29tcGxldGVdPVwiYXV0b0NvbXBsZXRlICYmICFtb2JpbGUgPyAnbGlzdCcgOiBudWxsXCJcbiAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1vd25zXT1cImF1dG9Db21wbGV0ZSAmJiAhbW9iaWxlID8gaWQgKyAnLXJlc3VsdCcgOiBudWxsXCJcbiAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1oYXNwb3B1cF09XCJhdXRvQ29tcGxldGUgJiYgIW1vYmlsZVwiXG4gICAgICAgICAgICAgICAgICAgIGZkLWZvcm0tY29udHJvbFxuICAgICAgICAgICAgICAgICAgICBmZC1pbnB1dC1ncm91cC1pbnB1dFxuICAgICAgICAgICAgICAgICAgICB0YWJpbmRleD1cIjBcIlxuICAgICAgICAgICAgICAgICAgICBbaWRdPVwiaWRcIlxuICAgICAgICAgICAgICAgICAgICBbbmFtZV09XCJuYW1lXCJcbiAgICAgICAgICAgICAgICAgICAgKGtleWRvd24pPVwib25JbnB1dEtleWRvd25IYW5kbGVyKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxuICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cImlucHV0VGV4dFwiXG4gICAgICAgICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cInNlYXJjaFRlcm1DaGFuZ2VkKClcIlxuICAgICAgICAgICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwicGxhY2Vob2xkZXJcIlxuICAgICAgICAgICAgICAgICAgICAoZm9jdXMpPVwib25Ub3VjaGVkKCk7IHRva2VuaXplci5fc2hvd0FsbFRva2VucygpXCJcbiAgICAgICAgICAgICAgICAgICAgKGJsdXIpPVwiIW1vYmlsZSAmJiBvbkJsdXIoJGV2ZW50KTsgdG9rZW5pemVyLl9oaWRlVG9rZW5zKClcIlxuICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWV4cGFuZGVkXT1cImlzT3BlblwiXG4gICAgICAgICAgICAgICAgICAgIFtyZWFkb25seV09XCJyZWFkb25seVwiXG4gICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtcmVhZG9ubHldPVwicmVhZG9ubHlcIlxuICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLXJlcXVpcmVkXT1cInJlcXVpcmVkXCJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmZC10b2tlbml6ZXJfX2lucHV0XCJcbiAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgPC9mZC10b2tlbml6ZXI+XG4gICAgICAgIDwvZmQtaW5wdXQtZ3JvdXA+XG5cbiAgICAgICAgPGZkLWZvcm0tbWVzc2FnZVxuICAgICAgICAgICAgKm5nSWY9XCJtb2JpbGUgJiYgaXNPcGVuID8gZmFsc2UgOiAhIXN0YXRlTWVzc2FnZVwiXG4gICAgICAgICAgICBbdHlwZV09XCJzdGF0ZVwiXG4gICAgICAgICAgICBbaW5uZXJIdG1sXT1cInN0YXRlTWVzc2FnZVwiXG4gICAgICAgID48L2ZkLWZvcm0tbWVzc2FnZT5cbiAgICA8L2ZkLWZvcm0taW5wdXQtbWVzc2FnZS1ncm91cD5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjbW9iaWxlQ29udHJvbFRlbXBsYXRlPlxuICAgIDxmZC1pbnB1dC1ncm91cFxuICAgICAgICBbaWRdPVwiaWQgKyAnLWlucHV0LWdyb3VwLWNvbnRhaW5lcidcIlxuICAgICAgICBjbGFzcz1cImZkcC1tdWx0aS1jb21ib2JveC1pbnB1dC1ncm91cC1jdXN0b21cIlxuICAgICAgICBbc3RhdGVdPVwic3RhdGVcIlxuICAgICAgICBbYnV0dG9uRm9jdXNhYmxlXT1cImZhbHNlXCJcbiAgICAgICAgW2lzQ29udHJvbF09XCJ0cnVlXCJcbiAgICAgICAgW2Rpc2FibGVkXT1cImRpc2FibGVkIHx8IHJlYWRvbmx5XCJcbiAgICAgICAgW2lzRXhwYW5kZWRdPVwiIW1vYmlsZSAmJiBpc09wZW4gJiYgX3N1Z2dlc3Rpb25zLmxlbmd0aCA+IDBcIlxuICAgICAgICBbYXR0ci5hcmlhLWRpc2FibGVkXT1cImRpc2FibGVkIHx8IHJlYWRvbmx5XCJcbiAgICAgICAgW2F0dHIuYXJpYS1yZWFkb25seV09XCJyZWFkb25seVwiXG4gICAgICAgIFtnbHlwaEFyaWFMYWJlbF09XCJhcmlhTGFiZWxcIlxuICAgID5cbiAgICAgICAgPGlucHV0XG4gICAgICAgICAgICBmZHAtYXV0by1jb21wbGV0ZVxuICAgICAgICAgICAgKG9uQ29tcGxldGUpPVwib25Db21wbGV0ZVRlcm0oJGV2ZW50KVwiXG4gICAgICAgICAgICBbb3B0aW9uc109XCJfc3VnZ2VzdGlvbnNcIlxuICAgICAgICAgICAgW2lucHV0VGV4dF09XCJpbnB1dFRleHRcIlxuICAgICAgICAgICAgW21vYmlsZV09XCJtb2JpbGVcIlxuICAgICAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAgcm9sZT1cImNvbWJvYm94XCJcbiAgICAgICAgICAgIGF1dG9jb21wbGV0ZT1cIm9mZlwiXG4gICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cImFyaWFMYWJlbFwiXG4gICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsbGVkYnldPVwiYXJpYUxhYmVsbGVkQnlcIlxuICAgICAgICAgICAgW2F0dHIuYXJpYS1hdXRvY29tcGxldGVdPVwiYXV0b0NvbXBsZXRlICYmICFtb2JpbGUgPyAnbGlzdCcgOiBudWxsXCJcbiAgICAgICAgICAgIFthdHRyLmFyaWEtb3duc109XCJhdXRvQ29tcGxldGUgJiYgIW1vYmlsZSA/IGlkICsgJy1yZXN1bHQnIDogbnVsbFwiXG4gICAgICAgICAgICBbYXR0ci5hcmlhLWhhc3BvcHVwXT1cImF1dG9Db21wbGV0ZSAmJiAhbW9iaWxlXCJcbiAgICAgICAgICAgIGZkLWZvcm0tY29udHJvbFxuICAgICAgICAgICAgZmQtaW5wdXQtZ3JvdXAtaW5wdXRcbiAgICAgICAgICAgIHRhYmluZGV4PVwiMFwiXG4gICAgICAgICAgICBbaWRdPVwiaWRcIlxuICAgICAgICAgICAgW25hbWVdPVwibmFtZVwiXG4gICAgICAgICAgICAoa2V5ZG93bik9XCJvbklucHV0S2V5ZG93bkhhbmRsZXIoJGV2ZW50KVwiXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxuICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJpbnB1dFRleHRcIlxuICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwic2VhcmNoVGVybUNoYW5nZWQoKVwiXG4gICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwicGxhY2Vob2xkZXJcIlxuICAgICAgICAgICAgKGZvY3VzKT1cIm9uVG91Y2hlZCgpXCJcbiAgICAgICAgICAgIChibHVyKT1cIiFtb2JpbGUgJiYgb25CbHVyKCRldmVudClcIlxuICAgICAgICAgICAgW2F0dHIuYXJpYS1leHBhbmRlZF09XCJpc09wZW5cIlxuICAgICAgICAgICAgW3JlYWRvbmx5XT1cInJlYWRvbmx5XCJcbiAgICAgICAgICAgIFthdHRyLmFyaWEtcmVhZG9ubHldPVwicmVhZG9ubHlcIlxuICAgICAgICAvPlxuICAgIDwvZmQtaW5wdXQtZ3JvdXA+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI2xpc3RUZW1wbGF0ZT5cbiAgICA8dWxcbiAgICAgICAgZmQtbGlzdFxuICAgICAgICBbaGFzTWVzc2FnZV09XCIhIXN0YXRlTWVzc2FnZVwiXG4gICAgICAgIChmb2N1c0VzY2FwZUxpc3QpPVwiaGFuZGxlTGlzdEZvY3VzRXNjYXBlKCRldmVudClcIlxuICAgICAgICBbZHJvcGRvd25Nb2RlXT1cInRydWVcIlxuICAgICAgICBjbGFzcz1cImZkcC1tdWx0aS1jb21ib2JveF9fbGlzdCBmZC1saXN0LS1tdWx0aS1pbnB1dFwiXG4gICAgICAgIFtpZF09XCJpZCArICctcmVzdWx0J1wiXG4gICAgICAgIHJvbGU9XCJsaXN0Ym94XCJcbiAgICAgICAgW3N0eWxlLm1heEhlaWdodF09XCIhbW9iaWxlICYmIG1heEhlaWdodFwiXG4gICAgICAgIFtzdHlsZS5taW5XaWR0aF09XCIhbW9iaWxlICYmIG1pbldpZHRoICsgJ3B4J1wiXG4gICAgICAgIFtzdHlsZS5tYXhXaWR0aF09XCJhdXRvUmVzaXplICYmIG1heFdpZHRoICsgJ3B4J1wiXG4gICAgICAgIFthdHRyLmFyaWEtbGFiZWxsZWRieV09XCJpZCArICctc2VhcmNoJ1wiXG4gICAgICAgIGFyaWEtbXVsdGlzZWxlY3RhYmxlPVwidHJ1ZVwiXG4gICAgPlxuICAgICAgICA8bGlcbiAgICAgICAgICAgICpuZ0lmPVwic3RhdGVNZXNzYWdlXCJcbiAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwic3RhdGVNZXNzYWdlXCJcbiAgICAgICAgICAgIGZkLWxpc3QtbWVzc2FnZVxuICAgICAgICAgICAgdGFiaW5kZXg9XCItMVwiXG4gICAgICAgICAgICByb2xlPVwicHJlc2VudGF0aW9uXCJcbiAgICAgICAgICAgIFt0eXBlXT1cInN0YXRlIHx8ICdkZWZhdWx0J1wiXG4gICAgICAgICAgICBbaW5uZXJIdG1sXT1cInN0YXRlTWVzc2FnZVwiXG4gICAgICAgID48L2xpPlxuXG4gICAgICAgIDxuZy1jb250ZW50PjwvbmctY29udGVudD5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImlzR3JvdXBcIj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGdyb3VwIG9mIF9zdWdnZXN0aW9uc1wiPlxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhZ3JvdXBJdGVtVGVtcGxhdGVcIj5cbiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZkLWxpc3QtaXRlbSBmZC1saXN0LWdyb3VwLWhlYWRlciByb2xlPVwiZ3JvdXBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGZkLWxpc3QtdGl0bGU+e3sgZ3JvdXAubGFiZWwgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZ3JvdXBJdGVtVGVtcGxhdGVcIj5cbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRdPVwiZ3JvdXBJdGVtVGVtcGxhdGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInsgJGltcGxpY2l0OiB7IGxhYmVsOiBncm91cC5sYWJlbCB9IH1cIlxuICAgICAgICAgICAgICAgICAgICA+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgICAgICA8bGlcbiAgICAgICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IG9wdGlvbkl0ZW0gb2YgZ3JvdXAuY2hpbGRyZW47IGxldCBpID0gaW5kZXhcIlxuICAgICAgICAgICAgICAgICAgICBmZC1saXN0LWl0ZW1cbiAgICAgICAgICAgICAgICAgICAgcm9sZT1cIm9wdGlvblwiXG4gICAgICAgICAgICAgICAgICAgIFt0YWJpbmRleF09XCIwXCJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIiFtb2JpbGUgJiYgY2xvc2UoKVwiXG4gICAgICAgICAgICAgICAgICAgIChrZXlEb3duKT1cIm9uSXRlbUtleURvd25IYW5kbGVyKCRldmVudCwgaSlcIlxuICAgICAgICAgICAgICAgICAgICBbc2VsZWN0ZWRdPVwiISFvcHRpb25JdGVtLnNlbGVjdGVkXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDxmZC1jaGVja2JveFxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uT3B0aW9uQ2hlY2tib3hDbGlja2VkKCRldmVudCwgaSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwidG9nZ2xlU2VsZWN0aW9uKG9wdGlvbkl0ZW0pXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtuZ01vZGVsXT1cIm9wdGlvbkl0ZW0uc2VsZWN0ZWRcIlxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDwvZmQtY2hlY2tib3g+XG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImxpc3RJdGVtXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7IG9wdGlvbkl0ZW06IG9wdGlvbkl0ZW0sIGluZGV4OiBpIH1cIlxuICAgICAgICAgICAgICAgICAgICA+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgPC9saT5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWlzR3JvdXBcIj5cbiAgICAgICAgICAgIDxsaVxuICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBvcHRpb25JdGVtIG9mIF9zdWdnZXN0aW9uczsgbGV0IGkgPSBpbmRleFwiXG4gICAgICAgICAgICAgICAgZmQtbGlzdC1pdGVtXG4gICAgICAgICAgICAgICAgcm9sZT1cIm9wdGlvblwiXG4gICAgICAgICAgICAgICAgW3RhYmluZGV4XT1cIjBcIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCIhbW9iaWxlICYmIG9uT3B0aW9uQ2xpY2tlZCgkZXZlbnQsIGkpXCJcbiAgICAgICAgICAgICAgICAoa2V5RG93bik9XCJvbkl0ZW1LZXlEb3duSGFuZGxlcigkZXZlbnQsIGkpXCJcbiAgICAgICAgICAgICAgICBbc2VsZWN0ZWRdPVwiISFvcHRpb25JdGVtLnNlbGVjdGVkXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8ZmQtY2hlY2tib3hcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uT3B0aW9uQ2hlY2tib3hDbGlja2VkKCRldmVudCwgaSlcIlxuICAgICAgICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJ0b2dnbGVTZWxlY3Rpb24ob3B0aW9uSXRlbSlcIlxuICAgICAgICAgICAgICAgICAgICBbbmdNb2RlbF09XCJvcHRpb25JdGVtLnNlbGVjdGVkXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPC9mZC1jaGVja2JveD5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImxpc3RJdGVtXCJcbiAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInsgb3B0aW9uSXRlbTogb3B0aW9uSXRlbSwgaW5kZXg6IGkgfVwiXG4gICAgICAgICAgICAgICAgPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPC9saT5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgPC91bD5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSBsZXQtb3B0aW9uSXRlbT1cIm9wdGlvbkl0ZW1cIiBsZXQtaW5kZXg9XCJpbmRleFwiICNsaXN0SXRlbT5cbiAgICA8bmctY29udGFpbmVyXG4gICAgICAgICpuZ0lmPVwib3B0aW9uSXRlbS5zZWxlY3RlZCAmJiAhIXNlbGVjdGVkSXRlbVRlbXBsYXRlXCJcbiAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRdPVwic2VsZWN0ZWRJdGVtVGVtcGxhdGVcIlxuICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyAkaW1wbGljaXQ6IG9wdGlvbkl0ZW0udmFsdWUsIGluZGV4OiBpbmRleCB9XCJcbiAgICA+PC9uZy1jb250YWluZXI+XG5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIShvcHRpb25JdGVtLnNlbGVjdGVkICYmIHNlbGVjdGVkSXRlbVRlbXBsYXRlKVwiPlxuICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldF09XCJvcHRpb25JdGVtU291cmNlXCJcbiAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7IG9wdGlvbkl0ZW06IG9wdGlvbkl0ZW0sIGluZGV4OiBpbmRleCB9XCJcbiAgICAgICAgPjwvbmctY29udGFpbmVyPlxuXG4gICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0XT1cInNlY29uZGFyeVRleHRTb3VyY2VcIlxuICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInsgb3B0aW9uSXRlbTogb3B0aW9uSXRlbSB9XCJcbiAgICAgICAgPjwvbmctY29udGFpbmVyPlxuICAgIDwvbmctY29udGFpbmVyPlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlIGxldC1vcHRpb25JdGVtPVwib3B0aW9uSXRlbVwiIGxldC1pbmRleD1cImluZGV4XCIgI29wdGlvbkl0ZW1Tb3VyY2U+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFvcHRpb25JdGVtVGVtcGxhdGVcIj5cbiAgICAgICAgPHNwYW5cbiAgICAgICAgICAgIGZkLWxpc3QtdGl0bGVcbiAgICAgICAgICAgIFthdHRyLnRpdGxlXT1cIm9wdGlvbkl0ZW0ubGFiZWxcIlxuICAgICAgICAgICAgW2lubmVySFRNTF09XCJvcHRpb25JdGVtLmxhYmVsIHwgaGlnaGxpZ2h0IDogaW5wdXRUZXh0XCJcbiAgICAgICAgPjwvc3Bhbj5cbiAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJvcHRpb25JdGVtVGVtcGxhdGVcIj5cbiAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRdPVwib3B0aW9uSXRlbVRlbXBsYXRlXCJcbiAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7ICRpbXBsaWNpdDogb3B0aW9uSXRlbS52YWx1ZSwgaW5kZXg6IGluZGV4IH1cIlxuICAgICAgICA+PC9uZy1jb250YWluZXI+XG4gICAgPC9uZy1jb250YWluZXI+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgbGV0LW9wdGlvbkl0ZW09XCJvcHRpb25JdGVtXCIgI3NlY29uZGFyeVRleHRTb3VyY2U+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInNob3dTZWNvbmRhcnlUZXh0XCI+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhc2Vjb25kYXJ5SXRlbVRlbXBsYXRlXCI+XG4gICAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgICAgIFtzdHlsZS50ZXh0LWFsaWduXT1cInNlY29uZGFyeVRleHRBbGlnbm1lbnRcIlxuICAgICAgICAgICAgICAgIGZkLWxpc3Qtc2Vjb25kYXJ5XG4gICAgICAgICAgICAgICAgW2F0dHIudGl0bGVdPVwib3B0aW9uSXRlbS5zZWNvbmRhcnlUZXh0XCJcbiAgICAgICAgICAgICAgICBbaW5uZXJIVE1MXT1cIm9wdGlvbkl0ZW0uc2Vjb25kYXJ5VGV4dCB8IGhpZ2hsaWdodCA6IGlucHV0VGV4dFwiXG4gICAgICAgICAgICA+PC9zcGFuPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwic2Vjb25kYXJ5SXRlbVRlbXBsYXRlXCI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRdPVwic2Vjb25kYXJ5SXRlbVRlbXBsYXRlXCJcbiAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyAkaW1wbGljaXQ6IG9wdGlvbkl0ZW0udmFsdWUgfVwiXG4gICAgICAgICAgICA+PC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgIDwvbmctY29udGFpbmVyPlxuPC9uZy10ZW1wbGF0ZT5cbiJdfQ==
388
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibXVsdGktY29tYm9ib3guY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9wbGF0Zm9ybS9zcmMvbGliL2Zvcm0vbXVsdGktY29tYm9ib3gvbXVsdGktY29tYm9ib3gvbXVsdGktY29tYm9ib3guY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9wbGF0Zm9ybS9zcmMvbGliL2Zvcm0vbXVsdGktY29tYm9ib3gvbXVsdGktY29tYm9ib3gvbXVsdGktY29tYm9ib3guY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUVILHVCQUF1QixFQUN2QixpQkFBaUIsRUFDakIsU0FBUyxFQUNULFVBQVUsRUFDVixJQUFJLEVBQ0osTUFBTSxFQUNOLFFBQVEsRUFDUixTQUFTLEVBRVQsUUFBUSxFQUNSLElBQUksRUFDSixRQUFRLEVBQ1IsV0FBVyxFQUNYLFNBQVMsRUFDVCxnQkFBZ0IsRUFDaEIsaUJBQWlCLEVBQ3BCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ2xGLE9BQU8sRUFBRSxDQUFDLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxRQUFRLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUMzRixPQUFPLEVBQUUsYUFBYSxFQUFFLHFCQUFxQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDbEYsT0FBTyxLQUFLLE1BQU0saUJBQWlCLENBQUM7QUFFcEMsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUN4RixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDNUQsT0FBTyxFQUNI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dGVjdGlvblN0cmF0ZWd5LFxuICAgIENoYW5nZURldGVjdG9yUmVmLFxuICAgIENvbXBvbmVudCxcbiAgICBFbGVtZW50UmVmLFxuICAgIEhvc3QsXG4gICAgSW5qZWN0LFxuICAgIEluamVjdG9yLFxuICAgIGlzRGV2TW9kZSxcbiAgICBPbkluaXQsXG4gICAgT3B0aW9uYWwsXG4gICAgU2VsZixcbiAgICBTa2lwU2VsZixcbiAgICBUZW1wbGF0ZVJlZixcbiAgICBWaWV3Q2hpbGQsXG4gICAgVmlld0NvbnRhaW5lclJlZixcbiAgICBWaWV3RW5jYXBzdWxhdGlvblxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbnRyb2xDb250YWluZXIsIE5nQ29udHJvbCwgTmdGb3JtLCBGb3Jtc01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IEEsIERPV05fQVJST1csIEVOVEVSLCBFU0NBUEUsIFNQQUNFLCBUQUIsIFVQX0FSUk9XIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2tleWNvZGVzJztcbmltcG9ydCB7IEZEX0ZPUk1fRklFTEQsIEZEX0ZPUk1fRklFTERfQ09OVFJPTCB9IGZyb20gJ0BmdW5kYW1lbnRhbC1uZ3gvY2RrL2Zvcm1zJztcbmltcG9ydCBlcXVhbCBmcm9tICdmYXN0LWRlZXAtZXF1YWwnO1xuXG5pbXBvcnQgeyBEeW5hbWljQ29tcG9uZW50U2VydmljZSwgS2V5VXRpbCwgd2Fybk9uY2UgfSBmcm9tICdAZnVuZGFtZW50YWwtbmd4L2Nkay91dGlscyc7XG5pbXBvcnQgeyBEaWFsb2dDb25maWcgfSBmcm9tICdAZnVuZGFtZW50YWwtbmd4L2NvcmUvZGlhbG9nJztcbmltcG9ydCB7XG4gICAgREFUQV9QUk9WSURFUlMsXG4gICAgRGF0YVByb3ZpZGVyLFxuICAgIE11bHRpQ29tYm9Cb3hEYXRhU291cmNlLFxuICAgIE9wdGlvbkl0ZW0sXG4gICAgUGxhdGZvcm1Gb3JtRmllbGQsXG4gICAgUGxhdGZvcm1Gb3JtRmllbGRDb250cm9sLFxuICAgIFNlbGVjdGFibGVPcHRpb25JdGVtXG59IGZyb20gJ0BmdW5kYW1lbnRhbC1uZ3gvcGxhdGZvcm0vc2hhcmVkJztcblxuaW1wb3J0IHsgQmFzZU11bHRpQ29tYm9ib3gsIE1BUF9MSU1JVCB9IGZyb20gJy4uL2NvbW1vbnMvYmFzZS1tdWx0aS1jb21ib2JveCc7XG5pbXBvcnQgeyBNdWx0aUNvbWJvYm94TW9iaWxlQ29tcG9uZW50IH0gZnJvbSAnLi4vbXVsdGktY29tYm9ib3gtbW9iaWxlL211bHRpLWNvbWJvYm94L211bHRpLWNvbWJvYm94LW1vYmlsZS5jb21wb25lbnQnO1xuaW1wb3J0IHsgUGxhdGZvcm1NdWx0aUNvbWJvYm94TW9iaWxlTW9kdWxlIH0gZnJvbSAnLi4vbXVsdGktY29tYm9ib3gtbW9iaWxlL211bHRpLWNvbWJvYm94LW1vYmlsZS5tb2R1bGUnO1xuaW1wb3J0IHsgTVVMVElDT01CT0JPWF9DT01QT05FTlQgfSBmcm9tICcuLi9tdWx0aS1jb21ib2JveC5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgTXVsdGlDb21ib2JveENvbmZpZyB9IGZyb20gJy4uL211bHRpLWNvbWJvYm94LmNvbmZpZyc7XG5pbXBvcnQgeyBBdXRvQ29tcGxldGVFdmVudCwgQXV0b0NvbXBsZXRlRGlyZWN0aXZlIH0gZnJvbSAnLi4vLi4vYXV0by1jb21wbGV0ZS9hdXRvLWNvbXBsZXRlLmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBUb2tlbml6ZXJDb21wb25lbnQsIFRva2VuTW9kdWxlIH0gZnJvbSAnQGZ1bmRhbWVudGFsLW5neC9jb3JlL3Rva2VuJztcbmltcG9ydCB7XG4gICAgQ29udGVudERlbnNpdHlNb2R1bGUsXG4gICAgQ29udGVudERlbnNpdHlPYnNlcnZlcixcbiAgICBjb250ZW50RGVuc2l0eU9ic2VydmVyUHJvdmlkZXJzXG59IGZyb20gJ0BmdW5kYW1lbnRhbC1uZ3gvY29yZS9jb250ZW50LWRlbnNpdHknO1xuaW1wb3J0IHsgRmRUcmFuc2xhdGVQaXBlIH0gZnJvbSAnQGZ1bmRhbWVudGFsLW5neC9pMThuJztcbmltcG9ydCB7IFNlYXJjaEhpZ2hsaWdodFBpcGUgfSBmcm9tICdAZnVuZGFtZW50YWwtbmd4L2Nkay91dGlscyc7XG5pbXBvcnQgeyBOZ0lmLCBOZ1RlbXBsYXRlT3V0bGV0LCBOZ0ZvciwgTmdDbGFzcyB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBQb3BvdmVyQm9keUNvbXBvbmVudCwgUG9wb3ZlckNvbXBvbmVudCwgUG9wb3ZlckNvbnRyb2xDb21wb25lbnQgfSBmcm9tICdAZnVuZGFtZW50YWwtbmd4L2NvcmUvcG9wb3Zlcic7XG5pbXBvcnQgeyBGb3JtQ29udHJvbE1vZHVsZSwgRm9ybUlucHV0TWVzc2FnZUdyb3VwTW9kdWxlLCBGb3JtTWVzc2FnZU1vZHVsZSB9IGZyb20gJ0BmdW5kYW1lbnRhbC1uZ3gvY29yZS9mb3JtJztcbmltcG9ydCB7IElucHV0R3JvdXBNb2R1bGUgfSBmcm9tICdAZnVuZGFtZW50YWwtbmd4L2NvcmUvaW5wdXQtZ3JvdXAnO1xuaW1wb3J0IHsgTGlzdE1vZHVsZSwgTGlzdFNlY29uZGFyeURpcmVjdGl2ZSB9IGZyb20gJ0BmdW5kYW1lbnRhbC1uZ3gvY29yZS9saXN0JztcbmltcG9ydCB7IENoZWNrYm94Q29tcG9uZW50IH0gZnJvbSAnQGZ1bmRhbWVudGFsLW5neC9jb3JlL2NoZWNrYm94JztcblxubGV0IGRlcHJlY2F0aW9uV2FybmluZ1Nob3duID0gZmFsc2U7XG5cbi8qKlxuICogVGhpcyBjb21wb25lbnQgY2FuIHdvcmsgd2l0aCBib3RoIHN0cmluZyBwcmltaXRpdmVzIGFzIHdlbGwgYXMgd2l0aCBjb21wbGV4IG9iamVjdHMuIEluIG9yZGVyXG4gKiB0byB1c2Ugb2JqZWN0cyB1c2VyIG11c3QgcHJvdmlkZSBhbiB1bmlxdWUgSUQgdG8gbG9va3Vwa2V5LCB3aGljaCB3aWxsIGJlIHVzZWQgaW4gY29tcGFyaW5nXG4gKiBlYWNoIGl0ZW1zIG9mIGFycmF5LiBJdCBpcyBpbXBvcnRhbnQgdG8gcHJvdmlkZSBsb29rdXBrZXkgdmFsdWUgYXMgdGhlcmUgbWlnaHQgYmUgbXVsdGlwbGVcbiAqIGl0ZW1zIHdpdGggc2FtZSBuYW1lIGJ1dCBkaWZmZXJlbnQgcHJvcGVydGllcyB3aGljaCBpcyB0byBiZSBkaWZmZXJlbnRseSBpZGVudGlmaWVkIG90aGVyd2lzZVxuICogaXQgd2lsbCBiZSB0cmVhdGVkIGFzIHNhbWUgb2JqZWN0cy5cbiAqL1xuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ2ZkcC1tdWx0aS1jb21ib2JveCcsXG4gICAgdGVtcGxhdGVVcmw6ICcuL211bHRpLWNvbWJvYm94LmNvbXBvbmVudC5odG1sJyxcbiAgICBzdHlsZVVybHM6IFsnLi9tdWx0aS1jb21ib2JveC5jb21wb25lbnQuc2NzcyddLFxuICAgIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICAgIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXG4gICAgcHJvdmlkZXJzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICAgIHByb3ZpZGU6IEZEX0ZPUk1fRklFTERfQ09OVFJPTCxcbiAgICAgICAgICAgIHVzZUV4aXN0aW5nOiBNdWx0aUNvbWJvYm94Q29tcG9uZW50LFxuICAgICAgICAgICAgbXVsdGk6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgY29udGVudERlbnNpdHlPYnNlcnZlclByb3ZpZGVycygpXG4gICAgXSxcbiAgICBzdGFuZGFsb25lOiB0cnVlLFxuICAgIGltcG9ydHM6IFtcbiAgICAgICAgTmdJZixcbiAgICAgICAgTmdUZW1wbGF0ZU91dGxldCxcbiAgICAgICAgUG9wb3ZlckNvbXBvbmVudCxcbiAgICAgICAgUG9wb3ZlckNvbnRyb2xDb21wb25lbnQsXG4gICAgICAgIFBvcG92ZXJCb2R5Q29tcG9uZW50LFxuICAgICAgICBGb3JtSW5wdXRNZXNzYWdlR3JvdXBNb2R1bGUsXG4gICAgICAgIElucHV0R3JvdXBNb2R1bGUsXG4gICAgICAgIFRva2VuTW9kdWxlLFxuICAgICAgICBOZ0ZvcixcbiAgICAgICAgRm9ybUNvbnRyb2xNb2R1bGUsXG4gICAgICAgIEZvcm1zTW9kdWxlLFxuICAgICAgICBBdXRvQ29tcGxldGVEaXJlY3RpdmUsXG4gICAgICAgIEZvcm1NZXNzYWdlTW9kdWxlLFxuICAgICAgICBMaXN0TW9kdWxlLFxuICAgICAgICBDaGVja2JveENvbXBvbmVudCxcbiAgICAgICAgTmdDbGFzcyxcbiAgICAgICAgTGlzdFNlY29uZGFyeURpcmVjdGl2ZSxcbiAgICAgICAgU2VhcmNoSGlnaGxpZ2h0UGlwZSxcbiAgICAgICAgRmRUcmFuc2xhdGVQaXBlLFxuICAgICAgICBDb250ZW50RGVuc2l0eU1vZHVsZVxuICAgIF1cbn0pXG5leHBvcnQgY2xhc3MgTXVsdGlDb21ib2JveENvbXBvbmVudCBleHRlbmRzIEJhc2VNdWx0aUNvbWJvYm94IGltcGxlbWVudHMgT25Jbml0LCBBZnRlclZpZXdJbml0IHtcbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIEBWaWV3Q2hpbGQoJ21vYmlsZUNvbnRyb2xUZW1wbGF0ZScpXG4gICAgbW9iaWxlQ29udHJvbFRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+O1xuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBAVmlld0NoaWxkKCdsaXN0VGVtcGxhdGUnKVxuICAgIGxpc3RUZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PjtcblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgQFZpZXdDaGlsZChUb2tlbml6ZXJDb21wb25lbnQpXG4gICAgX3Rva2VuaXplcjogVG9rZW5pemVyQ29tcG9uZW50O1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIExpc3Qgb2Ygc2VsZWN0ZWQgc3VnZ2VzdGlvbnNcbiAgICAgKi9cbiAgICBfc2VsZWN0ZWRTdWdnZXN0aW9uczogU2VsZWN0YWJsZU9wdGlvbkl0ZW1bXSA9IFtdO1xuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgY2Q6IENoYW5nZURldGVjdG9yUmVmLFxuICAgICAgICByZWFkb25seSBlbGVtZW50UmVmOiBFbGVtZW50UmVmLFxuICAgICAgICBAT3B0aW9uYWwoKSBAU2VsZigpIHJlYWRvbmx5IG5nQ29udHJvbDogTmdDb250cm9sLFxuICAgICAgICBAT3B0aW9uYWwoKSBAU2tpcFNlbGYoKSBjb250cm9sQ29udGFpbmVyOiBDb250cm9sQ29udGFpbmVyLFxuICAgICAgICBAT3B0aW9uYWwoKSBAU2tpcFNlbGYoKSByZWFkb25seSBuZ0Zvcm06IE5nRm9ybSxcbiAgICAgICAgQE9wdGlvbmFsKCkgcmVhZG9ubHkgZGlhbG9nQ29uZmlnOiBEaWFsb2dDb25maWcsXG4gICAgICAgIHJlYWRvbmx5IF9keW5hbWljQ29tcG9uZW50U2VydmljZTogRHluYW1pY0NvbXBvbmVudFNlcnZpY2UsXG4gICAgICAgIEBPcHRpb25hbCgpIEBJbmplY3QoREFUQV9QUk9WSURFUlMpIHByaXZhdGUgX3Byb3ZpZGVyczogTWFwPHN0cmluZywgRGF0YVByb3ZpZGVyPGFueT4+LFxuICAgICAgICByZWFkb25seSBfbXVsdGlDb21ib2JveENvbmZpZzogTXVsdGlDb21ib2JveENvbmZpZyxcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSBfdmlld0NvbnRhaW5lclJlZjogVmlld0NvbnRhaW5lclJlZixcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSBfaW5qZWN0b3I6IEluamVjdG9yLFxuICAgICAgICBAT3B0aW9uYWwoKSBAU2tpcFNlbGYoKSBASG9zdCgpIEBJbmplY3QoRkRfRk9STV9GSUVMRCkgZm9ybUZpZWxkOiBQbGF0Zm9ybUZvcm1GaWVsZCxcbiAgICAgICAgQE9wdGlvbmFsKCkgQFNraXBTZWxmKCkgQEhvc3QoKSBASW5qZWN0KEZEX0ZPUk1fRklFTERfQ09OVFJPTCkgZm9ybUNvbnRyb2w6IFBsYXRmb3JtRm9ybUZpZWxkQ29udHJvbCxcbiAgICAgICAgQEluamVjdChNQVBfTElNSVQpIF9tYXBMaW1pdDogbnVtYmVyLFxuICAgICAgICByZWFkb25seSBjb250ZW50RGVuc2l0eU9ic2VydmVyOiBDb250ZW50RGVuc2l0eU9ic2VydmVyXG4gICAgKSB7XG4gICAgICAgIHN1cGVyKFxuICAgICAgICAgICAgY2QsXG4gICAgICAgICAgICBlbGVtZW50UmVmLFxuICAgICAgICAgICAgbmdDb250cm9sLFxuICAgICAgICAgICAgY29udHJvbENvbnRhaW5lcixcbiAgICAgICAgICAgIG5nRm9ybSxcbiAgICAgICAgICAgIGRpYWxvZ0NvbmZpZyxcbiAgICAgICAgICAgIF9tdWx0aUNvbWJvYm94Q29uZmlnLFxuICAgICAgICAgICAgZm9ybUZpZWxkLFxuICAgICAgICAgICAgZm9ybUNvbnRyb2wsXG4gICAgICAgICAgICBfbWFwTGltaXRcbiAgICAgICAgKTtcblxuICAgICAgICBpZiAoIWRlcHJlY2F0aW9uV2FybmluZ1Nob3duICYmIGlzRGV2TW9kZSgpKSB7XG4gICAgICAgICAgICB3YXJuT25jZShcbiAgICAgICAgICAgICAgICBgW0RFUFJFQ0FUSU9OXSBQbGF0Zm9ybSBNdWx0aSBDb21ib2JveCBjb21wb25lbnQgaXMgZGVwcmVjYXRlZCBzaW5jZSB2MC4zOS4wLiBQbGVhc2UgbWlncmF0ZSB0byBDb3JlJ3MgdmVyc2lvbi5gXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgZGVwcmVjYXRpb25XYXJuaW5nU2hvd24gPSB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICAgICAgc3VwZXIubmdPbkluaXQoKTtcblxuICAgICAgICBjb25zdCBwcm92aWRlcnMgPSB0aGlzLl9wcm92aWRlcnM/LnNpemUgPT09IDAgPyB0aGlzLl9tdWx0aUNvbWJvYm94Q29uZmlnLnByb3ZpZGVycyA6IHRoaXMuX3Byb3ZpZGVycztcbiAgICAgICAgLy8gaWYgd2UgaGF2ZSBib3RoIHByZWZlciBkYXRhU291cmNlXG4gICAgICAgIGlmICghdGhpcy5kYXRhU291cmNlICYmIHRoaXMuZW50aXR5Q2xhc3MgJiYgcHJvdmlkZXJzPy5oYXModGhpcy5lbnRpdHlDbGFzcykpIHtcbiAgICAgICAgICAgIHRoaXMuZGF0YVNvdXJjZSA9IG5ldyBNdWx0aUNvbWJvQm94RGF0YVNvdXJjZShwcm92aWRlcnMuZ2V0KHRoaXMuZW50aXR5Q2xhc3MpISk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICAgICAgc3VwZXIubmdBZnRlclZpZXdJbml0KCk7XG5cbiAgICAgICAgaWYgKHRoaXMubW9iaWxlKSB7XG4gICAgICAgICAgICB0aGlzLl9zZXRVcE1vYmlsZU1vZGUoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX3NldFNlbGVjdGVkU3VnZ2VzdGlvbnMoKTtcblxuICAgICAgICB0aGlzLl90b2tlbml6ZXIuX3Nob3dPdmVyZmxvd1BvcG92ZXIgPSBmYWxzZTtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHRvZ2dsZVNlbGVjdGlvbihpdGVtOiBTZWxlY3RhYmxlT3B0aW9uSXRlbSk6IHZvaWQge1xuICAgICAgICBjb25zdCBpZHggPSB0aGlzLl9nZXRUb2tlbkluZGV4QnlJZGxPclZhbHVlKGl0ZW0pO1xuXG4gICAgICAgIGlmIChpZHggPT09IC0xKSB7XG4gICAgICAgICAgICB0aGlzLl9zZWxlY3RlZFN1Z2dlc3Rpb25zLnB1c2goaXRlbSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl9zZWxlY3RlZFN1Z2dlc3Rpb25zLnNwbGljZShpZHgsIDEpO1xuICAgICAgICB9XG5cbiAgICAgICAgaXRlbS5zZWxlY3RlZCA9ICFpdGVtLnNlbGVjdGVkO1xuXG4gICAgICAgIHRoaXMuX3Byb3BhZ2F0ZUNoYW5nZSgpO1xuXG4gICAgICAgIGlmICghdGhpcy5fc2VsZWN0ZWRTdWdnZXN0aW9ucy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXMuX2ZvY3VzVG9TZWFyY2hGaWVsZCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fY2QuZGV0ZWN0Q2hhbmdlcygpO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgb25PcHRpb25DaGVja2JveENsaWNrZWQoZXZlbnQ6IE1vdXNlRXZlbnQsIGluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIHRoaXMuX29uTGlzdEVsZW1lbnRDbGlja2VkKGV2ZW50LCBpbmRleCk7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBvbkNvbXBsZXRlVGVybShldmVudDogQXV0b0NvbXBsZXRlRXZlbnQpOiB2b2lkIHtcbiAgICAgICAgaWYgKGV2ZW50LmZvcmNlQ2xvc2UpIHtcbiAgICAgICAgICAgIHRoaXMudG9nZ2xlU2VsZWN0aW9uQnlJbnB1dFRleHQoZXZlbnQudGVybSk7XG4gICAgICAgICAgICB0aGlzLmNsb3NlKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHRvZ2dsZVNlbGVjdGlvbkJ5SW5wdXRUZXh0KHRleHQgPSB0aGlzLmlucHV0VGV4dCk6IHZvaWQge1xuICAgICAgICBjb25zdCBpdGVtID0gdGhpcy5fZ2V0U2VsZWN0SXRlbUJ5SW5wdXRWYWx1ZSh0ZXh0KTtcbiAgICAgICAgaWYgKGl0ZW0pIHtcbiAgICAgICAgICAgIHRoaXMudG9nZ2xlU2VsZWN0aW9uKGl0ZW0pO1xuICAgICAgICAgICAgdGhpcy5pbnB1dFRleHQgPSAnJztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBNZXRob2QgdGhhdCBzZWxlY3RzIGFsbCBwb3NzaWJsZSBvcHRpb25zLlxuICAgICAqICpzZWxlY3QqIGF0dHJpYnV0ZSDigJMgaWYgKnRydWUqIHNlbGVjdCBhbGwsIGlmICpmYWxzZSogdW5zZWxlY3QgYWxsXG4gICAgICogKi9cbiAgICBoYW5kbGVTZWxlY3RBbGxJdGVtcyhzZWxlY3Q6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fZmxhdFN1Z2dlc3Rpb25zLmZvckVhY2goKGl0ZW0pID0+IChpdGVtLnNlbGVjdGVkID0gc2VsZWN0KSk7XG4gICAgICAgIHRoaXMuX3NlbGVjdGVkU3VnZ2VzdGlvbnMgPSBzZWxlY3QgPyBbLi4udGhpcy5fZmxhdFN1Z2dlc3Rpb25zXSA6IFtdO1xuICAgICAgICB0aGlzLl9yYW5nZVNlbGVjdG9yLnJlc2V0KCk7XG5cbiAgICAgICAgdGhpcy5fcHJvcGFnYXRlQ2hhbmdlKCk7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBuYXZpZ2F0ZUJ5VG9rZW5zKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgICAgIGlmIChLZXlVdGlsLmlzS2V5Q29kZShldmVudCwgW0RPV05fQVJST1csIFVQX0FSUk9XXSkgJiYgdGhpcy5pc09wZW4pIHtcbiAgICAgICAgICAgIHRoaXMubGlzdENvbXBvbmVudC5pdGVtcz8uZmlyc3QuZm9jdXMoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgcmVtb3ZlVG9rZW4odG9rZW46IFNlbGVjdGFibGVPcHRpb25JdGVtLCBldmVudD86IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICAgICAgaWYgKGV2ZW50KSB7XG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG9wdGlvbkl0ZW0gPSB0aGlzLl9zdWdnZXN0aW9ucy5maW5kKChzKSA9PiBzLnZhbHVlID09PSB0b2tlbi52YWx1ZSk7XG4gICAgICAgIGlmIChvcHRpb25JdGVtKSB7XG4gICAgICAgICAgICB0aGlzLnRvZ2dsZVNlbGVjdGlvbihvcHRpb25JdGVtKTtcbiAgICAgICAgICAgIHRoaXMuX3JhbmdlU2VsZWN0b3IucmVzZXQoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgbW9yZUNsaWNrZWQoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX3N1Z2dlc3Rpb25zID0gdGhpcy5pc0dyb3VwXG4gICAgICAgICAgICA/IHRoaXMuX2NvbnZlcnRPYmplY3RzVG9Hcm91cE9wdGlvbkl0ZW1zKHRoaXMuX3NlbGVjdGVkU3VnZ2VzdGlvbnMubWFwKCh7IHZhbHVlIH0pID0+IHZhbHVlKSlcbiAgICAgICAgICAgIDogdGhpcy5fc3VnZ2VzdGlvbnMuZmlsdGVyKCh2YWx1ZSkgPT5cbiAgICAgICAgICAgICAgICAgIHRoaXMuX3NlbGVjdGVkU3VnZ2VzdGlvbnMuc29tZSgoaXRlbSkgPT4gZXF1YWwoaXRlbS52YWx1ZSwgdmFsdWUudmFsdWUpKVxuICAgICAgICAgICAgICApO1xuXG4gICAgICAgIHRoaXMuc2hvd0xpc3QodHJ1ZSk7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRTaG93biQubmV4dCh0cnVlKTtcbiAgICAgICAgdGhpcy5fY2QubWFya0ZvckNoZWNrKCk7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBvbkJsdXIoZXZlbnQ6IEZvY3VzRXZlbnQpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgdGFyZ2V0ID0gZXZlbnQucmVsYXRlZFRhcmdldCBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgaWYgKHRhcmdldCkge1xuICAgICAgICAgICAgY29uc3QgaXNMaXN0ID0gISF0YXJnZXQuY2xvc2VzdCgnLmZkcC1tdWx0aS1jb21ib2JveF9fbGlzdC1jb250YWluZXInKTtcbiAgICAgICAgICAgIGlmIChpc0xpc3QpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnNob3dMaXN0KGZhbHNlKTtcbiAgICAgICAgICAgIHRoaXMuaW5wdXRUZXh0ID0gJyc7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogTWV0aG9kIHRvIHNldCBpbnB1dCB0ZXh0IGFzIGl0ZW0gbGFiZWwuXG4gICAgICovXG4gICAgc2V0SW5wdXRUZXh0RnJvbU9wdGlvbkl0ZW0oaXRlbTogT3B0aW9uSXRlbSk6IHZvaWQge1xuICAgICAgICB0aGlzLmlucHV0VGV4dCA9IGl0ZW0ubGFiZWw7XG5cbiAgICAgICAgaWYgKHRoaXMubW9iaWxlKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnNob3dMaXN0KGZhbHNlKTtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIG9uSXRlbUtleURvd25IYW5kbGVyKGV2ZW50OiBLZXlib2FyZEV2ZW50LCBpbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIGlmIChLZXlVdGlsLmlzS2V5Q29kZShldmVudCwgRVNDQVBFKSkge1xuICAgICAgICAgICAgdGhpcy5fZm9jdXNUb1NlYXJjaEZpZWxkKCk7XG4gICAgICAgICAgICB0aGlzLmNsb3NlKCk7XG4gICAgICAgIH0gZWxzZSBpZiAoZXZlbnQuc2hpZnRLZXkgJiYgS2V5VXRpbC5pc0tleUNvZGUoZXZlbnQsIFRBQikpIHtcbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICB0aGlzLmxpc3RDb21wb25lbnQ/LnNldEl0ZW1BY3RpdmUoaW5kZXggLSAxKTtcbiAgICAgICAgfSBlbHNlIGlmIChLZXlVdGlsLmlzS2V5Q29kZShldmVudCwgVEFCKSkge1xuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIHRoaXMubGlzdENvbXBvbmVudD8uc2V0SXRlbUFjdGl2ZShpbmRleCArIDEpO1xuICAgICAgICB9IGVsc2UgaWYgKChldmVudC5jdHJsS2V5IHx8IGV2ZW50Lm1ldGFLZXkpICYmIGV2ZW50LnNoaWZ0S2V5ICYmIEtleVV0aWwuaXNLZXlDb2RlKGV2ZW50LCBBKSkge1xuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlU2VsZWN0QWxsSXRlbXMoZmFsc2UpO1xuICAgICAgICB9IGVsc2UgaWYgKChldmVudC5jdHJsS2V5IHx8IGV2ZW50Lm1ldGFLZXkpICYmIEtleVV0aWwuaXNLZXlDb2RlKGV2ZW50LCBBKSkge1xuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlU2VsZWN0QWxsSXRlbXModHJ1ZSk7XG4gICAgICAgIH0gZWxzZSBpZiAoS2V5VXRpbC5pc0tleUNvZGUoZXZlbnQsIEVOVEVSKSkge1xuICAgICAgICAgICAgaWYgKCF0aGlzLm1vYmlsZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuY2xvc2UoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuX3JhbmdlU2VsZWN0b3IucmVzZXQoKTtcbiAgICAgICAgfSBlbHNlIGlmIChLZXlVdGlsLmlzS2V5Q29kZShldmVudCwgU1BBQ0UpKSB7XG4gICAgICAgICAgICB0aGlzLl9yYW5nZVNlbGVjdG9yLnJlc2V0KCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIG9uT3B0aW9uQ2xpY2tlZChldmVudDogTW91c2VFdmVudCwgaW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgICAgICB0aGlzLl9vbkxpc3RFbGVtZW50Q2xpY2tlZChldmVudCwgaW5kZXgpO1xuICAgICAgICB0aGlzLmNsb3NlKCk7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBfYWRkT25DbGlja2VkKGV2ZW50OiBFdmVudCk6IHZvaWQge1xuICAgICAgICB0aGlzLmFkZE9uQnV0dG9uQ2xpY2tlZC5lbWl0KGV2ZW50KTtcbiAgICAgICAgaWYgKCF0aGlzLm1vYmlsZSkge1xuICAgICAgICAgICAgdGhpcy5vblByaW1hcnlCdXR0b25DbGljayh0aGlzLmlzT3Blbik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogYXBwbHlpbmcgcmFuZ2Ugc2VsZWN0aW9uLiBOb3RlLCB0aGF0IHRoaXMgZnVuY3Rpb24gd2lsbCBiZSBpbnZva2VkIGFmdGVyIGNvbWJvYm94IGl0ZW0ncyB2YWx1ZSBoYXMgYmVlbiBjaGFuZ2VkXG4gICAgICovXG4gICAgcHJpdmF0ZSBfb25MaXN0RWxlbWVudENsaWNrZWQoZXZlbnQ6IE1vdXNlRXZlbnQsIGluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgLy8gdmFsdWUgaGFzIGJlZW4gY2hhbmdlZCBhdCB0aGlzIHBvaW50LCBzbyBpdCBjYW4gYmUgc2FmZWx5IHVzZWRcbiAgICAgICAgY29uc3Qgc2VsZWN0aW9uU3RhdGUgPSB0aGlzLl9zdWdnZXN0aW9uc1tpbmRleF0uc2VsZWN0ZWQ7XG4gICAgICAgIHRoaXMuX3JhbmdlU2VsZWN0b3Iub25SYW5nZUVsZW1lbnRUb2dnbGVkKGluZGV4LCBldmVudCk7XG4gICAgICAgIGNvbnN0IHRvUmVtb3ZlU2V0ID0gbmV3IFNldCgpO1xuICAgICAgICB0aGlzLl9yYW5nZVNlbGVjdG9yLmFwcGx5VmFsdWVUb0VhY2hJblJhbmdlKChpZHgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGN1cnJlbnQgPSB0aGlzLl9zdWdnZXN0aW9uc1tpZHhdO1xuICAgICAgICAgICAgaWYgKGN1cnJlbnQuc2VsZWN0ZWQgIT09IHNlbGVjdGlvblN0YXRlKSB7XG4gICAgICAgICAgICAgICAgaWYgKGN1cnJlbnQuc2VsZWN0ZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gcmVtb3ZpbmcgZnJvbSBcIl9zZWxlY3RlZFN1Z2dlc3Rpb25zXCIgbGlzdFxuICAgICAgICAgICAgICAgICAgICB0b1JlbW92ZVNldC5hZGQoY3VycmVudC52YWx1ZSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gYWRkaW5nIGN1cnJlbnQgaXRlbSB0byBcIl9zZWxlY3RlZFN1Z2dlc3Rpb25zXCJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fc2VsZWN0ZWRTdWdnZXN0aW9ucy5wdXNoKGN1cnJlbnQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjdXJyZW50LnNlbGVjdGVkID0gc2VsZWN0aW9uU3RhdGU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLl9zZWxlY3RlZFN1Z2dlc3Rpb25zID0gdGhpcy5fc2VsZWN0ZWRTdWdnZXN0aW9ucy5maWx0ZXIoKHMpID0+ICF0b1JlbW92ZVNldC5oYXMocy52YWx1ZSkpO1xuICAgICAgICAvLyBzZWxlY3RlZCBpdGVtcyBzaG91bGQgYmUgZGlzcGxheWVkIGluIHRoZSBzYW1lIG9yZGVyIGFzIG9wdGlvbnNcbiAgICAgICAgY29uc3QgdmFsdWVJbmRleGVzID0gbmV3IE1hcDxhbnksIG51bWJlcj4odGhpcy5fc3VnZ2VzdGlvbnMubWFwKChzLCBpKSA9PiBbcy52YWx1ZSwgaV0pKTtcbiAgICAgICAgdGhpcy5fc2VsZWN0ZWRTdWdnZXN0aW9ucy5zb3J0KChhLCBiKSA9PiB2YWx1ZUluZGV4ZXMuZ2V0KGEudmFsdWUpISAtIHZhbHVlSW5kZXhlcy5nZXQoYi52YWx1ZSkhKTtcbiAgICAgICAgdGhpcy5fcHJvcGFnYXRlQ2hhbmdlKCk7XG5cbiAgICAgICAgdGhpcy5fdG9rZW5pemVyLm9uUmVzaXplKCk7XG5cbiAgICAgICAgdGhpcy5fdG9rZW5pemVyLnRva2VuaXplcklubmVyRWwubmF0aXZlRWxlbWVudC5zY3JvbGxMZWZ0ID1cbiAgICAgICAgICAgIHRoaXMuX3Rva2VuaXplci50b2tlbml6ZXJJbm5lckVsLm5hdGl2ZUVsZW1lbnQuc2Nyb2xsV2lkdGg7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gSGFuZGxlIGRpYWxvZyBkaXNtaXNzaW5nLCBjbG9zZXMgcG9wb3ZlciBhbmQgc2V0cyBiYWNrdXAgZGF0YS4gKi9cbiAgICBkaWFsb2dEaXNtaXNzKGJhY2t1cDogU2VsZWN0YWJsZU9wdGlvbkl0ZW1bXSk6IHZvaWQge1xuICAgICAgICB0aGlzLl9zZWxlY3RlZFN1Z2dlc3Rpb25zID0gWy4uLmJhY2t1cF07XG4gICAgICAgIHRoaXMuaW5wdXRUZXh0ID0gJyc7XG4gICAgICAgIHRoaXMuc2hvd0xpc3QoZmFsc2UpO1xuICAgICAgICB0aGlzLnNlbGVjdGVkU2hvd24kLm5leHQoZmFsc2UpO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuIEhhbmRsZSBkaWFsb2cgYXBwcm92YWwsIGNsb3NlcyBwb3BvdmVyIGFuZCBwcm9wYWdhdGVzIGRhdGEgY2hhbmdlcy4gKi9cbiAgICBkaWFsb2dBcHByb3ZlKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmlucHV0VGV4dCA9ICcnO1xuICAgICAgICB0aGlzLnNob3dMaXN0KGZhbHNlKTtcbiAgICAgICAgdGhpcy5fcHJvcGFnYXRlQ2hhbmdlKHRydWUpO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgcHJpdmF0ZSBfZ2V0VG9rZW5JbmRleEJ5SWRsT3JWYWx1ZShpdGVtOiBTZWxlY3RhYmxlT3B0aW9uSXRlbSk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zZWxlY3RlZFN1Z2dlc3Rpb25zLmZpbmRJbmRleCgodG9rZW4pID0+IHRva2VuLmlkID09PSBpdGVtLmlkIHx8IGVxdWFsKHRva2VuLnZhbHVlLCBpdGVtLnZhbHVlKSk7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBwcml2YXRlIF9tYXBBbmRVcGRhdGVNb2RlbCgpOiB2b2lkIHtcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWRJdGVtcyA9IHRoaXMuX3NlbGVjdGVkU3VnZ2VzdGlvbnMubWFwKCh7IHZhbHVlIH0pID0+IHZhbHVlKTtcblxuICAgICAgICAvLyBzZXR0aW5nIHZhbHVlLCBpdCB3aWxsIGNhbGwgc2V0VmFsdWUoKVxuICAgICAgICB0aGlzLnZhbHVlID0gc2VsZWN0ZWRJdGVtcztcblxuICAgICAgICB0aGlzLl9lbWl0Q2hhbmdlRXZlbnQoKTtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHByaXZhdGUgX3Byb3BhZ2F0ZUNoYW5nZShlbWl0SW5Nb2JpbGU/OiBib29sZWFuKTogdm9pZCB7XG4gICAgICAgIGlmICghdGhpcy5tb2JpbGUgfHwgZW1pdEluTW9iaWxlKSB7XG4gICAgICAgICAgICB0aGlzLm9uQ2hhbmdlKHRoaXMuX3NlbGVjdGVkU3VnZ2VzdGlvbnMpO1xuICAgICAgICAgICAgdGhpcy5fbWFwQW5kVXBkYXRlTW9kZWwoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgcHJpdmF0ZSBhc3luYyBfc2V0VXBNb2JpbGVNb2RlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBjb25zdCBpbmplY3RvciA9IEluamVjdG9yLmNyZWF0ZSh7XG4gICAgICAgICAgICBwcm92aWRlcnM6IFt7IHByb3ZpZGU6IE1VTFRJQ09NQk9CT1hfQ09NUE9ORU5ULCB1c2VWYWx1ZTogdGhpcyB9XSxcbiAgICAgICAgICAgIHBhcmVudDogdGhpcy5faW5qZWN0b3JcbiAgICAgICAgfSk7XG5cbiAgICAgICAgYXdhaXQgdGhpcy5fZHluYW1pY0NvbXBvbmVudFNlcnZpY2UuY3JlYXRlRHluYW1pY01vZHVsZShcbiAgICAgICAgICAgIHsgbGlzdFRlbXBsYXRlOiB0aGlzLmxpc3RUZW1wbGF0ZSwgY29udHJvbFRlbXBsYXRlOiB0aGlzLm1vYmlsZUNvbnRyb2xUZW1wbGF0ZSB9LFxuICAgICAgICAgICAgUGxhdGZvcm1NdWx0aUNvbWJvYm94TW9iaWxlTW9kdWxlLFxuICAgICAgICAgICAgTXVsdGlDb21ib2JveE1vYmlsZUNvbXBvbmVudCxcbiAgICAgICAgICAgIHRoaXMuX3ZpZXdDb250YWluZXJSZWYsXG4gICAgICAgICAgICBpbmplY3RvclxuICAgICAgICApO1xuICAgIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJmZHAtbXVsdGktY29tYm9ib3hcIj5cbiAgICA8bmctY29udGFpbmVyIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImNvbnRyb2xUZW1wbGF0ZVwiICpuZ0lmPVwibW9iaWxlXCI+PC9uZy1jb250YWluZXI+XG5cbiAgICA8ZmQtcG9wb3ZlclxuICAgICAgICAqbmdJZj1cIiFtb2JpbGVcIlxuICAgICAgICBhZGRpdGlvbmFsQm9keUNsYXNzPVwiZmQtcG9wb3Zlci1jdXN0b20tbGlzdCBmZHAtbXVsdGktY29tYm9ib3hfX2xpc3QtY29udGFpbmVyXCJcbiAgICAgICAgKGlzT3BlbkNoYW5nZSk9XCJwb3BvdmVyT3BlbkNoYW5nZUhhbmRsZSgkZXZlbnQpXCJcbiAgICAgICAgW2lzT3Blbl09XCJpc09wZW5cIlxuICAgICAgICBbdHJpZ2dlcnNdPVwiW11cIlxuICAgICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxuICAgICAgICBbZmlsbENvbnRyb2xNb2RlXT1cImZpbGxDb250cm9sTW9kZVwiXG4gICAgPlxuICAgICAgICA8ZmQtcG9wb3Zlci1jb250cm9sPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiY29udHJvbFRlbXBsYXRlXCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9mZC1wb3BvdmVyLWNvbnRyb2w+XG4gICAgICAgIDxmZC1wb3BvdmVyLWJvZHkgW3N0eWxlLndpZHRoLiVdPVwiIWF1dG9SZXNpemUgJiYgMTAwXCI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwibGlzdFRlbXBsYXRlXCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8bmctY29udGVudD48L25nLWNvbnRlbnQ+XG4gICAgICAgIDwvZmQtcG9wb3Zlci1ib2R5PlxuICAgIDwvZmQtcG9wb3Zlcj5cbjwvZGl2PlxuXG48bmctdGVtcGxhdGUgI2NvbnRyb2xUZW1wbGF0ZT5cbiAgICA8ZmQtZm9ybS1pbnB1dC1tZXNzYWdlLWdyb3VwPlxuICAgICAgICA8ZmQtaW5wdXQtZ3JvdXBcbiAgICAgICAgICAgIFtpZF09XCJpZCArICctaW5wdXQtZ3JvdXAtY29udGFpbmVyJ1wiXG4gICAgICAgICAgICBjbGFzcz1cImZkcC1tdWx0aS1jb21ib2JveC1pbnB1dC1ncm91cC1jdXN0b21cIlxuICAgICAgICAgICAgW3N0YXRlXT1cInN0YXRlXCJcbiAgICAgICAgICAgIFtidXR0b25Gb2N1c2FibGVdPVwiYnV0dG9uRm9jdXNhYmxlXCJcbiAgICAgICAgICAgIFtidXR0b25dPVwiIXJlYWRvbmx5XCJcbiAgICAgICAgICAgIFtnbHlwaF09XCIhcmVhZG9ubHkgPyAnbmF2aWdhdGlvbi1kb3duLWFycm93JyA6ICcgJ1wiXG4gICAgICAgICAgICBbaXNDb250cm9sXT1cInRydWVcIlxuICAgICAgICAgICAgW2Rpc2FibGVkXT1cImRpc2FibGVkIHx8IHJlYWRvbmx5XCJcbiAgICAgICAgICAgIFtpc0V4cGFuZGVkXT1cIiFtb2JpbGUgJiYgaXNPcGVuICYmIF9zdWdnZXN0aW9ucy5sZW5ndGggPiAwXCJcbiAgICAgICAgICAgIFthdHRyLmFyaWEtZGlzYWJsZWRdPVwiZGlzYWJsZWQgfHwgcmVhZG9ubHlcIlxuICAgICAgICAgICAgW2F0dHIuYXJpYS1yZWFkb25seV09XCJyZWFkb25seVwiXG4gICAgICAgICAgICBbZ2x5cGhBcmlhTGFiZWxdPVwiYXJpYUxhYmVsIHx8ICgncGxhdGZvcm1NdWx0aUNvbWJvYm94LmlucHV0R2x5cGhBcmlhTGFiZWwnIHwgZmRUcmFuc2xhdGUpXCJcbiAgICAgICAgICAgIFtpY29uVGl0bGVdPVwiYWRkb25JY29uVGl0bGUgfHwgKCdwbGF0Zm9ybU11bHRpQ29tYm9ib3guaW5wdXRHbHlwaEFyaWFMYWJlbCcgfCBmZFRyYW5zbGF0ZSlcIlxuICAgICAgICAgICAgKGFkZE9uQnV0dG9uQ2xpY2tlZCk9XCJfYWRkT25DbGlja2VkKCRldmVudClcIlxuICAgICAgICAgICAgKGNsaWNrKT1cIm1vYmlsZSAmJiAhaXNPcGVuICYmIG9uUHJpbWFyeUJ1dHRvbkNsaWNrKGZhbHNlKVwiXG4gICAgICAgICAgICAoa2V5ZG93bik9XCJuYXZpZ2F0ZUJ5VG9rZW5zKCRldmVudClcIlxuICAgICAgICA+XG4gICAgICAgICAgICA8ZmQtdG9rZW5pemVyXG4gICAgICAgICAgICAgICAgI3Rva2VuaXplclxuICAgICAgICAgICAgICAgIFtjb21wYWN0Q29sbGFwc2VdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgKm5nSWY9XCJfc2VsZWN0ZWRTdWdnZXN0aW9uc1wiXG4gICAgICAgICAgICAgICAgW3Rva2VuaXplckZvY3VzYWJsZV09XCJmYWxzZVwiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJmZHAtbXVsdGktY29tYm9ib3gtdG9rZW5pemVyLWN1c3RvbVwiXG4gICAgICAgICAgICAgICAgKG1vcmVDbGlja2VkRXZlbnQpPVwibW9yZUNsaWNrZWQoKVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPGZkLXRva2VuXG4gICAgICAgICAgICAgICAgICAgIFtyZWFkT25seV09XCJkaXNhYmxlZFwiXG4gICAgICAgICAgICAgICAgICAgIChvbkNsb3NlQ2xpY2spPVwicmVtb3ZlVG9rZW4odG9rZW4sICRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgdG9rZW4gb2YgX3NlbGVjdGVkU3VnZ2VzdGlvbnNcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAge3sgdG9rZW4ubGFiZWwgfX1cbiAgICAgICAgICAgICAgICA8L2ZkLXRva2VuPlxuXG4gICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICAgICNzZWFyY2hJbnB1dEVsZW1lbnRcbiAgICAgICAgICAgICAgICAgICAgZmRwLWF1dG8tY29tcGxldGVcbiAgICAgICAgICAgICAgICAgICAgKG9uQ29tcGxldGUpPVwib25Db21wbGV0ZVRlcm0oJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgIFtvcHRpb25zXT1cIl9zdWdnZXN0aW9uc1wiXG4gICAgICAgICAgICAgICAgICAgIFtpbnB1dFRleHRdPVwiaW5wdXRUZXh0XCJcbiAgICAgICAgICAgICAgICAgICAgW21vYmlsZV09XCJtb2JpbGVcIlxuICAgICAgICAgICAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICAgICAgICAgIHJvbGU9XCJjb21ib2JveFwiXG4gICAgICAgICAgICAgICAgICAgIGF1dG9jb21wbGV0ZT1cIm9mZlwiXG4gICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiYXJpYUxhYmVsXCJcbiAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbGxlZGJ5XT1cImFyaWFMYWJlbGxlZEJ5XCJcbiAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1hdXRvY29tcGxldGVdPVwiYXV0b0NvbXBsZXRlICYmICFtb2JpbGUgPyAnbGlzdCcgOiBudWxsXCJcbiAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1vd25zXT1cImF1dG9Db21wbGV0ZSAmJiAhbW9iaWxlID8gaWQgKyAnLXJlc3VsdCcgOiBudWxsXCJcbiAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1oYXNwb3B1cF09XCJhdXRvQ29tcGxldGUgJiYgIW1vYmlsZVwiXG4gICAgICAgICAgICAgICAgICAgIGZkLWZvcm0tY29udHJvbFxuICAgICAgICAgICAgICAgICAgICBmZC1pbnB1dC1ncm91cC1pbnB1dFxuICAgICAgICAgICAgICAgICAgICB0YWJpbmRleD1cIjBcIlxuICAgICAgICAgICAgICAgICAgICBbaWRdPVwiaWRcIlxuICAgICAgICAgICAgICAgICAgICBbbmFtZV09XCJuYW1lXCJcbiAgICAgICAgICAgICAgICAgICAgKGtleWRvd24pPVwib25JbnB1dEtleWRvd25IYW5kbGVyKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxuICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cImlucHV0VGV4dFwiXG4gICAgICAgICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cInNlYXJjaFRlcm1DaGFuZ2VkKClcIlxuICAgICAgICAgICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwicGxhY2Vob2xkZXJcIlxuICAgICAgICAgICAgICAgICAgICAoZm9jdXMpPVwib25Ub3VjaGVkKCk7IHRva2VuaXplci5fc2hvd0FsbFRva2VucygpXCJcbiAgICAgICAgICAgICAgICAgICAgKGJsdXIpPVwiIW1vYmlsZSAmJiBvbkJsdXIoJGV2ZW50KTsgdG9rZW5pemVyLl9oaWRlVG9rZW5zKClcIlxuICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWV4cGFuZGVkXT1cImlzT3BlblwiXG4gICAgICAgICAgICAgICAgICAgIFtyZWFkb25seV09XCJyZWFkb25seVwiXG4gICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtcmVhZG9ubHldPVwicmVhZG9ubHlcIlxuICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLXJlcXVpcmVkXT1cInJlcXVpcmVkXCJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmZC10b2tlbml6ZXJfX2lucHV0XCJcbiAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgPC9mZC10b2tlbml6ZXI+XG4gICAgICAgIDwvZmQtaW5wdXQtZ3JvdXA+XG5cbiAgICAgICAgPGZkLWZvcm0tbWVzc2FnZVxuICAgICAgICAgICAgKm5nSWY9XCJtb2JpbGUgJiYgaXNPcGVuID8gZmFsc2UgOiAhIXN0YXRlTWVzc2FnZVwiXG4gICAgICAgICAgICBbdHlwZV09XCJzdGF0ZVwiXG4gICAgICAgICAgICBbaW5uZXJIdG1sXT1cInN0YXRlTWVzc2FnZVwiXG4gICAgICAgID48L2ZkLWZvcm0tbWVzc2FnZT5cbiAgICA8L2ZkLWZvcm0taW5wdXQtbWVzc2FnZS1ncm91cD5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjbW9iaWxlQ29udHJvbFRlbXBsYXRlPlxuICAgIDxmZC1pbnB1dC1ncm91cFxuICAgICAgICBbaWRdPVwiaWQgKyAnLWlucHV0LWdyb3VwLWNvbnRhaW5lcidcIlxuICAgICAgICBjbGFzcz1cImZkcC1tdWx0aS1jb21ib2JveC1pbnB1dC1ncm91cC1jdXN0b21cIlxuICAgICAgICBbc3RhdGVdPVwic3RhdGVcIlxuICAgICAgICBbYnV0dG9uRm9jdXNhYmxlXT1cImZhbHNlXCJcbiAgICAgICAgW2lzQ29udHJvbF09XCJ0cnVlXCJcbiAgICAgICAgW2Rpc2FibGVkXT1cImRpc2FibGVkIHx8IHJlYWRvbmx5XCJcbiAgICAgICAgW2lzRXhwYW5kZWRdPVwiIW1vYmlsZSAmJiBpc09wZW4gJiYgX3N1Z2dlc3Rpb25zLmxlbmd0aCA+IDBcIlxuICAgICAgICBbYXR0ci5hcmlhLWRpc2FibGVkXT1cImRpc2FibGVkIHx8IHJlYWRvbmx5XCJcbiAgICAgICAgW2F0dHIuYXJpYS1yZWFkb25seV09XCJyZWFkb25seVwiXG4gICAgICAgIFtnbHlwaEFyaWFMYWJlbF09XCJhcmlhTGFiZWxcIlxuICAgID5cbiAgICAgICAgPGlucHV0XG4gICAgICAgICAgICBmZHAtYXV0by1jb21wbGV0ZVxuICAgICAgICAgICAgKG9uQ29tcGxldGUpPVwib25Db21wbGV0ZVRlcm0oJGV2ZW50KVwiXG4gICAgICAgICAgICBbb3B0aW9uc109XCJfc3VnZ2VzdGlvbnNcIlxuICAgICAgICAgICAgW2lucHV0VGV4dF09XCJpbnB1dFRleHRcIlxuICAgICAgICAgICAgW21vYmlsZV09XCJtb2JpbGVcIlxuICAgICAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAgcm9sZT1cImNvbWJvYm94XCJcbiAgICAgICAgICAgIGF1dG9jb21wbGV0ZT1cIm9mZlwiXG4gICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cImFyaWFMYWJlbFwiXG4gICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsbGVkYnldPVwiYXJpYUxhYmVsbGVkQnlcIlxuICAgICAgICAgICAgW2F0dHIuYXJpYS1hdXRvY29tcGxldGVdPVwiYXV0b0NvbXBsZXRlICYmICFtb2JpbGUgPyAnbGlzdCcgOiBudWxsXCJcbiAgICAgICAgICAgIFthdHRyLmFyaWEtb3duc109XCJhdXRvQ29tcGxldGUgJiYgIW1vYmlsZSA/IGlkICsgJy1yZXN1bHQnIDogbnVsbFwiXG4gICAgICAgICAgICBbYXR0ci5hcmlhLWhhc3BvcHVwXT1cImF1dG9Db21wbGV0ZSAmJiAhbW9iaWxlXCJcbiAgICAgICAgICAgIGZkLWZvcm0tY29udHJvbFxuICAgICAgICAgICAgZmQtaW5wdXQtZ3JvdXAtaW5wdXRcbiAgICAgICAgICAgIHRhYmluZGV4PVwiMFwiXG4gICAgICAgICAgICBbaWRdPVwiaWRcIlxuICAgICAgICAgICAgW25hbWVdPVwibmFtZVwiXG4gICAgICAgICAgICAoa2V5ZG93bik9XCJvbklucHV0S2V5ZG93bkhhbmRsZXIoJGV2ZW50KVwiXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxuICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJpbnB1dFRleHRcIlxuICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwic2VhcmNoVGVybUNoYW5nZWQoKVwiXG4gICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwicGxhY2Vob2xkZXJcIlxuICAgICAgICAgICAgKGZvY3VzKT1cIm9uVG91Y2hlZCgpXCJcbiAgICAgICAgICAgIChibHVyKT1cIiFtb2JpbGUgJiYgb25CbHVyKCRldmVudClcIlxuICAgICAgICAgICAgW2F0dHIuYXJpYS1leHBhbmRlZF09XCJpc09wZW5cIlxuICAgICAgICAgICAgW3JlYWRvbmx5XT1cInJlYWRvbmx5XCJcbiAgICAgICAgICAgIFthdHRyLmFyaWEtcmVhZG9ubHldPVwicmVhZG9ubHlcIlxuICAgICAgICAvPlxuICAgIDwvZmQtaW5wdXQtZ3JvdXA+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI2xpc3RUZW1wbGF0ZT5cbiAgICA8dWxcbiAgICAgICAgZmQtbGlzdFxuICAgICAgICBbaGFzTWVzc2FnZV09XCIhIXN0YXRlTWVzc2FnZVwiXG4gICAgICAgIChmb2N1c0VzY2FwZUxpc3QpPVwiaGFuZGxlTGlzdEZvY3VzRXNjYXBlKCRldmVudClcIlxuICAgICAgICBbZHJvcGRvd25Nb2RlXT1cInRydWVcIlxuICAgICAgICBjbGFzcz1cImZkcC1tdWx0aS1jb21ib2JveF9fbGlzdCBmZC1saXN0LS1tdWx0aS1pbnB1dFwiXG4gICAgICAgIFtoYXNNZXNzYWdlXT1cIiEhc3RhdGVNZXNzYWdlIHx8ICghIWFkdmFuY2VkU3RhdGVNZXNzYWdlPy5oYXNFcnJvcnMgJiYgISFhZHZhbmNlZFN0YXRlTWVzc2FnZT8udGVtcGxhdGUpXCJcbiAgICAgICAgW2lkXT1cImlkICsgJy1yZXN1bHQnXCJcbiAgICAgICAgcm9sZT1cImxpc3Rib3hcIlxuICAgICAgICBbc3R5bGUubWF4SGVpZ2h0XT1cIiFtb2JpbGUgJiYgbWF4SGVpZ2h0XCJcbiAgICAgICAgW3N0eWxlLm1pbldpZHRoXT1cIiFtb2JpbGUgJiYgbWluV2lkdGggKyAncHgnXCJcbiAgICAgICAgW3N0eWxlLm1heFdpZHRoXT1cImF1dG9SZXNpemUgJiYgbWF4V2lkdGggKyAncHgnXCJcbiAgICAgICAgW2F0dHIuYXJpYS1sYWJlbGxlZGJ5XT1cImlkICsgJy1zZWFyY2gnXCJcbiAgICAgICAgYXJpYS1tdWx0aXNlbGVjdGFibGU9XCJ0cnVlXCJcbiAgICA+XG4gICAgICAgIDxsaVxuICAgICAgICAgICAgKm5nSWY9XCJzdGF0ZU1lc3NhZ2VcIlxuICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJzdGF0ZU1lc3NhZ2VcIlxuICAgICAgICAgICAgZmQtbGlzdC1tZXNzYWdlXG4gICAgICAgICAgICB0YWJpbmRleD1cIi0xXCJcbiAgICAgICAgICAgIHJvbGU9XCJwcmVzZW50YXRpb25cIlxuICAgICAgICAgICAgW3R5cGVdPVwic3RhdGUgfHwgJ2RlZmF1bHQnXCJcbiAgICAgICAgICAgIFtpbm5lckh0bWxdPVwic3RhdGVNZXNzYWdlXCJcbiAgICAgICAgPjwvbGk+XG5cbiAgICAgICAgPGxpXG4gICAgICAgICAgICAqbmdJZj1cImFkdmFuY2VkU3RhdGVNZXNzYWdlPy5oYXNFcnJvcnMgJiYgYWR2YW5jZWRTdGF0ZU1lc3NhZ2U/LnRlbXBsYXRlXCJcbiAgICAgICAgICAgIGZkLWxpc3QtbWVzc2FnZVxuICAgICAgICAgICAgdGFiaW5kZXg9XCItMVwiXG4gICAgICAgICAgICByb2xlPVwicHJlc2VudGF0aW9uXCJcbiAgICAgICAgICAgIFt0eXBlXT1cInN0YXRlIHx8ICdkZWZhdWx0J1wiXG4gICAgICAgID5cbiAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBbbmdUZW1wbGF0ZU91dGxldF09XCJhZHZhbmNlZFN0YXRlTWVzc2FnZSEudGVtcGxhdGUhXCI+PC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgPC9saT5cblxuICAgICAgICA8bmctY29udGVudD48L25nLWNvbnRlbnQ+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJpc0dyb3VwXCI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBncm91cCBvZiBfc3VnZ2VzdGlvbnNcIj5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWdyb3VwSXRlbVRlbXBsYXRlXCI+XG4gICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmZC1saXN0LWl0ZW0gZmQtbGlzdC1ncm91cC1oZWFkZXIgcm9sZT1cImdyb3VwXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBmZC1saXN0LXRpdGxlPnt7IGdyb3VwLmxhYmVsIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImdyb3VwSXRlbVRlbXBsYXRlXCI+XG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImdyb3VwSXRlbVRlbXBsYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7ICRpbXBsaWNpdDogeyBsYWJlbDogZ3JvdXAubGFiZWwgfSB9XCJcbiAgICAgICAgICAgICAgICAgICAgPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICAgICAgPGxpXG4gICAgICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBvcHRpb25JdGVtIG9mIGdyb3VwLmNoaWxkcmVuOyBsZXQgaSA9IGluZGV4XCJcbiAgICAgICAgICAgICAgICAgICAgZmQtbGlzdC1pdGVtXG4gICAgICAgICAgICAgICAgICAgIHJvbGU9XCJvcHRpb25cIlxuICAgICAgICAgICAgICAgICAgICBbdGFiaW5kZXhdPVwiMFwiXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCIhbW9iaWxlICYmIGNsb3NlKClcIlxuICAgICAgICAgICAgICAgICAgICAoa2V5RG93bik9XCJvbkl0ZW1LZXlEb3duSGFuZGxlcigkZXZlbnQsIGkpXCJcbiAgICAgICAgICAgICAgICAgICAgW3NlbGVjdGVkXT1cIiEhb3B0aW9uSXRlbS5zZWxlY3RlZFwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8ZmQtY2hlY2tib3hcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJvbk9wdGlvbkNoZWNrYm94Q2xpY2tlZCgkZXZlbnQsIGkpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cInRvZ2dsZVNlbGVjdGlvbihvcHRpb25JdGVtKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbbmdNb2RlbF09XCJvcHRpb25JdGVtLnNlbGVjdGVkXCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8L2ZkLWNoZWNrYm94PlxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldF09XCJsaXN0SXRlbVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyBvcHRpb25JdGVtOiBvcHRpb25JdGVtLCBpbmRleDogaSB9XCJcbiAgICAgICAgICAgICAgICAgICAgPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIDwvbGk+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFpc0dyb3VwXCI+XG4gICAgICAgICAgICA8bGlcbiAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgb3B0aW9uSXRlbSBvZiBfc3VnZ2VzdGlvbnM7IGxldCBpID0gaW5kZXhcIlxuICAgICAgICAgICAgICAgIGZkLWxpc3QtaXRlbVxuICAgICAgICAgICAgICAgIHJvbGU9XCJvcHRpb25cIlxuICAgICAgICAgICAgICAgIFt0YWJpbmRleF09XCIwXCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwiIW1vYmlsZSAmJiBvbk9wdGlvbkNsaWNrZWQoJGV2ZW50LCBpKVwiXG4gICAgICAgICAgICAgICAgKGtleURvd24pPVwib25JdGVtS2V5RG93bkhhbmRsZXIoJGV2ZW50LCBpKVwiXG4gICAgICAgICAgICAgICAgW3NlbGVjdGVkXT1cIiEhb3B0aW9uSXRlbS5zZWxlY3RlZFwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPGZkLWNoZWNrYm94XG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJvbk9wdGlvbkNoZWNrYm94Q2xpY2tlZCgkZXZlbnQsIGkpXCJcbiAgICAgICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwidG9nZ2xlU2VsZWN0aW9uKG9wdGlvbkl0ZW0pXCJcbiAgICAgICAgICAgICAgICAgICAgW25nTW9kZWxdPVwib3B0aW9uSXRlbS5zZWxlY3RlZFwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDwvZmQtY2hlY2tib3g+XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldF09XCJsaXN0SXRlbVwiXG4gICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7IG9wdGlvbkl0ZW06IG9wdGlvbkl0ZW0sIGluZGV4OiBpIH1cIlxuICAgICAgICAgICAgICAgID48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDwvbGk+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgIDwvdWw+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgbGV0LW9wdGlvbkl0ZW09XCJvcHRpb25JdGVtXCIgbGV0LWluZGV4PVwiaW5kZXhcIiAjbGlzdEl0ZW0+XG4gICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAqbmdJZj1cIm9wdGlvbkl0ZW0uc2VsZWN0ZWQgJiYgISFzZWxlY3RlZEl0ZW1UZW1wbGF0ZVwiXG4gICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0XT1cInNlbGVjdGVkSXRlbVRlbXBsYXRlXCJcbiAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInsgJGltcGxpY2l0OiBvcHRpb25JdGVtLnZhbHVlLCBpbmRleDogaW5kZXggfVwiXG4gICAgPjwvbmctY29udGFpbmVyPlxuXG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiEob3B0aW9uSXRlbS5zZWxlY3RlZCAmJiBzZWxlY3RlZEl0ZW1UZW1wbGF0ZSlcIj5cbiAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRdPVwib3B0aW9uSXRlbVNvdXJjZVwiXG4gICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyBvcHRpb25JdGVtOiBvcHRpb25JdGVtLCBpbmRleDogaW5kZXggfVwiXG4gICAgICAgID48L25nLWNvbnRhaW5lcj5cblxuICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldF09XCJzZWNvbmRhcnlUZXh0U291cmNlXCJcbiAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7IG9wdGlvbkl0ZW06IG9wdGlvbkl0ZW0gfVwiXG4gICAgICAgID48L25nLWNvbnRhaW5lcj5cbiAgICA8L25nLWNvbnRhaW5lcj5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSBsZXQtb3B0aW9uSXRlbT1cIm9wdGlvbkl0ZW1cIiBsZXQtaW5kZXg9XCJpbmRleFwiICNvcHRpb25JdGVtU291cmNlPlxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhb3B0aW9uSXRlbVRlbXBsYXRlXCI+XG4gICAgICAgIDxzcGFuXG4gICAgICAgICAgICBmZC1saXN0LXRpdGxlXG4gICAgICAgICAgICBbYXR0ci50aXRsZV09XCJvcHRpb25JdGVtLmxhYmVsXCJcbiAgICAgICAgICAgIFtpbm5lckhUTUxdPVwib3B0aW9uSXRlbS5sYWJlbCB8IGhpZ2hsaWdodCA6IGlucHV0VGV4dFwiXG4gICAgICAgID48L3NwYW4+XG4gICAgPC9uZy1jb250YWluZXI+XG5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwib3B0aW9uSXRlbVRlbXBsYXRlXCI+XG4gICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0XT1cIm9wdGlvbkl0ZW1UZW1wbGF0ZVwiXG4gICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyAkaW1wbGljaXQ6IG9wdGlvbkl0ZW0udmFsdWUsIGluZGV4OiBpbmRleCB9XCJcbiAgICAgICAgPjwvbmctY29udGFpbmVyPlxuICAgIDwvbmctY29udGFpbmVyPlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlIGxldC1vcHRpb25JdGVtPVwib3B0aW9uSXRlbVwiICNzZWNvbmRhcnlUZXh0U291cmNlPlxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJzaG93U2Vjb25kYXJ5VGV4dFwiPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIXNlY29uZGFyeUl0ZW1UZW1wbGF0ZVwiPlxuICAgICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICAgICBbc3R5bGUudGV4dC1hbGlnbl09XCJzZWNvbmRhcnlUZXh0QWxpZ25tZW50XCJcbiAgICAgICAgICAgICAgICBmZC1saXN0LXNlY29uZGFyeVxuICAgICAgICAgICAgICAgIFthdHRyLnRpdGxlXT1cIm9wdGlvbkl0ZW0uc2Vjb25kYXJ5VGV4dFwiXG4gICAgICAgICAgICAgICAgW2lubmVySFRNTF09XCJvcHRpb25JdGVtLnNlY29uZGFyeVRleHQgfCBoaWdobGlnaHQgOiBpbnB1dFRleHRcIlxuICAgICAgICAgICAgPjwvc3Bhbj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInNlY29uZGFyeUl0ZW1UZW1wbGF0ZVwiPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0XT1cInNlY29uZGFyeUl0ZW1UZW1wbGF0ZVwiXG4gICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInsgJGltcGxpY2l0OiBvcHRpb25JdGVtLnZhbHVlIH1cIlxuICAgICAgICAgICAgPjwvbmctY29udGFpbmVyPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8L25nLWNvbnRhaW5lcj5cbjwvbmctdGVtcGxhdGU+XG4iXX0=