ngx-vflow 1.13.0 → 1.13.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -85,7 +85,7 @@ export class NodeComponent {
85
85
  }
86
86
  }
87
87
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: NodeComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
88
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: NodeComponent, isStandalone: true, selector: "g[node]", inputs: { model: { classPropertyName: "model", publicName: "model", isSignal: true, isRequired: true, transformFunction: null }, nodeTemplate: { classPropertyName: "nodeTemplate", publicName: "nodeTemplate", isSignal: true, isRequired: false, transformFunction: null }, nodeSvgTemplate: { classPropertyName: "nodeSvgTemplate", publicName: "nodeSvgTemplate", isSignal: true, isRequired: false, transformFunction: null }, groupNodeTemplate: { classPropertyName: "groupNodeTemplate", publicName: "groupNodeTemplate", isSignal: true, isRequired: false, transformFunction: null } }, host: { classAttribute: "vflow-node" }, providers: [HandleService, NodeAccessorService], ngImport: i0, template: "<!-- Default node -->\n@if (model().rawNode.type === 'default') {\n <svg:foreignObject\n class=\"selectable\"\n [attr.width]=\"model().foWidth()\"\n [attr.height]=\"model().foHeight()\"\n (click)=\"pullNode(); selectNode()\">\n <default-node\n nodeHandlesController\n [selected]=\"model().selected()\"\n [style.width]=\"model().styleWidth()\"\n [style.height]=\"model().styleHeight()\"\n [style.max-width]=\"model().styleWidth()\"\n [style.max-height]=\"model().styleHeight()\">\n <div [outerHTML]=\"model().text()\"></div>\n\n <handle type=\"source\" position=\"right\" />\n <handle type=\"target\" position=\"left\" />\n </default-node>\n </svg:foreignObject>\n}\n\n<!-- HTML Template node -->\n@if (model().rawNode.type === 'html-template' && nodeTemplate()) {\n <svg:foreignObject\n class=\"selectable\"\n [attr.width]=\"model().foWidth()\"\n [attr.height]=\"model().foHeight()\"\n (click)=\"pullNode()\">\n <div\n nodeHandlesController\n nodeResizeController\n class=\"wrapper\"\n [style.width]=\"model().styleWidth()\"\n [style.height]=\"model().styleHeight()\">\n <ng-container\n [ngTemplateOutlet]=\"nodeTemplate() ?? null\"\n [ngTemplateOutletContext]=\"model().context\"\n [ngTemplateOutletInjector]=\"injector\" />\n </div>\n </svg:foreignObject>\n}\n\n<!-- SVG Template node -->\n@if (model().rawNode.type === 'svg-template' && nodeSvgTemplate()) {\n <svg:g class=\"selectable\" nodeHandlesController (click)=\"pullNode()\">\n <ng-container\n [ngTemplateOutlet]=\"nodeSvgTemplate() ?? null\"\n [ngTemplateOutletContext]=\"model().context\"\n [ngTemplateOutletInjector]=\"injector\" />\n </svg:g>\n}\n\n<!-- Component node -->\n@if (model().isComponentType) {\n <svg:foreignObject\n class=\"selectable\"\n [attr.width]=\"model().foWidth()\"\n [attr.height]=\"model().foHeight()\"\n (click)=\"pullNode()\">\n <div\n nodeHandlesController\n nodeResizeController\n class=\"wrapper\"\n [style.width]=\"model().styleWidth()\"\n [style.height]=\"model().styleHeight()\">\n <ng-container\n [ngComponentOutlet]=\"$any(model().rawNode.type)\"\n [ngComponentOutletInputs]=\"model().componentTypeInputs\"\n [ngComponentOutletInjector]=\"injector\" />\n </div>\n </svg:foreignObject>\n}\n\n<!-- Default group node -->\n@if (model().rawNode.type === 'default-group') {\n <svg:rect\n class=\"default-group-node\"\n rx=\"5\"\n ry=\"5\"\n [resizable]=\"model().resizable()\"\n [gap]=\"3\"\n [resizerColor]=\"model().color()\"\n [class.default-group-node_selected]=\"model().selected()\"\n [attr.width]=\"model().size().width\"\n [attr.height]=\"model().size().height\"\n [style.stroke]=\"model().color()\"\n [style.fill]=\"model().color()\"\n (click)=\"pullNode(); selectNode()\" />\n}\n\n<!-- Template group node -->\n@if (model().rawNode.type === 'template-group' && groupNodeTemplate()) {\n <svg:g class=\"selectable\" nodeHandlesController (click)=\"pullNode()\">\n <ng-container\n [ngTemplateOutlet]=\"groupNodeTemplate() ?? null\"\n [ngTemplateOutletContext]=\"model().context\"\n [ngTemplateOutletInjector]=\"injector\" />\n </svg:g>\n}\n\n<!-- Resizer -->\n@if (model().resizerTemplate(); as template) {\n @if (model().resizable()) {\n <ng-template [ngTemplateOutlet]=\"template\" />\n }\n}\n\n<!-- Handles -->\n@for (handle of model().handles(); track handle) {\n @if (handle.template === undefined) {\n <svg:circle\n class=\"default-handle\"\n r=\"5\"\n [attr.cx]=\"handle.hostOffset().x\"\n [attr.cy]=\"handle.hostOffset().y\"\n [attr.stroke-width]=\"handle.strokeWidth\"\n (pointerStart)=\"startConnection($event, handle)\"\n (pointerEnd)=\"endConnection()\" />\n }\n\n @if (handle.template === null) {\n <svg:g\n [handleSizeController]=\"handle\"\n (pointerStart)=\"startConnection($event, handle)\"\n (pointerEnd)=\"endConnection()\" />\n }\n\n @if (handle.template) {\n <svg:g\n [handleSizeController]=\"handle\"\n (pointerStart)=\"startConnection($event, handle)\"\n (pointerEnd)=\"endConnection()\">\n <ng-container *ngTemplateOutlet=\"handle.template; context: handle.templateContext\" />\n </svg:g>\n }\n\n @if (showMagnet()) {\n <svg:circle\n class=\"magnet\"\n [attr.r]=\"model().magnetRadius\"\n [attr.cx]=\"handle.hostOffset().x\"\n [attr.cy]=\"handle.hostOffset().y\"\n (pointerEnd)=\"endConnection(); resetValidateConnection(handle)\"\n (pointerOver)=\"validateConnection(handle)\"\n (pointerOut)=\"resetValidateConnection(handle)\" />\n }\n}\n\n<!-- Toolbar -->\n@for (toolbar of toolbars(); track toolbar) {\n <svg:foreignObject\n [attr.width]=\"toolbar.size().width\"\n [attr.height]=\"toolbar.size().height\"\n [attr.transform]=\"toolbar.transform()\">\n <ng-container [ngTemplateOutlet]=\"toolbar.template()\" />\n </svg:foreignObject>\n}\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: PointerDirective, selector: "[pointerStart], [pointerEnd], [pointerOver], [pointerOut]", outputs: ["pointerOver", "pointerOut", "pointerStart", "pointerEnd"] }, { kind: "component", type: DefaultNodeComponent, selector: "default-node", inputs: ["selected"] }, { kind: "component", type: HandleComponent, selector: "handle", inputs: ["position", "type", "id", "template", "offsetX", "offsetY"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: NgComponentOutlet, selector: "[ngComponentOutlet]", inputs: ["ngComponentOutlet", "ngComponentOutletInputs", "ngComponentOutletInjector", "ngComponentOutletContent", "ngComponentOutletNgModule", "ngComponentOutletNgModuleFactory"] }, { kind: "component", type: ResizableComponent, selector: "[resizable]", inputs: ["resizable", "resizerColor", "gap"] }, { kind: "directive", type: HandleSizeControllerDirective, selector: "[handleSizeController]", inputs: ["handleSizeController"] }, { kind: "directive", type: NodeHandlesControllerDirective, selector: "[nodeHandlesController]" }, { kind: "directive", type: NodeResizeControllerDirective, selector: "[nodeResizeController]" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
88
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: NodeComponent, isStandalone: true, selector: "g[node]", inputs: { model: { classPropertyName: "model", publicName: "model", isSignal: true, isRequired: true, transformFunction: null }, nodeTemplate: { classPropertyName: "nodeTemplate", publicName: "nodeTemplate", isSignal: true, isRequired: false, transformFunction: null }, nodeSvgTemplate: { classPropertyName: "nodeSvgTemplate", publicName: "nodeSvgTemplate", isSignal: true, isRequired: false, transformFunction: null }, groupNodeTemplate: { classPropertyName: "groupNodeTemplate", publicName: "groupNodeTemplate", isSignal: true, isRequired: false, transformFunction: null } }, host: { classAttribute: "vflow-node" }, providers: [HandleService, NodeAccessorService], ngImport: i0, template: "<!-- Default node -->\n@if (model().rawNode.type === 'default') {\n <svg:foreignObject\n class=\"selectable\"\n [attr.width]=\"model().foWidth()\"\n [attr.height]=\"model().foHeight()\"\n (click)=\"pullNode(); selectNode()\">\n <default-node\n nodeHandlesController\n [selected]=\"model().selected()\"\n [style.width]=\"model().styleWidth()\"\n [style.height]=\"model().styleHeight()\"\n [style.max-width]=\"model().styleWidth()\"\n [style.max-height]=\"model().styleHeight()\">\n <div [outerHTML]=\"model().text()\"></div>\n\n <handle type=\"source\" position=\"right\" />\n <handle type=\"target\" position=\"left\" />\n </default-node>\n </svg:foreignObject>\n}\n\n<!-- HTML Template node -->\n@if (model().rawNode.type === 'html-template' && nodeTemplate()) {\n <svg:foreignObject\n class=\"selectable\"\n [attr.width]=\"model().foWidth()\"\n [attr.height]=\"model().foHeight()\"\n (click)=\"pullNode()\">\n <div nodeHandlesController nodeResizeController class=\"wrapper\" [style.width]=\"model().styleWidth()\">\n <ng-container\n [ngTemplateOutlet]=\"nodeTemplate() ?? null\"\n [ngTemplateOutletContext]=\"model().context\"\n [ngTemplateOutletInjector]=\"injector\" />\n </div>\n </svg:foreignObject>\n}\n\n<!-- SVG Template node -->\n@if (model().rawNode.type === 'svg-template' && nodeSvgTemplate()) {\n <svg:g class=\"selectable\" nodeHandlesController (click)=\"pullNode()\">\n <ng-container\n [ngTemplateOutlet]=\"nodeSvgTemplate() ?? null\"\n [ngTemplateOutletContext]=\"model().context\"\n [ngTemplateOutletInjector]=\"injector\" />\n </svg:g>\n}\n\n<!-- Component node -->\n@if (model().isComponentType) {\n <svg:foreignObject\n class=\"selectable\"\n [attr.width]=\"model().foWidth()\"\n [attr.height]=\"model().foHeight()\"\n (click)=\"pullNode()\">\n <div nodeHandlesController nodeResizeController class=\"wrapper\" [style.width]=\"model().styleWidth()\">\n <ng-container\n [ngComponentOutlet]=\"$any(model().rawNode.type)\"\n [ngComponentOutletInputs]=\"model().componentTypeInputs\"\n [ngComponentOutletInjector]=\"injector\" />\n </div>\n </svg:foreignObject>\n}\n\n<!-- Default group node -->\n@if (model().rawNode.type === 'default-group') {\n <svg:rect\n class=\"default-group-node\"\n rx=\"5\"\n ry=\"5\"\n [resizable]=\"model().resizable()\"\n [gap]=\"3\"\n [resizerColor]=\"model().color()\"\n [class.default-group-node_selected]=\"model().selected()\"\n [attr.width]=\"model().size().width\"\n [attr.height]=\"model().size().height\"\n [style.stroke]=\"model().color()\"\n [style.fill]=\"model().color()\"\n (click)=\"pullNode(); selectNode()\" />\n}\n\n<!-- Template group node -->\n@if (model().rawNode.type === 'template-group' && groupNodeTemplate()) {\n <svg:g class=\"selectable\" nodeHandlesController (click)=\"pullNode()\">\n <ng-container\n [ngTemplateOutlet]=\"groupNodeTemplate() ?? null\"\n [ngTemplateOutletContext]=\"model().context\"\n [ngTemplateOutletInjector]=\"injector\" />\n </svg:g>\n}\n\n<!-- Resizer -->\n@if (model().resizerTemplate(); as template) {\n @if (model().resizable()) {\n <ng-template [ngTemplateOutlet]=\"template\" />\n }\n}\n\n<!-- Handles -->\n@for (handle of model().handles(); track handle) {\n @if (handle.template === undefined) {\n <svg:circle\n class=\"default-handle\"\n r=\"5\"\n [attr.cx]=\"handle.hostOffset().x\"\n [attr.cy]=\"handle.hostOffset().y\"\n [attr.stroke-width]=\"handle.strokeWidth\"\n (pointerStart)=\"startConnection($event, handle)\"\n (pointerEnd)=\"endConnection()\" />\n }\n\n @if (handle.template === null) {\n <svg:g\n [handleSizeController]=\"handle\"\n (pointerStart)=\"startConnection($event, handle)\"\n (pointerEnd)=\"endConnection()\" />\n }\n\n @if (handle.template) {\n <svg:g\n [handleSizeController]=\"handle\"\n (pointerStart)=\"startConnection($event, handle)\"\n (pointerEnd)=\"endConnection()\">\n <ng-container *ngTemplateOutlet=\"handle.template; context: handle.templateContext\" />\n </svg:g>\n }\n\n @if (showMagnet()) {\n <svg:circle\n class=\"magnet\"\n [attr.r]=\"model().magnetRadius\"\n [attr.cx]=\"handle.hostOffset().x\"\n [attr.cy]=\"handle.hostOffset().y\"\n (pointerEnd)=\"endConnection(); resetValidateConnection(handle)\"\n (pointerOver)=\"validateConnection(handle)\"\n (pointerOut)=\"resetValidateConnection(handle)\" />\n }\n}\n\n<!-- Toolbar -->\n@for (toolbar of toolbars(); track toolbar) {\n <svg:foreignObject\n [attr.width]=\"toolbar.size().width\"\n [attr.height]=\"toolbar.size().height\"\n [attr.transform]=\"toolbar.transform()\">\n <ng-container [ngTemplateOutlet]=\"toolbar.template()\" />\n </svg:foreignObject>\n}\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: PointerDirective, selector: "[pointerStart], [pointerEnd], [pointerOver], [pointerOut]", outputs: ["pointerOver", "pointerOut", "pointerStart", "pointerEnd"] }, { kind: "component", type: DefaultNodeComponent, selector: "default-node", inputs: ["selected"] }, { kind: "component", type: HandleComponent, selector: "handle", inputs: ["position", "type", "id", "template", "offsetX", "offsetY"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: NgComponentOutlet, selector: "[ngComponentOutlet]", inputs: ["ngComponentOutlet", "ngComponentOutletInputs", "ngComponentOutletInjector", "ngComponentOutletContent", "ngComponentOutletNgModule", "ngComponentOutletNgModuleFactory"] }, { kind: "component", type: ResizableComponent, selector: "[resizable]", inputs: ["resizable", "resizerColor", "gap"] }, { kind: "directive", type: HandleSizeControllerDirective, selector: "[handleSizeController]", inputs: ["handleSizeController"] }, { kind: "directive", type: NodeHandlesControllerDirective, selector: "[nodeHandlesController]" }, { kind: "directive", type: NodeResizeControllerDirective, selector: "[nodeResizeController]" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
89
89
  }
90
90
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: NodeComponent, decorators: [{
91
91
  type: Component,
@@ -101,6 +101,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
101
101
  HandleSizeControllerDirective,
102
102
  NodeHandlesControllerDirective,
103
103
  NodeResizeControllerDirective,
104
- ], template: "<!-- Default node -->\n@if (model().rawNode.type === 'default') {\n <svg:foreignObject\n class=\"selectable\"\n [attr.width]=\"model().foWidth()\"\n [attr.height]=\"model().foHeight()\"\n (click)=\"pullNode(); selectNode()\">\n <default-node\n nodeHandlesController\n [selected]=\"model().selected()\"\n [style.width]=\"model().styleWidth()\"\n [style.height]=\"model().styleHeight()\"\n [style.max-width]=\"model().styleWidth()\"\n [style.max-height]=\"model().styleHeight()\">\n <div [outerHTML]=\"model().text()\"></div>\n\n <handle type=\"source\" position=\"right\" />\n <handle type=\"target\" position=\"left\" />\n </default-node>\n </svg:foreignObject>\n}\n\n<!-- HTML Template node -->\n@if (model().rawNode.type === 'html-template' && nodeTemplate()) {\n <svg:foreignObject\n class=\"selectable\"\n [attr.width]=\"model().foWidth()\"\n [attr.height]=\"model().foHeight()\"\n (click)=\"pullNode()\">\n <div\n nodeHandlesController\n nodeResizeController\n class=\"wrapper\"\n [style.width]=\"model().styleWidth()\"\n [style.height]=\"model().styleHeight()\">\n <ng-container\n [ngTemplateOutlet]=\"nodeTemplate() ?? null\"\n [ngTemplateOutletContext]=\"model().context\"\n [ngTemplateOutletInjector]=\"injector\" />\n </div>\n </svg:foreignObject>\n}\n\n<!-- SVG Template node -->\n@if (model().rawNode.type === 'svg-template' && nodeSvgTemplate()) {\n <svg:g class=\"selectable\" nodeHandlesController (click)=\"pullNode()\">\n <ng-container\n [ngTemplateOutlet]=\"nodeSvgTemplate() ?? null\"\n [ngTemplateOutletContext]=\"model().context\"\n [ngTemplateOutletInjector]=\"injector\" />\n </svg:g>\n}\n\n<!-- Component node -->\n@if (model().isComponentType) {\n <svg:foreignObject\n class=\"selectable\"\n [attr.width]=\"model().foWidth()\"\n [attr.height]=\"model().foHeight()\"\n (click)=\"pullNode()\">\n <div\n nodeHandlesController\n nodeResizeController\n class=\"wrapper\"\n [style.width]=\"model().styleWidth()\"\n [style.height]=\"model().styleHeight()\">\n <ng-container\n [ngComponentOutlet]=\"$any(model().rawNode.type)\"\n [ngComponentOutletInputs]=\"model().componentTypeInputs\"\n [ngComponentOutletInjector]=\"injector\" />\n </div>\n </svg:foreignObject>\n}\n\n<!-- Default group node -->\n@if (model().rawNode.type === 'default-group') {\n <svg:rect\n class=\"default-group-node\"\n rx=\"5\"\n ry=\"5\"\n [resizable]=\"model().resizable()\"\n [gap]=\"3\"\n [resizerColor]=\"model().color()\"\n [class.default-group-node_selected]=\"model().selected()\"\n [attr.width]=\"model().size().width\"\n [attr.height]=\"model().size().height\"\n [style.stroke]=\"model().color()\"\n [style.fill]=\"model().color()\"\n (click)=\"pullNode(); selectNode()\" />\n}\n\n<!-- Template group node -->\n@if (model().rawNode.type === 'template-group' && groupNodeTemplate()) {\n <svg:g class=\"selectable\" nodeHandlesController (click)=\"pullNode()\">\n <ng-container\n [ngTemplateOutlet]=\"groupNodeTemplate() ?? null\"\n [ngTemplateOutletContext]=\"model().context\"\n [ngTemplateOutletInjector]=\"injector\" />\n </svg:g>\n}\n\n<!-- Resizer -->\n@if (model().resizerTemplate(); as template) {\n @if (model().resizable()) {\n <ng-template [ngTemplateOutlet]=\"template\" />\n }\n}\n\n<!-- Handles -->\n@for (handle of model().handles(); track handle) {\n @if (handle.template === undefined) {\n <svg:circle\n class=\"default-handle\"\n r=\"5\"\n [attr.cx]=\"handle.hostOffset().x\"\n [attr.cy]=\"handle.hostOffset().y\"\n [attr.stroke-width]=\"handle.strokeWidth\"\n (pointerStart)=\"startConnection($event, handle)\"\n (pointerEnd)=\"endConnection()\" />\n }\n\n @if (handle.template === null) {\n <svg:g\n [handleSizeController]=\"handle\"\n (pointerStart)=\"startConnection($event, handle)\"\n (pointerEnd)=\"endConnection()\" />\n }\n\n @if (handle.template) {\n <svg:g\n [handleSizeController]=\"handle\"\n (pointerStart)=\"startConnection($event, handle)\"\n (pointerEnd)=\"endConnection()\">\n <ng-container *ngTemplateOutlet=\"handle.template; context: handle.templateContext\" />\n </svg:g>\n }\n\n @if (showMagnet()) {\n <svg:circle\n class=\"magnet\"\n [attr.r]=\"model().magnetRadius\"\n [attr.cx]=\"handle.hostOffset().x\"\n [attr.cy]=\"handle.hostOffset().y\"\n (pointerEnd)=\"endConnection(); resetValidateConnection(handle)\"\n (pointerOver)=\"validateConnection(handle)\"\n (pointerOut)=\"resetValidateConnection(handle)\" />\n }\n}\n\n<!-- Toolbar -->\n@for (toolbar of toolbars(); track toolbar) {\n <svg:foreignObject\n [attr.width]=\"toolbar.size().width\"\n [attr.height]=\"toolbar.size().height\"\n [attr.transform]=\"toolbar.transform()\">\n <ng-container [ngTemplateOutlet]=\"toolbar.template()\" />\n </svg:foreignObject>\n}\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"] }]
104
+ ], template: "<!-- Default node -->\n@if (model().rawNode.type === 'default') {\n <svg:foreignObject\n class=\"selectable\"\n [attr.width]=\"model().foWidth()\"\n [attr.height]=\"model().foHeight()\"\n (click)=\"pullNode(); selectNode()\">\n <default-node\n nodeHandlesController\n [selected]=\"model().selected()\"\n [style.width]=\"model().styleWidth()\"\n [style.height]=\"model().styleHeight()\"\n [style.max-width]=\"model().styleWidth()\"\n [style.max-height]=\"model().styleHeight()\">\n <div [outerHTML]=\"model().text()\"></div>\n\n <handle type=\"source\" position=\"right\" />\n <handle type=\"target\" position=\"left\" />\n </default-node>\n </svg:foreignObject>\n}\n\n<!-- HTML Template node -->\n@if (model().rawNode.type === 'html-template' && nodeTemplate()) {\n <svg:foreignObject\n class=\"selectable\"\n [attr.width]=\"model().foWidth()\"\n [attr.height]=\"model().foHeight()\"\n (click)=\"pullNode()\">\n <div nodeHandlesController nodeResizeController class=\"wrapper\" [style.width]=\"model().styleWidth()\">\n <ng-container\n [ngTemplateOutlet]=\"nodeTemplate() ?? null\"\n [ngTemplateOutletContext]=\"model().context\"\n [ngTemplateOutletInjector]=\"injector\" />\n </div>\n </svg:foreignObject>\n}\n\n<!-- SVG Template node -->\n@if (model().rawNode.type === 'svg-template' && nodeSvgTemplate()) {\n <svg:g class=\"selectable\" nodeHandlesController (click)=\"pullNode()\">\n <ng-container\n [ngTemplateOutlet]=\"nodeSvgTemplate() ?? null\"\n [ngTemplateOutletContext]=\"model().context\"\n [ngTemplateOutletInjector]=\"injector\" />\n </svg:g>\n}\n\n<!-- Component node -->\n@if (model().isComponentType) {\n <svg:foreignObject\n class=\"selectable\"\n [attr.width]=\"model().foWidth()\"\n [attr.height]=\"model().foHeight()\"\n (click)=\"pullNode()\">\n <div nodeHandlesController nodeResizeController class=\"wrapper\" [style.width]=\"model().styleWidth()\">\n <ng-container\n [ngComponentOutlet]=\"$any(model().rawNode.type)\"\n [ngComponentOutletInputs]=\"model().componentTypeInputs\"\n [ngComponentOutletInjector]=\"injector\" />\n </div>\n </svg:foreignObject>\n}\n\n<!-- Default group node -->\n@if (model().rawNode.type === 'default-group') {\n <svg:rect\n class=\"default-group-node\"\n rx=\"5\"\n ry=\"5\"\n [resizable]=\"model().resizable()\"\n [gap]=\"3\"\n [resizerColor]=\"model().color()\"\n [class.default-group-node_selected]=\"model().selected()\"\n [attr.width]=\"model().size().width\"\n [attr.height]=\"model().size().height\"\n [style.stroke]=\"model().color()\"\n [style.fill]=\"model().color()\"\n (click)=\"pullNode(); selectNode()\" />\n}\n\n<!-- Template group node -->\n@if (model().rawNode.type === 'template-group' && groupNodeTemplate()) {\n <svg:g class=\"selectable\" nodeHandlesController (click)=\"pullNode()\">\n <ng-container\n [ngTemplateOutlet]=\"groupNodeTemplate() ?? null\"\n [ngTemplateOutletContext]=\"model().context\"\n [ngTemplateOutletInjector]=\"injector\" />\n </svg:g>\n}\n\n<!-- Resizer -->\n@if (model().resizerTemplate(); as template) {\n @if (model().resizable()) {\n <ng-template [ngTemplateOutlet]=\"template\" />\n }\n}\n\n<!-- Handles -->\n@for (handle of model().handles(); track handle) {\n @if (handle.template === undefined) {\n <svg:circle\n class=\"default-handle\"\n r=\"5\"\n [attr.cx]=\"handle.hostOffset().x\"\n [attr.cy]=\"handle.hostOffset().y\"\n [attr.stroke-width]=\"handle.strokeWidth\"\n (pointerStart)=\"startConnection($event, handle)\"\n (pointerEnd)=\"endConnection()\" />\n }\n\n @if (handle.template === null) {\n <svg:g\n [handleSizeController]=\"handle\"\n (pointerStart)=\"startConnection($event, handle)\"\n (pointerEnd)=\"endConnection()\" />\n }\n\n @if (handle.template) {\n <svg:g\n [handleSizeController]=\"handle\"\n (pointerStart)=\"startConnection($event, handle)\"\n (pointerEnd)=\"endConnection()\">\n <ng-container *ngTemplateOutlet=\"handle.template; context: handle.templateContext\" />\n </svg:g>\n }\n\n @if (showMagnet()) {\n <svg:circle\n class=\"magnet\"\n [attr.r]=\"model().magnetRadius\"\n [attr.cx]=\"handle.hostOffset().x\"\n [attr.cy]=\"handle.hostOffset().y\"\n (pointerEnd)=\"endConnection(); resetValidateConnection(handle)\"\n (pointerOver)=\"validateConnection(handle)\"\n (pointerOut)=\"resetValidateConnection(handle)\" />\n }\n}\n\n<!-- Toolbar -->\n@for (toolbar of toolbars(); track toolbar) {\n <svg:foreignObject\n [attr.width]=\"toolbar.size().width\"\n [attr.height]=\"toolbar.size().height\"\n [attr.transform]=\"toolbar.transform()\">\n <ng-container [ngTemplateOutlet]=\"toolbar.template()\" />\n </svg:foreignObject>\n}\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"] }]
105
105
  }] });
106
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm9kZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtdmZsb3ctbGliL3NyYy9saWIvdmZsb3cvY29tcG9uZW50cy9ub2RlL25vZGUuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXZmbG93LWxpYi9zcmMvbGliL3ZmbG93L2NvbXBvbmVudHMvbm9kZS9ub2RlLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCx1QkFBdUIsRUFDdkIsU0FBUyxFQUNULFVBQVUsRUFDVixRQUFRLEVBSVIsUUFBUSxFQUNSLE1BQU0sRUFDTixNQUFNLEVBQ04sS0FBSyxHQUNOLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBRXBFLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQ3ZFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUU5RCxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSx1Q0FBdUMsQ0FBQztBQUM3RSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQUMzRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUNwRSxPQUFPLEVBQUUsNkJBQTZCLEVBQUUsTUFBTSxrREFBa0QsQ0FBQztBQUNqRyxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQUMzRSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDbEUsT0FBTyxFQUFFLDZCQUE2QixFQUFFLE1BQU0sbURBQW1ELENBQUM7QUFDbEcsT0FBTyxFQUFFLGdCQUFnQixFQUFFLGlCQUFpQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFD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LElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxrQkFBa0IsRUFBRSxFQUFFLENBQUM7WUFDbEQsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQztRQUM3QyxDQUFDO0lBQ0gsQ0FBQzsrR0F0RlUsYUFBYTttR0FBYixhQUFhLGdxQkFoQmIsQ0FBQyxhQUFhLEVBQUUsbUJBQW1CLENBQUMsMEJDNUNqRCwyK0pBOEpBLHlQRDdHSSxnQkFBZ0IsNEtBQ2hCLG9CQUFvQiwrRUFDcEIsZUFBZSx5SEFDZixnQkFBZ0Isb0pBQ2hCLGlCQUFpQixvUEFDakIsa0JBQWtCLHNHQUNsQiw2QkFBNkIscUdBQzdCLDhCQUE4QixvRUFDOUIsNkJBQTZCOzs0RkFHcEIsYUFBYTtrQkF0QnpCLFNBQVM7aUNBQ0ksSUFBSSxZQUNOLFNBQVMsbUJBR0YsdUJBQXVCLENBQUMsTUFBTSxhQUNwQyxDQUFDLGFBQWEsRUFBRSxtQkFBbUIsQ0FBQyxRQUN6Qzt3QkFDSixLQUFLLEVBQUUsWUFBWTtxQkFDcEIsV0FDUTt3QkFDUCxnQkFBZ0I7d0JBQ2hCLG9CQUFvQjt3QkFDcEIsZUFBZTt3QkFDZixnQkFBZ0I7d0JBQ2hCLGlCQUFpQjt3QkFDakIsa0JBQWtCO3dCQUNsQiw2QkFBNkI7d0JBQzdCLDhCQUE4Qjt3QkFDOUIsNkJBQTZCO3FCQUM5QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDb21wb25lbnQsXG4gIEVsZW1lbnRSZWYsXG4gIEluamVjdG9yLFxuICBPbkRlc3Ryb3ksXG4gIE9uSW5pdCxcbiAgVGVtcGxhdGVSZWYsXG4gIGNvbXB1dGVkLFxuICBlZmZlY3QsXG4gIGluamVjdCxcbiAgaW5wdXQsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRHJhZ2dhYmxlU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2RyYWdnYWJsZS5zZXJ2aWNlJztcbmltcG9ydCB7IE5vZGVNb2RlbCB9IGZyb20gJy4uLy4uL21vZGVscy9ub2RlLm1vZGVsJztcbmltcG9ydCB7IEZsb3dTdGF0dXNTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvZmxvdy1zdGF0dXMuc2VydmljZSc7XG5pbXBvcnQgeyBIYW5kbGVTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvaGFuZGxlLnNlcnZpY2UnO1xuaW1wb3J0IHsgSGFuZGxlTW9kZWwgfSBmcm9tICcuLi8uLi9tb2RlbHMvaGFuZGxlLm1vZGVsJztcbmltcG9ydCB7IE5vZGVSZW5kZXJpbmdTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvbm9kZS1yZW5kZXJpbmcuc2VydmljZSc7XG5pbXBvcnQgeyBGbG93U2V0dGluZ3NTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvZmxvdy1zZXR0aW5ncy5zZXJ2aWNlJztcbmltcG9ydCB7IFNlbGVjdGlvblNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9zZWxlY3Rpb24uc2VydmljZSc7XG5pbXBvcnQgeyBDb25uZWN0aW9uQ29udHJvbGxlckRpcmVjdGl2ZSB9IGZyb20gJy4uLy4uL2RpcmVjdGl2ZXMvY29ubmVjdGlvbi1jb250cm9sbGVyLmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBOb2RlQWNjZXNzb3JTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvbm9kZS1hY2Nlc3Nvci5zZXJ2aWNlJztcbmltcG9ydCB7IE92ZXJsYXlzU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL292ZXJsYXlzLnNlcnZpY2UnO1xuaW1wb3J0IHsgSGFuZGxlU2l6ZUNvbnRyb2xsZXJEaXJlY3RpdmUgfSBmcm9tICcuLi8uLi9kaXJlY3RpdmVzL2hhbmRsZS1zaXplLWNvbnRyb2xsZXIuZGlyZWN0aXZlJztcbmltcG9ydCB7IE5nVGVtcGxhdGVPdXRsZXQsIE5nQ29tcG9uZW50T3V0bGV0IH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IERlZmF1bHROb2RlQ29tcG9uZW50IH0gZnJvbSAnLi4vZGVmYXVsdC1ub2RlL2RlZmF1bHQtbm9kZS5jb21wb25lbnQnO1xuaW1wb3J0IHsgUG9pbnRlckRpcmVjdGl2ZSB9IGZyb20gJy4uLy4uL2RpcmVjdGl2ZXMvcG9pbnRlci5kaXJlY3RpdmUnO1xuXG4vLyBUT0RPOiBmaXggbG9hZGluZyBvZiB0aGVzZSBieSBAZGVmZXIgKHNob3VsZCB3b3JrIGluIEFuZ3VsYXIgMTgrKVxuLy8gcHVibGljIGNvbXBvbmVudHMgdGhhdCB1c2VzIGluIGRlZmF1bHQgbm9kZSAobG9hZGVkIGJ5IGRlZmVyKVxuaW1wb3J0IHsgUmVzaXphYmxlQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vcHVibGljLWNvbXBvbmVudHMvcmVzaXphYmxlL3Jlc2l6YWJsZS5jb21wb25lbnQnO1xuaW1wb3J0IHsgSGFuZGxlQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vcHVibGljLWNvbXBvbmVudHMvaGFuZGxlL2hhbmRsZS5jb21wb25lbnQnO1xuaW1wb3J0IHsgTm9kZUhhbmRsZXNDb250cm9sbGVyRGlyZWN0aXZlIH0gZnJvbSAnLi4vLi4vZGlyZWN0aXZlcy9ub2RlLWhhbmRsZXMtY29udHJvbGxlci5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgTm9kZVJlc2l6ZUNvbnRyb2xsZXJEaXJlY3RpdmUgfSBmcm9tICcuLi8uLi9kaXJlY3RpdmVzL25vZGUtcmVzaXplLWNvbnRyb2xsZXIuZGlyZWN0aXZlJztcblxuZXhwb3J0IHR5cGUgSGFuZGxlU3RhdGUgPSAndmFsaWQnIHwgJ2ludmFsaWQnIHwgJ2lkbGUnO1xuXG5AQ29tcG9uZW50KHtcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgc2VsZWN0b3I6ICdnW25vZGVdJyxcbiAgdGVtcGxhdGVVcmw6ICcuL25vZGUuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9ub2RlLmNvbXBvbmVudC5zY3NzJ10sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICBwcm92aWRlcnM6IFtIYW5kbGVTZXJ2aWNlLCBOb2RlQWNjZXNzb3JTZXJ2aWNlXSxcbiAgaG9zdDoge1xuICAgIGNsYXNzOiAndmZsb3ctbm9kZScsXG4gIH0sXG4gIGltcG9ydHM6IFtcbiAgICBQb2ludGVyRGlyZWN0aXZlLFxuICAgIERlZmF1bHROb2RlQ29tcG9uZW50LFxuICAgIEhhbmRsZUNvbXBvbmVudCxcbiAgICBOZ1RlbXBsYXRlT3V0bGV0LFxuICAgIE5nQ29tcG9uZW50T3V0bGV0LFxuICAgIFJlc2l6YWJsZUNvbXBvbmVudCxcbiAgICBIYW5kbGVTaXplQ29udHJvbGxlckRpcmVjdGl2ZSxcbiAgICBOb2RlSGFuZGxlc0NvbnRyb2xsZXJEaXJlY3RpdmUsXG4gICAgTm9kZVJlc2l6ZUNvbnRyb2xsZXJEaXJlY3RpdmUsXG4gIF0sXG59KVxuZXhwb3J0IGNsYXNzIE5vZGVDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XG4gIHByb3RlY3RlZCBpbmplY3RvciA9IGluamVjdChJbmplY3Rvcik7XG4gIHByaXZhdGUgaGFuZGxlU2VydmljZSA9IGluamVjdChIYW5kbGVTZXJ2aWNlKTtcbiAgcHJpdmF0ZSBkcmFnZ2FibGVTZXJ2aWNlID0gaW5qZWN0KERyYWdnYWJsZVNlcnZpY2UpO1xuICBwcml2YXRlIGZsb3dTdGF0dXNTZXJ2aWNlID0gaW5qZWN0KEZsb3dTdGF0dXNTZXJ2aWNlKTtcbiAgcHJpdmF0ZSBub2RlUmVuZGVyaW5nU2VydmljZSA9IGluamVjdChOb2RlUmVuZGVyaW5nU2VydmljZSk7XG4gIHByaXZhdGUgZmxvd1NldHRpbmdzU2VydmljZSA9IGluamVjdChGbG93U2V0dGluZ3NTZXJ2aWNlKTtcbiAgcHJpdmF0ZSBzZWxlY3Rpb25TZXJ2aWNlID0gaW5qZWN0KFNlbGVjdGlvblNlcnZpY2UpO1xuICBwcml2YXRlIGhvc3RSZWYgPSBpbmplY3Q8RWxlbWVudFJlZjxTVkdFbGVtZW50Pj4oRWxlbWVudFJlZik7XG4gIHByaXZhdGUgbm9kZUFjY2Vzc29yID0gaW5qZWN0KE5vZGVBY2Nlc3NvclNlcnZpY2UpO1xuICBwcml2YXRlIG92ZXJsYXlzU2VydmljZSA9IGluamVjdChPdmVybGF5c1NlcnZpY2UpO1xuXG4gIC8vIFRPRE8gcmVtb3ZlIGRlcGVuZGVuY3kgZnJvbSB0aGlzIGRpcmVjdGl2ZVxuICBwcml2YXRlIGNvbm5lY3Rpb25Db250cm9sbGVyID0gaW5qZWN0KENvbm5lY3Rpb25Db250cm9sbGVyRGlyZWN0aXZlLCB7IG9wdGlvbmFsOiB0cnVlIH0pO1xuXG4gIHB1YmxpYyBtb2RlbCA9IGlucHV0LnJlcXVpcmVkPE5vZGVNb2RlbD4oKTtcblxuICBwdWJsaWMgbm9kZVRlbXBsYXRlID0gaW5wdXQ8VGVtcGxhdGVSZWY8YW55Pj4oKTtcblxuICBwdWJsaWMgbm9kZVN2Z1RlbXBsYXRlID0gaW5wdXQ8VGVtcGxhdGVSZWY8YW55Pj4oKTtcblxuICBwdWJsaWMgZ3JvdXBOb2RlVGVtcGxhdGUgPSBpbnB1dDxUZW1wbGF0ZVJlZjxhbnk+PigpO1xuXG4gIHByb3RlY3RlZCBzaG93TWFnbmV0ID0gY29tcHV0ZWQoXG4gICAgKCkgPT5cbiAgICAgIHRoaXMuZmxvd1N0YXR1c1NlcnZpY2Uuc3RhdHVzKCkuc3RhdGUgPT09ICdjb25uZWN0aW9uLXN0YXJ0JyB8fFxuICAgICAgdGhpcy5mbG93U3RhdHVzU2VydmljZS5zdGF0dXMoKS5zdGF0ZSA9PT0gJ2Nvbm5lY3Rpb24tdmFsaWRhdGlvbicgfHxcbiAgICAgIHRoaXMuZmxvd1N0YXR1c1NlcnZpY2Uuc3RhdHVzKCkuc3RhdGUgPT09ICdyZWNvbm5lY3Rpb24tc3RhcnQnIHx8XG4gICAgICB0aGlzLmZsb3dTdGF0dXNTZXJ2aWNlLnN0YXR1cygpLnN0YXRlID09PSAncmVjb25uZWN0aW9uLXZhbGlkYXRpb24nLFxuICApO1xuXG4gIHByb3RlY3RlZCB0b29sYmFycyA9IGNvbXB1dGVkKCgpID0+IHRoaXMub3ZlcmxheXNTZXJ2aWNlLm5vZGVUb29sYmFyc01hcCgpLmdldCh0aGlzLm1vZGVsKCkpKTtcblxuICBwdWJsaWMgbmdPbkluaXQoKSB7XG4gICAgdGhpcy5tb2RlbCgpLmlzVmlzaWJsZS5zZXQodHJ1ZSk7XG5cbiAgICB0aGlzLm5vZGVBY2Nlc3Nvci5tb2RlbC5zZXQodGhpcy5tb2RlbCgpKTtcbiAgICB0aGlzLmhhbmRsZVNlcnZpY2Uubm9kZS5zZXQodGhpcy5tb2RlbCgpKTtcblxuICAgIGVmZmVjdChcbiAgICAgICgpID0+IHtcbiAgICAgICAgaWYgKHRoaXMubW9kZWwoKS5kcmFnZ2FibGUoKSkge1xuICAgICAgICAgIHRoaXMuZHJhZ2dhYmxlU2VydmljZS5lbmFibGUodGhpcy5ob3N0UmVmLm5hdGl2ZUVsZW1lbnQsIHRoaXMubW9kZWwoKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5kcmFnZ2FibGVTZXJ2aWNlLmRpc2FibGUodGhpcy5ob3N0UmVmLm5hdGl2ZUVsZW1lbnQpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgeyBpbmplY3RvcjogdGhpcy5pbmplY3RvciB9LFxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5tb2RlbCgpLmlzVmlzaWJsZS5zZXQoZmFsc2UpO1xuXG4gICAgdGhpcy5kcmFnZ2FibGVTZXJ2aWNlLmRlc3Ryb3kodGhpcy5ob3N0UmVmLm5hdGl2ZUVsZW1lbnQpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHN0YXJ0Q29ubmVjdGlvbihldmVudDogRXZlbnQsIGhhbmRsZTogSGFuZGxlTW9kZWwpIHtcbiAgICAvLyBpZ25vcmUgZHJhZyBieSBzdG9wcGluZyBwcm9wYWdhdGlvblxuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuXG4gICAgdGhpcy5jb25uZWN0aW9uQ29udHJvbGxlcj8uc3RhcnRDb25uZWN0aW9uKGhhbmRsZSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgdmFsaWRhdGVDb25uZWN0aW9uKGhhbmRsZTogSGFuZGxlTW9kZWwpIHtcbiAgICB0aGlzLmNvbm5lY3Rpb25Db250cm9sbGVyPy52YWxpZGF0ZUNvbm5lY3Rpb24oaGFuZGxlKTtcbiAgfVxuXG4gIHByb3RlY3RlZCByZXNldFZhbGlkYXRlQ29ubmVjdGlvbih0YXJnZXRIYW5kbGU6IEhhbmRsZU1vZGVsKSB7XG4gICAgdGhpcy5jb25uZWN0aW9uQ29udHJvbGxlcj8ucmVzZXRWYWxpZGF0ZUNvbm5lY3Rpb24odGFyZ2V0SGFuZGxlKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBlbmRDb25uZWN0aW9uKCkge1xuICAgIHRoaXMuY29ubmVjdGlvbkNvbnRyb2xsZXI/LmVuZENvbm5lY3Rpb24oKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBwdWxsTm9kZSgpIHtcbiAgICBpZiAodGhpcy5mbG93U2V0dGluZ3NTZXJ2aWNlLmVsZXZhdGVOb2Rlc09uU2VsZWN0KCkpIHtcbiAgICAgIHRoaXMubm9kZVJlbmRlcmluZ1NlcnZpY2UucHVsbE5vZGUodGhpcy5tb2RlbCgpKTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgc2VsZWN0Tm9kZSgpIHtcbiAgICBpZiAodGhpcy5mbG93U2V0dGluZ3NTZXJ2aWNlLmVudGl0aWVzU2VsZWN0YWJsZSgpKSB7XG4gICAgICB0aGlzLnNlbGVjdGlvblNlcnZpY2Uuc2VsZWN0KHRoaXMubW9kZWwoKSk7XG4gICAgfVxuICB9XG59XG4iLCI8IS0tIERlZmF1bHQgbm9kZSAtLT5cbkBpZiAobW9kZWwoKS5yYXdOb2RlLnR5cGUgPT09ICdkZWZhdWx0Jykge1xuICA8c3ZnOmZvcmVpZ25PYmplY3RcbiAgICBjbGFzcz1cInNlbGVjdGFibGVcIlxuICAgIFthdHRyLndpZHRoXT1cIm1vZGVsKCkuZm9XaWR0aCgpXCJcbiAgICBbYXR0ci5oZWlnaHRdPVwibW9kZWwoKS5mb0hlaWdodCgpXCJcbiAgICAoY2xpY2spPVwicHVsbE5vZGUoKTsgc2VsZWN0Tm9kZSgpXCI+XG4gICAgPGRlZmF1bHQtbm9kZVxuICAgICAgbm9kZUhhbmRsZXNDb250cm9sbGVyXG4gICAgICBbc2VsZWN0ZWRdPVwibW9kZWwoKS5zZWxlY3RlZCgpXCJcbiAgICAgIFtzdHlsZS53aWR0aF09XCJtb2RlbCgpLnN0eWxlV2lkdGgoKVwiXG4gICAgICBbc3R5bGUuaGVpZ2h0XT1cIm1vZGVsKCkuc3R5bGVIZWlnaHQoKVwiXG4gICAgICBbc3R5bGUubWF4LXdpZHRoXT1cIm1vZGVsKCkuc3R5bGVXaWR0aCgpXCJcbiAgICAgIFtzdHlsZS5tYXgtaGVpZ2h0XT1cIm1vZGVsKCkuc3R5bGVIZWlnaHQoKVwiPlxuICAgICAgPGRpdiBbb3V0ZXJIVE1MXT1cIm1vZGVsKCkudGV4dCgpXCI+PC9kaXY+XG5cbiAgICAgIDxoYW5kbGUgdHlwZT1cInNvdXJjZVwiIHBvc2l0aW9uPVwicmlnaHRcIiAvPlxuICAgICAgPGhhbmRsZSB0eXBlPVwidGFyZ2V0XCIgcG9zaXRpb249XCJsZWZ0XCIgLz5cbiAgICA8L2RlZmF1bHQtbm9kZT5cbiAgPC9zdmc6Zm9yZWlnbk9iamVjdD5cbn1cblxuPCEtLSBIVE1MIFRlbXBsYXRlIG5vZGUgLS0+XG5AaWYgKG1vZGVsKCkucmF3Tm9kZS50eXBlID09PSAnaHRtbC10ZW1wbGF0ZScgJiYgbm9kZVRlbXBsYXRlKCkpIHtcbiAgPHN2Zzpmb3JlaWduT2JqZWN0XG4gICAgY2xhc3M9XCJzZWxlY3RhYmxlXCJcbiAgICBbYXR0ci53aWR0aF09XCJtb2RlbCgpLmZvV2lkdGgoKVwiXG4gICAgW2F0dHIuaGVpZ2h0XT1cIm1vZGVsKCkuZm9IZWlnaHQoKVwiXG4gICAgKGNsaWNrKT1cInB1bGxOb2RlKClcIj5cbiAgICA8ZGl2XG4gICAgICBub2RlSGFuZGxlc0NvbnRyb2xsZXJcbiAgICAgIG5vZGVSZXNpemVDb250cm9sbGVyXG4gICAgICBjbGFzcz1cIndyYXBwZXJcIlxuICAgICAgW3N0eWxlLndpZHRoXT1cIm1vZGVsKCkuc3R5bGVXaWR0aCgpXCJcbiAgICAgIFtzdHlsZS5oZWlnaHRdPVwibW9kZWwoKS5zdHlsZUhlaWdodCgpXCI+XG4gICAgICA8bmctY29udGFpbmVyXG4gICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0XT1cIm5vZGVUZW1wbGF0ZSgpID8/IG51bGxcIlxuICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwibW9kZWwoKS5jb250ZXh0XCJcbiAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRJbmplY3Rvcl09XCJpbmplY3RvclwiIC8+XG4gICAgPC9kaXY+XG4gIDwvc3ZnOmZvcmVpZ25PYmplY3Q+XG59XG5cbjwhLS0gU1ZHIFRlbXBsYXRlIG5vZGUgLS0+XG5AaWYgKG1vZGVsKCkucmF3Tm9kZS50eXBlID09PSAnc3ZnLXRlbXBsYXRlJyAmJiBub2RlU3ZnVGVtcGxhdGUoKSkge1xuICA8c3ZnOmcgY2xhc3M9XCJzZWxlY3RhYmxlXCIgbm9kZUhhbmRsZXNDb250cm9sbGVyIChjbGljayk9XCJwdWxsTm9kZSgpXCI+XG4gICAgPG5nLWNvbnRhaW5lclxuICAgICAgW25nVGVtcGxhdGVPdXRsZXRdPVwibm9kZVN2Z1RlbXBsYXRlKCkgPz8gbnVsbFwiXG4gICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwibW9kZWwoKS5jb250ZXh0XCJcbiAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0SW5qZWN0b3JdPVwiaW5qZWN0b3JcIiAvPlxuICA8L3N2ZzpnPlxufVxuXG48IS0tIENvbXBvbmVudCBub2RlIC0tPlxuQGlmIChtb2RlbCgpLmlzQ29tcG9uZW50VHlwZSkge1xuICA8c3ZnOmZvcmVpZ25PYmplY3RcbiAgICBjbGFzcz1cInNlbGVjdGFibGVcIlxuICAgIFthdHRyLndpZHRoXT1cIm1vZGVsKCkuZm9XaWR0aCgpXCJcbiAgICBbYXR0ci5oZWlnaHRdPVwibW9kZWwoKS5mb0hlaWdodCgpXCJcbiAgICAoY2xpY2spPVwicHVsbE5vZGUoKVwiPlxuICAgIDxkaXZcbiAgICAgIG5vZGVIYW5kbGVzQ29udHJvbGxlclxuICAgICAgbm9kZVJlc2l6ZUNvbnRyb2xsZXJcbiAgICAgIGNsYXNzPVwid3JhcHBlclwiXG4gICAgICBbc3R5bGUud2lkdGhdPVwibW9kZWwoKS5zdHlsZVdpZHRoKClcIlxuICAgICAgW3N0eWxlLmhlaWdodF09XCJtb2RlbCgpLnN0eWxlSGVpZ2h0KClcIj5cbiAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgW25nQ29tcG9uZW50T3V0bGV0XT1cIiRhbnkobW9kZWwoKS5yYXdOb2RlLnR5cGUpXCJcbiAgICAgICAgW25nQ29tcG9uZW50T3V0bGV0SW5wdXRzXT1cIm1vZGVsKCkuY29tcG9uZW50VHlwZUlucHV0c1wiXG4gICAgICAgIFtuZ0NvbXBvbmVudE91dGxldEluamVjdG9yXT1cImluamVjdG9yXCIgLz5cbiAgICA8L2Rpdj5cbiAgPC9zdmc6Zm9yZWlnbk9iamVjdD5cbn1cblxuPCEtLSBEZWZhdWx0IGdyb3VwIG5vZGUgLS0+XG5AaWYgKG1vZGVsKCkucmF3Tm9kZS50eXBlID09PSAnZGVmYXVsdC1ncm91cCcpIHtcbiAgPHN2ZzpyZWN0XG4gICAgY2xhc3M9XCJkZWZhdWx0LWdyb3VwLW5vZGVcIlxuICAgIHJ4PVwiNVwiXG4gICAgcnk9XCI1XCJcbiAgICBbcmVzaXphYmxlXT1cIm1vZGVsKCkucmVzaXphYmxlKClcIlxuICAgIFtnYXBdPVwiM1wiXG4gICAgW3Jlc2l6ZXJDb2xvcl09XCJtb2RlbCgpLmNvbG9yKClcIlxuICAgIFtjbGFzcy5kZWZhdWx0LWdyb3VwLW5vZGVfc2VsZWN0ZWRdPVwibW9kZWwoKS5zZWxlY3RlZCgpXCJcbiAgICBbYXR0ci53aWR0aF09XCJtb2RlbCgpLnNpemUoKS53aWR0aFwiXG4gICAgW2F0dHIuaGVpZ2h0XT1cIm1vZGVsKCkuc2l6ZSgpLmhlaWdodFwiXG4gICAgW3N0eWxlLnN0cm9rZV09XCJtb2RlbCgpLmNvbG9yKClcIlxuICAgIFtzdHlsZS5maWxsXT1cIm1vZGVsKCkuY29sb3IoKVwiXG4gICAgKGNsaWNrKT1cInB1bGxOb2RlKCk7IHNlbGVjdE5vZGUoKVwiIC8+XG59XG5cbjwhLS0gVGVtcGxhdGUgZ3JvdXAgbm9kZSAgLS0+XG5AaWYgKG1vZGVsKCkucmF3Tm9kZS50eXBlID09PSAndGVtcGxhdGUtZ3JvdXAnICYmIGdyb3VwTm9kZVRlbXBsYXRlKCkpIHtcbiAgPHN2ZzpnIGNsYXNzPVwic2VsZWN0YWJsZVwiIG5vZGVIYW5kbGVzQ29udHJvbGxlciAoY2xpY2spPVwicHVsbE5vZGUoKVwiPlxuICAgIDxuZy1jb250YWluZXJcbiAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImdyb3VwTm9kZVRlbXBsYXRlKCkgPz8gbnVsbFwiXG4gICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwibW9kZWwoKS5jb250ZXh0XCJcbiAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0SW5qZWN0b3JdPVwiaW5qZWN0b3JcIiAvPlxuICA8L3N2ZzpnPlxufVxuXG48IS0tIFJlc2l6ZXIgLS0+XG5AaWYgKG1vZGVsKCkucmVzaXplclRlbXBsYXRlKCk7IGFzIHRlbXBsYXRlKSB7XG4gIEBpZiAobW9kZWwoKS5yZXNpemFibGUoKSkge1xuICAgIDxuZy10ZW1wbGF0ZSBbbmdUZW1wbGF0ZU91dGxldF09XCJ0ZW1wbGF0ZVwiIC8+XG4gIH1cbn1cblxuPCEtLSBIYW5kbGVzIC0tPlxuQGZvciAoaGFuZGxlIG9mIG1vZGVsKCkuaGFuZGxlcygpOyB0cmFjayBoYW5kbGUpIHtcbiAgQGlmIChoYW5kbGUudGVtcGxhdGUgPT09IHVuZGVmaW5lZCkge1xuICAgIDxzdmc6Y2lyY2xlXG4gICAgICBjbGFzcz1cImRlZmF1bHQtaGFuZGxlXCJcbiAgICAgIHI9XCI1XCJcbiAgICAgIFthdHRyLmN4XT1cImhhbmRsZS5ob3N0T2Zmc2V0KCkueFwiXG4gICAgICBbYXR0ci5jeV09XCJoYW5kbGUuaG9zdE9mZnNldCgpLnlcIlxuICAgICAgW2F0dHIuc3Ryb2tlLXdpZHRoXT1cImhhbmRsZS5zdHJva2VXaWR0aFwiXG4gICAgICAocG9pbnRlclN0YXJ0KT1cInN0YXJ0Q29ubmVjdGlvbigkZXZlbnQsIGhhbmRsZSlcIlxuICAgICAgKHBvaW50ZXJFbmQpPVwiZW5kQ29ubmVjdGlvbigpXCIgLz5cbiAgfVxuXG4gIEBpZiAoaGFuZGxlLnRlbXBsYXRlID09PSBudWxsKSB7XG4gICAgPHN2ZzpnXG4gICAgICBbaGFuZGxlU2l6ZUNvbnRyb2xsZXJdPVwiaGFuZGxlXCJcbiAgICAgIChwb2ludGVyU3RhcnQpPVwic3RhcnRDb25uZWN0aW9uKCRldmVudCwgaGFuZGxlKVwiXG4gICAgICAocG9pbnRlckVuZCk9XCJlbmRDb25uZWN0aW9uKClcIiAvPlxuICB9XG5cbiAgQGlmIChoYW5kbGUudGVtcGxhdGUpIHtcbiAgICA8c3ZnOmdcbiAgICAgIFtoYW5kbGVTaXplQ29udHJvbGxlcl09XCJoYW5kbGVcIlxuICAgICAgKHBvaW50ZXJTdGFydCk9XCJzdGFydENvbm5lY3Rpb24oJGV2ZW50LCBoYW5kbGUpXCJcbiAgICAgIChwb2ludGVyRW5kKT1cImVuZENvbm5lY3Rpb24oKVwiPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImhhbmRsZS50ZW1wbGF0ZTsgY29udGV4dDogaGFuZGxlLnRlbXBsYXRlQ29udGV4dFwiIC8+XG4gICAgPC9zdmc6Zz5cbiAgfVxuXG4gIEBpZiAoc2hvd01hZ25ldCgpKSB7XG4gICAgPHN2ZzpjaXJjbGVcbiAgICAgIGNsYXNzPVwibWFnbmV0XCJcbiAgICAgIFthdHRyLnJdPVwibW9kZWwoKS5tYWduZXRSYWRpdXNcIlxuICAgICAgW2F0dHIuY3hdPVwiaGFuZGxlLmhvc3RPZmZzZXQoKS54XCJcbiAgICAgIFthdHRyLmN5XT1cImhhbmRsZS5ob3N0T2Zmc2V0KCkueVwiXG4gICAgICAocG9pbnRlckVuZCk9XCJlbmRDb25uZWN0aW9uKCk7IHJlc2V0VmFsaWRhdGVDb25uZWN0aW9uKGhhbmRsZSlcIlxuICAgICAgKHBvaW50ZXJPdmVyKT1cInZhbGlkYXRlQ29ubmVjdGlvbihoYW5kbGUpXCJcbiAgICAgIChwb2ludGVyT3V0KT1cInJlc2V0VmFsaWRhdGVDb25uZWN0aW9uKGhhbmRsZSlcIiAvPlxuICB9XG59XG5cbjwhLS0gVG9vbGJhciAtLT5cbkBmb3IgKHRvb2xiYXIgb2YgdG9vbGJhcnMoKTsgdHJhY2sgdG9vbGJhcikge1xuICA8c3ZnOmZvcmVpZ25PYmplY3RcbiAgICBbYXR0ci53aWR0aF09XCJ0b29sYmFyLnNpemUoKS53aWR0aFwiXG4gICAgW2F0dHIuaGVpZ2h0XT1cInRvb2xiYXIuc2l6ZSgpLmhlaWdodFwiXG4gICAgW2F0dHIudHJhbnNmb3JtXT1cInRvb2xiYXIudHJhbnNmb3JtKClcIj5cbiAgICA8bmctY29udGFpbmVyIFtuZ1RlbXBsYXRlT3V0bGV0XT1cInRvb2xiYXIudGVtcGxhdGUoKVwiIC8+XG4gIDwvc3ZnOmZvcmVpZ25PYmplY3Q+XG59XG4iXX0=
106
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm9kZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtdmZsb3ctbGliL3NyYy9saWIvdmZsb3cvY29tcG9uZW50cy9ub2RlL25vZGUuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXZmbG93LWxpYi9zcmMvbGliL3ZmbG93L2NvbXBvbmVudHMvbm9kZS9ub2RlLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCx1QkFBdUIsRUFDdkIsU0FBUyxFQUNULFVBQVUsRUFDVixRQUFRLEVBSVIsUUFBUSxFQUNSLE1BQU0sRUFDTixNQUFNLEVBQ04sS0FBSyxHQUNOLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBRXBFLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQ3ZFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUU5RCxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSx1Q0FBdUMsQ0FBQztBQUM3RSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQUMzRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUNwRSxPQUFPLEVBQUUsNkJBQTZCLEVBQUUsTUFBTSxrREFBa0QsQ0FBQztBQUNqRyxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQUMzRSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDbEUsT0FBTyxFQUFFLDZCQUE2QixFQUFFLE1BQU0sbURBQW1ELENBQUM7QUFDbEcsT0FBTyxFQUFFLGdCQUFnQixFQUFFLGlCQUFpQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDdEUsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sd0NBQXdDLENBQUM7QUFDOUUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFFdEUsb0VBQW9FO0FBQ3BFLGdFQUFnRTtBQUNoRSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSx1REFBdUQsQ0FBQztBQUMzRixPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0saURBQWlELENBQUM7QUFDbEYsT0FBTyxFQUFFLDhCQUE4QixFQUFFLE1BQU0sb0RBQW9ELENBQUM7QUFDcEcsT0FBTyxFQUFFLDZCQUE2QixFQUFFLE1BQU0sbURBQW1ELENBQUM7O0FBMEJsRyxNQUFNLE9BQU8sYUFBYTtJQXRCMUI7UUF1QlksYUFBUSxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUM5QixrQkFBYSxHQUFHLE1BQU0sQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUN0QyxxQkFBZ0IsR0FBRyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztRQUM1QyxzQkFBaUIsR0FBRyxNQUFNLENBQUMsaUJBQWlCLENBQUMsQ0FBQztRQUM5Qyx5QkFBb0IsR0FBRyxNQUFNLENBQUMsb0JBQW9CLENBQUMsQ0FBQztRQUNwRCx3QkFBbUIsR0FBRyxNQUFNLENBQUMsbUJBQW1CLENBQUMsQ0FBQztRQUNsRCxxQkFBZ0IsR0FBRyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztRQUM1QyxZQUFPLEdBQUcsTUFBTSxDQUF5QixVQUFVLENBQUMsQ0FBQztRQUNyRCxpQkFBWSxHQUFHLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO1FBQzNDLG9CQUFlLEdBQUcsTUFBTSxDQUFDLGVBQWUsQ0FBQyxDQUFDO1FBRWxELDZDQUE2QztRQUNyQyx5QkFBb0IsR0FBRyxNQUFNLENBQUMsNkJBQTZCLEVBQUUsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUVsRixVQUFLLEdBQUcsS0FBSyxDQUFDLFFBQVEsRUFBYSxDQUFDO1FBRXBDLGlCQUFZLEdBQUcsS0FBSyxFQUFvQixDQUFDO1FBRXpDLG9CQUFlLEdBQUcsS0FBSyxFQUFvQixDQUFDO1FBRTVDLHNCQUFpQixHQUFHLEtBQUssRUFBb0IsQ0FBQztRQUUzQyxlQUFVLEdBQUcsUUFBUSxDQUM3QixHQUFHLEVBQUUsQ0FDSCxJQUFJLENBQUMsaUJBQWlCLENBQUMsTUFBTSxFQUFFLENBQUMsS0FBSyxLQUFLLGtCQUFrQjtZQUM1RCxJQUFJLENBQUMsaUJBQWlCLENBQUMsTUFBTSxFQUFFLENBQUMsS0FBSyxLQUFLLHVCQUF1QjtZQUNqRSxJQUFJLENBQUMsaUJBQWlCLENBQUMsTUFBTSxFQUFFLENBQUMsS0FBSyxLQUFLLG9CQUFvQjtZQUM5RCxJQUFJLENBQUMsaUJBQWlCLENBQUMsTUFBTSxFQUFFLENBQUMsS0FBSyxLQUFLLHlCQUF5QixDQUN0RSxDQUFDO1FBRVEsYUFBUSxHQUFHLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLGVBQWUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDO0tBd0QvRjtJQXREUSxRQUFRO1FBQ2IsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFakMsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO1FBQzFDLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQztRQUUxQyxNQUFNLENBQ0osR0FBRyxFQUFFO1lBQ0gsSUFBSSxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsU0FBUyxFQUFFLEVBQUUsQ0FBQztnQkFDN0IsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQztZQUN6RSxDQUFDO2lCQUFNLENBQUM7Z0JBQ04sSUFBSSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxDQUFDO1lBQzVELENBQUM7UUFDSCxDQUFDLEVBQ0QsRUFBRSxRQUFRLEVBQUUsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUM1QixDQUFDO0lBQ0osQ0FBQztJQUVNLFdBQVc7UUFDaEIsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7UUFFbEMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxDQUFDO0lBQzVELENBQUM7SUFFUyxlQUFlLENBQUMsS0FBWSxFQUFFLE1BQW1CO1FBQ3pELHNDQUFzQztRQUN0QyxLQUFLLENBQUMsZUFBZSxFQUFFLENBQUM7UUFFeEIsSUFBSSxDQUFDLG9CQUFvQixFQUFFLGVBQWUsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUNyRCxDQUFDO0lBRVMsa0JBQWtCLENBQUMsTUFBbUI7UUFDOUMsSUFBSSxDQUFDLG9CQUFvQixFQUFFLGtCQUFrQixDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ3hELENBQUM7SUFFUyx1QkFBdUIsQ0FBQyxZQUF5QjtRQUN6RCxJQUFJLENBQUMsb0JBQW9CLEVBQUUsdUJBQXVCLENBQUMsWUFBWSxDQUFDLENBQUM7SUFDbkUsQ0FBQztJQUVTLGFBQWE7UUFDckIsSUFBSSxDQUFDLG9CQUFvQixFQUFFLGFBQWEsRUFBRSxDQUFDO0lBQzdDLENBQUM7SUFFUyxRQUFRO1FBQ2hCLElBQUksSUFBSSxDQUFDLG1CQUFtQixDQUFDLG9CQUFvQixFQUFFLEVBQUUsQ0FBQztZQUNwRCxJQUFJLENBQUMsb0JBQW9CLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO1FBQ25ELENBQUM7SUFDSCxDQUFDO0lBRVMsVUFBVTtRQUNsQixJQUFJLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxrQkFBa0IsRUFBRSxFQUFFLENBQUM7WUFDbEQsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQztRQUM3QyxDQUFDO0lBQ0gsQ0FBQzsrR0F0RlUsYUFBYTttR0FBYixhQUFhLGdxQkFoQmIsQ0FBQyxhQUFhLEVBQUUsbUJBQW1CLENBQUMsMEJDNUNqRCxtMUpBb0pBLHlQRG5HSSxnQkFBZ0IsNEtBQ2hCLG9CQUFvQiwrRUFDcEIsZUFBZSx5SEFDZixnQkFBZ0Isb0pBQ2hCLGlCQUFpQixvUEFDakIsa0JBQWtCLHNHQUNsQiw2QkFBNkIscUdBQzdCLDhCQUE4QixvRUFDOUIsNkJBQTZCOzs0RkFHcEIsYUFBYTtrQkF0QnpCLFNBQVM7aUNBQ0ksSUFBSSxZQUNOLFNBQVMsbUJBR0YsdUJBQXVCLENBQUMsTUFBTSxhQUNwQyxDQUFDLGFBQWEsRUFBRSxtQkFBbUIsQ0FBQyxRQUN6Qzt3QkFDSixLQUFLLEVBQUUsWUFBWTtxQkFDcEIsV0FDUTt3QkFDUCxnQkFBZ0I7d0JBQ2hCLG9CQUFvQjt3QkFDcEIsZUFBZTt3QkFDZixnQkFBZ0I7d0JBQ2hCLGlCQUFpQjt3QkFDakIsa0JBQWtCO3dCQUNsQiw2QkFBNkI7d0JBQzdCLDhCQUE4Qjt3QkFDOUIsNkJBQTZCO3FCQUM5QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDb21wb25lbnQsXG4gIEVsZW1lbnRSZWYsXG4gIEluamVjdG9yLFxuICBPbkRlc3Ryb3ksXG4gIE9uSW5pdCxcbiAgVGVtcGxhdGVSZWYsXG4gIGNvbXB1dGVkLFxuICBlZmZlY3QsXG4gIGluamVjdCxcbiAgaW5wdXQsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRHJhZ2dhYmxlU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2RyYWdnYWJsZS5zZXJ2aWNlJztcbmltcG9ydCB7IE5vZGVNb2RlbCB9IGZyb20gJy4uLy4uL21vZGVscy9ub2RlLm1vZGVsJztcbmltcG9ydCB7IEZsb3dTdGF0dXNTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvZmxvdy1zdGF0dXMuc2VydmljZSc7XG5pbXBvcnQgeyBIYW5kbGVTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvaGFuZGxlLnNlcnZpY2UnO1xuaW1wb3J0IHsgSGFuZGxlTW9kZWwgfSBmcm9tICcuLi8uLi9tb2RlbHMvaGFuZGxlLm1vZGVsJztcbmltcG9ydCB7IE5vZGVSZW5kZXJpbmdTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvbm9kZS1yZW5kZXJpbmcuc2VydmljZSc7XG5pbXBvcnQgeyBGbG93U2V0dGluZ3NTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvZmxvdy1zZXR0aW5ncy5zZXJ2aWNlJztcbmltcG9ydCB7IFNlbGVjdGlvblNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9zZWxlY3Rpb24uc2VydmljZSc7XG5pbXBvcnQgeyBDb25uZWN0aW9uQ29udHJvbGxlckRpcmVjdGl2ZSB9IGZyb20gJy4uLy4uL2RpcmVjdGl2ZXMvY29ubmVjdGlvbi1jb250cm9sbGVyLmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBOb2RlQWNjZXNzb3JTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvbm9kZS1hY2Nlc3Nvci5zZXJ2aWNlJztcbmltcG9ydCB7IE92ZXJsYXlzU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL292ZXJsYXlzLnNlcnZpY2UnO1xuaW1wb3J0IHsgSGFuZGxlU2l6ZUNvbnRyb2xsZXJEaXJlY3RpdmUgfSBmcm9tICcuLi8uLi9kaXJlY3RpdmVzL2hhbmRsZS1zaXplLWNvbnRyb2xsZXIuZGlyZWN0aXZlJztcbmltcG9ydCB7IE5nVGVtcGxhdGVPdXRsZXQsIE5nQ29tcG9uZW50T3V0bGV0IH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IERlZmF1bHROb2RlQ29tcG9uZW50IH0gZnJvbSAnLi4vZGVmYXVsdC1ub2RlL2RlZmF1bHQtbm9kZS5jb21wb25lbnQnO1xuaW1wb3J0IHsgUG9pbnRlckRpcmVjdGl2ZSB9IGZyb20gJy4uLy4uL2RpcmVjdGl2ZXMvcG9pbnRlci5kaXJlY3RpdmUnO1xuXG4vLyBUT0RPOiBmaXggbG9hZGluZyBvZiB0aGVzZSBieSBAZGVmZXIgKHNob3VsZCB3b3JrIGluIEFuZ3VsYXIgMTgrKVxuLy8gcHVibGljIGNvbXBvbmVudHMgdGhhdCB1c2VzIGluIGRlZmF1bHQgbm9kZSAobG9hZGVkIGJ5IGRlZmVyKVxuaW1wb3J0IHsgUmVzaXphYmxlQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vcHVibGljLWNvbXBvbmVudHMvcmVzaXphYmxlL3Jlc2l6YWJsZS5jb21wb25lbnQnO1xuaW1wb3J0IHsgSGFuZGxlQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vcHVibGljLWNvbXBvbmVudHMvaGFuZGxlL2hhbmRsZS5jb21wb25lbnQnO1xuaW1wb3J0IHsgTm9kZUhhbmRsZXNDb250cm9sbGVyRGlyZWN0aXZlIH0gZnJvbSAnLi4vLi4vZGlyZWN0aXZlcy9ub2RlLWhhbmRsZXMtY29udHJvbGxlci5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgTm9kZVJlc2l6ZUNvbnRyb2xsZXJEaXJlY3RpdmUgfSBmcm9tICcuLi8uLi9kaXJlY3RpdmVzL25vZGUtcmVzaXplLWNvbnRyb2xsZXIuZGlyZWN0aXZlJztcblxuZXhwb3J0IHR5cGUgSGFuZGxlU3RhdGUgPSAndmFsaWQnIHwgJ2ludmFsaWQnIHwgJ2lkbGUnO1xuXG5AQ29tcG9uZW50KHtcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgc2VsZWN0b3I6ICdnW25vZGVdJyxcbiAgdGVtcGxhdGVVcmw6ICcuL25vZGUuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9ub2RlLmNvbXBvbmVudC5zY3NzJ10sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICBwcm92aWRlcnM6IFtIYW5kbGVTZXJ2aWNlLCBOb2RlQWNjZXNzb3JTZXJ2aWNlXSxcbiAgaG9zdDoge1xuICAgIGNsYXNzOiAndmZsb3ctbm9kZScsXG4gIH0sXG4gIGltcG9ydHM6IFtcbiAgICBQb2ludGVyRGlyZWN0aXZlLFxuICAgIERlZmF1bHROb2RlQ29tcG9uZW50LFxuICAgIEhhbmRsZUNvbXBvbmVudCxcbiAgICBOZ1RlbXBsYXRlT3V0bGV0LFxuICAgIE5nQ29tcG9uZW50T3V0bGV0LFxuICAgIFJlc2l6YWJsZUNvbXBvbmVudCxcbiAgICBIYW5kbGVTaXplQ29udHJvbGxlckRpcmVjdGl2ZSxcbiAgICBOb2RlSGFuZGxlc0NvbnRyb2xsZXJEaXJlY3RpdmUsXG4gICAgTm9kZVJlc2l6ZUNvbnRyb2xsZXJEaXJlY3RpdmUsXG4gIF0sXG59KVxuZXhwb3J0IGNsYXNzIE5vZGVDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XG4gIHByb3RlY3RlZCBpbmplY3RvciA9IGluamVjdChJbmplY3Rvcik7XG4gIHByaXZhdGUgaGFuZGxlU2VydmljZSA9IGluamVjdChIYW5kbGVTZXJ2aWNlKTtcbiAgcHJpdmF0ZSBkcmFnZ2FibGVTZXJ2aWNlID0gaW5qZWN0KERyYWdnYWJsZVNlcnZpY2UpO1xuICBwcml2YXRlIGZsb3dTdGF0dXNTZXJ2aWNlID0gaW5qZWN0KEZsb3dTdGF0dXNTZXJ2aWNlKTtcbiAgcHJpdmF0ZSBub2RlUmVuZGVyaW5nU2VydmljZSA9IGluamVjdChOb2RlUmVuZGVyaW5nU2VydmljZSk7XG4gIHByaXZhdGUgZmxvd1NldHRpbmdzU2VydmljZSA9IGluamVjdChGbG93U2V0dGluZ3NTZXJ2aWNlKTtcbiAgcHJpdmF0ZSBzZWxlY3Rpb25TZXJ2aWNlID0gaW5qZWN0KFNlbGVjdGlvblNlcnZpY2UpO1xuICBwcml2YXRlIGhvc3RSZWYgPSBpbmplY3Q8RWxlbWVudFJlZjxTVkdFbGVtZW50Pj4oRWxlbWVudFJlZik7XG4gIHByaXZhdGUgbm9kZUFjY2Vzc29yID0gaW5qZWN0KE5vZGVBY2Nlc3NvclNlcnZpY2UpO1xuICBwcml2YXRlIG92ZXJsYXlzU2VydmljZSA9IGluamVjdChPdmVybGF5c1NlcnZpY2UpO1xuXG4gIC8vIFRPRE8gcmVtb3ZlIGRlcGVuZGVuY3kgZnJvbSB0aGlzIGRpcmVjdGl2ZVxuICBwcml2YXRlIGNvbm5lY3Rpb25Db250cm9sbGVyID0gaW5qZWN0KENvbm5lY3Rpb25Db250cm9sbGVyRGlyZWN0aXZlLCB7IG9wdGlvbmFsOiB0cnVlIH0pO1xuXG4gIHB1YmxpYyBtb2RlbCA9IGlucHV0LnJlcXVpcmVkPE5vZGVNb2RlbD4oKTtcblxuICBwdWJsaWMgbm9kZVRlbXBsYXRlID0gaW5wdXQ8VGVtcGxhdGVSZWY8YW55Pj4oKTtcblxuICBwdWJsaWMgbm9kZVN2Z1RlbXBsYXRlID0gaW5wdXQ8VGVtcGxhdGVSZWY8YW55Pj4oKTtcblxuICBwdWJsaWMgZ3JvdXBOb2RlVGVtcGxhdGUgPSBpbnB1dDxUZW1wbGF0ZVJlZjxhbnk+PigpO1xuXG4gIHByb3RlY3RlZCBzaG93TWFnbmV0ID0gY29tcHV0ZWQoXG4gICAgKCkgPT5cbiAgICAgIHRoaXMuZmxvd1N0YXR1c1NlcnZpY2Uuc3RhdHVzKCkuc3RhdGUgPT09ICdjb25uZWN0aW9uLXN0YXJ0JyB8fFxuICAgICAgdGhpcy5mbG93U3RhdHVzU2VydmljZS5zdGF0dXMoKS5zdGF0ZSA9PT0gJ2Nvbm5lY3Rpb24tdmFsaWRhdGlvbicgfHxcbiAgICAgIHRoaXMuZmxvd1N0YXR1c1NlcnZpY2Uuc3RhdHVzKCkuc3RhdGUgPT09ICdyZWNvbm5lY3Rpb24tc3RhcnQnIHx8XG4gICAgICB0aGlzLmZsb3dTdGF0dXNTZXJ2aWNlLnN0YXR1cygpLnN0YXRlID09PSAncmVjb25uZWN0aW9uLXZhbGlkYXRpb24nLFxuICApO1xuXG4gIHByb3RlY3RlZCB0b29sYmFycyA9IGNvbXB1dGVkKCgpID0+IHRoaXMub3ZlcmxheXNTZXJ2aWNlLm5vZGVUb29sYmFyc01hcCgpLmdldCh0aGlzLm1vZGVsKCkpKTtcblxuICBwdWJsaWMgbmdPbkluaXQoKSB7XG4gICAgdGhpcy5tb2RlbCgpLmlzVmlzaWJsZS5zZXQodHJ1ZSk7XG5cbiAgICB0aGlzLm5vZGVBY2Nlc3Nvci5tb2RlbC5zZXQodGhpcy5tb2RlbCgpKTtcbiAgICB0aGlzLmhhbmRsZVNlcnZpY2Uubm9kZS5zZXQodGhpcy5tb2RlbCgpKTtcblxuICAgIGVmZmVjdChcbiAgICAgICgpID0+IHtcbiAgICAgICAgaWYgKHRoaXMubW9kZWwoKS5kcmFnZ2FibGUoKSkge1xuICAgICAgICAgIHRoaXMuZHJhZ2dhYmxlU2VydmljZS5lbmFibGUodGhpcy5ob3N0UmVmLm5hdGl2ZUVsZW1lbnQsIHRoaXMubW9kZWwoKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5kcmFnZ2FibGVTZXJ2aWNlLmRpc2FibGUodGhpcy5ob3N0UmVmLm5hdGl2ZUVsZW1lbnQpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgeyBpbmplY3RvcjogdGhpcy5pbmplY3RvciB9LFxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5tb2RlbCgpLmlzVmlzaWJsZS5zZXQoZmFsc2UpO1xuXG4gICAgdGhpcy5kcmFnZ2FibGVTZXJ2aWNlLmRlc3Ryb3kodGhpcy5ob3N0UmVmLm5hdGl2ZUVsZW1lbnQpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHN0YXJ0Q29ubmVjdGlvbihldmVudDogRXZlbnQsIGhhbmRsZTogSGFuZGxlTW9kZWwpIHtcbiAgICAvLyBpZ25vcmUgZHJhZyBieSBzdG9wcGluZyBwcm9wYWdhdGlvblxuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuXG4gICAgdGhpcy5jb25uZWN0aW9uQ29udHJvbGxlcj8uc3RhcnRDb25uZWN0aW9uKGhhbmRsZSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgdmFsaWRhdGVDb25uZWN0aW9uKGhhbmRsZTogSGFuZGxlTW9kZWwpIHtcbiAgICB0aGlzLmNvbm5lY3Rpb25Db250cm9sbGVyPy52YWxpZGF0ZUNvbm5lY3Rpb24oaGFuZGxlKTtcbiAgfVxuXG4gIHByb3RlY3RlZCByZXNldFZhbGlkYXRlQ29ubmVjdGlvbih0YXJnZXRIYW5kbGU6IEhhbmRsZU1vZGVsKSB7XG4gICAgdGhpcy5jb25uZWN0aW9uQ29udHJvbGxlcj8ucmVzZXRWYWxpZGF0ZUNvbm5lY3Rpb24odGFyZ2V0SGFuZGxlKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBlbmRDb25uZWN0aW9uKCkge1xuICAgIHRoaXMuY29ubmVjdGlvbkNvbnRyb2xsZXI/LmVuZENvbm5lY3Rpb24oKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBwdWxsTm9kZSgpIHtcbiAgICBpZiAodGhpcy5mbG93U2V0dGluZ3NTZXJ2aWNlLmVsZXZhdGVOb2Rlc09uU2VsZWN0KCkpIHtcbiAgICAgIHRoaXMubm9kZVJlbmRlcmluZ1NlcnZpY2UucHVsbE5vZGUodGhpcy5tb2RlbCgpKTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgc2VsZWN0Tm9kZSgpIHtcbiAgICBpZiAodGhpcy5mbG93U2V0dGluZ3NTZXJ2aWNlLmVudGl0aWVzU2VsZWN0YWJsZSgpKSB7XG4gICAgICB0aGlzLnNlbGVjdGlvblNlcnZpY2Uuc2VsZWN0KHRoaXMubW9kZWwoKSk7XG4gICAgfVxuICB9XG59XG4iLCI8IS0tIERlZmF1bHQgbm9kZSAtLT5cbkBpZiAobW9kZWwoKS5yYXdOb2RlLnR5cGUgPT09ICdkZWZhdWx0Jykge1xuICA8c3ZnOmZvcmVpZ25PYmplY3RcbiAgICBjbGFzcz1cInNlbGVjdGFibGVcIlxuICAgIFthdHRyLndpZHRoXT1cIm1vZGVsKCkuZm9XaWR0aCgpXCJcbiAgICBbYXR0ci5oZWlnaHRdPVwibW9kZWwoKS5mb0hlaWdodCgpXCJcbiAgICAoY2xpY2spPVwicHVsbE5vZGUoKTsgc2VsZWN0Tm9kZSgpXCI+XG4gICAgPGRlZmF1bHQtbm9kZVxuICAgICAgbm9kZUhhbmRsZXNDb250cm9sbGVyXG4gICAgICBbc2VsZWN0ZWRdPVwibW9kZWwoKS5zZWxlY3RlZCgpXCJcbiAgICAgIFtzdHlsZS53aWR0aF09XCJtb2RlbCgpLnN0eWxlV2lkdGgoKVwiXG4gICAgICBbc3R5bGUuaGVpZ2h0XT1cIm1vZGVsKCkuc3R5bGVIZWlnaHQoKVwiXG4gICAgICBbc3R5bGUubWF4LXdpZHRoXT1cIm1vZGVsKCkuc3R5bGVXaWR0aCgpXCJcbiAgICAgIFtzdHlsZS5tYXgtaGVpZ2h0XT1cIm1vZGVsKCkuc3R5bGVIZWlnaHQoKVwiPlxuICAgICAgPGRpdiBbb3V0ZXJIVE1MXT1cIm1vZGVsKCkudGV4dCgpXCI+PC9kaXY+XG5cbiAgICAgIDxoYW5kbGUgdHlwZT1cInNvdXJjZVwiIHBvc2l0aW9uPVwicmlnaHRcIiAvPlxuICAgICAgPGhhbmRsZSB0eXBlPVwidGFyZ2V0XCIgcG9zaXRpb249XCJsZWZ0XCIgLz5cbiAgICA8L2RlZmF1bHQtbm9kZT5cbiAgPC9zdmc6Zm9yZWlnbk9iamVjdD5cbn1cblxuPCEtLSBIVE1MIFRlbXBsYXRlIG5vZGUgLS0+XG5AaWYgKG1vZGVsKCkucmF3Tm9kZS50eXBlID09PSAnaHRtbC10ZW1wbGF0ZScgJiYgbm9kZVRlbXBsYXRlKCkpIHtcbiAgPHN2Zzpmb3JlaWduT2JqZWN0XG4gICAgY2xhc3M9XCJzZWxlY3RhYmxlXCJcbiAgICBbYXR0ci53aWR0aF09XCJtb2RlbCgpLmZvV2lkdGgoKVwiXG4gICAgW2F0dHIuaGVpZ2h0XT1cIm1vZGVsKCkuZm9IZWlnaHQoKVwiXG4gICAgKGNsaWNrKT1cInB1bGxOb2RlKClcIj5cbiAgICA8ZGl2IG5vZGVIYW5kbGVzQ29udHJvbGxlciBub2RlUmVzaXplQ29udHJvbGxlciBjbGFzcz1cIndyYXBwZXJcIiBbc3R5bGUud2lkdGhdPVwibW9kZWwoKS5zdHlsZVdpZHRoKClcIj5cbiAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRdPVwibm9kZVRlbXBsYXRlKCkgPz8gbnVsbFwiXG4gICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJtb2RlbCgpLmNvbnRleHRcIlxuICAgICAgICBbbmdUZW1wbGF0ZU91dGxldEluamVjdG9yXT1cImluamVjdG9yXCIgLz5cbiAgICA8L2Rpdj5cbiAgPC9zdmc6Zm9yZWlnbk9iamVjdD5cbn1cblxuPCEtLSBTVkcgVGVtcGxhdGUgbm9kZSAtLT5cbkBpZiAobW9kZWwoKS5yYXdOb2RlLnR5cGUgPT09ICdzdmctdGVtcGxhdGUnICYmIG5vZGVTdmdUZW1wbGF0ZSgpKSB7XG4gIDxzdmc6ZyBjbGFzcz1cInNlbGVjdGFibGVcIiBub2RlSGFuZGxlc0NvbnRyb2xsZXIgKGNsaWNrKT1cInB1bGxOb2RlKClcIj5cbiAgICA8bmctY29udGFpbmVyXG4gICAgICBbbmdUZW1wbGF0ZU91dGxldF09XCJub2RlU3ZnVGVtcGxhdGUoKSA/PyBudWxsXCJcbiAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJtb2RlbCgpLmNvbnRleHRcIlxuICAgICAgW25nVGVtcGxhdGVPdXRsZXRJbmplY3Rvcl09XCJpbmplY3RvclwiIC8+XG4gIDwvc3ZnOmc+XG59XG5cbjwhLS0gQ29tcG9uZW50IG5vZGUgLS0+XG5AaWYgKG1vZGVsKCkuaXNDb21wb25lbnRUeXBlKSB7XG4gIDxzdmc6Zm9yZWlnbk9iamVjdFxuICAgIGNsYXNzPVwic2VsZWN0YWJsZVwiXG4gICAgW2F0dHIud2lkdGhdPVwibW9kZWwoKS5mb1dpZHRoKClcIlxuICAgIFthdHRyLmhlaWdodF09XCJtb2RlbCgpLmZvSGVpZ2h0KClcIlxuICAgIChjbGljayk9XCJwdWxsTm9kZSgpXCI+XG4gICAgPGRpdiBub2RlSGFuZGxlc0NvbnRyb2xsZXIgbm9kZVJlc2l6ZUNvbnRyb2xsZXIgY2xhc3M9XCJ3cmFwcGVyXCIgW3N0eWxlLndpZHRoXT1cIm1vZGVsKCkuc3R5bGVXaWR0aCgpXCI+XG4gICAgICA8bmctY29udGFpbmVyXG4gICAgICAgIFtuZ0NvbXBvbmVudE91dGxldF09XCIkYW55KG1vZGVsKCkucmF3Tm9kZS50eXBlKVwiXG4gICAgICAgIFtuZ0NvbXBvbmVudE91dGxldElucHV0c109XCJtb2RlbCgpLmNvbXBvbmVudFR5cGVJbnB1dHNcIlxuICAgICAgICBbbmdDb21wb25lbnRPdXRsZXRJbmplY3Rvcl09XCJpbmplY3RvclwiIC8+XG4gICAgPC9kaXY+XG4gIDwvc3ZnOmZvcmVpZ25PYmplY3Q+XG59XG5cbjwhLS0gRGVmYXVsdCBncm91cCBub2RlIC0tPlxuQGlmIChtb2RlbCgpLnJhd05vZGUudHlwZSA9PT0gJ2RlZmF1bHQtZ3JvdXAnKSB7XG4gIDxzdmc6cmVjdFxuICAgIGNsYXNzPVwiZGVmYXVsdC1ncm91cC1ub2RlXCJcbiAgICByeD1cIjVcIlxuICAgIHJ5PVwiNVwiXG4gICAgW3Jlc2l6YWJsZV09XCJtb2RlbCgpLnJlc2l6YWJsZSgpXCJcbiAgICBbZ2FwXT1cIjNcIlxuICAgIFtyZXNpemVyQ29sb3JdPVwibW9kZWwoKS5jb2xvcigpXCJcbiAgICBbY2xhc3MuZGVmYXVsdC1ncm91cC1ub2RlX3NlbGVjdGVkXT1cIm1vZGVsKCkuc2VsZWN0ZWQoKVwiXG4gICAgW2F0dHIud2lkdGhdPVwibW9kZWwoKS5zaXplKCkud2lkdGhcIlxuICAgIFthdHRyLmhlaWdodF09XCJtb2RlbCgpLnNpemUoKS5oZWlnaHRcIlxuICAgIFtzdHlsZS5zdHJva2VdPVwibW9kZWwoKS5jb2xvcigpXCJcbiAgICBbc3R5bGUuZmlsbF09XCJtb2RlbCgpLmNvbG9yKClcIlxuICAgIChjbGljayk9XCJwdWxsTm9kZSgpOyBzZWxlY3ROb2RlKClcIiAvPlxufVxuXG48IS0tIFRlbXBsYXRlIGdyb3VwIG5vZGUgIC0tPlxuQGlmIChtb2RlbCgpLnJhd05vZGUudHlwZSA9PT0gJ3RlbXBsYXRlLWdyb3VwJyAmJiBncm91cE5vZGVUZW1wbGF0ZSgpKSB7XG4gIDxzdmc6ZyBjbGFzcz1cInNlbGVjdGFibGVcIiBub2RlSGFuZGxlc0NvbnRyb2xsZXIgKGNsaWNrKT1cInB1bGxOb2RlKClcIj5cbiAgICA8bmctY29udGFpbmVyXG4gICAgICBbbmdUZW1wbGF0ZU91dGxldF09XCJncm91cE5vZGVUZW1wbGF0ZSgpID8/IG51bGxcIlxuICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cIm1vZGVsKCkuY29udGV4dFwiXG4gICAgICBbbmdUZW1wbGF0ZU91dGxldEluamVjdG9yXT1cImluamVjdG9yXCIgLz5cbiAgPC9zdmc6Zz5cbn1cblxuPCEtLSBSZXNpemVyIC0tPlxuQGlmIChtb2RlbCgpLnJlc2l6ZXJUZW1wbGF0ZSgpOyBhcyB0ZW1wbGF0ZSkge1xuICBAaWYgKG1vZGVsKCkucmVzaXphYmxlKCkpIHtcbiAgICA8bmctdGVtcGxhdGUgW25nVGVtcGxhdGVPdXRsZXRdPVwidGVtcGxhdGVcIiAvPlxuICB9XG59XG5cbjwhLS0gSGFuZGxlcyAtLT5cbkBmb3IgKGhhbmRsZSBvZiBtb2RlbCgpLmhhbmRsZXMoKTsgdHJhY2sgaGFuZGxlKSB7XG4gIEBpZiAoaGFuZGxlLnRlbXBsYXRlID09PSB1bmRlZmluZWQpIHtcbiAgICA8c3ZnOmNpcmNsZVxuICAgICAgY2xhc3M9XCJkZWZhdWx0LWhhbmRsZVwiXG4gICAgICByPVwiNVwiXG4gICAgICBbYXR0ci5jeF09XCJoYW5kbGUuaG9zdE9mZnNldCgpLnhcIlxuICAgICAgW2F0dHIuY3ldPVwiaGFuZGxlLmhvc3RPZmZzZXQoKS55XCJcbiAgICAgIFthdHRyLnN0cm9rZS13aWR0aF09XCJoYW5kbGUuc3Ryb2tlV2lkdGhcIlxuICAgICAgKHBvaW50ZXJTdGFydCk9XCJzdGFydENvbm5lY3Rpb24oJGV2ZW50LCBoYW5kbGUpXCJcbiAgICAgIChwb2ludGVyRW5kKT1cImVuZENvbm5lY3Rpb24oKVwiIC8+XG4gIH1cblxuICBAaWYgKGhhbmRsZS50ZW1wbGF0ZSA9PT0gbnVsbCkge1xuICAgIDxzdmc6Z1xuICAgICAgW2hhbmRsZVNpemVDb250cm9sbGVyXT1cImhhbmRsZVwiXG4gICAgICAocG9pbnRlclN0YXJ0KT1cInN0YXJ0Q29ubmVjdGlvbigkZXZlbnQsIGhhbmRsZSlcIlxuICAgICAgKHBvaW50ZXJFbmQpPVwiZW5kQ29ubmVjdGlvbigpXCIgLz5cbiAgfVxuXG4gIEBpZiAoaGFuZGxlLnRlbXBsYXRlKSB7XG4gICAgPHN2ZzpnXG4gICAgICBbaGFuZGxlU2l6ZUNvbnRyb2xsZXJdPVwiaGFuZGxlXCJcbiAgICAgIChwb2ludGVyU3RhcnQpPVwic3RhcnRDb25uZWN0aW9uKCRldmVudCwgaGFuZGxlKVwiXG4gICAgICAocG9pbnRlckVuZCk9XCJlbmRDb25uZWN0aW9uKClcIj5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJoYW5kbGUudGVtcGxhdGU7IGNvbnRleHQ6IGhhbmRsZS50ZW1wbGF0ZUNvbnRleHRcIiAvPlxuICAgIDwvc3ZnOmc+XG4gIH1cblxuICBAaWYgKHNob3dNYWduZXQoKSkge1xuICAgIDxzdmc6Y2lyY2xlXG4gICAgICBjbGFzcz1cIm1hZ25ldFwiXG4gICAgICBbYXR0ci5yXT1cIm1vZGVsKCkubWFnbmV0UmFkaXVzXCJcbiAgICAgIFthdHRyLmN4XT1cImhhbmRsZS5ob3N0T2Zmc2V0KCkueFwiXG4gICAgICBbYXR0ci5jeV09XCJoYW5kbGUuaG9zdE9mZnNldCgpLnlcIlxuICAgICAgKHBvaW50ZXJFbmQpPVwiZW5kQ29ubmVjdGlvbigpOyByZXNldFZhbGlkYXRlQ29ubmVjdGlvbihoYW5kbGUpXCJcbiAgICAgIChwb2ludGVyT3Zlcik9XCJ2YWxpZGF0ZUNvbm5lY3Rpb24oaGFuZGxlKVwiXG4gICAgICAocG9pbnRlck91dCk9XCJyZXNldFZhbGlkYXRlQ29ubmVjdGlvbihoYW5kbGUpXCIgLz5cbiAgfVxufVxuXG48IS0tIFRvb2xiYXIgLS0+XG5AZm9yICh0b29sYmFyIG9mIHRvb2xiYXJzKCk7IHRyYWNrIHRvb2xiYXIpIHtcbiAgPHN2Zzpmb3JlaWduT2JqZWN0XG4gICAgW2F0dHIud2lkdGhdPVwidG9vbGJhci5zaXplKCkud2lkdGhcIlxuICAgIFthdHRyLmhlaWdodF09XCJ0b29sYmFyLnNpemUoKS5oZWlnaHRcIlxuICAgIFthdHRyLnRyYW5zZm9ybV09XCJ0b29sYmFyLnRyYW5zZm9ybSgpXCI+XG4gICAgPG5nLWNvbnRhaW5lciBbbmdUZW1wbGF0ZU91dGxldF09XCJ0b29sYmFyLnRlbXBsYXRlKClcIiAvPlxuICA8L3N2Zzpmb3JlaWduT2JqZWN0PlxufVxuIl19
@@ -3198,7 +3198,7 @@ class NodeComponent {
3198
3198
  }
3199
3199
  }
3200
3200
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: NodeComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
3201
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: NodeComponent, isStandalone: true, selector: "g[node]", inputs: { model: { classPropertyName: "model", publicName: "model", isSignal: true, isRequired: true, transformFunction: null }, nodeTemplate: { classPropertyName: "nodeTemplate", publicName: "nodeTemplate", isSignal: true, isRequired: false, transformFunction: null }, nodeSvgTemplate: { classPropertyName: "nodeSvgTemplate", publicName: "nodeSvgTemplate", isSignal: true, isRequired: false, transformFunction: null }, groupNodeTemplate: { classPropertyName: "groupNodeTemplate", publicName: "groupNodeTemplate", isSignal: true, isRequired: false, transformFunction: null } }, host: { classAttribute: "vflow-node" }, providers: [HandleService, NodeAccessorService], ngImport: i0, template: "<!-- Default node -->\n@if (model().rawNode.type === 'default') {\n <svg:foreignObject\n class=\"selectable\"\n [attr.width]=\"model().foWidth()\"\n [attr.height]=\"model().foHeight()\"\n (click)=\"pullNode(); selectNode()\">\n <default-node\n nodeHandlesController\n [selected]=\"model().selected()\"\n [style.width]=\"model().styleWidth()\"\n [style.height]=\"model().styleHeight()\"\n [style.max-width]=\"model().styleWidth()\"\n [style.max-height]=\"model().styleHeight()\">\n <div [outerHTML]=\"model().text()\"></div>\n\n <handle type=\"source\" position=\"right\" />\n <handle type=\"target\" position=\"left\" />\n </default-node>\n </svg:foreignObject>\n}\n\n<!-- HTML Template node -->\n@if (model().rawNode.type === 'html-template' && nodeTemplate()) {\n <svg:foreignObject\n class=\"selectable\"\n [attr.width]=\"model().foWidth()\"\n [attr.height]=\"model().foHeight()\"\n (click)=\"pullNode()\">\n <div\n nodeHandlesController\n nodeResizeController\n class=\"wrapper\"\n [style.width]=\"model().styleWidth()\"\n [style.height]=\"model().styleHeight()\">\n <ng-container\n [ngTemplateOutlet]=\"nodeTemplate() ?? null\"\n [ngTemplateOutletContext]=\"model().context\"\n [ngTemplateOutletInjector]=\"injector\" />\n </div>\n </svg:foreignObject>\n}\n\n<!-- SVG Template node -->\n@if (model().rawNode.type === 'svg-template' && nodeSvgTemplate()) {\n <svg:g class=\"selectable\" nodeHandlesController (click)=\"pullNode()\">\n <ng-container\n [ngTemplateOutlet]=\"nodeSvgTemplate() ?? null\"\n [ngTemplateOutletContext]=\"model().context\"\n [ngTemplateOutletInjector]=\"injector\" />\n </svg:g>\n}\n\n<!-- Component node -->\n@if (model().isComponentType) {\n <svg:foreignObject\n class=\"selectable\"\n [attr.width]=\"model().foWidth()\"\n [attr.height]=\"model().foHeight()\"\n (click)=\"pullNode()\">\n <div\n nodeHandlesController\n nodeResizeController\n class=\"wrapper\"\n [style.width]=\"model().styleWidth()\"\n [style.height]=\"model().styleHeight()\">\n <ng-container\n [ngComponentOutlet]=\"$any(model().rawNode.type)\"\n [ngComponentOutletInputs]=\"model().componentTypeInputs\"\n [ngComponentOutletInjector]=\"injector\" />\n </div>\n </svg:foreignObject>\n}\n\n<!-- Default group node -->\n@if (model().rawNode.type === 'default-group') {\n <svg:rect\n class=\"default-group-node\"\n rx=\"5\"\n ry=\"5\"\n [resizable]=\"model().resizable()\"\n [gap]=\"3\"\n [resizerColor]=\"model().color()\"\n [class.default-group-node_selected]=\"model().selected()\"\n [attr.width]=\"model().size().width\"\n [attr.height]=\"model().size().height\"\n [style.stroke]=\"model().color()\"\n [style.fill]=\"model().color()\"\n (click)=\"pullNode(); selectNode()\" />\n}\n\n<!-- Template group node -->\n@if (model().rawNode.type === 'template-group' && groupNodeTemplate()) {\n <svg:g class=\"selectable\" nodeHandlesController (click)=\"pullNode()\">\n <ng-container\n [ngTemplateOutlet]=\"groupNodeTemplate() ?? null\"\n [ngTemplateOutletContext]=\"model().context\"\n [ngTemplateOutletInjector]=\"injector\" />\n </svg:g>\n}\n\n<!-- Resizer -->\n@if (model().resizerTemplate(); as template) {\n @if (model().resizable()) {\n <ng-template [ngTemplateOutlet]=\"template\" />\n }\n}\n\n<!-- Handles -->\n@for (handle of model().handles(); track handle) {\n @if (handle.template === undefined) {\n <svg:circle\n class=\"default-handle\"\n r=\"5\"\n [attr.cx]=\"handle.hostOffset().x\"\n [attr.cy]=\"handle.hostOffset().y\"\n [attr.stroke-width]=\"handle.strokeWidth\"\n (pointerStart)=\"startConnection($event, handle)\"\n (pointerEnd)=\"endConnection()\" />\n }\n\n @if (handle.template === null) {\n <svg:g\n [handleSizeController]=\"handle\"\n (pointerStart)=\"startConnection($event, handle)\"\n (pointerEnd)=\"endConnection()\" />\n }\n\n @if (handle.template) {\n <svg:g\n [handleSizeController]=\"handle\"\n (pointerStart)=\"startConnection($event, handle)\"\n (pointerEnd)=\"endConnection()\">\n <ng-container *ngTemplateOutlet=\"handle.template; context: handle.templateContext\" />\n </svg:g>\n }\n\n @if (showMagnet()) {\n <svg:circle\n class=\"magnet\"\n [attr.r]=\"model().magnetRadius\"\n [attr.cx]=\"handle.hostOffset().x\"\n [attr.cy]=\"handle.hostOffset().y\"\n (pointerEnd)=\"endConnection(); resetValidateConnection(handle)\"\n (pointerOver)=\"validateConnection(handle)\"\n (pointerOut)=\"resetValidateConnection(handle)\" />\n }\n}\n\n<!-- Toolbar -->\n@for (toolbar of toolbars(); track toolbar) {\n <svg:foreignObject\n [attr.width]=\"toolbar.size().width\"\n [attr.height]=\"toolbar.size().height\"\n [attr.transform]=\"toolbar.transform()\">\n <ng-container [ngTemplateOutlet]=\"toolbar.template()\" />\n </svg:foreignObject>\n}\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: PointerDirective, selector: "[pointerStart], [pointerEnd], [pointerOver], [pointerOut]", outputs: ["pointerOver", "pointerOut", "pointerStart", "pointerEnd"] }, { kind: "component", type: DefaultNodeComponent, selector: "default-node", inputs: ["selected"] }, { kind: "component", type: HandleComponent, selector: "handle", inputs: ["position", "type", "id", "template", "offsetX", "offsetY"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: NgComponentOutlet, selector: "[ngComponentOutlet]", inputs: ["ngComponentOutlet", "ngComponentOutletInputs", "ngComponentOutletInjector", "ngComponentOutletContent", "ngComponentOutletNgModule", "ngComponentOutletNgModuleFactory"] }, { kind: "component", type: ResizableComponent, selector: "[resizable]", inputs: ["resizable", "resizerColor", "gap"] }, { kind: "directive", type: HandleSizeControllerDirective, selector: "[handleSizeController]", inputs: ["handleSizeController"] }, { kind: "directive", type: NodeHandlesControllerDirective, selector: "[nodeHandlesController]" }, { kind: "directive", type: NodeResizeControllerDirective, selector: "[nodeResizeController]" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
3201
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: NodeComponent, isStandalone: true, selector: "g[node]", inputs: { model: { classPropertyName: "model", publicName: "model", isSignal: true, isRequired: true, transformFunction: null }, nodeTemplate: { classPropertyName: "nodeTemplate", publicName: "nodeTemplate", isSignal: true, isRequired: false, transformFunction: null }, nodeSvgTemplate: { classPropertyName: "nodeSvgTemplate", publicName: "nodeSvgTemplate", isSignal: true, isRequired: false, transformFunction: null }, groupNodeTemplate: { classPropertyName: "groupNodeTemplate", publicName: "groupNodeTemplate", isSignal: true, isRequired: false, transformFunction: null } }, host: { classAttribute: "vflow-node" }, providers: [HandleService, NodeAccessorService], ngImport: i0, template: "<!-- Default node -->\n@if (model().rawNode.type === 'default') {\n <svg:foreignObject\n class=\"selectable\"\n [attr.width]=\"model().foWidth()\"\n [attr.height]=\"model().foHeight()\"\n (click)=\"pullNode(); selectNode()\">\n <default-node\n nodeHandlesController\n [selected]=\"model().selected()\"\n [style.width]=\"model().styleWidth()\"\n [style.height]=\"model().styleHeight()\"\n [style.max-width]=\"model().styleWidth()\"\n [style.max-height]=\"model().styleHeight()\">\n <div [outerHTML]=\"model().text()\"></div>\n\n <handle type=\"source\" position=\"right\" />\n <handle type=\"target\" position=\"left\" />\n </default-node>\n </svg:foreignObject>\n}\n\n<!-- HTML Template node -->\n@if (model().rawNode.type === 'html-template' && nodeTemplate()) {\n <svg:foreignObject\n class=\"selectable\"\n [attr.width]=\"model().foWidth()\"\n [attr.height]=\"model().foHeight()\"\n (click)=\"pullNode()\">\n <div nodeHandlesController nodeResizeController class=\"wrapper\" [style.width]=\"model().styleWidth()\">\n <ng-container\n [ngTemplateOutlet]=\"nodeTemplate() ?? null\"\n [ngTemplateOutletContext]=\"model().context\"\n [ngTemplateOutletInjector]=\"injector\" />\n </div>\n </svg:foreignObject>\n}\n\n<!-- SVG Template node -->\n@if (model().rawNode.type === 'svg-template' && nodeSvgTemplate()) {\n <svg:g class=\"selectable\" nodeHandlesController (click)=\"pullNode()\">\n <ng-container\n [ngTemplateOutlet]=\"nodeSvgTemplate() ?? null\"\n [ngTemplateOutletContext]=\"model().context\"\n [ngTemplateOutletInjector]=\"injector\" />\n </svg:g>\n}\n\n<!-- Component node -->\n@if (model().isComponentType) {\n <svg:foreignObject\n class=\"selectable\"\n [attr.width]=\"model().foWidth()\"\n [attr.height]=\"model().foHeight()\"\n (click)=\"pullNode()\">\n <div nodeHandlesController nodeResizeController class=\"wrapper\" [style.width]=\"model().styleWidth()\">\n <ng-container\n [ngComponentOutlet]=\"$any(model().rawNode.type)\"\n [ngComponentOutletInputs]=\"model().componentTypeInputs\"\n [ngComponentOutletInjector]=\"injector\" />\n </div>\n </svg:foreignObject>\n}\n\n<!-- Default group node -->\n@if (model().rawNode.type === 'default-group') {\n <svg:rect\n class=\"default-group-node\"\n rx=\"5\"\n ry=\"5\"\n [resizable]=\"model().resizable()\"\n [gap]=\"3\"\n [resizerColor]=\"model().color()\"\n [class.default-group-node_selected]=\"model().selected()\"\n [attr.width]=\"model().size().width\"\n [attr.height]=\"model().size().height\"\n [style.stroke]=\"model().color()\"\n [style.fill]=\"model().color()\"\n (click)=\"pullNode(); selectNode()\" />\n}\n\n<!-- Template group node -->\n@if (model().rawNode.type === 'template-group' && groupNodeTemplate()) {\n <svg:g class=\"selectable\" nodeHandlesController (click)=\"pullNode()\">\n <ng-container\n [ngTemplateOutlet]=\"groupNodeTemplate() ?? null\"\n [ngTemplateOutletContext]=\"model().context\"\n [ngTemplateOutletInjector]=\"injector\" />\n </svg:g>\n}\n\n<!-- Resizer -->\n@if (model().resizerTemplate(); as template) {\n @if (model().resizable()) {\n <ng-template [ngTemplateOutlet]=\"template\" />\n }\n}\n\n<!-- Handles -->\n@for (handle of model().handles(); track handle) {\n @if (handle.template === undefined) {\n <svg:circle\n class=\"default-handle\"\n r=\"5\"\n [attr.cx]=\"handle.hostOffset().x\"\n [attr.cy]=\"handle.hostOffset().y\"\n [attr.stroke-width]=\"handle.strokeWidth\"\n (pointerStart)=\"startConnection($event, handle)\"\n (pointerEnd)=\"endConnection()\" />\n }\n\n @if (handle.template === null) {\n <svg:g\n [handleSizeController]=\"handle\"\n (pointerStart)=\"startConnection($event, handle)\"\n (pointerEnd)=\"endConnection()\" />\n }\n\n @if (handle.template) {\n <svg:g\n [handleSizeController]=\"handle\"\n (pointerStart)=\"startConnection($event, handle)\"\n (pointerEnd)=\"endConnection()\">\n <ng-container *ngTemplateOutlet=\"handle.template; context: handle.templateContext\" />\n </svg:g>\n }\n\n @if (showMagnet()) {\n <svg:circle\n class=\"magnet\"\n [attr.r]=\"model().magnetRadius\"\n [attr.cx]=\"handle.hostOffset().x\"\n [attr.cy]=\"handle.hostOffset().y\"\n (pointerEnd)=\"endConnection(); resetValidateConnection(handle)\"\n (pointerOver)=\"validateConnection(handle)\"\n (pointerOut)=\"resetValidateConnection(handle)\" />\n }\n}\n\n<!-- Toolbar -->\n@for (toolbar of toolbars(); track toolbar) {\n <svg:foreignObject\n [attr.width]=\"toolbar.size().width\"\n [attr.height]=\"toolbar.size().height\"\n [attr.transform]=\"toolbar.transform()\">\n <ng-container [ngTemplateOutlet]=\"toolbar.template()\" />\n </svg:foreignObject>\n}\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: PointerDirective, selector: "[pointerStart], [pointerEnd], [pointerOver], [pointerOut]", outputs: ["pointerOver", "pointerOut", "pointerStart", "pointerEnd"] }, { kind: "component", type: DefaultNodeComponent, selector: "default-node", inputs: ["selected"] }, { kind: "component", type: HandleComponent, selector: "handle", inputs: ["position", "type", "id", "template", "offsetX", "offsetY"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: NgComponentOutlet, selector: "[ngComponentOutlet]", inputs: ["ngComponentOutlet", "ngComponentOutletInputs", "ngComponentOutletInjector", "ngComponentOutletContent", "ngComponentOutletNgModule", "ngComponentOutletNgModuleFactory"] }, { kind: "component", type: ResizableComponent, selector: "[resizable]", inputs: ["resizable", "resizerColor", "gap"] }, { kind: "directive", type: HandleSizeControllerDirective, selector: "[handleSizeController]", inputs: ["handleSizeController"] }, { kind: "directive", type: NodeHandlesControllerDirective, selector: "[nodeHandlesController]" }, { kind: "directive", type: NodeResizeControllerDirective, selector: "[nodeResizeController]" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
3202
3202
  }
3203
3203
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: NodeComponent, decorators: [{
3204
3204
  type: Component,
@@ -3214,7 +3214,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
3214
3214
  HandleSizeControllerDirective,
3215
3215
  NodeHandlesControllerDirective,
3216
3216
  NodeResizeControllerDirective,
3217
- ], template: "<!-- Default node -->\n@if (model().rawNode.type === 'default') {\n <svg:foreignObject\n class=\"selectable\"\n [attr.width]=\"model().foWidth()\"\n [attr.height]=\"model().foHeight()\"\n (click)=\"pullNode(); selectNode()\">\n <default-node\n nodeHandlesController\n [selected]=\"model().selected()\"\n [style.width]=\"model().styleWidth()\"\n [style.height]=\"model().styleHeight()\"\n [style.max-width]=\"model().styleWidth()\"\n [style.max-height]=\"model().styleHeight()\">\n <div [outerHTML]=\"model().text()\"></div>\n\n <handle type=\"source\" position=\"right\" />\n <handle type=\"target\" position=\"left\" />\n </default-node>\n </svg:foreignObject>\n}\n\n<!-- HTML Template node -->\n@if (model().rawNode.type === 'html-template' && nodeTemplate()) {\n <svg:foreignObject\n class=\"selectable\"\n [attr.width]=\"model().foWidth()\"\n [attr.height]=\"model().foHeight()\"\n (click)=\"pullNode()\">\n <div\n nodeHandlesController\n nodeResizeController\n class=\"wrapper\"\n [style.width]=\"model().styleWidth()\"\n [style.height]=\"model().styleHeight()\">\n <ng-container\n [ngTemplateOutlet]=\"nodeTemplate() ?? null\"\n [ngTemplateOutletContext]=\"model().context\"\n [ngTemplateOutletInjector]=\"injector\" />\n </div>\n </svg:foreignObject>\n}\n\n<!-- SVG Template node -->\n@if (model().rawNode.type === 'svg-template' && nodeSvgTemplate()) {\n <svg:g class=\"selectable\" nodeHandlesController (click)=\"pullNode()\">\n <ng-container\n [ngTemplateOutlet]=\"nodeSvgTemplate() ?? null\"\n [ngTemplateOutletContext]=\"model().context\"\n [ngTemplateOutletInjector]=\"injector\" />\n </svg:g>\n}\n\n<!-- Component node -->\n@if (model().isComponentType) {\n <svg:foreignObject\n class=\"selectable\"\n [attr.width]=\"model().foWidth()\"\n [attr.height]=\"model().foHeight()\"\n (click)=\"pullNode()\">\n <div\n nodeHandlesController\n nodeResizeController\n class=\"wrapper\"\n [style.width]=\"model().styleWidth()\"\n [style.height]=\"model().styleHeight()\">\n <ng-container\n [ngComponentOutlet]=\"$any(model().rawNode.type)\"\n [ngComponentOutletInputs]=\"model().componentTypeInputs\"\n [ngComponentOutletInjector]=\"injector\" />\n </div>\n </svg:foreignObject>\n}\n\n<!-- Default group node -->\n@if (model().rawNode.type === 'default-group') {\n <svg:rect\n class=\"default-group-node\"\n rx=\"5\"\n ry=\"5\"\n [resizable]=\"model().resizable()\"\n [gap]=\"3\"\n [resizerColor]=\"model().color()\"\n [class.default-group-node_selected]=\"model().selected()\"\n [attr.width]=\"model().size().width\"\n [attr.height]=\"model().size().height\"\n [style.stroke]=\"model().color()\"\n [style.fill]=\"model().color()\"\n (click)=\"pullNode(); selectNode()\" />\n}\n\n<!-- Template group node -->\n@if (model().rawNode.type === 'template-group' && groupNodeTemplate()) {\n <svg:g class=\"selectable\" nodeHandlesController (click)=\"pullNode()\">\n <ng-container\n [ngTemplateOutlet]=\"groupNodeTemplate() ?? null\"\n [ngTemplateOutletContext]=\"model().context\"\n [ngTemplateOutletInjector]=\"injector\" />\n </svg:g>\n}\n\n<!-- Resizer -->\n@if (model().resizerTemplate(); as template) {\n @if (model().resizable()) {\n <ng-template [ngTemplateOutlet]=\"template\" />\n }\n}\n\n<!-- Handles -->\n@for (handle of model().handles(); track handle) {\n @if (handle.template === undefined) {\n <svg:circle\n class=\"default-handle\"\n r=\"5\"\n [attr.cx]=\"handle.hostOffset().x\"\n [attr.cy]=\"handle.hostOffset().y\"\n [attr.stroke-width]=\"handle.strokeWidth\"\n (pointerStart)=\"startConnection($event, handle)\"\n (pointerEnd)=\"endConnection()\" />\n }\n\n @if (handle.template === null) {\n <svg:g\n [handleSizeController]=\"handle\"\n (pointerStart)=\"startConnection($event, handle)\"\n (pointerEnd)=\"endConnection()\" />\n }\n\n @if (handle.template) {\n <svg:g\n [handleSizeController]=\"handle\"\n (pointerStart)=\"startConnection($event, handle)\"\n (pointerEnd)=\"endConnection()\">\n <ng-container *ngTemplateOutlet=\"handle.template; context: handle.templateContext\" />\n </svg:g>\n }\n\n @if (showMagnet()) {\n <svg:circle\n class=\"magnet\"\n [attr.r]=\"model().magnetRadius\"\n [attr.cx]=\"handle.hostOffset().x\"\n [attr.cy]=\"handle.hostOffset().y\"\n (pointerEnd)=\"endConnection(); resetValidateConnection(handle)\"\n (pointerOver)=\"validateConnection(handle)\"\n (pointerOut)=\"resetValidateConnection(handle)\" />\n }\n}\n\n<!-- Toolbar -->\n@for (toolbar of toolbars(); track toolbar) {\n <svg:foreignObject\n [attr.width]=\"toolbar.size().width\"\n [attr.height]=\"toolbar.size().height\"\n [attr.transform]=\"toolbar.transform()\">\n <ng-container [ngTemplateOutlet]=\"toolbar.template()\" />\n </svg:foreignObject>\n}\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"] }]
3217
+ ], template: "<!-- Default node -->\n@if (model().rawNode.type === 'default') {\n <svg:foreignObject\n class=\"selectable\"\n [attr.width]=\"model().foWidth()\"\n [attr.height]=\"model().foHeight()\"\n (click)=\"pullNode(); selectNode()\">\n <default-node\n nodeHandlesController\n [selected]=\"model().selected()\"\n [style.width]=\"model().styleWidth()\"\n [style.height]=\"model().styleHeight()\"\n [style.max-width]=\"model().styleWidth()\"\n [style.max-height]=\"model().styleHeight()\">\n <div [outerHTML]=\"model().text()\"></div>\n\n <handle type=\"source\" position=\"right\" />\n <handle type=\"target\" position=\"left\" />\n </default-node>\n </svg:foreignObject>\n}\n\n<!-- HTML Template node -->\n@if (model().rawNode.type === 'html-template' && nodeTemplate()) {\n <svg:foreignObject\n class=\"selectable\"\n [attr.width]=\"model().foWidth()\"\n [attr.height]=\"model().foHeight()\"\n (click)=\"pullNode()\">\n <div nodeHandlesController nodeResizeController class=\"wrapper\" [style.width]=\"model().styleWidth()\">\n <ng-container\n [ngTemplateOutlet]=\"nodeTemplate() ?? null\"\n [ngTemplateOutletContext]=\"model().context\"\n [ngTemplateOutletInjector]=\"injector\" />\n </div>\n </svg:foreignObject>\n}\n\n<!-- SVG Template node -->\n@if (model().rawNode.type === 'svg-template' && nodeSvgTemplate()) {\n <svg:g class=\"selectable\" nodeHandlesController (click)=\"pullNode()\">\n <ng-container\n [ngTemplateOutlet]=\"nodeSvgTemplate() ?? null\"\n [ngTemplateOutletContext]=\"model().context\"\n [ngTemplateOutletInjector]=\"injector\" />\n </svg:g>\n}\n\n<!-- Component node -->\n@if (model().isComponentType) {\n <svg:foreignObject\n class=\"selectable\"\n [attr.width]=\"model().foWidth()\"\n [attr.height]=\"model().foHeight()\"\n (click)=\"pullNode()\">\n <div nodeHandlesController nodeResizeController class=\"wrapper\" [style.width]=\"model().styleWidth()\">\n <ng-container\n [ngComponentOutlet]=\"$any(model().rawNode.type)\"\n [ngComponentOutletInputs]=\"model().componentTypeInputs\"\n [ngComponentOutletInjector]=\"injector\" />\n </div>\n </svg:foreignObject>\n}\n\n<!-- Default group node -->\n@if (model().rawNode.type === 'default-group') {\n <svg:rect\n class=\"default-group-node\"\n rx=\"5\"\n ry=\"5\"\n [resizable]=\"model().resizable()\"\n [gap]=\"3\"\n [resizerColor]=\"model().color()\"\n [class.default-group-node_selected]=\"model().selected()\"\n [attr.width]=\"model().size().width\"\n [attr.height]=\"model().size().height\"\n [style.stroke]=\"model().color()\"\n [style.fill]=\"model().color()\"\n (click)=\"pullNode(); selectNode()\" />\n}\n\n<!-- Template group node -->\n@if (model().rawNode.type === 'template-group' && groupNodeTemplate()) {\n <svg:g class=\"selectable\" nodeHandlesController (click)=\"pullNode()\">\n <ng-container\n [ngTemplateOutlet]=\"groupNodeTemplate() ?? null\"\n [ngTemplateOutletContext]=\"model().context\"\n [ngTemplateOutletInjector]=\"injector\" />\n </svg:g>\n}\n\n<!-- Resizer -->\n@if (model().resizerTemplate(); as template) {\n @if (model().resizable()) {\n <ng-template [ngTemplateOutlet]=\"template\" />\n }\n}\n\n<!-- Handles -->\n@for (handle of model().handles(); track handle) {\n @if (handle.template === undefined) {\n <svg:circle\n class=\"default-handle\"\n r=\"5\"\n [attr.cx]=\"handle.hostOffset().x\"\n [attr.cy]=\"handle.hostOffset().y\"\n [attr.stroke-width]=\"handle.strokeWidth\"\n (pointerStart)=\"startConnection($event, handle)\"\n (pointerEnd)=\"endConnection()\" />\n }\n\n @if (handle.template === null) {\n <svg:g\n [handleSizeController]=\"handle\"\n (pointerStart)=\"startConnection($event, handle)\"\n (pointerEnd)=\"endConnection()\" />\n }\n\n @if (handle.template) {\n <svg:g\n [handleSizeController]=\"handle\"\n (pointerStart)=\"startConnection($event, handle)\"\n (pointerEnd)=\"endConnection()\">\n <ng-container *ngTemplateOutlet=\"handle.template; context: handle.templateContext\" />\n </svg:g>\n }\n\n @if (showMagnet()) {\n <svg:circle\n class=\"magnet\"\n [attr.r]=\"model().magnetRadius\"\n [attr.cx]=\"handle.hostOffset().x\"\n [attr.cy]=\"handle.hostOffset().y\"\n (pointerEnd)=\"endConnection(); resetValidateConnection(handle)\"\n (pointerOver)=\"validateConnection(handle)\"\n (pointerOut)=\"resetValidateConnection(handle)\" />\n }\n}\n\n<!-- Toolbar -->\n@for (toolbar of toolbars(); track toolbar) {\n <svg:foreignObject\n [attr.width]=\"toolbar.size().width\"\n [attr.height]=\"toolbar.size().height\"\n [attr.transform]=\"toolbar.transform()\">\n <ng-container [ngTemplateOutlet]=\"toolbar.template()\" />\n </svg:foreignObject>\n}\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"] }]
3218
3218
  }] });
3219
3219
 
3220
3220
  class ConnectionComponent {