@cleavelandprice/ngx-lib 4.4.13 → 4.4.15

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 (360) hide show
  1. package/README.md +5 -5
  2. package/active-directory/index.d.ts +120 -5
  3. package/active-directory/material/index.d.ts +161 -5
  4. package/authentication/index.d.ts +57 -5
  5. package/authentication/material/index.d.ts +81 -5
  6. package/authentication/object/index.d.ts +37 -5
  7. package/authentication/token/index.d.ts +60 -5
  8. package/dialog/index.d.ts +106 -5
  9. package/fesm2022/cleavelandprice-ngx-lib-active-directory-material.mjs +17 -17
  10. package/fesm2022/cleavelandprice-ngx-lib-active-directory-material.mjs.map +1 -1
  11. package/fesm2022/cleavelandprice-ngx-lib-active-directory.mjs +8 -8
  12. package/fesm2022/cleavelandprice-ngx-lib-active-directory.mjs.map +1 -1
  13. package/fesm2022/cleavelandprice-ngx-lib-authentication-material.mjs +18 -18
  14. package/fesm2022/cleavelandprice-ngx-lib-authentication-material.mjs.map +1 -1
  15. package/fesm2022/cleavelandprice-ngx-lib-authentication-object.mjs +8 -8
  16. package/fesm2022/cleavelandprice-ngx-lib-authentication-object.mjs.map +1 -1
  17. package/fesm2022/cleavelandprice-ngx-lib-authentication-token.mjs +8 -8
  18. package/fesm2022/cleavelandprice-ngx-lib-authentication-token.mjs.map +1 -1
  19. package/fesm2022/cleavelandprice-ngx-lib-authentication.mjs +5 -5
  20. package/fesm2022/cleavelandprice-ngx-lib-authentication.mjs.map +1 -1
  21. package/fesm2022/cleavelandprice-ngx-lib-dialog.mjs +27 -27
  22. package/fesm2022/cleavelandprice-ngx-lib-dialog.mjs.map +1 -1
  23. package/fesm2022/cleavelandprice-ngx-lib-msgraph.mjs +5 -5
  24. package/fesm2022/cleavelandprice-ngx-lib-msgraph.mjs.map +1 -1
  25. package/fesm2022/cleavelandprice-ngx-lib-quill-mention.mjs +12 -12
  26. package/fesm2022/cleavelandprice-ngx-lib-quill-mention.mjs.map +1 -1
  27. package/fesm2022/cleavelandprice-ngx-lib-quill.mjs +32 -32
  28. package/fesm2022/cleavelandprice-ngx-lib-quill.mjs.map +1 -1
  29. package/fesm2022/cleavelandprice-ngx-lib-sharepoint.mjs +18 -18
  30. package/fesm2022/cleavelandprice-ngx-lib-sharepoint.mjs.map +1 -1
  31. package/fesm2022/cleavelandprice-ngx-lib-table.mjs +54 -29
  32. package/fesm2022/cleavelandprice-ngx-lib-table.mjs.map +1 -1
  33. package/fesm2022/cleavelandprice-ngx-lib-upload.mjs +15 -15
  34. package/fesm2022/cleavelandprice-ngx-lib-upload.mjs.map +1 -1
  35. package/fesm2022/cleavelandprice-ngx-lib-url-utilities.mjs +13 -13
  36. package/fesm2022/cleavelandprice-ngx-lib-url-utilities.mjs.map +1 -1
  37. package/fesm2022/cleavelandprice-ngx-lib.mjs +8 -8
  38. package/fesm2022/cleavelandprice-ngx-lib.mjs.map +1 -1
  39. package/index.d.ts +91 -5
  40. package/msgraph/index.d.ts +211 -5
  41. package/package.json +3 -33
  42. package/quill/index.d.ts +200 -5
  43. package/quill/mention/index.d.ts +33 -5
  44. package/sharepoint/index.d.ts +138 -5
  45. package/table/index.d.ts +146 -5
  46. package/upload/index.d.ts +135 -5
  47. package/url-utilities/index.d.ts +35 -5
  48. package/active-directory/active-directory.api.d.ts +0 -10
  49. package/active-directory/active-directory.module.d.ts +0 -11
  50. package/active-directory/material/components/user-chooser/user-chooser.component.d.ts +0 -58
  51. package/active-directory/material/components/user-form-field/user-form-field.component.d.ts +0 -27
  52. package/active-directory/material/mat-active-directory.api.d.ts +0 -10
  53. package/active-directory/material/mat-active-directory.module.d.ts +0 -25
  54. package/active-directory/material/model/default-user-chooser-data.d.ts +0 -2
  55. package/active-directory/material/model/default-user-chooser-filter-options.d.ts +0 -2
  56. package/active-directory/material/model/selectable-group.d.ts +0 -4
  57. package/active-directory/material/model/selectable-user.d.ts +0 -5
  58. package/active-directory/material/model/user-chooser-data.d.ts +0 -25
  59. package/active-directory/material/model/user-chooser-filter-options.d.ts +0 -7
  60. package/active-directory/material/model/user-chooser-mode.d.ts +0 -4
  61. package/active-directory/material/model/user-chooser-pre-processing-group.d.ts +0 -6
  62. package/active-directory/model/active-directory-service-options-token.d.ts +0 -3
  63. package/active-directory/model/active-directory-service-options.d.ts +0 -5
  64. package/active-directory/model/ad-object-with-children.d.ts +0 -4
  65. package/active-directory/model/ad-object.d.ts +0 -13
  66. package/active-directory/model/cache-object.d.ts +0 -5
  67. package/active-directory/model/cleaveland-price-user.d.ts +0 -19
  68. package/active-directory/model/group.d.ts +0 -7
  69. package/active-directory/model/user-or-group.d.ts +0 -7
  70. package/active-directory/model/user.d.ts +0 -23
  71. package/active-directory/services/active-directory.service.d.ts +0 -31
  72. package/authentication/authentication.api.d.ts +0 -6
  73. package/authentication/authentication.base.module.d.ts +0 -11
  74. package/authentication/material/components/login/login.component.d.ts +0 -14
  75. package/authentication/material/components/login-form/login-form.component.d.ts +0 -27
  76. package/authentication/material/mat-authentication.api.d.ts +0 -7
  77. package/authentication/material/mat-authentication.module.d.ts +0 -21
  78. package/authentication/material/model/login-form-data.d.ts +0 -4
  79. package/authentication/material/model/mat-authentication-service-options-token.d.ts +0 -3
  80. package/authentication/material/model/mat-authentication-service-options.d.ts +0 -4
  81. package/authentication/material/services/mat-authentication.service.d.ts +0 -11
  82. package/authentication/model/abstract-authentication-service.d.ts +0 -16
  83. package/authentication/model/authenticated-user.d.ts +0 -9
  84. package/authentication/model/authentication-request.d.ts +0 -8
  85. package/authentication/model/authentication-service-options-token.d.ts +0 -3
  86. package/authentication/model/authentication-service-options.d.ts +0 -6
  87. package/authentication/object/authentication-object.api.d.ts +0 -3
  88. package/authentication/object/authentication-object.module.d.ts +0 -11
  89. package/authentication/object/services/authentication-object.service.d.ts +0 -24
  90. package/authentication/token/authentication-token.api.d.ts +0 -5
  91. package/authentication/token/authetiction-token.module.d.ts +0 -11
  92. package/authentication/token/model/authentication-token-service-options-token.d.ts +0 -3
  93. package/authentication/token/model/authentication-token-service-options.d.ts +0 -4
  94. package/authentication/token/model/authentication-token.d.ts +0 -17
  95. package/authentication/token/services/authentication-token.service.d.ts +0 -24
  96. package/dialog/components/base/base.component.d.ts +0 -23
  97. package/dialog/components/choice/choice.component.d.ts +0 -13
  98. package/dialog/components/confirmation/confirmation.component.d.ts +0 -13
  99. package/dialog/components/input/input.component.d.ts +0 -13
  100. package/dialog/components/message/message.component.d.ts +0 -13
  101. package/dialog/dialog.api.d.ts +0 -9
  102. package/dialog/dialog.module.d.ts +0 -18
  103. package/dialog/model/confirmation-dialog-mode.d.ts +0 -6
  104. package/dialog/model/dialog-base-data.d.ts +0 -10
  105. package/dialog/model/dialog-choice-data.d.ts +0 -4
  106. package/dialog/model/dialog-type.d.ts +0 -6
  107. package/esm2022/active-directory/active-directory.api.mjs +0 -11
  108. package/esm2022/active-directory/active-directory.module.mjs +0 -40
  109. package/esm2022/active-directory/cleavelandprice-ngx-lib-active-directory.mjs +0 -5
  110. package/esm2022/active-directory/material/cleavelandprice-ngx-lib-active-directory-material.mjs +0 -5
  111. package/esm2022/active-directory/material/components/user-chooser/user-chooser.component.mjs +0 -437
  112. package/esm2022/active-directory/material/components/user-form-field/user-form-field.component.mjs +0 -159
  113. package/esm2022/active-directory/material/mat-active-directory.api.mjs +0 -11
  114. package/esm2022/active-directory/material/mat-active-directory.module.mjs +0 -100
  115. package/esm2022/active-directory/material/model/default-user-chooser-data.mjs +0 -15
  116. package/esm2022/active-directory/material/model/default-user-chooser-filter-options.mjs +0 -8
  117. package/esm2022/active-directory/material/model/selectable-group.mjs +0 -2
  118. package/esm2022/active-directory/material/model/selectable-user.mjs +0 -2
  119. package/esm2022/active-directory/material/model/user-chooser-data.mjs +0 -2
  120. package/esm2022/active-directory/material/model/user-chooser-filter-options.mjs +0 -3
  121. package/esm2022/active-directory/material/model/user-chooser-mode.mjs +0 -6
  122. package/esm2022/active-directory/material/model/user-chooser-pre-processing-group.mjs +0 -3
  123. package/esm2022/active-directory/model/active-directory-service-options-token.mjs +0 -3
  124. package/esm2022/active-directory/model/active-directory-service-options.mjs +0 -2
  125. package/esm2022/active-directory/model/ad-object-with-children.mjs +0 -2
  126. package/esm2022/active-directory/model/ad-object.mjs +0 -2
  127. package/esm2022/active-directory/model/cache-object.mjs +0 -3
  128. package/esm2022/active-directory/model/cleaveland-price-user.mjs +0 -2
  129. package/esm2022/active-directory/model/group.mjs +0 -2
  130. package/esm2022/active-directory/model/user-or-group.mjs +0 -2
  131. package/esm2022/active-directory/model/user.mjs +0 -2
  132. package/esm2022/active-directory/services/active-directory.service.mjs +0 -131
  133. package/esm2022/authentication/authentication.api.mjs +0 -7
  134. package/esm2022/authentication/authentication.base.module.mjs +0 -40
  135. package/esm2022/authentication/cleavelandprice-ngx-lib-authentication.mjs +0 -5
  136. package/esm2022/authentication/material/cleavelandprice-ngx-lib-authentication-material.mjs +0 -5
  137. package/esm2022/authentication/material/components/login/login.component.mjs +0 -49
  138. package/esm2022/authentication/material/components/login-form/login-form.component.mjs +0 -82
  139. package/esm2022/authentication/material/mat-authentication.api.mjs +0 -8
  140. package/esm2022/authentication/material/mat-authentication.module.mjs +0 -84
  141. package/esm2022/authentication/material/model/login-form-data.mjs +0 -2
  142. package/esm2022/authentication/material/model/mat-authentication-service-options-token.mjs +0 -3
  143. package/esm2022/authentication/material/model/mat-authentication-service-options.mjs +0 -2
  144. package/esm2022/authentication/material/services/mat-authentication.service.mjs +0 -67
  145. package/esm2022/authentication/model/abstract-authentication-service.mjs +0 -2
  146. package/esm2022/authentication/model/authenticated-user.mjs +0 -2
  147. package/esm2022/authentication/model/authentication-request.mjs +0 -2
  148. package/esm2022/authentication/model/authentication-service-options-token.mjs +0 -3
  149. package/esm2022/authentication/model/authentication-service-options.mjs +0 -2
  150. package/esm2022/authentication/object/authentication-object.api.mjs +0 -6
  151. package/esm2022/authentication/object/authentication-object.module.mjs +0 -40
  152. package/esm2022/authentication/object/cleavelandprice-ngx-lib-authentication-object.mjs +0 -5
  153. package/esm2022/authentication/object/services/authentication-object.service.mjs +0 -129
  154. package/esm2022/authentication/token/authentication-token.api.mjs +0 -6
  155. package/esm2022/authentication/token/authetiction-token.module.mjs +0 -40
  156. package/esm2022/authentication/token/cleavelandprice-ngx-lib-authentication-token.mjs +0 -5
  157. package/esm2022/authentication/token/model/authentication-token-service-options-token.mjs +0 -3
  158. package/esm2022/authentication/token/model/authentication-token-service-options.mjs +0 -2
  159. package/esm2022/authentication/token/model/authentication-token.mjs +0 -2
  160. package/esm2022/authentication/token/services/authentication-token.service.mjs +0 -138
  161. package/esm2022/cleavelandprice-ngx-lib.mjs +0 -5
  162. package/esm2022/dialog/cleavelandprice-ngx-lib-dialog.mjs +0 -5
  163. package/esm2022/dialog/components/base/base.component.mjs +0 -102
  164. package/esm2022/dialog/components/choice/choice.component.mjs +0 -21
  165. package/esm2022/dialog/components/confirmation/confirmation.component.mjs +0 -21
  166. package/esm2022/dialog/components/input/input.component.mjs +0 -21
  167. package/esm2022/dialog/components/message/message.component.mjs +0 -21
  168. package/esm2022/dialog/dialog.api.mjs +0 -20
  169. package/esm2022/dialog/dialog.module.mjs +0 -73
  170. package/esm2022/dialog/model/confirmation-dialog-mode.mjs +0 -8
  171. package/esm2022/dialog/model/dialog-base-data.mjs +0 -2
  172. package/esm2022/dialog/model/dialog-choice-data.mjs +0 -2
  173. package/esm2022/dialog/model/dialog-type.mjs +0 -8
  174. package/esm2022/lib/model/app-path-config.mjs +0 -2
  175. package/esm2022/lib/model/app-type.mjs +0 -2
  176. package/esm2022/lib/model/app.mjs +0 -2
  177. package/esm2022/lib/model/caching-config.mjs +0 -2
  178. package/esm2022/lib/model/credentials.mjs +0 -2
  179. package/esm2022/lib/model/logging-config.mjs +0 -2
  180. package/esm2022/lib/model/service-options-token.mjs +0 -3
  181. package/esm2022/lib/model/service-options.mjs +0 -2
  182. package/esm2022/lib/ngx-lib.module.mjs +0 -37
  183. package/esm2022/lib/services/app-path-config.service.mjs +0 -50
  184. package/esm2022/lib/services/service-base.mjs +0 -26
  185. package/esm2022/msgraph/cleavelandprice-ngx-lib-msgraph.mjs +0 -5
  186. package/esm2022/msgraph/model/address.mjs +0 -2
  187. package/esm2022/msgraph/model/attendee.mjs +0 -2
  188. package/esm2022/msgraph/model/bulk-calendar-events.mjs +0 -2
  189. package/esm2022/msgraph/model/bulk-calendar-request.mjs +0 -2
  190. package/esm2022/msgraph/model/calendar-event.mjs +0 -2
  191. package/esm2022/msgraph/model/coordinates.mjs +0 -2
  192. package/esm2022/msgraph/model/email-address.mjs +0 -2
  193. package/esm2022/msgraph/model/location.mjs +0 -2
  194. package/esm2022/msgraph/model/online-meeting-info.mjs +0 -2
  195. package/esm2022/msgraph/model/patterned-recurrence.mjs +0 -2
  196. package/esm2022/msgraph/model/phone.mjs +0 -2
  197. package/esm2022/msgraph/model/recipient.mjs +0 -2
  198. package/esm2022/msgraph/model/recurrence-pattern.mjs +0 -2
  199. package/esm2022/msgraph/model/recurrence-range.mjs +0 -2
  200. package/esm2022/msgraph/model/response-status.mjs +0 -2
  201. package/esm2022/msgraph/model/room.mjs +0 -6
  202. package/esm2022/msgraph/model/user.mjs +0 -132
  203. package/esm2022/msgraph/msgraph.api.mjs +0 -19
  204. package/esm2022/msgraph/msgraph.module.mjs +0 -27
  205. package/esm2022/public_api.mjs +0 -15
  206. package/esm2022/quill/cleavelandprice-ngx-lib-quill.mjs +0 -5
  207. package/esm2022/quill/components/editor/editor.component.mjs +0 -282
  208. package/esm2022/quill/components/raw/raw.component.mjs +0 -30
  209. package/esm2022/quill/mention/cleavelandprice-ngx-lib-quill-mention.mjs +0 -5
  210. package/esm2022/quill/mention/components/editor/editor.component.mjs +0 -151
  211. package/esm2022/quill/mention/model/dialog-data.mjs +0 -2
  212. package/esm2022/quill/mention/quill-mention.api.mjs +0 -9
  213. package/esm2022/quill/mention/quill-mention.module.mjs +0 -65
  214. package/esm2022/quill/model/buttons.mjs +0 -3
  215. package/esm2022/quill/model/config.mjs +0 -3
  216. package/esm2022/quill/model/default-buttons.mjs +0 -50
  217. package/esm2022/quill/model/default-config.mjs +0 -28
  218. package/esm2022/quill/model/default-icons.mjs +0 -7
  219. package/esm2022/quill/model/default-tooltips.mjs +0 -53
  220. package/esm2022/quill/model/dialog-data.mjs +0 -2
  221. package/esm2022/quill/model/icons.mjs +0 -3
  222. package/esm2022/quill/model/tooltips.mjs +0 -3
  223. package/esm2022/quill/quill.api.mjs +0 -13
  224. package/esm2022/quill/quill.module.mjs +0 -75
  225. package/esm2022/sharepoint/cleavelandprice-ngx-lib-sharepoint.mjs +0 -5
  226. package/esm2022/sharepoint/components/user-photo/user-photo.component.mjs +0 -40
  227. package/esm2022/sharepoint/default-credentials.mjs +0 -6
  228. package/esm2022/sharepoint/model/base-item.mjs +0 -2
  229. package/esm2022/sharepoint/model/base-request-credential.mjs +0 -2
  230. package/esm2022/sharepoint/model/base-request.mjs +0 -2
  231. package/esm2022/sharepoint/model/cache-object.mjs +0 -3
  232. package/esm2022/sharepoint/model/file-request.mjs +0 -2
  233. package/esm2022/sharepoint/model/folder-request.mjs +0 -2
  234. package/esm2022/sharepoint/model/list-item.mjs +0 -2
  235. package/esm2022/sharepoint/model/list-items-request.mjs +0 -2
  236. package/esm2022/sharepoint/model/photo-item.mjs +0 -2
  237. package/esm2022/sharepoint/model/sharepoint-service-options.mjs +0 -3
  238. package/esm2022/sharepoint/model/uri-request.mjs +0 -2
  239. package/esm2022/sharepoint/model/user-request.mjs +0 -2
  240. package/esm2022/sharepoint/model/user.mjs +0 -2
  241. package/esm2022/sharepoint/pipes/user-photo-url.pipe.mjs +0 -37
  242. package/esm2022/sharepoint/services/sharepoint.service.mjs +0 -155
  243. package/esm2022/sharepoint/sharepoint.api.mjs +0 -17
  244. package/esm2022/sharepoint/sharepoint.module.mjs +0 -50
  245. package/esm2022/table/cleavelandprice-ngx-lib-table.mjs +0 -5
  246. package/esm2022/table/components/table/table.component.mjs +0 -141
  247. package/esm2022/table/model/table-column.mjs +0 -2
  248. package/esm2022/table/pipes/decimalPoints.mjs +0 -14
  249. package/esm2022/table/pipes/roundNumber.mjs +0 -14
  250. package/esm2022/table/table.api.mjs +0 -6
  251. package/esm2022/table/table.module.mjs +0 -78
  252. package/esm2022/upload/cleavelandprice-ngx-lib-upload.mjs +0 -5
  253. package/esm2022/upload/components/upload/upload.component.mjs +0 -32
  254. package/esm2022/upload/components/upload-dialog/upload-dialog.component.mjs +0 -98
  255. package/esm2022/upload/model/database-file-info.mjs +0 -2
  256. package/esm2022/upload/model/file-upload-request.mjs +0 -2
  257. package/esm2022/upload/model/filesystem-file-info.mjs +0 -2
  258. package/esm2022/upload/model/msg-file-content.mjs +0 -5
  259. package/esm2022/upload/model/upload-service-options-token.mjs +0 -3
  260. package/esm2022/upload/model/upload-service-options.mjs +0 -3
  261. package/esm2022/upload/model/upload-status.mjs +0 -2
  262. package/esm2022/upload/services/upload.service.mjs +0 -106
  263. package/esm2022/upload/upload.api.mjs +0 -11
  264. package/esm2022/upload/upload.module.mjs +0 -68
  265. package/esm2022/url-utilities/cleavelandprice-ngx-lib-url-utilities.mjs +0 -5
  266. package/esm2022/url-utilities/pipes/safe-resource-url.pipe.mjs +0 -19
  267. package/esm2022/url-utilities/pipes/safe-url.pipe.mjs +0 -19
  268. package/esm2022/url-utilities/pipes/uri-scheme.pipe.mjs +0 -106
  269. package/esm2022/url-utilities/url-utilities.api.mjs +0 -13
  270. package/esm2022/url-utilities/url-utilities.module.mjs +0 -34
  271. package/lib/model/app-path-config.d.ts +0 -10
  272. package/lib/model/app-type.d.ts +0 -5
  273. package/lib/model/app.d.ts +0 -16
  274. package/lib/model/caching-config.d.ts +0 -4
  275. package/lib/model/credentials.d.ts +0 -4
  276. package/lib/model/logging-config.d.ts +0 -6
  277. package/lib/model/service-options-token.d.ts +0 -3
  278. package/lib/model/service-options.d.ts +0 -4
  279. package/lib/ngx-lib.module.d.ts +0 -10
  280. package/lib/services/app-path-config.service.d.ts +0 -18
  281. package/lib/services/service-base.d.ts +0 -7
  282. package/msgraph/model/address.d.ts +0 -7
  283. package/msgraph/model/attendee.d.ts +0 -13
  284. package/msgraph/model/bulk-calendar-events.d.ts +0 -5
  285. package/msgraph/model/bulk-calendar-request.d.ts +0 -3
  286. package/msgraph/model/calendar-event.d.ts +0 -53
  287. package/msgraph/model/coordinates.d.ts +0 -7
  288. package/msgraph/model/email-address.d.ts +0 -4
  289. package/msgraph/model/location.d.ts +0 -12
  290. package/msgraph/model/online-meeting-info.d.ts +0 -9
  291. package/msgraph/model/patterned-recurrence.d.ts +0 -6
  292. package/msgraph/model/phone.d.ts +0 -4
  293. package/msgraph/model/recipient.d.ts +0 -4
  294. package/msgraph/model/recurrence-pattern.d.ts +0 -9
  295. package/msgraph/model/recurrence-range.d.ts +0 -7
  296. package/msgraph/model/response-status.d.ts +0 -4
  297. package/msgraph/model/room.d.ts +0 -22
  298. package/msgraph/model/user.d.ts +0 -29
  299. package/msgraph/msgraph.api.d.ts +0 -18
  300. package/msgraph/msgraph.module.d.ts +0 -8
  301. package/public_api.d.ts +0 -11
  302. package/quill/components/editor/editor.component.d.ts +0 -55
  303. package/quill/components/raw/raw.component.d.ts +0 -6
  304. package/quill/mention/components/editor/editor.component.d.ts +0 -15
  305. package/quill/mention/model/dialog-data.d.ts +0 -5
  306. package/quill/mention/quill-mention.api.d.ts +0 -3
  307. package/quill/mention/quill-mention.module.d.ts +0 -17
  308. package/quill/model/buttons.d.ts +0 -29
  309. package/quill/model/config.d.ts +0 -23
  310. package/quill/model/default-buttons.d.ts +0 -2
  311. package/quill/model/default-config.d.ts +0 -2
  312. package/quill/model/default-icons.d.ts +0 -2
  313. package/quill/model/default-tooltips.d.ts +0 -2
  314. package/quill/model/dialog-data.d.ts +0 -21
  315. package/quill/model/icons.d.ts +0 -6
  316. package/quill/model/tooltips.d.ts +0 -32
  317. package/quill/quill.api.d.ts +0 -12
  318. package/quill/quill.module.d.ts +0 -18
  319. package/sharepoint/components/user-photo/user-photo.component.d.ts +0 -15
  320. package/sharepoint/default-credentials.d.ts +0 -4
  321. package/sharepoint/model/base-item.d.ts +0 -4
  322. package/sharepoint/model/base-request-credential.d.ts +0 -4
  323. package/sharepoint/model/base-request.d.ts +0 -8
  324. package/sharepoint/model/cache-object.d.ts +0 -5
  325. package/sharepoint/model/file-request.d.ts +0 -4
  326. package/sharepoint/model/folder-request.d.ts +0 -4
  327. package/sharepoint/model/list-item.d.ts +0 -10
  328. package/sharepoint/model/list-items-request.d.ts +0 -5
  329. package/sharepoint/model/photo-item.d.ts +0 -11
  330. package/sharepoint/model/sharepoint-service-options.d.ts +0 -19
  331. package/sharepoint/model/uri-request.d.ts +0 -4
  332. package/sharepoint/model/user-request.d.ts +0 -4
  333. package/sharepoint/model/user.d.ts +0 -12
  334. package/sharepoint/pipes/user-photo-url.pipe.d.ts +0 -10
  335. package/sharepoint/services/sharepoint.service.d.ts +0 -20
  336. package/sharepoint/sharepoint.api.d.ts +0 -16
  337. package/sharepoint/sharepoint.module.d.ts +0 -13
  338. package/table/components/table/table.component.d.ts +0 -42
  339. package/table/model/table-column.d.ts +0 -70
  340. package/table/pipes/decimalPoints.d.ts +0 -7
  341. package/table/pipes/roundNumber.d.ts +0 -7
  342. package/table/table.api.d.ts +0 -5
  343. package/table/table.module.d.ts +0 -20
  344. package/upload/components/upload/upload.component.d.ts +0 -10
  345. package/upload/components/upload-dialog/upload-dialog.component.d.ts +0 -25
  346. package/upload/model/database-file-info.d.ts +0 -7
  347. package/upload/model/file-upload-request.d.ts +0 -6
  348. package/upload/model/filesystem-file-info.d.ts +0 -12
  349. package/upload/model/msg-file-content.d.ts +0 -21
  350. package/upload/model/upload-service-options-token.d.ts +0 -3
  351. package/upload/model/upload-service-options.d.ts +0 -14
  352. package/upload/model/upload-status.d.ts +0 -6
  353. package/upload/services/upload.service.d.ts +0 -21
  354. package/upload/upload.api.d.ts +0 -10
  355. package/upload/upload.module.d.ts +0 -17
  356. package/url-utilities/pipes/safe-resource-url.pipe.d.ts +0 -9
  357. package/url-utilities/pipes/safe-url.pipe.d.ts +0 -9
  358. package/url-utilities/pipes/uri-scheme.pipe.d.ts +0 -8
  359. package/url-utilities/url-utilities.api.d.ts +0 -8
  360. package/url-utilities/url-utilities.module.d.ts +0 -10
@@ -1,437 +0,0 @@
1
- import { Component, inject, ViewChild, viewChild } from '@angular/core';
2
- import { FormControl, FormGroup, ReactiveFormsModule } from '@angular/forms';
3
- import { MAT_DIALOG_DATA, MatDialogActions, MatDialogClose, MatDialogContent, MatDialogRef } from '@angular/material/dialog';
4
- import { MatListItemAvatar, MatListOption, MatSelectionList } from '@angular/material/list';
5
- import { MatTableDataSource } from '@angular/material/table';
6
- import { debounceTime, forkJoin, of } from 'rxjs';
7
- import { ActiveDirectoryService } from '@cleavelandprice/ngx-lib/active-directory';
8
- import { SharePointService } from '@cleavelandprice/ngx-lib/sharepoint';
9
- import { MatButton, MatIconButton } from '@angular/material/button';
10
- import { MatFormField } from '@angular/material/form-field';
11
- import { MatIcon } from '@angular/material/icon';
12
- import { MatInput } from '@angular/material/input';
13
- import { MatProgressSpinner } from '@angular/material/progress-spinner';
14
- import { MatSlideToggle } from '@angular/material/slide-toggle';
15
- import { MatTooltip } from '@angular/material/tooltip';
16
- import { DefaultUserChooserData } from '../../model/default-user-chooser-data';
17
- import { UserChooserMode } from '../../model/user-chooser-mode';
18
- import * as i0 from "@angular/core";
19
- import * as i1 from "@angular/forms";
20
- export class UserChooserComponent {
21
- constructor() {
22
- this.#services = {
23
- dialogRef: inject((MatDialogRef)),
24
- activeDirectory: inject(ActiveDirectoryService),
25
- sharePoint: inject(SharePointService),
26
- data: inject(MAT_DIALOG_DATA)
27
- };
28
- this._data = { ...DefaultUserChooserData, ...this.#services.data };
29
- //#region Fields
30
- //@ViewChild(MatSelectionList) selectionList?: MatSelectionList;
31
- this.selectionList = viewChild(MatSelectionList);
32
- //filterInput = viewChild<ElementRef>('filterInput');
33
- this.filterForm = new FormGroup({
34
- filter: new FormControl()
35
- });
36
- }
37
- #services;
38
- set filterInput(elRef) {
39
- if (elRef) {
40
- elRef.nativeElement.focus();
41
- }
42
- }
43
- ;
44
- //#endregion
45
- //#region Properties
46
- get isMultiMode() {
47
- return this._data.mode === UserChooserMode.Multiple;
48
- }
49
- get selectedOptions() {
50
- return this.selectionList()?.options.filter(o => o.selected) ?? [];
51
- }
52
- get selectedUsers() {
53
- return this.dataSource?.data?.filter(d => d.selected) ?? [];
54
- }
55
- get filterValue() {
56
- return this.filterForm.value.filter;
57
- }
58
- get adGroupsNeeded() {
59
- // If any are these are true, then we need to pull AD groups for use later
60
- return (this._data.showGroupMembershipTooltips ?? false) ||
61
- (this._data.exclusions?.groups?.length ?? 0) > 0 ||
62
- (this._data.inclusions?.groups?.length ?? 0) > 0 ||
63
- (this._data.preSelections?.groups?.length ?? 0) > 0 ||
64
- this._data.filterOptions?.groupMembership ||
65
- (this._data.selectableGroupNames?.length ?? 0) > 0 ||
66
- (this._data.groups?.length ?? 0) > 0;
67
- }
68
- //#endregion
69
- //#region Lifecycle
70
- ngOnInit() {
71
- this.#getData();
72
- this.#listenForFilterChanges();
73
- }
74
- //#endregion
75
- //#region Events
76
- listSelectionChanged(options) {
77
- if (this._data.mode === UserChooserMode.Single &&
78
- this.selectedOptions.length &&
79
- this._data.closeWhenSelectionMade) {
80
- this.close();
81
- }
82
- }
83
- optionSelectionChanged(option) {
84
- const user = this.dataSource?.data
85
- .find(u => u.sAMAccountName.toLocaleLowerCase() === option.value.sAMAccountName.toLowerCase());
86
- if (user) {
87
- // If we are in single user selection mode, deselect any existing selections first
88
- if (!this.isMultiMode && option.selected) {
89
- this.dataSource?.data
90
- .filter(u => u.sAMAccountName.toLowerCase() !== option.value.sAMAccountName.toLowerCase())
91
- .forEach(u => u.selected = false);
92
- }
93
- user.selected = option.selected;
94
- }
95
- }
96
- hideUnselectedChanged(selected) {
97
- this.filterForm.get('filter')?.setValue(selected ? '{selected:true}' : null);
98
- }
99
- selectAll() {
100
- this.selectionList()?.selectAll();
101
- if (this.selectionList()?.options) {
102
- this.listSelectionChanged(this.selectionList().options.toArray());
103
- }
104
- }
105
- deselectAll() {
106
- this.selectionList()?.deselectAll();
107
- }
108
- //#endregion
109
- //#region Utilities
110
- isUser(userOrGroup) {
111
- return 'title' in userOrGroup;
112
- }
113
- castUser(userOrGroup) {
114
- return userOrGroup;
115
- }
116
- #getData() {
117
- const observables$ = [
118
- this._data.users?.length ?
119
- // Users were passed in
120
- of(this._data.users) :
121
- // Users need to be retrieved
122
- this.#services.activeDirectory.getUsers(false, this._data.includeDisabledUsers, this._data.parentOu),
123
- this._data.photos?.length ?
124
- // Photos were passed in
125
- of(this._data.photos) :
126
- // Photos need to be retrieved
127
- this.#services.sharePoint.getPhotos()
128
- ];
129
- // Do we need AD groups?
130
- if (this.adGroupsNeeded) {
131
- observables$.push(this._data.groups?.length ?
132
- // Groups were passed in
133
- of(this._data.groups) :
134
- // Groups need to be retrieved
135
- this.#services.activeDirectory.getGroups());
136
- }
137
- forkJoin(observables$)
138
- //.subscribe(([users, photos]) => {
139
- .subscribe(data => {
140
- // Need groups in place before we handle exclusions/inclusions/pre-selections
141
- this.groups = this.adGroupsNeeded ?
142
- data[2] :
143
- null;
144
- let users = data[0];
145
- users.forEach(u => u.selected = false); // In case existing data was re-used
146
- users = this.#includeUsersByAccountName(users);
147
- users = this.#includeUsersByGroupName(users);
148
- users = this.#includeUsersByDepartment(users);
149
- users = this.#includeUsersByTitle(users);
150
- users = this.#excludeUsersByAccountName(users);
151
- users = this.#excludeUsersByGroupName(users);
152
- users = this.#excludeUsersByDepartment(users);
153
- users = this.#excludeUsersByTitle(users);
154
- users = this.#preSelectUsersByAccountName(users);
155
- users = this.#preSelectUsersByGroupName(users);
156
- users = this.#preSelectUsersByDepartment(users);
157
- users = this.#preSelectUsersByTitle(users);
158
- this.#preSelectGroupsByAccountName();
159
- const usersAndGroups = [];
160
- // Should we allow users to be selected?
161
- if (['users', '*'].includes(this._data.objectTypes)) {
162
- usersAndGroups.push(...users);
163
- }
164
- // Should we allow groups to be selected
165
- if (['groups', '*'].includes(this._data.objectTypes)) {
166
- if (this._data.selectableGroupNames?.length) {
167
- if (this._data.selectableGroupNames.includes('*')) {
168
- usersAndGroups.push(...this.groups);
169
- }
170
- else {
171
- this._data.selectableGroupNames
172
- .forEach(groupName => {
173
- const group = this.groups.find(g => g.displayName === groupName);
174
- if (group) {
175
- usersAndGroups.push({
176
- ...group,
177
- selected: group.selected
178
- });
179
- }
180
- });
181
- }
182
- }
183
- }
184
- this.dataSource = new MatTableDataSource(usersAndGroups);
185
- this.photos = data[1];
186
- this.#setFilterPredicate();
187
- });
188
- }
189
- close() {
190
- if (!this.selectedUsers?.length) {
191
- this.#services.dialogRef.close(this._data.allowCloseWithoutSelections ? [] : undefined);
192
- return;
193
- }
194
- const value = this.selectedUsers
195
- .map(u => this._data.returnUserObjects ? u : u.sAMAccountName);
196
- this.#services.dialogRef.close(this._data.mode === UserChooserMode.Multiple ?
197
- value :
198
- value[0]);
199
- }
200
- getPhoto(user) {
201
- if (!this.isUser(user)) {
202
- return;
203
- }
204
- return this.photos?.find(p => (p.employeeNumber && p.employeeNumber.toString() === user.employeeNumber) ||
205
- p.accountName?.toLowerCase() === user.sAMAccountName.toLowerCase() ||
206
- p.displayName?.toLowerCase() === (user.displayName ?? user.name).toLowerCase() ||
207
- p.title?.toLowerCase() === (user.displayName ?? user.name).toLowerCase())?.encodedAbsUrl;
208
- }
209
- //#region Exclusions - won't be included in the dataSource at all
210
- #excludeUsersByAccountName(users) {
211
- this._data.exclusions?.accountNames
212
- ?.forEach(accountName => {
213
- const index = users.findIndex(u => u.sAMAccountName.toLowerCase() === accountName.toLowerCase());
214
- if (index === -1) {
215
- return;
216
- }
217
- users.splice(index, 1);
218
- });
219
- return users;
220
- }
221
- #excludeUsersByGroupName(users) {
222
- this._data.exclusions?.groups
223
- ?.forEach(groupName => {
224
- const group = this.groups?.find(g => g.name.toLowerCase() === groupName.toLowerCase());
225
- if (!group) {
226
- return;
227
- }
228
- group.member.forEach(groupMemberDn => {
229
- const index = users.findIndex(u => u.distinguishedName === groupMemberDn);
230
- if (index === -1) {
231
- return;
232
- }
233
- users.splice(index, 1);
234
- });
235
- });
236
- return users;
237
- }
238
- #excludeUsersByDepartment(users) {
239
- this._data.exclusions?.departments
240
- ?.forEach(department => {
241
- const excludedUsers = users.filter(u => u.department?.toLowerCase() === department.toLowerCase());
242
- excludedUsers.forEach(user => {
243
- const index = users.indexOf(user);
244
- users.splice(index, 1);
245
- });
246
- });
247
- return users;
248
- }
249
- #excludeUsersByTitle(users) {
250
- this._data.exclusions?.titles
251
- ?.forEach(title => {
252
- const excludedUsers = users.filter(u => u.title?.toLowerCase() === title.toLowerCase());
253
- excludedUsers.forEach(user => {
254
- const index = users.indexOf(user);
255
- users.splice(index, 1);
256
- });
257
- });
258
- return users;
259
- }
260
- //#endregion
261
- //#region Inclusions - only these will be included in the dataSource
262
- #includeUsersByAccountName(users) {
263
- return users.filter(user => !this._data.inclusions?.accountNames?.length || // No account inclusions specified
264
- this._data.inclusions.accountNames.find(accountName => accountName.toLowerCase() === user.sAMAccountName.toLowerCase()));
265
- }
266
- #includeUsersByDepartment(users) {
267
- return users.filter(user => !this._data.inclusions?.departments?.length || // No department inclusions specified
268
- this._data.inclusions.departments.find(department => department.toLowerCase() === user.department?.toLowerCase()));
269
- }
270
- #includeUsersByTitle(users) {
271
- return users.filter(user => !this._data.inclusions?.titles?.length || // No title inclusions specified
272
- this._data.inclusions.titles.find(title => title.toLowerCase() === user.title?.toLowerCase()));
273
- }
274
- #includeUsersByGroupName(users) {
275
- if (!this._data.inclusions?.groups?.length) {
276
- return users; // No group inclusions specified
277
- }
278
- // Cheating a bit and leveraging the 'selected' property to keep track of who should be included
279
- // Since inclusions happen befor pre-selections, we can do that, as long as we set 'selected' back to false when we're done
280
- this._data.inclusions.groups
281
- .forEach(groupName => {
282
- const group = this.groups?.find(g => g.name.toLowerCase() === groupName.toLowerCase());
283
- if (!group) {
284
- return;
285
- }
286
- users
287
- .filter(user => group.member.find(groupMemberDn => groupMemberDn === user.distinguishedName))
288
- .forEach(user => user.selected = true);
289
- });
290
- // At this point, all of the appropriate users should have 'selected' set to true
291
- const selectedUsers = users.filter(user => user.selected); // Subset of the original list
292
- // Reset 'selected' to false, and return
293
- selectedUsers.forEach(user => user.selected = false);
294
- return selectedUsers;
295
- }
296
- //#endregion
297
- //#region Pre-Selections
298
- #preSelectUsersByAccountName(users) {
299
- this._data.preSelections?.accountNames
300
- ?.forEach(accountName => {
301
- const user = users.find(u => u.sAMAccountName.toLowerCase() === accountName.toLowerCase());
302
- if (!user) {
303
- return;
304
- }
305
- user.selected = true;
306
- });
307
- return users;
308
- }
309
- #preSelectGroupsByAccountName() {
310
- this._data.preSelections?.accountNames
311
- ?.forEach(accountName => {
312
- const group = this.groups?.find(g => g.sAMAccountName.toLowerCase() === accountName.toLowerCase());
313
- if (!group) {
314
- return;
315
- }
316
- group.selected = true;
317
- });
318
- ;
319
- }
320
- #preSelectUsersByDepartment(users) {
321
- this._data.preSelections?.departments
322
- ?.forEach(department => users
323
- .filter(u => u.department?.toLowerCase() === department.toLowerCase())
324
- .forEach(user => user.selected = true));
325
- return users;
326
- }
327
- #preSelectUsersByTitle(users) {
328
- this._data.preSelections?.titles
329
- ?.forEach(title => users
330
- .filter(u => u.title?.toLowerCase() === title.toLowerCase())
331
- .forEach(user => user.selected = true));
332
- return users;
333
- }
334
- #preSelectUsersByGroupName(users) {
335
- this._data.preSelections?.groups
336
- ?.forEach(groupName => {
337
- const group = this.groups?.find(g => g.name.toLowerCase() === groupName.toLowerCase());
338
- if (!group) {
339
- return;
340
- }
341
- group.member.forEach(groupMemberDn => {
342
- const user = users.find(u => u.distinguishedName === groupMemberDn);
343
- if (!user) {
344
- return;
345
- }
346
- user.selected = true;
347
- });
348
- });
349
- return users;
350
- }
351
- //#endregion
352
- #setFilterPredicate() {
353
- if (!this.dataSource) {
354
- return;
355
- }
356
- this.dataSource.filterPredicate = (user, filter) => {
357
- if (filter === '{selected:true}') {
358
- return user.selected;
359
- }
360
- else {
361
- const regex = new RegExp(filter, 'i'); // Case-insensitive
362
- let match = false; // The end result - whether or not a employee matches the filter
363
- const filterProperties = ['displayName'];
364
- if (this._data.filterOptions?.accountName) {
365
- filterProperties.push('sAMAccountName');
366
- }
367
- if (this._data.filterOptions?.title) {
368
- filterProperties.push('title');
369
- }
370
- if (this._data.filterOptions?.department) {
371
- filterProperties.push('department');
372
- }
373
- if (this._data.filterOptions?.phoneNumber) {
374
- filterProperties.push('telephoneNumber');
375
- }
376
- // Match on the properties configured above
377
- filterProperties
378
- .forEach(field => {
379
- // @ts-ignore
380
- if (user[field] && user[field].match(regex)) {
381
- match = true;
382
- }
383
- });
384
- // Match on group membership (group name)
385
- if (this._data.filterOptions?.groupMembership) {
386
- user.memberOf.forEach(groupDn => {
387
- const group = this.groups?.find(group => group.distinguishedName === groupDn && group.name.match(regex));
388
- if (group) {
389
- match = true;
390
- }
391
- });
392
- }
393
- return match;
394
- }
395
- };
396
- }
397
- #listenForFilterChanges() {
398
- this.filterForm.get('filter')?.valueChanges
399
- .pipe(debounceTime(250))
400
- .subscribe(() => this.dataSource.filter = this.filterForm.value.filter?.trim().toLowerCase());
401
- }
402
- tooltip(user) {
403
- return this._data.showGroupMembershipTooltips ?
404
- user.memberOf
405
- .map(groupDn => this.groups
406
- ?.find(group => group.distinguishedName === groupDn)?.name)
407
- .sort((a, b) => a > b ? 1 : -1)
408
- .join('\n') :
409
- '';
410
- }
411
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.0", ngImport: i0, type: UserChooserComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
412
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.0", type: UserChooserComponent, isStandalone: true, selector: "ng-component", viewQueries: [{ propertyName: "selectionList", first: true, predicate: MatSelectionList, descendants: true, isSignal: true }, { propertyName: "filterInput", first: true, predicate: ["filterInput"], descendants: true }], ngImport: i0, template: "<div id=\"dialog-title\">\r\n <h2 mat-dialog-title>{{ _data.title }}</h2>\r\n\r\n <div id=\"num-selected\">\r\n {{ selectedOptions.length }} selected\r\n </div>\r\n</div>\r\n\r\n<mat-dialog-content>\r\n @if (dataSource && photos) {\r\n <form [formGroup]=\"filterForm\">\r\n @if (dataSource) {\r\n <mat-form-field>\r\n <input matInput placeholder=\"Search\" formControlName=\"filter\" #filterInput>\r\n @if (filterForm.value.filter) {\r\n <button matSuffix mat-icon-button aria-label=\"Clear\" (click)=\"filterForm.get('filter')?.setValue('')\">\r\n <mat-icon fontIcon=\"close\"/>\r\n </button>\r\n }\r\n </mat-form-field>\r\n }\r\n </form>\r\n <mat-selection-list [multiple]=\"isMultiMode\"\r\n (selectionChange)=\"listSelectionChanged($event.options)\">\r\n @for (user of dataSource.filteredData; track user) {\r\n <mat-list-option [value]=\"user\" [selected]=\"user.selected\"\r\n (selectedChange)=\"optionSelectionChanged(option)\" #option>\r\n @if (getPhoto(user)) {\r\n <img matListItemAvatar alt=\"\" [src]=\"getPhoto(user)\">\r\n } @else {\r\n <mat-icon matListItemAvatar class=\"no-photo\"\r\n [fontIcon]=\"isUser(user) ? 'account_circle' : 'group'\"/>\r\n }\r\n <div class=\"user\">\r\n <div [matTooltip]=\"tooltip(user)\" class=\"user-name\">\r\n {{ user.displayName ?? user.name }}\r\n @if (isUser(user) && _data.showPhone && castUser(user).telephoneNumber) {\r\n <div>{{ castUser(user).telephoneNumber }}</div>\r\n }\r\n </div>\r\n @if (isUser(user)) {\r\n <div>{{ castUser(user).department }}</div>\r\n <div class=\"title\">{{ castUser(user).title }}</div>\r\n }\r\n </div>\r\n </mat-list-option>\r\n }\r\n </mat-selection-list>\r\n } @else {\r\n <div>\r\n <mat-spinner [diameter]=\"50\"/>\r\n <h2 id=\"spinner-message\">Getting users and photos...</h2>\r\n </div>\r\n }\r\n</mat-dialog-content>\r\n\r\n<mat-dialog-actions>\r\n @if (dataSource && photos) {\r\n @if (selectedOptions.length) {\r\n <mat-slide-toggle (change)=\"hideUnselectedChanged($event.checked)\">\r\n Hide Unselected\r\n </mat-slide-toggle>\r\n }\r\n @if (isMultiMode) {\r\n <button mat-raised-button color=\"primary\" (click)=\"selectAll()\"\r\n >\r\n <mat-icon fontIcon=\"select_all\"/>\r\n <span class=\"hide-mobile\">Select All</span>\r\n </button>\r\n }\r\n @if (isMultiMode && selectedOptions.length) {\r\n <button mat-raised-button color=\"primary\" (click)=\"deselectAll()\"\r\n >\r\n <mat-icon fontIcon=\"clear_all\"/>\r\n <span class=\"hide-mobile\">Clear All</span>\r\n </button>\r\n }\r\n @if (isMultiMode || !_data.closeWhenSelectionMade) {\r\n <button mat-raised-button color=\"primary\" (click)=\"close()\" matTooltip=\"Accept your selection\"\r\n [disabled]=\"!_data.allowCloseWithoutSelections && !selectedOptions.length\">\r\n <mat-icon fontIcon=\"check\"/>\r\n <span class=\"hide-mobile\">Ok</span>\r\n </button>\r\n }\r\n }\r\n\r\n <button mat-raised-button color=\"warn\" mat-dialog-close matTooltip=\"Close this window\">\r\n <mat-icon fontIcon=\"close\"/>\r\n <span class=\"hide-mobile\">Cancel</span>\r\n </button>\r\n</mat-dialog-actions>", styles: ["::ng-deep .mat-tooltip{font-size:1em!important;white-space:pre-line}mat-dialog-content{min-width:50vw}#dialog-title{display:flex;justify-content:space-between}#num-selected{margin:1em 1em 0 0}mat-spinner{margin:0 auto}#spinner-message{text-align:center;padding:.5em}mat-form-field{width:100%}.title{font-style:italic;color:#757575}img,.no-photo{width:2rem;height:2rem;font-size:2.3rem!important;border-radius:100%}.hide-mobile{display:none}mat-dialog-actions{display:grid;grid-auto-flow:column;grid-gap:1em;justify-content:center}.user-name{display:flex;justify-content:space-between}.user-name>div:last-child{margin-right:10rem;font-weight:400;font-style:italic;color:#757575}@media (min-width: 801px){.user{display:grid;grid-template-columns:1fr 1fr 1fr}.user>div:first-child{font-weight:700}.hide-mobile{display:initial}}\n", ".material-icons{font-family:Material Icons;font-weight:400;font-style:normal;font-size:24px;display:inline-block;line-height:1;text-transform:none;letter-spacing:normal;word-wrap:normal;white-space:nowrap;direction:ltr;-webkit-font-smoothing:antialiased;text-rendering:optimizeLegibility;-moz-osx-font-smoothing:grayscale;font-feature-settings:\"liga\"}\n"], dependencies: [{ kind: "component", type: MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "directive", type: MatDialogActions, selector: "[mat-dialog-actions], mat-dialog-actions, [matDialogActions]", inputs: ["align"] }, { kind: "directive", type: MatDialogClose, selector: "[mat-dialog-close], [matDialogClose]", inputs: ["aria-label", "type", "mat-dialog-close", "matDialogClose"], exportAs: ["matDialogClose"] }, { kind: "directive", type: MatDialogContent, selector: "[mat-dialog-content], mat-dialog-content, [matDialogContent]" }, { kind: "component", type: MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "component", type: MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "directive", type: MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "directive", type: MatListItemAvatar, selector: "[matListItemAvatar]" }, { kind: "component", type: MatListOption, selector: "mat-list-option", inputs: ["togglePosition", "checkboxPosition", "color", "value", "selected"], outputs: ["selectedChange"], exportAs: ["matListOption"] }, { kind: "component", type: MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "mode", "value", "diameter", "strokeWidth"], exportAs: ["matProgressSpinner"] }, { kind: "component", type: MatSelectionList, selector: "mat-selection-list", inputs: ["color", "compareWith", "multiple", "hideSingleSelectionIndicator", "disabled"], outputs: ["selectionChange"], exportAs: ["matSelectionList"] }, { kind: "component", type: MatSlideToggle, selector: "mat-slide-toggle", inputs: ["name", "id", "labelPosition", "aria-label", "aria-labelledby", "aria-describedby", "required", "color", "disabled", "disableRipple", "tabIndex", "checked", "hideIcon"], outputs: ["change", "toggleChange"], exportAs: ["matSlideToggle"] }, { kind: "directive", type: MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }] }); }
413
- }
414
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.0", ngImport: i0, type: UserChooserComponent, decorators: [{
415
- type: Component,
416
- args: [{ imports: [
417
- MatButton,
418
- MatDialogActions,
419
- MatDialogClose,
420
- MatDialogContent,
421
- MatFormField,
422
- MatIcon,
423
- MatIconButton,
424
- MatInput,
425
- MatListItemAvatar,
426
- MatListOption,
427
- MatProgressSpinner,
428
- MatSelectionList,
429
- MatSlideToggle,
430
- MatTooltip,
431
- ReactiveFormsModule,
432
- ], standalone: true, template: "<div id=\"dialog-title\">\r\n <h2 mat-dialog-title>{{ _data.title }}</h2>\r\n\r\n <div id=\"num-selected\">\r\n {{ selectedOptions.length }} selected\r\n </div>\r\n</div>\r\n\r\n<mat-dialog-content>\r\n @if (dataSource && photos) {\r\n <form [formGroup]=\"filterForm\">\r\n @if (dataSource) {\r\n <mat-form-field>\r\n <input matInput placeholder=\"Search\" formControlName=\"filter\" #filterInput>\r\n @if (filterForm.value.filter) {\r\n <button matSuffix mat-icon-button aria-label=\"Clear\" (click)=\"filterForm.get('filter')?.setValue('')\">\r\n <mat-icon fontIcon=\"close\"/>\r\n </button>\r\n }\r\n </mat-form-field>\r\n }\r\n </form>\r\n <mat-selection-list [multiple]=\"isMultiMode\"\r\n (selectionChange)=\"listSelectionChanged($event.options)\">\r\n @for (user of dataSource.filteredData; track user) {\r\n <mat-list-option [value]=\"user\" [selected]=\"user.selected\"\r\n (selectedChange)=\"optionSelectionChanged(option)\" #option>\r\n @if (getPhoto(user)) {\r\n <img matListItemAvatar alt=\"\" [src]=\"getPhoto(user)\">\r\n } @else {\r\n <mat-icon matListItemAvatar class=\"no-photo\"\r\n [fontIcon]=\"isUser(user) ? 'account_circle' : 'group'\"/>\r\n }\r\n <div class=\"user\">\r\n <div [matTooltip]=\"tooltip(user)\" class=\"user-name\">\r\n {{ user.displayName ?? user.name }}\r\n @if (isUser(user) && _data.showPhone && castUser(user).telephoneNumber) {\r\n <div>{{ castUser(user).telephoneNumber }}</div>\r\n }\r\n </div>\r\n @if (isUser(user)) {\r\n <div>{{ castUser(user).department }}</div>\r\n <div class=\"title\">{{ castUser(user).title }}</div>\r\n }\r\n </div>\r\n </mat-list-option>\r\n }\r\n </mat-selection-list>\r\n } @else {\r\n <div>\r\n <mat-spinner [diameter]=\"50\"/>\r\n <h2 id=\"spinner-message\">Getting users and photos...</h2>\r\n </div>\r\n }\r\n</mat-dialog-content>\r\n\r\n<mat-dialog-actions>\r\n @if (dataSource && photos) {\r\n @if (selectedOptions.length) {\r\n <mat-slide-toggle (change)=\"hideUnselectedChanged($event.checked)\">\r\n Hide Unselected\r\n </mat-slide-toggle>\r\n }\r\n @if (isMultiMode) {\r\n <button mat-raised-button color=\"primary\" (click)=\"selectAll()\"\r\n >\r\n <mat-icon fontIcon=\"select_all\"/>\r\n <span class=\"hide-mobile\">Select All</span>\r\n </button>\r\n }\r\n @if (isMultiMode && selectedOptions.length) {\r\n <button mat-raised-button color=\"primary\" (click)=\"deselectAll()\"\r\n >\r\n <mat-icon fontIcon=\"clear_all\"/>\r\n <span class=\"hide-mobile\">Clear All</span>\r\n </button>\r\n }\r\n @if (isMultiMode || !_data.closeWhenSelectionMade) {\r\n <button mat-raised-button color=\"primary\" (click)=\"close()\" matTooltip=\"Accept your selection\"\r\n [disabled]=\"!_data.allowCloseWithoutSelections && !selectedOptions.length\">\r\n <mat-icon fontIcon=\"check\"/>\r\n <span class=\"hide-mobile\">Ok</span>\r\n </button>\r\n }\r\n }\r\n\r\n <button mat-raised-button color=\"warn\" mat-dialog-close matTooltip=\"Close this window\">\r\n <mat-icon fontIcon=\"close\"/>\r\n <span class=\"hide-mobile\">Cancel</span>\r\n </button>\r\n</mat-dialog-actions>", styles: ["::ng-deep .mat-tooltip{font-size:1em!important;white-space:pre-line}mat-dialog-content{min-width:50vw}#dialog-title{display:flex;justify-content:space-between}#num-selected{margin:1em 1em 0 0}mat-spinner{margin:0 auto}#spinner-message{text-align:center;padding:.5em}mat-form-field{width:100%}.title{font-style:italic;color:#757575}img,.no-photo{width:2rem;height:2rem;font-size:2.3rem!important;border-radius:100%}.hide-mobile{display:none}mat-dialog-actions{display:grid;grid-auto-flow:column;grid-gap:1em;justify-content:center}.user-name{display:flex;justify-content:space-between}.user-name>div:last-child{margin-right:10rem;font-weight:400;font-style:italic;color:#757575}@media (min-width: 801px){.user{display:grid;grid-template-columns:1fr 1fr 1fr}.user>div:first-child{font-weight:700}.hide-mobile{display:initial}}\n", ".material-icons{font-family:Material Icons;font-weight:400;font-style:normal;font-size:24px;display:inline-block;line-height:1;text-transform:none;letter-spacing:normal;word-wrap:normal;white-space:nowrap;direction:ltr;-webkit-font-smoothing:antialiased;text-rendering:optimizeLegibility;-moz-osx-font-smoothing:grayscale;font-feature-settings:\"liga\"}\n"] }]
433
- }], propDecorators: { filterInput: [{
434
- type: ViewChild,
435
- args: ['filterInput']
436
- }] } });
437
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlci1jaG9vc2VyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NsZWF2ZWxhbmRwcmljZS9uZ3gtbGliL2FjdGl2ZS1kaXJlY3RvcnkvbWF0ZXJpYWwvc3JjL2NvbXBvbmVudHMvdXNlci1jaG9vc2VyL3VzZXItY2hvb3Nlci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jbGVhdmVsYW5kcHJpY2Uvbmd4LWxpYi9hY3RpdmUtZGlyZWN0b3J5L21hdGVyaWFsL3NyYy9jb21wb25lbnRzL3VzZXItY2hvb3Nlci91c2VyLWNob29zZXIuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBYyxNQUFNLEVBQVUsU0FBUyxFQUFFLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM1RixPQUFPLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBRSxtQkFBbUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzdFLE9BQU8sRUFBRSxlQUFlLEVBQUUsZ0JBQWdCLEVBQUUsY0FBYyxFQUFFLGdCQUFnQixFQUFFLFlBQVksRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzdILE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxhQUFhLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUM1RixPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUM3RCxPQUFPLEVBQUUsWUFBWSxFQUFFLFFBQVEsRUFBYyxFQUFFLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFFOUQsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sMkNBQTJDLENBQUM7QUFDbkYsT0FBTyxFQUFhLGlCQUFpQixFQUFFLE1BQU0scUNBQXFDLENBQUM7QUFFbkYsT0FBTyxFQUFFLFNBQVMsRUFBRSxhQUFhLEVBQUUs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LFFBQVEsaVVBQ1IsaUJBQWlCLGdFQUNqQixhQUFhLG9NQUNiLGtCQUFrQiwrS0FDbEIsZ0JBQWdCLHVOQUNoQixjQUFjLG1UQUNkLFVBQVUsZ1JBQ1YsbUJBQW1COzsyRkFRZCxvQkFBb0I7a0JBekJoQyxTQUFTOzhCQUVHO3dCQUNMLFNBQVM7d0JBQ1QsZ0JBQWdCO3dCQUNoQixjQUFjO3dCQUNkLGdCQUFnQjt3QkFDaEIsWUFBWTt3QkFDWixPQUFPO3dCQUNQLGFBQWE7d0JBQ2IsUUFBUTt3QkFDUixpQkFBaUI7d0JBQ2pCLGFBQWE7d0JBQ2Isa0JBQWtCO3dCQUNsQixnQkFBZ0I7d0JBQ2hCLGNBQWM7d0JBQ2QsVUFBVTt3QkFDVixtQkFBbUI7cUJBQ3RCLGNBQ1csSUFBSTs4QkFvQlksV0FBVztzQkFBeEMsU0FBUzt1QkFBQyxhQUFhIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBFbGVtZW50UmVmLCBpbmplY3QsIE9uSW5pdCwgVmlld0NoaWxkLCB2aWV3Q2hpbGQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgRm9ybUNvbnRyb2wsIEZvcm1Hcm91cCwgUmVhY3RpdmVGb3Jtc01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuaW1wb3J0IHsgTUFUX0RJQUxPR19EQVRBLCBNYXREaWFsb2dBY3Rpb25zLCBNYXREaWFsb2dDbG9zZSwgTWF0RGlhbG9nQ29udGVudCwgTWF0RGlhbG9nUmVmIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZGlhbG9nJztcclxuaW1wb3J0IHsgTWF0TGlzdEl0ZW1BdmF0YXIsIE1hdExpc3RPcHRpb24sIE1hdFNlbGVjdGlvbkxpc3QgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9saXN0JztcclxuaW1wb3J0IHsgTWF0VGFibGVEYXRhU291cmNlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvdGFibGUnO1xyXG5pbXBvcnQgeyBkZWJvdW5jZVRpbWUsIGZvcmtKb2luLCBPYnNlcnZhYmxlLCBvZiB9IGZyb20gJ3J4anMnO1xyXG5cclxuaW1wb3J0IHsgQWN0aXZlRGlyZWN0b3J5U2VydmljZSB9IGZyb20gJ0BjbGVhdmVsYW5kcHJpY2Uvbmd4LWxpYi9hY3RpdmUtZGlyZWN0b3J5JztcclxuaW1wb3J0IHsgUGhvdG9JdGVtLCBTaGFyZVBvaW50U2VydmljZSB9IGZyb20gJ0BjbGVhdmVsYW5kcHJpY2Uvbmd4LWxpYi9zaGFyZXBvaW50JztcclxuXHJcbmltcG9ydCB7IE1hdEJ1dHRvbiwgTWF0SWNvbkJ1dHRvbiB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2J1dHRvbic7XHJcbmltcG9ydCB7IE1hdEZvcm1GaWVsZCB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2Zvcm0tZmllbGQnO1xyXG5pbXBvcnQgeyBNYXRJY29uIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvaWNvbic7XHJcbmltcG9ydCB7IE1hdElucHV0IH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvaW5wdXQnO1xyXG5pbXBvcnQgeyBNYXRQcm9ncmVzc1NwaW5uZXIgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9wcm9ncmVzcy1zcGlubmVyJztcclxuaW1wb3J0IHsgTWF0U2xpZGVUb2dnbGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9zbGlkZS10b2dnbGUnO1xyXG5pbXBvcnQgeyBNYXRUb29sdGlwIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvdG9vbHRpcCc7XHJcbmltcG9ydCB7IERlZmF1bHRVc2VyQ2hvb3NlckRhdGEgfSBmcm9tICcuLi8uLi9tb2RlbC9kZWZhdWx0LXVzZXItY2hvb3Nlci1kYXRhJztcclxuaW1wb3J0IHsgU2VsZWN0YWJsZUdyb3VwIH0gZnJvbSAnLi4vLi4vbW9kZWwvc2VsZWN0YWJsZS1ncm91cCc7XHJcbmltcG9ydCB7IFNlbGVjdGFibGVVc2VyIH0gZnJvbSAnLi4vLi4vbW9kZWwvc2VsZWN0YWJsZS11c2VyJztcclxuaW1wb3J0IHsgVXNlckNob29zZXJEYXRhIH0gZnJvbSAnLi4vLi4vbW9kZWwvdXNlci1jaG9vc2VyLWRhdGEnO1xyXG5pbXBvcnQgeyBVc2VyQ2hvb3Nlck1vZGUgfSBmcm9tICcuLi8uLi9tb2RlbC91c2VyLWNob29zZXItbW9kZSc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICAgIHRlbXBsYXRlVXJsOiAnLi91c2VyLWNob29zZXIuY29tcG9uZW50Lmh0bWwnLFxyXG4gICAgaW1wb3J0czogW1xyXG4gICAgICAgIE1hdEJ1dHRvbixcclxuICAgICAgICBNYXREaWFsb2dBY3Rpb25zLFxyXG4gICAgICAgIE1hdERpYWxvZ0Nsb3NlLFxyXG4gICAgICAgIE1hdERpYWxvZ0NvbnRlbnQsXHJcbiAgICAgICAgTWF0Rm9ybUZpZWxkLFxyXG4gICAgICAgIE1hdEljb24sXHJcbiAgICAgICAgTWF0SWNvbkJ1dHRvbixcclxuICAgICAgICBNYXRJbnB1dCxcclxuICAgICAgICBNYXRMaXN0SXRlbUF2YXRhcixcclxuICAgICAgICBNYXRMaXN0T3B0aW9uLFxyXG4gICAgICAgIE1hdFByb2dyZXNzU3Bpbm5lcixcclxuICAgICAgICBNYXRTZWxlY3Rpb25MaXN0LFxyXG4gICAgICAgIE1hdFNsaWRlVG9nZ2xlLFxyXG4gICAgICAgIE1hdFRvb2x0aXAsXHJcbiAgICAgICAgUmVhY3RpdmVGb3Jtc01vZHVsZSxcclxuICAgIF0sXHJcbiAgICBzdGFuZGFsb25lOiB0cnVlLFxyXG4gICAgc3R5bGVVcmxzOiBbXHJcbiAgICAgICAgJy4vdXNlci1jaG9vc2VyLmNvbXBvbmVudC5zY3NzJyxcclxuICAgICAgICAnLi4vLi4vLi4vLi4vLi4vc3R5bGVzL21hdC1pY29uLnNjc3MnXHJcbiAgICBdXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBVc2VyQ2hvb3NlckNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XHJcbiAgI3NlcnZpY2VzID0ge1xyXG4gICAgZGlhbG9nUmVmOiBpbmplY3QoTWF0RGlhbG9nUmVmPFVzZXJDaG9vc2VyQ29tcG9uZW50PiksXHJcbiAgICBhY3RpdmVEaXJlY3Rvcnk6IGluamVjdChBY3RpdmVEaXJlY3RvcnlTZXJ2aWNlKSxcclxuICAgIHNoYXJlUG9pbnQ6IGluamVjdChTaGFyZVBvaW50U2VydmljZSksXHJcbiAgICBkYXRhOiBpbmplY3Q8VXNlckNob29zZXJEYXRhPihNQVRfRElBTE9HX0RBVEEpXHJcbiAgfTtcclxuICBfZGF0YSA9IHsuLi5EZWZhdWx0VXNlckNob29zZXJEYXRhLCAuLi50aGlzLiNzZXJ2aWNlcy5kYXRhfTtcclxuXHJcbiAgLy8jcmVnaW9uIEZpZWxkc1xyXG5cclxuICAvL0BWaWV3Q2hpbGQoTWF0U2VsZWN0aW9uTGlzdCkgc2VsZWN0aW9uTGlzdD86IE1hdFNlbGVjdGlvbkxpc3Q7XHJcbiAgc2VsZWN0aW9uTGlzdCA9IHZpZXdDaGlsZChNYXRTZWxlY3Rpb25MaXN0KTtcclxuXHJcbiAgQFZpZXdDaGlsZCgnZmlsdGVySW5wdXQnKSBzZXQgZmlsdGVySW5wdXQoZWxSZWY6IEVsZW1lbnRSZWY8SFRNTElucHV0RWxlbWVudD4pIHtcclxuICAgIGlmIChlbFJlZikge1xyXG4gICAgICBlbFJlZi5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XHJcbiAgICB9XHJcbiAgfTtcclxuICAvL2ZpbHRlcklucHV0ID0gdmlld0NoaWxkPEVsZW1lbnRSZWY+KCdmaWx0ZXJJbnB1dCcpO1xyXG5cclxuICBmaWx0ZXJGb3JtID0gbmV3IEZvcm1Hcm91cCh7XHJcbiAgICBmaWx0ZXI6IG5ldyBGb3JtQ29udHJvbCgpXHJcbiAgfSk7XHJcblxyXG4gIGRhdGFTb3VyY2U/OiBNYXRUYWJsZURhdGFTb3VyY2U8U2VsZWN0YWJsZVVzZXIgfCBTZWxlY3RhYmxlR3JvdXA+O1xyXG4gIHBob3Rvcz86IFBob3RvSXRlbVtdO1xyXG4gIGdyb3Vwcz86IFNlbGVjdGFibGVHcm91cFtdOyAvLyBNYXkgb3IgbWF5IG5vdCBnZXQgcG9wdWxhdGVkLCBkZXBlbmRpbmcgb24gY29uZmlnIGRhdGEgc2VudCBpblxyXG4gIC8vI2VuZHJlZ2lvblxyXG5cclxuICAvLyNyZWdpb24gUHJvcGVydGllc1xyXG4gIGdldCBpc011bHRpTW9kZSgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9kYXRhLm1vZGUgPT09IFVzZXJDaG9vc2VyTW9kZS5NdWx0aXBsZTtcclxuICB9XHJcblxyXG4gIGdldCBzZWxlY3RlZE9wdGlvbnMoKTogTWF0TGlzdE9wdGlvbltdIHtcclxuICAgIHJldHVybiB0aGlzLnNlbGVjdGlvbkxpc3QoKT8ub3B0aW9ucy5maWx0ZXIobyA9PiBvLnNlbGVjdGVkKSA/PyBbXTtcclxuICB9XHJcblxyXG4gIGdldCBzZWxlY3RlZFVzZXJzKCk6IChTZWxlY3RhYmxlVXNlciB8IFNlbGVjdGFibGVHcm91cClbXSB7XHJcbiAgICByZXR1cm4gdGhpcy5kYXRhU291cmNlPy5kYXRhPy5maWx0ZXIoZCA9PiBkLnNlbGVjdGVkKSA/PyBbXTtcclxuICB9XHJcblxyXG4gIGdldCBmaWx0ZXJWYWx1ZSgpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMuZmlsdGVyRm9ybS52YWx1ZS5maWx0ZXI7XHJcbiAgfVxyXG5cclxuICBnZXQgYWRHcm91cHNOZWVkZWQoKTogYm9vbGVhbiB7XHJcbiAgICAvLyBJZiBhbnkgYXJlIHRoZXNlIGFyZSB0cnVlLCB0aGVuIHdlIG5lZWQgdG8gcHVsbCBBRCBncm91cHMgZm9yIHVzZSBsYXRlclxyXG4gICAgcmV0dXJuICh0aGlzLl9kYXRhLnNob3dHcm91cE1lbWJlcnNoaXBUb29sdGlwcyA/PyBmYWxzZSkgfHxcclxuICAgICAgKHRoaXMuX2RhdGEuZXhjbHVzaW9ucz8uZ3JvdXBzPy5sZW5ndGggPz8gMCkgPiAwIHx8XHJcbiAgICAgICh0aGlzLl9kYXRhLmluY2x1c2lvbnM/Lmdyb3Vwcz8ubGVuZ3RoID8/IDApID4gMCB8fFxyXG4gICAgICAodGhpcy5fZGF0YS5wcmVTZWxlY3Rpb25zPy5ncm91cHM/Lmxlbmd0aCA/PyAwKSA+IDAgfHxcclxuICAgICAgdGhpcy5fZGF0YS5maWx0ZXJPcHRpb25zPy5ncm91cE1lbWJlcnNoaXAgfHxcclxuICAgICAgKHRoaXMuX2RhdGEuc2VsZWN0YWJsZUdyb3VwTmFtZXM/Lmxlbmd0aCA/PyAwKSA+IDAgfHxcclxuICAgICAgKHRoaXMuX2RhdGEuZ3JvdXBzPy5sZW5ndGggPz8gMCkgPiAwO1xyXG4gIH1cclxuICAvLyNlbmRyZWdpb25cclxuXHJcbiAgLy8jcmVnaW9uIExpZmVjeWNsZVxyXG4gIG5nT25Jbml0KCk6IHZvaWQge1xyXG4gICAgdGhpcy4jZ2V0RGF0YSgpO1xyXG4gICAgdGhpcy4jbGlzdGVuRm9yRmlsdGVyQ2hhbmdlcygpO1xyXG4gIH1cclxuICAvLyNlbmRyZWdpb25cclxuXHJcbiAgLy8jcmVnaW9uIEV2ZW50c1xyXG4gIGxpc3RTZWxlY3Rpb25DaGFuZ2VkKG9wdGlvbnM6IE1hdExpc3RPcHRpb25bXSk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuX2RhdGEubW9kZSA9PT0gVXNlckNob29zZXJNb2RlLlNpbmdsZSAmJlxyXG4gICAgICB0aGlzLnNlbGVjdGVkT3B0aW9ucy5sZW5ndGggJiZcclxuICAgICAgdGhpcy5fZGF0YS5jbG9zZVdoZW5TZWxlY3Rpb25NYWRlXHJcbiAgICAgICkge1xyXG4gICAgICB0aGlzLmNsb3NlKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBvcHRpb25TZWxlY3Rpb25DaGFuZ2VkKG9wdGlvbjogTWF0TGlzdE9wdGlvbik6IHZvaWQge1xyXG4gICAgY29uc3QgdXNlciA9IHRoaXMuZGF0YVNvdXJjZT8uZGF0YVxyXG4gICAgICAuZmluZCh1ID0+IHUuc0FNQWNjb3VudE5hbWUudG9Mb2NhbGVMb3dlckNhc2UoKSA9PT0gKG9wdGlvbi52YWx1ZSBhcyBTZWxlY3RhYmxlVXNlcikuc0FNQWNjb3VudE5hbWUudG9Mb3dlckNhc2UoKSk7XHJcblxyXG4gICAgaWYgKHVzZXIpIHtcclxuICAgICAgLy8gSWYgd2UgYXJlIGluIHNpbmdsZSB1c2VyIHNlbGVjdGlvbiBtb2RlLCBkZXNlbGVjdCBhbnkgZXhpc3Rpbmcgc2VsZWN0aW9ucyBmaXJzdFxyXG4gICAgICBpZiAoIXRoaXMuaXNNdWx0aU1vZGUgJiYgb3B0aW9uLnNlbGVjdGVkKSB7XHJcbiAgICAgICAgdGhpcy5kYXRhU291cmNlPy5kYXRhXHJcbiAgICAgICAgICAuZmlsdGVyKHUgPT4gdS5zQU1BY2NvdW50TmFtZS50b0xvd2VyQ2FzZSgpICE9PSAob3B0aW9uLnZhbHVlIGFzIFNlbGVjdGFibGVVc2VyKS5zQU1BY2NvdW50TmFtZS50b0xvd2VyQ2FzZSgpKVxyXG4gICAgICAgICAgLmZvckVhY2godSA9PiB1LnNlbGVjdGVkID0gZmFsc2UpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICB1c2VyLnNlbGVjdGVkID0gb3B0aW9uLnNlbGVjdGVkO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgaGlkZVVuc2VsZWN0ZWRDaGFuZ2VkKHNlbGVjdGVkOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICB0aGlzLmZpbHRlckZvcm0uZ2V0KCdmaWx0ZXInKT8uc2V0VmFsdWUoc2VsZWN0ZWQgPyAne3NlbGVjdGVkOnRydWV9JyA6IG51bGwpO1xyXG4gIH1cclxuXHJcbiAgc2VsZWN0QWxsKCk6IHZvaWQge1xyXG4gICAgdGhpcy5zZWxlY3Rpb25MaXN0KCk/LnNlbGVjdEFsbCgpO1xyXG5cclxuICAgIGlmICh0aGlzLnNlbGVjdGlvbkxpc3QoKT8ub3B0aW9ucykge1xyXG4gICAgICB0aGlzLmxpc3RTZWxlY3Rpb25DaGFuZ2VkKHRoaXMuc2VsZWN0aW9uTGlzdCgpIS5vcHRpb25zLnRvQXJyYXkoKSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBkZXNlbGVjdEFsbCgpOiB2b2lkIHtcclxuICAgIHRoaXMuc2VsZWN0aW9uTGlzdCgpPy5kZXNlbGVjdEFsbCgpO1xyXG4gIH1cclxuICAvLyNlbmRyZWdpb25cclxuXHJcbiAgLy8jcmVnaW9uIFV0aWxpdGllc1xyXG4gIGlzVXNlcih1c2VyT3JHcm91cDogU2VsZWN0YWJsZVVzZXIgfCBTZWxlY3RhYmxlR3JvdXApOiBib29sZWFuIHtcclxuICAgIHJldHVybiAndGl0bGUnIGluIHVzZXJPckdyb3VwO1xyXG4gIH1cclxuICBjYXN0VXNlcih1c2VyT3JHcm91cDogU2VsZWN0YWJsZVVzZXIgfCBTZWxlY3RhYmxlR3JvdXApOiBTZWxlY3RhYmxlVXNlciB7XHJcbiAgICByZXR1cm4gdXNlck9yR3JvdXAgYXMgU2VsZWN0YWJsZVVzZXI7XHJcbiAgfVxyXG5cclxuICAjZ2V0RGF0YSgpOiB2b2lkIHtcclxuICAgIGNvbnN0IG9ic2VydmFibGVzJDogT2JzZXJ2YWJsZTxhbnk+W10gPSBbXHJcbiAgICAgIHRoaXMuX2RhdGEudXNlcnM/Lmxlbmd0aCA/XHJcbiAgICAgICAgLy8gVXNlcnMgd2VyZSBwYXNzZWQgaW5cclxuICAgICAgICBvZih0aGlzLl9kYXRhLnVzZXJzKSA6XHJcbiAgICAgICAgLy8gVXNlcnMgbmVlZCB0byBiZSByZXRyaWV2ZWRcclxuICAgICAgICB0aGlzLiNzZXJ2aWNlcy5hY3RpdmVEaXJlY3RvcnkuZ2V0VXNlcnMoZmFsc2UsIHRoaXMuX2RhdGEuaW5jbHVkZURpc2FibGVkVXNlcnMsIHRoaXMuX2RhdGEucGFyZW50T3UpLFxyXG5cclxuICAgICAgdGhpcy5fZGF0YS5waG90b3M/Lmxlbmd0aCA/XHJcbiAgICAgICAgLy8gUGhvdG9zIHdlcmUgcGFzc2VkIGluXHJcbiAgICAgICAgb2YodGhpcy5fZGF0YS5waG90b3MpIDpcclxuICAgICAgICAvLyBQaG90b3MgbmVlZCB0byBiZSByZXRyaWV2ZWRcclxuICAgICAgICB0aGlzLiNzZXJ2aWNlcy5zaGFyZVBvaW50LmdldFBob3RvcygpXHJcbiAgICBdO1xyXG5cclxuICAgIC8vIERvIHdlIG5lZWQgQUQgZ3JvdXBzP1xyXG4gICAgaWYgKHRoaXMuYWRHcm91cHNOZWVkZWQpIHtcclxuICAgICAgb2JzZXJ2YWJsZXMkLnB1c2goXHJcbiAgICAgICAgdGhpcy5fZGF0YS5ncm91cHM/Lmxlbmd0aCA/XHJcbiAgICAgICAgICAvLyBHcm91cHMgd2VyZSBwYXNzZWQgaW5cclxuICAgICAgICAgIG9mKHRoaXMuX2RhdGEuZ3JvdXBzKSA6XHJcbiAgICAgICAgICAvLyBHcm91cHMgbmVlZCB0byBiZSByZXRyaWV2ZWRcclxuICAgICAgICAgIHRoaXMuI3NlcnZpY2VzLmFjdGl2ZURpcmVjdG9yeS5nZXRHcm91cHMoKVxyXG4gICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIGZvcmtKb2luKG9ic2VydmFibGVzJClcclxuICAgICAgLy8uc3Vic2NyaWJlKChbdXNlcnMsIHBob3Rvc10pID0+IHtcclxuICAgICAgLnN1YnNjcmliZShkYXRhID0+IHtcclxuICAgICAgICAvLyBOZWVkIGdyb3VwcyBpbiBwbGFjZSBiZWZvcmUgd2UgaGFuZGxlIGV4Y2x1c2lvbnMvaW5jbHVzaW9ucy9wcmUtc2VsZWN0aW9uc1xyXG4gICAgICAgIHRoaXMuZ3JvdXBzID0gdGhpcy5hZEdyb3Vwc05lZWRlZCA/XHJcbiAgICAgICAgICBkYXRhWzJdIDpcclxuICAgICAgICAgIG51bGw7XHJcblxyXG4gICAgICAgIGxldCB1c2VycyA9IGRhdGFbMF0gYXMgU2VsZWN0YWJsZVVzZXJbXTtcclxuICAgICAgICB1c2Vycy5mb3JFYWNoKHUgPT4gdS5zZWxlY3RlZCA9IGZhbHNlKTsgLy8gSW4gY2FzZSBleGlzdGluZyBkYXRhIHdhcyByZS11c2VkXHJcbiAgICAgICAgdXNlcnMgPSB0aGlzLiNpbmNsdWRlVXNlcnNCeUFjY291bnROYW1lKHVzZXJzKTtcclxuICAgICAgICB1c2VycyA9IHRoaXMuI2luY2x1ZGVVc2Vyc0J5R3JvdXBOYW1lKHVzZXJzKTtcclxuICAgICAgICB1c2VycyA9IHRoaXMuI2luY2x1ZGVVc2Vyc0J5RGVwYXJ0bWVudCh1c2Vycyk7XHJcbiAgICAgICAgdXNlcnMgPSB0aGlzLiNpbmNsdWRlVXNlcnNCeVRpdGxlKHVzZXJzKTtcclxuXHJcbiAgICAgICAgdXNlcnMgPSB0aGlzLiNleGNsdWRlVXNlcnNCeUFjY291bnROYW1lKHVzZXJzKTtcclxuICAgICAgICB1c2VycyA9IHRoaXMuI2V4Y2x1ZGVVc2Vyc0J5R3JvdXBOYW1lKHVzZXJzKTtcclxuICAgICAgICB1c2VycyA9IHRoaXMuI2V4Y2x1ZGVVc2Vyc0J5RGVwYXJ0bWVudCh1c2Vycyk7XHJcbiAgICAgICAgdXNlcnMgPSB0aGlzLiNleGNsdWRlVXNlcnNCeVRpdGxlKHVzZXJzKTtcclxuXHJcbiAgICAgICAgdXNlcnMgPSB0aGlzLiNwcmVTZWxlY3RVc2Vyc0J5QWNjb3VudE5hbWUodXNlcnMpO1xyXG4gICAgICAgIHVzZXJzID0gdGhpcy4jcHJlU2VsZWN0VXNlcnNCeUdyb3VwTmFtZSh1c2Vycyk7XHJcbiAgICAgICAgdXNlcnMgPSB0aGlzLiNwcmVTZWxlY3RVc2Vyc0J5RGVwYXJ0bWVudCh1c2Vycyk7XHJcbiAgICAgICAgdXNlcnMgPSB0aGlzLiNwcmVTZWxlY3RVc2Vyc0J5VGl0bGUodXNlcnMpO1xyXG5cclxuICAgICAgICB0aGlzLiNwcmVTZWxlY3RHcm91cHNCeUFjY291bnROYW1lKCk7XHJcblxyXG4gICAgICAgIGNvbnN0IHVzZXJzQW5kR3JvdXBzOiAoU2VsZWN0YWJsZVVzZXIgfCBTZWxlY3RhYmxlR3JvdXApW10gPSBbXTtcclxuXHJcbiAgICAgICAgLy8gU2hvdWxkIHdlIGFsbG93IHVzZXJzIHRvIGJlIHNlbGVjdGVkP1xyXG4gICAgICAgIGlmIChbJ3VzZXJzJywgJyonXS5pbmNsdWRlcyh0aGlzLl9kYXRhLm9iamVjdFR5cGVzISkpIHtcclxuICAgICAgICAgIHVzZXJzQW5kR3JvdXBzLnB1c2goLi4udXNlcnMpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gU2hvdWxkIHdlIGFsbG93IGdyb3VwcyB0byBiZSBzZWxlY3RlZFxyXG5cclxuICAgICAgICBpZiAoWydncm91cHMnLCAnKiddLmluY2x1ZGVzKHRoaXMuX2RhdGEub2JqZWN0VHlwZXMhKSkge1xyXG4gICAgICAgICAgaWYgKHRoaXMuX2RhdGEuc2VsZWN0YWJsZUdyb3VwTmFtZXM/Lmxlbmd0aCkge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5fZGF0YS5zZWxlY3RhYmxlR3JvdXBOYW1lcy5pbmNsdWRlcygnKicpKSB7XHJcbiAgICAgICAgICAgICAgdXNlcnNBbmRHcm91cHMucHVzaCguLi50aGlzLmdyb3VwcyEpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgIHRoaXMuX2RhdGEuc2VsZWN0YWJsZUdyb3VwTmFtZXNcclxuICAgICAgICAgICAgICAgIC5mb3JFYWNoKGdyb3VwTmFtZSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGdyb3VwID0gdGhpcy5ncm91cHMhLmZpbmQoZyA9PiBnLmRpc3BsYXlOYW1lID09PSBncm91cE5hbWUpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgaWYgKGdyb3VwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdXNlcnNBbmRHcm91cHMucHVzaCh7XHJcbiAgICAgICAgICAgICAgICAgICAgICAuLi5ncm91cCxcclxuICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkOiBncm91cC5zZWxlY3RlZFxyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5kYXRhU291cmNlID0gbmV3IE1hdFRhYmxlRGF0YVNvdXJjZSh1c2Vyc0FuZEdyb3Vwcyk7XHJcblxyXG4gICAgICAgIHRoaXMucGhvdG9zID0gZGF0YVsxXTtcclxuXHJcbiAgICAgICAgdGhpcy4jc2V0RmlsdGVyUHJlZGljYXRlKCk7XHJcbiAgICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgY2xvc2UoKTogdm9pZCB7XHJcbiAgICBpZiAoIXRoaXMuc2VsZWN0ZWRVc2Vycz8ubGVuZ3RoKSB7XHJcbiAgICAgIHRoaXMuI3NlcnZpY2VzLmRpYWxvZ1JlZi5jbG9zZSh0aGlzLl9kYXRhLmFsbG93Q2xvc2VXaXRob3V0U2VsZWN0aW9ucyA/IFtdIDogdW5kZWZpbmVkKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgY29uc3QgdmFsdWUgPSB0aGlzLnNlbGVjdGVkVXNlcnNcclxuICAgICAgLm1hcCh1ID0+IHRoaXMuX2RhdGEucmV0dXJuVXNlck9iamVjdHMgPyB1IDogdS5zQU1BY2NvdW50TmFtZSk7XHJcblxyXG4gICAgdGhpcy4jc2VydmljZXMuZGlhbG9nUmVmLmNsb3NlKHRoaXMuX2RhdGEubW9kZSA9PT0gVXNlckNob29zZXJNb2RlLk11bHRpcGxlID9cclxuICAgICAgdmFsdWUgOlxyXG4gICAgICB2YWx1ZVswXVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIGdldFBob3RvKHVzZXI6IFNlbGVjdGFibGVVc2VyIHwgU2VsZWN0YWJsZUdyb3VwKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcclxuICAgIGlmICghdGhpcy5pc1VzZXIodXNlcikpIHsgcmV0dXJuOyB9XHJcblxyXG4gICAgcmV0dXJuIHRoaXMucGhvdG9zPy5maW5kKHAgPT5cclxuICAgICAgKHAuZW1wbG95ZWVOdW1iZXIgJiYgcC5lbXBsb3llZU51bWJlci50b1N0cmluZygpID09PSAodXNlciBhcyBTZWxlY3RhYmxlVXNlcikuZW1wbG95ZWVOdW1iZXIpIHx8XHJcbiAgICAgIHAuYWNjb3VudE5hbWU/LnRvTG93ZXJDYXNlKCkgPT09IHVzZXIuc0FNQWNjb3VudE5hbWUudG9Mb3dlckNhc2UoKSB8fFxyXG4gICAgICBwLmRpc3BsYXlOYW1lPy50b0xvd2VyQ2FzZSgpID09PSAodXNlci5kaXNwbGF5TmFtZSA/PyB1c2VyLm5hbWUpLnRvTG93ZXJDYXNlKCkgfHxcclxuICAgICAgcC50aXRsZT8udG9Mb3dlckNhc2UoKSA9PT0gKHVzZXIuZGlzcGxheU5hbWUgPz8gdXNlci5uYW1lKS50b0xvd2VyQ2FzZSgpXHJcbiAgICApPy5lbmNvZGVkQWJzVXJsO1xyXG4gIH1cclxuXHJcbiAgLy8jcmVnaW9uIEV4Y2x1c2lvbnMgLSB3b24ndCBiZSBpbmNsdWRlZCBpbiB0aGUgZGF0YVNvdXJjZSBhdCBhbGxcclxuICAjZXhjbHVkZVVzZXJzQnlBY2NvdW50TmFtZSh1c2VyczogU2VsZWN0YWJsZVVzZXJbXSk6IFNlbGVjdGFibGVVc2VyW10ge1xyXG4gICAgdGhpcy5fZGF0YS5leGNsdXNpb25zPy5hY2NvdW50TmFtZXNcclxuICAgICAgPy5mb3JFYWNoKGFjY291bnROYW1lID0+IHtcclxuICAgICAgICBjb25zdCBpbmRleCA9IHVzZXJzLmZpbmRJbmRleCh1ID0+IHUuc0FNQWNjb3VudE5hbWUudG9Mb3dlckNhc2UoKSA9PT0gYWNjb3VudE5hbWUudG9Mb3dlckNhc2UoKSk7XHJcbiAgICAgICAgaWYgKGluZGV4ID09PSAtMSkgeyByZXR1cm47IH1cclxuXHJcbiAgICAgICAgdXNlcnMuc3BsaWNlKGluZGV4LCAxKTtcclxuICAgICAgfSk7XHJcblxyXG4gICAgcmV0dXJuIHVzZXJzO1xyXG4gIH1cclxuXHJcbiAgI2V4Y2x1ZGVVc2Vyc0J5R3JvdXBOYW1lKHVzZXJzOiBTZWxlY3RhYmxlVXNlcltdKTogU2VsZWN0YWJsZVVzZXJbXSB7XHJcbiAgICB0aGlzLl9kYXRhLmV4Y2x1c2lvbnM/Lmdyb3Vwc1xyXG4gICAgICA/LmZvckVhY2goZ3JvdXBOYW1lID0+IHtcclxuICAgICAgICBjb25zdCBncm91cCA9IHRoaXMuZ3JvdXBzPy5maW5kKGcgPT4gZy5uYW1lLnRvTG93ZXJDYXNlKCkgPT09IGdyb3VwTmFtZS50b0xvd2VyQ2FzZSgpKTtcclxuICAgICAgICBpZiAoIWdyb3VwKSB7IHJldHVybjsgfVxyXG5cclxuICAgICAgICBncm91cC5tZW1iZXIuZm9yRWFjaChncm91cE1lbWJlckRuID0+IHtcclxuICAgICAgICAgIGNvbnN0IGluZGV4ID0gdXNlcnMuZmluZEluZGV4KHUgPT4gdS5kaXN0aW5ndWlzaGVkTmFtZSA9PT0gZ3JvdXBNZW1iZXJEbik7XHJcbiAgICAgICAgICBpZiAoaW5kZXggPT09IC0xKSB7IHJldHVybjsgfVxyXG5cclxuICAgICAgICAgIHVzZXJzLnNwbGljZShpbmRleCwgMSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH0pO1xyXG5cclxuICAgIHJldHVybiB1c2VycztcclxuICB9XHJcblxyXG4gICNleGNsdWRlVXNlcnNCeURlcGFydG1lbnQodXNlcnM6IFNlbGVjdGFibGVVc2VyW10pOiBTZWxlY3RhYmxlVXNlcltdIHtcclxuICAgIHRoaXMuX2RhdGEuZXhjbHVzaW9ucz8uZGVwYXJ0bWVudHNcclxuICAgICAgPy5mb3JFYWNoKGRlcGFydG1lbnQgPT4ge1xyXG4gICAgICAgIGNvbnN0IGV4Y2x1ZGVkVXNlcnMgPSB1c2Vycy5maWx0ZXIodSA9PiB1LmRlcGFydG1lbnQ/LnRvTG93ZXJDYXNlKCkgPT09IGRlcGFydG1lbnQudG9Mb3dlckNhc2UoKSk7XHJcblxyXG4gICAgICAgIGV4Y2x1ZGVkVXNlcnMuZm9yRWFjaCh1c2VyID0+IHtcclxuICAgICAgICAgIGNvbnN0IGluZGV4ID0gdXNlcnMuaW5kZXhPZih1c2VyKTtcclxuICAgICAgICAgIHVzZXJzLnNwbGljZShpbmRleCwgMSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH0pO1xyXG5cclxuICAgIHJldHVybiB1c2VycztcclxuICB9XHJcblxyXG4gICNleGNsdWRlVXNlcnNCeVRpdGxlKHVzZXJzOiBTZWxlY3RhYmxlVXNlcltdKTogU2VsZWN0YWJsZVVzZXJbXSB7XHJcbiAgICB0aGlzLl9kYXRhLmV4Y2x1c2lvbnM/LnRpdGxlc1xyXG4gICAgICA/LmZvckVhY2godGl0bGUgPT4ge1xyXG4gICAgICAgIGNvbnN0IGV4Y2x1ZGVkVXNlcnMgPSB1c2Vycy5maWx0ZXIodSA9PiB1LnRpdGxlPy50b0xvd2VyQ2FzZSgpID09PSB0aXRsZS50b0xvd2VyQ2FzZSgpKTtcclxuXHJcbiAgICAgICAgZXhjbHVkZWRVc2Vycy5mb3JFYWNoKHVzZXIgPT4ge1xyXG4gICAgICAgICAgY29uc3QgaW5kZXggPSB1c2Vycy5pbmRleE9mKHVzZXIpO1xyXG4gICAgICAgICAgdXNlcnMuc3BsaWNlKGluZGV4LCAxKTtcclxuICAgICAgICB9KTtcclxuICAgICAgfSk7XHJcblxyXG4gICAgcmV0dXJuIHVzZXJzO1xyXG4gIH1cclxuICAvLyNlbmRyZWdpb25cclxuXHJcbiAgLy8jcmVnaW9uIEluY2x1c2lvbnMgLSBvbmx5IHRoZXNlIHdpbGwgYmUgaW5jbHVkZWQgaW4gdGhlIGRhdGFTb3VyY2VcclxuICAjaW5jbHVkZVVzZXJzQnlBY2NvdW50TmFtZSh1c2VyczogU2VsZWN0YWJsZVVzZXJbXSk6IFNlbGVjdGFibGVVc2VyW10ge1xyXG4gICAgcmV0dXJuIHVzZXJzLmZpbHRlcih1c2VyID0+XHJcbiAgICAgICF0aGlzLl9kYXRhLmluY2x1c2lvbnM/LmFjY291bnROYW1lcz8ubGVuZ3RoIHx8IC8vIE5vIGFjY291bnQgaW5jbHVzaW9ucyBzcGVjaWZpZWRcclxuXHJcbiAgICAgIHRoaXMuX2RhdGEuaW5jbHVzaW9ucy5hY2NvdW50TmFtZXMuZmluZChhY2NvdW50TmFtZSA9PlxyXG4gICAgICAgIGFjY291bnROYW1lLnRvTG93ZXJDYXNlKCkgPT09IHVzZXIuc0FNQWNjb3VudE5hbWUudG9Mb3dlckNhc2UoKVxyXG4gICAgICApKTtcclxuICB9XHJcblxyXG4gICNpbmNsdWRlVXNlcnNCeURlcGFydG1lbnQodXNlcnM6IFNlbGVjdGFibGVVc2VyW10pOiBTZWxlY3RhYmxlVXNlcltdIHtcclxuICAgIHJldHVybiB1c2Vycy5maWx0ZXIodXNlciA9PlxyXG4gICAgICAhdGhpcy5fZGF0YS5pbmNsdXNpb25zPy5kZXBhcnRtZW50cz8ubGVuZ3RoIHx8IC8vIE5vIGRlcGFydG1lbnQgaW5jbHVzaW9ucyBzcGVjaWZpZWRcclxuXHJcbiAgICAgIHRoaXMuX2RhdGEuaW5jbHVzaW9ucy5kZXBhcnRtZW50cy5maW5kKGRlcGFydG1lbnQgPT5cclxuICAgICAgICBkZXBhcnRtZW50LnRvTG93ZXJDYXNlKCkgPT09IHVzZXIuZGVwYXJ0bWVudD8udG9Mb3dlckNhc2UoKVxyXG4gICAgICApKTtcclxuICB9XHJcblxyXG4gICNpbmNsdWRlVXNlcnNCeVRpdGxlKHVzZXJzOiBTZWxlY3RhYmxlVXNlcltdKTogU2VsZWN0YWJsZVVzZXJbXSB7XHJcbiAgICByZXR1cm4gdXNlcnMuZmlsdGVyKHVzZXIgPT5cclxuICAgICAgIXRoaXMuX2RhdGEuaW5jbHVzaW9ucz8udGl0bGVzPy5sZW5ndGggfHwgLy8gTm8gdGl0bGUgaW5jbHVzaW9ucyBzcGVjaWZpZWRcclxuXHJcbiAgICAgIHRoaXMuX2RhdGEuaW5jbHVzaW9ucy50aXRsZXMuZmluZCh0aXRsZSA9PlxyXG4gICAgICAgIHRpdGxlLnRvTG93ZXJDYXNlKCkgPT09IHVzZXIudGl0bGU/LnRvTG93ZXJDYXNlKClcclxuICAgICAgKSk7XHJcbiAgfVxyXG5cclxuICAjaW5jbHVkZVVzZXJzQnlHcm91cE5hbWUodXNlcnM6IFNlbGVjdGFibGVVc2VyW10pOiBTZWxlY3RhYmxlVXNlcltdIHtcclxuICAgIGlmICghdGhpcy5fZGF0YS5pbmNsdXNpb25zPy5ncm91cHM/Lmxlbmd0aCkge1xyXG4gICAgICByZXR1cm4gdXNlcnM7IC8vIE5vIGdyb3VwIGluY2x1c2lvbnMgc3BlY2lmaWVkXHJcbiAgICB9XHJcblxyXG4gICAgLy8gQ2hlYXRpbmcgYSBiaXQgYW5kIGxldmVyYWdpbmcgdGhlICdzZWxlY3RlZCcgcHJvcGVydHkgdG8ga2VlcCB0cmFjayBvZiB3aG8gc2hvdWxkIGJlIGluY2x1ZGVkXHJcbiAgICAvLyBTaW5jZSBpbmNsdXNpb25zIGhhcHBlbiBiZWZvciBwcmUtc2VsZWN0aW9ucywgd2UgY2FuIGRvIHRoYXQsIGFzIGxvbmcgYXMgd2Ugc2V0ICdzZWxlY3RlZCcgYmFjayB0byBmYWxzZSB3aGVuIHdlJ3JlIGRvbmVcclxuICAgIHRoaXMuX2RhdGEuaW5jbHVzaW9ucy5ncm91cHNcclxuICAgICAgLmZvckVhY2goZ3JvdXBOYW1lID0+IHtcclxuICAgICAgICBjb25zdCBncm91cCA9IHRoaXMuZ3JvdXBzPy5maW5kKGcgPT4gZy5uYW1lLnRvTG93ZXJDYXNlKCkgPT09IGdyb3VwTmFtZS50b0xvd2VyQ2FzZSgpKTtcclxuICAgICAgICBpZiAoIWdyb3VwKSB7IHJldHVybjsgfVxyXG5cclxuICAgICAgICB1c2Vyc1xyXG4gICAgICAgICAgLmZpbHRlcih1c2VyID0+XHJcbiAgICAgICAgICAgICAgZ3JvdXAubWVtYmVyLmZpbmQoZ3JvdXBNZW1iZXJEbiA9PiBncm91cE1lbWJlckRuID09PSB1c2VyLmRpc3Rpbmd1aXNoZWROYW1lKVxyXG4gICAgICAgICAgKVxyXG4gICAgICAgICAgLmZvckVhY2godXNlciA9PiB1c2VyLnNlbGVjdGVkID0gdHJ1ZSk7XHJcbiAgICAgIH0pO1xyXG5cclxuICAgIC8vIEF0IHRoaXMgcG9pbnQsIGFsbCBvZiB0aGUgYXBwcm9wcmlhdGUgdXNlcnMgc2hvdWxkIGhhdmUgJ3NlbGVjdGVkJyBzZXQgdG8gdHJ1ZVxyXG4gICAgY29uc3Qgc2VsZWN0ZWRVc2VycyA9IHVzZXJzLmZpbHRlcih1c2VyID0+IHVzZXIuc2VsZWN0ZWQpOyAvLyBTdWJzZXQgb2YgdGhlIG9yaWdpbmFsIGxpc3RcclxuICAgIC8vIFJlc2V0ICdzZWxlY3RlZCcgdG8gZmFsc2UsIGFuZCByZXR1cm5cclxuICAgIHNlbGVjdGVkVXNlcnMuZm9yRWFjaCh1c2VyID0+IHVzZXIuc2VsZWN0ZWQgPSBmYWxzZSk7XHJcbiAgICByZXR1cm4gc2VsZWN0ZWRVc2VycztcclxuICB9XHJcbiAgLy8jZW5kcmVnaW9uXHJcblxyXG4gIC8vI3JlZ2lvbiAgUHJlLVNlbGVjdGlvbnNcclxuICAjcHJlU2VsZWN0VXNlcnNCeUFjY291bnROYW1lKHVzZXJzOiBTZWxlY3RhYmxlVXNlcltdKTogU2VsZWN0YWJsZVVzZXJbXSB7XHJcbiAgICB0aGlzLl9kYXRhLnByZVNlbGVjdGlvbnM/LmFjY291bnROYW1lc1xyXG4gICAgICA/LmZvckVhY2goYWNjb3VudE5hbWUgPT4ge1xyXG4gICAgICAgIGNvbnN0IHVzZXIgPSB1c2Vycy5maW5kKHUgPT4gdS5zQU1BY2NvdW50TmFtZS50b0xvd2VyQ2FzZSgpID09PSBhY2NvdW50TmFtZS50b0xvd2VyQ2FzZSgpKTtcclxuICAgICAgICBpZiAoIXVzZXIpIHsgcmV0dXJuOyB9XHJcblxyXG4gICAgICAgIHVzZXIuc2VsZWN0ZWQgPSB0cnVlO1xyXG4gICAgICB9KTtcclxuXHJcbiAgICByZXR1cm4gdXNlcnM7XHJcbiAgfVxyXG5cclxuICAjcHJlU2VsZWN0R3JvdXBzQnlBY2NvdW50TmFtZSgpOiB2b2lkIHtcclxuICAgIHRoaXMuX2RhdGEucHJlU2VsZWN0aW9ucz8uYWNjb3VudE5hbWVzXHJcbiAgICAgID8uZm9yRWFjaChhY2NvdW50TmFtZSA9PiB7XHJcbiAgICAgICAgY29uc3QgZ3JvdXAgPSB0aGlzLmdyb3Vwcz8uZmluZChnID0+IGcuc0FNQWNjb3VudE5hbWUudG9Mb3dlckNhc2UoKSA9PT0gYWNjb3VudE5hbWUudG9Mb3dlckNhc2UoKSk7XHJcbiAgICAgICAgaWYgKCFncm91cCkgeyByZXR1cm47IH1cclxuXHJcbiAgICAgICAgZ3JvdXAuc2VsZWN0ZWQgPSB0cnVlO1xyXG4gICAgICB9KTs7XHJcbiAgfVxyXG5cclxuICAjcHJlU2VsZWN0VXNlcnNCeURlcGFydG1lbnQodXNlcnM6IFNlbGVjdGFibGVVc2VyW10pOiBTZWxlY3RhYmxlVXNlcltdIHtcclxuICAgIHRoaXMuX2RhdGEucHJlU2VsZWN0aW9ucz8uZGVwYXJ0bWVudHNcclxuICAgICAgPy5mb3JFYWNoKGRlcGFydG1lbnQgPT5cclxuICAgICAgICB1c2Vyc1xyXG4gICAgICAgICAgLmZpbHRlcih1ID0+IHUuZGVwYXJ0bWVudD8udG9Mb3dlckNhc2UoKSA9PT0gZGVwYXJ0bWVudC50b0xvd2VyQ2FzZSgpKVxyXG4gICAgICAgICAgLmZvckVhY2godXNlciA9PiB1c2VyLnNlbGVjdGVkID0gdHJ1ZSlcclxuICAgICAgKTtcclxuXHJcbiAgICByZXR1cm4gdXNlcnM7XHJcbiAgfVxyXG5cclxuICAjcHJlU2VsZWN0VXNlcnNCeVRpdGxlKHVzZXJzOiBTZWxlY3RhYmxlVXNlcltdKTogU2VsZWN0YWJsZVVzZXJbXSB7XHJcbiAgICB0aGlzLl9kYXRhLnByZVNlbGVjdGlvbnM/LnRpdGxlc1xyXG4gICAgICA/LmZvckVhY2godGl0bGUgPT5cclxuICAgICAgICB1c2Vyc1xyXG4gICAgICAgICAgLmZpbHRlcih1ID0+IHUudGl0bGU/LnRvTG93ZXJDYXNlKCkgPT09IHRpdGxlLnRvTG93ZXJDYXNlKCkpXHJcbiAgICAgICAgICAuZm9yRWFjaCh1c2VyID0+IHVzZXIuc2VsZWN0ZWQgPSB0cnVlKVxyXG4gICAgICApO1xyXG5cclxuICAgIHJldHVybiB1c2VycztcclxuICB9XHJcblxyXG4gICNwcmVTZWxlY3RVc2Vyc0J5R3JvdXBOYW1lKHVzZXJzOiBTZWxlY3RhYmxlVXNlcltdKTogU2VsZWN0YWJsZVVzZXJbXSB7XHJcbiAgICB0aGlzLl9kYXRhLnByZVNlbGVjdGlvbnM/Lmdyb3Vwc1xyXG4gICAgICA/LmZvckVhY2goZ3JvdXBOYW1lID0+IHtcclxuICAgICAgICBjb25zdCBncm91cCA9IHRoaXMuZ3JvdXBzPy5maW5kKGcgPT4gZy5uYW1lLnRvTG93ZXJDYXNlKCkgPT09IGdyb3VwTmFtZS50b0xvd2VyQ2FzZSgpKTtcclxuICAgICAgICBpZiAoIWdyb3VwKSB7IHJldHVybjsgfVxyXG5cclxuICAgICAgICBncm91cC5tZW1iZXIuZm9yRWFjaChncm91cE1lbWJlckRuID0+IHtcclxuICAgICAgICAgIGNvbnN0IHVzZXIgPSB1c2Vycy5maW5kKHUgPT4gdS5kaXN0aW5ndWlzaGVkTmFtZSA9PT0gZ3JvdXBNZW1iZXJEbik7XHJcbiAgICAgICAgICBpZiAoIXVzZXIpIHsgcmV0dXJuOyB9XHJcblxyXG4gICAgICAgICAgdXNlci5zZWxlY3RlZCA9IHRydWU7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH0pO1xyXG5cclxuICAgIHJldHVybiB1c2VycztcclxuICB9XHJcbiAgLy8jZW5kcmVnaW9uXHJcblxyXG4gICNzZXRGaWx0ZXJQcmVkaWNhdGUoKTogdm9pZCB7XHJcbiAgICBpZiAoIXRoaXMuZGF0YVNvdXJjZSkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5kYXRhU291cmNlLmZpbHRlclByZWRpY2F0ZSA9ICh1c2VyOiAoU2VsZWN0YWJsZVVzZXIgfCBTZWxlY3RhYmxlR3JvdXApLCBmaWx0ZXI6IHN0cmluZykgPT4ge1xyXG4gICAgICBpZiAoZmlsdGVyID09PSAne3NlbGVjdGVkOnRydWV9Jykge1xyXG4gICAgICAgIHJldHVybiB1c2VyLnNlbGVjdGVkO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGNvbnN0IHJlZ2V4ID0gbmV3IFJlZ0V4cChmaWx0ZXIsICdpJyk7IC8vIENhc2UtaW5zZW5zaXRpdmVcclxuICAgICAgICBsZXQgbWF0Y2ggPSBmYWxzZTsgLy8gVGhlIGVuZCByZXN1bHQgLSB3aGV0aGVyIG9yIG5vdCBhIGVtcGxveWVlIG1hdGNoZXMgdGhlIGZpbHRlclxyXG5cclxuICAgICAgICBjb25zdCBmaWx0ZXJQcm9wZXJ0aWVzID0gWyAnZGlzcGxheU5hbWUnIF07XHJcbiAgICAgICAgaWYgKHRoaXMuX2RhdGEuZmlsdGVyT3B0aW9ucz8uYWNjb3VudE5hbWUpIHtcclxuICAgICAgICAgIGZpbHRlclByb3BlcnRpZXMucHVzaCgnc0FNQWNjb3VudE5hbWUnKVxyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGhpcy5fZGF0YS5maWx0ZXJPcHRpb25zPy50aXRsZSkge1xyXG4gICAgICAgICAgZmlsdGVyUHJvcGVydGllcy5wdXNoKCd0aXRsZScpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGhpcy5fZGF0YS5maWx0ZXJPcHRpb25zPy5kZXBhcnRtZW50KSB7XHJcbiAgICAgICAgICBmaWx0ZXJQcm9wZXJ0aWVzLnB1c2goJ2RlcGFydG1lbnQnKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMuX2RhdGEuZmlsdGVyT3B0aW9ucz8ucGhvbmVOdW1iZXIpIHtcclxuICAgICAgICAgIGZpbHRlclByb3BlcnRpZXMucHVzaCgndGVsZXBob25lTnVtYmVyJyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBNYXRjaCBvbiB0aGUgcHJvcGVydGllcyBjb25maWd1cmVkIGFib3ZlXHJcbiAgICAgICAgZmlsdGVyUHJvcGVydGllc1xyXG4gICAgICAgICAgLmZvckVhY2goZmllbGQgPT4ge1xyXG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXHJcbiAgICAgICAgICAgIGlmICh1c2VyW2ZpZWxkXSAmJiB1c2VyW2ZpZWxkXS5tYXRjaChyZWdleCkpIHtcclxuICAgICAgICAgICAgICBtYXRjaCA9IHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAvLyBNYXRjaCBvbiBncm91cCBtZW1iZXJzaGlwIChncm91cCBuYW1lKVxyXG4gICAgICAgIGlmICh0aGlzLl9kYXRhLmZpbHRlck9wdGlvbnM/Lmdyb3VwTWVtYmVyc2hpcCkge1xyXG4gICAgICAgICAgdXNlci5tZW1iZXJPZi5mb3JFYWNoKGdyb3VwRG4gPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBncm91cCA9IHRoaXMuZ3JvdXBzPy5maW5kKGdyb3VwID0+IGdyb3VwLmRpc3Rpbmd1aXNoZWROYW1lID09PSBncm91cERuICYmIGdyb3VwLm5hbWUubWF0Y2gocmVnZXgpKTtcclxuXHJcbiAgICAgICAgICAgIGlmIChncm91cCkge1xyXG4gICAgICAgICAgICAgIG1hdGNoID0gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gbWF0Y2g7XHJcbiAgICAgIH1cclxuICAgIH07XHJcbiAgfVxyXG5cclxuICAjbGlzdGVuRm9yRmlsdGVyQ2hhbmdlcygpOiB2b2lkIHtcclxuICAgIHRoaXMuZmlsdGVyRm9ybS5nZXQoJ2ZpbHRlcicpPy52YWx1ZUNoYW5nZXNcclxuICAgICAgLnBpcGUoXHJcbiAgICAgICAgZGVib3VuY2VUaW1lKDI1MClcclxuICAgICAgKVxyXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHRoaXMuZGF0YVNvdXJjZSEuZmlsdGVyID0gdGhpcy5maWx0ZXJGb3JtLnZhbHVlLmZpbHRlcj8udHJpbSgpLnRvTG93ZXJDYXNlKCkpO1xyXG4gIH1cclxuXHJcbiAgdG9vbHRpcCh1c2VyOiBTZWxlY3RhYmxlVXNlciB8IFNlbGVjdGFibGVHcm91cCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy5fZGF0YS5zaG93R3JvdXBNZW1iZXJzaGlwVG9vbHRpcHMgP1xyXG4gICAgICB1c2VyLm1lbWJlck9mXHJcbiAgICAgICAgLm1hcChncm91cERuID0+XHJcbiAgICAgICAgICB0aGlzLmdyb3Vwc1xyXG4gICAgICAgICAgICA/LmZpbmQoZ3JvdXAgPT5cclxuICAgICAgICAgICAgICBncm91cC5kaXN0aW5ndWlzaGVkTmFtZSA9PT0gZ3JvdXBEblxyXG4gICAgICAgICAgICApPy5uYW1lXHJcbiAgICAgICAgICApXHJcbiAgICAgICAgICAuc29ydCgoYSwgYikgPT4gYSEgPiBiISA/IDEgOiAtMSlcclxuICAgICAgICAgIC5qb2luKCdcXG4nKSA6XHJcbiAgICAgICcnO1xyXG4gIH1cclxuICAvLyNlbmRyZWdpb25cclxufVxyXG4iLCI8ZGl2IGlkPVwiZGlhbG9nLXRpdGxlXCI+XHJcbiAgPGgyIG1hdC1kaWFsb2ctdGl0bGU+e3sgX2RhdGEudGl0bGUgfX08L2gyPlxyXG5cclxuICA8ZGl2IGlkPVwibnVtLXNlbGVjdGVkXCI+XHJcbiAgICB7eyBzZWxlY3RlZE9wdGlvbnMubGVuZ3RoIH19IHNlbGVjdGVkXHJcbiAgPC9kaXY+XHJcbjwvZGl2PlxyXG5cclxuPG1hdC1kaWFsb2ctY29udGVudD5cclxuICBAaWYgKGRhdGFTb3VyY2UgJiYgcGhvdG9zKSB7XHJcbiAgICA8Zm9ybSBbZm9ybUdyb3VwXT1cImZpbHRlckZvcm1cIj5cclxuICAgICAgQGlmIChkYXRhU291cmNlKSB7XHJcbiAgICAgICAgPG1hdC1mb3JtLWZpZWxkPlxyXG4gICAgICAgICAgPGlucHV0IG1hdElucHV0IHBsYWNlaG9sZGVyPVwiU2VhcmNoXCIgZm9ybUNvbnRyb2xOYW1lPVwiZmlsdGVyXCIgI2ZpbHRlcklucHV0PlxyXG4gICAgICAgICAgQGlmIChmaWx0ZXJGb3JtLnZhbHVlLmZpbHRlcikge1xyXG4gICAgICAgICAgICA8YnV0dG9uIG1hdFN1ZmZpeCBtYXQtaWNvbi1idXR0b24gYXJpYS1sYWJlbD1cIkNsZWFyXCIgKGNsaWNrKT1cImZpbHRlckZvcm0uZ2V0KCdmaWx0ZXInKT8uc2V0VmFsdWUoJycpXCI+XHJcbiAgICAgICAgICAgICAgPG1hdC1pY29uIGZvbnRJY29uPVwiY2xvc2VcIi8+XHJcbiAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XHJcbiAgICAgIH1cclxuICAgIDwvZm9ybT5cclxuICAgIDxtYXQtc2VsZWN0aW9uLWxpc3QgW211bHRpcGxlXT1cImlzTXVsdGlNb2RlXCJcclxuICAgICAgKHNlbGVjdGlvbkNoYW5nZSk9XCJsaXN0U2VsZWN0aW9uQ2hhbmdlZCgkZXZlbnQub3B0aW9ucylcIj5cclxuICAgICAgQGZvciAodXNlciBvZiBkYXRhU291cmNlLmZpbHRlcmVkRGF0YTsgdHJhY2sgdXNlcikge1xyXG4gICAgICAgIDxtYXQtbGlzdC1vcHRpb24gW3ZhbHVlXT1cInVzZXJcIiBbc2VsZWN0ZWRdPVwidXNlci5zZWxlY3RlZFwiXHJcbiAgICAgICAgICAoc2VsZWN0ZWRDaGFuZ2UpPVwib3B0aW9uU2VsZWN0aW9uQ2hhbmdlZChvcHRpb24pXCIgI29wdGlvbj5cclxuICAgICAgICAgIEBpZiAoZ2V0UGhvdG8odXNlcikpIHtcclxuICAgICAgICAgICAgPGltZyBtYXRMaXN0SXRlbUF2YXRhciBhbHQ9XCJcIiBbc3JjXT1cImdldFBob3RvKHVzZXIpXCI+XHJcbiAgICAgICAgICB9IEBlbHNlIHtcclxuICAgICAgICAgICAgPG1hdC1pY29uIG1hdExpc3RJdGVtQXZhdGFyIGNsYXNzPVwibm8tcGhvdG9cIlxyXG4gICAgICAgICAgICAgIFtmb250SWNvbl09XCJpc1VzZXIodXNlcikgPyAnYWNjb3VudF9jaXJjbGUnIDogJ2dyb3VwJ1wiLz5cclxuICAgICAgICAgIH1cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJ1c2VyXCI+XHJcbiAgICAgICAgICAgIDxkaXYgW21hdFRvb2x0aXBdPVwidG9vbHRpcCh1c2VyKVwiIGNsYXNzPVwidXNlci1uYW1lXCI+XHJcbiAgICAgICAgICAgICAge3sgdXNlci5kaXNwbGF5TmFtZSA/PyB1c2VyLm5hbWUgfX1cclxuICAgICAgICAgICAgICBAaWYgKGlzVXNlcih1c2VyKSAmJiBfZGF0YS5zaG93UGhvbmUgJiYgY2FzdFVzZXIodXNlcikudGVsZXBob25lTnVtYmVyKSB7XHJcbiAgICAgICAgICAgICAgICA8ZGl2Pnt7IGNhc3RVc2VyKHVzZXIpLnRlbGVwaG9uZU51bWJlciB9fTwvZGl2PlxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIEBpZiAoaXNVc2VyKHVzZXIpKSB7XHJcbiAgICAgICAgICAgICAgPGRpdj57eyBjYXN0VXNlcih1c2VyKS5kZXBhcnRtZW50IH19PC9kaXY+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRpdGxlXCI+e3sgY2FzdFVzZXIodXNlcikudGl0bGUgfX08L2Rpdj5cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9tYXQtbGlzdC1vcHRpb24+XHJcbiAgICAgIH1cclxuICAgIDwvbWF0LXNlbGVjdGlvbi1saXN0PlxyXG4gIH0gQGVsc2Uge1xyXG4gICAgPGRpdj5cclxuICAgICAgPG1hdC1zcGlubmVyIFtkaWFtZXRlcl09XCI1MFwiLz5cclxuICAgICAgPGgyIGlkPVwic3Bpbm5lci1tZXNzYWdlXCI+R2V0dGluZyB1c2VycyBhbmQgcGhvdG9zLi4uPC9oMj5cclxuICAgIDwvZGl2PlxyXG4gIH1cclxuPC9tYXQtZGlhbG9nLWNvbnRlbnQ+XHJcblxyXG48bWF0LWRpYWxvZy1hY3Rpb25zPlxyXG4gIEBpZiAoZGF0YVNvdXJjZSAmJiBwaG90b3MpIHtcclxuICAgIEBpZiAoc2VsZWN0ZWRPcHRpb25zLmxlbmd0aCkge1xyXG4gICAgICA8bWF0LXNsaWRlLXRvZ2dsZSAoY2hhbmdlKT1cImhpZGVVbnNlbGVjdGVkQ2hhbmdlZCgkZXZlbnQuY2hlY2tlZClcIj5cclxuICAgICAgICBIaWRlIFVuc2VsZWN0ZWRcclxuICAgICAgPC9tYXQtc2xpZGUtdG9nZ2xlPlxyXG4gICAgfVxyXG4gICAgQGlmIChpc011bHRpTW9kZSkge1xyXG4gICAgICA8YnV0dG9uIG1hdC1yYWlzZWQtYnV0dG9uIGNvbG9yPVwicHJpbWFyeVwiIChjbGljayk9XCJzZWxlY3RBbGwoKVwiXHJcbiAgICAgICAgPlxyXG4gICAgICAgIDxtYXQtaWNvbiBmb250SWNvbj1cInNlbGVjdF9hbGxcIi8+XHJcbiAgICAgICAgPHNwYW4gY2xhc3M9XCJoaWRlLW1vYmlsZVwiPlNlbGVjdCBBbGw8L3NwYW4+XHJcbiAgICAgIDwvYnV0dG9uPlxyXG4gICAgfVxyXG4gICAgQGlmIChpc011bHRpTW9kZSAmJiBzZWxlY3RlZE9wdGlvbnMubGVuZ3RoKSB7XHJcbiAgICAgIDxidXR0b24gbWF0LXJhaXNlZC1idXR0b24gY29sb3I9XCJwcmltYXJ5XCIgKGNsaWNrKT1cImRlc2VsZWN0QWxsKClcIlxyXG4gICAgICAgID5cclxuICAgICAgICA8bWF0LWljb24gZm9udEljb249XCJjbGVhcl9hbGxcIi8+XHJcbiAgICAgICAgPHNwYW4gY2xhc3M9XCJoaWRlLW1vYmlsZVwiPkNsZWFyIEFsbDwvc3Bhbj5cclxuICAgICAgPC9idXR0b24+XHJcbiAgICB9XHJcbiAgICBAaWYgKGlzTXVsdGlNb2RlIHx8ICFfZGF0YS5jbG9zZVdoZW5TZWxlY3Rpb25NYWRlKSB7XHJcbiAgICAgIDxidXR0b24gbWF0LXJhaXNlZC1idXR0b24gY29sb3I9XCJwcmltYXJ5XCIgKGNsaWNrKT1cImNsb3NlKClcIiBtYXRUb29sdGlwPVwiQWNjZXB0IHlvdXIgc2VsZWN0aW9uXCJcclxuICAgICAgICBbZGlzYWJsZWRdPVwiIV9kYXRhLmFsbG93Q2xvc2VXaXRob3V0U2VsZWN0aW9ucyAmJiAhc2VsZWN0ZWRPcHRpb25zLmxlbmd0aFwiPlxyXG4gICAgICAgIDxtYXQtaWNvbiBmb250SWNvbj1cImNoZWNrXCIvPlxyXG4gICAgICAgIDxzcGFuIGNsYXNzPVwiaGlkZS1tb2JpbGVcIj5Pazwvc3Bhbj5cclxuICAgICAgPC9idXR0b24+XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICA8YnV0dG9uIG1hdC1yYWlzZWQtYnV0dG9uIGNvbG9yPVwid2FyblwiIG1hdC1kaWFsb2ctY2xvc2UgbWF0VG9vbHRpcD1cIkNsb3NlIHRoaXMgd2luZG93XCI+XHJcbiAgICA8bWF0LWljb24gZm9udEljb249XCJjbG9zZVwiLz5cclxuICAgIDxzcGFuIGNsYXNzPVwiaGlkZS1tb2JpbGVcIj5DYW5jZWw8L3NwYW4+XHJcbiAgPC9idXR0b24+XHJcbjwvbWF0LWRpYWxvZy1hY3Rpb25zPiJdfQ==