@jax-data-science/sci-image-visualizer 0.12.1 → 0.14.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2022/lib/contracts/channel-histogram-api.contract.mjs +19 -1
- package/esm2022/lib/contracts/display-types.mjs +7 -1
- package/esm2022/lib/contracts/image.contract.mjs +1 -1
- package/esm2022/lib/contracts/region-editor-api.contract.mjs +1 -1
- package/esm2022/lib/contracts/spatial-dataset.contract.mjs +1 -1
- package/esm2022/lib/contracts/visualizer.contract.mjs +1 -1
- package/esm2022/lib/geometry/reconstruct.mjs +11 -1
- package/esm2022/lib/implementations/napari-js/napari-image-2d-scene.mjs +17 -2
- package/esm2022/lib/implementations/napari-js/napari-spatial-2d-scene.mjs +88 -10
- package/esm2022/lib/implementations/napari-js/napari-spatial-3d-scene.mjs +62 -13
- package/esm2022/lib/implementations/napari-js/napari-spatial-encoding.mjs +21 -1
- package/esm2022/lib/implementations/napari-js/napari-spatial-scene.mjs +5 -1
- package/esm2022/lib/implementations/napari-js/napari-visualizer.service.mjs +9 -1
- package/esm2022/lib/implementations/napari-js/spatial-tiles/categorical-lookup.mjs +26 -3
- package/esm2022/lib/implementations/napari-js/spatial-tiles/cell-layers.mjs +3 -2
- package/esm2022/lib/implementations/napari-js/spatial-tiles/density-layer.mjs +20 -4
- package/esm2022/lib/implementations/napari-js/spatial-tiles/transcript-hover.mjs +4 -2
- package/esm2022/lib/implementations/napari-js/spatial-tiles/transcript-jobs.mjs +4 -2
- package/esm2022/lib/implementations/napari-js/spatial-tiles/transcript-layers.mjs +42 -15
- package/esm2022/lib/implementations/osd/openseadragon-visualizer.service.mjs +3 -1
- package/esm2022/lib/region-editor/region-editor.component.mjs +13 -1
- package/esm2022/lib/routing-visualizer.service.mjs +4 -1
- package/esm2022/lib/spatial/lod.mjs +6 -3
- package/esm2022/lib/spatial/spatial-controls.facade.mjs +78 -23
- package/esm2022/lib/spatial/spatial-gene-filter.mjs +138 -0
- package/esm2022/lib/spatial/spatial-selection.mjs +70 -1
- package/esm2022/lib/spatial/spatial-tile-merge.mjs +42 -1
- package/esm2022/lib/spatial-controls/spatial-cells-panel/spatial-cells-panel.component.mjs +3 -3
- package/esm2022/lib/spatial-controls/spatial-controls.component.mjs +54 -11
- package/esm2022/lib/spatial-controls/spatial-gene-style/spatial-gene-style.component.mjs +66 -0
- package/esm2022/lib/spatial-controls/spatial-gene-tree/spatial-gene-tree.component.mjs +106 -26
- package/esm2022/lib/spatial-controls/spatial-groups-panel/spatial-groups-panel.component.mjs +3 -3
- package/esm2022/lib/spatial-controls/spatial-key/spatial-key.component.mjs +3 -3
- package/esm2022/lib/spatial-controls/spatial-marker-genes-form/spatial-marker-genes-form.component.mjs +3 -3
- package/esm2022/lib/spatial-controls/spatial-observations-panel/spatial-observations-panel.component.mjs +110 -8
- package/esm2022/lib/spatial-controls/spatial-transcripts-panel/spatial-transcripts-panel.component.mjs +41 -9
- package/esm2022/lib/store/region-selection.mjs +21 -4
- package/esm2022/lib/store/region-store.service.mjs +22 -3
- package/esm2022/lib/store/spatial-selection.service.mjs +13 -1
- package/esm2022/lib/store/visualizer-store.service.mjs +50 -1
- package/esm2022/lib/toolbar/toolbar-help-dialog/toolbar-help-dialog.component.mjs +3 -3
- package/fesm2022/{jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-DnPlIP2F.mjs → jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-DvFp1jNH.mjs} +1777 -793
- package/fesm2022/jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-DvFp1jNH.mjs.map +1 -0
- package/fesm2022/{jax-data-science-sci-image-visualizer-onnx-sam-session-Bs987_-E.mjs → jax-data-science-sci-image-visualizer-onnx-sam-session-D7lSUAM1.mjs} +2 -2
- package/fesm2022/{jax-data-science-sci-image-visualizer-onnx-sam-session-Bs987_-E.mjs.map → jax-data-science-sci-image-visualizer-onnx-sam-session-D7lSUAM1.mjs.map} +1 -1
- package/fesm2022/jax-data-science-sci-image-visualizer.mjs +2 -2
- package/lib/contracts/channel-histogram-api.contract.d.ts +14 -0
- package/lib/contracts/display-types.d.ts +27 -0
- package/lib/contracts/image.contract.d.ts +2 -0
- package/lib/contracts/region-editor-api.contract.d.ts +3 -0
- package/lib/contracts/spatial-dataset.contract.d.ts +7 -0
- package/lib/contracts/visualizer.contract.d.ts +28 -2
- package/lib/geometry/reconstruct.d.ts +6 -0
- package/lib/implementations/napari-js/napari-image-2d-scene.d.ts +7 -0
- package/lib/implementations/napari-js/napari-spatial-2d-scene.d.ts +13 -2
- package/lib/implementations/napari-js/napari-spatial-encoding.d.ts +5 -0
- package/lib/implementations/napari-js/napari-spatial-scene.d.ts +4 -0
- package/lib/implementations/napari-js/napari-visualizer.service.d.ts +5 -0
- package/lib/implementations/napari-js/spatial-tiles/categorical-lookup.d.ts +6 -1
- package/lib/implementations/napari-js/spatial-tiles/transcript-hover.d.ts +4 -0
- package/lib/implementations/napari-js/spatial-tiles/transcript-layers.d.ts +3 -1
- package/lib/routing-visualizer.service.d.ts +1 -0
- package/lib/spatial/lod.d.ts +3 -1
- package/lib/spatial/spatial-controls.facade.d.ts +19 -2
- package/lib/spatial/spatial-gene-filter.d.ts +44 -0
- package/lib/spatial/spatial-selection.d.ts +16 -1
- package/lib/spatial/spatial-tile-merge.d.ts +17 -0
- package/lib/spatial-controls/spatial-controls.component.d.ts +14 -3
- package/lib/spatial-controls/spatial-gene-style/spatial-gene-style.component.d.ts +30 -0
- package/lib/spatial-controls/spatial-gene-tree/spatial-gene-tree.component.d.ts +39 -7
- package/lib/spatial-controls/spatial-observations-panel/spatial-observations-panel.component.d.ts +33 -1
- package/lib/spatial-controls/spatial-transcripts-panel/spatial-transcripts-panel.component.d.ts +13 -1
- package/lib/store/region-selection.d.ts +14 -3
- package/lib/store/region-store.service.d.ts +14 -1
- package/lib/store/spatial-selection.service.d.ts +8 -0
- package/lib/store/visualizer-store.service.d.ts +13 -0
- package/package.json +1 -1
- package/fesm2022/jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-DnPlIP2F.mjs.map +0 -1
|
@@ -7,4 +7,4 @@ import { InjectionToken } from '@angular/core';
|
|
|
7
7
|
* the routing/fallback implementation can change without touching constructors.
|
|
8
8
|
*/
|
|
9
9
|
export const VISUALIZER = new InjectionToken('VISUALIZER');
|
|
10
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmlzdWFsaXplci5jb250cmFjdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvY29udHJhY3RzL3Zpc3VhbGl6ZXIuY29udHJhY3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQXdyQi9DOzs7Ozs7R0FNRztBQUNILE1BQU0sQ0FBQyxNQUFNLFVBQVUsR0FBRyxJQUFJLGNBQWMsQ0FBYyxZQUFZLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGlvblRva2VuIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgdHlwZSB7IFNlY3Rpb25BeGlzLCBTZWN0aW9uVmlld3MgfSBmcm9tICcuL3NlY3Rpb24tdmlldy5jb250cmFjdCc7XG5pbXBvcnQgeyBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBJbWFnZSB9IGZyb20gJ2ltYWdlLWpzJztcblxuaW1wb3J0IHsgSUltYWdlSW5mbywgSUltYWdlTWV0YWRhdGEgfSBmcm9tICcuL2ltYWdlLmNvbnRyYWN0JztcbmltcG9ydCB7IFBvbHlnb24sIFJlZ2lvbiB9IGZyb20gJy4uL21vZGVscy9yZWdpb24nO1xuaW1wb3J0IHsgUGxvdFR5cGUsIFBsb3RUeXBlRGVzY3JpcHRvciB9IGZyb20gJy4vcGxvdC10eXBlJztcbmltcG9ydCB7IFZpZXdlckNhcGFiaWxpdGllcyB9IGZyb20gJy4vY2FwYWJpbGl0aWVzLmNvbnRyYWN0JztcbmltcG9ydCB7IElSZWdpb25PdmVybGF5IH0gZnJvbSAnLi9yZWdpb24tb3ZlcmxheS5jb250cmFjdCc7XG5pbXBvcnQgeyBJSGlzdG9ncmFtIH0gZnJvbSAnLi9jaGFubmVsLWhpc3RvZ3JhbS1hcGkuY29udHJhY3QnO1xuaW1wb3J0IHtcbiAgQ2FudmFzVG9vbE9wdGlvbnMsXG4gIENvbG9ybWFwTm9kZSxcbiAgSVdhbmRPcHRpb25zLFxuICBJQnJ1c2hPcHRpb25zLFxuICBTcGF0aWFsVmlld1N0YXRlLFxuICBTcGF0aWFsQ29sb3JCeSxcbn0gZnJvbSAnLi9kaXNwbGF5LXR5cGVzJztcbmltcG9ydCB7XG4gIENhdGVnb3JpY2FsQ29sdW1uTWV0YSxcbiAgU3BhdGlhbERhdGFzZXQsXG4gIFNwYXRpYWxFbWJlZGRpbmcsXG4gIFNwYXRpYWxNYXJrZXJHZW5lcyxcbiAgU3BhdGlhbFNlbGVjdGlvbk1hc2ssXG4gIFNwYXRpYWxUcmFuc2NyaXB0Q291bnRzLFxufSBmcm9tICcuL3NwYXRpYWwtZGF0YXNldC5jb250cmFjdCc7XG5pbXBvcnQgdHlwZSB7IFBsb3RNb2RlVmlld3BvcnQgfSBmcm9tICcuL3Bsb3QtdHlwZS1jb250cmlidXRpb24uY29udHJhY3QnO1xuXG4vKipcbiAqIEJhY2tlbmQtbmV1dHJhbCB2aXN1YWxpemF0aW9uIGNvbnRyYWN0LiBQbG90bHkgaXMgb25lIGltcGxlbWVudGF0aW9uO1xuICogT3BlblNlYWRyYWdvbiBpcyBhbm90aGVyIChmb3IgdGhlIGltYWdlIHBsb3QgdHlwZSkuIFRoZSBhYnN0cmFjdGlvbiByZW5kZXJzXG4gKiBkYXRhIOKAlCBhIHJhc3RlciBpbWFnZSBPUiBhIHNjaWVudGlmaWMgcGxvdCAoaGVhdG1hcCwgc3VyZmFjZSwgY29udG91cixcbiAqIHNjYXR0ZXIsIGxpbmUsIGlzb3N1cmZhY2UpIOKAlCBkcmF3cyByZWdpb25zIG9uIGl0LCBhbmQgZHJpdmVzIG9uLWNhbnZhcyB0b29scy5cbiAqXG4gKiBTcGxpdCBpbnRvIHJvbGUgaW50ZXJmYWNlcyBzbyBhIGNvbnN1bWVyIGNhbiBkZXBlbmQgb25seSBvbiB0aGUgc2xpY2UgaXRcbiAqIHVzZXMsIHRoZW4gY29tcG9zZWQgaW50byBgSVZpc3VhbGl6ZXJgLlxuICovXG5cbi8qKiBQaXhlbCByZWFkYmFjayBzaGFwZSByZXR1cm5lZCBieSBgZ2V0RGlzcGxheWVkUGl4ZWxEYXRhYC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGl4ZWxEYXRhIHtcbiAgd2lkdGg6IG51bWJlcjtcbiAgaGVpZ2h0OiBudW1iZXI7XG4gIGNoYW5uZWxzOiBudW1iZXI7XG4gIGRhdGE6IFVpbnQ4Q2xhbXBlZEFycmF5O1xufVxuXG4vKiogSW50ZW5zaXR5IHNhbXBsZWQgYWxvbmcgYSBsaW5lIFJPSSAoUGxvdFR5cGUuTElORSBvdmVyIGltYWdlIGRhdGEpLiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbnRlbnNpdHlQcm9maWxlIHtcbiAgLyoqIERpc3RhbmNlIGFsb25nIHRoZSBsaW5lLiBJbiBtaWNyb25zIHdoZW4gdGhlIGltYWdlIGNhcnJpZXMgYSBwaHlzaWNhbFxuICAgKiAgcGl4ZWwgc2l6ZSAobXBwKTsgb3RoZXJ3aXNlIGluIGltYWdlIHBpeGVscy4gU2VlIHtAbGluayB1bml0fS4gKi9cbiAgcG9zaXRpb25zOiBudW1iZXJbXTtcbiAgLyoqIFNhbXBsZWQgaW50ZW5zaXR5IChncmF5c2NhbGUgdmFsdWUgb3IgUkdCIGx1bWluYW5jZSkuICovXG4gIHZhbHVlczogbnVtYmVyW107XG4gIC8qKiBVbml0IG9mIHtAbGluayBwb3NpdGlvbnN9OiAnwrVtJyB3aGVuIHNjYWxlZCBieSB0aGUgaW1hZ2UncyBtcHAsIGVsc2UgJ3B4Jy4gKi9cbiAgdW5pdD86ICfCtW0nIHwgJ3B4JztcbiAgLyoqIFN0YWJsZSBpZCBvZiB0aGUgbGluZSBST0kgdGhpcyBwcm9maWxlIGNhbWUgZnJvbSAobXVsdGktbGluZSBzdXBwb3J0KS4gKi9cbiAgaWQ/OiBudW1iZXI7XG4gIC8qKiBDb2xvdXIgb2YgdGhlIGxpbmUgUk9JIOKAlCB0aGUgaW5zZXQgdHJhY2UgaXMgZHJhd24gaW4gdGhlIHNhbWUgY29sb3VyLiAqL1xuICBjb2xvcj86IHN0cmluZztcbn1cblxuLyoqXG4gKiBXaGF0IGBJRGF0YVJlbmRlcmVyLmxvYWQoKWAgcmVzb2x2ZXMgdG8uIEJhY2tlbmQtc3BlY2lmaWMgYmV5b25kIGBmaWxlbmFtZWAsXG4gKiB3aGljaCBuYW1lcyB0aGUgaW1hZ2UgdGhlIGhhbmRsZSB3YXMgbG9hZGVkIGZvcjogdGhlIGhvc3QgY29tcGFyZXMgaXQgd2l0aCB0aGVcbiAqIGltYWdlIGl0IGFza2VkIGZvciwgdG8gZHJvcCBhIGhhbmRsZSBhIG5ld2VyIHJlcXVlc3QgaGFzIG92ZXJ0YWtlbi4gUGFzcyB0aGVcbiAqIGhhbmRsZSBvbiB0byBgcGxvdCgpYCB1bmNoYW5nZWQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTG9hZGVkSW1hZ2Uge1xuICByZWFkb25seSBmaWxlbmFtZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIFRoZSByZW5kZXIvdmlld3BvcnQgcm9sZTogbG9hZCBkYXRhLCByZW5kZXIgaXQgKGltYWdlIG9yIHBsb3QpLCBhbmQgaGFuZGxlXG4gKiB6b29tLCBzdGFjayBuYXZpZ2F0aW9uLCBhbmQgcGl4ZWwgcmVhZGJhY2suXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSURhdGFSZW5kZXJlciB7XG4gIC8qKiBGZXRjaCB3aGF0IHtAbGluayBwbG90fSBuZWVkcyBmb3IgdGhpcyBpbWFnZS9zbGljZS4gYHNpZ25hbGAgYWJvcnRzIHdoZW4gdGhlXG4gICAqICBob3N0IG5vIGxvbmdlciB3YW50cyB0aGUgcmVzdWx0IChhIG5ld2VyIGltYWdlLCBDYW5jZWwsIHRlYXJkb3duKTsgYSBiYWNrZW5kXG4gICAqICBtYXkgc3RvcCBpdHMgbmV0d29yayB3b3JrIHRoZW4uIE9wdGlvbmFsLCBhbmQgaWdub3JlZCBieSBiYWNrZW5kcyB0aGF0IGRvXG4gICAqICBub3Qgc3VwcG9ydCBpdCB5ZXQuICovXG4gIGxvYWQoaW1hZ2VJbmZvOiBJSW1hZ2VJbmZvLCB6SW5kZXg6IG51bWJlciwgc2lnbmFsPzogQWJvcnRTaWduYWwpOiBQcm9taXNlPExvYWRlZEltYWdlPjtcbiAgLyoqIGBpbWFnZUxvYWRlZGAgaXMgdGhlIHtAbGluayBMb2FkZWRJbWFnZX0gaGFuZGxlIHJldHVybmVkIGJ5IGBsb2FkKClgIChvciBudWxsXG4gICAqICBmb3IgYSBkcmF3IHdpdGggbm8gaW1hZ2UpIOKAlCBwYXNzIGl0IHN0cmFpZ2h0IHRocm91Z2guIFJlc29sdmVzIGZhbHNlIHdoZW4gdGhlXG4gICAqICBiYWNrZW5kIGNvdWxkIG5vdCBkcmF3IChubyBwbG90IHRhcmdldCwgbm8gV2ViR1BVLCDigKYpLiAqL1xuICBwbG90KFxuICAgIHBsb3REaXY6IHN0cmluZyxcbiAgICBpbWFnZUxvYWRlZDogdW5rbm93bixcbiAgICBpbWFnZUluZm86IElJbWFnZUluZm8sXG4gICAgc2NyZWVuSGVpZ2h0OiBudW1iZXIsXG4gICAgcGxvdFR5cGU6IFBsb3RUeXBlLFxuICAgIGluUGxhY2U/OiBib29sZWFuLFxuICApOiBQcm9taXNlPGJvb2xlYW4+O1xuICAvKiogQGRlcHJlY2F0ZWQgUGxvdGx5LXNwZWNpZmljIHJlLXJlbmRlcjsgdGhlIE9TRCBiYWNrZW5kIG5vLW9wcyBpdC4gVGhlIGhvc3RcbiAgICogIHJlLWRyaXZlcyBgcGxvdCgpYCBmcm9tIGl0cyBpbWFnZSBzdHJlYW0gaW5zdGVhZC4gKi9cbiAgcmVsb2FkQW5kUGxvdCgpOiB2b2lkO1xuICByZXNldCgpOiB2b2lkO1xuICByZWxheW91dCh0cnVlSW1hZ2VTaXplPzogbnVtYmVyW10pOiB2b2lkO1xuICAvKipcbiAgICogRml0IHRoZSB3aG9sZSBpbWFnZSAob3Igc2NlbmUpIGludG8gdGhlIHZpZXcg4oCUIGV2ZXJ5IGJhY2tlbmQgZG9lczogUGxvdGx5XG4gICAqIGF1dG9yYW5nZXMgaXRzIGF4ZXMsIE9wZW5TZWFkcmFnb24gZ29lcyBob21lLCBuYXBhcmktanMgZml0cyBpdHMgY2FtZXJhLiBUaGVcbiAgICogYmFja2VuZCB0aGVuIGVtaXRzIG9uIHtAbGluayBnZXRBdXRvc2NhbGVFdmVudH0uXG4gICAqL1xuICBmaXRUb1ZpZXcoKTogdm9pZDtcbiAgLyoqIFJlc2V0IHRoZSB2aWV3IHRvIHRoZSBpbWFnZSBleHRlbnQuIFNhbWUgaW50ZW50IGFzIHtAbGluayBmaXRUb1ZpZXd9OyBrZXB0IGZvclxuICAgKiAgY2FsbGVycyBvZiB0aGUgb3JpZ2luYWwgbmFtZS4gKi9cbiAgcmVzZXRBeGVzKCk6IHZvaWQ7XG4gIC8qKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rIGZpdFRvVmlld30g4oCUIHRoZSBzYW1lIG9wZXJhdGlvbiB1bmRlciBpdHMgYmFja2VuZC1uZXV0cmFsIG5hbWUuICovXG4gIGF1dG9zY2FsZSgpOiB2b2lkO1xuICB6b29tSW4oKTogdm9pZDtcbiAgem9vbU91dCgpOiB2b2lkO1xuICBzZXREcmFnTW9kZShtb2RlOiBzdHJpbmcgfCBmYWxzZSk6IHZvaWQ7XG4gIC8qKiBAZGVwcmVjYXRlZCBVc2UgYGdldE9zZFZpZXdPcHRpb25zKCkuc2V0TmF2aWdhdG9yVmlzaWJsZSgpYCBvbiBgSVZpc3VhbGl6ZXJgLiAqL1xuICBzZXROYXZpZ2F0b3JWaXNpYmxlKHZpc2libGU6IGJvb2xlYW4pOiB2b2lkO1xuICAvKiogQGRlcHJlY2F0ZWQgVXNlIGBnZXRPc2RWaWV3T3B0aW9ucygpLnNldEltYWdlU21vb3RoaW5nRW5hYmxlZCgpYCBvbiBgSVZpc3VhbGl6ZXJgLiAqL1xuICBzZXRJbWFnZVNtb290aGluZ0VuYWJsZWQoZW5hYmxlZDogYm9vbGVhbik6IHZvaWQ7XG5cbiAgc2V0U2hvd1N0YWNrKHNob3dzdGFjazogYm9vbGVhbik6IHZvaWQ7XG4gIHNldFpJbmRleCh6SW5kZXg6IG51bWJlcik6IHZvaWQ7XG4gIHNldFN0YWNrTG9hZGluZyhzdGFja0xvYWRpbmc6IGJvb2xlYW4pOiB2b2lkO1xuICBpc1N0YWNrTG9hZGluZygpOiBPYnNlcnZhYmxlPGJvb2xlYW4+O1xuICBnZXRTdGFja0xvYWRpbmdQcm9ncmVzcygpOiBPYnNlcnZhYmxlPG51bWJlcj47XG4gIC8qKiBDYW5jZWwgYW55IGluLWZsaWdodCBtdWx0aS1mcmFtZSBsb2FkaW5nICh2b2x1bWUtYXNzZW1ibHkgLyBzdXJmYWNlIHByZWxvYWQpIHNvIGl0IHN0b3BzXG4gICAqICBmZXRjaGluZyBtb3JlIGZyYW1lcyBhbmQgY2xlYXJzIHRoZSBsb2FkaW5nIHN0YXRlLiBPcHRpb25hbCDigJQgb25seSBiYWNrZW5kcyB0aGF0IHN0cmVhbSBhXG4gICAqICB6LXN0YWNrIChuYXBhcmktanMgV2ViR1BVKSBkbyByZWFsIHdvcmsgaGVyZTsgb3RoZXJzIG5vLW9wLiAqL1xuICBjYW5jZWxMb2FkaW5nPygpOiB2b2lkO1xuXG4gIGdldFRydWVJbWFnZVNpemUoKTogeyB3aWR0aDogbnVtYmVyOyBoZWlnaHQ6IG51bWJlciB9IHwgbnVsbDtcbiAgZ2V0Q3VycmVudEltYWdlKCk6IFByb21pc2U8SW1hZ2UgfCBudWxsPjtcbiAgZ2V0RGlzcGxheWVkUGl4ZWxEYXRhKCk6IFBpeGVsRGF0YSB8IG51bGw7XG4gIC8qKlxuICAgKiBUaGUgcmVnaW9uIG9mIHRoZSBvcmlnaW5hbCwgZnVsbC1yZXNvbHV0aW9uIGltYWdlIHRoYXQgdGhlIHBpeGVscyByZXR1cm5lZFxuICAgKiBieSB7QGxpbmsgZ2V0RGlzcGxheWVkUGl4ZWxEYXRhfSBjdXJyZW50bHkgY292ZXIg4oCUIGB7IHgsIHksIHdpZHRoLCBoZWlnaHQgfWBcbiAgICogaW4gZnVsbC1pbWFnZSBwaXhlbCBjb29yZGluYXRlcy4gV2hlbiB6b29tZWQvcGFubmVkIGludG8gYSBzdWItYXJlYSB0aGlzIGlzXG4gICAqIHRoZSBjcm9wJ3Mgb3JpZ2luICsgZXh0ZW50OyB3aGVuIHpvb21lZCBvdXQvcGFubmVkIGJleW9uZCB0aGUgZWRnZXMsIHRoZVxuICAgKiByZWN0YW5nbGUgbWF5IGV4dGVuZCBvdXRzaWRlIHRoZSBpbWFnZSBib3VuZHMgKG1hdGNoaW5nIHRoZSBwaXhlbCByZWFkYmFja1xuICAgKiBjYW52YXMpLiBMZXRzIGEgY29uc3VtZXIgbWFwIGRpc3BsYXllZC1waXhlbCBjb29yZGluYXRlcyBiYWNrIHRvIHRoZSBvcmlnaW5hbFxuICAgKiBpbWFnZSB2aWEgYG9yaWdpbiArIGRpc3BsYXllZFB4ICogKGV4dGVudCAvIGRpc3BsYXllZERpbSlgLlxuICAgKlxuICAgKiBSZXR1cm5zIGBudWxsYCB3aGVuIHRoZSB2aWV3cG9ydCBpc24ndCBsYWlkIG91dCB5ZXQgb3IgdGhlIGJhY2tlbmQgY2FuJ3RcbiAgICogcmVwb3J0IGl0IOKAlCBjYWxsZXJzIHNob3VsZCB0aGVuIGZhbGwgYmFjayB0byB0aGUgZnVsbC1pbWFnZSBzY2FsZSAodHJlYXRcbiAgICogdGhlIGRpc3BsYXllZCBwaXhlbHMgYXMgYSBkb3duc2FtcGxlIG9mIHRoZSB3aG9sZSBpbWFnZSkuXG4gICAqL1xuICBnZXREaXNwbGF5ZWRTb3VyY2VSZWN0KCk6IHsgeDogbnVtYmVyOyB5OiBudW1iZXI7IHdpZHRoOiBudW1iZXI7IGhlaWdodDogbnVtYmVyIH0gfCBudWxsO1xuICBkb3dubG9hZEltYWdlKCk6IHZvaWQ7XG5cbiAgc2V0UGxvdFR5cGUocGxvdFR5cGU6IFBsb3RUeXBlKTogdm9pZDtcbiAgLyoqIEBkZXByZWNhdGVkIFVzZSBgZ2V0Vm9sdW1lUmVzb2x1dGlvbigpPy5zZXQoKWAgb24gYElWaXN1YWxpemVyYC4gKi9cbiAgc2V0UmVzb2x1dGlvblNjYWxlPyhzY2FsZTogbnVtYmVyKTogdm9pZDtcbiAgLyoqIEBkZXByZWNhdGVkIFVzZSBgZ2V0Vm9sdW1lUmVzb2x1dGlvbigpPy5nZXQoKWAgb24gYElWaXN1YWxpemVyYCAodGhpcyByZXR1cm5zIDEgd2l0aG91dCBvbmUpLiAqL1xuICBnZXRSZXNvbHV0aW9uU2NhbGU/KCk6IG51bWJlcjtcbiAgLyoqIEBkZXByZWNhdGVkIFVzZSBgZ2V0U3VyZmFjZTNkQ29udHJvbHMoKT8uc2V0U3VyZmFjZURyYWdNb2RlKClgIOKAlCAzRCBzY2VuZSBjb250cm9sc1xuICAgKiAgb25seSBleGlzdCBvbiBhIGJhY2tlbmQgdGhhdCByZW5kZXJzIDNEIHBsb3QgdHlwZXM7IHRoaXMgc2lsZW50bHkgbm8tb3BzIG9uIE9TRC4gKi9cbiAgc2V0U3VyZmFjZURyYWdNb2RlKG1vZGU6IHN0cmluZyk6IHZvaWQ7XG4gIC8qKiBAZGVwcmVjYXRlZCBVc2UgYGdldFN1cmZhY2UzZENvbnRyb2xzKClgIOKAlCBzZWUge0BsaW5rIHNldFN1cmZhY2VEcmFnTW9kZX0uICovXG4gIHJlc2V0U3VyZmFjZUNhbWVyYSgpOiB2b2lkO1xuXG4gIC8qKiBFbWl0cyB3aGVuZXZlciB0aGUgYmFja2VuZCBmaXRzIHRoZSB2aWV3ICh7QGxpbmsgZml0VG9WaWV3fSkuICovXG4gIGdldEF1dG9zY2FsZUV2ZW50KCk6IE9ic2VydmFibGU8dW5rbm93bj47XG5cbiAgLyoqIFBsb3QgdHlwZXMgdGhpcyBiYWNrZW5kIGFkdmVydGlzZXMgKGRyaXZlcyB0aGUgVUkgc2VsZWN0b3IpLiAqL1xuICBnZXRQbG90VHlwZURlc2NyaXB0b3JzKCk6IFBsb3RUeXBlRGVzY3JpcHRvcltdO1xuXG4gIC8qKiBJbnRlbnNpdHkgYWxvbmcgdGhlIGxpbmUgUk9JczsgZW1pdHMgdGhlIGZ1bGwgc2V0IGFzIGFueSBsaW5lIGlzIGFkZGVkLFxuICAgKiAgbW92ZWQsIG9yIHJlbW92ZWQgKFBsb3RUeXBlLkxJTkUpLiBPbmUgZW50cnkgcGVyIGxpbmUgUk9JLiAqL1xuICBnZXRJbnRlbnNpdHlQcm9maWxlJCgpOiBPYnNlcnZhYmxlPEludGVuc2l0eVByb2ZpbGVbXT47XG5cbiAgLyoqIFJlbmRlciB0aGUgZmxvYXRpbmcgaW50ZW5zaXR5LXByb2ZpbGUgaW5zZXQgY2hhcnQgaW50byBgZGl2SWRgIGZyb20gdGhlXG4gICAqICBnaXZlbiBwcm9maWxlcyAob25lIHRyYWNlIHBlciBsaW5lIFJPSSwgY29sb3VyZWQgdG8gbWF0Y2ggaXRzIGxpbmUpLlxuICAgKiAgT3duZWQgYnkgdGhlIGJhY2tlbmQgc28gY29uc3VtZXJzIG5ldmVyIHJlYWNoIGEgY2hhcnRpbmcgbGlicmFyeSBkaXJlY3RseS4gKi9cbiAgcmVuZGVySW50ZW5zaXR5SW5zZXQoZGl2SWQ6IHN0cmluZywgcHJvZmlsZXM6IEludGVuc2l0eVByb2ZpbGVbXSk6IHZvaWQ7XG59XG5cbi8qKiBSZWdpb24vc2hhcGUgc3RhdGU6IENSVUQsIHNlbGVjdGlvbiwgY2xhc3NpZmljYXRpb24gY29sb3VycywgR2VvSlNPTiBJL08uICovXG5leHBvcnQgaW50ZXJmYWNlIElSZWdpb25TdG9yZSB7XG4gIHNldFJlZ2lvbnMoXG4gICAgcmVnaW9uczogUmVnaW9uW10sXG4gICAgc2hvd1JlZ2lvbkxhYmVsPzogYm9vbGVhbixcbiAgICBpc1JlZ2lvblNhdmVPbj86IGJvb2xlYW4sXG4gICAgZmlsbENvbG9yPzogc3RyaW5nLFxuICAgIGFwcGVuZD86IGJvb2xlYW4sXG4gICk6IHZvaWQ7XG4gIC8qKiBGcmFtZXdvcmstbmV1dHJhbCBhY2Nlc3NvciDigJQgdGhlIGNhbm9uaWNhbCB3YXkgdG8gcmVhZCBjdXJyZW50IHJlZ2lvbnMuICovXG4gIGdldFJlZ2lvbnMoKTogUmVnaW9uW107XG4gIC8qKiBUaGUgY3VycmVudCByZWdpb25zIGFzIHBvbHlnb25zIChyZWN0YW5nbGVzIGV4cGFuZGVkKSwgZm9yIHNlcnZlciByZXF1ZXN0cy4gKi9cbiAgZ2V0UmVnaW9uUG9seWdvbnMoKTogUG9seWdvbltdO1xuICAvKiogRW1pdHMgdGhlIHJlZ2lvbiBzZXQgd2hlbmV2ZXIgaXQgY2hhbmdlcy4gKi9cbiAgZ2V0UmVnaW9uVXBkYXRlRXZlbnQoKTogT2JzZXJ2YWJsZTxSZWdpb25bXT47XG5cbiAgc2V0U2VsZWN0ZWRTaGFwZUluZGljZXMoaW5kaWNlczogbnVtYmVyW10pOiB2b2lkO1xuICBnZXRTZWxlY3RlZFNoYXBlSW5kaWNlcyQoKTogT2JzZXJ2YWJsZTxudW1iZXJbXT47XG4gIC8qKiBTZWxlY3QgYSBzcGVjaWZpYyByZWdpb24gKGJ5IGlkZW50aXR5KSwgaGlnaGxpZ2h0aW5nIGl0IG9uIHdoaWNoZXZlclxuICAgKiAgYmFja2VuZCBpcyByZW5kZXJpbmcg4oCUIFBsb3RseSBzZXRzIGl0cyBhY3RpdmUtc2hhcGUgaGFuZGxlcywgT3BlblNlYWRyYWdvblxuICAgKiAgaGlnaGxpZ2h0cyB0aGUgU1ZHIGVsZW1lbnQuIE5vLW9wIGlmIHRoZSByZWdpb24gaXNuJ3QgaW4gdGhlIHN0b3JlLiAqL1xuICBzZWxlY3RSZWdpb24ocmVnaW9uOiBSZWdpb24pOiB2b2lkO1xuICBkZWxldGVBY3RpdmVTaGFwZSgpOiB2b2lkO1xuXG4gIGdldFNob3dTaGFwZUxhYmVsKCk6IGJvb2xlYW47XG4gIGdldFNoYXBlQ29sb3IoKTogc3RyaW5nO1xuICBnZXRGaWxsQ29sb3IoKTogc3RyaW5nO1xuICBnZXRDbGFzc2lmaWNhdGlvbkNvbG9ycygpOiBNYXA8c3RyaW5nLCBzdHJpbmc+O1xuICBzZXRDbGFzc2lmaWNhdGlvbkNvbG9yKGxhYmVsOiBzdHJpbmcsIGNvbG9yOiBzdHJpbmcpOiB2b2lkO1xuXG4gIC8qKiBVbmRvIHRoZSBtb3N0IHJlY2VudCByZWdpb24gYWN0aW9uIChqaXQtdWkjODUpLiBSZXN0b3JlcyB0aGUgcmVnaW9uIHNldCB0b1xuICAgKiAgdGhlIHN0YXRlIGJlZm9yZSB0aGF0IGFjdGlvbjsgdXAgdG8gYSBzbWFsbCBmaXhlZCBkZXB0aCAoMTApIGlzIHJldGFpbmVkLFxuICAgKiAgc28gaXQgY2FuIGJlIGludm9rZWQgdXAgdG8gMTAgdGltZXMgaW4gYSByb3cuIE5vLW9wIHdoZW4gbm90aGluZyBpcyBsZWZ0IHRvXG4gICAqICB1bmRvLiAqL1xuICB1bmRvKCk6IHZvaWQ7XG4gIC8qKiBSZS1hcHBseSB0aGUgbW9zdCByZWNlbnRseSB1bmRvbmUgcmVnaW9uIGFjdGlvbi4gTm8tb3Agd2hlbiB0aGVyZSdzXG4gICAqICBub3RoaW5nIHRvIHJlZG8gKGFueSBmcmVzaCByZWdpb24gYWN0aW9uIGNsZWFycyB0aGUgcmVkbyBmdXR1cmUpLiAqL1xuICByZWRvKCk6IHZvaWQ7XG4gIC8qKiBTeW5jaHJvbm91cyByZWFkIG9mIHtAbGluayBnZXRDYW5VbmRvJH0uICovXG4gIGNhblVuZG8oKTogYm9vbGVhbjtcbiAgLyoqIFN5bmNocm9ub3VzIHJlYWQgb2Yge0BsaW5rIGdldENhblJlZG8kfS4gKi9cbiAgY2FuUmVkbygpOiBib29sZWFuO1xuICAvKiogRW1pdHMgd2hldGhlciBhbiB1bmRvIHN0ZXAgaXMgY3VycmVudGx5IGF2YWlsYWJsZSDigJQgZHJpdmVzIHRoZSB0b29sYmFyXG4gICAqICBVbmRvIGJ1dHRvbidzIGVuYWJsZWQgKGdyZXllZC1vdXQpIHN0YXRlLiAqL1xuICBnZXRDYW5VbmRvJCgpOiBPYnNlcnZhYmxlPGJvb2xlYW4+O1xuICAvKiogRW1pdHMgd2hldGhlciBhIHJlZG8gc3RlcCBpcyBjdXJyZW50bHkgYXZhaWxhYmxlIOKAlCBkcml2ZXMgdGhlIHRvb2xiYXJcbiAgICogIFJlZG8gYnV0dG9uJ3MgZW5hYmxlZCAoZ3JleWVkLW91dCkgc3RhdGUuICovXG4gIGdldENhblJlZG8kKCk6IE9ic2VydmFibGU8Ym9vbGVhbj47XG4gIC8qKiBDbGVhciB0aGUgdW5kby9yZWRvIGhpc3RvcnkgKGUuZy4gb24gaW1hZ2UgbG9hZC9zd2l0Y2gpLiAqL1xuICByZXNldFVuZG9IaXN0b3J5KCk6IHZvaWQ7XG5cbiAgaW1wb3J0UmVnaW9ucyhnZW9Kc29uU3RyOiBzdHJpbmcpOiBSZWdpb25bXTtcbiAgZXhwb3J0UmVnaW9ucyhyZWdpb25zOiBSZWdpb25bXSk6IHZvaWQ7XG4gIGdldEdlb0pzb25TdHJpbmcocmVnaW9uczogUmVnaW9uW10pOiBzdHJpbmc7XG5cbiAgLyoqIEJlZ2luIGEgcGVyLXNsaWNlIHotc3RhY2sgcmVnaW9uIHNlc3Npb24gKGppdC11aSM5MykuIGBzbGljZXNgIG1hcHMgZWFjaFxuICAgKiAgemVyby1iYXNlZCBzbGljZSBpbmRleCB0byB0aGF0IHNsaWNlJ3MgcmVnaW9uczsgdGhlIHN0b3JlIHNob3dzIGBpbml0aWFsWmBcbiAgICogIGxpdmUgd2hpbGUgaG9sZGluZyB0aGUgcmVzdCwgc28gc2NydWJiaW5nIHN3YXBzIHJlZ2lvbiBzZXRzIGFuZCBlZGl0cyBvbiBhXG4gICAqICBzbGljZSBwZXJzaXN0LiBgc2F2ZUxheW91dGAgcmVjb3JkcyBob3cgdGhlIHN0YWNrIHBlcnNpc3RzIOKAlCBgY29tYmluZWRgXG4gICAqICAob25lIHotaW5kZXhlZCBnZW9qc29uLCBzaW5nbGUtZmlsZSB6LXN0YWNrKSBvciBgcGVyLXNsaWNlLWZpbGVgIChmb2xkZXJcbiAgICogIHN0YWNrKS4gU2VlIHtAbGluayBzZXREaXNwbGF5U2xpY2V9LCB7QGxpbmsgZ2V0U2xpY2VSZWdpb25zfS4gKi9cbiAgZW50ZXJTdGFja01vZGUoXG4gICAgc2xpY2VzOiBNYXA8bnVtYmVyLCBSZWdpb25bXT4sXG4gICAgaW5pdGlhbFo/OiBudW1iZXIsXG4gICAgc2F2ZUxheW91dD86ICdjb21iaW5lZCcgfCAncGVyLXNsaWNlLWZpbGUnLFxuICApOiB2b2lkO1xuICAvKiogRW5kIHRoZSBwZXItc2xpY2Ugc2Vzc2lvbiAoc2luZ2xlLXBsYW5lIGltYWdlLCBvciB0aGUgc3RhY2sgd2FzIGNsb3NlZCkuICovXG4gIGV4aXRTdGFja01vZGUoKTogdm9pZDtcbiAgLyoqIFRydWUgd2hpbGUgYSBwZXItc2xpY2Ugei1zdGFjayBzZXNzaW9uIGlzIGFjdGl2ZS4gKi9cbiAgaXNTdGFja01vZGUoKTogYm9vbGVhbjtcbiAgLyoqIEhvdyB0aGUgY3VycmVudCBzdGFjayBwZXJzaXN0cyB0byBkaXNrIChqaXQtdWkjOTMpLiAqL1xuICBnZXRTdGFja1NhdmVMYXlvdXQoKTogJ2NvbWJpbmVkJyB8ICdwZXItc2xpY2UtZmlsZSc7XG4gIC8qKiBTd2FwIHRoZSBsaXZlIHJlZ2lvbiBzZXQgdG8gc2xpY2UgYHpgIChzdGFjayBtb2RlIG9ubHkpLCBjYXB0dXJpbmcgdGhlXG4gICAqICBjdXJyZW50IHNsaWNlJ3MgZWRpdHMgZmlyc3QuIENhbGxlZCBvbiBldmVyeSBjb21taXR0ZWQgc2xpY2Ugc2NydWIuICovXG4gIHNldERpc3BsYXlTbGljZSh6OiBudW1iZXIpOiB2b2lkO1xuICAvKiogRXZlcnkgc2xpY2UncyByZWdpb25zIGZvciBzYXZlL2V4cG9ydCwgZWFjaCB0YWdnZWQgd2l0aCBpdHMgemVyby1iYXNlZFxuICAgKiAge0BsaW5rIFJlZ2lvbi56fTsgdGhlIGZsYXQgc2V0IG91dHNpZGUgc3RhY2sgbW9kZS4gKi9cbiAgZ2V0U2xpY2VSZWdpb25zKCk6IFJlZ2lvbltdO1xuICAvKiogU2xpY2VzIHRvIHdyaXRlIG9uIGEgcGVyLXNsaWNlLWZpbGUgc2F2ZSAoZm9sZGVyIHN0YWNrLCBqaXQtdWkjOTMpOiBlYWNoXG4gICAqICBzbGljZSB3aXRoIHJlZ2lvbnMsIHBsdXMgc2xpY2VzIGNsZWFyZWQgc2luY2UgbG9hZCAoZW1wdHksIHRvIG92ZXJ3cml0ZSkuXG4gICAqICBLZXllZCBieSB6ZXJvLWJhc2VkIHNsaWNlIGluZGV4OyByZWdpb25zIHRhZ2dlZCB3aXRoIHRoZWlyIHouICovXG4gIGdldFN0YWNrU2F2ZVNsaWNlcygpOiBNYXA8bnVtYmVyLCBSZWdpb25bXT47XG59XG5cbi8qKiBPbi1jYW52YXMgdG9vbCBtb2RlcyAod2FuZCwgYnJ1c2gsIHZlcnRleCBlcmFzZXIsIHpvb20tdG8tYm94LCBTQU0gcG9pbnQpLiAqL1xuZXhwb3J0IGludGVyZmFjZSBJVG9vbENvbnRyb2xsZXIge1xuICAvKipcbiAgICogQXJtIG9uZSBvbi1jYW52YXMgdG9vbCAoYENhbnZhc1Rvb2xJZGApIHdpdGggaXRzIG9wdGlvbnMg4oCUIHRoZSB3YW5kJ3NcbiAgICoge0BsaW5rIElXYW5kT3B0aW9uc30sIHRoZSBicnVzaCdzIHtAbGluayBJQnJ1c2hPcHRpb25zfSAoYHNpemVgIGlzIHRoZVxuICAgKiBtYXRyaXgtcGl4ZWwgZGlhbWV0ZXIgb2YgdGhlIHBhaW50ZWQgZGlzYyksIHRoZSBlcmFzZXIncyBgeyByYWRpdXMgfWAg4oCUXG4gICAqIGFuZCBkaXNhcm0gdGhlIG9uZSB0aGF0IHdhcyBhcm1lZC4gYG51bGxgLCBvciBhbnkgaWQgdGhhdCBpcyBub3QgYSBjYW52YXNcbiAgICogdG9vbCAoYSByZWdpb24gZHJhdyBtb2RlIHN1Y2ggYXMgYCdkcmF3cmVjdCdgLCBgJ3BhbidgKSwgZGlzYXJtcyBvbmx5LlxuICAgKiBBcm1pbmcgdGhlIGFybWVkIHRvb2wgYWdhaW4gYXBwbGllcyB0aGUgb3B0aW9ucyBhbmQga2VlcHMgaXRzIHdvcmsgaW5cbiAgICogcHJvZ3Jlc3MuXG4gICAqL1xuICBzZXRBY3RpdmVUb29sKGlkOiBzdHJpbmcgfCBudWxsLCBvcHRpb25zPzogQ2FudmFzVG9vbE9wdGlvbnMpOiB2b2lkO1xuICAvKiogQGRlcHJlY2F0ZWQgVXNlIGBzZXRBY3RpdmVUb29sKCd3YW5kJywgb3B0aW9ucylgIC8gYHNldEFjdGl2ZVRvb2wobnVsbClgLiAqL1xuICBzZXRXYW5kTW9kZShhY3RpdmU6IGJvb2xlYW4sIG9wdGlvbnM/OiBJV2FuZE9wdGlvbnMpOiB2b2lkO1xuICBzZXRXYW5kT3B0aW9ucyhvcHRpb25zOiBJV2FuZE9wdGlvbnMpOiB2b2lkO1xuICBjbGVhckFjdGl2ZVdhbmRSZWdpb24oKTogdm9pZDtcbiAgLyoqIEBkZXByZWNhdGVkIFVzZSBgc2V0QWN0aXZlVG9vbCgnYnJ1c2gnLCBvcHRpb25zKWAgLyBgc2V0QWN0aXZlVG9vbChudWxsKWAuICovXG4gIHNldEJydXNoTW9kZShhY3RpdmU6IGJvb2xlYW4sIG9wdGlvbnM/OiBJQnJ1c2hPcHRpb25zKTogdm9pZDtcbiAgc2V0QnJ1c2hPcHRpb25zKG9wdGlvbnM6IElCcnVzaE9wdGlvbnMpOiB2b2lkO1xuICAvKiogQGRlcHJlY2F0ZWQgVXNlIGBzZXRBY3RpdmVUb29sKCdlcmFzZVZlcnRleCcsIHsgcmFkaXVzIH0pYCAvIGBzZXRBY3RpdmVUb29sKG51bGwpYC4gKi9cbiAgc2V0VmVydGV4RXJhc2VyTW9kZShhY3RpdmU6IGJvb2xlYW4pOiB2b2lkO1xuICBzZXRWZXJ0ZXhFcmFzZXJSYWRpdXMocmFkaXVzOiBudW1iZXIpOiB2b2lkO1xuICAvKiogQGRlcHJlY2F0ZWQgVXNlIGBzZXRBY3RpdmVUb29sKCd6b29tVG9Cb3gnKWAgLyBgc2V0QWN0aXZlVG9vbChudWxsKWAuICovXG4gIHNldFpvb21Ub0JveE1vZGUoYWN0aXZlOiBib29sZWFuKTogdm9pZDtcbiAgLyoqIEJveC1wcm9tcHRlZCBTQU0gc2VnbWVudGF0aW9uOiBzZWdtZW50IGV2ZXJ5IHJlY3RhbmdsZSByZWdpb24gaW50byBtYXNrcy5cbiAgICogIFJldHVybnMgdGhlIG51bWJlciBvZiBtYXNrIHJlZ2lvbnMgYWRkZWQuIChqaXQtdWkjOTApICovXG4gIHNlZ21lbnRSZWN0YW5nbGVzKCk6IFByb21pc2U8bnVtYmVyPjtcbiAgLyoqIENlbGxwb3NlLW9uLWNyb3A6IGNsaWVudCBzbGlkZS1jcm9wIGVhY2ggcmVjdGFuZ2xlIGFuZCBzZWdtZW50IGNlbGxzIGluIGl0XG4gICAqICAoY2VsbHBvc2UtU0FNIHZpYSB0aGUgaG9zdCdzIENFTExfU0VHTUVOVEVSKS4gUmV0dXJucyByZWdpb25zIGFkZGVkLiAqL1xuICBzZWdtZW50UmVjdGFuZ2xlc0NlbGxwb3NlKCk6IFByb21pc2U8bnVtYmVyPjtcbiAgLyoqIENob29zZSB0aGUgcmVnaXN0ZXJlZCBTQU0gbW9kZWwgdGhlIHNlZ21lbnQgdG9vbHMgdXNlIChqaXQtdWkjOTAgUDEpLiAqL1xuICBzZXRTYW1Nb2RlbChpZDogc3RyaW5nKTogdm9pZDtcbiAgLyoqIFRvZ2dsZSB0aGUgaW50ZXJhY3RpdmUgU0FNIHBvaW50LXByb21wdCB0b29sIChjbGljayA9ICtwb2ludCwgU2hpZnQgPSAtKS5cbiAgICogIEBkZXByZWNhdGVkIFVzZSBgc2V0QWN0aXZlVG9vbCgnc2FtUG9pbnQnKWAgLyBgc2V0QWN0aXZlVG9vbChudWxsKWAuICovXG4gIHNldFNhbVBvaW50TW9kZShhY3RpdmU6IGJvb2xlYW4pOiB2b2lkO1xuICAvKiogRmluYWxpc2UgLyBkaXNjYXJkIHRoZSBpbi1wcm9ncmVzcyBTQU0gcG9pbnQgb2JqZWN0LiAqL1xuICBjb21taXRTYW1Qb2ludHMoKTogdm9pZDtcbiAgY2xlYXJTYW1Qb2ludHMoKTogdm9pZDtcbn1cblxuLyoqXG4gKiBDb250cm9scyBzcGVjaWZpYyB0byB0aGUgSVNPU1VSRkFDRSBwbG90IHR5cGUuIE9wdGlvbmFsIGFuZCBjYXBhYmlsaXR5LWdhdGVkXG4gKiAoYFZpZXdlckZlYXR1cmUuSXNvc3VyZmFjZWApOiBvbmx5IGEgYmFja2VuZCB0aGF0IHJlbmRlcnMgaXNvc3VyZmFjZXMgZXhwb3Nlc1xuICogaXQsIHZpYSBgSVZpc3VhbGl6ZXIuZ2V0SXNvc3VyZmFjZUNvbnRyb2xzKClgLiBLZXB0IG9mZiB0aGUgYWx3YXlzLW9uXG4gKiBjb250cmFjdCBzbyBjb25zdW1lcnMgbmV2ZXIgY2FsbCBhIGNvbnRyb2wgdGhhdCdzIG1lYW5pbmdsZXNzIGZvciB0aGUgY3VycmVudFxuICogcGxvdCB0eXBlIC8gYmFja2VuZC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJSXNvc3VyZmFjZUNvbnRyb2xzIHtcbiAgLyoqIExpdmUtdXBkYXRlIHRoZSBpc29zdXJmYWNlIGludGVuc2l0eSBiYW5kIFtpc29taW4sIGlzb21heF0gb3ZlciAw4oCTMjU1LiAqL1xuICBzZXRJc29SYW5nZShpc29NaW46IG51bWJlciwgaXNvTWF4OiBudW1iZXIpOiB2b2lkO1xufVxuXG4vKipcbiAqIENvbnRyb2xzIHNwZWNpZmljIHRvIHRoZSAzRCBwbG90IHR5cGVzIChTVVJGQUNFIC8gU0NBVFRFUjNEIC8gSVNPU1VSRkFDRVxuICogc2NlbmVzKS4gQ2FwYWJpbGl0eS1nYXRlZCBsaWtlIHtAbGluayBJSXNvc3VyZmFjZUNvbnRyb2xzfTogb25seSBhIGJhY2tlbmRcbiAqIHRoYXQgcmVuZGVycyAzRCBzY2VuZXMgZXhwb3NlcyBpdCwgdmlhIGBJVmlzdWFsaXplci5nZXRTdXJmYWNlM2RDb250cm9scygpYCDigJRcbiAqIHRoZSBkZXByZWNhdGVkIHRvcC1sZXZlbCBgc2V0U3VyZmFjZURyYWdNb2RlYC9gcmVzZXRTdXJmYWNlQ2FtZXJhYCBzaWxlbnRseVxuICogbm8tb3Agb24gMkQtb25seSBiYWNrZW5kcy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJU3VyZmFjZTNkQ29udHJvbHMge1xuICAvKiogU3dpdGNoIHRoZSAzRCBzY2VuZSBpbnRlcmFjdGlvbiBtb2RlIChvcmJpdCAvIHR1cm50YWJsZSAvIHBhbiAvIHpvb20pLiAqL1xuICBzZXRTdXJmYWNlRHJhZ01vZGUobW9kZTogc3RyaW5nKTogdm9pZDtcbiAgLyoqIFJlc2V0IHRoZSAzRCBzY2VuZSBjYW1lcmEgdG8gaXRzIGRlZmF1bHQgZXllIHBvc2l0aW9uLiAqL1xuICByZXNldFN1cmZhY2VDYW1lcmEoKTogdm9pZDtcbiAgLyoqIFRvZ2dsZSB0aGUgM0QgY29vcmRpbmF0ZS1heGVzIC8gc2NhbGUgZ2l6bW8gb24vb2ZmLiBPcHRpb25hbCDigJQgb25seSB0aGUgbmFwYXJpLWpzIFdlYkdQVVxuICAgKiAgdm9sdW1lL2lzb3N1cmZhY2UgYmFja2VuZCByZW5kZXJzIG9uZSAoaml0LXVpIzEwMikuICovXG4gIHNldEF4ZXNWaXNpYmxlPyh2aXNpYmxlOiBib29sZWFuKTogdm9pZDtcbiAgLyoqIFdoZXRoZXIgdGhlIGF4ZXMgZ2l6bW8gaXMgY3VycmVudGx5IHNob3duIChmb3IgaW5pdGlhbGl6aW5nIHRoZSB0b2dnbGUgVUkpLiBPcHRpb25hbC4gKi9cbiAgYXhlc1Zpc2libGU/KCk6IGJvb2xlYW47XG4gIC8qKiBSZW5kZXIgdGhlIHN1cmZhY2UgYXMgYSB3aXJlZnJhbWUgKGVkZ2VzKSBpbnN0ZWFkIG9mIGEgZmlsbGVkIHN1cmZhY2UuIE9wdGlvbmFsIOKAlCBvbmx5IHRoZVxuICAgKiAgbmFwYXJpLWpzIFdlYkdQVSBzdXJmYWNlIGJhY2tlbmQgc3VwcG9ydHMgaXQgKGppdC11aSMxMDIpLiAqL1xuICBzZXRXaXJlZnJhbWU/KG9uOiBib29sZWFuKTogdm9pZDtcbiAgLyoqIFdoZXRoZXIgdGhlIHN1cmZhY2UgaXMgY3VycmVudGx5IGRyYXduIGFzIGEgd2lyZWZyYW1lIChmb3IgaW5pdGlhbGl6aW5nIHRoZSB0b2dnbGUgVUkpLiAqL1xuICB3aXJlZnJhbWU/KCk6IGJvb2xlYW47XG59XG5cbi8qKlxuICogQ29udHJvbHMgc3BlY2lmaWMgdG8gdGhlIExJTkUgKGludGVuc2l0eS1wcm9maWxlKSBwbG90IHR5cGUuIENhcGFiaWxpdHktZ2F0ZWRcbiAqIGxpa2Uge0BsaW5rIElJc29zdXJmYWNlQ29udHJvbHN9OiBvbmx5IGEgYmFja2VuZCB0aGF0IHJlbmRlcnMgdGhlIGxpbmUtUk9JIC9cbiAqIGluc2V0IGV4cG9zZXMgaXQsIHZpYSBgSVZpc3VhbGl6ZXIuZ2V0SW50ZW5zaXR5Q29udHJvbHMoKWAuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSUludGVuc2l0eUNvbnRyb2xzIHtcbiAgLyoqIEFkZCBhbm90aGVyIGxpbmUgUk9JIChuZXh0IGJyaWdodCBwYWxldHRlIGNvbG91cikgYW5kIGl0cyBpbnNldCB0cmFjZS5cbiAgICogIFJldHVybnMgdGhlIGNyZWF0ZWQgcmVnaW9uIHNvIHRoZSBjYWxsZXIgY2FuIHNlbGVjdCBpdCBvbiB0aGUgYWN0aXZlXG4gICAqICBiYWNrZW5kLCBvciBudWxsIGlmIG5vIGltYWdlIGV4dGVudCBpcyBrbm93biB5ZXQuICovXG4gIGFkZFByb2ZpbGVMaW5lKCk6IFJlZ2lvbiB8IG51bGw7XG59XG5cbi8qKiBBIGNhdGVnb3JpY2FsIGNvbHVtbiByZXNvbHZlZCBmb3IgY2hhcnRpbmc6IGxhYmVscywgY29kZXMgYW5kIG1hcCBjb2xvdXJzLiAqL1xuZXhwb3J0IGludGVyZmFjZSBTcGF0aWFsQ2F0ZWdvcmljYWxWaWV3IHtcbiAgbmFtZTogc3RyaW5nO1xuICBjYXRlZ29yaWVzOiBzdHJpbmdbXTtcbiAgLyoqIGAjcnJnZ2JiYCBwZXIgY2F0ZWdvcnksIGluZGV4LWFsaWduZWQgd2l0aCB7QGxpbmsgY2F0ZWdvcmllc30uICovXG4gIGNvbG9yczogc3RyaW5nW107XG4gIC8qKiBQZXItb2JzZXJ2YXRpb24gY2F0ZWdvcnkgaW5kZXgsIG9yIGBOT19DQVRFR09SWWAuICovXG4gIGNvZGVzOiBVaW50MTZBcnJheTtcbn1cblxuLyoqXG4gKiBDb250cm9scyBmb3IgdGhlIFNQQVRJQUxfT01JQ1MgcGxvdCB0eXBlOiB3aGF0IHRoZSBvYnNlcnZhdGlvbiBtYXJrZXJzIGFyZVxuICogY29sb3VyZWQgYnksIGFuZCBob3cgdGhleSBhcmUgZHJhd24uIENhcGFiaWxpdHktZ2F0ZWQgbGlrZVxuICoge0BsaW5rIElJc29zdXJmYWNlQ29udHJvbHN9IOKAlCBgZ2V0U3BhdGlhbENvbnRyb2xzKClgIHJldHVybnMgbnVsbCB1bmxlc3MgYVxuICogaG9zdCBoYXMgYm91bmQgYFNQQVRJQUxfREFUQV9QT1JUYC5cbiAqXG4gKiBUaGUgdmlldyBzdGF0ZSBpcyBiYWNrZW5kLW5ldXRyYWwgKGl0IGxpdmVzIGluIHRoZSBzaGFyZWQgc3RvcmUsIGxpa2UgdGhlXG4gKiBjb2xvcm1hcCksIHNvIHRoZXNlIGNvbnRyb2xzIHdvcmsgd2hpY2hldmVyIGJhY2tlbmQgaXMgb24gc2NyZWVuLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIElTcGF0aWFsQ29udHJvbHMge1xuICAvKiogVGhlIGRhdGFzZXQgYmVpbmcgdmlzdWFsaXplZCwgb3IgbnVsbC4gRHJpdmVzIHRoZSBjb2x1bW4vZ2VuZSBwaWNrZXJzIGFuZFxuICAgKiAgdGhlIGxlZ2VuZC4gKi9cbiAgZ2V0RGF0YXNldCQoKTogT2JzZXJ2YWJsZTxTcGF0aWFsRGF0YXNldCB8IG51bGw+O1xuICAvKiogQ3VycmVudCBkaXNwbGF5IHN0YXRlIChjb2xvdXIgc291cmNlLCBwb2ludCBzY2FsZSwgb3BhY2l0eSwgc2NhbGluZykuICovXG4gIGdldFZpZXdTdGF0ZSQoKTogT2JzZXJ2YWJsZTxTcGF0aWFsVmlld1N0YXRlPjtcbiAgLyoqIFN5bmNocm9ub3VzIHJlYWQsIGZvciBzZWVkaW5nIGEgY29udHJvbCdzIGluaXRpYWwgdmFsdWUuICovXG4gIHZpZXdTdGF0ZSgpOiBTcGF0aWFsVmlld1N0YXRlO1xuICAvKiogUGF0Y2ggdGhlIGRpc3BsYXkgc3RhdGU7IHRoZSBtYXJrZXJzIHJlYnVpbGQgd2l0aG91dCByZW1vdW50aW5nIHRoZSBzY2VuZS4gKi9cbiAgc2V0Vmlld1N0YXRlKHBhcnRpYWw6IFBhcnRpYWw8U3BhdGlhbFZpZXdTdGF0ZT4pOiB2b2lkO1xuICAvKiogQ29sb3VyIGJ5IGFuIGFubm90YXRpb24gY29sdW1uLiBSZWplY3RzIGZvciBhbiB1bmtub3duIGNvbHVtbi4gKi9cbiAgY29sb3JCeUNvbHVtbihuYW1lOiBzdHJpbmcpOiB2b2lkO1xuICAvKiogQ29sb3VyIGJ5IGEgZ2VuZTsgaXRzIHZlY3RvciBpcyBmZXRjaGVkIG9uIGRlbWFuZC4gKi9cbiAgY29sb3JCeUZlYXR1cmUobmFtZTogc3RyaW5nKTogdm9pZDtcbiAgLyoqIENsZWFyIHRoZSBjb2xvdXIgc291cmNlIOKAlCBldmVyeSBvYnNlcnZhdGlvbiByZW5kZXJzIGluIG9uZSBuZXV0cmFsIGNvbG91ci4gKi9cbiAgY2xlYXJDb2xvckJ5KCk6IHZvaWQ7XG4gIC8qKiBUeXBlYWhlYWQgb3ZlciBmZWF0dXJlIG5hbWVzLCBmb3IgZGF0YXNldHMgdG9vIHdpZGUgdG8gaW5saW5lIHRoZSBsaXN0LiAqL1xuICBzZWFyY2hGZWF0dXJlcyhxdWVyeTogc3RyaW5nLCBsaW1pdD86IG51bWJlcik6IFByb21pc2U8c3RyaW5nW10+O1xuICAvKiogUGVyLWNhdGVnb3J5IGRpc3BsYXkgY29sb3VycyBmb3IgYSBjYXRlZ29yaWNhbCBjb2x1bW4sIGluZGV4LWFsaWduZWQgd2l0aFxuICAgKiAgaXRzIGBjYXRlZ29yaWVzYCDigJQgdGhlIGxlZ2VuZCdzIHN3YXRjaGVzLCByZXNvbHZlZCB0aGUgc2FtZSB3YXkgdGhlXG4gICAqICByZW5kZXJlciByZXNvbHZlcyB0aGVtIHNvIHRoZSB0d28gY2Fubm90IGRpc2FncmVlLiAqL1xuICBjYXRlZ29yeUNvbG9ycyhuYW1lOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZ1tdPjtcblxuICAvLyDilIDilIAgdmFsdWVzLCBmb3IgdGhlIDEtRCBjaGFydHMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gIC8qKlxuICAgKiBUaGUgdmFsdWVzIGJlaGluZCBhIGNvbG91ciBzb3VyY2UsIGluZGV4LWFsaWduZWQgd2l0aCB0aGUgb2JzZXJ2YXRpb25zLlxuICAgKiBSZWplY3RzIGZvciBhIGNhdGVnb3JpY2FsIGNvbHVtbiDigJQgdGhlcmUgaXMgbm90aGluZyBjb250aW51b3VzIHRvIGNoYXJ0LlxuICAgKi9cbiAgY29udGludW91c1ZhbHVlcyhzb3VyY2U6IFNwYXRpYWxDb2xvckJ5KTogUHJvbWlzZTxGbG9hdDMyQXJyYXk+O1xuICAvKipcbiAgICogQSBjYXRlZ29yaWNhbCBjb2x1bW4ncyBjYXRlZ29yaWVzLCBwZXItb2JzZXJ2YXRpb24gY29kZXMgYW5kIGRpc3BsYXlcbiAgICogY29sb3VycyDigJQgZXZlcnl0aGluZyBhIGdyb3VwZWQgdmlvbGluL2JveCBuZWVkcywgd2l0aCB0aGUgY29sb3VycyByZXNvbHZlZFxuICAgKiB0aGUgc2FtZSB3YXkgdGhlIG1hcCByZXNvbHZlcyB0aGVtLlxuICAgKi9cbiAgY2F0ZWdvcmljYWxWaWV3KGNvbHVtbjogc3RyaW5nKTogUHJvbWlzZTxTcGF0aWFsQ2F0ZWdvcmljYWxWaWV3PjtcblxuICAvKipcbiAgICogT25lIGVtYmVkZGluZydzIGNvb3JkaW5hdGVzIOKAlCBhIFVNQVAsIHQtU05FIG9yIFBDQSBwbGFuZSBvdmVyIHRoZSBzYW1lIG9ic2VydmF0aW9ucy5cbiAgICpcbiAgICogT3B0aW9uYWwsIGFuZCBhYnNlbnQgd2hlbiB0aGUgZGF0YSBzb3VyY2Ugc2VydmVzIG5vbmU6IGBTcGF0aWFsRGF0YVBvcnQuZ2V0RW1iZWRkaW5nYFxuICAgKiBpcyBpdHNlbGYgb3B0aW9uYWwsIHNvIGEgcGFuZWwgbXVzdCBiZSBhYmxlIHRvIGFzayB3aGV0aGVyIHRoaXMgZXhpc3RzIHJhdGhlciB0aGFuXG4gICAqIGNhbGxpbmcgaXQgYW5kIGNhdGNoaW5nLlxuICAgKi9cbiAgZ2V0RW1iZWRkaW5nPyhuYW1lOiBzdHJpbmcpOiBQcm9taXNlPFNwYXRpYWxFbWJlZGRpbmc+O1xuICAvKiogTmFtZXMgb2YgdGhlIGNhdGVnb3JpY2FsIGNvbHVtbnMgYXZhaWxhYmxlIHRvIGdyb3VwIGJ5LiAqL1xuICBjYXRlZ29yaWNhbENvbHVtbnMoKTogc3RyaW5nW107XG4gIC8qKlxuICAgKiBJbXBvcnQgYSBjZWxsIGdyb3VwaW5nIChDU1YvVFNWIG9mIGBjZWxsX2lkYCwgYGdyb3VwYCkgYXMgYSBuZXcgY2F0ZWdvcmljYWwgY29sdW1uLlxuICAgKiBPcHRpb25hbDogb25seSBkYXRhIHNvdXJjZXMgdGhhdCBjYW4gam9pbiBjZWxsIGlkcyBpbXBsZW1lbnQgaXQuXG4gICAqL1xuICBpbXBvcnRHcm91cHM/KGxhYmVsOiBzdHJpbmcsIHRhYmxlOiBzdHJpbmcpOiBQcm9taXNlPHsgY29sdW1uOiBDYXRlZ29yaWNhbENvbHVtbk1ldGE7IG1hdGNoZWQ6IG51bWJlciB9PjtcbiAgLyoqIFRyYW5zY3JpcHQgdG90YWxzIHBlciBnZW5lIOKAlCBmb3IgdGhlIHBvaW50cyBlc3RpbWF0ZS4gT3B0aW9uYWwuICovXG4gIHRyYW5zY3JpcHRDb3VudHM/KGdlbmVzOiBzdHJpbmdbXSk6IFByb21pc2U8U3BhdGlhbFRyYW5zY3JpcHRDb3VudHM+O1xuICAvKiogTWFya2VyIGdlbmVzIG9mIGVhY2ggZ3JvdXAgb2YgYSBjYXRlZ29yaWNhbCBjb2x1bW4uIE9wdGlvbmFsIChzZWUgdGhlIHBvcnQpLiAqL1xuICBtYXJrZXJHZW5lcz8oY29sdW1uOiBzdHJpbmcsIHBlckdyb3VwPzogbnVtYmVyKTogUHJvbWlzZTxTcGF0aWFsTWFya2VyR2VuZXM+O1xuICAvKiogVHJhbnNjcmlwdHMgb2YgZWFjaCBzZWxlY3RlZCBnZW5lIGluIHRoZSBjdXJyZW50IHZpZXcsIG9yIG51bGwgd2hlbiBub3Qga25vd25cbiAgICogIChhbGwgZ2VuZXMgYXQgb25jZSwgdHJhbnNjcmlwdHMgb2ZmLCBvciBhIHNlbGVjdGlvbiB6b29tZWQgb3V0IG9uIGEgZGF0YXNldCB3aXRob3V0IHRoZVxuICAgKiAgcHlyYW1pZCdzIHBlci1nZW5lIGxldmVscywgd2hlcmUgY2x1c3RlcnMgYXJlIGRyYXduIGZyb20gc3VtbWVkIGRlbnNpdHkgZ3JpZHMpLiAqL1xuICBnZXRHZW5lQ291bnRzSW5WaWV3JD8oKTogT2JzZXJ2YWJsZTxSZWNvcmQ8c3RyaW5nLCBudW1iZXI+IHwgbnVsbD47XG4gIC8qKiBFc3RpbWF0ZWQgdHJhbnNjcmlwdHMgaW4gdmlldyBmb3IgdGhlIGN1cnJlbnQgc2VsZWN0aW9uLCBhZ2FpbnN0IHRoZSBtYXJrZXIgYnVkZ2V0LiAqL1xuICBnZXRUcmFuc2NyaXB0RXN0aW1hdGUkPygpOiBPYnNlcnZhYmxlPHsgcG9pbnRzOiBudW1iZXI7IG1heDogbnVtYmVyIH0gfCBudWxsPjtcbiAgLyoqIFRoZSBkZW5zaXR5IG1hcCdzIGNvbG91ciB3aW5kb3cgaW4gdXNlIChhdXRvLWRlcml2ZWQgb3Igc2V0KSBhbmQgaXRzIGRlbnNlc3QgYmluLiAqL1xuICBnZXREZW5zaXR5U3RhdHMkPygpOiBPYnNlcnZhYmxlPHsgbG86IG51bWJlcjsgaGk6IG51bWJlcjsgbWF4OiBudW1iZXIgfSB8IG51bGw+O1xuICAvKipcbiAgICogVGhlIHogcG9zaXRpb25zIG9mIHRoZSBzZWN0aW9ucyB0aGUgZGF0YXNldCB3YXMgaW1hZ2VkIGF0LCBhc2NlbmRpbmcg4oCUIG9yXG4gICAqIG51bGwgd2hlbiBpdHMgeiBpcyBjb250aW51b3VzIHJhdGhlciB0aGFuIHNlY3Rpb25lZCAoc28gdGhlcmUgYXJlIG5vIHNlY3Rpb25zXG4gICAqIHRvIG9mZmVyKSBvciB3aGVuIHRoZXJlIGlzIG5vIGRhdGFzZXQuXG4gICAqXG4gICAqIExldHMgYSBwYW5lbCBvZmZlciBcIm9uZSBzZWN0aW9uIGF0IGEgdGltZVwiIGZvciB0aGUgM0QgY2xvdWQgb25seSB3aGVyZSB0aGF0XG4gICAqIG1lYW5zIHNvbWV0aGluZywgYW5kIGxhYmVsIHRoZSBjaG9zZW4gb25lLiBTY2FubmVkIG9uY2UgcGVyIGRhdGFzZXQuXG4gICAqL1xuICBzYW1wbGVkU2VjdGlvbnMoKTogRmxvYXQzMkFycmF5IHwgbnVsbDtcblxuICAvLyDilIDilIAgc2VsZWN0aW9uIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICAvKiogVGhlIGN1cnJlbnQgc2VsZWN0aW9uLiBFbXB0eSBtZWFucyBcIm5vdGhpbmcgc2VsZWN0ZWRcIiwgaW4gd2hpY2ggY2FzZSB0aGVcbiAgICogIHdob2xlIHRpc3N1ZSByZW5kZXJzIG5vcm1hbGx5IHJhdGhlciB0aGFuIGV2ZXJ5dGhpbmcgYmVpbmcgbXV0ZWQuICovXG4gIGdldFNlbGVjdGlvbiQoKTogT2JzZXJ2YWJsZTxTcGF0aWFsU2VsZWN0aW9uTWFzaz47XG4gIC8qKlxuICAgKiBTZWxlY3QgZXZlcnkgb2JzZXJ2YXRpb24gaW5zaWRlIHRoZSBjdXJyZW50bHktZHJhd24gcmVnaW9ucyAodGhlaXIgdW5pb24pLlxuICAgKiBSZXVzZXMgdGhlIGV4aXN0aW5nIFJPSSB0b29scyDigJQgcmVjdGFuZ2xlLCBwb2x5Z29uLCBmcmVlaGFuZCwgd2FuZCwgYnJ1c2gg4oCUXG4gICAqIHNvIHRoZXJlIGlzIG5vIHNlcGFyYXRlIG1hcnF1ZWUgdG8gbGVhcm4uIFJldHVybnMgaG93IG1hbnkgd2VyZSBzZWxlY3RlZC5cbiAgICovXG4gIHNlbGVjdEZyb21SZWdpb25zKCk6IG51bWJlcjtcbiAgLyoqIFNlbGVjdCBldmVyeSBvYnNlcnZhdGlvbiBpbiBvbmUgY2F0ZWdvcnkgb2YgYSBjYXRlZ29yaWNhbCBjb2x1bW4g4oCUIHRoZVxuICAgKiAgbGVnZW5kIGNsaWNrLiBSZWplY3RzIGZvciBhbiB1bmtub3duIG9yIGNvbnRpbnVvdXMgY29sdW1uLiAqL1xuICBzZWxlY3RDYXRlZ29yeShjb2x1bW46IHN0cmluZywgY2F0ZWdvcnlJbmRleDogbnVtYmVyKTogUHJvbWlzZTxudW1iZXI+O1xuXG4gIC8qKlxuICAgKiBTZWxlY3QgYW4gZXhwbGljaXQgc2V0IG9mIG9ic2VydmF0aW9ucywgcmVwbGFjaW5nIGFueSBjdXJyZW50IHNlbGVjdGlvbi5cbiAgICpcbiAgICogRm9yIGEgbGlua2VkIHBsb3Q6IGxhc3NvaW5nIHBvaW50cyBpbiBhbiBlbWJlZGRpbmcgaXMgYSBzZWxlY3Rpb24gT0Ygb2JzZXJ2YXRpb25zLFxuICAgKiBhbmQgZXZlcnkgb3RoZXIgdmlldyDigJQgdGhlIG1hcCwgdGhlIGRpc3RyaWJ1dGlvbnMg4oCUIHJlYWRzIHRoZSBzYW1lIG1hc2ssIHNvIGJydXNoaW5nXG4gICAqIG9uZSBsaWdodHMgdXAgdGhlIHJlc3QuIFJldHVybnMgaG93IG1hbnkgd2VyZSBzZWxlY3RlZC5cbiAgICovXG4gIHNlbGVjdEluZGljZXMoaW5kaWNlczogSXRlcmFibGU8bnVtYmVyPik6IG51bWJlcjtcbiAgY2xlYXJTZWxlY3Rpb24oKTogdm9pZDtcbn1cblxuLyoqIERpc3BsYXkgb3B0aW9ucyAoY29sb3JtYXAvTFVULCByZXZlcnNlIHNjYWxlLCBpbWFnZSBtZXRhZGF0YSkuICovXG5leHBvcnQgaW50ZXJmYWNlIElEaXNwbGF5T3B0aW9ucyB7XG4gIGdldENvbG9ybWFwKCk6IE9ic2VydmFibGU8Q29sb3JtYXBOb2RlIHwgbnVsbD47XG4gIHNldENvbG9ybWFwKGNvbG9ybWFwOiBDb2xvcm1hcE5vZGUpOiB2b2lkO1xuICBnZXRDb2xvcm1hcE9wdGlvbnMoKTogQ29sb3JtYXBOb2RlW107XG4gIGdldFJldmVyc2VTY2FsZSgpOiBPYnNlcnZhYmxlPGJvb2xlYW4+O1xuICBzZXRSZXZlcnNlU2NhbGUocmV2ZXJzZTogYm9vbGVhbik6IHZvaWQ7XG4gIC8qKiBQdWJsaXNoIHRoZSBjdXJyZW50IGltYWdlJ3MgbWV0YWRhdGEuIGBpbWFnZUtleWAgKGl0cyBmaWxlIG5hbWUpIGxldHMgdGhlXG4gICAqICBjaGFubmVsIHN0YXRlIHN1cnZpdmUgYSByZS1wbG90IG9mIHRoZSBzYW1lIGltYWdlIGJ1dCBub3QgYSBzd2l0Y2ggdG8gYW5vdGhlci4gKi9cbiAgc2V0SW1hZ2VNZXRhKGltYWdlTWV0YTogSUltYWdlTWV0YWRhdGFbXSwgaW1hZ2VLZXk/OiBzdHJpbmcpOiB2b2lkO1xuICBnZXRJbWFnZU1ldGEoKTogT2JzZXJ2YWJsZTxJSW1hZ2VNZXRhZGF0YVtdPjtcbn1cblxuLyoqXG4gKiBUaGUgcGFydCBvZiBpbnRlbnNpdHkgc2FtcGxpbmcgYSByZW5kZXJpbmcgYmFja2VuZCBvd25zOiB3aGVyZSBpdHMgdmlldyBzZXR0bGVkLlxuICogV2hhdCBgSVZpZXdlckJhY2tlbmQuZ2V0SW50ZW5zaXR5U2FtcGxpbmcoKWAgcmV0dXJucy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJSW50ZW5zaXR5Vmlld3BvcnRTb3VyY2Uge1xuICAvKiogVmlzaWJsZS1yZWdpb24gY2hhbmdlcyAoaW1hZ2UtcGl4ZWwgY29vcmRzKSwgZW1pdHRlZCB3aGVuIHRoZSB2aWV3IHNldHRsZXMsXG4gICAqICBzbyB0aGUgaW5zZXQgY2FuIHJlLXNhbXBsZSBhdCB0aGUgY3VycmVudCB6b29tLiAqL1xuICBnZXRWaWV3cG9ydENoYW5nZSQoKTogT2JzZXJ2YWJsZTx7IHg6IG51bWJlcjsgeTogbnVtYmVyOyB3aWR0aDogbnVtYmVyOyBoZWlnaHQ6IG51bWJlciB9Pjtcbn1cblxuLyoqXG4gKiBJbnRlbnNpdHktcHJvZmlsZSBzYW1wbGluZyAodGhlIGxpbmUgUk9JcycgaW5zZXQpLCBmcm9tIGBJVmlzdWFsaXplci5nZXRJbnRlbnNpdHlTYW1wbGluZygpYC5cbiAqIFRoZSBzYW1wbGluZyBpdHNlbGYgaXMgYmFja2VuZC1uZXV0cmFsICh0aGUgbGlicmFyeSdzIEludGVuc2l0eVByb2ZpbGVTZXJ2aWNlXG4gKiBzYW1wbGVzIHdoYXRldmVyIGltYWdlIGlzIG9uIHNjcmVlbik7IHRoZSB2aWV3cG9ydC1jaGFuZ2Ugc2lnbmFsIGNvbWVzIGZyb20gdGhlXG4gKiBiYWNrZW5kIHRoYXQgZHJhd3MgdGhlIGltYWdlIChPcGVuU2VhZHJhZ29uIGFuZCBuYXBhcmktanMgcmVwb3J0IGl0OyBQbG90bHlcbiAqIHJlLXNhbXBsZXMgaXRzIGhpZ2gtZGVmIHpvb20gY3JvcHMgaW5saW5lIGluc3RlYWQpLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIElJbnRlbnNpdHlTYW1wbGluZyBleHRlbmRzIElJbnRlbnNpdHlWaWV3cG9ydFNvdXJjZSB7XG4gIC8qKiBMb2FkIHRoZSBjdXJyZW50IGltYWdlL3NsaWNlJ3MgcGl4ZWxzIHNvIHRoZSBsaW5lLVJPSSBwcm9maWxlcyBoYXZlIGRhdGFcbiAgICogIChhIGJhY2tlbmQgd2l0aCBubyBmcmFtZXMgb2YgaXRzIG93bjogT3BlblNlYWRyYWdvbiwgbmFwYXJpLWpzKS4gKi9cbiAgZW5zdXJlSW50ZW5zaXR5U2FtcGxpbmcoaW1hZ2VJbmZvOiBJSW1hZ2VJbmZvLCB6SW5kZXg6IG51bWJlcik6IFByb21pc2U8dm9pZD47XG4gIC8qKiBSZS1zYW1wbGUgdGhlIHByb2ZpbGVzIGZyb20gYSBmcmVzaCBjcm9wIG9mIHRoZSBnaXZlbiBpbWFnZS1waXhlbCBST0kgYXRcbiAgICogIGRpc3BsYXkgcmVzb2x1dGlvbi4gKi9cbiAgcmVmcmVzaEludGVuc2l0eVNhbXBsaW5nRm9yUm9pKHg6IG51bWJlciwgeTogbnVtYmVyLCB3aWR0aDogbnVtYmVyLCBoZWlnaHQ6IG51bWJlciwgekluZGV4OiBudW1iZXIpOiB2b2lkO1xufVxuXG4vKipcbiAqIFRoZSAyRCB2aWV3IG9wdGlvbnMgb2YgYSB0aWxlZCBpbWFnZSB2aWV3ZXI6IHRoZSBvdmVydmlldyBuYXZpZ2F0b3IgYW5kIGltYWdlXG4gKiBzbW9vdGhpbmcuIE9wZW5TZWFkcmFnb24ncywgbWlycm9yZWQgYnkgbmFwYXJpLWpzJ3MgMkQgdmlld3M7IFBsb3RseSBoYXMgbmVpdGhlci5cbiAqIENhcGFiaWxpdHktZ2F0ZWQ6IGBJVmlld2VyQmFja2VuZC5nZXRPc2RWaWV3T3B0aW9ucygpYCBpcyBudWxsIG9uIGEgYmFja2VuZFxuICogd2l0aG91dCB0aGVtLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIElPc2RWaWV3T3B0aW9ucyB7XG4gIC8qKiBTaG93L2hpZGUgdGhlIG92ZXJ2aWV3IG5hdmlnYXRvciAodGhlIG1pbmltYXApLiBBcHBsaWVkIHdoZW4gdGhlIHZpZXdlciBpc1xuICAgKiAgKHJlKWNyZWF0ZWQsIGFuZCB0b2dnbGVkIGxpdmUgd2hlbiBvbmUgaXMgYWxyZWFkeSBtb3VudGVkLiAqL1xuICBzZXROYXZpZ2F0b3JWaXNpYmxlKHZpc2libGU6IGJvb2xlYW4pOiB2b2lkO1xuICAvKiogSW1hZ2Ugc21vb3RoaW5nIChiaWxpbmVhciBpbnRlcnBvbGF0aW9uKS4gYGZhbHNlYCA9IG5lYXJlc3QtbmVpZ2hib3VyLCBzb1xuICAgKiAgem9vbWluZyBwYXN0IDE6MSBzaG93cyBjcmlzcCBwaXhlbCBibG9ja3MgKHBpeGVsLWxldmVsIGluc3BlY3Rpb24pLiBBcHBsaWVkXG4gICAqICBhdCB2aWV3ZXIgY3JlYXRpb24gYW5kIGxpdmUgKHdpdGggYSByZWRyYXcpIHdoZW4gb25lIGlzIG1vdW50ZWQuICovXG4gIHNldEltYWdlU21vb3RoaW5nRW5hYmxlZChlbmFibGVkOiBib29sZWFuKTogdm9pZDtcbn1cblxuLyoqXG4gKiBUaGUgM0QgZGVjaW1hdGUgZmFjdG9yIG9mIGEgdm9sdW1lIHJlbmRlcmVyIChuYXBhcmktanMgV2ViR1BVKTogMSA9IGZ1bGxcbiAqIHJlc29sdXRpb24g4oCmIDggPSDihZsgcGVyIGF4aXMuIENhcGFiaWxpdHktZ2F0ZWQ6IG51bGwgb24gYSBiYWNrZW5kIHdpdGhvdXQgb25lLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIElWb2x1bWVSZXNvbHV0aW9uIHtcbiAgLyoqIFRoZSBjdXJyZW50IGZhY3RvciAodG8gaW5pdGlhbGl6ZSB0aGUgUmVzb2x1dGlvbiBjb250cm9sKS4gKi9cbiAgZ2V0KCk6IG51bWJlcjtcbiAgLyoqIFNldCB0aGUgZmFjdG9yIChyb3VuZGVkLCBhdCBsZWFzdCAxKS4gVGFrZXMgZWZmZWN0IG9uIHRoZSBuZXh0IChyZSlsb2FkIOKAlFxuICAgKiAgdGhlIGhvc3QgcmUtcGxvdHMgYWZ0ZXIgY2FsbGluZyBpdCwgc2luY2UgaXQgY2hhbmdlcyB0aGUgZmV0Y2hlZCBkYXRhLiAqL1xuICBzZXQoc2NhbGU6IG51bWJlcik6IHZvaWQ7XG59XG5cbi8qKlxuICogVGhlIGhvc3QtZmFjaW5nIGNvbXBvc2l0ZSBjb250cmFjdCwgaW1wbGVtZW50ZWQgYnkgdGhlIHJvdXRlciAoYFZJU1VBTElaRVJgKS4gQVxuICogcmVuZGVyaW5nIGJhY2tlbmQgaW1wbGVtZW50cyB7QGxpbmsgSVZpZXdlckJhY2tlbmR9IGluc3RlYWQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSVZpc3VhbGl6ZXJcbiAgZXh0ZW5kcyBJRGF0YVJlbmRlcmVyLCBJUmVnaW9uU3RvcmUsIElUb29sQ29udHJvbGxlciwgSURpc3BsYXlPcHRpb25zLCBJSW50ZW5zaXR5U2FtcGxpbmcge1xuICByZWFkb25seSBjYXBhYmlsaXRpZXM6IFZpZXdlckNhcGFiaWxpdGllcztcbiAgLyoqIFRoaXMgYmFja2VuZCdzIHJlZ2lvbiByZW5kZXJlci4gTWF5IGJlIG51bGwgdW50aWwgYSBwbG90IGlzIG1vdW50ZWRcbiAgICogIChPcGVuU2VhZHJhZ29uKS4gRHJpdmVzIHJlZ2lvbiBkcmF3L3NlbGVjdCBtb2RlcyB1bmlmb3JtbHkuICovXG4gIGdldFJlZ2lvbk92ZXJsYXkoKTogSVJlZ2lvbk92ZXJsYXkgfCBudWxsO1xuICAvKiogU3BsaXQgYSB2b2x1bWUgdmlldzogdGhlIGRpc3BsYXllZCBzbGljZSwgd2l0aCBldmVyeSByZWdpb24gdG9vbCwgaW4gdGhlIGRpdiBgZGl2YCBiZXNpZGVcbiAgICogIHRoZSAzRCB2aWV3OyBudWxsIGNsb3NlcyBpdC4gUmVzb2x2ZXMgd2hldGhlciB0aGUgc2xpY2Ugc2hvd3MuIE9wdGlvbmFsOiB0aGUgcm91dGVyJ3MuICovXG4gIHNldFNsaWNlRWRpdG9yPyhkaXY6IHN0cmluZyB8IG51bGwpOiBQcm9taXNlPGJvb2xlYW4+O1xuICAvKiogVGhlIHNsaWNlIGVkaXRvcidzIHNlY3Rpb25zIHRocm91Z2ggeCBhbmQgeSAobnVsbHMgd2hpbGUgaXQgaXMgY2xvc2VkKS4gT3B0aW9uYWw6IHRoZSByb3V0ZXIncy4gKi9cbiAgZ2V0U2VjdGlvblZpZXdzJD8oKTogT2JzZXJ2YWJsZTxTZWN0aW9uVmlld3M+O1xuICAvKiogTW92ZSB0aGUgc2xpY2UgZWRpdG9yJ3Mgc2VjdGlvbiBwbGFuZSB0aHJvdWdoIGBheGlzYCB0byBgYXRgIChpbWFnZSBweCkuICovXG4gIHNldFNlY3Rpb25QbGFuZT8oYXhpczogU2VjdGlvbkF4aXMsIGF0OiBudW1iZXIpOiB2b2lkO1xuICAvKiogVGhlIHNsaWNlIHBpY2tlZCBieSBkcmFnZ2luZyB0aGUgeiBwbGFuZSBpbiB0aGUgdm9sdW1lICh0aGUgaG9zdCBzaG93cyBpdCkuICovXG4gIGdldFNsaWNlRHJhZyQ/KCk6IE9ic2VydmFibGU8bnVtYmVyPjtcbiAgLyoqIElzb3N1cmZhY2UgY29udHJvbHMgd2hlbiB0aGlzIGJhY2tlbmQgYWR2ZXJ0aXNlcyBgVmlld2VyRmVhdHVyZS5Jc29zdXJmYWNlYCxcbiAgICogIGVsc2UgbnVsbCDigJQgc28gY29uc3VtZXJzIGdhdGUgb24gdGhlIHJldHVybmVkIG9iamVjdCwgbm90IGEgbm8tb3AgbWV0aG9kLiAqL1xuICBnZXRJc29zdXJmYWNlQ29udHJvbHMoKTogSUlzb3N1cmZhY2VDb250cm9scyB8IG51bGw7XG4gIC8qKiBJbnRlbnNpdHkgKGxpbmUtUk9JKSBjb250cm9scyB3aGVuIHRoZSBiYWNrZW5kIHJlbmRlcnMgdGhlIExJTkUgcGxvdCB0eXBlLFxuICAgKiAgZWxzZSBudWxsLiAqL1xuICBnZXRJbnRlbnNpdHlDb250cm9scygpOiBJSW50ZW5zaXR5Q29udHJvbHMgfCBudWxsO1xuICAvKiogM0Qgc2NlbmUgY29udHJvbHMgd2hlbiB0aGlzIGJhY2tlbmQgcmVuZGVycyAzRCBwbG90IHR5cGVzLCBlbHNlIG51bGwg4oCUXG4gICAqICB0aGUgY2FwYWJpbGl0eS1nYXRlZCByZXBsYWNlbWVudCBmb3IgdGhlIGRlcHJlY2F0ZWQgdG9wLWxldmVsXG4gICAqICBgc2V0U3VyZmFjZURyYWdNb2RlYC9gcmVzZXRTdXJmYWNlQ2FtZXJhYC4gKi9cbiAgZ2V0U3VyZmFjZTNkQ29udHJvbHMoKTogSVN1cmZhY2UzZENvbnRyb2xzIHwgbnVsbDtcbiAgLyoqIFRoZSBuYXZpZ2F0b3IgLyBpbWFnZS1zbW9vdGhpbmcgb3B0aW9ucy4gTmV2ZXIgbnVsbCBvbiB0aGUgcm91dGVyOiBhIHNldHRpbmdcbiAgICogIGFwcGxpZXMgdG8gZXZlcnkgYmFja2VuZCB0aGF0IGhhcyB0aGVtIChPcGVuU2VhZHJhZ29uLCBuYXBhcmktanMpLCBzbyBpdCBjYW5cbiAgICogIGJlIHNldCBiZWZvcmUgdGhlIGZpcnN0IHJlbmRlciBhbmQgc3Vydml2ZXMgYSBiYWNrZW5kIHN3aXRjaC4gKi9cbiAgZ2V0T3NkVmlld09wdGlvbnMoKTogSU9zZFZpZXdPcHRpb25zO1xuICAvKiogVGhlIDNEIGRlY2ltYXRlIGZhY3RvciBvZiB0aGUgYmFja2VuZCBvbiBzY3JlZW4sIG9yIG51bGwgd2hlbiBpdCBoYXMgbm9uZVxuICAgKiAgKG9ubHkgbmFwYXJpLWpzIHJlbmRlcnMgdm9sdW1lcykuICovXG4gIGdldFZvbHVtZVJlc29sdXRpb24oKTogSVZvbHVtZVJlc29sdXRpb24gfCBudWxsO1xuICAvKiogSW50ZW5zaXR5LXByb2ZpbGUgc2FtcGxpbmcsIHdoaWNoZXZlciBiYWNrZW5kIGlzIG9uIHNjcmVlbi4gKi9cbiAgZ2V0SW50ZW5zaXR5U2FtcGxpbmcoKTogSUludGVuc2l0eVNhbXBsaW5nO1xuICAvKiogQGRlcHJlY2F0ZWQgVXNlIGBnZXRJbnRlbnNpdHlTYW1wbGluZygpLmVuc3VyZUludGVuc2l0eVNhbXBsaW5nKClgLiAqL1xuICBlbnN1cmVJbnRlbnNpdHlTYW1wbGluZyhpbWFnZUluZm86IElJbWFnZUluZm8sIHpJbmRleDogbnVtYmVyKTogUHJvbWlzZTx2b2lkPjtcbiAgLyoqIEBkZXByZWNhdGVkIFVzZSBgZ2V0SW50ZW5zaXR5U2FtcGxpbmcoKS5yZWZyZXNoSW50ZW5zaXR5U2FtcGxpbmdGb3JSb2koKWAuICovXG4gIHJlZnJlc2hJbnRlbnNpdHlTYW1wbGluZ0ZvclJvaSh4OiBudW1iZXIsIHk6IG51bWJlciwgd2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIsIHpJbmRleDogbnVtYmVyKTogdm9pZDtcbiAgLyoqIEBkZXByZWNhdGVkIFVzZSBgZ2V0SW50ZW5zaXR5U2FtcGxpbmcoKS5nZXRWaWV3cG9ydENoYW5nZSQoKWAuICovXG4gIGdldFZpZXdwb3J0Q2hhbmdlJCgpOiBPYnNlcnZhYmxlPHsgeDogbnVtYmVyOyB5OiBudW1iZXI7IHdpZHRoOiBudW1iZXI7IGhlaWdodDogbnVtYmVyIH0+O1xuICAvKiogU3BhdGlhbC1vbWljcyBjb250cm9scyB3aGVuIGEgYFNQQVRJQUxfREFUQV9QT1JUYCBpcyBib3VuZCwgZWxzZSBudWxsLlxuICAgKiAgT3B0aW9uYWw6IG9ubHkgdGhlIHJvdXRpbmcgc2VydmljZSBpbXBsZW1lbnRzIGl0LCBzaW5jZSB0aGUgc3RhdGUgaXMgc2hhcmVkXG4gICAqICByYXRoZXIgdGhhbiBvd25lZCBieSBhbnkgb25lIGJhY2tlbmQuICovXG4gIGdldFNwYXRpYWxDb250cm9scz8oKTogSVNwYXRpYWxDb250cm9scyB8IG51bGw7XG4gIC8qKiBUaGUgdmlld3BvcnQgYSBjb250cmlidXRlZCBwbG90IG1vZGUgZHJhd3Mgb3Zlciwgd2hlbiB0aGUgYmFja2VuZCBvblxuICAgKiAgc2NyZWVuIGNhbiBwcm92aWRlIG9uZSAoT3BlblNlYWRyYWdvbiksIGVsc2UgbnVsbC4gT3B0aW9uYWw6IGJhY2tlbmRzIHRoYXRcbiAgICogIG5vIGNvbnRyaWJ1dGVkIG1vZGUgcmlkZXMgb24gbmVlZCBub3QgaW1wbGVtZW50IGl0LiAqL1xuICBnZXRQbG90TW9kZVZpZXdwb3J0PygpOiBQbG90TW9kZVZpZXdwb3J0IHwgbnVsbDtcbiAgLyoqIEJpbm5lZCBpbnRlbnNpdHkgaGlzdG9ncmFtIGZvciBhIGNoYW5uZWwgZnJvbSB0aGUgY3VycmVudGx5LWRpc3BsYXllZFxuICAgKiAgcGl4ZWxzLCBvciBudWxsIHdoZW4gbm9uZSBhcmUgYXZhaWxhYmxlLiBGZWVkcyB0aGUgQ2hhbm5lbHMgJiBIaXN0b2dyYW1cbiAgICogIHBhbmUuICovXG4gIGdldEhpc3RvZ3JhbShjaGFubmVsSW5kZXg6IG51bWJlciwgYmluczogbnVtYmVyKTogSUhpc3RvZ3JhbSB8IG51bGw7XG4gIC8qKiBBc3luYyBoaXN0b2dyYW0gc3RyZWFtIOKAlCBuYXRpdmUgYml0IGRlcHRoIGZvciA+OC1iaXQgaW1hZ2VzIChzZXJ2ZXIpLCBlbHNlXG4gICAqICB0aGUgOC1iaXQgY2xpZW50IGhpc3RvZ3JhbS4gKi9cbiAgZ2V0SGlzdG9ncmFtJChjaGFubmVsSW5kZXg6IG51bWJlciwgYmluczogbnVtYmVyKTogT2JzZXJ2YWJsZTxJSGlzdG9ncmFtIHwgbnVsbD47XG4gIC8qKiBFeHBvcnQgdGhlIGRpc3BsYXllZCBpbWFnZSwgY29tcG9zaXRlZCB3aXRoIHRoZSBjdXJyZW50IGRpc3BsYXkgc2V0dGluZ3MsXG4gICAqICBhcyBhIHB1YmxpY2F0aW9uLXJlYWR5IFBORyBkb3dubG9hZC4gKi9cbiAgZXhwb3J0Q29tcG9zaXRlKCk6IHZvaWQ7XG4gIC8qKiBFeHBvcnQgdGhlIHVuZGVybHlpbmcgaW1hZ2UgZGF0YSBhcyBhIGRhdGEtcHJlc2VydmluZyBtdWx0aS1iYW5kIFRJRkZcbiAgICogIChuYXRpdmUgYml0IGRlcHRoKS4gTm8tb3Agb24gYmFja2VuZHMgdGhhdCBjYW4ndCBwcm92aWRlIGl0LiAqL1xuICBleHBvcnREYXRhKCk6IHZvaWQ7XG4gIC8qKlxuICAgKiBUaGUgdmlldyBpcyBnb2luZyBhd2F5ICh0aGUgYDx2aXN1YWxpemVyPmAgaXMgZGVzdHJveWVkKTogZHJvcCB3aGF0IGlzIGJvdW5kIHRvXG4gICAqIGl0IOKAlCB0aGUgb24tc2NyZWVuIHZpZXdlciwgaXRzIHJlbmRlciBsb29wIGFuZCB2aWV3IHN1YnNjcmlwdGlvbnMg4oCUIHNvIG5vdGhpbmdcbiAgICogb3V0bGl2ZXMgdGhlIHZpZXcuIFNlcnZpY2UtbGlmZXRpbWUgc3RhdGUgKHN0b3JlcywgdGhlIGJhY2tlbmRzJyBvd24gc3RvcmVcbiAgICogc3Vic2NyaXB0aW9ucykgaXMgdW50b3VjaGVkLCBzbyBhIGxhdGVyIHZpZXcgb24gdGhlIHNhbWUgY2hhaW4gcmVuZGVycyBub3JtYWxseS5cbiAgICovXG4gIGRldGFjaCgpOiB2b2lkO1xuICAvKiogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayBkZXRhY2h9LCB3aGljaCB0aGlzIGRlbGVnYXRlcyB0by4gKi9cbiAgdW5zdWJzY3JpYmUoKTogdm9pZDtcbn1cblxuLyoqXG4gKiBXaGF0IGEgcmVuZGVyaW5nIGJhY2tlbmQgaW1wbGVtZW50cyAoUGxvdGx5LCBPcGVuU2VhZHJhZ29uLCBuYXBhcmktanMpOiByZW5kZXJpbmcsXG4gKiB0aGUgdmlld3BvcnQsIHBpeGVsIHJlYWRiYWNrLCBleHBvcnQsIGxvYWRpbmcgc3RhdGUgYW5kIGl0cyBvbi1jYW52YXMgdG9vbHMsIHBsdXNcbiAqIGNhcGFiaWxpdHktZ2F0ZWQgZ2V0dGVycyBmb3Igd2hhdCBvbmx5IHNvbWUgYmFja2VuZHMgaGF2ZS5cbiAqXG4gKiBJdCBpcyB0aGUgYmFja2VuZC1mYWNpbmcgaGFsZiBvZiB7QGxpbmsgSVZpc3VhbGl6ZXJ9LiBSZWdpb24gYW5kIGRpc3BsYXkgc3RhdGUgYXJlXG4gKiBub3QgaGVyZTogdGhleSBsaXZlIGluIHRoZSBzaGFyZWQgYFJlZ2lvblN0b3JlYCAvIGBWaXN1YWxpemVyU3RvcmVgLCB3aGljaCB0aGUgcm91dGVyXG4gKiBzZXJ2ZXMgdG8gaG9zdHMgZGlyZWN0bHk7IGEgYmFja2VuZCBkcmF3cyB0aGVtIGJ5IHN1YnNjcmliaW5nIHRvIHRoZSBzdG9yZXMnIGV2ZW50cy5cbiAqIEhvc3RzIGtlZXAgZGVwZW5kaW5nIG9uIGBJVmlzdWFsaXplcmAgKHRoZSByb3V0ZXIncyBjb21wb3NpdGUpLCBuZXZlciBvbiBhIGJhY2tlbmQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSVZpZXdlckJhY2tlbmQgZXh0ZW5kcyBJVG9vbENvbnRyb2xsZXIge1xuICByZWFkb25seSBjYXBhYmlsaXRpZXM6IFZpZXdlckNhcGFiaWxpdGllcztcblxuICAvLyDilIDilIAgcmVuZGVyIGxpZmVjeWNsZSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgbG9hZChpbWFnZUluZm86IElJbWFnZUluZm8sIHpJbmRleDogbnVtYmVyLCBzaWduYWw/OiBBYm9ydFNpZ25hbCk6IFByb21pc2U8TG9hZGVkSW1hZ2U+O1xuICBwbG90KFxuICAgIHBsb3REaXY6IHN0cmluZyxcbiAgICBpbWFnZUxvYWRlZDogdW5rbm93bixcbiAgICBpbWFnZUluZm86IElJbWFnZUluZm8sXG4gICAgc2NyZWVuSGVpZ2h0OiBudW1iZXIsXG4gICAgcGxvdFR5cGU6IFBsb3RUeXBlLFxuICAgIGluUGxhY2U/OiBib29sZWFuLFxuICApOiBQcm9taXNlPGJvb2xlYW4+O1xuICByZXNldCgpOiB2b2lkO1xuICByZWxheW91dCh0cnVlSW1hZ2VTaXplPzogbnVtYmVyW10pOiB2b2lkO1xuICAvKiogVGhlIHZpZXcgaXMgZ29pbmcgYXdheTogcmVsZWFzZSB3aGF0IGlzIGJvdW5kIHRvIGl0LiAqL1xuICBkZXRhY2goKTogdm9pZDtcbiAgLyoqIFN0b3Agc3RyZWFtaW5nIGZyYW1lcyAodm9sdW1lIGFzc2VtYmx5IC8gc3VyZmFjZSBwcmVsb2FkKS4gT3B0aW9uYWw6IG9ubHlcbiAgICogIGJhY2tlbmRzIHRoYXQgc3RyZWFtIGEgei1zdGFjayBkbyB3b3JrIGhlcmUuICovXG4gIGNhbmNlbExvYWRpbmc/KCk6IHZvaWQ7XG5cbiAgLy8g4pSA4pSAIHZpZXdwb3J0IOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICB6b29tSW4oKTogdm9pZDtcbiAgem9vbU91dCgpOiB2b2lkO1xuICBzZXREcmFnTW9kZShtb2RlOiBzdHJpbmcgfCBmYWxzZSk6IHZvaWQ7XG4gIGZpdFRvVmlldygpOiB2b2lkO1xuICAvKiogQHNlZSBJRGF0YVJlbmRlcmVyLnJlc2V0QXhlcyAqL1xuICByZXNldEF4ZXMoKTogdm9pZDtcbiAgc2V0WkluZGV4KHpJbmRleDogbnVtYmVyKTogdm9pZDtcbiAgc2V0U2hvd1N0YWNrKHNob3dzdGFjazogYm9vbGVhbik6IHZvaWQ7XG4gIC8qKiBFbWl0cyB3aGVuZXZlciB0aGUgYmFja2VuZCBmaXRzIHRoZSB2aWV3LiAqL1xuICBnZXRBdXRvc2NhbGVFdmVudCgpOiBPYnNlcnZhYmxlPHVua25vd24+O1xuICBpc1N0YWNrTG9hZGluZygpOiBPYnNlcnZhYmxlPGJvb2xlYW4+O1xuICBnZXRTdGFja0xvYWRpbmdQcm9ncmVzcygpOiBPYnNlcnZhYmxlPG51bWJlcj47XG5cbiAgLy8g4pSA4pSAIHBpeGVscywgaGlzdG9ncmFtLCBleHBvcnQg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gIGdldFRydWVJbWFnZVNpemUoKTogeyB3aWR0aDogbnVtYmVyOyBoZWlnaHQ6IG51bWJlciB9IHwgbnVsbDtcbiAgZ2V0Q3VycmVudEltYWdlKCk6IFByb21pc2U8SW1hZ2UgfCBudWxsPjtcbiAgZ2V0RGlzcGxheWVkUGl4ZWxEYXRhKCk6IFBpeGVsRGF0YSB8IG51bGw7XG4gIGdldERpc3BsYXllZFNvdXJjZVJlY3QoKTogeyB4OiBudW1iZXI7IHk6IG51bWJlcjsgd2lkdGg6IG51bWJlcjsgaGVpZ2h0OiBudW1iZXIgfSB8IG51bGw7XG4gIGdldEhpc3RvZ3JhbShjaGFubmVsSW5kZXg6IG51bWJlciwgYmluczogbnVtYmVyKTogSUhpc3RvZ3JhbSB8IG51bGw7XG4gIGdldEhpc3RvZ3JhbSQoY2hhbm5lbEluZGV4OiBudW1iZXIsIGJpbnM6IG51bWJlcik6IE9ic2VydmFibGU8SUhpc3RvZ3JhbSB8IG51bGw+O1xuICBkb3dubG9hZEltYWdlKCk6IHZvaWQ7XG4gIGV4cG9ydENvbXBvc2l0ZSgpOiB2b2lkO1xuICBleHBvcnREYXRhKCk6IHZvaWQ7XG5cbiAgLy8g4pSA4pSAIGNhcGFiaWxpdHktZ2F0ZWQgc3VyZmFjZXMgKG51bGwgLyBhYnNlbnQgd2hlcmUgdGhlIGJhY2tlbmQgbGFja3MgdGhlIGZlYXR1cmUpIOKUgOKUgFxuICBnZXRSZWdpb25PdmVybGF5KCk6IElSZWdpb25PdmVybGF5IHwgbnVsbDtcbiAgZ2V0SXNvc3VyZmFjZUNvbnRyb2xzKCk6IElJc29zdXJmYWNlQ29udHJvbHMgfCBudWxsO1xuICBnZXRTdXJmYWNlM2RDb250cm9scygpOiBJU3VyZmFjZTNkQ29udHJvbHMgfCBudWxsO1xuICBnZXRJbnRlbnNpdHlDb250cm9scygpOiBJSW50ZW5zaXR5Q29udHJvbHMgfCBudWxsO1xuICBnZXRQbG90TW9kZVZpZXdwb3J0PygpOiBQbG90TW9kZVZpZXdwb3J0IHwgbnVsbDtcbiAgLyoqIE5hdmlnYXRvciAvIGltYWdlIHNtb290aGluZywgb3IgbnVsbCB3aGVuIHRoZSBiYWNrZW5kIGhhcyBuZWl0aGVyIChQbG90bHkpLiAqL1xuICBnZXRPc2RWaWV3T3B0aW9ucygpOiBJT3NkVmlld09wdGlvbnMgfCBudWxsO1xuICAvKiogVGhlIDNEIGRlY2ltYXRlIGZhY3Rvciwgb3IgbnVsbCB3aGVuIHRoZSBiYWNrZW5kIHJlbmRlcnMgbm8gdm9sdW1lcy4gKi9cbiAgZ2V0Vm9sdW1lUmVzb2x1dGlvbigpOiBJVm9sdW1lUmVzb2x1dGlvbiB8IG51bGw7XG4gIC8qKiBXaGVyZSB0aGUgdmlldyBzZXR0bGVkLCBmb3IgdGhlIGludGVuc2l0eSBpbnNldCdzIHJlLXNhbXBsaW5nOyBudWxsIHdoZW4gdGhlXG4gICAqICBiYWNrZW5kIHJlLXNhbXBsZXMgb24gaXRzIG93biAoUGxvdGx5J3MgaGlnaC1kZWYgem9vbSkuIFRoZSBzYW1wbGluZyBpdHNlbGYgaXNcbiAgICogIHRoZSByb3V0ZXIncyAoSW50ZW5zaXR5UHJvZmlsZVNlcnZpY2UpLiAqL1xuICBnZXRJbnRlbnNpdHlTYW1wbGluZygpOiBJSW50ZW5zaXR5Vmlld3BvcnRTb3VyY2UgfCBudWxsO1xufVxuXG4vKipcbiAqIFdoYXQgYSBtb3VudGVkIGA8dmlzdWFsaXplcj5gIGhhbmRzIGl0cyBob3N0IHRocm91Z2hcbiAqIGBJbWFnZVN0YXRlUG9ydC5zZXREaWFncmFtKClgIOKAlCBhIHNtYWxsLCB0eXBlZCBzdXJmYWNlIHJhdGhlciB0aGFuIHRoZSBjb21wb25lbnRcbiAqIGl0c2VsZiwgd2hvc2UgZXZlcnkgcHVibGljIG1lbWJlciB3b3VsZCBvdGhlcndpc2UgYmUgZGUtZmFjdG8gQVBJLiBDbGVhcmVkXG4gKiAoYHNldERpYWdyYW0obnVsbClgKSB3aGVuIHRoZSB2aXN1YWxpemVyIGlzIGRlc3Ryb3llZC4gSG9zdHMgdGhhdCBjYW4gaW5qZWN0XG4gKiB7QGxpbmsgVklTVUFMSVpFUn0gLyBgUkVHSU9OX0VESVRPUl9BUElgIGRpcmVjdGx5IG5lZWQgbm90IHVzZSBpdCBhdCBhbGwuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVmlzdWFsaXplckhhbmRsZSB7XG4gIC8qKiBUaGUgdmlzdWFsaXplciBjaGFpbiB0aGlzIGA8dmlzdWFsaXplcj5gIHJlbmRlcnMgdGhyb3VnaC4gKi9cbiAgcmVhZG9ubHkgdmlzdWFsaXplcjogSVZpc3VhbGl6ZXI7XG4gIC8qKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rIHZpc3VhbGl6ZXJ9LiBLZXB0IGZvciBob3N0cyB0aGF0IHJlYWQgdGhlIGNvbXBvbmVudCdzXG4gICAqICBmb3JtZXIgYHBsb3RTZXJ2aWNlYCBmaWVsZCBvZmYgdGhlIHJlZ2lzdGVyZWQgb2JqZWN0LiAqL1xuICByZWFkb25seSBwbG90U2VydmljZTogSVZpc3VhbGl6ZXI7XG4gIC8qKiBXaGV0aGVyIGFueSByZWdpb24gKGFubm90YXRpb24gb3IgaW50ZW5zaXR5IGxpbmUpIGV4aXN0cyBvbiB0aGUgY3VycmVudCBpbWFnZS4gKi9cbiAgaGFzUmVnaW9ucygpOiBib29sZWFuO1xuICAvKiogVGhlIGN1cnJlbnQgcmVnaW9ucyBhcyBwb2x5Z29ucywgZm9yIGEgc2VydmVyIHJlcXVlc3QgKGNyb3AgLyBwcm9jZXNzaW5nKS4gKi9cbiAgZ2V0UmVnaW9uUG9seWdvbnMoKTogUG9seWdvbltdO1xufVxuXG4vKipcbiAqIERJIHRva2VuIGZvciB0aGUgYWN0aXZlIHZpc3VhbGl6YXRpb24gYmFja2VuZC4gQmluZCBpdCAoYHVzZUV4aXN0aW5nYCkgdG8gdGhlXG4gKiBgUm91dGluZ1Zpc3VhbGl6ZXJTZXJ2aWNlYCwgd2hpY2ggc2VsZWN0cyBQbG90bHkgdnMgT3BlblNlYWRyYWdvbiBwZXIgcGxvdFxuICogdHlwZS4gQ29uc3VtZXJzIOKAlCBpbmNsdWRpbmcgdGhpcyBsaWJyYXJ5J3Mgb3duIGBWaXN1YWxpemVyQ29tcG9uZW50YCDigJRcbiAqIGluamVjdCBgSVZpc3VhbGl6ZXJgIHRocm91Z2ggdGhpcyB0b2tlbiByYXRoZXIgdGhhbiB0aGUgY29uY3JldGUgcm91dGVyLCBzb1xuICogdGhlIHJvdXRpbmcvZmFsbGJhY2sgaW1wbGVtZW50YXRpb24gY2FuIGNoYW5nZSB3aXRob3V0IHRvdWNoaW5nIGNvbnN0cnVjdG9ycy5cbiAqL1xuZXhwb3J0IGNvbnN0IFZJU1VBTElaRVIgPSBuZXcgSW5qZWN0aW9uVG9rZW48SVZpc3VhbGl6ZXI+KCdWSVNVQUxJWkVSJyk7XG4iXX0=
|
|
10
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmlzdWFsaXplci5jb250cmFjdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvY29udHJhY3RzL3Zpc3VhbGl6ZXIuY29udHJhY3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQW10Qi9DOzs7Ozs7R0FNRztBQUNILE1BQU0sQ0FBQyxNQUFNLFVBQVUsR0FBRyxJQUFJLGNBQWMsQ0FBYyxZQUFZLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGlvblRva2VuIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgdHlwZSB7IFNlY3Rpb25BeGlzLCBTZWN0aW9uVmlld3MgfSBmcm9tICcuL3NlY3Rpb24tdmlldy5jb250cmFjdCc7XG5pbXBvcnQgeyBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBJbWFnZSB9IGZyb20gJ2ltYWdlLWpzJztcblxuaW1wb3J0IHsgSUltYWdlSW5mbywgSUltYWdlTWV0YWRhdGEgfSBmcm9tICcuL2ltYWdlLmNvbnRyYWN0JztcbmltcG9ydCB7IFBvbHlnb24sIFJlZ2lvbiB9IGZyb20gJy4uL21vZGVscy9yZWdpb24nO1xuaW1wb3J0IHsgUGxvdFR5cGUsIFBsb3RUeXBlRGVzY3JpcHRvciB9IGZyb20gJy4vcGxvdC10eXBlJztcbmltcG9ydCB7IFZpZXdlckNhcGFiaWxpdGllcyB9IGZyb20gJy4vY2FwYWJpbGl0aWVzLmNvbnRyYWN0JztcbmltcG9ydCB7IElSZWdpb25PdmVybGF5IH0gZnJvbSAnLi9yZWdpb24tb3ZlcmxheS5jb250cmFjdCc7XG5pbXBvcnQgeyBJSGlzdG9ncmFtIH0gZnJvbSAnLi9jaGFubmVsLWhpc3RvZ3JhbS1hcGkuY29udHJhY3QnO1xuaW1wb3J0IHtcbiAgQ2FudmFzVG9vbE9wdGlvbnMsXG4gIENvbG9ybWFwTm9kZSxcbiAgSVdhbmRPcHRpb25zLFxuICBJQnJ1c2hPcHRpb25zLFxuICBTcGF0aWFsVmlld1N0YXRlLFxuICBTcGF0aWFsQ29sb3JCeSxcbn0gZnJvbSAnLi9kaXNwbGF5LXR5cGVzJztcbmltcG9ydCB7XG4gIENhdGVnb3JpY2FsQ29sdW1uTWV0YSxcbiAgU3BhdGlhbERhdGFzZXQsXG4gIFNwYXRpYWxFbWJlZGRpbmcsXG4gIFNwYXRpYWxNYXJrZXJHZW5lcyxcbiAgU3BhdGlhbFNlbGVjdGlvbk1hc2ssXG4gIFNwYXRpYWxUcmFuc2NyaXB0Q291bnRzLFxufSBmcm9tICcuL3NwYXRpYWwtZGF0YXNldC5jb250cmFjdCc7XG5pbXBvcnQgdHlwZSB7IFBsb3RNb2RlVmlld3BvcnQgfSBmcm9tICcuL3Bsb3QtdHlwZS1jb250cmlidXRpb24uY29udHJhY3QnO1xuXG4vKipcbiAqIEJhY2tlbmQtbmV1dHJhbCB2aXN1YWxpemF0aW9uIGNvbnRyYWN0LiBQbG90bHkgaXMgb25lIGltcGxlbWVudGF0aW9uO1xuICogT3BlblNlYWRyYWdvbiBpcyBhbm90aGVyIChmb3IgdGhlIGltYWdlIHBsb3QgdHlwZSkuIFRoZSBhYnN0cmFjdGlvbiByZW5kZXJzXG4gKiBkYXRhIOKAlCBhIHJhc3RlciBpbWFnZSBPUiBhIHNjaWVudGlmaWMgcGxvdCAoaGVhdG1hcCwgc3VyZmFjZSwgY29udG91cixcbiAqIHNjYXR0ZXIsIGxpbmUsIGlzb3N1cmZhY2UpIOKAlCBkcmF3cyByZWdpb25zIG9uIGl0LCBhbmQgZHJpdmVzIG9uLWNhbnZhcyB0b29scy5cbiAqXG4gKiBTcGxpdCBpbnRvIHJvbGUgaW50ZXJmYWNlcyBzbyBhIGNvbnN1bWVyIGNhbiBkZXBlbmQgb25seSBvbiB0aGUgc2xpY2UgaXRcbiAqIHVzZXMsIHRoZW4gY29tcG9zZWQgaW50byBgSVZpc3VhbGl6ZXJgLlxuICovXG5cbi8qKiBQaXhlbCByZWFkYmFjayBzaGFwZSByZXR1cm5lZCBieSBgZ2V0RGlzcGxheWVkUGl4ZWxEYXRhYC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGl4ZWxEYXRhIHtcbiAgd2lkdGg6IG51bWJlcjtcbiAgaGVpZ2h0OiBudW1iZXI7XG4gIGNoYW5uZWxzOiBudW1iZXI7XG4gIGRhdGE6IFVpbnQ4Q2xhbXBlZEFycmF5O1xufVxuXG4vKiogSW50ZW5zaXR5IHNhbXBsZWQgYWxvbmcgYSBsaW5lIFJPSSAoUGxvdFR5cGUuTElORSBvdmVyIGltYWdlIGRhdGEpLiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbnRlbnNpdHlQcm9maWxlIHtcbiAgLyoqIERpc3RhbmNlIGFsb25nIHRoZSBsaW5lLiBJbiBtaWNyb25zIHdoZW4gdGhlIGltYWdlIGNhcnJpZXMgYSBwaHlzaWNhbFxuICAgKiAgcGl4ZWwgc2l6ZSAobXBwKTsgb3RoZXJ3aXNlIGluIGltYWdlIHBpeGVscy4gU2VlIHtAbGluayB1bml0fS4gKi9cbiAgcG9zaXRpb25zOiBudW1iZXJbXTtcbiAgLyoqIFNhbXBsZWQgaW50ZW5zaXR5IChncmF5c2NhbGUgdmFsdWUgb3IgUkdCIGx1bWluYW5jZSkuICovXG4gIHZhbHVlczogbnVtYmVyW107XG4gIC8qKiBVbml0IG9mIHtAbGluayBwb3NpdGlvbnN9OiAnwrVtJyB3aGVuIHNjYWxlZCBieSB0aGUgaW1hZ2UncyBtcHAsIGVsc2UgJ3B4Jy4gKi9cbiAgdW5pdD86ICfCtW0nIHwgJ3B4JztcbiAgLyoqIFN0YWJsZSBpZCBvZiB0aGUgbGluZSBST0kgdGhpcyBwcm9maWxlIGNhbWUgZnJvbSAobXVsdGktbGluZSBzdXBwb3J0KS4gKi9cbiAgaWQ/OiBudW1iZXI7XG4gIC8qKiBDb2xvdXIgb2YgdGhlIGxpbmUgUk9JIOKAlCB0aGUgaW5zZXQgdHJhY2UgaXMgZHJhd24gaW4gdGhlIHNhbWUgY29sb3VyLiAqL1xuICBjb2xvcj86IHN0cmluZztcbn1cblxuLyoqXG4gKiBXaGF0IGBJRGF0YVJlbmRlcmVyLmxvYWQoKWAgcmVzb2x2ZXMgdG8uIEJhY2tlbmQtc3BlY2lmaWMgYmV5b25kIGBmaWxlbmFtZWAsXG4gKiB3aGljaCBuYW1lcyB0aGUgaW1hZ2UgdGhlIGhhbmRsZSB3YXMgbG9hZGVkIGZvcjogdGhlIGhvc3QgY29tcGFyZXMgaXQgd2l0aCB0aGVcbiAqIGltYWdlIGl0IGFza2VkIGZvciwgdG8gZHJvcCBhIGhhbmRsZSBhIG5ld2VyIHJlcXVlc3QgaGFzIG92ZXJ0YWtlbi4gUGFzcyB0aGVcbiAqIGhhbmRsZSBvbiB0byBgcGxvdCgpYCB1bmNoYW5nZWQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTG9hZGVkSW1hZ2Uge1xuICByZWFkb25seSBmaWxlbmFtZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIFRoZSByZW5kZXIvdmlld3BvcnQgcm9sZTogbG9hZCBkYXRhLCByZW5kZXIgaXQgKGltYWdlIG9yIHBsb3QpLCBhbmQgaGFuZGxlXG4gKiB6b29tLCBzdGFjayBuYXZpZ2F0aW9uLCBhbmQgcGl4ZWwgcmVhZGJhY2suXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSURhdGFSZW5kZXJlciB7XG4gIC8qKiBGZXRjaCB3aGF0IHtAbGluayBwbG90fSBuZWVkcyBmb3IgdGhpcyBpbWFnZS9zbGljZS4gYHNpZ25hbGAgYWJvcnRzIHdoZW4gdGhlXG4gICAqICBob3N0IG5vIGxvbmdlciB3YW50cyB0aGUgcmVzdWx0IChhIG5ld2VyIGltYWdlLCBDYW5jZWwsIHRlYXJkb3duKTsgYSBiYWNrZW5kXG4gICAqICBtYXkgc3RvcCBpdHMgbmV0d29yayB3b3JrIHRoZW4uIE9wdGlvbmFsLCBhbmQgaWdub3JlZCBieSBiYWNrZW5kcyB0aGF0IGRvXG4gICAqICBub3Qgc3VwcG9ydCBpdCB5ZXQuICovXG4gIGxvYWQoaW1hZ2VJbmZvOiBJSW1hZ2VJbmZvLCB6SW5kZXg6IG51bWJlciwgc2lnbmFsPzogQWJvcnRTaWduYWwpOiBQcm9taXNlPExvYWRlZEltYWdlPjtcbiAgLyoqIGBpbWFnZUxvYWRlZGAgaXMgdGhlIHtAbGluayBMb2FkZWRJbWFnZX0gaGFuZGxlIHJldHVybmVkIGJ5IGBsb2FkKClgIChvciBudWxsXG4gICAqICBmb3IgYSBkcmF3IHdpdGggbm8gaW1hZ2UpIOKAlCBwYXNzIGl0IHN0cmFpZ2h0IHRocm91Z2guIFJlc29sdmVzIGZhbHNlIHdoZW4gdGhlXG4gICAqICBiYWNrZW5kIGNvdWxkIG5vdCBkcmF3IChubyBwbG90IHRhcmdldCwgbm8gV2ViR1BVLCDigKYpLiAqL1xuICBwbG90KFxuICAgIHBsb3REaXY6IHN0cmluZyxcbiAgICBpbWFnZUxvYWRlZDogdW5rbm93bixcbiAgICBpbWFnZUluZm86IElJbWFnZUluZm8sXG4gICAgc2NyZWVuSGVpZ2h0OiBudW1iZXIsXG4gICAgcGxvdFR5cGU6IFBsb3RUeXBlLFxuICAgIGluUGxhY2U/OiBib29sZWFuLFxuICApOiBQcm9taXNlPGJvb2xlYW4+O1xuICAvKiogQGRlcHJlY2F0ZWQgUGxvdGx5LXNwZWNpZmljIHJlLXJlbmRlcjsgdGhlIE9TRCBiYWNrZW5kIG5vLW9wcyBpdC4gVGhlIGhvc3RcbiAgICogIHJlLWRyaXZlcyBgcGxvdCgpYCBmcm9tIGl0cyBpbWFnZSBzdHJlYW0gaW5zdGVhZC4gKi9cbiAgcmVsb2FkQW5kUGxvdCgpOiB2b2lkO1xuICByZXNldCgpOiB2b2lkO1xuICByZWxheW91dCh0cnVlSW1hZ2VTaXplPzogbnVtYmVyW10pOiB2b2lkO1xuICAvKipcbiAgICogRml0IHRoZSB3aG9sZSBpbWFnZSAob3Igc2NlbmUpIGludG8gdGhlIHZpZXcg4oCUIGV2ZXJ5IGJhY2tlbmQgZG9lczogUGxvdGx5XG4gICAqIGF1dG9yYW5nZXMgaXRzIGF4ZXMsIE9wZW5TZWFkcmFnb24gZ29lcyBob21lLCBuYXBhcmktanMgZml0cyBpdHMgY2FtZXJhLiBUaGVcbiAgICogYmFja2VuZCB0aGVuIGVtaXRzIG9uIHtAbGluayBnZXRBdXRvc2NhbGVFdmVudH0uXG4gICAqL1xuICBmaXRUb1ZpZXcoKTogdm9pZDtcbiAgLyoqIFJlc2V0IHRoZSB2aWV3IHRvIHRoZSBpbWFnZSBleHRlbnQuIFNhbWUgaW50ZW50IGFzIHtAbGluayBmaXRUb1ZpZXd9OyBrZXB0IGZvclxuICAgKiAgY2FsbGVycyBvZiB0aGUgb3JpZ2luYWwgbmFtZS4gKi9cbiAgcmVzZXRBeGVzKCk6IHZvaWQ7XG4gIC8qKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rIGZpdFRvVmlld30g4oCUIHRoZSBzYW1lIG9wZXJhdGlvbiB1bmRlciBpdHMgYmFja2VuZC1uZXV0cmFsIG5hbWUuICovXG4gIGF1dG9zY2FsZSgpOiB2b2lkO1xuICB6b29tSW4oKTogdm9pZDtcbiAgem9vbU91dCgpOiB2b2lkO1xuICBzZXREcmFnTW9kZShtb2RlOiBzdHJpbmcgfCBmYWxzZSk6IHZvaWQ7XG4gIC8qKiBAZGVwcmVjYXRlZCBVc2UgYGdldE9zZFZpZXdPcHRpb25zKCkuc2V0TmF2aWdhdG9yVmlzaWJsZSgpYCBvbiBgSVZpc3VhbGl6ZXJgLiAqL1xuICBzZXROYXZpZ2F0b3JWaXNpYmxlKHZpc2libGU6IGJvb2xlYW4pOiB2b2lkO1xuICAvKiogQGRlcHJlY2F0ZWQgVXNlIGBnZXRPc2RWaWV3T3B0aW9ucygpLnNldEltYWdlU21vb3RoaW5nRW5hYmxlZCgpYCBvbiBgSVZpc3VhbGl6ZXJgLiAqL1xuICBzZXRJbWFnZVNtb290aGluZ0VuYWJsZWQoZW5hYmxlZDogYm9vbGVhbik6IHZvaWQ7XG5cbiAgc2V0U2hvd1N0YWNrKHNob3dzdGFjazogYm9vbGVhbik6IHZvaWQ7XG4gIHNldFpJbmRleCh6SW5kZXg6IG51bWJlcik6IHZvaWQ7XG4gIHNldFN0YWNrTG9hZGluZyhzdGFja0xvYWRpbmc6IGJvb2xlYW4pOiB2b2lkO1xuICBpc1N0YWNrTG9hZGluZygpOiBPYnNlcnZhYmxlPGJvb2xlYW4+O1xuICBnZXRTdGFja0xvYWRpbmdQcm9ncmVzcygpOiBPYnNlcnZhYmxlPG51bWJlcj47XG4gIC8qKiBDYW5jZWwgYW55IGluLWZsaWdodCBtdWx0aS1mcmFtZSBsb2FkaW5nICh2b2x1bWUtYXNzZW1ibHkgLyBzdXJmYWNlIHByZWxvYWQpIHNvIGl0IHN0b3BzXG4gICAqICBmZXRjaGluZyBtb3JlIGZyYW1lcyBhbmQgY2xlYXJzIHRoZSBsb2FkaW5nIHN0YXRlLiBPcHRpb25hbCDigJQgb25seSBiYWNrZW5kcyB0aGF0IHN0cmVhbSBhXG4gICAqICB6LXN0YWNrIChuYXBhcmktanMgV2ViR1BVKSBkbyByZWFsIHdvcmsgaGVyZTsgb3RoZXJzIG5vLW9wLiAqL1xuICBjYW5jZWxMb2FkaW5nPygpOiB2b2lkO1xuXG4gIGdldFRydWVJbWFnZVNpemUoKTogeyB3aWR0aDogbnVtYmVyOyBoZWlnaHQ6IG51bWJlciB9IHwgbnVsbDtcbiAgZ2V0Q3VycmVudEltYWdlKCk6IFByb21pc2U8SW1hZ2UgfCBudWxsPjtcbiAgZ2V0RGlzcGxheWVkUGl4ZWxEYXRhKCk6IFBpeGVsRGF0YSB8IG51bGw7XG4gIC8qKlxuICAgKiBUaGUgcmVnaW9uIG9mIHRoZSBvcmlnaW5hbCwgZnVsbC1yZXNvbHV0aW9uIGltYWdlIHRoYXQgdGhlIHBpeGVscyByZXR1cm5lZFxuICAgKiBieSB7QGxpbmsgZ2V0RGlzcGxheWVkUGl4ZWxEYXRhfSBjdXJyZW50bHkgY292ZXIg4oCUIGB7IHgsIHksIHdpZHRoLCBoZWlnaHQgfWBcbiAgICogaW4gZnVsbC1pbWFnZSBwaXhlbCBjb29yZGluYXRlcy4gV2hlbiB6b29tZWQvcGFubmVkIGludG8gYSBzdWItYXJlYSB0aGlzIGlzXG4gICAqIHRoZSBjcm9wJ3Mgb3JpZ2luICsgZXh0ZW50OyB3aGVuIHpvb21lZCBvdXQvcGFubmVkIGJleW9uZCB0aGUgZWRnZXMsIHRoZVxuICAgKiByZWN0YW5nbGUgbWF5IGV4dGVuZCBvdXRzaWRlIHRoZSBpbWFnZSBib3VuZHMgKG1hdGNoaW5nIHRoZSBwaXhlbCByZWFkYmFja1xuICAgKiBjYW52YXMpLiBMZXRzIGEgY29uc3VtZXIgbWFwIGRpc3BsYXllZC1waXhlbCBjb29yZGluYXRlcyBiYWNrIHRvIHRoZSBvcmlnaW5hbFxuICAgKiBpbWFnZSB2aWEgYG9yaWdpbiArIGRpc3BsYXllZFB4ICogKGV4dGVudCAvIGRpc3BsYXllZERpbSlgLlxuICAgKlxuICAgKiBSZXR1cm5zIGBudWxsYCB3aGVuIHRoZSB2aWV3cG9ydCBpc24ndCBsYWlkIG91dCB5ZXQgb3IgdGhlIGJhY2tlbmQgY2FuJ3RcbiAgICogcmVwb3J0IGl0IOKAlCBjYWxsZXJzIHNob3VsZCB0aGVuIGZhbGwgYmFjayB0byB0aGUgZnVsbC1pbWFnZSBzY2FsZSAodHJlYXRcbiAgICogdGhlIGRpc3BsYXllZCBwaXhlbHMgYXMgYSBkb3duc2FtcGxlIG9mIHRoZSB3aG9sZSBpbWFnZSkuXG4gICAqL1xuICBnZXREaXNwbGF5ZWRTb3VyY2VSZWN0KCk6IHsgeDogbnVtYmVyOyB5OiBudW1iZXI7IHdpZHRoOiBudW1iZXI7IGhlaWdodDogbnVtYmVyIH0gfCBudWxsO1xuICBkb3dubG9hZEltYWdlKCk6IHZvaWQ7XG5cbiAgc2V0UGxvdFR5cGUocGxvdFR5cGU6IFBsb3RUeXBlKTogdm9pZDtcbiAgLyoqIEBkZXByZWNhdGVkIFVzZSBgZ2V0Vm9sdW1lUmVzb2x1dGlvbigpPy5zZXQoKWAgb24gYElWaXN1YWxpemVyYC4gKi9cbiAgc2V0UmVzb2x1dGlvblNjYWxlPyhzY2FsZTogbnVtYmVyKTogdm9pZDtcbiAgLyoqIEBkZXByZWNhdGVkIFVzZSBgZ2V0Vm9sdW1lUmVzb2x1dGlvbigpPy5nZXQoKWAgb24gYElWaXN1YWxpemVyYCAodGhpcyByZXR1cm5zIDEgd2l0aG91dCBvbmUpLiAqL1xuICBnZXRSZXNvbHV0aW9uU2NhbGU/KCk6IG51bWJlcjtcbiAgLyoqIEBkZXByZWNhdGVkIFVzZSBgZ2V0U3VyZmFjZTNkQ29udHJvbHMoKT8uc2V0U3VyZmFjZURyYWdNb2RlKClgIOKAlCAzRCBzY2VuZSBjb250cm9sc1xuICAgKiAgb25seSBleGlzdCBvbiBhIGJhY2tlbmQgdGhhdCByZW5kZXJzIDNEIHBsb3QgdHlwZXM7IHRoaXMgc2lsZW50bHkgbm8tb3BzIG9uIE9TRC4gKi9cbiAgc2V0U3VyZmFjZURyYWdNb2RlKG1vZGU6IHN0cmluZyk6IHZvaWQ7XG4gIC8qKiBAZGVwcmVjYXRlZCBVc2UgYGdldFN1cmZhY2UzZENvbnRyb2xzKClgIOKAlCBzZWUge0BsaW5rIHNldFN1cmZhY2VEcmFnTW9kZX0uICovXG4gIHJlc2V0U3VyZmFjZUNhbWVyYSgpOiB2b2lkO1xuXG4gIC8qKiBFbWl0cyB3aGVuZXZlciB0aGUgYmFja2VuZCBmaXRzIHRoZSB2aWV3ICh7QGxpbmsgZml0VG9WaWV3fSkuICovXG4gIGdldEF1dG9zY2FsZUV2ZW50KCk6IE9ic2VydmFibGU8dW5rbm93bj47XG5cbiAgLyoqIFBsb3QgdHlwZXMgdGhpcyBiYWNrZW5kIGFkdmVydGlzZXMgKGRyaXZlcyB0aGUgVUkgc2VsZWN0b3IpLiAqL1xuICBnZXRQbG90VHlwZURlc2NyaXB0b3JzKCk6IFBsb3RUeXBlRGVzY3JpcHRvcltdO1xuXG4gIC8qKiBJbnRlbnNpdHkgYWxvbmcgdGhlIGxpbmUgUk9JczsgZW1pdHMgdGhlIGZ1bGwgc2V0IGFzIGFueSBsaW5lIGlzIGFkZGVkLFxuICAgKiAgbW92ZWQsIG9yIHJlbW92ZWQgKFBsb3RUeXBlLkxJTkUpLiBPbmUgZW50cnkgcGVyIGxpbmUgUk9JLiAqL1xuICBnZXRJbnRlbnNpdHlQcm9maWxlJCgpOiBPYnNlcnZhYmxlPEludGVuc2l0eVByb2ZpbGVbXT47XG5cbiAgLyoqIFJlbmRlciB0aGUgZmxvYXRpbmcgaW50ZW5zaXR5LXByb2ZpbGUgaW5zZXQgY2hhcnQgaW50byBgZGl2SWRgIGZyb20gdGhlXG4gICAqICBnaXZlbiBwcm9maWxlcyAob25lIHRyYWNlIHBlciBsaW5lIFJPSSwgY29sb3VyZWQgdG8gbWF0Y2ggaXRzIGxpbmUpLlxuICAgKiAgT3duZWQgYnkgdGhlIGJhY2tlbmQgc28gY29uc3VtZXJzIG5ldmVyIHJlYWNoIGEgY2hhcnRpbmcgbGlicmFyeSBkaXJlY3RseS4gKi9cbiAgcmVuZGVySW50ZW5zaXR5SW5zZXQoZGl2SWQ6IHN0cmluZywgcHJvZmlsZXM6IEludGVuc2l0eVByb2ZpbGVbXSk6IHZvaWQ7XG59XG5cbi8qKiBSZWdpb24vc2hhcGUgc3RhdGU6IENSVUQsIHNlbGVjdGlvbiwgY2xhc3NpZmljYXRpb24gY29sb3VycywgR2VvSlNPTiBJL08uICovXG5leHBvcnQgaW50ZXJmYWNlIElSZWdpb25TdG9yZSB7XG4gIHNldFJlZ2lvbnMoXG4gICAgcmVnaW9uczogUmVnaW9uW10sXG4gICAgc2hvd1JlZ2lvbkxhYmVsPzogYm9vbGVhbixcbiAgICBpc1JlZ2lvblNhdmVPbj86IGJvb2xlYW4sXG4gICAgZmlsbENvbG9yPzogc3RyaW5nLFxuICAgIGFwcGVuZD86IGJvb2xlYW4sXG4gICk6IHZvaWQ7XG4gIC8qKiBGcmFtZXdvcmstbmV1dHJhbCBhY2Nlc3NvciDigJQgdGhlIGNhbm9uaWNhbCB3YXkgdG8gcmVhZCBjdXJyZW50IHJlZ2lvbnMuICovXG4gIGdldFJlZ2lvbnMoKTogUmVnaW9uW107XG4gIC8qKiBUaGUgY3VycmVudCByZWdpb25zIGFzIHBvbHlnb25zIChyZWN0YW5nbGVzIGV4cGFuZGVkKSwgZm9yIHNlcnZlciByZXF1ZXN0cy4gKi9cbiAgZ2V0UmVnaW9uUG9seWdvbnMoKTogUG9seWdvbltdO1xuICAvKiogRW1pdHMgdGhlIHJlZ2lvbiBzZXQgd2hlbmV2ZXIgaXQgY2hhbmdlcy4gKi9cbiAgZ2V0UmVnaW9uVXBkYXRlRXZlbnQoKTogT2JzZXJ2YWJsZTxSZWdpb25bXT47XG5cbiAgc2V0U2VsZWN0ZWRTaGFwZUluZGljZXMoaW5kaWNlczogbnVtYmVyW10pOiB2b2lkO1xuICBnZXRTZWxlY3RlZFNoYXBlSW5kaWNlcyQoKTogT2JzZXJ2YWJsZTxudW1iZXJbXT47XG4gIC8qKiBTZWxlY3QgYSBzcGVjaWZpYyByZWdpb24gKGJ5IGlkZW50aXR5KSwgaGlnaGxpZ2h0aW5nIGl0IG9uIHdoaWNoZXZlclxuICAgKiAgYmFja2VuZCBpcyByZW5kZXJpbmcg4oCUIFBsb3RseSBzZXRzIGl0cyBhY3RpdmUtc2hhcGUgaGFuZGxlcywgT3BlblNlYWRyYWdvblxuICAgKiAgaGlnaGxpZ2h0cyB0aGUgU1ZHIGVsZW1lbnQuIE5vLW9wIGlmIHRoZSByZWdpb24gaXNuJ3QgaW4gdGhlIHN0b3JlLiAqL1xuICBzZWxlY3RSZWdpb24ocmVnaW9uOiBSZWdpb24pOiB2b2lkO1xuICBkZWxldGVBY3RpdmVTaGFwZSgpOiB2b2lkO1xuXG4gIGdldFNob3dTaGFwZUxhYmVsKCk6IGJvb2xlYW47XG4gIGdldFNoYXBlQ29sb3IoKTogc3RyaW5nO1xuICBnZXRGaWxsQ29sb3IoKTogc3RyaW5nO1xuICBnZXRDbGFzc2lmaWNhdGlvbkNvbG9ycygpOiBNYXA8c3RyaW5nLCBzdHJpbmc+O1xuICBzZXRDbGFzc2lmaWNhdGlvbkNvbG9yKGxhYmVsOiBzdHJpbmcsIGNvbG9yOiBzdHJpbmcpOiB2b2lkO1xuXG4gIC8qKiBVbmRvIHRoZSBtb3N0IHJlY2VudCByZWdpb24gYWN0aW9uIChqaXQtdWkjODUpLiBSZXN0b3JlcyB0aGUgcmVnaW9uIHNldCB0b1xuICAgKiAgdGhlIHN0YXRlIGJlZm9yZSB0aGF0IGFjdGlvbjsgdXAgdG8gYSBzbWFsbCBmaXhlZCBkZXB0aCAoMTApIGlzIHJldGFpbmVkLFxuICAgKiAgc28gaXQgY2FuIGJlIGludm9rZWQgdXAgdG8gMTAgdGltZXMgaW4gYSByb3cuIE5vLW9wIHdoZW4gbm90aGluZyBpcyBsZWZ0IHRvXG4gICAqICB1bmRvLiAqL1xuICB1bmRvKCk6IHZvaWQ7XG4gIC8qKiBSZS1hcHBseSB0aGUgbW9zdCByZWNlbnRseSB1bmRvbmUgcmVnaW9uIGFjdGlvbi4gTm8tb3Agd2hlbiB0aGVyZSdzXG4gICAqICBub3RoaW5nIHRvIHJlZG8gKGFueSBmcmVzaCByZWdpb24gYWN0aW9uIGNsZWFycyB0aGUgcmVkbyBmdXR1cmUpLiAqL1xuICByZWRvKCk6IHZvaWQ7XG4gIC8qKiBTeW5jaHJvbm91cyByZWFkIG9mIHtAbGluayBnZXRDYW5VbmRvJH0uICovXG4gIGNhblVuZG8oKTogYm9vbGVhbjtcbiAgLyoqIFN5bmNocm9ub3VzIHJlYWQgb2Yge0BsaW5rIGdldENhblJlZG8kfS4gKi9cbiAgY2FuUmVkbygpOiBib29sZWFuO1xuICAvKiogRW1pdHMgd2hldGhlciBhbiB1bmRvIHN0ZXAgaXMgY3VycmVudGx5IGF2YWlsYWJsZSDigJQgZHJpdmVzIHRoZSB0b29sYmFyXG4gICAqICBVbmRvIGJ1dHRvbidzIGVuYWJsZWQgKGdyZXllZC1vdXQpIHN0YXRlLiAqL1xuICBnZXRDYW5VbmRvJCgpOiBPYnNlcnZhYmxlPGJvb2xlYW4+O1xuICAvKiogRW1pdHMgd2hldGhlciBhIHJlZG8gc3RlcCBpcyBjdXJyZW50bHkgYXZhaWxhYmxlIOKAlCBkcml2ZXMgdGhlIHRvb2xiYXJcbiAgICogIFJlZG8gYnV0dG9uJ3MgZW5hYmxlZCAoZ3JleWVkLW91dCkgc3RhdGUuICovXG4gIGdldENhblJlZG8kKCk6IE9ic2VydmFibGU8Ym9vbGVhbj47XG4gIC8qKiBDbGVhciB0aGUgdW5kby9yZWRvIGhpc3RvcnkgKGUuZy4gb24gaW1hZ2UgbG9hZC9zd2l0Y2gpLiAqL1xuICByZXNldFVuZG9IaXN0b3J5KCk6IHZvaWQ7XG5cbiAgaW1wb3J0UmVnaW9ucyhnZW9Kc29uU3RyOiBzdHJpbmcpOiBSZWdpb25bXTtcbiAgZXhwb3J0UmVnaW9ucyhyZWdpb25zOiBSZWdpb25bXSk6IHZvaWQ7XG4gIGdldEdlb0pzb25TdHJpbmcocmVnaW9uczogUmVnaW9uW10pOiBzdHJpbmc7XG5cbiAgLyoqIEJlZ2luIGEgcGVyLXNsaWNlIHotc3RhY2sgcmVnaW9uIHNlc3Npb24gKGppdC11aSM5MykuIGBzbGljZXNgIG1hcHMgZWFjaFxuICAgKiAgemVyby1iYXNlZCBzbGljZSBpbmRleCB0byB0aGF0IHNsaWNlJ3MgcmVnaW9uczsgdGhlIHN0b3JlIHNob3dzIGBpbml0aWFsWmBcbiAgICogIGxpdmUgd2hpbGUgaG9sZGluZyB0aGUgcmVzdCwgc28gc2NydWJiaW5nIHN3YXBzIHJlZ2lvbiBzZXRzIGFuZCBlZGl0cyBvbiBhXG4gICAqICBzbGljZSBwZXJzaXN0LiBgc2F2ZUxheW91dGAgcmVjb3JkcyBob3cgdGhlIHN0YWNrIHBlcnNpc3RzIOKAlCBgY29tYmluZWRgXG4gICAqICAob25lIHotaW5kZXhlZCBnZW9qc29uLCBzaW5nbGUtZmlsZSB6LXN0YWNrKSBvciBgcGVyLXNsaWNlLWZpbGVgIChmb2xkZXJcbiAgICogIHN0YWNrKS4gU2VlIHtAbGluayBzZXREaXNwbGF5U2xpY2V9LCB7QGxpbmsgZ2V0U2xpY2VSZWdpb25zfS4gKi9cbiAgZW50ZXJTdGFja01vZGUoXG4gICAgc2xpY2VzOiBNYXA8bnVtYmVyLCBSZWdpb25bXT4sXG4gICAgaW5pdGlhbFo/OiBudW1iZXIsXG4gICAgc2F2ZUxheW91dD86ICdjb21iaW5lZCcgfCAncGVyLXNsaWNlLWZpbGUnLFxuICApOiB2b2lkO1xuICAvKiogRW5kIHRoZSBwZXItc2xpY2Ugc2Vzc2lvbiAoc2luZ2xlLXBsYW5lIGltYWdlLCBvciB0aGUgc3RhY2sgd2FzIGNsb3NlZCkuICovXG4gIGV4aXRTdGFja01vZGUoKTogdm9pZDtcbiAgLyoqIFRydWUgd2hpbGUgYSBwZXItc2xpY2Ugei1zdGFjayBzZXNzaW9uIGlzIGFjdGl2ZS4gKi9cbiAgaXNTdGFja01vZGUoKTogYm9vbGVhbjtcbiAgLyoqIEhvdyB0aGUgY3VycmVudCBzdGFjayBwZXJzaXN0cyB0byBkaXNrIChqaXQtdWkjOTMpLiAqL1xuICBnZXRTdGFja1NhdmVMYXlvdXQoKTogJ2NvbWJpbmVkJyB8ICdwZXItc2xpY2UtZmlsZSc7XG4gIC8qKiBTd2FwIHRoZSBsaXZlIHJlZ2lvbiBzZXQgdG8gc2xpY2UgYHpgIChzdGFjayBtb2RlIG9ubHkpLCBjYXB0dXJpbmcgdGhlXG4gICAqICBjdXJyZW50IHNsaWNlJ3MgZWRpdHMgZmlyc3QuIENhbGxlZCBvbiBldmVyeSBjb21taXR0ZWQgc2xpY2Ugc2NydWIuICovXG4gIHNldERpc3BsYXlTbGljZSh6OiBudW1iZXIpOiB2b2lkO1xuICAvKiogRXZlcnkgc2xpY2UncyByZWdpb25zIGZvciBzYXZlL2V4cG9ydCwgZWFjaCB0YWdnZWQgd2l0aCBpdHMgemVyby1iYXNlZFxuICAgKiAge0BsaW5rIFJlZ2lvbi56fTsgdGhlIGZsYXQgc2V0IG91dHNpZGUgc3RhY2sgbW9kZS4gKi9cbiAgZ2V0U2xpY2VSZWdpb25zKCk6IFJlZ2lvbltdO1xuICAvKiogU2xpY2VzIHRvIHdyaXRlIG9uIGEgcGVyLXNsaWNlLWZpbGUgc2F2ZSAoZm9sZGVyIHN0YWNrLCBqaXQtdWkjOTMpOiBlYWNoXG4gICAqICBzbGljZSB3aXRoIHJlZ2lvbnMsIHBsdXMgc2xpY2VzIGNsZWFyZWQgc2luY2UgbG9hZCAoZW1wdHksIHRvIG92ZXJ3cml0ZSkuXG4gICAqICBLZXllZCBieSB6ZXJvLWJhc2VkIHNsaWNlIGluZGV4OyByZWdpb25zIHRhZ2dlZCB3aXRoIHRoZWlyIHouICovXG4gIGdldFN0YWNrU2F2ZVNsaWNlcygpOiBNYXA8bnVtYmVyLCBSZWdpb25bXT47XG59XG5cbi8qKiBPbi1jYW52YXMgdG9vbCBtb2RlcyAod2FuZCwgYnJ1c2gsIHZlcnRleCBlcmFzZXIsIHpvb20tdG8tYm94LCBTQU0gcG9pbnQpLiAqL1xuZXhwb3J0IGludGVyZmFjZSBJVG9vbENvbnRyb2xsZXIge1xuICAvKipcbiAgICogQXJtIG9uZSBvbi1jYW52YXMgdG9vbCAoYENhbnZhc1Rvb2xJZGApIHdpdGggaXRzIG9wdGlvbnMg4oCUIHRoZSB3YW5kJ3NcbiAgICoge0BsaW5rIElXYW5kT3B0aW9uc30sIHRoZSBicnVzaCdzIHtAbGluayBJQnJ1c2hPcHRpb25zfSAoYHNpemVgIGlzIHRoZVxuICAgKiBtYXRyaXgtcGl4ZWwgZGlhbWV0ZXIgb2YgdGhlIHBhaW50ZWQgZGlzYyksIHRoZSBlcmFzZXIncyBgeyByYWRpdXMgfWAg4oCUXG4gICAqIGFuZCBkaXNhcm0gdGhlIG9uZSB0aGF0IHdhcyBhcm1lZC4gYG51bGxgLCBvciBhbnkgaWQgdGhhdCBpcyBub3QgYSBjYW52YXNcbiAgICogdG9vbCAoYSByZWdpb24gZHJhdyBtb2RlIHN1Y2ggYXMgYCdkcmF3cmVjdCdgLCBgJ3BhbidgKSwgZGlzYXJtcyBvbmx5LlxuICAgKiBBcm1pbmcgdGhlIGFybWVkIHRvb2wgYWdhaW4gYXBwbGllcyB0aGUgb3B0aW9ucyBhbmQga2VlcHMgaXRzIHdvcmsgaW5cbiAgICogcHJvZ3Jlc3MuXG4gICAqL1xuICBzZXRBY3RpdmVUb29sKGlkOiBzdHJpbmcgfCBudWxsLCBvcHRpb25zPzogQ2FudmFzVG9vbE9wdGlvbnMpOiB2b2lkO1xuICAvKiogQGRlcHJlY2F0ZWQgVXNlIGBzZXRBY3RpdmVUb29sKCd3YW5kJywgb3B0aW9ucylgIC8gYHNldEFjdGl2ZVRvb2wobnVsbClgLiAqL1xuICBzZXRXYW5kTW9kZShhY3RpdmU6IGJvb2xlYW4sIG9wdGlvbnM/OiBJV2FuZE9wdGlvbnMpOiB2b2lkO1xuICBzZXRXYW5kT3B0aW9ucyhvcHRpb25zOiBJV2FuZE9wdGlvbnMpOiB2b2lkO1xuICBjbGVhckFjdGl2ZVdhbmRSZWdpb24oKTogdm9pZDtcbiAgLyoqIEBkZXByZWNhdGVkIFVzZSBgc2V0QWN0aXZlVG9vbCgnYnJ1c2gnLCBvcHRpb25zKWAgLyBgc2V0QWN0aXZlVG9vbChudWxsKWAuICovXG4gIHNldEJydXNoTW9kZShhY3RpdmU6IGJvb2xlYW4sIG9wdGlvbnM/OiBJQnJ1c2hPcHRpb25zKTogdm9pZDtcbiAgc2V0QnJ1c2hPcHRpb25zKG9wdGlvbnM6IElCcnVzaE9wdGlvbnMpOiB2b2lkO1xuICAvKiogQGRlcHJlY2F0ZWQgVXNlIGBzZXRBY3RpdmVUb29sKCdlcmFzZVZlcnRleCcsIHsgcmFkaXVzIH0pYCAvIGBzZXRBY3RpdmVUb29sKG51bGwpYC4gKi9cbiAgc2V0VmVydGV4RXJhc2VyTW9kZShhY3RpdmU6IGJvb2xlYW4pOiB2b2lkO1xuICBzZXRWZXJ0ZXhFcmFzZXJSYWRpdXMocmFkaXVzOiBudW1iZXIpOiB2b2lkO1xuICAvKiogQGRlcHJlY2F0ZWQgVXNlIGBzZXRBY3RpdmVUb29sKCd6b29tVG9Cb3gnKWAgLyBgc2V0QWN0aXZlVG9vbChudWxsKWAuICovXG4gIHNldFpvb21Ub0JveE1vZGUoYWN0aXZlOiBib29sZWFuKTogdm9pZDtcbiAgLyoqIEJveC1wcm9tcHRlZCBTQU0gc2VnbWVudGF0aW9uOiBzZWdtZW50IGV2ZXJ5IHJlY3RhbmdsZSByZWdpb24gaW50byBtYXNrcy5cbiAgICogIFJldHVybnMgdGhlIG51bWJlciBvZiBtYXNrIHJlZ2lvbnMgYWRkZWQuIChqaXQtdWkjOTApICovXG4gIHNlZ21lbnRSZWN0YW5nbGVzKCk6IFByb21pc2U8bnVtYmVyPjtcbiAgLyoqIENlbGxwb3NlLW9uLWNyb3A6IGNsaWVudCBzbGlkZS1jcm9wIGVhY2ggcmVjdGFuZ2xlIGFuZCBzZWdtZW50IGNlbGxzIGluIGl0XG4gICAqICAoY2VsbHBvc2UtU0FNIHZpYSB0aGUgaG9zdCdzIENFTExfU0VHTUVOVEVSKS4gUmV0dXJucyByZWdpb25zIGFkZGVkLiAqL1xuICBzZWdtZW50UmVjdGFuZ2xlc0NlbGxwb3NlKCk6IFByb21pc2U8bnVtYmVyPjtcbiAgLyoqIENob29zZSB0aGUgcmVnaXN0ZXJlZCBTQU0gbW9kZWwgdGhlIHNlZ21lbnQgdG9vbHMgdXNlIChqaXQtdWkjOTAgUDEpLiAqL1xuICBzZXRTYW1Nb2RlbChpZDogc3RyaW5nKTogdm9pZDtcbiAgLyoqIFRvZ2dsZSB0aGUgaW50ZXJhY3RpdmUgU0FNIHBvaW50LXByb21wdCB0b29sIChjbGljayA9ICtwb2ludCwgU2hpZnQgPSAtKS5cbiAgICogIEBkZXByZWNhdGVkIFVzZSBgc2V0QWN0aXZlVG9vbCgnc2FtUG9pbnQnKWAgLyBgc2V0QWN0aXZlVG9vbChudWxsKWAuICovXG4gIHNldFNhbVBvaW50TW9kZShhY3RpdmU6IGJvb2xlYW4pOiB2b2lkO1xuICAvKiogRmluYWxpc2UgLyBkaXNjYXJkIHRoZSBpbi1wcm9ncmVzcyBTQU0gcG9pbnQgb2JqZWN0LiAqL1xuICBjb21taXRTYW1Qb2ludHMoKTogdm9pZDtcbiAgY2xlYXJTYW1Qb2ludHMoKTogdm9pZDtcbn1cblxuLyoqXG4gKiBDb250cm9scyBzcGVjaWZpYyB0byB0aGUgSVNPU1VSRkFDRSBwbG90IHR5cGUuIE9wdGlvbmFsIGFuZCBjYXBhYmlsaXR5LWdhdGVkXG4gKiAoYFZpZXdlckZlYXR1cmUuSXNvc3VyZmFjZWApOiBvbmx5IGEgYmFja2VuZCB0aGF0IHJlbmRlcnMgaXNvc3VyZmFjZXMgZXhwb3Nlc1xuICogaXQsIHZpYSBgSVZpc3VhbGl6ZXIuZ2V0SXNvc3VyZmFjZUNvbnRyb2xzKClgLiBLZXB0IG9mZiB0aGUgYWx3YXlzLW9uXG4gKiBjb250cmFjdCBzbyBjb25zdW1lcnMgbmV2ZXIgY2FsbCBhIGNvbnRyb2wgdGhhdCdzIG1lYW5pbmdsZXNzIGZvciB0aGUgY3VycmVudFxuICogcGxvdCB0eXBlIC8gYmFja2VuZC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJSXNvc3VyZmFjZUNvbnRyb2xzIHtcbiAgLyoqIExpdmUtdXBkYXRlIHRoZSBpc29zdXJmYWNlIGludGVuc2l0eSBiYW5kIFtpc29taW4sIGlzb21heF0gb3ZlciAw4oCTMjU1LiAqL1xuICBzZXRJc29SYW5nZShpc29NaW46IG51bWJlciwgaXNvTWF4OiBudW1iZXIpOiB2b2lkO1xufVxuXG4vKipcbiAqIENvbnRyb2xzIHNwZWNpZmljIHRvIHRoZSAzRCBwbG90IHR5cGVzIChTVVJGQUNFIC8gU0NBVFRFUjNEIC8gSVNPU1VSRkFDRVxuICogc2NlbmVzKS4gQ2FwYWJpbGl0eS1nYXRlZCBsaWtlIHtAbGluayBJSXNvc3VyZmFjZUNvbnRyb2xzfTogb25seSBhIGJhY2tlbmRcbiAqIHRoYXQgcmVuZGVycyAzRCBzY2VuZXMgZXhwb3NlcyBpdCwgdmlhIGBJVmlzdWFsaXplci5nZXRTdXJmYWNlM2RDb250cm9scygpYCDigJRcbiAqIHRoZSBkZXByZWNhdGVkIHRvcC1sZXZlbCBgc2V0U3VyZmFjZURyYWdNb2RlYC9gcmVzZXRTdXJmYWNlQ2FtZXJhYCBzaWxlbnRseVxuICogbm8tb3Agb24gMkQtb25seSBiYWNrZW5kcy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJU3VyZmFjZTNkQ29udHJvbHMge1xuICAvKiogU3dpdGNoIHRoZSAzRCBzY2VuZSBpbnRlcmFjdGlvbiBtb2RlIChvcmJpdCAvIHR1cm50YWJsZSAvIHBhbiAvIHpvb20pLiAqL1xuICBzZXRTdXJmYWNlRHJhZ01vZGUobW9kZTogc3RyaW5nKTogdm9pZDtcbiAgLyoqIFJlc2V0IHRoZSAzRCBzY2VuZSBjYW1lcmEgdG8gaXRzIGRlZmF1bHQgZXllIHBvc2l0aW9uLiAqL1xuICByZXNldFN1cmZhY2VDYW1lcmEoKTogdm9pZDtcbiAgLyoqIFRvZ2dsZSB0aGUgM0QgY29vcmRpbmF0ZS1heGVzIC8gc2NhbGUgZ2l6bW8gb24vb2ZmLiBPcHRpb25hbCDigJQgb25seSB0aGUgbmFwYXJpLWpzIFdlYkdQVVxuICAgKiAgdm9sdW1lL2lzb3N1cmZhY2UgYmFja2VuZCByZW5kZXJzIG9uZSAoaml0LXVpIzEwMikuICovXG4gIHNldEF4ZXNWaXNpYmxlPyh2aXNpYmxlOiBib29sZWFuKTogdm9pZDtcbiAgLyoqIFdoZXRoZXIgdGhlIGF4ZXMgZ2l6bW8gaXMgY3VycmVudGx5IHNob3duIChmb3IgaW5pdGlhbGl6aW5nIHRoZSB0b2dnbGUgVUkpLiBPcHRpb25hbC4gKi9cbiAgYXhlc1Zpc2libGU/KCk6IGJvb2xlYW47XG4gIC8qKiBSZW5kZXIgdGhlIHN1cmZhY2UgYXMgYSB3aXJlZnJhbWUgKGVkZ2VzKSBpbnN0ZWFkIG9mIGEgZmlsbGVkIHN1cmZhY2UuIE9wdGlvbmFsIOKAlCBvbmx5IHRoZVxuICAgKiAgbmFwYXJpLWpzIFdlYkdQVSBzdXJmYWNlIGJhY2tlbmQgc3VwcG9ydHMgaXQgKGppdC11aSMxMDIpLiAqL1xuICBzZXRXaXJlZnJhbWU/KG9uOiBib29sZWFuKTogdm9pZDtcbiAgLyoqIFdoZXRoZXIgdGhlIHN1cmZhY2UgaXMgY3VycmVudGx5IGRyYXduIGFzIGEgd2lyZWZyYW1lIChmb3IgaW5pdGlhbGl6aW5nIHRoZSB0b2dnbGUgVUkpLiAqL1xuICB3aXJlZnJhbWU/KCk6IGJvb2xlYW47XG59XG5cbi8qKlxuICogQ29udHJvbHMgc3BlY2lmaWMgdG8gdGhlIExJTkUgKGludGVuc2l0eS1wcm9maWxlKSBwbG90IHR5cGUuIENhcGFiaWxpdHktZ2F0ZWRcbiAqIGxpa2Uge0BsaW5rIElJc29zdXJmYWNlQ29udHJvbHN9OiBvbmx5IGEgYmFja2VuZCB0aGF0IHJlbmRlcnMgdGhlIGxpbmUtUk9JIC9cbiAqIGluc2V0IGV4cG9zZXMgaXQsIHZpYSBgSVZpc3VhbGl6ZXIuZ2V0SW50ZW5zaXR5Q29udHJvbHMoKWAuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSUludGVuc2l0eUNvbnRyb2xzIHtcbiAgLyoqIEFkZCBhbm90aGVyIGxpbmUgUk9JIChuZXh0IGJyaWdodCBwYWxldHRlIGNvbG91cikgYW5kIGl0cyBpbnNldCB0cmFjZS5cbiAgICogIFJldHVybnMgdGhlIGNyZWF0ZWQgcmVnaW9uIHNvIHRoZSBjYWxsZXIgY2FuIHNlbGVjdCBpdCBvbiB0aGUgYWN0aXZlXG4gICAqICBiYWNrZW5kLCBvciBudWxsIGlmIG5vIGltYWdlIGV4dGVudCBpcyBrbm93biB5ZXQuICovXG4gIGFkZFByb2ZpbGVMaW5lKCk6IFJlZ2lvbiB8IG51bGw7XG59XG5cbi8qKiBBIGNhdGVnb3JpY2FsIGNvbHVtbiByZXNvbHZlZCBmb3IgY2hhcnRpbmc6IGxhYmVscywgY29kZXMgYW5kIG1hcCBjb2xvdXJzLiAqL1xuZXhwb3J0IGludGVyZmFjZSBTcGF0aWFsQ2F0ZWdvcmljYWxWaWV3IHtcbiAgbmFtZTogc3RyaW5nO1xuICBjYXRlZ29yaWVzOiBzdHJpbmdbXTtcbiAgLyoqIGAjcnJnZ2JiYCBwZXIgY2F0ZWdvcnksIGluZGV4LWFsaWduZWQgd2l0aCB7QGxpbmsgY2F0ZWdvcmllc30uICovXG4gIGNvbG9yczogc3RyaW5nW107XG4gIC8qKiBQZXItb2JzZXJ2YXRpb24gY2F0ZWdvcnkgaW5kZXgsIG9yIGBOT19DQVRFR09SWWAuICovXG4gIGNvZGVzOiBVaW50MTZBcnJheTtcbn1cblxuLyoqXG4gKiBIb3cgXCJTZWxlY3QgZnJvbSBST0lzXCIgc2VsZWN0czogaW5zaWRlIHRoZSB2b2x1bWVzIG9mIHRoZSByZWdpb24gY2xhc3NlcyBwaWNrZWRcbiAqIGluIHRoZSBSZWdpb24gRWRpdG9yIChTcGF0aWFsIG9taWNzIDNELCB0aGUgcmVnaW9ucyBvbiB0aGUgZGF0YXNldCdzIHJlZmVyZW5jZVxuICogdm9sdW1lIHNob3duKSwgb3IgYnkgdGhlIGRyYXduIHJlZ2lvbnMuXG4gKi9cbmV4cG9ydCB0eXBlIFJvaVNlbGVjdGlvbk1vZGUgPSAnY2xhc3Mtdm9sdW1lcycgfCAncmVnaW9ucyc7XG5cbi8qKlxuICogQ29udHJvbHMgZm9yIHRoZSBTUEFUSUFMX09NSUNTIHBsb3QgdHlwZTogd2hhdCB0aGUgb2JzZXJ2YXRpb24gbWFya2VycyBhcmVcbiAqIGNvbG91cmVkIGJ5LCBhbmQgaG93IHRoZXkgYXJlIGRyYXduLiBDYXBhYmlsaXR5LWdhdGVkIGxpa2VcbiAqIHtAbGluayBJSXNvc3VyZmFjZUNvbnRyb2xzfSDigJQgYGdldFNwYXRpYWxDb250cm9scygpYCByZXR1cm5zIG51bGwgdW5sZXNzIGFcbiAqIGhvc3QgaGFzIGJvdW5kIGBTUEFUSUFMX0RBVEFfUE9SVGAuXG4gKlxuICogVGhlIHZpZXcgc3RhdGUgaXMgYmFja2VuZC1uZXV0cmFsIChpdCBsaXZlcyBpbiB0aGUgc2hhcmVkIHN0b3JlLCBsaWtlIHRoZVxuICogY29sb3JtYXApLCBzbyB0aGVzZSBjb250cm9scyB3b3JrIHdoaWNoZXZlciBiYWNrZW5kIGlzIG9uIHNjcmVlbi5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJU3BhdGlhbENvbnRyb2xzIHtcbiAgLyoqIFRoZSBkYXRhc2V0IGJlaW5nIHZpc3VhbGl6ZWQsIG9yIG51bGwuIERyaXZlcyB0aGUgY29sdW1uL2dlbmUgcGlja2VycyBhbmRcbiAgICogIHRoZSBsZWdlbmQuICovXG4gIGdldERhdGFzZXQkKCk6IE9ic2VydmFibGU8U3BhdGlhbERhdGFzZXQgfCBudWxsPjtcbiAgLyoqIEN1cnJlbnQgZGlzcGxheSBzdGF0ZSAoY29sb3VyIHNvdXJjZSwgcG9pbnQgc2NhbGUsIG9wYWNpdHksIHNjYWxpbmcpLiAqL1xuICBnZXRWaWV3U3RhdGUkKCk6IE9ic2VydmFibGU8U3BhdGlhbFZpZXdTdGF0ZT47XG4gIC8qKiBTeW5jaHJvbm91cyByZWFkLCBmb3Igc2VlZGluZyBhIGNvbnRyb2wncyBpbml0aWFsIHZhbHVlLiAqL1xuICB2aWV3U3RhdGUoKTogU3BhdGlhbFZpZXdTdGF0ZTtcbiAgLyoqIFBhdGNoIHRoZSBkaXNwbGF5IHN0YXRlOyB0aGUgbWFya2VycyByZWJ1aWxkIHdpdGhvdXQgcmVtb3VudGluZyB0aGUgc2NlbmUuICovXG4gIHNldFZpZXdTdGF0ZShwYXJ0aWFsOiBQYXJ0aWFsPFNwYXRpYWxWaWV3U3RhdGU+KTogdm9pZDtcbiAgLyoqIENvbG91ciBieSBhbiBhbm5vdGF0aW9uIGNvbHVtbi4gUmVqZWN0cyBmb3IgYW4gdW5rbm93biBjb2x1bW4uICovXG4gIGNvbG9yQnlDb2x1bW4obmFtZTogc3RyaW5nKTogdm9pZDtcbiAgLyoqIENvbG91ciBieSBhIGdlbmU7IGl0cyB2ZWN0b3IgaXMgZmV0Y2hlZCBvbiBkZW1hbmQuICovXG4gIGNvbG9yQnlGZWF0dXJlKG5hbWU6IHN0cmluZyk6IHZvaWQ7XG4gIC8qKiBDbGVhciB0aGUgY29sb3VyIHNvdXJjZSDigJQgZXZlcnkgb2JzZXJ2YXRpb24gcmVuZGVycyBpbiBvbmUgbmV1dHJhbCBjb2xvdXIuICovXG4gIGNsZWFyQ29sb3JCeSgpOiB2b2lkO1xuICAvKiogVHlwZWFoZWFkIG92ZXIgZmVhdHVyZSBuYW1lcywgZm9yIGRhdGFzZXRzIHRvbyB3aWRlIHRvIGlubGluZSB0aGUgbGlzdC4gKi9cbiAgc2VhcmNoRmVhdHVyZXMocXVlcnk6IHN0cmluZywgbGltaXQ/OiBudW1iZXIpOiBQcm9taXNlPHN0cmluZ1tdPjtcbiAgLyoqIFBlci1jYXRlZ29yeSBkaXNwbGF5IGNvbG91cnMgZm9yIGEgY2F0ZWdvcmljYWwgY29sdW1uLCBpbmRleC1hbGlnbmVkIHdpdGhcbiAgICogIGl0cyBgY2F0ZWdvcmllc2Ag4oCUIHRoZSBsZWdlbmQncyBzd2F0Y2hlcywgcmVzb2x2ZWQgdGhlIHNhbWUgd2F5IHRoZVxuICAgKiAgcmVuZGVyZXIgcmVzb2x2ZXMgdGhlbSBzbyB0aGUgdHdvIGNhbm5vdCBkaXNhZ3JlZS4gKi9cbiAgY2F0ZWdvcnlDb2xvcnMobmFtZTogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmdbXT47XG5cbiAgLy8g4pSA4pSAIHZhbHVlcywgZm9yIHRoZSAxLUQgY2hhcnRzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICAvKipcbiAgICogVGhlIHZhbHVlcyBiZWhpbmQgYSBjb2xvdXIgc291cmNlLCBpbmRleC1hbGlnbmVkIHdpdGggdGhlIG9ic2VydmF0aW9ucy5cbiAgICogUmVqZWN0cyBmb3IgYSBjYXRlZ29yaWNhbCBjb2x1bW4g4oCUIHRoZXJlIGlzIG5vdGhpbmcgY29udGludW91cyB0byBjaGFydC5cbiAgICovXG4gIGNvbnRpbnVvdXNWYWx1ZXMoc291cmNlOiBTcGF0aWFsQ29sb3JCeSk6IFByb21pc2U8RmxvYXQzMkFycmF5PjtcbiAgLyoqXG4gICAqIEEgY2F0ZWdvcmljYWwgY29sdW1uJ3MgY2F0ZWdvcmllcywgcGVyLW9ic2VydmF0aW9uIGNvZGVzIGFuZCBkaXNwbGF5XG4gICAqIGNvbG91cnMg4oCUIGV2ZXJ5dGhpbmcgYSBncm91cGVkIHZpb2xpbi9ib3ggbmVlZHMsIHdpdGggdGhlIGNvbG91cnMgcmVzb2x2ZWRcbiAgICogdGhlIHNhbWUgd2F5IHRoZSBtYXAgcmVzb2x2ZXMgdGhlbS5cbiAgICovXG4gIGNhdGVnb3JpY2FsVmlldyhjb2x1bW46IHN0cmluZyk6IFByb21pc2U8U3BhdGlhbENhdGVnb3JpY2FsVmlldz47XG5cbiAgLyoqXG4gICAqIE9uZSBlbWJlZGRpbmcncyBjb29yZGluYXRlcyDigJQgYSBVTUFQLCB0LVNORSBvciBQQ0EgcGxhbmUgb3ZlciB0aGUgc2FtZSBvYnNlcnZhdGlvbnMuXG4gICAqXG4gICAqIE9wdGlvbmFsLCBhbmQgYWJzZW50IHdoZW4gdGhlIGRhdGEgc291cmNlIHNlcnZlcyBub25lOiBgU3BhdGlhbERhdGFQb3J0LmdldEVtYmVkZGluZ2BcbiAgICogaXMgaXRzZWxmIG9wdGlvbmFsLCBzbyBhIHBhbmVsIG11c3QgYmUgYWJsZSB0byBhc2sgd2hldGhlciB0aGlzIGV4aXN0cyByYXRoZXIgdGhhblxuICAgKiBjYWxsaW5nIGl0IGFuZCBjYXRjaGluZy5cbiAgICovXG4gIGdldEVtYmVkZGluZz8obmFtZTogc3RyaW5nKTogUHJvbWlzZTxTcGF0aWFsRW1iZWRkaW5nPjtcbiAgLyoqIE5hbWVzIG9mIHRoZSBjYXRlZ29yaWNhbCBjb2x1bW5zIGF2YWlsYWJsZSB0byBncm91cCBieS4gKi9cbiAgY2F0ZWdvcmljYWxDb2x1bW5zKCk6IHN0cmluZ1tdO1xuICAvKipcbiAgICogSW1wb3J0IGEgY2VsbCBncm91cGluZyAoQ1NWL1RTViBvZiBgY2VsbF9pZGAsIGBncm91cGApIGFzIGEgbmV3IGNhdGVnb3JpY2FsIGNvbHVtbi5cbiAgICogT3B0aW9uYWw6IG9ubHkgZGF0YSBzb3VyY2VzIHRoYXQgY2FuIGpvaW4gY2VsbCBpZHMgaW1wbGVtZW50IGl0LlxuICAgKi9cbiAgaW1wb3J0R3JvdXBzPyhsYWJlbDogc3RyaW5nLCB0YWJsZTogc3RyaW5nKTogUHJvbWlzZTx7IGNvbHVtbjogQ2F0ZWdvcmljYWxDb2x1bW5NZXRhOyBtYXRjaGVkOiBudW1iZXIgfT47XG4gIC8qKiBUcmFuc2NyaXB0IHRvdGFscyBwZXIgZ2VuZSDigJQgZm9yIHRoZSBwb2ludHMgZXN0aW1hdGUuIE9wdGlvbmFsLiAqL1xuICB0cmFuc2NyaXB0Q291bnRzPyhnZW5lczogc3RyaW5nW10pOiBQcm9taXNlPFNwYXRpYWxUcmFuc2NyaXB0Q291bnRzPjtcbiAgLyoqIE1hcmtlciBnZW5lcyBvZiBlYWNoIGdyb3VwIG9mIGEgY2F0ZWdvcmljYWwgY29sdW1uLiBPcHRpb25hbCAoc2VlIHRoZSBwb3J0KS4gKi9cbiAgbWFya2VyR2VuZXM/KGNvbHVtbjogc3RyaW5nLCBwZXJHcm91cD86IG51bWJlcik6IFByb21pc2U8U3BhdGlhbE1hcmtlckdlbmVzPjtcbiAgLyoqIFRyYW5zY3JpcHRzIG9mIGVhY2ggc2VsZWN0ZWQgZ2VuZSBpbiB0aGUgY3VycmVudCB2aWV3LCBvciBudWxsIHdoZW4gbm90IGtub3duXG4gICAqICAoYWxsIGdlbmVzIGF0IG9uY2UsIHRyYW5zY3JpcHRzIG9mZiwgb3IgYSBzZWxlY3Rpb24gem9vbWVkIG91dCBvbiBhIGRhdGFzZXQgd2l0aG91dCB0aGVcbiAgICogIHB5cmFtaWQncyBwZXItZ2VuZSBsZXZlbHMsIHdoZXJlIGNsdXN0ZXJzIGFyZSBkcmF3biBmcm9tIHN1bW1lZCBkZW5zaXR5IGdyaWRzKS4gKi9cbiAgZ2V0R2VuZUNvdW50c0luVmlldyQ/KCk6IE9ic2VydmFibGU8UmVjb3JkPHN0cmluZywgbnVtYmVyPiB8IG51bGw+O1xuICAvKiogRXN0aW1hdGVkIHRyYW5zY3JpcHRzIGluIHZpZXcgZm9yIHRoZSBjdXJyZW50IHNlbGVjdGlvbiwgYWdhaW5zdCB0aGUgbWFya2VyIGJ1ZGdldC4gKi9cbiAgZ2V0VHJhbnNjcmlwdEVzdGltYXRlJD8oKTogT2JzZXJ2YWJsZTx7IHBvaW50czogbnVtYmVyOyBtYXg6IG51bWJlciB9IHwgbnVsbD47XG4gIC8qKiBUaGUgZGVuc2l0eSBtYXAncyBjb2xvdXIgd2luZG93IGluIHVzZSAoYXV0by1kZXJpdmVkIG9yIHNldCkgYW5kIGl0cyBkZW5zZXN0IGJpbi4gKi9cbiAgZ2V0RGVuc2l0eVN0YXRzJD8oKTogT2JzZXJ2YWJsZTx7IGxvOiBudW1iZXI7IGhpOiBudW1iZXI7IG1heDogbnVtYmVyIH0gfCBudWxsPjtcbiAgLyoqIFRydWUgd2hpbGUgdGhlIG9ic2VydmF0aW9uIGdlbmUgZmlsdGVyIGNvdWxkIG5vdCBiZSBhcHBsaWVkIChhbiBleHByZXNzaW9uIHJlYWQgZmFpbGVkKTpcbiAgICogIHRoZSBvYnNlcnZhdGlvbnMgdGhlbiBzdGlsbCBzaG93IHRoZSBsYXN0IGZpbHRlciB0aGF0IGNvdWxkIGJlLiAqL1xuICBnZXRHZW5lRmlsdGVyRmFpbGVkJD8oKTogT2JzZXJ2YWJsZTxib29sZWFuPjtcbiAgLyoqXG4gICAqIFRoZSB6IHBvc2l0aW9ucyBvZiB0aGUgc2VjdGlvbnMgdGhlIGRhdGFzZXQgd2FzIGltYWdlZCBhdCwgYXNjZW5kaW5nIOKAlCBvclxuICAgKiBudWxsIHdoZW4gaXRzIHogaXMgY29udGludW91cyByYXRoZXIgdGhhbiBzZWN0aW9uZWQgKHNvIHRoZXJlIGFyZSBubyBzZWN0aW9uc1xuICAgKiB0byBvZmZlcikgb3Igd2hlbiB0aGVyZSBpcyBubyBkYXRhc2V0LlxuICAgKlxuICAgKiBMZXRzIGEgcGFuZWwgb2ZmZXIgXCJvbmUgc2VjdGlvbiBhdCBhIHRpbWVcIiBmb3IgdGhlIDNEIGNsb3VkIG9ubHkgd2hlcmUgdGhhdFxuICAgKiBtZWFucyBzb21ldGhpbmcsIGFuZCBsYWJlbCB0aGUgY2hvc2VuIG9uZS4gU2Nhbm5lZCBvbmNlIHBlciBkYXRhc2V0LlxuICAgKi9cbiAgc2FtcGxlZFNlY3Rpb25zKCk6IEZsb2F0MzJBcnJheSB8IG51bGw7XG5cbiAgLy8g4pSA4pSAIHNlbGVjdGlvbiDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgLyoqIFRoZSBjdXJyZW50IHNlbGVjdGlvbi4gRW1wdHkgbWVhbnMgXCJub3RoaW5nIHNlbGVjdGVkXCIsIGluIHdoaWNoIGNhc2UgdGhlXG4gICAqICB3aG9sZSB0aXNzdWUgcmVuZGVycyBub3JtYWxseSByYXRoZXIgdGhhbiBldmVyeXRoaW5nIGJlaW5nIG11dGVkLiAqL1xuICBnZXRTZWxlY3Rpb24kKCk6IE9ic2VydmFibGU8U3BhdGlhbFNlbGVjdGlvbk1hc2s+O1xuICAvKipcbiAgICogU2VsZWN0IGV2ZXJ5IG9ic2VydmF0aW9uIGluc2lkZSB0aGUgY3VycmVudGx5LWRyYXduIHJlZ2lvbnMgKHRoZWlyIHVuaW9uKS5cbiAgICogUmV1c2VzIHRoZSBleGlzdGluZyBST0kgdG9vbHMg4oCUIHJlY3RhbmdsZSwgcG9seWdvbiwgZnJlZWhhbmQsIHdhbmQsIGJydXNoIOKAlFxuICAgKiBzbyB0aGVyZSBpcyBubyBzZXBhcmF0ZSBtYXJxdWVlIHRvIGxlYXJuLiBJbiB0aGUgM0QgY2xvdWQsIHRoZSByZWdpb24gY2xhc3Nlc1xuICAgKiBwaWNrZWQgaW4gdGhlIFJlZ2lvbiBFZGl0b3IgKHNlZSB7QGxpbmsgZ2V0UGlja2VkUmVnaW9uQ2xhc3NlcyR9KSBzZWxlY3QgdGhlXG4gICAqIG9ic2VydmF0aW9ucyBpbnNpZGUgdGhlaXIgdm9sdW1lcyBpbnN0ZWFkLCB3aGVuIHRoZSByZWdpb25zIHNpdCBvbiB0aGVcbiAgICogZGF0YXNldCdzIHJlZmVyZW5jZSB2b2x1bWU7IHdpdGhvdXQgYSBwaWNrLCB0aGUgbGFzc29zIGRyYXduIG92ZXIgdGhlIGNsb3VkLlxuICAgKiBSZXNvbHZlcyBob3cgbWFueSB3ZXJlIHNlbGVjdGVkIOKAlCBvciBudWxsIHdoZW4gaXQgd2FzIHN1cGVyc2VkZWQgd2hpbGUgdGhlXG4gICAqIGNsYXNzZXMnIG91dGxpbmVzIHdlcmUgcmVhZCAoYSBuZXdlciBzZWxlY3Rpb24sIGEgQ2xlYXIsIGFub3RoZXIgZGF0YXNldCwgdmlld1xuICAgKiBvciBwaWNrKSwgaW4gd2hpY2ggY2FzZSBub3RoaW5nIHdhcyBwdWJsaXNoZWQuXG4gICAqL1xuICBzZWxlY3RGcm9tUmVnaW9ucygpOiBQcm9taXNlPG51bWJlciB8IG51bGw+O1xuICAvKipcbiAgICogSG93IHtAbGluayBzZWxlY3RGcm9tUmVnaW9uc30gd291bGQgc2VsZWN0IG5vdzogaW5zaWRlIHRoZSBwaWNrZWQgY2xhc3NlcydcbiAgICogdm9sdW1lcywgb3IgYnkgdGhlIGRyYXduIHJlZ2lvbnMuIFRoZSBydWxlIGl0IHJ1bnMgYnksIHNvIGEgcGFuZWwgZGVzY3JpYmluZ1xuICAgKiB0aGUgYnV0dG9uIGNhbiBuZXZlciBkaXNhZ3JlZSB3aXRoIHdoYXQgaXQgZG9lcy5cbiAgICovXG4gIHJvaVNlbGVjdGlvbk1vZGU/KCk6IFJvaVNlbGVjdGlvbk1vZGU7XG4gIC8qKlxuICAgKiBUaGUgcmVnaW9uIGNsYXNzZXMgdGhlIHJlZ2lvbiBzZWxlY3Rpb24gd2FzIHBpY2tlZCBhcyAoYSBjbGFzcyB0cmVlIG5vZGUgd2l0aFxuICAgKiBpdHMgc3ViY2xhc3NlcywgYSBzdXJmYWNlIGNsaWNrZWQgaW4gM0QpOyBbXSBmb3IgYW55IG90aGVyIHNlbGVjdGlvbi5cbiAgICovXG4gIGdldFBpY2tlZFJlZ2lvbkNsYXNzZXMkPygpOiBPYnNlcnZhYmxlPHJlYWRvbmx5IHN0cmluZ1tdPjtcbiAgLyoqIFNlbGVjdCBldmVyeSBvYnNlcnZhdGlvbiBpbiBvbmUgY2F0ZWdvcnkgb2YgYSBjYXRlZ29yaWNhbCBjb2x1bW4g4oCUIHRoZVxuICAgKiAgbGVnZW5kIGNsaWNrLiBSZWplY3RzIGZvciBhbiB1bmtub3duIG9yIGNvbnRpbnVvdXMgY29sdW1uLiAqL1xuICBzZWxlY3RDYXRlZ29yeShjb2x1bW46IHN0cmluZywgY2F0ZWdvcnlJbmRleDogbnVtYmVyKTogUHJvbWlzZTxudW1iZXI+O1xuXG4gIC8qKlxuICAgKiBTZWxlY3QgYW4gZXhwbGljaXQgc2V0IG9mIG9ic2VydmF0aW9ucywgcmVwbGFjaW5nIGFueSBjdXJyZW50IHNlbGVjdGlvbi5cbiAgICpcbiAgICogRm9yIGEgbGlua2VkIHBsb3Q6IGxhc3NvaW5nIHBvaW50cyBpbiBhbiBlbWJlZGRpbmcgaXMgYSBzZWxlY3Rpb24gT0Ygb2JzZXJ2YXRpb25zLFxuICAgKiBhbmQgZXZlcnkgb3RoZXIgdmlldyDigJQgdGhlIG1hcCwgdGhlIGRpc3RyaWJ1dGlvbnMg4oCUIHJlYWRzIHRoZSBzYW1lIG1hc2ssIHNvIGJydXNoaW5nXG4gICAqIG9uZSBsaWdodHMgdXAgdGhlIHJlc3QuIFJldHVybnMgaG93IG1hbnkgd2VyZSBzZWxlY3RlZC5cbiAgICovXG4gIHNlbGVjdEluZGljZXMoaW5kaWNlczogSXRlcmFibGU8bnVtYmVyPik6IG51bWJlcjtcbiAgY2xlYXJTZWxlY3Rpb24oKTogdm9pZDtcbn1cblxuLyoqIERpc3BsYXkgb3B0aW9ucyAoY29sb3JtYXAvTFVULCByZXZlcnNlIHNjYWxlLCBpbWFnZSBtZXRhZGF0YSkuICovXG5leHBvcnQgaW50ZXJmYWNlIElEaXNwbGF5T3B0aW9ucyB7XG4gIGdldENvbG9ybWFwKCk6IE9ic2VydmFibGU8Q29sb3JtYXBOb2RlIHwgbnVsbD47XG4gIHNldENvbG9ybWFwKGNvbG9ybWFwOiBDb2xvcm1hcE5vZGUpOiB2b2lkO1xuICBnZXRDb2xvcm1hcE9wdGlvbnMoKTogQ29sb3JtYXBOb2RlW107XG4gIGdldFJldmVyc2VTY2FsZSgpOiBPYnNlcnZhYmxlPGJvb2xlYW4+O1xuICBzZXRSZXZlcnNlU2NhbGUocmV2ZXJzZTogYm9vbGVhbik6IHZvaWQ7XG4gIC8qKiBQdWJsaXNoIHRoZSBjdXJyZW50IGltYWdlJ3MgbWV0YWRhdGEuIGBpbWFnZUtleWAgKGl0cyBmaWxlIG5hbWUpIGxldHMgdGhlXG4gICAqICBjaGFubmVsIHN0YXRlIHN1cnZpdmUgYSByZS1wbG90IG9mIHRoZSBzYW1lIGltYWdlIGJ1dCBub3QgYSBzd2l0Y2ggdG8gYW5vdGhlci4gKi9cbiAgc2V0SW1hZ2VNZXRhKGltYWdlTWV0YTogSUltYWdlTWV0YWRhdGFbXSwgaW1hZ2VLZXk/OiBzdHJpbmcpOiB2b2lkO1xuICBnZXRJbWFnZU1ldGEoKTogT2JzZXJ2YWJsZTxJSW1hZ2VNZXRhZGF0YVtdPjtcbn1cblxuLyoqXG4gKiBUaGUgcGFydCBvZiBpbnRlbnNpdHkgc2FtcGxpbmcgYSByZW5kZXJpbmcgYmFja2VuZCBvd25zOiB3aGVyZSBpdHMgdmlldyBzZXR0bGVkLlxuICogV2hhdCBgSVZpZXdlckJhY2tlbmQuZ2V0SW50ZW5zaXR5U2FtcGxpbmcoKWAgcmV0dXJucy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJSW50ZW5zaXR5Vmlld3BvcnRTb3VyY2Uge1xuICAvKiogVmlzaWJsZS1yZWdpb24gY2hhbmdlcyAoaW1hZ2UtcGl4ZWwgY29vcmRzKSwgZW1pdHRlZCB3aGVuIHRoZSB2aWV3IHNldHRsZXMsXG4gICAqICBzbyB0aGUgaW5zZXQgY2FuIHJlLXNhbXBsZSBhdCB0aGUgY3VycmVudCB6b29tLiAqL1xuICBnZXRWaWV3cG9ydENoYW5nZSQoKTogT2JzZXJ2YWJsZTx7IHg6IG51bWJlcjsgeTogbnVtYmVyOyB3aWR0aDogbnVtYmVyOyBoZWlnaHQ6IG51bWJlciB9Pjtcbn1cblxuLyoqXG4gKiBJbnRlbnNpdHktcHJvZmlsZSBzYW1wbGluZyAodGhlIGxpbmUgUk9JcycgaW5zZXQpLCBmcm9tIGBJVmlzdWFsaXplci5nZXRJbnRlbnNpdHlTYW1wbGluZygpYC5cbiAqIFRoZSBzYW1wbGluZyBpdHNlbGYgaXMgYmFja2VuZC1uZXV0cmFsICh0aGUgbGlicmFyeSdzIEludGVuc2l0eVByb2ZpbGVTZXJ2aWNlXG4gKiBzYW1wbGVzIHdoYXRldmVyIGltYWdlIGlzIG9uIHNjcmVlbik7IHRoZSB2aWV3cG9ydC1jaGFuZ2Ugc2lnbmFsIGNvbWVzIGZyb20gdGhlXG4gKiBiYWNrZW5kIHRoYXQgZHJhd3MgdGhlIGltYWdlIChPcGVuU2VhZHJhZ29uIGFuZCBuYXBhcmktanMgcmVwb3J0IGl0OyBQbG90bHlcbiAqIHJlLXNhbXBsZXMgaXRzIGhpZ2gtZGVmIHpvb20gY3JvcHMgaW5saW5lIGluc3RlYWQpLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIElJbnRlbnNpdHlTYW1wbGluZyBleHRlbmRzIElJbnRlbnNpdHlWaWV3cG9ydFNvdXJjZSB7XG4gIC8qKiBMb2FkIHRoZSBjdXJyZW50IGltYWdlL3NsaWNlJ3MgcGl4ZWxzIHNvIHRoZSBsaW5lLVJPSSBwcm9maWxlcyBoYXZlIGRhdGFcbiAgICogIChhIGJhY2tlbmQgd2l0aCBubyBmcmFtZXMgb2YgaXRzIG93bjogT3BlblNlYWRyYWdvbiwgbmFwYXJpLWpzKS4gKi9cbiAgZW5zdXJlSW50ZW5zaXR5U2FtcGxpbmcoaW1hZ2VJbmZvOiBJSW1hZ2VJbmZvLCB6SW5kZXg6IG51bWJlcik6IFByb21pc2U8dm9pZD47XG4gIC8qKiBSZS1zYW1wbGUgdGhlIHByb2ZpbGVzIGZyb20gYSBmcmVzaCBjcm9wIG9mIHRoZSBnaXZlbiBpbWFnZS1waXhlbCBST0kgYXRcbiAgICogIGRpc3BsYXkgcmVzb2x1dGlvbi4gKi9cbiAgcmVmcmVzaEludGVuc2l0eVNhbXBsaW5nRm9yUm9pKHg6IG51bWJlciwgeTogbnVtYmVyLCB3aWR0aDogbnVtYmVyLCBoZWlnaHQ6IG51bWJlciwgekluZGV4OiBudW1iZXIpOiB2b2lkO1xufVxuXG4vKipcbiAqIFRoZSAyRCB2aWV3IG9wdGlvbnMgb2YgYSB0aWxlZCBpbWFnZSB2aWV3ZXI6IHRoZSBvdmVydmlldyBuYXZpZ2F0b3IgYW5kIGltYWdlXG4gKiBzbW9vdGhpbmcuIE9wZW5TZWFkcmFnb24ncywgbWlycm9yZWQgYnkgbmFwYXJpLWpzJ3MgMkQgdmlld3M7IFBsb3RseSBoYXMgbmVpdGhlci5cbiAqIENhcGFiaWxpdHktZ2F0ZWQ6IGBJVmlld2VyQmFja2VuZC5nZXRPc2RWaWV3T3B0aW9ucygpYCBpcyBudWxsIG9uIGEgYmFja2VuZFxuICogd2l0aG91dCB0aGVtLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIElPc2RWaWV3T3B0aW9ucyB7XG4gIC8qKiBTaG93L2hpZGUgdGhlIG92ZXJ2aWV3IG5hdmlnYXRvciAodGhlIG1pbmltYXApLiBBcHBsaWVkIHdoZW4gdGhlIHZpZXdlciBpc1xuICAgKiAgKHJlKWNyZWF0ZWQsIGFuZCB0b2dnbGVkIGxpdmUgd2hlbiBvbmUgaXMgYWxyZWFkeSBtb3VudGVkLiAqL1xuICBzZXROYXZpZ2F0b3JWaXNpYmxlKHZpc2libGU6IGJvb2xlYW4pOiB2b2lkO1xuICAvKiogSW1hZ2Ugc21vb3RoaW5nIChiaWxpbmVhciBpbnRlcnBvbGF0aW9uKS4gYGZhbHNlYCA9IG5lYXJlc3QtbmVpZ2hib3VyLCBzb1xuICAgKiAgem9vbWluZyBwYXN0IDE6MSBzaG93cyBjcmlzcCBwaXhlbCBibG9ja3MgKHBpeGVsLWxldmVsIGluc3BlY3Rpb24pLiBBcHBsaWVkXG4gICAqICBhdCB2aWV3ZXIgY3JlYXRpb24gYW5kIGxpdmUgKHdpdGggYSByZWRyYXcpIHdoZW4gb25lIGlzIG1vdW50ZWQuICovXG4gIHNldEltYWdlU21vb3RoaW5nRW5hYmxlZChlbmFibGVkOiBib29sZWFuKTogdm9pZDtcbn1cblxuLyoqXG4gKiBUaGUgM0QgZGVjaW1hdGUgZmFjdG9yIG9mIGEgdm9sdW1lIHJlbmRlcmVyIChuYXBhcmktanMgV2ViR1BVKTogMSA9IGZ1bGxcbiAqIHJlc29sdXRpb24g4oCmIDggPSDihZsgcGVyIGF4aXMuIENhcGFiaWxpdHktZ2F0ZWQ6IG51bGwgb24gYSBiYWNrZW5kIHdpdGhvdXQgb25lLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIElWb2x1bWVSZXNvbHV0aW9uIHtcbiAgLyoqIFRoZSBjdXJyZW50IGZhY3RvciAodG8gaW5pdGlhbGl6ZSB0aGUgUmVzb2x1dGlvbiBjb250cm9sKS4gKi9cbiAgZ2V0KCk6IG51bWJlcjtcbiAgLyoqIFNldCB0aGUgZmFjdG9yIChyb3VuZGVkLCBhdCBsZWFzdCAxKS4gVGFrZXMgZWZmZWN0IG9uIHRoZSBuZXh0IChyZSlsb2FkIOKAlFxuICAgKiAgdGhlIGhvc3QgcmUtcGxvdHMgYWZ0ZXIgY2FsbGluZyBpdCwgc2luY2UgaXQgY2hhbmdlcyB0aGUgZmV0Y2hlZCBkYXRhLiAqL1xuICBzZXQoc2NhbGU6IG51bWJlcik6IHZvaWQ7XG59XG5cbi8qKlxuICogVGhlIGhvc3QtZmFjaW5nIGNvbXBvc2l0ZSBjb250cmFjdCwgaW1wbGVtZW50ZWQgYnkgdGhlIHJvdXRlciAoYFZJU1VBTElaRVJgKS4gQVxuICogcmVuZGVyaW5nIGJhY2tlbmQgaW1wbGVtZW50cyB7QGxpbmsgSVZpZXdlckJhY2tlbmR9IGluc3RlYWQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSVZpc3VhbGl6ZXJcbiAgZXh0ZW5kcyBJRGF0YVJlbmRlcmVyLCBJUmVnaW9uU3RvcmUsIElUb29sQ29udHJvbGxlciwgSURpc3BsYXlPcHRpb25zLCBJSW50ZW5zaXR5U2FtcGxpbmcge1xuICByZWFkb25seSBjYXBhYmlsaXRpZXM6IFZpZXdlckNhcGFiaWxpdGllcztcbiAgLyoqIFRoaXMgYmFja2VuZCdzIHJlZ2lvbiByZW5kZXJlci4gTWF5IGJlIG51bGwgdW50aWwgYSBwbG90IGlzIG1vdW50ZWRcbiAgICogIChPcGVuU2VhZHJhZ29uKS4gRHJpdmVzIHJlZ2lvbiBkcmF3L3NlbGVjdCBtb2RlcyB1bmlmb3JtbHkuICovXG4gIGdldFJlZ2lvbk92ZXJsYXkoKTogSVJlZ2lvbk92ZXJsYXkgfCBudWxsO1xuICAvKiogU3BsaXQgYSB2b2x1bWUgdmlldzogdGhlIGRpc3BsYXllZCBzbGljZSwgd2l0aCBldmVyeSByZWdpb24gdG9vbCwgaW4gdGhlIGRpdiBgZGl2YCBiZXNpZGVcbiAgICogIHRoZSAzRCB2aWV3OyBudWxsIGNsb3NlcyBpdC4gUmVzb2x2ZXMgd2hldGhlciB0aGUgc2xpY2Ugc2hvd3MuIE9wdGlvbmFsOiB0aGUgcm91dGVyJ3MuICovXG4gIHNldFNsaWNlRWRpdG9yPyhkaXY6IHN0cmluZyB8IG51bGwpOiBQcm9taXNlPGJvb2xlYW4+O1xuICAvKiogVGhlIHNsaWNlIGVkaXRvcidzIHNlY3Rpb25zIHRocm91Z2ggeCBhbmQgeSAobnVsbHMgd2hpbGUgaXQgaXMgY2xvc2VkKS4gT3B0aW9uYWw6IHRoZSByb3V0ZXIncy4gKi9cbiAgZ2V0U2VjdGlvblZpZXdzJD8oKTogT2JzZXJ2YWJsZTxTZWN0aW9uVmlld3M+O1xuICAvKiogTW92ZSB0aGUgc2xpY2UgZWRpdG9yJ3Mgc2VjdGlvbiBwbGFuZSB0aHJvdWdoIGBheGlzYCB0byBgYXRgIChpbWFnZSBweCkuICovXG4gIHNldFNlY3Rpb25QbGFuZT8oYXhpczogU2VjdGlvbkF4aXMsIGF0OiBudW1iZXIpOiB2b2lkO1xuICAvKiogVGhlIHNsaWNlIHBpY2tlZCBieSBkcmFnZ2luZyB0aGUgeiBwbGFuZSBpbiB0aGUgdm9sdW1lICh0aGUgaG9zdCBzaG93cyBpdCkuICovXG4gIGdldFNsaWNlRHJhZyQ/KCk6IE9ic2VydmFibGU8bnVtYmVyPjtcbiAgLyoqIElzb3N1cmZhY2UgY29udHJvbHMgd2hlbiB0aGlzIGJhY2tlbmQgYWR2ZXJ0aXNlcyBgVmlld2VyRmVhdHVyZS5Jc29zdXJmYWNlYCxcbiAgICogIGVsc2UgbnVsbCDigJQgc28gY29uc3VtZXJzIGdhdGUgb24gdGhlIHJldHVybmVkIG9iamVjdCwgbm90IGEgbm8tb3AgbWV0aG9kLiAqL1xuICBnZXRJc29zdXJmYWNlQ29udHJvbHMoKTogSUlzb3N1cmZhY2VDb250cm9scyB8IG51bGw7XG4gIC8qKiBJbnRlbnNpdHkgKGxpbmUtUk9JKSBjb250cm9scyB3aGVuIHRoZSBiYWNrZW5kIHJlbmRlcnMgdGhlIExJTkUgcGxvdCB0eXBlLFxuICAgKiAgZWxzZSBudWxsLiAqL1xuICBnZXRJbnRlbnNpdHlDb250cm9scygpOiBJSW50ZW5zaXR5Q29udHJvbHMgfCBudWxsO1xuICAvKiogM0Qgc2NlbmUgY29udHJvbHMgd2hlbiB0aGlzIGJhY2tlbmQgcmVuZGVycyAzRCBwbG90IHR5cGVzLCBlbHNlIG51bGwg4oCUXG4gICAqICB0aGUgY2FwYWJpbGl0eS1nYXRlZCByZXBsYWNlbWVudCBmb3IgdGhlIGRlcHJlY2F0ZWQgdG9wLWxldmVsXG4gICAqICBgc2V0U3VyZmFjZURyYWdNb2RlYC9gcmVzZXRTdXJmYWNlQ2FtZXJhYC4gKi9cbiAgZ2V0U3VyZmFjZTNkQ29udHJvbHMoKTogSVN1cmZhY2UzZENvbnRyb2xzIHwgbnVsbDtcbiAgLyoqIFRoZSBuYXZpZ2F0b3IgLyBpbWFnZS1zbW9vdGhpbmcgb3B0aW9ucy4gTmV2ZXIgbnVsbCBvbiB0aGUgcm91dGVyOiBhIHNldHRpbmdcbiAgICogIGFwcGxpZXMgdG8gZXZlcnkgYmFja2VuZCB0aGF0IGhhcyB0aGVtIChPcGVuU2VhZHJhZ29uLCBuYXBhcmktanMpLCBzbyBpdCBjYW5cbiAgICogIGJlIHNldCBiZWZvcmUgdGhlIGZpcnN0IHJlbmRlciBhbmQgc3Vydml2ZXMgYSBiYWNrZW5kIHN3aXRjaC4gKi9cbiAgZ2V0T3NkVmlld09wdGlvbnMoKTogSU9zZFZpZXdPcHRpb25zO1xuICAvKiogVGhlIDNEIGRlY2ltYXRlIGZhY3RvciBvZiB0aGUgYmFja2VuZCBvbiBzY3JlZW4sIG9yIG51bGwgd2hlbiBpdCBoYXMgbm9uZVxuICAgKiAgKG9ubHkgbmFwYXJpLWpzIHJlbmRlcnMgdm9sdW1lcykuICovXG4gIGdldFZvbHVtZVJlc29sdXRpb24oKTogSVZvbHVtZVJlc29sdXRpb24gfCBudWxsO1xuICAvKiogSW50ZW5zaXR5LXByb2ZpbGUgc2FtcGxpbmcsIHdoaWNoZXZlciBiYWNrZW5kIGlzIG9uIHNjcmVlbi4gKi9cbiAgZ2V0SW50ZW5zaXR5U2FtcGxpbmcoKTogSUludGVuc2l0eVNhbXBsaW5nO1xuICAvKiogQGRlcHJlY2F0ZWQgVXNlIGBnZXRJbnRlbnNpdHlTYW1wbGluZygpLmVuc3VyZUludGVuc2l0eVNhbXBsaW5nKClgLiAqL1xuICBlbnN1cmVJbnRlbnNpdHlTYW1wbGluZyhpbWFnZUluZm86IElJbWFnZUluZm8sIHpJbmRleDogbnVtYmVyKTogUHJvbWlzZTx2b2lkPjtcbiAgLyoqIEBkZXByZWNhdGVkIFVzZSBgZ2V0SW50ZW5zaXR5U2FtcGxpbmcoKS5yZWZyZXNoSW50ZW5zaXR5U2FtcGxpbmdGb3JSb2koKWAuICovXG4gIHJlZnJlc2hJbnRlbnNpdHlTYW1wbGluZ0ZvclJvaSh4OiBudW1iZXIsIHk6IG51bWJlciwgd2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIsIHpJbmRleDogbnVtYmVyKTogdm9pZDtcbiAgLyoqIEBkZXByZWNhdGVkIFVzZSBgZ2V0SW50ZW5zaXR5U2FtcGxpbmcoKS5nZXRWaWV3cG9ydENoYW5nZSQoKWAuICovXG4gIGdldFZpZXdwb3J0Q2hhbmdlJCgpOiBPYnNlcnZhYmxlPHsgeDogbnVtYmVyOyB5OiBudW1iZXI7IHdpZHRoOiBudW1iZXI7IGhlaWdodDogbnVtYmVyIH0+O1xuICAvKiogU3BhdGlhbC1vbWljcyBjb250cm9scyB3aGVuIGEgYFNQQVRJQUxfREFUQV9QT1JUYCBpcyBib3VuZCwgZWxzZSBudWxsLlxuICAgKiAgT3B0aW9uYWw6IG9ubHkgdGhlIHJvdXRpbmcgc2VydmljZSBpbXBsZW1lbnRzIGl0LCBzaW5jZSB0aGUgc3RhdGUgaXMgc2hhcmVkXG4gICAqICByYXRoZXIgdGhhbiBvd25lZCBieSBhbnkgb25lIGJhY2tlbmQuICovXG4gIGdldFNwYXRpYWxDb250cm9scz8oKTogSVNwYXRpYWxDb250cm9scyB8IG51bGw7XG4gIC8qKiBUaGUgdmlld3BvcnQgYSBjb250cmlidXRlZCBwbG90IG1vZGUgZHJhd3Mgb3Zlciwgd2hlbiB0aGUgYmFja2VuZCBvblxuICAgKiAgc2NyZWVuIGNhbiBwcm92aWRlIG9uZSAoT3BlblNlYWRyYWdvbiksIGVsc2UgbnVsbC4gT3B0aW9uYWw6IGJhY2tlbmRzIHRoYXRcbiAgICogIG5vIGNvbnRyaWJ1dGVkIG1vZGUgcmlkZXMgb24gbmVlZCBub3QgaW1wbGVtZW50IGl0LiAqL1xuICBnZXRQbG90TW9kZVZpZXdwb3J0PygpOiBQbG90TW9kZVZpZXdwb3J0IHwgbnVsbDtcbiAgLyoqIEJpbm5lZCBpbnRlbnNpdHkgaGlzdG9ncmFtIGZvciBhIGNoYW5uZWwgZnJvbSB0aGUgY3VycmVudGx5LWRpc3BsYXllZFxuICAgKiAgcGl4ZWxzLCBvciBudWxsIHdoZW4gbm9uZSBhcmUgYXZhaWxhYmxlLiBGZWVkcyB0aGUgQ2hhbm5lbHMgJiBIaXN0b2dyYW1cbiAgICogIHBhbmUuICovXG4gIGdldEhpc3RvZ3JhbShjaGFubmVsSW5kZXg6IG51bWJlciwgYmluczogbnVtYmVyKTogSUhpc3RvZ3JhbSB8IG51bGw7XG4gIC8qKiBBc3luYyBoaXN0b2dyYW0gc3RyZWFtIOKAlCBuYXRpdmUgYml0IGRlcHRoIGZvciA+OC1iaXQgaW1hZ2VzIChzZXJ2ZXIpLCBlbHNlXG4gICAqICB0aGUgOC1iaXQgY2xpZW50IGhpc3RvZ3JhbS4gKi9cbiAgZ2V0SGlzdG9ncmFtJChjaGFubmVsSW5kZXg6IG51bWJlciwgYmluczogbnVtYmVyKTogT2JzZXJ2YWJsZTxJSGlzdG9ncmFtIHwgbnVsbD47XG4gIC8qKiBFeHBvcnQgdGhlIGRpc3BsYXllZCBpbWFnZSwgY29tcG9zaXRlZCB3aXRoIHRoZSBjdXJyZW50IGRpc3BsYXkgc2V0dGluZ3MsXG4gICAqICBhcyBhIHB1YmxpY2F0aW9uLXJlYWR5IFBORyBkb3dubG9hZC4gKi9cbiAgZXhwb3J0Q29tcG9zaXRlKCk6IHZvaWQ7XG4gIC8qKiBFeHBvcnQgdGhlIHVuZGVybHlpbmcgaW1hZ2UgZGF0YSBhcyBhIGRhdGEtcHJlc2VydmluZyBtdWx0aS1iYW5kIFRJRkZcbiAgICogIChuYXRpdmUgYml0IGRlcHRoKS4gTm8tb3Agb24gYmFja2VuZHMgdGhhdCBjYW4ndCBwcm92aWRlIGl0LiAqL1xuICBleHBvcnREYXRhKCk6IHZvaWQ7XG4gIC8qKlxuICAgKiBUaGUgdmlldyBpcyBnb2luZyBhd2F5ICh0aGUgYDx2aXN1YWxpemVyPmAgaXMgZGVzdHJveWVkKTogZHJvcCB3aGF0IGlzIGJvdW5kIHRvXG4gICAqIGl0IOKAlCB0aGUgb24tc2NyZWVuIHZpZXdlciwgaXRzIHJlbmRlciBsb29wIGFuZCB2aWV3IHN1YnNjcmlwdGlvbnMg4oCUIHNvIG5vdGhpbmdcbiAgICogb3V0bGl2ZXMgdGhlIHZpZXcuIFNlcnZpY2UtbGlmZXRpbWUgc3RhdGUgKHN0b3JlcywgdGhlIGJhY2tlbmRzJyBvd24gc3RvcmVcbiAgICogc3Vic2NyaXB0aW9ucykgaXMgdW50b3VjaGVkLCBzbyBhIGxhdGVyIHZpZXcgb24gdGhlIHNhbWUgY2hhaW4gcmVuZGVycyBub3JtYWxseS5cbiAgICovXG4gIGRldGFjaCgpOiB2b2lkO1xuICAvKiogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayBkZXRhY2h9LCB3aGljaCB0aGlzIGRlbGVnYXRlcyB0by4gKi9cbiAgdW5zdWJzY3JpYmUoKTogdm9pZDtcbn1cblxuLyoqXG4gKiBXaGF0IGEgcmVuZGVyaW5nIGJhY2tlbmQgaW1wbGVtZW50cyAoUGxvdGx5LCBPcGVuU2VhZHJhZ29uLCBuYXBhcmktanMpOiByZW5kZXJpbmcsXG4gKiB0aGUgdmlld3BvcnQsIHBpeGVsIHJlYWRiYWNrLCBleHBvcnQsIGxvYWRpbmcgc3RhdGUgYW5kIGl0cyBvbi1jYW52YXMgdG9vbHMsIHBsdXNcbiAqIGNhcGFiaWxpdHktZ2F0ZWQgZ2V0dGVycyBmb3Igd2hhdCBvbmx5IHNvbWUgYmFja2VuZHMgaGF2ZS5cbiAqXG4gKiBJdCBpcyB0aGUgYmFja2VuZC1mYWNpbmcgaGFsZiBvZiB7QGxpbmsgSVZpc3VhbGl6ZXJ9LiBSZWdpb24gYW5kIGRpc3BsYXkgc3RhdGUgYXJlXG4gKiBub3QgaGVyZTogdGhleSBsaXZlIGluIHRoZSBzaGFyZWQgYFJlZ2lvblN0b3JlYCAvIGBWaXN1YWxpemVyU3RvcmVgLCB3aGljaCB0aGUgcm91dGVyXG4gKiBzZXJ2ZXMgdG8gaG9zdHMgZGlyZWN0bHk7IGEgYmFja2VuZCBkcmF3cyB0aGVtIGJ5IHN1YnNjcmliaW5nIHRvIHRoZSBzdG9yZXMnIGV2ZW50cy5cbiAqIEhvc3RzIGtlZXAgZGVwZW5kaW5nIG9uIGBJVmlzdWFsaXplcmAgKHRoZSByb3V0ZXIncyBjb21wb3NpdGUpLCBuZXZlciBvbiBhIGJhY2tlbmQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSVZpZXdlckJhY2tlbmQgZXh0ZW5kcyBJVG9vbENvbnRyb2xsZXIge1xuICByZWFkb25seSBjYXBhYmlsaXRpZXM6IFZpZXdlckNhcGFiaWxpdGllcztcblxuICAvLyDilIDilIAgcmVuZGVyIGxpZmVjeWNsZSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgbG9hZChpbWFnZUluZm86IElJbWFnZUluZm8sIHpJbmRleDogbnVtYmVyLCBzaWduYWw/OiBBYm9ydFNpZ25hbCk6IFByb21pc2U8TG9hZGVkSW1hZ2U+O1xuICBwbG90KFxuICAgIHBsb3REaXY6IHN0cmluZyxcbiAgICBpbWFnZUxvYWRlZDogdW5rbm93bixcbiAgICBpbWFnZUluZm86IElJbWFnZUluZm8sXG4gICAgc2NyZWVuSGVpZ2h0OiBudW1iZXIsXG4gICAgcGxvdFR5cGU6IFBsb3RUeXBlLFxuICAgIGluUGxhY2U/OiBib29sZWFuLFxuICApOiBQcm9taXNlPGJvb2xlYW4+O1xuICByZXNldCgpOiB2b2lkO1xuICByZWxheW91dCh0cnVlSW1hZ2VTaXplPzogbnVtYmVyW10pOiB2b2lkO1xuICAvKiogVGhlIHZpZXcgaXMgZ29pbmcgYXdheTogcmVsZWFzZSB3aGF0IGlzIGJvdW5kIHRvIGl0LiAqL1xuICBkZXRhY2goKTogdm9pZDtcbiAgLyoqIFN0b3Agc3RyZWFtaW5nIGZyYW1lcyAodm9sdW1lIGFzc2VtYmx5IC8gc3VyZmFjZSBwcmVsb2FkKS4gT3B0aW9uYWw6IG9ubHlcbiAgICogIGJhY2tlbmRzIHRoYXQgc3RyZWFtIGEgei1zdGFjayBkbyB3b3JrIGhlcmUuICovXG4gIGNhbmNlbExvYWRpbmc/KCk6IHZvaWQ7XG5cbiAgLy8g4pSA4pSAIHZpZXdwb3J0IOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICB6b29tSW4oKTogdm9pZDtcbiAgem9vbU91dCgpOiB2b2lkO1xuICBzZXREcmFnTW9kZShtb2RlOiBzdHJpbmcgfCBmYWxzZSk6IHZvaWQ7XG4gIGZpdFRvVmlldygpOiB2b2lkO1xuICAvKiogQHNlZSBJRGF0YVJlbmRlcmVyLnJlc2V0QXhlcyAqL1xuICByZXNldEF4ZXMoKTogdm9pZDtcbiAgc2V0WkluZGV4KHpJbmRleDogbnVtYmVyKTogdm9pZDtcbiAgc2V0U2hvd1N0YWNrKHNob3dzdGFjazogYm9vbGVhbik6IHZvaWQ7XG4gIC8qKiBFbWl0cyB3aGVuZXZlciB0aGUgYmFja2VuZCBmaXRzIHRoZSB2aWV3LiAqL1xuICBnZXRBdXRvc2NhbGVFdmVudCgpOiBPYnNlcnZhYmxlPHVua25vd24+O1xuICBpc1N0YWNrTG9hZGluZygpOiBPYnNlcnZhYmxlPGJvb2xlYW4+O1xuICBnZXRTdGFja0xvYWRpbmdQcm9ncmVzcygpOiBPYnNlcnZhYmxlPG51bWJlcj47XG5cbiAgLy8g4pSA4pSAIHBpeGVscywgaGlzdG9ncmFtLCBleHBvcnQg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gIGdldFRydWVJbWFnZVNpemUoKTogeyB3aWR0aDogbnVtYmVyOyBoZWlnaHQ6IG51bWJlciB9IHwgbnVsbDtcbiAgZ2V0Q3VycmVudEltYWdlKCk6IFByb21pc2U8SW1hZ2UgfCBudWxsPjtcbiAgZ2V0RGlzcGxheWVkUGl4ZWxEYXRhKCk6IFBpeGVsRGF0YSB8IG51bGw7XG4gIGdldERpc3BsYXllZFNvdXJjZVJlY3QoKTogeyB4OiBudW1iZXI7IHk6IG51bWJlcjsgd2lkdGg6IG51bWJlcjsgaGVpZ2h0OiBudW1iZXIgfSB8IG51bGw7XG4gIGdldEhpc3RvZ3JhbShjaGFubmVsSW5kZXg6IG51bWJlciwgYmluczogbnVtYmVyKTogSUhpc3RvZ3JhbSB8IG51bGw7XG4gIGdldEhpc3RvZ3JhbSQoY2hhbm5lbEluZGV4OiBudW1iZXIsIGJpbnM6IG51bWJlcik6IE9ic2VydmFibGU8SUhpc3RvZ3JhbSB8IG51bGw+O1xuICBkb3dubG9hZEltYWdlKCk6IHZvaWQ7XG4gIGV4cG9ydENvbXBvc2l0ZSgpOiB2b2lkO1xuICBleHBvcnREYXRhKCk6IHZvaWQ7XG5cbiAgLy8g4pSA4pSAIGNhcGFiaWxpdHktZ2F0ZWQgc3VyZmFjZXMgKG51bGwgLyBhYnNlbnQgd2hlcmUgdGhlIGJhY2tlbmQgbGFja3MgdGhlIGZlYXR1cmUpIOKUgOKUgFxuICBnZXRSZWdpb25PdmVybGF5KCk6IElSZWdpb25PdmVybGF5IHwgbnVsbDtcbiAgZ2V0SXNvc3VyZmFjZUNvbnRyb2xzKCk6IElJc29zdXJmYWNlQ29udHJvbHMgfCBudWxsO1xuICBnZXRTdXJmYWNlM2RDb250cm9scygpOiBJU3VyZmFjZTNkQ29udHJvbHMgfCBudWxsO1xuICBnZXRJbnRlbnNpdHlDb250cm9scygpOiBJSW50ZW5zaXR5Q29udHJvbHMgfCBudWxsO1xuICBnZXRQbG90TW9kZVZpZXdwb3J0PygpOiBQbG90TW9kZVZpZXdwb3J0IHwgbnVsbDtcbiAgLyoqIE5hdmlnYXRvciAvIGltYWdlIHNtb290aGluZywgb3IgbnVsbCB3aGVuIHRoZSBiYWNrZW5kIGhhcyBuZWl0aGVyIChQbG90bHkpLiAqL1xuICBnZXRPc2RWaWV3T3B0aW9ucygpOiBJT3NkVmlld09wdGlvbnMgfCBudWxsO1xuICAvKiogVGhlIDNEIGRlY2ltYXRlIGZhY3Rvciwgb3IgbnVsbCB3aGVuIHRoZSBiYWNrZW5kIHJlbmRlcnMgbm8gdm9sdW1lcy4gKi9cbiAgZ2V0Vm9sdW1lUmVzb2x1dGlvbigpOiBJVm9sdW1lUmVzb2x1dGlvbiB8IG51bGw7XG4gIC8qKiBXaGVyZSB0aGUgdmlldyBzZXR0bGVkLCBmb3IgdGhlIGludGVuc2l0eSBpbnNldCdzIHJlLXNhbXBsaW5nOyBudWxsIHdoZW4gdGhlXG4gICAqICBiYWNrZW5kIHJlLXNhbXBsZXMgb24gaXRzIG93biAoUGxvdGx5J3MgaGlnaC1kZWYgem9vbSkuIFRoZSBzYW1wbGluZyBpdHNlbGYgaXNcbiAgICogIHRoZSByb3V0ZXIncyAoSW50ZW5zaXR5UHJvZmlsZVNlcnZpY2UpLiAqL1xuICBnZXRJbnRlbnNpdHlTYW1wbGluZygpOiBJSW50ZW5zaXR5Vmlld3BvcnRTb3VyY2UgfCBudWxsO1xufVxuXG4vKipcbiAqIFdoYXQgYSBtb3VudGVkIGA8dmlzdWFsaXplcj5gIGhhbmRzIGl0cyBob3N0IHRocm91Z2hcbiAqIGBJbWFnZVN0YXRlUG9ydC5zZXREaWFncmFtKClgIOKAlCBhIHNtYWxsLCB0eXBlZCBzdXJmYWNlIHJhdGhlciB0aGFuIHRoZSBjb21wb25lbnRcbiAqIGl0c2VsZiwgd2hvc2UgZXZlcnkgcHVibGljIG1lbWJlciB3b3VsZCBvdGhlcndpc2UgYmUgZGUtZmFjdG8gQVBJLiBDbGVhcmVkXG4gKiAoYHNldERpYWdyYW0obnVsbClgKSB3aGVuIHRoZSB2aXN1YWxpemVyIGlzIGRlc3Ryb3llZC4gSG9zdHMgdGhhdCBjYW4gaW5qZWN0XG4gKiB7QGxpbmsgVklTVUFMSVpFUn0gLyBgUkVHSU9OX0VESVRPUl9BUElgIGRpcmVjdGx5IG5lZWQgbm90IHVzZSBpdCBhdCBhbGwuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVmlzdWFsaXplckhhbmRsZSB7XG4gIC8qKiBUaGUgdmlzdWFsaXplciBjaGFpbiB0aGlzIGA8dmlzdWFsaXplcj5gIHJlbmRlcnMgdGhyb3VnaC4gKi9cbiAgcmVhZG9ubHkgdmlzdWFsaXplcjogSVZpc3VhbGl6ZXI7XG4gIC8qKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rIHZpc3VhbGl6ZXJ9LiBLZXB0IGZvciBob3N0cyB0aGF0IHJlYWQgdGhlIGNvbXBvbmVudCdzXG4gICAqICBmb3JtZXIgYHBsb3RTZXJ2aWNlYCBmaWVsZCBvZmYgdGhlIHJlZ2lzdGVyZWQgb2JqZWN0LiAqL1xuICByZWFkb25seSBwbG90U2VydmljZTogSVZpc3VhbGl6ZXI7XG4gIC8qKiBXaGV0aGVyIGFueSByZWdpb24gKGFubm90YXRpb24gb3IgaW50ZW5zaXR5IGxpbmUpIGV4aXN0cyBvbiB0aGUgY3VycmVudCBpbWFnZS4gKi9cbiAgaGFzUmVnaW9ucygpOiBib29sZWFuO1xuICAvKiogVGhlIGN1cnJlbnQgcmVnaW9ucyBhcyBwb2x5Z29ucywgZm9yIGEgc2VydmVyIHJlcXVlc3QgKGNyb3AgLyBwcm9jZXNzaW5nKS4gKi9cbiAgZ2V0UmVnaW9uUG9seWdvbnMoKTogUG9seWdvbltdO1xufVxuXG4vKipcbiAqIERJIHRva2VuIGZvciB0aGUgYWN0aXZlIHZpc3VhbGl6YXRpb24gYmFja2VuZC4gQmluZCBpdCAoYHVzZUV4aXN0aW5nYCkgdG8gdGhlXG4gKiBgUm91dGluZ1Zpc3VhbGl6ZXJTZXJ2aWNlYCwgd2hpY2ggc2VsZWN0cyBQbG90bHkgdnMgT3BlblNlYWRyYWdvbiBwZXIgcGxvdFxuICogdHlwZS4gQ29uc3VtZXJzIOKAlCBpbmNsdWRpbmcgdGhpcyBsaWJyYXJ5J3Mgb3duIGBWaXN1YWxpemVyQ29tcG9uZW50YCDigJRcbiAqIGluamVjdCBgSVZpc3VhbGl6ZXJgIHRocm91Z2ggdGhpcyB0b2tlbiByYXRoZXIgdGhhbiB0aGUgY29uY3JldGUgcm91dGVyLCBzb1xuICogdGhlIHJvdXRpbmcvZmFsbGJhY2sgaW1wbGVtZW50YXRpb24gY2FuIGNoYW5nZSB3aXRob3V0IHRvdWNoaW5nIGNvbnN0cnVjdG9ycy5cbiAqL1xuZXhwb3J0IGNvbnN0IFZJU1VBTElaRVIgPSBuZXcgSW5qZWN0aW9uVG9rZW48SVZpc3VhbGl6ZXI+KCdWSVNVQUxJWkVSJyk7XG4iXX0=
|
|
@@ -69,6 +69,16 @@ function fill(slices, opts) {
|
|
|
69
69
|
}
|
|
70
70
|
return mesh;
|
|
71
71
|
}
|
|
72
|
+
/**
|
|
73
|
+
* Fill one slice's outlines into `mask`, a `width × height` grid of image px (pixel i spanning
|
|
74
|
+
* [i, i + 1)), as the reconstruction fills them: each feature even-odd, the features as their
|
|
75
|
+
* union, sampled at pixel centres. Cells already set stay set. Open lines enclose nothing.
|
|
76
|
+
*/
|
|
77
|
+
export function fillOutlines(mask, width, height, outlines) {
|
|
78
|
+
for (const rings of featureRings(outlines.rings, outlines.ringGroups)) {
|
|
79
|
+
fillSlice(mask, width, height, 0, rings, 0, 0, 1);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
72
82
|
/** `a` and `b` as one mesh. */
|
|
73
83
|
function mergeMeshes(a, b) {
|
|
74
84
|
if (!b.faces.length)
|
|
@@ -312,4 +322,4 @@ function ringBox(r) {
|
|
|
312
322
|
}
|
|
313
323
|
return [x0, y0, x1, y1];
|
|
314
324
|
}
|
|
315
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVjb25zdHJ1Y3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL2dlb21ldHJ5L3JlY29uc3RydWN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7R0FNRztBQUNILE9BQU8sRUFBRSxXQUFXLEVBQUUsUUFBUSxFQUFFLFVBQVUsRUFBRSxXQUFXLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUdwRixPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sUUFBUSxDQUFDO0FBMkJuQzs7OztHQUlHO0FBQ0gsTUFBTSxVQUFVLFdBQVcsQ0FBQyxNQUFnQyxFQUFFLE9BQTJCLEVBQUU7SUFDekYsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsQ0FBQztJQUNsQyxNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQ3BELElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTTtRQUFFLE9BQU8sTUFBTSxDQUFDO0lBQ2pDLE1BQU0sS0FBSyxHQUFHLFNBQVMsQ0FDckIsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUMsS0FBSyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFDcEQsSUFBSSxDQUFDLFNBQVMsSUFBSSxDQUFDLENBQ3BCLENBQUM7SUFDRixPQUFPLFdBQVcsQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLENBQUM7QUFDcEMsQ0FBQztBQUVELDBDQUEwQztBQUMxQyxTQUFTLElBQUksQ0FBQyxNQUFnQyxFQUFFLElBQXdCO0lBQ3RFLElBQUksRUFBRSxHQUFHLFFBQVEsRUFDZixFQUFFLEdBQUcsUUFBUSxFQUNiLEVBQUUsR0FBRyxDQUFDLFFBQVEsRUFDZCxFQUFFLEdBQUcsQ0FBQyxRQUFRLEVBQ2QsRUFBRSxHQUFHLFFBQVEsRUFDYixFQUFFLEdBQUcsQ0FBQyxRQUFRLENBQUM7SUFDakIsS0FBSyxNQUFNLENBQUMsSUFBSSxNQUFNLEVBQUUsQ0FBQztRQUN2QixLQUFLLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUN4QixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO2dCQUN6QyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFO29CQUFFLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ3pCLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUU7b0JBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDekIsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUU7b0JBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7Z0JBQ2pDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFO29CQUFFLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQ25DLENBQUM7UUFDSCxDQUFDO1FBQ0QsSUFBSSxDQUFDLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ25CLEVBQUUsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDdkIsRUFBRSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN6QixDQUFDO0lBQ0gsQ0FBQztJQUNELElBQUksQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQztRQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsSUFBSSxZQUFZLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxFQUFFLElBQUksV0FBVyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7SUFDbEcsTUFBTSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDdkIsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLFNBQVMsSUFBSSxVQUFVLENBQUM7SUFDL0MsSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsU0FBUyxJQUFJLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztJQUMvQyxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsU0FBUztRQUFFLElBQUksSUFBSSxJQUFJLENBQUM7SUFDaEcsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQ3BELE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUNwRCxNQUFNLElBQUksR0FBRyxJQUFJLFVBQVUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDO0lBQzFDLEtBQUssTUFBTSxDQUFDLElBQUksTUFBTSxFQUFFLENBQUM7UUFDdkIsS0FBSyxNQUFN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QUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUM3QyxNQUFNLE1BQU0sR0FBRyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDekMsTUFBTSxJQUFJLEdBQUcsQ0FBQyxDQUFTLEVBQVUsRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzFGLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7UUFDekMsTUFBTSxDQUFDLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQztRQUMxQixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxNQUFNLElBQUksUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUMxRSxNQUFNLENBQUMsR0FBRyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDO1lBQzFCLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzVELENB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QUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxDQUFDO2dCQUMxQyxNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsRUFDckIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO2dCQUNwQixJQUFJLEVBQUUsR0FBRyxDQUFDLEtBQUssRUFBRSxHQUFHLENBQUM7b0JBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDNUYsQ0FBQztRQUNILENBQUM7UUFDRCxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQ3pCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLE1BQU0sRUFBRSxDQUFDLElBQUksQ0FBQztZQUFFLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDNUUsQ0FBQztJQUNELEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FB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c0NvbnRlbnQiOlsiLyoqXG4gKiBUaGUgM0QgcmVjb25zdHJ1Y3Rpb24gb2YgYSByZWdpb24gZnJvbSBpdHMgb3V0bGluZXMgb24gYSBzdGFjayBvZiBzbGljZXM6IGVhY2ggc2xpY2UncyBvdXRsaW5lc1xuICogZmlsbGVkIChlYWNoIGZlYXR1cmUgZXZlbi1vZGQsIHRoZSBmZWF0dXJlcyBhcyB0aGVpciB1bmlvbikgaW50byBhIHZveGVsIG1hc2ssIHRoZSBtYXNrJ3NcbiAqIGJvdW5kYXJ5IG1lc2hlZCBieSBzdXJmYWNlIG5ldHMgYW5kIHNtb290aGVkOyBhbmQgaXRzIG9wZW4gbGluZXMgbG9mdGVkIGludG8gYSBzaGVldC5cbiAqXG4gKiBQdXJlOiB1c2FibGUgZnJvbSB3b3JrZXJzLlxuICovXG5pbXBvcnQgeyBwb2ludEluUmluZywgcmluZ0FyZWEsIHNtb290aE1lc2gsIHN1cmZhY2VOZXRzIH0gZnJvbSAnbmFwYXJpLWpzL2dlb21ldHJ5JztcbmltcG9ydCB0eXBlIHsgTWVzaCB9IGZyb20gJ25hcGFyaS1qcy9nZW9tZXRyeSc7XG5cbmltcG9ydCB7IGxvZnRMaW5lcyB9IGZyb20gJy4vbG9mdCc7XG5cbi8qKlxuICogQSByZWdpb24ncyBvdXRsaW5lcyBvbiBvbmUgc2xpY2U6IHJpbmdzIGFzIGludGVybGVhdmVkIGB4LCB5YCBpbWFnZSBwaXhlbHMgKGhvbGVzIGluY2x1ZGVkKSwgYW5kXG4gKiBvcGVuIHBvbHlsaW5lcyAoYSBsYXllciBib3VuZGFyeSksIGxpa2V3aXNlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNsaWNlT3V0bGluZXMge1xuICB6OiBudW1iZXI7XG4gIHJpbmdzOiBBcnJheUxpa2U8bnVtYmVyPltdO1xuICAvKipcbiAgICogVGhlIGZlYXR1cmUgZWFjaCByaW5nIGlzIHBhcnQgb2YgKGVxdWFsIGlkcywgb25lIGZlYXR1cmUpOiBhIGZlYXR1cmUncyByaW5ncyBmaWxsIGV2ZW4tb2RkIChpdHNcbiAgICogaG9sZXMpLCB0aGUgZmVhdHVyZXMgYXMgdGhlaXIgdW5pb24sIHNvIG9uZSBpbnNpZGUgb3Igb3ZlciBhbm90aGVyIGN1dHMgbm8gaG9sZSBpbiBpdC4gQWJzZW50OlxuICAgKiB0aGUgcmluZ3MgYXJlIG9uZSBmZWF0dXJlLlxuICAgKi9cbiAgcmluZ0dyb3Vwcz86IEFycmF5TGlrZTxudW1iZXI+O1xuICBsaW5lcz86IEFycmF5TGlrZTxudW1iZXI+W107XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVjb25zdHJ1Y3RPcHRpb25zIHtcbiAgLyoqIEluLXBsYW5lIHZveGVsIGVkZ2UsIGltYWdlIHB4IChkZWZhdWx0IDEpLiBSYWlzZWQgdG8ga2VlcCB0aGUgbWFzayB3aXRoaW4gYG1heFZveGVsc2AuICovXG4gIHBpeGVsU3RlcD86IG51bWJlcjtcbiAgLyoqIEF0IG1vc3QgdGhpcyBtYW55IHZveGVscyAoZGVmYXVsdCAzMiBNKS4gKi9cbiAgbWF4Vm94ZWxzPzogbnVtYmVyO1xuICAvKiogTGFwbGFjaWFuIHNtb290aGluZyBwYXNzZXMgKGRlZmF1bHQgMikuICovXG4gIHNtb290aD86IG51bWJlcjtcbn1cblxuLyoqXG4gKiBUaGUgbWVzaCBvZiB0aGUgcmVnaW9uIG91dGxpbmVkIGJ5IGBzbGljZXNgLCBpbiBpbWFnZSBwaXhlbHMgKHgsIHkpIGFuZCBzbGljZSBpbmRpY2VzICh6OiBzbGljZVxuICogaydzIHBsYW5lIGF0IHogPSBrKTogdGhlIGZpbGxlZCBvdXRsaW5lcycgc3VyZmFjZSwgYW5kIHRoZSBzaGVldCB0aHJvdWdoIHRoZSBsaW5lcyAoc2VlXG4gKiB7QGxpbmsgbG9mdExpbmVzfSkuIEVtcHR5IHdoZW4gbm8gc2xpY2UgaGFzIGFuIGFyZWEgYW5kIG5vIHR3byBzbGljZXMgaGF2ZSBsaW5lcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlY29uc3RydWN0KHNsaWNlczogcmVhZG9ubHkgU2xpY2VPdXRsaW5lc1tdLCBvcHRzOiBSZWNvbnN0cnVjdE9wdGlvbnMgPSB7fSk6IE1lc2gge1xuICBjb25zdCBmaWxsZWQgPSBmaWxsKHNsaWNlcywgb3B0cyk7XG4gIGNvbnN0IGxpbmVzID0gc2xpY2VzLmZpbHRlcigocykgPT4gcy5saW5lcz8ubGVuZ3RoKTtcbiAgaWYgKCFsaW5lcy5sZW5ndGgpIHJldHVybiBmaWxsZWQ7XG4gIGNvbnN0IHNoZWV0ID0gbG9mdExpbmVzKFxuICAgIGxpbmVzLm1hcCgocykgPT4gKHsgejogcy56LCBsaW5lczogcy5saW5lcyA/PyBbXSB9KSksXG4gICAgb3B0cy5waXhlbFN0ZXAgPz8gMSxcbiAgKTtcbiAgcmV0dXJuIG1lcmdlTWVzaGVzKGZpbGxlZCwgc2hlZXQpO1xufVxuXG4vKiogVGhlIHN1cmZhY2Ugb2YgdGhlIGZpbGxlZCBvdXRsaW5lcy4gKi9cbmZ1bmN0aW9uIGZpbGwoc2xpY2VzOiByZWFkb25seSBTbGljZU91dGxpbmVzW10sIG9wdHM6IFJlY29uc3RydWN0T3B0aW9ucyk6IE1lc2gge1xuICBsZXQgeDAgPSBJbmZpbml0eSxcbiAgICB5MCA9IEluZmluaXR5LFxuICAgIHgxID0gLUluZmluaXR5LFxuICAgIHkxID0gLUluZmluaXR5LFxuICAgIHowID0gSW5maW5pdHksXG4gICAgejEgPSAtSW5maW5pdHk7XG4gIGZvciAoY29uc3QgcyBvZiBzbGljZXMpIHtcbiAgICBmb3IgKGNvbnN0IHIgb2Ygcy5yaW5ncykge1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgKyAxIDwgci5sZW5ndGg7IGkgKz0gMikge1xuICAgICAgICBpZiAocltpXSA8IHgwKSB4MCA9IHJbaV07XG4gICAgICAgIGlmIChyW2ldID4geDEpIHgxID0gcltpXTtcbiAgICAgICAgaWYgKHJbaSArIDFdIDwgeTApIHkwID0gcltpICsgMV07XG4gICAgICAgIGlmIChyW2kgKyAxXSA+IHkxKSB5MSA9IHJbaSArIDFdO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAocy5yaW5ncy5sZW5ndGgpIHtcbiAgICAgIHowID0gTWF0aC5taW4oejAsIHMueik7XG4gICAgICB6MSA9IE1hdGgubWF4KHoxLCBzLnopO1xuICAgIH1cbiAgfVxuICBpZiAoISh4MSA+IHgwKSB8fCAhKHkxID4geTApKSByZXR1cm4geyB2ZXJ0aWNlczogbmV3IEZsb2F0MzJBcnJheSgwKSwgZmFjZXM6IG5ldyBVaW50MzJBcnJheSgwKSB9O1xuICBjb25zdCBueiA9IHoxIC0gejAgKyAxO1xuICBjb25zdCBtYXhWb3hlbHMgPSBvcHRzLm1heFZveGVscyA/PyAzMl8wMDBfMDAwO1xuICBsZXQgc3RlcCA9IE1hdGgubWF4KG9wdHMucGl4ZWxTdGVwID8/IDEsIDFlLTYpO1xuICB3aGlsZSAoTWF0aC5jZWlsKCh4MSAtIHgwKSAvIHN0ZXApICogTWF0aC5jZWlsKCh5MSAtIHkwKSAvIHN0ZXApICogbnogPiBtYXhWb3hlbHMpIHN0ZXAgKj0gMS4yNTtcbiAgY29uc3QgbnggPSBNYXRoLm1heCgxLCBNYXRoLmNlaWwoKHgxIC0geDApIC8gc3RlcCkpO1xuICBjb25zdCBueSA9IE1hdGgubWF4KDEsIE1hdGguY2VpbCgoeTEgLSB5MCkgLyBzdGVwKSk7XG4gIGNvbnN0IG1hc2sgPSBuZXcgVWludDhBcnJheShueCAqIG55ICogbnopO1xuICBmb3IgKGNvbnN0IHMgb2Ygc2xpY2VzKSB7XG4gICAgZm9yIChjb25zdCByaW5ncyBvZiBmZWF0dXJlUmluZ3Mocy5yaW5ncywgcy5yaW5nR3JvdXBzKSkge1xuICAgICAgZmlsbFNsaWNlKG1hc2ssIG54LCBueSwgKHMueiAtIHowKSAqIG54ICogbnksIHJpbmdzLCB4MCwgeTAsIHN0ZXApO1xuICAgIH1cbiAgfVxuXG4gIC8vIFZveGVsIGkgc3Bhbm5pbmcgW2ksIGkgKyAxKSAobmFwYXJpLWpzIGNlbnRyZXMgaXQgb24gaSk6IHRoZSBzY2FsaW5nIGJlbG93IG1hcHMgY2VsbCBlZGdlcyB0byBweC5cbiAgY29uc3QgbWVzaCA9IHNtb290aE1lc2goc3VyZmFjZU5ldHMobWFzaywgW254LCBueSwgbnpdLCB7IG9yaWdpbjogWzAuNSwgMC41LCAwLjVdIH0pLCB7XG4gICAgaXRlcmF0aW9uczogb3B0cy5zbW9vdGggPz8gMixcbiAgfSk7XG4gIGNvbnN0IHYgPSBtZXNoLnZlcnRpY2VzO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHYubGVuZ3RoOyBpICs9IDMpIHtcbiAgICB2W2ldID0geDAgKyB2W2ldICogc3RlcDtcbiAgICB2W2kgKyAxXSA9IHkwICsgdltpICsgMV0gKiBzdGVwO1xuICAgIC8vIFZveGVsIGsgc3BhbnMgW2ssIGsrMSkgd2l0aCBpdHMgY2VudHJlICh0aGUgc2xpY2UpIGF0IGsgKyAwLjUuXG4gICAgdltpICsgMl0gPSB6MCArIHZbaSArIDJdIC0gMC41O1xuICB9XG4gIHJldHVybiBtZXNoO1xufVxuXG4vKiogYGFgIGFuZCBgYmAgYXMgb25lIG1lc2guICovXG5mdW5jdGlvbiBtZXJnZU1lc2hlcyhhOiBNZXNoLCBiOiBNZXNoKTogTWVzaCB7XG4gIGlmICghYi5mYWNlcy5sZW5ndGgpIHJldHVybiBhO1xuICBpZiAoIWEuZmFjZXMubGVuZ3RoKSByZXR1cm4gYjtcbiAgY29uc3QgdmVydGljZXMgPSBuZXcgRmxvYXQzMkFycmF5KGEudmVydGljZXMubGVuZ3RoICsgYi52ZXJ0aWNlcy5sZW5ndGgpO1xuICB2ZXJ0aWNlcy5zZXQoYS52ZXJ0aWNlcyk7XG4gIHZlcnRpY2VzLnNldChiLnZlcnRpY2VzLCBhLnZlcnRpY2VzLmxlbmd0aCk7XG4gIGNvbnN0IGZhY2VzID0gbmV3IFVpbnQzMkFycmF5KGEuZmFjZXMubGVuZ3RoICsgYi5mYWNlcy5sZW5ndGgpO1xuICBmYWNlcy5zZXQoYS5mYWNlcyk7XG4gIGNvbnN0IG9mZnNldCA9IGEudmVydGljZXMubGVuZ3RoIC8gMztcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBiLmZhY2VzLmxlbmd0aDsgaSsrKSBmYWNlc1thLmZhY2VzLmxlbmd0aCArIGldID0gYi5mYWNlc1tpXSArIG9mZnNldDtcbiAgcmV0dXJuIHsgdmVydGljZXMsIGZhY2VzIH07XG59XG5cbi8qKlxuICogRmlsbCBvbmUgZmVhdHVyZSBpbnRvIG9uZSBzbGljZSBvZiB0aGUgbWFzazogZXZlbi1vZGQgb3ZlciBpdHMgYHJpbmdzYCwgc2FtcGxlZCBhdCB2b3hlbFxuICogY2VudHJlcy4gQ2VsbHMgYWxyZWFkeSBzZXQgc3RheSBzZXQsIHNvIHRoZSBmZWF0dXJlcyBvZiBhIHNsaWNlIGZpbGwgYXMgdGhlaXIgdW5pb24uXG4gKi9cbmZ1bmN0aW9uIGZpbGxTbGljZShcbiAgbWFzazogVWludDhBcnJheSxcbiAgbng6IG51bWJlcixcbiAgbnk6IG51bWJlcixcbiAgb2Zmc2V0OiBudW1iZXIsXG4gIHJpbmdzOiByZWFkb25seSBBcnJheUxpa2U8bnVtYmVyPltdLFxuICB4MDogbnVtYmVyLFxuICB5MDogbnVtYmVyLFxuICBzdGVwOiBudW1iZXIsXG4pOiB2b2lkIHtcbiAgY29uc3QgY3Jvc3NpbmdzOiBudW1iZXJbXSA9IFtdO1xuICAvLyBPbmx5IHRoZSByb3dzIHRoZSBmZWF0dXJlIHNwYW5zLlxuICBsZXQgdG9wID0gSW5maW5pdHksXG4gICAgYm90dG9tID0gLUluZmluaXR5O1xuICBmb3IgKGNvbnN0IHIgb2YgcmluZ3MpIHtcbiAgICBmb3IgKGxldCBpID0gMTsgaSA8IHIubGVuZ3RoOyBpICs9IDIpIHtcbiAgICAgIGlmIChyW2ldIDwgdG9wKSB0b3AgPSByW2ldO1xuICAgICAgaWYgKHJbaV0gPiBib3R0b20pIGJvdHRvbSA9IHJbaV07XG4gICAgfVxuICB9XG4gIGNvbnN0IGowID0gTWF0aC5tYXgoMCwgTWF0aC5mbG9vcigodG9wIC0geTApIC8gc3RlcCAtIDAuNSkpO1xuICBjb25zdCBqMSA9IE1hdGgubWluKG55IC0gMSwgTWF0aC5jZWlsKChib3R0b20gLSB5MCkgLyBzdGVwIC0gMC41KSk7XG4gIGZvciAobGV0IGogPSBqMDsgaiA8PSBqMTsgaisrKSB7XG4gICAgY29uc3QgeSA9IHkwICsgKGogKyAwLjUpICogc3RlcDtcbiAgICBjcm9zc2luZ3MubGVuZ3RoID0gMDtcbiAgICBmb3IgKGNvbnN0IHIgb2YgcmluZ3MpIHtcbiAgICAgIGNvbnN0IG4gPSByLmxlbmd0aCA+PiAxO1xuICAgICAgZm9yIChsZXQgaSA9IDAsIGsgPSBuIC0gMTsgaSA8IG47IGsgPSBpKyspIHtcbiAgICAgICAgY29uc3QgeWEgPSByWzIgKiBpICsgMV0sXG4gICAgICAgICAgeWIgPSByWzIgKiBrICsgMV07XG4gICAgICAgIGlmICh5YSA+IHkgIT09IHliID4geSkge1xuICAgICAgICAgIGNvbnN0IHhhID0gclsyICogaV0sXG4gICAgICAgICAgICB4YiA9IHJbMiAqIGtdO1xuICAgICAgICAgIGNyb3NzaW5ncy5wdXNoKHhhICsgKCh5IC0geWEpICogKHhiIC0geGEpKSAvICh5YiAtIHlhKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGNyb3NzaW5ncy5sZW5ndGggPCAyKSBjb250aW51ZTtcbiAgICBjcm9zc2luZ3Muc29ydCgoYSwgYikgPT4gYSAtIGIpO1xuICAgIGNvbnN0IHJvdyA9IG9mZnNldCArIGogKiBueDtcbiAgICBmb3IgKGxldCBjID0gMDsgYyArIDEgPCBjcm9zc2luZ3MubGVuZ3RoOyBjICs9IDIpIHtcbiAgICAgIGNvbnN0IGZyb20gPSBNYXRoLm1heCgwLCBNYXRoLmNlaWwoKGNyb3NzaW5nc1tjXSAtIHgwKSAvIHN0ZXAgLSAwLjUpKTtcbiAgICAgIGNvbnN0IHRvID0gTWF0aC5taW4obnggLSAxLCBNYXRoLmZsb29yKChjcm9zc2luZ3NbYyArIDFdIC0geDApIC8gc3RlcCAtIDAuNSkpO1xuICAgICAgZm9yIChsZXQgaSA9IGZyb207IGkgPD0gdG87IGkrKykgbWFza1tyb3cgKyBpXSA9IDE7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogVGhlIGFyZWEgaW5zaWRlIGByaW5nc2AgKGludGVybGVhdmVkIGB4LCB5YCksIGV2ZW4tb2RkOiBhIHJpbmcgaW5zaWRlIGFuIG9kZCBudW1iZXIgb2Ygb3RoZXJzIGlzXG4gKiBhIGhvbGUuIEV4YWN0IGZvciByaW5ncyB0aGF0IGRvIG5vdCBjcm9zcyAoYSBwb2x5Z29uIHNldCdzIGV4dGVyaW9ycyBhbmQgaG9sZXMpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmluZ3NBcmVhKHJpbmdzOiByZWFkb25seSBBcnJheUxpa2U8bnVtYmVyPltdKTogbnVtYmVyIHtcbiAgY29uc3QgYm94ZXMgPSByaW5ncy5tYXAocmluZ0JveCk7XG4gIGxldCBhcmVhID0gMDtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCByaW5ncy5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IHIgPSByaW5nc1tpXTtcbiAgICBpZiAoci5sZW5ndGggPCA2KSBjb250aW51ZTtcbiAgICBjb25zdCB4ID0gclswXSxcbiAgICAgIHkgPSByWzFdO1xuICAgIGxldCBkZXB0aCA9IDA7XG4gICAgZm9yIChsZXQgaiA9IDA7IGogPCByaW5ncy5sZW5ndGg7IGorKykge1xuICAgICAgaWYgKGogPT09IGkpIGNvbnRpbnVlO1xuICAgICAgY29uc3QgYiA9IGJveGVzW2pdO1xuICAgICAgaWYgKHggPCBiWzBdIHx8IHggPiBiWzJdIHx8IHkgPCBiWzFdIHx8IHkgPiBiWzNdKSBjb250aW51ZTtcbiAgICAgIGlmIChwb2ludEluUmluZyh4LCB5LCByaW5nc1tqXSkpIGRlcHRoKys7XG4gICAgfVxuICAgIGFyZWEgKz0gKGRlcHRoICUgMiA/IC0xIDogMSkgKiBNYXRoLmFicyhyaW5nQXJlYShyKSk7XG4gIH1cbiAgcmV0dXJuIE1hdGgubWF4KDAsIGFyZWEpO1xufVxuXG4vKipcbiAqIFRoZSByaW5ncyBvZiBlYWNoIGZlYXR1cmUgKHNlZSB7QGxpbmsgU2xpY2VPdXRsaW5lcy5yaW5nR3JvdXBzfSksIGluIHRoZSBvcmRlciBmaXJzdCBtZXQ7IG9uZVxuICogZmVhdHVyZSBvZiBldmVyeSByaW5nIHdpdGhvdXQgYGdyb3Vwc2AuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmZWF0dXJlUmluZ3MoXG4gIHJpbmdzOiByZWFkb25seSBBcnJheUxpa2U8bnVtYmVyPltdLFxuICBncm91cHM/OiBBcnJheUxpa2U8bnVtYmVyPixcbik6IEFycmF5TGlrZTxudW1iZXI+W11bXSB7XG4gIGlmICghZ3JvdXBzIHx8ICFyaW5ncy5sZW5ndGgpIHJldHVybiByaW5ncy5sZW5ndGggPyBbcmluZ3Muc2xpY2UoKV0gOiBbXTtcbiAgY29uc3QgYnlHcm91cCA9IG5ldyBNYXA8bnVtYmVyLCBBcnJheUxpa2U8bnVtYmVyPltdPigpO1xuICByaW5ncy5mb3JFYWNoKChyLCBpKSA9PiB7XG4gICAgY29uc3QgZyA9IGdyb3Vwc1tpXSA/PyAwO1xuICAgIGNvbnN0IGZlYXR1cmUgPSBieUdyb3VwLmdldChnKTtcbiAgICBpZiAoZmVhdHVyZSkgZmVhdHVyZS5wdXNoKHIpO1xuICAgIGVsc2UgYnlHcm91cC5zZXQoZywgW3JdKTtcbiAgfSk7XG4gIHJldHVybiBbLi4uYnlHcm91cC52YWx1ZXMoKV07XG59XG5cbi8qKlxuICogVGhlIGFyZWEgb2YgYSBzbGljZSdzIG91dGxpbmVzIChweMKyKTogZWFjaCBmZWF0dXJlJ3MgKGV2ZW4tb2RkLCBzZWUge0BsaW5rIHJpbmdzQXJlYX0pLCB0aGVcbiAqIGZlYXR1cmVzIGFzIHRoZWlyIHVuaW9uLCBzbyBhIGZlYXR1cmUgaW5zaWRlIG9yIG92ZXIgYW5vdGhlciBvZiB0aGUgc2xpY2UgYWRkcyBvbmx5IHdoYXQgaXRcbiAqIGNvdmVycyBiZXlvbmQgaXQuIEZlYXR1cmVzIHdob3NlIGV4dGVudHMgb3ZlcmxhcCBhcmUgbWVhc3VyZWQgdG9nZXRoZXIsIGJ5IHRoZSBsZW5ndGggb2YgdGhlaXJcbiAqIHVuaW9uIGFsb25nIGVhY2ggcm93LCBleGFjdCBiZXR3ZWVuIHRoZSByb3dzIHRocm91Z2ggdGhlaXIgdmVydGljZXMgd2hlcmUgbm8gb3V0bGluZSBjcm9zc2VzXG4gKiBhbm90aGVyIChhbmQgcmVmaW5lZCB3aGVyZSBvbmUgZG9lcykuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBvdXRsaW5lc0FyZWEocmluZ3M6IHJlYWRvbmx5IEFycmF5TGlrZTxudW1iZXI+W10sIGdyb3Vwcz86IEFycmF5TGlrZTxudW1iZXI+KTogbnVtYmVyIHtcbiAgY29uc3QgZmVhdHVyZXMgPSBmZWF0dXJlUmluZ3MocmluZ3MsIGdyb3VwcykubWFwKChmKSA9PiAoeyByaW5nczogZiwgYm94OiBmZWF0dXJlQm94KGYpIH0pKTtcbiAgaWYgKGZlYXR1cmVzLmxlbmd0aCA8IDIpIHJldHVybiBmZWF0dXJlcy5sZW5ndGggPyByaW5nc0FyZWEoZmVhdHVyZXNbMF0ucmluZ3MpIDogMDtcbiAgLy8gRmVhdHVyZXMgd2hvc2UgZXh0ZW50cyBvdmVybGFwLCBqb2luZWQgKGJ5IHgsIHNvIGEgZmVhdHVyZSBtZWV0cyBvbmx5IHRob3NlIGl0IGNhbiBvdmVybGFwKS5cbiAgZmVhdHVyZXMuc29ydCgoYSwgYikgPT4gYS5ib3hbMF0gLSBiLmJveFswXSk7XG4gIGNvbnN0IHBhcmVudCA9IGZlYXR1cmVzLm1hcCgoXywgaSkgPT4gaSk7XG4gIGNvbnN0IHJvb3QgPSAoaTogbnVtYmVyKTogbnVtYmVyID0+IChwYXJlbnRbaV0gPT09IGkgPyBpIDogKHBhcmVudFtpXSA9IHJvb3QocGFyZW50W2ldKSkpO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGZlYXR1cmVzLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3QgYSA9IGZlYXR1cmVzW2ldLmJveDtcbiAgICBmb3IgKGxldCBqID0gaSArIDE7IGogPCBmZWF0dXJlcy5sZW5ndGggJiYgZmVhdHVyZXNbal0uYm94WzBdIDwgYVsyXTsgaisrKSB7XG4gICAgICBjb25zdCBiID0gZmVhdHVyZXNbal0uYm94O1xuICAgICAgaWYgKGJbMV0gPCBhWzNdICYmIGFbMV0gPCBiWzNdKSBwYXJlbnRbcm9vdChqKV0gPSByb290KGkpO1xuICAgIH1cbiAgfVxuICBjb25zdCBjbHVzdGVycyA9IG5ldyBNYXA8bnVtYmVyLCBBcnJheUxpa2U8bnVtYmVyPltdW10+KCk7XG4gIGZlYXR1cmVzLmZvckVhY2goKGYsIGkpID0+IHtcbiAgICBjb25zdCByID0gcm9vdChpKTtcbiAgICBjb25zdCBjbHVzdGVyID0gY2x1c3RlcnMuZ2V0KHIpO1xuICAgIGlmIChjbHVzdGVyKSBjbHVzdGVyLnB1c2goZi5yaW5ncyk7XG4gICAgZWxzZSBjbHVzdGVycy5zZXQociwgW2YucmluZ3NdKTtcbiAgfSk7XG4gIGxldCBhcmVhID0gMDtcbiAgZm9yIChjb25zdCBjbHVzdGVyIG9mIGNsdXN0ZXJzLnZhbHVlcygpKVxuICAgIGFyZWEgKz0gY2x1c3Rlci5sZW5ndGggPT09IDEgPyByaW5nc0FyZWEoY2x1c3RlclswXSkgOiB1bmlvbkFyZWEoY2x1c3Rlcik7XG4gIHJldHVybiBhcmVhO1xufVxuXG4vKipcbiAqIFRoZSB2b2x1bWUgb2YgdGhlIHJlZ2lvbiBvdXRsaW5lZCBieSBgc2xpY2VzYCwgaW4gcHjCsiDDlyBzbGljZXMgKG9uZSBzbGljZSB0aGljayBwZXIgb3V0bGluZSk6XG4gKiB0aGUgc3VtIG9mIGVhY2ggc2xpY2UncyBhcmVhIChzZWUge0BsaW5rIG91dGxpbmVzQXJlYX07IENhdmFsaWVyaSdzIGVzdGltYXRvcikuIFRpbWVzIMK1bSBwZXIgcHjCslxuICogYW5kIHBlciBzbGljZSwgwrVtwrMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBvdXRsaW5lZFZvbHVtZShzbGljZXM6IHJlYWRvbmx5IFNsaWNlT3V0bGluZXNbXSk6IG51bWJlciB7XG4gIGxldCB2ID0gMDtcbiAgZm9yIChjb25zdCBzIG9mIHNsaWNlcykgdiArPSBvdXRsaW5lc0FyZWEocy5yaW5ncywgcy5yaW5nR3JvdXBzKTtcbiAgcmV0dXJuIHY7XG59XG5cbi8qKiBUaGUgYXJlYSBvZiB0aGUgdW5pb24gb2YgYGZlYXR1cmVzYCAoZWFjaCBldmVuLW9kZCBvdmVyIGl0cyByaW5ncyksIHJvdyBiYW5kIGJ5IHJvdyBiYW5kLiAqL1xuZnVuY3Rpb24gdW5pb25BcmVhKGZlYXR1cmVzOiByZWFkb25seSBBcnJheUxpa2U8bnVtYmVyPltdW10pOiBudW1iZXIge1xuICBjb25zdCB5czogbnVtYmVyW10gPSBbXTtcbiAgZm9yIChjb25zdCBmIG9mIGZlYXR1cmVzKSBmb3IgKGNvbnN0IHIgb2YgZikgZm9yIChsZXQgaSA9IDE7IGkgPCByLmxlbmd0aDsgaSArPSAyKSB5cy5wdXNoKHJbaV0pO1xuICB5cy5zb3J0KChhLCBiKSA9PiBhIC0gYik7XG4gIGxldCBhcmVhID0gMDtcbiAgZm9yIChsZXQgayA9IDA7IGsgKyAxIDwgeXMubGVuZ3RoOyBrKyspIGlmICh5c1trICsgMV0gPiB5c1trXSkgYXJlYSArPSBiYW5kQXJlYShmZWF0dXJlcywgeXNba10sIHlzW2sgKyAxXSwgMCk7XG4gIHJldHVybiBhcmVhO1xufVxuXG4vKipcbiAqIFRoZSB1bmlvbidzIGFyZWEgYmV0d2VlbiByb3dzIGBhYCBhbmQgYGJgLiBCZXR3ZWVuIHR3byB2ZXJ0aWNlcycgcm93cyBpdHMgd2lkdGggYWxvbmcgYSByb3cgaXNcbiAqIGxpbmVhciBpbiB5IHVubGVzcyBvdXRsaW5lcyBjcm9zcyB0aGVyZTogdGhlbiB0aGUgYmFuZCBpcyBoYWx2ZWQgdW50aWwgaXQgaXMgKG9yIHRoaW4gZW5vdWdoKS5cbiAqL1xuZnVuY3Rpb24gYmFuZEFyZWEoZmVhdHVyZXM6IHJlYWRvbmx5IEFycmF5TGlrZTxudW1iZXI+W11bXSwgYTogbnVtYmVyLCBiOiBudW1iZXIsIGRlcHRoOiBudW1iZXIpOiBudW1iZXIge1xuICBjb25zdCBoID0gYiAtIGE7XG4gIGNvbnN0IGF0ID0gKHQ6IG51bWJlcikgPT4gdW5pb25XaWR0aChmZWF0dXJlcywgYSArIHQgKiBoKTtcbiAgY29uc3QgbWlkID0gYXQoMC41KTtcbiAgaWYgKGRlcHRoID49IDEwKSByZXR1cm4gaCAqIG1pZDtcbiAgY29uc3QgZSA9IDFlLTY7XG4gIGNvbnN0IHRvbCA9IDFlLTkgKiAoMSArIE1hdGguYWJzKG1pZCkpO1xuICBjb25zdCBsaW5lYXIgPSBNYXRoLmFicyhhdCgwLjI1KSArIGF0KDAuNzUpIC0gMiAqIG1pZCkgPD0gdG9sICYmIE1hdGguYWJzKGF0KGUpICsgYXQoMSAtIGUpIC0gMiAqIG1pZCkgPD0gdG9sO1xuICBpZiAobGluZWFyKSByZXR1cm4gaCAqIG1pZDtcbiAgY29uc3QgbSA9IGEgKyBoIC8gMjtcbiAgcmV0dXJuIGJhbmRBcmVhKGZlYXR1cmVzLCBhLCBtLCBkZXB0aCArIDEpICsgYmFuZEFyZWEoZmVhdHVyZXMsIG0sIGIsIGRlcHRoICsgMSk7XG59XG5cbi8qKiBUaGUgbGVuZ3RoIG9mIHRoZSB1bmlvbiBvZiBgZmVhdHVyZXNgIGFsb25nIHRoZSByb3cgYHlgLiAqL1xuZnVuY3Rpb24gdW5pb25XaWR0aChmZWF0dXJlczogcmVhZG9ubHkgQXJyYXlMaWtlPG51bWJlcj5bXVtdLCB5OiBudW1iZXIpOiBudW1iZXIge1xuICBjb25zdCBzcGFuczogQXJyYXk8W251bWJlciwgbnVtYmVyXT4gPSBbXTtcbiAgY29uc3QgeHM6IG51bWJlcltdID0gW107XG4gIGZvciAoY29uc3QgZiBvZiBmZWF0dXJlcykge1xuICAgIHhzLmxlbmd0aCA9IDA7XG4gICAgZm9yIChjb25zdCByIG9mIGYpIHtcbiAgICAgIGNvbnN0IG4gPSByLmxlbmd0aCA+PiAxO1xuICAgICAgZm9yIChsZXQgaSA9IDAsIGsgPSBuIC0gMTsgaSA8IG47IGsgPSBpKyspIHtcbiAgICAgICAgY29uc3QgeWEgPSByWzIgKiBpICsgMV0sXG4gICAgICAgICAgeWIgPSByWzIgKiBrICsgMV07XG4gICAgICAgIGlmICh5YSA+IHkgIT09IHliID4geSkgeHMucHVzaChyWzIgKiBpXSArICgoeSAtIHlhKSAqIChyWzIgKiBrXSAtIHJbMiAqIGldKSkgLyAoeWIgLSB5YSkpO1xuICAgICAgfVxuICAgIH1cbiAgICB4cy5zb3J0KChwLCBxKSA9PiBwIC0gcSk7XG4gICAgZm9yIChsZXQgYyA9IDA7IGMgKyAxIDwgeHMubGVuZ3RoOyBjICs9IDIpIHNwYW5zLnB1c2goW3hzW2NdLCB4c1tjICsgMV1dKTtcbiAgfVxuICBzcGFucy5zb3J0KChwLCBxKSA9PiBwWzBdIC0gcVswXSk7XG4gIGxldCB3aWR0aCA9IDAsXG4gICAgZnJvbSA9IC1JbmZpbml0eSxcbiAgICB0byA9IC1JbmZpbml0eTtcbiAgZm9yIChjb25zdCBbczAsIHMxXSBvZiBzcGFucykge1xuICAgIGlmIChzMCA+IHRvKSB7XG4gICAgICBpZiAodG8gPiBmcm9tKSB3aWR0aCArPSB0byAtIGZyb207XG4gICAgICBmcm9tID0gczA7XG4gICAgICB0byA9IHMxO1xuICAgIH0gZWxzZSBpZiAoczEgPiB0bykgdG8gPSBzMTtcbiAgfVxuICBpZiAodG8gPiBmcm9tKSB3aWR0aCArPSB0byAtIGZyb207XG4gIHJldHVybiB3aWR0aDtcbn1cblxuLyoqIFRoZSBleHRlbnQgb2YgYSBmZWF0dXJlJ3MgcmluZ3MuICovXG5mdW5jdGlvbiBmZWF0dXJlQm94KHJpbmdzOiByZWFkb25seSBBcnJheUxpa2U8bnVtYmVyPltdKTogW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl0ge1xuICBjb25zdCBib3g6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdID0gW0luZmluaXR5LCBJbmZpbml0eSwgLUluZmluaXR5LCAtSW5maW5pdHldO1xuICBmb3IgKGNvbnN0IHIgb2YgcmluZ3MpIHtcbiAgICBjb25zdCBbeDAsIHkwLCB4MSwgeTFdID0gcmluZ0JveChyKTtcbiAgICBib3hbMF0gPSBNYXRoLm1pbihib3hbMF0sIHgwKTtcbiAgICBib3hbMV0gPSBNYXRoLm1pbihib3hbMV0sIHkwKTtcbiAgICBib3hbMl0gPSBNYXRoLm1heChib3hbMl0sIHgxKTtcbiAgICBib3hbM10gPSBNYXRoLm1heChib3hbM10sIHkxKTtcbiAgfVxuICByZXR1cm4gYm94O1xufVxuXG5mdW5jdGlvbiByaW5nQm94KHI6IEFycmF5TGlrZTxudW1iZXI+KTogW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl0ge1xuICBsZXQgeDAgPSBJbmZpbml0eSxcbiAgICB5MCA9IEluZmluaXR5LFxuICAgIHgxID0gLUluZmluaXR5LFxuICAgIHkxID0gLUluZmluaXR5O1xuICBmb3IgKGxldCBpID0gMDsgaSArIDEgPCByLmxlbmd0aDsgaSArPSAyKSB7XG4gICAgaWYgKHJbaV0gPCB4MCkgeDAgPSByW2ldO1xuICAgIGlmIChyW2ldID4geDEpIHgxID0gcltpXTtcbiAgICBpZiAocltpICsgMV0gPCB5MCkgeTAgPSByW2kgKyAxXTtcbiAgICBpZiAocltpICsgMV0gPiB5MSkgeTEgPSByW2kgKyAxXTtcbiAgfVxuICByZXR1cm4gW3gwLCB5MCwgeDEsIHkxXTtcbn1cbiJdfQ==
|
|
325
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVjb25zdHJ1Y3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL2dlb21ldHJ5L3JlY29uc3RydWN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7R0FNRztBQUNILE9BQU8sRUFBRSxXQUFXLEVBQUUsUUFBUSxFQUFFLFVBQVUsRUFBRSxXQUFXLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUdwRixPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sUUFBUSxDQUFDO0FBMkJuQzs7OztHQUlHO0FBQ0gsTUFBTSxVQUFVLFdBQVcsQ0FBQyxNQUFnQyxFQUFFLE9BQTJCLEVBQUU7SUFDekYsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsQ0FBQztJQUNsQyxNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQ3BELElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTTtRQUFFLE9BQU8sTUFBTSxDQUFDO0lBQ2pDLE1BQU0sS0FBSyxHQUFHLFNBQVMsQ0FDckIsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUMsS0FBSyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFDcEQsSUFBSSxDQUFDLFNBQVMsSUFBSSxDQUFDLENBQ3BCLENBQUM7SUFDRixPQUFPLFdBQVcsQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLENBQUM7QUFDcEMsQ0FBQztBQUVELDBDQUEwQztBQUMxQyxTQUFTLElBQUksQ0FBQyxNQUFnQyxFQUFFLElBQXdCO0lBQ3RFLElBQUksRUFBRSxHQUFHLFFBQVEsRUFDZixFQUFFLEdBQUcsUUFBUSxFQUNiLEVBQUUsR0FBRyxDQUFDLFFBQVEsRUFDZCxFQUFFLEdBQUcsQ0FBQyxRQUFRLEVBQ2QsRUFBRSxHQUFHLFFBQVEsRUFDYixFQUFFLEdBQUcsQ0FBQyxRQUFRLENBQUM7SUFDakIsS0FBSyxNQUFNLENBQUMsSUFBSSxNQUFNLEVBQUUsQ0FBQztRQUN2QixLQUFLLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUN4QixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO2dCQUN6QyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFO29CQUFFLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ3pCLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUU7b0JBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDekIsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUU7b0JBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7Z0JBQ2pDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFO29CQUFFLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQ25DLENBQUM7UUFDSCxDQUFDO1FBQ0QsSUFBSSxDQUFDLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ25CLEVBQUUsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDdkIsRUFBRSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN6QixDQUFDO0lBQ0gsQ0FBQztJQUNELElBQUksQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQztRQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsSUFBSSxZQUFZLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxFQUFFLElBQUksV0FBVyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7SUFDbEcsTUFBTSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDdkIsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLFNBQVMsSUFBSSxVQUFVLENBQUM7SUFDL0MsSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsU0FBUyxJQUFJLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztJQUMvQyxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsU0FBUztRQUFFLElBQUksSUFBSSxJQUFJLENBQUM7SUFDaEcsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQ3BELE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUNwRCxNQUFNLElBQUksR0FBRyxJQUFJLFVBQVUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDO0lBQzFDLEtBQUssTUFBTSxDQUFDLElBQUksTUFBTSxFQUFFLENBQUM7UUFDdkIsS0FBSyxNQUFN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QUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDO2dCQUMxRCxDQUFDO1lBQ0gsQ0FBQztRQUNILENBQUM7UUFDRCxJQUFJLFNBQVMsQ0FBQyxNQUFNLEdBQUcsQ0FBQztZQUFFLFNBQVM7UUFDbkMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUNoQyxNQUFNLEdBQUcsR0FBRyxNQUFNLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUM1QixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1lBQ2pELE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDdEUsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQzlFLEtBQUssSUFBSSxDQUFDLEdBQUcsSUFBSSxFQUFFLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxFQUFFO2dCQUFFLElBQUksQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3JELENBQUM7SUFDSCxDQUFDO0FBQ0gsQ0FBQztBQUVEOzs7R0FHRztBQUNILE1BQU0sVUFBVSxTQUFTLENBQUMsS0FBbUM7SUFD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SSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUU7WUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUNqQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRTtZQUFFLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQ25DLENBQUM7SUFDRCxPQUFPLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7QUFDMUIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogVGhlIDNEIHJlY29uc3RydWN0aW9uIG9mIGEgcmVnaW9uIGZyb20gaXRzIG91dGxpbmVzIG9uIGEgc3RhY2sgb2Ygc2xpY2VzOiBlYWNoIHNsaWNlJ3Mgb3V0bGluZXNcbiAqIGZpbGxlZCAoZWFjaCBmZWF0dXJlIGV2ZW4tb2RkLCB0aGUgZmVhdHVyZXMgYXMgdGhlaXIgdW5pb24pIGludG8gYSB2b3hlbCBtYXNrLCB0aGUgbWFzaydzXG4gKiBib3VuZGFyeSBtZXNoZWQgYnkgc3VyZmFjZSBuZXRzIGFuZCBzbW9vdGhlZDsgYW5kIGl0cyBvcGVuIGxpbmVzIGxvZnRlZCBpbnRvIGEgc2hlZXQuXG4gKlxuICogUHVyZTogdXNhYmxlIGZyb20gd29ya2Vycy5cbiAqL1xuaW1wb3J0IHsgcG9pbnRJblJpbmcsIHJpbmdBcmVhLCBzbW9vdGhNZXNoLCBzdXJmYWNlTmV0cyB9IGZyb20gJ25hcGFyaS1qcy9nZW9tZXRyeSc7XG5pbXBvcnQgdHlwZSB7IE1lc2ggfSBmcm9tICduYXBhcmktanMvZ2VvbWV0cnknO1xuXG5pbXBvcnQgeyBsb2Z0TGluZXMgfSBmcm9tICcuL2xvZnQnO1xuXG4vKipcbiAqIEEgcmVnaW9uJ3Mgb3V0bGluZXMgb24gb25lIHNsaWNlOiByaW5ncyBhcyBpbnRlcmxlYXZlZCBgeCwgeWAgaW1hZ2UgcGl4ZWxzIChob2xlcyBpbmNsdWRlZCksIGFuZFxuICogb3BlbiBwb2x5bGluZXMgKGEgbGF5ZXIgYm91bmRhcnkpLCBsaWtld2lzZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTbGljZU91dGxpbmVzIHtcbiAgejogbnVtYmVyO1xuICByaW5nczogQXJyYXlMaWtlPG51bWJlcj5bXTtcbiAgLyoqXG4gICAqIFRoZSBmZWF0dXJlIGVhY2ggcmluZyBpcyBwYXJ0IG9mIChlcXVhbCBpZHMsIG9uZSBmZWF0dXJlKTogYSBmZWF0dXJlJ3MgcmluZ3MgZmlsbCBldmVuLW9kZCAoaXRzXG4gICAqIGhvbGVzKSwgdGhlIGZlYXR1cmVzIGFzIHRoZWlyIHVuaW9uLCBzbyBvbmUgaW5zaWRlIG9yIG92ZXIgYW5vdGhlciBjdXRzIG5vIGhvbGUgaW4gaXQuIEFic2VudDpcbiAgICogdGhlIHJpbmdzIGFyZSBvbmUgZmVhdHVyZS5cbiAgICovXG4gIHJpbmdHcm91cHM/OiBBcnJheUxpa2U8bnVtYmVyPjtcbiAgbGluZXM/OiBBcnJheUxpa2U8bnVtYmVyPltdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJlY29uc3RydWN0T3B0aW9ucyB7XG4gIC8qKiBJbi1wbGFuZSB2b3hlbCBlZGdlLCBpbWFnZSBweCAoZGVmYXVsdCAxKS4gUmFpc2VkIHRvIGtlZXAgdGhlIG1hc2sgd2l0aGluIGBtYXhWb3hlbHNgLiAqL1xuICBwaXhlbFN0ZXA/OiBudW1iZXI7XG4gIC8qKiBBdCBtb3N0IHRoaXMgbWFueSB2b3hlbHMgKGRlZmF1bHQgMzIgTSkuICovXG4gIG1heFZveGVscz86IG51bWJlcjtcbiAgLyoqIExhcGxhY2lhbiBzbW9vdGhpbmcgcGFzc2VzIChkZWZhdWx0IDIpLiAqL1xuICBzbW9vdGg/OiBudW1iZXI7XG59XG5cbi8qKlxuICogVGhlIG1lc2ggb2YgdGhlIHJlZ2lvbiBvdXRsaW5lZCBieSBgc2xpY2VzYCwgaW4gaW1hZ2UgcGl4ZWxzICh4LCB5KSBhbmQgc2xpY2UgaW5kaWNlcyAoejogc2xpY2VcbiAqIGsncyBwbGFuZSBhdCB6ID0gayk6IHRoZSBmaWxsZWQgb3V0bGluZXMnIHN1cmZhY2UsIGFuZCB0aGUgc2hlZXQgdGhyb3VnaCB0aGUgbGluZXMgKHNlZVxuICoge0BsaW5rIGxvZnRMaW5lc30pLiBFbXB0eSB3aGVuIG5vIHNsaWNlIGhhcyBhbiBhcmVhIGFuZCBubyB0d28gc2xpY2VzIGhhdmUgbGluZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWNvbnN0cnVjdChzbGljZXM6IHJlYWRvbmx5IFNsaWNlT3V0bGluZXNbXSwgb3B0czogUmVjb25zdHJ1Y3RPcHRpb25zID0ge30pOiBNZXNoIHtcbiAgY29uc3QgZmlsbGVkID0gZmlsbChzbGljZXMsIG9wdHMpO1xuICBjb25zdCBsaW5lcyA9IHNsaWNlcy5maWx0ZXIoKHMpID0+IHMubGluZXM/Lmxlbmd0aCk7XG4gIGlmICghbGluZXMubGVuZ3RoKSByZXR1cm4gZmlsbGVkO1xuICBjb25zdCBzaGVldCA9IGxvZnRMaW5lcyhcbiAgICBsaW5lcy5tYXAoKHMpID0+ICh7IHo6IHMueiwgbGluZXM6IHMubGluZXMgPz8gW10gfSkpLFxuICAgIG9wdHMucGl4ZWxTdGVwID8/IDEsXG4gICk7XG4gIHJldHVybiBtZXJnZU1lc2hlcyhmaWxsZWQsIHNoZWV0KTtcbn1cblxuLyoqIFRoZSBzdXJmYWNlIG9mIHRoZSBmaWxsZWQgb3V0bGluZXMuICovXG5mdW5jdGlvbiBmaWxsKHNsaWNlczogcmVhZG9ubHkgU2xpY2VPdXRsaW5lc1tdLCBvcHRzOiBSZWNvbnN0cnVjdE9wdGlvbnMpOiBNZXNoIHtcbiAgbGV0IHgwID0gSW5maW5pdHksXG4gICAgeTAgPSBJbmZpbml0eSxcbiAgICB4MSA9IC1JbmZpbml0eSxcbiAgICB5MSA9IC1JbmZpbml0eSxcbiAgICB6MCA9IEluZmluaXR5LFxuICAgIHoxID0gLUluZmluaXR5O1xuICBmb3IgKGNvbnN0IHMgb2Ygc2xpY2VzKSB7XG4gICAgZm9yIChjb25zdCByIG9mIHMucmluZ3MpIHtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpICsgMSA8IHIubGVuZ3RoOyBpICs9IDIpIHtcbiAgICAgICAgaWYgKHJbaV0gPCB4MCkgeDAgPSByW2ldO1xuICAgICAgICBpZiAocltpXSA+IHgxKSB4MSA9IHJbaV07XG4gICAgICAgIGlmIChyW2kgKyAxXSA8IHkwKSB5MCA9IHJbaSArIDFdO1xuICAgICAgICBpZiAocltpICsgMV0gPiB5MSkgeTEgPSByW2kgKyAxXTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHMucmluZ3MubGVuZ3RoKSB7XG4gICAgICB6MCA9IE1hdGgubWluKHowLCBzLnopO1xuICAgICAgejEgPSBNYXRoLm1heCh6MSwgcy56KTtcbiAgICB9XG4gIH1cbiAgaWYgKCEoeDEgPiB4MCkgfHwgISh5MSA+IHkwKSkgcmV0dXJuIHsgdmVydGljZXM6IG5ldyBGbG9hdDMyQXJyYXkoMCksIGZhY2VzOiBuZXcgVWludDMyQXJyYXkoMCkgfTtcbiAgY29uc3QgbnogPSB6MSAtIHowICsgMTtcbiAgY29uc3QgbWF4Vm94ZWxzID0gb3B0cy5tYXhWb3hlbHMgPz8gMzJfMDAwXzAwMDtcbiAgbGV0IHN0ZXAgPSBNYXRoLm1heChvcHRzLnBpeGVsU3RlcCA/PyAxLCAxZS02KTtcbiAgd2hpbGUgKE1hdGguY2VpbCgoeDEgLSB4MCkgLyBzdGVwKSAqIE1hdGguY2VpbCgoeTEgLSB5MCkgLyBzdGVwKSAqIG56ID4gbWF4Vm94ZWxzKSBzdGVwICo9IDEuMjU7XG4gIGNvbnN0IG54ID0gTWF0aC5tYXgoMSwgTWF0aC5jZWlsKCh4MSAtIHgwKSAvIHN0ZXApKTtcbiAgY29uc3QgbnkgPSBNYXRoLm1heCgxLCBNYXRoLmNlaWwoKHkxIC0geTApIC8gc3RlcCkpO1xuICBjb25zdCBtYXNrID0gbmV3IFVpbnQ4QXJyYXkobnggKiBueSAqIG56KTtcbiAgZm9yIChjb25zdCBzIG9mIHNsaWNlcykge1xuICAgIGZvciAoY29uc3QgcmluZ3Mgb2YgZmVhdHVyZVJpbmdzKHMucmluZ3MsIHMucmluZ0dyb3VwcykpIHtcbiAgICAgIGZpbGxTbGljZShtYXNrLCBueCwgbnksIChzLnogLSB6MCkgKiBueCAqIG55LCByaW5ncywgeDAsIHkwLCBzdGVwKTtcbiAgICB9XG4gIH1cblxuICAvLyBWb3hlbCBpIHNwYW5uaW5nIFtpLCBpICsgMSkgKG5hcGFyaS1qcyBjZW50cmVzIGl0IG9uIGkpOiB0aGUgc2NhbGluZyBiZWxvdyBtYXBzIGNlbGwgZWRnZXMgdG8gcHguXG4gIGNvbnN0IG1lc2ggPSBzbW9vdGhNZXNoKHN1cmZhY2VOZXRzKG1hc2ssIFtueCwgbnksIG56XSwgeyBvcmlnaW46IFswLjUsIDAuNSwgMC41XSB9KSwge1xuICAgIGl0ZXJhdGlvbnM6IG9wdHMuc21vb3RoID8/IDIsXG4gIH0pO1xuICBjb25zdCB2ID0gbWVzaC52ZXJ0aWNlcztcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCB2Lmxlbmd0aDsgaSArPSAzKSB7XG4gICAgdltpXSA9IHgwICsgdltpXSAqIHN0ZXA7XG4gICAgdltpICsgMV0gPSB5MCArIHZbaSArIDFdICogc3RlcDtcbiAgICAvLyBWb3hlbCBrIHNwYW5zIFtrLCBrKzEpIHdpdGggaXRzIGNlbnRyZSAodGhlIHNsaWNlKSBhdCBrICsgMC41LlxuICAgIHZbaSArIDJdID0gejAgKyB2W2kgKyAyXSAtIDAuNTtcbiAgfVxuICByZXR1cm4gbWVzaDtcbn1cblxuLyoqXG4gKiBGaWxsIG9uZSBzbGljZSdzIG91dGxpbmVzIGludG8gYG1hc2tgLCBhIGB3aWR0aCDDlyBoZWlnaHRgIGdyaWQgb2YgaW1hZ2UgcHggKHBpeGVsIGkgc3Bhbm5pbmdcbiAqIFtpLCBpICsgMSkpLCBhcyB0aGUgcmVjb25zdHJ1Y3Rpb24gZmlsbHMgdGhlbTogZWFjaCBmZWF0dXJlIGV2ZW4tb2RkLCB0aGUgZmVhdHVyZXMgYXMgdGhlaXJcbiAqIHVuaW9uLCBzYW1wbGVkIGF0IHBpeGVsIGNlbnRyZXMuIENlbGxzIGFscmVhZHkgc2V0IHN0YXkgc2V0LiBPcGVuIGxpbmVzIGVuY2xvc2Ugbm90aGluZy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZpbGxPdXRsaW5lcyhtYXNrOiBVaW50OEFycmF5LCB3aWR0aDogbnVtYmVyLCBoZWlnaHQ6IG51bWJlciwgb3V0bGluZXM6IFNsaWNlT3V0bGluZXMpOiB2b2lkIHtcbiAgZm9yIChjb25zdCByaW5ncyBvZiBmZWF0dXJlUmluZ3Mob3V0bGluZXMucmluZ3MsIG91dGxpbmVzLnJpbmdHcm91cHMpKSB7XG4gICAgZmlsbFNsaWNlKG1hc2ssIHdpZHRoLCBoZWlnaHQsIDAsIHJpbmdzLCAwLCAwLCAxKTtcbiAgfVxufVxuXG4vKiogYGFgIGFuZCBgYmAgYXMgb25lIG1lc2guICovXG5mdW5jdGlvbiBtZXJnZU1lc2hlcyhhOiBNZXNoLCBiOiBNZXNoKTogTWVzaCB7XG4gIGlmICghYi5mYWNlcy5sZW5ndGgpIHJldHVybiBhO1xuICBpZiAoIWEuZmFjZXMubGVuZ3RoKSByZXR1cm4gYjtcbiAgY29uc3QgdmVydGljZXMgPSBuZXcgRmxvYXQzMkFycmF5KGEudmVydGljZXMubGVuZ3RoICsgYi52ZXJ0aWNlcy5sZW5ndGgpO1xuICB2ZXJ0aWNlcy5zZXQoYS52ZXJ0aWNlcyk7XG4gIHZlcnRpY2VzLnNldChiLnZlcnRpY2VzLCBhLnZlcnRpY2VzLmxlbmd0aCk7XG4gIGNvbnN0IGZhY2VzID0gbmV3IFVpbnQzMkFycmF5KGEuZmFjZXMubGVuZ3RoICsgYi5mYWNlcy5sZW5ndGgpO1xuICBmYWNlcy5zZXQoYS5mYWNlcyk7XG4gIGNvbnN0IG9mZnNldCA9IGEudmVydGljZXMubGVuZ3RoIC8gMztcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBiLmZhY2VzLmxlbmd0aDsgaSsrKSBmYWNlc1thLmZhY2VzLmxlbmd0aCArIGldID0gYi5mYWNlc1tpXSArIG9mZnNldDtcbiAgcmV0dXJuIHsgdmVydGljZXMsIGZhY2VzIH07XG59XG5cbi8qKlxuICogRmlsbCBvbmUgZmVhdHVyZSBpbnRvIG9uZSBzbGljZSBvZiB0aGUgbWFzazogZXZlbi1vZGQgb3ZlciBpdHMgYHJpbmdzYCwgc2FtcGxlZCBhdCB2b3hlbFxuICogY2VudHJlcy4gQ2VsbHMgYWxyZWFkeSBzZXQgc3RheSBzZXQsIHNvIHRoZSBmZWF0dXJlcyBvZiBhIHNsaWNlIGZpbGwgYXMgdGhlaXIgdW5pb24uXG4gKi9cbmZ1bmN0aW9uIGZpbGxTbGljZShcbiAgbWFzazogVWludDhBcnJheSxcbiAgbng6IG51bWJlcixcbiAgbnk6IG51bWJlcixcbiAgb2Zmc2V0OiBudW1iZXIsXG4gIHJpbmdzOiByZWFkb25seSBBcnJheUxpa2U8bnVtYmVyPltdLFxuICB4MDogbnVtYmVyLFxuICB5MDogbnVtYmVyLFxuICBzdGVwOiBudW1iZXIsXG4pOiB2b2lkIHtcbiAgY29uc3QgY3Jvc3NpbmdzOiBudW1iZXJbXSA9IFtdO1xuICAvLyBPbmx5IHRoZSByb3dzIHRoZSBmZWF0dXJlIHNwYW5zLlxuICBsZXQgdG9wID0gSW5maW5pdHksXG4gICAgYm90dG9tID0gLUluZmluaXR5O1xuICBmb3IgKGNvbnN0IHIgb2YgcmluZ3MpIHtcbiAgICBmb3IgKGxldCBpID0gMTsgaSA8IHIubGVuZ3RoOyBpICs9IDIpIHtcbiAgICAgIGlmIChyW2ldIDwgdG9wKSB0b3AgPSByW2ldO1xuICAgICAgaWYgKHJbaV0gPiBib3R0b20pIGJvdHRvbSA9IHJbaV07XG4gICAgfVxuICB9XG4gIGNvbnN0IGowID0gTWF0aC5tYXgoMCwgTWF0aC5mbG9vcigodG9wIC0geTApIC8gc3RlcCAtIDAuNSkpO1xuICBjb25zdCBqMSA9IE1hdGgubWluKG55IC0gMSwgTWF0aC5jZWlsKChib3R0b20gLSB5MCkgLyBzdGVwIC0gMC41KSk7XG4gIGZvciAobGV0IGogPSBqMDsgaiA8PSBqMTsgaisrKSB7XG4gICAgY29uc3QgeSA9IHkwICsgKGogKyAwLjUpICogc3RlcDtcbiAgICBjcm9zc2luZ3MubGVuZ3RoID0gMDtcbiAgICBmb3IgKGNvbnN0IHIgb2YgcmluZ3MpIHtcbiAgICAgIGNvbnN0IG4gPSByLmxlbmd0aCA+PiAxO1xuICAgICAgZm9yIChsZXQgaSA9IDAsIGsgPSBuIC0gMTsgaSA8IG47IGsgPSBpKyspIHtcbiAgICAgICAgY29uc3QgeWEgPSByWzIgKiBpICsgMV0sXG4gICAgICAgICAgeWIgPSByWzIgKiBrICsgMV07XG4gICAgICAgIGlmICh5YSA+IHkgIT09IHliID4geSkge1xuICAgICAgICAgIGNvbnN0IHhhID0gclsyICogaV0sXG4gICAgICAgICAgICB4YiA9IHJbMiAqIGtdO1xuICAgICAgICAgIGNyb3NzaW5ncy5wdXNoKHhhICsgKCh5IC0geWEpICogKHhiIC0geGEpKSAvICh5YiAtIHlhKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGNyb3NzaW5ncy5sZW5ndGggPCAyKSBjb250aW51ZTtcbiAgICBjcm9zc2luZ3Muc29ydCgoYSwgYikgPT4gYSAtIGIpO1xuICAgIGNvbnN0IHJvdyA9IG9mZnNldCArIGogKiBueDtcbiAgICBmb3IgKGxldCBjID0gMDsgYyArIDEgPCBjcm9zc2luZ3MubGVuZ3RoOyBjICs9IDIpIHtcbiAgICAgIGNvbnN0IGZyb20gPSBNYXRoLm1heCgwLCBNYXRoLmNlaWwoKGNyb3NzaW5nc1tjXSAtIHgwKSAvIHN0ZXAgLSAwLjUpKTtcbiAgICAgIGNvbnN0IHRvID0gTWF0aC5taW4obnggLSAxLCBNYXRoLmZsb29yKChjcm9zc2luZ3NbYyArIDFdIC0geDApIC8gc3RlcCAtIDAuNSkpO1xuICAgICAgZm9yIChsZXQgaSA9IGZyb207IGkgPD0gdG87IGkrKykgbWFza1tyb3cgKyBpXSA9IDE7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogVGhlIGFyZWEgaW5zaWRlIGByaW5nc2AgKGludGVybGVhdmVkIGB4LCB5YCksIGV2ZW4tb2RkOiBhIHJpbmcgaW5zaWRlIGFuIG9kZCBudW1iZXIgb2Ygb3RoZXJzIGlzXG4gKiBhIGhvbGUuIEV4YWN0IGZvciByaW5ncyB0aGF0IGRvIG5vdCBjcm9zcyAoYSBwb2x5Z29uIHNldCdzIGV4dGVyaW9ycyBhbmQgaG9sZXMpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmluZ3NBcmVhKHJpbmdzOiByZWFkb25seSBBcnJheUxpa2U8bnVtYmVyPltdKTogbnVtYmVyIHtcbiAgY29uc3QgYm94ZXMgPSByaW5ncy5tYXAocmluZ0JveCk7XG4gIGxldCBhcmVhID0gMDtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCByaW5ncy5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IHIgPSByaW5nc1tpXTtcbiAgICBpZiAoci5sZW5ndGggPCA2KSBjb250aW51ZTtcbiAgICBjb25zdCB4ID0gclswXSxcbiAgICAgIHkgPSByWzFdO1xuICAgIGxldCBkZXB0aCA9IDA7XG4gICAgZm9yIChsZXQgaiA9IDA7IGogPCByaW5ncy5sZW5ndGg7IGorKykge1xuICAgICAgaWYgKGogPT09IGkpIGNvbnRpbnVlO1xuICAgICAgY29uc3QgYiA9IGJveGVzW2pdO1xuICAgICAgaWYgKHggPCBiWzBdIHx8IHggPiBiWzJdIHx8IHkgPCBiWzFdIHx8IHkgPiBiWzNdKSBjb250aW51ZTtcbiAgICAgIGlmIChwb2ludEluUmluZyh4LCB5LCByaW5nc1tqXSkpIGRlcHRoKys7XG4gICAgfVxuICAgIGFyZWEgKz0gKGRlcHRoICUgMiA/IC0xIDogMSkgKiBNYXRoLmFicyhyaW5nQXJlYShyKSk7XG4gIH1cbiAgcmV0dXJuIE1hdGgubWF4KDAsIGFyZWEpO1xufVxuXG4vKipcbiAqIFRoZSByaW5ncyBvZiBlYWNoIGZlYXR1cmUgKHNlZSB7QGxpbmsgU2xpY2VPdXRsaW5lcy5yaW5nR3JvdXBzfSksIGluIHRoZSBvcmRlciBmaXJzdCBtZXQ7IG9uZVxuICogZmVhdHVyZSBvZiBldmVyeSByaW5nIHdpdGhvdXQgYGdyb3Vwc2AuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmZWF0dXJlUmluZ3MoXG4gIHJpbmdzOiByZWFkb25seSBBcnJheUxpa2U8bnVtYmVyPltdLFxuICBncm91cHM/OiBBcnJheUxpa2U8bnVtYmVyPixcbik6IEFycmF5TGlrZTxudW1iZXI+W11bXSB7XG4gIGlmICghZ3JvdXBzIHx8ICFyaW5ncy5sZW5ndGgpIHJldHVybiByaW5ncy5sZW5ndGggPyBbcmluZ3Muc2xpY2UoKV0gOiBbXTtcbiAgY29uc3QgYnlHcm91cCA9IG5ldyBNYXA8bnVtYmVyLCBBcnJheUxpa2U8bnVtYmVyPltdPigpO1xuICByaW5ncy5mb3JFYWNoKChyLCBpKSA9PiB7XG4gICAgY29uc3QgZyA9IGdyb3Vwc1tpXSA/PyAwO1xuICAgIGNvbnN0IGZlYXR1cmUgPSBieUdyb3VwLmdldChnKTtcbiAgICBpZiAoZmVhdHVyZSkgZmVhdHVyZS5wdXNoKHIpO1xuICAgIGVsc2UgYnlHcm91cC5zZXQoZywgW3JdKTtcbiAgfSk7XG4gIHJldHVybiBbLi4uYnlHcm91cC52YWx1ZXMoKV07XG59XG5cbi8qKlxuICogVGhlIGFyZWEgb2YgYSBzbGljZSdzIG91dGxpbmVzIChweMKyKTogZWFjaCBmZWF0dXJlJ3MgKGV2ZW4tb2RkLCBzZWUge0BsaW5rIHJpbmdzQXJlYX0pLCB0aGVcbiAqIGZlYXR1cmVzIGFzIHRoZWlyIHVuaW9uLCBzbyBhIGZlYXR1cmUgaW5zaWRlIG9yIG92ZXIgYW5vdGhlciBvZiB0aGUgc2xpY2UgYWRkcyBvbmx5IHdoYXQgaXRcbiAqIGNvdmVycyBiZXlvbmQgaXQuIEZlYXR1cmVzIHdob3NlIGV4dGVudHMgb3ZlcmxhcCBhcmUgbWVhc3VyZWQgdG9nZXRoZXIsIGJ5IHRoZSBsZW5ndGggb2YgdGhlaXJcbiAqIHVuaW9uIGFsb25nIGVhY2ggcm93LCBleGFjdCBiZXR3ZWVuIHRoZSByb3dzIHRocm91Z2ggdGhlaXIgdmVydGljZXMgd2hlcmUgbm8gb3V0bGluZSBjcm9zc2VzXG4gKiBhbm90aGVyIChhbmQgcmVmaW5lZCB3aGVyZSBvbmUgZG9lcykuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBvdXRsaW5lc0FyZWEocmluZ3M6IHJlYWRvbmx5IEFycmF5TGlrZTxudW1iZXI+W10sIGdyb3Vwcz86IEFycmF5TGlrZTxudW1iZXI+KTogbnVtYmVyIHtcbiAgY29uc3QgZmVhdHVyZXMgPSBmZWF0dXJlUmluZ3MocmluZ3MsIGdyb3VwcykubWFwKChmKSA9PiAoeyByaW5nczogZiwgYm94OiBmZWF0dXJlQm94KGYpIH0pKTtcbiAgaWYgKGZlYXR1cmVzLmxlbmd0aCA8IDIpIHJldHVybiBmZWF0dXJlcy5sZW5ndGggPyByaW5nc0FyZWEoZmVhdHVyZXNbMF0ucmluZ3MpIDogMDtcbiAgLy8gRmVhdHVyZXMgd2hvc2UgZXh0ZW50cyBvdmVybGFwLCBqb2luZWQgKGJ5IHgsIHNvIGEgZmVhdHVyZSBtZWV0cyBvbmx5IHRob3NlIGl0IGNhbiBvdmVybGFwKS5cbiAgZmVhdHVyZXMuc29ydCgoYSwgYikgPT4gYS5ib3hbMF0gLSBiLmJveFswXSk7XG4gIGNvbnN0IHBhcmVudCA9IGZlYXR1cmVzLm1hcCgoXywgaSkgPT4gaSk7XG4gIGNvbnN0IHJvb3QgPSAoaTogbnVtYmVyKTogbnVtYmVyID0+IChwYXJlbnRbaV0gPT09IGkgPyBpIDogKHBhcmVudFtpXSA9IHJvb3QocGFyZW50W2ldKSkpO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGZlYXR1cmVzLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3QgYSA9IGZlYXR1cmVzW2ldLmJveDtcbiAgICBmb3IgKGxldCBqID0gaSArIDE7IGogPCBmZWF0dXJlcy5sZW5ndGggJiYgZmVhdHVyZXNbal0uYm94WzBdIDwgYVsyXTsgaisrKSB7XG4gICAgICBjb25zdCBiID0gZmVhdHVyZXNbal0uYm94O1xuICAgICAgaWYgKGJbMV0gPCBhWzNdICYmIGFbMV0gPCBiWzNdKSBwYXJlbnRbcm9vdChqKV0gPSByb290KGkpO1xuICAgIH1cbiAgfVxuICBjb25zdCBjbHVzdGVycyA9IG5ldyBNYXA8bnVtYmVyLCBBcnJheUxpa2U8bnVtYmVyPltdW10+KCk7XG4gIGZlYXR1cmVzLmZvckVhY2goKGYsIGkpID0+IHtcbiAgICBjb25zdCByID0gcm9vdChpKTtcbiAgICBjb25zdCBjbHVzdGVyID0gY2x1c3RlcnMuZ2V0KHIpO1xuICAgIGlmIChjbHVzdGVyKSBjbHVzdGVyLnB1c2goZi5yaW5ncyk7XG4gICAgZWxzZSBjbHVzdGVycy5zZXQociwgW2YucmluZ3NdKTtcbiAgfSk7XG4gIGxldCBhcmVhID0gMDtcbiAgZm9yIChjb25zdCBjbHVzdGVyIG9mIGNsdXN0ZXJzLnZhbHVlcygpKVxuICAgIGFyZWEgKz0gY2x1c3Rlci5sZW5ndGggPT09IDEgPyByaW5nc0FyZWEoY2x1c3RlclswXSkgOiB1bmlvbkFyZWEoY2x1c3Rlcik7XG4gIHJldHVybiBhcmVhO1xufVxuXG4vKipcbiAqIFRoZSB2b2x1bWUgb2YgdGhlIHJlZ2lvbiBvdXRsaW5lZCBieSBgc2xpY2VzYCwgaW4gcHjCsiDDlyBzbGljZXMgKG9uZSBzbGljZSB0aGljayBwZXIgb3V0bGluZSk6XG4gKiB0aGUgc3VtIG9mIGVhY2ggc2xpY2UncyBhcmVhIChzZWUge0BsaW5rIG91dGxpbmVzQXJlYX07IENhdmFsaWVyaSdzIGVzdGltYXRvcikuIFRpbWVzIMK1bSBwZXIgcHjCslxuICogYW5kIHBlciBzbGljZSwgwrVtwrMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBvdXRsaW5lZFZvbHVtZShzbGljZXM6IHJlYWRvbmx5IFNsaWNlT3V0bGluZXNbXSk6IG51bWJlciB7XG4gIGxldCB2ID0gMDtcbiAgZm9yIChjb25zdCBzIG9mIHNsaWNlcykgdiArPSBvdXRsaW5lc0FyZWEocy5yaW5ncywgcy5yaW5nR3JvdXBzKTtcbiAgcmV0dXJuIHY7XG59XG5cbi8qKiBUaGUgYXJlYSBvZiB0aGUgdW5pb24gb2YgYGZlYXR1cmVzYCAoZWFjaCBldmVuLW9kZCBvdmVyIGl0cyByaW5ncyksIHJvdyBiYW5kIGJ5IHJvdyBiYW5kLiAqL1xuZnVuY3Rpb24gdW5pb25BcmVhKGZlYXR1cmVzOiByZWFkb25seSBBcnJheUxpa2U8bnVtYmVyPltdW10pOiBudW1iZXIge1xuICBjb25zdCB5czogbnVtYmVyW10gPSBbXTtcbiAgZm9yIChjb25zdCBmIG9mIGZlYXR1cmVzKSBmb3IgKGNvbnN0IHIgb2YgZikgZm9yIChsZXQgaSA9IDE7IGkgPCByLmxlbmd0aDsgaSArPSAyKSB5cy5wdXNoKHJbaV0pO1xuICB5cy5zb3J0KChhLCBiKSA9PiBhIC0gYik7XG4gIGxldCBhcmVhID0gMDtcbiAgZm9yIChsZXQgayA9IDA7IGsgKyAxIDwgeXMubGVuZ3RoOyBrKyspIGlmICh5c1trICsgMV0gPiB5c1trXSkgYXJlYSArPSBiYW5kQXJlYShmZWF0dXJlcywgeXNba10sIHlzW2sgKyAxXSwgMCk7XG4gIHJldHVybiBhcmVhO1xufVxuXG4vKipcbiAqIFRoZSB1bmlvbidzIGFyZWEgYmV0d2VlbiByb3dzIGBhYCBhbmQgYGJgLiBCZXR3ZWVuIHR3byB2ZXJ0aWNlcycgcm93cyBpdHMgd2lkdGggYWxvbmcgYSByb3cgaXNcbiAqIGxpbmVhciBpbiB5IHVubGVzcyBvdXRsaW5lcyBjcm9zcyB0aGVyZTogdGhlbiB0aGUgYmFuZCBpcyBoYWx2ZWQgdW50aWwgaXQgaXMgKG9yIHRoaW4gZW5vdWdoKS5cbiAqL1xuZnVuY3Rpb24gYmFuZEFyZWEoZmVhdHVyZXM6IHJlYWRvbmx5IEFycmF5TGlrZTxudW1iZXI+W11bXSwgYTogbnVtYmVyLCBiOiBudW1iZXIsIGRlcHRoOiBudW1iZXIpOiBudW1iZXIge1xuICBjb25zdCBoID0gYiAtIGE7XG4gIGNvbnN0IGF0ID0gKHQ6IG51bWJlcikgPT4gdW5pb25XaWR0aChmZWF0dXJlcywgYSArIHQgKiBoKTtcbiAgY29uc3QgbWlkID0gYXQoMC41KTtcbiAgaWYgKGRlcHRoID49IDEwKSByZXR1cm4gaCAqIG1pZDtcbiAgY29uc3QgZSA9IDFlLTY7XG4gIGNvbnN0IHRvbCA9IDFlLTkgKiAoMSArIE1hdGguYWJzKG1pZCkpO1xuICBjb25zdCBsaW5lYXIgPSBNYXRoLmFicyhhdCgwLjI1KSArIGF0KDAuNzUpIC0gMiAqIG1pZCkgPD0gdG9sICYmIE1hdGguYWJzKGF0KGUpICsgYXQoMSAtIGUpIC0gMiAqIG1pZCkgPD0gdG9sO1xuICBpZiAobGluZWFyKSByZXR1cm4gaCAqIG1pZDtcbiAgY29uc3QgbSA9IGEgKyBoIC8gMjtcbiAgcmV0dXJuIGJhbmRBcmVhKGZlYXR1cmVzLCBhLCBtLCBkZXB0aCArIDEpICsgYmFuZEFyZWEoZmVhdHVyZXMsIG0sIGIsIGRlcHRoICsgMSk7XG59XG5cbi8qKiBUaGUgbGVuZ3RoIG9mIHRoZSB1bmlvbiBvZiBgZmVhdHVyZXNgIGFsb25nIHRoZSByb3cgYHlgLiAqL1xuZnVuY3Rpb24gdW5pb25XaWR0aChmZWF0dXJlczogcmVhZG9ubHkgQXJyYXlMaWtlPG51bWJlcj5bXVtdLCB5OiBudW1iZXIpOiBudW1iZXIge1xuICBjb25zdCBzcGFuczogQXJyYXk8W251bWJlciwgbnVtYmVyXT4gPSBbXTtcbiAgY29uc3QgeHM6IG51bWJlcltdID0gW107XG4gIGZvciAoY29uc3QgZiBvZiBmZWF0dXJlcykge1xuICAgIHhzLmxlbmd0aCA9IDA7XG4gICAgZm9yIChjb25zdCByIG9mIGYpIHtcbiAgICAgIGNvbnN0IG4gPSByLmxlbmd0aCA+PiAxO1xuICAgICAgZm9yIChsZXQgaSA9IDAsIGsgPSBuIC0gMTsgaSA8IG47IGsgPSBpKyspIHtcbiAgICAgICAgY29uc3QgeWEgPSByWzIgKiBpICsgMV0sXG4gICAgICAgICAgeWIgPSByWzIgKiBrICsgMV07XG4gICAgICAgIGlmICh5YSA+IHkgIT09IHliID4geSkgeHMucHVzaChyWzIgKiBpXSArICgoeSAtIHlhKSAqIChyWzIgKiBrXSAtIHJbMiAqIGldKSkgLyAoeWIgLSB5YSkpO1xuICAgICAgfVxuICAgIH1cbiAgICB4cy5zb3J0KChwLCBxKSA9PiBwIC0gcSk7XG4gICAgZm9yIChsZXQgYyA9IDA7IGMgKyAxIDwgeHMubGVuZ3RoOyBjICs9IDIpIHNwYW5zLnB1c2goW3hzW2NdLCB4c1tjICsgMV1dKTtcbiAgfVxuICBzcGFucy5zb3J0KChwLCBxKSA9PiBwWzBdIC0gcVswXSk7XG4gIGxldCB3aWR0aCA9IDAsXG4gICAgZnJvbSA9IC1JbmZpbml0eSxcbiAgICB0byA9IC1JbmZpbml0eTtcbiAgZm9yIChjb25zdCBbczAsIHMxXSBvZiBzcGFucykge1xuICAgIGlmIChzMCA+IHRvKSB7XG4gICAgICBpZiAodG8gPiBmcm9tKSB3aWR0aCArPSB0byAtIGZyb207XG4gICAgICBmcm9tID0gczA7XG4gICAgICB0byA9IHMxO1xuICAgIH0gZWxzZSBpZiAoczEgPiB0bykgdG8gPSBzMTtcbiAgfVxuICBpZiAodG8gPiBmcm9tKSB3aWR0aCArPSB0byAtIGZyb207XG4gIHJldHVybiB3aWR0aDtcbn1cblxuLyoqIFRoZSBleHRlbnQgb2YgYSBmZWF0dXJlJ3MgcmluZ3MuICovXG5mdW5jdGlvbiBmZWF0dXJlQm94KHJpbmdzOiByZWFkb25seSBBcnJheUxpa2U8bnVtYmVyPltdKTogW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl0ge1xuICBjb25zdCBib3g6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdID0gW0luZmluaXR5LCBJbmZpbml0eSwgLUluZmluaXR5LCAtSW5maW5pdHldO1xuICBmb3IgKGNvbnN0IHIgb2YgcmluZ3MpIHtcbiAgICBjb25zdCBbeDAsIHkwLCB4MSwgeTFdID0gcmluZ0JveChyKTtcbiAgICBib3hbMF0gPSBNYXRoLm1pbihib3hbMF0sIHgwKTtcbiAgICBib3hbMV0gPSBNYXRoLm1pbihib3hbMV0sIHkwKTtcbiAgICBib3hbMl0gPSBNYXRoLm1heChib3hbMl0sIHgxKTtcbiAgICBib3hbM10gPSBNYXRoLm1heChib3hbM10sIHkxKTtcbiAgfVxuICByZXR1cm4gYm94O1xufVxuXG5mdW5jdGlvbiByaW5nQm94KHI6IEFycmF5TGlrZTxudW1iZXI+KTogW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl0ge1xuICBsZXQgeDAgPSBJbmZpbml0eSxcbiAgICB5MCA9IEluZmluaXR5LFxuICAgIHgxID0gLUluZmluaXR5LFxuICAgIHkxID0gLUluZmluaXR5O1xuICBmb3IgKGxldCBpID0gMDsgaSArIDEgPCByLmxlbmd0aDsgaSArPSAyKSB7XG4gICAgaWYgKHJbaV0gPCB4MCkgeDAgPSByW2ldO1xuICAgIGlmIChyW2ldID4geDEpIHgxID0gcltpXTtcbiAgICBpZiAocltpICsgMV0gPCB5MCkgeTAgPSByW2kgKyAxXTtcbiAgICBpZiAocltpICsgMV0gPiB5MSkgeTEgPSByW2kgKyAxXTtcbiAgfVxuICByZXR1cm4gW3gwLCB5MCwgeDEsIHkxXTtcbn1cbiJdfQ==
|