@dangl/angular-ava 1.1.2-beta0049 → 1.1.2-beta0055

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 (54) hide show
  1. package/README.md +26 -8
  2. package/fesm2022/dangl-angular-ava.mjs +63 -556
  3. package/fesm2022/dangl-angular-ava.mjs.map +1 -1
  4. package/lib/ava-tree/tree/components/ava-tree/ava-tree.component.d.ts +1 -1
  5. package/lib/ava-tree/tree/components/list-structure/list-structure.component.d.ts +1 -1
  6. package/lib/ava-tree/tree/components/table-structure/table-structure.component.d.ts +1 -1
  7. package/lib/ava-tree/tree/components/tree-item/tree-item.component.d.ts +1 -1
  8. package/lib/ava-tree/tree/components/tree-node/tree-node.component.d.ts +1 -1
  9. package/lib/ava-tree/tree/components/tree-structure/tree-structure.component.d.ts +1 -1
  10. package/lib/ava-tree/tree/directives/save-changing-view.directive.d.ts +1 -1
  11. package/lib/ava-tree/tree/pipes/element-icon-name.pipe.d.ts +1 -1
  12. package/lib/ava-tree/tree/pipes/element-item-number.pipe.d.ts +1 -1
  13. package/lib/ava-tree/tree/pipes/element-text.pipe.d.ts +1 -1
  14. package/lib/ava-tree/tree/pipes/group-child-elements.pipe.d.ts +1 -1
  15. package/package.json +1 -3
  16. package/public-api.d.ts +1 -2
  17. package/esm2022/dangl-angular-ava.mjs +0 -5
  18. package/esm2022/lib/angular-ava.module.mjs +0 -91
  19. package/esm2022/lib/ava-tree/invoice/invoice-display/invoice-display.component.mjs +0 -123
  20. package/esm2022/lib/ava-tree/tree/components/ava-tree/ava-tree.component.mjs +0 -449
  21. package/esm2022/lib/ava-tree/tree/components/list-structure/list-structure.component.mjs +0 -41
  22. package/esm2022/lib/ava-tree/tree/components/table-structure/table-structure.component.mjs +0 -110
  23. package/esm2022/lib/ava-tree/tree/components/tree-item/tree-item.component.mjs +0 -102
  24. package/esm2022/lib/ava-tree/tree/components/tree-node/tree-node.component.mjs +0 -53
  25. package/esm2022/lib/ava-tree/tree/components/tree-structure/tree-structure.component.mjs +0 -33
  26. package/esm2022/lib/ava-tree/tree/constants/defaultFilters.mjs +0 -23
  27. package/esm2022/lib/ava-tree/tree/constants/defaultTextWordInvoice.mjs +0 -77
  28. package/esm2022/lib/ava-tree/tree/constants/defaultTextWords.mjs +0 -29
  29. package/esm2022/lib/ava-tree/tree/constants/defaults.mjs +0 -4
  30. package/esm2022/lib/ava-tree/tree/constants/index.mjs +0 -6
  31. package/esm2022/lib/ava-tree/tree/directives/save-changing-view.directive.mjs +0 -47
  32. package/esm2022/lib/ava-tree/tree/model/ava-models.mjs +0 -206
  33. package/esm2022/lib/ava-tree/tree/model/context-menu-data.model.mjs +0 -2
  34. package/esm2022/lib/ava-tree/tree/model/function-view-line.model.mjs +0 -2
  35. package/esm2022/lib/ava-tree/tree/model/index.mjs +0 -5
  36. package/esm2022/lib/ava-tree/tree/model/invoice-models.mjs +0 -45
  37. package/esm2022/lib/ava-tree/tree/model/invoice-words.model.mjs +0 -2
  38. package/esm2022/lib/ava-tree/tree/model/selecting.model.mjs +0 -2
  39. package/esm2022/lib/ava-tree/tree/model/tableColumnType.mjs +0 -2
  40. package/esm2022/lib/ava-tree/tree/model/tree-mode.model.mjs +0 -7
  41. package/esm2022/lib/ava-tree/tree/pipes/element-icon-name.pipe.mjs +0 -27
  42. package/esm2022/lib/ava-tree/tree/pipes/element-item-number.pipe.mjs +0 -23
  43. package/esm2022/lib/ava-tree/tree/pipes/element-text.pipe.mjs +0 -39
  44. package/esm2022/lib/ava-tree/tree/pipes/group-child-elements.pipe.mjs +0 -20
  45. package/esm2022/lib/ava-tree/tree/pipes/invoice-attachment-mime-type.pipe.mjs +0 -34
  46. package/esm2022/lib/ava-tree/tree/services/expand-parent-group.service.mjs +0 -32
  47. package/esm2022/lib/ava-tree/tree/services/flat-elements.service.mjs +0 -96
  48. package/esm2022/lib/ava-tree/tree/services/keyboard-operation.service.mjs +0 -116
  49. package/esm2022/lib/ava-tree/tree/services/select-element.service.mjs +0 -41
  50. package/esm2022/lib/ava-tree/tree/services/tree-node-selection.service.mjs +0 -133
  51. package/esm2022/lib/ava-tree/tree/services/tree-words.service.mjs +0 -21
  52. package/esm2022/lib/version.mjs +0 -10
  53. package/esm2022/public-api.mjs +0 -10
  54. package/lib/angular-ava.module.d.ts +0 -27
@@ -179,5 +179,5 @@ export declare class AvaTreeComponent implements OnInit, OnChanges, OnDestroy, A
179
179
  private getFilteredList;
180
180
  private initializeEventListeners;
181
181
  static ɵfac: i0.ɵɵFactoryDeclaration<AvaTreeComponent, [{ self: true; }, { self: true; }, { self: true; }, { self: true; }, { self: true; }, null, null]>;
182
- static ɵcmp: i0.ɵɵComponentDeclaration<AvaTreeComponent, "ava-tree", never, { "project": { "alias": "project"; "required": false; }; "expansionState": { "alias": "expansionState"; "required": false; }; "selectedNodeId": { "alias": "selectedNodeId"; "required": false; }; "indent": { "alias": "indent"; "required": false; }; "selectedColor": { "alias": "selectedColor"; "required": false; }; "modeView": { "alias": "modeView"; "required": false; }; "allowDblClick": { "alias": "allowDblClick"; "required": false; }; "isSelectionMode": { "alias": "isSelectionMode"; "required": false; }; "initiallySelectedElements": { "alias": "initiallySelectedElements"; "required": false; }; "textWords": { "alias": "textWords"; "required": false; }; "mouseAwareKeyboardControl": { "alias": "mouseAwareKeyboardControl"; "required": false; }; "customKeyboardOperationConfig": { "alias": "customKeyboardOperationConfig"; "required": false; }; "listFilterFunc": { "alias": "listFilterFunc"; "required": false; }; "addTableColumns": { "alias": "addTableColumns"; "required": false; }; "functionView": { "alias": "functionView"; "required": false; }; }, { "selectClick": "selectClick"; "selectDblClick": "selectDblClick"; "contextMenuEvent": "contextMenuEvent"; "selectedElementsChanged": "selectedElementsChanged"; }, never, never, false, never>;
182
+ static ɵcmp: i0.ɵɵComponentDeclaration<AvaTreeComponent, "ava-tree", never, { "project": { "alias": "project"; "required": false; }; "expansionState": { "alias": "expansionState"; "required": false; }; "selectedNodeId": { "alias": "selectedNodeId"; "required": false; }; "indent": { "alias": "indent"; "required": false; }; "selectedColor": { "alias": "selectedColor"; "required": false; }; "modeView": { "alias": "modeView"; "required": false; }; "allowDblClick": { "alias": "allowDblClick"; "required": false; }; "isSelectionMode": { "alias": "isSelectionMode"; "required": false; }; "initiallySelectedElements": { "alias": "initiallySelectedElements"; "required": false; }; "textWords": { "alias": "textWords"; "required": false; }; "mouseAwareKeyboardControl": { "alias": "mouseAwareKeyboardControl"; "required": false; }; "customKeyboardOperationConfig": { "alias": "customKeyboardOperationConfig"; "required": false; }; "listFilterFunc": { "alias": "listFilterFunc"; "required": false; }; "addTableColumns": { "alias": "addTableColumns"; "required": false; }; "functionView": { "alias": "functionView"; "required": false; }; }, { "selectClick": "selectClick"; "selectDblClick": "selectDblClick"; "contextMenuEvent": "contextMenuEvent"; "selectedElementsChanged": "selectedElementsChanged"; }, never, never, true, never>;
183
183
  }
@@ -14,5 +14,5 @@ export declare class ListStructureComponent implements OnDestroy, OnInit {
14
14
  ngOnInit(): void;
15
15
  ngOnDestroy(): void;
16
16
  static ɵfac: i0.ɵɵFactoryDeclaration<ListStructureComponent, never>;
17
- static ɵcmp: i0.ɵɵComponentDeclaration<ListStructureComponent, "ava-list-structure", never, { "filteredElementList": { "alias": "filteredElementList"; "required": false; }; "isSelectionMode": { "alias": "isSelectionMode"; "required": false; }; "selectedColor": { "alias": "selectedColor"; "required": false; }; "allowDblClick": { "alias": "allowDblClick"; "required": false; }; }, {}, never, never, false, never>;
17
+ static ɵcmp: i0.ɵɵComponentDeclaration<ListStructureComponent, "ava-list-structure", never, { "filteredElementList": { "alias": "filteredElementList"; "required": false; }; "isSelectionMode": { "alias": "isSelectionMode"; "required": false; }; "selectedColor": { "alias": "selectedColor"; "required": false; }; "allowDblClick": { "alias": "allowDblClick"; "required": false; }; }, {}, never, never, true, never>;
18
18
  }
@@ -30,5 +30,5 @@ export declare class TableStructureComponent implements OnInit, OnDestroy {
30
30
  openContextMenu(event: MouseEvent, row: IElementDto): void;
31
31
  changeSelecting(element: IElementDto, event: boolean): void;
32
32
  static ɵfac: i0.ɵɵFactoryDeclaration<TableStructureComponent, never>;
33
- static ɵcmp: i0.ɵɵComponentDeclaration<TableStructureComponent, "ava-table-structure", never, { "filteredElementList": { "alias": "filteredElementList"; "required": false; }; "isSelectionMode": { "alias": "isSelectionMode"; "required": false; }; "addTableColumns": { "alias": "addTableColumns"; "required": false; }; "selectedColor": { "alias": "selectedColor"; "required": false; }; "allowDblClick": { "alias": "allowDblClick"; "required": false; }; }, {}, never, never, false, never>;
33
+ static ɵcmp: i0.ɵɵComponentDeclaration<TableStructureComponent, "ava-table-structure", never, { "filteredElementList": { "alias": "filteredElementList"; "required": false; }; "isSelectionMode": { "alias": "isSelectionMode"; "required": false; }; "addTableColumns": { "alias": "addTableColumns"; "required": false; }; "selectedColor": { "alias": "selectedColor"; "required": false; }; "allowDblClick": { "alias": "allowDblClick"; "required": false; }; }, {}, never, never, true, never>;
34
34
  }
@@ -31,5 +31,5 @@ export declare class TreeItemComponent implements OnInit, OnDestroy {
31
31
  openContextMenu(event: MouseEvent): void;
32
32
  changeSelecting(element: IElementDto, isSelected: boolean): void;
33
33
  static ɵfac: i0.ɵɵFactoryDeclaration<TreeItemComponent, never>;
34
- static ɵcmp: i0.ɵɵComponentDeclaration<TreeItemComponent, "ava-tree-item", never, { "element": { "alias": "element"; "required": false; }; "expansionState": { "alias": "expansionState"; "required": false; }; "isSelectionMode": { "alias": "isSelectionMode"; "required": false; }; "allowDblClick": { "alias": "allowDblClick"; "required": false; }; }, {}, never, never, false, never>;
34
+ static ɵcmp: i0.ɵɵComponentDeclaration<TreeItemComponent, "ava-tree-item", never, { "element": { "alias": "element"; "required": false; }; "expansionState": { "alias": "expansionState"; "required": false; }; "isSelectionMode": { "alias": "isSelectionMode"; "required": false; }; "allowDblClick": { "alias": "allowDblClick"; "required": false; }; }, {}, never, never, true, never>;
35
35
  }
@@ -19,5 +19,5 @@ export declare class TreeNodeComponent implements OnDestroy, OnInit {
19
19
  ngOnDestroy(): void;
20
20
  expand(element: IElementDto): void;
21
21
  static ɵfac: i0.ɵɵFactoryDeclaration<TreeNodeComponent, never>;
22
- static ɵcmp: i0.ɵɵComponentDeclaration<TreeNodeComponent, "ava-tree-node", never, { "elementList": { "alias": "elementList"; "required": false; }; "indent": { "alias": "indent"; "required": false; }; "expansionState": { "alias": "expansionState"; "required": false; }; "isSelectionMode": { "alias": "isSelectionMode"; "required": false; }; "selectedColor": { "alias": "selectedColor"; "required": false; }; "allowDblClick": { "alias": "allowDblClick"; "required": false; }; }, {}, never, never, false, never>;
22
+ static ɵcmp: i0.ɵɵComponentDeclaration<TreeNodeComponent, "ava-tree-node", never, { "elementList": { "alias": "elementList"; "required": false; }; "indent": { "alias": "indent"; "required": false; }; "expansionState": { "alias": "expansionState"; "required": false; }; "isSelectionMode": { "alias": "isSelectionMode"; "required": false; }; "selectedColor": { "alias": "selectedColor"; "required": false; }; "allowDblClick": { "alias": "allowDblClick"; "required": false; }; }, {}, never, never, true, never>;
23
23
  }
@@ -10,5 +10,5 @@ export declare class TreeStructureComponent {
10
10
  selectedColor: string | null;
11
11
  allowDblClick: boolean;
12
12
  static ɵfac: i0.ɵɵFactoryDeclaration<TreeStructureComponent, never>;
13
- static ɵcmp: i0.ɵɵComponentDeclaration<TreeStructureComponent, "ava-tree-structure", never, { "serviceSpecification": { "alias": "serviceSpecification"; "required": false; }; "indent": { "alias": "indent"; "required": false; }; "expansionState": { "alias": "expansionState"; "required": false; }; "isSelectionMode": { "alias": "isSelectionMode"; "required": false; }; "selectedColor": { "alias": "selectedColor"; "required": false; }; "allowDblClick": { "alias": "allowDblClick"; "required": false; }; }, {}, never, never, false, never>;
13
+ static ɵcmp: i0.ɵɵComponentDeclaration<TreeStructureComponent, "ava-tree-structure", never, { "serviceSpecification": { "alias": "serviceSpecification"; "required": false; }; "indent": { "alias": "indent"; "required": false; }; "expansionState": { "alias": "expansionState"; "required": false; }; "isSelectionMode": { "alias": "isSelectionMode"; "required": false; }; "selectedColor": { "alias": "selectedColor"; "required": false; }; "allowDblClick": { "alias": "allowDblClick"; "required": false; }; }, {}, never, never, true, never>;
14
14
  }
@@ -9,5 +9,5 @@ export declare class SaveChangingViewDirective implements AfterViewInit {
9
9
  constructor(el: ElementRef, renderer: Renderer2, flatElementsService: FlatElementsService);
10
10
  ngAfterViewInit(): void;
11
11
  static ɵfac: i0.ɵɵFactoryDeclaration<SaveChangingViewDirective, never>;
12
- static ɵdir: i0.ɵɵDirectiveDeclaration<SaveChangingViewDirective, "[saveChangingView]", never, { "attributeValue": { "alias": "attributeValue"; "required": false; }; }, {}, never, never, false, never>;
12
+ static ɵdir: i0.ɵɵDirectiveDeclaration<SaveChangingViewDirective, "[saveChangingView]", never, { "attributeValue": { "alias": "attributeValue"; "required": false; }; }, {}, never, never, true, never>;
13
13
  }
@@ -4,5 +4,5 @@ import * as i0 from "@angular/core";
4
4
  export declare class ElementIconNamePipe implements PipeTransform {
5
5
  transform(element: IElementDto): string;
6
6
  static ɵfac: i0.ɵɵFactoryDeclaration<ElementIconNamePipe, never>;
7
- static ɵpipe: i0.ɵɵPipeDeclaration<ElementIconNamePipe, "elementIconName", false>;
7
+ static ɵpipe: i0.ɵɵPipeDeclaration<ElementIconNamePipe, "elementIconName", true>;
8
8
  }
@@ -4,5 +4,5 @@ import * as i0 from "@angular/core";
4
4
  export declare class ElementItemNumberPipe implements PipeTransform {
5
5
  transform(element: IElementDto): string;
6
6
  static ɵfac: i0.ɵɵFactoryDeclaration<ElementItemNumberPipe, never>;
7
- static ɵpipe: i0.ɵɵPipeDeclaration<ElementItemNumberPipe, "elementItemNumber", false>;
7
+ static ɵpipe: i0.ɵɵPipeDeclaration<ElementItemNumberPipe, "elementItemNumber", true>;
8
8
  }
@@ -11,5 +11,5 @@ export declare class ElementTextPipe implements PipeTransform, OnDestroy {
11
11
  ngOnDestroy(): void;
12
12
  transform(element: IElementDto): string;
13
13
  static ɵfac: i0.ɵɵFactoryDeclaration<ElementTextPipe, never>;
14
- static ɵpipe: i0.ɵɵPipeDeclaration<ElementTextPipe, "elementText", false>;
14
+ static ɵpipe: i0.ɵɵPipeDeclaration<ElementTextPipe, "elementText", true>;
15
15
  }
@@ -4,5 +4,5 @@ import * as i0 from "@angular/core";
4
4
  export declare class GroupChildElementsPipe implements PipeTransform {
5
5
  transform(element: IElementDto): IElementDto[] | null;
6
6
  static ɵfac: i0.ɵɵFactoryDeclaration<GroupChildElementsPipe, never>;
7
- static ɵpipe: i0.ɵɵPipeDeclaration<GroupChildElementsPipe, "groupChildElements", false>;
7
+ static ɵpipe: i0.ɵɵPipeDeclaration<GroupChildElementsPipe, "groupChildElements", true>;
8
8
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dangl/angular-ava",
3
- "version": "1.1.2-beta0049",
3
+ "version": "1.1.2-beta0055",
4
4
  "keywords": [
5
5
  "angular",
6
6
  "ava",
@@ -31,8 +31,6 @@
31
31
  },
32
32
  ".": {
33
33
  "types": "./index.d.ts",
34
- "esm2022": "./esm2022/dangl-angular-ava.mjs",
35
- "esm": "./esm2022/dangl-angular-ava.mjs",
36
34
  "default": "./fesm2022/dangl-angular-ava.mjs"
37
35
  }
38
36
  }
package/public-api.d.ts CHANGED
@@ -1,6 +1,5 @@
1
1
  export * from './lib/ava-tree/tree/model';
2
- export * from './lib/angular-ava.module';
3
2
  export * from './lib/version';
4
- export * from './lib/ava-tree/tree/components/ava-tree/ava-tree.component';
3
+ export { AvaTreeComponent } from './lib/ava-tree/tree/components/ava-tree/ava-tree.component';
5
4
  export * from './lib/ava-tree/tree/constants';
6
5
  export { InvoiceDisplayComponent } from './lib/ava-tree/invoice/invoice-display/invoice-display.component';
@@ -1,5 +0,0 @@
1
- /**
2
- * Generated bundle index. Do not edit.
3
- */
4
- export * from './public-api';
5
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGFuZ2wtYW5ndWxhci1hdmEuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9wcm9qZWN0cy9hbmd1bGFyLWF2YS9zcmMvZGFuZ2wtYW5ndWxhci1hdmEudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0dBRUc7QUFFSCxjQUFjLGNBQWMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogR2VuZXJhdGVkIGJ1bmRsZSBpbmRleC4gRG8gbm90IGVkaXQuXG4gKi9cblxuZXhwb3J0ICogZnJvbSAnLi9wdWJsaWMtYXBpJztcbiJdfQ==
@@ -1,91 +0,0 @@
1
- import { CommonModule } from '@angular/common';
2
- import { NgModule } from '@angular/core';
3
- import { FormsModule, ReactiveFormsModule } from '@angular/forms';
4
- import { MatButtonModule } from '@angular/material/button';
5
- import { MatCheckboxModule } from '@angular/material/checkbox';
6
- import { MatRippleModule } from '@angular/material/core';
7
- import { MatFormFieldModule } from '@angular/material/form-field';
8
- import { MatIconModule } from '@angular/material/icon';
9
- import { MatInputModule } from '@angular/material/input';
10
- import { MatTableModule } from '@angular/material/table';
11
- import { MatTooltipModule } from '@angular/material/tooltip';
12
- import { AvaTreeComponent } from './ava-tree/tree/components/ava-tree/ava-tree.component';
13
- import { ListStructureComponent } from './ava-tree/tree/components/list-structure/list-structure.component';
14
- import { TableStructureComponent } from './ava-tree/tree/components/table-structure/table-structure.component';
15
- import { TreeItemComponent } from './ava-tree/tree/components/tree-item/tree-item.component';
16
- import { TreeNodeComponent } from './ava-tree/tree/components/tree-node/tree-node.component';
17
- import { TreeStructureComponent } from './ava-tree/tree/components/tree-structure/tree-structure.component';
18
- import { SaveChangingViewDirective } from './ava-tree/tree/directives/save-changing-view.directive';
19
- import { ElementIconNamePipe } from './ava-tree/tree/pipes/element-icon-name.pipe';
20
- import { ElementItemNumberPipe } from './ava-tree/tree/pipes/element-item-number.pipe';
21
- import { ElementTextPipe } from './ava-tree/tree/pipes/element-text.pipe';
22
- import { GroupChildElementsPipe } from './ava-tree/tree/pipes/group-child-elements.pipe';
23
- import * as i0 from "@angular/core";
24
- export class AngularAvaModule {
25
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.1.0", ngImport: i0, type: AngularAvaModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
26
- static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "18.1.0", ngImport: i0, type: AngularAvaModule, declarations: [TreeStructureComponent,
27
- TreeNodeComponent,
28
- AvaTreeComponent,
29
- TreeItemComponent,
30
- ListStructureComponent,
31
- TableStructureComponent,
32
- ElementIconNamePipe,
33
- ElementTextPipe,
34
- GroupChildElementsPipe,
35
- ElementItemNumberPipe,
36
- SaveChangingViewDirective], imports: [CommonModule,
37
- MatIconModule,
38
- MatRippleModule,
39
- MatInputModule,
40
- MatFormFieldModule,
41
- ReactiveFormsModule,
42
- FormsModule,
43
- MatButtonModule,
44
- MatCheckboxModule,
45
- MatTableModule,
46
- MatTooltipModule], exports: [AvaTreeComponent] }); }
47
- static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "18.1.0", ngImport: i0, type: AngularAvaModule, imports: [CommonModule,
48
- MatIconModule,
49
- MatRippleModule,
50
- MatInputModule,
51
- MatFormFieldModule,
52
- ReactiveFormsModule,
53
- FormsModule,
54
- MatButtonModule,
55
- MatCheckboxModule,
56
- MatTableModule,
57
- MatTooltipModule] }); }
58
- }
59
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.0", ngImport: i0, type: AngularAvaModule, decorators: [{
60
- type: NgModule,
61
- args: [{
62
- declarations: [
63
- TreeStructureComponent,
64
- TreeNodeComponent,
65
- AvaTreeComponent,
66
- TreeItemComponent,
67
- ListStructureComponent,
68
- TableStructureComponent,
69
- ElementIconNamePipe,
70
- ElementTextPipe,
71
- GroupChildElementsPipe,
72
- ElementItemNumberPipe,
73
- SaveChangingViewDirective
74
- ],
75
- imports: [
76
- CommonModule,
77
- MatIconModule,
78
- MatRippleModule,
79
- MatInputModule,
80
- MatFormFieldModule,
81
- ReactiveFormsModule,
82
- FormsModule,
83
- MatButtonModule,
84
- MatCheckboxModule,
85
- MatTableModule,
86
- MatTooltipModule
87
- ],
88
- exports: [AvaTreeComponent]
89
- }]
90
- }] });
91
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW5ndWxhci1hdmEubW9kdWxlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvYW5ndWxhci1hdmEvc3JjL2xpYi9hbmd1bGFyLWF2YS5tb2R1bGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDekMsT0FBTyxFQUFFLFdBQVcsRUFBRSxtQkFBbUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ2xFLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUMzRCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUMvRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDekQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDbEUsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUN6RCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDekQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFFN0QsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sd0RBQXdELENBQUM7QUFDMUYsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sb0VBQW9FLENBQUM7QUFDNUcsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sc0VBQXNFLENBQUM7QUFDL0csT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sMERBQTBELENBQUM7QUFDN0YsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sMERBQTBELENBQUM7QUFDN0YsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sb0VBQW9FLENBQUM7QUFDNUcsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0seURBQXlELENBQUM7QUFDcEcsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sOENBQThDLENBQUM7QUFDbkYsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sZ0RBQWdELENBQUM7QUFDdkYsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHlDQUF5QyxDQUFDO0FBQzFFLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLGlEQUFpRCxDQUFDOztBQStCekYsTUFBTSxPQUFPLGdCQUFnQjs4R0FBaEIsZ0JBQWdCOytHQUFoQixnQkFBZ0IsaUJBM0J6QixzQkFBc0I7WUFDdEIsaUJBQWlCO1lBQ2pCLGdCQUFnQjtZQUNoQixpQkFBaUI7WUFDakIsc0JBQXNCO1lBQ3RCLHVCQUF1QjtZQUN2QixtQkFBbUI7WUFDbkIsZUFBZTtZQUNmLHNCQUFzQjtZQUN0QixxQkFBcUI7WUFDckIseUJBQXlCLGFBR3pCLFlBQVk7WUFDWixhQUFhO1lBQ2IsZUFBZTtZQUNmLGNBQWM7WUFDZCxrQkFBa0I7WUFDbEIsbUJBQW1CO1lBQ25CLFdBQVc7WUFDWCxlQUFlO1lBQ2YsaUJBQWlCO1lBQ2pCLGNBQWM7WUFDZCxnQkFBZ0IsYUFFUixnQkFBZ0I7K0dBRWYsZ0JBQWdCLFlBZHpCLFlBQVk7WUFDWixhQUFhO1lBQ2IsZUFBZTtZQUNmLGNBQWM7WUFDZCxrQkFBa0I7WUFDbEIsbUJBQW1CO1lBQ25CLFdBQVc7WUFDWCxlQUFlO1lBQ2YsaUJBQWlCO1lBQ2pCLGNBQWM7WUFDZCxnQkFBZ0I7OzJGQUlQLGdCQUFnQjtrQkE3QjVCLFFBQVE7bUJBQUM7b0JBQ1IsWUFBWSxFQUFFO3dCQUNaLHNCQUFzQjt3QkFDdEIsaUJBQWlCO3dCQUNqQixnQkFBZ0I7d0JBQ2hCLGlCQUFpQjt3QkFDakIsc0JBQXNCO3dCQUN0Qix1QkFBdUI7d0JBQ3ZCLG1CQUFtQjt3QkFDbkIsZUFBZTt3QkFDZixzQkFBc0I7d0JBQ3RCLHFCQUFxQjt3QkFDckIseUJBQXlCO3FCQUMxQjtvQkFDRCxPQUFPLEVBQUU7d0JBQ1AsWUFBWTt3QkFDWixhQUFhO3dCQUNiLGVBQWU7d0JBQ2YsY0FBYzt3QkFDZCxrQkFBa0I7d0JBQ2xCLG1CQUFtQjt3QkFDbkIsV0FBVzt3QkFDWCxlQUFlO3dCQUNmLGlCQUFpQjt3QkFDakIsY0FBYzt3QkFDZCxnQkFBZ0I7cUJBQ2pCO29CQUNELE9BQU8sRUFBRSxDQUFDLGdCQUFnQixDQUFDO2lCQUM1QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBOZ01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRm9ybXNNb2R1bGUsIFJlYWN0aXZlRm9ybXNNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBNYXRCdXR0b25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9idXR0b24nO1xuaW1wb3J0IHsgTWF0Q2hlY2tib3hNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9jaGVja2JveCc7XG5pbXBvcnQgeyBNYXRSaXBwbGVNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9jb3JlJztcbmltcG9ydCB7IE1hdEZvcm1GaWVsZE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2Zvcm0tZmllbGQnO1xuaW1wb3J0IHsgTWF0SWNvbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2ljb24nO1xuaW1wb3J0IHsgTWF0SW5wdXRNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9pbnB1dCc7XG5pbXBvcnQgeyBNYXRUYWJsZU1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3RhYmxlJztcbmltcG9ydCB7IE1hdFRvb2x0aXBNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC90b29sdGlwJztcblxuaW1wb3J0IHsgQXZhVHJlZUNvbXBvbmVudCB9IGZyb20gJy4vYXZhLXRyZWUvdHJlZS9jb21wb25lbnRzL2F2YS10cmVlL2F2YS10cmVlLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBMaXN0U3RydWN0dXJlQ29tcG9uZW50IH0gZnJvbSAnLi9hdmEtdHJlZS90cmVlL2NvbXBvbmVudHMvbGlzdC1zdHJ1Y3R1cmUvbGlzdC1zdHJ1Y3R1cmUuY29tcG9uZW50JztcbmltcG9ydCB7IFRhYmxlU3RydWN0dXJlQ29tcG9uZW50IH0gZnJvbSAnLi9hdmEtdHJlZS90cmVlL2NvbXBvbmVudHMvdGFibGUtc3RydWN0dXJlL3RhYmxlLXN0cnVjdHVyZS5jb21wb25lbnQnO1xuaW1wb3J0IHsgVHJlZUl0ZW1Db21wb25lbnQgfSBmcm9tICcuL2F2YS10cmVlL3RyZWUvY29tcG9uZW50cy90cmVlLWl0ZW0vdHJlZS1pdGVtLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBUcmVlTm9kZUNvbXBvbmVudCB9IGZyb20gJy4vYXZhLXRyZWUvdHJlZS9jb21wb25lbnRzL3RyZWUtbm9kZS90cmVlLW5vZGUuY29tcG9uZW50JztcbmltcG9ydCB7IFRyZWVTdHJ1Y3R1cmVDb21wb25lbnQgfSBmcm9tICcuL2F2YS10cmVlL3RyZWUvY29tcG9uZW50cy90cmVlLXN0cnVjdHVyZS90cmVlLXN0cnVjdHVyZS5jb21wb25lbnQnO1xuaW1wb3J0IHsgU2F2ZUNoYW5naW5nVmlld0RpcmVjdGl2ZSB9IGZyb20gJy4vYXZhLXRyZWUvdHJlZS9kaXJlY3RpdmVzL3NhdmUtY2hhbmdpbmctdmlldy5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgRWxlbWVudEljb25OYW1lUGlwZSB9IGZyb20gJy4vYXZhLXRyZWUvdHJlZS9waXBlcy9lbGVtZW50LWljb24tbmFtZS5waXBlJztcbmltcG9ydCB7IEVsZW1lbnRJdGVtTnVtYmVyUGlwZSB9IGZyb20gJy4vYXZhLXRyZWUvdHJlZS9waXBlcy9lbGVtZW50LWl0ZW0tbnVtYmVyLnBpcGUnO1xuaW1wb3J0IHsgRWxlbWVudFRleHRQaXBlIH0gZnJvbSAnLi9hdmEtdHJlZS90cmVlL3BpcGVzL2VsZW1lbnQtdGV4dC5waXBlJztcbmltcG9ydCB7IEdyb3VwQ2hpbGRFbGVtZW50c1BpcGUgfSBmcm9tICcuL2F2YS10cmVlL3RyZWUvcGlwZXMvZ3JvdXAtY2hpbGQtZWxlbWVudHMucGlwZSc7XG5cbkBOZ01vZHVsZSh7XG4gIGRlY2xhcmF0aW9uczogW1xuICAgIFRyZWVTdHJ1Y3R1cmVDb21wb25lbnQsXG4gICAgVHJlZU5vZGVDb21wb25lbnQsXG4gICAgQXZhVHJlZUNvbXBvbmVudCxcbiAgICBUcmVlSXRlbUNvbXBvbmVudCxcbiAgICBMaXN0U3RydWN0dXJlQ29tcG9uZW50LFxuICAgIFRhYmxlU3RydWN0dXJlQ29tcG9uZW50LFxuICAgIEVsZW1lbnRJY29uTmFtZVBpcGUsXG4gICAgRWxlbWVudFRleHRQaXBlLFxuICAgIEdyb3VwQ2hpbGRFbGVtZW50c1BpcGUsXG4gICAgRWxlbWVudEl0ZW1OdW1iZXJQaXBlLFxuICAgIFNhdmVDaGFuZ2luZ1ZpZXdEaXJlY3RpdmVcbiAgXSxcbiAgaW1wb3J0czogW1xuICAgIENvbW1vbk1vZHVsZSxcbiAgICBNYXRJY29uTW9kdWxlLFxuICAgIE1hdFJpcHBsZU1vZHVsZSxcbiAgICBNYXRJbnB1dE1vZHVsZSxcbiAgICBNYXRGb3JtRmllbGRNb2R1bGUsXG4gICAgUmVhY3RpdmVGb3Jtc01vZHVsZSxcbiAgICBGb3Jtc01vZHVsZSxcbiAgICBNYXRCdXR0b25Nb2R1bGUsXG4gICAgTWF0Q2hlY2tib3hNb2R1bGUsXG4gICAgTWF0VGFibGVNb2R1bGUsXG4gICAgTWF0VG9vbHRpcE1vZHVsZVxuICBdLFxuICBleHBvcnRzOiBbQXZhVHJlZUNvbXBvbmVudF1cbn0pXG5leHBvcnQgY2xhc3MgQW5ndWxhckF2YU1vZHVsZSB7fVxuIl19
@@ -1,123 +0,0 @@
1
- import { CurrencyPipe, DatePipe } from '@angular/common';
2
- import { ChangeDetectionStrategy, Component, Input, input } from '@angular/core';
3
- import { MatButtonModule } from '@angular/material/button';
4
- import { MatExpansionModule } from '@angular/material/expansion';
5
- import { DEFAULT_TEXT_WORD_INVOICE } from '../../tree/constants/defaultTextWordInvoice';
6
- import { InvoiceAttachmentMimeTypePipe } from '../../tree/pipes/invoice-attachment-mime-type.pipe';
7
- import * as i0 from "@angular/core";
8
- import * as i1 from "@angular/material/button";
9
- import * as i2 from "@angular/material/expansion";
10
- export class InvoiceDisplayComponent {
11
- /**
12
- * You can supply a map of strings to be used for the text in the tree. This allows you to translate
13
- * the text in the tree to other languages.
14
- * {
15
- * invoiceTitle?: string;
16
- * vatId?: string;
17
- * detailsInvoiceNumber?: string;
18
- * detailsInvoiceDate?: string;
19
- * detailsPaymentDueDate?: string;
20
- * detailsCurrencyCode?: string;
21
- * detailsPaymentTerms?: string;
22
- * referencesTopic?: string;
23
- * referencesBuyerReference?: string;
24
- * referencesProjectReference?: string;
25
- * referencesContractReference?: string;
26
- * referencesPurchaseOrderReference?: string;
27
- * referencesSalesOrderReference?: string;
28
- * referencesReceivingAdviceReference?: string;
29
- * referencesDispatchAdviceReference?: string;
30
- * referencesTenderOrLotReference?: string;
31
- * referencesInvoicedObjectIdentifier?: string;
32
- * tableHeadDescription?: string;
33
- * tableHeadQuantity?: string;
34
- * tableHeadUnit?: string;
35
- * tableHeadNetPrice?: string;
36
- * tableHeadNetAmount?: string;
37
- * totalsTopic?: string;
38
- * totalsTotalNet?: string;
39
- * totalsTotalAllowances?: string;
40
- * totalsTotalCharges?: string;
41
- * totalsTotalAfterDeductions?: string;
42
- * totalsTotalVatAmount?: string;
43
- * totalsTotalGross?: string;
44
- * totalsAlreadyPaidTotal?: string;
45
- * totalsTotalToBePaid?: string;
46
- * instructionsTopic?: string;
47
- * instructionsAccountIdentifier?: string;
48
- * instructionsAccountName?: string;
49
- * instructionsServiceProviderIdentifier?: string;
50
- * notesTopic?: string;
51
- * }
52
- */
53
- set textWords(words) {
54
- this._textWords = { ...this.textWords, ...words };
55
- } // allow to translate all texts to other language
56
- get textWords() {
57
- return this._textWords;
58
- }
59
- constructor() {
60
- // TODO remove type any after TODO under will be resolved
61
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
62
- this.invoice = input.required();
63
- this._textWords = null;
64
- this._textWords = { ...DEFAULT_TEXT_WORD_INVOICE };
65
- /**TODO: For setting invoice instead:
66
- * <ava-invoice-display id="invoice"></ava-invoice-display>
67
- * invoice = document.getElementById('invoice');
68
- * invoice.invoice = INVOICE;
69
- * we should pass value to global window variable
70
- * window['IvoiceGlobalVariable'] = INVOICE;
71
- * Temporary solution until the problem of setting the value for InputSignal is solved. See this PR https://github.com/angular/angular/pull/55067
72
- */
73
- this.invoice = () => {
74
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
75
- return window['IvoiceGlobalVariable'];
76
- };
77
- }
78
- download(documentValue) {
79
- if (documentValue.externalDocumentUrl) {
80
- this.downloadLink(documentValue);
81
- }
82
- else {
83
- this.downloadAny(documentValue);
84
- }
85
- }
86
- downloadAny(documentValue) {
87
- if (documentValue.documentBase64) {
88
- const byteCharacters = atob(documentValue.documentBase64);
89
- const byteNumbers = new Array(byteCharacters.length);
90
- for (let i = 0; i < byteCharacters.length; i++) {
91
- byteNumbers[i] = byteCharacters.charCodeAt(i);
92
- }
93
- const byteArray = new Uint8Array(byteNumbers);
94
- const blob = new Blob([byteArray], { type: 'application/octet-stream' });
95
- this.saveAs(blob, documentValue.fileName);
96
- }
97
- }
98
- async downloadLink(documentValue) {
99
- try {
100
- const response = await fetch(documentValue.externalDocumentUrl);
101
- const blob = await response.blob();
102
- this.saveAs(blob, documentValue.fileName);
103
- }
104
- catch (error) {
105
- console.error(error);
106
- }
107
- }
108
- saveAs(blob, fileName) {
109
- const link = document.createElement('a');
110
- link.href = URL.createObjectURL(blob);
111
- link.download = fileName;
112
- link.click();
113
- }
114
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.1.0", ngImport: i0, type: InvoiceDisplayComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
115
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.1.0", type: InvoiceDisplayComponent, isStandalone: true, selector: "ava-invoice-display", inputs: { invoice: { classPropertyName: "invoice", publicName: "invoice", isSignal: true, isRequired: true, transformFunction: null }, textWords: { classPropertyName: "textWords", publicName: "textWords", isSignal: false, isRequired: false, transformFunction: null } }, ngImport: i0, template: "<div class=\"invoice-container\">\n <!-- Seller and Buyer Information -->\n @if (textWords?.invoiceTitle) {\n <h1 class=\"invoice-title\">{{ textWords?.invoiceTitle }}</h1>\n }\n <header class=\"invoice-header\">\n <div class=\"seller-info\">\n <p>\n <strong>{{ invoice().seller?.name }}</strong>\n </p>\n <p>{{ invoice().seller?.address }}</p>\n <p>{{ invoice().seller?.city }}, {{ invoice().seller?.zipCode }}</p>\n <p>{{ invoice().seller?.countryCode }}</p>\n @if (invoice().seller?.vatId) {\n <p>\n <strong>{{ textWords?.vatId }}:</strong>\n <span>{{ invoice().seller?.vatId }}</span>\n </p>\n }\n </div>\n <div class=\"invoice-details\">\n @if (invoice().invoiceNumber) {\n <p>\n <strong>{{ textWords?.detailsInvoiceNumber }}:</strong>\n <span>{{ invoice().invoiceNumber }}</span>\n </p>\n }\n @if (invoice().invoiceDate) {\n <p>\n <strong>{{ textWords?.detailsInvoiceDate }}:</strong>\n <span>{{ invoice().invoiceDate | date: 'dd.MM.yyyy' }}</span>\n </p>\n }\n @if (invoice().paymentDueDate) {\n <p>\n <strong>{{ textWords?.detailsPaymentDueDate }}:</strong>\n <span>{{ invoice().paymentDueDate | date: 'dd.MM.yyyy' }}</span>\n </p>\n }\n @if (invoice().currencyCode) {\n <p>\n <strong>{{ textWords?.detailsCurrencyCode }}:</strong>\n <span>{{ invoice().currencyCode }}</span>\n </p>\n }\n @if (invoice().paymentTerms) {\n <p>\n <strong>{{ textWords?.detailsPaymentTerms }}:</strong>\n <span>{{ invoice().paymentTerms }}</span>\n </p>\n }\n </div>\n <div class=\"buyer-info\">\n <p>\n <strong>{{ invoice().buyer?.name }}</strong>\n </p>\n <p>{{ invoice().buyer?.address }}</p>\n <p>{{ invoice().buyer?.city }}, {{ invoice().buyer?.zipCode }}</p>\n <p>{{ invoice().buyer?.countryCode }}</p>\n @if (invoice().buyer?.vatId) {\n <p>\n <strong>{{ textWords?.vatId }}:</strong>\n <span>{{ invoice().buyer?.vatId }}</span>\n </p>\n }\n </div>\n </header>\n\n <section class=\"invoice-references\">\n @if (textWords?.referencesTopic) {\n <h2>{{ textWords?.referencesTopic }}</h2>\n }\n @if (invoice().references?.buyerReference) {\n <p>\n <strong>{{ textWords?.referencesBuyerReference }}:</strong>\n <span>{{ invoice().references?.buyerReference }}</span>\n </p>\n }\n @if (invoice().references?.projectReference) {\n <p>\n <strong>{{ textWords?.referencesProjectReference }}:</strong>\n <span>{{ invoice().references?.projectReference }}</span>\n </p>\n }\n @if (invoice().references?.contractReference) {\n <p>\n <strong>{{ textWords?.referencesContractReference }}:</strong>\n <span>{{ invoice().references?.contractReference }}</span>\n </p>\n }\n @if (invoice().references?.purchaseOrderReference) {\n <p>\n <strong>{{ textWords?.referencesPurchaseOrderReference }}:</strong>\n <span>{{ invoice().references?.purchaseOrderReference }}</span>\n </p>\n }\n @if (invoice().references?.salesOrderReference) {\n <p>\n <strong>{{ textWords?.referencesSalesOrderReference }}:</strong>\n <span>{{ invoice().references?.salesOrderReference }}</span>\n </p>\n }\n @if (invoice().references?.receivingAdviceReference) {\n <p>\n <strong>{{ textWords?.referencesReceivingAdviceReference }}:</strong>\n <span>{{ invoice().references?.receivingAdviceReference }}</span>\n </p>\n }\n @if (invoice().references?.dispatchAdviceReference) {\n <p>\n <strong>{{ textWords?.referencesDispatchAdviceReference }}:</strong>\n <span> {{ invoice().references?.dispatchAdviceReference }}</span>\n </p>\n }\n @if (invoice().references?.tenderOrLotReference) {\n <p>\n <strong>{{ textWords?.referencesTenderOrLotReference }}:</strong>\n <span>{{ invoice().references?.tenderOrLotReference }}</span>\n </p>\n }\n @if (invoice().references?.invoicedObjectIdentifier) {\n <p>\n <strong>{{ textWords?.referencesInvoicedObjectIdentifier }}:</strong>\n <span>{{ invoice().references?.invoicedObjectIdentifier }}</span>\n </p>\n }\n </section>\n\n <table class=\"invoice-table\">\n <thead>\n <tr>\n <th>#</th>\n <th>{{ textWords?.tableHeadDescription }}</th>\n <th>{{ textWords?.tableHeadQuantity }}</th>\n <th>{{ textWords?.tableHeadUnit }}</th>\n <th>{{ textWords?.tableHeadNetPrice }}</th>\n <th>{{ textWords?.tableHeadNetAmount }}</th>\n </tr>\n </thead>\n <tbody>\n @for (item of invoice().lineItems; track item; let i = $index) {\n <tr>\n <td>{{ i + 1 }}</td>\n <td>{{ item.itemInformation?.description }}</td>\n <td>{{ item.quantity }}</td>\n <td>{{ item.unitCode }}</td>\n <td>{{ item.priceDetails?.netPrice | currency: invoice().currencyCode }}</td>\n <td>{{ item.netAmount | currency: invoice().currencyCode }}</td>\n </tr>\n }\n </tbody>\n </table>\n\n <div class=\"addition-info\">\n <section class=\"invoice-totals\">\n @if (textWords?.totalsTopic) {\n <h2>{{ textWords?.totalsTopic }}</h2>\n }\n @if (invoice().totals?.totalNet) {\n <p>\n <strong>{{ textWords?.totalsTotalNet }}:</strong>\n <span>{{ invoice().totals?.totalNet | currency: invoice().currencyCode }}</span>\n </p>\n }\n @if (invoice().totals?.totalAllowances) {\n <p>\n <strong>{{ textWords?.totalsTotalAllowances }}:</strong>\n <span> {{ invoice().totals?.totalAllowances | currency: invoice().currencyCode }}</span>\n </p>\n }\n @if (invoice().totals?.totalCharges) {\n <p>\n <strong>{{ textWords?.totalsTotalCharges }}:</strong>\n <span> {{ invoice().totals?.totalCharges | currency: invoice().currencyCode }}</span>\n </p>\n }\n @if (invoice().totals?.totalAfterDeductions) {\n <p>\n <strong>{{ textWords?.totalsTotalAfterDeductions }}:</strong>\n <span>{{ invoice().totals?.totalAfterDeductions | currency: invoice().currencyCode }}</span>\n </p>\n }\n @if (invoice().totals?.totalVatAmount) {\n <p>\n <strong>{{ textWords?.totalsTotalVatAmount }}:</strong>\n <span>{{ invoice().totals?.totalVatAmount | currency: invoice().currencyCode }}</span>\n </p>\n }\n @if (invoice().totals?.totalGross) {\n <p>\n <strong>{{ textWords?.totalsTotalGross }}:</strong>\n <span> {{ invoice().totals?.totalGross | currency: invoice().currencyCode }}</span>\n </p>\n }\n @if (invoice().totals?.alreadyPaidTotal) {\n <p>\n <strong>{{ textWords?.totalsAlreadyPaidTotal }}:</strong>\n <span>{{ invoice().totals?.alreadyPaidTotal | currency: invoice().currencyCode }}</span>\n </p>\n }\n @if (invoice().totals?.totalToBePaid) {\n <p class=\"total\">\n <strong>{{ textWords?.totalsTotalToBePaid }}:</strong>\n <strong> {{ invoice().totals?.totalToBePaid | currency: invoice().currencyCode }}</strong>\n </p>\n }\n </section>\n\n <section class=\"payment-instructions\">\n @if (textWords?.instructionsTopic) {\n <h2>{{ textWords?.instructionsTopic }}</h2>\n }\n @if (invoice().paymentInstructions?.description) {\n <p>{{ invoice().paymentInstructions?.description }}</p>\n }\n @for (means of invoice().paymentInstructions?.paymentMeans; track means) {\n <div>\n @if (means.accountIdentifier) {\n <p>\n <strong>{{ textWords?.instructionsAccountIdentifier }}:</strong>\n <span>{{ means.accountIdentifier }}</span>\n </p>\n }\n @if (means.accountName) {\n <p>\n <strong>{{ textWords?.instructionsAccountName }}:</strong>\n <span>{{ means.accountName }}</span>\n </p>\n }\n @if (means.serviceProviderIdentifier) {\n <p>\n <strong>{{ textWords?.instructionsServiceProviderIdentifier }}:</strong>\n <span>{{ means.serviceProviderIdentifier }}</span>\n </p>\n }\n </div>\n }\n </section>\n </div>\n\n <section class=\"invoice-notes\">\n @if (textWords?.notesTopic) {\n <h2>{{ textWords?.notesTopic }}</h2>\n }\n @for (note of invoice().invoiceNotes; track note) {\n <div>\n @if (note?.shortText) {\n <p>\n <strong>{{ note?.shortText }}</strong>\n </p>\n }\n @if (note?.longText) {\n <p>{{ note?.longText }}</p>\n }\n </div>\n }\n </section>\n\n @if (invoice().documents?.length) {\n <section class=\"invoice-attachments\">\n <mat-accordion>\n <mat-expansion-panel>\n <mat-expansion-panel-header>\n <mat-panel-title>Attachments</mat-panel-title>\n </mat-expansion-panel-header>\n @for (document of invoice().documents; track document) {\n <div class=\"document\">\n @if (document.documentReference) {\n <div>\n <strong>Name: </strong>\n <span>{{ document.documentReference }}</span>\n </div>\n }\n @if (document.description) {\n <div>\n <strong>Description: </strong>\n <span>{{ document.description }}</span>\n </div>\n }\n @if (document.externalDocumentUrl) {\n <div>\n <strong>Url: </strong>\n <span>{{ document.externalDocumentUrl }}</span>\n </div>\n } @else if (document.documentBase64) {\n <div>\n <strong>Data size: </strong>\n <span>{{ document.documentBase64.length }}</span>\n </div>\n\n @if (document.documentMimeType) {\n <div>\n <strong>Mime Type: </strong>\n <span>{{ document.documentMimeType | invoiceAttachmentMimeType }}</span>\n </div>\n }\n }\n @if (document.fileName) {\n <div>\n <strong>File Name: </strong>\n <span>{{ document.fileName }}</span>\n </div>\n }\n <button\n mat-raised-button\n color=\"primary\"\n (click)=\"download(document)\"\n [disabled]=\"!document.externalDocumentUrl && !document.documentBase64\"\n >\n Download\n </button>\n </div>\n }\n <pre id=\"fileContent\"></pre>\n </mat-expansion-panel>\n </mat-accordion>\n </section>\n }\n</div>\n", styles: [".invoice-container{width:100%;max-width:800px;margin:auto;font-family:Arial,sans-serif;line-height:1.5}.invoice-header{display:flex;justify-content:space-between;margin-bottom:20px}.seller-info,.buyer-info,.invoice-details{width:30%}.invoice-title{font-size:48px;margin:20px 0}.invoice-references,.invoice-totals,.payment-instructions,.invoice-notes{margin:20px 0}.invoice-table{width:100%;border-collapse:collapse;margin:20px 0}.invoice-table th,.invoice-table td{border:1px solid #000;padding:8px;text-align:left}.invoice-table th{background-color:var(--color-primary)}.invoice-totals p,.payment-instructions p,.invoice-notes p{margin:5px 0}h2{font-size:18px;margin-bottom:10px}.addition-info{display:flex;justify-content:space-between}.total{background-color:var(--color-light)}.invoice-attachments,.document{padding-bottom:15px}\n"], dependencies: [{ kind: "pipe", type: CurrencyPipe, name: "currency" }, { kind: "pipe", type: DatePipe, name: "date" }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i1.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "ngmodule", type: MatExpansionModule }, { kind: "directive", type: i2.MatAccordion, selector: "mat-accordion", inputs: ["hideToggle", "displayMode", "togglePosition"], exportAs: ["matAccordion"] }, { kind: "component", type: i2.MatExpansionPanel, selector: "mat-expansion-panel", inputs: ["hideToggle", "togglePosition"], outputs: ["afterExpand", "afterCollapse"], exportAs: ["matExpansionPanel"] }, { kind: "component", type: i2.MatExpansionPanelHeader, selector: "mat-expansion-panel-header", inputs: ["expandedHeight", "collapsedHeight", "tabIndex"] }, { kind: "directive", type: i2.MatExpansionPanelTitle, selector: "mat-panel-title" }, { kind: "pipe", type: InvoiceAttachmentMimeTypePipe, name: "invoiceAttachmentMimeType" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
116
- }
117
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.0", ngImport: i0, type: InvoiceDisplayComponent, decorators: [{
118
- type: Component,
119
- args: [{ selector: 'ava-invoice-display', standalone: true, imports: [CurrencyPipe, DatePipe, MatButtonModule, MatExpansionModule, InvoiceAttachmentMimeTypePipe], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"invoice-container\">\n <!-- Seller and Buyer Information -->\n @if (textWords?.invoiceTitle) {\n <h1 class=\"invoice-title\">{{ textWords?.invoiceTitle }}</h1>\n }\n <header class=\"invoice-header\">\n <div class=\"seller-info\">\n <p>\n <strong>{{ invoice().seller?.name }}</strong>\n </p>\n <p>{{ invoice().seller?.address }}</p>\n <p>{{ invoice().seller?.city }}, {{ invoice().seller?.zipCode }}</p>\n <p>{{ invoice().seller?.countryCode }}</p>\n @if (invoice().seller?.vatId) {\n <p>\n <strong>{{ textWords?.vatId }}:</strong>\n <span>{{ invoice().seller?.vatId }}</span>\n </p>\n }\n </div>\n <div class=\"invoice-details\">\n @if (invoice().invoiceNumber) {\n <p>\n <strong>{{ textWords?.detailsInvoiceNumber }}:</strong>\n <span>{{ invoice().invoiceNumber }}</span>\n </p>\n }\n @if (invoice().invoiceDate) {\n <p>\n <strong>{{ textWords?.detailsInvoiceDate }}:</strong>\n <span>{{ invoice().invoiceDate | date: 'dd.MM.yyyy' }}</span>\n </p>\n }\n @if (invoice().paymentDueDate) {\n <p>\n <strong>{{ textWords?.detailsPaymentDueDate }}:</strong>\n <span>{{ invoice().paymentDueDate | date: 'dd.MM.yyyy' }}</span>\n </p>\n }\n @if (invoice().currencyCode) {\n <p>\n <strong>{{ textWords?.detailsCurrencyCode }}:</strong>\n <span>{{ invoice().currencyCode }}</span>\n </p>\n }\n @if (invoice().paymentTerms) {\n <p>\n <strong>{{ textWords?.detailsPaymentTerms }}:</strong>\n <span>{{ invoice().paymentTerms }}</span>\n </p>\n }\n </div>\n <div class=\"buyer-info\">\n <p>\n <strong>{{ invoice().buyer?.name }}</strong>\n </p>\n <p>{{ invoice().buyer?.address }}</p>\n <p>{{ invoice().buyer?.city }}, {{ invoice().buyer?.zipCode }}</p>\n <p>{{ invoice().buyer?.countryCode }}</p>\n @if (invoice().buyer?.vatId) {\n <p>\n <strong>{{ textWords?.vatId }}:</strong>\n <span>{{ invoice().buyer?.vatId }}</span>\n </p>\n }\n </div>\n </header>\n\n <section class=\"invoice-references\">\n @if (textWords?.referencesTopic) {\n <h2>{{ textWords?.referencesTopic }}</h2>\n }\n @if (invoice().references?.buyerReference) {\n <p>\n <strong>{{ textWords?.referencesBuyerReference }}:</strong>\n <span>{{ invoice().references?.buyerReference }}</span>\n </p>\n }\n @if (invoice().references?.projectReference) {\n <p>\n <strong>{{ textWords?.referencesProjectReference }}:</strong>\n <span>{{ invoice().references?.projectReference }}</span>\n </p>\n }\n @if (invoice().references?.contractReference) {\n <p>\n <strong>{{ textWords?.referencesContractReference }}:</strong>\n <span>{{ invoice().references?.contractReference }}</span>\n </p>\n }\n @if (invoice().references?.purchaseOrderReference) {\n <p>\n <strong>{{ textWords?.referencesPurchaseOrderReference }}:</strong>\n <span>{{ invoice().references?.purchaseOrderReference }}</span>\n </p>\n }\n @if (invoice().references?.salesOrderReference) {\n <p>\n <strong>{{ textWords?.referencesSalesOrderReference }}:</strong>\n <span>{{ invoice().references?.salesOrderReference }}</span>\n </p>\n }\n @if (invoice().references?.receivingAdviceReference) {\n <p>\n <strong>{{ textWords?.referencesReceivingAdviceReference }}:</strong>\n <span>{{ invoice().references?.receivingAdviceReference }}</span>\n </p>\n }\n @if (invoice().references?.dispatchAdviceReference) {\n <p>\n <strong>{{ textWords?.referencesDispatchAdviceReference }}:</strong>\n <span> {{ invoice().references?.dispatchAdviceReference }}</span>\n </p>\n }\n @if (invoice().references?.tenderOrLotReference) {\n <p>\n <strong>{{ textWords?.referencesTenderOrLotReference }}:</strong>\n <span>{{ invoice().references?.tenderOrLotReference }}</span>\n </p>\n }\n @if (invoice().references?.invoicedObjectIdentifier) {\n <p>\n <strong>{{ textWords?.referencesInvoicedObjectIdentifier }}:</strong>\n <span>{{ invoice().references?.invoicedObjectIdentifier }}</span>\n </p>\n }\n </section>\n\n <table class=\"invoice-table\">\n <thead>\n <tr>\n <th>#</th>\n <th>{{ textWords?.tableHeadDescription }}</th>\n <th>{{ textWords?.tableHeadQuantity }}</th>\n <th>{{ textWords?.tableHeadUnit }}</th>\n <th>{{ textWords?.tableHeadNetPrice }}</th>\n <th>{{ textWords?.tableHeadNetAmount }}</th>\n </tr>\n </thead>\n <tbody>\n @for (item of invoice().lineItems; track item; let i = $index) {\n <tr>\n <td>{{ i + 1 }}</td>\n <td>{{ item.itemInformation?.description }}</td>\n <td>{{ item.quantity }}</td>\n <td>{{ item.unitCode }}</td>\n <td>{{ item.priceDetails?.netPrice | currency: invoice().currencyCode }}</td>\n <td>{{ item.netAmount | currency: invoice().currencyCode }}</td>\n </tr>\n }\n </tbody>\n </table>\n\n <div class=\"addition-info\">\n <section class=\"invoice-totals\">\n @if (textWords?.totalsTopic) {\n <h2>{{ textWords?.totalsTopic }}</h2>\n }\n @if (invoice().totals?.totalNet) {\n <p>\n <strong>{{ textWords?.totalsTotalNet }}:</strong>\n <span>{{ invoice().totals?.totalNet | currency: invoice().currencyCode }}</span>\n </p>\n }\n @if (invoice().totals?.totalAllowances) {\n <p>\n <strong>{{ textWords?.totalsTotalAllowances }}:</strong>\n <span> {{ invoice().totals?.totalAllowances | currency: invoice().currencyCode }}</span>\n </p>\n }\n @if (invoice().totals?.totalCharges) {\n <p>\n <strong>{{ textWords?.totalsTotalCharges }}:</strong>\n <span> {{ invoice().totals?.totalCharges | currency: invoice().currencyCode }}</span>\n </p>\n }\n @if (invoice().totals?.totalAfterDeductions) {\n <p>\n <strong>{{ textWords?.totalsTotalAfterDeductions }}:</strong>\n <span>{{ invoice().totals?.totalAfterDeductions | currency: invoice().currencyCode }}</span>\n </p>\n }\n @if (invoice().totals?.totalVatAmount) {\n <p>\n <strong>{{ textWords?.totalsTotalVatAmount }}:</strong>\n <span>{{ invoice().totals?.totalVatAmount | currency: invoice().currencyCode }}</span>\n </p>\n }\n @if (invoice().totals?.totalGross) {\n <p>\n <strong>{{ textWords?.totalsTotalGross }}:</strong>\n <span> {{ invoice().totals?.totalGross | currency: invoice().currencyCode }}</span>\n </p>\n }\n @if (invoice().totals?.alreadyPaidTotal) {\n <p>\n <strong>{{ textWords?.totalsAlreadyPaidTotal }}:</strong>\n <span>{{ invoice().totals?.alreadyPaidTotal | currency: invoice().currencyCode }}</span>\n </p>\n }\n @if (invoice().totals?.totalToBePaid) {\n <p class=\"total\">\n <strong>{{ textWords?.totalsTotalToBePaid }}:</strong>\n <strong> {{ invoice().totals?.totalToBePaid | currency: invoice().currencyCode }}</strong>\n </p>\n }\n </section>\n\n <section class=\"payment-instructions\">\n @if (textWords?.instructionsTopic) {\n <h2>{{ textWords?.instructionsTopic }}</h2>\n }\n @if (invoice().paymentInstructions?.description) {\n <p>{{ invoice().paymentInstructions?.description }}</p>\n }\n @for (means of invoice().paymentInstructions?.paymentMeans; track means) {\n <div>\n @if (means.accountIdentifier) {\n <p>\n <strong>{{ textWords?.instructionsAccountIdentifier }}:</strong>\n <span>{{ means.accountIdentifier }}</span>\n </p>\n }\n @if (means.accountName) {\n <p>\n <strong>{{ textWords?.instructionsAccountName }}:</strong>\n <span>{{ means.accountName }}</span>\n </p>\n }\n @if (means.serviceProviderIdentifier) {\n <p>\n <strong>{{ textWords?.instructionsServiceProviderIdentifier }}:</strong>\n <span>{{ means.serviceProviderIdentifier }}</span>\n </p>\n }\n </div>\n }\n </section>\n </div>\n\n <section class=\"invoice-notes\">\n @if (textWords?.notesTopic) {\n <h2>{{ textWords?.notesTopic }}</h2>\n }\n @for (note of invoice().invoiceNotes; track note) {\n <div>\n @if (note?.shortText) {\n <p>\n <strong>{{ note?.shortText }}</strong>\n </p>\n }\n @if (note?.longText) {\n <p>{{ note?.longText }}</p>\n }\n </div>\n }\n </section>\n\n @if (invoice().documents?.length) {\n <section class=\"invoice-attachments\">\n <mat-accordion>\n <mat-expansion-panel>\n <mat-expansion-panel-header>\n <mat-panel-title>Attachments</mat-panel-title>\n </mat-expansion-panel-header>\n @for (document of invoice().documents; track document) {\n <div class=\"document\">\n @if (document.documentReference) {\n <div>\n <strong>Name: </strong>\n <span>{{ document.documentReference }}</span>\n </div>\n }\n @if (document.description) {\n <div>\n <strong>Description: </strong>\n <span>{{ document.description }}</span>\n </div>\n }\n @if (document.externalDocumentUrl) {\n <div>\n <strong>Url: </strong>\n <span>{{ document.externalDocumentUrl }}</span>\n </div>\n } @else if (document.documentBase64) {\n <div>\n <strong>Data size: </strong>\n <span>{{ document.documentBase64.length }}</span>\n </div>\n\n @if (document.documentMimeType) {\n <div>\n <strong>Mime Type: </strong>\n <span>{{ document.documentMimeType | invoiceAttachmentMimeType }}</span>\n </div>\n }\n }\n @if (document.fileName) {\n <div>\n <strong>File Name: </strong>\n <span>{{ document.fileName }}</span>\n </div>\n }\n <button\n mat-raised-button\n color=\"primary\"\n (click)=\"download(document)\"\n [disabled]=\"!document.externalDocumentUrl && !document.documentBase64\"\n >\n Download\n </button>\n </div>\n }\n <pre id=\"fileContent\"></pre>\n </mat-expansion-panel>\n </mat-accordion>\n </section>\n }\n</div>\n", styles: [".invoice-container{width:100%;max-width:800px;margin:auto;font-family:Arial,sans-serif;line-height:1.5}.invoice-header{display:flex;justify-content:space-between;margin-bottom:20px}.seller-info,.buyer-info,.invoice-details{width:30%}.invoice-title{font-size:48px;margin:20px 0}.invoice-references,.invoice-totals,.payment-instructions,.invoice-notes{margin:20px 0}.invoice-table{width:100%;border-collapse:collapse;margin:20px 0}.invoice-table th,.invoice-table td{border:1px solid #000;padding:8px;text-align:left}.invoice-table th{background-color:var(--color-primary)}.invoice-totals p,.payment-instructions p,.invoice-notes p{margin:5px 0}h2{font-size:18px;margin-bottom:10px}.addition-info{display:flex;justify-content:space-between}.total{background-color:var(--color-light)}.invoice-attachments,.document{padding-bottom:15px}\n"] }]
120
- }], ctorParameters: () => [], propDecorators: { textWords: [{
121
- type: Input
122
- }] } });
123
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW52b2ljZS1kaXNwbGF5LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2FuZ3VsYXItYXZhL3NyYy9saWIvYXZhLXRyZWUvaW52b2ljZS9pbnZvaWNlLWRpc3BsYXkvaW52b2ljZS1kaXNwbGF5LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2FuZ3VsYXItYXZhL3NyYy9saWIvYXZhLXRyZWUvaW52b2ljZS9pbnZvaWNlLWRpc3BsYXkvaW52b2ljZS1kaXNwbGF5LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsUUFBUSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDekQsT0FBTyxFQUFFLHVCQUF1QixFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ2pGLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUMzRCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUVqRSxPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSw2Q0FBNkMsQ0FBQztBQUd4RixPQUFPLEVBQUUsNkJBQTZCLEVBQUUsTUFBTSxvREFBb0QsQ0FBQzs7OztBQVVuRyxNQUFNLE9BQU8sdUJBQXVCO0lBT2xDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztPQXlDRztJQUNILElBQWEsU0FBUyxDQUFDLEtBQThCO1FBQ25ELElBQUksQ0FBQyxVQUFVLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQyxTQUFTLEVBQUUsR0FBRyxLQUFLLEVBQUUsQ0FBQztJQUNwRCxDQUFDLENBQUMsaURBQWlEO0lBQ25ELElBQUksU0FBUztRQUNYLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQztJQUN6QixDQUFDO0lBRUQ7UUF2REEseURBQXlEO1FBQ3pELDhEQUE4RDtRQUM5RCxZQUFPLEdBQVEsS0FBSyxDQUFDLFFBQVEsRUFBVyxDQUFDO1FBRWpDLGVBQVUsR0FBNEIsSUFBSSxDQUFDO1FBb0RqRCxJQUFJLENBQUMsVUFBVSxHQUFHLEVBQUUsR0FBRyx5QkFBeUIsRUFBRSxDQUFDO1FBQ25EOzs7Ozs7O1dBT0c7UUFDSCxJQUFJLENBQUMsT0FBTyxHQUFHLEdBQUcsRUFBRTtZQUNsQiw4REFBOEQ7WUFDOUQsT0FBUSxNQUFjLENBQUMsc0JBQXNCLENBQUMsQ0FBQztRQUNqRCxDQUFDLENBQUM7SUFDSixDQUFDO0lBRUQsUUFBUSxDQUFDLGFBQWlDO1FBQ3hDLElBQUksYUFBYSxDQUFDLG1CQUFtQixFQUFFLENBQUM7WUFDdEMsSUFBSSxDQUFDLFlBQVksQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUNuQyxDQUFDO2FBQU0sQ0FBQztZQUNOLElBQUksQ0FBQyxXQUFXLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDbEMsQ0FBQztJQUNILENBQUM7SUFFRCxXQUFXLENBQUMsYUFBaUM7UUFDM0MsSUFBSSxhQUFhLENBQUMsY0FBYyxFQUFFLENBQUM7WUFDakMsTUFBTSxjQUFjLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxjQUFjLENBQUMsQ0FBQztZQUMxRCxNQUFNLFdBQVcsR0FBRyxJQUFJLEtBQUssQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDckQsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLGNBQWMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztnQkFDL0MsV0FBVyxDQUFDLENBQUMsQ0FBQyxHQUFHLGNBQWMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDaEQsQ0FBQztZQUNELE1BQU0sU0FBUyxHQUFHLElBQUksVUFBVSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBQzlDLE1BQU0sSUFBSSxHQUFHLElBQUksSUFBSSxDQUFDLENBQUMsU0FBUyxDQUFDLEVBQUUsRUFBRSxJQUFJLEVBQUUsMEJBQTBCLEVBQUUsQ0FBQyxDQUFDO1lBQ3pFLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLGFBQWEsQ0FBQyxRQUFrQixDQUFDLENBQUM7UUFDdEQsQ0FBQztJQUNILENBQUM7SUFFRCxLQUFLLENBQUMsWUFBWSxDQUFDLGFBQWlDO1FBQ2xELElBQUksQ0FBQztZQUNILE1BQU0sUUFBUSxHQUFHLE1BQU0sS0FBSyxDQUFDLGFBQWEsQ0FBQyxtQkFBNkIsQ0FBQyxDQUFDO1lBQzFFLE1BQU0sSUFBSSxHQUFHLE1BQU0sUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ25DLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLGFBQWEsQ0FBQyxRQUFrQixDQUFDLENBQUM7UUFDdEQsQ0FBQztRQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7WUFDZixPQUFPLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3ZCLENBQUM7SUFDSCxDQUFDO0lBRUQsTUFBTSxDQUFDLElBQVUsRUFBRSxRQUFnQjtRQUNqQyxNQUFNLElBQUksR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3pDLElBQUksQ0FBQyxJQUFJLEdBQUcsR0FBRyxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN0QyxJQUFJLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQztRQUN6QixJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDZixDQUFDOzhHQTVHVSx1QkFBdUI7a0dBQXZCLHVCQUF1Qiw2VkNsQnBDLHFpV0ErVEEsdTNCRGxUWSxZQUFZLDRDQUFFLFFBQVEsNENBQUUsZUFBZSwyTkFBRSxrQkFBa0IsbW5CQUFFLDZCQUE2Qjs7MkZBS3pGLHVCQUF1QjtrQkFSbkMsU0FBUzsrQkFDRSxxQkFBcUIsY0FDbkIsSUFBSSxXQUNQLENBQUMsWUFBWSxFQUFFLFFBQVEsRUFBRSxlQUFlLEVBQUUsa0JBQWtCLEVBQUUsNkJBQTZCLENBQUMsbUJBR3BGLHVCQUF1QixDQUFDLE1BQU07d0RBbURsQyxTQUFTO3NCQUFyQixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ3VycmVuY3lQaXBlLCBEYXRlUGlwZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ29tcG9uZW50LCBJbnB1dCwgaW5wdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE1hdEJ1dHRvbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2J1dHRvbic7XG5pbXBvcnQgeyBNYXRFeHBhbnNpb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9leHBhbnNpb24nO1xuXG5pbXBvcnQgeyBERUZBVUxUX1RFWFRfV09SRF9JTlZPSUNFIH0gZnJvbSAnLi4vLi4vdHJlZS9jb25zdGFudHMvZGVmYXVsdFRleHRXb3JkSW52b2ljZSc7XG5pbXBvcnQgeyBJVGV4dFdvcmRJbnZvaWNlIH0gZnJvbSAnLi4vLi4vdHJlZS9tb2RlbCc7XG5pbXBvcnQgeyBJbnZvaWNlLCBTdXBwb3J0aW5nRG9jdW1lbnQgfSBmcm9tICcuLi8uLi90cmVlL21vZGVsL2ludm9pY2UtbW9kZWxzJztcbmltcG9ydCB7IEludm9pY2VBdHRhY2htZW50TWltZVR5cGVQaXBlIH0gZnJvbSAnLi4vLi4vdHJlZS9waXBlcy9pbnZvaWNlLWF0dGFjaG1lbnQtbWltZS10eXBlLnBpcGUnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdhdmEtaW52b2ljZS1kaXNwbGF5JyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW0N1cnJlbmN5UGlwZSwgRGF0ZVBpcGUsIE1hdEJ1dHRvbk1vZHVsZSwgTWF0RXhwYW5zaW9uTW9kdWxlLCBJbnZvaWNlQXR0YWNobWVudE1pbWVUeXBlUGlwZV0sXG4gIHRlbXBsYXRlVXJsOiAnLi9pbnZvaWNlLWRpc3BsYXkuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybDogJy4vaW52b2ljZS1kaXNwbGF5LmNvbXBvbmVudC5zY3NzJyxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2hcbn0pXG5leHBvcnQgY2xhc3MgSW52b2ljZURpc3BsYXlDb21wb25lbnQge1xuICAvLyBUT0RPIHJlbW92ZSB0eXBlIGFueSBhZnRlciBUT0RPIHVuZGVyIHdpbGwgYmUgcmVzb2x2ZWRcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgaW52b2ljZTogYW55ID0gaW5wdXQucmVxdWlyZWQ8SW52b2ljZT4oKTtcblxuICBwcml2YXRlIF90ZXh0V29yZHM6IElUZXh0V29yZEludm9pY2UgfCBudWxsID0gbnVsbDtcblxuICAvKipcbiAgICogWW91IGNhbiBzdXBwbHkgYSBtYXAgb2Ygc3RyaW5ncyB0byBiZSB1c2VkIGZvciB0aGUgdGV4dCBpbiB0aGUgdHJlZS4gVGhpcyBhbGxvd3MgeW91IHRvIHRyYW5zbGF0ZVxuICAgKiB0aGUgdGV4dCBpbiB0aGUgdHJlZSB0byBvdGhlciBsYW5ndWFnZXMuXG4gICAqIHtcbiAgICogICBpbnZvaWNlVGl0bGU/OiBzdHJpbmc7XG4gICAqICAgdmF0SWQ/OiBzdHJpbmc7XG4gICAqICAgZGV0YWlsc0ludm9pY2VOdW1iZXI/OiBzdHJpbmc7XG4gICAqICAgZGV0YWlsc0ludm9pY2VEYXRlPzogc3RyaW5nO1xuICAgKiAgIGRldGFpbHNQYXltZW50RHVlRGF0ZT86IHN0cmluZztcbiAgICogICBkZXRhaWxzQ3VycmVuY3lDb2RlPzogc3RyaW5nO1xuICAgKiAgIGRldGFpbHNQYXltZW50VGVybXM/OiBzdHJpbmc7XG4gICAqICAgcmVmZXJlbmNlc1RvcGljPzogc3RyaW5nO1xuICAgKiAgIHJlZmVyZW5jZXNCdXllclJlZmVyZW5jZT86IHN0cmluZztcbiAgICogICByZWZlcmVuY2VzUHJvamVjdFJlZmVyZW5jZT86IHN0cmluZztcbiAgICogICByZWZlcmVuY2VzQ29udHJhY3RSZWZlcmVuY2U/OiBzdHJpbmc7XG4gICAqICAgcmVmZXJlbmNlc1B1cmNoYXNlT3JkZXJSZWZlcmVuY2U/OiBzdHJpbmc7XG4gICAqICAgcmVmZXJlbmNlc1NhbGVzT3JkZXJSZWZlcmVuY2U/OiBzdHJpbmc7XG4gICAqICAgcmVmZXJlbmNlc1JlY2VpdmluZ0FkdmljZVJlZmVyZW5jZT86IHN0cmluZztcbiAgICogICByZWZlcmVuY2VzRGlzcGF0Y2hBZHZpY2VSZWZlcmVuY2U/OiBzdHJpbmc7XG4gICAqICAgcmVmZXJlbmNlc1RlbmRlck9yTG90UmVmZXJlbmNlPzogc3RyaW5nO1xuICAgKiAgIHJlZmVyZW5jZXNJbnZvaWNlZE9iamVjdElkZW50aWZpZXI/OiBzdHJpbmc7XG4gICAqICAgdGFibGVIZWFkRGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gICAqICAgdGFibGVIZWFkUXVhbnRpdHk/OiBzdHJpbmc7XG4gICAqICAgdGFibGVIZWFkVW5pdD86IHN0cmluZztcbiAgICogICB0YWJsZUhlYWROZXRQcmljZT86IHN0cmluZztcbiAgICogICB0YWJsZUhlYWROZXRBbW91bnQ/OiBzdHJpbmc7XG4gICAqICAgdG90YWxzVG9waWM/OiBzdHJpbmc7XG4gICAqICAgdG90YWxzVG90YWxOZXQ/OiBzdHJpbmc7XG4gICAqICAgdG90YWxzVG90YWxBbGxvd2FuY2VzPzogc3RyaW5nO1xuICAgKiAgIHRvdGFsc1RvdGFsQ2hhcmdlcz86IHN0cmluZztcbiAgICogICB0b3RhbHNUb3RhbEFmdGVyRGVkdWN0aW9ucz86IHN0cmluZztcbiAgICogICB0b3RhbHNUb3RhbFZhdEFtb3VudD86IHN0cmluZztcbiAgICogICB0b3RhbHNUb3RhbEdyb3NzPzogc3RyaW5nO1xuICAgKiAgIHRvdGFsc0FscmVhZHlQYWlkVG90YWw/OiBzdHJpbmc7XG4gICAqICAgdG90YWxzVG90YWxUb0JlUGFpZD86IHN0cmluZztcbiAgICogICBpbnN0cnVjdGlvbnNUb3BpYz86IHN0cmluZztcbiAgICogICBpbnN0cnVjdGlvbnNBY2NvdW50SWRlbnRpZmllcj86IHN0cmluZztcbiAgICogICBpbnN0cnVjdGlvbnNBY2NvdW50TmFtZT86IHN0cmluZztcbiAgICogICBpbnN0cnVjdGlvbnNTZXJ2aWNlUHJvdmlkZXJJZGVudGlmaWVyPzogc3RyaW5nO1xuICAgKiAgIG5vdGVzVG9waWM/OiBzdHJpbmc7XG4gICAqIH1cbiAgICovXG4gIEBJbnB1dCgpIHNldCB0ZXh0V29yZHMod29yZHM6IElUZXh0V29yZEludm9pY2UgfCBudWxsKSB7XG4gICAgdGhpcy5fdGV4dFdvcmRzID0geyAuLi50aGlzLnRleHRXb3JkcywgLi4ud29yZHMgfTtcbiAgfSAvLyBhbGxvdyB0byB0cmFuc2xhdGUgYWxsIHRleHRzIHRvIG90aGVyIGxhbmd1YWdlXG4gIGdldCB0ZXh0V29yZHMoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3RleHRXb3JkcztcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMuX3RleHRXb3JkcyA9IHsgLi4uREVGQVVMVF9URVhUX1dPUkRfSU5WT0lDRSB9O1xuICAgIC8qKlRPRE86ICBGb3Igc2V0dGluZyBpbnZvaWNlIGluc3RlYWQ6XG4gICAgICogPGF2YS1pbnZvaWNlLWRpc3BsYXkgaWQ9XCJpbnZvaWNlXCI+PC9hdmEtaW52b2ljZS1kaXNwbGF5PlxuICAgICAqIGludm9pY2UgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW52b2ljZScpO1xuICAgICAqIGludm9pY2UuaW52b2ljZSA9IElOVk9JQ0U7XG4gICAgICogd2Ugc2hvdWxkIHBhc3MgdmFsdWUgdG8gZ2xvYmFsIHdpbmRvdyB2YXJpYWJsZVxuICAgICAqIHdpbmRvd1snSXZvaWNlR2xvYmFsVmFyaWFibGUnXSA9IElOVk9JQ0U7XG4gICAgICogVGVtcG9yYXJ5IHNvbHV0aW9uIHVudGlsIHRoZSBwcm9ibGVtIG9mIHNldHRpbmcgdGhlIHZhbHVlIGZvciBJbnB1dFNpZ25hbCBpcyBzb2x2ZWQuIFNlZSB0aGlzIFBSIGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL2FuZ3VsYXIvcHVsbC81NTA2N1xuICAgICAqL1xuICAgIHRoaXMuaW52b2ljZSA9ICgpID0+IHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICByZXR1cm4gKHdpbmRvdyBhcyBhbnkpWydJdm9pY2VHbG9iYWxWYXJpYWJsZSddO1xuICAgIH07XG4gIH1cblxuICBkb3dubG9hZChkb2N1bWVudFZhbHVlOiBTdXBwb3J0aW5nRG9jdW1lbnQpOiB2b2lkIHtcbiAgICBpZiAoZG9jdW1lbnRWYWx1ZS5leHRlcm5hbERvY3VtZW50VXJsKSB7XG4gICAgICB0aGlzLmRvd25sb2FkTGluayhkb2N1bWVudFZhbHVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5kb3dubG9hZEFueShkb2N1bWVudFZhbHVlKTtcbiAgICB9XG4gIH1cblxuICBkb3dubG9hZEFueShkb2N1bWVudFZhbHVlOiBTdXBwb3J0aW5nRG9jdW1lbnQpOiB2b2lkIHtcbiAgICBpZiAoZG9jdW1lbnRWYWx1ZS5kb2N1bWVudEJhc2U2NCkge1xuICAgICAgY29uc3QgYnl0ZUNoYXJhY3RlcnMgPSBhdG9iKGRvY3VtZW50VmFsdWUuZG9jdW1lbnRCYXNlNjQpO1xuICAgICAgY29uc3QgYnl0ZU51bWJlcnMgPSBuZXcgQXJyYXkoYnl0ZUNoYXJhY3RlcnMubGVuZ3RoKTtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYnl0ZUNoYXJhY3RlcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgYnl0ZU51bWJlcnNbaV0gPSBieXRlQ2hhcmFjdGVycy5jaGFyQ29kZUF0KGkpO1xuICAgICAgfVxuICAgICAgY29uc3QgYnl0ZUFycmF5ID0gbmV3IFVpbnQ4QXJyYXkoYnl0ZU51bWJlcnMpO1xuICAgICAgY29uc3QgYmxvYiA9IG5ldyBCbG9iKFtieXRlQXJyYXldLCB7IHR5cGU6ICdhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0nIH0pO1xuICAgICAgdGhpcy5zYXZlQXMoYmxvYiwgZG9jdW1lbnRWYWx1ZS5maWxlTmFtZSBhcyBzdHJpbmcpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGRvd25sb2FkTGluayhkb2N1bWVudFZhbHVlOiBTdXBwb3J0aW5nRG9jdW1lbnQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChkb2N1bWVudFZhbHVlLmV4dGVybmFsRG9jdW1lbnRVcmwgYXMgc3RyaW5nKTtcbiAgICAgIGNvbnN0IGJsb2IgPSBhd2FpdCByZXNwb25zZS5ibG9iKCk7XG4gICAgICB0aGlzLnNhdmVBcyhibG9iLCBkb2N1bWVudFZhbHVlLmZpbGVOYW1lIGFzIHN0cmluZyk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgIH1cbiAgfVxuXG4gIHNhdmVBcyhibG9iOiBCbG9iLCBmaWxlTmFtZTogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgbGluayA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTtcbiAgICBsaW5rLmhyZWYgPSBVUkwuY3JlYXRlT2JqZWN0VVJMKGJsb2IpO1xuICAgIGxpbmsuZG93bmxvYWQgPSBmaWxlTmFtZTtcbiAgICBsaW5rLmNsaWNrKCk7XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJpbnZvaWNlLWNvbnRhaW5lclwiPlxuICA8IS0tIFNlbGxlciBhbmQgQnV5ZXIgSW5mb3JtYXRpb24gLS0+XG4gIEBpZiAodGV4dFdvcmRzPy5pbnZvaWNlVGl0bGUpIHtcbiAgICA8aDEgY2xhc3M9XCJpbnZvaWNlLXRpdGxlXCI+e3sgdGV4dFdvcmRzPy5pbnZvaWNlVGl0bGUgfX08L2gxPlxuICB9XG4gIDxoZWFkZXIgY2xhc3M9XCJpbnZvaWNlLWhlYWRlclwiPlxuICAgIDxkaXYgY2xhc3M9XCJzZWxsZXItaW5mb1wiPlxuICAgICAgPHA+XG4gICAgICAgIDxzdHJvbmc+e3sgaW52b2ljZSgpLnNlbGxlcj8ubmFtZSB9fTwvc3Ryb25nPlxuICAgICAgPC9wPlxuICAgICAgPHA+e3sgaW52b2ljZSgpLnNlbGxlcj8uYWRkcmVzcyB9fTwvcD5cbiAgICAgIDxwPnt7IGludm9pY2UoKS5zZWxsZXI/LmNpdHkgfX0sIHt7IGludm9pY2UoKS5zZWxsZXI/LnppcENvZGUgfX08L3A+XG4gICAgICA8cD57eyBpbnZvaWNlKCkuc2VsbGVyPy5jb3VudHJ5Q29kZSB9fTwvcD5cbiAgICAgIEBpZiAoaW52b2ljZSgpLnNlbGxlcj8udmF0SWQpIHtcbiAgICAgICAgPHA+XG4gICAgICAgICAgPHN0cm9uZz57eyB0ZXh0V29yZHM/LnZhdElkIH19Ojwvc3Ryb25nPlxuICAgICAgICAgIDxzcGFuPnt7IGludm9pY2UoKS5zZWxsZXI/LnZhdElkIH19PC9zcGFuPlxuICAgICAgICA8L3A+XG4gICAgICB9XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cImludm9pY2UtZGV0YWlsc1wiPlxuICAgICAgQGlmIChpbnZvaWNlKCkuaW52b2ljZU51bWJlcikge1xuICAgICAgICA8cD5cbiAgICAgICAgICA8c3Ryb25nPnt7IHRleHRXb3Jkcz8uZGV0YWlsc0ludm9pY2VOdW1iZXIgfX06PC9zdHJvbmc+XG4gICAgICAgICAgPHNwYW4+e3sgaW52b2ljZSgpLmludm9pY2VOdW1iZXIgfX08L3NwYW4+XG4gICAgICAgIDwvcD5cbiAgICAgIH1cbiAgICAgIEBpZiAoaW52b2ljZSgpLmludm9pY2VEYXRlKSB7XG4gICAgICAgIDxwPlxuICAgICAgICAgIDxzdHJvbmc+e3sgdGV4dFdvcmRzPy5kZXRhaWxzSW52b2ljZURhdGUgfX06PC9zdHJvbmc+XG4gICAgICAgICAgPHNwYW4+e3sgaW52b2ljZSgpLmludm9pY2VEYXRlIHwgZGF0ZTogJ2RkLk1NLnl5eXknIH19PC9zcGFuPlxuICAgICAgICA8L3A+XG4gICAgICB9XG4gICAgICBAaWYgKGludm9pY2UoKS5wYXltZW50RHVlRGF0ZSkge1xuICAgICAgICA8cD5cbiAgICAgICAgICA8c3Ryb25nPnt7IHRleHRXb3Jkcz8uZGV0YWlsc1BheW1lbnREdWVEYXRlIH19Ojwvc3Ryb25nPlxuICAgICAgICAgIDxzcGFuPnt7IGludm9pY2UoKS5wYXltZW50RHVlRGF0ZSB8IGRhdGU6ICdkZC5NTS55eXl5JyB9fTwvc3Bhbj5cbiAgICAgICAgPC9wPlxuICAgICAgfVxuICAgICAgQGlmIChpbnZvaWNlKCkuY3VycmVuY3lDb2RlKSB7XG4gICAgICAgIDxwPlxuICAgICAgICAgIDxzdHJvbmc+e3sgdGV4dFdvcmRzPy5kZXRhaWxzQ3VycmVuY3lDb2RlIH19Ojwvc3Ryb25nPlxuICAgICAgICAgIDxzcGFuPnt7IGludm9pY2UoKS5jdXJyZW5jeUNvZGUgfX08L3NwYW4+XG4gICAgICAgIDwvcD5cbiAgICAgIH1cbiAgICAgIEBpZiAoaW52b2ljZSgpLnBheW1lbnRUZXJtcykge1xuICAgICAgICA8cD5cbiAgICAgICAgICA8c3Ryb25nPnt7IHRleHRXb3Jkcz8uZGV0YWlsc1BheW1lbnRUZXJtcyB9fTo8L3N0cm9uZz5cbiAgICAgICAgICA8c3Bhbj57eyBpbnZvaWNlKCkucGF5bWVudFRlcm1zIH19PC9zcGFuPlxuICAgICAgICA8L3A+XG4gICAgICB9XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cImJ1eWVyLWluZm9cIj5cbiAgICAgIDxwPlxuICAgICAgICA8c3Ryb25nPnt7IGludm9pY2UoKS5idXllcj8ubmFtZSB9fTwvc3Ryb25nPlxuICAgICAgPC9wPlxuICAgICAgPHA+e3sgaW52b2ljZSgpLmJ1eWVyPy5hZGRyZXNzIH19PC9wPlxuICAgICAgPHA+e3sgaW52b2ljZSgpLmJ1eWVyPy5jaXR5IH19LCB7eyBpbnZvaWNlKCkuYnV5ZXI/LnppcENvZGUgfX08L3A+XG4gICAgICA8cD57eyBpbnZvaWNlKCkuYnV5ZXI/LmNvdW50cnlDb2RlIH19PC9wPlxuICAgICAgQGlmIChpbnZvaWNlKCkuYnV5ZXI/LnZhdElkKSB7XG4gICAgICAgIDxwPlxuICAgICAgICAgIDxzdHJvbmc+e3sgdGV4dFdvcmRzPy52YXRJZCB9fTo8L3N0cm9uZz5cbiAgICAgICAgICA8c3Bhbj57eyBpbnZvaWNlKCkuYnV5ZXI/LnZhdElkIH19PC9zcGFuPlxuICAgICAgICA8L3A+XG4gICAgICB9XG4gICAgPC9kaXY+XG4gIDwvaGVhZGVyPlxuXG4gIDxzZWN0aW9uIGNsYXNzPVwiaW52b2ljZS1yZWZlcmVuY2VzXCI+XG4gICAgQGlmICh0ZXh0V29yZHM/LnJlZmVyZW5jZXNUb3BpYykge1xuICAgICAgPGgyPnt7IHRleHRXb3Jkcz8ucmVmZXJlbmNlc1RvcGljIH19PC9oMj5cbiAgICB9XG4gICAgQGlmIChpbnZvaWNlKCkucmVmZXJlbmNlcz8uYnV5ZXJSZWZlcmVuY2UpIHtcbiAgICAgIDxwPlxuICAgICAgICA8c3Ryb25nPnt7IHRleHRXb3Jkcz8ucmVmZXJlbmNlc0J1eWVyUmVmZXJlbmNlIH19Ojwvc3Ryb25nPlxuICAgICAgICA8c3Bhbj57eyBpbnZvaWNlKCkucmVmZXJlbmNlcz8uYnV5ZXJSZWZlcmVuY2UgfX08L3NwYW4+XG4gICAgICA8L3A+XG4gICAgfVxuICAgIEBpZiAoaW52b2ljZSgpLnJlZmVyZW5jZXM/LnByb2plY3RSZWZlcmVuY2UpIHtcbiAgICAgIDxwPlxuICAgICAgICA8c3Ryb25nPnt7IHRleHRXb3Jkcz8ucmVmZXJlbmNlc1Byb2plY3RSZWZlcmVuY2UgfX06PC9zdHJvbmc+XG4gICAgICAgIDxzcGFuPnt7IGludm9pY2UoKS5yZWZlcmVuY2VzPy5wcm9qZWN0UmVmZXJlbmNlIH19PC9zcGFuPlxuICAgICAgPC9wPlxuICAgIH1cbiAgICBAaWYgKGludm9pY2UoKS5yZWZlcmVuY2VzPy5jb250cmFjdFJlZmVyZW5jZSkge1xuICAgICAgPHA+XG4gICAgICAgIDxzdHJvbmc+e3sgdGV4dFdvcmRzPy5yZWZlcmVuY2VzQ29udHJhY3RSZWZlcmVuY2UgfX06PC9zdHJvbmc+XG4gICAgICAgIDxzcGFuPnt7IGludm9pY2UoKS5yZWZlcmVuY2VzPy5jb250cmFjdFJlZmVyZW5jZSB9fTwvc3Bhbj5cbiAgICAgIDwvcD5cbiAgICB9XG4gICAgQGlmIChpbnZvaWNlKCkucmVmZXJlbmNlcz8ucHVyY2hhc2VPcmRlclJlZmVyZW5jZSkge1xuICAgICAgPHA+XG4gICAgICAgIDxzdHJvbmc+e3sgdGV4dFdvcmRzPy5yZWZlcmVuY2VzUHVyY2hhc2VPcmRlclJlZmVyZW5jZSB9fTo8L3N0cm9uZz5cbiAgICAgICAgPHNwYW4+e3sgaW52b2ljZSgpLnJlZmVyZW5jZXM/LnB1cmNoYXNlT3JkZXJSZWZlcmVuY2UgfX08L3NwYW4+XG4gICAgICA8L3A+XG4gICAgfVxuICAgIEBpZiAoaW52b2ljZSgpLnJlZmVyZW5jZXM/LnNhbGVzT3JkZXJSZWZlcmVuY2UpIHtcbiAgICAgIDxwPlxuICAgICAgICA8c3Ryb25nPnt7IHRleHRXb3Jkcz8ucmVmZXJlbmNlc1NhbGVzT3JkZXJSZWZlcmVuY2UgfX06PC9zdHJvbmc+XG4gICAgICAgIDxzcGFuPnt7IGludm9pY2UoKS5yZWZlcmVuY2VzPy5zYWxlc09yZGVyUmVmZXJlbmNlIH19PC9zcGFuPlxuICAgICAgPC9wPlxuICAgIH1cbiAgICBAaWYgKGludm9pY2UoKS5yZWZlcmVuY2VzPy5yZWNlaXZpbmdBZHZpY2VSZWZlcmVuY2UpIHtcbiAgICAgIDxwPlxuICAgICAgICA8c3Ryb25nPnt7IHRleHRXb3Jkcz8ucmVmZXJlbmNlc1JlY2VpdmluZ0FkdmljZVJlZmVyZW5jZSB9fTo8L3N0cm9uZz5cbiAgICAgICAgPHNwYW4+e3sgaW52b2ljZSgpLnJlZmVyZW5jZXM/LnJlY2VpdmluZ0FkdmljZVJlZmVyZW5jZSB9fTwvc3Bhbj5cbiAgICAgIDwvcD5cbiAgICB9XG4gICAgQGlmIChpbnZvaWNlKCkucmVmZXJlbmNlcz8uZGlzcGF0Y2hBZHZpY2VSZWZlcmVuY2UpIHtcbiAgICAgIDxwPlxuICAgICAgICA8c3Ryb25nPnt7IHRleHRXb3Jkcz8ucmVmZXJlbmNlc0Rpc3BhdGNoQWR2aWNlUmVmZXJlbmNlIH19Ojwvc3Ryb25nPlxuICAgICAgICA8c3Bhbj4ge3sgaW52b2ljZSgpLnJlZmVyZW5jZXM/LmRpc3BhdGNoQWR2aWNlUmVmZXJlbmNlIH19PC9zcGFuPlxuICAgICAgPC9wPlxuICAgIH1cbiAgICBAaWYgKGludm9pY2UoKS5yZWZlcmVuY2VzPy50ZW5kZXJPckxvdFJlZmVyZW5jZSkge1xuICAgICAgPHA+XG4gICAgICAgIDxzdHJvbmc+e3sgdGV4dFdvcmRzPy5yZWZlcmVuY2VzVGVuZGVyT3JMb3RSZWZlcmVuY2UgfX06PC9zdHJvbmc+XG4gICAgICAgIDxzcGFuPnt7IGludm9pY2UoKS5yZWZlcmVuY2VzPy50ZW5kZXJPckxvdFJlZmVyZW5jZSB9fTwvc3Bhbj5cbiAgICAgIDwvcD5cbiAgICB9XG4gICAgQGlmIChpbnZvaWNlKCkucmVmZXJlbmNlcz8uaW52b2ljZWRPYmplY3RJZGVudGlmaWVyKSB7XG4gICAgICA8cD5cbiAgICAgICAgPHN0cm9uZz57eyB0ZXh0V29yZHM/LnJlZmVyZW5jZXNJbnZvaWNlZE9iamVjdElkZW50aWZpZXIgfX06PC9zdHJvbmc+XG4gICAgICAgIDxzcGFuPnt7IGludm9pY2UoKS5yZWZlcmVuY2VzPy5pbnZvaWNlZE9iamVjdElkZW50aWZpZXIgfX08L3NwYW4+XG4gICAgICA8L3A+XG4gICAgfVxuICA8L3NlY3Rpb24+XG5cbiAgPHRhYmxlIGNsYXNzPVwiaW52b2ljZS10YWJsZVwiPlxuICAgIDx0aGVhZD5cbiAgICAgIDx0cj5cbiAgICAgICAgPHRoPiM8L3RoPlxuICAgICAgICA8dGg+e3sgdGV4dFdvcmRzPy50YWJsZUhlYWREZXNjcmlwdGlvbiB9fTwvdGg+XG4gICAgICAgIDx0aD57eyB0ZXh0V29yZHM/LnRhYmxlSGVhZFF1YW50aXR5IH19PC90aD5cbiAgICAgICAgPHRoPnt7IHRleHRXb3Jkcz8udGFibGVIZWFkVW5pdCB9fTwvdGg+XG4gICAgICAgIDx0aD57eyB0ZXh0V29yZHM/LnRhYmxlSGVhZE5ldFByaWNlIH19PC90aD5cbiAgICAgICAgPHRoPnt7IHRleHRXb3Jkcz8udGFibGVIZWFkTmV0QW1vdW50IH19PC90aD5cbiAgICAgIDwvdHI+XG4gICAgPC90aGVhZD5cbiAgICA8dGJvZHk+XG4gICAgICBAZm9yIChpdGVtIG9mIGludm9pY2UoKS5saW5lSXRlbXM7IHRyYWNrIGl0ZW07IGxldCBpID0gJGluZGV4KSB7XG4gICAgICAgIDx0cj5cbiAgICAgICAgICA8dGQ+e3sgaSArIDEgfX08L3RkPlxuICAgICAgICAgIDx0ZD57eyBpdGVtLml0ZW1JbmZvcm1hdGlvbj8uZGVzY3JpcHRpb24gfX08L3RkPlxuICAgICAgICAgIDx0ZD57eyBpdGVtLnF1YW50aXR5IH19PC90ZD5cbiAgICAgICAgICA8dGQ+e3sgaXRlbS51bml0Q29kZSB9fTwvdGQ+XG4gICAgICAgICAgPHRkPnt7IGl0ZW0ucHJpY2VEZXRhaWxzPy5uZXRQcmljZSB8IGN1cnJlbmN5OiBpbnZvaWNlKCkuY3VycmVuY3lDb2RlIH19PC90ZD5cbiAgICAgICAgICA8dGQ+e3sgaXRlbS5uZXRBbW91bnQgfCBjdXJyZW5jeTogaW52b2ljZSgpLmN1cnJlbmN5Q29kZSB9fTwvdGQ+XG4gICAgICAgIDwvdHI+XG4gICAgICB9XG4gICAgPC90Ym9keT5cbiAgPC90YWJsZT5cblxuICA8ZGl2IGNsYXNzPVwiYWRkaXRpb24taW5mb1wiPlxuICAgIDxzZWN0aW9uIGNsYXNzPVwiaW52b2ljZS10b3RhbHNcIj5cbiAgICAgIEBpZiAodGV4dFdvcmRzPy50b3RhbHNUb3BpYykge1xuICAgICAgICA8aDI+e3sgdGV4dFdvcmRzPy50b3RhbHNUb3BpYyB9fTwvaDI+XG4gICAgICB9XG4gICAgICBAaWYgKGludm9pY2UoKS50b3RhbHM/LnRvdGFsTmV0KSB7XG4gICAgICAgIDxwPlxuICAgICAgICAgIDxzdHJvbmc+e3sgdGV4dFdvcmRzPy50b3RhbHNUb3RhbE5ldCB9fTo8L3N0cm9uZz5cbiAgICAgICAgICA8c3Bhbj57eyBpbnZvaWNlKCkudG90YWxzPy50b3RhbE5ldCB8IGN1cnJlbmN5OiBpbnZvaWNlKCkuY3VycmVuY3lDb2RlIH19PC9zcGFuPlxuICAgICAgICA8L3A+XG4gICAgICB9XG4gICAgICBAaWYgKGludm9pY2UoKS50b3RhbHM/LnRvdGFsQWxsb3dhbmNlcykge1xuICAgICAgICA8cD5cbiAgICAgICAgICA8c3Ryb25nPnt7IHRleHRXb3Jkcz8udG90YWxzVG90YWxBbGxvd2FuY2VzIH19Ojwvc3Ryb25nPlxuICAgICAgICAgIDxzcGFuPiB7eyBpbnZvaWNlKCkudG90YWxzPy50b3RhbEFsbG93YW5jZXMgfCBjdXJyZW5jeTogaW52b2ljZSgpLmN1cnJlbmN5Q29kZSB9fTwvc3Bhbj5cbiAgICAgICAgPC9wPlxuICAgICAgfVxuICAgICAgQGlmIChpbnZvaWNlKCkudG90YWxzPy50b3RhbENoYXJnZXMpIHtcbiAgICAgICAgPHA+XG4gICAgICAgICAgPHN0cm9uZz57eyB0ZXh0V29yZHM/LnRvdGFsc1RvdGFsQ2hhcmdlcyB9fTo8L3N0cm9uZz5cbiAgICAgICAgICA8c3Bhbj4ge3sgaW52b2ljZSgpLnRvdGFscz8udG90YWxDaGFyZ2VzIHwgY3VycmVuY3k6IGludm9pY2UoKS5jdXJyZW5jeUNvZGUgfX08L3NwYW4+XG4gICAgICAgIDwvcD5cbiAgICAgIH1cbiAgICAgIEBpZiAoaW52b2ljZSgpLnRvdGFscz8udG90YWxBZnRlckRlZHVjdGlvbnMpIHtcbiAgICAgICAgPHA+XG4gICAgICAgICAgPHN0cm9uZz57eyB0ZXh0V29yZHM/LnRvdGFsc1RvdGFsQWZ0ZXJEZWR1Y3Rpb25zIH19Ojwvc3Ryb25nPlxuICAgICAgICAgIDxzcGFuPnt7IGludm9pY2UoKS50b3RhbHM/LnRvdGFsQWZ0ZXJEZWR1Y3Rpb25zIHwgY3VycmVuY3k6IGludm9pY2UoKS5jdXJyZW5jeUNvZGUgfX08L3NwYW4+XG4gICAgICAgIDwvcD5cbiAgICAgIH1cbiAgICAgIEBpZiAoaW52b2ljZSgpLnRvdGFscz8udG90YWxWYXRBbW91bnQpIHtcbiAgICAgICAgPHA+XG4gICAgICAgICAgPHN0cm9uZz57eyB0ZXh0V29yZHM/LnRvdGFsc1RvdGFsVmF0QW1vdW50IH19Ojwvc3Ryb25nPlxuICAgICAgICAgIDxzcGFuPnt7IGludm9pY2UoKS50b3RhbHM/LnRvdGFsVmF0QW1vdW50IHwgY3VycmVuY3k6IGludm9pY2UoKS5jdXJyZW5jeUNvZGUgfX08L3NwYW4+XG4gICAgICAgIDwvcD5cbiAgICAgIH1cbiAgICAgIEBpZiAoaW52b2ljZSgpLnRvdGFscz8udG90YWxHcm9zcykge1xuICAgICAgICA8cD5cbiAgICAgICAgICA8c3Ryb25nPnt7IHRleHRXb3Jkcz8udG90YWxzVG90YWxHcm9zcyB9fTo8L3N0cm9uZz5cbiAgICAgICAgICA8c3Bhbj4ge3sgaW52b2ljZSgpLnRvdGFscz8udG90YWxHcm9zcyB8IGN1cnJlbmN5OiBpbnZvaWNlKCkuY3VycmVuY3lDb2RlIH19PC9zcGFuPlxuICAgICAgICA8L3A+XG4gICAgICB9XG4gICAgICBAaWYgKGludm9pY2UoKS50b3RhbHM/LmFscmVhZHlQYWlkVG90YWwpIHtcbiAgICAgICAgPHA+XG4gICAgICAgICAgPHN0cm9uZz57eyB0ZXh0V29yZHM/LnRvdGFsc0FscmVhZHlQYWlkVG90YWwgfX06PC9zdHJvbmc+XG4gICAgICAgICAgPHNwYW4+e3sgaW52b2ljZSgpLnRvdGFscz8uYWxyZWFkeVBhaWRUb3RhbCB8IGN1cnJlbmN5OiBpbnZvaWNlKCkuY3VycmVuY3lDb2RlIH19PC9zcGFuPlxuICAgICAgICA8L3A+XG4gICAgICB9XG4gICAgICBAaWYgKGludm9pY2UoKS50b3RhbHM/LnRvdGFsVG9CZVBhaWQpIHtcbiAgICAgICAgPHAgY2xhc3M9XCJ0b3RhbFwiPlxuICAgICAgICAgIDxzdHJvbmc+e3sgdGV4dFdvcmRzPy50b3RhbHNUb3RhbFRvQmVQYWlkIH19Ojwvc3Ryb25nPlxuICAgICAgICAgIDxzdHJvbmc+IHt7IGludm9pY2UoKS50b3RhbHM/LnRvdGFsVG9CZVBhaWQgfCBjdXJyZW5jeTogaW52b2ljZSgpLmN1cnJlbmN5Q29kZSB9fTwvc3Ryb25nPlxuICAgICAgICA8L3A+XG4gICAgICB9XG4gICAgPC9zZWN0aW9uPlxuXG4gICAgPHNlY3Rpb24gY2xhc3M9XCJwYXltZW50LWluc3RydWN0aW9uc1wiPlxuICAgICAgQGlmICh0ZXh0V29yZHM/Lmluc3RydWN0aW9uc1RvcGljKSB7XG4gICAgICAgIDxoMj57eyB0ZXh0V29yZHM/Lmluc3RydWN0aW9uc1RvcGljIH19PC9oMj5cbiAgICAgIH1cbiAgICAgIEBpZiAoaW52b2ljZSgpLnBheW1lbnRJbnN0cnVjdGlvbnM/LmRlc2NyaXB0aW9uKSB7XG4gICAgICAgIDxwPnt7IGludm9pY2UoKS5wYXltZW50SW5zdHJ1Y3Rpb25zPy5kZXNjcmlwdGlvbiB9fTwvcD5cbiAgICAgIH1cbiAgICAgIEBmb3IgKG1lYW5zIG9mIGludm9pY2UoKS5wYXltZW50SW5zdHJ1Y3Rpb25zPy5wYXltZW50TWVhbnM7IHRyYWNrIG1lYW5zKSB7XG4gICAgICAgIDxkaXY+XG4gICAgICAgICAgQGlmIChtZWFucy5hY2NvdW50SWRlbnRpZmllcikge1xuICAgICAgICAgICAgPHA+XG4gICAgICAgICAgICAgIDxzdHJvbmc+e3sgdGV4dFdvcmRzPy5pbnN0cnVjdGlvbnNBY2NvdW50SWRlbnRpZmllciB9fTo8L3N0cm9uZz5cbiAgICAgICAgICAgICAgPHNwYW4+e3sgbWVhbnMuYWNjb3VudElkZW50aWZpZXIgfX08L3NwYW4+XG4gICAgICAgICAgICA8L3A+XG4gICAgICAgICAgfVxuICAgICAgICAgIEBpZiAobWVhbnMuYWNjb3VudE5hbWUpIHtcbiAgICAgICAgICAgIDxwPlxuICAgICAgICAgICAgICA8c3Ryb25nPnt7IHRleHRXb3Jkcz8uaW5zdHJ1Y3Rpb25zQWNjb3VudE5hbWUgfX06PC9zdHJvbmc+XG4gICAgICAgICAgICAgIDxzcGFuPnt7IG1lYW5zLmFjY291bnROYW1lIH19PC9zcGFuPlxuICAgICAgICAgICAgPC9wPlxuICAgICAgICAgIH1cbiAgICAgICAgICBAaWYgKG1lYW5zLnNlcnZpY2VQcm92aWRlcklkZW50aWZpZXIpIHtcbiAgICAgICAgICAgIDxwPlxuICAgICAgICAgICAgICA8c3Ryb25nPnt7IHRleHRXb3Jkcz8uaW5zdHJ1Y3Rpb25zU2VydmljZVByb3ZpZGVySWRlbnRpZmllciB9fTo8L3N0cm9uZz5cbiAgICAgICAgICAgICAgPHNwYW4+e3sgbWVhbnMuc2VydmljZVByb3ZpZGVySWRlbnRpZmllciB9fTwvc3Bhbj5cbiAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICB9XG4gICAgICAgIDwvZGl2PlxuICAgICAgfVxuICAgIDwvc2VjdGlvbj5cbiAgPC9kaXY+XG5cbiAgPHNlY3Rpb24gY2xhc3M9XCJpbnZvaWNlLW5vdGVzXCI+XG4gICAgQGlmICh0ZXh0V29yZHM/Lm5vdGVzVG9waWMpIHtcbiAgICAgIDxoMj57eyB0ZXh0V29yZHM/Lm5vdGVzVG9waWMgfX08L2gyPlxuICAgIH1cbiAgICBAZm9yIChub3RlIG9mIGludm9pY2UoKS5pbnZvaWNlTm90ZXM7IHRyYWNrIG5vdGUpIHtcbiAgICAgIDxkaXY+XG4gICAgICAgIEBpZiAobm90ZT8uc2hvcnRUZXh0KSB7XG4gICAgICAgICAgPHA+XG4gICAgICAgICAgICA8c3Ryb25nPnt7IG5vdGU/LnNob3J0VGV4dCB9fTwvc3Ryb25nPlxuICAgICAgICAgIDwvcD5cbiAgICAgICAgfVxuICAgICAgICBAaWYgKG5vdGU/LmxvbmdUZXh0KSB7XG4gICAgICAgICAgPHA+e3sgbm90ZT8ubG9uZ1RleHQgfX08L3A+XG4gICAgICAgIH1cbiAgICAgIDwvZGl2PlxuICAgIH1cbiAgPC9zZWN0aW9uPlxuXG4gIEBpZiAoaW52b2ljZSgpLmRvY3VtZW50cz8ubGVuZ3RoKSB7XG4gICAgPHNlY3Rpb24gY2xhc3M9XCJpbnZvaWNlLWF0dGFjaG1lbnRzXCI+XG4gICAgICA8bWF0LWFjY29yZGlvbj5cbiAgICAgICAgPG1hdC1leHBhbnNpb24tcGFuZWw+XG4gICAgICAgICAgPG1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyPlxuICAgICAgICAgICAgPG1hdC1wYW5lbC10aXRsZT5BdHRhY2htZW50czwvbWF0LXBhbmVsLXRpdGxlPlxuICAgICAgICAgIDwvbWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXI+XG4gICAgICAgICAgQGZvciAoZG9jdW1lbnQgb2YgaW52b2ljZSgpLmRvY3VtZW50czsgdHJhY2sgZG9jdW1lbnQpIHtcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkb2N1bWVudFwiPlxuICAgICAgICAgICAgICBAaWYgKGRvY3VtZW50LmRvY3VtZW50UmVmZXJlbmNlKSB7XG4gICAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICAgIDxzdHJvbmc+TmFtZTogPC9zdHJvbmc+XG4gICAgICAgICAgICAgICAgICA8c3Bhbj57eyBkb2N1bWVudC5kb2N1bWVudFJlZmVyZW5jZSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBAaWYgKGRvY3VtZW50LmRlc2NyaXB0aW9uKSB7XG4gICAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICAgIDxzdHJvbmc+RGVzY3JpcHRpb246IDwvc3Ryb25nPlxuICAgICAgICAgICAgICAgICAgPHNwYW4+e3sgZG9jdW1lbnQuZGVzY3JpcHRpb24gfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgQGlmIChkb2N1bWVudC5leHRlcm5hbERvY3VtZW50VXJsKSB7XG4gICAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICAgIDxzdHJvbmc+VXJsOiA8L3N0cm9uZz5cbiAgICAgICAgICAgICAgICAgIDxzcGFuPnt7IGRvY3VtZW50LmV4dGVybmFsRG9jdW1lbnRVcmwgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIH0gQGVsc2UgaWYgKGRvY3VtZW50LmRvY3VtZW50QmFzZTY0KSB7XG4gICAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICAgIDxzdHJvbmc+RGF0YSBzaXplOiA8L3N0cm9uZz5cbiAgICAgICAgICAgICAgICAgIDxzcGFuPnt7IGRvY3VtZW50LmRvY3VtZW50QmFzZTY0Lmxlbmd0aCB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgIEBpZiAoZG9jdW1lbnQuZG9jdW1lbnRNaW1lVHlwZSkge1xuICAgICAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICAgICAgPHN0cm9uZz5NaW1lIFR5cGU6IDwvc3Ryb25nPlxuICAgICAgICAgICAgICAgICAgICA8c3Bhbj57eyBkb2N1bWVudC5kb2N1bWVudE1pbWVUeXBlIHwgaW52b2ljZUF0dGFjaG1lbnRNaW1lVHlwZSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBAaWYgKGRvY3VtZW50LmZpbGVOYW1lKSB7XG4gICAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICAgIDxzdHJvbmc+RmlsZSBOYW1lOiA8L3N0cm9uZz5cbiAgICAgICAgICAgICAgICAgIDxzcGFuPnt7IGRvY3VtZW50LmZpbGVOYW1lIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICBtYXQtcmFpc2VkLWJ1dHRvblxuICAgICAgICAgICAgICAgIGNvbG9yPVwicHJpbWFyeVwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cImRvd25sb2FkKGRvY3VtZW50KVwiXG4gICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIiFkb2N1bWVudC5leHRlcm5hbERvY3VtZW50VXJsICYmICFkb2N1bWVudC5kb2N1bWVudEJhc2U2NFwiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICBEb3dubG9hZFxuICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIH1cbiAgICAgICAgICA8cHJlIGlkPVwiZmlsZUNvbnRlbnRcIj48L3ByZT5cbiAgICAgICAgPC9tYXQtZXhwYW5zaW9uLXBhbmVsPlxuICAgICAgPC9tYXQtYWNjb3JkaW9uPlxuICAgIDwvc2VjdGlvbj5cbiAgfVxuPC9kaXY+XG4iXX0=