@jax-data-science/sci-image-visualizer 0.17.0 → 0.18.1

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 (121) hide show
  1. package/esm2022/lib/contracts/display-types.mjs +3 -2
  2. package/esm2022/lib/contracts/image.contract.mjs +1 -1
  3. package/esm2022/lib/contracts/ports/spatial-data.port.mjs +1 -1
  4. package/esm2022/lib/contracts/region-editor-api.contract.mjs +1 -1
  5. package/esm2022/lib/contracts/region-store.contract.mjs +1 -1
  6. package/esm2022/lib/contracts/spatial-dataset.contract.mjs +1 -1
  7. package/esm2022/lib/contracts/visualizer.contract.mjs +1 -1
  8. package/esm2022/lib/geometry/cell-meshes.mjs +37 -0
  9. package/esm2022/lib/geometry/place.mjs +47 -0
  10. package/esm2022/lib/implementations/napari-js/napari-camera-depth.mjs +93 -0
  11. package/esm2022/lib/implementations/napari-js/napari-loading-state.mjs +1 -1
  12. package/esm2022/lib/implementations/napari-js/napari-region-overlay.mjs +2 -2
  13. package/esm2022/lib/implementations/napari-js/napari-scene.mjs +1 -1
  14. package/esm2022/lib/implementations/napari-js/napari-spatial-2d-scene.mjs +81 -15
  15. package/esm2022/lib/implementations/napari-js/napari-spatial-3d-cells.mjs +746 -0
  16. package/esm2022/lib/implementations/napari-js/napari-spatial-3d-scene.mjs +325 -18
  17. package/esm2022/lib/implementations/napari-js/napari-spatial-3d-transcripts.mjs +182 -24
  18. package/esm2022/lib/implementations/napari-js/napari-spatial-hover.mjs +95 -5
  19. package/esm2022/lib/implementations/napari-js/napari-spatial-scene.mjs +15 -1
  20. package/esm2022/lib/implementations/napari-js/napari-spatial-tiles.mjs +30 -2
  21. package/esm2022/lib/implementations/napari-js/napari-visualizer.service.mjs +40 -1
  22. package/esm2022/lib/implementations/napari-js/napari-volume-region-meshes.mjs +111 -28
  23. package/esm2022/lib/implementations/napari-js/napari-volume-scene.mjs +14 -2
  24. package/esm2022/lib/implementations/napari-js/spatial-tiles/cell-layers.mjs +180 -48
  25. package/esm2022/lib/implementations/napari-js/spatial-tiles/transcript-layers.mjs +28 -8
  26. package/esm2022/lib/implementations/osd/osd-region-overlay.mjs +2 -2
  27. package/esm2022/lib/implementations/spatial-data-http/spatial-data-http.service.mjs +10 -1
  28. package/esm2022/lib/region-editor/class-tree/class-tree.component.mjs +30 -3
  29. package/esm2022/lib/region-editor/classes-panel/classes-panel.component.mjs +15 -3
  30. package/esm2022/lib/region-editor/region-editor.component.mjs +24 -4
  31. package/esm2022/lib/region-source/region-source-ops.mjs +7 -1
  32. package/esm2022/lib/region-source/region-tiles.mjs +1 -1
  33. package/esm2022/lib/region-source/worker-region-source.mjs +24 -1
  34. package/esm2022/lib/routing-visualizer.service.mjs +404 -7
  35. package/esm2022/lib/spatial/observations-in-selection.mjs +83 -0
  36. package/esm2022/lib/spatial/plane-cells.mjs +119 -0
  37. package/esm2022/lib/spatial/spatial-controls.facade.mjs +298 -5
  38. package/esm2022/lib/spatial/spatial-encoding.mjs +35 -3
  39. package/esm2022/lib/spatial/spatial-hover.mjs +34 -1
  40. package/esm2022/lib/spatial/spatial-planes.mjs +49 -0
  41. package/esm2022/lib/spatial/spatial-selection.mjs +2 -2
  42. package/esm2022/lib/spatial/spatial-tile-merge.mjs +38 -1
  43. package/esm2022/lib/spatial/transcripts-in-selection.mjs +208 -0
  44. package/esm2022/lib/spatial-controls/spatial-cells-panel/spatial-cells-panel.component.mjs +42 -65
  45. package/esm2022/lib/spatial-controls/spatial-color-by/spatial-color-by.component.mjs +187 -0
  46. package/esm2022/lib/spatial-controls/spatial-controls.component.mjs +47 -12
  47. package/esm2022/lib/spatial-controls/spatial-gene-tree/spatial-gene-tree.component.mjs +3 -3
  48. package/esm2022/lib/spatial-controls/spatial-groups-panel/spatial-groups-panel.component.mjs +38 -10
  49. package/esm2022/lib/spatial-controls/spatial-key/spatial-key.component.mjs +3 -3
  50. package/esm2022/lib/spatial-controls/spatial-marker-genes-form/spatial-marker-genes-form.component.mjs +3 -3
  51. package/esm2022/lib/spatial-controls/spatial-observations-panel/spatial-observations-panel.component.mjs +79 -57
  52. package/esm2022/lib/spatial-controls/spatial-selection-observations/spatial-selection-observations.component.mjs +101 -0
  53. package/esm2022/lib/spatial-controls/spatial-selection-transcripts/spatial-selection-transcripts.component.mjs +94 -0
  54. package/esm2022/lib/spatial-controls/spatial-transcripts-panel/spatial-transcripts-panel.component.mjs +9 -3
  55. package/esm2022/lib/store/region-source-scope.mjs +10 -1
  56. package/esm2022/lib/store/region-store.service.mjs +33 -2
  57. package/esm2022/lib/toolbar/toolbar.component.mjs +10 -3
  58. package/esm2022/lib/visualizer/spatial-region-set.mjs +95 -0
  59. package/esm2022/lib/visualizer.component.mjs +40 -4
  60. package/fesm2022/{jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-DHrHO2ay.mjs → jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-YrNqv8wH.mjs} +4521 -759
  61. package/fesm2022/jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-YrNqv8wH.mjs.map +1 -0
  62. package/fesm2022/{jax-data-science-sci-image-visualizer-onnx-sam-session-CKEUwNta.mjs → jax-data-science-sci-image-visualizer-onnx-sam-session-Dph35S7m.mjs} +2 -2
  63. package/fesm2022/{jax-data-science-sci-image-visualizer-onnx-sam-session-CKEUwNta.mjs.map → jax-data-science-sci-image-visualizer-onnx-sam-session-Dph35S7m.mjs.map} +1 -1
  64. package/fesm2022/jax-data-science-sci-image-visualizer.mjs +1 -1
  65. package/fesm2022/region-source.worker.js +84 -2
  66. package/lib/contracts/display-types.d.ts +90 -4
  67. package/lib/contracts/image.contract.d.ts +6 -0
  68. package/lib/contracts/ports/spatial-data.port.d.ts +7 -0
  69. package/lib/contracts/region-editor-api.contract.d.ts +9 -0
  70. package/lib/contracts/region-store.contract.d.ts +6 -0
  71. package/lib/contracts/spatial-dataset.contract.d.ts +7 -1
  72. package/lib/contracts/visualizer.contract.d.ts +43 -1
  73. package/lib/geometry/cell-meshes.d.ts +27 -0
  74. package/lib/geometry/place.d.ts +45 -0
  75. package/lib/implementations/napari-js/napari-camera-depth.d.ts +23 -0
  76. package/lib/implementations/napari-js/napari-loading-state.d.ts +1 -1
  77. package/lib/implementations/napari-js/napari-scene.d.ts +12 -0
  78. package/lib/implementations/napari-js/napari-spatial-2d-scene.d.ts +19 -3
  79. package/lib/implementations/napari-js/napari-spatial-3d-cells.d.ts +141 -0
  80. package/lib/implementations/napari-js/napari-spatial-3d-scene.d.ts +87 -0
  81. package/lib/implementations/napari-js/napari-spatial-3d-transcripts.d.ts +49 -8
  82. package/lib/implementations/napari-js/napari-spatial-hover.d.ts +22 -0
  83. package/lib/implementations/napari-js/napari-spatial-scene.d.ts +12 -0
  84. package/lib/implementations/napari-js/napari-spatial-tiles.d.ts +15 -0
  85. package/lib/implementations/napari-js/napari-visualizer.service.d.ts +27 -1
  86. package/lib/implementations/napari-js/napari-volume-region-meshes.d.ts +38 -19
  87. package/lib/implementations/napari-js/napari-volume-scene.d.ts +2 -0
  88. package/lib/implementations/napari-js/spatial-tiles/cell-layers.d.ts +53 -0
  89. package/lib/implementations/napari-js/spatial-tiles/transcript-layers.d.ts +11 -2
  90. package/lib/implementations/spatial-data-http/spatial-data-http.service.d.ts +7 -0
  91. package/lib/region-editor/class-tree/class-tree.component.d.ts +16 -1
  92. package/lib/region-editor/classes-panel/classes-panel.component.d.ts +10 -1
  93. package/lib/region-editor/region-editor.component.d.ts +4 -0
  94. package/lib/region-source/region-source-ops.d.ts +12 -0
  95. package/lib/region-source/region-tiles.d.ts +8 -0
  96. package/lib/region-source/worker-region-source.d.ts +18 -0
  97. package/lib/routing-visualizer.service.d.ts +140 -1
  98. package/lib/spatial/observations-in-selection.d.ts +43 -0
  99. package/lib/spatial/plane-cells.d.ts +37 -0
  100. package/lib/spatial/spatial-controls.facade.d.ts +59 -0
  101. package/lib/spatial/spatial-encoding.d.ts +14 -1
  102. package/lib/spatial/spatial-hover.d.ts +23 -0
  103. package/lib/spatial/spatial-planes.d.ts +22 -0
  104. package/lib/spatial/spatial-selection.d.ts +2 -1
  105. package/lib/spatial/spatial-tile-merge.d.ts +9 -0
  106. package/lib/spatial/transcripts-in-selection.d.ts +95 -0
  107. package/lib/spatial-controls/spatial-cells-panel/spatial-cells-panel.component.d.ts +19 -28
  108. package/lib/spatial-controls/spatial-color-by/spatial-color-by.component.d.ts +64 -0
  109. package/lib/spatial-controls/spatial-controls.component.d.ts +17 -2
  110. package/lib/spatial-controls/spatial-groups-panel/spatial-groups-panel.component.d.ts +16 -6
  111. package/lib/spatial-controls/spatial-observations-panel/spatial-observations-panel.component.d.ts +26 -23
  112. package/lib/spatial-controls/spatial-selection-observations/spatial-selection-observations.component.d.ts +48 -0
  113. package/lib/spatial-controls/spatial-selection-transcripts/spatial-selection-transcripts.component.d.ts +43 -0
  114. package/lib/spatial-controls/spatial-transcripts-panel/spatial-transcripts-panel.component.d.ts +3 -1
  115. package/lib/store/region-source-scope.d.ts +4 -0
  116. package/lib/store/region-store.service.d.ts +21 -0
  117. package/lib/toolbar/toolbar.component.d.ts +6 -1
  118. package/lib/visualizer/spatial-region-set.d.ts +55 -0
  119. package/lib/visualizer.component.d.ts +14 -0
  120. package/package.json +1 -1
  121. package/fesm2022/jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-DHrHO2ay.mjs.map +0 -1
@@ -93,6 +93,15 @@ export class RegionSourceScope {
93
93
  hasPlanesSource(image) {
94
94
  return !!image && !!this.images.get(image)?.planes;
95
95
  }
96
+ /** The opener of `image`'s source over all its slices (as attached), or null without one. */
97
+ planesOpener(image) {
98
+ return (image && this.images.get(image)?.planes?.open) || null;
99
+ }
100
+ /** Whether `image` has any source: one over all its slices, or one of a slice's own. */
101
+ hasAny(image) {
102
+ const sources = image ? this.images.get(image) : undefined;
103
+ return !!sources && (!!sources.planes || sources.perSlice.size > 0);
104
+ }
96
105
  /**
97
106
  * The source behind `slice` of `image`, opening it if needed. Resolves null when there is
98
107
  * none, and rejects when it cannot be opened.
@@ -183,4 +192,4 @@ export class RegionSourceScope {
183
192
  entry.source = null;
184
193
  }
185
194
  }
186
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVnaW9uLXNvdXJjZS1zY29wZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvc3RvcmUvcmVnaW9uLXNvdXJjZS1zY29wZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFlQSxpR0FBaUc7QUFDakcsTUFBTSxDQUFDLE1BQU0sbUJBQW1CLEdBQUcsQ0FBQyxDQUFDO0FBc0JyQyxNQUFNLElBQUksR0FBd0IsSUFBSSxHQUFHLEVBQVUsQ0FBQztBQUVwRDs7Ozs7Ozs7OztHQVVHO0FBQ0gsTUFBTSxPQUFPLGlCQUFpQjtJQUE5QjtRQUNtQixXQUFNLEdBQUcsSUFBSSxHQUFHLEVBQXdCLENBQUM7UUFDMUQsK0NBQStDO1FBQzlCLGNBQVMsR0FBWSxFQUFFLENBQUM7UUFDekMsbURBQW1EO1FBQzNDLFVBQUssR0FBaUIsSUFBSSxDQUFDO0lBOEtyQyxDQUFDO0lBNUtDOzs7O09BSUc7SUFDSCxNQUFNLENBQ0osS0FBYSxFQUNiLElBQXdCLEVBQ3hCLE1BQTBCLEVBQzFCLFdBQThCLEVBQUU7UUFFaEMsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN6QyxNQUFNLEtBQUssR0FBVSxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsQ0FBQztRQUN6RCxJQUFJLE1BQU0sS0FBSyxRQUFRLEVBQUUsQ0FBQztZQUN4QixJQUFJLE9BQU8sQ0FBQyxNQUFNO2dCQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQy9DLE9BQU8sQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDO1lBQ3ZCLE9BQU8sQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDL0MsT0FBTyxDQUFDLFFBQVEsQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUN6QixPQUFPLENBQUMsS0FBSyxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ3RCLE9BQU8sQ0FBQyxRQUFRLEdBQUcsSUFBSSxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDdkMsQ0FBQzthQUFNLENBQUM7WUFDTixNQUFNLEdBQUcsR0FBRyxPQUFPLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDL0MsSUFBSSxHQUFHO2dCQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDekIsS0FBSyxDQUFDLEtBQUssR0FBRyxNQUFNLENBQUMsS0FBSyxJQUFJLENBQUMsQ0FBQztZQUNoQyxPQUFPLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDO1lBQzFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNuQyxJQUFJLFFBQVEsQ0FBQyxNQUFNO2dCQUFFLE9BQU8sQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQzs7Z0JBQ25ELE9BQU8sQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM3QyxDQUFDO0lBQ0gsQ0FBQztJQUVELHlGQUF5RjtJQUN6RixXQUFXLENBQUMsS0FBYTtRQUN2QixNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN2QyxJQUFJLENBQUMsT0FBTztZQUFFLE9BQU87UUFDckIsSUFBSSxPQUFPLENBQUMsTUFBTTtZQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQy9DLE9BQU8sQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDL0MsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDNUIsQ0FBQztJQUVELCtDQUErQztJQUMvQyxXQUFXLENBQUMsS0FBYSxFQUFFLEtBQWE7UUFDdEMsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDdkMsTUFBTSxLQUFLLEdBQUcsT0FBTyxFQUFFLFFBQVEsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDM0MsSUFBSSxDQUFDLE9BQU8sSUFBSSxDQUFDLEtBQUs7WUFBRSxPQUFPO1FBQy9CLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDbEIsT0FBTyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDL0IsT0FBTyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDNUIsT0FBTyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDakMsQ0FBQztJQUVELHFGQUFxRjtJQUNyRixJQUFJLENBQUMsS0FBeUIsRUFBRSxLQUFvQjtRQUNsRCxJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssSUFBSSxLQUFLLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO0lBQ3pFLENBQUM7SUFFRCxnREFBZ0Q7SUFDaEQsR0FBRyxDQUFDLEtBQXlCLEVBQUUsS0FBYTtRQUMxQyxPQUFPLENBQUMsQ0FBQyxLQUFLLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQy9DLENBQUM7SUFFRCw0RkFBNEY7SUFDNUYsWUFBWSxDQUFDLEtBQXlCLEVBQUUsS0FBYTtRQUNuRCxPQUFPLENBQUMsQ0FBQyxLQUFLLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxFQUFFLFFBQVEsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDbEUsQ0FBQztJQUVELDBGQUEwRjtJQUMxRixnQkFBZ0IsQ0FBQyxLQUF5QjtRQUN4QyxJQUFJLENBQUMsS0FBSztZQUFFLE9BQU8sRUFBRSxDQUFDO1FBQ3RCLE9BQU8sS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsRUFBRSxRQUFRLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQ3pGLENBQUM7SUFFRCwwREFBMEQ7SUFDMUQsZUFBZSxDQUFDLEtBQXlCO1FBQ3ZDLE9BQU8sQ0FBQyxDQUFDLEtBQUssSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEVBQUUsTUFBTSxDQUFDO0lBQ3JELENBQUM7SUFFRDs7O09BR0c7SUFDSCxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQXlCLEVBQUUsS0FBYTtRQUNwRCxNQUFNLEtBQUssR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7UUFDdEQsSUFBSSxDQUFDLEtBQUs7WUFBRSxPQUFPLElBQUksQ0FBQztRQUN4QixNQUFNLE1BQU0sR0FBRyxNQUFNLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDM0MsT0FBTyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsS0FBSyxDQUFDLEtBQUssSUFBSSxLQUFLLEVBQUUsQ0FBQztJQUNqRCxDQUFDO0lBRUQsMkNBQTJDO0lBQzNDLEtBQUssQ0FBQyxLQUF5QixFQUFFLEtBQWE7UUFDNUMsT0FBTyxDQUFDLEtBQUssSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsRUFBRSxLQUFLLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDO0lBQ3JFLENBQUM7SUFFRCxtR0FBbUc7SUFDbkcsUUFBUSxDQUFDLEtBQXlCO1FBQ2hDLE1BQU0sS0FBSyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7UUFDaEUsT0FBTyxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztJQUNuRixDQUFDO0lBRUQsc0ZBQXNGO0lBQ3RGLGNBQWMsQ0FBQyxLQUF5QjtRQUN0QyxNQUFNLFFBQVEsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO1FBQ3RFLE9BQU8sUUFBUSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0lBQ3BFLENBQUM7SUFFRCxtRUFBbUU7SUFDbkUsZUFBZSxDQUFDLEtBQXlCO1FBQ3ZDLE1BQU0sS0FBSyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7UUFDaEUsT0FBTyxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztJQUMvQyxDQUFDO0lBRUQsMkZBQTJGO0lBQzNGLFFBQVEsQ0FBQyxLQUF5QixFQUFFLEtBQWEsRUFBRSxHQUF3QjtRQUN6RSxJQUFJLENBQUMsS0FBSztZQUFFLE9BQU87UUFDbkIsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDdkMsSUFBSSxDQUFDLE9BQU87WUFBRSxPQUFPO1FBQ3JCLElBQUksR0FBRyxDQUFDLElBQUk7WUFBRSxPQUFPLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLENBQUM7O1lBQ3ZDLE9BQU8sQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ25DLENBQUM7SUFFTyxLQUFLLENBQUMsS0FBYSxFQUFFLEtBQWE7UUFDeEMsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDdkMsT0FBTyxPQUFPLEVBQUUsUUFBUSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsSUFBSSxPQUFPLEVBQUUsTUFBTSxJQUFJLElBQUksQ0FBQztJQUNqRSxDQUFDO0lBRU8sWUFBWSxDQUFDLEtBQWE7UUFDaEMsSUFBSSxPQUFPLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDckMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ2IsT0FBTyxHQUFHLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsSUFBSSxHQUFHLEVBQUUsRUFBRSxLQUFLLEVBQUUsSUFBSSxHQUFHLEVBQUUsRUFBRSxRQUFRLEVBQUUsSUFBSSxHQUFHLEVBQUUsRUFBRSxDQUFDO1lBQ3ZGLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxPQUFPLENBQUMsQ0FBQztRQUNsQyxDQUFDO1FBQ0QsT0FBTyxPQUFPLENBQUM7SUFDakIsQ0FBQztJQUVPLFNBQVMsQ0FBQyxLQUFZO1FBQzVCLE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3pDLElBQUksRUFBRSxJQUFJLENBQUM7WUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDMUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDM0IsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNsQixNQUFNLE9BQU8sR0FBRyxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDN0IsS0FBSyxDQUFDLE1BQU0sR0FBRyxPQUFPLENBQUM7WUFDdkIsT0FBTyxDQUFDLElBQUksQ0FDVixDQUFDLE1BQU0sRUFBRSxFQUFFO2dCQUNULElBQUksS0FBSyxDQUFDLE1BQU0sS0FBSyxPQUFPO29CQUFFLEtBQUssQ0FBQyxLQUFLLEdBQUcsTUFBTSxDQUFDOztvQkFDOUMsTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMseUJBQXlCO1lBQ2xELENBQUMsRUFDRCxHQUFHLEVBQUU7Z0JBQ0gsSUFBSSxLQUFLLENBQUMsTUFBTSxLQUFLLE9BQU87b0JBQUUsS0FBSyxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsQ0FBQyxzQkFBc0I7WUFDM0UsQ0FBQyxDQUNGLENBQUM7UUFDSixDQUFDO1FBQ0QsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sR0FBRyxtQkFBbUIsRUFBRSxDQUFDO1lBQ25ELE1BQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FDcEMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsS0FBSyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQ2pELENBQUMsQ0FDRixDQUFDO1lBQ0YsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUMzQixDQUFDO1FBQ0QsT0FBTyxLQUFLLENBQUMsTUFBTSxDQUFDO0lBQ3RCLENBQUM7SUFFTyxLQUFLLENBQUMsS0FBWTtRQUN4QixNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN6QyxJQUFJLEVBQUUsSUFBSSxDQUFDO1lBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQzFDLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDMUIsQ0FBQztJQUVPLFdBQVcsQ0FBQyxLQUFZO1FBQzlCLEtBQUssQ0FBQyxLQUFLLEVBQUUsT0FBTyxFQUFFLENBQUM7UUFDdkIsS0FBSyxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUM7UUFDbkIsS0FBSyxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUM7SUFDdEIsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBSZWdpb25Tb3VyY2UgfSBmcm9tICcuLi9yZWdpb24tc291cmNlL3JlZ2lvbi1zb3VyY2UnO1xuXG4vKiogT3BlbnMgYSByZWdpb24gc291cmNlIG9uIGRlbWFuZCAoYW5kIGFnYWluIGFmdGVyIGl0IHdhcyBjbG9zZWQgdG8gc2F2ZSBtZW1vcnkpLiAqL1xuZXhwb3J0IHR5cGUgUmVnaW9uU291cmNlT3BlbmVyID0gKCkgPT4gUHJvbWlzZTxSZWdpb25Tb3VyY2U+O1xuXG4vKiogV2hpY2ggc2xpY2VzIGEgc291cmNlIHNlcnZlczogb25lIHNsaWNlIChwbGFuZSBgcGxhbmVgIG9mIHRoZSBzb3VyY2UpLCBvciBldmVyeSBzbGljZSB6XG4gKiAgZnJvbSB0aGUgc291cmNlJ3MgcGxhbmUgeiAoYSB6LWluZGV4ZWQgR2VvSlNPTiBvdmVyIGEgd2hvbGUgc3RhY2spLiAqL1xuZXhwb3J0IHR5cGUgUmVnaW9uU291cmNlU2xpY2VzID0geyBzbGljZTogbnVtYmVyOyBwbGFuZT86IG51bWJlciB9IHwgJ3BsYW5lcyc7XG5cbi8qKiBUaGUgcmVnaW9uIHNvdXJjZSBiZWhpbmQgb25lIHNsaWNlOiB0aGUgc291cmNlIGFuZCB3aGljaCBvZiBpdHMgcGxhbmVzIHRoZSBzbGljZSBzaG93cy4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVnaW9uU291cmNlQmluZGluZyB7XG4gIHNvdXJjZTogUmVnaW9uU291cmNlO1xuICBwbGFuZTogbnVtYmVyO1xufVxuXG4vKiogU291cmNlcyBoZWxkIG9wZW4sIHBhc3Qgd2hpY2ggdGhlIGxlYXN0IHJlY2VudGx5IHVzZWQgb25lIGlzIGNsb3NlZCAobmV2ZXIgdGhlIG9uZSBzaG93bikuICovXG5leHBvcnQgY29uc3QgT1BFTl9SRUdJT05fU09VUkNFUyA9IDY7XG5cbmludGVyZmFjZSBFbnRyeSB7XG4gIG9wZW46IFJlZ2lvblNvdXJjZU9wZW5lcjtcbiAgLyoqIFRoZSBwbGFuZSBlYWNoIHNsaWNlIHNob3dzOyB1bmRlZmluZWQgPSB0aGUgc2xpY2UncyBvd24gaW5kZXguICovXG4gIHBsYW5lPzogbnVtYmVyO1xuICBzb3VyY2U6IFByb21pc2U8UmVnaW9uU291cmNlPiB8IG51bGw7XG4gIC8qKiBUaGUgcmVzb2x2ZWQgc291cmNlLCBvbmNlIG9wZW4uICovXG4gIHJlYWR5OiBSZWdpb25Tb3VyY2UgfCBudWxsO1xufVxuXG5pbnRlcmZhY2UgSW1hZ2VTb3VyY2VzIHtcbiAgLyoqIFRoZSBzb3VyY2Ugb3ZlciBldmVyeSBzbGljZSAoYCdwbGFuZXMnYCksIGlmIGFueS4gKi9cbiAgcGxhbmVzOiBFbnRyeSB8IG51bGw7XG4gIHBlclNsaWNlOiBNYXA8bnVtYmVyLCBFbnRyeT47XG4gIC8qKiBTb3VyY2UgZmVhdHVyZSBpZHMgdGFrZW4gaW50byB0aGUgd29ya2luZyBzZXQgKG9yIGRlbGV0ZWQpLCBwZXIgc2xpY2UuICovXG4gIHRha2VuOiBNYXA8bnVtYmVyLCBSZWFkb25seVNldDxzdHJpbmc+PjtcbiAgLyoqIFNsaWNlcyB3aG9zZSBzb3VyY2Ugd2FzIGltcG9ydGVkIChub3QgdGhlIGltYWdlJ3Mgb3duIHJlZ2lvbnMpOiBhIHNhdmUgd3JpdGVzIHRoZW0sIHRob3VnaFxuICAgKiAgbm90aGluZyB3YXMgdGFrZW4sIHNpbmNlIHRoZXkgYXJlIG9uIG5vIGZpbGUgeWV0LiAqL1xuICBpbXBvcnRlZDogU2V0PG51bWJlcj47XG59XG5cbmNvbnN0IE5PTkU6IFJlYWRvbmx5U2V0PHN0cmluZz4gPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuLyoqXG4gKiBUaGUgcmVnaW9uIHNvdXJjZXMgb2YgZXZlcnkgaW1hZ2UgdGhlIHN0b3JlIGhhcyBzZWVuLCBwZXIgc2xpY2UsIGFuZCBwZXIgc2xpY2UgdGhlIGlkcyBvZlxuICogdGhlIHNvdXJjZSBmZWF0dXJlcyB0YWtlbiBvdXQgb2YgdGhlIHNvdXJjZSAoaW50byB0aGUgd29ya2luZyBzZXQsIG9yIGRlbGV0ZWQpIOKAlCB0aG9zZSB0aGVcbiAqIHNvdXJjZSBubyBsb25nZXIgZHJhd3MgYW5kIGFuIGV4cG9ydCBsZWF2ZXMgb3V0LlxuICpcbiAqIFNvdXJjZXMgb3BlbiBsYXppbHksIHRoZSBmaXJzdCB0aW1lIHRoZWlyIHNsaWNlIGlzIHNob3duIG9yIHJlYWQsIGFuZCBhdCBtb3N0XG4gKiB7QGxpbmsgT1BFTl9SRUdJT05fU09VUkNFU30gc3RheSBvcGVuOiB0aGUgbGVhc3QgcmVjZW50bHkgdXNlZCBhcmUgY2xvc2VkIGFuZCByZS1vcGVuZWQgZnJvbVxuICogdGhlaXIgb3BlbmVyIHdoZW4gdXNlZCBhZ2FpbiAoYSBzb3VyY2UncyBpZHMgYXJlIHN0YWJsZSwgc28gd2hhdCB3YXMgdGFrZW4gc3RheXMgdGFrZW4pLiBUaGVcbiAqIHNvdXJjZSBvZiB0aGUgc2xpY2Ugb24gc2NyZWVuICh7QGxpbmsgc2hvd30pIGlzIG5ldmVyIGNsb3NlZCBmb3IgYW5vdGhlcjogYSByZWFkIGFjcm9zcyBldmVyeVxuICogc2xpY2UgbXVzdCBub3QgY2xvc2UgdGhlIHNvdXJjZSB0aGUgdmlld2VyIGRyYXdzIGFuZCB0YWtlcyBmcm9tLlxuICovXG5leHBvcnQgY2xhc3MgUmVnaW9uU291cmNlU2NvcGUge1xuICBwcml2YXRlIHJlYWRvbmx5IGltYWdlcyA9IG5ldyBNYXA8c3RyaW5nLCBJbWFnZVNvdXJjZXM+KCk7XG4gIC8qKiBPcGVuIGVudHJpZXMsIGxlYXN0IHJlY2VudGx5IHVzZWQgZmlyc3QuICovXG4gIHByaXZhdGUgcmVhZG9ubHkgb3Blbk9yZGVyOiBFbnRyeVtdID0gW107XG4gIC8qKiBUaGUgZW50cnkgb2YgdGhlIHNsaWNlIG9uIHNjcmVlbjoga2VwdCBvcGVuLiAqL1xuICBwcml2YXRlIHNob3duOiBFbnRyeSB8IG51bGwgPSBudWxsO1xuXG4gIC8qKlxuICAgKiBBdHRhY2ggYG9wZW5gIHRvIGBpbWFnZWAgZm9yIGBzbGljZXNgLCByZXBsYWNpbmcgKGFuZCBjbG9zaW5nKSB3aGF0IHdhcyB0aGVyZS4gYGltcG9ydGVkYCBuYW1lc1xuICAgKiB0aGUgc2xpY2VzIGl0IGJyaW5ncyB0aGF0IGEgc2F2ZSBtdXN0IHdyaXRlIChzZWUge0BsaW5rIGltcG9ydGVkU2xpY2VzfSk6IGZvciBhIHNvdXJjZSBvZiBvbmVcbiAgICogc2xpY2UsIHRoYXQgc2xpY2Ugd2hlbiBub24tZW1wdHk7IGZvciBhIGAncGxhbmVzJ2Agc291cmNlLCB0aGUgc2xpY2VzIGl0cyBwbGFuZXMgY292ZXIuXG4gICAqL1xuICBhdHRhY2goXG4gICAgaW1hZ2U6IHN0cmluZyxcbiAgICBvcGVuOiBSZWdpb25Tb3VyY2VPcGVuZXIsXG4gICAgc2xpY2VzOiBSZWdpb25Tb3VyY2VTbGljZXMsXG4gICAgaW1wb3J0ZWQ6IHJlYWRvbmx5IG51bWJlcltdID0gW10sXG4gICk6IHZvaWQge1xuICAgIGNvbnN0IHNvdXJjZXMgPSB0aGlzLmltYWdlU291cmNlcyhpbWFnZSk7XG4gICAgY29uc3QgZW50cnk6IEVudHJ5ID0geyBvcGVuLCBzb3VyY2U6IG51bGwsIHJlYWR5OiBudWxsIH07XG4gICAgaWYgKHNsaWNlcyA9PT0gJ3BsYW5lcycpIHtcbiAgICAgIGlmIChzb3VyY2VzLnBsYW5lcykgdGhpcy5jbG9zZShzb3VyY2VzLnBsYW5lcyk7XG4gICAgICBzb3VyY2VzLnBsYW5lcyA9IGVudHJ5O1xuICAgICAgc291cmNlcy5wZXJTbGljZS5mb3JFYWNoKChlKSA9PiB0aGlzLmNsb3NlKGUpKTtcbiAgICAgIHNvdXJjZXMucGVyU2xpY2UuY2xlYXIoKTtcbiAgICAgIHNvdXJjZXMudGFrZW4uY2xlYXIoKTtcbiAgICAgIHNvdXJjZXMuaW1wb3J0ZWQgPSBuZXcgU2V0KGltcG9ydGVkKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3Qgb2xkID0gc291cmNlcy5wZXJTbGljZS5nZXQoc2xpY2VzLnNsaWNlKTtcbiAgICAgIGlmIChvbGQpIHRoaXMuY2xvc2Uob2xkKTtcbiAgICAgIGVudHJ5LnBsYW5lID0gc2xpY2VzLnBsYW5lID8/IDA7XG4gICAgICBzb3VyY2VzLnBlclNsaWNlLnNldChzbGljZXMuc2xpY2UsIGVudHJ5KTtcbiAgICAgIHNvdXJjZXMudGFrZW4uZGVsZXRlKHNsaWNlcy5zbGljZSk7XG4gICAgICBpZiAoaW1wb3J0ZWQubGVuZ3RoKSBzb3VyY2VzLmltcG9ydGVkLmFkZChzbGljZXMuc2xpY2UpO1xuICAgICAgZWxzZSBzb3VyY2VzLmltcG9ydGVkLmRlbGV0ZShzbGljZXMuc2xpY2UpO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBEcm9wIGV2ZXJ5IHNvdXJjZSBvZiBgaW1hZ2VgIChjbG9zaW5nIHRoZSBvcGVuIG9uZXMpIGFuZCB3aGF0IHdhcyB0YWtlbiBmcm9tIHRoZW0uICovXG4gIGRldGFjaEltYWdlKGltYWdlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBzb3VyY2VzID0gdGhpcy5pbWFnZXMuZ2V0KGltYWdlKTtcbiAgICBpZiAoIXNvdXJjZXMpIHJldHVybjtcbiAgICBpZiAoc291cmNlcy5wbGFuZXMpIHRoaXMuY2xvc2Uoc291cmNlcy5wbGFuZXMpO1xuICAgIHNvdXJjZXMucGVyU2xpY2UuZm9yRWFjaCgoZSkgPT4gdGhpcy5jbG9zZShlKSk7XG4gICAgdGhpcy5pbWFnZXMuZGVsZXRlKGltYWdlKTtcbiAgfVxuXG4gIC8qKiBEcm9wIHRoZSBzb3VyY2Ugb2Ygb25lIHNsaWNlIG9mIGBpbWFnZWAuICovXG4gIGRldGFjaFNsaWNlKGltYWdlOiBzdHJpbmcsIHNsaWNlOiBudW1iZXIpOiB2b2lkIHtcbiAgICBjb25zdCBzb3VyY2VzID0gdGhpcy5pbWFnZXMuZ2V0KGltYWdlKTtcbiAgICBjb25zdCBlbnRyeSA9IHNvdXJjZXM/LnBlclNsaWNlLmdldChzbGljZSk7XG4gICAgaWYgKCFzb3VyY2VzIHx8ICFlbnRyeSkgcmV0dXJuO1xuICAgIHRoaXMuY2xvc2UoZW50cnkpO1xuICAgIHNvdXJjZXMucGVyU2xpY2UuZGVsZXRlKHNsaWNlKTtcbiAgICBzb3VyY2VzLnRha2VuLmRlbGV0ZShzbGljZSk7XG4gICAgc291cmNlcy5pbXBvcnRlZC5kZWxldGUoc2xpY2UpO1xuICB9XG5cbiAgLyoqIFRoZSBzbGljZSBvbiBzY3JlZW4gKG51bGw6IG5vbmUpOiBpdHMgc291cmNlIHN0YXlzIG9wZW4gd2hpbGUgb3RoZXJzIGFyZSByZWFkLiAqL1xuICBzaG93KGltYWdlOiBzdHJpbmcgfCB1bmRlZmluZWQsIHNsaWNlOiBudW1iZXIgfCBudWxsKTogdm9pZCB7XG4gICAgdGhpcy5zaG93biA9IGltYWdlICYmIHNsaWNlICE9PSBudWxsID8gdGhpcy5lbnRyeShpbWFnZSwgc2xpY2UpIDogbnVsbDtcbiAgfVxuXG4gIC8qKiBXaGV0aGVyIGBpbWFnZWAgaGFzIGEgc291cmNlIGZvciBgc2xpY2VgLiAqL1xuICBoYXMoaW1hZ2U6IHN0cmluZyB8IHVuZGVmaW5lZCwgc2xpY2U6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhIWltYWdlICYmICEhdGhpcy5lbnRyeShpbWFnZSwgc2xpY2UpO1xuICB9XG5cbiAgLyoqIFdoZXRoZXIgYHNsaWNlYCBvZiBgaW1hZ2VgIGhhcyBhIHNvdXJjZSBvZiBpdHMgb3duIChub3QgYSBgJ3BsYW5lcydgIHNvdXJjZSdzIHBsYW5lKS4gKi9cbiAgaGFzT3duU291cmNlKGltYWdlOiBzdHJpbmcgfCB1bmRlZmluZWQsIHNsaWNlOiBudW1iZXIpOiBib29sZWFuIHtcbiAgICByZXR1cm4gISFpbWFnZSAmJiAhIXRoaXMuaW1hZ2VzLmdldChpbWFnZSk/LnBlclNsaWNlLmhhcyhzbGljZSk7XG4gIH1cblxuICAvKiogRXZlcnkgc2xpY2Ugb2YgYGltYWdlYCB3aXRoIGEgc291cmNlIG9mIGl0cyBvd24gKG5vdCBjb3VudGluZyBhIGAncGxhbmVzJ2Agc291cmNlKS4gKi9cbiAgc2xpY2VzV2l0aFNvdXJjZShpbWFnZTogc3RyaW5nIHwgdW5kZWZpbmVkKTogbnVtYmVyW10ge1xuICAgIGlmICghaW1hZ2UpIHJldHVybiBbXTtcbiAgICByZXR1cm4gQXJyYXkuZnJvbSh0aGlzLmltYWdlcy5nZXQoaW1hZ2UpPy5wZXJTbGljZS5rZXlzKCkgPz8gW10pLnNvcnQoKGEsIGIpID0+IGEgLSBiKTtcbiAgfVxuXG4gIC8qKiBXaGV0aGVyIGBpbWFnZWAgaGFzIG9uZSBzb3VyY2Ugb3ZlciBhbGwgaXRzIHNsaWNlcy4gKi9cbiAgaGFzUGxhbmVzU291cmNlKGltYWdlOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBib29sZWFuIHtcbiAgICByZXR1cm4gISFpbWFnZSAmJiAhIXRoaXMuaW1hZ2VzLmdldChpbWFnZSk/LnBsYW5lcztcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgc291cmNlIGJlaGluZCBgc2xpY2VgIG9mIGBpbWFnZWAsIG9wZW5pbmcgaXQgaWYgbmVlZGVkLiBSZXNvbHZlcyBudWxsIHdoZW4gdGhlcmUgaXNcbiAgICogbm9uZSwgYW5kIHJlamVjdHMgd2hlbiBpdCBjYW5ub3QgYmUgb3BlbmVkLlxuICAgKi9cbiAgYXN5bmMgYmluZGluZyhpbWFnZTogc3RyaW5nIHwgdW5kZWZpbmVkLCBzbGljZTogbnVtYmVyKTogUHJvbWlzZTxSZWdpb25Tb3VyY2VCaW5kaW5nIHwgbnVsbD4ge1xuICAgIGNvbnN0IGVudHJ5ID0gaW1hZ2UgPyB0aGlzLmVudHJ5KGltYWdlLCBzbGljZSkgOiBudWxsO1xuICAgIGlmICghZW50cnkpIHJldHVybiBudWxsO1xuICAgIGNvbnN0IHNvdXJjZSA9IGF3YWl0IHRoaXMub3BlbkVudHJ5KGVudHJ5KTtcbiAgICByZXR1cm4geyBzb3VyY2UsIHBsYW5lOiBlbnRyeS5wbGFuZSA/PyBzbGljZSB9O1xuICB9XG5cbiAgLyoqIFRoZSBpZHMgdGFrZW4gZnJvbSBgc2xpY2VgJ3Mgc291cmNlLiAqL1xuICB0YWtlbihpbWFnZTogc3RyaW5nIHwgdW5kZWZpbmVkLCBzbGljZTogbnVtYmVyKTogUmVhZG9ubHlTZXQ8c3RyaW5nPiB7XG4gICAgcmV0dXJuIChpbWFnZSAmJiB0aGlzLmltYWdlcy5nZXQoaW1hZ2UpPy50YWtlbi5nZXQoc2xpY2UpKSB8fCBOT05FO1xuICB9XG5cbiAgLyoqIEV2ZXJ5IGlkIHRha2VuIGZyb20gYW55IHNsaWNlIG9mIGBpbWFnZWAgKGEgYCdwbGFuZXMnYCBzb3VyY2UncyBpZHMgYXJlIHVuaXF1ZSBhY3Jvc3MgdGhlbSkuICovXG4gIGFsbFRha2VuKGltYWdlOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBzdHJpbmdbXSB7XG4gICAgY29uc3QgdGFrZW4gPSBpbWFnZSA/IHRoaXMuaW1hZ2VzLmdldChpbWFnZSk/LnRha2VuIDogdW5kZWZpbmVkO1xuICAgIHJldHVybiB0YWtlbiA/IEFycmF5LmZyb20odGFrZW4udmFsdWVzKCkpLmZsYXRNYXAoKGlkcykgPT4gQXJyYXkuZnJvbShpZHMpKSA6IFtdO1xuICB9XG5cbiAgLyoqIFRoZSBzbGljZXMgb2YgYGltYWdlYCB3aG9zZSBzb3VyY2Ugd2FzIGltcG9ydGVkIChzZWUge0BsaW5rIGF0dGFjaH0pLCBpbiBvcmRlci4gKi9cbiAgaW1wb3J0ZWRTbGljZXMoaW1hZ2U6IHN0cmluZyB8IHVuZGVmaW5lZCk6IG51bWJlcltdIHtcbiAgICBjb25zdCBpbXBvcnRlZCA9IGltYWdlID8gdGhpcy5pbWFnZXMuZ2V0KGltYWdlKT8uaW1wb3J0ZWQgOiB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIGltcG9ydGVkID8gQXJyYXkuZnJvbShpbXBvcnRlZCkuc29ydCgoYSwgYikgPT4gYSAtIGIpIDogW107XG4gIH1cblxuICAvKiogVGhlIHNsaWNlcyBvZiBgaW1hZ2VgIHdpdGggYW55dGhpbmcgdGFrZW4gZnJvbSB0aGVpciBzb3VyY2UuICovXG4gIHNsaWNlc1dpdGhUYWtlbihpbWFnZTogc3RyaW5nIHwgdW5kZWZpbmVkKTogbnVtYmVyW10ge1xuICAgIGNvbnN0IHRha2VuID0gaW1hZ2UgPyB0aGlzLmltYWdlcy5nZXQoaW1hZ2UpPy50YWtlbiA6IHVuZGVmaW5lZDtcbiAgICByZXR1cm4gdGFrZW4gPyBBcnJheS5mcm9tKHRha2VuLmtleXMoKSkgOiBbXTtcbiAgfVxuXG4gIC8qKiBSZXBsYWNlIHRoZSBpZHMgdGFrZW4gZnJvbSBgc2xpY2VgJ3Mgc291cmNlIChjb3B5LW9uLXdyaXRlOiBgaWRzYCBpcyBrZXB0IGFzIGdpdmVuKS4gKi9cbiAgc2V0VGFrZW4oaW1hZ2U6IHN0cmluZyB8IHVuZGVmaW5lZCwgc2xpY2U6IG51bWJlciwgaWRzOiBSZWFkb25seVNldDxzdHJpbmc+KTogdm9pZCB7XG4gICAgaWYgKCFpbWFnZSkgcmV0dXJuO1xuICAgIGNvbnN0IHNvdXJjZXMgPSB0aGlzLmltYWdlcy5nZXQoaW1hZ2UpO1xuICAgIGlmICghc291cmNlcykgcmV0dXJuO1xuICAgIGlmIChpZHMuc2l6ZSkgc291cmNlcy50YWtlbi5zZXQoc2xpY2UsIGlkcyk7XG4gICAgZWxzZSBzb3VyY2VzLnRha2VuLmRlbGV0ZShzbGljZSk7XG4gIH1cblxuICBwcml2YXRlIGVudHJ5KGltYWdlOiBzdHJpbmcsIHNsaWNlOiBudW1iZXIpOiBFbnRyeSB8IG51bGwge1xuICAgIGNvbnN0IHNvdXJjZXMgPSB0aGlzLmltYWdlcy5nZXQoaW1hZ2UpO1xuICAgIHJldHVybiBzb3VyY2VzPy5wZXJTbGljZS5nZXQoc2xpY2UpID8/IHNvdXJjZXM/LnBsYW5lcyA/PyBudWxsO1xuICB9XG5cbiAgcHJpdmF0ZSBpbWFnZVNvdXJjZXMoaW1hZ2U6IHN0cmluZyk6IEltYWdlU291cmNlcyB7XG4gICAgbGV0IHNvdXJjZXMgPSB0aGlzLmltYWdlcy5nZXQoaW1hZ2UpO1xuICAgIGlmICghc291cmNlcykge1xuICAgICAgc291cmNlcyA9IHsgcGxhbmVzOiBudWxsLCBwZXJTbGljZTogbmV3IE1hcCgpLCB0YWtlbjogbmV3IE1hcCgpLCBpbXBvcnRlZDogbmV3IFNldCgpIH07XG4gICAgICB0aGlzLmltYWdlcy5zZXQoaW1hZ2UsIHNvdXJjZXMpO1xuICAgIH1cbiAgICByZXR1cm4gc291cmNlcztcbiAgfVxuXG4gIHByaXZhdGUgb3BlbkVudHJ5KGVudHJ5OiBFbnRyeSk6IFByb21pc2U8UmVnaW9uU291cmNlPiB7XG4gICAgY29uc3QgYXQgPSB0aGlzLm9wZW5PcmRlci5pbmRleE9mKGVudHJ5KTtcbiAgICBpZiAoYXQgPj0gMCkgdGhpcy5vcGVuT3JkZXIuc3BsaWNlKGF0LCAxKTtcbiAgICB0aGlzLm9wZW5PcmRlci5wdXNoKGVudHJ5KTtcbiAgICBpZiAoIWVudHJ5LnNvdXJjZSkge1xuICAgICAgY29uc3Qgb3BlbmluZyA9IGVudHJ5Lm9wZW4oKTtcbiAgICAgIGVudHJ5LnNvdXJjZSA9IG9wZW5pbmc7XG4gICAgICBvcGVuaW5nLnRoZW4oXG4gICAgICAgIChzb3VyY2UpID0+IHtcbiAgICAgICAgICBpZiAoZW50cnkuc291cmNlID09PSBvcGVuaW5nKSBlbnRyeS5yZWFkeSA9IHNvdXJjZTtcbiAgICAgICAgICBlbHNlIHNvdXJjZS5kaXNwb3NlKCk7IC8vIGNsb3NlZCB3aGlsZSBpdCBvcGVuZWRcbiAgICAgICAgfSxcbiAgICAgICAgKCkgPT4ge1xuICAgICAgICAgIGlmIChlbnRyeS5zb3VyY2UgPT09IG9wZW5pbmcpIGVudHJ5LnNvdXJjZSA9IG51bGw7IC8vIHRyeSBhZ2FpbiBuZXh0IHRpbWVcbiAgICAgICAgfSxcbiAgICAgICk7XG4gICAgfVxuICAgIHdoaWxlICh0aGlzLm9wZW5PcmRlci5sZW5ndGggPiBPUEVOX1JFR0lPTl9TT1VSQ0VTKSB7XG4gICAgICBjb25zdCBbb2xkZXN0XSA9IHRoaXMub3Blbk9yZGVyLnNwbGljZShcbiAgICAgICAgdGhpcy5vcGVuT3JkZXIuZmluZEluZGV4KChlKSA9PiBlICE9PSB0aGlzLnNob3duKSxcbiAgICAgICAgMSxcbiAgICAgICk7XG4gICAgICB0aGlzLmNsb3NlU291cmNlKG9sZGVzdCk7XG4gICAgfVxuICAgIHJldHVybiBlbnRyeS5zb3VyY2U7XG4gIH1cblxuICBwcml2YXRlIGNsb3NlKGVudHJ5OiBFbnRyeSk6IHZvaWQge1xuICAgIGNvbnN0IGF0ID0gdGhpcy5vcGVuT3JkZXIuaW5kZXhPZihlbnRyeSk7XG4gICAgaWYgKGF0ID49IDApIHRoaXMub3Blbk9yZGVyLnNwbGljZShhdCwgMSk7XG4gICAgdGhpcy5jbG9zZVNvdXJjZShlbnRyeSk7XG4gIH1cblxuICBwcml2YXRlIGNsb3NlU291cmNlKGVudHJ5OiBFbnRyeSk6IHZvaWQge1xuICAgIGVudHJ5LnJlYWR5Py5kaXNwb3NlKCk7XG4gICAgZW50cnkucmVhZHkgPSBudWxsO1xuICAgIGVudHJ5LnNvdXJjZSA9IG51bGw7XG4gIH1cbn1cbiJdfQ==
195
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVnaW9uLXNvdXJjZS1zY29wZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvc3RvcmUvcmVnaW9uLXNvdXJjZS1zY29wZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFlQSxpR0FBaUc7QUFDakcsTUFBTSxDQUFDLE1BQU0sbUJBQW1CLEdBQUcsQ0FBQyxDQUFDO0FBc0JyQyxNQUFNLElBQUksR0FBd0IsSUFBSSxHQUFHLEVBQVUsQ0FBQztBQUVwRDs7Ozs7Ozs7OztHQVVHO0FBQ0gsTUFBTSxPQUFPLGlCQUFpQjtJQUE5QjtRQUNtQixXQUFNLEdBQUcsSUFBSSxHQUFHLEVBQXdCLENBQUM7UUFDMUQsK0NBQStDO1FBQzlCLGNBQVMsR0FBWSxFQUFFLENBQUM7UUFDekMsbURBQW1EO1FBQzNDLFVBQUssR0FBaUIsSUFBSSxDQUFDO0lBeUxyQyxDQUFDO0lBdkxDOzs7O09BSUc7SUFDSCxNQUFNLENBQ0osS0FBYSxFQUNiLElBQXdCLEVBQ3hCLE1BQTBCLEVBQzFCLFdBQThCLEVBQUU7UUFFaEMsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN6QyxNQUFNLEtBQUssR0FBVSxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsQ0FBQztRQUN6RCxJQUFJLE1BQU0sS0FBSyxRQUFRLEVBQUUsQ0FBQztZQUN4QixJQUFJLE9BQU8sQ0FBQyxNQUFNO2dCQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQy9DLE9BQU8sQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDO1lBQ3ZCLE9BQU8sQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDL0MsT0FBTyxDQUFDLFFBQVEsQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUN6QixPQUFPLENBQUMsS0FBSyxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ3RCLE9BQU8sQ0FBQyxRQUFRLEdBQUcsSUFBSSxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDdkMsQ0FBQzthQUFNLENBQUM7WUFDTixNQUFNLEdBQUcsR0FBRyxPQUFPLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDL0MsSUFBSSxHQUFHO2dCQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDekIsS0FBSyxDQUFDLEtBQUssR0FBRyxNQUFNLENBQUMsS0FBSyxJQUFJLENBQUMsQ0FBQztZQUNoQyxPQUFPLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDO1lBQzFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNuQyxJQUFJLFFBQVEsQ0FBQyxNQUFNO2dCQUFFLE9BQU8sQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQzs7Z0JBQ25ELE9BQU8sQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM3QyxDQUFDO0lBQ0gsQ0FBQztJQUVELHlGQUF5RjtJQUN6RixXQUFXLENBQUMsS0FBYTtRQUN2QixNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN2QyxJQUFJLENBQUMsT0FBTztZQUFFLE9BQU87UUFDckIsSUFBSSxPQUFPLENBQUMsTUFBTTtZQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQy9DLE9BQU8sQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDL0MsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDNUIsQ0FBQztJQUVELCtDQUErQztJQUMvQyxXQUFXLENBQUMsS0FBYSxFQUFFLEtBQWE7UUFDdEMsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDdkMsTUFBTSxLQUFLLEdBQUcsT0FBTyxFQUFFLFFBQVEsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDM0MsSUFBSSxDQUFDLE9BQU8sSUFBSSxDQUFDLEtBQUs7WUFBRSxPQUFPO1FBQy9CLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDbEIsT0FBTyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDL0IsT0FBTyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDNUIsT0FBTyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDakMsQ0FBQztJQUVELHFGQUFxRjtJQUNyRixJQUFJLENBQUMsS0FBeUIsRUFBRSxLQUFvQjtRQUNsRCxJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssSUFBSSxLQUFLLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO0lBQ3pFLENBQUM7SUFFRCxnREFBZ0Q7SUFDaEQsR0FBRyxDQUFDLEtBQXlCLEVBQUUsS0FBYTtRQUMxQyxPQUFPLENBQUMsQ0FBQyxLQUFLLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQy9DLENBQUM7SUFFRCw0RkFBNEY7SUFDNUYsWUFBWSxDQUFDLEtBQXlCLEVBQUUsS0FBYTtRQUNuRCxPQUFPLENBQUMsQ0FBQyxLQUFLLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxFQUFFLFFBQVEsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDbEUsQ0FBQztJQUVELDBGQUEwRjtJQUMxRixnQkFBZ0IsQ0FBQyxLQUF5QjtRQUN4QyxJQUFJLENBQUMsS0FBSztZQUFFLE9BQU8sRUFBRSxDQUFDO1FBQ3RCLE9BQU8sS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsRUFBRSxRQUFRLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQ3pGLENBQUM7SUFFRCwwREFBMEQ7SUFDMUQsZUFBZSxDQUFDLEtBQXlCO1FBQ3ZDLE9BQU8sQ0FBQyxDQUFDLEtBQUssSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEVBQUUsTUFBTSxDQUFDO0lBQ3JELENBQUM7SUFFRCw2RkFBNkY7SUFDN0YsWUFBWSxDQUFDLEtBQXlCO1FBQ3BDLE9BQU8sQ0FBQyxLQUFLLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEVBQUUsTUFBTSxFQUFFLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQztJQUNqRSxDQUFDO0lBRUQsd0ZBQXdGO0lBQ3hGLE1BQU0sQ0FBQyxLQUF5QjtRQUM5QixNQUFNLE9BQU8sR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7UUFDM0QsT0FBTyxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxNQUFNLElBQUksT0FBTyxDQUFDLFFBQVEsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDdEUsQ0FBQztJQUVEOzs7T0FHRztJQUNILEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBeUIsRUFBRSxLQUFhO1FBQ3BELE1BQU0sS0FBSyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztRQUN0RCxJQUFJLENBQUMsS0FBSztZQUFFLE9BQU8sSUFBSSxDQUFDO1FBQ3hCLE1BQU0sTUFBTSxHQUFHLE1BQU0sSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUMzQyxPQUFPLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUMsS0FBSyxJQUFJLEtBQUssRUFBRSxDQUFDO0lBQ2pELENBQUM7SUFFRCwyQ0FBMkM7SUFDM0MsS0FBSyxDQUFDLEtBQXlCLEVBQUUsS0FBYTtRQUM1QyxPQUFPLENBQUMsS0FBSyxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxFQUFFLEtBQUssQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUM7SUFDckUsQ0FBQztJQUVELG1HQUFtRztJQUNuRyxRQUFRLENBQUMsS0FBeUI7UUFDaEMsTUFBTSxLQUFLLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztRQUNoRSxPQUFPLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0lBQ25GLENBQUM7SUFFRCxzRkFBc0Y7SUFDdEYsY0FBYyxDQUFDLEtBQXlCO1FBQ3RDLE1BQU0sUUFBUSxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7UUFDdEUsT0FBTyxRQUFRLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7SUFDcEUsQ0FBQztJQUVELG1FQUFtRTtJQUNuRSxlQUFlLENBQUMsS0FBeUI7UUFDdkMsTUFBTSxLQUFLLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztRQUNoRSxPQUFPLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0lBQy9DLENBQUM7SUFFRCwyRkFBMkY7SUFDM0YsUUFBUSxDQUFDLEtBQXlCLEVBQUUsS0FBYSxFQUFFLEdBQXdCO1FBQ3pFLElBQUksQ0FBQyxLQUFLO1lBQUUsT0FBTztRQUNuQixNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN2QyxJQUFJLENBQUMsT0FBTztZQUFFLE9BQU87UUFDckIsSUFBSSxHQUFHLENBQUMsSUFBSTtZQUFFLE9BQU8sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxHQUFHLENBQUMsQ0FBQzs7WUFDdkMsT0FBTyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDbkMsQ0FBQztJQUVPLEtBQUssQ0FBQyxLQUFhLEVBQUUsS0FBYTtRQUN4QyxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN2QyxPQUFPLE9BQU8sRUFBRSxRQUFRLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxJQUFJLE9BQU8sRUFBRSxNQUFNLElBQUksSUFBSSxDQUFDO0lBQ2pFLENBQUM7SUFFTyxZQUFZLENBQUMsS0FBYTtRQUNoQyxJQUFJLE9BQU8sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNyQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDYixPQUFPLEdBQUcsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxJQUFJLEdBQUcsRUFBRSxFQUFFLEtBQUssRUFBRSxJQUFJLEdBQUcsRUFBRSxFQUFFLFFBQVEsRUFBRSxJQUFJLEdBQUcsRUFBRSxFQUFFLENBQUM7WUFDdkYsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQ2xDLENBQUM7UUFDRCxPQUFPLE9BQU8sQ0FBQztJQUNqQixDQUFDO0lBRU8sU0FBUyxDQUFDLEtBQVk7UUFDNUIsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDekMsSUFBSSxFQUFFLElBQUksQ0FBQztZQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUMxQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUMzQixJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ2xCLE1BQU0sT0FBTyxHQUFHLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUM3QixLQUFLLENBQUMsTUFBTSxHQUFHLE9BQU8sQ0FBQztZQUN2QixPQUFPLENBQUMsSUFBSSxDQUNWLENBQUMsTUFBTSxFQUFFLEVBQUU7Z0JBQ1QsSUFBSSxLQUFLLENBQUMsTUFBTSxLQUFLLE9BQU87b0JBQUUsS0FBSyxDQUFDLEtBQUssR0FBRyxNQUFNLENBQUM7O29CQUM5QyxNQUFNLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyx5QkFBeUI7WUFDbEQsQ0FBQyxFQUNELEdBQUcsRUFBRTtnQkFDSCxJQUFJLEtBQUssQ0FBQyxNQUFNLEtBQUssT0FBTztvQkFBRSxLQUFLLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxDQUFDLHNCQUFzQjtZQUMzRSxDQUFDLENBQ0YsQ0FBQztRQUNKLENBQUM7UUFDRCxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxHQUFHLG1CQUFtQixFQUFFLENBQUM7WUFDbkQsTUFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUNwQyxJQUFJLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxLQUFLLElBQUksQ0FBQyxLQUFLLENBQUMsRUFDakQsQ0FBQyxDQUNGLENBQUM7WUFDRixJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzNCLENBQUM7UUFDRCxPQUFPLEtBQUssQ0FBQyxNQUFNLENBQUM7SUFDdEIsQ0FBQztJQUVPLEtBQUssQ0FBQyxLQUFZO1FBQ3hCLE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3pDLElBQUksRUFBRSxJQUFJLENBQUM7WUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDMUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUMxQixDQUFDO0lBRU8sV0FBVyxDQUFDLEtBQVk7UUFDOUIsS0FBSyxDQUFDLEtBQUssRUFBRSxPQUFPLEVBQUUsQ0FBQztRQUN2QixLQUFLLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQztRQUNuQixLQUFLLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQztJQUN0QixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IFJlZ2lvblNvdXJjZSB9IGZyb20gJy4uL3JlZ2lvbi1zb3VyY2UvcmVnaW9uLXNvdXJjZSc7XG5cbi8qKiBPcGVucyBhIHJlZ2lvbiBzb3VyY2Ugb24gZGVtYW5kIChhbmQgYWdhaW4gYWZ0ZXIgaXQgd2FzIGNsb3NlZCB0byBzYXZlIG1lbW9yeSkuICovXG5leHBvcnQgdHlwZSBSZWdpb25Tb3VyY2VPcGVuZXIgPSAoKSA9PiBQcm9taXNlPFJlZ2lvblNvdXJjZT47XG5cbi8qKiBXaGljaCBzbGljZXMgYSBzb3VyY2Ugc2VydmVzOiBvbmUgc2xpY2UgKHBsYW5lIGBwbGFuZWAgb2YgdGhlIHNvdXJjZSksIG9yIGV2ZXJ5IHNsaWNlIHpcbiAqICBmcm9tIHRoZSBzb3VyY2UncyBwbGFuZSB6IChhIHotaW5kZXhlZCBHZW9KU09OIG92ZXIgYSB3aG9sZSBzdGFjaykuICovXG5leHBvcnQgdHlwZSBSZWdpb25Tb3VyY2VTbGljZXMgPSB7IHNsaWNlOiBudW1iZXI7IHBsYW5lPzogbnVtYmVyIH0gfCAncGxhbmVzJztcblxuLyoqIFRoZSByZWdpb24gc291cmNlIGJlaGluZCBvbmUgc2xpY2U6IHRoZSBzb3VyY2UgYW5kIHdoaWNoIG9mIGl0cyBwbGFuZXMgdGhlIHNsaWNlIHNob3dzLiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZWdpb25Tb3VyY2VCaW5kaW5nIHtcbiAgc291cmNlOiBSZWdpb25Tb3VyY2U7XG4gIHBsYW5lOiBudW1iZXI7XG59XG5cbi8qKiBTb3VyY2VzIGhlbGQgb3BlbiwgcGFzdCB3aGljaCB0aGUgbGVhc3QgcmVjZW50bHkgdXNlZCBvbmUgaXMgY2xvc2VkIChuZXZlciB0aGUgb25lIHNob3duKS4gKi9cbmV4cG9ydCBjb25zdCBPUEVOX1JFR0lPTl9TT1VSQ0VTID0gNjtcblxuaW50ZXJmYWNlIEVudHJ5IHtcbiAgb3BlbjogUmVnaW9uU291cmNlT3BlbmVyO1xuICAvKiogVGhlIHBsYW5lIGVhY2ggc2xpY2Ugc2hvd3M7IHVuZGVmaW5lZCA9IHRoZSBzbGljZSdzIG93biBpbmRleC4gKi9cbiAgcGxhbmU/OiBudW1iZXI7XG4gIHNvdXJjZTogUHJvbWlzZTxSZWdpb25Tb3VyY2U+IHwgbnVsbDtcbiAgLyoqIFRoZSByZXNvbHZlZCBzb3VyY2UsIG9uY2Ugb3Blbi4gKi9cbiAgcmVhZHk6IFJlZ2lvblNvdXJjZSB8IG51bGw7XG59XG5cbmludGVyZmFjZSBJbWFnZVNvdXJjZXMge1xuICAvKiogVGhlIHNvdXJjZSBvdmVyIGV2ZXJ5IHNsaWNlIChgJ3BsYW5lcydgKSwgaWYgYW55LiAqL1xuICBwbGFuZXM6IEVudHJ5IHwgbnVsbDtcbiAgcGVyU2xpY2U6IE1hcDxudW1iZXIsIEVudHJ5PjtcbiAgLyoqIFNvdXJjZSBmZWF0dXJlIGlkcyB0YWtlbiBpbnRvIHRoZSB3b3JraW5nIHNldCAob3IgZGVsZXRlZCksIHBlciBzbGljZS4gKi9cbiAgdGFrZW46IE1hcDxudW1iZXIsIFJlYWRvbmx5U2V0PHN0cmluZz4+O1xuICAvKiogU2xpY2VzIHdob3NlIHNvdXJjZSB3YXMgaW1wb3J0ZWQgKG5vdCB0aGUgaW1hZ2UncyBvd24gcmVnaW9ucyk6IGEgc2F2ZSB3cml0ZXMgdGhlbSwgdGhvdWdoXG4gICAqICBub3RoaW5nIHdhcyB0YWtlbiwgc2luY2UgdGhleSBhcmUgb24gbm8gZmlsZSB5ZXQuICovXG4gIGltcG9ydGVkOiBTZXQ8bnVtYmVyPjtcbn1cblxuY29uc3QgTk9ORTogUmVhZG9ubHlTZXQ8c3RyaW5nPiA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXG4vKipcbiAqIFRoZSByZWdpb24gc291cmNlcyBvZiBldmVyeSBpbWFnZSB0aGUgc3RvcmUgaGFzIHNlZW4sIHBlciBzbGljZSwgYW5kIHBlciBzbGljZSB0aGUgaWRzIG9mXG4gKiB0aGUgc291cmNlIGZlYXR1cmVzIHRha2VuIG91dCBvZiB0aGUgc291cmNlIChpbnRvIHRoZSB3b3JraW5nIHNldCwgb3IgZGVsZXRlZCkg4oCUIHRob3NlIHRoZVxuICogc291cmNlIG5vIGxvbmdlciBkcmF3cyBhbmQgYW4gZXhwb3J0IGxlYXZlcyBvdXQuXG4gKlxuICogU291cmNlcyBvcGVuIGxhemlseSwgdGhlIGZpcnN0IHRpbWUgdGhlaXIgc2xpY2UgaXMgc2hvd24gb3IgcmVhZCwgYW5kIGF0IG1vc3RcbiAqIHtAbGluayBPUEVOX1JFR0lPTl9TT1VSQ0VTfSBzdGF5IG9wZW46IHRoZSBsZWFzdCByZWNlbnRseSB1c2VkIGFyZSBjbG9zZWQgYW5kIHJlLW9wZW5lZCBmcm9tXG4gKiB0aGVpciBvcGVuZXIgd2hlbiB1c2VkIGFnYWluIChhIHNvdXJjZSdzIGlkcyBhcmUgc3RhYmxlLCBzbyB3aGF0IHdhcyB0YWtlbiBzdGF5cyB0YWtlbikuIFRoZVxuICogc291cmNlIG9mIHRoZSBzbGljZSBvbiBzY3JlZW4gKHtAbGluayBzaG93fSkgaXMgbmV2ZXIgY2xvc2VkIGZvciBhbm90aGVyOiBhIHJlYWQgYWNyb3NzIGV2ZXJ5XG4gKiBzbGljZSBtdXN0IG5vdCBjbG9zZSB0aGUgc291cmNlIHRoZSB2aWV3ZXIgZHJhd3MgYW5kIHRha2VzIGZyb20uXG4gKi9cbmV4cG9ydCBjbGFzcyBSZWdpb25Tb3VyY2VTY29wZSB7XG4gIHByaXZhdGUgcmVhZG9ubHkgaW1hZ2VzID0gbmV3IE1hcDxzdHJpbmcsIEltYWdlU291cmNlcz4oKTtcbiAgLyoqIE9wZW4gZW50cmllcywgbGVhc3QgcmVjZW50bHkgdXNlZCBmaXJzdC4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSBvcGVuT3JkZXI6IEVudHJ5W10gPSBbXTtcbiAgLyoqIFRoZSBlbnRyeSBvZiB0aGUgc2xpY2Ugb24gc2NyZWVuOiBrZXB0IG9wZW4uICovXG4gIHByaXZhdGUgc2hvd246IEVudHJ5IHwgbnVsbCA9IG51bGw7XG5cbiAgLyoqXG4gICAqIEF0dGFjaCBgb3BlbmAgdG8gYGltYWdlYCBmb3IgYHNsaWNlc2AsIHJlcGxhY2luZyAoYW5kIGNsb3NpbmcpIHdoYXQgd2FzIHRoZXJlLiBgaW1wb3J0ZWRgIG5hbWVzXG4gICAqIHRoZSBzbGljZXMgaXQgYnJpbmdzIHRoYXQgYSBzYXZlIG11c3Qgd3JpdGUgKHNlZSB7QGxpbmsgaW1wb3J0ZWRTbGljZXN9KTogZm9yIGEgc291cmNlIG9mIG9uZVxuICAgKiBzbGljZSwgdGhhdCBzbGljZSB3aGVuIG5vbi1lbXB0eTsgZm9yIGEgYCdwbGFuZXMnYCBzb3VyY2UsIHRoZSBzbGljZXMgaXRzIHBsYW5lcyBjb3Zlci5cbiAgICovXG4gIGF0dGFjaChcbiAgICBpbWFnZTogc3RyaW5nLFxuICAgIG9wZW46IFJlZ2lvblNvdXJjZU9wZW5lcixcbiAgICBzbGljZXM6IFJlZ2lvblNvdXJjZVNsaWNlcyxcbiAgICBpbXBvcnRlZDogcmVhZG9ubHkgbnVtYmVyW10gPSBbXSxcbiAgKTogdm9pZCB7XG4gICAgY29uc3Qgc291cmNlcyA9IHRoaXMuaW1hZ2VTb3VyY2VzKGltYWdlKTtcbiAgICBjb25zdCBlbnRyeTogRW50cnkgPSB7IG9wZW4sIHNvdXJjZTogbnVsbCwgcmVhZHk6IG51bGwgfTtcbiAgICBpZiAoc2xpY2VzID09PSAncGxhbmVzJykge1xuICAgICAgaWYgKHNvdXJjZXMucGxhbmVzKSB0aGlzLmNsb3NlKHNvdXJjZXMucGxhbmVzKTtcbiAgICAgIHNvdXJjZXMucGxhbmVzID0gZW50cnk7XG4gICAgICBzb3VyY2VzLnBlclNsaWNlLmZvckVhY2goKGUpID0+IHRoaXMuY2xvc2UoZSkpO1xuICAgICAgc291cmNlcy5wZXJTbGljZS5jbGVhcigpO1xuICAgICAgc291cmNlcy50YWtlbi5jbGVhcigpO1xuICAgICAgc291cmNlcy5pbXBvcnRlZCA9IG5ldyBTZXQoaW1wb3J0ZWQpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBvbGQgPSBzb3VyY2VzLnBlclNsaWNlLmdldChzbGljZXMuc2xpY2UpO1xuICAgICAgaWYgKG9sZCkgdGhpcy5jbG9zZShvbGQpO1xuICAgICAgZW50cnkucGxhbmUgPSBzbGljZXMucGxhbmUgPz8gMDtcbiAgICAgIHNvdXJjZXMucGVyU2xpY2Uuc2V0KHNsaWNlcy5zbGljZSwgZW50cnkpO1xuICAgICAgc291cmNlcy50YWtlbi5kZWxldGUoc2xpY2VzLnNsaWNlKTtcbiAgICAgIGlmIChpbXBvcnRlZC5sZW5ndGgpIHNvdXJjZXMuaW1wb3J0ZWQuYWRkKHNsaWNlcy5zbGljZSk7XG4gICAgICBlbHNlIHNvdXJjZXMuaW1wb3J0ZWQuZGVsZXRlKHNsaWNlcy5zbGljZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqIERyb3AgZXZlcnkgc291cmNlIG9mIGBpbWFnZWAgKGNsb3NpbmcgdGhlIG9wZW4gb25lcykgYW5kIHdoYXQgd2FzIHRha2VuIGZyb20gdGhlbS4gKi9cbiAgZGV0YWNoSW1hZ2UoaW1hZ2U6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IHNvdXJjZXMgPSB0aGlzLmltYWdlcy5nZXQoaW1hZ2UpO1xuICAgIGlmICghc291cmNlcykgcmV0dXJuO1xuICAgIGlmIChzb3VyY2VzLnBsYW5lcykgdGhpcy5jbG9zZShzb3VyY2VzLnBsYW5lcyk7XG4gICAgc291cmNlcy5wZXJTbGljZS5mb3JFYWNoKChlKSA9PiB0aGlzLmNsb3NlKGUpKTtcbiAgICB0aGlzLmltYWdlcy5kZWxldGUoaW1hZ2UpO1xuICB9XG5cbiAgLyoqIERyb3AgdGhlIHNvdXJjZSBvZiBvbmUgc2xpY2Ugb2YgYGltYWdlYC4gKi9cbiAgZGV0YWNoU2xpY2UoaW1hZ2U6IHN0cmluZywgc2xpY2U6IG51bWJlcik6IHZvaWQge1xuICAgIGNvbnN0IHNvdXJjZXMgPSB0aGlzLmltYWdlcy5nZXQoaW1hZ2UpO1xuICAgIGNvbnN0IGVudHJ5ID0gc291cmNlcz8ucGVyU2xpY2UuZ2V0KHNsaWNlKTtcbiAgICBpZiAoIXNvdXJjZXMgfHwgIWVudHJ5KSByZXR1cm47XG4gICAgdGhpcy5jbG9zZShlbnRyeSk7XG4gICAgc291cmNlcy5wZXJTbGljZS5kZWxldGUoc2xpY2UpO1xuICAgIHNvdXJjZXMudGFrZW4uZGVsZXRlKHNsaWNlKTtcbiAgICBzb3VyY2VzLmltcG9ydGVkLmRlbGV0ZShzbGljZSk7XG4gIH1cblxuICAvKiogVGhlIHNsaWNlIG9uIHNjcmVlbiAobnVsbDogbm9uZSk6IGl0cyBzb3VyY2Ugc3RheXMgb3BlbiB3aGlsZSBvdGhlcnMgYXJlIHJlYWQuICovXG4gIHNob3coaW1hZ2U6IHN0cmluZyB8IHVuZGVmaW5lZCwgc2xpY2U6IG51bWJlciB8IG51bGwpOiB2b2lkIHtcbiAgICB0aGlzLnNob3duID0gaW1hZ2UgJiYgc2xpY2UgIT09IG51bGwgPyB0aGlzLmVudHJ5KGltYWdlLCBzbGljZSkgOiBudWxsO1xuICB9XG5cbiAgLyoqIFdoZXRoZXIgYGltYWdlYCBoYXMgYSBzb3VyY2UgZm9yIGBzbGljZWAuICovXG4gIGhhcyhpbWFnZTogc3RyaW5nIHwgdW5kZWZpbmVkLCBzbGljZTogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhaW1hZ2UgJiYgISF0aGlzLmVudHJ5KGltYWdlLCBzbGljZSk7XG4gIH1cblxuICAvKiogV2hldGhlciBgc2xpY2VgIG9mIGBpbWFnZWAgaGFzIGEgc291cmNlIG9mIGl0cyBvd24gKG5vdCBhIGAncGxhbmVzJ2Agc291cmNlJ3MgcGxhbmUpLiAqL1xuICBoYXNPd25Tb3VyY2UoaW1hZ2U6IHN0cmluZyB8IHVuZGVmaW5lZCwgc2xpY2U6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhIWltYWdlICYmICEhdGhpcy5pbWFnZXMuZ2V0KGltYWdlKT8ucGVyU2xpY2UuaGFzKHNsaWNlKTtcbiAgfVxuXG4gIC8qKiBFdmVyeSBzbGljZSBvZiBgaW1hZ2VgIHdpdGggYSBzb3VyY2Ugb2YgaXRzIG93biAobm90IGNvdW50aW5nIGEgYCdwbGFuZXMnYCBzb3VyY2UpLiAqL1xuICBzbGljZXNXaXRoU291cmNlKGltYWdlOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBudW1iZXJbXSB7XG4gICAgaWYgKCFpbWFnZSkgcmV0dXJuIFtdO1xuICAgIHJldHVybiBBcnJheS5mcm9tKHRoaXMuaW1hZ2VzLmdldChpbWFnZSk/LnBlclNsaWNlLmtleXMoKSA/PyBbXSkuc29ydCgoYSwgYikgPT4gYSAtIGIpO1xuICB9XG5cbiAgLyoqIFdoZXRoZXIgYGltYWdlYCBoYXMgb25lIHNvdXJjZSBvdmVyIGFsbCBpdHMgc2xpY2VzLiAqL1xuICBoYXNQbGFuZXNTb3VyY2UoaW1hZ2U6IHN0cmluZyB8IHVuZGVmaW5lZCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhIWltYWdlICYmICEhdGhpcy5pbWFnZXMuZ2V0KGltYWdlKT8ucGxhbmVzO1xuICB9XG5cbiAgLyoqIFRoZSBvcGVuZXIgb2YgYGltYWdlYCdzIHNvdXJjZSBvdmVyIGFsbCBpdHMgc2xpY2VzIChhcyBhdHRhY2hlZCksIG9yIG51bGwgd2l0aG91dCBvbmUuICovXG4gIHBsYW5lc09wZW5lcihpbWFnZTogc3RyaW5nIHwgdW5kZWZpbmVkKTogUmVnaW9uU291cmNlT3BlbmVyIHwgbnVsbCB7XG4gICAgcmV0dXJuIChpbWFnZSAmJiB0aGlzLmltYWdlcy5nZXQoaW1hZ2UpPy5wbGFuZXM/Lm9wZW4pIHx8IG51bGw7XG4gIH1cblxuICAvKiogV2hldGhlciBgaW1hZ2VgIGhhcyBhbnkgc291cmNlOiBvbmUgb3ZlciBhbGwgaXRzIHNsaWNlcywgb3Igb25lIG9mIGEgc2xpY2UncyBvd24uICovXG4gIGhhc0FueShpbWFnZTogc3RyaW5nIHwgdW5kZWZpbmVkKTogYm9vbGVhbiB7XG4gICAgY29uc3Qgc291cmNlcyA9IGltYWdlID8gdGhpcy5pbWFnZXMuZ2V0KGltYWdlKSA6IHVuZGVmaW5lZDtcbiAgICByZXR1cm4gISFzb3VyY2VzICYmICghIXNvdXJjZXMucGxhbmVzIHx8IHNvdXJjZXMucGVyU2xpY2Uuc2l6ZSA+IDApO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBzb3VyY2UgYmVoaW5kIGBzbGljZWAgb2YgYGltYWdlYCwgb3BlbmluZyBpdCBpZiBuZWVkZWQuIFJlc29sdmVzIG51bGwgd2hlbiB0aGVyZSBpc1xuICAgKiBub25lLCBhbmQgcmVqZWN0cyB3aGVuIGl0IGNhbm5vdCBiZSBvcGVuZWQuXG4gICAqL1xuICBhc3luYyBiaW5kaW5nKGltYWdlOiBzdHJpbmcgfCB1bmRlZmluZWQsIHNsaWNlOiBudW1iZXIpOiBQcm9taXNlPFJlZ2lvblNvdXJjZUJpbmRpbmcgfCBudWxsPiB7XG4gICAgY29uc3QgZW50cnkgPSBpbWFnZSA/IHRoaXMuZW50cnkoaW1hZ2UsIHNsaWNlKSA6IG51bGw7XG4gICAgaWYgKCFlbnRyeSkgcmV0dXJuIG51bGw7XG4gICAgY29uc3Qgc291cmNlID0gYXdhaXQgdGhpcy5vcGVuRW50cnkoZW50cnkpO1xuICAgIHJldHVybiB7IHNvdXJjZSwgcGxhbmU6IGVudHJ5LnBsYW5lID8/IHNsaWNlIH07XG4gIH1cblxuICAvKiogVGhlIGlkcyB0YWtlbiBmcm9tIGBzbGljZWAncyBzb3VyY2UuICovXG4gIHRha2VuKGltYWdlOiBzdHJpbmcgfCB1bmRlZmluZWQsIHNsaWNlOiBudW1iZXIpOiBSZWFkb25seVNldDxzdHJpbmc+IHtcbiAgICByZXR1cm4gKGltYWdlICYmIHRoaXMuaW1hZ2VzLmdldChpbWFnZSk/LnRha2VuLmdldChzbGljZSkpIHx8IE5PTkU7XG4gIH1cblxuICAvKiogRXZlcnkgaWQgdGFrZW4gZnJvbSBhbnkgc2xpY2Ugb2YgYGltYWdlYCAoYSBgJ3BsYW5lcydgIHNvdXJjZSdzIGlkcyBhcmUgdW5pcXVlIGFjcm9zcyB0aGVtKS4gKi9cbiAgYWxsVGFrZW4oaW1hZ2U6IHN0cmluZyB8IHVuZGVmaW5lZCk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCB0YWtlbiA9IGltYWdlID8gdGhpcy5pbWFnZXMuZ2V0KGltYWdlKT8udGFrZW4gOiB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIHRha2VuID8gQXJyYXkuZnJvbSh0YWtlbi52YWx1ZXMoKSkuZmxhdE1hcCgoaWRzKSA9PiBBcnJheS5mcm9tKGlkcykpIDogW107XG4gIH1cblxuICAvKiogVGhlIHNsaWNlcyBvZiBgaW1hZ2VgIHdob3NlIHNvdXJjZSB3YXMgaW1wb3J0ZWQgKHNlZSB7QGxpbmsgYXR0YWNofSksIGluIG9yZGVyLiAqL1xuICBpbXBvcnRlZFNsaWNlcyhpbWFnZTogc3RyaW5nIHwgdW5kZWZpbmVkKTogbnVtYmVyW10ge1xuICAgIGNvbnN0IGltcG9ydGVkID0gaW1hZ2UgPyB0aGlzLmltYWdlcy5nZXQoaW1hZ2UpPy5pbXBvcnRlZCA6IHVuZGVmaW5lZDtcbiAgICByZXR1cm4gaW1wb3J0ZWQgPyBBcnJheS5mcm9tKGltcG9ydGVkKS5zb3J0KChhLCBiKSA9PiBhIC0gYikgOiBbXTtcbiAgfVxuXG4gIC8qKiBUaGUgc2xpY2VzIG9mIGBpbWFnZWAgd2l0aCBhbnl0aGluZyB0YWtlbiBmcm9tIHRoZWlyIHNvdXJjZS4gKi9cbiAgc2xpY2VzV2l0aFRha2VuKGltYWdlOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBudW1iZXJbXSB7XG4gICAgY29uc3QgdGFrZW4gPSBpbWFnZSA/IHRoaXMuaW1hZ2VzLmdldChpbWFnZSk/LnRha2VuIDogdW5kZWZpbmVkO1xuICAgIHJldHVybiB0YWtlbiA/IEFycmF5LmZyb20odGFrZW4ua2V5cygpKSA6IFtdO1xuICB9XG5cbiAgLyoqIFJlcGxhY2UgdGhlIGlkcyB0YWtlbiBmcm9tIGBzbGljZWAncyBzb3VyY2UgKGNvcHktb24td3JpdGU6IGBpZHNgIGlzIGtlcHQgYXMgZ2l2ZW4pLiAqL1xuICBzZXRUYWtlbihpbWFnZTogc3RyaW5nIHwgdW5kZWZpbmVkLCBzbGljZTogbnVtYmVyLCBpZHM6IFJlYWRvbmx5U2V0PHN0cmluZz4pOiB2b2lkIHtcbiAgICBpZiAoIWltYWdlKSByZXR1cm47XG4gICAgY29uc3Qgc291cmNlcyA9IHRoaXMuaW1hZ2VzLmdldChpbWFnZSk7XG4gICAgaWYgKCFzb3VyY2VzKSByZXR1cm47XG4gICAgaWYgKGlkcy5zaXplKSBzb3VyY2VzLnRha2VuLnNldChzbGljZSwgaWRzKTtcbiAgICBlbHNlIHNvdXJjZXMudGFrZW4uZGVsZXRlKHNsaWNlKTtcbiAgfVxuXG4gIHByaXZhdGUgZW50cnkoaW1hZ2U6IHN0cmluZywgc2xpY2U6IG51bWJlcik6IEVudHJ5IHwgbnVsbCB7XG4gICAgY29uc3Qgc291cmNlcyA9IHRoaXMuaW1hZ2VzLmdldChpbWFnZSk7XG4gICAgcmV0dXJuIHNvdXJjZXM/LnBlclNsaWNlLmdldChzbGljZSkgPz8gc291cmNlcz8ucGxhbmVzID8/IG51bGw7XG4gIH1cblxuICBwcml2YXRlIGltYWdlU291cmNlcyhpbWFnZTogc3RyaW5nKTogSW1hZ2VTb3VyY2VzIHtcbiAgICBsZXQgc291cmNlcyA9IHRoaXMuaW1hZ2VzLmdldChpbWFnZSk7XG4gICAgaWYgKCFzb3VyY2VzKSB7XG4gICAgICBzb3VyY2VzID0geyBwbGFuZXM6IG51bGwsIHBlclNsaWNlOiBuZXcgTWFwKCksIHRha2VuOiBuZXcgTWFwKCksIGltcG9ydGVkOiBuZXcgU2V0KCkgfTtcbiAgICAgIHRoaXMuaW1hZ2VzLnNldChpbWFnZSwgc291cmNlcyk7XG4gICAgfVxuICAgIHJldHVybiBzb3VyY2VzO1xuICB9XG5cbiAgcHJpdmF0ZSBvcGVuRW50cnkoZW50cnk6IEVudHJ5KTogUHJvbWlzZTxSZWdpb25Tb3VyY2U+IHtcbiAgICBjb25zdCBhdCA9IHRoaXMub3Blbk9yZGVyLmluZGV4T2YoZW50cnkpO1xuICAgIGlmIChhdCA+PSAwKSB0aGlzLm9wZW5PcmRlci5zcGxpY2UoYXQsIDEpO1xuICAgIHRoaXMub3Blbk9yZGVyLnB1c2goZW50cnkpO1xuICAgIGlmICghZW50cnkuc291cmNlKSB7XG4gICAgICBjb25zdCBvcGVuaW5nID0gZW50cnkub3BlbigpO1xuICAgICAgZW50cnkuc291cmNlID0gb3BlbmluZztcbiAgICAgIG9wZW5pbmcudGhlbihcbiAgICAgICAgKHNvdXJjZSkgPT4ge1xuICAgICAgICAgIGlmIChlbnRyeS5zb3VyY2UgPT09IG9wZW5pbmcpIGVudHJ5LnJlYWR5ID0gc291cmNlO1xuICAgICAgICAgIGVsc2Ugc291cmNlLmRpc3Bvc2UoKTsgLy8gY2xvc2VkIHdoaWxlIGl0IG9wZW5lZFxuICAgICAgICB9LFxuICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgaWYgKGVudHJ5LnNvdXJjZSA9PT0gb3BlbmluZykgZW50cnkuc291cmNlID0gbnVsbDsgLy8gdHJ5IGFnYWluIG5leHQgdGltZVxuICAgICAgICB9LFxuICAgICAgKTtcbiAgICB9XG4gICAgd2hpbGUgKHRoaXMub3Blbk9yZGVyLmxlbmd0aCA+IE9QRU5fUkVHSU9OX1NPVVJDRVMpIHtcbiAgICAgIGNvbnN0IFtvbGRlc3RdID0gdGhpcy5vcGVuT3JkZXIuc3BsaWNlKFxuICAgICAgICB0aGlzLm9wZW5PcmRlci5maW5kSW5kZXgoKGUpID0+IGUgIT09IHRoaXMuc2hvd24pLFxuICAgICAgICAxLFxuICAgICAgKTtcbiAgICAgIHRoaXMuY2xvc2VTb3VyY2Uob2xkZXN0KTtcbiAgICB9XG4gICAgcmV0dXJuIGVudHJ5LnNvdXJjZTtcbiAgfVxuXG4gIHByaXZhdGUgY2xvc2UoZW50cnk6IEVudHJ5KTogdm9pZCB7XG4gICAgY29uc3QgYXQgPSB0aGlzLm9wZW5PcmRlci5pbmRleE9mKGVudHJ5KTtcbiAgICBpZiAoYXQgPj0gMCkgdGhpcy5vcGVuT3JkZXIuc3BsaWNlKGF0LCAxKTtcbiAgICB0aGlzLmNsb3NlU291cmNlKGVudHJ5KTtcbiAgfVxuXG4gIHByaXZhdGUgY2xvc2VTb3VyY2UoZW50cnk6IEVudHJ5KTogdm9pZCB7XG4gICAgZW50cnkucmVhZHk/LmRpc3Bvc2UoKTtcbiAgICBlbnRyeS5yZWFkeSA9IG51bGw7XG4gICAgZW50cnkuc291cmNlID0gbnVsbDtcbiAgfVxufVxuIl19