@tuki-io/tuki-widgets 0.0.43 → 0.0.45

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 (473) hide show
  1. package/README.md +9 -10
  2. package/esm2020/lib/widgets.component.mjs +22 -0
  3. package/esm2020/lib/widgets.module.mjs +21 -0
  4. package/esm2020/lib/widgets.service.mjs +14 -0
  5. package/esm2020/public-api.mjs +7 -0
  6. package/esm2020/tuki-io-tuki-widgets.mjs +5 -0
  7. package/esm2020/user-device-manage/public-api.mjs +9 -0
  8. package/esm2020/user-device-manage/src/app.constants.mjs +95 -0
  9. package/esm2020/user-device-manage/src/classes/device.mjs +85 -0
  10. package/esm2020/user-device-manage/src/classes/line-association-interface.mjs +2 -0
  11. package/esm2020/user-device-manage/src/classes/line-association.mjs +121 -0
  12. package/esm2020/user-device-manage/src/classes/line-call-info-display.mjs +10 -0
  13. package/esm2020/user-device-manage/src/classes/line-directory.mjs +27 -0
  14. package/esm2020/user-device-manage/src/classes/line.mjs +18 -0
  15. package/esm2020/user-device-manage/src/classes/notification.mjs +32 -0
  16. package/esm2020/user-device-manage/src/classes/recording-options.mjs +7 -0
  17. package/esm2020/user-device-manage/src/classes/simplified-user.mjs +111 -0
  18. package/esm2020/user-device-manage/src/classes/site-defaults.mjs +21 -0
  19. package/esm2020/user-device-manage/src/classes/translation-pattern.mjs +32 -0
  20. package/esm2020/user-device-manage/src/classes/types.mjs +24 -0
  21. package/esm2020/user-device-manage/src/common-functions.mjs +19 -0
  22. package/esm2020/user-device-manage/src/confirm-dialog/info-dialog.component.mjs +34 -0
  23. package/esm2020/user-device-manage/src/device-associated-line/associated-line-row/associated-line-row.component.mjs +31 -0
  24. package/esm2020/user-device-manage/src/device-associated-line/device-associated-line-details-box/device-associated-line-details-box.component.mjs +16 -0
  25. package/esm2020/user-device-manage/src/device-associated-line/device-associated-line-extension/device-associated-line-extension.component.mjs +64 -0
  26. package/esm2020/user-device-manage/src/device-associated-line/device-associated-line.component.mjs +179 -0
  27. package/esm2020/user-device-manage/src/device-list/device-list.component.mjs +24 -0
  28. package/esm2020/user-device-manage/src/device-manage-widget.component.mjs +335 -0
  29. package/esm2020/user-device-manage/src/environments/environment.mjs +11 -0
  30. package/esm2020/user-device-manage/src/interseptors/auth.interceptor.mjs +36 -0
  31. package/esm2020/user-device-manage/src/lazy-loading-select/lazy-loading-select.component.mjs +74 -0
  32. package/esm2020/user-device-manage/src/material.module.mjs +192 -0
  33. package/esm2020/user-device-manage/src/notifications/notification.component.mjs +35 -0
  34. package/esm2020/user-device-manage/src/services/api.service.mjs +79 -0
  35. package/esm2020/user-device-manage/src/services/device.service.mjs +83 -0
  36. package/esm2020/user-device-manage/src/services/dns.service.mjs +104 -0
  37. package/esm2020/user-device-manage/src/services/line.service.mjs +76 -0
  38. package/esm2020/user-device-manage/src/services/notification.service.mjs +62 -0
  39. package/esm2020/user-device-manage/src/services/removeKynFromIBM.service.mjs +25 -0
  40. package/esm2020/user-device-manage/src/services/site-settings.service.mjs +70 -0
  41. package/esm2020/user-device-manage/src/services/sorting-utils.service.mjs +197 -0
  42. package/esm2020/user-device-manage/src/services/user.service.mjs +243 -0
  43. package/esm2020/user-device-manage/src/services/utils.service.mjs +87 -0
  44. package/esm2020/user-device-manage/src/services/validation.service.mjs +760 -0
  45. package/esm2020/user-device-manage/src/user-device-manage.module.mjs +107 -0
  46. package/esm2020/user-device-manage/src/utils/app-loader/app-loader.mjs +14 -0
  47. package/esm2020/user-device-manage/tuki-io-tuki-widgets-user-device-manage.mjs +5 -0
  48. package/esm2020/user-manage/public-api.mjs +7 -0
  49. package/esm2020/user-manage/src/app.constants.mjs +50 -0
  50. package/esm2020/user-manage/src/classes/device.mjs +37 -0
  51. package/esm2020/user-manage/src/classes/line-association-interface.mjs +2 -0
  52. package/esm2020/user-manage/src/classes/line-association.mjs +110 -0
  53. package/esm2020/user-manage/src/classes/line-call-info-display.mjs +10 -0
  54. package/esm2020/user-manage/src/classes/line-directory.mjs +27 -0
  55. package/esm2020/user-manage/src/classes/line.mjs +18 -0
  56. package/esm2020/user-manage/src/classes/notification.mjs +32 -0
  57. package/esm2020/user-manage/src/classes/pagination.mjs +8 -0
  58. package/esm2020/user-manage/src/classes/recording-options.mjs +7 -0
  59. package/esm2020/user-manage/src/classes/simplified-user.mjs +109 -0
  60. package/esm2020/user-manage/src/classes/table-data.mjs +2 -0
  61. package/esm2020/user-manage/src/classes/translation-pattern.mjs +32 -0
  62. package/esm2020/user-manage/src/classes/user-list.mjs +10 -0
  63. package/esm2020/user-manage/src/common-functions.mjs +19 -0
  64. package/esm2020/user-manage/src/device-list/device-list.component.mjs +24 -0
  65. package/esm2020/user-manage/src/environments/environment.mjs +11 -0
  66. package/esm2020/user-manage/src/interseptors/auth.interceptor.mjs +36 -0
  67. package/esm2020/user-manage/src/lazy-loading-select/lazy-loading-select.component.mjs +74 -0
  68. package/esm2020/user-manage/src/material.module.mjs +188 -0
  69. package/esm2020/user-manage/src/notifications/notification.component.mjs +35 -0
  70. package/esm2020/user-manage/src/removeKynFromIBM.service.mjs +25 -0
  71. package/esm2020/user-manage/src/services/api.service.mjs +79 -0
  72. package/esm2020/user-manage/src/services/dns.service.mjs +110 -0
  73. package/esm2020/user-manage/src/services/line.service.mjs +34 -0
  74. package/esm2020/user-manage/src/services/notification.service.mjs +62 -0
  75. package/esm2020/user-manage/src/services/removeKynFromIBM.service.mjs +25 -0
  76. package/esm2020/user-manage/src/services/site-settings.service.mjs +36 -0
  77. package/esm2020/user-manage/src/services/sorting-utils.service.mjs +197 -0
  78. package/esm2020/user-manage/src/services/user.service.mjs +207 -0
  79. package/esm2020/user-manage/src/services/users-search.service.mjs +49 -0
  80. package/esm2020/user-manage/src/services/utils.service.mjs +73 -0
  81. package/esm2020/user-manage/src/user-calling/user-calling-extension/user-calling-extension.component.mjs +65 -0
  82. package/esm2020/user-manage/src/user-calling/user-calling.component.mjs +78 -0
  83. package/esm2020/user-manage/src/user-info/user-info.component.mjs +20 -0
  84. package/esm2020/user-manage/src/user-manage-widget.component.mjs +208 -0
  85. package/esm2020/user-manage/src/user-manage.module.mjs +99 -0
  86. package/esm2020/user-manage/src/utils/app-loader/app-loader.mjs +14 -0
  87. package/esm2020/user-manage/src/utils/pagination/pagination.component.mjs +43 -0
  88. package/esm2020/user-manage/tuki-io-tuki-widgets-user-manage.mjs +5 -0
  89. package/esm2020/users-list/public-api.mjs +9 -0
  90. package/esm2020/users-list/src/app.constants.mjs +50 -0
  91. package/esm2020/users-list/src/classes/device.mjs +7 -0
  92. package/esm2020/users-list/src/classes/line.mjs +18 -0
  93. package/esm2020/users-list/src/classes/notification.mjs +31 -0
  94. package/esm2020/users-list/src/classes/pagination.mjs +8 -0
  95. package/esm2020/users-list/src/classes/simlified-user.mjs +50 -0
  96. package/esm2020/users-list/src/classes/table-data.mjs +2 -0
  97. package/esm2020/users-list/src/classes/user-list.mjs +13 -0
  98. package/esm2020/users-list/src/material.module.mjs +209 -0
  99. package/esm2020/users-list/src/move-user-wizard/move-user-stepper/move-user-stepper.component.mjs +111 -0
  100. package/esm2020/users-list/src/move-user-wizard/move-user-wizard.component.mjs +38 -0
  101. package/esm2020/users-list/src/services/api-webex.service.mjs +18 -0
  102. package/esm2020/users-list/src/services/api.service.mjs +78 -0
  103. package/esm2020/users-list/src/services/dns.service.mjs +120 -0
  104. package/esm2020/users-list/src/services/events-communication.service.mjs +14 -0
  105. package/esm2020/users-list/src/services/notification.service.mjs +62 -0
  106. package/esm2020/users-list/src/services/removeKynFromIBM.service.mjs +25 -0
  107. package/esm2020/users-list/src/services/user.service.mjs +142 -0
  108. package/esm2020/users-list/src/services/users-search.service.mjs +120 -0
  109. package/esm2020/users-list/src/user-list-confirm-dialog/user-list-confirm-dialog.component.mjs +34 -0
  110. package/esm2020/users-list/src/users-list.component.mjs +287 -0
  111. package/esm2020/users-list/src/users-list.module.mjs +80 -0
  112. package/esm2020/users-list/src/utils/app-loader/app-loader.mjs +14 -0
  113. package/esm2020/users-list/src/utils/common-functions.mjs +19 -0
  114. package/esm2020/users-list/src/utils/pagination/pagination.component.mjs +43 -0
  115. package/esm2020/users-list/src/utils/utils.service.mjs +73 -0
  116. package/esm2020/users-list/tuki-io-tuki-widgets-users-list.mjs +5 -0
  117. package/fesm2015/tuki-io-tuki-widgets-user-device-manage.mjs +3402 -0
  118. package/fesm2015/tuki-io-tuki-widgets-user-device-manage.mjs.map +1 -0
  119. package/fesm2015/tuki-io-tuki-widgets-user-manage.mjs +2123 -0
  120. package/fesm2015/tuki-io-tuki-widgets-user-manage.mjs.map +1 -0
  121. package/fesm2015/tuki-io-tuki-widgets-users-list.mjs +1563 -0
  122. package/fesm2015/tuki-io-tuki-widgets-users-list.mjs.map +1 -0
  123. package/fesm2015/tuki-io-tuki-widgets.mjs +63 -0
  124. package/fesm2015/tuki-io-tuki-widgets.mjs.map +1 -0
  125. package/fesm2020/tuki-io-tuki-widgets-user-device-manage.mjs +3364 -0
  126. package/fesm2020/tuki-io-tuki-widgets-user-device-manage.mjs.map +1 -0
  127. package/fesm2020/tuki-io-tuki-widgets-user-manage.mjs +2106 -0
  128. package/fesm2020/tuki-io-tuki-widgets-user-manage.mjs.map +1 -0
  129. package/fesm2020/tuki-io-tuki-widgets-users-list.mjs +1550 -0
  130. package/fesm2020/tuki-io-tuki-widgets-users-list.mjs.map +1 -0
  131. package/fesm2020/tuki-io-tuki-widgets.mjs +63 -0
  132. package/fesm2020/tuki-io-tuki-widgets.mjs.map +1 -0
  133. package/index.d.ts +5 -0
  134. package/lib/widgets.component.d.ts +8 -0
  135. package/lib/widgets.module.d.ts +7 -0
  136. package/lib/widgets.service.d.ts +6 -0
  137. package/package.json +57 -46
  138. package/{projects/tuki/widgets/src/public-api.ts → public-api.d.ts} +0 -4
  139. package/user-device-manage/index.d.ts +5 -0
  140. package/user-device-manage/src/app.constants.d.ts +74 -0
  141. package/user-device-manage/src/classes/device.d.ts +233 -0
  142. package/user-device-manage/src/classes/line-association-interface.d.ts +45 -0
  143. package/user-device-manage/src/classes/line-association.d.ts +62 -0
  144. package/user-device-manage/src/classes/line-call-info-display.d.ts +11 -0
  145. package/user-device-manage/src/classes/line-directory.d.ts +15 -0
  146. package/user-device-manage/src/classes/line.d.ts +140 -0
  147. package/user-device-manage/src/classes/notification.d.ts +18 -0
  148. package/user-device-manage/src/classes/recording-options.d.ts +5 -0
  149. package/user-device-manage/src/classes/simplified-user.d.ts +52 -0
  150. package/user-device-manage/src/classes/site-defaults.d.ts +146 -0
  151. package/user-device-manage/src/classes/translation-pattern.d.ts +19 -0
  152. package/user-device-manage/src/classes/types.d.ts +19 -0
  153. package/user-device-manage/src/common-functions.d.ts +1 -0
  154. package/user-device-manage/src/confirm-dialog/info-dialog.component.d.ts +20 -0
  155. package/user-device-manage/src/device-associated-line/associated-line-row/associated-line-row.component.d.ts +15 -0
  156. package/user-device-manage/src/device-associated-line/device-associated-line-details-box/device-associated-line-details-box.component.d.ts +7 -0
  157. package/user-device-manage/src/device-associated-line/device-associated-line-extension/device-associated-line-extension.component.d.ts +24 -0
  158. package/user-device-manage/src/device-associated-line/device-associated-line.component.d.ts +89 -0
  159. package/user-device-manage/src/device-list/device-list.component.d.ts +11 -0
  160. package/user-device-manage/src/device-manage-widget.component.d.ts +71 -0
  161. package/user-device-manage/src/environments/environment.d.ts +9 -0
  162. package/user-device-manage/src/interseptors/auth.interceptor.d.ts +9 -0
  163. package/user-device-manage/src/lazy-loading-select/lazy-loading-select.component.d.ts +35 -0
  164. package/user-device-manage/src/material.module.d.ts +29 -0
  165. package/user-device-manage/src/notifications/notification.component.d.ts +19 -0
  166. package/user-device-manage/src/services/api.service.d.ts +20 -0
  167. package/user-device-manage/src/services/device.service.d.ts +21 -0
  168. package/user-device-manage/src/services/dns.service.d.ts +14 -0
  169. package/user-device-manage/src/services/line.service.d.ts +33 -0
  170. package/user-device-manage/src/services/notification.service.d.ts +18 -0
  171. package/user-device-manage/src/services/removeKynFromIBM.service.d.ts +8 -0
  172. package/user-device-manage/src/services/site-settings.service.d.ts +25 -0
  173. package/user-device-manage/src/services/sorting-utils.service.d.ts +26 -0
  174. package/user-device-manage/src/services/user.service.d.ts +51 -0
  175. package/user-device-manage/src/services/utils.service.d.ts +10 -0
  176. package/user-device-manage/src/services/validation.service.d.ts +165 -0
  177. package/user-device-manage/src/user-device-manage.module.d.ts +22 -0
  178. package/user-device-manage/src/utils/app-loader/app-loader.d.ts +6 -0
  179. package/user-manage/index.d.ts +5 -0
  180. package/user-manage/src/app.constants.d.ts +29 -0
  181. package/user-manage/src/classes/device.d.ts +203 -0
  182. package/user-manage/src/classes/line-association-interface.d.ts +40 -0
  183. package/user-manage/src/classes/line-association.d.ts +55 -0
  184. package/user-manage/src/classes/line-call-info-display.d.ts +11 -0
  185. package/user-manage/src/classes/line-directory.d.ts +16 -0
  186. package/user-manage/src/classes/line.d.ts +140 -0
  187. package/user-manage/src/classes/notification.d.ts +18 -0
  188. package/user-manage/src/classes/pagination.d.ts +13 -0
  189. package/user-manage/src/classes/recording-options.d.ts +5 -0
  190. package/user-manage/src/classes/simplified-user.d.ts +50 -0
  191. package/user-manage/src/classes/table-data.d.ts +5 -0
  192. package/user-manage/src/classes/translation-pattern.d.ts +18 -0
  193. package/user-manage/src/classes/user-list.d.ts +34 -0
  194. package/user-manage/src/common-functions.d.ts +1 -0
  195. package/user-manage/src/device-list/device-list.component.d.ts +11 -0
  196. package/user-manage/src/environments/environment.d.ts +9 -0
  197. package/user-manage/src/interseptors/auth.interceptor.d.ts +9 -0
  198. package/user-manage/src/lazy-loading-select/lazy-loading-select.component.d.ts +35 -0
  199. package/user-manage/src/material.module.d.ts +28 -0
  200. package/user-manage/src/notifications/notification.component.d.ts +19 -0
  201. package/user-manage/src/removeKynFromIBM.service.d.ts +8 -0
  202. package/user-manage/src/services/api.service.d.ts +21 -0
  203. package/user-manage/src/services/dns.service.d.ts +14 -0
  204. package/user-manage/src/services/line.service.d.ts +17 -0
  205. package/user-manage/src/services/notification.service.d.ts +18 -0
  206. package/user-manage/src/services/removeKynFromIBM.service.d.ts +8 -0
  207. package/user-manage/src/services/site-settings.service.d.ts +9 -0
  208. package/user-manage/src/services/sorting-utils.service.d.ts +26 -0
  209. package/user-manage/src/services/user.service.d.ts +43 -0
  210. package/user-manage/src/services/users-search.service.d.ts +25 -0
  211. package/user-manage/src/services/utils.service.d.ts +9 -0
  212. package/user-manage/src/user-calling/user-calling-extension/user-calling-extension.component.d.ts +24 -0
  213. package/user-manage/src/user-calling/user-calling.component.d.ts +30 -0
  214. package/user-manage/src/user-info/user-info.component.d.ts +9 -0
  215. package/user-manage/src/user-manage-widget.component.d.ts +45 -0
  216. package/user-manage/src/user-manage.module.d.ts +21 -0
  217. package/user-manage/src/utils/app-loader/app-loader.d.ts +6 -0
  218. package/user-manage/src/utils/pagination/pagination.component.d.ts +18 -0
  219. package/users-list/index.d.ts +5 -0
  220. package/users-list/src/app.constants.d.ts +32 -0
  221. package/users-list/src/classes/device.d.ts +224 -0
  222. package/users-list/src/classes/line.d.ts +140 -0
  223. package/users-list/src/classes/notification.d.ts +18 -0
  224. package/users-list/src/classes/pagination.d.ts +13 -0
  225. package/users-list/src/classes/simlified-user.d.ts +25 -0
  226. package/users-list/src/classes/table-data.d.ts +5 -0
  227. package/users-list/src/classes/user-list.d.ts +36 -0
  228. package/users-list/src/material.module.d.ts +31 -0
  229. package/users-list/src/move-user-wizard/move-user-stepper/move-user-stepper.component.d.ts +31 -0
  230. package/users-list/src/move-user-wizard/move-user-wizard.component.d.ts +17 -0
  231. package/users-list/src/services/api-webex.service.d.ts +8 -0
  232. package/users-list/src/services/api.service.d.ts +21 -0
  233. package/users-list/src/services/dns.service.d.ts +18 -0
  234. package/users-list/src/services/events-communication.service.d.ts +8 -0
  235. package/users-list/src/services/notification.service.d.ts +18 -0
  236. package/users-list/src/services/removeKynFromIBM.service.d.ts +8 -0
  237. package/users-list/src/services/user.service.d.ts +35 -0
  238. package/users-list/src/services/users-search.service.d.ts +34 -0
  239. package/users-list/src/user-list-confirm-dialog/user-list-confirm-dialog.component.d.ts +20 -0
  240. package/users-list/src/users-list.component.d.ts +60 -0
  241. package/users-list/src/users-list.module.d.ts +16 -0
  242. package/users-list/src/utils/app-loader/app-loader.d.ts +6 -0
  243. package/users-list/src/utils/common-functions.d.ts +1 -0
  244. package/users-list/src/utils/pagination/pagination.component.d.ts +18 -0
  245. package/users-list/src/utils/utils.service.d.ts +9 -0
  246. package/.editorconfig +0 -16
  247. package/.vscode/extensions.json +0 -4
  248. package/.vscode/launch.json +0 -20
  249. package/.vscode/tasks.json +0 -42
  250. package/angular.json +0 -41
  251. package/projects/tuki/widgets/README.md +0 -24
  252. package/projects/tuki/widgets/karma.conf.js +0 -44
  253. package/projects/tuki/widgets/ng-package.json +0 -7
  254. package/projects/tuki/widgets/package.json +0 -13
  255. package/projects/tuki/widgets/src/lib/widgets.component.spec.ts +0 -23
  256. package/projects/tuki/widgets/src/lib/widgets.component.ts +0 -20
  257. package/projects/tuki/widgets/src/lib/widgets.module.ts +0 -16
  258. package/projects/tuki/widgets/src/lib/widgets.service.spec.ts +0 -16
  259. package/projects/tuki/widgets/src/lib/widgets.service.ts +0 -9
  260. package/projects/tuki/widgets/src/test.ts +0 -27
  261. package/projects/tuki/widgets/styles.scss +0 -572
  262. package/projects/tuki/widgets/tsconfig.lib.json +0 -36
  263. package/projects/tuki/widgets/tsconfig.lib.prod.json +0 -10
  264. package/projects/tuki/widgets/tsconfig.spec.json +0 -17
  265. package/projects/tuki/widgets/user-device-manage/ng-package.json +0 -7
  266. package/projects/tuki/widgets/user-device-manage/src/app.constants.ts +0 -96
  267. package/projects/tuki/widgets/user-device-manage/src/assets/icons/arrow-left.svg +0 -5
  268. package/projects/tuki/widgets/user-device-manage/src/assets/icons/arrow-right.svg +0 -5
  269. package/projects/tuki/widgets/user-device-manage/src/assets/icons/close_icon_x.svg +0 -3
  270. package/projects/tuki/widgets/user-device-manage/src/assets/icons/delete_icon.svg +0 -5
  271. package/projects/tuki/widgets/user-device-manage/src/assets/icons/dragger-vertical-icon.svg +0 -3
  272. package/projects/tuki/widgets/user-device-manage/src/assets/icons/icon_user.svg +0 -1
  273. package/projects/tuki/widgets/user-device-manage/src/assets/icons/vartical_divider_icon.svg +0 -3
  274. package/projects/tuki/widgets/user-device-manage/src/classes/device.ts +0 -292
  275. package/projects/tuki/widgets/user-device-manage/src/classes/line-association-interface.ts +0 -50
  276. package/projects/tuki/widgets/user-device-manage/src/classes/line-association.ts +0 -177
  277. package/projects/tuki/widgets/user-device-manage/src/classes/line-call-info-display.ts +0 -21
  278. package/projects/tuki/widgets/user-device-manage/src/classes/line-directory.ts +0 -41
  279. package/projects/tuki/widgets/user-device-manage/src/classes/line.ts +0 -144
  280. package/projects/tuki/widgets/user-device-manage/src/classes/notification.ts +0 -40
  281. package/projects/tuki/widgets/user-device-manage/src/classes/recording-options.ts +0 -6
  282. package/projects/tuki/widgets/user-device-manage/src/classes/simplified-user.ts +0 -169
  283. package/projects/tuki/widgets/user-device-manage/src/classes/site-defaults.ts +0 -167
  284. package/projects/tuki/widgets/user-device-manage/src/classes/translation-pattern.ts +0 -50
  285. package/projects/tuki/widgets/user-device-manage/src/classes/types.ts +0 -19
  286. package/projects/tuki/widgets/user-device-manage/src/classes/user-interface.ts +0 -225
  287. package/projects/tuki/widgets/user-device-manage/src/classes/user.ts +0 -8
  288. package/projects/tuki/widgets/user-device-manage/src/common-functions.ts +0 -16
  289. package/projects/tuki/widgets/user-device-manage/src/confirm-dialog/info-dialog.component.html +0 -14
  290. package/projects/tuki/widgets/user-device-manage/src/confirm-dialog/info-dialog.component.scss +0 -80
  291. package/projects/tuki/widgets/user-device-manage/src/confirm-dialog/info-dialog.component.ts +0 -35
  292. package/projects/tuki/widgets/user-device-manage/src/device-associated-line/associated-line-row/associated-line-row.component.html +0 -21
  293. package/projects/tuki/widgets/user-device-manage/src/device-associated-line/associated-line-row/associated-line-row.component.scss +0 -97
  294. package/projects/tuki/widgets/user-device-manage/src/device-associated-line/associated-line-row/associated-line-row.component.ts +0 -28
  295. package/projects/tuki/widgets/user-device-manage/src/device-associated-line/device-associated-line-details-box/device-associated-line-details-box.component.html +0 -6
  296. package/projects/tuki/widgets/user-device-manage/src/device-associated-line/device-associated-line-details-box/device-associated-line-details-box.component.scss +0 -20
  297. package/projects/tuki/widgets/user-device-manage/src/device-associated-line/device-associated-line-details-box/device-associated-line-details-box.component.ts +0 -13
  298. package/projects/tuki/widgets/user-device-manage/src/device-associated-line/device-associated-line-extension/device-associated-line-extension.component.html +0 -6
  299. package/projects/tuki/widgets/user-device-manage/src/device-associated-line/device-associated-line-extension/device-associated-line-extension.component.scss +0 -4
  300. package/projects/tuki/widgets/user-device-manage/src/device-associated-line/device-associated-line-extension/device-associated-line-extension.component.ts +0 -63
  301. package/projects/tuki/widgets/user-device-manage/src/device-associated-line/device-associated-line.component.html +0 -241
  302. package/projects/tuki/widgets/user-device-manage/src/device-associated-line/device-associated-line.component.scss +0 -500
  303. package/projects/tuki/widgets/user-device-manage/src/device-associated-line/device-associated-line.component.ts +0 -194
  304. package/projects/tuki/widgets/user-device-manage/src/device-list/device-list.component.html +0 -27
  305. package/projects/tuki/widgets/user-device-manage/src/device-list/device-list.component.scss +0 -131
  306. package/projects/tuki/widgets/user-device-manage/src/device-list/device-list.component.ts +0 -25
  307. package/projects/tuki/widgets/user-device-manage/src/device-manage-widget.component.html +0 -209
  308. package/projects/tuki/widgets/user-device-manage/src/device-manage-widget.component.scss +0 -502
  309. package/projects/tuki/widgets/user-device-manage/src/device-manage-widget.component.ts +0 -354
  310. package/projects/tuki/widgets/user-device-manage/src/environments/environment.prod.ts +0 -9
  311. package/projects/tuki/widgets/user-device-manage/src/environments/environment.ts +0 -10
  312. package/projects/tuki/widgets/user-device-manage/src/interseptors/auth.interceptor.ts +0 -35
  313. package/projects/tuki/widgets/user-device-manage/src/lazy-loading-select/lazy-loading-select.component.html +0 -50
  314. package/projects/tuki/widgets/user-device-manage/src/lazy-loading-select/lazy-loading-select.component.scss +0 -8
  315. package/projects/tuki/widgets/user-device-manage/src/lazy-loading-select/lazy-loading-select.component.ts +0 -81
  316. package/projects/tuki/widgets/user-device-manage/src/material.module.ts +0 -87
  317. package/projects/tuki/widgets/user-device-manage/src/notifications/notification.component.html +0 -33
  318. package/projects/tuki/widgets/user-device-manage/src/notifications/notification.component.scss +0 -84
  319. package/projects/tuki/widgets/user-device-manage/src/notifications/notification.component.ts +0 -46
  320. package/projects/tuki/widgets/user-device-manage/src/removeKynFromIBM.service.ts +0 -25
  321. package/projects/tuki/widgets/user-device-manage/src/services/api.service.ts +0 -87
  322. package/projects/tuki/widgets/user-device-manage/src/services/common-functions.ts +0 -17
  323. package/projects/tuki/widgets/user-device-manage/src/services/device.service.ts +0 -95
  324. package/projects/tuki/widgets/user-device-manage/src/services/dns.service.ts +0 -111
  325. package/projects/tuki/widgets/user-device-manage/src/services/line.service.ts +0 -89
  326. package/projects/tuki/widgets/user-device-manage/src/services/notification.service.ts +0 -68
  327. package/projects/tuki/widgets/user-device-manage/src/services/removeKynFromIBM.service.ts +0 -25
  328. package/projects/tuki/widgets/user-device-manage/src/services/site-settings.service.ts +0 -82
  329. package/projects/tuki/widgets/user-device-manage/src/services/sorting-utils.service.ts +0 -203
  330. package/projects/tuki/widgets/user-device-manage/src/services/user.service.ts +0 -283
  331. package/projects/tuki/widgets/user-device-manage/src/services/utils.service.ts +0 -87
  332. package/projects/tuki/widgets/user-device-manage/src/services/validation.service.ts +0 -829
  333. package/projects/tuki/widgets/user-device-manage/src/styles/_variables.scss +0 -90
  334. package/projects/tuki/widgets/user-device-manage/src/styles/form.scss +0 -231
  335. package/projects/tuki/widgets/user-device-manage/src/styles/icons.scss +0 -32
  336. package/projects/tuki/widgets/user-device-manage/src/styles/styles.scss +0 -110
  337. package/projects/tuki/widgets/user-device-manage/src/styles/tables.scss +0 -30
  338. package/projects/tuki/widgets/user-device-manage/src/user-device-manage.module.ts +0 -73
  339. package/projects/tuki/widgets/user-device-manage/src/utils/app-loader/app-loader.component.html +0 -6
  340. package/projects/tuki/widgets/user-device-manage/src/utils/app-loader/app-loader.component.scss +0 -11
  341. package/projects/tuki/widgets/user-device-manage/src/utils/app-loader/app-loader.ts +0 -13
  342. package/projects/tuki/widgets/user-manage/ng-package.json +0 -7
  343. package/projects/tuki/widgets/user-manage/src/app.constants.ts +0 -50
  344. package/projects/tuki/widgets/user-manage/src/assets/icons/arrow-left.svg +0 -5
  345. package/projects/tuki/widgets/user-manage/src/assets/icons/arrow-right.svg +0 -5
  346. package/projects/tuki/widgets/user-manage/src/assets/icons/delete_icon.svg +0 -5
  347. package/projects/tuki/widgets/user-manage/src/assets/icons/dragger-vertical-icon.svg +0 -3
  348. package/projects/tuki/widgets/user-manage/src/assets/icons/icon_user.svg +0 -1
  349. package/projects/tuki/widgets/user-manage/src/assets/icons/vartical_divider_icon.svg +0 -3
  350. package/projects/tuki/widgets/user-manage/src/classes/device.ts +0 -232
  351. package/projects/tuki/widgets/user-manage/src/classes/line-association-interface.ts +0 -43
  352. package/projects/tuki/widgets/user-manage/src/classes/line-association.ts +0 -161
  353. package/projects/tuki/widgets/user-manage/src/classes/line-call-info-display.ts +0 -21
  354. package/projects/tuki/widgets/user-manage/src/classes/line-directory.ts +0 -42
  355. package/projects/tuki/widgets/user-manage/src/classes/line.ts +0 -144
  356. package/projects/tuki/widgets/user-manage/src/classes/notification.ts +0 -39
  357. package/projects/tuki/widgets/user-manage/src/classes/pagination.ts +0 -18
  358. package/projects/tuki/widgets/user-manage/src/classes/recording-options.ts +0 -6
  359. package/projects/tuki/widgets/user-manage/src/classes/simplified-user.ts +0 -165
  360. package/projects/tuki/widgets/user-manage/src/classes/table-data.ts +0 -6
  361. package/projects/tuki/widgets/user-manage/src/classes/translation-pattern.ts +0 -49
  362. package/projects/tuki/widgets/user-manage/src/classes/user-interface.ts +0 -225
  363. package/projects/tuki/widgets/user-manage/src/classes/user-list.ts +0 -42
  364. package/projects/tuki/widgets/user-manage/src/classes/user.ts +0 -8
  365. package/projects/tuki/widgets/user-manage/src/common-functions.ts +0 -16
  366. package/projects/tuki/widgets/user-manage/src/device-list/device-list.component.html +0 -27
  367. package/projects/tuki/widgets/user-manage/src/device-list/device-list.component.scss +0 -131
  368. package/projects/tuki/widgets/user-manage/src/device-list/device-list.component.ts +0 -25
  369. package/projects/tuki/widgets/user-manage/src/environments/environment.prod.ts +0 -9
  370. package/projects/tuki/widgets/user-manage/src/environments/environment.ts +0 -10
  371. package/projects/tuki/widgets/user-manage/src/interseptors/auth.interceptor.ts +0 -35
  372. package/projects/tuki/widgets/user-manage/src/lazy-loading-select/lazy-loading-select.component.html +0 -50
  373. package/projects/tuki/widgets/user-manage/src/lazy-loading-select/lazy-loading-select.component.scss +0 -8
  374. package/projects/tuki/widgets/user-manage/src/lazy-loading-select/lazy-loading-select.component.ts +0 -81
  375. package/projects/tuki/widgets/user-manage/src/material.module.ts +0 -85
  376. package/projects/tuki/widgets/user-manage/src/notifications/notification.component.html +0 -33
  377. package/projects/tuki/widgets/user-manage/src/notifications/notification.component.scss +0 -84
  378. package/projects/tuki/widgets/user-manage/src/notifications/notification.component.ts +0 -46
  379. package/projects/tuki/widgets/user-manage/src/removeKynFromIBM.service.ts +0 -25
  380. package/projects/tuki/widgets/user-manage/src/services/api.service.ts +0 -90
  381. package/projects/tuki/widgets/user-manage/src/services/dns.service.ts +0 -116
  382. package/projects/tuki/widgets/user-manage/src/services/line.service.ts +0 -31
  383. package/projects/tuki/widgets/user-manage/src/services/notification.service.ts +0 -68
  384. package/projects/tuki/widgets/user-manage/src/services/removeKynFromIBM.service.ts +0 -25
  385. package/projects/tuki/widgets/user-manage/src/services/site-settings.service.ts +0 -35
  386. package/projects/tuki/widgets/user-manage/src/services/sorting-utils.service.ts +0 -203
  387. package/projects/tuki/widgets/user-manage/src/services/user.service.ts +0 -242
  388. package/projects/tuki/widgets/user-manage/src/services/users-search.service.ts +0 -58
  389. package/projects/tuki/widgets/user-manage/src/services/utils.service.ts +0 -71
  390. package/projects/tuki/widgets/user-manage/src/styles/_variables.scss +0 -90
  391. package/projects/tuki/widgets/user-manage/src/styles/form.scss +0 -231
  392. package/projects/tuki/widgets/user-manage/src/styles/icons.scss +0 -32
  393. package/projects/tuki/widgets/user-manage/src/styles/styles.scss +0 -110
  394. package/projects/tuki/widgets/user-manage/src/styles/tables.scss +0 -30
  395. package/projects/tuki/widgets/user-manage/src/user-calling/user-calling-extension/user-calling-extension.component.html +0 -10
  396. package/projects/tuki/widgets/user-manage/src/user-calling/user-calling-extension/user-calling-extension.component.scss +0 -429
  397. package/projects/tuki/widgets/user-manage/src/user-calling/user-calling-extension/user-calling-extension.component.ts +0 -63
  398. package/projects/tuki/widgets/user-manage/src/user-calling/user-calling.component.html +0 -32
  399. package/projects/tuki/widgets/user-manage/src/user-calling/user-calling.component.scss +0 -444
  400. package/projects/tuki/widgets/user-manage/src/user-calling/user-calling.component.ts +0 -89
  401. package/projects/tuki/widgets/user-manage/src/user-details/notification.service.ts +0 -68
  402. package/projects/tuki/widgets/user-manage/src/user-info/user-info.component.html +0 -29
  403. package/projects/tuki/widgets/user-manage/src/user-info/user-info.component.scss +0 -64
  404. package/projects/tuki/widgets/user-manage/src/user-info/user-info.component.ts +0 -19
  405. package/projects/tuki/widgets/user-manage/src/user-manage-widget.component.html +0 -290
  406. package/projects/tuki/widgets/user-manage/src/user-manage-widget.component.scss +0 -463
  407. package/projects/tuki/widgets/user-manage/src/user-manage-widget.component.ts +0 -212
  408. package/projects/tuki/widgets/user-manage/src/user-manage.module.ts +0 -63
  409. package/projects/tuki/widgets/user-manage/src/utils/app-loader/app-loader.component.html +0 -6
  410. package/projects/tuki/widgets/user-manage/src/utils/app-loader/app-loader.component.scss +0 -11
  411. package/projects/tuki/widgets/user-manage/src/utils/app-loader/app-loader.ts +0 -13
  412. package/projects/tuki/widgets/user-manage/src/utils/pagination/pagination.component.html +0 -26
  413. package/projects/tuki/widgets/user-manage/src/utils/pagination/pagination.component.scss +0 -41
  414. package/projects/tuki/widgets/user-manage/src/utils/pagination/pagination.component.ts +0 -41
  415. package/projects/tuki/widgets/users-list/ng-package.json +0 -6
  416. package/projects/tuki/widgets/users-list/src/app.constants.ts +0 -50
  417. package/projects/tuki/widgets/users-list/src/assets/icons/close_icon_modal.svg +0 -3
  418. package/projects/tuki/widgets/users-list/src/assets/icons/icon_user.svg +0 -1
  419. package/projects/tuki/widgets/users-list/src/assets/icons/move_user_to_another_location.svg +0 -14
  420. package/projects/tuki/widgets/users-list/src/assets/icons/white-close-icon.svg +0 -3
  421. package/projects/tuki/widgets/users-list/src/classes/device.ts +0 -225
  422. package/projects/tuki/widgets/users-list/src/classes/line.ts +0 -144
  423. package/projects/tuki/widgets/users-list/src/classes/notification.ts +0 -38
  424. package/projects/tuki/widgets/users-list/src/classes/pagination.ts +0 -18
  425. package/projects/tuki/widgets/users-list/src/classes/simlified-user.ts +0 -74
  426. package/projects/tuki/widgets/users-list/src/classes/table-data.ts +0 -6
  427. package/projects/tuki/widgets/users-list/src/classes/user-interface.ts +0 -225
  428. package/projects/tuki/widgets/users-list/src/classes/user-list.ts +0 -47
  429. package/projects/tuki/widgets/users-list/src/classes/user.ts +0 -8
  430. package/projects/tuki/widgets/users-list/src/material.module.ts +0 -94
  431. package/projects/tuki/widgets/users-list/src/move-user-wizard/move-user-stepper/move-user-stepper.component.html +0 -95
  432. package/projects/tuki/widgets/users-list/src/move-user-wizard/move-user-stepper/move-user-stepper.component.scss +0 -182
  433. package/projects/tuki/widgets/users-list/src/move-user-wizard/move-user-stepper/move-user-stepper.component.ts +0 -110
  434. package/projects/tuki/widgets/users-list/src/move-user-wizard/move-user-wizard.component.html +0 -12
  435. package/projects/tuki/widgets/users-list/src/move-user-wizard/move-user-wizard.component.scss +0 -41
  436. package/projects/tuki/widgets/users-list/src/move-user-wizard/move-user-wizard.component.ts +0 -36
  437. package/projects/tuki/widgets/users-list/src/services/api-webex.service.ts +0 -14
  438. package/projects/tuki/widgets/users-list/src/services/api.service.ts +0 -90
  439. package/projects/tuki/widgets/users-list/src/services/dns.service.ts +0 -128
  440. package/projects/tuki/widgets/users-list/src/services/events-communication.service.ts +0 -11
  441. package/projects/tuki/widgets/users-list/src/services/notification.service.ts +0 -68
  442. package/projects/tuki/widgets/users-list/src/services/removeKynFromIBM.service.ts +0 -25
  443. package/projects/tuki/widgets/users-list/src/services/user.service.ts +0 -159
  444. package/projects/tuki/widgets/users-list/src/services/users-search.service.ts +0 -135
  445. package/projects/tuki/widgets/users-list/src/styles/styles.scss +0 -572
  446. package/projects/tuki/widgets/users-list/src/user-list-confirm-dialog/user-list-confirm-dialog.component.html +0 -15
  447. package/projects/tuki/widgets/users-list/src/user-list-confirm-dialog/user-list-confirm-dialog.component.scss +0 -103
  448. package/projects/tuki/widgets/users-list/src/user-list-confirm-dialog/user-list-confirm-dialog.component.ts +0 -35
  449. package/projects/tuki/widgets/users-list/src/users-list.component.css +0 -4
  450. package/projects/tuki/widgets/users-list/src/users-list.component.css.map +0 -1
  451. package/projects/tuki/widgets/users-list/src/users-list.component.html +0 -85
  452. package/projects/tuki/widgets/users-list/src/users-list.component.scss +0 -572
  453. package/projects/tuki/widgets/users-list/src/users-list.component.ts +0 -312
  454. package/projects/tuki/widgets/users-list/src/users-list.module.ts +0 -51
  455. package/projects/tuki/widgets/users-list/src/utils/app-loader/app-loader.component.css +0 -11
  456. package/projects/tuki/widgets/users-list/src/utils/app-loader/app-loader.component.css.map +0 -1
  457. package/projects/tuki/widgets/users-list/src/utils/app-loader/app-loader.component.html +0 -6
  458. package/projects/tuki/widgets/users-list/src/utils/app-loader/app-loader.component.scss +0 -11
  459. package/projects/tuki/widgets/users-list/src/utils/app-loader/app-loader.ts +0 -13
  460. package/projects/tuki/widgets/users-list/src/utils/common-functions.ts +0 -16
  461. package/projects/tuki/widgets/users-list/src/utils/notifications/notification.component.html +0 -33
  462. package/projects/tuki/widgets/users-list/src/utils/notifications/notification.component.scss +0 -84
  463. package/projects/tuki/widgets/users-list/src/utils/notifications/notification.component.ts +0 -46
  464. package/projects/tuki/widgets/users-list/src/utils/pagination/pagination.component.css +0 -45
  465. package/projects/tuki/widgets/users-list/src/utils/pagination/pagination.component.css.map +0 -1
  466. package/projects/tuki/widgets/users-list/src/utils/pagination/pagination.component.html +0 -26
  467. package/projects/tuki/widgets/users-list/src/utils/pagination/pagination.component.scss +0 -41
  468. package/projects/tuki/widgets/users-list/src/utils/pagination/pagination.component.ts +0 -41
  469. package/projects/tuki/widgets/users-list/src/utils/utils.service.ts +0 -71
  470. package/tsconfig.json +0 -46
  471. /package/{projects/tuki/widgets/user-device-manage/public-api.ts → user-device-manage/public-api.d.ts} +0 -0
  472. /package/{projects/tuki/widgets/user-manage/public-api.ts → user-manage/public-api.d.ts} +0 -0
  473. /package/{projects/tuki/widgets/users-list/public-api.ts → users-list/public-api.d.ts} +0 -0
@@ -0,0 +1,760 @@
1
+ import { Injectable } from '@angular/core';
2
+ import { DeviceTypes, MailboxQuotasType, SpeedDialType, VMNotificationsTypes } from './../classes/types';
3
+ import { DeviceKind } from './../classes/device';
4
+ import * as i0 from "@angular/core";
5
+ import * as i1 from "./site-settings.service";
6
+ const speedDialRegex = new RegExp('^[^"]*$');
7
+ const BLFRegex = new RegExp('^[^"><&%]*$');
8
+ const timeRegex = new RegExp('^([0-1][0-9]|[2][0-3]):([0-5][0-9])$');
9
+ export class ValidationService {
10
+ constructor(siteSettingsService) {
11
+ this.siteSettingsService = siteSettingsService;
12
+ this.matchControl = (fieldName) => {
13
+ return (control) => {
14
+ if (!control?.parent) {
15
+ return null;
16
+ }
17
+ const matchingControl = control.parent.get(fieldName);
18
+ if (matchingControl.value && matchingControl.value !== control.value) {
19
+ return {
20
+ matchControl: true
21
+ };
22
+ }
23
+ return null;
24
+ };
25
+ };
26
+ this.matchLength = (fieldName) => {
27
+ return (control) => {
28
+ if (!control.parent || !control.value) {
29
+ return null;
30
+ }
31
+ const matchingControl = control.parent.get(fieldName);
32
+ if (((!control.value.startsWith('+') && !matchingControl.value.startsWith('+')) ||
33
+ (control.value.startsWith('+') && matchingControl.value.startsWith('+'))) &&
34
+ ((!control.value.startsWith('\\+') && !matchingControl.value.startsWith('\\+')) ||
35
+ (control.value.startsWith('\\+') && matchingControl.value.startsWith('\\+'))) &&
36
+ matchingControl.value.length !== control.value.length) {
37
+ return {
38
+ matchLength: true
39
+ };
40
+ }
41
+ return null;
42
+ };
43
+ };
44
+ this.dynamicMaxLength = (length1, length2) => {
45
+ return (control) => {
46
+ if (!control.parent || !control.value) {
47
+ return null;
48
+ }
49
+ const maxLength = String(control.value).includes('[') ? length1 : length2;
50
+ if (control.value.length > maxLength) {
51
+ return {
52
+ maxLength: true
53
+ };
54
+ }
55
+ return null;
56
+ };
57
+ };
58
+ this.biggerThan = (fieldName) => {
59
+ return (control) => {
60
+ if (!control.parent || !control.value) {
61
+ return null;
62
+ }
63
+ const matchingControl = control.parent.get(fieldName);
64
+ if (matchingControl.value.length === control.value.length && matchingControl.value && matchingControl.value > control.value) {
65
+ return {
66
+ biggerThan: true
67
+ };
68
+ }
69
+ return null;
70
+ };
71
+ };
72
+ this.requiredByType = (fieldName, type) => {
73
+ return (control) => {
74
+ if (fieldName === 'phoneSystem' && (type === VMNotificationsTypes['Phone Device'] || type === VMNotificationsTypes['Pager Device']) ||
75
+ fieldName === 'htmlTemplate' && type === VMNotificationsTypes['HTML Device']) {
76
+ return {
77
+ required: true
78
+ };
79
+ }
80
+ return null;
81
+ };
82
+ };
83
+ this.smallerThanQuota = (fieldName, quotaType, secondQuotaType) => {
84
+ return (control) => {
85
+ if (!control.parent) {
86
+ return null;
87
+ }
88
+ const matchingControl = control.parent.get(fieldName);
89
+ const quotaTypeControl = control.parent.get(quotaType);
90
+ const secondQuotaTypeControl = control.parent.get(secondQuotaType);
91
+ if (quotaTypeControl && secondQuotaTypeControl && secondQuotaTypeControl.value === MailboxQuotasType.system) {
92
+ return null;
93
+ }
94
+ if (quotaTypeControl && quotaTypeControl.value === MailboxQuotasType.system || matchingControl && matchingControl.value && parseInt(matchingControl.value) < parseInt(control.value)) {
95
+ return {
96
+ smallerThan: true
97
+ };
98
+ }
99
+ return null;
100
+ };
101
+ };
102
+ this.biggerThanQuota = (fieldName, quotaType) => {
103
+ return (control) => {
104
+ if (!control?.parent) {
105
+ return null;
106
+ }
107
+ const matchingControl = control.parent.get(fieldName);
108
+ const quotaTypeControl = control.parent.get(quotaType);
109
+ if (quotaTypeControl && quotaTypeControl.value === MailboxQuotasType.custom && matchingControl.value && parseInt(matchingControl.value) > parseInt(control.value)) {
110
+ return {
111
+ biggerThan: true
112
+ };
113
+ }
114
+ return null;
115
+ };
116
+ };
117
+ this.rangeLimit = (fieldName) => {
118
+ return (control) => {
119
+ if (!control?.parent || !control.value) {
120
+ return null;
121
+ }
122
+ const matchingControl = control.parent.get(fieldName);
123
+ if ((control.value - matchingControl.value) > 50000) {
124
+ return {
125
+ rangeLimit: true
126
+ };
127
+ }
128
+ return null;
129
+ };
130
+ };
131
+ this.comparepatternParts = (fieldName) => {
132
+ return (control) => {
133
+ if (!control?.value) {
134
+ return null;
135
+ }
136
+ const matches = control.value.match(/\[(.*?)\]/);
137
+ if (matches) {
138
+ const submatch = matches[1];
139
+ const submatchsplit = submatch.split('-');
140
+ for (let i = 0; i < submatchsplit.length; i++) {
141
+ if (submatchsplit[i] >= submatchsplit[i + 1]) {
142
+ return {
143
+ comparepatternParts: true
144
+ };
145
+ }
146
+ }
147
+ }
148
+ return null;
149
+ };
150
+ };
151
+ this.matchPrefix = (fieldName) => {
152
+ return (control) => {
153
+ if (!control?.parent || !control.value) {
154
+ return null;
155
+ }
156
+ const matchingControl = control.parent.get(fieldName);
157
+ if ((matchingControl.value.startsWith('+') || control.value.startsWith('+') || matchingControl.value.startsWith('\\+') || control.value.startsWith('\\+')) && (control.value.charAt(0) !== matchingControl.value.charAt(0))) {
158
+ return {
159
+ matchPrefix: true
160
+ };
161
+ }
162
+ return null;
163
+ };
164
+ };
165
+ this.deviceNameValidator = (device) => {
166
+ return (control) => {
167
+ if (!control.value || device.deviceKind === DeviceKind.deviceProfile) {
168
+ return;
169
+ }
170
+ if (device.isCtiRoutePoint) {
171
+ let err = '';
172
+ if (!control.value.match(/^[a-zA-Z0-9-_.]+$/)) {
173
+ err = 'pattern';
174
+ }
175
+ if (control.value.trim().length > 15) {
176
+ err = 'maxLength';
177
+ }
178
+ return err ? { nameRule: err } : null;
179
+ }
180
+ if (device.deviceDefaults && !device.isCtiRoutePoint) {
181
+ const ruleText = device.deviceDefaults.deviceNameRegex;
182
+ const rule = new RegExp(ruleText, 'g');
183
+ const caption = device.deviceDefaults?.deviceNameExplained;
184
+ const match = (control.value || '').match(rule) || [];
185
+ const exactMatch = match && control.value === match[0];
186
+ if (rule && !exactMatch) {
187
+ return { nameRule: { caption } };
188
+ }
189
+ }
190
+ return null;
191
+ };
192
+ };
193
+ this.deviceNameValueValidator = (device, deviceName) => {
194
+ return (control) => {
195
+ if (!control.value || device.deviceKind === DeviceKind.deviceProfile) {
196
+ return;
197
+ }
198
+ if (device.name && device.alreadyUsedName && device.name === device.alreadyUsedName) {
199
+ return { nameRule: 'alreadyUsedName' };
200
+ }
201
+ if (device.isCtiRoutePoint) {
202
+ let err = '';
203
+ if (!deviceName.match(/^[a-zA-Z0-9-_.]+$/)) {
204
+ err = 'pattern';
205
+ }
206
+ if (deviceName.trim().length > 15) {
207
+ err = 'maxLength';
208
+ }
209
+ return err ? { nameRule: err } : null;
210
+ }
211
+ if (device.deviceDefaults && !device.isCtiRoutePoint) {
212
+ const ruleText = device.deviceDefaults.deviceNameRegex;
213
+ // console.log('Dev name rule - ', ruleText);
214
+ const rule = new RegExp(ruleText, 'g');
215
+ let caption = device.deviceDefaults.deviceNameExplained;
216
+ if (!caption) {
217
+ caption = ruleText;
218
+ }
219
+ const match = (deviceName || '').match(rule) || [];
220
+ const exactMatch = match && deviceName === match[0];
221
+ if (rule && !exactMatch) {
222
+ return { nameRule: { caption } };
223
+ }
224
+ }
225
+ return null;
226
+ };
227
+ };
228
+ this.deviceDuplicatingNameValidator = (user, pkid, prefix) => {
229
+ return (control) => {
230
+ if (!control.value || !user || !user.devices || user.devices.length === 0) {
231
+ return;
232
+ }
233
+ const deviceName = prefix ? `${prefix}${control.value}` : control.value;
234
+ const devicesWithTheSameName = user.devices.filter((device) => device.name === deviceName);
235
+ if (devicesWithTheSameName.length > 0) {
236
+ if (!pkid) { // For new device
237
+ return { duplicateNameRule: true };
238
+ }
239
+ else if (pkid !== devicesWithTheSameName[0].pkid) { // For updating device, avoid validating with itself
240
+ return { duplicateNameRule: true };
241
+ }
242
+ }
243
+ return null;
244
+ };
245
+ };
246
+ this.conditionalRequired = (fieldName, requiredConditionValues) => {
247
+ return (control) => {
248
+ const parent1 = control.parent;
249
+ if (!parent1 || !parent1.get(fieldName) || !parent1.get(fieldName).value) {
250
+ return;
251
+ }
252
+ if (requiredConditionValues.includes(parent1.get(fieldName).value) && !control.value) {
253
+ return {
254
+ required: true
255
+ };
256
+ }
257
+ return null;
258
+ };
259
+ };
260
+ this.conditionalRequiredForGroupAdmin = (fieldName, requiredConditionValues) => {
261
+ return (control) => {
262
+ const parent1 = control.parent;
263
+ if (!parent1 || !parent1.get(fieldName) || !parent1.get(fieldName).value || !parent1.get(fieldName).value.type) {
264
+ return;
265
+ }
266
+ if (requiredConditionValues.includes(parent1.get(fieldName).value.type) && !control.value) {
267
+ return {
268
+ required: true
269
+ };
270
+ }
271
+ return null;
272
+ };
273
+ };
274
+ this.conditionalSiteGroupCheckForGroupAdmin = (fieldName, requiredConditionValues) => {
275
+ return (control) => {
276
+ const parent1 = control.parent;
277
+ if (!parent1 || !parent1.get(fieldName) || !parent1.get(fieldName).value || !parent1.get(fieldName).value.type) {
278
+ return;
279
+ }
280
+ if (parent1.get(fieldName).value && requiredConditionValues.includes(parent1.get(fieldName).value.type) &&
281
+ parent1.get('siteGroup') && parent1.get('siteGroup').value &&
282
+ parent1.get('siteGroup').value.siteGroupMembers && parent1.get('siteGroup').value.siteGroupMembers.length < 1) {
283
+ return {
284
+ hasSiteGroupError: true
285
+ };
286
+ }
287
+ return null;
288
+ };
289
+ };
290
+ this.requiredIfFieldIsEmptyForBLF = (fieldName) => {
291
+ const DATE_PATTERN = '^(0[1-9]|1[012])[- \/.](0[1-9]|[12][0-9]|3[01])[- \/.](19|20)\d\d$';
292
+ return (control) => {
293
+ const parent = control.parent;
294
+ if (!parent || !parent.get(fieldName)) {
295
+ return null;
296
+ }
297
+ if (!parent.get(fieldName).value && !control.value) {
298
+ return {
299
+ requiredEither: true,
300
+ requiredBLFDN: true
301
+ };
302
+ }
303
+ return null;
304
+ };
305
+ };
306
+ this.validDate = (fieldName) => {
307
+ return (control) => {
308
+ const parent = control.parent;
309
+ const ruleText = '^(0[1-9]|1[012])[- \/.](0[1-9]|[12][0-9]|3[01])[- \/.](19|20)\d\d$';
310
+ const rule = new RegExp(ruleText, 'g');
311
+ const val = control.value && control.value.getDate();
312
+ if (rule && !rule.test(val)) {
313
+ return { pattern: true };
314
+ }
315
+ return null;
316
+ };
317
+ };
318
+ this.matchOption = (optionType, list, isFullList) => {
319
+ return (control) => {
320
+ if (!control.value || control.value === DeviceTypes.CTI_ROUTE_POINT) {
321
+ return null;
322
+ }
323
+ let optionList = list || this.getOptionsList(optionType);
324
+ if (optionList && optionList.length) {
325
+ if (!isFullList && optionType === 'directoryNumbers') {
326
+ optionList = optionList.map((str) => str.indexOf(' ') > -1 ? str.substring(0, str.indexOf(' ')) : str);
327
+ }
328
+ if (!optionList.includes(control.value)) {
329
+ return {
330
+ matchOptions: true
331
+ };
332
+ }
333
+ }
334
+ return null;
335
+ };
336
+ };
337
+ this.confidentialAccessLevel = (confidentialAccessMode) => {
338
+ return (control) => {
339
+ if (!control.value && !confidentialAccessMode) {
340
+ return null;
341
+ }
342
+ if (!control.value) {
343
+ return {
344
+ required: true
345
+ };
346
+ }
347
+ return null;
348
+ };
349
+ };
350
+ this.noResultDN = (optionType, list) => {
351
+ return (control) => {
352
+ if (!control.value || list === null) {
353
+ return null;
354
+ }
355
+ if (list && list.length === 0) {
356
+ return {
357
+ noResultDNs: true
358
+ };
359
+ }
360
+ return null;
361
+ };
362
+ };
363
+ this.matchExtensionOption = (optionType, optionList) => {
364
+ return (control) => {
365
+ if (!control.value) {
366
+ return control.value;
367
+ }
368
+ // @ts-ignore
369
+ const newList = [];
370
+ if (optionList && optionList.length) {
371
+ optionList.forEach((list) => {
372
+ const newOptionList = this.getMatchExistingVmLineValue(list);
373
+ newList.push(newOptionList);
374
+ });
375
+ // @ts-ignore
376
+ if (newList && !newList.includes(control.value)) {
377
+ return {
378
+ matchOptions: true
379
+ };
380
+ }
381
+ }
382
+ else if (!optionList || !optionList.length) {
383
+ return {
384
+ matchOptions: true
385
+ };
386
+ }
387
+ return null;
388
+ };
389
+ };
390
+ this.requiredEitherForVmExtension = (fieldName1, fieldName2) => {
391
+ return (control) => {
392
+ if (!control.parent) {
393
+ return null;
394
+ }
395
+ const matchControl1 = control.parent.get(fieldName1).value;
396
+ const matchControl2 = control.parent.get(fieldName2).value;
397
+ if (!matchControl1 && !matchControl2) {
398
+ return {
399
+ requiredEitherForVmExtension: true
400
+ };
401
+ }
402
+ return null;
403
+ };
404
+ };
405
+ this.requiredEitherOne = (fieldName1, fieldName2) => {
406
+ return (control) => {
407
+ if (!control.parent) {
408
+ return null;
409
+ }
410
+ const matchControl1 = control.parent.get(fieldName1) && control.parent.get(fieldName1).value;
411
+ const matchControl2 = control.parent.get(fieldName2) && control.parent.get(fieldName2).value;
412
+ if (!matchControl1 && !matchControl2) {
413
+ return {
414
+ requiredEitherOne: true
415
+ };
416
+ }
417
+ return null;
418
+ };
419
+ };
420
+ this.requiredByValue = (fieldName, requestedFieldVal) => {
421
+ return (control) => {
422
+ if (!control || !control.parent) {
423
+ return null;
424
+ }
425
+ const fieldVal = control.parent.get(fieldName) && control.parent.get(fieldName).value;
426
+ if (fieldVal && fieldVal === requestedFieldVal && !control.value) {
427
+ return {
428
+ required: true
429
+ };
430
+ }
431
+ return null;
432
+ };
433
+ };
434
+ this.OneExtensionEmpty = (fieldName1, fieldName2) => {
435
+ return (control) => {
436
+ if (!control.parent) {
437
+ return null;
438
+ }
439
+ const matchControl1 = control.parent.get(fieldName1).value;
440
+ const matchControl2 = control.parent.get(fieldName2).value;
441
+ if (matchControl1 && matchControl2) {
442
+ return {
443
+ OneExtensionIsEmpty: true
444
+ };
445
+ }
446
+ return null;
447
+ };
448
+ };
449
+ this.requiredByCondition = (requiredBy, fieldName) => {
450
+ return (control) => {
451
+ if (!control.parent) {
452
+ return null;
453
+ }
454
+ const requiredByControl = control.parent.get(requiredBy).value;
455
+ const requiredControl = control.parent.get(fieldName).value;
456
+ if (requiredByControl && !requiredControl) {
457
+ return {
458
+ required: true
459
+ };
460
+ }
461
+ return null;
462
+ };
463
+ };
464
+ this.pinMultiCharacterCheck = (fieldName) => {
465
+ // @ts-ignore
466
+ return (control) => {
467
+ if (!control.parent) {
468
+ return null;
469
+ }
470
+ const matchingControl = control.parent.get(fieldName);
471
+ const ruleMultiCharacter = new RegExp('([0-9])\\1{2}');
472
+ if (matchingControl.value) {
473
+ const hasMultiCharacter = ruleMultiCharacter.test(matchingControl.value);
474
+ if (hasMultiCharacter) {
475
+ return {
476
+ multiCharacter: true
477
+ };
478
+ }
479
+ }
480
+ };
481
+ };
482
+ this.pinConsecutiveNumberCheck = (fieldName) => {
483
+ // @ts-ignore
484
+ return (control) => {
485
+ if (!control.parent) {
486
+ return null;
487
+ }
488
+ const matchingControl = control.parent.get(fieldName);
489
+ const strToCheck = matchingControl.value;
490
+ if (strToCheck && strToCheck.length > 1) {
491
+ const resAsc = this.pinOrderCheck(strToCheck);
492
+ if (resAsc === true) {
493
+ return {
494
+ consecutiveNumbers: true
495
+ };
496
+ }
497
+ }
498
+ };
499
+ };
500
+ this.pinMailboxExtensionCheck = (fieldName, extension) => {
501
+ return (control) => {
502
+ if (!control.parent) {
503
+ return null;
504
+ }
505
+ const matchingControl = control.parent.get(fieldName);
506
+ const strToCheck = matchingControl.value;
507
+ if (strToCheck === extension || strToCheck.includes(extension)) {
508
+ return {
509
+ mailboxExtension: true
510
+ };
511
+ }
512
+ return null;
513
+ };
514
+ };
515
+ }
516
+ e164MaskLabel(control) {
517
+ const ruleText = `^[0-9*#+X]{0,24}$`;
518
+ const rule = new RegExp(ruleText, 'g');
519
+ if (control.value && rule && !rule.test(control.value)) {
520
+ return { e164MaskRule: { rule: ruleText } };
521
+ }
522
+ return null;
523
+ }
524
+ index(control) {
525
+ const value = parseInt(control.value);
526
+ if (!value) {
527
+ return null;
528
+ }
529
+ const pattern = '^[+0-9]*$';
530
+ if (value && !Number.isInteger(value) || value < 1 || value > 199) {
531
+ return { indexRule: true };
532
+ }
533
+ return null;
534
+ }
535
+ displayLabel(control) {
536
+ const ruleText = `^[^""""%&<>]{0,30}$`;
537
+ const rule = new RegExp(ruleText, 'g');
538
+ if (rule && !rule.test(control.value)) {
539
+ return { labelRule: { rule: ruleText, count: 30 } };
540
+ }
541
+ return null;
542
+ }
543
+ displayLabelAscii(control) {
544
+ const ruleText = '^[a-zA-Z0-9 !#$\'()*+,./:;=?@\\^_`}~-]{0,30}$';
545
+ const rule = new RegExp(ruleText, 'g');
546
+ if (rule && !rule.test(control.value)) {
547
+ return { labelRule: { rule: ruleText, count: 30 } };
548
+ }
549
+ return null;
550
+ }
551
+ requiredForSpeedDialPosition(type) {
552
+ return (control) => {
553
+ const parent = control.parent;
554
+ if (type === SpeedDialType.slotBasic || !parent) {
555
+ return null;
556
+ }
557
+ if (!control.value) {
558
+ return { required: true };
559
+ }
560
+ return null;
561
+ };
562
+ }
563
+ speedDialDestination() {
564
+ return (control) => {
565
+ if (!control || !control.value) {
566
+ return null;
567
+ }
568
+ const numberOrHostNameIP = '' +
569
+ '^([0-9\\*#+PpCcFf,]+)$' +
570
+ '|' +
571
+ '^(' +
572
+ '([a-zA-Z0-9]){1,47}@' +
573
+ '(' +
574
+ '((?:[0-9]{1,3}\\.){3}[0-9]{1,3})' +
575
+ '|' +
576
+ '([a-zA-Z0-9][a-zA-Z0-9\\-]{1,61}[a-zA-Z0-9]\\.[a-zA-Z]{2,})' +
577
+ ')' +
578
+ ')$';
579
+ const rule = new RegExp(numberOrHostNameIP, 'g');
580
+ if (rule && !rule.test(control.value)) {
581
+ return { pattern: true };
582
+ }
583
+ return null;
584
+ };
585
+ }
586
+ requiredForSpeedDialDestination(type) {
587
+ return (control) => {
588
+ const parent = control.parent;
589
+ if ((!parent || !parent.get('label')) || (type === SpeedDialType.slotBasic && !control.value && !parent.get('label').value)) {
590
+ return null;
591
+ }
592
+ return null;
593
+ };
594
+ }
595
+ labelPatternDependingOnType(control) {
596
+ const parent = control?.parent;
597
+ if (!parent || !parent.get('type') || !control.value) {
598
+ return null;
599
+ }
600
+ const type = parent.get('type').value;
601
+ if (!type && !speedDialRegex.test(control.value)) {
602
+ return { labelRule: { wrong: '"' } };
603
+ }
604
+ if (type && !BLFRegex.test(control.value)) {
605
+ return { labelRule: { wrong: '"><&%' } };
606
+ }
607
+ return null;
608
+ }
609
+ labelPatternBLF(control) {
610
+ if (control.value && !BLFRegex.test(control.value)) {
611
+ return { labelRule: { wrong: '"><&%' } };
612
+ }
613
+ return null;
614
+ }
615
+ labelPatternSpeedDial(control) {
616
+ if (control?.value && !speedDialRegex.test(control.value)) {
617
+ return { labelRule: { wrong: '"' } };
618
+ }
619
+ return null;
620
+ }
621
+ getMatchExistingVmLineValue(dnWithType) {
622
+ const ind = dnWithType.indexOf('Type:');
623
+ let dn = dnWithType;
624
+ if (ind > -1) {
625
+ dn = dnWithType.slice(0, ind);
626
+ dn = dn.trim();
627
+ }
628
+ return dn;
629
+ }
630
+ getOptionsList(token) {
631
+ switch (token) {
632
+ case 'css':
633
+ case 'rerouteCss':
634
+ case 'callingSearchSpace':
635
+ return this.siteSettingsService.callingSearchSpaceTypes;
636
+ case 'reroutingCss':
637
+ return this.siteSettingsService.siteDefaults && this.siteSettingsService.siteDefaults.cssFilter;
638
+ case 'deviceType':
639
+ return this.siteSettingsService.deviceTypes;
640
+ case 'routePartition':
641
+ return this.siteSettingsService.routePartitionNames;
642
+ case 'routePartitionFiltered':
643
+ return this.siteSettingsService.filteredRoutePartitionNames;
644
+ case 'devicePools':
645
+ return this.siteSettingsService.devicePools;
646
+ case 'allRoutePartitions':
647
+ return this.siteSettingsService.allRoutePartitionNames;
648
+ case 'directoryNumbers':
649
+ return this.siteSettingsService.directoryNumbers;
650
+ default:
651
+ return [];
652
+ }
653
+ }
654
+ autocompleteType(control) {
655
+ if (!control.value) {
656
+ return null;
657
+ }
658
+ if (typeof control.value !== 'object' && control.value !== '') {
659
+ return {
660
+ stringEntered: true
661
+ };
662
+ }
663
+ return null;
664
+ }
665
+ password(control) {
666
+ const ruleNumeric = new RegExp(/\d+/, 'g');
667
+ const ruleCapitals = new RegExp(/[A-Z]+/, 'g');
668
+ const ruleSmall = new RegExp(/[a-z]+/, 'g');
669
+ const ruleSpecial = new RegExp(/[!@#$%&\/=\?_\.,:;\-\\+]+/, 'g');
670
+ const hasNumeric = +ruleNumeric.test(control.value);
671
+ const hasCapitals = +ruleCapitals.test(control.value);
672
+ const hasSmall = +ruleSmall.test(control.value);
673
+ const hasSpecial = +ruleSpecial.test(control.value);
674
+ if (hasNumeric + hasCapitals + hasSmall + hasSpecial < 3) {
675
+ return {
676
+ weakPassword: true
677
+ };
678
+ }
679
+ return null;
680
+ }
681
+ verifyAutoAnswer(control) {
682
+ if (!control?.value || control.value.length === 0) {
683
+ return null;
684
+ }
685
+ let autoAnswerErrorLine = null;
686
+ if (control.parent && control.parent.parent && control.parent.parent.parent && control.parent.parent.parent.parent) {
687
+ const controlSNR = control.parent;
688
+ const controlUser = control.parent.parent.parent.parent;
689
+ const lineAssociations = controlSNR.get('lineAssociations');
690
+ const lines = controlUser.get('lines');
691
+ if (lines) {
692
+ lineAssociations.value.forEach((lineAssociation) => {
693
+ const autoAnswerLine = lines.controls.find((line) => line.get('directoryNumber').value.directoryNumber === lineAssociation.directoryNumber && line.get('directoryNumber').value.routePartitionName === lineAssociation.routePartitionName
694
+ && line.get('autoAnswer').value !== 'Auto Answer Off');
695
+ if (autoAnswerLine) {
696
+ autoAnswerErrorLine = {
697
+ autoAnswerErrorLine: lineAssociation.directoryNumber
698
+ };
699
+ }
700
+ });
701
+ }
702
+ }
703
+ return autoAnswerErrorLine;
704
+ }
705
+ verifyBeginEndTime(control) {
706
+ const parent = control.parent;
707
+ if (!parent || !parent.get('isActive') || !parent.get('allDay') || !parent.get('from') || !parent.get('to')) {
708
+ return null;
709
+ }
710
+ if (parent.get('isActive').value) {
711
+ if (!parent.get('allDay').value) {
712
+ if (!parent.get('from').value || parent.get('from').value === 'No Office Hours'
713
+ || !parent.get('to').value || parent.get('to').value === 'No Office Hours'
714
+ || parent.get('from').value > parent.get('to').value) {
715
+ return {
716
+ fromGreaterThanTo: true
717
+ };
718
+ }
719
+ }
720
+ }
721
+ return null;
722
+ }
723
+ time(control) {
724
+ if (control.value && !timeRegex.test(control.value)) {
725
+ return { timeFormat: true };
726
+ }
727
+ return null;
728
+ }
729
+ pinOrderCheck(str) {
730
+ if (str) {
731
+ const arr_num = ('' + str).split('');
732
+ for (let i = 0; i < arr_num.length - 2; i++) {
733
+ const num1 = parseInt(arr_num[i]);
734
+ const num2 = parseInt(arr_num[i + 1]);
735
+ const num3 = parseInt(arr_num[i + 2]);
736
+ if ((num2 - num1) === 1 && (num3 - num2 === num2 - num1)) {
737
+ return true;
738
+ }
739
+ }
740
+ return false;
741
+ }
742
+ }
743
+ isItemAlreadyInList(item, list) {
744
+ if (!item || !list || !list.length) {
745
+ return false;
746
+ }
747
+ for (const listItem of list) {
748
+ if (item.equals(listItem)) {
749
+ return true;
750
+ }
751
+ }
752
+ return false;
753
+ }
754
+ }
755
+ ValidationService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: ValidationService, deps: [{ token: i1.SiteSettingsService }], target: i0.ɵɵFactoryTarget.Injectable });
756
+ ValidationService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: ValidationService });
757
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: ValidationService, decorators: [{
758
+ type: Injectable
759
+ }], ctorParameters: function () { return [{ type: i1.SiteSettingsService }]; } });
760
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFsaWRhdGlvbi5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdHVraS93aWRnZXRzL3VzZXItZGV2aWNlLW1hbmFnZS9zcmMvc2VydmljZXMvdmFsaWRhdGlvbi5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFM0MsT0FBTyxFQUFFLFdBQVcsRUFBRSxpQkFBaUIsRUFBRSxhQUFhLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUN6RyxPQUFPLEVBQVUsVUFBVSxFQUFFLE1BQU0scUJBQXFCLENBQUM7OztBQUV6RCxNQUFNLGNBQWMsR0FBRyxJQUFJLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQztBQUM3QyxNQUFNLFFBQVEsR0FBRyxJQUFJLE1BQU0sQ0FBQyxhQUFhLENBQUMsQ0FBQztBQUMzQyxNQUFNLFNBQVMsR0FBRyxJQUFJLE1BQU0sQ0FBQyxzQ0FBc0MsQ0FBQyxDQUFDO0FBR3JFLE1BQU0sT0FBTyxpQkFBaUI7SUFFNUIsWUFDVSxtQkFBd0M7UUFBeEMsd0JBQW1CLEdBQW5CLG1CQUFtQixDQUFxQjtRQTZIbEQsaUJBQVksR0FBRyxDQUFDLFNBQWlCLEVBQUUsRUFBRTtZQUNuQyxPQUFPLENBQUMsT0FBWSxFQUFFLEVBQUU7Z0JBQ3RCLElBQUksQ0FBQyxPQUFPLEVBQUUsTUFBTSxFQUFFO29CQUNwQixPQUFPLElBQUksQ0FBQztpQkFDYjtnQkFDRCxNQUFNLGVBQWUsR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQztnQkFDdEQsSUFBSSxlQUFlLENBQUMsS0FBSyxJQUFJLGVBQWUsQ0FBQyxLQUFLLEtBQUssT0FBTyxDQUFDLEtBQUssRUFBRTtvQkFDcEUsT0FBTzt3QkFDTCxZQUFZLEVBQUUsSUFBSTtxQkFDbkIsQ0FB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SSxDQUFDLElBQUksR0FBRyxJQUFJLEtBQUssSUFBSSxHQUFHLElBQUksQ0FBQyxFQUFFO29CQUN4RCxPQUFPLElBQUksQ0FBQztpQkFDYjthQUNGO1lBQ0QsT0FBTyxLQUFLLENBQUM7U0FDZDtJQUNILENBQUM7SUFtQkQsbUJBQW1CLENBQUMsSUFBUyxFQUFFLElBQVM7UUFDdEMsSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUU7WUFDbEMsT0FBTyxLQUFLLENBQUM7U0FDZDtRQUNELEtBQUssTUFBTSxRQUFRLElBQUksSUFBSSxFQUFFO1lBQzNCLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsRUFBRTtnQkFDekIsT0FBTyxJQUFJLENBQUM7YUFDYjtTQUNGO1FBQ0QsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDOzsrR0FqekJVLGlCQUFpQjttSEFBakIsaUJBQWlCOzRGQUFqQixpQkFBaUI7a0JBRDdCLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IFNpdGVTZXR0aW5nc1NlcnZpY2UgfSBmcm9tICcuL3NpdGUtc2V0dGluZ3Muc2VydmljZSc7XHJcbmltcG9ydCB7IERldmljZVR5cGVzLCBNYWlsYm94UXVvdGFzVHlwZSwgU3BlZWREaWFsVHlwZSwgVk1Ob3RpZmljYXRpb25zVHlwZXMgfSBmcm9tICcuLy4uL2NsYXNzZXMvdHlwZXMnO1xyXG5pbXBvcnQgeyBEZXZpY2UsIERldmljZUtpbmQgfSBmcm9tICcuLy4uL2NsYXNzZXMvZGV2aWNlJztcclxuXHJcbmNvbnN0IHNwZWVkRGlhbFJlZ2V4ID0gbmV3IFJlZ0V4cCgnXlteXCJdKiQnKTtcclxuY29uc3QgQkxGUmVnZXggPSBuZXcgUmVnRXhwKCdeW15cIj48JiVdKiQnKTtcclxuY29uc3QgdGltZVJlZ2V4ID0gbmV3IFJlZ0V4cCgnXihbMC0xXVswLTldfFsyXVswLTNdKTooWzAtNV1bMC05XSkkJyk7XHJcblxyXG5ASW5qZWN0YWJsZSgpXHJcbmV4cG9ydCBjbGFzcyBWYWxpZGF0aW9uU2VydmljZSB7XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJpdmF0ZSBzaXRlU2V0dGluZ3NTZXJ2aWNlOiBTaXRlU2V0dGluZ3NTZXJ2aWNlLFxyXG4gICkge1xyXG4gIH1cclxuXHJcbiAgZTE2NE1hc2tMYWJlbChjb250cm9sOiBhbnkpIHtcclxuICAgIGNvbnN0IHJ1bGVUZXh0ID0gYF5bMC05KiMrWF17MCwyNH0kYDtcclxuICAgIGNvbnN0IHJ1bGUgPSBuZXcgUmVnRXhwKHJ1bGVUZXh0LCAnZycpO1xyXG4gICAgaWYgKGNvbnRyb2wudmFsdWUgJiYgcnVsZSAmJiAhcnVsZS50ZXN0KGNvbnRyb2wudmFsdWUpKSB7XHJcbiAgICAgIHJldHVybiB7ZTE2NE1hc2tSdWxlOiB7cnVsZTogcnVsZVRleHR9fTtcclxuICAgIH1cclxuICAgIHJldHVybiBudWxsO1xyXG4gIH1cclxuXHJcbiAgaW5kZXgoY29udHJvbDogYW55KSB7XHJcbiAgICBjb25zdCB2YWx1ZSA9IHBhcnNlSW50KGNvbnRyb2wudmFsdWUpO1xyXG4gICAgaWYgKCF2YWx1ZSkge1xyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuICAgIGNvbnN0IHBhdHRlcm4gPSAnXlsrMC05XSokJztcclxuICAgIGlmICh2YWx1ZSAmJiAhTnVtYmVyLmlzSW50ZWdlcih2YWx1ZSkgfHwgdmFsdWUgPCAxIHx8IHZhbHVlID4gMTk5KSB7XHJcbiAgICAgIHJldHVybiB7aW5kZXhSdWxlOiB0cnVlfTtcclxuICAgIH1cclxuICAgIHJldHVybiBudWxsO1xyXG4gIH1cclxuXHJcbiAgZGlzcGxheUxhYmVsKGNvbnRyb2w6IGFueSkge1xyXG4gICAgY29uc3QgcnVsZVRleHQgPSBgXlteXCJcIlwiXCIlJjw+XXswLDMwfSRgO1xyXG4gICAgY29uc3QgcnVsZSA9IG5ldyBSZWdFeHAocnVsZVRleHQsICdnJyk7XHJcbiAgICBpZiAocnVsZSAmJiAhcnVsZS50ZXN0KGNvbnRyb2wudmFsdWUpKSB7XHJcbiAgICAgIHJldHVybiB7bGFiZWxSdWxlOiB7cnVsZTogcnVsZVRleHQsIGNvdW50OiAzMH19O1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIG51bGw7XHJcbiAgfVxyXG5cclxuXHJcblxyXG4gIGRpc3BsYXlMYWJlbEFzY2lpKGNvbnRyb2w6IGFueSkge1xyXG4gICAgY29uc3QgcnVsZVRleHQgPSAnXlthLXpBLVowLTkgISMkXFwnKCkqKywuLzo7PT9AXFxcXF5fYH1+LV17MCwzMH0kJztcclxuICAgIGNvbnN0IHJ1bGUgPSBuZXcgUmVnRXhwKHJ1bGVUZXh0LCAnZycpO1xyXG4gICAgaWYgKHJ1bGUgJiYgIXJ1bGUudGVzdChjb250cm9sLnZhbHVlKSkge1xyXG4gICAgICByZXR1cm4ge2xhYmVsUnVsZToge3J1bGU6IHJ1bGVUZXh0LCBjb3VudDogMzB9fTtcclxuICAgIH1cclxuICAgIHJldHVybiBudWxsO1xyXG4gIH1cclxuXHJcbiAgcmVxdWlyZWRGb3JTcGVlZERpYWxQb3NpdGlvbih0eXBlOiBzdHJpbmcpIHtcclxuXHJcbiAgICByZXR1cm4gKGNvbnRyb2w6IGFueSkgPT4ge1xyXG4gICAgICBjb25zdCBwYXJlbnQgPSBjb250cm9sLnBhcmVudDtcclxuICAgICAgaWYgKHR5cGUgPT09IFNwZWVkRGlhbFR5cGUuc2xvdEJhc2ljIHx8ICFwYXJlbnQpIHtcclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgfVxyXG4gICAgICBpZiAoIWNvbnRyb2wudmFsdWUpIHtcclxuICAgICAgICByZXR1cm4ge3JlcXVpcmVkOiB0cnVlfTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICBzcGVlZERpYWxEZXN0aW5hdGlvbigpIHtcclxuICAgIHJldHVybiAoY29udHJvbDogYW55KSA9PiB7XHJcbiAgICAgIGlmICghY29udHJvbCB8fCAhY29udHJvbC52YWx1ZSkge1xyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICB9XHJcbiAgICAgIGNvbnN0IG51bWJlck9ySG9zdE5hbWVJUCA9ICcnICtcclxuICAgICAgICAnXihbMC05XFxcXCojK1BwQ2NGZixdKykkJyArXHJcbiAgICAgICAgJ3wnICtcclxuICAgICAgICAnXignICtcclxuICAgICAgICAnKFthLXpBLVowLTldKXsxLDQ3fUAnICtcclxuICAgICAgICAnKCcgK1xyXG4gICAgICAgICcoKD86WzAtOV17MSwzfVxcXFwuKXszfVswLTldezEsM30pJyArXHJcbiAgICAgICAgJ3wnICtcclxuICAgICAgICAnKFthLXpBLVowLTldW2EtekEtWjAtOVxcXFwtXXsxLDYxfVthLXpBLVowLTldXFxcXC5bYS16QS1aXXsyLH0pJyArXHJcbiAgICAgICAgJyknICtcclxuICAgICAgICAnKSQnO1xyXG4gICAgICBjb25zdCBydWxlID0gbmV3IFJlZ0V4cChudW1iZXJPckhvc3ROYW1lSVAsICdnJyk7XHJcbiAgICAgIGlmIChydWxlICYmICFydWxlLnRlc3QoY29udHJvbC52YWx1ZSkpIHtcclxuICAgICAgICByZXR1cm4ge3BhdHRlcm46IHRydWV9O1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfTtcclxuXHJcbiAgfVxyXG5cclxuICByZXF1aXJlZEZvclNwZWVkRGlhbERlc3RpbmF0aW9uKHR5cGU6IHN0cmluZykge1xyXG5cclxuICAgIHJldHVybiAoY29udHJvbDogYW55KSA9PiB7XHJcbiAgICAgIGNvbnN0IHBhcmVudCA9IGNvbnRyb2wucGFyZW50O1xyXG4gICAgICBpZiAoKCFwYXJlbnQgfHwgIXBhcmVudC5nZXQoJ2xhYmVsJykpIHx8ICh0eXBlID09PSBTcGVlZERpYWxUeXBlLnNsb3RCYXNpYyAmJiAhY29udHJvbC52YWx1ZSAmJiAhcGFyZW50LmdldCgnbGFiZWwnKS52YWx1ZSkpIHtcclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIH07XHJcbiAgfVxyXG5cclxuXHJcbiAgbGFiZWxQYXR0ZXJuRGVwZW5kaW5nT25UeXBlKGNvbnRyb2w6IGFueSkge1xyXG4gICAgY29uc3QgcGFyZW50ID0gY29udHJvbD8ucGFyZW50O1xyXG4gICAgaWYgKCFwYXJlbnQgfHwgIXBhcmVudC5nZXQoJ3R5cGUnKSB8fCAhY29udHJvbC52YWx1ZSkge1xyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuICAgIGNvbnN0IHR5cGUgPSBwYXJlbnQuZ2V0KCd0eXBlJykudmFsdWU7XHJcbiAgICBpZiAoIXR5cGUgJiYgIXNwZWVkRGlhbFJlZ2V4LnRlc3QoY29udHJvbC52YWx1ZSkpIHtcclxuICAgICAgcmV0dXJuIHtsYWJlbFJ1bGU6IHt3cm9uZzogJ1wiJ319O1xyXG4gICAgfVxyXG4gICAgaWYgKHR5cGUgJiYgIUJMRlJlZ2V4LnRlc3QoY29udHJvbC52YWx1ZSkpIHtcclxuICAgICAgcmV0dXJuIHtsYWJlbFJ1bGU6IHt3cm9uZzogJ1wiPjwmJSd9fTtcclxuICAgIH1cclxuICAgIHJldHVybiBudWxsO1xyXG4gIH1cclxuXHJcbiAgbGFiZWxQYXR0ZXJuQkxGKGNvbnRyb2w6IGFueSkge1xyXG4gICAgaWYgKGNvbnRyb2wudmFsdWUgJiYgIUJMRlJlZ2V4LnRlc3QoY29udHJvbC52YWx1ZSkpIHtcclxuICAgICAgcmV0dXJuIHtsYWJlbFJ1bGU6IHt3cm9uZzogJ1wiPjwmJSd9fTtcclxuICAgIH1cclxuICAgIHJldHVybiBudWxsO1xyXG4gIH1cclxuXHJcbiAgbGFiZWxQYXR0ZXJuU3BlZWREaWFsKGNvbnRyb2w6IGFueSkge1xyXG4gICAgaWYgKGNvbnRyb2w/LnZhbHVlICYmICFzcGVlZERpYWxSZWdleC50ZXN0KGNvbnRyb2wudmFsdWUpKSB7XHJcbiAgICAgIHJldHVybiB7bGFiZWxSdWxlOiB7d3Jvbmc6ICdcIid9fTtcclxuICAgIH1cclxuICAgIHJldHVybiBudWxsO1xyXG4gIH1cclxuXHJcbiAgbWF0Y2hDb250cm9sID0gKGZpZWxkTmFtZTogc3RyaW5nKSA9PiB7XHJcbiAgICByZXR1cm4gKGNvbnRyb2w6IGFueSkgPT4ge1xyXG4gICAgICBpZiAoIWNvbnRyb2w/LnBhcmVudCkge1xyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICB9XHJcbiAgICAgIGNvbnN0IG1hdGNoaW5nQ29udHJvbCA9IGNvbnRyb2wucGFyZW50LmdldChmaWVsZE5hbWUpO1xyXG4gICAgICBpZiAobWF0Y2hpbmdDb250cm9sLnZhbHVlICYmIG1hdGNoaW5nQ29udHJvbC52YWx1ZSAhPT0gY29udHJvbC52YWx1ZSkge1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICBtYXRjaENvbnRyb2w6IHRydWVcclxuICAgICAgICB9O1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfTtcclxuICB9O1xyXG5cclxuICBtYXRjaExlbmd0aCA9IChmaWVsZE5hbWU6IHN0cmluZykgPT4ge1xyXG4gICAgcmV0dXJuIChjb250cm9sOiBhbnkpID0+IHtcclxuICAgICAgaWYgKCFjb250cm9sLnBhcmVudCB8fCAhY29udHJvbC52YWx1ZSkge1xyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICB9XHJcbiAgICAgIGNvbnN0IG1hdGNoaW5nQ29udHJvbCA9IGNvbnRyb2wucGFyZW50LmdldChmaWVsZE5hbWUpO1xyXG4gICAgICBpZiAoKCghY29udHJvbC52YWx1ZS5zdGFydHNXaXRoKCcrJykgJiYgIW1hdGNoaW5nQ29udHJvbC52YWx1ZS5zdGFydHNXaXRoKCcrJykpIHx8XHJcbiAgICAgICAgKGNvbnRyb2wudmFsdWUuc3RhcnRzV2l0aCgnKycpICYmIG1hdGNoaW5nQ29udHJvbC52YWx1ZS5zdGFydHNXaXRoKCcrJykpKSAmJlxyXG4gICAgICAgICgoIWNvbnRyb2wudmFsdWUuc3RhcnRzV2l0aCgnXFxcXCsnKSAmJiAhbWF0Y2hpbmdDb250cm9sLnZhbHVlLnN0YXJ0c1dpdGgoJ1xcXFwrJykpIHx8XHJcbiAgICAgICAgICAoY29udHJvbC52YWx1ZS5zdGFydHNXaXRoKCdcXFxcKycpICYmIG1hdGNoaW5nQ29udHJvbC52YWx1ZS5zdGFydHNXaXRoKCdcXFxcKycpKSkgJiZcclxuICAgICAgICBtYXRjaGluZ0NvbnRyb2wudmFsdWUubGVuZ3RoICE9PSBjb250cm9sLnZhbHVlLmxlbmd0aCkge1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICBtYXRjaExlbmd0aDogdHJ1ZVxyXG4gICAgICAgIH07XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9O1xyXG4gIH07XHJcblxyXG4gIGR5bmFtaWNNYXhMZW5ndGggPSAobGVuZ3RoMTogbnVtYmVyLCBsZW5ndGgyOiBudW1iZXIpID0+IHtcclxuICAgIHJldHVybiAoY29udHJvbDogYW55KSA9PiB7XHJcbiAgICAgIGlmICghY29udHJvbC5wYXJlbnQgfHwgIWNvbnRyb2wudmFsdWUpIHtcclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgfVxyXG4gICAgICBjb25zdCBtYXhMZW5ndGggPSBTdHJpbmcoY29udHJvbC52YWx1ZSkuaW5jbHVkZXMoJ1snKSA/IGxlbmd0aDEgOiBsZW5ndGgyO1xyXG4gICAgICBpZiAoY29udHJvbC52YWx1ZS5sZW5ndGggPiBtYXhMZW5ndGgpIHtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgbWF4TGVuZ3RoOiB0cnVlXHJcbiAgICAgICAgfTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIH07XHJcbiAgfTtcclxuXHJcbiAgYmlnZ2VyVGhhbiA9IChmaWVsZE5hbWU6IHN0cmluZykgPT4ge1xyXG4gICAgcmV0dXJuIChjb250cm9sOiBhbnkpID0+IHtcclxuICAgICAgaWYgKCFjb250cm9sLnBhcmVudCB8fCAhY29udHJvbC52YWx1ZSkge1xyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICB9XHJcbiAgICAgIGNvbnN0IG1hdGNoaW5nQ29udHJvbCA9IGNvbnRyb2wucGFyZW50LmdldChmaWVsZE5hbWUpO1xyXG4gICAgICBpZiAobWF0Y2hpbmdDb250cm9sLnZhbHVlLmxlbmd0aCA9PT0gY29udHJvbC52YWx1ZS5sZW5ndGggJiYgbWF0Y2hpbmdDb250cm9sLnZhbHVlICYmIG1hdGNoaW5nQ29udHJvbC52YWx1ZSA+IGNvbnRyb2wudmFsdWUpIHtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgYmlnZ2VyVGhhbjogdHJ1ZVxyXG4gICAgICAgIH07XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9O1xyXG4gIH07XHJcblxyXG4gIHJlcXVpcmVkQnlUeXBlID0gKGZpZWxkTmFtZTogc3RyaW5nLCB0eXBlOiBzdHJpbmcpID0+IHtcclxuICAgIHJldHVybiAoY29udHJvbDogYW55KSA9PiB7XHJcbiAgICAgIGlmIChcclxuICAgICAgICBmaWVsZE5hbWUgPT09ICdwaG9uZVN5c3RlbScgJiYgKHR5cGUgPT09IFZNTm90aWZpY2F0aW9uc1R5cGVzWydQaG9uZSBEZXZpY2UnXSB8fCB0eXBlID09PSBWTU5vdGlmaWNhdGlvbnNUeXBlc1snUGFnZXIgRGV2aWNlJ10pIHx8XHJcbiAgICAgICAgZmllbGROYW1lID09PSAnaHRtbFRlbXBsYXRlJyAmJiB0eXBlID09PSBWTU5vdGlmaWNhdGlvbnNUeXBlc1snSFRNTCBEZXZpY2UnXVxyXG4gICAgICApIHtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgcmVxdWlyZWQ6IHRydWVcclxuICAgICAgICB9O1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfTtcclxuICB9O1xyXG5cclxuICBzbWFsbGVyVGhhblF1b3RhID0gKGZpZWxkTmFtZTogc3RyaW5nLCBxdW90YVR5cGU6IHN0cmluZywgc2Vjb25kUXVvdGFUeXBlOiBzdHJpbmcpID0+IHtcclxuICAgIHJldHVybiAoY29udHJvbDogYW55KSA9PiB7XHJcbiAgICAgIGlmICghY29udHJvbC5wYXJlbnQpIHtcclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgfVxyXG4gICAgICBjb25zdCBtYXRjaGluZ0NvbnRyb2wgPSBjb250cm9sLnBhcmVudC5nZXQoZmllbGROYW1lKTtcclxuICAgICAgY29uc3QgcXVvdGFUeXBlQ29udHJvbCA9IGNvbnRyb2wucGFyZW50LmdldChxdW90YVR5cGUpO1xyXG4gICAgICBjb25zdCBzZWNvbmRRdW90YVR5cGVDb250cm9sID0gY29udHJvbC5wYXJlbnQuZ2V0KHNlY29uZFF1b3RhVHlwZSk7XHJcblxyXG4gICAgICBpZiAocXVvdGFUeXBlQ29udHJvbCAmJiBzZWNvbmRRdW90YVR5cGVDb250cm9sICYmIHNlY29uZFF1b3RhVHlwZUNvbnRyb2wudmFsdWUgPT09IE1haWxib3hRdW90YXNUeXBlLnN5c3RlbSkge1xyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAocXVvdGFUeXBlQ29udHJvbCAmJiBxdW90YVR5cGVDb250cm9sLnZhbHVlID09PSBNYWlsYm94UXVvdGFzVHlwZS5zeXN0ZW0gfHwgbWF0Y2hpbmdDb250cm9sICYmIG1hdGNoaW5nQ29udHJvbC52YWx1ZSAmJiBwYXJzZUludChtYXRjaGluZ0NvbnRyb2wudmFsdWUpIDwgcGFyc2VJbnQoY29udHJvbC52YWx1ZSkpIHtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgc21hbGxlclRoYW46IHRydWVcclxuICAgICAgICB9O1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfTtcclxuICB9O1xyXG5cclxuICBiaWdnZXJUaGFuUXVvdGEgPSAoZmllbGROYW1lOiBzdHJpbmcsIHF1b3RhVHlwZTogc3RyaW5nKSA9PiB7XHJcbiAgICByZXR1cm4gKGNvbnRyb2w6IGFueSkgPT4ge1xyXG4gICAgICBpZiAoIWNvbnRyb2w/LnBhcmVudCkge1xyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICB9XHJcbiAgICAgIGNvbnN0IG1hdGNoaW5nQ29udHJvbCA9IGNvbnRyb2wucGFyZW50LmdldChmaWVsZE5hbWUpO1xyXG4gICAgICBjb25zdCBxdW90YVR5cGVDb250cm9sID0gY29udHJvbC5wYXJlbnQuZ2V0KHF1b3RhVHlwZSk7XHJcblxyXG4gICAgICBpZiAocXVvdGFUeXBlQ29udHJvbCAmJiBxdW90YVR5cGVDb250cm9sLnZhbHVlID09PSBNYWlsYm94UXVvdGFzVHlwZS5jdXN0b20gJiYgbWF0Y2hpbmdDb250cm9sLnZhbHVlICYmIHBhcnNlSW50KG1hdGNoaW5nQ29udHJvbC52YWx1ZSkgPiBwYXJzZUludChjb250cm9sLnZhbHVlKSkge1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICBiaWdnZXJUaGFuOiB0cnVlXHJcbiAgICAgICAgfTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIH07XHJcbiAgfTtcclxuXHJcbiAgcmFuZ2VMaW1pdCA9IChmaWVsZE5hbWU6IHN0cmluZykgPT4ge1xyXG4gICAgcmV0dXJuIChjb250cm9sOiBhbnkpID0+IHtcclxuICAgICAgaWYgKCFjb250cm9sPy5wYXJlbnQgfHwgIWNvbnRyb2wudmFsdWUpIHtcclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgfVxyXG4gICAgICBjb25zdCBtYXRjaGluZ0NvbnRyb2wgPSBjb250cm9sLnBhcmVudC5nZXQoZmllbGROYW1lKTtcclxuICAgICAgaWYgKChjb250cm9sLnZhbHVlIC0gbWF0Y2hpbmdDb250cm9sLnZhbHVlKSA+IDUwMDAwKSB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgIHJhbmdlTGltaXQ6IHRydWVcclxuICAgICAgICB9O1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfTtcclxuICB9O1xyXG5cclxuICBjb21wYXJlcGF0dGVyblBhcnRzID0gKGZpZWxkTmFtZTogc3RyaW5nKSA9PiB7XHJcbiAgICByZXR1cm4gKGNvbnRyb2w6IGFueSkgPT4ge1xyXG4gICAgICBpZiAoIWNvbnRyb2w/LnZhbHVlKSB7XHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgIH1cclxuICAgICAgY29uc3QgbWF0Y2hlcyA9IGNvbnRyb2wudmFsdWUubWF0Y2goL1xcWyguKj8pXFxdLyk7XHJcbiAgICAgIGlmIChtYXRjaGVzKSB7XHJcbiAgICAgICAgY29uc3Qgc3VibWF0Y2ggPSBtYXRjaGVzWzFdO1xyXG4gICAgICAgIGNvbnN0IHN1Ym1hdGNoc3BsaXQ6IG51bWJlcltdID0gc3VibWF0Y2guc3BsaXQoJy0nKTtcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHN1Ym1hdGNoc3BsaXQubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgIGlmIChzdWJtYXRjaHNwbGl0W2ldID49IHN1Ym1hdGNoc3BsaXRbaSArIDFdKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgY29tcGFyZXBhdHRlcm5QYXJ0czogdHJ1ZVxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIH07XHJcbiAgfTtcclxuXHJcbiAgbWF0Y2hQcmVmaXggPSAoZmllbGROYW1lOiBzdHJpbmcpID0+IHtcclxuICAgIHJldHVybiAoY29udHJvbDogYW55KSA9PiB7XHJcbiAgICAgIGlmICghY29udHJvbD8ucGFyZW50IHx8ICFjb250cm9sLnZhbHVlKSB7XHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgIH1cclxuICAgICAgY29uc3QgbWF0Y2hpbmdDb250cm9sID0gY29udHJvbC5wYXJlbnQuZ2V0KGZpZWxkTmFtZSk7XHJcbiAgICAgIGlmICgobWF0Y2hpbmdDb250cm9sLnZhbHVlLnN0YXJ0c1dpdGgoJysnKSB8fCBjb250cm9sLnZhbHVlLnN0YXJ0c1dpdGgoJysnKSB8fCBtYXRjaGluZ0NvbnRyb2wudmFsdWUuc3RhcnRzV2l0aCgnXFxcXCsnKSB8fCBjb250cm9sLnZhbHVlLnN0YXJ0c1dpdGgoJ1xcXFwrJykpICYmIChjb250cm9sLnZhbHVlLmNoYXJBdCgwKSAhPT0gbWF0Y2hpbmdDb250cm9sLnZhbHVlLmNoYXJBdCgwKSkpIHtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgbWF0Y2hQcmVmaXg6IHRydWVcclxuICAgICAgICB9O1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfTtcclxuICB9O1xyXG5cclxuICBkZXZpY2VOYW1lVmFsaWRhdG9yID0gKGRldmljZTogRGV2aWNlKSA9PiB7XHJcbiAgICByZXR1cm4gKGNvbnRyb2w6IGFueSkgPT4ge1xyXG4gICAgICBpZiAoIWNvbnRyb2wudmFsdWUgfHwgZGV2aWNlLmRldmljZUtpbmQgPT09IERldmljZUtpbmQuZGV2aWNlUHJvZmlsZSkge1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG4gICAgICBpZiAoZGV2aWNlLmlzQ3RpUm91dGVQb2ludCkge1xyXG4gICAgICAgIGxldCBlcnIgPSAnJztcclxuICAgICAgICBpZiAoIWNvbnRyb2wudmFsdWUubWF0Y2goL15bYS16QS1aMC05LV8uXSskLykpIHtcclxuICAgICAgICAgIGVyciA9ICdwYXR0ZXJuJztcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGNvbnRyb2wudmFsdWUudHJpbSgpLmxlbmd0aCA+IDE1KSB7XHJcbiAgICAgICAgICBlcnIgPSAnbWF4TGVuZ3RoJztcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGVyciA/IHtuYW1lUnVsZTogZXJyfSA6IG51bGw7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKGRldmljZS5kZXZpY2VEZWZhdWx0cyAmJiAhZGV2aWNlLmlzQ3RpUm91dGVQb2ludCkge1xyXG4gICAgICAgIGNvbnN0IHJ1bGVUZXh0ID0gZGV2aWNlLmRldmljZURlZmF1bHRzLmRldmljZU5hbWVSZWdleDtcclxuICAgICAgICBjb25zdCBydWxlID0gbmV3IFJlZ0V4cChydWxlVGV4dCwgJ2cnKTtcclxuICAgICAgICBjb25zdCBjYXB0aW9uID0gZGV2aWNlLmRldmljZURlZmF1bHRzPy5kZXZpY2VOYW1lRXhwbGFpbmVkO1xyXG4gICAgICAgIGNvbnN0IG1hdGNoID0gKGNvbnRyb2wudmFsdWUgfHwgJycpLm1hdGNoKHJ1bGUpIHx8IFtdO1xyXG4gICAgICAgIGNvbnN0IGV4YWN0TWF0Y2ggPSBtYXRjaCAmJiBjb250cm9sLnZhbHVlID09PSBtYXRjaFswXTtcclxuICAgICAgICBpZiAocnVsZSAmJiAhZXhhY3RNYXRjaCkge1xyXG4gICAgICAgICAgcmV0dXJuIHtuYW1lUnVsZToge2NhcHRpb259fTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9O1xyXG4gIH07XHJcblxyXG4gIGRldmljZU5hbWVWYWx1ZVZhbGlkYXRvciA9IChkZXZpY2U6IERldmljZSwgZGV2aWNlTmFtZTogc3RyaW5nKSA9PiB7XHJcbiAgICByZXR1cm4gKGNvbnRyb2w6IGFueSkgPT4ge1xyXG4gICAgICBpZiAoIWNvbnRyb2wudmFsdWUgfHwgZGV2aWNlLmRldmljZUtpbmQgPT09IERldmljZUtpbmQuZGV2aWNlUHJvZmlsZSkge1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG4gICAgICBpZiAoZGV2aWNlLm5hbWUgJiYgZGV2aWNlLmFscmVhZHlVc2VkTmFtZSAmJiBkZXZpY2UubmFtZSA9PT0gZGV2aWNlLmFscmVhZHlVc2VkTmFtZSkge1xyXG4gICAgICAgIHJldHVybiB7bmFtZVJ1bGU6ICdhbHJlYWR5VXNlZE5hbWUnfTtcclxuICAgICAgfVxyXG4gICAgICBpZiAoZGV2aWNlLmlzQ3RpUm91dGVQb2ludCkge1xyXG4gICAgICAgIGxldCBlcnIgPSAnJztcclxuICAgICAgICBpZiAoIWRldmljZU5hbWUubWF0Y2goL15bYS16QS1aMC05LV8uXSskLykpIHtcclxuICAgICAgICAgIGVyciA9ICdwYXR0ZXJuJztcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGRldmljZU5hbWUudHJpbSgpLmxlbmd0aCA+IDE1KSB7XHJcbiAgICAgICAgICBlcnIgPSAnbWF4TGVuZ3RoJztcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGVyciA/IHtuYW1lUnVsZTogZXJyfSA6IG51bGw7XHJcbiAgICAgIH1cclxuICAgICBpZiAoZGV2aWNlLmRldmljZURlZmF1bHRzICYmICFkZXZpY2UuaXNDdGlSb3V0ZVBvaW50KSB7XHJcbiAgICAgICBjb25zdCBydWxlVGV4dCA9IGRldmljZS5kZXZpY2VEZWZhdWx0cy5kZXZpY2VOYW1lUmVnZXg7XHJcbiAgICAgICAgLy8gY29uc29sZS5sb2coJ0RldiBuYW1lIHJ1bGUgLSAnLCBydWxlVGV4dCk7XHJcbiAgICAgICAgY29uc3QgcnVsZSA9IG5ldyBSZWdFeHAocnVsZVRleHQsICdnJyk7XHJcbiAgICAgICAgbGV0IGNhcHRpb24gPSBkZXZpY2UuZGV2aWNlRGVmYXVsdHMuZGV2aWNlTmFtZUV4cGxhaW5lZDtcclxuICAgICAgICBpZiAoIWNhcHRpb24pIHtcclxuICAgICAgICAgIGNhcHRpb24gPSBydWxlVGV4dDtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgbWF0Y2ggPSAoZGV2aWNlTmFtZSB8fCAnJykubWF0Y2gocnVsZSkgfHwgW107XHJcbiAgICAgICAgY29uc3QgZXhhY3RNYXRjaCA9IG1hdGNoICYmIGRldmljZU5hbWUgPT09IG1hdGNoWzBdO1xyXG4gICAgICAgIGlmIChydWxlICYmICFleGFjdE1hdGNoKSB7XHJcbiAgICAgICAgICByZXR1cm4ge25hbWVSdWxlOiB7Y2FwdGlvbn19O1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIH07XHJcbiAgfTtcclxuXHJcbiAgZGV2aWNlRHVwbGljYXRpbmdOYW1lVmFsaWRhdG9yID0gKHVzZXI6IGFueSwgcGtpZCA/OiBzdHJpbmcsIHByZWZpeD86IHN0cmluZykgPT4ge1xyXG4gICAgcmV0dXJuIChjb250cm9sOiBhbnkpID0+IHtcclxuICAgICAgaWYgKCFjb250cm9sLnZhbHVlIHx8ICF1c2VyIHx8ICF1c2VyLmRldmljZXMgfHwgdXNlci5kZXZpY2VzLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG4gICAgICBjb25zdCBkZXZpY2VOYW1lID0gcHJlZml4ID8gYCR7cHJlZml4fSR7Y29udHJvbC52YWx1ZX1gIDogY29udHJvbC52YWx1ZTtcclxuICAgICAgY29uc3QgZGV2aWNlc1dpdGhUaGVTYW1lTmFtZSA9IHVzZXIuZGV2aWNlcy5maWx0ZXIoKGRldmljZTogRGV2aWNlKSA9PiBkZXZpY2UubmFtZSA9PT0gZGV2aWNlTmFtZSk7XHJcbiAgICAgIGlmIChkZXZpY2VzV2l0aFRoZVNhbWVOYW1lLmxlbmd0aCA+IDApIHtcclxuICAgICAgICBpZiAoIXBraWQpIHsgIC8vIEZvciBuZXcgZGV2aWNlXHJcbiAgICAgICAgICByZXR1cm4ge2R1cGxpY2F0ZU5hbWVSdWxlOiB0cnVlfTtcclxuICAgICAgICB9IGVsc2UgaWYgKHBraWQgIT09IGRldmljZXNXaXRoVGhlU2FtZU5hbWVbMF0ucGtpZCkgeyAvLyBGb3IgdXBkYXRpbmcgZGV2aWNlLCBhdm9pZCB2YWxpZGF0aW5nIHdpdGggaXRzZWxmXHJcbiAgICAgICAgICByZXR1cm4ge2R1cGxpY2F0ZU5hbWVSdWxlOiB0cnVlfTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9O1xyXG4gIH07XHJcblxyXG4gIGNvbmRpdGlvbmFsUmVxdWlyZWQgPSAoZmllbGROYW1lOiBzdHJpbmcsIHJlcXVpcmVkQ29uZGl0aW9uVmFsdWVzOiBhbnlbXSkgPT4ge1xyXG4gICAgcmV0dXJuIChjb250cm9sOiBhbnkpID0+IHtcclxuICAgICAgY29uc3QgcGFyZW50MSA9IGNvbnRyb2wucGFyZW50O1xyXG4gICAgICBpZiAoIXBhcmVudDEgfHwgIXBhcmVudDEuZ2V0KGZpZWxkTmFtZSkgfHwgIXBhcmVudDEuZ2V0KGZpZWxkTmFtZSkudmFsdWUpIHtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuICAgICAgaWYgKHJlcXVpcmVkQ29uZGl0aW9uVmFsdWVzLmluY2x1ZGVzKHBhcmVudDEuZ2V0KGZpZWxkTmFtZSkudmFsdWUpICYmICFjb250cm9sLnZhbHVlKSB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgIHJlcXVpcmVkOiB0cnVlXHJcbiAgICAgICAgfTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIH07XHJcbiAgfTtcclxuXHJcbiAgY29uZGl0aW9uYWxSZXF1aXJlZEZvckdyb3VwQWRtaW4gPSAoZmllbGROYW1lOiBzdHJpbmcsIHJlcXVpcmVkQ29uZGl0aW9uVmFsdWVzOiBhbnlbXSkgPT4ge1xyXG4gICAgcmV0dXJuIChjb250cm9sOiBhbnkpID0+IHtcclxuICAgICAgY29uc3QgcGFyZW50MSA9IGNvbnRyb2wucGFyZW50O1xyXG4gICAgICBpZiAoIXBhcmVudDEgfHwgIXBhcmVudDEuZ2V0KGZpZWxkTmFtZSkgfHwgIXBhcmVudDEuZ2V0KGZpZWxkTmFtZSkudmFsdWUgfHwgIXBhcmVudDEuZ2V0KGZpZWxkTmFtZSkudmFsdWUudHlwZSkge1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG4gICAgICBpZiAocmVxdWlyZWRDb25kaXRpb25WYWx1ZXMuaW5jbHVkZXMocGFyZW50MS5nZXQoZmllbGROYW1lKS52YWx1ZS50eXBlKSAmJiAhY29udHJvbC52YWx1ZSkge1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICByZXF1aXJlZDogdHJ1ZVxyXG4gICAgICAgIH07XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9O1xyXG4gIH07XHJcblxyXG4gIGNvbmRpdGlvbmFsU2l0ZUdyb3VwQ2hlY2tGb3JHcm91cEFkbWluID0gKGZpZWxkTmFtZTogc3RyaW5nLCByZXF1aXJlZENvbmRpdGlvblZhbHVlczogYW55W10pID0+IHtcclxuICAgIHJldHVybiAoY29udHJvbDogYW55KSA9PiB7XHJcbiAgICAgIGNvbnN0IHBhcmVudDEgPSBjb250cm9sLnBhcmVudDtcclxuICAgICAgaWYgKCFwYXJlbnQxIHx8ICFwYXJlbnQxLmdldChmaWVsZE5hbWUpIHx8ICFwYXJlbnQxLmdldChmaWVsZE5hbWUpLnZhbHVlIHx8ICFwYXJlbnQxLmdldChmaWVsZE5hbWUpLnZhbHVlLnR5cGUpIHtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuICAgICAgaWYgKHBhcmVudDEuZ2V0KGZpZWxkTmFtZSkudmFsdWUgJiYgcmVxdWlyZWRDb25kaXRpb25WYWx1ZXMuaW5jbHVkZXMocGFyZW50MS5nZXQoZmllbGROYW1lKS52YWx1ZS50eXBlKSAmJlxyXG4gICAgICAgIHBhcmVudDEuZ2V0KCdzaXRlR3JvdXAnKSAmJiBwYXJlbnQxLmdldCgnc2l0ZUdyb3VwJykudmFsdWUgJiZcclxuICAgICAgICBwYXJlbnQxLmdldCgnc2l0ZUdyb3VwJykudmFsdWUuc2l0ZUdyb3VwTWVtYmVycyAmJiBwYXJlbnQxLmdldCgnc2l0ZUdyb3VwJykudmFsdWUuc2l0ZUdyb3VwTWVtYmVycy5sZW5ndGggPCAxKSB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgIGhhc1NpdGVHcm91cEVycm9yOiB0cnVlXHJcbiAgICAgICAgfTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIH07XHJcbiAgfTtcclxuXHJcbiAgcmVxdWlyZWRJZkZpZWxkSXNFbXB0eUZvckJMRiA9IChmaWVsZE5hbWU6IGFueSkgPT4ge1xyXG4gICAgY29uc3QgREFURV9QQVRURVJOID0gJ14oMFsxLTldfDFbMDEyXSlbLSBcXC8uXSgwWzEtOV18WzEyXVswLTldfDNbMDFdKVstIFxcLy5dKDE5fDIwKVxcZFxcZCQnO1xyXG4gICAgcmV0dXJuIChjb250cm9sOiBhbnkpID0+IHtcclxuICAgICAgY29uc3QgcGFyZW50ID0gY29udHJvbC5wYXJlbnQ7XHJcbiAgICAgIGlmICghcGFyZW50IHx8ICFwYXJlbnQuZ2V0KGZpZWxkTmFtZSkpIHtcclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgfVxyXG4gICAgICBpZiAoIXBhcmVudC5nZXQoZmllbGROYW1lKS52YWx1ZSAmJiAhY29udHJvbC52YWx1ZSkge1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICByZXF1aXJlZEVpdGhlcjogdHJ1ZSxcclxuICAgICAgICAgIHJlcXVpcmVkQkxGRE46IHRydWVcclxuICAgICAgICB9O1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfTtcclxuICB9O1xyXG5cclxuXHJcbiAgdmFsaWREYXRlID0gKGZpZWxkTmFtZTogc3RyaW5nKSA9PiB7XHJcblxyXG4gICAgcmV0dXJuIChjb250cm9sOiBhbnkpID0+IHtcclxuICAgICAgY29uc3QgcGFyZW50ID0gY29udHJvbC5wYXJlbnQ7XHJcbiAgICAgIGNvbnN0IHJ1bGVUZXh0ID0gJ14oMFsxLTldfDFbMDEyXSlbLSBcXC8uXSgwWzEtOV18WzEyXVswLTldfDNbMDFdKVstIFxcLy5dKDE5fDIwKVxcZFxcZCQnO1xyXG4gICAgICBjb25zdCBydWxlID0gbmV3IFJlZ0V4cChydWxlVGV4dCwgJ2cnKTtcclxuICAgICAgY29uc3QgdmFsID0gY29udHJvbC52YWx1ZSAmJiBjb250cm9sLnZhbHVlLmdldERhdGUoKTtcclxuICAgICAgaWYgKHJ1bGUgJiYgIXJ1bGUudGVzdCh2YWwpKSB7XHJcbiAgICAgICAgcmV0dXJuIHtwYXR0ZXJuOiB0cnVlfTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIH07XHJcbiAgfTtcclxuXHJcblxyXG4gIG1hdGNoT3B0aW9uID0gKG9wdGlvblR5cGU6IHN0cmluZywgbGlzdD86IGFueSwgaXNGdWxsTGlzdD86IGJvb2xlYW4pID0+IHtcclxuICAgIHJldHVybiAoY29udHJvbDogYW55KSA9PiB7XHJcbiAgICAgIGlmICghY29udHJvbC52YWx1ZSB8fCBjb250cm9sLnZhbHVlID09PSBEZXZpY2VUeXBlcy5DVElfUk9VVEVfUE9JTlQpIHtcclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgfVxyXG4gICAgICBsZXQgb3B0aW9uTGlzdCA9IGxpc3QgfHwgdGhpcy5nZXRPcHRpb25zTGlzdChvcHRpb25UeXBlKTtcclxuICAgICAgaWYgKG9wdGlvbkxpc3QgJiYgb3B0aW9uTGlzdC5sZW5ndGgpIHtcclxuICAgICAgICBpZiAoIWlzRnVsbExpc3QgJiYgb3B0aW9uVHlwZSA9PT0gJ2RpcmVjdG9yeU51bWJlcnMnKSB7XHJcbiAgICAgICAgICBvcHRpb25MaXN0ID0gb3B0aW9uTGlzdC5tYXAoKHN0cjogc3RyaW5nKSA9PiBzdHIuaW5kZXhPZignICcpID4gLTEgPyBzdHIuc3Vic3RyaW5nKDAsIHN0ci5pbmRleE9mKCcgJykpIDogc3RyKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCFvcHRpb25MaXN0LmluY2x1ZGVzKGNvbnRyb2wudmFsdWUpKSB7XHJcbiAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICBtYXRjaE9wdGlvbnM6IHRydWVcclxuICAgICAgICAgIH07XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfTtcclxuICB9O1xyXG5cclxuICBjb25maWRlbnRpYWxBY2Nlc3NMZXZlbCA9IChjb25maWRlbnRpYWxBY2Nlc3NNb2RlOiBzdHJpbmcpID0+IHtcclxuICAgIHJldHVybiAoY29udHJvbDogYW55KSA9PiB7XHJcbiAgICAgIGlmICghY29udHJvbC52YWx1ZSAmJiAhY29uZmlkZW50aWFsQWNjZXNzTW9kZSkge1xyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICB9XHJcbiAgICAgIGlmICghY29udHJvbC52YWx1ZSkge1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICByZXF1aXJlZDogdHJ1ZVxyXG4gICAgICAgIH07XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9O1xyXG4gIH07XHJcblxyXG4gIG5vUmVzdWx0RE4gPSAob3B0aW9uVHlwZTogc3RyaW5nLCBsaXN0PzogYW55KSA9PiB7XHJcbiAgICByZXR1cm4gKGNvbnRyb2w6IGFueSkgPT4ge1xyXG4gICAgICBpZiAoIWNvbnRyb2wudmFsdWUgfHwgbGlzdCA9PT0gbnVsbCkge1xyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChsaXN0ICYmIGxpc3QubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgIG5vUmVzdWx0RE5zOiB0cnVlXHJcbiAgICAgICAgfTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIH07XHJcbiAgfTtcclxuXHJcbiAgbWF0Y2hFeHRlbnNpb25PcHRpb24gPSAob3B0aW9uVHlwZTogc3RyaW5nLCBvcHRpb25MaXN0PzogYW55KSA9PiB7XHJcbiAgICByZXR1cm4gKGNvbnRyb2w6IGFueSkgPT4ge1xyXG4gICAgICBpZiAoIWNvbnRyb2wudmFsdWUpIHtcclxuICAgICAgICByZXR1cm4gY29udHJvbC52YWx1ZTtcclxuICAgICAgfVxyXG4gICAgICAvLyBAdHMtaWdub3JlXHJcbiAgICAgIGNvbnN0IG5ld0xpc3QgPSBbXTtcclxuICAgICAgaWYgKG9wdGlvbkxpc3QgJiYgb3B0aW9uTGlzdC5sZW5ndGgpIHtcclxuICAgICAgICBvcHRpb25MaXN0LmZvckVhY2goKGxpc3Q6IGFueSkgPT4ge1xyXG4gICAgICAgICAgY29uc3QgbmV3T3B0aW9uTGlzdCA9IHRoaXMuZ2V0TWF0Y2hFeGlzdGluZ1ZtTGluZVZhbHVlKGxpc3QpO1xyXG4gICAgICAgICAgbmV3TGlzdC5wdXNoKG5ld09wdGlvbkxpc3QpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIC8vIEB0cy1pZ25vcmVcclxuICAgICAgICBpZiAobmV3TGlzdCAmJiAhbmV3TGlzdC5pbmNsdWRlcyhjb250cm9sLnZhbHVlKSkge1xyXG4gICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgbWF0Y2hPcHRpb25zOiB0cnVlXHJcbiAgICAgICAgICB9O1xyXG4gICAgICAgIH1cclxuICAgICAgfSBlbHNlIGlmICghb3B0aW9uTGlzdCB8fCAhb3B0aW9uTGlzdC5sZW5ndGgpIHtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgbWF0Y2hPcHRpb25zOiB0cnVlXHJcbiAgICAgICAgfTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIH07XHJcbiAgfTtcclxuXHJcbiAgcHVibGljIGdldE1hdGNoRXhpc3RpbmdWbUxpbmVWYWx1ZShkbldpdGhUeXBlOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgY29uc3QgaW5kID0gZG5XaXRoVHlwZS5pbmRleE9mKCdUeXBlOicpO1xyXG4gICAgbGV0IGRuID0gZG5XaXRoVHlwZTtcclxuICAgIGlmIChpbmQgPiAtMSkge1xyXG4gICAgICBkbiA9IGRuV2l0aFR5cGUuc2xpY2UoMCwgaW5kKTtcclxuICAgICAgZG4gPSBkbi50cmltKCk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZG47XHJcbiAgfVxyXG5cclxuICByZXF1aXJlZEVpdGhlckZvclZtRXh0ZW5zaW9uID0gKGZpZWxkTmFtZTE6IHN0cmluZywgZmllbGROYW1lMjogc3RyaW5nKSA9PiB7XHJcbiAgICByZXR1cm4gKGNvbnRyb2w6IGFueSkgPT4ge1xyXG4gICAgICBpZiAoIWNvbnRyb2wucGFyZW50KSB7XHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgIH1cclxuICAgICAgY29uc3QgbWF0Y2hDb250cm9sMSA9IGNvbnRyb2wucGFyZW50LmdldChmaWVsZE5hbWUxKS52YWx1ZTtcclxuICAgICAgY29uc3QgbWF0Y2hDb250cm9sMiA9IGNvbnRyb2wucGFyZW50LmdldChmaWVsZE5hbWUyKS52YWx1ZTtcclxuICAgICAgaWYgKCFtYXRjaENvbnRyb2wxICYmICFtYXRjaENvbnRyb2wyKSB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgIHJlcXVpcmVkRWl0aGVyRm9yVm1FeHRlbnNpb246IHRydWVcclxuICAgICAgICB9O1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfTtcclxuICB9O1xyXG5cclxuICByZXF1aXJlZEVpdGhlck9uZSA9IChmaWVsZE5hbWUxOiBzdHJpbmcsIGZpZWxkTmFtZTI6IHN0cmluZykgPT4ge1xyXG4gICAgcmV0dXJuIChjb250cm9sOiBhbnkpID0+IHtcclxuICAgICAgaWYgKCFjb250cm9sLnBhcmVudCkge1xyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICB9XHJcbiAgICAgIGNvbnN0IG1hdGNoQ29udHJvbDEgPSBjb250cm9sLnBhcmVudC5nZXQoZmllbGROYW1lMSkgJiYgY29udHJvbC5wYXJlbnQuZ2V0KGZpZWxkTmFtZTEpLnZhbHVlO1xyXG4gICAgICBjb25zdCBtYXRjaENvbnRyb2wyID0gY29udHJvbC5wYXJlbnQuZ2V0KGZpZWxkTmFtZTIpICYmIGNvbnRyb2wucGFyZW50LmdldChmaWVsZE5hbWUyKS52YWx1ZTtcclxuICAgICAgaWYgKCFtYXRjaENvbnRyb2wxICYmICFtYXRjaENvbnRyb2wyKSB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgIHJlcXVpcmVkRWl0aGVyT25lOiB0cnVlXHJcbiAgICAgICAgfTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIH07XHJcbiAgfTtcclxuXHJcbiAgcmVxdWlyZWRCeVZhbHVlID0gKGZpZWxkTmFtZTogc3RyaW5nLCByZXF1ZXN0ZWRGaWVsZFZhbDogYW55KSA9PiB7XHJcbiAgICByZXR1cm4gKGNvbnRyb2w6IGFueSkgPT4ge1xyXG4gICAgICBpZiAoIWNvbnRyb2wgfHwgIWNvbnRyb2wucGFyZW50KSB7XHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgIH1cclxuICAgICAgY29uc3QgZmllbGRWYWwgPSBjb250cm9sLnBhcmVudC5nZXQoZmllbGROYW1lKSAmJiBjb250cm9sLnBhcmVudC5nZXQoZmllbGROYW1lKS52YWx1ZTtcclxuICAgICAgaWYgKGZpZWxkVmFsICYmIGZpZWxkVmFsID09PSByZXF1ZXN0ZWRGaWVsZFZhbCAmJiAhY29udHJvbC52YWx1ZSkge1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICByZXF1aXJlZDogdHJ1ZVxyXG4gICAgICAgIH07XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9O1xyXG4gIH07XHJcblxyXG4gIE9uZUV4dGVuc2lvbkVtcHR5ID0gKGZpZWxkTmFtZTE6IHN0cmluZywgZmllbGROYW1lMjogc3RyaW5nKSA9PiB7XHJcbiAgICByZXR1cm4gKGNvbnRyb2w6IGFueSkgPT4ge1xyXG4gICAgICBpZiAoIWNvbnRyb2wucGFyZW50KSB7XHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgIH1cclxuICAgICAgY29uc3QgbWF0Y2hDb250cm9sMSA9IGNvbnRyb2wucGFyZW50LmdldChmaWVsZE5hbWUxKS52YWx1ZTtcclxuICAgICAgY29uc3QgbWF0Y2hDb250cm9sMiA9IGNvbnRyb2wucGFyZW50LmdldChmaWVsZE5hbWUyKS52YWx1ZTtcclxuICAgICAgaWYgKG1hdGNoQ29udHJvbDEgJiYgbWF0Y2hDb250cm9sMikge1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICBPbmVFeHRlbnNpb25Jc0VtcHR5OiB0cnVlXHJcbiAgICAgICAgfTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIH07XHJcbiAgfTtcclxuXHJcbiAgcmVxdWlyZWRCeUNvbmRpdGlvbiA9IChyZXF1aXJlZEJ5OiBzdHJpbmcsIGZpZWxkTmFtZTogYW55KSA9PiB7XHJcbiAgICByZXR1cm4gKGNvbnRyb2w6IGFueSkgPT4ge1xyXG4gICAgICBpZiAoIWNvbnRyb2wucGFyZW50KSB7XHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgIH1cclxuICAgICAgY29uc3QgcmVxdWlyZWRCeUNvbnRyb2wgPSBjb250cm9sLnBhcmVudC5nZXQocmVxdWlyZWRCeSkudmFsdWU7XHJcbiAgICAgIGNvbnN0IHJlcXVpcmVkQ29udHJvbCA9IGNvbnRyb2wucGFyZW50LmdldChmaWVsZE5hbWUpLnZhbHVlO1xyXG4gICAgICBpZiAocmVxdWlyZWRCeUNvbnRyb2wgJiYgIXJlcXVpcmVkQ29udHJvbCkge1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICByZXF1aXJlZDogdHJ1ZVxyXG4gICAgICAgIH07XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9O1xyXG4gIH07XHJcblxyXG4gIHByaXZhdGUgZ2V0T3B0aW9uc0xpc3QodG9rZW46IHN0cmluZyk6IHN0cmluZ1tdIHtcclxuICAgIHN3aXRjaCAodG9rZW4pIHtcclxuICAgICAgY2FzZSAnY3NzJzpcclxuICAgICAgY2FzZSAncmVyb3V0ZUNzcyc6XHJcbiAgICAgIGNhc2UgJ2NhbGxpbmdTZWFyY2hTcGFjZSc6XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuc2l0ZVNldHRpbmdzU2VydmljZS5jYWxsaW5nU2VhcmNoU3BhY2VUeXBlcztcclxuICAgICAgY2FzZSAncmVyb3V0aW5nQ3NzJzpcclxuICAgICAgICByZXR1cm4gdGhpcy5zaXRlU2V0dGluZ3NTZXJ2aWNlLnNpdGVEZWZhdWx0cyAmJiB0aGlzLnNpdGVTZXR0aW5nc1NlcnZpY2Uuc2l0ZURlZmF1bHRzLmNzc0ZpbHRlcjtcclxuICAgICAgY2FzZSAnZGV2aWNlVHlwZSc6XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuc2l0ZVNldHRpbmdzU2VydmljZS5kZXZpY2VUeXBlcztcclxuICAgICAgY2FzZSAncm91dGVQYXJ0aXRpb24nOlxyXG4gICAgICAgIHJldHVybiB0aGlzLnNpdGVTZXR0aW5nc1NlcnZpY2Uucm91dGVQYXJ0aXRpb25OYW1lcztcclxuICAgICAgY2FzZSAncm91dGVQYXJ0aXRpb25GaWx0ZXJlZCc6XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuc2l0ZVNldHRpbmdzU2VydmljZS5maWx0ZXJlZFJvdXRlUGFydGl0aW9uTmFtZXM7XHJcbiAgICAgIGNhc2UgJ2RldmljZVBvb2xzJzpcclxuICAgICAgICByZXR1cm4gdGhpcy5zaXRlU2V0dGluZ3NTZXJ2aWNlLmRldmljZVBvb2xzO1xyXG4gICAgICBjYXNlICdhbGxSb3V0ZVBhcnRpdGlvbnMnOlxyXG4gICAgICAgIHJldHVybiB0aGlzLnNpdGVTZXR0aW5nc1NlcnZpY2UuYWxsUm91dGVQYXJ0aXRpb25OYW1lcztcclxuICAgICAgY2FzZSAnZGlyZWN0b3J5TnVtYmVycyc6XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuc2l0ZVNldHRpbmdzU2VydmljZS5kaXJlY3RvcnlOdW1iZXJzO1xyXG4gICAgICBkZWZhdWx0OlxyXG4gICAgICAgIHJldHVybiBbXTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGF1dG9jb21wbGV0ZVR5cGUoY29udHJvbDogYW55KSB7XHJcbiAgICBpZiAoIWNvbnRyb2wudmFsdWUpIHtcclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcbiAgICBpZiAodHlwZW9mIGNvbnRyb2wudmFsdWUgIT09ICdvYmplY3QnICYmIGNvbnRyb2wudmFsdWUgIT09ICcnKSB7XHJcbiAgICAgIHJldHVybiB7XHJcbiAgICAgICAgc3RyaW5nRW50ZXJlZDogdHJ1ZVxyXG4gICAgICB9O1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIG51bGw7XHJcbiAgfVxyXG5cclxuXHJcbiAgcGFzc3dvcmQoY29udHJvbDogYW55KSB7XHJcbiAgICBjb25zdCBydWxlTnVtZXJpYyA9IG5ldyBSZWdFeHAoL1xcZCsvLCAnZycpO1xyXG4gICAgY29uc3QgcnVsZUNhcGl0YWxzID0gbmV3IFJlZ0V4cCgvW0EtWl0rLywgJ2cnKTtcclxuICAgIGNvbnN0IHJ1bGVTbWFsbCA9IG5ldyBSZWdFeHAoL1thLXpdKy8sICdnJyk7XHJcbiAgICBjb25zdCBydWxlU3BlY2lhbCA9IG5ldyBSZWdFeHAoL1shQCMkJSZcXC89XFw/X1xcLiw6O1xcLVxcXFwrXSsvLCAnZycpO1xyXG5cclxuICAgIGNvbnN0IGhhc051bWVyaWMgPSArcnVsZU51bWVyaWMudGVzdChjb250cm9sLnZhbHVlKTtcclxuICAgIGNvbnN0IGhhc0NhcGl0YWxzID0gK3J1bGVDYXBpdGFscy50ZXN0KGNvbnRyb2wudmFsdWUpO1xyXG4gICAgY29uc3QgaGFzU21hbGwgPSArcnVsZVNtYWxsLnRlc3QoY29udHJvbC52YWx1ZSk7XHJcbiAgICBjb25zdCBoYXNTcGVjaWFsID0gK3J1bGVTcGVjaWFsLnRlc3QoY29udHJvbC52YWx1ZSk7XHJcblxyXG4gICAgaWYgKGhhc051bWVyaWMgKyBoYXNDYXBpdGFscyArIGhhc1NtYWxsICsgaGFzU3BlY2lhbCA8IDMpIHtcclxuICAgICAgcmV0dXJuIHtcclxuICAgICAgICB3ZWFrUGFzc3dvcmQ6IHRydWVcclxuICAgICAgfTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gbnVsbDtcclxuICB9XHJcblxyXG4gIHZlcmlmeUF1dG9BbnN3ZXIoY29udHJvbDogYW55KSB7XHJcbiAgICBpZiAoIWNvbnRyb2w/LnZhbHVlIHx8IGNvbnRyb2wudmFsdWUubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG4gICAgbGV0IGF1dG9BbnN3ZXJFcnJvckxpbmUgPSBudWxsO1xyXG4gICAgaWYgKGNvbnRyb2wucGFyZW50ICYmIGNvbnRyb2wucGFyZW50LnBhcmVudCAmJiBjb250cm9sLnBhcmVudC5wYXJlbnQucGFyZW50ICYmIGNvbnRyb2wucGFyZW50LnBhcmVudC5wYXJlbnQucGFyZW50KSB7XHJcbiAgICAgIGNvbnN0IGNvbnRyb2xTTlIgPSBjb250cm9sLnBhcmVudDtcclxuICAgICAgY29uc3QgY29udHJvbFVzZXIgPSBjb250cm9sLnBhcmVudC5wYXJlbnQucGFyZW50LnBhcmVudDtcclxuICAgICAgY29uc3QgbGluZUFzc29jaWF0aW9ucyA9IGNvbnRyb2xTTlIuZ2V0KCdsaW5lQXNzb2NpYXRpb25zJyk7XHJcbiAgICAgIGNvbnN0IGxpbmVzID0gY29udHJvbFVzZXIuZ2V0KCdsaW5lcycpO1xyXG4gICAgICBpZiAobGluZXMpIHtcclxuICAgICAgICBsaW5lQXNzb2NpYXRpb25zLnZhbHVlLmZvckVhY2goKGxpbmVBc3NvY2lhdGlvbjogYW55KSA9PiB7XHJcbiAgICAgICAgICBjb25zdCBhdXRvQW5zd2VyTGluZSA9IGxpbmVzLmNvbnRyb2xzLmZpbmQoKGxpbmU6IGFueSkgPT4gbGluZS5nZXQoJ2RpcmVjdG9yeU51bWJlcicpLnZhbHVlLmRpcmVjdG9yeU51bWJlciA9PT0gbGluZUFzc29jaWF0aW9uLmRpcmVjdG9yeU51bWJlciAmJiBsaW5lLmdldCgnZGlyZWN0b3J5TnVtYmVyJykudmFsdWUucm91dGVQYXJ0aXRpb25OYW1lID09PSBsaW5lQXNzb2NpYXRpb24ucm91dGVQYXJ0aXRpb25OYW1lXHJcbiAgICAgICAgICAgICYmIGxpbmUuZ2V0KCdhdXRvQW5zd2VyJykudmFsdWUgIT09ICdBdXRvIEFuc3dlciBPZmYnKTtcclxuICAgICAgICAgIGlmIChhdXRvQW5zd2VyTGluZSkge1xyXG4gICAgICAgICAgICBhdXRvQW5zd2VyRXJyb3JMaW5lID0ge1xyXG4gICAgICAgICAgICAgIGF1dG9BbnN3ZXJFcnJvckxpbmU6IGxpbmVBc3NvY2lhdGlvbi5kaXJlY3RvcnlOdW1iZXJcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBhdXRvQW5zd2VyRXJyb3JMaW5lO1xyXG4gIH1cclxuXHJcbiAgdmVyaWZ5QmVnaW5FbmRUaW1lKGNvbnRyb2w6IGFueSkge1xyXG4gICAgY29uc3QgcGFyZW50ID0gY29udHJvbC5wYXJlbnQ7XHJcbiAgICBpZiAoIXBhcmVudCB8fCAhcGFyZW50LmdldCgnaXNBY3RpdmUnKSB8fCAhcGFyZW50LmdldCgnYWxsRGF5JykgfHwgIXBhcmVudC5nZXQoJ2Zyb20nKSB8fCAhcGFyZW50LmdldCgndG8nKSkge1xyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICBpZiAocGFyZW50LmdldCgnaXNBY3RpdmUnKS52YWx1ZSkge1xyXG4gICAgICBpZiAoIXBhcmVudC5nZXQoJ2FsbERheScpLnZhbHVlKSB7XHJcbiAgICAgICAgaWYgKCFwYXJlbnQuZ2V0KCdmcm9tJykudmFsdWUgfHwgcGFyZW50LmdldCgnZnJvbScpLnZhbHVlID09PSAnTm8gT2ZmaWNlIEhvdXJzJ1xyXG4gICAgICAgICAgfHwgIXBhcmVudC5nZXQoJ3RvJykudmFsdWUgfHwgcGFyZW50LmdldCgndG8nKS52YWx1ZSA9PT0gJ05vIE9mZmljZSBIb3VycydcclxuICAgICAgICAgIHx8IHBhcmVudC5nZXQoJ2Zyb20nKS52YWx1ZSA+IHBhcmVudC5nZXQoJ3RvJykudmFsdWUpIHtcclxuICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIGZyb21HcmVhdGVyVGhhblRvOiB0cnVlXHJcbiAgICAgICAgICB9O1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBudWxsO1xyXG4gIH1cclxuXHJcbiAgdGltZShjb250cm9sOiBhbnkpIHtcclxuICAgIGlmIChjb250cm9sLnZhbHVlICYmICF0aW1lUmVnZXgudGVzdChjb250cm9sLnZhbHVlKSkge1xyXG4gICAgICByZXR1cm4ge3RpbWVGb3JtYXQ6IHRydWV9O1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIG51bGw7XHJcbiAgfVxyXG5cclxuXHJcbiAgcGluTXVsdGlDaGFyYWN0ZXJDaGVjayA9IChmaWVsZE5hbWU6IHN0cmluZykgPT4ge1xyXG4gICAgLy8gQHRzLWlnbm9yZVxyXG4gICAgcmV0dXJuIChjb250cm9sOiBhbnkpID0+IHtcclxuICAgICAgaWYgKCFjb250cm9sLnBhcmVudCkge1xyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICB9XHJcbiAgICAgIGNvbnN0IG1hdGNoaW5nQ29udHJvbCA9IGNvbnRyb2wucGFyZW50LmdldChmaWVsZE5hbWUpO1xyXG4gICAgICBjb25zdCBydWxlTXVsdGlDaGFyYWN0ZXIgPSBuZXcgUmVnRXhwKCcoWzAtOV0pXFxcXDF7Mn0nKTtcclxuICAgICAgaWYgKG1hdGNoaW5nQ29udHJvbC52YWx1ZSkge1xyXG4gICAgICAgIGNvbnN0IGhhc011bHRpQ2hhcmFjdGVyID0gcnVsZU11bHRpQ2hhcmFjdGVyLnRlc3QobWF0Y2hpbmdDb250cm9sLnZhbHVlKTtcclxuICAgICAgICBpZiAoaGFzTXVsdGlDaGFyYWN0ZXIpIHtcclxuICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIG11bHRpQ2hhcmFjdGVyOiB0cnVlXHJcbiAgICAgICAgICB9O1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfTtcclxuICB9O1xyXG5cclxuICBwaW5Db25zZWN1dGl2ZU51bWJlckNoZWNrID0gKGZpZWxkTmFtZTogc3RyaW5nKSA9PiB7XHJcbiAgICAvLyBAdHMtaWdub3JlXHJcbiAgICByZXR1cm4gKGNvbnRyb2w6IGFueSkgPT4ge1xyXG4gICAgICBpZiAoIWNvbnRyb2wucGFyZW50KSB7XHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgIH1cclxuICAgICAgY29uc3QgbWF0Y2hpbmdDb250cm9sID0gY29udHJvbC5wYXJlbnQuZ2V0KGZpZWxkTmFtZSk7XHJcbiAgICAgIGNvbnN0IHN0clRvQ2hlY2sgPSBtYXRjaGluZ0NvbnRyb2wudmFsdWU7XHJcbiAgICAgIGlmIChzdHJUb0NoZWNrICYmIHN0clRvQ2hlY2subGVuZ3RoID4gMSkge1xyXG4gICAgICAgIGNvbnN0IHJlc0FzYyA9IHRoaXMucGluT3JkZXJDaGVjayhzdHJUb0NoZWNrKTtcclxuICAgICAgICBpZiAocmVzQXNjID09PSB0cnVlKSB7XHJcbiAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICBjb25zZWN1dGl2ZU51bWJlcnM6IHRydWVcclxuICAgICAgICAgIH07XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9O1xyXG4gIH07XHJcblxyXG5cclxuICBwaW5PcmRlckNoZWNrKHN0cjogc3RyaW5nKTogYW55IHtcclxuICAgIGlmIChzdHIpIHtcclxuICAgICAgY29uc3QgYXJyX251bSA9ICgnJyArIHN0cikuc3BsaXQoJycpO1xyXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFycl9udW0ubGVuZ3RoIC0gMjsgaSsrKSB7XHJcbiAgICAgICAgY29uc3QgbnVtMSA9IHBhcnNlSW50KGFycl9udW1baV0pO1xyXG4gICAgICAgIGNvbnN0IG51bTIgPSBwYXJzZUludChhcnJfbnVtW2kgKyAxXSk7XHJcbiAgICAgICAgY29uc3QgbnVtMyA9IHBhcnNlSW50KGFycl9udW1baSArIDJdKTtcclxuICAgICAgICBpZiAoKG51bTIgLSBudW0xKSA9PT0gMSAmJiAobnVtMyAtIG51bTIgPT09IG51bTIgLSBudW0xKSkge1xyXG4gICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuICB9XHJcblxyXG5cclxuICBwaW5NYWlsYm94RXh0ZW5zaW9uQ2hlY2sgPSAoZmllbGROYW1lOiBzdHJpbmcsIGV4dGVuc2lvbjogc3RyaW5nKSA9PiB7XHJcbiAgICByZXR1cm4gKGNvbnRyb2w6IGFueSkgPT4ge1xyXG4gICAgICBpZiAoIWNvbnRyb2wucGFyZW50KSB7XHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgIH1cclxuICAgICAgY29uc3QgbWF0Y2hpbmdDb250cm9sID0gY29udHJvbC5wYXJlbnQuZ2V0KGZpZWxkTmFtZSk7XHJcbiAgICAgIGNvbnN0IHN0clRvQ2hlY2sgPSBtYXRjaGluZ0NvbnRyb2wudmFsdWU7XHJcbiAgICAgIGlmIChzdHJUb0NoZWNrID09PSBleHRlbnNpb24gfHwgc3RyVG9DaGVjay5pbmNsdWRlcyhleHRlbnNpb24pKSB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgIG1haWxib3hFeHRlbnNpb246IHRydWVcclxuICAgICAgICB9O1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfTtcclxuICB9O1xyXG5cclxuICBpc0l0ZW1BbHJlYWR5SW5MaXN0KGl0ZW06IGFueSwgbGlzdDogYW55KTogYm9vbGVhbiB7XHJcbiAgICBpZiAoIWl0ZW0gfHwgIWxpc3QgfHwgIWxpc3QubGVuZ3RoKSB7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuICAgIGZvciAoY29uc3QgbGlzdEl0ZW0gb2YgbGlzdCkge1xyXG4gICAgICBpZiAoaXRlbS5lcXVhbHMobGlzdEl0ZW0pKSB7XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcbn1cclxuIl19