@progressio_resources/gravity-design-system 2.1.9 → 2.2.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 (27) hide show
  1. package/esm2022/lib/components/gravity-tree-view/gravity-tree-view.component.mjs +62 -0
  2. package/esm2022/lib/components/gravity-tree-view/models/node-item.mjs +2 -0
  3. package/esm2022/lib/components/gravity-tree-view/models/node-selected-state.mjs +7 -0
  4. package/esm2022/lib/components/gravity-tree-view/models/node-state.mjs +2 -0
  5. package/esm2022/lib/components/gravity-tree-view/models/tree-callbacks.mjs +2 -0
  6. package/esm2022/lib/components/gravity-tree-view/node/node-checkbox/node-checkbox.component.mjs +26 -0
  7. package/esm2022/lib/components/gravity-tree-view/node/node-name/node-name.component.mjs +13 -0
  8. package/esm2022/lib/components/gravity-tree-view/node/node-toggle/node-toggle.component.mjs +15 -0
  9. package/esm2022/lib/components/gravity-tree-view/node/node.component.mjs +17 -0
  10. package/esm2022/lib/components/gravity-tree-view/service/tree-service.mjs +350 -0
  11. package/esm2022/lib/gravity-design-system.module.mjs +22 -5
  12. package/esm2022/public-api.mjs +2 -1
  13. package/fesm2022/progressio_resources-gravity-design-system.mjs +481 -5
  14. package/fesm2022/progressio_resources-gravity-design-system.mjs.map +1 -1
  15. package/lib/components/gravity-tree-view/gravity-tree-view.component.d.ts +19 -0
  16. package/lib/components/gravity-tree-view/models/node-item.d.ts +9 -0
  17. package/lib/components/gravity-tree-view/models/node-selected-state.d.ts +5 -0
  18. package/lib/components/gravity-tree-view/models/node-state.d.ts +13 -0
  19. package/lib/components/gravity-tree-view/models/tree-callbacks.d.ts +9 -0
  20. package/lib/components/gravity-tree-view/node/node-checkbox/node-checkbox.component.d.ts +11 -0
  21. package/lib/components/gravity-tree-view/node/node-name/node-name.component.d.ts +7 -0
  22. package/lib/components/gravity-tree-view/node/node-toggle/node-toggle.component.d.ts +7 -0
  23. package/lib/components/gravity-tree-view/node/node.component.d.ts +7 -0
  24. package/lib/components/gravity-tree-view/service/tree-service.d.ts +57 -0
  25. package/lib/gravity-design-system.module.d.ts +14 -9
  26. package/package.json +2 -3
  27. package/public-api.d.ts +1 -0
@@ -0,0 +1,62 @@
1
+ import { Component, EventEmitter, Input, Output } from '@angular/core';
2
+ import { TreeService } from "./service/tree-service";
3
+ import { timer } from "rxjs";
4
+ import * as i0 from "@angular/core";
5
+ import * as i1 from "./service/tree-service";
6
+ import * as i2 from "@angular/common";
7
+ import * as i3 from "./node/node.component";
8
+ export class GravityTreeViewComponent {
9
+ constructor(treeService) {
10
+ this.treeService = treeService;
11
+ this.selectedItems = new EventEmitter();
12
+ this.treeServiceSubscription = treeService.connect().subscribe((items) => {
13
+ const subscription = timer(0).subscribe(() => {
14
+ this.selectedItems.emit(items);
15
+ subscription.unsubscribe();
16
+ });
17
+ });
18
+ }
19
+ ngOnDestroy() {
20
+ this.treeServiceSubscription.unsubscribe();
21
+ }
22
+ ngOnChanges(changes) {
23
+ if (changes.callbacks) {
24
+ this.treeService.callbacks = this.callbacks;
25
+ }
26
+ if (changes.nodeItems) {
27
+ this.initialize();
28
+ }
29
+ }
30
+ initialize() {
31
+ this.treeService.callbacks = this.callbacks;
32
+ this.treeService.nodeItems = this.nodeItems;
33
+ this.treeService.treeState = this.initTreeStructure(null, this.treeService.nodeItems);
34
+ this.treeService.clear();
35
+ this.treeService.setInitialState();
36
+ }
37
+ initTreeStructure(parent, nodeItems) {
38
+ const treeStructure = [];
39
+ nodeItems.forEach((nodeItem) => {
40
+ const nodeState = TreeService.initState(parent, nodeItem);
41
+ if (nodeItem.children) {
42
+ nodeState.children = this.initTreeStructure(nodeState, nodeItem.children);
43
+ nodeState.filteredChildren = nodeState.children;
44
+ }
45
+ treeStructure.push(nodeState);
46
+ });
47
+ return treeStructure;
48
+ }
49
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: GravityTreeViewComponent, deps: [{ token: i1.TreeService }], target: i0.ɵɵFactoryTarget.Component }); }
50
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: GravityTreeViewComponent, selector: "gravity-tree-view", inputs: { callbacks: "callbacks", nodeItems: "nodeItems" }, outputs: { selectedItems: "selectedItems" }, providers: [TreeService], usesOnChanges: true, ngImport: i0, template: "<tree-node [nodeState]=\"state\" *ngFor=\"let state of treeService.treeState\"></tree-node>\n", styles: [""], dependencies: [{ kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "component", type: i3.NodeComponent, selector: "tree-node", inputs: ["nodeState"] }] }); }
51
+ }
52
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: GravityTreeViewComponent, decorators: [{
53
+ type: Component,
54
+ args: [{ selector: 'gravity-tree-view', providers: [TreeService], template: "<tree-node [nodeState]=\"state\" *ngFor=\"let state of treeService.treeState\"></tree-node>\n" }]
55
+ }], ctorParameters: function () { return [{ type: i1.TreeService }]; }, propDecorators: { callbacks: [{
56
+ type: Input
57
+ }], nodeItems: [{
58
+ type: Input
59
+ }], selectedItems: [{
60
+ type: Output
61
+ }] } });
62
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3Jhdml0eS10cmVlLXZpZXcuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZ3Jhdml0eS1kZXNpZ24tc3lzdGVtL3NyYy9saWIvY29tcG9uZW50cy9ncmF2aXR5LXRyZWUtdmlldy9ncmF2aXR5LXRyZWUtdmlldy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9ncmF2aXR5LWRlc2lnbi1zeXN0ZW0vc3JjL2xpYi9jb21wb25lbnRzL2dyYXZpdHktdHJlZS12aWV3L2dyYXZpdHktdHJlZS12aWV3LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxTQUFTLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBd0IsTUFBTSxFQUFnQixNQUFNLGVBQWUsQ0FBQztBQUMxRyxPQUFPLEVBQUMsV0FBVyxFQUFDLE1BQU0sd0JBQXdCLENBQUM7QUFDbkQsT0FBTyxFQUFlLEtBQUssRUFBQyxNQUFNLE1BQU0sQ0FBQzs7Ozs7QUFXekMsTUFBTSxPQUFPLHdCQUF3QjtJQU9uQyxZQUE0QixXQUF3QjtRQUF4QixnQkFBVyxHQUFYLFdBQVcsQ0FBYTtRQUYxQyxrQkFBYSxHQUFHLElBQUksWUFBWSxFQUFPLENBQUM7UUFHaEQsSUFBSSxDQUFDLHVCQUF1QixHQUFHLFdBQVcsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxLQUFZLEVBQUUsRUFBRTtZQUM5RSxNQUFNLFlBQVksR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRTtnQkFDM0MsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQy9CLFlBQVksQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUM3QixDQUFDLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELFdBQVc7UUFDVCxJQUFJLENBQUMsdUJBQXVCLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDN0MsQ0FBQztJQUVELFdBQVcsQ0FBQyxPQUFzQjtRQUNoQyxJQUFJLE9BQU8sQ0FBQyxTQUFTLEVBQUU7WUFDckIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQztTQUM3QztRQUVELElBQUksT0FBTyxDQUFDLFNBQVMsRUFBRTtZQUNyQixJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7U0FDbkI7SUFDSCxDQUFDO0lBRU8sVUFBVTtRQUNoQixJQUFJLENBQUMsV0FBVyxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDO1FBQzVDLElBQUksQ0FBQyxXQUFXLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUM7UUFFNUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ3RGLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDekIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxlQUFlLEVBQUUsQ0FBQztJQUNyQyxDQUFDO0lBRU8saUJBQWlCLENBQUMsTUFBaUIsRUFBRSxTQUEwQjtRQUNyRSxNQUFNLGFBQWEsR0FBZ0IsRUFBRSxDQUFDO1FBRXRDLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxRQUF1QixFQUFFLEVBQUU7WUFDNUMsTUFBTSxTQUFTLEdBQWMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxNQUFNLEVBQUUsUUFBUSxDQUFDLENBQUM7WUFFckUsSUFBSSxRQUFRLENBQUMsUUFBUSxFQUFFO2dCQUNyQixTQUFTLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxTQUFTLEVBQUUsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDO2dCQUMxRSxTQUFTLENBQUMsZ0JBQWdCLEdBQUcsU0FBUyxDQUFDLFFBQVEsQ0FBQzthQUNqRDtZQUVELGFBQWEsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDaEMsQ0FBQyxDQUFDLENBQUM7UUFFSCxPQUFPLGFBQWEsQ0FBQztJQUN2QixDQUFDOytHQXREVSx3QkFBd0I7bUdBQXhCLHdCQUF3QixxSkFGeEIsQ0FBQyxXQUFXLENBQUMsK0NDWDFCLCtGQUNBOzs0RkRZYSx3QkFBd0I7a0JBTnBDLFNBQVM7K0JBQ0UsbUJBQW1CLGFBR2xCLENBQUMsV0FBVyxDQUFDO2tHQUtmLFNBQVM7c0JBQWpCLEtBQUs7Z0JBQ0csU0FBUztzQkFBakIsS0FBSztnQkFDSSxhQUFhO3NCQUF0QixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE9uQ2hhbmdlcywgT25EZXN0cm95LCBPdXRwdXQsIFNpbXBsZUNoYW5nZXN9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtUcmVlU2VydmljZX0gZnJvbSBcIi4vc2VydmljZS90cmVlLXNlcnZpY2VcIjtcbmltcG9ydCB7U3Vic2NyaXB0aW9uLCB0aW1lcn0gZnJvbSBcInJ4anNcIjtcbmltcG9ydCB7Tm9kZUl0ZW19IGZyb20gXCIuL21vZGVscy9ub2RlLWl0ZW1cIjtcbmltcG9ydCB7VHJlZUNhbGxiYWNrc30gZnJvbSBcIi4vbW9kZWxzL3RyZWUtY2FsbGJhY2tzXCI7XG5pbXBvcnQge05vZGVTdGF0ZX0gZnJvbSBcIi4vbW9kZWxzL25vZGUtc3RhdGVcIjtcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnZ3Jhdml0eS10cmVlLXZpZXcnLFxuICB0ZW1wbGF0ZVVybDogJy4vZ3Jhdml0eS10cmVlLXZpZXcuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9ncmF2aXR5LXRyZWUtdmlldy5jb21wb25lbnQuc2NzcyddLFxuICBwcm92aWRlcnM6IFtUcmVlU2VydmljZV1cbn0pXG5leHBvcnQgY2xhc3MgR3Jhdml0eVRyZWVWaWV3Q29tcG9uZW50IGltcGxlbWVudHMgT25EZXN0cm95LCBPbkNoYW5nZXMge1xuICBwcml2YXRlIHJlYWRvbmx5IHRyZWVTZXJ2aWNlU3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb247XG5cbiAgQElucHV0KCkgY2FsbGJhY2tzOiBUcmVlQ2FsbGJhY2tzO1xuICBASW5wdXQoKSBub2RlSXRlbXM6IE5vZGVJdGVtPGFueT5bXTtcbiAgQE91dHB1dCgpIHNlbGVjdGVkSXRlbXMgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcblxuICBjb25zdHJ1Y3RvcihwdWJsaWMgcmVhZG9ubHkgdHJlZVNlcnZpY2U6IFRyZWVTZXJ2aWNlKSB7XG4gICAgdGhpcy50cmVlU2VydmljZVN1YnNjcmlwdGlvbiA9IHRyZWVTZXJ2aWNlLmNvbm5lY3QoKS5zdWJzY3JpYmUoKGl0ZW1zOiBhbnlbXSkgPT4ge1xuICAgICAgY29uc3Qgc3Vic2NyaXB0aW9uID0gdGltZXIoMCkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgdGhpcy5zZWxlY3RlZEl0ZW1zLmVtaXQoaXRlbXMpO1xuICAgICAgICBzdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgdGhpcy50cmVlU2VydmljZVN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICB9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcykge1xuICAgIGlmIChjaGFuZ2VzLmNhbGxiYWNrcykge1xuICAgICAgdGhpcy50cmVlU2VydmljZS5jYWxsYmFja3MgPSB0aGlzLmNhbGxiYWNrcztcbiAgICB9XG5cbiAgICBpZiAoY2hhbmdlcy5ub2RlSXRlbXMpIHtcbiAgICAgIHRoaXMuaW5pdGlhbGl6ZSgpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgaW5pdGlhbGl6ZSgpOiB2b2lkIHtcbiAgICB0aGlzLnRyZWVTZXJ2aWNlLmNhbGxiYWNrcyA9IHRoaXMuY2FsbGJhY2tzO1xuICAgIHRoaXMudHJlZVNlcnZpY2Uubm9kZUl0ZW1zID0gdGhpcy5ub2RlSXRlbXM7XG5cbiAgICB0aGlzLnRyZWVTZXJ2aWNlLnRyZWVTdGF0ZSA9IHRoaXMuaW5pdFRyZWVTdHJ1Y3R1cmUobnVsbCwgdGhpcy50cmVlU2VydmljZS5ub2RlSXRlbXMpO1xuICAgIHRoaXMudHJlZVNlcnZpY2UuY2xlYXIoKTtcbiAgICB0aGlzLnRyZWVTZXJ2aWNlLnNldEluaXRpYWxTdGF0ZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBpbml0VHJlZVN0cnVjdHVyZShwYXJlbnQ6IE5vZGVTdGF0ZSwgbm9kZUl0ZW1zOiBOb2RlSXRlbTxhbnk+W10pOiBOb2RlU3RhdGVbXSB7XG4gICAgY29uc3QgdHJlZVN0cnVjdHVyZTogTm9kZVN0YXRlW10gPSBbXTtcblxuICAgIG5vZGVJdGVtcy5mb3JFYWNoKChub2RlSXRlbTogTm9kZUl0ZW08YW55PikgPT4ge1xuICAgICAgY29uc3Qgbm9kZVN0YXRlOiBOb2RlU3RhdGUgPSBUcmVlU2VydmljZS5pbml0U3RhdGUocGFyZW50LCBub2RlSXRlbSk7XG5cbiAgICAgIGlmIChub2RlSXRlbS5jaGlsZHJlbikge1xuICAgICAgICBub2RlU3RhdGUuY2hpbGRyZW4gPSB0aGlzLmluaXRUcmVlU3RydWN0dXJlKG5vZGVTdGF0ZSwgbm9kZUl0ZW0uY2hpbGRyZW4pO1xuICAgICAgICBub2RlU3RhdGUuZmlsdGVyZWRDaGlsZHJlbiA9IG5vZGVTdGF0ZS5jaGlsZHJlbjtcbiAgICAgIH1cblxuICAgICAgdHJlZVN0cnVjdHVyZS5wdXNoKG5vZGVTdGF0ZSk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gdHJlZVN0cnVjdHVyZTtcbiAgfVxufVxuIiwiPHRyZWUtbm9kZSBbbm9kZVN0YXRlXT1cInN0YXRlXCIgKm5nRm9yPVwibGV0IHN0YXRlIG9mIHRyZWVTZXJ2aWNlLnRyZWVTdGF0ZVwiPjwvdHJlZS1ub2RlPlxuIl19
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm9kZS1pdGVtLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZ3Jhdml0eS1kZXNpZ24tc3lzdGVtL3NyYy9saWIvY29tcG9uZW50cy9ncmF2aXR5LXRyZWUtdmlldy9tb2RlbHMvbm9kZS1pdGVtLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgaW50ZXJmYWNlIE5vZGVJdGVtPFQ+IHtcbiAgY2hpbGRyZW46IE5vZGVJdGVtPGFueT5bXTtcbiAgZGlzYWJsZWQ6IGJvb2xlYW47XG4gIGV4cGFuZGVkOiBib29sZWFuO1xuICBpZDogc3RyaW5nO1xuICBpdGVtOiBUO1xuICBuYW1lOiBzdHJpbmc7XG4gIHNlbGVjdGVkOiBib29sZWFuO1xufVxuIl19
@@ -0,0 +1,7 @@
1
+ export var NodeSelectedState;
2
+ (function (NodeSelectedState) {
3
+ NodeSelectedState[NodeSelectedState["checked"] = 0] = "checked";
4
+ NodeSelectedState[NodeSelectedState["unChecked"] = 1] = "unChecked";
5
+ NodeSelectedState[NodeSelectedState["indeterminate"] = 2] = "indeterminate";
6
+ })(NodeSelectedState || (NodeSelectedState = {}));
7
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm9kZS1zZWxlY3RlZC1zdGF0ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2dyYXZpdHktZGVzaWduLXN5c3RlbS9zcmMvbGliL2NvbXBvbmVudHMvZ3Jhdml0eS10cmVlLXZpZXcvbW9kZWxzL25vZGUtc2VsZWN0ZWQtc3RhdGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsTUFBTSxDQUFOLElBQVksaUJBSVg7QUFKRCxXQUFZLGlCQUFpQjtJQUMzQiwrREFBTyxDQUFBO0lBQ1AsbUVBQVMsQ0FBQTtJQUNULDJFQUFhLENBQUE7QUFDZixDQUFDLEVBSlcsaUJBQWlCLEtBQWpCLGlCQUFpQixRQUk1QiIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBlbnVtIE5vZGVTZWxlY3RlZFN0YXRlIHtcbiAgY2hlY2tlZCxcbiAgdW5DaGVja2VkLFxuICBpbmRldGVybWluYXRlXG59XG4iXX0=
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm9kZS1zdGF0ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2dyYXZpdHktZGVzaWduLXN5c3RlbS9zcmMvbGliL2NvbXBvbmVudHMvZ3Jhdml0eS10cmVlLXZpZXcvbW9kZWxzL25vZGUtc3RhdGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7Tm9kZUl0ZW19IGZyb20gJy4vbm9kZS1pdGVtJztcbmltcG9ydCB7Tm9kZVNlbGVjdGVkU3RhdGV9IGZyb20gJy4vbm9kZS1zZWxlY3RlZC1zdGF0ZSc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgTm9kZVN0YXRlIHtcbiAgY2hpbGRyZW46IE5vZGVTdGF0ZVtdO1xuICBkaXNhYmxlZDogYm9vbGVhbjtcbiAgZXhwYW5kZWQ6IGJvb2xlYW47XG4gIGZpbHRlcmVkQ2hpbGRyZW46IE5vZGVTdGF0ZVtdO1xuICBoYXNGaWx0ZXJlZENoaWxkcmVuOiBib29sZWFuO1xuICBub2RlSXRlbTogTm9kZUl0ZW08YW55PjtcbiAgcGFyZW50OiBOb2RlU3RhdGU7XG4gIHNlbGVjdGVkOiBib29sZWFuO1xuICBzZWxlY3RlZFN0YXRlOiBOb2RlU2VsZWN0ZWRTdGF0ZTtcbn1cbiJdfQ==
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJlZS1jYWxsYmFja3MuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9ncmF2aXR5LWRlc2lnbi1zeXN0ZW0vc3JjL2xpYi9jb21wb25lbnRzL2dyYXZpdHktdHJlZS12aWV3L21vZGVscy90cmVlLWNhbGxiYWNrcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtOb2RlSXRlbX0gZnJvbSAnLi9ub2RlLWl0ZW0nO1xuXG5leHBvcnQgaW50ZXJmYWNlIFRyZWVDYWxsYmFja3Mge1xuXG4gIC8qKiBDYWxsYmFjayB0cmlnZ2VycyBvbiBub2RlIHNlbGVjdGlvbi4gKi9cbiAgc2VsZWN0PzogKGl0ZW06IE5vZGVJdGVtPGFueT4pID0+IHZvaWQ7XG5cbiAgLyoqIENhbGxiYWNrIHRyaWdnZXJzIG9uIHVuc2VsZWN0aW9uIG9mIGEgbm9kZS4gKi9cbiAgdW5TZWxlY3Q/OiAoaXRlbTogTm9kZUl0ZW08YW55PikgPT4gdm9pZDtcblxuICAvKiogQ2FsbGJhY2sgdHJpZ2dlcnMgb24gdG9nZ2xpbmcgb2YgYSBub2RlLiAqL1xuICB0b2dnbGU/OiAoaXRlbTogTm9kZUl0ZW08YW55PikgPT4gdm9pZDtcbn1cbiJdfQ==
@@ -0,0 +1,26 @@
1
+ import { Component, Input } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ import * as i1 from "../../service/tree-service";
4
+ import * as i2 from "../../../gravity-icon/gravity-icon.component";
5
+ export class NodeCheckboxComponent {
6
+ constructor(treeService) {
7
+ this.treeService = treeService;
8
+ }
9
+ clickOnCheckbox() {
10
+ if (!this.state.disabled) {
11
+ this.treeService.checkboxClick(this.state);
12
+ setTimeout(() => {
13
+ this.treeService.reEvaluateSelectedState(this.state);
14
+ }, 1);
15
+ }
16
+ }
17
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: NodeCheckboxComponent, deps: [{ token: i1.TreeService }], target: i0.ɵɵFactoryTarget.Component }); }
18
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: NodeCheckboxComponent, selector: "node-checkbox", inputs: { state: "state" }, ngImport: i0, template: "<gravity-icon class=\"border-radius-sm checkbox-icon\"\n [class]=\"state.selectedState == 1 ? 'unselect' : 'select'\"\n [class.disabled]=\"state.disabled\"\n\n (click)=\"clickOnCheckbox()\"\n\n [iconName]=\"state.selectedState == 2 ? 'uncheck' : 'success'\"></gravity-icon>\n", styles: [".checkbox-icon{background-color:var(--cta-primary);cursor:pointer;height:1.5rem;--icon-color: var(--surface-secondary);padding:.35rem;width:1.5rem}.checkbox-icon.unselect{opacity:.5}.checkbox-icon.disabled{cursor:not-allowed}\n"], dependencies: [{ kind: "component", type: i2.GravityIconComponent, selector: "gravity-icon", inputs: ["customIconColorVariable", "iconName", "hoverIcon", "size"] }] }); }
19
+ }
20
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: NodeCheckboxComponent, decorators: [{
21
+ type: Component,
22
+ args: [{ selector: 'node-checkbox', template: "<gravity-icon class=\"border-radius-sm checkbox-icon\"\n [class]=\"state.selectedState == 1 ? 'unselect' : 'select'\"\n [class.disabled]=\"state.disabled\"\n\n (click)=\"clickOnCheckbox()\"\n\n [iconName]=\"state.selectedState == 2 ? 'uncheck' : 'success'\"></gravity-icon>\n", styles: [".checkbox-icon{background-color:var(--cta-primary);cursor:pointer;height:1.5rem;--icon-color: var(--surface-secondary);padding:.35rem;width:1.5rem}.checkbox-icon.unselect{opacity:.5}.checkbox-icon.disabled{cursor:not-allowed}\n"] }]
23
+ }], ctorParameters: function () { return [{ type: i1.TreeService }]; }, propDecorators: { state: [{
24
+ type: Input
25
+ }] } });
26
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm9kZS1jaGVja2JveC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9ncmF2aXR5LWRlc2lnbi1zeXN0ZW0vc3JjL2xpYi9jb21wb25lbnRzL2dyYXZpdHktdHJlZS12aWV3L25vZGUvbm9kZS1jaGVja2JveC9ub2RlLWNoZWNrYm94LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2dyYXZpdHktZGVzaWduLXN5c3RlbS9zcmMvbGliL2NvbXBvbmVudHMvZ3Jhdml0eS10cmVlLXZpZXcvbm9kZS9ub2RlLWNoZWNrYm94L25vZGUtY2hlY2tib3guY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLFNBQVMsRUFBRSxLQUFLLEVBQUMsTUFBTSxlQUFlLENBQUM7Ozs7QUFTL0MsTUFBTSxPQUFPLHFCQUFxQjtJQUdoQyxZQUE2QixXQUF3QjtRQUF4QixnQkFBVyxHQUFYLFdBQVcsQ0FBYTtJQUNyRCxDQUFDO0lBRU0sZUFBZTtRQUNwQixJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLEVBQUU7WUFDeEIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBRTNDLFVBQVUsQ0FBQyxHQUFHLEVBQUU7Z0JBQ2QsSUFBSSxDQUFDLFdBQVcsQ0FBQyx1QkFBdUIsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDdkQsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1NBQ1A7SUFDSCxDQUFDOytHQWRVLHFCQUFxQjttR0FBckIscUJBQXFCLGlGQ1RsQyx5VUFPQTs7NEZERWEscUJBQXFCO2tCQUxqQyxTQUFTOytCQUNFLGVBQWU7a0dBS1QsS0FBSztzQkFBcEIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7Q29tcG9uZW50LCBJbnB1dH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1RyZWVTZXJ2aWNlfSBmcm9tICcuLi8uLi9zZXJ2aWNlL3RyZWUtc2VydmljZSc7XG5pbXBvcnQge05vZGVTdGF0ZX0gZnJvbSBcIi4uLy4uL21vZGVscy9ub2RlLXN0YXRlXCI7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ25vZGUtY2hlY2tib3gnLFxuICB0ZW1wbGF0ZVVybDogJy4vbm9kZS1jaGVja2JveC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL25vZGUtY2hlY2tib3guY29tcG9uZW50LnNjc3MnXVxufSlcbmV4cG9ydCBjbGFzcyBOb2RlQ2hlY2tib3hDb21wb25lbnQge1xuICBASW5wdXQoKSBwdWJsaWMgc3RhdGU6IE5vZGVTdGF0ZTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IHRyZWVTZXJ2aWNlOiBUcmVlU2VydmljZSkge1xuICB9XG5cbiAgcHVibGljIGNsaWNrT25DaGVja2JveCgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuc3RhdGUuZGlzYWJsZWQpIHtcbiAgICAgIHRoaXMudHJlZVNlcnZpY2UuY2hlY2tib3hDbGljayh0aGlzLnN0YXRlKTtcblxuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHRoaXMudHJlZVNlcnZpY2UucmVFdmFsdWF0ZVNlbGVjdGVkU3RhdGUodGhpcy5zdGF0ZSk7XG4gICAgICB9LCAxKTtcbiAgICB9XG4gIH1cbn1cbiIsIjxncmF2aXR5LWljb24gY2xhc3M9XCJib3JkZXItcmFkaXVzLXNtIGNoZWNrYm94LWljb25cIlxuICAgICAgICAgICAgICBbY2xhc3NdPVwic3RhdGUuc2VsZWN0ZWRTdGF0ZSA9PSAxID8gJ3Vuc2VsZWN0JyA6ICdzZWxlY3QnXCJcbiAgICAgICAgICAgICAgW2NsYXNzLmRpc2FibGVkXT1cInN0YXRlLmRpc2FibGVkXCJcblxuICAgICAgICAgICAgICAoY2xpY2spPVwiY2xpY2tPbkNoZWNrYm94KClcIlxuXG4gICAgICAgICAgICAgIFtpY29uTmFtZV09XCJzdGF0ZS5zZWxlY3RlZFN0YXRlID09IDIgPyAndW5jaGVjaycgOiAnc3VjY2VzcydcIj48L2dyYXZpdHktaWNvbj5cbiJdfQ==
@@ -0,0 +1,13 @@
1
+ import { Component, Input } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ export class NodeNameComponent {
4
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: NodeNameComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
5
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: NodeNameComponent, selector: "node-name", inputs: { state: "state" }, ngImport: i0, template: "<div [class.disabled]=\"state.disabled\" class=\"node-name\">\n <span class=\"hr-label md-regular\">{{state.nodeItem.name}}</span>\n</div>\n", styles: [".node-name{display:inline-block;padding:.1325rem 0 .1325rem .4375rem}.node-name.disabled{opacity:.6}\n"] }); }
6
+ }
7
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: NodeNameComponent, decorators: [{
8
+ type: Component,
9
+ args: [{ selector: 'node-name', template: "<div [class.disabled]=\"state.disabled\" class=\"node-name\">\n <span class=\"hr-label md-regular\">{{state.nodeItem.name}}</span>\n</div>\n", styles: [".node-name{display:inline-block;padding:.1325rem 0 .1325rem .4375rem}.node-name.disabled{opacity:.6}\n"] }]
10
+ }], propDecorators: { state: [{
11
+ type: Input
12
+ }] } });
13
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm9kZS1uYW1lLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2dyYXZpdHktZGVzaWduLXN5c3RlbS9zcmMvbGliL2NvbXBvbmVudHMvZ3Jhdml0eS10cmVlLXZpZXcvbm9kZS9ub2RlLW5hbWUvbm9kZS1uYW1lLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2dyYXZpdHktZGVzaWduLXN5c3RlbS9zcmMvbGliL2NvbXBvbmVudHMvZ3Jhdml0eS10cmVlLXZpZXcvbm9kZS9ub2RlLW5hbWUvbm9kZS1uYW1lLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxTQUFTLEVBQUUsS0FBSyxFQUFDLE1BQU0sZUFBZSxDQUFDOztBQVEvQyxNQUFNLE9BQU8saUJBQWlCOytHQUFqQixpQkFBaUI7bUdBQWpCLGlCQUFpQiw2RUNSOUIsK0lBR0E7OzRGREthLGlCQUFpQjtrQkFMN0IsU0FBUzsrQkFDRSxXQUFXOzhCQUtMLEtBQUs7c0JBQXBCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0NvbXBvbmVudCwgSW5wdXR9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtOb2RlU3RhdGV9IGZyb20gJy4uLy4uL21vZGVscy9ub2RlLXN0YXRlJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnbm9kZS1uYW1lJyxcbiAgdGVtcGxhdGVVcmw6ICcuL25vZGUtbmFtZS5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL25vZGUtbmFtZS5jb21wb25lbnQuc2NzcyddXG59KVxuZXhwb3J0IGNsYXNzIE5vZGVOYW1lQ29tcG9uZW50IHtcbiAgQElucHV0KCkgcHVibGljIHN0YXRlOiBOb2RlU3RhdGU7XG59XG4iLCI8ZGl2IFtjbGFzcy5kaXNhYmxlZF09XCJzdGF0ZS5kaXNhYmxlZFwiIGNsYXNzPVwibm9kZS1uYW1lXCI+XG4gIDxzcGFuIGNsYXNzPVwiaHItbGFiZWwgbWQtcmVndWxhclwiPnt7c3RhdGUubm9kZUl0ZW0ubmFtZX19PC9zcGFuPlxuPC9kaXY+XG4iXX0=
@@ -0,0 +1,15 @@
1
+ import { Component, Input } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ import * as i1 from "@angular/common";
4
+ import * as i2 from "../../../gravity-icon/gravity-icon.component";
5
+ export class NodeToggleComponent {
6
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: NodeToggleComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
7
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: NodeToggleComponent, selector: "node-toggle", inputs: { state: "state" }, ngImport: i0, template: "<div class=\"node-toggle-wrapper\" [class.collapsable]=\"state.nodeItem?.children?.length > 0\"\n (click)=\"state.expanded = !state.expanded\">\n <gravity-icon [iconName]=\"(state.expanded ? 'arrow_down' : 'arrow_right')\" [size]=\"'sm'\"\n *ngIf=\"state.nodeItem?.children?.length > 0\"></gravity-icon>\n</div>\n", styles: [".node-toggle-wrapper{align-items:center;display:inline-flex;height:1.25rem;width:1.75rem}.collapsable{cursor:pointer}\n"], dependencies: [{ kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i2.GravityIconComponent, selector: "gravity-icon", inputs: ["customIconColorVariable", "iconName", "hoverIcon", "size"] }] }); }
8
+ }
9
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: NodeToggleComponent, decorators: [{
10
+ type: Component,
11
+ args: [{ selector: 'node-toggle', template: "<div class=\"node-toggle-wrapper\" [class.collapsable]=\"state.nodeItem?.children?.length > 0\"\n (click)=\"state.expanded = !state.expanded\">\n <gravity-icon [iconName]=\"(state.expanded ? 'arrow_down' : 'arrow_right')\" [size]=\"'sm'\"\n *ngIf=\"state.nodeItem?.children?.length > 0\"></gravity-icon>\n</div>\n", styles: [".node-toggle-wrapper{align-items:center;display:inline-flex;height:1.25rem;width:1.75rem}.collapsable{cursor:pointer}\n"] }]
12
+ }], propDecorators: { state: [{
13
+ type: Input
14
+ }] } });
15
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm9kZS10b2dnbGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZ3Jhdml0eS1kZXNpZ24tc3lzdGVtL3NyYy9saWIvY29tcG9uZW50cy9ncmF2aXR5LXRyZWUtdmlldy9ub2RlL25vZGUtdG9nZ2xlL25vZGUtdG9nZ2xlLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2dyYXZpdHktZGVzaWduLXN5c3RlbS9zcmMvbGliL2NvbXBvbmVudHMvZ3Jhdml0eS10cmVlLXZpZXcvbm9kZS9ub2RlLXRvZ2dsZS9ub2RlLXRvZ2dsZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsU0FBUyxFQUFFLEtBQUssRUFBQyxNQUFNLGVBQWUsQ0FBQzs7OztBQVEvQyxNQUFNLE9BQU8sbUJBQW1COytHQUFuQixtQkFBbUI7bUdBQW5CLG1CQUFtQiwrRUNSaEMsK1VBS0E7OzRGREdhLG1CQUFtQjtrQkFML0IsU0FBUzsrQkFDRSxhQUFhOzhCQUtQLEtBQUs7c0JBQXBCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0NvbXBvbmVudCwgSW5wdXR9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtOb2RlU3RhdGV9IGZyb20gJy4uLy4uL21vZGVscy9ub2RlLXN0YXRlJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnbm9kZS10b2dnbGUnLFxuICB0ZW1wbGF0ZVVybDogJy4vbm9kZS10b2dnbGUuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9ub2RlLXRvZ2dsZS5jb21wb25lbnQuc2NzcyddXG59KVxuZXhwb3J0IGNsYXNzIE5vZGVUb2dnbGVDb21wb25lbnQge1xuICBASW5wdXQoKSBwdWJsaWMgc3RhdGU6IE5vZGVTdGF0ZTtcbn1cbiIsIjxkaXYgY2xhc3M9XCJub2RlLXRvZ2dsZS13cmFwcGVyXCIgW2NsYXNzLmNvbGxhcHNhYmxlXT1cInN0YXRlLm5vZGVJdGVtPy5jaGlsZHJlbj8ubGVuZ3RoID4gMFwiXG4gICAgIChjbGljayk9XCJzdGF0ZS5leHBhbmRlZCA9ICFzdGF0ZS5leHBhbmRlZFwiPlxuICA8Z3Jhdml0eS1pY29uIFtpY29uTmFtZV09XCIoc3RhdGUuZXhwYW5kZWQgPyAnYXJyb3dfZG93bicgOiAnYXJyb3dfcmlnaHQnKVwiIFtzaXplXT1cIidzbSdcIlxuICAgICAgICAgICAgICAgICpuZ0lmPVwic3RhdGUubm9kZUl0ZW0/LmNoaWxkcmVuPy5sZW5ndGggPiAwXCI+PC9ncmF2aXR5LWljb24+XG48L2Rpdj5cbiJdfQ==
@@ -0,0 +1,17 @@
1
+ import { Component, Input } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ import * as i1 from "@angular/common";
4
+ import * as i2 from "./node-toggle/node-toggle.component";
5
+ import * as i3 from "./node-checkbox/node-checkbox.component";
6
+ import * as i4 from "./node-name/node-name.component";
7
+ export class NodeComponent {
8
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: NodeComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
9
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: NodeComponent, selector: "tree-node", inputs: { nodeState: "nodeState" }, ngImport: i0, template: "<div class=\"node-container\">\n <div class=\"node-content\">\n <node-toggle [state]=\"nodeState\"></node-toggle>\n <node-checkbox [state]=\"nodeState\"></node-checkbox>\n <node-name [state]=\"nodeState\"></node-name>\n </div>\n <div class=\"collapsible-wrapper\" *ngIf=\"nodeState.nodeItem.children\"\n [class.collapsed]=\"!nodeState.expanded && nodeState.nodeItem.children.length > 0 && nodeState.filteredChildren.length > 0\">\n <div class=\"collapsible\">\n <tree-node class=\"node-offset\" [nodeState]=\"child\"\n *ngFor=\"let child of nodeState.filteredChildren\"></tree-node>\n </div>\n </div>\n</div>\n", styles: [".node-container{display:flex;flex:1 1 auto;flex-direction:column}.node-container .node-content{display:inline-flex;padding-bottom:.1rem}.node-container node-toggle,.node-container node-checkbox{display:inline-flex;align-items:center}.node-container .collapsible-wrapper{display:flex;overflow:hidden}.node-container .collapsible-wrapper .collapsible{transition:margin-bottom .3s cubic-bezier(0,0,0,1);margin-bottom:0;max-height:1000000px}.node-container .collapsible-wrapper .collapsible tree-node.node-offset{display:flex;margin-left:1.25rem}.node-container .collapsible-wrapper.collapsed>.collapsible{margin-bottom:-20000px;transition:margin-bottom .3s cubic-bezier(1,0,1,1),visibility 0s .3s,max-height 0s .3s;visibility:hidden;max-height:0}\n"], dependencies: [{ kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: NodeComponent, selector: "tree-node", inputs: ["nodeState"] }, { kind: "component", type: i2.NodeToggleComponent, selector: "node-toggle", inputs: ["state"] }, { kind: "component", type: i3.NodeCheckboxComponent, selector: "node-checkbox", inputs: ["state"] }, { kind: "component", type: i4.NodeNameComponent, selector: "node-name", inputs: ["state"] }] }); }
10
+ }
11
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: NodeComponent, decorators: [{
12
+ type: Component,
13
+ args: [{ selector: 'tree-node', template: "<div class=\"node-container\">\n <div class=\"node-content\">\n <node-toggle [state]=\"nodeState\"></node-toggle>\n <node-checkbox [state]=\"nodeState\"></node-checkbox>\n <node-name [state]=\"nodeState\"></node-name>\n </div>\n <div class=\"collapsible-wrapper\" *ngIf=\"nodeState.nodeItem.children\"\n [class.collapsed]=\"!nodeState.expanded && nodeState.nodeItem.children.length > 0 && nodeState.filteredChildren.length > 0\">\n <div class=\"collapsible\">\n <tree-node class=\"node-offset\" [nodeState]=\"child\"\n *ngFor=\"let child of nodeState.filteredChildren\"></tree-node>\n </div>\n </div>\n</div>\n", styles: [".node-container{display:flex;flex:1 1 auto;flex-direction:column}.node-container .node-content{display:inline-flex;padding-bottom:.1rem}.node-container node-toggle,.node-container node-checkbox{display:inline-flex;align-items:center}.node-container .collapsible-wrapper{display:flex;overflow:hidden}.node-container .collapsible-wrapper .collapsible{transition:margin-bottom .3s cubic-bezier(0,0,0,1);margin-bottom:0;max-height:1000000px}.node-container .collapsible-wrapper .collapsible tree-node.node-offset{display:flex;margin-left:1.25rem}.node-container .collapsible-wrapper.collapsed>.collapsible{margin-bottom:-20000px;transition:margin-bottom .3s cubic-bezier(1,0,1,1),visibility 0s .3s,max-height 0s .3s;visibility:hidden;max-height:0}\n"] }]
14
+ }], propDecorators: { nodeState: [{
15
+ type: Input
16
+ }] } });
17
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm9kZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9ncmF2aXR5LWRlc2lnbi1zeXN0ZW0vc3JjL2xpYi9jb21wb25lbnRzL2dyYXZpdHktdHJlZS12aWV3L25vZGUvbm9kZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9ncmF2aXR5LWRlc2lnbi1zeXN0ZW0vc3JjL2xpYi9jb21wb25lbnRzL2dyYXZpdHktdHJlZS12aWV3L25vZGUvbm9kZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsU0FBUyxFQUFFLEtBQUssRUFBQyxNQUFNLGVBQWUsQ0FBQzs7Ozs7O0FBUS9DLE1BQU0sT0FBTyxhQUFhOytHQUFiLGFBQWE7bUdBQWIsYUFBYSxxRkNSMUIsa3BCQWNBLG9nQ0ROYSxhQUFhOzs0RkFBYixhQUFhO2tCQUx6QixTQUFTOytCQUNFLFdBQVc7OEJBS0wsU0FBUztzQkFBeEIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7Q29tcG9uZW50LCBJbnB1dH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge05vZGVTdGF0ZX0gZnJvbSAnLi4vbW9kZWxzL25vZGUtc3RhdGUnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICd0cmVlLW5vZGUnLFxuICB0ZW1wbGF0ZVVybDogJy4vbm9kZS5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL25vZGUuY29tcG9uZW50LnNjc3MnXVxufSlcbmV4cG9ydCBjbGFzcyBOb2RlQ29tcG9uZW50IHtcbiAgQElucHV0KCkgcHVibGljIG5vZGVTdGF0ZTogTm9kZVN0YXRlO1xufVxuIiwiPGRpdiBjbGFzcz1cIm5vZGUtY29udGFpbmVyXCI+XG4gIDxkaXYgY2xhc3M9XCJub2RlLWNvbnRlbnRcIj5cbiAgICA8bm9kZS10b2dnbGUgW3N0YXRlXT1cIm5vZGVTdGF0ZVwiPjwvbm9kZS10b2dnbGU+XG4gICAgPG5vZGUtY2hlY2tib3ggW3N0YXRlXT1cIm5vZGVTdGF0ZVwiPjwvbm9kZS1jaGVja2JveD5cbiAgICA8bm9kZS1uYW1lIFtzdGF0ZV09XCJub2RlU3RhdGVcIj48L25vZGUtbmFtZT5cbiAgPC9kaXY+XG4gIDxkaXYgY2xhc3M9XCJjb2xsYXBzaWJsZS13cmFwcGVyXCIgKm5nSWY9XCJub2RlU3RhdGUubm9kZUl0ZW0uY2hpbGRyZW5cIlxuICAgICAgIFtjbGFzcy5jb2xsYXBzZWRdPVwiIW5vZGVTdGF0ZS5leHBhbmRlZCAmJiBub2RlU3RhdGUubm9kZUl0ZW0uY2hpbGRyZW4ubGVuZ3RoID4gMCAmJiBub2RlU3RhdGUuZmlsdGVyZWRDaGlsZHJlbi5sZW5ndGggPiAwXCI+XG4gICAgPGRpdiBjbGFzcz1cImNvbGxhcHNpYmxlXCI+XG4gICAgICA8dHJlZS1ub2RlIGNsYXNzPVwibm9kZS1vZmZzZXRcIiBbbm9kZVN0YXRlXT1cImNoaWxkXCJcbiAgICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IGNoaWxkIG9mIG5vZGVTdGF0ZS5maWx0ZXJlZENoaWxkcmVuXCI+PC90cmVlLW5vZGU+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9kaXY+XG4iXX0=
@@ -0,0 +1,350 @@
1
+ import { Injectable } from '@angular/core';
2
+ import { BehaviorSubject } from 'rxjs';
3
+ import { debounceTime, distinctUntilChanged } from 'rxjs/operators';
4
+ import { NodeSelectedState } from '../models/node-selected-state';
5
+ import * as i0 from "@angular/core";
6
+ export class TreeService {
7
+ constructor() {
8
+ this.filterChangeSubject = new BehaviorSubject('');
9
+ this.selectedItems = [];
10
+ this.selectedItemsSubject = new BehaviorSubject(this.selectedItems);
11
+ this.selectedStates = [];
12
+ this.filterChangeSubjectSubscription = this.filterChangeSubject.pipe(debounceTime(300), distinctUntilChanged()).subscribe(() => {
13
+ this.filterTraverse(this.treeState, '');
14
+ });
15
+ }
16
+ ngOnDestroy() {
17
+ this.filterChangeSubjectSubscription.unsubscribe();
18
+ }
19
+ connect() {
20
+ return this.selectedItemsSubject.asObservable();
21
+ }
22
+ setInitialState() {
23
+ this.setInitialSelectedState(this.treeState);
24
+ }
25
+ setInitialSelectedState(nodeStates) {
26
+ for (const state of nodeStates) {
27
+ if (state.nodeItem.selected && (!state.children || state.children.length === 0)) {
28
+ this.toggleSelectedState(state, true);
29
+ }
30
+ this.setInitialSelectedState(state.children);
31
+ }
32
+ }
33
+ clear() {
34
+ for (let state of this.selectedStates) {
35
+ state.selected = false;
36
+ state.selectedState = NodeSelectedState.unChecked;
37
+ }
38
+ this.selectedItems.length = 0;
39
+ this.selectedStates.length = 0;
40
+ }
41
+ filterTraverse(states, filter) {
42
+ let results = [];
43
+ for (let state of states) {
44
+ if (state.children.length > 0) {
45
+ state.hasFilteredChildren = false;
46
+ state.hasFilteredChildren = this.filterTraverse(state.children, filter);
47
+ if (this.applyFilter(state, filter)) {
48
+ state.hasFilteredChildren = true;
49
+ }
50
+ results.push(state.hasFilteredChildren);
51
+ }
52
+ }
53
+ return results.some((item) => item);
54
+ }
55
+ applyFilter(state, filter) {
56
+ state.filteredChildren = this.filter(state.children, filter);
57
+ return state.filteredChildren.length > 0;
58
+ }
59
+ filter(states, value) {
60
+ return states.filter((nodeState) => nodeState.hasFilteredChildren || value === '' || nodeState.nodeItem.name.toLowerCase().indexOf(value) !== -1);
61
+ }
62
+ checkboxClick(state) {
63
+ this.toggleSelectedState(state, false);
64
+ if (this.callbacks?.toggle) {
65
+ this.callbacks.toggle(state.nodeItem);
66
+ }
67
+ }
68
+ toggleSelectedState(state, ignoreDisabled) {
69
+ if (state.disabled && !ignoreDisabled) {
70
+ return;
71
+ }
72
+ if (state.selectedState === NodeSelectedState.unChecked) {
73
+ this.setChecked(state, true, ignoreDisabled);
74
+ }
75
+ else if (state.selectedState === NodeSelectedState.checked) {
76
+ this.setUnchecked(state, true, ignoreDisabled);
77
+ }
78
+ else {
79
+ if (this.anyActiveSelected(state) && !state.selected) {
80
+ this.setUnchecked(state, true, ignoreDisabled);
81
+ }
82
+ else {
83
+ this.setChecked(state, true, ignoreDisabled);
84
+ }
85
+ }
86
+ if (state.parent) {
87
+ this.childStateChanged(state.parent);
88
+ }
89
+ }
90
+ setChecked(state, propagate, ignoreDisabled) {
91
+ if (state.disabled && !ignoreDisabled) {
92
+ return;
93
+ }
94
+ state.selectedState = NodeSelectedState.checked;
95
+ state.selected = true;
96
+ if (TreeService.hasNoChildren(state)) {
97
+ this.addSelected(state);
98
+ }
99
+ else if (propagate) {
100
+ for (const child of state.children) {
101
+ this.setChecked(child, propagate, ignoreDisabled);
102
+ }
103
+ }
104
+ }
105
+ setUnchecked(state, propagate, ignoreDisabled) {
106
+ if (state.disabled && !ignoreDisabled) {
107
+ return;
108
+ }
109
+ state.selectedState = NodeSelectedState.unChecked;
110
+ state.selected = false;
111
+ if (TreeService.hasNoChildren(state)) {
112
+ this.removeSelected(state.nodeItem.item);
113
+ if (this.callbacks?.unSelect) {
114
+ this.callbacks.unSelect(state.nodeItem);
115
+ }
116
+ }
117
+ else if (propagate) {
118
+ for (const child of state.children) {
119
+ this.setUnchecked(child, propagate, ignoreDisabled);
120
+ }
121
+ }
122
+ if (!this.anyChildSelected(state)) {
123
+ this.removeSelected(state.nodeItem.item);
124
+ }
125
+ }
126
+ removeSelected(item) {
127
+ let index = this.selectedItems.indexOf(item);
128
+ if (index !== -1) {
129
+ this.selectedItems.splice(index, 1);
130
+ }
131
+ }
132
+ static hasNoChildren(state) {
133
+ return !state.children || state.children.length === 0;
134
+ }
135
+ addSelected(state) {
136
+ this.selectedItems.push(state.nodeItem.item);
137
+ this.selectedStates.push(state);
138
+ if (this.callbacks?.select) {
139
+ this.callbacks.select(state.nodeItem);
140
+ }
141
+ }
142
+ reEvaluateSelectedState(state) {
143
+ if (!TreeService.hasNoChildren(state)) {
144
+ this.childStateChanged(state);
145
+ for (const child of state.children) {
146
+ this.reEvaluateSelectedState(child);
147
+ }
148
+ }
149
+ }
150
+ childStateChanged(state) {
151
+ if (this.anyChildSelected(state)) {
152
+ if (state.nodeItem.id != '0') {
153
+ let itemIndex = this.selectedItems.indexOf(state.nodeItem.item);
154
+ if (itemIndex === -1) {
155
+ this.selectedItems.push(state.nodeItem.item);
156
+ }
157
+ }
158
+ if (this.allChildrenSelected(state)) {
159
+ this.setChecked(state, false);
160
+ }
161
+ else {
162
+ state.selectedState = NodeSelectedState.indeterminate;
163
+ state.selected = false;
164
+ }
165
+ }
166
+ else {
167
+ this.setUnchecked(state, false);
168
+ }
169
+ if (state.parent) {
170
+ this.childStateChanged(state.parent);
171
+ }
172
+ }
173
+ anyChildSelected(state) {
174
+ return state.children.find((item) => item.selectedState === NodeSelectedState.checked || item.selectedState === NodeSelectedState.indeterminate) != null;
175
+ }
176
+ static initState(parent, nodeItem) {
177
+ return {
178
+ parent: parent,
179
+ children: [],
180
+ filteredChildren: [],
181
+ hasFilteredChildren: false,
182
+ nodeItem: nodeItem,
183
+ expanded: nodeItem.expanded !== false,
184
+ disabled: nodeItem.disabled === true,
185
+ selectedState: NodeSelectedState.unChecked,
186
+ selected: false
187
+ };
188
+ }
189
+ deleteById(id) {
190
+ let result = this.getNodeState(this.treeState, id, TreeService.findById);
191
+ if (result) {
192
+ this.deleteByState(result);
193
+ }
194
+ }
195
+ deleteByState(state) {
196
+ this.delete(state);
197
+ this.childStateChanged(state);
198
+ this.filterTraverse(this.treeState, '');
199
+ }
200
+ delete(state) {
201
+ while (state.children.length > 0) {
202
+ let result = state.children.pop();
203
+ if (result) {
204
+ this.delete(result);
205
+ }
206
+ }
207
+ this.removeSelected(state.nodeItem.item);
208
+ TreeService.remove(state);
209
+ if (!state.parent) {
210
+ TreeService.deleteRoot(state, this.treeState, this.nodeItems);
211
+ }
212
+ }
213
+ toggleExpandedTraverse(nodeStates, value) {
214
+ for (let state of nodeStates) {
215
+ state.expanded = value;
216
+ this.toggleExpandedTraverse(state.children, value);
217
+ }
218
+ }
219
+ static deleteRoot(state, nodeStates, nodeItems) {
220
+ let itemIndex = nodeItems.indexOf(state.nodeItem);
221
+ if (itemIndex !== -1) {
222
+ nodeItems.splice(itemIndex, 1);
223
+ }
224
+ let index = nodeStates.indexOf(state);
225
+ if (index !== -1) {
226
+ nodeStates.splice(index, 1);
227
+ }
228
+ }
229
+ addNewNode(nodeState, parent) {
230
+ nodeState.parent = parent;
231
+ parent.children.push(nodeState);
232
+ if (parent.nodeItem.children) {
233
+ parent.nodeItem.children.push(nodeState.nodeItem);
234
+ }
235
+ this.childStateChanged(parent);
236
+ this.filterTraverse(this.treeState, '');
237
+ }
238
+ static remove(state) {
239
+ if (state.parent) {
240
+ state.parent.hasFilteredChildren = false;
241
+ if (state.parent.nodeItem.children) {
242
+ let itemIndex = state.parent.nodeItem.children.indexOf(state.nodeItem);
243
+ if (itemIndex !== -1) {
244
+ state.parent.nodeItem.children.splice(itemIndex, 1);
245
+ }
246
+ }
247
+ let index = state.parent.children.indexOf(state);
248
+ if (index !== -1) {
249
+ state.parent.children.splice(index, 1);
250
+ }
251
+ let filteredIndex = state.parent.filteredChildren.indexOf(state);
252
+ if (filteredIndex !== -1) {
253
+ state.parent.filteredChildren.splice(filteredIndex, 1);
254
+ }
255
+ }
256
+ }
257
+ allChildrenSelected(state) {
258
+ if (state.nodeItem.children) {
259
+ return state.children.every(it => it.selectedState === NodeSelectedState.checked) && state.children.length === state.nodeItem.children.length;
260
+ }
261
+ else {
262
+ return state.children.every(it => it.selectedState === NodeSelectedState.checked);
263
+ }
264
+ }
265
+ toggleExpandedTraverseAsc(nodeState, value) {
266
+ nodeState.expanded = value;
267
+ if (nodeState.parent) {
268
+ this.toggleExpandedTraverseAsc(nodeState.parent, value);
269
+ }
270
+ }
271
+ anyActiveSelected(state) {
272
+ let result = state.children.filter(it => !it.disabled && it.selected).length > 0;
273
+ for (const child of state.children) {
274
+ if (!TreeService.hasNoChildren(child) && this.anyActiveSelected(child)) {
275
+ result = true;
276
+ }
277
+ }
278
+ return result;
279
+ }
280
+ static findById(state, arg) {
281
+ return state.nodeItem.id === arg;
282
+ }
283
+ getNodeState(nodeStates, arg, compare) {
284
+ let nodeState = nodeStates.find((it) => compare(it, arg));
285
+ if (nodeState) {
286
+ return nodeState;
287
+ }
288
+ else {
289
+ for (let state of nodeStates) {
290
+ let children = this.getNodeState(state.children, arg, compare);
291
+ if (children) {
292
+ return children;
293
+ }
294
+ }
295
+ }
296
+ }
297
+ toggleExpanded(value) {
298
+ this.toggleExpandedTraverse(this.treeState, value);
299
+ }
300
+ addNodeById(nodeState, id) {
301
+ let result = this.getNodeState(this.treeState, id, TreeService.findById);
302
+ if (result) {
303
+ if (!result.children) {
304
+ result.children = [];
305
+ }
306
+ this.addNewNode(nodeState, result);
307
+ if (result.nodeItem.item) {
308
+ this.removeSelected(result.nodeItem.item);
309
+ }
310
+ }
311
+ }
312
+ editItemById(id, item) {
313
+ const nodeState = this.getNodeState(this.treeState, id, TreeService.findById);
314
+ if (nodeState && nodeState.nodeItem) {
315
+ if (this.selectedItems.includes(nodeState.nodeItem.item)) {
316
+ this.removeSelected(nodeState.nodeItem.item);
317
+ this.selectedItems.push(item);
318
+ this.selectedItemsSubject.next(this.selectedItems);
319
+ }
320
+ nodeState.nodeItem.item = item;
321
+ }
322
+ }
323
+ expandById(id) {
324
+ const result = this.getNodeState(this.treeState, id, TreeService.findById);
325
+ if (result) {
326
+ this.toggleExpandedTraverseAsc(result, true);
327
+ }
328
+ }
329
+ collapseById(id) {
330
+ const result = this.getNodeState(this.treeState, id, TreeService.findById);
331
+ if (result) {
332
+ result.expanded = false;
333
+ }
334
+ }
335
+ getParentById(id) {
336
+ const result = this.getNodeState(this.treeState, id, TreeService.findById);
337
+ if (result) {
338
+ return result.parent.nodeItem;
339
+ }
340
+ }
341
+ forceFilterTraverse() {
342
+ this.filterTraverse(this.treeState, '');
343
+ }
344
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: TreeService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
345
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: TreeService }); }
346
+ }
347
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: TreeService, decorators: [{
348
+ type: Injectable
349
+ }], ctorParameters: function () { return []; } });
350
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJlZS1zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZ3Jhdml0eS1kZXNpZ24tc3lzdGVtL3NyYy9saWIvY29tcG9uZW50cy9ncmF2aXR5LXRyZWUtdmlldy9zZXJ2aWNlL3RyZWUtc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsVUFBVSxFQUFZLE1BQU0sZUFBZSxDQUFDO0FBQ3BELE9BQU8sRUFBQyxlQUFlLEVBQTJCLE1BQU0sTUFBTSxDQUFDO0FBQy9ELE9BQU8sRUFBQyxZQUFZLEVBQUUsb0JBQW9CLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUdsRSxPQUFPLEVBQUMsaUJBQWlCLEVBQUMsTUFBTSwrQkFBK0IsQ0FBQzs7QUFJaEUsTUFBTSxPQUFPLFdBQVc7SUFZdEI7UUFMUSx3QkFBbUIsR0FBRyxJQUFJLGVBQWUsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUM5QyxrQkFBYSxHQUFVLEVBQUUsQ0FBQztRQUMxQix5QkFBb0IsR0FBRyxJQUFJLGVBQWUsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDL0QsbUJBQWMsR0FBZ0IsRUFBRSxDQUFDO1FBR3ZDLElBQUksQ0FBQywrQkFBK0IsR0FBRyxJQUFJLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsRUFBRSxvQkFBb0IsRUFBRSxDQUFDLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRTtZQUM3SCxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDMUMsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsV0FBVztRQUNULElBQUksQ0FBQywrQkFBK0IsQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUNyRCxDQUFDO0lBRU0sT0FBTztRQUNaLE9BQU8sSUFBSSxDQUFDLG9CQUFvQixDQUFDLFlB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LFFBQVEsR0FBRyxLQUFLLENBQUM7U0FDekI7SUFDSCxDQUFDO0lBRU0sYUFBYSxDQUFDLEVBQVU7UUFDN0IsTUFBTSxNQUFNLEdBQWMsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLEVBQUUsRUFBRSxXQUFXLENBQUMsUUFBUSxDQUFDLENBQUM7UUFFdEYsSUFBSSxNQUFNLEVBQUU7WUFDVixPQUFPLE1BQU0sQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDO1NBQy9CO0lBQ0gsQ0FBQztJQUVNLG1CQUFtQjtRQUN4QixJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDMUMsQ0FBQzsrR0EvWlUsV0FBVzttSEFBWCxXQUFXOzs0RkFBWCxXQUFXO2tCQUR2QixVQUFVIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtJbmplY3RhYmxlLCBPbkRlc3Ryb3l9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtCZWhhdmlvclN1YmplY3QsIE9ic2VydmFibGUsIFN1YnNjcmlwdGlvbn0gZnJvbSAncnhqcyc7XG5pbXBvcnQge2RlYm91bmNlVGltZSwgZGlzdGluY3RVbnRpbENoYW5nZWR9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7Tm9kZUl0ZW19IGZyb20gJy4uL21vZGVscy9ub2RlLWl0ZW0nO1xuaW1wb3J0IHtOb2RlU3RhdGV9IGZyb20gJy4uL21vZGVscy9ub2RlLXN0YXRlJztcbmltcG9ydCB7Tm9kZVNlbGVjdGVkU3RhdGV9IGZyb20gJy4uL21vZGVscy9ub2RlLXNlbGVjdGVkLXN0YXRlJztcbmltcG9ydCB7VHJlZUNhbGxiYWNrc30gZnJvbSAnLi4vbW9kZWxzL3RyZWUtY2FsbGJhY2tzJztcblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIFRyZWVTZXJ2aWNlIGltcGxlbWVudHMgT25EZXN0cm95IHtcbiAgcHJpdmF0ZSByZWFkb25seSBmaWx0ZXJDaGFuZ2VTdWJqZWN0U3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb247XG5cbiAgcHVibGljIGNhbGxiYWNrczogVHJlZUNhbGxiYWNrcztcbiAgcHVibGljIG5vZGVJdGVtczogTm9kZUl0ZW08YW55PltdO1xuICBwdWJsaWMgdHJlZVN0YXRlOiBOb2RlU3RhdGVbXTtcblxuICBwcml2YXRlIGZpbHRlckNoYW5nZVN1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0KCcnKTtcbiAgcHJpdmF0ZSBzZWxlY3RlZEl0ZW1zOiBhbnlbXSA9IFtdO1xuICBwcml2YXRlIHNlbGVjdGVkSXRlbXNTdWJqZWN0ID0gbmV3IEJlaGF2aW9yU3ViamVjdCh0aGlzLnNlbGVjdGVkSXRlbXMpO1xuICBwcml2YXRlIHNlbGVjdGVkU3RhdGVzOiBOb2RlU3RhdGVbXSA9IFtdO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMuZmlsdGVyQ2hhbmdlU3ViamVjdFN1YnNjcmlwdGlvbiA9IHRoaXMuZmlsdGVyQ2hhbmdlU3ViamVjdC5waXBlKGRlYm91bmNlVGltZSgzMDApLCBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgdGhpcy5maWx0ZXJUcmF2ZXJzZSh0aGlzLnRyZWVTdGF0ZSwgJycpO1xuICAgIH0pO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgdGhpcy5maWx0ZXJDaGFuZ2VTdWJqZWN0U3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gIH1cblxuICBwdWJsaWMgY29ubmVjdCgpOiBPYnNlcnZhYmxlPGFueVtdPiB7XG4gICAgcmV0dXJuIHRoaXMuc2VsZWN0ZWRJdGVtc1N1YmplY3QuYXNPYnNlcnZhYmxlKCk7XG4gIH1cblxuICBwdWJsaWMgc2V0SW5pdGlhbFN0YXRlKCk6IHZvaWQge1xuICAgIHRoaXMuc2V0SW5pdGlhbFNlbGVjdGVkU3RhdGUodGhpcy50cmVlU3RhdGUpO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXRJbml0aWFsU2VsZWN0ZWRTdGF0ZShub2RlU3RhdGVzOiBOb2RlU3RhdGVbXSk6IHZvaWQge1xuICAgIGZvciAoY29uc3Qgc3RhdGUgb2Ygbm9kZVN0YXRlcykge1xuICAgICAgaWYgKHN0YXRlLm5vZGVJdGVtLnNlbGVjdGVkICYmICghc3RhdGUuY2hpbGRyZW4gfHwgc3RhdGUuY2hpbGRyZW4ubGVuZ3RoID09PSAwKSkge1xuICAgICAgICB0aGlzLnRvZ2dsZVNlbGVjdGVkU3RhdGUoc3RhdGUsIHRydWUpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLnNldEluaXRpYWxTZWxlY3RlZFN0YXRlKHN0YXRlLmNoaWxkcmVuKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgY2xlYXIoKTogdm9pZCB7XG4gICAgZm9yIChsZXQgc3RhdGUgb2YgdGhpcy5zZWxlY3RlZFN0YXRlcykge1xuICAgICAgc3RhdGUuc2VsZWN0ZWQgPSBmYWxzZTtcbiAgICAgIHN0YXRlLnNlbGVjdGVkU3RhdGUgPSBOb2RlU2VsZWN0ZWRTdGF0ZS51bkNoZWNrZWQ7XG4gICAgfVxuXG4gICAgdGhpcy5zZWxlY3RlZEl0ZW1zLmxlbmd0aCA9IDA7XG4gICAgdGhpcy5zZWxlY3RlZFN0YXRlcy5sZW5ndGggPSAwO1xuICB9XG5cbiAgcHJpdmF0ZSBmaWx0ZXJUcmF2ZXJzZShzdGF0ZXM6IE5vZGVTdGF0ZVtdLCBmaWx0ZXI6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGxldCByZXN1bHRzOiBib29sZWFuW10gPSBbXTtcblxuICAgIGZvciAobGV0IHN0YXRlIG9mIHN0YXRlcykge1xuICAgICAgaWYgKHN0YXRlLmNoaWxkcmVuLmxlbmd0aCA+IDApIHtcbiAgICAgICAgc3RhdGUuaGFzRmlsdGVyZWRDaGlsZHJlbiA9IGZhbHNlO1xuICAgICAgICBzdGF0ZS5oYXNGaWx0ZXJlZENoaWxkcmVuID0gdGhpcy5maWx0ZXJUcmF2ZXJzZShzdGF0ZS5jaGlsZHJlbiwgZmlsdGVyKTtcblxuICAgICAgICBpZiAodGhpcy5hcHBseUZpbHRlcihzdGF0ZSwgZmlsdGVyKSkge1xuICAgICAgICAgIHN0YXRlLmhhc0ZpbHRlcmVkQ2hpbGRyZW4gPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmVzdWx0cy5wdXNoKHN0YXRlLmhhc0ZpbHRlcmVkQ2hpbGRyZW4pO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiByZXN1bHRzLnNvbWUoKGl0ZW06IGJvb2xlYW4pID0+IGl0ZW0pO1xuICB9XG5cbiAgcHJpdmF0ZSBhcHBseUZpbHRlcihzdGF0ZTogTm9kZVN0YXRlLCBmaWx0ZXI6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHN0YXRlLmZpbHRlcmVkQ2hpbGRyZW4gPSB0aGlzLmZpbHRlcihzdGF0ZS5jaGlsZHJlbiwgZmlsdGVyKTtcbiAgICByZXR1cm4gc3RhdGUuZmlsdGVyZWRDaGlsZHJlbi5sZW5ndGggPiAwO1xuICB9XG5cbiAgcHJpdmF0ZSBmaWx0ZXIoc3RhdGVzOiBOb2RlU3RhdGVbXSwgdmFsdWU6IHN0cmluZyk6IE5vZGVTdGF0ZVtdIHtcbiAgICByZXR1cm4gc3RhdGVzLmZpbHRlcigobm9kZVN0YXRlOiBOb2RlU3RhdGUpID0+IG5vZGVTdGF0ZS5oYXNGaWx0ZXJlZENoaWxkcmVuIHx8IHZhbHVlID09PSAnJyB8fCBub2RlU3RhdGUubm9kZUl0ZW0ubmFtZS50b0xvd2VyQ2FzZSgpLmluZGV4T2YodmFsdWUpICE9PSAtMSk7XG4gIH1cblxuICBwdWJsaWMgY2hlY2tib3hDbGljayhzdGF0ZTogTm9kZVN0YXRlKTogdm9pZCB7XG4gICAgdGhpcy50b2dnbGVTZWxlY3RlZFN0YXRlKHN0YXRlLCBmYWxzZSk7XG5cbiAgICBpZiAodGhpcy5jYWxsYmFja3M/LnRvZ2dsZSkge1xuICAgICAgdGhpcy5jYWxsYmFja3MudG9nZ2xlKHN0YXRlLm5vZGVJdGVtKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHRvZ2dsZVNlbGVjdGVkU3RhdGUoc3RhdGU6IE5vZGVTdGF0ZSwgaWdub3JlRGlzYWJsZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBpZiAoc3RhdGUuZGlzYWJsZWQgJiYgIWlnbm9yZURpc2FibGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHN0YXRlLnNlbGVjdGVkU3RhdGUgPT09IE5vZGVTZWxlY3RlZFN0YXRlLnVuQ2hlY2tlZCkge1xuICAgICAgdGhpcy5zZXRDaGVja2VkKHN0YXRlLCB0cnVlLCBpZ25vcmVEaXNhYmxlZCk7XG4gICAgfSBlbHNlIGlmIChzdGF0ZS5zZWxlY3RlZFN0YXRlID09PSBOb2RlU2VsZWN0ZWRTdGF0ZS5jaGVja2VkKSB7XG4gICAgICB0aGlzLnNldFVuY2hlY2tlZChzdGF0ZSwgdHJ1ZSwgaWdub3JlRGlzYWJsZWQpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAodGhpcy5hbnlBY3RpdmVTZWxlY3RlZChzdGF0ZSkgJiYgIXN0YXRlLnNlbGVjdGVkKSB7XG4gICAgICAgIHRoaXMuc2V0VW5jaGVja2VkKHN0YXRlLCB0cnVlLCBpZ25vcmVEaXNhYmxlZCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnNldENoZWNrZWQoc3RhdGUsIHRydWUsIGlnbm9yZURpc2FibGVkKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoc3RhdGUucGFyZW50KSB7XG4gICAgICB0aGlzLmNoaWxkU3RhdGVDaGFuZ2VkKHN0YXRlLnBhcmVudCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzZXRDaGVja2VkKHN0YXRlOiBOb2RlU3RhdGUsIHByb3BhZ2F0ZTogYm9vbGVhbiwgaWdub3JlRGlzYWJsZWQ/OiBib29sZWFuKTogdm9pZCB7XG4gICAgaWYgKHN0YXRlLmRpc2FibGVkICYmICFpZ25vcmVEaXNhYmxlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHN0YXRlLnNlbGVjdGVkU3RhdGUgPSBOb2RlU2VsZWN0ZWRTdGF0ZS5jaGVja2VkO1xuICAgIHN0YXRlLnNlbGVjdGVkID0gdHJ1ZTtcblxuICAgIGlmIChUcmVlU2VydmljZS5oYXNOb0NoaWxkcmVuKHN0YXRlKSkge1xuICAgICAgdGhpcy5hZGRTZWxlY3RlZChzdGF0ZSk7XG4gICAgfSBlbHNlIGlmIChwcm9wYWdhdGUpIHtcbiAgICAgIGZvciAoY29uc3QgY2hpbGQgb2Ygc3RhdGUuY2hpbGRyZW4pIHtcbiAgICAgICAgdGhpcy5zZXRDaGVja2VkKGNoaWxkLCBwcm9wYWdhdGUsIGlnbm9yZURpc2FibGVkKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHNldFVuY2hlY2tlZChzdGF0ZTogTm9kZVN0YXRlLCBwcm9wYWdhdGU6IGJvb2xlYW4sIGlnbm9yZURpc2FibGVkPzogYm9vbGVhbikge1xuICAgIGlmIChzdGF0ZS5kaXNhYmxlZCAmJiAhaWdub3JlRGlzYWJsZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBzdGF0ZS5zZWxlY3RlZFN0YXRlID0gTm9kZVNlbGVjdGVkU3RhdGUudW5DaGVja2VkO1xuICAgIHN0YXRlLnNlbGVjdGVkID0gZmFsc2U7XG5cbiAgICBpZiAoVHJlZVNlcnZpY2UuaGFzTm9DaGlsZHJlbihzdGF0ZSkpIHtcbiAgICAgIHRoaXMucmVtb3ZlU2VsZWN0ZWQoc3RhdGUubm9kZUl0ZW0uaXRlbSk7XG5cbiAgICAgIGlmICh0aGlzLmNhbGxiYWNrcz8udW5TZWxlY3QpIHtcbiAgICAgICAgdGhpcy5jYWxsYmFja3MudW5TZWxlY3Qoc3RhdGUubm9kZUl0ZW0pO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAocHJvcGFnYXRlKSB7XG4gICAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIHN0YXRlLmNoaWxkcmVuKSB7XG4gICAgICAgIHRoaXMuc2V0VW5jaGVja2VkKGNoaWxkLCBwcm9wYWdhdGUsIGlnbm9yZURpc2FibGVkKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuYW55Q2hpbGRTZWxlY3RlZChzdGF0ZSkpIHtcbiAgICAgIHRoaXMucmVtb3ZlU2VsZWN0ZWQoc3RhdGUubm9kZUl0ZW0uaXRlbSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSByZW1vdmVTZWxlY3RlZChpdGVtOiBhbnkpOiB2b2lkIHtcbiAgICBsZXQgaW5kZXggPSB0aGlzLnNlbGVjdGVkSXRlbXMuaW5kZXhPZihpdGVtKTtcbiAgICBpZiAoaW5kZXggIT09IC0xKSB7XG4gICAgICB0aGlzLnNlbGVjdGVkSXRlbXMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBoYXNOb0NoaWxkcmVuKHN0YXRlOiBOb2RlU3RhdGUpOiBib29sZWFuIHtcbiAgICByZXR1cm4gIXN0YXRlLmNoaWxkcmVuIHx8IHN0YXRlLmNoaWxkcmVuLmxlbmd0aCA9PT0gMDtcbiAgfVxuXG4gIHByaXZhdGUgYWRkU2VsZWN0ZWQoc3RhdGU6IE5vZGVTdGF0ZSk6IHZvaWQge1xuICAgIHRoaXMuc2VsZWN0ZWRJdGVtcy5wdXNoKHN0YXRlLm5vZGVJdGVtLml0ZW0pO1xuICAgIHRoaXMuc2VsZWN0ZWRTdGF0ZXMucHVzaChzdGF0ZSk7XG5cbiAgICBpZiAodGhpcy5jYWxsYmFja3M/LnNlbGVjdCkge1xuICAgICAgdGhpcy5jYWxsYmFja3Muc2VsZWN0KHN0YXRlLm5vZGVJdGVtKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgcmVFdmFsdWF0ZVNlbGVjdGVkU3RhdGUoc3RhdGU6IE5vZGVTdGF0ZSk6IHZvaWQge1xuICAgIGlmICghVHJlZVNlcnZpY2UuaGFzTm9DaGlsZHJlbihzdGF0ZSkpIHtcbiAgICAgIHRoaXMuY2hpbGRTdGF0ZUNoYW5nZWQoc3RhdGUpO1xuXG4gICAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIHN0YXRlLmNoaWxkcmVuKSB7XG4gICAgICAgIHRoaXMucmVFdmFsdWF0ZVNlbGVjdGVkU3RhdGUoY2hpbGQpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBjaGlsZFN0YXRlQ2hhbmdlZChzdGF0ZTogTm9kZVN0YXRlKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuYW55Q2hpbGRTZWxlY3RlZChzdGF0ZSkpIHtcbiAgICAgIGlmIChzdGF0ZS5ub2RlSXRlbS5pZCAhPSAnMCcpIHtcbiAgICAgICAgbGV0IGl0ZW1JbmRleCA9IHRoaXMuc2VsZWN0ZWRJdGVtcy5pbmRleE9mKHN0YXRlLm5vZGVJdGVtLml0ZW0pO1xuXG4gICAgICAgIGlmIChpdGVtSW5kZXggPT09IC0xKSB7XG4gICAgICAgICAgdGhpcy5zZWxlY3RlZEl0ZW1zLnB1c2goc3RhdGUubm9kZUl0ZW0uaXRlbSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuYWxsQ2hpbGRyZW5TZWxlY3RlZChzdGF0ZSkpIHtcbiAgICAgICAgdGhpcy5zZXRDaGVja2VkKHN0YXRlLCBmYWxzZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzdGF0ZS5zZWxlY3RlZFN0YXRlID0gTm9kZVNlbGVjdGVkU3RhdGUuaW5kZXRlcm1pbmF0ZTtcbiAgICAgICAgc3RhdGUuc2VsZWN0ZWQgPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zZXRVbmNoZWNrZWQoc3RhdGUsIGZhbHNlKTtcbiAgICB9XG5cbiAgICBpZiAoc3RhdGUucGFyZW50KSB7XG4gICAgICB0aGlzLmNoaWxkU3RhdGVDaGFuZ2VkKHN0YXRlLnBhcmVudCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhbnlDaGlsZFNlbGVjdGVkKHN0YXRlOiBOb2RlU3RhdGUpOiBib29sZWFuIHtcbiAgICByZXR1cm4gc3RhdGUuY2hpbGRyZW4uZmluZCgoaXRlbTogTm9kZVN0YXRlKSA9PiBpdGVtLnNlbGVjdGVkU3RhdGUgPT09IE5vZGVTZWxlY3RlZFN0YXRlLmNoZWNrZWQgfHwgaXRlbS5zZWxlY3RlZFN0YXRlID09PSBOb2RlU2VsZWN0ZWRTdGF0ZS5pbmRldGVybWluYXRlKSAhPSBudWxsO1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyBpbml0U3RhdGUocGFyZW50OiBOb2RlU3RhdGUsIG5vZGVJdGVtOiBOb2RlSXRlbTxhbnk+KTogTm9kZVN0YXRlIHtcbiAgICByZXR1cm4ge1xuICAgICAgcGFyZW50OiBwYXJlbnQsXG4gICAgICBjaGlsZHJlbjogW10sXG4gICAgICBmaWx0ZXJlZENoaWxkcmVuOiBbXSxcbiAgICAgIGhhc0ZpbHRlcmVkQ2hpbGRyZW46IGZhbHNlLFxuICAgICAgbm9kZUl0ZW06IG5vZGVJdGVtLFxuICAgICAgZXhwYW5kZWQ6IG5vZGVJdGVtLmV4cGFuZGVkICE9PSBmYWxzZSxcbiAgICAgIGRpc2FibGVkOiBub2RlSXRlbS5kaXNhYmxlZCA9PT0gdHJ1ZSxcbiAgICAgIHNlbGVjdGVkU3RhdGU6IE5vZGVTZWxlY3RlZFN0YXRlLnVuQ2hlY2tlZCxcbiAgICAgIHNlbGVjdGVkOiBmYWxzZVxuICAgIH07XG4gIH1cblxuICBwdWJsaWMgZGVsZXRlQnlJZChpZDogc3RyaW5nKTogdm9pZCB7XG4gICAgbGV0IHJlc3VsdDogTm9kZVN0YXRlID0gdGhpcy5nZXROb2RlU3RhdGUodGhpcy50cmVlU3RhdGUsIGlkLCBUcmVlU2VydmljZS5maW5kQnlJZCk7XG4gICAgaWYgKHJlc3VsdCkge1xuICAgICAgdGhpcy5kZWxldGVCeVN0YXRlKHJlc3VsdCk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGRlbGV0ZUJ5U3RhdGUoc3RhdGU6IE5vZGVTdGF0ZSk6IHZvaWQge1xuICAgIHRoaXMuZGVsZXRlKHN0YXRlKTtcbiAgICB0aGlzLmNoaWxkU3RhdGVDaGFuZ2VkKHN0YXRlKTtcbiAgICB0aGlzLmZpbHRlclRyYXZlcnNlKHRoaXMudHJlZVN0YXRlLCAnJyk7XG4gIH1cblxuICBwcml2YXRlIGRlbGV0ZShzdGF0ZTogTm9kZVN0YXRlKTogdm9pZCB7XG4gICAgd2hpbGUgKHN0YXRlLmNoaWxkcmVuLmxlbmd0aCA+IDApIHtcbiAgICAgIGxldCByZXN1bHQ6IE5vZGVTdGF0ZSA9IHN0YXRlLmNoaWxkcmVuLnBvcCgpO1xuXG4gICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgIHRoaXMuZGVsZXRlKHJlc3VsdCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5yZW1vdmVTZWxlY3RlZChzdGF0ZS5ub2RlSXRlbS5pdGVtKTtcbiAgICBUcmVlU2VydmljZS5yZW1vdmUoc3RhdGUpO1xuXG4gICAgaWYgKCFzdGF0ZS5wYXJlbnQpIHtcbiAgICAgIFRyZWVTZXJ2aWNlLmRlbGV0ZVJvb3Qoc3RhdGUsIHRoaXMudHJlZVN0YXRlLCB0aGlzLm5vZGVJdGVtcyk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSB0b2dnbGVFeHBhbmRlZFRyYXZlcnNlKG5vZGVTdGF0ZXM6IE5vZGVTdGF0ZVtdLCB2YWx1ZTogYm9vbGVhbik6IHZvaWQge1xuICAgIGZvciAobGV0IHN0YXRlIG9mIG5vZGVTdGF0ZXMpIHtcbiAgICAgIHN0YXRlLmV4cGFuZGVkID0gdmFsdWU7XG4gICAgICB0aGlzLnRvZ2dsZUV4cGFuZGVkVHJhdmVyc2Uoc3RhdGUuY2hpbGRyZW4sIHZhbHVlKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBkZWxldGVSb290KHN0YXRlOiBOb2RlU3RhdGUsIG5vZGVTdGF0ZXM6IE5vZGVTdGF0ZVtdLCBub2RlSXRlbXM6IE5vZGVJdGVtPGFueT5bXSk6IHZvaWQge1xuICAgIGxldCBpdGVtSW5kZXg6IG51bWJlciA9IG5vZGVJdGVtcy5pbmRleE9mKHN0YXRlLm5vZGVJdGVtKTtcblxuICAgIGlmIChpdGVtSW5kZXggIT09IC0xKSB7XG4gICAgICBub2RlSXRlbXMuc3BsaWNlKGl0ZW1JbmRleCwgMSk7XG4gICAgfVxuXG4gICAgbGV0IGluZGV4ID0gbm9kZVN0YXRlcy5pbmRleE9mKHN0YXRlKTtcblxuICAgIGlmIChpbmRleCAhPT0gLTEpIHtcbiAgICAgIG5vZGVTdGF0ZXMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFkZE5ld05vZGUobm9kZVN0YXRlOiBOb2RlU3RhdGUsIHBhcmVudDogTm9kZVN0YXRlKTogdm9pZCB7XG4gICAgbm9kZVN0YXRlLnBhcmVudCA9IHBhcmVudDtcbiAgICBwYXJlbnQuY2hpbGRyZW4ucHVzaChub2RlU3RhdGUpO1xuICAgIGlmIChwYXJlbnQubm9kZUl0ZW0uY2hpbGRyZW4pIHtcbiAgICAgIHBhcmVudC5ub2RlSXRlbS5jaGlsZHJlbi5wdXNoKG5vZGVTdGF0ZS5ub2RlSXRlbSk7XG4gICAgfVxuXG4gICAgdGhpcy5jaGlsZFN0YXRlQ2hhbmdlZChwYXJlbnQpO1xuICAgIHRoaXMuZmlsdGVyVHJhdmVyc2UodGhpcy50cmVlU3RhdGUsICcnKTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIHJlbW92ZShzdGF0ZTogTm9kZVN0YXRlKTogdm9pZCB7XG4gICAgaWYgKHN0YXRlLnBhcmVudCkge1xuICAgICAgc3RhdGUucGFyZW50Lmhhc0ZpbHRlcmVkQ2hpbGRyZW4gPSBmYWxzZTtcblxuICAgICAgaWYgKHN0YXRlLnBhcmVudC5ub2RlSXRlbS5jaGlsZHJlbikge1xuICAgICAgICBsZXQgaXRlbUluZGV4ID0gc3RhdGUucGFyZW50Lm5vZGVJdGVtLmNoaWxkcmVuLmluZGV4T2Yoc3RhdGUubm9kZUl0ZW0pO1xuICAgICAgICBpZiAoaXRlbUluZGV4ICE9PSAtMSkge1xuICAgICAgICAgIHN0YXRlLnBhcmVudC5ub2RlSXRlbS5jaGlsZHJlbi5zcGxpY2UoaXRlbUluZGV4LCAxKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBsZXQgaW5kZXggPSBzdGF0ZS5wYXJlbnQuY2hpbGRyZW4uaW5kZXhPZihzdGF0ZSk7XG4gICAgICBpZiAoaW5kZXggIT09IC0xKSB7XG4gICAgICAgIHN0YXRlLnBhcmVudC5jaGlsZHJlbi5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgfVxuXG4gICAgICBsZXQgZmlsdGVyZWRJbmRleCA9IHN0YXRlLnBhcmVudC5maWx0ZXJlZENoaWxkcmVuLmluZGV4T2Yoc3RhdGUpO1xuICAgICAgaWYgKGZpbHRlcmVkSW5kZXggIT09IC0xKSB7XG4gICAgICAgIHN0YXRlLnBhcmVudC5maWx0ZXJlZENoaWxkcmVuLnNwbGljZShmaWx0ZXJlZEluZGV4LCAxKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFsbENoaWxkcmVuU2VsZWN0ZWQoc3RhdGU6IE5vZGVTdGF0ZSk6IGJvb2xlYW4ge1xuICAgIGlmIChzdGF0ZS5ub2RlSXRlbS5jaGlsZHJlbikge1xuICAgICAgcmV0dXJuIHN0YXRlLmNoaWxkcmVuLmV2ZXJ5KGl0ID0+IGl0LnNlbGVjdGVkU3RhdGUgPT09IE5vZGVTZWxlY3RlZFN0YXRlLmNoZWNrZWQpICYmIHN0YXRlLmNoaWxkcmVuLmxlbmd0aCA9PT0gc3RhdGUubm9kZUl0ZW0uY2hpbGRyZW4ubGVuZ3RoO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gc3RhdGUuY2hpbGRyZW4uZXZlcnkoaXQgPT4gaXQuc2VsZWN0ZWRTdGF0ZSA9PT0gTm9kZVNlbGVjdGVkU3RhdGUuY2hlY2tlZCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSB0b2dnbGVFeHBhbmRlZFRyYXZlcnNlQXNjKG5vZGVTdGF0ZTogTm9kZVN0YXRlLCB2YWx1ZTogYm9vbGVhbik6IHZvaWQge1xuICAgIG5vZGVTdGF0ZS5leHBhbmRlZCA9IHZhbHVlO1xuXG4gICAgaWYgKG5vZGVTdGF0ZS5wYXJlbnQpIHtcbiAgICAgIHRoaXMudG9nZ2xlRXhwYW5kZWRUcmF2ZXJzZUFzYyhub2RlU3RhdGUucGFyZW50LCB2YWx1ZSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhbnlBY3RpdmVTZWxlY3RlZChzdGF0ZTogTm9kZVN0YXRlKTogYm9vbGVhbiB7XG4gICAgbGV0IHJlc3VsdCA9IHN0YXRlLmNoaWxkcmVuLmZpbHRlcihpdCA9PiAhaXQuZGlzYWJsZWQgJiYgaXQuc2VsZWN0ZWQpLmxlbmd0aCA+IDA7XG5cbiAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIHN0YXRlLmNoaWxkcmVuKSB7XG4gICAgICBpZiAoIVRyZWVTZXJ2aWNlLmhhc05vQ2hpbGRyZW4oY2hpbGQpICYmIHRoaXMuYW55QWN0aXZlU2VsZWN0ZWQoY2hpbGQpKSB7XG4gICAgICAgIHJlc3VsdCA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIGZpbmRCeUlkKHN0YXRlOiBOb2RlU3RhdGUsIGFyZzogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHN0YXRlLm5vZGVJdGVtLmlkID09PSBhcmc7XG4gIH1cblxuICBwcml2YXRlIGdldE5vZGVTdGF0ZShub2RlU3RhdGVzOiBOb2RlU3RhdGVbXSwgYXJnOiBhbnksIGNvbXBhcmU6IChzdGF0ZTogTm9kZVN0YXRlLCBmaW5kOiBhbnkpID0+IGJvb2xlYW4pOiBOb2RlU3RhdGUge1xuICAgIGxldCBub2RlU3RhdGU6IE5vZGVTdGF0ZSA9IG5vZGVTdGF0ZXMuZmluZCgoaXQ6IE5vZGVTdGF0ZSkgPT4gY29tcGFyZShpdCwgYXJnKSk7XG5cbiAgICBpZiAobm9kZVN0YXRlKSB7XG4gICAgICByZXR1cm4gbm9kZVN0YXRlO1xuICAgIH0gZWxzZSB7XG4gICAgICBmb3IgKGxldCBzdGF0ZSBvZiBub2RlU3RhdGVzKSB7XG4gICAgICAgIGxldCBjaGlsZHJlbiA9IHRoaXMuZ2V0Tm9kZVN0YXRlKHN0YXRlLmNoaWxkcmVuLCBhcmcsIGNvbXBhcmUpO1xuICAgICAgICBpZiAoY2hpbGRyZW4pIHtcbiAgICAgICAgICByZXR1cm4gY2hpbGRyZW47XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwdWJsaWMgdG9nZ2xlRXhwYW5kZWQodmFsdWU6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLnRvZ2dsZUV4cGFuZGVkVHJhdmVyc2UodGhpcy50cmVlU3RhdGUsIHZhbHVlKTtcbiAgfVxuXG4gIHB1YmxpYyBhZGROb2RlQnlJZChub2RlU3RhdGU6IE5vZGVTdGF0ZSwgaWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIGxldCByZXN1bHQ6IE5vZGVTdGF0ZSA9IHRoaXMuZ2V0Tm9kZVN0YXRlKHRoaXMudHJlZVN0YXRlLCBpZCwgVHJlZVNlcnZpY2UuZmluZEJ5SWQpO1xuXG4gICAgaWYgKHJlc3VsdCkge1xuICAgICAgaWYgKCFyZXN1bHQuY2hpbGRyZW4pIHtcbiAgICAgICAgcmVzdWx0LmNoaWxkcmVuID0gW107XG4gICAgICB9XG5cbiAgICAgIHRoaXMuYWRkTmV3Tm9kZShub2RlU3RhdGUsIHJlc3VsdCk7XG5cbiAgICAgIGlmIChyZXN1bHQubm9kZUl0ZW0uaXRlbSkge1xuICAgICAgICB0aGlzLnJlbW92ZVNlbGVjdGVkKHJlc3VsdC5ub2RlSXRlbS5pdGVtKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwdWJsaWMgZWRpdEl0ZW1CeUlkKGlkOiBzdHJpbmcsIGl0ZW06IGFueSk6IHZvaWQge1xuICAgIGNvbnN0IG5vZGVTdGF0ZTogTm9kZVN0YXRlID0gdGhpcy5nZXROb2RlU3RhdGUodGhpcy50cmVlU3RhdGUsIGlkLCBUcmVlU2VydmljZS5maW5kQnlJZCk7XG5cbiAgICBpZiAobm9kZVN0YXRlICYmIG5vZGVTdGF0ZS5ub2RlSXRlbSkge1xuICAgICAgaWYgKHRoaXMuc2VsZWN0ZWRJdGVtcy5pbmNsdWRlcyhub2RlU3RhdGUubm9kZUl0ZW0uaXRlbSkpIHtcbiAgICAgICAgdGhpcy5yZW1vdmVTZWxlY3RlZChub2RlU3RhdGUubm9kZUl0ZW0uaXRlbSk7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRJdGVtcy5wdXNoKGl0ZW0pO1xuICAgICAgICB0aGlzLnNlbGVjdGVkSXRlbXNTdWJqZWN0Lm5leHQodGhpcy5zZWxlY3RlZEl0ZW1zKTtcbiAgICAgIH1cblxuICAgICAgbm9kZVN0YXRlLm5vZGVJdGVtLml0ZW0gPSBpdGVtO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBleHBhbmRCeUlkKGlkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCByZXN1bHQ6IE5vZGVTdGF0ZSA9IHRoaXMuZ2V0Tm9kZVN0YXRlKHRoaXMudHJlZVN0YXRlLCBpZCwgVHJlZVNlcnZpY2UuZmluZEJ5SWQpO1xuXG4gICAgaWYgKHJlc3VsdCkge1xuICAgICAgdGhpcy50b2dnbGVFeHBhbmRlZFRyYXZlcnNlQXNjKHJlc3VsdCwgdHJ1ZSk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGNvbGxhcHNlQnlJZChpZDogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgcmVzdWx0OiBOb2RlU3RhdGUgPSB0aGlzLmdldE5vZGVTdGF0ZSh0aGlzLnRyZWVTdGF0ZSwgaWQsIFRyZWVTZXJ2aWNlLmZpbmRCeUlkKTtcblxuICAgIGlmIChyZXN1bHQpIHtcbiAgICAgIHJlc3VsdC5leHBhbmRlZCA9IGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBnZXRQYXJlbnRCeUlkKGlkOiBzdHJpbmcpOiBOb2RlSXRlbTxhbnk+IHtcbiAgICBjb25zdCByZXN1bHQ6IE5vZGVTdGF0ZSA9IHRoaXMuZ2V0Tm9kZVN0YXRlKHRoaXMudHJlZVN0YXRlLCBpZCwgVHJlZVNlcnZpY2UuZmluZEJ5SWQpO1xuXG4gICAgaWYgKHJlc3VsdCkge1xuICAgICAgcmV0dXJuIHJlc3VsdC5wYXJlbnQubm9kZUl0ZW07XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGZvcmNlRmlsdGVyVHJhdmVyc2UoKTogdm9pZCB7XG4gICAgdGhpcy5maWx0ZXJUcmF2ZXJzZSh0aGlzLnRyZWVTdGF0ZSwgJycpO1xuICB9XG59XG4iXX0=