ng-kinintel 0.0.397 → 20.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (184) hide show
  1. package/fesm2022/ng-kinintel.mjs +11874 -0
  2. package/fesm2022/ng-kinintel.mjs.map +1 -0
  3. package/index.d.ts +2818 -5
  4. package/package.json +6 -14
  5. package/esm2020/lib/components/alert-groups/alert-groups.component.mjs +0 -76
  6. package/esm2020/lib/components/alert-groups/edit-alert-group/edit-alert-group.component.mjs +0 -83
  7. package/esm2020/lib/components/dashboard-editor/configure-item/configure-item.component.mjs +0 -853
  8. package/esm2020/lib/components/dashboard-editor/configure-item/edit-dashboard-alert/edit-dashboard-alert.component.mjs +0 -56
  9. package/esm2020/lib/components/dashboard-editor/configure-item/html-documentation/html-documentation.component.mjs +0 -114
  10. package/esm2020/lib/components/dashboard-editor/configure-item/table-cell-formatter/table-cell-formatter.component.mjs +0 -163
  11. package/esm2020/lib/components/dashboard-editor/configure-item/vis-network-options.json +0 -135
  12. package/esm2020/lib/components/dashboard-editor/dashboard-editor.component.mjs +0 -580
  13. package/esm2020/lib/components/dashboard-editor/dashboard-parameter/dashboard-parameter.component.mjs +0 -15
  14. package/esm2020/lib/components/dashboard-editor/dashboard-settings/dashboard-settings.component.mjs +0 -50
  15. package/esm2020/lib/components/dashboard-editor/item-component/item-component.component.mjs +0 -1226
  16. package/esm2020/lib/components/dashboard-editor/source-selector-dialog/source-selector-dialog.component.mjs +0 -111
  17. package/esm2020/lib/components/dashboards/dashboards.component.mjs +0 -163
  18. package/esm2020/lib/components/dashboards/view-dashboard/view-dashboard.component.mjs +0 -429
  19. package/esm2020/lib/components/data-explorer/change-source-warning/change-source-warning.component.mjs +0 -20
  20. package/esm2020/lib/components/data-explorer/data-explorer.component.mjs +0 -243
  21. package/esm2020/lib/components/data-explorer/export-data/export-data.component.mjs +0 -62
  22. package/esm2020/lib/components/data-explorer/snapshot-api-access/snapshot-api-access.component.mjs +0 -70
  23. package/esm2020/lib/components/data-explorer/snapshot-profile-dialog/snapshot-profile-dialog.component.mjs +0 -190
  24. package/esm2020/lib/components/data-picker/data-picker.component.mjs +0 -79
  25. package/esm2020/lib/components/data-search/data-search.component.mjs +0 -11
  26. package/esm2020/lib/components/data-sharing-invite/data-sharing-invite.component.mjs +0 -52
  27. package/esm2020/lib/components/dataset/create-dataset/create-dataset.component.mjs +0 -47
  28. package/esm2020/lib/components/dataset/dataset-editor/available-columns/available-columns.component.mjs +0 -28
  29. package/esm2020/lib/components/dataset/dataset-editor/dataset-add-join/dataset-add-join.component.mjs +0 -344
  30. package/esm2020/lib/components/dataset/dataset-editor/dataset-column-settings/dataset-column-editor/dataset-column-editor.component.mjs +0 -80
  31. package/esm2020/lib/components/dataset/dataset-editor/dataset-column-settings/dataset-column-settings.component.mjs +0 -54
  32. package/esm2020/lib/components/dataset/dataset-editor/dataset-create-formula/dataset-create-formula.component.mjs +0 -67
  33. package/esm2020/lib/components/dataset/dataset-editor/dataset-editor.component.mjs +0 -1134
  34. package/esm2020/lib/components/dataset/dataset-editor/dataset-filters/dataset-filter/dataset-filter.component.mjs +0 -201
  35. package/esm2020/lib/components/dataset/dataset-editor/dataset-filters/dataset-filter-inclusion/dataset-filter-inclusion.component.mjs +0 -25
  36. package/esm2020/lib/components/dataset/dataset-editor/dataset-filters/dataset-filter-junction/dataset-filter-junction.component.mjs +0 -72
  37. package/esm2020/lib/components/dataset/dataset-editor/dataset-filters/dataset-filters.component.mjs +0 -62
  38. package/esm2020/lib/components/dataset/dataset-editor/dataset-name-dialog/dataset-name-dialog.component.mjs +0 -41
  39. package/esm2020/lib/components/dataset/dataset-editor/dataset-parameter-values/dataset-add-parameter/dataset-add-parameter.component.mjs +0 -78
  40. package/esm2020/lib/components/dataset/dataset-editor/dataset-parameter-values/dataset-parameter-type/dataset-parameter-type.component.mjs +0 -39
  41. package/esm2020/lib/components/dataset/dataset-editor/dataset-parameter-values/dataset-parameter-values.component.mjs +0 -75
  42. package/esm2020/lib/components/dataset/dataset-editor/dataset-summarise/dataset-summarise.component.mjs +0 -107
  43. package/esm2020/lib/components/dataset/dataset-editor/move-transformation-confirmation/move-transformation-confirmation.component.mjs +0 -20
  44. package/esm2020/lib/components/dataset/dataset-editor/remove-transformation-warning/remove-transformation-warning.component.mjs +0 -20
  45. package/esm2020/lib/components/dataset/dataset-editor/save-as-query/save-as-query.component.mjs +0 -58
  46. package/esm2020/lib/components/dataset/dataset-editor/share-query/share-query.component.mjs +0 -110
  47. package/esm2020/lib/components/dataset/dataset-editor/upstream-changes-confirmation/upstream-changes-confirmation.component.mjs +0 -20
  48. package/esm2020/lib/components/dataset/dataset.component.mjs +0 -294
  49. package/esm2020/lib/components/datasource/create-datasource/advanced-settings/advanced-settings.component.mjs +0 -130
  50. package/esm2020/lib/components/datasource/create-datasource/api-access/api-access.component.mjs +0 -132
  51. package/esm2020/lib/components/datasource/create-datasource/create-datasource.component.mjs +0 -729
  52. package/esm2020/lib/components/datasource/create-datasource/import-data/import-data.component.mjs +0 -146
  53. package/esm2020/lib/components/datasource/create-datasource/import-data/import-wizard/import-wizard.component.mjs +0 -165
  54. package/esm2020/lib/components/datasource/create-datasource/tabular-datasource/tabular-datasource.component.mjs +0 -145
  55. package/esm2020/lib/components/datasource/datasource.component.mjs +0 -162
  56. package/esm2020/lib/components/datasource/document-datasource/document-datasource.component.mjs +0 -297
  57. package/esm2020/lib/components/export-project/export-project.component.mjs +0 -29
  58. package/esm2020/lib/components/feeds/feed/feed.component.mjs +0 -92
  59. package/esm2020/lib/components/feeds/feeds.component.mjs +0 -145
  60. package/esm2020/lib/components/job-tasks/job-tasks.component.mjs +0 -25
  61. package/esm2020/lib/components/marketplace/marketplace.component.mjs +0 -65
  62. package/esm2020/lib/components/metadata/metadata.component.mjs +0 -65
  63. package/esm2020/lib/components/notification-groups/edit-notification-group/edit-notification-group.component.mjs +0 -113
  64. package/esm2020/lib/components/notification-groups/notification-groups.component.mjs +0 -86
  65. package/esm2020/lib/components/project-picker/project-picker.component.mjs +0 -118
  66. package/esm2020/lib/components/project-settings/project-link-selection/project-link-selection.component.mjs +0 -104
  67. package/esm2020/lib/components/project-settings/project-settings.component.mjs +0 -155
  68. package/esm2020/lib/components/query-caching/edit-query-cache/edit-query-cache.component.mjs +0 -51
  69. package/esm2020/lib/components/query-caching/query-cache-view/query-cache-view.component.mjs +0 -121
  70. package/esm2020/lib/components/query-caching/query-caching.component.mjs +0 -162
  71. package/esm2020/lib/components/shared-with-me/feed-api-modal/feed-api-modal.component.mjs +0 -45
  72. package/esm2020/lib/components/shared-with-me/shared-with-me.component.mjs +0 -174
  73. package/esm2020/lib/components/snapshots/snapshots.component.mjs +0 -244
  74. package/esm2020/lib/components/tag-picker/tag-picker.component.mjs +0 -74
  75. package/esm2020/lib/components/task-time-periods/task-time-periods.component.mjs +0 -55
  76. package/esm2020/lib/components/whitelisted-sql-functions/whitelisted-sql-functions.component.mjs +0 -40
  77. package/esm2020/lib/guards/dashboard-changes.guard.mjs +0 -22
  78. package/esm2020/lib/kinintel-config.mjs +0 -3
  79. package/esm2020/lib/ng-kinintel.module.mjs +0 -437
  80. package/esm2020/lib/objects/action-event.mjs +0 -16
  81. package/esm2020/lib/services/alert.service.mjs +0 -52
  82. package/esm2020/lib/services/dashboard.service.mjs +0 -75
  83. package/esm2020/lib/services/data-processor.service.mjs +0 -56
  84. package/esm2020/lib/services/data-search.service.mjs +0 -36
  85. package/esm2020/lib/services/dataset.service.mjs +0 -187
  86. package/esm2020/lib/services/datasource.service.mjs +0 -93
  87. package/esm2020/lib/services/external.service.mjs +0 -33
  88. package/esm2020/lib/services/feed.service.mjs +0 -50
  89. package/esm2020/lib/services/notification.service.mjs +0 -41
  90. package/esm2020/lib/services/project.service.mjs +0 -130
  91. package/esm2020/lib/services/tag.service.mjs +0 -63
  92. package/esm2020/ng-kinintel.mjs +0 -5
  93. package/esm2020/public-api.mjs +0 -43
  94. package/fesm2015/ng-kinintel.mjs +0 -12182
  95. package/fesm2015/ng-kinintel.mjs.map +0 -1
  96. package/fesm2020/ng-kinintel.mjs +0 -11872
  97. package/fesm2020/ng-kinintel.mjs.map +0 -1
  98. package/lib/components/alert-groups/alert-groups.component.d.ts +0 -30
  99. package/lib/components/alert-groups/edit-alert-group/edit-alert-group.component.d.ts +0 -28
  100. package/lib/components/dashboard-editor/configure-item/configure-item.component.d.ts +0 -256
  101. package/lib/components/dashboard-editor/configure-item/edit-dashboard-alert/edit-dashboard-alert.component.d.ts +0 -16
  102. package/lib/components/dashboard-editor/configure-item/html-documentation/html-documentation.component.d.ts +0 -59
  103. package/lib/components/dashboard-editor/configure-item/table-cell-formatter/table-cell-formatter.component.d.ts +0 -26
  104. package/lib/components/dashboard-editor/dashboard-editor.component.d.ts +0 -85
  105. package/lib/components/dashboard-editor/dashboard-parameter/dashboard-parameter.component.d.ts +0 -8
  106. package/lib/components/dashboard-editor/dashboard-settings/dashboard-settings.component.d.ts +0 -22
  107. package/lib/components/dashboard-editor/item-component/item-component.component.d.ts +0 -264
  108. package/lib/components/dashboard-editor/source-selector-dialog/source-selector-dialog.component.d.ts +0 -30
  109. package/lib/components/dashboards/dashboards.component.d.ts +0 -56
  110. package/lib/components/dashboards/view-dashboard/view-dashboard.component.d.ts +0 -81
  111. package/lib/components/data-explorer/change-source-warning/change-source-warning.component.d.ts +0 -11
  112. package/lib/components/data-explorer/data-explorer.component.d.ts +0 -61
  113. package/lib/components/data-explorer/export-data/export-data.component.d.ts +0 -17
  114. package/lib/components/data-explorer/snapshot-api-access/snapshot-api-access.component.d.ts +0 -25
  115. package/lib/components/data-explorer/snapshot-profile-dialog/snapshot-profile-dialog.component.d.ts +0 -44
  116. package/lib/components/data-picker/data-picker.component.d.ts +0 -32
  117. package/lib/components/data-search/data-search.component.d.ts +0 -5
  118. package/lib/components/data-sharing-invite/data-sharing-invite.component.d.ts +0 -21
  119. package/lib/components/dataset/create-dataset/create-dataset.component.d.ts +0 -17
  120. package/lib/components/dataset/dataset-editor/available-columns/available-columns.component.d.ts +0 -12
  121. package/lib/components/dataset/dataset-editor/dataset-add-join/dataset-add-join.component.d.ts +0 -61
  122. package/lib/components/dataset/dataset-editor/dataset-column-settings/dataset-column-editor/dataset-column-editor.component.d.ts +0 -21
  123. package/lib/components/dataset/dataset-editor/dataset-column-settings/dataset-column-settings.component.d.ts +0 -20
  124. package/lib/components/dataset/dataset-editor/dataset-create-formula/dataset-create-formula.component.d.ts +0 -19
  125. package/lib/components/dataset/dataset-editor/dataset-editor.component.d.ts +0 -131
  126. package/lib/components/dataset/dataset-editor/dataset-filters/dataset-filter/dataset-filter.component.d.ts +0 -63
  127. package/lib/components/dataset/dataset-editor/dataset-filters/dataset-filter-inclusion/dataset-filter-inclusion.component.d.ts +0 -11
  128. package/lib/components/dataset/dataset-editor/dataset-filters/dataset-filter-junction/dataset-filter-junction.component.d.ts +0 -20
  129. package/lib/components/dataset/dataset-editor/dataset-filters/dataset-filters.component.d.ts +0 -16
  130. package/lib/components/dataset/dataset-editor/dataset-name-dialog/dataset-name-dialog.component.d.ts +0 -18
  131. package/lib/components/dataset/dataset-editor/dataset-parameter-values/dataset-add-parameter/dataset-add-parameter.component.d.ts +0 -23
  132. package/lib/components/dataset/dataset-editor/dataset-parameter-values/dataset-parameter-type/dataset-parameter-type.component.d.ts +0 -13
  133. package/lib/components/dataset/dataset-editor/dataset-parameter-values/dataset-parameter-values.component.d.ts +0 -22
  134. package/lib/components/dataset/dataset-editor/dataset-summarise/dataset-summarise.component.d.ts +0 -27
  135. package/lib/components/dataset/dataset-editor/move-transformation-confirmation/move-transformation-confirmation.component.d.ts +0 -11
  136. package/lib/components/dataset/dataset-editor/remove-transformation-warning/remove-transformation-warning.component.d.ts +0 -11
  137. package/lib/components/dataset/dataset-editor/save-as-query/save-as-query.component.d.ts +0 -25
  138. package/lib/components/dataset/dataset-editor/share-query/share-query.component.d.ts +0 -41
  139. package/lib/components/dataset/dataset-editor/upstream-changes-confirmation/upstream-changes-confirmation.component.d.ts +0 -11
  140. package/lib/components/dataset/dataset.component.d.ts +0 -74
  141. package/lib/components/datasource/create-datasource/advanced-settings/advanced-settings.component.d.ts +0 -26
  142. package/lib/components/datasource/create-datasource/api-access/api-access.component.d.ts +0 -31
  143. package/lib/components/datasource/create-datasource/create-datasource.component.d.ts +0 -112
  144. package/lib/components/datasource/create-datasource/import-data/import-data.component.d.ts +0 -28
  145. package/lib/components/datasource/create-datasource/import-data/import-wizard/import-wizard.component.d.ts +0 -40
  146. package/lib/components/datasource/create-datasource/tabular-datasource/tabular-datasource.component.d.ts +0 -34
  147. package/lib/components/datasource/datasource.component.d.ts +0 -46
  148. package/lib/components/datasource/document-datasource/document-datasource.component.d.ts +0 -64
  149. package/lib/components/export-project/export-project.component.d.ts +0 -9
  150. package/lib/components/feeds/feed/feed.component.d.ts +0 -30
  151. package/lib/components/feeds/feeds.component.d.ts +0 -47
  152. package/lib/components/job-tasks/job-tasks.component.d.ts +0 -11
  153. package/lib/components/marketplace/marketplace.component.d.ts +0 -42
  154. package/lib/components/metadata/metadata.component.d.ts +0 -24
  155. package/lib/components/notification-groups/edit-notification-group/edit-notification-group.component.d.ts +0 -37
  156. package/lib/components/notification-groups/notification-groups.component.d.ts +0 -28
  157. package/lib/components/project-picker/project-picker.component.d.ts +0 -37
  158. package/lib/components/project-settings/project-link-selection/project-link-selection.component.d.ts +0 -32
  159. package/lib/components/project-settings/project-settings.component.d.ts +0 -40
  160. package/lib/components/query-caching/edit-query-cache/edit-query-cache.component.d.ts +0 -17
  161. package/lib/components/query-caching/query-cache-view/query-cache-view.component.d.ts +0 -35
  162. package/lib/components/query-caching/query-caching.component.d.ts +0 -38
  163. package/lib/components/shared-with-me/feed-api-modal/feed-api-modal.component.d.ts +0 -21
  164. package/lib/components/shared-with-me/shared-with-me.component.d.ts +0 -43
  165. package/lib/components/snapshots/snapshots.component.d.ts +0 -52
  166. package/lib/components/tag-picker/tag-picker.component.d.ts +0 -27
  167. package/lib/components/task-time-periods/task-time-periods.component.d.ts +0 -20
  168. package/lib/components/whitelisted-sql-functions/whitelisted-sql-functions.component.d.ts +0 -17
  169. package/lib/guards/dashboard-changes.guard.d.ts +0 -11
  170. package/lib/kinintel-config.d.ts +0 -10
  171. package/lib/ng-kinintel.module.d.ts +0 -116
  172. package/lib/objects/action-event.d.ts +0 -12
  173. package/lib/services/alert.service.d.ts +0 -17
  174. package/lib/services/dashboard.service.d.ts +0 -25
  175. package/lib/services/data-processor.service.d.ts +0 -18
  176. package/lib/services/data-search.service.d.ts +0 -14
  177. package/lib/services/dataset.service.d.ts +0 -56
  178. package/lib/services/datasource.service.d.ts +0 -34
  179. package/lib/services/external.service.d.ts +0 -12
  180. package/lib/services/feed.service.d.ts +0 -19
  181. package/lib/services/notification.service.d.ts +0 -16
  182. package/lib/services/project.service.d.ts +0 -27
  183. package/lib/services/tag.service.d.ts +0 -19
  184. package/public-api.d.ts +0 -38
@@ -1,20 +0,0 @@
1
- import { Component } from '@angular/core';
2
- import * as i0 from "@angular/core";
3
- import * as i1 from "@angular/material/legacy-dialog";
4
- export class ChangeSourceWarningComponent {
5
- constructor(dialogRef) {
6
- this.dialogRef = dialogRef;
7
- }
8
- ngOnInit() {
9
- }
10
- close(res) {
11
- this.dialogRef.close(res);
12
- }
13
- }
14
- ChangeSourceWarningComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: ChangeSourceWarningComponent, deps: [{ token: i1.MatLegacyDialogRef }], target: i0.ɵɵFactoryTarget.Component });
15
- ChangeSourceWarningComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: ChangeSourceWarningComponent, selector: "ki-change-source-warning", ngImport: i0, template: "<div class=\"flex flex-col h-full justify-between p-8\">\n <div>\n <div class=\"mx-auto flex h-12 w-12 items-center justify-center\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" stroke-width=\"1.5\" stroke=\"currentColor\"\n class=\"w-12 h-12 text-orange-500\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M12 9v3.75m-9.303 3.376c-.866 1.5.217 3.374 1.948 3.374h14.71c1.73 0 2.813-1.874 1.948-3.374L13.949 3.378c-.866-1.5-3.032-1.5-3.898 0L2.697 16.126zM12 15.75h.007v.008H12v-.008z\" />\n </svg>\n\n </div>\n <div class=\"mt-3 text-center sm:mt-5\">\n <h3 class=\"text-lg font-medium leading-6 text-gray-900\" id=\"modal-title\">Change Source Query?</h3>\n <div class=\"mt-2\">\n <p class=\"text-sm text-gray-500\">\n You are about to change the underlying dataset which may have different column mappings to the\n dataset you are currently working with. Any upstream transformations that are not compatible will\n cause the evaluation to fail. For convenience, we will disable all transformations after this point\n so they can be reviewed manually one by one.\n </p>\n </div>\n </div>\n </div>\n <div class=\"mt-5 flex align-center justify-between\">\n <button type=\"button\" mat-dialog-close\n class=\"mr-2 inline-flex w-full justify-center rounded-md border border-gray-300 bg-white px-4 py-2 text-sm font-medium text-gray-700 shadow-sm\">\n Cancel\n </button>\n <button type=\"button\" [matDialogClose]=\"true\"\n class=\"mx-2 inline-flex w-full justify-center rounded-md border border-primary text-primary bg-white px-4 py-2 text-sm font-medium shadow-sm\">\n Proceed With Change\n </button>\n\n\n </div>\n</div>\n\n", styles: [""], dependencies: [{ kind: "directive", type: i1.MatLegacyDialogClose, selector: "[mat-dialog-close], [matDialogClose]", inputs: ["aria-label", "type", "mat-dialog-close", "matDialogClose"], exportAs: ["matDialogClose"] }] });
16
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: ChangeSourceWarningComponent, decorators: [{
17
- type: Component,
18
- args: [{ selector: 'ki-change-source-warning', template: "<div class=\"flex flex-col h-full justify-between p-8\">\n <div>\n <div class=\"mx-auto flex h-12 w-12 items-center justify-center\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" stroke-width=\"1.5\" stroke=\"currentColor\"\n class=\"w-12 h-12 text-orange-500\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M12 9v3.75m-9.303 3.376c-.866 1.5.217 3.374 1.948 3.374h14.71c1.73 0 2.813-1.874 1.948-3.374L13.949 3.378c-.866-1.5-3.032-1.5-3.898 0L2.697 16.126zM12 15.75h.007v.008H12v-.008z\" />\n </svg>\n\n </div>\n <div class=\"mt-3 text-center sm:mt-5\">\n <h3 class=\"text-lg font-medium leading-6 text-gray-900\" id=\"modal-title\">Change Source Query?</h3>\n <div class=\"mt-2\">\n <p class=\"text-sm text-gray-500\">\n You are about to change the underlying dataset which may have different column mappings to the\n dataset you are currently working with. Any upstream transformations that are not compatible will\n cause the evaluation to fail. For convenience, we will disable all transformations after this point\n so they can be reviewed manually one by one.\n </p>\n </div>\n </div>\n </div>\n <div class=\"mt-5 flex align-center justify-between\">\n <button type=\"button\" mat-dialog-close\n class=\"mr-2 inline-flex w-full justify-center rounded-md border border-gray-300 bg-white px-4 py-2 text-sm font-medium text-gray-700 shadow-sm\">\n Cancel\n </button>\n <button type=\"button\" [matDialogClose]=\"true\"\n class=\"mx-2 inline-flex w-full justify-center rounded-md border border-primary text-primary bg-white px-4 py-2 text-sm font-medium shadow-sm\">\n Proceed With Change\n </button>\n\n\n </div>\n</div>\n\n" }]
19
- }], ctorParameters: function () { return [{ type: i1.MatLegacyDialogRef }]; } });
20
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhbmdlLXNvdXJjZS13YXJuaW5nLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25nLWtpbmludGVsL3NyYy9saWIvY29tcG9uZW50cy9kYXRhLWV4cGxvcmVyL2NoYW5nZS1zb3VyY2Utd2FybmluZy9jaGFuZ2Utc291cmNlLXdhcm5pbmcuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmcta2luaW50ZWwvc3JjL2xpYi9jb21wb25lbnRzL2RhdGEtZXhwbG9yZXIvY2hhbmdlLXNvdXJjZS13YXJuaW5nL2NoYW5nZS1zb3VyY2Utd2FybmluZy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsU0FBUyxFQUFTLE1BQU0sZUFBZSxDQUFDOzs7QUFRaEQsTUFBTSxPQUFPLDRCQUE0QjtJQUVyQyxZQUFtQixTQUFxRDtRQUFyRCxjQUFTLEdBQVQsU0FBUyxDQUE0QztJQUN4RSxDQUFDO0lBRUQsUUFBUTtJQUNSLENBQUM7SUFFTSxLQUFLLENBQUMsR0FBSTtRQUNiLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQzlCLENBQUM7OzBIQVZRLDRCQUE0Qjs4R0FBNUIsNEJBQTRCLGdFQ1J6Qyx5OERBbUNBOzRGRDNCYSw0QkFBNEI7a0JBTHhDLFNBQVM7K0JBQ0ksMEJBQTBCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtDb21wb25lbnQsIE9uSW5pdH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge01hdExlZ2FjeURpYWxvZ1JlZiBhcyBNYXREaWFsb2dSZWZ9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2xlZ2FjeS1kaWFsb2cnO1xuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ2tpLWNoYW5nZS1zb3VyY2Utd2FybmluZycsXG4gICAgdGVtcGxhdGVVcmw6ICcuL2NoYW5nZS1zb3VyY2Utd2FybmluZy5jb21wb25lbnQuaHRtbCcsXG4gICAgc3R5bGVVcmxzOiBbJy4vY2hhbmdlLXNvdXJjZS13YXJuaW5nLmNvbXBvbmVudC5zYXNzJ11cbn0pXG5leHBvcnQgY2xhc3MgQ2hhbmdlU291cmNlV2FybmluZ0NvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG5cbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgZGlhbG9nUmVmOiBNYXREaWFsb2dSZWY8Q2hhbmdlU291cmNlV2FybmluZ0NvbXBvbmVudD4pIHtcbiAgICB9XG5cbiAgICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB9XG5cbiAgICBwdWJsaWMgY2xvc2UocmVzPykge1xuICAgICAgICB0aGlzLmRpYWxvZ1JlZi5jbG9zZShyZXMpO1xuICAgIH1cblxufVxuIiwiPGRpdiBjbGFzcz1cImZsZXggZmxleC1jb2wgaC1mdWxsIGp1c3RpZnktYmV0d2VlbiBwLThcIj5cbiAgICA8ZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwibXgtYXV0byBmbGV4IGgtMTIgdy0xMiBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXJcIj5cbiAgICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIGZpbGw9XCJub25lXCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIHN0cm9rZS13aWR0aD1cIjEuNVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiXG4gICAgICAgICAgICAgICAgIGNsYXNzPVwidy0xMiBoLTEyIHRleHQtb3JhbmdlLTUwMFwiPlxuICAgICAgICAgICAgICAgIDxwYXRoIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIGQ9XCJNMTIgOXYzLjc1bS05LjMwMyAzLjM3NmMtLjg2NiAxLjUuMjE3IDMuMzc0IDEuOTQ4IDMuMzc0aDE0LjcxYzEuNzMgMCAyLjgxMy0xLjg3NCAxLjk0OC0zLjM3NEwxMy45NDkgMy4zNzhjLS44NjYtMS41LTMuMDMyLTEuNS0zLjg5OCAwTDIuNjk3IDE2LjEyNnpNMTIgMTUuNzVoLjAwN3YuMDA4SDEydi0uMDA4elwiIC8+XG4gICAgICAgICAgICA8L3N2Zz5cblxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm10LTMgdGV4dC1jZW50ZXIgc206bXQtNVwiPlxuICAgICAgICAgICAgPGgzIGNsYXNzPVwidGV4dC1sZyBmb250LW1lZGl1bSBsZWFkaW5nLTYgdGV4dC1ncmF5LTkwMFwiIGlkPVwibW9kYWwtdGl0bGVcIj5DaGFuZ2UgU291cmNlIFF1ZXJ5PzwvaDM+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibXQtMlwiPlxuICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwidGV4dC1zbSB0ZXh0LWdyYXktNTAwXCI+XG4gICAgICAgICAgICAgICAgICAgIFlvdSBhcmUgYWJvdXQgdG8gY2hhbmdlIHRoZSB1bmRlcmx5aW5nIGRhdGFzZXQgd2hpY2ggbWF5IGhhdmUgZGlmZmVyZW50IGNvbHVtbiBtYXBwaW5ncyB0byB0aGVcbiAgICAgICAgICAgICAgICAgICAgZGF0YXNldCB5b3UgYXJlIGN1cnJlbnRseSB3b3JraW5nIHdpdGguIEFueSB1cHN0cmVhbSB0cmFuc2Zvcm1hdGlvbnMgdGhhdCBhcmUgbm90IGNvbXBhdGlibGUgd2lsbFxuICAgICAgICAgICAgICAgICAgICBjYXVzZSB0aGUgZXZhbHVhdGlvbiB0byBmYWlsLiBGb3IgY29udmVuaWVuY2UsIHdlIHdpbGwgZGlzYWJsZSBhbGwgdHJhbnNmb3JtYXRpb25zIGFmdGVyIHRoaXMgcG9pbnRcbiAgICAgICAgICAgICAgICAgICAgc28gdGhleSBjYW4gYmUgcmV2aWV3ZWQgbWFudWFsbHkgb25lIGJ5IG9uZS5cbiAgICAgICAgICAgICAgICA8L3A+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cIm10LTUgZmxleCBhbGlnbi1jZW50ZXIganVzdGlmeS1iZXR3ZWVuXCI+XG4gICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIG1hdC1kaWFsb2ctY2xvc2VcbiAgICAgICAgICAgICAgICBjbGFzcz1cIm1yLTIgaW5saW5lLWZsZXggdy1mdWxsIGp1c3RpZnktY2VudGVyIHJvdW5kZWQtbWQgYm9yZGVyIGJvcmRlci1ncmF5LTMwMCBiZy13aGl0ZSBweC00IHB5LTIgdGV4dC1zbSBmb250LW1lZGl1bSB0ZXh0LWdyYXktNzAwIHNoYWRvdy1zbVwiPlxuICAgICAgICAgICAgQ2FuY2VsXG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBbbWF0RGlhbG9nQ2xvc2VdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJteC0yIGlubGluZS1mbGV4IHctZnVsbCBqdXN0aWZ5LWNlbnRlciByb3VuZGVkLW1kIGJvcmRlciBib3JkZXItcHJpbWFyeSB0ZXh0LXByaW1hcnkgYmctd2hpdGUgcHgtNCBweS0yIHRleHQtc20gZm9udC1tZWRpdW0gc2hhZG93LXNtXCI+XG4gICAgICAgICAgICBQcm9jZWVkIFdpdGggQ2hhbmdlXG4gICAgICAgIDwvYnV0dG9uPlxuXG5cbiAgICA8L2Rpdj5cbjwvZGl2PlxuXG4iXX0=
@@ -1,243 +0,0 @@
1
- import { Component, Inject, Input, ViewChild } from '@angular/core';
2
- import { MAT_LEGACY_DIALOG_DATA as MAT_DIALOG_DATA } from '@angular/material/legacy-dialog';
3
- import { DatasetNameDialogComponent } from '../dataset/dataset-editor/dataset-name-dialog/dataset-name-dialog.component';
4
- import { SnapshotProfileDialogComponent } from '../data-explorer/snapshot-profile-dialog/snapshot-profile-dialog.component';
5
- import { ExportDataComponent } from './export-data/export-data.component';
6
- import * as lodash from 'lodash';
7
- import { SnapshotApiAccessComponent } from './snapshot-api-access/snapshot-api-access.component';
8
- import { EditQueryCacheComponent } from '../query-caching/edit-query-cache/edit-query-cache.component';
9
- import { Subject } from 'rxjs';
10
- import { CreateDatasetComponent } from '../dataset/create-dataset/create-dataset.component';
11
- import { ChangeSourceWarningComponent } from './change-source-warning/change-source-warning.component';
12
- import * as i0 from "@angular/core";
13
- import * as i1 from "@angular/material/legacy-dialog";
14
- import * as i2 from "../../services/dataset.service";
15
- import * as i3 from "@angular/router";
16
- import * as i4 from "../../services/project.service";
17
- import * as i5 from "../../services/data-processor.service";
18
- import * as i6 from "@angular/common";
19
- import * as i7 from "@angular/material/legacy-button";
20
- import * as i8 from "@angular/material/icon";
21
- import * as i9 from "@3dgenomes/ngx-resizable";
22
- import * as i10 from "@angular/forms";
23
- import * as i11 from "@angular/material/legacy-radio";
24
- import * as i12 from "@angular/material/legacy-tooltip";
25
- import * as i13 from "../dataset/dataset-editor/dataset-editor.component";
26
- import * as i14 from "../query-caching/query-cache-view/query-cache-view.component";
27
- const _ = lodash.default;
28
- export class DataExplorerComponent {
29
- constructor(dialogRef, data, dialog, datasetService, router, projectService, dataProcessorService) {
30
- this.dialogRef = dialogRef;
31
- this.data = data;
32
- this.dialog = dialog;
33
- this.datasetService = datasetService;
34
- this.router = router;
35
- this.projectService = projectService;
36
- this.dataProcessorService = dataProcessorService;
37
- this.datasetEditorReadonly = false;
38
- this.datasetEditorSimpleMode = false;
39
- this.datasetEditorNoTools = false;
40
- this._ = _;
41
- this.showChart = false;
42
- this.showSnapshots = false;
43
- this.snapshotProfiles = [];
44
- this.showQueryCache = false;
45
- this.editTitle = false;
46
- this.canHaveSnapshots = false;
47
- this.canExportData = false;
48
- this.reloadCache = new Subject();
49
- this.columns = [];
50
- }
51
- ngOnInit() {
52
- this.chartData = !!this.data.showChart;
53
- this.datasetInstanceSummary = this.data.datasetInstanceSummary;
54
- this.admin = !!this.data.admin;
55
- this.accountId = this.data.accountId;
56
- this.breadcrumb = this.data.breadcrumb;
57
- this.backendUrl = this.data.backendUrl;
58
- this.datasetEditorReadonly = !!this.data.datasetEditorReadonly;
59
- this.datasetEditorSimpleMode = !!this.data.datasetEditorSimpleMode;
60
- this.datasetEditorNoTools = !!this.data.datasetEditorNoTools;
61
- if (!this.datasetInstanceSummary.id) {
62
- this.datasetTitle = this.datasetInstanceSummary.title;
63
- }
64
- this.newTitle = this.data.newTitle;
65
- this.newDescription = this.data.newDescription;
66
- this.chartData = [
67
- { data: [1000, 1400, 1999, 2500, 5000] },
68
- ];
69
- this.canHaveSnapshots = this.projectService.doesActiveProjectHavePrivilege('snapshotaccess');
70
- this.canExportData = this.projectService.doesActiveProjectHavePrivilege('exportdata');
71
- }
72
- ngOnDestroy() {
73
- if (this.timer) {
74
- clearInterval(this.timer);
75
- }
76
- }
77
- changeSource() {
78
- const dialogRef = this.dialog.open(CreateDatasetComponent, {
79
- width: '1200px',
80
- height: '800px',
81
- data: {
82
- admin: this.admin,
83
- accountId: this.accountId
84
- }
85
- });
86
- dialogRef.afterClosed().subscribe(res => {
87
- if (res) {
88
- const dialogRef2 = this.dialog.open(ChangeSourceWarningComponent, {
89
- width: '700px',
90
- height: '275px'
91
- });
92
- dialogRef2.afterClosed().subscribe(proceed => {
93
- if (proceed) {
94
- this.datasetInstanceSummary.datasetInstanceId = res.datasetInstanceId;
95
- this.datasetInstanceSummary.datasourceInstanceKey = res.datasourceInstanceKey;
96
- this.datasetInstanceSummary.source = {
97
- title: res.title,
98
- datasetInstanceId: res.datasetInstanceId,
99
- datasourceInstanceKey: res.datasourceInstanceKey,
100
- type: null
101
- };
102
- const transformation = this.datasetInstanceSummary.transformationInstances[0];
103
- if (transformation) {
104
- this.datasetEditorComponent.excludeUpstreamTransformations(transformation, true);
105
- }
106
- else {
107
- this.datasetEditorComponent.evaluateDataset(true);
108
- }
109
- }
110
- });
111
- }
112
- });
113
- }
114
- dataLoaded(data) {
115
- this.columns = data.columns;
116
- }
117
- async triggerSnapshot(snapshotKey) {
118
- await this.dataProcessorService.triggerProcessor(snapshotKey);
119
- this.snapshotProfiles = await this.loadProcessorItems('snapshot');
120
- this.timer = setInterval(async () => {
121
- this.snapshotProfiles = await this.loadProcessorItems('snapshot');
122
- }, 3000);
123
- }
124
- apiAccess() {
125
- const dialogRef = this.dialog.open(SnapshotApiAccessComponent, {
126
- width: '800px',
127
- height: '530px',
128
- data: {
129
- datasetInstanceSummary: this.datasetInstanceSummary,
130
- backendUrl: this.backendUrl
131
- }
132
- });
133
- }
134
- exportData() {
135
- const dialogRef = this.dialog.open(ExportDataComponent, {
136
- width: '600px',
137
- height: '530px',
138
- data: {
139
- datasetInstanceSummary: Object.assign({}, this.datasetInstanceSummary)
140
- }
141
- });
142
- }
143
- async viewSnapshots() {
144
- this.showQueryCache = false;
145
- this.showSnapshots = !this.showSnapshots;
146
- if (this.showSnapshots) {
147
- this.snapshotProfiles = await this.loadProcessorItems('snapshot');
148
- }
149
- }
150
- editSnapshot(snapshot) {
151
- const dialogRef = this.dialog.open(SnapshotProfileDialogComponent, {
152
- width: '900px',
153
- height: '900px',
154
- data: {
155
- snapshot,
156
- datasetInstanceId: this.datasetInstanceSummary.id,
157
- columns: this.columns,
158
- datasetInstance: this.datasetInstanceSummary
159
- }
160
- });
161
- dialogRef.afterClosed().subscribe(async (res) => {
162
- if (res) {
163
- this.snapshotProfiles = await this.loadProcessorItems('snapshot');
164
- }
165
- });
166
- }
167
- async deleteSnapshot(snapshot) {
168
- const message = 'Are you sure you would like to remove this snapshot?';
169
- if (window.confirm(message)) {
170
- await this.dataProcessorService.removeProcessor(snapshot.key);
171
- this.snapshotProfiles = await this.loadProcessorItems('snapshot');
172
- }
173
- }
174
- async viewQueryCaching() {
175
- this.showSnapshots = false;
176
- this.showQueryCache = !this.showQueryCache;
177
- }
178
- editQueryCache(cache) {
179
- const dialogRef = this.dialog.open(EditQueryCacheComponent, {
180
- width: '900px',
181
- height: '900px',
182
- data: {
183
- cache,
184
- datasetInstanceId: this.datasetInstanceSummary.id,
185
- columns: this.columns,
186
- datasetInstance: this.datasetInstanceSummary
187
- }
188
- });
189
- dialogRef.afterClosed().subscribe(async (res) => {
190
- if (res) {
191
- this.reloadCache.next(Date.now());
192
- }
193
- });
194
- }
195
- saveChanges() {
196
- if (!this.datasetInstanceSummary.id && (this.datasetInstanceSummary.title === this.datasetTitle)) {
197
- const dialogRef = this.dialog.open(DatasetNameDialogComponent, {
198
- width: '700px',
199
- height: '800px',
200
- data: {
201
- datasetInstanceSummary: this.datasetInstanceSummary
202
- }
203
- });
204
- dialogRef.afterClosed().subscribe(datasetInstanceSummary => {
205
- if (datasetInstanceSummary) {
206
- this.datasetInstanceSummary = datasetInstanceSummary;
207
- this.saveDataset();
208
- }
209
- });
210
- }
211
- else {
212
- this.saveDataset();
213
- }
214
- }
215
- saveDataset() {
216
- this.datasetService.saveDataset(this.datasetInstanceSummary, this.accountId).then(() => {
217
- this.dialogRef.close(true);
218
- // this.router.navigate(['/dataset']);
219
- });
220
- }
221
- async loadProcessorItems(type) {
222
- return await this.dataProcessorService.filterProcessorsByRelatedItem(type, 'DatasetInstance', this.datasetInstanceSummary.id);
223
- }
224
- }
225
- DataExplorerComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: DataExplorerComponent, deps: [{ token: i1.MatLegacyDialogRef }, { token: MAT_DIALOG_DATA }, { token: i1.MatLegacyDialog }, { token: i2.DatasetService }, { token: i3.Router }, { token: i4.ProjectService }, { token: i5.DataProcessorService }], target: i0.ɵɵFactoryTarget.Component });
226
- DataExplorerComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: DataExplorerComponent, selector: "ki-data-explorer", inputs: { datasetEditorReadonly: "datasetEditorReadonly", datasetEditorSimpleMode: "datasetEditorSimpleMode", datasetEditorNoTools: "datasetEditorNoTools" }, host: { classAttribute: "configure-dialog" }, viewQueries: [{ propertyName: "datasetEditorComponent", first: true, predicate: ["datasetEditorComponent"], descendants: true }], ngImport: i0, template: "<div class=\"bg-gray-50 configure-header border-b border-gray-200\">\n <div class=\"w-full flex items-center\">\n <ng-template [ngIf]=\"datasetInstanceSummary && datasetInstanceSummary.title && !editTitle\">\n <div (click)=\"editTitle = !editTitle\">{{ datasetInstanceSummary.title }}</div>\n </ng-template>\n <ng-template [ngIf]=\"datasetInstanceSummary && editTitle\">\n <input type=\"text\" class=\"w-1/4 text-sm\"\n [(ngModel)]=\"datasetInstanceSummary.title\" (blur)=\"editTitle = false\">\n </ng-template>\n <ng-template [ngIf]=\"!datasetInstanceSummary || !datasetInstanceSummary.title\">\n Data Explorer\n </ng-template>\n\n </div>\n\n <div class=\"flex items-center\">\n <mat-radio-group class=\"flex items-center text-sm\"\n *ngIf=\"admin\" aria-label=\"Select a scope\" [(ngModel)]=\"accountId\">\n <mat-radio-button class=\"mt-0\" [value]=\"null\">Data Feed</mat-radio-button>\n <mat-radio-button class=\"mt-0 ml-2\" [value]=\"0\">Stored Query</mat-radio-button>\n </mat-radio-group>\n </div>\n\n</div>\n<nav class=\"h-10 flex border-b border-gray-200 bg-white\" aria-label=\"Breadcrumb\">\n <ol role=\"list\" class=\"flex w-full px-4\">\n <li class=\"flex\">\n <div class=\"flex items-center\">\n <a [mat-dialog-close]=\"{breadcrumb: '/'}\" class=\"text-gray-600 hover:text-gray-800 flex items-center\">\n <span class=\"material-symbols-outlined\">home</span>\n </a>\n </div>\n </li>\n\n <li class=\"flex truncate\">\n <div class=\"flex items-center\">\n <svg class=\"h-full w-6 flex-shrink-0 text-gray-200\" viewBox=\"0 0 24 44\" preserveAspectRatio=\"none\"\n fill=\"currentColor\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path d=\"M.293 0l22 22-22 22h1.414l22-22-22-22H.293z\"/>\n </svg>\n <a [mat-dialog-close]=\"true\"\n class=\"capitalize ml-4 text-sm font-medium text-gray-500 hover:text-gray-700\">\n {{ breadcrumb }}</a>\n </div>\n </li>\n\n <li class=\"flex truncate\" *ngIf=\"datasetInstanceSummary\">\n <div class=\"flex items-center\">\n <svg class=\"h-full w-6 flex-shrink-0 text-gray-200\" viewBox=\"0 0 24 44\" preserveAspectRatio=\"none\"\n fill=\"currentColor\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path d=\"M.293 0l22 22-22 22h1.414l22-22-22-22H.293z\"/>\n </svg>\n <a class=\"ml-4 text-sm font-medium text-gray-500 hover:text-gray-700\" aria-current=\"page\">\n {{ datasetInstanceSummary.title || 'Data Explorer' }}\n </a>\n <ng-template [ngIf]=\"datasetInstanceSummary && datasetInstanceSummary.source\">\n <span\n class=\"flex items-center border border-gray-200 text-xs px-2 py-0 rounded-xl ml-2 font-thin bg-gray-100\">\n <span class=\"uppercase tracking-wider text-gray-700 font-medium\">Querying:</span>\n <ng-template [ngIf]=\"datasetInstanceSummary.source.datasourceInstanceKey\">\n <img *ngIf=\"['custom', 'snapshot'].indexOf(datasetInstanceSummary.source.type) === -1\"\n src=\"/assets/favicon.png\" class=\"w-2.5 mx-1.5\">\n <span *ngIf=\"datasetInstanceSummary.source.type === 'custom'\"\n class=\"material-symbols-outlined h-4 w-4 text-lg leading-4 mx-1.5\">upload_file</span>\n <span *ngIf=\"datasetInstanceSummary.source.type === 'snapshot'\"\n class=\"material-symbols-outlined h-4 w-4 text-lg leading-4 mx-1.5\">history</span>\n </ng-template>\n <ng-template [ngIf]=\"!datasetInstanceSummary.source.datasourceInstanceKey\">\n <span class=\"material-symbols-outlined h-4 w-4 text-lg leading-4 mx-1.5\">query_stats</span>\n </ng-template>\n &nbsp;{{ datasetInstanceSummary.source.title }}\n <span class=\"material-symbols-outlined ml-2 cursor-pointer\" title=\"Change source query\"\n (click)=\"changeSource()\">change_circle</span>\n </span>\n </ng-template>\n </div>\n </li>\n </ol>\n</nav>\n<div class=\"configure-content\">\n\n <rsz-layout class=\"row top\" [directions]=\"(showSnapshots || showQueryCache) ? ['bottom'] : ['none']\"\n [rFlex]=\"(showSnapshots || showQueryCache)\">\n\n <rsz-layout class=\"cell left no-p\" [directions]=\"showChart ? ['right'] : ['none']\" [rFlex]=\"true\"\n [ngStyle]=\"{'flex-basis': showChart ? '65%' : '100%'}\">\n <div class=\"cell-contents no-p\">\n <ki-dataset-editor #datasetEditorComponent [(datasetInstanceSummary)]=\"datasetInstanceSummary\"\n [accountId]=\"accountId\" [newTitle]=\"newTitle\" [newDescription]=\"newDescription\"\n (dataLoaded)=\"dataLoaded($event)\" [admin]=\"admin\"\n [datasetEditorReadonly]=\"datasetEditorReadonly\"\n [datasetEditorSimpleMode]=\"datasetEditorSimpleMode\"\n [datasetEditorNoTools]=\"datasetEditorNoTools\"></ki-dataset-editor>\n </div>\n </rsz-layout>\n </rsz-layout>\n\n <rsz-layout *ngIf=\"showSnapshots || showQueryCache\" class=\"row bottom\" [directions]=\"['none']\" [rFlex]=\"false\"\n [ngClass]=\"{'overflow-y-scroll': showQueryCache}\">\n <ng-template [ngIf]=\"showSnapshots\">\n <div class=\"px-6 py-3 bg-white border-b border-gray-200\">\n <div class=\"md:flex md:items-center md:justify-between md:space-x-5\">\n <div class=\"flex items-start flex-1\">\n <div class=\"pt-1.5\">\n <h1 class=\"text-xl font-bold text-gray-900 mb-0\">\n <div>Snapshot Profiles</div>\n </h1>\n <p class=\"text-xs font-medium text-gray-500\">\n A list of all the snapshots that have been created for this stored query.\n </p>\n </div>\n </div>\n\n <div class=\"flex flex-1 items-center justify-end\">\n <button type=\"button\" (click)=\"apiAccess()\"\n class=\"inline-flex items-center justify-center px-4 py-2 mr-3 border border-transparent text-sm font-medium rounded-md shadow-sm text-primary bg-gray-100 focus:outline-none\">\n API Access\n </button>\n\n <button type=\"button\" (click)=\"editSnapshot(null)\"\n class=\"inline-flex items-center justify-center px-4 py-1.5 border border-transparent text-sm font-medium rounded-md shadow-sm text-white bg-primary focus:outline-none\">\n <mat-icon>add</mat-icon>\n New Snapshot Profile\n </button>\n </div>\n </div>\n </div>\n <div class=\"px-4 sm:px-6 lg:px-8 mt-0\">\n <div class=\"flex flex-col\">\n <div class=\"-my-2 -mx-4 sm:-mx-6 lg:-mx-8\">\n <div class=\"inline-block min-w-full py-2 align-middle\">\n <table *ngIf=\"snapshotProfiles.length\"\n class=\"min-w-full border-separate\" style=\"border-spacing: 0\">\n <thead class=\"bg-gray-100\">\n <tr>\n <th scope=\"col\"\n class=\"sticky top-0 z-10 border-b border-gray-300 bg-gray-50 bg-opacity-75 py-3.5 px-4 text-left text-xs font-semibold text-gray-900 backdrop-blur backdrop-filter\">\n </th>\n <th scope=\"col\"\n class=\"sticky top-0 z-10 border-b border-gray-300 bg-gray-50 bg-opacity-75 py-3.5 px-4 text-left text-xs font-semibold text-gray-900 backdrop-blur backdrop-filter\">\n Title\n </th>\n <th scope=\"col\"\n class=\"sticky top-0 z-10 border-b border-gray-300 bg-gray-50 bg-opacity-75 py-3.5 px-4 text-left text-xs font-semibold text-gray-900 backdrop-blur backdrop-filter\">\n Status\n </th>\n <th scope=\"col\"\n class=\"sticky top-0 z-10 border-b border-gray-300 bg-gray-50 bg-opacity-75 py-3.5 px-4 text-left text-xs font-semibold text-gray-900 backdrop-blur backdrop-filter\">\n Last Started\n </th>\n <th scope=\"col\"\n class=\"sticky top-0 z-10 border-b border-gray-300 bg-gray-50 bg-opacity-75 py-3.5 px-4 text-left text-xs font-semibold text-gray-900 backdrop-blur backdrop-filter\">\n Next Start Time\n </th>\n <th scope=\"col\"\n class=\"sticky top-0 z-10 border-b border-gray-300 bg-gray-50 bg-opacity-75 py-3.5 px-4 backdrop-blur backdrop-filter\">\n <span class=\"sr-only\">Edit</span>\n </th>\n </tr>\n </thead>\n <tbody class=\"bg-white\">\n <tr *ngFor=\"let snapshot of snapshotProfiles; let i = index\">\n <td>\n <button *ngIf=\"snapshot.taskStatus !== 'RUNNING'\" color=\"primary\"\n matTooltip=\"Trigger snapshot to run now\" mat-icon-button\n (click)=\"triggerSnapshot(snapshot.key)\">\n <mat-icon>play_arrow</mat-icon>\n </button>\n <svg *ngIf=\"snapshot.taskStatus === 'RUNNING'\"\n class=\"animate-spin ml-3 mr-2 h-5 w-5 text-secondary\"\n xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\">\n <circle class=\"opacity-25\" cx=\"12\" cy=\"12\" r=\"10\" stroke=\"currentColor\"\n stroke-width=\"4\"></circle>\n <path class=\"opacity-75\" fill=\"currentColor\"\n d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z\"></path>\n </svg>\n </td>\n <td class=\"whitespace-nowrap border-b border-gray-200 py-2 px-4 text-sm font-medium text-gray-900\">\n {{ snapshot.title }}\n </td>\n <td class=\"whitespace-nowrap border-b border-gray-200 py-0.5 px-2 text-sm text-gray-500\">\n <div\n class=\"inline-flex text-sm lowercase flex items-center text-white px-3 rounded-full\"\n [ngClass]=\"{'py-0.5': snapshot.taskStatus !== 'RUNNING','py-1': snapshot.taskStatus === 'RUNNING', 'bg-gray-400': snapshot.taskStatus === 'PENDING', 'bg-secondary': snapshot.taskStatus === 'RUNNING', 'bg-success': snapshot.taskStatus === 'COMPLETED', 'bg-danger': snapshot.taskStatus === 'FAILED'}\">\n <ng-template [ngIf]=\"snapshot.taskStatus === 'PENDING'\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\"\n stroke-width=\"1.5\" stroke=\"currentColor\"\n class=\"-ml-1 w-6 h-6 mr-2\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\"\n d=\"M12 6v6h4.5m4.5 0a9 9 0 11-18 0 9 9 0 0118 0z\"/>\n </svg>\n </ng-template>\n <ng-template [ngIf]=\"snapshot.taskStatus === 'RUNNING'\">\n <svg class=\"animate-spin -ml-1 mr-3 h-5 w-5 text-white\"\n xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\">\n <circle class=\"opacity-25\" cx=\"12\" cy=\"12\" r=\"10\"\n stroke=\"currentColor\"\n stroke-width=\"4\"></circle>\n <path class=\"opacity-75\" fill=\"currentColor\"\n d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z\"></path>\n </svg>\n </ng-template>\n <ng-template [ngIf]=\"snapshot.taskStatus === 'COMPLETED'\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\"\n stroke-width=\"1.5\" stroke=\"currentColor\"\n class=\"-ml-1 w-6 h-6 mr-2\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\"\n d=\"M9 12.75L11.25 15 15 9.75M21 12a9 9 0 11-18 0 9 9 0 0118 0z\"/>\n </svg>\n </ng-template>\n <ng-template [ngIf]=\"snapshot.taskStatus === 'FAILED'\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\"\n stroke-width=\"1.5\" stroke=\"currentColor\"\n class=\"-ml-1 w-6 h-6 mr-2\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\"\n d=\"M12 9v3.75m-9.303 3.376c-.866 1.5.217 3.374 1.948 3.374h14.71c1.73 0 2.813-1.874 1.948-3.374L13.949 3.378c-.866-1.5-3.032-1.5-3.898 0L2.697 16.126zM12 15.75h.007v.008H12v-.008z\"/>\n </svg>\n </ng-template>\n <ng-template [ngIf]=\"snapshot.taskStatus === 'TIMED_OUT'\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\"\n stroke-width=\"1.5\" stroke=\"currentColor\"\n class=\"-ml-1 w-6 h-6 mr-2\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\"\n d=\"M14.25 9v6m-4.5 0V9M21 12a9 9 0 11-18 0 9 9 0 0118 0z\"/>\n </svg>\n </ng-template>\n {{ _.startCase(snapshot.taskStatus) }}\n </div>\n </td>\n <td class=\"whitespace-nowrap border-b border-gray-200 py-2 px-4 text-sm text-gray-500\">\n {{ snapshot.taskLastStartTime }}\n </td>\n <td class=\"whitespace-nowrap border-b border-gray-200 py-2 px-4 text-sm text-gray-500\">\n {{ snapshot.taskNextStartTime }}\n </td>\n <td class=\"relative whitespace-nowrap border-b border-gray-200 py-2 px-4 text-right text-sm\">\n <div class=\"align-center justify-end\">\n <button mat-button color=\"primary\" (click)=\"editSnapshot(snapshot)\"> Edit\n </button>\n <div class=\"divider\"></div>\n <button mat-button color=\"warn\" (click)=\"deleteSnapshot(snapshot)\"> Delete\n </button>\n </div>\n </td>\n </tr>\n\n </tbody>\n\n </table>\n </div>\n </div>\n </div>\n </div>\n\n <div class=\"p-4\" *ngIf=\"!snapshotProfiles.length\">\n <button type=\"button\" (click)=\"editSnapshot(null)\"\n class=\"relative block w-full border-2 border-gray-300 border-dashed rounded-lg p-12 text-center hover:border-gray-400 focus:outline-none\">\n\n <div class=\"relative inline-block\">\n <mat-icon\n class=\"mx-auto text-6xl h-14 w-20 text-gray-300\">history\n </mat-icon>\n <svg xmlns=\"http://www.w3.org/2000/svg\"\n class=\"right-0 bottom-0 absolute h-8 w-8 text-gray-400\" fill=\"none\" viewBox=\"0 0 24 24\"\n stroke=\"currentColor\" stroke-width=\"4\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M12 4v16m8-8H4\"/>\n </svg>\n </div>\n\n <span class=\"mt-2 block text-sm font-medium text-gray-900\">Create Snapshot Profile</span>\n </button>\n </div>\n </ng-template>\n <ng-template [ngIf]=\"showQueryCache\">\n <div class=\"px-6 py-3 bg-white border-b border-gray-200\">\n <div class=\"md:flex md:items-center md:justify-between md:space-x-5\">\n <div class=\"flex items-start flex-1\">\n <div class=\"pt-1.5\">\n <h1 class=\"text-xl font-bold text-gray-900 mb-0\">\n <div>Query Caching</div>\n </h1>\n <p class=\"text-xs font-medium text-gray-500\">\n Set up Query Caching on this data set.\n </p>\n </div>\n </div>\n <div class=\"flex flex-1 items-center justify-end\">\n <button type=\"button\" (click)=\"editQueryCache(null)\"\n class=\"inline-flex items-center justify-center px-4 py-1.5 border border-transparent text-sm font-medium rounded-md shadow-sm text-white bg-primary focus:outline-none\">\n <mat-icon>add</mat-icon>\n Create Query Cache\n </button>\n </div>\n\n </div>\n </div>\n <ki-query-cache-view [limit]=\"100\" [showPager]=\"false\" [reload]=\"reloadCache\"\n [datasetInstance]=\"datasetInstanceSummary.id\"></ki-query-cache-view>\n </ng-template>\n </rsz-layout>\n</div>\n\n<div class=\"configure-footer\">\n <button mat-stroked-button [mat-dialog-close]=\"true\" color=\"primary\">\n Cancel\n </button>\n <div class=\"align-center\">\n <button mat-stroked-button color=\"primary\" class=\"mr-2 bg-white\"\n *ngIf=\"canHaveSnapshots && !datasetEditorReadonly\"\n [disabled]=\"!datasetInstanceSummary || !datasetInstanceSummary.id\"\n (click)=\"viewQueryCaching()\">\n Query Caching\n </button>\n <button mat-stroked-button color=\"primary\" class=\"mr-2 bg-white\"\n *ngIf=\"canHaveSnapshots && !datasetEditorReadonly\"\n [disabled]=\"!datasetInstanceSummary || !datasetInstanceSummary.id\"\n (click)=\"viewSnapshots()\">\n Manage Snapshots\n </button>\n <button *ngIf=\"canExportData\" mat-stroked-button color=\"primary\" class=\"mr-2 bg-white\" (click)=\"exportData()\">\n Export Data\n </button>\n <button *ngIf=\"!datasetEditorReadonly\" mat-flat-button color=\"primary\" (click)=\"saveChanges()\">\n Save & Exit\n </button>\n </div>\n\n</div>\n", styles: [":host{display:flex;flex-direction:column;height:100dvh;width:100vw}.configure-header{height:60px;width:100%;background-color:#fff;display:flex;align-items:center;justify-content:space-between;padding:0 1rem;box-sizing:border-box;font-size:1.2rem;font-weight:500}.configure-content{flex:1;background-color:#f5f5f5;overflow:hidden;display:flex;width:100%;height:100%;flex-direction:column}.configure-content rsz-layout.row{height:100%;background-color:transparent}.configure-content rsz-layout.row.top{width:100%;display:flex;flex-basis:65%;position:relative;background-color:#fff}.configure-content rsz-layout.row .rg-bottom{background-color:#dadada}.configure-content rsz-layout.row.bottom{width:100%;flex-basis:35%;display:flex;flex-direction:column;position:relative;overflow:hidden}.configure-content rsz-layout.row .cell{border-bottom:none;border-top:none;position:relative;padding:1rem}.configure-content rsz-layout.row .cell.no-p{padding:0}.configure-content rsz-layout.row .left{flex-basis:65%}.configure-content rsz-layout.row .right{border-right:none}.cell-contents{position:absolute;inset:0;padding:1rem}.cell-contents::-webkit-scrollbar{width:1em;background:transparent}.cell-contents::-webkit-scrollbar-thumb{background:#d2d2d2}.cell-contents.pad{padding:2rem}.cell-contents.bar-space{margin-top:30px}.cell-contents.no-p{padding:0}.cell-contents .entity-header{padding:1rem}.cell-contents .cell-header{height:50px;width:100%;display:flex;align-items:center;justify-content:space-between}.configure-footer{height:60px;width:100%;background-color:#f0f0f0;display:flex;align-items:center;justify-content:space-between;padding:0 1rem;box-sizing:border-box}\n"], dependencies: [{ kind: "directive", type: i6.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i6.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i6.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: i7.MatLegacyButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: i8.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i1.MatLegacyDialogClose, selector: "[mat-dialog-close], [matDialogClose]", inputs: ["aria-label", "type", "mat-dialog-close", "matDialogClose"], exportAs: ["matDialogClose"] }, { kind: "component", type: i9.ResizableComponent, selector: "rsz-layout", inputs: ["rFlex", "directions"], outputs: ["resizeStart", "resizing", "resizeEnd"] }, { kind: "directive", type: i10.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i10.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i10.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i11.MatLegacyRadioGroup, selector: "mat-radio-group", exportAs: ["matRadioGroup"] }, { kind: "component", type: i11.MatLegacyRadioButton, selector: "mat-radio-button", inputs: ["disableRipple", "tabIndex"], exportAs: ["matRadioButton"] }, { kind: "directive", type: i12.MatLegacyTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }, { kind: "component", type: i13.DatasetEditorComponent, selector: "ki-dataset-editor", inputs: ["datasetInstanceSummary", "environment", "admin", "dashboardParameters", "dashboardLayoutSettings", "accountId", "newTitle", "newDescription", "datasetEditorReadonly", "datasetEditorSimpleMode", "datasetEditorNoTools"], outputs: ["dataLoaded", "datasetInstanceSummaryChange"] }, { kind: "component", type: i14.QueryCacheViewComponent, selector: "ki-query-cache-view", inputs: ["admin", "reload", "showPager", "limit", "datasetInstance"] }] });
227
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: DataExplorerComponent, decorators: [{
228
- type: Component,
229
- args: [{ selector: 'ki-data-explorer', host: { class: 'configure-dialog' }, template: "<div class=\"bg-gray-50 configure-header border-b border-gray-200\">\n <div class=\"w-full flex items-center\">\n <ng-template [ngIf]=\"datasetInstanceSummary && datasetInstanceSummary.title && !editTitle\">\n <div (click)=\"editTitle = !editTitle\">{{ datasetInstanceSummary.title }}</div>\n </ng-template>\n <ng-template [ngIf]=\"datasetInstanceSummary && editTitle\">\n <input type=\"text\" class=\"w-1/4 text-sm\"\n [(ngModel)]=\"datasetInstanceSummary.title\" (blur)=\"editTitle = false\">\n </ng-template>\n <ng-template [ngIf]=\"!datasetInstanceSummary || !datasetInstanceSummary.title\">\n Data Explorer\n </ng-template>\n\n </div>\n\n <div class=\"flex items-center\">\n <mat-radio-group class=\"flex items-center text-sm\"\n *ngIf=\"admin\" aria-label=\"Select a scope\" [(ngModel)]=\"accountId\">\n <mat-radio-button class=\"mt-0\" [value]=\"null\">Data Feed</mat-radio-button>\n <mat-radio-button class=\"mt-0 ml-2\" [value]=\"0\">Stored Query</mat-radio-button>\n </mat-radio-group>\n </div>\n\n</div>\n<nav class=\"h-10 flex border-b border-gray-200 bg-white\" aria-label=\"Breadcrumb\">\n <ol role=\"list\" class=\"flex w-full px-4\">\n <li class=\"flex\">\n <div class=\"flex items-center\">\n <a [mat-dialog-close]=\"{breadcrumb: '/'}\" class=\"text-gray-600 hover:text-gray-800 flex items-center\">\n <span class=\"material-symbols-outlined\">home</span>\n </a>\n </div>\n </li>\n\n <li class=\"flex truncate\">\n <div class=\"flex items-center\">\n <svg class=\"h-full w-6 flex-shrink-0 text-gray-200\" viewBox=\"0 0 24 44\" preserveAspectRatio=\"none\"\n fill=\"currentColor\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path d=\"M.293 0l22 22-22 22h1.414l22-22-22-22H.293z\"/>\n </svg>\n <a [mat-dialog-close]=\"true\"\n class=\"capitalize ml-4 text-sm font-medium text-gray-500 hover:text-gray-700\">\n {{ breadcrumb }}</a>\n </div>\n </li>\n\n <li class=\"flex truncate\" *ngIf=\"datasetInstanceSummary\">\n <div class=\"flex items-center\">\n <svg class=\"h-full w-6 flex-shrink-0 text-gray-200\" viewBox=\"0 0 24 44\" preserveAspectRatio=\"none\"\n fill=\"currentColor\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path d=\"M.293 0l22 22-22 22h1.414l22-22-22-22H.293z\"/>\n </svg>\n <a class=\"ml-4 text-sm font-medium text-gray-500 hover:text-gray-700\" aria-current=\"page\">\n {{ datasetInstanceSummary.title || 'Data Explorer' }}\n </a>\n <ng-template [ngIf]=\"datasetInstanceSummary && datasetInstanceSummary.source\">\n <span\n class=\"flex items-center border border-gray-200 text-xs px-2 py-0 rounded-xl ml-2 font-thin bg-gray-100\">\n <span class=\"uppercase tracking-wider text-gray-700 font-medium\">Querying:</span>\n <ng-template [ngIf]=\"datasetInstanceSummary.source.datasourceInstanceKey\">\n <img *ngIf=\"['custom', 'snapshot'].indexOf(datasetInstanceSummary.source.type) === -1\"\n src=\"/assets/favicon.png\" class=\"w-2.5 mx-1.5\">\n <span *ngIf=\"datasetInstanceSummary.source.type === 'custom'\"\n class=\"material-symbols-outlined h-4 w-4 text-lg leading-4 mx-1.5\">upload_file</span>\n <span *ngIf=\"datasetInstanceSummary.source.type === 'snapshot'\"\n class=\"material-symbols-outlined h-4 w-4 text-lg leading-4 mx-1.5\">history</span>\n </ng-template>\n <ng-template [ngIf]=\"!datasetInstanceSummary.source.datasourceInstanceKey\">\n <span class=\"material-symbols-outlined h-4 w-4 text-lg leading-4 mx-1.5\">query_stats</span>\n </ng-template>\n &nbsp;{{ datasetInstanceSummary.source.title }}\n <span class=\"material-symbols-outlined ml-2 cursor-pointer\" title=\"Change source query\"\n (click)=\"changeSource()\">change_circle</span>\n </span>\n </ng-template>\n </div>\n </li>\n </ol>\n</nav>\n<div class=\"configure-content\">\n\n <rsz-layout class=\"row top\" [directions]=\"(showSnapshots || showQueryCache) ? ['bottom'] : ['none']\"\n [rFlex]=\"(showSnapshots || showQueryCache)\">\n\n <rsz-layout class=\"cell left no-p\" [directions]=\"showChart ? ['right'] : ['none']\" [rFlex]=\"true\"\n [ngStyle]=\"{'flex-basis': showChart ? '65%' : '100%'}\">\n <div class=\"cell-contents no-p\">\n <ki-dataset-editor #datasetEditorComponent [(datasetInstanceSummary)]=\"datasetInstanceSummary\"\n [accountId]=\"accountId\" [newTitle]=\"newTitle\" [newDescription]=\"newDescription\"\n (dataLoaded)=\"dataLoaded($event)\" [admin]=\"admin\"\n [datasetEditorReadonly]=\"datasetEditorReadonly\"\n [datasetEditorSimpleMode]=\"datasetEditorSimpleMode\"\n [datasetEditorNoTools]=\"datasetEditorNoTools\"></ki-dataset-editor>\n </div>\n </rsz-layout>\n </rsz-layout>\n\n <rsz-layout *ngIf=\"showSnapshots || showQueryCache\" class=\"row bottom\" [directions]=\"['none']\" [rFlex]=\"false\"\n [ngClass]=\"{'overflow-y-scroll': showQueryCache}\">\n <ng-template [ngIf]=\"showSnapshots\">\n <div class=\"px-6 py-3 bg-white border-b border-gray-200\">\n <div class=\"md:flex md:items-center md:justify-between md:space-x-5\">\n <div class=\"flex items-start flex-1\">\n <div class=\"pt-1.5\">\n <h1 class=\"text-xl font-bold text-gray-900 mb-0\">\n <div>Snapshot Profiles</div>\n </h1>\n <p class=\"text-xs font-medium text-gray-500\">\n A list of all the snapshots that have been created for this stored query.\n </p>\n </div>\n </div>\n\n <div class=\"flex flex-1 items-center justify-end\">\n <button type=\"button\" (click)=\"apiAccess()\"\n class=\"inline-flex items-center justify-center px-4 py-2 mr-3 border border-transparent text-sm font-medium rounded-md shadow-sm text-primary bg-gray-100 focus:outline-none\">\n API Access\n </button>\n\n <button type=\"button\" (click)=\"editSnapshot(null)\"\n class=\"inline-flex items-center justify-center px-4 py-1.5 border border-transparent text-sm font-medium rounded-md shadow-sm text-white bg-primary focus:outline-none\">\n <mat-icon>add</mat-icon>\n New Snapshot Profile\n </button>\n </div>\n </div>\n </div>\n <div class=\"px-4 sm:px-6 lg:px-8 mt-0\">\n <div class=\"flex flex-col\">\n <div class=\"-my-2 -mx-4 sm:-mx-6 lg:-mx-8\">\n <div class=\"inline-block min-w-full py-2 align-middle\">\n <table *ngIf=\"snapshotProfiles.length\"\n class=\"min-w-full border-separate\" style=\"border-spacing: 0\">\n <thead class=\"bg-gray-100\">\n <tr>\n <th scope=\"col\"\n class=\"sticky top-0 z-10 border-b border-gray-300 bg-gray-50 bg-opacity-75 py-3.5 px-4 text-left text-xs font-semibold text-gray-900 backdrop-blur backdrop-filter\">\n </th>\n <th scope=\"col\"\n class=\"sticky top-0 z-10 border-b border-gray-300 bg-gray-50 bg-opacity-75 py-3.5 px-4 text-left text-xs font-semibold text-gray-900 backdrop-blur backdrop-filter\">\n Title\n </th>\n <th scope=\"col\"\n class=\"sticky top-0 z-10 border-b border-gray-300 bg-gray-50 bg-opacity-75 py-3.5 px-4 text-left text-xs font-semibold text-gray-900 backdrop-blur backdrop-filter\">\n Status\n </th>\n <th scope=\"col\"\n class=\"sticky top-0 z-10 border-b border-gray-300 bg-gray-50 bg-opacity-75 py-3.5 px-4 text-left text-xs font-semibold text-gray-900 backdrop-blur backdrop-filter\">\n Last Started\n </th>\n <th scope=\"col\"\n class=\"sticky top-0 z-10 border-b border-gray-300 bg-gray-50 bg-opacity-75 py-3.5 px-4 text-left text-xs font-semibold text-gray-900 backdrop-blur backdrop-filter\">\n Next Start Time\n </th>\n <th scope=\"col\"\n class=\"sticky top-0 z-10 border-b border-gray-300 bg-gray-50 bg-opacity-75 py-3.5 px-4 backdrop-blur backdrop-filter\">\n <span class=\"sr-only\">Edit</span>\n </th>\n </tr>\n </thead>\n <tbody class=\"bg-white\">\n <tr *ngFor=\"let snapshot of snapshotProfiles; let i = index\">\n <td>\n <button *ngIf=\"snapshot.taskStatus !== 'RUNNING'\" color=\"primary\"\n matTooltip=\"Trigger snapshot to run now\" mat-icon-button\n (click)=\"triggerSnapshot(snapshot.key)\">\n <mat-icon>play_arrow</mat-icon>\n </button>\n <svg *ngIf=\"snapshot.taskStatus === 'RUNNING'\"\n class=\"animate-spin ml-3 mr-2 h-5 w-5 text-secondary\"\n xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\">\n <circle class=\"opacity-25\" cx=\"12\" cy=\"12\" r=\"10\" stroke=\"currentColor\"\n stroke-width=\"4\"></circle>\n <path class=\"opacity-75\" fill=\"currentColor\"\n d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z\"></path>\n </svg>\n </td>\n <td class=\"whitespace-nowrap border-b border-gray-200 py-2 px-4 text-sm font-medium text-gray-900\">\n {{ snapshot.title }}\n </td>\n <td class=\"whitespace-nowrap border-b border-gray-200 py-0.5 px-2 text-sm text-gray-500\">\n <div\n class=\"inline-flex text-sm lowercase flex items-center text-white px-3 rounded-full\"\n [ngClass]=\"{'py-0.5': snapshot.taskStatus !== 'RUNNING','py-1': snapshot.taskStatus === 'RUNNING', 'bg-gray-400': snapshot.taskStatus === 'PENDING', 'bg-secondary': snapshot.taskStatus === 'RUNNING', 'bg-success': snapshot.taskStatus === 'COMPLETED', 'bg-danger': snapshot.taskStatus === 'FAILED'}\">\n <ng-template [ngIf]=\"snapshot.taskStatus === 'PENDING'\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\"\n stroke-width=\"1.5\" stroke=\"currentColor\"\n class=\"-ml-1 w-6 h-6 mr-2\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\"\n d=\"M12 6v6h4.5m4.5 0a9 9 0 11-18 0 9 9 0 0118 0z\"/>\n </svg>\n </ng-template>\n <ng-template [ngIf]=\"snapshot.taskStatus === 'RUNNING'\">\n <svg class=\"animate-spin -ml-1 mr-3 h-5 w-5 text-white\"\n xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\">\n <circle class=\"opacity-25\" cx=\"12\" cy=\"12\" r=\"10\"\n stroke=\"currentColor\"\n stroke-width=\"4\"></circle>\n <path class=\"opacity-75\" fill=\"currentColor\"\n d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z\"></path>\n </svg>\n </ng-template>\n <ng-template [ngIf]=\"snapshot.taskStatus === 'COMPLETED'\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\"\n stroke-width=\"1.5\" stroke=\"currentColor\"\n class=\"-ml-1 w-6 h-6 mr-2\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\"\n d=\"M9 12.75L11.25 15 15 9.75M21 12a9 9 0 11-18 0 9 9 0 0118 0z\"/>\n </svg>\n </ng-template>\n <ng-template [ngIf]=\"snapshot.taskStatus === 'FAILED'\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\"\n stroke-width=\"1.5\" stroke=\"currentColor\"\n class=\"-ml-1 w-6 h-6 mr-2\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\"\n d=\"M12 9v3.75m-9.303 3.376c-.866 1.5.217 3.374 1.948 3.374h14.71c1.73 0 2.813-1.874 1.948-3.374L13.949 3.378c-.866-1.5-3.032-1.5-3.898 0L2.697 16.126zM12 15.75h.007v.008H12v-.008z\"/>\n </svg>\n </ng-template>\n <ng-template [ngIf]=\"snapshot.taskStatus === 'TIMED_OUT'\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\"\n stroke-width=\"1.5\" stroke=\"currentColor\"\n class=\"-ml-1 w-6 h-6 mr-2\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\"\n d=\"M14.25 9v6m-4.5 0V9M21 12a9 9 0 11-18 0 9 9 0 0118 0z\"/>\n </svg>\n </ng-template>\n {{ _.startCase(snapshot.taskStatus) }}\n </div>\n </td>\n <td class=\"whitespace-nowrap border-b border-gray-200 py-2 px-4 text-sm text-gray-500\">\n {{ snapshot.taskLastStartTime }}\n </td>\n <td class=\"whitespace-nowrap border-b border-gray-200 py-2 px-4 text-sm text-gray-500\">\n {{ snapshot.taskNextStartTime }}\n </td>\n <td class=\"relative whitespace-nowrap border-b border-gray-200 py-2 px-4 text-right text-sm\">\n <div class=\"align-center justify-end\">\n <button mat-button color=\"primary\" (click)=\"editSnapshot(snapshot)\"> Edit\n </button>\n <div class=\"divider\"></div>\n <button mat-button color=\"warn\" (click)=\"deleteSnapshot(snapshot)\"> Delete\n </button>\n </div>\n </td>\n </tr>\n\n </tbody>\n\n </table>\n </div>\n </div>\n </div>\n </div>\n\n <div class=\"p-4\" *ngIf=\"!snapshotProfiles.length\">\n <button type=\"button\" (click)=\"editSnapshot(null)\"\n class=\"relative block w-full border-2 border-gray-300 border-dashed rounded-lg p-12 text-center hover:border-gray-400 focus:outline-none\">\n\n <div class=\"relative inline-block\">\n <mat-icon\n class=\"mx-auto text-6xl h-14 w-20 text-gray-300\">history\n </mat-icon>\n <svg xmlns=\"http://www.w3.org/2000/svg\"\n class=\"right-0 bottom-0 absolute h-8 w-8 text-gray-400\" fill=\"none\" viewBox=\"0 0 24 24\"\n stroke=\"currentColor\" stroke-width=\"4\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M12 4v16m8-8H4\"/>\n </svg>\n </div>\n\n <span class=\"mt-2 block text-sm font-medium text-gray-900\">Create Snapshot Profile</span>\n </button>\n </div>\n </ng-template>\n <ng-template [ngIf]=\"showQueryCache\">\n <div class=\"px-6 py-3 bg-white border-b border-gray-200\">\n <div class=\"md:flex md:items-center md:justify-between md:space-x-5\">\n <div class=\"flex items-start flex-1\">\n <div class=\"pt-1.5\">\n <h1 class=\"text-xl font-bold text-gray-900 mb-0\">\n <div>Query Caching</div>\n </h1>\n <p class=\"text-xs font-medium text-gray-500\">\n Set up Query Caching on this data set.\n </p>\n </div>\n </div>\n <div class=\"flex flex-1 items-center justify-end\">\n <button type=\"button\" (click)=\"editQueryCache(null)\"\n class=\"inline-flex items-center justify-center px-4 py-1.5 border border-transparent text-sm font-medium rounded-md shadow-sm text-white bg-primary focus:outline-none\">\n <mat-icon>add</mat-icon>\n Create Query Cache\n </button>\n </div>\n\n </div>\n </div>\n <ki-query-cache-view [limit]=\"100\" [showPager]=\"false\" [reload]=\"reloadCache\"\n [datasetInstance]=\"datasetInstanceSummary.id\"></ki-query-cache-view>\n </ng-template>\n </rsz-layout>\n</div>\n\n<div class=\"configure-footer\">\n <button mat-stroked-button [mat-dialog-close]=\"true\" color=\"primary\">\n Cancel\n </button>\n <div class=\"align-center\">\n <button mat-stroked-button color=\"primary\" class=\"mr-2 bg-white\"\n *ngIf=\"canHaveSnapshots && !datasetEditorReadonly\"\n [disabled]=\"!datasetInstanceSummary || !datasetInstanceSummary.id\"\n (click)=\"viewQueryCaching()\">\n Query Caching\n </button>\n <button mat-stroked-button color=\"primary\" class=\"mr-2 bg-white\"\n *ngIf=\"canHaveSnapshots && !datasetEditorReadonly\"\n [disabled]=\"!datasetInstanceSummary || !datasetInstanceSummary.id\"\n (click)=\"viewSnapshots()\">\n Manage Snapshots\n </button>\n <button *ngIf=\"canExportData\" mat-stroked-button color=\"primary\" class=\"mr-2 bg-white\" (click)=\"exportData()\">\n Export Data\n </button>\n <button *ngIf=\"!datasetEditorReadonly\" mat-flat-button color=\"primary\" (click)=\"saveChanges()\">\n Save & Exit\n </button>\n </div>\n\n</div>\n", styles: [":host{display:flex;flex-direction:column;height:100dvh;width:100vw}.configure-header{height:60px;width:100%;background-color:#fff;display:flex;align-items:center;justify-content:space-between;padding:0 1rem;box-sizing:border-box;font-size:1.2rem;font-weight:500}.configure-content{flex:1;background-color:#f5f5f5;overflow:hidden;display:flex;width:100%;height:100%;flex-direction:column}.configure-content rsz-layout.row{height:100%;background-color:transparent}.configure-content rsz-layout.row.top{width:100%;display:flex;flex-basis:65%;position:relative;background-color:#fff}.configure-content rsz-layout.row .rg-bottom{background-color:#dadada}.configure-content rsz-layout.row.bottom{width:100%;flex-basis:35%;display:flex;flex-direction:column;position:relative;overflow:hidden}.configure-content rsz-layout.row .cell{border-bottom:none;border-top:none;position:relative;padding:1rem}.configure-content rsz-layout.row .cell.no-p{padding:0}.configure-content rsz-layout.row .left{flex-basis:65%}.configure-content rsz-layout.row .right{border-right:none}.cell-contents{position:absolute;inset:0;padding:1rem}.cell-contents::-webkit-scrollbar{width:1em;background:transparent}.cell-contents::-webkit-scrollbar-thumb{background:#d2d2d2}.cell-contents.pad{padding:2rem}.cell-contents.bar-space{margin-top:30px}.cell-contents.no-p{padding:0}.cell-contents .entity-header{padding:1rem}.cell-contents .cell-header{height:50px;width:100%;display:flex;align-items:center;justify-content:space-between}.configure-footer{height:60px;width:100%;background-color:#f0f0f0;display:flex;align-items:center;justify-content:space-between;padding:0 1rem;box-sizing:border-box}\n"] }]
230
- }], ctorParameters: function () { return [{ type: i1.MatLegacyDialogRef }, { type: undefined, decorators: [{
231
- type: Inject,
232
- args: [MAT_DIALOG_DATA]
233
- }] }, { type: i1.MatLegacyDialog }, { type: i2.DatasetService }, { type: i3.Router }, { type: i4.ProjectService }, { type: i5.DataProcessorService }]; }, propDecorators: { datasetEditorComponent: [{
234
- type: ViewChild,
235
- args: ['datasetEditorComponent']
236
- }], datasetEditorReadonly: [{
237
- type: Input
238
- }], datasetEditorSimpleMode: [{
239
- type: Input
240
- }], datasetEditorNoTools: [{
241
- type: Input
242
- }] } });
243
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YS1leHBsb3Jlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZy1raW5pbnRlbC9zcmMvbGliL2NvbXBvbmVudHMvZGF0YS1leHBsb3Jlci9kYXRhLWV4cGxvcmVyLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25nLWtpbmludGVsL3NyYy9saWIvY29tcG9uZW50cy9kYXRhLWV4cGxvcmVyL2RhdGEtZXhwbG9yZXIuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLFNBQVMsRUFBYyxNQUFNLEVBQUUsS0FBSyxFQUFxQixTQUFTLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDakcsT0FBTyxFQUNILHNCQUFzQixJQUFJLGVBQWUsRUFHNUMsTUFBTSxpQ0FBaUMsQ0FBQztBQUN6QyxPQUFPLEVBQUMsMEJBQTBCLEVBQUMsTUFBTSw2RUFBNkUsQ0FBQztBQUd2SCxPQUFPLEVBQ0gsOEJBQThCLEVBQ2pDLE1BQU0sNEVBQTRFLENBQUM7QUFDcEYsT0FBTyxFQUFDLG1CQUFtQixFQUFDLE1BQU0scUNBQXFDLENBQUM7QUFFeEUsT0FBTyxLQUFLLE1BQU0sTUFBTSxRQUFRLENBQUM7QUFFakMsT0FBTyxFQUNILDBCQUEwQixFQUM3QixNQUFNLHFEQUFxRCxDQUFDO0FBQzdELE9BQU8sRUFDSCx1QkFBdUIsRUFDMUIsTUFBTSw4REFBOEQsQ0FBQztBQUN0RSxPQUFPLEVBQUMsT0FBTyxFQUFDLE1BQU0sTUFBTSxDQUFDO0FBQzdCLE9BQU8sRUFBQyxzQkFBc0IsRUFBQyxNQUFNLG9EQUFvRCxDQUFDO0FBRTFGLE9BQU8sRUFBQyw0QkFBNEIsRUFBQyxNQUFNLHlEQUF5RCxDQUFDOzs7Ozs7Ozs7Ozs7Ozs7O0FBR3JHLE1BQU0sQ0FBQyxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUM7QUFRekIsTUFBTSxPQUFPLHFC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QVM7K0JBQ0ksa0JBQWtCLFFBR3RCLEVBQUMsS0FBSyxFQUFFLGtCQUFrQixFQUFDOzswQkFrQ3BCLE1BQU07MkJBQUMsZUFBZTs0TEE5QkUsc0JBQXNCO3NCQUExRCxTQUFTO3VCQUFDLHdCQUF3QjtnQkFFMUIscUJBQXFCO3NCQUE3QixLQUFLO2dCQUNHLHVCQUF1QjtzQkFBL0IsS0FBSztnQkFDRyxvQkFBb0I7c0JBQTVCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0NvbXBvbmVudCwgRWxlbWVudFJlZiwgSW5qZWN0LCBJbnB1dCwgT25EZXN0cm95LCBPbkluaXQsIFZpZXdDaGlsZH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICAgIE1BVF9MRUdBQ1lfRElBTE9HX0RBVEEgYXMgTUFUX0RJQUxPR19EQVRBLFxuICAgIE1hdExlZ2FjeURpYWxvZyBhcyBNYXREaWFsb2csXG4gICAgTWF0TGVnYWN5RGlhbG9nUmVmIGFzIE1hdERpYWxvZ1JlZlxufSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9sZWdhY3ktZGlhbG9nJztcbmltcG9ydCB7RGF0YXNldE5hbWVEaWFsb2dDb21wb25lbnR9IGZyb20gJy4uL2RhdGFzZXQvZGF0YXNldC1lZGl0b3IvZGF0YXNldC1uYW1lLWRpYWxvZy9kYXRhc2V0LW5hbWUtZGlhbG9nLmNvbXBvbmVudCc7XG5pbXBvcnQge0RhdGFzZXRTZXJ2aWNlfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9kYXRhc2V0LnNlcnZpY2UnO1xuaW1wb3J0IHtSb3V0ZXJ9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQge1xuICAgIFNuYXBzaG90UHJvZmlsZURpYWxvZ0NvbXBvbmVudFxufSBmcm9tICcuLi9kYXRhLWV4cGxvcmVyL3NuYXBzaG90LXByb2ZpbGUtZGlhbG9nL3NuYXBzaG90LXByb2ZpbGUtZGlhbG9nLmNvbXBvbmVudCc7XG5pbXBvcnQge0V4cG9ydERhdGFDb21wb25lbnR9IGZyb20gJy4vZXhwb3J0LWRhdGEvZXhwb3J0LWRhdGEuY29tcG9uZW50JztcbmltcG9ydCB7UHJvamVjdFNlcnZpY2V9IGZyb20gJy4uLy4uL3NlcnZpY2VzL3Byb2plY3Quc2VydmljZSc7XG5pbXBvcnQgKiBhcyBsb2Rhc2ggZnJvbSAnbG9kYXNoJztcbmltcG9ydCB7RGF0YVByb2Nlc3NvclNlcnZpY2V9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2RhdGEtcHJvY2Vzc29yLnNlcnZpY2UnO1xuaW1wb3J0IHtcbiAgICBTbmFwc2hvdEFwaUFjY2Vzc0NvbXBvbmVudFxufSBmcm9tICcuL3NuYXBzaG90LWFwaS1hY2Nlc3Mvc25hcHNob3QtYXBpLWFjY2Vzcy5jb21wb25lbnQnO1xuaW1wb3J0IHtcbiAgICBFZGl0UXVlcnlDYWNoZUNvbXBvbmVudFxufSBmcm9tICcuLi9xdWVyeS1jYWNoaW5nL2VkaXQtcXVlcnktY2FjaGUvZWRpdC1xdWVyeS1jYWNoZS5jb21wb25lbnQnO1xuaW1wb3J0IHtTdWJqZWN0fSBmcm9tICdyeGpzJztcbmltcG9ydCB7Q3JlYXRlRGF0YXNldENvbXBvbmVudH0gZnJvbSAnLi4vZGF0YXNldC9jcmVhdGUtZGF0YXNldC9jcmVhdGUtZGF0YXNldC5jb21wb25lbnQnO1xuaW1wb3J0IHtEYXRhc2V0RWRpdG9yQ29tcG9uZW50fSBmcm9tICcuLi9kYXRhc2V0L2RhdGFzZXQtZWRpdG9yL2RhdGFzZXQtZWRpdG9yLmNvbXBvbmVudCc7XG5pbXBvcnQge0NoYW5nZVNvdXJjZVdhcm5pbmdDb21wb25lbnR9IGZyb20gJy4vY2hhbmdlLXNvdXJjZS13YXJuaW5nL2NoYW5nZS1zb3VyY2Utd2FybmluZy5jb21wb25lbnQnO1xuXG5cbmNvbnN0IF8gPSBsb2Rhc2guZGVmYXVsdDtcblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICdraS1kYXRhLWV4cGxvcmVyJyxcbiAgICB0ZW1wbGF0ZVVybDogJy4vZGF0YS1leHBsb3Jlci5jb21wb25lbnQuaHRtbCcsXG4gICAgc3R5bGVVcmxzOiBbJy4vZGF0YS1leHBsb3Jlci5jb21wb25lbnQuc2FzcyddLFxuICAgIGhvc3Q6IHtjbGFzczogJ2NvbmZpZ3VyZS1kaWFsb2cnfVxufSlcbmV4cG9ydCBjbGFzcyBEYXRhRXhwbG9yZXJDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XG5cbiAgICBAVmlld0NoaWxkKCdkYXRhc2V0RWRpdG9yQ29tcG9uZW50JykgZGF0YXNldEVkaXRvckNvbXBvbmVudDogRGF0YXNldEVkaXRvckNvbXBvbmVudDtcblxuICAgIEBJbnB1dCgpIGRhdGFzZXRFZGl0b3JSZWFkb25seSA9IGZhbHNlO1xuICAgIEBJbnB1dCgpIGRhdGFzZXRFZGl0b3JTaW1wbGVNb2RlID0gZmFsc2U7XG4gICAgQElucHV0KCkgZGF0YXNldEVkaXRvck5vVG9vbHM6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAgIHB1YmxpYyBfID0gXztcbiAgICBwdWJsaWMgYmFja2VuZFVybDogc3RyaW5nO1xuICAgIHB1YmxpYyBzaG93Q2hhcnQgPSBmYWxzZTtcbiAgICBwdWJsaWMgY2hhcnREYXRhO1xuICAgIHB1YmxpYyBkYXRhc2V0SW5zdGFuY2VTdW1tYXJ5OiBhbnk7XG4gICAgcHVibGljIGZpbHRlcnM6IGFueTtcbiAgICBwdWJsaWMgYWRtaW46IGJvb2xlYW47XG4gICAgcHVibGljIHNob3dTbmFwc2hvdHMgPSBmYWxzZTtcbiAgICBwdWJsaWMgc25hcHNob3RQcm9maWxlczogYW55ID0gW107XG4gICAgcHVibGljIHNob3dRdWVyeUNhY2hlID0gZmFsc2U7XG4gICAgcHVibGljIGVkaXRUaXRsZSA9IGZhbHNlO1xuICAgIHB1YmxpYyBhY2NvdW50SWQ6IGFueTtcbiAgICBwdWJsaWMgbmV3VGl0bGU6IHN0cmluZztcbiAgICBwdWJsaWMgbmV3RGVzY3JpcHRpb246IHN0cmluZztcbiAgICBwdWJsaWMgYnJlYWRjcnVtYjogc3RyaW5nO1xuICAgIHB1YmxpYyBjYW5IYXZlU25hcHNob3RzID0gZmFsc2U7XG4gICAgcHVibGljIGNhbkV4cG9ydERhdGEgPSBmYWxzZTtcbiAgICBwdWJsaWMgcmVsb2FkQ2FjaGUgPSBuZXcgU3ViamVjdCgpO1xuXG4gICAgcHJpdmF0ZSBjb2x1bW5zOiBhbnkgPSBbXTtcbiAgICBwcml2YXRlIGRhdGFzZXRUaXRsZTogc3RyaW5nO1xuICAgIHByaXZhdGUgdGltZXI6IG51bWJlcjtcblxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyBkaWFsb2dSZWY6IE1hdERpYWxvZ1JlZjxEYXRhRXhwbG9yZXJDb21wb25lbnQ+LFxuICAgICAgICAgICAgICAgIEBJbmplY3QoTUFUX0RJQUxPR19EQVRBKSBwdWJsaWMgZGF0YTogYW55LFxuICAgICAgICAgICAgICAgIHByaXZhdGUgZGlhbG9nOiBNYXREaWFsb2csXG4gICAgICAgICAgICAgICAgcHJpdmF0ZSBkYXRhc2V0U2VydmljZTogRGF0YXNldFNlcnZpY2UsXG4gICAgICAgICAgICAgICAgcHJpdmF0ZSByb3V0ZXI6IFJvdXRlcixcbiAgICAgICAgICAgICAgICBwcml2YXRlIHByb2plY3RTZXJ2aWNlOiBQcm9qZWN0U2VydmljZSxcbiAgICAgICAgICAgICAgICBwcml2YXRlIGRhdGFQcm9jZXNzb3JTZXJ2aWNlOiBEYXRhUHJvY2Vzc29yU2VydmljZSkge1xuICAgIH1cblxuICAgIG5nT25Jbml0KCk6IHZvaWQge1xuICAgICAgICB0aGlzLmNoYXJ0RGF0YSA9ICEhdGhpcy5kYXRhLnNob3dDaGFydDtcbiAgICAgICAgdGhpcy5kYXRhc2V0SW5zdGFuY2VTdW1tYXJ5ID0gdGhpcy5kYXRhLmRhdGFzZXRJbnN0YW5jZVN1bW1hcnk7XG4gICAgICAgIHRoaXMuYWRtaW4gPSAhIXRoaXMuZGF0YS5hZG1pbjtcbiAgICAgICAgdGhpcy5hY2NvdW50SWQgPSB0aGlzLmRhdGEuYWNjb3VudElkO1xuICAgICAgICB0aGlzLmJyZWFkY3J1bWIgPSB0aGlzLmRhdGEuYnJlYWRjcnVtYjtcbiAgICAgICAgdGhpcy5iYWNrZW5kVXJsID0gdGhpcy5kYXRhLmJhY2tlbmRVcmw7XG4gICAgICAgIHRoaXMuZGF0YXNldEVkaXRvclJlYWRvbmx5ID0gISF0aGlzLmRhdGEuZGF0YXNldEVkaXRvclJlYWRvbmx5O1xuICAgICAgICB0aGlzLmRhdGFzZXRFZGl0b3JTaW1wbGVNb2RlID0gISF0aGlzLmRhdGEuZGF0YXNldEVkaXRvclNpbXBsZU1vZGU7XG4gICAgICAgIHRoaXMuZGF0YXNldEVkaXRvck5vVG9vbHMgPSAhIXRoaXMuZGF0YS5kYXRhc2V0RWRpdG9yTm9Ub29scztcblxuICAgICAgICBpZiAoIXRoaXMuZGF0YXNldEluc3RhbmNlU3VtbWFyeS5pZCkge1xuICAgICAgICAgICAgdGhpcy5kYXRhc2V0VGl0bGUgPSB0aGlzLmRhdGFzZXRJbnN0YW5jZVN1bW1hcnkudGl0bGU7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLm5ld1RpdGxlID0gdGhpcy5kYXRhLm5ld1RpdGxlO1xuICAgICAgICB0aGlzLm5ld0Rlc2NyaXB0aW9uID0gdGhpcy5kYXRhLm5ld0Rlc2NyaXB0aW9uO1xuXG4gICAgICAgIHRoaXMuY2hhcnREYXRhID0gW1xuICAgICAgICAgICAge2RhdGE6IFsxMDAwLCAxNDAwLCAxOTk5LCAyNTAwLCA1MDAwXX0sXG4gICAgICAgIF07XG5cbiAgICAgICAgdGhpcy5jYW5IYXZlU25hcHNob3RzID0gdGhpcy5wcm9qZWN0U2VydmljZS5kb2VzQWN0aXZlUHJvamVjdEhhdmVQcml2aWxlZ2UoJ3NuYXBzaG90YWNjZXNzJyk7XG4gICAgICAgIHRoaXMuY2FuRXhwb3J0RGF0YSA9IHRoaXMucHJvamVjdFNlcnZpY2UuZG9lc0FjdGl2ZVByb2plY3RIYXZlUHJpdmlsZWdlKCdleHBvcnRkYXRhJyk7XG4gICAgfVxuXG4gICAgbmdPbkRlc3Ryb3koKSB7XG4gICAgICAgIGlmICh0aGlzLnRpbWVyKSB7XG4gICAgICAgICAgICBjbGVhckludGVydmFsKHRoaXMudGltZXIpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGNoYW5nZVNvdXJjZSgpIHtcbiAgICAgICAgY29uc3QgZGlhbG9nUmVmID0gdGhpcy5kaWFsb2cub3BlbihDcmVhdGVEYXRhc2V0Q29tcG9uZW50LCB7XG4gICAgICAgICAgICB3aWR0aDogJzEyMDBweCcsXG4gICAgICAgICAgICBoZWlnaHQ6ICc4MDBweCcsXG4gICAgICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgICAgICAgYWRtaW46IHRoaXMuYWRtaW4sXG4gICAgICAgICAgICAgICAgYWNjb3VudElkOiB0aGlzLmFjY291bnRJZFxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgZGlhbG9nUmVmLmFmdGVyQ2xvc2VkKCkuc3Vic2NyaWJlKHJlcyA9PiB7XG4gICAgICAgICAgICBpZiAocmVzKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZGlhbG9nUmVmMiA9IHRoaXMuZGlhbG9nLm9wZW4oQ2hhbmdlU291cmNlV2FybmluZ0NvbXBvbmVudCwge1xuICAgICAgICAgICAgICAgICAgICB3aWR0aDogJzcwMHB4JyxcbiAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiAnMjc1cHgnXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgZGlhbG9nUmVmMi5hZnRlckNsb3NlZCgpLnN1YnNjcmliZShwcm9jZWVkID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHByb2NlZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YXNldEluc3RhbmNlU3VtbWFyeS5kYXRhc2V0SW5zdGFuY2VJZCA9IHJlcy5kYXRhc2V0SW5zdGFuY2VJZDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YXNldEluc3RhbmNlU3VtbWFyeS5kYXRhc291cmNlSW5zdGFuY2VLZXkgPSByZXMuZGF0YXNvdXJjZUluc3RhbmNlS2V5O1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhc2V0SW5zdGFuY2VTdW1tYXJ5LnNvdXJjZSA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZTogcmVzLnRpdGxlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFzZXRJbnN0YW5jZUlkOiByZXMuZGF0YXNldEluc3RhbmNlSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YXNvdXJjZUluc3RhbmNlS2V5OiByZXMuZGF0YXNvdXJjZUluc3RhbmNlS2V5LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IG51bGxcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0cmFuc2Zvcm1hdGlvbiA9IHRoaXMuZGF0YXNldEluc3RhbmNlU3VtbWFyeS50cmFuc2Zvcm1hdGlvbkluc3RhbmNlc1swXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0cmFuc2Zvcm1hdGlvbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YXNldEVkaXRvckNvbXBvbmVudC5leGNsdWRlVXBzdHJlYW1UcmFuc2Zvcm1hdGlvbnModHJhbnNmb3JtYXRpb24sIHRydWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGFzZXRFZGl0b3JDb21wb25lbnQuZXZhbHVhdGVEYXRhc2V0KHRydWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBkYXRhTG9hZGVkKGRhdGEpIHtcbiAgICAgICAgdGhpcy5jb2x1bW5zID0gZGF0YS5jb2x1bW5zO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyB0cmlnZ2VyU25hcHNob3Qoc25hcHNob3RLZXkpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5kYXRhUHJvY2Vzc29yU2VydmljZS50cmlnZ2VyUHJvY2Vzc29yKHNuYXBzaG90S2V5KTtcbiAgICAgICAgdGhpcy5zbmFwc2hvdFByb2ZpbGVzID0gYXdhaXQgdGhpcy5sb2FkUHJvY2Vzc29ySXRlbXMoJ3NuYXBzaG90Jyk7XG4gICAgICAgIHRoaXMudGltZXIgPSBzZXRJbnRlcnZhbChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnNuYXBzaG90UHJvZmlsZXMgPSBhd2FpdCB0aGlzLmxvYWRQcm9jZXNzb3JJdGVtcygnc25hcHNob3QnKTtcbiAgICAgICAgfSwgMzAwMCk7XG4gICAgfVxuXG4gICAgcHVibGljIGFwaUFjY2VzcygpIHtcbiAgICAgICAgY29uc3QgZGlhbG9nUmVmID0gdGhpcy5kaWFsb2cub3BlbihTbmFwc2hvdEFwaUFjY2Vzc0NvbXBvbmVudCwge1xuICAgICAgICAgICAgd2lkdGg6ICc4MDBweCcsXG4gICAgICAgICAgICBoZWlnaHQ6ICc1MzBweCcsXG4gICAgICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgICAgICAgZGF0YXNldEluc3RhbmNlU3VtbWFyeTogdGhpcy5kYXRhc2V0SW5zdGFuY2VTdW1tYXJ5LFxuICAgICAgICAgICAgICAgIGJhY2tlbmRVcmw6IHRoaXMuYmFja2VuZFVybFxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZXhwb3J0RGF0YSgpIHtcbiAgICAgICAgY29uc3QgZGlhbG9nUmVmID0gdGhpcy5kaWFsb2cub3BlbihFeHBvcnREYXRhQ29tcG9uZW50LCB7XG4gICAgICAgICAgICB3aWR0aDogJzYwMHB4JyxcbiAgICAgICAgICAgIGhlaWdodDogJzUzMHB4JyxcbiAgICAgICAgICAgIGRhdGE6IHtcbiAgICAgICAgICAgICAgICBkYXRhc2V0SW5zdGFuY2VTdW1tYXJ5OiBPYmplY3QuYXNzaWduKHt9LCB0aGlzLmRhdGFzZXRJbnN0YW5jZVN1bW1hcnkpXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyB2aWV3U25hcHNob3RzKCkge1xuICAgICAgICB0aGlzLnNob3dRdWVyeUNhY2hlID0gZmFsc2U7XG4gICAgICAgIHRoaXMuc2hvd1NuYXBzaG90cyA9ICF0aGlzLnNob3dTbmFwc2hvdHM7XG4gICAgICAgIGlmICh0aGlzLnNob3dTbmFwc2hvdHMpIHtcbiAgICAgICAgICAgIHRoaXMuc25hcHNob3RQcm9maWxlcyA9IGF3YWl0IHRoaXMubG9hZFByb2Nlc3Nvckl0ZW1zKCdzbmFwc2hvdCcpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGVkaXRTbmFwc2hvdChzbmFwc2hvdCkge1xuICAgICAgICBjb25zdCBkaWFsb2dSZWYgPSB0aGlzLmRpYWxvZy5vcGVuKFNuYXBzaG90UHJvZmlsZURpYWxvZ0NvbXBvbmVudCwge1xuICAgICAgICAgICAgd2lkdGg6ICc5MDBweCcsXG4gICAgICAgICAgICBoZWlnaHQ6ICc5MDBweCcsXG4gICAgICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgICAgICAgc25hcHNob3QsXG4gICAgICAgICAgICAgICAgZGF0YXNldEluc3RhbmNlSWQ6IHRoaXMuZGF0YXNldEluc3RhbmNlU3VtbWFyeS5pZCxcbiAgICAgICAgICAgICAgICBjb2x1bW5zOiB0aGlzLmNvbHVtbnMsXG4gICAgICAgICAgICAgICAgZGF0YXNldEluc3RhbmNlOiB0aGlzLmRhdGFzZXRJbnN0YW5jZVN1bW1hcnlcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIGRpYWxvZ1JlZi5hZnRlckNsb3NlZCgpLnN1YnNjcmliZShhc3luYyByZXMgPT4ge1xuICAgICAgICAgICAgaWYgKHJlcykge1xuICAgICAgICAgICAgICAgIHRoaXMuc25hcHNob3RQcm9maWxlcyA9IGF3YWl0IHRoaXMubG9hZFByb2Nlc3Nvckl0ZW1zKCdzbmFwc2hvdCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgZGVsZXRlU25hcHNob3Qoc25hcHNob3QpIHtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9ICdBcmUgeW91IHN1cmUgeW91IHdvdWxkIGxpa2UgdG8gcmVtb3ZlIHRoaXMgc25hcHNob3Q/JztcbiAgICAgICAgaWYgKHdpbmRvdy5jb25maXJtKG1lc3NhZ2UpKSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLmRhdGFQcm9jZXNzb3JTZXJ2aWNlLnJlbW92ZVByb2Nlc3NvcihzbmFwc2hvdC5rZXkpO1xuICAgICAgICAgICAgdGhpcy5zbmFwc2hvdFByb2ZpbGVzID0gYXdhaXQgdGhpcy5sb2FkUHJvY2Vzc29ySXRlbXMoJ3NuYXBzaG90Jyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgdmlld1F1ZXJ5Q2FjaGluZygpIHtcbiAgICAgICAgdGhpcy5zaG93U25hcHNob3RzID0gZmFsc2U7XG4gICAgICAgIHRoaXMuc2hvd1F1ZXJ5Q2FjaGUgPSAhdGhpcy5zaG93UXVlcnlDYWNoZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZWRpdFF1ZXJ5Q2FjaGUoY2FjaGU6IGFueSkge1xuICAgICAgICBjb25zdCBkaWFsb2dSZWYgPSB0aGlzLmRpYWxvZy5vcGVuKEVkaXRRdWVyeUNhY2hlQ29tcG9uZW50LCB7XG4gICAgICAgICAgICB3aWR0aDogJzkwMHB4JyxcbiAgICAgICAgICAgIGhlaWdodDogJzkwMHB4JyxcbiAgICAgICAgICAgIGRhdGE6IHtcbiAgICAgICAgICAgICAgICBjYWNoZSxcbiAgICAgICAgICAgICAgICBkYXRhc2V0SW5zdGFuY2VJZDogdGhpcy5kYXRhc2V0SW5zdGFuY2VTdW1tYXJ5LmlkLFxuICAgICAgICAgICAgICAgIGNvbHVtbnM6IHRoaXMuY29sdW1ucyxcbiAgICAgICAgICAgICAgICBkYXRhc2V0SW5zdGFuY2U6IHRoaXMuZGF0YXNldEluc3RhbmNlU3VtbWFyeVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgZGlhbG9nUmVmLmFmdGVyQ2xvc2VkKCkuc3Vic2NyaWJlKGFzeW5jIHJlcyA9PiB7XG4gICAgICAgICAgICBpZiAocmVzKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5yZWxvYWRDYWNoZS5uZXh0KERhdGUubm93KCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2F2ZUNoYW5nZXMoKSB7XG4gICAgICAgIGlmICghdGhpcy5kYXRhc2V0SW5zdGFuY2VTdW1tYXJ5LmlkICYmICh0aGlzLmRhdGFzZXRJbnN0YW5jZVN1bW1hcnkudGl0bGUgPT09IHRoaXMuZGF0YXNldFRpdGxlKSkge1xuICAgICAgICAgICAgY29uc3QgZGlhbG9nUmVmID0gdGhpcy5kaWFsb2cub3BlbihEYXRhc2V0TmFtZURpYWxvZ0NvbXBvbmVudCwge1xuICAgICAgICAgICAgICAgIHdpZHRoOiAnNzAwcHgnLFxuICAgICAgICAgICAgICAgIGhlaWdodDogJzgwMHB4JyxcbiAgICAgICAgICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgICAgICAgICAgIGRhdGFzZXRJbnN0YW5jZVN1bW1hcnk6IHRoaXMuZGF0YXNldEluc3RhbmNlU3VtbWFyeVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgZGlhbG9nUmVmLmFmdGVyQ2xvc2VkKCkuc3Vic2NyaWJlKGRhdGFzZXRJbnN0YW5jZVN1bW1hcnkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChkYXRhc2V0SW5zdGFuY2VTdW1tYXJ5KSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YXNldEluc3RhbmNlU3VtbWFyeSA9IGRhdGFzZXRJbnN0YW5jZVN1bW1hcnk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2F2ZURhdGFzZXQoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuc2F2ZURhdGFzZXQoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgc2F2ZURhdGFzZXQoKSB7XG4gICAgICAgIHRoaXMuZGF0YXNldFNlcnZpY2Uuc2F2ZURhdGFzZXQodGhpcy5kYXRhc2V0SW5zdGFuY2VTdW1tYXJ5LCB0aGlzLmFjY291bnRJZCkudGhlbigoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmRpYWxvZ1JlZi5jbG9zZSh0cnVlKTtcbiAgICAgICAgICAgIC8vIHRoaXMucm91dGVyLm5hdmlnYXRlKFsnL2RhdGFzZXQnXSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgbG9hZFByb2Nlc3Nvckl0ZW1zKHR5cGU6IHN0cmluZykge1xuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5kYXRhUHJvY2Vzc29yU2VydmljZS5maWx0ZXJQcm9jZXNzb3JzQnlSZWxhdGVkSXRlbShcbiAgICAgICAgICAgIHR5cGUsXG4gICAgICAgICAgICAnRGF0YXNldEluc3RhbmNlJyxcbiAgICAgICAgICAgIHRoaXMuZGF0YXNldEluc3RhbmNlU3VtbWFyeS5pZFxuICAgICAgICApO1xuICAgIH1cblxufVxuIiwiPGRpdiBjbGFzcz1cImJnLWdyYXktNTAgY29uZmlndXJlLWhlYWRlciBib3JkZXItYiBib3JkZXItZ3JheS0yMDBcIj5cbiAgICA8ZGl2IGNsYXNzPVwidy1mdWxsIGZsZXggaXRlbXMtY2VudGVyXCI+XG4gICAgICAgIDxuZy10ZW1wbGF0ZSBbbmdJZl09XCJkYXRhc2V0SW5zdGFuY2VTdW1tYXJ5ICYmIGRhdGFzZXRJbnN0YW5jZVN1bW1hcnkudGl0bGUgJiYgIWVkaXRUaXRsZVwiPlxuICAgICAgICAgICAgPGRpdiAoY2xpY2spPVwiZWRpdFRpdGxlID0gIWVkaXRUaXRsZVwiPnt7IGRhdGFzZXRJbnN0YW5jZVN1bW1hcnkudGl0bGUgfX08L2Rpdj5cbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgPG5nLXRlbXBsYXRlIFtuZ0lmXT1cImRhdGFzZXRJbnN0YW5jZVN1bW1hcnkgJiYgZWRpdFRpdGxlXCI+XG4gICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz1cInctMS80IHRleHQtc21cIlxuICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiZGF0YXNldEluc3RhbmNlU3VtbWFyeS50aXRsZVwiIChibHVyKT1cImVkaXRUaXRsZSA9IGZhbHNlXCI+XG4gICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgIDxuZy10ZW1wbGF0ZSBbbmdJZl09XCIhZGF0YXNldEluc3RhbmNlU3VtbWFyeSB8fCAhZGF0YXNldEluc3RhbmNlU3VtbWFyeS50aXRsZVwiPlxuICAgICAgICAgICAgRGF0YSBFeHBsb3JlclxuICAgICAgICA8L25nLXRlbXBsYXRlPlxuXG4gICAgPC9kaXY+XG5cbiAgICA8ZGl2IGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXJcIj5cbiAgICAgICAgPG1hdC1yYWRpby1ncm91cCBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIHRleHQtc21cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiYWRtaW5cIiBhcmlhLWxhYmVsPVwiU2VsZWN0IGEgc2NvcGVcIiBbKG5nTW9kZWwpXT1cImFjY291bnRJZFwiPlxuICAgICAgICAgICAgPG1hdC1yYWRpby1idXR0b24gY2xhc3M9XCJtdC0wXCIgW3ZhbHVlXT1cIm51bGxcIj5EYXRhIEZlZWQ8L21hdC1yYWRpby1idXR0b24+XG4gICAgICAgICAgICA8bWF0LXJhZGlvLWJ1dHRvbiBjbGFzcz1cIm10LTAgbWwtMlwiIFt2YWx1ZV09XCIwXCI+U3RvcmVkIFF1ZXJ5PC9tYXQtcmFkaW8tYnV0dG9uPlxuICAgICAgICA8L21hdC1yYWRpby1ncm91cD5cbiAgICA8L2Rpdj5cblxuPC9kaXY+XG48bmF2IGNsYXNzPVwiaC0xMCBmbGV4IGJvcmRlci1iIGJvcmRlci1ncmF5LTIwMCBiZy13aGl0ZVwiIGFyaWEtbGFiZWw9XCJCcmVhZGNydW1iXCI+XG4gICAgPG9sIHJvbGU9XCJsaXN0XCIgY2xhc3M9XCJmbGV4IHctZnVsbCBweC00XCI+XG4gICAgICAgIDxsaSBjbGFzcz1cImZsZXhcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlclwiPlxuICAgICAgICAgICAgICAgIDxhIFttYXQtZGlhbG9nLWNsb3NlXT1cInticmVhZGNydW1iOiAnLyd9XCIgY2xhc3M9XCJ0ZXh0LWdyYXktNjAwIGhvdmVyOnRleHQtZ3JheS04MDAgZmxleCBpdGVtcy1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXRlcmlhbC1zeW1ib2xzLW91dGxpbmVkXCI+aG9tZTwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L2E+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9saT5cblxuICAgICAgICA8bGkgY2xhc3M9XCJmbGV4IHRydW5jYXRlXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgICA8c3ZnIGNsYXNzPVwiaC1mdWxsIHctNiBmbGV4LXNocmluay0wIHRleHQtZ3JheS0yMDBcIiB2aWV3Qm94PVwiMCAwIDI0IDQ0XCIgcHJlc2VydmVBc3BlY3RSYXRpbz1cIm5vbmVcIlxuICAgICAgICAgICAgICAgICAgICAgZmlsbD1cImN1cnJlbnRDb2xvclwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiBhcmlhLWhpZGRlbj1cInRydWVcIj5cbiAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk0uMjkzIDBsMjIgMjItMjIgMjJoMS40MTRsMjItMjItMjItMjJILjI5M3pcIi8+XG4gICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgICAgPGEgW21hdC1kaWFsb2ctY2xvc2VdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjYXBpdGFsaXplIG1sLTQgdGV4dC1zbSBmb250LW1lZGl1bSB0ZXh0LWdyYXktNTAwIGhvdmVyOnRleHQtZ3JheS03MDBcIj5cbiAgICAgICAgICAgICAgICAgICAge3sgYnJlYWRjcnVtYiB9fTwvYT5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2xpPlxuXG4gICAgICAgIDxsaSBjbGFzcz1cImZsZXggdHJ1bmNhdGVcIiAqbmdJZj1cImRhdGFzZXRJbnN0YW5jZVN1bW1hcnlcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlclwiPlxuICAgICAgICAgICAgICAgIDxzdmcgY2xhc3M9XCJoLWZ1bGwgdy02IGZsZXgtc2hyaW5rLTAgdGV4dC1ncmF5LTIwMFwiIHZpZXdCb3g9XCIwIDAgMjQgNDRcIiBwcmVzZXJ2ZUFzcGVjdFJhdGlvPVwibm9uZVwiXG4gICAgICAgICAgICAgICAgICAgICBmaWxsPVwiY3VycmVudENvbG9yXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPlxuICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTS4yOTMgMGwyMiAyMi0yMiAyMmgxLjQxNGwyMi0yMi0yMi0yMkguMjkzelwiLz5cbiAgICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgICAgICA8YSBjbGFzcz1cIm1sLTQgdGV4dC1zbSBmb250LW1lZGl1bSB0ZXh0LWdyYXktNTAwIGhvdmVyOnRleHQtZ3JheS03MDBcIiBhcmlhLWN1cnJlbnQ9XCJwYWdlXCI+XG4gICAgICAgICAgICAgICAgICAgIHt7IGRhdGFzZXRJbnN0YW5jZVN1bW1hcnkudGl0bGUgfHwgJ0RhdGEgRXhwbG9yZXInIH19XG4gICAgICAgICAgICAgICAgPC9hPlxuICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBbbmdJZl09XCJkYXRhc2V0SW5zdGFuY2VTdW1tYXJ5ICYmIGRhdGFzZXRJbnN0YW5jZVN1bW1hcnkuc291cmNlXCI+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIGJvcmRlciBib3JkZXItZ3JheS0yMDAgdGV4dC14cyBweC0yIHB5LTAgcm91bmRlZC14bCBtbC0yIGZvbnQtdGhpbiBiZy1ncmF5LTEwMFwiPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInVwcGVyY2FzZSB0cmFja2luZy13aWRlciB0ZXh0LWdyYXktNzAwIGZvbnQtbWVkaXVtXCI+UXVlcnlpbmc6PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIFtuZ0lmXT1cImRhdGFzZXRJbnN0YW5jZVN1bW1hcnkuc291cmNlLmRhdGFzb3VyY2VJbnN0YW5jZUtleVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbWcgKm5nSWY9XCJbJ2N1c3RvbScsICdzbmFwc2hvdCddLmluZGV4T2YoZGF0YXNldEluc3RhbmNlU3VtbWFyeS5zb3VyY2UudHlwZSkgPT09IC0xXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYz1cIi9hc3NldHMvZmF2aWNvbi5wbmdcIiBjbGFzcz1cInctMi41IG14LTEuNVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiZGF0YXNldEluc3RhbmNlU3VtbWFyeS5zb3VyY2UudHlwZSA9PT0gJ2N1c3RvbSdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cIm1hdGVyaWFsLXN5bWJvbHMtb3V0bGluZWQgaC00IHctNCB0ZXh0LWxnIGxlYWRpbmctNCBteC0xLjVcIj51cGxvYWRfZmlsZTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cImRhdGFzZXRJbnN0YW5jZVN1bW1hcnkuc291cmNlLnR5cGUgPT09ICdzbmFwc2hvdCdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cIm1hdGVyaWFsLXN5bWJvbHMtb3V0bGluZWQgaC00IHctNCB0ZXh0LWxnIGxlYWRpbmctNCBteC0xLjVcIj5oaXN0b3J5PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBbbmdJZl09XCIhZGF0YXNldEluc3RhbmNlU3VtbWFyeS5zb3VyY2UuZGF0YXNvdXJjZUluc3RhbmNlS2V5XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXRlcmlhbC1zeW1ib2xzLW91dGxpbmVkIGgtNCB3LTQgdGV4dC1sZyBsZWFkaW5nLTQgbXgtMS41XCI+cXVlcnlfc3RhdHM8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICAgICAgICAgICAgJm5ic3A7e3sgZGF0YXNldEluc3RhbmNlU3VtbWFyeS5zb3VyY2UudGl0bGUgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWF0ZXJpYWwtc3ltYm9scy1vdXRsaW5lZCBtbC0yIGN1cnNvci1wb2ludGVyXCIgdGl0bGU9XCJDaGFuZ2Ugc291cmNlIHF1ZXJ5XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiY2hhbmdlU291cmNlKClcIj5jaGFuZ2VfY2lyY2xlPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2xpPlxuICAgIDwvb2w+XG48L25hdj5cbjxkaXYgY2xhc3M9XCJjb25maWd1cmUtY29udGVudFwiPlxuXG4gICAgPHJzei1sYXlvdXQgY2xhc3M9XCJyb3cgdG9wXCIgW2RpcmVjdGlvbnNdPVwiKHNob3dTbmFwc2hvdHMgfHwgc2hvd1F1ZXJ5Q2FjaGUpID8gWydib3R0b20nXSA6IFsnbm9uZSddXCJcbiAgICAgICAgICAgICAgICBbckZsZXhdPVwiKHNob3dTbmFwc2hvdHMgfHwgc2hvd1F1ZXJ5Q2FjaGUpXCI+XG5cbiAgICAgICAgPHJzei1sYXlvdXQgY2xhc3M9XCJjZWxsIGxlZnQgbm8tcFwiIFtkaXJlY3Rpb25zXT1cInNob3dDaGFydCA/IFsncmlnaHQnXSA6IFsnbm9uZSddXCIgW3JGbGV4XT1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICBbbmdTdHlsZV09XCJ7J2ZsZXgtYmFzaXMnOiBzaG93Q2hhcnQgPyAnNjUlJyA6ICcxMDAlJ31cIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjZWxsLWNvbnRlbnRzIG5vLXBcIj5cbiAgICAgICAgICAgICAgICA8a2ktZGF0YXNldC1lZGl0b3IgI2RhdGFzZXRFZGl0b3JDb21wb25lbnQgWyhkYXRhc2V0SW5zdGFuY2VTdW1tYXJ5KV09XCJkYXRhc2V0SW5zdGFuY2VTdW1tYXJ5XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2FjY291bnRJZF09XCJhY2NvdW50SWRcIiBbbmV3VGl0bGVdPVwibmV3VGl0bGVcIiBbbmV3RGVzY3JpcHRpb25dPVwibmV3RGVzY3JpcHRpb25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZGF0YUxvYWRlZCk9XCJkYXRhTG9hZGVkKCRldmVudClcIiBbYWRtaW5dPVwiYWRtaW5cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2RhdGFzZXRFZGl0b3JSZWFkb25seV09XCJkYXRhc2V0RWRpdG9yUmVhZG9ubHlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGF0YXNldEVkaXRvclNpbXBsZU1vZGVdPVwiZGF0YXNldEVkaXRvclNpbXBsZU1vZGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGF0YXNldEVkaXRvck5vVG9vbHNdPVwiZGF0YXNldEVkaXRvck5vVG9vbHNcIj48L2tpLWRhdGFzZXQtZWRpdG9yPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvcnN6LWxheW91dD5cbiAgICA8L3Jzei1sYXlvdXQ+XG5cbiAgICA8cnN6LWxheW91dCAqbmdJZj1cInNob3dTbmFwc2hvdHMgfHwgc2hvd1F1ZXJ5Q2FjaGVcIiBjbGFzcz1cInJvdyBib3R0b21cIiBbZGlyZWN0aW9uc109XCJbJ25vbmUnXVwiIFtyRmxleF09XCJmYWxzZVwiXG4gICAgICAgIFtuZ0NsYXNzXT1cInsnb3ZlcmZsb3cteS1zY3JvbGwnOiBzaG93UXVlcnlDYWNoZX1cIj5cbiAgICAgICAgPG5nLXRlbXBsYXRlIFtuZ0lmXT1cInNob3dTbmFwc2hvdHNcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJweC02IHB5LTMgYmctd2hpdGUgYm9yZGVyLWIgYm9yZGVyLWdyYXktMjAwXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1kOmZsZXggbWQ6aXRlbXMtY2VudGVyIG1kOmp1c3RpZnktYmV0d2VlbiBtZDpzcGFjZS14LTVcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggaXRlbXMtc3RhcnQgZmxleC0xXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHQtMS41XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGgxIGNsYXNzPVwidGV4dC14bCBmb250LWJvbGQgdGV4dC1ncmF5LTkwMCBtYi0wXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+U25hcHNob3QgUHJvZmlsZXM8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2gxPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwidGV4dC14cyBmb250LW1lZGl1bSB0ZXh0LWdyYXktNTAwXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEEgbGlzdCBvZiBhbGwgdGhlIHNuYXBzaG90cyB0aGF0IGhhdmUgYmVlbiBjcmVhdGVkIGZvciB0aGlzIHN0b3JlZCBxdWVyeS5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3A+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC0xIGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWVuZFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cImFwaUFjY2VzcygpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJpbmxpbmUtZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgcHgtNCBweS0yIG1yLTMgYm9yZGVyIGJvcmRlci10cmFuc3BhcmVudCB0ZXh0LXNtIGZvbnQtbWVkaXVtIHJvdW5kZWQtbWQgc2hhZG93LXNtIHRleHQtcHJpbWFyeSBiZy1ncmF5LTEwMCBmb2N1czpvdXRsaW5lLW5vbmVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBBUEkgQWNjZXNzXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cImVkaXRTbmFwc2hvdChudWxsKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiaW5saW5lLWZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIHB4LTQgcHktMS41IGJvcmRlciBib3JkZXItdHJhbnNwYXJlbnQgdGV4dC1zbSBmb250LW1lZGl1bSByb3VuZGVkLW1kIHNoYWRvdy1zbSB0ZXh0LXdoaXRlIGJnLXByaW1hcnkgZm9jdXM6b3V0bGluZS1ub25lXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uPmFkZDwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgTmV3IFNuYXBzaG90IFByb2ZpbGVcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInB4LTQgc206cHgtNiBsZzpweC04IG10LTBcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbFwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiLW15LTIgLW14LTQgc206LW14LTYgbGc6LW14LThcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbmxpbmUtYmxvY2sgbWluLXctZnVsbCBweS0yIGFsaWduLW1pZGRsZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0YWJsZSAqbmdJZj1cInNuYXBzaG90UHJvZmlsZXMubGVuZ3RoXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJtaW4tdy1mdWxsIGJvcmRlci1zZXBhcmF0ZVwiIHN0eWxlPVwiYm9yZGVyLXNwYWNpbmc6IDBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoZWFkIGNsYXNzPVwiYmctZ3JheS0xMDBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoIHNjb3BlPVwiY29sXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInN0aWNreSB0b3AtMCB6LTEwIGJvcmRlci1iIGJvcmRlci1ncmF5LTMwMCBiZy1ncmF5LTUwIGJnLW9wYWNpdHktNzUgcHktMy41IHB4LTQgdGV4dC1sZWZ0IHRleHQteHMgZm9udC1zZW1pYm9sZCB0ZXh0LWdyYXktOTAwIGJhY2tkcm9wLWJsdXIgYmFja2Ryb3AtZmlsdGVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RoPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoIHNjb3BlPVwiY29sXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInN0aWNreSB0b3AtMCB6LTEwIGJvcmRlci1iIGJvcmRlci1ncmF5LTMwMCBiZy1ncmF5LTUwIGJnLW9wYWNpdHktNzUgcHktMy41IHB4LTQgdGV4dC1sZWZ0IHRleHQteHMgZm9udC1zZW1pYm9sZCB0ZXh0LWdyYXktOTAwIGJhY2tkcm9wLWJsdXIgYmFja2Ryb3AtZmlsdGVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGl0bGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGg+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGggc2NvcGU9XCJjb2xcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwic3RpY2t5IHRvcC0wIHotMTAgYm9yZGVyLWIgYm9yZGVyLWdyYXktMzAwIGJnLWdyYXktNTAgYmctb3BhY2l0eS03NSBweS0zLjUgcHgtNCB0ZXh0LWxlZnQgdGV4dC14cyBmb250LXNlbWlib2xkIHRleHQtZ3JheS05MDAgYmFja2Ryb3AtYmx1ciBiYWNrZHJvcC1maWx0ZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdGF0dXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGg+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGggc2NvcGU9XCJjb2xcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwic3RpY2t5IHRvcC0wIHotMTAgYm9yZGVyLWIgYm9yZGVyLWdyYXktMzAwIGJnLWdyYXktNTAgYmctb3BhY2l0eS03NSBweS0zLjUgcHgtNCB0ZXh0LWxlZnQgdGV4dC14cyBmb250LXNlbWlib2xkIHRleHQtZ3JheS05MDAgYmFja2Ryb3AtYmx1ciBiYWNrZHJvcC1maWx0ZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMYXN0IFN0YXJ0ZWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGg+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGggc2NvcGU9XCJjb2xcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwic3RpY2t5IHRvcC0wIHotMTAgYm9yZGVyLWIgYm9yZGVyLWdyYXktMzAwIGJnLWdyYXktNTAgYmctb3BhY2l0eS03NSBweS0zLjUgcHgtNCB0ZXh0LWxlZnQgdGV4dC14cyBmb250LXNlbWlib2xkIHRleHQtZ3JheS05MDAgYmFja2Ryb3AtYmx1ciBiYWNrZHJvcC1maWx0ZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOZXh0IFN0YXJ0IFRpbWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGg+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGggc2NvcGU9XCJjb2xcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwic3RpY2t5IHRvcC0wIHotMTAgYm9yZGVyLWIgYm9yZGVyLWdyYXktMzAwIGJnLWdyYXktNTAgYmctb3BhY2l0eS03NSBweS0zLjUgcHgtNCBiYWNrZHJvcC1ibHVyIGJhY2tkcm9wLWZpbHRlclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic3Itb25seVwiPkVkaXQ8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RoPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RoZWFkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGJvZHkgY2xhc3M9XCJiZy13aGl0ZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHIgKm5nRm9yPVwibGV0IHNuYXBzaG90IG9mIHNuYXBzaG90UHJvZmlsZXM7IGxldCBpID0gaW5kZXhcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uICpuZ0lmPVwic25hcHNob3QudGFza1N0YXR1cyAhPT0gJ1JVTk5JTkcnXCIgY29sb3I9XCJwcmltYXJ5XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdFRvb2x0aXA9XCJUcmlnZ2VyIHNuYXBzaG90IHRvIHJ1biBub3dcIiBtYXQtaWNvbi1idXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJ0cmlnZ2VyU25hcHNob3Qoc25hcHNob3Qua2V5KVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24+cGxheV9hcnJvdzwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyAqbmdJZj1cInNuYXBzaG90LnRhc2tTdGF0dXMgPT09ICdSVU5OSU5HJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImFuaW1hdGUtc3BpbiBtbC0zIG1yLTIgaC01IHctNSB0ZXh0LXNlY29uZGFyeVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgZmlsbD1cIm5vbmVcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjaXJjbGUgY2xhc3M9XCJvcGFjaXR5LTI1XCIgY3g9XCIxMlwiIGN5PVwiMTJcIiByPVwiMTBcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS13aWR0aD1cIjRcIj48L2NpcmNsZT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggY2xhc3M9XCJvcGFjaXR5LTc1XCIgZmlsbD1cImN1cnJlbnRDb2xvclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNNCAxMmE4IDggMCAwMTgtOFYwQzUuMzczIDAgMCA1LjM3MyAwIDEyaDR6bTIgNS4yOTFBNy45NjIgNy45NjIgMCAwMTQgMTJIMGMwIDMuMDQyIDEuMTM1IDUuODI0IDMgNy45MzhsMy0yLjY0N3pcIj48L3BhdGg+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPVwid2hpdGVzcGFjZS1ub3dyYXAgYm9yZGVyLWIgYm9yZGVyLWdyYXktMjAwIHB5LTIgcHgtNCB0ZXh0LXNtIGZvbnQtbWVkaXVtIHRleHQtZ3JheS05MDBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBzbmFwc2hvdC50aXRsZSB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz1cIndoaXRlc3BhY2Utbm93cmFwIGJvcmRlci1iIGJvcmRlci1ncmF5LTIwMCBweS0wLjUgcHgtMiB0ZXh0LXNtIHRleHQtZ3JheS01MDBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiaW5saW5lLWZsZXggdGV4dC1zbSBsb3dlcmNhc2UgZmxleCBpdGVtcy1jZW50ZXIgdGV4dC13aGl0ZSBweC0zIHJvdW5kZWQtZnVsbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsncHktMC41Jzogc25hcHNob3QudGFza1N0YXR1cyAhPT0gJ1JVTk5JTkcnLCdweS0xJzogc25hcHNob3QudGFza1N0YXR1cyA9PT0gJ1JVTk5JTkcnLCAnYmctZ3JheS00MDAnOiBzbmFwc2hvdC50YXNrU3RhdHVzID09PSAnUEVORElORycsICdiZy1zZWNvbmRhcnknOiBzbmFwc2hvdC50YXNrU3RhdHVzID09PSAnUlVOTklORycsICdiZy1zdWNjZXNzJzogc25hcHNob3QudGFza1N0YXR1cyA9PT0gJ0NPTVBMRVRFRCcsICdiZy1kYW5nZXInOiBzbmFwc2hvdC50YXNrU3RhdHVzID09PSAnRkFJTEVEJ31cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIFtuZ0lmXT1cInNuYXBzaG90LnRhc2tTdGF0dXMgPT09ICdQRU5ESU5HJ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgZmlsbD1cIm5vbmVcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLXdpZHRoPVwiMS41XCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCItbWwtMSB3LTYgaC02IG1yLTJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNMTIgNnY2aDQuNW00LjUgMGE5IDkgMCAxMS0xOCAwIDkgOSAwIDAxMTggMHpcIi8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIFtuZ0lmXT1cInNuYXBzaG90LnRhc2tTdGF0dXMgPT09ICdSVU5OSU5HJ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyBjbGFzcz1cImFuaW1hdGUtc3BpbiAtbWwtMSBtci0zIGgtNSB3LTUgdGV4dC13aGl0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiBmaWxsPVwibm9uZVwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2lyY2xlIGNsYXNzPVwib3BhY2l0eS0yNVwiIGN4PVwiMTJcIiBjeT1cIjEyXCIgcj1cIjEwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2Utd2lkdGg9XCI0XCI+PC9jaXJjbGU+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggY2xhc3M9XCJvcGFjaXR5LTc1XCIgZmlsbD1cImN1cnJlbnRDb2xvclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk00IDEyYTggOCAwIDAxOC04VjBDNS4zNzMgMCAwIDUuMzczIDAgMTJoNHptMiA1LjI5MUE3Ljk2MiA3Ljk2MiAwIDAxNCAxMkgwYzAgMy4wNDIgMS4xMzUgNS44MjQgMyA3LjkzOGwzLTIuNjQ3elwiPjwvcGF0aD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgW25nSWZdPVwic25hcHNob3QudGFza1N0YXR1cyA9PT0gJ0NPTVBMRVRFRCdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIGZpbGw9XCJub25lXCIgdmlld0JveD1cIjAgMCAyNCAyNFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS13aWR0aD1cIjEuNVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiLW1sLTEgdy02IGgtNiBtci0yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkPVwiTTkgMTIuNzVMMTEuMjUgMTUgMTUgOS43NU0yMSAxMmE5IDkgMCAxMS0xOCAwIDkgOSAwIDAxMTggMHpcIi8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIFtuZ0lmXT1cInNuYXBzaG90LnRhc2tTdGF0dXMgPT09ICdGQUlMRUQnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiBmaWxsPVwibm9uZVwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2Utd2lkdGg9XCIxLjVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cIi1tbC0xIHctNiBoLTYgbXItMlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk0xMiA5djMuNzVtLTkuMzAzIDMuMzc2Yy0uODY2IDEuNS4yMTcgMy4zNzQgMS45NDggMy4zNzRoMTQuNzFjMS43MyAwIDIuODEzLTEuODc0IDEuOTQ4LTMuMzc0TDEzLjk0OSAzLjM3OGMtLjg2Ni0xLjUtMy4wMzItMS41LTMuODk4IDBMMi42OTcgMTYuMTI2ek0xMiAxNS43NWguMDA3di4wMDhIMTJ2LS4wMDh6XCIvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBbbmdJZl09XCJzbmFwc2hvdC50YXNrU3RhdHVzID09PSAnVElNRURfT1VUJ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgZmlsbD1cIm5vbmVcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLXdpZHRoPVwiMS41XCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCItbWwtMSB3LTYgaC02IG1yLTJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNMTQuMjUgOXY2bS00LjUgMFY5TTIxIDEyYTkgOSAwIDExLTE4IDAgOSA5IDAgMDExOCAwelwiLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBfLnN0YXJ0Q2FzZShzbmFwc2hvdC50YXNrU3RhdHVzKSB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz1cIndoaXRlc3BhY2Utbm93cmFwIGJvcmRlci1iIGJvcmRlci1ncmF5LTIwMCBweS0yIHB4LTQgdGV4dC1zbSB0ZXh0LWdyYXktNTAwXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgc25hcHNob3QudGFza0xhc3RTdGFydFRpbWUgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9XCJ3aGl0ZXNwYWNlLW5vd3JhcCBib3JkZXItYiBib3JkZXItZ3JheS0yMDAgcHktMiBweC00IHRleHQtc20gdGV4dC1ncmF5LTUwMFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IHNuYXBzaG90LnRhc2tOZXh0U3RhcnRUaW1lIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPVwicmVsYXRpdmUgd2hpdGVzcGFjZS1ub3dyYXAgYm9yZGVyLWIgYm9yZGVyLWdyYXktMjAwIHB5LTIgcHgtNCB0ZXh0LXJpZ2h0IHRleHQtc21cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWxpZ24tY2VudGVyIGp1c3RpZnktZW5kXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gbWF0LWJ1dHRvbiBjb2xvcj1cInByaW1hcnlcIiAoY2xpY2spPVwiZWRpdFNuYXBzaG90KHNuYXBzaG90KVwiPiBFZGl0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGl2aWRlclwiPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1idXR0b24gY29sb3I9XCJ3YXJuXCIgKGNsaWNrKT1cImRlbGV0ZVNuYXBzaG90KHNuYXBzaG90KVwiPiBEZWxldGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGJvZHk+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RhYmxlPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwLTRcIiAqbmdJZj1cIiFzbmFwc2hvdFByb2ZpbGVzLmxlbmd0aFwiPlxuICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCJlZGl0U25hcHNob3QobnVsbClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJyZWxhdGl2ZSBibG9jayB3LWZ1bGwgYm9yZGVyLTIgYm9yZGVyLWdyYXktMzAwIGJvcmRlci1kYXNoZWQgcm91bmRlZC1sZyBwLTEyIHRleHQtY2VudGVyIGhvdmVyOmJvcmRlci1ncmF5LTQwMCBmb2N1czpvdXRsaW5lLW5vbmVcIj5cblxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicmVsYXRpdmUgaW5saW5lLWJsb2NrXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWljb25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cIm14LWF1dG8gdGV4dC02eGwgaC0xNCB3LTIwIHRleHQtZ3JheS0zMDBcIj5oaXN0b3J5XG4gICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1pY29uPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJyaWdodC0wIGJvdHRvbS0wIGFic29sdXRlIGgtOCB3LTggdGV4dC1ncmF5LTQwMFwiIGZpbGw9XCJub25lXCIgdmlld0JveD1cIjAgMCAyNCAyNFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiBkPVwiTTEyIDR2MTZtOC04SDRcIi8+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtdC0yIGJsb2NrIHRleHQtc20gZm9udC1tZWRpdW0gdGV4dC1ncmF5LTkwMFwiPkNyZWF0ZSBTbmFwc2hvdCBQcm9maWxlPC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgIDxuZy10ZW1wbGF0ZSBbbmdJZl09XCJzaG93UXVlcnlDYWNoZVwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInB4LTYgcHktMyBiZy13aGl0ZSBib3JkZXItYiBib3JkZXItZ3JheS0yMDBcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWQ6ZmxleCBtZDppdGVtcy1jZW50ZXIgbWQ6anVzdGlmeS1iZXR3ZWVuIG1kOnNwYWNlLXgtNVwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBpdGVtcy1zdGFydCBmbGV4LTFcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwdC0xLjVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDEgY2xhc3M9XCJ0ZXh0LXhsIGZvbnQtYm9sZCB0ZXh0LWdyYXktOTAwIG1iLTBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj5RdWVyeSBDYWNoaW5nPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9oMT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz1cInRleHQteHMgZm9udC1tZWRpdW0gdGV4dC1ncmF5LTUwMFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXQgdXAgUXVlcnkgQ2FjaGluZyBvbiB0aGlzIGRhdGEgc2V0LlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC0xIGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWVuZFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cImVkaXRRdWVyeUNhY2hlKG51bGwpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJpbmxpbmUtZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgcHgtNCBweS0xLjUgYm9yZGVyIGJvcmRlci10cmFuc3BhcmVudCB0ZXh0LXNtIGZvbnQtbWVkaXVtIHJvdW5kZWQtbWQgc2hhZG93LXNtIHRleHQtd2hpdGUgYmctcHJpbWFyeSBmb2N1czpvdXRsaW5lLW5vbmVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24+YWRkPC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDcmVhdGUgUXVlcnkgQ2FjaGVcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8a2ktcXVlcnktY2FjaGUtdmlldyBbbGltaXRdPVwiMTAwXCIgW3Nob3dQYWdlcl09XCJmYWxzZVwiIFtyZWxvYWRdPVwicmVsb2FkQ2FjaGVcIlxuICAgICAgICAgICAgICAgIFtkYXRhc2V0SW5zdGFuY2VdPVwiZGF0YXNldEluc3RhbmNlU3VtbWFyeS5pZFwiPjwva2ktcXVlcnktY2FjaGUtdmlldz5cbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICA8L3Jzei1sYXlvdXQ+XG48L2Rpdj5cblxuPGRpdiBjbGFzcz1cImNvbmZpZ3VyZS1mb290ZXJcIj5cbiAgICA8YnV0dG9uIG1hdC1zdHJva2VkLWJ1dHRvbiBbbWF0LWRpYWxvZy1jbG9zZV09XCJ0cnVlXCIgY29sb3I9XCJwcmltYXJ5XCI+XG4gICAgICAgIENhbmNlbFxuICAgIDwvYnV0dG9uPlxuICAgIDxkaXYgY2xhc3M9XCJhbGlnbi1jZW50ZXJcIj5cbiAgICAgICAgPGJ1dHRvbiBtYXQtc3Ryb2tlZC1idXR0b24gY29sb3I9XCJwcmltYXJ5XCIgY2xhc3M9XCJtci0yIGJnLXdoaXRlXCJcbiAgICAgICAgICAgICAgICAqbmdJZj1cImNhbkhhdmVTbmFwc2hvdHMgJiYgIWRhdGFzZXRFZGl0b3JSZWFkb25seVwiXG4gICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIiFkYXRhc2V0SW5zdGFuY2VTdW1tYXJ5IHx8ICFkYXRhc2V0SW5zdGFuY2VTdW1tYXJ5LmlkXCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwidmlld1F1ZXJ5Q2FjaGluZygpXCI+XG4gICAgICAgICAgICBRdWVyeSBDYWNoaW5nXG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8YnV0dG9uIG1hdC1zdHJva2VkLWJ1dHRvbiBjb2xvcj1cInByaW1hcnlcIiBjbGFzcz1cIm1yLTIgYmctd2hpdGVcIlxuICAgICAgICAgICAgICAgICpuZ0lmPVwiY2FuSGF2ZVNuYXBzaG90cyAmJiAhZGF0YXNldEVkaXRvclJlYWRvbmx5XCJcbiAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiIWRhdGFzZXRJbnN0YW5jZVN1bW1hcnkgfHwgIWRhdGFzZXRJbnN0YW5jZVN1bW1hcnkuaWRcIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJ2aWV3U25hcHNob3RzKClcIj5cbiAgICAgICAgICAgIE1hbmFnZSBTbmFwc2hvdHNcbiAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDxidXR0b24gKm5nSWY9XCJjYW5FeHBvcnREYXRhXCIgbWF0LXN0cm9rZWQtYnV0dG9uIGNvbG9yPVwicHJpbWFyeVwiIGNsYXNzPVwibXItMiBiZy13aGl0ZVwiIChjbGljayk9XCJleHBvcnREYXRhKClcIj5cbiAgICAgICAgICAgIEV4cG9ydCBEYXRhXG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8YnV0dG9uICpuZ0lmPVwiIWRhdGFzZXRFZGl0b3JSZWFkb25seVwiIG1hdC1mbGF0LWJ1dHRvbiBjb2xvcj1cInByaW1hcnlcIiAoY2xpY2spPVwic2F2ZUNoYW5nZXMoKVwiPlxuICAgICAgICAgICAgU2F2ZSAmIEV4aXRcbiAgICAgICAgPC9idXR0b24+XG4gICAgPC9kaXY+XG5cbjwvZGl2PlxuIl19