@grafana/scenes 6.7.0--canary.1091.14350229100.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 +25 -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,286 @@
1
+ import { useState, useEffect } from 'react';
2
+ import { Subscription } from 'rxjs';
3
+ import { v4 } from 'uuid';
4
+ import { EventBusSrv } from '@grafana/data';
5
+ import { SceneComponentWrapper } from './SceneComponentWrapper.js';
6
+ import { SceneObjectStateChangedEvent } from './events.js';
7
+ import { cloneSceneObject } from './sceneGraph/utils.js';
8
+ import { SceneObjectRef } from './SceneObjectRef.js';
9
+
10
+ var __defProp = Object.defineProperty;
11
+ var __getOwnPropSymbols = Object.getOwnPropertySymbols;
12
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
13
+ var __propIsEnum = Object.prototype.propertyIsEnumerable;
14
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
15
+ var __spreadValues = (a, b) => {
16
+ for (var prop in b || (b = {}))
17
+ if (__hasOwnProp.call(b, prop))
18
+ __defNormalProp(a, prop, b[prop]);
19
+ if (__getOwnPropSymbols)
20
+ for (var prop of __getOwnPropSymbols(b)) {
21
+ if (__propIsEnum.call(b, prop))
22
+ __defNormalProp(a, prop, b[prop]);
23
+ }
24
+ return a;
25
+ };
26
+ class SceneObjectBase {
27
+ constructor(state) {
28
+ this._isActive = false;
29
+ this._activationHandlers = [];
30
+ this._deactivationHandlers = /* @__PURE__ */ new Map();
31
+ this._subs = new Subscription();
32
+ this._refCount = 0;
33
+ this._renderBeforeActivation = false;
34
+ if (!state.key) {
35
+ state.key = v4();
36
+ }
37
+ this._events = new EventBusSrv();
38
+ this._state = Object.freeze(state);
39
+ this._setParent(this._state);
40
+ }
41
+ get state() {
42
+ return this._state;
43
+ }
44
+ get isActive() {
45
+ return this._isActive;
46
+ }
47
+ get renderBeforeActivation() {
48
+ return this._renderBeforeActivation;
49
+ }
50
+ get parent() {
51
+ return this._parent;
52
+ }
53
+ get variableDependency() {
54
+ return this._variableDependency;
55
+ }
56
+ get urlSync() {
57
+ return this._urlSync;
58
+ }
59
+ get Component() {
60
+ return SceneComponentWrapper;
61
+ }
62
+ _setParent(state) {
63
+ forEachChild(state, (child) => {
64
+ if (child._parent && child._parent !== this) {
65
+ console.warn(
66
+ "SceneObject already has a parent set that is different from the new parent. You cannot share the same SceneObject instance in multiple scenes or in multiple different places of the same scene graph. Use SceneObject.clone() to duplicate a SceneObject or store a state key reference and use sceneGraph.findObject to locate it.",
67
+ child,
68
+ this
69
+ );
70
+ }
71
+ child._parent = this;
72
+ });
73
+ }
74
+ clearParent() {
75
+ this._parent = void 0;
76
+ }
77
+ subscribeToState(handler) {
78
+ return this._events.subscribe(SceneObjectStateChangedEvent, (event) => {
79
+ if (event.payload.changedObject === this) {
80
+ handler(event.payload.newState, event.payload.prevState);
81
+ }
82
+ });
83
+ }
84
+ subscribeToEvent(eventType, handler) {
85
+ return this._events.subscribe(eventType, handler);
86
+ }
87
+ setState(update) {
88
+ const prevState = this._state;
89
+ const newState = __spreadValues(__spreadValues({}, this._state), update);
90
+ this._state = Object.freeze(newState);
91
+ this._setParent(update);
92
+ this._handleActivationOfChangedStateProps(prevState, newState);
93
+ this.publishEvent(
94
+ new SceneObjectStateChangedEvent({
95
+ prevState,
96
+ newState,
97
+ partialUpdate: update,
98
+ changedObject: this
99
+ }),
100
+ true
101
+ );
102
+ }
103
+ _handleActivationOfChangedStateProps(prevState, newState) {
104
+ if (!this.isActive) {
105
+ return;
106
+ }
107
+ if (prevState.$behaviors !== newState.$behaviors) {
108
+ this._handleChangedBehaviors(prevState.$behaviors, newState.$behaviors);
109
+ }
110
+ if (prevState.$data !== newState.$data) {
111
+ this._handleChangedStateActivation(prevState.$data, newState.$data);
112
+ }
113
+ if (prevState.$variables !== newState.$variables) {
114
+ this._handleChangedStateActivation(prevState.$variables, newState.$variables);
115
+ }
116
+ if (prevState.$timeRange !== newState.$timeRange) {
117
+ this._handleChangedStateActivation(prevState.$timeRange, newState.$timeRange);
118
+ }
119
+ }
120
+ _handleChangedStateActivation(oldValue, newValue) {
121
+ if (oldValue) {
122
+ const deactivationHandler = this._deactivationHandlers.get(oldValue);
123
+ if (deactivationHandler) {
124
+ deactivationHandler();
125
+ this._deactivationHandlers.delete(oldValue);
126
+ }
127
+ }
128
+ if (newValue) {
129
+ this._deactivationHandlers.set(newValue, newValue.activate());
130
+ }
131
+ }
132
+ _handleChangedBehaviors(oldValue, newValue) {
133
+ if (oldValue) {
134
+ for (const oldBehavior of oldValue) {
135
+ if (!newValue || !newValue.includes(oldBehavior)) {
136
+ const deactivationHandler = this._deactivationHandlers.get(oldBehavior);
137
+ if (deactivationHandler) {
138
+ deactivationHandler();
139
+ this._deactivationHandlers.delete(oldBehavior);
140
+ }
141
+ }
142
+ }
143
+ }
144
+ if (newValue) {
145
+ for (const newBehavior of newValue) {
146
+ if (!oldValue || !oldValue.includes(newBehavior)) {
147
+ this._activateBehavior(newBehavior);
148
+ }
149
+ }
150
+ }
151
+ }
152
+ publishEvent(event, bubble) {
153
+ this._events.publish(event);
154
+ if (bubble && this.parent) {
155
+ this.parent.publishEvent(event, bubble);
156
+ }
157
+ }
158
+ getRoot() {
159
+ return !this._parent ? this : this._parent.getRoot();
160
+ }
161
+ _internalActivate() {
162
+ this._isActive = true;
163
+ const { $data, $variables, $timeRange, $behaviors } = this.state;
164
+ this._activationHandlers.forEach((handler) => {
165
+ const result = handler();
166
+ if (result) {
167
+ this._deactivationHandlers.set(result, result);
168
+ }
169
+ });
170
+ if ($timeRange && !$timeRange.isActive) {
171
+ this._deactivationHandlers.set($timeRange, $timeRange.activate());
172
+ }
173
+ if ($variables && !$variables.isActive) {
174
+ this._deactivationHandlers.set($variables, $variables.activate());
175
+ }
176
+ if ($data && !$data.isActive) {
177
+ this._deactivationHandlers.set($data, $data.activate());
178
+ }
179
+ if ($behaviors) {
180
+ for (const behavior of $behaviors) {
181
+ this._activateBehavior(behavior);
182
+ }
183
+ }
184
+ }
185
+ _activateBehavior(behavior) {
186
+ if (behavior instanceof SceneObjectBase) {
187
+ this._deactivationHandlers.set(behavior, behavior.activate());
188
+ } else if (typeof behavior === "function") {
189
+ const deactivate = behavior(this);
190
+ if (deactivate) {
191
+ this._deactivationHandlers.set(behavior, deactivate);
192
+ }
193
+ }
194
+ }
195
+ activate() {
196
+ if (!this.isActive) {
197
+ this._internalActivate();
198
+ }
199
+ this._refCount++;
200
+ let called = false;
201
+ return () => {
202
+ this._refCount--;
203
+ if (called) {
204
+ const msg = `SceneObject cancelation handler returned by activate() called a second time`;
205
+ throw new Error(msg);
206
+ }
207
+ called = true;
208
+ if (this._refCount === 0) {
209
+ this._internalDeactivate();
210
+ }
211
+ };
212
+ }
213
+ _internalDeactivate() {
214
+ this._isActive = false;
215
+ for (let handler of this._deactivationHandlers.values()) {
216
+ handler();
217
+ }
218
+ this._deactivationHandlers.clear();
219
+ this._events.removeAllListeners();
220
+ this._subs.unsubscribe();
221
+ this._subs = new Subscription();
222
+ }
223
+ useState() {
224
+ return useSceneObjectState(this);
225
+ }
226
+ forceRender() {
227
+ this.setState({});
228
+ }
229
+ clone(withState) {
230
+ return cloneSceneObject(this, withState);
231
+ }
232
+ addActivationHandler(handler) {
233
+ this._activationHandlers.push(handler);
234
+ }
235
+ forEachChild(callback) {
236
+ forEachChild(this.state, callback);
237
+ }
238
+ getRef() {
239
+ if (!this._ref) {
240
+ this._ref = new SceneObjectRef(this);
241
+ }
242
+ return this._ref;
243
+ }
244
+ }
245
+ function useSceneObjectState(model, options) {
246
+ var _a;
247
+ const [_, setState] = useState(model.state);
248
+ const stateAtFirstRender = model.state;
249
+ const shouldActivateOrKeepAlive = (_a = options == null ? void 0 : options.shouldActivateOrKeepAlive) != null ? _a : false;
250
+ useEffect(() => {
251
+ let unactivate;
252
+ if (shouldActivateOrKeepAlive) {
253
+ unactivate = model.activate();
254
+ }
255
+ const s = model.subscribeToState((state) => {
256
+ setState(state);
257
+ });
258
+ if (model.state !== stateAtFirstRender) {
259
+ setState(model.state);
260
+ }
261
+ return () => {
262
+ s.unsubscribe();
263
+ if (unactivate) {
264
+ unactivate();
265
+ }
266
+ };
267
+ }, [model, shouldActivateOrKeepAlive]);
268
+ return model.state;
269
+ }
270
+ function forEachChild(state, callback) {
271
+ for (const propValue of Object.values(state)) {
272
+ if (propValue instanceof SceneObjectBase) {
273
+ callback(propValue);
274
+ }
275
+ if (Array.isArray(propValue)) {
276
+ for (const child of propValue) {
277
+ if (child instanceof SceneObjectBase) {
278
+ callback(child);
279
+ }
280
+ }
281
+ }
282
+ }
283
+ }
284
+
285
+ export { SceneObjectBase, useSceneObjectState };
286
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2NlbmVPYmplY3RCYXNlLmpzIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvY29yZS9TY2VuZU9iamVjdEJhc2UudHN4Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHVzZUVmZmVjdCwgdXNlU3RhdGUgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBTdWJzY3JpcHRpb24sIFVuc3Vic2NyaWJhYmxlIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyB2NCBhcyB1dWlkdjQgfSBmcm9tICd1dWlkJztcblxuaW1wb3J0IHsgQnVzRXZlbnQsIEJ1c0V2ZW50SGFuZGxlciwgQnVzRXZlbnRUeXBlLCBFdmVudEJ1cywgRXZlbnRCdXNTcnYgfSBmcm9tICdAZ3JhZmFuYS9kYXRhJztcbmltcG9ydCB7XG4gIFNjZW5lT2JqZWN0LFxuICBTY2VuZUNvbXBvbmVudCxcbiAgU2NlbmVPYmplY3RVcmxTeW5jSGFuZGxlcixcbiAgU2NlbmVTdGF0ZUNoYW5nZWRIYW5kbGVyLFxuICBTY2VuZUFjdGl2YXRpb25IYW5kbGVyLFxuICBTY2VuZURlYWN0aXZhdGlvbkhhbmRsZXIsXG4gIENhbmNlbEFjdGl2YXRpb25IYW5kbGVyLFxuICBTY2VuZU9iamVjdFN0YXRlLFxuICBVc2VTdGF0ZUhvb2tPcHRpb25zLFxuICBTY2VuZVN0YXRlbGVzc0JlaGF2aW9yLFxufSBmcm9tICcuL3R5cGVzJztcblxuaW1wb3J0IHsgU2NlbmVDb21wb25lbnRXcmFwcGVyIH0gZnJvbSAnLi9TY2VuZUNvbXBvbmVudFdyYXBwZXInO1xuaW1wb3J0IHsgU2NlbmVPYmplY3RTdGF0ZUNoYW5nZWRFdmVudCB9IGZyb20gJy4vZXZlbnRzJztcbmltcG9ydCB7IGNsb25lU2NlbmVPYmplY3QgfSBmcm9tICcuL3NjZW5lR3JhcGgvdXRpbHMnO1xuaW1wb3J0IHsgU2NlbmVWYXJpYWJsZURlcGVuZGVuY3lDb25maWdMaWtlIH0gZnJvbSAnLi4vdmFyaWFibGVzL3R5cGVzJztcbmltcG9ydCB7IFNjZW5lT2JqZWN0UmVmIH0gZnJvbSAnLi9TY2VuZU9iamVjdFJlZic7XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBTY2VuZU9iamVjdEJhc2U8VFN0YXRlIGV4dGVuZHMgU2NlbmVPYmplY3RTdGF0ZSA9IFNjZW5lT2JqZWN0U3RhdGU+XG4gIGltcGxlbWVudHMgU2NlbmVPYmplY3Q8VFN0YXRlPlxue1xuICBwcml2YXRlIF9pc0FjdGl2ZSA9IGZhbHNlO1xuICBwcml2YXRlIF9zdGF0ZTogVFN0YXRlO1xuICBwcml2YXRlIF9hY3RpdmF0aW9uSGFuZGxlcnM6IFNjZW5lQWN0aXZhdGlvbkhhbmRsZXJbXSA9IFtdO1xuICBwcml2YXRlIF9kZWFjdGl2YXRpb25IYW5kbGVycyA9IG5ldyBNYXA8b2JqZWN0LCBTY2VuZURlYWN0aXZhdGlvbkhhbmRsZXI+KCk7XG4gIHByaXZhdGUgX3JlZj86IFNjZW5lT2JqZWN0UmVmPHRoaXM+O1xuXG4gIHByb3RlY3RlZCBfZXZlbnRzPzogRXZlbnRCdXM7XG4gIHByb3RlY3RlZCBfcGFyZW50PzogU2NlbmVPYmplY3Q7XG4gIHByb3RlY3RlZCBfc3VicyA9IG5ldyBTdWJzY3JpcHRpb24oKTtcbiAgcHJvdGVjdGVkIF9yZWZDb3VudCA9IDA7XG4gIHByb3RlY3RlZCBfcmVuZGVyQmVmb3JlQWN0aXZhdGlvbiA9IGZhbHNlO1xuXG4gIHByb3RlY3RlZCBfdmFyaWFibGVEZXBlbmRlbmN5OiBTY2VuZVZhcmlhYmxlRGVwZW5kZW5jeUNvbmZpZ0xpa2UgfCB1bmRlZmluZWQ7XG4gIHByb3RlY3RlZCBfdXJsU3luYzogU2NlbmVPYmplY3RVcmxTeW5jSGFuZGxlciB8IHVuZGVmaW5lZDtcblxuICBwdWJsaWMgY29uc3RydWN0b3Ioc3RhdGU6IFRTdGF0ZSkge1xuICAgIGlmICghc3RhdGUua2V5KSB7XG4gICAgICBzdGF0ZS5rZXkgPSB1dWlkdjQoKTtcbiAgICB9XG5cbiAgICB0aGlzLl9ldmVudHMgPSBuZXcgRXZlbnRCdXNTcnYoKTtcblxuICAgIHRoaXMuX3N0YXRlID0gT2JqZWN0LmZyZWV6ZShzdGF0ZSk7XG4gICAgdGhpcy5fc2V0UGFyZW50KHRoaXMuX3N0YXRlKTtcbiAgfVxuXG4gIC8qKiBDdXJyZW50IHN0YXRlICovXG4gIHB1YmxpYyBnZXQgc3RhdGUoKTogVFN0YXRlIHtcbiAgICByZXR1cm4gdGhpcy5fc3RhdGU7XG4gIH1cblxuICAvKiogVHJ1ZSBpZiBjdXJyZW50bHkgYmVpbmcgYWN0aXZlIChpZSBkaXNwbGF5ZWQgZm9yIHZpc3VhbCBvYmplY3RzKSAqL1xuICBwdWJsaWMgZ2V0IGlzQWN0aXZlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9pc0FjdGl2ZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgcmVuZGVyQmVmb3JlQWN0aXZhdGlvbigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fcmVuZGVyQmVmb3JlQWN0aXZhdGlvbjtcbiAgfVxuXG4gIC8qKiBSZXR1cm5zIHRoZSBwYXJlbnQsIHVuZGVmaW5lZCBmb3Igcm9vdCBvYmplY3QgKi9cbiAgcHVibGljIGdldCBwYXJlbnQoKTogU2NlbmVPYmplY3QgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9wYXJlbnQ7XG4gIH1cblxuICAvKiogUmV0dXJucyB2YXJpYWJsZSBkZXBlbmRlbmN5IGNvbmZpZyAqL1xuICBwdWJsaWMgZ2V0IHZhcmlhYmxlRGVwZW5kZW5jeSgpOiBTY2VuZVZhcmlhYmxlRGVwZW5kZW5jeUNvbmZpZ0xpa2UgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl92YXJpYWJsZURlcGVuZGVuY3k7XG4gIH1cblxuICAvKiogUmV0dXJucyB1cmwgc3luYyBjb25maWcgKi9cbiAgcHVibGljIGdldCB1cmxTeW5jKCk6IFNjZW5lT2JqZWN0VXJsU3luY0hhbmRsZXIgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl91cmxTeW5jO1xuICB9XG5cbiAgLyoqXG4gICAqIFVzZWQgaW4gcmVuZGVyIGZ1bmN0aW9ucyB3aGVuIHJlbmRlcmluZyBhIFNjZW5lT2JqZWN0LlxuICAgKiBXcmFwcyB0aGUgY29tcG9uZW50IGluIGFuIEVkaXRXcmFwcGVyIHRoYXQgaGFuZGxlcyBlZGl0IG1vZGVcbiAgICovXG4gIHB1YmxpYyBnZXQgQ29tcG9uZW50KCk6IFNjZW5lQ29tcG9uZW50PHRoaXM+IHtcbiAgICByZXR1cm4gU2NlbmVDb21wb25lbnRXcmFwcGVyIGFzIFNjZW5lQ29tcG9uZW50PHRoaXM+O1xuICB9XG5cbiAgcHJpdmF0ZSBfc2V0UGFyZW50KHN0YXRlOiBQYXJ0aWFsPFRTdGF0ZT4pIHtcbiAgICBmb3JFYWNoQ2hpbGQoc3RhdGUsIChjaGlsZCkgPT4ge1xuICAgICAgLy8gSWYgd2UgYWxyZWFkeSBoYXZlIGEgcGFyZW50IGFuZCBpdCdzIG5vdCB0aGlzLCB0aGVuIHdlIGxpa2VseSBoYXZlIGEgYnVnXG4gICAgICBpZiAoY2hpbGQuX3BhcmVudCAmJiBjaGlsZC5fcGFyZW50ICE9PSB0aGlzKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICAnU2NlbmVPYmplY3QgYWxyZWFkeSBoYXMgYSBwYXJlbnQgc2V0IHRoYXQgaXMgZGlmZmVyZW50IGZyb20gdGhlIG5ldyBwYXJlbnQuIFlvdSBjYW5ub3Qgc2hhcmUgdGhlIHNhbWUgU2NlbmVPYmplY3QgaW5zdGFuY2UgaW4gbXVsdGlwbGUgc2NlbmVzIG9yIGluIG11bHRpcGxlIGRpZmZlcmVudCBwbGFjZXMgb2YgdGhlIHNhbWUgc2NlbmUgZ3JhcGguIFVzZSBTY2VuZU9iamVjdC5jbG9uZSgpIHRvIGR1cGxpY2F0ZSBhIFNjZW5lT2JqZWN0IG9yIHN0b3JlIGEgc3RhdGUga2V5IHJlZmVyZW5jZSBhbmQgdXNlIHNjZW5lR3JhcGguZmluZE9iamVjdCB0byBsb2NhdGUgaXQuJyxcbiAgICAgICAgICBjaGlsZCxcbiAgICAgICAgICB0aGlzXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBjaGlsZC5fcGFyZW50ID0gdGhpcztcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTb21ldGltZXMgeW91IHdhbnQgdG8gbW92ZSBvbmUgaW5zdGFuY2UgdG8gYW5vdGhlciBwYXJlbnQuXG4gICAqIFRoaXMgaXMgYSB3YXkgdG8gZG8gdGhhdCB3aXRob3V0IGdldHRpbmcgdGhlIGNvbnNvbGUgd2FybmluZy5cbiAgICovXG4gIHB1YmxpYyBjbGVhclBhcmVudCgpIHtcbiAgICB0aGlzLl9wYXJlbnQgPSB1bmRlZmluZWQ7XG4gIH1cblxuICAvKipcbiAgICogU3Vic2NyaWJlIHRvIHRoZSBzY2VuZSBzdGF0ZSBzdWJqZWN0XG4gICAqKi9cbiAgcHVibGljIHN1YnNjcmliZVRvU3RhdGUoaGFuZGxlcjogU2NlbmVTdGF0ZUNoYW5nZWRIYW5kbGVyPFRTdGF0ZT4pOiBVbnN1YnNjcmliYWJsZSB7XG4gICAgcmV0dXJuIHRoaXMuX2V2ZW50cyEuc3Vic2NyaWJlKFNjZW5lT2JqZWN0U3RhdGVDaGFuZ2VkRXZlbnQsIChldmVudCkgPT4ge1xuICAgICAgaWYgKGV2ZW50LnBheWxvYWQuY2hhbmdlZE9iamVjdCA9PT0gdGhpcykge1xuICAgICAgICBoYW5kbGVyKGV2ZW50LnBheWxvYWQubmV3U3RhdGUgYXMgVFN0YXRlLCBldmVudC5wYXlsb2FkLnByZXZTdGF0ZSBhcyBUU3RhdGUpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFN1YnNjcmliZSB0byB0aGUgc2NlbmUgZXZlbnRcbiAgICoqL1xuICBwdWJsaWMgc3Vic2NyaWJlVG9FdmVudDxUIGV4dGVuZHMgQnVzRXZlbnQ+KGV2ZW50VHlwZTogQnVzRXZlbnRUeXBlPFQ+LCBoYW5kbGVyOiBCdXNFdmVudEhhbmRsZXI8VD4pOiBVbnN1YnNjcmliYWJsZSB7XG4gICAgcmV0dXJuIHRoaXMuX2V2ZW50cyEuc3Vic2NyaWJlKGV2ZW50VHlwZSwgaGFuZGxlcik7XG4gIH1cblxuICBwdWJsaWMgc2V0U3RhdGUodXBkYXRlOiBQYXJ0aWFsPFRTdGF0ZT4pIHtcbiAgICBjb25zdCBwcmV2U3RhdGUgPSB0aGlzLl9zdGF0ZTtcbiAgICBjb25zdCBuZXdTdGF0ZTogVFN0YXRlID0ge1xuICAgICAgLi4udGhpcy5fc3RhdGUsXG4gICAgICAuLi51cGRhdGUsXG4gICAgfTtcblxuICAgIHRoaXMuX3N0YXRlID0gT2JqZWN0LmZyZWV6ZShuZXdTdGF0ZSk7XG4gICAgdGhpcy5fc2V0UGFyZW50KHVwZGF0ZSk7XG5cbiAgICAvLyBIYW5kbGVzIGNhc2VzIHdoZW4gJGRhdGEsICR0aW1lUmFuZ2UsIG9yICR2YXJpYWJsZXMgYXJlIGNoYW5nZWRcbiAgICB0aGlzLl9oYW5kbGVBY3RpdmF0aW9uT2ZDaGFuZ2VkU3RhdGVQcm9wcyhwcmV2U3RhdGUsIG5ld1N0YXRlKTtcblxuICAgIC8vIEJ1YmJsZSBzdGF0ZSBjaGFuZ2UgZXZlbnQuIFRoaXMgaXMgZXZlbnQgaXMgc3Vic2NyaWJlZCB0byBieSBVcmxTeW5jTWFuYWdlciBhbmQgVW5kb01hbmFnZXJcbiAgICB0aGlzLnB1Ymxpc2hFdmVudChcbiAgICAgIG5ldyBTY2VuZU9iamVjdFN0YXRlQ2hhbmdlZEV2ZW50KHtcbiAgICAgICAgcHJldlN0YXRlLFxuICAgICAgICBuZXdTdGF0ZSxcbiAgICAgICAgcGFydGlhbFVwZGF0ZTogdXBkYXRlLFxuICAgICAgICBjaGFuZ2VkT2JqZWN0OiB0aGlzLFxuICAgICAgfSksXG4gICAgICB0cnVlXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGlzIGhhbmRsZXMgYWN0aXZhdGlvbiBhbmQgZGVhY3RpdmF0aW9uIG9mICRkYXRhLCAkdGltZVJhbmdlIGFuZCAkdmFyaWFibGVzIHdoZW4gdGhleSBjaGFuZ2VcbiAgICogZHVyaW5nIHRoZSBhY3RpdmUgcGhhc2Ugb2YgdGhlIHNjZW5lIG9iamVjdC5cbiAgICovXG4gIHByaXZhdGUgX2hhbmRsZUFjdGl2YXRpb25PZkNoYW5nZWRTdGF0ZVByb3BzKHByZXZTdGF0ZTogVFN0YXRlLCBuZXdTdGF0ZTogVFN0YXRlKSB7XG4gICAgaWYgKCF0aGlzLmlzQWN0aXZlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHByZXZTdGF0ZS4kYmVoYXZpb3JzICE9PSBuZXdTdGF0ZS4kYmVoYXZpb3JzKSB7XG4gICAgICB0aGlzLl9oYW5kbGVDaGFuZ2VkQmVoYXZpb3JzKHByZXZTdGF0ZS4kYmVoYXZpb3JzLCBuZXdTdGF0ZS4kYmVoYXZpb3JzKTtcbiAgICB9XG5cbiAgICBpZiAocHJldlN0YXRlLiRkYXRhICE9PSBuZXdTdGF0ZS4kZGF0YSkge1xuICAgICAgdGhpcy5faGFuZGxlQ2hhbmdlZFN0YXRlQWN0aXZhdGlvbihwcmV2U3RhdGUuJGRhdGEsIG5ld1N0YXRlLiRkYXRhKTtcbiAgICB9XG5cbiAgICBpZiAocHJldlN0YXRlLiR2YXJpYWJsZXMgIT09IG5ld1N0YXRlLiR2YXJpYWJsZXMpIHtcbiAgICAgIHRoaXMuX2hhbmRsZUNoYW5nZWRTdGF0ZUFjdGl2YXRpb24ocHJldlN0YXRlLiR2YXJpYWJsZXMsIG5ld1N0YXRlLiR2YXJpYWJsZXMpO1xuICAgIH1cblxuICAgIGlmIChwcmV2U3RhdGUuJHRpbWVSYW5nZSAhPT0gbmV3U3RhdGUuJHRpbWVSYW5nZSkge1xuICAgICAgdGhpcy5faGFuZGxlQ2hhbmdlZFN0YXRlQWN0aXZhdGlvbihwcmV2U3RhdGUuJHRpbWVSYW5nZSwgbmV3U3RhdGUuJHRpbWVSYW5nZSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfaGFuZGxlQ2hhbmdlZFN0YXRlQWN0aXZhdGlvbihvbGRWYWx1ZTogU2NlbmVPYmplY3QgfCB1bmRlZmluZWQsIG5ld1ZhbHVlOiBTY2VuZU9iamVjdCB8IHVuZGVmaW5lZCkge1xuICAgIGlmIChvbGRWYWx1ZSkge1xuICAgICAgY29uc3QgZGVhY3RpdmF0aW9uSGFuZGxlciA9IHRoaXMuX2RlYWN0aXZhdGlvbkhhbmRsZXJzLmdldChvbGRWYWx1ZSk7XG4gICAgICBpZiAoZGVhY3RpdmF0aW9uSGFuZGxlcikge1xuICAgICAgICBkZWFjdGl2YXRpb25IYW5kbGVyKCk7XG4gICAgICAgIHRoaXMuX2RlYWN0aXZhdGlvbkhhbmRsZXJzLmRlbGV0ZShvbGRWYWx1ZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKG5ld1ZhbHVlKSB7XG4gICAgICB0aGlzLl9kZWFjdGl2YXRpb25IYW5kbGVycy5zZXQobmV3VmFsdWUsIG5ld1ZhbHVlLmFjdGl2YXRlKCkpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX2hhbmRsZUNoYW5nZWRCZWhhdmlvcnMoXG4gICAgb2xkVmFsdWU6IEFycmF5PFNjZW5lT2JqZWN0IHwgU2NlbmVTdGF0ZWxlc3NCZWhhdmlvcj4gfCB1bmRlZmluZWQsXG4gICAgbmV3VmFsdWU6IEFycmF5PFNjZW5lT2JqZWN0IHwgU2NlbmVTdGF0ZWxlc3NCZWhhdmlvcj4gfCB1bmRlZmluZWRcbiAgKSB7XG4gICAgLy8gSGFuZGxlIHJlbW92ZWQgYmVoYXZpb3JzXG4gICAgaWYgKG9sZFZhbHVlKSB7XG4gICAgICBmb3IgKGNvbnN0IG9sZEJlaGF2aW9yIG9mIG9sZFZhbHVlKSB7XG4gICAgICAgIGlmICghbmV3VmFsdWUgfHwgIW5ld1ZhbHVlLmluY2x1ZGVzKG9sZEJlaGF2aW9yKSkge1xuICAgICAgICAgIGNvbnN0IGRlYWN0aXZhdGlvbkhhbmRsZXIgPSB0aGlzLl9kZWFjdGl2YXRpb25IYW5kbGVycy5nZXQob2xkQmVoYXZpb3IpO1xuICAgICAgICAgIGlmIChkZWFjdGl2YXRpb25IYW5kbGVyKSB7XG4gICAgICAgICAgICBkZWFjdGl2YXRpb25IYW5kbGVyKCk7XG4gICAgICAgICAgICB0aGlzLl9kZWFjdGl2YXRpb25IYW5kbGVycy5kZWxldGUob2xkQmVoYXZpb3IpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEhhbmRsZSBuZXcgYmVoYXZpb3JzXG4gICAgaWYgKG5ld1ZhbHVlKSB7XG4gICAgICBmb3IgKGNvbnN0IG5ld0JlaGF2aW9yIG9mIG5ld1ZhbHVlKSB7XG4gICAgICAgIGlmICghb2xkVmFsdWUgfHwgIW9sZFZhbHVlLmluY2x1ZGVzKG5ld0JlaGF2aW9yKSkge1xuICAgICAgICAgIHRoaXMuX2FjdGl2YXRlQmVoYXZpb3IobmV3QmVoYXZpb3IpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLypcbiAgICogUHVibGlzaCBhbiBldmVudCBhbmQgb3B0aW9uYWxseSBidWJibGUgaXQgdXAgdGhlIHNjZW5lXG4gICAqKi9cbiAgcHVibGljIHB1Ymxpc2hFdmVudChldmVudDogQnVzRXZlbnQsIGJ1YmJsZT86IGJvb2xlYW4pIHtcbiAgICB0aGlzLl9ldmVudHMhLnB1Ymxpc2goZXZlbnQpO1xuXG4gICAgaWYgKGJ1YmJsZSAmJiB0aGlzLnBhcmVudCkge1xuICAgICAgdGhpcy5wYXJlbnQucHVibGlzaEV2ZW50KGV2ZW50LCBidWJibGUpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBnZXRSb290KCk6IFNjZW5lT2JqZWN0IHtcbiAgICByZXR1cm4gIXRoaXMuX3BhcmVudCA/IHRoaXMgOiB0aGlzLl9wYXJlbnQuZ2V0Um9vdCgpO1xuICB9XG5cbiAgcHJpdmF0ZSBfaW50ZXJuYWxBY3RpdmF0ZSgpIHtcbiAgICB0aGlzLl9pc0FjdGl2ZSA9IHRydWU7XG5cbiAgICBjb25zdCB7ICRkYXRhLCAkdmFyaWFibGVzLCAkdGltZVJhbmdlLCAkYmVoYXZpb3JzIH0gPSB0aGlzLnN0YXRlO1xuXG4gICAgdGhpcy5fYWN0aXZhdGlvbkhhbmRsZXJzLmZvckVhY2goKGhhbmRsZXIpID0+IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGhhbmRsZXIoKTtcbiAgICAgIGlmIChyZXN1bHQpIHtcbiAgICAgICAgdGhpcy5fZGVhY3RpdmF0aW9uSGFuZGxlcnMuc2V0KHJlc3VsdCwgcmVzdWx0KTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGlmICgkdGltZVJhbmdlICYmICEkdGltZVJhbmdlLmlzQWN0aXZlKSB7XG4gICAgICB0aGlzLl9kZWFjdGl2YXRpb25IYW5kbGVycy5zZXQoJHRpbWVSYW5nZSwgJHRpbWVSYW5nZS5hY3RpdmF0ZSgpKTtcbiAgICB9XG5cbiAgICBpZiAoJHZhcmlhYmxlcyAmJiAhJHZhcmlhYmxlcy5pc0FjdGl2ZSkge1xuICAgICAgdGhpcy5fZGVhY3RpdmF0aW9uSGFuZGxlcnMuc2V0KCR2YXJpYWJsZXMsICR2YXJpYWJsZXMuYWN0aXZhdGUoKSk7XG4gICAgfVxuXG4gICAgaWYgKCRkYXRhICYmICEkZGF0YS5pc0FjdGl2ZSkge1xuICAgICAgdGhpcy5fZGVhY3RpdmF0aW9uSGFuZGxlcnMuc2V0KCRkYXRhLCAkZGF0YS5hY3RpdmF0ZSgpKTtcbiAgICB9XG5cbiAgICBpZiAoJGJlaGF2aW9ycykge1xuICAgICAgZm9yIChjb25zdCBiZWhhdmlvciBvZiAkYmVoYXZpb3JzKSB7XG4gICAgICAgIHRoaXMuX2FjdGl2YXRlQmVoYXZpb3IoYmVoYXZpb3IpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX2FjdGl2YXRlQmVoYXZpb3IoYmVoYXZpb3I6IFNjZW5lT2JqZWN0IHwgU2NlbmVTdGF0ZWxlc3NCZWhhdmlvcik6IFNjZW5lRGVhY3RpdmF0aW9uSGFuZGxlciB8IHZvaWQge1xuICAgIGlmIChiZWhhdmlvciBpbnN0YW5jZW9mIFNjZW5lT2JqZWN0QmFzZSkge1xuICAgICAgdGhpcy5fZGVhY3RpdmF0aW9uSGFuZGxlcnMuc2V0KGJlaGF2aW9yLCBiZWhhdmlvci5hY3RpdmF0ZSgpKTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBiZWhhdmlvciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgY29uc3QgZGVhY3RpdmF0ZSA9IGJlaGF2aW9yKHRoaXMpO1xuICAgICAgaWYgKGRlYWN0aXZhdGUpIHtcbiAgICAgICAgdGhpcy5fZGVhY3RpdmF0aW9uSGFuZGxlcnMuc2V0KGJlaGF2aW9yLCBkZWFjdGl2YXRlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVGhpcyBpcyBwcmltYXJpbHkgY2FsbGVkIGZyb20gU2NlbmVDb21wb25lbnRXcmFwcGVyIHdoZW4gdGhlIFNjZW5lT2JqZWN0J3MgQ29tcG9uZW50IGlzIG1vdW50ZWQuXG4gICAqIEJ1dCBpbiBzb21lIHNjZW5hcmlvcyB0aGlzIGNhbiBhbHNvIGJlIGNhbGxlZCBkaXJlY3RseSBmcm9tIGFub3RoZXIgc2NlbmUgb2JqZWN0LiBXaGVuIGNhbGxlZCBtYW51YWxseSBmcm9tIGFub3RoZXIgc2NlbmUgb2JqZWN0XG4gICAqIG1ha2Ugc3VyZSB0byBjYWxsIHRoZSByZXR1cm5lZCBmdW5jdGlvbiB3aGVuIHRoZSBzb3VyY2Ugc2NlbmUgb2JqZWN0IGlzIGRlYWN0aXZhdGVkLlxuICAgKi9cbiAgcHVibGljIGFjdGl2YXRlKCk6IENhbmNlbEFjdGl2YXRpb25IYW5kbGVyIHtcbiAgICBpZiAoIXRoaXMuaXNBY3RpdmUpIHtcbiAgICAgIHRoaXMuX2ludGVybmFsQWN0aXZhdGUoKTtcbiAgICB9XG5cbiAgICB0aGlzLl9yZWZDb3VudCsrO1xuXG4gICAgbGV0IGNhbGxlZCA9IGZhbHNlO1xuXG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIHRoaXMuX3JlZkNvdW50LS07XG5cbiAgICAgIGlmIChjYWxsZWQpIHtcbiAgICAgICAgY29uc3QgbXNnID0gYFNjZW5lT2JqZWN0IGNhbmNlbGF0aW9uIGhhbmRsZXIgcmV0dXJuZWQgYnkgYWN0aXZhdGUoKSBjYWxsZWQgYSBzZWNvbmQgdGltZWA7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihtc2cpO1xuICAgICAgfVxuXG4gICAgICBjYWxsZWQgPSB0cnVlO1xuXG4gICAgICBpZiAodGhpcy5fcmVmQ291bnQgPT09IDApIHtcbiAgICAgICAgdGhpcy5faW50ZXJuYWxEZWFjdGl2YXRlKCk7XG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxsZWQgYnkgdGhlIFNjZW5lQ29tcG9uZW50V3JhcHBlciB3aGVuIHRoZSByZWFjdCBjb21wb25lbnQgaXMgdW5tb3VudGVkLlxuICAgKiBEb24ndCBvdmVycmlkZSB0aGlzLCBpbnN0ZWFkIHVzZSBhZGRBY3RpdmF0aW9uSGFuZGxlci4gVGhlIGFjdGl2YXRpb24gaGFuZGxlciBjYW4gcmV0dXJuIGEgZGVhY3RpdmF0aW9uIGhhbmRsZXIuXG4gICAqL1xuICBwcml2YXRlIF9pbnRlcm5hbERlYWN0aXZhdGUoKTogdm9pZCB7XG4gICAgdGhpcy5faXNBY3RpdmUgPSBmYWxzZTtcblxuICAgIGZvciAobGV0IGhhbmRsZXIgb2YgdGhpcy5fZGVhY3RpdmF0aW9uSGFuZGxlcnMudmFsdWVzKCkpIHtcbiAgICAgIGhhbmRsZXIoKTtcbiAgICB9XG5cbiAgICB0aGlzLl9kZWFjdGl2YXRpb25IYW5kbGVycy5jbGVhcigpO1xuXG4gICAgLy8gQ2xlYXIgc3Vic2NyaXB0aW9ucyBhbmQgbGlzdGVuZXJzXG4gICAgdGhpcy5fZXZlbnRzIS5yZW1vdmVBbGxMaXN0ZW5lcnMoKTtcbiAgICB0aGlzLl9zdWJzLnVuc3Vic2NyaWJlKCk7XG4gICAgdGhpcy5fc3VicyA9IG5ldyBTdWJzY3JpcHRpb24oKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVdGlsaXR5IGhvb2sgdG8gZ2V0IGFuZCBzdWJzY3JpYmUgdG8gc3RhdGVcbiAgICovXG4gIHB1YmxpYyB1c2VTdGF0ZSgpOiBUU3RhdGUge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1ob29rcy9ydWxlcy1vZi1ob29rc1xuICAgIHJldHVybiB1c2VTY2VuZU9iamVjdFN0YXRlKHRoaXMpO1xuICB9XG5cbiAgLyoqIEZvcmNlIGEgcmUtcmVuZGVyLCBzaG91bGQgb25seSBiZSBuZWVkZWQgd2hlbiB2YXJpYWJsZSB2YWx1ZXMgY2hhbmdlICovXG4gIHB1YmxpYyBmb3JjZVJlbmRlcigpOiB2b2lkIHtcbiAgICB0aGlzLnNldFN0YXRlKHt9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBXaWxsIGNyZWF0ZSBuZXcgU2NlbmVPYmplY3Qgd2l0aCBzaGFsbG93LWNsb25lZCBzdGF0ZSwgYnV0IGFsbCBzdGF0ZSBpdGVtcyBvZiB0eXBlIFNjZW5lT2JqZWN0IGFyZSBkZWVwIGNsb25lZFxuICAgKi9cbiAgcHVibGljIGNsb25lKHdpdGhTdGF0ZT86IFBhcnRpYWw8VFN0YXRlPik6IHRoaXMge1xuICAgIHJldHVybiBjbG9uZVNjZW5lT2JqZWN0KHRoaXMsIHdpdGhTdGF0ZSk7XG4gIH1cblxuICAvKipcbiAgICogQWxsb3dzIGV4dGVybmFsIGNvZGUgdG8gcmVnaXN0ZXIgY29kZSB0aGF0IGlzIGV4ZWN1dGVkIG9uIGFjdGl2YXRlIGFuZCBkZWFjdGl2YXRlLiBUaGlzIGFsbG93IHlvdVxuICAgKiB0byB3aXJlIHVwIHNjZW5lIG9iamVjdHMgdGhhdCBuZWVkIHRvIHJlc3BvbmQgdG8gc3RhdGUgY2hhbmdlcyBpbiBvdGhlciBvYmplY3RzIGZyb20gdGhlIG91dHNpZGUuXG4gICAqKi9cbiAgcHVibGljIGFkZEFjdGl2YXRpb25IYW5kbGVyKGhhbmRsZXI6IFNjZW5lQWN0aXZhdGlvbkhhbmRsZXIpIHtcbiAgICB0aGlzLl9hY3RpdmF0aW9uSGFuZGxlcnMucHVzaChoYW5kbGVyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMb29wIHRocm91Z2ggc3RhdGUgYW5kIGNhbGwgY2FsbGJhY2sgZm9yIGVhY2ggZGlyZWN0IGNoaWxkIHNjZW5lIG9iamVjdC5cbiAgICogQ2hlY2tzIDEgbGV2ZWwgZGVlcCBwcm9wZXJ0aWVzIGFuZCBhcnJheXMuIFNvIGEgc2NlbmUgb2JqZWN0IGhpZGRlbiBpbiBhIG5lc3RlZCBwbGFpbiBvYmplY3Qgd2lsbCBub3QgYmUgZGV0ZWN0ZWQuXG4gICAqL1xuICBwdWJsaWMgZm9yRWFjaENoaWxkKGNhbGxiYWNrOiAoY2hpbGQ6IFNjZW5lT2JqZWN0QmFzZSkgPT4gdm9pZCkge1xuICAgIGZvckVhY2hDaGlsZCh0aGlzLnN0YXRlLCBjYWxsYmFjayk7XG4gIH1cblxuICAvKiogUmV0dXJucyBhIFNjZW5lT2JqZWN0UmVmIHRoYXQgd2lsbCByZXNvbHZlIHRvIHRoaXMgb2JqZWN0ICovXG4gIHB1YmxpYyBnZXRSZWYoKTogU2NlbmVPYmplY3RSZWY8dGhpcz4ge1xuICAgIGlmICghdGhpcy5fcmVmKSB7XG4gICAgICB0aGlzLl9yZWYgPSBuZXcgU2NlbmVPYmplY3RSZWYodGhpcyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuX3JlZjtcbiAgfVxufVxuXG4vKipcbiAqIFRoaXMgaG9vayBpcyBhbHdheXMgcmV0dXJuaW5nIG1vZGVsLnN0YXRlIGluc3RlYWQgb2YgYSB1c2VTdGF0ZSB0aGF0IHJlbWVtYmVycyB0aGUgbGFzdCBzdGF0ZSBlbWl0dGVkIG9uIHRoZSBzdWJqZWN0XG4gKiBUaGUgcmVhc29uIGZvciB0aGlzIGlzIHNvIHRoYXQgaWYgdGhlIG1vZGVsIGluc3RhbmNlIGNoYW5nZSB0aGlzIGZ1bmN0aW9uIHdpbGwgYWx3YXlzIHJldHVybiB0aGUgbGF0ZXN0IHN0YXRlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdXNlU2NlbmVPYmplY3RTdGF0ZTxUU3RhdGUgZXh0ZW5kcyBTY2VuZU9iamVjdFN0YXRlPihcbiAgbW9kZWw6IFNjZW5lT2JqZWN0PFRTdGF0ZT4sXG4gIG9wdGlvbnM/OiBVc2VTdGF0ZUhvb2tPcHRpb25zXG4pOiBUU3RhdGUge1xuICBjb25zdCBbXywgc2V0U3RhdGVdID0gdXNlU3RhdGU8VFN0YXRlPihtb2RlbC5zdGF0ZSk7XG4gIGNvbnN0IHN0YXRlQXRGaXJzdFJlbmRlciA9IG1vZGVsLnN0YXRlO1xuICBjb25zdCBzaG91bGRBY3RpdmF0ZU9yS2VlcEFsaXZlID0gb3B0aW9ucz8uc2hvdWxkQWN0aXZhdGVPcktlZXBBbGl2ZSA/PyBmYWxzZTtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGxldCB1bmFjdGl2YXRlOiBDYW5jZWxBY3RpdmF0aW9uSGFuZGxlciB8IHVuZGVmaW5lZDtcblxuICAgIGlmIChzaG91bGRBY3RpdmF0ZU9yS2VlcEFsaXZlKSB7XG4gICAgICB1bmFjdGl2YXRlID0gbW9kZWwuYWN0aXZhdGUoKTtcbiAgICB9XG5cbiAgICBjb25zdCBzID0gbW9kZWwuc3Vic2NyaWJlVG9TdGF0ZSgoc3RhdGUpID0+IHtcbiAgICAgIHNldFN0YXRlKHN0YXRlKTtcbiAgICB9KTtcblxuICAgIC8vIFJlLXJlbmRlciBjb21wb25lbnQgaWYgdGhlIHN0YXRlIGNoYW5nZWQgYmV0d2VlbiBmaXJzdCByZW5kZXIgYW5kIHVzZUVmZmVjdCAobW91bnQpXG4gICAgaWYgKG1vZGVsLnN0YXRlICE9PSBzdGF0ZUF0Rmlyc3RSZW5kZXIpIHtcbiAgICAgIHNldFN0YXRlKG1vZGVsLnN0YXRlKTtcbiAgICB9XG5cbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgcy51bnN1YnNjcmliZSgpO1xuXG4gICAgICBpZiAodW5hY3RpdmF0ZSkge1xuICAgICAgICB1bmFjdGl2YXRlKCk7XG4gICAgICB9XG4gICAgfTtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QtaG9va3MvZXhoYXVzdGl2ZS1kZXBzXG4gIH0sIFttb2RlbCwgc2hvdWxkQWN0aXZhdGVPcktlZXBBbGl2ZV0pO1xuXG4gIHJldHVybiBtb2RlbC5zdGF0ZTtcbn1cblxuZnVuY3Rpb24gZm9yRWFjaENoaWxkPFQgZXh0ZW5kcyBvYmplY3Q+KHN0YXRlOiBULCBjYWxsYmFjazogKGNoaWxkOiBTY2VuZU9iamVjdEJhc2UpID0+IHZvaWQpIHtcbiAgZm9yIChjb25zdCBwcm9wVmFsdWUgb2YgT2JqZWN0LnZhbHVlcyhzdGF0ZSkpIHtcbiAgICBpZiAocHJvcFZhbHVlIGluc3RhbmNlb2YgU2NlbmVPYmplY3RCYXNlKSB7XG4gICAgICBjYWxsYmFjayhwcm9wVmFsdWUpO1xuICAgIH1cblxuICAgIGlmIChBcnJheS5pc0FycmF5KHByb3BWYWx1ZSkpIHtcbiAgICAgIGZvciAoY29uc3QgY2hpbGQgb2YgcHJvcFZhbHVlKSB7XG4gICAgICAgIGlmIChjaGlsZCBpbnN0YW5jZW9mIFNjZW5lT2JqZWN0QmFzZSkge1xuICAgICAgICAgIGNhbGxiYWNrKGNoaWxkKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuIl0sIm5h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
@@ -0,0 +1,32 @@
1
+ var __accessCheck = (obj, member, msg) => {
2
+ if (!member.has(obj))
3
+ throw TypeError("Cannot " + msg);
4
+ };
5
+ var __privateGet = (obj, member, getter) => {
6
+ __accessCheck(obj, member, "read from private field");
7
+ return getter ? getter.call(obj) : member.get(obj);
8
+ };
9
+ var __privateAdd = (obj, member, value) => {
10
+ if (member.has(obj))
11
+ throw TypeError("Cannot add the same private member more than once");
12
+ member instanceof WeakSet ? member.add(obj) : member.set(obj, value);
13
+ };
14
+ var __privateSet = (obj, member, value, setter) => {
15
+ __accessCheck(obj, member, "write to private field");
16
+ setter ? setter.call(obj, value) : member.set(obj, value);
17
+ return value;
18
+ };
19
+ var _ref;
20
+ class SceneObjectRef {
21
+ constructor(ref) {
22
+ __privateAdd(this, _ref, void 0);
23
+ __privateSet(this, _ref, ref);
24
+ }
25
+ resolve() {
26
+ return __privateGet(this, _ref);
27
+ }
28
+ }
29
+ _ref = new WeakMap();
30
+
31
+ export { SceneObjectRef };
32
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2NlbmVPYmplY3RSZWYuanMiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb3JlL1NjZW5lT2JqZWN0UmVmLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBjbGFzcyBTY2VuZU9iamVjdFJlZjxUPiB7XG4gICNyZWY6IFQ7XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKHJlZjogVCkge1xuICAgIHRoaXMuI3JlZiA9IHJlZjtcbiAgfVxuXG4gIHB1YmxpYyByZXNvbHZlKCk6IFQge1xuICAgIHJldHVybiB0aGlzLiNyZWY7XG4gIH1cbn1cbiJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxJQUFBLElBQUEsQ0FBQTtBQUFPLE1BQU0sY0FBa0IsQ0FBQTtBQUFBLEVBR3RCLFlBQVksR0FBUSxFQUFBO0FBRjNCLElBQUEsWUFBQSxDQUFBLElBQUEsRUFBQSxJQUFBLEVBQUEsS0FBQSxDQUFBLENBQUEsQ0FBQTtBQUdFLElBQUEsWUFBQSxDQUFBLElBQUEsRUFBSyxJQUFPLEVBQUEsR0FBQSxDQUFBLENBQUE7QUFBQSxHQUNkO0FBQUEsRUFFTyxPQUFhLEdBQUE7QUFDbEIsSUFBQSxPQUFPLFlBQUssQ0FBQSxJQUFBLEVBQUEsSUFBQSxDQUFBLENBQUE7QUFBQSxHQUNkO0FBQ0YsQ0FBQTtBQVRFLElBQUEsR0FBQSxJQUFBLE9BQUEsRUFBQTs7OzsifQ==
@@ -0,0 +1,231 @@
1
+ import { getTimeZone, rangeUtil, toUtc } from '@grafana/data';
2
+ import { SceneObjectUrlSyncConfig } from '../services/SceneObjectUrlSyncConfig.js';
3
+ import { SceneObjectBase } from './SceneObjectBase.js';
4
+ import { getClosest } from './sceneGraph/utils.js';
5
+ import { parseUrlParam } from '../utils/parseUrlParam.js';
6
+ import { evaluateTimeRange } from '../utils/evaluateTimeRange.js';
7
+ import { RefreshEvent, locationService } from '@grafana/runtime';
8
+ import { isValid } from '../utils/date.js';
9
+
10
+ var __defProp = Object.defineProperty;
11
+ var __getOwnPropSymbols = Object.getOwnPropertySymbols;
12
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
13
+ var __propIsEnum = Object.prototype.propertyIsEnumerable;
14
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
15
+ var __spreadValues = (a, b) => {
16
+ for (var prop in b || (b = {}))
17
+ if (__hasOwnProp.call(b, prop))
18
+ __defNormalProp(a, prop, b[prop]);
19
+ if (__getOwnPropSymbols)
20
+ for (var prop of __getOwnPropSymbols(b)) {
21
+ if (__propIsEnum.call(b, prop))
22
+ __defNormalProp(a, prop, b[prop]);
23
+ }
24
+ return a;
25
+ };
26
+ class SceneTimeRange extends SceneObjectBase {
27
+ constructor(state = {}) {
28
+ var _a;
29
+ const from = state.from && isValid(state.from) ? state.from : "now-6h";
30
+ const to = state.to && isValid(state.to) ? state.to : "now";
31
+ const timeZone = state.timeZone;
32
+ const value = evaluateTimeRange(
33
+ from,
34
+ to,
35
+ timeZone || getTimeZone(),
36
+ state.fiscalYearStartMonth,
37
+ state.UNSAFE_nowDelay
38
+ );
39
+ const refreshOnActivate = (_a = state.refreshOnActivate) != null ? _a : { percent: 10 };
40
+ super(__spreadValues({ from, to, timeZone, value, refreshOnActivate }, state));
41
+ this._urlSync = new SceneObjectUrlSyncConfig(this, { keys: ["from", "to", "timezone", "time", "time.window"] });
42
+ this.onTimeRangeChange = (timeRange) => {
43
+ const update = {};
44
+ if (typeof timeRange.raw.from === "string") {
45
+ update.from = timeRange.raw.from;
46
+ } else {
47
+ update.from = timeRange.raw.from.toISOString();
48
+ }
49
+ if (typeof timeRange.raw.to === "string") {
50
+ update.to = timeRange.raw.to;
51
+ } else {
52
+ update.to = timeRange.raw.to.toISOString();
53
+ }
54
+ update.value = evaluateTimeRange(
55
+ update.from,
56
+ update.to,
57
+ this.getTimeZone(),
58
+ this.state.fiscalYearStartMonth,
59
+ this.state.UNSAFE_nowDelay
60
+ );
61
+ if (update.from !== this.state.from || update.to !== this.state.to) {
62
+ this._urlSync.performBrowserHistoryAction(() => {
63
+ this.setState(update);
64
+ });
65
+ }
66
+ };
67
+ this.onTimeZoneChange = (timeZone) => {
68
+ this._urlSync.performBrowserHistoryAction(() => {
69
+ this.setState({ timeZone });
70
+ });
71
+ };
72
+ this.onRefresh = () => {
73
+ this.setState({
74
+ value: evaluateTimeRange(
75
+ this.state.from,
76
+ this.state.to,
77
+ this.getTimeZone(),
78
+ this.state.fiscalYearStartMonth,
79
+ this.state.UNSAFE_nowDelay
80
+ )
81
+ });
82
+ this.publishEvent(new RefreshEvent(), true);
83
+ };
84
+ this.addActivationHandler(this._onActivate.bind(this));
85
+ }
86
+ _onActivate() {
87
+ if (!this.state.timeZone) {
88
+ const timeZoneSource = this.getTimeZoneSource();
89
+ if (timeZoneSource !== this) {
90
+ this._subs.add(
91
+ timeZoneSource.subscribeToState((n, p) => {
92
+ if (n.timeZone !== void 0 && n.timeZone !== p.timeZone) {
93
+ this.setState({
94
+ value: evaluateTimeRange(
95
+ this.state.from,
96
+ this.state.to,
97
+ timeZoneSource.getTimeZone(),
98
+ this.state.fiscalYearStartMonth,
99
+ this.state.UNSAFE_nowDelay
100
+ )
101
+ });
102
+ }
103
+ })
104
+ );
105
+ }
106
+ }
107
+ if (rangeUtil.isRelativeTimeRange(this.state.value.raw)) {
108
+ this.refreshIfStale();
109
+ }
110
+ }
111
+ refreshIfStale() {
112
+ var _a, _b, _c, _d;
113
+ let ms;
114
+ if (((_b = (_a = this.state) == null ? void 0 : _a.refreshOnActivate) == null ? void 0 : _b.percent) !== void 0) {
115
+ ms = this.calculatePercentOfInterval(this.state.refreshOnActivate.percent);
116
+ }
117
+ if (((_d = (_c = this.state) == null ? void 0 : _c.refreshOnActivate) == null ? void 0 : _d.afterMs) !== void 0) {
118
+ ms = Math.min(this.state.refreshOnActivate.afterMs, ms != null ? ms : Infinity);
119
+ }
120
+ if (ms !== void 0) {
121
+ this.refreshRange(ms);
122
+ }
123
+ }
124
+ getTimeZoneSource() {
125
+ if (!this.parent || !this.parent.parent) {
126
+ return this;
127
+ }
128
+ const source = getClosest(this.parent.parent, (o) => {
129
+ if (o.state.$timeRange && o.state.$timeRange.state.timeZone) {
130
+ return o.state.$timeRange;
131
+ }
132
+ return void 0;
133
+ });
134
+ if (!source) {
135
+ return this;
136
+ }
137
+ return source;
138
+ }
139
+ refreshRange(refreshAfterMs) {
140
+ var _a;
141
+ const value = evaluateTimeRange(
142
+ this.state.from,
143
+ this.state.to,
144
+ (_a = this.state.timeZone) != null ? _a : getTimeZone(),
145
+ this.state.fiscalYearStartMonth,
146
+ this.state.UNSAFE_nowDelay
147
+ );
148
+ const diff = value.to.diff(this.state.value.to, "milliseconds");
149
+ if (diff >= refreshAfterMs) {
150
+ this.setState({
151
+ value
152
+ });
153
+ }
154
+ }
155
+ calculatePercentOfInterval(percent) {
156
+ const intervalMs = this.state.value.to.diff(this.state.value.from, "milliseconds");
157
+ return Math.ceil(intervalMs / percent);
158
+ }
159
+ getTimeZone() {
160
+ if (this.state.timeZone) {
161
+ return this.state.timeZone;
162
+ }
163
+ const timeZoneSource = this.getTimeZoneSource();
164
+ if (timeZoneSource !== this) {
165
+ return timeZoneSource.state.timeZone;
166
+ }
167
+ return getTimeZone();
168
+ }
169
+ getUrlState() {
170
+ const params = locationService.getSearchObject();
171
+ const urlValues = { from: this.state.from, to: this.state.to, timezone: this.getTimeZone() };
172
+ if (params.time && params["time.window"]) {
173
+ urlValues.time = null;
174
+ urlValues["time.window"] = null;
175
+ }
176
+ return urlValues;
177
+ }
178
+ updateFromUrl(values) {
179
+ var _a, _b, _c;
180
+ const update = {};
181
+ let from = parseUrlParam(values.from);
182
+ let to = parseUrlParam(values.to);
183
+ if (values.time && values["time.window"]) {
184
+ const time = Array.isArray(values.time) ? values.time[0] : values.time;
185
+ const timeWindow = Array.isArray(values["time.window"]) ? values["time.window"][0] : values["time.window"];
186
+ const timeRange = getTimeWindow(time, timeWindow);
187
+ if (timeRange.from && isValid(timeRange.from)) {
188
+ from = timeRange.from;
189
+ }
190
+ if (timeRange.to && isValid(timeRange.to)) {
191
+ to = timeRange.to;
192
+ }
193
+ }
194
+ if (from && isValid(from)) {
195
+ update.from = from;
196
+ }
197
+ if (to && isValid(to)) {
198
+ update.to = to;
199
+ }
200
+ if (typeof values.timezone === "string") {
201
+ update.timeZone = values.timezone !== "" ? values.timezone : void 0;
202
+ }
203
+ if (Object.keys(update).length === 0) {
204
+ return;
205
+ }
206
+ update.value = evaluateTimeRange(
207
+ (_a = update.from) != null ? _a : this.state.from,
208
+ (_b = update.to) != null ? _b : this.state.to,
209
+ (_c = update.timeZone) != null ? _c : this.getTimeZone(),
210
+ this.state.fiscalYearStartMonth,
211
+ this.state.UNSAFE_nowDelay
212
+ );
213
+ return this.setState(update);
214
+ }
215
+ }
216
+ function getTimeWindow(time, timeWindow) {
217
+ const valueTime = isNaN(Date.parse(time)) ? parseInt(time, 10) : Date.parse(time);
218
+ let timeWindowMs;
219
+ if (timeWindow.match(/^\d+$/) && parseInt(timeWindow, 10)) {
220
+ timeWindowMs = parseInt(timeWindow, 10);
221
+ } else {
222
+ timeWindowMs = rangeUtil.intervalToMs(timeWindow);
223
+ }
224
+ return {
225
+ from: toUtc(valueTime - timeWindowMs / 2).toISOString(),
226
+ to: toUtc(valueTime + timeWindowMs / 2).toISOString()
227
+ };
228
+ }
229
+
230
+ export { SceneTimeRange };
231
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2NlbmVUaW1lUmFuZ2UuanMiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb3JlL1NjZW5lVGltZVJhbmdlLnRzeCJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBnZXRUaW1lWm9uZSwgcmFuZ2VVdGlsLCBUaW1lUmFuZ2UsIHRvVXRjIH0gZnJvbSAnQGdyYWZhbmEvZGF0YSc7XG5pbXBvcnQgeyBUaW1lWm9uZSB9IGZyb20gJ0BncmFmYW5hL3NjaGVtYSc7XG5cbmltcG9ydCB7IFNjZW5lT2JqZWN0VXJsU3luY0NvbmZpZyB9IGZyb20gJy4uL3NlcnZpY2VzL1NjZW5lT2JqZWN0VXJsU3luY0NvbmZpZyc7XG5cbmltcG9ydCB7IFNjZW5lT2JqZWN0QmFzZSB9IGZyb20gJy4vU2NlbmVPYmplY3RCYXNlJztcbmltcG9ydCB7IFNjZW5lVGltZVJhbmdlTGlrZSwgU2NlbmVUaW1lUmFuZ2VTdGF0ZSwgU2NlbmVPYmplY3RVcmxWYWx1ZXMgfSBmcm9tICcuL3R5cGVzJztcbmltcG9ydCB7IGdldENsb3Nlc3QgfSBmcm9tICcuL3NjZW5lR3JhcGgvdXRpbHMnO1xuaW1wb3J0IHsgcGFyc2VVcmxQYXJhbSB9IGZyb20gJy4uL3V0aWxzL3BhcnNlVXJsUGFyYW0nO1xuaW1wb3J0IHsgZXZhbHVhdGVUaW1lUmFuZ2UgfSBmcm9tICcuLi91dGlscy9ldmFsdWF0ZVRpbWVSYW5nZSc7XG5pbXBvcnQgeyBsb2NhdGlvblNlcnZpY2UsIFJlZnJlc2hFdmVudCB9IGZyb20gJ0BncmFmYW5hL3J1bnRpbWUnO1xuaW1wb3J0IHsgaXNWYWxpZCB9IGZyb20gJy4uL3V0aWxzL2RhdGUnO1xuXG5leHBvcnQgY2xhc3MgU2NlbmVUaW1lUmFuZ2UgZXh0ZW5kcyBTY2VuZU9iamVjdEJhc2U8U2NlbmVUaW1lUmFuZ2VTdGF0ZT4gaW1wbGVtZW50cyBTY2VuZVRpbWVSYW5nZUxpa2Uge1xuICBwcm90ZWN0ZWQgX3VybFN5bmMgPSBuZXcgU2NlbmVPYmplY3RVcmxTeW5jQ29uZmlnKHRoaXMsIHsga2V5czogWydmcm9tJywgJ3RvJywgJ3RpbWV6b25lJywgJ3RpbWUnLCAndGltZS53aW5kb3cnXSB9KTtcblxuICBwdWJsaWMgY29uc3RydWN0b3Ioc3RhdGU6IFBhcnRpYWw8U2NlbmVUaW1lUmFuZ2VTdGF0ZT4gPSB7fSkge1xuICAgIGNvbnN0IGZyb20gPSBzdGF0ZS5mcm9tICYmIGlzVmFsaWQoc3RhdGUuZnJvbSkgPyBzdGF0ZS5mcm9tIDogJ25vdy02aCc7XG4gICAgY29uc3QgdG8gPSBzdGF0ZS50byAmJiBpc1ZhbGlkKHN0YXRlLnRvKSA/IHN0YXRlLnRvIDogJ25vdyc7XG5cbiAgICBjb25zdCB0aW1lWm9uZSA9IHN0YXRlLnRpbWVab25lO1xuICAgIGNvbnN0IHZhbHVlID0gZXZhbHVhdGVUaW1lUmFuZ2UoXG4gICAgICBmcm9tLFxuICAgICAgdG8sXG4gICAgICB0aW1lWm9uZSB8fCBnZXRUaW1lWm9uZSgpLFxuICAgICAgc3RhdGUuZmlzY2FsWWVhclN0YXJ0TW9udGgsXG4gICAgICBzdGF0ZS5VTlNBRkVfbm93RGVsYXlcbiAgICApO1xuICAgIGNvbnN0IHJlZnJlc2hPbkFjdGl2YXRlID0gc3RhdGUucmVmcmVzaE9uQWN0aXZhdGUgPz8geyBwZXJjZW50OiAxMCB9O1xuICAgIHN1cGVyKHsgZnJvbSwgdG8sIHRpbWVab25lLCB2YWx1ZSwgcmVmcmVzaE9uQWN0aXZhdGUsIC4uLnN0YXRlIH0pO1xuXG4gICAgdGhpcy5hZGRBY3RpdmF0aW9uSGFuZGxlcih0aGlzLl9vbkFjdGl2YXRlLmJpbmQodGhpcykpO1xuICB9XG5cbiAgcHJpdmF0ZSBfb25BY3RpdmF0ZSgpIHtcbiAgICAvLyBXaGVuIFNjZW5lVGltZVJhbmdlIGhhcyBubyB0aW1lIHpvbmUgcHJvdmlkZWQsIGZpbmQgY2xvc2VzdCBzb3VyY2Ugb2YgdGltZSB6b25lIGFuZCBzdWJzY3JpYmUgdG8gaXRcbiAgICBpZiAoIXRoaXMuc3RhdGUudGltZVpvbmUpIHtcbiAgICAgIGNvbnN0IHRpbWVab25lU291cmNlID0gdGhpcy5nZXRUaW1lWm9uZVNvdXJjZSgpO1xuICAgICAgaWYgKHRpbWVab25lU291cmNlICE9PSB0aGlzKSB7XG4gICAgICAgIHRoaXMuX3N1YnMuYWRkKFxuICAgICAgICAgIHRpbWVab25lU291cmNlLnN1YnNjcmliZVRvU3RhdGUoKG4sIHApID0+IHtcbiAgICAgICAgICAgIGlmIChuLnRpbWVab25lICE9PSB1bmRlZmluZWQgJiYgbi50aW1lWm9uZSAhPT0gcC50aW1lWm9uZSkge1xuICAgICAgICAgICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgICAgICAgICB2YWx1ZTogZXZhbHVhdGVUaW1lUmFuZ2UoXG4gICAgICAgICAgICAgICAgICB0aGlzLnN0YXRlLmZyb20sXG4gICAgICAgICAgICAgICAgICB0aGlzLnN0YXRlLnRvLFxuICAgICAgICAgICAgICAgICAgdGltZVpvbmVTb3VyY2UuZ2V0VGltZVpvbmUoKSxcbiAgICAgICAgICAgICAgICAgIHRoaXMuc3RhdGUuZmlzY2FsWWVhclN0YXJ0TW9udGgsXG4gICAgICAgICAgICAgICAgICB0aGlzLnN0YXRlLlVOU0FGRV9ub3dEZWxheVxuICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHJhbmdlVXRpbC5pc1JlbGF0aXZlVGltZVJhbmdlKHRoaXMuc3RhdGUudmFsdWUucmF3KSkge1xuICAgICAgdGhpcy5yZWZyZXNoSWZTdGFsZSgpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgcmVmcmVzaElmU3RhbGUoKSB7XG4gICAgbGV0IG1zO1xuICAgIGlmICh0aGlzLnN0YXRlPy5yZWZyZXNoT25BY3RpdmF0ZT8ucGVyY2VudCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBtcyA9IHRoaXMuY2FsY3VsYXRlUGVyY2VudE9mSW50ZXJ2YWwodGhpcy5zdGF0ZS5yZWZyZXNoT25BY3RpdmF0ZS5wZXJjZW50KTtcbiAgICB9XG4gICAgaWYgKHRoaXMuc3RhdGU/LnJlZnJlc2hPbkFjdGl2YXRlPy5hZnRlck1zICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIG1zID0gTWF0aC5taW4odGhpcy5zdGF0ZS5yZWZyZXNoT25BY3RpdmF0ZS5hZnRlck1zLCBtcyA/PyBJbmZpbml0eSk7XG4gICAgfVxuICAgIGlmIChtcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLnJlZnJlc2hSYW5nZShtcyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFdpbGwgdHJhdmVyc2UgdXAgdGhlIHNjZW5lIGdyYXBoIHRvIGZpbmQgdGhlIGNsb3Nlc3QgU2NlbmVUaW1lUmFuZ2VMaWtlIHdpdGggdGltZSB6b25lIHNldFxuICAgKi9cbiAgcHJpdmF0ZSBnZXRUaW1lWm9uZVNvdXJjZSgpIHtcbiAgICBpZiAoIXRoaXMucGFyZW50IHx8ICF0aGlzLnBhcmVudC5wYXJlbnQpIHtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvLyBGaW5kIHRoZSBjbG9zZXN0IHNvdXJjZSBvZiB0aW1lIHpvbmVcbiAgICBjb25zdCBzb3VyY2UgPSBnZXRDbG9zZXN0PFNjZW5lVGltZVJhbmdlTGlrZT4odGhpcy5wYXJlbnQucGFyZW50LCAobykgPT4ge1xuICAgICAgaWYgKG8uc3RhdGUuJHRpbWVSYW5nZSAmJiBvLnN0YXRlLiR0aW1lUmFuZ2Uuc3RhdGUudGltZVpvbmUpIHtcbiAgICAgICAgcmV0dXJuIG8uc3RhdGUuJHRpbWVSYW5nZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfSk7XG5cbiAgICBpZiAoIXNvdXJjZSkge1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcmV0dXJuIHNvdXJjZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWZyZXNoZXMgdGltZSByYW5nZSBpZiBpdCBpcyBvbGRlciB0aGFuIHRoZSBpbnZhbGlkYXRpb24gaW50ZXJ2YWxcbiAgICogQHBhcmFtIHJlZnJlc2hBZnRlck1zIGludmFsaWRhdGlvbiBpbnRlcnZhbCAobWlsbGlzZWNvbmRzKVxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcHJpdmF0ZSByZWZyZXNoUmFuZ2UocmVmcmVzaEFmdGVyTXM6IG51bWJlcikge1xuICAgIGNvbnN0IHZhbHVlID0gZXZhbHVhdGVUaW1lUmFuZ2UoXG4gICAgICB0aGlzLnN0YXRlLmZyb20sXG4gICAgICB0aGlzLnN0YXRlLnRvLFxuICAgICAgdGhpcy5zdGF0ZS50aW1lWm9uZSA/PyBnZXRUaW1lWm9uZSgpLFxuICAgICAgdGhpcy5zdGF0ZS5maXNjYWxZZWFyU3RhcnRNb250aCxcbiAgICAgIHRoaXMuc3RhdGUuVU5TQUZFX25vd0RlbGF5XG4gICAgKTtcblxuICAgIGNvbnN0IGRpZmYgPSB2YWx1ZS50by5kaWZmKHRoaXMuc3RhdGUudmFsdWUudG8sICdtaWxsaXNlY29uZHMnKTtcbiAgICBpZiAoZGlmZiA+PSByZWZyZXNoQWZ0ZXJNcykge1xuICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgIHZhbHVlLFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBjYWxjdWxhdGVQZXJjZW50T2ZJbnRlcnZhbChwZXJjZW50OiBudW1iZXIpOiBudW1iZXIge1xuICAgIGNvbnN0IGludGVydmFsTXMgPSB0aGlzLnN0YXRlLnZhbHVlLnRvLmRpZmYodGhpcy5zdGF0ZS52YWx1ZS5mcm9tLCAnbWlsbGlzZWNvbmRzJyk7XG4gICAgcmV0dXJuIE1hdGguY2VpbChpbnRlcnZhbE1zIC8gcGVyY2VudCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0VGltZVpvbmUoKTogVGltZVpvbmUge1xuICAgIC8vIFJldHVybiBsb2NhbCB0aW1lIHpvbmUgaWYgcHJvdmlkZWRcbiAgICBpZiAodGhpcy5zdGF0ZS50aW1lWm9uZSkge1xuICAgICAgcmV0dXJuIHRoaXMuc3RhdGUudGltZVpvbmU7XG4gICAgfVxuXG4gICAgLy8gUmVzb2x2ZSBoaWdoZXIgbGV2ZWwgdGltZSB6b25lIHNvdXJjZVxuICAgIGNvbnN0IHRpbWVab25lU291cmNlID0gdGhpcy5nZXRUaW1lWm9uZVNvdXJjZSgpO1xuICAgIGlmICh0aW1lWm9uZVNvdXJjZSAhPT0gdGhpcykge1xuICAgICAgcmV0dXJuIHRpbWVab25lU291cmNlLnN0YXRlLnRpbWVab25lITtcbiAgICB9XG5cbiAgICAvLyBSZXR1cm4gZGVmYXVsdCB0aW1lIHpvbmVcbiAgICByZXR1cm4gZ2V0VGltZVpvbmUoKTtcbiAgfVxuXG4gIHB1YmxpYyBvblRpbWVSYW5nZUNoYW5nZSA9ICh0aW1lUmFuZ2U6IFRpbWVSYW5nZSkgPT4ge1xuICAgIGNvbnN0IHVwZGF0ZTogUGFydGlhbDxTY2VuZVRpbWVSYW5nZVN0YXRlPiA9IHt9O1xuXG4gICAgaWYgKHR5cGVvZiB0aW1lUmFuZ2UucmF3LmZyb20gPT09ICdzdHJpbmcnKSB7XG4gICAgICB1cGRhdGUuZnJvbSA9IHRpbWVSYW5nZS5yYXcuZnJvbTtcbiAgICB9IGVsc2Uge1xuICAgICAgdXBkYXRlLmZyb20gPSB0aW1lUmFuZ2UucmF3LmZyb20udG9JU09TdHJpbmcoKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHRpbWVSYW5nZS5yYXcudG8gPT09ICdzdHJpbmcnKSB7XG4gICAgICB1cGRhdGUudG8gPSB0aW1lUmFuZ2UucmF3LnRvO1xuICAgIH0gZWxzZSB7XG4gICAgICB1cGRhdGUudG8gPSB0aW1lUmFuZ2UucmF3LnRvLnRvSVNPU3RyaW5nKCk7XG4gICAgfVxuXG4gICAgdXBkYXRlLnZhbHVlID0gZXZhbHVhdGVUaW1lUmFuZ2UoXG4gICAgICB1cGRhdGUuZnJvbSxcbiAgICAgIHVwZGF0ZS50byxcbiAgICAgIHRoaXMuZ2V0VGltZVpvbmUoKSxcbiAgICAgIHRoaXMuc3RhdGUuZmlzY2FsWWVhclN0YXJ0TW9udGgsXG4gICAgICB0aGlzLnN0YXRlLlVOU0FGRV9ub3dEZWxheVxuICAgICk7XG5cbiAgICAvLyBPbmx5IHVwZGF0ZSBpZiB0aW1lIHJhbmdlIGFjdHVhbGx5IGNoYW5nZWRcbiAgICBpZiAodXBkYXRlLmZyb20gIT09IHRoaXMuc3RhdGUuZnJvbSB8fCB1cGRhdGUudG8gIT09IHRoaXMuc3RhdGUudG8pIHtcbiAgICAgIHRoaXMuX3VybFN5bmMucGVyZm9ybUJyb3dzZXJIaXN0b3J5QWN0aW9uKCgpID0+IHtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh1cGRhdGUpO1xuICAgICAgfSk7XG4gICAgfVxuICB9O1xuXG4gIHB1YmxpYyBvblRpbWVab25lQ2hhbmdlID0gKHRpbWVab25lOiBUaW1lWm9uZSkgPT4ge1xuICAgIHRoaXMuX3VybFN5bmMucGVyZm9ybUJyb3dzZXJIaXN0b3J5QWN0aW9uKCgpID0+IHtcbiAgICAgIHRoaXMuc2V0U3RhdGUoeyB0aW1lWm9uZSB9KTtcbiAgICB9KTtcbiAgfTtcblxuICBwdWJsaWMgb25SZWZyZXNoID0gKCkgPT4ge1xuICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgdmFsdWU6IGV2YWx1YXRlVGltZVJhbmdlKFxuICAgICAgICB0aGlzLnN0YXRlLmZyb20sXG4gICAgICAgIHRoaXMuc3RhdGUudG8sXG4gICAgICAgIHRoaXMuZ2V0VGltZVpvbmUoKSxcbiAgICAgICAgdGhpcy5zdGF0ZS5maXNjYWxZZWFyU3RhcnRNb250aCxcbiAgICAgICAgdGhpcy5zdGF0ZS5VTlNBRkVfbm93RGVsYXlcbiAgICAgICksXG4gICAgfSk7XG5cbiAgICB0aGlzLnB1Ymxpc2hFdmVudChuZXcgUmVmcmVzaEV2ZW50KCksIHRydWUpO1xuICB9O1xuXG4gIHB1YmxpYyBnZXRVcmxTdGF0ZSgpIHtcbiAgICBjb25zdCBwYXJhbXMgPSBsb2NhdGlvblNlcnZpY2UuZ2V0U2VhcmNoT2JqZWN0KCk7XG4gICAgY29uc3QgdXJsVmFsdWVzOiBTY2VuZU9iamVjdFVybFZhbHVlcyA9IHsgZnJvbTogdGhpcy5zdGF0ZS5mcm9tLCB0bzogdGhpcy5zdGF0ZS50bywgdGltZXpvbmU6IHRoaXMuZ2V0VGltZVpvbmUoKSB9O1xuXG4gICAgLy8gQ2xlYXIgdGltZSBhbmQgdGltZS53aW5kb3cgb25jZSB0aGV5IGFyZSBjb252ZXJ0ZWQgdG8gZnJvbSBhbmQgdG9cbiAgICBpZiAocGFyYW1zLnRpbWUgJiYgcGFyYW1zWyd0aW1lLndpbmRvdyddKSB7XG4gICAgICB1cmxWYWx1ZXMudGltZSA9IG51bGw7XG4gICAgICB1cmxWYWx1ZXNbJ3RpbWUud2luZG93J10gPSBudWxsO1xuICAgIH1cblxuICAgIHJldHVybiB1cmxWYWx1ZXM7XG4gIH1cblxuICBwdWJsaWMgdXBkYXRlRnJvbVVybCh2YWx1ZXM6IFNjZW5lT2JqZWN0VXJsVmFsdWVzKSB7XG4gICAgY29uc3QgdXBkYXRlOiBQYXJ0aWFsPFNjZW5lVGltZVJhbmdlU3RhdGU+ID0ge307XG5cbiAgICBsZXQgZnJvbSA9IHBhcnNlVXJsUGFyYW0odmFsdWVzLmZyb20pO1xuICAgIGxldCB0byA9IHBhcnNlVXJsUGFyYW0odmFsdWVzLnRvKTtcblxuICAgIGlmICh2YWx1ZXMudGltZSAmJiB2YWx1ZXNbJ3RpbWUud2luZG93J10pIHtcbiAgICAgIGNvbnN0IHRpbWUgPSBBcnJheS5pc0FycmF5KHZhbHVlcy50aW1lKSA/IHZhbHVlcy50aW1lWzBdIDogdmFsdWVzLnRpbWU7XG4gICAgICBjb25zdCB0aW1lV2luZG93ID0gQXJyYXkuaXNBcnJheSh2YWx1ZXNbJ3RpbWUud2luZG93J10pID8gdmFsdWVzWyd0aW1lLndpbmRvdyddWzBdIDogdmFsdWVzWyd0aW1lLndpbmRvdyddO1xuICAgICAgY29uc3QgdGltZVJhbmdlID0gZ2V0VGltZVdpbmRvdyh0aW1lLCB0aW1lV2luZG93KTtcbiAgICAgIGlmICh0aW1lUmFuZ2UuZnJvbSAmJiBpc1ZhbGlkKHRpbWVSYW5nZS5mcm9tKSkge1xuICAgICAgICBmcm9tID0gdGltZVJhbmdlLmZyb207XG4gICAgICB9XG5cbiAgICAgIGlmICh0aW1lUmFuZ2UudG8gJiYgaXNWYWxpZCh0aW1lUmFuZ2UudG8pKSB7XG4gICAgICAgIHRvID0gdGltZVJhbmdlLnRvO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChmcm9tICYmIGlzVmFsaWQoZnJvbSkpIHtcbiAgICAgIHVwZGF0ZS5mcm9tID0gZnJvbTtcbiAgICB9XG5cbiAgICBpZiAodG8gJiYgaXNWYWxpZCh0bykpIHtcbiAgICAgIHVwZGF0ZS50byA9IHRvO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgdmFsdWVzLnRpbWV6b25lID09PSAnc3RyaW5nJykge1xuICAgICAgdXBkYXRlLnRpbWVab25lID0gdmFsdWVzLnRpbWV6b25lICE9PSAnJyA/IHZhbHVlcy50aW1lem9uZSA6IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBpZiAoT2JqZWN0LmtleXModXBkYXRlKS5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB1cGRhdGUudmFsdWUgPSBldmFsdWF0ZVRpbWVSYW5nZShcbiAgICAgIHVwZGF0ZS5mcm9tID8/IHRoaXMuc3RhdGUuZnJvbSxcbiAgICAgIHVwZGF0ZS50byA/PyB0aGlzLnN0YXRlLnRvLFxuICAgICAgdXBkYXRlLnRpbWVab25lID8/IHRoaXMuZ2V0VGltZVpvbmUoKSxcbiAgICAgIHRoaXMuc3RhdGUuZmlzY2FsWWVhclN0YXJ0TW9udGgsXG4gICAgICB0aGlzLnN0YXRlLlVOU0FGRV9ub3dEZWxheVxuICAgICk7XG5cbiAgICByZXR1cm4gdGhpcy5zZXRTdGF0ZSh1cGRhdGUpO1xuICB9XG59XG5cbi8qKlxuICogQ2FsY3VsYXRlcyB0aGUgZHVyYXRpb24gb2YgdGhlIHRpbWUgcmFuZ2UgZnJvbSB0aW1lLXRpbWUud2luZG93LzIgdG8gdGltZSt0aW1lLndpbmRvdy8yLiBCb3RoIGJlIHNwZWNpZmllZCBpbiBtcy4gRm9yIGV4YW1wbGUgP3RpbWU9MTUwMDAwMDAwMDAwMCZ0aW1lLndpbmRvdz0xMDAwMCByZXN1bHRzIGluIGEgMTAtc2Vjb25kIHRpbWUgcmFuZ2UgZnJvbSAxNDk5OTk5OTk1MDAwIHRvIDE1MDAwMDAwMDUwMDBgLlxuICogQHBhcmFtIHRpbWUgLSB0aW1lIGluIG1zXG4gKiBAcGFyYW0gdGltZVdpbmRvdyAtIHRpbWUgd2luZG93IGluIG1zIG9yIGludGVydmFsIHN0cmluZ1xuICovXG5mdW5jdGlvbiBnZXRUaW1lV2luZG93KHRpbWU6IHN0cmluZywgdGltZVdpbmRvdzogc3RyaW5nKSB7XG4gIC8vIFBhcnNlIHRoZSB0aW1lLCBhc3N1bWluZyBpdCBjb3VsZCBiZSBhbiBJU08gc3RyaW5nIG9yIGEgbnVtYmVyIGluIG1pbGxpc2Vjb25kc1xuICBjb25zdCB2YWx1ZVRpbWUgPSBpc05hTihEYXRlLnBhcnNlKHRpbWUpKSA/IHBhcnNlSW50KHRpbWUsIDEwKSA6IERhdGUucGFyc2UodGltZSk7XG5cbiAgbGV0IHRpbWVXaW5kb3dNcztcblxuICBpZiAodGltZVdpbmRvdy5tYXRjaCgvXlxcZCskLykgJiYgcGFyc2VJbnQodGltZVdpbmRvdywgMTApKSB7XG4gICAgLy8gd2hlbiB0aW1lIHdpbmRvdyBpcyBzcGVjaWZpZWQgaW4gbXNcbiAgICB0aW1lV2luZG93TXMgPSBwYXJzZUludCh0aW1lV2luZG93LCAxMCk7XG4gIH0gZWxzZSB7XG4gICAgdGltZVdpbmRvd01zID0gcmFuZ2VVdGlsLmludGVydmFsVG9Ncyh0aW1lV2luZG93KTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgZnJvbTogdG9VdGModmFsdWVUaW1lIC0gdGltZVdpbmRvd01zIC8gMikudG9JU09TdHJpbmcoKSxcbiAgICB0bzogdG9VdGModmFsdWVUaW1lICsgdGltZVdpbmRvd01zIC8gMikudG9JU09TdHJpbmcoKSxcbiAgfTtcbn1cbiJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBYU8sTUFBTSx1QkFBdUIsZUFBbUUsQ0FBQTtBQUFBLEVBRzlGLFdBQUEsQ0FBWSxLQUFzQyxHQUFBLEVBQUksRUFBQTtBQWhCL0QsSUFBQSxJQUFBLEVBQUEsQ0FBQTtBQWlCSSxJQUFNLE1BQUEsSUFBQSxHQUFPLE1BQU0sSUFBUSxJQUFB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