ngx-vflow 0.13.0-0 → 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.
Files changed (42) hide show
  1. package/esm2022/lib/vflow/components/background/background.component.mjs +7 -16
  2. package/esm2022/lib/vflow/components/default-node/default-node.component.mjs +18 -0
  3. package/esm2022/lib/vflow/components/node/node.component.mjs +8 -7
  4. package/esm2022/lib/vflow/components/vflow/vflow.component.mjs +23 -10
  5. package/esm2022/lib/vflow/directives/root-pointer.directive.mjs +1 -1
  6. package/esm2022/lib/vflow/directives/selectable.directive.mjs +5 -2
  7. package/esm2022/lib/vflow/models/minimap.model.mjs +7 -0
  8. package/esm2022/lib/vflow/public-components/minimap/minimap.component.mjs +119 -0
  9. package/esm2022/lib/vflow/public-components/resizable/resizable.component.mjs +124 -180
  10. package/esm2022/lib/vflow/services/draggable.service.mjs +40 -19
  11. package/esm2022/lib/vflow/services/flow-entities.service.mjs +6 -5
  12. package/esm2022/lib/vflow/services/flow-settings.service.mjs +2 -1
  13. package/esm2022/lib/vflow/services/keyboard.service.mjs +45 -0
  14. package/esm2022/lib/vflow/services/node-changes.service.mjs +6 -7
  15. package/esm2022/lib/vflow/services/selection.service.mjs +12 -5
  16. package/esm2022/lib/vflow/types/keyboard-action.type.mjs +2 -0
  17. package/esm2022/lib/vflow/utils/get-os.mjs +24 -0
  18. package/esm2022/lib/vflow/utils/transform-background.mjs +6 -0
  19. package/esm2022/lib/vflow/vflow.module.mjs +11 -3
  20. package/esm2022/public-api.mjs +3 -1
  21. package/fesm2022/ngx-vflow.mjs +423 -242
  22. package/fesm2022/ngx-vflow.mjs.map +1 -1
  23. package/lib/vflow/components/background/background.component.d.ts +3 -6
  24. package/lib/vflow/components/default-node/default-node.component.d.ts +6 -0
  25. package/lib/vflow/components/vflow/vflow.component.d.ts +6 -2
  26. package/lib/vflow/directives/root-pointer.directive.d.ts +10 -16
  27. package/lib/vflow/directives/space-point-context.directive.d.ts +1 -15
  28. package/lib/vflow/models/edge.model.d.ts +17 -1
  29. package/lib/vflow/models/minimap.model.d.ts +4 -0
  30. package/lib/vflow/public-components/minimap/minimap.component.d.ts +49 -0
  31. package/lib/vflow/public-components/resizable/resizable.component.d.ts +6 -11
  32. package/lib/vflow/services/draggable.service.d.ts +2 -0
  33. package/lib/vflow/services/flow-entities.service.d.ts +7 -5
  34. package/lib/vflow/services/flow-settings.service.d.ts +2 -0
  35. package/lib/vflow/services/keyboard.service.d.ts +11 -0
  36. package/lib/vflow/services/selection.service.d.ts +1 -0
  37. package/lib/vflow/types/keyboard-action.type.d.ts +2 -0
  38. package/lib/vflow/utils/get-os.d.ts +1 -0
  39. package/lib/vflow/utils/transform-background.d.ts +2 -0
  40. package/lib/vflow/vflow.module.d.ts +21 -19
  41. package/package.json +1 -1
  42. package/public-api.d.ts +2 -0
@@ -1,7 +1,8 @@
1
- import { ChangeDetectionStrategy, Component, Input, computed, effect, inject, signal } from '@angular/core';
1
+ import { ChangeDetectionStrategy, Component, computed, effect, inject } from '@angular/core';
2
2
  import { ViewportService } from '../../services/viewport.service';
3
3
  import { RootSvgReferenceDirective } from '../../directives/reference.directive';
4
4
  import { id } from '../../utils/id';
5
+ import { FlowSettingsService } from '../../services/flow-settings.service';
5
6
  import * as i0 from "@angular/core";
6
7
  import * as i1 from "@angular/common";
7
8
  const defaultBg = '#fff';
@@ -9,13 +10,11 @@ const defaultGap = 20;
9
10
  const defaultDotSize = 2;
10
11
  const defaultDotColor = 'rgb(177, 177, 183)';
11
12
  export class BackgroundComponent {
12
- set background(value) {
13
- this.backgroundSignal.set(value);
14
- }
15
13
  constructor() {
16
14
  this.viewportService = inject(ViewportService);
17
15
  this.rootSvg = inject(RootSvgReferenceDirective).element;
18
- this.backgroundSignal = signal({ type: 'solid', color: defaultBg });
16
+ this.settingsService = inject(FlowSettingsService);
17
+ this.backgroundSignal = this.settingsService.background;
19
18
  this.scaledGap = computed(() => {
20
19
  const background = this.backgroundSignal();
21
20
  if (background.type === 'dots') {
@@ -49,18 +48,10 @@ export class BackgroundComponent {
49
48
  });
50
49
  }
51
50
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: BackgroundComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
52
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "16.1.0", version: "16.2.12", type: BackgroundComponent, selector: "g[background]", inputs: { background: ["background", "background", transform] }, ngImport: i0, template: "<ng-container *ngIf=\"backgroundSignal().type === 'dots'\">\n <svg:pattern\n [attr.id]=\"patternId\"\n [attr.x]=\"x()\"\n [attr.y]=\"y()\"\n [attr.width]=\"scaledGap()\"\n [attr.height]=\"scaledGap()\"\n patternUnits=\"userSpaceOnUse\"\n >\n <svg:circle\n [attr.cx]=\"patternSize()\"\n [attr.cy]=\"patternSize()\"\n [attr.r]=\"patternSize()\"\n [attr.fill]=\"patternColor()\"\n />\n </svg:pattern>\n\n <svg:rect\n x=\"0\"\n y=\"0\"\n width=\"100%\"\n height=\"100%\"\n [attr.fill]=\"patternUrl\"\n />\n</ng-container>\n", dependencies: [{ kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
51
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: BackgroundComponent, selector: "g[background]", ngImport: i0, template: "<ng-container *ngIf=\"backgroundSignal().type === 'dots'\">\n <svg:pattern\n [attr.id]=\"patternId\"\n [attr.x]=\"x()\"\n [attr.y]=\"y()\"\n [attr.width]=\"scaledGap()\"\n [attr.height]=\"scaledGap()\"\n patternUnits=\"userSpaceOnUse\"\n >\n <svg:circle\n [attr.cx]=\"patternSize()\"\n [attr.cy]=\"patternSize()\"\n [attr.r]=\"patternSize()\"\n [attr.fill]=\"patternColor()\"\n />\n </svg:pattern>\n\n <svg:rect\n x=\"0\"\n y=\"0\"\n width=\"100%\"\n height=\"100%\"\n [attr.fill]=\"patternUrl\"\n />\n</ng-container>\n", dependencies: [{ kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
53
52
  }
54
53
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: BackgroundComponent, decorators: [{
55
54
  type: Component,
56
55
  args: [{ selector: 'g[background]', changeDetection: ChangeDetectionStrategy.OnPush, template: "<ng-container *ngIf=\"backgroundSignal().type === 'dots'\">\n <svg:pattern\n [attr.id]=\"patternId\"\n [attr.x]=\"x()\"\n [attr.y]=\"y()\"\n [attr.width]=\"scaledGap()\"\n [attr.height]=\"scaledGap()\"\n patternUnits=\"userSpaceOnUse\"\n >\n <svg:circle\n [attr.cx]=\"patternSize()\"\n [attr.cy]=\"patternSize()\"\n [attr.r]=\"patternSize()\"\n [attr.fill]=\"patternColor()\"\n />\n </svg:pattern>\n\n <svg:rect\n x=\"0\"\n y=\"0\"\n width=\"100%\"\n height=\"100%\"\n [attr.fill]=\"patternUrl\"\n />\n</ng-container>\n" }]
57
- }], ctorParameters: function () { return []; }, propDecorators: { background: [{
58
- type: Input,
59
- args: [{ required: true, transform }]
60
- }] } });
61
- function transform(background) {
62
- return typeof background === 'string'
63
- ? { type: 'solid', color: background }
64
- : background;
65
- }
66
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFja2dyb3VuZC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtdmZsb3ctbGliL3NyYy9saWIvdmZsb3cvY29tcG9uZW50cy9iYWNrZ3JvdW5kL2JhY2tncm91bmQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXZmbG93LWxpYi9zcmMvbGliL3ZmbG93L2NvbXBvbmVudHMvYmFja2dyb3VuZC9iYWNrZ3JvdW5kLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUU1RyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDbEUsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFDakYsT0FBTyxFQUFFLEVBQUUsRUFBRSxNQUFNLGdCQUFnQixDQUFDOzs7QUFFcEMsTUFBTSxTQUFTLEdBQUcsTUFBTSxDQUFBO0FBQ3hCLE1BQU0sVUFBVSxHQUFHLEVBQUUsQ0FBQTtBQUNyQixNQUFNLGNBQWMsR0FBRyxDQUFDLENBQUE7QUFDeEIsTUFBTSxlQUFlLEdBQUcsb0JBQW9CLENBQUE7QUFPNUMsTUFBTSxPQUFPLG1CQUFtQjtJQUk5QixJQUNJLFVBQVUsQ0FBQyxLQUFpQjtRQUM5QixJQUFJLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFBO0lBQ2xDLENBQUM7SUFxQ0Q7UUEzQ1Esb0JBQWUsR0FBRyxNQUFNLENBQUMsZUFBZSxDQUFDLENBQUE7UUFDekMsWUFBTyxHQUFHLE1BQU0sQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDLE9BQU8sQ0FBQTtRQU9qRCxxQkFBZ0IsR0FBRyxNQUFNLENBQWEsRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFBO1FBRTFFLGNBQVMsR0FBRyxRQUFRLENBQUMsR0FBRyxFQUFFO1lBQ2xDLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFBO1lBRTFDLElBQUksVUFBVSxDQUFDLElBQUksS0FBSyxNQUFNLEVBQUU7Z0JBQzlCLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxJQUFJLENBQUE7Z0JBRXpELE9BQU8sSUFBSSxHQUFHLENBQUMsVUFBVSxDQUFDLEdBQUcsSUFBSSxVQUFVLENBQUMsQ0FBQTthQUM3QztZQUVELE9BQU8sQ0FBQyxDQUFBO1FBQ1YsQ0FBQyxDQUFDLENBQUE7UUFFUSxNQUFDLEdBQUcsUUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUE7UUFFaEYsTUFBQyxHQUFHLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLGdCQUFnQixFQUFFLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFBO1FBRWhGLGlCQUFZLEdBQUcsUUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDLEtBQUssSUFBSSxlQUFlLENBQUMsQ0FBQTtRQUUvRSxnQkFBVyxHQUFHLFFBQVEsQ0FBQyxHQUFHLEVBQUU7WUFDcEMsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUE7WUFFMUMsSUFBSSxVQUFVLENBQUMsSUFBSSxLQUFLLE1BQU0sRUFBRTtnQkFDOUIsT0FBTyxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxVQUFVLENBQUMsSUFBSSxJQUFJLGNBQWMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFBO2FBQ2hHO1lBRUQsT0FBTyxDQUFDLENBQUE7UUFDVixDQUFDLENBQUMsQ0FBQTtRQUVGLDJFQUEyRTtRQUMzRSx5Q0FBeUM7UUFDL0IsY0FBUyxHQUFHLEVBQUUsRUFBRSxDQUFDO1FBQ2pCLGVBQVUsR0FBRyxRQUFRLElBQUksQ0FBQyxTQUFTLEdBQUcsQ0FBQTtRQUc5QyxNQUFNLENBQUMsR0FBRyxFQUFFO1lBQ1YsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUE7WUFFMUMsSUFBSSxVQUFVLENBQUMsSUFBSSxLQUFLLE1BQU0sRUFBRTtnQkFDOUIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsZUFBZSxHQUFHLFVBQVUsQ0FBQyxlQUFlLElBQUksU0FBUyxDQUFBO2FBQzdFO1lBRUQsSUFBSSxVQUFVLENBQUMsSUFBSSxLQUFLLE9BQU8sRUFBRTtnQkFDL0IsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsZUFBZSxHQUFHLFVBQVUsQ0FBQyxLQUFLLENBQUE7YUFDdEQ7UUFDSCxDQUFDLENBQUMsQ0FBQTtJQUNKLENBQUM7K0dBeERVLG1CQUFtQjttR0FBbkIsbUJBQW1CLGdGQTJEdkIsU0FBUyw2QkMzRWxCLHlrQkF5QkE7OzRGRFRhLG1CQUFtQjtrQkFML0IsU0FBUzsrQkFDRSxlQUFlLG1CQUVSLHVCQUF1QixDQUFDLE1BQU07MEVBTzNDLFVBQVU7c0JBRGIsS0FBSzt1QkFBQyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFOztBQXVEdEMsU0FBUyxTQUFTLENBQUMsVUFBK0I7SUFDaEQsT0FBTyxPQUFPLFVBQVUsS0FBSyxRQUFRO1FBQ25DLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLFVBQVUsRUFBRTtRQUN0QyxDQUFDLENBQUMsVUFBVSxDQUFBO0FBQ2hCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ29tcG9uZW50LCBJbnB1dCwgY29tcHV0ZWQsIGVmZmVjdCwgaW5qZWN0LCBzaWduYWwgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEJhY2tncm91bmQgfSBmcm9tICcuLi8uLi90eXBlcy9iYWNrZ3JvdW5kLnR5cGUnO1xuaW1wb3J0IHsgVmlld3BvcnRTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvdmlld3BvcnQuc2VydmljZSc7XG5pbXBvcnQgeyBSb290U3ZnUmVmZXJlbmNlRGlyZWN0aXZlIH0gZnJvbSAnLi4vLi4vZGlyZWN0aXZlcy9yZWZlcmVuY2UuZGlyZWN0aXZlJztcbmltcG9ydCB7IGlkIH0gZnJvbSAnLi4vLi4vdXRpbHMvaWQnO1xuXG5jb25zdCBkZWZhdWx0QmcgPSAnI2ZmZidcbmNvbnN0IGRlZmF1bHRHYXAgPSAyMFxuY29uc3QgZGVmYXVsdERvdFNpemUgPSAyXG5jb25zdCBkZWZhdWx0RG90Q29sb3IgPSAncmdiKDE3NywgMTc3LCAxODMpJ1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdnW2JhY2tncm91bmRdJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2JhY2tncm91bmQuY29tcG9uZW50Lmh0bWwnLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaFxufSlcbmV4cG9ydCBjbGFzcyBCYWNrZ3JvdW5kQ29tcG9uZW50IHtcbiAgcHJpdmF0ZSB2aWV3cG9ydFNlcnZpY2UgPSBpbmplY3QoVmlld3BvcnRTZXJ2aWNlKVxuICBwcml2YXRlIHJvb3RTdmcgPSBpbmplY3QoUm9vdFN2Z1JlZmVyZW5jZURpcmVjdGl2ZSkuZWxlbWVudFxuXG4gIEBJbnB1dCh7IHJlcXVpcmVkOiB0cnVlLCB0cmFuc2Zvcm0gfSlcbiAgc2V0IGJhY2tncm91bmQodmFsdWU6IEJhY2tncm91bmQpIHtcbiAgICB0aGlzLmJhY2tncm91bmRTaWduYWwuc2V0KHZhbHVlKVxuICB9XG5cbiAgcHJvdGVjdGVkIGJhY2tncm91bmRTaWduYWwgPSBzaWduYWw8QmFja2dyb3VuZD4oeyB0eXBlOiAnc29saWQnLCBjb2xvcjogZGVmYXVsdEJnIH0pXG5cbiAgcHJvdGVjdGVkIHNjYWxlZEdhcCA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICBjb25zdCBiYWNrZ3JvdW5kID0gdGhpcy5iYWNrZ3JvdW5kU2lnbmFsKClcblxuICAgIGlmIChiYWNrZ3JvdW5kLnR5cGUgPT09ICdkb3RzJykge1xuICAgICAgY29uc3Qgem9vbSA9IHRoaXMudmlld3BvcnRTZXJ2aWNlLnJlYWRhYmxlVmlld3BvcnQoKS56b29tXG5cbiAgICAgIHJldHVybiB6b29tICogKGJhY2tncm91bmQuZ2FwID8/IGRlZmF1bHRHYXApXG4gICAgfVxuXG4gICAgcmV0dXJuIDBcbiAgfSlcblxuICBwcm90ZWN0ZWQgeCA9IGNvbXB1dGVkKCgpID0+IHRoaXMudmlld3BvcnRTZXJ2aWNlLnJlYWRhYmxlVmlld3BvcnQoKS54ICUgdGhpcy5zY2FsZWRHYXAoKSlcblxuICBwcm90ZWN0ZWQgeSA9IGNvbXB1dGVkKCgpID0+IHRoaXMudmlld3BvcnRTZXJ2aWNlLnJlYWRhYmxlVmlld3BvcnQoKS55ICUgdGhpcy5zY2FsZWRHYXAoKSlcblxuICBwcm90ZWN0ZWQgcGF0dGVybkNvbG9yID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5iYWNrZ3JvdW5kU2lnbmFsKCkuY29sb3IgPz8gZGVmYXVsdERvdENvbG9yKVxuXG4gIHByb3RlY3RlZCBwYXR0ZXJuU2l6ZSA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICBjb25zdCBiYWNrZ3JvdW5kID0gdGhpcy5iYWNrZ3JvdW5kU2lnbmFsKClcblxuICAgIGlmIChiYWNrZ3JvdW5kLnR5cGUgPT09ICdkb3RzJykge1xuICAgICAgcmV0dXJuICh0aGlzLnZpZXdwb3J0U2VydmljZS5yZWFkYWJsZVZpZXdwb3J0KCkuem9vbSAqIChiYWNrZ3JvdW5kLnNpemUgPz8gZGVmYXVsdERvdFNpemUpKSAvIDJcbiAgICB9XG5cbiAgICByZXR1cm4gMFxuICB9KVxuXG4gIC8vIFdpdGhvdXQgSUQgdGhlcmUgd2lsbCBiZSBwYXR0ZXJuIGNvbGxpc2lvbiBmb3Igc2V2ZXJhbCBmbG93cyBvbiB0aGUgcGFnZVxuICAvLyBMYXRlciBwYXR0ZXJuIElEIG1heSBiZSBleHBvc2VkIHRvIEFQSVxuICBwcm90ZWN0ZWQgcGF0dGVybklkID0gaWQoKTtcbiAgcHJvdGVjdGVkIHBhdHRlcm5VcmwgPSBgdXJsKCMke3RoaXMucGF0dGVybklkfSlgXG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgZWZmZWN0KCgpID0+IHtcbiAgICAgIGNvbnN0IGJhY2tncm91bmQgPSB0aGlzLmJhY2tncm91bmRTaWduYWwoKVxuXG4gICAgICBpZiAoYmFja2dyb3VuZC50eXBlID09PSAnZG90cycpIHtcbiAgICAgICAgdGhpcy5yb290U3ZnLnN0eWxlLmJhY2tncm91bmRDb2xvciA9IGJhY2tncm91bmQuYmFja2dyb3VuZENvbG9yID8/IGRlZmF1bHRCZ1xuICAgICAgfVxuXG4gICAgICBpZiAoYmFja2dyb3VuZC50eXBlID09PSAnc29saWQnKSB7XG4gICAgICAgIHRoaXMucm9vdFN2Zy5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSBiYWNrZ3JvdW5kLmNvbG9yXG4gICAgICB9XG4gICAgfSlcbiAgfVxufVxuXG5mdW5jdGlvbiB0cmFuc2Zvcm0oYmFja2dyb3VuZDogQmFja2dyb3VuZCB8IHN0cmluZyk6IEJhY2tncm91bmQge1xuICByZXR1cm4gdHlwZW9mIGJhY2tncm91bmQgPT09ICdzdHJpbmcnXG4gICAgPyB7IHR5cGU6ICdzb2xpZCcsIGNvbG9yOiBiYWNrZ3JvdW5kIH1cbiAgICA6IGJhY2tncm91bmRcbn1cbiIsIjxuZy1jb250YWluZXIgKm5nSWY9XCJiYWNrZ3JvdW5kU2lnbmFsKCkudHlwZSA9PT0gJ2RvdHMnXCI+XG4gIDxzdmc6cGF0dGVyblxuICAgIFthdHRyLmlkXT1cInBhdHRlcm5JZFwiXG4gICAgW2F0dHIueF09XCJ4KClcIlxuICAgIFthdHRyLnldPVwieSgpXCJcbiAgICBbYXR0ci53aWR0aF09XCJzY2FsZWRHYXAoKVwiXG4gICAgW2F0dHIuaGVpZ2h0XT1cInNjYWxlZEdhcCgpXCJcbiAgICBwYXR0ZXJuVW5pdHM9XCJ1c2VyU3BhY2VPblVzZVwiXG4gID5cbiAgICA8c3ZnOmNpcmNsZVxuICAgICAgW2F0dHIuY3hdPVwicGF0dGVyblNpemUoKVwiXG4gICAgICBbYXR0ci5jeV09XCJwYXR0ZXJuU2l6ZSgpXCJcbiAgICAgIFthdHRyLnJdPVwicGF0dGVyblNpemUoKVwiXG4gICAgICBbYXR0ci5maWxsXT1cInBhdHRlcm5Db2xvcigpXCJcbiAgICAvPlxuICA8L3N2ZzpwYXR0ZXJuPlxuXG4gIDxzdmc6cmVjdFxuICAgIHg9XCIwXCJcbiAgICB5PVwiMFwiXG4gICAgd2lkdGg9XCIxMDAlXCJcbiAgICBoZWlnaHQ9XCIxMDAlXCJcbiAgICBbYXR0ci5maWxsXT1cInBhdHRlcm5VcmxcIlxuICAvPlxuPC9uZy1jb250YWluZXI+XG4iXX0=
56
+ }], ctorParameters: function () { return []; } });
57
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFja2dyb3VuZC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtdmZsb3ctbGliL3NyYy9saWIvdmZsb3cvY29tcG9uZW50cy9iYWNrZ3JvdW5kL2JhY2tncm91bmQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXZmbG93LWxpYi9zcmMvbGliL3ZmbG93L2NvbXBvbmVudHMvYmFja2dyb3VuZC9iYWNrZ3JvdW5kLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDN0YsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQ2xFLE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxNQUFNLHNDQUFzQyxDQUFDO0FBQ2pGLE9BQU8sRUFBRSxFQUFFLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNwQyxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQzs7O0FBRTNFLE1BQU0sU0FBUyxHQUFHLE1BQU0sQ0FBQTtBQUN4QixNQUFNLFVBQVUsR0FBRyxFQUFFLENBQUE7QUFDckIsTUFBTSxjQUFjLEdBQUcsQ0FBQyxDQUFBO0FBQ3hCLE1BQU0sZUFBZSxHQUFHLG9CQUFvQixDQUFBO0FBTzVDLE1BQU0sT0FBTyxtQkFBbUI7SUF3QzlCO1FBdkNRLG9CQUFlLEdBQUcsTUFBTSxDQUFDLGVBQWUsQ0FBQyxDQUFBO1FBQ3pDLFlBQU8sR0FBRyxNQUFNLENBQUMseUJBQXlCLENBQUMsQ0FBQyxPQUFPLENBQUE7UUFDbkQsb0JBQWUsR0FBRyxNQUFNLENBQUMsbUJBQW1CLENBQUMsQ0FBQztRQUU1QyxxQkFBZ0IsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLFVBQVUsQ0FBQTtRQUVsRCxjQUFTLEdBQUcsUUFBUSxDQUFDLEdBQUcsRUFBRTtZQUNsQyxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQTtZQUUxQyxJQUFJLFVBQVUsQ0FBQyxJQUFJLEtBQUssTUFBTSxFQUFFO2dCQUM5QixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLGdCQUFnQixFQUFFLENBQUMsSUFBSSxDQUFBO2dCQUV6RCxPQUFPLElBQUksR0FBRyxDQUFDLFVBQVUsQ0FBQyxHQUFHLElBQUksVUFBVSxDQUFDLENBQUE7YUFDN0M7WUFFRCxPQUFPLENBQUMsQ0FBQTtRQUNWLENBQUMsQ0FBQyxDQUFBO1FBRVEsTUFBQyxHQUFHLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLGdCQUFnQixFQUFFLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFBO1FBRWhGLE1BQUMsR0FBRyxRQUFRLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQTtRQUVoRixpQkFBWSxHQUFHLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxLQUFLLElBQUksZUFBZSxDQUFDLENBQUE7UUFFL0UsZ0JBQVcsR0FBRyxRQUFRLENBQUMsR0FBRyxFQUFFO1lBQ3BDLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFBO1lBRTFDLElBQUksVUFBVSxDQUFDLElBQUksS0FBSyxNQUFNLEVBQUU7Z0JBQzlCLE9BQU8sQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLGdCQUFnQixFQUFFLENBQUMsSUFBSSxHQUFHLENBQUMsVUFBVSxDQUFDLElBQUksSUFBSSxjQUFjLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQTthQUNoRztZQUVELE9BQU8sQ0FBQyxDQUFBO1FBQ1YsQ0FBQyxDQUFDLENBQUE7UUFFRiwyRUFBMkU7UUFDM0UseUNBQXlDO1FBQy9CLGNBQVMsR0FBRyxFQUFFLEVBQUUsQ0FBQztRQUNqQixlQUFVLEdBQUcsUUFBUSxJQUFJLENBQUMsU0FBUyxHQUFHLENBQUE7UUFHOUMsTUFBTSxDQUFDLEdBQUcsRUFBRTtZQUNWLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFBO1lBRTFDLElBQUksVUFBVSxDQUFDLElBQUksS0FBSyxNQUFNLEVBQUU7Z0JBQzlCLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLGVBQWUsR0FBRyxVQUFVLENBQUMsZUFBZSxJQUFJLFNBQVMsQ0FBQTthQUM3RTtZQUVELElBQUksVUFBVSxDQUFDLElBQUksS0FBSyxPQUFPLEVBQUU7Z0JBQy9CLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLGVBQWUsR0FBRyxVQUFVLENBQUMsS0FBSyxDQUFBO2FBQ3REO1FBQ0gsQ0FBQyxDQUFDLENBQUE7SUFDSixDQUFDOytHQXBEVSxtQkFBbUI7bUdBQW5CLG1CQUFtQixxRENoQmhDLHlrQkF5QkE7OzRGRFRhLG1CQUFtQjtrQkFML0IsU0FBUzsrQkFDRSxlQUFlLG1CQUVSLHVCQUF1QixDQUFDLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ29tcG9uZW50LCBjb21wdXRlZCwgZWZmZWN0LCBpbmplY3QgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFZpZXdwb3J0U2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL3ZpZXdwb3J0LnNlcnZpY2UnO1xuaW1wb3J0IHsgUm9vdFN2Z1JlZmVyZW5jZURpcmVjdGl2ZSB9IGZyb20gJy4uLy4uL2RpcmVjdGl2ZXMvcmVmZXJlbmNlLmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBpZCB9IGZyb20gJy4uLy4uL3V0aWxzL2lkJztcbmltcG9ydCB7IEZsb3dTZXR0aW5nc1NlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9mbG93LXNldHRpbmdzLnNlcnZpY2UnO1xuXG5jb25zdCBkZWZhdWx0QmcgPSAnI2ZmZidcbmNvbnN0IGRlZmF1bHRHYXAgPSAyMFxuY29uc3QgZGVmYXVsdERvdFNpemUgPSAyXG5jb25zdCBkZWZhdWx0RG90Q29sb3IgPSAncmdiKDE3NywgMTc3LCAxODMpJ1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdnW2JhY2tncm91bmRdJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2JhY2tncm91bmQuY29tcG9uZW50Lmh0bWwnLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaFxufSlcbmV4cG9ydCBjbGFzcyBCYWNrZ3JvdW5kQ29tcG9uZW50IHtcbiAgcHJpdmF0ZSB2aWV3cG9ydFNlcnZpY2UgPSBpbmplY3QoVmlld3BvcnRTZXJ2aWNlKVxuICBwcml2YXRlIHJvb3RTdmcgPSBpbmplY3QoUm9vdFN2Z1JlZmVyZW5jZURpcmVjdGl2ZSkuZWxlbWVudFxuICBwcml2YXRlIHNldHRpbmdzU2VydmljZSA9IGluamVjdChGbG93U2V0dGluZ3NTZXJ2aWNlKTtcblxuICBwcm90ZWN0ZWQgYmFja2dyb3VuZFNpZ25hbCA9IHRoaXMuc2V0dGluZ3NTZXJ2aWNlLmJhY2tncm91bmRcblxuICBwcm90ZWN0ZWQgc2NhbGVkR2FwID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgIGNvbnN0IGJhY2tncm91bmQgPSB0aGlzLmJhY2tncm91bmRTaWduYWwoKVxuXG4gICAgaWYgKGJhY2tncm91bmQudHlwZSA9PT0gJ2RvdHMnKSB7XG4gICAgICBjb25zdCB6b29tID0gdGhpcy52aWV3cG9ydFNlcnZpY2UucmVhZGFibGVWaWV3cG9ydCgpLnpvb21cblxuICAgICAgcmV0dXJuIHpvb20gKiAoYmFja2dyb3VuZC5nYXAgPz8gZGVmYXVsdEdhcClcbiAgICB9XG5cbiAgICByZXR1cm4gMFxuICB9KVxuXG4gIHByb3RlY3RlZCB4ID0gY29tcHV0ZWQoKCkgPT4gdGhpcy52aWV3cG9ydFNlcnZpY2UucmVhZGFibGVWaWV3cG9ydCgpLnggJSB0aGlzLnNjYWxlZEdhcCgpKVxuXG4gIHByb3RlY3RlZCB5ID0gY29tcHV0ZWQoKCkgPT4gdGhpcy52aWV3cG9ydFNlcnZpY2UucmVhZGFibGVWaWV3cG9ydCgpLnkgJSB0aGlzLnNjYWxlZEdhcCgpKVxuXG4gIHByb3RlY3RlZCBwYXR0ZXJuQ29sb3IgPSBjb21wdXRlZCgoKSA9PiB0aGlzLmJhY2tncm91bmRTaWduYWwoKS5jb2xvciA/PyBkZWZhdWx0RG90Q29sb3IpXG5cbiAgcHJvdGVjdGVkIHBhdHRlcm5TaXplID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgIGNvbnN0IGJhY2tncm91bmQgPSB0aGlzLmJhY2tncm91bmRTaWduYWwoKVxuXG4gICAgaWYgKGJhY2tncm91bmQudHlwZSA9PT0gJ2RvdHMnKSB7XG4gICAgICByZXR1cm4gKHRoaXMudmlld3BvcnRTZXJ2aWNlLnJlYWRhYmxlVmlld3BvcnQoKS56b29tICogKGJhY2tncm91bmQuc2l6ZSA/PyBkZWZhdWx0RG90U2l6ZSkpIC8gMlxuICAgIH1cblxuICAgIHJldHVybiAwXG4gIH0pXG5cbiAgLy8gV2l0aG91dCBJRCB0aGVyZSB3aWxsIGJlIHBhdHRlcm4gY29sbGlzaW9uIGZvciBzZXZlcmFsIGZsb3dzIG9uIHRoZSBwYWdlXG4gIC8vIExhdGVyIHBhdHRlcm4gSUQgbWF5IGJlIGV4cG9zZWQgdG8gQVBJXG4gIHByb3RlY3RlZCBwYXR0ZXJuSWQgPSBpZCgpO1xuICBwcm90ZWN0ZWQgcGF0dGVyblVybCA9IGB1cmwoIyR7dGhpcy5wYXR0ZXJuSWR9KWBcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBlZmZlY3QoKCkgPT4ge1xuICAgICAgY29uc3QgYmFja2dyb3VuZCA9IHRoaXMuYmFja2dyb3VuZFNpZ25hbCgpXG5cbiAgICAgIGlmIChiYWNrZ3JvdW5kLnR5cGUgPT09ICdkb3RzJykge1xuICAgICAgICB0aGlzLnJvb3RTdmcuc3R5bGUuYmFja2dyb3VuZENvbG9yID0gYmFja2dyb3VuZC5iYWNrZ3JvdW5kQ29sb3IgPz8gZGVmYXVsdEJnXG4gICAgICB9XG5cbiAgICAgIGlmIChiYWNrZ3JvdW5kLnR5cGUgPT09ICdzb2xpZCcpIHtcbiAgICAgICAgdGhpcy5yb290U3ZnLnN0eWxlLmJhY2tncm91bmRDb2xvciA9IGJhY2tncm91bmQuY29sb3JcbiAgICAgIH1cbiAgICB9KVxuICB9XG59XG4iLCI8bmctY29udGFpbmVyICpuZ0lmPVwiYmFja2dyb3VuZFNpZ25hbCgpLnR5cGUgPT09ICdkb3RzJ1wiPlxuICA8c3ZnOnBhdHRlcm5cbiAgICBbYXR0ci5pZF09XCJwYXR0ZXJuSWRcIlxuICAgIFthdHRyLnhdPVwieCgpXCJcbiAgICBbYXR0ci55XT1cInkoKVwiXG4gICAgW2F0dHIud2lkdGhdPVwic2NhbGVkR2FwKClcIlxuICAgIFthdHRyLmhlaWdodF09XCJzY2FsZWRHYXAoKVwiXG4gICAgcGF0dGVyblVuaXRzPVwidXNlclNwYWNlT25Vc2VcIlxuICA+XG4gICAgPHN2ZzpjaXJjbGVcbiAgICAgIFthdHRyLmN4XT1cInBhdHRlcm5TaXplKClcIlxuICAgICAgW2F0dHIuY3ldPVwicGF0dGVyblNpemUoKVwiXG4gICAgICBbYXR0ci5yXT1cInBhdHRlcm5TaXplKClcIlxuICAgICAgW2F0dHIuZmlsbF09XCJwYXR0ZXJuQ29sb3IoKVwiXG4gICAgLz5cbiAgPC9zdmc6cGF0dGVybj5cblxuICA8c3ZnOnJlY3RcbiAgICB4PVwiMFwiXG4gICAgeT1cIjBcIlxuICAgIHdpZHRoPVwiMTAwJVwiXG4gICAgaGVpZ2h0PVwiMTAwJVwiXG4gICAgW2F0dHIuZmlsbF09XCJwYXR0ZXJuVXJsXCJcbiAgLz5cbjwvbmctY29udGFpbmVyPlxuIl19
@@ -0,0 +1,18 @@
1
+ import { Component, Input } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ export class DefaultNodeComponent {
4
+ constructor() {
5
+ this.selected = false;
6
+ }
7
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: DefaultNodeComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
8
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: DefaultNodeComponent, selector: "default-node", inputs: { selected: "selected" }, host: { properties: { "class.selected": "selected" } }, ngImport: i0, template: "<ng-content />\n", styles: [":host{border:1.5px solid #1b262c;border-radius:5px;display:flex;align-items:center;justify-content:center;color:#000;background-color:#fff}:host(.selected){border-width:2px}\n"] }); }
9
+ }
10
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: DefaultNodeComponent, decorators: [{
11
+ type: Component,
12
+ args: [{ selector: 'default-node', host: {
13
+ '[class.selected]': 'selected'
14
+ }, template: "<ng-content />\n", styles: [":host{border:1.5px solid #1b262c;border-radius:5px;display:flex;align-items:center;justify-content:center;color:#000;background-color:#fff}:host(.selected){border-width:2px}\n"] }]
15
+ }], propDecorators: { selected: [{
16
+ type: Input
17
+ }] } });
18
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVmYXVsdC1ub2RlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC12Zmxvdy1saWIvc3JjL2xpYi92Zmxvdy9jb21wb25lbnRzL2RlZmF1bHQtbm9kZS9kZWZhdWx0LW5vZGUuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXZmbG93LWxpYi9zcmMvbGliL3ZmbG93L2NvbXBvbmVudHMvZGVmYXVsdC1ub2RlL2RlZmF1bHQtbm9kZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFlLEtBQUssRUFBRSxNQUFNLGVBQWUsQ0FBQzs7QUFVOUQsTUFBTSxPQUFPLG9CQUFvQjtJQVJqQztRQVVTLGFBQVEsR0FBRyxLQUFLLENBQUE7S0FDeEI7K0dBSFksb0JBQW9CO21HQUFwQixvQkFBb0IsOElDVmpDLGtCQUNBOzs0RkRTYSxvQkFBb0I7a0JBUmhDLFNBQVM7K0JBQ0UsY0FBYyxRQUdsQjt3QkFDSixrQkFBa0IsRUFBRSxVQUFVO3FCQUMvQjs4QkFJTSxRQUFRO3NCQURkLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIEhvc3RCaW5kaW5nLCBJbnB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdkZWZhdWx0LW5vZGUnLFxuICB0ZW1wbGF0ZVVybDogJy4vZGVmYXVsdC1ub2RlLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbYC4vZGVmYXVsdC1ub2RlLmNvbXBvbmVudC5zY3NzYF0sXG4gIGhvc3Q6IHtcbiAgICAnW2NsYXNzLnNlbGVjdGVkXSc6ICdzZWxlY3RlZCdcbiAgfVxufSlcbmV4cG9ydCBjbGFzcyBEZWZhdWx0Tm9kZUNvbXBvbmVudCB7XG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBzZWxlY3RlZCA9IGZhbHNlXG59XG4iLCI8bmctY29udGVudCAvPlxuIl19
@@ -14,10 +14,11 @@ import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
14
14
  import { NodeAccessorService } from '../../services/node-accessor.service';
15
15
  import * as i0 from "@angular/core";
16
16
  import * as i1 from "@angular/common";
17
- import * as i2 from "../handle/handle.component";
18
- import * as i3 from "../../public-components/resizable/resizable.component";
19
- import * as i4 from "../../directives/handle-size-controller.directive";
20
- import * as i5 from "../../directives/pointer.directive";
17
+ import * as i2 from "../default-node/default-node.component";
18
+ import * as i3 from "../handle/handle.component";
19
+ import * as i4 from "../../public-components/resizable/resizable.component";
20
+ import * as i5 from "../../directives/handle-size-controller.directive";
21
+ import * as i6 from "../../directives/pointer.directive";
21
22
  export class NodeComponent {
22
23
  constructor() {
23
24
  this.injector = inject(Injector);
@@ -92,7 +93,7 @@ export class NodeComponent {
92
93
  }
93
94
  }
94
95
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: NodeComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
95
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: NodeComponent, selector: "g[node]", inputs: { nodeModel: "nodeModel", nodeTemplate: "nodeTemplate", groupNodeTemplate: "groupNodeTemplate" }, providers: [HandleService, NodeAccessorService], viewQueries: [{ propertyName: "nodeContentRef", first: true, predicate: ["nodeContent"], descendants: true }, { propertyName: "htmlWrapperRef", first: true, predicate: ["htmlWrapper"], descendants: true }], ngImport: i0, template: "<!-- Default node -->\n<svg:foreignObject\n *ngIf=\"nodeModel.node.type === 'default'\"\n class=\"selectable\"\n #nodeContent\n [attr.width]=\"nodeModel.size().width\"\n [attr.height]=\"nodeModel.size().height\"\n (mousedown)=\"pullNode(); selectNode()\"\n>\n <div\n #htmlWrapper\n class=\"default-node\"\n [class.default-node_selected]=\"nodeModel.selected()\"\n [style.width]=\"styleWidth()\"\n [style.height]=\"styleHeight()\"\n [style.max-width]=\"styleWidth()\"\n [style.max-height]=\"styleHeight()\"\n >\n <div [outerHTML]=\"nodeModel.text()\"></div>\n\n <handle type=\"source\" [position]=\"nodeModel.sourcePosition()\" />\n <handle type=\"target\" [position]=\"nodeModel.targetPosition()\" />\n </div>\n</svg:foreignObject>\n\n<!-- Template node -->\n<svg:foreignObject\n *ngIf=\"nodeModel.node.type === 'html-template' && nodeTemplate\"\n class=\"selectable\"\n [attr.width]=\"nodeModel.size().width\"\n [attr.height]=\"nodeModel.size().height\"\n (mousedown)=\"pullNode()\"\n>\n <div\n #htmlWrapper\n class=\"wrapper\"\n [style.width]=\"styleWidth()\"\n [style.height]=\"styleHeight()\"\n >\n <ng-container\n [ngTemplateOutlet]=\"nodeTemplate\"\n [ngTemplateOutletContext]=\"{ $implicit: { node: nodeModel.node, selected: nodeModel.selected } }\"\n [ngTemplateOutletInjector]=\"injector\"\n />\n </div>\n</svg:foreignObject>\n\n<!-- Component node -->\n<svg:foreignObject\n *ngIf=\"nodeModel.isComponentType\"\n class=\"selectable\"\n [attr.width]=\"nodeModel.size().width\"\n [attr.height]=\"nodeModel.size().height\"\n (mousedown)=\"pullNode()\"\n>\n <div\n #htmlWrapper\n class=\"wrapper\"\n [style.width]=\"styleWidth()\"\n [style.height]=\"styleHeight()\"\n >\n <ng-container\n [ngComponentOutlet]=\"$any(nodeModel.node.type)\"\n [ngComponentOutletInputs]=\"nodeModel.componentTypeInputs()\"\n [ngComponentOutletInjector]=\"injector\"\n />\n </div>\n</svg:foreignObject>\n\n<!-- Default group node -->\n<svg:rect\n *ngIf=\"nodeModel.node.type === 'default-group'\"\n [resizable]=\"nodeModel.resizable()\"\n [gap]=\"3\"\n [resizerColor]=\"nodeModel.color()\"\n class=\"default-group-node\"\n rx=\"5\"\n ry=\"5\"\n [class.default-group-node_selected]=\"nodeModel.selected()\"\n [attr.width]=\"nodeModel.size().width\"\n [attr.height]=\"nodeModel.size().height\"\n [style.stroke]=\"nodeModel.color()\"\n [style.fill]=\"nodeModel.color()\"\n (mousedown)=\"pullNode(); selectNode()\"\n/>\n\n<!-- Template group node -->\n<svg:g\n *ngIf=\"nodeModel.node.type === 'template-group' && groupNodeTemplate\"\n class=\"selectable\"\n (mousedown)=\"pullNode()\"\n>\n <ng-container\n [ngTemplateOutlet]=\"groupNodeTemplate\"\n [ngTemplateOutletContext]=\"{ $implicit: { node: nodeModel.node, selected: nodeModel.selected, width: nodeModel.width, height: nodeModel.height } }\"\n [ngTemplateOutletInjector]=\"injector\"\n />\n</svg:g>\n\n<!-- Resizer -->\n<ng-container *ngIf=\"nodeModel.resizerTemplate() as template\">\n <ng-container *ngIf=\"nodeModel.resizable()\">\n <ng-template [ngTemplateOutlet]=\"template\" />\n </ng-container>\n</ng-container>\n\n<!-- Handles -->\n<ng-container *ngFor=\"let handle of nodeModel.handles()\">\n <svg:circle\n *ngIf=\"!handle.template\"\n class=\"default-handle\"\n [attr.cx]=\"handle.offset().x\"\n [attr.cy]=\"handle.offset().y\"\n [attr.stroke-width]=\"handle.strokeWidth\"\n r=\"5\"\n (pointerStart)=\"startConnection($event, handle)\"\n (pointerEnd)=\"endConnection(handle)\"\n />\n\n <svg:g\n *ngIf=\"handle.template\"\n [handleSizeController]=\"handle\"\n (pointerStart)=\"startConnection($event, handle)\"\n (pointerEnd)=\"endConnection(handle)\"\n >\n <ng-container *ngTemplateOutlet=\"handle.template; context: handle.templateContext\" />\n </svg:g>\n\n <svg:circle\n *ngIf=\"showMagnet()\"\n class=\"magnet\"\n [attr.r]=\"nodeModel.magnetRadius\"\n [attr.cx]=\"handle.offset().x\"\n [attr.cy]=\"handle.offset().y\"\n (pointerEnd)=\"endConnection(handle); resetValidateConnection(handle)\"\n (pointerOver)=\"validateConnection(handle)\"\n (pointerOut)=\"resetValidateConnection(handle)\"\n />\n</ng-container>\n", styles: [".magnet{opacity:0}.wrapper{display:table-cell}.default-node{border:1.5px solid #1b262c;border-radius:5px;display:flex;align-items:center;justify-content:center;color:#000;background-color:#fff}.default-node_selected{border-width:2px}.default-group-node{stroke-width:1.5px;fill-opacity:.05}.default-group-node_selected{stroke-width:2px}.default-handle{stroke:#fff;fill:#1b262c}\n"], dependencies: [{ kind: "directive", type: i1.NgComponentOutlet, selector: "[ngComponentOutlet]", inputs: ["ngComponentOutlet", "ngComponentOutletInputs", "ngComponentOutletInjector", "ngComponentOutletContent", "ngComponentOutletNgModule", "ngComponentOutletNgModuleFactory"] }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: i2.HandleComponent, selector: "handle", inputs: ["position", "type", "id", "template"] }, { kind: "component", type: i3.ResizableComponent, selector: "[resizable]", inputs: ["resizable", "resizerColor", "gap"] }, { kind: "directive", type: i4.HandleSizeControllerDirective, selector: "[handleSizeController]", inputs: ["handleSizeController"] }, { kind: "directive", type: i5.PointerDirective, selector: "[pointerStart], [pointerEnd], [pointerOver], [pointerOut]", outputs: ["pointerOver", "pointerOut", "pointerStart", "pointerEnd"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
96
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: NodeComponent, selector: "g[node]", inputs: { nodeModel: "nodeModel", nodeTemplate: "nodeTemplate", groupNodeTemplate: "groupNodeTemplate" }, providers: [HandleService, NodeAccessorService], viewQueries: [{ propertyName: "nodeContentRef", first: true, predicate: ["nodeContent"], descendants: true }, { propertyName: "htmlWrapperRef", first: true, predicate: ["htmlWrapper"], descendants: true }], ngImport: i0, template: "<!-- Default node -->\n<svg:foreignObject\n *ngIf=\"nodeModel.node.type === 'default'\"\n class=\"selectable\"\n #nodeContent\n [attr.width]=\"nodeModel.size().width\"\n [attr.height]=\"nodeModel.size().height\"\n (pointerStart)=\"pullNode(); selectNode()\"\n>\n <default-node\n #htmlWrapper\n [selected]=\"nodeModel.selected()\"\n [style.width]=\"styleWidth()\"\n [style.height]=\"styleHeight()\"\n [style.max-width]=\"styleWidth()\"\n [style.max-height]=\"styleHeight()\"\n >\n <div [outerHTML]=\"nodeModel.text()\"></div>\n\n <handle type=\"source\" [position]=\"nodeModel.sourcePosition()\" />\n <handle type=\"target\" [position]=\"nodeModel.targetPosition()\" />\n </default-node>\n</svg:foreignObject>\n\n<!-- Template node -->\n<svg:foreignObject\n *ngIf=\"nodeModel.node.type === 'html-template' && nodeTemplate\"\n class=\"selectable\"\n [attr.width]=\"nodeModel.size().width\"\n [attr.height]=\"nodeModel.size().height\"\n (pointerStart)=\"pullNode()\"\n>\n <div\n #htmlWrapper\n class=\"wrapper\"\n [style.width]=\"styleWidth()\"\n [style.height]=\"styleHeight()\"\n >\n <ng-container\n [ngTemplateOutlet]=\"nodeTemplate\"\n [ngTemplateOutletContext]=\"{ $implicit: { node: nodeModel.node, selected: nodeModel.selected } }\"\n [ngTemplateOutletInjector]=\"injector\"\n />\n </div>\n</svg:foreignObject>\n\n<!-- Component node -->\n<svg:foreignObject\n *ngIf=\"nodeModel.isComponentType\"\n class=\"selectable\"\n [attr.width]=\"nodeModel.size().width\"\n [attr.height]=\"nodeModel.size().height\"\n (pointerStart)=\"pullNode()\"\n>\n <div\n #htmlWrapper\n class=\"wrapper\"\n [style.width]=\"styleWidth()\"\n [style.height]=\"styleHeight()\"\n >\n <ng-container\n [ngComponentOutlet]=\"$any(nodeModel.node.type)\"\n [ngComponentOutletInputs]=\"nodeModel.componentTypeInputs()\"\n [ngComponentOutletInjector]=\"injector\"\n />\n </div>\n</svg:foreignObject>\n\n<!-- Default group node -->\n<svg:rect\n *ngIf=\"nodeModel.node.type === 'default-group'\"\n [resizable]=\"nodeModel.resizable()\"\n [gap]=\"3\"\n [resizerColor]=\"nodeModel.color()\"\n class=\"default-group-node\"\n rx=\"5\"\n ry=\"5\"\n [class.default-group-node_selected]=\"nodeModel.selected()\"\n [attr.width]=\"nodeModel.size().width\"\n [attr.height]=\"nodeModel.size().height\"\n [style.stroke]=\"nodeModel.color()\"\n [style.fill]=\"nodeModel.color()\"\n (pointerStart)=\"pullNode(); selectNode()\"\n/>\n\n<!-- Template group node -->\n<svg:g\n *ngIf=\"nodeModel.node.type === 'template-group' && groupNodeTemplate\"\n class=\"selectable\"\n (pointerStart)=\"pullNode()\"\n>\n <ng-container\n [ngTemplateOutlet]=\"groupNodeTemplate\"\n [ngTemplateOutletContext]=\"{ $implicit: { node: nodeModel.node, selected: nodeModel.selected, width: nodeModel.width, height: nodeModel.height } }\"\n [ngTemplateOutletInjector]=\"injector\"\n />\n</svg:g>\n\n<!-- Resizer -->\n<ng-container *ngIf=\"nodeModel.resizerTemplate() as template\">\n <ng-container *ngIf=\"nodeModel.resizable()\">\n <ng-template [ngTemplateOutlet]=\"template\" />\n </ng-container>\n</ng-container>\n\n<!-- Handles -->\n<ng-container *ngFor=\"let handle of nodeModel.handles()\">\n <svg:circle\n *ngIf=\"!handle.template\"\n class=\"default-handle\"\n [attr.cx]=\"handle.offset().x\"\n [attr.cy]=\"handle.offset().y\"\n [attr.stroke-width]=\"handle.strokeWidth\"\n r=\"5\"\n (pointerStart)=\"startConnection($event, handle)\"\n (pointerEnd)=\"endConnection(handle)\"\n />\n\n <svg:g\n *ngIf=\"handle.template\"\n [handleSizeController]=\"handle\"\n (pointerStart)=\"startConnection($event, handle)\"\n (pointerEnd)=\"endConnection(handle)\"\n >\n <ng-container *ngTemplateOutlet=\"handle.template; context: handle.templateContext\" />\n </svg:g>\n\n <svg:circle\n *ngIf=\"showMagnet()\"\n class=\"magnet\"\n [attr.r]=\"nodeModel.magnetRadius\"\n [attr.cx]=\"handle.offset().x\"\n [attr.cy]=\"handle.offset().y\"\n (pointerEnd)=\"endConnection(handle); resetValidateConnection(handle)\"\n (pointerOver)=\"validateConnection(handle)\"\n (pointerOut)=\"resetValidateConnection(handle)\"\n />\n</ng-container>\n", styles: [".magnet{opacity:0}.wrapper{display:table-cell}.default-group-node{stroke-width:1.5px;fill-opacity:.05}.default-group-node_selected{stroke-width:2px}.default-handle{stroke:#fff;fill:#1b262c}\n"], dependencies: [{ kind: "directive", type: i1.NgComponentOutlet, selector: "[ngComponentOutlet]", inputs: ["ngComponentOutlet", "ngComponentOutletInputs", "ngComponentOutletInjector", "ngComponentOutletContent", "ngComponentOutletNgModule", "ngComponentOutletNgModuleFactory"] }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: i2.DefaultNodeComponent, selector: "default-node", inputs: ["selected"] }, { kind: "component", type: i3.HandleComponent, selector: "handle", inputs: ["position", "type", "id", "template"] }, { kind: "component", type: i4.ResizableComponent, selector: "[resizable]", inputs: ["resizable", "resizerColor", "gap"] }, { kind: "directive", type: i5.HandleSizeControllerDirective, selector: "[handleSizeController]", inputs: ["handleSizeController"] }, { kind: "directive", type: i6.PointerDirective, selector: "[pointerStart], [pointerEnd], [pointerOver], [pointerOut]", outputs: ["pointerOver", "pointerOut", "pointerStart", "pointerEnd"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
96
97
  }
97
98
  __decorate([
98
99
  InjectionContext
@@ -102,7 +103,7 @@ __decorate([
102
103
  ], NodeComponent.prototype, "ngAfterViewInit", null);
103
104
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: NodeComponent, decorators: [{
104
105
  type: Component,
105
- args: [{ selector: 'g[node]', changeDetection: ChangeDetectionStrategy.OnPush, providers: [HandleService, NodeAccessorService], template: "<!-- Default node -->\n<svg:foreignObject\n *ngIf=\"nodeModel.node.type === 'default'\"\n class=\"selectable\"\n #nodeContent\n [attr.width]=\"nodeModel.size().width\"\n [attr.height]=\"nodeModel.size().height\"\n (mousedown)=\"pullNode(); selectNode()\"\n>\n <div\n #htmlWrapper\n class=\"default-node\"\n [class.default-node_selected]=\"nodeModel.selected()\"\n [style.width]=\"styleWidth()\"\n [style.height]=\"styleHeight()\"\n [style.max-width]=\"styleWidth()\"\n [style.max-height]=\"styleHeight()\"\n >\n <div [outerHTML]=\"nodeModel.text()\"></div>\n\n <handle type=\"source\" [position]=\"nodeModel.sourcePosition()\" />\n <handle type=\"target\" [position]=\"nodeModel.targetPosition()\" />\n </div>\n</svg:foreignObject>\n\n<!-- Template node -->\n<svg:foreignObject\n *ngIf=\"nodeModel.node.type === 'html-template' && nodeTemplate\"\n class=\"selectable\"\n [attr.width]=\"nodeModel.size().width\"\n [attr.height]=\"nodeModel.size().height\"\n (mousedown)=\"pullNode()\"\n>\n <div\n #htmlWrapper\n class=\"wrapper\"\n [style.width]=\"styleWidth()\"\n [style.height]=\"styleHeight()\"\n >\n <ng-container\n [ngTemplateOutlet]=\"nodeTemplate\"\n [ngTemplateOutletContext]=\"{ $implicit: { node: nodeModel.node, selected: nodeModel.selected } }\"\n [ngTemplateOutletInjector]=\"injector\"\n />\n </div>\n</svg:foreignObject>\n\n<!-- Component node -->\n<svg:foreignObject\n *ngIf=\"nodeModel.isComponentType\"\n class=\"selectable\"\n [attr.width]=\"nodeModel.size().width\"\n [attr.height]=\"nodeModel.size().height\"\n (mousedown)=\"pullNode()\"\n>\n <div\n #htmlWrapper\n class=\"wrapper\"\n [style.width]=\"styleWidth()\"\n [style.height]=\"styleHeight()\"\n >\n <ng-container\n [ngComponentOutlet]=\"$any(nodeModel.node.type)\"\n [ngComponentOutletInputs]=\"nodeModel.componentTypeInputs()\"\n [ngComponentOutletInjector]=\"injector\"\n />\n </div>\n</svg:foreignObject>\n\n<!-- Default group node -->\n<svg:rect\n *ngIf=\"nodeModel.node.type === 'default-group'\"\n [resizable]=\"nodeModel.resizable()\"\n [gap]=\"3\"\n [resizerColor]=\"nodeModel.color()\"\n class=\"default-group-node\"\n rx=\"5\"\n ry=\"5\"\n [class.default-group-node_selected]=\"nodeModel.selected()\"\n [attr.width]=\"nodeModel.size().width\"\n [attr.height]=\"nodeModel.size().height\"\n [style.stroke]=\"nodeModel.color()\"\n [style.fill]=\"nodeModel.color()\"\n (mousedown)=\"pullNode(); selectNode()\"\n/>\n\n<!-- Template group node -->\n<svg:g\n *ngIf=\"nodeModel.node.type === 'template-group' && groupNodeTemplate\"\n class=\"selectable\"\n (mousedown)=\"pullNode()\"\n>\n <ng-container\n [ngTemplateOutlet]=\"groupNodeTemplate\"\n [ngTemplateOutletContext]=\"{ $implicit: { node: nodeModel.node, selected: nodeModel.selected, width: nodeModel.width, height: nodeModel.height } }\"\n [ngTemplateOutletInjector]=\"injector\"\n />\n</svg:g>\n\n<!-- Resizer -->\n<ng-container *ngIf=\"nodeModel.resizerTemplate() as template\">\n <ng-container *ngIf=\"nodeModel.resizable()\">\n <ng-template [ngTemplateOutlet]=\"template\" />\n </ng-container>\n</ng-container>\n\n<!-- Handles -->\n<ng-container *ngFor=\"let handle of nodeModel.handles()\">\n <svg:circle\n *ngIf=\"!handle.template\"\n class=\"default-handle\"\n [attr.cx]=\"handle.offset().x\"\n [attr.cy]=\"handle.offset().y\"\n [attr.stroke-width]=\"handle.strokeWidth\"\n r=\"5\"\n (pointerStart)=\"startConnection($event, handle)\"\n (pointerEnd)=\"endConnection(handle)\"\n />\n\n <svg:g\n *ngIf=\"handle.template\"\n [handleSizeController]=\"handle\"\n (pointerStart)=\"startConnection($event, handle)\"\n (pointerEnd)=\"endConnection(handle)\"\n >\n <ng-container *ngTemplateOutlet=\"handle.template; context: handle.templateContext\" />\n </svg:g>\n\n <svg:circle\n *ngIf=\"showMagnet()\"\n class=\"magnet\"\n [attr.r]=\"nodeModel.magnetRadius\"\n [attr.cx]=\"handle.offset().x\"\n [attr.cy]=\"handle.offset().y\"\n (pointerEnd)=\"endConnection(handle); resetValidateConnection(handle)\"\n (pointerOver)=\"validateConnection(handle)\"\n (pointerOut)=\"resetValidateConnection(handle)\"\n />\n</ng-container>\n", styles: [".magnet{opacity:0}.wrapper{display:table-cell}.default-node{border:1.5px solid #1b262c;border-radius:5px;display:flex;align-items:center;justify-content:center;color:#000;background-color:#fff}.default-node_selected{border-width:2px}.default-group-node{stroke-width:1.5px;fill-opacity:.05}.default-group-node_selected{stroke-width:2px}.default-handle{stroke:#fff;fill:#1b262c}\n"] }]
106
+ args: [{ selector: 'g[node]', changeDetection: ChangeDetectionStrategy.OnPush, providers: [HandleService, NodeAccessorService], template: "<!-- Default node -->\n<svg:foreignObject\n *ngIf=\"nodeModel.node.type === 'default'\"\n class=\"selectable\"\n #nodeContent\n [attr.width]=\"nodeModel.size().width\"\n [attr.height]=\"nodeModel.size().height\"\n (pointerStart)=\"pullNode(); selectNode()\"\n>\n <default-node\n #htmlWrapper\n [selected]=\"nodeModel.selected()\"\n [style.width]=\"styleWidth()\"\n [style.height]=\"styleHeight()\"\n [style.max-width]=\"styleWidth()\"\n [style.max-height]=\"styleHeight()\"\n >\n <div [outerHTML]=\"nodeModel.text()\"></div>\n\n <handle type=\"source\" [position]=\"nodeModel.sourcePosition()\" />\n <handle type=\"target\" [position]=\"nodeModel.targetPosition()\" />\n </default-node>\n</svg:foreignObject>\n\n<!-- Template node -->\n<svg:foreignObject\n *ngIf=\"nodeModel.node.type === 'html-template' && nodeTemplate\"\n class=\"selectable\"\n [attr.width]=\"nodeModel.size().width\"\n [attr.height]=\"nodeModel.size().height\"\n (pointerStart)=\"pullNode()\"\n>\n <div\n #htmlWrapper\n class=\"wrapper\"\n [style.width]=\"styleWidth()\"\n [style.height]=\"styleHeight()\"\n >\n <ng-container\n [ngTemplateOutlet]=\"nodeTemplate\"\n [ngTemplateOutletContext]=\"{ $implicit: { node: nodeModel.node, selected: nodeModel.selected } }\"\n [ngTemplateOutletInjector]=\"injector\"\n />\n </div>\n</svg:foreignObject>\n\n<!-- Component node -->\n<svg:foreignObject\n *ngIf=\"nodeModel.isComponentType\"\n class=\"selectable\"\n [attr.width]=\"nodeModel.size().width\"\n [attr.height]=\"nodeModel.size().height\"\n (pointerStart)=\"pullNode()\"\n>\n <div\n #htmlWrapper\n class=\"wrapper\"\n [style.width]=\"styleWidth()\"\n [style.height]=\"styleHeight()\"\n >\n <ng-container\n [ngComponentOutlet]=\"$any(nodeModel.node.type)\"\n [ngComponentOutletInputs]=\"nodeModel.componentTypeInputs()\"\n [ngComponentOutletInjector]=\"injector\"\n />\n </div>\n</svg:foreignObject>\n\n<!-- Default group node -->\n<svg:rect\n *ngIf=\"nodeModel.node.type === 'default-group'\"\n [resizable]=\"nodeModel.resizable()\"\n [gap]=\"3\"\n [resizerColor]=\"nodeModel.color()\"\n class=\"default-group-node\"\n rx=\"5\"\n ry=\"5\"\n [class.default-group-node_selected]=\"nodeModel.selected()\"\n [attr.width]=\"nodeModel.size().width\"\n [attr.height]=\"nodeModel.size().height\"\n [style.stroke]=\"nodeModel.color()\"\n [style.fill]=\"nodeModel.color()\"\n (pointerStart)=\"pullNode(); selectNode()\"\n/>\n\n<!-- Template group node -->\n<svg:g\n *ngIf=\"nodeModel.node.type === 'template-group' && groupNodeTemplate\"\n class=\"selectable\"\n (pointerStart)=\"pullNode()\"\n>\n <ng-container\n [ngTemplateOutlet]=\"groupNodeTemplate\"\n [ngTemplateOutletContext]=\"{ $implicit: { node: nodeModel.node, selected: nodeModel.selected, width: nodeModel.width, height: nodeModel.height } }\"\n [ngTemplateOutletInjector]=\"injector\"\n />\n</svg:g>\n\n<!-- Resizer -->\n<ng-container *ngIf=\"nodeModel.resizerTemplate() as template\">\n <ng-container *ngIf=\"nodeModel.resizable()\">\n <ng-template [ngTemplateOutlet]=\"template\" />\n </ng-container>\n</ng-container>\n\n<!-- Handles -->\n<ng-container *ngFor=\"let handle of nodeModel.handles()\">\n <svg:circle\n *ngIf=\"!handle.template\"\n class=\"default-handle\"\n [attr.cx]=\"handle.offset().x\"\n [attr.cy]=\"handle.offset().y\"\n [attr.stroke-width]=\"handle.strokeWidth\"\n r=\"5\"\n (pointerStart)=\"startConnection($event, handle)\"\n (pointerEnd)=\"endConnection(handle)\"\n />\n\n <svg:g\n *ngIf=\"handle.template\"\n [handleSizeController]=\"handle\"\n (pointerStart)=\"startConnection($event, handle)\"\n (pointerEnd)=\"endConnection(handle)\"\n >\n <ng-container *ngTemplateOutlet=\"handle.template; context: handle.templateContext\" />\n </svg:g>\n\n <svg:circle\n *ngIf=\"showMagnet()\"\n class=\"magnet\"\n [attr.r]=\"nodeModel.magnetRadius\"\n [attr.cx]=\"handle.offset().x\"\n [attr.cy]=\"handle.offset().y\"\n (pointerEnd)=\"endConnection(handle); resetValidateConnection(handle)\"\n (pointerOver)=\"validateConnection(handle)\"\n (pointerOut)=\"resetValidateConnection(handle)\"\n />\n</ng-container>\n", styles: [".magnet{opacity:0}.wrapper{display:table-cell}.default-group-node{stroke-width:1.5px;fill-opacity:.05}.default-group-node_selected{stroke-width:2px}.default-handle{stroke:#fff;fill:#1b262c}\n"] }]
106
107
  }], propDecorators: { nodeModel: [{
107
108
  type: Input
108
109
  }], nodeTemplate: [{
@@ -116,4 +117,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
116
117
  type: ViewChild,
117
118
  args: ['htmlWrapper']
118
119
  }], ngOnInit: [], ngAfterViewInit: [] } });
119
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm9kZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtdmZsb3ctbGliL3NyYy9saWIvdmZsb3cvY29tcG9uZW50cy9ub2RlL25vZGUuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXZmbG93LWxpYi9zcmMvbGliL3ZmbG93L2NvbXBvbmVudHMvbm9kZS9ub2RlLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQWlCLHVCQUF1QixFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQWtDLFNBQVMsRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM1TCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUVwRSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUN2RSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFFOUQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ2xELE9BQU8sRUFBRSxNQUFNLEVBQVMsR0FBRyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3JFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBZ0IsTUFBTSxxREFBcUQsQ0FBQztBQUNyRyxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSx1Q0FBdUMsQ0FBQztBQUM3RSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQUMzRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUNwRSxPQUFPLEVBQUUsNkJBQTZCLEVBQUUsTUFBTSxrREFBa0QsQ0FBQztB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QUFLO2dCQUlDLGNBQWM7c0JBRHBCLFNBQVM7dUJBQUMsYUFBYTtnQkFJakIsY0FBYztzQkFEcEIsU0FBUzt1QkFBQyxhQUFhO2dCQVlqQixRQUFRLE1BNkJSLGVBQWUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBZnRlclZpZXdJbml0LCBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ29tcG9uZW50LCBFbGVtZW50UmVmLCBJbmplY3RvciwgSW5wdXQsIE5nWm9uZSwgT25EZXN0cm95LCBPbkluaXQsIFRlbXBsYXRlUmVmLCBWaWV3Q2hpbGQsIGNvbXB1dGVkLCBlZmZlY3QsIGluamVjdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRHJhZ2dhYmxlU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2RyYWdnYWJsZS5zZXJ2aWNlJztcbmltcG9ydCB7IE5vZGVNb2RlbCB9IGZyb20gJy4uLy4uL21vZGVscy9ub2RlLm1vZGVsJztcbmltcG9ydCB7IEZsb3dTdGF0dXNTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvZmxvdy1zdGF0dXMuc2VydmljZSc7XG5pbXBvcnQgeyBIYW5kbGVTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvaGFuZGxlLnNlcnZpY2UnO1xuaW1wb3J0IHsgSGFuZGxlTW9kZWwgfSBmcm9tICcuLi8uLi9tb2RlbHMvaGFuZGxlLm1vZGVsJztcbmltcG9ydCB7IHJlc2l6YWJsZSB9IGZyb20gJy4uLy4uL3V0aWxzL3Jlc2l6YWJsZSc7XG5pbXBvcnQgeyBmaWx0ZXIsIGZpcnN0LCBtYXAsIHN0YXJ0V2l0aCwgc3dpdGNoTWFwLCB0YXAgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IEluamVjdGlvbkNvbnRleHQsIFdpdGhJbmplY3RvciB9IGZyb20gJy4uLy4uL2RlY29yYXRvcnMvcnVuLWluLWluamVjdGlvbi1jb250ZXh0LmRlY29yYXRvcic7XG5pbXBvcnQgeyBOb2RlUmVuZGVyaW5nU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL25vZGUtcmVuZGVyaW5nLnNlcnZpY2UnO1xuaW1wb3J0IHsgRmxvd1NldHRpbmdzU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2Zsb3ctc2V0dGluZ3Muc2VydmljZSc7XG5pbXBvcnQgeyBTZWxlY3Rpb25TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvc2VsZWN0aW9uLnNlcnZpY2UnO1xuaW1wb3J0IHsgQ29ubmVjdGlvbkNvbnRyb2xsZXJEaXJlY3RpdmUgfSBmcm9tICcuLi8uLi9kaXJlY3RpdmVzL2Nvbm5lY3Rpb24tY29udHJvbGxlci5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgdGFrZVVudGlsRGVzdHJveWVkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZS9yeGpzLWludGVyb3AnO1xuaW1wb3J0IHsgTm9kZUFjY2Vzc29yU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL25vZGUtYWNjZXNzb3Iuc2VydmljZSc7XG5cbmV4cG9ydCB0eXBlIEhhbmRsZVN0YXRlID0gJ3ZhbGlkJyB8ICdpbnZhbGlkJyB8ICdpZGxlJ1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdnW25vZGVdJyxcbiAgdGVtcGxhdGVVcmw6ICcuL25vZGUuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9ub2RlLmNvbXBvbmVudC5zY3NzJ10sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICBwcm92aWRlcnM6IFtIYW5kbGVTZXJ2aWNlLCBOb2RlQWNjZXNzb3JTZXJ2aWNlXVxufSlcbmV4cG9ydCBjbGFzcyBOb2RlQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3ksIFdpdGhJbmplY3RvciB7XG4gIHB1YmxpYyBpbmplY3RvciA9IGluamVjdChJbmplY3RvcilcbiAgcHJpdmF0ZSBoYW5kbGVTZXJ2aWNlID0gaW5qZWN0KEhhbmRsZVNlcnZpY2UpXG4gIHByaXZhdGUgZHJhZ2dhYmxlU2VydmljZSA9IGluamVjdChEcmFnZ2FibGVTZXJ2aWNlKVxuICBwcml2YXRlIGZsb3dTdGF0dXNTZXJ2aWNlID0gaW5qZWN0KEZsb3dTdGF0dXNTZXJ2aWNlKVxuICBwcml2YXRlIG5vZGVSZW5kZXJpbmdTZXJ2aWNlID0gaW5qZWN0KE5vZGVSZW5kZXJpbmdTZXJ2aWNlKVxuICBwcml2YXRlIGZsb3dTZXR0aW5nc1NlcnZpY2UgPSBpbmplY3QoRmxvd1NldHRpbmdzU2VydmljZSlcbiAgcHJpdmF0ZSBzZWxlY3Rpb25TZXJ2aWNlID0gaW5qZWN0KFNlbGVjdGlvblNlcnZpY2UpXG4gIHByaXZhdGUgaG9zdFJlZiA9IGluamVjdDxFbGVtZW50UmVmPFNWR0VsZW1lbnQ+PihFbGVtZW50UmVmKVxuICBwcml2YXRlIGNvbm5lY3Rpb25Db250cm9sbGVyID0gaW5qZWN0KENvbm5lY3Rpb25Db250cm9sbGVyRGlyZWN0aXZlKVxuICBwcml2YXRlIG5vZGVBY2Nlc3NvciA9IGluamVjdChOb2RlQWNjZXNzb3JTZXJ2aWNlKTtcbiAgcHJpdmF0ZSB6b25lID0gaW5qZWN0KE5nWm9uZSlcblxuICBASW5wdXQoKVxuICBwdWJsaWMgbm9kZU1vZGVsITogTm9kZU1vZGVsXG5cbiAgQElucHV0KClcbiAgcHVibGljIG5vZGVUZW1wbGF0ZT86IFRlbXBsYXRlUmVmPGFueT5cblxuICBASW5wdXQoKVxuICBwdWJsaWMgZ3JvdXBOb2RlVGVtcGxhdGU/OiBUZW1wbGF0ZVJlZjxhbnk+XG5cbiAgQFZpZXdDaGlsZCgnbm9kZUNvbnRlbnQnKVxuICBwdWJsaWMgbm9kZUNvbnRlbnRSZWYhOiBFbGVtZW50UmVmPFNWR0dyYXBoaWNzRWxlbWVudD5cblxuICBAVmlld0NoaWxkKCdodG1sV3JhcHBlcicpXG4gIHB1YmxpYyBodG1sV3JhcHBlclJlZiE6IEVsZW1lbnRSZWY8SFRNTERpdkVsZW1lbnQ+XG5cbiAgcHJvdGVjdGVkIHNob3dNYWduZXQgPSBjb21wdXRlZCgoKSA9PlxuICAgIHRoaXMuZmxvd1N0YXR1c1NlcnZpY2Uuc3RhdHVzKCkuc3RhdGUgPT09ICdjb25uZWN0aW9uLXN0YXJ0JyB8fFxuICAgIHRoaXMuZmxvd1N0YXR1c1NlcnZpY2Uuc3RhdHVzKCkuc3RhdGUgPT09ICdjb25uZWN0aW9uLXZhbGlkYXRpb24nXG4gIClcblxuICBwcm90ZWN0ZWQgc3R5bGVXaWR0aCA9IGNvbXB1dGVkKCgpID0+IGAke3RoaXMubm9kZU1vZGVsLnNpemUoKS53aWR0aH1weGApXG4gIHByb3RlY3RlZCBzdHlsZUhlaWdodCA9IGNvbXB1dGVkKCgpID0+IGAke3RoaXMubm9kZU1vZGVsLnNpemUoKS5oZWlnaHR9cHhgKVxuXG4gIEBJbmplY3Rpb25Db250ZXh0XG4gIHB1YmxpYyBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLm5vZGVBY2Nlc3Nvci5tb2RlbC5zZXQodGhpcy5ub2RlTW9kZWwpO1xuXG4gICAgdGhpcy5oYW5kbGVTZXJ2aWNlLm5vZGUuc2V0KHRoaXMubm9kZU1vZGVsKTtcblxuICAgIGVmZmVjdCgoKSA9PiB7XG4gICAgICBpZiAodGhpcy5ub2RlTW9kZWwuZHJhZ2dhYmxlKCkpIHtcbiAgICAgICAgdGhpcy5kcmFnZ2FibGVTZXJ2aWNlLmVuYWJsZSh0aGlzLmhvc3RSZWYubmF0aXZlRWxlbWVudCwgdGhpcy5ub2RlTW9kZWwpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmRyYWdnYWJsZVNlcnZpY2UuZGlzYWJsZSh0aGlzLmhvc3RSZWYubmF0aXZlRWxlbWVudClcbiAgICAgIH1cbiAgICB9KVxuXG4gICAgdGhpcy5ub2RlTW9kZWwuaGFuZGxlcyRcbiAgICAgIC5waXBlKFxuICAgICAgICBzd2l0Y2hNYXAoKGhhbmRsZXMpID0+XG4gICAgICAgICAgcmVzaXphYmxlKGhhbmRsZXMubWFwKGggPT4gaC5wYXJlbnRSZWZlcmVuY2UhKSwgdGhpcy56b25lKVxuICAgICAgICAgICAgLnBpcGUobWFwKCgpID0+IGhhbmRsZXMpKVxuICAgICAgICApLFxuICAgICAgICB0YXAoKGhhbmRsZXMpID0+IHtcbiAgICAgICAgICAvLyBUT0RPIChwZXJmb3JtYW5jZSkgaW5zcGVjdCBob3cgdG8gYXZvaWQgY2FsbHMgb2YgdGhpcyB3aGVuIGZsb3cgaW5pdGlhbGx5IHJlbmRlcmVkXG4gICAgICAgICAgaGFuZGxlcy5mb3JFYWNoKGggPT4gaC51cGRhdGVQYXJlbnQoKSlcbiAgICAgICAgfSksXG4gICAgICAgIHRha2VVbnRpbERlc3Ryb3llZCgpXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKClcbiAgfVxuXG4gIEBJbmplY3Rpb25Db250ZXh0XG4gIHB1YmxpYyBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XG4gICAgdGhpcy5ub2RlTW9kZWwubGlua0RlZmF1bHROb2RlU2l6ZVdpdGhNb2RlbFNpemUoKVxuXG4gICAgaWYgKHRoaXMubm9kZU1vZGVsLm5vZGUudHlwZSA9PT0gJ2h0bWwtdGVtcGxhdGUnIHx8IHRoaXMubm9kZU1vZGVsLmlzQ29tcG9uZW50VHlwZSkge1xuICAgICAgcmVzaXphYmxlKFt0aGlzLmh0bWxXcmFwcGVyUmVmLm5hdGl2ZUVsZW1lbnRdLCB0aGlzLnpvbmUpXG4gICAgICAgIC5waXBlKFxuICAgICAgICAgIHN0YXJ0V2l0aChudWxsKSxcbiAgICAgICAgICB0YXAoKCkgPT4gdGhpcy5ub2RlTW9kZWwuaGFuZGxlcygpLmZvckVhY2goaCA9PiBoLnVwZGF0ZVBhcmVudCgpKSksXG4gICAgICAgICAgZmlsdGVyKCgpID0+ICF0aGlzLm5vZGVNb2RlbC5yZXNpemluZygpKSxcbiAgICAgICAgICB0YXAoKCkgPT4ge1xuICAgICAgICAgICAgY29uc3Qgd2lkdGggPSB0aGlzLmh0bWxXcmFwcGVyUmVmLm5hdGl2ZUVsZW1lbnQuY2xpZW50V2lkdGhcbiAgICAgICAgICAgIGNvbnN0IGhlaWdodCA9IHRoaXMuaHRtbFdyYXBwZXJSZWYubmF0aXZlRWxlbWVudC5jbGllbnRIZWlnaHRcblxuICAgICAgICAgICAgdGhpcy5ub2RlTW9kZWwuc2l6ZS5zZXQoeyB3aWR0aCwgaGVpZ2h0IH0pXG4gICAgICAgICAgfSksXG4gICAgICAgICAgdGFrZVVudGlsRGVzdHJveWVkKClcbiAgICAgICAgKS5zdWJzY3JpYmUoKVxuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLmRyYWdnYWJsZVNlcnZpY2UuZGVzdHJveSh0aGlzLmhvc3RSZWYubmF0aXZlRWxlbWVudClcbiAgfVxuXG4gIHByb3RlY3RlZCBzdGFydENvbm5lY3Rpb24oZXZlbnQ6IEV2ZW50LCBoYW5kbGU6IEhhbmRsZU1vZGVsKSB7XG4gICAgLy8gaWdub3JlIGRyYWcgYnkgc3RvcHBpbmcgcHJvcGFnYXRpb25cbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKVxuXG4gICAgdGhpcy5jb25uZWN0aW9uQ29udHJvbGxlci5zdGFydENvbm5lY3Rpb24oaGFuZGxlKVxuICB9XG5cbiAgcHJvdGVjdGVkIHZhbGlkYXRlQ29ubmVjdGlvbihoYW5kbGU6IEhhbmRsZU1vZGVsKSB7XG4gICAgdGhpcy5jb25uZWN0aW9uQ29udHJvbGxlci52YWxpZGF0ZUNvbm5lY3Rpb24oaGFuZGxlKVxuICB9XG5cbiAgcHJvdGVjdGVkIHJlc2V0VmFsaWRhdGVDb25uZWN0aW9uKHRhcmdldEhhbmRsZTogSGFuZGxlTW9kZWwpIHtcbiAgICB0aGlzLmNvbm5lY3Rpb25Db250cm9sbGVyLnJlc2V0VmFsaWRhdGVDb25uZWN0aW9uKHRhcmdldEhhbmRsZSlcbiAgfVxuXG4gIHByb3RlY3RlZCBlbmRDb25uZWN0aW9uKGhhbmRsZTogSGFuZGxlTW9kZWwpIHtcbiAgICB0aGlzLmNvbm5lY3Rpb25Db250cm9sbGVyLmVuZENvbm5lY3Rpb24oaGFuZGxlKVxuICB9XG5cbiAgcHJvdGVjdGVkIHB1bGxOb2RlKCkge1xuICAgIHRoaXMubm9kZVJlbmRlcmluZ1NlcnZpY2UucHVsbE5vZGUodGhpcy5ub2RlTW9kZWwpXG4gIH1cblxuICBwcm90ZWN0ZWQgc2VsZWN0Tm9kZSgpIHtcbiAgICBpZiAodGhpcy5mbG93U2V0dGluZ3NTZXJ2aWNlLmVudGl0aWVzU2VsZWN0YWJsZSgpKSB7XG4gICAgICB0aGlzLnNlbGVjdGlvblNlcnZpY2Uuc2VsZWN0KHRoaXMubm9kZU1vZGVsKVxuICAgIH1cbiAgfVxufVxuIiwiPCEtLSBEZWZhdWx0IG5vZGUgLS0+XG48c3ZnOmZvcmVpZ25PYmplY3RcbiAgKm5nSWY9XCJub2RlTW9kZWwubm9kZS50eXBlID09PSAnZGVmYXVsdCdcIlxuICBjbGFzcz1cInNlbGVjdGFibGVcIlxuICAjbm9kZUNvbnRlbnRcbiAgW2F0dHIud2lkdGhdPVwibm9kZU1vZGVsLnNpemUoKS53aWR0aFwiXG4gIFthdHRyLmhlaWdodF09XCJub2RlTW9kZWwuc2l6ZSgpLmhlaWdodFwiXG4gIChtb3VzZWRvd24pPVwicHVsbE5vZGUoKTsgc2VsZWN0Tm9kZSgpXCJcbj5cbiAgPGRpdlxuICAgICNodG1sV3JhcHBlclxuICAgIGNsYXNzPVwiZGVmYXVsdC1ub2RlXCJcbiAgICBbY2xhc3MuZGVmYXVsdC1ub2RlX3NlbGVjdGVkXT1cIm5vZGVNb2RlbC5zZWxlY3RlZCgpXCJcbiAgICBbc3R5bGUud2lkdGhdPVwic3R5bGVXaWR0aCgpXCJcbiAgICBbc3R5bGUuaGVpZ2h0XT1cInN0eWxlSGVpZ2h0KClcIlxuICAgIFtzdHlsZS5tYXgtd2lkdGhdPVwic3R5bGVXaWR0aCgpXCJcbiAgICBbc3R5bGUubWF4LWhlaWdodF09XCJzdHlsZUhlaWdodCgpXCJcbiAgPlxuICAgIDxkaXYgW291dGVySFRNTF09XCJub2RlTW9kZWwudGV4dCgpXCI+PC9kaXY+XG5cbiAgICA8aGFuZGxlIHR5cGU9XCJzb3VyY2VcIiBbcG9zaXRpb25dPVwibm9kZU1vZGVsLnNvdXJjZVBvc2l0aW9uKClcIiAvPlxuICAgIDxoYW5kbGUgdHlwZT1cInRhcmdldFwiIFtwb3NpdGlvbl09XCJub2RlTW9kZWwudGFyZ2V0UG9zaXRpb24oKVwiIC8+XG4gIDwvZGl2PlxuPC9zdmc6Zm9yZWlnbk9iamVjdD5cblxuPCEtLSBUZW1wbGF0ZSBub2RlIC0tPlxuPHN2Zzpmb3JlaWduT2JqZWN0XG4gICpuZ0lmPVwibm9kZU1vZGVsLm5vZGUudHlwZSA9PT0gJ2h0bWwtdGVtcGxhdGUnICYmIG5vZGVUZW1wbGF0ZVwiXG4gIGNsYXNzPVwic2VsZWN0YWJsZVwiXG4gIFthdHRyLndpZHRoXT1cIm5vZGVNb2RlbC5zaXplKCkud2lkdGhcIlxuICBbYXR0ci5oZWlnaHRdPVwibm9kZU1vZGVsLnNpemUoKS5oZWlnaHRcIlxuICAobW91c2Vkb3duKT1cInB1bGxOb2RlKClcIlxuPlxuICA8ZGl2XG4gICAgI2h0bWxXcmFwcGVyXG4gICAgY2xhc3M9XCJ3cmFwcGVyXCJcbiAgICBbc3R5bGUud2lkdGhdPVwic3R5bGVXaWR0aCgpXCJcbiAgICBbc3R5bGUuaGVpZ2h0XT1cInN0eWxlSGVpZ2h0KClcIlxuICA+XG4gICAgPG5nLWNvbnRhaW5lclxuICAgICAgW25nVGVtcGxhdGVPdXRsZXRdPVwibm9kZVRlbXBsYXRlXCJcbiAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7ICRpbXBsaWNpdDogeyBub2RlOiBub2RlTW9kZWwubm9kZSwgc2VsZWN0ZWQ6IG5vZGVNb2RlbC5zZWxlY3RlZCB9IH1cIlxuICAgICAgW25nVGVtcGxhdGVPdXRsZXRJbmplY3Rvcl09XCJpbmplY3RvclwiXG4gICAgLz5cbiAgPC9kaXY+XG48L3N2Zzpmb3JlaWduT2JqZWN0PlxuXG48IS0tIENvbXBvbmVudCBub2RlIC0tPlxuPHN2Zzpmb3JlaWduT2JqZWN0XG4gICpuZ0lmPVwibm9kZU1vZGVsLmlzQ29tcG9uZW50VHlwZVwiXG4gIGNsYXNzPVwic2VsZWN0YWJsZVwiXG4gIFthdHRyLndpZHRoXT1cIm5vZGVNb2RlbC5zaXplKCkud2lkdGhcIlxuICBbYXR0ci5oZWlnaHRdPVwibm9kZU1vZGVsLnNpemUoKS5oZWlnaHRcIlxuICAobW91c2Vkb3duKT1cInB1bGxOb2RlKClcIlxuPlxuICA8ZGl2XG4gICAgI2h0bWxXcmFwcGVyXG4gICAgY2xhc3M9XCJ3cmFwcGVyXCJcbiAgICBbc3R5bGUud2lkdGhdPVwic3R5bGVXaWR0aCgpXCJcbiAgICBbc3R5bGUuaGVpZ2h0XT1cInN0eWxlSGVpZ2h0KClcIlxuICA+XG4gICAgPG5nLWNvbnRhaW5lclxuICAgICAgW25nQ29tcG9uZW50T3V0bGV0XT1cIiRhbnkobm9kZU1vZGVsLm5vZGUudHlwZSlcIlxuICAgICAgW25nQ29tcG9uZW50T3V0bGV0SW5wdXRzXT1cIm5vZGVNb2RlbC5jb21wb25lbnRUeXBlSW5wdXRzKClcIlxuICAgICAgW25nQ29tcG9uZW50T3V0bGV0SW5qZWN0b3JdPVwiaW5qZWN0b3JcIlxuICAgIC8+XG4gIDwvZGl2PlxuPC9zdmc6Zm9yZWlnbk9iamVjdD5cblxuPCEtLSBEZWZhdWx0IGdyb3VwIG5vZGUgLS0+XG48c3ZnOnJlY3RcbiAgKm5nSWY9XCJub2RlTW9kZWwubm9kZS50eXBlID09PSAnZGVmYXVsdC1ncm91cCdcIlxuICBbcmVzaXphYmxlXT1cIm5vZGVNb2RlbC5yZXNpemFibGUoKVwiXG4gIFtnYXBdPVwiM1wiXG4gIFtyZXNpemVyQ29sb3JdPVwibm9kZU1vZGVsLmNvbG9yKClcIlxuICBjbGFzcz1cImRlZmF1bHQtZ3JvdXAtbm9kZVwiXG4gIHJ4PVwiNVwiXG4gIHJ5PVwiNVwiXG4gIFtjbGFzcy5kZWZhdWx0LWdyb3VwLW5vZGVfc2VsZWN0ZWRdPVwibm9kZU1vZGVsLnNlbGVjdGVkKClcIlxuICBbYXR0ci53aWR0aF09XCJub2RlTW9kZWwuc2l6ZSgpLndpZHRoXCJcbiAgW2F0dHIuaGVpZ2h0XT1cIm5vZGVNb2RlbC5zaXplKCkuaGVpZ2h0XCJcbiAgW3N0eWxlLnN0cm9rZV09XCJub2RlTW9kZWwuY29sb3IoKVwiXG4gIFtzdHlsZS5maWxsXT1cIm5vZGVNb2RlbC5jb2xvcigpXCJcbiAgKG1vdXNlZG93bik9XCJwdWxsTm9kZSgpOyBzZWxlY3ROb2RlKClcIlxuLz5cblxuPCEtLSBUZW1wbGF0ZSBncm91cCBub2RlICAtLT5cbjxzdmc6Z1xuICAqbmdJZj1cIm5vZGVNb2RlbC5ub2RlLnR5cGUgPT09ICd0ZW1wbGF0ZS1ncm91cCcgJiYgZ3JvdXBOb2RlVGVtcGxhdGVcIlxuICBjbGFzcz1cInNlbGVjdGFibGVcIlxuICAobW91c2Vkb3duKT1cInB1bGxOb2RlKClcIlxuPlxuICA8bmctY29udGFpbmVyXG4gICAgW25nVGVtcGxhdGVPdXRsZXRdPVwiZ3JvdXBOb2RlVGVtcGxhdGVcIlxuICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7ICRpbXBsaWNpdDogeyBub2RlOiBub2RlTW9kZWwubm9kZSwgc2VsZWN0ZWQ6IG5vZGVNb2RlbC5zZWxlY3RlZCwgd2lkdGg6IG5vZGVNb2RlbC53aWR0aCwgaGVpZ2h0OiBub2RlTW9kZWwuaGVpZ2h0IH0gfVwiXG4gICAgW25nVGVtcGxhdGVPdXRsZXRJbmplY3Rvcl09XCJpbmplY3RvclwiXG4gIC8+XG48L3N2ZzpnPlxuXG48IS0tIFJlc2l6ZXIgLS0+XG48bmctY29udGFpbmVyICpuZ0lmPVwibm9kZU1vZGVsLnJlc2l6ZXJUZW1wbGF0ZSgpIGFzIHRlbXBsYXRlXCI+XG4gIDxuZy1jb250YWluZXIgKm5nSWY9XCJub2RlTW9kZWwucmVzaXphYmxlKClcIj5cbiAgICA8bmctdGVtcGxhdGUgW25nVGVtcGxhdGVPdXRsZXRdPVwidGVtcGxhdGVcIiAvPlxuICA8L25nLWNvbnRhaW5lcj5cbjwvbmctY29udGFpbmVyPlxuXG48IS0tIEhhbmRsZXMgLS0+XG48bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBoYW5kbGUgb2Ygbm9kZU1vZGVsLmhhbmRsZXMoKVwiPlxuICA8c3ZnOmNpcmNsZVxuICAgICpuZ0lmPVwiIWhhbmRsZS50ZW1wbGF0ZVwiXG4gICAgY2xhc3M9XCJkZWZhdWx0LWhhbmRsZVwiXG4gICAgW2F0dHIuY3hdPVwiaGFuZGxlLm9mZnNldCgpLnhcIlxuICAgIFthdHRyLmN5XT1cImhhbmRsZS5vZmZzZXQoKS55XCJcbiAgICBbYXR0ci5zdHJva2Utd2lkdGhdPVwiaGFuZGxlLnN0cm9rZVdpZHRoXCJcbiAgICByPVwiNVwiXG4gICAgKHBvaW50ZXJTdGFydCk9XCJzdGFydENvbm5lY3Rpb24oJGV2ZW50LCBoYW5kbGUpXCJcbiAgICAocG9pbnRlckVuZCk9XCJlbmRDb25uZWN0aW9uKGhhbmRsZSlcIlxuICAvPlxuXG4gIDxzdmc6Z1xuICAgICpuZ0lmPVwiaGFuZGxlLnRlbXBsYXRlXCJcbiAgICBbaGFuZGxlU2l6ZUNvbnRyb2xsZXJdPVwiaGFuZGxlXCJcbiAgICAocG9pbnRlclN0YXJ0KT1cInN0YXJ0Q29ubmVjdGlvbigkZXZlbnQsIGhhbmRsZSlcIlxuICAgIChwb2ludGVyRW5kKT1cImVuZENvbm5lY3Rpb24oaGFuZGxlKVwiXG4gID5cbiAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiaGFuZGxlLnRlbXBsYXRlOyBjb250ZXh0OiBoYW5kbGUudGVtcGxhdGVDb250ZXh0XCIgLz5cbiAgPC9zdmc6Zz5cblxuICA8c3ZnOmNpcmNsZVxuICAgICpuZ0lmPVwic2hvd01hZ25ldCgpXCJcbiAgICBjbGFzcz1cIm1hZ25ldFwiXG4gICAgW2F0dHIucl09XCJub2RlTW9kZWwubWFnbmV0UmFkaXVzXCJcbiAgICBbYXR0ci5jeF09XCJoYW5kbGUub2Zmc2V0KCkueFwiXG4gICAgW2F0dHIuY3ldPVwiaGFuZGxlLm9mZnNldCgpLnlcIlxuICAgIChwb2ludGVyRW5kKT1cImVuZENvbm5lY3Rpb24oaGFuZGxlKTsgcmVzZXRWYWxpZGF0ZUNvbm5lY3Rpb24oaGFuZGxlKVwiXG4gICAgKHBvaW50ZXJPdmVyKT1cInZhbGlkYXRlQ29ubmVjdGlvbihoYW5kbGUpXCJcbiAgICAocG9pbnRlck91dCk9XCJyZXNldFZhbGlkYXRlQ29ubmVjdGlvbihoYW5kbGUpXCJcbiAgLz5cbjwvbmctY29udGFpbmVyPlxuIl19
120
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm9kZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtdmZsb3ctbGliL3NyYy9saWIvdmZsb3cvY29tcG9uZW50cy9ub2RlL25vZGUuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXZmbG93LWxpYi9zcmMvbGliL3ZmbG93L2NvbXBvbmVudHMvbm9kZS9ub2RlLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQWlCLHVCQUF1QixFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQWtDLFNBQVMsRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM1TCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUVwRSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUN2RSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFFOUQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ2xELE9BQU8sRUFBRSxNQUFNLEVBQVMsR0FBRyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3JFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBZ0IsTUFBTSxxREFBcUQsQ0FBQztBQUNyRyxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSx1Q0FBdUMsQ0FBQztBQUM3RSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQUMzRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUNwRSxPQUFPLEVBQUUsNkJBQTZCLEVBQUUsTUFBTSxrREFBa0QsQ0FBQztB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S0FBSztnQkFJQyxjQUFjO3NCQURwQixTQUFTO3VCQUFDLGFBQWE7Z0JBSWpCLGNBQWM7c0JBRHBCLFNBQVM7dUJBQUMsYUFBYTtnQkFZakIsUUFBUSxNQTZCUixlQUFlIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQWZ0ZXJWaWV3SW5pdCwgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENvbXBvbmVudCwgRWxlbWVudFJlZiwgSW5qZWN0b3IsIElucHV0LCBOZ1pvbmUsIE9uRGVzdHJveSwgT25Jbml0LCBUZW1wbGF0ZVJlZiwgVmlld0NoaWxkLCBjb21wdXRlZCwgZWZmZWN0LCBpbmplY3QgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IERyYWdnYWJsZVNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9kcmFnZ2FibGUuc2VydmljZSc7XG5pbXBvcnQgeyBOb2RlTW9kZWwgfSBmcm9tICcuLi8uLi9tb2RlbHMvbm9kZS5tb2RlbCc7XG5pbXBvcnQgeyBGbG93U3RhdHVzU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2Zsb3ctc3RhdHVzLnNlcnZpY2UnO1xuaW1wb3J0IHsgSGFuZGxlU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2hhbmRsZS5zZXJ2aWNlJztcbmltcG9ydCB7IEhhbmRsZU1vZGVsIH0gZnJvbSAnLi4vLi4vbW9kZWxzL2hhbmRsZS5tb2RlbCc7XG5pbXBvcnQgeyByZXNpemFibGUgfSBmcm9tICcuLi8uLi91dGlscy9yZXNpemFibGUnO1xuaW1wb3J0IHsgZmlsdGVyLCBmaXJzdCwgbWFwLCBzdGFydFdpdGgsIHN3aXRjaE1hcCwgdGFwIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBJbmplY3Rpb25Db250ZXh0LCBXaXRoSW5qZWN0b3IgfSBmcm9tICcuLi8uLi9kZWNvcmF0b3JzL3J1bi1pbi1pbmplY3Rpb24tY29udGV4dC5kZWNvcmF0b3InO1xuaW1wb3J0IHsgTm9kZVJlbmRlcmluZ1NlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9ub2RlLXJlbmRlcmluZy5zZXJ2aWNlJztcbmltcG9ydCB7IEZsb3dTZXR0aW5nc1NlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9mbG93LXNldHRpbmdzLnNlcnZpY2UnO1xuaW1wb3J0IHsgU2VsZWN0aW9uU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL3NlbGVjdGlvbi5zZXJ2aWNlJztcbmltcG9ydCB7IENvbm5lY3Rpb25Db250cm9sbGVyRGlyZWN0aXZlIH0gZnJvbSAnLi4vLi4vZGlyZWN0aXZlcy9jb25uZWN0aW9uLWNvbnRyb2xsZXIuZGlyZWN0aXZlJztcbmltcG9ydCB7IHRha2VVbnRpbERlc3Ryb3llZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUvcnhqcy1pbnRlcm9wJztcbmltcG9ydCB7IE5vZGVBY2Nlc3NvclNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9ub2RlLWFjY2Vzc29yLnNlcnZpY2UnO1xuXG5leHBvcnQgdHlwZSBIYW5kbGVTdGF0ZSA9ICd2YWxpZCcgfCAnaW52YWxpZCcgfCAnaWRsZSdcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnZ1tub2RlXScsXG4gIHRlbXBsYXRlVXJsOiAnLi9ub2RlLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vbm9kZS5jb21wb25lbnQuc2NzcyddLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgcHJvdmlkZXJzOiBbSGFuZGxlU2VydmljZSwgTm9kZUFjY2Vzc29yU2VydmljZV1cbn0pXG5leHBvcnQgY2xhc3MgTm9kZUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgQWZ0ZXJWaWV3SW5pdCwgT25EZXN0cm95LCBXaXRoSW5qZWN0b3Ige1xuICBwdWJsaWMgaW5qZWN0b3IgPSBpbmplY3QoSW5qZWN0b3IpXG4gIHByaXZhdGUgaGFuZGxlU2VydmljZSA9IGluamVjdChIYW5kbGVTZXJ2aWNlKVxuICBwcml2YXRlIGRyYWdnYWJsZVNlcnZpY2UgPSBpbmplY3QoRHJhZ2dhYmxlU2VydmljZSlcbiAgcHJpdmF0ZSBmbG93U3RhdHVzU2VydmljZSA9IGluamVjdChGbG93U3RhdHVzU2VydmljZSlcbiAgcHJpdmF0ZSBub2RlUmVuZGVyaW5nU2VydmljZSA9IGluamVjdChOb2RlUmVuZGVyaW5nU2VydmljZSlcbiAgcHJpdmF0ZSBmbG93U2V0dGluZ3NTZXJ2aWNlID0gaW5qZWN0KEZsb3dTZXR0aW5nc1NlcnZpY2UpXG4gIHByaXZhdGUgc2VsZWN0aW9uU2VydmljZSA9IGluamVjdChTZWxlY3Rpb25TZXJ2aWNlKVxuICBwcml2YXRlIGhvc3RSZWYgPSBpbmplY3Q8RWxlbWVudFJlZjxTVkdFbGVtZW50Pj4oRWxlbWVudFJlZilcbiAgcHJpdmF0ZSBjb25uZWN0aW9uQ29udHJvbGxlciA9IGluamVjdChDb25uZWN0aW9uQ29udHJvbGxlckRpcmVjdGl2ZSlcbiAgcHJpdmF0ZSBub2RlQWNjZXNzb3IgPSBpbmplY3QoTm9kZUFjY2Vzc29yU2VydmljZSk7XG4gIHByaXZhdGUgem9uZSA9IGluamVjdChOZ1pvbmUpXG5cbiAgQElucHV0KClcbiAgcHVibGljIG5vZGVNb2RlbCE6IE5vZGVNb2RlbFxuXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBub2RlVGVtcGxhdGU/OiBUZW1wbGF0ZVJlZjxhbnk+XG5cbiAgQElucHV0KClcbiAgcHVibGljIGdyb3VwTm9kZVRlbXBsYXRlPzogVGVtcGxhdGVSZWY8YW55PlxuXG4gIEBWaWV3Q2hpbGQoJ25vZGVDb250ZW50JylcbiAgcHVibGljIG5vZGVDb250ZW50UmVmITogRWxlbWVudFJlZjxTVkdHcmFwaGljc0VsZW1lbnQ+XG5cbiAgQFZpZXdDaGlsZCgnaHRtbFdyYXBwZXInKVxuICBwdWJsaWMgaHRtbFdyYXBwZXJSZWYhOiBFbGVtZW50UmVmPEhUTUxEaXZFbGVtZW50PlxuXG4gIHByb3RlY3RlZCBzaG93TWFnbmV0ID0gY29tcHV0ZWQoKCkgPT5cbiAgICB0aGlzLmZsb3dTdGF0dXNTZXJ2aWNlLnN0YXR1cygpLnN0YXRlID09PSAnY29ubmVjdGlvbi1zdGFydCcgfHxcbiAgICB0aGlzLmZsb3dTdGF0dXNTZXJ2aWNlLnN0YXR1cygpLnN0YXRlID09PSAnY29ubmVjdGlvbi12YWxpZGF0aW9uJ1xuICApXG5cbiAgcHJvdGVjdGVkIHN0eWxlV2lkdGggPSBjb21wdXRlZCgoKSA9PiBgJHt0aGlzLm5vZGVNb2RlbC5zaXplKCkud2lkdGh9cHhgKVxuICBwcm90ZWN0ZWQgc3R5bGVIZWlnaHQgPSBjb21wdXRlZCgoKSA9PiBgJHt0aGlzLm5vZGVNb2RlbC5zaXplKCkuaGVpZ2h0fXB4YClcblxuICBASW5qZWN0aW9uQ29udGV4dFxuICBwdWJsaWMgbmdPbkluaXQoKSB7XG4gICAgdGhpcy5ub2RlQWNjZXNzb3IubW9kZWwuc2V0KHRoaXMubm9kZU1vZGVsKTtcblxuICAgIHRoaXMuaGFuZGxlU2VydmljZS5ub2RlLnNldCh0aGlzLm5vZGVNb2RlbCk7XG5cbiAgICBlZmZlY3QoKCkgPT4ge1xuICAgICAgaWYgKHRoaXMubm9kZU1vZGVsLmRyYWdnYWJsZSgpKSB7XG4gICAgICAgIHRoaXMuZHJhZ2dhYmxlU2VydmljZS5lbmFibGUodGhpcy5ob3N0UmVmLm5hdGl2ZUVsZW1lbnQsIHRoaXMubm9kZU1vZGVsKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5kcmFnZ2FibGVTZXJ2aWNlLmRpc2FibGUodGhpcy5ob3N0UmVmLm5hdGl2ZUVsZW1lbnQpXG4gICAgICB9XG4gICAgfSlcblxuICAgIHRoaXMubm9kZU1vZGVsLmhhbmRsZXMkXG4gICAgICAucGlwZShcbiAgICAgICAgc3dpdGNoTWFwKChoYW5kbGVzKSA9PlxuICAgICAgICAgIHJlc2l6YWJsZShoYW5kbGVzLm1hcChoID0+IGgucGFyZW50UmVmZXJlbmNlISksIHRoaXMuem9uZSlcbiAgICAgICAgICAgIC5waXBlKG1hcCgoKSA9PiBoYW5kbGVzKSlcbiAgICAgICAgKSxcbiAgICAgICAgdGFwKChoYW5kbGVzKSA9PiB7XG4gICAgICAgICAgLy8gVE9ETyAocGVyZm9ybWFuY2UpIGluc3BlY3QgaG93IHRvIGF2b2lkIGNhbGxzIG9mIHRoaXMgd2hlbiBmbG93IGluaXRpYWxseSByZW5kZXJlZFxuICAgICAgICAgIGhhbmRsZXMuZm9yRWFjaChoID0+IGgudXBkYXRlUGFyZW50KCkpXG4gICAgICAgIH0pLFxuICAgICAgICB0YWtlVW50aWxEZXN0cm95ZWQoKVxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgpXG4gIH1cblxuICBASW5qZWN0aW9uQ29udGV4dFxuICBwdWJsaWMgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuICAgIHRoaXMubm9kZU1vZGVsLmxpbmtEZWZhdWx0Tm9kZVNpemVXaXRoTW9kZWxTaXplKClcblxuICAgIGlmICh0aGlzLm5vZGVNb2RlbC5ub2RlLnR5cGUgPT09ICdodG1sLXRlbXBsYXRlJyB8fCB0aGlzLm5vZGVNb2RlbC5pc0NvbXBvbmVudFR5cGUpIHtcbiAgICAgIHJlc2l6YWJsZShbdGhpcy5odG1sV3JhcHBlclJlZi5uYXRpdmVFbGVtZW50XSwgdGhpcy56b25lKVxuICAgICAgICAucGlwZShcbiAgICAgICAgICBzdGFydFdpdGgobnVsbCksXG4gICAgICAgICAgdGFwKCgpID0+IHRoaXMubm9kZU1vZGVsLmhhbmRsZXMoKS5mb3JFYWNoKGggPT4gaC51cGRhdGVQYXJlbnQoKSkpLFxuICAgICAgICAgIGZpbHRlcigoKSA9PiAhdGhpcy5ub2RlTW9kZWwucmVzaXppbmcoKSksXG4gICAgICAgICAgdGFwKCgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHdpZHRoID0gdGhpcy5odG1sV3JhcHBlclJlZi5uYXRpdmVFbGVtZW50LmNsaWVudFdpZHRoXG4gICAgICAgICAgICBjb25zdCBoZWlnaHQgPSB0aGlzLmh0bWxXcmFwcGVyUmVmLm5hdGl2ZUVsZW1lbnQuY2xpZW50SGVpZ2h0XG5cbiAgICAgICAgICAgIHRoaXMubm9kZU1vZGVsLnNpemUuc2V0KHsgd2lkdGgsIGhlaWdodCB9KVxuICAgICAgICAgIH0pLFxuICAgICAgICAgIHRha2VVbnRpbERlc3Ryb3llZCgpXG4gICAgICAgICkuc3Vic2NyaWJlKClcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5kcmFnZ2FibGVTZXJ2aWNlLmRlc3Ryb3kodGhpcy5ob3N0UmVmLm5hdGl2ZUVsZW1lbnQpXG4gIH1cblxuICBwcm90ZWN0ZWQgc3RhcnRDb25uZWN0aW9uKGV2ZW50OiBFdmVudCwgaGFuZGxlOiBIYW5kbGVNb2RlbCkge1xuICAgIC8vIGlnbm9yZSBkcmFnIGJ5IHN0b3BwaW5nIHByb3BhZ2F0aW9uXG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcblxuICAgIHRoaXMuY29ubmVjdGlvbkNvbnRyb2xsZXIuc3RhcnRDb25uZWN0aW9uKGhhbmRsZSlcbiAgfVxuXG4gIHByb3RlY3RlZCB2YWxpZGF0ZUNvbm5lY3Rpb24oaGFuZGxlOiBIYW5kbGVNb2RlbCkge1xuICAgIHRoaXMuY29ubmVjdGlvbkNvbnRyb2xsZXIudmFsaWRhdGVDb25uZWN0aW9uKGhhbmRsZSlcbiAgfVxuXG4gIHByb3RlY3RlZCByZXNldFZhbGlkYXRlQ29ubmVjdGlvbih0YXJnZXRIYW5kbGU6IEhhbmRsZU1vZGVsKSB7XG4gICAgdGhpcy5jb25uZWN0aW9uQ29udHJvbGxlci5yZXNldFZhbGlkYXRlQ29ubmVjdGlvbih0YXJnZXRIYW5kbGUpXG4gIH1cblxuICBwcm90ZWN0ZWQgZW5kQ29ubmVjdGlvbihoYW5kbGU6IEhhbmRsZU1vZGVsKSB7XG4gICAgdGhpcy5jb25uZWN0aW9uQ29udHJvbGxlci5lbmRDb25uZWN0aW9uKGhhbmRsZSlcbiAgfVxuXG4gIHByb3RlY3RlZCBwdWxsTm9kZSgpIHtcbiAgICB0aGlzLm5vZGVSZW5kZXJpbmdTZXJ2aWNlLnB1bGxOb2RlKHRoaXMubm9kZU1vZGVsKVxuICB9XG5cbiAgcHJvdGVjdGVkIHNlbGVjdE5vZGUoKSB7XG4gICAgaWYgKHRoaXMuZmxvd1NldHRpbmdzU2VydmljZS5lbnRpdGllc1NlbGVjdGFibGUoKSkge1xuICAgICAgdGhpcy5zZWxlY3Rpb25TZXJ2aWNlLnNlbGVjdCh0aGlzLm5vZGVNb2RlbClcbiAgICB9XG4gIH1cbn1cbiIsIjwhLS0gRGVmYXVsdCBub2RlIC0tPlxuPHN2Zzpmb3JlaWduT2JqZWN0XG4gICpuZ0lmPVwibm9kZU1vZGVsLm5vZGUudHlwZSA9PT0gJ2RlZmF1bHQnXCJcbiAgY2xhc3M9XCJzZWxlY3RhYmxlXCJcbiAgI25vZGVDb250ZW50XG4gIFthdHRyLndpZHRoXT1cIm5vZGVNb2RlbC5zaXplKCkud2lkdGhcIlxuICBbYXR0ci5oZWlnaHRdPVwibm9kZU1vZGVsLnNpemUoKS5oZWlnaHRcIlxuICAocG9pbnRlclN0YXJ0KT1cInB1bGxOb2RlKCk7IHNlbGVjdE5vZGUoKVwiXG4+XG4gIDxkZWZhdWx0LW5vZGVcbiAgICAjaHRtbFdyYXBwZXJcbiAgICBbc2VsZWN0ZWRdPVwibm9kZU1vZGVsLnNlbGVjdGVkKClcIlxuICAgIFtzdHlsZS53aWR0aF09XCJzdHlsZVdpZHRoKClcIlxuICAgIFtzdHlsZS5oZWlnaHRdPVwic3R5bGVIZWlnaHQoKVwiXG4gICAgW3N0eWxlLm1heC13aWR0aF09XCJzdHlsZVdpZHRoKClcIlxuICAgIFtzdHlsZS5tYXgtaGVpZ2h0XT1cInN0eWxlSGVpZ2h0KClcIlxuICA+XG4gICAgPGRpdiBbb3V0ZXJIVE1MXT1cIm5vZGVNb2RlbC50ZXh0KClcIj48L2Rpdj5cblxuICAgIDxoYW5kbGUgdHlwZT1cInNvdXJjZVwiIFtwb3NpdGlvbl09XCJub2RlTW9kZWwuc291cmNlUG9zaXRpb24oKVwiIC8+XG4gICAgPGhhbmRsZSB0eXBlPVwidGFyZ2V0XCIgW3Bvc2l0aW9uXT1cIm5vZGVNb2RlbC50YXJnZXRQb3NpdGlvbigpXCIgLz5cbiAgPC9kZWZhdWx0LW5vZGU+XG48L3N2Zzpmb3JlaWduT2JqZWN0PlxuXG48IS0tIFRlbXBsYXRlIG5vZGUgLS0+XG48c3ZnOmZvcmVpZ25PYmplY3RcbiAgKm5nSWY9XCJub2RlTW9kZWwubm9kZS50eXBlID09PSAnaHRtbC10ZW1wbGF0ZScgJiYgbm9kZVRlbXBsYXRlXCJcbiAgY2xhc3M9XCJzZWxlY3RhYmxlXCJcbiAgW2F0dHIud2lkdGhdPVwibm9kZU1vZGVsLnNpemUoKS53aWR0aFwiXG4gIFthdHRyLmhlaWdodF09XCJub2RlTW9kZWwuc2l6ZSgpLmhlaWdodFwiXG4gIChwb2ludGVyU3RhcnQpPVwicHVsbE5vZGUoKVwiXG4+XG4gIDxkaXZcbiAgICAjaHRtbFdyYXBwZXJcbiAgICBjbGFzcz1cIndyYXBwZXJcIlxuICAgIFtzdHlsZS53aWR0aF09XCJzdHlsZVdpZHRoKClcIlxuICAgIFtzdHlsZS5oZWlnaHRdPVwic3R5bGVIZWlnaHQoKVwiXG4gID5cbiAgICA8bmctY29udGFpbmVyXG4gICAgICBbbmdUZW1wbGF0ZU91dGxldF09XCJub2RlVGVtcGxhdGVcIlxuICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInsgJGltcGxpY2l0OiB7IG5vZGU6IG5vZGVNb2RlbC5ub2RlLCBzZWxlY3RlZDogbm9kZU1vZGVsLnNlbGVjdGVkIH0gfVwiXG4gICAgICBbbmdUZW1wbGF0ZU91dGxldEluamVjdG9yXT1cImluamVjdG9yXCJcbiAgICAvPlxuICA8L2Rpdj5cbjwvc3ZnOmZvcmVpZ25PYmplY3Q+XG5cbjwhLS0gQ29tcG9uZW50IG5vZGUgLS0+XG48c3ZnOmZvcmVpZ25PYmplY3RcbiAgKm5nSWY9XCJub2RlTW9kZWwuaXNDb21wb25lbnRUeXBlXCJcbiAgY2xhc3M9XCJzZWxlY3RhYmxlXCJcbiAgW2F0dHIud2lkdGhdPVwibm9kZU1vZGVsLnNpemUoKS53aWR0aFwiXG4gIFthdHRyLmhlaWdodF09XCJub2RlTW9kZWwuc2l6ZSgpLmhlaWdodFwiXG4gIChwb2ludGVyU3RhcnQpPVwicHVsbE5vZGUoKVwiXG4+XG4gIDxkaXZcbiAgICAjaHRtbFdyYXBwZXJcbiAgICBjbGFzcz1cIndyYXBwZXJcIlxuICAgIFtzdHlsZS53aWR0aF09XCJzdHlsZVdpZHRoKClcIlxuICAgIFtzdHlsZS5oZWlnaHRdPVwic3R5bGVIZWlnaHQoKVwiXG4gID5cbiAgICA8bmctY29udGFpbmVyXG4gICAgICBbbmdDb21wb25lbnRPdXRsZXRdPVwiJGFueShub2RlTW9kZWwubm9kZS50eXBlKVwiXG4gICAgICBbbmdDb21wb25lbnRPdXRsZXRJbnB1dHNdPVwibm9kZU1vZGVsLmNvbXBvbmVudFR5cGVJbnB1dHMoKVwiXG4gICAgICBbbmdDb21wb25lbnRPdXRsZXRJbmplY3Rvcl09XCJpbmplY3RvclwiXG4gICAgLz5cbiAgPC9kaXY+XG48L3N2Zzpmb3JlaWduT2JqZWN0PlxuXG48IS0tIERlZmF1bHQgZ3JvdXAgbm9kZSAtLT5cbjxzdmc6cmVjdFxuICAqbmdJZj1cIm5vZGVNb2RlbC5ub2RlLnR5cGUgPT09ICdkZWZhdWx0LWdyb3VwJ1wiXG4gIFtyZXNpemFibGVdPVwibm9kZU1vZGVsLnJlc2l6YWJsZSgpXCJcbiAgW2dhcF09XCIzXCJcbiAgW3Jlc2l6ZXJDb2xvcl09XCJub2RlTW9kZWwuY29sb3IoKVwiXG4gIGNsYXNzPVwiZGVmYXVsdC1ncm91cC1ub2RlXCJcbiAgcng9XCI1XCJcbiAgcnk9XCI1XCJcbiAgW2NsYXNzLmRlZmF1bHQtZ3JvdXAtbm9kZV9zZWxlY3RlZF09XCJub2RlTW9kZWwuc2VsZWN0ZWQoKVwiXG4gIFthdHRyLndpZHRoXT1cIm5vZGVNb2RlbC5zaXplKCkud2lkdGhcIlxuICBbYXR0ci5oZWlnaHRdPVwibm9kZU1vZGVsLnNpemUoKS5oZWlnaHRcIlxuICBbc3R5bGUuc3Ryb2tlXT1cIm5vZGVNb2RlbC5jb2xvcigpXCJcbiAgW3N0eWxlLmZpbGxdPVwibm9kZU1vZGVsLmNvbG9yKClcIlxuICAocG9pbnRlclN0YXJ0KT1cInB1bGxOb2RlKCk7IHNlbGVjdE5vZGUoKVwiXG4vPlxuXG48IS0tIFRlbXBsYXRlIGdyb3VwIG5vZGUgIC0tPlxuPHN2ZzpnXG4gICpuZ0lmPVwibm9kZU1vZGVsLm5vZGUudHlwZSA9PT0gJ3RlbXBsYXRlLWdyb3VwJyAmJiBncm91cE5vZGVUZW1wbGF0ZVwiXG4gIGNsYXNzPVwic2VsZWN0YWJsZVwiXG4gIChwb2ludGVyU3RhcnQpPVwicHVsbE5vZGUoKVwiXG4+XG4gIDxuZy1jb250YWluZXJcbiAgICBbbmdUZW1wbGF0ZU91dGxldF09XCJncm91cE5vZGVUZW1wbGF0ZVwiXG4gICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInsgJGltcGxpY2l0OiB7IG5vZGU6IG5vZGVNb2RlbC5ub2RlLCBzZWxlY3RlZDogbm9kZU1vZGVsLnNlbGVjdGVkLCB3aWR0aDogbm9kZU1vZGVsLndpZHRoLCBoZWlnaHQ6IG5vZGVNb2RlbC5oZWlnaHQgfSB9XCJcbiAgICBbbmdUZW1wbGF0ZU91dGxldEluamVjdG9yXT1cImluamVjdG9yXCJcbiAgLz5cbjwvc3ZnOmc+XG5cbjwhLS0gUmVzaXplciAtLT5cbjxuZy1jb250YWluZXIgKm5nSWY9XCJub2RlTW9kZWwucmVzaXplclRlbXBsYXRlKCkgYXMgdGVtcGxhdGVcIj5cbiAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIm5vZGVNb2RlbC5yZXNpemFibGUoKVwiPlxuICAgIDxuZy10ZW1wbGF0ZSBbbmdUZW1wbGF0ZU91dGxldF09XCJ0ZW1wbGF0ZVwiIC8+XG4gIDwvbmctY29udGFpbmVyPlxuPC9uZy1jb250YWluZXI+XG5cbjwhLS0gSGFuZGxlcyAtLT5cbjxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGhhbmRsZSBvZiBub2RlTW9kZWwuaGFuZGxlcygpXCI+XG4gIDxzdmc6Y2lyY2xlXG4gICAgKm5nSWY9XCIhaGFuZGxlLnRlbXBsYXRlXCJcbiAgICBjbGFzcz1cImRlZmF1bHQtaGFuZGxlXCJcbiAgICBbYXR0ci5jeF09XCJoYW5kbGUub2Zmc2V0KCkueFwiXG4gICAgW2F0dHIuY3ldPVwiaGFuZGxlLm9mZnNldCgpLnlcIlxuICAgIFthdHRyLnN0cm9rZS13aWR0aF09XCJoYW5kbGUuc3Ryb2tlV2lkdGhcIlxuICAgIHI9XCI1XCJcbiAgICAocG9pbnRlclN0YXJ0KT1cInN0YXJ0Q29ubmVjdGlvbigkZXZlbnQsIGhhbmRsZSlcIlxuICAgIChwb2ludGVyRW5kKT1cImVuZENvbm5lY3Rpb24oaGFuZGxlKVwiXG4gIC8+XG5cbiAgPHN2ZzpnXG4gICAgKm5nSWY9XCJoYW5kbGUudGVtcGxhdGVcIlxuICAgIFtoYW5kbGVTaXplQ29udHJvbGxlcl09XCJoYW5kbGVcIlxuICAgIChwb2ludGVyU3RhcnQpPVwic3RhcnRDb25uZWN0aW9uKCRldmVudCwgaGFuZGxlKVwiXG4gICAgKHBvaW50ZXJFbmQpPVwiZW5kQ29ubmVjdGlvbihoYW5kbGUpXCJcbiAgPlxuICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJoYW5kbGUudGVtcGxhdGU7IGNvbnRleHQ6IGhhbmRsZS50ZW1wbGF0ZUNvbnRleHRcIiAvPlxuICA8L3N2ZzpnPlxuXG4gIDxzdmc6Y2lyY2xlXG4gICAgKm5nSWY9XCJzaG93TWFnbmV0KClcIlxuICAgIGNsYXNzPVwibWFnbmV0XCJcbiAgICBbYXR0ci5yXT1cIm5vZGVNb2RlbC5tYWduZXRSYWRpdXNcIlxuICAgIFthdHRyLmN4XT1cImhhbmRsZS5vZmZzZXQoKS54XCJcbiAgICBbYXR0ci5jeV09XCJoYW5kbGUub2Zmc2V0KCkueVwiXG4gICAgKHBvaW50ZXJFbmQpPVwiZW5kQ29ubmVjdGlvbihoYW5kbGUpOyByZXNldFZhbGlkYXRlQ29ubmVjdGlvbihoYW5kbGUpXCJcbiAgICAocG9pbnRlck92ZXIpPVwidmFsaWRhdGVDb25uZWN0aW9uKGhhbmRsZSlcIlxuICAgIChwb2ludGVyT3V0KT1cInJlc2V0VmFsaWRhdGVDb25uZWN0aW9uKGhhbmRsZSlcIlxuICAvPlxuPC9uZy1jb250YWluZXI+XG4iXX0=
@@ -19,6 +19,8 @@ import { SelectionService } from '../../services/selection.service';
19
19
  import { FlowSettingsService } from '../../services/flow-settings.service';
20
20
  import { ComponentEventBusService } from '../../services/component-event-bus.service';
21
21
  import { SpacePointContextDirective } from '../../directives/space-point-context.directive';
22
+ import { KeyboardService } from '../../services/keyboard.service';
23
+ import { transformBackground } from '../../utils/transform-background';
22
24
  import * as i0 from "@angular/core";
23
25
  import * as i1 from "../../directives/connection-controller.directive";
24
26
  import * as i2 from "../../directives/changes-controller.directive";
@@ -82,11 +84,8 @@ export class VflowComponent {
82
84
  this.nodeRenderingService = inject(NodeRenderingService);
83
85
  this.flowSettingsService = inject(FlowSettingsService);
84
86
  this.componentEventBusService = inject(ComponentEventBusService);
87
+ this.keyboardService = inject(KeyboardService);
85
88
  this.injector = inject(Injector);
86
- /**
87
- * Background for flow
88
- */
89
- this.background = '#fff';
90
89
  this.optimization = {
91
90
  computeLayersOnInit: true
92
91
  };
@@ -131,6 +130,7 @@ export class VflowComponent {
131
130
  this.edgesChange$ = this.edgesChangeService.changes$;
132
131
  // #endregion
133
132
  this.markers = this.flowEntitiesService.markers;
133
+ this.minimap = this.flowEntitiesService.minimap;
134
134
  }
135
135
  // #endregion
136
136
  // #region SETTINGS
@@ -167,12 +167,21 @@ export class VflowComponent {
167
167
  set handlePositions(handlePositions) {
168
168
  this.flowSettingsService.handlePositions.set(handlePositions);
169
169
  }
170
+ /**
171
+ * Background for flow
172
+ */
173
+ set background(value) {
174
+ this.flowSettingsService.background.set(transformBackground(value));
175
+ }
170
176
  /**
171
177
  * Global rule if you can or can't select entities
172
178
  */
173
179
  set entitiesSelectable(value) {
174
180
  this.flowSettingsService.entitiesSelectable.set(value);
175
181
  }
182
+ set keyboardShortcuts(value) {
183
+ this.keyboardService.setShortcuts(value);
184
+ }
176
185
  /**
177
186
  * Settings for connection (it renders when user tries to create edge between nodes)
178
187
  *
@@ -271,7 +280,7 @@ export class VflowComponent {
271
280
  }
272
281
  }
273
282
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: VflowComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
274
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "16.1.0", version: "16.2.12", type: VflowComponent, selector: "vflow", inputs: { view: "view", minZoom: "minZoom", maxZoom: "maxZoom", handlePositions: "handlePositions", background: "background", optimization: "optimization", entitiesSelectable: "entitiesSelectable", connection: ["connection", "connection", (settings) => new ConnectionModel(settings)], nodes: "nodes", edges: "edges" }, outputs: { onComponentNodeEvent: "onComponentNodeEvent" }, providers: [
283
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "16.1.0", version: "16.2.12", type: VflowComponent, selector: "vflow", inputs: { view: "view", minZoom: "minZoom", maxZoom: "maxZoom", handlePositions: "handlePositions", background: "background", optimization: "optimization", entitiesSelectable: "entitiesSelectable", keyboardShortcuts: "keyboardShortcuts", connection: ["connection", "connection", (settings) => new ConnectionModel(settings)], nodes: "nodes", edges: "edges" }, outputs: { onComponentNodeEvent: "onComponentNodeEvent" }, providers: [
275
284
  DraggableService,
276
285
  ViewportService,
277
286
  FlowStatusService,
@@ -281,8 +290,9 @@ export class VflowComponent {
281
290
  NodeRenderingService,
282
291
  SelectionService,
283
292
  FlowSettingsService,
284
- ComponentEventBusService
285
- ], queries: [{ propertyName: "nodeTemplateDirective", first: true, predicate: NodeHtmlTemplateDirective, descendants: true }, { propertyName: "groupNodeTemplateDirective", first: true, predicate: GroupNodeTemplateDirective, descendants: true }, { propertyName: "edgeTemplateDirective", first: true, predicate: EdgeTemplateDirective, descendants: true }, { propertyName: "edgeLabelHtmlDirective", first: true, predicate: EdgeLabelHtmlTemplateDirective, descendants: true }, { propertyName: "connectionTemplateDirective", first: true, predicate: ConnectionTemplateDirective, descendants: true }], viewQueries: [{ propertyName: "mapContext", first: true, predicate: MapContextDirective, descendants: true }, { propertyName: "spacePointContext", first: true, predicate: SpacePointContextDirective, descendants: true }], hostDirectives: [{ directive: i1.ConnectionControllerDirective, outputs: ["onConnect", "onConnect"] }, { directive: i2.ChangesControllerDirective, outputs: ["onNodesChange", "onNodesChange", "onNodesChange.position", "onNodesChange.position", "onNodesChange.position.single", "onNodesChange.position.single", "onNodesChange.position.many", "onNodesChange.position.many", "onNodesChange.size", "onNodesChange.size", "onNodesChange.size.single", "onNodesChange.size.single", "onNodesChange.size.many", "onNodesChange.size.many", "onNodesChange.add", "onNodesChange.add", "onNodesChange.add.single", "onNodesChange.add.single", "onNodesChange.add.many", "onNodesChange.add.many", "onNodesChange.remove", "onNodesChange.remove", "onNodesChange.remove.single", "onNodesChange.remove.single", "onNodesChange.remove.many", "onNodesChange.remove.many", "onNodesChange.select", "onNodesChange.select", "onNodesChange.select.single", "onNodesChange.select.single", "onNodesChange.select.many", "onNodesChange.select.many", "onEdgesChange", "onEdgesChange", "onEdgesChange.detached", "onEdgesChange.detached", "onEdgesChange.detached.single", "onEdgesChange.detached.single", "onEdgesChange.detached.many", "onEdgesChange.detached.many", "onEdgesChange.add", "onEdgesChange.add", "onEdgesChange.add.single", "onEdgesChange.add.single", "onEdgesChange.add.many", "onEdgesChange.add.many", "onEdgesChange.remove", "onEdgesChange.remove", "onEdgesChange.remove.single", "onEdgesChange.remove.single", "onEdgesChange.remove.many", "onEdgesChange.remove.many", "onEdgesChange.select", "onEdgesChange.select", "onEdgesChange.select.single", "onEdgesChange.select.single", "onEdgesChange.select.many", "onEdgesChange.select.many"] }], ngImport: i0, template: "<svg:svg\n rootSvgRef\n rootSvgContext\n rootPointer\n flowSizeController\n class=\"root-svg\"\n #flow\n>\n <defs [markers]=\"markers()\" flowDefs />\n\n <g [background]=\"background\"/>\n\n <svg:g\n mapContext\n spacePointContext\n >\n <!-- Connection -->\n <svg:g\n connection\n [model]=\"connection\"\n [template]=\"connectionTemplateDirective?.templateRef\"\n />\n\n <!-- Edges -->\n <svg:g\n *ngFor=\"let model of edgeModels(); trackBy: trackEdges\"\n edge\n [model]=\"model\"\n [edgeTemplate]=\"edgeTemplateDirective?.templateRef\"\n [edgeLabelHtmlTemplate]=\"edgeLabelHtmlDirective?.templateRef\"\n />\n\n <!-- Nodes -->\n <svg:g\n *ngFor=\"let model of nodeModels(); trackBy: trackNodes\"\n node\n [nodeModel]=\"model\"\n [nodeTemplate]=\"nodeTemplateDirective?.templateRef\"\n [groupNodeTemplate]=\"groupNodeTemplateDirective?.templateRef\"\n [attr.transform]=\"model.pointTransform()\"\n />\n </svg:g>\n\n</svg:svg>\n", styles: [":host{display:block;width:100%;height:100%;-webkit-user-select:none;user-select:none}:host ::ng-deep *{box-sizing:border-box}\n"], dependencies: [{ kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "component", type: i4.NodeComponent, selector: "g[node]", inputs: ["nodeModel", "nodeTemplate", "groupNodeTemplate"] }, { kind: "component", type: i5.EdgeComponent, selector: "g[edge]", inputs: ["model", "edgeTemplate", "edgeLabelHtmlTemplate"] }, { kind: "component", type: i6.ConnectionComponent, selector: "g[connection]", inputs: ["model", "template"] }, { kind: "component", type: i7.DefsComponent, selector: "defs[flowDefs]", inputs: ["markers"] }, { kind: "component", type: i8.BackgroundComponent, selector: "g[background]", inputs: ["background"] }, { kind: "directive", type: i9.SpacePointContextDirective, selector: "g[spacePointContext]" }, { kind: "directive", type: i10.MapContextDirective, selector: "g[mapContext]" }, { kind: "directive", type: i11.RootSvgReferenceDirective, selector: "svg[rootSvgRef]" }, { kind: "directive", type: i12.RootSvgContextDirective, selector: "svg[rootSvgContext]" }, { kind: "directive", type: i13.RootPointerDirective, selector: "svg[rootPointer]" }, { kind: "directive", type: i14.FlowSizeControllerDirective, selector: "svg[flowSizeController]" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
293
+ ComponentEventBusService,
294
+ KeyboardService
295
+ ], queries: [{ propertyName: "nodeTemplateDirective", first: true, predicate: NodeHtmlTemplateDirective, descendants: true }, { propertyName: "groupNodeTemplateDirective", first: true, predicate: GroupNodeTemplateDirective, descendants: true }, { propertyName: "edgeTemplateDirective", first: true, predicate: EdgeTemplateDirective, descendants: true }, { propertyName: "edgeLabelHtmlDirective", first: true, predicate: EdgeLabelHtmlTemplateDirective, descendants: true }, { propertyName: "connectionTemplateDirective", first: true, predicate: ConnectionTemplateDirective, descendants: true }], viewQueries: [{ propertyName: "mapContext", first: true, predicate: MapContextDirective, descendants: true }, { propertyName: "spacePointContext", first: true, predicate: SpacePointContextDirective, descendants: true }], hostDirectives: [{ directive: i1.ConnectionControllerDirective, outputs: ["onConnect", "onConnect"] }, { directive: i2.ChangesControllerDirective, outputs: ["onNodesChange", "onNodesChange", "onNodesChange.position", "onNodesChange.position", "onNodesChange.position.single", "onNodesChange.position.single", "onNodesChange.position.many", "onNodesChange.position.many", "onNodesChange.size", "onNodesChange.size", "onNodesChange.size.single", "onNodesChange.size.single", "onNodesChange.size.many", "onNodesChange.size.many", "onNodesChange.add", "onNodesChange.add", "onNodesChange.add.single", "onNodesChange.add.single", "onNodesChange.add.many", "onNodesChange.add.many", "onNodesChange.remove", "onNodesChange.remove", "onNodesChange.remove.single", "onNodesChange.remove.single", "onNodesChange.remove.many", "onNodesChange.remove.many", "onNodesChange.select", "onNodesChange.select", "onNodesChange.select.single", "onNodesChange.select.single", "onNodesChange.select.many", "onNodesChange.select.many", "onEdgesChange", "onEdgesChange", "onEdgesChange.detached", "onEdgesChange.detached", "onEdgesChange.detached.single", "onEdgesChange.detached.single", "onEdgesChange.detached.many", "onEdgesChange.detached.many", "onEdgesChange.add", "onEdgesChange.add", "onEdgesChange.add.single", "onEdgesChange.add.single", "onEdgesChange.add.many", "onEdgesChange.add.many", "onEdgesChange.remove", "onEdgesChange.remove", "onEdgesChange.remove.single", "onEdgesChange.remove.single", "onEdgesChange.remove.many", "onEdgesChange.remove.many", "onEdgesChange.select", "onEdgesChange.select", "onEdgesChange.select.single", "onEdgesChange.select.single", "onEdgesChange.select.many", "onEdgesChange.select.many"] }], ngImport: i0, template: "<svg:svg\n rootSvgRef\n rootSvgContext\n rootPointer\n flowSizeController\n class=\"root-svg\"\n #flow\n>\n <defs [markers]=\"markers()\" flowDefs />\n\n <g background />\n\n <svg:g\n mapContext\n spacePointContext\n >\n <!-- Connection -->\n <svg:g\n connection\n [model]=\"connection\"\n [template]=\"connectionTemplateDirective?.templateRef\"\n />\n\n <!-- Edges -->\n <svg:g\n *ngFor=\"let model of edgeModels(); trackBy: trackEdges\"\n edge\n [model]=\"model\"\n [edgeTemplate]=\"edgeTemplateDirective?.templateRef\"\n [edgeLabelHtmlTemplate]=\"edgeLabelHtmlDirective?.templateRef\"\n />\n\n <!-- Nodes -->\n <svg:g\n *ngFor=\"let model of nodeModels(); trackBy: trackNodes\"\n node\n [nodeModel]=\"model\"\n [nodeTemplate]=\"nodeTemplateDirective?.templateRef\"\n [groupNodeTemplate]=\"groupNodeTemplateDirective?.templateRef\"\n [attr.transform]=\"model.pointTransform()\"\n />\n </svg:g>\n\n <!-- Minimap -->\n <ng-container *ngIf=\"minimap() as minimap\">\n <ng-container [ngTemplateOutlet]=\"minimap.template()\" />\n </ng-container>\n</svg:svg>\n", styles: [":host{display:block;width:100%;height:100%;-webkit-user-select:none;user-select:none}:host ::ng-deep *{box-sizing:border-box}\n"], dependencies: [{ kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: i4.NodeComponent, selector: "g[node]", inputs: ["nodeModel", "nodeTemplate", "groupNodeTemplate"] }, { kind: "component", type: i5.EdgeComponent, selector: "g[edge]", inputs: ["model", "edgeTemplate", "edgeLabelHtmlTemplate"] }, { kind: "component", type: i6.ConnectionComponent, selector: "g[connection]", inputs: ["model", "template"] }, { kind: "component", type: i7.DefsComponent, selector: "defs[flowDefs]", inputs: ["markers"] }, { kind: "component", type: i8.BackgroundComponent, selector: "g[background]" }, { kind: "directive", type: i9.SpacePointContextDirective, selector: "g[spacePointContext]" }, { kind: "directive", type: i10.MapContextDirective, selector: "g[mapContext]" }, { kind: "directive", type: i11.RootSvgReferenceDirective, selector: "svg[rootSvgRef]" }, { kind: "directive", type: i12.RootSvgContextDirective, selector: "svg[rootSvgContext]" }, { kind: "directive", type: i13.RootPointerDirective, selector: "svg[rootPointer]" }, { kind: "directive", type: i14.FlowSizeControllerDirective, selector: "svg[flowSizeController]" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
286
296
  }
287
297
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: VflowComponent, decorators: [{
288
298
  type: Component,
@@ -296,11 +306,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
296
306
  NodeRenderingService,
297
307
  SelectionService,
298
308
  FlowSettingsService,
299
- ComponentEventBusService
309
+ ComponentEventBusService,
310
+ KeyboardService
300
311
  ], hostDirectives: [
301
312
  connectionControllerHostDirective,
302
313
  changesControllerHostDirective
303
- ], template: "<svg:svg\n rootSvgRef\n rootSvgContext\n rootPointer\n flowSizeController\n class=\"root-svg\"\n #flow\n>\n <defs [markers]=\"markers()\" flowDefs />\n\n <g [background]=\"background\"/>\n\n <svg:g\n mapContext\n spacePointContext\n >\n <!-- Connection -->\n <svg:g\n connection\n [model]=\"connection\"\n [template]=\"connectionTemplateDirective?.templateRef\"\n />\n\n <!-- Edges -->\n <svg:g\n *ngFor=\"let model of edgeModels(); trackBy: trackEdges\"\n edge\n [model]=\"model\"\n [edgeTemplate]=\"edgeTemplateDirective?.templateRef\"\n [edgeLabelHtmlTemplate]=\"edgeLabelHtmlDirective?.templateRef\"\n />\n\n <!-- Nodes -->\n <svg:g\n *ngFor=\"let model of nodeModels(); trackBy: trackNodes\"\n node\n [nodeModel]=\"model\"\n [nodeTemplate]=\"nodeTemplateDirective?.templateRef\"\n [groupNodeTemplate]=\"groupNodeTemplateDirective?.templateRef\"\n [attr.transform]=\"model.pointTransform()\"\n />\n </svg:g>\n\n</svg:svg>\n", styles: [":host{display:block;width:100%;height:100%;-webkit-user-select:none;user-select:none}:host ::ng-deep *{box-sizing:border-box}\n"] }]
314
+ ], template: "<svg:svg\n rootSvgRef\n rootSvgContext\n rootPointer\n flowSizeController\n class=\"root-svg\"\n #flow\n>\n <defs [markers]=\"markers()\" flowDefs />\n\n <g background />\n\n <svg:g\n mapContext\n spacePointContext\n >\n <!-- Connection -->\n <svg:g\n connection\n [model]=\"connection\"\n [template]=\"connectionTemplateDirective?.templateRef\"\n />\n\n <!-- Edges -->\n <svg:g\n *ngFor=\"let model of edgeModels(); trackBy: trackEdges\"\n edge\n [model]=\"model\"\n [edgeTemplate]=\"edgeTemplateDirective?.templateRef\"\n [edgeLabelHtmlTemplate]=\"edgeLabelHtmlDirective?.templateRef\"\n />\n\n <!-- Nodes -->\n <svg:g\n *ngFor=\"let model of nodeModels(); trackBy: trackNodes\"\n node\n [nodeModel]=\"model\"\n [nodeTemplate]=\"nodeTemplateDirective?.templateRef\"\n [groupNodeTemplate]=\"groupNodeTemplateDirective?.templateRef\"\n [attr.transform]=\"model.pointTransform()\"\n />\n </svg:g>\n\n <!-- Minimap -->\n <ng-container *ngIf=\"minimap() as minimap\">\n <ng-container [ngTemplateOutlet]=\"minimap.template()\" />\n </ng-container>\n</svg:svg>\n", styles: [":host{display:block;width:100%;height:100%;-webkit-user-select:none;user-select:none}:host ::ng-deep *{box-sizing:border-box}\n"] }]
304
315
  }], propDecorators: { view: [{
305
316
  type: Input
306
317
  }], minZoom: [{
@@ -315,6 +326,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
315
326
  type: Input
316
327
  }], entitiesSelectable: [{
317
328
  type: Input
329
+ }], keyboardShortcuts: [{
330
+ type: Input
318
331
  }], connection: [{
319
332
  type: Input,
320
333
  args: [{ transform: (settings) => new ConnectionModel(settings) }]
@@ -347,4 +360,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
347
360
  type: ViewChild,
348
361
  args: [SpacePointContextDirective]
349
362
  }] } });
350
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmZsb3cuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXZmbG93LWxpYi9zcmMvbGliL3ZmbG93L2NvbXBvbmVudHMvdmZsb3cvdmZsb3cuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXZmbG93LWxpYi9zcmMvbGliL3ZmbG93L2NvbXBvbmVudHMvdmZsb3cvdmZsb3cuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFvQix1QkFBdUIsRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFnQixRQUFRLEVBQUUsS0FBSyxFQUFxQixNQUFNLEVBQXlCLFNBQVMsRUFBRSxRQUFRLEVBQVUsTUFBTSxFQUFFLHFCQUFxQixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRWhQLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHdDQUF3QyxDQUFDO0FBQzdFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBRXBFLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUNsRSxPQUFPLEVBQUUsWUFBWSxFQUFFLFFBQVEsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBR3BFLE9BQU8sRUFBRSwyQkFBMkIsRUFBRSw4QkFBOEIsRUFBRSxxQkFBcUIsRUFBRSwwQkFBMEIsRUFBRSx5QkFBeUIsRUFBRSxNQUFNLHFDQUFxQyxDQUFDO0FBRWhNLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUNqRSxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRzVCLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQ3ZFLE9BQU8sRUFBRSw2QkFBNkIsRUFBRSxNQUFNLGtEQUFrRCxDQUFDO0FBQ2pHLE9BQU8sRUFBRSxtQkFBbUIs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Z0JBTUcscUJBQXFCO3NCQUQ5QixZQUFZO3VCQUFDLHlCQUF5QjtnQkFJN0IsMEJBQTBCO3NCQURuQyxZQUFZO3VCQUFDLDBCQUEwQjtnQkFJOUIscUJBQXFCO3NCQUQ5QixZQUFZO3VCQUFDLHFCQUFxQjtnQkFJekIsc0JBQXNCO3NCQUQvQixZQUFZO3VCQUFDLDhCQUE4QjtnQkFJbEMsMkJBQTJCO3NCQURwQyxZQUFZO3VCQUFDLDJCQUEyQjtnQkFNL0IsVUFBVTtzQkFEbkIsU0FBUzt1QkFBQyxtQkFBbUI7Z0JBSXBCLGlCQUFpQjtzQkFEMUIsU0FBUzt1QkFBQywwQkFBMEIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBZnRlckNvbnRlbnRJbml0LCBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ29tcG9uZW50LCBDb250ZW50Q2hpbGQsIEV2ZW50RW1pdHRlciwgSW5qZWN0b3IsIElucHV0LCBPbkNoYW5nZXMsIE9uSW5pdCwgT3V0cHV0LCBTaWduYWwsIFNpbXBsZUNoYW5nZXMsIFZpZXdDaGlsZCwgY29tcHV0ZWQsIGVmZmVjdCwgaW5qZWN0LCBydW5JbkluamVjdGlvbkNvbnRleHQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IER5bmFtaWNOb2RlLCBOb2RlIH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9ub2RlLmludGVyZmFjZSc7XG5pbXBvcnQgeyBNYXBDb250ZXh0RGlyZWN0aXZlIH0gZnJvbSAnLi4vLi4vZGlyZWN0aXZlcy9tYXAtY29udGV4dC5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgRHJhZ2dhYmxlU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2RyYWdnYWJsZS5zZXJ2aWNlJztcbmltcG9ydCB7IE5vZGVNb2RlbCB9IGZyb20gJy4uLy4uL21vZGVscy9ub2RlLm1vZGVsJztcbmltcG9ydCB7IFZpZXdwb3J0U2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL3ZpZXdwb3J0LnNlcnZpY2UnO1xuaW1wb3J0IHsgdG9PYnNlcnZhYmxlLCB0b1NpZ25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUvcnhqcy1pbnRlcm9wJztcbmltcG9ydCB7IEVkZ2UgfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL2VkZ2UuaW50ZXJmYWNlJztcbmltcG9ydCB7IEVkZ2VNb2RlbCB9IGZyb20gJy4uLy4uL21vZGVscy9lZGdlLm1vZGVsJztcbmltcG9ydCB7IENvbm5lY3Rpb25UZW1wbGF0ZURpcmVjdGl2ZSwgRWRnZUxhYmVsSHRtbFRlbXBsYXRlRGlyZWN0aXZlLCBFZGdlVGVtcGxhdGVEaXJlY3RpdmUsIEdyb3VwTm9kZVRlbXBsYXRlRGlyZWN0aXZlLCBOb2RlSHRtbFRlbXBsYXRlRGlyZWN0aXZlIH0gZnJvbSAnLi4vLi4vZGlyZWN0aXZlcy90ZW1wbGF0ZS5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgSGFuZGxlUG9zaXRpb25zIH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9oYW5kbGUtcG9zaXRpb25zLmludGVyZmFjZSc7XG5pbXBvcnQgeyBhZGROb2Rlc1RvRWRnZXMgfSBmcm9tICcuLi8uLi91dGlscy9hZGQtbm9kZXMtdG8tZWRnZXMnO1xuaW1wb3J0IHsgc2tpcCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgUG9pbnQgfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL3BvaW50LmludGVyZmFjZSc7XG5pbXBvcnQgeyBWaWV3cG9ydFN0YXRlIH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy92aWV3cG9ydC5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgRmxvd1N0YXR1c1NlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9mbG93LXN0YXR1cy5zZXJ2aWNlJztcbmltcG9ydCB7IENvbm5lY3Rpb25Db250cm9sbGVyRGlyZWN0aXZlIH0gZnJvbSAnLi4vLi4vZGlyZWN0aXZlcy9jb25uZWN0aW9uLWNvbnRyb2xsZXIuZGlyZWN0aXZlJztcbmltcG9ydCB7IEZsb3dFbnRpdGllc1NlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9mbG93LWVudGl0aWVzLnNlcnZpY2UnO1xuaW1wb3J0IHsgQ29ubmVjdGlvblNldHRpbmdzIH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9jb25uZWN0aW9uLXNldHRpbmdzLmludGVyZmFjZSc7XG5pbXBvcnQgeyBDb25uZWN0aW9uTW9kZWwgfSBmcm9tICcuLi8uLi9tb2RlbHMvY29ubmVjdGlvbi5tb2RlbCc7XG5pbXBvcnQgeyBSZWZlcmVuY2VLZWVwZXIgfSBmcm9tICcuLi8uLi91dGlscy9yZWZlcmVuY2Uta2VlcGVyJztcbmltcG9ydCB7IE5vZGVzQ2hhbmdlU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL25vZGUtY2hhbmdlcy5zZXJ2aWNlJztcbmltcG9ydCB7IEVkZ2VDaGFuZ2VzU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2VkZ2UtY2hhbmdlcy5zZXJ2aWNlJztcbmltcG9ydCB7IE5vZGVDaGFuZ2UgfSBmcm9tICcuLi8uLi90eXBlcy9ub2RlLWNoYW5nZS50eXBlJztcbmltcG9ydCB7IENoYW5nZXNDb250cm9sbGVyRGlyZWN0aXZlIH0gZnJvbSAnLi4vLi4vZGlyZWN0aXZlcy9jaGFuZ2VzLWNvbnRyb2xsZXIuZGlyZWN0aXZlJztcbmltcG9ydCB7IEVkZ2VDaGFuZ2UgfSBmcm9tICcuLi8uLi90eXBlcy9lZGdlLWNoYW5nZS50eXBlJztcbmltcG9ydCB7IE5vZGVSZW5kZXJpbmdTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvbm9kZS1yZW5kZXJpbmcuc2VydmljZSc7XG5pbXBvcnQgeyBTZWxlY3Rpb25TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvc2VsZWN0aW9uLnNlcnZpY2UnO1xuaW1wb3J0IHsgRmxvd1NldHRpbmdzU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2Zsb3ctc2V0dGluZ3Muc2VydmljZSc7XG5pbXBvcnQgeyBDb21wb25lbnRFdmVudEJ1c1NlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9jb21wb25lbnQtZXZlbnQtYnVzLnNlcnZpY2UnO1xuaW1wb3J0IHsgQmFja2dyb3VuZCB9IGZyb20gJy4uLy4uL3R5cGVzL2JhY2tncm91bmQudHlwZSc7XG5pbXBvcnQgeyBTcGFjZVBvaW50Q29udGV4dERpcmVjdGl2ZSB9IGZyb20gJy4uLy4uL2RpcmVjdGl2ZXMvc3BhY2UtcG9pbnQtY29udGV4dC5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgRml0Vmlld09wdGlvbnMgfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL2ZpdC12aWV3LW9wdGlvbnMuaW50ZXJmYWNlJztcbmltcG9ydCB7IE9wdGltaXphdGlvbiB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvb3B0aW1pemF0aW9uLmludGVyZmFjZSc7XG5cbmNvbnN0IGNvbm5lY3Rpb25Db250cm9sbGVySG9zdERpcmVjdGl2ZSA9IHtcbiAgZGlyZWN0aXZlOiBDb25uZWN0aW9uQ29udHJvbGxlckRpcmVjdGl2ZSxcbiAgb3V0cHV0czogWydvbkNvbm5lY3QnXVxufVxuXG5jb25zdCBjaGFuZ2VzQ29udHJvbGxlckhvc3REaXJlY3RpdmUgPSB7XG4gIGRpcmVjdGl2ZTogQ2hhbmdlc0NvbnRyb2xsZXJEaXJlY3RpdmUsXG4gIG91dHB1dHM6IFtcbiAgICAnb25Ob2Rlc0NoYW5nZScsXG4gICAgJ29uTm9kZXNDaGFuZ2UucG9zaXRpb24nLFxuICAgICdvbk5vZGVzQ2hhbmdlLnBvc2l0aW9uLnNpbmdsZScsXG4gICAgJ29uTm9kZXNDaGFuZ2UucG9zaXRpb24ubWFueScsXG4gICAgJ29uTm9kZXNDaGFuZ2Uuc2l6ZScsXG4gICAgJ29uTm9kZXNDaGFuZ2Uuc2l6ZS5zaW5nbGUnLFxuICAgICdvbk5vZGVzQ2hhbmdlLnNpemUubWFueScsXG4gICAgJ29uTm9kZXNDaGFuZ2UuYWRkJyxcbiAgICAnb25Ob2Rlc0NoYW5nZS5hZGQuc2luZ2xlJyxcbiAgICAnb25Ob2Rlc0NoYW5nZS5hZGQubWFueScsXG4gICAgJ29uTm9kZXNDaGFuZ2UucmVtb3ZlJyxcbiAgICAnb25Ob2Rlc0NoYW5nZS5yZW1vdmUuc2luZ2xlJyxcbiAgICAnb25Ob2Rlc0NoYW5nZS5yZW1vdmUubWFueScsXG4gICAgJ29uTm9kZXNDaGFuZ2Uuc2VsZWN0JyxcbiAgICAnb25Ob2Rlc0NoYW5nZS5zZWxlY3Quc2luZ2xlJyxcbiAgICAnb25Ob2Rlc0NoYW5nZS5zZWxlY3QubWFueScsXG4gICAgJ29uRWRnZXNDaGFuZ2UnLFxuICAgICdvbkVkZ2VzQ2hhbmdlLmRldGFjaGVkJyxcbiAgICAnb25FZGdlc0NoYW5nZS5kZXRhY2hlZC5zaW5nbGUnLFxuICAgICdvbkVkZ2VzQ2hhbmdlLmRldGFjaGVkLm1hbnknLFxuICAgICdvbkVkZ2VzQ2hhbmdlLmFkZCcsXG4gICAgJ29uRWRnZXNDaGFuZ2UuYWRkLnNpbmdsZScsXG4gICAgJ29uRWRnZXNDaGFuZ2UuYWRkLm1hbnknLFxuICAgICdvbkVkZ2VzQ2hhbmdlLnJlbW92ZScsXG4gICAgJ29uRWRnZXNDaGFuZ2UucmVtb3ZlLnNpbmdsZScsXG4gICAgJ29uRWRnZXNDaGFuZ2UucmVtb3ZlLm1hbnknLFxuICAgICdvbkVkZ2VzQ2hhbmdlLnNlbGVjdCcsXG4gICAgJ29uRWRnZXNDaGFuZ2Uuc2VsZWN0LnNpbmdsZScsXG4gICAgJ29uRWRnZXNDaGFuZ2Uuc2VsZWN0Lm1hbnknLFxuICBdXG59XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3ZmbG93JyxcbiAgdGVtcGxhdGVVcmw6ICcuL3ZmbG93LmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vdmZsb3cuY29tcG9uZW50LnNjc3MnXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIHByb3ZpZGVyczogW1xuICAgIERyYWdnYWJsZVNlcnZpY2UsXG4gICAgVmlld3BvcnRTZXJ2aWNlLFxuICAgIEZsb3dTdGF0dXNTZXJ2aWNlLFxuICAgIEZsb3dFbnRpdGllc1NlcnZpY2UsXG4gICAgTm9kZXNDaGFuZ2VTZXJ2aWNlLFxuICAgIEVkZ2VDaGFuZ2VzU2VydmljZSxcbiAgICBOb2RlUmVuZGVyaW5nU2VydmljZSxcbiAgICBTZWxlY3Rpb25TZXJ2aWNlLFxuICAgIEZsb3dTZXR0aW5nc1NlcnZpY2UsXG4gICAgQ29tcG9uZW50RXZlbnRCdXNTZXJ2aWNlXG4gIF0sXG4gIGhvc3REaXJlY3RpdmVzOiBbXG4gICAgY29ubmVjdGlvbkNvbnRyb2xsZXJIb3N0RGlyZWN0aXZlLFxuICAgIGNoYW5nZXNDb250cm9sbGVySG9zdERpcmVjdGl2ZVxuICBdXG59KVxuZXhwb3J0IGNsYXNzIFZmbG93Q29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcbiAgLy8gI3JlZ2lvbiBESVxuICBwcml2YXRlIHZpZXdwb3J0U2VydmljZSA9IGluamVjdChWaWV3cG9ydFNlcnZpY2UpXG4gIHByaXZhdGUgZmxvd0VudGl0aWVzU2VydmljZSA9IGluamVjdChGbG93RW50aXRpZXNTZXJ2aWNlKVxuICBwcml2YXRlIG5vZGVzQ2hhbmdlU2VydmljZSA9IGluamVjdChOb2Rlc0NoYW5nZVNlcnZpY2UpXG4gIHByaXZhdGUgZWRnZXNDaGFuZ2VTZXJ2aWNlID0gaW5qZWN0KEVkZ2VDaGFuZ2VzU2VydmljZSlcbiAgcHJpdmF0ZSBub2RlUmVuZGVyaW5nU2VydmljZSA9IGluamVjdChOb2RlUmVuZGVyaW5nU2VydmljZSlcbiAgcHJpdmF0ZSBmbG93U2V0dGluZ3NTZXJ2aWNlID0gaW5qZWN0KEZsb3dTZXR0aW5nc1NlcnZpY2UpXG4gIHByaXZhdGUgY29tcG9uZW50RXZlbnRCdXNTZXJ2aWNlID0gaW5qZWN0KENvbXBvbmVudEV2ZW50QnVzU2VydmljZSlcbiAgcHJpdmF0ZSBpbmplY3RvciA9IGluamVjdChJbmplY3RvcilcbiAgLy8gI2VuZHJlZ2lvblxuXG4gIC8vICNyZWdpb24gU0VUVElOR1NcblxuICAvKipcbiAgICogU2l6ZSBmb3IgZmxvdyB2aWV3XG4gICAqXG4gICAqIGFjY2VwdHNcbiAgICogLSBhYnNvbHV0ZSBzaXplIGluIGZvcm1hdCBbd2lkdGgsIGhlaWdodF0gb3JcbiAgICogLSAnYXV0bycgdG8gY29tcHV0ZSBzaXplIGJhc2VkIG9uIHBhcmVudCBlbGVtZW50IHNpemVcbiAgICovXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBzZXQgdmlldyh2aWV3OiBbbnVtYmVyLCBudW1iZXJdIHwgJ2F1dG8nKSB7XG4gICAgdGhpcy5mbG93U2V0dGluZ3NTZXJ2aWNlLnZpZXcuc2V0KHZpZXcpXG4gIH1cblxuICAvKipcbiAgICogTWluaW11bSB6b29tIHZhbHVlXG4gICAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgc2V0IG1pblpvb20odmFsdWU6IG51bWJlcikge1xuICAgIHRoaXMuZmxvd1NldHRpbmdzU2VydmljZS5taW5ab29tLnNldCh2YWx1ZSlcbiAgfVxuXG4gIC8qKlxuICAgKiBNYXhpbXVtIHpvb20gdmFsdWVcbiAgICovXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBzZXQgbWF4Wm9vbSh2YWx1ZTogbnVtYmVyKSB7XG4gICAgdGhpcy5mbG93U2V0dGluZ3NTZXJ2aWNlLm1heFpvb20uc2V0KHZhbHVlKVxuICB9XG5cbiAgLyoqXG4gICAqIE9iamVjdCB0aGF0IGNvbnRyb2xzIGZsb3cgZGlyZWN0aW9uLlxuICAgKlxuICAgKiBGb3IgZXhhbXBsZSwgaWYgeW91IHdhbnQgdG8gYXJjaGlldmUgcmlnaHQgdG8gbGVmdCBkaXJlY3Rpb25cbiAgICogdGhlbiB5b3UgbmVlZCB0byBwYXNzIHRoZXNlIHBvc2l0aW9ucyB7IHNvdXJjZTogJ2xlZnQnLCB0YXJnZXQ6ICdyaWdodCcgfVxuICAgKlxuICAgKiBAZGVwcmVjYXRlZFxuICAgKi9cbiAgQElucHV0KClcbiAgcHVibGljIHNldCBoYW5kbGVQb3NpdGlvbnMoaGFuZGxlUG9zaXRpb25zOiBIYW5kbGVQb3NpdGlvbnMpIHtcbiAgICB0aGlzLmZsb3dTZXR0aW5nc1NlcnZpY2UuaGFuZGxlUG9zaXRpb25zLnNldChoYW5kbGVQb3NpdGlvbnMpXG4gIH1cblxuICAvKipcbiAgICogQmFja2dyb3VuZCBmb3IgZmxvd1xuICAgKi9cbiAgQElucHV0KClcbiAgcHVibGljIGJhY2tncm91bmQ6IEJhY2tncm91bmQgfCBzdHJpbmcgPSAnI2ZmZidcblxuICBASW5wdXQoKVxuICBwdWJsaWMgb3B0aW1pemF0aW9uOiBPcHRpbWl6YXRpb24gPSB7XG4gICAgY29tcHV0ZUxheWVyc09uSW5pdDogdHJ1ZVxuICB9XG5cbiAgLyoqXG4gICAqIEdsb2JhbCBydWxlIGlmIHlvdSBjYW4gb3IgY2FuJ3Qgc2VsZWN0IGVudGl0aWVzXG4gICAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgc2V0IGVudGl0aWVzU2VsZWN0YWJsZSh2YWx1ZTogYm9vbGVhbikge1xuICAgIHRoaXMuZmxvd1NldHRpbmdzU2VydmljZS5lbnRpdGllc1NlbGVjdGFibGUuc2V0KHZhbHVlKVxuICB9XG5cbiAgLyoqXG4gICAqIFNldHRpbmdzIGZvciBjb25uZWN0aW9uIChpdCByZW5kZXJzIHdoZW4gdXNlciB0cmllcyB0byBjcmVhdGUgZWRnZSBiZXR3ZWVuIG5vZGVzKVxuICAgKlxuICAgKiBZb3UgbmVlZCB0byBwYXNzIGBDb25uZWN0aW9uU2V0dGluZ3NgIGluIHRoaXMgaW5wdXQuXG4gICAqL1xuICBASW5wdXQoeyB0cmFuc2Zvcm06IChzZXR0aW5nczogQ29ubmVjdGlvblNldHRpbmdzKSA9PiBuZXcgQ29ubmVjdGlvbk1vZGVsKHNldHRpbmdzKSB9KVxuICBwdWJsaWMgc2V0IGNvbm5lY3Rpb24oY29ubmVjdGlvbjogQ29ubmVjdGlvbk1vZGVsKSB7IHRoaXMuZmxvd0VudGl0aWVzU2VydmljZS5jb25uZWN0aW9uLnNldChjb25uZWN0aW9uKSB9XG5cbiAgcHVibGljIGdldCBjb25uZWN0aW9uKCkgeyByZXR1cm4gdGhpcy5mbG93RW50aXRpZXNTZXJ2aWNlLmNvbm5lY3Rpb24oKSB9XG4gIC8vICNlbmRyZWdpb25cblxuICAvLyAjcmVnaW9uIE1BSU5fSU5QVVRTXG4gIC8qKlxuICAgKiBOb2RlcyB0byByZW5kZXJcbiAgICovXG4gIEBJbnB1dCh7IHJlcXVpcmVkOiB0cnVlIH0pXG4gIHB1YmxpYyBzZXQgbm9kZXMobmV3Tm9kZXM6IE5vZGVbXSB8IER5bmFtaWNOb2RlW10pIHtcbiAgICBjb25zdCBuZXdNb2RlbHMgPSBydW5JbkluamVjdGlvbkNvbnRleHQodGhpcy5pbmplY3RvcixcbiAgICAgICgpID0+IFJlZmVyZW5jZUtlZXBlci5ub2RlcyhuZXdOb2RlcywgdGhpcy5mbG93RW50aXRpZXNTZXJ2aWNlLm5vZGVzKCkpXG4gICAgKVxuXG4gICAgLy8gcXVpY2sgYW5kIGRpcnR5IGJpbmRpbmcgbm9kZXMgdG8gZWRnZXNcbiAgICBhZGROb2Rlc1RvRWRnZXMobmV3TW9kZWxzLCB0aGlzLmZsb3dFbnRpdGllc1NlcnZpY2UuZWRnZXMoKSlcblxuICAgIHRoaXMuZmxvd0VudGl0aWVzU2VydmljZS5ub2Rlcy5zZXQobmV3TW9kZWxzKVxuICB9XG5cbiAgcHJvdGVjdGVkIG5vZGVNb2RlbHMgPSBjb21wdXRlZCgoKSA9PiB0aGlzLm5vZGVSZW5kZXJpbmdTZXJ2aWNlLm5vZGVzKCkpXG5cbiAgLyoqXG4gICAqIEVkZ2VzIHRvIHJlbmRlclxuICAgKi9cbiAgQElucHV0KClcbiAgcHVibGljIHNldCBlZGdlcyhuZXdFZGdlczogRWRnZVtdKSB7XG4gICAgY29uc3QgbmV3TW9kZWxzID0gcnVuSW5JbmplY3Rpb25Db250ZXh0KHRoaXMuaW5qZWN0b3IsXG4gICAgICAoKSA9PiBSZWZlcmVuY2VLZWVwZXIuZWRnZXMobmV3RWRnZXMsIHRoaXMuZmxvd0VudGl0aWVzU2VydmljZS5lZGdlcygpKVxuICAgIClcblxuICAgIC8vIHF1aWNrIGFuZCBkaXJ0eSBiaW5kaW5nIG5vZGVzIHRvIGVkZ2VzXG4gICAgYWRkTm9kZXNUb0VkZ2VzKHRoaXMubm9kZU1vZGVscygpLCBuZXdNb2RlbHMpXG5cbiAgICB0aGlzLmZsb3dFbnRpdGllc1NlcnZpY2UuZWRnZXMuc2V0KG5ld01vZGVscylcbiAgfVxuXG4gIHByb3RlY3RlZCBlZGdlTW9kZWxzID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5mbG93RW50aXRpZXNTZXJ2aWNlLnZhbGlkRWRnZXMoKSlcbiAgLy8gI2VuZHJlZ2lvblxuXG4gIC8vICNyZWdpb24gT1VUUFVUU1xuICAvKipcbiAgICogRXZlbnQgdGhhdCBhY2N1bXVsYXRlcyBhbGwgY3VzdG9tIG5vZGUgZXZlbnRzXG4gICAqXG4gICAqIEBleHBlcmltZW50YWxcbiAgICovXG4gIEBPdXRwdXQoKVxuICBwdWJsaWMgb25Db21wb25lbnROb2RlRXZlbnQgPSB0aGlzLmNvbXBvbmVudEV2ZW50QnVzU2VydmljZS5ldmVudCQgYXMgYW55IC8vIFRPRE86IHJlc2VhcmNoIGhvdyB0byByZW1vdmUgYXMgYW55XG4gIC8vICNlbmRyZWdpb25cblxuICAvLyAjcmVnaW9uIFRFTVBMQVRFU1xuICBAQ29udGVudENoaWxkKE5vZGVIdG1sVGVtcGxhdGVEaXJlY3RpdmUpXG4gIHByb3RlY3RlZCBub2RlVGVtcGxhdGVEaXJlY3RpdmU/OiBOb2RlSHRtbFRlbXBsYXRlRGlyZWN0aXZlXG5cbiAgQENvbnRlbnRDaGlsZChHcm91cE5vZGVUZW1wbGF0ZURpcmVjdGl2ZSlcbiAgcHJvdGVjdGVkIGdyb3VwTm9kZVRlbXBsYXRlRGlyZWN0aXZlPzogR3JvdXBOb2RlVGVtcGxhdGVEaXJlY3RpdmVcblxuICBAQ29udGVudENoaWxkKEVkZ2VUZW1wbGF0ZURpcmVjdGl2ZSlcbiAgcHJvdGVjdGVkIGVkZ2VUZW1wbGF0ZURpcmVjdGl2ZT86IEVkZ2VUZW1wbGF0ZURpcmVjdGl2ZVxuXG4gIEBDb250ZW50Q2hpbGQoRWRnZUxhYmVsSHRtbFRlbXBsYXRlRGlyZWN0aXZlKVxuICBwcm90ZWN0ZWQgZWRnZUxhYmVsSHRtbERpcmVjdGl2ZT86IEVkZ2VMYWJlbEh0bWxUZW1wbGF0ZURpcmVjdGl2ZVxuXG4gIEBDb250ZW50Q2hpbGQoQ29ubmVjdGlvblRlbXBsYXRlRGlyZWN0aXZlKVxuICBwcm90ZWN0ZWQgY29ubmVjdGlvblRlbXBsYXRlRGlyZWN0aXZlPzogQ29ubmVjdGlvblRlbXBsYXRlRGlyZWN0aXZlXG4gIC8vICNlbmRyZWdpb25cblxuICAvLyAjcmVnaW9uIERJUkVDVElWRVNcbiAgQFZpZXdDaGlsZChNYXBDb250ZXh0RGlyZWN0aXZlKVxuICBwcm90ZWN0ZWQgbWFwQ29udGV4dCE6IE1hcENvbnRleHREaXJlY3RpdmVcblxuICBAVmlld0NoaWxkKFNwYWNlUG9pbnRDb250ZXh0RGlyZWN0aXZlKVxuICBwcm90ZWN0ZWQgc3BhY2VQb2ludENvbnRleHQhOiBTcGFjZVBvaW50Q29udGV4dERpcmVjdGl2ZVxuICAvLyAjZW5kcmVnaW9uXG5cbiAgLy8gI3JlZ2lvbiBTSUdOQUxfQVBJXG4gIC8qKlxuICAgKiBTaWduYWwgZm9yIHJlYWRpbmcgdmlld3BvcnQgY2hhbmdlXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgdmlld3BvcnQgPSB0aGlzLnZpZXdwb3J0U2VydmljZS5yZWFkYWJsZVZpZXdwb3J0LmFzUmVhZG9ubHkoKVxuXG4gIC8qKlxuICAgKiBTaWduYWwgZm9yIHJlYWRpbmcgbm9kZXMgY2hhbmdlXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgbm9kZXNDaGFuZ2UgPVxuICAgIHRvU2lnbmFsKHRoaXMubm9kZXNDaGFuZ2VTZXJ2aWNlLmNoYW5nZXMkLCB7IGluaXRpYWxWYWx1ZTogW10gYXMgTm9kZUNoYW5nZVtdIH0pXG5cbiAgLyoqXG4gICAqIFNpZ25hbCB0byByZWFkaW5nIGVkZ2VzIGNoYW5nZVxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGVkZ2VzQ2hhbmdlID1cbiAgICB0b1NpZ25hbCh0aGlzLmVkZ2VzQ2hhbmdlU2VydmljZS5jaGFuZ2VzJCwgeyBpbml0aWFsVmFsdWU6IFtdIGFzIEVkZ2VDaGFuZ2VbXSB9KVxuICAvLyAjZW5kcmVnaW9uXG5cbiAgLy8gI3JlZ2lvbiBSWF9BUElcbiAgLyoqXG4gICAqIE9ic2VydmFibGUgd2l0aCB2aWV3cG9ydCBjaGFuZ2VcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSB2aWV3cG9ydENoYW5nZSQgPSB0b09ic2VydmFibGUodGhpcy52aWV3cG9ydFNlcnZpY2UucmVhZGFibGVWaWV3cG9ydClcbiAgICAucGlwZShza2lwKDEpKSAvLyBza2lwIGRlZmF1bHQgdmFsdWUgdGhhdCBzZXQgYnkgc2lnbmFsXG5cbiAgLyoqXG4gICAqIE9ic2VydmFibGUgd2l0aCBub2RlcyBjaGFuZ2VcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBub2Rlc0NoYW5nZSQgPSB0aGlzLm5vZGVzQ2hhbmdlU2VydmljZS5jaGFuZ2VzJFxuXG4gIC8qKlxuICAgKiBPYnNlcnZhYmxlIHdpdGggZWRnZXMgY2hhbmdlXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgZWRnZXNDaGFuZ2UkID0gdGhpcy5lZGdlc0NoYW5nZVNlcnZpY2UuY2hhbmdlcyRcbiAgLy8gI2VuZHJlZ2lvblxuXG4gIHByb3RlY3RlZCBtYXJrZXJzID0gdGhpcy5mbG93RW50aXRpZXNTZXJ2aWNlLm1hcmtlcnNcblxuICBwdWJsaWMgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5zZXRJbml0aWFsTm9kZXNPcmRlcigpXG4gIH1cblxuICAvLyAjcmVnaW9uIE1FVEhPRFNfQVBJXG4gIC8qKlxuICAgKiBDaGFuZ2Ugdmlld3BvcnQgdG8gc3BlY2lmaWVkIHN0YXRlXG4gICAqXG4gICAqIEBwYXJhbSB2aWV3cG9ydCB2aWV3cG9ydCBzdGF0ZVxuICAgKi9cbiAgcHVibGljIHZpZXdwb3J0VG8odmlld3BvcnQ6IFZpZXdwb3J0U3RhdGUpOiB2b2lkIHtcbiAgICB0aGlzLnZpZXdwb3J0U2VydmljZS53cml0YWJsZVZpZXdwb3J0LnNldCh7IGNoYW5nZVR5cGU6ICdhYnNvbHV0ZScsIHN0YXRlOiB2aWV3cG9ydCwgZHVyYXRpb246IDAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGFuZ2Ugem9vbVxuICAgKlxuICAgKiBAcGFyYW0gem9vbSB6b29tIHZhbHVlXG4gICAqL1xuICBwdWJsaWMgem9vbVRvKHpvb206IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMudmlld3BvcnRTZXJ2aWNlLndyaXRhYmxlVmlld3BvcnQuc2V0KHsgY2hhbmdlVHlwZTogJ2Fic29sdXRlJywgc3RhdGU6IHsgem9vbSB9LCBkdXJhdGlvbjogMCB9KVxuICB9XG5cbiAgLyoqXG4gICAqIE1vdmUgdG8gc3BlY2lmaWVkIGNvb3JkaW5hdGVcbiAgICpcbiAgICogQHBhcmFtIHBvaW50IHBvaW50IHdoZXJlIHRvIG1vdmVcbiAgICovXG4gIHB1YmxpYyBwYW5Ubyhwb2ludDogUG9pbnQpOiB2b2lkIHtcbiAgICB0aGlzLnZpZXdwb3J0U2VydmljZS53cml0YWJsZVZpZXdwb3J0LnNldCh7IGNoYW5nZVR5cGU6ICdhYnNvbHV0ZScsIHN0YXRlOiBwb2ludCwgZHVyYXRpb246IDAgfSlcbiAgfVxuXG4gIHB1YmxpYyBmaXRWaWV3KG9wdGlvbnM/OiBGaXRWaWV3T3B0aW9ucykge1xuICAgIHRoaXMudmlld3BvcnRTZXJ2aWNlLmZpdFZpZXcob3B0aW9ucylcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgbm9kZSBieSBpZFxuICAgKlxuICAgKiBAcGFyYW0gaWQgbm9kZSBpZFxuICAgKi9cbiAgcHVibGljIGdldE5vZGU8VCA9IHVua25vd24+KGlkOiBzdHJpbmcpOiBOb2RlPFQ+IHwgRHluYW1pY05vZGU8VD4gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLmZsb3dFbnRpdGllc1NlcnZpY2UuZ2V0Tm9kZTxUPihpZCk/Lm5vZGVcbiAgfVxuXG4gIC8qKlxuICAgKiBTeW5jIG1ldGhvZCB0byBnZXQgZGV0YWNoZWQgZWRnZXNcbiAgICovXG4gIHB1YmxpYyBnZXREZXRhY2hlZEVkZ2VzKCk6IEVkZ2VbXSB7XG4gICAgcmV0dXJuIHRoaXMuZmxvd0VudGl0aWVzU2VydmljZS5nZXREZXRhY2hlZEVkZ2VzKCkubWFwKGUgPT4gZS5lZGdlKVxuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnQgcG9pbnQgcmVjZWl2ZWQgZnJvbSBkb2N1bWVudCB0byBwb2ludCBvbiB0aGUgZmxvd1xuICAgKi9cbiAgcHVibGljIGRvY3VtZW50UG9pbnRUb0Zsb3dQb2ludChwb2ludDogUG9pbnQpOiBQb2ludCB7XG4gICAgcmV0dXJuIHRoaXMuc3BhY2VQb2ludENvbnRleHQuZG9jdW1lbnRQb2ludFRvRmxvd1BvaW50KHBvaW50KVxuICB9XG4gIC8vICNlbmRyZWdpb25cblxuICBwcm90ZWN0ZWQgdHJhY2tOb2RlcyhpZHg6IG51bWJlciwgeyBub2RlIH06IE5vZGVNb2RlbCkge1xuICAgIHJldHVybiBub2RlXG4gIH1cblxuICBwcm90ZWN0ZWQgdHJhY2tFZGdlcyhpZHg6IG51bWJlciwgeyBlZGdlIH06IEVkZ2VNb2RlbCkge1xuICAgIHJldHVybiBlZGdlXG4gIH1cblxuICBwcml2YXRlIHNldEluaXRpYWxOb2Rlc09yZGVyKCkge1xuICAgIGlmICh0aGlzLm9wdGltaXphdGlvbi5jb21wdXRlTGF5ZXJzT25Jbml0KSB7XG5cbiAgICAgIHRoaXMubm9kZU1vZGVscygpLmZvckVhY2gobW9kZWwgPT4ge1xuICAgICAgICBzd2l0Y2ggKG1vZGVsLm5vZGUudHlwZSkge1xuICAgICAgICAgIGNhc2UgJ2RlZmF1bHQtZ3JvdXAnOlxuICAgICAgICAgIGNhc2UgJ3RlbXBsYXRlLWdyb3VwJzoge1xuICAgICAgICAgICAgdGhpcy5ub2RlUmVuZGVyaW5nU2VydmljZS5wdWxsTm9kZShtb2RlbClcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgfVxuICB9XG59XG5cbiIsIjxzdmc6c3ZnXG4gIHJvb3RTdmdSZWZcbiAgcm9vdFN2Z0NvbnRleHRcbiAgcm9vdFBvaW50ZXJcbiAgZmxvd1NpemVDb250cm9sbGVyXG4gIGNsYXNzPVwicm9vdC1zdmdcIlxuICAjZmxvd1xuPlxuICA8ZGVmcyBbbWFya2Vyc109XCJtYXJrZXJzKClcIiBmbG93RGVmcyAvPlxuXG4gIDxnIFtiYWNrZ3JvdW5kXT1cImJhY2tncm91bmRcIi8+XG5cbiAgPHN2ZzpnXG4gICAgbWFwQ29udGV4dFxuICAgIHNwYWNlUG9pbnRDb250ZXh0XG4gID5cbiAgICA8IS0tIENvbm5lY3Rpb24gLS0+XG4gICAgPHN2ZzpnXG4gICAgICBjb25uZWN0aW9uXG4gICAgICBbbW9kZWxdPVwiY29ubmVjdGlvblwiXG4gICAgICBbdGVtcGxhdGVdPVwiY29ubmVjdGlvblRlbXBsYXRlRGlyZWN0aXZlPy50ZW1wbGF0ZVJlZlwiXG4gICAgLz5cblxuICAgIDwhLS0gRWRnZXMgIC0tPlxuICAgIDxzdmc6Z1xuICAgICAgKm5nRm9yPVwibGV0IG1vZGVsIG9mIGVkZ2VNb2RlbHMoKTsgdHJhY2tCeTogdHJhY2tFZGdlc1wiXG4gICAgICBlZGdlXG4gICAgICBbbW9kZWxdPVwibW9kZWxcIlxuICAgICAgW2VkZ2VUZW1wbGF0ZV09XCJlZGdlVGVtcGxhdGVEaXJlY3RpdmU/LnRlbXBsYXRlUmVmXCJcbiAgICAgIFtlZGdlTGFiZWxIdG1sVGVtcGxhdGVdPVwiZWRnZUxhYmVsSHRtbERpcmVjdGl2ZT8udGVtcGxhdGVSZWZcIlxuICAgIC8+XG5cbiAgICA8IS0tIE5vZGVzIC0tPlxuICAgIDxzdmc6Z1xuICAgICAgKm5nRm9yPVwibGV0IG1vZGVsIG9mIG5vZGVNb2RlbHMoKTsgdHJhY2tCeTogdHJhY2tOb2Rlc1wiXG4gICAgICBub2RlXG4gICAgICBbbm9kZU1vZGVsXT1cIm1vZGVsXCJcbiAgICAgIFtub2RlVGVtcGxhdGVdPVwibm9kZVRlbXBsYXRlRGlyZWN0aXZlPy50ZW1wbGF0ZVJlZlwiXG4gICAgICBbZ3JvdXBOb2RlVGVtcGxhdGVdPVwiZ3JvdXBOb2RlVGVtcGxhdGVEaXJlY3RpdmU/LnRlbXBsYXRlUmVmXCJcbiAgICAgIFthdHRyLnRyYW5zZm9ybV09XCJtb2RlbC5wb2ludFRyYW5zZm9ybSgpXCJcbiAgICAvPlxuICA8L3N2ZzpnPlxuXG48L3N2Zzpzdmc+XG4iXX0=
363
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmZsb3cuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXZmbG93LWxpYi9zcmMvbGliL3ZmbG93L2NvbXBvbmVudHMvdmZsb3cvdmZsb3cuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXZmbG93LWxpYi9zcmMvbGliL3ZmbG93L2NvbXBvbmVudHMvdmZsb3cvdmZsb3cuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFvQix1QkFBdUIsRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFnQixRQUFRLEVBQUUsS0FBSyxFQUFxQixNQUFNLEVBQXlCLFNBQVMsRUFBRSxRQUFRLEVBQVUsTUFBTSxFQUFFLHFCQUFxQixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRWhQLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHdDQUF3QyxDQUFDO0FBQzdFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBRXBFLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUNsRSxPQUFPLEVBQUUsWUFBWSxFQUFFLFFBQVEsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBR3BFLE9BQU8sRUFBRSwyQkFBMkIsRUFBRSw4QkFBOEIsRUFBRSxxQkFBcUIsRUFBRSwwQkFBMEIsRUFBRSx5QkFBeUIsRUFBRSxNQUFNLHFDQUFxQyxDQUFDO0FBRWhNLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUNqRSxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRzVCLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQ3ZFLE9BQU8sRUFBRSw2QkFBNkIsRUFBRSxNQUFNLGtEQUFrRCxDQUFDO0FBQ2pHLE9BQU8sRUFBRSxtQkFBbUIs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LDhCQUE4QjtxQkFDL0I7OEJBeUJVLElBQUk7c0JBRGQsS0FBSztnQkFTSyxPQUFPO3NCQURqQixLQUFLO2dCQVNLLE9BQU87c0JBRGpCLEtBQUs7Z0JBY0ssZUFBZTtzQkFEekIsS0FBSztnQkFTSyxVQUFVO3NCQURwQixLQUFLO2dCQU1DLFlBQVk7c0JBRGxCLEtBQUs7Z0JBU0ssa0JBQWtCO3NCQUQ1QixLQUFLO2dCQU1LLGlCQUFpQjtzQkFEM0IsS0FBSztnQkFXSyxVQUFVO3NCQURwQixLQUFLO3VCQUFDLEVBQUUsU0FBUyxFQUFFLENBQUMsUUFBNEIsRUFBRSxFQUFFLENBQUMsSUFBSSxlQUFlLENBQUMsUUFBUSxDQUFDLEVBQUU7Z0JBVzFFLEtBQUs7c0JBRGYsS0FBSzt1QkFBQyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUU7Z0JBa0JkLEtBQUs7c0JBRGYsS0FBSztnQkFzQkMsb0JBQW9CO3NCQUQxQixNQUFNO2dCQU1HLHFCQUFxQjtzQkFEOUIsWUFBWTt1QkFBQyx5QkFBeUI7Z0JBSTdCLDBCQUEwQjtzQkFEbkMsWUFBWTt1QkFBQywwQkFBMEI7Z0JBSTlCLHFCQUFxQjtzQkFEOUIsWUFBWTt1QkFBQyxxQkFBcUI7Z0JBSXpCLHNCQUFzQjtzQkFEL0IsWUFBWTt1QkFBQyw4QkFBOEI7Z0JBSWxDLDJCQUEyQjtzQkFEcEMsWUFBWTt1QkFBQywyQkFBMkI7Z0JBTS9CLFVBQVU7c0JBRG5CLFNBQVM7dUJBQUMsbUJBQW1CO2dCQUlwQixpQkFBaUI7c0JBRDFCLFNBQVM7dUJBQUMsMEJBQTBCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQWZ0ZXJDb250ZW50SW5pdCwgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENvbXBvbmVudCwgQ29udGVudENoaWxkLCBFdmVudEVtaXR0ZXIsIEluamVjdG9yLCBJbnB1dCwgT25DaGFuZ2VzLCBPbkluaXQsIE91dHB1dCwgU2lnbmFsLCBTaW1wbGVDaGFuZ2VzLCBWaWV3Q2hpbGQsIGNvbXB1dGVkLCBlZmZlY3QsIGluamVjdCwgcnVuSW5JbmplY3Rpb25Db250ZXh0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBEeW5hbWljTm9kZSwgTm9kZSB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvbm9kZS5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgTWFwQ29udGV4dERpcmVjdGl2ZSB9IGZyb20gJy4uLy4uL2RpcmVjdGl2ZXMvbWFwLWNvbnRleHQuZGlyZWN0aXZlJztcbmltcG9ydCB7IERyYWdnYWJsZVNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9kcmFnZ2FibGUuc2VydmljZSc7XG5pbXBvcnQgeyBOb2RlTW9kZWwgfSBmcm9tICcuLi8uLi9tb2RlbHMvbm9kZS5tb2RlbCc7XG5pbXBvcnQgeyBWaWV3cG9ydFNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy92aWV3cG9ydC5zZXJ2aWNlJztcbmltcG9ydCB7IHRvT2JzZXJ2YWJsZSwgdG9TaWduYWwgfSBmcm9tICdAYW5ndWxhci9jb3JlL3J4anMtaW50ZXJvcCc7XG5pbXBvcnQgeyBFZGdlIH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9lZGdlLmludGVyZmFjZSc7XG5pbXBvcnQgeyBFZGdlTW9kZWwgfSBmcm9tICcuLi8uLi9tb2RlbHMvZWRnZS5tb2RlbCc7XG5pbXBvcnQgeyBDb25uZWN0aW9uVGVtcGxhdGVEaXJlY3RpdmUsIEVkZ2VMYWJlbEh0bWxUZW1wbGF0ZURpcmVjdGl2ZSwgRWRnZVRlbXBsYXRlRGlyZWN0aXZlLCBHcm91cE5vZGVUZW1wbGF0ZURpcmVjdGl2ZSwgTm9kZUh0bWxUZW1wbGF0ZURpcmVjdGl2ZSB9IGZyb20gJy4uLy4uL2RpcmVjdGl2ZXMvdGVtcGxhdGUuZGlyZWN0aXZlJztcbmltcG9ydCB7IEhhbmRsZVBvc2l0aW9ucyB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvaGFuZGxlLXBvc2l0aW9ucy5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgYWRkTm9kZXNUb0VkZ2VzIH0gZnJvbSAnLi4vLi4vdXRpbHMvYWRkLW5vZGVzLXRvLWVkZ2VzJztcbmltcG9ydCB7IHNraXAgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IFBvaW50IH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9wb2ludC5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgVmlld3BvcnRTdGF0ZSB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvdmlld3BvcnQuaW50ZXJmYWNlJztcbmltcG9ydCB7IEZsb3dTdGF0dXNTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvZmxvdy1zdGF0dXMuc2VydmljZSc7XG5pbXBvcnQgeyBDb25uZWN0aW9uQ29udHJvbGxlckRpcmVjdGl2ZSB9IGZyb20gJy4uLy4uL2RpcmVjdGl2ZXMvY29ubmVjdGlvbi1jb250cm9sbGVyLmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBGbG93RW50aXRpZXNTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvZmxvdy1lbnRpdGllcy5zZXJ2aWNlJztcbmltcG9ydCB7IENvbm5lY3Rpb25TZXR0aW5ncyB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvY29ubmVjdGlvbi1zZXR0aW5ncy5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgQ29ubmVjdGlvbk1vZGVsIH0gZnJvbSAnLi4vLi4vbW9kZWxzL2Nvbm5lY3Rpb24ubW9kZWwnO1xuaW1wb3J0IHsgUmVmZXJlbmNlS2VlcGVyIH0gZnJvbSAnLi4vLi4vdXRpbHMvcmVmZXJlbmNlLWtlZXBlcic7XG5pbXBvcnQgeyBOb2Rlc0NoYW5nZVNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9ub2RlLWNoYW5nZXMuc2VydmljZSc7XG5pbXBvcnQgeyBFZGdlQ2hhbmdlc1NlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9lZGdlLWNoYW5nZXMuc2VydmljZSc7XG5pbXBvcnQgeyBOb2RlQ2hhbmdlIH0gZnJvbSAnLi4vLi4vdHlwZXMvbm9kZS1jaGFuZ2UudHlwZSc7XG5pbXBvcnQgeyBDaGFuZ2VzQ29udHJvbGxlckRpcmVjdGl2ZSB9IGZyb20gJy4uLy4uL2RpcmVjdGl2ZXMvY2hhbmdlcy1jb250cm9sbGVyLmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBFZGdlQ2hhbmdlIH0gZnJvbSAnLi4vLi4vdHlwZXMvZWRnZS1jaGFuZ2UudHlwZSc7XG5pbXBvcnQgeyBOb2RlUmVuZGVyaW5nU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL25vZGUtcmVuZGVyaW5nLnNlcnZpY2UnO1xuaW1wb3J0IHsgU2VsZWN0aW9uU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL3NlbGVjdGlvbi5zZXJ2aWNlJztcbmltcG9ydCB7IEZsb3dTZXR0aW5nc1NlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9mbG93LXNldHRpbmdzLnNlcnZpY2UnO1xuaW1wb3J0IHsgQ29tcG9uZW50RXZlbnRCdXNTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvY29tcG9uZW50LWV2ZW50LWJ1cy5zZXJ2aWNlJztcbmltcG9ydCB7IEJhY2tncm91bmQgfSBmcm9tICcuLi8uLi90eXBlcy9iYWNrZ3JvdW5kLnR5cGUnO1xuaW1wb3J0IHsgU3BhY2VQb2ludENvbnRleHREaXJlY3RpdmUgfSBmcm9tICcuLi8uLi9kaXJlY3RpdmVzL3NwYWNlLXBvaW50LWNvbnRleHQuZGlyZWN0aXZlJztcbmltcG9ydCB7IEZpdFZpZXdPcHRpb25zIH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9maXQtdmlldy1vcHRpb25zLmludGVyZmFjZSc7XG5pbXBvcnQgeyBPcHRpbWl6YXRpb24gfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL29wdGltaXphdGlvbi5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgS2V5Ym9hcmRTaG9ydGN1dHMgfSBmcm9tICcuLi8uLi90eXBlcy9rZXlib2FyZC1hY3Rpb24udHlwZSc7XG5pbXBvcnQgeyBLZXlib2FyZFNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9rZXlib2FyZC5zZXJ2aWNlJztcbmltcG9ydCB7IHRyYW5zZm9ybUJhY2tncm91bmQgfSBmcm9tICcuLi8uLi91dGlscy90cmFuc2Zvcm0tYmFja2dyb3VuZCc7XG5cbmNvbnN0IGNvbm5lY3Rpb25Db250cm9sbGVySG9zdERpcmVjdGl2ZSA9IHtcbiAgZGlyZWN0aXZlOiBDb25uZWN0aW9uQ29udHJvbGxlckRpcmVjdGl2ZSxcbiAgb3V0cHV0czogWydvbkNvbm5lY3QnXVxufVxuXG5jb25zdCBjaGFuZ2VzQ29udHJvbGxlckhvc3REaXJlY3RpdmUgPSB7XG4gIGRpcmVjdGl2ZTogQ2hhbmdlc0NvbnRyb2xsZXJEaXJlY3RpdmUsXG4gIG91dHB1dHM6IFtcbiAgICAnb25Ob2Rlc0NoYW5nZScsXG4gICAgJ29uTm9kZXNDaGFuZ2UucG9zaXRpb24nLFxuICAgICdvbk5vZGVzQ2hhbmdlLnBvc2l0aW9uLnNpbmdsZScsXG4gICAgJ29uTm9kZXNDaGFuZ2UucG9zaXRpb24ubWFueScsXG4gICAgJ29uTm9kZXNDaGFuZ2Uuc2l6ZScsXG4gICAgJ29uTm9kZXNDaGFuZ2Uuc2l6ZS5zaW5nbGUnLFxuICAgICdvbk5vZGVzQ2hhbmdlLnNpemUubWFueScsXG4gICAgJ29uTm9kZXNDaGFuZ2UuYWRkJyxcbiAgICAnb25Ob2Rlc0NoYW5nZS5hZGQuc2luZ2xlJyxcbiAgICAnb25Ob2Rlc0NoYW5nZS5hZGQubWFueScsXG4gICAgJ29uTm9kZXNDaGFuZ2UucmVtb3ZlJyxcbiAgICAnb25Ob2Rlc0NoYW5nZS5yZW1vdmUuc2luZ2xlJyxcbiAgICAnb25Ob2Rlc0NoYW5nZS5yZW1vdmUubWFueScsXG4gICAgJ29uTm9kZXNDaGFuZ2Uuc2VsZWN0JyxcbiAgICAnb25Ob2Rlc0NoYW5nZS5zZWxlY3Quc2luZ2xlJyxcbiAgICAnb25Ob2Rlc0NoYW5nZS5zZWxlY3QubWFueScsXG4gICAgJ29uRWRnZXNDaGFuZ2UnLFxuICAgICdvbkVkZ2VzQ2hhbmdlLmRldGFjaGVkJyxcbiAgICAnb25FZGdlc0NoYW5nZS5kZXRhY2hlZC5zaW5nbGUnLFxuICAgICdvbkVkZ2VzQ2hhbmdlLmRldGFjaGVkLm1hbnknLFxuICAgICdvbkVkZ2VzQ2hhbmdlLmFkZCcsXG4gICAgJ29uRWRnZXNDaGFuZ2UuYWRkLnNpbmdsZScsXG4gICAgJ29uRWRnZXNDaGFuZ2UuYWRkLm1hbnknLFxuICAgICdvbkVkZ2VzQ2hhbmdlLnJlbW92ZScsXG4gICAgJ29uRWRnZXNDaGFuZ2UucmVtb3ZlLnNpbmdsZScsXG4gICAgJ29uRWRnZXNDaGFuZ2UucmVtb3ZlLm1hbnknLFxuICAgICdvbkVkZ2VzQ2hhbmdlLnNlbGVjdCcsXG4gICAgJ29uRWRnZXNDaGFuZ2Uuc2VsZWN0LnNpbmdsZScsXG4gICAgJ29uRWRnZXNDaGFuZ2Uuc2VsZWN0Lm1hbnknLFxuICBdXG59XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3ZmbG93JyxcbiAgdGVtcGxhdGVVcmw6ICcuL3ZmbG93LmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vdmZsb3cuY29tcG9uZW50LnNjc3MnXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIHByb3ZpZGVyczogW1xuICAgIERyYWdnYWJsZVNlcnZpY2UsXG4gICAgVmlld3BvcnRTZXJ2aWNlLFxuICAgIEZsb3dTdGF0dXNTZXJ2aWNlLFxuICAgIEZsb3dFbnRpdGllc1NlcnZpY2UsXG4gICAgTm9kZXNDaGFuZ2VTZXJ2aWNlLFxuICAgIEVkZ2VDaGFuZ2VzU2VydmljZSxcbiAgICBOb2RlUmVuZGVyaW5nU2VydmljZSxcbiAgICBTZWxlY3Rpb25TZXJ2aWNlLFxuICAgIEZsb3dTZXR0aW5nc1NlcnZpY2UsXG4gICAgQ29tcG9uZW50RXZlbnRCdXNTZXJ2aWNlLFxuICAgIEtleWJvYXJkU2VydmljZVxuICBdLFxuICBob3N0RGlyZWN0aXZlczogW1xuICAgIGNvbm5lY3Rpb25Db250cm9sbGVySG9zdERpcmVjdGl2ZSxcbiAgICBjaGFuZ2VzQ29udHJvbGxlckhvc3REaXJlY3RpdmVcbiAgXVxufSlcbmV4cG9ydCBjbGFzcyBWZmxvd0NvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIC8vICNyZWdpb24gRElcbiAgcHJpdmF0ZSB2aWV3cG9ydFNlcnZpY2UgPSBpbmplY3QoVmlld3BvcnRTZXJ2aWNlKVxuICBwcml2YXRlIGZsb3dFbnRpdGllc1NlcnZpY2UgPSBpbmplY3QoRmxvd0VudGl0aWVzU2VydmljZSlcbiAgcHJpdmF0ZSBub2Rlc0NoYW5nZVNlcnZpY2UgPSBpbmplY3QoTm9kZXNDaGFuZ2VTZXJ2aWNlKVxuICBwcml2YXRlIGVkZ2VzQ2hhbmdlU2VydmljZSA9IGluamVjdChFZGdlQ2hhbmdlc1NlcnZpY2UpXG4gIHByaXZhdGUgbm9kZVJlbmRlcmluZ1NlcnZpY2UgPSBpbmplY3QoTm9kZVJlbmRlcmluZ1NlcnZpY2UpXG4gIHByaXZhdGUgZmxvd1NldHRpbmdzU2VydmljZSA9IGluamVjdChGbG93U2V0dGluZ3NTZXJ2aWNlKVxuICBwcml2YXRlIGNvbXBvbmVudEV2ZW50QnVzU2VydmljZSA9IGluamVjdChDb21wb25lbnRFdmVudEJ1c1NlcnZpY2UpXG4gIHByaXZhdGUga2V5Ym9hcmRTZXJ2aWNlID0gaW5qZWN0KEtleWJvYXJkU2VydmljZSlcbiAgcHJpdmF0ZSBpbmplY3RvciA9IGluamVjdChJbmplY3RvcilcbiAgLy8gI2VuZHJlZ2lvblxuXG4gIC8vICNyZWdpb24gU0VUVElOR1NcblxuICAvKipcbiAgICogU2l6ZSBmb3IgZmxvdyB2aWV3XG4gICAqXG4gICAqIGFjY2VwdHNcbiAgICogLSBhYnNvbHV0ZSBzaXplIGluIGZvcm1hdCBbd2lkdGgsIGhlaWdodF0gb3JcbiAgICogLSAnYXV0bycgdG8gY29tcHV0ZSBzaXplIGJhc2VkIG9uIHBhcmVudCBlbGVtZW50IHNpemVcbiAgICovXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBzZXQgdmlldyh2aWV3OiBbbnVtYmVyLCBudW1iZXJdIHwgJ2F1dG8nKSB7XG4gICAgdGhpcy5mbG93U2V0dGluZ3NTZXJ2aWNlLnZpZXcuc2V0KHZpZXcpXG4gIH1cblxuICAvKipcbiAgICogTWluaW11bSB6b29tIHZhbHVlXG4gICAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgc2V0IG1pblpvb20odmFsdWU6IG51bWJlcikge1xuICAgIHRoaXMuZmxvd1NldHRpbmdzU2VydmljZS5taW5ab29tLnNldCh2YWx1ZSlcbiAgfVxuXG4gIC8qKlxuICAgKiBNYXhpbXVtIHpvb20gdmFsdWVcbiAgICovXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBzZXQgbWF4Wm9vbSh2YWx1ZTogbnVtYmVyKSB7XG4gICAgdGhpcy5mbG93U2V0dGluZ3NTZXJ2aWNlLm1heFpvb20uc2V0KHZhbHVlKVxuICB9XG5cbiAgLyoqXG4gICAqIE9iamVjdCB0aGF0IGNvbnRyb2xzIGZsb3cgZGlyZWN0aW9uLlxuICAgKlxuICAgKiBGb3IgZXhhbXBsZSwgaWYgeW91IHdhbnQgdG8gYXJjaGlldmUgcmlnaHQgdG8gbGVmdCBkaXJlY3Rpb25cbiAgICogdGhlbiB5b3UgbmVlZCB0byBwYXNzIHRoZXNlIHBvc2l0aW9ucyB7IHNvdXJjZTogJ2xlZnQnLCB0YXJnZXQ6ICdyaWdodCcgfVxuICAgKlxuICAgKiBAZGVwcmVjYXRlZFxuICAgKi9cbiAgQElucHV0KClcbiAgcHVibGljIHNldCBoYW5kbGVQb3NpdGlvbnMoaGFuZGxlUG9zaXRpb25zOiBIYW5kbGVQb3NpdGlvbnMpIHtcbiAgICB0aGlzLmZsb3dTZXR0aW5nc1NlcnZpY2UuaGFuZGxlUG9zaXRpb25zLnNldChoYW5kbGVQb3NpdGlvbnMpXG4gIH1cblxuICAvKipcbiAgICogQmFja2dyb3VuZCBmb3IgZmxvd1xuICAgKi9cbiAgQElucHV0KClcbiAgcHVibGljIHNldCBiYWNrZ3JvdW5kKHZhbHVlOiBCYWNrZ3JvdW5kIHwgc3RyaW5nKSB7XG4gICAgdGhpcy5mbG93U2V0dGluZ3NTZXJ2aWNlLmJhY2tncm91bmQuc2V0KHRyYW5zZm9ybUJhY2tncm91bmQodmFsdWUpKVxuICB9XG5cbiAgQElucHV0KClcbiAgcHVibGljIG9wdGltaXphdGlvbjogT3B0aW1pemF0aW9uID0ge1xuICAgIGNvbXB1dGVMYXllcnNPbkluaXQ6IHRydWVcbiAgfVxuXG4gIC8qKlxuICAgKiBHbG9iYWwgcnVsZSBpZiB5b3UgY2FuIG9yIGNhbid0IHNlbGVjdCBlbnRpdGllc1xuICAgKi9cbiAgQElucHV0KClcbiAgcHVibGljIHNldCBlbnRpdGllc1NlbGVjdGFibGUodmFsdWU6IGJvb2xlYW4pIHtcbiAgICB0aGlzLmZsb3dTZXR0aW5nc1NlcnZpY2UuZW50aXRpZXNTZWxlY3RhYmxlLnNldCh2YWx1ZSlcbiAgfVxuXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBzZXQga2V5Ym9hcmRTaG9ydGN1dHModmFsdWU6IEtleWJvYXJkU2hvcnRjdXRzKSB7XG4gICAgdGhpcy5rZXlib2FyZFNlcnZpY2Uuc2V0U2hvcnRjdXRzKHZhbHVlKVxuICB9XG5cbiAgLyoqXG4gICAqIFNldHRpbmdzIGZvciBjb25uZWN0aW9uIChpdCByZW5kZXJzIHdoZW4gdXNlciB0cmllcyB0byBjcmVhdGUgZWRnZSBiZXR3ZWVuIG5vZGVzKVxuICAgKlxuICAgKiBZb3UgbmVlZCB0byBwYXNzIGBDb25uZWN0aW9uU2V0dGluZ3NgIGluIHRoaXMgaW5wdXQuXG4gICAqL1xuICBASW5wdXQoeyB0cmFuc2Zvcm06IChzZXR0aW5nczogQ29ubmVjdGlvblNldHRpbmdzKSA9PiBuZXcgQ29ubmVjdGlvbk1vZGVsKHNldHRpbmdzKSB9KVxuICBwdWJsaWMgc2V0IGNvbm5lY3Rpb24oY29ubmVjdGlvbjogQ29ubmVjdGlvbk1vZGVsKSB7IHRoaXMuZmxvd0VudGl0aWVzU2VydmljZS5jb25uZWN0aW9uLnNldChjb25uZWN0aW9uKSB9XG5cbiAgcHVibGljIGdldCBjb25uZWN0aW9uKCkgeyByZXR1cm4gdGhpcy5mbG93RW50aXRpZXNTZXJ2aWNlLmNvbm5lY3Rpb24oKSB9XG4gIC8vICNlbmRyZWdpb25cblxuICAvLyAjcmVnaW9uIE1BSU5fSU5QVVRTXG4gIC8qKlxuICAgKiBOb2RlcyB0byByZW5kZXJcbiAgICovXG4gIEBJbnB1dCh7IHJlcXVpcmVkOiB0cnVlIH0pXG4gIHB1YmxpYyBzZXQgbm9kZXMobmV3Tm9kZXM6IE5vZGVbXSB8IER5bmFtaWNOb2RlW10pIHtcbiAgICBjb25zdCBuZXdNb2RlbHMgPSBydW5JbkluamVjdGlvbkNvbnRleHQodGhpcy5pbmplY3RvcixcbiAgICAgICgpID0+IFJlZmVyZW5jZUtlZXBlci5ub2RlcyhuZXdOb2RlcywgdGhpcy5mbG93RW50aXRpZXNTZXJ2aWNlLm5vZGVzKCkpXG4gICAgKVxuXG4gICAgLy8gcXVpY2sgYW5kIGRpcnR5IGJpbmRpbmcgbm9kZXMgdG8gZWRnZXNcbiAgICBhZGROb2Rlc1RvRWRnZXMobmV3TW9kZWxzLCB0aGlzLmZsb3dFbnRpdGllc1NlcnZpY2UuZWRnZXMoKSlcblxuICAgIHRoaXMuZmxvd0VudGl0aWVzU2VydmljZS5ub2Rlcy5zZXQobmV3TW9kZWxzKVxuICB9XG5cbiAgcHJvdGVjdGVkIG5vZGVNb2RlbHMgPSBjb21wdXRlZCgoKSA9PiB0aGlzLm5vZGVSZW5kZXJpbmdTZXJ2aWNlLm5vZGVzKCkpXG5cbiAgLyoqXG4gICAqIEVkZ2VzIHRvIHJlbmRlclxuICAgKi9cbiAgQElucHV0KClcbiAgcHVibGljIHNldCBlZGdlcyhuZXdFZGdlczogRWRnZVtdKSB7XG4gICAgY29uc3QgbmV3TW9kZWxzID0gcnVuSW5JbmplY3Rpb25Db250ZXh0KHRoaXMuaW5qZWN0b3IsXG4gICAgICAoKSA9PiBSZWZlcmVuY2VLZWVwZXIuZWRnZXMobmV3RWRnZXMsIHRoaXMuZmxvd0VudGl0aWVzU2VydmljZS5lZGdlcygpKVxuICAgIClcblxuICAgIC8vIHF1aWNrIGFuZCBkaXJ0eSBiaW5kaW5nIG5vZGVzIHRvIGVkZ2VzXG4gICAgYWRkTm9kZXNUb0VkZ2VzKHRoaXMubm9kZU1vZGVscygpLCBuZXdNb2RlbHMpXG5cbiAgICB0aGlzLmZsb3dFbnRpdGllc1NlcnZpY2UuZWRnZXMuc2V0KG5ld01vZGVscylcbiAgfVxuXG4gIHByb3RlY3RlZCBlZGdlTW9kZWxzID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5mbG93RW50aXRpZXNTZXJ2aWNlLnZhbGlkRWRnZXMoKSlcbiAgLy8gI2VuZHJlZ2lvblxuXG4gIC8vICNyZWdpb24gT1VUUFVUU1xuICAvKipcbiAgICogRXZlbnQgdGhhdCBhY2N1bXVsYXRlcyBhbGwgY3VzdG9tIG5vZGUgZXZlbnRzXG4gICAqXG4gICAqIEBleHBlcmltZW50YWxcbiAgICovXG4gIEBPdXRwdXQoKVxuICBwdWJsaWMgb25Db21wb25lbnROb2RlRXZlbnQgPSB0aGlzLmNvbXBvbmVudEV2ZW50QnVzU2VydmljZS5ldmVudCQgYXMgYW55IC8vIFRPRE86IHJlc2VhcmNoIGhvdyB0byByZW1vdmUgYXMgYW55XG4gIC8vICNlbmRyZWdpb25cblxuICAvLyAjcmVnaW9uIFRFTVBMQVRFU1xuICBAQ29udGVudENoaWxkKE5vZGVIdG1sVGVtcGxhdGVEaXJlY3RpdmUpXG4gIHByb3RlY3RlZCBub2RlVGVtcGxhdGVEaXJlY3RpdmU/OiBOb2RlSHRtbFRlbXBsYXRlRGlyZWN0aXZlXG5cbiAgQENvbnRlbnRDaGlsZChHcm91cE5vZGVUZW1wbGF0ZURpcmVjdGl2ZSlcbiAgcHJvdGVjdGVkIGdyb3VwTm9kZVRlbXBsYXRlRGlyZWN0aXZlPzogR3JvdXBOb2RlVGVtcGxhdGVEaXJlY3RpdmVcblxuICBAQ29udGVudENoaWxkKEVkZ2VUZW1wbGF0ZURpcmVjdGl2ZSlcbiAgcHJvdGVjdGVkIGVkZ2VUZW1wbGF0ZURpcmVjdGl2ZT86IEVkZ2VUZW1wbGF0ZURpcmVjdGl2ZVxuXG4gIEBDb250ZW50Q2hpbGQoRWRnZUxhYmVsSHRtbFRlbXBsYXRlRGlyZWN0aXZlKVxuICBwcm90ZWN0ZWQgZWRnZUxhYmVsSHRtbERpcmVjdGl2ZT86IEVkZ2VMYWJlbEh0bWxUZW1wbGF0ZURpcmVjdGl2ZVxuXG4gIEBDb250ZW50Q2hpbGQoQ29ubmVjdGlvblRlbXBsYXRlRGlyZWN0aXZlKVxuICBwcm90ZWN0ZWQgY29ubmVjdGlvblRlbXBsYXRlRGlyZWN0aXZlPzogQ29ubmVjdGlvblRlbXBsYXRlRGlyZWN0aXZlXG4gIC8vICNlbmRyZWdpb25cblxuICAvLyAjcmVnaW9uIERJUkVDVElWRVNcbiAgQFZpZXdDaGlsZChNYXBDb250ZXh0RGlyZWN0aXZlKVxuICBwcm90ZWN0ZWQgbWFwQ29udGV4dCE6IE1hcENvbnRleHREaXJlY3RpdmVcblxuICBAVmlld0NoaWxkKFNwYWNlUG9pbnRDb250ZXh0RGlyZWN0aXZlKVxuICBwcm90ZWN0ZWQgc3BhY2VQb2ludENvbnRleHQhOiBTcGFjZVBvaW50Q29udGV4dERpcmVjdGl2ZVxuICAvLyAjZW5kcmVnaW9uXG5cbiAgLy8gI3JlZ2lvbiBTSUdOQUxfQVBJXG4gIC8qKlxuICAgKiBTaWduYWwgZm9yIHJlYWRpbmcgdmlld3BvcnQgY2hhbmdlXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgdmlld3BvcnQgPSB0aGlzLnZpZXdwb3J0U2VydmljZS5yZWFkYWJsZVZpZXdwb3J0LmFzUmVhZG9ubHkoKVxuXG4gIC8qKlxuICAgKiBTaWduYWwgZm9yIHJlYWRpbmcgbm9kZXMgY2hhbmdlXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgbm9kZXNDaGFuZ2UgPVxuICAgIHRvU2lnbmFsKHRoaXMubm9kZXNDaGFuZ2VTZXJ2aWNlLmNoYW5nZXMkLCB7IGluaXRpYWxWYWx1ZTogW10gYXMgTm9kZUNoYW5nZVtdIH0pXG5cbiAgLyoqXG4gICAqIFNpZ25hbCB0byByZWFkaW5nIGVkZ2VzIGNoYW5nZVxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGVkZ2VzQ2hhbmdlID1cbiAgICB0b1NpZ25hbCh0aGlzLmVkZ2VzQ2hhbmdlU2VydmljZS5jaGFuZ2VzJCwgeyBpbml0aWFsVmFsdWU6IFtdIGFzIEVkZ2VDaGFuZ2VbXSB9KVxuICAvLyAjZW5kcmVnaW9uXG5cbiAgLy8gI3JlZ2lvbiBSWF9BUElcbiAgLyoqXG4gICAqIE9ic2VydmFibGUgd2l0aCB2aWV3cG9ydCBjaGFuZ2VcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSB2aWV3cG9ydENoYW5nZSQgPSB0b09ic2VydmFibGUodGhpcy52aWV3cG9ydFNlcnZpY2UucmVhZGFibGVWaWV3cG9ydClcbiAgICAucGlwZShza2lwKDEpKSAvLyBza2lwIGRlZmF1bHQgdmFsdWUgdGhhdCBzZXQgYnkgc2lnbmFsXG5cbiAgLyoqXG4gICAqIE9ic2VydmFibGUgd2l0aCBub2RlcyBjaGFuZ2VcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBub2Rlc0NoYW5nZSQgPSB0aGlzLm5vZGVzQ2hhbmdlU2VydmljZS5jaGFuZ2VzJFxuXG4gIC8qKlxuICAgKiBPYnNlcnZhYmxlIHdpdGggZWRnZXMgY2hhbmdlXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgZWRnZXNDaGFuZ2UkID0gdGhpcy5lZGdlc0NoYW5nZVNlcnZpY2UuY2hhbmdlcyRcbiAgLy8gI2VuZHJlZ2lvblxuXG4gIHByb3RlY3RlZCBtYXJrZXJzID0gdGhpcy5mbG93RW50aXRpZXNTZXJ2aWNlLm1hcmtlcnNcblxuICBwcm90ZWN0ZWQgbWluaW1hcCA9IHRoaXMuZmxvd0VudGl0aWVzU2VydmljZS5taW5pbWFwXG5cbiAgcHVibGljIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMuc2V0SW5pdGlhbE5vZGVzT3JkZXIoKVxuICB9XG5cbiAgLy8gI3JlZ2lvbiBNRVRIT0RTX0FQSVxuICAvKipcbiAgICogQ2hhbmdlIHZpZXdwb3J0IHRvIHNwZWNpZmllZCBzdGF0ZVxuICAgKlxuICAgKiBAcGFyYW0gdmlld3BvcnQgdmlld3BvcnQgc3RhdGVcbiAgICovXG4gIHB1YmxpYyB2aWV3cG9ydFRvKHZpZXdwb3J0OiBWaWV3cG9ydFN0YXRlKTogdm9pZCB7XG4gICAgdGhpcy52aWV3cG9ydFNlcnZpY2Uud3JpdGFibGVWaWV3cG9ydC5zZXQoeyBjaGFuZ2VUeXBlOiAnYWJzb2x1dGUnLCBzdGF0ZTogdmlld3BvcnQsIGR1cmF0aW9uOiAwIH0pXG4gIH1cblxuICAvKipcbiAgICogQ2hhbmdlIHpvb21cbiAgICpcbiAgICogQHBhcmFtIHpvb20gem9vbSB2YWx1ZVxuICAgKi9cbiAgcHVibGljIHpvb21Ubyh6b29tOiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLnZpZXdwb3J0U2VydmljZS53cml0YWJsZVZpZXdwb3J0LnNldCh7IGNoYW5nZVR5cGU6ICdhYnNvbHV0ZScsIHN0YXRlOiB7IHpvb20gfSwgZHVyYXRpb246IDAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBNb3ZlIHRvIHNwZWNpZmllZCBjb29yZGluYXRlXG4gICAqXG4gICAqIEBwYXJhbSBwb2ludCBwb2ludCB3aGVyZSB0byBtb3ZlXG4gICAqL1xuICBwdWJsaWMgcGFuVG8ocG9pbnQ6IFBvaW50KTogdm9pZCB7XG4gICAgdGhpcy52aWV3cG9ydFNlcnZpY2Uud3JpdGFibGVWaWV3cG9ydC5zZXQoeyBjaGFuZ2VUeXBlOiAnYWJzb2x1dGUnLCBzdGF0ZTogcG9pbnQsIGR1cmF0aW9uOiAwIH0pXG4gIH1cblxuICBwdWJsaWMgZml0VmlldyhvcHRpb25zPzogRml0Vmlld09wdGlvbnMpIHtcbiAgICB0aGlzLnZpZXdwb3J0U2VydmljZS5maXRWaWV3KG9wdGlvbnMpXG4gIH1cblxuICAvKipcbiAgICogR2V0IG5vZGUgYnkgaWRcbiAgICpcbiAgICogQHBhcmFtIGlkIG5vZGUgaWRcbiAgICovXG4gIHB1YmxpYyBnZXROb2RlPFQgPSB1bmtub3duPihpZDogc3RyaW5nKTogTm9kZTxUPiB8IER5bmFtaWNOb2RlPFQ+IHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5mbG93RW50aXRpZXNTZXJ2aWNlLmdldE5vZGU8VD4oaWQpPy5ub2RlXG4gIH1cblxuICAvKipcbiAgICogU3luYyBtZXRob2QgdG8gZ2V0IGRldGFjaGVkIGVkZ2VzXG4gICAqL1xuICBwdWJsaWMgZ2V0RGV0YWNoZWRFZGdlcygpOiBFZGdlW10ge1xuICAgIHJldHVybiB0aGlzLmZsb3dFbnRpdGllc1NlcnZpY2UuZ2V0RGV0YWNoZWRFZGdlcygpLm1hcChlID0+IGUuZWRnZSlcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0IHBvaW50IHJlY2VpdmVkIGZyb20gZG9jdW1lbnQgdG8gcG9pbnQgb24gdGhlIGZsb3dcbiAgICovXG4gIHB1YmxpYyBkb2N1bWVudFBvaW50VG9GbG93UG9pbnQocG9pbnQ6IFBvaW50KTogUG9pbnQge1xuICAgIHJldHVybiB0aGlzLnNwYWNlUG9pbnRDb250ZXh0LmRvY3VtZW50UG9pbnRUb0Zsb3dQb2ludChwb2ludClcbiAgfVxuICAvLyAjZW5kcmVnaW9uXG5cbiAgcHJvdGVjdGVkIHRyYWNrTm9kZXMoaWR4OiBudW1iZXIsIHsgbm9kZSB9OiBOb2RlTW9kZWwpIHtcbiAgICByZXR1cm4gbm9kZVxuICB9XG5cbiAgcHJvdGVjdGVkIHRyYWNrRWRnZXMoaWR4OiBudW1iZXIsIHsgZWRnZSB9OiBFZGdlTW9kZWwpIHtcbiAgICByZXR1cm4gZWRnZVxuICB9XG5cbiAgcHJpdmF0ZSBzZXRJbml0aWFsTm9kZXNPcmRlcigpIHtcbiAgICBpZiAodGhpcy5vcHRpbWl6YXRpb24uY29tcHV0ZUxheWVyc09uSW5pdCkge1xuXG4gICAgICB0aGlzLm5vZGVNb2RlbHMoKS5mb3JFYWNoKG1vZGVsID0+IHtcbiAgICAgICAgc3dpdGNoIChtb2RlbC5ub2RlLnR5cGUpIHtcbiAgICAgICAgICBjYXNlICdkZWZhdWx0LWdyb3VwJzpcbiAgICAgICAgICBjYXNlICd0ZW1wbGF0ZS1ncm91cCc6IHtcbiAgICAgICAgICAgIHRoaXMubm9kZVJlbmRlcmluZ1NlcnZpY2UucHVsbE5vZGUobW9kZWwpXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH1cbiAgfVxufVxuXG4iLCI8c3ZnOnN2Z1xuICByb290U3ZnUmVmXG4gIHJvb3RTdmdDb250ZXh0XG4gIHJvb3RQb2ludGVyXG4gIGZsb3dTaXplQ29udHJvbGxlclxuICBjbGFzcz1cInJvb3Qtc3ZnXCJcbiAgI2Zsb3dcbj5cbiAgPGRlZnMgW21hcmtlcnNdPVwibWFya2VycygpXCIgZmxvd0RlZnMgLz5cblxuICA8ZyBiYWNrZ3JvdW5kIC8+XG5cbiAgPHN2ZzpnXG4gICAgbWFwQ29udGV4dFxuICAgIHNwYWNlUG9pbnRDb250ZXh0XG4gID5cbiAgICA8IS0tIENvbm5lY3Rpb24gLS0+XG4gICAgPHN2ZzpnXG4gICAgICBjb25uZWN0aW9uXG4gICAgICBbbW9kZWxdPVwiY29ubmVjdGlvblwiXG4gICAgICBbdGVtcGxhdGVdPVwiY29ubmVjdGlvblRlbXBsYXRlRGlyZWN0aXZlPy50ZW1wbGF0ZVJlZlwiXG4gICAgLz5cblxuICAgIDwhLS0gRWRnZXMgIC0tPlxuICAgIDxzdmc6Z1xuICAgICAgKm5nRm9yPVwibGV0IG1vZGVsIG9mIGVkZ2VNb2RlbHMoKTsgdHJhY2tCeTogdHJhY2tFZGdlc1wiXG4gICAgICBlZGdlXG4gICAgICBbbW9kZWxdPVwibW9kZWxcIlxuICAgICAgW2VkZ2VUZW1wbGF0ZV09XCJlZGdlVGVtcGxhdGVEaXJlY3RpdmU/LnRlbXBsYXRlUmVmXCJcbiAgICAgIFtlZGdlTGFiZWxIdG1sVGVtcGxhdGVdPVwiZWRnZUxhYmVsSHRtbERpcmVjdGl2ZT8udGVtcGxhdGVSZWZcIlxuICAgIC8+XG5cbiAgICA8IS0tIE5vZGVzIC0tPlxuICAgIDxzdmc6Z1xuICAgICAgKm5nRm9yPVwibGV0IG1vZGVsIG9mIG5vZGVNb2RlbHMoKTsgdHJhY2tCeTogdHJhY2tOb2Rlc1wiXG4gICAgICBub2RlXG4gICAgICBbbm9kZU1vZGVsXT1cIm1vZGVsXCJcbiAgICAgIFtub2RlVGVtcGxhdGVdPVwibm9kZVRlbXBsYXRlRGlyZWN0aXZlPy50ZW1wbGF0ZVJlZlwiXG4gICAgICBbZ3JvdXBOb2RlVGVtcGxhdGVdPVwiZ3JvdXBOb2RlVGVtcGxhdGVEaXJlY3RpdmU/LnRlbXBsYXRlUmVmXCJcbiAgICAgIFthdHRyLnRyYW5zZm9ybV09XCJtb2RlbC5wb2ludFRyYW5zZm9ybSgpXCJcbiAgICAvPlxuICA8L3N2ZzpnPlxuXG4gIDwhLS0gTWluaW1hcCAtLT5cbiAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIm1pbmltYXAoKSBhcyBtaW5pbWFwXCI+XG4gICAgPG5nLWNvbnRhaW5lciBbbmdUZW1wbGF0ZU91dGxldF09XCJtaW5pbWFwLnRlbXBsYXRlKClcIiAvPlxuICA8L25nLWNvbnRhaW5lcj5cbjwvc3ZnOnN2Zz5cbiJdfQ==