@smarterplan/ngx-smarterplan-core 1.3.4 → 1.4.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 (239) hide show
  1. package/esm2022/lib/components/csv-export/csv-export.component.mjs +58 -0
  2. package/esm2022/lib/components/loader/loader.component.mjs +23 -0
  3. package/esm2022/lib/components/menu-bar/avatar/avatar.component.mjs +86 -0
  4. package/esm2022/lib/components/menu-bar/menu-bar.component.mjs +261 -0
  5. package/esm2022/lib/components/menu-bar/navigation-bar/navigation-bar.component.mjs +408 -0
  6. package/esm2022/lib/components/modal-switch-visit/modal-switch-visit.component.mjs +48 -0
  7. package/esm2022/lib/components/search-bar/search-bar.component.mjs +68 -0
  8. package/esm2022/lib/components/support-modal/support-modal.component.mjs +74 -0
  9. package/esm2022/lib/config.mjs +5 -0
  10. package/{esm2020 → esm2022}/lib/helpers.service.mjs +469 -469
  11. package/esm2022/lib/matterport-extensions/hsl-loader/HlsLoader.mjs +66 -0
  12. package/esm2022/lib/matterport-extensions/nest-thermostat/CanvasImage.mjs +48 -0
  13. package/esm2022/lib/matterport-extensions/nest-thermostat/CanvasRenderer.mjs +60 -0
  14. package/esm2022/lib/matterport-extensions/nest-thermostat/NestThermostat.mjs +156 -0
  15. package/esm2022/lib/matterport-extensions/nest-thermostat/PlaneRenderer.mjs +84 -0
  16. package/esm2022/lib/matterport-extensions/scene-component/SceneComponent.mjs +139 -0
  17. package/esm2022/lib/matterport-extensions/security-camera/SecurityCamera.mjs +248 -0
  18. package/esm2022/lib/matterport-extensions/tv-player/TvPlayer.mjs +97 -0
  19. package/esm2022/lib/matterport-extensions/video-renderer/VideoRenderer.mjs +63 -0
  20. package/esm2022/lib/matterport-extensions/view-frustum-mesh/ViewFrustumMesh.mjs +219 -0
  21. package/esm2022/lib/mattertagData.mjs +171 -0
  22. package/esm2022/lib/ngx-smarterplan-core.module.mjs +118 -0
  23. package/esm2022/lib/ngx-smarterplan-core.service.mjs +15 -0
  24. package/esm2022/lib/pipes/duration-to-string.pipe.mjs +68 -0
  25. package/{esm2020 → esm2022}/lib/pipes/format-date-number-to-digits.pipe.mjs +32 -30
  26. package/esm2022/lib/pipes/hashtag-from-id.pipe.mjs +28 -0
  27. package/esm2022/lib/pipes/safe-url.pipe.mjs +22 -0
  28. package/esm2022/lib/pipes/time-date-to-local-string.pipe.mjs +106 -0
  29. package/esm2022/lib/pipes/username-from-id.pipe.mjs +31 -0
  30. package/esm2022/lib/services/amplify-cache.service.mjs +73 -0
  31. package/esm2022/lib/services/base-tab.service.mjs +24 -0
  32. package/esm2022/lib/services/baseVisibility.service.mjs +18 -0
  33. package/esm2022/lib/services/content.service.mjs +141 -0
  34. package/esm2022/lib/services/filter.service.mjs +608 -0
  35. package/esm2022/lib/services/intervention.service.mjs +239 -0
  36. package/esm2022/lib/services/locale.service.mjs +47 -0
  37. package/esm2022/lib/services/matterport-import.service.mjs +354 -0
  38. package/esm2022/lib/services/matterport.service.mjs +1701 -0
  39. package/esm2022/lib/services/models/affectation.service.mjs +62 -0
  40. package/esm2022/lib/services/models/base-object.service.mjs +73 -0
  41. package/esm2022/lib/services/models/capture.service.mjs +36 -0
  42. package/esm2022/lib/services/models/comment.service.mjs +101 -0
  43. package/esm2022/lib/services/models/domain.service.mjs +80 -0
  44. package/esm2022/lib/services/models/equipment.service.mjs +698 -0
  45. package/esm2022/lib/services/models/event.service.mjs +132 -0
  46. package/esm2022/lib/services/models/feature.service.mjs +390 -0
  47. package/esm2022/lib/services/models/hashtag.service.mjs +41 -0
  48. package/esm2022/lib/services/models/layer.service.mjs +35 -0
  49. package/esm2022/lib/services/models/measurement.service.mjs +220 -0
  50. package/esm2022/lib/services/models/mission.service.mjs +211 -0
  51. package/esm2022/lib/services/models/navigation.service.mjs +96 -0
  52. package/esm2022/lib/services/models/node.service.mjs +33 -0
  53. package/esm2022/lib/services/models/object3D.service.mjs +374 -0
  54. package/esm2022/lib/services/models/operation.service.mjs +61 -0
  55. package/esm2022/lib/services/models/organisation.service.mjs +75 -0
  56. package/esm2022/lib/services/models/plan.service.mjs +823 -0
  57. package/esm2022/lib/services/models/poi.service.mjs +110 -0
  58. package/esm2022/lib/services/models/profile.service.mjs +60 -0
  59. package/esm2022/lib/services/models/property.service.mjs +46 -0
  60. package/esm2022/lib/services/models/space.service.mjs +215 -0
  61. package/esm2022/lib/services/models/template.service.mjs +43 -0
  62. package/esm2022/lib/services/models/ticket.service.mjs +545 -0
  63. package/esm2022/lib/services/models/visit.service.mjs +138 -0
  64. package/esm2022/lib/services/models/zone.service.mjs +228 -0
  65. package/esm2022/lib/services/navigator.service.mjs +233 -0
  66. package/{esm2020 → esm2022}/lib/services/s3.service.mjs +136 -136
  67. package/esm2022/lib/services/search.service.mjs +127 -0
  68. package/esm2022/lib/services/support.service.mjs +45 -0
  69. package/esm2022/lib/services/tag.service.mjs +112 -0
  70. package/esm2022/lib/services/user.service.mjs +513 -0
  71. package/esm2022/lib/services/validators.service.mjs +51 -0
  72. package/esm2022/lib/services/viewer.service.mjs +397 -0
  73. package/{esm2020 → esm2022}/lib/services/zone-drawer.service.mjs +75 -75
  74. package/esm2022/lib/services/zoneChange.service.mjs +33 -0
  75. package/esm2022/lib/types.service.mjs +324 -0
  76. package/{esm2020 → esm2022}/lib/validators/email.directive.mjs +6 -6
  77. package/{esm2020 → esm2022}/lib/validators/no-empty.directive.mjs +11 -11
  78. package/{esm2020 → esm2022}/lib/validators/number.directive.mjs +11 -11
  79. package/{esm2020 → esm2022}/lib/validators/text.directive.mjs +11 -11
  80. package/{esm2020 → esm2022}/public-api.mjs +71 -71
  81. package/{esm2020 → esm2022}/smarterplan-ngx-smarterplan-core.mjs +4 -4
  82. package/{fesm2020 → fesm2022}/smarterplan-ngx-smarterplan-core.mjs +12633 -12311
  83. package/fesm2022/smarterplan-ngx-smarterplan-core.mjs.map +1 -0
  84. package/index.d.ts +5 -5
  85. package/lib/components/csv-export/csv-export.component.d.ts +18 -18
  86. package/lib/components/loader/loader.component.d.ts +10 -10
  87. package/lib/components/menu-bar/avatar/avatar.component.d.ts +21 -21
  88. package/lib/components/menu-bar/menu-bar.component.d.ts +70 -70
  89. package/lib/components/menu-bar/navigation-bar/navigation-bar.component.d.ts +76 -76
  90. package/lib/components/modal-switch-visit/modal-switch-visit.component.d.ts +22 -22
  91. package/lib/components/search-bar/search-bar.component.d.ts +16 -16
  92. package/lib/components/support-modal/support-modal.component.d.ts +26 -26
  93. package/lib/config.d.ts +22 -22
  94. package/lib/helpers.service.d.ts +79 -79
  95. package/lib/matterport-extensions/hsl-loader/HlsLoader.d.ts +26 -26
  96. package/lib/matterport-extensions/nest-thermostat/CanvasImage.d.ts +31 -31
  97. package/lib/matterport-extensions/nest-thermostat/CanvasRenderer.d.ts +37 -37
  98. package/lib/matterport-extensions/nest-thermostat/NestThermostat.d.ts +42 -42
  99. package/lib/matterport-extensions/nest-thermostat/PlaneRenderer.d.ts +46 -46
  100. package/lib/matterport-extensions/scene-component/SceneComponent.d.ts +388 -388
  101. package/lib/matterport-extensions/security-camera/SecurityCamera.d.ts +47 -47
  102. package/lib/matterport-extensions/tv-player/TvPlayer.d.ts +26 -26
  103. package/lib/matterport-extensions/video-renderer/VideoRenderer.d.ts +26 -26
  104. package/lib/matterport-extensions/view-frustum-mesh/ViewFrustumMesh.d.ts +43 -43
  105. package/lib/mattertagData.d.ts +70 -70
  106. package/lib/ngx-smarterplan-core.module.d.ts +28 -28
  107. package/lib/ngx-smarterplan-core.service.d.ts +6 -6
  108. package/lib/pipes/duration-to-string.pipe.d.ts +12 -12
  109. package/lib/pipes/format-date-number-to-digits.pipe.d.ts +10 -10
  110. package/lib/pipes/hashtag-from-id.pipe.d.ts +10 -10
  111. package/lib/pipes/safe-url.pipe.d.ts +10 -10
  112. package/lib/pipes/time-date-to-local-string.pipe.d.ts +16 -16
  113. package/lib/pipes/username-from-id.pipe.d.ts +11 -11
  114. package/lib/services/amplify-cache.service.d.ts +37 -37
  115. package/lib/services/base-tab.service.d.ts +10 -10
  116. package/lib/services/baseVisibility.service.d.ts +9 -9
  117. package/lib/services/content.service.d.ts +28 -28
  118. package/lib/services/filter.service.d.ts +60 -60
  119. package/lib/services/intervention.service.d.ts +25 -25
  120. package/lib/services/locale.service.d.ts +23 -23
  121. package/lib/services/matterport-import.service.d.ts +53 -53
  122. package/lib/services/matterport.service.d.ts +336 -336
  123. package/lib/services/models/affectation.service.d.ts +14 -14
  124. package/lib/services/models/base-object.service.d.ts +20 -20
  125. package/lib/services/models/capture.service.d.ts +13 -13
  126. package/lib/services/models/comment.service.d.ts +26 -26
  127. package/lib/services/models/domain.service.d.ts +19 -19
  128. package/lib/services/models/equipment.service.d.ts +93 -93
  129. package/lib/services/models/event.service.d.ts +43 -43
  130. package/lib/services/models/feature.service.d.ts +75 -75
  131. package/lib/services/models/hashtag.service.d.ts +13 -13
  132. package/lib/services/models/layer.service.d.ts +11 -11
  133. package/lib/services/models/measurement.service.d.ts +51 -51
  134. package/lib/services/models/mission.service.d.ts +39 -39
  135. package/lib/services/models/navigation.service.d.ts +29 -29
  136. package/lib/services/models/node.service.d.ts +12 -12
  137. package/lib/services/models/object3D.service.d.ts +57 -57
  138. package/lib/services/models/operation.service.d.ts +15 -15
  139. package/lib/services/models/organisation.service.d.ts +19 -19
  140. package/lib/services/models/plan.service.d.ts +133 -133
  141. package/lib/services/models/poi.service.d.ts +25 -25
  142. package/lib/services/models/profile.service.d.ts +16 -16
  143. package/lib/services/models/property.service.d.ts +13 -13
  144. package/lib/services/models/space.service.d.ts +46 -46
  145. package/lib/services/models/template.service.d.ts +15 -15
  146. package/lib/services/models/ticket.service.d.ts +93 -93
  147. package/lib/services/models/visit.service.d.ts +24 -24
  148. package/lib/services/models/zone.service.d.ts +50 -50
  149. package/lib/services/navigator.service.d.ts +61 -61
  150. package/lib/services/s3.service.d.ts +14 -14
  151. package/lib/services/search.service.d.ts +20 -20
  152. package/lib/services/support.service.d.ts +17 -17
  153. package/lib/services/tag.service.d.ts +29 -29
  154. package/lib/services/user.service.d.ts +118 -118
  155. package/lib/services/validators.service.d.ts +18 -18
  156. package/lib/services/viewer.service.d.ts +111 -111
  157. package/lib/services/zone-drawer.service.d.ts +7 -7
  158. package/lib/services/zoneChange.service.d.ts +17 -17
  159. package/lib/types.service.d.ts +842 -842
  160. package/lib/validators/email.directive.d.ts +2 -2
  161. package/lib/validators/no-empty.directive.d.ts +2 -2
  162. package/lib/validators/number.directive.d.ts +2 -2
  163. package/lib/validators/text.directive.d.ts +2 -2
  164. package/package.json +8 -14
  165. package/public-api.d.ts +64 -64
  166. package/esm2020/lib/components/csv-export/csv-export.component.mjs +0 -59
  167. package/esm2020/lib/components/loader/loader.component.mjs +0 -23
  168. package/esm2020/lib/components/menu-bar/avatar/avatar.component.mjs +0 -79
  169. package/esm2020/lib/components/menu-bar/menu-bar.component.mjs +0 -238
  170. package/esm2020/lib/components/menu-bar/navigation-bar/navigation-bar.component.mjs +0 -389
  171. package/esm2020/lib/components/modal-switch-visit/modal-switch-visit.component.mjs +0 -40
  172. package/esm2020/lib/components/search-bar/search-bar.component.mjs +0 -63
  173. package/esm2020/lib/components/support-modal/support-modal.component.mjs +0 -66
  174. package/esm2020/lib/config.mjs +0 -4
  175. package/esm2020/lib/matterport-extensions/hsl-loader/HlsLoader.mjs +0 -69
  176. package/esm2020/lib/matterport-extensions/nest-thermostat/CanvasImage.mjs +0 -51
  177. package/esm2020/lib/matterport-extensions/nest-thermostat/CanvasRenderer.mjs +0 -61
  178. package/esm2020/lib/matterport-extensions/nest-thermostat/NestThermostat.mjs +0 -158
  179. package/esm2020/lib/matterport-extensions/nest-thermostat/PlaneRenderer.mjs +0 -85
  180. package/esm2020/lib/matterport-extensions/scene-component/SceneComponent.mjs +0 -128
  181. package/esm2020/lib/matterport-extensions/security-camera/SecurityCamera.mjs +0 -249
  182. package/esm2020/lib/matterport-extensions/tv-player/TvPlayer.mjs +0 -98
  183. package/esm2020/lib/matterport-extensions/video-renderer/VideoRenderer.mjs +0 -64
  184. package/esm2020/lib/matterport-extensions/view-frustum-mesh/ViewFrustumMesh.mjs +0 -221
  185. package/esm2020/lib/mattertagData.mjs +0 -165
  186. package/esm2020/lib/ngx-smarterplan-core.module.mjs +0 -117
  187. package/esm2020/lib/ngx-smarterplan-core.service.mjs +0 -14
  188. package/esm2020/lib/pipes/duration-to-string.pipe.mjs +0 -66
  189. package/esm2020/lib/pipes/hashtag-from-id.pipe.mjs +0 -26
  190. package/esm2020/lib/pipes/safe-url.pipe.mjs +0 -20
  191. package/esm2020/lib/pipes/time-date-to-local-string.pipe.mjs +0 -104
  192. package/esm2020/lib/pipes/username-from-id.pipe.mjs +0 -29
  193. package/esm2020/lib/services/amplify-cache.service.mjs +0 -72
  194. package/esm2020/lib/services/base-tab.service.mjs +0 -24
  195. package/esm2020/lib/services/baseVisibility.service.mjs +0 -18
  196. package/esm2020/lib/services/content.service.mjs +0 -135
  197. package/esm2020/lib/services/filter.service.mjs +0 -603
  198. package/esm2020/lib/services/intervention.service.mjs +0 -236
  199. package/esm2020/lib/services/locale.service.mjs +0 -45
  200. package/esm2020/lib/services/matterport-import.service.mjs +0 -340
  201. package/esm2020/lib/services/matterport.service.mjs +0 -1669
  202. package/esm2020/lib/services/models/affectation.service.mjs +0 -60
  203. package/esm2020/lib/services/models/base-object.service.mjs +0 -70
  204. package/esm2020/lib/services/models/capture.service.mjs +0 -34
  205. package/esm2020/lib/services/models/comment.service.mjs +0 -98
  206. package/esm2020/lib/services/models/domain.service.mjs +0 -78
  207. package/esm2020/lib/services/models/equipment.service.mjs +0 -683
  208. package/esm2020/lib/services/models/event.service.mjs +0 -128
  209. package/esm2020/lib/services/models/feature.service.mjs +0 -380
  210. package/esm2020/lib/services/models/hashtag.service.mjs +0 -38
  211. package/esm2020/lib/services/models/layer.service.mjs +0 -33
  212. package/esm2020/lib/services/models/measurement.service.mjs +0 -208
  213. package/esm2020/lib/services/models/mission.service.mjs +0 -206
  214. package/esm2020/lib/services/models/navigation.service.mjs +0 -92
  215. package/esm2020/lib/services/models/node.service.mjs +0 -31
  216. package/esm2020/lib/services/models/object3D.service.mjs +0 -364
  217. package/esm2020/lib/services/models/operation.service.mjs +0 -59
  218. package/esm2020/lib/services/models/organisation.service.mjs +0 -73
  219. package/esm2020/lib/services/models/plan.service.mjs +0 -799
  220. package/esm2020/lib/services/models/poi.service.mjs +0 -103
  221. package/esm2020/lib/services/models/profile.service.mjs +0 -58
  222. package/esm2020/lib/services/models/property.service.mjs +0 -44
  223. package/esm2020/lib/services/models/space.service.mjs +0 -204
  224. package/esm2020/lib/services/models/template.service.mjs +0 -41
  225. package/esm2020/lib/services/models/ticket.service.mjs +0 -526
  226. package/esm2020/lib/services/models/visit.service.mjs +0 -130
  227. package/esm2020/lib/services/models/zone.service.mjs +0 -225
  228. package/esm2020/lib/services/navigator.service.mjs +0 -212
  229. package/esm2020/lib/services/search.service.mjs +0 -124
  230. package/esm2020/lib/services/support.service.mjs +0 -42
  231. package/esm2020/lib/services/tag.service.mjs +0 -111
  232. package/esm2020/lib/services/user.service.mjs +0 -501
  233. package/esm2020/lib/services/validators.service.mjs +0 -50
  234. package/esm2020/lib/services/viewer.service.mjs +0 -390
  235. package/esm2020/lib/services/zoneChange.service.mjs +0 -30
  236. package/esm2020/lib/types.service.mjs +0 -311
  237. package/fesm2015/smarterplan-ngx-smarterplan-core.mjs +0 -13299
  238. package/fesm2015/smarterplan-ngx-smarterplan-core.mjs.map +0 -1
  239. package/fesm2020/smarterplan-ngx-smarterplan-core.mjs.map +0 -1
@@ -0,0 +1,58 @@
1
+ import { Component, Input } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ import * as i1 from "@ngx-translate/core";
4
+ class CsvExportComponent {
5
+ /** Header of the CSV, titles for each columns */
6
+ headers = [];
7
+ /** Array of each rows (array of array of string), if it's not set, then the function getRows() will be used */
8
+ rowsInput = undefined;
9
+ /** Function used to get rows if rowsInput is not set, call each time the user click on the button to generate the CSV file */
10
+ getRows = undefined;
11
+ /** Title of the file to download */
12
+ title = "file";
13
+ /** Label for the button to click */
14
+ buttonLabel = "Export";
15
+ /** Delimiter for the CSV */
16
+ delimeter = ";";
17
+ async onClickDownload() {
18
+ let rows = this.rowsInput;
19
+ if (!rows) {
20
+ rows = await Promise.resolve(this.getRows());
21
+ }
22
+ const data = `data:text/csv;charset=utf-8,${this.headers.join(this.delimeter)}\n${rows
23
+ .map((row) =>
24
+ /** Clean each rows/cells */
25
+ row
26
+ .map((value) => value
27
+ .replace(this.delimeter, " ")
28
+ .replace("\n", " ")
29
+ .replace("\r", " "))
30
+ .join(this.delimeter))
31
+ .join("\n")}`;
32
+ /** Create a link to download the file */
33
+ const link = document.createElement("a");
34
+ link.setAttribute("href", encodeURI(data));
35
+ link.setAttribute("download", `${this.title}.csv`);
36
+ document.body.append(link);
37
+ link.click();
38
+ link.remove();
39
+ }
40
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: CsvExportComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
41
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: CsvExportComponent, selector: "lib-csv-export", inputs: { headers: "headers", rowsInput: "rowsInput", getRows: "getRows", title: "title", buttonLabel: "buttonLabel" }, ngImport: i0, template: "<span [style.cursor]=\"'pointer'\" (click)=\"onClickDownload()\" class=\"download-csv d-flex\">\r\n <span class=\"iconify\" data-icon=\"mdi:file-download-outline\"></span>\r\n {{ buttonLabel | translate}}\r\n</span>\r\n", styles: [".download-csv{color:var(--smarterplan-primary)}\n"], dependencies: [{ kind: "pipe", type: i1.TranslatePipe, name: "translate" }] });
42
+ }
43
+ export { CsvExportComponent };
44
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: CsvExportComponent, decorators: [{
45
+ type: Component,
46
+ args: [{ selector: 'lib-csv-export', template: "<span [style.cursor]=\"'pointer'\" (click)=\"onClickDownload()\" class=\"download-csv d-flex\">\r\n <span class=\"iconify\" data-icon=\"mdi:file-download-outline\"></span>\r\n {{ buttonLabel | translate}}\r\n</span>\r\n", styles: [".download-csv{color:var(--smarterplan-primary)}\n"] }]
47
+ }], propDecorators: { headers: [{
48
+ type: Input
49
+ }], rowsInput: [{
50
+ type: Input
51
+ }], getRows: [{
52
+ type: Input
53
+ }], title: [{
54
+ type: Input
55
+ }], buttonLabel: [{
56
+ type: Input
57
+ }] } });
58
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3N2LWV4cG9ydC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtc21hcnRlcnBsYW4tY29yZS9zcmMvbGliL2NvbXBvbmVudHMvY3N2LWV4cG9ydC9jc3YtZXhwb3J0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1zbWFydGVycGxhbi1jb3JlL3NyYy9saWIvY29tcG9uZW50cy9jc3YtZXhwb3J0L2Nzdi1leHBvcnQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsTUFBTSxlQUFlLENBQUM7OztBQUVqRCxNQUthLGtCQUFrQjtJQUUzQixpREFBaUQ7SUFDeEMsT0FBTyxHQUFhLEVBQUUsQ0FBQztJQUVoQywrR0FBK0c7SUFDdEcsU0FBUyxHQUFlLFNBQVMsQ0FBQztJQUUzQyw4SEFBOEg7SUFDckgsT0FBTyxHQUFHLFNBQVMsQ0FBQztJQUU3QixvQ0FBb0M7SUFDM0IsS0FBSyxHQUFXLE1BQU0sQ0FBQztJQUVoQyxvQ0FBb0M7SUFDM0IsV0FBVyxHQUFXLFFBQVEsQ0FBQztJQUV4Qyw0QkFBNEI7SUFDNUIsU0FBUyxHQUFXLEdBQUcsQ0FBQztJQUV4QixLQUFLLENBQUMsZUFBZTtRQUNqQixJQUFJLElBQUksR0FBZSxJQUFJLENBQUMsU0FBUyxDQUFDO1FBQ3RDLElBQUksQ0FBQyxJQUFJLEVBQUU7WUFDUCxJQUFJLEdBQUcsTUFBTSxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO1NBQ2hEO1FBQ0QsTUFBTSxJQUFJLEdBQUcsK0JBQStCLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUN6RCxJQUFJLENBQUMsU0FBUyxDQUNqQixLQUFLLElBQUk7YUFDTCxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRTtRQUNULDRCQUE0QjtRQUM1QixHQUFHO2FBQ0UsR0FBRyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FDWCxLQUFLO2FBQ0EsT0FBTyxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsR0FBRyxDQUFDO2FBQzVCLE9BQU8sQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDO2FBQ2xCLE9BQU8sQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQzFCO2FBQ0EsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FDNUI7YUFDQSxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztRQUVsQix5Q0FBeUM7UUFDekMsTUFBTSxJQUFJLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUN6QyxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sRUFBRSxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUMzQyxJQUFJLENBQUMsWUFBWSxDQUFDLFVBQVUsRUFBRSxHQUFHLElBQUksQ0FBQyxLQUFLLE1BQU0sQ0FBQyxDQUFDO1FBQ25ELFFBQVEsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzNCLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNiLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztJQUNsQixDQUFDO3dHQWhEUSxrQkFBa0I7NEZBQWxCLGtCQUFrQiw4S0NQL0IsbU9BSUE7O1NER2Esa0JBQWtCOzRGQUFsQixrQkFBa0I7a0JBTDlCLFNBQVM7K0JBQ0UsZ0JBQWdCOzhCQU9mLE9BQU87c0JBQWYsS0FBSztnQkFHRyxTQUFTO3NCQUFqQixLQUFLO2dCQUdHLE9BQU87c0JBQWYsS0FBSztnQkFHRyxLQUFLO3NCQUFiLEtBQUs7Z0JBR0csV0FBVztzQkFBbkIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgSW5wdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnbGliLWNzdi1leHBvcnQnLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9jc3YtZXhwb3J0LmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi9jc3YtZXhwb3J0LmNvbXBvbmVudC5zY3NzJ11cclxufSlcclxuZXhwb3J0IGNsYXNzIENzdkV4cG9ydENvbXBvbmVudCB7XHJcbiAgICBcclxuICAgIC8qKiBIZWFkZXIgb2YgdGhlIENTViwgdGl0bGVzIGZvciBlYWNoIGNvbHVtbnMgKi9cclxuICAgIEBJbnB1dCgpIGhlYWRlcnM6IHN0cmluZ1tdID0gW107XHJcblxyXG4gICAgLyoqIEFycmF5IG9mIGVhY2ggcm93cyAoYXJyYXkgb2YgYXJyYXkgb2Ygc3RyaW5nKSwgaWYgaXQncyBub3Qgc2V0LCB0aGVuIHRoZSBmdW5jdGlvbiBnZXRSb3dzKCkgd2lsbCBiZSB1c2VkICovXHJcbiAgICBASW5wdXQoKSByb3dzSW5wdXQ6IHN0cmluZ1tdW10gPSB1bmRlZmluZWQ7XHJcblxyXG4gICAgLyoqIEZ1bmN0aW9uIHVzZWQgdG8gZ2V0IHJvd3MgaWYgcm93c0lucHV0IGlzIG5vdCBzZXQsIGNhbGwgZWFjaCB0aW1lIHRoZSB1c2VyIGNsaWNrIG9uIHRoZSBidXR0b24gdG8gZ2VuZXJhdGUgdGhlIENTViBmaWxlICovXHJcbiAgICBASW5wdXQoKSBnZXRSb3dzID0gdW5kZWZpbmVkO1xyXG5cclxuICAgIC8qKiBUaXRsZSBvZiB0aGUgZmlsZSB0byBkb3dubG9hZCAqL1xyXG4gICAgQElucHV0KCkgdGl0bGU6IHN0cmluZyA9IFwiZmlsZVwiO1xyXG5cclxuICAgIC8qKiBMYWJlbCBmb3IgdGhlIGJ1dHRvbiB0byBjbGljayAqL1xyXG4gICAgQElucHV0KCkgYnV0dG9uTGFiZWw6IHN0cmluZyA9IFwiRXhwb3J0XCI7XHJcblxyXG4gICAgLyoqIERlbGltaXRlciBmb3IgdGhlIENTViAqL1xyXG4gICAgZGVsaW1ldGVyOiBzdHJpbmcgPSBcIjtcIjtcclxuXHJcbiAgICBhc3luYyBvbkNsaWNrRG93bmxvYWQoKSB7XHJcbiAgICAgICAgbGV0IHJvd3M6IHN0cmluZ1tdW10gPSB0aGlzLnJvd3NJbnB1dDtcclxuICAgICAgICBpZiAoIXJvd3MpIHtcclxuICAgICAgICAgICAgcm93cyA9IGF3YWl0IFByb21pc2UucmVzb2x2ZSh0aGlzLmdldFJvd3MoKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGRhdGEgPSBgZGF0YTp0ZXh0L2NzdjtjaGFyc2V0PXV0Zi04LCR7dGhpcy5oZWFkZXJzLmpvaW4oXHJcbiAgICAgICAgICAgIHRoaXMuZGVsaW1ldGVyLFxyXG4gICAgICAgICl9XFxuJHtyb3dzXHJcbiAgICAgICAgICAgIC5tYXAoKHJvdykgPT5cclxuICAgICAgICAgICAgICAgIC8qKiBDbGVhbiBlYWNoIHJvd3MvY2VsbHMgKi9cclxuICAgICAgICAgICAgICAgIHJvd1xyXG4gICAgICAgICAgICAgICAgICAgIC5tYXAoKHZhbHVlKSA9PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UodGhpcy5kZWxpbWV0ZXIsIFwiIFwiKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoXCJcXG5cIiwgXCIgXCIpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAucmVwbGFjZShcIlxcclwiLCBcIiBcIiksXHJcbiAgICAgICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgICAgIC5qb2luKHRoaXMuZGVsaW1ldGVyKSxcclxuICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAuam9pbihcIlxcblwiKX1gO1xyXG5cclxuICAgICAgICAvKiogQ3JlYXRlIGEgbGluayB0byBkb3dubG9hZCB0aGUgZmlsZSAqL1xyXG4gICAgICAgIGNvbnN0IGxpbmsgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiYVwiKTtcclxuICAgICAgICBsaW5rLnNldEF0dHJpYnV0ZShcImhyZWZcIiwgZW5jb2RlVVJJKGRhdGEpKTtcclxuICAgICAgICBsaW5rLnNldEF0dHJpYnV0ZShcImRvd25sb2FkXCIsIGAke3RoaXMudGl0bGV9LmNzdmApO1xyXG4gICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kKGxpbmspO1xyXG4gICAgICAgIGxpbmsuY2xpY2soKTtcclxuICAgICAgICBsaW5rLnJlbW92ZSgpO1xyXG4gICAgfVxyXG59XHJcbiIsIjxzcGFuIFtzdHlsZS5jdXJzb3JdPVwiJ3BvaW50ZXInXCIgKGNsaWNrKT1cIm9uQ2xpY2tEb3dubG9hZCgpXCIgY2xhc3M9XCJkb3dubG9hZC1jc3YgZC1mbGV4XCI+XHJcbiAgICA8c3BhbiBjbGFzcz1cImljb25pZnlcIiBkYXRhLWljb249XCJtZGk6ZmlsZS1kb3dubG9hZC1vdXRsaW5lXCI+PC9zcGFuPlxyXG4gICAge3sgYnV0dG9uTGFiZWwgfCB0cmFuc2xhdGV9fVxyXG48L3NwYW4+XHJcbiJdfQ==
@@ -0,0 +1,23 @@
1
+ import { Component, Input } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ import * as i1 from "@angular/common";
4
+ class LoaderComponent {
5
+ useLogo = true;
6
+ color = "#53B6BB";
7
+ constructor() { }
8
+ ngOnInit() {
9
+ document.documentElement.style.setProperty('--color', this.color);
10
+ }
11
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: LoaderComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
12
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: LoaderComponent, selector: "lib-loader", inputs: { useLogo: "useLogo", color: "color" }, ngImport: i0, template: "<div class=\"sk-fading-circle\">\r\n <img *ngIf=\"useLogo\" src=\"../../../../assets/icons/smarterplan.svg\">\r\n <div class=\"sk-circle1 sk-circle\"></div>\r\n <div class=\"sk-circle2 sk-circle\"></div>\r\n <div class=\"sk-circle3 sk-circle\"></div>\r\n <div class=\"sk-circle4 sk-circle\"></div>\r\n <div class=\"sk-circle5 sk-circle\"></div>\r\n <div class=\"sk-circle6 sk-circle\"></div>\r\n <div class=\"sk-circle7 sk-circle\"></div>\r\n <div class=\"sk-circle8 sk-circle\"></div>\r\n <div class=\"sk-circle9 sk-circle\"></div>\r\n <div class=\"sk-circle10 sk-circle\"></div>\r\n <div class=\"sk-circle11 sk-circle\"></div>\r\n <div class=\"sk-circle12 sk-circle\"></div>\r\n</div>\r\n", styles: [".sk-fading-circle{width:88px;height:88px;position:relative}.sk-fading-circle img{width:2rem;position:absolute;left:calc(50% - 16px);top:calc(50% - 16px)}.sk-fading-circle .sk-circle{width:100%;height:100%;position:absolute;left:0;top:0}.sk-fading-circle .sk-circle:before{content:\"\";display:block;margin:0 auto;width:15%;height:15%;background-color:var(--color);border-radius:100%;animation:sk-circleFadeDelay 1.2s infinite ease-in-out both}.sk-fading-circle .sk-circle2{transform:rotate(30deg)}.sk-fading-circle .sk-circle3{transform:rotate(60deg)}.sk-fading-circle .sk-circle4{transform:rotate(90deg)}.sk-fading-circle .sk-circle5{transform:rotate(120deg)}.sk-fading-circle .sk-circle6{transform:rotate(150deg)}.sk-fading-circle .sk-circle7{transform:rotate(180deg)}.sk-fading-circle .sk-circle8{transform:rotate(210deg)}.sk-fading-circle .sk-circle9{transform:rotate(240deg)}.sk-fading-circle .sk-circle10{transform:rotate(270deg)}.sk-fading-circle .sk-circle11{transform:rotate(300deg)}.sk-fading-circle .sk-circle12{transform:rotate(330deg)}.sk-fading-circle .sk-circle2:before{animation-delay:-1.1s}.sk-fading-circle .sk-circle3:before{animation-delay:-1s}.sk-fading-circle .sk-circle4:before{animation-delay:-.9s}.sk-fading-circle .sk-circle5:before{animation-delay:-.8s}.sk-fading-circle .sk-circle6:before{animation-delay:-.7s}.sk-fading-circle .sk-circle7:before{animation-delay:-.6s}.sk-fading-circle .sk-circle8:before{animation-delay:-.5s}.sk-fading-circle .sk-circle9:before{animation-delay:-.4s}.sk-fading-circle .sk-circle10:before{animation-delay:-.3s}.sk-fading-circle .sk-circle11:before{animation-delay:-.2s}.sk-fading-circle .sk-circle12:before{animation-delay:-.1s}@keyframes sk-circleFadeDelay{0%,39%,to{opacity:0}40%{opacity:1}}\n"], dependencies: [{ kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] });
13
+ }
14
+ export { LoaderComponent };
15
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: LoaderComponent, decorators: [{
16
+ type: Component,
17
+ args: [{ selector: 'lib-loader', template: "<div class=\"sk-fading-circle\">\r\n <img *ngIf=\"useLogo\" src=\"../../../../assets/icons/smarterplan.svg\">\r\n <div class=\"sk-circle1 sk-circle\"></div>\r\n <div class=\"sk-circle2 sk-circle\"></div>\r\n <div class=\"sk-circle3 sk-circle\"></div>\r\n <div class=\"sk-circle4 sk-circle\"></div>\r\n <div class=\"sk-circle5 sk-circle\"></div>\r\n <div class=\"sk-circle6 sk-circle\"></div>\r\n <div class=\"sk-circle7 sk-circle\"></div>\r\n <div class=\"sk-circle8 sk-circle\"></div>\r\n <div class=\"sk-circle9 sk-circle\"></div>\r\n <div class=\"sk-circle10 sk-circle\"></div>\r\n <div class=\"sk-circle11 sk-circle\"></div>\r\n <div class=\"sk-circle12 sk-circle\"></div>\r\n</div>\r\n", styles: [".sk-fading-circle{width:88px;height:88px;position:relative}.sk-fading-circle img{width:2rem;position:absolute;left:calc(50% - 16px);top:calc(50% - 16px)}.sk-fading-circle .sk-circle{width:100%;height:100%;position:absolute;left:0;top:0}.sk-fading-circle .sk-circle:before{content:\"\";display:block;margin:0 auto;width:15%;height:15%;background-color:var(--color);border-radius:100%;animation:sk-circleFadeDelay 1.2s infinite ease-in-out both}.sk-fading-circle .sk-circle2{transform:rotate(30deg)}.sk-fading-circle .sk-circle3{transform:rotate(60deg)}.sk-fading-circle .sk-circle4{transform:rotate(90deg)}.sk-fading-circle .sk-circle5{transform:rotate(120deg)}.sk-fading-circle .sk-circle6{transform:rotate(150deg)}.sk-fading-circle .sk-circle7{transform:rotate(180deg)}.sk-fading-circle .sk-circle8{transform:rotate(210deg)}.sk-fading-circle .sk-circle9{transform:rotate(240deg)}.sk-fading-circle .sk-circle10{transform:rotate(270deg)}.sk-fading-circle .sk-circle11{transform:rotate(300deg)}.sk-fading-circle .sk-circle12{transform:rotate(330deg)}.sk-fading-circle .sk-circle2:before{animation-delay:-1.1s}.sk-fading-circle .sk-circle3:before{animation-delay:-1s}.sk-fading-circle .sk-circle4:before{animation-delay:-.9s}.sk-fading-circle .sk-circle5:before{animation-delay:-.8s}.sk-fading-circle .sk-circle6:before{animation-delay:-.7s}.sk-fading-circle .sk-circle7:before{animation-delay:-.6s}.sk-fading-circle .sk-circle8:before{animation-delay:-.5s}.sk-fading-circle .sk-circle9:before{animation-delay:-.4s}.sk-fading-circle .sk-circle10:before{animation-delay:-.3s}.sk-fading-circle .sk-circle11:before{animation-delay:-.2s}.sk-fading-circle .sk-circle12:before{animation-delay:-.1s}@keyframes sk-circleFadeDelay{0%,39%,to{opacity:0}40%{opacity:1}}\n"] }]
18
+ }], ctorParameters: function () { return []; }, propDecorators: { useLogo: [{
19
+ type: Input
20
+ }], color: [{
21
+ type: Input
22
+ }] } });
23
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9hZGVyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1zbWFydGVycGxhbi1jb3JlL3NyYy9saWIvY29tcG9uZW50cy9sb2FkZXIvbG9hZGVyLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1zbWFydGVycGxhbi1jb3JlL3NyYy9saWIvY29tcG9uZW50cy9sb2FkZXIvbG9hZGVyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFVLE1BQU0sZUFBZSxDQUFDOzs7QUFFekQsTUFLYSxlQUFlO0lBQ2YsT0FBTyxHQUFZLElBQUksQ0FBQztJQUV4QixLQUFLLEdBQVcsU0FBUyxDQUFDO0lBQ25DLGdCQUFnQixDQUFDO0lBRWpCLFFBQVE7UUFDSixRQUFRLENBQUMsZUFBZSxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUN0RSxDQUFDO3dHQVJRLGVBQWU7NEZBQWYsZUFBZSxrR0NQNUIsMnRCQWVBOztTRFJhLGVBQWU7NEZBQWYsZUFBZTtrQkFMM0IsU0FBUzsrQkFDSSxZQUFZOzBFQUtiLE9BQU87c0JBQWYsS0FBSztnQkFFRyxLQUFLO3NCQUFiLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0LCBPbkluaXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gICAgc2VsZWN0b3I6ICdsaWItbG9hZGVyJyxcclxuICAgIHRlbXBsYXRlVXJsOiAnLi9sb2FkZXIuY29tcG9uZW50Lmh0bWwnLFxyXG4gICAgc3R5bGVVcmxzOiBbJy4vbG9hZGVyLmNvbXBvbmVudC5zY3NzJ11cclxufSlcclxuZXhwb3J0IGNsYXNzIExvYWRlckNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XHJcbiAgICBASW5wdXQoKSB1c2VMb2dvOiBib29sZWFuID0gdHJ1ZTtcclxuXHJcbiAgICBASW5wdXQoKSBjb2xvcjogc3RyaW5nID0gXCIjNTNCNkJCXCI7XHJcbiAgICBjb25zdHJ1Y3RvcigpIHsgfVxyXG5cclxuICAgIG5nT25Jbml0KCk6IHZvaWQge1xyXG4gICAgICAgIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zdHlsZS5zZXRQcm9wZXJ0eSgnLS1jb2xvcicsIHRoaXMuY29sb3IpO1xyXG4gICAgfVxyXG5cclxufVxyXG4iLCI8ZGl2IGNsYXNzPVwic2stZmFkaW5nLWNpcmNsZVwiPlxyXG4gICAgPGltZyAqbmdJZj1cInVzZUxvZ29cIiBzcmM9XCIuLi8uLi8uLi8uLi9hc3NldHMvaWNvbnMvc21hcnRlcnBsYW4uc3ZnXCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwic2stY2lyY2xlMSBzay1jaXJjbGVcIj48L2Rpdj5cclxuICAgIDxkaXYgY2xhc3M9XCJzay1jaXJjbGUyIHNrLWNpcmNsZVwiPjwvZGl2PlxyXG4gICAgPGRpdiBjbGFzcz1cInNrLWNpcmNsZTMgc2stY2lyY2xlXCI+PC9kaXY+XHJcbiAgICA8ZGl2IGNsYXNzPVwic2stY2lyY2xlNCBzay1jaXJjbGVcIj48L2Rpdj5cclxuICAgIDxkaXYgY2xhc3M9XCJzay1jaXJjbGU1IHNrLWNpcmNsZVwiPjwvZGl2PlxyXG4gICAgPGRpdiBjbGFzcz1cInNrLWNpcmNsZTYgc2stY2lyY2xlXCI+PC9kaXY+XHJcbiAgICA8ZGl2IGNsYXNzPVwic2stY2lyY2xlNyBzay1jaXJjbGVcIj48L2Rpdj5cclxuICAgIDxkaXYgY2xhc3M9XCJzay1jaXJjbGU4IHNrLWNpcmNsZVwiPjwvZGl2PlxyXG4gICAgPGRpdiBjbGFzcz1cInNrLWNpcmNsZTkgc2stY2lyY2xlXCI+PC9kaXY+XHJcbiAgICA8ZGl2IGNsYXNzPVwic2stY2lyY2xlMTAgc2stY2lyY2xlXCI+PC9kaXY+XHJcbiAgICA8ZGl2IGNsYXNzPVwic2stY2lyY2xlMTEgc2stY2lyY2xlXCI+PC9kaXY+XHJcbiAgICA8ZGl2IGNsYXNzPVwic2stY2lyY2xlMTIgc2stY2lyY2xlXCI+PC9kaXY+XHJcbjwvZGl2PlxyXG4iXX0=
@@ -0,0 +1,86 @@
1
+ import { Component, Input } from '@angular/core';
2
+ import { uploadFileToS3, getSignedImageUrlForProfile } from '../../../services/s3.service';
3
+ import { ProfileEntity } from '../../../types.service';
4
+ import * as CryptoJS from 'crypto-js';
5
+ import * as i0 from "@angular/core";
6
+ import * as i1 from "../../../services/user.service";
7
+ import * as i2 from "../../../services/models/profile.service";
8
+ const cache = {};
9
+ class AvatarComponent {
10
+ userService;
11
+ profileService;
12
+ size = 45;
13
+ userID;
14
+ currentUser;
15
+ avatar;
16
+ userSub;
17
+ constructor(userService, profileService) {
18
+ this.userService = userService;
19
+ this.profileService = profileService;
20
+ this.userSub = this.userService.isChanged.subscribe((connected) => {
21
+ if (connected) {
22
+ this.currentUser = this.userService.cu;
23
+ this.setAvatar(this.currentUser);
24
+ }
25
+ });
26
+ }
27
+ async ngOnInit() {
28
+ if (this.userID) {
29
+ const profile = await this.profileService.getProfile(this.userID);
30
+ if (profile) {
31
+ const user = new ProfileEntity(profile);
32
+ this.setAvatar(user);
33
+ }
34
+ }
35
+ else {
36
+ this.currentUser = this.userService.cu;
37
+ this.setAvatar(this.currentUser);
38
+ }
39
+ }
40
+ ngOnDestroy() {
41
+ if (this.userSub) {
42
+ this.userSub.unsubscribe();
43
+ }
44
+ }
45
+ async setAvatar(user) {
46
+ const { id, avatar, email } = user;
47
+ // If avatar is not cached, check first if we have an avatar URL to fetch
48
+ // from S3. If not, retrieve it from libravatar.
49
+ // TODO use in a Service to be able to change/upload freely.
50
+ if (!cache.hasOwnProperty(id)) {
51
+ if (!avatar && email) {
52
+ const md5hash = CryptoJS.MD5(email.trim().toLowerCase()).toString();
53
+ const avatar = `https://seccdn.libravatar.org/avatar/${md5hash}?s=${this.size}&default=identicon`;
54
+ const url = await fetch(avatar)
55
+ .then((res) => res.blob())
56
+ .then((blob) => {
57
+ const file = new File([blob], "avatar.jpeg", {
58
+ type: "image/jpeg",
59
+ });
60
+ return uploadFileToS3("avatars/", file, id);
61
+ });
62
+ await this.profileService.updateProfile({ id, avatar: url });
63
+ user.avatar = url;
64
+ cache[id] = avatar;
65
+ }
66
+ if (avatar) {
67
+ // TODO generating signed urls for avatar makes NO SENSE ($$$)
68
+ // Sorry got to copypaste that, but really need to get rid of
69
+ cache[id] = await getSignedImageUrlForProfile(user);
70
+ }
71
+ }
72
+ this.avatar = cache[id];
73
+ }
74
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: AvatarComponent, deps: [{ token: i1.BaseUserService }, { token: i2.ProfileService }], target: i0.ɵɵFactoryTarget.Component });
75
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: AvatarComponent, selector: "lib-avatar", inputs: { size: "size", userID: "userID" }, ngImport: i0, template: `<img [src]="avatar" />`, isInline: true, styles: ["img{max-width:100%;max-height:100%;height:100%;width:100%;border-radius:50%}\n"] });
76
+ }
77
+ export { AvatarComponent };
78
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: AvatarComponent, decorators: [{
79
+ type: Component,
80
+ args: [{ selector: 'lib-avatar', template: `<img [src]="avatar" />`, styles: ["img{max-width:100%;max-height:100%;height:100%;width:100%;border-radius:50%}\n"] }]
81
+ }], ctorParameters: function () { return [{ type: i1.BaseUserService }, { type: i2.ProfileService }]; }, propDecorators: { size: [{
82
+ type: Input
83
+ }], userID: [{
84
+ type: Input
85
+ }] } });
86
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXZhdGFyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1zbWFydGVycGxhbi1jb3JlL3NyYy9saWIvY29tcG9uZW50cy9tZW51LWJhci9hdmF0YXIvYXZhdGFyLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBVSxNQUFNLGVBQWUsQ0FBQztBQUV6RCxPQUFPLEVBQUUsY0FBYyxFQUFFLDJCQUEyQixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFFM0YsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3ZELE9BQU8sS0FBSyxRQUFRLE1BQU0sV0FBVyxDQUFDOzs7O0FBR3RDLE1BQU0sS0FBSyxHQUFHLEVBQUUsQ0FBQztBQUNqQixNQUthLGVBQWU7SUFhWjtJQUNBO0lBWkgsSUFBSSxHQUFXLEVBQUUsQ0FBQztJQUVsQixNQUFNLENBQVM7SUFFeEIsV0FBVyxDQUFnQjtJQUUzQixNQUFNLENBQUM7SUFFUCxPQUFPLENBQWU7SUFFdEIsWUFDWSxXQUE0QixFQUM1QixjQUE4QjtRQUQ5QixnQkFBVyxHQUFYLFdBQVcsQ0FBaUI7UUFDNUIsbUJBQWMsR0FBZCxjQUFjLENBQWdCO1FBRXRDLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLENBQUMsU0FBUyxFQUFFLEVBQUU7WUFDOUQsSUFBSSxTQUFTLEVBQUU7Z0JBQ1gsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQztnQkFDdkMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7YUFDcEM7UUFDTCxDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7SUFFRCxLQUFLLENBQUMsUUFBUTtRQUNWLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRTtZQUNiLE1BQU0sT0FBTyxHQUFHLE1BQU0sSUFBSSxDQUFDLGNBQWMsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ2xFLElBQUksT0FBTyxFQUFFO2dCQUNULE1BQU0sSUFBSSxHQUFHLElBQUksYUFBYSxDQUFDLE9BQU8sQ0FBQyxDQUFDO2dCQUN4QyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO2FBQ3hCO1NBQ0o7YUFBTTtZQUNILElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUM7WUFDdkMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7U0FDcEM7SUFDTCxDQUFDO0lBRUQsV0FBVztRQUNQLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRTtZQUNkLElBQUksQ0FBQyxPQUFPLENBQUMsV0FBVyxFQUFFLENBQUM7U0FDOUI7SUFDTCxDQUFDO0lBRUQsS0FBSyxDQUFDLFNBQVMsQ0FBQyxJQUFtQjtRQUMvQixNQUFNLEVBQUUsRUFBRSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsR0FBRyxJQUFJLENBQUM7UUFFbkMseUVBQXlFO1FBQ3pFLGdEQUFnRDtRQUNoRCw0REFBNEQ7UUFDNUQsSUFBSSxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUMsRUFBRSxDQUFDLEVBQUU7WUFDM0IsSUFBSSxDQUFDLE1BQU0sSUFBSSxLQUFLLEVBQUU7Z0JBQ2xCLE1BQU0sT0FBTyxHQUFHLFFBQVEsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUM7Z0JBQ3BFLE1BQU0sTUFBTSxHQUFHLHdDQUF3QyxPQUFPLE1BQU0sSUFBSSxDQUFDLElBQUksb0JBQW9CLENBQUM7Z0JBQ2xHLE1BQU0sR0FBRyxHQUFHLE1BQU0sS0FBSyxDQUFDLE1BQU0sQ0FBQztxQkFDMUIsSUFBSSxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLENBQUM7cUJBQ3pCLElBQUksQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFO29CQUNYLE1BQU0sSUFBSSxHQUFHLElBQUksSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsYUFBYSxFQUFFO3dCQUN6QyxJQUFJLEVBQUUsWUFBWTtxQkFDckIsQ0FBQyxDQUFDO29CQUNILE9BQU8sY0FBYyxDQUFDLFVBQVUsRUFBRSxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUM7Z0JBQ2hELENBQUMsQ0FBQyxDQUFDO2dCQUNQLE1BQU0sSUFBSSxDQUFDLGNBQWMsQ0FBQyxhQUFhLENBQUMsRUFBRSxFQUFFLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUM7Z0JBQzdELElBQUksQ0FBQyxNQUFNLEdBQUcsR0FBRyxDQUFDO2dCQUNsQixLQUFLLENBQUMsRUFBRSxDQUFDLEdBQUcsTUFBTSxDQUFDO2FBQ3RCO1lBQ0QsSUFBSSxNQUFNLEVBQUU7Z0JBQ1IsOERBQThEO2dCQUM5RCw2REFBNkQ7Z0JBQzdELEtBQUssQ0FBQyxFQUFFLENBQUMsR0FBRyxNQUFNLDJCQUEyQixDQUFDLElBQUksQ0FBQyxDQUFDO2FBQ3ZEO1NBQ0o7UUFDRCxJQUFJLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUM1QixDQUFDO3dHQXhFUSxlQUFlOzRGQUFmLGVBQWUsOEZBSGQsd0JBQXdCOztTQUd6QixlQUFlOzRGQUFmLGVBQWU7a0JBTDNCLFNBQVM7K0JBQ0ksWUFBWSxZQUNaLHdCQUF3QjttSUFLekIsSUFBSTtzQkFBWixLQUFLO2dCQUVHLE1BQU07c0JBQWQsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgSW5wdXQsIE9uSW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBQcm9maWxlU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL21vZGVscy9wcm9maWxlLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyB1cGxvYWRGaWxlVG9TMywgZ2V0U2lnbmVkSW1hZ2VVcmxGb3JQcm9maWxlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvczMuc2VydmljZSc7XHJcbmltcG9ydCB7IEJhc2VVc2VyU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL3VzZXIuc2VydmljZSc7XHJcbmltcG9ydCB7IFByb2ZpbGVFbnRpdHkgfSBmcm9tICcuLi8uLi8uLi90eXBlcy5zZXJ2aWNlJztcclxuaW1wb3J0ICogYXMgQ3J5cHRvSlMgZnJvbSAnY3J5cHRvLWpzJztcclxuaW1wb3J0IHsgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XHJcblxyXG5jb25zdCBjYWNoZSA9IHt9O1xyXG5AQ29tcG9uZW50KHtcclxuICAgIHNlbGVjdG9yOiAnbGliLWF2YXRhcicsXHJcbiAgICB0ZW1wbGF0ZTogYDxpbWcgW3NyY109XCJhdmF0YXJcIiAvPmAsXHJcbiAgICBzdHlsZVVybHM6IFtcIi4vYXZhdGFyLmNvbXBvbmVudC5zY3NzXCJdLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgQXZhdGFyQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcclxuXHJcbiAgICBASW5wdXQoKSBzaXplOiBudW1iZXIgPSA0NTtcclxuXHJcbiAgICBASW5wdXQoKSB1c2VySUQ6IHN0cmluZztcclxuXHJcbiAgICBjdXJyZW50VXNlcjogUHJvZmlsZUVudGl0eTtcclxuXHJcbiAgICBhdmF0YXI7XHJcblxyXG4gICAgdXNlclN1YjogU3Vic2NyaXB0aW9uO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKFxyXG4gICAgICAgIHByaXZhdGUgdXNlclNlcnZpY2U6IEJhc2VVc2VyU2VydmljZSxcclxuICAgICAgICBwcml2YXRlIHByb2ZpbGVTZXJ2aWNlOiBQcm9maWxlU2VydmljZSxcclxuICAgICkge1xyXG4gICAgICAgIHRoaXMudXNlclN1YiA9IHRoaXMudXNlclNlcnZpY2UuaXNDaGFuZ2VkLnN1YnNjcmliZSgoY29ubmVjdGVkKSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChjb25uZWN0ZWQpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudFVzZXIgPSB0aGlzLnVzZXJTZXJ2aWNlLmN1O1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zZXRBdmF0YXIodGhpcy5jdXJyZW50VXNlcik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBuZ09uSW5pdCgpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgICAgICBpZiAodGhpcy51c2VySUQpIHtcclxuICAgICAgICAgICAgY29uc3QgcHJvZmlsZSA9IGF3YWl0IHRoaXMucHJvZmlsZVNlcnZpY2UuZ2V0UHJvZmlsZSh0aGlzLnVzZXJJRCk7XHJcbiAgICAgICAgICAgIGlmIChwcm9maWxlKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB1c2VyID0gbmV3IFByb2ZpbGVFbnRpdHkocHJvZmlsZSk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNldEF2YXRhcih1c2VyKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuY3VycmVudFVzZXIgPSB0aGlzLnVzZXJTZXJ2aWNlLmN1O1xyXG4gICAgICAgICAgICB0aGlzLnNldEF2YXRhcih0aGlzLmN1cnJlbnRVc2VyKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgbmdPbkRlc3Ryb3koKSB7XHJcbiAgICAgICAgaWYgKHRoaXMudXNlclN1Yikge1xyXG4gICAgICAgICAgICB0aGlzLnVzZXJTdWIudW5zdWJzY3JpYmUoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgc2V0QXZhdGFyKHVzZXI6IFByb2ZpbGVFbnRpdHkpIHtcclxuICAgICAgICBjb25zdCB7IGlkLCBhdmF0YXIsIGVtYWlsIH0gPSB1c2VyO1xyXG5cclxuICAgICAgICAvLyBJZiBhdmF0YXIgaXMgbm90IGNhY2hlZCwgY2hlY2sgZmlyc3QgaWYgd2UgaGF2ZSBhbiBhdmF0YXIgVVJMIHRvIGZldGNoXHJcbiAgICAgICAgLy8gZnJvbSBTMy4gSWYgbm90LCByZXRyaWV2ZSBpdCBmcm9tIGxpYnJhdmF0YXIuXHJcbiAgICAgICAgLy8gVE9ETyB1c2UgaW4gYSBTZXJ2aWNlIHRvIGJlIGFibGUgdG8gY2hhbmdlL3VwbG9hZCBmcmVlbHkuXHJcbiAgICAgICAgaWYgKCFjYWNoZS5oYXNPd25Qcm9wZXJ0eShpZCkpIHtcclxuICAgICAgICAgICAgaWYgKCFhdmF0YXIgJiYgZW1haWwpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IG1kNWhhc2ggPSBDcnlwdG9KUy5NRDUoZW1haWwudHJpbSgpLnRvTG93ZXJDYXNlKCkpLnRvU3RyaW5nKCk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBhdmF0YXIgPSBgaHR0cHM6Ly9zZWNjZG4ubGlicmF2YXRhci5vcmcvYXZhdGFyLyR7bWQ1aGFzaH0/cz0ke3RoaXMuc2l6ZX0mZGVmYXVsdD1pZGVudGljb25gO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgdXJsID0gYXdhaXQgZmV0Y2goYXZhdGFyKVxyXG4gICAgICAgICAgICAgICAgICAgIC50aGVuKChyZXMpID0+IHJlcy5ibG9iKCkpXHJcbiAgICAgICAgICAgICAgICAgICAgLnRoZW4oKGJsb2IpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmlsZSA9IG5ldyBGaWxlKFtibG9iXSwgXCJhdmF0YXIuanBlZ1wiLCB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBcImltYWdlL2pwZWdcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB1cGxvYWRGaWxlVG9TMyhcImF2YXRhcnMvXCIsIGZpbGUsIGlkKTtcclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMucHJvZmlsZVNlcnZpY2UudXBkYXRlUHJvZmlsZSh7IGlkLCBhdmF0YXI6IHVybCB9KTtcclxuICAgICAgICAgICAgICAgIHVzZXIuYXZhdGFyID0gdXJsO1xyXG4gICAgICAgICAgICAgICAgY2FjaGVbaWRdID0gYXZhdGFyO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChhdmF0YXIpIHtcclxuICAgICAgICAgICAgICAgIC8vIFRPRE8gZ2VuZXJhdGluZyBzaWduZWQgdXJscyBmb3IgYXZhdGFyIG1ha2VzIE5PIFNFTlNFICgkJCQpXHJcbiAgICAgICAgICAgICAgICAvLyBTb3JyeSBnb3QgdG8gY29weXBhc3RlIHRoYXQsIGJ1dCByZWFsbHkgbmVlZCB0byBnZXQgcmlkIG9mXHJcbiAgICAgICAgICAgICAgICBjYWNoZVtpZF0gPSBhd2FpdCBnZXRTaWduZWRJbWFnZVVybEZvclByb2ZpbGUodXNlcik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5hdmF0YXIgPSBjYWNoZVtpZF07XHJcbiAgICB9XHJcbn1cclxuIl19
@@ -0,0 +1,261 @@
1
+ import { Component, Input } from '@angular/core';
2
+ import { SupportModalComponent } from '../support-modal/support-modal.component';
3
+ import { NgbDate, } from '@ng-bootstrap/ng-bootstrap';
4
+ import * as i0 from "@angular/core";
5
+ import * as i1 from "@angular/router";
6
+ import * as i2 from "../../services/locale.service";
7
+ import * as i3 from "../../services/user.service";
8
+ import * as i4 from "../../services/navigator.service";
9
+ import * as i5 from "../../services/support.service";
10
+ import * as i6 from "../../services/baseVisibility.service";
11
+ import * as i7 from "@ng-bootstrap/ng-bootstrap";
12
+ import * as i8 from "../../services/filter.service";
13
+ import * as i9 from "../../services/amplify-cache.service";
14
+ import * as i10 from "@angular/forms";
15
+ import * as i11 from "@angular/common";
16
+ import * as i12 from "./avatar/avatar.component";
17
+ import * as i13 from "./navigation-bar/navigation-bar.component";
18
+ import * as i14 from "@ngx-translate/core";
19
+ import * as i15 from "../../pipes/format-date-number-to-digits.pipe";
20
+ class MenuBarComponent {
21
+ router;
22
+ localeService;
23
+ userService;
24
+ navigatorService;
25
+ supportService;
26
+ baseVisibilityService;
27
+ calendar;
28
+ formatter;
29
+ filterService;
30
+ cacheService;
31
+ user;
32
+ mission;
33
+ isCollapsed = true;
34
+ isVisitor = true;
35
+ isVisible = false;
36
+ isChangePositionVisible = false;
37
+ isManager;
38
+ userSubscription;
39
+ navSubscription;
40
+ hoveredDate = null;
41
+ fromDate;
42
+ toDate;
43
+ cacheName;
44
+ cache;
45
+ isDateFilterApplied = false;
46
+ dateChanged = false;
47
+ changePositionSubscription;
48
+ searchInput;
49
+ filterSubscription;
50
+ constructor(router, localeService, userService, navigatorService, supportService, baseVisibilityService, calendar, formatter, filterService, cacheService) {
51
+ this.router = router;
52
+ this.localeService = localeService;
53
+ this.userService = userService;
54
+ this.navigatorService = navigatorService;
55
+ this.supportService = supportService;
56
+ this.baseVisibilityService = baseVisibilityService;
57
+ this.calendar = calendar;
58
+ this.formatter = formatter;
59
+ this.filterService = filterService;
60
+ this.cacheService = cacheService;
61
+ this.userSubscription = this.userService.isChanged.subscribe((isChanged) => {
62
+ if (isChanged) {
63
+ this.update();
64
+ }
65
+ });
66
+ this.navSubscription = this.navigatorService.isVisibleChanged.subscribe((data) => {
67
+ this.isVisible = data;
68
+ });
69
+ this.changePositionSubscription = this.baseVisibilityService.isChangePositionVisible.subscribe((data) => {
70
+ this.isChangePositionVisible = data;
71
+ });
72
+ }
73
+ ngOnInit() {
74
+ this.update();
75
+ if (this.cacheName) {
76
+ this.cache = this.cacheService.getFromCache(this.cacheName);
77
+ }
78
+ if (this.cache) {
79
+ this.isDateFilterApplied = true;
80
+ let { from, to } = this.cache;
81
+ this.toDate = this.getNgbDate(to);
82
+ this.fromDate = this.getNgbDate(from);
83
+ localStorage.setItem('startDate', from.toString());
84
+ localStorage.setItem('endDate', to.toString());
85
+ this.filterService.dateFilterUpdated([new Date(from), new Date(to)]);
86
+ }
87
+ else {
88
+ this.fromDate = null;
89
+ this.toDate = null;
90
+ localStorage.removeItem('startDate');
91
+ localStorage.removeItem('endDate');
92
+ this.filterService.dateFilterUpdated(null);
93
+ }
94
+ // This allows updating the inputs when measurement.service changes the date programmatically
95
+ this.filterSubscription = this.filterService.subscribeToDataFilterUpdate((dateRange) => {
96
+ if (dateRange && dateRange.length === 2) {
97
+ // 1. Convert JS Date objects to NgbDate for display
98
+ const from = dateRange[0].getTime();
99
+ const to = dateRange[1].getTime();
100
+ this.fromDate = this.getNgbDate(from);
101
+ this.toDate = this.getNgbDate(to);
102
+ // 2. Update local cache reference to prevent the "Apply" button from activating
103
+ this.cache = { from, to };
104
+ // 3. Update visual state
105
+ this.isDateFilterApplied = true;
106
+ this.dateChanged = false; // We consider it synchronized
107
+ }
108
+ else {
109
+ // If the filter is cleared externally
110
+ this.fromDate = null;
111
+ this.toDate = null;
112
+ this.isDateFilterApplied = false;
113
+ this.cache = null;
114
+ }
115
+ });
116
+ }
117
+ onSearchKeydown = (event) => {
118
+ if (event.key === 'Enter')
119
+ this.onSubmit();
120
+ };
121
+ ngAfterViewInit() {
122
+ this.searchInput = document.querySelector('#mainSearchBar');
123
+ this.searchInput?.addEventListener('keydown', this.onSearchKeydown);
124
+ }
125
+ ngOnDestroy() {
126
+ this.searchInput?.removeEventListener('keydown', this.onSearchKeydown);
127
+ this.userSubscription?.unsubscribe();
128
+ this.navSubscription?.unsubscribe();
129
+ this.changePositionSubscription?.unsubscribe();
130
+ this.filterSubscription?.unsubscribe();
131
+ }
132
+ async signOut() {
133
+ await this.userService.logoutCurrentAndSignOutAuth();
134
+ this.router.navigate(['auth']);
135
+ }
136
+ async update() {
137
+ this.user = this.userService.cu;
138
+ this.mission = this.userService.currentMissions[0];
139
+ this.isManager = this.userService.hasManagerRoleInAnyMission();
140
+ this.isVisitor = this.userService.isVisitor();
141
+ if (!this.isVisitor) {
142
+ this.isVisible = true;
143
+ }
144
+ }
145
+ // eslint-disable-next-line class-methods-use-this
146
+ onSubmit() {
147
+ const input = document.querySelector('#mainSearchBar');
148
+ const searchValue = input.value.toLowerCase();
149
+ if (searchValue !== '') {
150
+ const baseUrl = location.origin;
151
+ window.open(`${baseUrl}/dashboard/search?term=${searchValue}`, '_blank');
152
+ }
153
+ }
154
+ onToggleVisible() {
155
+ this.isVisible = !this.isVisible;
156
+ }
157
+ openSupportForm() {
158
+ this.supportService.openSupportForm(SupportModalComponent);
159
+ }
160
+ onChangePositionClick() {
161
+ this.baseVisibilityService.isChangePositionVisible.next(!this.isChangePositionVisible);
162
+ }
163
+ getNgbDate(date) {
164
+ let dt = new Date(date);
165
+ dt.setMinutes(dt.getMinutes() - dt.getTimezoneOffset()); // convert to UTC
166
+ return new NgbDate(dt.getUTCFullYear(), dt.getUTCMonth() + 1, dt.getUTCDate());
167
+ }
168
+ onDateSelection(date) {
169
+ if (!this.fromDate && !this.toDate) {
170
+ this.fromDate = date;
171
+ }
172
+ else if (this.fromDate &&
173
+ !this.toDate &&
174
+ date &&
175
+ date.after(this.fromDate)) {
176
+ this.toDate = date;
177
+ }
178
+ else {
179
+ this.toDate = null;
180
+ this.fromDate = date;
181
+ }
182
+ this.isDateChanged();
183
+ }
184
+ isDateChanged() {
185
+ if (this.fromDate && this.toDate) {
186
+ if (this.cache) {
187
+ this.dateChanged =
188
+ !this.fromDate.equals(this.getNgbDate(this.cache.from)) ||
189
+ !this.toDate.equals(this.getNgbDate(this.cache.to));
190
+ }
191
+ }
192
+ }
193
+ isHovered(date) {
194
+ return (this.fromDate &&
195
+ !this.toDate &&
196
+ this.hoveredDate &&
197
+ date.after(this.fromDate) &&
198
+ date.before(this.hoveredDate));
199
+ }
200
+ isInside(date) {
201
+ return this.toDate && date.after(this.fromDate) && date.before(this.toDate);
202
+ }
203
+ isRange(date) {
204
+ return (date.equals(this.fromDate) ||
205
+ (this.toDate && date.equals(this.toDate)) ||
206
+ this.isInside(date) ||
207
+ this.isHovered(date));
208
+ }
209
+ validateInput(currentValue, input) {
210
+ const parsed = this.formatter.parse(input);
211
+ return parsed && this.calendar.isValid(NgbDate.from(parsed))
212
+ ? NgbDate.from(parsed)
213
+ : currentValue;
214
+ }
215
+ emitRange() {
216
+ if (this.fromDate && this.toDate) {
217
+ const from = new Date(this.fromDate.year, this.fromDate.month - 1, this.fromDate.day);
218
+ const to = new Date(this.toDate.year, this.toDate.month - 1, this.toDate.day, 23, 59);
219
+ this.cacheService.putInCache(this.cacheName, {
220
+ from: from.getTime(),
221
+ to: to.getTime(),
222
+ });
223
+ this.cache = { from: from.getTime(), to: to.getTime() };
224
+ this.filterService.dateFilterUpdated([from, to]);
225
+ this.isDateFilterApplied = true;
226
+ this.dateChanged = false;
227
+ }
228
+ }
229
+ onClearDates() {
230
+ this.fromDate = null;
231
+ this.toDate = null;
232
+ this.isDateFilterApplied = false;
233
+ this.cache = null;
234
+ this.cacheService.removeFromCache(this.cacheName);
235
+ this.filterService.dateFilterUpdated(null);
236
+ }
237
+ onApply() {
238
+ if (this.fromDate && this.toDate) {
239
+ this.emitRange();
240
+ }
241
+ //transform ngbDate to date objet then put dates in timestamp in localStorage to share it with Retool
242
+ if (this.fromDate) {
243
+ const startDate = new Date(this.fromDate.year, this.fromDate.month - 1, this.fromDate.day);
244
+ localStorage.setItem('startDate', startDate.getTime().toString());
245
+ }
246
+ if (this.toDate) {
247
+ const endDate = new Date(this.toDate.year, this.toDate.month - 1, this.toDate.day);
248
+ localStorage.setItem('endDate', endDate.getTime().toString());
249
+ }
250
+ }
251
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: MenuBarComponent, deps: [{ token: i1.Router }, { token: i2.LocaleService }, { token: i3.BaseUserService }, { token: i4.NavigatorService }, { token: i5.SupportService }, { token: i6.BaseVisibilityService }, { token: i7.NgbCalendar }, { token: i7.NgbDateParserFormatter }, { token: i8.FilterService }, { token: i9.AmplifyCacheService }], target: i0.ɵɵFactoryTarget.Component });
252
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: MenuBarComponent, selector: "lib-menu-bar", inputs: { cacheName: "cacheName" }, ngImport: i0, template: "<div id=\"menu-bar\">\r\n <div *ngIf=\"!isVisitor\">\r\n <nav class=\"navbar navbar-expand-md navbar-light p-0\">\r\n <div class=\"container-fluid\" *ngIf=\"isVisible\">\r\n <div class=\"navbar-brand order-md-0\" [routerLink]=\"['/dashboard']\">\r\n <img alt=\"SmarterPlan\" src=\"../assets/images/logos/logo-immo.png\">\r\n </div>\r\n <div class=\"ms-auto nav-item dropdown profile_pic-container order-md-2\">\r\n <div class=\"profile_pic dropdown-toggle\" data-testid=\"dropdown-menu-button\" data-bs-toggle=\"dropdown\">\r\n <lib-avatar></lib-avatar>\r\n </div>\r\n <div class=\"dropdown-menu dropdown-menu-right\">\r\n <p *ngIf=\"user && mission\" class=\"p-2\">\r\n <span class=\"username\">{{ user.displayName }}</span><br />\r\n <span class=\"user-role\">{{ mission.role }}</span><br />\r\n <span class=\"org\">{{ mission.organisation ? mission.organisation.name : \"No organisation\" |\r\n translate}}</span>\r\n </p>\r\n <div class=\"dropdown-divider\"></div>\r\n <!-- <a class=\"dropdown-item\" routerLink=\"/debug\" *ngIf=\"isManager\">Debug</a> -->\r\n <a class=\"dropdown-item\" (click)=\"localeService.modal()\">{{'Language' | translate}}</a>\r\n <a class=\"dropdown-item\" routerLink=\"/dashboard\">{{'Data management' | translate}}</a>\r\n <a class=\"dropdown-item\" data-testid=\"user-management-btn\" routerLink=\"/admin\" *ngIf=\"isManager\">\r\n {{'Users management' | translate}}</a>\r\n <a class=\"dropdown-item\" routerLink=\"/profile\">\r\n {{'Profile' | translate}}</a>\r\n <div class=\"dropdown-divider\"></div>\r\n <button class=\"dropdown-item\" (click)=\"openSupportForm()\">{{\"Help\" | translate}}</button>\r\n <button data-testid=\"logout-auth-btn\" class=\"dropdown-item\" (click)=\"signOut()\">{{\"Logout\" |\r\n translate}}</button>\r\n </div>\r\n </div>\r\n <button class=\"navbar-toggler order-md-1\" (click)=\"navbarCollapse.toggle()\" type=\"button\"\r\n [attr.aria-expanded]=\"!isCollapsed\" aria-controls=\"navbar-collapse\">\r\n <span class=\"navbar-toggler-icon\"></span>\r\n </button>\r\n <div class=\"navbar-collapse order-md-1\" #navbarCollapse=\"ngbCollapse\" [(ngbCollapse)]=\"isCollapsed\"\r\n [animation]=\"false\">\r\n <form\r\n class=\"form-inline m-0 mt-2 form-container d-flex justify-content-start align-items-start align-items-md-center flex-column flex-md-row flex-nowrap filters-menu-block\">\r\n <div class=\"input-group search-button-container d-flex flex-row flex-nowrap p-0 m-0\">\r\n <input class=\"form-control search-button m-1\" placeholder=\"keyword\" id=\"mainSearchBar\" type=\"text\">\r\n <button class=\"btn btn-outline-primary rounded-pill m-1 w-fit-content h-fit-content align-self-md-center\"\r\n (click)=\"onSubmit()\">{{'Search' |\r\n translate}}</button>\r\n </div>\r\n <div class=\"input-group search-button-container d-flex flex-row flex-nowrap p-0 m-0\">\r\n <div class=\"input-group date-selector m-1\">\r\n <input #dpFromDate class=\"form-control\" placeholder=\"dd/MM/yyyy\" name=\"dpFromDate\"\r\n [value]=\"fromDate | formatDateNumberToDigits\"\r\n (input)=\"fromDate = validateInput(fromDate, dpFromDate.value)\">\r\n <div class=\"input-group-append\">\r\n <button class=\"btn btn-outline-secondary calendar\" (click)=\"datepicker.toggle()\"\r\n type=\"button\"></button>\r\n </div>\r\n </div>\r\n <input name=\"datepicker\" class=\"form-control visually-hidden\" ngbDatepicker #datepicker=\"ngbDatepicker\"\r\n [autoClose]=\"'outside'\" (dateSelect)=\"onDateSelection($event)\" [displayMonths]=\"2\" [dayTemplate]=\"t\"\r\n outsideDays=\"hidden\" [startDate]=\"fromDate || calendar.getToday()\" [container]=\"'body'\" tabindex=\"-1\">\r\n <ng-template #t let-date let-focused=\"focused\">\r\n <span class=\"custom-day\" [class.focused]=\"focused\" [class.range]=\"isRange(date)\"\r\n [class.faded]=\"isHovered(date) || isInside(date)\" (mouseenter)=\"hoveredDate = date\"\r\n (mouseleave)=\"hoveredDate = null\">\r\n {{ date.day }}\r\n </span>\r\n </ng-template>\r\n <span class=\"ms-1 p-2\">{{'to' | translate}}</span>\r\n <div class=\"input-group date-selector m-1\">\r\n <input #dpToDate class=\"form-control\" placeholder=\"dd/MM/yyyy\" name=\"dpToDate\"\r\n [value]=\"toDate | formatDateNumberToDigits\" (input)=\"toDate = validateInput(toDate, dpToDate.value)\">\r\n <div class=\"input-group-append\">\r\n <button class=\"btn btn-outline-secondary calendar\" (click)=\"datepicker.toggle()\"\r\n type=\"button\"></button>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"input-group search-button-container d-flex flex-row flex-nowrap p-0 m-1 justify-content-evenly\">\r\n <button\r\n class=\"btn btn-primary rounded-pill ms-1 w-25 w-md-fit-content h-md-fit-content align-self-md-center\"\r\n type=\"button\" (click)=\"onApply()\" *ngIf=\"!isDateFilterApplied || dateChanged\">\r\n {{'Apply' | translate}}\r\n </button>\r\n <span\r\n class=\"appliedText ms-1 py-2 align-self-md-center pb-md-0 mx-2 w-md-fit-content h-md-fit-content align-self-md-center\"\r\n *ngIf=\"isDateFilterApplied && !dateChanged\">\r\n <span class=\"iconify\" data-icon=\"ion:checkmark\" data-width=\"15\" data-height=\"15\"></span>\r\n {{\"Applied\" | translate}}\r\n </span>\r\n <button\r\n class=\"btn btn-outline-primary rounded-pill w-25 mx-2 w-md-fit-content h-md-fit-content align-self-md-center\"\r\n type=\"button\" (click)=\"onClearDates()\">{{'Clear'\r\n |\r\n translate}}</button>\r\n <div\r\n class=\"change-position-button align-self-end pb-2 align-self-md-center mx-2 pb-md-0 flex-nowrap w-25 w-md-fit-content h-md-fit-content\">\r\n <input type=\"checkbox\" class=\"btn-check\" id=\"btn-check-outlined\" autocomplete=\"off\">\r\n <label class=\"link-primary cursor-pointer text-decoration-underline\" (click)=\"onChangePositionClick()\"\r\n for=\"btn-check-outlined\">{{\r\n (isChangePositionVisible ? \"Close\" : \"Move to\") | translate }}</label>\r\n </div>\r\n </div>\r\n </form>\r\n </div>\r\n </div>\r\n </nav>\r\n <lib-navigation-bar *ngIf=\"isVisible && isChangePositionVisible\"></lib-navigation-bar>\r\n </div>\r\n <div *ngIf=\"isVisitor && isVisible\">\r\n <div class=\"visitor-div\">\r\n <div class=\"logo-container\" data-testid=\"dropdown-menu-button\">\r\n <img class=\"img-logo\" alt=\"SmarterPlanLogo\" src=\"../assets/images/logos/logo-reserve.png\">\r\n </div>\r\n <div class=\"avatar-container-menu\">\r\n <div class=\"profile_pic dropdown-toggle cursor-pointer\" data-bs-toggle=\"dropdown\">\r\n <lib-avatar></lib-avatar>\r\n </div>\r\n <div class=\"dropdown-menu dropdown-menu-right\">\r\n <button class=\"dropdown-item\" (click)=\"localeService.modal()\">{{'Language' | translate}}</button>\r\n <button class=\"dropdown-item\" (click)=\"openSupportForm()\">{{\"Help\" | translate}}</button>\r\n <button data-testid=\"logout-auth-btn\" class=\"dropdown-item\" (click)=\"signOut()\">{{\"Logout\" |\r\n translate}}</button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</div>", styles: ["#menu-bar{position:sticky;top:0;z-index:200}.navbar{z-index:200}.navbar-brand{padding-top:5px;padding-bottom:5px;cursor:pointer}.navbar-brand img{height:70px}.profile_pic{border-radius:50%;height:45px;width:45px;margin:8px;border:.2px solid rgb(150,150,150)}.navbar-nav .profile-pic-container .dropdown-menu{position:absolute}.navbar.second-nav{z-index:199;background-color:var(--smarterplan-primary)}.profile_pic.dropdown-toggle:after{display:none}.navbar-light{border-bottom:1px solid var(--smarterplan-primary);background-color:#fff}.navbar form{width:100%;margin:0;padding:0}input,select{margin-right:15px}.select{background:transparent;border:none;color:#fff;margin:6px 20px 0;width:auto}button{padding:5px 10px}button:disabled,button[disabled]{color:#c04f4f}.navbar-toggler{margin-right:1em}.icon{height:40px;width:40px;color:var(--smarterplan-primary)}.search-button-container{width:auto;align-items:stretch;justify-items:start}.search-button-container .search-button{width:auto;border-radius:1rem!important}.visitor-div{background-color:var(--smarterplan-primary);height:60px;display:flex;justify-content:space-between}.profile_pic-container{margin-right:1em}.logo-container,.img-logo{height:100%}.change-position-button{margin-left:2rem}.change-position-button label,.change-position-button .btn-check:checked,.change-position-button .btn-check:focus,.change-position-button .btn-outline-primary,.change-position-button .btn{box-shadow:none!important;outline:0}.change-position-button label{border-radius:16px}.change-position-button .btn-check:checked+.btn{background-color:var(--smarterplan-primary);color:#fff!important}.filters-menu-block{width:auto}@media (min-width: 1200px){.navbar-brand img{height:100px}.profile_pic{height:60px;width:60px;margin:15px}}@media (min-width: 992px) and (max-width: 1199.98px){.navbar-brand img{height:80px}.profile_pic{height:50px;width:50px;margin:12px}}@media (min-width: 768px) and (max-width: 991.98px){.navbar-brand img{height:60px}.profile_pic{height:40px;width:40px;margin:10px}}@media (max-width: 767.98px){.navbar-brand img{height:50px}.profile_pic{height:30px;width:30px;margin:8px}.search-button-container,.filters-menu-block{width:100%}}.form-container{margin:.5rem 0}.navbar-collapse.show{display:flex;padding-bottom:.5rem}.hidden{width:0;margin:0;border:none;padding:0}.custom-day{text-align:center;padding:.185rem .25rem;display:inline-block;height:2rem;width:2rem}.custom-day.focused{background-color:#e6e6e6}.custom-day.range,.custom-day:hover{background-color:var(--smarterplan-primary-lighter);color:#fff}.custom-day.faded{background-color:var(--smarterplan-primary-transparent)}.calendar{height:100%}.appliedText,.appliedText span{color:var(--smarterplan-primary)}@media (max-width: 767px){.form-inline{flex-direction:column}}.hidden{opacity:0}.date-selector{flex-wrap:nowrap}.date-selector input{min-width:80px;margin:0}@media (min-width: 768px){.w-md-fit-content{width:-moz-fit-content!important;width:fit-content!important}.h-md-content{height:-moz-fit-content!important;height:fit-content!important}}\n"], dependencies: [{ kind: "directive", type: i10.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i10.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i10.NgForm, selector: "form:not([ngNoForm]):not([formGroup]),ng-form,[ngForm]", inputs: ["ngFormOptions"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i11.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "directive", type: i7.NgbCollapse, selector: "[ngbCollapse]", inputs: ["animation", "ngbCollapse", "horizontal"], outputs: ["ngbCollapseChange", "shown", "hidden"], exportAs: ["ngbCollapse"] }, { kind: "directive", type: i7.NgbInputDatepicker, selector: "input[ngbDatepicker]", inputs: ["autoClose", "contentTemplate", "datepickerClass", "dayTemplate", "dayTemplateData", "displayMonths", "firstDayOfWeek", "footerTemplate", "markDisabled", "minDate", "maxDate", "navigation", "outsideDays", "placement", "popperOptions", "restoreFocus", "showWeekNumbers", "startDate", "container", "positionTarget", "weekdays", "disabled"], outputs: ["dateSelect", "navigate", "closed"], exportAs: ["ngbDatepicker"] }, { kind: "component", type: i12.AvatarComponent, selector: "lib-avatar", inputs: ["size", "userID"] }, { kind: "component", type: i13.NavigationBarComponent, selector: "lib-navigation-bar" }, { kind: "pipe", type: i14.TranslatePipe, name: "translate" }, { kind: "pipe", type: i15.FormatDateNumberToDigitsPipe, name: "formatDateNumberToDigits" }] });
253
+ }
254
+ export { MenuBarComponent };
255
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: MenuBarComponent, decorators: [{
256
+ type: Component,
257
+ args: [{ selector: 'lib-menu-bar', template: "<div id=\"menu-bar\">\r\n <div *ngIf=\"!isVisitor\">\r\n <nav class=\"navbar navbar-expand-md navbar-light p-0\">\r\n <div class=\"container-fluid\" *ngIf=\"isVisible\">\r\n <div class=\"navbar-brand order-md-0\" [routerLink]=\"['/dashboard']\">\r\n <img alt=\"SmarterPlan\" src=\"../assets/images/logos/logo-immo.png\">\r\n </div>\r\n <div class=\"ms-auto nav-item dropdown profile_pic-container order-md-2\">\r\n <div class=\"profile_pic dropdown-toggle\" data-testid=\"dropdown-menu-button\" data-bs-toggle=\"dropdown\">\r\n <lib-avatar></lib-avatar>\r\n </div>\r\n <div class=\"dropdown-menu dropdown-menu-right\">\r\n <p *ngIf=\"user && mission\" class=\"p-2\">\r\n <span class=\"username\">{{ user.displayName }}</span><br />\r\n <span class=\"user-role\">{{ mission.role }}</span><br />\r\n <span class=\"org\">{{ mission.organisation ? mission.organisation.name : \"No organisation\" |\r\n translate}}</span>\r\n </p>\r\n <div class=\"dropdown-divider\"></div>\r\n <!-- <a class=\"dropdown-item\" routerLink=\"/debug\" *ngIf=\"isManager\">Debug</a> -->\r\n <a class=\"dropdown-item\" (click)=\"localeService.modal()\">{{'Language' | translate}}</a>\r\n <a class=\"dropdown-item\" routerLink=\"/dashboard\">{{'Data management' | translate}}</a>\r\n <a class=\"dropdown-item\" data-testid=\"user-management-btn\" routerLink=\"/admin\" *ngIf=\"isManager\">\r\n {{'Users management' | translate}}</a>\r\n <a class=\"dropdown-item\" routerLink=\"/profile\">\r\n {{'Profile' | translate}}</a>\r\n <div class=\"dropdown-divider\"></div>\r\n <button class=\"dropdown-item\" (click)=\"openSupportForm()\">{{\"Help\" | translate}}</button>\r\n <button data-testid=\"logout-auth-btn\" class=\"dropdown-item\" (click)=\"signOut()\">{{\"Logout\" |\r\n translate}}</button>\r\n </div>\r\n </div>\r\n <button class=\"navbar-toggler order-md-1\" (click)=\"navbarCollapse.toggle()\" type=\"button\"\r\n [attr.aria-expanded]=\"!isCollapsed\" aria-controls=\"navbar-collapse\">\r\n <span class=\"navbar-toggler-icon\"></span>\r\n </button>\r\n <div class=\"navbar-collapse order-md-1\" #navbarCollapse=\"ngbCollapse\" [(ngbCollapse)]=\"isCollapsed\"\r\n [animation]=\"false\">\r\n <form\r\n class=\"form-inline m-0 mt-2 form-container d-flex justify-content-start align-items-start align-items-md-center flex-column flex-md-row flex-nowrap filters-menu-block\">\r\n <div class=\"input-group search-button-container d-flex flex-row flex-nowrap p-0 m-0\">\r\n <input class=\"form-control search-button m-1\" placeholder=\"keyword\" id=\"mainSearchBar\" type=\"text\">\r\n <button class=\"btn btn-outline-primary rounded-pill m-1 w-fit-content h-fit-content align-self-md-center\"\r\n (click)=\"onSubmit()\">{{'Search' |\r\n translate}}</button>\r\n </div>\r\n <div class=\"input-group search-button-container d-flex flex-row flex-nowrap p-0 m-0\">\r\n <div class=\"input-group date-selector m-1\">\r\n <input #dpFromDate class=\"form-control\" placeholder=\"dd/MM/yyyy\" name=\"dpFromDate\"\r\n [value]=\"fromDate | formatDateNumberToDigits\"\r\n (input)=\"fromDate = validateInput(fromDate, dpFromDate.value)\">\r\n <div class=\"input-group-append\">\r\n <button class=\"btn btn-outline-secondary calendar\" (click)=\"datepicker.toggle()\"\r\n type=\"button\"></button>\r\n </div>\r\n </div>\r\n <input name=\"datepicker\" class=\"form-control visually-hidden\" ngbDatepicker #datepicker=\"ngbDatepicker\"\r\n [autoClose]=\"'outside'\" (dateSelect)=\"onDateSelection($event)\" [displayMonths]=\"2\" [dayTemplate]=\"t\"\r\n outsideDays=\"hidden\" [startDate]=\"fromDate || calendar.getToday()\" [container]=\"'body'\" tabindex=\"-1\">\r\n <ng-template #t let-date let-focused=\"focused\">\r\n <span class=\"custom-day\" [class.focused]=\"focused\" [class.range]=\"isRange(date)\"\r\n [class.faded]=\"isHovered(date) || isInside(date)\" (mouseenter)=\"hoveredDate = date\"\r\n (mouseleave)=\"hoveredDate = null\">\r\n {{ date.day }}\r\n </span>\r\n </ng-template>\r\n <span class=\"ms-1 p-2\">{{'to' | translate}}</span>\r\n <div class=\"input-group date-selector m-1\">\r\n <input #dpToDate class=\"form-control\" placeholder=\"dd/MM/yyyy\" name=\"dpToDate\"\r\n [value]=\"toDate | formatDateNumberToDigits\" (input)=\"toDate = validateInput(toDate, dpToDate.value)\">\r\n <div class=\"input-group-append\">\r\n <button class=\"btn btn-outline-secondary calendar\" (click)=\"datepicker.toggle()\"\r\n type=\"button\"></button>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"input-group search-button-container d-flex flex-row flex-nowrap p-0 m-1 justify-content-evenly\">\r\n <button\r\n class=\"btn btn-primary rounded-pill ms-1 w-25 w-md-fit-content h-md-fit-content align-self-md-center\"\r\n type=\"button\" (click)=\"onApply()\" *ngIf=\"!isDateFilterApplied || dateChanged\">\r\n {{'Apply' | translate}}\r\n </button>\r\n <span\r\n class=\"appliedText ms-1 py-2 align-self-md-center pb-md-0 mx-2 w-md-fit-content h-md-fit-content align-self-md-center\"\r\n *ngIf=\"isDateFilterApplied && !dateChanged\">\r\n <span class=\"iconify\" data-icon=\"ion:checkmark\" data-width=\"15\" data-height=\"15\"></span>\r\n {{\"Applied\" | translate}}\r\n </span>\r\n <button\r\n class=\"btn btn-outline-primary rounded-pill w-25 mx-2 w-md-fit-content h-md-fit-content align-self-md-center\"\r\n type=\"button\" (click)=\"onClearDates()\">{{'Clear'\r\n |\r\n translate}}</button>\r\n <div\r\n class=\"change-position-button align-self-end pb-2 align-self-md-center mx-2 pb-md-0 flex-nowrap w-25 w-md-fit-content h-md-fit-content\">\r\n <input type=\"checkbox\" class=\"btn-check\" id=\"btn-check-outlined\" autocomplete=\"off\">\r\n <label class=\"link-primary cursor-pointer text-decoration-underline\" (click)=\"onChangePositionClick()\"\r\n for=\"btn-check-outlined\">{{\r\n (isChangePositionVisible ? \"Close\" : \"Move to\") | translate }}</label>\r\n </div>\r\n </div>\r\n </form>\r\n </div>\r\n </div>\r\n </nav>\r\n <lib-navigation-bar *ngIf=\"isVisible && isChangePositionVisible\"></lib-navigation-bar>\r\n </div>\r\n <div *ngIf=\"isVisitor && isVisible\">\r\n <div class=\"visitor-div\">\r\n <div class=\"logo-container\" data-testid=\"dropdown-menu-button\">\r\n <img class=\"img-logo\" alt=\"SmarterPlanLogo\" src=\"../assets/images/logos/logo-reserve.png\">\r\n </div>\r\n <div class=\"avatar-container-menu\">\r\n <div class=\"profile_pic dropdown-toggle cursor-pointer\" data-bs-toggle=\"dropdown\">\r\n <lib-avatar></lib-avatar>\r\n </div>\r\n <div class=\"dropdown-menu dropdown-menu-right\">\r\n <button class=\"dropdown-item\" (click)=\"localeService.modal()\">{{'Language' | translate}}</button>\r\n <button class=\"dropdown-item\" (click)=\"openSupportForm()\">{{\"Help\" | translate}}</button>\r\n <button data-testid=\"logout-auth-btn\" class=\"dropdown-item\" (click)=\"signOut()\">{{\"Logout\" |\r\n translate}}</button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</div>", styles: ["#menu-bar{position:sticky;top:0;z-index:200}.navbar{z-index:200}.navbar-brand{padding-top:5px;padding-bottom:5px;cursor:pointer}.navbar-brand img{height:70px}.profile_pic{border-radius:50%;height:45px;width:45px;margin:8px;border:.2px solid rgb(150,150,150)}.navbar-nav .profile-pic-container .dropdown-menu{position:absolute}.navbar.second-nav{z-index:199;background-color:var(--smarterplan-primary)}.profile_pic.dropdown-toggle:after{display:none}.navbar-light{border-bottom:1px solid var(--smarterplan-primary);background-color:#fff}.navbar form{width:100%;margin:0;padding:0}input,select{margin-right:15px}.select{background:transparent;border:none;color:#fff;margin:6px 20px 0;width:auto}button{padding:5px 10px}button:disabled,button[disabled]{color:#c04f4f}.navbar-toggler{margin-right:1em}.icon{height:40px;width:40px;color:var(--smarterplan-primary)}.search-button-container{width:auto;align-items:stretch;justify-items:start}.search-button-container .search-button{width:auto;border-radius:1rem!important}.visitor-div{background-color:var(--smarterplan-primary);height:60px;display:flex;justify-content:space-between}.profile_pic-container{margin-right:1em}.logo-container,.img-logo{height:100%}.change-position-button{margin-left:2rem}.change-position-button label,.change-position-button .btn-check:checked,.change-position-button .btn-check:focus,.change-position-button .btn-outline-primary,.change-position-button .btn{box-shadow:none!important;outline:0}.change-position-button label{border-radius:16px}.change-position-button .btn-check:checked+.btn{background-color:var(--smarterplan-primary);color:#fff!important}.filters-menu-block{width:auto}@media (min-width: 1200px){.navbar-brand img{height:100px}.profile_pic{height:60px;width:60px;margin:15px}}@media (min-width: 992px) and (max-width: 1199.98px){.navbar-brand img{height:80px}.profile_pic{height:50px;width:50px;margin:12px}}@media (min-width: 768px) and (max-width: 991.98px){.navbar-brand img{height:60px}.profile_pic{height:40px;width:40px;margin:10px}}@media (max-width: 767.98px){.navbar-brand img{height:50px}.profile_pic{height:30px;width:30px;margin:8px}.search-button-container,.filters-menu-block{width:100%}}.form-container{margin:.5rem 0}.navbar-collapse.show{display:flex;padding-bottom:.5rem}.hidden{width:0;margin:0;border:none;padding:0}.custom-day{text-align:center;padding:.185rem .25rem;display:inline-block;height:2rem;width:2rem}.custom-day.focused{background-color:#e6e6e6}.custom-day.range,.custom-day:hover{background-color:var(--smarterplan-primary-lighter);color:#fff}.custom-day.faded{background-color:var(--smarterplan-primary-transparent)}.calendar{height:100%}.appliedText,.appliedText span{color:var(--smarterplan-primary)}@media (max-width: 767px){.form-inline{flex-direction:column}}.hidden{opacity:0}.date-selector{flex-wrap:nowrap}.date-selector input{min-width:80px;margin:0}@media (min-width: 768px){.w-md-fit-content{width:-moz-fit-content!important;width:fit-content!important}.h-md-content{height:-moz-fit-content!important;height:fit-content!important}}\n"] }]
258
+ }], ctorParameters: function () { return [{ type: i1.Router }, { type: i2.LocaleService }, { type: i3.BaseUserService }, { type: i4.NavigatorService }, { type: i5.SupportService }, { type: i6.BaseVisibilityService }, { type: i7.NgbCalendar }, { type: i7.NgbDateParserFormatter }, { type: i8.FilterService }, { type: i9.AmplifyCacheService }]; }, propDecorators: { cacheName: [{
259
+ type: Input
260
+ }] } });
261
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVudS1iYXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXNtYXJ0ZXJwbGFuLWNvcmUvc3JjL2xpYi9jb21wb25lbnRzL21lbnUtYmFyL21lbnUtYmFyLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1zbWFydGVycGxhbi1jb3JlL3NyYy9saWIvY29tcG9uZW50cy9tZW51LWJhci9tZW51LWJhci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFVLEtBQUssRUFBRSxNQUFNLGVBQWUsQ0FBQztBQVF6RCxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSwwQ0FBMEMsQ0FBQztBQUVqRixPQUFPLEVBQ0wsT0FBTyxHQUdSLE1BQU0sNEJBQTRCLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBSXBDLE1BS2EsZ0JBQWdCO0lBd0NqQjtJQUNEO0lBQ0M7SUFDQTtJQUNBO0lBQ0E7SUFDRDtJQUNBO0lBQ0M7SUFDQTtJQWhEVixJQUFJLENBQWdCO0lBRXBCLE9BQU8sQ0FBVTtJQUVWLFdBQVcsR0FBRyxJQUFJLENBQUM7SUFFMUIsU0FBUyxHQUFHLElBQUksQ0FBQztJQUVqQixTQUFTLEdBQUcsS0FBSyxDQUFDO0lBRWxCLHVCQUF1QixHQUFZLEtBQUssQ0FBQztJQUV6QyxTQUFTLENBQVU7SUFFbkIsZ0JBQWdCLENBQWU7SUFFL0IsZUFBZSxDQUFlO0lBRTlCLFdBQVcsR0FBbUIsSUFBSSxDQUFDO0lBRW5DLFFBQVEsQ0FBaUI7SUFFekIsTUFBTSxDQUFpQjtJQUVkLFNBQVMsQ0FBZ0I7SUFFbEMsS0FBSyxDQUFzQztJQUUzQyxtQkFBbUIsR0FBWSxLQUFLLENBQUM7SUFFckMsV0FBVyxHQUFZLEtBQUssQ0FBQztJQUU3QiwwQkFBMEIsQ0FBZ0I7SUFFbEMsV0FBVyxDQUFvQjtJQUV2Qyxr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RztRQUNyRyxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUU7WUFDakIsTUFBTSxTQUFTLEdBQUcsSUFBSSxJQUFJLENBQ3hCLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUNsQixJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssR0FBRyxDQUFDLEVBQ3ZCLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUNsQixDQUFDO1lBQ0YsWUFBWSxDQUFDLE9BQU8sQ0FBQyxXQUFXLEVBQUUsU0FBUyxDQUFDLE9BQU8sRUFBRSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7U0FDbkU7UUFDRCxJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUU7WUFDZixNQUFNLE9BQU8sR0FBRyxJQUFJLElBQUksQ0FDdEIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQ2hCLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxHQUFHLENBQUMsRUFDckIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQ2hCLENBQUM7WUFDRixZQUFZLENBQUMsT0FBTyxDQUFDLFNBQVMsRUFBRSxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQztTQUMvRDtJQUNILENBQUM7d0dBM1NVLGdCQUFnQjs0RkFBaEIsZ0JBQWdCLHdGQ3ZCN0Isd2xRQTZITTs7U0R0R08sZ0JBQWdCOzRGQUFoQixnQkFBZ0I7a0JBTDVCLFNBQVM7K0JBQ0UsY0FBYztvWEE2QmYsU0FBUztzQkFBakIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgT25Jbml0LCBJbnB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBSb3V0ZXIgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xyXG5pbXBvcnQgeyBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgTG9jYWxlU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2xvY2FsZS5zZXJ2aWNlJztcclxuaW1wb3J0IHsgTmF2aWdhdG9yU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL25hdmlnYXRvci5zZXJ2aWNlJztcclxuaW1wb3J0IHsgU3VwcG9ydFNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9zdXBwb3J0LnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBCYXNlVXNlclNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy91c2VyLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBQcm9maWxlRW50aXR5LCBNaXNzaW9uIH0gZnJvbSAnLi4vLi4vdHlwZXMuc2VydmljZSc7XHJcbmltcG9ydCB7IFN1cHBvcnRNb2RhbENvbXBvbmVudCB9IGZyb20gJy4uL3N1cHBvcnQtbW9kYWwvc3VwcG9ydC1tb2RhbC5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBCYXNlVmlzaWJpbGl0eVNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9iYXNlVmlzaWJpbGl0eS5zZXJ2aWNlJztcclxuaW1wb3J0IHtcclxuICBOZ2JEYXRlLFxyXG4gIE5nYkNhbGVuZGFyLFxyXG4gIE5nYkRhdGVQYXJzZXJGb3JtYXR0ZXIsXHJcbn0gZnJvbSAnQG5nLWJvb3RzdHJhcC9uZy1ib290c3RyYXAnO1xyXG5pbXBvcnQgeyBBbXBsaWZ5Q2FjaGVTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvYW1wbGlmeS1jYWNoZS5zZXJ2aWNlJztcclxuaW1wb3J0IHsgRmlsdGVyU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2ZpbHRlci5zZXJ2aWNlJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnbGliLW1lbnUtYmFyJyxcclxuICB0ZW1wbGF0ZVVybDogJy4vbWVudS1iYXIuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL21lbnUtYmFyLmNvbXBvbmVudC5zY3NzJ10sXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBNZW51QmFyQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcclxuICB1c2VyOiBQcm9maWxlRW50aXR5O1xyXG5cclxuICBtaXNzaW9uOiBNaXNzaW9uO1xyXG5cclxuICBwdWJsaWMgaXNDb2xsYXBzZWQgPSB0cnVlO1xyXG5cclxuICBpc1Zpc2l0b3IgPSB0cnVlO1xyXG5cclxuICBpc1Zpc2libGUgPSBmYWxzZTtcclxuXHJcbiAgaXNDaGFuZ2VQb3NpdGlvblZpc2libGU6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgaXNNYW5hZ2VyOiBib29sZWFuO1xyXG5cclxuICB1c2VyU3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb247XHJcblxyXG4gIG5hdlN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uO1xyXG5cclxuICBob3ZlcmVkRGF0ZTogTmdiRGF0ZSB8IG51bGwgPSBudWxsO1xyXG5cclxuICBmcm9tRGF0ZTogTmdiRGF0ZSB8IG51bGw7XHJcblxyXG4gIHRvRGF0ZTogTmdiRGF0ZSB8IG51bGw7XHJcblxyXG4gIEBJbnB1dCgpIGNhY2hlTmFtZTogc3RyaW5nIHwgbnVsbDtcclxuXHJcbiAgY2FjaGU6IHsgZnJvbTogbnVtYmVyOyB0bzogbnVtYmVyIH0gfCBudWxsO1xyXG5cclxuICBpc0RhdGVGaWx0ZXJBcHBsaWVkOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIGRhdGVDaGFuZ2VkOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIGNoYW5nZVBvc2l0aW9uU3Vic2NyaXB0aW9uPzogU3Vic2NyaXB0aW9uO1xyXG5cclxuICBwcml2YXRlIHNlYXJjaElucHV0PzogSFRNTElucHV0RWxlbWVudDtcclxuXHJcbiAgZmlsdGVyU3Vic2NyaXB0aW9uXHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJpdmF0ZSByb3V0ZXI6IFJvdXRlcixcclxuICAgIHB1YmxpYyBsb2NhbGVTZXJ2aWNlOiBMb2NhbGVTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSB1c2VyU2VydmljZTogQmFzZVVzZXJTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBuYXZpZ2F0b3JTZXJ2aWNlOiBOYXZpZ2F0b3JTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBzdXBwb3J0U2VydmljZTogU3VwcG9ydFNlcnZpY2UsXHJcbiAgICBwcml2YXRlIGJhc2VWaXNpYmlsaXR5U2VydmljZTogQmFzZVZpc2liaWxpdHlTZXJ2aWNlLFxyXG4gICAgcHVibGljIGNhbGVuZGFyOiBOZ2JDYWxlbmRhcixcclxuICAgIHB1YmxpYyBmb3JtYXR0ZXI6IE5nYkRhdGVQYXJzZXJGb3JtYXR0ZXIsXHJcbiAgICBwcml2YXRlIGZpbHRlclNlcnZpY2U6IEZpbHRlclNlcnZpY2UsXHJcbiAgICBwcml2YXRlIGNhY2hlU2VydmljZTogQW1wbGlmeUNhY2hlU2VydmljZVxyXG4gICkge1xyXG4gICAgdGhpcy51c2VyU3Vic2NyaXB0aW9uID0gdGhpcy51c2VyU2VydmljZS5pc0NoYW5nZWQuc3Vic2NyaWJlKFxyXG4gICAgICAoaXNDaGFuZ2VkKSA9PiB7XHJcbiAgICAgICAgaWYgKGlzQ2hhbmdlZCkge1xyXG4gICAgICAgICAgdGhpcy51cGRhdGUoKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICk7XHJcbiAgICB0aGlzLm5hdlN1YnNjcmlwdGlvbiA9IHRoaXMubmF2aWdhdG9yU2VydmljZS5pc1Zpc2libGVDaGFuZ2VkLnN1YnNjcmliZShcclxuICAgICAgKGRhdGEpID0+IHtcclxuICAgICAgICB0aGlzLmlzVmlzaWJsZSA9IGRhdGE7XHJcbiAgICAgIH1cclxuICAgICk7XHJcblxyXG4gICAgdGhpcy5jaGFuZ2VQb3NpdGlvblN1YnNjcmlwdGlvbiA9IHRoaXMuYmFzZVZpc2liaWxpdHlTZXJ2aWNlLmlzQ2hhbmdlUG9zaXRpb25WaXNpYmxlLnN1YnNjcmliZSgoZGF0YSkgPT4ge1xyXG4gICAgICB0aGlzLmlzQ2hhbmdlUG9zaXRpb25WaXNpYmxlID0gZGF0YTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgbmdPbkluaXQoKSB7XHJcbiAgICB0aGlzLnVwZGF0ZSgpO1xyXG5cclxuICAgIGlmICh0aGlzLmNhY2hlTmFtZSkge1xyXG4gICAgICB0aGlzLmNhY2hlID0gdGhpcy5jYWNoZVNlcnZpY2UuZ2V0RnJvbUNhY2hlKHRoaXMuY2FjaGVOYW1lKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5jYWNoZSkge1xyXG4gICAgICB0aGlzLmlzRGF0ZUZpbHRlckFwcGxpZWQgPSB0cnVlO1xyXG4gICAgICBsZXQgeyBmcm9tLCB0byB9ID0gdGhpcy5jYWNoZTtcclxuICAgICAgdGhpcy50b0RhdGUgPSB0aGlzLmdldE5nYkRhdGUodG8pO1xyXG4gICAgICB0aGlzLmZyb21EYXRlID0gdGhpcy5nZXROZ2JEYXRlKGZyb20pO1xyXG5cclxuICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ3N0YXJ0RGF0ZScsIGZyb20udG9TdHJpbmcoKSk7XHJcbiAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCdlbmREYXRlJywgdG8udG9TdHJpbmcoKSk7XHJcbiAgICAgIHRoaXMuZmlsdGVyU2VydmljZS5kYXRlRmlsdGVyVXBkYXRlZChbbmV3IERhdGUoZnJvbSksIG5ldyBEYXRlKHRvKV0pO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5mcm9tRGF0ZSA9IG51bGw7XHJcbiAgICAgIHRoaXMudG9EYXRlID0gbnVsbDtcclxuICAgICAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oJ3N0YXJ0RGF0ZScpO1xyXG4gICAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbSgnZW5kRGF0ZScpO1xyXG5cclxuICAgICAgdGhpcy5maWx0ZXJTZXJ2aWNlLmRhdGVGaWx0ZXJVcGRhdGVkKG51bGwpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIFRoaXMgYWxsb3dzIHVwZGF0aW5nIHRoZSBpbnB1dHMgd2hlbiBtZWFzdXJlbWVudC5zZXJ2aWNlIGNoYW5nZXMgdGhlIGRhdGUgcHJvZ3JhbW1hdGljYWxseVxyXG4gICAgdGhpcy5maWx0ZXJTdWJzY3JpcHRpb24gPSB0aGlzLmZpbHRlclNlcnZpY2Uuc3Vic2NyaWJlVG9EYXRhRmlsdGVyVXBkYXRlKChkYXRlUmFuZ2U6IERhdGVbXSB8IG51bGwpID0+IHtcclxuICAgICAgaWYgKGRhdGVSYW5nZSAmJiBkYXRlUmFuZ2UubGVuZ3RoID09PSAyKSB7XHJcbiAgICAgICAgLy8gMS4gQ29udmVydCBKUyBEYXRlIG9iamVjdHMgdG8gTmdiRGF0ZSBmb3IgZGlzcGxheVxyXG4gICAgICAgIGNvbnN0IGZyb20gPSBkYXRlUmFuZ2VbMF0uZ2V0VGltZSgpO1xyXG4gICAgICAgIGNvbnN0IHRvID0gZGF0ZVJhbmdlWzFdLmdldFRpbWUoKTtcclxuXHJcbiAgICAgICAgdGhpcy5mcm9tRGF0ZSA9IHRoaXMuZ2V0TmdiRGF0ZShmcm9tKTtcclxuICAgICAgICB0aGlzLnRvRGF0ZSA9IHRoaXMuZ2V0TmdiRGF0ZSh0byk7XHJcblxyXG4gICAgICAgIC8vIDIuIFVwZGF0ZSBsb2NhbCBjYWNoZSByZWZlcmVuY2UgdG8gcHJldmVudCB0aGUgXCJBcHBseVwiIGJ1dHRvbiBmcm9tIGFjdGl2YXRpbmdcclxuICAgICAgICB0aGlzLmNhY2hlID0geyBmcm9tLCB0byB9O1xyXG5cclxuICAgICAgICAvLyAzLiBVcGRhdGUgdmlzdWFsIHN0YXRlXHJcbiAgICAgICAgdGhpcy5pc0RhdGVGaWx0ZXJBcHBsaWVkID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLmRhdGVDaGFuZ2VkID0gZmFsc2U7IC8vIFdlIGNvbnNpZGVyIGl0IHN5bmNocm9uaXplZFxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIC8vIElmIHRoZSBmaWx0ZXIgaXMgY2xlYXJlZCBleHRlcm5hbGx5XHJcbiAgICAgICAgdGhpcy5mcm9tRGF0ZSA9IG51bGw7XHJcbiAgICAgICAgdGhpcy50b0RhdGUgPSBudWxsO1xyXG4gICAgICAgIHRoaXMuaXNEYXRlRmlsdGVyQXBwbGllZCA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuY2FjaGUgPSBudWxsO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgb25TZWFyY2hLZXlkb3duID0gKGV2ZW50OiBLZXlib2FyZEV2ZW50KSA9PiB7XHJcbiAgICBpZiAoZXZlbnQua2V5ID09PSAnRW50ZXInKSB0aGlzLm9uU3VibWl0KCk7XHJcbiAgfTtcclxuXHJcbiAgbmdBZnRlclZpZXdJbml0KCkge1xyXG4gICAgdGhpcy5zZWFyY2hJbnB1dCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNtYWluU2VhcmNoQmFyJykgYXMgSFRNTElucHV0RWxlbWVudDtcclxuICAgIHRoaXMuc2VhcmNoSW5wdXQ/LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCB0aGlzLm9uU2VhcmNoS2V5ZG93bik7XHJcbiAgfVxyXG5cclxuICBuZ09uRGVzdHJveSgpIHtcclxuICAgIHRoaXMuc2VhcmNoSW5wdXQ/LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCB0aGlzLm9uU2VhcmNoS2V5ZG93bik7XHJcbiAgICB0aGlzLnVzZXJTdWJzY3JpcHRpb24/LnVuc3Vic2NyaWJlKCk7XHJcbiAgICB0aGlzLm5hdlN1YnNjcmlwdGlvbj8udW5zdWJzY3JpYmUoKTtcclxuICAgIHRoaXMuY2hhbmdlUG9zaXRpb25TdWJzY3JpcHRpb24/LnVuc3Vic2NyaWJlKCk7XHJcbiAgICB0aGlzLmZpbHRlclN1YnNjcmlwdGlvbj8udW5zdWJzY3JpYmUoKTtcclxuICB9XHJcblxyXG4gIGFzeW5jIHNpZ25PdXQoKSB7XHJcbiAgICBhd2FpdCB0aGlzLnVzZXJTZXJ2aWNlLmxvZ291dEN1cnJlbnRBbmRTaWduT3V0QXV0aCgpO1xyXG4gICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoWydhdXRoJ10pO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgdXBkYXRlKCkge1xyXG4gICAgdGhpcy51c2VyID0gdGhpcy51c2VyU2VydmljZS5jdTtcclxuICAgIHRoaXMubWlzc2lvbiA9IHRoaXMudXNlclNlcnZpY2UuY3VycmVudE1pc3Npb25zWzBdO1xyXG4gICAgdGhpcy5pc01hbmFnZXIgPSB0aGlzLnVzZXJTZXJ2aWNlLmhhc01hbmFnZXJSb2xlSW5BbnlNaXNzaW9uKCk7XHJcbiAgICB0aGlzLmlzVmlzaXRvciA9IHRoaXMudXNlclNlcnZpY2UuaXNWaXNpdG9yKCk7XHJcbiAgICBpZiAoIXRoaXMuaXNWaXNpdG9yKSB7XHJcbiAgICAgIHRoaXMuaXNWaXNpYmxlID0gdHJ1ZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBjbGFzcy1tZXRob2RzLXVzZS10aGlzXHJcbiAgb25TdWJtaXQoKSB7XHJcbiAgICBjb25zdCBpbnB1dCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNtYWluU2VhcmNoQmFyJykgYXMgSFRNTElucHV0RWxlbWVudDtcclxuICAgIGNvbnN0IHNlYXJjaFZhbHVlID0gaW5wdXQudmFsdWUudG9Mb3dlckNhc2UoKTtcclxuICAgIGlmIChzZWFyY2hWYWx1ZSAhPT0gJycpIHtcclxuICAgICAgY29uc3QgYmFzZVVybCA9IGxvY2F0aW9uLm9yaWdpbjtcclxuICAgICAgd2luZG93Lm9wZW4oYCR7YmFzZVVybH0vZGFzaGJvYXJkL3NlYXJjaD90ZXJtPSR7c2VhcmNoVmFsdWV9YCwgJ19ibGFuaycpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgb25Ub2dnbGVWaXNpYmxlKCkge1xyXG4gICAgdGhpcy5pc1Zpc2libGUgPSAhdGhpcy5pc1Zpc2libGU7XHJcbiAgfVxyXG5cclxuICBvcGVuU3VwcG9ydEZvcm0oKSB7XHJcbiAgICB0aGlzLnN1cHBvcnRTZXJ2aWNlLm9wZW5TdXBwb3J0Rm9ybShTdXBwb3J0TW9kYWxDb21wb25lbnQpO1xyXG4gIH1cclxuXHJcbiAgb25DaGFuZ2VQb3NpdGlvbkNsaWNrKCkge1xyXG4gICAgdGhpcy5iYXNlVmlzaWJpbGl0eVNlcnZpY2UuaXNDaGFuZ2VQb3NpdGlvblZpc2libGUubmV4dChcclxuICAgICAgIXRoaXMuaXNDaGFuZ2VQb3NpdGlvblZpc2libGVcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBnZXROZ2JEYXRlKGRhdGU6IG51bWJlcik6IE5nYkRhdGUge1xyXG4gICAgbGV0IGR0ID0gbmV3IERhdGUoZGF0ZSk7XHJcbiAgICBkdC5zZXRNaW51dGVzKGR0LmdldE1pbnV0ZXMoKSAtIGR0LmdldFRpbWV6b25lT2Zmc2V0KCkpOyAvLyBjb252ZXJ0IHRvIFVUQ1xyXG4gICAgcmV0dXJuIG5ldyBOZ2JEYXRlKFxyXG4gICAgICBkdC5nZXRVVENGdWxsWWVhcigpLFxyXG4gICAgICBkdC5nZXRVVENNb250aCgpICsgMSxcclxuICAgICAgZHQuZ2V0VVRDRGF0ZSgpXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgb25EYXRlU2VsZWN0aW9uKGRhdGU6IE5nYkRhdGUpIHtcclxuICAgIGlmICghdGhpcy5mcm9tRGF0ZSAmJiAhdGhpcy50b0RhdGUpIHtcclxuICAgICAgdGhpcy5mcm9tRGF0ZSA9IGRhdGU7XHJcbiAgICB9IGVsc2UgaWYgKFxyXG4gICAgICB0aGlzLmZyb21EYXRlICYmXHJcbiAgICAgICF0aGlzLnRvRGF0ZSAmJlxyXG4gICAgICBkYXRlICYmXHJcbiAgICAgIGRhdGUuYWZ0ZXIodGhpcy5mcm9tRGF0ZSlcclxuICAgICkge1xyXG4gICAgICB0aGlzLnRvRGF0ZSA9IGRhdGU7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLnRvRGF0ZSA9IG51bGw7XHJcbiAgICAgIHRoaXMuZnJvbURhdGUgPSBkYXRlO1xyXG4gICAgfVxyXG4gICAgdGhpcy5pc0RhdGVDaGFuZ2VkKCk7XHJcbiAgfVxyXG5cclxuICBpc0RhdGVDaGFuZ2VkKCkge1xyXG4gICAgaWYgKHRoaXMuZnJvbURhdGUgJiYgdGhpcy50b0RhdGUpIHtcclxuICAgICAgaWYgKHRoaXMuY2FjaGUpIHtcclxuICAgICAgICB0aGlzLmRhdGVDaGFuZ2VkID1cclxuICAgICAgICAgICF0aGlzLmZyb21EYXRlLmVxdWFscyh0aGlzLmdldE5nYkRhdGUodGhpcy5jYWNoZS5mcm9tKSkgfHxcclxuICAgICAgICAgICF0aGlzLnRvRGF0ZS5lcXVhbHModGhpcy5nZXROZ2JEYXRlKHRoaXMuY2FjaGUudG8pKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgaXNIb3ZlcmVkKGRhdGU6IE5nYkRhdGUpIHtcclxuICAgIHJldHVybiAoXHJcbiAgICAgIHRoaXMuZnJvbURhdGUgJiZcclxuICAgICAgIXRoaXMudG9EYXRlICYmXHJcbiAgICAgIHRoaXMuaG92ZXJlZERhdGUgJiZcclxuICAgICAgZGF0ZS5hZnRlcih0aGlzLmZyb21EYXRlKSAmJlxyXG4gICAgICBkYXRlLmJlZm9yZSh0aGlzLmhvdmVyZWREYXRlKVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIGlzSW5zaWRlKGRhdGU6IE5nYkRhdGUpIHtcclxuICAgIHJldHVybiB0aGlzLnRvRGF0ZSAmJiBkYXRlLmFmdGVyKHRoaXMuZnJvbURhdGUpICYmIGRhdGUuYmVmb3JlKHRoaXMudG9EYXRlKTtcclxuICB9XHJcblxyXG4gIGlzUmFuZ2UoZGF0ZTogTmdiRGF0ZSkge1xyXG4gICAgcmV0dXJuIChcclxuICAgICAgZGF0ZS5lcXVhbHModGhpcy5mcm9tRGF0ZSkgfHxcclxuICAgICAgKHRoaXMudG9EYXRlICYmIGRhdGUuZXF1YWxzKHRoaXMudG9EYXRlKSkgfHxcclxuICAgICAgdGhpcy5pc0luc2lkZShkYXRlKSB8fFxyXG4gICAgICB0aGlzLmlzSG92ZXJlZChkYXRlKVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIHZhbGlkYXRlSW5wdXQoY3VycmVudFZhbHVlOiBOZ2JEYXRlIHwgbnVsbCwgaW5wdXQ6IHN0cmluZyk6IE5nYkRhdGUgfCBudWxsIHtcclxuICAgIGNvbnN0IHBhcnNlZCA9IHRoaXMuZm9ybWF0dGVyLnBhcnNlKGlucHV0KTtcclxuICAgIHJldHVybiBwYXJzZWQgJiYgdGhpcy5jYWxlbmRhci5pc1ZhbGlkKE5nYkRhdGUuZnJvbShwYXJzZWQpKVxyXG4gICAgICA/IE5nYkRhdGUuZnJvbShwYXJzZWQpXHJcbiAgICAgIDogY3VycmVudFZhbHVlO1xyXG4gIH1cclxuXHJcbiAgZW1pdFJhbmdlKCkge1xyXG4gICAgaWYgKHRoaXMuZnJvbURhdGUgJiYgdGhpcy50b0RhdGUpIHtcclxuICAgICAgY29uc3QgZnJvbSA9IG5ldyBEYXRlKFxyXG4gICAgICAgIHRoaXMuZnJvbURhdGUueWVhcixcclxuICAgICAgICB0aGlzLmZyb21EYXRlLm1vbnRoIC0gMSxcclxuICAgICAgICB0aGlzLmZyb21EYXRlLmRheVxyXG4gICAgICApO1xyXG4gICAgICBjb25zdCB0byA9IG5ldyBEYXRlKFxyXG4gICAgICAgIHRoaXMudG9EYXRlLnllYXIsXHJcbiAgICAgICAgdGhpcy50b0RhdGUubW9udGggLSAxLFxyXG4gICAgICAgIHRoaXMudG9EYXRlLmRheSxcclxuICAgICAgICAyMyxcclxuICAgICAgICA1OVxyXG4gICAgICApO1xyXG4gICAgICB0aGlzLmNhY2hlU2VydmljZS5wdXRJbkNhY2hlKHRoaXMuY2FjaGVOYW1lLCB7XHJcbiAgICAgICAgZnJvbTogZnJvbS5nZXRUaW1lKCksXHJcbiAgICAgICAgdG86IHRvLmdldFRpbWUoKSxcclxuICAgICAgfSk7XHJcbiAgICAgIHRoaXMuY2FjaGUgPSB7IGZyb206IGZyb20uZ2V0VGltZSgpLCB0bzogdG8uZ2V0VGltZSgpIH07XHJcbiAgICAgIHRoaXMuZmlsdGVyU2VydmljZS5kYXRlRmlsdGVyVXBkYXRlZChbZnJvbSwgdG9dKTtcclxuICAgICAgdGhpcy5pc0RhdGVGaWx0ZXJBcHBsaWVkID0gdHJ1ZTtcclxuICAgICAgdGhpcy5kYXRlQ2hhbmdlZCA9IGZhbHNlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgb25DbGVhckRhdGVzKCkge1xyXG4gICAgdGhpcy5mcm9tRGF0ZSA9IG51bGw7XHJcbiAgICB0aGlzLnRvRGF0ZSA9IG51bGw7XHJcbiAgICB0aGlzLmlzRGF0ZUZpbHRlckFwcGxpZWQgPSBmYWxzZTtcclxuICAgIHRoaXMuY2FjaGUgPSBudWxsO1xyXG4gICAgdGhpcy5jYWNoZVNlcnZpY2UucmVtb3ZlRnJvbUNhY2hlKHRoaXMuY2FjaGVOYW1lKTtcclxuICAgIHRoaXMuZmlsdGVyU2VydmljZS5kYXRlRmlsdGVyVXBkYXRlZChudWxsKTtcclxuICB9XHJcblxyXG4gIG9uQXBwbHkoKSB7XHJcbiAgICBpZiAodGhpcy5mcm9tRGF0ZSAmJiB0aGlzLnRvRGF0ZSkge1xyXG4gICAgICB0aGlzLmVtaXRSYW5nZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vdHJhbnNmb3JtIG5nYkRhdGUgdG8gZGF0ZSBvYmpldCB0aGVuIHB1dCBkYXRlcyBpbiB0aW1lc3RhbXAgaW4gbG9jYWxTdG9yYWdlIHRvIHNoYXJlIGl0IHdpdGggUmV0b29sXHJcbiAgICBpZiAodGhpcy5mcm9tRGF0ZSkge1xyXG4gICAgICBjb25zdCBzdGFydERhdGUgPSBuZXcgRGF0ZShcclxuICAgICAgICB0aGlzLmZyb21EYXRlLnllYXIsXHJcbiAgICAgICAgdGhpcy5mcm9tRGF0ZS5tb250aCAtIDEsXHJcbiAgICAgICAgdGhpcy5mcm9tRGF0ZS5kYXlcclxuICAgICAgKTtcclxuICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ3N0YXJ0RGF0ZScsIHN0YXJ0RGF0ZS5nZXRUaW1lKCkudG9TdHJpbmcoKSk7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy50b0RhdGUpIHtcclxuICAgICAgY29uc3QgZW5kRGF0ZSA9IG5ldyBEYXRlKFxyXG4gICAgICAgIHRoaXMudG9EYXRlLnllYXIsXHJcbiAgICAgICAgdGhpcy50b0RhdGUubW9udGggLSAxLFxyXG4gICAgICAgIHRoaXMudG9EYXRlLmRheVxyXG4gICAgICApO1xyXG4gICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgnZW5kRGF0ZScsIGVuZERhdGUuZ2V0VGltZSgpLnRvU3RyaW5nKCkpO1xyXG4gICAgfVxyXG4gIH1cclxufVxyXG4iLCI8ZGl2IGlkPVwibWVudS1iYXJcIj5cclxuICA8ZGl2ICpuZ0lmPVwiIWlzVmlzaXRvclwiPlxyXG4gICAgPG5hdiBjbGFzcz1cIm5hdmJhciBuYXZiYXItZXhwYW5kLW1kIG5hdmJhci1saWdodCBwLTBcIj5cclxuICAgICAgPGRpdiBjbGFzcz1cImNvbnRhaW5lci1mbHVpZFwiICpuZ0lmPVwiaXNWaXNpYmxlXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cIm5hdmJhci1icmFuZCBvcmRlci1tZC0wXCIgW3JvdXRlckxpbmtdPVwiWycvZGFzaGJvYXJkJ11cIj5cclxuICAgICAgICAgIDxpbWcgYWx0PVwiU21hcnRlclBsYW5cIiBzcmM9XCIuLi9hc3NldHMvaW1hZ2VzL2xvZ29zL2xvZ28taW1tby5wbmdcIj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwibXMtYXV0byBuYXYtaXRlbSBkcm9wZG93biBwcm9maWxlX3BpYy1jb250YWluZXIgb3JkZXItbWQtMlwiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cInByb2ZpbGVfcGljIGRyb3Bkb3duLXRvZ2dsZVwiIGRhdGEtdGVzdGlkPVwiZHJvcGRvd24tbWVudS1idXR0b25cIiBkYXRhLWJzLXRvZ2dsZT1cImRyb3Bkb3duXCI+XHJcbiAgICAgICAgICAgIDxsaWItYXZhdGFyPjwvbGliLWF2YXRhcj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImRyb3Bkb3duLW1lbnUgZHJvcGRvd24tbWVudS1yaWdodFwiPlxyXG4gICAgICAgICAgICA8cCAqbmdJZj1cInVzZXIgJiYgbWlzc2lvblwiIGNsYXNzPVwicC0yXCI+XHJcbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ1c2VybmFtZVwiPnt7IHVzZXIuZGlzcGxheU5hbWUgfX08L3NwYW4+PGJyIC8+XHJcbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ1c2VyLXJvbGVcIj57eyBtaXNzaW9uLnJvbGUgfX08L3NwYW4+PGJyIC8+XHJcbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJvcmdcIj57eyBtaXNzaW9uLm9yZ2FuaXNhdGlvbiA/IG1pc3Npb24ub3JnYW5pc2F0aW9uLm5hbWUgOiBcIk5vIG9yZ2FuaXNhdGlvblwiIHxcclxuICAgICAgICAgICAgICAgIHRyYW5zbGF0ZX19PC9zcGFuPlxyXG4gICAgICAgICAgICA8L3A+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkcm9wZG93bi1kaXZpZGVyXCI+PC9kaXY+XHJcbiAgICAgICAgICAgIDwhLS0gPGEgY2xhc3M9XCJkcm9wZG93bi1pdGVtXCIgcm91dGVyTGluaz1cIi9kZWJ1Z1wiICpuZ0lmPVwiaXNNYW5hZ2VyXCI+RGVidWc8L2E+IC0tPlxyXG4gICAgICAgICAgICA8YSBjbGFzcz1cImRyb3Bkb3duLWl0ZW1cIiAoY2xpY2spPVwibG9jYWxlU2VydmljZS5tb2RhbCgpXCI+e3snTGFuZ3VhZ2UnIHwgdHJhbnNsYXRlfX08L2E+XHJcbiAgICAgICAgICAgIDxhIGNsYXNzPVwiZHJvcGRvd24taXRlbVwiIHJvdXRlckxpbms9XCIvZGFzaGJvYXJkXCI+e3snRGF0YSBtYW5hZ2VtZW50JyB8IHRyYW5zbGF0ZX19PC9hPlxyXG4gICAgICAgICAgICA8YSBjbGFzcz1cImRyb3Bkb3duLWl0ZW1cIiBkYXRhLXRlc3RpZD1cInVzZXItbWFuYWdlbWVudC1idG5cIiByb3V0ZXJMaW5rPVwiL2FkbWluXCIgKm5nSWY9XCJpc01hbmFnZXJcIj5cclxuICAgICAgICAgICAgICB7eydVc2VycyBtYW5hZ2VtZW50JyB8IHRyYW5zbGF0ZX19PC9hPlxyXG4gICAgICAgICAgICA8YSBjbGFzcz1cImRyb3Bkb3duLWl0ZW1cIiByb3V0ZXJMaW5rPVwiL3Byb2ZpbGVcIj5cclxuICAgICAgICAgICAgICB7eydQcm9maWxlJyB8IHRyYW5zbGF0ZX19PC9hPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZHJvcGRvd24tZGl2aWRlclwiPjwvZGl2PlxyXG4gICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiZHJvcGRvd24taXRlbVwiIChjbGljayk9XCJvcGVuU3VwcG9ydEZvcm0oKVwiPnt7XCJIZWxwXCIgfCB0cmFuc2xhdGV9fTwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8YnV0dG9uIGRhdGEtdGVzdGlkPVwibG9nb3V0LWF1dGgtYnRuXCIgY2xhc3M9XCJkcm9wZG93bi1pdGVtXCIgKGNsaWNrKT1cInNpZ25PdXQoKVwiPnt7XCJMb2dvdXRcIiB8XHJcbiAgICAgICAgICAgICAgdHJhbnNsYXRlfX08L2J1dHRvbj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJuYXZiYXItdG9nZ2xlciBvcmRlci1tZC0xXCIgKGNsaWNrKT1cIm5hdmJhckNvbGxhcHNlLnRvZ2dsZSgpXCIgdHlwZT1cImJ1dHRvblwiXHJcbiAgICAgICAgICBbYXR0ci5hcmlhLWV4cGFuZGVkXT1cIiFpc0NvbGxhcHNlZFwiIGFyaWEtY29udHJvbHM9XCJuYXZiYXItY29sbGFwc2VcIj5cclxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwibmF2YmFyLXRvZ2dsZXItaWNvblwiPjwvc3Bhbj5cclxuICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwibmF2YmFyLWNvbGxhcHNlIG9yZGVyLW1kLTFcIiAjbmF2YmFyQ29sbGFwc2U9XCJuZ2JDb2xsYXBzZVwiIFsobmdiQ29sbGFwc2UpXT1cImlzQ29sbGFwc2VkXCJcclxuICAgICAgICAgIFthbmltYXRpb25dPVwiZmFsc2VcIj5cclxuICAgICAgICAgIDxmb3JtXHJcbiAgICAgICAgICAgIGNsYXNzPVwiZm9ybS1pbmxpbmUgbS0wIG10LTIgZm9ybS1jb250YWluZXIgZC1mbGV4IGp1c3RpZnktY29udGVudC1zdGFydCBhbGlnbi1pdGVtcy1zdGFydCBhbGlnbi1pdGVtcy1tZC1jZW50ZXIgZmxleC1jb2x1bW4gZmxleC1tZC1yb3cgZmxleC1ub3dyYXAgZmlsdGVycy1tZW51LWJsb2NrXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbnB1dC1ncm91cCBzZWFyY2gtYnV0dG9uLWNvbnRhaW5lciBkLWZsZXggZmxleC1yb3cgZmxleC1ub3dyYXAgcC0wIG0tMFwiPlxyXG4gICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz1cImZvcm0tY29udHJvbCBzZWFyY2gtYnV0dG9uIG0tMVwiIHBsYWNlaG9sZGVyPVwia2V5d29yZFwiIGlkPVwibWFpblNlYXJjaEJhclwiIHR5cGU9XCJ0ZXh0XCI+XHJcbiAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tb3V0bGluZS1wcmltYXJ5IHJvdW5kZWQtcGlsbCBtLTEgdy1maXQtY29udGVudCBoLWZpdC1jb250ZW50IGFsaWduLXNlbGYtbWQtY2VudGVyXCJcclxuICAgICAgICAgICAgICAgIChjbGljayk9XCJvblN1Ym1pdCgpXCI+e3snU2VhcmNoJyB8XHJcbiAgICAgICAgICAgICAgICB0cmFuc2xhdGV9fTwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImlucHV0LWdyb3VwIHNlYXJjaC1idXR0b24tY29udGFpbmVyIGQtZmxleCBmbGV4LXJvdyBmbGV4LW5vd3JhcCBwLTAgbS0wXCI+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImlucHV0LWdyb3VwIGRhdGUtc2VsZWN0b3IgbS0xXCI+XHJcbiAgICAgICAgICAgICAgICA8aW5wdXQgI2RwRnJvbURhdGUgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBwbGFjZWhvbGRlcj1cImRkL01NL3l5eXlcIiBuYW1lPVwiZHBGcm9tRGF0ZVwiXHJcbiAgICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJmcm9tRGF0ZSB8IGZvcm1hdERhdGVOdW1iZXJUb0RpZ2l0c1wiXHJcbiAgICAgICAgICAgICAgICAgIChpbnB1dCk9XCJmcm9tRGF0ZSA9IHZhbGlkYXRlSW5wdXQoZnJvbURhdGUsIGRwRnJvbURhdGUudmFsdWUpXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW5wdXQtZ3JvdXAtYXBwZW5kXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLW91dGxpbmUtc2Vjb25kYXJ5IGNhbGVuZGFyXCIgKGNsaWNrKT1cImRhdGVwaWNrZXIudG9nZ2xlKClcIlxyXG4gICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIj48L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDxpbnB1dCBuYW1lPVwiZGF0ZXBpY2tlclwiIGNsYXNzPVwiZm9ybS1jb250cm9sIHZpc3VhbGx5LWhpZGRlblwiIG5nYkRhdGVwaWNrZXIgI2RhdGVwaWNrZXI9XCJuZ2JEYXRlcGlja2VyXCJcclxuICAgICAgICAgICAgICAgIFthdXRvQ2xvc2VdPVwiJ291dHNpZGUnXCIgKGRhdGVTZWxlY3QpPVwib25EYXRlU2VsZWN0aW9uKCRldmVudClcIiBbZGlzcGxheU1vbnRoc109XCIyXCIgW2RheVRlbXBsYXRlXT1cInRcIlxyXG4gICAgICAgICAgICAgICAgb3V0c2lkZURheXM9XCJoaWRkZW5cIiBbc3RhcnREYXRlXT1cImZyb21EYXRlIHx8IGNhbGVuZGFyLmdldFRvZGF5KClcIiBbY29udGFpbmVyXT1cIidib2R5J1wiIHRhYmluZGV4PVwiLTFcIj5cclxuICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI3QgbGV0LWRhdGUgbGV0LWZvY3VzZWQ9XCJmb2N1c2VkXCI+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImN1c3RvbS1kYXlcIiBbY2xhc3MuZm9jdXNlZF09XCJmb2N1c2VkXCIgW2NsYXNzLnJhbmdlXT1cImlzUmFuZ2UoZGF0ZSlcIlxyXG4gICAgICAgICAgICAgICAgICBbY2xhc3MuZmFkZWRdPVwiaXNIb3ZlcmVkKGRhdGUpIHx8IGlzSW5zaWRlKGRhdGUpXCIgKG1vdXNlZW50ZXIpPVwiaG92ZXJlZERhdGUgPSBkYXRlXCJcclxuICAgICAgICAgICAgICAgICAgKG1vdXNlbGVhdmUpPVwiaG92ZXJlZERhdGUgPSBudWxsXCI+XHJcbiAgICAgICAgICAgICAgICAgIHt7IGRhdGUuZGF5IH19XHJcbiAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1zLTEgcC0yXCI+e3sndG8nIHwgdHJhbnNsYXRlfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImlucHV0LWdyb3VwIGRhdGUtc2VsZWN0b3IgbS0xXCI+XHJcbiAgICAgICAgICAgICAgICA8aW5wdXQgI2RwVG9EYXRlIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgcGxhY2Vob2xkZXI9XCJkZC9NTS95eXl5XCIgbmFtZT1cImRwVG9EYXRlXCJcclxuICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cInRvRGF0ZSB8IGZvcm1hdERhdGVOdW1iZXJUb0RpZ2l0c1wiIChpbnB1dCk9XCJ0b0RhdGUgPSB2YWxpZGF0ZUlucHV0KHRvRGF0ZSwgZHBUb0RhdGUudmFsdWUpXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW5wdXQtZ3JvdXAtYXBwZW5kXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLW91dGxpbmUtc2Vjb25kYXJ5IGNhbGVuZGFyXCIgKGNsaWNrKT1cImRhdGVwaWNrZXIudG9nZ2xlKClcIlxyXG4gICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIj48L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImlucHV0LWdyb3VwIHNlYXJjaC1idXR0b24tY29udGFpbmVyIGQtZmxleCBmbGV4LXJvdyBmbGV4LW5vd3JhcCBwLTAgbS0xIGp1c3RpZnktY29udGVudC1ldmVubHlcIj5cclxuICAgICAgICAgICAgICA8YnV0dG9uXHJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImJ0biBidG4tcHJpbWFyeSByb3VuZGVkLXBpbGwgbXMtMSB3LTI1IHctbWQtZml0LWNvbnRlbnQgaC1tZC1maXQtY29udGVudCBhbGlnbi1zZWxmLW1kLWNlbnRlclwiXHJcbiAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cIm9uQXBwbHkoKVwiICpuZ0lmPVwiIWlzRGF0ZUZpbHRlckFwcGxpZWQgfHwgZGF0ZUNoYW5nZWRcIj5cclxuICAgICAgICAgICAgICAgIHt7J0FwcGx5JyB8IHRyYW5zbGF0ZX19XHJcbiAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgPHNwYW5cclxuICAgICAgICAgICAgICAgIGNsYXNzPVwiYXBwbGllZFRleHQgbXMtMSBweS0yIGFsaWduLXNlbGYtbWQtY2VudGVyIHBiLW1kLTAgbXgtMiB3LW1kLWZpdC1jb250ZW50IGgtbWQtZml0LWNvbnRlbnQgYWxpZ24tc2VsZi1tZC1jZW50ZXJcIlxyXG4gICAgICAgICAgICAgICAgKm5nSWY9XCJpc0RhdGVGaWx0ZXJBcHBsaWVkICYmICFkYXRlQ2hhbmdlZFwiPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJpY29uaWZ5XCIgZGF0YS1pY29uPVwiaW9uOmNoZWNrbWFya1wiIGRhdGEtd2lkdGg9XCIxNVwiIGRhdGEtaGVpZ2h0PVwiMTVcIj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICB7e1wiQXBwbGllZFwiIHwgdHJhbnNsYXRlfX1cclxuICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgPGJ1dHRvblxyXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJidG4gYnRuLW91dGxpbmUtcHJpbWFyeSByb3VuZGVkLXBpbGwgdy0yNSBteC0yIHctbWQtZml0LWNvbnRlbnQgaC1tZC1maXQtY29udGVudCBhbGlnbi1zZWxmLW1kLWNlbnRlclwiXHJcbiAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cIm9uQ2xlYXJEYXRlcygpXCI+e3snQ2xlYXInXHJcbiAgICAgICAgICAgICAgICB8XHJcbiAgICAgICAgICAgICAgICB0cmFuc2xhdGV9fTwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgICAgIGNsYXNzPVwiY2hhbmdlLXBvc2l0aW9uLWJ1dHRvbiBhbGlnbi1zZWxmLWVuZCBwYi0yIGFsaWduLXNlbGYtbWQtY2VudGVyIG14LTIgcGItbWQtMCBmbGV4LW5vd3JhcCB3LTI1IHctbWQtZml0LWNvbnRlbnQgaC1tZC1maXQtY29udGVudFwiPlxyXG4gICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIGNsYXNzPVwiYnRuLWNoZWNrXCIgaWQ9XCJidG4tY2hlY2stb3V0bGluZWRcIiBhdXRvY29tcGxldGU9XCJvZmZcIj5cclxuICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImxpbmstcHJpbWFyeSBjdXJzb3ItcG9pbnRlciB0ZXh0LWRlY29yYXRpb24tdW5kZXJsaW5lXCIgKGNsaWNrKT1cIm9uQ2hhbmdlUG9zaXRpb25DbGljaygpXCJcclxuICAgICAgICAgICAgICAgICAgZm9yPVwiYnRuLWNoZWNrLW91dGxpbmVkXCI+e3tcclxuICAgICAgICAgICAgICAgICAgKGlzQ2hhbmdlUG9zaXRpb25WaXNpYmxlID8gXCJDbG9zZVwiIDogXCJNb3ZlIHRvXCIpIHwgdHJhbnNsYXRlIH19PC9sYWJlbD5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L2Zvcm0+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9uYXY+XHJcbiAgICA8bGliLW5hdmlnYXRpb24tYmFyICpuZ0lmPVwiaXNWaXNpYmxlICYmIGlzQ2hhbmdlUG9zaXRpb25WaXNpYmxlXCI+PC9saWItbmF2aWdhdGlvbi1iYXI+XHJcbiAgPC9kaXY+XHJcbiAgPGRpdiAqbmdJZj1cImlzVmlzaXRvciAmJiBpc1Zpc2libGVcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJ2aXNpdG9yLWRpdlwiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwibG9nby1jb250YWluZXJcIiBkYXRhLXRlc3RpZD1cImRyb3Bkb3duLW1lbnUtYnV0dG9uXCI+XHJcbiAgICAgICAgPGltZyBjbGFzcz1cImltZy1sb2dvXCIgYWx0PVwiU21hcnRlclBsYW5Mb2dvXCIgc3JjPVwiLi4vYXNzZXRzL2ltYWdlcy9sb2dvcy9sb2dvLXJlc2VydmUucG5nXCI+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiYXZhdGFyLWNvbnRhaW5lci1tZW51XCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInByb2ZpbGVfcGljIGRyb3Bkb3duLXRvZ2dsZSBjdXJzb3ItcG9pbnRlclwiIGRhdGEtYnMtdG9nZ2xlPVwiZHJvcGRvd25cIj5cclxuICAgICAgICAgIDxsaWItYXZhdGFyPjwvbGliLWF2YXRhcj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZHJvcGRvd24tbWVudSBkcm9wZG93bi1tZW51LXJpZ2h0XCI+XHJcbiAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiZHJvcGRvd24taXRlbVwiIChjbGljayk9XCJsb2NhbGVTZXJ2aWNlLm1vZGFsKClcIj57eydMYW5ndWFnZScgfCB0cmFuc2xhdGV9fTwvYnV0dG9uPlxyXG4gICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImRyb3Bkb3duLWl0ZW1cIiAoY2xpY2spPVwib3BlblN1cHBvcnRGb3JtKClcIj57e1wiSGVscFwiIHwgdHJhbnNsYXRlfX08L2J1dHRvbj5cclxuICAgICAgICAgIDxidXR0b24gZGF0YS10ZXN0aWQ9XCJsb2dvdXQtYXV0aC1idG5cIiBjbGFzcz1cImRyb3Bkb3duLWl0ZW1cIiAoY2xpY2spPVwic2lnbk91dCgpXCI+e3tcIkxvZ291dFwiIHxcclxuICAgICAgICAgICAgdHJhbnNsYXRlfX08L2J1dHRvbj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICA8L2Rpdj5cclxuPC9kaXY+Il19