@grafana/scenes 6.7.0 → 6.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (331) hide show
  1. package/CHANGELOG.md +13 -0
  2. package/dist/esm/components/layout/CSSGrid/SceneCSSGridItem.js +33 -0
  3. package/dist/esm/dist/esm/behaviors/CursorSync.js +76 -0
  4. package/dist/esm/dist/esm/behaviors/LiveNowTimer.js +44 -0
  5. package/dist/esm/dist/esm/behaviors/SceneQueryController.js +14 -0
  6. package/dist/esm/dist/esm/components/EmbeddedScene.js +59 -0
  7. package/dist/esm/dist/esm/components/NestedScene.js +95 -0
  8. package/dist/esm/dist/esm/components/SceneApp/SceneApp.js +27 -0
  9. package/dist/esm/dist/esm/components/SceneApp/SceneAppPage.js +176 -0
  10. package/dist/esm/dist/esm/components/SceneApp/SceneAppPageView.js +104 -0
  11. package/dist/esm/dist/esm/components/SceneApp/utils.js +42 -0
  12. package/dist/esm/dist/esm/components/SceneByFrameRepeater.js +41 -0
  13. package/dist/esm/dist/esm/components/SceneByVariableRepeater.js +55 -0
  14. package/dist/esm/dist/esm/components/SceneCanvasText.js +32 -0
  15. package/dist/esm/dist/esm/components/SceneControlsSpacer.js +17 -0
  16. package/dist/esm/dist/esm/components/SceneDebugger/DebugDetails.js +82 -0
  17. package/dist/esm/dist/esm/components/SceneDebugger/DebugTreeNode.js +72 -0
  18. package/dist/esm/dist/esm/components/SceneDebugger/SceneDebugger.js +77 -0
  19. package/dist/esm/dist/esm/components/SceneReactObject.js +34 -0
  20. package/dist/esm/dist/esm/components/SceneRefreshPicker.js +205 -0
  21. package/dist/esm/dist/esm/components/SceneTimePicker.js +139 -0
  22. package/dist/esm/dist/esm/components/SceneTimeRangeCompare.js +240 -0
  23. package/dist/esm/dist/esm/components/SceneToolbarButton.js +33 -0
  24. package/dist/esm/dist/esm/components/VizPanel/VizPanel.js +406 -0
  25. package/dist/esm/dist/esm/components/VizPanel/VizPanelExploreButton.js +44 -0
  26. package/dist/esm/dist/esm/components/VizPanel/VizPanelMenu.js +59 -0
  27. package/dist/esm/dist/esm/components/VizPanel/VizPanelRenderer.js +285 -0
  28. package/dist/esm/dist/esm/components/VizPanel/VizPanelSeriesLimit.js +45 -0
  29. package/dist/esm/dist/esm/components/VizPanel/colorSeriesConfigFactory.js +72 -0
  30. package/dist/esm/dist/esm/components/VizPanel/registerRuntimePanelPlugin.js +11 -0
  31. package/dist/esm/dist/esm/components/VizPanel/seriesVisibilityConfigFactory.js +164 -0
  32. package/dist/esm/dist/esm/components/layout/CSSGrid/SceneCSSGridLayout.js +124 -0
  33. package/dist/esm/dist/esm/components/layout/LazyLoader.js +103 -0
  34. package/dist/esm/dist/esm/components/layout/SceneFlexLayout.js +135 -0
  35. package/dist/esm/dist/esm/components/layout/grid/SceneGridItem.js +30 -0
  36. package/dist/esm/dist/esm/components/layout/grid/SceneGridLayout.js +283 -0
  37. package/dist/esm/dist/esm/components/layout/grid/SceneGridLayoutRenderer.js +178 -0
  38. package/dist/esm/dist/esm/components/layout/grid/SceneGridRow.js +190 -0
  39. package/dist/esm/dist/esm/components/layout/grid/constants.js +7 -0
  40. package/dist/esm/dist/esm/components/layout/grid/utils.js +36 -0
  41. package/dist/esm/dist/esm/components/layout/split/SplitLayout.js +17 -0
  42. package/dist/esm/dist/esm/components/layout/split/SplitLayoutRenderer.js +29 -0
  43. package/dist/esm/dist/esm/components/layout/split/Splitter.js +386 -0
  44. package/dist/esm/dist/esm/core/SceneComponentWrapper.js +57 -0
  45. package/dist/esm/dist/esm/core/SceneDataNode.js +43 -0
  46. package/dist/esm/dist/esm/core/SceneObjectBase.js +286 -0
  47. package/dist/esm/dist/esm/core/SceneObjectRef.js +32 -0
  48. package/dist/esm/dist/esm/core/SceneTimeRange.js +231 -0
  49. package/dist/esm/dist/esm/core/events.js +11 -0
  50. package/dist/esm/dist/esm/core/sceneGraph/getTimeRange.js +10 -0
  51. package/dist/esm/dist/esm/core/sceneGraph/index.js +25 -0
  52. package/dist/esm/dist/esm/core/sceneGraph/sceneGraph.js +178 -0
  53. package/dist/esm/dist/esm/core/sceneGraph/utils.js +64 -0
  54. package/dist/esm/dist/esm/core/types.js +15 -0
  55. package/dist/esm/dist/esm/querying/DataLayersMerger.js +46 -0
  56. package/dist/esm/dist/esm/querying/ExtraQueryProvider.js +6 -0
  57. package/dist/esm/dist/esm/querying/RuntimeDataSource.js +6 -0
  58. package/dist/esm/dist/esm/querying/SceneDataLayerSet.js +100 -0
  59. package/dist/esm/dist/esm/querying/SceneQueryRunner.js +468 -0
  60. package/dist/esm/dist/esm/querying/extraQueryProcessingOperator.js +46 -0
  61. package/dist/esm/dist/esm/querying/getEnrichedDataRequest.js +12 -0
  62. package/dist/esm/dist/esm/querying/layers/SceneDataLayerBase.js +112 -0
  63. package/dist/esm/dist/esm/querying/layers/SceneDataLayerControls.js +51 -0
  64. package/dist/esm/dist/esm/querying/layers/annotations/AnnotationsDataLayer.js +130 -0
  65. package/dist/esm/dist/esm/querying/layers/annotations/filterAnnotations.js +85 -0
  66. package/dist/esm/dist/esm/querying/layers/annotations/standardAnnotationQuery.js +121 -0
  67. package/dist/esm/dist/esm/querying/layers/annotations/standardAnnotationsSupport.js +211 -0
  68. package/dist/esm/dist/esm/querying/layers/annotations/utils.js +77 -0
  69. package/dist/esm/dist/esm/querying/registerQueryWithController.js +41 -0
  70. package/dist/esm/dist/esm/services/SceneObjectUrlSyncConfig.js +30 -0
  71. package/dist/esm/dist/esm/services/UniqueUrlKeyMapper.js +45 -0
  72. package/dist/esm/dist/esm/services/UrlSyncManager.js +167 -0
  73. package/dist/esm/dist/esm/services/useUrlSync.js +29 -0
  74. package/dist/esm/dist/esm/services/utils.js +71 -0
  75. package/dist/esm/dist/esm/utils/ControlsLabel.js +107 -0
  76. package/dist/esm/dist/esm/utils/LoadingIndicator.js +19 -0
  77. package/dist/esm/dist/esm/utils/SafeSerializableSceneObject.js +39 -0
  78. package/dist/esm/dist/esm/utils/compatibility/setWindowGrafanaSceneContext.js +16 -0
  79. package/dist/esm/dist/esm/utils/date.js +15 -0
  80. package/dist/esm/dist/esm/utils/evaluateTimeRange.js +16 -0
  81. package/dist/esm/dist/esm/utils/explore.js +47 -0
  82. package/dist/esm/dist/esm/utils/getCompareSeriesRefId.js +4 -0
  83. package/dist/esm/dist/esm/utils/getDataSource.js +18 -0
  84. package/dist/esm/dist/esm/utils/getMessageFromError.js +24 -0
  85. package/dist/esm/dist/esm/utils/metricTree.js +53 -0
  86. package/dist/esm/dist/esm/utils/parseUrlParam.js +41 -0
  87. package/dist/esm/dist/esm/utils/utils.js +11 -0
  88. package/dist/esm/dist/esm/utils/wrapInSafeSerializableSceneObject.js +30 -0
  89. package/dist/esm/dist/esm/utils/writeSceneLog.js +12 -0
  90. package/dist/esm/dist/esm/variables/VariableDependencyConfig.js +150 -0
  91. package/dist/esm/dist/esm/variables/VariableValueRecorder.js +71 -0
  92. package/dist/esm/dist/esm/variables/adhoc/AdHocFilterBuilder.js +24 -0
  93. package/dist/esm/dist/esm/variables/adhoc/AdHocFilterRenderer.js +303 -0
  94. package/dist/esm/dist/esm/variables/adhoc/AdHocFiltersCombobox/AdHocFilterPill.js +162 -0
  95. package/dist/esm/dist/esm/variables/adhoc/AdHocFiltersCombobox/AdHocFiltersAlwaysWipCombobox.js +20 -0
  96. package/dist/esm/dist/esm/variables/adhoc/AdHocFiltersCombobox/AdHocFiltersCombobox.js +640 -0
  97. package/dist/esm/dist/esm/variables/adhoc/AdHocFiltersCombobox/AdHocFiltersComboboxRenderer.js +65 -0
  98. package/dist/esm/dist/esm/variables/adhoc/AdHocFiltersCombobox/DropdownItem.js +146 -0
  99. package/dist/esm/dist/esm/variables/adhoc/AdHocFiltersCombobox/MultiValuePill.js +114 -0
  100. package/dist/esm/dist/esm/variables/adhoc/AdHocFiltersCombobox/useFloatingInteractions.js +68 -0
  101. package/dist/esm/dist/esm/variables/adhoc/AdHocFiltersCombobox/utils.js +146 -0
  102. package/dist/esm/dist/esm/variables/adhoc/AdHocFiltersVariable.js +289 -0
  103. package/dist/esm/dist/esm/variables/adhoc/AdHocFiltersVariableUrlSyncHandler.js +76 -0
  104. package/dist/esm/dist/esm/variables/adhoc/getAdhocOptionSearcher.js +13 -0
  105. package/dist/esm/dist/esm/variables/adhoc/patchGetAdhocFilters.js +47 -0
  106. package/dist/esm/dist/esm/variables/components/VariableValueControl.js +23 -0
  107. package/dist/esm/dist/esm/variables/components/VariableValueInput.js +33 -0
  108. package/dist/esm/dist/esm/variables/components/VariableValueSelect.js +228 -0
  109. package/dist/esm/dist/esm/variables/components/VariableValueSelectors.js +72 -0
  110. package/dist/esm/dist/esm/variables/components/getOptionSearcher.js +15 -0
  111. package/dist/esm/dist/esm/variables/constants.js +9 -0
  112. package/dist/esm/dist/esm/variables/getEnrichedFiltersRequest.js +12 -0
  113. package/dist/esm/dist/esm/variables/groupby/GroupByVariable.js +259 -0
  114. package/dist/esm/dist/esm/variables/groupby/GroupByVariableUrlSyncHandler.js +63 -0
  115. package/dist/esm/dist/esm/variables/groupby/findActiveGroupByVariablesByUid.js +13 -0
  116. package/dist/esm/dist/esm/variables/interpolation/ScopedVarsVariable.js +40 -0
  117. package/dist/esm/dist/esm/variables/interpolation/defaults.js +21 -0
  118. package/dist/esm/dist/esm/variables/interpolation/fieldAccessorCache.js +13 -0
  119. package/dist/esm/dist/esm/variables/interpolation/formatRegistry.js +296 -0
  120. package/dist/esm/dist/esm/variables/interpolation/sceneInterpolator.js +87 -0
  121. package/dist/esm/dist/esm/variables/lookupVariable.js +20 -0
  122. package/dist/esm/dist/esm/variables/macros/AllVariablesMacro.js +57 -0
  123. package/dist/esm/dist/esm/variables/macros/contextMacros.js +43 -0
  124. package/dist/esm/dist/esm/variables/macros/dataMacros.js +134 -0
  125. package/dist/esm/dist/esm/variables/macros/index.js +26 -0
  126. package/dist/esm/dist/esm/variables/macros/templateProxies.js +51 -0
  127. package/dist/esm/dist/esm/variables/macros/timeMacros.js +86 -0
  128. package/dist/esm/dist/esm/variables/macros/types.js +11 -0
  129. package/dist/esm/dist/esm/variables/macros/urlMacros.js +56 -0
  130. package/dist/esm/dist/esm/variables/sets/SceneVariableSet.js +254 -0
  131. package/dist/esm/dist/esm/variables/types.js +11 -0
  132. package/dist/esm/dist/esm/variables/utils.js +172 -0
  133. package/dist/esm/dist/esm/variables/variants/ConstantVariable.js +38 -0
  134. package/dist/esm/dist/esm/variables/variants/CustomVariable.js +60 -0
  135. package/dist/esm/dist/esm/variables/variants/DataSourceVariable.js +88 -0
  136. package/dist/esm/dist/esm/variables/variants/IntervalVariable.js +117 -0
  137. package/dist/esm/dist/esm/variables/variants/MultiValueVariable.js +295 -0
  138. package/dist/esm/dist/esm/variables/variants/TestVariable.js +117 -0
  139. package/dist/esm/dist/esm/variables/variants/TextBoxVariable.js +61 -0
  140. package/dist/esm/dist/esm/variables/variants/query/QueryVariable.js +139 -0
  141. package/dist/esm/dist/esm/variables/variants/query/createQueryVariableRunner.js +129 -0
  142. package/dist/esm/dist/esm/variables/variants/query/guards.js +28 -0
  143. package/dist/esm/dist/esm/variables/variants/query/toMetricFindValues.js +96 -0
  144. package/dist/esm/dist/esm/variables/variants/query/utils.js +124 -0
  145. package/dist/esm/index.js +1 -1
  146. package/dist/esm/index.js.map +1 -1
  147. package/dist/esm/querying/DataProviderSharer.js +39 -0
  148. package/dist/esm/src/behaviors/ActWhenVariableChanged.js +27 -0
  149. package/dist/esm/src/behaviors/CursorSync.js +76 -0
  150. package/dist/esm/src/behaviors/LiveNowTimer.js +44 -0
  151. package/dist/esm/src/behaviors/SceneQueryController.js +60 -0
  152. package/dist/esm/src/behaviors/index.js +5 -0
  153. package/dist/esm/src/components/EmbeddedScene.js +59 -0
  154. package/dist/esm/src/components/NestedScene.js +95 -0
  155. package/dist/esm/src/components/SceneApp/SceneApp.js +37 -0
  156. package/dist/esm/src/components/SceneApp/SceneAppPage.js +176 -0
  157. package/dist/esm/src/components/SceneApp/SceneAppPageView.js +104 -0
  158. package/dist/esm/src/components/SceneApp/utils.js +42 -0
  159. package/dist/esm/src/components/SceneByFrameRepeater.js +41 -0
  160. package/dist/esm/src/components/SceneByVariableRepeater.js +55 -0
  161. package/dist/esm/src/components/SceneCanvasText.js +32 -0
  162. package/dist/esm/src/components/SceneControlsSpacer.js +17 -0
  163. package/dist/esm/src/components/SceneDebugger/DebugDetails.js +82 -0
  164. package/dist/esm/src/components/SceneDebugger/DebugTreeNode.js +72 -0
  165. package/dist/esm/src/components/SceneDebugger/SceneDebugger.js +77 -0
  166. package/dist/esm/src/components/SceneReactObject.js +34 -0
  167. package/dist/esm/src/components/SceneRefreshPicker.js +205 -0
  168. package/dist/esm/src/components/SceneTimePicker.js +139 -0
  169. package/dist/esm/src/components/SceneTimeRangeCompare.js +240 -0
  170. package/dist/esm/src/components/SceneToolbarButton.js +33 -0
  171. package/dist/esm/src/components/VizPanel/VizPanel.js +406 -0
  172. package/dist/esm/src/components/VizPanel/VizPanelExploreButton.js +44 -0
  173. package/dist/esm/src/components/VizPanel/VizPanelMenu.js +59 -0
  174. package/dist/esm/src/components/VizPanel/VizPanelRenderer.js +285 -0
  175. package/dist/esm/src/components/VizPanel/VizPanelSeriesLimit.js +45 -0
  176. package/dist/esm/src/components/VizPanel/colorSeriesConfigFactory.js +72 -0
  177. package/dist/esm/src/components/VizPanel/registerRuntimePanelPlugin.js +56 -0
  178. package/dist/esm/src/components/VizPanel/seriesVisibilityConfigFactory.js +164 -0
  179. package/dist/esm/src/components/layout/CSSGrid/SceneCSSGridLayout.js +124 -0
  180. package/dist/esm/src/components/layout/LazyLoader.js +103 -0
  181. package/dist/esm/src/components/layout/SceneFlexLayout.js +135 -0
  182. package/dist/esm/src/components/layout/grid/SceneGridItem.js +30 -0
  183. package/dist/esm/src/components/layout/grid/SceneGridLayout.js +283 -0
  184. package/dist/esm/src/components/layout/grid/SceneGridLayoutRenderer.js +178 -0
  185. package/dist/esm/src/components/layout/grid/SceneGridRow.js +190 -0
  186. package/dist/esm/src/components/layout/grid/constants.js +7 -0
  187. package/dist/esm/src/components/layout/grid/utils.js +36 -0
  188. package/dist/esm/src/components/layout/split/SplitLayout.js +17 -0
  189. package/dist/esm/src/components/layout/split/SplitLayoutRenderer.js +29 -0
  190. package/dist/esm/src/components/layout/split/Splitter.js +386 -0
  191. package/dist/esm/src/core/PanelBuilders/FieldConfigBuilder.js +100 -0
  192. package/dist/esm/src/core/PanelBuilders/FieldConfigBuilders.js +75 -0
  193. package/dist/esm/src/core/PanelBuilders/FieldConfigOverridesBuilder.js +75 -0
  194. package/dist/esm/src/core/PanelBuilders/PanelOptionsBuilder.js +22 -0
  195. package/dist/esm/src/core/PanelBuilders/PanelOptionsBuilders.js +85 -0
  196. package/dist/esm/src/core/PanelBuilders/StandardFieldConfigBuilders.js +52 -0
  197. package/dist/esm/src/core/PanelBuilders/VizConfigBuilder.js +78 -0
  198. package/dist/esm/src/core/PanelBuilders/VizConfigBuilders.js +114 -0
  199. package/dist/esm/src/core/PanelBuilders/VizPanelBuilder.js +162 -0
  200. package/dist/esm/src/core/PanelBuilders/index.js +116 -0
  201. package/dist/esm/src/core/SceneComponentWrapper.js +57 -0
  202. package/dist/esm/src/core/SceneDataNode.js +43 -0
  203. package/dist/esm/src/core/SceneObjectBase.js +286 -0
  204. package/dist/esm/src/core/SceneObjectRef.js +32 -0
  205. package/dist/esm/src/core/SceneTimeRange.js +231 -0
  206. package/dist/esm/src/core/SceneTimeRangeTransformerBase.js +35 -0
  207. package/dist/esm/src/core/SceneTimeZoneOverride.js +63 -0
  208. package/dist/esm/src/core/events.js +11 -0
  209. package/dist/esm/src/core/sceneGraph/getTimeRange.js +10 -0
  210. package/dist/esm/src/core/sceneGraph/index.js +25 -0
  211. package/dist/esm/src/core/sceneGraph/sceneGraph.js +178 -0
  212. package/dist/esm/src/core/sceneGraph/utils.js +64 -0
  213. package/dist/esm/src/core/types.js +15 -0
  214. package/dist/esm/src/index.js +108 -0
  215. package/dist/esm/src/querying/DataLayersMerger.js +46 -0
  216. package/dist/esm/src/querying/DataProviderProxy.js +37 -0
  217. package/dist/esm/src/querying/DataProviderSharer.js +108 -0
  218. package/dist/esm/src/querying/ExtraQueryProvider.js +6 -0
  219. package/dist/esm/src/querying/RuntimeDataSource.js +49 -0
  220. package/dist/esm/src/querying/SceneDataLayerSet.js +100 -0
  221. package/dist/esm/src/querying/SceneDataTransformer.js +178 -0
  222. package/dist/esm/src/querying/SceneQueryRunner.js +468 -0
  223. package/dist/esm/src/querying/extraQueryProcessingOperator.js +46 -0
  224. package/dist/esm/src/querying/getEnrichedDataRequest.js +12 -0
  225. package/dist/esm/src/querying/layers/SceneDataLayerBase.js +112 -0
  226. package/dist/esm/src/querying/layers/SceneDataLayerControls.js +51 -0
  227. package/dist/esm/src/querying/layers/annotations/AnnotationsDataLayer.js +130 -0
  228. package/dist/esm/src/querying/layers/annotations/filterAnnotations.js +85 -0
  229. package/dist/esm/src/querying/layers/annotations/standardAnnotationQuery.js +121 -0
  230. package/dist/esm/src/querying/layers/annotations/standardAnnotationsSupport.js +211 -0
  231. package/dist/esm/src/querying/layers/annotations/utils.js +77 -0
  232. package/dist/esm/src/querying/layers/index.js +2 -0
  233. package/dist/esm/src/querying/registerQueryWithController.js +41 -0
  234. package/dist/esm/src/services/SceneObjectUrlSyncConfig.js +30 -0
  235. package/dist/esm/src/services/UniqueUrlKeyMapper.js +45 -0
  236. package/dist/esm/src/services/UrlSyncContextProvider.js +17 -0
  237. package/dist/esm/src/services/UrlSyncManager.js +167 -0
  238. package/dist/esm/src/services/useUrlSync.js +29 -0
  239. package/dist/esm/src/services/utils.js +75 -0
  240. package/dist/esm/src/utils/ControlsLabel.js +107 -0
  241. package/dist/esm/src/utils/LoadingIndicator.js +19 -0
  242. package/dist/esm/src/utils/SafeSerializableSceneObject.js +39 -0
  243. package/dist/esm/src/utils/compatibility/setWindowGrafanaSceneContext.js +16 -0
  244. package/dist/esm/src/utils/date.js +15 -0
  245. package/dist/esm/src/utils/evaluateTimeRange.js +16 -0
  246. package/dist/esm/src/utils/explore.js +47 -0
  247. package/dist/esm/src/utils/getCompareSeriesRefId.js +4 -0
  248. package/dist/esm/src/utils/getDataSource.js +18 -0
  249. package/dist/esm/src/utils/getMessageFromError.js +24 -0
  250. package/dist/esm/src/utils/metricTree.js +53 -0
  251. package/dist/esm/src/utils/parseUrlParam.js +41 -0
  252. package/dist/esm/src/utils/utils.js +11 -0
  253. package/dist/esm/src/utils/wrapInSafeSerializableSceneObject.js +30 -0
  254. package/dist/esm/src/utils/writeSceneLog.js +12 -0
  255. package/dist/esm/src/variables/VariableDependencyConfig.js +150 -0
  256. package/dist/esm/src/variables/VariableValueRecorder.js +71 -0
  257. package/dist/esm/src/variables/adhoc/AdHocFilterBuilder.js +24 -0
  258. package/dist/esm/src/variables/adhoc/AdHocFilterRenderer.js +303 -0
  259. package/dist/esm/src/variables/adhoc/AdHocFiltersCombobox/AdHocFilterPill.js +162 -0
  260. package/dist/esm/src/variables/adhoc/AdHocFiltersCombobox/AdHocFiltersAlwaysWipCombobox.js +20 -0
  261. package/dist/esm/src/variables/adhoc/AdHocFiltersCombobox/AdHocFiltersCombobox.js +640 -0
  262. package/dist/esm/src/variables/adhoc/AdHocFiltersCombobox/AdHocFiltersComboboxRenderer.js +65 -0
  263. package/dist/esm/src/variables/adhoc/AdHocFiltersCombobox/DropdownItem.js +146 -0
  264. package/dist/esm/src/variables/adhoc/AdHocFiltersCombobox/MultiValuePill.js +114 -0
  265. package/dist/esm/src/variables/adhoc/AdHocFiltersCombobox/useFloatingInteractions.js +68 -0
  266. package/dist/esm/src/variables/adhoc/AdHocFiltersCombobox/utils.js +146 -0
  267. package/dist/esm/src/variables/adhoc/AdHocFiltersVariable.js +289 -0
  268. package/dist/esm/src/variables/adhoc/AdHocFiltersVariableUrlSyncHandler.js +76 -0
  269. package/dist/esm/src/variables/adhoc/getAdhocOptionSearcher.js +13 -0
  270. package/dist/esm/src/variables/adhoc/patchGetAdhocFilters.js +47 -0
  271. package/dist/esm/src/variables/components/VariableValueControl.js +23 -0
  272. package/dist/esm/src/variables/components/VariableValueInput.js +33 -0
  273. package/dist/esm/src/variables/components/VariableValueSelect.js +228 -0
  274. package/dist/esm/src/variables/components/VariableValueSelectors.js +72 -0
  275. package/dist/esm/src/variables/components/getOptionSearcher.js +15 -0
  276. package/dist/esm/src/variables/constants.js +9 -0
  277. package/dist/esm/src/variables/getEnrichedFiltersRequest.js +12 -0
  278. package/dist/esm/src/variables/groupby/GroupByVariable.js +259 -0
  279. package/dist/esm/src/variables/groupby/GroupByVariableUrlSyncHandler.js +63 -0
  280. package/dist/esm/src/variables/groupby/findActiveGroupByVariablesByUid.js +13 -0
  281. package/dist/esm/src/variables/interpolation/ScopedVarsVariable.js +40 -0
  282. package/dist/esm/src/variables/interpolation/defaults.js +21 -0
  283. package/dist/esm/src/variables/interpolation/fieldAccessorCache.js +13 -0
  284. package/dist/esm/src/variables/interpolation/formatRegistry.js +296 -0
  285. package/dist/esm/src/variables/interpolation/sceneInterpolator.js +87 -0
  286. package/dist/esm/src/variables/lookupVariable.js +20 -0
  287. package/dist/esm/src/variables/macros/AllVariablesMacro.js +57 -0
  288. package/dist/esm/src/variables/macros/contextMacros.js +43 -0
  289. package/dist/esm/src/variables/macros/dataMacros.js +134 -0
  290. package/dist/esm/src/variables/macros/index.js +35 -0
  291. package/dist/esm/src/variables/macros/templateProxies.js +51 -0
  292. package/dist/esm/src/variables/macros/timeMacros.js +86 -0
  293. package/dist/esm/src/variables/macros/types.js +11 -0
  294. package/dist/esm/src/variables/macros/urlMacros.js +56 -0
  295. package/dist/esm/src/variables/sets/SceneVariableSet.js +254 -0
  296. package/dist/esm/src/variables/types.js +11 -0
  297. package/dist/esm/src/variables/utils.js +172 -0
  298. package/dist/esm/src/variables/variants/ConstantVariable.js +38 -0
  299. package/dist/esm/src/variables/variants/CustomVariable.js +60 -0
  300. package/dist/esm/src/variables/variants/DataSourceVariable.js +88 -0
  301. package/dist/esm/src/variables/variants/IntervalVariable.js +117 -0
  302. package/dist/esm/src/variables/variants/JsonVariable.js +193 -0
  303. package/dist/esm/src/variables/variants/LocalValueVariable.js +56 -0
  304. package/dist/esm/src/variables/variants/MultiValueVariable.js +295 -0
  305. package/dist/esm/src/variables/variants/TestVariable.js +117 -0
  306. package/dist/esm/src/variables/variants/TextBoxVariable.js +61 -0
  307. package/dist/esm/src/variables/variants/guards.js +27 -0
  308. package/dist/esm/src/variables/variants/query/QueryVariable.js +139 -0
  309. package/dist/esm/src/variables/variants/query/createQueryVariableRunner.js +129 -0
  310. package/dist/esm/src/variables/variants/query/guards.js +28 -0
  311. package/dist/esm/src/variables/variants/query/toMetricFindValues.js +96 -0
  312. package/dist/esm/src/variables/variants/query/utils.js +124 -0
  313. package/dist/esm/variables/components/VariableValueSelect.js +13 -9
  314. package/dist/esm/variables/components/VariableValueSelect.js.map +1 -1
  315. package/dist/esm/variables/variants/ConstantVariable.js +22 -0
  316. package/dist/esm/variables/variants/ConstantVariable.js.map +1 -1
  317. package/dist/esm/variables/variants/CustomVariable.js +3 -2
  318. package/dist/esm/variables/variants/CustomVariable.js.map +1 -1
  319. package/dist/esm/variables/variants/DataSourceVariable.js +3 -2
  320. package/dist/esm/variables/variants/DataSourceVariable.js.map +1 -1
  321. package/dist/esm/variables/variants/JsonVariable.js +96 -0
  322. package/dist/esm/variables/variants/TestVariable.js +3 -2
  323. package/dist/esm/variables/variants/TestVariable.js.map +1 -1
  324. package/dist/esm/variables/variants/json/JsonVariable.js +95 -0
  325. package/dist/esm/variables/variants/json/JsonVariableOptionProviders.js +70 -0
  326. package/dist/esm/variables/variants/query/QueryVariable.js +3 -2
  327. package/dist/esm/variables/variants/query/QueryVariable.js.map +1 -1
  328. package/dist/index.d.ts +14 -6
  329. package/dist/index.js +35 -13
  330. package/dist/index.js.map +1 -1
  331. package/package.json +2 -2
@@ -0,0 +1,406 @@
1
+ import { toUtc, getPanelOptionsWithDefaults, renderMarkdown, applyFieldOverrides, compareArrayValues, compareDataFrameStructures, CoreApp, DashboardCursorSync, PanelPlugin, PluginType } from '@grafana/data';
2
+ import { getPluginImportUtils, config, getAppEvents } from '@grafana/runtime';
3
+ import { SceneObjectBase } from '../../core/SceneObjectBase.js';
4
+ import { sceneGraph } from '../../core/sceneGraph/index.js';
5
+ import { VizPanelRenderer } from './VizPanelRenderer.js';
6
+ import { VariableDependencyConfig } from '../../variables/VariableDependencyConfig.js';
7
+ import { seriesVisibilityConfigFactory } from './seriesVisibilityConfigFactory.js';
8
+ import { emptyPanelData } from '../../core/SceneDataNode.js';
9
+ import { changeSeriesColorConfigFactory } from './colorSeriesConfigFactory.js';
10
+ import { loadPanelPluginSync } from './registerRuntimePanelPlugin.js';
11
+ import { getCursorSyncScope } from '../../behaviors/CursorSync.js';
12
+ import { mergeWith, cloneDeep, isArray, merge, isEmpty } from 'lodash';
13
+ import { UserActionEvent } from '../../core/events.js';
14
+ import { evaluateTimeRange } from '../../utils/evaluateTimeRange.js';
15
+ import { LiveNowTimer } from '../../behaviors/LiveNowTimer.js';
16
+
17
+ var __defProp = Object.defineProperty;
18
+ var __defProps = Object.defineProperties;
19
+ var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
20
+ var __getOwnPropSymbols = Object.getOwnPropertySymbols;
21
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
22
+ var __propIsEnum = Object.prototype.propertyIsEnumerable;
23
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
24
+ var __spreadValues = (a, b) => {
25
+ for (var prop in b || (b = {}))
26
+ if (__hasOwnProp.call(b, prop))
27
+ __defNormalProp(a, prop, b[prop]);
28
+ if (__getOwnPropSymbols)
29
+ for (var prop of __getOwnPropSymbols(b)) {
30
+ if (__propIsEnum.call(b, prop))
31
+ __defNormalProp(a, prop, b[prop]);
32
+ }
33
+ return a;
34
+ };
35
+ var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
36
+ class VizPanel extends SceneObjectBase {
37
+ constructor(state) {
38
+ var _a;
39
+ super(__spreadValues({
40
+ options: {},
41
+ fieldConfig: { defaults: {}, overrides: [] },
42
+ title: "Title",
43
+ pluginId: "timeseries",
44
+ _renderCounter: 0
45
+ }, state));
46
+ this._variableDependency = new VariableDependencyConfig(this, {
47
+ statePaths: ["title", "options", "fieldConfig"]
48
+ });
49
+ this._structureRev = 0;
50
+ this.onTimeRangeChange = (timeRange) => {
51
+ const sceneTimeRange = sceneGraph.getTimeRange(this);
52
+ sceneTimeRange.onTimeRangeChange({
53
+ raw: {
54
+ from: toUtc(timeRange.from),
55
+ to: toUtc(timeRange.to)
56
+ },
57
+ from: toUtc(timeRange.from),
58
+ to: toUtc(timeRange.to)
59
+ });
60
+ };
61
+ this.getTimeRange = (data) => {
62
+ const liveNowTimer = sceneGraph.findObject(this, (o) => o instanceof LiveNowTimer);
63
+ const sceneTimeRange = sceneGraph.getTimeRange(this);
64
+ if (liveNowTimer instanceof LiveNowTimer && liveNowTimer.isEnabled) {
65
+ return evaluateTimeRange(
66
+ sceneTimeRange.state.from,
67
+ sceneTimeRange.state.to,
68
+ sceneTimeRange.getTimeZone(),
69
+ sceneTimeRange.state.fiscalYearStartMonth,
70
+ sceneTimeRange.state.UNSAFE_nowDelay
71
+ );
72
+ }
73
+ const plugin = this.getPlugin();
74
+ if (plugin && !plugin.meta.skipDataQuery && data && data.timeRange) {
75
+ return data.timeRange;
76
+ }
77
+ return sceneTimeRange.state.value;
78
+ };
79
+ this.onTitleChange = (title) => {
80
+ this.setState({ title });
81
+ };
82
+ this.onDescriptionChange = (description) => {
83
+ this.setState({ description });
84
+ };
85
+ this.onDisplayModeChange = (displayMode) => {
86
+ this.setState({ displayMode });
87
+ };
88
+ this.onToggleCollapse = (collapsed) => {
89
+ this.setState({
90
+ collapsed
91
+ });
92
+ };
93
+ this.onOptionsChange = (optionsUpdate, replace = false, isAfterPluginChange = false) => {
94
+ var _a;
95
+ const { fieldConfig, options } = this.state;
96
+ const nextOptions = replace ? optionsUpdate : mergeWith(cloneDeep(options), optionsUpdate, (objValue, srcValue, key, obj) => {
97
+ if (isArray(srcValue)) {
98
+ return srcValue;
99
+ }
100
+ if (objValue !== srcValue && typeof srcValue === "undefined") {
101
+ obj[key] = srcValue;
102
+ return;
103
+ }
104
+ return;
105
+ });
106
+ const withDefaults = getPanelOptionsWithDefaults({
107
+ plugin: this._plugin,
108
+ currentOptions: nextOptions,
109
+ currentFieldConfig: fieldConfig,
110
+ isAfterPluginChange
111
+ });
112
+ this.setState({
113
+ options: withDefaults.options,
114
+ _renderCounter: ((_a = this.state._renderCounter) != null ? _a : 0) + 1
115
+ });
116
+ };
117
+ this.onFieldConfigChange = (fieldConfigUpdate, replace) => {
118
+ const { fieldConfig, options } = this.state;
119
+ const nextFieldConfig = replace ? fieldConfigUpdate : merge(cloneDeep(fieldConfig), fieldConfigUpdate);
120
+ const withDefaults = getPanelOptionsWithDefaults({
121
+ plugin: this._plugin,
122
+ currentOptions: options,
123
+ currentFieldConfig: nextFieldConfig,
124
+ isAfterPluginChange: false
125
+ });
126
+ this._dataWithFieldConfig = void 0;
127
+ this.setState({ fieldConfig: withDefaults.fieldConfig });
128
+ };
129
+ this.interpolate = (value, scoped, format) => {
130
+ return sceneGraph.interpolate(this, value, scoped, format);
131
+ };
132
+ this.getDescription = () => {
133
+ this.publishEvent(new UserActionEvent({ origin: this, interaction: "panel-description-shown" }), true);
134
+ const { description } = this.state;
135
+ if (description) {
136
+ const markdown = this.interpolate(description);
137
+ return renderMarkdown(markdown);
138
+ }
139
+ return "";
140
+ };
141
+ this.onCancelQuery = () => {
142
+ var _a;
143
+ this.publishEvent(new UserActionEvent({ origin: this, interaction: "panel-cancel-query-clicked" }), true);
144
+ const data = sceneGraph.getData(this);
145
+ (_a = data.cancelQuery) == null ? void 0 : _a.call(data);
146
+ };
147
+ this.onStatusMessageClick = () => {
148
+ this.publishEvent(new UserActionEvent({ origin: this, interaction: "panel-status-message-clicked" }), true);
149
+ };
150
+ this._onSeriesColorChange = (label, color) => {
151
+ this.onFieldConfigChange(changeSeriesColorConfigFactory(label, color, this.state.fieldConfig));
152
+ };
153
+ this._onSeriesVisibilityChange = (label, mode) => {
154
+ if (!this._dataWithFieldConfig) {
155
+ return;
156
+ }
157
+ this.onFieldConfigChange(
158
+ seriesVisibilityConfigFactory(label, mode, this.state.fieldConfig, this._dataWithFieldConfig.series),
159
+ true
160
+ );
161
+ };
162
+ this._onInstanceStateChange = (state) => {
163
+ if (this._panelContext) {
164
+ this._panelContext = __spreadProps(__spreadValues({}, this._panelContext), {
165
+ instanceState: state
166
+ });
167
+ }
168
+ this.setState({ _pluginInstanceState: state });
169
+ };
170
+ this._onToggleLegendSort = (sortKey) => {
171
+ const legendOptions = this.state.options.legend;
172
+ if (!legendOptions) {
173
+ return;
174
+ }
175
+ let sortDesc = legendOptions.sortDesc;
176
+ let sortBy = legendOptions.sortBy;
177
+ if (sortKey !== sortBy) {
178
+ sortDesc = void 0;
179
+ }
180
+ if (sortDesc === false) {
181
+ sortBy = void 0;
182
+ sortDesc = void 0;
183
+ } else {
184
+ sortDesc = !sortDesc;
185
+ sortBy = sortKey;
186
+ }
187
+ this.onOptionsChange(
188
+ __spreadProps(__spreadValues({}, this.state.options), {
189
+ legend: __spreadProps(__spreadValues({}, legendOptions), { sortBy, sortDesc })
190
+ }),
191
+ true
192
+ );
193
+ };
194
+ this.addActivationHandler(() => {
195
+ this._onActivate();
196
+ });
197
+ (_a = state.menu) == null ? void 0 : _a.addActivationHandler(() => {
198
+ this.publishEvent(new UserActionEvent({ origin: this, interaction: "panel-menu-shown" }), true);
199
+ });
200
+ }
201
+ _onActivate() {
202
+ if (!this._plugin) {
203
+ this._loadPlugin(this.state.pluginId);
204
+ }
205
+ }
206
+ forceRender() {
207
+ var _a;
208
+ this.setState({ _renderCounter: ((_a = this.state._renderCounter) != null ? _a : 0) + 1 });
209
+ }
210
+ async _loadPlugin(pluginId, overwriteOptions, overwriteFieldConfig, isAfterPluginChange) {
211
+ const plugin = loadPanelPluginSync(pluginId);
212
+ if (plugin) {
213
+ this._pluginLoaded(plugin, overwriteOptions, overwriteFieldConfig, isAfterPluginChange);
214
+ } else {
215
+ const { importPanelPlugin } = getPluginImportUtils();
216
+ try {
217
+ const result = await importPanelPlugin(pluginId);
218
+ this._pluginLoaded(result, overwriteOptions, overwriteFieldConfig, isAfterPluginChange);
219
+ } catch (err) {
220
+ this._pluginLoaded(getPanelPluginNotFound(pluginId));
221
+ if (err instanceof Error) {
222
+ this.setState({ _pluginLoadError: err.message });
223
+ }
224
+ }
225
+ }
226
+ }
227
+ getLegacyPanelId() {
228
+ const panelId = parseInt(this.state.key.replace("panel-", ""), 10);
229
+ if (isNaN(panelId)) {
230
+ return 0;
231
+ }
232
+ return panelId;
233
+ }
234
+ async _pluginLoaded(plugin, overwriteOptions, overwriteFieldConfig, isAfterPluginChange) {
235
+ const { options, fieldConfig, title, pluginVersion, _UNSAFE_customMigrationHandler } = this.state;
236
+ const panel = {
237
+ title,
238
+ options,
239
+ fieldConfig,
240
+ id: this.getLegacyPanelId(),
241
+ type: plugin.meta.id,
242
+ pluginVersion
243
+ };
244
+ if (overwriteOptions) {
245
+ panel.options = overwriteOptions;
246
+ }
247
+ if (overwriteFieldConfig) {
248
+ panel.fieldConfig = overwriteFieldConfig;
249
+ }
250
+ const currentVersion = this._getPluginVersion(plugin);
251
+ _UNSAFE_customMigrationHandler == null ? void 0 : _UNSAFE_customMigrationHandler(panel, plugin);
252
+ if (plugin.onPanelMigration && currentVersion !== pluginVersion && !isAfterPluginChange) {
253
+ panel.options = await plugin.onPanelMigration(panel);
254
+ }
255
+ const withDefaults = getPanelOptionsWithDefaults({
256
+ plugin,
257
+ currentOptions: panel.options,
258
+ currentFieldConfig: panel.fieldConfig,
259
+ isAfterPluginChange: isAfterPluginChange != null ? isAfterPluginChange : false
260
+ });
261
+ this._plugin = plugin;
262
+ this.setState({
263
+ options: withDefaults.options,
264
+ fieldConfig: withDefaults.fieldConfig,
265
+ pluginVersion: currentVersion,
266
+ pluginId: plugin.meta.id
267
+ });
268
+ if (plugin.meta.skipDataQuery) {
269
+ const sceneTimeRange = sceneGraph.getTimeRange(this);
270
+ this._subs.add(sceneTimeRange.subscribeToState(() => this.forceRender()));
271
+ }
272
+ }
273
+ _getPluginVersion(plugin) {
274
+ return plugin && plugin.meta.info.version ? plugin.meta.info.version : config.buildInfo.version;
275
+ }
276
+ getPlugin() {
277
+ return this._plugin;
278
+ }
279
+ getPanelContext() {
280
+ var _a;
281
+ (_a = this._panelContext) != null ? _a : this._panelContext = this.buildPanelContext();
282
+ return this._panelContext;
283
+ }
284
+ async changePluginType(pluginId, newOptions, newFieldConfig) {
285
+ var _a, _b;
286
+ const { options: prevOptions, fieldConfig: prevFieldConfig, pluginId: prevPluginId } = this.state;
287
+ this._dataWithFieldConfig = void 0;
288
+ const isAfterPluginChange = this.state.pluginId !== pluginId;
289
+ await this._loadPlugin(pluginId, newOptions != null ? newOptions : {}, newFieldConfig, isAfterPluginChange);
290
+ const panel = {
291
+ title: this.state.title,
292
+ options: this.state.options,
293
+ fieldConfig: this.state.fieldConfig,
294
+ id: 1,
295
+ type: pluginId
296
+ };
297
+ const updatedOptions = (_b = (_a = this._plugin) == null ? void 0 : _a.onPanelTypeChanged) == null ? void 0 : _b.call(_a, panel, prevPluginId, prevOptions, prevFieldConfig);
298
+ if (updatedOptions && !isEmpty(updatedOptions)) {
299
+ this.onOptionsChange(updatedOptions, true, true);
300
+ }
301
+ }
302
+ clearFieldConfigCache() {
303
+ this._dataWithFieldConfig = void 0;
304
+ }
305
+ applyFieldConfig(rawData) {
306
+ var _a, _b, _c, _d;
307
+ const plugin = this._plugin;
308
+ if (!plugin || plugin.meta.skipDataQuery || !rawData) {
309
+ return emptyPanelData;
310
+ }
311
+ if (this._prevData === rawData && this._dataWithFieldConfig) {
312
+ return this._dataWithFieldConfig;
313
+ }
314
+ const pluginDataSupport = plugin.dataSupport || { alertStates: false, annotations: false };
315
+ const fieldConfigRegistry = plugin.fieldConfigRegistry;
316
+ const prevFrames = (_b = (_a = this._dataWithFieldConfig) == null ? void 0 : _a.series) != null ? _b : [];
317
+ const newFrames = applyFieldOverrides({
318
+ data: rawData.series,
319
+ fieldConfig: this.state.fieldConfig,
320
+ fieldConfigRegistry,
321
+ replaceVariables: this.interpolate,
322
+ theme: config.theme2,
323
+ timeZone: (_c = rawData.request) == null ? void 0 : _c.timezone
324
+ });
325
+ if (!compareArrayValues(newFrames, prevFrames, compareDataFrameStructures)) {
326
+ this._structureRev++;
327
+ }
328
+ this._dataWithFieldConfig = __spreadProps(__spreadValues({}, rawData), {
329
+ structureRev: this._structureRev,
330
+ series: newFrames
331
+ });
332
+ if (this._dataWithFieldConfig.annotations) {
333
+ this._dataWithFieldConfig.annotations = applyFieldOverrides({
334
+ data: this._dataWithFieldConfig.annotations,
335
+ fieldConfig: {
336
+ defaults: {},
337
+ overrides: []
338
+ },
339
+ fieldConfigRegistry,
340
+ replaceVariables: this.interpolate,
341
+ theme: config.theme2,
342
+ timeZone: (_d = rawData.request) == null ? void 0 : _d.timezone
343
+ });
344
+ }
345
+ if (!pluginDataSupport.alertStates) {
346
+ this._dataWithFieldConfig.alertState = void 0;
347
+ }
348
+ if (!pluginDataSupport.annotations) {
349
+ this._dataWithFieldConfig.annotations = void 0;
350
+ }
351
+ this._prevData = rawData;
352
+ return this._dataWithFieldConfig;
353
+ }
354
+ buildPanelContext() {
355
+ const sync = getCursorSyncScope(this);
356
+ const context = {
357
+ eventsScope: sync ? sync.getEventsScope() : "__global_",
358
+ eventBus: sync ? sync.getEventsBus(this) : getAppEvents(),
359
+ app: CoreApp.Unknown,
360
+ sync: () => {
361
+ if (sync) {
362
+ return sync.state.sync;
363
+ }
364
+ return DashboardCursorSync.Off;
365
+ },
366
+ onSeriesColorChange: this._onSeriesColorChange,
367
+ onToggleSeriesVisibility: this._onSeriesVisibilityChange,
368
+ onToggleLegendSort: this._onToggleLegendSort,
369
+ onInstanceStateChange: this._onInstanceStateChange
370
+ };
371
+ if (this.state.extendPanelContext) {
372
+ this.state.extendPanelContext(this, context);
373
+ }
374
+ return context;
375
+ }
376
+ }
377
+ VizPanel.Component = VizPanelRenderer;
378
+ function getPanelPluginNotFound(id) {
379
+ const plugin = new PanelPlugin(() => null);
380
+ plugin.meta = {
381
+ id,
382
+ name: id,
383
+ sort: 100,
384
+ type: PluginType.panel,
385
+ module: "",
386
+ baseUrl: "",
387
+ info: {
388
+ author: {
389
+ name: ""
390
+ },
391
+ description: "",
392
+ links: [],
393
+ logos: {
394
+ large: "",
395
+ small: "public/img/grafana_icon.svg"
396
+ },
397
+ screenshots: [],
398
+ updated: "",
399
+ version: ""
400
+ }
401
+ };
402
+ return plugin;
403
+ }
404
+
405
+ export { VizPanel };
406
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVml6UGFuZWwuanMiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnRzL1ZpelBhbmVsL1ZpelBhbmVsLnRzeCJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBBYnNvbHV0ZVRpbWVSYW5nZSxcbiAgRmllbGRDb25maWdTb3VyY2UsXG4gIFBhbmVsTW9kZWwsXG4gIFBhbmVsUGx1Z2luLFxuICB0b1V0YyxcbiAgZ2V0UGFuZWxPcHRpb25zV2l0aERlZmF1bHRzLFxuICBTY29wZWRWYXJzLFxuICBJbnRlcnBvbGF0ZUZ1bmN0aW9uLFxuICBDb3JlQXBwLFxuICBEYXNoYm9hcmRDdXJzb3JTeW5jLFxuICBQYW5lbERhdGEsXG4gIGNvbXBhcmVBcnJheVZhbHVlcyxcbiAgY29tcGFyZURhdGFGcmFtZVN0cnVjdHVyZXMsXG4gIGFwcGx5RmllbGRPdmVycmlkZXMsXG4gIFBsdWdpblR5cGUsXG4gIHJlbmRlck1hcmtkb3duLFxuICBQYW5lbFBsdWdpbkRhdGFTdXBwb3J0LFxufSBmcm9tICdAZ3JhZmFuYS9kYXRhJztcbmltcG9ydCB7IFBhbmVsQ29udGV4dCwgU2VyaWVzVmlzaWJpbGl0eUNoYW5nZU1vZGUsIFZpekxlZ2VuZE9wdGlvbnMgfSBmcm9tICdAZ3JhZmFuYS91aSc7XG5pbXBvcnQgeyBjb25maWcsIGdldEFwcEV2ZW50cywgZ2V0UGx1Z2luSW1wb3J0VXRpbHMgfSBmcm9tICdAZ3JhZmFuYS9ydW50aW1lJztcbmltcG9ydCB7IFNjZW5lT2JqZWN0QmFzZSB9IGZyb20gJy4uLy4uL2NvcmUvU2NlbmVPYmplY3RCYXNlJztcbmltcG9ydCB7IHNjZW5lR3JhcGggfSBmcm9tICcuLi8uLi9jb3JlL3NjZW5lR3JhcGgnO1xuaW1wb3J0IHsgRGVlcFBhcnRpYWwsIFNjZW5lT2JqZWN0LCBTY2VuZU9iamVjdFN0YXRlIH0gZnJvbSAnLi4vLi4vY29yZS90eXBlcyc7XG5cbmltcG9ydCB7IFZpelBhbmVsUmVuZGVyZXIgfSBmcm9tICcuL1ZpelBhbmVsUmVuZGVyZXInO1xuaW1wb3J0IHsgVml6UGFuZWxNZW51IH0gZnJvbSAnLi9WaXpQYW5lbE1lbnUnO1xuaW1wb3J0IHsgVmFyaWFibGVEZXBlbmRlbmN5Q29uZmlnIH0gZnJvbSAnLi4vLi4vdmFyaWFibGVzL1ZhcmlhYmxlRGVwZW5kZW5jeUNvbmZpZyc7XG5pbXBvcnQgeyBWYXJpYWJsZUN1c3RvbUZvcm1hdHRlckZuIH0gZnJvbSAnLi4vLi4vdmFyaWFibGVzL3R5cGVzJztcbmltcG9ydCB7IHNlcmllc1Zpc2liaWxpdHlDb25maWdGYWN0b3J5IH0gZnJvbSAnLi9zZXJpZXNWaXNpYmlsaXR5Q29uZmlnRmFjdG9yeSc7XG5pbXBvcnQgeyBlbXB0eVBhbmVsRGF0YSB9IGZyb20gJy4uLy4uL2NvcmUvU2NlbmVEYXRhTm9kZSc7XG5pbXBvcnQgeyBjaGFuZ2VTZXJpZXNDb2xvckNvbmZpZ0ZhY3RvcnkgfSBmcm9tICcuL2NvbG9yU2VyaWVzQ29uZmlnRmFjdG9yeSc7XG5pbXBvcnQgeyBsb2FkUGFuZWxQbHVnaW5TeW5jIH0gZnJvbSAnLi9yZWdpc3RlclJ1bnRpbWVQYW5lbFBsdWdpbic7XG5pbXBvcnQgeyBnZXRDdXJzb3JTeW5jU2NvcGUgfSBmcm9tICcuLi8uLi9iZWhhdmlvcnMvQ3Vyc29yU3luYyc7XG5pbXBvcnQgeyBjbG9uZURlZXAsIGlzQXJyYXksIGlzRW1wdHksIG1lcmdlLCBtZXJnZVdpdGggfSBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsgVXNlckFjdGlvbkV2ZW50IH0gZnJvbSAnLi4vLi4vY29yZS9ldmVudHMnO1xuaW1wb3J0IHsgZXZhbHVhdGVUaW1lUmFuZ2UgfSBmcm9tICcuLi8uLi91dGlscy9ldmFsdWF0ZVRpbWVSYW5nZSc7XG5pbXBvcnQgeyBMaXZlTm93VGltZXIgfSBmcm9tICcuLi8uLi9iZWhhdmlvcnMvTGl2ZU5vd1RpbWVyJztcblxuZXhwb3J0IGludGVyZmFjZSBWaXpQYW5lbFN0YXRlPFRPcHRpb25zID0ge30sIFRGaWVsZENvbmZpZyA9IHt9PiBleHRlbmRzIFNjZW5lT2JqZWN0U3RhdGUge1xuICAvKipcbiAgICogVGhpcyBpcyB1c3VhbGx5IGEgcGx1Z2luIGlkIHRoYXQgcmVmZXJlbmNlcyBhIGNvcmUgcGx1Z2luIG9yIGFuIGV4dGVybmFsIHBsdWdpbi4gQnV0IHRoaXMgY2FuIGFsc28gcmVmZXJlbmNlIGFcbiAgICogcnVudGltZSByZWdpc3RlcmVkIFBhbmVsUGx1Z2luIHJlZ2lzdGVyZWQgdmlhIGZ1bmN0aW9uIHJlZ2lzdGVyU2NlbmVQYW5lbFBsdWdpbi5cbiAgICovXG4gIHBsdWdpbklkOiBzdHJpbmc7XG4gIHRpdGxlOiBzdHJpbmc7XG4gIGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuICBvcHRpb25zOiBEZWVwUGFydGlhbDxUT3B0aW9ucz47XG4gIGZpZWxkQ29uZmlnOiBGaWVsZENvbmZpZ1NvdXJjZTxEZWVwUGFydGlhbDxURmllbGRDb25maWc+PjtcbiAgcGx1Z2luVmVyc2lvbj86IHN0cmluZztcbiAgZGlzcGxheU1vZGU/OiAnZGVmYXVsdCcgfCAndHJhbnNwYXJlbnQnO1xuICAvKipcbiAgICogT25seSBzaG93cyBoZWFkZXIgb24gaG92ZXIsIGFic29sdXRseSBwb3NpdGlvbmVkIGFib3ZlIHRoZSBwYW5lbC5cbiAgICovXG4gIGhvdmVySGVhZGVyPzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIE9mZnNldCBob3ZlckhlYWRlciBwb3NpdGlvbiBvbiB0aGUgeSBheGlzXG4gICAqL1xuICBob3ZlckhlYWRlck9mZnNldD86IG51bWJlcjtcbiAgLyoqXG4gICAqIE9ubHkgc2hvd3Mgdml6UGFuZWxNZW51IG9uIGhvdmVyIGlmIGZhbHNlLCBvdGhlcndpc2UgdGhlIG1lbnUgaXMgYWx3YXlzIHZpc2libGUgaW4gdGhlIGhlYWRlclxuICAgKi9cbiAgc2hvd01lbnVBbHdheXM/OiBib29sZWFuO1xuICAvKipcbiAgICogRGVmaW5lcyBhIG1lbnUgaW4gdGhlIHRvcCByaWdodCBvZiB0aGUgcGFuZWwuIFRoZSBtZW51IG9iamVjdCBpcyBvbmx5IGFjdGl2YXRlZCB3aGVuIHRoZSBkcm9wZG93biBtZW51IGl0c2VsZiBpcyBzaG93bi5cbiAgICogU28gdGhlIGJlc3Qgd2F5IHRvIGFkZCBkeW5hbWljIG1lbnUgYWN0aW9ucyBhbmQgbGlua3MgaXMgYnkgYWRkaW5nIHRoZW0gaW4gYSBiZWhhdmlvciBhdHRhY2hlZCB0byB0aGUgbWVudS5cbiAgICovXG4gIG1lbnU/OiBWaXpQYW5lbE1lbnU7XG4gIC8qKlxuICAgKiBEZWZpbmVzIGEgbWVudSB0aGF0IHJlbmRlcnMgcGFuZWwgbGluay5cbiAgICoqL1xuICB0aXRsZUl0ZW1zPzogUmVhY3QuUmVhY3ROb2RlIHwgU2NlbmVPYmplY3QgfCBTY2VuZU9iamVjdFtdO1xuICBzZXJpZXNMaW1pdD86IG51bWJlcjtcbiAgc2VyaWVzTGltaXRTaG93QWxsPzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIEFkZCBhY3Rpb24gdG8gdGhlIHRvcCByaWdodCBwYW5lbCBoZWFkZXJcbiAgICovXG4gIGhlYWRlckFjdGlvbnM/OiBSZWFjdC5SZWFjdE5vZGUgfCBTY2VuZU9iamVjdCB8IFNjZW5lT2JqZWN0W107XG4gIC8qKlxuICAgKiBNYWlubHkgZm9yIGFkdmFuY2VkIHVzZSBjYXNlcyB0aGF0IG5lZWQgY3VzdG9tIGhhbmRsaW5nIG9mIFBhbmVsQ29udGV4dCBjYWxsYmFja3MuXG4gICAqL1xuICBleHRlbmRQYW5lbENvbnRleHQ/OiAodml6UGFuZWw6IFZpelBhbmVsLCBjb250ZXh0OiBQYW5lbENvbnRleHQpID0+IHZvaWQ7XG5cbiAgLyoqXG4gICAqIFNldHMgcGFuZWwgY2hyb21lIGNvbGxhcHNlZCBzdGF0ZVxuICAgKi9cbiAgY29sbGFwc2libGU/OiBib29sZWFuO1xuICBjb2xsYXBzZWQ/OiBib29sZWFuO1xuICAvKipcbiAgICogQGludGVybmFsXG4gICAqIE9ubHkgZm9yIHVzZSBmcm9tIGNvcmUgdG8gaGFuZGxlIG1pZ3JhdGlvbiBmcm9tIG9sZCBhbmd1bGFyIHBhbmVsc1xuICAgKiovXG4gIF9VTlNBRkVfY3VzdG9tTWlncmF0aW9uSGFuZGxlcj86IChwYW5lbDogUGFuZWxNb2RlbCwgcGx1Z2luOiBQYW5lbFBsdWdpbikgPT4gdm9pZDtcbiAgLyoqIEludGVybmFsICovXG4gIF9wbHVnaW5Mb2FkRXJyb3I/OiBzdHJpbmc7XG4gIC8qKiBJbnRlcm5hbCAqL1xuICBfcGx1Z2luSW5zdGFuY2VTdGF0ZT86IGFueTtcbiAgX3JlbmRlckNvdW50ZXI/OiBudW1iZXI7XG59XG5cbmV4cG9ydCBjbGFzcyBWaXpQYW5lbDxUT3B0aW9ucyA9IHt9LCBURmllbGRDb25maWcgZXh0ZW5kcyB7fSA9IHt9PiBleHRlbmRzIFNjZW5lT2JqZWN0QmFzZTxcbiAgVml6UGFuZWxTdGF0ZTxUT3B0aW9ucywgVEZpZWxkQ29uZmlnPlxuPiB7XG4gIHB1YmxpYyBzdGF0aWMgQ29tcG9uZW50ID0gVml6UGFuZWxSZW5kZXJlcjtcblxuICBwcm90ZWN0ZWQgX3ZhcmlhYmxlRGVwZW5kZW5jeSA9IG5ldyBWYXJpYWJsZURlcGVuZGVuY3lDb25maWcodGhpcywge1xuICAgIHN0YXRlUGF0aHM6IFsndGl0bGUnLCAnb3B0aW9ucycsICdmaWVsZENvbmZpZyddLFxuICB9KTtcblxuICAvLyBOb3QgcGFydCBvZiBzdGF0ZSBhcyB0aGlzIGlzIG5vdCBzZXJpYWxpemFibGVcbiAgcHJvdGVjdGVkIF9wYW5lbENvbnRleHQ/OiBQYW5lbENvbnRleHQ7XG4gIHByaXZhdGUgX3BsdWdpbj86IFBhbmVsUGx1Z2luO1xuICBwcml2YXRlIF9wcmV2RGF0YT86IFBhbmVsRGF0YTtcbiAgcHJpdmF0ZSBfZGF0YVdpdGhGaWVsZENvbmZpZz86IFBhbmVsRGF0YTtcbiAgcHJpdmF0ZSBfc3RydWN0dXJlUmV2OiBudW1iZXIgPSAwO1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihzdGF0ZTogUGFydGlhbDxWaXpQYW5lbFN0YXRlPFRPcHRpb25zLCBURmllbGRDb25maWc+Pikge1xuICAgIHN1cGVyKHtcbiAgICAgIG9wdGlvbnM6IHt9IGFzIFRPcHRpb25zLFxuICAgICAgZmllbGRDb25maWc6IHsgZGVmYXVsdHM6IHt9LCBvdmVycmlkZXM6IFtdIH0sXG4gICAgICB0aXRsZTogJ1RpdGxlJyxcbiAgICAgIHBsdWdpbklkOiAndGltZXNlcmllcycsXG4gICAgICBfcmVuZGVyQ291bnRlcjogMCxcbiAgICAgIC4uLnN0YXRlLFxuICAgIH0pO1xuXG4gICAgdGhpcy5hZGRBY3RpdmF0aW9uSGFuZGxlcigoKSA9PiB7XG4gICAgICB0aGlzLl9vbkFjdGl2YXRlKCk7XG4gICAgfSk7XG5cbiAgICBzdGF0ZS5tZW51Py5hZGRBY3RpdmF0aW9uSGFuZGxlcigoKSA9PiB7XG4gICAgICB0aGlzLnB1Ymxpc2hFdmVudChuZXcgVXNlckFjdGlvbkV2ZW50KHsgb3JpZ2luOiB0aGlzLCBpbnRlcmFjdGlvbjogJ3BhbmVsLW1lbnUtc2hvd24nIH0pLCB0cnVlKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgX29uQWN0aXZhdGUoKSB7XG4gICAgaWYgKCF0aGlzLl9wbHVnaW4pIHtcbiAgICAgIHRoaXMuX2xvYWRQbHVnaW4odGhpcy5zdGF0ZS5wbHVnaW5JZCk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGZvcmNlUmVuZGVyKCk6IHZvaWQge1xuICAgIC8vIEluY3JlbWVudGluZyB0aGUgcmVuZGVyIGNvdW50ZXIgbWVhbnMgVml6UmVwZWF0ZXIgYW5kIGl0cyBjaGlsZHJlbiB3aWxsIGFsc28gcmUtcmVuZGVyXG4gICAgdGhpcy5zZXRTdGF0ZSh7IF9yZW5kZXJDb3VudGVyOiAodGhpcy5zdGF0ZS5fcmVuZGVyQ291bnRlciA/PyAwKSArIDEgfSk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIF9sb2FkUGx1Z2luKFxuICAgIHBsdWdpbklkOiBzdHJpbmcsXG4gICAgb3ZlcndyaXRlT3B0aW9ucz86IERlZXBQYXJ0aWFsPHt9PixcbiAgICBvdmVyd3JpdGVGaWVsZENvbmZpZz86IEZpZWxkQ29uZmlnU291cmNlLFxuICAgIGlzQWZ0ZXJQbHVnaW5DaGFuZ2U/OiBib29sZWFuXG4gICkge1xuICAgIGNvbnN0IHBsdWdpbiA9IGxvYWRQYW5lbFBsdWdpblN5bmMocGx1Z2luSWQpO1xuXG4gICAgaWYgKHBsdWdpbikge1xuICAgICAgdGhpcy5fcGx1Z2luTG9hZGVkKHBsdWdpbiwgb3ZlcndyaXRlT3B0aW9ucywgb3ZlcndyaXRlRmllbGRDb25maWcsIGlzQWZ0ZXJQbHVnaW5DaGFuZ2UpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCB7IGltcG9ydFBhbmVsUGx1Z2luIH0gPSBnZXRQbHVnaW5JbXBvcnRVdGlscygpO1xuXG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBpbXBvcnRQYW5lbFBsdWdpbihwbHVnaW5JZCk7XG4gICAgICAgIHRoaXMuX3BsdWdpbkxvYWRlZChyZXN1bHQsIG92ZXJ3cml0ZU9wdGlvbnMsIG92ZXJ3cml0ZUZpZWxkQ29uZmlnLCBpc0FmdGVyUGx1Z2luQ2hhbmdlKTtcbiAgICAgIH0gY2F0Y2ggKGVycjogdW5rbm93bikge1xuICAgICAgICB0aGlzLl9wbHVnaW5Mb2FkZWQoZ2V0UGFuZWxQbHVnaW5Ob3RGb3VuZChwbHVnaW5JZCkpO1xuXG4gICAgICAgIGlmIChlcnIgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICAgIHRoaXMuc2V0U3RhdGUoeyBfcGx1Z2luTG9hZEVycm9yOiBlcnIubWVzc2FnZSB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBnZXRMZWdhY3lQYW5lbElkKCkge1xuICAgIGNvbnN0IHBhbmVsSWQgPSBwYXJzZUludCh0aGlzLnN0YXRlLmtleSEucmVwbGFjZSgncGFuZWwtJywgJycpLCAxMCk7XG4gICAgaWYgKGlzTmFOKHBhbmVsSWQpKSB7XG4gICAgICByZXR1cm4gMDtcbiAgICB9XG5cbiAgICByZXR1cm4gcGFuZWxJZDtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgX3BsdWdpbkxvYWRlZChcbiAgICBwbHVnaW46IFBhbmVsUGx1Z2luLFxuICAgIG92ZXJ3cml0ZU9wdGlvbnM/OiBEZWVwUGFydGlhbDx7fT4sXG4gICAgb3ZlcndyaXRlRmllbGRDb25maWc/OiBGaWVsZENvbmZpZ1NvdXJjZSxcbiAgICBpc0FmdGVyUGx1Z2luQ2hhbmdlPzogYm9vbGVhblxuICApIHtcbiAgICBjb25zdCB7IG9wdGlvbnMsIGZpZWxkQ29uZmlnLCB0aXRsZSwgcGx1Z2luVmVyc2lvbiwgX1VOU0FGRV9jdXN0b21NaWdyYXRpb25IYW5kbGVyIH0gPSB0aGlzLnN0YXRlO1xuXG4gICAgY29uc3QgcGFuZWw6IFBhbmVsTW9kZWwgPSB7XG4gICAgICB0aXRsZSxcbiAgICAgIG9wdGlvbnMsXG4gICAgICBmaWVsZENvbmZpZyxcbiAgICAgIGlkOiB0aGlzLmdldExlZ2FjeVBhbmVsSWQoKSxcbiAgICAgIHR5cGU6IHBsdWdpbi5tZXRhLmlkLFxuICAgICAgcGx1Z2luVmVyc2lvbjogcGx1Z2luVmVyc2lvbixcbiAgICB9O1xuXG4gICAgaWYgKG92ZXJ3cml0ZU9wdGlvbnMpIHtcbiAgICAgIHBhbmVsLm9wdGlvbnMgPSBvdmVyd3JpdGVPcHRpb25zO1xuICAgIH1cblxuICAgIGlmIChvdmVyd3JpdGVGaWVsZENvbmZpZykge1xuICAgICAgcGFuZWwuZmllbGRDb25maWcgPSBvdmVyd3JpdGVGaWVsZENvbmZpZztcbiAgICB9XG5cbiAgICBjb25zdCBjdXJyZW50VmVyc2lvbiA9IHRoaXMuX2dldFBsdWdpblZlcnNpb24ocGx1Z2luKTtcblxuICAgIF9VTlNBRkVfY3VzdG9tTWlncmF0aW9uSGFuZGxlcj8uKHBhbmVsLCBwbHVnaW4pO1xuXG4gICAgaWYgKHBsdWdpbi5vblBhbmVsTWlncmF0aW9uICYmIGN1cnJlbnRWZXJzaW9uICE9PSBwbHVnaW5WZXJzaW9uICYmICFpc0FmdGVyUGx1Z2luQ2hhbmdlKSB7XG4gICAgICAvLyBUaGVzZSBtaWdyYXRpb24gaGFuZGxlcnMgYWxzbyBtdXRhdGUgcGFuZWwuZmllbGRDb25maWcgdG8gbWlncmF0ZSBmaWVsZENvbmZpZ1xuICAgICAgcGFuZWwub3B0aW9ucyA9IGF3YWl0IHBsdWdpbi5vblBhbmVsTWlncmF0aW9uKHBhbmVsKTtcbiAgICB9XG5cbiAgICBjb25zdCB3aXRoRGVmYXVsdHMgPSBnZXRQYW5lbE9wdGlvbnNXaXRoRGVmYXVsdHMoe1xuICAgICAgcGx1Z2luLFxuICAgICAgY3VycmVudE9wdGlvbnM6IHBhbmVsLm9wdGlvbnMsXG4gICAgICBjdXJyZW50RmllbGRDb25maWc6IHBhbmVsLmZpZWxkQ29uZmlnLFxuICAgICAgaXNBZnRlclBsdWdpbkNoYW5nZTogaXNBZnRlclBsdWdpbkNoYW5nZSA/PyBmYWxzZSxcbiAgICB9KTtcblxuICAgIHRoaXMuX3BsdWdpbiA9IHBsdWdpbjtcblxuICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgb3B0aW9uczogd2l0aERlZmF1bHRzLm9wdGlvbnMgYXMgRGVlcFBhcnRpYWw8VE9wdGlvbnM+LFxuICAgICAgZmllbGRDb25maWc6IHdpdGhEZWZhdWx0cy5maWVsZENvbmZpZyxcbiAgICAgIHBsdWdpblZlcnNpb246IGN1cnJlbnRWZXJzaW9uLFxuICAgICAgcGx1Z2luSWQ6IHBsdWdpbi5tZXRhLmlkLFxuICAgIH0pO1xuXG4gICAgLy8gTm9uIGRhdGEgcGFuZWxzIG5lZWRzIHRvIGJlIHJlLXJlbmRlcmVkIHdoZW4gdGltZSByYW5nZSBjaGFuZ2VcbiAgICBpZiAocGx1Z2luLm1ldGEuc2tpcERhdGFRdWVyeSkge1xuICAgICAgY29uc3Qgc2NlbmVUaW1lUmFuZ2UgPSBzY2VuZUdyYXBoLmdldFRpbWVSYW5nZSh0aGlzKTtcbiAgICAgIHRoaXMuX3N1YnMuYWRkKHNjZW5lVGltZVJhbmdlLnN1YnNjcmliZVRvU3RhdGUoKCkgPT4gdGhpcy5mb3JjZVJlbmRlcigpKSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfZ2V0UGx1Z2luVmVyc2lvbihwbHVnaW46IFBhbmVsUGx1Z2luKTogc3RyaW5nIHtcbiAgICByZXR1cm4gcGx1Z2luICYmIHBsdWdpbi5tZXRhLmluZm8udmVyc2lvbiA/IHBsdWdpbi5tZXRhLmluZm8udmVyc2lvbiA6IGNvbmZpZy5idWlsZEluZm8udmVyc2lvbjtcbiAgfVxuXG4gIHB1YmxpYyBnZXRQbHVnaW4oKTogUGFuZWxQbHVnaW4gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9wbHVnaW47XG4gIH1cblxuICBwdWJsaWMgZ2V0UGFuZWxDb250ZXh0KCk6IFBhbmVsQ29udGV4dCB7XG4gICAgdGhpcy5fcGFuZWxDb250ZXh0ID8/PSB0aGlzLmJ1aWxkUGFuZWxDb250ZXh0KCk7XG5cbiAgICByZXR1cm4gdGhpcy5fcGFuZWxDb250ZXh0ITtcbiAgfVxuXG4gIHB1YmxpYyBvblRpbWVSYW5nZUNoYW5nZSA9ICh0aW1lUmFuZ2U6IEFic29sdXRlVGltZVJhbmdlKSA9PiB7XG4gICAgY29uc3Qgc2NlbmVUaW1lUmFuZ2UgPSBzY2VuZUdyYXBoLmdldFRpbWVSYW5nZSh0aGlzKTtcbiAgICBzY2VuZVRpbWVSYW5nZS5vblRpbWVSYW5nZUNoYW5nZSh7XG4gICAgICByYXc6IHtcbiAgICAgICAgZnJvbTogdG9VdGModGltZVJhbmdlLmZyb20pLFxuICAgICAgICB0bzogdG9VdGModGltZVJhbmdlLnRvKSxcbiAgICAgIH0sXG4gICAgICBmcm9tOiB0b1V0Yyh0aW1lUmFuZ2UuZnJvbSksXG4gICAgICB0bzogdG9VdGModGltZVJhbmdlLnRvKSxcbiAgICB9KTtcbiAgfTtcblxuICBwdWJsaWMgZ2V0VGltZVJhbmdlID0gKGRhdGE/OiBQYW5lbERhdGEpID0+IHtcbiAgICBjb25zdCBsaXZlTm93VGltZXIgPSBzY2VuZUdyYXBoLmZpbmRPYmplY3QodGhpcywgKG8pID0+IG8gaW5zdGFuY2VvZiBMaXZlTm93VGltZXIpO1xuICAgIGNvbnN0IHNjZW5lVGltZVJhbmdlID0gc2NlbmVHcmFwaC5nZXRUaW1lUmFuZ2UodGhpcyk7XG4gICAgaWYgKGxpdmVOb3dUaW1lciBpbnN0YW5jZW9mIExpdmVOb3dUaW1lciAmJiBsaXZlTm93VGltZXIuaXNFbmFibGVkKSB7XG4gICAgICByZXR1cm4gZXZhbHVhdGVUaW1lUmFuZ2UoXG4gICAgICAgIHNjZW5lVGltZVJhbmdlLnN0YXRlLmZyb20sXG4gICAgICAgIHNjZW5lVGltZVJhbmdlLnN0YXRlLnRvLFxuICAgICAgICBzY2VuZVRpbWVSYW5nZS5nZXRUaW1lWm9uZSgpLFxuICAgICAgICBzY2VuZVRpbWVSYW5nZS5zdGF0ZS5maXNjYWxZZWFyU3RhcnRNb250aCxcbiAgICAgICAgc2NlbmVUaW1lUmFuZ2Uuc3RhdGUuVU5TQUZFX25vd0RlbGF5XG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IHBsdWdpbiA9IHRoaXMuZ2V0UGx1Z2luKCk7XG4gICAgaWYgKHBsdWdpbiAmJiAhcGx1Z2luLm1ldGEuc2tpcERhdGFRdWVyeSAmJiBkYXRhICYmIGRhdGEudGltZVJhbmdlKSB7XG4gICAgICByZXR1cm4gZGF0YS50aW1lUmFuZ2U7XG4gICAgfVxuXG4gICAgcmV0dXJuIHNjZW5lVGltZVJhbmdlLnN0YXRlLnZhbHVlO1xuICB9O1xuXG4gIHB1YmxpYyBhc3luYyBjaGFuZ2VQbHVnaW5UeXBlKHBsdWdpbklkOiBzdHJpbmcsIG5ld09wdGlvbnM/OiBEZWVwUGFydGlhbDx7fT4sIG5ld0ZpZWxkQ29uZmlnPzogRmllbGRDb25maWdTb3VyY2UpIHtcbiAgICBjb25zdCB7IG9wdGlvbnM6IHByZXZPcHRpb25zLCBmaWVsZENvbmZpZzogcHJldkZpZWxkQ29uZmlnLCBwbHVnaW5JZDogcHJldlBsdWdpbklkIH0gPSB0aGlzLnN0YXRlO1xuXG4gICAgLy9jbGVhciBmaWVsZCBjb25maWcgY2FjaGUgdG8gdXBkYXRlIGl0IGxhdGVyXG4gICAgdGhpcy5fZGF0YVdpdGhGaWVsZENvbmZpZyA9IHVuZGVmaW5lZDtcblxuICAgIC8vIElmIHN0YXRlLnBsdWdpbklkIGlzIGFscmVhZHkgdGhlIGNvcnJlY3QgcGx1Z2luIHdlIGRvbid0IHRyZWF0IHRoaXMgYXMgcGxhaW4gdXNlciBwYW5lbCB0eXBlIGNoYW5nZVxuICAgIGNvbnN0IGlzQWZ0ZXJQbHVnaW5DaGFuZ2UgPSB0aGlzLnN0YXRlLnBsdWdpbklkICE9PSBwbHVnaW5JZDtcbiAgICBhd2FpdCB0aGlzLl9sb2FkUGx1Z2luKHBsdWdpbklkLCBuZXdPcHRpb25zID8/IHt9LCBuZXdGaWVsZENvbmZpZywgaXNBZnRlclBsdWdpbkNoYW5nZSk7XG5cbiAgICBjb25zdCBwYW5lbDogUGFuZWxNb2RlbCA9IHtcbiAgICAgIHRpdGxlOiB0aGlzLnN0YXRlLnRpdGxlLFxuICAgICAgb3B0aW9uczogdGhpcy5zdGF0ZS5vcHRpb25zLFxuICAgICAgZmllbGRDb25maWc6IHRoaXMuc3RhdGUuZmllbGRDb25maWcsXG4gICAgICBpZDogMSxcbiAgICAgIHR5cGU6IHBsdWdpbklkLFxuICAgIH07XG5cbiAgICAvLyBvblBhbmVsVHlwZUNoYW5nZWQgaXMgbWFpbmx5IHVzZWQgYnkgcGx1Z2lucyB0byBtaWdyYXRlIGZyb20gQW5ndWxhciB0byBSZWFjdC5cbiAgICAvLyBGb3IgZXhhbXBsZSwgdGhpcyB3aWxsIG1pZ3JhdGUgb3B0aW9ucyBmcm9tICdncmFwaCcgdG8gJ3RpbWVzZXJpZXMnIGlmIHRoZSBwcmV2aW91cyBhbmQgbmV3IHBsdWdpbiBJRCBtYXRjaGVzLlxuICAgIGNvbnN0IHVwZGF0ZWRPcHRpb25zID0gdGhpcy5fcGx1Z2luPy5vblBhbmVsVHlwZUNoYW5nZWQ/LihwYW5lbCwgcHJldlBsdWdpbklkLCBwcmV2T3B0aW9ucywgcHJldkZpZWxkQ29uZmlnKTtcblxuICAgIGlmICh1cGRhdGVkT3B0aW9ucyAmJiAhaXNFbXB0eSh1cGRhdGVkT3B0aW9ucykpIHtcbiAgICAgIHRoaXMub25PcHRpb25zQ2hhbmdlKHVwZGF0ZWRPcHRpb25zLCB0cnVlLCB0cnVlKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgb25UaXRsZUNoYW5nZSA9ICh0aXRsZTogc3RyaW5nKSA9PiB7XG4gICAgdGhpcy5zZXRTdGF0ZSh7IHRpdGxlIH0pO1xuICB9O1xuXG4gIHB1YmxpYyBvbkRlc2NyaXB0aW9uQ2hhbmdlID0gKGRlc2NyaXB0aW9uOiBzdHJpbmcpID0+IHtcbiAgICB0aGlzLnNldFN0YXRlKHsgZGVzY3JpcHRpb24gfSk7XG4gIH07XG5cbiAgcHVibGljIG9uRGlzcGxheU1vZGVDaGFuZ2UgPSAoZGlzcGxheU1vZGU6ICdkZWZhdWx0JyB8ICd0cmFuc3BhcmVudCcpID0+IHtcbiAgICB0aGlzLnNldFN0YXRlKHsgZGlzcGxheU1vZGUgfSk7XG4gIH07XG5cbiAgcHVibGljIG9uVG9nZ2xlQ29sbGFwc2UgPSAoY29sbGFwc2VkOiBib29sZWFuKSA9PiB7XG4gICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICBjb2xsYXBzZWQsXG4gICAgfSk7XG4gIH07XG5cbiAgcHVibGljIG9uT3B0aW9uc0NoYW5nZSA9IChvcHRpb25zVXBkYXRlOiBEZWVwUGFydGlhbDxUT3B0aW9ucz4sIHJlcGxhY2UgPSBmYWxzZSwgaXNBZnRlclBsdWdpbkNoYW5nZSA9IGZhbHNlKSA9PiB7XG4gICAgY29uc3QgeyBmaWVsZENvbmZpZywgb3B0aW9ucyB9ID0gdGhpcy5zdGF0ZTtcblxuICAgIC8vIFdoZW4gcmVwbGFjZSBpcyB0cnVlLCB3ZSB3YW50IHRvIHJlcGxhY2UgdGhlIGVudGlyZSBvcHRpb25zIG9iamVjdC4gRGVmYXVsdCB3aWxsIGJlIGFwcGxpZWQuXG4gICAgY29uc3QgbmV4dE9wdGlvbnMgPSByZXBsYWNlXG4gICAgICA/IG9wdGlvbnNVcGRhdGVcbiAgICAgIDogbWVyZ2VXaXRoKGNsb25lRGVlcChvcHRpb25zKSwgb3B0aW9uc1VwZGF0ZSwgKG9ialZhbHVlLCBzcmNWYWx1ZSwga2V5LCBvYmopID0+IHtcbiAgICAgICAgICBpZiAoaXNBcnJheShzcmNWYWx1ZSkpIHtcbiAgICAgICAgICAgIHJldHVybiBzcmNWYWx1ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gSWYgY3VzdG9taXplciByZXR1cm5zIHVuZGVmaW5lZCwgbWVyZ2luZyBpcyBoYW5kbGVkIGJ5IHRoZSBtZXRob2QgaW5zdGVhZFxuICAgICAgICAgIC8vIHNvIHdlIG5lZWQgdG8gb3ZlcnJpZGUgdGhlIHZhbHVlIGluIHRoZSBvYmplY3QgaW5zdGVhZFxuICAgICAgICAgIGlmIChvYmpWYWx1ZSAhPT0gc3JjVmFsdWUgJiYgdHlwZW9mIHNyY1ZhbHVlID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgb2JqW2tleV0gPSBzcmNWYWx1ZTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9KTtcblxuICAgIGNvbnN0IHdpdGhEZWZhdWx0cyA9IGdldFBhbmVsT3B0aW9uc1dpdGhEZWZhdWx0cyh7XG4gICAgICBwbHVnaW46IHRoaXMuX3BsdWdpbiEsXG4gICAgICBjdXJyZW50T3B0aW9uczogbmV4dE9wdGlvbnMsXG4gICAgICBjdXJyZW50RmllbGRDb25maWc6IGZpZWxkQ29uZmlnLFxuICAgICAgaXNBZnRlclBsdWdpbkNoYW5nZTogaXNBZnRlclBsdWdpbkNoYW5nZSxcbiAgICB9KTtcblxuICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgb3B0aW9uczogd2l0aERlZmF1bHRzLm9wdGlvbnMgYXMgRGVlcFBhcnRpYWw8VE9wdGlvbnM+LFxuICAgICAgX3JlbmRlckNvdW50ZXI6ICh0aGlzLnN0YXRlLl9yZW5kZXJDb3VudGVyID8/IDApICsgMSxcbiAgICB9KTtcbiAgfTtcblxuICBwdWJsaWMgb25GaWVsZENvbmZpZ0NoYW5nZSA9IChmaWVsZENvbmZpZ1VwZGF0ZTogRmllbGRDb25maWdTb3VyY2U8RGVlcFBhcnRpYWw8VEZpZWxkQ29uZmlnPj4sIHJlcGxhY2U/OiBib29sZWFuKSA9PiB7XG4gICAgY29uc3QgeyBmaWVsZENvbmZpZywgb3B0aW9ucyB9ID0gdGhpcy5zdGF0ZTtcblxuICAgIC8vIFdoZW4gcmVwbGFjZSBpcyB0cnVlLCB3ZSB3YW50IHRvIHJlcGxhY2UgdGhlIGVudGlyZSBmaWVsZCBjb25maWcuIERlZmF1bHQgd2lsbCBiZSBhcHBsaWVkLlxuICAgIGNvbnN0IG5leHRGaWVsZENvbmZpZyA9IHJlcGxhY2UgPyBmaWVsZENvbmZpZ1VwZGF0ZSA6IG1lcmdlKGNsb25lRGVlcChmaWVsZENvbmZpZyksIGZpZWxkQ29uZmlnVXBkYXRlKTtcblxuICAgIGNvbnN0IHdpdGhEZWZhdWx0cyA9IGdldFBhbmVsT3B0aW9uc1dpdGhEZWZhdWx0cyh7XG4gICAgICBwbHVnaW46IHRoaXMuX3BsdWdpbiEsXG4gICAgICBjdXJyZW50T3B0aW9uczogb3B0aW9ucyxcbiAgICAgIGN1cnJlbnRGaWVsZENvbmZpZzogbmV4dEZpZWxkQ29uZmlnLFxuICAgICAgaXNBZnRlclBsdWdpbkNoYW5nZTogZmFsc2UsXG4gICAgfSk7XG5cbiAgICB0aGlzLl9kYXRhV2l0aEZpZWxkQ29uZmlnID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuc2V0U3RhdGUoeyBmaWVsZENvbmZpZzogd2l0aERlZmF1bHRzLmZpZWxkQ29uZmlnIH0pO1xuICB9O1xuXG4gIHB1YmxpYyBpbnRlcnBvbGF0ZSA9ICgodmFsdWU6IHN0cmluZywgc2NvcGVkPzogU2NvcGVkVmFycywgZm9ybWF0Pzogc3RyaW5nIHwgVmFyaWFibGVDdXN0b21Gb3JtYXR0ZXJGbikgPT4ge1xuICAgIHJldHVybiBzY2VuZUdyYXBoLmludGVycG9sYXRlKHRoaXMsIHZhbHVlLCBzY29wZWQsIGZvcm1hdCk7XG4gIH0pIGFzIEludGVycG9sYXRlRnVuY3Rpb247XG5cbiAgcHVibGljIGdldERlc2NyaXB0aW9uID0gKCkgPT4ge1xuICAgIHRoaXMucHVibGlzaEV2ZW50KG5ldyBVc2VyQWN0aW9uRXZlbnQoeyBvcmlnaW46IHRoaXMsIGludGVyYWN0aW9uOiAncGFuZWwtZGVzY3JpcHRpb24tc2hvd24nIH0pLCB0cnVlKTtcblxuICAgIGNvbnN0IHsgZGVzY3JpcHRpb24gfSA9IHRoaXMuc3RhdGU7XG4gICAgaWYgKGRlc2NyaXB0aW9uKSB7XG4gICAgICBjb25zdCBtYXJrZG93biA9IHRoaXMuaW50ZXJwb2xhdGUoZGVzY3JpcHRpb24pO1xuICAgICAgcmV0dXJuIHJlbmRlck1hcmtkb3duKG1hcmtkb3duKTtcbiAgICB9XG4gICAgcmV0dXJuICcnO1xuICB9O1xuXG4gIHB1YmxpYyBjbGVhckZpZWxkQ29uZmlnQ2FjaGUoKSB7XG4gICAgdGhpcy5fZGF0YVdpdGhGaWVsZENvbmZpZyA9IHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxsZWQgZnJvbSB0aGUgcmVhY3QgcmVuZGVyIHBhdGggdG8gYXBwbHkgdGhlIGZpZWxkIGNvbmZpZyB0byB0aGUgZGF0YSBwcm92aWRlZCBieSB0aGUgZGF0YSBwcm92aWRlclxuICAgKi9cbiAgcHVibGljIGFwcGx5RmllbGRDb25maWcocmF3RGF0YT86IFBhbmVsRGF0YSk6IFBhbmVsRGF0YSB7XG4gICAgY29uc3QgcGx1Z2luID0gdGhpcy5fcGx1Z2luO1xuXG4gICAgaWYgKCFwbHVnaW4gfHwgcGx1Z2luLm1ldGEuc2tpcERhdGFRdWVyeSB8fCAhcmF3RGF0YSkge1xuICAgICAgLy8gVE9ETyBzZXR1cCB0aW1lIHJhbmdlIHN1YnNjcmlwdGlvbiBpbnN0ZWFkXG4gICAgICByZXR1cm4gZW1wdHlQYW5lbERhdGE7XG4gICAgfVxuXG4gICAgLy8gSWYgdGhlIGRhdGEgaXMgdGhlIHNhbWUgYXMgbGFzdCB0aW1lLCB3ZSBjYW4gc2tpcCB0aGUgZmllbGQgY29uZmlnIGFwcGx5IHN0ZXAgYW5kIGp1c3QgcmV0dXJuIHNhbWUgcmVzdWx0IGFzIGxhc3QgdGltZVxuICAgIGlmICh0aGlzLl9wcmV2RGF0YSA9PT0gcmF3RGF0YSAmJiB0aGlzLl9kYXRhV2l0aEZpZWxkQ29uZmlnKSB7XG4gICAgICByZXR1cm4gdGhpcy5fZGF0YVdpdGhGaWVsZENvbmZpZztcbiAgICB9XG5cbiAgICBjb25zdCBwbHVnaW5EYXRhU3VwcG9ydDogUGFuZWxQbHVnaW5EYXRhU3VwcG9ydCA9IHBsdWdpbi5kYXRhU3VwcG9ydCB8fCB7IGFsZXJ0U3RhdGVzOiBmYWxzZSwgYW5ub3RhdGlvbnM6IGZhbHNlIH07XG5cbiAgICBjb25zdCBmaWVsZENvbmZpZ1JlZ2lzdHJ5ID0gcGx1Z2luLmZpZWxkQ29uZmlnUmVnaXN0cnk7XG4gICAgY29uc3QgcHJldkZyYW1lcyA9IHRoaXMuX2RhdGFXaXRoRmllbGRDb25maWc/LnNlcmllcyA/PyBbXTtcbiAgICBjb25zdCBuZXdGcmFtZXMgPSBhcHBseUZpZWxkT3ZlcnJpZGVzKHtcbiAgICAgIGRhdGE6IHJhd0RhdGEuc2VyaWVzLFxuICAgICAgZmllbGRDb25maWc6IHRoaXMuc3RhdGUuZmllbGRDb25maWcsXG4gICAgICBmaWVsZENvbmZpZ1JlZ2lzdHJ5LFxuICAgICAgcmVwbGFjZVZhcmlhYmxlczogdGhpcy5pbnRlcnBvbGF0ZSxcbiAgICAgIHRoZW1lOiBjb25maWcudGhlbWUyLFxuICAgICAgdGltZVpvbmU6IHJhd0RhdGEucmVxdWVzdD8udGltZXpvbmUsXG4gICAgfSk7XG5cbiAgICBpZiAoIWNvbXBhcmVBcnJheVZhbHVlcyhuZXdGcmFtZXMsIHByZXZGcmFtZXMsIGNvbXBhcmVEYXRhRnJhbWVTdHJ1Y3R1cmVzKSkge1xuICAgICAgdGhpcy5fc3RydWN0dXJlUmV2Kys7XG4gICAgfVxuXG4gICAgdGhpcy5fZGF0YVdpdGhGaWVsZENvbmZpZyA9IHtcbiAgICAgIC4uLnJhd0RhdGEsXG4gICAgICBzdHJ1Y3R1cmVSZXY6IHRoaXMuX3N0cnVjdHVyZVJldixcbiAgICAgIHNlcmllczogbmV3RnJhbWVzLFxuICAgIH07XG5cbiAgICBpZiAodGhpcy5fZGF0YVdpdGhGaWVsZENvbmZpZy5hbm5vdGF0aW9ucykge1xuICAgICAgdGhpcy5fZGF0YVdpdGhGaWVsZENvbmZpZy5hbm5vdGF0aW9ucyA9IGFwcGx5RmllbGRPdmVycmlkZXMoe1xuICAgICAgICBkYXRhOiB0aGlzLl9kYXRhV2l0aEZpZWxkQ29uZmlnLmFubm90YXRpb25zLFxuICAgICAgICBmaWVsZENvbmZpZzoge1xuICAgICAgICAgIGRlZmF1bHRzOiB7fSxcbiAgICAgICAgICBvdmVycmlkZXM6IFtdLFxuICAgICAgICB9LFxuICAgICAgICBmaWVsZENvbmZpZ1JlZ2lzdHJ5LFxuICAgICAgICByZXBsYWNlVmFyaWFibGVzOiB0aGlzLmludGVycG9sYXRlLFxuICAgICAgICB0aGVtZTogY29uZmlnLnRoZW1lMixcbiAgICAgICAgdGltZVpvbmU6IHJhd0RhdGEucmVxdWVzdD8udGltZXpvbmUsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAoIXBsdWdpbkRhdGFTdXBwb3J0LmFsZXJ0U3RhdGVzKSB7XG4gICAgICB0aGlzLl9kYXRhV2l0aEZpZWxkQ29uZmlnLmFsZXJ0U3RhdGUgPSB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgaWYgKCFwbHVnaW5EYXRhU3VwcG9ydC5hbm5vdGF0aW9ucykge1xuICAgICAgdGhpcy5fZGF0YVdpdGhGaWVsZENvbmZpZy5hbm5vdGF0aW9ucyA9IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICB0aGlzLl9wcmV2RGF0YSA9IHJhd0RhdGE7XG4gICAgcmV0dXJuIHRoaXMuX2RhdGFXaXRoRmllbGRDb25maWc7XG4gIH1cblxuICBwdWJsaWMgb25DYW5jZWxRdWVyeSA9ICgpID0+IHtcbiAgICB0aGlzLnB1Ymxpc2hFdmVudChuZXcgVXNlckFjdGlvbkV2ZW50KHsgb3JpZ2luOiB0aGlzLCBpbnRlcmFjdGlvbjogJ3BhbmVsLWNhbmNlbC1xdWVyeS1jbGlja2VkJyB9KSwgdHJ1ZSk7XG4gICAgY29uc3QgZGF0YSA9IHNjZW5lR3JhcGguZ2V0RGF0YSh0aGlzKTtcbiAgICBkYXRhLmNhbmNlbFF1ZXJ5Py4oKTtcbiAgfTtcblxuICBwdWJsaWMgb25TdGF0dXNNZXNzYWdlQ2xpY2sgPSAoKSA9PiB7XG4gICAgdGhpcy5wdWJsaXNoRXZlbnQobmV3IFVzZXJBY3Rpb25FdmVudCh7IG9yaWdpbjogdGhpcywgaW50ZXJhY3Rpb246ICdwYW5lbC1zdGF0dXMtbWVzc2FnZS1jbGlja2VkJyB9KSwgdHJ1ZSk7XG4gIH07XG5cbiAgLyoqXG4gICAqIFBhbmVsIGNvbnRleHQgZnVuY3Rpb25zXG4gICAqL1xuICBwcml2YXRlIF9vblNlcmllc0NvbG9yQ2hhbmdlID0gKGxhYmVsOiBzdHJpbmcsIGNvbG9yOiBzdHJpbmcpID0+IHtcbiAgICB0aGlzLm9uRmllbGRDb25maWdDaGFuZ2UoY2hhbmdlU2VyaWVzQ29sb3JDb25maWdGYWN0b3J5KGxhYmVsLCBjb2xvciwgdGhpcy5zdGF0ZS5maWVsZENvbmZpZykpO1xuICB9O1xuXG4gIHByaXZhdGUgX29uU2VyaWVzVmlzaWJpbGl0eUNoYW5nZSA9IChsYWJlbDogc3RyaW5nLCBtb2RlOiBTZXJpZXNWaXNpYmlsaXR5Q2hhbmdlTW9kZSkgPT4ge1xuICAgIGlmICghdGhpcy5fZGF0YVdpdGhGaWVsZENvbmZpZykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMub25GaWVsZENvbmZpZ0NoYW5nZShcbiAgICAgIHNlcmllc1Zpc2liaWxpdHlDb25maWdGYWN0b3J5KGxhYmVsLCBtb2RlLCB0aGlzLnN0YXRlLmZpZWxkQ29uZmlnLCB0aGlzLl9kYXRhV2l0aEZpZWxkQ29uZmlnLnNlcmllcyksXG4gICAgICB0cnVlXG4gICAgKTtcbiAgfTtcblxuICBwcml2YXRlIF9vbkluc3RhbmNlU3RhdGVDaGFuZ2UgPSAoc3RhdGU6IGFueSkgPT4ge1xuICAgIGlmICh0aGlzLl9wYW5lbENvbnRleHQpIHtcbiAgICAgIHRoaXMuX3BhbmVsQ29udGV4dCA9IHtcbiAgICAgICAgLi4udGhpcy5fcGFuZWxDb250ZXh0LFxuICAgICAgICBpbnN0YW5jZVN0YXRlOiBzdGF0ZSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgdGhpcy5zZXRTdGF0ZSh7IF9wbHVnaW5JbnN0YW5jZVN0YXRlOiBzdGF0ZSB9KTtcbiAgfTtcblxuICBwcml2YXRlIF9vblRvZ2dsZUxlZ2VuZFNvcnQgPSAoc29ydEtleTogc3RyaW5nKSA9PiB7XG4gICAgY29uc3QgbGVnZW5kT3B0aW9uczogVml6TGVnZW5kT3B0aW9ucyA9ICh0aGlzLnN0YXRlLm9wdGlvbnMgYXMgYW55KS5sZWdlbmQ7XG5cbiAgICAvLyBXZSBkb24ndCB3YW50IHRvIGRvIGFueXRoaW5nIHdoZW4gbGVnZW5kIG9wdGlvbnMgYXJlIG5vdCBhdmFpbGFibGVcbiAgICBpZiAoIWxlZ2VuZE9wdGlvbnMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBsZXQgc29ydERlc2MgPSBsZWdlbmRPcHRpb25zLnNvcnREZXNjO1xuICAgIGxldCBzb3J0QnkgPSBsZWdlbmRPcHRpb25zLnNvcnRCeTtcbiAgICBpZiAoc29ydEtleSAhPT0gc29ydEJ5KSB7XG4gICAgICBzb3J0RGVzYyA9IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICAvLyBpZiBhbHJlYWR5IHNvcnQgYXNjZW5kaW5nLCBkaXNhYmxlIHNvcnRpbmdcbiAgICBpZiAoc29ydERlc2MgPT09IGZhbHNlKSB7XG4gICAgICBzb3J0QnkgPSB1bmRlZmluZWQ7XG4gICAgICBzb3J0RGVzYyA9IHVuZGVmaW5lZDtcbiAgICB9IGVsc2Uge1xuICAgICAgc29ydERlc2MgPSAhc29ydERlc2M7XG4gICAgICBzb3J0QnkgPSBzb3J0S2V5O1xuICAgIH1cblxuICAgIHRoaXMub25PcHRpb25zQ2hhbmdlKFxuICAgICAge1xuICAgICAgICAuLi50aGlzLnN0YXRlLm9wdGlvbnMsXG4gICAgICAgIGxlZ2VuZDogeyAuLi5sZWdlbmRPcHRpb25zLCBzb3J0QnksIHNvcnREZXNjIH0sXG4gICAgICB9IGFzIFRPcHRpb25zLFxuICAgICAgdHJ1ZVxuICAgICk7XG4gIH07XG5cbiAgcHJpdmF0ZSBidWlsZFBhbmVsQ29udGV4dCgpOiBQYW5lbENvbnRleHQge1xuICAgIGNvbnN0IHN5bmMgPSBnZXRDdXJzb3JTeW5jU2NvcGUodGhpcyk7XG5cbiAgICBjb25zdCBjb250ZXh0ID0ge1xuICAgICAgZXZlbnRzU2NvcGU6IHN5bmMgPyBzeW5jLmdldEV2ZW50c1Njb3BlKCkgOiAnX19nbG9iYWxfJyxcbiAgICAgIGV2ZW50QnVzOiBzeW5jID8gc3luYy5nZXRFdmVudHNCdXModGhpcykgOiBnZXRBcHBFdmVudHMoKSxcbiAgICAgIGFwcDogQ29yZUFwcC5Vbmtub3duLFxuICAgICAgc3luYzogKCkgPT4ge1xuICAgICAgICBpZiAoc3luYykge1xuICAgICAgICAgIHJldHVybiBzeW5jLnN0YXRlLnN5bmM7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIERhc2hib2FyZEN1cnNvclN5bmMuT2ZmO1xuICAgICAgfSxcbiAgICAgIG9uU2VyaWVzQ29sb3JDaGFuZ2U6IHRoaXMuX29uU2VyaWVzQ29sb3JDaGFuZ2UsXG4gICAgICBvblRvZ2dsZVNlcmllc1Zpc2liaWxpdHk6IHRoaXMuX29uU2VyaWVzVmlzaWJpbGl0eUNoYW5nZSxcbiAgICAgIG9uVG9nZ2xlTGVnZW5kU29ydDogdGhpcy5fb25Ub2dnbGVMZWdlbmRTb3J0LFxuICAgICAgb25JbnN0YW5jZVN0YXRlQ2hhbmdlOiB0aGlzLl9vbkluc3RhbmNlU3RhdGVDaGFuZ2UsXG4gICAgfTtcblxuICAgIGlmICh0aGlzLnN0YXRlLmV4dGVuZFBhbmVsQ29udGV4dCkge1xuICAgICAgdGhpcy5zdGF0ZS5leHRlbmRQYW5lbENvbnRleHQodGhpcywgY29udGV4dCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNvbnRleHQ7XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0UGFuZWxQbHVnaW5Ob3RGb3VuZChpZDogc3RyaW5nKTogUGFuZWxQbHVnaW4ge1xuICBjb25zdCBwbHVnaW4gPSBuZXcgUGFuZWxQbHVnaW4oKCkgPT4gbnVsbCk7XG5cbiAgcGx1Z2luLm1ldGEgPSB7XG4gICAgaWQ6IGlkLFxuICAgIG5hbWU6IGlkLFxuICAgIHNvcnQ6IDEwMCxcbiAgICB0eXBlOiBQbHVnaW5UeXBlLnBhbmVsLFxuICAgIG1vZHVsZTogJycsXG4gICAgYmFzZVVybDogJycsXG4gICAgaW5mbzoge1xuICAgICAgYXV0aG9yOiB7XG4gICAgICAgIG5hbWU6ICcnLFxuICAgICAgfSxcbiAgICAgIGRlc2NyaXB0aW9uOiAnJyxcbiAgICAgIGxpbmtzOiBbXSxcbiAgICAgIGxvZ29zOiB7XG4gICAgICAgIGxhcmdlOiAnJyxcbiAgICAgICAgc21hbGw6ICdwdWJsaWMvaW1nL2dyYWZhbmFfaWNvbi5zdmcnLFxuICAgICAgfSxcbiAgICAgIHNjcmVlbnNob3RzOiBbXSxcbiAgICAgIHVwZGF0ZWQ6ICcnLFxuICAgICAgdmVyc2lvbjogJycsXG4gICAgfSxcbiAgfTtcblxuICByZXR1cm4gcGx1Z2luO1xufVxuIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBb0dPLE1BQU0saUJBQThELGVBRXpFLENBQUE7QUFBQSxFQWNPLFlBQVksS0FBdUQsRUFBQTtBQXBINUUsSUFBQSxJQUFBLEVBQUEsQ0FBQTtBQXFISSxJQUFNLEtBQUEsQ0FBQSxjQUFBLENBQUE7QUFBQSxNQUNKLFNBQVMsRUFBQztBQUFBLE1BQ1YsYUFBYSxFQUFFLFFBQUEsRUFBVSxFQUFJLEVBQUEsU0FBQSxFQUFXLEVBQUcsRUFBQTtBQUFBLE1BQzNDLEtBQU8sRUFBQSxPQUFBO0FBQUEsTUFDUCxRQUFVLEVBQUEsWUFBQTtBQUFBLE1BQ1YsY0FBZ0IsRUFBQSxDQUFBO0FBQUEsS0FBQSxFQUNiLEtBQ0osQ0FBQSxDQUFBLENBQUE7QUFuQkgsSUFBVSxJQUFBLENBQUEsbUJBQUEsR0FBc0IsSUFBSSx3QkFBQSxDQUF5QixJQUFNLEVBQUE7QUFBQSxNQUNqRSxVQUFZLEVBQUEsQ0FBQyxPQUFTLEVBQUEsU0FBQSxFQUFXLGFBQWEsQ0FBQTtBQUFBLEtBQy9DLENBQUEsQ0FBQTtBQU9ELElBQUEsSUFBQSxDQUFRLGFBQXdCLEdBQUEsQ0FBQSxDQUFBO0FBMEloQyxJQUFPLElBQUEsQ0FBQSxpQkFBQSxHQUFvQixDQUFDLFNBQWlDLEtBQUE7QUFDM0QsTUFBTSxNQUFBLGNBQUEsR0FBaUIsVUFBVyxDQUFBLFlBQUEsQ0FBYSxJQUFJLENBQUEs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
@@ -0,0 +1,44 @@
1
+ import React from 'react';
2
+ import { LinkButton } from '@grafana/ui';
3
+ import { useAsync } from 'react-use';
4
+ import { SceneObjectBase } from '../../core/SceneObjectBase.js';
5
+ import { sceneGraph } from '../../core/sceneGraph/index.js';
6
+ import { getExploreURL } from '../../utils/explore.js';
7
+ import { useReturnToPrevious } from '@grafana/runtime';
8
+
9
+ class VizPanelExploreButton extends SceneObjectBase {
10
+ constructor(options = {}) {
11
+ super({ options });
12
+ }
13
+ }
14
+ VizPanelExploreButton.Component = VizPanelExploreButtonComponent;
15
+ function VizPanelExploreButtonComponent({ model }) {
16
+ const { options } = model.useState();
17
+ const { data } = sceneGraph.getData(model).useState();
18
+ const { from, to } = sceneGraph.getTimeRange(model).useState();
19
+ const { value: exploreLink } = useAsync(
20
+ async () => data ? getExploreURL(data, model, { from, to }, options.transform) : "",
21
+ [data, model, from, to]
22
+ );
23
+ const returnToPrevious = useReturnToPrevious();
24
+ if (exploreLink) {
25
+ return /* @__PURE__ */ React.createElement(LinkButton, {
26
+ key: "explore",
27
+ icon: "compass",
28
+ size: "sm",
29
+ variant: "secondary",
30
+ href: exploreLink,
31
+ onClick: () => {
32
+ var _a;
33
+ if (options.returnToPrevious) {
34
+ returnToPrevious(options.returnToPrevious.title, options.returnToPrevious.href);
35
+ }
36
+ (_a = options.onClick) == null ? void 0 : _a.call(options);
37
+ }
38
+ }, "Explore");
39
+ }
40
+ return null;
41
+ }
42
+
43
+ export { VizPanelExploreButton };
44
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVml6UGFuZWxFeHBsb3JlQnV0dG9uLmpzIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvY29tcG9uZW50cy9WaXpQYW5lbC9WaXpQYW5lbEV4cGxvcmVCdXR0b24udHN4Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5cbmltcG9ydCB7IExpbmtCdXR0b24gfSBmcm9tICdAZ3JhZmFuYS91aSc7XG5pbXBvcnQgeyBEYXRhUXVlcnkgfSBmcm9tICdAZ3JhZmFuYS9zY2hlbWEnO1xuaW1wb3J0IHsgdXNlQXN5bmMgfSBmcm9tICdyZWFjdC11c2UnO1xuaW1wb3J0IHsgU2NlbmVDb21wb25lbnRQcm9wcywgU2NlbmVPYmplY3RTdGF0ZSB9IGZyb20gJy4uLy4uL2NvcmUvdHlwZXMnO1xuaW1wb3J0IHsgU2NlbmVPYmplY3RCYXNlIH0gZnJvbSAnLi4vLi4vY29yZS9TY2VuZU9iamVjdEJhc2UnO1xuaW1wb3J0IHsgc2NlbmVHcmFwaCB9IGZyb20gJy4uLy4uL2NvcmUvc2NlbmVHcmFwaCc7XG5pbXBvcnQgeyBnZXRFeHBsb3JlVVJMIH0gZnJvbSAnLi4vLi4vdXRpbHMvZXhwbG9yZSc7XG5pbXBvcnQgeyB1c2VSZXR1cm5Ub1ByZXZpb3VzIH0gZnJvbSAnQGdyYWZhbmEvcnVudGltZSc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRXhwbG9yZUJ1dHRvbk9wdGlvbnMge1xuICAvLyBDYWxsYmFjayB0byBob29rIGluIHRyYWNraW5nIC8gYW5hbHl0aWNzXG4gIG9uQ2xpY2s/OiAoKSA9PiB2b2lkO1xuXG4gIC8vIENhbGxiYWNrIHRvIG1vZGlmeSBpbnRlcnBvbGF0ZWQgcXVlcnkgYmVmb3JlIHBhc3NpbmcgaXQgdG8gZXhwbG9yZVxuICB0cmFuc2Zvcm0/OiAocXVlcnk6IERhdGFRdWVyeSkgPT4gRGF0YVF1ZXJ5O1xuXG4gIC8vIFRpdGxlIGFuZCBocmVmIGZvciB0aGUgcmV0dXJuIHRvIHByZXZpb3VzIGJ1dHRvblxuICByZXR1cm5Ub1ByZXZpb3VzPzoge1xuICAgIHRpdGxlOiBzdHJpbmc7XG4gICAgaHJlZj86IHN0cmluZztcbiAgfTtcbn1cblxuaW50ZXJmYWNlIEV4cGxvcmVCdXR0b25TdGF0ZSBleHRlbmRzIFNjZW5lT2JqZWN0U3RhdGUge1xuICBvcHRpb25zOiBFeHBsb3JlQnV0dG9uT3B0aW9ucztcbn1cblxuZXhwb3J0IGNsYXNzIFZpelBhbmVsRXhwbG9yZUJ1dHRvbiBleHRlbmRzIFNjZW5lT2JqZWN0QmFzZTxFeHBsb3JlQnV0dG9uU3RhdGU+IHtcbiAgc3RhdGljIENvbXBvbmVudCA9IFZpelBhbmVsRXhwbG9yZUJ1dHRvbkNvbXBvbmVudDtcblxuICBwdWJsaWMgY29uc3RydWN0b3Iob3B0aW9uczogRXhwbG9yZUJ1dHRvbk9wdGlvbnMgPSB7fSkge1xuICAgIHN1cGVyKHsgb3B0aW9ucyB9KTtcbiAgfVxufVxuXG5mdW5jdGlvbiBWaXpQYW5lbEV4cGxvcmVCdXR0b25Db21wb25lbnQoeyBtb2RlbCB9OiBTY2VuZUNvbXBvbmVudFByb3BzPFZpelBhbmVsRXhwbG9yZUJ1dHRvbj4pIHtcbiAgY29uc3QgeyBvcHRpb25zIH0gPSBtb2RlbC51c2VTdGF0ZSgpO1xuXG4gIGNvbnN0IHsgZGF0YSB9ID0gc2NlbmVHcmFwaC5nZXREYXRhKG1vZGVsKS51c2VTdGF0ZSgpO1xuXG4gIGNvbnN0IHsgZnJvbSwgdG8gfSA9IHNjZW5lR3JhcGguZ2V0VGltZVJhbmdlKG1vZGVsKS51c2VTdGF0ZSgpO1xuXG4gIGNvbnN0IHsgdmFsdWU6IGV4cGxvcmVMaW5rIH0gPSB1c2VBc3luYyhcbiAgICBhc3luYyAoKSA9PiAoZGF0YSA/IGdldEV4cGxvcmVVUkwoZGF0YSwgbW9kZWwsIHsgZnJvbSwgdG8gfSwgb3B0aW9ucy50cmFuc2Zvcm0pIDogJycpLFxuICAgIFtkYXRhLCBtb2RlbCwgZnJvbSwgdG9dXG4gICk7XG5cbiAgY29uc3QgcmV0dXJuVG9QcmV2aW91cyA9IHVzZVJldHVyblRvUHJldmlvdXMoKTtcblxuICBpZiAoZXhwbG9yZUxpbmspIHtcbiAgICByZXR1cm4gKFxuICAgICAgPExpbmtCdXR0b25cbiAgICAgICAga2V5PVwiZXhwbG9yZVwiXG4gICAgICAgIGljb249XCJjb21wYXNzXCJcbiAgICAgICAgc2l6ZT1cInNtXCJcbiAgICAgICAgdmFyaWFudD1cInNlY29uZGFyeVwiXG4gICAgICAgIGhyZWY9e2V4cGxvcmVMaW5rfVxuICAgICAgICBvbkNsaWNrPXsoKSA9PiB7XG4gICAgICAgICAgaWYgKG9wdGlvbnMucmV0dXJuVG9QcmV2aW91cykge1xuICAgICAgICAgICAgcmV0dXJuVG9QcmV2aW91cyhvcHRpb25zLnJldHVyblRvUHJldmlvdXMudGl0bGUsIG9wdGlvbnMucmV0dXJuVG9QcmV2aW91cy5ocmVmKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgb3B0aW9ucy5vbkNsaWNrPy4oKTtcbiAgICAgICAgfX1cbiAgICAgID5cbiAgICAgICAgRXhwbG9yZVxuICAgICAgPC9MaW5rQnV0dG9uPlxuICAgICk7XG4gIH1cbiAgcmV0dXJuIG51bGw7XG59XG4iXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7QUE2Qk8sTUFBTSw4QkFBOEIsZUFBb0MsQ0FBQTtBQUFBLEVBR3RFLFdBQUEsQ0FBWSxPQUFnQyxHQUFBLEVBQUksRUFBQTtBQUNyRCxJQUFNLEtBQUEsQ0FBQSxFQUFFLFNBQVMsQ0FBQSxDQUFBO0FBQUEsR0FDbkI7QUFDRixDQUFBO0FBTmEscUJBQUEsQ0FDSixTQUFZLEdBQUEsOEJBQUEsQ0FBQTtBQU9yQixTQUFTLDhCQUFBLENBQStCLEVBQUUsS0FBQSxFQUFxRCxFQUFBO0FBQzdGLEVBQUEsTUFBTSxFQUFFLE9BQUEsRUFBWSxHQUFBLEtBQUEsQ0FBTSxRQUFTLEVBQUEsQ0FBQTtBQUVuQyxFQUFBLE1BQU0sRUFBRSxJQUFLLEVBQUEsR0FBSSxXQUFXLE9BQVEsQ0FBQSxLQUFLLEVBQUUsUUFBUyxFQUFBLENBQUE7QUFFcEQsRUFBTSxNQUFBLEVBQUUsTUFBTSxFQUFHLEVBQUEsR0FBSSxXQUFXLFlBQWEsQ0FBQSxLQUFLLEVBQUUsUUFBUyxFQUFBLENBQUE7QUFFN0QsRUFBTSxNQUFBLEVBQUUsS0FBTyxFQUFBLFdBQUEsRUFBZ0IsR0FBQSxRQUFBO0FBQUEsSUFDN0IsWUFBYSxJQUFPLEdBQUEsYUFBQSxDQUFjLElBQU0sRUFBQSxLQUFBLEVBQU8sRUFBRSxJQUFBLEVBQU0sRUFBRyxFQUFBLEVBQUcsT0FBUSxDQUFBLFNBQVMsQ0FBSSxHQUFBLEVBQUE7QUFBQSxJQUNsRixDQUFDLElBQUEsRUFBTSxLQUFPLEVBQUEsSUFBQSxFQUFNLEVBQUUsQ0FBQTtBQUFBLEdBQ3hCLENBQUE7QUFFQSxFQUFBLE1BQU0sbUJBQW1CLG1CQUFvQixFQUFBLENBQUE7QUFFN0MsRUFBQSxJQUFJLFdBQWEsRUFBQTtBQUNmLElBQUEsdUJBQ0csS0FBQSxDQUFBLGFBQUEsQ0FBQSxVQUFBLEVBQUE7QUFBQSxNQUNDLEdBQUksRUFBQSxTQUFBO0FBQUEsTUFDSixJQUFLLEVBQUEsU0FBQTtBQUFBLE1BQ0wsSUFBSyxFQUFBLElBQUE7QUFBQSxNQUNMLE9BQVEsRUFBQSxXQUFBO0FBQUEsTUFDUixJQUFNLEVBQUEsV0FBQTtBQUFBLE1BQ04sU0FBUyxNQUFNO0FBM0R2QixRQUFBLElBQUEsRUFBQSxDQUFBO0FBNERVLFFBQUEsSUFBSSxRQUFRLGdCQUFrQixFQUFBO0FBQzVCLFVBQUEsZ0JBQUEsQ0FBaUIsT0FBUSxDQUFBLGdCQUFBLENBQWlCLEtBQU8sRUFBQSxPQUFBLENBQVEsaUJBQWlCLElBQUksQ0FBQSxDQUFBO0FBQUEsU0FDaEY7QUFDQSxRQUFBLENBQUEsRUFBQSxHQUFBLE9BQUEsQ0FBUSxPQUFSLEtBQUEsSUFBQSxHQUFBLEtBQUEsQ0FBQSxHQUFBLEVBQUEsQ0FBQSxJQUFBLENBQUEsT0FBQSxDQUFBLENBQUE7QUFBQSxPQUNGO0FBQUEsS0FBQSxFQUNELFNBRUQsQ0FBQSxDQUFBO0FBQUEsR0FFSjtBQUNBLEVBQU8sT0FBQSxJQUFBLENBQUE7QUFDVDs7OzsifQ==
@@ -0,0 +1,59 @@
1
+ import React, { useEffect } from 'react';
2
+ import { Menu } from '@grafana/ui';
3
+ import { SceneObjectBase } from '../../core/SceneObjectBase.js';
4
+ import { selectors } from '@grafana/e2e-selectors';
5
+
6
+ class VizPanelMenu extends SceneObjectBase {
7
+ addItem(item) {
8
+ this.setState({
9
+ items: this.state.items ? [...this.state.items, item] : [item]
10
+ });
11
+ }
12
+ setItems(items) {
13
+ this.setState({
14
+ items
15
+ });
16
+ }
17
+ }
18
+ VizPanelMenu.Component = VizPanelMenuRenderer;
19
+ function VizPanelMenuRenderer({ model }) {
20
+ const { items = [] } = model.useState();
21
+ const ref = React.useRef(null);
22
+ useEffect(() => {
23
+ if (ref.current) {
24
+ ref.current.focus();
25
+ }
26
+ }, []);
27
+ const renderItems = (items2) => {
28
+ return items2.map((item) => {
29
+ switch (item.type) {
30
+ case "divider":
31
+ return /* @__PURE__ */ React.createElement(Menu.Divider, {
32
+ key: item.text
33
+ });
34
+ case "group":
35
+ return /* @__PURE__ */ React.createElement(Menu.Group, {
36
+ key: item.text,
37
+ label: item.text
38
+ }, item.subMenu ? renderItems(item.subMenu) : void 0);
39
+ default:
40
+ return /* @__PURE__ */ React.createElement(Menu.Item, {
41
+ key: item.text,
42
+ label: item.text,
43
+ icon: item.iconClassName,
44
+ childItems: item.subMenu ? renderItems(item.subMenu) : void 0,
45
+ url: item.href,
46
+ onClick: item.onClick,
47
+ shortcut: item.shortcut,
48
+ testId: selectors.components.Panels.Panel.menuItems(item.text)
49
+ });
50
+ }
51
+ });
52
+ };
53
+ return /* @__PURE__ */ React.createElement(Menu, {
54
+ ref
55
+ }, renderItems(items));
56
+ }
57
+
58
+ export { VizPanelMenu };
59
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVml6UGFuZWxNZW51LmpzIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvY29tcG9uZW50cy9WaXpQYW5lbC9WaXpQYW5lbE1lbnUudHN4Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBSZWFjdCwgeyB1c2VFZmZlY3QgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBQYW5lbE1lbnVJdGVtIH0gZnJvbSAnQGdyYWZhbmEvZGF0YSc7XG5pbXBvcnQgeyBNZW51IH0gZnJvbSAnQGdyYWZhbmEvdWknO1xuaW1wb3J0IHsgU2NlbmVPYmplY3RCYXNlIH0gZnJvbSAnLi4vLi4vY29yZS9TY2VuZU9iamVjdEJhc2UnO1xuaW1wb3J0IHsgU2NlbmVDb21wb25lbnRQcm9wcywgU2NlbmVPYmplY3RTdGF0ZSB9IGZyb20gJy4uLy4uL2NvcmUvdHlwZXMnO1xuaW1wb3J0IHsgc2VsZWN0b3JzIH0gZnJvbSAnQGdyYWZhbmEvZTJlLXNlbGVjdG9ycyc7XG5cbmludGVyZmFjZSBWaXpQYW5lbE1lbnVTdGF0ZSBleHRlbmRzIFNjZW5lT2JqZWN0U3RhdGUge1xuICBpdGVtcz86IFBhbmVsTWVudUl0ZW1bXTtcbn1cblxuZXhwb3J0IGNsYXNzIFZpelBhbmVsTWVudSBleHRlbmRzIFNjZW5lT2JqZWN0QmFzZTxWaXpQYW5lbE1lbnVTdGF0ZT4ge1xuICBzdGF0aWMgQ29tcG9uZW50ID0gVml6UGFuZWxNZW51UmVuZGVyZXI7XG5cbiAgLy8gQWxsb3dzIGFkZGluZyBtZW51IGl0ZW1zIGR5bmFtaWNhbGx5XG4gIHB1YmxpYyBhZGRJdGVtKGl0ZW06IFBhbmVsTWVudUl0ZW0pIHtcbiAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgIGl0ZW1zOiB0aGlzLnN0YXRlLml0ZW1zID8gWy4uLnRoaXMuc3RhdGUuaXRlbXMsIGl0ZW1dIDogW2l0ZW1dLFxuICAgIH0pO1xuICB9XG5cbiAgLy8gQWxsb3dzIHJlcGxhY2luZyBhbGwgbWVudSBpdGVtc1xuICBwdWJsaWMgc2V0SXRlbXMoaXRlbXM6IFBhbmVsTWVudUl0ZW1bXSkge1xuICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgaXRlbXMsXG4gICAgfSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gVml6UGFuZWxNZW51UmVuZGVyZXIoeyBtb2RlbCB9OiBTY2VuZUNvbXBvbmVudFByb3BzPFZpelBhbmVsTWVudT4pIHtcbiAgY29uc3QgeyBpdGVtcyA9IFtdIH0gPSBtb2RlbC51c2VTdGF0ZSgpO1xuICBjb25zdCByZWYgPSBSZWFjdC51c2VSZWY8SFRNTERpdkVsZW1lbnQ+KG51bGwpO1xuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKHJlZi5jdXJyZW50KSB7XG4gICAgICByZWYuY3VycmVudC5mb2N1cygpO1xuICAgIH1cbiAgfSwgW10pO1xuXG4gIGNvbnN0IHJlbmRlckl0ZW1zID0gKGl0ZW1zOiBQYW5lbE1lbnVJdGVtW10pID0+IHtcbiAgICByZXR1cm4gaXRlbXMubWFwKChpdGVtKSA9PiB7XG4gICAgICBzd2l0Y2ggKGl0ZW0udHlwZSkge1xuICAgICAgICBjYXNlICdkaXZpZGVyJzpcbiAgICAgICAgICByZXR1cm4gPE1lbnUuRGl2aWRlciBrZXk9e2l0ZW0udGV4dH0gLz47XG4gICAgICAgIGNhc2UgJ2dyb3VwJzpcbiAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgPE1lbnUuR3JvdXAga2V5PXtpdGVtLnRleHR9IGxhYmVsPXtpdGVtLnRleHR9PlxuICAgICAgICAgICAgICB7aXRlbS5zdWJNZW51ID8gcmVuZGVySXRlbXMoaXRlbS5zdWJNZW51KSA6IHVuZGVmaW5lZH1cbiAgICAgICAgICAgIDwvTWVudS5Hcm91cD5cbiAgICAgICAgICApO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICA8TWVudS5JdGVtXG4gICAgICAgICAgICAgIGtleT17aXRlbS50ZXh0fVxuICAgICAgICAgICAgICBsYWJlbD17aXRlbS50ZXh0fVxuICAgICAgICAgICAgICBpY29uPXtpdGVtLmljb25DbGFzc05hbWV9XG4gICAgICAgICAgICAgIGNoaWxkSXRlbXM9e2l0ZW0uc3ViTWVudSA/IHJlbmRlckl0ZW1zKGl0ZW0uc3ViTWVudSkgOiB1bmRlZmluZWR9XG4gICAgICAgICAgICAgIHVybD17aXRlbS5ocmVmfVxuICAgICAgICAgICAgICBvbkNsaWNrPXtpdGVtLm9uQ2xpY2t9XG4gICAgICAgICAgICAgIHNob3J0Y3V0PXtpdGVtLnNob3J0Y3V0fVxuICAgICAgICAgICAgICB0ZXN0SWQ9e3NlbGVjdG9ycy5jb21wb25lbnRzLlBhbmVscy5QYW5lbC5tZW51SXRlbXMoaXRlbS50ZXh0KX1cbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfTtcblxuICByZXR1cm4gPE1lbnUgcmVmPXtyZWZ9PntyZW5kZXJJdGVtcyhpdGVtcyl9PC9NZW51Pjtcbn1cbiJdLCJuYW1lcyI6WyJpdGVtcyJdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFXTyxNQUFNLHFCQUFxQixlQUFtQyxDQUFBO0FBQUEsRUFJNUQsUUFBUSxJQUFxQixFQUFBO0FBQ2xDLElBQUEsSUFBQSxDQUFLLFFBQVMsQ0FBQTtBQUFBLE1BQ1osS0FBTyxFQUFBLElBQUEsQ0FBSyxLQUFNLENBQUEsS0FBQSxHQUFRLENBQUMsR0FBRyxJQUFLLENBQUEsS0FBQSxDQUFNLEtBQU8sRUFBQSxJQUFJLENBQUksR0FBQSxDQUFDLElBQUksQ0FBQTtBQUFBLEtBQzlELENBQUEsQ0FBQTtBQUFBLEdBQ0g7QUFBQSxFQUdPLFNBQVMsS0FBd0IsRUFBQTtBQUN0QyxJQUFBLElBQUEsQ0FBSyxRQUFTLENBQUE7QUFBQSxNQUNaLEtBQUE7QUFBQSxLQUNELENBQUEsQ0FBQTtBQUFBLEdBQ0g7QUFDRixDQUFBO0FBaEJhLFlBQUEsQ0FDSixTQUFZLEdBQUEsb0JBQUEsQ0FBQTtBQWlCckIsU0FBUyxvQkFBQSxDQUFxQixFQUFFLEtBQUEsRUFBNEMsRUFBQTtBQUMxRSxFQUFBLE1BQU0sRUFBRSxLQUFRLEdBQUEsRUFBRyxFQUFBLEdBQUksTUFBTSxRQUFTLEVBQUEsQ0FBQTtBQUN0QyxFQUFNLE1BQUEsR0FBQSxHQUFNLEtBQU0sQ0FBQSxNQUFBLENBQXVCLElBQUksQ0FBQSxDQUFBO0FBRTdDLEVBQUEsU0FBQSxDQUFVLE1BQU07QUFDZCxJQUFBLElBQUksSUFBSSxPQUFTLEVBQUE7QUFDZixNQUFBLEdBQUEsQ0FBSSxRQUFRLEtBQU0sRUFBQSxDQUFBO0FBQUEsS0FDcEI7QUFBQSxHQUNGLEVBQUcsRUFBRSxDQUFBLENBQUE7QUFFTCxFQUFNLE1BQUEsV0FBQSxHQUFjLENBQUNBLE1BQTJCLEtBQUE7QUFDOUMsSUFBT0EsT0FBQUEsTUFBQUEsQ0FBTSxHQUFJLENBQUEsQ0FBQyxJQUFTLEtBQUE7QUFDekIsTUFBQSxRQUFRLElBQUssQ0FBQSxJQUFBO0FBQUEsUUFDTixLQUFBLFNBQUE7QUFDSCxVQUFPLHVCQUFBLEtBQUEsQ0FBQSxhQUFBLENBQUMsS0FBSyxPQUFMLEVBQUE7QUFBQSxZQUFhLEtBQUssSUFBSyxDQUFBLElBQUE7QUFBQSxXQUFNLENBQUEsQ0FBQTtBQUFBLFFBQ2xDLEtBQUEsT0FBQTtBQUNILFVBQ0UsdUJBQUEsS0FBQSxDQUFBLGFBQUEsQ0FBQyxLQUFLLEtBQUwsRUFBQTtBQUFBLFlBQVcsS0FBSyxJQUFLLENBQUEsSUFBQTtBQUFBLFlBQU0sT0FBTyxJQUFLLENBQUEsSUFBQTtBQUFBLFdBQUEsRUFDckMsS0FBSyxPQUFVLEdBQUEsV0FBQSxDQUFZLElBQUssQ0FBQSxPQUFPLElBQUksS0FDOUMsQ0FBQSxDQUFBLENBQUE7QUFBQSxRQUFBO0FBR0YsVUFDRSx1QkFBQSxLQUFBLENBQUEsYUFBQSxDQUFDLEtBQUssSUFBTCxFQUFBO0FBQUEsWUFDQyxLQUFLLElBQUssQ0FBQSxJQUFBO0FBQUEsWUFDVixPQUFPLElBQUssQ0FBQSxJQUFBO0FBQUEsWUFDWixNQUFNLElBQUssQ0FBQSxhQUFBO0FBQUEsWUFDWCxZQUFZLElBQUssQ0FBQSxPQUFBLEdBQVUsV0FBWSxDQUFBLElBQUEsQ0FBSyxPQUFPLENBQUksR0FBQSxLQUFBLENBQUE7QUFBQSxZQUN2RCxLQUFLLElBQUssQ0FBQSxJQUFBO0FBQUEsWUFDVixTQUFTLElBQUssQ0FBQSxPQUFBO0FBQUEsWUFDZCxVQUFVLElBQUssQ0FBQSxRQUFBO0FBQUEsWUFDZixRQUFRLFNBQVUsQ0FBQSxVQUFBLENBQVcsT0FBTyxLQUFNLENBQUEsU0FBQSxDQUFVLEtBQUssSUFBSSxDQUFBO0FBQUEsV0FDL0QsQ0FBQSxDQUFBO0FBQUEsT0FBQTtBQUFBLEtBR1AsQ0FBQSxDQUFBO0FBQUEsR0FDSCxDQUFBO0FBRUEsRUFBQSx1QkFBUSxLQUFBLENBQUEsYUFBQSxDQUFBLElBQUEsRUFBQTtBQUFBLElBQUssR0FBQTtBQUFBLEdBQVcsRUFBQSxXQUFBLENBQVksS0FBSyxDQUFFLENBQUEsQ0FBQTtBQUM3Qzs7OzsifQ==