@entake/particle 17.0.0

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 (208) hide show
  1. package/LICENSE +7 -0
  2. package/README.md +396 -0
  3. package/app/modules/accordion/accordion.component.d.ts +26 -0
  4. package/app/modules/accordion/accordion.module.d.ts +11 -0
  5. package/app/modules/accordion/directives/accordion-content.directive.d.ts +8 -0
  6. package/app/modules/accordion/directives/accordion-header.directive.d.ts +8 -0
  7. package/app/modules/accordion/directives/accordion-item.directive.d.ts +13 -0
  8. package/app/modules/background-carousel/background-carousel.directive.d.ts +42 -0
  9. package/app/modules/background-carousel/carousel-options.model.d.ts +30 -0
  10. package/app/modules/background-carousel/particle-background-carousel.module.d.ts +8 -0
  11. package/app/modules/checkbox/checkbox.component.d.ts +43 -0
  12. package/app/modules/checkbox/checkbox.module.d.ts +9 -0
  13. package/app/modules/color-picker/color-picker.component.d.ts +149 -0
  14. package/app/modules/color-picker/color-picker.module.d.ts +9 -0
  15. package/app/modules/date-picker/components/calendar/calendar.component.d.ts +211 -0
  16. package/app/modules/date-picker/components/date-range-picker/date-range-picker.component.d.ts +95 -0
  17. package/app/modules/date-picker/date-picker.component.d.ts +259 -0
  18. package/app/modules/date-picker/date-picker.module.d.ts +15 -0
  19. package/app/modules/dialog/dialog.component.d.ts +87 -0
  20. package/app/modules/dialog/dialog.module.d.ts +9 -0
  21. package/app/modules/dropdown/dropdown.component.d.ts +288 -0
  22. package/app/modules/dropdown/dropdown.module.d.ts +9 -0
  23. package/app/modules/dropdown/models/dropdown-option-group.model.d.ts +16 -0
  24. package/app/modules/dropdown/models/dropdown-option.model.d.ts +25 -0
  25. package/app/modules/endpoint-state/components/endpoint-state.component.d.ts +46 -0
  26. package/app/modules/endpoint-state/endpoint-state.module.d.ts +8 -0
  27. package/app/modules/icons/components/icon-select.component.d.ts +229 -0
  28. package/app/modules/icons/models/fontawesome-icons-brands.model.d.ts +13 -0
  29. package/app/modules/icons/models/fontawesome-icons-regular.model.d.ts +13 -0
  30. package/app/modules/icons/models/fontawesome-icons-solid.model.d.ts +13 -0
  31. package/app/modules/icons/models/particle-icons-light.model.d.ts +197 -0
  32. package/app/modules/icons/models/particle-icons-regular.model.d.ts +205 -0
  33. package/app/modules/icons/models/particle-icons-solid.model.d.ts +365 -0
  34. package/app/modules/icons/particle-icons.module.d.ts +13 -0
  35. package/app/modules/icons/services/icons.service.d.ts +44 -0
  36. package/app/modules/idle-timeout/idle-timeout.component.d.ts +35 -0
  37. package/app/modules/idle-timeout/idle-timer.d.ts +14 -0
  38. package/app/modules/idle-timeout/particle-idle-timeout.module.d.ts +9 -0
  39. package/app/modules/input-mask/input-mask.component.d.ts +86 -0
  40. package/app/modules/input-mask/input-mask.module.d.ts +8 -0
  41. package/app/modules/keyfilter/keyfilter.directive.d.ts +60 -0
  42. package/app/modules/keyfilter/keyfilter.module.d.ts +8 -0
  43. package/app/modules/layout/components/layout-full-framing/layout-full-framing.component.d.ts +27 -0
  44. package/app/modules/layout/components/layout-fullwidth-sidebar/layout-fullwidth-sidebar.component.d.ts +23 -0
  45. package/app/modules/layout/layout.module.d.ts +10 -0
  46. package/app/modules/loader/components/loader.component.d.ts +11 -0
  47. package/app/modules/loader/loader.module.d.ts +8 -0
  48. package/app/modules/multi-select/models/multi-select-option-group.model.d.ts +16 -0
  49. package/app/modules/multi-select/models/multi-select-option.model.d.ts +25 -0
  50. package/app/modules/multi-select/multi-select.component.d.ts +279 -0
  51. package/app/modules/multi-select/multi-select.module.d.ts +8 -0
  52. package/app/modules/notification/models/notification.model.d.ts +21 -0
  53. package/app/modules/notification/notification.component.d.ts +46 -0
  54. package/app/modules/notification/notification.module.d.ts +8 -0
  55. package/app/modules/notification/services/notification.service.d.ts +54 -0
  56. package/app/modules/ordinal-number-pipe/ordinal-number-pipe.module.d.ts +8 -0
  57. package/app/modules/ordinal-number-pipe/ordinal-number.pipe.d.ts +15 -0
  58. package/app/modules/paginator/pagination-event.model.d.ts +24 -0
  59. package/app/modules/paginator/paginator.component.d.ts +103 -0
  60. package/app/modules/paginator/particle-paginator.module.d.ts +13 -0
  61. package/app/modules/popover/popover.component.d.ts +140 -0
  62. package/app/modules/popover/popover.module.d.ts +9 -0
  63. package/app/modules/profile-pic/particle-profile-pic.module.d.ts +9 -0
  64. package/app/modules/profile-pic/profile-pic.component.d.ts +32 -0
  65. package/app/modules/progress-bar/progress-bar.component.d.ts +16 -0
  66. package/app/modules/progress-bar/progress-bar.module.d.ts +8 -0
  67. package/app/modules/push-container/particle-push-container.module.d.ts +9 -0
  68. package/app/modules/push-container/push-container-state.model.d.ts +7 -0
  69. package/app/modules/push-container/push-container.component.d.ts +137 -0
  70. package/app/modules/rich-text/particle-rich-text.module.d.ts +15 -0
  71. package/app/modules/rich-text/render-rich-text.component.d.ts +6 -0
  72. package/app/modules/rich-text/rich-text-capabilities.model.d.ts +7 -0
  73. package/app/modules/rich-text/rich-text.component.d.ts +48 -0
  74. package/app/modules/scroll-to-top/particle-scroll-to-top.module.d.ts +8 -0
  75. package/app/modules/scroll-to-top/scroll-to-top.component.d.ts +19 -0
  76. package/app/modules/slideover/particle-slideover.module.d.ts +8 -0
  77. package/app/modules/slideover/slideover.component.d.ts +35 -0
  78. package/app/modules/slider/slider.component.d.ts +143 -0
  79. package/app/modules/slider/slider.module.d.ts +9 -0
  80. package/app/modules/theming/components/theming.component.d.ts +43 -0
  81. package/app/modules/theming/models/theme.model.d.ts +88 -0
  82. package/app/modules/theming/services/theme-change-detection.service.d.ts +26 -0
  83. package/app/modules/theming/services/theming.service.d.ts +142 -0
  84. package/app/modules/theming/theming.module.d.ts +12 -0
  85. package/app/modules/toggle-switch/models/toggle-options.model.d.ts +11 -0
  86. package/app/modules/toggle-switch/toggle-switch.component.d.ts +43 -0
  87. package/app/modules/toggle-switch/toggle-switch.module.d.ts +8 -0
  88. package/app/modules/tooltip/tooltip.directive.d.ts +157 -0
  89. package/app/modules/tooltip/tooltip.module.d.ts +8 -0
  90. package/app/modules/week-picker/week-picker.component.d.ts +289 -0
  91. package/app/modules/week-picker/week-picker.module.d.ts +13 -0
  92. package/app/shared/enums/endpoint-status.enum.d.ts +9 -0
  93. package/app/shared/interceptors/json.interceptor.d.ts +17 -0
  94. package/app/shared/models/auditable.model.d.ts +21 -0
  95. package/app/shared/models/data-list.model.d.ts +9 -0
  96. package/app/shared/models/id.model.d.ts +9 -0
  97. package/app/shared/models/observable-container.d.ts +8 -0
  98. package/app/shared/models/particle-component-text.model.d.ts +211 -0
  99. package/app/shared/services/base-data.service.d.ts +130 -0
  100. package/app/shared/services/dialog.service.d.ts +10 -0
  101. package/app/shared/services/local-storage.service.d.ts +41 -0
  102. package/esm2022/app/modules/accordion/accordion.component.mjs +101 -0
  103. package/esm2022/app/modules/accordion/accordion.module.mjs +37 -0
  104. package/esm2022/app/modules/accordion/directives/accordion-content.directive.mjs +17 -0
  105. package/esm2022/app/modules/accordion/directives/accordion-header.directive.mjs +17 -0
  106. package/esm2022/app/modules/accordion/directives/accordion-item.directive.mjs +36 -0
  107. package/esm2022/app/modules/background-carousel/background-carousel.directive.mjs +91 -0
  108. package/esm2022/app/modules/background-carousel/carousel-options.model.mjs +36 -0
  109. package/esm2022/app/modules/background-carousel/particle-background-carousel.module.mjs +24 -0
  110. package/esm2022/app/modules/checkbox/checkbox.component.mjs +108 -0
  111. package/esm2022/app/modules/checkbox/checkbox.module.mjs +28 -0
  112. package/esm2022/app/modules/color-picker/color-picker.component.mjs +306 -0
  113. package/esm2022/app/modules/color-picker/color-picker.module.mjs +19 -0
  114. package/esm2022/app/modules/date-picker/components/calendar/calendar.component.mjs +496 -0
  115. package/esm2022/app/modules/date-picker/components/date-range-picker/date-range-picker.component.mjs +250 -0
  116. package/esm2022/app/modules/date-picker/date-picker.component.mjs +538 -0
  117. package/esm2022/app/modules/date-picker/date-picker.module.mjs +56 -0
  118. package/esm2022/app/modules/dialog/dialog.component.mjs +177 -0
  119. package/esm2022/app/modules/dialog/dialog.module.mjs +28 -0
  120. package/esm2022/app/modules/dropdown/dropdown.component.mjs +682 -0
  121. package/esm2022/app/modules/dropdown/dropdown.module.mjs +28 -0
  122. package/esm2022/app/modules/dropdown/models/dropdown-option-group.model.mjs +2 -0
  123. package/esm2022/app/modules/dropdown/models/dropdown-option.model.mjs +2 -0
  124. package/esm2022/app/modules/endpoint-state/components/endpoint-state.component.mjs +75 -0
  125. package/esm2022/app/modules/endpoint-state/endpoint-state.module.mjs +22 -0
  126. package/esm2022/app/modules/icons/components/icon-select.component.mjs +377 -0
  127. package/esm2022/app/modules/icons/models/fontawesome-icons-brands.model.mjs +471 -0
  128. package/esm2022/app/modules/icons/models/fontawesome-icons-regular.model.mjs +166 -0
  129. package/esm2022/app/modules/icons/models/fontawesome-icons-solid.model.mjs +1016 -0
  130. package/esm2022/app/modules/icons/models/particle-icons-light.model.mjs +310 -0
  131. package/esm2022/app/modules/icons/models/particle-icons-regular.model.mjs +324 -0
  132. package/esm2022/app/modules/icons/models/particle-icons-solid.model.mjs +581 -0
  133. package/esm2022/app/modules/icons/particle-icons.module.mjs +66 -0
  134. package/esm2022/app/modules/icons/services/icons.service.mjs +86 -0
  135. package/esm2022/app/modules/idle-timeout/idle-timeout.component.mjs +85 -0
  136. package/esm2022/app/modules/idle-timeout/idle-timer.mjs +66 -0
  137. package/esm2022/app/modules/idle-timeout/particle-idle-timeout.module.mjs +28 -0
  138. package/esm2022/app/modules/input-mask/input-mask.component.mjs +594 -0
  139. package/esm2022/app/modules/input-mask/input-mask.module.mjs +18 -0
  140. package/esm2022/app/modules/keyfilter/keyfilter.directive.mjs +158 -0
  141. package/esm2022/app/modules/keyfilter/keyfilter.module.mjs +18 -0
  142. package/esm2022/app/modules/layout/components/layout-full-framing/layout-full-framing.component.mjs +79 -0
  143. package/esm2022/app/modules/layout/components/layout-fullwidth-sidebar/layout-fullwidth-sidebar.component.mjs +65 -0
  144. package/esm2022/app/modules/layout/layout.module.mjs +33 -0
  145. package/esm2022/app/modules/loader/components/loader.component.mjs +30 -0
  146. package/esm2022/app/modules/loader/loader.module.mjs +24 -0
  147. package/esm2022/app/modules/multi-select/models/multi-select-option-group.model.mjs +2 -0
  148. package/esm2022/app/modules/multi-select/models/multi-select-option.model.mjs +2 -0
  149. package/esm2022/app/modules/multi-select/multi-select.component.mjs +665 -0
  150. package/esm2022/app/modules/multi-select/multi-select.module.mjs +18 -0
  151. package/esm2022/app/modules/notification/models/notification.model.mjs +2 -0
  152. package/esm2022/app/modules/notification/notification.component.mjs +122 -0
  153. package/esm2022/app/modules/notification/notification.module.mjs +18 -0
  154. package/esm2022/app/modules/notification/services/notification.service.mjs +84 -0
  155. package/esm2022/app/modules/ordinal-number-pipe/ordinal-number-pipe.module.mjs +20 -0
  156. package/esm2022/app/modules/ordinal-number-pipe/ordinal-number.pipe.mjs +49 -0
  157. package/esm2022/app/modules/paginator/pagination-event.model.mjs +29 -0
  158. package/esm2022/app/modules/paginator/paginator.component.mjs +207 -0
  159. package/esm2022/app/modules/paginator/particle-paginator.module.mjs +48 -0
  160. package/esm2022/app/modules/popover/popover.component.mjs +352 -0
  161. package/esm2022/app/modules/popover/popover.module.mjs +24 -0
  162. package/esm2022/app/modules/profile-pic/particle-profile-pic.module.mjs +28 -0
  163. package/esm2022/app/modules/profile-pic/profile-pic.component.mjs +74 -0
  164. package/esm2022/app/modules/progress-bar/progress-bar.component.mjs +43 -0
  165. package/esm2022/app/modules/progress-bar/progress-bar.module.mjs +24 -0
  166. package/esm2022/app/modules/push-container/particle-push-container.module.mjs +26 -0
  167. package/esm2022/app/modules/push-container/push-container-state.model.mjs +2 -0
  168. package/esm2022/app/modules/push-container/push-container.component.mjs +363 -0
  169. package/esm2022/app/modules/rich-text/particle-rich-text.module.mjs +64 -0
  170. package/esm2022/app/modules/rich-text/render-rich-text.component.mjs +18 -0
  171. package/esm2022/app/modules/rich-text/rich-text-capabilities.model.mjs +2 -0
  172. package/esm2022/app/modules/rich-text/rich-text.component.mjs +187 -0
  173. package/esm2022/app/modules/scroll-to-top/particle-scroll-to-top.module.mjs +24 -0
  174. package/esm2022/app/modules/scroll-to-top/scroll-to-top.component.mjs +49 -0
  175. package/esm2022/app/modules/slideover/particle-slideover.module.mjs +24 -0
  176. package/esm2022/app/modules/slideover/slideover.component.mjs +115 -0
  177. package/esm2022/app/modules/slider/slider.component.mjs +243 -0
  178. package/esm2022/app/modules/slider/slider.module.mjs +26 -0
  179. package/esm2022/app/modules/theming/components/theming.component.mjs +86 -0
  180. package/esm2022/app/modules/theming/models/theme.model.mjs +9 -0
  181. package/esm2022/app/modules/theming/services/theme-change-detection.service.mjs +38 -0
  182. package/esm2022/app/modules/theming/services/theming.service.mjs +507 -0
  183. package/esm2022/app/modules/theming/theming.module.mjs +55 -0
  184. package/esm2022/app/modules/toggle-switch/models/toggle-options.model.mjs +2 -0
  185. package/esm2022/app/modules/toggle-switch/toggle-switch.component.mjs +107 -0
  186. package/esm2022/app/modules/toggle-switch/toggle-switch.module.mjs +24 -0
  187. package/esm2022/app/modules/tooltip/tooltip.directive.mjs +381 -0
  188. package/esm2022/app/modules/tooltip/tooltip.module.mjs +18 -0
  189. package/esm2022/app/modules/week-picker/week-picker.component.mjs +511 -0
  190. package/esm2022/app/modules/week-picker/week-picker.module.mjs +40 -0
  191. package/esm2022/app/shared/enums/endpoint-status.enum.mjs +11 -0
  192. package/esm2022/app/shared/interceptors/json.interceptor.mjs +23 -0
  193. package/esm2022/app/shared/models/auditable.model.mjs +2 -0
  194. package/esm2022/app/shared/models/data-list.model.mjs +2 -0
  195. package/esm2022/app/shared/models/id.model.mjs +2 -0
  196. package/esm2022/app/shared/models/observable-container.mjs +15 -0
  197. package/esm2022/app/shared/models/particle-component-text.model.mjs +2 -0
  198. package/esm2022/app/shared/services/base-data.service.mjs +190 -0
  199. package/esm2022/app/shared/services/dialog.service.mjs +50 -0
  200. package/esm2022/app/shared/services/local-storage.service.mjs +60 -0
  201. package/esm2022/entake-particle.mjs +5 -0
  202. package/esm2022/public_api.mjs +98 -0
  203. package/fesm2022/entake-particle.mjs +12477 -0
  204. package/fesm2022/entake-particle.mjs.map +1 -0
  205. package/index.d.ts +5 -0
  206. package/package.json +65 -0
  207. package/particle.css +1 -0
  208. package/public_api.d.ts +97 -0
@@ -0,0 +1,377 @@
1
+ import { Component, EventEmitter, forwardRef, Input, Output, ViewChild } from '@angular/core';
2
+ import { NG_VALUE_ACCESSOR } from '@angular/forms';
3
+ import { BehaviorSubject, combineLatest, Subject } from 'rxjs';
4
+ import { map, tap, withLatestFrom } from 'rxjs/operators';
5
+ import * as i0 from "@angular/core";
6
+ import * as i1 from "../services/icons.service";
7
+ import * as i2 from "@angular/common";
8
+ import * as i3 from "@angular/forms";
9
+ import * as i4 from "../../tooltip/tooltip.directive";
10
+ import * as i5 from "../../dialog/dialog.component";
11
+ import * as i6 from "../../endpoint-state/components/endpoint-state.component";
12
+ /**
13
+ * Particle Icon Select component provides a button and an icon picker that includes all of the Particle Icons as well as the FAS icons.
14
+ */
15
+ export class IconSelectComponent {
16
+ service;
17
+ changeDetectorRef;
18
+ /**
19
+ * The number of items to display per page
20
+ * @private
21
+ */
22
+ static PAGE_SIZE = 48;
23
+ /**
24
+ * Set the value of the icon select
25
+ * @param value the value to set
26
+ */
27
+ set value(value) {
28
+ this._value = value;
29
+ if (value) {
30
+ const [prefix, name] = value.split(' ');
31
+ this._internalValue.next({ prefix, name });
32
+ this.showIconSelectionPreview = true;
33
+ }
34
+ }
35
+ /**
36
+ * Set disabled
37
+ * @param disabled whether or not the icon picker should be disabled
38
+ */
39
+ set disabled(disabled) {
40
+ this._disabled = disabled;
41
+ }
42
+ /**
43
+ * Color class of the button
44
+ */
45
+ buttonColorClass = null;
46
+ /**
47
+ * The value to set to the button's width, min-width, height and min-height
48
+ */
49
+ buttonSizing = '40px';
50
+ text = {
51
+ selectAnIcon: 'Select an Icon',
52
+ seeAllIcons: 'See All Icons',
53
+ fontAwesomeIcons: 'Font Awesome Icons',
54
+ all: 'All',
55
+ solid: 'Solid',
56
+ regular: 'Regular',
57
+ brands: 'Brands',
58
+ light: 'Light',
59
+ customIcons: 'Custom Icons',
60
+ previousPage: 'Previous Page',
61
+ nextPage: 'Next Page',
62
+ searchIcons: 'Search Icons',
63
+ submitSearch: 'Submit Search',
64
+ clearResults: 'Clear Results',
65
+ couldntFindAnything: 'We couldn\'t find anything',
66
+ modifySearchCriteria: 'Please try modifying your search criteria',
67
+ selection: 'Selection',
68
+ confirm: 'Confirm',
69
+ select: 'Select',
70
+ close: 'Close'
71
+ };
72
+ /**
73
+ * Icon select opened event emitter
74
+ */
75
+ opened = new EventEmitter();
76
+ /**
77
+ * Icon selected event emitter
78
+ */
79
+ selected = new EventEmitter();
80
+ /**
81
+ * Dialog closed event emitter
82
+ */
83
+ closed = new EventEmitter();
84
+ /**
85
+ * The scrollable icon container
86
+ */
87
+ iconScrollContainer = null;
88
+ /**
89
+ * BehaviorSubject tracking the input value destructed into its prefix and class name
90
+ */
91
+ _internalValue = new BehaviorSubject(null);
92
+ /**
93
+ * BehaviorSubject tracking the current filter value selection for icons
94
+ */
95
+ _filter = new BehaviorSubject({ style: 'all', type: 'all' });
96
+ /**
97
+ * BehaviorSubject tracking the current icon search text value
98
+ */
99
+ _searchText = new BehaviorSubject('');
100
+ /**
101
+ * BehaviorSubject that emits when search button has been clicked
102
+ */
103
+ _searchClick = new BehaviorSubject('');
104
+ /**
105
+ * BehaviorSubject tracking the active pagination page
106
+ */
107
+ _activePage = new BehaviorSubject(0);
108
+ /**
109
+ * Subject that emits on search input enter keyup
110
+ */
111
+ _searchInputEnterKeyup = new Subject();
112
+ /**
113
+ * An array of all icons (as strings) that meet the current filter/search criteria as an Observable
114
+ * @private
115
+ */
116
+ icons$ = combineLatest([
117
+ this._filter,
118
+ this._searchClick
119
+ ]).pipe(map(([filter, searchText]) => this.service.getIcons(filter.type, filter.style, searchText)));
120
+ /**
121
+ * The count of total paginator pages as an Observable
122
+ */
123
+ totalPages$ = this.icons$.pipe(map(icons => icons.length
124
+ ? Math.ceil(icons.length / IconSelectComponent.PAGE_SIZE)
125
+ : 0));
126
+ /**
127
+ * Observable boolean indicating whether or not the user can perform an icon text search
128
+ */
129
+ canSearch$ = this._searchText.pipe(map(searchText => !!searchText.trim().length));
130
+ /**
131
+ * Observable boolean indicating whether or not the user can paginate to the previous page
132
+ */
133
+ canPaginatePrevious$ = this._activePage.pipe(map(activePage => activePage > 0));
134
+ /**
135
+ * Observable boolean indicating whether or not the user can paginate to the next page
136
+ */
137
+ canPaginateNext$ = this.totalPages$.pipe(withLatestFrom(this._activePage), map(([totalPages, activePage]) => activePage < (totalPages - 1)));
138
+ /**
139
+ * Paginated icons array as an Observable
140
+ */
141
+ paginatedIcons$ = combineLatest([
142
+ this._activePage,
143
+ this.icons$
144
+ ]).pipe(map(([activePage, icons]) => {
145
+ let paginatedIcons = null;
146
+ if (activePage >= 0 && icons.length) {
147
+ paginatedIcons = icons.slice(IconSelectComponent.PAGE_SIZE * activePage, IconSelectComponent.PAGE_SIZE * (activePage + 1));
148
+ }
149
+ return paginatedIcons;
150
+ }), tap(() => {
151
+ if (this.iconScrollContainer) {
152
+ this.iconScrollContainer.nativeElement.scrollTop = 0;
153
+ }
154
+ }));
155
+ /**
156
+ * Object that controls whether to show the dialog or not
157
+ */
158
+ showDialog;
159
+ /**
160
+ * Whether or not to show the icon selection preview
161
+ */
162
+ showIconSelectionPreview = false;
163
+ /**
164
+ * Subscription object to store search input enter keyup subscription
165
+ * @private
166
+ */
167
+ subscription;
168
+ /**
169
+ * The value of the icon select
170
+ * @private
171
+ */
172
+ _value = null;
173
+ /**
174
+ * Whether or not the icon picker is disabled
175
+ * @private
176
+ */
177
+ _disabled = false;
178
+ /**
179
+ * Function to call on change
180
+ */
181
+ onChange = () => { };
182
+ /**
183
+ * Function to call on touch
184
+ */
185
+ onTouched = () => { };
186
+ /**
187
+ * Dependency injection site
188
+ * @param service the IconsService
189
+ * @param changeDetectorRef the Angular ChangeDetectorRef
190
+ */
191
+ constructor(service, changeDetectorRef) {
192
+ this.service = service;
193
+ this.changeDetectorRef = changeDetectorRef;
194
+ this.subscription = this._searchInputEnterKeyup.pipe(withLatestFrom(this.canSearch$)).subscribe(([___, canSearch]) => {
195
+ if (canSearch) {
196
+ this._searchClick.next(this._searchText.getValue());
197
+ this._activePage.next(0);
198
+ }
199
+ });
200
+ }
201
+ /**
202
+ * Get disabled
203
+ */
204
+ get disabled() {
205
+ return this._disabled;
206
+ }
207
+ /**
208
+ * Destroy component, unsubscribe from search input enter keyup subscription
209
+ */
210
+ ngOnDestroy() {
211
+ this.subscription.unsubscribe();
212
+ }
213
+ /**
214
+ * Write the input value
215
+ * @param value the value to write
216
+ */
217
+ writeValue(value) {
218
+ this.value = value;
219
+ this.changeDetectorRef.markForCheck();
220
+ }
221
+ /**
222
+ * Register onChange function
223
+ * @param fn the function to register
224
+ */
225
+ registerOnChange(fn) {
226
+ this.onChange = fn;
227
+ }
228
+ /**
229
+ * Register onTouched function
230
+ * @param fn the function to register
231
+ */
232
+ registerOnTouched(fn) {
233
+ this.onTouched = fn;
234
+ }
235
+ /**
236
+ * Set disabled state
237
+ * @param isDisabled whether or not the icon picker should be disabled
238
+ */
239
+ setDisabledState(isDisabled) {
240
+ this.disabled = isDisabled;
241
+ this.changeDetectorRef.markForCheck();
242
+ }
243
+ /**
244
+ * Open the icon select dialog
245
+ */
246
+ openDialog() {
247
+ if (!this.disabled) {
248
+ this.reset();
249
+ this.showDialog = {};
250
+ this.opened.emit();
251
+ if (this.value) {
252
+ this.showIconSelectionPreview = true;
253
+ }
254
+ }
255
+ }
256
+ /**
257
+ * Close the icon select dialog
258
+ */
259
+ closeDialog() {
260
+ let internalValue = null;
261
+ if (this._value) {
262
+ const [prefix, name] = this._value.split(' ');
263
+ internalValue = { prefix, name };
264
+ }
265
+ this._internalValue.next(internalValue);
266
+ this.showDialog = null;
267
+ this.closed.emit();
268
+ }
269
+ /**
270
+ * Handle filter select
271
+ * @param filter the selected filter
272
+ */
273
+ handleFilterSelect(filter) {
274
+ this._filter.next(filter);
275
+ this._activePage.next(0);
276
+ }
277
+ /**
278
+ * Update internal value on icon select
279
+ * @param icon the selected icon
280
+ */
281
+ handleIconSelect(icon) {
282
+ this._internalValue.next(icon);
283
+ this.showIconSelectionPreview = false;
284
+ setTimeout(() => this.showIconSelectionPreview = true);
285
+ }
286
+ /**
287
+ * Write value on confirm
288
+ */
289
+ handleIconSelectConfirm() {
290
+ const icon = this._internalValue.getValue();
291
+ this.updateModel(`${icon.prefix} ${icon.name}`);
292
+ this.closeDialog();
293
+ }
294
+ /**
295
+ * Go to the next pagination page
296
+ */
297
+ paginateNext() {
298
+ this._activePage.next(this._activePage.getValue() + 1);
299
+ }
300
+ /**
301
+ * Go to the previous pagination page
302
+ */
303
+ paginatePrevious() {
304
+ this._activePage.next(this._activePage.getValue() - 1);
305
+ }
306
+ /**
307
+ * Clear search text and reset paginator
308
+ */
309
+ clearSearch() {
310
+ this._searchText.next('');
311
+ this._searchClick.next('');
312
+ this._activePage.next(0);
313
+ }
314
+ /**
315
+ * Update model
316
+ * @param value the new value of the model
317
+ * @private
318
+ */
319
+ updateModel(value) {
320
+ const valueBeforeUpdate = this._value;
321
+ if (!this.disabled) {
322
+ this.value = value;
323
+ if (valueBeforeUpdate !== this._value) {
324
+ this.onChange(this._value);
325
+ }
326
+ this.selected.emit({ value: this._value });
327
+ }
328
+ }
329
+ /**
330
+ * Reset filtering/pagination BehaviorSubject values
331
+ * @private
332
+ */
333
+ reset() {
334
+ this._filter.next({ style: 'all', type: 'all' });
335
+ this._searchText.next('');
336
+ this._searchClick.next('');
337
+ this._activePage.next(0);
338
+ }
339
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.2", ngImport: i0, type: IconSelectComponent, deps: [{ token: i1.IconsService }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
340
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.2", type: IconSelectComponent, selector: "particle-icon-select", inputs: { value: "value", disabled: "disabled", buttonColorClass: "buttonColorClass", buttonSizing: "buttonSizing", text: "text" }, outputs: { opened: "opened", selected: "selected", closed: "closed" }, providers: [
341
+ {
342
+ provide: NG_VALUE_ACCESSOR,
343
+ useExisting: forwardRef(() => IconSelectComponent),
344
+ multi: true
345
+ }
346
+ ], viewQueries: [{ propertyName: "iconScrollContainer", first: true, predicate: ["iconScrollContainer"], descendants: true }], ngImport: i0, template: "<!-- choose button -->\r\n<button [ngClass]=\"buttonColorClass ? buttonColorClass : 'content_color'\"\r\n [ngStyle]=\"{\r\n 'width': buttonSizing,\r\n 'min-width': buttonSizing,\r\n 'height': buttonSizing,\r\n 'min-height': buttonSizing\r\n }\"\r\n (click)=\"openDialog()\"\r\n [particleTooltip]=\"(_internalValue | async)?.prefix + ' ' + (_internalValue | async)?.name\"\r\n [tooltipDisabled]=\"(_internalValue | async) === undefined\"\r\n [disabled]=\"disabled\"\r\n class=\"access wis_button bg_overlay brdr brad_3\"\r\n [attr.aria-label]=\"text.selectAnIcon\">\r\n <ng-container *ngIf=\"!showDialog else placeholderIcon\">\r\n <div *ngIf=\"_internalValue | async as selectedIcon else noSelection\">\r\n <i class=\"{{selectedIcon.prefix}} {{selectedIcon.name}} wis_icon\"></i>\r\n </div>\r\n <ng-template #noSelection>\r\n <div><i class=\"fas fa-icons opacity_20\"></i></div>\r\n </ng-template>\r\n </ng-container>\r\n <ng-template #placeholderIcon>\r\n <div><i class=\"fas fa-spinner fa-spin\"></i></div>\r\n </ng-template>\r\n</button>\r\n\r\n<!-- TODO: at some point, maybe implement infinite scroll to icons -->\r\n\r\n<!-- picker dialog -->\r\n<particle-dialog [title]=\"text.selectAnIcon\"\r\n [object]=\"showDialog\"\r\n [width]=\"'850px'\"\r\n [height]=\"'500px'\"\r\n (closed)=\"closeDialog()\">\r\n <div class=\"row height100\">\r\n\r\n <!-- FILTERS -->\r\n <div class=\"col min_w250 bg_overlay brdr border_right mobile_hide\">\r\n <div class=\"row_block width100\">\r\n <ng-container *ngIf=\"_filter | async as filter\">\r\n <!-- all icons -->\r\n <div class=\"mar_5 pad_5\">\r\n <button (click)=\"handleFilterSelect({ style: 'all', type: 'all' })\"\r\n [ngClass]=\"{ 'selected': filter.type === 'all' && filter.style === 'all' }\"\r\n class=\"access list_btn row space_between wis_filter_btn bg_overlay_rev brdr\"\r\n [attr.aria-label]=\"text.seeAllIcons\">\r\n <div class=\"v_center\">\r\n <div class=\"circle_16px bg_overlay_rev brdr mar_right10\">\r\n <div *ngIf=\"filter.type === 'all' && filter.style === 'all'\" class=\"circle_8px ok_button_color\"></div>\r\n </div>\r\n <div class=\"text md\">{{text.seeAllIcons}}</div>\r\n </div>\r\n <div class=\"go_icon\"><i class=\"fas fa-chevron-right fa-fw fa-sm opacity_60\"></i></div>\r\n </button>\r\n </div>\r\n <div class=\"bg_overlay brdr hr mar_10\"></div>\r\n <!-- fontawesome icons -->\r\n <div class=\"mar_5\">\r\n <div class=\"text md bolder\" style=\"padding:10px 10px 5px 15px;\">{{text.fontAwesomeIcons}}</div>\r\n <div class=\"mar_5\">\r\n <button (click)=\"handleFilterSelect({ style: 'all', type: 'fontawesome' })\"\r\n [ngClass]=\"{ 'selected': filter.type === 'fontawesome' && filter.style === 'all' }\"\r\n class=\"access list_btn row space_between wis_filter_btn bg_overlay_rev brdr\"\r\n [attr.aria-label]=\"text.filterBy + ' ' + text.fontAwesomeIcons\">\r\n <div class=\"v_center\">\r\n <div class=\"circle_16px bg_overlay_rev brdr mar_right10\">\r\n <div *ngIf=\"filter.type === 'fontawesome' && filter.style === 'all'\" class=\"circle_8px ok_button_color\"></div>\r\n </div>\r\n <div class=\"text md\">{{text.all}}</div>\r\n </div>\r\n <div class=\"go_icon\"><i class=\"fas fa-chevron-right fa-fw fa-sm opacity_60\"></i></div>\r\n </button>\r\n </div>\r\n <div class=\"mar_5\">\r\n <button (click)=\"handleFilterSelect({ style: 'solid', type: 'fontawesome' })\"\r\n [ngClass]=\"{ 'selected': filter.type === 'fontawesome' && filter.style === 'solid' }\"\r\n class=\"access list_btn row space_between wis_filter_btn bg_overlay_rev brdr\"\r\n [attr.aria-label]=\"text.filterBy + ' ' + text.solid + ' ' + text.fontAwesomeIcons\">\r\n <div class=\"v_center\">\r\n <div class=\"circle_16px bg_overlay_rev brdr mar_right10\">\r\n <div *ngIf=\"filter.type === 'fontawesome' && filter.style === 'solid'\" class=\"circle_8px ok_button_color\"></div>\r\n </div>\r\n <div class=\"text md\">{{text.solid}}</div>\r\n </div>\r\n <div class=\"go_icon\"><i class=\"fas fa-chevron-right fa-fw fa-sm opacity_60\"></i></div>\r\n </button>\r\n </div>\r\n <div class=\"mar_5\">\r\n <button (click)=\"handleFilterSelect({ style: 'regular', type: 'fontawesome' })\"\r\n [ngClass]=\"{ 'selected': filter.type === 'fontawesome' && filter.style === 'regular' }\"\r\n class=\"access list_btn row space_between wis_filter_btn bg_overlay_rev brdr\"\r\n [attr.aria-label]=\"text.filterBy + ' ' + text.regular + ' ' + text.fontAwesomeIcons\">\r\n <div class=\"v_center\">\r\n <div class=\"circle_16px bg_overlay_rev brdr mar_right10\">\r\n <div *ngIf=\"filter.type === 'fontawesome' && filter.style === 'regular'\" class=\"circle_8px ok_button_color\"></div>\r\n </div>\r\n <div class=\"text md\">{{text.regular}}</div>\r\n </div>\r\n <div class=\"go_icon\"><i class=\"fas fa-chevron-right fa-fw fa-sm opacity_60\"></i></div>\r\n </button>\r\n </div>\r\n <div class=\"mar_5\">\r\n <button (click)=\"handleFilterSelect({ style: 'brands', type: 'fontawesome' })\"\r\n [ngClass]=\"{ 'selected': filter.type === 'fontawesome' && filter.style === 'brands' }\"\r\n class=\"access list_btn row space_between wis_filter_btn bg_overlay_rev brdr\"\r\n [attr.aria-label]=\"text.filterBy + ' ' + text.brands + ' ' + text.fontAwesomeIcons\">\r\n <div class=\"v_center\">\r\n <div class=\"circle_16px bg_overlay_rev brdr mar_right10\">\r\n <div *ngIf=\"filter.type === 'fontawesome' && filter.style === 'brands'\" class=\"circle_8px ok_button_color\"></div>\r\n </div>\r\n <div class=\"text md\">{{text.brands}}</div>\r\n </div>\r\n <div class=\"go_icon\"><i class=\"fas fa-chevron-right fa-fw fa-sm opacity_60\"></i></div>\r\n </button>\r\n </div>\r\n </div>\r\n <div class=\"bg_overlay brdr hr mar_10\"></div>\r\n <!-- custom icons -->\r\n <div class=\"mar_5\">\r\n <div class=\"text md bolder\" style=\"padding:10px 10px 5px 15px;\">{{text.customIcons}}</div>\r\n <div class=\"mar_5\">\r\n <button (click)=\"handleFilterSelect({ style: 'all', type: 'particle' })\"\r\n [ngClass]=\"{ 'selected': filter.type === 'particle' && filter.style === 'all' }\"\r\n class=\"access list_btn row space_between wis_filter_btn bg_overlay_rev brdr\"\r\n [attr.aria-label]=\"text.filterBy + ' ' + text.customIcons\">\r\n <div class=\"v_center\">\r\n <div class=\"circle_16px bg_overlay_rev brdr mar_right10\">\r\n <div *ngIf=\"filter.type === 'particle' && filter.style === 'all'\" class=\"circle_8px ok_button_color\"></div>\r\n </div>\r\n <div class=\"text md\">All</div>\r\n </div>\r\n <div class=\"go_icon\"><i class=\"fas fa-chevron-right fa-fw fa-sm opacity_60\"></i></div>\r\n </button>\r\n </div>\r\n <div class=\"mar_5\">\r\n <button (click)=\"handleFilterSelect({ style: 'solid', type: 'particle' })\"\r\n [ngClass]=\"{ 'selected': filter.type === 'particle' && filter.style === 'solid' }\"\r\n class=\"access list_btn row space_between wis_filter_btn bg_overlay_rev brdr\"\r\n [attr.aria-label]=\"text.filterBy + ' ' + text.solid + ' ' + text.customIcons\">\r\n <div class=\"v_center\">\r\n <div class=\"circle_16px bg_overlay_rev brdr mar_right10\">\r\n <div *ngIf=\"filter.type === 'particle' && filter.style === 'solid'\" class=\"circle_8px ok_button_color\"></div>\r\n </div>\r\n <div class=\"text md\">Solid</div>\r\n </div>\r\n <div class=\"go_icon\"><i class=\"fas fa-chevron-right fa-fw fa-sm opacity_60\"></i></div>\r\n </button>\r\n </div>\r\n <div class=\"mar_5\">\r\n <button (click)=\"handleFilterSelect({ style: 'regular', type: 'particle' })\"\r\n [ngClass]=\"{ 'selected': filter.type === 'particle' && filter.style === 'regular' }\"\r\n class=\"access list_btn row space_between wis_filter_btn bg_overlay_rev brdr\"\r\n [attr.aria-label]=\"text.filterBy + ' ' + text.regular + ' ' + text.customIcons\">\r\n <div class=\"v_center\">\r\n <div class=\"circle_16px bg_overlay_rev brdr mar_right10\">\r\n <div *ngIf=\"filter.type === 'particle' && filter.style === 'regular'\" class=\"circle_8px ok_button_color\"></div>\r\n </div>\r\n <div class=\"text md\">Regular</div>\r\n </div>\r\n <div class=\"go_icon\"><i class=\"fas fa-chevron-right fa-fw fa-sm opacity_60\"></i></div>\r\n </button>\r\n </div>\r\n <div class=\"mar_5\">\r\n <button (click)=\"handleFilterSelect({ style: 'light', type: 'particle' })\"\r\n [ngClass]=\"{ 'selected': filter.type === 'particle' && filter.style === 'light' }\"\r\n class=\"access list_btn row space_between wis_filter_btn bg_overlay_rev brdr\"\r\n [attr.aria-label]=\"text.filterBy + ' ' + text.light + ' ' + text.customIcons\">\r\n <div class=\"v_center\">\r\n <div class=\"circle_16px bg_overlay_rev brdr mar_right10\">\r\n <div *ngIf=\"filter.type === 'particle' && filter.style === 'light'\" class=\"circle_8px ok_button_color\"></div>\r\n </div>\r\n <div class=\"text md\">{{text.light}}</div>\r\n </div>\r\n <div class=\"go_icon\"><i class=\"fas fa-chevron-right fa-fw fa-sm opacity_60\"></i></div>\r\n </button>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </div>\r\n\r\n <!-- ICONS -->\r\n <div class=\"col size_2 column\">\r\n <div class=\"col content_color_dark_1 pad_x5\">\r\n <!-- paginator -->\r\n <div *ngIf=\"totalPages$ | async as totalPages\"\r\n class=\"col v_center mar_10\">\r\n <button *ngIf=\"canPaginatePrevious$ | async else disabledPreviousButton\"\r\n (click)=\"paginatePrevious()\"\r\n class=\"access btn square_24px bg_overlay brdr ok_button_color\"\r\n [attr.aria-label]=\"text.previousPage\">\r\n <span class=\"icon slide_left\"><i class=\"fas fa-arrow-left\"></i></span>\r\n </button>\r\n <ng-template #disabledPreviousButton>\r\n <button disabled class=\"access btn square_24px bg_overlay brdr ok_button_color\"\r\n [attr.aria-label]=\"text.previousPage\">\r\n <span class=\"icon slide_left\"><i class=\"fas fa-arrow-left\"></i></span>\r\n </button>\r\n </ng-template>\r\n <div\r\n class=\"text sm bolder center\"\r\n style=\"min-width:65px;\">\r\n {{(_activePage | async)! + 1}} / {{totalPages}}\r\n </div>\r\n <button *ngIf=\"canPaginateNext$ | async else disabledNextButton\"\r\n (click)=\"paginateNext()\"\r\n class=\"access btn square_24px bg_overlay brdr ok_button_color\"\r\n [attr.aria-label]=\"text.nextPage\">\r\n <span class=\"icon slide_right\"><i class=\"fas fa-arrow-right\"></i></span>\r\n </button>\r\n <ng-template #disabledNextButton>\r\n <button disabled class=\"access btn square_24px bg_overlay brdr ok_button_color\"\r\n [attr.aria-label]=\"text.nextPage\">\r\n <span class=\"icon slide_right\"><i class=\"fas fa-arrow-right\"></i></span>\r\n </button>\r\n </ng-template>\r\n </div>\r\n <!-- search -->\r\n <div class=\"col size_1 wis_search mar_10\">\r\n <input #iconSearchInput\r\n [ngModel]=\"_searchText | async\"\r\n (input)=\"_searchText.next(iconSearchInput.value)\"\r\n (keyup.enter)=\"_searchInputEnterKeyup.next($any(null))\"\r\n class=\"access input md bg_overlay brdr content_color\"\r\n [attr.aria-label]=\"text.searchIcons\" [placeholder]=\"text.searchIcons + '...'\" />\r\n <button *ngIf=\"(canSearch$ | async) && (_searchClick | async)\"\r\n (click)=\"clearSearch()\" aria-label=\"Clear search\"\r\n class=\"access btn circle_18px overlay wis_clear_btn\">\r\n <span class=\"icon grow\"><i class=\"fas fa-times fa-sm\"></i></span>\r\n </button>\r\n <button *ngIf=\"canSearch$ | async else disabledSearchButton\"\r\n (click)=\"_searchClick.next(iconSearchInput.value); _activePage.next(0)\"\r\n class=\"access btn square_28px bg_overlay brdr ok_button_color brad_3 wis_search_btn\"\r\n [attr.aria-label]=\"text.submitSearch\" type=\"submit\">\r\n <span class=\"icon grow\"><i class=\"fas fa-search fa-sm\"></i></span>\r\n </button>\r\n <ng-template #disabledSearchButton>\r\n <button disabled\r\n class=\"access btn square_28px bg_overlay brdr ok_button_color brad_3 wis_search_btn\"\r\n [attr.aria-label]=\"text.submitSearch\" type=\"submit\">\r\n <span class=\"icon grow\"><i class=\"fas fa-search fa-sm\"></i></span>\r\n </button>\r\n </ng-template>\r\n </div>\r\n </div>\r\n <!-- icons -->\r\n <div #iconScrollContainer class=\"col size_1 top_left scroll_y pad_5\" style=\"scroll-behavior: smooth\">\r\n <ng-container *ngIf=\"paginatedIcons$ | async as icons else noResults\">\r\n <div class=\"row wrap top_left\" style=\"align-items:stretch;\">\r\n <ng-container *ngFor=\"let icon of paginatedIcons$ | async\">\r\n <div class=\"col size_1 min_w75 mar_5\">\r\n <button class=\"access wis_icon_btn\" (click)=\"handleIconSelect(icon)\" [attr.aria-label]=\"text.select + ' ' + icon.name\">\r\n <div [ngClass]=\"((_internalValue | async)?.prefix === icon.prefix) && ((_internalValue | async)?.name === icon.name) ? 'ok_button_color' : 'content_color'\"\r\n class=\"wis_icon_btn_preview square_50px brad_3 bg_overlay brdr mar_bot5\">\r\n <i class=\"{{icon.prefix}} {{icon.name}}\"></i>\r\n </div>\r\n <div class=\"text sm center faded\">{{icon.name}}</div>\r\n </button>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n <ng-template #noResults>\r\n <div class=\"row column min_h300 center_center\">\r\n <particle-endpoint-state\r\n [empty]=\"true\"\r\n [emptyIcon]=\"'fas fa-search fa-3x mar_bot5'\"\r\n [text]=\"{emptyText: text.couldntFindAnything, emptySubtext: text.modifySearchCriteria}\">\r\n </particle-endpoint-state>\r\n <button class=\"access btnset clear mar_10\"\r\n [attr.aria-label]=\"text.close\"\r\n (click)=\"clearSearch()\">\r\n <div class=\"circle_20px ptl_brdr_color ptl_brdr_size ptl_input_bg_color\">\r\n <i class=\"fas fa-times\"></i>\r\n </div>\r\n </button>\r\n </div>\r\n </ng-template>\r\n </div>\r\n <div *ngIf=\"_internalValue | async as selectedIcon\"\r\n class=\"col space_between bg_overlay brdr border_top pad_x5 wis_selection_bar\">\r\n <div class=\"col v_center mar_10\">\r\n <div class=\"text md faded mar_right10 mobile_hide\">{{text.selection}}:</div>\r\n <div class=\"v_center\" *ngIf=\"showIconSelectionPreview\">\r\n <i class=\"{{selectedIcon.prefix}} {{selectedIcon.name}} fa-fw mar_right5\" style=\"font-size:16px;\"></i>\r\n <div class=\"text md bold\">{{selectedIcon.prefix}} {{selectedIcon.name}}</div>\r\n </div>\r\n </div>\r\n <div class=\"col v_center mar_10\">\r\n <button\r\n type=\"button\"\r\n class=\"access btnset spaced md hov_glow save_button_color ptl_brdr_radius\"\r\n [attr.aria-label]=\"text.confirm\"\r\n (click)=\"handleIconSelectConfirm()\"\r\n >\r\n <div>{{text.confirm}}</div>\r\n <div class=\"brdr border_left mar_left10 pad_left10\"><i class=\"fas fa-check\"></i></div>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</particle-dialog>\r\n", styles: [".wis_button{width:40px;min-width:40px;height:40px;min-height:40px;cursor:pointer;transition:all .1s ease}.wis_button:disabled{cursor:default;opacity:1!important}.wis_button:hover:not(:disabled){filter:brightness(1.05)}.wis_button svg{transition:transform .1s ease}.wis_button:hover:not(:disabled) .wis_icon{transform:scale(1.15)}@supports not (-ms-high-contrast:none){.wis_button svg{width:75%;height:75%}}.wis_search{position:relative}.wis_search input{padding-right:40px!important}.wis_search .wis_search_btn{position:absolute;right:0;top:0;z-index:var(--z-frame);border-top-left-radius:0;border-bottom-left-radius:0;height:100%;width:32px}.wis_search .wis_clear_btn{position:absolute;right:40px;top:7px;z-index:var(--z-frame)}.wis_filter_btn{width:100%;padding:5px 10px;border-radius:3px}.wis_filter_btn:not(:hover):not(.selected){background-color:inherit;color:inherit}.wis_icon_btn{cursor:pointer;transition:all .1s ease;width:100%;height:100%;display:flex;flex-direction:column;align-items:center;border:none;border-radius:3px;padding:5px 2px;background-color:inherit;color:inherit}.wis_icon_btn:hover{background-color:#7878781a}.wis_icon_btn_preview{transition:all .1s ease}.wis_selection_bar{z-index:var(--z-frame);box-shadow:0 -6px 10px -8px #00000040;animation-name:slideUpSelectionBar;animation-duration:.2s;transform-origin:bottom center}@keyframes slideUpSelectionBar{0%{transform:scaleY(0);opacity:0}to{transform:scaleY(1);opacity:1}}\n"], dependencies: [{ kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: i3.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: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i4.TooltipDirective, selector: "[particleTooltip]", inputs: ["particleTooltip", "tooltipPosition", "tooltipDisabled"] }, { kind: "component", type: i5.DialogComponent, selector: "particle-dialog", inputs: ["object", "title", "titleClass", "showTitle", "allowClose", "bodyClass", "height", "width", "borderRadius", "text"], outputs: ["closed", "opened"] }, { kind: "component", type: i6.EndpointStateComponent, selector: "particle-endpoint-state", inputs: ["loading", "loadingIcon", "empty", "emptyIcon", "error", "errorIcon", "loadingOverlay", "loadingOverlayIcon", "text"] }, { kind: "pipe", type: i2.AsyncPipe, name: "async" }] });
347
+ }
348
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.2", ngImport: i0, type: IconSelectComponent, decorators: [{
349
+ type: Component,
350
+ args: [{ selector: 'particle-icon-select', providers: [
351
+ {
352
+ provide: NG_VALUE_ACCESSOR,
353
+ useExisting: forwardRef(() => IconSelectComponent),
354
+ multi: true
355
+ }
356
+ ], template: "<!-- choose button -->\r\n<button [ngClass]=\"buttonColorClass ? buttonColorClass : 'content_color'\"\r\n [ngStyle]=\"{\r\n 'width': buttonSizing,\r\n 'min-width': buttonSizing,\r\n 'height': buttonSizing,\r\n 'min-height': buttonSizing\r\n }\"\r\n (click)=\"openDialog()\"\r\n [particleTooltip]=\"(_internalValue | async)?.prefix + ' ' + (_internalValue | async)?.name\"\r\n [tooltipDisabled]=\"(_internalValue | async) === undefined\"\r\n [disabled]=\"disabled\"\r\n class=\"access wis_button bg_overlay brdr brad_3\"\r\n [attr.aria-label]=\"text.selectAnIcon\">\r\n <ng-container *ngIf=\"!showDialog else placeholderIcon\">\r\n <div *ngIf=\"_internalValue | async as selectedIcon else noSelection\">\r\n <i class=\"{{selectedIcon.prefix}} {{selectedIcon.name}} wis_icon\"></i>\r\n </div>\r\n <ng-template #noSelection>\r\n <div><i class=\"fas fa-icons opacity_20\"></i></div>\r\n </ng-template>\r\n </ng-container>\r\n <ng-template #placeholderIcon>\r\n <div><i class=\"fas fa-spinner fa-spin\"></i></div>\r\n </ng-template>\r\n</button>\r\n\r\n<!-- TODO: at some point, maybe implement infinite scroll to icons -->\r\n\r\n<!-- picker dialog -->\r\n<particle-dialog [title]=\"text.selectAnIcon\"\r\n [object]=\"showDialog\"\r\n [width]=\"'850px'\"\r\n [height]=\"'500px'\"\r\n (closed)=\"closeDialog()\">\r\n <div class=\"row height100\">\r\n\r\n <!-- FILTERS -->\r\n <div class=\"col min_w250 bg_overlay brdr border_right mobile_hide\">\r\n <div class=\"row_block width100\">\r\n <ng-container *ngIf=\"_filter | async as filter\">\r\n <!-- all icons -->\r\n <div class=\"mar_5 pad_5\">\r\n <button (click)=\"handleFilterSelect({ style: 'all', type: 'all' })\"\r\n [ngClass]=\"{ 'selected': filter.type === 'all' && filter.style === 'all' }\"\r\n class=\"access list_btn row space_between wis_filter_btn bg_overlay_rev brdr\"\r\n [attr.aria-label]=\"text.seeAllIcons\">\r\n <div class=\"v_center\">\r\n <div class=\"circle_16px bg_overlay_rev brdr mar_right10\">\r\n <div *ngIf=\"filter.type === 'all' && filter.style === 'all'\" class=\"circle_8px ok_button_color\"></div>\r\n </div>\r\n <div class=\"text md\">{{text.seeAllIcons}}</div>\r\n </div>\r\n <div class=\"go_icon\"><i class=\"fas fa-chevron-right fa-fw fa-sm opacity_60\"></i></div>\r\n </button>\r\n </div>\r\n <div class=\"bg_overlay brdr hr mar_10\"></div>\r\n <!-- fontawesome icons -->\r\n <div class=\"mar_5\">\r\n <div class=\"text md bolder\" style=\"padding:10px 10px 5px 15px;\">{{text.fontAwesomeIcons}}</div>\r\n <div class=\"mar_5\">\r\n <button (click)=\"handleFilterSelect({ style: 'all', type: 'fontawesome' })\"\r\n [ngClass]=\"{ 'selected': filter.type === 'fontawesome' && filter.style === 'all' }\"\r\n class=\"access list_btn row space_between wis_filter_btn bg_overlay_rev brdr\"\r\n [attr.aria-label]=\"text.filterBy + ' ' + text.fontAwesomeIcons\">\r\n <div class=\"v_center\">\r\n <div class=\"circle_16px bg_overlay_rev brdr mar_right10\">\r\n <div *ngIf=\"filter.type === 'fontawesome' && filter.style === 'all'\" class=\"circle_8px ok_button_color\"></div>\r\n </div>\r\n <div class=\"text md\">{{text.all}}</div>\r\n </div>\r\n <div class=\"go_icon\"><i class=\"fas fa-chevron-right fa-fw fa-sm opacity_60\"></i></div>\r\n </button>\r\n </div>\r\n <div class=\"mar_5\">\r\n <button (click)=\"handleFilterSelect({ style: 'solid', type: 'fontawesome' })\"\r\n [ngClass]=\"{ 'selected': filter.type === 'fontawesome' && filter.style === 'solid' }\"\r\n class=\"access list_btn row space_between wis_filter_btn bg_overlay_rev brdr\"\r\n [attr.aria-label]=\"text.filterBy + ' ' + text.solid + ' ' + text.fontAwesomeIcons\">\r\n <div class=\"v_center\">\r\n <div class=\"circle_16px bg_overlay_rev brdr mar_right10\">\r\n <div *ngIf=\"filter.type === 'fontawesome' && filter.style === 'solid'\" class=\"circle_8px ok_button_color\"></div>\r\n </div>\r\n <div class=\"text md\">{{text.solid}}</div>\r\n </div>\r\n <div class=\"go_icon\"><i class=\"fas fa-chevron-right fa-fw fa-sm opacity_60\"></i></div>\r\n </button>\r\n </div>\r\n <div class=\"mar_5\">\r\n <button (click)=\"handleFilterSelect({ style: 'regular', type: 'fontawesome' })\"\r\n [ngClass]=\"{ 'selected': filter.type === 'fontawesome' && filter.style === 'regular' }\"\r\n class=\"access list_btn row space_between wis_filter_btn bg_overlay_rev brdr\"\r\n [attr.aria-label]=\"text.filterBy + ' ' + text.regular + ' ' + text.fontAwesomeIcons\">\r\n <div class=\"v_center\">\r\n <div class=\"circle_16px bg_overlay_rev brdr mar_right10\">\r\n <div *ngIf=\"filter.type === 'fontawesome' && filter.style === 'regular'\" class=\"circle_8px ok_button_color\"></div>\r\n </div>\r\n <div class=\"text md\">{{text.regular}}</div>\r\n </div>\r\n <div class=\"go_icon\"><i class=\"fas fa-chevron-right fa-fw fa-sm opacity_60\"></i></div>\r\n </button>\r\n </div>\r\n <div class=\"mar_5\">\r\n <button (click)=\"handleFilterSelect({ style: 'brands', type: 'fontawesome' })\"\r\n [ngClass]=\"{ 'selected': filter.type === 'fontawesome' && filter.style === 'brands' }\"\r\n class=\"access list_btn row space_between wis_filter_btn bg_overlay_rev brdr\"\r\n [attr.aria-label]=\"text.filterBy + ' ' + text.brands + ' ' + text.fontAwesomeIcons\">\r\n <div class=\"v_center\">\r\n <div class=\"circle_16px bg_overlay_rev brdr mar_right10\">\r\n <div *ngIf=\"filter.type === 'fontawesome' && filter.style === 'brands'\" class=\"circle_8px ok_button_color\"></div>\r\n </div>\r\n <div class=\"text md\">{{text.brands}}</div>\r\n </div>\r\n <div class=\"go_icon\"><i class=\"fas fa-chevron-right fa-fw fa-sm opacity_60\"></i></div>\r\n </button>\r\n </div>\r\n </div>\r\n <div class=\"bg_overlay brdr hr mar_10\"></div>\r\n <!-- custom icons -->\r\n <div class=\"mar_5\">\r\n <div class=\"text md bolder\" style=\"padding:10px 10px 5px 15px;\">{{text.customIcons}}</div>\r\n <div class=\"mar_5\">\r\n <button (click)=\"handleFilterSelect({ style: 'all', type: 'particle' })\"\r\n [ngClass]=\"{ 'selected': filter.type === 'particle' && filter.style === 'all' }\"\r\n class=\"access list_btn row space_between wis_filter_btn bg_overlay_rev brdr\"\r\n [attr.aria-label]=\"text.filterBy + ' ' + text.customIcons\">\r\n <div class=\"v_center\">\r\n <div class=\"circle_16px bg_overlay_rev brdr mar_right10\">\r\n <div *ngIf=\"filter.type === 'particle' && filter.style === 'all'\" class=\"circle_8px ok_button_color\"></div>\r\n </div>\r\n <div class=\"text md\">All</div>\r\n </div>\r\n <div class=\"go_icon\"><i class=\"fas fa-chevron-right fa-fw fa-sm opacity_60\"></i></div>\r\n </button>\r\n </div>\r\n <div class=\"mar_5\">\r\n <button (click)=\"handleFilterSelect({ style: 'solid', type: 'particle' })\"\r\n [ngClass]=\"{ 'selected': filter.type === 'particle' && filter.style === 'solid' }\"\r\n class=\"access list_btn row space_between wis_filter_btn bg_overlay_rev brdr\"\r\n [attr.aria-label]=\"text.filterBy + ' ' + text.solid + ' ' + text.customIcons\">\r\n <div class=\"v_center\">\r\n <div class=\"circle_16px bg_overlay_rev brdr mar_right10\">\r\n <div *ngIf=\"filter.type === 'particle' && filter.style === 'solid'\" class=\"circle_8px ok_button_color\"></div>\r\n </div>\r\n <div class=\"text md\">Solid</div>\r\n </div>\r\n <div class=\"go_icon\"><i class=\"fas fa-chevron-right fa-fw fa-sm opacity_60\"></i></div>\r\n </button>\r\n </div>\r\n <div class=\"mar_5\">\r\n <button (click)=\"handleFilterSelect({ style: 'regular', type: 'particle' })\"\r\n [ngClass]=\"{ 'selected': filter.type === 'particle' && filter.style === 'regular' }\"\r\n class=\"access list_btn row space_between wis_filter_btn bg_overlay_rev brdr\"\r\n [attr.aria-label]=\"text.filterBy + ' ' + text.regular + ' ' + text.customIcons\">\r\n <div class=\"v_center\">\r\n <div class=\"circle_16px bg_overlay_rev brdr mar_right10\">\r\n <div *ngIf=\"filter.type === 'particle' && filter.style === 'regular'\" class=\"circle_8px ok_button_color\"></div>\r\n </div>\r\n <div class=\"text md\">Regular</div>\r\n </div>\r\n <div class=\"go_icon\"><i class=\"fas fa-chevron-right fa-fw fa-sm opacity_60\"></i></div>\r\n </button>\r\n </div>\r\n <div class=\"mar_5\">\r\n <button (click)=\"handleFilterSelect({ style: 'light', type: 'particle' })\"\r\n [ngClass]=\"{ 'selected': filter.type === 'particle' && filter.style === 'light' }\"\r\n class=\"access list_btn row space_between wis_filter_btn bg_overlay_rev brdr\"\r\n [attr.aria-label]=\"text.filterBy + ' ' + text.light + ' ' + text.customIcons\">\r\n <div class=\"v_center\">\r\n <div class=\"circle_16px bg_overlay_rev brdr mar_right10\">\r\n <div *ngIf=\"filter.type === 'particle' && filter.style === 'light'\" class=\"circle_8px ok_button_color\"></div>\r\n </div>\r\n <div class=\"text md\">{{text.light}}</div>\r\n </div>\r\n <div class=\"go_icon\"><i class=\"fas fa-chevron-right fa-fw fa-sm opacity_60\"></i></div>\r\n </button>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </div>\r\n\r\n <!-- ICONS -->\r\n <div class=\"col size_2 column\">\r\n <div class=\"col content_color_dark_1 pad_x5\">\r\n <!-- paginator -->\r\n <div *ngIf=\"totalPages$ | async as totalPages\"\r\n class=\"col v_center mar_10\">\r\n <button *ngIf=\"canPaginatePrevious$ | async else disabledPreviousButton\"\r\n (click)=\"paginatePrevious()\"\r\n class=\"access btn square_24px bg_overlay brdr ok_button_color\"\r\n [attr.aria-label]=\"text.previousPage\">\r\n <span class=\"icon slide_left\"><i class=\"fas fa-arrow-left\"></i></span>\r\n </button>\r\n <ng-template #disabledPreviousButton>\r\n <button disabled class=\"access btn square_24px bg_overlay brdr ok_button_color\"\r\n [attr.aria-label]=\"text.previousPage\">\r\n <span class=\"icon slide_left\"><i class=\"fas fa-arrow-left\"></i></span>\r\n </button>\r\n </ng-template>\r\n <div\r\n class=\"text sm bolder center\"\r\n style=\"min-width:65px;\">\r\n {{(_activePage | async)! + 1}} / {{totalPages}}\r\n </div>\r\n <button *ngIf=\"canPaginateNext$ | async else disabledNextButton\"\r\n (click)=\"paginateNext()\"\r\n class=\"access btn square_24px bg_overlay brdr ok_button_color\"\r\n [attr.aria-label]=\"text.nextPage\">\r\n <span class=\"icon slide_right\"><i class=\"fas fa-arrow-right\"></i></span>\r\n </button>\r\n <ng-template #disabledNextButton>\r\n <button disabled class=\"access btn square_24px bg_overlay brdr ok_button_color\"\r\n [attr.aria-label]=\"text.nextPage\">\r\n <span class=\"icon slide_right\"><i class=\"fas fa-arrow-right\"></i></span>\r\n </button>\r\n </ng-template>\r\n </div>\r\n <!-- search -->\r\n <div class=\"col size_1 wis_search mar_10\">\r\n <input #iconSearchInput\r\n [ngModel]=\"_searchText | async\"\r\n (input)=\"_searchText.next(iconSearchInput.value)\"\r\n (keyup.enter)=\"_searchInputEnterKeyup.next($any(null))\"\r\n class=\"access input md bg_overlay brdr content_color\"\r\n [attr.aria-label]=\"text.searchIcons\" [placeholder]=\"text.searchIcons + '...'\" />\r\n <button *ngIf=\"(canSearch$ | async) && (_searchClick | async)\"\r\n (click)=\"clearSearch()\" aria-label=\"Clear search\"\r\n class=\"access btn circle_18px overlay wis_clear_btn\">\r\n <span class=\"icon grow\"><i class=\"fas fa-times fa-sm\"></i></span>\r\n </button>\r\n <button *ngIf=\"canSearch$ | async else disabledSearchButton\"\r\n (click)=\"_searchClick.next(iconSearchInput.value); _activePage.next(0)\"\r\n class=\"access btn square_28px bg_overlay brdr ok_button_color brad_3 wis_search_btn\"\r\n [attr.aria-label]=\"text.submitSearch\" type=\"submit\">\r\n <span class=\"icon grow\"><i class=\"fas fa-search fa-sm\"></i></span>\r\n </button>\r\n <ng-template #disabledSearchButton>\r\n <button disabled\r\n class=\"access btn square_28px bg_overlay brdr ok_button_color brad_3 wis_search_btn\"\r\n [attr.aria-label]=\"text.submitSearch\" type=\"submit\">\r\n <span class=\"icon grow\"><i class=\"fas fa-search fa-sm\"></i></span>\r\n </button>\r\n </ng-template>\r\n </div>\r\n </div>\r\n <!-- icons -->\r\n <div #iconScrollContainer class=\"col size_1 top_left scroll_y pad_5\" style=\"scroll-behavior: smooth\">\r\n <ng-container *ngIf=\"paginatedIcons$ | async as icons else noResults\">\r\n <div class=\"row wrap top_left\" style=\"align-items:stretch;\">\r\n <ng-container *ngFor=\"let icon of paginatedIcons$ | async\">\r\n <div class=\"col size_1 min_w75 mar_5\">\r\n <button class=\"access wis_icon_btn\" (click)=\"handleIconSelect(icon)\" [attr.aria-label]=\"text.select + ' ' + icon.name\">\r\n <div [ngClass]=\"((_internalValue | async)?.prefix === icon.prefix) && ((_internalValue | async)?.name === icon.name) ? 'ok_button_color' : 'content_color'\"\r\n class=\"wis_icon_btn_preview square_50px brad_3 bg_overlay brdr mar_bot5\">\r\n <i class=\"{{icon.prefix}} {{icon.name}}\"></i>\r\n </div>\r\n <div class=\"text sm center faded\">{{icon.name}}</div>\r\n </button>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n <ng-template #noResults>\r\n <div class=\"row column min_h300 center_center\">\r\n <particle-endpoint-state\r\n [empty]=\"true\"\r\n [emptyIcon]=\"'fas fa-search fa-3x mar_bot5'\"\r\n [text]=\"{emptyText: text.couldntFindAnything, emptySubtext: text.modifySearchCriteria}\">\r\n </particle-endpoint-state>\r\n <button class=\"access btnset clear mar_10\"\r\n [attr.aria-label]=\"text.close\"\r\n (click)=\"clearSearch()\">\r\n <div class=\"circle_20px ptl_brdr_color ptl_brdr_size ptl_input_bg_color\">\r\n <i class=\"fas fa-times\"></i>\r\n </div>\r\n </button>\r\n </div>\r\n </ng-template>\r\n </div>\r\n <div *ngIf=\"_internalValue | async as selectedIcon\"\r\n class=\"col space_between bg_overlay brdr border_top pad_x5 wis_selection_bar\">\r\n <div class=\"col v_center mar_10\">\r\n <div class=\"text md faded mar_right10 mobile_hide\">{{text.selection}}:</div>\r\n <div class=\"v_center\" *ngIf=\"showIconSelectionPreview\">\r\n <i class=\"{{selectedIcon.prefix}} {{selectedIcon.name}} fa-fw mar_right5\" style=\"font-size:16px;\"></i>\r\n <div class=\"text md bold\">{{selectedIcon.prefix}} {{selectedIcon.name}}</div>\r\n </div>\r\n </div>\r\n <div class=\"col v_center mar_10\">\r\n <button\r\n type=\"button\"\r\n class=\"access btnset spaced md hov_glow save_button_color ptl_brdr_radius\"\r\n [attr.aria-label]=\"text.confirm\"\r\n (click)=\"handleIconSelectConfirm()\"\r\n >\r\n <div>{{text.confirm}}</div>\r\n <div class=\"brdr border_left mar_left10 pad_left10\"><i class=\"fas fa-check\"></i></div>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</particle-dialog>\r\n", styles: [".wis_button{width:40px;min-width:40px;height:40px;min-height:40px;cursor:pointer;transition:all .1s ease}.wis_button:disabled{cursor:default;opacity:1!important}.wis_button:hover:not(:disabled){filter:brightness(1.05)}.wis_button svg{transition:transform .1s ease}.wis_button:hover:not(:disabled) .wis_icon{transform:scale(1.15)}@supports not (-ms-high-contrast:none){.wis_button svg{width:75%;height:75%}}.wis_search{position:relative}.wis_search input{padding-right:40px!important}.wis_search .wis_search_btn{position:absolute;right:0;top:0;z-index:var(--z-frame);border-top-left-radius:0;border-bottom-left-radius:0;height:100%;width:32px}.wis_search .wis_clear_btn{position:absolute;right:40px;top:7px;z-index:var(--z-frame)}.wis_filter_btn{width:100%;padding:5px 10px;border-radius:3px}.wis_filter_btn:not(:hover):not(.selected){background-color:inherit;color:inherit}.wis_icon_btn{cursor:pointer;transition:all .1s ease;width:100%;height:100%;display:flex;flex-direction:column;align-items:center;border:none;border-radius:3px;padding:5px 2px;background-color:inherit;color:inherit}.wis_icon_btn:hover{background-color:#7878781a}.wis_icon_btn_preview{transition:all .1s ease}.wis_selection_bar{z-index:var(--z-frame);box-shadow:0 -6px 10px -8px #00000040;animation-name:slideUpSelectionBar;animation-duration:.2s;transform-origin:bottom center}@keyframes slideUpSelectionBar{0%{transform:scaleY(0);opacity:0}to{transform:scaleY(1);opacity:1}}\n"] }]
357
+ }], ctorParameters: () => [{ type: i1.IconsService }, { type: i0.ChangeDetectorRef }], propDecorators: { value: [{
358
+ type: Input
359
+ }], disabled: [{
360
+ type: Input
361
+ }], buttonColorClass: [{
362
+ type: Input
363
+ }], buttonSizing: [{
364
+ type: Input
365
+ }], text: [{
366
+ type: Input
367
+ }], opened: [{
368
+ type: Output
369
+ }], selected: [{
370
+ type: Output
371
+ }], closed: [{
372
+ type: Output
373
+ }], iconScrollContainer: [{
374
+ type: ViewChild,
375
+ args: ['iconScrollContainer']
376
+ }] } });
377
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaWNvbi1zZWxlY3QuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9tb2R1bGVzL2ljb25zL2NvbXBvbmVudHMvaWNvbi1zZWxlY3QuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9tb2R1bGVzL2ljb25zL2NvbXBvbmVudHMvaWNvbi1zZWxlY3QuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUVMLFNBQVMsRUFFVCxZQUFZLEVBQ1osVUFBVSxFQUNWLEtBQUssRUFFTCxNQUFNLEVBQ04sU0FBUyxFQUNWLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBd0IsaUJBQWlCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN6RSxPQUFPLEVBQUUsZUFBZSxFQUFFLGFBQWEsRUFBYyxPQUFPLEVBQWdCLE1BQU0sTUFBTSxDQUFDO0FBQ3pGLE9BQU8sRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLGNBQWMsRUFBRSxNQUFNLGdCQUFnQixDQUFDOzs7Ozs7OztBQUkxRDs7R0FFRztBQWFILE1BQU0sT0FBTyxtQkFBbUI7SUFpUFY7SUFBK0I7SUEvT25EOzs7T0FHRztJQUNLLE1BQU0sQ0FBVSxTQUFTLEdBQUcsRUFBRSxDQUFDO0lBRXZDOzs7T0FHRztJQUNILElBQ0ksS0FBSyxDQUFDLEtBQWE7UUFDckIsSUFBSSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUM7UUFFcEIsSUFBSSxLQUFLLEVBQUcsQ0FBQztZQUNYLE1BQU0sQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUN4QyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1lBQzNDLElBQUksQ0FBQyx3QkFBd0IsR0FBRyxJQUFJLENB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Z0JBQzFCLFdBQVcsRUFBRSxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMsbUJBQW1CLENBQUM7Z0JBQ2xELEtBQUssRUFBRSxJQUFJO2FBQ1o7U0FDRixzSkM5QkgscXNrQkFnVEE7OzJGRGhSYSxtQkFBbUI7a0JBWi9CLFNBQVM7K0JBQ0Usc0JBQXNCLGFBR3JCO3dCQUNUOzRCQUNFLE9BQU8sRUFBRSxpQkFBaUI7NEJBQzFCLFdBQVcsRUFBRSxVQUFVLENBQUMsR0FBRyxFQUFFLG9CQUFvQixDQUFDOzRCQUNsRCxLQUFLLEVBQUUsSUFBSTt5QkFDWjtxQkFDRjtpSEFlRyxLQUFLO3NCQURSLEtBQUs7Z0JBZ0JGLFFBQVE7c0JBRFgsS0FBSztnQkFTTixnQkFBZ0I7c0JBRGYsS0FBSztnQkFPTixZQUFZO3NCQURYLEtBQUs7Z0JBSU4sSUFBSTtzQkFESCxLQUFLO2dCQTRCTixNQUFNO3NCQURMLE1BQU07Z0JBT1AsUUFBUTtzQkFEUCxNQUFNO2dCQU9QLE1BQU07c0JBREwsTUFBTTtnQkFPUCxtQkFBbUI7c0JBRGxCLFNBQVM7dUJBQUMscUJBQXFCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcclxuICBDaGFuZ2VEZXRlY3RvclJlZixcclxuICBDb21wb25lbnQsXHJcbiAgRWxlbWVudFJlZixcclxuICBFdmVudEVtaXR0ZXIsXHJcbiAgZm9yd2FyZFJlZixcclxuICBJbnB1dCxcclxuICBPbkRlc3Ryb3ksXHJcbiAgT3V0cHV0LFxyXG4gIFZpZXdDaGlsZFxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBDb250cm9sVmFsdWVBY2Nlc3NvciwgTkdfVkFMVUVfQUNDRVNTT1IgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgY29tYmluZUxhdGVzdCwgT2JzZXJ2YWJsZSwgU3ViamVjdCwgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IG1hcCwgdGFwLCB3aXRoTGF0ZXN0RnJvbSB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcclxuaW1wb3J0IHsgSWNvbnNTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvaWNvbnMuc2VydmljZSc7XHJcbmltcG9ydCB7SWNvblNlbGVjdFRleHR9IGZyb20gJy4uLy4uLy4uL3NoYXJlZC9tb2RlbHMvcGFydGljbGUtY29tcG9uZW50LXRleHQubW9kZWwnO1xyXG5cclxuLyoqXHJcbiAqIFBhcnRpY2xlIEljb24gU2VsZWN0IGNvbXBvbmVudCBwcm92aWRlcyBhIGJ1dHRvbiBhbmQgYW4gaWNvbiBwaWNrZXIgdGhhdCBpbmNsdWRlcyBhbGwgb2YgdGhlIFBhcnRpY2xlIEljb25zIGFzIHdlbGwgYXMgdGhlIEZBUyBpY29ucy5cclxuICovXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAncGFydGljbGUtaWNvbi1zZWxlY3QnLFxyXG4gIHRlbXBsYXRlVXJsOiAnaWNvbi1zZWxlY3QuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL2ljb24tc2VsZWN0LmNvbXBvbmVudC5jc3MnXSxcclxuICBwcm92aWRlcnM6IFtcclxuICAgIHtcclxuICAgICAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXHJcbiAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IEljb25TZWxlY3RDb21wb25lbnQpLFxyXG4gICAgICBtdWx0aTogdHJ1ZVxyXG4gICAgfVxyXG4gIF1cclxufSlcclxuZXhwb3J0IGNsYXNzIEljb25TZWxlY3RDb21wb25lbnQgaW1wbGVtZW50cyBDb250cm9sVmFsdWVBY2Nlc3NvciwgT25EZXN0cm95IHtcclxuXHJcbiAgLyoqXHJcbiAgICogVGhlIG51bWJlciBvZiBpdGVtcyB0byBkaXNwbGF5IHBlciBwYWdlXHJcbiAgICogQHByaXZhdGVcclxuICAgKi9cclxuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBQQUdFX1NJWkUgPSA0ODtcclxuXHJcbiAgLyoqXHJcbiAgICogU2V0IHRoZSB2YWx1ZSBvZiB0aGUgaWNvbiBzZWxlY3RcclxuICAgKiBAcGFyYW0gdmFsdWUgdGhlIHZhbHVlIHRvIHNldFxyXG4gICAqL1xyXG4gIEBJbnB1dCgpXHJcbiAgc2V0IHZhbHVlKHZhbHVlOiBzdHJpbmcpIHtcclxuICAgIHRoaXMuX3ZhbHVlID0gdmFsdWU7XHJcblxyXG4gICAgaWYgKHZhbHVlKSAge1xyXG4gICAgICBjb25zdCBbcHJlZml4LCBuYW1lXSA9IHZhbHVlLnNwbGl0KCcgJyk7XHJcbiAgICAgIHRoaXMuX2ludGVybmFsVmFsdWUubmV4dCh7IHByZWZpeCwgbmFtZSB9KTtcclxuICAgICAgdGhpcy5zaG93SWNvblNlbGVjdGlvblByZXZpZXcgPSB0cnVlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU2V0IGRpc2FibGVkXHJcbiAgICogQHBhcmFtIGRpc2FibGVkIHdoZXRoZXIgb3Igbm90IHRoZSBpY29uIHBpY2tlciBzaG91bGQgYmUgZGlzYWJsZWRcclxuICAgKi9cclxuICBASW5wdXQoKVxyXG4gIHNldCBkaXNhYmxlZChkaXNhYmxlZDogYm9vbGVhbikge1xyXG4gICAgdGhpcy5fZGlzYWJsZWQgPSBkaXNhYmxlZDtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENvbG9yIGNsYXNzIG9mIHRoZSBidXR0b25cclxuICAgKi9cclxuICBASW5wdXQoKVxyXG4gIGJ1dHRvbkNvbG9yQ2xhc3M6IHN0cmluZyA9IG51bGwgYXMgYW55O1xyXG5cclxuICAvKipcclxuICAgKiBUaGUgdmFsdWUgdG8gc2V0IHRvIHRoZSBidXR0b24ncyB3aWR0aCwgbWluLXdpZHRoLCBoZWlnaHQgYW5kIG1pbi1oZWlnaHRcclxuICAgKi9cclxuICBASW5wdXQoKVxyXG4gIGJ1dHRvblNpemluZyA9ICc0MHB4JztcclxuXHJcbiAgQElucHV0KClcclxuICB0ZXh0OiBJY29uU2VsZWN0VGV4dCA9IHtcclxuICAgIHNlbGVjdEFuSWNvbjogJ1NlbGVjdCBhbiBJY29uJyxcclxuICAgIHNlZUFsbEljb25zOiAnU2VlIEFsbCBJY29ucycsXHJcbiAgICBmb250QXdlc29tZUljb25zOiAnRm9udCBBd2Vzb21lIEljb25zJyxcclxuICAgIGFsbDogJ0FsbCcsXHJcbiAgICBzb2xpZDogJ1NvbGlkJyxcclxuICAgIHJlZ3VsYXI6ICdSZWd1bGFyJyxcclxuICAgIGJyYW5kczogJ0JyYW5kcycsXHJcbiAgICBsaWdodDogJ0xpZ2h0JyxcclxuICAgIGN1c3RvbUljb25zOiAnQ3VzdG9tIEljb25zJyxcclxuICAgIHByZXZpb3VzUGFnZTogJ1ByZXZpb3VzIFBhZ2UnLFxyXG4gICAgbmV4dFBhZ2U6ICdOZXh0IFBhZ2UnLFxyXG4gICAgc2VhcmNoSWNvbnM6ICdTZWFyY2ggSWNvbnMnLFxyXG4gICAgc3VibWl0U2VhcmNoOiAnU3VibWl0IFNlYXJjaCcsXHJcbiAgICBjbGVhclJlc3VsdHM6ICdDbGVhciBSZXN1bHRzJyxcclxuICAgIGNvdWxkbnRGaW5kQW55dGhpbmc6ICdXZSBjb3VsZG5cXCd0IGZpbmQgYW55dGhpbmcnLFxyXG4gICAgbW9kaWZ5U2VhcmNoQ3JpdGVyaWE6ICdQbGVhc2UgdHJ5IG1vZGlmeWluZyB5b3VyIHNlYXJjaCBjcml0ZXJpYScsXHJcbiAgICBzZWxlY3Rpb246ICdTZWxlY3Rpb24nLFxyXG4gICAgY29uZmlybTogJ0NvbmZpcm0nLFxyXG4gICAgc2VsZWN0OiAnU2VsZWN0JyxcclxuICAgIGNsb3NlOiAnQ2xvc2UnXHJcbiAgfSBhcyBJY29uU2VsZWN0VGV4dDtcclxuXHJcbiAgLyoqXHJcbiAgICogSWNvbiBzZWxlY3Qgb3BlbmVkIGV2ZW50IGVtaXR0ZXJcclxuICAgKi9cclxuICBAT3V0cHV0KClcclxuICBvcGVuZWQgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XHJcblxyXG4gIC8qKlxyXG4gICAqIEljb24gc2VsZWN0ZWQgZXZlbnQgZW1pdHRlclxyXG4gICAqL1xyXG4gIEBPdXRwdXQoKVxyXG4gIHNlbGVjdGVkOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuXHJcbiAgLyoqXHJcbiAgICogRGlhbG9nIGNsb3NlZCBldmVudCBlbWl0dGVyXHJcbiAgICovXHJcbiAgQE91dHB1dCgpXHJcbiAgY2xvc2VkID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcblxyXG4gIC8qKlxyXG4gICAqIFRoZSBzY3JvbGxhYmxlIGljb24gY29udGFpbmVyXHJcbiAgICovXHJcbiAgQFZpZXdDaGlsZCgnaWNvblNjcm9sbENvbnRhaW5lcicpXHJcbiAgaWNvblNjcm9sbENvbnRhaW5lcjogRWxlbWVudFJlZjxIVE1MRGl2RWxlbWVudD4gPSBudWxsIGFzIGFueTtcclxuXHJcbiAgLyoqXHJcbiAgICogQmVoYXZpb3JTdWJqZWN0IHRyYWNraW5nIHRoZSBpbnB1dCB2YWx1ZSBkZXN0cnVjdGVkIGludG8gaXRzIHByZWZpeCBhbmQgY2xhc3MgbmFtZVxyXG4gICAqL1xyXG4gIHJlYWRvbmx5IF9pbnRlcm5hbFZhbHVlID0gbmV3IEJlaGF2aW9yU3ViamVjdDx7IHByZWZpeDogc3RyaW5nLCBuYW1lOiBzdHJpbmcgfT4obnVsbCBhcyBhbnkpO1xyXG5cclxuICAvKipcclxuICAgKiBCZWhhdmlvclN1YmplY3QgdHJhY2tpbmcgdGhlIGN1cnJlbnQgZmlsdGVyIHZhbHVlIHNlbGVjdGlvbiBmb3IgaWNvbnNcclxuICAgKi9cclxuICByZWFkb25seSBfZmlsdGVyID0gbmV3IEJlaGF2aW9yU3ViamVjdDwge1xyXG4gICAgc3R5bGU6ICdhbGwnIHwgJ3NvbGlkJyB8ICdyZWd1bGFyJyB8ICdsaWdodCcgfCAnYnJhbmRzJyxcclxuICAgIHR5cGU6ICdhbGwnIHwgJ3BhcnRpY2xlJyB8ICdmb250YXdlc29tZSdcclxuICB9Pih7IHN0eWxlOiAnYWxsJywgdHlwZTogJ2FsbCcgfSk7XHJcblxyXG4gIC8qKlxyXG4gICAqIEJlaGF2aW9yU3ViamVjdCB0cmFja2luZyB0aGUgY3VycmVudCBpY29uIHNlYXJjaCB0ZXh0IHZhbHVlXHJcbiAgICovXHJcbiAgcmVhZG9ubHkgX3NlYXJjaFRleHQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0KCcnKTtcclxuXHJcbiAgLyoqXHJcbiAgICogQmVoYXZpb3JTdWJqZWN0IHRoYXQgZW1pdHMgd2hlbiBzZWFyY2ggYnV0dG9uIGhhcyBiZWVuIGNsaWNrZWRcclxuICAgKi9cclxuICByZWFkb25seSBfc2VhcmNoQ2xpY2sgPSBuZXcgQmVoYXZpb3JTdWJqZWN0KCcnKTtcclxuXHJcbiAgLyoqXHJcbiAgICogQmVoYXZpb3JTdWJqZWN0IHRyYWNraW5nIHRoZSBhY3RpdmUgcGFnaW5hdGlvbiBwYWdlXHJcbiAgICovXHJcbiAgcmVhZG9ubHkgX2FjdGl2ZVBhZ2UgPSBuZXcgQmVoYXZpb3JTdWJqZWN0KDApO1xyXG5cclxuICAvKipcclxuICAgKiBTdWJqZWN0IHRoYXQgZW1pdHMgb24gc2VhcmNoIGlucHV0IGVudGVyIGtleXVwXHJcbiAgICovXHJcbiAgcmVhZG9ubHkgX3NlYXJjaElucHV0RW50ZXJLZXl1cCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XHJcblxyXG4gIC8qKlxyXG4gICAqIEFuIGFycmF5IG9mIGFsbCBpY29ucyAoYXMgc3RyaW5ncykgdGhhdCBtZWV0IHRoZSBjdXJyZW50IGZpbHRlci9zZWFyY2ggY3JpdGVyaWEgYXMgYW4gT2JzZXJ2YWJsZVxyXG4gICAqIEBwcml2YXRlXHJcbiAgICovXHJcbiAgcHJpdmF0ZSByZWFkb25seSBpY29ucyQ6IE9ic2VydmFibGU8QXJyYXk8eyBwcmVmaXg6IHN0cmluZywgbmFtZTogc3RyaW5nIH0+PiA9IGNvbWJpbmVMYXRlc3QoW1xyXG4gICAgdGhpcy5fZmlsdGVyLFxyXG4gICAgdGhpcy5fc2VhcmNoQ2xpY2tcclxuICBdKS5waXBlKFxyXG4gICAgbWFwKChbZmlsdGVyLCBzZWFyY2hUZXh0XSkgPT4gdGhpcy5zZXJ2aWNlLmdldEljb25zKFxyXG4gICAgICBmaWx0ZXIudHlwZSxcclxuICAgICAgZmlsdGVyLnN0eWxlLFxyXG4gICAgICBzZWFyY2hUZXh0XHJcbiAgICApKVxyXG4gICk7XHJcblxyXG4gIC8qKlxyXG4gICAqIFRoZSBjb3VudCBvZiB0b3RhbCBwYWdpbmF0b3IgcGFnZXMgYXMgYW4gT2JzZXJ2YWJsZVxyXG4gICAqL1xyXG4gIHJlYWRvbmx5IHRvdGFsUGFnZXMkOiBPYnNlcnZhYmxlPG51bWJlcj4gPSB0aGlzLmljb25zJC5waXBlKFxyXG4gICAgbWFwKGljb25zID0+IGljb25zLmxlbmd0aFxyXG4gICAgICA/IE1hdGguY2VpbChpY29ucy5sZW5ndGggLyBJY29uU2VsZWN0Q29tcG9uZW50LlBBR0VfU0laRSlcclxuICAgICAgOiAwXHJcbiAgICApXHJcbiAgKTtcclxuXHJcbiAgLyoqXHJcbiAgICogT2JzZXJ2YWJsZSBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciBvciBub3QgdGhlIHVzZXIgY2FuIHBlcmZvcm0gYW4gaWNvbiB0ZXh0IHNlYXJjaFxyXG4gICAqL1xyXG4gIHJlYWRvbmx5IGNhblNlYXJjaCQ6IE9ic2VydmFibGU8Ym9vbGVhbj4gPSB0aGlzLl9zZWFyY2hUZXh0LnBpcGUoXHJcbiAgICBtYXAoc2VhcmNoVGV4dCA9PiAhIXNlYXJjaFRleHQudHJpbSgpLmxlbmd0aClcclxuICApO1xyXG5cclxuICAvKipcclxuICAgKiBPYnNlcnZhYmxlIGJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIG9yIG5vdCB0aGUgdXNlciBjYW4gcGFnaW5hdGUgdG8gdGhlIHByZXZpb3VzIHBhZ2VcclxuICAgKi9cclxuICByZWFkb25seSBjYW5QYWdpbmF0ZVByZXZpb3VzJDogT2JzZXJ2YWJsZTxib29sZWFuPiA9IHRoaXMuX2FjdGl2ZVBhZ2UucGlwZShcclxuICAgIG1hcChhY3RpdmVQYWdlID0+IGFjdGl2ZVBhZ2UgPiAwKVxyXG4gICk7XHJcblxyXG4gIC8qKlxyXG4gICAqIE9ic2VydmFibGUgYm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgb3Igbm90IHRoZSB1c2VyIGNhbiBwYWdpbmF0ZSB0byB0aGUgbmV4dCBwYWdlXHJcbiAgICovXHJcbiAgcmVhZG9ubHkgY2FuUGFnaW5hdGVOZXh0JDogT2JzZXJ2YWJsZTxib29sZWFuPiA9IHRoaXMudG90YWxQYWdlcyQucGlwZShcclxuICAgIHdpdGhMYXRlc3RGcm9tKHRoaXMuX2FjdGl2ZVBhZ2UpLFxyXG4gICAgbWFwKChbdG90YWxQYWdlcywgYWN0aXZlUGFnZV0pID0+IGFjdGl2ZVBhZ2UgPCAodG90YWxQYWdlcyAtIDEpKVxyXG4gICk7XHJcblxyXG4gIC8qKlxyXG4gICAqIFBhZ2luYXRlZCBpY29ucyBhcnJheSBhcyBhbiBPYnNlcnZhYmxlXHJcbiAgICovXHJcbiAgcmVhZG9ubHkgcGFnaW5hdGVkSWNvbnMkOiBPYnNlcnZhYmxlPEFycmF5PHsgcHJlZml4OiBzdHJpbmcsIG5hbWU6IHN0cmluZyB9Pj4gPSBjb21iaW5lTGF0ZXN0KFtcclxuICAgIHRoaXMuX2FjdGl2ZVBhZ2UsXHJcbiAgICB0aGlzLmljb25zJFxyXG4gIF0pLnBpcGUoXHJcbiAgICBtYXAoKFthY3RpdmVQYWdlLCBpY29uc10pID0+IHtcclxuICAgICAgbGV0IHBhZ2luYXRlZEljb25zOiBBcnJheTx7IHByZWZpeDogc3RyaW5nLCBuYW1lOiBzdHJpbmcgfT4gPSBudWxsIGFzIGFueTtcclxuXHJcbiAgICAgIGlmIChhY3RpdmVQYWdlID49IDAgJiYgaWNvbnMubGVuZ3RoKSB7XHJcbiAgICAgICAgcGFnaW5hdGVkSWNvbnMgPSBpY29ucy5zbGljZShcclxuICAgICAgICAgIEljb25TZWxlY3RDb21wb25lbnQuUEFHRV9TSVpFICogYWN0aXZlUGFnZSxcclxuICAgICAgICAgIEljb25TZWxlY3RDb21wb25lbnQuUEFHRV9TSVpFICogKGFjdGl2ZVBhZ2UgKyAxKVxyXG4gICAgICAgICk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHJldHVybiBwYWdpbmF0ZWRJY29ucztcclxuICAgIH0pLFxyXG4gICAgdGFwKCgpID0+IHtcclxuICAgICAgaWYgKHRoaXMuaWNvblNjcm9sbENvbnRhaW5lcikge1xyXG4gICAgICAgIHRoaXMuaWNvblNjcm9sbENvbnRhaW5lci5uYXRpdmVFbGVtZW50LnNjcm9sbFRvcCA9IDA7XHJcbiAgICAgIH1cclxuICAgIH0pXHJcbiAgKTtcclxuXHJcbiAgLyoqXHJcbiAgICogT2JqZWN0IHRoYXQgY29udHJvbHMgd2hldGhlciB0byBzaG93IHRoZSBkaWFsb2cgb3Igbm90XHJcbiAgICovXHJcbiAgc2hvd0RpYWxvZzogYW55O1xyXG5cclxuICAvKipcclxuICAgKiBXaGV0aGVyIG9yIG5vdCB0byBzaG93IHRoZSBpY29uIHNlbGVjdGlvbiBwcmV2aWV3XHJcbiAgICovXHJcbiAgc2hvd0ljb25TZWxlY3Rpb25QcmV2aWV3ID0gZmFsc2U7XHJcblxyXG4gIC8qKlxyXG4gICAqIFN1YnNjcmlwdGlvbiBvYmplY3QgdG8gc3RvcmUgc2VhcmNoIGlucHV0IGVudGVyIGtleXVwIHN1YnNjcmlwdGlvblxyXG4gICAqIEBwcml2YXRlXHJcbiAgICovXHJcbiAgcHJpdmF0ZSByZWFkb25seSBzdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbjtcclxuXHJcbiAgLyoqXHJcbiAgICogVGhlIHZhbHVlIG9mIHRoZSBpY29uIHNlbGVjdFxyXG4gICAqIEBwcml2YXRlXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBfdmFsdWU6IHN0cmluZyA9IG51bGwgYXMgYW55O1xyXG5cclxuICAvKipcclxuICAgKiBXaGV0aGVyIG9yIG5vdCB0aGUgaWNvbiBwaWNrZXIgaXMgZGlzYWJsZWRcclxuICAgKiBAcHJpdmF0ZVxyXG4gICAqL1xyXG4gIHByaXZhdGUgX2Rpc2FibGVkOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIC8qKlxyXG4gICAqIEZ1bmN0aW9uIHRvIGNhbGwgb24gY2hhbmdlXHJcbiAgICovXHJcbiAgb25DaGFuZ2U6ICh2YWx1ZTogYW55KSA9PiB2b2lkID0gKCkgPT4ge307XHJcblxyXG4gIC8qKlxyXG4gICAqIEZ1bmN0aW9uIHRvIGNhbGwgb24gdG91Y2hcclxuICAgKi9cclxuICBvblRvdWNoZWQ6ICgpID0+IGFueSA9ICgpID0+IHt9O1xyXG5cclxuICAvKipcclxuICAgKiBEZXBlbmRlbmN5IGluamVjdGlvbiBzaXRlXHJcbiAgICogQHBhcmFtIHNlcnZpY2UgdGhlIEljb25zU2VydmljZVxyXG4gICAqIEBwYXJhbSBjaGFuZ2VEZXRlY3RvclJlZiB0aGUgQW5ndWxhciBDaGFuZ2VEZXRlY3RvclJlZlxyXG4gICAqL1xyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgc2VydmljZTogSWNvbnNTZXJ2aWNlLCBwcml2YXRlIGNoYW5nZURldGVjdG9yUmVmOiBDaGFuZ2VEZXRlY3RvclJlZikge1xyXG4gICAgdGhpcy5zdWJzY3JpcHRpb24gPSB0aGlzLl9zZWFyY2hJbnB1dEVudGVyS2V5dXAucGlwZShcclxuICAgICAgd2l0aExhdGVzdEZyb20odGhpcy5jYW5TZWFyY2gkKVxyXG4gICAgKS5zdWJzY3JpYmUoKFtfX18sIGNhblNlYXJjaF0pID0+IHtcclxuICAgICAgaWYgKGNhblNlYXJjaCkge1xyXG4gICAgICAgIHRoaXMuX3NlYXJjaENsaWNrLm5leHQodGhpcy5fc2VhcmNoVGV4dC5nZXRWYWx1ZSgpKTtcclxuICAgICAgICB0aGlzLl9hY3RpdmVQYWdlLm5leHQoMCk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogR2V0IGRpc2FibGVkXHJcbiAgICovXHJcbiAgZ2V0IGRpc2FibGVkKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2Rpc2FibGVkO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRGVzdHJveSBjb21wb25lbnQsIHVuc3Vic2NyaWJlIGZyb20gc2VhcmNoIGlucHV0IGVudGVyIGtleXVwIHN1YnNjcmlwdGlvblxyXG4gICAqL1xyXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xyXG4gICAgdGhpcy5zdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFdyaXRlIHRoZSBpbnB1dCB2YWx1ZVxyXG4gICAqIEBwYXJhbSB2YWx1ZSB0aGUgdmFsdWUgdG8gd3JpdGVcclxuICAgKi9cclxuICB3cml0ZVZhbHVlKHZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcclxuICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3JSZWYubWFya0ZvckNoZWNrKCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSZWdpc3RlciBvbkNoYW5nZSBmdW5jdGlvblxyXG4gICAqIEBwYXJhbSBmbiB0aGUgZnVuY3Rpb24gdG8gcmVnaXN0ZXJcclxuICAgKi9cclxuICByZWdpc3Rlck9uQ2hhbmdlKGZuOiBhbnkpOiB2b2lkIHtcclxuICAgIHRoaXMub25DaGFuZ2UgPSBmbjtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJlZ2lzdGVyIG9uVG91Y2hlZCBmdW5jdGlvblxyXG4gICAqIEBwYXJhbSBmbiB0aGUgZnVuY3Rpb24gdG8gcmVnaXN0ZXJcclxuICAgKi9cclxuICByZWdpc3Rlck9uVG91Y2hlZChmbjogYW55KTogdm9pZCB7XHJcbiAgICB0aGlzLm9uVG91Y2hlZCA9IGZuO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU2V0IGRpc2FibGVkIHN0YXRlXHJcbiAgICogQHBhcmFtIGlzRGlzYWJsZWQgd2hldGhlciBvciBub3QgdGhlIGljb24gcGlja2VyIHNob3VsZCBiZSBkaXNhYmxlZFxyXG4gICAqL1xyXG4gIHNldERpc2FibGVkU3RhdGUoaXNEaXNhYmxlZDogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgdGhpcy5kaXNhYmxlZCA9IGlzRGlzYWJsZWQ7XHJcbiAgICB0aGlzLmNoYW5nZURldGVjdG9yUmVmLm1hcmtGb3JDaGVjaygpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogT3BlbiB0aGUgaWNvbiBzZWxlY3QgZGlhbG9nXHJcbiAgICovXHJcbiAgb3BlbkRpYWxvZygpOiB2b2lkIHtcclxuICAgIGlmICghdGhpcy5kaXNhYmxlZCkge1xyXG4gICAgICB0aGlzLnJlc2V0KCk7XHJcbiAgICAgIHRoaXMuc2hvd0RpYWxvZyA9IHt9O1xyXG4gICAgICB0aGlzLm9wZW5lZC5lbWl0KCk7XHJcblxyXG4gICAgICBpZiAodGhpcy52YWx1ZSkge1xyXG4gICAgICAgIHRoaXMuc2hvd0ljb25TZWxlY3Rpb25QcmV2aWV3ID0gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ2xvc2UgdGhlIGljb24gc2VsZWN0IGRpYWxvZ1xyXG4gICAqL1xyXG4gIGNsb3NlRGlhbG9nKCk6IHZvaWQge1xyXG4gICAgbGV0IGludGVybmFsVmFsdWUgPSBudWxsO1xyXG4gICAgaWYgKHRoaXMuX3ZhbHVlKSB7XHJcbiAgICAgIGNvbnN0IFtwcmVmaXgsIG5hbWVdID0gdGhpcy5fdmFsdWUuc3BsaXQoJyAnKTtcclxuICAgICAgaW50ZXJuYWxWYWx1ZSA9IHsgcHJlZml4LCBuYW1lIH07XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5faW50ZXJuYWxWYWx1ZS5uZXh0KGludGVybmFsVmFsdWUgYXMgYW55KTtcclxuICAgIHRoaXMuc2hvd0RpYWxvZyA9IG51bGw7XHJcbiAgICB0aGlzLmNsb3NlZC5lbWl0KCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBIYW5kbGUgZmlsdGVyIHNlbGVjdFxyXG4gICAqIEBwYXJhbSBmaWx0ZXIgdGhlIHNlbGVjdGVkIGZpbHRlclxyXG4gICAqL1xyXG4gIGhhbmRsZUZpbHRlclNlbGVjdChcclxuICAgIGZpbHRlcjogeyBzdHlsZTogJ2FsbCcgfCAnc29saWQnIHwgJ3JlZ3VsYXInIHwgJ2xpZ2h0JyB8ICdicmFuZHMnLFxyXG4gICAgdHlwZTogJ2FsbCcgfCAncGFydGljbGUnIHwgJ2ZvbnRhd2Vzb21lJyB9XHJcbiAgKTogdm9pZCB7XHJcbiAgICB0aGlzLl9maWx0ZXIubmV4dChmaWx0ZXIpO1xyXG4gICAgdGhpcy5fYWN0aXZlUGFnZS5uZXh0KDApO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVXBkYXRlIGludGVybmFsIHZhbHVlIG9uIGljb24gc2VsZWN0XHJcbiAgICogQHBhcmFtIGljb24gdGhlIHNlbGVjdGVkIGljb25cclxuICAgKi9cclxuICBoYW5kbGVJY29uU2VsZWN0KGljb246IHsgcHJlZml4OiBzdHJpbmcsIG5hbWU6IHN0cmluZyB9KTogdm9pZCB7XHJcbiAgICB0aGlzLl9pbnRlcm5hbFZhbHVlLm5leHQoaWNvbik7XHJcbiAgICB0aGlzLnNob3dJY29uU2VsZWN0aW9uUHJldmlldyA9IGZhbHNlO1xyXG4gICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLnNob3dJY29uU2VsZWN0aW9uUHJldmlldyA9IHRydWUpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogV3JpdGUgdmFsdWUgb24gY29uZmlybVxyXG4gICAqL1xyXG4gIGhhbmRsZUljb25TZWxlY3RDb25maXJtKCk6IHZvaWQge1xyXG4gICAgY29uc3QgaWNvbiA9IHRoaXMuX2ludGVybmFsVmFsdWUuZ2V0VmFsdWUoKTtcclxuICAgIHRoaXMudXBkYXRlTW9kZWwoYCR7aWNvbi5wcmVmaXh9ICR7aWNvbi5uYW1lfWApO1xyXG4gICAgdGhpcy5jbG9zZURpYWxvZygpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogR28gdG8gdGhlIG5leHQgcGFnaW5hdGlvbiBwYWdlXHJcbiAgICovXHJcbiAgcGFnaW5hdGVOZXh0KCk6IHZvaWQge1xyXG4gICAgdGhpcy5fYWN0aXZlUGFnZS5uZXh0KHRoaXMuX2FjdGl2ZVBhZ2UuZ2V0VmFsdWUoKSArIDEpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogR28gdG8gdGhlIHByZXZpb3VzIHBhZ2luYXRpb24gcGFnZVxyXG4gICAqL1xyXG4gIHBhZ2luYXRlUHJldmlvdXMoKTogdm9pZCB7XHJcbiAgICB0aGlzLl9hY3RpdmVQYWdlLm5leHQodGhpcy5fYWN0aXZlUGFnZS5nZXRWYWx1ZSgpIC0gMSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDbGVhciBzZWFyY2ggdGV4dCBhbmQgcmVzZXQgcGFnaW5hdG9yXHJcbiAgICovXHJcbiAgY2xlYXJTZWFyY2goKTogdm9pZCB7XHJcbiAgICB0aGlzLl9zZWFyY2hUZXh0Lm5leHQoJycpO1xyXG4gICAgdGhpcy5fc2VhcmNoQ2xpY2submV4dCgnJyk7XHJcbiAgICB0aGlzLl9hY3RpdmVQYWdlLm5leHQoMCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBVcGRhdGUgbW9kZWxcclxuICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgbW9kZWxcclxuICAgKiBAcHJpdmF0ZVxyXG4gICAqL1xyXG4gIHByaXZhdGUgdXBkYXRlTW9kZWwodmFsdWU6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgY29uc3QgdmFsdWVCZWZvcmVVcGRhdGUgPSB0aGlzLl92YWx1ZTtcclxuXHJcbiAgICBpZiAoIXRoaXMuZGlzYWJsZWQpIHtcclxuICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xyXG5cclxuICAgICAgaWYgKHZhbHVlQmVmb3JlVXBkYXRlICE9PSB0aGlzLl92YWx1ZSkge1xyXG4gICAgICAgIHRoaXMub25DaGFuZ2UodGhpcy5fdmFsdWUpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICB0aGlzLnNlbGVjdGVkLmVtaXQoeyB2YWx1ZTogdGhpcy5fdmFsdWUgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSZXNldCBmaWx0ZXJpbmcvcGFnaW5hdGlvbiBCZWhhdmlvclN1YmplY3QgdmFsdWVzXHJcbiAgICogQHByaXZhdGVcclxuICAgKi9cclxuICBwcml2YXRlIHJlc2V0KCk6IHZvaWQge1xyXG4gICAgdGhpcy5fZmlsdGVyLm5leHQoeyBzdHlsZTogJ2FsbCcsIHR5cGU6ICdhbGwnIH0pO1xyXG4gICAgdGhpcy5fc2VhcmNoVGV4dC5uZXh0KCcnKTtcclxuICAgIHRoaXMuX3NlYXJjaENsaWNrLm5leHQoJycpO1xyXG4gICAgdGhpcy5fYWN0aXZlUGFnZS5uZXh0KDApO1xyXG4gIH1cclxufVxyXG4iLCI8IS0tIGNob29zZSBidXR0b24gLS0+XHJcbjxidXR0b24gW25nQ2xhc3NdPVwiYnV0dG9uQ29sb3JDbGFzcyA/IGJ1dHRvbkNvbG9yQ2xhc3MgOiAnY29udGVudF9jb2xvcidcIlxyXG4gICAgICAgIFtuZ1N0eWxlXT1cIntcclxuICAgICAgICAgICAgICAgICAgICAgJ3dpZHRoJzogYnV0dG9uU2l6aW5nLFxyXG4gICAgICAgICAgICAgICAgICAgICAnbWluLXdpZHRoJzogYnV0dG9uU2l6aW5nLFxyXG4gICAgICAgICAgICAgICAgICAgICAnaGVpZ2h0JzogYnV0dG9uU2l6aW5nLFxyXG4gICAgICAgICAgICAgICAgICAgICAnbWluLWhlaWdodCc6IGJ1dHRvblNpemluZ1xyXG4gICAgICAgICAgICAgICAgICAgfVwiXHJcbiAgICAgICAgKGNsaWNrKT1cIm9wZW5EaWFsb2coKVwiXHJcbiAgICAgICAgW3BhcnRpY2xlVG9vbHRpcF09XCIoX2ludGVybmFsVmFsdWUgfCBhc3luYyk/LnByZWZpeCArICcgJyArIChfaW50ZXJuYWxWYWx1ZSB8IGFzeW5jKT8ubmFtZVwiXHJcbiAgICAgICAgW3Rvb2x0aXBEaXNhYmxlZF09XCIoX2ludGVybmFsVmFsdWUgfCBhc3luYykgPT09IHVuZGVmaW5lZFwiXHJcbiAgICAgICAgW2Rpc2FibGVkXT1cImRpc2FibGVkXCJcclxuICAgICAgICBjbGFzcz1cImFjY2VzcyB3aXNfYnV0dG9uIGJnX292ZXJsYXkgYnJkciBicmFkXzNcIlxyXG4gICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwidGV4dC5zZWxlY3RBbkljb25cIj5cclxuICA8bmctY29udGFpbmVyICpuZ0lmPVwiIXNob3dEaWFsb2cgZWxzZSBwbGFjZWhvbGRlckljb25cIj5cclxuICAgIDxkaXYgKm5nSWY9XCJfaW50ZXJuYWxWYWx1ZSB8IGFzeW5jIGFzIHNlbGVjdGVkSWNvbiBlbHNlIG5vU2VsZWN0aW9uXCI+XHJcbiAgICAgIDxpIGNsYXNzPVwie3tzZWxlY3RlZEljb24ucHJlZml4fX0ge3tzZWxlY3RlZEljb24ubmFtZX19IHdpc19pY29uXCI+PC9pPlxyXG4gICAgPC9kaXY+XHJcbiAgICA8bmctdGVtcGxhdGUgI25vU2VsZWN0aW9uPlxyXG4gICAgICA8ZGl2PjxpIGNsYXNzPVwiZmFzIGZhLWljb25zIG9wYWNpdHlfMjBcIj48L2k+PC9kaXY+XHJcbiAgICA8L25nLXRlbXBsYXRlPlxyXG4gIDwvbmctY29udGFpbmVyPlxyXG4gIDxuZy10ZW1wbGF0ZSAjcGxhY2Vob2xkZXJJY29uPlxyXG4gICAgPGRpdj48aSBjbGFzcz1cImZhcyBmYS1zcGlubmVyIGZhLXNwaW5cIj48L2k+PC9kaXY+XHJcbiAgPC9uZy10ZW1wbGF0ZT5cclxuPC9idXR0b24+XHJcblxyXG48IS0tIFRPRE86IGF0IHNvbWUgcG9pbnQsIG1heWJlIGltcGxlbWVudCBpbmZpbml0ZSBzY3JvbGwgdG8gaWNvbnMgLS0+XHJcblxyXG48IS0tIHBpY2tlciBkaWFsb2cgLS0+XHJcbjxwYXJ0aWNsZS1kaWFsb2cgW3RpdGxlXT1cInRleHQuc2VsZWN0QW5JY29uXCJcclxuICBbb2JqZWN0XT1cInNob3dEaWFsb2dcIlxyXG4gIFt3aWR0aF09XCInODUwcHgnXCJcclxuICBbaGVpZ2h0XT1cIic1MDBweCdcIlxyXG4gIChjbG9zZWQpPVwiY2xvc2VEaWFsb2coKVwiPlxyXG4gICAgPGRpdiBjbGFzcz1cInJvdyBoZWlnaHQxMDBcIj5cclxuXHJcbiAgICAgIDwhLS0gRklMVEVSUyAtLT5cclxuICAgICAgPGRpdiBjbGFzcz1cImNvbCBtaW5fdzI1MCBiZ19vdmVybGF5IGJyZHIgYm9yZGVyX3JpZ2h0IG1vYmlsZV9oaWRlXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInJvd19ibG9jayB3aWR0aDEwMFwiPlxyXG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIl9maWx0ZXIgfCBhc3luYyBhcyBmaWx0ZXJcIj5cclxuICAgICAgICAgICAgPCEtLSBhbGwgaWNvbnMgLS0+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYXJfNSBwYWRfNVwiPlxyXG4gICAgICAgICAgICAgIDxidXR0b24gKGNsaWNrKT1cImhhbmRsZUZpbHRlclNlbGVjdCh7IHN0eWxlOiAnYWxsJywgdHlwZTogJ2FsbCcgfSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieyAnc2VsZWN0ZWQnOiBmaWx0ZXIudHlwZSA9PT0gJ2FsbCcgJiYgZmlsdGVyLnN0eWxlID09PSAnYWxsJyB9XCJcclxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYWNjZXNzIGxpc3RfYnRuIHJvdyBzcGFjZV9iZXR3ZWVuIHdpc19maWx0ZXJfYnRuIGJnX292ZXJsYXlfcmV2IGJyZHJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJ0ZXh0LnNlZUFsbEljb25zXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidl9jZW50ZXJcIj5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNpcmNsZV8xNnB4IGJnX292ZXJsYXlfcmV2IGJyZHIgbWFyX3JpZ2h0MTBcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiZmlsdGVyLnR5cGUgPT09ICdhbGwnICYmIGZpbHRlci5zdHlsZSA9PT0gJ2FsbCdcIiBjbGFzcz1cImNpcmNsZV84cHggb2tfYnV0dG9uX2NvbG9yXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dCBtZFwiPnt7dGV4dC5zZWVBbGxJY29uc319PC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJnb19pY29uXCI+PGkgY2xhc3M9XCJmYXMgZmEtY2hldnJvbi1yaWdodCBmYS1mdyBmYS1zbSBvcGFjaXR5XzYwXCI+PC9pPjwvZGl2PlxyXG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJnX292ZXJsYXkgYnJkciBociBtYXJfMTBcIj48L2Rpdj5cclxuICAgICAgICAgICAgPCEtLSBmb250YXdlc29tZSBpY29ucyAtLT5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1hcl81XCI+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQgbWQgYm9sZGVyXCIgc3R5bGU9XCJwYWRkaW5nOjEwcHggMTBweCA1cHggMTVweDtcIj57e3RleHQuZm9udEF3ZXNvbWVJY29uc319PC9kaXY+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1hcl81XCI+XHJcbiAgICAgICAgICAgICAgICA8YnV0dG9uIChjbGljayk9XCJoYW5kbGVGaWx0ZXJTZWxlY3QoeyBzdHlsZTogJ2FsbCcsIHR5cGU6ICdmb250YXdlc29tZScgfSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7ICdzZWxlY3RlZCc6IGZpbHRlci50eXBlID09PSAnZm9udGF3ZXNvbWUnICYmIGZpbHRlci5zdHlsZSA9PT0gJ2FsbCcgfVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYWNjZXNzIGxpc3RfYnRuIHJvdyBzcGFjZV9iZXR3ZWVuIHdpc19maWx0ZXJfYnRuIGJnX292ZXJsYXlfcmV2IGJyZHJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cInRleHQuZmlsdGVyQnkgKyAnICcgKyB0ZXh0LmZvbnRBd2Vzb21lSWNvbnNcIj5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInZfY2VudGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNpcmNsZV8xNnB4IGJnX292ZXJsYXlfcmV2IGJyZHIgbWFyX3JpZ2h0MTBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJmaWx0ZXIudHlwZSA9PT0gJ2ZvbnRhd2Vzb21lJyAmJiBmaWx0ZXIuc3R5bGUgPT09ICdhbGwnXCIgY2xhc3M9XCJjaXJjbGVfOHB4IG9rX2J1dHRvbl9jb2xvclwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0IG1kXCI+e3t0ZXh0LmFsbH19PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZ29faWNvblwiPjxpIGNsYXNzPVwiZmFzIGZhLWNoZXZyb24tcmlnaHQgZmEtZncgZmEtc20gb3BhY2l0eV82MFwiPjwvaT48L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYXJfNVwiPlxyXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiAoY2xpY2spPVwiaGFuZGxlRmlsdGVyU2VsZWN0KHsgc3R5bGU6ICdzb2xpZCcsIHR5cGU6ICdmb250YXdlc29tZScgfSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7ICdzZWxlY3RlZCc6IGZpbHRlci50eXBlID09PSAnZm9udGF3ZXNvbWUnICYmICBmaWx0ZXIuc3R5bGUgPT09ICdzb2xpZCcgfVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYWNjZXNzIGxpc3RfYnRuIHJvdyBzcGFjZV9iZXR3ZWVuIHdpc19maWx0ZXJfYnRuIGJnX292ZXJsYXlfcmV2IGJyZHJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cInRleHQuZmlsdGVyQnkgKyAnICcgKyB0ZXh0LnNvbGlkICsgJyAnICsgdGV4dC5mb250QXdlc29tZUljb25zXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ2X2NlbnRlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjaXJjbGVfMTZweCBiZ19vdmVybGF5X3JldiBicmRyIG1hcl9yaWdodDEwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiZmlsdGVyLnR5cGUgPT09ICdmb250YXdlc29tZScgJiYgIGZpbHRlci5zdHlsZSA9PT0gJ3NvbGlkJ1wiIGNsYXNzPVwiY2lyY2xlXzhweCBva19idXR0b25fY29sb3JcIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dCBtZFwiPnt7dGV4dC5zb2xpZH19PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZ29faWNvblwiPjxpIGNsYXNzPVwiZmFzIGZhLWNoZXZyb24tcmlnaHQgZmEtZncgZmEtc20gb3BhY2l0eV82MFwiPjwvaT48L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYXJfNVwiPlxyXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiAoY2xpY2spPVwiaGFuZGxlRmlsdGVyU2VsZWN0KHsgc3R5bGU6ICdyZWd1bGFyJywgdHlwZTogJ2ZvbnRhd2Vzb21lJyB9KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsgJ3NlbGVjdGVkJzogZmlsdGVyLnR5cGUgPT09ICdmb250YXdlc29tZScgJiYgIGZpbHRlci5zdHlsZSA9PT0gJ3JlZ3VsYXInIH1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImFjY2VzcyBsaXN0X2J0biByb3cgc3BhY2VfYmV0d2VlbiB3aXNfZmlsdGVyX2J0biBiZ19vdmVybGF5X3JldiBicmRyXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJ0ZXh0LmZpbHRlckJ5ICsgJyAnICsgdGV4dC5yZWd1bGFyICsgJyAnICsgdGV4dC5mb250QXdlc29tZUljb25zXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ2X2NlbnRlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjaXJjbGVfMTZweCBiZ19vdmVybGF5X3JldiBicmRyIG1hcl9yaWdodDEwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiZmlsdGVyLnR5cGUgPT09ICdmb250YXdlc29tZScgJiYgIGZpbHRlci5zdHlsZSA9PT0gJ3JlZ3VsYXInXCIgY2xhc3M9XCJjaXJjbGVfOHB4IG9rX2J1dHRvbl9jb2xvclwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0IG1kXCI+e3t0ZXh0LnJlZ3VsYXJ9fTwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImdvX2ljb25cIj48aSBjbGFzcz1cImZhcyBmYS1jaGV2cm9uLXJpZ2h0IGZhLWZ3IGZhLXNtIG9wYWNpdHlfNjBcIj48L2k+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWFyXzVcIj5cclxuICAgICAgICAgICAgICAgIDxidXR0b24gKGNsaWNrKT1cImhhbmRsZUZpbHRlclNlbGVjdCh7IHN0eWxlOiAnYnJhbmRzJywgdHlwZTogJ2ZvbnRhd2Vzb21lJyB9KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsgJ3NlbGVjdGVkJzogZmlsdGVyLnR5cGUgPT09ICdmb250YXdlc29tZScgJiYgIGZpbHRlci5zdHlsZSA9PT0gJ2JyYW5kcycgfVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYWNjZXNzIGxpc3RfYnRuIHJvdyBzcGFjZV9iZXR3ZWVuIHdpc19maWx0ZXJfYnRuIGJnX292ZXJsYXlfcmV2IGJyZHJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cInRleHQuZmlsdGVyQnkgKyAnICcgKyB0ZXh0LmJyYW5kcyArICcgJyArIHRleHQuZm9udEF3ZXNvbWVJY29uc1wiPlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidl9jZW50ZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2lyY2xlXzE2cHggYmdfb3ZlcmxheV9yZXYgYnJkciBtYXJfcmlnaHQxMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cImZpbHRlci50eXBlID09PSAnZm9udGF3ZXNvbWUnICYmICBmaWx0ZXIuc3R5bGUgPT09ICdicmFuZHMnXCIgY2xhc3M9XCJjaXJjbGVfOHB4IG9rX2J1dHRvbl9jb2xvclwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0IG1kXCI+e3t0ZXh0LmJyYW5kc319PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZ29faWNvblwiPjxpIGNsYXNzPVwiZmFzIGZhLWNoZXZyb24tcmlnaHQgZmEtZncgZmEtc20gb3BhY2l0eV82MFwiPjwvaT48L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJnX292ZXJsYXkgYnJkciBociBtYXJfMTBcIj48L2Rpdj5cclxuICAgICAgICAgICAgPCEtLSBjdXN0b20gaWNvbnMgLS0+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYXJfNVwiPlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0IG1kIGJvbGRlclwiIHN0eWxlPVwicGFkZGluZzoxMHB4IDEwcHggNXB4IDE1cHg7XCI+e3t0ZXh0LmN1c3RvbUljb25zfX08L2Rpdj5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWFyXzVcIj5cclxuICAgICAgICAgICAgICAgIDxidXR0b24gKGNsaWNrKT1cImhhbmRsZUZpbHRlclNlbGVjdCh7IHN0eWxlOiAnYWxsJywgdHlwZTogJ3BhcnRpY2xlJyB9KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsgJ3NlbGVjdGVkJzogZmlsdGVyLnR5cGUgPT09ICdwYXJ0aWNsZScgJiYgZmlsdGVyLnN0eWxlID09PSAnYWxsJyB9XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJhY2Nlc3MgbGlzdF9idG4gcm93IHNwYWNlX2JldHdlZW4gd2lzX2ZpbHRlcl9idG4gYmdfb3ZlcmxheV9yZXYgYnJkclwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwidGV4dC5maWx0ZXJCeSArICcgJyArIHRleHQuY3VzdG9tSWNvbnNcIj5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInZfY2VudGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNpcmNsZV8xNnB4IGJnX292ZXJsYXlfcmV2IGJyZHIgbWFyX3JpZ2h0MTBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJmaWx0ZXIudHlwZSA9PT0gJ3BhcnRpY2xlJyAmJiBmaWx0ZXIuc3R5bGUgPT09ICdhbGwnXCIgY2xhc3M9XCJjaXJjbGVfOHB4IG9rX2J1dHRvbl9jb2xvclwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0IG1kXCI+QWxsPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZ29faWNvblwiPjxpIGNsYXNzPVwiZmFzIGZhLWNoZXZyb24tcmlnaHQgZmEtZncgZmEtc20gb3BhY2l0eV82MFwiPjwvaT48L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYXJfNVwiPlxyXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiAoY2xpY2spPVwiaGFuZGxlRmlsdGVyU2VsZWN0KHsgc3R5bGU6ICdzb2xpZCcsIHR5cGU6ICdwYXJ0aWNsZScgfSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7ICdzZWxlY3RlZCc6IGZpbHRlci50eXBlID09PSAncGFydGljbGUnICYmIGZpbHRlci5zdHlsZSA9PT0gJ3NvbGlkJyB9XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJhY2Nlc3MgbGlzdF9idG4gcm93IHNwYWNlX2JldHdlZW4gd2lzX2ZpbHRlcl9idG4gYmdfb3ZlcmxheV9yZXYgYnJkclwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwidGV4dC5maWx0ZXJCeSArICcgJyArIHRleHQuc29saWQgKyAnICcgKyB0ZXh0LmN1c3RvbUljb25zXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ2X2NlbnRlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjaXJjbGVfMTZweCBiZ19vdmVybGF5X3JldiBicmRyIG1hcl9yaWdodDEwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiZmlsdGVyLnR5cGUgPT09ICdwYXJ0aWNsZScgJiYgZmlsdGVyLnN0eWxlID09PSAnc29saWQnXCIgY2xhc3M9XCJjaXJjbGVfOHB4IG9rX2J1dHRvbl9jb2xvclwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0IG1kXCI+U29saWQ8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJnb19pY29uXCI+PGkgY2xhc3M9XCJmYXMgZmEtY2hldnJvbi1yaWdodCBmYS1mdyBmYS1zbSBvcGFjaXR5XzYwXCI+PC9pPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1hcl81XCI+XHJcbiAgICAgICAgICAgICAgICA8YnV0dG9uIChjbGljayk9XCJoYW5kbGVGaWx0ZXJTZWxlY3QoeyBzdHlsZTogJ3JlZ3VsYXInLCB0eXBlOiAncGFydGljbGUnIH0pXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieyAnc2VsZWN0ZWQnOiBmaWx0ZXIudHlwZSA9PT0gJ3BhcnRpY2xlJyAmJiBmaWx0ZXIuc3R5bGUgPT09ICdyZWd1bGFyJyB9XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJhY2Nlc3MgbGlzdF9idG4gcm93IHNwYWNlX2JldHdlZW4gd2lzX2ZpbHRlcl9idG4gYmdfb3ZlcmxheV9yZXYgYnJkclwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwidGV4dC5maWx0ZXJCeSArICcgJyArIHRleHQucmVndWxhciArICcgJyArIHRleHQuY3VzdG9tSWNvbnNcIj5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInZfY2VudGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNpcmNsZV8xNnB4IGJnX292ZXJsYXlfcmV2IGJyZHIgbWFyX3JpZ2h0MTBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJmaWx0ZXIudHlwZSA9PT0gJ3BhcnRpY2xlJyAmJiBmaWx0ZXIuc3R5bGUgPT09ICdyZWd1bGFyJ1wiIGNsYXNzPVwiY2lyY2xlXzhweCBva19idXR0b25fY29sb3JcIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dCBtZFwiPlJlZ3VsYXI8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJnb19pY29uXCI+PGkgY2xhc3M9XCJmYXMgZmEtY2hldnJvbi1yaWdodCBmYS1mdyBmYS1zbSBvcGFjaXR5XzYwXCI+PC9pPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1hcl81XCI+XHJcbiAgICAgICAgICAgICAgICA8YnV0dG9uIChjbGljayk9XCJoYW5kbGVGaWx0ZXJTZWxlY3QoeyBzdHlsZTogJ2xpZ2h0JywgdHlwZTogJ3BhcnRpY2xlJyB9KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsgJ3NlbGVjdGVkJzogZmlsdGVyLnR5cGUgPT09ICdwYXJ0aWNsZScgJiYgZmlsdGVyLnN0eWxlID09PSAnbGlnaHQnIH1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImFjY2VzcyBsaXN0X2J0biByb3cgc3BhY2VfYmV0d2VlbiB3aXNfZmlsdGVyX2J0biBiZ19vdmVybGF5X3JldiBicmRyXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJ0ZXh0LmZpbHRlckJ5ICsgJyAnICsgdGV4dC5saWdodCArICcgJyArIHRleHQuY3VzdG9tSWNvbnNcIj5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInZfY2VudGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNpcmNsZV8xNnB4IGJnX292ZXJsYXlfcmV2IGJyZHIgbWFyX3JpZ2h0MTBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJmaWx0ZXIudHlwZSA9PT0gJ3BhcnRpY2xlJyAmJiBmaWx0ZXIuc3R5bGUgPT09ICdsaWdodCdcIiBjbGFzcz1cImNpcmNsZV84cHggb2tfYnV0dG9uX2NvbG9yXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQgbWRcIj57e3RleHQubGlnaHR9fTwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImdvX2ljb25cIj48aSBjbGFzcz1cImZhcyBmYS1jaGV2cm9uLXJpZ2h0IGZhLWZ3IGZhLXNtIG9wYWNpdHlfNjBcIj48L2k+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcblxyXG4gICAgICA8IS0tIElDT05TIC0tPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiY29sIHNpemVfMiBjb2x1bW5cIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29sIGNvbnRlbnRfY29sb3JfZGFya18xIHBhZF94NVwiPlxyXG4gICAgICAgICAgPCEtLSBwYWdpbmF0b3IgLS0+XHJcbiAgICAgICAgICA8ZGl2ICpuZ0lmPVwidG90YWxQYWdlcyQgfCBhc3luYyBhcyB0b3RhbFBhZ2VzXCJcclxuICAgICAgICAgICAgICAgY2xhc3M9XCJjb2wgdl9jZW50ZXIgbWFyXzEwXCI+XHJcbiAgICAgICAgICAgIDxidXR0b24gKm5nSWY9XCJjYW5QYWdpbmF0ZVByZXZpb3VzJCB8IGFzeW5jIGVsc2UgZGlzYWJsZWRQcmV2aW91c0J1dHRvblwiXHJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInBhZ2luYXRlUHJldmlvdXMoKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJhY2Nlc3MgYnRuIHNxdWFyZV8yNHB4IGJnX292ZXJsYXkgYnJkciBva19idXR0b25fY29sb3JcIlxyXG4gICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwidGV4dC5wcmV2aW91c1BhZ2VcIj5cclxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImljb24gc2xpZGVfbGVmdFwiPjxpIGNsYXNzPVwiZmFzIGZhLWFycm93LWxlZnRcIj48L2k+PC9zcGFuPlxyXG4gICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNkaXNhYmxlZFByZXZpb3VzQnV0dG9uPlxyXG4gICAgICAgICAgICAgIDxidXR0b24gZGlzYWJsZWQgY2xhc3M9XCJhY2Nlc3MgYnRuIHNxdWFyZV8yNHB4IGJnX292ZXJsYXkgYnJkciBva19idXR0b25fY29sb3JcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJ0ZXh0LnByZXZpb3VzUGFnZVwiPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJpY29uIHNsaWRlX2xlZnRcIj48aSBjbGFzcz1cImZhcyBmYS1hcnJvdy1sZWZ0XCI+PC9pPjwvc3Bhbj5cclxuICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgPGRpdlxyXG4gICAgICAgICAgICAgICAgIGNsYXNzPVwidGV4dCBzbSBib2xkZXIgY2VudGVyXCJcclxuICAgICAgICAgICAgICAgICBzdHlsZT1cIm1pbi13aWR0aDo2NXB4O1wiPlxyXG4gICAgICAgICAgICAgIHt7KF9hY3RpdmVQYWdlIHwgYXN5bmMpISArIDF9fSAvIHt7dG90YWxQYWdlc319XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8YnV0dG9uICpuZ0lmPVwiY2FuUGFnaW5hdGVOZXh0JCB8IGFzeW5jIGVsc2UgZGlzYWJsZWROZXh0QnV0dG9uXCJcclxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwicGFnaW5hdGVOZXh0KClcIlxyXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYWNjZXNzIGJ0biBzcXVhcmVfMjRweCBiZ19vdmVybGF5IGJyZHIgb2tfYnV0dG9uX2NvbG9yXCJcclxuICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cInRleHQubmV4dFBhZ2VcIj5cclxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImljb24gc2xpZGVfcmlnaHRcIj48aSBjbGFzcz1cImZhcyBmYS1hcnJvdy1yaWdodFwiPjwvaT48L3NwYW4+XHJcbiAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8bmctdGVtcGxhdGUgI2Rpc2FibGVkTmV4dEJ1dHRvbj5cclxuICAgICAgICAgICAgICA8YnV0dG9uIGRpc2FibGVkIGNsYXNzPVwiYWNjZXNzIGJ0biBzcXVhcmVfMjRweCBiZ19vdmVybGF5IGJyZHIgb2tfYnV0dG9uX2NvbG9yXCJcclxuICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwidGV4dC5uZXh0UGFnZVwiPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJpY29uIHNsaWRlX3JpZ2h0XCI+PGkgY2xhc3M9XCJmYXMgZmEtYXJyb3ctcmlnaHRcIj48L2k+PC9zcGFuPlxyXG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8IS0tIHNlYXJjaCAtLT5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wgc2l6ZV8xIHdpc19zZWFyY2ggbWFyXzEwXCI+XHJcbiAgICAgICAgICAgIDxpbnB1dCAjaWNvblNlYXJjaElucHV0XHJcbiAgICAgICAgICAgICAgICAgICBbbmdNb2RlbF09XCJfc2VhcmNoVGV4dCB8IGFzeW5jXCJcclxuICAgICAgICAgICAgICAgICAgIChpbnB1dCk9XCJfc2VhcmNoVGV4dC5uZXh0KGljb25TZWFyY2hJbnB1dC52YWx1ZSlcIlxyXG4gICAgICAgICAgICAgICAgICAgKGtleXVwLmVudGVyKT1cIl9zZWFyY2hJbnB1dEVudGVyS2V5dXAubmV4dCgkYW55KG51bGwpKVwiXHJcbiAgICAgICAgICAgICAgICAgICBjbGFzcz1cImFjY2VzcyBpbnB1dCBtZCBiZ19vdmVybGF5IGJyZHIgY29udGVudF9jb2xvclwiXHJcbiAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cInRleHQuc2VhcmNoSWNvbnNcIiBbcGxhY2Vob2xkZXJdPVwidGV4dC5zZWFyY2hJY29ucyArICcuLi4nXCIgLz5cclxuICAgICAgICAgICAgPGJ1dHRvbiAqbmdJZj1cIihjYW5TZWFyY2gkIHwgYXN5bmMpICYmIChfc2VhcmNoQ2xpY2sgfCBhc3luYylcIlxyXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJjbGVhclNlYXJjaCgpXCIgYXJpYS1sYWJlbD1cIkNsZWFyIHNlYXJjaFwiXHJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJhY2Nlc3MgYnRuIGNpcmNsZV8xOHB4IG92ZXJsYXkgd2lzX2NsZWFyX2J0blwiPlxyXG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaWNvbiBncm93XCI+PGkgY2xhc3M9XCJmYXMgZmEtdGltZXMgZmEtc21cIj48L2k+PC9zcGFuPlxyXG4gICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgPGJ1dHRvbiAqbmdJZj1cImNhblNlYXJjaCQgfCBhc3luYyBlbHNlIGRpc2FibGVkU2VhcmNoQnV0dG9uXCJcclxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiX3NlYXJjaENsaWNrLm5leHQoaWNvblNlYXJjaElucHV0LnZhbHVlKTsgX2FjdGl2ZVBhZ2UubmV4dCgwKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJhY2Nlc3MgYnRuIHNxdWFyZV8yOHB4IGJnX292ZXJsYXkgYnJkciBva19idXR0b25fY29sb3IgYnJhZF8zIHdpc19zZWFyY2hfYnRuXCJcclxuICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cInRleHQuc3VibWl0U2VhcmNoXCIgdHlwZT1cInN1Ym1pdFwiPlxyXG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaWNvbiBncm93XCI+PGkgY2xhc3M9XCJmYXMgZmEtc2VhcmNoIGZhLXNtXCI+PC9pPjwvc3Bhbj5cclxuICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjZGlzYWJsZWRTZWFyY2hCdXR0b24+XHJcbiAgICAgICAgICAgICAgPGJ1dHRvbiBkaXNhYmxlZFxyXG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJhY2Nlc3MgYnRuIHNxdWFyZV8yOHB4IGJnX292ZXJsYXkgYnJkciBva19idXR0b25fY29sb3IgYnJhZF8zIHdpc19zZWFyY2hfYnRuXCJcclxuICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwidGV4dC5zdWJtaXRTZWFyY2hcIiB0eXBlPVwic3VibWl0XCI+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImljb24gZ3Jvd1wiPjxpIGNsYXNzPVwiZmFzIGZhLXNlYXJjaCBmYS1zbVwiPjwvaT48L3NwYW4+XHJcbiAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8IS0tIGljb25zIC0tPlxyXG4gICAgICAgIDxkaXYgI2ljb25TY3JvbGxDb250YWluZXIgY2xhc3M9XCJjb2wgc2l6ZV8xIHRvcF9sZWZ0IHNjcm9sbF95IHBhZF81XCIgc3R5bGU9XCJzY3JvbGwtYmVoYXZpb3I6IHNtb290aFwiPlxyXG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInBhZ2luYXRlZEljb25zJCB8IGFzeW5jIGFzIGljb25zIGVsc2Ugbm9SZXN1bHRzXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3cgd3JhcCB0b3BfbGVmdFwiIHN0eWxlPVwiYWxpZ24taXRlbXM6c3RyZXRjaDtcIj5cclxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBpY29uIG9mIHBhZ2luYXRlZEljb25zJCB8IGFzeW5jXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sIHNpemVfMSBtaW5fdzc1IG1hcl81XCI+XHJcbiAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJhY2Nlc3Mgd2lzX2ljb25fYnRuXCIgKGNsaWNrKT1cImhhbmRsZUljb25TZWxlY3QoaWNvbilcIiBbYXR0ci5hcmlhLWxhYmVsXT1cInRleHQuc2VsZWN0ICsgJyAnICsgaWNvbi5uYW1lXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBbbmdDbGFzc109XCIoKF9pbnRlcm5hbFZhbHVlIHwgYXN5bmMpPy5wcmVmaXggPT09IGljb24ucHJlZml4KSAmJiAoKF9pbnRlcm5hbFZhbHVlIHwgYXN5bmMpPy5uYW1lID09PSBpY29uLm5hbWUpID8gJ29rX2J1dHRvbl9jb2xvcicgOiAnY29udGVudF9jb2xvcidcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ3aXNfaWNvbl9idG5fcHJldmlldyBzcXVhcmVfNTBweCBicmFkXzMgYmdfb3ZlcmxheSBicmRyIG1hcl9ib3Q1XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cInt7aWNvbi5wcmVmaXh9fSB7e2ljb24ubmFtZX19XCI+PC9pPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0IHNtIGNlbnRlciBmYWRlZFwiPnt7aWNvbi5uYW1lfX08L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjbm9SZXN1bHRzPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93IGNvbHVtbiBtaW5faDMwMCBjZW50ZXJfY2VudGVyXCI+XHJcbiAgICAgICAgICAgICAgPHBhcnRpY2xlLWVuZHBvaW50LXN0YXRlXHJcbiAgICAgICAgICAgICAgICBbZW1wdHldPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICBbZW1wdHlJY29uXT1cIidmYXMgZmEtc2VhcmNoIGZhLTN4IG1hcl9ib3Q1J1wiXHJcbiAgICAgICAgICAgICAgICBbdGV4dF09XCJ7ZW1wdHlUZXh0OiB0ZXh0LmNvdWxkbnRGaW5kQW55dGhpbmcsIGVtcHR5U3VidGV4dDogdGV4dC5tb2RpZnlTZWFyY2hDcml0ZXJpYX1cIj5cclxuICAgICAgICAgICAgICA8L3BhcnRpY2xlLWVuZHBvaW50LXN0YXRlPlxyXG4gICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJhY2Nlc3MgYnRuc2V0IGNsZWFyIG1hcl8xMFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cInRleHQuY2xvc2VcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImNsZWFyU2VhcmNoKClcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjaXJjbGVfMjBweCBwdGxfYnJkcl9jb2xvciBwdGxfYnJkcl9zaXplIHB0bF9pbnB1dF9iZ19jb2xvclwiPlxyXG4gICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhcyBmYS10aW1lc1wiPjwvaT5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiAqbmdJZj1cIl9pbnRlcm5hbFZhbHVlIHwgYXN5bmMgYXMgc2VsZWN0ZWRJY29uXCJcclxuICAgICAgICAgICAgIGNsYXNzPVwiY29sIHNwYWNlX2JldHdlZW4gYmdfb3ZlcmxheSBicmRyIGJvcmRlcl90b3AgcGFkX3g1IHdpc19zZWxlY3Rpb25fYmFyXCI+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sIHZfY2VudGVyIG1hcl8xMFwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dCBtZCBmYWRlZCBtYXJfcmlnaHQxMCBtb2JpbGVfaGlkZVwiPnt7dGV4dC5zZWxlY3Rpb259fTo8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInZfY2VudGVyXCIgKm5nSWY9XCJzaG93SWNvblNlbGVjdGlvblByZXZpZXdcIj5cclxuICAgICAgICAgICAgICA8aSBjbGFzcz1cInt7c2VsZWN0ZWRJY29uLnByZWZpeH19IHt7c2VsZWN0ZWRJY29uLm5hbWV9fSBmYS1mdyBtYXJfcmlnaHQ1XCIgc3R5bGU9XCJmb250LXNpemU6MTZweDtcIj48L2k+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQgbWQgYm9sZFwiPnt7c2VsZWN0ZWRJY29uLnByZWZpeH19IHt7c2VsZWN0ZWRJY29uLm5hbWV9fTwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNvbCB2X2NlbnRlciBtYXJfMTBcIj5cclxuICAgICAgICAgICAgPGJ1dHRvblxyXG4gICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxyXG4gICAgICAgICAgICAgIGNsYXNzPVwiYWNjZXNzIGJ0bnNldCBzcGFjZWQgbWQgaG92X2dsb3cgc2F2ZV9idXR0b25fY29sb3IgcHRsX2JyZHJfcmFkaXVzXCJcclxuICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cInRleHQuY29uZmlybVwiXHJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cImhhbmRsZUljb25TZWxlY3RDb25maXJtKClcIlxyXG4gICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgPGRpdj57e3RleHQuY29uZmlybX19PC9kaXY+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJyZHIgYm9yZGVyX2xlZnQgbWFyX2xlZnQxMCBwYWRfbGVmdDEwXCI+PGkgY2xhc3M9XCJmYXMgZmEtY2hlY2tcIj48L2k+PC9kaXY+XHJcbiAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbjwvcGFydGljbGUtZGlhbG9nPlxyXG4iXX0=