@c8y/ngx-components 1021.75.8 → 1021.77.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 (73) hide show
  1. package/branding/shared/supports-branding.service.d.ts.map +1 -1
  2. package/core/common/ApplicationOptions.d.ts +2 -2
  3. package/core/dashboard/widgets-dashboard.component.d.ts +4 -2
  4. package/core/dashboard/widgets-dashboard.component.d.ts.map +1 -1
  5. package/core/login/login.component.d.ts.map +1 -1
  6. package/core/login/login.service.d.ts +1 -0
  7. package/core/login/login.service.d.ts.map +1 -1
  8. package/core/navigator/navigator-bottom/navigator-bottom.service.d.ts +3 -1
  9. package/core/navigator/navigator-bottom/navigator-bottom.service.d.ts.map +1 -1
  10. package/datapoint-explorer/view/datapoint-explorer.component.d.ts.map +1 -1
  11. package/echart/charts.component.d.ts.map +1 -1
  12. package/echart/models/datapoints-graph-widget.model.d.ts +10 -0
  13. package/echart/models/datapoints-graph-widget.model.d.ts.map +1 -1
  14. package/echart/services/chart-realtime.service.d.ts +2 -5
  15. package/echart/services/chart-realtime.service.d.ts.map +1 -1
  16. package/echart/services/echarts-options.service.d.ts +4 -13
  17. package/echart/services/echarts-options.service.d.ts.map +1 -1
  18. package/echart/services/y-axis.service.d.ts +1 -1
  19. package/echart/services/y-axis.service.d.ts.map +1 -1
  20. package/esm2022/branding/shared/supports-branding.service.mjs +6 -3
  21. package/esm2022/core/beta-feature/beta-preview-button.component.mjs +3 -3
  22. package/esm2022/core/beta-feature/beta-preview.component.mjs +3 -3
  23. package/esm2022/core/common/ApplicationOptions.mjs +1 -1
  24. package/esm2022/core/dashboard/widgets-dashboard.component.mjs +9 -5
  25. package/esm2022/core/login/login.component.mjs +2 -1
  26. package/esm2022/core/login/login.service.mjs +5 -1
  27. package/esm2022/core/navigator/navigator-bottom/navigator-bottom.service.mjs +13 -6
  28. package/esm2022/datapoint-explorer/view/datapoint-explorer.component.mjs +4 -3
  29. package/esm2022/device-map/device-map.component.mjs +2 -2
  30. package/esm2022/echart/charts.component.mjs +8 -2
  31. package/esm2022/echart/models/datapoints-graph-widget.model.mjs +1 -1
  32. package/esm2022/echart/services/chart-realtime.service.mjs +1 -1
  33. package/esm2022/echart/services/echarts-options.service.mjs +23 -15
  34. package/esm2022/echart/services/y-axis.service.mjs +32 -1
  35. package/esm2022/map/cluster-map.component.mjs +6 -3
  36. package/esm2022/map/map-status.component.mjs +23 -5
  37. package/esm2022/map/map.model.mjs +5 -2
  38. package/esm2022/map/map.service.mjs +17 -1
  39. package/esm2022/widgets/implementations/datapoints-graph/datapoints-graph-config/datapoints-graph-widget-config.component.mjs +4 -3
  40. package/esm2022/widgets/implementations/map/map-widget-config.component.mjs +25 -6
  41. package/esm2022/widgets/implementations/map/map-widget.component.mjs +40 -11
  42. package/fesm2022/c8y-ngx-components-branding-shared.mjs +5 -2
  43. package/fesm2022/c8y-ngx-components-branding-shared.mjs.map +1 -1
  44. package/fesm2022/c8y-ngx-components-datapoint-explorer-view.mjs +3 -2
  45. package/fesm2022/c8y-ngx-components-datapoint-explorer-view.mjs.map +1 -1
  46. package/fesm2022/c8y-ngx-components-device-map.mjs +1 -1
  47. package/fesm2022/c8y-ngx-components-device-map.mjs.map +1 -1
  48. package/fesm2022/c8y-ngx-components-echart-models.mjs.map +1 -1
  49. package/fesm2022/c8y-ngx-components-echart.mjs +60 -15
  50. package/fesm2022/c8y-ngx-components-echart.mjs.map +1 -1
  51. package/fesm2022/c8y-ngx-components-map.mjs +47 -7
  52. package/fesm2022/c8y-ngx-components-map.mjs.map +1 -1
  53. package/fesm2022/c8y-ngx-components-widgets-implementations-datapoints-graph.mjs +3 -2
  54. package/fesm2022/c8y-ngx-components-widgets-implementations-datapoints-graph.mjs.map +1 -1
  55. package/fesm2022/c8y-ngx-components-widgets-implementations-map.mjs +67 -19
  56. package/fesm2022/c8y-ngx-components-widgets-implementations-map.mjs.map +1 -1
  57. package/fesm2022/c8y-ngx-components.mjs +26 -12
  58. package/fesm2022/c8y-ngx-components.mjs.map +1 -1
  59. package/locales/locales.pot +19 -7
  60. package/map/cluster-map.component.d.ts +2 -1
  61. package/map/cluster-map.component.d.ts.map +1 -1
  62. package/map/map-status.component.d.ts +7 -2
  63. package/map/map-status.component.d.ts.map +1 -1
  64. package/map/map.model.d.ts +1 -0
  65. package/map/map.model.d.ts.map +1 -1
  66. package/map/map.service.d.ts +1 -0
  67. package/map/map.service.d.ts.map +1 -1
  68. package/package.json +1 -1
  69. package/widgets/implementations/datapoints-graph/datapoints-graph-config/datapoints-graph-widget-config.component.d.ts.map +1 -1
  70. package/widgets/implementations/map/map-widget-config.component.d.ts +1 -0
  71. package/widgets/implementations/map/map-widget-config.component.d.ts.map +1 -1
  72. package/widgets/implementations/map/map-widget.component.d.ts +10 -4
  73. package/widgets/implementations/map/map-widget.component.d.ts.map +1 -1
@@ -218,6 +218,22 @@ export class MapService {
218
218
  const shiftWorld = (lngRevMin?.lng ?? 0) - (lngRevMax?.lng ?? 0) > 180;
219
219
  return latLngBounds(latLng(latMin?.lat, shiftWorld ? lngRevMin?.lng : lngMin?.lng), latLng(latMax?.lat, shiftWorld ? lngRevMax?.lng + 360 : lngMax?.lng));
220
220
  }
221
+ async getAssetsBounds(assets) {
222
+ const leaflet = await this.getLeaflet();
223
+ const bounds = leaflet.latLngBounds([]);
224
+ let hasValidPositions = false;
225
+ assets.forEach(asset => {
226
+ const position = asset.c8y_Position;
227
+ if (position && typeof position.lat === 'number' && typeof position.lng === 'number') {
228
+ bounds.extend([position.lat, position.lng]);
229
+ hasValidPositions = true;
230
+ }
231
+ });
232
+ if (!hasValidPositions || !bounds.isValid()) {
233
+ return;
234
+ }
235
+ return bounds;
236
+ }
221
237
  /**
222
238
  * Returns the cluster size for clustered maps. Counting the position MOs in a bounding
223
239
  * and if it reach a threshold, returning a [[ClusterSize]].
@@ -282,4 +298,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
282
298
  providedIn: 'root'
283
299
  }]
284
300
  }], ctorParameters: () => [{ type: i1.InventoryService }, { type: i2.OptionsService }, { type: i2.ServiceRegistry }] });
285
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFwLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9tYXAvbWFwLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEVBQWtCLGdCQUFnQixFQUF1QixNQUFNLGFBQWEsQ0FBQztBQUNwRixPQUFPLEVBQUUsY0FBYyxFQUFFLGVBQWUsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBR3RFLE9BQU8sRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBQy9DLE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDaEMsT0FBTyxFQUFFLGFBQWEsRUFBRSxLQUFLLEVBQWMsRUFBRSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzVELE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNyQyxPQUFPLEVBQ0wsV0FBVyxFQUNYLFlBQVksRUFDWixnQkFBZ0IsRUFDaEIsbUJBQW1CLEVBRXBCLE1BQU0sYUFBYSxDQUFDOzs7O0FBS3JCLE1BQU0sT0FBTyxVQUFVO0lBQ3JCOzs7O09BSUc7SUFDSCxNQUFNLENBQUMsU0FBUyxDQUFDLE1BQTZCO1FBQzVDLElBQUksQ0FBQyxNQUFNLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztZQUNuQyxPQUFPLFlBQVksQ0FBQztRQUN0QixDQUFDO1FBQ0QsSUFBSSxNQUFNLENBQUMsc0JBQXNCLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDM0MsT0FBTyxpQkFBaUIsQ0FBQztRQUMzQixDQUFDO1FBQ0QsSUFBSSxNQUFNLENBQUMsc0JBQXNCLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDeEMsT0FBTyxjQUFjLENBQUM7UUFDeEIsQ0FBQztRQUNELElBQUksTUFBTSxDQUFDLHNCQUFzQixDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ3hDLE9BQU8sY0FBYyxDQUFD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dXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IElNYW5hZ2VkT2JqZWN0LCBJbnZlbnRvcnlTZXJ2aWNlLCBJUmVzdWx0TGlzdCwgUGFnaW5nIH0gZnJvbSAnQGM4eS9jbGllbnQnO1xuaW1wb3J0IHsgT3B0aW9uc1NlcnZpY2UsIFNlcnZpY2VSZWdpc3RyeSB9IGZyb20gJ0BjOHkvbmd4LWNvbXBvbmVudHMnO1xuaW1wb3J0IHR5cGUgeyBNYXBEZWZhdWx0Q29uZmlnLCBNYXBUaWxlTGF5ZXIgfSBmcm9tICdAYzh5L29wdGlvbnMnO1xuaW1wb3J0IHR5cGUgKiBhcyBMIGZyb20gJ2xlYWZsZXQnO1xuaW1wb3J0IHsgbGF0TG5nLCBsYXRMbmdCb3VuZHMgfSBmcm9tICdsZWFmbGV0JztcbmltcG9ydCB7IGdldCB9IGZyb20gJ2xvZGFzaC1lcyc7XG5pbXBvcnQgeyBjb21iaW5lTGF0ZXN0LCBkZWZlciwgT2JzZXJ2YWJsZSwgb2YgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IG1hcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7XG4gIENsdXN0ZXJTaXplLFxuICBkZWZhdWx0TGF5ZXIsXG4gIGRlZmF1bHRNYXBDb25maWcsXG4gIE1hcFRlbmFudE9wdGlvbktleXMsXG4gIFBvc2l0aW9uTWFuYWdlZE9iamVjdFxufSBmcm9tICcuL21hcC5tb2RlbCc7XG5cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnXG59KVxuZXhwb3J0IGNsYXNzIE1hcFNlcnZpY2Uge1xuICAvKipcbiAgICogUmV0dXJucyBhc3NldCBpY29uIHN0YXR1cyBmb3IgaGlnaGVzdCBhbGFybSBzZXZlcml0eSBmb3VuZCBpbiBkZXZpY2Ugb2JqZWN0LlxuICAgKiBAcGFyYW0gZGV2aWNlIERldmljZSB0aGF0IGNvbnRhaW5zIGFsYXJtcyBpbmZvcm1hdGlvbi5cbiAgICogQHJldHVybnMgU3RhdHVzIHN0cmluZyBhY2NvcmRpbmcgdG8gYWxhcm0gc2V2ZXJpdHlcbiAgICovXG4gIHN0YXRpYyBnZXRTdGF0dXMoZGV2aWNlOiBQb3NpdGlvbk1hbmFnZWRPYmplY3QpIHtcbiAgICBpZiAoIWRldmljZS5jOHlfQWN0aXZlQWxhcm1zU3RhdHVzKSB7XG4gICAgICByZXR1cm4gJ3RleHQtbXV0ZWQnO1xuICAgIH1cbiAgICBpZiAoZGV2aWNlLmM4eV9BY3RpdmVBbGFybXNTdGF0dXMuY3JpdGljYWwpIHtcbiAgICAgIHJldHVybiAnc3RhdHVzIGNyaXRpY2FsJztcbiAgICB9XG4gICAgaWYgKGRldmljZS5jOHlfQWN0aXZlQWxhcm1zU3RhdHVzLm1ham9yKSB7XG4gICAgICByZXR1cm4gJ3N0YXR1cyBtYWpvcic7XG4gICAgfVxuICAgIGlmIChkZXZpY2UuYzh5X0FjdGl2ZUFsYXJtc1N0YXR1cy5taW5vcikge1xuICAgICAgcmV0dXJuICdzdGF0dXMgbWlub3InO1xuICAgIH1cbiAgICBpZiAoZGV2aWNlLmM4eV9BY3RpdmVBbGFybXNTdGF0dXMud2FybmluZykge1xuICAgICAgcmV0dXJuICdzdGF0dXMgd2FybmluZyc7XG4gICAgfVxuICAgIHJldHVybiAndGV4dC1tdXRlZCc7XG4gIH1cbiAgLyoqXG4gICAqIFRoZSBkZXZpY2VzIHRoYXQgYXJlIG1heGltYWwgZGlzcGxheWVkIGluIG9uZSBjbHVzdGVyLlxuICAgKi9cbiAgTUFYX0RFVklDRV9QRVJfQ0xVU1RFUiA9IDIwMDtcbiAgLyoqXG4gICAqIFRoZSBjb3VudCB1bnRpbCB0aGUgY2x1c3RlciBpcyBzaXplZC4gVGhlcmUgYXJlIGEgbWF4aW11bSBvZlxuICAgKiB0aHJlZSBjbHVzdGVyczogMSwgNCBvciAxNi5cbiAgICovXG4gIENMVVNURVJfTEVWRUxfVEhSRVNIT0xEID0gNTAwO1xuXG4gIC8qKlxuICAgKiBAaWdub3JlOiBPbmx5IERJLlxuICAgKi9cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBpbnZlbnRvcnk6IEludmVudG9yeVNlcnZpY2UsXG4gICAgcHJpdmF0ZSBvcHRpb25zOiBPcHRpb25zU2VydmljZSxcbiAgICBwcml2YXRlIHNlcnZpY2VSZWdpc3RyeTogU2VydmljZVJlZ2lzdHJ5XG4gICkge31cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgbGVhZmxldCBpbnN0YW5jZSB1c2VkIGJ5IHRoZSBjdW11bG9jaXR5IGNvcmUuXG4gICAqL1xuICBhc3luYyBnZXRMZWFmbGV0KCkge1xuICAgIGNvbnN0IG9yaWdpbmFsTGVmbGV0ID0gd2luZG93Lkw7XG4gICAgY29uc3QgYzh5TGVhZmxldEluc3RhbmNlID0gKGF3YWl0IGltcG9ydCgnbGVhZmxldCcpKS5kZWZhdWx0O1xuICAgIGM4eUxlYWZsZXRJbnN0YW5jZS5ub0NvbmZsaWN0KCk7XG4gICAgd2luZG93LkwgPSBvcmlnaW5hbExlZmxldDtcbiAgICByZXR1cm4gYzh5TGVhZmxldEluc3RhbmNlO1xuICB9XG5cbiAgLyoqXG4gICAqIFZlcmlmaWVzIGlmIGEgZ2l2ZW4gbWFuYWdlZCBvYmplY3QgaXMgYSBkZXZpY2Ugd2l0aCBhIHBvc2l0aW9uIGZyYWdtZW50LlxuICAgKiBAcGFyYW0gbW8gVGhlIGdpdmVuIG1hbmFnZWQgb2JqZWN0LlxuICAgKi9cbiAgaXNQb3NpdGlvbmVkRGV2aWNlKG1vOiBJTWFuYWdlZE9iamVjdCkge1xuICAgIHJldHVybiAhIShtbz8uYzh5X0lzRGV2aWNlICYmIHRoaXMuaGFzUG9zaXRpb24obW8pKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWZXJpZmllcyBpZiBhIGdpdmVuIG1hbmFnZWQgb2JqZWN0IGhhcyBhIHBvc2l0aW9uIGZyYWdtZW50LlxuICAgKiBAcGFyYW0gbW8gVGhlIGdpdmVuIG1hbmFnZWQgb2JqZWN0LlxuICAgKi9cbiAgaGFzUG9zaXRpb24obW86IElNYW5hZ2VkT2JqZWN0KSB7XG4gICAgcmV0dXJuIG1vPy5jOHlfUG9zaXRpb247XG4gIH1cblxuICBnZXRNYXBUaWxlTGF5ZXJQcm92aWRlcnMoKTogQ3VtdWxvY2l0eVNlcnZpY2VSZWdpc3RyeS5NYXBUaWxlTGF5ZXJQcm92aWRlcltdIHtcbiAgICBjb25zdCBsYXllclByb3ZpZGVycyA9IHRoaXMuc2VydmljZVJlZ2lzdHJ5LmdldCgnbWFwVGlsZUxheWVySG9vaycpO1xuXG4gICAgcmV0dXJuIGxheWVyUHJvdmlkZXJzO1xuICB9XG5cbiAgZ2V0TWFwVGlsZUxheWVyc0Zyb21Ib29rZWRQcm92aWRlcnMkKFxuICAgIGxheWVyUHJvdmlkZXJzOiBDdW11bG9jaXR5U2VydmljZVJlZ2lzdHJ5Lk1hcFRpbGVMYXllclByb3ZpZGVyW11cbiAgKTogT2JzZXJ2YWJsZTxNYXBUaWxlTGF5ZXJbXT4ge1xuICAgIGlmICghbGF5ZXJQcm92aWRlcnMubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gb2YoW10pO1xuICAgIH1cbiAgICBjb25zdCBsYXllcnMgPSBjb21iaW5lTGF0ZXN0KGxheWVyUHJvdmlkZXJzLm1hcChwcm92aWRlciA9PiBwcm92aWRlci5nZXRNYXBUaWxlTGF5ZXJzJCgpKSk7XG4gICAgcmV0dXJuIGxheWVycy5waXBlKG1hcChsYXllcnMgPT4gbGF5ZXJzLmZsYXQoKSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGxheWVycyBhdmFpbGFibGUgaW4gdGhpcyBhcHBsaWNhdGlvbi5cbiAgICogTGF5ZXJzIGFyZSB0YWtlbiBmcm9tIHBsdWdpbnMgaW5zdGFsbGVkIHRvIHRoaXMgYXBwbGljYXRpb24uXG4gICAqIEluIGNhc2Ugbm9uZSBvZiB0aGUgcGx1Z2lucyBvdmVycmlkZSB0aGUgZGVmYXVsdCBsYXllcnMsIHRoZSBkZWZhdWx0IGxheWVycyBhcmUgYWxzbyBjb25zaWRlcmVkLlxuICAgKiBAcmV0dXJucyBUaGUgbGF5ZXJzLlxuICAgKi9cbiAgZ2V0TWFwVGlsZUxheWVycyQoKTogT2JzZXJ2YWJsZTxNYXBUaWxlTGF5ZXJbXT4ge1xuICAgIHJldHVybiBkZWZlcigoKSA9PiB7XG4gICAgICBjb25zdCBsYXllclByb3ZpZGVycyA9IHRoaXMuZ2V0TWFwVGlsZUxheWVyUHJvdmlkZXJzKCk7XG4gICAgICBjb25zdCBvdmVycmlkZXNEZWZhdWx0TGF5ZXIgPSBsYXllclByb3ZpZGVycy5zb21lKHByb3ZpZGVyID0+XG4gICAgICAgIHByb3ZpZGVyLm92ZXJyaWRlc0RlZmF1bHRMYXllcj8uKClcbiAgICAgICk7XG4gICAgICBjb25zdCBsYXllcnNGcm9tUHJvdmlkZXJzID0gZGVmZXIoKCkgPT5cbiAgICAgICAgdGhpcy5nZXRNYXBUaWxlTGF5ZXJzRnJvbUhvb2tlZFByb3ZpZGVycyQobGF5ZXJQcm92aWRlcnMpXG4gICAgICApO1xuICAgICAgaWYgKG92ZXJyaWRlc0RlZmF1bHRMYXllcikge1xuICAgICAgICByZXR1cm4gbGF5ZXJzRnJvbVByb3ZpZGVycztcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGNvbWJpbmVMYXRlc3QoW3RoaXMuZ2V0RGVmYXVsdExheWVycygpLCBsYXllcnNGcm9tUHJvdmlkZXJzXSkucGlwZShcbiAgICAgICAgbWFwKGxheWVycyA9PiB7XG4gICAgICAgICAgcmV0dXJuIGxheWVycy5mbGF0KCk7XG4gICAgICAgIH0pXG4gICAgICApO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGxheWVycyBjb25maWd1cmVkIGluIHRoZSBjdXJyZW50IHBsYXRmb3JtIHZpYSB0ZW5hbnQgb3B0aW9ucy5cbiAgICogQHJldHVybnMgVGhlIGxheWVycy4gSWYgbm90IHNldCBpbiB0ZW5hbnQgb3B0aW9ucyB0aGUgZGVmYXVsdCBsYXllcnMuXG4gICAqL1xuICBnZXREZWZhdWx0TGF5ZXJzKCk6IE9ic2VydmFibGU8TWFwVGlsZUxheWVyW10+IHtcbiAgICByZXR1cm4gdGhpcy5nZXRNYXBPcHRpb248TWFwVGlsZUxheWVyW10+KFxuICAgICAgTWFwVGVuYW50T3B0aW9uS2V5cy5MQVlFUlMsXG4gICAgICB0aGlzLm9wdGlvbnMubWFwTGF5ZXJzIHx8IFtkZWZhdWx0TGF5ZXJdXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBtYXAgY29uZmlndXJhdGlvbiBjb25maWd1cmVkIG9uIHRoZSB0ZW5hbnQuXG4gICAqIEByZXR1cm5zIFRoZSBjb25maWd1cmF0aW9uLiBJZiBub3Qgc2V0IGluIHRlbmFudCBvcHRpb25zIHRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24uXG4gICAqL1xuICBnZXREZWZhdWx0Q29uZmlnKCk6IE9ic2VydmFibGU8TWFwRGVmYXVsdENvbmZpZz4ge1xuICAgIHJldHVybiB0aGlzLmdldE1hcE9wdGlvbjxNYXBEZWZhdWx0Q29uZmlnPihcbiAgICAgIE1hcFRlbmFudE9wdGlvbktleXMuQ09ORklHLFxuICAgICAgdGhpcy5vcHRpb25zLm1hcENvbmZpZyB8fCBkZWZhdWx0TWFwQ29uZmlnXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb3VudHMgYWxsIG1hbmFnZWQgb2JqZWN0cyBpbiBhIGdpdmVuIGJvdW5kIHdpdGggYSBjOHlfUG9zaXRpb24gZnJhZ21lbnQuXG4gICAqIEBwYXJhbSBib3VuZCBUaGUgbGF0IGxuZyBib3VuZCB0byByZXF1ZXN0IHRoZSBtYW5hZ2VkIG9iamVjdHMgZm9yLlxuICAgKiBAcGFyYW0gYnlHcm91cElkTU8gVGhlIGdyb3VwIG1hbmFnZWQgb2JqZWN0IG9mIHdoaWNoIGRpcmVjdCBjaGlsZHJlbiBzaG91bGQgYmUgc2VhcmNoZWQgZm9yLlxuICAgKiBAcmV0dXJucyBUaGUgbnVtYmVyIG9mIGFsbCBwb3NpdGlvbiBtYW5hZ2VkIG9iamVjdHMgaW4gdGhlIGdpdmVuIGJvdW5kIChhbmQgZ3JvdXApLlxuICAgKi9cbiAgYXN5bmMgZ2V0UG9zaXRpb25NT3NGcm9tQm91bmRDb3VudChcbiAgICBib3VuZDogTC5MYXRMbmdCb3VuZHMsXG4gICAgYnlHcm91cElkTU8/OiBJTWFuYWdlZE9iamVjdFxuICApOiBQcm9taXNlPG51bWJlcj4ge1xuICAgIHJldHVybiB0aGlzLmdldFBvc2l0aW9uTU9zRnJvbUJvdW5kKGJvdW5kLCBieUdyb3VwSWRNTywgdHJ1ZSkgYXMgUHJvbWlzZTxudW1iZXI+O1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYWxsIG1hbmFnZWQgb2JqZWN0cyB3aXRoIGEgYzh5X1Bvc2l0aW9uIGZyYWdtZW50IGluIGEgY2VydGFpbiBib3VuZGFyeS5cbiAgICogQHBhcmFtIGJvdW5kIFRoZSBsYXQgbG5nIGJvdW5kIHRvIHJlcXVlc3QgdGhlIG1hbmFnZWQgb2JqZWN0cyBmb3IuXG4gICAqIEByZXR1cm5zIEFsbCBwb3NpdGlvbiBtYW5hZ2VkIG9iamVjdHMgaW4gdGhlIGdpdmVuIGJvdW5kLlxuICAgKi9cbiAgYXN5bmMgZ2V0UG9zaXRpb25NT3NGcm9tQm91bmQoYm91bmQ6IEwuTGF0TG5nQm91bmRzKTogUHJvbWlzZTxQb3NpdGlvbk1hbmFnZWRPYmplY3RbXT47XG4gIC8qKlxuICAgKiBSZXR1cm5zIGFsbCBtYW5hZ2VkIG9iamVjdHMgd2l0aCBhIGM4eV9Qb3NpdGlvbiBmcmFnbWVudCBpbiBhIGNlcnRhaW4gYm91bmRhcnkgdGhhdCBiZWxvbmdzIHRvIGEgY2VydGFpbiBncm91cC5cbiAgICogQHBhcmFtIGJvdW5kIFRoZSBsYXQgbG5nIGJvdW5kIHRvIHJlcXVlc3QgdGhlIG1hbmFnZWQgb2JqZWN0cyBmb3IuXG4gICAqIEBwYXJhbSBieUdyb3VwSWRNTyBUaGUgZ3JvdXAgbWFuYWdlZCBvYmplY3Qgb2Ygd2hpY2ggZGlyZWN0IGNoaWxkcmVuIHNob3VsZCBiZSBzZWFyY2hlZCBmb3IuXG4gICAqIEByZXR1cm5zIEFsbCBwb3NpdGlvbiBtYW5hZ2VkIG9iamVjdHMgaW4gdGhlIGdpdmVuIGJvdW5kIHRoYXQgYXJlIGNoaWxkcmVuIG9mIHRoZSBnaXZlbiBncm91cC5cbiAgICovXG4gIGFzeW5jIGdldFBvc2l0aW9uTU9zRnJvbUJvdW5kKFxuICAgIGJvdW5kOiBMLkxhdExuZ0JvdW5kcyxcbiAgICBieUdyb3VwSWRNTzogSU1hbmFnZWRPYmplY3RcbiAgKTogUHJvbWlzZTxQb3NpdGlvbk1hbmFnZWRPYmplY3RbXT47XG4gIC8qKlxuICAgKiBDb3VudHMgdGhlIG1hbmFnZWQgb2JqZWN0cyBpbiBhIGNlcnRhaW4gYm91bmRhcnkgYmVsb25naW5nIHRvIGEgZ3JvdXAuXG4gICAqIEBwYXJhbSBib3VuZCBUaGUgbGF0IGxuZyBib3VuZCB0byByZXF1ZXN0IHRoZSBtYW5hZ2VkIG9iamVjdHMgZm9yLlxuICAgKiBAcGFyYW0gYnlHcm91cElkTU8gVGhlIGdyb3VwIG1hbmFnZWQgb2JqZWN0IG9mIHdoaWNoIGRpcmVjdCBjaGlsZHJlbiBzaG91bGQgYmUgc2VhcmNoZWQgZm9yLlxuICAgKiBAcmV0dXJuIFRoZSBjb3VudCBvZiB0aGUgbWFuYWdlZCBvYmplY3RzLlxuICAgKi9cbiAgYXN5bmMgZ2V0UG9zaXRpb25NT3NGcm9tQm91bmQoXG4gICAgYm91bmQ6IEwuTGF0TG5nQm91bmRzLFxuICAgIGJ5R3JvdXBJZE1POiBJTWFuYWdlZE9iamVjdCxcbiAgICBjb3VudDogdHJ1ZVxuICApOiBQcm9taXNlPG51bWJlcj47XG4gIGFzeW5jIGdldFBvc2l0aW9uTU9zRnJvbUJvdW5kKFxuICAgIGJvdW5kOiBMLkxhdExuZ0JvdW5kcyxcbiAgICBieUdyb3VwSWRNTz86IElNYW5hZ2VkT2JqZWN0LFxuICAgIGNvdW50ID0gZmFsc2VcbiAgKTogUHJvbWlzZTxQb3NpdGlvbk1hbmFnZWRPYmplY3RbXSB8IG51bWJlcj4ge1xuICAgIGNvbnN0IHsgbGF0OiBsYXRNaW4sIGxuZzogbG5nTWluUmF3IH0gPSBib3VuZC5nZXRTb3V0aFdlc3QoKTtcbiAgICBjb25zdCB7IGxhdDogbGF0TWF4LCBsbmc6IGxuZ01heFJhdyB9ID0gYm91bmQuZ2V0Tm9ydGhFYXN0KCk7XG5cbiAgICBjb25zdCBsbmdNaW4gPSBsbmdNYXhSYXcgLSBsbmdNaW5SYXcgPiAzNjAgPyAtMTgwIDogdGhpcy5ub3JtYWxpemVMb25naXR1ZGUobG5nTWluUmF3KTtcbiAgICBjb25zdCBsbmdNYXggPSBsbmdNYXhSYXcgLSBsbmdNaW5SYXcgPiAzNjAgPyAxODAgOiB0aGlzLm5vcm1hbGl6ZUxvbmdpdHVkZShsbmdNYXhSYXcpO1xuXG4gICAgY29uc3QgYnlHcm91cElkRmlsdGVyID0gYnlHcm91cElkTU9cbiAgICAgID8gYChieWdyb3VwaWQoJHtieUdyb3VwSWRNTy5pZH0pIG9yIGlkIGVxICcke2J5R3JvdXBJZE1PLmlkfScpIGFuZCBgXG4gICAgICA6ICcnO1xuICAgIGxldCBib3VuZEZpbHRlciA9IGAkZmlsdGVyPSR7YnlHcm91cElkRmlsdGVyfWhhcyhjOHlfUG9zaXRpb24pIGFuZCBjOHlfUG9zaXRpb24ubGF0IGd0ICR7bGF0TWlufWQgYW5kIGM4eV9Qb3NpdGlvbi5sYXQgbHQgJHtsYXRNYXh9ZGA7XG5cbiAgICBpZiAobG5nTWluIDwgbG5nTWF4KSB7XG4gICAgICBib3VuZEZpbHRlciA9IGAke2JvdW5kRmlsdGVyfSBhbmQgYzh5X1Bvc2l0aW9uLmxuZyBndCAke2xuZ01pbn1kIGFuZCBjOHlfUG9zaXRpb24ubG5nIGx0ICR7bG5nTWF4fWRgO1xuICAgIH0gZWxzZSB7XG4gICAgICBib3VuZEZpbHRlciA9IGAke2JvdW5kRmlsdGVyfSBhbmQgKGM4eV9Qb3NpdGlvbi5sbmcgZ3QgJHtsbmdNaW59ZCBvciBjOHlfUG9zaXRpb24ubG5nIGx0ICR7bG5nTWF4fWQpYDtcbiAgICB9XG5cbiAgICBjb25zdCB7IHBhZ2luZywgZGF0YSB9ID0gYXdhaXQgdGhpcy5pbnZlbnRvcnkubGlzdCh7XG4gICAgICBwYWdlU2l6ZTogY291bnQgPyAxIDogdGhpcy5NQVhfREVWSUNFX1BFUl9DTFVTVEVSLFxuICAgICAgd2l0aFRvdGFsUGFnZXM6IGNvdW50LFxuICAgICAgcXVlcnk6IGJvdW5kRmlsdGVyXG4gICAgfSk7XG4gICAgaWYgKGNvdW50KSB7XG4gICAgICByZXR1cm4gcGFnaW5nLnRvdGFsUGFnZXM7XG4gICAgfVxuICAgIHJldHVybiBkYXRhLm1hcCgocG1vOiBQb3NpdGlvbk1hbmFnZWRPYmplY3QpID0+XG4gICAgICBib3VuZC5jb250YWlucyhsYXRMbmcocG1vLmM4eV9Qb3NpdGlvbi5sYXQsIHBtby5jOHlfUG9zaXRpb24ubG5nKSlcbiAgICAgICAgPyBwbW9cbiAgICAgICAgOiB0aGlzLmRlbm9ybWFsaXplUE1PKHBtbywgYm91bmQpXG4gICAgKSBhcyBQb3NpdGlvbk1hbmFnZWRPYmplY3RbXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGFsbCBkZXZpY2VzIHdpdGggYzh5X1Bvc2l0aW9uLlxuICAgKi9cbiAgYXN5bmMgZ2V0UG9zaXRpb25EZXZpY2VzKCk6IFByb21pc2U8UG9zaXRpb25NYW5hZ2VkT2JqZWN0W10+O1xuICAvKipcbiAgICogUmV0dXJucyBhbGwgZGV2aWNlcyB3aXRoIGM4eV9Qb3NpdGlvbi5cbiAgICogQHBhcmFtIHBhZ2VTaXplIFRoZSBwYWdlIHNpemUgdG8gcmV0dXJuLlxuICAgKi9cbiAgYXN5bmMgZ2V0UG9zaXRpb25EZXZpY2VzKHBhZ2VTaXplOiBudW1iZXIpOiBQcm9taXNlPFBvc2l0aW9uTWFuYWdlZE9iamVjdFtdPjtcbiAgLyoqXG4gICAqIFJldHVybnMgYWxsIGRldmljZXMgd2l0aCBjOHlfUG9zaXRpb24uXG4gICAqIEBwYXJhbSBwYWdlU2l6ZSBUaGUgcGFnZSBzaXplIHRvIHJldHVybi5cbiAgICogQHBhcmFtIGNvdW50IENvdW50aW5nIGlzIGRpc2FibGVkXG4gICAqL1xuICBhc3luYyBnZXRQb3NpdGlvbkRldmljZXMocGFnZVNpemU6IG51bWJlciwgY291bnQ6IGZhbHNlKTogUHJvbWlzZTxQb3NpdGlvbk1hbmFnZWRPYmplY3RbXT47XG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgYWxsIGRldmljZXMgd2l0aCBjOHlfUG9zaXRpb24uXG4gICAqIEBwYXJhbSBwYWdlU2l6ZSBUaGUgcGFnZSBzaXplIHRvIHJldHVybi5cbiAgICogQHBhcmFtIGNvdW50IENvdW50aW5nIGlzIGVuYWJsZWRcbiAgICovXG4gIGFzeW5jIGdldFBvc2l0aW9uRGV2aWNlcyhwYWdlU2l6ZTogbnVtYmVyLCBjb3VudDogdHJ1ZSk6IFByb21pc2U8bnVtYmVyPjtcbiAgLyoqXG4gICAqIFJldHVybnMgYWxsIGRldmljZXMgd2l0aCBjOHlfUG9zaXRpb24uXG4gICAqIEBwYXJhbSBwYWdlU2l6ZSBUaGUgcGFnZSBzaXplIHRvIHJldHVybi5cbiAgICogQHBhcmFtIGNvdW50IFN3aXRjaGVzIHRvIGNvdW50aW5nIG9ubHkuXG4gICAqIEByZXR1cm5zIEFsbCBkZXZpY2VzIG9yIHRoZSBkZXZpY2UgY291bnQgd2l0aCBhIGM4eV9Qb3NpdGlvbiBmcmFnbWVudC5cbiAgICovXG4gIGFzeW5jIGdldFBvc2l0aW9uRGV2aWNlcyhcbiAgICBwYWdlU2l6ZSA9IHRoaXMuTUFYX0RFVklDRV9QRVJfQ0xVU1RFUixcbiAgICBjb3VudD86IGJvb2xlYW5cbiAgKTogUHJvbWlzZTxudW1iZXIgfCBQb3NpdGlvbk1hbmFnZWRPYmplY3RbXT4ge1xuICAgIGNvbnN0IHsgcGFnaW5nLCBkYXRhIH0gPSBhd2FpdCB0aGlzLmludmVudG9yeS5saXN0KHtcbiAgICAgIHBhZ2VTaXplOiBjb3VudCA/IDEgOiBwYWdlU2l6ZSxcbiAgICAgIHdpdGhUb3RhbFBhZ2VzOiAhIWNvdW50LFxuICAgICAgcXVlcnk6ICckZmlsdGVyPWhhcyhjOHlfUG9zaXRpb24pIGFuZCBoYXMoYzh5X0lzRGV2aWNlKSdcbiAgICB9KTtcbiAgICBpZiAoY291bnQpIHtcbiAgICAgIHJldHVybiBwYWdpbmcudG90YWxQYWdlcztcbiAgICB9XG4gICAgcmV0dXJuIGRhdGEgYXMgUG9zaXRpb25NYW5hZ2VkT2JqZWN0W107XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhbGwgbWFuYWdlZCBvYmplY3Qgd2l0aCBhIGM4eV9Qb3NpdGlvbiBmcmFnbWVudC5cbiAgICogQHBhcmFtIGJ5R3JvdXBJZE1PIFRoZSBncm91cCBtYW5hZ2VkIG9iamVjdCBvZiB3aGljaCBkaXJlY3QgY2hpbGRyZW4gc2hvdWxkIGJlIHNlYXJjaGVkIGZvci5cbiAgICogQHBhcmFtIHBhZ2VTaXplIERlZmluZXMgaG93IG1hbnkgcmVzdWx0cyBzaG91bGQgYmUgcmV0dXJuZWQuXG4gICAqIEByZXR1cm5zIFRoZSBtYW5hZ2VkIG9iamVjdHMgd2l0aCBwb3NpdGlvbi5cbiAgICovXG4gIGFzeW5jIGdldEFsbFBvc2l0aW9uTU9zKFxuICAgIGJ5R3JvdXBJZE1PPzogSU1hbmFnZWRPYmplY3QsXG4gICAgcGFnZVNpemUgPSA1MDBcbiAgKTogUHJvbWlzZTxJUmVzdWx0TGlzdDxQb3NpdGlvbk1hbmFnZWRPYmplY3Q+PiB7XG4gICAgY29uc3QgZmlsdGVyOiB7IHBhZ2VTaXplOiBudW1iZXI7IHdpdGhUb3RhbFBhZ2VzOiBib29sZWFuOyBxdWVyeTogc3RyaW5nIH0gPSB7XG4gICAgICBwYWdlU2l6ZSxcbiAgICAgIHdpdGhUb3RhbFBhZ2VzOiB0cnVlLFxuICAgICAgcXVlcnk6ICdoYXMoYzh5X1Bvc2l0aW9uKSdcbiAgICB9O1xuXG4gICAgaWYgKGJ5R3JvdXBJZE1PKSB7XG4gICAgICBmaWx0ZXIucXVlcnkgPSBgJGZpbHRlcj0oYnlncm91cGlkKCR7YnlHcm91cElkTU8uaWR9KSBvciBpZCBlcSAnJHtieUdyb3VwSWRNTy5pZH0nKSBhbmQgaGFzKGM4eV9Qb3NpdGlvbilgO1xuICAgIH1cblxuICAgIGNvbnN0IHsgcGFnaW5nLCBkYXRhLCByZXMgfSA9IGF3YWl0IHRoaXMuaW52ZW50b3J5Lmxpc3QoZmlsdGVyKTtcblxuICAgIHJldHVybiB7XG4gICAgICByZXMsXG4gICAgICBwYWdpbmc6IHBhZ2luZyBhcyBQYWdpbmc8UG9zaXRpb25NYW5hZ2VkT2JqZWN0PixcbiAgICAgIGRhdGE6IGRhdGEgYXMgUG9zaXRpb25NYW5hZ2VkT2JqZWN0W11cbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIERldGVybWluZXMgYSByZWN0YW5ndWxhciBnZW9ncmFwaGljYWwgYXJlYSBiYXNlZCBvbiB0aGUgcG9zaXRpb25zIG9mIGFsbCBkZXZpY2VzLlxuICAgKlxuICAgKiBAcmV0dXJucyBBIFtbTGF0TG5nQm91bmRzXV0gb2JqZWN0IGZpdHRpbmcgYWxsIGRldmljZXMnIGdlbyBwb3NpdGlvbnMuXG4gICAqL1xuICBhc3luYyBnZXRBbGxEZXZpY2VzQm91bmRzKCk6IFByb21pc2U8TC5MYXRMbmdCb3VuZHM+IHtcbiAgICBjb25zdCBmaWx0ZXIgPSAoY29vcmQ6ICdsYXQnIHwgJ2xuZycsIG9yZGVyOiAnYXNjJyB8ICdkZXNjJykgPT4gKHtcbiAgICAgIHBhZ2VTaXplOiAxLFxuICAgICAgcTogYCRmaWx0ZXI9aGFzKGM4eV9Qb3NpdGlvbikgJG9yZGVyYnk9Yzh5X1Bvc2l0aW9uLiR7Y29vcmR9ICR7b3JkZXJ9YFxuICAgIH0pO1xuXG4gICAgY29uc3QgZmlsdGVyUmV2ZXJzZSA9IChvcDogJ2x0JyB8ICdndCcsIG9yZGVyOiAnYXNjJyB8ICdkZXNjJykgPT4gKHtcbiAgICAgIHBhZ2VTaXplOiAxLFxuICAgICAgcTogYCRmaWx0ZXI9aGFzKGM4eV9Qb3NpdGlvbikgYW5kIGM4eV9Qb3NpdGlvbi5sbmcgJHtvcH0gMGQgJG9yZGVyYnk9Yzh5X1Bvc2l0aW9uLmxuZyAke29yZGVyfWBcbiAgICB9KTtcblxuICAgIGNvbnN0IFtsYXRNaW4sIGxhdE1heCwgbG5nTWluLCBsbmdNYXgsIGxuZ1Jldk1pbiwgbG5nUmV2TWF4XSA9IGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgIHRoaXMuaW52ZW50b3J5Lmxpc3QoZmlsdGVyKCdsYXQnLCAnYXNjJykpLFxuICAgICAgdGhpcy5pbnZlbnRvcnkubGlzdChmaWx0ZXIoJ2xhdCcsICdkZXNjJykpLFxuICAgICAgdGhpcy5pbnZlbnRvcnkubGlzdChmaWx0ZXIoJ2xuZycsICdhc2MnKSksXG4gICAgICB0aGlzLmludmVudG9yeS5saXN0KGZpbHRlcignbG5nJywgJ2Rlc2MnKSksXG4gICAgICB0aGlzLmludmVudG9yeS5saXN0KGZpbHRlclJldmVyc2UoJ2d0JywgJ2FzYycpKSxcbiAgICAgIHRoaXMuaW52ZW50b3J5Lmxpc3QoZmlsdGVyUmV2ZXJzZSgnbHQnLCAnZGVzYycpKVxuICAgIF0pLnRoZW4ocmVzdWx0ID0+IHJlc3VsdC5tYXAociA9PiBnZXQoci5kYXRhLCAnWzBdLmM4eV9Qb3NpdGlvbicpKSk7XG5cbiAgICBjb25zdCBzaGlmdFdvcmxkID0gKGxuZ1Jldk1pbj8ubG5nID8/IDApIC0gKGxuZ1Jldk1heD8ubG5nID8/IDApID4gMTgwO1xuXG4gICAgcmV0dXJuIGxhdExuZ0JvdW5kcyhcbiAgICAgIGxhdExuZyhsYXRNaW4/LmxhdCwgc2hpZnRXb3JsZCA/IGxuZ1Jldk1pbj8ubG5nIDogbG5nTWluPy5sbmcpLFxuICAgICAgbGF0TG5nKGxhdE1heD8ubGF0LCBzaGlmdFdvcmxkID8gbG5nUmV2TWF4Py5sbmcgKyAzNjAgOiBsbmdNYXg/LmxuZylcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGNsdXN0ZXIgc2l6ZSBmb3IgY2x1c3RlcmVkIG1hcHMuIENvdW50aW5nIHRoZSBwb3NpdGlvbiBNT3MgaW4gYSBib3VuZGluZ1xuICAgKiBhbmQgaWYgaXQgcmVhY2ggYSB0aHJlc2hvbGQsIHJldHVybmluZyBhIFtbQ2x1c3RlclNpemVdXS5cbiAgICogQHBhcmFtIGJvdW5kIFRoZSBib3VuZGluZyB0byBjaGVjayBmb3IgY2x1c3RlciBzaXplLlxuICAgKiBAcmV0dXJucyBUaGUgY2x1c3RlciBzaXplLCBjYW4gYmUgTk9ORSwgRk9VUiBvciBTSVhURUVOLlxuICAgKi9cbiAgYXN5bmMgZ2V0Q2x1c3RlclNpemUoYm91bmQ6IEwuTGF0TG5nQm91bmRzKSB7XG4gICAgY29uc3QgY291bnQgPSBhd2FpdCB0aGlzLmdldFBvc2l0aW9uTU9zRnJvbUJvdW5kQ291bnQoYm91bmQpO1xuICAgIGxldCBjbHVzdGVyU2l6ZSA9IENsdXN0ZXJTaXplLk5PTkU7XG4gICAgaWYgKGNvdW50ID4gdGhpcy5DTFVTVEVSX0xFVkVMX1RIUkVTSE9MRCkge1xuICAgICAgY2x1c3RlclNpemUgPSBDbHVzdGVyU2l6ZS5TSVhURUVOO1xuICAgIH0gZWxzZSBpZiAoY291bnQgPiB0aGlzLk1BWF9ERVZJQ0VfUEVSX0NMVVNURVIpIHtcbiAgICAgIGNsdXN0ZXJTaXplID0gQ2x1c3RlclNpemUuRk9VUjtcbiAgICB9XG4gICAgcmV0dXJuIGNsdXN0ZXJTaXplO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRNYXBPcHRpb248VD4oa2V5OiBNYXBUZW5hbnRPcHRpb25LZXlzLCBkZWZhdWx0VmFsdWU6IFQpIHtcbiAgICByZXR1cm4gZGVmZXIoKCkgPT5cbiAgICAgIHRoaXMub3B0aW9ucy5nZXRUZW5hbnRPcHRpb248VCB8IHN0cmluZz4oJ2NvbmZpZ3VyYXRpb24nLCBrZXksIGRlZmF1bHRWYWx1ZSlcbiAgICApLnBpcGUoXG4gICAgICBtYXAoY29uZmlnID0+IHtcbiAgICAgICAgaWYgKHR5cGVvZiBjb25maWcgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICAgIGBUaGUgdGVuYW50IG9wdGlvbiBmb3IgbWFwcyAnY29uZmlndXJhdGlvbi4ke2tleX0nIGlzIG5vdCBhIHZhbGlkIEpTT04gc3RydWN0dXJlLmBcbiAgICAgICAgICApO1xuICAgICAgICAgIHJldHVybiBkZWZhdWx0VmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNvbmZpZztcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTaGlmdHMgbG9uZ2l0dWRlcyByZWNlaXZlZCBmcm9tIExlYWZsZXQuanMgaW4gdGhlIFstMTgwIC0gayozNjA7IDE4MCArIGsqMzYwXSByYW5nZXdoZW5cbiAgICogYG5vV3JhcGAgaXMgZW5hYmxlZCB0byB0aGUgWy0xODA7IDE4MF0gcmFuZ2UgZXhwZWN0ZWQgZm9yIHZhbHVlcyBvZiB0aGUgYzh5X1Bvc2l0aW9uIGZyYWdtZW50LlxuICAgKlxuICAgKiBAcGFyYW0gbG5nIExvbmdpdHVkZSB0byBzaGlmdC5cbiAgICogQHJldHVybnMgIExvbmdpdHVkZSB2YWx1ZSBpbiB0aGUgWy0xODA7IDE4MF0gcmFuZ2VcbiAgICovXG4gIHByaXZhdGUgbm9ybWFsaXplTG9uZ2l0dWRlKGxuZzogbnVtYmVyKTogbnVtYmVyIHtcbiAgICByZXR1cm4gKCgoKGxuZyArIDE4MCkgJSAzNjApICsgMzYwKSAlIDM2MCkgLSAxODA7XG4gIH1cblxuICAvKipcbiAgICogU2hpZnRzIGxvbmdpdHVkZXMgaW4gdGhlIFstMTgwOyAxODBdIHJhbmdlIGV4cGVjdGVkIGZvciB2YWx1ZXMgb2YgdGhlIGM4eV9Qb3NpdGlvbiBmcmFnbWVudFxuICAgKiB0aGUgdGhlIFstMTgwIC0gayozNjA7IDE4MCArIGsqMzYwXSByYW5nZSBleHBlY3RlZCBmcm9tIExlYWZsZXQuanMgd2hlbiBgbm9XcmFwYCBpcyBlbmFibGVkLlxuICAgKlxuICAgKiBUaGUgbWV0aG9kIG5haXZlbHkgYWRkcy9zdWJ0cmFjdHMgMzYwIGRlZ3JlZXMgdG8gdGhlIG9yaWdpbmFsIHZhbHVlIHVudGlsIHRoZSBwb3NpdGlvbiBmaXRzIGluIHRoZSBleHBlY3RlZCBib3VuZHMuXG4gICAqXG4gICAqIEBwYXJhbSBwbW8gQSBtYW5hZ2VkIG9iamVjdCB3aXRoIGEgYGM4eV9Qb3NpdGlvbmAgZnJhZ21lbnRcbiAgICogQHBhcmFtIGJvdW5kcyBUaGUgYm91bmRzIHdoZXJlIHRoZSBwb3NpdGlvbiBzaG91bGQgZml0XG4gICAqIEByZXR1cm5zIEEgbWFuYWdlZCBvYmplY3Qgd2hvc2UgYGM4eV9Qb3NpdGlvbmAncyBgbG5nYCB2YWx1ZXMgaGFzIGJlZW4gc2hpZnRlZCB0byBmaXQgaW4gYm91bmRzXG4gICAqL1xuICBwcml2YXRlIGRlbm9ybWFsaXplUE1PKFxuICAgIHBtbzogUG9zaXRpb25NYW5hZ2VkT2JqZWN0LFxuICAgIGJvdW5kczogTC5MYXRMbmdCb3VuZHNcbiAgKTogUG9zaXRpb25NYW5hZ2VkT2JqZWN0IHtcbiAgICBsZXQgeyBsbmcgfSA9IHBtby5jOHlfUG9zaXRpb247XG4gICAgY29uc3Qgc2hpZnRGYWN0b3IgPSBsbmcgPiBib3VuZHMuZ2V0RWFzdCgpID8gLTEgOiAxO1xuXG4gICAgd2hpbGUgKCFib3VuZHMuY29udGFpbnMobGF0TG5nKHBtby5jOHlfUG9zaXRpb24ubGF0LCBsbmcpKSkge1xuICAgICAgbG5nICs9IHNoaWZ0RmFjdG9yICogMzYwO1xuICAgIH1cblxuICAgIHBtby5jOHlfUG9zaXRpb24ubG5nID0gbG5nO1xuICAgIHJldHVybiBwbW87XG4gIH1cbn1cbiJdfQ==
301
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFwLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9tYXAvbWFwLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEVBQWtCLGdCQUFnQixFQUF1QixNQUFNLGFBQWEsQ0FBQztBQUNwRixPQUFPLEVBQUUsY0FBYyxFQUFFLGVBQWUsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBR3RFLE9BQU8sRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBQy9DLE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDaEMsT0FBTyxFQUFFLGFBQWEsRUFBRSxLQUFLLEVBQWMsRUFBRSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzVELE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNyQyxPQUFPLEVBQ0wsV0FBVyxFQUNYLFlBQVksRUFDWixnQkFBZ0IsRUFDaEIsbUJBQW1CLEVBRXBCLE1BQU0sYUFBYSxDQUFDOzs7O0FBS3JCLE1BQU0sT0FBTyxVQUFVO0lBQ3JCOzs7O09BSUc7SUFDSCxNQUFNLENBQUMsU0FBUyxDQUFDLE1BQTZCO1FBQzVDLElBQUksQ0FBQyxNQUFNLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztZQUNuQyxPQUFPLFlBQVksQ0FBQztRQUN0QixDQUFDO1FBQ0QsSUFBSSxNQUFNLENBQUMsc0JBQXNCLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDM0MsT0FBTyxpQkFBaUIsQ0FBQztRQUMzQixDQUFDO1FBQ0QsSUFBSSxNQUFNLENBQUMsc0JBQXNCLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDeEMsT0FBTyxjQUFjLENBQUM7UUFDeEIsQ0FBQztRQUNELElBQUksTUFBTSxDQUFDLHNCQUFzQixDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ3hDLE9BQU8sY0FBYyxDQUFD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LEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQztJQUNuRCxDQUFDO0lBRUQ7Ozs7Ozs7OztPQVNHO0lBQ0ssY0FBYyxDQUNwQixHQUEwQixFQUMxQixNQUFzQjtRQUV0QixJQUFJLEVBQUUsR0FBRyxFQUFFLEdBQUcsR0FBRyxDQUFDLFlBQVksQ0FBQztRQUMvQixNQUFNLFdBQVcsR0FBRyxHQUFHLEdBQUcsTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRXBELE9BQU8sQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDM0QsR0FBRyxJQUFJLFdBQVcsR0FBRyxHQUFHLENBQUM7UUFDM0IsQ0FBQztRQUVELEdBQUcsQ0FBQyxZQUFZLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQztRQUMzQixPQUFPLEdBQUcsQ0FBQztJQUNiLENBQUM7K0dBaFpVLFVBQVU7bUhBQVYsVUFBVSxjQUZULE1BQU07OzRGQUVQLFVBQVU7a0JBSHRCLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgSU1hbmFnZWRPYmplY3QsIEludmVudG9yeVNlcnZpY2UsIElSZXN1bHRMaXN0LCBQYWdpbmcgfSBmcm9tICdAYzh5L2NsaWVudCc7XG5pbXBvcnQgeyBPcHRpb25zU2VydmljZSwgU2VydmljZVJlZ2lzdHJ5IH0gZnJvbSAnQGM4eS9uZ3gtY29tcG9uZW50cyc7XG5pbXBvcnQgdHlwZSB7IE1hcERlZmF1bHRDb25maWcsIE1hcFRpbGVMYXllciB9IGZyb20gJ0BjOHkvb3B0aW9ucyc7XG5pbXBvcnQgdHlwZSAqIGFzIEwgZnJvbSAnbGVhZmxldCc7XG5pbXBvcnQgeyBsYXRMbmcsIGxhdExuZ0JvdW5kcyB9IGZyb20gJ2xlYWZsZXQnO1xuaW1wb3J0IHsgZ2V0IH0gZnJvbSAnbG9kYXNoLWVzJztcbmltcG9ydCB7IGNvbWJpbmVMYXRlc3QsIGRlZmVyLCBPYnNlcnZhYmxlLCBvZiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgbWFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHtcbiAgQ2x1c3RlclNpemUsXG4gIGRlZmF1bHRMYXllcixcbiAgZGVmYXVsdE1hcENvbmZpZyxcbiAgTWFwVGVuYW50T3B0aW9uS2V5cyxcbiAgUG9zaXRpb25NYW5hZ2VkT2JqZWN0XG59IGZyb20gJy4vbWFwLm1vZGVsJztcblxuQEluamVjdGFibGUoe1xuICBwcm92aWRlZEluOiAncm9vdCdcbn0pXG5leHBvcnQgY2xhc3MgTWFwU2VydmljZSB7XG4gIC8qKlxuICAgKiBSZXR1cm5zIGFzc2V0IGljb24gc3RhdHVzIGZvciBoaWdoZXN0IGFsYXJtIHNldmVyaXR5IGZvdW5kIGluIGRldmljZSBvYmplY3QuXG4gICAqIEBwYXJhbSBkZXZpY2UgRGV2aWNlIHRoYXQgY29udGFpbnMgYWxhcm1zIGluZm9ybWF0aW9uLlxuICAgKiBAcmV0dXJucyBTdGF0dXMgc3RyaW5nIGFjY29yZGluZyB0byBhbGFybSBzZXZlcml0eVxuICAgKi9cbiAgc3RhdGljIGdldFN0YXR1cyhkZXZpY2U6IFBvc2l0aW9uTWFuYWdlZE9iamVjdCkge1xuICAgIGlmICghZGV2aWNlLmM4eV9BY3RpdmVBbGFybXNTdGF0dXMpIHtcbiAgICAgIHJldHVybiAndGV4dC1tdXRlZCc7XG4gICAgfVxuICAgIGlmIChkZXZpY2UuYzh5X0FjdGl2ZUFsYXJtc1N0YXR1cy5jcml0aWNhbCkge1xuICAgICAgcmV0dXJuICdzdGF0dXMgY3JpdGljYWwnO1xuICAgIH1cbiAgICBpZiAoZGV2aWNlLmM4eV9BY3RpdmVBbGFybXNTdGF0dXMubWFqb3IpIHtcbiAgICAgIHJldHVybiAnc3RhdHVzIG1ham9yJztcbiAgICB9XG4gICAgaWYgKGRldmljZS5jOHlfQWN0aXZlQWxhcm1zU3RhdHVzLm1pbm9yKSB7XG4gICAgICByZXR1cm4gJ3N0YXR1cyBtaW5vcic7XG4gICAgfVxuICAgIGlmIChkZXZpY2UuYzh5X0FjdGl2ZUFsYXJtc1N0YXR1cy53YXJuaW5nKSB7XG4gICAgICByZXR1cm4gJ3N0YXR1cyB3YXJuaW5nJztcbiAgICB9XG4gICAgcmV0dXJuICd0ZXh0LW11dGVkJztcbiAgfVxuICAvKipcbiAgICogVGhlIGRldmljZXMgdGhhdCBhcmUgbWF4aW1hbCBkaXNwbGF5ZWQgaW4gb25lIGNsdXN0ZXIuXG4gICAqL1xuICBNQVhfREVWSUNFX1BFUl9DTFVTVEVSID0gMjAwO1xuICAvKipcbiAgICogVGhlIGNvdW50IHVudGlsIHRoZSBjbHVzdGVyIGlzIHNpemVkLiBUaGVyZSBhcmUgYSBtYXhpbXVtIG9mXG4gICAqIHRocmVlIGNsdXN0ZXJzOiAxLCA0IG9yIDE2LlxuICAgKi9cbiAgQ0xVU1RFUl9MRVZFTF9USFJFU0hPTEQgPSA1MDA7XG5cbiAgLyoqXG4gICAqIEBpZ25vcmU6IE9ubHkgREkuXG4gICAqL1xuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGludmVudG9yeTogSW52ZW50b3J5U2VydmljZSxcbiAgICBwcml2YXRlIG9wdGlvbnM6IE9wdGlvbnNTZXJ2aWNlLFxuICAgIHByaXZhdGUgc2VydmljZVJlZ2lzdHJ5OiBTZXJ2aWNlUmVnaXN0cnlcbiAgKSB7fVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBsZWFmbGV0IGluc3RhbmNlIHVzZWQgYnkgdGhlIGN1bXVsb2NpdHkgY29yZS5cbiAgICovXG4gIGFzeW5jIGdldExlYWZsZXQoKSB7XG4gICAgY29uc3Qgb3JpZ2luYWxMZWZsZXQgPSB3aW5kb3cuTDtcbiAgICBjb25zdCBjOHlMZWFmbGV0SW5zdGFuY2UgPSAoYXdhaXQgaW1wb3J0KCdsZWFmbGV0JykpLmRlZmF1bHQ7XG4gICAgYzh5TGVhZmxldEluc3RhbmNlLm5vQ29uZmxpY3QoKTtcbiAgICB3aW5kb3cuTCA9IG9yaWdpbmFsTGVmbGV0O1xuICAgIHJldHVybiBjOHlMZWFmbGV0SW5zdGFuY2U7XG4gIH1cblxuICAvKipcbiAgICogVmVyaWZpZXMgaWYgYSBnaXZlbiBtYW5hZ2VkIG9iamVjdCBpcyBhIGRldmljZSB3aXRoIGEgcG9zaXRpb24gZnJhZ21lbnQuXG4gICAqIEBwYXJhbSBtbyBUaGUgZ2l2ZW4gbWFuYWdlZCBvYmplY3QuXG4gICAqL1xuICBpc1Bvc2l0aW9uZWREZXZpY2UobW86IElNYW5hZ2VkT2JqZWN0KSB7XG4gICAgcmV0dXJuICEhKG1vPy5jOHlfSXNEZXZpY2UgJiYgdGhpcy5oYXNQb3NpdGlvbihtbykpO1xuICB9XG5cbiAgLyoqXG4gICAqIFZlcmlmaWVzIGlmIGEgZ2l2ZW4gbWFuYWdlZCBvYmplY3QgaGFzIGEgcG9zaXRpb24gZnJhZ21lbnQuXG4gICAqIEBwYXJhbSBtbyBUaGUgZ2l2ZW4gbWFuYWdlZCBvYmplY3QuXG4gICAqL1xuICBoYXNQb3NpdGlvbihtbzogSU1hbmFnZWRPYmplY3QpIHtcbiAgICByZXR1cm4gbW8/LmM4eV9Qb3NpdGlvbjtcbiAgfVxuXG4gIGdldE1hcFRpbGVMYXllclByb3ZpZGVycygpOiBDdW11bG9jaXR5U2VydmljZVJlZ2lzdHJ5Lk1hcFRpbGVMYXllclByb3ZpZGVyW10ge1xuICAgIGNvbnN0IGxheWVyUHJvdmlkZXJzID0gdGhpcy5zZXJ2aWNlUmVnaXN0cnkuZ2V0KCdtYXBUaWxlTGF5ZXJIb29rJyk7XG5cbiAgICByZXR1cm4gbGF5ZXJQcm92aWRlcnM7XG4gIH1cblxuICBnZXRNYXBUaWxlTGF5ZXJzRnJvbUhvb2tlZFByb3ZpZGVycyQoXG4gICAgbGF5ZXJQcm92aWRlcnM6IEN1bXVsb2NpdHlTZXJ2aWNlUmVnaXN0cnkuTWFwVGlsZUxheWVyUHJvdmlkZXJbXVxuICApOiBPYnNlcnZhYmxlPE1hcFRpbGVMYXllcltdPiB7XG4gICAgaWYgKCFsYXllclByb3ZpZGVycy5sZW5ndGgpIHtcbiAgICAgIHJldHVybiBvZihbXSk7XG4gICAgfVxuICAgIGNvbnN0IGxheWVycyA9IGNvbWJpbmVMYXRlc3QobGF5ZXJQcm92aWRlcnMubWFwKHByb3ZpZGVyID0+IHByb3ZpZGVyLmdldE1hcFRpbGVMYXllcnMkKCkpKTtcbiAgICByZXR1cm4gbGF5ZXJzLnBpcGUobWFwKGxheWVycyA9PiBsYXllcnMuZmxhdCgpKSk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgbGF5ZXJzIGF2YWlsYWJsZSBpbiB0aGlzIGFwcGxpY2F0aW9uLlxuICAgKiBMYXllcnMgYXJlIHRha2VuIGZyb20gcGx1Z2lucyBpbnN0YWxsZWQgdG8gdGhpcyBhcHBsaWNhdGlvbi5cbiAgICogSW4gY2FzZSBub25lIG9mIHRoZSBwbHVnaW5zIG92ZXJyaWRlIHRoZSBkZWZhdWx0IGxheWVycywgdGhlIGRlZmF1bHQgbGF5ZXJzIGFyZSBhbHNvIGNvbnNpZGVyZWQuXG4gICAqIEByZXR1cm5zIFRoZSBsYXllcnMuXG4gICAqL1xuICBnZXRNYXBUaWxlTGF5ZXJzJCgpOiBPYnNlcnZhYmxlPE1hcFRpbGVMYXllcltdPiB7XG4gICAgcmV0dXJuIGRlZmVyKCgpID0+IHtcbiAgICAgIGNvbnN0IGxheWVyUHJvdmlkZXJzID0gdGhpcy5nZXRNYXBUaWxlTGF5ZXJQcm92aWRlcnMoKTtcbiAgICAgIGNvbnN0IG92ZXJyaWRlc0RlZmF1bHRMYXllciA9IGxheWVyUHJvdmlkZXJzLnNvbWUocHJvdmlkZXIgPT5cbiAgICAgICAgcHJvdmlkZXIub3ZlcnJpZGVzRGVmYXVsdExheWVyPy4oKVxuICAgICAgKTtcbiAgICAgIGNvbnN0IGxheWVyc0Zyb21Qcm92aWRlcnMgPSBkZWZlcigoKSA9PlxuICAgICAgICB0aGlzLmdldE1hcFRpbGVMYXllcnNGcm9tSG9va2VkUHJvdmlkZXJzJChsYXllclByb3ZpZGVycylcbiAgICAgICk7XG4gICAgICBpZiAob3ZlcnJpZGVzRGVmYXVsdExheWVyKSB7XG4gICAgICAgIHJldHVybiBsYXllcnNGcm9tUHJvdmlkZXJzO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gY29tYmluZUxhdGVzdChbdGhpcy5nZXREZWZhdWx0TGF5ZXJzKCksIGxheWVyc0Zyb21Qcm92aWRlcnNdKS5waXBlKFxuICAgICAgICBtYXAobGF5ZXJzID0+IHtcbiAgICAgICAgICByZXR1cm4gbGF5ZXJzLmZsYXQoKTtcbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgbGF5ZXJzIGNvbmZpZ3VyZWQgaW4gdGhlIGN1cnJlbnQgcGxhdGZvcm0gdmlhIHRlbmFudCBvcHRpb25zLlxuICAgKiBAcmV0dXJucyBUaGUgbGF5ZXJzLiBJZiBub3Qgc2V0IGluIHRlbmFudCBvcHRpb25zIHRoZSBkZWZhdWx0IGxheWVycy5cbiAgICovXG4gIGdldERlZmF1bHRMYXllcnMoKTogT2JzZXJ2YWJsZTxNYXBUaWxlTGF5ZXJbXT4ge1xuICAgIHJldHVybiB0aGlzLmdldE1hcE9wdGlvbjxNYXBUaWxlTGF5ZXJbXT4oXG4gICAgICBNYXBUZW5hbnRPcHRpb25LZXlzLkxBWUVSUyxcbiAgICAgIHRoaXMub3B0aW9ucy5tYXBMYXllcnMgfHwgW2RlZmF1bHRMYXllcl1cbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIG1hcCBjb25maWd1cmF0aW9uIGNvbmZpZ3VyZWQgb24gdGhlIHRlbmFudC5cbiAgICogQHJldHVybnMgVGhlIGNvbmZpZ3VyYXRpb24uIElmIG5vdCBzZXQgaW4gdGVuYW50IG9wdGlvbnMgdGhlIGRlZmF1bHQgY29uZmlndXJhdGlvbi5cbiAgICovXG4gIGdldERlZmF1bHRDb25maWcoKTogT2JzZXJ2YWJsZTxNYXBEZWZhdWx0Q29uZmlnPiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TWFwT3B0aW9uPE1hcERlZmF1bHRDb25maWc+KFxuICAgICAgTWFwVGVuYW50T3B0aW9uS2V5cy5DT05GSUcsXG4gICAgICB0aGlzLm9wdGlvbnMubWFwQ29uZmlnIHx8IGRlZmF1bHRNYXBDb25maWdcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIENvdW50cyBhbGwgbWFuYWdlZCBvYmplY3RzIGluIGEgZ2l2ZW4gYm91bmQgd2l0aCBhIGM4eV9Qb3NpdGlvbiBmcmFnbWVudC5cbiAgICogQHBhcmFtIGJvdW5kIFRoZSBsYXQgbG5nIGJvdW5kIHRvIHJlcXVlc3QgdGhlIG1hbmFnZWQgb2JqZWN0cyBmb3IuXG4gICAqIEBwYXJhbSBieUdyb3VwSWRNTyBUaGUgZ3JvdXAgbWFuYWdlZCBvYmplY3Qgb2Ygd2hpY2ggZGlyZWN0IGNoaWxkcmVuIHNob3VsZCBiZSBzZWFyY2hlZCBmb3IuXG4gICAqIEByZXR1cm5zIFRoZSBudW1iZXIgb2YgYWxsIHBvc2l0aW9uIG1hbmFnZWQgb2JqZWN0cyBpbiB0aGUgZ2l2ZW4gYm91bmQgKGFuZCBncm91cCkuXG4gICAqL1xuICBhc3luYyBnZXRQb3NpdGlvbk1Pc0Zyb21Cb3VuZENvdW50KFxuICAgIGJvdW5kOiBMLkxhdExuZ0JvdW5kcyxcbiAgICBieUdyb3VwSWRNTz86IElNYW5hZ2VkT2JqZWN0XG4gICk6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UG9zaXRpb25NT3NGcm9tQm91bmQoYm91bmQsIGJ5R3JvdXBJZE1PLCB0cnVlKSBhcyBQcm9taXNlPG51bWJlcj47XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhbGwgbWFuYWdlZCBvYmplY3RzIHdpdGggYSBjOHlfUG9zaXRpb24gZnJhZ21lbnQgaW4gYSBjZXJ0YWluIGJvdW5kYXJ5LlxuICAgKiBAcGFyYW0gYm91bmQgVGhlIGxhdCBsbmcgYm91bmQgdG8gcmVxdWVzdCB0aGUgbWFuYWdlZCBvYmplY3RzIGZvci5cbiAgICogQHJldHVybnMgQWxsIHBvc2l0aW9uIG1hbmFnZWQgb2JqZWN0cyBpbiB0aGUgZ2l2ZW4gYm91bmQuXG4gICAqL1xuICBhc3luYyBnZXRQb3NpdGlvbk1Pc0Zyb21Cb3VuZChib3VuZDogTC5MYXRMbmdCb3VuZHMpOiBQcm9taXNlPFBvc2l0aW9uTWFuYWdlZE9iamVjdFtdPjtcbiAgLyoqXG4gICAqIFJldHVybnMgYWxsIG1hbmFnZWQgb2JqZWN0cyB3aXRoIGEgYzh5X1Bvc2l0aW9uIGZyYWdtZW50IGluIGEgY2VydGFpbiBib3VuZGFyeSB0aGF0IGJlbG9uZ3MgdG8gYSBjZXJ0YWluIGdyb3VwLlxuICAgKiBAcGFyYW0gYm91bmQgVGhlIGxhdCBsbmcgYm91bmQgdG8gcmVxdWVzdCB0aGUgbWFuYWdlZCBvYmplY3RzIGZvci5cbiAgICogQHBhcmFtIGJ5R3JvdXBJZE1PIFRoZSBncm91cCBtYW5hZ2VkIG9iamVjdCBvZiB3aGljaCBkaXJlY3QgY2hpbGRyZW4gc2hvdWxkIGJlIHNlYXJjaGVkIGZvci5cbiAgICogQHJldHVybnMgQWxsIHBvc2l0aW9uIG1hbmFnZWQgb2JqZWN0cyBpbiB0aGUgZ2l2ZW4gYm91bmQgdGhhdCBhcmUgY2hpbGRyZW4gb2YgdGhlIGdpdmVuIGdyb3VwLlxuICAgKi9cbiAgYXN5bmMgZ2V0UG9zaXRpb25NT3NGcm9tQm91bmQoXG4gICAgYm91bmQ6IEwuTGF0TG5nQm91bmRzLFxuICAgIGJ5R3JvdXBJZE1POiBJTWFuYWdlZE9iamVjdFxuICApOiBQcm9taXNlPFBvc2l0aW9uTWFuYWdlZE9iamVjdFtdPjtcbiAgLyoqXG4gICAqIENvdW50cyB0aGUgbWFuYWdlZCBvYmplY3RzIGluIGEgY2VydGFpbiBib3VuZGFyeSBiZWxvbmdpbmcgdG8gYSBncm91cC5cbiAgICogQHBhcmFtIGJvdW5kIFRoZSBsYXQgbG5nIGJvdW5kIHRvIHJlcXVlc3QgdGhlIG1hbmFnZWQgb2JqZWN0cyBmb3IuXG4gICAqIEBwYXJhbSBieUdyb3VwSWRNTyBUaGUgZ3JvdXAgbWFuYWdlZCBvYmplY3Qgb2Ygd2hpY2ggZGlyZWN0IGNoaWxkcmVuIHNob3VsZCBiZSBzZWFyY2hlZCBmb3IuXG4gICAqIEByZXR1cm4gVGhlIGNvdW50IG9mIHRoZSBtYW5hZ2VkIG9iamVjdHMuXG4gICAqL1xuICBhc3luYyBnZXRQb3NpdGlvbk1Pc0Zyb21Cb3VuZChcbiAgICBib3VuZDogTC5MYXRMbmdCb3VuZHMsXG4gICAgYnlHcm91cElkTU86IElNYW5hZ2VkT2JqZWN0LFxuICAgIGNvdW50OiB0cnVlXG4gICk6IFByb21pc2U8bnVtYmVyPjtcbiAgYXN5bmMgZ2V0UG9zaXRpb25NT3NGcm9tQm91bmQoXG4gICAgYm91bmQ6IEwuTGF0TG5nQm91bmRzLFxuICAgIGJ5R3JvdXBJZE1PPzogSU1hbmFnZWRPYmplY3QsXG4gICAgY291bnQgPSBmYWxzZVxuICApOiBQcm9taXNlPFBvc2l0aW9uTWFuYWdlZE9iamVjdFtdIHwgbnVtYmVyPiB7XG4gICAgY29uc3QgeyBsYXQ6IGxhdE1pbiwgbG5nOiBsbmdNaW5SYXcgfSA9IGJvdW5kLmdldFNvdXRoV2VzdCgpO1xuICAgIGNvbnN0IHsgbGF0OiBsYXRNYXgsIGxuZzogbG5nTWF4UmF3IH0gPSBib3VuZC5nZXROb3J0aEVhc3QoKTtcblxuICAgIGNvbnN0IGxuZ01pbiA9IGxuZ01heFJhdyAtIGxuZ01pblJhdyA+IDM2MCA/IC0xODAgOiB0aGlzLm5vcm1hbGl6ZUxvbmdpdHVkZShsbmdNaW5SYXcpO1xuICAgIGNvbnN0IGxuZ01heCA9IGxuZ01heFJhdyAtIGxuZ01pblJhdyA+IDM2MCA/IDE4MCA6IHRoaXMubm9ybWFsaXplTG9uZ2l0dWRlKGxuZ01heFJhdyk7XG5cbiAgICBjb25zdCBieUdyb3VwSWRGaWx0ZXIgPSBieUdyb3VwSWRNT1xuICAgICAgPyBgKGJ5Z3JvdXBpZCgke2J5R3JvdXBJZE1PLmlkfSkgb3IgaWQgZXEgJyR7YnlHcm91cElkTU8uaWR9JykgYW5kIGBcbiAgICAgIDogJyc7XG4gICAgbGV0IGJvdW5kRmlsdGVyID0gYCRmaWx0ZXI9JHtieUdyb3VwSWRGaWx0ZXJ9aGFzKGM4eV9Qb3NpdGlvbikgYW5kIGM4eV9Qb3NpdGlvbi5sYXQgZ3QgJHtsYXRNaW59ZCBhbmQgYzh5X1Bvc2l0aW9uLmxhdCBsdCAke2xhdE1heH1kYDtcblxuICAgIGlmIChsbmdNaW4gPCBsbmdNYXgpIHtcbiAgICAgIGJvdW5kRmlsdGVyID0gYCR7Ym91bmRGaWx0ZXJ9IGFuZCBjOHlfUG9zaXRpb24ubG5nIGd0ICR7bG5nTWlufWQgYW5kIGM4eV9Qb3NpdGlvbi5sbmcgbHQgJHtsbmdNYXh9ZGA7XG4gICAgfSBlbHNlIHtcbiAgICAgIGJvdW5kRmlsdGVyID0gYCR7Ym91bmRGaWx0ZXJ9IGFuZCAoYzh5X1Bvc2l0aW9uLmxuZyBndCAke2xuZ01pbn1kIG9yIGM4eV9Qb3NpdGlvbi5sbmcgbHQgJHtsbmdNYXh9ZClgO1xuICAgIH1cblxuICAgIGNvbnN0IHsgcGFnaW5nLCBkYXRhIH0gPSBhd2FpdCB0aGlzLmludmVudG9yeS5saXN0KHtcbiAgICAgIHBhZ2VTaXplOiBjb3VudCA/IDEgOiB0aGlzLk1BWF9ERVZJQ0VfUEVSX0NMVVNURVIsXG4gICAgICB3aXRoVG90YWxQYWdlczogY291bnQsXG4gICAgICBxdWVyeTogYm91bmRGaWx0ZXJcbiAgICB9KTtcbiAgICBpZiAoY291bnQpIHtcbiAgICAgIHJldHVybiBwYWdpbmcudG90YWxQYWdlcztcbiAgICB9XG4gICAgcmV0dXJuIGRhdGEubWFwKChwbW86IFBvc2l0aW9uTWFuYWdlZE9iamVjdCkgPT5cbiAgICAgIGJvdW5kLmNvbnRhaW5zKGxhdExuZyhwbW8uYzh5X1Bvc2l0aW9uLmxhdCwgcG1vLmM4eV9Qb3NpdGlvbi5sbmcpKVxuICAgICAgICA/IHBtb1xuICAgICAgICA6IHRoaXMuZGVub3JtYWxpemVQTU8ocG1vLCBib3VuZClcbiAgICApIGFzIFBvc2l0aW9uTWFuYWdlZE9iamVjdFtdO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYWxsIGRldmljZXMgd2l0aCBjOHlfUG9zaXRpb24uXG4gICAqL1xuICBhc3luYyBnZXRQb3NpdGlvbkRldmljZXMoKTogUHJvbWlzZTxQb3NpdGlvbk1hbmFnZWRPYmplY3RbXT47XG4gIC8qKlxuICAgKiBSZXR1cm5zIGFsbCBkZXZpY2VzIHdpdGggYzh5X1Bvc2l0aW9uLlxuICAgKiBAcGFyYW0gcGFnZVNpemUgVGhlIHBhZ2Ugc2l6ZSB0byByZXR1cm4uXG4gICAqL1xuICBhc3luYyBnZXRQb3NpdGlvbkRldmljZXMocGFnZVNpemU6IG51bWJlcik6IFByb21pc2U8UG9zaXRpb25NYW5hZ2VkT2JqZWN0W10+O1xuICAvKipcbiAgICogUmV0dXJucyBhbGwgZGV2aWNlcyB3aXRoIGM4eV9Qb3NpdGlvbi5cbiAgICogQHBhcmFtIHBhZ2VTaXplIFRoZSBwYWdlIHNpemUgdG8gcmV0dXJuLlxuICAgKiBAcGFyYW0gY291bnQgQ291bnRpbmcgaXMgZGlzYWJsZWRcbiAgICovXG4gIGFzeW5jIGdldFBvc2l0aW9uRGV2aWNlcyhwYWdlU2l6ZTogbnVtYmVyLCBjb3VudDogZmFsc2UpOiBQcm9taXNlPFBvc2l0aW9uTWFuYWdlZE9iamVjdFtdPjtcbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIG51bWJlciBvZiBhbGwgZGV2aWNlcyB3aXRoIGM4eV9Qb3NpdGlvbi5cbiAgICogQHBhcmFtIHBhZ2VTaXplIFRoZSBwYWdlIHNpemUgdG8gcmV0dXJuLlxuICAgKiBAcGFyYW0gY291bnQgQ291bnRpbmcgaXMgZW5hYmxlZFxuICAgKi9cbiAgYXN5bmMgZ2V0UG9zaXRpb25EZXZpY2VzKHBhZ2VTaXplOiBudW1iZXIsIGNvdW50OiB0cnVlKTogUHJvbWlzZTxudW1iZXI+O1xuICAvKipcbiAgICogUmV0dXJucyBhbGwgZGV2aWNlcyB3aXRoIGM4eV9Qb3NpdGlvbi5cbiAgICogQHBhcmFtIHBhZ2VTaXplIFRoZSBwYWdlIHNpemUgdG8gcmV0dXJuLlxuICAgKiBAcGFyYW0gY291bnQgU3dpdGNoZXMgdG8gY291bnRpbmcgb25seS5cbiAgICogQHJldHVybnMgQWxsIGRldmljZXMgb3IgdGhlIGRldmljZSBjb3VudCB3aXRoIGEgYzh5X1Bvc2l0aW9uIGZyYWdtZW50LlxuICAgKi9cbiAgYXN5bmMgZ2V0UG9zaXRpb25EZXZpY2VzKFxuICAgIHBhZ2VTaXplID0gdGhpcy5NQVhfREVWSUNFX1BFUl9DTFVTVEVSLFxuICAgIGNvdW50PzogYm9vbGVhblxuICApOiBQcm9taXNlPG51bWJlciB8IFBvc2l0aW9uTWFuYWdlZE9iamVjdFtdPiB7XG4gICAgY29uc3QgeyBwYWdpbmcsIGRhdGEgfSA9IGF3YWl0IHRoaXMuaW52ZW50b3J5Lmxpc3Qoe1xuICAgICAgcGFnZVNpemU6IGNvdW50ID8gMSA6IHBhZ2VTaXplLFxuICAgICAgd2l0aFRvdGFsUGFnZXM6ICEhY291bnQsXG4gICAgICBxdWVyeTogJyRmaWx0ZXI9aGFzKGM4eV9Qb3NpdGlvbikgYW5kIGhhcyhjOHlfSXNEZXZpY2UpJ1xuICAgIH0pO1xuICAgIGlmIChjb3VudCkge1xuICAgICAgcmV0dXJuIHBhZ2luZy50b3RhbFBhZ2VzO1xuICAgIH1cbiAgICByZXR1cm4gZGF0YSBhcyBQb3NpdGlvbk1hbmFnZWRPYmplY3RbXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGFsbCBtYW5hZ2VkIG9iamVjdCB3aXRoIGEgYzh5X1Bvc2l0aW9uIGZyYWdtZW50LlxuICAgKiBAcGFyYW0gYnlHcm91cElkTU8gVGhlIGdyb3VwIG1hbmFnZWQgb2JqZWN0IG9mIHdoaWNoIGRpcmVjdCBjaGlsZHJlbiBzaG91bGQgYmUgc2VhcmNoZWQgZm9yLlxuICAgKiBAcGFyYW0gcGFnZVNpemUgRGVmaW5lcyBob3cgbWFueSByZXN1bHRzIHNob3VsZCBiZSByZXR1cm5lZC5cbiAgICogQHJldHVybnMgVGhlIG1hbmFnZWQgb2JqZWN0cyB3aXRoIHBvc2l0aW9uLlxuICAgKi9cbiAgYXN5bmMgZ2V0QWxsUG9zaXRpb25NT3MoXG4gICAgYnlHcm91cElkTU8/OiBJTWFuYWdlZE9iamVjdCxcbiAgICBwYWdlU2l6ZSA9IDUwMFxuICApOiBQcm9taXNlPElSZXN1bHRMaXN0PFBvc2l0aW9uTWFuYWdlZE9iamVjdD4+IHtcbiAgICBjb25zdCBmaWx0ZXI6IHsgcGFnZVNpemU6IG51bWJlcjsgd2l0aFRvdGFsUGFnZXM6IGJvb2xlYW47IHF1ZXJ5OiBzdHJpbmcgfSA9IHtcbiAgICAgIHBhZ2VTaXplLFxuICAgICAgd2l0aFRvdGFsUGFnZXM6IHRydWUsXG4gICAgICBxdWVyeTogJ2hhcyhjOHlfUG9zaXRpb24pJ1xuICAgIH07XG5cbiAgICBpZiAoYnlHcm91cElkTU8pIHtcbiAgICAgIGZpbHRlci5xdWVyeSA9IGAkZmlsdGVyPShieWdyb3VwaWQoJHtieUdyb3VwSWRNTy5pZH0pIG9yIGlkIGVxICcke2J5R3JvdXBJZE1PLmlkfScpIGFuZCBoYXMoYzh5X1Bvc2l0aW9uKWA7XG4gICAgfVxuXG4gICAgY29uc3QgeyBwYWdpbmcsIGRhdGEsIHJlcyB9ID0gYXdhaXQgdGhpcy5pbnZlbnRvcnkubGlzdChmaWx0ZXIpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHJlcyxcbiAgICAgIHBhZ2luZzogcGFnaW5nIGFzIFBhZ2luZzxQb3NpdGlvbk1hbmFnZWRPYmplY3Q+LFxuICAgICAgZGF0YTogZGF0YSBhcyBQb3NpdGlvbk1hbmFnZWRPYmplY3RbXVxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogRGV0ZXJtaW5lcyBhIHJlY3Rhbmd1bGFyIGdlb2dyYXBoaWNhbCBhcmVhIGJhc2VkIG9uIHRoZSBwb3NpdGlvbnMgb2YgYWxsIGRldmljZXMuXG4gICAqXG4gICAqIEByZXR1cm5zIEEgW1tMYXRMbmdCb3VuZHNdXSBvYmplY3QgZml0dGluZyBhbGwgZGV2aWNlcycgZ2VvIHBvc2l0aW9ucy5cbiAgICovXG4gIGFzeW5jIGdldEFsbERldmljZXNCb3VuZHMoKTogUHJvbWlzZTxMLkxhdExuZ0JvdW5kcz4ge1xuICAgIGNvbnN0IGZpbHRlciA9IChjb29yZDogJ2xhdCcgfCAnbG5nJywgb3JkZXI6ICdhc2MnIHwgJ2Rlc2MnKSA9PiAoe1xuICAgICAgcGFnZVNpemU6IDEsXG4gICAgICBxOiBgJGZpbHRlcj1oYXMoYzh5X1Bvc2l0aW9uKSAkb3JkZXJieT1jOHlfUG9zaXRpb24uJHtjb29yZH0gJHtvcmRlcn1gXG4gICAgfSk7XG5cbiAgICBjb25zdCBmaWx0ZXJSZXZlcnNlID0gKG9wOiAnbHQnIHwgJ2d0Jywgb3JkZXI6ICdhc2MnIHwgJ2Rlc2MnKSA9PiAoe1xuICAgICAgcGFnZVNpemU6IDEsXG4gICAgICBxOiBgJGZpbHRlcj1oYXMoYzh5X1Bvc2l0aW9uKSBhbmQgYzh5X1Bvc2l0aW9uLmxuZyAke29wfSAwZCAkb3JkZXJieT1jOHlfUG9zaXRpb24ubG5nICR7b3JkZXJ9YFxuICAgIH0pO1xuXG4gICAgY29uc3QgW2xhdE1pbiwgbGF0TWF4LCBsbmdNaW4sIGxuZ01heCwgbG5nUmV2TWluLCBsbmdSZXZNYXhdID0gYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgdGhpcy5pbnZlbnRvcnkubGlzdChmaWx0ZXIoJ2xhdCcsICdhc2MnKSksXG4gICAgICB0aGlzLmludmVudG9yeS5saXN0KGZpbHRlcignbGF0JywgJ2Rlc2MnKSksXG4gICAgICB0aGlzLmludmVudG9yeS5saXN0KGZpbHRlcignbG5nJywgJ2FzYycpKSxcbiAgICAgIHRoaXMuaW52ZW50b3J5Lmxpc3QoZmlsdGVyKCdsbmcnLCAnZGVzYycpKSxcbiAgICAgIHRoaXMuaW52ZW50b3J5Lmxpc3QoZmlsdGVyUmV2ZXJzZSgnZ3QnLCAnYXNjJykpLFxuICAgICAgdGhpcy5pbnZlbnRvcnkubGlzdChmaWx0ZXJSZXZlcnNlKCdsdCcsICdkZXNjJykpXG4gICAgXSkudGhlbihyZXN1bHQgPT4gcmVzdWx0Lm1hcChyID0+IGdldChyLmRhdGEsICdbMF0uYzh5X1Bvc2l0aW9uJykpKTtcblxuICAgIGNvbnN0IHNoaWZ0V29ybGQgPSAobG5nUmV2TWluPy5sbmcgPz8gMCkgLSAobG5nUmV2TWF4Py5sbmcgPz8gMCkgPiAxODA7XG5cbiAgICByZXR1cm4gbGF0TG5nQm91bmRzKFxuICAgICAgbGF0TG5nKGxhdE1pbj8ubGF0LCBzaGlmdFdvcmxkID8gbG5nUmV2TWluPy5sbmcgOiBsbmdNaW4/LmxuZyksXG4gICAgICBsYXRMbmcobGF0TWF4Py5sYXQsIHNoaWZ0V29ybGQgPyBsbmdSZXZNYXg/LmxuZyArIDM2MCA6IGxuZ01heD8ubG5nKVxuICAgICk7XG4gIH1cblxuICBhc3luYyBnZXRBc3NldHNCb3VuZHMoYXNzZXRzOiBQb3NpdGlvbk1hbmFnZWRPYmplY3RbXSk6IFByb21pc2U8TC5MYXRMbmdCb3VuZHMgfCB1bmRlZmluZWQ+IHtcbiAgICBjb25zdCBsZWFmbGV0ID0gYXdhaXQgdGhpcy5nZXRMZWFmbGV0KCk7XG4gICAgY29uc3QgYm91bmRzID0gbGVhZmxldC5sYXRMbmdCb3VuZHMoW10pO1xuICAgIGxldCBoYXNWYWxpZFBvc2l0aW9ucyA9IGZhbHNlO1xuICAgIGFzc2V0cy5mb3JFYWNoKGFzc2V0ID0+IHtcbiAgICAgIGNvbnN0IHBvc2l0aW9uID0gYXNzZXQuYzh5X1Bvc2l0aW9uO1xuICAgICAgaWYgKHBvc2l0aW9uICYmIHR5cGVvZiBwb3NpdGlvbi5sYXQgPT09ICdudW1iZXInICYmIHR5cGVvZiBwb3NpdGlvbi5sbmcgPT09ICdudW1iZXInKSB7XG4gICAgICAgIGJvdW5kcy5leHRlbmQoW3Bvc2l0aW9uLmxhdCwgcG9zaXRpb24ubG5nXSk7XG4gICAgICAgIGhhc1ZhbGlkUG9zaXRpb25zID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBpZiAoIWhhc1ZhbGlkUG9zaXRpb25zIHx8ICFib3VuZHMuaXNWYWxpZCgpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHJldHVybiBib3VuZHM7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgY2x1c3RlciBzaXplIGZvciBjbHVzdGVyZWQgbWFwcy4gQ291bnRpbmcgdGhlIHBvc2l0aW9uIE1PcyBpbiBhIGJvdW5kaW5nXG4gICAqIGFuZCBpZiBpdCByZWFjaCBhIHRocmVzaG9sZCwgcmV0dXJuaW5nIGEgW1tDbHVzdGVyU2l6ZV1dLlxuICAgKiBAcGFyYW0gYm91bmQgVGhlIGJvdW5kaW5nIHRvIGNoZWNrIGZvciBjbHVzdGVyIHNpemUuXG4gICAqIEByZXR1cm5zIFRoZSBjbHVzdGVyIHNpemUsIGNhbiBiZSBOT05FLCBGT1VSIG9yIFNJWFRFRU4uXG4gICAqL1xuICBhc3luYyBnZXRDbHVzdGVyU2l6ZShib3VuZDogTC5MYXRMbmdCb3VuZHMpIHtcbiAgICBjb25zdCBjb3VudCA9IGF3YWl0IHRoaXMuZ2V0UG9zaXRpb25NT3NGcm9tQm91bmRDb3VudChib3VuZCk7XG4gICAgbGV0IGNsdXN0ZXJTaXplID0gQ2x1c3RlclNpemUuTk9ORTtcbiAgICBpZiAoY291bnQgPiB0aGlzLkNMVVNURVJfTEVWRUxfVEhSRVNIT0xEKSB7XG4gICAgICBjbHVzdGVyU2l6ZSA9IENsdXN0ZXJTaXplLlNJWFRFRU47XG4gICAgfSBlbHNlIGlmIChjb3VudCA+IHRoaXMuTUFYX0RFVklDRV9QRVJfQ0xVU1RFUikge1xuICAgICAgY2x1c3RlclNpemUgPSBDbHVzdGVyU2l6ZS5GT1VSO1xuICAgIH1cbiAgICByZXR1cm4gY2x1c3RlclNpemU7XG4gIH1cblxuICBwcml2YXRlIGdldE1hcE9wdGlvbjxUPihrZXk6IE1hcFRlbmFudE9wdGlvbktleXMsIGRlZmF1bHRWYWx1ZTogVCkge1xuICAgIHJldHVybiBkZWZlcigoKSA9PlxuICAgICAgdGhpcy5vcHRpb25zLmdldFRlbmFudE9wdGlvbjxUIHwgc3RyaW5nPignY29uZmlndXJhdGlvbicsIGtleSwgZGVmYXVsdFZhbHVlKVxuICAgICkucGlwZShcbiAgICAgIG1hcChjb25maWcgPT4ge1xuICAgICAgICBpZiAodHlwZW9mIGNvbmZpZyA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgYFRoZSB0ZW5hbnQgb3B0aW9uIGZvciBtYXBzICdjb25maWd1cmF0aW9uLiR7a2V5fScgaXMgbm90IGEgdmFsaWQgSlNPTiBzdHJ1Y3R1cmUuYFxuICAgICAgICAgICk7XG4gICAgICAgICAgcmV0dXJuIGRlZmF1bHRWYWx1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY29uZmlnO1xuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFNoaWZ0cyBsb25naXR1ZGVzIHJlY2VpdmVkIGZyb20gTGVhZmxldC5qcyBpbiB0aGUgWy0xODAgLSBrKjM2MDsgMTgwICsgayozNjBdIHJhbmdld2hlblxuICAgKiBgbm9XcmFwYCBpcyBlbmFibGVkIHRvIHRoZSBbLTE4MDsgMTgwXSByYW5nZSBleHBlY3RlZCBmb3IgdmFsdWVzIG9mIHRoZSBjOHlfUG9zaXRpb24gZnJhZ21lbnQuXG4gICAqXG4gICAqIEBwYXJhbSBsbmcgTG9uZ2l0dWRlIHRvIHNoaWZ0LlxuICAgKiBAcmV0dXJucyAgTG9uZ2l0dWRlIHZhbHVlIGluIHRoZSBbLTE4MDsgMTgwXSByYW5nZVxuICAgKi9cbiAgcHJpdmF0ZSBub3JtYWxpemVMb25naXR1ZGUobG5nOiBudW1iZXIpOiBudW1iZXIge1xuICAgIHJldHVybiAoKCgobG5nICsgMTgwKSAlIDM2MCkgKyAzNjApICUgMzYwKSAtIDE4MDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTaGlmdHMgbG9uZ2l0dWRlcyBpbiB0aGUgWy0xODA7IDE4MF0gcmFuZ2UgZXhwZWN0ZWQgZm9yIHZhbHVlcyBvZiB0aGUgYzh5X1Bvc2l0aW9uIGZyYWdtZW50XG4gICAqIHRoZSB0aGUgWy0xODAgLSBrKjM2MDsgMTgwICsgayozNjBdIHJhbmdlIGV4cGVjdGVkIGZyb20gTGVhZmxldC5qcyB3aGVuIGBub1dyYXBgIGlzIGVuYWJsZWQuXG4gICAqXG4gICAqIFRoZSBtZXRob2QgbmFpdmVseSBhZGRzL3N1YnRyYWN0cyAzNjAgZGVncmVlcyB0byB0aGUgb3JpZ2luYWwgdmFsdWUgdW50aWwgdGhlIHBvc2l0aW9uIGZpdHMgaW4gdGhlIGV4cGVjdGVkIGJvdW5kcy5cbiAgICpcbiAgICogQHBhcmFtIHBtbyBBIG1hbmFnZWQgb2JqZWN0IHdpdGggYSBgYzh5X1Bvc2l0aW9uYCBmcmFnbWVudFxuICAgKiBAcGFyYW0gYm91bmRzIFRoZSBib3VuZHMgd2hlcmUgdGhlIHBvc2l0aW9uIHNob3VsZCBmaXRcbiAgICogQHJldHVybnMgQSBtYW5hZ2VkIG9iamVjdCB3aG9zZSBgYzh5X1Bvc2l0aW9uYCdzIGBsbmdgIHZhbHVlcyBoYXMgYmVlbiBzaGlmdGVkIHRvIGZpdCBpbiBib3VuZHNcbiAgICovXG4gIHByaXZhdGUgZGVub3JtYWxpemVQTU8oXG4gICAgcG1vOiBQb3NpdGlvbk1hbmFnZWRPYmplY3QsXG4gICAgYm91bmRzOiBMLkxhdExuZ0JvdW5kc1xuICApOiBQb3NpdGlvbk1hbmFnZWRPYmplY3Qge1xuICAgIGxldCB7IGxuZyB9ID0gcG1vLmM4eV9Qb3NpdGlvbjtcbiAgICBjb25zdCBzaGlmdEZhY3RvciA9IGxuZyA+IGJvdW5kcy5nZXRFYXN0KCkgPyAtMSA6IDE7XG5cbiAgICB3aGlsZSAoIWJvdW5kcy5jb250YWlucyhsYXRMbmcocG1vLmM4eV9Qb3NpdGlvbi5sYXQsIGxuZykpKSB7XG4gICAgICBsbmcgKz0gc2hpZnRGYWN0b3IgKiAzNjA7XG4gICAgfVxuXG4gICAgcG1vLmM4eV9Qb3NpdGlvbi5sbmcgPSBsbmc7XG4gICAgcmV0dXJuIHBtbztcbiAgfVxufVxuIl19
@@ -185,6 +185,7 @@ export class DatapointsGraphWidgetConfigComponent {
185
185
  displayMarkedLine: [true, []],
186
186
  displayMarkedPoint: [true, []],
187
187
  mergeMatchingDatapoints: [true, []],
188
+ forceMergeDatapoints: [false, []],
188
189
  showLabelAndUnit: [true, []],
189
190
  displayDateSelection: [false, []],
190
191
  displayAggregationSelection: [false, []],
@@ -214,7 +215,7 @@ export class DatapointsGraphWidgetConfigComponent {
214
215
  (this.config?.datapoints?.filter(dp => dp.__active)?.length || 0) > 0;
215
216
  }
216
217
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DatapointsGraphWidgetConfigComponent, deps: [{ token: i1.WidgetConfigComponent, optional: true }, { token: i1.ContextDashboardComponent, optional: true }], target: i0.ɵɵFactoryTarget.Component }); }
217
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: DatapointsGraphWidgetConfigComponent, isStandalone: true, selector: "c8y-datapoints-graph-widget-config", inputs: { config: "config" }, host: { classAttribute: "d-contents" }, providers: [ChartEventsService, ChartAlarmsService], ngImport: i0, template: "<div class=\"no-card-context d-flex-md fit-h--md\">\n <div class=\"col-md-5 bg-level-1 conf-col inner-scroll p-l-0\">\n <div class=\"p-l-24\">\n <form [formGroup]=\"formGroup\">\n <c8y-datapoint-selection-list\n class=\"bg-level-1 separator-bottom d-block\"\n name=\"datapoints\"\n [minActiveCount]=\"1\"\n [defaultFormOptions]=\"datapointSelectDefaultFormOptions\"\n [config]=\"datapointSelectionConfig\"\n formControlName=\"datapoints\"\n ></c8y-datapoint-selection-list>\n\n <c8y-alarm-event-selection-list\n class=\"bg-level-1 separator-bottom d-block\"\n name=\"alarms\"\n formControlName=\"alarms\"\n [timelineType]=\"'ALARM'\"\n [datapoints]=\"config?.datapoints\"\n ></c8y-alarm-event-selection-list>\n\n <c8y-alarm-event-selection-list\n class=\"bg-inherit\"\n name=\"events\"\n formControlName=\"events\"\n [timelineType]=\"'EVENT'\"\n [datapoints]=\"config?.datapoints\"\n ></c8y-alarm-event-selection-list>\n </form>\n </div>\n </div>\n\n <div class=\"col-md-7 sticky-top p-t-8 inner-scroll widget-preview\">\n <div class=\"p-r-24 d-col fit-h\">\n <div class=\"form-group p-t-8 form-group-sm d-flex a-i-center m-b-8\">\n <div class=\"d-flex a-i-center m-r-4\">\n <label\n class=\"m-b-0\"\n translate\n >\n Date selection\n </label>\n <button\n class=\"btn-help btn-help--sm\"\n [attr.aria-label]=\"'Help' | translate\"\n [popover]=\"dateSelectionHelpTemplate\"\n placement=\"bottom\"\n triggers=\"focus\"\n container=\"body\"\n [adaptivePosition]=\"false\"\n ></button>\n </div>\n <div class=\"c8y-select-wrapper\">\n <select\n class=\"form-control input-sm\"\n [ngModel]=\"dateSelection\"\n (ngModelChange)=\"dateSelectionChange($event)\"\n [ngModelOptions]=\"{ standalone: true }\"\n >\n <option\n title=\"{{ 'Dashboard time range' | translate }}\"\n [value]=\"DATE_SELECTION.DASHBOARD_CONTEXT\"\n >\n {{ 'Dashboard time range' | translate }}\n </option>\n <option\n title=\"{{ 'Widget configuration' | translate }}\"\n [value]=\"DATE_SELECTION.CONFIG\"\n >\n {{ 'Widget configuration' | translate }}\n </option>\n </select>\n <span></span>\n </div>\n </div>\n <label class=\"text-12\">{{ 'Options' | translate }}</label>\n <c8y-time-context\n *ngIf=\"\n dateSelection === DATE_SELECTION.CONFIG &&\n formGroup.get('displayDateSelection').value === true\n \"\n [changedDateContext]=\"timeProps\"\n [controlsAvailable]=\"{\n realtime: true,\n timeRange: config?.displayDateSelection,\n interval: config?.displayDateSelection,\n aggregation: config?.displayAggregationSelection\n }\"\n (contextChange)=\"timePropsChanged($event)\"\n ></c8y-time-context>\n <c8y-charts\n class=\"d-block p-relative\"\n *ngIf=\"activeDatapointsExists\"\n [config]=\"config\"\n [alerts]=\"alerts\"\n (timeRangeChangeOnRealtime)=\"updateTimeRangeOnRealtime($event)\"\n (configChangeOnZoomOut)=\"updateDashboardTimeContext($event)\"\n ></c8y-charts>\n\n <c8y-ui-empty-state\n class=\"d-block m-t-24\"\n [icon]=\"'search'\"\n [title]=\"'No data points selected' | translate\"\n [subtitle]=\"'Select data point to render chart' | translate\"\n *ngIf=\"!activeDatapointsExists\"\n ></c8y-ui-empty-state>\n\n <form\n class=\"d-block p-t-8\"\n [formGroup]=\"formGroup\"\n >\n <label>{{ 'Display options' | translate }}</label>\n <fieldset class=\"c8y-fieldset m-b-24 m-t-0\">\n <legend>{{ 'Axis' | translate }}</legend>\n <c8y-form-group class=\"p-b-16 m-b-0 p-t-8 form-group-sm\">\n <label\n class=\"c8y-checkbox\"\n [title]=\"'Y-axis helper lines' | translate\"\n >\n <input\n name=\"yAxisSplitLines\"\n type=\"checkbox\"\n formControlName=\"yAxisSplitLines\"\n />\n <span></span>\n <span translate>Y-axis helper lines</span>\n </label>\n <label\n class=\"c8y-checkbox\"\n [title]=\"'X-axis helper lines' | translate\"\n >\n <input\n name=\"xAxisSplitLines\"\n type=\"checkbox\"\n formControlName=\"xAxisSplitLines\"\n />\n <span></span>\n <span translate>X-axis helper lines</span>\n </label>\n <label\n class=\"c8y-checkbox\"\n [title]=\"'Merge matching data points into single axis' | translate\"\n >\n <input\n name=\"mergeMatchingDatapoints\"\n type=\"checkbox\"\n formControlName=\"mergeMatchingDatapoints\"\n />\n <span></span>\n <span translate>Merge matching data points into single axis</span>\n </label>\n </c8y-form-group>\n </fieldset>\n <fieldset class=\"c8y-fieldset m-b-24 m-t-0\">\n <legend>{{ 'Alarms & events' | translate }}</legend>\n <c8y-form-group class=\"p-b-16 m-b-0 p-t-8 form-group-sm\">\n <label\n class=\"c8y-checkbox\"\n [title]=\"'Show vertical line on every occurrence' | translate\"\n >\n <input\n name=\"displayMarkedLine\"\n type=\"checkbox\"\n formControlName=\"displayMarkedLine\"\n />\n <span></span>\n <span translate>Show vertical line on every occurrence</span>\n </label>\n <label\n class=\"c8y-checkbox\"\n [title]=\"'Show icon when triggered' | translate\"\n >\n <input\n name=\"displayMarkedPoint\"\n type=\"checkbox\"\n formControlName=\"displayMarkedPoint\"\n />\n <span></span>\n <span translate>Show icon when triggered</span>\n <button\n class=\"btn-clean m-l-8\"\n [attr.aria-label]=\"\n 'Some alarms or events have no matching data points. No icons will be shown for them.'\n | translate\n \"\n [tooltip]=\"\n 'Some alarms or events have no matching data points. No icons will be shown for them.'\n | translate\n \"\n container=\"body\"\n type=\"button\"\n *ngIf=\"alarmsOrEventsHaveNoMatchingDps\"\n (click)=\"$event.stopPropagation()\"\n [adaptivePosition]=\"false\"\n >\n <i\n class=\"text-warning\"\n c8yIcon=\"exclamation-triangle\"\n ></i>\n </button>\n </label>\n </c8y-form-group>\n </fieldset>\n <fieldset class=\"c8y-fieldset m-b-24 m-t-0\">\n <legend>{{ 'Chart' | translate }}</legend>\n <c8y-form-group class=\"p-b-16 m-b-0 p-t-8 form-group-sm\">\n <label\n class=\"c8y-checkbox\"\n [title]=\"'Enable date selection in the widget view.' | translate\"\n >\n <input\n name=\"displayDateSelection\"\n type=\"checkbox\"\n formControlName=\"displayDateSelection\"\n />\n <span></span>\n <span translate>Date selection in the widget view.</span>\n <button\n class=\"btn-clean m-l-8\"\n [attr.aria-label]=\"\n 'Date selection in widget view is not possible when using dashboard time range.'\n | translate\n \"\n [tooltip]=\"\n 'Date selection in widget view is not possible when using dashboard time range.'\n | translate\n \"\n container=\"body\"\n type=\"button\"\n *ngIf=\"dateSelection === DATE_SELECTION.DASHBOARD_CONTEXT\"\n (click)=\"$event.stopPropagation()\"\n [adaptivePosition]=\"false\"\n >\n <i\n class=\"text-info\"\n c8yIcon=\"info\"\n ></i>\n </button>\n </label>\n <label\n class=\"c8y-checkbox\"\n [title]=\"'Aggregation selection' | translate\"\n >\n <input\n name=\"displayAggregationSelection\"\n type=\"checkbox\"\n formControlName=\"displayAggregationSelection\"\n />\n <span></span>\n <span translate>Aggregation selection</span>\n </label>\n <label\n class=\"c8y-checkbox\"\n [title]=\"'Show labels and units' | translate\"\n >\n <input\n name=\"showLabelAndUnit\"\n type=\"checkbox\"\n formControlName=\"showLabelAndUnit\"\n />\n <span></span>\n <span translate>Display labels and units on Y-axis</span>\n </label>\n <label\n class=\"c8y-checkbox\"\n [title]=\"'Show slider' | translate\"\n >\n <input\n name=\"showSlider\"\n type=\"checkbox\"\n formControlName=\"showSlider\"\n />\n <span></span>\n <span translate>Show slider</span>\n </label>\n </c8y-form-group>\n </fieldset>\n </form>\n </div>\n </div>\n</div>\n<ng-template #dateSelectionHelpTemplate>\n <div [innerHTML]=\"dateSelectionHelp\"></div>\n</ng-template>\n", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: i2.EmptyStateComponent, selector: "c8y-ui-empty-state", inputs: ["icon", "title", "subtitle", "horizontal"] }, { kind: "directive", type: i2.IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "pipe", type: i2.C8yTranslatePipe, name: "translate" }, { kind: "directive", type: i2.C8yTranslateDirective, selector: "[translate],[ngx-translate]" }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: CoreModule }, { kind: "directive", type: i4.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i4.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i4.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i4.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i4.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i4.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i4.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i2.FormGroupComponent, selector: "c8y-form-group", inputs: ["hasError", "hasWarning", "hasSuccess", "novalidation", "status"] }, { kind: "directive", type: i2.RequiredInputPlaceholderDirective, selector: "input[required], input[formControlName]" }, { kind: "directive", type: i4.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i4.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "ngmodule", type: FormsModule }, { kind: "ngmodule", type: TooltipModule }, { kind: "directive", type: i5.TooltipDirective, selector: "[tooltip], [tooltipHtml]", inputs: ["adaptivePosition", "tooltip", "placement", "triggers", "container", "containerClass", "boundariesElement", "isOpen", "isDisabled", "delay", "tooltipHtml", "tooltipPlacement", "tooltipIsOpen", "tooltipEnable", "tooltipAppendToBody", "tooltipAnimation", "tooltipClass", "tooltipContext", "tooltipPopupDelay", "tooltipFadeDuration", "tooltipTrigger"], outputs: ["tooltipChange", "onShown", "onHidden", "tooltipStateChanged"], exportAs: ["bs-tooltip"] }, { kind: "ngmodule", type: PopoverModule }, { kind: "directive", type: i6.PopoverDirective, selector: "[popover]", inputs: ["adaptivePosition", "boundariesElement", "popover", "popoverContext", "popoverTitle", "placement", "outsideClick", "triggers", "container", "containerClass", "isOpen", "delay"], outputs: ["onShown", "onHidden"], exportAs: ["bs-popover"] }, { kind: "component", type: ChartsComponent, selector: "c8y-charts", inputs: ["config", "alerts"], outputs: ["configChangeOnZoomOut", "timeRangeChangeOnRealtime", "datapointOutOfSync", "updateAlarmsAndEvents", "isMarkedAreaEnabled"] }, { kind: "ngmodule", type: DatapointSelectorModule }, { kind: "component", type: i7.DatapointSelectionListComponent, selector: "c8y-datapoint-selection-list", inputs: ["actions", "allowDragAndDrop", "config", "defaultFormOptions", "maxActiveCount", "minActiveCount", "resolveContext", "listTitle"], outputs: ["isValid", "change"] }, { kind: "ngmodule", type: AlarmEventSelectorModule }, { kind: "component", type: i8.AlarmEventSelectionListComponent, selector: "c8y-alarm-event-selection-list", inputs: ["timelineType", "canRemove", "canEdit", "canDragAndDrop", "title", "addButtonLabel", "hideSource", "inline", "activeToggleAsSwitch", "omitProperties", "datapoints", "config"] }, { kind: "component", type: TimeContextComponent, selector: "c8y-time-context", inputs: ["changedDateContext", "controlsAvailable", "context"], outputs: ["contextChange"] }] }); }
218
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: DatapointsGraphWidgetConfigComponent, isStandalone: true, selector: "c8y-datapoints-graph-widget-config", inputs: { config: "config" }, host: { classAttribute: "d-contents" }, providers: [ChartEventsService, ChartAlarmsService], ngImport: i0, template: "<div class=\"no-card-context d-flex-md fit-h--md\">\n <div class=\"col-md-5 bg-level-1 conf-col inner-scroll p-l-0\">\n <div class=\"p-l-24\">\n <form [formGroup]=\"formGroup\">\n <c8y-datapoint-selection-list\n class=\"bg-level-1 separator-bottom d-block\"\n name=\"datapoints\"\n [minActiveCount]=\"1\"\n [defaultFormOptions]=\"datapointSelectDefaultFormOptions\"\n [config]=\"datapointSelectionConfig\"\n formControlName=\"datapoints\"\n ></c8y-datapoint-selection-list>\n\n <c8y-alarm-event-selection-list\n class=\"bg-level-1 separator-bottom d-block\"\n name=\"alarms\"\n formControlName=\"alarms\"\n [timelineType]=\"'ALARM'\"\n [datapoints]=\"config?.datapoints\"\n ></c8y-alarm-event-selection-list>\n\n <c8y-alarm-event-selection-list\n class=\"bg-inherit\"\n name=\"events\"\n formControlName=\"events\"\n [timelineType]=\"'EVENT'\"\n [datapoints]=\"config?.datapoints\"\n ></c8y-alarm-event-selection-list>\n </form>\n </div>\n </div>\n\n <div class=\"col-md-7 sticky-top p-t-8 inner-scroll widget-preview\">\n <div class=\"p-r-24 d-col fit-h\">\n <div class=\"form-group p-t-8 form-group-sm d-flex a-i-center m-b-8\">\n <div class=\"d-flex a-i-center m-r-4\">\n <label\n class=\"m-b-0\"\n translate\n >\n Date selection\n </label>\n <button\n class=\"btn-help btn-help--sm\"\n [attr.aria-label]=\"'Help' | translate\"\n [popover]=\"dateSelectionHelpTemplate\"\n placement=\"bottom\"\n triggers=\"focus\"\n container=\"body\"\n [adaptivePosition]=\"false\"\n ></button>\n </div>\n <div class=\"c8y-select-wrapper\">\n <select\n class=\"form-control input-sm\"\n [ngModel]=\"dateSelection\"\n (ngModelChange)=\"dateSelectionChange($event)\"\n [ngModelOptions]=\"{ standalone: true }\"\n >\n <option\n title=\"{{ 'Dashboard time range' | translate }}\"\n [value]=\"DATE_SELECTION.DASHBOARD_CONTEXT\"\n >\n {{ 'Dashboard time range' | translate }}\n </option>\n <option\n title=\"{{ 'Widget configuration' | translate }}\"\n [value]=\"DATE_SELECTION.CONFIG\"\n >\n {{ 'Widget configuration' | translate }}\n </option>\n </select>\n <span></span>\n </div>\n </div>\n <label class=\"text-12\">{{ 'Options' | translate }}</label>\n <c8y-time-context\n *ngIf=\"\n dateSelection === DATE_SELECTION.CONFIG &&\n formGroup.get('displayDateSelection').value === true\n \"\n [changedDateContext]=\"timeProps\"\n [controlsAvailable]=\"{\n realtime: true,\n timeRange: config?.displayDateSelection,\n interval: config?.displayDateSelection,\n aggregation: config?.displayAggregationSelection\n }\"\n (contextChange)=\"timePropsChanged($event)\"\n ></c8y-time-context>\n <c8y-charts\n class=\"d-block p-relative\"\n *ngIf=\"activeDatapointsExists\"\n [config]=\"config\"\n [alerts]=\"alerts\"\n (timeRangeChangeOnRealtime)=\"updateTimeRangeOnRealtime($event)\"\n (configChangeOnZoomOut)=\"updateDashboardTimeContext($event)\"\n ></c8y-charts>\n\n <c8y-ui-empty-state\n class=\"d-block m-t-24\"\n [icon]=\"'search'\"\n [title]=\"'No data points selected' | translate\"\n [subtitle]=\"'Select data point to render chart' | translate\"\n *ngIf=\"!activeDatapointsExists\"\n ></c8y-ui-empty-state>\n\n <form\n class=\"d-block p-t-8\"\n [formGroup]=\"formGroup\"\n >\n <label>{{ 'Display options' | translate }}</label>\n <fieldset class=\"c8y-fieldset m-b-24 m-t-0\">\n <legend>{{ 'Axis' | translate }}</legend>\n <c8y-form-group class=\"p-b-16 m-b-0 p-t-8 form-group-sm\">\n <label\n class=\"c8y-checkbox\"\n [title]=\"'Y-axis helper lines' | translate\"\n >\n <input\n name=\"yAxisSplitLines\"\n type=\"checkbox\"\n formControlName=\"yAxisSplitLines\"\n />\n <span></span>\n <span translate>Y-axis helper lines</span>\n </label>\n <label\n class=\"c8y-checkbox\"\n [title]=\"'X-axis helper lines' | translate\"\n >\n <input\n name=\"xAxisSplitLines\"\n type=\"checkbox\"\n formControlName=\"xAxisSplitLines\"\n />\n <span></span>\n <span translate>X-axis helper lines</span>\n </label>\n <label\n class=\"c8y-checkbox\"\n [title]=\"'Merge matching data points into single axis' | translate\"\n >\n <input\n name=\"mergeMatchingDatapoints\"\n type=\"checkbox\"\n formControlName=\"mergeMatchingDatapoints\"\n />\n <span></span>\n <span translate>Merge matching data points into single axis</span>\n <button\n class=\"btn-dot m-l-8\"\n [attr.aria-label]=\"\n 'Data points with the same min and max values will be merged into a single axis. The values must be defined in the data point configuration.'\n | translate\n \"\n [tooltip]=\"\n 'Data points with the same min and max values will be merged into a single axis. The values must be defined in the data point configuration.'\n | translate\n \"\n container=\"body\"\n type=\"button\"\n (click)=\"$event.stopPropagation()\"\n [adaptivePosition]=\"false\"\n >\n <i\n class=\"text-info\"\n c8yIcon=\"info\"\n ></i>\n </button>\n </label>\n <label\n class=\"c8y-checkbox\"\n [title]=\"'Force merge all data points into single axis' | translate\"\n >\n <input\n name=\"forceMergeDatapoints\"\n type=\"checkbox\"\n formControlName=\"forceMergeDatapoints\"\n />\n <span></span>\n <span translate>Force merge all datapoints into a single axis</span>\n <button\n class=\"btn-dot m-l-8\"\n [attr.aria-label]=\"\n 'All axes will be force merged to a single axis with the scale being set to the max and min value of all axes. It\\'s recommended to use this option for data points with similar values.'\n | translate\n \"\n [tooltip]=\"\n 'All axes will be force merged to a single axis with the scale being set to the max and min value of all axes. It\\'s recommended to use this option for data points with similar values.'\n | translate\n \"\n container=\"body\"\n type=\"button\"\n (click)=\"$event.stopPropagation()\"\n [adaptivePosition]=\"false\"\n >\n <i\n class=\"text-info\"\n c8yIcon=\"info\"\n ></i>\n </button>\n </label>\n </c8y-form-group>\n </fieldset>\n <fieldset class=\"c8y-fieldset m-b-24 m-t-0\">\n <legend>{{ 'Alarms & events' | translate }}</legend>\n <c8y-form-group class=\"p-b-16 m-b-0 p-t-8 form-group-sm\">\n <label\n class=\"c8y-checkbox\"\n [title]=\"'Show vertical line on every occurrence' | translate\"\n >\n <input\n name=\"displayMarkedLine\"\n type=\"checkbox\"\n formControlName=\"displayMarkedLine\"\n />\n <span></span>\n <span translate>Show vertical line on every occurrence</span>\n </label>\n <label\n class=\"c8y-checkbox\"\n [title]=\"'Show icon when triggered' | translate\"\n >\n <input\n name=\"displayMarkedPoint\"\n type=\"checkbox\"\n formControlName=\"displayMarkedPoint\"\n />\n <span></span>\n <span translate>Show icon when triggered</span>\n <button\n class=\"btn-clean m-l-8\"\n [attr.aria-label]=\"\n 'Some alarms or events have no matching data points. No icons will be shown for them.'\n | translate\n \"\n [tooltip]=\"\n 'Some alarms or events have no matching data points. No icons will be shown for them.'\n | translate\n \"\n container=\"body\"\n type=\"button\"\n *ngIf=\"alarmsOrEventsHaveNoMatchingDps\"\n (click)=\"$event.stopPropagation()\"\n [adaptivePosition]=\"false\"\n >\n <i\n class=\"text-warning\"\n c8yIcon=\"exclamation-triangle\"\n ></i>\n </button>\n </label>\n </c8y-form-group>\n </fieldset>\n <fieldset class=\"c8y-fieldset m-b-24 m-t-0\">\n <legend>{{ 'Chart' | translate }}</legend>\n <c8y-form-group class=\"p-b-16 m-b-0 p-t-8 form-group-sm\">\n <label\n class=\"c8y-checkbox\"\n [title]=\"'Enable date selection in the widget view.' | translate\"\n >\n <input\n name=\"displayDateSelection\"\n type=\"checkbox\"\n formControlName=\"displayDateSelection\"\n />\n <span></span>\n <span translate>Date selection in the widget view.</span>\n <button\n class=\"btn-clean m-l-8\"\n [attr.aria-label]=\"\n 'Date selection in widget view is not possible when using dashboard time range.'\n | translate\n \"\n [tooltip]=\"\n 'Date selection in widget view is not possible when using dashboard time range.'\n | translate\n \"\n container=\"body\"\n type=\"button\"\n *ngIf=\"dateSelection === DATE_SELECTION.DASHBOARD_CONTEXT\"\n (click)=\"$event.stopPropagation()\"\n [adaptivePosition]=\"false\"\n >\n <i\n class=\"text-info\"\n c8yIcon=\"info\"\n ></i>\n </button>\n </label>\n <label\n class=\"c8y-checkbox\"\n [title]=\"'Aggregation selection' | translate\"\n >\n <input\n name=\"displayAggregationSelection\"\n type=\"checkbox\"\n formControlName=\"displayAggregationSelection\"\n />\n <span></span>\n <span translate>Aggregation selection</span>\n </label>\n <label\n class=\"c8y-checkbox\"\n [title]=\"'Show labels and units' | translate\"\n >\n <input\n name=\"showLabelAndUnit\"\n type=\"checkbox\"\n formControlName=\"showLabelAndUnit\"\n />\n <span></span>\n <span translate>Display labels and units on Y-axis</span>\n </label>\n <label\n class=\"c8y-checkbox\"\n [title]=\"'Show slider' | translate\"\n >\n <input\n name=\"showSlider\"\n type=\"checkbox\"\n formControlName=\"showSlider\"\n />\n <span></span>\n <span translate>Show slider</span>\n </label>\n </c8y-form-group>\n </fieldset>\n </form>\n </div>\n </div>\n</div>\n<ng-template #dateSelectionHelpTemplate>\n <div [innerHTML]=\"dateSelectionHelp\"></div>\n</ng-template>\n", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: i2.EmptyStateComponent, selector: "c8y-ui-empty-state", inputs: ["icon", "title", "subtitle", "horizontal"] }, { kind: "directive", type: i2.IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "pipe", type: i2.C8yTranslatePipe, name: "translate" }, { kind: "directive", type: i2.C8yTranslateDirective, selector: "[translate],[ngx-translate]" }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: CoreModule }, { kind: "directive", type: i4.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i4.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i4.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i4.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i4.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i4.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i4.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i2.FormGroupComponent, selector: "c8y-form-group", inputs: ["hasError", "hasWarning", "hasSuccess", "novalidation", "status"] }, { kind: "directive", type: i2.RequiredInputPlaceholderDirective, selector: "input[required], input[formControlName]" }, { kind: "directive", type: i4.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i4.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "ngmodule", type: FormsModule }, { kind: "ngmodule", type: TooltipModule }, { kind: "directive", type: i5.TooltipDirective, selector: "[tooltip], [tooltipHtml]", inputs: ["adaptivePosition", "tooltip", "placement", "triggers", "container", "containerClass", "boundariesElement", "isOpen", "isDisabled", "delay", "tooltipHtml", "tooltipPlacement", "tooltipIsOpen", "tooltipEnable", "tooltipAppendToBody", "tooltipAnimation", "tooltipClass", "tooltipContext", "tooltipPopupDelay", "tooltipFadeDuration", "tooltipTrigger"], outputs: ["tooltipChange", "onShown", "onHidden", "tooltipStateChanged"], exportAs: ["bs-tooltip"] }, { kind: "ngmodule", type: PopoverModule }, { kind: "directive", type: i6.PopoverDirective, selector: "[popover]", inputs: ["adaptivePosition", "boundariesElement", "popover", "popoverContext", "popoverTitle", "placement", "outsideClick", "triggers", "container", "containerClass", "isOpen", "delay"], outputs: ["onShown", "onHidden"], exportAs: ["bs-popover"] }, { kind: "component", type: ChartsComponent, selector: "c8y-charts", inputs: ["config", "alerts"], outputs: ["configChangeOnZoomOut", "timeRangeChangeOnRealtime", "datapointOutOfSync", "updateAlarmsAndEvents", "isMarkedAreaEnabled"] }, { kind: "ngmodule", type: DatapointSelectorModule }, { kind: "component", type: i7.DatapointSelectionListComponent, selector: "c8y-datapoint-selection-list", inputs: ["actions", "allowDragAndDrop", "config", "defaultFormOptions", "maxActiveCount", "minActiveCount", "resolveContext", "listTitle"], outputs: ["isValid", "change"] }, { kind: "ngmodule", type: AlarmEventSelectorModule }, { kind: "component", type: i8.AlarmEventSelectionListComponent, selector: "c8y-alarm-event-selection-list", inputs: ["timelineType", "canRemove", "canEdit", "canDragAndDrop", "title", "addButtonLabel", "hideSource", "inline", "activeToggleAsSwitch", "omitProperties", "datapoints", "config"] }, { kind: "component", type: TimeContextComponent, selector: "c8y-time-context", inputs: ["changedDateContext", "controlsAvailable", "context"], outputs: ["contextChange"] }] }); }
218
219
  }
219
220
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DatapointsGraphWidgetConfigComponent, decorators: [{
220
221
  type: Component,
@@ -228,7 +229,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
228
229
  DatapointSelectorModule,
229
230
  AlarmEventSelectorModule,
230
231
  TimeContextComponent
231
- ], providers: [ChartEventsService, ChartAlarmsService], template: "<div class=\"no-card-context d-flex-md fit-h--md\">\n <div class=\"col-md-5 bg-level-1 conf-col inner-scroll p-l-0\">\n <div class=\"p-l-24\">\n <form [formGroup]=\"formGroup\">\n <c8y-datapoint-selection-list\n class=\"bg-level-1 separator-bottom d-block\"\n name=\"datapoints\"\n [minActiveCount]=\"1\"\n [defaultFormOptions]=\"datapointSelectDefaultFormOptions\"\n [config]=\"datapointSelectionConfig\"\n formControlName=\"datapoints\"\n ></c8y-datapoint-selection-list>\n\n <c8y-alarm-event-selection-list\n class=\"bg-level-1 separator-bottom d-block\"\n name=\"alarms\"\n formControlName=\"alarms\"\n [timelineType]=\"'ALARM'\"\n [datapoints]=\"config?.datapoints\"\n ></c8y-alarm-event-selection-list>\n\n <c8y-alarm-event-selection-list\n class=\"bg-inherit\"\n name=\"events\"\n formControlName=\"events\"\n [timelineType]=\"'EVENT'\"\n [datapoints]=\"config?.datapoints\"\n ></c8y-alarm-event-selection-list>\n </form>\n </div>\n </div>\n\n <div class=\"col-md-7 sticky-top p-t-8 inner-scroll widget-preview\">\n <div class=\"p-r-24 d-col fit-h\">\n <div class=\"form-group p-t-8 form-group-sm d-flex a-i-center m-b-8\">\n <div class=\"d-flex a-i-center m-r-4\">\n <label\n class=\"m-b-0\"\n translate\n >\n Date selection\n </label>\n <button\n class=\"btn-help btn-help--sm\"\n [attr.aria-label]=\"'Help' | translate\"\n [popover]=\"dateSelectionHelpTemplate\"\n placement=\"bottom\"\n triggers=\"focus\"\n container=\"body\"\n [adaptivePosition]=\"false\"\n ></button>\n </div>\n <div class=\"c8y-select-wrapper\">\n <select\n class=\"form-control input-sm\"\n [ngModel]=\"dateSelection\"\n (ngModelChange)=\"dateSelectionChange($event)\"\n [ngModelOptions]=\"{ standalone: true }\"\n >\n <option\n title=\"{{ 'Dashboard time range' | translate }}\"\n [value]=\"DATE_SELECTION.DASHBOARD_CONTEXT\"\n >\n {{ 'Dashboard time range' | translate }}\n </option>\n <option\n title=\"{{ 'Widget configuration' | translate }}\"\n [value]=\"DATE_SELECTION.CONFIG\"\n >\n {{ 'Widget configuration' | translate }}\n </option>\n </select>\n <span></span>\n </div>\n </div>\n <label class=\"text-12\">{{ 'Options' | translate }}</label>\n <c8y-time-context\n *ngIf=\"\n dateSelection === DATE_SELECTION.CONFIG &&\n formGroup.get('displayDateSelection').value === true\n \"\n [changedDateContext]=\"timeProps\"\n [controlsAvailable]=\"{\n realtime: true,\n timeRange: config?.displayDateSelection,\n interval: config?.displayDateSelection,\n aggregation: config?.displayAggregationSelection\n }\"\n (contextChange)=\"timePropsChanged($event)\"\n ></c8y-time-context>\n <c8y-charts\n class=\"d-block p-relative\"\n *ngIf=\"activeDatapointsExists\"\n [config]=\"config\"\n [alerts]=\"alerts\"\n (timeRangeChangeOnRealtime)=\"updateTimeRangeOnRealtime($event)\"\n (configChangeOnZoomOut)=\"updateDashboardTimeContext($event)\"\n ></c8y-charts>\n\n <c8y-ui-empty-state\n class=\"d-block m-t-24\"\n [icon]=\"'search'\"\n [title]=\"'No data points selected' | translate\"\n [subtitle]=\"'Select data point to render chart' | translate\"\n *ngIf=\"!activeDatapointsExists\"\n ></c8y-ui-empty-state>\n\n <form\n class=\"d-block p-t-8\"\n [formGroup]=\"formGroup\"\n >\n <label>{{ 'Display options' | translate }}</label>\n <fieldset class=\"c8y-fieldset m-b-24 m-t-0\">\n <legend>{{ 'Axis' | translate }}</legend>\n <c8y-form-group class=\"p-b-16 m-b-0 p-t-8 form-group-sm\">\n <label\n class=\"c8y-checkbox\"\n [title]=\"'Y-axis helper lines' | translate\"\n >\n <input\n name=\"yAxisSplitLines\"\n type=\"checkbox\"\n formControlName=\"yAxisSplitLines\"\n />\n <span></span>\n <span translate>Y-axis helper lines</span>\n </label>\n <label\n class=\"c8y-checkbox\"\n [title]=\"'X-axis helper lines' | translate\"\n >\n <input\n name=\"xAxisSplitLines\"\n type=\"checkbox\"\n formControlName=\"xAxisSplitLines\"\n />\n <span></span>\n <span translate>X-axis helper lines</span>\n </label>\n <label\n class=\"c8y-checkbox\"\n [title]=\"'Merge matching data points into single axis' | translate\"\n >\n <input\n name=\"mergeMatchingDatapoints\"\n type=\"checkbox\"\n formControlName=\"mergeMatchingDatapoints\"\n />\n <span></span>\n <span translate>Merge matching data points into single axis</span>\n </label>\n </c8y-form-group>\n </fieldset>\n <fieldset class=\"c8y-fieldset m-b-24 m-t-0\">\n <legend>{{ 'Alarms & events' | translate }}</legend>\n <c8y-form-group class=\"p-b-16 m-b-0 p-t-8 form-group-sm\">\n <label\n class=\"c8y-checkbox\"\n [title]=\"'Show vertical line on every occurrence' | translate\"\n >\n <input\n name=\"displayMarkedLine\"\n type=\"checkbox\"\n formControlName=\"displayMarkedLine\"\n />\n <span></span>\n <span translate>Show vertical line on every occurrence</span>\n </label>\n <label\n class=\"c8y-checkbox\"\n [title]=\"'Show icon when triggered' | translate\"\n >\n <input\n name=\"displayMarkedPoint\"\n type=\"checkbox\"\n formControlName=\"displayMarkedPoint\"\n />\n <span></span>\n <span translate>Show icon when triggered</span>\n <button\n class=\"btn-clean m-l-8\"\n [attr.aria-label]=\"\n 'Some alarms or events have no matching data points. No icons will be shown for them.'\n | translate\n \"\n [tooltip]=\"\n 'Some alarms or events have no matching data points. No icons will be shown for them.'\n | translate\n \"\n container=\"body\"\n type=\"button\"\n *ngIf=\"alarmsOrEventsHaveNoMatchingDps\"\n (click)=\"$event.stopPropagation()\"\n [adaptivePosition]=\"false\"\n >\n <i\n class=\"text-warning\"\n c8yIcon=\"exclamation-triangle\"\n ></i>\n </button>\n </label>\n </c8y-form-group>\n </fieldset>\n <fieldset class=\"c8y-fieldset m-b-24 m-t-0\">\n <legend>{{ 'Chart' | translate }}</legend>\n <c8y-form-group class=\"p-b-16 m-b-0 p-t-8 form-group-sm\">\n <label\n class=\"c8y-checkbox\"\n [title]=\"'Enable date selection in the widget view.' | translate\"\n >\n <input\n name=\"displayDateSelection\"\n type=\"checkbox\"\n formControlName=\"displayDateSelection\"\n />\n <span></span>\n <span translate>Date selection in the widget view.</span>\n <button\n class=\"btn-clean m-l-8\"\n [attr.aria-label]=\"\n 'Date selection in widget view is not possible when using dashboard time range.'\n | translate\n \"\n [tooltip]=\"\n 'Date selection in widget view is not possible when using dashboard time range.'\n | translate\n \"\n container=\"body\"\n type=\"button\"\n *ngIf=\"dateSelection === DATE_SELECTION.DASHBOARD_CONTEXT\"\n (click)=\"$event.stopPropagation()\"\n [adaptivePosition]=\"false\"\n >\n <i\n class=\"text-info\"\n c8yIcon=\"info\"\n ></i>\n </button>\n </label>\n <label\n class=\"c8y-checkbox\"\n [title]=\"'Aggregation selection' | translate\"\n >\n <input\n name=\"displayAggregationSelection\"\n type=\"checkbox\"\n formControlName=\"displayAggregationSelection\"\n />\n <span></span>\n <span translate>Aggregation selection</span>\n </label>\n <label\n class=\"c8y-checkbox\"\n [title]=\"'Show labels and units' | translate\"\n >\n <input\n name=\"showLabelAndUnit\"\n type=\"checkbox\"\n formControlName=\"showLabelAndUnit\"\n />\n <span></span>\n <span translate>Display labels and units on Y-axis</span>\n </label>\n <label\n class=\"c8y-checkbox\"\n [title]=\"'Show slider' | translate\"\n >\n <input\n name=\"showSlider\"\n type=\"checkbox\"\n formControlName=\"showSlider\"\n />\n <span></span>\n <span translate>Show slider</span>\n </label>\n </c8y-form-group>\n </fieldset>\n </form>\n </div>\n </div>\n</div>\n<ng-template #dateSelectionHelpTemplate>\n <div [innerHTML]=\"dateSelectionHelp\"></div>\n</ng-template>\n" }]
232
+ ], providers: [ChartEventsService, ChartAlarmsService], template: "<div class=\"no-card-context d-flex-md fit-h--md\">\n <div class=\"col-md-5 bg-level-1 conf-col inner-scroll p-l-0\">\n <div class=\"p-l-24\">\n <form [formGroup]=\"formGroup\">\n <c8y-datapoint-selection-list\n class=\"bg-level-1 separator-bottom d-block\"\n name=\"datapoints\"\n [minActiveCount]=\"1\"\n [defaultFormOptions]=\"datapointSelectDefaultFormOptions\"\n [config]=\"datapointSelectionConfig\"\n formControlName=\"datapoints\"\n ></c8y-datapoint-selection-list>\n\n <c8y-alarm-event-selection-list\n class=\"bg-level-1 separator-bottom d-block\"\n name=\"alarms\"\n formControlName=\"alarms\"\n [timelineType]=\"'ALARM'\"\n [datapoints]=\"config?.datapoints\"\n ></c8y-alarm-event-selection-list>\n\n <c8y-alarm-event-selection-list\n class=\"bg-inherit\"\n name=\"events\"\n formControlName=\"events\"\n [timelineType]=\"'EVENT'\"\n [datapoints]=\"config?.datapoints\"\n ></c8y-alarm-event-selection-list>\n </form>\n </div>\n </div>\n\n <div class=\"col-md-7 sticky-top p-t-8 inner-scroll widget-preview\">\n <div class=\"p-r-24 d-col fit-h\">\n <div class=\"form-group p-t-8 form-group-sm d-flex a-i-center m-b-8\">\n <div class=\"d-flex a-i-center m-r-4\">\n <label\n class=\"m-b-0\"\n translate\n >\n Date selection\n </label>\n <button\n class=\"btn-help btn-help--sm\"\n [attr.aria-label]=\"'Help' | translate\"\n [popover]=\"dateSelectionHelpTemplate\"\n placement=\"bottom\"\n triggers=\"focus\"\n container=\"body\"\n [adaptivePosition]=\"false\"\n ></button>\n </div>\n <div class=\"c8y-select-wrapper\">\n <select\n class=\"form-control input-sm\"\n [ngModel]=\"dateSelection\"\n (ngModelChange)=\"dateSelectionChange($event)\"\n [ngModelOptions]=\"{ standalone: true }\"\n >\n <option\n title=\"{{ 'Dashboard time range' | translate }}\"\n [value]=\"DATE_SELECTION.DASHBOARD_CONTEXT\"\n >\n {{ 'Dashboard time range' | translate }}\n </option>\n <option\n title=\"{{ 'Widget configuration' | translate }}\"\n [value]=\"DATE_SELECTION.CONFIG\"\n >\n {{ 'Widget configuration' | translate }}\n </option>\n </select>\n <span></span>\n </div>\n </div>\n <label class=\"text-12\">{{ 'Options' | translate }}</label>\n <c8y-time-context\n *ngIf=\"\n dateSelection === DATE_SELECTION.CONFIG &&\n formGroup.get('displayDateSelection').value === true\n \"\n [changedDateContext]=\"timeProps\"\n [controlsAvailable]=\"{\n realtime: true,\n timeRange: config?.displayDateSelection,\n interval: config?.displayDateSelection,\n aggregation: config?.displayAggregationSelection\n }\"\n (contextChange)=\"timePropsChanged($event)\"\n ></c8y-time-context>\n <c8y-charts\n class=\"d-block p-relative\"\n *ngIf=\"activeDatapointsExists\"\n [config]=\"config\"\n [alerts]=\"alerts\"\n (timeRangeChangeOnRealtime)=\"updateTimeRangeOnRealtime($event)\"\n (configChangeOnZoomOut)=\"updateDashboardTimeContext($event)\"\n ></c8y-charts>\n\n <c8y-ui-empty-state\n class=\"d-block m-t-24\"\n [icon]=\"'search'\"\n [title]=\"'No data points selected' | translate\"\n [subtitle]=\"'Select data point to render chart' | translate\"\n *ngIf=\"!activeDatapointsExists\"\n ></c8y-ui-empty-state>\n\n <form\n class=\"d-block p-t-8\"\n [formGroup]=\"formGroup\"\n >\n <label>{{ 'Display options' | translate }}</label>\n <fieldset class=\"c8y-fieldset m-b-24 m-t-0\">\n <legend>{{ 'Axis' | translate }}</legend>\n <c8y-form-group class=\"p-b-16 m-b-0 p-t-8 form-group-sm\">\n <label\n class=\"c8y-checkbox\"\n [title]=\"'Y-axis helper lines' | translate\"\n >\n <input\n name=\"yAxisSplitLines\"\n type=\"checkbox\"\n formControlName=\"yAxisSplitLines\"\n />\n <span></span>\n <span translate>Y-axis helper lines</span>\n </label>\n <label\n class=\"c8y-checkbox\"\n [title]=\"'X-axis helper lines' | translate\"\n >\n <input\n name=\"xAxisSplitLines\"\n type=\"checkbox\"\n formControlName=\"xAxisSplitLines\"\n />\n <span></span>\n <span translate>X-axis helper lines</span>\n </label>\n <label\n class=\"c8y-checkbox\"\n [title]=\"'Merge matching data points into single axis' | translate\"\n >\n <input\n name=\"mergeMatchingDatapoints\"\n type=\"checkbox\"\n formControlName=\"mergeMatchingDatapoints\"\n />\n <span></span>\n <span translate>Merge matching data points into single axis</span>\n <button\n class=\"btn-dot m-l-8\"\n [attr.aria-label]=\"\n 'Data points with the same min and max values will be merged into a single axis. The values must be defined in the data point configuration.'\n | translate\n \"\n [tooltip]=\"\n 'Data points with the same min and max values will be merged into a single axis. The values must be defined in the data point configuration.'\n | translate\n \"\n container=\"body\"\n type=\"button\"\n (click)=\"$event.stopPropagation()\"\n [adaptivePosition]=\"false\"\n >\n <i\n class=\"text-info\"\n c8yIcon=\"info\"\n ></i>\n </button>\n </label>\n <label\n class=\"c8y-checkbox\"\n [title]=\"'Force merge all data points into single axis' | translate\"\n >\n <input\n name=\"forceMergeDatapoints\"\n type=\"checkbox\"\n formControlName=\"forceMergeDatapoints\"\n />\n <span></span>\n <span translate>Force merge all datapoints into a single axis</span>\n <button\n class=\"btn-dot m-l-8\"\n [attr.aria-label]=\"\n 'All axes will be force merged to a single axis with the scale being set to the max and min value of all axes. It\\'s recommended to use this option for data points with similar values.'\n | translate\n \"\n [tooltip]=\"\n 'All axes will be force merged to a single axis with the scale being set to the max and min value of all axes. It\\'s recommended to use this option for data points with similar values.'\n | translate\n \"\n container=\"body\"\n type=\"button\"\n (click)=\"$event.stopPropagation()\"\n [adaptivePosition]=\"false\"\n >\n <i\n class=\"text-info\"\n c8yIcon=\"info\"\n ></i>\n </button>\n </label>\n </c8y-form-group>\n </fieldset>\n <fieldset class=\"c8y-fieldset m-b-24 m-t-0\">\n <legend>{{ 'Alarms & events' | translate }}</legend>\n <c8y-form-group class=\"p-b-16 m-b-0 p-t-8 form-group-sm\">\n <label\n class=\"c8y-checkbox\"\n [title]=\"'Show vertical line on every occurrence' | translate\"\n >\n <input\n name=\"displayMarkedLine\"\n type=\"checkbox\"\n formControlName=\"displayMarkedLine\"\n />\n <span></span>\n <span translate>Show vertical line on every occurrence</span>\n </label>\n <label\n class=\"c8y-checkbox\"\n [title]=\"'Show icon when triggered' | translate\"\n >\n <input\n name=\"displayMarkedPoint\"\n type=\"checkbox\"\n formControlName=\"displayMarkedPoint\"\n />\n <span></span>\n <span translate>Show icon when triggered</span>\n <button\n class=\"btn-clean m-l-8\"\n [attr.aria-label]=\"\n 'Some alarms or events have no matching data points. No icons will be shown for them.'\n | translate\n \"\n [tooltip]=\"\n 'Some alarms or events have no matching data points. No icons will be shown for them.'\n | translate\n \"\n container=\"body\"\n type=\"button\"\n *ngIf=\"alarmsOrEventsHaveNoMatchingDps\"\n (click)=\"$event.stopPropagation()\"\n [adaptivePosition]=\"false\"\n >\n <i\n class=\"text-warning\"\n c8yIcon=\"exclamation-triangle\"\n ></i>\n </button>\n </label>\n </c8y-form-group>\n </fieldset>\n <fieldset class=\"c8y-fieldset m-b-24 m-t-0\">\n <legend>{{ 'Chart' | translate }}</legend>\n <c8y-form-group class=\"p-b-16 m-b-0 p-t-8 form-group-sm\">\n <label\n class=\"c8y-checkbox\"\n [title]=\"'Enable date selection in the widget view.' | translate\"\n >\n <input\n name=\"displayDateSelection\"\n type=\"checkbox\"\n formControlName=\"displayDateSelection\"\n />\n <span></span>\n <span translate>Date selection in the widget view.</span>\n <button\n class=\"btn-clean m-l-8\"\n [attr.aria-label]=\"\n 'Date selection in widget view is not possible when using dashboard time range.'\n | translate\n \"\n [tooltip]=\"\n 'Date selection in widget view is not possible when using dashboard time range.'\n | translate\n \"\n container=\"body\"\n type=\"button\"\n *ngIf=\"dateSelection === DATE_SELECTION.DASHBOARD_CONTEXT\"\n (click)=\"$event.stopPropagation()\"\n [adaptivePosition]=\"false\"\n >\n <i\n class=\"text-info\"\n c8yIcon=\"info\"\n ></i>\n </button>\n </label>\n <label\n class=\"c8y-checkbox\"\n [title]=\"'Aggregation selection' | translate\"\n >\n <input\n name=\"displayAggregationSelection\"\n type=\"checkbox\"\n formControlName=\"displayAggregationSelection\"\n />\n <span></span>\n <span translate>Aggregation selection</span>\n </label>\n <label\n class=\"c8y-checkbox\"\n [title]=\"'Show labels and units' | translate\"\n >\n <input\n name=\"showLabelAndUnit\"\n type=\"checkbox\"\n formControlName=\"showLabelAndUnit\"\n />\n <span></span>\n <span translate>Display labels and units on Y-axis</span>\n </label>\n <label\n class=\"c8y-checkbox\"\n [title]=\"'Show slider' | translate\"\n >\n <input\n name=\"showSlider\"\n type=\"checkbox\"\n formControlName=\"showSlider\"\n />\n <span></span>\n <span translate>Show slider</span>\n </label>\n </c8y-form-group>\n </fieldset>\n </form>\n </div>\n </div>\n</div>\n<ng-template #dateSelectionHelpTemplate>\n <div [innerHTML]=\"dateSelectionHelp\"></div>\n</ng-template>\n" }]
232
233
  }], ctorParameters: () => [{ type: i1.WidgetConfigComponent, decorators: [{
233
234
  type: Optional
234
235
  }] }, { type: i1.ContextDashboardComponent, decorators: [{
@@ -236,4 +237,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
236
237
  }] }], propDecorators: { config: [{
237
238
  type: Input
238
239
  }] } });
239
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YXBvaW50cy1ncmFwaC13aWRnZXQtY29uZmlnLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3dpZGdldHMvaW1wbGVtZW50YXRpb25zL2RhdGFwb2ludHMtZ3JhcGgvZGF0YXBvaW50cy1ncmFwaC1jb25maWcvZGF0YXBvaW50cy1ncmFwaC13aWRnZXQtY29uZmlnLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3dpZGdldHMvaW1wbGVtZW50YXRpb25zL2RhdGFwb2ludHMtZ3JhcGgvZGF0YXBvaW50cy1ncmFwaC1jb25maWcvZGF0YXBvaW50cy1ncmFwaC13aWRnZXQtY29uZmlnLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBcUIsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3RGLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRWpFLE9BQU8sRUFDTCxZQUFZLEVBQ1osVUFBVSxFQUVWLFdBQVcsRUFDWCxPQUFPLEVBRVAsaUNBQWlDLEVBQ2xDLE1BQU0scUJBQXFCLENBQUM7QUFDN0IsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDdkQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzNDLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDL0IsT0FBTyxFQUdMLHVCQUF1QixFQUV4QixNQUFNLHdDQUF3QyxDQUFDO0FBQ2hELE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFFakMsT0FBTyxFQUNMLHlCQUF5QixFQUN6QixxQkFBcUIsRUFDdEIsTUFBTSx1Q0FBdUMsQ0FBQztBQUMvQyxPQUFPLEVBRUwsd0JBQXdCLEVBRXpCLE1BQU0sMENBQTBDLENBQUM7QUFDbEQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ3RELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUN0RCxPQUFPLEVBQ0wsa0JBQWtCLEVBQ2xCLGtCQUFrQixFQUNsQixlQUFlLEVBSWYsdUJBQXVCLEVBRXhCLE1BQU0sNEJBQTRCLENBQUM7QUFDcEMsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sa0NBQWtDLENBQUM7Ozs7Ozs7Ozs7QUFxQnhFLE1BQU0sT0FBTyxvQ0FBb0M7SUF1Qy9DLFlBQ3NCLFlBQW1DLEVBQ25DLHlCQUFvRDtRQURwRCxpQkFBWSxHQUFaLFlBQVksQ0FBdUI7UUFDbkMsOEJBQXlCLEdBQXpCLHlCQUF5QixDQUEyQjtRQXRDekQsZ0JBQVcsR0FBRyxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDbEMsU0FBSSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUN0QixjQUFTLEdBQUcsTUFBTSxDQUFDLGdCQUFnQixDQUFDLENBQUM7UUFDckMsc0NBQWlDLEdBQUcsTUFBTSxDQUFDLGlDQUFpQyxDQUFDLENBQUM7UUFJL0YsbUJBQWMsR0FBRyx1QkFBdUIsQ0FBQztRQUV6QyxzQkFBaUIsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FDeEMsT0FBTyxDQUFDOzs7Ozs7Ozs7Ozs7OztRQWNKLENBQUMsQ0FDTixDQUFDO1FBQ0Ysc0NBQWlDLEdBQTJDO1lBQzFFLFNBQVMsRUFBRSxJQUFJO1lBQ2YsU0FBUyxFQUFFLElBQUk7U0FDaEIsQ0FBQztRQUNGLDZCQUF3QixHQUEyQyxFQUFFLENBQUM7UUFDdEUsMkJBQXNCLEdBQUcsS0FBSyxDQUFDO1FBQy9CLG9DQUErQixHQUFHLEtBQUssQ0FBQztRQUVoQyxhQUFRLEdBQUcsSUFBSSxPQUFPLEVBQVEsQ0FBQztRQU1yQyxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUNuQyxDQUFDO0lBRUQsUUFBUTtRQUNOLElBQUksQ0FBQyxNQUFNLEVBQUUsVUFBVSxFQUFFLE9BQU8sQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxpQ0FBaUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ25GLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ3BELElBQUksQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxNQUFNLElBQUksRUFBRSxDQUFDLENBQUM7UUFDN0MsSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FDckMsSUFBSSxDQUFDLE1BQU0sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsWUFBWSxLQUFLLE9BQU8sQ0FBbUIsQ0FDOUYsQ0FBQztRQUNGLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQ3JDLElBQUksQ0FBQyxNQUFNLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLFlBQVksS0FBSyxPQUFPLENBQW1CLENBQzlGLENBQUM7UUFFRixJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztRQUN6QixJQUFJLENBQUMseUJBQXlCLEVBQUUsQ0FBQztRQUNqQyxJQUFJLENBQUMsMEJBQTBCLEVBQUUsQ0FBQztRQUNsQyxJQUFJLENBQUMsU0FBUyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsRUFBRTtZQUMzRSxJQUFJLENBQUMsTUFBTSxHQUFHO2dCQUNaLEdBQUcsS0FBSztnQkFDUixtQkFBbUIsRUFBRTtvQkFDbkIsR0FBRyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLE1BQU0sSUFBSSxFQUFFLENBQUM7b0JBQ3RDLEdBQUcsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxNQUFNLElBQUksRUFBRSxDQUFDO2lCQUN2QzthQUNGLENBQUM7WUFDRixJQUFJLENBQUMseUJBQXlCLEVBQUUsQ0FBQztZQUNqQyxJQUFJLENBQUMsMEJBQTBCLEVBQUUsQ0FBQztRQUNwQyxDQUFDLENBQUMsQ0FBQztRQUVILElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRSwrQkFBK0IsRUFBRSxDQUFDO1lBQ2pELElBQUksQ0FBQywwQkFBMEIsQ0FBQyxJQUFJLENBQUMsaUNBQWlDLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxDQUFDO1FBQzdGLENBQUM7UUFFRCxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDL0MsSUFBSSxDQUFDLFNBQVMsR0FBRztnQkFDZixRQUFRLEVBQUUsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxRQUFRLENBQUM7Z0JBQ3pDLE1BQU0sRUFBRSxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQztnQkFDckMsUUFBUSxFQUFFLElBQUksQ0FBQyxNQUFNLEVBQUUsUUFBUTtnQkFDL0IsUUFBUSxFQUFFLElBQUksQ0FBQyxNQUFNLEVBQUUsUUFBUTtnQkFDL0IsV0FBVyxFQUFFLElBQUksQ0FBQyxNQUFNLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsV0FBVzthQUNyRSxDQUFDO1FBQ0osQ0FBQztJQUNILENBQUM7SUFFRCxXQUFXO1FBQ1QsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNyQixJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQzNCLENBQUM7SUFFRCxZQUFZLENBQ1YsTUFBb0M7UUFFcEMsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssSUFBSSxNQUFNLEVBQUUsQ0FBQztZQUNuQyxNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxRQUFRLEVBQUUsUUFBUSxDQUFDLENBQUMsRUFBRTtnQkFDdEUsbUJBQW1CLEVBQUU7b0JBQ25CLEdBQUcsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxNQUFNLElBQUksRUFBRSxDQUFDO29CQUN0QyxHQUFHLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsTUFBTSxJQUFJLEVBQUUsQ0FBQztpQkFDdkM7YUFDRixDQUFDLENBQUM7WUFFSCxPQUFPLElBQUksQ0FBQztRQUNkLENBQUM7UUFDRCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFFRCxnQkFBZ0IsQ0FBQyxTQUEyQjtRQUMxQyxJQUFJLFNBQVMsQ0FBQyxRQUFRLEtBQUssSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUNoRCxJQUFJLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxFQUFFLFFBQVEsRUFBRSxTQUFTLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQztRQUM5RCxDQUFDO1FBQ0QsSUFBSSxTQUFTLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDdkIsSUFBSSxTQUFTLENBQUMsMEJBQTBCLEtBQUssSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsUUFBUSxFQUFFLENBQUM7Z0JBQzNFLElBQUksQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLEVBQUUsUUFBUSxFQUFFLFNBQVMsQ0FBQywwQkFBMEIsRUFBRSxDQUFDLENBQUM7WUFDaEYsQ0FBQztZQUNELE9BQU87UUFDVCxDQUFDO1FBQ0QsTUFBTSxXQUFXLEdBQUc7WUFDbEIsUUFBUSxFQUFFLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQywwQkFBMEIsQ0FBQztZQUN4RCxNQUFNLEVBQUUsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLHdCQUF3QixDQUFDO1lBQ3BELFFBQVEsRUFBRSxTQUFTLENBQUMsMEJBQTBCO1lBQzlDLEdBQUcsQ0FBQyxTQUFTLENBQUMsV0FBVyxJQUFJLEVBQUUsV0FBVyxFQUFFLFNBQVMsQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUNwRSxHQUFHLENBQUMsU0FBUyxDQUFDLFFBQVEsSUFBSSxFQUFFLFFBQVEsRUFBRSxTQUFTLENBQUMsUUFBUSxFQUFFLENBQUM7U0FDNUQsQ0FBQztRQUVGLElBQUksQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQ3pDLENBQUM7SUFFRCwwQkFBMEIsQ0FBQyxTQUF5QztRQUNsRSxNQUFNLGdCQUFnQixHQUFHO1lBQ3ZCLFFBQVEsRUFBRSxTQUFTLENBQUMsUUFBUTtZQUM1QixNQUFNLEVBQUUsU0FBUyxDQUFDLE1BQU07WUFDeEIsUUFBUSxFQUFFLFNBQVMsQ0FBQyxRQUFRLElBQUksUUFBUTtTQUN6QyxDQUFDO1FBQ0YsSUFBSSxDQUFDLElBQUksQ0FBQyxpQ0FBaUMsQ0FBQyxnQkFBZ0IsRUFBRSxFQUFFLENBQUM7WUFDL0QsSUFBSSxDQUFDLGlDQUFpQyxDQUFDLHNCQUFzQixDQUFDLGdCQUFnQixDQUFDLENBQUM7UUFDbEYsQ0FBQztRQUNELElBQUksQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLEVBQUUsR0FBRyxTQUFTLEVBQUUsR0FBRyxnQkFBZ0IsRUFBRSxDQUFDLENBQUM7SUFDbkUsQ0FBQztJQUVELHlCQUF5QixDQUN2QixTQUFtRTtRQUVuRSxJQUFJLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxTQUFTLEVBQUUsRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztJQUM3RCxDQUFDO0lBRUQsbUJBQW1CLENBQUMsYUFBc0M7UUFDeEQsSUFBSSxDQUFDLGFBQWEsR0FBRyxhQUFhLENBQUM7UUFFbkMsSUFBSSxhQUFhLEtBQUssdUJBQXVCLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDckQsSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsb0JBQW9CLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDdEQsSUFBSSxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsRUFBRSwrQkFBK0IsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO1lBQ3RFLE9BQU87UUFDVCxDQUFDO1FBRUQscUZBQXFGO1FBQ3JGLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLG9CQUFvQixDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ3ZELElBQUksQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDO1lBQ3hCLCtCQUErQixFQUFFLElBQUk7WUFDckMsUUFBUSxFQUFFLEtBQUs7WUFDZixvQkFBb0IsRUFBRSxLQUFLO1NBQzVCLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFTyxpQ0FBaUMsQ0FBQyxTQUFxQjtRQUM3RCxJQUFJLENBQUMsSUFBSSxDQUFDLHlCQUF5QixFQUFFLHFCQUFxQixFQUFFLENBQUM7WUFDM0QsT0FBTztRQUNULENBQUM7UUFDRCxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsWUFBWSxFQUFFLE9BQU8sQ0FBQztRQUMzQyxJQUFJLE9BQU8sRUFBRSxFQUFFLEVBQUUsQ0FBQztZQUNoQixNQUFNLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFBRSxHQUFHLE9BQU8sQ0FBQztZQUM3QixTQUFTLENBQUMsUUFBUSxHQUFHLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFBRSxDQUFDO1lBQ2xDLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxZQUFZLEdBQUcsRUFBRSxFQUFFLEVBQUUsQ0FBQztRQUN0RCxDQUFDO0lBQ0gsQ0FBQztJQUVPLDBCQUEwQjtRQUNoQyxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLG1CQUFtQixFQUFFLEtBQUssQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUM1RCxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLFFBQVEsRUFBRSxFQUFFLEtBQUssRUFBRSxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUMsQ0FDakYsQ0FBQztRQUVGLGNBQWMsQ0FBQyxHQUFHLEVBQUU7WUFDbEIsSUFBSSxRQUFRLEVBQUUsQ0FBQztnQkFDYixJQUFJLENBQUMsK0JBQStCLEdBQUcsS0FBSyxDQUFDO1lBQy9DLENBQUM7aUJBQU0sQ0FBQztnQkFDTixJQUFJLENBQUMsK0JBQStCLEdBQUcsSUFBSSxDQUFDO1lBQzlDLENBQUM7UUFDSCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFTyxRQUFRO1FBQ2QsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUM7WUFDbEMsVUFBVSxFQUFFO2dCQUNWLEVBQWlDO2dCQUNqQyxDQUFDLFVBQVUsQ0FBQyxRQUFRLEVBQUUsVUFBVSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQzthQUMvQztZQUNELE1BQU0sRUFBRSxDQUFDLEVBQW9CLENBQUM7WUFDOUIsTUFBTSxFQUFFLENBQUMsRUFBb0IsQ0FBQztZQUM5QixpQkFBaUIsRUFBRSxDQUFDLElBQUksRUFBRSxFQUFFLENBQUM7WUFDN0Isa0JBQWtCLEVBQUUsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDO1lBQzlCLHVCQUF1QixFQUFFLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQztZQUNuQyxnQkFBZ0IsRUFBRSxDQUFDLElBQUksRUFBRSxFQUFFLENBQUM7WUFDNUIsb0JBQW9CLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDO1lBQ2pDLDJCQUEyQixFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQztZQUN4QywrQkFBK0IsRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUM7WUFDNUMsNEJBQTRCLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDO1lBQ3pDLFFBQVEsRUFBRSxDQUFDLElBQXVCLEVBQUUsRUFBRSxDQUFDO1lBQ3ZDLE1BQU0sRUFBRSxDQUFDLElBQXVCLEVBQUUsRUFBRSxDQUFDO1lBQ3JDLFFBQVEsRUFBRSxDQUFDLE1BQXdCLEVBQUUsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDM0QsV0FBVyxFQUFFLENBQUMsSUFBOEIsRUFBRSxFQUFFLENBQUM7WUFDakQsUUFBUSxFQUFFLENBQUMsS0FBSyxFQUFFLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQ3hDLFVBQVUsRUFBRSxDQUFDLElBQUksRUFBRSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUN6QyxlQUFlLEVBQUUsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDL0MsZUFBZSxFQUFFLENBQUMsS0FBSyxFQUFFLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1NBQ2hELENBQUMsQ0FBQztRQUNILE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVPLGlCQUFpQjtRQUN2QixJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSwrQkFBK0IsRUFBRSxDQUFDO1lBQ2xELElBQUksQ0FBQyxhQUFhLEdBQUcsdUJBQXVCLENBQUMsTUFBTSxDQUFDO1lBQ3BELE9BQU87UUFDVCxDQUFDO1FBRUQsSUFBSSxDQUFDLGFBQWEsR0FBRyx1QkFBdUIsQ0FBQyxpQkFBaUIsQ0FBQztRQUMvRCxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxvQkFBb0IsQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUN6RCxDQUFDO0lBRU8seUJBQXlCO1FBQy9CLElBQUksQ0FBQyxzQkFBc0I7WUFDekIsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLFVBQVUsRUFBRSxNQUFNLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsUUFBUSxDQUFDLEVBQUUsTUFBTSxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUMxRSxDQUFDOytHQXhPVSxvQ0FBb0M7bUdBQXBDLG9DQUFvQyx1SkFGcEMsQ0FBQyxrQkFBa0IsRUFBRSxrQkFBa0IsQ0FBQywwQkMvRHJELGl6VUE0UkEsMkNEdk9JLFlBQVksdWdCQUNaLFVBQVUsb3ZEQUNWLFdBQVcsOEJBQ1gsYUFBYSxpa0JBQ2IsYUFBYSwrVkFDYixlQUFlLDJOQUNmLHVCQUF1QixxVEFDdkIsd0JBQXdCLHNVQUN4QixvQkFBb0I7OzRGQUlYLG9DQUFvQztrQkFsQmhELFNBQVM7K0JBQ0Usb0NBQW9DLFFBQ3hDLEVBQUUsS0FBSyxFQUFFLFlBQVksRUFBRSxjQUVqQixJQUFJLFdBQ1A7d0JBQ1AsWUFBWTt3QkFDWixVQUFVO3dCQUNWLFdBQVc7d0JBQ1gsYUFBYTt3QkFDYixhQUFhO3dCQUNiLGVBQWU7d0JBQ2YsdUJBQXVCO3dCQUN2Qix3QkFBd0I7d0JBQ3hCLG9CQUFvQjtxQkFDckIsYUFDVSxDQUFDLGtCQUFrQixFQUFFLGtCQUFrQixDQUFDOzswQkEwQ2hELFFBQVE7OzBCQUNSLFFBQVE7eUNBeENGLE1BQU07c0JBQWQsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgaW5qZWN0LCBJbnB1dCwgT25EZXN0cm95LCBPbkluaXQsIE9wdGlvbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBGb3JtQnVpbGRlciwgTmdGb3JtLCBWYWxpZGF0b3JzIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMvaW50ZXJuYWwvT2JzZXJ2YWJsZSc7XG5pbXBvcnQge1xuICBDb21tb25Nb2R1bGUsXG4gIENvcmVNb2R1bGUsXG4gIER5bmFtaWNDb21wb25lbnRBbGVydEFnZ3JlZ2F0b3IsXG4gIEZvcm1zTW9kdWxlLFxuICBnZXR0ZXh0LFxuICBPbkJlZm9yZVNhdmUsXG4gIFdpZGdldFRpbWVDb250ZXh0RGF0ZVJhbmdlU2VydmljZVxufSBmcm9tICdAYzh5L25neC1jb21wb25lbnRzJztcbmltcG9ydCB7IFRyYW5zbGF0ZVNlcnZpY2UgfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcbmltcG9ydCB7IHRha2VVbnRpbCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IFN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7XG4gIERhdGFwb2ludEF0dHJpYnV0ZXNGb3JtQ29uZmlnLFxuICBEYXRhcG9pbnRTZWxlY3Rvck1vZGFsT3B0aW9ucyxcbiAgRGF0YXBvaW50U2VsZWN0b3JNb2R1bGUsXG4gIEtQSURldGFpbHNcbn0gZnJvbSAnQGM4eS9uZ3gtY29tcG9uZW50cy9kYXRhcG9pbnQtc2VsZWN0b3InO1xuaW1wb3J0IHsgb21pdCB9IGZyb20gJ2xvZGFzaC1lcyc7XG5pbXBvcnQgeyBhZ2dyZWdhdGlvblR5cGUgfSBmcm9tICdAYzh5L2NsaWVudCc7XG5pbXBvcnQge1xuICBDb250ZXh0RGFzaGJvYXJkQ29tcG9uZW50LFxuICBXaWRnZXRDb25maWdDb21wb25lbnRcbn0gZnJvbSAnQGM4eS9uZ3gtY29tcG9uZW50cy9jb250ZXh0LWRhc2hib2FyZCc7XG5pbXBvcnQge1xuICBBbGFybURldGFpbHMsXG4gIEFsYXJtRXZlbnRTZWxlY3Rvck1vZHVsZSxcbiAgRXZlbnREZXRhaWxzXG59IGZyb20gJ0BjOHkvbmd4LWNvbXBvbmVudHMvYWxhcm0tZXZlbnQtc2VsZWN0b3InO1xuaW1wb3J0IHsgVG9vbHRpcE1vZHVsZSB9IGZyb20gJ25neC1ib290c3RyYXAvdG9vbHRpcCc7XG5pbXBvcnQgeyBQb3BvdmVyTW9kdWxlIH0gZnJvbSAnbmd4LWJvb3RzdHJhcC9wb3BvdmVyJztcbmltcG9ydCB7XG4gIENoYXJ0QWxhcm1zU2VydmljZSxcbiAgQ2hhcnRFdmVudHNTZXJ2aWNlLFxuICBDaGFydHNDb21wb25lbnQsXG4gIERhdGFwb2ludHNHcmFwaEtQSURldGFpbHMsXG4gIERhdGFwb2ludHNHcmFwaFdpZGdldENvbmZpZyxcbiAgRGF0YXBvaW50c0dyYXBoV2lkZ2V0VGltZVByb3BzLFxuICBEQVRFX1NFTEVDVElPTl9FWFRFTkRFRCxcbiAgVGltZUNvbnRleHRQcm9wc1xufSBmcm9tICdAYzh5L25neC1jb21wb25lbnRzL2VjaGFydCc7XG5pbXBvcnQgeyBUaW1lQ29udGV4dENvbXBvbmVudCB9IGZyb20gJ0BjOHkvbmd4LWNvbXBvbmVudHMvdGltZS1jb250ZXh0JztcbmltcG9ydCB7IEludGVydmFsIH0gZnJvbSAnQGM4eS9uZ3gtY29tcG9uZW50cy9pbnRlcnZhbC1waWNrZXInO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdjOHktZGF0YXBvaW50cy1ncmFwaC13aWRnZXQtY29uZmlnJyxcbiAgaG9zdDogeyBjbGFzczogJ2QtY29udGVudHMnIH0sXG4gIHRlbXBsYXRlVXJsOiAnLi9kYXRhcG9pbnRzLWdyYXBoLXdpZGdldC1jb25maWcuY29tcG9uZW50Lmh0bWwnLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbXG4gICAgQ29tbW9uTW9kdWxlLFxuICAgIENvcmVNb2R1bGUsXG4gICAgRm9ybXNNb2R1bGUsXG4gICAgVG9vbHRpcE1vZHVsZSxcbiAgICBQb3BvdmVyTW9kdWxlLFxuICAgIENoYXJ0c0NvbXBvbmVudCxcbiAgICBEYXRhcG9pbnRTZWxlY3Rvck1vZHVsZSxcbiAgICBBbGFybUV2ZW50U2VsZWN0b3JNb2R1bGUsXG4gICAgVGltZUNvbnRleHRDb21wb25lbnRcbiAgXSxcbiAgcHJvdmlkZXJzOiBbQ2hhcnRFdmVudHNTZXJ2aWNlLCBDaGFydEFsYXJtc1NlcnZpY2VdXG59KVxuZXhwb3J0IGNsYXNzIERhdGFwb2ludHNHcmFwaFdpZGdldENvbmZpZ0NvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25CZWZvcmVTYXZlLCBPbkRlc3Ryb3kge1xuICBASW5wdXQoKSBjb25maWc6IERhdGFwb2ludHNHcmFwaFdpZGdldENvbmZpZyB8IHVuZGVmaW5lZDtcblxuICBwcml2YXRlIHJlYWRvbmx5IGZvcm1CdWlsZGVyID0gaW5qZWN0KEZvcm1CdWlsZGVyKTtcbiAgcHJpdmF0ZSByZWFkb25seSBmb3JtID0gaW5qZWN0KE5nRm9ybSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgdHJhbnNsYXRlID0gaW5qZWN0KFRyYW5zbGF0ZVNlcnZpY2UpO1xuICBwcml2YXRlIHJlYWRvbmx5IHdpZGdldFRpbWVDb250ZXh0RGF0ZVJhbmdlU2VydmljZSA9IGluamVjdChXaWRnZXRUaW1lQ29udGV4dERhdGVSYW5nZVNlcnZpY2UpO1xuXG4gIGFsZXJ0czogRHluYW1pY0NvbXBvbmVudEFsZXJ0QWdncmVnYXRvciB8IHVuZGVmaW5lZDtcbiAgZm9ybUdyb3VwOiBSZXR1cm5UeXBlPERhdGFwb2ludHNHcmFwaFdpZGdldENvbmZpZ0NvbXBvbmVudFsnaW5pdEZvcm0nXT47XG4gIERBVEVfU0VMRUNUSU9OID0gREFURV9TRUxFQ1RJT05fRVhURU5ERUQ7XG4gIGRhdGVTZWxlY3Rpb246IERBVEVfU0VMRUNUSU9OX0VYVEVOREVEIHwgdW5kZWZpbmVkO1xuICBkYXRlU2VsZWN0aW9uSGVscCA9IHRoaXMudHJhbnNsYXRlLmluc3RhbnQoXG4gICAgZ2V0dGV4dChgQ2hvb3NlIGhvdyB0byBzZWxlY3QgYSBkYXRlIHJhbmdlLCB0aGUgYXZhaWxhYmxlIG9wdGlvbnMgYXJlOlxuICA8dWwgY2xhc3M9XCJtLWwtMCBwLWwtOCBtLXQtOCBtLWItMFwiPlxuICAgIDxsaT5cbiAgICAgIDxiPldpZGdldCBjb25maWd1cmF0aW9uOjwvYj5cbiAgICAgIHJlc3RyaWN0cyB0aGUgZGF0ZSBzZWxlY3Rpb24gb25seSB0byB0aGUgd2lkZ2V0IGNvbmZpZ3VyYXRpb25cbiAgICA8L2xpPlxuICAgIDxsaT5cbiAgICAgIDxiPldpZGdldCBhbmQgd2lkZ2V0IGNvbmZpZ3VyYXRpb246PC9iPlxuICAgICAgcmVzdHJpY3RzIHRoZSBkYXRlIHNlbGVjdGlvbiB0byB0aGUgd2lkZ2V0IHZpZXcgYW5kIHdpZGdldCBjb25maWd1cmF0aW9uIG9ubHlcbiAgICA8L2xpPlxuICAgIDxsaT5cbiAgICAgIDxiPkRhc2hib2FyZCB0aW1lIHJhbmdlOjwvYj5cbiAgICAgIHJlc3RyaWN0cyBkYXRlIHNlbGVjdGlvbiB0byB0aGUgZ2xvYmFsIGRhc2hib2FyZCBjb25maWd1cmF0aW9uIG9ubHlcbiAgICA8L2xpPlxuICA8L3VsPmApXG4gICk7XG4gIGRhdGFwb2ludFNlbGVjdERlZmF1bHRGb3JtT3B0aW9uczogUGFydGlhbDxEYXRhcG9pbnRBdHRyaWJ1dGVzRm9ybUNvbmZpZz4gPSB7XG4gICAgc2hvd1JhbmdlOiB0cnVlLFxuICAgIHNob3dDaGFydDogdHJ1ZVxuICB9O1xuICBkYXRhcG9pbnRTZWxlY3Rpb25Db25maWc6IFBhcnRpYWw8RGF0YXBvaW50U2VsZWN0b3JNb2RhbE9wdGlvbnM+ID0ge307XG4gIGFjdGl2ZURhdGFwb2ludHNFeGlzdHMgPSBmYWxzZTtcbiAgYWxhcm1zT3JFdmVudHNIYXZlTm9NYXRjaGluZ0RwcyA9IGZhbHNlO1xuICB0aW1lUHJvcHM6IERhdGFwb2ludHNHcmFwaFdpZGdldFRpbWVQcm9wcyB8IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSBkZXN0cm95JCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgQE9wdGlvbmFsKCkgcHJpdmF0ZSB3aWRnZXRDb25maWc6IFdpZGdldENvbmZpZ0NvbXBvbmVudCxcbiAgICBAT3B0aW9uYWwoKSBwcml2YXRlIGRhc2hib2FyZENvbnRleHRDb21wb25lbnQ6IENvbnRleHREYXNoYm9hcmRDb21wb25lbnRcbiAgKSB7XG4gICAgdGhpcy5mb3JtR3JvdXAgPSB0aGlzLmluaXRGb3JtKCk7XG4gIH1cblxuICBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLmNvbmZpZz8uZGF0YXBvaW50cz8uZm9yRWFjaChkcCA9PiB0aGlzLmFzc2lnbkNvbnRleHRGcm9tQ29udGV4dERhc2hib2FyZChkcCkpO1xuICAgIHRoaXMuZm9ybS5mb3JtLmFkZENvbnRyb2woJ2NvbmZpZycsIHRoaXMuZm9ybUdyb3VwKTtcbiAgICB0aGlzLmZvcm1Hcm91cC5wYXRjaFZhbHVlKHRoaXMuY29uZmlnIHx8IHt9KTtcbiAgICB0aGlzLmZvcm1Hcm91cC5jb250cm9scy5hbGFybXMuc2V0VmFsdWUoXG4gICAgICB0aGlzLmNvbmZpZz8uYWxhcm1zRXZlbnRzQ29uZmlncz8uZmlsdGVyKGFlID0+IGFlLnRpbWVsaW5lVHlwZSA9PT0gJ0FMQVJNJykgYXMgQWxhcm1EZXRhaWxzW11cbiAgICApO1xuICAgIHRoaXMuZm9ybUdyb3VwLmNvbnRyb2xzLmV2ZW50cy5zZXRWYWx1ZShcbiAgICAgIHRoaXMuY29uZmlnPy5hbGFybXNFdmVudHNDb25maWdzPy5maWx0ZXIoYWUgPT4gYWUudGltZWxpbmVUeXBlID09PSAnRVZFTlQnKSBhcyBFdmVudERldGFpbHNbXVxuICAgICk7XG5cbiAgICB0aGlzLmluaXREYXRlU2VsZWN0aW9uKCk7XG4gICAgdGhpcy5zZXRBY3RpdmVEYXRhcG9pbnRzRXhpc3RzKCk7XG4gICAgdGhpcy5jaGVja0Zvck1hdGNoaW5nRGF0YXBvaW50cygpO1xuICAgIHRoaXMuZm9ybUdyb3VwLnZhbHVlQ2hhbmdlcy5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSkuc3Vic2NyaWJlKHZhbHVlID0+IHtcbiAgICAgIHRoaXMuY29uZmlnID0ge1xuICAgICAgICAuLi52YWx1ZSxcbiAgICAgICAgYWxhcm1zRXZlbnRzQ29uZmlnczogW1xuICAgICAgICAgIC4uLih0aGlzLmZvcm1Hcm91cC52YWx1ZS5hbGFybXMgfHwgW10pLFxuICAgICAgICAgIC4uLih0aGlzLmZvcm1Hcm91cC52YWx1ZS5ldmVudHMgfHwgW10pXG4gICAgICAgIF1cbiAgICAgIH07XG4gICAgICB0aGlzLnNldEFjdGl2ZURhdGFwb2ludHNFeGlzdHMoKTtcbiAgICAgIHRoaXMuY2hlY2tGb3JNYXRjaGluZ0RhdGFwb2ludHMoKTtcbiAgICB9KTtcblxuICAgIGlmICh0aGlzLmNvbmZpZz8ud2lkZ2V0SW5zdGFuY2VHbG9iYWxUaW1lQ29udGV4dCkge1xuICAgICAgdGhpcy51cGRhdGVEYXNoYm9hcmRUaW1lQ29udGV4dCh0aGlzLndpZGdldFRpbWVDb250ZXh0RGF0ZVJhbmdlU2VydmljZS5pbml0aWFsVGltZVJhbmdlKCkpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmNvbmZpZy5kYXRlRnJvbSAmJiB0aGlzLmNvbmZpZy5kYXRlVG8pIHtcbiAgICAgIHRoaXMudGltZVByb3BzID0ge1xuICAgICAgICBkYXRlRnJvbTogbmV3IERhdGUodGhpcy5jb25maWc/LmRhdGVGcm9tKSxcbiAgICAgICAgZGF0ZVRvOiBuZXcgRGF0ZSh0aGlzLmNvbmZpZz8uZGF0ZVRvKSxcbiAgICAgICAgaW50ZXJ2YWw6IHRoaXMuY29uZmlnPy5pbnRlcnZhbCxcbiAgICAgICAgcmVhbHRpbWU6IHRoaXMuY29uZmlnPy5yZWFsdGltZSxcbiAgICAgICAgYWdncmVnYXRpb246IHRoaXMuY29uZmlnPy5yZWFsdGltZSA/IG51bGwgOiB0aGlzLmNvbmZpZz8uYWdncmVnYXRpb25cbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgdGhpcy5kZXN0cm95JC5uZXh0KCk7XG4gICAgdGhpcy5kZXN0cm95JC5jb21wbGV0ZSgpO1xuICB9XG5cbiAgb25CZWZvcmVTYXZlKFxuICAgIGNvbmZpZz86IERhdGFwb2ludHNHcmFwaFdpZGdldENvbmZpZ1xuICApOiBib29sZWFuIHwgUHJvbWlzZTxib29sZWFuPiB8IE9ic2VydmFibGU8Ym9vbGVhbj4ge1xuICAgIGlmICh0aGlzLmZvcm1Hcm91cC52YWxpZCAmJiBjb25maWcpIHtcbiAgICAgIE9iamVjdC5hc3NpZ24oY29uZmlnLCBvbWl0KHRoaXMuZm9ybUdyb3VwLnZhbHVlLCBbJ2FsYXJtcycsICdldmVudHMnXSksIHtcbiAgICAgICAgYWxhcm1zRXZlbnRzQ29uZmlnczogW1xuICAgICAgICAgIC4uLih0aGlzLmZvcm1Hcm91cC52YWx1ZS5hbGFybXMgfHwgW10pLFxuICAgICAgICAgIC4uLih0aGlzLmZvcm1Hcm91cC52YWx1ZS5ldmVudHMgfHwgW10pXG4gICAgICAgIF1cbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgdGltZVByb3BzQ2hhbmdlZCh0aW1lUHJvcHM6IFRpbWVDb250ZXh0UHJvcHMpOiB2b2lkIHtcbiAgICBpZiAodGltZVByb3BzLnJlYWx0aW1lICE9PSB0aGlzLmNvbmZpZy5yZWFsdGltZSkge1xuICAgICAgdGhpcy5mb3JtR3JvdXAucGF0Y2hWYWx1ZSh7IHJlYWx0aW1lOiB0aW1lUHJvcHMucmVhbHRpbWUgfSk7XG4gICAgfVxuICAgIGlmICh0aW1lUHJvcHMucmVhbHRpbWUpIHtcbiAgICAgIGlmICh0aW1lUHJvcHMuY3VycmVudERhdGVDb250ZXh0SW50ZXJ2YWwgIT09IHRoaXMuZm9ybUdyb3VwLnZhbHVlLmludGVydmFsKSB7XG4gICAgICAgIHRoaXMuZm9ybUdyb3VwLnBhdGNoVmFsdWUoeyBpbnRlcnZhbDogdGltZVByb3BzLmN1cnJlbnREYXRlQ29udGV4dEludGVydmFsIH0pO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBwYXRjaFZhbHVlcyA9IHtcbiAgICAgIGRhdGVGcm9tOiBuZXcgRGF0ZSh0aW1lUHJvcHMuY3VycmVudERhdGVDb250ZXh0RnJvbURhdGUpLFxuICAgICAgZGF0ZVRvOiBuZXcgRGF0ZSh0aW1lUHJvcHMuY3VycmVudERhdGVDb250ZXh0VG9EYXRlKSxcbiAgICAgIGludGVydmFsOiB0aW1lUHJvcHMuY3VycmVudERhdGVDb250ZXh0SW50ZXJ2YWwsXG4gICAgICAuLi4odGltZVByb3BzLmFnZ3JlZ2F0aW9uICYmIHsgYWdncmVnYXRpb246IHRpbWVQcm9wcy5hZ2dyZWdhdGlvbiB9KSxcbiAgICAgIC4uLih0aW1lUHJvcHMucmVhbHRpbWUgJiYgeyByZWFsdGltZTogdGltZVByb3BzLnJlYWx0aW1lIH0pXG4gICAgfTtcblxuICAgIHRoaXMuZm9ybUdyb3VwLnBhdGNoVmFsdWUocGF0Y2hWYWx1ZXMpO1xuICB9XG5cbiAgdXBkYXRlRGFzaGJvYXJkVGltZUNvbnRleHQodGltZVByb3BzOiBEYXRhcG9pbnRzR3JhcGhXaWRnZXRUaW1lUHJvcHMpOiB2b2lkIHtcbiAgICBjb25zdCBpbml0aWFsVGltZVJhbmdlID0ge1xuICAgICAgZGF0ZUZyb206IHRpbWVQcm9wcy5kYXRlRnJvbSxcbiAgICAgIGRhdGVUbzogdGltZVByb3BzLmRhdGVUbyxcbiAgICAgIGludGVydmFsOiB0aW1lUHJvcHMuaW50ZXJ2YWwgfHwgJ2N1c3RvbSdcbiAgICB9O1xuICAgIGlmICghdGhpcy53aWRnZXRUaW1lQ29udGV4dERhdGVSYW5nZVNlcnZpY2UuaW5pdGlhbFRpbWVSYW5nZSgpKSB7XG4gICAgICB0aGlzLndpZGdldFRpbWVDb250ZXh0RGF0ZVJhbmdlU2VydmljZS51cGRhdGVJbml0aWFsVGltZVJhbmdlKGluaXRpYWxUaW1lUmFuZ2UpO1xuICAgIH1cbiAgICB0aGlzLmZvcm1Hcm91cC5wYXRjaFZhbHVlKHsgLi4udGltZVByb3BzLCAuLi5pbml0aWFsVGltZVJhbmdlIH0pO1xuICB9XG5cbiAgdXBkYXRlVGltZVJhbmdlT25SZWFsdGltZShcbiAgICB0aW1lUmFuZ2U6IFBpY2s8RGF0YXBvaW50c0dyYXBoV2lkZ2V0Q29uZmlnLCAnZGF0ZUZyb20nIHwgJ2RhdGVUbyc+XG4gICk6IHZvaWQge1xuICAgIHRoaXMuZm9ybUdyb3VwLnBhdGNoVmFsdWUodGltZVJhbmdlLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gIH1cblxuICBkYXRlU2VsZWN0aW9uQ2hhbmdlKGRhdGVTZWxlY3Rpb246IERBVEVfU0VMRUNUSU9OX0VYVEVOREVEKTogdm9pZCB7XG4gICAgdGhpcy5kYXRlU2VsZWN0aW9uID0gZGF0ZVNlbGVjdGlvbjtcblxuICAgIGlmIChkYXRlU2VsZWN0aW9uID09PSBEQVRFX1NFTEVDVElPTl9FWFRFTkRFRC5DT05GSUcpIHtcbiAgICAgIHRoaXMuZm9ybUdyb3VwLmNvbnRyb2xzLmRpc3BsYXlEYXRlU2VsZWN0aW9uLmVuYWJsZSgpO1xuICAgICAgdGhpcy5mb3JtR3JvdXAucGF0Y2hWYWx1ZSh7IHdpZGdldEluc3RhbmNlR2xvYmFsVGltZUNvbnRleHQ6IGZhbHNlIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIGRpc3BsYXlEYXRlU2VsZWN0aW9uIHNob3VsZCBiZSBmYWxzZSBhbmQgZGlzYWJsZWQgd2hlbiBkYXRlU2VsZWN0aW9uIGlzIG5vdCBDT05GSUdcbiAgICB0aGlzLmZvcm1Hcm91cC5jb250cm9scy5kaXNwbGF5RGF0ZVNlbGVjdGlvbi5kaXNhYmxlKCk7XG4gICAgdGhpcy5mb3JtR3JvdXAucGF0Y2hWYWx1ZSh7XG4gICAgICB3aWRnZXRJbnN0YW5jZUdsb2JhbFRpbWVDb250ZXh0OiB0cnVlLFxuICAgICAgcmVhbHRpbWU6IGZhbHNlLFxuICAgICAgZGlzcGxheURhdGVTZWxlY3Rpb246IGZhbHNlXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGFzc2lnbkNvbnRleHRGcm9tQ29udGV4dERhc2hib2FyZChkYXRhcG9pbnQ6IEtQSURldGFpbHMpIHtcbiAgICBpZiAoIXRoaXMuZGFzaGJvYXJkQ29udGV4dENvbXBvbmVudD8uaXNEZXZpY2VUeXBlRGFzaGJvYXJkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGNvbnRleHQgPSB0aGlzLndpZGdldENvbmZpZz8uY29udGV4dDtcbiAgICBpZiAoY29udGV4dD8uaWQpIHtcbiAgICAgIGNvbnN0IHsgbmFtZSwgaWQgfSA9IGNvbnRleHQ7XG4gICAgICBkYXRhcG9pbnQuX190YXJnZXQgPSB7IG5hbWUsIGlkIH07XG4gICAgICB0aGlzLmRhdGFwb2ludFNlbGVjdGlvbkNvbmZpZy5jb250ZXh0QXNzZXQgPSB7IGlkIH07XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBjaGVja0Zvck1hdGNoaW5nRGF0YXBvaW50cygpOiB2b2lkIHtcbiAgICBjb25zdCBhbGxNYXRjaCA9IHRoaXMuY29uZmlnPy5hbGFybXNFdmVudHNDb25maWdzPy5ldmVyeShhZSA9PlxuICAgICAgdGhpcy5mb3JtR3JvdXAudmFsdWUuZGF0YXBvaW50cz8uc29tZShkcCA9PiBkcC5fX3RhcmdldD8uaWQgPT09IGFlLl9fdGFyZ2V0Py5pZClcbiAgICApO1xuXG4gICAgcXVldWVNaWNyb3Rhc2soKCkgPT4ge1xuICAgICAgaWYgKGFsbE1hdGNoKSB7XG4gICAgICAgIHRoaXMuYWxhcm1zT3JFdmVudHNIYXZlTm9NYXRjaGluZ0RwcyA9IGZhbHNlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5hbGFybXNPckV2ZW50c0hhdmVOb01hdGNoaW5nRHBzID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgaW5pdEZvcm0oKSB7XG4gICAgY29uc3QgZm9ybSA9IHRoaXMuZm9ybUJ1aWxkZXIuZ3JvdXAoe1xuICAgICAgZGF0YXBvaW50czogW1xuICAgICAgICBbXSBhcyBEYXRhcG9pbnRzR3JhcGhLUElEZXRhaWxzW10sXG4gICAgICAgIFtWYWxpZGF0b3JzLnJlcXVpcmVkLCBWYWxpZGF0b3JzLm1pbkxlbmd0aCgxKV1cbiAgICAgIF0sXG4gICAgICBhbGFybXM6IFtbXSBhcyBBbGFybURldGFpbHNbXV0sXG4gICAgICBldmVudHM6IFtbXSBhcyBFdmVudERldGFpbHNbXV0sXG4gICAgICBkaXNwbGF5TWFya2VkTGluZTogW3RydWUsIFtdXSxcbiAgICAgIGRpc3BsYXlNYXJrZWRQb2ludDogW3RydWUsIFtdXSxcbiAgICAgIG1lcmdlTWF0Y2hpbmdEYXRhcG9pbnRzOiBbdHJ1ZSwgW11dLFxuICAgICAgc2hvd0xhYmVsQW5kVW5pdDogW3RydWUsIFtdXSxcbiAgICAgIGRpc3BsYXlEYXRlU2VsZWN0aW9uOiBbZmFsc2UsIFtdXSxcbiAgICAgIGRpc3BsYXlBZ2dyZWdhdGlvblNlbGVjdGlvbjogW2ZhbHNlLCBbXV0sXG4gICAgICB3aWRnZXRJbnN0YW5jZUdsb2JhbFRpbWVDb250ZXh0OiBbZmFsc2UsIFtdXSxcbiAgICAgIGNhbkRlY291cGxlR2xvYmFsVGltZUNvbnRleHQ6IFtmYWxzZSwgW11dLFxuICAgICAgZGF0ZUZyb206IFtudWxsIGFzIHVua25vd24gYXMgRGF0ZSwgW11dLFxuICAgICAgZGF0ZVRvOiBbbnVsbCBhcyB1bmtub3duIGFzIERhdGUsIFtdXSxcbiAgICAgIGludGVydmFsOiBbJ2RheXMnIGFzIEludGVydmFsWydpZCddLCBbVmFsaWRhdG9ycy5yZXF1aXJlZF1dLFxuICAgICAgYWdncmVnYXRpb246IFtudWxsIGFzIGFnZ3JlZ2F0aW9uVHlwZSB8IG51bGwsIFtdXSxcbiAgICAgIHJlYWx0aW1lOiBbZmFsc2UsIFtWYWxpZGF0b3JzLnJlcXVpcmVkXV0sXG4gICAgICBzaG93U2xpZGVyOiBbdHJ1ZSwgW1ZhbGlkYXRvcnMucmVxdWlyZWRdXSxcbiAgICAgIHlBeGlzU3BsaXRMaW5lczogW2ZhbHNlLCBbVmFsaWRhdG9ycy5yZXF1aXJlZF1dLFxuICAgICAgeEF4aXNTcGxpdExpbmVzOiBbZmFsc2UsIFtWYWxpZGF0b3JzLnJlcXVpcmVkXV1cbiAgICB9KTtcbiAgICByZXR1cm4gZm9ybTtcbiAgfVxuXG4gIHByaXZhdGUgaW5pdERhdGVTZWxlY3Rpb24oKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmNvbmZpZz8ud2lkZ2V0SW5zdGFuY2VHbG9iYWxUaW1lQ29udGV4dCkge1xuICAgICAgdGhpcy5kYXRlU2VsZWN0aW9uID0gREFURV9TRUxFQ1RJT05fRVhURU5ERUQuQ09ORklHO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuZGF0ZVNlbGVjdGlvbiA9IERBVEVfU0VMRUNUSU9OX0VYVEVOREVELkRBU0hCT0FSRF9DT05URVhUO1xuICAgIHRoaXMuZm9ybUdyb3VwLmNvbnRyb2xzLmRpc3BsYXlEYXRlU2VsZWN0aW9uLmRpc2FibGUoKTtcbiAgfVxuXG4gIHByaXZhdGUgc2V0QWN0aXZlRGF0YXBvaW50c0V4aXN0cygpIHtcbiAgICB0aGlzLmFjdGl2ZURhdGFwb2ludHNFeGlzdHMgPVxuICAgICAgKHRoaXMuY29uZmlnPy5kYXRhcG9pbnRzPy5maWx0ZXIoZHAgPT4gZHAuX19hY3RpdmUpPy5sZW5ndGggfHwgMCkgPiAwO1xuICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwibm8tY2FyZC1jb250ZXh0IGQtZmxleC1tZCBmaXQtaC0tbWRcIj5cbiAgPGRpdiBjbGFzcz1cImNvbC1tZC01IGJnLWxldmVsLTEgY29uZi1jb2wgaW5uZXItc2Nyb2xsIHAtbC0wXCI+XG4gICAgPGRpdiBjbGFzcz1cInAtbC0yNFwiPlxuICAgICAgPGZvcm0gW2Zvcm1Hcm91cF09XCJmb3JtR3JvdXBcIj5cbiAgICAgICAgPGM4eS1kYXRhcG9pbnQtc2VsZWN0aW9uLWxpc3RcbiAgICAgICAgICBjbGFzcz1cImJnLWxldmVsLTEgc2VwYXJhdG9yLWJvdHRvbSBkLWJsb2NrXCJcbiAgICAgICAgICBuYW1lPVwiZGF0YXBvaW50c1wiXG4gICAgICAgICAgW21pbkFjdGl2ZUNvdW50XT1cIjFcIlxuICAgICAgICAgIFtkZWZhdWx0Rm9ybU9wdGlvbnNdPVwiZGF0YXBvaW50U2VsZWN0RGVmYXVsdEZvcm1PcHRpb25zXCJcbiAgICAgICAgICBbY29uZmlnXT1cImRhdGFwb2ludFNlbGVjdGlvbkNvbmZpZ1wiXG4gICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwiZGF0YXBvaW50c1wiXG4gICAgICAgID48L2M4eS1kYXRhcG9pbnQtc2VsZWN0aW9uLWxpc3Q+XG5cbiAgICAgICAgPGM4eS1hbGFybS1ldmVudC1zZWxlY3Rpb24tbGlzdFxuICAgICAgICAgIGNsYXNzPVwiYmctbGV2ZWwtMSBzZXBhcmF0b3ItYm90dG9tIGQtYmxvY2tcIlxuICAgICAgICAgIG5hbWU9XCJhbGFybXNcIlxuICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cImFsYXJtc1wiXG4gICAgICAgICAgW3RpbWVsaW5lVHlwZV09XCInQUxBUk0nXCJcbiAgICAgICAgICBbZGF0YXBvaW50c109XCJjb25maWc/LmRhdGFwb2ludHNcIlxuICAgICAgICA+PC9jOHktYWxhcm0tZXZlbnQtc2VsZWN0aW9uLWxpc3Q+XG5cbiAgICAgICAgPGM4eS1hbGFybS1ldmVudC1zZWxlY3Rpb24tbGlzdFxuICAgICAgICAgIGNsYXNzPVwiYmctaW5oZXJpdFwiXG4gICAgICAgICAgbmFtZT1cImV2ZW50c1wiXG4gICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwiZXZlbnRzXCJcbiAgICAgICAgICBbdGltZWxpbmVUeXBlXT1cIidFVkVOVCdcIlxuICAgICAgICAgIFtkYXRhcG9pbnRzXT1cImNvbmZpZz8uZGF0YXBvaW50c1wiXG4gICAgICAgID48L2M4eS1hbGFybS1ldmVudC1zZWxlY3Rpb24tbGlzdD5cbiAgICAgIDwvZm9ybT5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG5cbiAgPGRpdiBjbGFzcz1cImNvbC1tZC03IHN0aWNreS10b3AgcC10LTggaW5uZXItc2Nyb2xsIHdpZGdldC1wcmV2aWV3XCI+XG4gICAgPGRpdiBjbGFzcz1cInAtci0yNCBkLWNvbCBmaXQtaFwiPlxuICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgcC10LTggZm9ybS1ncm91cC1zbSBkLWZsZXggYS1pLWNlbnRlciBtLWItOFwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGEtaS1jZW50ZXIgbS1yLTRcIj5cbiAgICAgICAgICA8bGFiZWxcbiAgICAgICAgICAgIGNsYXNzPVwibS1iLTBcIlxuICAgICAgICAgICAgdHJhbnNsYXRlXG4gICAgICAgICAgPlxuICAgICAgICAgICAgRGF0ZSBzZWxlY3Rpb25cbiAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgIGNsYXNzPVwiYnRuLWhlbHAgYnRuLWhlbHAtLXNtXCJcbiAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiJ0hlbHAnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgIFtwb3BvdmVyXT1cImRhdGVTZWxlY3Rpb25IZWxwVGVtcGxhdGVcIlxuICAgICAgICAgICAgcGxhY2VtZW50PVwiYm90dG9tXCJcbiAgICAgICAgICAgIHRyaWdnZXJzPVwiZm9jdXNcIlxuICAgICAgICAgICAgY29udGFpbmVyPVwiYm9keVwiXG4gICAgICAgICAgICBbYWRhcHRpdmVQb3NpdGlvbl09XCJmYWxzZVwiXG4gICAgICAgICAgPjwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImM4eS1zZWxlY3Qtd3JhcHBlclwiPlxuICAgICAgICAgIDxzZWxlY3RcbiAgICAgICAgICAgIGNsYXNzPVwiZm9ybS1jb250cm9sIGlucHV0LXNtXCJcbiAgICAgICAgICAgIFtuZ01vZGVsXT1cImRhdGVTZWxlY3Rpb25cIlxuICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwiZGF0ZVNlbGVjdGlvbkNoYW5nZSgkZXZlbnQpXCJcbiAgICAgICAgICAgIFtuZ01vZGVsT3B0aW9uc109XCJ7IHN0YW5kYWxvbmU6IHRydWUgfVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPG9wdGlvblxuICAgICAgICAgICAgICB0aXRsZT1cInt7ICdEYXNoYm9hcmQgdGltZSByYW5nZScgfCB0cmFuc2xhdGUgfX1cIlxuICAgICAgICAgICAgICBbdmFsdWVdPVwiREFURV9TRUxFQ1RJT04uREFTSEJPQVJEX0NPTlRFWFRcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICB7eyAnRGFzaGJvYXJkIHRpbWUgcmFuZ2UnIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICA8L29wdGlvbj5cbiAgICAgICAgICAgIDxvcHRpb25cbiAgICAgICAgICAgICAgdGl0bGU9XCJ7eyAnV2lkZ2V0IGNvbmZpZ3VyYXRpb24nIHwgdHJhbnNsYXRlIH19XCJcbiAgICAgICAgICAgICAgW3ZhbHVlXT1cIkRBVEVfU0VMRUNUSU9OLkNPTkZJR1wiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIHt7ICdXaWRnZXQgY29uZmlndXJhdGlvbicgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgIDwvb3B0aW9uPlxuICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICAgIDxzcGFuPjwvc3Bhbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxsYWJlbCBjbGFzcz1cInRleHQtMTJcIj57eyAnT3B0aW9ucycgfCB0cmFuc2xhdGUgfX08L2xhYmVsPlxuICAgICAgPGM4eS10aW1lLWNvbnRleHRcbiAgICAgICAgKm5nSWY9XCJcbiAgICAgICAgICBkYXRlU2VsZWN0aW9uID09PSBEQVRFX1NFTEVDVElPTi5DT05GSUcgJiZcbiAgICAgICAgICBmb3JtR3JvdXAuZ2V0KCdkaXNwbGF5RGF0ZVNlbGVjdGlvbicpLnZhbHVlID09PSB0cnVlXG4gICAgICAgIFwiXG4gICAgICAgIFtjaGFuZ2VkRGF0ZUNvbnRleHRdPVwidGltZVByb3BzXCJcbiAgICAgICAgW2NvbnRyb2xzQXZhaWxhYmxlXT1cIntcbiAgICAgICAgICByZWFsdGltZTogdHJ1ZSxcbiAgICAgICAgICB0aW1lUmFuZ2U6IGNvbmZpZz8uZGlzcGxheURhdGVTZWxlY3Rpb24sXG4gICAgICAgICAgaW50ZXJ2YWw6IGNvbmZpZz8uZGlzcGxheURhdGVTZWxlY3Rpb24sXG4gICAgICAgICAgYWdncmVnYXRpb246IGNvbmZpZz8uZGlzcGxheUFnZ3JlZ2F0aW9uU2VsZWN0aW9uXG4gICAgICAgIH1cIlxuICAgICAgICAoY29udGV4dENoYW5nZSk9XCJ0aW1lUHJvcHNDaGFuZ2VkKCRldmVudClcIlxuICAgICAgPjwvYzh5LXRpbWUtY29udGV4dD5cbiAgICAgIDxjOHktY2hhcnRzXG4gICAgICAgIGNsYXNzPVwiZC1ibG9jayBwLXJlbGF0aXZlXCJcbiAgICAgICAgKm5nSWY9XCJhY3RpdmVEYXRhcG9pbnRzRXhpc3RzXCJcbiAgICAgICAgW2NvbmZpZ109XCJjb25maWdcIlxuICAgICAgICBbYWxlcnRzXT1cImFsZXJ0c1wiXG4gICAgICAgICh0aW1lUmFuZ2VDaGFuZ2VPblJlYWx0aW1lKT1cInVwZGF0ZVRpbWVSYW5nZU9uUmVhbHRpbWUoJGV2ZW50KVwiXG4gICAgICAgIChjb25maWdDaGFuZ2VPblpvb21PdXQpPVwidXBkYXRlRGFzaGJvYXJkVGltZUNvbnRleHQoJGV2ZW50KVwiXG4gICAgICA+PC9jOHktY2hhcnRzPlxuXG4gICAgICA8Yzh5LXVpLWVtcHR5LXN0YXRlXG4gICAgICAgIGNsYXNzPVwiZC1ibG9jayBtLXQtMjRcIlxuICAgICAgICBbaWNvbl09XCInc2VhcmNoJ1wiXG4gICAgICAgIFt0aXRsZV09XCInTm8gZGF0YSBwb2ludHMgc2VsZWN0ZWQnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgW3N1YnRpdGxlXT1cIidTZWxlY3QgZGF0YSBwb2ludCB0byByZW5kZXIgY2hhcnQnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgKm5nSWY9XCIhYWN0aXZlRGF0YXBvaW50c0V4aXN0c1wiXG4gICAgICA+PC9jOHktdWktZW1wdHktc3RhdGU+XG5cbiAgICAgIDxmb3JtXG4gICAgICAgIGNsYXNzPVwiZC1ibG9jayBwLXQtOFwiXG4gICAgICAgIFtmb3JtR3JvdXBdPVwiZm9ybUdyb3VwXCJcbiAgICAgID5cbiAgICAgICAgPGxhYmVsPnt7ICdEaXNwbGF5IG9wdGlvbnMnIHwgdHJhbnNsYXRlIH19PC9sYWJlbD5cbiAgICAgICAgPGZpZWxkc2V0IGNsYXNzPVwiYzh5LWZpZWxkc2V0IG0tYi0yNCBtLXQtMFwiPlxuICAgICAgICAgIDxsZWdlbmQ+e3sgJ0F4aXMnIHwgdHJhbnNsYXRlIH19PC9sZWdlbmQ+XG4gICAgICAgICAgPGM4eS1mb3JtLWdyb3VwIGNsYXNzPVwicC1iLTE2IG0tYi0wIHAtdC04IGZvcm0tZ3JvdXAtc21cIj5cbiAgICAgICAgICAgIDxsYWJlbFxuICAgICAgICAgICAgICBjbGFzcz1cImM4eS1jaGVja2JveFwiXG4gICAgICAgICAgICAgIFt0aXRsZV09XCInWS1heGlzIGhlbHBlciBsaW5lcycgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICBuYW1lPVwieUF4aXNTcGxpdExpbmVzXCJcbiAgICAgICAgICAgICAgICB0eXBlPVwiY2hlY2tib3hcIlxuICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cInlBeGlzU3BsaXRMaW5lc1wiXG4gICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgIDxzcGFuPjwvc3Bhbj5cbiAgICAgICAgICAgICAgPHNwYW4gdHJhbnNsYXRlPlktYXhpcyBoZWxwZXIgbGluZXM8L3NwYW4+XG4gICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgPGxhYmVsXG4gICAgICAgICAgICAgIGNsYXNzPVwiYzh5LWNoZWNrYm94XCJcbiAgICAgICAgICAgICAgW3RpdGxlXT1cIidYLWF4aXMgaGVscGVyIGxpbmVzJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgIG5hbWU9XCJ4QXhpc1NwbGl0TGluZXNcIlxuICAgICAgICAgICAgICAgIHR5cGU9XCJjaGVja2JveFwiXG4gICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwieEF4aXNTcGxpdExpbmVzXCJcbiAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgPHNwYW4+PC9zcGFuPlxuICAgICAgICAgICAgICA8c3BhbiB0cmFuc2xhdGU+WC1heGlzIGhlbHBlciBsaW5lczwvc3Bhbj5cbiAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICA8bGFiZWxcbiAgICAgICAgICAgICAgY2xhc3M9XCJjOHktY2hlY2tib3hcIlxuICAgICAgICAgICAgICBbdGl0bGVdPVwiJ01lcmdlIG1hdGNoaW5nIGRhdGEgcG9pbnRzIGludG8gc2luZ2xlIGF4aXMnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgbmFtZT1cIm1lcmdlTWF0Y2hpbmdEYXRhcG9pbnRzXCJcbiAgICAgICAgICAgICAgICB0eXBlPVwiY2hlY2tib3hcIlxuICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cIm1lcmdlTWF0Y2hpbmdEYXRhcG9pbnRzXCJcbiAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgPHNwYW4+PC9zcGFuPlxuICAgICAgICAgICAgICA8c3BhbiB0cmFuc2xhdGU+TWVyZ2UgbWF0Y2hpbmcgZGF0YSBwb2ludHMgaW50byBzaW5nbGUgYXhpczwvc3Bhbj5cbiAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgPC9jOHktZm9ybS1ncm91cD5cbiAgICAgICAgPC9maWVsZHNldD5cbiAgICAgICAgPGZpZWxkc2V0IGNsYXNzPVwiYzh5LWZpZWxkc2V0IG0tYi0yNCBtLXQtMFwiPlxuICAgICAgICAgIDxsZWdlbmQ+e3sgJ0FsYXJtcyAmIGV2ZW50cycgfCB0cmFuc2xhdGUgfX08L2xlZ2VuZD5cbiAgICAgICAgICA8Yzh5LWZvcm0tZ3JvdXAgY2xhc3M9XCJwLWItMTYgbS1iLTAgcC10LTggZm9ybS1ncm91cC1zbVwiPlxuICAgICAgICAgICAgPGxhYmVsXG4gICAgICAgICAgICAgIGNsYXNzPVwiYzh5LWNoZWNrYm94XCJcbiAgICAgICAgICAgICAgW3RpdGxlXT1cIidTaG93IHZlcnRpY2FsIGxpbmUgb24gZXZlcnkgb2NjdXJyZW5jZScgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICBuYW1lPVwiZGlzcGxheU1hcmtlZExpbmVcIlxuICAgICAgICAgICAgICAgIHR5cGU9XCJjaGVja2JveFwiXG4gICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwiZGlzcGxheU1hcmtlZExpbmVcIlxuICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICA8c3Bhbj48L3NwYW4+XG4gICAgICAgICAgICAgIDxzcGFuIHRyYW5zbGF0ZT5TaG93IHZlcnRpY2FsIGxpbmUgb24gZXZlcnkgb2NjdXJyZW5jZTwvc3Bhbj5cbiAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICA8bGFiZWxcbiAgICAgICAgICAgICAgY2xhc3M9XCJjOHktY2hlY2tib3hcIlxuICAgICAgICAgICAgICBbdGl0bGVdPVwiJ1Nob3cgaWNvbiB3aGVuIHRyaWdnZXJlZCcgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICBuYW1lPVwiZGlzcGxheU1hcmtlZFBvaW50XCJcbiAgICAgICAgICAgICAgICB0eXBlPVwiY2hlY2tib3hcIlxuICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cImRpc3BsYXlNYXJrZWRQb2ludFwiXG4gICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgIDxzcGFuPjwvc3Bhbj5cbiAgICAgICAgICAgICAgPHNwYW4gdHJhbnNsYXRlPlNob3cgaWNvbiB3aGVuIHRyaWdnZXJlZDwvc3Bhbj5cbiAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgIGNsYXNzPVwiYnRuLWNsZWFuIG0tbC04XCJcbiAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIlxuICAgICAgICAgICAgICAgICAgJ1NvbWUgYWxhcm1zIG9yIGV2ZW50cyBoYXZlIG5vIG1hdGNoaW5nIGRhdGEgcG9pbnRzLiBObyBpY29ucyB3aWxsIGJlIHNob3duIGZvciB0aGVtLidcbiAgICAgICAgICAgICAgICAgICAgfCB0cmFuc2xhdGVcbiAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgIFt0b29sdGlwXT1cIlxuICAgICAgICAgICAgICAgICAgJ1NvbWUgYWxhcm1zIG9yIGV2ZW50cyBoYXZlIG5vIG1hdGNoaW5nIGRhdGEgcG9pbnRzLiBObyBpY29ucyB3aWxsIGJlIHNob3duIGZvciB0aGVtLidcbiAgICAgICAgICAgICAgICAgICAgfCB0cmFuc2xhdGVcbiAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgIGNvbnRhaW5lcj1cImJvZHlcIlxuICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICpuZ0lmPVwiYWxhcm1zT3JFdmVudHNIYXZlTm9NYXRjaGluZ0Rwc1wiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiXG4gICAgICAgICAgICAgICAgW2FkYXB0aXZlUG9zaXRpb25dPVwiZmFsc2VcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPGlcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwidGV4dC13YXJuaW5nXCJcbiAgICAgICAgICAgICAgICAgIGM4eUljb249XCJleGNsYW1hdGlvbi10cmlhbmdsZVwiXG4gICAgICAgICAgICAgICAgPjwvaT5cbiAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgIDwvYzh5LWZvcm0tZ3JvdXA+XG4gICAgICAgIDwvZmllbGRzZXQ+XG4gICAgICAgIDxmaWVsZHNldCBjbGFzcz1cImM4eS1maWVsZHNldCBtLWItMjQgbS10LTBcIj5cbiAgICAgICAgICA8bGVnZW5kPnt7ICdDaGFydCcgfCB0cmFuc2xhdGUgfX08L2xlZ2VuZD5cbiAgICAgICAgICA8Yzh5LWZvcm0tZ3JvdXAgY2xhc3M9XCJwLWItMTYgbS1iLTAgcC10LTggZm9ybS1ncm91cC1zbVwiPlxuICAgICAgICAgICAgPGxhYmVsXG4gICAgICAgICAgICAgIGNsYXNzPVwiYzh5LWNoZWNrYm94XCJcbiAgICAgICAgICAgICAgW3RpdGxlXT1cIidFbmFibGUgZGF0ZSBzZWxlY3Rpb24gaW4gdGhlIHdpZGdldCB2aWV3LicgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICBuYW1lPVwiZGlzcGxheURhdGVTZWxlY3Rpb25cIlxuICAgICAgICAgICAgICAgIHR5cGU9XCJjaGVja2JveFwiXG4gICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwiZGlzcGxheURhdGVTZWxlY3Rpb25cIlxuICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICA8c3Bhbj48L3NwYW4+XG4gICAgICAgICAgICAgIDxzcGFuIHRyYW5zbGF0ZT5EYXRlIHNlbGVjdGlvbiBpbiB0aGUgd2lkZ2V0IHZpZXcuPC9zcGFuPlxuICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJidG4tY2xlYW4gbS1sLThcIlxuICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiXG4gICAgICAgICAgICAgICAgICAnRGF0ZSBzZWxlY3Rpb24gaW4gd2lkZ2V0IHZpZXcgaXMgbm90IHBvc3NpYmxlIHdoZW4gdXNpbmcgZGFzaGJvYXJkIHRpbWUgcmFuZ2UuJ1xuICAgICAgICAgICAgICAgICAgICB8IHRyYW5zbGF0ZVxuICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgW3Rvb2x0aXBdPVwiXG4gICAgICAgICAgICAgICAgICAnRGF0ZSBzZWxlY3Rpb24gaW4gd2lkZ2V0IHZpZXcgaXMgbm90IHBvc3NpYmxlIHdoZW4gdXNpbmcgZGFzaGJvYXJkIHRpbWUgcmFuZ2UuJ1xuICAgICAgICAgICAgICAgICAgICB8IHRyYW5zbGF0ZVxuICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgY29udGFpbmVyPVwiYm9keVwiXG4gICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgKm5nSWY9XCJkYXRlU2VsZWN0aW9uID09PSBEQVRFX1NFTEVDVElPTi5EQVNIQk9BUkRfQ09OVEVYVFwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiXG4gICAgICAgICAgICAgICAgW2FkYXB0aXZlUG9zaXRpb25dPVwiZmFsc2VcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPGlcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwidGV4dC1pbmZvXCJcbiAgICAgICAgICAgICAgICAgIGM4eUljb249XCJpbmZvXCJcbiAgICAgICAgICAgICAgICA+PC9pPlxuICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICA8bGFiZWxcbiAgICAgICAgICAgICAgY2xhc3M9XCJjOHktY2hlY2tib3hcIlxuICAgICAgICAgICAgICBbdGl0bGVdPVwiJ0FnZ3JlZ2F0aW9uIHNlbGVjdGlvbicgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICBuYW1lPVwiZGlzcGxheUFnZ3JlZ2F0aW9uU2VsZWN0aW9uXCJcbiAgICAgICAgICAgICAgICB0eXBlPVwiY2hlY2tib3hcIlxuICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cImRpc3BsYXlBZ2dyZWdhdGlvblNlbGVjdGlvblwiXG4gICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgIDxzcGFuPjwvc3Bhbj5cbiAgICAgICAgICAgICAgPHNwYW4gdHJhbnNsYXRlPkFnZ3JlZ2F0aW9uIHNlbGVjdGlvbjwvc3Bhbj5cbiAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICA8bGFiZWxcbiAgICAgICAgICAgICAgY2xhc3M9XCJjOHktY2hlY2tib3hcIlxuICAgICAgICAgICAgICBbdGl0bGVdPVwiJ1Nob3cgbGFiZWxzIGFuZCB1bml0cycgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICBuYW1lPVwic2hvd0xhYmVsQW5kVW5pdFwiXG4gICAgICAgICAgICAgICAgdHlwZT1cImNoZWNrYm94XCJcbiAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJzaG93TGFiZWxBbmRVbml0XCJcbiAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgPHNwYW4+PC9zcGFuPlxuICAgICAgICAgICAgICA8c3BhbiB0cmFuc2xhdGU+RGlzcGxheSBsYWJlbHMgYW5kIHVuaXRzIG9uIFktYXhpczwvc3Bhbj5cbiAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICA8bGFiZWxcbiAgICAgICAgICAgICAgY2xhc3M9XCJjOHktY2hlY2tib3hcIlxuICAgICAgICAgICAgICBbdGl0bGVdPVwiJ1Nob3cgc2xpZGVyJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgIG5hbWU9XCJzaG93U2xpZGVyXCJcbiAgICAgICAgICAgICAgICB0eXBlPVwiY2hlY2tib3hcIlxuICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cInNob3dTbGlkZXJcIlxuICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICA8c3Bhbj48L3NwYW4+XG4gICAgICAgICAgICAgIDxzcGFuIHRyYW5zbGF0ZT5TaG93IHNsaWRlcjwvc3Bhbj5cbiAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgPC9jOHktZm9ybS1ncm91cD5cbiAgICAgICAgPC9maWVsZHNldD5cbiAgICAgIDwvZm9ybT5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L2Rpdj5cbjxuZy10ZW1wbGF0ZSAjZGF0ZVNlbGVjdGlvbkhlbHBUZW1wbGF0ZT5cbiAgPGRpdiBbaW5uZXJIVE1MXT1cImRhdGVTZWxlY3Rpb25IZWxwXCI+PC9kaXY+XG48L25nLXRlbXBsYXRlPlxuIl19
240
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YXBvaW50cy1ncmFwaC13aWRnZXQtY29uZmlnLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3dpZGdldHMvaW1wbGVtZW50YXRpb25zL2RhdGFwb2ludHMtZ3JhcGgvZGF0YXBvaW50cy1ncmFwaC1jb25maWcvZGF0YXBvaW50cy1ncmFwaC13aWRnZXQtY29uZmlnLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3dpZGdldHMvaW1wbGVtZW50YXRpb25zL2RhdGFwb2ludHMtZ3JhcGgvZGF0YXBvaW50cy1ncmFwaC1jb25maWcvZGF0YXBvaW50cy1ncmFwaC13aWRnZXQtY29uZmlnLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBcUIsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3RGLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRWpFLE9BQU8sRUFDTCxZQUFZLEVBQ1osVUFBVSxFQUVWLFdBQVcsRUFDWCxPQUFPLEVBRVAsaUNBQWlDLEVBQ2xDLE1BQU0scUJBQXFCLENBQUM7QUFDN0IsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDdkQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzNDLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDL0IsT0FBTyxFQUdMLHVCQUF1QixFQUV4QixNQUFNLHdDQUF3QyxDQUFDO0FBQ2hELE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFFakMsT0FBTyxFQUNMLHlCQUF5QixFQUN6QixxQkFBcUIsRUFDdEIsTUFBTSx1Q0FBdUMsQ0FBQztBQUMvQyxPQUFPLEVBRUwsd0JBQXdCLEVBRXpC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RnBDLENBQUMsa0JBQWtCLEVBQUUsa0JBQWtCLENBQUMsMEJDL0RyRCx1bFpBZ1ZBLDJDRDNSSSxZQUFZLHVnQkFDWixVQUFVLG92REFDVixXQUFXLDhCQUNYLGFBQWEsaWtCQUNiLGFBQWEsK1ZBQ2IsZUFBZSwyTkFDZix1QkFBdUIscVRBQ3ZCLHdCQUF3QixzVUFDeEIsb0JBQW9COzs0RkFJWCxvQ0FBb0M7a0JBbEJoRCxTQUFTOytCQUNFLG9DQUFvQyxRQUN4QyxFQUFFLEtBQUssRUFBRSxZQUFZLEVBQUUsY0FFakIsSUFBSSxXQUNQO3dCQUNQLFlBQVk7d0JBQ1osVUFBVTt3QkFDVixXQUFXO3dCQUNYLGFBQWE7d0JBQ2IsYUFBYTt3QkFDYixlQUFlO3dCQUNmLHVCQUF1Qjt3QkFDdkIsd0JBQXdCO3dCQUN4QixvQkFBb0I7cUJBQ3JCLGFBQ1UsQ0FBQyxrQkFBa0IsRUFBRSxrQkFBa0IsQ0FBQzs7MEJBMENoRCxRQUFROzswQkFDUixRQUFRO3lDQXhDRixNQUFNO3NCQUFkLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIGluamVjdCwgSW5wdXQsIE9uRGVzdHJveSwgT25Jbml0LCBPcHRpb25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRm9ybUJ1aWxkZXIsIE5nRm9ybSwgVmFsaWRhdG9ycyB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IE9ic2VydmFibGUgfSBmcm9tICdyeGpzL2ludGVybmFsL09ic2VydmFibGUnO1xuaW1wb3J0IHtcbiAgQ29tbW9uTW9kdWxlLFxuICBDb3JlTW9kdWxlLFxuICBEeW5hbWljQ29tcG9uZW50QWxlcnRBZ2dyZWdhdG9yLFxuICBGb3Jtc01vZHVsZSxcbiAgZ2V0dGV4dCxcbiAgT25CZWZvcmVTYXZlLFxuICBXaWRnZXRUaW1lQ29udGV4dERhdGVSYW5nZVNlcnZpY2Vcbn0gZnJvbSAnQGM4eS9uZ3gtY29tcG9uZW50cyc7XG5pbXBvcnQgeyBUcmFuc2xhdGVTZXJ2aWNlIH0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XG5pbXBvcnQgeyB0YWtlVW50aWwgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQge1xuICBEYXRhcG9pbnRBdHRyaWJ1dGVzRm9ybUNvbmZpZyxcbiAgRGF0YXBvaW50U2VsZWN0b3JNb2RhbE9wdGlvbnMsXG4gIERhdGFwb2ludFNlbGVjdG9yTW9kdWxlLFxuICBLUElEZXRhaWxzXG59IGZyb20gJ0BjOHkvbmd4LWNvbXBvbmVudHMvZGF0YXBvaW50LXNlbGVjdG9yJztcbmltcG9ydCB7IG9taXQgfSBmcm9tICdsb2Rhc2gtZXMnO1xuaW1wb3J0IHsgYWdncmVnYXRpb25UeXBlIH0gZnJvbSAnQGM4eS9jbGllbnQnO1xuaW1wb3J0IHtcbiAgQ29udGV4dERhc2hib2FyZENvbXBvbmVudCxcbiAgV2lkZ2V0Q29uZmlnQ29tcG9uZW50XG59IGZyb20gJ0BjOHkvbmd4LWNvbXBvbmVudHMvY29udGV4dC1kYXNoYm9hcmQnO1xuaW1wb3J0IHtcbiAgQWxhcm1EZXRhaWxzLFxuICBBbGFybUV2ZW50U2VsZWN0b3JNb2R1bGUsXG4gIEV2ZW50RGV0YWlsc1xufSBmcm9tICdAYzh5L25neC1jb21wb25lbnRzL2FsYXJtLWV2ZW50LXNlbGVjdG9yJztcbmltcG9ydCB7IFRvb2x0aXBNb2R1bGUgfSBmcm9tICduZ3gtYm9vdHN0cmFwL3Rvb2x0aXAnO1xuaW1wb3J0IHsgUG9wb3Zlck1vZHVsZSB9IGZyb20gJ25neC1ib290c3RyYXAvcG9wb3Zlcic7XG5pbXBvcnQge1xuICBDaGFydEFsYXJtc1NlcnZpY2UsXG4gIENoYXJ0RXZlbnRzU2VydmljZSxcbiAgQ2hhcnRzQ29tcG9uZW50LFxuICBEYXRhcG9pbnRzR3JhcGhLUElEZXRhaWxzLFxuICBEYXRhcG9pbnRzR3JhcGhXaWRnZXRDb25maWcsXG4gIERhdGFwb2ludHNHcmFwaFdpZGdldFRpbWVQcm9wcyxcbiAgREFURV9TRUxFQ1RJT05fRVhURU5ERUQsXG4gIFRpbWVDb250ZXh0UHJvcHNcbn0gZnJvbSAnQGM4eS9uZ3gtY29tcG9uZW50cy9lY2hhcnQnO1xuaW1wb3J0IHsgVGltZUNvbnRleHRDb21wb25lbnQgfSBmcm9tICdAYzh5L25neC1jb21wb25lbnRzL3RpbWUtY29udGV4dCc7XG5pbXBvcnQgeyBJbnRlcnZhbCB9IGZyb20gJ0BjOHkvbmd4LWNvbXBvbmVudHMvaW50ZXJ2YWwtcGlja2VyJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYzh5LWRhdGFwb2ludHMtZ3JhcGgtd2lkZ2V0LWNvbmZpZycsXG4gIGhvc3Q6IHsgY2xhc3M6ICdkLWNvbnRlbnRzJyB9LFxuICB0ZW1wbGF0ZVVybDogJy4vZGF0YXBvaW50cy1ncmFwaC13aWRnZXQtY29uZmlnLmNvbXBvbmVudC5odG1sJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW1xuICAgIENvbW1vbk1vZHVsZSxcbiAgICBDb3JlTW9kdWxlLFxuICAgIEZvcm1zTW9kdWxlLFxuICAgIFRvb2x0aXBNb2R1bGUsXG4gICAgUG9wb3Zlck1vZHVsZSxcbiAgICBDaGFydHNDb21wb25lbnQsXG4gICAgRGF0YXBvaW50U2VsZWN0b3JNb2R1bGUsXG4gICAgQWxhcm1FdmVudFNlbGVjdG9yTW9kdWxlLFxuICAgIFRpbWVDb250ZXh0Q29tcG9uZW50XG4gIF0sXG4gIHByb3ZpZGVyczogW0NoYXJ0RXZlbnRzU2VydmljZSwgQ2hhcnRBbGFybXNTZXJ2aWNlXVxufSlcbmV4cG9ydCBjbGFzcyBEYXRhcG9pbnRzR3JhcGhXaWRnZXRDb25maWdDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uQmVmb3JlU2F2ZSwgT25EZXN0cm95IHtcbiAgQElucHV0KCkgY29uZmlnOiBEYXRhcG9pbnRzR3JhcGhXaWRnZXRDb25maWcgfCB1bmRlZmluZWQ7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBmb3JtQnVpbGRlciA9IGluamVjdChGb3JtQnVpbGRlcik7XG4gIHByaXZhdGUgcmVhZG9ubHkgZm9ybSA9IGluamVjdChOZ0Zvcm0pO1xuICBwcml2YXRlIHJlYWRvbmx5IHRyYW5zbGF0ZSA9IGluamVjdChUcmFuc2xhdGVTZXJ2aWNlKTtcbiAgcHJpdmF0ZSByZWFkb25seSB3aWRnZXRUaW1lQ29udGV4dERhdGVSYW5nZVNlcnZpY2UgPSBpbmplY3QoV2lkZ2V0VGltZUNvbnRleHREYXRlUmFuZ2VTZXJ2aWNlKTtcblxuICBhbGVydHM6IER5bmFtaWNDb21wb25lbnRBbGVydEFnZ3JlZ2F0b3IgfCB1bmRlZmluZWQ7XG4gIGZvcm1Hcm91cDogUmV0dXJuVHlwZTxEYXRhcG9pbnRzR3JhcGhXaWRnZXRDb25maWdDb21wb25lbnRbJ2luaXRGb3JtJ10+O1xuICBEQVRFX1NFTEVDVElPTiA9IERBVEVfU0VMRUNUSU9OX0VYVEVOREVEO1xuICBkYXRlU2VsZWN0aW9uOiBEQVRFX1NFTEVDVElPTl9FWFRFTkRFRCB8IHVuZGVmaW5lZDtcbiAgZGF0ZVNlbGVjdGlvbkhlbHAgPSB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KFxuICAgIGdldHRleHQoYENob29zZSBob3cgdG8gc2VsZWN0IGEgZGF0ZSByYW5nZSwgdGhlIGF2YWlsYWJsZSBvcHRpb25zIGFyZTpcbiAgPHVsIGNsYXNzPVwibS1sLTAgcC1sLTggbS10LTggbS1iLTBcIj5cbiAgICA8bGk+XG4gICAgICA8Yj5XaWRnZXQgY29uZmlndXJhdGlvbjo8L2I+XG4gICAgICByZXN0cmljdHMgdGhlIGRhdGUgc2VsZWN0aW9uIG9ubHkgdG8gdGhlIHdpZGdldCBjb25maWd1cmF0aW9uXG4gICAgPC9saT5cbiAgICA8bGk+XG4gICAgICA8Yj5XaWRnZXQgYW5kIHdpZGdldCBjb25maWd1cmF0aW9uOjwvYj5cbiAgICAgIHJlc3RyaWN0cyB0aGUgZGF0ZSBzZWxlY3Rpb24gdG8gdGhlIHdpZGdldCB2aWV3IGFuZCB3aWRnZXQgY29uZmlndXJhdGlvbiBvbmx5XG4gICAgPC9saT5cbiAgICA8bGk+XG4gICAgICA8Yj5EYXNoYm9hcmQgdGltZSByYW5nZTo8L2I+XG4gICAgICByZXN0cmljdHMgZGF0ZSBzZWxlY3Rpb24gdG8gdGhlIGdsb2JhbCBkYXNoYm9hcmQgY29uZmlndXJhdGlvbiBvbmx5XG4gICAgPC9saT5cbiAgPC91bD5gKVxuICApO1xuICBkYXRhcG9pbnRTZWxlY3REZWZhdWx0Rm9ybU9wdGlvbnM6IFBhcnRpYWw8RGF0YXBvaW50QXR0cmlidXRlc0Zvcm1Db25maWc+ID0ge1xuICAgIHNob3dSYW5nZTogdHJ1ZSxcbiAgICBzaG93Q2hhcnQ6IHRydWVcbiAgfTtcbiAgZGF0YXBvaW50U2VsZWN0aW9uQ29uZmlnOiBQYXJ0aWFsPERhdGFwb2ludFNlbGVjdG9yTW9kYWxPcHRpb25zPiA9IHt9O1xuICBhY3RpdmVEYXRhcG9pbnRzRXhpc3RzID0gZmFsc2U7XG4gIGFsYXJtc09yRXZlbnRzSGF2ZU5vTWF0Y2hpbmdEcHMgPSBmYWxzZTtcbiAgdGltZVByb3BzOiBEYXRhcG9pbnRzR3JhcGhXaWRnZXRUaW1lUHJvcHMgfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgZGVzdHJveSQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIEBPcHRpb25hbCgpIHByaXZhdGUgd2lkZ2V0Q29uZmlnOiBXaWRnZXRDb25maWdDb21wb25lbnQsXG4gICAgQE9wdGlvbmFsKCkgcHJpdmF0ZSBkYXNoYm9hcmRDb250ZXh0Q29tcG9uZW50OiBDb250ZXh0RGFzaGJvYXJkQ29tcG9uZW50XG4gICkge1xuICAgIHRoaXMuZm9ybUdyb3VwID0gdGhpcy5pbml0Rm9ybSgpO1xuICB9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgdGhpcy5jb25maWc/LmRhdGFwb2ludHM/LmZvckVhY2goZHAgPT4gdGhpcy5hc3NpZ25Db250ZXh0RnJvbUNvbnRleHREYXNoYm9hcmQoZHApKTtcbiAgICB0aGlzLmZvcm0uZm9ybS5hZGRDb250cm9sKCdjb25maWcnLCB0aGlzLmZvcm1Hcm91cCk7XG4gICAgdGhpcy5mb3JtR3JvdXAucGF0Y2hWYWx1ZSh0aGlzLmNvbmZpZyB8fCB7fSk7XG4gICAgdGhpcy5mb3JtR3JvdXAuY29udHJvbHMuYWxhcm1zLnNldFZhbHVlKFxuICAgICAgdGhpcy5jb25maWc/LmFsYXJtc0V2ZW50c0NvbmZpZ3M/LmZpbHRlcihhZSA9PiBhZS50aW1lbGluZVR5cGUgPT09ICdBTEFSTScpIGFzIEFsYXJtRGV0YWlsc1tdXG4gICAgKTtcbiAgICB0aGlzLmZvcm1Hcm91cC5jb250cm9scy5ldmVudHMuc2V0VmFsdWUoXG4gICAgICB0aGlzLmNvbmZpZz8uYWxhcm1zRXZlbnRzQ29uZmlncz8uZmlsdGVyKGFlID0+IGFlLnRpbWVsaW5lVHlwZSA9PT0gJ0VWRU5UJykgYXMgRXZlbnREZXRhaWxzW11cbiAgICApO1xuXG4gICAgdGhpcy5pbml0RGF0ZVNlbGVjdGlvbigpO1xuICAgIHRoaXMuc2V0QWN0aXZlRGF0YXBvaW50c0V4aXN0cygpO1xuICAgIHRoaXMuY2hlY2tGb3JNYXRjaGluZ0RhdGFwb2ludHMoKTtcbiAgICB0aGlzLmZvcm1Hcm91cC52YWx1ZUNoYW5nZXMucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpLnN1YnNjcmliZSh2YWx1ZSA9PiB7XG4gICAgICB0aGlzLmNvbmZpZyA9IHtcbiAgICAgICAgLi4udmFsdWUsXG4gICAgICAgIGFsYXJtc0V2ZW50c0NvbmZpZ3M6IFtcbiAgICAgICAgICAuLi4odGhpcy5mb3JtR3JvdXAudmFsdWUuYWxhcm1zIHx8IFtdKSxcbiAgICAgICAgICAuLi4odGhpcy5mb3JtR3JvdXAudmFsdWUuZXZlbnRzIHx8IFtdKVxuICAgICAgICBdXG4gICAgICB9O1xuICAgICAgdGhpcy5zZXRBY3RpdmVEYXRhcG9pbnRzRXhpc3RzKCk7XG4gICAgICB0aGlzLmNoZWNrRm9yTWF0Y2hpbmdEYXRhcG9pbnRzKCk7XG4gICAgfSk7XG5cbiAgICBpZiAodGhpcy5jb25maWc/LndpZGdldEluc3RhbmNlR2xvYmFsVGltZUNvbnRleHQpIHtcbiAgICAgIHRoaXMudXBkYXRlRGFzaGJvYXJkVGltZUNvbnRleHQodGhpcy53aWRnZXRUaW1lQ29udGV4dERhdGVSYW5nZVNlcnZpY2UuaW5pdGlhbFRpbWVSYW5nZSgpKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5jb25maWcuZGF0ZUZyb20gJiYgdGhpcy5jb25maWcuZGF0ZVRvKSB7XG4gICAgICB0aGlzLnRpbWVQcm9wcyA9IHtcbiAgICAgICAgZGF0ZUZyb206IG5ldyBEYXRlKHRoaXMuY29uZmlnPy5kYXRlRnJvbSksXG4gICAgICAgIGRhdGVUbzogbmV3IERhdGUodGhpcy5jb25maWc/LmRhdGVUbyksXG4gICAgICAgIGludGVydmFsOiB0aGlzLmNvbmZpZz8uaW50ZXJ2YWwsXG4gICAgICAgIHJlYWx0aW1lOiB0aGlzLmNvbmZpZz8ucmVhbHRpbWUsXG4gICAgICAgIGFnZ3JlZ2F0aW9uOiB0aGlzLmNvbmZpZz8ucmVhbHRpbWUgPyBudWxsIDogdGhpcy5jb25maWc/LmFnZ3JlZ2F0aW9uXG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIG5nT25EZXN0cm95KCkge1xuICAgIHRoaXMuZGVzdHJveSQubmV4dCgpO1xuICAgIHRoaXMuZGVzdHJveSQuY29tcGxldGUoKTtcbiAgfVxuXG4gIG9uQmVmb3JlU2F2ZShcbiAgICBjb25maWc/OiBEYXRhcG9pbnRzR3JhcGhXaWRnZXRDb25maWdcbiAgKTogYm9vbGVhbiB8IFByb21pc2U8Ym9vbGVhbj4gfCBPYnNlcnZhYmxlPGJvb2xlYW4+IHtcbiAgICBpZiAodGhpcy5mb3JtR3JvdXAudmFsaWQgJiYgY29uZmlnKSB7XG4gICAgICBPYmplY3QuYXNzaWduKGNvbmZpZywgb21pdCh0aGlzLmZvcm1Hcm91cC52YWx1ZSwgWydhbGFybXMnLCAnZXZlbnRzJ10pLCB7XG4gICAgICAgIGFsYXJtc0V2ZW50c0NvbmZpZ3M6IFtcbiAgICAgICAgICAuLi4odGhpcy5mb3JtR3JvdXAudmFsdWUuYWxhcm1zIHx8IFtdKSxcbiAgICAgICAgICAuLi4odGhpcy5mb3JtR3JvdXAudmFsdWUuZXZlbnRzIHx8IFtdKVxuICAgICAgICBdXG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHRpbWVQcm9wc0NoYW5nZWQodGltZVByb3BzOiBUaW1lQ29udGV4dFByb3BzKTogdm9pZCB7XG4gICAgaWYgKHRpbWVQcm9wcy5yZWFsdGltZSAhPT0gdGhpcy5jb25maWcucmVhbHRpbWUpIHtcbiAgICAgIHRoaXMuZm9ybUdyb3VwLnBhdGNoVmFsdWUoeyByZWFsdGltZTogdGltZVByb3BzLnJlYWx0aW1lIH0pO1xuICAgIH1cbiAgICBpZiAodGltZVByb3BzLnJlYWx0aW1lKSB7XG4gICAgICBpZiAodGltZVByb3BzLmN1cnJlbnREYXRlQ29udGV4dEludGVydmFsICE9PSB0aGlzLmZvcm1Hcm91cC52YWx1ZS5pbnRlcnZhbCkge1xuICAgICAgICB0aGlzLmZvcm1Hcm91cC5wYXRjaFZhbHVlKHsgaW50ZXJ2YWw6IHRpbWVQcm9wcy5jdXJyZW50RGF0ZUNvbnRleHRJbnRlcnZhbCB9KTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgcGF0Y2hWYWx1ZXMgPSB7XG4gICAgICBkYXRlRnJvbTogbmV3IERhdGUodGltZVByb3BzLmN1cnJlbnREYXRlQ29udGV4dEZyb21EYXRlKSxcbiAgICAgIGRhdGVUbzogbmV3IERhdGUodGltZVByb3BzLmN1cnJlbnREYXRlQ29udGV4dFRvRGF0ZSksXG4gICAgICBpbnRlcnZhbDogdGltZVByb3BzLmN1cnJlbnREYXRlQ29udGV4dEludGVydmFsLFxuICAgICAgLi4uKHRpbWVQcm9wcy5hZ2dyZWdhdGlvbiAmJiB7IGFnZ3JlZ2F0aW9uOiB0aW1lUHJvcHMuYWdncmVnYXRpb24gfSksXG4gICAgICAuLi4odGltZVByb3BzLnJlYWx0aW1lICYmIHsgcmVhbHRpbWU6IHRpbWVQcm9wcy5yZWFsdGltZSB9KVxuICAgIH07XG5cbiAgICB0aGlzLmZvcm1Hcm91cC5wYXRjaFZhbHVlKHBhdGNoVmFsdWVzKTtcbiAgfVxuXG4gIHVwZGF0ZURhc2hib2FyZFRpbWVDb250ZXh0KHRpbWVQcm9wczogRGF0YXBvaW50c0dyYXBoV2lkZ2V0VGltZVByb3BzKTogdm9pZCB7XG4gICAgY29uc3QgaW5pdGlhbFRpbWVSYW5nZSA9IHtcbiAgICAgIGRhdGVGcm9tOiB0aW1lUHJvcHMuZGF0ZUZyb20sXG4gICAgICBkYXRlVG86IHRpbWVQcm9wcy5kYXRlVG8sXG4gICAgICBpbnRlcnZhbDogdGltZVByb3BzLmludGVydmFsIHx8ICdjdXN0b20nXG4gICAgfTtcbiAgICBpZiAoIXRoaXMud2lkZ2V0VGltZUNvbnRleHREYXRlUmFuZ2VTZXJ2aWNlLmluaXRpYWxUaW1lUmFuZ2UoKSkge1xuICAgICAgdGhpcy53aWRnZXRUaW1lQ29udGV4dERhdGVSYW5nZVNlcnZpY2UudXBkYXRlSW5pdGlhbFRpbWVSYW5nZShpbml0aWFsVGltZVJhbmdlKTtcbiAgICB9XG4gICAgdGhpcy5mb3JtR3JvdXAucGF0Y2hWYWx1ZSh7IC4uLnRpbWVQcm9wcywgLi4uaW5pdGlhbFRpbWVSYW5nZSB9KTtcbiAgfVxuXG4gIHVwZGF0ZVRpbWVSYW5nZU9uUmVhbHRpbWUoXG4gICAgdGltZVJhbmdlOiBQaWNrPERhdGFwb2ludHNHcmFwaFdpZGdldENvbmZpZywgJ2RhdGVGcm9tJyB8ICdkYXRlVG8nPlxuICApOiB2b2lkIHtcbiAgICB0aGlzLmZvcm1Hcm91cC5wYXRjaFZhbHVlKHRpbWVSYW5nZSwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICB9XG5cbiAgZGF0ZVNlbGVjdGlvbkNoYW5nZShkYXRlU2VsZWN0aW9uOiBEQVRFX1NFTEVDVElPTl9FWFRFTkRFRCk6IHZvaWQge1xuICAgIHRoaXMuZGF0ZVNlbGVjdGlvbiA9IGRhdGVTZWxlY3Rpb247XG5cbiAgICBpZiAoZGF0ZVNlbGVjdGlvbiA9PT0gREFURV9TRUxFQ1RJT05fRVhURU5ERUQuQ09ORklHKSB7XG4gICAgICB0aGlzLmZvcm1Hcm91cC5jb250cm9scy5kaXNwbGF5RGF0ZVNlbGVjdGlvbi5lbmFibGUoKTtcbiAgICAgIHRoaXMuZm9ybUdyb3VwLnBhdGNoVmFsdWUoeyB3aWRnZXRJbnN0YW5jZUdsb2JhbFRpbWVDb250ZXh0OiBmYWxzZSB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBkaXNwbGF5RGF0ZVNlbGVjdGlvbiBzaG91bGQgYmUgZmFsc2UgYW5kIGRpc2FibGVkIHdoZW4gZGF0ZVNlbGVjdGlvbiBpcyBub3QgQ09ORklHXG4gICAgdGhpcy5mb3JtR3JvdXAuY29udHJvbHMuZGlzcGxheURhdGVTZWxlY3Rpb24uZGlzYWJsZSgpO1xuICAgIHRoaXMuZm9ybUdyb3VwLnBhdGNoVmFsdWUoe1xuICAgICAgd2lkZ2V0SW5zdGFuY2VHbG9iYWxUaW1lQ29udGV4dDogdHJ1ZSxcbiAgICAgIHJlYWx0aW1lOiBmYWxzZSxcbiAgICAgIGRpc3BsYXlEYXRlU2VsZWN0aW9uOiBmYWxzZVxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3NpZ25Db250ZXh0RnJvbUNvbnRleHREYXNoYm9hcmQoZGF0YXBvaW50OiBLUElEZXRhaWxzKSB7XG4gICAgaWYgKCF0aGlzLmRhc2hib2FyZENvbnRleHRDb21wb25lbnQ/LmlzRGV2aWNlVHlwZURhc2hib2FyZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBjb250ZXh0ID0gdGhpcy53aWRnZXRDb25maWc/LmNvbnRleHQ7XG4gICAgaWYgKGNvbnRleHQ/LmlkKSB7XG4gICAgICBjb25zdCB7IG5hbWUsIGlkIH0gPSBjb250ZXh0O1xuICAgICAgZGF0YXBvaW50Ll9fdGFyZ2V0ID0geyBuYW1lLCBpZCB9O1xuICAgICAgdGhpcy5kYXRhcG9pbnRTZWxlY3Rpb25Db25maWcuY29udGV4dEFzc2V0ID0geyBpZCB9O1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgY2hlY2tGb3JNYXRjaGluZ0RhdGFwb2ludHMoKTogdm9pZCB7XG4gICAgY29uc3QgYWxsTWF0Y2ggPSB0aGlzLmNvbmZpZz8uYWxhcm1zRXZlbnRzQ29uZmlncz8uZXZlcnkoYWUgPT5cbiAgICAgIHRoaXMuZm9ybUdyb3VwLnZhbHVlLmRhdGFwb2ludHM/LnNvbWUoZHAgPT4gZHAuX190YXJnZXQ/LmlkID09PSBhZS5fX3RhcmdldD8uaWQpXG4gICAgKTtcblxuICAgIHF1ZXVlTWljcm90YXNrKCgpID0+IHtcbiAgICAgIGlmIChhbGxNYXRjaCkge1xuICAgICAgICB0aGlzLmFsYXJtc09yRXZlbnRzSGF2ZU5vTWF0Y2hpbmdEcHMgPSBmYWxzZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuYWxhcm1zT3JFdmVudHNIYXZlTm9NYXRjaGluZ0RwcyA9IHRydWU7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGluaXRGb3JtKCkge1xuICAgIGNvbnN0IGZvcm0gPSB0aGlzLmZvcm1CdWlsZGVyLmdyb3VwKHtcbiAgICAgIGRhdGFwb2ludHM6IFtcbiAgICAgICAgW10gYXMgRGF0YXBvaW50c0dyYXBoS1BJRGV0YWlsc1tdLFxuICAgICAgICBbVmFsaWRhdG9ycy5yZXF1aXJlZCwgVmFsaWRhdG9ycy5taW5MZW5ndGgoMSldXG4gICAgICBdLFxuICAgICAgYWxhcm1zOiBbW10gYXMgQWxhcm1EZXRhaWxzW11dLFxuICAgICAgZXZlbnRzOiBbW10gYXMgRXZlbnREZXRhaWxzW11dLFxuICAgICAgZGlzcGxheU1hcmtlZExpbmU6IFt0cnVlLCBbXV0sXG4gICAgICBkaXNwbGF5TWFya2VkUG9pbnQ6IFt0cnVlLCBbXV0sXG4gICAgICBtZXJnZU1hdGNoaW5nRGF0YXBvaW50czogW3RydWUsIFtdXSxcbiAgICAgIGZvcmNlTWVyZ2VEYXRhcG9pbnRzOiBbZmFsc2UsIFtdXSxcbiAgICAgIHNob3dMYWJlbEFuZFVuaXQ6IFt0cnVlLCBbXV0sXG4gICAgICBkaXNwbGF5RGF0ZVNlbGVjdGlvbjogW2ZhbHNlLCBbXV0sXG4gICAgICBkaXNwbGF5QWdncmVnYXRpb25TZWxlY3Rpb246IFtmYWxzZSwgW11dLFxuICAgICAgd2lkZ2V0SW5zdGFuY2VHbG9iYWxUaW1lQ29udGV4dDogW2ZhbHNlLCBbXV0sXG4gICAgICBjYW5EZWNvdXBsZUdsb2JhbFRpbWVDb250ZXh0OiBbZmFsc2UsIFtdXSxcbiAgICAgIGRhdGVGcm9tOiBbbnVsbCBhcyB1bmtub3duIGFzIERhdGUsIFtdXSxcbiAgICAgIGRhdGVUbzogW251bGwgYXMgdW5rbm93biBhcyBEYXRlLCBbXV0sXG4gICAgICBpbnRlcnZhbDogWydkYXlzJyBhcyBJbnRlcnZhbFsnaWQnXSwgW1ZhbGlkYXRvcnMucmVxdWlyZWRdXSxcbiAgICAgIGFnZ3JlZ2F0aW9uOiBbbnVsbCBhcyBhZ2dyZWdhdGlvblR5cGUgfCBudWxsLCBbXV0sXG4gICAgICByZWFsdGltZTogW2ZhbHNlLCBbVmFsaWRhdG9ycy5yZXF1aXJlZF1dLFxuICAgICAgc2hvd1NsaWRlcjogW3RydWUsIFtWYWxpZGF0b3JzLnJlcXVpcmVkXV0sXG4gICAgICB5QXhpc1NwbGl0TGluZXM6IFtmYWxzZSwgW1ZhbGlkYXRvcnMucmVxdWlyZWRdXSxcbiAgICAgIHhBeGlzU3BsaXRMaW5lczogW2ZhbHNlLCBbVmFsaWRhdG9ycy5yZXF1aXJlZF1dXG4gICAgfSk7XG4gICAgcmV0dXJuIGZvcm07XG4gIH1cblxuICBwcml2YXRlIGluaXREYXRlU2VsZWN0aW9uKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5jb25maWc/LndpZGdldEluc3RhbmNlR2xvYmFsVGltZUNvbnRleHQpIHtcbiAgICAgIHRoaXMuZGF0ZVNlbGVjdGlvbiA9IERBVEVfU0VMRUNUSU9OX0VYVEVOREVELkNPTkZJRztcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmRhdGVTZWxlY3Rpb24gPSBEQVRFX1NFTEVDVElPTl9FWFRFTkRFRC5EQVNIQk9BUkRfQ09OVEVYVDtcbiAgICB0aGlzLmZvcm1Hcm91cC5jb250cm9scy5kaXNwbGF5RGF0ZVNlbGVjdGlvbi5kaXNhYmxlKCk7XG4gIH1cblxuICBwcml2YXRlIHNldEFjdGl2ZURhdGFwb2ludHNFeGlzdHMoKSB7XG4gICAgdGhpcy5hY3RpdmVEYXRhcG9pbnRzRXhpc3RzID1cbiAgICAgICh0aGlzLmNvbmZpZz8uZGF0YXBvaW50cz8uZmlsdGVyKGRwID0+IGRwLl9fYWN0aXZlKT8ubGVuZ3RoIHx8IDApID4gMDtcbiAgfVxufVxuIiwiPGRpdiBjbGFzcz1cIm5vLWNhcmQtY29udGV4dCBkLWZsZXgtbWQgZml0LWgtLW1kXCI+XG4gIDxkaXYgY2xhc3M9XCJjb2wtbWQtNSBiZy1sZXZlbC0xIGNvbmYtY29sIGlubmVyLXNjcm9sbCBwLWwtMFwiPlxuICAgIDxkaXYgY2xhc3M9XCJwLWwtMjRcIj5cbiAgICAgIDxmb3JtIFtmb3JtR3JvdXBdPVwiZm9ybUdyb3VwXCI+XG4gICAgICAgIDxjOHktZGF0YXBvaW50LXNlbGVjdGlvbi1saXN0XG4gICAgICAgICAgY2xhc3M9XCJiZy1sZXZlbC0xIHNlcGFyYXRvci1ib3R0b20gZC1ibG9ja1wiXG4gICAgICAgICAgbmFtZT1cImRhdGFwb2ludHNcIlxuICAgICAgICAgIFttaW5BY3RpdmVDb3VudF09XCIxXCJcbiAgICAgICAgICBbZGVmYXVsdEZvcm1PcHRpb25zXT1cImRhdGFwb2ludFNlbGVjdERlZmF1bHRGb3JtT3B0aW9uc1wiXG4gICAgICAgICAgW2NvbmZpZ109XCJkYXRhcG9pbnRTZWxlY3Rpb25Db25maWdcIlxuICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cImRhdGFwb2ludHNcIlxuICAgICAgICA+PC9jOHktZGF0YXBvaW50LXNlbGVjdGlvbi1saXN0PlxuXG4gICAgICAgIDxjOHktYWxhcm0tZXZlbnQtc2VsZWN0aW9uLWxpc3RcbiAgICAgICAgICBjbGFzcz1cImJnLWxldmVsLTEgc2VwYXJhdG9yLWJvdHRvbSBkLWJsb2NrXCJcbiAgICAgICAgICBuYW1lPVwiYWxhcm1zXCJcbiAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJhbGFybXNcIlxuICAgICAgICAgIFt0aW1lbGluZVR5cGVdPVwiJ0FMQVJNJ1wiXG4gICAgICAgICAgW2RhdGFwb2ludHNdPVwiY29uZmlnPy5kYXRhcG9pbnRzXCJcbiAgICAgICAgPjwvYzh5LWFsYXJtLWV2ZW50LXNlbGVjdGlvbi1saXN0PlxuXG4gICAgICAgIDxjOHktYWxhcm0tZXZlbnQtc2VsZWN0aW9uLWxpc3RcbiAgICAgICAgICBjbGFzcz1cImJnLWluaGVyaXRcIlxuICAgICAgICAgIG5hbWU9XCJldmVudHNcIlxuICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cImV2ZW50c1wiXG4gICAgICAgICAgW3RpbWVsaW5lVHlwZV09XCInRVZFTlQnXCJcbiAgICAgICAgICBbZGF0YXBvaW50c109XCJjb25maWc/LmRhdGFwb2ludHNcIlxuICAgICAgICA+PC9jOHktYWxhcm0tZXZlbnQtc2VsZWN0aW9uLWxpc3Q+XG4gICAgICA8L2Zvcm0+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuXG4gIDxkaXYgY2xhc3M9XCJjb2wtbWQtNyBzdGlja3ktdG9wIHAtdC04IGlubmVyLXNjcm9sbCB3aWRnZXQtcHJldmlld1wiPlxuICAgIDxkaXYgY2xhc3M9XCJwLXItMjQgZC1jb2wgZml0LWhcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIHAtdC04IGZvcm0tZ3JvdXAtc20gZC1mbGV4IGEtaS1jZW50ZXIgbS1iLThcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBhLWktY2VudGVyIG0tci00XCI+XG4gICAgICAgICAgPGxhYmVsXG4gICAgICAgICAgICBjbGFzcz1cIm0tYi0wXCJcbiAgICAgICAgICAgIHRyYW5zbGF0ZVxuICAgICAgICAgID5cbiAgICAgICAgICAgIERhdGUgc2VsZWN0aW9uXG4gICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICBjbGFzcz1cImJ0bi1oZWxwIGJ0bi1oZWxwLS1zbVwiXG4gICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidIZWxwJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICBbcG9wb3Zlcl09XCJkYXRlU2VsZWN0aW9uSGVscFRlbXBsYXRlXCJcbiAgICAgICAgICAgIHBsYWNlbWVudD1cImJvdHRvbVwiXG4gICAgICAgICAgICB0cmlnZ2Vycz1cImZvY3VzXCJcbiAgICAgICAgICAgIGNvbnRhaW5lcj1cImJvZHlcIlxuICAgICAgICAgICAgW2FkYXB0aXZlUG9zaXRpb25dPVwiZmFsc2VcIlxuICAgICAgICAgID48L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjOHktc2VsZWN0LXdyYXBwZXJcIj5cbiAgICAgICAgICA8c2VsZWN0XG4gICAgICAgICAgICBjbGFzcz1cImZvcm0tY29udHJvbCBpbnB1dC1zbVwiXG4gICAgICAgICAgICBbbmdNb2RlbF09XCJkYXRlU2VsZWN0aW9uXCJcbiAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cImRhdGVTZWxlY3Rpb25DaGFuZ2UoJGV2ZW50KVwiXG4gICAgICAgICAgICBbbmdNb2RlbE9wdGlvbnNdPVwieyBzdGFuZGFsb25lOiB0cnVlIH1cIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxvcHRpb25cbiAgICAgICAgICAgICAgdGl0bGU9XCJ7eyAnRGFzaGJvYXJkIHRpbWUgcmFuZ2UnIHwgdHJhbnNsYXRlIH19XCJcbiAgICAgICAgICAgICAgW3ZhbHVlXT1cIkRBVEVfU0VMRUNUSU9OLkRBU0hCT0FSRF9DT05URVhUXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAge3sgJ0Rhc2hib2FyZCB0aW1lIHJhbmdlJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgPC9vcHRpb24+XG4gICAgICAgICAgICA8b3B0aW9uXG4gICAgICAgICAgICAgIHRpdGxlPVwie3sgJ1dpZGdldCBjb25maWd1cmF0aW9uJyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICAgICAgICAgIFt2YWx1ZV09XCJEQVRFX1NFTEVDVElPTi5DT05GSUdcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICB7eyAnV2lkZ2V0IGNvbmZpZ3VyYXRpb24nIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICA8L29wdGlvbj5cbiAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgICA8c3Bhbj48L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgICA8bGFiZWwgY2xhc3M9XCJ0ZXh0LTEyXCI+e3sgJ09wdGlvbnMnIHwgdHJhbnNsYXRlIH19PC9sYWJlbD5cbiAgICAgIDxjOHktdGltZS1jb250ZXh0XG4gICAgICAgICpuZ0lmPVwiXG4gICAgICAgICAgZGF0ZVNlbGVjdGlvbiA9PT0gREFURV9TRUxFQ1RJT04uQ09ORklHICYmXG4gICAgICAgICAgZm9ybUdyb3VwLmdldCgnZGlzcGxheURhdGVTZWxlY3Rpb24nKS52YWx1ZSA9PT0gdHJ1ZVxuICAgICAgICBcIlxuICAgICAgICBbY2hhbmdlZERhdGVDb250ZXh0XT1cInRpbWVQcm9wc1wiXG4gICAgICAgIFtjb250cm9sc0F2YWlsYWJsZV09XCJ7XG4gICAgICAgICAgcmVhbHRpbWU6IHRydWUsXG4gICAgICAgICAgdGltZVJhbmdlOiBjb25maWc/LmRpc3BsYXlEYXRlU2VsZWN0aW9uLFxuICAgICAgICAgIGludGVydmFsOiBjb25maWc/LmRpc3BsYXlEYXRlU2VsZWN0aW9uLFxuICAgICAgICAgIGFnZ3JlZ2F0aW9uOiBjb25maWc/LmRpc3BsYXlBZ2dyZWdhdGlvblNlbGVjdGlvblxuICAgICAgICB9XCJcbiAgICAgICAgKGNvbnRleHRDaGFuZ2UpPVwidGltZVByb3BzQ2hhbmdlZCgkZXZlbnQpXCJcbiAgICAgID48L2M4eS10aW1lLWNvbnRleHQ+XG4gICAgICA8Yzh5LWNoYXJ0c1xuICAgICAgICBjbGFzcz1cImQtYmxvY2sgcC1yZWxhdGl2ZVwiXG4gICAgICAgICpuZ0lmPVwiYWN0aXZlRGF0YXBvaW50c0V4aXN0c1wiXG4gICAgICAgIFtjb25maWddPVwiY29uZmlnXCJcbiAgICAgICAgW2FsZXJ0c109XCJhbGVydHNcIlxuICAgICAgICAodGltZVJhbmdlQ2hhbmdlT25SZWFsdGltZSk9XCJ1cGRhdGVUaW1lUmFuZ2VPblJlYWx0aW1lKCRldmVudClcIlxuICAgICAgICAoY29uZmlnQ2hhbmdlT25ab29tT3V0KT1cInVwZGF0ZURhc2hib2FyZFRpbWVDb250ZXh0KCRldmVudClcIlxuICAgICAgPjwvYzh5LWNoYXJ0cz5cblxuICAgICAgPGM4eS11aS1lbXB0eS1zdGF0ZVxuICAgICAgICBjbGFzcz1cImQtYmxvY2sgbS10LTI0XCJcbiAgICAgICAgW2ljb25dPVwiJ3NlYXJjaCdcIlxuICAgICAgICBbdGl0bGVdPVwiJ05vIGRhdGEgcG9pbnRzIHNlbGVjdGVkJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgIFtzdWJ0aXRsZV09XCInU2VsZWN0IGRhdGEgcG9pbnQgdG8gcmVuZGVyIGNoYXJ0JyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICpuZ0lmPVwiIWFjdGl2ZURhdGFwb2ludHNFeGlzdHNcIlxuICAgICAgPjwvYzh5LXVpLWVtcHR5LXN0YXRlPlxuXG4gICAgICA8Zm9ybVxuICAgICAgICBjbGFzcz1cImQtYmxvY2sgcC10LThcIlxuICAgICAgICBbZm9ybUdyb3VwXT1cImZvcm1Hcm91cFwiXG4gICAgICA+XG4gICAgICAgIDxsYWJlbD57eyAnRGlzcGxheSBvcHRpb25zJyB8IHRyYW5zbGF0ZSB9fTwvbGFiZWw+XG4gICAgICAgIDxmaWVsZHNldCBjbGFzcz1cImM4eS1maWVsZHNldCBtLWItMjQgbS10LTBcIj5cbiAgICAgICAgICA8bGVnZW5kPnt7ICdBeGlzJyB8IHRyYW5zbGF0ZSB9fTwvbGVnZW5kPlxuICAgICAgICAgIDxjOHktZm9ybS1ncm91cCBjbGFzcz1cInAtYi0xNiBtLWItMCBwLXQtOCBmb3JtLWdyb3VwLXNtXCI+XG4gICAgICAgICAgICA8bGFiZWxcbiAgICAgICAgICAgICAgY2xhc3M9XCJjOHktY2hlY2tib3hcIlxuICAgICAgICAgICAgICBbdGl0bGVdPVwiJ1ktYXhpcyBoZWxwZXIgbGluZXMnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgbmFtZT1cInlBeGlzU3BsaXRMaW5lc1wiXG4gICAgICAgICAgICAgICAgdHlwZT1cImNoZWNrYm94XCJcbiAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJ5QXhpc1NwbGl0TGluZXNcIlxuICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICA8c3Bhbj48L3NwYW4+XG4gICAgICAgICAgICAgIDxzcGFuIHRyYW5zbGF0ZT5ZLWF4aXMgaGVscGVyIGxpbmVzPC9zcGFuPlxuICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgIDxsYWJlbFxuICAgICAgICAgICAgICBjbGFzcz1cImM4eS1jaGVja2JveFwiXG4gICAgICAgICAgICAgIFt0aXRsZV09XCInWC1heGlzIGhlbHBlciBsaW5lcycgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICBuYW1lPVwieEF4aXNTcGxpdExpbmVzXCJcbiAgICAgICAgICAgICAgICB0eXBlPVwiY2hlY2tib3hcIlxuICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cInhBeGlzU3BsaXRMaW5lc1wiXG4gICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgIDxzcGFuPjwvc3Bhbj5cbiAgICAgICAgICAgICAgPHNwYW4gdHJhbnNsYXRlPlgtYXhpcyBoZWxwZXIgbGluZXM8L3NwYW4+XG4gICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgPGxhYmVsXG4gICAgICAgICAgICAgIGNsYXNzPVwiYzh5LWNoZWNrYm94XCJcbiAgICAgICAgICAgICAgW3RpdGxlXT1cIidNZXJnZSBtYXRjaGluZyBkYXRhIHBvaW50cyBpbnRvIHNpbmdsZSBheGlzJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgIG5hbWU9XCJtZXJnZU1hdGNoaW5nRGF0YXBvaW50c1wiXG4gICAgICAgICAgICAgICAgdHlwZT1cImNoZWNrYm94XCJcbiAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJtZXJnZU1hdGNoaW5nRGF0YXBvaW50c1wiXG4gICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgIDxzcGFuPjwvc3Bhbj5cbiAgICAgICAgICAgICAgPHNwYW4gdHJhbnNsYXRlPk1lcmdlIG1hdGNoaW5nIGRhdGEgcG9pbnRzIGludG8gc2luZ2xlIGF4aXM8L3NwYW4+XG4gICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICBjbGFzcz1cImJ0bi1kb3QgbS1sLThcIlxuICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiXG4gICAgICAgICAgICAgICAgICAnRGF0YSBwb2ludHMgd2l0aCB0aGUgc2FtZSBtaW4gYW5kIG1heCB2YWx1ZXMgd2lsbCBiZSBtZXJnZWQgaW50byBhIHNpbmdsZSBheGlzLiBUaGUgdmFsdWVzIG11c3QgYmUgZGVmaW5lZCBpbiB0aGUgZGF0YSBwb2ludCBjb25maWd1cmF0aW9uLidcbiAgICAgICAgICAgICAgICAgICAgfCB0cmFuc2xhdGVcbiAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgIFt0b29sdGlwXT1cIlxuICAgICAgICAgICAgICAgICAgJ0RhdGEgcG9pbnRzIHdpdGggdGhlIHNhbWUgbWluIGFuZCBtYXggdmFsdWVzIHdpbGwgYmUgbWVyZ2VkIGludG8gYSBzaW5nbGUgYXhpcy4gVGhlIHZhbHVlcyBtdXN0IGJlIGRlZmluZWQgaW4gdGhlIGRhdGEgcG9pbnQgY29uZmlndXJhdGlvbi4nXG4gICAgICAgICAgICAgICAgICAgIHwgdHJhbnNsYXRlXG4gICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICBjb250YWluZXI9XCJib2R5XCJcbiAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCJcbiAgICAgICAgICAgICAgICBbYWRhcHRpdmVQb3NpdGlvbl09XCJmYWxzZVwiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8aVxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ0ZXh0LWluZm9cIlxuICAgICAgICAgICAgICAgICAgYzh5SWNvbj1cImluZm9cIlxuICAgICAgICAgICAgICAgID48L2k+XG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgIDxsYWJlbFxuICAgICAgICAgICAgICBjbGFzcz1cImM4eS1jaGVja2JveFwiXG4gICAgICAgICAgICAgIFt0aXRsZV09XCInRm9yY2UgbWVyZ2UgYWxsIGRhdGEgcG9pbnRzIGludG8gc2luZ2xlIGF4aXMnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgbmFtZT1cImZvcmNlTWVyZ2VEYXRhcG9pbnRzXCJcbiAgICAgICAgICAgICAgICB0eXBlPVwiY2hlY2tib3hcIlxuICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cImZvcmNlTWVyZ2VEYXRhcG9pbnRzXCJcbiAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgPHNwYW4+PC9zcGFuPlxuICAgICAgICAgICAgICA8c3BhbiB0cmFuc2xhdGU+Rm9yY2UgbWVyZ2UgYWxsIGRhdGFwb2ludHMgaW50byBhIHNpbmdsZSBheGlzPC9zcGFuPlxuICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJidG4tZG90IG0tbC04XCJcbiAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIlxuICAgICAgICAgICAgICAgICAgJ0FsbCBheGVzIHdpbGwgYmUgZm9yY2UgbWVyZ2VkIHRvIGEgc2luZ2xlIGF4aXMgd2l0aCB0aGUgc2NhbGUgYmVpbmcgc2V0IHRvIHRoZSBtYXggYW5kIG1pbiB2YWx1ZSBvZiBhbGwgYXhlcy4gSXRcXCdzIHJlY29tbWVuZGVkIHRvIHVzZSB0aGlzIG9wdGlvbiBmb3IgZGF0YSBwb2ludHMgd2l0aCBzaW1pbGFyIHZhbHVlcy4nXG4gICAgICAgICAgICAgICAgICAgIHwgdHJhbnNsYXRlXG4gICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICBbdG9vbHRpcF09XCJcbiAgICAgICAgICAgICAgICAgICdBbGwgYXhlcyB3aWxsIGJlIGZvcmNlIG1lcmdlZCB0byBhIHNpbmdsZSBheGlzIHdpdGggdGhlIHNjYWxlIGJlaW5nIHNldCB0byB0aGUgbWF4IGFuZCBtaW4gdmFsdWUgb2YgYWxsIGF4ZXMuIEl0XFwncyByZWNvbW1lbmRlZCB0byB1c2UgdGhpcyBvcHRpb24gZm9yIGRhdGEgcG9pbnRzIHdpdGggc2ltaWxhciB2YWx1ZXMuJ1xuICAgICAgICAgICAgICAgICAgICB8IHRyYW5zbGF0ZVxuICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgY29udGFpbmVyPVwiYm9keVwiXG4gICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiXG4gICAgICAgICAgICAgICAgW2FkYXB0aXZlUG9zaXRpb25dPVwiZmFsc2VcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPGlcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwidGV4dC1pbmZvXCJcbiAgICAgICAgICAgICAgICAgIGM4eUljb249XCJpbmZvXCJcbiAgICAgICAgICAgICAgICA+PC9pPlxuICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgPC9jOHktZm9ybS1ncm91cD5cbiAgICAgICAgPC9maWVsZHNldD5cbiAgICAgICAgPGZpZWxkc2V0IGNsYXNzPVwiYzh5LWZpZWxkc2V0IG0tYi0yNCBtLXQtMFwiPlxuICAgICAgICAgIDxsZWdlbmQ+e3sgJ0FsYXJtcyAmIGV2ZW50cycgfCB0cmFuc2xhdGUgfX08L2xlZ2VuZD5cbiAgICAgICAgICA8Yzh5LWZvcm0tZ3JvdXAgY2xhc3M9XCJwLWItMTYgbS1iLTAgcC10LTggZm9ybS1ncm91cC1zbVwiPlxuICAgICAgICAgICAgPGxhYmVsXG4gICAgICAgICAgICAgIGNsYXNzPVwiYzh5LWNoZWNrYm94XCJcbiAgICAgICAgICAgICAgW3RpdGxlXT1cIidTaG93IHZlcnRpY2FsIGxpbmUgb24gZXZlcnkgb2NjdXJyZW5jZScgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICBuYW1lPVwiZGlzcGxheU1hcmtlZExpbmVcIlxuICAgICAgICAgICAgICAgIHR5cGU9XCJjaGVja2JveFwiXG4gICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwiZGlzcGxheU1hcmtlZExpbmVcIlxuICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICA8c3Bhbj48L3NwYW4+XG4gICAgICAgICAgICAgIDxzcGFuIHRyYW5zbGF0ZT5TaG93IHZlcnRpY2FsIGxpbmUgb24gZXZlcnkgb2NjdXJyZW5jZTwvc3Bhbj5cbiAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICA8bGFiZWxcbiAgICAgICAgICAgICAgY2xhc3M9XCJjOHktY2hlY2tib3hcIlxuICAgICAgICAgICAgICBbdGl0bGVdPVwiJ1Nob3cgaWNvbiB3aGVuIHRyaWdnZXJlZCcgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICBuYW1lPVwiZGlzcGxheU1hcmtlZFBvaW50XCJcbiAgICAgICAgICAgICAgICB0eXBlPVwiY2hlY2tib3hcIlxuICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cImRpc3BsYXlNYXJrZWRQb2ludFwiXG4gICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgIDxzcGFuPjwvc3Bhbj5cbiAgICAgICAgICAgICAgPHNwYW4gdHJhbnNsYXRlPlNob3cgaWNvbiB3aGVuIHRyaWdnZXJlZDwvc3Bhbj5cbiAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgIGNsYXNzPVwiYnRuLWNsZWFuIG0tbC04XCJcbiAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIlxuICAgICAgICAgICAgICAgICAgJ1NvbWUgYWxhcm1zIG9yIGV2ZW50cyBoYXZlIG5vIG1hdGNoaW5nIGRhdGEgcG9pbnRzLiBObyBpY29ucyB3aWxsIGJlIHNob3duIGZvciB0aGVtLidcbiAgICAgICAgICAgICAgICAgICAgfCB0cmFuc2xhdGVcbiAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgIFt0b29sdGlwXT1cIlxuICAgICAgICAgICAgICAgICAgJ1NvbWUgYWxhcm1zIG9yIGV2ZW50cyBoYXZlIG5vIG1hdGNoaW5nIGRhdGEgcG9pbnRzLiBObyBpY29ucyB3aWxsIGJlIHNob3duIGZvciB0aGVtLidcbiAgICAgICAgICAgICAgICAgICAgfCB0cmFuc2xhdGVcbiAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgIGNvbnRhaW5lcj1cImJvZHlcIlxuICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICpuZ0lmPVwiYWxhcm1zT3JFdmVudHNIYXZlTm9NYXRjaGluZ0Rwc1wiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiXG4gICAgICAgICAgICAgICAgW2FkYXB0aXZlUG9zaXRpb25dPVwiZmFsc2VcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPGlcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwidGV4dC13YXJuaW5nXCJcbiAgICAgICAgICAgICAgICAgIGM4eUljb249XCJleGNsYW1hdGlvbi10cmlhbmdsZVwiXG4gICAgICAgICAgICAgICAgPjwvaT5cbiAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgIDwvYzh5LWZvcm0tZ3JvdXA+XG4gICAgICAgIDwvZmllbGRzZXQ+XG4gICAgICAgIDxmaWVsZHNldCBjbGFzcz1cImM4eS1maWVsZHNldCBtLWItMjQgbS10LTBcIj5cbiAgICAgICAgICA8bGVnZW5kPnt7ICdDaGFydCcgfCB0cmFuc2xhdGUgfX08L2xlZ2VuZD5cbiAgICAgICAgICA8Yzh5LWZvcm0tZ3JvdXAgY2xhc3M9XCJwLWItMTYgbS1iLTAgcC10LTggZm9ybS1ncm91cC1zbVwiPlxuICAgICAgICAgICAgPGxhYmVsXG4gICAgICAgICAgICAgIGNsYXNzPVwiYzh5LWNoZWNrYm94XCJcbiAgICAgICAgICAgICAgW3RpdGxlXT1cIidFbmFibGUgZGF0ZSBzZWxlY3Rpb24gaW4gdGhlIHdpZGdldCB2aWV3LicgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICBuYW1lPVwiZGlzcGxheURhdGVTZWxlY3Rpb25cIlxuICAgICAgICAgICAgICAgIHR5cGU9XCJjaGVja2JveFwiXG4gICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwiZGlzcGxheURhdGVTZWxlY3Rpb25cIlxuICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICA8c3Bhbj48L3NwYW4+XG4gICAgICAgICAgICAgIDxzcGFuIHRyYW5zbGF0ZT5EYXRlIHNlbGVjdGlvbiBpbiB0aGUgd2lkZ2V0IHZpZXcuPC9zcGFuPlxuICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJidG4tY2xlYW4gbS1sLThcIlxuICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiXG4gICAgICAgICAgICAgICAgICAnRGF0ZSBzZWxlY3Rpb24gaW4gd2lkZ2V0IHZpZXcgaXMgbm90IHBvc3NpYmxlIHdoZW4gdXNpbmcgZGFzaGJvYXJkIHRpbWUgcmFuZ2UuJ1xuICAgICAgICAgICAgICAgICAgICB8IHRyYW5zbGF0ZVxuICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgW3Rvb2x0aXBdPVwiXG4gICAgICAgICAgICAgICAgICAnRGF0ZSBzZWxlY3Rpb24gaW4gd2lkZ2V0IHZpZXcgaXMgbm90IHBvc3NpYmxlIHdoZW4gdXNpbmcgZGFzaGJvYXJkIHRpbWUgcmFuZ2UuJ1xuICAgICAgICAgICAgICAgICAgICB8IHRyYW5zbGF0ZVxuICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgY29udGFpbmVyPVwiYm9keVwiXG4gICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgKm5nSWY9XCJkYXRlU2VsZWN0aW9uID09PSBEQVRFX1NFTEVDVElPTi5EQVNIQk9BUkRfQ09OVEVYVFwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiXG4gICAgICAgICAgICAgICAgW2FkYXB0aXZlUG9zaXRpb25dPVwiZmFsc2VcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPGlcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwidGV4dC1pbmZvXCJcbiAgICAgICAgICAgICAgICAgIGM4eUljb249XCJpbmZvXCJcbiAgICAgICAgICAgICAgICA+PC9pPlxuICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICA8bGFiZWxcbiAgICAgICAgICAgICAgY2xhc3M9XCJjOHktY2hlY2tib3hcIlxuICAgICAgICAgICAgICBbdGl0bGVdPVwiJ0FnZ3JlZ2F0aW9uIHNlbGVjdGlvbicgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICBuYW1lPVwiZGlzcGxheUFnZ3JlZ2F0aW9uU2VsZWN0aW9uXCJcbiAgICAgICAgICAgICAgICB0eXBlPVwiY2hlY2tib3hcIlxuICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cImRpc3BsYXlBZ2dyZWdhdGlvblNlbGVjdGlvblwiXG4gICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgIDxzcGFuPjwvc3Bhbj5cbiAgICAgICAgICAgICAgPHNwYW4gdHJhbnNsYXRlPkFnZ3JlZ2F0aW9uIHNlbGVjdGlvbjwvc3Bhbj5cbiAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICA8bGFiZWxcbiAgICAgICAgICAgICAgY2xhc3M9XCJjOHktY2hlY2tib3hcIlxuICAgICAgICAgICAgICBbdGl0bGVdPVwiJ1Nob3cgbGFiZWxzIGFuZCB1bml0cycgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICBuYW1lPVwic2hvd0xhYmVsQW5kVW5pdFwiXG4gICAgICAgICAgICAgICAgdHlwZT1cImNoZWNrYm94XCJcbiAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJzaG93TGFiZWxBbmRVbml0XCJcbiAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgPHNwYW4+PC9zcGFuPlxuICAgICAgICAgICAgICA8c3BhbiB0cmFuc2xhdGU+RGlzcGxheSBsYWJlbHMgYW5kIHVuaXRzIG9uIFktYXhpczwvc3Bhbj5cbiAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICA8bGFiZWxcbiAgICAgICAgICAgICAgY2xhc3M9XCJjOHktY2hlY2tib3hcIlxuICAgICAgICAgICAgICBbdGl0bGVdPVwiJ1Nob3cgc2xpZGVyJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgIG5hbWU9XCJzaG93U2xpZGVyXCJcbiAgICAgICAgICAgICAgICB0eXBlPVwiY2hlY2tib3hcIlxuICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cInNob3dTbGlkZXJcIlxuICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICA8c3Bhbj48L3NwYW4+XG4gICAgICAgICAgICAgIDxzcGFuIHRyYW5zbGF0ZT5TaG93IHNsaWRlcjwvc3Bhbj5cbiAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgPC9jOHktZm9ybS1ncm91cD5cbiAgICAgICAgPC9maWVsZHNldD5cbiAgICAgIDwvZm9ybT5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L2Rpdj5cbjxuZy10ZW1wbGF0ZSAjZGF0ZVNlbGVjdGlvbkhlbHBUZW1wbGF0ZT5cbiAgPGRpdiBbaW5uZXJIVE1MXT1cImRhdGVTZWxlY3Rpb25IZWxwXCI+PC9kaXY+XG48L25nLXRlbXBsYXRlPlxuIl19