barsa-sap-ui 0.0.2

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 (346) hide show
  1. package/README.md +25 -0
  2. package/esm2020/barsa-sap-ui.mjs +5 -0
  3. package/esm2020/lib/apply-conditional-formmatings.directive.mjs +84 -0
  4. package/esm2020/lib/barsa-asp-viewer/barsa-asp-viewer.component.mjs +109 -0
  5. package/esm2020/lib/barsa-base-layout/barsa-base-layout.component.mjs +34 -0
  6. package/esm2020/lib/barsa-date-time-picker/barsa-date-time-picker.component.mjs +71 -0
  7. package/esm2020/lib/barsa-list-file-linear/barsa-list-file-linear.component.mjs +28 -0
  8. package/esm2020/lib/barsa-monaco-editor/barsa-monaco-editor.component.mjs +77 -0
  9. package/esm2020/lib/barsa-network-offline/barsa-network-offline.component.mjs +45 -0
  10. package/esm2020/lib/barsa-sap-ui-routing.module.mjs +17 -0
  11. package/esm2020/lib/barsa-sap-ui.module.mjs +277 -0
  12. package/esm2020/lib/barsa-search-form/barsa-search-form.component.mjs +29 -0
  13. package/esm2020/lib/barsa-table-header/barsa-table-header.component.mjs +122 -0
  14. package/esm2020/lib/barsa-table-row/barsa-table-row.component.mjs +57 -0
  15. package/esm2020/lib/barsa-tinyemce/barsa-tinyemce.component.mjs +334 -0
  16. package/esm2020/lib/barsa-tree-item/barsa-tree-item.component.mjs +120 -0
  17. package/esm2020/lib/barsa-tree-item/node-has-one-depth-level.pipe.mjs +19 -0
  18. package/esm2020/lib/barsa-ulv-main/barsa-ulv-main.component.mjs +156 -0
  19. package/esm2020/lib/breadcrumb/breadcrumb.component.mjs +45 -0
  20. package/esm2020/lib/captcha-field/captcha-field.component.mjs +28 -0
  21. package/esm2020/lib/card-item/card-item.component.mjs +60 -0
  22. package/esm2020/lib/card-view-content/card-view-content.component.mjs +23 -0
  23. package/esm2020/lib/col-renderer.directive.mjs +50 -0
  24. package/esm2020/lib/column-matrix-renderer/column-matrix-renderer.component.mjs +56 -0
  25. package/esm2020/lib/column-matrix-renderer/matrix-value.pipe.mjs +60 -0
  26. package/esm2020/lib/column-renderer/column-renderer.component.mjs +84 -0
  27. package/esm2020/lib/constants.mjs +413 -0
  28. package/esm2020/lib/custom-date-time/custom-date-time.component.mjs +41 -0
  29. package/esm2020/lib/device-info-field-base.mjs +23 -0
  30. package/esm2020/lib/dynamic-page-size.pipe.mjs +26 -0
  31. package/esm2020/lib/empty-page/empty-page.component.mjs +38 -0
  32. package/esm2020/lib/file-in-dialog/file-in-dialog.component.mjs +44 -0
  33. package/esm2020/lib/form-dialog/form-dialog.component.mjs +125 -0
  34. package/esm2020/lib/form-dialog-less/form-dialog-less.component.mjs +38 -0
  35. package/esm2020/lib/form-page/form-page.component.mjs +51 -0
  36. package/esm2020/lib/form-page-base.mjs +129 -0
  37. package/esm2020/lib/form-toolbar-button/form-toolbar-button.component.mjs +44 -0
  38. package/esm2020/lib/form-wizard/form-wizard.component.mjs +21 -0
  39. package/esm2020/lib/fullscreen-dialog.directive.mjs +40 -0
  40. package/esm2020/lib/fundamental-dynamic-form/fundamental-dynamic-form.component.mjs +152 -0
  41. package/esm2020/lib/gantt-dhtml-chart-view/gantt-dhtml-chart-view.component.mjs +203 -0
  42. package/esm2020/lib/global-search/global-search.component.mjs +26 -0
  43. package/esm2020/lib/global-search-module/global-search-module.component.mjs +30 -0
  44. package/esm2020/lib/global-search-panel/global-search-panel.component.mjs +30 -0
  45. package/esm2020/lib/header-avatar/header-avatar.component.mjs +19 -0
  46. package/esm2020/lib/header-facet-form/header-facet-form.component.mjs +22 -0
  47. package/esm2020/lib/header-facet-key-value/header-facet-key-value.component.mjs +31 -0
  48. package/esm2020/lib/header-facet-microchart/header-facet-microchart.component.mjs +21 -0
  49. package/esm2020/lib/header-facet-plain-text/header-facet-plain-text.component.mjs +28 -0
  50. package/esm2020/lib/header-facet-progress/header-facet-progress.component.mjs +26 -0
  51. package/esm2020/lib/header-facet-rate/header-facet-rate.component.mjs +26 -0
  52. package/esm2020/lib/htree-create-new/htree-create-new.component.mjs +49 -0
  53. package/esm2020/lib/hyperlink/hyperlink.component.mjs +19 -0
  54. package/esm2020/lib/index.mjs +412 -0
  55. package/esm2020/lib/inline-save-and-cancel/inline-save-and-cancel.component.mjs +32 -0
  56. package/esm2020/lib/layout-actions/layout-actions.component.mjs +65 -0
  57. package/esm2020/lib/layout-control/layout-control.component.mjs +214 -0
  58. package/esm2020/lib/layout-wizard/layout-wizard.component.mjs +133 -0
  59. package/esm2020/lib/list-item/list-item.component.mjs +30 -0
  60. package/esm2020/lib/ly-empty-space/ly-empty-space.component.mjs +37 -0
  61. package/esm2020/lib/ly-horizontal-layout/ly-horizontal-layout.component.mjs +70 -0
  62. package/esm2020/lib/ly-label/ly-label.component.mjs +31 -0
  63. package/esm2020/lib/ly-layout-container/ly-layout-container.component.mjs +83 -0
  64. package/esm2020/lib/ly-layout-container-of-root/ly-layout-container-of-root.component.mjs +17 -0
  65. package/esm2020/lib/ly-layout-field-label/ly-layout-field-label.component.mjs +24 -0
  66. package/esm2020/lib/ly-layout-panel/ly-layout-panel.component.mjs +64 -0
  67. package/esm2020/lib/ly-line/ly-line.component.mjs +56 -0
  68. package/esm2020/lib/ly-simple-label/ly-simple-label.component.mjs +27 -0
  69. package/esm2020/lib/ly-tab-container/ly-tab-container.component.mjs +43 -0
  70. package/esm2020/lib/ly-tab-page/ly-tab-page.component.mjs +35 -0
  71. package/esm2020/lib/ly-vertical-layout/ly-vertical-layout.component.mjs +49 -0
  72. package/esm2020/lib/manage-filters-report/manage-filters-report.component.mjs +45 -0
  73. package/esm2020/lib/mask/mask.component.mjs +22 -0
  74. package/esm2020/lib/message-strip/message-strip.component.mjs +28 -0
  75. package/esm2020/lib/models/grid-data-provider.mjs +219 -0
  76. package/esm2020/lib/models/grid-view.mjs +2 -0
  77. package/esm2020/lib/models/index.mjs +2 -0
  78. package/esm2020/lib/no-data/no-data.component.mjs +20 -0
  79. package/esm2020/lib/page-with-form-handler-base.mjs +42 -0
  80. package/esm2020/lib/page-with-header/page-with-header.component.mjs +76 -0
  81. package/esm2020/lib/progress-indicator/progress-indicator.component.mjs +18 -0
  82. package/esm2020/lib/report-navigator/report-navigator.component.mjs +62 -0
  83. package/esm2020/lib/report-new-top-form/report-new-top-form.component.mjs +60 -0
  84. package/esm2020/lib/report-search-fields-hidden-settings/report-search-fields-hidden-settings.component.mjs +35 -0
  85. package/esm2020/lib/report-search-fields-manage/report-search-fields-manage.component.mjs +99 -0
  86. package/esm2020/lib/report-search-panel-save/report-search-panel-save.component.mjs +90 -0
  87. package/esm2020/lib/report-tree-base.mjs +405 -0
  88. package/esm2020/lib/report-view-renderer.directive.mjs +248 -0
  89. package/esm2020/lib/responsive-toolbar/responsive-toolbar.component.mjs +50 -0
  90. package/esm2020/lib/responsive-toolbar-renderer/responsive-toolbar-renderer.component.mjs +84 -0
  91. package/esm2020/lib/rich-text-static/rich-text-static.component.mjs +35 -0
  92. package/esm2020/lib/sap-font-class.pipe.mjs +29 -0
  93. package/esm2020/lib/sap-font.pipe.mjs +29 -0
  94. package/esm2020/lib/sap-ui-report-base.component.mjs +689 -0
  95. package/esm2020/lib/search-panel/search-panel.component.mjs +40 -0
  96. package/esm2020/lib/static-text/static-text.component.mjs +15 -0
  97. package/esm2020/lib/title/title.component.mjs +15 -0
  98. package/esm2020/lib/ui-asp-report-viewer/ui-asp-report-viewer.component.mjs +14 -0
  99. package/esm2020/lib/ui-button/ui-button.component.mjs +31 -0
  100. package/esm2020/lib/ui-calendar/ui-calendar.component.mjs +46 -0
  101. package/esm2020/lib/ui-card-view/ui-card-view.component.mjs +60 -0
  102. package/esm2020/lib/ui-card-view-horizontal-group/ui-card-view-horizontal-group.component.mjs +27 -0
  103. package/esm2020/lib/ui-check-box/ui-check-box.component.mjs +29 -0
  104. package/esm2020/lib/ui-color-ui/ui-color-ui.component.mjs +50 -0
  105. package/esm2020/lib/ui-container-with-button/ui-container-with-button.component.mjs +34 -0
  106. package/esm2020/lib/ui-date-range-ex/ui-date-range-ex.component.mjs +194 -0
  107. package/esm2020/lib/ui-date-time/ui-date-time.component.mjs +116 -0
  108. package/esm2020/lib/ui-editable-grid/ui-editable-grid.component.mjs +110 -0
  109. package/esm2020/lib/ui-exception-form/ui-exception-form.component.mjs +61 -0
  110. package/esm2020/lib/ui-file-linear-list-box/ui-file-linear-list-box.component.mjs +181 -0
  111. package/esm2020/lib/ui-form-panel/ui-form-panel.component.mjs +43 -0
  112. package/esm2020/lib/ui-form-panel-toolbar/ui-form-panel-toolbar.component.mjs +26 -0
  113. package/esm2020/lib/ui-gantt-chart/ui-gantt-chart.component.mjs +32 -0
  114. package/esm2020/lib/ui-graph/ui-graph.component.mjs +16 -0
  115. package/esm2020/lib/ui-grid/ui-grid.component.mjs +25 -0
  116. package/esm2020/lib/ui-grid-columns/ui-grid-columns.component.mjs +44 -0
  117. package/esm2020/lib/ui-grid-filter-item/ui-grid-filter-item.component.mjs +67 -0
  118. package/esm2020/lib/ui-grid-filter-settings/ui-grid-filter-settings.component.mjs +76 -0
  119. package/esm2020/lib/ui-grid-sort-item/ui-grid-sort-item.component.mjs +59 -0
  120. package/esm2020/lib/ui-grid-sort-setting/ui-grid-sort-setting.component.mjs +156 -0
  121. package/esm2020/lib/ui-info-bar-panel/ui-info-bar-panel.component.mjs +11 -0
  122. package/esm2020/lib/ui-label/ui-label.component.mjs +12 -0
  123. package/esm2020/lib/ui-linear-list-container-with-button/ui-linear-list-container-with-button.component.mjs +299 -0
  124. package/esm2020/lib/ui-list-view/ui-list-view.component.mjs +44 -0
  125. package/esm2020/lib/ui-matrix-view/ui-matrix-view.component.mjs +125 -0
  126. package/esm2020/lib/ui-mo-info-combo-viewer/ui-mo-info-combo-viewer.component.mjs +19 -0
  127. package/esm2020/lib/ui-mo-info-general-object-ui/ui-mo-info-general-object-ui.component.mjs +13 -0
  128. package/esm2020/lib/ui-mo-info-sub-form-ui/ui-mo-info-sub-form-ui.component.mjs +46 -0
  129. package/esm2020/lib/ui-mo-info-ulv-combo/ui-mo-info-ulv-combo.component.mjs +335 -0
  130. package/esm2020/lib/ui-monaco-editor/ui-monaco-editor.component.mjs +18 -0
  131. package/esm2020/lib/ui-multi-select-combo/ui-multi-select-combo.component.mjs +83 -0
  132. package/esm2020/lib/ui-num-decimal-ui/ui-num-decimal-ui.component.mjs +24 -0
  133. package/esm2020/lib/ui-num-int-ui/ui-num-int-ui.component.mjs +21 -0
  134. package/esm2020/lib/ui-pdf-viewer/ui-pdf-viewer.component.mjs +216 -0
  135. package/esm2020/lib/ui-picture-file/ui-picture-file.component.mjs +95 -0
  136. package/esm2020/lib/ui-pictures-info/ui-pictures-info.component.mjs +215 -0
  137. package/esm2020/lib/ui-radio-group/ui-radio-group.component.mjs +24 -0
  138. package/esm2020/lib/ui-read-only-field/ui-read-only-field.component.mjs +29 -0
  139. package/esm2020/lib/ui-report-container/ui-report-container.component.mjs +46 -0
  140. package/esm2020/lib/ui-search-command-info-ui/ui-search-command-info-ui.component.mjs +24 -0
  141. package/esm2020/lib/ui-simple-combo/ui-simple-combo.component.mjs +29 -0
  142. package/esm2020/lib/ui-single-picture/ui-single-picture.component.mjs +36 -0
  143. package/esm2020/lib/ui-switch-button/ui-switch-button.component.mjs +20 -0
  144. package/esm2020/lib/ui-table-view/ui-table-view.component.mjs +106 -0
  145. package/esm2020/lib/ui-text-area/ui-text-area.component.mjs +44 -0
  146. package/esm2020/lib/ui-text-field/ui-text-field.component.mjs +47 -0
  147. package/esm2020/lib/ui-text-field-auto-complete/ui-text-field-auto-complete.component.mjs +47 -0
  148. package/esm2020/lib/ui-time-span/ui-time-span.component.mjs +24 -0
  149. package/esm2020/lib/ui-tinymce/ui-tinymce.component.mjs +53 -0
  150. package/esm2020/lib/ui-tree/ui-tree.component.mjs +69 -0
  151. package/esm2020/lib/ui-tree-view/ui-tree-view.component.mjs +75 -0
  152. package/esm2020/lib/ui-ulv-form-multi-select-ui/ui-ulv-form-multi-select-ui.component.mjs +24 -0
  153. package/esm2020/lib/ui-ulv-main-ui/ui-ulv-main-ui.component.mjs +276 -0
  154. package/esm2020/lib/ui-workflow-panel-ui/ui-workflow-panel-ui.component.mjs +26 -0
  155. package/esm2020/lib/ul-loading-mask-ui/ul-loading-mask-ui.component.mjs +86 -0
  156. package/esm2020/lib/ul-msg-box-adapter/ul-msg-box-adapter.component.mjs +117 -0
  157. package/esm2020/lib/ul-notify-popup/ul-notify-popup.component.mjs +114 -0
  158. package/esm2020/lib/ul-toast-adapter/ul-toast-adapter.component.mjs +44 -0
  159. package/esm2020/lib/ulv-column-settings/ulv-column-settings.component.mjs +53 -0
  160. package/esm2020/lib/ulv-context-menu/ulv-context-menu.component.mjs +74 -0
  161. package/esm2020/lib/ulv-filter-settings/ulv-filter-settings.component.mjs +43 -0
  162. package/esm2020/lib/ulv-form-multi-select/ulv-form-multi-select.component.mjs +183 -0
  163. package/esm2020/lib/ulv-groupby-settings/ulv-groupby-settings.component.mjs +44 -0
  164. package/esm2020/lib/ulv-paging/ulv-paging.component.mjs +73 -0
  165. package/esm2020/lib/ulv-selection/ulv-selection.component.mjs +66 -0
  166. package/esm2020/lib/ulv-settings/ulv-settings.component.mjs +117 -0
  167. package/esm2020/lib/ulv-sort-settings/ulv-sort-settings.component.mjs +44 -0
  168. package/esm2020/lib/ulv-toolbar/ulv-toolbar.component.mjs +110 -0
  169. package/esm2020/lib/upload-file-status.pipe.mjs +28 -0
  170. package/esm2020/lib/wizard-layout.directive.mjs +102 -0
  171. package/esm2020/public-api.mjs +170 -0
  172. package/fesm2015/barsa-sap-ui.mjs +11437 -0
  173. package/fesm2015/barsa-sap-ui.mjs.map +1 -0
  174. package/fesm2020/barsa-sap-ui.mjs +11427 -0
  175. package/fesm2020/barsa-sap-ui.mjs.map +1 -0
  176. package/index.d.ts +5 -0
  177. package/lib/apply-conditional-formmatings.directive.d.ts +25 -0
  178. package/lib/barsa-asp-viewer/barsa-asp-viewer.component.d.ts +26 -0
  179. package/lib/barsa-base-layout/barsa-base-layout.component.d.ts +18 -0
  180. package/lib/barsa-date-time-picker/barsa-date-time-picker.component.d.ts +18 -0
  181. package/lib/barsa-list-file-linear/barsa-list-file-linear.component.d.ts +8 -0
  182. package/lib/barsa-monaco-editor/barsa-monaco-editor.component.d.ts +18 -0
  183. package/lib/barsa-network-offline/barsa-network-offline.component.d.ts +13 -0
  184. package/lib/barsa-sap-ui-routing.module.d.ts +7 -0
  185. package/lib/barsa-sap-ui.module.d.ts +181 -0
  186. package/lib/barsa-search-form/barsa-search-form.component.d.ts +8 -0
  187. package/lib/barsa-table-header/barsa-table-header.component.d.ts +37 -0
  188. package/lib/barsa-table-row/barsa-table-row.component.d.ts +20 -0
  189. package/lib/barsa-tinyemce/barsa-tinyemce.component.d.ts +43 -0
  190. package/lib/barsa-tree-item/barsa-tree-item.component.d.ts +48 -0
  191. package/lib/barsa-tree-item/node-has-one-depth-level.pipe.d.ts +8 -0
  192. package/lib/barsa-ulv-main/barsa-ulv-main.component.d.ts +52 -0
  193. package/lib/breadcrumb/breadcrumb.component.d.ts +17 -0
  194. package/lib/captcha-field/captcha-field.component.d.ts +10 -0
  195. package/lib/card-item/card-item.component.d.ts +17 -0
  196. package/lib/card-view-content/card-view-content.component.d.ts +8 -0
  197. package/lib/col-renderer.directive.d.ts +12 -0
  198. package/lib/column-matrix-renderer/column-matrix-renderer.component.d.ts +23 -0
  199. package/lib/column-matrix-renderer/matrix-value.pipe.d.ts +8 -0
  200. package/lib/column-renderer/column-renderer.component.d.ts +29 -0
  201. package/lib/constants.d.ts +6 -0
  202. package/lib/custom-date-time/custom-date-time.component.d.ts +26 -0
  203. package/lib/device-info-field-base.d.ts +12 -0
  204. package/lib/dynamic-page-size.pipe.d.ts +8 -0
  205. package/lib/empty-page/empty-page.component.d.ts +11 -0
  206. package/lib/file-in-dialog/file-in-dialog.component.d.ts +16 -0
  207. package/lib/form-dialog/form-dialog.component.d.ts +40 -0
  208. package/lib/form-dialog-less/form-dialog-less.component.d.ts +27 -0
  209. package/lib/form-page/form-page.component.d.ts +17 -0
  210. package/lib/form-page-base.d.ts +26 -0
  211. package/lib/form-toolbar-button/form-toolbar-button.component.d.ts +18 -0
  212. package/lib/form-wizard/form-wizard.component.d.ts +8 -0
  213. package/lib/fullscreen-dialog.directive.d.ts +14 -0
  214. package/lib/fundamental-dynamic-form/fundamental-dynamic-form.component.d.ts +58 -0
  215. package/lib/gantt-dhtml-chart-view/gantt-dhtml-chart-view.component.d.ts +18 -0
  216. package/lib/global-search/global-search.component.d.ts +12 -0
  217. package/lib/global-search-module/global-search-module.component.d.ts +18 -0
  218. package/lib/global-search-panel/global-search-panel.component.d.ts +11 -0
  219. package/lib/header-avatar/header-avatar.component.d.ts +8 -0
  220. package/lib/header-facet-form/header-facet-form.component.d.ts +9 -0
  221. package/lib/header-facet-key-value/header-facet-key-value.component.d.ts +11 -0
  222. package/lib/header-facet-microchart/header-facet-microchart.component.d.ts +8 -0
  223. package/lib/header-facet-plain-text/header-facet-plain-text.component.d.ts +11 -0
  224. package/lib/header-facet-progress/header-facet-progress.component.d.ts +11 -0
  225. package/lib/header-facet-rate/header-facet-rate.component.d.ts +11 -0
  226. package/lib/htree-create-new/htree-create-new.component.d.ts +13 -0
  227. package/lib/hyperlink/hyperlink.component.d.ts +7 -0
  228. package/lib/index.d.ts +85 -0
  229. package/lib/inline-save-and-cancel/inline-save-and-cancel.component.d.ts +11 -0
  230. package/lib/layout-actions/layout-actions.component.d.ts +23 -0
  231. package/lib/layout-control/layout-control.component.d.ts +65 -0
  232. package/lib/layout-wizard/layout-wizard.component.d.ts +27 -0
  233. package/lib/list-item/list-item.component.d.ts +13 -0
  234. package/lib/ly-empty-space/ly-empty-space.component.d.ts +14 -0
  235. package/lib/ly-horizontal-layout/ly-horizontal-layout.component.d.ts +22 -0
  236. package/lib/ly-label/ly-label.component.d.ts +15 -0
  237. package/lib/ly-layout-container/ly-layout-container.component.d.ts +26 -0
  238. package/lib/ly-layout-container-of-root/ly-layout-container-of-root.component.d.ts +8 -0
  239. package/lib/ly-layout-field-label/ly-layout-field-label.component.d.ts +13 -0
  240. package/lib/ly-layout-panel/ly-layout-panel.component.d.ts +25 -0
  241. package/lib/ly-line/ly-line.component.d.ts +17 -0
  242. package/lib/ly-simple-label/ly-simple-label.component.d.ts +11 -0
  243. package/lib/ly-tab-container/ly-tab-container.component.d.ts +16 -0
  244. package/lib/ly-tab-page/ly-tab-page.component.d.ts +18 -0
  245. package/lib/ly-vertical-layout/ly-vertical-layout.component.d.ts +18 -0
  246. package/lib/manage-filters-report/manage-filters-report.component.d.ts +24 -0
  247. package/lib/mask/mask.component.d.ts +9 -0
  248. package/lib/message-strip/message-strip.component.d.ts +11 -0
  249. package/lib/models/grid-data-provider.d.ts +26 -0
  250. package/lib/models/grid-view.d.ts +64 -0
  251. package/lib/models/index.d.ts +1 -0
  252. package/lib/no-data/no-data.component.d.ts +8 -0
  253. package/lib/page-with-form-handler-base.d.ts +10 -0
  254. package/lib/page-with-header/page-with-header.component.d.ts +29 -0
  255. package/lib/progress-indicator/progress-indicator.component.d.ts +8 -0
  256. package/lib/report-navigator/report-navigator.component.d.ts +21 -0
  257. package/lib/report-new-top-form/report-new-top-form.component.d.ts +18 -0
  258. package/lib/report-search-fields-hidden-settings/report-search-fields-hidden-settings.component.d.ts +14 -0
  259. package/lib/report-search-fields-manage/report-search-fields-manage.component.d.ts +20 -0
  260. package/lib/report-search-panel-save/report-search-panel-save.component.d.ts +27 -0
  261. package/lib/report-tree-base.d.ts +61 -0
  262. package/lib/report-view-renderer.directive.d.ts +82 -0
  263. package/lib/responsive-toolbar/responsive-toolbar.component.d.ts +19 -0
  264. package/lib/responsive-toolbar-renderer/responsive-toolbar-renderer.component.d.ts +24 -0
  265. package/lib/rich-text-static/rich-text-static.component.d.ts +24 -0
  266. package/lib/sap-font-class.pipe.d.ts +8 -0
  267. package/lib/sap-font.pipe.d.ts +9 -0
  268. package/lib/sap-ui-report-base.component.d.ts +133 -0
  269. package/lib/search-panel/search-panel.component.d.ts +13 -0
  270. package/lib/static-text/static-text.component.d.ts +7 -0
  271. package/lib/title/title.component.d.ts +7 -0
  272. package/lib/ui-asp-report-viewer/ui-asp-report-viewer.component.d.ts +7 -0
  273. package/lib/ui-button/ui-button.component.d.ts +11 -0
  274. package/lib/ui-calendar/ui-calendar.component.d.ts +16 -0
  275. package/lib/ui-card-view/ui-card-view.component.d.ts +16 -0
  276. package/lib/ui-card-view-horizontal-group/ui-card-view-horizontal-group.component.d.ts +9 -0
  277. package/lib/ui-check-box/ui-check-box.component.d.ts +12 -0
  278. package/lib/ui-color-ui/ui-color-ui.component.d.ts +16 -0
  279. package/lib/ui-container-with-button/ui-container-with-button.component.d.ts +11 -0
  280. package/lib/ui-date-range-ex/ui-date-range-ex.component.d.ts +36 -0
  281. package/lib/ui-date-time/ui-date-time.component.d.ts +24 -0
  282. package/lib/ui-editable-grid/ui-editable-grid.component.d.ts +43 -0
  283. package/lib/ui-exception-form/ui-exception-form.component.d.ts +16 -0
  284. package/lib/ui-file-linear-list-box/ui-file-linear-list-box.component.d.ts +51 -0
  285. package/lib/ui-form-panel/ui-form-panel.component.d.ts +24 -0
  286. package/lib/ui-form-panel-toolbar/ui-form-panel-toolbar.component.d.ts +13 -0
  287. package/lib/ui-gantt-chart/ui-gantt-chart.component.d.ts +15 -0
  288. package/lib/ui-graph/ui-graph.component.d.ts +9 -0
  289. package/lib/ui-grid/ui-grid.component.d.ts +12 -0
  290. package/lib/ui-grid-columns/ui-grid-columns.component.d.ts +14 -0
  291. package/lib/ui-grid-filter-item/ui-grid-filter-item.component.d.ts +19 -0
  292. package/lib/ui-grid-filter-settings/ui-grid-filter-settings.component.d.ts +24 -0
  293. package/lib/ui-grid-sort-item/ui-grid-sort-item.component.d.ts +25 -0
  294. package/lib/ui-grid-sort-setting/ui-grid-sort-setting.component.d.ts +28 -0
  295. package/lib/ui-info-bar-panel/ui-info-bar-panel.component.d.ts +5 -0
  296. package/lib/ui-label/ui-label.component.d.ts +6 -0
  297. package/lib/ui-linear-list-container-with-button/ui-linear-list-container-with-button.component.d.ts +62 -0
  298. package/lib/ui-list-view/ui-list-view.component.d.ts +15 -0
  299. package/lib/ui-matrix-view/ui-matrix-view.component.d.ts +45 -0
  300. package/lib/ui-mo-info-combo-viewer/ui-mo-info-combo-viewer.component.d.ts +7 -0
  301. package/lib/ui-mo-info-general-object-ui/ui-mo-info-general-object-ui.component.d.ts +6 -0
  302. package/lib/ui-mo-info-sub-form-ui/ui-mo-info-sub-form-ui.component.d.ts +13 -0
  303. package/lib/ui-mo-info-ulv-combo/ui-mo-info-ulv-combo.component.d.ts +78 -0
  304. package/lib/ui-monaco-editor/ui-monaco-editor.component.d.ts +7 -0
  305. package/lib/ui-multi-select-combo/ui-multi-select-combo.component.d.ts +21 -0
  306. package/lib/ui-num-decimal-ui/ui-num-decimal-ui.component.d.ts +11 -0
  307. package/lib/ui-num-int-ui/ui-num-int-ui.component.d.ts +10 -0
  308. package/lib/ui-pdf-viewer/ui-pdf-viewer.component.d.ts +63 -0
  309. package/lib/ui-picture-file/ui-picture-file.component.d.ts +27 -0
  310. package/lib/ui-pictures-info/ui-pictures-info.component.d.ts +68 -0
  311. package/lib/ui-radio-group/ui-radio-group.component.d.ts +9 -0
  312. package/lib/ui-read-only-field/ui-read-only-field.component.d.ts +11 -0
  313. package/lib/ui-report-container/ui-report-container.component.d.ts +17 -0
  314. package/lib/ui-search-command-info-ui/ui-search-command-info-ui.component.d.ts +9 -0
  315. package/lib/ui-simple-combo/ui-simple-combo.component.d.ts +13 -0
  316. package/lib/ui-single-picture/ui-single-picture.component.d.ts +13 -0
  317. package/lib/ui-switch-button/ui-switch-button.component.d.ts +11 -0
  318. package/lib/ui-table-view/ui-table-view.component.d.ts +29 -0
  319. package/lib/ui-text-area/ui-text-area.component.d.ts +15 -0
  320. package/lib/ui-text-field/ui-text-field.component.d.ts +14 -0
  321. package/lib/ui-text-field-auto-complete/ui-text-field-auto-complete.component.d.ts +13 -0
  322. package/lib/ui-time-span/ui-time-span.component.d.ts +10 -0
  323. package/lib/ui-tinymce/ui-tinymce.component.d.ts +17 -0
  324. package/lib/ui-tree/ui-tree.component.d.ts +32 -0
  325. package/lib/ui-tree-view/ui-tree-view.component.d.ts +41 -0
  326. package/lib/ui-ulv-form-multi-select-ui/ui-ulv-form-multi-select-ui.component.d.ts +9 -0
  327. package/lib/ui-ulv-main-ui/ui-ulv-main-ui.component.d.ts +67 -0
  328. package/lib/ui-workflow-panel-ui/ui-workflow-panel-ui.component.d.ts +16 -0
  329. package/lib/ul-loading-mask-ui/ul-loading-mask-ui.component.d.ts +20 -0
  330. package/lib/ul-msg-box-adapter/ul-msg-box-adapter.component.d.ts +48 -0
  331. package/lib/ul-notify-popup/ul-notify-popup.component.d.ts +41 -0
  332. package/lib/ul-toast-adapter/ul-toast-adapter.component.d.ts +13 -0
  333. package/lib/ulv-column-settings/ulv-column-settings.component.d.ts +19 -0
  334. package/lib/ulv-context-menu/ulv-context-menu.component.d.ts +24 -0
  335. package/lib/ulv-filter-settings/ulv-filter-settings.component.d.ts +19 -0
  336. package/lib/ulv-form-multi-select/ulv-form-multi-select.component.d.ts +26 -0
  337. package/lib/ulv-groupby-settings/ulv-groupby-settings.component.d.ts +16 -0
  338. package/lib/ulv-paging/ulv-paging.component.d.ts +27 -0
  339. package/lib/ulv-selection/ulv-selection.component.d.ts +43 -0
  340. package/lib/ulv-settings/ulv-settings.component.d.ts +43 -0
  341. package/lib/ulv-sort-settings/ulv-sort-settings.component.d.ts +16 -0
  342. package/lib/ulv-toolbar/ulv-toolbar.component.d.ts +47 -0
  343. package/lib/upload-file-status.pipe.d.ts +9 -0
  344. package/lib/wizard-layout.directive.d.ts +39 -0
  345. package/package.json +31 -0
  346. package/public-api.d.ts +166 -0
@@ -0,0 +1,689 @@
1
+ import { ChangeDetectionStrategy, Component, Inject, Input, Optional, Self, ViewChild, ViewChildren } from '@angular/core';
2
+ import { BehaviorSubject, combineLatest, Subject } from 'rxjs';
3
+ import { debounceTime, distinctUntilChanged, filter, map, takeUntil, tap, withLatestFrom } from 'rxjs/operators';
4
+ import { TableComponent, ToolbarComponent } from '@fundamental-ngx/core';
5
+ import { SelectionMode } from '@fundamental-ngx/platform';
6
+ import { BarsaApi, GetAllColumnsSorted, getControlSizeMode, getGridSettings, ReportBaseComponent } from 'barsa-novin-ray-core';
7
+ import { LayoutControlComponent } from './layout-control/layout-control.component';
8
+ import { GridMoDataList } from './models';
9
+ import { UlvColumnSettingsComponent } from './ulv-column-settings/ulv-column-settings.component';
10
+ import { UlvSortSettingsComponent } from './ulv-sort-settings/ulv-sort-settings.component';
11
+ import { UlvGroupbySettingsComponent } from './ulv-groupby-settings/ulv-groupby-settings.component';
12
+ import { UlvFilterSettingsComponent } from './ulv-filter-settings/ulv-filter-settings.component';
13
+ import { DOCUMENT } from '@angular/common';
14
+ import * as i0 from "@angular/core";
15
+ import * as i1 from "@angular/cdk/overlay";
16
+ import * as i2 from "@fundamental-ngx/core";
17
+ import * as i3 from "barsa-novin-ray-core";
18
+ export class SapUiReportBaseComponent extends ReportBaseComponent {
19
+ constructor(el, _overlay, _contentDensityService, _portalService, _dialogService, _ulvMainService, _layoutService, _renderer, document, _formpanelService) {
20
+ super(_portalService, _ulvMainService);
21
+ this.el = el;
22
+ this._overlay = _overlay;
23
+ this._contentDensityService = _contentDensityService;
24
+ this._portalService = _portalService;
25
+ this._dialogService = _dialogService;
26
+ this._ulvMainService = _ulvMainService;
27
+ this._layoutService = _layoutService;
28
+ this._renderer = _renderer;
29
+ this.document = document;
30
+ this._formpanelService = _formpanelService;
31
+ this.useLayoutItemTextForControl = false;
32
+ this.parentHeight = 0;
33
+ this.dialogConfig = {
34
+ responsivePadding: true,
35
+ verticalPadding: true,
36
+ minWidth: '40rem',
37
+ minHeight: '90vh',
38
+ maxWidth: '100vw',
39
+ maxHeight: '100vh',
40
+ resizable: true
41
+ };
42
+ this.selectedRowsNumber = {};
43
+ this.selectAll = false;
44
+ this.rowClick = true;
45
+ this.cellClick = false;
46
+ this.secondaryColumnsSource = new BehaviorSubject([]);
47
+ this.secondaryColumns$ = this.secondaryColumnsSource.asObservable();
48
+ this.rowActivable = true;
49
+ this.openOverflowCommands = [];
50
+ this.containerWidthSource$ = new Subject();
51
+ this.singleSelection = SelectionMode.SINGLE;
52
+ this.multipleSelection = SelectionMode.MULTIPLE;
53
+ this._deviceNameSource = new BehaviorSubject('desktop');
54
+ /* eslint-disable */
55
+ this.ShowFormPanelControl = (formpanelCtrlr) => { };
56
+ /* eslint-disable */
57
+ this.ForceCloseChild = () => { };
58
+ /* eslint-disable */
59
+ this.RefreshFormPanelControl = (formpanelCtrlr) => { };
60
+ this.containerWidth$ = this.containerWidthSource$
61
+ .asObservable()
62
+ .pipe(debounceTime(200), distinctUntilChanged());
63
+ this.deviceName$ = this._deviceNameSource.asObservable();
64
+ this.mobileOrTablet$ = this.deviceName$.pipe(map((device) => device === 'mobile' || device === 'tablet'));
65
+ this._oldContainer = BarsaApi.Ul.ApplicationCtrlr.CurrentSystemAdapter;
66
+ this.closeScrollStrategy = this._overlay.scrollStrategies.close();
67
+ this.contentDensity$ = this._contentDensityService.contentDensity;
68
+ this.secondaryColumnsCount$ = this.secondaryColumns$.pipe(map((columns) => columns.length));
69
+ this.columnsCount$ = this.visibleColumns$.pipe(map((columns) => columns.length), map((count) => {
70
+ const access = BarsaApi.Common.Util.TryGetValue(this.context, 'Setting.Extra.DefaultCommandsAccess');
71
+ if (access?.View) {
72
+ count++;
73
+ }
74
+ return count;
75
+ }), map((count) => {
76
+ if (this.selectionMode !== 'none') {
77
+ count++;
78
+ }
79
+ return count;
80
+ }));
81
+ }
82
+ get _typeDefId() {
83
+ return this.context.Setting.Extra.Report.TypeDefId;
84
+ }
85
+ get _inlineEditMode() {
86
+ return this._ulvMainService.getValueInlineEdit();
87
+ }
88
+ get _allowInlineEdit() {
89
+ return this._ulvMainService.getAllowInlineEdit();
90
+ }
91
+ get _access() {
92
+ return this.context.Setting?.Extra?.DefaultCommandsAccess;
93
+ }
94
+ set _access(val) {
95
+ if (this.context.Setting.Extra) {
96
+ this.context.Setting.Extra.DefaultCommandsAccess = val;
97
+ }
98
+ else {
99
+ this.context.Setting.Extra = { DefaultCommandsAccess: val };
100
+ }
101
+ }
102
+ ngOnInit() {
103
+ this._setParentHeight();
104
+ this._readViewSetting();
105
+ if (!this._access) {
106
+ this._setDefaultAccess();
107
+ }
108
+ super.ngOnInit();
109
+ this.showOkCancelButtons = this.context.ShowOkCancelButtons;
110
+ this._ulvMainService.layoutInfo$.subscribe((layoutInfo) => {
111
+ if (layoutInfo && layoutInfo.UseLayoutItemTextForControl) {
112
+ this.useLayoutItemTextForControl = true;
113
+ }
114
+ });
115
+ const title = this.viewSetting?.Title;
116
+ if (title) {
117
+ this._ulvMainService.setTitle(title);
118
+ }
119
+ this._ulvMainService.reportId$.subscribe((reportId) => (this.reportId = reportId));
120
+ this._layoutService.setRendered(true);
121
+ this.selectionMode = this.context.ViewSetting?.IsCheckList ? this.multipleSelection : this.singleSelection;
122
+ this._openOnClick = this.viewSetting?.OpenOnClick;
123
+ this.customRowHeight = BarsaApi.Common.Util.TryGetValue(this.context.Setting, 'Extra.ExtraJsonPropReport.GridRowHeight');
124
+ this.rtl$ = this._portalService.rtl$;
125
+ this.navigationArrow$ = this._portalService.rtl$.pipe(map((isRtl) => (isRtl ? 'navigation-left-arrow' : 'navigation-right-arrow')));
126
+ this.allowInlineEdit$ = this._ulvMainService.allowInlineEdit$;
127
+ this.inlineEditMode$ = this._ulvMainService.inlineEditMode$;
128
+ this.onlyInlineEdit$ = this._ulvMainService.onlyInlineEdit$;
129
+ this.hasSelected$ = this.moDataList$.pipe(map((moList) => moList.some((c) => c.$IsChecked)));
130
+ this.moDataList$ = this.moDataList$.pipe(map((items) => this._mapCartableMo(items)));
131
+ const gridDataSource = new GridMoDataList(this.moDataList$, this.gridSetting$, this.visibleColumns$, this.searchTerm$);
132
+ this.gridDataSource = gridDataSource;
133
+ this.columns$ = combineLatest([this.gridSetting$, this.secondaryColumns$]).pipe(map(([, secondaryColumns]) => {
134
+ const secondaries = secondaryColumns.map((c) => c.Name);
135
+ const columns = GetAllColumnsSorted(this.context).filter((c) => !c.Hidden);
136
+ return columns.filter((c) => secondaries.indexOf(c.Name) === -1);
137
+ }), tap((columns) => {
138
+ columns.forEach((c) => {
139
+ c.$CSSClassName = 'column__FieldType' + c.FieldTypeId;
140
+ if (c.FieldTypeId === 38) {
141
+ c.$Width = 'auto';
142
+ }
143
+ if (c.Extra?.IconDisplayTypeEnum === 'Image') {
144
+ c.$Width = '38px';
145
+ }
146
+ else {
147
+ c.$Width = !BarsaApi.LoginFormData.IsUserLoggedIn // if user is anonymous all column width equals to 100%
148
+ ? '100%'
149
+ : c.Width > 0
150
+ ? c.Width + 'px'
151
+ : '100%';
152
+ }
153
+ });
154
+ }));
155
+ this._ulvMainService.inlineEditMode$
156
+ .pipe(withLatestFrom(this.hasSelected$), filter(([_, __]) => this._access.Add !== false))
157
+ .subscribe(([editMode]) => this._inlineEditModeChanged(editMode));
158
+ this._setContainerWidth();
159
+ }
160
+ ngOnDestroy() {
161
+ super.ngOnDestroy();
162
+ if (this._formpanelService) {
163
+ this._formpanelService.destroy();
164
+ }
165
+ }
166
+ onEditMode() {
167
+ this._setInlineEdit(!this._inlineEditMode);
168
+ }
169
+ onSelectNextInlineRecord(mo) {
170
+ this._selectNextInlineRecord(mo);
171
+ }
172
+ onEditFormPanelSave(mo) {
173
+ this._inlineEditSaveFormPanel(mo);
174
+ }
175
+ onEditFormPanelCancel() {
176
+ this._inilineEditCancel();
177
+ }
178
+ onEditFormPanelValueChange(mo) {
179
+ this._inlineFormPanelValueChange(mo);
180
+ }
181
+ onColumnResized(columns) {
182
+ this._handleColumnsResized(columns);
183
+ }
184
+ onRowClick($event) {
185
+ const { mo } = $event;
186
+ if (mo.group || this._inlineEditMode) {
187
+ return;
188
+ }
189
+ const moIndex = this._getIndex(mo);
190
+ this._rowCheck(mo, moIndex, true);
191
+ this._openMo(mo, moIndex);
192
+ }
193
+ onUlvCommand($event) {
194
+ const { mo } = $event;
195
+ const moIndex = this._getIndex(mo);
196
+ this._ulvCommandClicked(mo, moIndex);
197
+ }
198
+ onRowCheck($event) {
199
+ const { mo } = $event;
200
+ const moIndex = this._getIndex(mo);
201
+ if (this._openOnClick) {
202
+ this.onRowClick($event);
203
+ }
204
+ else {
205
+ this._rowCheck(mo, moIndex);
206
+ }
207
+ }
208
+ onExpandClick(mo) {
209
+ mo.$Expanded = !mo.$Expanded;
210
+ this._setVisibility(mo.$Expanded, mo);
211
+ this._ulvMainService.reSetMoDataList();
212
+ }
213
+ onAllCheckbox(checked) {
214
+ this._doCheckedAll(checked);
215
+ // if (checked) {
216
+ // this.gridDataSource.resultItems.forEach((mo, index) => {
217
+ // this._select(mo, index);
218
+ // });
219
+ // } else {
220
+ // this.gridDataSource.resultItems.forEach((mo, index) => {
221
+ // this._deselect(mo, index);
222
+ // });
223
+ // }
224
+ }
225
+ onSortAscending(column) {
226
+ this._addSortColumn(column.Name, 'ASC');
227
+ }
228
+ onSortDescending(column) {
229
+ this._addSortColumn(column.Name, 'DESC');
230
+ }
231
+ onFilter(selectedColumn) {
232
+ this._showFilterSetting(selectedColumn);
233
+ }
234
+ onColumnSettings(device) {
235
+ this._openSettings('columns', device);
236
+ }
237
+ onSortSettings(device) {
238
+ this._openSettings('sort', device);
239
+ }
240
+ onGroupbySettings(device) {
241
+ this._openSettings('groupby', device);
242
+ }
243
+ onListCheckboxClick($event) {
244
+ const { mo, index, e } = $event;
245
+ this.onRowCheck({ mo, index, cause: 'singleSelect' });
246
+ e.stopPropagation();
247
+ e.preventDefault();
248
+ }
249
+ onListNavigationClick($event) {
250
+ const { mo, index, e } = $event;
251
+ this.onRowClick({ mo, index });
252
+ e.stopPropagation();
253
+ e.preventDefault();
254
+ }
255
+ onSaveTopForm(mo) {
256
+ const newMoDataList = this.moDataList;
257
+ const existsIndex = newMoDataList.findIndex((c) => c.Id === mo.Id);
258
+ if (existsIndex > -1) {
259
+ newMoDataList[existsIndex] = mo;
260
+ }
261
+ newMoDataList.map((c) => {
262
+ c.$NewInlineMo = undefined;
263
+ c.$IsChecked = false;
264
+ });
265
+ this._ulvMainService.reSetMoDataList(newMoDataList);
266
+ this.refreshContextMoDataList(newMoDataList);
267
+ }
268
+ onNewTopFormAdd(mo) {
269
+ this._addInlineMoToModataList(mo);
270
+ }
271
+ // protected _inlineEditModeChanged(editMode): void {
272
+ // if (editMode) {
273
+ // const canAdd: boolean = this._access?.Add !== false;
274
+ // let selectedMo = this._getSelected();
275
+ // let newMo;
276
+ // if (canAdd !== false && !selectedMo) {
277
+ // this._createNewInlineRecord();
278
+ // return;
279
+ // }
280
+ // // if (!selectedMo && !newMo && this.moDataList.length > 0) {
281
+ // // selectedMo = this.moDataList[0];
282
+ // // }
283
+ // // if (selectedMo) {
284
+ // // const idOfSelectedMo = this._indexOfMo(selectedMo);
285
+ // // selectedMo.$IsChecked = false;
286
+ // // this._createNewInlineRecord(selectedMo);
287
+ // // this._rowCheck(selectedMo, idOfSelectedMo);
288
+ // // }
289
+ // } else {
290
+ // BarsaApi.Ul.ApplicationCtrlr.CurrentSystemAdapter = this._oldContainer;
291
+ // this._setNewInlineMo(null);
292
+ // }
293
+ // }
294
+ // protected _createNewInlineRecord(selectedMo?: MetaobjectDataModel) {
295
+ // const mo = this._inlineEditPrepareNewMo();
296
+ // const formMo = BarsaApi.Common.Merger.FastMerge(mo, selectedMo, { extendedFields: ['Id,$Caption'] });
297
+ // this._setNewInlineMo(formMo);
298
+ // this._select(formMo, -1);
299
+ // }
300
+ _setParentHeight() {
301
+ const elDom = this.el.nativeElement;
302
+ let parentDom = elDom.parentElement;
303
+ let parentHeight = parentDom?.clientHeight ?? 0;
304
+ while (parentDom != null && !parentHeight) {
305
+ parentDom = parentDom.parentElement;
306
+ parentHeight = parentDom?.clientHeight ?? 0;
307
+ }
308
+ this.parentHeight = parentHeight;
309
+ }
310
+ _mapCartableMo(items) {
311
+ if (!this.viewSetting) {
312
+ return items;
313
+ }
314
+ const { NameSerializeMo, CartableObjectName } = this.viewSetting;
315
+ if (!NameSerializeMo || !CartableObjectName || !items?.length) {
316
+ return items;
317
+ }
318
+ items.forEach((c) => (c[CartableObjectName] = BarsaApi.Ext.decode('{' + c[NameSerializeMo] + '}')));
319
+ return items;
320
+ }
321
+ _inlineEditModeChanged(editMode) {
322
+ let newMoDataList = this.moDataList;
323
+ let changed = false;
324
+ if (editMode) {
325
+ newMoDataList.push(this._inlineReportCreateNewMo(!this._getSelected()));
326
+ changed = true;
327
+ }
328
+ else if (editMode === false && !newMoDataList.length) {
329
+ newMoDataList = newMoDataList.filter((c) => !c.$NewInlineMo);
330
+ changed = true;
331
+ }
332
+ if (!changed) {
333
+ return;
334
+ }
335
+ this._ulvMainService.reSetMoDataList(newMoDataList);
336
+ this.refreshContextMoDataList(newMoDataList);
337
+ }
338
+ _inlineReportCreateNewMo(isChecked) {
339
+ return this._ulvMainService.createNewInlineMo(isChecked);
340
+ }
341
+ _inlineFormPanelValueChange(mo) {
342
+ const newMoDataList = this.moDataList;
343
+ const existMoIndex = newMoDataList.findIndex((c) => c.Id === mo.Id);
344
+ if (existMoIndex > -1) {
345
+ newMoDataList[existMoIndex] = BarsaApi.Common.MetaObjectWeb.CreateMo(mo);
346
+ this._ulvMainService.reSetMoDataList(newMoDataList);
347
+ this.refreshContextMoDataList(newMoDataList);
348
+ }
349
+ }
350
+ _selectNextInlineRecord(mo) {
351
+ const newMoDataList = this.moDataList;
352
+ if (!mo.$NewInlineMo) {
353
+ // select next record
354
+ const existsIndex = newMoDataList.findIndex((c) => c.Id === mo.Id);
355
+ if (existsIndex > -1 && existsIndex + 1 < newMoDataList.length) {
356
+ newMoDataList[existsIndex + 1].$IsChecked = false;
357
+ this._rowCheck(newMoDataList[existsIndex + 1], existsIndex + 1);
358
+ }
359
+ else {
360
+ newMoDataList.map((c) => {
361
+ c.$NewInlineMo = undefined;
362
+ c.$IsChecked = false;
363
+ });
364
+ newMoDataList.push(this._inlineReportCreateNewMo(true));
365
+ this._ulvMainService.reSetMoDataList(newMoDataList);
366
+ this.refreshContextMoDataList(newMoDataList);
367
+ }
368
+ return;
369
+ }
370
+ }
371
+ _inlineEditSaveFormPanel(mo) {
372
+ const newMoDataList = this.moDataList;
373
+ if (!mo.$NewInlineMo) {
374
+ return;
375
+ }
376
+ const existsIndex = newMoDataList.findIndex((c) => c.Id === mo.Id);
377
+ if (existsIndex > -1) {
378
+ newMoDataList[existsIndex] = mo;
379
+ }
380
+ newMoDataList.map((c) => {
381
+ c.$NewInlineMo = undefined;
382
+ c.$IsChecked = false;
383
+ });
384
+ // const reportEventMo = {
385
+ // ReportId: this.reportId,
386
+ // ...mo,
387
+ // $IsChecked: false,
388
+ // $NewInlineMo: undefined
389
+ // };
390
+ // const indexOfMo = this._getIndex(mo);
391
+ // // let indexOfNextMo = indexOfMo + 1;
392
+ // // const canAdd: boolean = this._access?.Add !== false;
393
+ // let insertedIndex = indexOfMo;
394
+ // if (indexOfMo === -1) {
395
+ // insertedIndex = newMoDataList.length;
396
+ // }
397
+ // newMoDataList.splice(insertedIndex, indexOfMo === -1 ? 0 : 1, reportEventMo);
398
+ // if (mo.$State === 'New') {
399
+ // }
400
+ newMoDataList.push(this._inlineReportCreateNewMo(false));
401
+ this._ulvMainService.reSetMoDataList(newMoDataList);
402
+ this.refreshContextMoDataList(newMoDataList);
403
+ this._rowCheck(mo, newMoDataList.findIndex((c) => c.Id === mo.Id));
404
+ // this._ulvMainService.createNewInlineMo();
405
+ }
406
+ _setDefaultAccess() {
407
+ this._access = {
408
+ Add: false,
409
+ AddToList: false,
410
+ Delete: false,
411
+ Edit: false,
412
+ Export: false,
413
+ Print: false,
414
+ Refresh: false,
415
+ RemoveFromList: false,
416
+ View: false
417
+ };
418
+ }
419
+ _expandMo(selectedMo, expand) {
420
+ selectedMo.$Expanded = expand;
421
+ selectedMo.$Children?.forEach((child) => {
422
+ this._expandMo(child, expand);
423
+ });
424
+ }
425
+ _indexOfId(id) {
426
+ return this.gridDataSource.resultItems.findIndex((c) => c.Id === id);
427
+ }
428
+ _indexOfMo(mo) {
429
+ return this.gridDataSource.resultItems.findIndex((c) => c.Id === mo.Id);
430
+ }
431
+ _indexOfSelected() {
432
+ return this.gridDataSource.resultItems.findIndex((c) => c.$IsChecked);
433
+ }
434
+ _getIndex(mo) {
435
+ return this.moDataList.findIndex((c) => c.Id === mo.Id);
436
+ }
437
+ _inilineEditCancel() {
438
+ this._setInlineEdit(false);
439
+ }
440
+ _setInlineEdit(value) {
441
+ this._ulvMainService.setInlineEdit(value);
442
+ }
443
+ _readViewSetting() {
444
+ this.viewSetting = this.context.Setting.ClassNames.CustomUi?.Parameters;
445
+ }
446
+ // protected _moDataListChanged(moDataList: MetaobjectDataModel[]): void {
447
+ // super._moDataListChanged(moDataList);
448
+ // if (this._inlineEditMode) {
449
+ // const checkedMoIndex = moDataList.findIndex((c) => c.$IsChecked);
450
+ // if (checkedMoIndex > -1) {
451
+ // const checkedMo = moDataList[checkedMoIndex];
452
+ // if (checkedMo.Id !== this.formPanelCtrlr.Mo.Id) {
453
+ // this._inlineEditorDestroyFormPanelCtrlr();
454
+ // this._inlineEditCreateFormPanelCtrlr(checkedMo, checkedMoIndex);
455
+ // }
456
+ // }
457
+ // }
458
+ // }
459
+ _setVisibility(expand, mo //MetaobjectDataModel
460
+ ) {
461
+ mo.$Children?.forEach((child) => {
462
+ child.$Visibility = expand;
463
+ if (child.$Children) {
464
+ this._setVisibility(expand, child);
465
+ }
466
+ });
467
+ }
468
+ // protected _setNewInlineMo(mo: MetaobjectDataModel | null): void {
469
+ // this._ulvMainService.setNewInlineMo(mo);
470
+ // }
471
+ // protected _inlineEditPrepareNewMo(): MetaobjectDataModel {
472
+ // const newMo = getNewMoGridEditor(this.formSetting, this._typeDefId);
473
+ // newMo.Id = getUniqueId(3);
474
+ // if (this._isComposite()) {
475
+ // const relation = BarsaApi.Common.Util.TryGetValue(this.context.Setting, 'Extra.Relation');
476
+ // newMo[relation.ParentFdName] = relation.ParentMoId;
477
+ // }
478
+ // const newMoDataList = [...this.moDataList, newMo as MetaobjectDataModel];
479
+ // this._ulvMainService.reSetMoDataList(newMoDataList);
480
+ // BarsaApi.Ul.ApplicationCtrlr.fireEvent(
481
+ // BarsaApi.Ul.ApplicationCtrlr.EventEnum.GlobalReportMoAdd,
482
+ // this.context,
483
+ // reportEventMoAdd
484
+ // );
485
+ // this.context.fireEvent('RefreshContextMoDataList', newMoDataList);
486
+ // return newMo as MetaobjectDataModel;
487
+ // }
488
+ _addInlineMoToModataList(newInlineMo) {
489
+ const newMoDataList = [...this.moDataList, { ...newInlineMo, $IsChecked: false }];
490
+ this._ulvMainService.reSetMoDataList(newMoDataList);
491
+ this.refreshContextMoDataList(newMoDataList);
492
+ }
493
+ _rowCheck(mo, index, selected = false) {
494
+ const editMode = this._inlineEditMode && this._allowInlineEdit;
495
+ if (mo.$IsChecked && editMode) {
496
+ return;
497
+ }
498
+ let selectionMode = this.selectionMode;
499
+ if (editMode) {
500
+ selectionMode = SelectionMode.SINGLE;
501
+ }
502
+ const checked = !mo.$IsChecked || selected;
503
+ this.rowHoverable = false;
504
+ if (selectionMode === 'none') {
505
+ return;
506
+ }
507
+ if (checked) {
508
+ if (selectionMode === 'single' && checked) {
509
+ this._doCheckedAll(false);
510
+ }
511
+ if (editMode) {
512
+ if (index !== -1) {
513
+ // this._setNewInlineMo(null);
514
+ this._select(mo, index);
515
+ }
516
+ // TODO
517
+ // this._setValueInlineMo(mo);
518
+ }
519
+ else {
520
+ this._select(mo, index);
521
+ }
522
+ }
523
+ else
524
+ this._deselect(mo, index);
525
+ }
526
+ // protected _setValueInlineMo(mo: MetaobjectDataModel): void {
527
+ // // this.formPanelCtrlr.SetValue({ ...mo, $TypeDefId: this._typeDefId });
528
+ // }
529
+ _inlineEditorDestroyFormPanelCtrlr() {
530
+ // if (this.formPanelCtrlr) {
531
+ // this._formPanelService.destroy();
532
+ // this.formPanelCtrlr.Destroy();
533
+ // this.formPanelCtrlr = null;
534
+ // }
535
+ }
536
+ _windowResized() {
537
+ this._setContainerWidth();
538
+ this._setParentHeight();
539
+ }
540
+ _setContainerWidth() {
541
+ const el = this.el.nativeElement;
542
+ this.containerWidthSource$.next(el.offsetWidth);
543
+ }
544
+ _deviceSizeChanged(deviceSize) {
545
+ const el = this.el.nativeElement;
546
+ if (this._inlineEditMode) {
547
+ this.secondaryColumnsSource.next([]);
548
+ return;
549
+ }
550
+ if (this.viewSetting?.DisableResponsive) {
551
+ return;
552
+ }
553
+ const gridSize = getControlSizeMode(el, deviceSize);
554
+ let deviceName = 'desktop';
555
+ const visibleColumns = this._visibleColumnsSource.getValue();
556
+ let columnsCount = visibleColumns.length;
557
+ switch (gridSize) {
558
+ case 'l':
559
+ case 'xl':
560
+ deviceName = 'desktop';
561
+ break;
562
+ case 's':
563
+ deviceName = 'mobile';
564
+ columnsCount = 2;
565
+ break;
566
+ case 'm':
567
+ deviceName = 'tablet';
568
+ columnsCount = 4;
569
+ break;
570
+ }
571
+ this._deviceNameSource.next(deviceName);
572
+ const colSettings = this.gridSettingSource.getValue()?.ColSettingList || [];
573
+ let sumColWidth = 0;
574
+ if (colSettings.length > 0 && this.containerWidth > 0) {
575
+ columnsCount = visibleColumns.length;
576
+ colSettings.forEach((col, index) => {
577
+ if (sumColWidth + col.Width > this.containerWidth && columnsCount === visibleColumns.length) {
578
+ columnsCount = index;
579
+ }
580
+ sumColWidth += col.Width;
581
+ });
582
+ }
583
+ if (visibleColumns.length > 2) {
584
+ this.secondaryColumnsSource.next(visibleColumns.slice(columnsCount, visibleColumns.length));
585
+ }
586
+ }
587
+ _openSettings(name, device) {
588
+ let component = null;
589
+ switch (name) {
590
+ case 'columns':
591
+ component = UlvColumnSettingsComponent;
592
+ break;
593
+ case 'sort':
594
+ component = UlvSortSettingsComponent;
595
+ break;
596
+ case 'groupby':
597
+ component = UlvGroupbySettingsComponent;
598
+ break;
599
+ }
600
+ const config = {
601
+ ...this.dialogConfig,
602
+ data: { context: this.context },
603
+ fullScreen: device === 'mobile',
604
+ minWidth: device === 'mobile' ? 'auto' : this.dialogConfig.minWidth,
605
+ minHeight: device === 'mobile' ? 'auto' : this.dialogConfig.minHeight
606
+ };
607
+ if (component !== null) {
608
+ const dialogRef = this._dialogService.open(component, config);
609
+ dialogRef.afterClosed.pipe(takeUntil(this._onDestroy$)).subscribe((setting) => {
610
+ if (setting) {
611
+ const isSortChanged = name === 'sort' || name === 'groupby';
612
+ this.updateGridSetting(setting, isSortChanged);
613
+ this.context.moDataList = this.gridDataSource.resultItems;
614
+ this._setVisibleColumns();
615
+ }
616
+ });
617
+ }
618
+ }
619
+ _showFilterSetting(selectedColumn) {
620
+ const typeDefId = this._typeDefId;
621
+ const controlsInfo$ = this._ulvMainService.loadMetaConditionsControlInfos(typeDefId, this.allColumns.map((c) => c.Name));
622
+ const config = {
623
+ ...this.dialogConfig,
624
+ data: {
625
+ controlsInfo$,
626
+ typeDefId,
627
+ selectedColumnName: selectedColumn.Name,
628
+ context: this.context
629
+ }
630
+ };
631
+ const dialogRef = this._dialogService.open(UlvFilterSettingsComponent, config);
632
+ dialogRef.afterClosed.pipe(takeUntil(this._onDestroy$)).subscribe((setting) => {
633
+ if (setting) {
634
+ }
635
+ });
636
+ }
637
+ _addSortColumn(name, sortDirection, isGrouped = false) {
638
+ const sortItem = {
639
+ Name: name,
640
+ SortDirection: sortDirection,
641
+ IsGrouped: isGrouped
642
+ };
643
+ const settings = getGridSettings(this.context);
644
+ const existSortItemIndex = settings.SortSettingList.findIndex((c) => c.Name === name);
645
+ if (existSortItemIndex > -1) {
646
+ settings.SortSettingList[existSortItemIndex] = sortItem;
647
+ }
648
+ else {
649
+ settings.SortSettingList.push(sortItem);
650
+ }
651
+ this.updateGridSetting(settings, true);
652
+ }
653
+ }
654
+ SapUiReportBaseComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.7", ngImport: i0, type: SapUiReportBaseComponent, deps: [{ token: i0.ElementRef }, { token: i1.Overlay }, { token: i2.ContentDensityService }, { token: i3.PortalService }, { token: i2.DialogService }, { token: i3.UlvMainService }, { token: i3.LayoutService }, { token: i0.Renderer2 }, { token: DOCUMENT }, { token: i3.FormPanelService, optional: true, self: true }], target: i0.ɵɵFactoryTarget.Component });
655
+ SapUiReportBaseComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.7", type: SapUiReportBaseComponent, selector: "bsu-sap-ui-report-base", inputs: { ShowFormPanelControl: "ShowFormPanelControl", ForceCloseChild: "ForceCloseChild", RefreshFormPanelControl: "RefreshFormPanelControl" }, viewQueries: [{ propertyName: "tableComponent", first: true, predicate: TableComponent, descendants: true }, { propertyName: "toolbarComponent", first: true, predicate: ToolbarComponent, descendants: true }, { propertyName: "tableRowsRef", predicate: ["tableRows"], descendants: true }, { propertyName: "layoutControlsRef", predicate: LayoutControlComponent, descendants: true }], usesInheritance: true, ngImport: i0, template: '', isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush });
656
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.7", ngImport: i0, type: SapUiReportBaseComponent, decorators: [{
657
+ type: Component,
658
+ args: [{
659
+ selector: 'bsu-sap-ui-report-base',
660
+ template: '',
661
+ changeDetection: ChangeDetectionStrategy.OnPush
662
+ }]
663
+ }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i1.Overlay }, { type: i2.ContentDensityService }, { type: i3.PortalService }, { type: i2.DialogService }, { type: i3.UlvMainService }, { type: i3.LayoutService }, { type: i0.Renderer2 }, { type: undefined, decorators: [{
664
+ type: Inject,
665
+ args: [DOCUMENT]
666
+ }] }, { type: i3.FormPanelService, decorators: [{
667
+ type: Optional
668
+ }, {
669
+ type: Self
670
+ }] }]; }, propDecorators: { tableComponent: [{
671
+ type: ViewChild,
672
+ args: [TableComponent]
673
+ }], toolbarComponent: [{
674
+ type: ViewChild,
675
+ args: [ToolbarComponent]
676
+ }], tableRowsRef: [{
677
+ type: ViewChildren,
678
+ args: ['tableRows']
679
+ }], layoutControlsRef: [{
680
+ type: ViewChildren,
681
+ args: [LayoutControlComponent]
682
+ }], ShowFormPanelControl: [{
683
+ type: Input
684
+ }], ForceCloseChild: [{
685
+ type: Input
686
+ }], RefreshFormPanelControl: [{
687
+ type: Input
688
+ }] } });
689
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2FwLXVpLXJlcG9ydC1iYXNlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2JhcnNhLXNhcC11aS9zcmMvbGliL3NhcC11aS1yZXBvcnQtYmFzZS5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNILHVCQUF1QixFQUN2QixTQUFTLEVBRVQsTUFBTSxFQUNOLEtBQUssRUFHTCxRQUFRLEVBR1IsSUFBSSxFQUNKLFNBQVMsRUFDVCxZQUFZLEVBQ2YsTUFBTSxlQUFlLENBQUM7QUFFdkIsT0FBTyxFQUFFLGVBQWUsRUFBRSxhQUFhLEVBQWMsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzNFLE9BQU8sRUFBRSxZQUFZLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLGNBQWMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ2pILE9BQU8sRUFLSCxjQUFjLEVBQ2QsZ0JBQWdCLEVBQ25CLE1BQU0sdUJBQXVCLENBQUM7QUFDL0IsT0FBTyxFQUFFLGFBQWEsRUFBbUIsTUFBTSwyQkFBMkIsQ0FBQztBQUUzRSxPQUFPLEVBQ0gsUUFBUSxFQUtSLG1CQUFtQixFQUNuQixrQkFBa0IsRUFDbEIsZUFBZSxFQUlmLG1CQUFtQixFQUl0QixNQUFNLHNCQUFzQixDQUFDO0FBQzlCLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLDJDQUEyQyxDQUFDO0FBQ25GLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFDMUMsT0FBTyxFQUFFLDBCQUEwQixFQUFFLE1BQU0scURBQXFELENBQUM7QUFDakcsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0saURBQWlELENBQUM7QUFDM0YsT0FBTyxFQUFFLDJCQUEyQixFQUFFLE1BQU0sdURBQXVELENBQUM7QUFDcEcsT0FBTyxFQUFFLDBCQUEwQixFQUFFLE1BQU0scURBQXFELENBQUM7QUFDakcsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGlCQUFpQixDQUFDOzs7OztBQU8zQyxNQUFNLE9BQU8sd0JBQ1QsU0FBUSxtQkFBbUI7SUFvRTNCLFlBQ1csRUFBYyxFQUNYLFFBQWlCLEVBQ2pCLHNCQUE2QyxFQUM3QyxjQUE2QixFQUM3QixjQUE2QixFQUM3QixlQUErQixFQUMvQixjQUE2QixFQUM3QixTQUFvQixFQUNGLFFBQVEsRUFDTixpQkFBbUM7UUFFakUsS0FBSyxDQUFDLGNBQWMsRUFBRSxlQUFlLENBQUMsQ0FBQztRQVhoQyxPQUFFLEdBQUYsRUFBRSxDQUFZO1FBQ1gsYUFBUSxHQUFSLFFBQVEsQ0FBUztRQUNqQiwyQkFBc0IsR0FBdEIsc0JBQXNCLENBQXVCO1FBQzdDLG1CQUFjLEdBQWQsY0FBYyxDQUFlO1FBQzdCLG1CQUFjLEdBQWQsY0FBYyxDQUFlO1FBQzdCLG9CQUFlLEdBQWYsZUFBZSxDQUFnQjtRQUMvQixtQkFBYyxHQUFkLGNBQWMsQ0FBZTtRQUM3QixjQUFTLEdBQVQsU0FBUyxDQUFXO1FBQ0YsYUFBUSxHQUFSLFFBQVEsQ0FBQTtRQUNOLHNCQUFpQixHQUFqQixpQkFBaUIsQ0FBa0I7UUF0RXJFLGdDQUEyQixHQUFHLEtBQUssQ0FBQztRQUdwQyxpQkFBWSxHQUFHLENBQUMsQ0FBQztRQUNqQixpQkFBWSxHQUFpQjtZQUN6QixpQkFBaUIsRUFBRSxJQUFJO1lBQ3ZCLGVBQWUsRUFBRSxJQUFJO1lBQ3JCLFFBQVEsRUFBRSxPQUFPO1lBQ2pCLFNBQVMsRUFBRSxNQUFNO1lBQ2pCLFFBQVEsRUFBRSxPQUFPO1lBQ2pCLFNBQVMsRUFBRSxPQUFPO1lBQ2xCLFNBQVMsRUFBRSxJQUFJO1NBQ2xCLENBQUM7UUFFRix1QkFBa0IsR0FBRyxFQUFFLENBQUM7UUFDeEIsY0FBUyxHQUFHLEtBQUssQ0FBQztRQVNsQixhQUFRLEdBQUcsSUFBSSxDQUFDO1FBQ2hCLGNBQVMsR0FBRyxLQUFLLENBQUM7UUFJbEIsMkJBQXNCLEdBQUcsSUFBSSxlQUFlLENBQXFCLEVBQUUsQ0FBQyxDQUFDO1FBQ3JFLHNCQUFpQixHQUFHLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUkvRCxpQkFBWSxHQUFHLElBQUksQ0FBQztRQUNwQix5QkFBb0IsR0FBYyxFQUFFLENBQUM7UUFDckMsMEJBQXFCLEdBQUcsSUFBSSxPQUFPLEVBQVUsQ0FBQztRQVU5QyxvQkFBZSxHQUFHLGFBQWEsQ0FBQyxNQUFNLENBQUM7UUFDdkMsc0JBQWlCLEdBQUcsYUFBYSxDQUFDLFFBQVEsQ0FBQztRQVVqQyxzQkFBaUIsR0FBRyxJQUFJLGVBQWUsQ0FBYSxTQUFTLENBQUMsQ0FBQztRQW9RekUsb0JBQW9CO1FBQ1gseUJBQW9CLEdBQUcsQ0FBQyxjQUFjLEVBQUUsRUFBRSxHQUFFLENBQUMsQ0FBQztRQUN2RCxvQkFBb0I7UUFDWCxvQkFBZSxHQUFHLEdBQUcsRUFBRSxHQUFFLENBQUMsQ0FBQztRQUNwQyxvQkFBb0I7UUFDWCw0QkFBdUIsR0FBRyxDQUFDLGNBQWMsRUFBRSxFQUFFLEdBQUUsQ0FBQyxDQUFDO1FBelB0RCxJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQyxxQkFBcUI7YUFDNUMsWUFBWSxFQUFFO2FBQ2QsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsRUFBRSxvQkFBb0IsRUFBRSxDQUFDLENBQUM7UUFDckQsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDekQsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLE1BQU0sS0FBSyxRQUFRLElBQUksTUFBTSxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUM7UUFDMUcsSUFBSSxDQUFDLGFBQWEsR0FBRyxRQUFRLENBQUMsRUFBRSxDQUFDLGdCQUFnQixDQUFDLG9CQUFvQixDQUFDO1FBQ3ZFLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLGdCQUFnQixDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ2xFLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDLHNCQUFzQixDQUFDLGNBQWMsQ0FBQztRQUNsRSxJQUFJLENBQUMsc0JBQXNCLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO1FBQzVGLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQzFDLEdBQUcsQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxFQUNoQyxHQUFHLENBQUMsQ0FBQyxLQUFhLEVBQUUsRUFBRTtZQUNsQixNQUFNLE1BQU0sR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxxQ0FBcUMsQ0FBQyxDQUFDO1lBQ3JHLElBQUksTUFBTSxFQUFFLElBQUksRUFBRTtnQkFDZCxLQUFLLEVBQUUsQ0FBQzthQUNYO1lBQ0QsT0FBTyxLQUFLLENBQUM7UUFDakIsQ0FBQyxDQUFDLEVBQ0YsR0FBRyxDQUFDLENBQUMsS0FBYSxFQUFFLEVBQUU7WUFDbEIsSUFBSSxJQUFJLENBQUMsYUFBYSxLQUFLLE1BQU0sRUFBRTtnQkFDL0IsS0FBSyxFQUFFLENBQUM7YUFDWDtZQUNELE9BQU8sS0FBSyxDQUFDO1FBQ2pCLENBQUMsQ0FBQyxDQUNMLENBQUM7SUFDTixDQUFDO0lBRUQsSUFBSSxVQUFVO1FBQ1YsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQztJQUN2RCxDQUFDO0lBQ0QsSUFBSSxlQUFlO1FBQ2YsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLGtCQUFrQixFQUFFLENBQUM7SUFDckQsQ0FBQztJQUNELElBQUksZ0JBQWdCO1FBQ2hCLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO0lBQ3JELENBQUM7SUFDRCxJQUFJLE9BQU87UUFDUCxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLEtBQUssRUFBRSxxQkFBcUIsQ0FBQztJQUM5RCxDQUFDO0lBQ0QsSUFBSSxPQUFPLENBQUMsR0FBMEI7UUFDbEMsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUU7WUFDNUIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLHFCQUFxQixHQUFHLEdBQUcsQ0FBQztTQUMxRDthQUFNO1lBQ0gsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsS0FBSyxHQUFHLEVBQUUscUJBQXFCLEVBQUUsR0FBRyxFQUFFLENBQUM7U0FDL0Q7SUFDTCxDQUFDO0lBQ0QsUUFBUTtRQUNKLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1FBQ3hCLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1FBQ3hCLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFO1lBQ2YsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7U0FDNUI7UUFDRCxLQUFLLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDakIsSUFBSSxDQUFDLG1CQUFtQixHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsbUJBQW1CLENBQUM7UUFDNUQsSUFBSSxDQUFDLGVBQWUsQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLENBQUMsVUFBVSxFQUFFLEVBQUU7WUFDdEQsSUFBSSxVQUFVLElBQUksVUFBVSxDQUFDLDJCQUEyQixFQUFFO2dCQUN0RCxJQUFJLENBQUMsMkJBQTJCLEdBQUcsSUFBSSxDQUFDO2FBQzNDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7UUFDSCxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsV0FBVyxFQUFFLEtBQUssQ0FBQztRQUN0QyxJQUFJLEtBQUssRUFBRTtZQUNQLElBQUksQ0FBQyxlQUFlLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO1NBQ3hDO1FBQ0QsSUFBSSxDQUFDLGVBQWUsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQztRQUNuRixJQUFJLENBQUMsY0FBYyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN0QyxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsV0FBVyxFQUFFLFdBQVcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDO1FBQzNHLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLFdBQVcsRUFBRSxXQUFXLENBQUM7UUFDbEQsSUFBSSxDQUFDLGVBQWUsR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQ25ELElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUNwQix5Q0FBeUMsQ0FDNUMsQ0FBQztRQUNGLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUM7UUFDckMsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLElBQUksQ0FDakQsR0FBRyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsdUJBQXVCLENBQUMsQ0FBQyxDQUFDLHdCQUF3QixDQUFDLENBQUMsQ0FDL0UsQ0FBQztRQUNGLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLGdCQUFnQixDQUFDO1FBQzlELElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxlQUFlLENBQUM7UUFDNUQsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLGVBQWUsQ0FBQztRQUM1RCxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM3RixJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDckYsTUFBTSxjQUFjLEdBQUcsSUFBSSxjQUFjLENBQ3JDLElBQUksQ0FBQyxXQUFXLEVBQ2hCLElBQUksQ0FBQyxZQUFZLEVBQ2pCLElBQUksQ0FBQyxlQUFlLEVBQ3BCLElBQUksQ0FBQyxXQUFXLENBQ25CLENBQUM7UUFFRixJQUFJLENBQUMsY0FBYyxHQUFHLGNBQWMsQ0FBQztRQUNyQyxJQUFJLENBQUMsUUFBUSxHQUFHLGFBQWEsQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxJQUFJLENBQzNFLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxnQkFBZ0IsQ0FBQyxFQUFFLEVBQUU7WUFDekIsTUFBTSxXQUFXLEdBQUcsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDeEQsTUFBTSxPQUFPLEdBQUcsbUJBQW1CLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDM0UsT0FBTyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3JFLENBQUMsQ0FBQyxFQUNGLEdBQUcsQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFO1lBQ1osT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQW1CLEVBQUUsRUFBRTtnQkFDcEMsQ0FBQyxDQUFDLGFBQWEsR0FBRyxtQkFBbUIsR0FBRyxDQUFDLENBQUMsV0FBVyxDQUFDO2dCQUN0RCxJQUFJLENBQUMsQ0FBQyxXQUFXLEtBQUssRUFBRSxFQUFFO29CQUN0QixDQUFDLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztpQkFDckI7Z0JBQ0QsSUFBSSxDQUFDLENBQUMsS0FBSyxFQUFFLG1CQUFtQixLQUFLLE9BQU8sRUFBRTtvQkFDMUMsQ0FBQyxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7aUJBQ3JCO3FCQUFNO29CQUNILENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLGNBQWMsQ0FBQyx1REFBdUQ7d0JBQ3JHLENBQUMsQ0FBQyxNQUFNO3dCQUNSLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxHQUFHLENBQUM7NEJBQ2IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEdBQUcsSUFBSTs0QkFDaEIsQ0FBQyxDQUFDLE1BQU0sQ0FBQztpQkFDaEI7WUFDTCxDQUFDLENBQUMsQ0FBQztRQUNQLENBQUMsQ0FBQyxDQUNMLENBQUM7UUFDRixJQUFJLENBQUMsZUFBZSxDQUFDLGVBQWU7YUFDL0IsSUFBSSxDQUNELGNBQWMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLEVBQ2pDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsS0FBSyxLQUFLLENBQUMsQ0FDakQ7YUFDQSxTQUFTLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsc0JBQXNCLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztRQUN0RSxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztJQUM5QixDQUFDO0lBRUQsV0FBVztRQUNQLEtBQUssQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUNwQixJQUFJLElBQUksQ0FBQyxpQkFBaUIsRUFBRTtZQUN4QixJQUFJLENBQUMsaUJBQWlCLENBQUMsT0FBTyxFQUFFLENBQUM7U0FDcEM7SUFDTCxDQUFDO0lBRUQsVUFBVTtRQUNOLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUM7SUFDL0MsQ0FBQztJQUNELHdCQUF3QixDQUFDLEVBQUU7UUFDdkIsSUFBSSxDQUFDLHVCQUF1QixDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ3JDLENBQUM7SUFFRCxtQkFBbUIsQ0FBQyxFQUF1QjtRQUN2QyxJQUFJLENBQUMsd0JBQXdCLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDdEMsQ0FBQztJQUVELHFCQUFxQjtRQUNqQixJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztJQUM5QixDQUFDO0lBQ0QsMEJBQTBCLENBQUMsRUFBdUI7UUFDOUMsSUFBSSxDQUFDLDJCQUEyQixDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ3pDLENBQUM7SUFDRCxlQUFlLENBQUMsT0FBZ0M7UUFDNUMsSUFBSSxDQUFDLHFCQUFxQixDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ3hDLENBQUM7SUFDRCxVQUFVLENBQUMsTUFBTTtRQUNiLE1BQU0sRUFBRSxFQUFFLEVBQUUsR0FBRyxNQUFNLENBQUM7UUFDdEIsSUFBSSxFQUFFLENBQUMsS0FBSyxJQUFJLElBQUksQ0FBQyxlQUFlLEVBQUU7WUFDbEMsT0FBTztTQUNWO1FBQ0QsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNuQyxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsRUFBRSxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDbEMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDOUIsQ0FBQztJQUVELFlBQVksQ0FBQyxNQUFNO1FBQ2YsTUFBTSxFQUFFLEVBQUUsRUFBRSxHQUFHLE1BQU0sQ0FBQztRQUN0QixNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ25DLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxFQUFFLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDekMsQ0FBQztJQUNELFVBQVUsQ0FBQyxNQUFNO1FBQ2IsTUFBTSxFQUFFLEVBQUUsRUFBRSxHQUFHLE1BQU0sQ0FBQztRQUN0QixNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ25DLElBQUksSUFBSSxDQUFDLFlBQVksRUFBRTtZQUNuQixJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1NBQzNCO2FBQU07WUFDSCxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsRUFBRSxPQUFPLENBQUMsQ0FBQztTQUMvQjtJQUNMLENBQUM7SUFFRCxhQUFhLENBQUMsRUFBdUI7UUFDakMsRUFBRSxDQUFDLFNBQVMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxTQUFTLENBQUM7UUFDN0IsSUFBSSxDQUFDLGNBQWMsQ0FBQyxFQUFFLENBQUMsU0FBUyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ3RDLElBQUksQ0FBQyxlQUFlLENBQUMsZUFBZSxFQUFFLENBQUM7SUFDM0MsQ0FBQztJQUVELGFBQWEsQ0FBQyxPQUFPO1FBQ2pCLElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDNUIsaUJBQWlCO1FBQ2pCLDZEQUE2RDtRQUM3RCwrQkFBK0I7UUFDL0IsUUFBUTtRQUNSLFdBQVc7UUFDWCw2REFBNkQ7UUFDN0QsaUNBQWlDO1FBQ2pDLFFBQVE7UUFDUixJQUFJO0lBQ1IsQ0FBQztJQUVELGVBQWUsQ0FBQyxNQUFNO1FBQ2xCLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQztJQUM1QyxDQUFDO0lBRUQsZ0JBQWdCLENBQUMsTUFBTTtRQUNuQixJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDN0MsQ0FBQztJQUNELFFBQVEsQ0FBQyxjQUFjO1FBQ25CLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxjQUFjLENBQUMsQ0FBQztJQUM1QyxDQUFDO0lBRUQsZ0JBQWdCLENBQUMsTUFBTTtRQUNuQixJQUFJLENBQUMsYUFBYSxDQUFDLFNBQVMsRUFBRSxNQUFNLENBQUMsQ0FBQztJQUMxQyxDQUFDO0lBRUQsY0FBYyxDQUFDLE1BQU07UUFDakIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDdkMsQ0FBQztJQUVELGlCQUFpQixDQUFDLE1BQU07UUFDcEIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxTQUFTLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDMUMsQ0FBQztJQUVELG1CQUFtQixDQUFDLE1BQU07UUFDdEIsTUFBTSxFQUFFLEVBQUUsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLEdBQUcsTUFBTSxDQUFDO1FBQ2hDLElBQUksQ0FBQyxVQUFVLENBQUMsRUFBRSxFQUFFLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxjQUFjLEVBQUUsQ0FBQyxDQUFDO1FBQ3RELENBQUMsQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUNwQixDQUFDLENBQUMsY0FBYyxFQUFFLENBQUM7SUFDdkIsQ0FBQztJQUVELHFCQUFxQixDQUFDLE1BQU07UUFDeEIsTUFBTSxFQUFFLEVBQUUsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLEdBQUcsTUFBTSxDQUFDO1FBQ2hDLElBQUksQ0FBQyxVQUFVLENBQUMsRUFBRSxFQUFFLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztRQUMvQixDQUFDLENBQUMsZUFBZSxFQUFFLENBQUM7UUFDcEIsQ0FBQyxDQUFDLGNBQWMsRUFBRSxDQUFDO0lBQ3ZCLENBQUM7SUFDRCxhQUFhLENBQUMsRUFBdUI7UUFDakMsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQztRQUN0QyxNQUFNLFdBQVcsR0FBRyxhQUFhLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNuRSxJQUFJLFdBQVcsR0FBRyxDQUFDLENBQUMsRUFBRTtZQUNsQixhQUFhLENBQUMsV0FBVyxDQUFDLEdBQUcsRUFBRSxDQUFDO1NBQ25DO1FBQ0QsYUFBYSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFO1lBQ3BCLENBQUMsQ0FBQyxZQUFZLEdBQUcsU0FBUyxDQUFDO1lBQzNCLENBQUMsQ0FBQyxVQUFVLEdBQUcsS0FBSyxDQUFDO1FBQ3pCLENBQUMsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLGVBQWUsQ0FBQyxlQUFlLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDcEQsSUFBSSxDQUFDLHdCQUF3QixDQUFDLGFBQWEsQ0FBQyxDQUFDO0lBQ2pELENBQUM7SUFDRCxlQUFlLENBQUMsRUFBdUI7UUFDbkMsSUFBSSxDQUFDLHdCQUF3QixDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ3RDLENBQUM7SUFRRCxxREFBcUQ7SUFDckQsc0JBQXNCO0lBQ3RCLCtEQUErRDtJQUUvRCxnREFBZ0Q7SUFDaEQscUJBQXFCO0lBQ3JCLGlEQUFpRDtJQUNqRCw2Q0FBNkM7SUFDN0Msc0JBQXNCO0lBQ3RCLFlBQVk7SUFDWix3RUFBd0U7SUFDeEUsa0RBQWtEO0lBQ2xELGVBQWU7SUFDZiwrQkFBK0I7SUFDL0IscUVBQXFFO0lBQ3JFLGdEQUFnRDtJQUNoRCwwREFBMEQ7SUFDMUQsNkRBQTZEO0lBQzdELGVBQWU7SUFDZixlQUFlO0lBQ2Ysa0ZBQWtGO0lBQ2xGLHNDQUFzQztJQUN0QyxRQUFRO0lBQ1IsSUFBSTtJQUNKLHVFQUF1RTtJQUN2RSxpREFBaUQ7SUFDakQsNEdBQTRHO0lBQzVHLG9DQUFvQztJQUNwQyxnQ0FBZ0M7SUFDaEMsSUFBSTtJQUNNLGdCQUFnQjtRQUN0QixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLGFBQTRCLENBQUM7UUFDbkQsSUFBSSxTQUFTLEdBQUcsS0FBSyxDQUFDLGFBQWEsQ0FBQztRQUNwQyxJQUFJLFlBQVksR0FBRyxTQUFTLEVBQUUsWUFBWSxJQUFJLENBQUMsQ0FBQztRQUNoRCxPQUFPLFNBQVMsSUFBSSxJQUFJLElBQUksQ0FBQyxZQUFZLEVBQUU7WUFDdkMsU0FBUyxHQUFHLFNBQVMsQ0FBQyxhQUFhLENBQUM7WUFDcEMsWUFBWSxHQUFHLFNBQVMsRUFBRSxZQUFZLElBQUksQ0FBQyxDQUFDO1NBQy9DO1FBQ0QsSUFBSSxDQUFDLFlBQVksR0FBRyxZQUFZLENBQUM7SUFDckMsQ0FBQztJQUNTLGNBQWMsQ0FBQyxLQUE0QjtRQUNqRCxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRTtZQUNuQixPQUFPLEtBQUssQ0FBQztTQUNoQjtRQUNELE1BQU0sRUFBRSxlQUFlLEVBQUUsa0JBQWtCLEVBQUUsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDO1FBQ2pFLElBQUksQ0FBQyxlQUFlLElBQUksQ0FBQyxrQkFBa0IsSUFBSSxDQUFDLEtBQUssRUFBRSxNQUFNLEVBQUU7WUFDM0QsT0FBTyxLQUFLLENBQUM7U0FDaEI7UUFDRCxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsZUFBZSxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3BHLE9BQU8sS0FBSyxDQUFDO0lBQ2pCLENBQUM7SUFDUyxzQkFBc0IsQ0FBQyxRQUFpQjtRQUM5QyxJQUFJLGFBQWEsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDO1FBQ3BDLElBQUksT0FBTyxHQUFHLEtBQUssQ0FBQztRQUNwQixJQUFJLFFBQVEsRUFBRTtZQUNWLGFBQWEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLHdCQUF3QixDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDLENBQUMsQ0FBQztZQUN4RSxPQUFPLEdBQUcsSUFBSSxDQUFDO1NBQ2xCO2FBQU0sSUFBSSxRQUFRLEtBQUssS0FBSyxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sRUFBRTtZQUNwRCxhQUFhLEdBQUcsYUFBYSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUM7WUFDN0QsT0FBTyxHQUFHLElBQUksQ0FBQztTQUNsQjtRQUNELElBQUksQ0FBQyxPQUFPLEVBQUU7WUFDVixPQUFPO1NBQ1Y7UUFDRCxJQUFJLENBQUMsZUFBZSxDQUFDLGVBQWUsQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUNwRCxJQUFJLENBQUMsd0JBQXdCLENBQUMsYUFBYSxDQUFDLENBQUM7SUFDakQsQ0FBQztJQUVPLHdCQUF3QixDQUFDLFNBQWtCO1FBQy9DLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxpQkFBaUIsQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUM3RCxDQUFDO0lBRVMsMkJBQTJCLENBQUMsRUFBdUI7UUFDekQsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQztRQUN0QyxNQUFNLFlBQVksR0FBRyxhQUFhLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNwRSxJQUFJLFlBQVksR0FBRyxDQUFDLENBQUMsRUFBRTtZQUNuQixhQUFhLENBQUMsWUFBWSxDQUFDLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ3pFLElBQUksQ0FBQyxlQUFlLENBQUMsZUFBZSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1lBQ3BELElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxhQUFhLENBQUMsQ0FBQztTQUNoRDtJQUNMLENBQUM7SUFDUyx1QkFBdUIsQ0FBQyxFQUF1QjtRQUNyRCxNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDO1FBQ3RDLElBQUksQ0FBQyxFQUFFLENBQUMsWUFBWSxFQUFFO1lBQ2xCLHFCQUFxQjtZQUNyQixNQUFNLFdBQVcsR0FBRyxhQUFhLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUNuRSxJQUFJLFdBQVcsR0FBRyxDQUFDLENBQUMsSUFBSSxXQUFXLEdBQUcsQ0FBQyxHQUFHLGFBQWEsQ0FBQyxNQUFNLEVBQUU7Z0JBQzVELGFBQWEsQ0FBQyxXQUFXLEdBQUcsQ0FBQyxDQUFDLENBQUMsVUFBVSxHQUFHLEtBQUssQ0FBQztnQkFDbEQsSUFBSSxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMsV0FBVyxHQUFHLENBQUMsQ0FBQyxFQUFFLFdBQVcsR0FBRyxDQUFDLENBQUMsQ0FBQzthQUNuRTtpQkFBTTtnQkFDSCxhQUFhLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUU7b0JBQ3BCLENBQUMsQ0FBQyxZQUFZLEdBQUcsU0FBUyxDQUFDO29CQUMzQixDQUFDLENBQUMsVUFBVSxHQUFHLEtBQUssQ0FBQztnQkFDekIsQ0FBQyxDQUFDLENBQUM7Z0JBQ0gsYUFBYSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsd0JBQXdCLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztnQkFDeEQsSUFBSSxDQUFDLGVBQWUsQ0FBQyxlQUFlLENBQUMsYUFBYSxDQUFDLENBQUM7Z0JBQ3BELElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxhQUFhLENBQUMsQ0FBQzthQUNoRDtZQUNELE9BQU87U0FDVjtJQUNMLENBQUM7SUFDUyx3QkFBd0IsQ0FBQyxFQUF1QjtRQUN0RCxNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDO1FBQ3RDLElBQUksQ0FBQyxFQUFFLENBQUMsWUFBWSxFQUFFO1lBQ2xCLE9BQU87U0FDVjtRQUNELE1BQU0sV0FBVyxHQUFHLGFBQWEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ25FLElBQUksV0FBVyxHQUFHLENBQUMsQ0FBQyxFQUFFO1lBQ2xCLGFBQWEsQ0FBQyxXQUFXLENBQUMsR0FBRyxFQUFFLENBQUM7U0FDbkM7UUFDRCxhQUFhLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUU7WUFDcEIsQ0FBQyxDQUFDLFlBQVksR0FBRyxTQUFTLENBQUM7WUFDM0IsQ0FBQyxDQUFDLFVBQVUsR0FBRyxLQUFLLENBQUM7UUFDekIsQ0FBQyxDQUFDLENBQUM7UUFFSCwwQkFBMEI7UUFDMUIsK0JBQStCO1FBQy9CLGFBQWE7UUFDYix5QkFBeUI7UUFDekIsOEJBQThCO1FBQzlCLEtBQUs7UUFFTCx3Q0FBd0M7UUFDeEMsd0NBQXdDO1FBQ3hDLDBEQUEwRDtRQUMxRCxpQ0FBaUM7UUFDakMsMEJBQTBCO1FBQzFCLDRDQUE0QztRQUM1QyxJQUFJO1FBQ0osZ0ZBQWdGO1FBQ2hGLDZCQUE2QjtRQUM3QixJQUFJO1FBQ0osYUFBYSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsd0JBQXdCLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztRQUN6RCxJQUFJLENBQUMsZUFBZSxDQUFDLGVBQWUsQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUNwRCxJQUFJLENBQUMsd0JBQXdCLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDN0MsSUFBSSxDQUFDLFNBQVMsQ0FDVixFQUFFLEVBQ0YsYUFBYSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQ2pELENBQUM7UUFFRiw0Q0FBNEM7SUFDaEQsQ0FBQztJQUNTLGlCQUFpQjtRQUN2QixJQUFJLENBQUMsT0FBTyxHQUFHO1lBQ1gsR0FBRyxFQUFFLEtBQUs7WUFDVixTQUFTLEVBQUUsS0FBSztZQUNoQixNQUFNLEVBQUUsS0FBSztZQUNiLElBQUksRUFBRSxLQUFLO1lBQ1gsTUFBTSxFQUFFLEtBQUs7WUFDYixLQUFLLEVBQUUsS0FBSztZQUNaLE9BQU8sRUFBRSxLQUFLO1lBQ2QsY0FBYyxFQUFFLEtBQUs7WUFDckIsSUFBSSxFQUFFLEtBQUs7U0FDZCxDQUFDO0lBQ04sQ0FBQztJQUNTLFNBQVMsQ0FBQyxVQUErQixFQUFFLE1BQU07UUFDdkQsVUFBVSxDQUFDLFNBQVMsR0FBRyxNQUFNLENBQUM7UUFDOUIsVUFBVSxDQUFDLFNBQVMsRUFBRSxPQUFPLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRTtZQUNwQyxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQztRQUNsQyxDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7SUFDUyxVQUFVLENBQUMsRUFBRTtRQUNuQixPQUFPLElBQUksQ0FBQyxjQUFjLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztJQUN6RSxDQUFDO0lBQ1MsVUFBVSxDQUFDLEVBQXVCO1FBQ3hDLE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUM1RSxDQUFDO0lBQ1MsZ0JBQWdCO1FBQ3RCLE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDMUUsQ0FBQztJQUNTLFNBQVMsQ0FBQyxFQUF1QjtRQUN2QyxPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUM1RCxDQUFDO0lBQ1Msa0JBQWtCO1FBQ3hCLElBQUksQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDL0IsQ0FBQztJQUVTLGNBQWMsQ0FBQyxLQUFjO1FBQ25DLElBQUksQ0FBQyxlQUFlLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzlDLENBQUM7SUFDUyxnQkFBZ0I7UUFDdEIsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsUUFBUSxFQUFFLFVBQVUsQ0FBQztJQUM1RSxDQUFDO0lBQ0QsMEVBQTBFO0lBQzFFLDRDQUE0QztJQUM1QyxrQ0FBa0M7SUFDbEMsNEVBQTRFO0lBRTVFLHFDQUFxQztJQUNyQyw0REFBNEQ7SUFDNUQsZ0VBQWdFO0lBQ2hFLDZEQUE2RDtJQUM3RCxtRkFBbUY7SUFDbkYsZ0JBQWdCO0lBQ2hCLFlBQVk7SUFDWixRQUFRO0lBQ1IsSUFBSTtJQUVNLGNBQWMsQ0FDcEIsTUFBZSxFQUNmLEVBQU8sQ0FBQyxxQkFBcUI7O1FBRTdCLEVBQUUsQ0FBQyxTQUFTLEVBQUUsT0FBTyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUU7WUFDNUIsS0FBSyxDQUFDLFdBQVcsR0FBRyxNQUFNLENBQUM7WUFDM0IsSUFBSSxLQUFLLENBQUMsU0FBUyxFQUFFO2dCQUNqQixJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQzthQUN0QztRQUNMLENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUVELG9FQUFvRTtJQUNwRSwrQ0FBK0M7SUFDL0MsSUFBSTtJQUNKLDZEQUE2RDtJQUM3RCx1RUFBdUU7SUFDdkUsNkJBQTZCO0lBQzdCLDZCQUE2QjtJQUM3QixpR0FBaUc7SUFDakcsMERBQTBEO0lBQzFELElBQUk7SUFDSixtRkFBbUY7SUFDbkYsNkRBQTZEO0lBQzdELDBDQUEwQztJQUMxQyw4REFBOEQ7SUFDOUQsa0JBQWtCO0lBQ2xCLHFCQUFxQjtJQUNyQixLQUFLO0lBQ0wsMkVBQTJFO0lBQzNFLDBDQUEwQztJQUMxQyxJQUFJO0lBQ00sd0JBQXdCLENBQUMsV0FBZ0M7UUFDL0QsTUFBTSxhQUFhLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxVQUFVLEVBQUUsRUFBRSxHQUFHLFdBQVcsRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztRQUNsRixJQUFJLENBQUMsZUFBZSxDQUFDLGVBQWUsQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUNwRCxJQUFJLENBQUMsd0JBQXdCLENBQUMsYUFBYSxDQUFDLENBQUM7SUFDakQsQ0FBQztJQUVTLFNBQVMsQ0FBQyxFQUF1QixFQUFFLEtBQWEsRUFBRSxRQUFRLEdBQUcsS0FBSztRQUN4RSxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsZUFBZSxJQUFJLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQztRQUMvRCxJQUFJLEVBQUUsQ0FBQyxVQUFVLElBQUksUUFBUSxFQUFFO1lBQzNCLE9BQU87U0FDVjtRQUNELElBQUksYUFBYSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUM7UUFDdkMsSUFBSSxRQUFRLEVBQUU7WUFDVixhQUFhLEdBQUcsYUFBYSxDQUFDLE1BQU0sQ0FBQztTQUN4QztRQUNELE1BQU0sT0FBTyxHQUFHLENBQUMsRUFBRSxDQUFDLFVBQVUsSUFBSSxRQUFRLENBQUM7UUFDM0MsSUFBSSxDQUFDLFlBQVksR0FBRyxLQUFLLENBQUM7UUFDMUIsSUFBSSxhQUFhLEtBQUssTUFBTSxFQUFFO1lBQzFCLE9BQU87U0FDVjtRQUNELElBQUksT0FBTyxFQUFFO1lBQ1QsSUFBSSxhQUFhLEtBQUssUUFBUSxJQUFJLE9BQU8sRUFBRTtnQkFDdkMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQzthQUM3QjtZQUNELElBQUksUUFBUSxFQUFFO2dCQUNWLElBQUksS0FBSyxLQUFLLENBQUMsQ0FBQyxFQUFFO29CQUNkLDhCQUE4QjtvQkFDOUIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFLEVBQUUsS0FBSyxDQUFDLENBQUM7aUJBQzNCO2dCQUNELE9BQU87Z0JBQ1AsOEJBQThCO2FBQ2pDO2lCQUFNO2dCQUNILElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxFQUFFLEtBQUssQ0FBQyxDQUFDO2FBQzNCO1NBQ0o7O1lBQU0sSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDckMsQ0FBQztJQUNELCtEQUErRDtJQUMvRCwrRUFBK0U7SUFDL0UsSUFBSTtJQUVNLGtDQUFrQztRQUN4Qyw2QkFBNkI7UUFDN0Isd0NBQXdDO1FBQ3hDLHFDQUFxQztRQUNyQyxrQ0FBa0M7UUFDbEMsSUFBSTtJQUNSLENBQUM7SUFDUyxjQUFjO1FBQ3BCLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1FBQzFCLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO0lBQzVCLENBQUM7SUFDUyxrQkFBa0I7UUFDeEIsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxhQUE0QixDQUFDO1FBQ2hELElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQ3BELENBQUM7SUFFUyxrQkFBa0IsQ0FBQyxVQUFVO1FBQ25DLE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsYUFBNEIsQ0FBQztRQUNoRCxJQUFJLElBQUksQ0FBQyxlQUFlLEVBQUU7WUFDdEIsSUFBSSxDQUFDLHNCQUFzQixDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUNyQyxPQUFPO1NBQ1Y7UUFDRCxJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUUsaUJBQWlCLEVBQUU7WUFDckMsT0FBTztTQUNWO1FBRUQsTUFBTSxRQUFRLEdBQUcsa0JBQWtCLENBQUMsRUFBRSxFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBQ3BELElBQUksVUFBVSxHQUFlLFNBQVMsQ0FBQztRQUN2QyxNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMscUJBQXFCLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDN0QsSUFBSSxZQUFZLEdBQUcsY0FBYyxDQUFDLE1BQU0sQ0FBQztRQUN6QyxRQUFRLFFBQVEsRUFBRTtZQUNkLEtBQUssR0FBRyxDQUFDO1lBQ1QsS0FBSyxJQUFJO2dCQUNMLFVBQVUsR0FBRyxTQUFTLENBQUM7Z0JBQ3ZCLE1BQU07WUFDVixLQUFLLEdBQUc7Z0JBQ0osVUFBVSxHQUFHLFFBQVEsQ0FBQztnQkFDdEIsWUFBWSxHQUFHLENBQUMsQ0FBQztnQkFDakIsTUFBTTtZQUNWLEtBQUssR0FBRztnQkFDSixVQUFVLEdBQUcsUUFBUSxDQUFDO2dCQUN0QixZQUFZLEdBQUcsQ0FBQyxDQUFDO2dCQUNqQixNQUFNO1NBQ2I7UUFDRCxJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ3hDLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxRQUFRLEVBQUUsRUFBRSxjQUFjLElBQUksRUFBRSxDQUFDO1FBQzVFLElBQUksV0FBVyxHQUFHLENBQUMsQ0FBQztRQUNwQixJQUFJLFdBQVcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxJQUFJLElBQUksQ0FBQyxjQUFjLEdBQUcsQ0FBQyxFQUFFO1lBQ25ELFlBQVksR0FBRyxjQUFjLENBQUMsTUFBTSxDQUFDO1lBQ3JDLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFHLEVBQUUsS0FBSyxFQUFFLEVBQUU7Z0JBQy9CLElBQUksV0FBVyxHQUFHLEdBQUcsQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLGNBQWMsSUFBSSxZQUFZLEtBQUssY0FBYyxDQUFDLE1BQU0sRUFBRTtvQkFDekYsWUFBWSxHQUFHLEtBQUssQ0FBQztpQkFDeEI7Z0JBQ0QsV0FBVyxJQUFJLEdBQUcsQ0FBQyxLQUFLLENBQUM7WUFDN0IsQ0FBQyxDQUFDLENBQUM7U0FDTjtRQUNELElBQUksY0FBYyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7WUFDM0IsSUFBSSxDQUFDLHNCQUFzQixDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLFlBQVksRUFBRSxjQUFjLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztTQUMvRjtJQUNMLENBQUM7SUFFUyxhQUFhLENBQUMsSUFBSSxFQUFFLE1BQWtCO1FBQzVDLElBQUksU0FBUyxHQUE4QixJQUFJLENBQUM7UUFDaEQsUUFBUSxJQUFJLEVBQUU7WUFDVixLQUFLLFNBQVM7Z0JBQ1YsU0FBUyxHQUFHLDBCQUEwQixDQUFDO2dCQUN2QyxNQUFNO1lBQ1YsS0FBSyxNQUFNO2dCQUNQLFNBQVMsR0FBRyx3QkFBd0IsQ0FBQztnQkFDckMsTUFBTTtZQUNWLEtBQUssU0FBUztnQkFDVixTQUFTLEdBQUcsMkJBQTJCLENBQUM7Z0JBQ3hDLE1BQU07U0FDYjtRQUNELE1BQU0sTUFBTSxHQUFpQjtZQUN6QixHQUFHLElBQUksQ0FBQyxZQUFZO1lBQ3BCLElBQUksRUFBRSxFQUFFLE9BQU8sRUFBRSxJQUFJLENBQUMsT0FBTyxFQUFFO1lBQy9CLFVBQVUsRUFBRSxNQUFNLEtBQUssUUFBUTtZQUMvQixRQUFRLEVBQUUsTUFBTSxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVE7WUFDbkUsU0FBUyxFQUFFLE1BQU0sS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxTQUFTO1NBQ3hFLENBQUM7UUFDRixJQUFJLFNBQVMsS0FBSyxJQUFJLEVBQUU7WUFDcEIsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1lBQzlELFNBQVMsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRTtnQkFDMUUsSUFBSSxPQUFPLEVBQUU7b0JBQ1QsTUFBTSxhQUFhLEdBQUcsSUFBSSxLQUFLLE1BQU0sSUFBSSxJQUFJLEtBQUssU0FBUyxDQUFDO29CQUM1RCxJQUFJLENBQUMsaUJBQWlCLENBQUMsT0FBTyxFQUFFLGFBQWEsQ0FBQyxDQUFDO29CQUMvQyxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLFdBQVcsQ0FBQztvQkFDMUQsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7aUJBQzdCO1lBQ0wsQ0FBQyxDQUFDLENBQUM7U0FDTjtJQUNMLENBQUM7SUFDUyxrQkFBa0IsQ0FBQyxjQUFnQztRQUN6RCxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDO1FBQ2xDLE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsOEJBQThCLENBQ3JFLFNBQVMsRUFDVCxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUNyQyxDQUFDO1FBQ0YsTUFBTSxNQUFNLEdBQUc7WUFDWCxHQUFHLElBQUksQ0FBQyxZQUFZO1lBQ3BCLElBQUksRUFBRTtnQkFDRixhQUFhO2dCQUNiLFNBQVM7Z0JBQ1Qsa0JBQWtCLEVBQUUsY0FBYyxDQUFDLElBQUk7Z0JBQ3ZDLE9BQU8sRUFBRSxJQUFJLENBQUMsT0FBTzthQUN4QjtTQUNKLENBQUM7UUFDRixNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQywwQkFBMEIsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUMvRSxTQUFTLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUU7WUFDMUUsSUFBSSxPQUFPLEVBQUU7YUFDWjtRQUNMLENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUNTLGNBQWMsQ0FBQyxJQUFTLEVBQUUsYUFBcUIsRUFBRSxTQUFTLEdBQUcsS0FBSztRQUN4RSxNQUFNLFFBQVEsR0FBRztZQUNiLElBQUksRUFBRSxJQUFJO1lBQ1YsYUFBYSxFQUFFLGFBQWE7WUFDNUIsU0FBUyxFQUFFLFNBQVM7U0FDdkIsQ0FBQztRQUNGLE1BQU0sUUFBUSxHQUFHLGVBQWUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDL0MsTUFBTSxrQkFBa0IsR0FBRyxRQUFRLENBQUMsZUFBZSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxJQUFJLENBQUMsQ0FBQztRQUN0RixJQUFJLGtCQUFrQixHQUFHLENBQUMsQ0FBQyxFQUFFO1lBQ3pCLFFBQVEsQ0FBQyxlQUFlLENBQUMsa0JBQWtCLENBQUMsR0FBRyxRQUFRLENBQUM7U0FDM0Q7YUFBTTtZQUNILFFBQVEsQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1NBQzNDO1FBQ0QsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsQ0FBQztJQUMzQyxDQUFDOztxSEEzdEJRLHdCQUF3QixzUEE4RXJCLFFBQVE7eUdBOUVYLHdCQUF3QixnUUFJdEIsY0FBYyxtRkFDZCxnQkFBZ0Isc0pBRWIsc0JBQXNCLHVFQVYxQixFQUFFOzJGQUdILHdCQUF3QjtrQkFMcEMsU0FBUzttQkFBQztvQkFDUCxRQUFRLEVBQUUsd0JBQXdCO29CQUNsQyxRQUFRLEVBQUUsRUFBRTtvQkFDWixlQUFlLEVBQUUsdUJBQXVCLENBQUMsTUFBTTtpQkFDbEQ7OzBCQStFUSxNQUFNOzJCQUFDLFFBQVE7OzBCQUNmLFFBQVE7OzBCQUFJLElBQUk7NENBM0VNLGNBQWM7c0JBQXhDLFNBQVM7dUJBQUMsY0FBYztnQkFDSSxnQkFBZ0I7c0JBQTVDLFNBQVM7dUJBQUMsZ0JBQWdCO2dCQUNBLFlBQVk7c0JBQXRDLFlBQVk7dUJBQUMsV0FBVztnQkFFekIsaUJBQWlCO3NCQURoQixZQUFZO3VCQUFDLHNCQUFzQjtnQkFnVTNCLG9CQUFvQjtzQkFBNUIsS0FBSztnQkFFRyxlQUFlO3NCQUF2QixLQUFLO2dCQUVHLHVCQUF1QjtzQkFBL0IsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XHJcbiAgICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcclxuICAgIENvbXBvbmVudCxcclxuICAgIEVsZW1lbnRSZWYsXHJcbiAgICBJbmplY3QsXHJcbiAgICBJbnB1dCxcclxuICAgIE9uRGVzdHJveSxcclxuICAgIE9uSW5pdCxcclxuICAgIE9wdGlvbmFsLFxyXG4gICAgUXVlcnlMaXN0LFxyXG4gICAgUmVuZGVyZXIyLFxyXG4gICAgU2VsZixcclxuICAgIFZpZXdDaGlsZCxcclxuICAgIFZpZXdDaGlsZHJlblxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBDb21wb25lbnRUeXBlLCBPdmVybGF5LCBTY3JvbGxTdHJhdGVneSB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9vdmVybGF5JztcclxuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBjb21iaW5lTGF0ZXN0LCBPYnNlcnZhYmxlLCBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IGRlYm91bmNlVGltZSwgZGlzdGluY3RVbnRpbENoYW5nZWQsIGZpbHRlciwgbWFwLCB0YWtlVW50aWwsIHRhcCwgd2l0aExhdGVzdEZyb20gfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcbmltcG9ydCB7XHJcbiAgICBDb250ZW50RGVuc2l0eSxcclxuICAgIENvbnRlbnREZW5zaXR5U2VydmljZSxcclxuICAgIERpYWxvZ0NvbmZpZyxcclxuICAgIERpYWxvZ1NlcnZpY2UsXHJcbiAgICBUYWJsZUNvbXBvbmVudCxcclxuICAgIFRvb2xiYXJDb21wb25lbnRcclxufSBmcm9tICdAZnVuZGFtZW50YWwtbmd4L2NvcmUnO1xyXG5pbXBvcnQgeyBTZWxlY3Rpb25Nb2RlLCBUYWJsZURhdGFTb3VyY2UgfSBmcm9tICdAZnVuZGFtZW50YWwtbmd4L3BsYXRmb3JtJztcclxuXHJcbmltcG9ydCB7XHJcbiAgICBCYXJzYUFwaSxcclxuICAgIGNvbHVtbnNSZXNpemVkRXZlbnRBcmdzLFxyXG4gICAgRGVmYXVsdENvbW1hbmRzQWNjZXNzLFxyXG4gICAgRGV2aWNlU2l6ZSxcclxuICAgIEZvcm1QYW5lbFNlcnZpY2UsXHJcbiAgICBHZXRBbGxDb2x1bW5zU29ydGVkLFxyXG4gICAgZ2V0Q29udHJvbFNpemVNb2RlLFxyXG4gICAgZ2V0R3JpZFNldHRpbmdzLFxyXG4gICAgTGF5b3V0U2VydmljZSxcclxuICAgIE1ldGFvYmplY3REYXRhTW9kZWwsXHJcbiAgICBQb3J0YWxTZXJ2aWNlLFxyXG4gICAgUmVwb3J0QmFzZUNvbXBvbmVudCxcclxuICAgIFJlcG9ydFZpZXdDb2x1bW4sXHJcbiAgICBVaVJlcG9ydFZpZXdCYXNlU2V0dGluZyxcclxuICAgIFVsdk1haW5TZXJ2aWNlXHJcbn0gZnJvbSAnYmFyc2Etbm92aW4tcmF5LWNvcmUnO1xyXG5pbXBvcnQgeyBMYXlvdXRDb250cm9sQ29tcG9uZW50IH0gZnJvbSAnLi9sYXlvdXQtY29udHJvbC9sYXlvdXQtY29udHJvbC5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBHcmlkTW9EYXRhTGlzdCB9IGZyb20gJy4vbW9kZWxzJztcclxuaW1wb3J0IHsgVWx2Q29sdW1uU2V0dGluZ3NDb21wb25lbnQgfSBmcm9tICcuL3Vsdi1jb2x1bW4tc2V0dGluZ3MvdWx2LWNvbHVtbi1zZXR0aW5ncy5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBVbHZTb3J0U2V0dGluZ3NDb21wb25lbnQgfSBmcm9tICcuL3Vsdi1zb3J0LXNldHRpbmdzL3Vsdi1zb3J0LXNldHRpbmdzLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IFVsdkdyb3VwYnlTZXR0aW5nc0NvbXBvbmVudCB9IGZyb20gJy4vdWx2LWdyb3VwYnktc2V0dGluZ3MvdWx2LWdyb3VwYnktc2V0dGluZ3MuY29tcG9uZW50JztcclxuaW1wb3J0IHsgVWx2RmlsdGVyU2V0dGluZ3NDb21wb25lbnQgfSBmcm9tICcuL3Vsdi1maWx0ZXItc2V0dGluZ3MvdWx2LWZpbHRlci1zZXR0aW5ncy5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBET0NVTUVOVCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICAgIHNlbGVjdG9yOiAnYnN1LXNhcC11aS1yZXBvcnQtYmFzZScsXHJcbiAgICB0ZW1wbGF0ZTogJycsXHJcbiAgICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaFxyXG59KVxyXG5leHBvcnQgY2xhc3MgU2FwVWlSZXBvcnRCYXNlQ29tcG9uZW50PFQgZXh0ZW5kcyBVaVJlcG9ydFZpZXdCYXNlU2V0dGluZz5cclxuICAgIGV4dGVuZHMgUmVwb3J0QmFzZUNvbXBvbmVudFxyXG4gICAgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveVxyXG57XHJcbiAgICBAVmlld0NoaWxkKFRhYmxlQ29tcG9uZW50KSB0YWJsZUNvbXBvbmVudDogVGFibGVDb21wb25lbnQ7XHJcbiAgICBAVmlld0NoaWxkKFRvb2xiYXJDb21wb25lbnQpIHRvb2xiYXJDb21wb25lbnQ6IFRvb2xiYXJDb21wb25lbnQ7XHJcbiAgICBAVmlld0NoaWxkcmVuKCd0YWJsZVJvd3MnKSB0YWJsZVJvd3NSZWY6IFF1ZXJ5TGlzdDxFbGVtZW50UmVmPjtcclxuICAgIEBWaWV3Q2hpbGRyZW4oTGF5b3V0Q29udHJvbENvbXBvbmVudClcclxuICAgIGxheW91dENvbnRyb2xzUmVmOiBRdWVyeUxpc3Q8TGF5b3V0Q29udHJvbENvbXBvbmVudD47XHJcbiAgICB1c2VMYXlvdXRJdGVtVGV4dEZvckNvbnRyb2wgPSBmYWxzZTtcclxuICAgIGhhc1NlbGVjdGVkJDogT2JzZXJ2YWJsZTxib29sZWFuPjtcclxuICAgIHNob3dPa0NhbmNlbEJ1dHRvbnM6IGFueTtcclxuICAgIHBhcmVudEhlaWdodCA9IDA7XHJcbiAgICBkaWFsb2dDb25maWc6IERpYWxvZ0NvbmZpZyA9IHtcclxuICAgICAgICByZXNwb25zaXZlUGFkZGluZzogdHJ1ZSxcclxuICAgICAgICB2ZXJ0aWNhbFBhZGRpbmc6IHRydWUsXHJcbiAgICAgICAgbWluV2lkdGg6ICc0MHJlbScsXHJcbiAgICAgICAgbWluSGVpZ2h0OiAnOTB2aCcsXHJcbiAgICAgICAgbWF4V2lkdGg6ICcxMDB2dycsXHJcbiAgICAgICAgbWF4SGVpZ2h0OiAnMTAwdmgnLFxyXG4gICAgICAgIHJlc2l6YWJsZTogdHJ1ZVxyXG4gICAgfTtcclxuXHJcbiAgICBzZWxlY3RlZFJvd3NOdW1iZXIgPSB7fTtcclxuICAgIHNlbGVjdEFsbCA9IGZhbHNlO1xyXG4gICAgc2VsZWN0aW9uQWRhcHRlckhhbmRsZXI6IHtcclxuICAgICAgICBzY29wZTogYW55O1xyXG4gICAgICAgIHJvd3NlbGVjdDogYW55O1xyXG4gICAgICAgIHJvd2Rlc2VsZWN0OiBhbnk7XHJcbiAgICAgICAgYmVmb3Jlcm93c2VsZWN0OiBhbnk7XHJcbiAgICB9O1xyXG4gICAgbmF2aWdhdGlvbkFycm93JDogT2JzZXJ2YWJsZTxzdHJpbmc+O1xyXG4gICAgY3VzdG9tUm93SGVpZ2h0OiBhbnk7XHJcbiAgICByb3dDbGljayA9IHRydWU7XHJcbiAgICBjZWxsQ2xpY2sgPSBmYWxzZTtcclxuICAgIGRldmljZU5hbWUkOiBPYnNlcnZhYmxlPERldmljZVNpemU+O1xyXG4gICAgbW9iaWxlT3JUYWJsZXQkOiBPYnNlcnZhYmxlPGJvb2xlYW4+O1xyXG5cclxuICAgIHNlY29uZGFyeUNvbHVtbnNTb3VyY2UgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PFJlcG9ydFZpZXdDb2x1bW5bXT4oW10pO1xyXG4gICAgc2Vjb25kYXJ5Q29sdW1ucyQgPSB0aGlzLnNlY29uZGFyeUNvbHVtbnNTb3VyY2UuYXNPYnNlcnZhYmxlKCk7XHJcbiAgICBwb3BpbiQ6IE9ic2VydmFibGU8Ym9vbGVhbj47XHJcbiAgICBjb250ZW50RGVuc2l0eSQ6IE9ic2VydmFibGU8Q29udGVudERlbnNpdHk+O1xyXG5cclxuICAgIHJvd0FjdGl2YWJsZSA9IHRydWU7XHJcbiAgICBvcGVuT3ZlcmZsb3dDb21tYW5kczogYm9vbGVhbltdID0gW107XHJcbiAgICBjb250YWluZXJXaWR0aFNvdXJjZSQgPSBuZXcgU3ViamVjdDxudW1iZXI+KCk7XHJcbiAgICBjbG9zZVNjcm9sbFN0cmF0ZWd5OiBTY3JvbGxTdHJhdGVneTtcclxuICAgIHJvd0hvdmVyYWJsZTogYm9vbGVhbjtcclxuICAgIHNvdXJjZTogVGFibGVEYXRhU291cmNlPE1ldGFvYmplY3REYXRhTW9kZWw+O1xyXG4gICAgc2VsZWN0aW9uTW9kZTogU2VsZWN0aW9uTW9kZTtcclxuICAgIGNvbHVtbnNDb3VudCQ6IE9ic2VydmFibGU8bnVtYmVyPjtcclxuICAgIHNlY29uZGFyeUNvbHVtbnNDb3VudCQ6IE9ic2VydmFibGU8bnVtYmVyPjtcclxuICAgIGNvbnRhaW5lcldpZHRoJDogT2JzZXJ2YWJsZTxudW1iZXI+O1xyXG4gICAgY29sdW1ucyQ6IE9ic2VydmFibGU8UmVwb3J0Vmlld0NvbHVtbltdPjtcclxuICAgIGdyaWREYXRhU291cmNlOiBHcmlkTW9EYXRhTGlzdDtcclxuICAgIHNpbmdsZVNlbGVjdGlvbiA9IFNlbGVjdGlvbk1vZGUuU0lOR0xFO1xyXG4gICAgbXVsdGlwbGVTZWxlY3Rpb24gPSBTZWxlY3Rpb25Nb2RlLk1VTFRJUExFO1xyXG4gICAgYWxsb3dJbmxpbmVFZGl0JDogT2JzZXJ2YWJsZTxib29sZWFuPjtcclxuICAgIGlubGluZUVkaXRNb2RlJDogT2JzZXJ2YWJsZTxib29sZWFuPjtcclxuICAgIG9ubHlJbmxpbmVFZGl0JDogT2JzZXJ2YWJsZTxib29sZWFuPjtcclxuICAgIGZvcm1QYW5lbEN0cmxyOiBhbnk7XHJcbiAgICBsYXlvdXQkOiBPYnNlcnZhYmxlPGFueT47XHJcbiAgICBydGwkOiBPYnNlcnZhYmxlPGJvb2xlYW4+O1xyXG4gICAgcmVwb3J0SWQ6IHN0cmluZztcclxuICAgIHZpZXdTZXR0aW5nOiBUO1xyXG5cclxuICAgIHByb3RlY3RlZCBfZGV2aWNlTmFtZVNvdXJjZSA9IG5ldyBCZWhhdmlvclN1YmplY3Q8RGV2aWNlU2l6ZT4oJ2Rlc2t0b3AnKTtcclxuICAgIHByaXZhdGUgX29sZENvbnRhaW5lcjogYW55O1xyXG4gICAgcHJpdmF0ZSBfb3Blbk9uQ2xpY2s6IGJvb2xlYW47XHJcbiAgICBjb25zdHJ1Y3RvcihcclxuICAgICAgICBwdWJsaWMgZWw6IEVsZW1lbnRSZWYsXHJcbiAgICAgICAgcHJvdGVjdGVkIF9vdmVybGF5OiBPdmVybGF5LFxyXG4gICAgICAgIHByb3RlY3RlZCBfY29udGVudERlbnNpdHlTZXJ2aWNlOiBDb250ZW50RGVuc2l0eVNlcnZpY2UsXHJcbiAgICAgICAgcHJvdGVjdGVkIF9wb3J0YWxTZXJ2aWNlOiBQb3J0YWxTZXJ2aWNlLFxyXG4gICAgICAgIHByb3RlY3RlZCBfZGlhbG9nU2VydmljZTogRGlhbG9nU2VydmljZSxcclxuICAgICAgICBwcm90ZWN0ZWQgX3Vsdk1haW5TZXJ2aWNlOiBVbHZNYWluU2VydmljZSxcclxuICAgICAgICBwcm90ZWN0ZWQgX2xheW91dFNlcnZpY2U6IExheW91dFNlcnZpY2UsXHJcbiAgICAgICAgcHJvdGVjdGVkIF9yZW5kZXJlcjogUmVuZGVyZXIyLFxyXG4gICAgICAgIEBJbmplY3QoRE9DVU1FTlQpIHByb3RlY3RlZCBkb2N1bWVudCxcclxuICAgICAgICBAT3B0aW9uYWwoKSBAU2VsZigpIHByb3RlY3RlZCBfZm9ybXBhbmVsU2VydmljZTogRm9ybVBhbmVsU2VydmljZVxyXG4gICAgKSB7XHJcbiAgICAgICAgc3VwZXIoX3BvcnRhbFNlcnZpY2UsIF91bHZNYWluU2VydmljZSk7XHJcbiAgICAgICAgdGhpcy5jb250YWluZXJXaWR0aCQgPSB0aGlzLmNvbnRhaW5lcldpZHRoU291cmNlJFxyXG4gICAgICAgICAgICAuYXNPYnNlcnZhYmxlKClcclxuICAgICAgICAgICAgLnBpcGUoZGVib3VuY2VUaW1lKDIwMCksIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCkpO1xyXG4gICAgICAgIHRoaXMuZGV2aWNlTmFtZSQgPSB0aGlzLl9kZXZpY2VOYW1lU291cmNlLmFzT2JzZXJ2YWJsZSgpO1xyXG4gICAgICAgIHRoaXMubW9iaWxlT3JUYWJsZXQkID0gdGhpcy5kZXZpY2VOYW1lJC5waXBlKG1hcCgoZGV2aWNlKSA9PiBkZXZpY2UgPT09ICdtb2JpbGUnIHx8IGRldmljZSA9PT0gJ3RhYmxldCcpKTtcclxuICAgICAgICB0aGlzLl9vbGRDb250YWluZXIgPSBCYXJzYUFwaS5VbC5BcHBsaWNhdGlvbkN0cmxyLkN1cnJlbnRTeXN0ZW1BZGFwdGVyO1xyXG4gICAgICAgIHRoaXMuY2xvc2VTY3JvbGxTdHJhdGVneSA9IHRoaXMuX292ZXJsYXkuc2Nyb2xsU3RyYXRlZ2llcy5jbG9zZSgpO1xyXG4gICAgICAgIHRoaXMuY29udGVudERlbnNpdHkkID0gdGhpcy5fY29udGVudERlbnNpdHlTZXJ2aWNlLmNvbnRlbnREZW5zaXR5O1xyXG4gICAgICAgIHRoaXMuc2Vjb25kYXJ5Q29sdW1uc0NvdW50JCA9IHRoaXMuc2Vjb25kYXJ5Q29sdW1ucyQucGlwZShtYXAoKGNvbHVtbnMpID0+IGNvbHVtbnMubGVuZ3RoKSk7XHJcbiAgICAgICAgdGhpcy5jb2x1bW5zQ291bnQkID0gdGhpcy52aXNpYmxlQ29sdW1ucyQucGlwZShcclxuICAgICAgICAgICAgbWFwKChjb2x1bW5zKSA9PiBjb2x1bW5zLmxlbmd0aCksXHJcbiAgICAgICAgICAgIG1hcCgoY291bnQ6IG51bWJlcikgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgYWNjZXNzID0gQmFyc2FBcGkuQ29tbW9uLlV0aWwuVHJ5R2V0VmFsdWUodGhpcy5jb250ZXh0LCAnU2V0dGluZy5FeHRyYS5EZWZhdWx0Q29tbWFuZHNBY2Nlc3MnKTtcclxuICAgICAgICAgICAgICAgIGlmIChhY2Nlc3M/LlZpZXcpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb3VudCsrO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGNvdW50O1xyXG4gICAgICAgICAgICB9KSxcclxuICAgICAgICAgICAgbWFwKChjb3VudDogbnVtYmVyKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5zZWxlY3Rpb25Nb2RlICE9PSAnbm9uZScpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb3VudCsrO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGNvdW50O1xyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IF90eXBlRGVmSWQoKTogc3RyaW5nIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5jb250ZXh0LlNldHRpbmcuRXh0cmEuUmVwb3J0LlR5cGVEZWZJZDtcclxuICAgIH1cclxuICAgIGdldCBfaW5saW5lRWRpdE1vZGUoKTogYm9vbGVhbiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3Vsdk1haW5TZXJ2aWNlLmdldFZhbHVlSW5saW5lRWRpdCgpO1xyXG4gICAgfVxyXG4gICAgZ2V0IF9hbGxvd0lubGluZUVkaXQoKTogYm9vbGVhbiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3Vsdk1haW5TZXJ2aWNlLmdldEFsbG93SW5saW5lRWRpdCgpO1xyXG4gICAgfVxyXG4gICAgZ2V0IF9hY2Nlc3MoKTogRGVmYXVsdENvbW1hbmRzQWNjZXNzIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5jb250ZXh0LlNldHRpbmc/LkV4dHJhPy5EZWZhdWx0Q29tbWFuZHNBY2Nlc3M7XHJcbiAgICB9XHJcbiAgICBzZXQgX2FjY2Vzcyh2YWw6IERlZmF1bHRDb21tYW5kc0FjY2Vzcykge1xyXG4gICAgICAgIGlmICh0aGlzLmNvbnRleHQuU2V0dGluZy5FeHRyYSkge1xyXG4gICAgICAgICAgICB0aGlzLmNvbnRleHQuU2V0dGluZy5FeHRyYS5EZWZhdWx0Q29tbWFuZHNBY2Nlc3MgPSB2YWw7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5jb250ZXh0LlNldHRpbmcuRXh0cmEgPSB7IERlZmF1bHRDb21tYW5kc0FjY2VzczogdmFsIH07XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5fc2V0UGFyZW50SGVpZ2h0KCk7XHJcbiAgICAgICAgdGhpcy5fcmVhZFZpZXdTZXR0aW5nKCk7XHJcbiAgICAgICAgaWYgKCF0aGlzLl9hY2Nlc3MpIHtcclxuICAgICAgICAgICAgdGhpcy5fc2V0RGVmYXVsdEFjY2VzcygpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBzdXBlci5uZ09uSW5pdCgpO1xyXG4gICAgICAgIHRoaXMuc2hvd09rQ2FuY2VsQnV0dG9ucyA9IHRoaXMuY29udGV4dC5TaG93T2tDYW5jZWxCdXR0b25zO1xyXG4gICAgICAgIHRoaXMuX3Vsdk1haW5TZXJ2aWNlLmxheW91dEluZm8kLnN1YnNjcmliZSgobGF5b3V0SW5mbykgPT4ge1xyXG4gICAgICAgICAgICBpZiAobGF5b3V0SW5mbyAmJiBsYXlvdXRJbmZvLlVzZUxheW91dEl0ZW1UZXh0Rm9yQ29udHJvbCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy51c2VMYXlvdXRJdGVtVGV4dEZvckNvbnRyb2wgPSB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgY29uc3QgdGl0bGUgPSB0aGlzLnZpZXdTZXR0aW5nPy5UaXRsZTtcclxuICAgICAgICBpZiAodGl0bGUpIHtcclxuICAgICAgICAgICAgdGhpcy5fdWx2TWFpblNlcnZpY2Uuc2V0VGl0bGUodGl0bGUpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLl91bHZNYWluU2VydmljZS5yZXBvcnRJZCQuc3Vic2NyaWJlKChyZXBvcnRJZCkgPT4gKHRoaXMucmVwb3J0SWQgPSByZXBvcnRJZCkpO1xyXG4gICAgICAgIHRoaXMuX2xheW91dFNlcnZpY2Uuc2V0UmVuZGVyZWQodHJ1ZSk7XHJcbiAgICAgICAgdGhpcy5zZWxlY3Rpb25Nb2RlID0gdGhpcy5jb250ZXh0LlZpZXdTZXR0aW5nPy5Jc0NoZWNrTGlzdCA/IHRoaXMubXVsdGlwbGVTZWxlY3Rpb24gOiB0aGlzLnNpbmdsZVNlbGVjdGlvbjtcclxuICAgICAgICB0aGlzLl9vcGVuT25DbGljayA9IHRoaXMudmlld1NldHRpbmc/Lk9wZW5PbkNsaWNrO1xyXG4gICAgICAgIHRoaXMuY3VzdG9tUm93SGVpZ2h0ID0gQmFyc2FBcGkuQ29tbW9uLlV0aWwuVHJ5R2V0VmFsdWUoXHJcbiAgICAgICAgICAgIHRoaXMuY29udGV4dC5TZXR0aW5nLFxyXG4gICAgICAgICAgICAnRXh0cmEuRXh0cmFKc29uUHJvcFJlcG9ydC5HcmlkUm93SGVpZ2h0J1xyXG4gICAgICAgICk7XHJcbiAgICAgICAgdGhpcy5ydGwkID0gdGhpcy5fcG9ydGFsU2VydmljZS5ydGwkO1xyXG4gICAgICAgIHRoaXMubmF2aWdhdGlvbkFycm93JCA9IHRoaXMuX3BvcnRhbFNlcnZpY2UucnRsJC5waXBlKFxyXG4gICAgICAgICAgICBtYXAoKGlzUnRsKSA9PiAoaXNSdGwgPyAnbmF2aWdhdGlvbi1sZWZ0LWFycm93JyA6ICduYXZpZ2F0aW9uLXJpZ2h0LWFycm93JykpXHJcbiAgICAgICAgKTtcclxuICAgICAgICB0aGlzLmFsbG93SW5saW5lRWRpdCQgPSB0aGlzLl91bHZNYWluU2VydmljZS5hbGxvd0lubGluZUVkaXQkO1xyXG4gICAgICAgIHRoaXMuaW5saW5lRWRpdE1vZGUkID0gdGhpcy5fdWx2TWFpblNlcnZpY2UuaW5saW5lRWRpdE1vZGUkO1xyXG4gICAgICAgIHRoaXMub25seUlubGluZUVkaXQkID0gdGhpcy5fdWx2TWFpblNlcnZpY2Uub25seUlubGluZUVkaXQkO1xyXG4gICAgICAgIHRoaXMuaGFzU2VsZWN0ZWQkID0gdGhpcy5tb0RhdGFMaXN0JC5waXBlKG1hcCgobW9MaXN0KSA9PiBtb0xpc3Quc29tZSgoYykgPT4gYy4kSXNDaGVja2VkKSkpO1xyXG4gICAgICAgIHRoaXMubW9EYXRhTGlzdCQgPSB0aGlzLm1vRGF0YUxpc3QkLnBpcGUobWFwKChpdGVtcykgPT4gdGhpcy5fbWFwQ2FydGFibGVNbyhpdGVtcykpKTtcclxuICAgICAgICBjb25zdCBncmlkRGF0YVNvdXJjZSA9IG5ldyBHcmlkTW9EYXRhTGlzdChcclxuICAgICAgICAgICAgdGhpcy5tb0RhdGFMaXN0JCxcclxuICAgICAgICAgICAgdGhpcy5ncmlkU2V0dGluZyQsXHJcbiAgICAgICAgICAgIHRoaXMudmlzaWJsZUNvbHVtbnMkLFxyXG4gICAgICAgICAgICB0aGlzLnNlYXJjaFRlcm0kXHJcbiAgICAgICAgKTtcclxuXHJcbiAgICAgICAgdGhpcy5ncmlkRGF0YVNvdXJjZSA9IGdyaWREYXRhU291cmNlO1xyXG4gICAgICAgIHRoaXMuY29sdW1ucyQgPSBjb21iaW5lTGF0ZXN0KFt0aGlzLmdyaWRTZXR0aW5nJCwgdGhpcy5zZWNvbmRhcnlDb2x1bW5zJF0pLnBpcGUoXHJcbiAgICAgICAgICAgIG1hcCgoWywgc2Vjb25kYXJ5Q29sdW1uc10pID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHNlY29uZGFyaWVzID0gc2Vjb25kYXJ5Q29sdW1ucy5tYXAoKGMpID0+IGMuTmFtZSk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBjb2x1bW5zID0gR2V0QWxsQ29sdW1uc1NvcnRlZCh0aGlzLmNvbnRleHQpLmZpbHRlcigoYykgPT4gIWMuSGlkZGVuKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBjb2x1bW5zLmZpbHRlcigoYykgPT4gc2Vjb25kYXJpZXMuaW5kZXhPZihjLk5hbWUpID09PSAtMSk7XHJcbiAgICAgICAgICAgIH0pLFxyXG4gICAgICAgICAgICB0YXAoKGNvbHVtbnMpID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbHVtbnMuZm9yRWFjaCgoYzogUmVwb3J0Vmlld0NvbHVtbikgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGMuJENTU0NsYXNzTmFtZSA9ICdjb2x1bW5fX0ZpZWxkVHlwZScgKyBjLkZpZWxkVHlwZUlkO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChjLkZpZWxkVHlwZUlkID09PSAzOCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjLiRXaWR0aCA9ICdhdXRvJztcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGMuRXh0cmE/Lkljb25EaXNwbGF5VHlwZUVudW0gPT09ICdJbWFnZScpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYy4kV2lkdGggPSAnMzhweCc7XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYy4kV2lkdGggPSAhQmFyc2FBcGkuTG9naW5Gb3JtRGF0YS5Jc1VzZXJMb2dnZWRJbiAvLyBpZiB1c2VyIGlzIGFub255bW91cyBhbGwgY29sdW1uIHdpZHRoIGVxdWFscyB0byAxMDAlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA/ICcxMDAlJ1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBjLldpZHRoID4gMFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBjLldpZHRoICsgJ3B4J1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAnMTAwJSc7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgKTtcclxuICAgICAgICB0aGlzLl91bHZNYWluU2VydmljZS5pbmxpbmVFZGl0TW9kZSRcclxuICAgICAgICAgICAgLnBpcGUoXHJcbiAgICAgICAgICAgICAgICB3aXRoTGF0ZXN0RnJvbSh0aGlzLmhhc1NlbGVjdGVkJCksXHJcbiAgICAgICAgICAgICAgICBmaWx0ZXIoKFtfLF9fXSkgPT4gdGhpcy5fYWNjZXNzLkFkZCAhPT0gZmFsc2UpXHJcbiAgICAgICAgICAgIClcclxuICAgICAgICAgICAgLnN1YnNjcmliZSgoW2VkaXRNb2RlXSkgPT4gdGhpcy5faW5saW5lRWRpdE1vZGVDaGFuZ2VkKGVkaXRNb2RlKSk7XHJcbiAgICAgICAgdGhpcy5fc2V0Q29udGFpbmVyV2lkdGgoKTtcclxuICAgIH1cclxuXHJcbiAgICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcclxuICAgICAgICBzdXBlci5uZ09uRGVzdHJveSgpO1xyXG4gICAgICAgIGlmICh0aGlzLl9mb3JtcGFuZWxTZXJ2aWNlKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2Zvcm1wYW5lbFNlcnZpY2UuZGVzdHJveSgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBvbkVkaXRNb2RlKCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuX3NldElubGluZUVkaXQoIXRoaXMuX2lubGluZUVkaXRNb2RlKTtcclxuICAgIH1cclxuICAgIG9uU2VsZWN0TmV4dElubGluZVJlY29yZChtbyk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuX3NlbGVjdE5leHRJbmxpbmVSZWNvcmQobW8pO1xyXG4gICAgfVxyXG5cclxuICAgIG9uRWRpdEZvcm1QYW5lbFNhdmUobW86IE1ldGFvYmplY3REYXRhTW9kZWwpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLl9pbmxpbmVFZGl0U2F2ZUZvcm1QYW5lbChtbyk7XHJcbiAgICB9XHJcblxyXG4gICAgb25FZGl0Rm9ybVBhbmVsQ2FuY2VsKCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuX2luaWxpbmVFZGl0Q2FuY2VsKCk7XHJcbiAgICB9XHJcbiAgICBvbkVkaXRGb3JtUGFuZWxWYWx1ZUNoYW5nZShtbzogTWV0YW9iamVjdERhdGFNb2RlbCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuX2lubGluZUZvcm1QYW5lbFZhbHVlQ2hhbmdlKG1vKTtcclxuICAgIH1cclxuICAgIG9uQ29sdW1uUmVzaXplZChjb2x1bW5zOiBjb2x1bW5zUmVzaXplZEV2ZW50QXJncyk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuX2hhbmRsZUNvbHVtbnNSZXNpemVkKGNvbHVtbnMpO1xyXG4gICAgfVxyXG4gICAgb25Sb3dDbGljaygkZXZlbnQpOiB2b2lkIHtcclxuICAgICAgICBjb25zdCB7IG1vIH0gPSAkZXZlbnQ7XHJcbiAgICAgICAgaWYgKG1vLmdyb3VwIHx8IHRoaXMuX2lubGluZUVkaXRNb2RlKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgbW9JbmRleCA9IHRoaXMuX2dldEluZGV4KG1vKTtcclxuICAgICAgICB0aGlzLl9yb3dDaGVjayhtbywgbW9JbmRleCwgdHJ1ZSk7XHJcbiAgICAgICAgdGhpcy5fb3Blbk1vKG1vLCBtb0luZGV4KTtcclxuICAgIH1cclxuXHJcbiAgICBvblVsdkNvbW1hbmQoJGV2ZW50KTogdm9pZCB7XHJcbiAgICAgICAgY29uc3QgeyBtbyB9ID0gJGV2ZW50O1xyXG4gICAgICAgIGNvbnN0IG1vSW5kZXggPSB0aGlzLl9nZXRJbmRleChtbyk7XHJcbiAgICAgICAgdGhpcy5fdWx2Q29tbWFuZENsaWNrZWQobW8sIG1vSW5kZXgpO1xyXG4gICAgfVxyXG4gICAgb25Sb3dDaGVjaygkZXZlbnQpOiB2b2lkIHtcclxuICAgICAgICBjb25zdCB7IG1vIH0gPSAkZXZlbnQ7XHJcbiAgICAgICAgY29uc3QgbW9JbmRleCA9IHRoaXMuX2dldEluZGV4KG1vKTtcclxuICAgICAgICBpZiAodGhpcy5fb3Blbk9uQ2xpY2spIHtcclxuICAgICAgICAgICAgdGhpcy5vblJvd0NsaWNrKCRldmVudCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5fcm93Q2hlY2sobW8sIG1vSW5kZXgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBvbkV4cGFuZENsaWNrKG1vOiBNZXRhb2JqZWN0RGF0YU1vZGVsKTogdm9pZCB7XHJcbiAgICAgICAgbW8uJEV4cGFuZGVkID0gIW1vLiRFeHBhbmRlZDtcclxuICAgICAgICB0aGlzLl9zZXRWaXNpYmlsaXR5KG1vLiRFeHBhbmRlZCwgbW8pO1xyXG4gICAgICAgIHRoaXMuX3Vsdk1haW5TZXJ2aWNlLnJlU2V0TW9EYXRhTGlzdCgpO1xyXG4gICAgfVxyXG5cclxuICAgIG9uQWxsQ2hlY2tib3goY2hlY2tlZCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuX2RvQ2hlY2tlZEFsbChjaGVja2VkKTtcclxuICAgICAgICAvLyBpZiAoY2hlY2tlZCkge1xyXG4gICAgICAgIC8vICAgdGhpcy5ncmlkRGF0YVNvdXJjZS5yZXN1bHRJdGVtcy5mb3JFYWNoKChtbywgaW5kZXgpID0+IHtcclxuICAgICAgICAvLyAgICAgdGhpcy5fc2VsZWN0KG1vLCBpbmRleCk7XHJcbiAgICAgICAgLy8gICB9KTtcclxuICAgICAgICAvLyB9IGVsc2Uge1xyXG4gICAgICAgIC8vICAgdGhpcy5ncmlkRGF0YVNvdXJjZS5yZXN1bHRJdGVtcy5mb3JFYWNoKChtbywgaW5kZXgpID0+IHtcclxuICAgICAgICAvLyAgICAgdGhpcy5fZGVzZWxlY3QobW8sIGluZGV4KTtcclxuICAgICAgICAvLyAgIH0pO1xyXG4gICAgICAgIC8vIH1cclxuICAgIH1cclxuXHJcbiAgICBvblNvcnRBc2NlbmRpbmcoY29sdW1uKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5fYWRkU29ydENvbHVtbihjb2x1bW4uTmFtZSwgJ0FTQycpO1xyXG4gICAgfVxyXG5cclxuICAgIG9uU29ydERlc2NlbmRpbmcoY29sdW1uKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5fYWRkU29ydENvbHVtbihjb2x1bW4uTmFtZSwgJ0RFU0MnKTtcclxuICAgIH1cclxuICAgIG9uRmlsdGVyKHNlbGVjdGVkQ29sdW1uKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5fc2hvd0ZpbHRlclNldHRpbmcoc2VsZWN0ZWRDb2x1bW4pO1xyXG4gICAgfVxyXG5cclxuICAgIG9uQ29sdW1uU2V0dGluZ3MoZGV2aWNlKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5fb3BlblNldHRpbmdzKCdjb2x1bW5zJywgZGV2aWNlKTtcclxuICAgIH1cclxuXHJcbiAgICBvblNvcnRTZXR0aW5ncyhkZXZpY2UpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLl9vcGVuU2V0dGluZ3MoJ3NvcnQnLCBkZXZpY2UpO1xyXG4gICAgfVxyXG5cclxuICAgIG9uR3JvdXBieVNldHRpbmdzKGRldmljZSk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuX29wZW5TZXR0aW5ncygnZ3JvdXBieScsIGRldmljZSk7XHJcbiAgICB9XHJcblxyXG4gICAgb25MaXN0Q2hlY2tib3hDbGljaygkZXZlbnQpOiB2b2lkIHtcclxuICAgICAgICBjb25zdCB7IG1vLCBpbmRleCwgZSB9ID0gJGV2ZW50O1xyXG4gICAgICAgIHRoaXMub25Sb3dDaGVjayh7IG1vLCBpbmRleCwgY2F1c2U6ICdzaW5nbGVTZWxlY3QnIH0pO1xyXG4gICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgfVxyXG5cclxuICAgIG9uTGlzdE5hdmlnYXRpb25DbGljaygkZXZlbnQpOiB2b2lkIHtcclxuICAgICAgICBjb25zdCB7IG1vLCBpbmRleCwgZSB9ID0gJGV2ZW50O1xyXG4gICAgICAgIHRoaXMub25Sb3dDbGljayh7IG1vLCBpbmRleCB9KTtcclxuICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcclxuICAgIH1cclxuICAgIG9uU2F2ZVRvcEZvcm0obW86IE1ldGFvYmplY3REYXRhTW9kZWwpOiB2b2lkIHtcclxuICAgICAgICBjb25zdCBuZXdNb0RhdGFMaXN0ID0gdGhpcy5tb0RhdGFMaXN0O1xyXG4gICAgICAgIGNvbnN0IGV4aXN0c0luZGV4ID0gbmV3TW9EYXRhTGlzdC5maW5kSW5kZXgoKGMpID0+IGMuSWQgPT09IG1vLklkKTtcclxuICAgICAgICBpZiAoZXhpc3RzSW5kZXggPiAtMSkge1xyXG4gICAgICAgICAgICBuZXdNb0RhdGFMaXN0W2V4aXN0c0luZGV4XSA9IG1vO1xyXG4gICAgICAgIH1cclxuICAgICAgICBuZXdNb0RhdGFMaXN0Lm1hcCgoYykgPT4ge1xyXG4gICAgICAgICAgICBjLiROZXdJbmxpbmVNbyA9IHVuZGVmaW5lZDtcclxuICAgICAgICAgICAgYy4kSXNDaGVja2VkID0gZmFsc2U7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgdGhpcy5fdWx2TWFpblNlcnZpY2UucmVTZXRNb0RhdGFMaXN0KG5ld01vRGF0YUxpc3QpO1xyXG4gICAgICAgIHRoaXMucmVmcmVzaENvbnRleHRNb0RhdGFMaXN0KG5ld01vRGF0YUxpc3QpO1xyXG4gICAgfVxyXG4gICAgb25OZXdUb3BGb3JtQWRkKG1vOiBNZXRhb2JqZWN0RGF0YU1vZGVsKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5fYWRkSW5saW5lTW9Ub01vZGF0YUxpc3QobW8pO1xyXG4gICAgfVxyXG4gICAgLyogZXNsaW50LWRpc2FibGUgKi9cclxuICAgIEBJbnB1dCgpIFNob3dGb3JtUGFuZWxDb250cm9sID0gKGZvcm1wYW5lbEN0cmxyKSA9PiB7fTtcclxuICAgIC8qIGVzbGludC1kaXNhYmxlICovXHJcbiAgICBASW5wdXQoKSBGb3JjZUNsb3NlQ2hpbGQgPSAoKSA9PiB7fTtcclxuICAgIC8qIGVzbGludC1kaXNhYmxlICovXHJcbiAgICBASW5wdXQoKSBSZWZyZXNoRm9ybVBhbmVsQ29udHJvbCA9IChmb3JtcGFuZWxDdHJscikgPT4ge307XHJcblxyXG4gICAgLy8gcHJvdGVjdGVkIF9pbmxpbmVFZGl0TW9kZUNoYW5nZWQoZWRpdE1vZGUpOiB2b2lkIHtcclxuICAgIC8vICAgICBpZiAoZWRpdE1vZGUpIHtcclxuICAgIC8vICAgICAgICAgY29uc3QgY2FuQWRkOiBib29sZWFuID0gdGhpcy5fYWNjZXNzPy5BZGQgIT09IGZhbHNlO1xyXG5cclxuICAgIC8vICAgICAgICAgbGV0IHNlbGVjdGVkTW8gPSB0aGlzLl9nZXRTZWxlY3RlZCgpO1xyXG4gICAgLy8gICAgICAgICBsZXQgbmV3TW87XHJcbiAgICAvLyAgICAgICAgIGlmIChjYW5BZGQgIT09IGZhbHNlICYmICFzZWxlY3RlZE1vKSB7XHJcbiAgICAvLyAgICAgICAgICAgICB0aGlzLl9jcmVhdGVOZXdJbmxpbmVSZWNvcmQoKTtcclxuICAgIC8vICAgICAgICAgICAgIHJldHVybjtcclxuICAgIC8vICAgICAgICAgfVxyXG4gICAgLy8gICAgICAgICAvLyBpZiAoIXNlbGVjdGVkTW8gJiYgIW5ld01vICYmIHRoaXMubW9EYXRhTGlzdC5sZW5ndGggPiAwKSB7XHJcbiAgICAvLyAgICAgICAgIC8vICAgICBzZWxlY3RlZE1vID0gdGhpcy5tb0RhdGFMaXN0WzBdO1xyXG4gICAgLy8gICAgICAgICAvLyB9XHJcbiAgICAvLyAgICAgICAgIC8vIGlmIChzZWxlY3RlZE1vKSB7XHJcbiAgICAvLyAgICAgICAgIC8vICAgICBjb25zdCBpZE9mU2VsZWN0ZWRNbyA9IHRoaXMuX2luZGV4T2ZNbyhzZWxlY3RlZE1vKTtcclxuICAgIC8vICAgICAgICAgLy8gICAgIHNlbGVjdGVkTW8uJElzQ2hlY2tlZCA9IGZhbHNlO1xyXG4gICAgLy8gICAgICAgICAvLyAgICAgdGhpcy5fY3JlYXRlTmV3SW5saW5lUmVjb3JkKHNlbGVjdGVkTW8pO1xyXG4gICAgLy8gICAgICAgICAvLyAgICAgdGhpcy5fcm93Q2hlY2soc2VsZWN0ZWRNbywgaWRPZlNlbGVjdGVkTW8pO1xyXG4gICAgLy8gICAgICAgICAvLyB9XHJcbiAgICAvLyAgICAgfSBlbHNlIHtcclxuICAgIC8vICAgICAgICAgQmFyc2FBcGkuVWwuQXBwbGljYXRpb25DdHJsci5DdXJyZW50U3lzdGVtQWRhcHRlciA9IHRoaXMuX29sZENvbnRhaW5lcjtcclxuICAgIC8vICAgICAgICAgdGhpcy5fc2V0TmV3SW5saW5lTW8obnVsbCk7XHJcbiAgICAvLyAgICAgfVxyXG4gICAgLy8gfVxyXG4gICAgLy8gcHJvdGVjdGVkIF9jcmVhdGVOZXdJbmxpbmVSZWNvcmQoc2VsZWN0ZWRNbz86IE1ldGFvYmplY3REYXRhTW9kZWwpIHtcclxuICAgIC8vICAgICBjb25zdCBtbyA9IHRoaXMuX2lubGluZUVkaXRQcmVwYXJlTmV3TW8oKTtcclxuICAgIC8vICAgICBjb25zdCBmb3JtTW8gPSBCYXJzYUFwaS5Db21tb24uTWVyZ2VyLkZhc3RNZXJnZShtbywgc2VsZWN0ZWRNbywgeyBleHRlbmRlZEZpZWxkczogWydJZCwkQ2FwdGlvbiddIH0pO1xyXG4gICAgLy8gICAgIHRoaXMuX3NldE5ld0lubGluZU1vKGZvcm1Nbyk7XHJcbiAgICAvLyAgICAgdGhpcy5fc2VsZWN0KGZvcm1NbywgLTEpO1xyXG4gICAgLy8gfVxyXG4gICAgcHJvdGVjdGVkIF9zZXRQYXJlbnRIZWlnaHQoKSB7XHJcbiAgICAgICAgY29uc3QgZWxEb20gPSB0aGlzLmVsLm5hdGl2ZUVsZW1lbnQgYXMgSFRNTEVsZW1lbnQ7XHJcbiAgICAgICAgbGV0IHBhcmVudERvbSA9IGVsRG9tLnBhcmVudEVsZW1lbnQ7XHJcbiAgICAgICAgbGV0IHBhcmVudEhlaWdodCA9IHBhcmVudERvbT8uY2xpZW50SGVpZ2h0ID8/IDA7XHJcbiAgICAgICAgd2hpbGUgKHBhcmVudERvbSAhPSBudWxsICYmICFwYXJlbnRIZWlnaHQpIHtcclxuICAgICAgICAgICAgcGFyZW50RG9tID0gcGFyZW50RG9tLnBhcmVudEVsZW1lbnQ7XHJcbiAgICAgICAgICAgIHBhcmVudEhlaWdodCA9IHBhcmVudERvbT8uY2xpZW50SGVpZ2h0ID8/IDA7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMucGFyZW50SGVpZ2h0ID0gcGFyZW50SGVpZ2h0O1xyXG4gICAgfVxyXG4gICAgcHJvdGVjdGVkIF9tYXBDYXJ0YWJsZU1vKGl0ZW1zOiBNZXRhb2JqZWN0RGF0YU1vZGVsW10pIHtcclxuICAgICAgICBpZiAoIXRoaXMudmlld1NldHRpbmcpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGl0ZW1zO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCB7IE5hbWVTZXJpYWxpemVNbywgQ2FydGFibGVPYmplY3ROYW1lIH0gPSB0aGlzLnZpZXdTZXR0aW5nO1xyXG4gICAgICAgIGlmICghTmFtZVNlcmlhbGl6ZU1vIHx8ICFDYXJ0YWJsZU9iamVjdE5hbWUgfHwgIWl0ZW1zPy5sZW5ndGgpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGl0ZW1zO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpdGVtcy5mb3JFYWNoKChjKSA9PiAoY1tDYXJ0YWJsZU9iamVjdE5hbWVdID0gQmFyc2FBcGkuRXh0LmRlY29kZSgneycgKyBjW05hbWVTZXJpYWxpemVNb10gKyAnfScpKSk7XHJcbiAgICAgICAgcmV0dXJuIGl0ZW1zO1xyXG4gICAgfVxyXG4gICAgcHJvdGVjdGVkIF9pbmxpbmVFZGl0TW9kZUNoYW5nZWQoZWRpdE1vZGU6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgICAgICBsZXQgbmV3TW9EYXRhTGlzdCA9IHRoaXMubW9EYXRhTGlzdDtcclxuICAgICAgICBsZXQgY2hhbmdlZCA9IGZhbHNlO1xyXG4gICAgICAgIGlmIChlZGl0TW9kZSkge1xyXG4gICAgICAgICAgICBuZXdNb0RhdGFMaXN0LnB1c2godGhpcy5faW5saW5lUmVwb3J0Q3JlYXRlTmV3TW8oIXRoaXMuX2dldFNlbGVjdGVkKCkpKTtcclxuICAgICAgICAgICAgY2hhbmdlZCA9IHRydWU7XHJcbiAgICAgICAgfSBlbHNlIGlmIChlZGl0TW9kZSA9PT0gZmFsc2UgJiYgIW5ld01vRGF0YUxpc3QubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIG5ld01vRGF0YUxpc3QgPSBuZXdNb0RhdGFMaXN0LmZpbHRlcigoYykgPT4gIWMuJE5ld0lubGluZU1vKTtcclxuICAgICAgICAgICAgY2hhbmdlZCA9IHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghY2hhbmdlZCkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuX3Vsdk1haW5TZXJ2aWNlLnJlU2V0TW9EYXRhTGlzdChuZXdNb0RhdGFMaXN0KTtcclxuICAgICAgICB0aGlzLnJlZnJlc2hDb250ZXh0TW9EYXRhTGlzdChuZXdNb0RhdGFMaXN0KTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIF9pbmxpbmVSZXBvcnRDcmVhdGVOZXdNbyhpc0NoZWNrZWQ6IGJvb2xlYW4pOiBNZXRhb2JqZWN0RGF0YU1vZGVsIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fdWx2TWFpblNlcnZpY2UuY3JlYXRlTmV3SW5saW5lTW8oaXNDaGVja2VkKTtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgX2lubGluZUZvcm1QYW5lbFZhbHVlQ2hhbmdlKG1vOiBNZXRhb2JqZWN0RGF0YU1vZGVsKTogdm9pZCB7XHJcbiAgICAgICAgY29uc3QgbmV3TW9EYXRhTGlzdCA9IHRoaXMubW9EYXRhTGlzdDtcclxuICAgICAgICBjb25zdCBleGlzdE1vSW5kZXggPSBuZXdNb0RhdGFMaXN0LmZpbmRJbmRleCgoYykgPT4gYy5JZCA9PT0gbW8uSWQpO1xyXG4gICAgICAgIGlmIChleGlzdE1vSW5kZXggPiAtMSkge1xyXG4gICAgICAgICAgICBuZXdNb0RhdGFMaXN0W2V4aXN0TW9JbmRleF0gPSBCYXJzYUFwaS5Db21tb24uTWV0YU9iamVjdFdlYi5DcmVhdGVNbyhtbyk7XHJcbiAgICAgICAgICAgIHRoaXMuX3Vsdk1haW5TZXJ2aWNlLnJlU2V0TW9EYXRhTGlzdChuZXdNb0RhdGFMaXN0KTtcclxuICAgICAgICAgICAgdGhpcy5yZWZyZXNoQ29udGV4dE1vRGF0YUxpc3QobmV3TW9EYXRhTGlzdCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgcHJvdGVjdGVkIF9zZWxlY3ROZXh0SW5saW5lUmVjb3JkKG1vOiBNZXRhb2JqZWN0RGF0YU1vZGVsKTogdm9pZCB7XHJcbiAgICAgICAgY29uc3QgbmV3TW9EYXRhTGlzdCA9IHRoaXMubW9EYXRhTGlzdDtcclxuICAgICAgICBpZiAoIW1vLiROZXdJbmxpbmVNbykge1xyXG4gICAgICAgICAgICAvLyBzZWxlY3QgbmV4dCByZWNvcmRcclxuICAgICAgICAgICAgY29uc3QgZXhpc3RzSW5kZXggPSBuZXdNb0RhdGFMaXN0LmZpbmRJbmRleCgoYykgPT4gYy5JZCA9PT0gbW8uSWQpO1xyXG4gICAgICAgICAgICBpZiAoZXhpc3RzSW5kZXggPiAtMSAmJiBleGlzdHNJbmRleCArIDEgPCBuZXdNb0RhdGFMaXN0Lmxlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgbmV3TW9EYXRhTGlzdFtleGlzdHNJbmRleCArIDFdLiRJc0NoZWNrZWQgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3Jvd0NoZWNrKG5ld01vRGF0YUxpc3RbZXhpc3RzSW5kZXggKyAxXSwgZXhpc3RzSW5kZXggKyAxKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIG5ld01vRGF0YUxpc3QubWFwKChjKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgYy4kTmV3SW5saW5lTW8gPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgICAgICAgICAgICAgYy4kSXNDaGVja2VkID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIG5ld01vRGF0YUxpc3QucHVzaCh0aGlzLl9pbmxpbmVSZXBvcnRDcmVhdGVOZXdNbyh0cnVlKSk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl91bHZNYWluU2VydmljZS5yZVNldE1vRGF0YUxpc3QobmV3TW9EYXRhTGlzdCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnJlZnJlc2hDb250ZXh0TW9EYXRhTGlzdChuZXdNb0RhdGFMaXN0KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgcHJvdGVjdGVkIF9pbmxpbmVFZGl0U2F2ZUZvcm1QYW5lbChtbzogTWV0YW9iamVjdERhdGFNb2RlbCk6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IG5ld01vRGF0YUxpc3QgPSB0aGlzLm1vRGF0YUxpc3Q7XHJcbiAgICAgICAgaWYgKCFtby4kTmV3SW5saW5lTW8pIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBleGlzdHNJbmRleCA9IG5ld01vRGF0YUxpc3QuZmluZEluZGV4KChjKSA9PiBjLklkID09PSBtby5JZCk7XHJcbiAgICAgICAgaWYgKGV4aXN0c0luZGV4ID4gLTEpIHtcclxuICAgICAgICAgICAgbmV3TW9EYXRhTGlzdFtleGlzdHNJbmRleF0gPSBtbztcclxuICAgICAgICB9XHJcbiAgICAgICAgbmV3TW9EYXRhTGlzdC5tYXAoKGMpID0+IHtcclxuICAgICAgICAgICAgYy4kTmV3SW5saW5lTW8gPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgICAgIGMuJElzQ2hlY2tlZCA9IGZhbHNlO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICAvLyBjb25zdCByZXBvcnRFdmVudE1vID0ge1xyXG4gICAgICAgIC8vICAgICBSZXBvcnRJZDogdGhpcy5yZXBvcnRJZCxcclxuICAgICAgICAvLyAgICAgLi4ubW8sXHJcbiAgICAgICAgLy8gICAgICRJc0NoZWNrZWQ6IGZhbHNlLFxyXG4gICAgICAgIC8vICAgICAkTmV3SW5saW5lTW86IHVuZGVmaW5lZFxyXG4gICAgICAgIC8vIH07XHJcblxyXG4gICAgICAgIC8vIGNvbnN0IGluZGV4T2ZNbyA9IHRoaXMuX2dldEluZGV4KG1vKTtcclxuICAgICAgICAvLyAvLyBsZXQgaW5kZXhPZk5leHRNbyA9IGluZGV4T2ZNbyArIDE7XHJcbiAgICAgICAgLy8gLy8gY29uc3QgY2FuQWRkOiBib29sZWFuID0gdGhpcy5fYWNjZXNzPy5BZGQgIT09IGZhbHNlO1xyXG4gICAgICAgIC8vIGxldCBpbnNlcnRlZEluZGV4ID0gaW5kZXhPZk1vO1xyXG4gICAgICAgIC8vIGlmIChpbmRleE9mTW8gPT09IC0xKSB7XHJcbiAgICAgICAgLy8gICAgIGluc2VydGVkSW5kZXggPSBuZXdNb0RhdGFMaXN0Lmxlbmd0aDtcclxuICAgICAgICAvLyB9XHJcbiAgICAgICAgLy8gbmV3TW9EYXRhTGlzdC5zcGxpY2UoaW5zZXJ0ZWRJbmRleCwgaW5kZXhPZk1vID09PSAtMSA/IDAgOiAxLCByZXBvcnRFdmVudE1vKTtcclxuICAgICAgICAvLyBpZiAobW8uJFN0YXRlID09PSAnTmV3Jykge1xyXG4gICAgICAgIC8vIH1cclxuICAgICAgICBuZXdNb0RhdGFMaXN0LnB1c2godGhpcy5faW5saW5lUmVwb3J0Q3JlYXRlTmV3TW8oZmFsc2UpKTtcclxuICAgICAgICB0aGlzLl91bHZNYWluU2VydmljZS5yZVNldE1vRGF0YUxpc3QobmV3TW9EYXRhTGlzdCk7XHJcbiAgICAgICAgdGhpcy5yZWZyZXNoQ29udGV4dE1vRGF0YUxpc3QobmV3TW9EYXRhTGlzdCk7XHJcbiAgICAgICAgdGhpcy5fcm93Q2hlY2soXHJcbiAgICAgICAgICAgIG1vLFxyXG4gICAgICAgICAgICBuZXdNb0RhdGFMaXN0LmZpbmRJbmRleCgoYykgPT4gYy5JZCA9PT0gbW8uSWQpXHJcbiAgICAgICAgKTtcclxuXHJcbiAgICAgICAgLy8gdGhpcy5fdWx2TWFpblNlcnZpY2UuY3JlYXRlTmV3SW5saW5lTW8oKTtcclxuICAgIH1cclxuICAgIHByb3RlY3RlZCBfc2V0RGVmYXVsdEFjY2VzcygpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLl9hY2Nlc3MgPSB7XHJcbiAgICAgICAgICAgIEFkZDogZmFsc2UsXHJcbiAgICAgICAgICAgIEFkZFRvTGlzdDogZmFsc2UsXHJcbiAgICAgICAgICAgIERlbGV0ZTogZmFsc2UsXHJcbiAgICAgICAgICAgIEVkaXQ6IGZhbHNlLFxyXG4gICAgICAgICAgICBFeHBvcnQ6IGZhbHNlLFxyXG4gICAgICAgICAgICBQcmludDogZmFsc2UsXHJcbiAgICAgICAgICAgIFJlZnJlc2g6IGZhbHNlLFxyXG4gICAgICAgICAgICBSZW1vdmVGcm9tTGlzdDogZmFsc2UsXHJcbiAgICAgICAgICAgIFZpZXc6IGZhbHNlXHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuICAgIHByb3RlY3RlZCBfZXhwYW5kTW8oc2VsZWN0ZWRNbzogTWV0YW9iamVjdERhdGFNb2RlbCwgZXhwYW5kKTogdm9pZCB7XHJcbiAgICAgICAgc2VsZWN0ZWRNby4kRXhwYW5kZWQgPSBleHBhbmQ7XHJcbiAgICAgICAgc2VsZWN0ZWRNby4kQ2hpbGRyZW4/LmZvckVhY2goKGNoaWxkKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuX2V4cGFuZE1vKGNoaWxkLCBleHBhbmQpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgcHJvdGVjdGVkIF9pbmRleE9mSWQoaWQpOiBudW1iZXIge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmdyaWREYXRhU291cmNlLnJlc3VsdEl0ZW1zLmZpbmRJbmRleCgoYykgPT4gYy5JZCA9PT0gaWQpO1xyXG4gICAgfVxyXG4gICAgcHJvdGVjdGVkIF9pbmRleE9mTW8obW86IE1ldGFvYmplY3REYXRhTW9kZWwpOiBudW1iZXIge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmdyaWREYXRhU291cmNlLnJlc3VsdEl0ZW1zLmZpbmRJbmRleCgoYykgPT4gYy5JZCA9PT0gbW8uSWQpO1xyXG4gICAgfVxyXG4gICAgcHJvdGVjdGVkIF9pbmRleE9mU2VsZWN0ZWQoKTogbnVtYmVyIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5ncmlkRGF0YVNvdXJjZS5yZXN1bHRJdGVtcy5maW5kSW5kZXgoKGMpID0+IGMuJElzQ2hlY2tlZCk7XHJcbiAgICB9XHJcbiAgICBwcm90ZWN0ZWQgX2dldEluZGV4KG1vOiBNZXRhb2JqZWN0RGF0YU1vZGVsKTogbnVtYmVyIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5tb0RhdGFMaXN0LmZpbmRJbmRleCgoYykgPT4gYy5JZCA9PT0gbW8uSWQpO1xyXG4gICAgfVxyXG4gICAgcHJvdGVjdGVkIF9pbmlsaW5lRWRpdENhbmNlbCgpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLl9zZXRJbmxpbmVFZGl0KGZhbHNlKTtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgX3NldElubGluZUVkaXQodmFsdWU6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgICAgICB0aGlzLl91bHZNYWluU2VydmljZS5zZXRJbmxpbmVFZGl0KHZhbHVlKTtcclxuICAgIH1cclxuICAgIHByb3RlY3RlZCBfcmVhZFZpZXdTZXR0aW5nKCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMudmlld1NldHRpbmcgPSB0aGlzLmNvbnRleHQuU2V0dGluZy5DbGFzc05hbWVzLkN1c3RvbVVpPy5QYXJhbWV0ZXJzO1xyXG4gICAgfVxyXG4gICAgLy8gcHJvdGVjdGVkIF9tb0RhdGFMaXN0Q2hhbmdlZChtb0RhdGFMaXN0OiBNZXRhb2JqZWN0RGF0YU1vZGVsW10pOiB2b2lkIHtcclxuICAgIC8vICAgICBzdXBlci5fbW9EYXRhTGlzdENoYW5nZWQobW9EYXRhTGlzdCk7XHJcbiAgICAvLyAgICAgaWYgKHRoaXMuX2lubGluZUVkaXRNb2RlKSB7XHJcbiAgICAvLyAgICAgICAgIGNvbnN0IGNoZWNrZWRNb0luZGV4ID0gbW9EYXRhTGlzdC5maW5kSW5kZXgoKGMpID0+IGMuJElzQ2hlY2tlZCk7XHJcblxyXG4gICAgLy8gICAgICAgICBpZiAoY2hlY2tlZE1vSW5kZXggPiAtMSkge1xyXG4gICAgLy8gICAgICAgICAgICAgY29uc3QgY2hlY2tlZE1vID0gbW9EYXRhTGlzdFtjaGVja2VkTW9JbmRleF07XHJcbiAgICAvLyAgICAgICAgICAgICBpZiAoY2hlY2tlZE1vLklkICE9PSB0aGlzLmZvcm1QYW5lbEN0cmxyLk1vLklkKSB7XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgdGhpcy5faW5saW5lRWRpdG9yRGVzdHJveUZvcm1QYW5lbEN0cmxyKCk7XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgdGhpcy5faW5saW5lRWRpdENyZWF0ZUZvcm1QYW5lbEN0cmxyKGNoZWNrZWRNbywgY2hlY2tlZE1vSW5kZXgpO1xyXG4gICAgLy8gICAgICAgICAgICAgfVxyXG4gICAgLy8gICAgICAgICB9XHJcbiAgICAvLyAgICAgfVxyXG4gICAgLy8gfVxyXG5cclxuICAgIHByb3RlY3RlZCBfc2V0VmlzaWJpbGl0eShcclxuICAgICAgICBleHBhbmQ6IGJvb2xlYW4sXHJcbiAgICAgICAgbW86IGFueSAvL01ldGFvYmplY3REYXRhTW9kZWxcclxuICAgICk6IHZvaWQge1xyXG4gICAgICAgIG1vLiRDaGlsZHJlbj8uZm9yRWFjaCgoY2hpbGQpID0+IHtcclxuICAgICAgICAgICAgY2hpbGQuJFZpc2liaWxpdHkgPSBleHBhbmQ7XHJcbiAgICAgICAgICAgIGlmIChjaGlsZC4kQ2hpbGRyZW4pIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3NldFZpc2liaWxpdHkoZXhwYW5kLCBjaGlsZCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBwcm90ZWN0ZWQgX3NldE5ld0lubGluZU1vKG1vOiBNZXRhb2JqZWN0RGF0YU1vZGVsIHwgbnVsbCk6IHZvaWQge1xyXG4gICAgLy8gICAgIHRoaXMuX3Vsdk1haW5TZXJ2aWNlLnNldE5ld0lubGluZU1vKG1vKTtcclxuICAgIC8vIH1cclxuICAgIC8vIHByb3RlY3RlZCBfaW5saW5lRWRpdFByZXBhcmVOZXdNbygpOiBNZXRhb2JqZWN0RGF0YU1vZGVsIHtcclxuICAgIC8vIGNvbnN0IG5ld01vID0gZ2V0TmV3TW9HcmlkRWRpdG9yKHRoaXMuZm9ybVNldHRpbmcsIHRoaXMuX3R5cGVEZWZJZCk7XHJcbiAgICAvLyBuZXdNby5JZCA9IGdldFVuaXF1ZUlkKDMpO1xyXG4gICAgLy8gaWYgKHRoaXMuX2lzQ29tcG9zaXRlKCkpIHtcclxuICAgIC8vICAgICBjb25zdCByZWxhdGlvbiA9IEJhcnNhQXBpLkNvbW1vbi5VdGlsLlRyeUdldFZhbHVlKHRoaXMuY29udGV4dC5TZXR0aW5nLCAnRXh0cmEuUmVsYXRpb24nKTtcclxuICAgIC8vICAgICBuZXdNb1tyZWxhdGlvbi5QYXJlbnRGZE5hbWVdID0gcmVsYXRpb24uUGFyZW50TW9JZDtcclxuICAgIC8vIH1cclxuICAgIC8vICAgICAgICBjb25zdCBuZXdNb0RhdGFMaXN0ID0gWy4uLnRoaXMubW9EYXRhTGlzdCwgbmV3TW8gYXMgTWV0YW9iamVjdERhdGFNb2RlbF07XHJcbiAgICAvLyAgICAgICB0aGlzLl91bHZNYWluU2VydmljZS5yZVNldE1vRGF0YUxpc3QobmV3TW9EYXRhTGlzdCk7XHJcbiAgICAvLyBCYXJzYUFwaS5VbC5BcHBsaWNhdGlvbkN0cmxyLmZpcmVFdmVudChcclxuICAgIC8vICAgQmFyc2FBcGkuVWwuQXBwbGljYXRpb25DdHJsci5FdmVudEVudW0uR2xvYmFsUmVwb3J0TW9BZGQsXHJcbiAgICAvLyAgIHRoaXMuY29udGV4dCxcclxuICAgIC8vICAgcmVwb3J0RXZlbnRNb0FkZFxyXG4gICAgLy8gKTtcclxuICAgIC8vICAgICAgIHRoaXMuY29udGV4dC5maXJlRXZlbnQoJ1JlZnJlc2hDb250ZXh0TW9EYXRhTGlzdCcsIG5ld01vRGF0YUxpc3QpO1xyXG4gICAgLy8gICAgcmV0dXJuIG5ld01vIGFzIE1ldGFvYmplY3REYXRhTW9kZWw7XHJcbiAgICAvLyB9XHJcbiAgICBwcm90ZWN0ZWQgX2FkZElubGluZU1vVG9Nb2RhdGFMaXN0KG5ld0lubGluZU1vOiBNZXRhb2JqZWN0RGF0YU1vZGVsKTogdm9pZCB7XHJcbiAgICAgICAgY29uc3QgbmV3TW9EYXRhTGlzdCA9IFsuLi50aGlzLm1vRGF0YUxpc3QsIHsgLi4ubmV3SW5saW5lTW8sICRJc0NoZWNrZWQ6IGZhbHNlIH1dO1xyXG4gICAgICAgIHRoaXMuX3Vsdk1haW5TZXJ2aWNlLnJlU2V0TW9EYXRhTGlzdChuZXdNb0RhdGFMaXN0KTtcclxuICAgICAgICB0aGlzLnJlZnJlc2hDb250ZXh0TW9EYXRhTGlzdChuZXdNb0RhdGFMaXN0KTtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgX3Jvd0NoZWNrKG1vOiBNZXRhb2JqZWN0RGF0YU1vZGVsLCBpbmRleDogbnVtYmVyLCBzZWxlY3RlZCA9IGZhbHNlKTogdm9pZCB7XHJcbiAgICAgICAgY29uc3QgZWRpdE1vZGUgPSB0aGlzLl9pbmxpbmVFZGl0TW9kZSAmJiB0aGlzLl9hbGxvd0lubGluZUVkaXQ7XHJcbiAgICAgICAgaWYgKG1vLiRJc0NoZWNrZWQgJiYgZWRpdE1vZGUpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBsZXQgc2VsZWN0aW9uTW9kZSA9IHRoaXMuc2VsZWN0aW9uTW9kZTtcclxuICAgICAgICBpZiAoZWRpdE1vZGUpIHtcclxuICAgICAgICAgICAgc2VsZWN0aW9uTW9kZSA9IFNlbGVjdGlvbk1vZGUuU0lOR0xFO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBjaGVja2VkID0gIW1vLiRJc0NoZWNrZWQgfHwgc2VsZWN0ZWQ7XHJcbiAgICAgICAgdGhpcy5yb3dIb3ZlcmFibGUgPSBmYWxzZTtcclxuICAgICAgICBpZiAoc2VsZWN0aW9uTW9kZSA9PT0gJ25vbmUnKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGNoZWNrZWQpIHtcclxuICAgICAgICAgICAgaWYgKHNlbGVjdGlvbk1vZGUgPT09ICdzaW5nbGUnICYmIGNoZWNrZWQpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX2RvQ2hlY2tlZEFsbChmYWxzZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKGVkaXRNb2RlKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoaW5kZXggIT09IC0xKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gdGhpcy5fc2V0TmV3SW5saW5lTW8obnVsbCk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fc2VsZWN0KG1vLCBpbmRleCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAvLyBUT0RPXHJcbiAgICAgICAgICAgICAgICAvLyB0aGlzLl9zZXRWYWx1ZUlubGluZU1vKG1vKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3NlbGVjdChtbywgaW5kZXgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHRoaXMuX2Rlc2VsZWN0KG1vLCBpbmRleCk7XHJcbiAgICB9XHJcbiAgICAvLyBwcm90ZWN0ZWQgX3NldFZhbHVlSW5saW5lTW8obW86IE1ldGFvYmplY3REYXRhTW9kZWwpOiB2b2lkIHtcclxuICAgIC8vICAgICAvLyB0aGlzLmZvcm1QYW5lbEN0cmxyLlNldFZhbHVlKHsgLi4ubW8sICRUeXBlRGVmSWQ6IHRoaXMuX3R5cGVEZWZJZCB9KTtcclxuICAgIC8vIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgX2lubGluZUVkaXRvckRlc3Ryb3lGb3JtUGFuZWxDdHJscigpOiB2b2lkIHtcclxuICAgICAgICAvLyBpZiAodGhpcy5mb3JtUGFuZWxDdHJscikge1xyXG4gICAgICAgIC8vICAgICB0aGlzLl9mb3JtUGFuZWxTZXJ2aWNlLmRlc3Ryb3koKTtcclxuICAgICAgICAvLyAgICAgdGhpcy5mb3JtUGFuZWxDdHJsci5EZXN0cm95KCk7XHJcbiAgICAgICAgLy8gICAgIHRoaXMuZm9ybVBhbmVsQ3RybHIgPSBudWxsO1xyXG4gICAgICAgIC8vIH1cclxuICAgIH1cclxuICAgIHByb3RlY3RlZCBfd2luZG93UmVzaXplZCgpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLl9zZXRDb250YWluZXJXaWR0aCgpO1xyXG4gICAgICAgIHRoaXMuX3NldFBhcmVudEhlaWdodCgpO1xyXG4gICAgfVxyXG4gICAgcHJvdGVjdGVkIF9zZXRDb250YWluZXJXaWR0aCgpOiB2b2lkIHtcclxuICAgICAgICBjb25zdCBlbCA9IHRoaXMuZWwubmF0aXZlRWxlbWVudCBhcyBIVE1MRWxlbWVudDtcclxuICAgICAgICB0aGlzLmNvbnRhaW5lcldpZHRoU291cmNlJC5uZXh0KGVsLm9mZnNldFdpZHRoKTtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgX2RldmljZVNpemVDaGFuZ2VkKGRldmljZVNpemUpOiB2b2lkIHtcclxuICAgICAgICBjb25zdCBlbCA9IHRoaXMuZWwubmF0aXZlRWxlbWVudCBhcyBIVE1MRWxlbWVudDtcclxuICAgICAgICBpZiAodGhpcy5faW5saW5lRWRpdE1vZGUpIHtcclxuICAgICAgICAgICAgdGhpcy5zZWNvbmRhcnlDb2x1bW5zU291cmNlLm5leHQoW10pO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLnZpZXdTZXR0aW5nPy5EaXNhYmxlUmVzcG9uc2l2ZSkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBncmlkU2l6ZSA9IGdldENvbnRyb2xTaXplTW9kZShlbCwgZGV2aWNlU2l6ZSk7XHJcbiAgICAgICAgbGV0IGRldmljZU5hbWU6IERldmljZVNpemUgPSAnZGVza3RvcCc7XHJcbiAgICAgICAgY29uc3QgdmlzaWJsZUNvbHVtbnMgPSB0aGlzLl92aXNpYmxlQ29sdW1uc1NvdXJjZS5nZXRWYWx1ZSgpO1xyXG4gICAgICAgIGxldCBjb2x1bW5zQ291bnQgPSB2aXNpYmxlQ29sdW1ucy5sZW5ndGg7XHJcbiAgICAgICAgc3dpdGNoIChncmlkU2l6ZSkge1xyXG4gICAgICAgICAgICBjYXNlICdsJzpcclxuICAgICAgICAgICAgY2FzZSAneGwnOlxyXG4gICAgICAgICAgICAgICAgZGV2aWNlTmFtZSA9ICdkZXNrdG9wJztcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlICdzJzpcclxuICAgICAgICAgICAgICAgIGRldmljZU5hbWUgPSAnbW9iaWxlJztcclxuICAgICAgICAgICAgICAgIGNvbHVtbnNDb3VudCA9IDI7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSAnbSc6XHJcbiAgICAgICAgICAgICAgICBkZXZpY2VOYW1lID0gJ3RhYmxldCc7XHJcbiAgICAgICAgICAgICAgICBjb2x1bW5zQ291bnQgPSA0O1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuX2RldmljZU5hbWVTb3VyY2UubmV4dChkZXZpY2VOYW1lKTtcclxuICAgICAgICBjb25zdCBjb2xTZXR0aW5ncyA9IHRoaXMuZ3JpZFNldHRpbmdTb3VyY2UuZ2V0VmFsdWUoKT8uQ29sU2V0dGluZ0xpc3QgfHwgW107XHJcbiAgICAgICAgbGV0IHN1bUNvbFdpZHRoID0gMDtcclxuICAgICAgICBpZiAoY29sU2V0dGluZ3MubGVuZ3RoID4gMCAmJiB0aGlzLmNvbnRhaW5lcldpZHRoID4gMCkge1xyXG4gICAgICAgICAgICBjb2x1bW5zQ291bnQgPSB2aXNpYmxlQ29sdW1ucy5sZW5ndGg7XHJcbiAgICAgICAgICAgIGNvbFNldHRpbmdzLmZvckVhY2goKGNvbCwgaW5kZXgpID0+IHtcclxuICAgICAgICAgICAgICAgIGlmIChzdW1Db2xXaWR0aCArIGNvbC5XaWR0aCA+IHRoaXMuY29udGFpbmVyV2lkdGggJiYgY29sdW1uc0NvdW50ID09PSB2aXNpYmxlQ29sdW1ucy5sZW5ndGgpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb2x1bW5zQ291bnQgPSBpbmRleDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHN1bUNvbFdpZHRoICs9IGNvbC5XaWR0aDtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh2aXNpYmxlQ29sdW1ucy5sZW5ndGggPiAyKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2Vjb25kYXJ5Q29sdW1uc1NvdXJjZS5uZXh0KHZpc2libGVDb2x1bW5zLnNsaWNlKGNvbHVtbnNDb3VudCwgdmlzaWJsZUNvbHVtbnMubGVuZ3RoKSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBfb3BlblNldHRpbmdzKG5hbWUsIGRldmljZTogRGV2aWNlU2l6ZSk6IHZvaWQge1xyXG4gICAgICAgIGxldCBjb21wb25lbnQ6IENvbXBvbmVudFR5cGU8YW55PiB8IG51bGwgPSBudWxsO1xyXG4gICAgICAgIHN3aXRjaCAobmFtZSkge1xyXG4gICAgICAgICAgICBjYXNlICdjb2x1bW5zJzpcclxuICAgICAgICAgICAgICAgIGNvbXBvbmVudCA9IFVsdkNvbHVtblNldHRpbmdzQ29tcG9uZW50O1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgJ3NvcnQnOlxyXG4gICAgICAgICAgICAgICAgY29tcG9uZW50ID0gVWx2U29ydFNldHRpbmdzQ29tcG9uZW50O1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgJ2dyb3VwYnknOlxyXG4gICAgICAgICAgICAgICAgY29tcG9uZW50ID0gVWx2R3JvdXBieVNldHRpbmdzQ29tcG9uZW50O1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGNvbmZpZzogRGlhbG9nQ29uZmlnID0ge1xyXG4gICAgICAgICAgICAuLi50aGlzLmRpYWxvZ0NvbmZpZyxcclxuICAgICAgICAgICAgZGF0YTogeyBjb250ZXh0OiB0aGlzLmNvbnRleHQgfSxcclxuICAgICAgICAgICAgZnVsbFNjcmVlbjogZGV2aWNlID09PSAnbW9iaWxlJyxcclxuICAgICAgICAgICAgbWluV2lkdGg6IGRldmljZSA9PT0gJ21vYmlsZScgPyAnYXV0bycgOiB0aGlzLmRpYWxvZ0NvbmZpZy5taW5XaWR0aCxcclxuICAgICAgICAgICAgbWluSGVpZ2h0OiBkZXZpY2UgPT09ICdtb2JpbGUnID8gJ2F1dG8nIDogdGhpcy5kaWFsb2dDb25maWcubWluSGVpZ2h0XHJcbiAgICAgICAgfTtcclxuICAgICAgICBpZiAoY29tcG9uZW50ICE9PSBudWxsKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGRpYWxvZ1JlZiA9IHRoaXMuX2RpYWxvZ1NlcnZpY2Uub3Blbihjb21wb25lbnQsIGNvbmZpZyk7XHJcbiAgICAgICAgICAgIGRpYWxvZ1JlZi5hZnRlckNsb3NlZC5waXBlKHRha2VVbnRpbCh0aGlzLl9vbkRlc3Ryb3kkKSkuc3Vic2NyaWJlKChzZXR0aW5nKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAoc2V0dGluZykge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGlzU29ydENoYW5nZWQgPSBuYW1lID09PSAnc29ydCcgfHwgbmFtZSA9PT0gJ2dyb3VwYnknO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlR3JpZFNldHRpbmcoc2V0dGluZywgaXNTb3J0Q2hhbmdlZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb250ZXh0Lm1vRGF0YUxpc3QgPSB0aGlzLmdyaWREYXRhU291cmNlLnJlc3VsdEl0ZW1zO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3NldFZpc2libGVDb2x1bW5zKCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHByb3RlY3RlZCBfc2hvd0ZpbHRlclNldHRpbmcoc2VsZWN0ZWRDb2x1bW46IFJlcG9ydFZpZXdDb2x1bW4pOiB2b2lkIHtcclxuICAgICAgICBjb25zdCB0eXBlRGVmSWQgPSB0aGlzLl90eXBlRGVmSWQ7XHJcbiAgICAgICAgY29uc3QgY29udHJvbHNJbmZvJCA9IHRoaXMuX3Vsdk1haW5TZXJ2aWNlLmxvYWRNZXRhQ29uZGl0aW9uc0NvbnRyb2xJbmZvcyhcclxuICAgICAgICAgICAgdHlwZURlZklkLFxyXG4gICAgICAgICAgICB0aGlzLmFsbENvbHVtbnMubWFwKChjKSA9PiBjLk5hbWUpXHJcbiAgICAgICAgKTtcclxuICAgICAgICBjb25zdCBjb25maWcgPSB7XHJcbiAgICAgICAgICAgIC4uLnRoaXMuZGlhbG9nQ29uZmlnLFxyXG4gICAgICAgICAgICBkYXRhOiB7XHJcbiAgICAgICAgICAgICAgICBjb250cm9sc0luZm8kLFxyXG4gICAgICAgICAgICAgICAgdHlwZURlZklkLFxyXG4gICAgICAgICAgICAgICAgc2VsZWN0ZWRDb2x1bW5OYW1lOiBzZWxlY3RlZENvbHVtbi5OYW1lLFxyXG4gICAgICAgICAgICAgICAgY29udGV4dDogdGhpcy5jb250ZXh0XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9O1xyXG4gICAgICAgIGNvbnN0IGRpYWxvZ1JlZiA9IHRoaXMuX2RpYWxvZ1NlcnZpY2Uub3BlbihVbHZGaWx0ZXJTZXR0aW5nc0NvbXBvbmVudCwgY29uZmlnKTtcclxuICAgICAgICBkaWFsb2dSZWYuYWZ0ZXJDbG9zZWQucGlwZSh0YWtlVW50aWwodGhpcy5fb25EZXN0cm95JCkpLnN1YnNjcmliZSgoc2V0dGluZykgPT4ge1xyXG4gICAgICAgICAgICBpZiAoc2V0dGluZykge1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICBwcm90ZWN0ZWQgX2FkZFNvcnRDb2x1bW4obmFtZTogYW55LCBzb3J0RGlyZWN0aW9uOiBzdHJpbmcsIGlzR3JvdXBlZCA9IGZhbHNlKTogdm9pZCB7XHJcbiAgICAgICAgY29uc3Qgc29ydEl0ZW0gPSB7XHJcbiAgICAgICAgICAgIE5hbWU6IG5hbWUsXHJcbiAgICAgICAgICAgIFNvcnREaXJlY3Rpb246IHNvcnREaXJlY3Rpb24sXHJcbiAgICAgICAgICAgIElzR3JvdXBlZDogaXNHcm91cGVkXHJcbiAgICAgICAgfTtcclxuICAgICAgICBjb25zdCBzZXR0aW5ncyA9IGdldEdyaWRTZXR0aW5ncyh0aGlzLmNvbnRleHQpO1xyXG4gICAgICAgIGNvbnN0IGV4aXN0U29ydEl0ZW1JbmRleCA9IHNldHRpbmdzLlNvcnRTZXR0aW5nTGlzdC5maW5kSW5kZXgoKGMpID0+IGMuTmFtZSA9PT0gbmFtZSk7XHJcbiAgICAgICAgaWYgKGV4aXN0U29ydEl0ZW1JbmRleCA+IC0xKSB7XHJcbiAgICAgICAgICAgIHNldHRpbmdzLlNvcnRTZXR0aW5nTGlzdFtleGlzdFNvcnRJdGVtSW5kZXhdID0gc29ydEl0ZW07XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgc2V0dGluZ3MuU29ydFNldHRpbmdMaXN0LnB1c2goc29ydEl0ZW0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLnVwZGF0ZUdyaWRTZXR0aW5nKHNldHRpbmdzLCB0cnVlKTtcclxuICAgIH1cclxufVxyXG4iXX0=