@delon/abc 15.2.1 → 16.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (462) hide show
  1. package/auto-focus/auto-focus.directive.d.ts +1 -1
  2. package/avatar-list/avatar-list-item.component.d.ts +1 -1
  3. package/avatar-list/avatar-list.component.d.ts +1 -1
  4. package/count-down/count-down.component.d.ts +1 -1
  5. package/date-picker/range.directive.d.ts +1 -1
  6. package/down-file/down-file.directive.d.ts +1 -1
  7. package/ellipsis/ellipsis.component.d.ts +1 -1
  8. package/error-collect/error-collect.component.d.ts +1 -1
  9. package/esm2022/auto-focus/auto-focus.directive.mjs +51 -0
  10. package/esm2022/auto-focus/auto-focus.module.mjs +18 -0
  11. package/esm2022/avatar-list/avatar-list-item.component.mjs +27 -0
  12. package/esm2022/avatar-list/avatar-list.component.mjs +89 -0
  13. package/esm2022/avatar-list/avatar-list.module.mjs +23 -0
  14. package/esm2022/count-down/count-down.component.mjs +46 -0
  15. package/esm2022/count-down/count-down.module.mjs +21 -0
  16. package/esm2022/date-picker/date-picker.module.mjs +23 -0
  17. package/esm2022/date-picker/range-shortcut.component.mjs +41 -0
  18. package/esm2022/date-picker/range.directive.mjs +174 -0
  19. package/esm2022/down-file/down-file.directive.mjs +115 -0
  20. package/esm2022/down-file/down-file.module.mjs +21 -0
  21. package/esm2022/ellipsis/ellipsis.component.mjs +233 -0
  22. package/esm2022/ellipsis/ellipsis.module.mjs +22 -0
  23. package/esm2022/error-collect/error-collect.component.mjs +122 -0
  24. package/esm2022/error-collect/error-collect.module.mjs +21 -0
  25. package/esm2022/exception/exception.component.mjs +109 -0
  26. package/esm2022/exception/exception.module.mjs +24 -0
  27. package/esm2022/footer-toolbar/footer-toolbar.component.mjs +45 -0
  28. package/esm2022/footer-toolbar/footer-toolbar.module.mjs +22 -0
  29. package/esm2022/full-content/full-content-toggle.directive.mjs +25 -0
  30. package/esm2022/full-content/full-content.component.mjs +140 -0
  31. package/esm2022/full-content/full-content.module.mjs +21 -0
  32. package/esm2022/full-content/full-content.service.mjs +23 -0
  33. package/esm2022/global-footer/global-footer-item.component.mjs +31 -0
  34. package/esm2022/global-footer/global-footer.component.mjs +73 -0
  35. package/esm2022/global-footer/global-footer.module.mjs +22 -0
  36. package/esm2022/hotkey/hotkey.directive.mjs +37 -0
  37. package/esm2022/hotkey/hotkey.module.mjs +18 -0
  38. package/esm2022/let/let.directive.mjs +38 -0
  39. package/esm2022/let/let.module.mjs +18 -0
  40. package/esm2022/loading/loading.component.mjs +27 -0
  41. package/esm2022/loading/loading.module.mjs +24 -0
  42. package/esm2022/loading/loading.service.mjs +91 -0
  43. package/esm2022/lodop/lodop.module.mjs +13 -0
  44. package/esm2022/lodop/lodop.service.mjs +223 -0
  45. package/esm2022/media/media.component.mjs +118 -0
  46. package/esm2022/media/media.module.mjs +20 -0
  47. package/esm2022/media/media.service.mjs +47 -0
  48. package/esm2022/notice-icon/notice-icon-tab.component.mjs +35 -0
  49. package/esm2022/notice-icon/notice-icon.component.mjs +90 -0
  50. package/esm2022/notice-icon/notice-icon.module.mjs +59 -0
  51. package/esm2022/observers/observer-size.mjs +119 -0
  52. package/esm2022/onboarding/onboarding.component.mjs +135 -0
  53. package/esm2022/onboarding/onboarding.module.mjs +27 -0
  54. package/esm2022/onboarding/onboarding.service.mjs +186 -0
  55. package/esm2022/page-header/page-header.component.mjs +247 -0
  56. package/esm2022/page-header/page-header.module.mjs +25 -0
  57. package/esm2022/pdf/pdf.component.mjs +474 -0
  58. package/{esm2020 → esm2022}/pdf/pdf.config.mjs +2 -2
  59. package/esm2022/pdf/pdf.module.mjs +21 -0
  60. package/esm2022/qr/qr.component.mjs +137 -0
  61. package/esm2022/qr/qr.module.mjs +20 -0
  62. package/esm2022/quick-menu/quick-menu.component.mjs +90 -0
  63. package/esm2022/quick-menu/quick-menu.module.mjs +22 -0
  64. package/esm2022/result/result.component.mjs +61 -0
  65. package/esm2022/result/result.module.mjs +22 -0
  66. package/esm2022/reuse-tab/reuse-tab-context-menu.component.mjs +77 -0
  67. package/esm2022/reuse-tab/reuse-tab-context.component.mjs +34 -0
  68. package/esm2022/reuse-tab/reuse-tab-context.directive.mjs +36 -0
  69. package/esm2022/reuse-tab/reuse-tab-context.service.mjs +56 -0
  70. package/esm2022/reuse-tab/reuse-tab.component.mjs +368 -0
  71. package/esm2022/reuse-tab/reuse-tab.module.mjs +50 -0
  72. package/esm2022/reuse-tab/reuse-tab.service.mjs +559 -0
  73. package/esm2022/se/se-container.component.mjs +174 -0
  74. package/esm2022/se/se.component.mjs +235 -0
  75. package/esm2022/se/se.module.mjs +24 -0
  76. package/esm2022/sg/sg-container.component.mjs +53 -0
  77. package/esm2022/sg/sg.component.mjs +68 -0
  78. package/esm2022/sg/sg.module.mjs +21 -0
  79. package/esm2022/st/st-column-source.mjs +493 -0
  80. package/esm2022/st/st-data-source.mjs +480 -0
  81. package/esm2022/st/st-export.mjs +90 -0
  82. package/{esm2020 → esm2022}/st/st-filter.component.mjs +8 -7
  83. package/esm2022/st/st-row.directive.mjs +47 -0
  84. package/esm2022/st/st-widget-host.directive.mjs +32 -0
  85. package/esm2022/st/st-widget.mjs +27 -0
  86. package/esm2022/st/st.component.mjs +1004 -0
  87. package/esm2022/st/st.module.mjs +97 -0
  88. package/esm2022/sv/sv-container.component.mjs +127 -0
  89. package/esm2022/sv/sv-value.component.mjs +45 -0
  90. package/esm2022/sv/sv.component.mjs +120 -0
  91. package/esm2022/sv/sv.module.mjs +26 -0
  92. package/esm2022/tag-select/tag-select.component.mjs +64 -0
  93. package/esm2022/tag-select/tag-select.module.mjs +22 -0
  94. package/esm2022/xlsx/xlsx.directive.mjs +28 -0
  95. package/esm2022/xlsx/xlsx.module.mjs +20 -0
  96. package/esm2022/xlsx/xlsx.service.mjs +129 -0
  97. package/esm2022/zip/zip.module.mjs +16 -0
  98. package/esm2022/zip/zip.service.mjs +117 -0
  99. package/exception/exception.component.d.ts +1 -1
  100. package/{fesm2015 → fesm2022}/auto-focus.mjs +7 -7
  101. package/{fesm2015 → fesm2022}/auto-focus.mjs.map +1 -1
  102. package/{fesm2020 → fesm2022}/avatar-list.mjs +10 -10
  103. package/fesm2022/avatar-list.mjs.map +1 -0
  104. package/{fesm2020 → fesm2022}/chart-observer-size.mjs +10 -10
  105. package/fesm2022/chart-observer-size.mjs.map +1 -0
  106. package/{fesm2020 → fesm2022}/count-down.mjs +7 -7
  107. package/fesm2022/count-down.mjs.map +1 -0
  108. package/{fesm2020 → fesm2022}/date-picker.mjs +14 -13
  109. package/fesm2022/date-picker.mjs.map +1 -0
  110. package/{fesm2020 → fesm2022}/down-file.mjs +8 -8
  111. package/fesm2022/down-file.mjs.map +1 -0
  112. package/{fesm2020 → fesm2022}/ellipsis.mjs +7 -7
  113. package/fesm2022/ellipsis.mjs.map +1 -0
  114. package/{fesm2020 → fesm2022}/error-collect.mjs +9 -9
  115. package/fesm2022/error-collect.mjs.map +1 -0
  116. package/{fesm2020 → fesm2022}/exception.mjs +7 -7
  117. package/fesm2022/exception.mjs.map +1 -0
  118. package/{fesm2020 → fesm2022}/footer-toolbar.mjs +7 -7
  119. package/fesm2022/footer-toolbar.mjs.map +1 -0
  120. package/{fesm2020 → fesm2022}/full-content.mjs +13 -13
  121. package/fesm2022/full-content.mjs.map +1 -0
  122. package/{fesm2020 → fesm2022}/global-footer.mjs +10 -10
  123. package/fesm2022/global-footer.mjs.map +1 -0
  124. package/{fesm2020 → fesm2022}/hotkey.mjs +7 -7
  125. package/{fesm2015 → fesm2022}/hotkey.mjs.map +1 -1
  126. package/{fesm2020 → fesm2022}/let.mjs +9 -8
  127. package/fesm2022/let.mjs.map +1 -0
  128. package/{fesm2020 → fesm2022}/loading.mjs +10 -11
  129. package/fesm2022/loading.mjs.map +1 -0
  130. package/{fesm2020 → fesm2022}/lodop.mjs +7 -7
  131. package/{fesm2020 → fesm2022}/lodop.mjs.map +1 -1
  132. package/{fesm2020 → fesm2022}/media.mjs +10 -10
  133. package/fesm2022/media.mjs.map +1 -0
  134. package/fesm2022/notice-icon.mjs +180 -0
  135. package/fesm2022/notice-icon.mjs.map +1 -0
  136. package/{fesm2020 → fesm2022}/onboarding.mjs +10 -11
  137. package/{fesm2020 → fesm2022}/onboarding.mjs.map +1 -1
  138. package/{fesm2020 → fesm2022}/page-header.mjs +7 -7
  139. package/{fesm2015 → fesm2022}/page-header.mjs.map +1 -1
  140. package/{fesm2020 → fesm2022}/pdf.mjs +10 -10
  141. package/fesm2022/pdf.mjs.map +1 -0
  142. package/{fesm2015 → fesm2022}/qr.mjs +7 -7
  143. package/{fesm2020 → fesm2022}/qr.mjs.map +1 -1
  144. package/{fesm2020 → fesm2022}/quick-menu.mjs +7 -7
  145. package/fesm2022/quick-menu.mjs.map +1 -0
  146. package/{fesm2020 → fesm2022}/result.mjs +7 -7
  147. package/{fesm2020 → fesm2022}/result.mjs.map +1 -1
  148. package/{fesm2020 → fesm2022}/reuse-tab.mjs +31 -31
  149. package/{fesm2015 → fesm2022}/reuse-tab.mjs.map +1 -1
  150. package/{fesm2020 → fesm2022}/se.mjs +15 -15
  151. package/fesm2022/se.mjs.map +1 -0
  152. package/{fesm2020 → fesm2022}/sg.mjs +10 -10
  153. package/fesm2022/sg.mjs.map +1 -0
  154. package/{fesm2020 → fesm2022}/st.mjs +72 -72
  155. package/fesm2022/st.mjs.map +1 -0
  156. package/{fesm2020 → fesm2022}/sv.mjs +20 -20
  157. package/fesm2022/sv.mjs.map +1 -0
  158. package/{fesm2020 → fesm2022}/tag-select.mjs +7 -7
  159. package/fesm2022/tag-select.mjs.map +1 -0
  160. package/{fesm2020 → fesm2022}/xlsx.mjs +10 -10
  161. package/fesm2022/xlsx.mjs.map +1 -0
  162. package/{fesm2020 → fesm2022}/zip.mjs +7 -7
  163. package/{fesm2015 → fesm2022}/zip.mjs.map +1 -1
  164. package/footer-toolbar/footer-toolbar.component.d.ts +1 -1
  165. package/full-content/full-content.component.d.ts +1 -1
  166. package/global-footer/global-footer-item.component.d.ts +1 -1
  167. package/global-footer/global-footer.component.d.ts +1 -1
  168. package/hotkey/hotkey.directive.d.ts +1 -1
  169. package/let/let.directive.d.ts +1 -1
  170. package/loading/style/index.less +1 -4
  171. package/media/media.component.d.ts +1 -1
  172. package/notice-icon/notice-icon-tab.component.d.ts +1 -1
  173. package/notice-icon/notice-icon.component.d.ts +1 -1
  174. package/onboarding/style/index.less +1 -4
  175. package/package.json +106 -176
  176. package/page-header/page-header.component.d.ts +1 -1
  177. package/pdf/pdf.component.d.ts +1 -1
  178. package/qr/qr.component.d.ts +1 -1
  179. package/quick-menu/quick-menu.component.d.ts +1 -1
  180. package/result/result.component.d.ts +1 -1
  181. package/reuse-tab/reuse-tab-context-menu.component.d.ts +1 -1
  182. package/reuse-tab/reuse-tab-context.component.d.ts +1 -1
  183. package/reuse-tab/reuse-tab-context.directive.d.ts +1 -1
  184. package/reuse-tab/reuse-tab.component.d.ts +1 -1
  185. package/se/se-container.component.d.ts +1 -1
  186. package/se/se.component.d.ts +1 -1
  187. package/sg/sg-container.component.d.ts +1 -1
  188. package/sg/sg.component.d.ts +1 -1
  189. package/st/st-filter.component.d.ts +1 -1
  190. package/st/st-row.directive.d.ts +1 -1
  191. package/st/st-widget-host.directive.d.ts +1 -1
  192. package/st/st.component.d.ts +9 -5
  193. package/st/style/index.less +6 -2
  194. package/sv/sv-container.component.d.ts +1 -1
  195. package/sv/sv-value.component.d.ts +1 -1
  196. package/sv/sv.component.d.ts +1 -1
  197. package/tag-select/tag-select.component.d.ts +1 -1
  198. package/xlsx/xlsx.directive.d.ts +1 -1
  199. package/esm2020/auto-focus/auto-focus.directive.mjs +0 -50
  200. package/esm2020/auto-focus/auto-focus.module.mjs +0 -17
  201. package/esm2020/avatar-list/avatar-list-item.component.mjs +0 -26
  202. package/esm2020/avatar-list/avatar-list.component.mjs +0 -88
  203. package/esm2020/avatar-list/avatar-list.module.mjs +0 -22
  204. package/esm2020/count-down/count-down.component.mjs +0 -45
  205. package/esm2020/count-down/count-down.module.mjs +0 -20
  206. package/esm2020/date-picker/date-picker.module.mjs +0 -22
  207. package/esm2020/date-picker/range-shortcut.component.mjs +0 -40
  208. package/esm2020/date-picker/range.directive.mjs +0 -172
  209. package/esm2020/down-file/down-file.directive.mjs +0 -114
  210. package/esm2020/down-file/down-file.module.mjs +0 -20
  211. package/esm2020/ellipsis/ellipsis.component.mjs +0 -232
  212. package/esm2020/ellipsis/ellipsis.module.mjs +0 -21
  213. package/esm2020/error-collect/error-collect.component.mjs +0 -121
  214. package/esm2020/error-collect/error-collect.module.mjs +0 -20
  215. package/esm2020/exception/exception.component.mjs +0 -108
  216. package/esm2020/exception/exception.module.mjs +0 -23
  217. package/esm2020/footer-toolbar/footer-toolbar.component.mjs +0 -44
  218. package/esm2020/footer-toolbar/footer-toolbar.module.mjs +0 -21
  219. package/esm2020/full-content/full-content-toggle.directive.mjs +0 -24
  220. package/esm2020/full-content/full-content.component.mjs +0 -139
  221. package/esm2020/full-content/full-content.module.mjs +0 -20
  222. package/esm2020/full-content/full-content.service.mjs +0 -22
  223. package/esm2020/global-footer/global-footer-item.component.mjs +0 -30
  224. package/esm2020/global-footer/global-footer.component.mjs +0 -72
  225. package/esm2020/global-footer/global-footer.module.mjs +0 -21
  226. package/esm2020/hotkey/hotkey.directive.mjs +0 -36
  227. package/esm2020/hotkey/hotkey.module.mjs +0 -17
  228. package/esm2020/let/let.directive.mjs +0 -36
  229. package/esm2020/let/let.module.mjs +0 -17
  230. package/esm2020/loading/loading.component.mjs +0 -26
  231. package/esm2020/loading/loading.module.mjs +0 -24
  232. package/esm2020/loading/loading.service.mjs +0 -90
  233. package/esm2020/lodop/lodop.module.mjs +0 -12
  234. package/esm2020/lodop/lodop.service.mjs +0 -222
  235. package/esm2020/media/media.component.mjs +0 -117
  236. package/esm2020/media/media.module.mjs +0 -19
  237. package/esm2020/media/media.service.mjs +0 -46
  238. package/esm2020/notice-icon/notice-icon-tab.component.mjs +0 -34
  239. package/esm2020/notice-icon/notice-icon.component.mjs +0 -89
  240. package/esm2020/notice-icon/notice-icon.module.mjs +0 -58
  241. package/esm2020/observers/observer-size.mjs +0 -116
  242. package/esm2020/onboarding/onboarding.component.mjs +0 -134
  243. package/esm2020/onboarding/onboarding.module.mjs +0 -27
  244. package/esm2020/onboarding/onboarding.service.mjs +0 -185
  245. package/esm2020/page-header/page-header.component.mjs +0 -246
  246. package/esm2020/page-header/page-header.module.mjs +0 -24
  247. package/esm2020/pdf/pdf.component.mjs +0 -473
  248. package/esm2020/pdf/pdf.module.mjs +0 -20
  249. package/esm2020/qr/qr.component.mjs +0 -136
  250. package/esm2020/qr/qr.module.mjs +0 -19
  251. package/esm2020/quick-menu/quick-menu.component.mjs +0 -89
  252. package/esm2020/quick-menu/quick-menu.module.mjs +0 -21
  253. package/esm2020/result/result.component.mjs +0 -60
  254. package/esm2020/result/result.module.mjs +0 -21
  255. package/esm2020/reuse-tab/reuse-tab-context-menu.component.mjs +0 -76
  256. package/esm2020/reuse-tab/reuse-tab-context.component.mjs +0 -33
  257. package/esm2020/reuse-tab/reuse-tab-context.directive.mjs +0 -35
  258. package/esm2020/reuse-tab/reuse-tab-context.service.mjs +0 -55
  259. package/esm2020/reuse-tab/reuse-tab.component.mjs +0 -367
  260. package/esm2020/reuse-tab/reuse-tab.module.mjs +0 -49
  261. package/esm2020/reuse-tab/reuse-tab.service.mjs +0 -558
  262. package/esm2020/se/se-container.component.mjs +0 -172
  263. package/esm2020/se/se.component.mjs +0 -234
  264. package/esm2020/se/se.module.mjs +0 -23
  265. package/esm2020/sg/sg-container.component.mjs +0 -52
  266. package/esm2020/sg/sg.component.mjs +0 -67
  267. package/esm2020/sg/sg.module.mjs +0 -20
  268. package/esm2020/st/st-column-source.mjs +0 -492
  269. package/esm2020/st/st-data-source.mjs +0 -479
  270. package/esm2020/st/st-export.mjs +0 -89
  271. package/esm2020/st/st-row.directive.mjs +0 -45
  272. package/esm2020/st/st-widget-host.directive.mjs +0 -31
  273. package/esm2020/st/st-widget.mjs +0 -26
  274. package/esm2020/st/st.component.mjs +0 -1002
  275. package/esm2020/st/st.module.mjs +0 -96
  276. package/esm2020/sv/sv-container.component.mjs +0 -125
  277. package/esm2020/sv/sv-value.component.mjs +0 -44
  278. package/esm2020/sv/sv.component.mjs +0 -119
  279. package/esm2020/sv/sv.module.mjs +0 -25
  280. package/esm2020/tag-select/tag-select.component.mjs +0 -63
  281. package/esm2020/tag-select/tag-select.module.mjs +0 -21
  282. package/esm2020/xlsx/xlsx.directive.mjs +0 -27
  283. package/esm2020/xlsx/xlsx.module.mjs +0 -19
  284. package/esm2020/xlsx/xlsx.service.mjs +0 -128
  285. package/esm2020/zip/zip.module.mjs +0 -15
  286. package/esm2020/zip/zip.service.mjs +0 -116
  287. package/fesm2015/avatar-list.mjs +0 -139
  288. package/fesm2015/avatar-list.mjs.map +0 -1
  289. package/fesm2015/chart-observer-size.mjs +0 -124
  290. package/fesm2015/chart-observer-size.mjs.map +0 -1
  291. package/fesm2015/count-down.mjs +0 -69
  292. package/fesm2015/count-down.mjs.map +0 -1
  293. package/fesm2015/date-picker.mjs +0 -236
  294. package/fesm2015/date-picker.mjs.map +0 -1
  295. package/fesm2015/down-file.mjs +0 -141
  296. package/fesm2015/down-file.mjs.map +0 -1
  297. package/fesm2015/ellipsis.mjs +0 -258
  298. package/fesm2015/ellipsis.mjs.map +0 -1
  299. package/fesm2015/error-collect.mjs +0 -147
  300. package/fesm2015/error-collect.mjs.map +0 -1
  301. package/fesm2015/exception.mjs +0 -138
  302. package/fesm2015/exception.mjs.map +0 -1
  303. package/fesm2015/footer-toolbar.mjs +0 -70
  304. package/fesm2015/footer-toolbar.mjs.map +0 -1
  305. package/fesm2015/full-content.mjs +0 -202
  306. package/fesm2015/full-content.mjs.map +0 -1
  307. package/fesm2015/global-footer.mjs +0 -126
  308. package/fesm2015/global-footer.mjs.map +0 -1
  309. package/fesm2015/hotkey.mjs +0 -57
  310. package/fesm2015/let.mjs +0 -59
  311. package/fesm2015/let.mjs.map +0 -1
  312. package/fesm2015/loading.mjs +0 -142
  313. package/fesm2015/loading.mjs.map +0 -1
  314. package/fesm2015/lodop.mjs +0 -232
  315. package/fesm2015/lodop.mjs.map +0 -1
  316. package/fesm2015/media.mjs +0 -180
  317. package/fesm2015/media.mjs.map +0 -1
  318. package/fesm2015/notice-icon.mjs +0 -180
  319. package/fesm2015/notice-icon.mjs.map +0 -1
  320. package/fesm2015/onboarding.mjs +0 -336
  321. package/fesm2015/onboarding.mjs.map +0 -1
  322. package/fesm2015/page-header.mjs +0 -276
  323. package/fesm2015/pdf.mjs +0 -516
  324. package/fesm2015/pdf.mjs.map +0 -1
  325. package/fesm2015/qr.mjs.map +0 -1
  326. package/fesm2015/quick-menu.mjs +0 -114
  327. package/fesm2015/quick-menu.mjs.map +0 -1
  328. package/fesm2015/result.mjs +0 -88
  329. package/fesm2015/result.mjs.map +0 -1
  330. package/fesm2015/reuse-tab.mjs +0 -1217
  331. package/fesm2015/se.mjs +0 -444
  332. package/fesm2015/se.mjs.map +0 -1
  333. package/fesm2015/sg.mjs +0 -139
  334. package/fesm2015/sg.mjs.map +0 -1
  335. package/fesm2015/st.mjs +0 -2526
  336. package/fesm2015/st.mjs.map +0 -1
  337. package/fesm2015/sv.mjs +0 -308
  338. package/fesm2015/sv.mjs.map +0 -1
  339. package/fesm2015/tag-select.mjs +0 -91
  340. package/fesm2015/tag-select.mjs.map +0 -1
  341. package/fesm2015/xlsx.mjs +0 -172
  342. package/fesm2015/xlsx.mjs.map +0 -1
  343. package/fesm2015/zip.mjs +0 -136
  344. package/fesm2020/abc.mjs +0 -7
  345. package/fesm2020/abc.mjs.map +0 -1
  346. package/fesm2020/auto-focus.mjs +0 -71
  347. package/fesm2020/auto-focus.mjs.map +0 -1
  348. package/fesm2020/avatar-list.mjs.map +0 -1
  349. package/fesm2020/chart-observer-size.mjs.map +0 -1
  350. package/fesm2020/count-down.mjs.map +0 -1
  351. package/fesm2020/date-picker.mjs.map +0 -1
  352. package/fesm2020/down-file.mjs.map +0 -1
  353. package/fesm2020/ellipsis.mjs.map +0 -1
  354. package/fesm2020/error-collect.mjs.map +0 -1
  355. package/fesm2020/exception.mjs.map +0 -1
  356. package/fesm2020/footer-toolbar.mjs.map +0 -1
  357. package/fesm2020/full-content.mjs.map +0 -1
  358. package/fesm2020/global-footer.mjs.map +0 -1
  359. package/fesm2020/hotkey.mjs.map +0 -1
  360. package/fesm2020/let.mjs.map +0 -1
  361. package/fesm2020/loading.mjs.map +0 -1
  362. package/fesm2020/media.mjs.map +0 -1
  363. package/fesm2020/notice-icon.mjs +0 -180
  364. package/fesm2020/notice-icon.mjs.map +0 -1
  365. package/fesm2020/page-header.mjs.map +0 -1
  366. package/fesm2020/pdf.mjs.map +0 -1
  367. package/fesm2020/qr.mjs +0 -171
  368. package/fesm2020/quick-menu.mjs.map +0 -1
  369. package/fesm2020/reuse-tab.mjs.map +0 -1
  370. package/fesm2020/se.mjs.map +0 -1
  371. package/fesm2020/sg.mjs.map +0 -1
  372. package/fesm2020/st.mjs.map +0 -1
  373. package/fesm2020/sv.mjs.map +0 -1
  374. package/fesm2020/tag-select.mjs.map +0 -1
  375. package/fesm2020/xlsx.mjs.map +0 -1
  376. package/fesm2020/zip.mjs.map +0 -1
  377. /package/{esm2020 → esm2022}/abc.mjs +0 -0
  378. /package/{esm2020 → esm2022}/auto-focus/auto-focus.mjs +0 -0
  379. /package/{esm2020 → esm2022}/auto-focus/index.mjs +0 -0
  380. /package/{esm2020 → esm2022}/avatar-list/avatar-list.mjs +0 -0
  381. /package/{esm2020 → esm2022}/avatar-list/public_api.mjs +0 -0
  382. /package/{esm2020 → esm2022}/count-down/count-down.mjs +0 -0
  383. /package/{esm2020 → esm2022}/count-down/public_api.mjs +0 -0
  384. /package/{esm2020 → esm2022}/date-picker/date-picker.mjs +0 -0
  385. /package/{esm2020 → esm2022}/date-picker/public_api.mjs +0 -0
  386. /package/{esm2020 → esm2022}/down-file/down-file.mjs +0 -0
  387. /package/{esm2020 → esm2022}/down-file/public_api.mjs +0 -0
  388. /package/{esm2020 → esm2022}/ellipsis/ellipsis.mjs +0 -0
  389. /package/{esm2020 → esm2022}/ellipsis/public_api.mjs +0 -0
  390. /package/{esm2020 → esm2022}/error-collect/error-collect.mjs +0 -0
  391. /package/{esm2020 → esm2022}/error-collect/public_api.mjs +0 -0
  392. /package/{esm2020 → esm2022}/exception/exception.mjs +0 -0
  393. /package/{esm2020 → esm2022}/exception/public_api.mjs +0 -0
  394. /package/{esm2020 → esm2022}/footer-toolbar/footer-toolbar.mjs +0 -0
  395. /package/{esm2020 → esm2022}/footer-toolbar/public_api.mjs +0 -0
  396. /package/{esm2020 → esm2022}/full-content/full-content.mjs +0 -0
  397. /package/{esm2020 → esm2022}/full-content/public_api.mjs +0 -0
  398. /package/{esm2020 → esm2022}/global-footer/global-footer.mjs +0 -0
  399. /package/{esm2020 → esm2022}/global-footer/global-footer.types.mjs +0 -0
  400. /package/{esm2020 → esm2022}/global-footer/public_api.mjs +0 -0
  401. /package/{esm2020 → esm2022}/hotkey/hotkey.mjs +0 -0
  402. /package/{esm2020 → esm2022}/hotkey/public_api.mjs +0 -0
  403. /package/{esm2020 → esm2022}/let/index.mjs +0 -0
  404. /package/{esm2020 → esm2022}/let/let.mjs +0 -0
  405. /package/{esm2020 → esm2022}/loading/loading.mjs +0 -0
  406. /package/{esm2020 → esm2022}/loading/loading.types.mjs +0 -0
  407. /package/{esm2020 → esm2022}/loading/public_api.mjs +0 -0
  408. /package/{esm2020 → esm2022}/lodop/lodop.mjs +0 -0
  409. /package/{esm2020 → esm2022}/lodop/lodop.types.mjs +0 -0
  410. /package/{esm2020 → esm2022}/lodop/public_api.mjs +0 -0
  411. /package/{esm2020 → esm2022}/media/media.mjs +0 -0
  412. /package/{esm2020 → esm2022}/media/public_api.mjs +0 -0
  413. /package/{esm2020 → esm2022}/notice-icon/notice-icon.mjs +0 -0
  414. /package/{esm2020 → esm2022}/notice-icon/notice-icon.types.mjs +0 -0
  415. /package/{esm2020 → esm2022}/notice-icon/public_api.mjs +0 -0
  416. /package/{esm2020 → esm2022}/observers/chart-observer-size.mjs +0 -0
  417. /package/{esm2020 → esm2022}/observers/public-api.mjs +0 -0
  418. /package/{esm2020 → esm2022}/onboarding/onboarding.mjs +0 -0
  419. /package/{esm2020 → esm2022}/onboarding/onboarding.types.mjs +0 -0
  420. /package/{esm2020 → esm2022}/onboarding/public_api.mjs +0 -0
  421. /package/{esm2020 → esm2022}/page-header/page-header.mjs +0 -0
  422. /package/{esm2020 → esm2022}/page-header/public_api.mjs +0 -0
  423. /package/{esm2020 → esm2022}/pdf/pdf.mjs +0 -0
  424. /package/{esm2020 → esm2022}/pdf/pdf.types.mjs +0 -0
  425. /package/{esm2020 → esm2022}/pdf/public_api.mjs +0 -0
  426. /package/{esm2020 → esm2022}/public_api.mjs +0 -0
  427. /package/{esm2020 → esm2022}/qr/public_api.mjs +0 -0
  428. /package/{esm2020 → esm2022}/qr/qr.config.mjs +0 -0
  429. /package/{esm2020 → esm2022}/qr/qr.mjs +0 -0
  430. /package/{esm2020 → esm2022}/qr/qr.types.mjs +0 -0
  431. /package/{esm2020 → esm2022}/quick-menu/public_api.mjs +0 -0
  432. /package/{esm2020 → esm2022}/quick-menu/quick-menu.mjs +0 -0
  433. /package/{esm2020 → esm2022}/result/public_api.mjs +0 -0
  434. /package/{esm2020 → esm2022}/result/result.mjs +0 -0
  435. /package/{esm2020 → esm2022}/reuse-tab/lifecycle_hooks.mjs +0 -0
  436. /package/{esm2020 → esm2022}/reuse-tab/public_api.mjs +0 -0
  437. /package/{esm2020 → esm2022}/reuse-tab/reuse-tab.interfaces.mjs +0 -0
  438. /package/{esm2020 → esm2022}/reuse-tab/reuse-tab.mjs +0 -0
  439. /package/{esm2020 → esm2022}/reuse-tab/reuse-tab.state.mjs +0 -0
  440. /package/{esm2020 → esm2022}/reuse-tab/reuse-tab.strategy.mjs +0 -0
  441. /package/{esm2020 → esm2022}/se/public_api.mjs +0 -0
  442. /package/{esm2020 → esm2022}/se/se.mjs +0 -0
  443. /package/{esm2020 → esm2022}/se/se.types.mjs +0 -0
  444. /package/{esm2020 → esm2022}/sg/public_api.mjs +0 -0
  445. /package/{esm2020 → esm2022}/sg/sg.mjs +0 -0
  446. /package/{esm2020 → esm2022}/st/public_api.mjs +0 -0
  447. /package/{esm2020 → esm2022}/st/st.config.mjs +0 -0
  448. /package/{esm2020 → esm2022}/st/st.interfaces.mjs +0 -0
  449. /package/{esm2020 → esm2022}/st/st.mjs +0 -0
  450. /package/{esm2020 → esm2022}/st/st.types.mjs +0 -0
  451. /package/{esm2020 → esm2022}/sv/public_api.mjs +0 -0
  452. /package/{esm2020 → esm2022}/sv/sv.mjs +0 -0
  453. /package/{esm2020 → esm2022}/tag-select/public_api.mjs +0 -0
  454. /package/{esm2020 → esm2022}/tag-select/tag-select.mjs +0 -0
  455. /package/{esm2020 → esm2022}/xlsx/public_api.mjs +0 -0
  456. /package/{esm2020 → esm2022}/xlsx/xlsx.mjs +0 -0
  457. /package/{esm2020 → esm2022}/xlsx/xlsx.types.mjs +0 -0
  458. /package/{esm2020 → esm2022}/zip/public_api.mjs +0 -0
  459. /package/{esm2020 → esm2022}/zip/zip.mjs +0 -0
  460. /package/{esm2020 → esm2022}/zip/zip.types.mjs +0 -0
  461. /package/{fesm2015 → fesm2022}/abc.mjs +0 -0
  462. /package/{fesm2015 → fesm2022}/abc.mjs.map +0 -0
@@ -0,0 +1,559 @@
1
+ import { Inject, Injectable, Optional } from '@angular/core';
2
+ import { ActivatedRoute, NavigationEnd, NavigationStart, Router, ROUTER_CONFIGURATION } from '@angular/router';
3
+ import { BehaviorSubject, timer } from 'rxjs';
4
+ import { ScrollService } from '@delon/util/browser';
5
+ import { ReuseTabMatchMode } from './reuse-tab.interfaces';
6
+ import { REUSE_TAB_STORAGE_KEY, REUSE_TAB_STORAGE_STATE } from './reuse-tab.state';
7
+ import * as i0 from "@angular/core";
8
+ import * as i1 from "@delon/theme";
9
+ class ReuseTabService {
10
+ get snapshot() {
11
+ return this.injector.get(ActivatedRoute).snapshot;
12
+ }
13
+ // #region public
14
+ /**
15
+ * Get init status
16
+ *
17
+ * 是否已经初始化完成
18
+ */
19
+ get inited() {
20
+ return this._inited;
21
+ }
22
+ /**
23
+ * Current routing address
24
+ *
25
+ * 当前路由地址
26
+ */
27
+ get curUrl() {
28
+ return this.getUrl(this.snapshot);
29
+ }
30
+ /**
31
+ * 允许最多复用多少个页面,取值范围 `2-100`,值发生变更时会强制关闭且忽略可关闭条件
32
+ */
33
+ set max(value) {
34
+ this._max = Math.min(Math.max(value, 2), 100);
35
+ for (let i = this._cached.length; i > this._max; i--) {
36
+ this._cached.pop();
37
+ }
38
+ }
39
+ set keepingScroll(value) {
40
+ this._keepingScroll = value;
41
+ this.initScroll();
42
+ }
43
+ get keepingScroll() {
44
+ return this._keepingScroll;
45
+ }
46
+ /** 获取已缓存的路由 */
47
+ get items() {
48
+ return this._cached;
49
+ }
50
+ /** 获取当前缓存的路由总数 */
51
+ get count() {
52
+ return this._cached.length;
53
+ }
54
+ /** 订阅缓存变更通知 */
55
+ get change() {
56
+ return this._cachedChange.asObservable(); // .pipe(filter(w => w !== null));
57
+ }
58
+ /** 自定义当前标题 */
59
+ set title(value) {
60
+ const url = this.curUrl;
61
+ if (typeof value === 'string')
62
+ value = { text: value };
63
+ this._titleCached[url] = value;
64
+ this.di('update current tag title: ', value);
65
+ this._cachedChange.next({
66
+ active: 'title',
67
+ url,
68
+ title: value,
69
+ list: this._cached
70
+ });
71
+ }
72
+ /** 获取指定路径缓存所在位置,`-1` 表示无缓存 */
73
+ index(url) {
74
+ return this._cached.findIndex(w => w.url === url);
75
+ }
76
+ /** 获取指定路径缓存是否存在 */
77
+ exists(url) {
78
+ return this.index(url) !== -1;
79
+ }
80
+ /** 获取指定路径缓存 */
81
+ get(url) {
82
+ return url ? this._cached.find(w => w.url === url) || null : null;
83
+ }
84
+ remove(url, includeNonCloseable) {
85
+ const idx = typeof url === 'string' ? this.index(url) : url;
86
+ const item = idx !== -1 ? this._cached[idx] : null;
87
+ if (!item || (!includeNonCloseable && !item.closable))
88
+ return false;
89
+ this.destroy(item._handle);
90
+ this._cached.splice(idx, 1);
91
+ delete this._titleCached[url];
92
+ return true;
93
+ }
94
+ /**
95
+ * 根据URL移除标签
96
+ *
97
+ * @param [includeNonCloseable=false] 是否强制包含不可关闭
98
+ */
99
+ close(url, includeNonCloseable = false) {
100
+ this.removeUrlBuffer = url;
101
+ this.remove(url, includeNonCloseable);
102
+ this._cachedChange.next({ active: 'close', url, list: this._cached });
103
+ this.di('close tag', url);
104
+ return true;
105
+ }
106
+ /**
107
+ * 清除右边
108
+ *
109
+ * @param [includeNonCloseable=false] 是否强制包含不可关闭
110
+ */
111
+ closeRight(url, includeNonCloseable = false) {
112
+ const start = this.index(url);
113
+ for (let i = this.count - 1; i > start; i--) {
114
+ this.remove(i, includeNonCloseable);
115
+ }
116
+ this.removeUrlBuffer = null;
117
+ this._cachedChange.next({ active: 'closeRight', url, list: this._cached });
118
+ this.di('close right tages', url);
119
+ return true;
120
+ }
121
+ /**
122
+ * 清除所有缓存
123
+ *
124
+ * @param [includeNonCloseable=false] 是否强制包含不可关闭
125
+ */
126
+ clear(includeNonCloseable = false) {
127
+ this._cached.forEach(w => {
128
+ if (!includeNonCloseable && w.closable)
129
+ this.destroy(w._handle);
130
+ });
131
+ this._cached = this._cached.filter(w => !includeNonCloseable && !w.closable);
132
+ this.removeUrlBuffer = null;
133
+ this._cachedChange.next({ active: 'clear', list: this._cached });
134
+ this.di('clear all catch');
135
+ }
136
+ /**
137
+ * 移动缓存数据
138
+ *
139
+ * @param url 要移动的URL地址
140
+ * @param position 新位置,下标从 `0` 开始
141
+ *
142
+ * @example
143
+ * ```
144
+ * // source
145
+ * [ '/a/1', '/a/2', '/a/3', '/a/4', '/a/5' ]
146
+ * move('/a/1', 2);
147
+ * // output
148
+ * [ '/a/2', '/a/3', '/a/1', '/a/4', '/a/5' ]
149
+ * move('/a/1', -1);
150
+ * // output
151
+ * [ '/a/2', '/a/3', '/a/4', '/a/5', '/a/1' ]
152
+ * ```
153
+ */
154
+ move(url, position) {
155
+ const start = this._cached.findIndex(w => w.url === url);
156
+ if (start === -1)
157
+ return;
158
+ const data = this._cached.slice();
159
+ data.splice(position < 0 ? data.length + position : position, 0, data.splice(start, 1)[0]);
160
+ this._cached = data;
161
+ this._cachedChange.next({
162
+ active: 'move',
163
+ url,
164
+ position,
165
+ list: this._cached
166
+ });
167
+ }
168
+ /**
169
+ * 强制关闭当前路由(包含不可关闭状态),并重新导航至 `newUrl` 路由
170
+ */
171
+ replace(newUrl) {
172
+ const url = this.curUrl;
173
+ if (this.exists(url)) {
174
+ this.close(url, true);
175
+ }
176
+ else {
177
+ this.removeUrlBuffer = url;
178
+ }
179
+ this.injector.get(Router).navigateByUrl(newUrl);
180
+ }
181
+ /**
182
+ * 获取标题,顺序如下:
183
+ *
184
+ * 1. 组件内使用 `ReuseTabService.title = 'new title'` 重新指定文本
185
+ * 2. 路由配置中 data 属性中包含 titleI18n > title
186
+ * 3. 菜单数据中 text 属性
187
+ *
188
+ * @param url 指定URL
189
+ * @param route 指定路由快照
190
+ */
191
+ getTitle(url, route) {
192
+ if (this._titleCached[url]) {
193
+ return this._titleCached[url];
194
+ }
195
+ if (route && route.data && (route.data.titleI18n || route.data.title)) {
196
+ return {
197
+ text: route.data.title,
198
+ i18n: route.data.titleI18n
199
+ };
200
+ }
201
+ const menu = this.getMenu(url);
202
+ return menu ? { text: menu.text, i18n: menu.i18n } : { text: url };
203
+ }
204
+ /**
205
+ * 清除标题缓存
206
+ */
207
+ clearTitleCached() {
208
+ this._titleCached = {};
209
+ }
210
+ /** 自定义当前 `closable` 状态 */
211
+ set closable(value) {
212
+ const url = this.curUrl;
213
+ this._closableCached[url] = value;
214
+ this.di('update current tag closable: ', value);
215
+ this._cachedChange.next({
216
+ active: 'closable',
217
+ closable: value,
218
+ list: this._cached
219
+ });
220
+ }
221
+ /**
222
+ * 获取 `closable` 状态,顺序如下:
223
+ *
224
+ * 1. 组件内使用 `ReuseTabService.closable = true` 重新指定 `closable` 状态
225
+ * 2. 路由配置中 data 属性中包含 `reuseClosable`
226
+ * 3. 菜单数据中 `reuseClosable` 属性
227
+ *
228
+ * @param url 指定URL
229
+ * @param route 指定路由快照
230
+ */
231
+ getClosable(url, route) {
232
+ if (typeof this._closableCached[url] !== 'undefined')
233
+ return this._closableCached[url];
234
+ if (route && route.data && typeof route.data.reuseClosable === 'boolean')
235
+ return route.data.reuseClosable;
236
+ const menu = this.mode !== ReuseTabMatchMode.URL ? this.getMenu(url) : null;
237
+ if (menu && typeof menu.reuseClosable === 'boolean')
238
+ return menu.reuseClosable;
239
+ return true;
240
+ }
241
+ /**
242
+ * 清空 `closable` 缓存
243
+ */
244
+ clearClosableCached() {
245
+ this._closableCached = {};
246
+ }
247
+ getTruthRoute(route) {
248
+ let next = route;
249
+ while (next.firstChild)
250
+ next = next.firstChild;
251
+ return next;
252
+ }
253
+ /**
254
+ * 根据快照获取URL地址
255
+ */
256
+ getUrl(route) {
257
+ let next = this.getTruthRoute(route);
258
+ const segments = [];
259
+ while (next) {
260
+ segments.push(next.url.join('/'));
261
+ next = next.parent;
262
+ }
263
+ const url = `/${segments
264
+ .filter(i => i)
265
+ .reverse()
266
+ .join('/')}`;
267
+ return url;
268
+ }
269
+ /**
270
+ * 检查快照是否允许被复用
271
+ */
272
+ can(route) {
273
+ const url = this.getUrl(route);
274
+ if (url === this.removeUrlBuffer)
275
+ return false;
276
+ if (route.data && typeof route.data.reuse === 'boolean')
277
+ return route.data.reuse;
278
+ if (this.mode !== ReuseTabMatchMode.URL) {
279
+ const menu = this.getMenu(url);
280
+ if (!menu)
281
+ return false;
282
+ if (this.mode === ReuseTabMatchMode.Menu) {
283
+ if (menu.reuse === false)
284
+ return false;
285
+ }
286
+ else {
287
+ if (!menu.reuse || menu.reuse !== true)
288
+ return false;
289
+ }
290
+ return true;
291
+ }
292
+ return !this.isExclude(url);
293
+ }
294
+ isExclude(url) {
295
+ return this.excludes.findIndex(r => r.test(url)) !== -1;
296
+ }
297
+ /**
298
+ * 刷新,触发一个 refresh 类型事件
299
+ */
300
+ refresh(data) {
301
+ this._cachedChange.next({ active: 'refresh', data });
302
+ }
303
+ // #endregion
304
+ // #region privates
305
+ destroy(_handle) {
306
+ if (_handle && _handle.componentRef && _handle.componentRef.destroy)
307
+ _handle.componentRef.destroy();
308
+ }
309
+ di(...args) {
310
+ if (typeof ngDevMode === 'undefined' || ngDevMode) {
311
+ if (!this.debug)
312
+ return;
313
+ console.warn(...args);
314
+ }
315
+ }
316
+ // #endregion
317
+ constructor(injector, menuService, stateKey, stateSrv) {
318
+ this.injector = injector;
319
+ this.menuService = menuService;
320
+ this.stateKey = stateKey;
321
+ this.stateSrv = stateSrv;
322
+ this._inited = false;
323
+ this._max = 10;
324
+ this._keepingScroll = false;
325
+ this._cachedChange = new BehaviorSubject(null);
326
+ this._cached = [];
327
+ this._titleCached = {};
328
+ this._closableCached = {};
329
+ this.removeUrlBuffer = null;
330
+ this.positionBuffer = {};
331
+ this.debug = false;
332
+ this.routeParamMatchMode = 'strict';
333
+ this.mode = ReuseTabMatchMode.Menu;
334
+ /** 排除规则,限 `mode=URL` */
335
+ this.excludes = [];
336
+ this.storageState = false;
337
+ }
338
+ init() {
339
+ this.initScroll();
340
+ this._inited = true;
341
+ this.loadState();
342
+ }
343
+ loadState() {
344
+ if (!this.storageState)
345
+ return;
346
+ this._cached = this.stateSrv.get(this.stateKey).map(v => ({
347
+ title: { text: v.title },
348
+ url: v.url,
349
+ position: v.position
350
+ }));
351
+ this._cachedChange.next({ active: 'loadState' });
352
+ }
353
+ getMenu(url) {
354
+ const menus = this.menuService.getPathByUrl(url);
355
+ if (!menus || menus.length === 0)
356
+ return null;
357
+ return menus.pop();
358
+ }
359
+ runHook(method, comp, type = 'init') {
360
+ if (typeof comp === 'number') {
361
+ const item = this._cached[comp];
362
+ comp = item._handle?.componentRef;
363
+ }
364
+ if (comp == null || !comp.instance) {
365
+ return;
366
+ }
367
+ const compThis = comp.instance;
368
+ const fn = compThis[method];
369
+ if (typeof fn !== 'function') {
370
+ return;
371
+ }
372
+ if (method === '_onReuseInit') {
373
+ fn.call(compThis, type);
374
+ }
375
+ else {
376
+ fn.call(compThis);
377
+ }
378
+ }
379
+ hasInValidRoute(route) {
380
+ return !route.routeConfig || !!route.routeConfig.loadChildren || !!route.routeConfig.children;
381
+ }
382
+ /**
383
+ * 决定是否允许路由复用,若 `true` 会触发 `store`
384
+ */
385
+ shouldDetach(route) {
386
+ if (this.hasInValidRoute(route))
387
+ return false;
388
+ this.di('#shouldDetach', this.can(route), this.getUrl(route));
389
+ return this.can(route);
390
+ }
391
+ /**
392
+ * 存储
393
+ */
394
+ store(_snapshot, _handle) {
395
+ const url = this.getUrl(_snapshot);
396
+ const idx = this.index(url);
397
+ const isAdd = idx === -1;
398
+ const item = {
399
+ title: this.getTitle(url, _snapshot),
400
+ closable: this.getClosable(url, _snapshot),
401
+ position: this.getKeepingScroll(url, _snapshot) ? this.positionBuffer[url] : null,
402
+ url,
403
+ _snapshot,
404
+ _handle
405
+ };
406
+ if (isAdd) {
407
+ if (this.count >= this._max) {
408
+ // Get the oldest closable location
409
+ const closeIdx = this._cached.findIndex(w => w.closable);
410
+ if (closeIdx !== -1)
411
+ this.remove(closeIdx, false);
412
+ }
413
+ this._cached.push(item);
414
+ }
415
+ else {
416
+ // Current handler is null when activate routes
417
+ // For better reliability, we need to wait for the component to be attached before call _onReuseInit
418
+ const cahcedComponentRef = this._cached[idx]._handle?.componentRef;
419
+ if (_handle == null && cahcedComponentRef != null) {
420
+ timer(100).subscribe(() => this.runHook('_onReuseInit', cahcedComponentRef));
421
+ }
422
+ this._cached[idx] = item;
423
+ }
424
+ this.removeUrlBuffer = null;
425
+ this.di('#store', isAdd ? '[new]' : '[override]', url);
426
+ if (_handle && _handle.componentRef) {
427
+ this.runHook('_onReuseDestroy', _handle.componentRef);
428
+ }
429
+ if (!isAdd) {
430
+ this._cachedChange.next({ active: 'override', item, list: this._cached });
431
+ }
432
+ }
433
+ /**
434
+ * 决定是否允许应用缓存数据
435
+ */
436
+ shouldAttach(route) {
437
+ if (this.hasInValidRoute(route))
438
+ return false;
439
+ const url = this.getUrl(route);
440
+ const data = this.get(url);
441
+ const ret = !!(data && data._handle);
442
+ this.di('#shouldAttach', ret, url);
443
+ if (!ret) {
444
+ this._cachedChange.next({ active: 'add', url, list: this._cached });
445
+ }
446
+ return ret;
447
+ }
448
+ /**
449
+ * 提取复用数据
450
+ */
451
+ retrieve(route) {
452
+ if (this.hasInValidRoute(route))
453
+ return null;
454
+ const url = this.getUrl(route);
455
+ const data = this.get(url);
456
+ const ret = (data && data._handle) || null;
457
+ this.di('#retrieve', url, ret);
458
+ return ret;
459
+ }
460
+ /**
461
+ * 决定是否应该进行复用路由处理
462
+ */
463
+ shouldReuseRoute(future, curr) {
464
+ let ret = future.routeConfig === curr.routeConfig;
465
+ if (!ret)
466
+ return false;
467
+ const path = ((future.routeConfig && future.routeConfig.path) || '');
468
+ if (path.length > 0 && ~path.indexOf(':')) {
469
+ if (this.routeParamMatchMode === 'strict') {
470
+ ret = this.getUrl(future) === this.getUrl(curr);
471
+ }
472
+ else {
473
+ ret = path === ((curr.routeConfig && curr.routeConfig.path) || '');
474
+ }
475
+ }
476
+ this.di('=====================');
477
+ this.di('#shouldReuseRoute', ret, `${this.getUrl(curr)}=>${this.getUrl(future)}`, future, curr);
478
+ return ret;
479
+ }
480
+ // #region scroll
481
+ /**
482
+ * 获取 `keepingScroll` 状态,顺序如下:
483
+ *
484
+ * 1. 路由配置中 data 属性中包含 `keepingScroll`
485
+ * 2. 菜单数据中 `keepingScroll` 属性
486
+ * 3. 组件 `keepingScroll` 值
487
+ */
488
+ getKeepingScroll(url, route) {
489
+ if (route && route.data && typeof route.data.keepingScroll === 'boolean')
490
+ return route.data.keepingScroll;
491
+ const menu = this.mode !== ReuseTabMatchMode.URL ? this.getMenu(url) : null;
492
+ if (menu && typeof menu.keepingScroll === 'boolean')
493
+ return menu.keepingScroll;
494
+ return this.keepingScroll;
495
+ }
496
+ get isDisabledInRouter() {
497
+ const routerConfig = this.injector.get(ROUTER_CONFIGURATION, {});
498
+ return routerConfig.scrollPositionRestoration === 'disabled';
499
+ }
500
+ get ss() {
501
+ return this.injector.get(ScrollService);
502
+ }
503
+ initScroll() {
504
+ if (this._router$) {
505
+ this._router$.unsubscribe();
506
+ }
507
+ this._router$ = this.injector.get(Router).events.subscribe(e => {
508
+ if (e instanceof NavigationStart) {
509
+ const url = this.curUrl;
510
+ if (this.getKeepingScroll(url, this.getTruthRoute(this.snapshot))) {
511
+ this.positionBuffer[url] = this.ss.getScrollPosition(this.keepingScrollContainer);
512
+ }
513
+ else {
514
+ delete this.positionBuffer[url];
515
+ }
516
+ }
517
+ else if (e instanceof NavigationEnd) {
518
+ const url = this.curUrl;
519
+ const item = this.get(url);
520
+ if (item && item.position && this.getKeepingScroll(url, this.getTruthRoute(this.snapshot))) {
521
+ if (this.isDisabledInRouter) {
522
+ this.ss.scrollToPosition(this.keepingScrollContainer, item.position);
523
+ }
524
+ else {
525
+ setTimeout(() => this.ss.scrollToPosition(this.keepingScrollContainer, item.position), 1);
526
+ }
527
+ }
528
+ }
529
+ });
530
+ }
531
+ // #endregion
532
+ ngOnDestroy() {
533
+ const { _cachedChange, _router$ } = this;
534
+ this.clear();
535
+ this._cached = [];
536
+ _cachedChange.complete();
537
+ if (_router$) {
538
+ _router$.unsubscribe();
539
+ }
540
+ }
541
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.0.4", ngImport: i0, type: ReuseTabService, deps: [{ token: i0.Injector }, { token: i1.MenuService }, { token: REUSE_TAB_STORAGE_KEY, optional: true }, { token: REUSE_TAB_STORAGE_STATE, optional: true }], target: i0.ɵɵFactoryTarget.Injectable }); }
542
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.0.4", ngImport: i0, type: ReuseTabService, providedIn: 'root' }); }
543
+ }
544
+ export { ReuseTabService };
545
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.0.4", ngImport: i0, type: ReuseTabService, decorators: [{
546
+ type: Injectable,
547
+ args: [{ providedIn: 'root' }]
548
+ }], ctorParameters: function () { return [{ type: i0.Injector }, { type: i1.MenuService }, { type: undefined, decorators: [{
549
+ type: Optional
550
+ }, {
551
+ type: Inject,
552
+ args: [REUSE_TAB_STORAGE_KEY]
553
+ }] }, { type: undefined, decorators: [{
554
+ type: Optional
555
+ }, {
556
+ type: Inject,
557
+ args: [REUSE_TAB_STORAGE_STATE]
558
+ }] }]; } });
559
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmV1c2UtdGFiLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9hYmMvcmV1c2UtdGFiL3JldXNlLXRhYi5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUF1QixRQUFRLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDbEYsT0FBTyxFQUNMLGNBQWMsRUFHZCxhQUFhLEVBQ2IsZUFBZSxFQUNmLE1BQU0sRUFDTixvQkFBb0IsRUFDckIsTUFBTSxpQkFBaUIsQ0FBQztBQUN6QixPQUFPLEVBQUUsZUFBZSxFQUFjLEtBQUssRUFBa0IsTUFBTSxNQUFNLENBQUM7QUFHMUUsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBR3BELE9BQU8sRUFLTCxpQkFBaUIsRUFJbEIsTUFBTSx3QkFBd0IsQ0FBQztBQUNoQyxPQUFPLEVBQXdCLHFCQUFxQixFQUFFLHVCQUF1QixFQUFFLE1BQU0sbUJBQW1CLENBQUM7OztBQUV6RyxNQUNhLGVBQWU7SUFtQjFCLElBQVksUUFBUTtRQUNsQixPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLGNBQWMsQ0FBQyxDQUFDLFFBQVEsQ0FBQztJQUNwRCxDQUFDO0lBRUQsaUJBQWlCO0lBRWpCOzs7O09BSUc7SUFDSCxJQUFJLE1BQU07UUFDUixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUM7SUFDdEIsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxJQUFJLE1BQU07UUFDUixPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ3BDLENBQUM7SUFFRDs7T0FFRztJQUNILElBQUksR0FBRyxDQUFDLEtBQWE7UUFDbkIsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFF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QUFJLE1BQU07MkJBQUMsdUJBQXVCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0LCBJbmplY3RhYmxlLCBJbmplY3RvciwgT25EZXN0cm95LCBPcHRpb25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcbiAgQWN0aXZhdGVkUm91dGUsXG4gIEFjdGl2YXRlZFJvdXRlU25hcHNob3QsXG4gIEV4dHJhT3B0aW9ucyxcbiAgTmF2aWdhdGlvbkVuZCxcbiAgTmF2aWdhdGlvblN0YXJ0LFxuICBSb3V0ZXIsXG4gIFJPVVRFUl9DT05GSUdVUkFUSU9OXG59IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIE9ic2VydmFibGUsIHRpbWVyLCBVbnN1YnNjcmliYWJsZSB9IGZyb20gJ3J4anMnO1xuXG5pbXBvcnQgeyBNZW51LCBNZW51U2VydmljZSB9IGZyb20gJ0BkZWxvbi90aGVtZSc7XG5pbXBvcnQgeyBTY3JvbGxTZXJ2aWNlIH0gZnJvbSAnQGRlbG9uL3V0aWwvYnJvd3Nlcic7XG5pbXBvcnQgdHlwZSB7IE56U2FmZUFueSB9IGZyb20gJ25nLXpvcnJvLWFudGQvY29yZS90eXBlcyc7XG5cbmltcG9ydCB7XG4gIFJldXNlQ29tcG9uZW50UmVmLFxuICBSZXVzZUhvb2tPblJldXNlSW5pdFR5cGUsXG4gIFJldXNlSG9va1R5cGVzLFxuICBSZXVzZVRhYkNhY2hlZCxcbiAgUmV1c2VUYWJNYXRjaE1vZGUsXG4gIFJldXNlVGFiTm90aWZ5LFxuICBSZXVzZVRhYlJvdXRlUGFyYW1NYXRjaE1vZGUsXG4gIFJldXNlVGl0bGVcbn0gZnJvbSAnLi9yZXVzZS10YWIuaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBSZXVzZVRhYlN0b3JhZ2VTdGF0ZSwgUkVVU0VfVEFCX1NUT1JBR0VfS0VZLCBSRVVTRV9UQUJfU1RPUkFHRV9TVEFURSB9IGZyb20gJy4vcmV1c2UtdGFiLnN0YXRlJztcblxuQEluamVjdGFibGUoeyBwcm92aWRlZEluOiAncm9vdCcgfSlcbmV4cG9ydCBjbGFzcyBSZXVzZVRhYlNlcnZpY2UgaW1wbGVtZW50cyBPbkRlc3Ryb3kge1xuICBwcml2YXRlIF9pbml0ZWQgPSBmYWxzZTtcbiAgcHJpdmF0ZSBfbWF4ID0gMTA7XG4gIHByaXZhdGUgX2tlZXBpbmdTY3JvbGwgPSBmYWxzZTtcbiAgcHJpdmF0ZSBfY2FjaGVkQ2hhbmdlID0gbmV3IEJlaGF2aW9yU3ViamVjdDxSZXVzZVRhYk5vdGlmeSB8IG51bGw+KG51bGwpO1xuICBwcml2YXRlIF9jYWNoZWQ6IFJldXNlVGFiQ2FjaGVkW10gPSBbXTtcbiAgcHJpdmF0ZSBfdGl0bGVDYWNoZWQ6IHsgW3VybDogc3RyaW5nXTogUmV1c2VUaXRsZSB9ID0ge307XG4gIHByaXZhdGUgX2Nsb3NhYmxlQ2FjaGVkOiB7IFt1cmw6IHN0cmluZ106IGJvb2xlYW4gfSA9IHt9O1xuICBwcml2YXRlIF9yb3V0ZXIkPzogVW5zdWJzY3JpYmFibGU7XG4gIHByaXZhdGUgcmVtb3ZlVXJsQnVmZmVyOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBwb3NpdGlvbkJ1ZmZlcjogeyBbdXJsOiBzdHJpbmddOiBbbnVtYmVyLCBudW1iZXJdIH0gPSB7fTtcbiAgY29tcG9uZW50UmVmPzogUmV1c2VDb21wb25lbnRSZWY7XG4gIGRlYnVnID0gZmFsc2U7XG4gIHJvdXRlUGFyYW1NYXRjaE1vZGU6IFJldXNlVGFiUm91dGVQYXJhbU1hdGNoTW9kZSA9ICdzdHJpY3QnO1xuICBtb2RlID0gUmV1c2VUYWJNYXRjaE1vZGUuTWVudTtcbiAgLyoqIOaOkumZpOinhOWIme+8jOmZkCBgbW9kZT1VUkxgICovXG4gIGV4Y2x1ZGVzOiBSZWdFeHBbXSA9IFtdO1xuICBzdG9yYWdlU3RhdGUgPSBmYWxzZTtcblxuICBwcml2YXRlIGdldCBzbmFwc2hvdCgpOiBBY3RpdmF0ZWRSb3V0ZVNuYXBzaG90IHtcbiAgICByZXR1cm4gdGhpcy5pbmplY3Rvci5nZXQoQWN0aXZhdGVkUm91dGUpLnNuYXBzaG90O1xuICB9XG5cbiAgLy8gI3JlZ2lvbiBwdWJsaWNcblxuICAvKipcbiAgICogR2V0IGluaXQgc3RhdHVzXG4gICAqXG4gICAqIOaYr+WQpuW3sue7j+WIneWni+WMluWujOaIkFxuICAgKi9cbiAgZ2V0IGluaXRlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5faW5pdGVkO1xuICB9XG5cbiAgLyoqXG4gICAqIEN1cnJlbnQgcm91dGluZyBhZGRyZXNzXG4gICAqXG4gICAqIOW9k+WJjei3r+eUseWcsOWdgFxuICAgKi9cbiAgZ2V0IGN1clVybCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFVybCh0aGlzLnNuYXBzaG90KTtcbiAgfVxuXG4gIC8qKlxuICAgKiDlhYHorrjmnIDlpJrlpI3nlKjlpJrlsJHkuKrpobXpnaLvvIzlj5blgLzojIPlm7QgYDItMTAwYO+8jOWAvOWPkeeUn+WPmOabtOaXtuS8muW8uuWItuWFs+mXreS4lOW/veeVpeWPr+WFs+mXreadoeS7tlxuICAgKi9cbiAgc2V0IG1heCh2YWx1ZTogbnVtYmVyKSB7XG4gICAgdGhpcy5fbWF4ID0gTWF0aC5taW4oTWF0aC5tYXgodmFsdWUsIDIpLCAxMDApO1xuICAgIGZvciAobGV0IGkgPSB0aGlzLl9jYWNoZWQubGVuZ3RoOyBpID4gdGhpcy5fbWF4OyBpLS0pIHtcbiAgICAgIHRoaXMuX2NhY2hlZC5wb3AoKTtcbiAgICB9XG4gIH1cbiAgc2V0IGtlZXBpbmdTY3JvbGwodmFsdWU6IGJvb2xlYW4pIHtcbiAgICB0aGlzLl9rZWVwaW5nU2Nyb2xsID0gdmFsdWU7XG4gICAgdGhpcy5pbml0U2Nyb2xsKCk7XG4gIH1cbiAgZ2V0IGtlZXBpbmdTY3JvbGwoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2tlZXBpbmdTY3JvbGw7XG4gIH1cbiAga2VlcGluZ1Njcm9sbENvbnRhaW5lcj86IEVsZW1lbnQ7XG4gIC8qKiDojrflj5blt7LnvJPlrZjnmoTot6/nlLEgKi9cbiAgZ2V0IGl0ZW1zKCk6IFJldXNlVGFiQ2FjaGVkW10ge1xuICAgIHJldHVybiB0aGlzLl9jYWNoZWQ7XG4gIH1cbiAgLyoqIOiOt+WPluW9k+WJjee8k+WtmOeahOi3r+eUseaAu+aVsCAqL1xuICBnZXQgY291bnQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fY2FjaGVkLmxlbmd0aDtcbiAgfVxuICAvKiog6K6i6ZiF57yT5a2Y5Y+Y5pu06YCa55+lICovXG4gIGdldCBjaGFuZ2UoKTogT2JzZXJ2YWJsZTxSZXVzZVRhYk5vdGlmeSB8IG51bGw+IHtcbiAgICByZXR1cm4gdGhpcy5fY2FjaGVkQ2hhbmdlLmFzT2JzZXJ2YWJsZSgpOyAvLyAucGlwZShmaWx0ZXIodyA9PiB3ICE9PSBudWxsKSk7XG4gIH1cbiAgLyoqIOiHquWumuS5ieW9k+WJjeagh+mimCAqL1xuICBzZXQgdGl0bGUodmFsdWU6IHN0cmluZyB8IFJldXNlVGl0bGUpIHtcbiAgICBjb25zdCB1cmwgPSB0aGlzLmN1clVybDtcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykgdmFsdWUgPSB7IHRleHQ6IHZhbHVlIH07XG4gICAgdGhpcy5fdGl0bGVDYWNoZWRbdXJsXSA9IHZhbHVlO1xuICAgIHRoaXMuZGkoJ3VwZGF0ZSBjdXJyZW50IHRhZyB0aXRsZTogJywgdmFsdWUpO1xuICAgIHRoaXMuX2NhY2hlZENoYW5nZS5uZXh0KHtcbiAgICAgIGFjdGl2ZTogJ3RpdGxlJyxcbiAgICAgIHVybCxcbiAgICAgIHRpdGxlOiB2YWx1ZSxcbiAgICAgIGxpc3Q6IHRoaXMuX2NhY2hlZFxuICAgIH0pO1xuICB9XG4gIC8qKiDojrflj5bmjIflrprot6/lvoTnvJPlrZjmiYDlnKjkvY3nva7vvIxgLTFgIOihqOekuuaXoOe8k+WtmCAqL1xuICBpbmRleCh1cmw6IHN0cmluZyk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX2NhY2hlZC5maW5kSW5kZXgodyA9PiB3LnVybCA9PT0gdXJsKTtcbiAgfVxuICAvKiog6I635Y+W5oyH5a6a6Lev5b6E57yT5a2Y5piv5ZCm5a2Y5ZyoICovXG4gIGV4aXN0cyh1cmw6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmluZGV4KHVybCkgIT09IC0xO1xuICB9XG4gIC8qKiDojrflj5bmjIflrprot6/lvoTnvJPlrZggKi9cbiAgZ2V0KHVybD86IHN0cmluZyk6IFJldXNlVGFiQ2FjaGVkIHwgbnVsbCB7XG4gICAgcmV0dXJuIHVybCA/IHRoaXMuX2NhY2hlZC5maW5kKHcgPT4gdy51cmwgPT09IHVybCkgfHwgbnVsbCA6IG51bGw7XG4gIH1cbiAgcHJpdmF0ZSByZW1vdmUodXJsOiBzdHJpbmcgfCBudW1iZXIsIGluY2x1ZGVOb25DbG9zZWFibGU6IGJvb2xlYW4pOiBib29sZWFuIHtcbiAgICBjb25zdCBpZHggPSB0eXBlb2YgdXJsID09PSAnc3RyaW5nJyA/IHRoaXMuaW5kZXgodXJsKSA6IHVybDtcbiAgICBjb25zdCBpdGVtID0gaWR4ICE9PSAtMSA/IHRoaXMuX2NhY2hlZFtpZHhdIDogbnVsbDtcbiAgICBpZiAoIWl0ZW0gfHwgKCFpbmNsdWRlTm9uQ2xvc2VhYmxlICYmICFpdGVtLmNsb3NhYmxlKSkgcmV0dXJuIGZhbHNlO1xuXG4gICAgdGhpcy5kZXN0cm95KGl0ZW0uX2hhbmRsZSk7XG5cbiAgICB0aGlzLl9jYWNoZWQuc3BsaWNlKGlkeCwgMSk7XG4gICAgZGVsZXRlIHRoaXMuX3RpdGxlQ2FjaGVkW3VybF07XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgLyoqXG4gICAqIOagueaNrlVSTOenu+mZpOagh+etvlxuICAgKlxuICAgKiBAcGFyYW0gW2luY2x1ZGVOb25DbG9zZWFibGU9ZmFsc2VdIOaYr+WQpuW8uuWItuWMheWQq+S4jeWPr+WFs+mXrVxuICAgKi9cbiAgY2xvc2UodXJsOiBzdHJpbmcsIGluY2x1ZGVOb25DbG9zZWFibGU6IGJvb2xlYW4gPSBmYWxzZSk6IGJvb2xlYW4ge1xuICAgIHRoaXMucmVtb3ZlVXJsQnVmZmVyID0gdXJsO1xuXG4gICAgdGhpcy5yZW1vdmUodXJsLCBpbmNsdWRlTm9uQ2xvc2VhYmxlKTtcblxuICAgIHRoaXMuX2NhY2hlZENoYW5nZS5uZXh0KHsgYWN0aXZlOiAnY2xvc2UnLCB1cmwsIGxpc3Q6IHRoaXMuX2NhY2hlZCB9KTtcblxuICAgIHRoaXMuZGkoJ2Nsb3NlIHRhZycsIHVybCk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgLyoqXG4gICAqIOa4hemZpOWPs+i+uVxuICAgKlxuICAgKiBAcGFyYW0gW2luY2x1ZGVOb25DbG9zZWFibGU9ZmFsc2VdIOaYr+WQpuW8uuWItuWMheWQq+S4jeWPr+WFs+mXrVxuICAgKi9cbiAgY2xvc2VSaWdodCh1cmw6IHN0cmluZywgaW5jbHVkZU5vbkNsb3NlYWJsZTogYm9vbGVhbiA9IGZhbHNlKTogYm9vbGVhbiB7XG4gICAgY29uc3Qgc3RhcnQgPSB0aGlzLmluZGV4KHVybCk7XG4gICAgZm9yIChsZXQgaSA9IHRoaXMuY291bnQgLSAxOyBpID4gc3RhcnQ7IGktLSkge1xuICAgICAgdGhpcy5yZW1vdmUoaSwgaW5jbHVkZU5vbkNsb3NlYWJsZSk7XG4gICAgfVxuXG4gICAgdGhpcy5yZW1vdmVVcmxCdWZmZXIgPSBudWxsO1xuXG4gICAgdGhpcy5fY2FjaGVkQ2hhbmdlLm5leHQoeyBhY3RpdmU6ICdjbG9zZVJpZ2h0JywgdXJsLCBsaXN0OiB0aGlzLl9jYWNoZWQgfSk7XG5cbiAgICB0aGlzLmRpKCdjbG9zZSByaWdodCB0YWdlcycsIHVybCk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgLyoqXG4gICAqIOa4hemZpOaJgOaciee8k+WtmFxuICAgKlxuICAgKiBAcGFyYW0gW2luY2x1ZGVOb25DbG9zZWFibGU9ZmFsc2VdIOaYr+WQpuW8uuWItuWMheWQq+S4jeWPr+WFs+mXrVxuICAgKi9cbiAgY2xlYXIoaW5jbHVkZU5vbkNsb3NlYWJsZTogYm9vbGVhbiA9IGZhbHNlKTogdm9pZCB7XG4gICAgdGhpcy5fY2FjaGVkLmZvckVhY2godyA9PiB7XG4gICAgICBpZiAoIWluY2x1ZGVOb25DbG9zZWFibGUgJiYgdy5jbG9zYWJsZSkgdGhpcy5kZXN0cm95KHcuX2hhbmRsZSk7XG4gICAgfSk7XG4gICAgdGhpcy5fY2FjaGVkID0gdGhpcy5fY2FjaGVkLmZpbHRlcih3ID0+ICFpbmNsdWRlTm9uQ2xvc2VhYmxlICYmICF3LmNsb3NhYmxlKTtcblxuICAgIHRoaXMucmVtb3ZlVXJsQnVmZmVyID0gbnVsbDtcblxuICAgIHRoaXMuX2NhY2hlZENoYW5nZS5uZXh0KHsgYWN0aXZlOiAnY2xlYXInLCBsaXN0OiB0aGlzLl9jYWNoZWQgfSk7XG5cbiAgICB0aGlzLmRpKCdjbGVhciBhbGwgY2F0Y2gnKTtcbiAgfVxuICAvKipcbiAgICog56e75Yqo57yT5a2Y5pWw5o2uXG4gICAqXG4gICAqIEBwYXJhbSB1cmwg6KaB56e75Yqo55qEVVJM5Zyw5Z2AXG4gICAqIEBwYXJhbSBwb3NpdGlvbiDmlrDkvY3nva7vvIzkuIvmoIfku44gYDBgIOW8gOWni1xuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGBcbiAgICogLy8gc291cmNlXG4gICAqIFsgJy9hLzEnLCAnL2EvMicsICcvYS8zJywgJy9hLzQnLCAnL2EvNScgXVxuICAgKiBtb3ZlKCcvYS8xJywgMik7XG4gICAqIC8vIG91dHB1dFxuICAgKiBbICcvYS8yJywgJy9hLzMnLCAnL2EvMScsICcvYS80JywgJy9hLzUnIF1cbiAgICogbW92ZSgnL2EvMScsIC0xKTtcbiAgICogLy8gb3V0cHV0XG4gICAqIFsgJy9hLzInLCAnL2EvMycsICcvYS80JywgJy9hLzUnLCAnL2EvMScgXVxuICAgKiBgYGBcbiAgICovXG4gIG1vdmUodXJsOiBzdHJpbmcsIHBvc2l0aW9uOiBudW1iZXIpOiB2b2lkIHtcbiAgICBjb25zdCBzdGFydCA9IHRoaXMuX2NhY2hlZC5maW5kSW5kZXgodyA9PiB3LnVybCA9PT0gdXJsKTtcbiAgICBpZiAoc3RhcnQgPT09IC0xKSByZXR1cm47XG4gICAgY29uc3QgZGF0YSA9IHRoaXMuX2NhY2hlZC5zbGljZSgpO1xuICAgIGRhdGEuc3BsaWNlKHBvc2l0aW9uIDwgMCA/IGRhdGEubGVuZ3RoICsgcG9zaXRpb24gOiBwb3NpdGlvbiwgMCwgZGF0YS5zcGxpY2Uoc3RhcnQsIDEpWzBdKTtcbiAgICB0aGlzLl9jYWNoZWQgPSBkYXRhO1xuICAgIHRoaXMuX2NhY2hlZENoYW5nZS5uZXh0KHtcbiAgICAgIGFjdGl2ZTogJ21vdmUnLFxuICAgICAgdXJsLFxuICAgICAgcG9zaXRpb24sXG4gICAgICBsaXN0OiB0aGlzLl9jYWNoZWRcbiAgICB9KTtcbiAgfVxuICAvKipcbiAgICog5by65Yi25YWz6Zet5b2T5YmN6Lev55Sx77yI5YyF5ZCr5LiN5Y+v5YWz6Zet54q25oCB77yJ77yM5bm26YeN5paw5a+86Iiq6IezIGBuZXdVcmxgIOi3r+eUsVxuICAgKi9cbiAgcmVwbGFjZShuZXdVcmw6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IHVybCA9IHRoaXMuY3VyVXJsO1xuICAgIGlmICh0aGlzLmV4aXN0cyh1cmwpKSB7XG4gICAgICB0aGlzLmNsb3NlKHVybCwgdHJ1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucmVtb3ZlVXJsQnVmZmVyID0gdXJsO1xuICAgIH1cbiAgICB0aGlzLmluamVjdG9yLmdldDxSb3V0ZXI+KFJvdXRlcikubmF2aWdhdGVCeVVybChuZXdVcmwpO1xuICB9XG4gIC8qKlxuICAgKiDojrflj5bmoIfpopjvvIzpobrluo/lpoLkuIvvvJpcbiAgICpcbiAgICogMS4g57uE5Lu25YaF5L2/55SoIGBSZXVzZVRhYlNlcnZpY2UudGl0bGUgPSAnbmV3IHRpdGxlJ2Ag6YeN5paw5oyH5a6a5paH5pysXG4gICAqIDIuIOi3r+eUsemFjee9ruS4rSBkYXRhIOWxnuaAp+S4reWMheWQqyB0aXRsZUkxOG4gPiB0aXRsZVxuICAgKiAzLiDoj5zljZXmlbDmja7kuK0gdGV4dCDlsZ7mgKdcbiAgICpcbiAgICogQHBhcmFtIHVybCDmjIflrppVUkxcbiAgICogQHBhcmFtIHJvdXRlIOaMh+Wumui3r+eUseW/q+eFp1xuICAgKi9cbiAgZ2V0VGl0bGUodXJsOiBzdHJpbmcsIHJvdXRlPzogQWN0aXZhdGVkUm91dGVTbmFwc2hvdCk6IFJldXNlVGl0bGUge1xuICAgIGlmICh0aGlzLl90aXRsZUNhY2hlZFt1cmxdKSB7XG4gICAgICByZXR1cm4gdGhpcy5fdGl0bGVDYWNoZWRbdXJsXTtcbiAgICB9XG5cbiAgICBpZiAocm91dGUgJiYgcm91dGUuZGF0YSAmJiAocm91dGUuZGF0YS50aXRsZUkxOG4gfHwgcm91dGUuZGF0YS50aXRsZSkpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHRleHQ6IHJvdXRlLmRhdGEudGl0bGUsXG4gICAgICAgIGkxOG46IHJvdXRlLmRhdGEudGl0bGVJMThuXG4gICAgICB9IGFzIFJldXNlVGl0bGU7XG4gICAgfVxuXG4gICAgY29uc3QgbWVudSA9IHRoaXMuZ2V0TWVudSh1cmwpO1xuICAgIHJldHVybiBtZW51ID8geyB0ZXh0OiBtZW51LnRleHQsIGkxOG46IG1lbnUuaTE4biB9IDogeyB0ZXh0OiB1cmwgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDmuIXpmaTmoIfpopjnvJPlrZhcbiAgICovXG4gIGNsZWFyVGl0bGVDYWNoZWQoKTogdm9pZCB7XG4gICAgdGhpcy5fdGl0bGVDYWNoZWQgPSB7fTtcbiAgfVxuICAvKiog6Ieq5a6a5LmJ5b2T5YmNIGBjbG9zYWJsZWAg54q25oCBICovXG4gIHNldCBjbG9zYWJsZSh2YWx1ZTogYm9vbGVhbikge1xuICAgIGNvbnN0IHVybCA9IHRoaXMuY3VyVXJsO1xuICAgIHRoaXMuX2Nsb3NhYmxlQ2FjaGVkW3VybF0gPSB2YWx1ZTtcbiAgICB0aGlzLmRpKCd1cGRhdGUgY3VycmVudCB0YWcgY2xvc2FibGU6ICcsIHZhbHVlKTtcbiAgICB0aGlzLl9jYWNoZWRDaGFuZ2UubmV4dCh7XG4gICAgICBhY3RpdmU6ICdjbG9zYWJsZScsXG4gICAgICBjbG9zYWJsZTogdmFsdWUsXG4gICAgICBsaXN0OiB0aGlzLl9jYWNoZWRcbiAgICB9KTtcbiAgfVxuICAvKipcbiAgICog6I635Y+WIGBjbG9zYWJsZWAg54q25oCB77yM6aG65bqP5aaC5LiL77yaXG4gICAqXG4gICAqIDEuIOe7hOS7tuWGheS9v+eUqCBgUmV1c2VUYWJTZXJ2aWNlLmNsb3NhYmxlID0gdHJ1ZWAg6YeN5paw5oyH5a6aIGBjbG9zYWJsZWAg54q25oCBXG4gICAqIDIuIOi3r+eUsemFjee9ruS4rSBkYXRhIOWxnuaAp+S4reWMheWQqyBgcmV1c2VDbG9zYWJsZWBcbiAgICogMy4g6I+c5Y2V5pWw5o2u5LitIGByZXVzZUNsb3NhYmxlYCDlsZ7mgKdcbiAgICpcbiAgICogQHBhcmFtIHVybCDmjIflrppVUkxcbiAgICogQHBhcmFtIHJvdXRlIOaMh+Wumui3r+eUseW/q+eFp1xuICAgKi9cbiAgZ2V0Q2xvc2FibGUodXJsOiBzdHJpbmcsIHJvdXRlPzogQWN0aXZhdGVkUm91dGVTbmFwc2hvdCk6IGJvb2xlYW4ge1xuICAgIGlmICh0eXBlb2YgdGhpcy5fY2xvc2FibGVDYWNoZWRbdXJsXSAhPT0gJ3VuZGVmaW5lZCcpIHJldHVybiB0aGlzLl9jbG9zYWJsZUNhY2hlZFt1cmxdO1xuXG4gICAgaWYgKHJvdXRlICYmIHJvdXRlLmRhdGEgJiYgdHlwZW9mIHJvdXRlLmRhdGEucmV1c2VDbG9zYWJsZSA9PT0gJ2Jvb2xlYW4nKSByZXR1cm4gcm91dGUuZGF0YS5yZXVzZUNsb3NhYmxlO1xuXG4gICAgY29uc3QgbWVudSA9IHRoaXMubW9kZSAhPT0gUmV1c2VUYWJNYXRjaE1vZGUuVVJMID8gdGhpcy5nZXRNZW51KHVybCkgOiBudWxsO1xuICAgIGlmIChtZW51ICYmIHR5cGVvZiBtZW51LnJldXNlQ2xvc2FibGUgPT09ICdib29sZWFuJykgcmV0dXJuIG1lbnUucmV1c2VDbG9zYWJsZTtcblxuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIC8qKlxuICAgKiDmuIXnqbogYGNsb3NhYmxlYCDnvJPlrZhcbiAgICovXG4gIGNsZWFyQ2xvc2FibGVDYWNoZWQoKTogdm9pZCB7XG4gICAgdGhpcy5fY2xvc2FibGVDYWNoZWQgPSB7fTtcbiAgfVxuICBnZXRUcnV0aFJvdXRlKHJvdXRlOiBBY3RpdmF0ZWRSb3V0ZVNuYXBzaG90KTogQWN0aXZhdGVkUm91dGVTbmFwc2hvdCB7XG4gICAgbGV0IG5leHQgPSByb3V0ZTtcbiAgICB3aGlsZSAobmV4dC5maXJzdENoaWxkKSBuZXh0ID0gbmV4dC5maXJzdENoaWxkO1xuICAgIHJldHVybiBuZXh0O1xuICB9XG4gIC8qKlxuICAgKiDmoLnmja7lv6vnhafojrflj5ZVUkzlnLDlnYBcbiAgICovXG4gIGdldFVybChyb3V0ZTogQWN0aXZhdGVkUm91dGVTbmFwc2hvdCk6IHN0cmluZyB7XG4gICAgbGV0IG5leHQgPSB0aGlzLmdldFRydXRoUm91dGUocm91dGUpO1xuICAgIGNvbnN0IHNlZ21lbnRzOiBzdHJpbmdbXSA9IFtdO1xuICAgIHdoaWxlIChuZXh0KSB7XG4gICAgICBzZWdtZW50cy5wdXNoKG5leHQudXJsLmpvaW4oJy8nKSk7XG4gICAgICBuZXh0ID0gbmV4dC5wYXJlbnQhO1xuICAgIH1cbiAgICBjb25zdCB1cmwgPSBgLyR7c2VnbWVudHNcbiAgICAgIC5maWx0ZXIoaSA9PiBpKVxuICAgICAgLnJldmVyc2UoKVxuICAgICAgLmpvaW4oJy8nKX1gO1xuICAgIHJldHVybiB1cmw7XG4gIH1cbiAgLyoqXG4gICAqIOajgOafpeW/q+eFp+aYr+WQpuWFgeiuuOiiq+WkjeeUqFxuICAgKi9cbiAgY2FuKHJvdXRlOiBBY3RpdmF0ZWRSb3V0ZVNuYXBzaG90KTogYm9vbGVhbiB7XG4gICAgY29uc3QgdXJsID0gdGhpcy5nZXRVcmwocm91dGUpO1xuICAgIGlmICh1cmwgPT09IHRoaXMucmVtb3ZlVXJsQnVmZmVyKSByZXR1cm4gZmFsc2U7XG5cbiAgICBpZiAocm91dGUuZGF0YSAmJiB0eXBlb2Ygcm91dGUuZGF0YS5yZXVzZSA9PT0gJ2Jvb2xlYW4nKSByZXR1cm4gcm91dGUuZGF0YS5yZXVzZTtcblxuICAgIGlmICh0aGlzLm1vZGUgIT09IFJldXNlVGFiTWF0Y2hNb2RlLlVSTCkge1xuICAgICAgY29uc3QgbWVudSA9IHRoaXMuZ2V0TWVudSh1cmwpO1xuICAgICAgaWYgKCFtZW51KSByZXR1cm4gZmFsc2U7XG4gICAgICBpZiAodGhpcy5tb2RlID09PSBSZXVzZVRhYk1hdGNoTW9kZS5NZW51KSB7XG4gICAgICAgIGlmIChtZW51LnJldXNlID09PSBmYWxzZSkgcmV0dXJuIGZhbHNlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKCFtZW51LnJldXNlIHx8IG1lbnUucmV1c2UgIT09IHRydWUpIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gIXRoaXMuaXNFeGNsdWRlKHVybCk7XG4gIH1cblxuICBpc0V4Y2x1ZGUodXJsOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5leGNsdWRlcy5maW5kSW5kZXgociA9PiByLnRlc3QodXJsKSkgIT09IC0xO1xuICB9XG5cbiAgLyoqXG4gICAqIOWIt+aWsO+8jOinpuWPkeS4gOS4qiByZWZyZXNoIOexu+Wei+S6i+S7tlxuICAgKi9cbiAgcmVmcmVzaChkYXRhPzogTnpTYWZlQW55KTogdm9pZCB7XG4gICAgdGhpcy5fY2FjaGVkQ2hhbmdlLm5leHQoeyBhY3RpdmU6ICdyZWZyZXNoJywgZGF0YSB9KTtcbiAgfVxuICAvLyAjZW5kcmVnaW9uXG5cbiAgLy8gI3JlZ2lvbiBwcml2YXRlc1xuXG4gIHByaXZhdGUgZGVzdHJveShfaGFuZGxlOiBOelNhZmVBbnkpOiB2b2lkIHtcbiAgICBpZiAoX2hhbmRsZSAmJiBfaGFuZGxlLmNvbXBvbmVudFJlZiAmJiBfaGFuZGxlLmNvbXBvbmVudFJlZi5kZXN0cm95KSBfaGFuZGxlLmNvbXBvbmVudFJlZi5kZXN0cm95KCk7XG4gIH1cblxuICBwcml2YXRlIGRpKC4uLmFyZ3M6IE56U2FmZUFueVtdKTogdm9pZCB7XG4gICAgaWYgKHR5cGVvZiBuZ0Rldk1vZGUgPT09ICd1bmRlZmluZWQnIHx8IG5nRGV2TW9kZSkge1xuICAgICAgaWYgKCF0aGlzLmRlYnVnKSByZXR1cm47XG4gICAgICBjb25zb2xlLndhcm4oLi4uYXJncyk7XG4gICAgfVxuICB9XG5cbiAgLy8gI2VuZHJlZ2lvblxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgaW5qZWN0b3I6IEluamVjdG9yLFxuICAgIHByaXZhdGUgbWVudVNlcnZpY2U6IE1lbnVTZXJ2aWNlLFxuICAgIEBPcHRpb25hbCgpIEBJbmplY3QoUkVVU0VfVEFCX1NUT1JBR0VfS0VZKSBwcml2YXRlIHN0YXRlS2V5OiBzdHJpbmcsXG4gICAgQE9wdGlvbmFsKCkgQEluamVjdChSRVVTRV9UQUJfU1RPUkFHRV9TVEFURSkgcHJpdmF0ZSBzdGF0ZVNydjogUmV1c2VUYWJTdG9yYWdlU3RhdGVcbiAgKSB7fVxuXG4gIGluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5pbml0U2Nyb2xsKCk7XG4gICAgdGhpcy5faW5pdGVkID0gdHJ1ZTtcbiAgICB0aGlzLmxvYWRTdGF0ZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBsb2FkU3RhdGUoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnN0b3JhZ2VTdGF0ZSkgcmV0dXJuO1xuXG4gICAgdGhpcy5fY2FjaGVkID0gdGhpcy5zdGF0ZVNydi5nZXQodGhpcy5zdGF0ZUtleSkubWFwKHYgPT4gKHtcbiAgICAgIHRpdGxlOiB7IHRleHQ6IHYudGl0bGUgfSxcbiAgICAgIHVybDogdi51cmwsXG4gICAgICBwb3NpdGlvbjogdi5wb3NpdGlvblxuICAgIH0pKTtcbiAgICB0aGlzLl9jYWNoZWRDaGFuZ2UubmV4dCh7IGFjdGl2ZTogJ2xvYWRTdGF0ZScgfSk7XG4gIH1cblxuICBwcml2YXRlIGdldE1lbnUodXJsOiBzdHJpbmcpOiBNZW51IHwgbnVsbCB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgbWVudXMgPSB0aGlzLm1lbnVTZXJ2aWNlLmdldFBhdGhCeVVybCh1cmwpO1xuICAgIGlmICghbWVudXMgfHwgbWVudXMubGVuZ3RoID09PSAwKSByZXR1cm4gbnVsbDtcbiAgICByZXR1cm4gbWVudXMucG9wKCk7XG4gIH1cblxuICBydW5Ib29rKFxuICAgIG1ldGhvZDogUmV1c2VIb29rVHlwZXMsXG4gICAgY29tcDogUmV1c2VDb21wb25lbnRSZWYgfCBudW1iZXIgfCB1bmRlZmluZWQsXG4gICAgdHlwZTogUmV1c2VIb29rT25SZXVzZUluaXRUeXBlID0gJ2luaXQnXG4gICk6IHZvaWQge1xuICAgIGlmICh0eXBlb2YgY29tcCA9PT0gJ251bWJlcicpIHtcbiAgICAgIGNvbnN0IGl0ZW0gPSB0aGlzLl9jYWNoZWRbY29tcF07XG4gICAgICBjb21wID0gaXRlbS5faGFuZGxlPy5jb21wb25lbnRSZWY7XG4gICAgfVxuICAgIGlmIChjb21wID09IG51bGwgfHwgIWNvbXAuaW5zdGFuY2UpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgY29tcFRoaXMgPSBjb21wLmluc3RhbmNlO1xuICAgIGNvbnN0IGZuID0gY29tcFRoaXNbbWV0aG9kXTtcbiAgICBpZiAodHlwZW9mIGZuICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChtZXRob2QgPT09ICdfb25SZXVzZUluaXQnKSB7XG4gICAgICBmbi5jYWxsKGNvbXBUaGlzLCB0eXBlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgKGZuIGFzICgpID0+IHZvaWQpLmNhbGwoY29tcFRoaXMpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgaGFzSW5WYWxpZFJvdXRlKHJvdXRlOiBBY3RpdmF0ZWRSb3V0ZVNuYXBzaG90KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICFyb3V0ZS5yb3V0ZUNvbmZpZyB8fCAhIXJvdXRlLnJvdXRlQ29uZmlnLmxvYWRDaGlsZHJlbiB8fCAhIXJvdXRlLnJvdXRlQ29uZmlnLmNoaWxkcmVuO1xuICB9XG5cbiAgLyoqXG4gICAqIOWGs+WumuaYr+WQpuWFgeiuuOi3r+eUseWkjeeUqO+8jOiLpSBgdHJ1ZWAg5Lya6Kem5Y+RIGBzdG9yZWBcbiAgICovXG4gIHNob3VsZERldGFjaChyb3V0ZTogQWN0aXZhdGVkUm91dGVTbmFwc2hvdCk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLmhhc0luVmFsaWRSb3V0ZShyb3V0ZSkpIHJldHVybiBmYWxzZTtcbiAgICB0aGlzLmRpKCcjc2hvdWxkRGV0YWNoJywgdGhpcy5jYW4ocm91dGUpLCB0aGlzLmdldFVybChyb3V0ZSkpO1xuICAgIHJldHVybiB0aGlzLmNhbihyb3V0ZSk7XG4gIH1cblxuICAvKipcbiAgICog5a2Y5YKoXG4gICAqL1xuICBzdG9yZShfc25hcHNob3Q6IEFjdGl2YXRlZFJvdXRlU25hcHNob3QsIF9oYW5kbGU6IE56U2FmZUFueSk6IHZvaWQge1xuICAgIGNvbnN0IHVybCA9IHRoaXMuZ2V0VXJsKF9zbmFwc2hvdCk7XG4gICAgY29uc3QgaWR4ID0gdGhpcy5pbmRleCh1cmwpO1xuICAgIGNvbnN0IGlzQWRkID0gaWR4ID09PSAtMTtcblxuICAgIGNvbnN0IGl0ZW06IFJldXNlVGFiQ2FjaGVkID0ge1xuICAgICAgdGl0bGU6IHRoaXMuZ2V0VGl0bGUodXJsLCBfc25hcHNob3QpLFxuICAgICAgY2xvc2FibGU6IHRoaXMuZ2V0Q2xvc2FibGUodXJsLCBfc25hcHNob3QpLFxuICAgICAgcG9zaXRpb246IHRoaXMuZ2V0S2VlcGluZ1Njcm9sbCh1cmwsIF9zbmFwc2hvdCkgPyB0aGlzLnBvc2l0aW9uQnVmZmVyW3VybF0gOiBudWxsLFxuICAgICAgdXJsLFxuICAgICAgX3NuYXBzaG90LFxuICAgICAgX2hhbmRsZVxuICAgIH07XG4gICAgaWYgKGlzQWRkKSB7XG4gICAgICBpZiAodGhpcy5jb3VudCA+PSB0aGlzLl9tYXgpIHtcbiAgICAgICAgLy8gR2V0IHRoZSBvbGRlc3QgY2xvc2FibGUgbG9jYXRpb25cbiAgICAgICAgY29uc3QgY2xvc2VJZHggPSB0aGlzLl9jYWNoZWQuZmluZEluZGV4KHcgPT4gdy5jbG9zYWJsZSEpO1xuICAgICAgICBpZiAoY2xvc2VJZHggIT09IC0xKSB0aGlzLnJlbW92ZShjbG9zZUlkeCwgZmFsc2UpO1xuICAgICAgfVxuICAgICAgdGhpcy5fY2FjaGVkLnB1c2goaXRlbSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEN1cnJlbnQgaGFuZGxlciBpcyBudWxsIHdoZW4gYWN0aXZhdGUgcm91dGVzXG4gICAgICAvLyBGb3IgYmV0dGVyIHJlbGlhYmlsaXR5LCB3ZSBuZWVkIHRvIHdhaXQgZm9yIHRoZSBjb21wb25lbnQgdG8gYmUgYXR0YWNoZWQgYmVmb3JlIGNhbGwgX29uUmV1c2VJbml0XG4gICAgICBjb25zdCBjYWhjZWRDb21wb25lbnRSZWYgPSB0aGlzLl9jYWNoZWRbaWR4XS5faGFuZGxlPy5jb21wb25lbnRSZWY7XG4gICAgICBpZiAoX2hhbmRsZSA9PSBudWxsICYmIGNhaGNlZENvbXBvbmVudFJlZiAhPSBudWxsKSB7XG4gICAgICAgIHRpbWVyKDEwMCkuc3Vic2NyaWJlKCgpID0+IHRoaXMucnVuSG9vaygnX29uUmV1c2VJbml0JywgY2FoY2VkQ29tcG9uZW50UmVmKSk7XG4gICAgICB9XG4gICAgICB0aGlzLl9jYWNoZWRbaWR4XSA9IGl0ZW07XG4gICAgfVxuICAgIHRoaXMucmVtb3ZlVXJsQnVmZmVyID0gbnVsbDtcblxuICAgIHRoaXMuZGkoJyNzdG9yZScsIGlzQWRkID8gJ1tuZXddJyA6ICdbb3ZlcnJpZGVdJywgdXJsKTtcblxuICAgIGlmIChfaGFuZGxlICYmIF9oYW5kbGUuY29tcG9uZW50UmVmKSB7XG4gICAgICB0aGlzLnJ1bkhvb2soJ19vblJldXNlRGVzdHJveScsIF9oYW5kbGUuY29tcG9uZW50UmVmKTtcbiAgICB9XG5cbiAgICBpZiAoIWlzQWRkKSB7XG4gICAgICB0aGlzLl9jYWNoZWRDaGFuZ2UubmV4dCh7IGFjdGl2ZTogJ292ZXJyaWRlJywgaXRlbSwgbGlzdDogdGhpcy5fY2FjaGVkIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiDlhrPlrprmmK/lkKblhYHorrjlupTnlKjnvJPlrZjmlbDmja5cbiAgICovXG4gIHNob3VsZEF0dGFjaChyb3V0ZTogQWN0aXZhdGVkUm91dGVTbmFwc2hvdCk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLmhhc0luVmFsaWRSb3V0ZShyb3V0ZSkpIHJldHVybiBmYWxzZTtcbiAgICBjb25zdCB1cmwgPSB0aGlzLmdldFVybChyb3V0ZSk7XG4gICAgY29uc3QgZGF0YSA9IHRoaXMuZ2V0KHVybCk7XG4gICAgY29uc3QgcmV0ID0gISEoZGF0YSAmJiBkYXRhLl9oYW5kbGUpO1xuICAgIHRoaXMuZGkoJyNzaG91bGRBdHRhY2gnLCByZXQsIHVybCk7XG4gICAgaWYgKCFyZXQpIHtcbiAgICAgIHRoaXMuX2NhY2hlZENoYW5nZS5uZXh0KHsgYWN0aXZlOiAnYWRkJywgdXJsLCBsaXN0OiB0aGlzLl9jYWNoZWQgfSk7XG4gICAgfVxuICAgIHJldHVybiByZXQ7XG4gIH1cblxuICAvKipcbiAgICog5o+Q5Y+W5aSN55So5pWw5o2uXG4gICAqL1xuICByZXRyaWV2ZShyb3V0ZTogQWN0aXZhdGVkUm91dGVTbmFwc2hvdCk6IE56U2FmZUFueSB8IG51bGwge1xuICAgIGlmICh0aGlzLmhhc0luVmFsaWRSb3V0ZShyb3V0ZSkpIHJldHVybiBudWxsO1xuICAgIGNvbnN0IHVybCA9IHRoaXMuZ2V0VXJsKHJvdXRlKTtcbiAgICBjb25zdCBkYXRhID0gdGhpcy5nZXQodXJsKTtcbiAgICBjb25zdCByZXQgPSAoZGF0YSAmJiBkYXRhLl9oYW5kbGUpIHx8IG51bGw7XG4gICAgdGhpcy5kaSgnI3JldHJpZXZlJywgdXJsLCByZXQpO1xuICAgIHJldHVybiByZXQ7XG4gIH1cblxuICAvKipcbiAgICog5Yaz5a6a5piv5ZCm5bqU6K+l6L+b6KGM5aSN55So6Lev55Sx5aSE55CGXG4gICAqL1xuICBzaG91bGRSZXVzZVJvdXRlKGZ1dHVyZTogQWN0aXZhdGVkUm91dGVTbmFwc2hvdCwgY3VycjogQWN0aXZhdGVkUm91dGVTbmFwc2hvdCk6IGJvb2xlYW4ge1xuICAgIGxldCByZXQgPSBmdXR1cmUucm91dGVDb25maWcgPT09IGN1cnIucm91dGVDb25maWc7XG4gICAgaWYgKCFyZXQpIHJldHVybiBmYWxzZTtcblxuICAgIGNvbnN0IHBhdGggPSAoKGZ1dHVyZS5yb3V0ZUNvbmZpZyAmJiBmdXR1cmUucm91dGVDb25maWcucGF0aCkgfHwgJycpIGFzIHN0cmluZztcbiAgICBpZiAocGF0aC5sZW5ndGggPiAwICYmIH5wYXRoLmluZGV4T2YoJzonKSkge1xuICAgICAgaWYgKHRoaXMucm91dGVQYXJhbU1hdGNoTW9kZSA9PT0gJ3N0cmljdCcpIHtcbiAgICAgICAgcmV0ID0gdGhpcy5nZXRVcmwoZnV0dXJlKSA9PT0gdGhpcy5nZXRVcmwoY3Vycik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXQgPSBwYXRoID09PSAoKGN1cnIucm91dGVDb25maWcgJiYgY3Vyci5yb3V0ZUNvbmZpZy5wYXRoKSB8fCAnJyk7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuZGkoJz09PT09PT09PT09PT09PT09PT09PScpO1xuICAgIHRoaXMuZGkoJyNzaG91bGRSZXVzZVJvdXRlJywgcmV0LCBgJHt0aGlzLmdldFVybChjdXJyKX09PiR7dGhpcy5nZXRVcmwoZnV0dXJlKX1gLCBmdXR1cmUsIGN1cnIpO1xuICAgIHJldHVybiByZXQ7XG4gIH1cblxuICAvLyAjcmVnaW9uIHNjcm9sbFxuXG4gIC8qKlxuICAgKiDojrflj5YgYGtlZXBpbmdTY3JvbGxgIOeKtuaAge+8jOmhuuW6j+WmguS4i++8mlxuICAgKlxuICAgKiAxLiDot6/nlLHphY3nva7kuK0gZGF0YSDlsZ7mgKfkuK3ljIXlkKsgYGtlZXBpbmdTY3JvbGxgXG4gICAqIDIuIOiPnOWNleaVsOaNruS4rSBga2VlcGluZ1Njcm9sbGAg5bGe5oCnXG4gICAqIDMuIOe7hOS7tiBga2VlcGluZ1Njcm9sbGAg5YC8XG4gICAqL1xuICBnZXRLZWVwaW5nU2Nyb2xsKHVybDogc3RyaW5nLCByb3V0ZT86IEFjdGl2YXRlZFJvdXRlU25hcHNob3QpOiBib29sZWFuIHtcbiAgICBpZiAocm91dGUgJiYgcm91dGUuZGF0YSAmJiB0eXBlb2Ygcm91dGUuZGF0YS5rZWVwaW5nU2Nyb2xsID09PSAnYm9vbGVhbicpIHJldHVybiByb3V0ZS5kYXRhLmtlZXBpbmdTY3JvbGw7XG5cbiAgICBjb25zdCBtZW51ID0gdGhpcy5tb2RlICE9PSBSZXVzZVRhYk1hdGNoTW9kZS5VUkwgPyB0aGlzLmdldE1lbnUodXJsKSA6IG51bGw7XG4gICAgaWYgKG1lbnUgJiYgdHlwZW9mIG1lbnUua2VlcGluZ1Njcm9sbCA9PT0gJ2Jvb2xlYW4nKSByZXR1cm4gbWVudS5rZWVwaW5nU2Nyb2xsO1xuXG4gICAgcmV0dXJuIHRoaXMua2VlcGluZ1Njcm9sbDtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0IGlzRGlzYWJsZWRJblJvdXRlcigpOiBib29sZWFuIHtcbiAgICBjb25zdCByb3V0ZXJDb25maWcgPSB0aGlzLmluamVjdG9yLmdldDxFeHRyYU9wdGlvbnM+KFJPVVRFUl9DT05GSUdVUkFUSU9OLCB7fSBhcyBOelNhZmVBbnkpO1xuICAgIHJldHVybiByb3V0ZXJDb25maWcuc2Nyb2xsUG9zaXRpb25SZXN0b3JhdGlvbiA9PT0gJ2Rpc2FibGVkJztcbiAgfVxuXG4gIHByaXZhdGUgZ2V0IHNzKCk6IFNjcm9sbFNlcnZpY2Uge1xuICAgIHJldHVybiB0aGlzLmluamVjdG9yLmdldChTY3JvbGxTZXJ2aWNlKTtcbiAgfVxuXG4gIHByaXZhdGUgaW5pdFNjcm9sbCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fcm91dGVyJCkge1xuICAgICAgdGhpcy5fcm91dGVyJC51bnN1YnNjcmliZSgpO1xuICAgIH1cblxuICAgIHRoaXMuX3JvdXRlciQgPSB0aGlzLmluamVjdG9yLmdldDxSb3V0ZXI+KFJvdXRlcikuZXZlbnRzLnN1YnNjcmliZShlID0+IHtcbiAgICAgIGlmIChlIGluc3RhbmNlb2YgTmF2aWdhdGlvblN0YXJ0KSB7XG4gICAgICAgIGNvbnN0IHVybCA9IHRoaXMuY3VyVXJsO1xuICAgICAgICBpZiAodGhpcy5nZXRLZWVwaW5nU2Nyb2xsKHVybCwgdGhpcy5nZXRUcnV0aFJvdXRlKHRoaXMuc25hcHNob3QpKSkge1xuICAgICAgICAgIHRoaXMucG9zaXRpb25CdWZmZXJbdXJsXSA9IHRoaXMuc3MuZ2V0U2Nyb2xsUG9zaXRpb24odGhpcy5rZWVwaW5nU2Nyb2xsQ29udGFpbmVyKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBkZWxldGUgdGhpcy5wb3NpdGlvbkJ1ZmZlclt1cmxdO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGUgaW5zdGFuY2VvZiBOYXZpZ2F0aW9uRW5kKSB7XG4gICAgICAgIGNvbnN0IHVybCA9IHRoaXMuY3VyVXJsO1xuICAgICAgICBjb25zdCBpdGVtID0gdGhpcy5nZXQodXJsKTtcbiAgICAgICAgaWYgKGl0ZW0gJiYgaXRlbS5wb3NpdGlvbiAmJiB0aGlzLmdldEtlZXBpbmdTY3JvbGwodXJsLCB0aGlzLmdldFRydXRoUm91dGUodGhpcy5zbmFwc2hvdCkpKSB7XG4gICAgICAgICAgaWYgKHRoaXMuaXNEaXNhYmxlZEluUm91dGVyKSB7XG4gICAgICAgICAgICB0aGlzLnNzLnNjcm9sbFRvUG9zaXRpb24odGhpcy5rZWVwaW5nU2Nyb2xsQ29udGFpbmVyLCBpdGVtLnBvc2l0aW9uKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLnNzLnNjcm9sbFRvUG9zaXRpb24odGhpcy5rZWVwaW5nU2Nyb2xsQ29udGFpbmVyLCBpdGVtLnBvc2l0aW9uISksIDEpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLy8gI2VuZHJlZ2lvblxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIGNvbnN0IHsgX2NhY2hlZENoYW5nZSwgX3JvdXRlciQgfSA9IHRoaXM7XG4gICAgdGhpcy5jbGVhcigpO1xuICAgIHRoaXMuX2NhY2hlZCA9IFtdO1xuICAgIF9jYWNoZWRDaGFuZ2UuY29tcGxldGUoKTtcblxuICAgIGlmIChfcm91dGVyJCkge1xuICAgICAgX3JvdXRlciQudW5zdWJzY3JpYmUoKTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==