@skyux/angular-tree-component 8.7.0 → 9.0.0-alpha.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 (25) hide show
  1. package/documentation.json +6 -6
  2. package/{esm2020 → esm2022}/lib/modules/angular-tree/angular-tree-adapter.service.mjs +8 -11
  3. package/{esm2020 → esm2022}/lib/modules/angular-tree/angular-tree-context-menu.component.mjs +4 -4
  4. package/esm2022/lib/modules/angular-tree/angular-tree-node.component.mjs +254 -0
  5. package/{esm2020 → esm2022}/lib/modules/angular-tree/angular-tree-toolbar.component.mjs +4 -4
  6. package/esm2022/lib/modules/angular-tree/angular-tree-wrapper.component.mjs +190 -0
  7. package/esm2022/lib/modules/angular-tree/angular-tree.module.mjs +53 -0
  8. package/esm2022/lib/modules/shared/sky-angular-tree-component-resources.module.mjs +51 -0
  9. package/fesm2022/skyux-angular-tree-component.mjs +616 -0
  10. package/fesm2022/skyux-angular-tree-component.mjs.map +1 -0
  11. package/lib/modules/angular-tree/angular-tree-node.component.d.ts +2 -2
  12. package/lib/modules/angular-tree/angular-tree-toolbar.component.d.ts +1 -1
  13. package/lib/modules/angular-tree/angular-tree-wrapper.component.d.ts +3 -3
  14. package/lib/modules/angular-tree/angular-tree.module.d.ts +1 -1
  15. package/package.json +13 -19
  16. package/esm2020/lib/modules/angular-tree/angular-tree-node.component.mjs +0 -257
  17. package/esm2020/lib/modules/angular-tree/angular-tree-wrapper.component.mjs +0 -189
  18. package/esm2020/lib/modules/angular-tree/angular-tree.module.mjs +0 -53
  19. package/esm2020/lib/modules/shared/sky-angular-tree-component-resources.module.mjs +0 -51
  20. package/fesm2015/skyux-angular-tree-component.mjs +0 -625
  21. package/fesm2015/skyux-angular-tree-component.mjs.map +0 -1
  22. package/fesm2020/skyux-angular-tree-component.mjs +0 -619
  23. package/fesm2020/skyux-angular-tree-component.mjs.map +0 -1
  24. /package/{esm2020 → esm2022}/index.mjs +0 -0
  25. /package/{esm2020 → esm2022}/skyux-angular-tree-component.mjs +0 -0
@@ -218,7 +218,7 @@
218
218
  "type": {
219
219
  "type": "reference",
220
220
  "qualifiedName": "IDTypeDictionary",
221
- "package": "@circlon/angular-tree-component",
221
+ "package": "@blackbaud/angular-tree-component",
222
222
  "name": "IDTypeDictionary"
223
223
  },
224
224
  "defaultValue": "{}"
@@ -297,7 +297,7 @@
297
297
  "type": {
298
298
  "type": "reference",
299
299
  "qualifiedName": "TreeComponent",
300
- "package": "@circlon/angular-tree-component",
300
+ "package": "@blackbaud/angular-tree-component",
301
301
  "name": "TreeComponent"
302
302
  }
303
303
  },
@@ -747,7 +747,7 @@
747
747
  "type": {
748
748
  "type": "reference",
749
749
  "qualifiedName": "TreeNode",
750
- "package": "@circlon/angular-tree-component",
750
+ "package": "@blackbaud/angular-tree-component",
751
751
  "name": "TreeNode"
752
752
  }
753
753
  },
@@ -1520,12 +1520,12 @@
1520
1520
  {
1521
1521
  "fileName": "angular-tree-demo.component.ts",
1522
1522
  "filePath": "/projects/angular-tree-component/documentation/code-examples/angular-tree/advanced/angular-tree-demo.component.ts",
1523
- "rawContents": "import {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n OnInit,\n ViewChild,\n} from '@angular/core';\nimport { FormBuilder, FormControl, FormGroup } from '@angular/forms';\nimport {\n ITreeOptions,\n ITreeState,\n TreeModel,\n TreeNode,\n} from '@circlon/angular-tree-component';\n\nimport { AngularTreeDemoNode } from './angular-tree-demo-node';\n\n@Component({\n selector: 'app-angular-tree-component-demo',\n styleUrls: ['./angular-tree-demo.component.scss'],\n templateUrl: './angular-tree-demo.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class AngularTreeDemoComponent implements OnInit {\n public demoOptions: FormGroup;\n\n public set enableCascading(value: boolean) {\n this.#resetSelection();\n this.treeOptions.useTriState = value;\n this.#_enableCascading = value;\n\n if (value) {\n this.selectLeafNodesOnly = false;\n }\n }\n\n public get enableCascading(): boolean {\n return this.#_enableCascading;\n }\n\n public readOnly = false;\n\n public selectedSelectMode = 'multiSelect';\n\n public set selectLeafNodesOnly(value: boolean) {\n this.#resetSelection();\n this.#_selectLeafNodesOnly = value;\n\n if (value) {\n this.enableCascading = false;\n }\n }\n\n public get selectLeafNodesOnly(): boolean {\n return this.#_selectLeafNodesOnly;\n }\n\n public selectSingle = false;\n\n public showContextMenus = false;\n\n public showToolbar = false;\n\n #_enableCascading = false;\n\n #_selectLeafNodesOnly = false;\n\n public treeOptions: ITreeOptions = {\n animateExpand: true,\n useTriState: false,\n };\n\n public dropdownItems: { name: string; disabled: boolean }[] = [\n { name: 'Insert an item at this level', disabled: false },\n { name: 'Insert an item under this level', disabled: false },\n { name: 'Move up', disabled: false },\n { name: 'Move down', disabled: false },\n { name: 'Move left', disabled: false },\n { name: 'Move right', disabled: false },\n { name: 'Edit', disabled: false },\n { name: 'Delete', disabled: false },\n ];\n\n public nodes: AngularTreeDemoNode[] = [\n {\n name: 'Animals',\n isExpanded: true,\n children: [\n {\n name: 'Cats',\n isExpanded: true,\n children: [\n { name: 'Burmese' },\n { name: 'Persian' },\n { name: 'Tabby' },\n ],\n },\n {\n name: 'Dogs',\n isExpanded: true,\n children: [\n { name: 'Beagle' },\n { name: 'German shepherd' },\n { name: 'Labrador retriever' },\n ],\n },\n ],\n },\n ];\n\n @ViewChild(TreeModel)\n public tree: TreeModel | undefined;\n\n #changeRef: ChangeDetectorRef;\n\n constructor(changeRef: ChangeDetectorRef, formBuilder: FormBuilder) {\n this.#changeRef = changeRef;\n\n this.demoOptions = formBuilder.group({\n treeMode: new FormControl('navigation'),\n selectMode: new FormControl('multiSelect'),\n selectLeafNodesOnly: new FormControl(),\n enableCascading: new FormControl(),\n showToolbar: new FormControl(),\n showContextMenus: new FormControl(),\n });\n }\n\n public ngOnInit(): void {\n this.demoOptions.valueChanges.subscribe((value) => {\n if (value.treeMode) {\n switch (value.treeMode) {\n case 'selection':\n this.readOnly = false;\n this.#enableSelection(true);\n break;\n\n case 'readOnly':\n this.readOnly = true;\n this.#enableSelection(false);\n break;\n\n case 'navigation':\n this.readOnly = false;\n this.#enableSelection(false);\n break;\n\n default:\n break;\n }\n }\n\n if (value.selectMode) {\n switch (value.selectMode) {\n case 'singleSelect':\n this.#resetSelection();\n this.selectSingle = true;\n this.enableCascading = false;\n break;\n\n case 'multiSelect':\n this.#resetSelection();\n this.selectSingle = false;\n this.enableCascading = false;\n break;\n\n default:\n break;\n }\n }\n\n if (value.enableCascading) {\n this.enableCascading = value.enableCascading;\n }\n\n if (value.selectLeafNodesOnly) {\n this.selectLeafNodesOnly = value.selectLeafNodesOnly;\n }\n\n this.#changeRef.markForCheck();\n });\n }\n\n public actionClicked(name: string, node: TreeNode): void {\n // Add custom actions here.\n alert(name + `: \"${node.data.name}\"`);\n }\n\n public onTreeStateChange(treeModel: ITreeState): void {\n // Watch for tree state changes here.\n console.log(treeModel);\n }\n\n #enableSelection(value: boolean): void {\n this.#resetSelection();\n this.treeOptions.useCheckbox = value;\n this.selectLeafNodesOnly = false;\n this.enableCascading = false;\n }\n\n #resetSelection(): void {\n if (this.tree) {\n this.tree.selectedLeafNodeIds = {};\n this.tree.activeNodeIds = {};\n }\n }\n}\n"
1523
+ "rawContents": "import {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n OnInit,\n ViewChild,\n} from '@angular/core';\nimport { FormBuilder, FormControl, FormGroup } from '@angular/forms';\nimport {\n ITreeOptions,\n ITreeState,\n TreeModel,\n TreeNode,\n} from '@blackbaud/angular-tree-component';\n\nimport { AngularTreeDemoNode } from './angular-tree-demo-node';\n\n@Component({\n selector: 'app-angular-tree-component-demo',\n styleUrls: ['./angular-tree-demo.component.scss'],\n templateUrl: './angular-tree-demo.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class AngularTreeDemoComponent implements OnInit {\n public demoOptions: FormGroup;\n\n public set enableCascading(value: boolean) {\n this.#resetSelection();\n this.treeOptions.useTriState = value;\n this.#_enableCascading = value;\n\n if (value) {\n this.selectLeafNodesOnly = false;\n }\n }\n\n public get enableCascading(): boolean {\n return this.#_enableCascading;\n }\n\n public readOnly = false;\n\n public selectedSelectMode = 'multiSelect';\n\n public set selectLeafNodesOnly(value: boolean) {\n this.#resetSelection();\n this.#_selectLeafNodesOnly = value;\n\n if (value) {\n this.enableCascading = false;\n }\n }\n\n public get selectLeafNodesOnly(): boolean {\n return this.#_selectLeafNodesOnly;\n }\n\n public selectSingle = false;\n\n public showContextMenus = false;\n\n public showToolbar = false;\n\n #_enableCascading = false;\n\n #_selectLeafNodesOnly = false;\n\n public treeOptions: ITreeOptions = {\n animateExpand: true,\n useTriState: false,\n };\n\n public dropdownItems: { name: string; disabled: boolean }[] = [\n { name: 'Insert an item at this level', disabled: false },\n { name: 'Insert an item under this level', disabled: false },\n { name: 'Move up', disabled: false },\n { name: 'Move down', disabled: false },\n { name: 'Move left', disabled: false },\n { name: 'Move right', disabled: false },\n { name: 'Edit', disabled: false },\n { name: 'Delete', disabled: false },\n ];\n\n public nodes: AngularTreeDemoNode[] = [\n {\n name: 'Animals',\n isExpanded: true,\n children: [\n {\n name: 'Cats',\n isExpanded: true,\n children: [\n { name: 'Burmese' },\n { name: 'Persian' },\n { name: 'Tabby' },\n ],\n },\n {\n name: 'Dogs',\n isExpanded: true,\n children: [\n { name: 'Beagle' },\n { name: 'German shepherd' },\n { name: 'Labrador retriever' },\n ],\n },\n ],\n },\n ];\n\n @ViewChild(TreeModel)\n public tree: TreeModel | undefined;\n\n #changeRef: ChangeDetectorRef;\n\n constructor(changeRef: ChangeDetectorRef, formBuilder: FormBuilder) {\n this.#changeRef = changeRef;\n\n this.demoOptions = formBuilder.group({\n treeMode: new FormControl('navigation'),\n selectMode: new FormControl('multiSelect'),\n selectLeafNodesOnly: new FormControl(),\n enableCascading: new FormControl(),\n showToolbar: new FormControl(),\n showContextMenus: new FormControl(),\n });\n }\n\n public ngOnInit(): void {\n this.demoOptions.valueChanges.subscribe((value) => {\n if (value.treeMode) {\n switch (value.treeMode) {\n case 'selection':\n this.readOnly = false;\n this.#enableSelection(true);\n break;\n\n case 'readOnly':\n this.readOnly = true;\n this.#enableSelection(false);\n break;\n\n case 'navigation':\n this.readOnly = false;\n this.#enableSelection(false);\n break;\n\n default:\n break;\n }\n }\n\n if (value.selectMode) {\n switch (value.selectMode) {\n case 'singleSelect':\n this.#resetSelection();\n this.selectSingle = true;\n this.enableCascading = false;\n break;\n\n case 'multiSelect':\n this.#resetSelection();\n this.selectSingle = false;\n this.enableCascading = false;\n break;\n\n default:\n break;\n }\n }\n\n if (value.enableCascading) {\n this.enableCascading = value.enableCascading;\n }\n\n if (value.selectLeafNodesOnly) {\n this.selectLeafNodesOnly = value.selectLeafNodesOnly;\n }\n\n this.#changeRef.markForCheck();\n });\n }\n\n public actionClicked(name: string, node: TreeNode): void {\n // Add custom actions here.\n alert(name + `: \"${node.data.name}\"`);\n }\n\n public onTreeStateChange(treeModel: ITreeState): void {\n // Watch for tree state changes here.\n console.log(treeModel);\n }\n\n #enableSelection(value: boolean): void {\n this.#resetSelection();\n this.treeOptions.useCheckbox = value;\n this.selectLeafNodesOnly = false;\n this.enableCascading = false;\n }\n\n #resetSelection(): void {\n if (this.tree) {\n this.tree.selectedLeafNodeIds = {};\n this.tree.activeNodeIds = {};\n }\n }\n}\n"
1524
1524
  },
1525
1525
  {
1526
1526
  "fileName": "angular-tree-demo.module.ts",
1527
1527
  "filePath": "/projects/angular-tree-component/documentation/code-examples/angular-tree/advanced/angular-tree-demo.module.ts",
1528
- "rawContents": "import { CommonModule } from '@angular/common';\nimport { NgModule } from '@angular/core';\nimport { ReactiveFormsModule } from '@angular/forms';\nimport { TreeModule } from '@circlon/angular-tree-component';\nimport { SkyAngularTreeModule } from '@skyux/angular-tree-component';\nimport { SkyCheckboxModule, SkyRadioModule } from '@skyux/forms';\nimport { SkyFluidGridModule } from '@skyux/layout';\nimport { SkyDropdownModule } from '@skyux/popovers';\n\nimport { AngularTreeDemoComponent } from './angular-tree-demo.component';\n\n@NgModule({\n imports: [\n CommonModule,\n ReactiveFormsModule,\n SkyAngularTreeModule,\n SkyCheckboxModule,\n SkyDropdownModule,\n SkyFluidGridModule,\n SkyRadioModule,\n TreeModule,\n ],\n declarations: [AngularTreeDemoComponent],\n exports: [AngularTreeDemoComponent],\n})\nexport class AngularTreeDemoModule {}\n"
1528
+ "rawContents": "import { CommonModule } from '@angular/common';\nimport { NgModule } from '@angular/core';\nimport { ReactiveFormsModule } from '@angular/forms';\nimport { TreeModule } from '@blackbaud/angular-tree-component';\nimport { SkyAngularTreeModule } from '@skyux/angular-tree-component';\nimport { SkyCheckboxModule, SkyRadioModule } from '@skyux/forms';\nimport { SkyFluidGridModule } from '@skyux/layout';\nimport { SkyDropdownModule } from '@skyux/popovers';\n\nimport { AngularTreeDemoComponent } from './angular-tree-demo.component';\n\n@NgModule({\n imports: [\n CommonModule,\n ReactiveFormsModule,\n SkyAngularTreeModule,\n SkyCheckboxModule,\n SkyDropdownModule,\n SkyFluidGridModule,\n SkyRadioModule,\n TreeModule,\n ],\n declarations: [AngularTreeDemoComponent],\n exports: [AngularTreeDemoComponent],\n})\nexport class AngularTreeDemoModule {}\n"
1529
1529
  },
1530
1530
  {
1531
1531
  "fileName": "angular-tree-demo.component.html",
@@ -1545,7 +1545,7 @@
1545
1545
  {
1546
1546
  "fileName": "angular-tree-demo.module.ts",
1547
1547
  "filePath": "/projects/angular-tree-component/documentation/code-examples/angular-tree/inline-help/angular-tree-demo.module.ts",
1548
- "rawContents": "import { CommonModule } from '@angular/common';\nimport { NgModule } from '@angular/core';\nimport { ReactiveFormsModule } from '@angular/forms';\nimport { TreeModule } from '@circlon/angular-tree-component';\nimport { SkyAngularTreeModule } from '@skyux/angular-tree-component';\nimport { SkyCheckboxModule, SkyRadioModule } from '@skyux/forms';\nimport { SkyHelpInlineModule } from '@skyux/indicators';\nimport { SkyFluidGridModule } from '@skyux/layout';\nimport { SkyDropdownModule } from '@skyux/popovers';\n\nimport { AngularTreeDemoComponent } from './angular-tree-demo.component';\n\n@NgModule({\n imports: [\n CommonModule,\n ReactiveFormsModule,\n SkyAngularTreeModule,\n SkyCheckboxModule,\n SkyDropdownModule,\n SkyFluidGridModule,\n SkyRadioModule,\n TreeModule,\n SkyHelpInlineModule,\n ],\n declarations: [AngularTreeDemoComponent],\n exports: [AngularTreeDemoComponent],\n})\nexport class AngularTreeDemoModule {}\n"
1548
+ "rawContents": "import { CommonModule } from '@angular/common';\nimport { NgModule } from '@angular/core';\nimport { ReactiveFormsModule } from '@angular/forms';\nimport { TreeModule } from '@blackbaud/angular-tree-component';\nimport { SkyAngularTreeModule } from '@skyux/angular-tree-component';\nimport { SkyCheckboxModule, SkyRadioModule } from '@skyux/forms';\nimport { SkyHelpInlineModule } from '@skyux/indicators';\nimport { SkyFluidGridModule } from '@skyux/layout';\nimport { SkyDropdownModule } from '@skyux/popovers';\n\nimport { AngularTreeDemoComponent } from './angular-tree-demo.component';\n\n@NgModule({\n imports: [\n CommonModule,\n ReactiveFormsModule,\n SkyAngularTreeModule,\n SkyCheckboxModule,\n SkyDropdownModule,\n SkyFluidGridModule,\n SkyRadioModule,\n TreeModule,\n SkyHelpInlineModule,\n ],\n declarations: [AngularTreeDemoComponent],\n exports: [AngularTreeDemoComponent],\n})\nexport class AngularTreeDemoModule {}\n"
1549
1549
  }
1550
1550
  ]
1551
1551
  }
@@ -1,5 +1,3 @@
1
- var _SkyAngularTreeAdapterService_coreAdapterService;
2
- import { __classPrivateFieldGet, __classPrivateFieldSet } from "tslib";
3
1
  import { Injectable } from '@angular/core';
4
2
  import * as i0 from "@angular/core";
5
3
  import * as i1 from "@skyux/core";
@@ -7,25 +5,24 @@ import * as i1 from "@skyux/core";
7
5
  * @internal
8
6
  */
9
7
  export class SkyAngularTreeAdapterService {
8
+ #coreAdapterService;
10
9
  constructor(coreAdapterService) {
11
- _SkyAngularTreeAdapterService_coreAdapterService.set(this, void 0);
12
- __classPrivateFieldSet(this, _SkyAngularTreeAdapterService_coreAdapterService, coreAdapterService, "f");
10
+ this.#coreAdapterService = coreAdapterService;
13
11
  }
14
12
  getFocusableChildren(element) {
15
- return __classPrivateFieldGet(this, _SkyAngularTreeAdapterService_coreAdapterService, "f").getFocusableChildren(element);
13
+ return this.#coreAdapterService.getFocusableChildren(element);
16
14
  }
17
15
  setTabIndexOfFocusableEls(element, tabIndex) {
18
- const focusableEls = __classPrivateFieldGet(this, _SkyAngularTreeAdapterService_coreAdapterService, "f").getFocusableChildren(element);
16
+ const focusableEls = this.#coreAdapterService.getFocusableChildren(element);
19
17
  let index = focusableEls.length;
20
18
  while (index--) {
21
19
  focusableEls[index].tabIndex = tabIndex;
22
20
  }
23
21
  }
22
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: SkyAngularTreeAdapterService, deps: [{ token: i1.SkyCoreAdapterService }], target: i0.ɵɵFactoryTarget.Injectable }); }
23
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: SkyAngularTreeAdapterService }); }
24
24
  }
25
- _SkyAngularTreeAdapterService_coreAdapterService = new WeakMap();
26
- SkyAngularTreeAdapterService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: SkyAngularTreeAdapterService, deps: [{ token: i1.SkyCoreAdapterService }], target: i0.ɵɵFactoryTarget.Injectable });
27
- SkyAngularTreeAdapterService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: SkyAngularTreeAdapterService });
28
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: SkyAngularTreeAdapterService, decorators: [{
25
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: SkyAngularTreeAdapterService, decorators: [{
29
26
  type: Injectable
30
27
  }], ctorParameters: function () { return [{ type: i1.SkyCoreAdapterService }]; } });
31
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW5ndWxhci10cmVlLWFkYXB0ZXIuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvY29tcG9uZW50cy9hbmd1bGFyLXRyZWUtY29tcG9uZW50L3NyYy9saWIvbW9kdWxlcy9hbmd1bGFyLXRyZWUvYW5ndWxhci10cmVlLWFkYXB0ZXIuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7OztBQUczQzs7R0FFRztBQUVILE1BQU0sT0FBTyw0QkFBNEI7SUFHdkMsWUFBWSxrQkFBeUM7UUFGckQsbUVBQTJDO1FBR3pDLHVCQUFBLElBQUksb0RBQXVCLGtCQUFrQixNQUFBLENBQUM7SUFDaEQsQ0FBQztJQUVNLG9CQUFvQixDQUFDLE9BQW9CO1FBQzlDLE9BQU8sdUJBQUEsSUFBSSx3REFBb0IsQ0FBQyxvQkFBb0IsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUNoRSxDQUFDO0lBRU0seUJBQXlCLENBQzlCLE9BQW9CLEVBQ3BCLFFBQWdCO1FBRWhCLE1BQU0sWUFBWSxHQUFHLHVCQUFBLElBQUksd0RBQW9CLENBQUMsb0JBQW9CLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDNUUsSUFBSSxLQUFLLEdBQUcsWUFBWSxDQUFDLE1BQU0sQ0FBQztRQUNoQyxPQUFPLEtBQUssRUFBRSxFQUFFO1lBQ2QsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUM7U0FDekM7SUFDSCxDQUFDOzs7eUhBcEJVLDRCQUE0Qjs2SEFBNUIsNEJBQTRCOzJGQUE1Qiw0QkFBNEI7a0JBRHhDLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBTa3lDb3JlQWRhcHRlclNlcnZpY2UgfSBmcm9tICdAc2t5dXgvY29yZSc7XG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBTa3lBbmd1bGFyVHJlZUFkYXB0ZXJTZXJ2aWNlIHtcbiAgI2NvcmVBZGFwdGVyU2VydmljZTogU2t5Q29yZUFkYXB0ZXJTZXJ2aWNlO1xuXG4gIGNvbnN0cnVjdG9yKGNvcmVBZGFwdGVyU2VydmljZTogU2t5Q29yZUFkYXB0ZXJTZXJ2aWNlKSB7XG4gICAgdGhpcy4jY29yZUFkYXB0ZXJTZXJ2aWNlID0gY29yZUFkYXB0ZXJTZXJ2aWNlO1xuICB9XG5cbiAgcHVibGljIGdldEZvY3VzYWJsZUNoaWxkcmVuKGVsZW1lbnQ6IEhUTUxFbGVtZW50KTogSFRNTEVsZW1lbnRbXSB7XG4gICAgcmV0dXJuIHRoaXMuI2NvcmVBZGFwdGVyU2VydmljZS5nZXRGb2N1c2FibGVDaGlsZHJlbihlbGVtZW50KTtcbiAgfVxuXG4gIHB1YmxpYyBzZXRUYWJJbmRleE9mRm9jdXNhYmxlRWxzKFxuICAgIGVsZW1lbnQ6IEhUTUxFbGVtZW50LFxuICAgIHRhYkluZGV4OiBudW1iZXJcbiAgKTogdm9pZCB7XG4gICAgY29uc3QgZm9jdXNhYmxlRWxzID0gdGhpcy4jY29yZUFkYXB0ZXJTZXJ2aWNlLmdldEZvY3VzYWJsZUNoaWxkcmVuKGVsZW1lbnQpO1xuICAgIGxldCBpbmRleCA9IGZvY3VzYWJsZUVscy5sZW5ndGg7XG4gICAgd2hpbGUgKGluZGV4LS0pIHtcbiAgICAgIGZvY3VzYWJsZUVsc1tpbmRleF0udGFiSW5kZXggPSB0YWJJbmRleDtcbiAgICB9XG4gIH1cbn1cbiJdfQ==
28
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW5ndWxhci10cmVlLWFkYXB0ZXIuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvY29tcG9uZW50cy9hbmd1bGFyLXRyZWUtY29tcG9uZW50L3NyYy9saWIvbW9kdWxlcy9hbmd1bGFyLXRyZWUvYW5ndWxhci10cmVlLWFkYXB0ZXIuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDOzs7QUFHM0M7O0dBRUc7QUFFSCxNQUFNLE9BQU8sNEJBQTRCO0lBQ3ZDLG1CQUFtQixDQUF3QjtJQUUzQyxZQUFZLGtCQUF5QztRQUNuRCxJQUFJLENBQUMsbUJBQW1CLEdBQUcsa0JBQWtCLENBQUM7SUFDaEQsQ0FBQztJQUVNLG9CQUFvQixDQUFDLE9BQW9CO1FBQzlDLE9BQU8sSUFBSSxDQUFDLG1CQUFtQixDQUFDLG9CQUFvQixDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ2hFLENBQUM7SUFFTSx5QkFBeUIsQ0FDOUIsT0FBb0IsRUFDcEIsUUFBZ0I7UUFFaEIsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixDQUFDLG9CQUFvQixDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQzVFLElBQUksS0FBSyxHQUFHLFlBQVksQ0FBQyxNQUFNLENBQUM7UUFDaEMsT0FBTyxLQUFLLEVBQUUsRUFBRTtZQUNkLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDO1NBQ3pDO0lBQ0gsQ0FBQzs4R0FwQlUsNEJBQTRCO2tIQUE1Qiw0QkFBNEI7OzJGQUE1Qiw0QkFBNEI7a0JBRHhDLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBTa3lDb3JlQWRhcHRlclNlcnZpY2UgfSBmcm9tICdAc2t5dXgvY29yZSc7XG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBTa3lBbmd1bGFyVHJlZUFkYXB0ZXJTZXJ2aWNlIHtcbiAgI2NvcmVBZGFwdGVyU2VydmljZTogU2t5Q29yZUFkYXB0ZXJTZXJ2aWNlO1xuXG4gIGNvbnN0cnVjdG9yKGNvcmVBZGFwdGVyU2VydmljZTogU2t5Q29yZUFkYXB0ZXJTZXJ2aWNlKSB7XG4gICAgdGhpcy4jY29yZUFkYXB0ZXJTZXJ2aWNlID0gY29yZUFkYXB0ZXJTZXJ2aWNlO1xuICB9XG5cbiAgcHVibGljIGdldEZvY3VzYWJsZUNoaWxkcmVuKGVsZW1lbnQ6IEhUTUxFbGVtZW50KTogSFRNTEVsZW1lbnRbXSB7XG4gICAgcmV0dXJuIHRoaXMuI2NvcmVBZGFwdGVyU2VydmljZS5nZXRGb2N1c2FibGVDaGlsZHJlbihlbGVtZW50KTtcbiAgfVxuXG4gIHB1YmxpYyBzZXRUYWJJbmRleE9mRm9jdXNhYmxlRWxzKFxuICAgIGVsZW1lbnQ6IEhUTUxFbGVtZW50LFxuICAgIHRhYkluZGV4OiBudW1iZXJcbiAgKTogdm9pZCB7XG4gICAgY29uc3QgZm9jdXNhYmxlRWxzID0gdGhpcy4jY29yZUFkYXB0ZXJTZXJ2aWNlLmdldEZvY3VzYWJsZUNoaWxkcmVuKGVsZW1lbnQpO1xuICAgIGxldCBpbmRleCA9IGZvY3VzYWJsZUVscy5sZW5ndGg7XG4gICAgd2hpbGUgKGluZGV4LS0pIHtcbiAgICAgIGZvY3VzYWJsZUVsc1tpbmRleF0udGFiSW5kZXggPSB0YWJJbmRleDtcbiAgICB9XG4gIH1cbn1cbiJdfQ==
@@ -4,11 +4,11 @@ import * as i0 from "@angular/core";
4
4
  * @internal
5
5
  */
6
6
  export class SkyAngularTreeContextMenuComponent {
7
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: SkyAngularTreeContextMenuComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
8
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: SkyAngularTreeContextMenuComponent, selector: "sky-angular-tree-context-menu", ngImport: i0, template: "<div class=\"sky-angular-tree-context-menu\">\n <ng-content></ng-content>\n</div>\n", changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
7
9
  }
8
- SkyAngularTreeContextMenuComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: SkyAngularTreeContextMenuComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
9
- SkyAngularTreeContextMenuComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.9", type: SkyAngularTreeContextMenuComponent, selector: "sky-angular-tree-context-menu", ngImport: i0, template: "<div class=\"sky-angular-tree-context-menu\">\n <ng-content></ng-content>\n</div>\n", changeDetection: i0.ChangeDetectionStrategy.OnPush });
10
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: SkyAngularTreeContextMenuComponent, decorators: [{
10
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: SkyAngularTreeContextMenuComponent, decorators: [{
11
11
  type: Component,
12
12
  args: [{ selector: 'sky-angular-tree-context-menu', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"sky-angular-tree-context-menu\">\n <ng-content></ng-content>\n</div>\n" }]
13
13
  }] });
14
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW5ndWxhci10cmVlLWNvbnRleHQtbWVudS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2NvbXBvbmVudHMvYW5ndWxhci10cmVlLWNvbXBvbmVudC9zcmMvbGliL21vZHVsZXMvYW5ndWxhci10cmVlL2FuZ3VsYXItdHJlZS1jb250ZXh0LW1lbnUuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9jb21wb25lbnRzL2FuZ3VsYXItdHJlZS1jb21wb25lbnQvc3JjL2xpYi9tb2R1bGVzL2FuZ3VsYXItdHJlZS9hbmd1bGFyLXRyZWUtY29udGV4dC1tZW51LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7O0FBRW5FOztHQUVHO0FBTUgsTUFBTSxPQUFPLGtDQUFrQzs7K0hBQWxDLGtDQUFrQzttSEFBbEMsa0NBQWtDLHFFQ1YvQyxzRkFHQTsyRkRPYSxrQ0FBa0M7a0JBTDlDLFNBQVM7K0JBQ0UsK0JBQStCLG1CQUV4Qix1QkFBdUIsQ0FBQyxNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENvbXBvbmVudCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdza3ktYW5ndWxhci10cmVlLWNvbnRleHQtbWVudScsXG4gIHRlbXBsYXRlVXJsOiAnLi9hbmd1bGFyLXRyZWUtY29udGV4dC1tZW51LmNvbXBvbmVudC5odG1sJyxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG59KVxuZXhwb3J0IGNsYXNzIFNreUFuZ3VsYXJUcmVlQ29udGV4dE1lbnVDb21wb25lbnQge31cbiIsIjxkaXYgY2xhc3M9XCJza3ktYW5ndWxhci10cmVlLWNvbnRleHQtbWVudVwiPlxuICA8bmctY29udGVudD48L25nLWNvbnRlbnQ+XG48L2Rpdj5cbiJdfQ==
14
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW5ndWxhci10cmVlLWNvbnRleHQtbWVudS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2NvbXBvbmVudHMvYW5ndWxhci10cmVlLWNvbXBvbmVudC9zcmMvbGliL21vZHVsZXMvYW5ndWxhci10cmVlL2FuZ3VsYXItdHJlZS1jb250ZXh0LW1lbnUuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9jb21wb25lbnRzL2FuZ3VsYXItdHJlZS1jb21wb25lbnQvc3JjL2xpYi9tb2R1bGVzL2FuZ3VsYXItdHJlZS9hbmd1bGFyLXRyZWUtY29udGV4dC1tZW51LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7O0FBRW5FOztHQUVHO0FBTUgsTUFBTSxPQUFPLGtDQUFrQzs4R0FBbEMsa0NBQWtDO2tHQUFsQyxrQ0FBa0MscUVDVi9DLHNGQUdBOzsyRkRPYSxrQ0FBa0M7a0JBTDlDLFNBQVM7K0JBQ0UsK0JBQStCLG1CQUV4Qix1QkFBdUIsQ0FBQyxNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENvbXBvbmVudCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdza3ktYW5ndWxhci10cmVlLWNvbnRleHQtbWVudScsXG4gIHRlbXBsYXRlVXJsOiAnLi9hbmd1bGFyLXRyZWUtY29udGV4dC1tZW51LmNvbXBvbmVudC5odG1sJyxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG59KVxuZXhwb3J0IGNsYXNzIFNreUFuZ3VsYXJUcmVlQ29udGV4dE1lbnVDb21wb25lbnQge31cbiIsIjxkaXYgY2xhc3M9XCJza3ktYW5ndWxhci10cmVlLWNvbnRleHQtbWVudVwiPlxuICA8bmctY29udGVudD48L25nLWNvbnRlbnQ+XG48L2Rpdj5cbiJdfQ==
@@ -0,0 +1,254 @@
1
+ import { Component, ElementRef, Input, Optional, ViewChild, } from '@angular/core';
2
+ import { SkyAngularTreeAdapterService } from './angular-tree-adapter.service';
3
+ import * as i0 from "@angular/core";
4
+ import * as i1 from "./angular-tree-adapter.service";
5
+ import * as i2 from "./angular-tree-wrapper.component";
6
+ import * as i3 from "@angular/common";
7
+ import * as i4 from "@skyux/forms";
8
+ import * as i5 from "@skyux/indicators";
9
+ import * as i6 from "@blackbaud/angular-tree-component";
10
+ import * as i7 from "./angular-tree-context-menu.component";
11
+ import * as i8 from "@skyux/i18n";
12
+ /**
13
+ * Replaces the default tree node template with a SKY UX node as part of the `SkyAngularTreeModule` that
14
+ * provides SKY UX components and styles to complement the `angular-tree-component` library and apply SKY UX
15
+ * themes and functionality to hierarchical list views. You must wrap this component in an `ng-template`
16
+ * tag with the template reference variable `#treeNodeFullTemplate`. For information about tree node templates,
17
+ * see the [Angular tree component documentation](https://angular2-tree.readme.io/docs/templates).
18
+ * To display context menus with actions for individual items in hierarchical lists, place
19
+ * [dropdowns](https://developer.blackbaud.com/skyux-popovers/docs/dropdown?docs-active-tab=design) inside the
20
+ * Angular tree node component, which automatically handles styling and positioning for context menus.
21
+ */
22
+ export class SkyAngularTreeNodeComponent {
23
+ set childFocusIndex(value) {
24
+ if (value !== this.#_childFocusIndex) {
25
+ this.#_childFocusIndex = value;
26
+ if (this.#focusableChildren.length > 0 && value !== undefined) {
27
+ this.#focusableChildren[value].focus();
28
+ }
29
+ else {
30
+ this.nodeContentWrapperRef?.nativeElement.focus();
31
+ }
32
+ }
33
+ }
34
+ get childFocusIndex() {
35
+ return this.#_childFocusIndex;
36
+ }
37
+ set focused(value) {
38
+ this.tabIndex = value ? 0 : -1;
39
+ if (value) {
40
+ this.nodeContentWrapperRef?.nativeElement.focus();
41
+ }
42
+ }
43
+ set isPartiallySelected(value) {
44
+ if (value !== this.#_isPartiallySelected) {
45
+ this.#_isPartiallySelected = value;
46
+ this.#changeDetectorRef.markForCheck();
47
+ }
48
+ }
49
+ get isPartiallySelected() {
50
+ return this.#_isPartiallySelected;
51
+ }
52
+ set isSelected(value) {
53
+ if (value !== this.#_isSelected) {
54
+ this.#_isSelected = value;
55
+ this.#changeDetectorRef.markForCheck();
56
+ }
57
+ }
58
+ get isSelected() {
59
+ return this.#_isSelected;
60
+ }
61
+ set tabIndex(value) {
62
+ this.#_tabIndex = value;
63
+ }
64
+ get tabIndex() {
65
+ return this.#_tabIndex;
66
+ }
67
+ #focusableChildren = [];
68
+ #mouseDown = false;
69
+ #_childFocusIndex;
70
+ #_isPartiallySelected = false;
71
+ #_isSelected = false;
72
+ #_tabIndex = -1;
73
+ #changeDetectorRef;
74
+ #adapterService;
75
+ #skyAngularTreeWrapper;
76
+ constructor(changeDetectorRef, adapterService, skyAngularTreeWrapper) {
77
+ this.#changeDetectorRef = changeDetectorRef;
78
+ this.#adapterService = adapterService;
79
+ this.#skyAngularTreeWrapper = skyAngularTreeWrapper;
80
+ }
81
+ ngOnInit() {
82
+ if (!this.#skyAngularTreeWrapper) {
83
+ console.error(`<sky-angular-tree-node-wrapper> must be wrapped inside a <sky-angular-tree-wrapper> component.`);
84
+ }
85
+ if (this.node) {
86
+ // Because we're binding the checkbox to node's children properties, we need to manually control change detection.
87
+ // Here, we listen to the tree's state and force change detection in the setters if the value has changed.
88
+ this.node.treeModel.subscribeToState((state) => {
89
+ if (this.node) {
90
+ this.isSelected = this.node.isSelected;
91
+ this.isPartiallySelected = this.node.isPartiallySelected;
92
+ if (state.focusedNodeId) {
93
+ this.focused = state.focusedNodeId === this.node.id;
94
+ }
95
+ }
96
+ });
97
+ // Make the first root node tabbable.
98
+ if (this.node.isRoot && this.node.index === 0) {
99
+ this.tabIndex = 0;
100
+ }
101
+ }
102
+ }
103
+ ngAfterViewInit() {
104
+ // Wait 1s for the node to render, then reset all child tabIndexes to -1.
105
+ // Units smaller than 1s may consistently fail if there are many nodes, or multiple trees are on the same screen.
106
+ setTimeout(() => {
107
+ if (this.nodeContentWrapperRef) {
108
+ this.#focusableChildren = this.#adapterService.getFocusableChildren(this.nodeContentWrapperRef.nativeElement);
109
+ this.#adapterService.setTabIndexOfFocusableEls(this.nodeContentWrapperRef.nativeElement, -1);
110
+ }
111
+ }, 1000);
112
+ }
113
+ /**
114
+ * If single-select, set aria-selected=true for the selected node and undefined for all the others.
115
+ * For multiple-select, set aria-selected to either true or false.
116
+ * If node cannot be selected, aria-selected should be undefined (e.g. parent nodes in leaf-select-only mode).
117
+ * @internal
118
+ */
119
+ ariaSelected() {
120
+ if (!this.#skyAngularTreeWrapper) {
121
+ return;
122
+ }
123
+ if (this.#skyAngularTreeWrapper.selectSingle) {
124
+ return this.isSelected ? true : undefined;
125
+ }
126
+ if (!this.#isSelectable()) {
127
+ return;
128
+ }
129
+ return !!this.isSelected;
130
+ }
131
+ showCheckbox() {
132
+ // Check for checkbox mode enabled, but also respect leaf-node and single-select settings.
133
+ return (!!this.node &&
134
+ this.node.options.useCheckbox &&
135
+ this.#isSelectable() &&
136
+ (!this.#skyAngularTreeWrapper ||
137
+ !this.#skyAngularTreeWrapper.selectSingle));
138
+ }
139
+ showSelectedClass() {
140
+ return this.#isSelectable() && this.isSelected && !this.isPartiallySelected;
141
+ }
142
+ showActiveClass() {
143
+ return (!!this.node &&
144
+ this.node.isActive &&
145
+ !this.node.treeModel.options.useCheckbox);
146
+ }
147
+ showTogglePlaceholder() {
148
+ return (!this.node?.hasChildren &&
149
+ !this.#skyAngularTreeWrapper?.selectLeafNodesOnly);
150
+ }
151
+ onFocus() {
152
+ // <tree-node-content> has its own click handler, so we need to check if this focus event
153
+ // is coming from the mouse click or the keyboard to prevent the logic from running twice.
154
+ if (!this.#mouseDown) {
155
+ this.node?.treeModel.setFocus(true);
156
+ this.node?.focus();
157
+ this.childFocusIndex = undefined;
158
+ }
159
+ }
160
+ onMouseDown() {
161
+ this.#mouseDown = true;
162
+ }
163
+ onMouseUp() {
164
+ this.#mouseDown = false;
165
+ }
166
+ onKeyDown(event) {
167
+ /* istanbul ignore else */
168
+ if (document.activeElement === event.target) {
169
+ const key = event.key.toLowerCase();
170
+ switch (key) {
171
+ case 'up':
172
+ case 'arrowup':
173
+ // Focus on previous node.
174
+ this.node?.treeModel.focusPreviousNode();
175
+ break;
176
+ case 'down':
177
+ case 'arrowdown':
178
+ // Focus on next node.
179
+ this.node?.treeModel.focusNextNode();
180
+ break;
181
+ case 'left':
182
+ case 'arrowleft':
183
+ // Cycle backwards through interactive child elements
184
+ // If user reaches the beginning, activate drill up.
185
+ /* istanbul ignore else */
186
+ if (this.childFocusIndex !== undefined) {
187
+ if (this.childFocusIndex === 0) {
188
+ this.childFocusIndex = undefined;
189
+ }
190
+ else {
191
+ this.childFocusIndex--;
192
+ }
193
+ }
194
+ else {
195
+ this.node?.setIsExpanded(false);
196
+ }
197
+ event.stopPropagation();
198
+ event.preventDefault();
199
+ break;
200
+ case 'right':
201
+ case 'arrowright':
202
+ // Cycle forward through interactive child elements.
203
+ // If user reaches the end, activate drill down.
204
+ /* istanbul ignore else */
205
+ if (this.#focusableChildren.length <= 0 ||
206
+ this.childFocusIndex === this.#focusableChildren.length - 1) {
207
+ this.node?.setIsExpanded(true);
208
+ }
209
+ else {
210
+ if (this.childFocusIndex === undefined) {
211
+ this.childFocusIndex = 0;
212
+ }
213
+ else {
214
+ this.childFocusIndex++;
215
+ }
216
+ }
217
+ event.stopPropagation();
218
+ event.preventDefault();
219
+ break;
220
+ default:
221
+ break;
222
+ }
223
+ }
224
+ }
225
+ #isSelectable() {
226
+ if (this.#skyAngularTreeWrapper) {
227
+ return (!!this.node &&
228
+ (this.node.isLeaf ||
229
+ !this.node.hasChildren ||
230
+ !this.#skyAngularTreeWrapper.selectLeafNodesOnly));
231
+ }
232
+ else {
233
+ return false;
234
+ }
235
+ }
236
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: SkyAngularTreeNodeComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: i1.SkyAngularTreeAdapterService }, { token: i2.SkyAngularTreeWrapperComponent, optional: true }], target: i0.ɵɵFactoryTarget.Component }); }
237
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: SkyAngularTreeNodeComponent, selector: "sky-angular-tree-node", inputs: { index: "index", node: "node", templates: "templates" }, providers: [SkyAngularTreeAdapterService], viewQueries: [{ propertyName: "nodeContentWrapperRef", first: true, predicate: ["nodeContentWrapper"], descendants: true, read: ElementRef }], ngImport: i0, template: "<div\n *ngIf=\"node && index !== undefined\"\n [class]=\"node.getClass()\"\n [class.tree-node]=\"true\"\n [class.tree-node-active]=\"node.isActive\"\n [class.tree-node-collapsed]=\"node.isCollapsed && node.hasChildren\"\n [class.tree-node-expanded]=\"node.isExpanded && node.hasChildren\"\n [class.tree-node-focused]=\"node.isFocused\"\n [class.tree-node-leaf]=\"node.isLeaf\"\n>\n <tree-node-drop-slot\n *ngIf=\"index === 0\"\n [dropIndex]=\"node.index\"\n [node]=\"node.parent\"\n >\n </tree-node-drop-slot>\n\n <!-- #region <tree-node-wrapper> custom template --->\n <div\n class=\"node-wrapper\"\n role=\"treeitem\"\n [allowDragoverStyling]=\"node.allowDragoverStyling()\"\n [attr.aria-current]=\"node.isActive\"\n [attr.aria-expanded]=\"node.children?.length ? node.isExpanded : null\"\n [attr.aria-selected]=\"ariaSelected()\"\n [attr.data-node-id]=\"node.id\"\n [attr.tabindex]=\"tabIndex\"\n [class.sky-angular-tree-node-active]=\"showActiveClass()\"\n [class.sky-angular-tree-node-selected]=\"showSelectedClass()\"\n [style.padding-left]=\"node.getNodePadding()\"\n [treeAllowDrop]=\"node.allowDrop\"\n [treeDrag]=\"node\"\n [treeDragEnabled]=\"node.allowDrag()\"\n (contextmenu)=\"node.mouseAction('contextMenu', $event)\"\n (dblclick)=\"node.mouseAction('dblClick', $event)\"\n (focus)=\"onFocus()\"\n (mousedown)=\"onMouseDown()\"\n (mouseup)=\"onMouseUp()\"\n (keydown)=\"onKeyDown($event)\"\n (treeDrop)=\"node.onDrop($event)\"\n (treeDropDragEnter)=\"node.mouseAction('dragEnter', $event)\"\n (treeDropDragLeave)=\"node.mouseAction('dragLeave', $event)\"\n (treeDropDragOver)=\"node.mouseAction('dragOver', $event)\"\n #nodeContentWrapper\n >\n <!-- #region <tree-node-expander> custom template --->\n <div class=\"sky-toggle-children-wrapper\">\n <button\n *ngIf=\"node.hasChildren\"\n class=\"sky-btn sky-btn-link sky-toggle-children\"\n tabindex=\"-1\"\n type=\"button\"\n [attr.aria-label]=\"\n 'skyux_angular_tree_click_to_expand' | skyLibResources\n \"\n [class.toggle-children-wrapper-expanded]=\"node.isExpanded\"\n [class.toggle-children-wrapper-collapsed]=\"node.isCollapsed\"\n (click)=\"node.mouseAction('expanderClick', $event)\"\n >\n <sky-icon\n [icon]=\"node.isExpanded ? 'chevron-down' : 'chevron-right'\"\n size=\"sm\"\n >\n </sky-icon>\n </button>\n <span *ngIf=\"showTogglePlaceholder()\" class=\"toggle-children-placeholder\">\n </span>\n </div>\n <!-- #endregion <tree-node-expander> --->\n\n <!-- Note: we've made changes to the click event, tabindex, and classes when compared to the original template. -->\n <!-- https://github.com/500tech/angular-tree-component/blob/master/lib/components/tree-node-wrapper.component.ts -->\n <div class=\"node-content-wrapper\">\n <sky-checkbox\n *ngIf=\"showCheckbox()\"\n [checked]=\"isSelected\"\n [id]=\"node.data.id\"\n [label]=\"node.data.name\"\n [indeterminate]=\"isPartiallySelected\"\n (change)=\"node.mouseAction('checkboxClick', $event)\"\n >\n </sky-checkbox>\n\n <sky-angular-tree-context-menu>\n <ng-content select=\"sky-dropdown\"></ng-content>\n </sky-angular-tree-context-menu>\n\n <tree-node-content\n [index]=\"index\"\n [node]=\"node\"\n [template]=\"templates?.treeNodeTemplate\"\n (click)=\"node.mouseAction('click', $event)\"\n >\n </tree-node-content\n ><span class=\"sky-control-help-container\"\n ><ng-content select=\".sky-control-help\"></ng-content\n ></span>\n </div>\n </div>\n\n <ng-container\n [ngTemplateOutlet]=\"templates?.treeNodeWrapperTemplate\"\n [ngTemplateOutletContext]=\"{\n $implicit: node,\n node: node,\n index: index,\n templates: templates\n }\"\n >\n </ng-container>\n <!-- #endregion <tree-node-wrapper> -->\n\n <tree-node-children role=\"group\" [node]=\"node\" [templates]=\"templates\">\n </tree-node-children>\n\n <tree-node-drop-slot [dropIndex]=\"node.index + 1\" [node]=\"node.parent\">\n </tree-node-drop-slot>\n</div>\n", dependencies: [{ kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: i4.λ3, selector: "sky-checkbox", inputs: ["label", "labelledBy", "id", "disabled", "tabindex", "name", "icon", "checkboxType", "checked", "indeterminate", "required"], outputs: ["change", "checkedChange", "disabledChange", "indeterminateChange"] }, { kind: "component", type: i5.λ4, selector: "sky-icon", inputs: ["icon", "iconType", "size", "fixedWidth", "variant"] }, { kind: "component", type: i6.TreeNodeContent, selector: "tree-node-content", inputs: ["node", "index", "template"] }, { kind: "directive", type: i6.TreeDropDirective, selector: "[treeDrop]", inputs: ["allowDragoverStyling", "treeAllowDrop"], outputs: ["treeDrop", "treeDropDragOver", "treeDropDragLeave", "treeDropDragEnter"] }, { kind: "directive", type: i6.TreeDragDirective, selector: "[treeDrag]", inputs: ["treeDrag", "treeDragEnabled"] }, { kind: "component", type: i6.TreeNodeChildrenComponent, selector: "tree-node-children", inputs: ["node", "templates"] }, { kind: "component", type: i6.TreeNodeDropSlot, selector: "TreeNodeDropSlot, tree-node-drop-slot", inputs: ["node", "dropIndex"] }, { kind: "component", type: i7.SkyAngularTreeContextMenuComponent, selector: "sky-angular-tree-context-menu" }, { kind: "pipe", type: i8.SkyLibResourcesPipe, name: "skyLibResources" }] }); }
238
+ }
239
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: SkyAngularTreeNodeComponent, decorators: [{
240
+ type: Component,
241
+ args: [{ selector: 'sky-angular-tree-node', providers: [SkyAngularTreeAdapterService], template: "<div\n *ngIf=\"node && index !== undefined\"\n [class]=\"node.getClass()\"\n [class.tree-node]=\"true\"\n [class.tree-node-active]=\"node.isActive\"\n [class.tree-node-collapsed]=\"node.isCollapsed && node.hasChildren\"\n [class.tree-node-expanded]=\"node.isExpanded && node.hasChildren\"\n [class.tree-node-focused]=\"node.isFocused\"\n [class.tree-node-leaf]=\"node.isLeaf\"\n>\n <tree-node-drop-slot\n *ngIf=\"index === 0\"\n [dropIndex]=\"node.index\"\n [node]=\"node.parent\"\n >\n </tree-node-drop-slot>\n\n <!-- #region <tree-node-wrapper> custom template --->\n <div\n class=\"node-wrapper\"\n role=\"treeitem\"\n [allowDragoverStyling]=\"node.allowDragoverStyling()\"\n [attr.aria-current]=\"node.isActive\"\n [attr.aria-expanded]=\"node.children?.length ? node.isExpanded : null\"\n [attr.aria-selected]=\"ariaSelected()\"\n [attr.data-node-id]=\"node.id\"\n [attr.tabindex]=\"tabIndex\"\n [class.sky-angular-tree-node-active]=\"showActiveClass()\"\n [class.sky-angular-tree-node-selected]=\"showSelectedClass()\"\n [style.padding-left]=\"node.getNodePadding()\"\n [treeAllowDrop]=\"node.allowDrop\"\n [treeDrag]=\"node\"\n [treeDragEnabled]=\"node.allowDrag()\"\n (contextmenu)=\"node.mouseAction('contextMenu', $event)\"\n (dblclick)=\"node.mouseAction('dblClick', $event)\"\n (focus)=\"onFocus()\"\n (mousedown)=\"onMouseDown()\"\n (mouseup)=\"onMouseUp()\"\n (keydown)=\"onKeyDown($event)\"\n (treeDrop)=\"node.onDrop($event)\"\n (treeDropDragEnter)=\"node.mouseAction('dragEnter', $event)\"\n (treeDropDragLeave)=\"node.mouseAction('dragLeave', $event)\"\n (treeDropDragOver)=\"node.mouseAction('dragOver', $event)\"\n #nodeContentWrapper\n >\n <!-- #region <tree-node-expander> custom template --->\n <div class=\"sky-toggle-children-wrapper\">\n <button\n *ngIf=\"node.hasChildren\"\n class=\"sky-btn sky-btn-link sky-toggle-children\"\n tabindex=\"-1\"\n type=\"button\"\n [attr.aria-label]=\"\n 'skyux_angular_tree_click_to_expand' | skyLibResources\n \"\n [class.toggle-children-wrapper-expanded]=\"node.isExpanded\"\n [class.toggle-children-wrapper-collapsed]=\"node.isCollapsed\"\n (click)=\"node.mouseAction('expanderClick', $event)\"\n >\n <sky-icon\n [icon]=\"node.isExpanded ? 'chevron-down' : 'chevron-right'\"\n size=\"sm\"\n >\n </sky-icon>\n </button>\n <span *ngIf=\"showTogglePlaceholder()\" class=\"toggle-children-placeholder\">\n </span>\n </div>\n <!-- #endregion <tree-node-expander> --->\n\n <!-- Note: we've made changes to the click event, tabindex, and classes when compared to the original template. -->\n <!-- https://github.com/500tech/angular-tree-component/blob/master/lib/components/tree-node-wrapper.component.ts -->\n <div class=\"node-content-wrapper\">\n <sky-checkbox\n *ngIf=\"showCheckbox()\"\n [checked]=\"isSelected\"\n [id]=\"node.data.id\"\n [label]=\"node.data.name\"\n [indeterminate]=\"isPartiallySelected\"\n (change)=\"node.mouseAction('checkboxClick', $event)\"\n >\n </sky-checkbox>\n\n <sky-angular-tree-context-menu>\n <ng-content select=\"sky-dropdown\"></ng-content>\n </sky-angular-tree-context-menu>\n\n <tree-node-content\n [index]=\"index\"\n [node]=\"node\"\n [template]=\"templates?.treeNodeTemplate\"\n (click)=\"node.mouseAction('click', $event)\"\n >\n </tree-node-content\n ><span class=\"sky-control-help-container\"\n ><ng-content select=\".sky-control-help\"></ng-content\n ></span>\n </div>\n </div>\n\n <ng-container\n [ngTemplateOutlet]=\"templates?.treeNodeWrapperTemplate\"\n [ngTemplateOutletContext]=\"{\n $implicit: node,\n node: node,\n index: index,\n templates: templates\n }\"\n >\n </ng-container>\n <!-- #endregion <tree-node-wrapper> -->\n\n <tree-node-children role=\"group\" [node]=\"node\" [templates]=\"templates\">\n </tree-node-children>\n\n <tree-node-drop-slot [dropIndex]=\"node.index + 1\" [node]=\"node.parent\">\n </tree-node-drop-slot>\n</div>\n" }]
242
+ }], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }, { type: i1.SkyAngularTreeAdapterService }, { type: i2.SkyAngularTreeWrapperComponent, decorators: [{
243
+ type: Optional
244
+ }] }]; }, propDecorators: { index: [{
245
+ type: Input
246
+ }], node: [{
247
+ type: Input
248
+ }], templates: [{
249
+ type: Input
250
+ }], nodeContentWrapperRef: [{
251
+ type: ViewChild,
252
+ args: ['nodeContentWrapper', { read: ElementRef }]
253
+ }] } });
254
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW5ndWxhci10cmVlLW5vZGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9jb21wb25lbnRzL2FuZ3VsYXItdHJlZS1jb21wb25lbnQvc3JjL2xpYi9tb2R1bGVzL2FuZ3VsYXItdHJlZS9hbmd1bGFyLXRyZWUtbm9kZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2NvbXBvbmVudHMvYW5ndWxhci10cmVlLWNvbXBvbmVudC9zcmMvbGliL21vZHVsZXMvYW5ndWxhci10cmVlL2FuZ3VsYXItdHJlZS1ub2RlLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFHTCxTQUFTLEVBQ1QsVUFBVSxFQUNWLEtBQUssRUFFTCxRQUFRLEVBQ1IsU0FBUyxHQUNWLE1BQU0sZUFBZSxDQUFDO0FBR3ZCLE9BQU8sRUFBRSw0QkFBNEIsRUFBRSxNQUFNLGdDQUFnQyxDQUFDOzs7Ozs7Ozs7O0FBRzlFOzs7Ozs7Ozs7R0FTRztBQU1ILE1BQU0sT0FBTywyQkFBMkI7SUFzQnRDLElBQVcsZUFBZSxDQUFDLEtBQXlCO1FBQ2xELElBQUksS0FBSyxLQUFLLElBQUksQ0FBQyxpQkFBaUIsRUFBRTtZQUNwQyxJQUFJLENBQUMsaUJBQWlCLEdBQUcsS0FBSyxDQUFDO1lBQy9CLElBQUksSUFBSSxDQUFDLGtCQUFrQixDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksS0FBSyxLQUFLLFNBQVMsRUFBRTtnQkFDN0QsSUFBSSxDQUFDLGtCQUFrQixDQUFDLEtBQUssQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDO2FBQ3hDO2lCQUFNO2dCQUNMLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxhQUFhLENBQUMsS0FBSyxFQUFFLENBQUM7YUFDbkQ7U0FDRjtJQUNILENBQUM7SUFFRCxJQUFXLGVBQWU7UUFDeEIsT0FBTyxJQUFJLENBQUMsaUJBQWlC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RUFBRTs0QkFDdEMsSUFBSSxDQUFDLGVBQWUsR0FBRyxDQUFDLENBQUM7eUJBQzFCOzZCQUFNOzRCQUNMLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQzt5QkFDeEI7cUJBQ0Y7b0JBQ0QsS0FBSyxDQUFDLGVBQWUsRUFBRSxDQUFDO29CQUN4QixLQUFLLENBQUMsY0FBYyxFQUFFLENBQUM7b0JBQ3ZCLE1BQU07Z0JBRVI7b0JBQ0UsTUFBTTthQUNUO1NBQ0Y7SUFDSCxDQUFDO0lBRUQsYUFBYTtRQUNYLElBQUksSUFBSSxDQUFDLHNCQUFzQixFQUFFO1lBQy9CLE9BQU8sQ0FDTCxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUk7Z0JBQ1gsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU07b0JBQ2YsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVc7b0JBQ3RCLENBQUMsSUFBSSxDQUFDLHNCQUFzQixDQUFDLG1CQUFtQixDQUFDLENBQ3BELENBQUM7U0FDSDthQUFNO1lBQ0wsT0FBTyxLQUFLLENBQUM7U0FDZDtJQUNILENBQUM7OEdBbFNVLDJCQUEyQjtrR0FBM0IsMkJBQTJCLGtIQUYzQixDQUFDLDRCQUE0QixDQUFDLGtJQTRFQSxVQUFVLDZCQ3hHckQsK3JJQXNIQTs7MkZEeEZhLDJCQUEyQjtrQkFMdkMsU0FBUzsrQkFDRSx1QkFBdUIsYUFFdEIsQ0FBQyw0QkFBNEIsQ0FBQzs7MEJBa0d0QyxRQUFROzRDQTFGSixLQUFLO3NCQURYLEtBQUs7Z0JBU0MsSUFBSTtzQkFEVixLQUFLO2dCQU9DLFNBQVM7c0JBRGYsS0FBSztnQkF3REMscUJBQXFCO3NCQUQzQixTQUFTO3VCQUFDLG9CQUFvQixFQUFFLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEFmdGVyVmlld0luaXQsXG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBDb21wb25lbnQsXG4gIEVsZW1lbnRSZWYsXG4gIElucHV0LFxuICBPbkluaXQsXG4gIE9wdGlvbmFsLFxuICBWaWV3Q2hpbGQsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgSVRyZWVTdGF0ZSwgVHJlZU5vZGUgfSBmcm9tICdAYmxhY2tiYXVkL2FuZ3VsYXItdHJlZS1jb21wb25lbnQnO1xuXG5pbXBvcnQgeyBTa3lBbmd1bGFyVHJlZUFkYXB0ZXJTZXJ2aWNlIH0gZnJvbSAnLi9hbmd1bGFyLXRyZWUtYWRhcHRlci5zZXJ2aWNlJztcbmltcG9ydCB7IFNreUFuZ3VsYXJUcmVlV3JhcHBlckNvbXBvbmVudCB9IGZyb20gJy4vYW5ndWxhci10cmVlLXdyYXBwZXIuY29tcG9uZW50JztcblxuLyoqXG4gKiBSZXBsYWNlcyB0aGUgZGVmYXVsdCB0cmVlIG5vZGUgdGVtcGxhdGUgd2l0aCBhIFNLWSBVWCBub2RlIGFzIHBhcnQgb2YgdGhlIGBTa3lBbmd1bGFyVHJlZU1vZHVsZWAgdGhhdFxuICogcHJvdmlkZXMgU0tZIFVYIGNvbXBvbmVudHMgYW5kIHN0eWxlcyB0byBjb21wbGVtZW50IHRoZSBgYW5ndWxhci10cmVlLWNvbXBvbmVudGAgbGlicmFyeSBhbmQgYXBwbHkgU0tZIFVYXG4gKiB0aGVtZXMgYW5kIGZ1bmN0aW9uYWxpdHkgdG8gaGllcmFyY2hpY2FsIGxpc3Qgdmlld3MuIFlvdSBtdXN0IHdyYXAgdGhpcyBjb21wb25lbnQgaW4gYW4gYG5nLXRlbXBsYXRlYFxuICogdGFnIHdpdGggdGhlIHRlbXBsYXRlIHJlZmVyZW5jZSB2YXJpYWJsZSBgI3RyZWVOb2RlRnVsbFRlbXBsYXRlYC4gRm9yIGluZm9ybWF0aW9uIGFib3V0IHRyZWUgbm9kZSB0ZW1wbGF0ZXMsXG4gKiBzZWUgdGhlIFtBbmd1bGFyIHRyZWUgY29tcG9uZW50IGRvY3VtZW50YXRpb25dKGh0dHBzOi8vYW5ndWxhcjItdHJlZS5yZWFkbWUuaW8vZG9jcy90ZW1wbGF0ZXMpLlxuICogVG8gZGlzcGxheSBjb250ZXh0IG1lbnVzIHdpdGggYWN0aW9ucyBmb3IgaW5kaXZpZHVhbCBpdGVtcyBpbiBoaWVyYXJjaGljYWwgbGlzdHMsIHBsYWNlXG4gKiBbZHJvcGRvd25zXShodHRwczovL2RldmVsb3Blci5ibGFja2JhdWQuY29tL3NreXV4LXBvcG92ZXJzL2RvY3MvZHJvcGRvd24/ZG9jcy1hY3RpdmUtdGFiPWRlc2lnbikgaW5zaWRlIHRoZVxuICogQW5ndWxhciB0cmVlIG5vZGUgY29tcG9uZW50LCB3aGljaCBhdXRvbWF0aWNhbGx5IGhhbmRsZXMgc3R5bGluZyBhbmQgcG9zaXRpb25pbmcgZm9yIGNvbnRleHQgbWVudXMuXG4gKi9cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3NreS1hbmd1bGFyLXRyZWUtbm9kZScsXG4gIHRlbXBsYXRlVXJsOiAnLi9hbmd1bGFyLXRyZWUtbm9kZS5jb21wb25lbnQuaHRtbCcsXG4gIHByb3ZpZGVyczogW1NreUFuZ3VsYXJUcmVlQWRhcHRlclNlcnZpY2VdLFxufSlcbmV4cG9ydCBjbGFzcyBTa3lBbmd1bGFyVHJlZU5vZGVDb21wb25lbnQgaW1wbGVtZW50cyBBZnRlclZpZXdJbml0LCBPbkluaXQge1xuICAvKipcbiAgICogVGhlIGBpbmRleGAgcHJvcGVydHkgZnJvbSB0aGUgcGFyZW50IGBuZy10ZW1wbGF0ZWAuXG4gICAqIEByZXF1aXJlZFxuICAgKi9cbiAgQElucHV0KClcbiAgcHVibGljIGluZGV4OiBudW1iZXIgfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIFRoZSBgbm9kZWAgcHJvcGVydHkgZnJvbSB0aGUgcGFyZW50IGBuZy10ZW1wbGF0ZWAuIEZvciBpbmZvcm1hdGlvbiBhYm91dCB0aGUgYFRyZWVOb2RlYCBvYmplY3QsIHNlZSB0aGVcbiAgICogW0FuZ3VsYXIgdHJlZSBjb21wb25lbnQgZG9jdW1lbnRhdGlvbl0oaHR0cHM6Ly9hbmd1bGFyMi10cmVlLnJlYWRtZS5pby9kb2NzL2FwaSkuXG4gICAqIEByZXF1aXJlZFxuICAgKi9cbiAgQElucHV0KClcbiAgcHVibGljIG5vZGU6IFRyZWVOb2RlIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBUaGUgYHRlbXBsYXRlc2AgcHJvcGVydHkgZnJvbSB0aGUgcGFyZW50IGBuZy10ZW1wbGF0ZWAuXG4gICAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgdGVtcGxhdGVzOiBhbnk7XG5cbiAgcHVibGljIHNldCBjaGlsZEZvY3VzSW5kZXgodmFsdWU6IG51bWJlciB8IHVuZGVmaW5lZCkge1xuICAgIGlmICh2YWx1ZSAhPT0gdGhpcy4jX2NoaWxkRm9jdXNJbmRleCkge1xuICAgICAgdGhpcy4jX2NoaWxkRm9jdXNJbmRleCA9IHZhbHVlO1xuICAgICAgaWYgKHRoaXMuI2ZvY3VzYWJsZUNoaWxkcmVuLmxlbmd0aCA+IDAgJiYgdmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aGlzLiNmb2N1c2FibGVDaGlsZHJlblt2YWx1ZV0uZm9jdXMoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMubm9kZUNvbnRlbnRXcmFwcGVyUmVmPy5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGdldCBjaGlsZEZvY3VzSW5kZXgoKTogbnVtYmVyIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy4jX2NoaWxkRm9jdXNJbmRleDtcbiAgfVxuXG4gIHB1YmxpYyBzZXQgZm9jdXNlZCh2YWx1ZTogYm9vbGVhbikge1xuICAgIHRoaXMudGFiSW5kZXggPSB2YWx1ZSA/IDAgOiAtMTtcbiAgICBpZiAodmFsdWUpIHtcbiAgICAgIHRoaXMubm9kZUNvbnRlbnRXcmFwcGVyUmVmPy5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHNldCBpc1BhcnRpYWxseVNlbGVjdGVkKHZhbHVlOiBib29sZWFuKSB7XG4gICAgaWYgKHZhbHVlICE9PSB0aGlzLiNfaXNQYXJ0aWFsbHlTZWxlY3RlZCkge1xuICAgICAgdGhpcy4jX2lzUGFydGlhbGx5U2VsZWN0ZWQgPSB2YWx1ZTtcbiAgICAgIHRoaXMuI2NoYW5nZURldGVjdG9yUmVmLm1hcmtGb3JDaGVjaygpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBnZXQgaXNQYXJ0aWFsbHlTZWxlY3RlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy4jX2lzUGFydGlhbGx5U2VsZWN0ZWQ7XG4gIH1cblxuICBwdWJsaWMgc2V0IGlzU2VsZWN0ZWQodmFsdWU6IGJvb2xlYW4pIHtcbiAgICBpZiAodmFsdWUgIT09IHRoaXMuI19pc1NlbGVjdGVkKSB7XG4gICAgICB0aGlzLiNfaXNTZWxlY3RlZCA9IHZhbHVlO1xuICAgICAgdGhpcy4jY2hhbmdlRGV0ZWN0b3JSZWYubWFya0ZvckNoZWNrKCk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGdldCBpc1NlbGVjdGVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLiNfaXNTZWxlY3RlZDtcbiAgfVxuXG4gIHB1YmxpYyBzZXQgdGFiSW5kZXgodmFsdWU6IG51bWJlcikge1xuICAgIHRoaXMuI190YWJJbmRleCA9IHZhbHVlO1xuICB9XG5cbiAgcHVibGljIGdldCB0YWJJbmRleCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLiNfdGFiSW5kZXg7XG4gIH1cblxuICBAVmlld0NoaWxkKCdub2RlQ29udGVudFdyYXBwZXInLCB7IHJlYWQ6IEVsZW1lbnRSZWYgfSlcbiAgcHVibGljIG5vZGVDb250ZW50V3JhcHBlclJlZjogRWxlbWVudFJlZiB8IHVuZGVmaW5lZDtcblxuICAjZm9jdXNhYmxlQ2hpbGRyZW46IEhUTUxFbGVtZW50W10gPSBbXTtcblxuICAjbW91c2VEb3duID0gZmFsc2U7XG5cbiAgI19jaGlsZEZvY3VzSW5kZXg6IG51bWJlciB8IHVuZGVmaW5lZDtcblxuICAjX2lzUGFydGlhbGx5U2VsZWN0ZWQgPSBmYWxzZTtcblxuICAjX2lzU2VsZWN0ZWQgPSBmYWxzZTtcblxuICAjX3RhYkluZGV4ID0gLTE7XG5cbiAgI2NoYW5nZURldGVjdG9yUmVmOiBDaGFuZ2VEZXRlY3RvclJlZjtcbiAgI2FkYXB0ZXJTZXJ2aWNlOiBTa3lBbmd1bGFyVHJlZUFkYXB0ZXJTZXJ2aWNlO1xuICAjc2t5QW5ndWxhclRyZWVXcmFwcGVyOiBTa3lBbmd1bGFyVHJlZVdyYXBwZXJDb21wb25lbnQgfCB1bmRlZmluZWQ7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgY2hhbmdlRGV0ZWN0b3JSZWY6IENoYW5nZURldGVjdG9yUmVmLFxuICAgIGFkYXB0ZXJTZXJ2aWNlOiBTa3lBbmd1bGFyVHJlZUFkYXB0ZXJTZXJ2aWNlLFxuICAgIEBPcHRpb25hbCgpIHNreUFuZ3VsYXJUcmVlV3JhcHBlcj86IFNreUFuZ3VsYXJUcmVlV3JhcHBlckNvbXBvbmVudFxuICApIHtcbiAgICB0aGlzLiNjaGFuZ2VEZXRlY3RvclJlZiA9IGNoYW5nZURldGVjdG9yUmVmO1xuICAgIHRoaXMuI2FkYXB0ZXJTZXJ2aWNlID0gYWRhcHRlclNlcnZpY2U7XG4gICAgdGhpcy4jc2t5QW5ndWxhclRyZWVXcmFwcGVyID0gc2t5QW5ndWxhclRyZWVXcmFwcGVyO1xuICB9XG5cbiAgcHVibGljIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIGlmICghdGhpcy4jc2t5QW5ndWxhclRyZWVXcmFwcGVyKSB7XG4gICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICBgPHNreS1hbmd1bGFyLXRyZWUtbm9kZS13cmFwcGVyPiBtdXN0IGJlIHdyYXBwZWQgaW5zaWRlIGEgPHNreS1hbmd1bGFyLXRyZWUtd3JhcHBlcj4gY29tcG9uZW50LmBcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMubm9kZSkge1xuICAgICAgLy8gQmVjYXVzZSB3ZSdyZSBiaW5kaW5nIHRoZSBjaGVja2JveCB0byBub2RlJ3MgY2hpbGRyZW4gcHJvcGVydGllcywgd2UgbmVlZCB0byBtYW51YWxseSBjb250cm9sIGNoYW5nZSBkZXRlY3Rpb24uXG4gICAgICAvLyBIZXJlLCB3ZSBsaXN0ZW4gdG8gdGhlIHRyZWUncyBzdGF0ZSBhbmQgZm9yY2UgY2hhbmdlIGRldGVjdGlvbiBpbiB0aGUgc2V0dGVycyBpZiB0aGUgdmFsdWUgaGFzIGNoYW5nZWQuXG4gICAgICB0aGlzLm5vZGUudHJlZU1vZGVsLnN1YnNjcmliZVRvU3RhdGUoKHN0YXRlOiBJVHJlZVN0YXRlKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLm5vZGUpIHtcbiAgICAgICAgICB0aGlzLmlzU2VsZWN0ZWQgPSB0aGlzLm5vZGUuaXNTZWxlY3RlZDtcbiAgICAgICAgICB0aGlzLmlzUGFydGlhbGx5U2VsZWN0ZWQgPSB0aGlzLm5vZGUuaXNQYXJ0aWFsbHlTZWxlY3RlZDtcblxuICAgICAgICAgIGlmIChzdGF0ZS5mb2N1c2VkTm9kZUlkKSB7XG4gICAgICAgICAgICB0aGlzLmZvY3VzZWQgPSBzdGF0ZS5mb2N1c2VkTm9kZUlkID09PSB0aGlzLm5vZGUuaWQ7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgLy8gTWFrZSB0aGUgZmlyc3Qgcm9vdCBub2RlIHRhYmJhYmxlLlxuICAgICAgaWYgKHRoaXMubm9kZS5pc1Jvb3QgJiYgdGhpcy5ub2RlLmluZGV4ID09PSAwKSB7XG4gICAgICAgIHRoaXMudGFiSW5kZXggPSAwO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XG4gICAgLy8gV2FpdCAxcyBmb3IgdGhlIG5vZGUgdG8gcmVuZGVyLCB0aGVuIHJlc2V0IGFsbCBjaGlsZCB0YWJJbmRleGVzIHRvIC0xLlxuICAgIC8vIFVuaXRzIHNtYWxsZXIgdGhhbiAxcyBtYXkgY29uc2lzdGVudGx5IGZhaWwgaWYgdGhlcmUgYXJlIG1hbnkgbm9kZXMsIG9yIG11bHRpcGxlIHRyZWVzIGFyZSBvbiB0aGUgc2FtZSBzY3JlZW4uXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBpZiAodGhpcy5ub2RlQ29udGVudFdyYXBwZXJSZWYpIHtcbiAgICAgICAgdGhpcy4jZm9jdXNhYmxlQ2hpbGRyZW4gPSB0aGlzLiNhZGFwdGVyU2VydmljZS5nZXRGb2N1c2FibGVDaGlsZHJlbihcbiAgICAgICAgICB0aGlzLm5vZGVDb250ZW50V3JhcHBlclJlZi5uYXRpdmVFbGVtZW50XG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuI2FkYXB0ZXJTZXJ2aWNlLnNldFRhYkluZGV4T2ZGb2N1c2FibGVFbHMoXG4gICAgICAgICAgdGhpcy5ub2RlQ29udGVudFdyYXBwZXJSZWYubmF0aXZlRWxlbWVudCxcbiAgICAgICAgICAtMVxuICAgICAgICApO1xuICAgICAgfVxuICAgIH0sIDEwMDApO1xuICB9XG5cbiAgLyoqXG4gICAqIElmIHNpbmdsZS1zZWxlY3QsIHNldCBhcmlhLXNlbGVjdGVkPXRydWUgZm9yIHRoZSBzZWxlY3RlZCBub2RlIGFuZCB1bmRlZmluZWQgZm9yIGFsbCB0aGUgb3RoZXJzLlxuICAgKiBGb3IgbXVsdGlwbGUtc2VsZWN0LCBzZXQgYXJpYS1zZWxlY3RlZCB0byBlaXRoZXIgdHJ1ZSBvciBmYWxzZS5cbiAgICogSWYgbm9kZSBjYW5ub3QgYmUgc2VsZWN0ZWQsIGFyaWEtc2VsZWN0ZWQgc2hvdWxkIGJlIHVuZGVmaW5lZCAoZS5nLiBwYXJlbnQgbm9kZXMgaW4gbGVhZi1zZWxlY3Qtb25seSBtb2RlKS5cbiAgICogQGludGVybmFsXG4gICAqL1xuICBwdWJsaWMgYXJpYVNlbGVjdGVkKCk6IGJvb2xlYW4gfCB1bmRlZmluZWQge1xuICAgIGlmICghdGhpcy4jc2t5QW5ndWxhclRyZWVXcmFwcGVyKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuI3NreUFuZ3VsYXJUcmVlV3JhcHBlci5zZWxlY3RTaW5nbGUpIHtcbiAgICAgIHJldHVybiB0aGlzLmlzU2VsZWN0ZWQgPyB0cnVlIDogdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIGlmICghdGhpcy4jaXNTZWxlY3RhYmxlKCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICByZXR1cm4gISF0aGlzLmlzU2VsZWN0ZWQ7XG4gIH1cblxuICBwdWJsaWMgc2hvd0NoZWNrYm94KCk6IGJvb2xlYW4ge1xuICAgIC8vIENoZWNrIGZvciBjaGVja2JveCBtb2RlIGVuYWJsZWQsIGJ1dCBhbHNvIHJlc3BlY3QgbGVhZi1ub2RlIGFuZCBzaW5nbGUtc2VsZWN0IHNldHRpbmdzLlxuICAgIHJldHVybiAoXG4gICAgICAhIXRoaXMubm9kZSAmJlxuICAgICAgdGhpcy5ub2RlLm9wdGlvbnMudXNlQ2hlY2tib3ggJiZcbiAgICAgIHRoaXMuI2lzU2VsZWN0YWJsZSgpICYmXG4gICAgICAoIXRoaXMuI3NreUFuZ3VsYXJUcmVlV3JhcHBlciB8fFxuICAgICAgICAhdGhpcy4jc2t5QW5ndWxhclRyZWVXcmFwcGVyLnNlbGVjdFNpbmdsZSlcbiAgICApO1xuICB9XG5cbiAgcHVibGljIHNob3dTZWxlY3RlZENsYXNzKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLiNpc1NlbGVjdGFibGUoKSAmJiB0aGlzLmlzU2VsZWN0ZWQgJiYgIXRoaXMuaXNQYXJ0aWFsbHlTZWxlY3RlZDtcbiAgfVxuXG4gIHB1YmxpYyBzaG93QWN0aXZlQ2xhc3MoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChcbiAgICAgICEhdGhpcy5ub2RlICYmXG4gICAgICB0aGlzLm5vZGUuaXNBY3RpdmUgJiZcbiAgICAgICF0aGlzLm5vZGUudHJlZU1vZGVsLm9wdGlvbnMudXNlQ2hlY2tib3hcbiAgICApO1xuICB9XG5cbiAgcHVibGljIHNob3dUb2dnbGVQbGFjZWhvbGRlcigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKFxuICAgICAgIXRoaXMubm9kZT8uaGFzQ2hpbGRyZW4gJiZcbiAgICAgICF0aGlzLiNza3lBbmd1bGFyVHJlZVdyYXBwZXI/LnNlbGVjdExlYWZOb2Rlc09ubHlcbiAgICApO1xuICB9XG5cbiAgcHVibGljIG9uRm9jdXMoKTogdm9pZCB7XG4gICAgLy8gPHRyZWUtbm9kZS1jb250ZW50PiBoYXMgaXRzIG93biBjbGljayBoYW5kbGVyLCBzbyB3ZSBuZWVkIHRvIGNoZWNrIGlmIHRoaXMgZm9jdXMgZXZlbnRcbiAgICAvLyBpcyBjb21pbmcgZnJvbSB0aGUgbW91c2UgY2xpY2sgb3IgdGhlIGtleWJvYXJkIHRvIHByZXZlbnQgdGhlIGxvZ2ljIGZyb20gcnVubmluZyB0d2ljZS5cbiAgICBpZiAoIXRoaXMuI21vdXNlRG93bikge1xuICAgICAgdGhpcy5ub2RlPy50cmVlTW9kZWwuc2V0Rm9jdXModHJ1ZSk7XG4gICAgICB0aGlzLm5vZGU/LmZvY3VzKCk7XG4gICAgICB0aGlzLmNoaWxkRm9jdXNJbmRleCA9IHVuZGVmaW5lZDtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgb25Nb3VzZURvd24oKTogdm9pZCB7XG4gICAgdGhpcy4jbW91c2VEb3duID0gdHJ1ZTtcbiAgfVxuXG4gIHB1YmxpYyBvbk1vdXNlVXAoKTogdm9pZCB7XG4gICAgdGhpcy4jbW91c2VEb3duID0gZmFsc2U7XG4gIH1cblxuICBwdWJsaWMgb25LZXlEb3duKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgICBpZiAoZG9jdW1lbnQuYWN0aXZlRWxlbWVudCA9PT0gZXZlbnQudGFyZ2V0KSB7XG4gICAgICBjb25zdCBrZXkgPSBldmVudC5rZXkudG9Mb3dlckNhc2UoKTtcbiAgICAgIHN3aXRjaCAoa2V5KSB7XG4gICAgICAgIGNhc2UgJ3VwJzpcbiAgICAgICAgY2FzZSAnYXJyb3d1cCc6XG4gICAgICAgICAgLy8gRm9jdXMgb24gcHJldmlvdXMgbm9kZS5cbiAgICAgICAgICB0aGlzLm5vZGU/LnRyZWVNb2RlbC5mb2N1c1ByZXZpb3VzTm9kZSgpO1xuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgJ2Rvd24nOlxuICAgICAgICBjYXNlICdhcnJvd2Rvd24nOlxuICAgICAgICAgIC8vIEZvY3VzIG9uIG5leHQgbm9kZS5cbiAgICAgICAgICB0aGlzLm5vZGU/LnRyZWVNb2RlbC5mb2N1c05leHROb2RlKCk7XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSAnbGVmdCc6XG4gICAgICAgIGNhc2UgJ2Fycm93bGVmdCc6XG4gICAgICAgICAgLy8gQ3ljbGUgYmFja3dhcmRzIHRocm91Z2ggaW50ZXJhY3RpdmUgY2hpbGQgZWxlbWVudHNcbiAgICAgICAgICAvLyBJZiB1c2VyIHJlYWNoZXMgdGhlIGJlZ2lubmluZywgYWN0aXZhdGUgZHJpbGwgdXAuXG4gICAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgICAgICAgICBpZiAodGhpcy5jaGlsZEZvY3VzSW5kZXggIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgaWYgKHRoaXMuY2hpbGRGb2N1c0luZGV4ID09PSAwKSB7XG4gICAgICAgICAgICAgIHRoaXMuY2hpbGRGb2N1c0luZGV4ID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgdGhpcy5jaGlsZEZvY3VzSW5kZXgtLTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5ub2RlPy5zZXRJc0V4cGFuZGVkKGZhbHNlKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlICdyaWdodCc6XG4gICAgICAgIGNhc2UgJ2Fycm93cmlnaHQnOlxuICAgICAgICAgIC8vIEN5Y2xlIGZvcndhcmQgdGhyb3VnaCBpbnRlcmFjdGl2ZSBjaGlsZCBlbGVtZW50cy5cbiAgICAgICAgICAvLyBJZiB1c2VyIHJlYWNoZXMgdGhlIGVuZCwgYWN0aXZhdGUgZHJpbGwgZG93bi5cbiAgICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIHRoaXMuI2ZvY3VzYWJsZUNoaWxkcmVuLmxlbmd0aCA8PSAwIHx8XG4gICAgICAgICAgICB0aGlzLmNoaWxkRm9jdXNJbmRleCA9PT0gdGhpcy4jZm9jdXNhYmxlQ2hpbGRyZW4ubGVuZ3RoIC0gMVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgdGhpcy5ub2RlPy5zZXRJc0V4cGFuZGVkKHRydWUpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAodGhpcy5jaGlsZEZvY3VzSW5kZXggPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICB0aGlzLmNoaWxkRm9jdXNJbmRleCA9IDA7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB0aGlzLmNoaWxkRm9jdXNJbmRleCsrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgI2lzU2VsZWN0YWJsZSgpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy4jc2t5QW5ndWxhclRyZWVXcmFwcGVyKSB7XG4gICAgICByZXR1cm4gKFxuICAgICAgICAhIXRoaXMubm9kZSAmJlxuICAgICAgICAodGhpcy5ub2RlLmlzTGVhZiB8fFxuICAgICAgICAgICF0aGlzLm5vZGUuaGFzQ2hpbGRyZW4gfHxcbiAgICAgICAgICAhdGhpcy4jc2t5QW5ndWxhclRyZWVXcmFwcGVyLnNlbGVjdExlYWZOb2Rlc09ubHkpXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG59XG4iLCI8ZGl2XG4gICpuZ0lmPVwibm9kZSAmJiBpbmRleCAhPT0gdW5kZWZpbmVkXCJcbiAgW2NsYXNzXT1cIm5vZGUuZ2V0Q2xhc3MoKVwiXG4gIFtjbGFzcy50cmVlLW5vZGVdPVwidHJ1ZVwiXG4gIFtjbGFzcy50cmVlLW5vZGUtYWN0aXZlXT1cIm5vZGUuaXNBY3RpdmVcIlxuICBbY2xhc3MudHJlZS1ub2RlLWNvbGxhcHNlZF09XCJub2RlLmlzQ29sbGFwc2VkICYmIG5vZGUuaGFzQ2hpbGRyZW5cIlxuICBbY2xhc3MudHJlZS1ub2RlLWV4cGFuZGVkXT1cIm5vZGUuaXNFeHBhbmRlZCAmJiBub2RlLmhhc0NoaWxkcmVuXCJcbiAgW2NsYXNzLnRyZWUtbm9kZS1mb2N1c2VkXT1cIm5vZGUuaXNGb2N1c2VkXCJcbiAgW2NsYXNzLnRyZWUtbm9kZS1sZWFmXT1cIm5vZGUuaXNMZWFmXCJcbj5cbiAgPHRyZWUtbm9kZS1kcm9wLXNsb3RcbiAgICAqbmdJZj1cImluZGV4ID09PSAwXCJcbiAgICBbZHJvcEluZGV4XT1cIm5vZGUuaW5kZXhcIlxuICAgIFtub2RlXT1cIm5vZGUucGFyZW50XCJcbiAgPlxuICA8L3RyZWUtbm9kZS1kcm9wLXNsb3Q+XG5cbiAgPCEtLSAjcmVnaW9uIDx0cmVlLW5vZGUtd3JhcHBlcj4gY3VzdG9tIHRlbXBsYXRlIC0tLT5cbiAgPGRpdlxuICAgIGNsYXNzPVwibm9kZS13cmFwcGVyXCJcbiAgICByb2xlPVwidHJlZWl0ZW1cIlxuICAgIFthbGxvd0RyYWdvdmVyU3R5bGluZ109XCJub2RlLmFsbG93RHJhZ292ZXJTdHlsaW5nKClcIlxuICAgIFthdHRyLmFyaWEtY3VycmVudF09XCJub2RlLmlzQWN0aXZlXCJcbiAgICBbYXR0ci5hcmlhLWV4cGFuZGVkXT1cIm5vZGUuY2hpbGRyZW4/Lmxlbmd0aCA/IG5vZGUuaXNFeHBhbmRlZCA6IG51bGxcIlxuICAgIFthdHRyLmFyaWEtc2VsZWN0ZWRdPVwiYXJpYVNlbGVjdGVkKClcIlxuICAgIFthdHRyLmRhdGEtbm9kZS1pZF09XCJub2RlLmlkXCJcbiAgICBbYXR0ci50YWJpbmRleF09XCJ0YWJJbmRleFwiXG4gICAgW2NsYXNzLnNreS1hbmd1bGFyLXRyZWUtbm9kZS1hY3RpdmVdPVwic2hvd0FjdGl2ZUNsYXNzKClcIlxuICAgIFtjbGFzcy5za3ktYW5ndWxhci10cmVlLW5vZGUtc2VsZWN0ZWRdPVwic2hvd1NlbGVjdGVkQ2xhc3MoKVwiXG4gICAgW3N0eWxlLnBhZGRpbmctbGVmdF09XCJub2RlLmdldE5vZGVQYWRkaW5nKClcIlxuICAgIFt0cmVlQWxsb3dEcm9wXT1cIm5vZGUuYWxsb3dEcm9wXCJcbiAgICBbdHJlZURyYWddPVwibm9kZVwiXG4gICAgW3RyZWVEcmFnRW5hYmxlZF09XCJub2RlLmFsbG93RHJhZygpXCJcbiAgICAoY29udGV4dG1lbnUpPVwibm9kZS5tb3VzZUFjdGlvbignY29udGV4dE1lbnUnLCAkZXZlbnQpXCJcbiAgICAoZGJsY2xpY2spPVwibm9kZS5tb3VzZUFjdGlvbignZGJsQ2xpY2snLCAkZXZlbnQpXCJcbiAgICAoZm9jdXMpPVwib25Gb2N1cygpXCJcbiAgICAobW91c2Vkb3duKT1cIm9uTW91c2VEb3duKClcIlxuICAgIChtb3VzZXVwKT1cIm9uTW91c2VVcCgpXCJcbiAgICAoa2V5ZG93bik9XCJvbktleURvd24oJGV2ZW50KVwiXG4gICAgKHRyZWVEcm9wKT1cIm5vZGUub25Ecm9wKCRldmVudClcIlxuICAgICh0cmVlRHJvcERyYWdFbnRlcik9XCJub2RlLm1vdXNlQWN0aW9uKCdkcmFnRW50ZXInLCAkZXZlbnQpXCJcbiAgICAodHJlZURyb3BEcmFnTGVhdmUpPVwibm9kZS5tb3VzZUFjdGlvbignZHJhZ0xlYXZlJywgJGV2ZW50KVwiXG4gICAgKHRyZWVEcm9wRHJhZ092ZXIpPVwibm9kZS5tb3VzZUFjdGlvbignZHJhZ092ZXInLCAkZXZlbnQpXCJcbiAgICAjbm9kZUNvbnRlbnRXcmFwcGVyXG4gID5cbiAgICA8IS0tICNyZWdpb24gPHRyZWUtbm9kZS1leHBhbmRlcj4gY3VzdG9tIHRlbXBsYXRlIC0tLT5cbiAgICA8ZGl2IGNsYXNzPVwic2t5LXRvZ2dsZS1jaGlsZHJlbi13cmFwcGVyXCI+XG4gICAgICA8YnV0dG9uXG4gICAgICAgICpuZ0lmPVwibm9kZS5oYXNDaGlsZHJlblwiXG4gICAgICAgIGNsYXNzPVwic2t5LWJ0biBza3ktYnRuLWxpbmsgc2t5LXRvZ2dsZS1jaGlsZHJlblwiXG4gICAgICAgIHRhYmluZGV4PVwiLTFcIlxuICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJcbiAgICAgICAgICAnc2t5dXhfYW5ndWxhcl90cmVlX2NsaWNrX3RvX2V4cGFuZCcgfCBza3lMaWJSZXNvdXJjZXNcbiAgICAgICAgXCJcbiAgICAgICAgW2NsYXNzLnRvZ2dsZS1jaGlsZHJlbi13cmFwcGVyLWV4cGFuZGVkXT1cIm5vZGUuaXNFeHBhbmRlZFwiXG4gICAgICAgIFtjbGFzcy50b2dnbGUtY2hpbGRyZW4td3JhcHBlci1jb2xsYXBzZWRdPVwibm9kZS5pc0NvbGxhcHNlZFwiXG4gICAgICAgIChjbGljayk9XCJub2RlLm1vdXNlQWN0aW9uKCdleHBhbmRlckNsaWNrJywgJGV2ZW50KVwiXG4gICAgICA+XG4gICAgICAgIDxza3ktaWNvblxuICAgICAgICAgIFtpY29uXT1cIm5vZGUuaXNFeHBhbmRlZCA/ICdjaGV2cm9uLWRvd24nIDogJ2NoZXZyb24tcmlnaHQnXCJcbiAgICAgICAgICBzaXplPVwic21cIlxuICAgICAgICA+XG4gICAgICAgIDwvc2t5LWljb24+XG4gICAgICA8L2J1dHRvbj5cbiAgICAgIDxzcGFuICpuZ0lmPVwic2hvd1RvZ2dsZVBsYWNlaG9sZGVyKClcIiBjbGFzcz1cInRvZ2dsZS1jaGlsZHJlbi1wbGFjZWhvbGRlclwiPlxuICAgICAgPC9zcGFuPlxuICAgIDwvZGl2PlxuICAgIDwhLS0gI2VuZHJlZ2lvbiA8dHJlZS1ub2RlLWV4cGFuZGVyPiAtLS0+XG5cbiAgICA8IS0tIE5vdGU6IHdlJ3ZlIG1hZGUgY2hhbmdlcyB0byB0aGUgY2xpY2sgZXZlbnQsIHRhYmluZGV4LCBhbmQgY2xhc3NlcyB3aGVuIGNvbXBhcmVkIHRvIHRoZSBvcmlnaW5hbCB0ZW1wbGF0ZS4gLS0+XG4gICAgPCEtLSBodHRwczovL2dpdGh1Yi5jb20vNTAwdGVjaC9hbmd1bGFyLXRyZWUtY29tcG9uZW50L2Jsb2IvbWFzdGVyL2xpYi9jb21wb25lbnRzL3RyZWUtbm9kZS13cmFwcGVyLmNvbXBvbmVudC50cyAtLT5cbiAgICA8ZGl2IGNsYXNzPVwibm9kZS1jb250ZW50LXdyYXBwZXJcIj5cbiAgICAgIDxza3ktY2hlY2tib3hcbiAgICAgICAgKm5nSWY9XCJzaG93Q2hlY2tib3goKVwiXG4gICAgICAgIFtjaGVja2VkXT1cImlzU2VsZWN0ZWRcIlxuICAgICAgICBbaWRdPVwibm9kZS5kYXRhLmlkXCJcbiAgICAgICAgW2xhYmVsXT1cIm5vZGUuZGF0YS5uYW1lXCJcbiAgICAgICAgW2luZGV0ZXJtaW5hdGVdPVwiaXNQYXJ0aWFsbHlTZWxlY3RlZFwiXG4gICAgICAgIChjaGFuZ2UpPVwibm9kZS5tb3VzZUFjdGlvbignY2hlY2tib3hDbGljaycsICRldmVudClcIlxuICAgICAgPlxuICAgICAgPC9za3ktY2hlY2tib3g+XG5cbiAgICAgIDxza3ktYW5ndWxhci10cmVlLWNvbnRleHQtbWVudT5cbiAgICAgICAgPG5nLWNvbnRlbnQgc2VsZWN0PVwic2t5LWRyb3Bkb3duXCI+PC9uZy1jb250ZW50PlxuICAgICAgPC9za3ktYW5ndWxhci10cmVlLWNvbnRleHQtbWVudT5cblxuICAgICAgPHRyZWUtbm9kZS1jb250ZW50XG4gICAgICAgIFtpbmRleF09XCJpbmRleFwiXG4gICAgICAgIFtub2RlXT1cIm5vZGVcIlxuICAgICAgICBbdGVtcGxhdGVdPVwidGVtcGxhdGVzPy50cmVlTm9kZVRlbXBsYXRlXCJcbiAgICAgICAgKGNsaWNrKT1cIm5vZGUubW91c2VBY3Rpb24oJ2NsaWNrJywgJGV2ZW50KVwiXG4gICAgICA+XG4gICAgICA8L3RyZWUtbm9kZS1jb250ZW50XG4gICAgICA+PHNwYW4gY2xhc3M9XCJza3ktY29udHJvbC1oZWxwLWNvbnRhaW5lclwiXG4gICAgICAgID48bmctY29udGVudCBzZWxlY3Q9XCIuc2t5LWNvbnRyb2wtaGVscFwiPjwvbmctY29udGVudFxuICAgICAgPjwvc3Bhbj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG5cbiAgPG5nLWNvbnRhaW5lclxuICAgIFtuZ1RlbXBsYXRlT3V0bGV0XT1cInRlbXBsYXRlcz8udHJlZU5vZGVXcmFwcGVyVGVtcGxhdGVcIlxuICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7XG4gICAgICAkaW1wbGljaXQ6IG5vZGUsXG4gICAgICBub2RlOiBub2RlLFxuICAgICAgaW5kZXg6IGluZGV4LFxuICAgICAgdGVtcGxhdGVzOiB0ZW1wbGF0ZXNcbiAgICB9XCJcbiAgPlxuICA8L25nLWNvbnRhaW5lcj5cbiAgPCEtLSAjZW5kcmVnaW9uIDx0cmVlLW5vZGUtd3JhcHBlcj4gLS0+XG5cbiAgPHRyZWUtbm9kZS1jaGlsZHJlbiByb2xlPVwiZ3JvdXBcIiBbbm9kZV09XCJub2RlXCIgW3RlbXBsYXRlc109XCJ0ZW1wbGF0ZXNcIj5cbiAgPC90cmVlLW5vZGUtY2hpbGRyZW4+XG5cbiAgPHRyZWUtbm9kZS1kcm9wLXNsb3QgW2Ryb3BJbmRleF09XCJub2RlLmluZGV4ICsgMVwiIFtub2RlXT1cIm5vZGUucGFyZW50XCI+XG4gIDwvdHJlZS1ub2RlLWRyb3Atc2xvdD5cbjwvZGl2PlxuIl19
@@ -26,10 +26,10 @@ export class SkyTreeViewToolbarComponent {
26
26
  onSelectAllClick() {
27
27
  this.selectAllClick.emit();
28
28
  }
29
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: SkyTreeViewToolbarComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
30
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: SkyTreeViewToolbarComponent, selector: "sky-angular-tree-toolbar", inputs: { showSelectButtons: "showSelectButtons" }, outputs: { clearAllClick: "clearAllClick", collapseAllClick: "collapseAllClick", expandAllClick: "expandAllClick", selectAllClick: "selectAllClick" }, ngImport: i0, template: "<div class=\"sky-angular-tree-toolbar\" role=\"toolbar\">\n <sky-toolbar>\n <sky-toolbar-item *ngIf=\"showSelectButtons\">\n <button\n class=\"sky-btn sky-btn-link sky-angular-tree-select-all-btn\"\n type=\"button\"\n (click)=\"onSelectAllClick()\"\n >\n {{ 'skyux_angular_tree_select_all' | skyLibResources }}\n </button>\n </sky-toolbar-item>\n <sky-toolbar-item *ngIf=\"showSelectButtons\">\n <button\n class=\"sky-btn sky-btn-link sky-angular-tree-clear-all-btn\"\n type=\"button\"\n (click)=\"onClearAllClick()\"\n >\n {{ 'skyux_angular_tree_clear_all' | skyLibResources }}\n </button>\n </sky-toolbar-item>\n <sky-toolbar-view-actions>\n <button\n class=\"sky-btn sky-btn-default sky-margin-inline-default sky-angular-tree-expand-all-btn\"\n title=\"{{ 'skyux_angular_tree_expand_all' | skyLibResources }}\"\n type=\"button\"\n (click)=\"onExpandAllClick()\"\n >\n <sky-icon icon=\"angle-double-down\"> </sky-icon>\n </button>\n <button\n class=\"sky-btn sky-btn-default sky-margin-inline-default sky-angular-tree-collapse-all-btn\"\n title=\"{{ 'skyux_angular_tree_collapse_all' | skyLibResources }}\"\n type=\"button\"\n (click)=\"onCollapseAllClick()\"\n >\n <sky-icon icon=\"angle-double-up\"> </sky-icon>\n </button>\n </sky-toolbar-view-actions>\n </sky-toolbar>\n</div>\n", dependencies: [{ kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i2.λ4, selector: "sky-icon", inputs: ["icon", "iconType", "size", "fixedWidth", "variant"] }, { kind: "component", type: i3.λ37, selector: "sky-toolbar" }, { kind: "component", type: i3.λ39, selector: "sky-toolbar-item" }, { kind: "component", type: i3.λ40, selector: "sky-toolbar-view-actions" }, { kind: "pipe", type: i4.SkyLibResourcesPipe, name: "skyLibResources" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
29
31
  }
30
- SkyTreeViewToolbarComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: SkyTreeViewToolbarComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
31
- SkyTreeViewToolbarComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.9", type: SkyTreeViewToolbarComponent, selector: "sky-angular-tree-toolbar", inputs: { showSelectButtons: "showSelectButtons" }, outputs: { clearAllClick: "clearAllClick", collapseAllClick: "collapseAllClick", expandAllClick: "expandAllClick", selectAllClick: "selectAllClick" }, ngImport: i0, template: "<div class=\"sky-angular-tree-toolbar\" role=\"toolbar\">\n <sky-toolbar>\n <sky-toolbar-item *ngIf=\"showSelectButtons\">\n <button\n class=\"sky-btn sky-btn-link sky-angular-tree-select-all-btn\"\n type=\"button\"\n (click)=\"onSelectAllClick()\"\n >\n {{ 'skyux_angular_tree_select_all' | skyLibResources }}\n </button>\n </sky-toolbar-item>\n <sky-toolbar-item *ngIf=\"showSelectButtons\">\n <button\n class=\"sky-btn sky-btn-link sky-angular-tree-clear-all-btn\"\n type=\"button\"\n (click)=\"onClearAllClick()\"\n >\n {{ 'skyux_angular_tree_clear_all' | skyLibResources }}\n </button>\n </sky-toolbar-item>\n <sky-toolbar-view-actions>\n <button\n class=\"sky-btn sky-btn-default sky-margin-inline-default sky-angular-tree-expand-all-btn\"\n title=\"{{ 'skyux_angular_tree_expand_all' | skyLibResources }}\"\n type=\"button\"\n (click)=\"onExpandAllClick()\"\n >\n <sky-icon icon=\"angle-double-down\"> </sky-icon>\n </button>\n <button\n class=\"sky-btn sky-btn-default sky-margin-inline-default sky-angular-tree-collapse-all-btn\"\n title=\"{{ 'skyux_angular_tree_collapse_all' | skyLibResources }}\"\n type=\"button\"\n (click)=\"onCollapseAllClick()\"\n >\n <sky-icon icon=\"angle-double-up\"> </sky-icon>\n </button>\n </sky-toolbar-view-actions>\n </sky-toolbar>\n</div>\n", dependencies: [{ kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i2.λ4, selector: "sky-icon", inputs: ["icon", "iconType", "size", "fixedWidth", "variant"] }, { kind: "component", type: i3.λ37, selector: "sky-toolbar" }, { kind: "component", type: i3.λ39, selector: "sky-toolbar-item" }, { kind: "component", type: i3.λ40, selector: "sky-toolbar-view-actions" }, { kind: "pipe", type: i4.SkyLibResourcesPipe, name: "skyLibResources" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
32
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: SkyTreeViewToolbarComponent, decorators: [{
32
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: SkyTreeViewToolbarComponent, decorators: [{
33
33
  type: Component,
34
34
  args: [{ selector: 'sky-angular-tree-toolbar', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"sky-angular-tree-toolbar\" role=\"toolbar\">\n <sky-toolbar>\n <sky-toolbar-item *ngIf=\"showSelectButtons\">\n <button\n class=\"sky-btn sky-btn-link sky-angular-tree-select-all-btn\"\n type=\"button\"\n (click)=\"onSelectAllClick()\"\n >\n {{ 'skyux_angular_tree_select_all' | skyLibResources }}\n </button>\n </sky-toolbar-item>\n <sky-toolbar-item *ngIf=\"showSelectButtons\">\n <button\n class=\"sky-btn sky-btn-link sky-angular-tree-clear-all-btn\"\n type=\"button\"\n (click)=\"onClearAllClick()\"\n >\n {{ 'skyux_angular_tree_clear_all' | skyLibResources }}\n </button>\n </sky-toolbar-item>\n <sky-toolbar-view-actions>\n <button\n class=\"sky-btn sky-btn-default sky-margin-inline-default sky-angular-tree-expand-all-btn\"\n title=\"{{ 'skyux_angular_tree_expand_all' | skyLibResources }}\"\n type=\"button\"\n (click)=\"onExpandAllClick()\"\n >\n <sky-icon icon=\"angle-double-down\"> </sky-icon>\n </button>\n <button\n class=\"sky-btn sky-btn-default sky-margin-inline-default sky-angular-tree-collapse-all-btn\"\n title=\"{{ 'skyux_angular_tree_collapse_all' | skyLibResources }}\"\n type=\"button\"\n (click)=\"onCollapseAllClick()\"\n >\n <sky-icon icon=\"angle-double-up\"> </sky-icon>\n </button>\n </sky-toolbar-view-actions>\n </sky-toolbar>\n</div>\n" }]
35
35
  }], propDecorators: { showSelectButtons: [{
@@ -43,4 +43,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImpor
43
43
  }], selectAllClick: [{
44
44
  type: Output
45
45
  }] } });
46
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW5ndWxhci10cmVlLXRvb2xiYXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9jb21wb25lbnRzL2FuZ3VsYXItdHJlZS1jb21wb25lbnQvc3JjL2xpYi9tb2R1bGVzL2FuZ3VsYXItdHJlZS9hbmd1bGFyLXRyZWUtdG9vbGJhci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2NvbXBvbmVudHMvYW5ndWxhci10cmVlLWNvbXBvbmVudC9zcmMvbGliL21vZHVsZXMvYW5ndWxhci10cmVlL2FuZ3VsYXItdHJlZS10b29sYmFyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCx1QkFBdUIsRUFDdkIsU0FBUyxFQUNULFlBQVksRUFDWixLQUFLLEVBQ0wsTUFBTSxHQUNQLE1BQU0sZUFBZSxDQUFDOzs7Ozs7QUFFdkI7O0dBRUc7QUFNSCxNQUFNLE9BQU8sMkJBQTJCO0lBTHhDO1FBVVMsa0JBQWEsR0FBRyxJQUFJLFlBQVksRUFBUSxDQUFDO1FBR3pDLHFCQUFnQixHQUFHLElBQUksWUFBWSxFQUFRLENBQUM7UUFHNUMsbUJBQWMsR0FBRyxJQUFJLFlBQVksRUFBUSxDQUFDO1FBRzFDLG1CQUFjLEdBQUcsSUFBSSxZQUFZLEVBQVEsQ0FBQztLQWlCbEQ7SUFmUSxlQUFlO1FBQ3BCLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDNUIsQ0FBQztJQUVNLGtCQUFrQjtRQUN2QixJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDL0IsQ0FBQztJQUVNLGdCQUFnQjtRQUNyQixJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksRUFBRSxDQUFDO0lBQzdCLENBQUM7SUFFTSxnQkFBZ0I7UUFDckIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUM3QixDQUFDOzt3SEE5QlUsMkJBQTJCOzRHQUEzQiwyQkFBMkIsMlFDaEJ4QyxvOUNBd0NBOzJGRHhCYSwyQkFBMkI7a0JBTHZDLFNBQVM7K0JBQ0UsMEJBQTBCLG1CQUVuQix1QkFBdUIsQ0FBQyxNQUFNOzhCQUl4QyxpQkFBaUI7c0JBRHZCLEtBQUs7Z0JBSUMsYUFBYTtzQkFEbkIsTUFBTTtnQkFJQSxnQkFBZ0I7c0JBRHRCLE1BQU07Z0JBSUEsY0FBYztzQkFEcEIsTUFBTTtnQkFJQSxjQUFjO3NCQURwQixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENvbXBvbmVudCxcbiAgRXZlbnRFbWl0dGVyLFxuICBJbnB1dCxcbiAgT3V0cHV0LFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnc2t5LWFuZ3VsYXItdHJlZS10b29sYmFyJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2FuZ3VsYXItdHJlZS10b29sYmFyLmNvbXBvbmVudC5odG1sJyxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG59KVxuZXhwb3J0IGNsYXNzIFNreVRyZWVWaWV3VG9vbGJhckNvbXBvbmVudCB7XG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBzaG93U2VsZWN0QnV0dG9uczogYm9vbGVhbiB8IHVuZGVmaW5lZDtcblxuICBAT3V0cHV0KClcbiAgcHVibGljIGNsZWFyQWxsQ2xpY2sgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG5cbiAgQE91dHB1dCgpXG4gIHB1YmxpYyBjb2xsYXBzZUFsbENsaWNrID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuXG4gIEBPdXRwdXQoKVxuICBwdWJsaWMgZXhwYW5kQWxsQ2xpY2sgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG5cbiAgQE91dHB1dCgpXG4gIHB1YmxpYyBzZWxlY3RBbGxDbGljayA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcblxuICBwdWJsaWMgb25DbGVhckFsbENsaWNrKCk6IHZvaWQge1xuICAgIHRoaXMuY2xlYXJBbGxDbGljay5lbWl0KCk7XG4gIH1cblxuICBwdWJsaWMgb25Db2xsYXBzZUFsbENsaWNrKCk6IHZvaWQge1xuICAgIHRoaXMuY29sbGFwc2VBbGxDbGljay5lbWl0KCk7XG4gIH1cblxuICBwdWJsaWMgb25FeHBhbmRBbGxDbGljaygpOiB2b2lkIHtcbiAgICB0aGlzLmV4cGFuZEFsbENsaWNrLmVtaXQoKTtcbiAgfVxuXG4gIHB1YmxpYyBvblNlbGVjdEFsbENsaWNrKCk6IHZvaWQge1xuICAgIHRoaXMuc2VsZWN0QWxsQ2xpY2suZW1pdCgpO1xuICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwic2t5LWFuZ3VsYXItdHJlZS10b29sYmFyXCIgcm9sZT1cInRvb2xiYXJcIj5cbiAgPHNreS10b29sYmFyPlxuICAgIDxza3ktdG9vbGJhci1pdGVtICpuZ0lmPVwic2hvd1NlbGVjdEJ1dHRvbnNcIj5cbiAgICAgIDxidXR0b25cbiAgICAgICAgY2xhc3M9XCJza3ktYnRuIHNreS1idG4tbGluayBza3ktYW5ndWxhci10cmVlLXNlbGVjdC1hbGwtYnRuXCJcbiAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgIChjbGljayk9XCJvblNlbGVjdEFsbENsaWNrKClcIlxuICAgICAgPlxuICAgICAgICB7eyAnc2t5dXhfYW5ndWxhcl90cmVlX3NlbGVjdF9hbGwnIHwgc2t5TGliUmVzb3VyY2VzIH19XG4gICAgICA8L2J1dHRvbj5cbiAgICA8L3NreS10b29sYmFyLWl0ZW0+XG4gICAgPHNreS10b29sYmFyLWl0ZW0gKm5nSWY9XCJzaG93U2VsZWN0QnV0dG9uc1wiPlxuICAgICAgPGJ1dHRvblxuICAgICAgICBjbGFzcz1cInNreS1idG4gc2t5LWJ0bi1saW5rIHNreS1hbmd1bGFyLXRyZWUtY2xlYXItYWxsLWJ0blwiXG4gICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAoY2xpY2spPVwib25DbGVhckFsbENsaWNrKClcIlxuICAgICAgPlxuICAgICAgICB7eyAnc2t5dXhfYW5ndWxhcl90cmVlX2NsZWFyX2FsbCcgfCBza3lMaWJSZXNvdXJjZXMgfX1cbiAgICAgIDwvYnV0dG9uPlxuICAgIDwvc2t5LXRvb2xiYXItaXRlbT5cbiAgICA8c2t5LXRvb2xiYXItdmlldy1hY3Rpb25zPlxuICAgICAgPGJ1dHRvblxuICAgICAgICBjbGFzcz1cInNreS1idG4gc2t5LWJ0bi1kZWZhdWx0IHNreS1tYXJnaW4taW5saW5lLWRlZmF1bHQgc2t5LWFuZ3VsYXItdHJlZS1leHBhbmQtYWxsLWJ0blwiXG4gICAgICAgIHRpdGxlPVwie3sgJ3NreXV4X2FuZ3VsYXJfdHJlZV9leHBhbmRfYWxsJyB8IHNreUxpYlJlc291cmNlcyB9fVwiXG4gICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAoY2xpY2spPVwib25FeHBhbmRBbGxDbGljaygpXCJcbiAgICAgID5cbiAgICAgICAgPHNreS1pY29uIGljb249XCJhbmdsZS1kb3VibGUtZG93blwiPiA8L3NreS1pY29uPlxuICAgICAgPC9idXR0b24+XG4gICAgICA8YnV0dG9uXG4gICAgICAgIGNsYXNzPVwic2t5LWJ0biBza3ktYnRuLWRlZmF1bHQgc2t5LW1hcmdpbi1pbmxpbmUtZGVmYXVsdCBza3ktYW5ndWxhci10cmVlLWNvbGxhcHNlLWFsbC1idG5cIlxuICAgICAgICB0aXRsZT1cInt7ICdza3l1eF9hbmd1bGFyX3RyZWVfY29sbGFwc2VfYWxsJyB8IHNreUxpYlJlc291cmNlcyB9fVwiXG4gICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAoY2xpY2spPVwib25Db2xsYXBzZUFsbENsaWNrKClcIlxuICAgICAgPlxuICAgICAgICA8c2t5LWljb24gaWNvbj1cImFuZ2xlLWRvdWJsZS11cFwiPiA8L3NreS1pY29uPlxuICAgICAgPC9idXR0b24+XG4gICAgPC9za3ktdG9vbGJhci12aWV3LWFjdGlvbnM+XG4gIDwvc2t5LXRvb2xiYXI+XG48L2Rpdj5cbiJdfQ==
46
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW5ndWxhci10cmVlLXRvb2xiYXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9jb21wb25lbnRzL2FuZ3VsYXItdHJlZS1jb21wb25lbnQvc3JjL2xpYi9tb2R1bGVzL2FuZ3VsYXItdHJlZS9hbmd1bGFyLXRyZWUtdG9vbGJhci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2NvbXBvbmVudHMvYW5ndWxhci10cmVlLWNvbXBvbmVudC9zcmMvbGliL21vZHVsZXMvYW5ndWxhci10cmVlL2FuZ3VsYXItdHJlZS10b29sYmFyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCx1QkFBdUIsRUFDdkIsU0FBUyxFQUNULFlBQVksRUFDWixLQUFLLEVBQ0wsTUFBTSxHQUNQLE1BQU0sZUFBZSxDQUFDOzs7Ozs7QUFFdkI7O0dBRUc7QUFNSCxNQUFNLE9BQU8sMkJBQTJCO0lBTHhDO1FBVVMsa0JBQWEsR0FBRyxJQUFJLFlBQVksRUFBUSxDQUFDO1FBR3pDLHFCQUFnQixHQUFHLElBQUksWUFBWSxFQUFRLENBQUM7UUFHNUMsbUJBQWMsR0FBRyxJQUFJLFlBQVksRUFBUSxDQUFDO1FBRzFDLG1CQUFjLEdBQUcsSUFBSSxZQUFZLEVBQVEsQ0FBQztLQWlCbEQ7SUFmUSxlQUFlO1FBQ3BCLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDNUIsQ0FBQztJQUVNLGtCQUFrQjtRQUN2QixJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDL0IsQ0FBQztJQUVNLGdCQUFnQjtRQUNyQixJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksRUFBRSxDQUFDO0lBQzdCLENBQUM7SUFFTSxnQkFBZ0I7UUFDckIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUM3QixDQUFDOzhHQTlCVSwyQkFBMkI7a0dBQTNCLDJCQUEyQiwyUUNoQnhDLG85Q0F3Q0E7OzJGRHhCYSwyQkFBMkI7a0JBTHZDLFNBQVM7K0JBQ0UsMEJBQTBCLG1CQUVuQix1QkFBdUIsQ0FBQyxNQUFNOzhCQUl4QyxpQkFBaUI7c0JBRHZCLEtBQUs7Z0JBSUMsYUFBYTtzQkFEbkIsTUFBTTtnQkFJQSxnQkFBZ0I7c0JBRHRCLE1BQU07Z0JBSUEsY0FBYztzQkFEcEIsTUFBTTtnQkFJQSxjQUFjO3NCQURwQixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENvbXBvbmVudCxcbiAgRXZlbnRFbWl0dGVyLFxuICBJbnB1dCxcbiAgT3V0cHV0LFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnc2t5LWFuZ3VsYXItdHJlZS10b29sYmFyJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2FuZ3VsYXItdHJlZS10b29sYmFyLmNvbXBvbmVudC5odG1sJyxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG59KVxuZXhwb3J0IGNsYXNzIFNreVRyZWVWaWV3VG9vbGJhckNvbXBvbmVudCB7XG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBzaG93U2VsZWN0QnV0dG9uczogYm9vbGVhbiB8IHVuZGVmaW5lZDtcblxuICBAT3V0cHV0KClcbiAgcHVibGljIGNsZWFyQWxsQ2xpY2sgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG5cbiAgQE91dHB1dCgpXG4gIHB1YmxpYyBjb2xsYXBzZUFsbENsaWNrID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuXG4gIEBPdXRwdXQoKVxuICBwdWJsaWMgZXhwYW5kQWxsQ2xpY2sgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG5cbiAgQE91dHB1dCgpXG4gIHB1YmxpYyBzZWxlY3RBbGxDbGljayA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcblxuICBwdWJsaWMgb25DbGVhckFsbENsaWNrKCk6IHZvaWQge1xuICAgIHRoaXMuY2xlYXJBbGxDbGljay5lbWl0KCk7XG4gIH1cblxuICBwdWJsaWMgb25Db2xsYXBzZUFsbENsaWNrKCk6IHZvaWQge1xuICAgIHRoaXMuY29sbGFwc2VBbGxDbGljay5lbWl0KCk7XG4gIH1cblxuICBwdWJsaWMgb25FeHBhbmRBbGxDbGljaygpOiB2b2lkIHtcbiAgICB0aGlzLmV4cGFuZEFsbENsaWNrLmVtaXQoKTtcbiAgfVxuXG4gIHB1YmxpYyBvblNlbGVjdEFsbENsaWNrKCk6IHZvaWQge1xuICAgIHRoaXMuc2VsZWN0QWxsQ2xpY2suZW1pdCgpO1xuICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwic2t5LWFuZ3VsYXItdHJlZS10b29sYmFyXCIgcm9sZT1cInRvb2xiYXJcIj5cbiAgPHNreS10b29sYmFyPlxuICAgIDxza3ktdG9vbGJhci1pdGVtICpuZ0lmPVwic2hvd1NlbGVjdEJ1dHRvbnNcIj5cbiAgICAgIDxidXR0b25cbiAgICAgICAgY2xhc3M9XCJza3ktYnRuIHNreS1idG4tbGluayBza3ktYW5ndWxhci10cmVlLXNlbGVjdC1hbGwtYnRuXCJcbiAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgIChjbGljayk9XCJvblNlbGVjdEFsbENsaWNrKClcIlxuICAgICAgPlxuICAgICAgICB7eyAnc2t5dXhfYW5ndWxhcl90cmVlX3NlbGVjdF9hbGwnIHwgc2t5TGliUmVzb3VyY2VzIH19XG4gICAgICA8L2J1dHRvbj5cbiAgICA8L3NreS10b29sYmFyLWl0ZW0+XG4gICAgPHNreS10b29sYmFyLWl0ZW0gKm5nSWY9XCJzaG93U2VsZWN0QnV0dG9uc1wiPlxuICAgICAgPGJ1dHRvblxuICAgICAgICBjbGFzcz1cInNreS1idG4gc2t5LWJ0bi1saW5rIHNreS1hbmd1bGFyLXRyZWUtY2xlYXItYWxsLWJ0blwiXG4gICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAoY2xpY2spPVwib25DbGVhckFsbENsaWNrKClcIlxuICAgICAgPlxuICAgICAgICB7eyAnc2t5dXhfYW5ndWxhcl90cmVlX2NsZWFyX2FsbCcgfCBza3lMaWJSZXNvdXJjZXMgfX1cbiAgICAgIDwvYnV0dG9uPlxuICAgIDwvc2t5LXRvb2xiYXItaXRlbT5cbiAgICA8c2t5LXRvb2xiYXItdmlldy1hY3Rpb25zPlxuICAgICAgPGJ1dHRvblxuICAgICAgICBjbGFzcz1cInNreS1idG4gc2t5LWJ0bi1kZWZhdWx0IHNreS1tYXJnaW4taW5saW5lLWRlZmF1bHQgc2t5LWFuZ3VsYXItdHJlZS1leHBhbmQtYWxsLWJ0blwiXG4gICAgICAgIHRpdGxlPVwie3sgJ3NreXV4X2FuZ3VsYXJfdHJlZV9leHBhbmRfYWxsJyB8IHNreUxpYlJlc291cmNlcyB9fVwiXG4gICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAoY2xpY2spPVwib25FeHBhbmRBbGxDbGljaygpXCJcbiAgICAgID5cbiAgICAgICAgPHNreS1pY29uIGljb249XCJhbmdsZS1kb3VibGUtZG93blwiPiA8L3NreS1pY29uPlxuICAgICAgPC9idXR0b24+XG4gICAgICA8YnV0dG9uXG4gICAgICAgIGNsYXNzPVwic2t5LWJ0biBza3ktYnRuLWRlZmF1bHQgc2t5LW1hcmdpbi1pbmxpbmUtZGVmYXVsdCBza3ktYW5ndWxhci10cmVlLWNvbGxhcHNlLWFsbC1idG5cIlxuICAgICAgICB0aXRsZT1cInt7ICdza3l1eF9hbmd1bGFyX3RyZWVfY29sbGFwc2VfYWxsJyB8IHNreUxpYlJlc291cmNlcyB9fVwiXG4gICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAoY2xpY2spPVwib25Db2xsYXBzZUFsbENsaWNrKClcIlxuICAgICAgPlxuICAgICAgICA8c2t5LWljb24gaWNvbj1cImFuZ2xlLWRvdWJsZS11cFwiPiA8L3NreS1pY29uPlxuICAgICAgPC9idXR0b24+XG4gICAgPC9za3ktdG9vbGJhci12aWV3LWFjdGlvbnM+XG4gIDwvc2t5LXRvb2xiYXI+XG48L2Rpdj5cbiJdfQ==