primeng 13.3.3 → 14.0.0-rc.1

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 (680) hide show
  1. package/accordion/accordion.d.ts +2 -2
  2. package/api/lazyloadevent.d.ts +2 -0
  3. package/api/primeicons.d.ts +2 -2
  4. package/api/shared.d.ts +3 -3
  5. package/autocomplete/autocomplete.d.ts +28 -19
  6. package/avatar/avatar.d.ts +1 -1
  7. package/avatargroup/avatargroup.d.ts +1 -1
  8. package/badge/badge.d.ts +2 -2
  9. package/blockui/blockui.d.ts +1 -1
  10. package/breadcrumb/breadcrumb.d.ts +1 -1
  11. package/button/button.d.ts +2 -2
  12. package/calendar/calendar.d.ts +9 -5
  13. package/captcha/captcha.d.ts +1 -1
  14. package/card/card.d.ts +1 -1
  15. package/carousel/carousel.d.ts +1 -1
  16. package/cascadeselect/cascadeselect.d.ts +6 -2
  17. package/chart/chart.d.ts +1 -1
  18. package/checkbox/checkbox.d.ts +1 -1
  19. package/chip/chip.d.ts +1 -1
  20. package/chips/chips.d.ts +4 -1
  21. package/codehighlighter/codehighlighter.d.ts +1 -1
  22. package/colorpicker/colorpicker.d.ts +1 -1
  23. package/confirmdialog/confirmdialog.d.ts +1 -1
  24. package/confirmpopup/confirmpopup.d.ts +1 -1
  25. package/contextmenu/contextmenu.d.ts +2 -2
  26. package/dataview/dataview.d.ts +2 -2
  27. package/defer/defer.d.ts +1 -1
  28. package/dialog/dialog.d.ts +1 -1
  29. package/divider/divider.d.ts +1 -1
  30. package/dock/dock.d.ts +1 -1
  31. package/dragdrop/dragdrop.d.ts +2 -2
  32. package/dropdown/dropdown.d.ts +23 -14
  33. package/dynamicdialog/dynamicdialog-config.d.ts +1 -0
  34. package/dynamicdialog/dynamicdialog.d.ts +1 -1
  35. package/dynamicdialog/dynamicdialogcontent.d.ts +1 -1
  36. package/editor/editor.d.ts +1 -1
  37. package/esm2020/accordion/accordion.mjs +18 -20
  38. package/esm2020/api/confirmationservice.mjs +3 -3
  39. package/esm2020/api/contextmenuservice.mjs +3 -3
  40. package/esm2020/api/filterservice.mjs +3 -3
  41. package/esm2020/api/lazyloadevent.mjs +1 -1
  42. package/esm2020/api/messageservice.mjs +3 -3
  43. package/esm2020/api/overlayservice.mjs +3 -3
  44. package/esm2020/api/primeicons.mjs +3 -3
  45. package/esm2020/api/primengconfig.mjs +3 -3
  46. package/esm2020/api/shared.mjs +14 -14
  47. package/esm2020/api/treedragdropservice.mjs +3 -3
  48. package/esm2020/autocomplete/autocomplete.mjs +186 -131
  49. package/esm2020/avatar/avatar.mjs +9 -9
  50. package/esm2020/avatargroup/avatargroup.mjs +9 -9
  51. package/esm2020/badge/badge.mjs +12 -12
  52. package/esm2020/blockui/blockui.mjs +9 -9
  53. package/esm2020/breadcrumb/breadcrumb.mjs +11 -11
  54. package/esm2020/button/button.mjs +14 -14
  55. package/esm2020/calendar/calendar.mjs +35 -16
  56. package/esm2020/captcha/captcha.mjs +8 -8
  57. package/esm2020/card/card.mjs +9 -9
  58. package/esm2020/carousel/carousel.mjs +9 -9
  59. package/esm2020/cascadeselect/cascadeselect.mjs +36 -17
  60. package/esm2020/chart/chart.mjs +8 -8
  61. package/esm2020/checkbox/checkbox.mjs +9 -9
  62. package/esm2020/chip/chip.mjs +9 -9
  63. package/esm2020/chips/chips.mjs +36 -17
  64. package/esm2020/codehighlighter/codehighlighter.mjs +8 -8
  65. package/esm2020/colorpicker/colorpicker.mjs +13 -10
  66. package/esm2020/confirmdialog/confirmdialog.mjs +13 -13
  67. package/esm2020/confirmpopup/confirmpopup.mjs +12 -10
  68. package/esm2020/contextmenu/contextmenu.mjs +20 -15
  69. package/esm2020/dataview/dataview.mjs +15 -15
  70. package/esm2020/defer/defer.mjs +8 -8
  71. package/esm2020/dialog/dialog.mjs +11 -11
  72. package/esm2020/divider/divider.mjs +9 -9
  73. package/esm2020/dock/dock.mjs +9 -9
  74. package/esm2020/dragdrop/dragdrop.mjs +11 -11
  75. package/esm2020/dropdown/dropdown.mjs +193 -161
  76. package/esm2020/dynamicdialog/dialogservice.mjs +3 -3
  77. package/esm2020/dynamicdialog/dynamicdialog-config.mjs +1 -1
  78. package/esm2020/dynamicdialog/dynamicdialog.mjs +11 -11
  79. package/esm2020/dynamicdialog/dynamicdialogcontent.mjs +3 -3
  80. package/esm2020/editor/editor.mjs +9 -9
  81. package/esm2020/fieldset/fieldset.mjs +16 -18
  82. package/esm2020/fileupload/fileupload.mjs +13 -13
  83. package/esm2020/focustrap/focustrap.mjs +8 -8
  84. package/esm2020/fullcalendar/fullcalendar.mjs +8 -8
  85. package/esm2020/galleria/galleria.mjs +25 -25
  86. package/esm2020/gmap/gmap.mjs +8 -8
  87. package/esm2020/image/image.mjs +43 -29
  88. package/esm2020/inplace/inplace.mjs +15 -15
  89. package/esm2020/inputmask/inputmask.mjs +38 -26
  90. package/esm2020/inputnumber/inputnumber.mjs +25 -11
  91. package/esm2020/inputswitch/inputswitch.mjs +9 -9
  92. package/esm2020/inputtext/inputtext.mjs +8 -8
  93. package/esm2020/inputtextarea/inputtextarea.mjs +8 -8
  94. package/esm2020/keyfilter/keyfilter.mjs +8 -8
  95. package/esm2020/knob/knob.mjs +9 -9
  96. package/esm2020/lightbox/lightbox.mjs +9 -9
  97. package/esm2020/listbox/listbox.mjs +49 -18
  98. package/esm2020/megamenu/megamenu.mjs +22 -12
  99. package/esm2020/menu/menu.mjs +23 -17
  100. package/esm2020/menubar/menubar.mjs +22 -18
  101. package/esm2020/message/message.mjs +9 -9
  102. package/esm2020/messages/messages.mjs +14 -14
  103. package/esm2020/multiselect/multiselect.mjs +212 -130
  104. package/esm2020/orderlist/orderlist.mjs +44 -18
  105. package/esm2020/organizationchart/organizationchart.mjs +13 -13
  106. package/esm2020/overlaypanel/overlaypanel.mjs +24 -10
  107. package/esm2020/paginator/paginator.mjs +14 -14
  108. package/esm2020/panel/panel.mjs +16 -18
  109. package/esm2020/panelmenu/panelmenu.mjs +36 -32
  110. package/esm2020/password/password.mjs +34 -16
  111. package/esm2020/picklist/picklist.mjs +86 -37
  112. package/esm2020/progressbar/progressbar.mjs +9 -9
  113. package/esm2020/progressspinner/progressspinner.mjs +9 -9
  114. package/esm2020/radiobutton/radiobutton.mjs +12 -12
  115. package/esm2020/rating/rating.mjs +9 -9
  116. package/esm2020/ripple/ripple.mjs +8 -8
  117. package/esm2020/scroller/primeng-scroller.mjs +5 -0
  118. package/esm2020/scroller/public_api.mjs +2 -0
  119. package/esm2020/scroller/scroller.mjs +739 -0
  120. package/esm2020/scrollpanel/scrollpanel.mjs +9 -9
  121. package/esm2020/scrolltop/scrolltop.mjs +9 -9
  122. package/esm2020/selectbutton/selectbutton.mjs +10 -10
  123. package/esm2020/sidebar/sidebar.mjs +10 -10
  124. package/esm2020/skeleton/skeleton.mjs +9 -9
  125. package/esm2020/slidemenu/slidemenu.mjs +22 -16
  126. package/esm2020/slider/slider.mjs +36 -21
  127. package/esm2020/speeddial/speeddial.mjs +11 -11
  128. package/esm2020/spinner/spinner.mjs +9 -9
  129. package/esm2020/splitbutton/splitbutton.mjs +12 -12
  130. package/esm2020/splitter/splitter.mjs +9 -9
  131. package/esm2020/steps/steps.mjs +9 -9
  132. package/esm2020/styleclass/styleclass.mjs +8 -8
  133. package/esm2020/table/table.mjs +269 -254
  134. package/esm2020/tabmenu/tabmenu.mjs +51 -13
  135. package/esm2020/tabview/tabview.mjs +15 -15
  136. package/esm2020/tag/tag.mjs +9 -9
  137. package/esm2020/terminal/terminal.mjs +9 -9
  138. package/esm2020/terminal/terminalservice.mjs +3 -3
  139. package/esm2020/tieredmenu/tieredmenu.mjs +29 -18
  140. package/esm2020/timeline/timeline.mjs +9 -9
  141. package/esm2020/toast/toast.mjs +14 -14
  142. package/esm2020/togglebutton/togglebutton.mjs +12 -12
  143. package/esm2020/toolbar/toolbar.mjs +9 -9
  144. package/esm2020/tooltip/tooltip.mjs +23 -12
  145. package/esm2020/tree/tree.mjs +113 -77
  146. package/esm2020/treeselect/treeselect.mjs +122 -37
  147. package/esm2020/treetable/treetable.mjs +180 -155
  148. package/esm2020/tristatecheckbox/tristatecheckbox.mjs +9 -9
  149. package/esm2020/virtualscroller/virtualscroller.mjs +58 -99
  150. package/fesm2015/primeng-accordion.mjs +17 -19
  151. package/fesm2015/primeng-accordion.mjs.map +1 -1
  152. package/fesm2015/primeng-api.mjs +36 -36
  153. package/fesm2015/primeng-api.mjs.map +1 -1
  154. package/fesm2015/primeng-autocomplete.mjs +187 -131
  155. package/fesm2015/primeng-autocomplete.mjs.map +1 -1
  156. package/fesm2015/primeng-avatar.mjs +8 -8
  157. package/fesm2015/primeng-avatar.mjs.map +1 -1
  158. package/fesm2015/primeng-avatargroup.mjs +8 -8
  159. package/fesm2015/primeng-avatargroup.mjs.map +1 -1
  160. package/fesm2015/primeng-badge.mjs +11 -11
  161. package/fesm2015/primeng-badge.mjs.map +1 -1
  162. package/fesm2015/primeng-blockui.mjs +8 -8
  163. package/fesm2015/primeng-blockui.mjs.map +1 -1
  164. package/fesm2015/primeng-breadcrumb.mjs +10 -10
  165. package/fesm2015/primeng-breadcrumb.mjs.map +1 -1
  166. package/fesm2015/primeng-button.mjs +13 -13
  167. package/fesm2015/primeng-button.mjs.map +1 -1
  168. package/fesm2015/primeng-calendar.mjs +34 -15
  169. package/fesm2015/primeng-calendar.mjs.map +1 -1
  170. package/fesm2015/primeng-captcha.mjs +7 -7
  171. package/fesm2015/primeng-captcha.mjs.map +1 -1
  172. package/fesm2015/primeng-card.mjs +8 -8
  173. package/fesm2015/primeng-card.mjs.map +1 -1
  174. package/fesm2015/primeng-carousel.mjs +8 -8
  175. package/fesm2015/primeng-carousel.mjs.map +1 -1
  176. package/fesm2015/primeng-cascadeselect.mjs +35 -16
  177. package/fesm2015/primeng-cascadeselect.mjs.map +1 -1
  178. package/fesm2015/primeng-chart.mjs +7 -7
  179. package/fesm2015/primeng-chart.mjs.map +1 -1
  180. package/fesm2015/primeng-checkbox.mjs +8 -8
  181. package/fesm2015/primeng-checkbox.mjs.map +1 -1
  182. package/fesm2015/primeng-chip.mjs +8 -8
  183. package/fesm2015/primeng-chip.mjs.map +1 -1
  184. package/fesm2015/primeng-chips.mjs +35 -16
  185. package/fesm2015/primeng-chips.mjs.map +1 -1
  186. package/fesm2015/primeng-codehighlighter.mjs +7 -7
  187. package/fesm2015/primeng-codehighlighter.mjs.map +1 -1
  188. package/fesm2015/primeng-colorpicker.mjs +12 -9
  189. package/fesm2015/primeng-colorpicker.mjs.map +1 -1
  190. package/fesm2015/primeng-confirmdialog.mjs +12 -12
  191. package/fesm2015/primeng-confirmdialog.mjs.map +1 -1
  192. package/fesm2015/primeng-confirmpopup.mjs +11 -9
  193. package/fesm2015/primeng-confirmpopup.mjs.map +1 -1
  194. package/fesm2015/primeng-contextmenu.mjs +19 -14
  195. package/fesm2015/primeng-contextmenu.mjs.map +1 -1
  196. package/fesm2015/primeng-dataview.mjs +14 -14
  197. package/fesm2015/primeng-dataview.mjs.map +1 -1
  198. package/fesm2015/primeng-defer.mjs +7 -7
  199. package/fesm2015/primeng-defer.mjs.map +1 -1
  200. package/fesm2015/primeng-dialog.mjs +10 -10
  201. package/fesm2015/primeng-dialog.mjs.map +1 -1
  202. package/fesm2015/primeng-divider.mjs +8 -8
  203. package/fesm2015/primeng-divider.mjs.map +1 -1
  204. package/fesm2015/primeng-dock.mjs +8 -8
  205. package/fesm2015/primeng-dock.mjs.map +1 -1
  206. package/fesm2015/primeng-dragdrop.mjs +10 -10
  207. package/fesm2015/primeng-dragdrop.mjs.map +1 -1
  208. package/fesm2015/primeng-dropdown.mjs +192 -160
  209. package/fesm2015/primeng-dropdown.mjs.map +1 -1
  210. package/fesm2015/primeng-dynamicdialog.mjs +16 -16
  211. package/fesm2015/primeng-dynamicdialog.mjs.map +1 -1
  212. package/fesm2015/primeng-editor.mjs +8 -8
  213. package/fesm2015/primeng-editor.mjs.map +1 -1
  214. package/fesm2015/primeng-fieldset.mjs +15 -17
  215. package/fesm2015/primeng-fieldset.mjs.map +1 -1
  216. package/fesm2015/primeng-fileupload.mjs +12 -12
  217. package/fesm2015/primeng-fileupload.mjs.map +1 -1
  218. package/fesm2015/primeng-focustrap.mjs +7 -7
  219. package/fesm2015/primeng-focustrap.mjs.map +1 -1
  220. package/fesm2015/primeng-fullcalendar.mjs +7 -7
  221. package/fesm2015/primeng-fullcalendar.mjs.map +1 -1
  222. package/fesm2015/primeng-galleria.mjs +24 -24
  223. package/fesm2015/primeng-galleria.mjs.map +1 -1
  224. package/fesm2015/primeng-gmap.mjs +7 -7
  225. package/fesm2015/primeng-gmap.mjs.map +1 -1
  226. package/fesm2015/primeng-image.mjs +42 -28
  227. package/fesm2015/primeng-image.mjs.map +1 -1
  228. package/fesm2015/primeng-inplace.mjs +14 -14
  229. package/fesm2015/primeng-inplace.mjs.map +1 -1
  230. package/fesm2015/primeng-inputmask.mjs +37 -25
  231. package/fesm2015/primeng-inputmask.mjs.map +1 -1
  232. package/fesm2015/primeng-inputnumber.mjs +24 -10
  233. package/fesm2015/primeng-inputnumber.mjs.map +1 -1
  234. package/fesm2015/primeng-inputswitch.mjs +8 -8
  235. package/fesm2015/primeng-inputswitch.mjs.map +1 -1
  236. package/fesm2015/primeng-inputtext.mjs +7 -7
  237. package/fesm2015/primeng-inputtext.mjs.map +1 -1
  238. package/fesm2015/primeng-inputtextarea.mjs +7 -7
  239. package/fesm2015/primeng-inputtextarea.mjs.map +1 -1
  240. package/fesm2015/primeng-keyfilter.mjs +7 -7
  241. package/fesm2015/primeng-keyfilter.mjs.map +1 -1
  242. package/fesm2015/primeng-knob.mjs +8 -8
  243. package/fesm2015/primeng-knob.mjs.map +1 -1
  244. package/fesm2015/primeng-lightbox.mjs +8 -8
  245. package/fesm2015/primeng-lightbox.mjs.map +1 -1
  246. package/fesm2015/primeng-listbox.mjs +48 -17
  247. package/fesm2015/primeng-listbox.mjs.map +1 -1
  248. package/fesm2015/primeng-megamenu.mjs +21 -11
  249. package/fesm2015/primeng-megamenu.mjs.map +1 -1
  250. package/fesm2015/primeng-menu.mjs +22 -16
  251. package/fesm2015/primeng-menu.mjs.map +1 -1
  252. package/fesm2015/primeng-menubar.mjs +21 -17
  253. package/fesm2015/primeng-menubar.mjs.map +1 -1
  254. package/fesm2015/primeng-message.mjs +8 -8
  255. package/fesm2015/primeng-message.mjs.map +1 -1
  256. package/fesm2015/primeng-messages.mjs +13 -13
  257. package/fesm2015/primeng-messages.mjs.map +1 -1
  258. package/fesm2015/primeng-multiselect.mjs +212 -129
  259. package/fesm2015/primeng-multiselect.mjs.map +1 -1
  260. package/fesm2015/primeng-orderlist.mjs +43 -17
  261. package/fesm2015/primeng-orderlist.mjs.map +1 -1
  262. package/fesm2015/primeng-organizationchart.mjs +12 -12
  263. package/fesm2015/primeng-organizationchart.mjs.map +1 -1
  264. package/fesm2015/primeng-overlaypanel.mjs +23 -9
  265. package/fesm2015/primeng-overlaypanel.mjs.map +1 -1
  266. package/fesm2015/primeng-paginator.mjs +13 -13
  267. package/fesm2015/primeng-paginator.mjs.map +1 -1
  268. package/fesm2015/primeng-panel.mjs +15 -17
  269. package/fesm2015/primeng-panel.mjs.map +1 -1
  270. package/fesm2015/primeng-panelmenu.mjs +35 -31
  271. package/fesm2015/primeng-panelmenu.mjs.map +1 -1
  272. package/fesm2015/primeng-password.mjs +33 -15
  273. package/fesm2015/primeng-password.mjs.map +1 -1
  274. package/fesm2015/primeng-picklist.mjs +85 -36
  275. package/fesm2015/primeng-picklist.mjs.map +1 -1
  276. package/fesm2015/primeng-progressbar.mjs +8 -8
  277. package/fesm2015/primeng-progressbar.mjs.map +1 -1
  278. package/fesm2015/primeng-progressspinner.mjs +8 -8
  279. package/fesm2015/primeng-progressspinner.mjs.map +1 -1
  280. package/fesm2015/primeng-radiobutton.mjs +11 -11
  281. package/fesm2015/primeng-radiobutton.mjs.map +1 -1
  282. package/fesm2015/primeng-rating.mjs +8 -8
  283. package/fesm2015/primeng-rating.mjs.map +1 -1
  284. package/fesm2015/primeng-ripple.mjs +7 -7
  285. package/fesm2015/primeng-ripple.mjs.map +1 -1
  286. package/fesm2015/primeng-scroller.mjs +744 -0
  287. package/fesm2015/primeng-scroller.mjs.map +1 -0
  288. package/fesm2015/primeng-scrollpanel.mjs +8 -8
  289. package/fesm2015/primeng-scrollpanel.mjs.map +1 -1
  290. package/fesm2015/primeng-scrolltop.mjs +8 -8
  291. package/fesm2015/primeng-scrolltop.mjs.map +1 -1
  292. package/fesm2015/primeng-selectbutton.mjs +9 -9
  293. package/fesm2015/primeng-selectbutton.mjs.map +1 -1
  294. package/fesm2015/primeng-sidebar.mjs +9 -9
  295. package/fesm2015/primeng-sidebar.mjs.map +1 -1
  296. package/fesm2015/primeng-skeleton.mjs +8 -8
  297. package/fesm2015/primeng-skeleton.mjs.map +1 -1
  298. package/fesm2015/primeng-slidemenu.mjs +21 -15
  299. package/fesm2015/primeng-slidemenu.mjs.map +1 -1
  300. package/fesm2015/primeng-slider.mjs +35 -20
  301. package/fesm2015/primeng-slider.mjs.map +1 -1
  302. package/fesm2015/primeng-speeddial.mjs +10 -10
  303. package/fesm2015/primeng-speeddial.mjs.map +1 -1
  304. package/fesm2015/primeng-spinner.mjs +8 -8
  305. package/fesm2015/primeng-spinner.mjs.map +1 -1
  306. package/fesm2015/primeng-splitbutton.mjs +11 -11
  307. package/fesm2015/primeng-splitbutton.mjs.map +1 -1
  308. package/fesm2015/primeng-splitter.mjs +8 -8
  309. package/fesm2015/primeng-splitter.mjs.map +1 -1
  310. package/fesm2015/primeng-steps.mjs +8 -8
  311. package/fesm2015/primeng-steps.mjs.map +1 -1
  312. package/fesm2015/primeng-styleclass.mjs +7 -7
  313. package/fesm2015/primeng-styleclass.mjs.map +1 -1
  314. package/fesm2015/primeng-table.mjs +264 -253
  315. package/fesm2015/primeng-table.mjs.map +1 -1
  316. package/fesm2015/primeng-tabmenu.mjs +50 -12
  317. package/fesm2015/primeng-tabmenu.mjs.map +1 -1
  318. package/fesm2015/primeng-tabview.mjs +14 -14
  319. package/fesm2015/primeng-tabview.mjs.map +1 -1
  320. package/fesm2015/primeng-tag.mjs +8 -8
  321. package/fesm2015/primeng-tag.mjs.map +1 -1
  322. package/fesm2015/primeng-terminal.mjs +11 -11
  323. package/fesm2015/primeng-terminal.mjs.map +1 -1
  324. package/fesm2015/primeng-tieredmenu.mjs +28 -17
  325. package/fesm2015/primeng-tieredmenu.mjs.map +1 -1
  326. package/fesm2015/primeng-timeline.mjs +8 -8
  327. package/fesm2015/primeng-timeline.mjs.map +1 -1
  328. package/fesm2015/primeng-toast.mjs +13 -13
  329. package/fesm2015/primeng-toast.mjs.map +1 -1
  330. package/fesm2015/primeng-togglebutton.mjs +11 -11
  331. package/fesm2015/primeng-togglebutton.mjs.map +1 -1
  332. package/fesm2015/primeng-toolbar.mjs +8 -8
  333. package/fesm2015/primeng-toolbar.mjs.map +1 -1
  334. package/fesm2015/primeng-tooltip.mjs +22 -11
  335. package/fesm2015/primeng-tooltip.mjs.map +1 -1
  336. package/fesm2015/primeng-tree.mjs +112 -76
  337. package/fesm2015/primeng-tree.mjs.map +1 -1
  338. package/fesm2015/primeng-treeselect.mjs +121 -36
  339. package/fesm2015/primeng-treeselect.mjs.map +1 -1
  340. package/fesm2015/primeng-treetable.mjs +175 -154
  341. package/fesm2015/primeng-treetable.mjs.map +1 -1
  342. package/fesm2015/primeng-tristatecheckbox.mjs +8 -8
  343. package/fesm2015/primeng-tristatecheckbox.mjs.map +1 -1
  344. package/fesm2015/primeng-virtualscroller.mjs +53 -97
  345. package/fesm2015/primeng-virtualscroller.mjs.map +1 -1
  346. package/fesm2020/primeng-accordion.mjs +17 -19
  347. package/fesm2020/primeng-accordion.mjs.map +1 -1
  348. package/fesm2020/primeng-api.mjs +36 -36
  349. package/fesm2020/primeng-api.mjs.map +1 -1
  350. package/fesm2020/primeng-autocomplete.mjs +186 -131
  351. package/fesm2020/primeng-autocomplete.mjs.map +1 -1
  352. package/fesm2020/primeng-avatar.mjs +8 -8
  353. package/fesm2020/primeng-avatar.mjs.map +1 -1
  354. package/fesm2020/primeng-avatargroup.mjs +8 -8
  355. package/fesm2020/primeng-avatargroup.mjs.map +1 -1
  356. package/fesm2020/primeng-badge.mjs +11 -11
  357. package/fesm2020/primeng-badge.mjs.map +1 -1
  358. package/fesm2020/primeng-blockui.mjs +8 -8
  359. package/fesm2020/primeng-blockui.mjs.map +1 -1
  360. package/fesm2020/primeng-breadcrumb.mjs +10 -10
  361. package/fesm2020/primeng-breadcrumb.mjs.map +1 -1
  362. package/fesm2020/primeng-button.mjs +13 -13
  363. package/fesm2020/primeng-button.mjs.map +1 -1
  364. package/fesm2020/primeng-calendar.mjs +34 -15
  365. package/fesm2020/primeng-calendar.mjs.map +1 -1
  366. package/fesm2020/primeng-captcha.mjs +7 -7
  367. package/fesm2020/primeng-captcha.mjs.map +1 -1
  368. package/fesm2020/primeng-card.mjs +8 -8
  369. package/fesm2020/primeng-card.mjs.map +1 -1
  370. package/fesm2020/primeng-carousel.mjs +8 -8
  371. package/fesm2020/primeng-carousel.mjs.map +1 -1
  372. package/fesm2020/primeng-cascadeselect.mjs +35 -16
  373. package/fesm2020/primeng-cascadeselect.mjs.map +1 -1
  374. package/fesm2020/primeng-chart.mjs +7 -7
  375. package/fesm2020/primeng-chart.mjs.map +1 -1
  376. package/fesm2020/primeng-checkbox.mjs +8 -8
  377. package/fesm2020/primeng-checkbox.mjs.map +1 -1
  378. package/fesm2020/primeng-chip.mjs +8 -8
  379. package/fesm2020/primeng-chip.mjs.map +1 -1
  380. package/fesm2020/primeng-chips.mjs +35 -16
  381. package/fesm2020/primeng-chips.mjs.map +1 -1
  382. package/fesm2020/primeng-codehighlighter.mjs +7 -7
  383. package/fesm2020/primeng-codehighlighter.mjs.map +1 -1
  384. package/fesm2020/primeng-colorpicker.mjs +12 -9
  385. package/fesm2020/primeng-colorpicker.mjs.map +1 -1
  386. package/fesm2020/primeng-confirmdialog.mjs +12 -12
  387. package/fesm2020/primeng-confirmdialog.mjs.map +1 -1
  388. package/fesm2020/primeng-confirmpopup.mjs +11 -9
  389. package/fesm2020/primeng-confirmpopup.mjs.map +1 -1
  390. package/fesm2020/primeng-contextmenu.mjs +19 -14
  391. package/fesm2020/primeng-contextmenu.mjs.map +1 -1
  392. package/fesm2020/primeng-dataview.mjs +14 -14
  393. package/fesm2020/primeng-dataview.mjs.map +1 -1
  394. package/fesm2020/primeng-defer.mjs +7 -7
  395. package/fesm2020/primeng-defer.mjs.map +1 -1
  396. package/fesm2020/primeng-dialog.mjs +10 -10
  397. package/fesm2020/primeng-dialog.mjs.map +1 -1
  398. package/fesm2020/primeng-divider.mjs +8 -8
  399. package/fesm2020/primeng-divider.mjs.map +1 -1
  400. package/fesm2020/primeng-dock.mjs +8 -8
  401. package/fesm2020/primeng-dock.mjs.map +1 -1
  402. package/fesm2020/primeng-dragdrop.mjs +10 -10
  403. package/fesm2020/primeng-dragdrop.mjs.map +1 -1
  404. package/fesm2020/primeng-dropdown.mjs +192 -160
  405. package/fesm2020/primeng-dropdown.mjs.map +1 -1
  406. package/fesm2020/primeng-dynamicdialog.mjs +16 -16
  407. package/fesm2020/primeng-dynamicdialog.mjs.map +1 -1
  408. package/fesm2020/primeng-editor.mjs +8 -8
  409. package/fesm2020/primeng-editor.mjs.map +1 -1
  410. package/fesm2020/primeng-fieldset.mjs +15 -17
  411. package/fesm2020/primeng-fieldset.mjs.map +1 -1
  412. package/fesm2020/primeng-fileupload.mjs +12 -12
  413. package/fesm2020/primeng-fileupload.mjs.map +1 -1
  414. package/fesm2020/primeng-focustrap.mjs +7 -7
  415. package/fesm2020/primeng-focustrap.mjs.map +1 -1
  416. package/fesm2020/primeng-fullcalendar.mjs +7 -7
  417. package/fesm2020/primeng-fullcalendar.mjs.map +1 -1
  418. package/fesm2020/primeng-galleria.mjs +24 -24
  419. package/fesm2020/primeng-galleria.mjs.map +1 -1
  420. package/fesm2020/primeng-gmap.mjs +7 -7
  421. package/fesm2020/primeng-gmap.mjs.map +1 -1
  422. package/fesm2020/primeng-image.mjs +42 -28
  423. package/fesm2020/primeng-image.mjs.map +1 -1
  424. package/fesm2020/primeng-inplace.mjs +14 -14
  425. package/fesm2020/primeng-inplace.mjs.map +1 -1
  426. package/fesm2020/primeng-inputmask.mjs +37 -25
  427. package/fesm2020/primeng-inputmask.mjs.map +1 -1
  428. package/fesm2020/primeng-inputnumber.mjs +24 -10
  429. package/fesm2020/primeng-inputnumber.mjs.map +1 -1
  430. package/fesm2020/primeng-inputswitch.mjs +8 -8
  431. package/fesm2020/primeng-inputswitch.mjs.map +1 -1
  432. package/fesm2020/primeng-inputtext.mjs +7 -7
  433. package/fesm2020/primeng-inputtext.mjs.map +1 -1
  434. package/fesm2020/primeng-inputtextarea.mjs +7 -7
  435. package/fesm2020/primeng-inputtextarea.mjs.map +1 -1
  436. package/fesm2020/primeng-keyfilter.mjs +7 -7
  437. package/fesm2020/primeng-keyfilter.mjs.map +1 -1
  438. package/fesm2020/primeng-knob.mjs +8 -8
  439. package/fesm2020/primeng-knob.mjs.map +1 -1
  440. package/fesm2020/primeng-lightbox.mjs +8 -8
  441. package/fesm2020/primeng-lightbox.mjs.map +1 -1
  442. package/fesm2020/primeng-listbox.mjs +48 -17
  443. package/fesm2020/primeng-listbox.mjs.map +1 -1
  444. package/fesm2020/primeng-megamenu.mjs +21 -11
  445. package/fesm2020/primeng-megamenu.mjs.map +1 -1
  446. package/fesm2020/primeng-menu.mjs +22 -16
  447. package/fesm2020/primeng-menu.mjs.map +1 -1
  448. package/fesm2020/primeng-menubar.mjs +21 -17
  449. package/fesm2020/primeng-menubar.mjs.map +1 -1
  450. package/fesm2020/primeng-message.mjs +8 -8
  451. package/fesm2020/primeng-message.mjs.map +1 -1
  452. package/fesm2020/primeng-messages.mjs +13 -13
  453. package/fesm2020/primeng-messages.mjs.map +1 -1
  454. package/fesm2020/primeng-multiselect.mjs +211 -129
  455. package/fesm2020/primeng-multiselect.mjs.map +1 -1
  456. package/fesm2020/primeng-orderlist.mjs +43 -17
  457. package/fesm2020/primeng-orderlist.mjs.map +1 -1
  458. package/fesm2020/primeng-organizationchart.mjs +12 -12
  459. package/fesm2020/primeng-organizationchart.mjs.map +1 -1
  460. package/fesm2020/primeng-overlaypanel.mjs +23 -9
  461. package/fesm2020/primeng-overlaypanel.mjs.map +1 -1
  462. package/fesm2020/primeng-paginator.mjs +13 -13
  463. package/fesm2020/primeng-paginator.mjs.map +1 -1
  464. package/fesm2020/primeng-panel.mjs +15 -17
  465. package/fesm2020/primeng-panel.mjs.map +1 -1
  466. package/fesm2020/primeng-panelmenu.mjs +35 -31
  467. package/fesm2020/primeng-panelmenu.mjs.map +1 -1
  468. package/fesm2020/primeng-password.mjs +33 -15
  469. package/fesm2020/primeng-password.mjs.map +1 -1
  470. package/fesm2020/primeng-picklist.mjs +85 -36
  471. package/fesm2020/primeng-picklist.mjs.map +1 -1
  472. package/fesm2020/primeng-progressbar.mjs +8 -8
  473. package/fesm2020/primeng-progressbar.mjs.map +1 -1
  474. package/fesm2020/primeng-progressspinner.mjs +8 -8
  475. package/fesm2020/primeng-progressspinner.mjs.map +1 -1
  476. package/fesm2020/primeng-radiobutton.mjs +11 -11
  477. package/fesm2020/primeng-radiobutton.mjs.map +1 -1
  478. package/fesm2020/primeng-rating.mjs +8 -8
  479. package/fesm2020/primeng-rating.mjs.map +1 -1
  480. package/fesm2020/primeng-ripple.mjs +7 -7
  481. package/fesm2020/primeng-ripple.mjs.map +1 -1
  482. package/fesm2020/primeng-scroller.mjs +746 -0
  483. package/fesm2020/primeng-scroller.mjs.map +1 -0
  484. package/fesm2020/primeng-scrollpanel.mjs +8 -8
  485. package/fesm2020/primeng-scrollpanel.mjs.map +1 -1
  486. package/fesm2020/primeng-scrolltop.mjs +8 -8
  487. package/fesm2020/primeng-scrolltop.mjs.map +1 -1
  488. package/fesm2020/primeng-selectbutton.mjs +9 -9
  489. package/fesm2020/primeng-selectbutton.mjs.map +1 -1
  490. package/fesm2020/primeng-sidebar.mjs +9 -9
  491. package/fesm2020/primeng-sidebar.mjs.map +1 -1
  492. package/fesm2020/primeng-skeleton.mjs +8 -8
  493. package/fesm2020/primeng-skeleton.mjs.map +1 -1
  494. package/fesm2020/primeng-slidemenu.mjs +21 -15
  495. package/fesm2020/primeng-slidemenu.mjs.map +1 -1
  496. package/fesm2020/primeng-slider.mjs +35 -20
  497. package/fesm2020/primeng-slider.mjs.map +1 -1
  498. package/fesm2020/primeng-speeddial.mjs +10 -10
  499. package/fesm2020/primeng-speeddial.mjs.map +1 -1
  500. package/fesm2020/primeng-spinner.mjs +8 -8
  501. package/fesm2020/primeng-spinner.mjs.map +1 -1
  502. package/fesm2020/primeng-splitbutton.mjs +11 -11
  503. package/fesm2020/primeng-splitbutton.mjs.map +1 -1
  504. package/fesm2020/primeng-splitter.mjs +8 -8
  505. package/fesm2020/primeng-splitter.mjs.map +1 -1
  506. package/fesm2020/primeng-steps.mjs +8 -8
  507. package/fesm2020/primeng-steps.mjs.map +1 -1
  508. package/fesm2020/primeng-styleclass.mjs +7 -7
  509. package/fesm2020/primeng-styleclass.mjs.map +1 -1
  510. package/fesm2020/primeng-table.mjs +268 -253
  511. package/fesm2020/primeng-table.mjs.map +1 -1
  512. package/fesm2020/primeng-tabmenu.mjs +50 -12
  513. package/fesm2020/primeng-tabmenu.mjs.map +1 -1
  514. package/fesm2020/primeng-tabview.mjs +14 -14
  515. package/fesm2020/primeng-tabview.mjs.map +1 -1
  516. package/fesm2020/primeng-tag.mjs +8 -8
  517. package/fesm2020/primeng-tag.mjs.map +1 -1
  518. package/fesm2020/primeng-terminal.mjs +11 -11
  519. package/fesm2020/primeng-terminal.mjs.map +1 -1
  520. package/fesm2020/primeng-tieredmenu.mjs +28 -17
  521. package/fesm2020/primeng-tieredmenu.mjs.map +1 -1
  522. package/fesm2020/primeng-timeline.mjs +8 -8
  523. package/fesm2020/primeng-timeline.mjs.map +1 -1
  524. package/fesm2020/primeng-toast.mjs +13 -13
  525. package/fesm2020/primeng-toast.mjs.map +1 -1
  526. package/fesm2020/primeng-togglebutton.mjs +11 -11
  527. package/fesm2020/primeng-togglebutton.mjs.map +1 -1
  528. package/fesm2020/primeng-toolbar.mjs +8 -8
  529. package/fesm2020/primeng-toolbar.mjs.map +1 -1
  530. package/fesm2020/primeng-tooltip.mjs +22 -11
  531. package/fesm2020/primeng-tooltip.mjs.map +1 -1
  532. package/fesm2020/primeng-tree.mjs +112 -76
  533. package/fesm2020/primeng-tree.mjs.map +1 -1
  534. package/fesm2020/primeng-treeselect.mjs +121 -36
  535. package/fesm2020/primeng-treeselect.mjs.map +1 -1
  536. package/fesm2020/primeng-treetable.mjs +179 -154
  537. package/fesm2020/primeng-treetable.mjs.map +1 -1
  538. package/fesm2020/primeng-tristatecheckbox.mjs +8 -8
  539. package/fesm2020/primeng-tristatecheckbox.mjs.map +1 -1
  540. package/fesm2020/primeng-virtualscroller.mjs +56 -97
  541. package/fesm2020/primeng-virtualscroller.mjs.map +1 -1
  542. package/fieldset/fieldset.d.ts +1 -1
  543. package/fileupload/fileupload.d.ts +1 -1
  544. package/focustrap/focustrap.d.ts +1 -1
  545. package/fullcalendar/fullcalendar.d.ts +1 -1
  546. package/galleria/galleria.d.ts +5 -5
  547. package/gmap/gmap.d.ts +1 -1
  548. package/image/image.d.ts +6 -2
  549. package/inplace/inplace.d.ts +3 -3
  550. package/inputmask/inputmask.d.ts +4 -1
  551. package/inputnumber/inputnumber.d.ts +4 -1
  552. package/inputswitch/inputswitch.d.ts +1 -1
  553. package/inputtext/inputtext.d.ts +1 -1
  554. package/inputtextarea/inputtextarea.d.ts +1 -1
  555. package/keyfilter/keyfilter.d.ts +1 -1
  556. package/knob/knob.d.ts +1 -1
  557. package/lightbox/lightbox.d.ts +1 -1
  558. package/listbox/listbox.d.ts +10 -1
  559. package/megamenu/megamenu.d.ts +1 -1
  560. package/menu/menu.d.ts +2 -2
  561. package/menubar/menubar.d.ts +4 -3
  562. package/message/message.d.ts +1 -1
  563. package/messages/messages.d.ts +1 -1
  564. package/multiselect/multiselect.d.ts +28 -8
  565. package/orderlist/orderlist.d.ts +9 -1
  566. package/organizationchart/organizationchart.d.ts +2 -2
  567. package/overlaypanel/overlaypanel.d.ts +2 -1
  568. package/package.json +12 -4
  569. package/paginator/paginator.d.ts +1 -1
  570. package/panel/panel.d.ts +1 -1
  571. package/panelmenu/panelmenu.d.ts +2 -2
  572. package/password/password.d.ts +5 -2
  573. package/picklist/picklist.d.ts +14 -2
  574. package/progressbar/progressbar.d.ts +1 -1
  575. package/progressspinner/progressspinner.d.ts +1 -1
  576. package/radiobutton/radiobutton.d.ts +1 -1
  577. package/rating/rating.d.ts +1 -1
  578. package/resources/components/accordion/accordion.css +8 -0
  579. package/resources/components/autocomplete/autocomplete.css +11 -0
  580. package/resources/components/button/button.css +0 -4
  581. package/resources/components/calendar/calendar.css +11 -0
  582. package/resources/components/cascadeselect/cascadeselect.css +11 -0
  583. package/resources/components/chips/chips.css +12 -1
  584. package/resources/components/fieldset/fieldset.css +8 -0
  585. package/resources/components/image/image.css +5 -0
  586. package/resources/components/inputmask/inputmask.css +10 -0
  587. package/resources/components/inputnumber/inputnumber.css +11 -0
  588. package/resources/components/inputtext/inputtext.css +16 -1
  589. package/resources/components/megamenu/megamenu.css +5 -0
  590. package/resources/components/menu/menu.css +5 -0
  591. package/resources/components/messages/messages.css +4 -0
  592. package/resources/components/multiselect/multiselect.css +11 -0
  593. package/resources/components/orderlist/orderlist.css +1 -0
  594. package/resources/components/panel/panel.css +8 -0
  595. package/resources/components/panelmenu/panelmenu.css +10 -0
  596. package/resources/components/password/password.css +11 -0
  597. package/resources/components/scroller/scroller.css +51 -0
  598. package/resources/components/table/table.css +12 -5
  599. package/resources/components/tree/tree.css +6 -1
  600. package/resources/components/treeselect/treeselect.css +48 -0
  601. package/resources/components/treetable/treetable.css +11 -1
  602. package/resources/primeng.css +26 -5
  603. package/resources/primeng.min.css +1 -1
  604. package/resources/themes/arya-blue/theme.css +241 -13
  605. package/resources/themes/arya-green/theme.css +241 -13
  606. package/resources/themes/arya-orange/theme.css +241 -13
  607. package/resources/themes/arya-purple/theme.css +241 -13
  608. package/resources/themes/bootstrap4-dark-blue/theme.css +241 -13
  609. package/resources/themes/bootstrap4-dark-purple/theme.css +241 -13
  610. package/resources/themes/bootstrap4-light-blue/theme.css +240 -12
  611. package/resources/themes/bootstrap4-light-purple/theme.css +240 -12
  612. package/resources/themes/fluent-light/theme.css +241 -13
  613. package/resources/themes/lara-dark-blue/theme.css +241 -13
  614. package/resources/themes/lara-dark-indigo/theme.css +241 -13
  615. package/resources/themes/lara-dark-purple/theme.css +241 -13
  616. package/resources/themes/lara-dark-teal/theme.css +241 -13
  617. package/resources/themes/lara-light-blue/theme.css +241 -13
  618. package/resources/themes/lara-light-indigo/theme.css +241 -13
  619. package/resources/themes/lara-light-purple/theme.css +241 -13
  620. package/resources/themes/lara-light-teal/theme.css +241 -13
  621. package/resources/themes/luna-amber/theme.css +241 -13
  622. package/resources/themes/luna-blue/theme.css +241 -13
  623. package/resources/themes/luna-green/theme.css +241 -13
  624. package/resources/themes/luna-pink/theme.css +241 -13
  625. package/resources/themes/md-dark-deeppurple/theme.css +241 -13
  626. package/resources/themes/md-dark-indigo/theme.css +241 -13
  627. package/resources/themes/md-light-deeppurple/theme.css +241 -13
  628. package/resources/themes/md-light-indigo/theme.css +241 -13
  629. package/resources/themes/mdc-dark-deeppurple/theme.css +241 -13
  630. package/resources/themes/mdc-dark-indigo/theme.css +241 -13
  631. package/resources/themes/mdc-light-deeppurple/theme.css +241 -13
  632. package/resources/themes/mdc-light-indigo/theme.css +241 -13
  633. package/resources/themes/nova/theme.css +242 -14
  634. package/resources/themes/nova-accent/theme.css +242 -14
  635. package/resources/themes/nova-alt/theme.css +242 -14
  636. package/resources/themes/rhea/theme.css +242 -14
  637. package/resources/themes/saga-blue/theme.css +241 -13
  638. package/resources/themes/saga-green/theme.css +241 -13
  639. package/resources/themes/saga-orange/theme.css +241 -13
  640. package/resources/themes/saga-purple/theme.css +241 -13
  641. package/resources/themes/tailwind-light/theme.css +241 -13
  642. package/resources/themes/vela-blue/theme.css +241 -13
  643. package/resources/themes/vela-green/theme.css +241 -13
  644. package/resources/themes/vela-orange/theme.css +241 -13
  645. package/resources/themes/vela-purple/theme.css +241 -13
  646. package/ripple/ripple.d.ts +1 -1
  647. package/scroller/package.json +10 -0
  648. package/scroller/primeng-scroller.d.ts +5 -0
  649. package/scroller/public_api.d.ts +1 -0
  650. package/scroller/scroller.d.ts +223 -0
  651. package/scrollpanel/scrollpanel.d.ts +1 -1
  652. package/scrolltop/scrolltop.d.ts +1 -1
  653. package/selectbutton/selectbutton.d.ts +1 -1
  654. package/sidebar/sidebar.d.ts +1 -1
  655. package/skeleton/skeleton.d.ts +1 -1
  656. package/slidemenu/slidemenu.d.ts +2 -2
  657. package/slider/slider.d.ts +6 -1
  658. package/speeddial/speeddial.d.ts +1 -1
  659. package/spinner/spinner.d.ts +1 -1
  660. package/splitbutton/splitbutton.d.ts +1 -1
  661. package/splitter/splitter.d.ts +1 -1
  662. package/steps/steps.d.ts +1 -1
  663. package/styleclass/styleclass.d.ts +1 -1
  664. package/table/table.d.ts +49 -45
  665. package/tabmenu/tabmenu.d.ts +9 -4
  666. package/tabview/tabview.d.ts +2 -2
  667. package/tag/tag.d.ts +1 -1
  668. package/terminal/terminal.d.ts +1 -1
  669. package/tieredmenu/tieredmenu.d.ts +3 -3
  670. package/timeline/timeline.d.ts +1 -1
  671. package/toast/toast.d.ts +2 -2
  672. package/togglebutton/togglebutton.d.ts +1 -1
  673. package/toolbar/toolbar.d.ts +1 -1
  674. package/tooltip/tooltip.d.ts +3 -1
  675. package/tree/tree.d.ts +24 -18
  676. package/treeselect/treeselect.d.ts +21 -2
  677. package/treetable/treetable.d.ts +33 -25
  678. package/tristatecheckbox/tristatecheckbox.d.ts +1 -1
  679. package/virtualscroller/virtualscroller.d.ts +12 -27
  680. package/resources/components/virtualscroller/virtualscroller.css +0 -3
@@ -0,0 +1,739 @@
1
+ import { NgModule, Component, Input, ViewChild, ChangeDetectionStrategy, ViewEncapsulation, ContentChildren, Output, EventEmitter } from '@angular/core';
2
+ import { CommonModule } from '@angular/common';
3
+ import { DomHandler } from 'primeng/dom';
4
+ import { PrimeTemplate } from 'primeng/api';
5
+ import * as i0 from "@angular/core";
6
+ import * as i1 from "@angular/common";
7
+ export class Scroller {
8
+ constructor(cd, zone) {
9
+ this.cd = cd;
10
+ this.zone = zone;
11
+ this.onLazyLoad = new EventEmitter();
12
+ this.onScroll = new EventEmitter();
13
+ this.onScrollIndexChange = new EventEmitter();
14
+ this._tabindex = 0;
15
+ this._itemSize = 0;
16
+ this._orientation = 'vertical';
17
+ this._delay = 0;
18
+ this._resizeDelay = 10;
19
+ this._lazy = false;
20
+ this._disabled = false;
21
+ this._loaderDisabled = false;
22
+ this._showSpacer = true;
23
+ this._showLoader = false;
24
+ this._autoSize = false;
25
+ this.d_loading = false;
26
+ this.first = 0;
27
+ this.last = 0;
28
+ this.numItemsInViewport = 0;
29
+ this.lastScrollPos = 0;
30
+ this.loaderArr = [];
31
+ this.spacerStyle = {};
32
+ this.contentStyle = {};
33
+ this.initialized = false;
34
+ if (!this._disabled) {
35
+ this.zone.runOutsideAngular(() => {
36
+ this.windowResizeListener = this.onWindowResize.bind(this);
37
+ window.addEventListener('resize', this.windowResizeListener);
38
+ window.addEventListener('orientationchange', this.windowResizeListener);
39
+ });
40
+ }
41
+ }
42
+ get id() { return this._id; }
43
+ set id(val) { this._id = val; }
44
+ get style() { return this._style; }
45
+ set style(val) { this._style = val; }
46
+ get styleClass() { return this._styleClass; }
47
+ set styleClass(val) { this._styleClass = val; }
48
+ get tabindex() { return this._tabindex; }
49
+ set tabindex(val) { this._tabindex = val; }
50
+ get items() { return this._items; }
51
+ set items(val) { this._items = val; }
52
+ get itemSize() { return this._itemSize; }
53
+ set itemSize(val) { this._itemSize = val; }
54
+ get scrollHeight() { return this._scrollHeight; }
55
+ set scrollHeight(val) { this._scrollHeight = val; }
56
+ get scrollWidth() { return this._scrollWidth; }
57
+ set scrollWidth(val) { this._scrollWidth = val; }
58
+ get orientation() { return this._orientation; }
59
+ set orientation(val) { this._orientation = val; }
60
+ get delay() { return this._delay; }
61
+ set delay(val) { this._delay = val; }
62
+ get resizeDelay() { return this._resizeDelay; }
63
+ set resizeDelay(val) { this._resizeDelay = val; }
64
+ get lazy() { return this._lazy; }
65
+ set lazy(val) { this._lazy = val; }
66
+ get disabled() { return this._disabled; }
67
+ set disabled(val) { this._disabled = val; }
68
+ get loaderDisabled() { return this._loaderDisabled; }
69
+ set loaderDisabled(val) { this._loaderDisabled = val; }
70
+ get columns() { return this._columns; }
71
+ set columns(val) { this._columns = val; }
72
+ get showSpacer() { return this._showSpacer; }
73
+ set showSpacer(val) { this._showSpacer = val; }
74
+ get showLoader() { return this._showLoader; }
75
+ set showLoader(val) { this._showLoader = val; }
76
+ get numToleratedItems() { return this._numToleratedItems; }
77
+ set numToleratedItems(val) { this._numToleratedItems = val; }
78
+ get loading() { return this._loading; }
79
+ set loading(val) { this._loading = val; }
80
+ get autoSize() { return this._autoSize; }
81
+ set autoSize(val) { this._autoSize = val; }
82
+ get trackBy() { return this._trackBy; }
83
+ set trackBy(val) { this._trackBy = val; }
84
+ get options() { return this._options; }
85
+ set options(val) {
86
+ this._options = val;
87
+ if (val && typeof val === 'object') {
88
+ Object.entries(val).forEach(([k, v]) => this[`_${k}`] !== v && (this[`_${k}`] = v));
89
+ }
90
+ }
91
+ get vertical() {
92
+ return this._orientation === 'vertical';
93
+ }
94
+ get horizontal() {
95
+ return this._orientation === 'horizontal';
96
+ }
97
+ get both() {
98
+ return this._orientation === 'both';
99
+ }
100
+ get loadedItems() {
101
+ if (this._items && !this.d_loading) {
102
+ if (this.both)
103
+ return this._items.slice(this.first.rows, this.last.rows).map(item => this._columns ? item : item.slice(this.first.cols, this.last.cols));
104
+ else if (this.horizontal && this._columns)
105
+ return this._items;
106
+ else
107
+ return this._items.slice(this.first, this.last);
108
+ }
109
+ return [];
110
+ }
111
+ get loadedRows() {
112
+ return this.d_loading ? (this._loaderDisabled ? this.loaderArr : []) : this.loadedItems;
113
+ }
114
+ get loadedColumns() {
115
+ if (this._columns && (this.both || this.horizontal)) {
116
+ return this.d_loading && this._loaderDisabled ?
117
+ (this.both ? this.loaderArr[0] : this.loaderArr) :
118
+ this._columns.slice((this.both ? this.first.cols : this.first), (this.both ? this.last.cols : this.last));
119
+ }
120
+ return this._columns;
121
+ }
122
+ ngOnInit() {
123
+ this.setInitialState();
124
+ }
125
+ ngOnChanges(simpleChanges) {
126
+ if (this.initialized) {
127
+ let areItemsChanged = false;
128
+ if (simpleChanges.items) {
129
+ const { previousValue: prevItems, currentValue: currentItems } = simpleChanges.items;
130
+ areItemsChanged = !prevItems || prevItems.length !== (currentItems || []).length;
131
+ }
132
+ const isChanged = (areItemsChanged || simpleChanges.itemSize || simpleChanges.scrollHeight || simpleChanges.scrollWidth);
133
+ isChanged && this.init();
134
+ }
135
+ if (simpleChanges.orientation) {
136
+ this.lastScrollPos = this.both ? { top: 0, left: 0 } : 0;
137
+ }
138
+ if (simpleChanges.loading) {
139
+ const { previousValue, currentValue } = simpleChanges.loading;
140
+ if (this.lazy && previousValue !== currentValue && currentValue !== this.d_loading) {
141
+ this.d_loading = currentValue;
142
+ }
143
+ }
144
+ if (simpleChanges.numToleratedItems) {
145
+ const { previousValue, currentValue } = simpleChanges.numToleratedItems;
146
+ if (previousValue !== currentValue && currentValue !== this.d_numToleratedItems) {
147
+ this.d_numToleratedItems = currentValue;
148
+ }
149
+ }
150
+ if (simpleChanges.options) {
151
+ const { previousValue, currentValue } = simpleChanges.options;
152
+ if (this.lazy && previousValue?.loading !== currentValue?.loading && currentValue?.loading !== this.d_loading) {
153
+ this.d_loading = currentValue.loading;
154
+ }
155
+ if (previousValue?.numToleratedItems !== currentValue?.numToleratedItems && currentValue?.numToleratedItems !== this.d_numToleratedItems) {
156
+ this.d_numToleratedItems = currentValue.numToleratedItems;
157
+ }
158
+ }
159
+ }
160
+ ngAfterContentInit() {
161
+ this.templates.forEach((item) => {
162
+ switch (item.getType()) {
163
+ case 'content':
164
+ this.contentTemplate = item.template;
165
+ break;
166
+ case 'item':
167
+ this.itemTemplate = item.template;
168
+ break;
169
+ case 'loader':
170
+ this.loaderTemplate = item.template;
171
+ break;
172
+ case 'loadericon':
173
+ this.loaderIconTemplate = item.template;
174
+ break;
175
+ default:
176
+ this.itemTemplate = item.template;
177
+ break;
178
+ }
179
+ });
180
+ }
181
+ ngAfterViewInit() {
182
+ this.setContentEl(this.contentEl);
183
+ this.init();
184
+ this.defaultWidth = DomHandler.getWidth(this.elementViewChild.nativeElement);
185
+ this.defaultHeight = DomHandler.getHeight(this.elementViewChild.nativeElement);
186
+ this.initialized = true;
187
+ }
188
+ ngAfterViewChecked() {
189
+ this.calculateAutoSize();
190
+ }
191
+ ngOnDestroy() {
192
+ if (this.windowResizeListener) {
193
+ window.removeEventListener('resize', this.windowResizeListener);
194
+ window.removeEventListener('orientationchange', this.windowResizeListener);
195
+ this.windowResizeListener = null;
196
+ }
197
+ }
198
+ init() {
199
+ if (!this._disabled) {
200
+ this.setSize();
201
+ this.calculateOptions();
202
+ this.setSpacerSize();
203
+ this.cd.detectChanges();
204
+ }
205
+ }
206
+ setContentEl(el) {
207
+ this.contentEl = el || this.contentViewChild?.nativeElement || DomHandler.findSingle(this.elementViewChild?.nativeElement, '.p-scroller-content');
208
+ }
209
+ setInitialState() {
210
+ this.first = this.both ? { rows: 0, cols: 0 } : 0;
211
+ this.last = this.both ? { rows: 0, cols: 0 } : 0;
212
+ this.numItemsInViewport = this.both ? { rows: 0, cols: 0 } : 0;
213
+ this.lastScrollPos = this.both ? { top: 0, left: 0 } : 0;
214
+ this.d_loading = this._loading || false;
215
+ this.d_numToleratedItems = this._numToleratedItems;
216
+ }
217
+ getElementRef() {
218
+ return this.elementViewChild;
219
+ }
220
+ scrollTo(options) {
221
+ this.elementViewChild?.nativeElement?.scrollTo(options);
222
+ }
223
+ scrollToIndex(index, behavior = 'auto') {
224
+ const { numToleratedItems } = this.calculateNumItems();
225
+ const contentPos = this.getContentPosition();
226
+ const calculateFirst = (_index = 0, _numT) => (_index <= _numT ? 0 : _index);
227
+ const calculateCoord = (_first, _size, _cpos) => (_first * _size) + _cpos;
228
+ const scrollTo = (left = 0, top = 0) => this.scrollTo({ left, top, behavior });
229
+ if (this.both) {
230
+ const newFirst = { rows: calculateFirst(index[0], numToleratedItems[0]), cols: calculateFirst(index[1], numToleratedItems[1]) };
231
+ if (newFirst.rows !== this.first.rows || newFirst.cols !== this.first.cols) {
232
+ scrollTo(calculateCoord(newFirst.cols, this._itemSize[1], contentPos.left), calculateCoord(newFirst.rows, this._itemSize[0], contentPos.top));
233
+ this.first = newFirst;
234
+ }
235
+ }
236
+ else {
237
+ const newFirst = calculateFirst(index, numToleratedItems);
238
+ if (newFirst !== this.first) {
239
+ this.horizontal ? scrollTo(calculateCoord(newFirst, this._itemSize, contentPos.left), 0) : scrollTo(0, calculateCoord(newFirst, this._itemSize, contentPos.top));
240
+ this.first = newFirst;
241
+ }
242
+ }
243
+ }
244
+ scrollInView(index, to, behavior = 'auto') {
245
+ if (to) {
246
+ const { first, viewport } = this.getRenderedRange();
247
+ const scrollTo = (left = 0, top = 0) => this.scrollTo({ left, top, behavior });
248
+ const isToStart = to === 'to-start';
249
+ const isToEnd = to === 'to-end';
250
+ if (isToStart) {
251
+ if (this.both) {
252
+ if (viewport.first.rows - first.rows > index[0]) {
253
+ scrollTo(viewport.first.cols * this._itemSize[1], (viewport.first.rows - 1) * this._itemSize[0]);
254
+ }
255
+ else if (viewport.first.cols - first.cols > index[1]) {
256
+ scrollTo((viewport.first.cols - 1) * this._itemSize[1], viewport.first.rows * this._itemSize[0]);
257
+ }
258
+ }
259
+ else {
260
+ if (viewport.first - first > index) {
261
+ const pos = (viewport.first - 1) * this._itemSize;
262
+ this.horizontal ? scrollTo(pos, 0) : scrollTo(0, pos);
263
+ }
264
+ }
265
+ }
266
+ else if (isToEnd) {
267
+ if (this.both) {
268
+ if (viewport.last.rows - first.rows <= index[0] + 1) {
269
+ scrollTo(viewport.first.cols * this._itemSize[1], (viewport.first.rows + 1) * this._itemSize[0]);
270
+ }
271
+ else if (viewport.last.cols - first.cols <= index[1] + 1) {
272
+ scrollTo((viewport.first.cols + 1) * this._itemSize[1], viewport.first.rows * this._itemSize[0]);
273
+ }
274
+ }
275
+ else {
276
+ if (viewport.last - first <= index + 1) {
277
+ const pos = (viewport.first + 1) * this._itemSize;
278
+ this.horizontal ? scrollTo(pos, 0) : scrollTo(0, pos);
279
+ }
280
+ }
281
+ }
282
+ }
283
+ else {
284
+ this.scrollToIndex(index, behavior);
285
+ }
286
+ }
287
+ getRenderedRange() {
288
+ const calculateFirstInViewport = (_pos, _size) => Math.floor(_pos / (_size || _pos));
289
+ let firstInViewport = this.first;
290
+ let lastInViewport = 0;
291
+ if (this.elementViewChild?.nativeElement) {
292
+ const { scrollTop, scrollLeft } = this.elementViewChild.nativeElement;
293
+ if (this.both) {
294
+ firstInViewport = { rows: calculateFirstInViewport(scrollTop, this._itemSize[0]), cols: calculateFirstInViewport(scrollLeft, this._itemSize[1]) };
295
+ lastInViewport = { rows: firstInViewport.rows + this.numItemsInViewport.rows, cols: firstInViewport.cols + this.numItemsInViewport.cols };
296
+ }
297
+ else {
298
+ const scrollPos = this.horizontal ? scrollLeft : scrollTop;
299
+ firstInViewport = calculateFirstInViewport(scrollPos, this._itemSize);
300
+ lastInViewport = firstInViewport + this.numItemsInViewport;
301
+ }
302
+ }
303
+ return {
304
+ first: this.first,
305
+ last: this.last,
306
+ viewport: {
307
+ first: firstInViewport,
308
+ last: lastInViewport
309
+ }
310
+ };
311
+ }
312
+ calculateNumItems() {
313
+ const contentPos = this.getContentPosition();
314
+ const contentWidth = this.elementViewChild?.nativeElement ? this.elementViewChild.nativeElement.offsetWidth - contentPos.left : 0;
315
+ const contentHeight = this.elementViewChild?.nativeElement ? this.elementViewChild.nativeElement.offsetHeight - contentPos.top : 0;
316
+ const calculateNumItemsInViewport = (_contentSize, _itemSize) => Math.ceil(_contentSize / (_itemSize || _contentSize));
317
+ const calculateNumToleratedItems = (_numItems) => Math.ceil(_numItems / 2);
318
+ const numItemsInViewport = this.both ?
319
+ { rows: calculateNumItemsInViewport(contentHeight, this._itemSize[0]), cols: calculateNumItemsInViewport(contentWidth, this._itemSize[1]) } :
320
+ calculateNumItemsInViewport((this.horizontal ? contentWidth : contentHeight), this._itemSize);
321
+ const numToleratedItems = this.d_numToleratedItems || (this.both ?
322
+ [calculateNumToleratedItems(numItemsInViewport.rows), calculateNumToleratedItems(numItemsInViewport.cols)] :
323
+ calculateNumToleratedItems(numItemsInViewport));
324
+ return { numItemsInViewport, numToleratedItems };
325
+ }
326
+ calculateOptions() {
327
+ const { numItemsInViewport, numToleratedItems } = this.calculateNumItems();
328
+ const calculateLast = (_first, _num, _numT, _isCols = false) => this.getLast(_first + _num + ((_first < _numT ? 2 : 3) * _numT), _isCols);
329
+ const first = this.first;
330
+ const last = this.both ?
331
+ { rows: calculateLast(this.first.rows, numItemsInViewport.rows, numToleratedItems[0]), cols: calculateLast(this.first.cols, numItemsInViewport.cols, numToleratedItems[1], true) } :
332
+ calculateLast(this.first, numItemsInViewport, numToleratedItems);
333
+ this.last = last;
334
+ this.numItemsInViewport = numItemsInViewport;
335
+ this.d_numToleratedItems = numToleratedItems;
336
+ if (this.showLoader) {
337
+ this.loaderArr = this.both ?
338
+ Array.from({ length: numItemsInViewport.rows }).map(() => Array.from({ length: numItemsInViewport.cols })) :
339
+ Array.from({ length: numItemsInViewport });
340
+ }
341
+ if (this._lazy) {
342
+ this.handleEvents('onLazyLoad', { first, last });
343
+ }
344
+ }
345
+ calculateAutoSize() {
346
+ if (this._autoSize && !this.d_loading) {
347
+ Promise.resolve().then(() => {
348
+ if (this.contentEl) {
349
+ this.contentEl.style.minHeight = this.contentEl.style.minWidth = 'auto';
350
+ const { offsetWidth, offsetHeight } = this.contentEl;
351
+ (this.both || this.horizontal) && (this.elementViewChild.nativeElement.style.width = (offsetWidth < this.defaultWidth ? offsetWidth : this.defaultWidth) + 'px');
352
+ (this.both || this.vertical) && (this.elementViewChild.nativeElement.style.height = (offsetHeight < this.defaultHeight ? offsetHeight : this.defaultHeight) + 'px');
353
+ this.contentEl.style.minHeight = this.contentEl.style.minWidth = '';
354
+ }
355
+ });
356
+ }
357
+ }
358
+ getLast(last = 0, isCols = false) {
359
+ return this._items ? Math.min((isCols ? (this._columns || this._items[0]).length : this._items.length), last) : 0;
360
+ }
361
+ getContentPosition() {
362
+ if (this.contentEl) {
363
+ const style = getComputedStyle(this.contentEl);
364
+ const left = parseInt(style.paddingLeft, 10) + Math.max(parseInt(style.left, 10), 0);
365
+ const right = parseInt(style.paddingRight, 10) + Math.max(parseInt(style.right, 10), 0);
366
+ const top = parseInt(style.paddingTop, 10) + Math.max(parseInt(style.top, 10), 0);
367
+ const bottom = parseInt(style.paddingBottom, 10) + Math.max(parseInt(style.bottom, 10), 0);
368
+ return { left, right, top, bottom, x: left + right, y: top + bottom };
369
+ }
370
+ return { left: 0, right: 0, top: 0, bottom: 0, x: 0, y: 0 };
371
+ }
372
+ setSize() {
373
+ if (this.elementViewChild?.nativeElement) {
374
+ const parentElement = this.elementViewChild.nativeElement.parentElement.parentElement;
375
+ const width = this._scrollWidth || `${(this.elementViewChild.nativeElement.offsetWidth || parentElement.offsetWidth)}px`;
376
+ const height = this._scrollHeight || `${(this.elementViewChild.nativeElement.offsetHeight || parentElement.offsetHeight)}px`;
377
+ const setProp = (_name, _value) => this.elementViewChild.nativeElement.style[_name] = _value;
378
+ if (this.both || this.horizontal) {
379
+ setProp('height', height);
380
+ setProp('width', width);
381
+ }
382
+ else {
383
+ setProp('height', height);
384
+ }
385
+ }
386
+ }
387
+ setSpacerSize() {
388
+ if (this._items) {
389
+ const contentPos = this.getContentPosition();
390
+ const setProp = (_name, _value, _size, _cpos = 0) => this.spacerStyle = { ...this.spacerStyle, ...{ [`${_name}`]: (((_value || []).length * _size) + _cpos) + 'px' } };
391
+ if (this.both) {
392
+ setProp('height', this._items, this._itemSize[0], contentPos.y);
393
+ setProp('width', (this._columns || this._items[1]), this._itemSize[1], contentPos.x);
394
+ }
395
+ else {
396
+ this.horizontal ? setProp('width', (this._columns || this._items), this._itemSize, contentPos.x) : setProp('height', this._items, this._itemSize, contentPos.y);
397
+ }
398
+ }
399
+ }
400
+ setContentPosition(pos) {
401
+ if (this.contentEl) {
402
+ const first = pos ? pos.first : this.first;
403
+ const calculateTranslateVal = (_first, _size) => (_first * _size);
404
+ const setTransform = (_x = 0, _y = 0) => this.contentStyle = { ...this.contentStyle, ...{ transform: `translate3d(${_x}px, ${_y}px, 0)` } };
405
+ if (this.both) {
406
+ setTransform(calculateTranslateVal(first.cols, this._itemSize[1]), calculateTranslateVal(first.rows, this._itemSize[0]));
407
+ }
408
+ else {
409
+ const translateVal = calculateTranslateVal(first, this._itemSize);
410
+ this.horizontal ? setTransform(translateVal, 0) : setTransform(0, translateVal);
411
+ }
412
+ }
413
+ }
414
+ onScrollPositionChange(event) {
415
+ const target = event.target;
416
+ const contentPos = this.getContentPosition();
417
+ const calculateScrollPos = (_pos, _cpos) => _pos ? (_pos > _cpos ? _pos - _cpos : _pos) : 0;
418
+ const calculateCurrentIndex = (_pos, _size) => Math.floor(_pos / (_size || _pos));
419
+ const calculateTriggerIndex = (_currentIndex, _first, _last, _num, _numT, _isScrollDownOrRight) => {
420
+ return (_currentIndex <= _numT ? _numT : (_isScrollDownOrRight ? (_last - _num - _numT) : (_first + _numT - 1)));
421
+ };
422
+ const calculateFirst = (_currentIndex, _triggerIndex, _first, _last, _num, _numT, _isScrollDownOrRight) => {
423
+ if (_currentIndex <= _numT)
424
+ return 0;
425
+ else
426
+ return Math.max(0, _isScrollDownOrRight ?
427
+ (_currentIndex < _triggerIndex ? _first : _currentIndex - _numT) :
428
+ (_currentIndex > _triggerIndex ? _first : _currentIndex - (2 * _numT)));
429
+ };
430
+ const calculateLast = (_currentIndex, _first, _last, _num, _numT, _isCols = false) => {
431
+ let lastValue = _first + _num + (2 * _numT);
432
+ if (_currentIndex >= _numT) {
433
+ lastValue += (_numT + 1);
434
+ }
435
+ return this.getLast(lastValue, _isCols);
436
+ };
437
+ const scrollTop = calculateScrollPos(target.scrollTop, contentPos.top);
438
+ const scrollLeft = calculateScrollPos(target.scrollLeft, contentPos.left);
439
+ let newFirst = this.both ? { rows: 0, cols: 0 } : 0;
440
+ let newLast = this.last;
441
+ let isRangeChanged = false;
442
+ let newScrollPos = this.lastScrollPos;
443
+ if (this.both) {
444
+ const isScrollDown = this.lastScrollPos.top <= scrollTop;
445
+ const isScrollRight = this.lastScrollPos.left <= scrollLeft;
446
+ const currentIndex = { rows: calculateCurrentIndex(scrollTop, this._itemSize[0]), cols: calculateCurrentIndex(scrollLeft, this._itemSize[1]) };
447
+ const triggerIndex = {
448
+ rows: calculateTriggerIndex(currentIndex.rows, this.first.rows, this.last.rows, this.numItemsInViewport.rows, this.d_numToleratedItems[0], isScrollDown),
449
+ cols: calculateTriggerIndex(currentIndex.cols, this.first.cols, this.last.cols, this.numItemsInViewport.cols, this.d_numToleratedItems[1], isScrollRight)
450
+ };
451
+ newFirst = {
452
+ rows: calculateFirst(currentIndex.rows, triggerIndex.rows, this.first.rows, this.last.rows, this.numItemsInViewport.rows, this.d_numToleratedItems[0], isScrollDown),
453
+ cols: calculateFirst(currentIndex.cols, triggerIndex.cols, this.first.cols, this.last.cols, this.numItemsInViewport.cols, this.d_numToleratedItems[1], isScrollRight)
454
+ };
455
+ newLast = {
456
+ rows: calculateLast(currentIndex.rows, newFirst.rows, this.last.rows, this.numItemsInViewport.rows, this.d_numToleratedItems[0]),
457
+ cols: calculateLast(currentIndex.cols, newFirst.cols, this.last.cols, this.numItemsInViewport.cols, this.d_numToleratedItems[1], true)
458
+ };
459
+ isRangeChanged = (newFirst.rows !== this.first.rows || newLast.rows !== this.last.rows) || (newFirst.cols !== this.first.cols || newLast.cols !== this.last.cols);
460
+ newScrollPos = { top: scrollTop, left: scrollLeft };
461
+ }
462
+ else {
463
+ const scrollPos = this.horizontal ? scrollLeft : scrollTop;
464
+ const isScrollDownOrRight = this.lastScrollPos <= scrollPos;
465
+ const currentIndex = calculateCurrentIndex(scrollPos, this._itemSize);
466
+ const triggerIndex = calculateTriggerIndex(currentIndex, this.first, this.last, this.numItemsInViewport, this.d_numToleratedItems, isScrollDownOrRight);
467
+ newFirst = calculateFirst(currentIndex, triggerIndex, this.first, this.last, this.numItemsInViewport, this.d_numToleratedItems, isScrollDownOrRight);
468
+ newLast = calculateLast(currentIndex, newFirst, this.last, this.numItemsInViewport, this.d_numToleratedItems);
469
+ isRangeChanged = newFirst !== this.first || newLast !== this.last;
470
+ newScrollPos = scrollPos;
471
+ }
472
+ return {
473
+ first: newFirst,
474
+ last: newLast,
475
+ isRangeChanged,
476
+ scrollPos: newScrollPos
477
+ };
478
+ }
479
+ onScrollChange(event) {
480
+ const { first, last, isRangeChanged, scrollPos } = this.onScrollPositionChange(event);
481
+ if (isRangeChanged) {
482
+ const newState = { first, last };
483
+ this.setContentPosition(newState);
484
+ this.first = first;
485
+ this.last = last;
486
+ this.lastScrollPos = scrollPos;
487
+ this.handleEvents('onScrollIndexChange', newState);
488
+ if (this._lazy) {
489
+ this.handleEvents('onLazyLoad', newState);
490
+ }
491
+ }
492
+ }
493
+ onContainerScroll(event) {
494
+ this.handleEvents('onScroll', { originalEvent: event });
495
+ if (this._delay) {
496
+ if (this.scrollTimeout) {
497
+ clearTimeout(this.scrollTimeout);
498
+ }
499
+ if (!this.d_loading && this.showLoader) {
500
+ const { isRangeChanged: changed } = this.onScrollPositionChange(event);
501
+ if (changed) {
502
+ this.d_loading = true;
503
+ this.cd.detectChanges();
504
+ }
505
+ }
506
+ this.scrollTimeout = setTimeout(() => {
507
+ this.onScrollChange(event);
508
+ if (this.d_loading && this.showLoader && (!this._lazy || this._loading === undefined)) {
509
+ this.d_loading = false;
510
+ this.cd.detectChanges();
511
+ }
512
+ }, this._delay);
513
+ }
514
+ else {
515
+ this.onScrollChange(event);
516
+ }
517
+ }
518
+ onWindowResize() {
519
+ if (this.resizeTimeout) {
520
+ clearTimeout(this.resizeTimeout);
521
+ }
522
+ this.resizeTimeout = setTimeout(() => {
523
+ if (this.elementViewChild) {
524
+ const [width, height] = [DomHandler.getWidth(this.elementViewChild.nativeElement), DomHandler.getHeight(this.elementViewChild.nativeElement)];
525
+ const [isDiffWidth, isDiffHeight] = [width !== this.defaultWidth, height !== this.defaultHeight];
526
+ const reinit = this.both ? (isDiffWidth || isDiffHeight) : (this.horizontal ? isDiffWidth : (this.vertical ? isDiffHeight : false));
527
+ reinit && this.zone.run(() => {
528
+ this.d_numToleratedItems = this._numToleratedItems;
529
+ this.defaultWidth = width;
530
+ this.defaultHeight = height;
531
+ this.init();
532
+ });
533
+ }
534
+ }, this._resizeDelay);
535
+ }
536
+ handleEvents(name, params) {
537
+ return this.options && this.options[name] ? this.options[name](params) : this[name].emit(params);
538
+ }
539
+ getContentOptions() {
540
+ return {
541
+ contentStyleClass: `p-scroller-content ${this.d_loading ? 'p-scroller-loading' : ''}`,
542
+ items: this.loadedItems,
543
+ getItemOptions: (index) => this.getOptions(index),
544
+ loading: this.d_loading,
545
+ getLoaderOptions: (index, options) => this.getLoaderOptions(index, options),
546
+ itemSize: this._itemSize,
547
+ rows: this.loadedRows,
548
+ columns: this.loadedColumns,
549
+ spacerStyle: this.spacerStyle,
550
+ contentStyle: this.contentStyle,
551
+ vertical: this.vertical,
552
+ horizontal: this.horizontal,
553
+ both: this.both
554
+ };
555
+ }
556
+ getOptions(renderedIndex) {
557
+ const count = (this._items || []).length;
558
+ const index = this.both ? this.first.rows + renderedIndex : this.first + renderedIndex;
559
+ return {
560
+ index,
561
+ count,
562
+ first: index === 0,
563
+ last: index === (count - 1),
564
+ even: index % 2 === 0,
565
+ odd: index % 2 !== 0
566
+ };
567
+ }
568
+ getLoaderOptions(index, extOptions) {
569
+ const count = this.loaderArr.length;
570
+ return {
571
+ index,
572
+ count,
573
+ first: index === 0,
574
+ last: index === (count - 1),
575
+ even: index % 2 === 0,
576
+ odd: index % 2 !== 0,
577
+ ...extOptions
578
+ };
579
+ }
580
+ }
581
+ Scroller.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.3", ngImport: i0, type: Scroller, deps: [{ token: i0.ChangeDetectorRef }, { token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Component });
582
+ Scroller.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.0.3", type: Scroller, selector: "p-scroller", inputs: { id: "id", style: "style", styleClass: "styleClass", tabindex: "tabindex", items: "items", itemSize: "itemSize", scrollHeight: "scrollHeight", scrollWidth: "scrollWidth", orientation: "orientation", delay: "delay", resizeDelay: "resizeDelay", lazy: "lazy", disabled: "disabled", loaderDisabled: "loaderDisabled", columns: "columns", showSpacer: "showSpacer", showLoader: "showLoader", numToleratedItems: "numToleratedItems", loading: "loading", autoSize: "autoSize", trackBy: "trackBy", options: "options" }, outputs: { onLazyLoad: "onLazyLoad", onScroll: "onScroll", onScrollIndexChange: "onScrollIndexChange" }, host: { classAttribute: "p-scroller-viewport p-element" }, queries: [{ propertyName: "templates", predicate: PrimeTemplate }], viewQueries: [{ propertyName: "elementViewChild", first: true, predicate: ["element"], descendants: true }, { propertyName: "contentViewChild", first: true, predicate: ["content"], descendants: true }], usesOnChanges: true, ngImport: i0, template: `
583
+ <ng-container *ngIf="!_disabled; else disabledContainer">
584
+ <div #element [attr.id]="_id" [attr.tabindex]="tabindex" [ngStyle]="_style" [class]="_styleClass"
585
+ [ngClass]="{'p-scroller': true, 'p-both-scroll': both, 'p-horizontal-scroll': horizontal}"
586
+ (scroll)="onContainerScroll($event)">
587
+ <ng-container *ngIf="contentTemplate; else buildInContent">
588
+ <ng-container *ngTemplateOutlet="contentTemplate; context: {$implicit: loadedItems, options: getContentOptions()}"></ng-container>
589
+ </ng-container>
590
+ <ng-template #buildInContent>
591
+ <div #content class="p-scroller-content" [ngClass]="{'p-scroller-loading': d_loading}" [ngStyle]="contentStyle">
592
+ <ng-container *ngFor="let item of loadedItems; let index = index; trackBy: _trackBy || index">
593
+ <ng-container *ngTemplateOutlet="itemTemplate; context: {$implicit: item, options: getOptions(index)}"></ng-container>
594
+ </ng-container>
595
+ </div>
596
+ </ng-template>
597
+ <div *ngIf="_showSpacer" class="p-scroller-spacer" [ngStyle]="spacerStyle"></div>
598
+ <div *ngIf="!loaderDisabled && _showLoader && d_loading" class="p-scroller-loader" [ngClass]="{'p-component-overlay': !loaderTemplate}">
599
+ <ng-container *ngIf="loaderTemplate; else buildInLoader">
600
+ <ng-container *ngFor="let item of loaderArr; let index = index">
601
+ <ng-container *ngTemplateOutlet="loaderTemplate; context: {options: getLoaderOptions(index, both && { numCols: _numItemsInViewport.cols })}"></ng-container>
602
+ </ng-container>
603
+ </ng-container>
604
+ <ng-template #buildInLoader>
605
+ <ng-container *ngIf="loaderIconTemplate; else buildInLoaderIcon">
606
+ <ng-container *ngTemplateOutlet="loaderIconTemplate; context: {options: { styleClass: 'p-scroller-loading-icon' }}"></ng-container>
607
+ </ng-container>
608
+ <ng-template #buildInLoaderIcon>
609
+ <i class="p-scroller-loading-icon pi pi-spinner pi-spin"></i>
610
+ </ng-template>
611
+ </ng-template>
612
+ </div>
613
+ </div>
614
+ </ng-container>
615
+ <ng-template #disabledContainer>
616
+ <ng-content></ng-content>
617
+ <ng-container *ngIf="contentTemplate">
618
+ <ng-container *ngTemplateOutlet="contentTemplate; context: {$implicit: items, options: {rows: _items, columns: loadedColumns}}"></ng-container>
619
+ </ng-container>
620
+ </ng-template>
621
+ `, isInline: true, styles: ["p-scroller{flex:1;outline:0 none}.p-scroller{position:relative;overflow:auto;contain:strict;transform:translateZ(0);will-change:scroll-position;outline:0 none}.p-scroller-content{position:absolute;top:0;left:0;min-height:100%;min-width:100%;will-change:transform}.p-scroller-spacer{position:absolute;top:0;left:0;height:1px;width:1px;transform-origin:0 0;pointer-events:none}.p-scroller-loader{position:sticky;top:0;left:0;width:100%;height:100%}.p-scroller-loader.p-component-overlay{display:flex;align-items:center;justify-content:center}.p-scroller-loading-icon{font-size:2rem}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }], changeDetection: i0.ChangeDetectionStrategy.Default, encapsulation: i0.ViewEncapsulation.None });
622
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.3", ngImport: i0, type: Scroller, decorators: [{
623
+ type: Component,
624
+ args: [{ selector: 'p-scroller', template: `
625
+ <ng-container *ngIf="!_disabled; else disabledContainer">
626
+ <div #element [attr.id]="_id" [attr.tabindex]="tabindex" [ngStyle]="_style" [class]="_styleClass"
627
+ [ngClass]="{'p-scroller': true, 'p-both-scroll': both, 'p-horizontal-scroll': horizontal}"
628
+ (scroll)="onContainerScroll($event)">
629
+ <ng-container *ngIf="contentTemplate; else buildInContent">
630
+ <ng-container *ngTemplateOutlet="contentTemplate; context: {$implicit: loadedItems, options: getContentOptions()}"></ng-container>
631
+ </ng-container>
632
+ <ng-template #buildInContent>
633
+ <div #content class="p-scroller-content" [ngClass]="{'p-scroller-loading': d_loading}" [ngStyle]="contentStyle">
634
+ <ng-container *ngFor="let item of loadedItems; let index = index; trackBy: _trackBy || index">
635
+ <ng-container *ngTemplateOutlet="itemTemplate; context: {$implicit: item, options: getOptions(index)}"></ng-container>
636
+ </ng-container>
637
+ </div>
638
+ </ng-template>
639
+ <div *ngIf="_showSpacer" class="p-scroller-spacer" [ngStyle]="spacerStyle"></div>
640
+ <div *ngIf="!loaderDisabled && _showLoader && d_loading" class="p-scroller-loader" [ngClass]="{'p-component-overlay': !loaderTemplate}">
641
+ <ng-container *ngIf="loaderTemplate; else buildInLoader">
642
+ <ng-container *ngFor="let item of loaderArr; let index = index">
643
+ <ng-container *ngTemplateOutlet="loaderTemplate; context: {options: getLoaderOptions(index, both && { numCols: _numItemsInViewport.cols })}"></ng-container>
644
+ </ng-container>
645
+ </ng-container>
646
+ <ng-template #buildInLoader>
647
+ <ng-container *ngIf="loaderIconTemplate; else buildInLoaderIcon">
648
+ <ng-container *ngTemplateOutlet="loaderIconTemplate; context: {options: { styleClass: 'p-scroller-loading-icon' }}"></ng-container>
649
+ </ng-container>
650
+ <ng-template #buildInLoaderIcon>
651
+ <i class="p-scroller-loading-icon pi pi-spinner pi-spin"></i>
652
+ </ng-template>
653
+ </ng-template>
654
+ </div>
655
+ </div>
656
+ </ng-container>
657
+ <ng-template #disabledContainer>
658
+ <ng-content></ng-content>
659
+ <ng-container *ngIf="contentTemplate">
660
+ <ng-container *ngTemplateOutlet="contentTemplate; context: {$implicit: items, options: {rows: _items, columns: loadedColumns}}"></ng-container>
661
+ </ng-container>
662
+ </ng-template>
663
+ `, changeDetection: ChangeDetectionStrategy.Default, encapsulation: ViewEncapsulation.None, host: {
664
+ 'class': 'p-scroller-viewport p-element'
665
+ }, styles: ["p-scroller{flex:1;outline:0 none}.p-scroller{position:relative;overflow:auto;contain:strict;transform:translateZ(0);will-change:scroll-position;outline:0 none}.p-scroller-content{position:absolute;top:0;left:0;min-height:100%;min-width:100%;will-change:transform}.p-scroller-spacer{position:absolute;top:0;left:0;height:1px;width:1px;transform-origin:0 0;pointer-events:none}.p-scroller-loader{position:sticky;top:0;left:0;width:100%;height:100%}.p-scroller-loader.p-component-overlay{display:flex;align-items:center;justify-content:center}.p-scroller-loading-icon{font-size:2rem}\n"] }]
666
+ }], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }, { type: i0.NgZone }]; }, propDecorators: { id: [{
667
+ type: Input
668
+ }], style: [{
669
+ type: Input
670
+ }], styleClass: [{
671
+ type: Input
672
+ }], tabindex: [{
673
+ type: Input
674
+ }], items: [{
675
+ type: Input
676
+ }], itemSize: [{
677
+ type: Input
678
+ }], scrollHeight: [{
679
+ type: Input
680
+ }], scrollWidth: [{
681
+ type: Input
682
+ }], orientation: [{
683
+ type: Input
684
+ }], delay: [{
685
+ type: Input
686
+ }], resizeDelay: [{
687
+ type: Input
688
+ }], lazy: [{
689
+ type: Input
690
+ }], disabled: [{
691
+ type: Input
692
+ }], loaderDisabled: [{
693
+ type: Input
694
+ }], columns: [{
695
+ type: Input
696
+ }], showSpacer: [{
697
+ type: Input
698
+ }], showLoader: [{
699
+ type: Input
700
+ }], numToleratedItems: [{
701
+ type: Input
702
+ }], loading: [{
703
+ type: Input
704
+ }], autoSize: [{
705
+ type: Input
706
+ }], trackBy: [{
707
+ type: Input
708
+ }], options: [{
709
+ type: Input
710
+ }], elementViewChild: [{
711
+ type: ViewChild,
712
+ args: ['element']
713
+ }], contentViewChild: [{
714
+ type: ViewChild,
715
+ args: ['content']
716
+ }], templates: [{
717
+ type: ContentChildren,
718
+ args: [PrimeTemplate]
719
+ }], onLazyLoad: [{
720
+ type: Output
721
+ }], onScroll: [{
722
+ type: Output
723
+ }], onScrollIndexChange: [{
724
+ type: Output
725
+ }] } });
726
+ export class ScrollerModule {
727
+ }
728
+ ScrollerModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.3", ngImport: i0, type: ScrollerModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
729
+ ScrollerModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "14.0.3", ngImport: i0, type: ScrollerModule, declarations: [Scroller], imports: [CommonModule], exports: [Scroller] });
730
+ ScrollerModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "14.0.3", ngImport: i0, type: ScrollerModule, imports: [CommonModule] });
731
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.3", ngImport: i0, type: ScrollerModule, decorators: [{
732
+ type: NgModule,
733
+ args: [{
734
+ imports: [CommonModule],
735
+ exports: [Scroller],
736
+ declarations: [Scroller]
737
+ }]
738
+ }] });
739
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2Nyb2xsZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYXBwL2NvbXBvbmVudHMvc2Nyb2xsZXIvc2Nyb2xsZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFjLFNBQVMsRUFBRSx1QkFBdUIsRUFBRSxpQkFBaUIsRUFBdUMsZUFBZSxFQUEwQixNQUFNLEVBQUUsWUFBWSxFQUE4RCxNQUFNLGVBQWUsQ0FBQztBQUM5UixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUN6QyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sYUFBYSxDQUFDOzs7QUFpRjVDLE1BQU0sT0FBTyxRQUFRO0lBaU5qQixZQUFvQixFQUFxQixFQUFVLElBQVk7UUFBM0MsT0FBRSxHQUFGLEVBQUUsQ0FBbUI7UUFBVSxTQUFJLEdBQUosSUFBSSxDQUFRO1FBaklyRCxlQUFVLEdBQXNCLElBQUksWUFBWSxFQUFFLENBQUM7UUFFbkQsYUFBUSxHQUFzQixJQUFJLFlBQVksRUFBRSxDQUFDO1FBRWpELHdCQUFtQixHQUFzQixJQUFJLFlBQVksRUFBRSxDQUFDO1FBUXRFLGNBQVMsR0FBVyxDQUFDLENBQUM7UUFJdEIsY0FBUyxHQUFRLENBQUMsQ0FBQztRQU1uQixpQkFBWSxHQUFXLFVBQVUsQ0FBQztRQUVsQyxXQUFNLEdBQVcsQ0FBQyxDQUFDO1FBRW5CLGlCQUFZLEdBQVcsRUFBRSxDQUFDO1FBRTFCLFVBQUssR0FBWSxLQUFLLENBQUM7UUFFdkIsY0FBUyxHQUFZLEtBQUssQ0FBQztRQUUzQixvQkFBZSxHQUFZLEtBQUssQ0FBQztRQUlqQyxnQkFBVyxHQUFZLElBQUksQ0FBQztRQUU1QixnQkFBVyxHQUFZLEtBQUssQ0FBQztRQU03QixjQUFTLEdBQVksS0FBSyxDQUFDO1FB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QUFpQjtzQkFBN0IsS0FBSztnQkFHTyxPQUFPO3NCQUFuQixLQUFLO2dCQUdPLFFBQVE7c0JBQXBCLEtBQUs7Z0JBR08sT0FBTztzQkFBbkIsS0FBSztnQkFHTyxPQUFPO3NCQUFuQixLQUFLO2dCQVNnQixnQkFBZ0I7c0JBQXJDLFNBQVM7dUJBQUMsU0FBUztnQkFFRSxnQkFBZ0I7c0JBQXJDLFNBQVM7dUJBQUMsU0FBUztnQkFFWSxTQUFTO3NCQUF4QyxlQUFlO3VCQUFDLGFBQWE7Z0JBRXBCLFVBQVU7c0JBQW5CLE1BQU07Z0JBRUcsUUFBUTtzQkFBakIsTUFBTTtnQkFFRyxtQkFBbUI7c0JBQTVCLE1BQU07O0FBaXJCWCxNQUFNLE9BQU8sY0FBYzs7MkdBQWQsY0FBYzs0R0FBZCxjQUFjLGlCQXJ3QmQsUUFBUSxhQWl3QlAsWUFBWSxhQWp3QmIsUUFBUTs0R0Fxd0JSLGNBQWMsWUFKYixZQUFZOzJGQUliLGNBQWM7a0JBTDFCLFFBQVE7bUJBQUM7b0JBQ04sT0FBTyxFQUFFLENBQUMsWUFBWSxDQUFDO29CQUN2QixPQUFPLEVBQUUsQ0FBQyxRQUFRLENBQUM7b0JBQ25CLFlBQVksRUFBRSxDQUFDLFFBQVEsQ0FBQztpQkFDM0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBOZ01vZHVsZSwgQ29tcG9uZW50LCBJbnB1dCwgRWxlbWVudFJlZiwgVmlld0NoaWxkLCBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgVmlld0VuY2Fwc3VsYXRpb24sIENoYW5nZURldGVjdG9yUmVmLCBBZnRlckNvbnRlbnRJbml0LCBDb250ZW50Q2hpbGRyZW4sIFF1ZXJ5TGlzdCwgVGVtcGxhdGVSZWYsIE91dHB1dCwgRXZlbnRFbWl0dGVyLCBTaW1wbGVDaGFuZ2VzLCBPbkluaXQsIEFmdGVyVmlld0NoZWNrZWQsIE9uRGVzdHJveSwgTmdab25lIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgRG9tSGFuZGxlciB9IGZyb20gJ3ByaW1lbmcvZG9tJztcbmltcG9ydCB7IFByaW1lVGVtcGxhdGUgfSBmcm9tICdwcmltZW5nL2FwaSc7XG5cbmV4cG9ydCB0eXBlIFNjcm9sbGVyVG9UeXBlID0gJ3RvLXN0YXJ0JyB8ICd0by1lbmQnIHwgdW5kZWZpbmVkO1xuXG5leHBvcnQgdHlwZSBTY3JvbGxlck9yaWVudGF0aW9uVHlwZSA9ICd2ZXJ0aWNhbCcgfCAnaG9yaXpvbnRhbCcgfCAnYm90aCc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2Nyb2xsZXJPcHRpb25zIHtcbiAgICBpZD86IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICBzdHlsZT86IGFueTtcbiAgICBzdHlsZUNsYXNzPzogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgIHRhYmluZGV4PzogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICAgIGl0ZW1zPzogYW55W107XG4gICAgaXRlbVNpemU/OiBhbnk7XG4gICAgc2Nyb2xsSGVpZ2h0Pzogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgIHNjcm9sbFdpZHRoPzogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgIG9yaWVudGF0aW9uPzogU2Nyb2xsZXJPcmllbnRhdGlvblR5cGU7XG4gICAgZGVsYXk/OiBudW1iZXIgfCB1bmRlZmluZWQ7XG4gICAgbGF6eT86IGJvb2xlYW47XG4gICAgZGlzYWJsZWQ/OiBib29sZWFuO1xuICAgIGxvYWRlckRpc2FibGVkPzogYm9vbGVhbjtcbiAgICBjb2x1bW5zPzogYW55W10gfCB1bmRlZmluZWQ7XG4gICAgc2hvd1NwYWNlcj86IGJvb2xlYW47XG4gICAgc2hvd0xvYWRlcj86IGJvb2xlYW47XG4gICAgbnVtVG9sZXJhdGVkSXRlbXM/OiBhbnk7XG4gICAgbG9hZGluZz86IGJvb2xlYW47XG4gICAgYXV0b1NpemU/OiBib29sZWFuO1xuICAgIHRyYWNrQnk/OiBhbnk7XG4gICAgb25MYXp5TG9hZD86IEZ1bmN0aW9uIHwgdW5kZWZpbmVkO1xuICAgIG9uU2Nyb2xsPzogRnVuY3Rpb24gfCB1bmRlZmluZWQ7XG4gICAgb25TY3JvbGxJbmRleENoYW5nZT86IEZ1bmN0aW9uIHwgdW5kZWZpbmVkO1xufVxuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ3Atc2Nyb2xsZXInLFxuICAgIHRlbXBsYXRlOiBgXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhX2Rpc2FibGVkOyBlbHNlIGRpc2FibGVkQ29udGFpbmVyXCI+XG4gICAgICAgICAgICA8ZGl2ICNlbGVtZW50IFthdHRyLmlkXT1cIl9pZFwiIFthdHRyLnRhYmluZGV4XT1cInRhYmluZGV4XCIgW25nU3R5bGVdPVwiX3N0eWxlXCIgW2NsYXNzXT1cIl9zdHlsZUNsYXNzXCJcbiAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7J3Atc2Nyb2xsZXInOiB0cnVlLCAncC1ib3RoLXNjcm9sbCc6IGJvdGgsICdwLWhvcml6b250YWwtc2Nyb2xsJzogaG9yaXpvbnRhbH1cIlxuICAgICAgICAgICAgICAgIChzY3JvbGwpPVwib25Db250YWluZXJTY3JvbGwoJGV2ZW50KVwiPlxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb250ZW50VGVtcGxhdGU7IGVsc2UgYnVpbGRJbkNvbnRlbnRcIj5cbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImNvbnRlbnRUZW1wbGF0ZTsgY29udGV4dDogeyRpbXBsaWNpdDogbG9hZGVkSXRlbXMsIG9wdGlvbnM6IGdldENvbnRlbnRPcHRpb25zKCl9XCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNidWlsZEluQ29udGVudD5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiAjY29udGVudCBjbGFzcz1cInAtc2Nyb2xsZXItY29udGVudFwiIFtuZ0NsYXNzXT1cInsncC1zY3JvbGxlci1sb2FkaW5nJzogZF9sb2FkaW5nfVwiIFtuZ1N0eWxlXT1cImNvbnRlbnRTdHlsZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgaXRlbSBvZiBsb2FkZWRJdGVtczsgbGV0IGluZGV4ID0gaW5kZXg7IHRyYWNrQnk6IF90cmFja0J5IHx8IGluZGV4XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cIml0ZW1UZW1wbGF0ZTsgY29udGV4dDogeyRpbXBsaWNpdDogaXRlbSwgb3B0aW9uczogZ2V0T3B0aW9ucyhpbmRleCl9XCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiX3Nob3dTcGFjZXJcIiBjbGFzcz1cInAtc2Nyb2xsZXItc3BhY2VyXCIgW25nU3R5bGVdPVwic3BhY2VyU3R5bGVcIj48L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiIWxvYWRlckRpc2FibGVkICYmIF9zaG93TG9hZGVyICYmIGRfbG9hZGluZ1wiIGNsYXNzPVwicC1zY3JvbGxlci1sb2FkZXJcIiBbbmdDbGFzc109XCJ7J3AtY29tcG9uZW50LW92ZXJsYXknOiAhbG9hZGVyVGVtcGxhdGV9XCI+XG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJsb2FkZXJUZW1wbGF0ZTsgZWxzZSBidWlsZEluTG9hZGVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBpdGVtIG9mIGxvYWRlckFycjsgbGV0IGluZGV4ID0gaW5kZXhcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwibG9hZGVyVGVtcGxhdGU7IGNvbnRleHQ6IHtvcHRpb25zOiBnZXRMb2FkZXJPcHRpb25zKGluZGV4LCBib3RoICYmIHsgbnVtQ29sczogX251bUl0ZW1zSW5WaWV3cG9ydC5jb2xzIH0pfVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI2J1aWxkSW5Mb2FkZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwibG9hZGVySWNvblRlbXBsYXRlOyBlbHNlIGJ1aWxkSW5Mb2FkZXJJY29uXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImxvYWRlckljb25UZW1wbGF0ZTsgY29udGV4dDoge29wdGlvbnM6IHsgc3R5bGVDbGFzczogJ3Atc2Nyb2xsZXItbG9hZGluZy1pY29uJyB9fVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI2J1aWxkSW5Mb2FkZXJJY29uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwicC1zY3JvbGxlci1sb2FkaW5nLWljb24gcGkgcGktc3Bpbm5lciBwaS1zcGluXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPG5nLXRlbXBsYXRlICNkaXNhYmxlZENvbnRhaW5lcj5cbiAgICAgICAgICAgIDxuZy1jb250ZW50PjwvbmctY29udGVudD5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb250ZW50VGVtcGxhdGVcIj5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiY29udGVudFRlbXBsYXRlOyBjb250ZXh0OiB7JGltcGxpY2l0OiBpdGVtcywgb3B0aW9uczoge3Jvd3M6IF9pdGVtcywgY29sdW1uczogbG9hZGVkQ29sdW1uc319XCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICBgLFxuICAgIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuRGVmYXVsdCxcbiAgICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxuICAgIHN0eWxlVXJsczogWycuL3Njcm9sbGVyLmNzcyddLFxuICAgIGhvc3Q6IHtcbiAgICAgICAgJ2NsYXNzJzogJ3Atc2Nyb2xsZXItdmlld3BvcnQgcC1lbGVtZW50J1xuICAgIH1cbn0pXG5leHBvcnQgY2xhc3MgU2Nyb2xsZXIgaW1wbGVtZW50cyBPbkluaXQsIEFmdGVyQ29udGVudEluaXQsIEFmdGVyVmlld0NoZWNrZWQsIE9uRGVzdHJveSB7XG5cbiAgICBASW5wdXQoKSBnZXQgaWQoKSB7IHJldHVybiB0aGlzLl9pZDsgfVxuICAgIHNldCBpZCh2YWw6IHN0cmluZykgeyB0aGlzLl9pZCA9IHZhbDsgfVxuXG4gICAgQElucHV0KCkgZ2V0IHN0eWxlKCkgeyByZXR1cm4gdGhpcy5fc3R5bGU7IH1cbiAgICBzZXQgc3R5bGUodmFsOiBhbnkpIHsgdGhpcy5fc3R5bGUgPSB2YWw7IH1cblxuICAgIEBJbnB1dCgpIGdldCBzdHlsZUNsYXNzKCkgeyByZXR1cm4gdGhpcy5fc3R5bGVDbGFzczsgfVxuICAgIHNldCBzdHlsZUNsYXNzKHZhbDogc3RyaW5nKSB7IHRoaXMuX3N0eWxlQ2xhc3MgPSB2YWw7IH1cblxuICAgIEBJbnB1dCgpIGdldCB0YWJpbmRleCgpIHsgcmV0dXJuIHRoaXMuX3RhYmluZGV4OyB9XG4gICAgc2V0IHRhYmluZGV4KHZhbDogbnVtYmVyKSB7IHRoaXMuX3RhYmluZGV4ID0gdmFsOyB9XG5cbiAgICBASW5wdXQoKSBnZXQgaXRlbXMoKSB7IHJldHVybiB0aGlzLl9pdGVtczsgfVxuICAgIHNldCBpdGVtcyh2YWw6IGFueVtdKSB7IHRoaXMuX2l0ZW1zID0gdmFsOyB9XG5cbiAgICBASW5wdXQoKSBnZXQgaXRlbVNpemUoKSB7IHJldHVybiB0aGlzLl9pdGVtU2l6ZTsgfVxuICAgIHNldCBpdGVtU2l6ZSh2YWw6IGFueSkgeyB0aGlzLl9pdGVtU2l6ZSA9IHZhbDsgfVxuXG4gICAgQElucHV0KCkgZ2V0IHNjcm9sbEhlaWdodCgpIHsgcmV0dXJuIHRoaXMuX3Njcm9sbEhlaWdodDsgfVxuICAgIHNldCBzY3JvbGxIZWlnaHQodmFsOiBzdHJpbmcpIHsgdGhpcy5fc2Nyb2xsSGVpZ2h0ID0gdmFsOyB9XG5cbiAgICBASW5wdXQoKSBnZXQgc2Nyb2xsV2lkdGgoKSB7IHJldHVybiB0aGlzLl9zY3JvbGxXaWR0aDsgfVxuICAgIHNldCBzY3JvbGxXaWR0aCh2YWw6IHN0cmluZykgeyB0aGlzLl9zY3JvbGxXaWR0aCA9IHZhbDsgfVxuXG4gICAgQElucHV0KCkgZ2V0IG9yaWVudGF0aW9uKCkgeyByZXR1cm4gdGhpcy5fb3JpZW50YXRpb247IH1cbiAgICBzZXQgb3JpZW50YXRpb24odmFsOiBzdHJpbmcpIHsgdGhpcy5fb3JpZW50YXRpb24gPSB2YWw7IH1cblxuICAgIEBJbnB1dCgpIGdldCBkZWxheSgpIHsgcmV0dXJuIHRoaXMuX2RlbGF5OyB9XG4gICAgc2V0IGRlbGF5KHZhbDogbnVtYmVyKSB7IHRoaXMuX2RlbGF5ID0gdmFsOyB9XG5cbiAgICBASW5wdXQoKSBnZXQgcmVzaXplRGVsYXkoKSB7IHJldHVybiB0aGlzLl9yZXNpemVEZWxheTsgfVxuICAgIHNldCByZXNpemVEZWxheSh2YWw6IG51bWJlcikgeyB0aGlzLl9yZXNpemVEZWxheSA9IHZhbDsgfVxuXG4gICAgQElucHV0KCkgZ2V0IGxhenkoKSB7IHJldHVybiB0aGlzLl9sYXp5OyB9XG4gICAgc2V0IGxhenkodmFsOiBib29sZWFuKSB7IHRoaXMuX2xhenkgPSB2YWw7IH1cblxuICAgIEBJbnB1dCgpIGdldCBkaXNhYmxlZCgpIHsgcmV0dXJuIHRoaXMuX2Rpc2FibGVkOyB9XG4gICAgc2V0IGRpc2FibGVkKHZhbDogYm9vbGVhbikgeyB0aGlzLl9kaXNhYmxlZCA9IHZhbDsgfVxuXG4gICAgQElucHV0KCkgZ2V0IGxvYWRlckRpc2FibGVkKCkgeyByZXR1cm4gdGhpcy5fbG9hZGVyRGlzYWJsZWQ7IH1cbiAgICBzZXQgbG9hZGVyRGlzYWJsZWQodmFsOiBib29sZWFuKSB7IHRoaXMuX2xvYWRlckRpc2FibGVkID0gdmFsOyB9XG5cbiAgICBASW5wdXQoKSBnZXQgY29sdW1ucygpIHsgcmV0dXJuIHRoaXMuX2NvbHVtbnM7IH1cbiAgICBzZXQgY29sdW1ucyh2YWw6IGFueVtdKSB7IHRoaXMuX2NvbHVtbnMgPSB2YWw7IH1cblxuICAgIEBJbnB1dCgpIGdldCBzaG93U3BhY2VyKCkgeyByZXR1cm4gdGhpcy5fc2hvd1NwYWNlcjsgfVxuICAgIHNldCBzaG93U3BhY2VyKHZhbDogYm9vbGVhbikgeyB0aGlzLl9zaG93U3BhY2VyID0gdmFsOyB9XG5cbiAgICBASW5wdXQoKSBnZXQgc2hvd0xvYWRlcigpIHsgcmV0dXJuIHRoaXMuX3Nob3dMb2FkZXI7IH1cbiAgICBzZXQgc2hvd0xvYWRlcih2YWw6IGJvb2xlYW4pIHsgdGhpcy5fc2hvd0xvYWRlciA9IHZhbDsgfVxuXG4gICAgQElucHV0KCkgZ2V0IG51bVRvbGVyYXRlZEl0ZW1zKCkgeyByZXR1cm4gdGhpcy5fbnVtVG9sZXJhdGVkSXRlbXM7IH1cbiAgICBzZXQgbnVtVG9sZXJhdGVkSXRlbXModmFsOiBudW1iZXIpIHsgdGhpcy5fbnVtVG9sZXJhdGVkSXRlbXMgPSB2YWw7IH1cblxuICAgIEBJbnB1dCgpIGdldCBsb2FkaW5nKCkgeyByZXR1cm4gdGhpcy5fbG9hZGluZzsgfVxuICAgIHNldCBsb2FkaW5nKHZhbDogYm9vbGVhbikgeyB0aGlzLl9sb2FkaW5nID0gdmFsOyB9XG5cbiAgICBASW5wdXQoKSBnZXQgYXV0b1NpemUoKSB7IHJldHVybiB0aGlzLl9hdXRvU2l6ZTsgfVxuICAgIHNldCBhdXRvU2l6ZSh2YWw6IGJvb2xlYW4pIHsgdGhpcy5fYXV0b1NpemUgPSB2YWw7IH1cblxuICAgIEBJbnB1dCgpIGdldCB0cmFja0J5KCkgeyByZXR1cm4gdGhpcy5fdHJhY2tCeTsgfVxuICAgIHNldCB0cmFja0J5KHZhbDogYW55KSB7IHRoaXMuX3RyYWNrQnkgPSB2YWw7IH1cblxuICAgIEBJbnB1dCgpIGdldCBvcHRpb25zKCkgeyByZXR1cm4gdGhpcy5fb3B0aW9uczsgfVxuICAgIHNldCBvcHRpb25zKHZhbDogU2Nyb2xsZXJPcHRpb25zKSB7XG4gICAgICAgIHRoaXMuX29wdGlvbnMgPSB2YWw7XG5cbiAgICAgICAgaWYgKHZhbCAmJiB0eXBlb2YgdmFsID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgT2JqZWN0LmVudHJpZXModmFsKS5mb3JFYWNoKChbaywgdl0pID0+IHRoaXNbYF8ke2t9YF0gIT09IHYgJiYgKHRoaXNbYF8ke2t9YF0gPSB2KSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBAVmlld0NoaWxkKCdlbGVtZW50JykgZWxlbWVudFZpZXdDaGlsZDogRWxlbWVudFJlZjtcblxuICAgIEBWaWV3Q2hpbGQoJ2NvbnRlbnQnKSBjb250ZW50Vmlld0NoaWxkOiBFbGVtZW50UmVmO1xuXG4gICAgQENvbnRlbnRDaGlsZHJlbihQcmltZVRlbXBsYXRlKSB0ZW1wbGF0ZXM6IFF1ZXJ5TGlzdDxhbnk+O1xuXG4gICAgQE91dHB1dCgpIG9uTGF6eUxvYWQ6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gICAgQE91dHB1dCgpIG9uU2Nyb2xsOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICAgIEBPdXRwdXQoKSBvblNjcm9sbEluZGV4Q2hhbmdlOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICAgIF9pZDogc3RyaW5nO1xuXG4gICAgX3N0eWxlOiBhbnk7XG5cbiAgICBfc3R5bGVDbGFzczogc3RyaW5nO1xuXG4gICAgX3RhYmluZGV4OiBudW1iZXIgPSAwO1xuXG4gICAgX2l0ZW1zOiBhbnlbXTtcblxuICAgIF9pdGVtU2l6ZTogYW55ID0gMDtcblxuICAgIF9zY3JvbGxIZWlnaHQ6IHN0cmluZztcblxuICAgIF9zY3JvbGxXaWR0aDogc3RyaW5nO1xuXG4gICAgX29yaWVudGF0aW9uOiBzdHJpbmcgPSAndmVydGljYWwnO1xuXG4gICAgX2RlbGF5OiBudW1iZXIgPSAwO1xuXG4gICAgX3Jlc2l6ZURlbGF5OiBudW1iZXIgPSAxMDtcblxuICAgIF9sYXp5OiBib29sZWFuID0gZmFsc2U7XG5cbiAgICBfZGlzYWJsZWQ6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAgIF9sb2FkZXJEaXNhYmxlZDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gICAgX2NvbHVtbnM6IGFueVtdO1xuXG4gICAgX3Nob3dTcGFjZXI6IGJvb2xlYW4gPSB0cnVlO1xuXG4gICAgX3Nob3dMb2FkZXI6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAgIF9udW1Ub2xlcmF0ZWRJdGVtczogYW55O1xuXG4gICAgX2xvYWRpbmc6IGJvb2xlYW47XG5cbiAgICBfYXV0b1NpemU6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAgIF90cmFja0J5OiBhbnk7XG5cbiAgICBfb3B0aW9uczogU2Nyb2xsZXJPcHRpb25zO1xuXG4gICAgZF9sb2FkaW5nOiBib29sZWFuID0gZmFsc2U7XG5cbiAgICBkX251bVRvbGVyYXRlZEl0ZW1zOiBhbnk7XG5cbiAgICBjb250ZW50RWw6IGFueTtcblxuICAgIGNvbnRlbnRUZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PjtcblxuICAgIGl0ZW1UZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PjtcblxuICAgIGxvYWRlclRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+O1xuXG4gICAgbG9hZGVySWNvblRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+O1xuXG4gICAgZmlyc3Q6IGFueSA9IDA7XG5cbiAgICBsYXN0OiBhbnkgPSAwO1xuXG4gICAgbnVtSXRlbXNJblZpZXdwb3J0OiBhbnkgPSAwO1xuXG4gICAgbGFzdFNjcm9sbFBvczogYW55ID0gMDtcblxuICAgIGxvYWRlckFycjogYW55W10gPSBbXTtcblxuICAgIHNwYWNlclN0eWxlOiBhbnkgPSB7fTtcblxuICAgIGNvbnRlbnRTdHlsZTogYW55ID0ge307XG5cbiAgICBzY3JvbGxUaW1lb3V0OiBhbnk7XG5cbiAgICByZXNpemVUaW1lb3V0OiBhbnk7XG5cbiAgICBpbml0aWFsaXplZDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gICAgd2luZG93UmVzaXplTGlzdGVuZXI6IGFueTtcblxuICAgIGRlZmF1bHRXaWR0aDogbnVtYmVyO1xuXG4gICAgZGVmYXVsdEhlaWdodDogbnVtYmVyO1xuXG4gICAgZ2V0IHZlcnRpY2FsKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fb3JpZW50YXRpb24gPT09ICd2ZXJ0aWNhbCc7XG4gICAgfVxuXG4gICAgZ2V0IGhvcml6b250YWwoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9vcmllbnRhdGlvbiA9PT0gJ2hvcml6b250YWwnO1xuICAgIH1cblxuICAgIGdldCBib3RoKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fb3JpZW50YXRpb24gPT09ICdib3RoJztcbiAgICB9XG5cbiAgICBnZXQgbG9hZGVkSXRlbXMoKSB7XG4gICAgICAgIGlmICh0aGlzLl9pdGVtcyAmJiAhdGhpcy5kX2xvYWRpbmcpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmJvdGgpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2l0ZW1zLnNsaWNlKHRoaXMuZmlyc3Qucm93cywgdGhpcy5sYXN0LnJvd3MpLm1hcChpdGVtID0+IHRoaXMuX2NvbHVtbnMgPyBpdGVtIDogaXRlbS5zbGljZSh0aGlzLmZpcnN0LmNvbHMsIHRoaXMubGFzdC5jb2xzKSk7XG4gICAgICAgICAgICBlbHNlIGlmICh0aGlzLmhvcml6b250YWwgJiYgdGhpcy5fY29sdW1ucylcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5faXRlbXM7XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2l0ZW1zLnNsaWNlKHRoaXMuZmlyc3QsIHRoaXMubGFzdCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gW107XG4gICAgfVxuXG4gICAgZ2V0IGxvYWRlZFJvd3MoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmRfbG9hZGluZyA/ICh0aGlzLl9sb2FkZXJEaXNhYmxlZCA/IHRoaXMubG9hZGVyQXJyIDogW10pIDogdGhpcy5sb2FkZWRJdGVtcztcbiAgICB9XG5cbiAgICBnZXQgbG9hZGVkQ29sdW1ucygpIHtcbiAgICAgICAgaWYgKHRoaXMuX2NvbHVtbnMgJiYgKHRoaXMuYm90aCB8fCB0aGlzLmhvcml6b250YWwpKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5kX2xvYWRpbmcgJiYgdGhpcy5fbG9hZGVyRGlzYWJsZWQgP1xuICAgICAgICAgICAgICAgICh0aGlzLmJvdGggPyB0aGlzLmxvYWRlckFyclswXSA6IHRoaXMubG9hZGVyQXJyKSA6XG4gICAgICAgICAgICAgICAgdGhpcy5fY29sdW1ucy5zbGljZSgodGhpcy5ib3RoID8gdGhpcy5maXJzdC5jb2xzIDogdGhpcy5maXJzdCksICh0aGlzLmJvdGggPyB0aGlzLmxhc3QuY29scyA6IHRoaXMubGFzdCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuX2NvbHVtbnM7XG4gICAgfVxuXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSBjZDogQ2hhbmdlRGV0ZWN0b3JSZWYsIHByaXZhdGUgem9uZTogTmdab25lKSB7XG4gICAgICAgIGlmICghdGhpcy5fZGlzYWJsZWQpIHtcbiAgICAgICAgICAgIHRoaXMuem9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy53aW5kb3dSZXNpemVMaXN0ZW5lciA9IHRoaXMub25XaW5kb3dSZXNpemUuYmluZCh0aGlzKTtcblxuICAgICAgICAgICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdyZXNpemUnLCB0aGlzLndpbmRvd1Jlc2l6ZUxpc3RlbmVyKTtcbiAgICAgICAgICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignb3JpZW50YXRpb25jaGFuZ2UnLCB0aGlzLndpbmRvd1Jlc2l6ZUxpc3RlbmVyKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgbmdPbkluaXQoKSB7XG4gICAgICAgIHRoaXMuc2V0SW5pdGlhbFN0YXRlKCk7XG4gICAgfVxuXG4gICAgbmdPbkNoYW5nZXMoc2ltcGxlQ2hhbmdlczogU2ltcGxlQ2hhbmdlcykge1xuICAgICAgICBpZiAodGhpcy5pbml0aWFsaXplZCkge1xuICAgICAgICAgICAgbGV0IGFyZUl0ZW1zQ2hhbmdlZCA9IGZhbHNlO1xuICAgICAgICAgICAgaWYgKHNpbXBsZUNoYW5nZXMuaXRlbXMpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB7IHByZXZpb3VzVmFsdWU6IHByZXZJdGVtcywgY3VycmVudFZhbHVlOiBjdXJyZW50SXRlbXMgfSA9IHNpbXBsZUNoYW5nZXMuaXRlbXM7XG4gICAgICAgICAgICAgICAgYXJlSXRlbXNDaGFuZ2VkID0gIXByZXZJdGVtcyB8fCBwcmV2SXRlbXMubGVuZ3RoICE9PSAoY3VycmVudEl0ZW1zIHx8IFtdKS5sZW5ndGg7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGlzQ2hhbmdlZCA9IChhcmVJdGVtc0NoYW5nZWQgfHwgc2ltcGxlQ2hhbmdlcy5pdGVtU2l6ZSB8fCBzaW1wbGVDaGFuZ2VzLnNjcm9sbEhlaWdodCB8fCBzaW1wbGVDaGFuZ2VzLnNjcm9sbFdpZHRoKTtcbiAgICAgICAgICAgIGlzQ2hhbmdlZCAmJiB0aGlzLmluaXQoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChzaW1wbGVDaGFuZ2VzLm9yaWVudGF0aW9uKSB7XG4gICAgICAgICAgICB0aGlzLmxhc3RTY3JvbGxQb3MgPSB0aGlzLmJvdGggPyB7IHRvcDogMCwgbGVmdDogMCB9IDogMDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChzaW1wbGVDaGFuZ2VzLmxvYWRpbmcpIHtcbiAgICAgICAgICAgIGNvbnN0IHsgcHJldmlvdXNWYWx1ZSwgY3VycmVudFZhbHVlIH0gPSBzaW1wbGVDaGFuZ2VzLmxvYWRpbmc7XG5cbiAgICAgICAgICAgIGlmICh0aGlzLmxhenkgJiYgcHJldmlvdXNWYWx1ZSAhPT0gY3VycmVudFZhbHVlICYmIGN1cnJlbnRWYWx1ZSAhPT0gdGhpcy5kX2xvYWRpbmcpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmRfbG9hZGluZyA9IGN1cnJlbnRWYWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChzaW1wbGVDaGFuZ2VzLm51bVRvbGVyYXRlZEl0ZW1zKSB7XG4gICAgICAgICAgICBjb25zdCB7IHByZXZpb3VzVmFsdWUsIGN1cnJlbnRWYWx1ZSB9ID0gc2ltcGxlQ2hhbmdlcy5udW1Ub2xlcmF0ZWRJdGVtcztcblxuICAgICAgICAgICAgaWYgKHByZXZpb3VzVmFsdWUgIT09IGN1cnJlbnRWYWx1ZSAmJiBjdXJyZW50VmFsdWUgIT09IHRoaXMuZF9udW1Ub2xlcmF0ZWRJdGVtcykge1xuICAgICAgICAgICAgICAgIHRoaXMuZF9udW1Ub2xlcmF0ZWRJdGVtcyA9IGN1cnJlbnRWYWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChzaW1wbGVDaGFuZ2VzLm9wdGlvbnMpIHtcbiAgICAgICAgICAgIGNvbnN0IHsgcHJldmlvdXNWYWx1ZSwgY3VycmVudFZhbHVlIH0gPSBzaW1wbGVDaGFuZ2VzLm9wdGlvbnM7XG5cbiAgICAgICAgICAgIGlmICh0aGlzLmxhenkgJiYgcHJldmlvdXNWYWx1ZT8ubG9hZGluZyAhPT0gY3VycmVudFZhbHVlPy5sb2FkaW5nICYmIGN1cnJlbnRWYWx1ZT8ubG9hZGluZyAhPT0gdGhpcy5kX2xvYWRpbmcpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmRfbG9hZGluZyA9IGN1cnJlbnRWYWx1ZS5sb2FkaW5nO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAocHJldmlvdXNWYWx1ZT8ubnVtVG9sZXJhdGVkSXRlbXMgIT09IGN1cnJlbnRWYWx1ZT8ubnVtVG9sZXJhdGVkSXRlbXMgJiYgY3VycmVudFZhbHVlPy5udW1Ub2xlcmF0ZWRJdGVtcyAhPT0gdGhpcy5kX251bVRvbGVyYXRlZEl0ZW1zKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5kX251bVRvbGVyYXRlZEl0ZW1zID0gY3VycmVudFZhbHVlLm51bVRvbGVyYXRlZEl0ZW1zO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgbmdBZnRlckNvbnRlbnRJbml0KCkge1xuICAgICAgICB0aGlzLnRlbXBsYXRlcy5mb3JFYWNoKChpdGVtKSA9PiB7XG4gICAgICAgICAgICBzd2l0Y2ggKGl0ZW0uZ2V0VHlwZSgpKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAnY29udGVudCc6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY29udGVudFRlbXBsYXRlID0gaXRlbS50ZW1wbGF0ZTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgICAgICBjYXNlICdpdGVtJzpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pdGVtVGVtcGxhdGUgPSBpdGVtLnRlbXBsYXRlO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgICAgIGNhc2UgJ2xvYWRlcic6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubG9hZGVyVGVtcGxhdGUgPSBpdGVtLnRlbXBsYXRlO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgICAgIGNhc2UgJ2xvYWRlcmljb24nOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLmxvYWRlckljb25UZW1wbGF0ZSA9IGl0ZW0udGVtcGxhdGU7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pdGVtVGVtcGxhdGUgPSBpdGVtLnRlbXBsYXRlO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgbmdBZnRlclZpZXdJbml0KCkge1xuICAgICAgICB0aGlzLnNldENvbnRlbnRFbCh0aGlzLmNvbnRlbnRFbCk7XG4gICAgICAgIHRoaXMuaW5pdCgpO1xuXG4gICAgICAgIHRoaXMuZGVmYXVsdFdpZHRoID0gRG9tSGFuZGxlci5nZXRXaWR0aCh0aGlzLmVsZW1lbnRWaWV3Q2hpbGQubmF0aXZlRWxlbWVudCk7XG4gICAgICAgIHRoaXMuZGVmYXVsdEhlaWdodCA9IERvbUhhbmRsZXIuZ2V0SGVpZ2h0KHRoaXMuZWxlbWVudFZpZXdDaGlsZC5uYXRpdmVFbGVtZW50KTtcbiAgICAgICAgdGhpcy5pbml0aWFsaXplZCA9IHRydWU7XG4gICAgfVxuXG4gICAgbmdBZnRlclZpZXdDaGVja2VkKCkge1xuICAgICAgICB0aGlzLmNhbGN1bGF0ZUF1dG9TaXplKCk7XG4gICAgfVxuXG4gICAgbmdPbkRlc3Ryb3koKSB7XG4gICAgICAgIGlmICh0aGlzLndpbmRvd1Jlc2l6ZUxpc3RlbmVyKSB7XG4gICAgICAgICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigncmVzaXplJywgdGhpcy53aW5kb3dSZXNpemVMaXN0ZW5lcik7XG4gICAgICAgICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcignb3JpZW50YXRpb25jaGFuZ2UnLCB0aGlzLndpbmRvd1Jlc2l6ZUxpc3RlbmVyKTtcbiAgICAgICAgICAgIHRoaXMud2luZG93UmVzaXplTGlzdGVuZXIgPSBudWxsO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgaW5pdCgpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9kaXNhYmxlZCkge1xuICAgICAgICAgICAgdGhpcy5zZXRTaXplKCk7XG4gICAgICAgICAgICB0aGlzLmNhbGN1bGF0ZU9wdGlvbnMoKTtcbiAgICAgICAgICAgIHRoaXMuc2V0U3BhY2VyU2l6ZSgpO1xuXG4gICAgICAgICAgICB0aGlzLmNkLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHNldENvbnRlbnRFbChlbD86IEhUTUxFbGVtZW50KSB7XG4gICAgICAgIHRoaXMuY29udGVudEVsID0gZWwgfHwgdGhpcy5jb250ZW50Vmlld0NoaWxkPy5uYXRpdmVFbGVtZW50IHx8IERvbUhhbmRsZXIuZmluZFNpbmdsZSh0aGlzLmVsZW1lbnRWaWV3Q2hpbGQ/Lm5hdGl2ZUVsZW1lbnQsICcucC1zY3JvbGxlci1jb250ZW50Jyk7XG4gICAgfVxuXG4gICAgc2V0SW5pdGlhbFN0YXRlKCkge1xuICAgICAgICB0aGlzLmZpcnN0ID0gdGhpcy5ib3RoID8geyByb3dzOiAwLCBjb2xzOiAwIH0gOiAwO1xuICAgICAgICB0aGlzLmxhc3QgPSB0aGlzLmJvdGggPyB7IHJvd3M6IDAsIGNvbHM6IDAgfSA6IDA7XG4gICAgICAgIHRoaXMubnVtSXRlbXNJblZpZXdwb3J0ID0gdGhpcy5ib3RoID8geyByb3dzOiAwLCBjb2xzOiAwIH0gOiAwO1xuICAgICAgICB0aGlzLmxhc3RTY3JvbGxQb3MgPSB0aGlzLmJvdGggPyB7IHRvcDogMCwgbGVmdDogMCB9IDogMDtcbiAgICAgICAgdGhpcy5kX2xvYWRpbmcgPSB0aGlzLl9sb2FkaW5nIHx8IGZhbHNlO1xuICAgICAgICB0aGlzLmRfbnVtVG9sZXJhdGVkSXRlbXMgPSB0aGlzLl9udW1Ub2xlcmF0ZWRJdGVtcztcbiAgICB9XG5cbiAgICBnZXRFbGVtZW50UmVmKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5lbGVtZW50Vmlld0NoaWxkO1xuICAgIH1cblxuICAgIHNjcm9sbFRvKG9wdGlvbnM6IFNjcm9sbFRvT3B0aW9ucykge1xuICAgICAgICB0aGlzLmVsZW1lbnRWaWV3Q2hpbGQ/Lm5hdGl2ZUVsZW1lbnQ/LnNjcm9sbFRvKG9wdGlvbnMpO1xuICAgIH1cblxuICAgIHNjcm9sbFRvSW5kZXgoaW5kZXg6IG51bWJlciwgYmVoYXZpb3I6IFNjcm9sbEJlaGF2aW9yID0gJ2F1dG8nKSB7XG4gICAgICAgIGNvbnN0IHsgbnVtVG9sZXJhdGVkSXRlbXMgfSA9IHRoaXMuY2FsY3VsYXRlTnVtSXRlbXMoKTtcbiAgICAgICAgY29uc3QgY29udGVudFBvcyA9IHRoaXMuZ2V0Q29udGVudFBvc2l0aW9uKCk7XG4gICAgICAgIGNvbnN0IGNhbGN1bGF0ZUZpcnN0ID0gKF9pbmRleCA9IDAsIF9udW1UKSA9PiAoX2luZGV4IDw9IF9udW1UID8gMCA6IF9pbmRleCk7XG4gICAgICAgIGNvbnN0IGNhbGN1bGF0ZUNvb3JkID0gKF9maXJzdCwgX3NpemUsIF9jcG9zKSA9PiAoX2ZpcnN0ICogX3NpemUpICsgX2Nwb3M7XG4gICAgICAgIGNvbnN0IHNjcm9sbFRvID0gKGxlZnQgPSAwLCB0b3AgPSAwKSA9PiB0aGlzLnNjcm9sbFRvKHsgbGVmdCwgdG9wLCBiZWhhdmlvciB9KTtcblxuICAgICAgICBpZiAodGhpcy5ib3RoKSB7XG4gICAgICAgICAgICBjb25zdCBuZXdGaXJzdCA9IHsgcm93czogY2FsY3VsYXRlRmlyc3QoaW5kZXhbMF0sIG51bVRvbGVyYXRlZEl0ZW1zWzBdKSwgY29sczogY2FsY3VsYXRlRmlyc3QoaW5kZXhbMV0sIG51bVRvbGVyYXRlZEl0ZW1zWzFdKSB9O1xuICAgICAgICAgICAgaWYgKG5ld0ZpcnN0LnJvd3MgIT09IHRoaXMuZmlyc3Qucm93cyB8fCBuZXdGaXJzdC5jb2xzICE9PSB0aGlzLmZpcnN0LmNvbHMpIHtcbiAgICAgICAgICAgICAgICBzY3JvbGxUbyhjYWxjdWxhdGVDb29yZChuZXdGaXJzdC5jb2xzLCB0aGlzLl9pdGVtU2l6ZVsxXSwgY29udGVudFBvcy5sZWZ0KSwgY2FsY3VsYXRlQ29vcmQobmV3Rmlyc3Qucm93cywgdGhpcy5faXRlbVNpemVbMF0sIGNvbnRlbnRQb3MudG9wKSlcbiAgICAgICAgICAgICAgICB0aGlzLmZpcnN0ID0gbmV3Rmlyc3Q7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBuZXdGaXJzdCA9IGNhbGN1bGF0ZUZpcnN0KGluZGV4LCBudW1Ub2xlcmF0ZWRJdGVtcyk7XG5cbiAgICAgICAgICAgIGlmIChuZXdGaXJzdCAhPT0gdGhpcy5maXJzdCkge1xuICAgICAgICAgICAgICAgIHRoaXMuaG9yaXpvbnRhbCA/IHNjcm9sbFRvKGNhbGN1bGF0ZUNvb3JkKG5ld0ZpcnN0LCB0aGlzLl9pdGVtU2l6ZSwgY29udGVudFBvcy5sZWZ0KSwgMCkgOiBzY3JvbGxUbygwLCBjYWxjdWxhdGVDb29yZChuZXdGaXJzdCwgdGhpcy5faXRlbVNpemUsIGNvbnRlbnRQb3MudG9wKSk7XG4gICAgICAgICAgICAgICAgdGhpcy5maXJzdCA9IG5ld0ZpcnN0O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgc2Nyb2xsSW5WaWV3KGluZGV4OiBudW1iZXIsIHRvOiBTY3JvbGxlclRvVHlwZSwgYmVoYXZpb3I6IFNjcm9sbEJlaGF2aW9yID0gJ2F1dG8nKSB7XG4gICAgICAgIGlmICh0bykge1xuICAgICAgICAgICAgY29uc3QgeyBmaXJzdCwgdmlld3BvcnQgfSA9IHRoaXMuZ2V0UmVuZGVyZWRSYW5nZSgpO1xuICAgICAgICAgICAgY29uc3Qgc2Nyb2xsVG8gPSAobGVmdCA9IDAsIHRvcCA9IDApID0+IHRoaXMuc2Nyb2xsVG8oeyBsZWZ0LCB0b3AsIGJlaGF2aW9yIH0pO1xuICAgICAgICAgICAgY29uc3QgaXNUb1N0YXJ0ID0gdG8gPT09ICd0by1zdGFydCc7XG4gICAgICAgICAgICBjb25zdCBpc1RvRW5kID0gdG8gPT09ICd0by1lbmQnO1xuXG4gICAgICAgICAgICBpZiAoaXNUb1N0YXJ0KSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuYm90aCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAodmlld3BvcnQuZmlyc3Qucm93cyAtIGZpcnN0LnJvd3MgPiBpbmRleFswXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2Nyb2xsVG8odmlld3BvcnQuZmlyc3QuY29scyAqIHRoaXMuX2l0ZW1TaXplWzFdLCAodmlld3BvcnQuZmlyc3Qucm93cyAtIDEpICogdGhpcy5faXRlbVNpemVbMF0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHZpZXdwb3J0LmZpcnN0LmNvbHMgLSBmaXJzdC5jb2xzID4gaW5kZXhbMV0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNjcm9sbFRvKCh2aWV3cG9ydC5maXJzdC5jb2xzIC0gMSkgKiB0aGlzLl9pdGVtU2l6ZVsxXSwgdmlld3BvcnQuZmlyc3Qucm93cyAqIHRoaXMuX2l0ZW1TaXplWzBdKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHZpZXdwb3J0LmZpcnN0IC0gZmlyc3QgPiBpbmRleCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcG9zID0gKHZpZXdwb3J0LmZpcnN0IC0gMSkgKiB0aGlzLl9pdGVtU2l6ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaG9yaXpvbnRhbCA/IHNjcm9sbFRvKHBvcywgMCkgOiBzY3JvbGxUbygwLCBwb3MpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoaXNUb0VuZCkge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmJvdGgpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHZpZXdwb3J0Lmxhc3Qucm93cyAtIGZpcnN0LnJvd3MgPD0gaW5kZXhbMF0gKyAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzY3JvbGxUbyh2aWV3cG9ydC5maXJzdC5jb2xzICogdGhpcy5faXRlbVNpemVbMV0sICh2aWV3cG9ydC5maXJzdC5yb3dzICsgMSkgKiB0aGlzLl9pdGVtU2l6ZVswXSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAodmlld3BvcnQubGFzdC5jb2xzIC0gZmlyc3QuY29scyA8PSBpbmRleFsxXSArIDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNjcm9sbFRvKCh2aWV3cG9ydC5maXJzdC5jb2xzICsgMSkgKiB0aGlzLl9pdGVtU2l6ZVsxXSwgdmlld3BvcnQuZmlyc3Qucm93cyAqIHRoaXMuX2l0ZW1TaXplWzBdKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHZpZXdwb3J0Lmxhc3QgLSBmaXJzdCA8PSBpbmRleCArIDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHBvcyA9ICh2aWV3cG9ydC5maXJzdCArIDEpICogdGhpcy5faXRlbVNpemU7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmhvcml6b250YWwgPyBzY3JvbGxUbyhwb3MsIDApIDogc2Nyb2xsVG8oMCwgcG9zKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuc2Nyb2xsVG9JbmRleChpbmRleCwgYmVoYXZpb3IpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZ2V0UmVuZGVyZWRSYW5nZSgpIHtcbiAgICAgICAgY29uc3QgY2FsY3VsYXRlRmlyc3RJblZpZXdwb3J0ID0gKF9wb3MsIF9zaXplKSA9PiBNYXRoLmZsb29yKF9wb3MgLyAoX3NpemUgfHwgX3BvcykpO1xuXG4gICAgICAgIGxldCBmaXJzdEluVmlld3BvcnQgPSB0aGlzLmZpcnN0O1xuICAgICAgICBsZXQgbGFzdEluVmlld3BvcnQ6IGFueSA9IDA7XG5cbiAgICAgICAgaWYgKHRoaXMuZWxlbWVudFZpZXdDaGlsZD8ubmF0aXZlRWxlbWVudCkge1xuICAgICAgICAgICAgY29uc3QgeyBzY3JvbGxUb3AsIHNjcm9sbExlZnQgfSA9IHRoaXMuZWxlbWVudFZpZXdDaGlsZC5uYXRpdmVFbGVtZW50O1xuXG4gICAgICAgICAgICBpZiAodGhpcy5ib3RoKSB7XG4gICAgICAgICAgICAgICAgZmlyc3RJblZpZXdwb3J0ID0geyByb3dzOiBjYWxjdWxhdGVGaXJzdEluVmlld3BvcnQoc2Nyb2xsVG9wLCB0aGlzLl9pdGVtU2l6ZVswXSksIGNvbHM6IGNhbGN1bGF0ZUZpcnN0SW5WaWV3cG9ydChzY3JvbGxMZWZ0LCB0aGlzLl9pdGVtU2l6ZVsxXSkgfTtcbiAgICAgICAgICAgICAgICBsYXN0SW5WaWV3cG9ydCA9IHsgcm93czogZmlyc3RJblZpZXdwb3J0LnJvd3MgKyB0aGlzLm51bUl0ZW1zSW5WaWV3cG9ydC5yb3dzLCBjb2xzOiBmaXJzdEluVmlld3BvcnQuY29scyArIHRoaXMubnVtSXRlbXNJblZpZXdwb3J0LmNvbHMgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnN0IHNjcm9sbFBvcyA9IHRoaXMuaG9yaXpvbnRhbCA/IHNjcm9sbExlZnQgOiBzY3JvbGxUb3A7XG4gICAgICAgICAgICAgICAgZmlyc3RJblZpZXdwb3J0ID0gY2FsY3VsYXRlRmlyc3RJblZpZXdwb3J0KHNjcm9sbFBvcywgdGhpcy5faXRlbVNpemUpO1xuICAgICAgICAgICAgICAgIGxhc3RJblZpZXdwb3J0ID0gZmlyc3RJblZpZXdwb3J0ICsgdGhpcy5udW1JdGVtc0luVmlld3BvcnQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgZmlyc3Q6IHRoaXMuZmlyc3QsXG4gICAgICAgICAgICBsYXN0OiB0aGlzLmxhc3QsXG4gICAgICAgICAgICB2aWV3cG9ydDoge1xuICAgICAgICAgICAgICAgIGZpcnN0OiBmaXJzdEluVmlld3BvcnQsXG4gICAgICAgICAgICAgICAgbGFzdDogbGFzdEluVmlld3BvcnRcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGNhbGN1bGF0ZU51bUl0ZW1zKCkge1xuICAgICAgICBjb25zdCBjb250ZW50UG9zID0gdGhpcy5nZXRDb250ZW50UG9zaXRpb24oKTtcbiAgICAgICAgY29uc3QgY29udGVudFdpZHRoID0gdGhpcy5lbGVtZW50Vmlld0NoaWxkPy5uYXRpdmVFbGVtZW50ID8gdGhpcy5lbGVtZW50Vmlld0NoaWxkLm5hdGl2ZUVsZW1lbnQub2Zmc2V0V2lkdGggLSBjb250ZW50UG9zLmxlZnQgOiAwO1xuICAgICAgICBjb25zdCBjb250ZW50SGVpZ2h0ID0gdGhpcy5lbGVtZW50Vmlld0NoaWxkPy5uYXRpdmVFbGVtZW50ID8gdGhpcy5lbGVtZW50Vmlld0NoaWxkLm5hdGl2ZUVsZW1lbnQub2Zmc2V0SGVpZ2h0IC0gY29udGVudFBvcy50b3AgOiAwO1xuICAgICAgICBjb25zdCBjYWxjdWxhdGVOdW1JdGVtc0luVmlld3BvcnQgPSAoX2NvbnRlbnRTaXplLCBfaXRlbVNpemUpID0+IE1hdGguY2VpbChfY29udGVudFNpemUgLyAoX2l0ZW1TaXplIHx8IF9jb250ZW50U2l6ZSkpO1xuICAgICAgICBjb25zdCBjYWxjdWxhdGVOdW1Ub2xlcmF0ZWRJdGVtcyA9IChfbnVtSXRlbXMpID0+IE1hdGguY2VpbChfbnVtSXRlbXMgLyAyKTtcbiAgICAgICAgY29uc3QgbnVtSXRlbXNJblZpZXdwb3J0OiBhbnkgPSB0aGlzLmJvdGggP1xuICAgICAgICAgICAgeyByb3dzOiBjYWxjdWxhdGVOdW1JdGVtc0luVmlld3BvcnQoY29udGVudEhlaWdodCwgdGhpcy5faXRlbVNpemVbMF0pLCBjb2xzOiBjYWxjdWxhdGVOdW1JdGVtc0luVmlld3BvcnQoY29udGVudFdpZHRoLCB0aGlzLl9pdGVtU2l6ZVsxXSkgfSA6XG4gICAgICAgICAgICBjYWxjdWxhdGVOdW1JdGVtc0luVmlld3BvcnQoKHRoaXMuaG9yaXpvbnRhbCA/IGNvbnRlbnRXaWR0aCA6IGNvbnRlbnRIZWlnaHQpLCB0aGlzLl9pdGVtU2l6ZSk7XG5cbiAgICAgICAgY29uc3QgbnVtVG9sZXJhdGVkSXRlbXMgPSB0aGlzLmRfbnVtVG9sZXJhdGVkSXRlbXMgfHwgKHRoaXMuYm90aCA/XG4gICAgICAgICAgICBbY2FsY3VsYXRlTnVtVG9sZXJhdGVkSXRlbXMobnVtSXRlbXNJblZpZXdwb3J0LnJvd3MpLCBjYWxjdWxhdGVOdW1Ub2xlcmF0ZWRJdGVtcyhudW1JdGVtc0luVmlld3BvcnQuY29scyldIDpcbiAgICAgICAgICAgIGNhbGN1bGF0ZU51bVRvbGVyYXRlZEl0ZW1zKG51bUl0ZW1zSW5WaWV3cG9ydCkpO1xuXG4gICAgICAgIHJldHVybiB7IG51bUl0ZW1zSW5WaWV3cG9ydCwgbnVtVG9sZXJhdGVkSXRlbXMgfTtcbiAgICB9XG5cbiAgICBjYWxjdWxhdGVPcHRpb25zKCkge1xuICAgICAgICBjb25zdCB7IG51bUl0ZW1zSW5WaWV3cG9ydCwgbnVtVG9sZXJhdGVkSXRlbXMgfSA9IHRoaXMuY2FsY3VsYXRlTnVtSXRlbXMoKTtcbiAgICAgICAgY29uc3QgY2FsY3VsYXRlTGFzdCA9IChfZmlyc3QsIF9udW0sIF9udW1ULCBfaXNDb2xzID0gZmFsc2UpID0+IHRoaXMuZ2V0TGFzdChfZmlyc3QgKyBfbnVtICsgKChfZmlyc3QgPCBfbnVtVCA/IDIgOiAzKSAqIF9udW1UKSwgX2lzQ29scyk7XG4gICAgICAgIGNvbnN0IGZpcnN0ID0gdGhpcy5maXJzdDtcbiAgICAgICAgY29uc3QgbGFzdCA9IHRoaXMuYm90aCA/XG4gICAgICAgICAgICB7IHJvd3M6IGNhbGN1bGF0ZUxhc3QodGhpcy5maXJzdC5yb3dzLCBudW1JdGVtc0luVmlld3BvcnQucm93cywgbnVtVG9sZXJhdGVkSXRlbXNbMF0pLCBjb2xzOiBjYWxjdWxhdGVMYXN0KHRoaXMuZmlyc3QuY29scywgbnVtSXRlbXNJblZpZXdwb3J0LmNvbHMsIG51bVRvbGVyYXRlZEl0ZW1zWzFdLCB0cnVlKSB9IDpcbiAgICAgICAgICAgIGNhbGN1bGF0ZUxhc3QodGhpcy5maXJzdCwgbnVtSXRlbXNJblZpZXdwb3J0LCBudW1Ub2xlcmF0ZWRJdGVtcyk7XG5cbiAgICAgICAgdGhpcy5sYXN0ID0gbGFzdDtcbiAgICAgICAgdGhpcy5udW1JdGVtc0luVmlld3BvcnQgPSBudW1JdGVtc0luVmlld3BvcnQ7XG4gICAgICAgIHRoaXMuZF9udW1Ub2xlcmF0ZWRJdGVtcyA9IG51bVRvbGVyYXRlZEl0ZW1zO1xuXG4gICAgICAgIGlmICh0aGlzLnNob3dMb2FkZXIpIHtcbiAgICAgICAgICAgIHRoaXMubG9hZGVyQXJyID0gdGhpcy5ib3RoID9cbiAgICAgICAgICAgICAgICBBcnJheS5mcm9tKHsgbGVuZ3RoOiBudW1JdGVtc0luVmlld3BvcnQucm93cyB9KS5tYXAoKCkgPT4gQXJyYXkuZnJvbSh7IGxlbmd0aDogbnVtSXRlbXNJblZpZXdwb3J0LmNvbHMgfSkpIDpcbiAgICAgICAgICAgICAgICBBcnJheS5mcm9tKHsgbGVuZ3RoOiBudW1JdGVtc0luVmlld3BvcnQgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5fbGF6eSkge1xuICAgICAgICAgICAgdGhpcy5oYW5kbGVFdmVudHMoJ29uTGF6eUxvYWQnLCB7IGZpcnN0LCBsYXN0IH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgY2FsY3VsYXRlQXV0b1NpemUoKSB7XG4gICAgICAgIGlmICh0aGlzLl9hdXRvU2l6ZSAmJiAhdGhpcy5kX2xvYWRpbmcpIHtcbiAgICAgICAgICAgIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmNvbnRlbnRFbCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnRlbnRFbC5zdHlsZS5taW5IZWlnaHQgPSB0aGlzLmNvbnRlbnRFbC5zdHlsZS5taW5XaWR0aCA9ICdhdXRvJztcblxuICAgICAgICAgICAgICAgICAgICBjb25zdCB7IG9mZnNldFdpZHRoLCBvZmZzZXRIZWlnaHQgfSA9IHRoaXMuY29udGVudEVsO1xuXG4gICAgICAgICAgICAgICAgICAgICh0aGlzLmJvdGggfHwgdGhpcy5ob3Jpem9udGFsKSAmJiAodGhpcy5lbGVtZW50Vmlld0NoaWxkLm5hdGl2ZUVsZW1lbnQuc3R5bGUud2lkdGggPSAob2Zmc2V0V2lkdGggPCB0aGlzLmRlZmF1bHRXaWR0aCA/IG9mZnNldFdpZHRoIDogdGhpcy5kZWZhdWx0V2lkdGgpICsgJ3B4Jyk7XG4gICAgICAgICAgICAgICAgICAgICh0aGlzLmJvdGggfHwgdGhpcy52ZXJ0aWNhbCkgJiYgKHRoaXMuZWxlbWVudFZpZXdDaGlsZC5uYXRpdmVFbGVtZW50LnN0eWxlLmhlaWdodCA9IChvZmZzZXRIZWlnaHQgPCB0aGlzLmRlZmF1bHRIZWlnaHQgPyBvZmZzZXRIZWlnaHQgOiB0aGlzLmRlZmF1bHRIZWlnaHQpICsgJ3B4Jyk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY29udGVudEVsLnN0eWxlLm1pbkhlaWdodCA9IHRoaXMuY29udGVudEVsLnN0eWxlLm1pbldpZHRoID0gJyc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBnZXRMYXN0KGxhc3QgPSAwLCBpc0NvbHMgPSBmYWxzZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5faXRlbXMgPyBNYXRoLm1pbigoaXNDb2xzID8gKHRoaXMuX2NvbHVtbnMgfHwgdGhpcy5faXRlbXNbMF0pLmxlbmd0aCA6IHRoaXMuX2l0ZW1zLmxlbmd0aCksIGxhc3QpIDogMDtcbiAgICB9XG5cbiAgICBnZXRDb250ZW50UG9zaXRpb24oKSB7XG4gICAgICAgIGlmICh0aGlzLmNvbnRlbnRFbCkge1xuICAgICAgICAgICAgY29uc3Qgc3R5bGUgPSBnZXRDb21wdXRlZFN0eWxlKHRoaXMuY29udGVudEVsKTtcbiAgICAgICAgICAgIGNvbnN0IGxlZnQgPSBwYXJzZUludChzdHlsZS5wYWRkaW5nTGVmdCwgMTApICsgTWF0aC5tYXgocGFyc2VJbnQoc3R5bGUubGVmdCwgMTApLCAwKTtcbiAgICAgICAgICAgIGNvbnN0IHJpZ2h0ID0gcGFyc2VJbnQoc3R5bGUucGFkZGluZ1JpZ2h0LCAxMCkgKyBNYXRoLm1heChwYXJzZUludChzdHlsZS5yaWdodCwgMTApLCAwKTtcbiAgICAgICAgICAgIGNvbnN0IHRvcCA9IHBhcnNlSW50KHN0eWxlLnBhZGRpbmdUb3AsIDEwKSArIE1hdGgubWF4KHBhcnNlSW50KHN0eWxlLnRvcCwgMTApLCAwKTtcbiAgICAgICAgICAgIGNvbnN0IGJvdHRvbSA9IHBhcnNlSW50KHN0eWxlLnBhZGRpbmdCb3R0b20sIDEwKSArIE1hdGgubWF4KHBhcnNlSW50KHN0eWxlLmJvdHRvbSwgMTApLCAwKTtcblxuICAgICAgICAgICAgcmV0dXJuIHsgbGVmdCwgcmlnaHQsIHRvcCwgYm90dG9tLCB4OiBsZWZ0ICsgcmlnaHQsIHk6IHRvcCArIGJvdHRvbSB9O1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHsgbGVmdDogMCwgcmlnaHQ6IDAsIHRvcDogMCwgYm90dG9tOiAwLCB4OiAwLCB5OiAwIH07XG4gICAgfVxuXG4gICAgc2V0U2l6ZSgpIHtcbiAgICAgICAgaWYgKHRoaXMuZWxlbWVudFZpZXdDaGlsZD8ubmF0aXZlRWxlbWVudCkge1xuICAgICAgICAgICAgY29uc3QgcGFyZW50RWxlbWVudCA9IHRoaXMuZWxlbWVudFZpZXdDaGlsZC5uYXRpdmVFbGVtZW50LnBhcmVudEVsZW1lbnQucGFyZW50RWxlbWVudDtcbiAgICAgICAgICAgIGNvbnN0IHdpZHRoID0gdGhpcy5fc2Nyb2xsV2lkdGggfHwgYCR7KHRoaXMuZWxlbWVudFZpZXdDaGlsZC5uYXRpdmVFbGVtZW50Lm9mZnNldFdpZHRoIHx8IHBhcmVudEVsZW1lbnQub2Zmc2V0V2lkdGgpfXB4YDtcbiAgICAgICAgICAgIGNvbnN0IGhlaWdodCA9IHRoaXMuX3Njcm9sbEhlaWdodCB8fCBgJHsodGhpcy5lbGVtZW50Vmlld0NoaWxkLm5hdGl2ZUVsZW1lbnQub2Zmc2V0SGVpZ2h0IHx8IHBhcmVudEVsZW1lbnQub2Zmc2V0SGVpZ2h0KX1weGA7XG4gICAgICAgICAgICBjb25zdCBzZXRQcm9wID0gKF9uYW1lLCBfdmFsdWUpID0+IHRoaXMuZWxlbWVudFZpZXdDaGlsZC5uYXRpdmVFbGVtZW50LnN0eWxlW19uYW1lXSA9IF92YWx1ZTtcblxuICAgICAgICAgICAgaWYgKHRoaXMuYm90aCB8fCB0aGlzLmhvcml6b250YWwpIHtcbiAgICAgICAgICAgICAgICBzZXRQcm9wKCdoZWlnaHQnLCBoZWlnaHQpO1xuICAgICAgICAgICAgICAgIHNldFByb3AoJ3dpZHRoJywgd2lkdGgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgc2V0UHJvcCgnaGVpZ2h0JywgaGVpZ2h0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHNldFNwYWNlclNpemUoKSB7XG4gICAgICAgIGlmICh0aGlzLl9pdGVtcykge1xuICAgICAgICAgICAgY29uc3QgY29udGVudFBvcyA9IHRoaXMuZ2V0Q29udGVudFBvc2l0aW9uKCk7XG4gICAgICAgICAgICBjb25zdCBzZXRQcm9wID0gKF9uYW1lLCBfdmFsdWUsIF9zaXplLCBfY3BvcyA9IDApID0+IHRoaXMuc3BhY2VyU3R5bGUgPSB7IC4uLnRoaXMuc3BhY2VyU3R5bGUsIC4uLnsgW2Ake19uYW1lfWBdOiAoKChfdmFsdWUgfHwgW10pLmxlbmd0aCAqIF9zaXplKSArIF9jcG9zKSArICdweCcgfSB9O1xuXG4gICAgICAgICAgICBpZiAodGhpcy5ib3RoKSB7XG4gICAgICAgICAgICAgICAgc2V0UHJvcCgnaGVpZ2h0JywgdGhpcy5faXRlbXMsIHRoaXMuX2l0ZW1TaXplWzBdLCBjb250ZW50UG9zLnkpO1xuICAgICAgICAgICAgICAgIHNldFByb3AoJ3dpZHRoJywgKHRoaXMuX2NvbHVtbnMgfHwgdGhpcy5faXRlbXNbMV0pLCB0aGlzLl9pdGVtU2l6ZVsxXSwgY29udGVudFBvcy54KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuaG9yaXpvbnRhbCA/IHNldFByb3AoJ3dpZHRoJywgKHRoaXMuX2NvbHVtbnMgfHwgdGhpcy5faXRlbXMpLCB0aGlzLl9pdGVtU2l6ZSwgY29udGVudFBvcy54KSA6IHNldFByb3AoJ2hlaWdodCcsIHRoaXMuX2l0ZW1zLCB0aGlzLl9pdGVtU2l6ZSwgY29udGVudFBvcy55KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHNldENvbnRlbnRQb3NpdGlvbihwb3MpIHtcbiAgICAgICAgaWYgKHRoaXMuY29udGVudEVsKSB7XG4gICAgICAgICAgICBjb25zdCBmaXJzdCA9IHBvcyA/IHBvcy5maXJzdCA6IHRoaXMuZmlyc3Q7XG4gICAgICAgICAgICBjb25zdCBjYWxjdWxhdGVUcmFuc2xhdGVWYWwgPSAoX2ZpcnN0LCBfc2l6ZSkgPT4gKF9maXJzdCAqIF9zaXplKTtcbiAgICAgICAgICAgIGNvbnN0IHNldFRyYW5zZm9ybSA9IChfeCA9IDAsIF95ID0gMCkgPT4gdGhpcy5jb250ZW50U3R5bGUgPSB7IC4uLnRoaXMuY29udGVudFN0eWxlLCAuLi57IHRyYW5zZm9ybTogYHRyYW5zbGF0ZTNkKCR7X3h9cHgsICR7X3l9cHgsIDApYCB9IH07XG5cbiAgICAgICAgICAgIGlmICh0aGlzLmJvdGgpIHtcbiAgICAgICAgICAgICAgICBzZXRUcmFuc2Zvcm0oY2FsY3VsYXRlVHJhbnNsYXRlVmFsKGZpcnN0LmNvbHMsIHRoaXMuX2l0ZW1TaXplWzFdKSwgY2FsY3VsYXRlVHJhbnNsYXRlVmFsKGZpcnN0LnJvd3MsIHRoaXMuX2l0ZW1TaXplWzBdKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zdCB0cmFuc2xhdGVWYWwgPSBjYWxjdWxhdGVUcmFuc2xhdGVWYWwoZmlyc3QsIHRoaXMuX2l0ZW1TaXplKTtcbiAgICAgICAgICAgICAgICB0aGlzLmhvcml6b250YWwgPyBzZXRUcmFuc2Zvcm0odHJhbnNsYXRlVmFsLCAwKSA6IHNldFRyYW5zZm9ybSgwLCB0cmFuc2xhdGVWYWwpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgb25TY3JvbGxQb3NpdGlvbkNoYW5nZShldmVudCkge1xuICAgICAgICBjb25zdCB0YXJnZXQgPSBldmVudC50YXJnZXQ7XG4gICAgICAgIGNvbnN0IGNvbnRlbnRQb3MgPSB0aGlzLmdldENvbnRlbnRQb3NpdGlvbigpO1xuICAgICAgICBjb25zdCBjYWxjdWxhdGVTY3JvbGxQb3MgPSAoX3BvcywgX2Nwb3MpID0+IF9wb3MgPyAoX3BvcyA+IF9jcG9zID8gX3BvcyAtIF9jcG9zIDogX3BvcykgOiAwO1xuICAgICAgICBjb25zdCBjYWxjdWxhdGVDdXJyZW50SW5kZXggPSAoX3BvcywgX3NpemUpID0+IE1hdGguZmxvb3IoX3BvcyAvIChfc2l6ZSB8fCBfcG9zKSk7XG4gICAgICAgIGNvbnN0IGNhbGN1bGF0ZVRyaWdnZXJJbmRleCA9IChfY3VycmVudEluZGV4LCBfZmlyc3QsIF9sYXN0LCBfbnVtLCBfbnVtVCwgX2lzU2Nyb2xsRG93bk9yUmlnaHQpID0+IHtcbiAgICAgICAgICAgIHJldHVybiAoX2N1cnJlbnRJbmRleCA8PSBfbnVtVCA/IF9udW1UIDogKF9pc1Njcm9sbERvd25PclJpZ2h0ID8gKF9sYXN0IC0gX251bSAtIF9udW1UKSA6IChfZmlyc3QgKyBfbnVtVCAtIDEpKSlcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgY2FsY3VsYXRlRmlyc3QgPSAoX2N1cnJlbnRJbmRleCwgX3RyaWdnZXJJbmRleCwgX2ZpcnN0LCBfbGFzdCwgX251bSwgX251bVQsIF9pc1Njcm9sbERvd25PclJpZ2h0KSA9PiB7XG4gICAgICAgICAgICBpZiAoX2N1cnJlbnRJbmRleCA8PSBfbnVtVClcbiAgICAgICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICByZXR1cm4gTWF0aC5tYXgoMCwgX2lzU2Nyb2xsRG93bk9yUmlnaHQgP1xuICAgICAgICAgICAgICAgICAgICAoX2N1cnJlbnRJbmRleCA8IF90cmlnZ2VySW5kZXggPyBfZmlyc3QgOiBfY3VycmVudEluZGV4IC0gX251bVQpIDpcbiAgICAgICAgICAgICAgICAgICAgKF9jdXJyZW50SW5kZXggPiBfdHJpZ2dlckluZGV4ID8gX2ZpcnN0IDogX2N1cnJlbnRJbmRleCAtICgyICogX251bVQpKSk7XG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IGNhbGN1bGF0ZUxhc3QgPSAoX2N1cnJlbnRJbmRleCwgX2ZpcnN0LCBfbGFzdCwgX251bSwgX251bVQsIF9pc0NvbHMgPSBmYWxzZSkgPT4ge1xuICAgICAgICAgICAgbGV0IGxhc3RWYWx1ZSA9IF9maXJzdCArIF9udW0gKyAoMiAqIF9udW1UKTtcblxuICAgICAgICAgICAgaWYgKF9jdXJyZW50SW5kZXggPj0gX251bVQpIHtcbiAgICAgICAgICAgICAgICBsYXN0VmFsdWUgKz0gKF9udW1UICsgMSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiB0aGlzLmdldExhc3QobGFzdFZhbHVlLCBfaXNDb2xzKTtcbiAgICAgICAgfTtcblxuICAgICAgICBjb25zdCBzY3JvbGxUb3AgPSBjYWxjdWxhdGVTY3JvbGxQb3ModGFyZ2V0LnNjcm9sbFRvcCwgY29udGVudFBvcy50b3ApO1xuICAgICAgICBjb25zdCBzY3JvbGxMZWZ0ID0gY2FsY3VsYXRlU2Nyb2xsUG9zKHRhcmdldC5zY3JvbGxMZWZ0LCBjb250ZW50UG9zLmxlZnQpO1xuXG4gICAgICAgIGxldCBuZXdGaXJzdCA9IHRoaXMuYm90aCA/IHsgcm93czogMCwgY29sczogMCB9IDogMDtcbiAgICAgICAgbGV0IG5ld0xhc3QgPSB0aGlzLmxhc3Q7XG4gICAgICAgIGxldCBpc1JhbmdlQ2hhbmdlZCA9IGZhbHNlO1xuICAgICAgICBsZXQgbmV3U2Nyb2xsUG9zID0gdGhpcy5sYXN0U2Nyb2xsUG9zO1xuXG4gICAgICAgIGlmICh0aGlzLmJvdGgpIHtcbiAgICAgICAgICAgIGNvbnN0IGlzU2Nyb2xsRG93biA9IHRoaXMubGFzdFNjcm9sbFBvcy50b3AgPD0gc2Nyb2xsVG9wO1xuICAgICAgICAgICAgY29uc3QgaXNTY3JvbGxSaWdodCA9IHRoaXMubGFzdFNjcm9sbFBvcy5sZWZ0IDw9IHNjcm9sbExlZnQ7XG4gICAgICAgICAgICBjb25zdCBjdXJyZW50SW5kZXggPSB7IHJvd3M6IGNhbGN1bGF0ZUN1cnJlbnRJbmRleChzY3JvbGxUb3AsIHRoaXMuX2l0ZW1TaXplWzBdKSwgY29sczogY2FsY3VsYXRlQ3VycmVudEluZGV4KHNjcm9sbExlZnQsIHRoaXMuX2l0ZW1TaXplWzFdKSB9O1xuICAgICAgICAgICAgY29uc3QgdHJpZ2dlckluZGV4ID0ge1xuICAgICAgICAgICAgICAgIHJvd3M6IGNhbGN1bGF0ZVRyaWdnZXJJbmRleChjdXJyZW50SW5kZXgucm93cywgdGhpcy5maXJzdC5yb3dzLCB0aGlzLmxhc3Qucm93cywgdGhpcy5udW1JdGVtc0luVmlld3BvcnQucm93cywgdGhpcy5kX251bVRvbGVyYXRlZEl0ZW1zWzBdLCBpc1Njcm9sbERvd24pLFxuICAgICAgICAgICAgICAgIGNvbHM6IGNhbGN1bGF0ZVRyaWdnZXJJbmRleChjdXJyZW50SW5kZXguY29scywgdGhpcy5maXJzdC5jb2xzLCB0aGlzLmxhc3QuY29scywgdGhpcy5udW1JdGVtc0luVmlld3BvcnQuY29scywgdGhpcy5kX251bVRvbGVyYXRlZEl0ZW1zWzFdLCBpc1Njcm9sbFJpZ2h0KVxuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgbmV3Rmlyc3QgPSB7XG4gICAgICAgICAgICAgICAgcm93czogY2FsY3VsYXRlRmlyc3QoY3VycmVudEluZGV4LnJvd3MsIHRyaWdnZXJJbmRleC5yb3dzLCB0aGlzLmZpcnN0LnJvd3MsIHRoaXMubGFzdC5yb3dzLCB0aGlzLm51bUl0ZW1zSW5WaWV3cG9ydC5yb3dzLCB0aGlzLmRfbnVtVG9sZXJhdGVkSXRlbXNbMF0sIGlzU2Nyb2xsRG93biksXG4gICAgICAgICAgICAgICAgY29sczogY2FsY3VsYXRlRmlyc3QoY3VycmVudEluZGV4LmNvbHMsIHRyaWdnZXJJbmRleC5jb2xzLCB0aGlzLmZpcnN0LmNvbHMsIHRoaXMubGFzdC5jb2xzLCB0aGlzLm51bUl0ZW1zSW5WaWV3cG9ydC5jb2xzLCB0aGlzLmRfbnVtVG9sZXJhdGVkSXRlbXNbMV0sIGlzU2Nyb2xsUmlnaHQpXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgbmV3TGFzdCA9IHtcbiAgICAgICAgICAgICAgICByb3dzOiBjYWxjdWxhdGVMYXN0KGN1cnJlbnRJbmRleC5yb3dzLCBuZXdGaXJzdC5yb3dzLCB0aGlzLmxhc3Qucm93cywgdGhpcy5udW1JdGVtc0luVmlld3BvcnQucm93cywgdGhpcy5kX251bVRvbGVyYXRlZEl0ZW1zWzBdKSxcbiAgICAgICAgICAgICAgICBjb2xzOiBjYWxjdWxhdGVMYXN0KGN1cnJlbnRJbmRleC5jb2xzLCBuZXdGaXJzdC5jb2xzLCB0aGlzLmxhc3QuY29scywgdGhpcy5udW1JdGVtc0luVmlld3BvcnQuY29scywgdGhpcy5kX251bVRvbGVyYXRlZEl0ZW1zWzFdLCB0cnVlKVxuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgaXNSYW5nZUNoYW5nZWQgPSAobmV3Rmlyc3Qucm93cyAhPT0gdGhpcy5maXJzdC5yb3dzIHx8IG5ld0xhc3Qucm93cyAhPT0gdGhpcy5sYXN0LnJvd3MpIHx8IChuZXdGaXJzdC5jb2xzICE9PSB0aGlzLmZpcnN0LmNvbHMgfHwgbmV3TGFzdC5jb2xzICE9PSB0aGlzLmxhc3QuY29scyk7XG4gICAgICAgICAgICBuZXdTY3JvbGxQb3MgPSB7IHRvcDogc2Nyb2xsVG9wLCBsZWZ0OiBzY3JvbGxMZWZ0IH07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBzY3JvbGxQb3MgPSB0aGlzLmhvcml6b250YWwgPyBzY3JvbGxMZWZ0IDogc2Nyb2xsVG9wO1xuICAgICAgICAgICAgY29uc3QgaXNTY3JvbGxEb3duT3JSaWdodCA9IHRoaXMubGFzdFNjcm9sbFBvcyA8PSBzY3JvbGxQb3M7XG4gICAgICAgICAgICBjb25zdCBjdXJyZW50SW5kZXggPSBjYWxjdWxhdGVDdXJyZW50SW5kZXgoc2Nyb2xsUG9zLCB0aGlzLl9pdGVtU2l6ZSk7XG4gICAgICAgICAgICBjb25zdCB0cmlnZ2VySW5kZXggPSBjYWxjdWxhdGVUcmlnZ2VySW5kZXgoY3VycmVudEluZGV4LCB0aGlzLmZpcnN0LCB0aGlzLmxhc3QsIHRoaXMubnVtSXRlbXNJblZpZXdwb3J0LCB0aGlzLmRfbnVtVG9sZXJhdGVkSXRlbXMsIGlzU2Nyb2xsRG93bk9yUmlnaHQpO1xuXG4gICAgICAgICAgICBuZXdGaXJzdCA9IGNhbGN1bGF0ZUZpcnN0KGN1cnJlbnRJbmRleCwgdHJpZ2dlckluZGV4LCB0aGlzLmZpcnN0LCB0aGlzLmxhc3QsIHRoaXMubnVtSXRlbXNJblZpZXdwb3J0LCB0aGlzLmRfbnVtVG9sZXJhdGVkSXRlbXMsIGlzU2Nyb2xsRG93bk9yUmlnaHQpO1xuICAgICAgICAgICAgbmV3TGFzdCA9IGNhbGN1bGF0ZUxhc3QoY3VycmVudEluZGV4LCBuZXdGaXJzdCwgdGhpcy5sYXN0LCB0aGlzLm51bUl0ZW1zSW5WaWV3cG9ydCwgdGhpcy5kX251bVRvbGVyYXRlZEl0ZW1zKTtcbiAgICAgICAgICAgIGlzUmFuZ2VDaGFuZ2VkID0gbmV3Rmlyc3QgIT09IHRoaXMuZmlyc3QgfHwgbmV3TGFzdCAhPT0gdGhpcy5sYXN0O1xuICAgICAgICAgICAgbmV3U2Nyb2xsUG9zID0gc2Nyb2xsUG9zO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGZpcnN0OiBuZXdGaXJzdCxcbiAgICAgICAgICAgIGxhc3Q6IG5ld0xhc3QsXG4gICAgICAgICAgICBpc1JhbmdlQ2hhbmdlZCxcbiAgICAgICAgICAgIHNjcm9sbFBvczogbmV3U2Nyb2xsUG9zXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBvblNjcm9sbENoYW5nZShldmVudCkge1xuICAgICAgICBjb25zdCB7IGZpcnN0LCBsYXN0LCBpc1JhbmdlQ2hhbmdlZCwgc2Nyb2xsUG9zIH0gPSB0aGlzLm9uU2Nyb2xsUG9zaXRpb25DaGFuZ2UoZXZlbnQpO1xuXG4gICAgICAgIGlmIChpc1JhbmdlQ2hhbmdlZCkge1xuICAgICAgICAgICAgY29uc3QgbmV3U3RhdGUgPSB7IGZpcnN0LCBsYXN0IH07XG5cbiAgICAgICAgICAgIHRoaXMuc2V0Q29udGVudFBvc2l0aW9uKG5ld1N0YXRlKTtcblxuICAgICAgICAgICAgdGhpcy5maXJzdCA9IGZpcnN0O1xuICAgICAgICAgICAgdGhpcy5sYXN0ID0gbGFzdDtcbiAgICAgICAgICAgIHRoaXMubGFzdFNjcm9sbFBvcyA9IHNjcm9sbFBvcztcblxuICAgICAgICAgICAgdGhpcy5oYW5kbGVFdmVudHMoJ29uU2Nyb2xsSW5kZXhDaGFuZ2UnLCBuZXdTdGF0ZSk7XG5cbiAgICAgICAgICAgIGlmICh0aGlzLl9sYXp5KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVFdmVudHMoJ29uTGF6eUxvYWQnLCBuZXdTdGF0ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBvbkNvbnRhaW5lclNjcm9sbChldmVudCkge1xuICAgICAgICB0aGlzLmhhbmRsZUV2ZW50cygnb25TY3JvbGwnLCB7IG9yaWdpbmFsRXZlbnQ6IGV2ZW50IH0pO1xuXG4gICAgICAgIGlmICh0aGlzLl9kZWxheSkge1xuICAgICAgICAgICAgaWYgKHRoaXMuc2Nyb2xsVGltZW91dCkge1xuICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aGlzLnNjcm9sbFRpbWVvdXQpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoIXRoaXMuZF9sb2FkaW5nICYmIHRoaXMuc2hvd0xvYWRlcikge1xuICAgICAgICAgICAgICAgIGNvbnN0IHsgaXNSYW5nZUNoYW5nZWQ6IGNoYW5nZWQgfSA9IHRoaXMub25TY3JvbGxQb3NpdGlvbkNoYW5nZShldmVudCk7XG4gICAgICAgICAgICAgICAgaWYgKGNoYW5nZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kX2xvYWRpbmcgPSB0cnVlO1xuXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2QuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5zY3JvbGxUaW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5vblNjcm9sbENoYW5nZShldmVudCk7XG5cbiAgICAgICAgICAgICAgICBpZiAodGhpcy5kX2xvYWRpbmcgJiYgdGhpcy5zaG93TG9hZGVyICYmICghdGhpcy5fbGF6eSB8fCB0aGlzLl9sb2FkaW5nID09PSB1bmRlZmluZWQpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZF9sb2FkaW5nID0gZmFsc2U7XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jZC5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSwgdGhpcy5fZGVsYXkpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5vblNjcm9sbENoYW5nZShldmVudCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBvbldpbmRvd1Jlc2l6ZSgpIHtcbiAgICAgICAgaWYgKHRoaXMucmVzaXplVGltZW91dCkge1xuICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMucmVzaXplVGltZW91dCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnJlc2l6ZVRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLmVsZW1lbnRWaWV3Q2hpbGQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBbd2lkdGgsIGhlaWdodF0gPSBbRG9tSGFuZGxlci5nZXRXaWR0aCh0aGlzLmVsZW1lbnRWaWV3Q2hpbGQubmF0aXZlRWxlbWVudCksIERvbUhhbmRsZXIuZ2V0SGVpZ2h0KHRoaXMuZWxlbWVudFZpZXdDaGlsZC5uYXRpdmVFbGVtZW50KV07XG4gICAgICAgICAgICAgICAgY29uc3QgW2lzRGlmZldpZHRoLCBpc0RpZmZIZWlnaHRdID0gW3dpZHRoICE9PSB0aGlzLmRlZmF1bHRXaWR0aCwgaGVpZ2h0ICE9PSB0aGlzLmRlZmF1bHRIZWlnaHRdO1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlaW5pdCA9IHRoaXMuYm90aCA/IChpc0RpZmZXaWR0aCB8fCBpc0RpZmZIZWlnaHQpIDogKHRoaXMuaG9yaXpvbnRhbCA/IGlzRGlmZldpZHRoIDogKHRoaXMudmVydGljYWwgPyBpc0RpZmZIZWlnaHQgOiBmYWxzZSkpO1xuXG4gICAgICAgICAgICAgICAgcmVpbml0ICYmIHRoaXMuem9uZS5ydW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRfbnVtVG9sZXJhdGVkSXRlbXMgPSB0aGlzLl9udW1Ub2xlcmF0ZWRJdGVtcztcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kZWZhdWx0V2lkdGggPSB3aWR0aDtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kZWZhdWx0SGVpZ2h0ID0gaGVpZ2h0O1xuXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaW5pdCgpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LCB0aGlzLl9yZXNpemVEZWxheSk7XG4gICAgfVxuXG4gICAgaGFuZGxlRXZlbnRzKG5hbWUsIHBhcmFtcykge1xuICAgICAgICByZXR1cm4gdGhpcy5vcHRpb25zICYmIHRoaXMub3B0aW9uc1tuYW1lXSA/IHRoaXMub3B0aW9uc1tuYW1lXShwYXJhbXMpIDogdGhpc1tuYW1lXS5lbWl0KHBhcmFtcyk7XG4gICAgfVxuXG4gICAgZ2V0Q29udGVudE9wdGlvbnMoKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBjb250ZW50U3R5bGVDbGFzczogYHAtc2Nyb2xsZXItY29udGVudCAke3RoaXMuZF9sb2FkaW5nID8gJ3Atc2Nyb2xsZXItbG9hZGluZycgOiAnJ31gLFxuICAgICAgICAgICAgaXRlbXM6IHRoaXMubG9hZGVkSXRlbXMsXG4gICAgICAgICAgICBnZXRJdGVtT3B0aW9uczogKGluZGV4KSA9PiB0aGlzLmdldE9wdGlvbnMoaW5kZXgpLFxuICAgICAgICAgICAgbG9hZGluZzogdGhpcy5kX2xvYWRpbmcsXG4gICAgICAgICAgICBnZXRMb2FkZXJPcHRpb25zOiAoaW5kZXgsIG9wdGlvbnM/KSA9PiB0aGlzLmdldExvYWRlck9wdGlvbnMoaW5kZXgsIG9wdGlvbnMpLFxuICAgICAgICAgICAgaXRlbVNpemU6IHRoaXMuX2l0ZW1TaXplLFxuICAgICAgICAgICAgcm93czogdGhpcy5sb2FkZWRSb3dzLFxuICAgICAgICAgICAgY29sdW1uczogdGhpcy5sb2FkZWRDb2x1bW5zLFxuICAgICAgICAgICAgc3BhY2VyU3R5bGU6IHRoaXMuc3BhY2VyU3R5bGUsXG4gICAgICAgICAgICBjb250ZW50U3R5bGU6IHRoaXMuY29udGVudFN0eWxlLFxuICAgICAgICAgICAgdmVydGljYWw6IHRoaXMudmVydGljYWwsXG4gICAgICAgICAgICBob3Jpem9udGFsOiB0aGlzLmhvcml6b250YWwsXG4gICAgICAgICAgICBib3RoOiB0aGlzLmJvdGhcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGdldE9wdGlvbnMocmVuZGVyZWRJbmRleCkge1xuICAgICAgICBjb25zdCBjb3VudCA9ICh0aGlzLl9pdGVtcyB8fCBbXSkubGVuZ3RoO1xuICAgICAgICBjb25zdCBpbmRleCA9IHRoaXMuYm90aCA/IHRoaXMuZmlyc3Qucm93cyArIHJlbmRlcmVkSW5kZXggOiB0aGlzLmZpcnN0ICsgcmVuZGVyZWRJbmRleDtcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgaW5kZXgsXG4gICAgICAgICAgICBjb3VudCxcbiAgICAgICAgICAgIGZpcnN0OiBpbmRleCA9PT0gMCxcbiAgICAgICAgICAgIGxhc3Q6IGluZGV4ID09PSAoY291bnQgLSAxKSxcbiAgICAgICAgICAgIGV2ZW46IGluZGV4ICUgMiA9PT0gMCxcbiAgICAgICAgICAgIG9kZDogaW5kZXggJSAyICE9PSAwXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBnZXRMb2FkZXJPcHRpb25zKGluZGV4LCBleHRPcHRpb25zKSB7XG4gICAgICAgIGNvbnN0IGNvdW50ID0gdGhpcy5sb2FkZXJBcnIubGVuZ3RoO1xuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBpbmRleCxcbiAgICAgICAgICAgIGNvdW50LFxuICAgICAgICAgICAgZmlyc3Q6IGluZGV4ID09PSAwLFxuICAgICAgICAgICAgbGFzdDogaW5kZXggPT09IChjb3VudCAtIDEpLFxuICAgICAgICAgICAgZXZlbjogaW5kZXggJSAyID09PSAwLFxuICAgICAgICAgICAgb2RkOiBpbmRleCAlIDIgIT09IDAsXG4gICAgICAgICAgICAuLi5leHRPcHRpb25zXG4gICAgICAgIH1cbiAgICB9XG59XG5cbkBOZ01vZHVsZSh7XG4gICAgaW1wb3J0czogW0NvbW1vbk1vZHVsZV0sXG4gICAgZXhwb3J0czogW1Njcm9sbGVyXSxcbiAgICBkZWNsYXJhdGlvbnM6IFtTY3JvbGxlcl1cbn0pXG5leHBvcnQgY2xhc3MgU2Nyb2xsZXJNb2R1bGUgeyB9XG4iXX0=