ngx-edu-sharing-ui 10.0.20 → 10.0.22
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.
- package/assets/scss/material-theme.scss +3 -3
- package/assets/scss/mixins.scss +1 -1
- package/assets/scss/variables-root.scss +2 -0
- package/assets/scss/variables-scss.scss +3 -4
- package/assets/scss/variables.scss +1 -1
- package/fesm2022/ngx-edu-sharing-ui.mjs +376 -319
- package/fesm2022/ngx-edu-sharing-ui.mjs.map +1 -1
- package/lib/index.d.ts +1 -0
- package/lib/list-items/list-widget.d.ts +1 -1
- package/lib/mds-viewer/mds-editor-instance-service.abstract.d.ts +14 -0
- package/lib/mds-viewer/widget/mds-widget.component.d.ts +6 -4
- package/package.json +8 -9
- package/esm2022/lib/actionbar/actionbar.component.mjs +0 -206
- package/esm2022/lib/common/edu-sharing-ui-common.module.mjs +0 -170
- package/esm2022/lib/directives/border-box-observer.directive.mjs +0 -71
- package/esm2022/lib/directives/check-text-overflow.directive.mjs +0 -71
- package/esm2022/lib/directives/drag-nodes/drag-nodes.mjs +0 -14
- package/esm2022/lib/directives/drag-nodes/nodes-drag-source.directive.mjs +0 -79
- package/esm2022/lib/directives/drag-nodes/nodes-drag.directive.mjs +0 -49
- package/esm2022/lib/directives/drag-nodes/nodes-drop-target.directive.mjs +0 -105
- package/esm2022/lib/directives/focus-state.directive.mjs +0 -44
- package/esm2022/lib/directives/icon.directive.mjs +0 -184
- package/esm2022/lib/directives/infinite-scroll.directive.mjs +0 -85
- package/esm2022/lib/dropdown/dropdown.component.mjs +0 -83
- package/esm2022/lib/edu-sharing-ui-configuration.mjs +0 -48
- package/esm2022/lib/edu-sharing-ui.module.mjs +0 -82
- package/esm2022/lib/index.mjs +0 -96
- package/esm2022/lib/list-items/available-widgets.mjs +0 -27
- package/esm2022/lib/list-items/format-duration.pipe.mjs +0 -20
- package/esm2022/lib/list-items/list-base/list-base.component.mjs +0 -46
- package/esm2022/lib/list-items/list-collection-info/list-collection-info.component.mjs +0 -29
- package/esm2022/lib/list-items/list-counts/list-counts.component.mjs +0 -56
- package/esm2022/lib/list-items/list-items.module.mjs +0 -50
- package/esm2022/lib/list-items/list-node-license/list-node-license.component.mjs +0 -41
- package/esm2022/lib/list-items/list-node-replication-source/list-node-replication-source.component.mjs +0 -47
- package/esm2022/lib/list-items/list-node-workflow/list-node-workflow.component.mjs +0 -24
- package/esm2022/lib/list-items/list-text/list-text.component.mjs +0 -106
- package/esm2022/lib/list-items/list-widget.mjs +0 -49
- package/esm2022/lib/list-items/node-row/node-row.component.mjs +0 -24
- package/esm2022/lib/list-items/node-source.pipe.mjs +0 -49
- package/esm2022/lib/mds/mds-helper.service.mjs +0 -167
- package/esm2022/lib/mds/mds.module.mjs +0 -16
- package/esm2022/lib/mds-viewer/mds-viewer.component.mjs +0 -170
- package/esm2022/lib/mds-viewer/mds-viewer.service.mjs +0 -18
- package/esm2022/lib/mds-viewer/replace-element-with-div.mjs +0 -47
- package/esm2022/lib/mds-viewer/view-instance.service.mjs +0 -27
- package/esm2022/lib/mds-viewer/widget/mds-widget.component.mjs +0 -379
- package/esm2022/lib/node-entries/combined-data-source.mjs +0 -41
- package/esm2022/lib/node-entries/custom-templates-data-source.mjs +0 -7
- package/esm2022/lib/node-entries/drag-preview/drag-preview.component.mjs +0 -21
- package/esm2022/lib/node-entries/entries-model.mjs +0 -24
- package/esm2022/lib/node-entries/items-cap.mjs +0 -47
- package/esm2022/lib/node-entries/list-item-label.pipe.mjs +0 -37
- package/esm2022/lib/node-entries/node-cache.mjs +0 -73
- package/esm2022/lib/node-entries/node-data-source-remote.mjs +0 -4
- package/esm2022/lib/node-entries/node-data-source.mjs +0 -117
- package/esm2022/lib/node-entries/node-entries-card/node-entries-card.component.mjs +0 -117
- package/esm2022/lib/node-entries/node-entries-card-grid/node-entries-card-grid.component.mjs +0 -329
- package/esm2022/lib/node-entries/node-entries-card-small/node-entries-card-small.component.mjs +0 -44
- package/esm2022/lib/node-entries/node-entries-global-options/node-entries-global-options.component.mjs +0 -27
- package/esm2022/lib/node-entries/node-entries-global.service.mjs +0 -71
- package/esm2022/lib/node-entries/node-entries-table/column-chooser/column-chooser.component.mjs +0 -42
- package/esm2022/lib/node-entries/node-entries-table/node-entries-table.component.mjs +0 -294
- package/esm2022/lib/node-entries/node-entries-templates.service.mjs +0 -11
- package/esm2022/lib/node-entries/node-entries-wrapper.component.mjs +0 -369
- package/esm2022/lib/node-entries/node-entries.component.mjs +0 -132
- package/esm2022/lib/node-entries/node-entries.module.mjs +0 -161
- package/esm2022/lib/node-entries/node-rating/node-rating.component.mjs +0 -125
- package/esm2022/lib/node-entries/node-stats-badges/node-stats-badges.component.mjs +0 -48
- package/esm2022/lib/node-entries/node-type-badge/node-type-badge.component.mjs +0 -36
- package/esm2022/lib/node-entries/option-button/option-button.component.mjs +0 -75
- package/esm2022/lib/node-entries/preview-image/preview-image.component.mjs +0 -53
- package/esm2022/lib/node-entries/sort-select-panel/sort-select-panel.component.mjs +0 -41
- package/esm2022/lib/node-url/node-url.component.mjs +0 -132
- package/esm2022/lib/pipes/file-size.pipe.mjs +0 -32
- package/esm2022/lib/pipes/format-date.pipe.mjs +0 -38
- package/esm2022/lib/pipes/mds-duration.pipe.mjs +0 -25
- package/esm2022/lib/pipes/node-icon.pipe.mjs +0 -18
- package/esm2022/lib/pipes/node-image-size.pipe.mjs +0 -24
- package/esm2022/lib/pipes/node-image.pipe.mjs +0 -55
- package/esm2022/lib/pipes/node-license.pipe.mjs +0 -24
- package/esm2022/lib/pipes/node-person-name.pipe.mjs +0 -50
- package/esm2022/lib/pipes/node-title.pipe.mjs +0 -35
- package/esm2022/lib/pipes/option-tooltip.pipe.mjs +0 -33
- package/esm2022/lib/pipes/property-slug.pipe.mjs +0 -16
- package/esm2022/lib/pipes/replace-chars.pipe.mjs +0 -29
- package/esm2022/lib/pipes/vcard-name.pipe.mjs +0 -25
- package/esm2022/lib/services/abstract/app.service.mjs +0 -3
- package/esm2022/lib/services/abstract/keyboard-shortcuts.service.mjs +0 -10
- package/esm2022/lib/services/abstract/options-helper.service.mjs +0 -3
- package/esm2022/lib/services/abstract/toast.service.mjs +0 -3
- package/esm2022/lib/services/accessibility.service.mjs +0 -73
- package/esm2022/lib/services/app-container.service.mjs +0 -69
- package/esm2022/lib/services/local-events.service.mjs +0 -43
- package/esm2022/lib/services/node-entries.service.mjs +0 -201
- package/esm2022/lib/services/node-helper.service.mjs +0 -330
- package/esm2022/lib/services/nodes-drag-drop.service.mjs +0 -155
- package/esm2022/lib/services/options-helper-data.service.mjs +0 -142
- package/esm2022/lib/services/render-helper.service.mjs +0 -114
- package/esm2022/lib/services/repo-url.service.mjs +0 -50
- package/esm2022/lib/services/search-helper.service.mjs +0 -52
- package/esm2022/lib/services/temporary-storage.service.mjs +0 -48
- package/esm2022/lib/services/ui.service.mjs +0 -327
- package/esm2022/lib/sort-dropdown/sort-dropdown.component.mjs +0 -50
- package/esm2022/lib/spinner/spinner.component.mjs +0 -19
- package/esm2022/lib/spinner-small/spinner-small.component.mjs +0 -18
- package/esm2022/lib/translations/fallback-translation-handler.mjs +0 -6
- package/esm2022/lib/translations/translation-loader.mjs +0 -219
- package/esm2022/lib/translations/translation-source.mjs +0 -11
- package/esm2022/lib/translations/translations.module.mjs +0 -82
- package/esm2022/lib/translations/translations.service.mjs +0 -238
- package/esm2022/lib/types/accessibillity.mjs +0 -19
- package/esm2022/lib/types/api-models.mjs +0 -2
- package/esm2022/lib/types/drag-drop.mjs +0 -2
- package/esm2022/lib/types/injection-tokens.mjs +0 -31
- package/esm2022/lib/types/keyboard-shortcuts.mjs +0 -11
- package/esm2022/lib/types/list-item.mjs +0 -41
- package/esm2022/lib/types/option-item.mjs +0 -192
- package/esm2022/lib/types/workflow.mjs +0 -25
- package/esm2022/lib/util/DateHelper.mjs +0 -200
- package/esm2022/lib/util/VCard.mjs +0 -278
- package/esm2022/lib/util/color-helper.mjs +0 -124
- package/esm2022/lib/util/duration-helper.mjs +0 -102
- package/esm2022/lib/util/functions.mjs +0 -13
- package/esm2022/lib/util/helper.mjs +0 -64
- package/esm2022/lib/util/isNumeric.mjs +0 -11
- package/esm2022/lib/util/rest-helper.mjs +0 -42
- package/esm2022/lib/util/ui-animation.mjs +0 -146
- package/esm2022/lib/util/ui-constants.mjs +0 -21
- package/esm2022/ngx-edu-sharing-ui.mjs +0 -5
- package/esm2022/public-api.mjs +0 -2
|
@@ -1,294 +0,0 @@
|
|
|
1
|
-
import { ChangeDetectionStrategy, Component, ViewChild, } from '@angular/core';
|
|
2
|
-
import { MatPaginator } from '@angular/material/paginator';
|
|
3
|
-
import { MatSort } from '@angular/material/sort';
|
|
4
|
-
import * as rxjs from 'rxjs';
|
|
5
|
-
import { BehaviorSubject, Subject } from 'rxjs';
|
|
6
|
-
import { debounceTime, delay, distinctUntilChanged, first, map, shareReplay, startWith, takeUntil, } from 'rxjs/operators';
|
|
7
|
-
import { ClickSource, InteractionType, NodeEntriesDisplayType, } from '../entries-model';
|
|
8
|
-
import { BorderBoxObserverDirective } from '../../directives/border-box-observer.directive';
|
|
9
|
-
import { RestConstants } from 'ngx-edu-sharing-api';
|
|
10
|
-
import { Target } from '../../types/option-item';
|
|
11
|
-
import { DropdownComponent } from '../../dropdown/dropdown.component';
|
|
12
|
-
import { NodeDataSourceRemote } from '../node-data-source-remote';
|
|
13
|
-
import * as i0 from "@angular/core";
|
|
14
|
-
import * as i1 from "../../services/node-entries.service";
|
|
15
|
-
import * as i2 from "../node-entries-global.service";
|
|
16
|
-
import * as i3 from "../../services/abstract/toast.service";
|
|
17
|
-
import * as i4 from "../../translations/translations.service";
|
|
18
|
-
import * as i5 from "../../services/node-helper.service";
|
|
19
|
-
import * as i6 from "../../services/ui.service";
|
|
20
|
-
import * as i7 from "@angular/common";
|
|
21
|
-
import * as i8 from "@angular/forms";
|
|
22
|
-
import * as i9 from "@angular/cdk/a11y";
|
|
23
|
-
import * as i10 from "@angular/cdk/overlay";
|
|
24
|
-
import * as i11 from "@angular/cdk/drag-drop";
|
|
25
|
-
import * as i12 from "../../directives/check-text-overflow.directive";
|
|
26
|
-
import * as i13 from "../../dropdown/dropdown.component";
|
|
27
|
-
import * as i14 from "../../directives/icon.directive";
|
|
28
|
-
import * as i15 from "../../directives/infinite-scroll.directive";
|
|
29
|
-
import * as i16 from "../../node-url/node-url.component";
|
|
30
|
-
import * as i17 from "../../spinner/spinner.component";
|
|
31
|
-
import * as i18 from "../../list-items/list-base/list-base.component";
|
|
32
|
-
import * as i19 from "@angular/material/checkbox";
|
|
33
|
-
import * as i20 from "@angular/material/button";
|
|
34
|
-
import * as i21 from "@angular/material/menu";
|
|
35
|
-
import * as i22 from "@angular/material/table";
|
|
36
|
-
import * as i23 from "@angular/material/core";
|
|
37
|
-
import * as i24 from "@angular/material/sort";
|
|
38
|
-
import * as i25 from "@angular/material/tooltip";
|
|
39
|
-
import * as i26 from "./column-chooser/column-chooser.component";
|
|
40
|
-
import * as i27 from "../drag-preview/drag-preview.component";
|
|
41
|
-
import * as i28 from "../../directives/drag-nodes/nodes-drag.directive";
|
|
42
|
-
import * as i29 from "../../directives/drag-nodes/nodes-drop-target.directive";
|
|
43
|
-
import * as i30 from "../node-entries-global-options/node-entries-global-options.component";
|
|
44
|
-
import * as i31 from "../../pipes/node-icon.pipe";
|
|
45
|
-
import * as i32 from "../../pipes/node-title.pipe";
|
|
46
|
-
import * as i33 from "@ngx-translate/core";
|
|
47
|
-
import * as i34 from "../list-item-label.pipe";
|
|
48
|
-
export class NodeEntriesTableComponent {
|
|
49
|
-
constructor(entriesService, entriesGlobalService, applicationRef, toast, translations, nodeHelperService, changeDetectorRef, ui, ngZone, elementRef) {
|
|
50
|
-
this.entriesService = entriesService;
|
|
51
|
-
this.entriesGlobalService = entriesGlobalService;
|
|
52
|
-
this.applicationRef = applicationRef;
|
|
53
|
-
this.toast = toast;
|
|
54
|
-
this.translations = translations;
|
|
55
|
-
this.nodeHelperService = nodeHelperService;
|
|
56
|
-
this.changeDetectorRef = changeDetectorRef;
|
|
57
|
-
this.ui = ui;
|
|
58
|
-
this.ngZone = ngZone;
|
|
59
|
-
this.elementRef = elementRef;
|
|
60
|
-
this.InteractionType = InteractionType;
|
|
61
|
-
this.ClickSource = ClickSource;
|
|
62
|
-
this.NodeEntriesDisplayType = NodeEntriesDisplayType;
|
|
63
|
-
this.Target = Target;
|
|
64
|
-
this.isPageSelected = new BehaviorSubject(false);
|
|
65
|
-
this.isAllSelected = new BehaviorSubject(false);
|
|
66
|
-
this.columnChooserVisible = false;
|
|
67
|
-
this.columnChooserTriggerReady = false;
|
|
68
|
-
this.pageSizeOptions = [25, 50, 100];
|
|
69
|
-
this.isDragging = false;
|
|
70
|
-
this.maximumColumnsNumber$ = new BehaviorSubject(1);
|
|
71
|
-
this.destroyed = new Subject();
|
|
72
|
-
this.canDrop = (dragData) => {
|
|
73
|
-
return this.entriesService.dragDrop.dropAllowed?.(dragData);
|
|
74
|
-
};
|
|
75
|
-
this.visibleDataColumns$ = this.getVisibleDataColumns();
|
|
76
|
-
this.visibleColumnNames$ = this.getVisibleColumnNames();
|
|
77
|
-
this.registerMaximumColumnsNumber();
|
|
78
|
-
this.entriesService.selection.changed
|
|
79
|
-
.pipe(takeUntil(this.destroyed), debounceTime(0))
|
|
80
|
-
.subscribe(() => this.changeDetectorRef.detectChanges());
|
|
81
|
-
}
|
|
82
|
-
ngAfterViewInit() {
|
|
83
|
-
void Promise.resolve().then(() => {
|
|
84
|
-
this.registerSortChanges();
|
|
85
|
-
if (this.entriesService.dataSource instanceof NodeDataSourceRemote) {
|
|
86
|
-
this.entriesService.dataSource.sortPanel = this.sort;
|
|
87
|
-
}
|
|
88
|
-
});
|
|
89
|
-
this.visibleDataColumns$
|
|
90
|
-
.pipe(first(), delay(0))
|
|
91
|
-
.subscribe(() => (this.columnChooserTriggerReady = true));
|
|
92
|
-
rxjs.combineLatest([
|
|
93
|
-
this.entriesService.dataSource$.pipe(startWith(void 0)),
|
|
94
|
-
this.entriesService.options$.pipe(startWith(void 0)),
|
|
95
|
-
this.entriesService.dataSource.isLoadingSubject.pipe(startWith(void 0)),
|
|
96
|
-
this.entriesService.selection.changed.pipe(startWith(void 0)),
|
|
97
|
-
this.translations.waitForInit().pipe(startWith(void 0)),
|
|
98
|
-
])
|
|
99
|
-
.pipe(takeUntil(this.destroyed))
|
|
100
|
-
.subscribe(() => {
|
|
101
|
-
this.changeDetectorRef.detectChanges();
|
|
102
|
-
});
|
|
103
|
-
}
|
|
104
|
-
ngOnChanges(changes) {
|
|
105
|
-
this.updateSort();
|
|
106
|
-
}
|
|
107
|
-
ngOnDestroy() {
|
|
108
|
-
this.destroyed.next();
|
|
109
|
-
this.destroyed.complete();
|
|
110
|
-
}
|
|
111
|
-
onRowContextMenu({ event, node }) {
|
|
112
|
-
event.stopPropagation();
|
|
113
|
-
event.preventDefault();
|
|
114
|
-
if (!this.dropdown) {
|
|
115
|
-
// Call `preventDefault()` even when there is no menu, so we can use `cdkDrag` with a
|
|
116
|
-
// start delay without being interrupted by the standard long-tap action.
|
|
117
|
-
return;
|
|
118
|
-
}
|
|
119
|
-
if (event instanceof MouseEvent) {
|
|
120
|
-
({ clientX: this.dropdownLeft, clientY: this.dropdownTop } = event);
|
|
121
|
-
}
|
|
122
|
-
else {
|
|
123
|
-
({ x: this.dropdownLeft, y: this.dropdownTop } = event.target.getBoundingClientRect());
|
|
124
|
-
}
|
|
125
|
-
this.entriesService.openDropdown(this.dropdown, node, () => this.menuTrigger.openMenu());
|
|
126
|
-
}
|
|
127
|
-
updateSort() {
|
|
128
|
-
this.sort.sort({
|
|
129
|
-
id: this.entriesService.sort?.active,
|
|
130
|
-
start: this.entriesService.sort?.direction,
|
|
131
|
-
disableClear: false,
|
|
132
|
-
});
|
|
133
|
-
// Fix missing sorting indicators. See
|
|
134
|
-
// https://github.com/angular/components/issues/10242#issuecomment-470726829. Seems
|
|
135
|
-
// to be fixed upstream with Angular 11.
|
|
136
|
-
this.sort.sortables.get(this.entriesService.sort?.active)._setAnimationTransitionState({
|
|
137
|
-
toState: 'active',
|
|
138
|
-
});
|
|
139
|
-
/*
|
|
140
|
-
this.route.queryParams.pipe(first()).subscribe((queryParams: Params) => {
|
|
141
|
-
const sort: Sort = queryParams.sort ? JSON.parse(queryParams.sort) : null;
|
|
142
|
-
if (sort && sort.direction) {
|
|
143
|
-
this.sort.sort({ id: sort.active, start: sort.direction, disableClear: false });
|
|
144
|
-
// Fix missing sorting indicators. See
|
|
145
|
-
// https://github.com/angular/components/issues/10242#issuecomment-470726829. Seems
|
|
146
|
-
// to be fixed upstream with Angular 11.
|
|
147
|
-
(
|
|
148
|
-
this.sort.sortables.get(sort.active) as MatSortHeader
|
|
149
|
-
)._setAnimationTransitionState({
|
|
150
|
-
toState: 'active',
|
|
151
|
-
});
|
|
152
|
-
}
|
|
153
|
-
if (queryParams.pageIndex && queryParams.pageSize) {
|
|
154
|
-
this.paginator.pageIndex = queryParams.pageIndex;
|
|
155
|
-
this.paginator.pageSize = queryParams.pageSize;
|
|
156
|
-
}
|
|
157
|
-
});
|
|
158
|
-
*/
|
|
159
|
-
}
|
|
160
|
-
registerMaximumColumnsNumber() {
|
|
161
|
-
BorderBoxObserverDirective.observeElement(this.elementRef)
|
|
162
|
-
.pipe(takeUntil(this.destroyed), map((box) => this.getMaximumColumnsNumber(box.width)), distinctUntilChanged())
|
|
163
|
-
.subscribe((maximumColumnsNumber) => this.ngZone.run(() => this.maximumColumnsNumber$.next(maximumColumnsNumber)));
|
|
164
|
-
}
|
|
165
|
-
getMaximumColumnsNumber(tableWidth) {
|
|
166
|
-
return Math.max(1, Math.floor(
|
|
167
|
-
// Subtract total width of always visible columns like checkboxes and icons.
|
|
168
|
-
(tableWidth - 187) /
|
|
169
|
-
// Divide by with of data columns (including margin).
|
|
170
|
-
126));
|
|
171
|
-
}
|
|
172
|
-
getVisibleDataColumns() {
|
|
173
|
-
return rxjs
|
|
174
|
-
.combineLatest([
|
|
175
|
-
this.maximumColumnsNumber$,
|
|
176
|
-
this.entriesService.columnsSubject.pipe(map((c) => c?.columns)),
|
|
177
|
-
])
|
|
178
|
-
.pipe(map(([maximumColumnsNumber, columns]) => {
|
|
179
|
-
return (columns ?? [])
|
|
180
|
-
.filter((column) => column.visible)
|
|
181
|
-
.filter((_, index) => index < maximumColumnsNumber);
|
|
182
|
-
}), shareReplay(1));
|
|
183
|
-
}
|
|
184
|
-
getVisibleColumnNames() {
|
|
185
|
-
return this.visibleDataColumns$.pipe(map((visibleDataColumns) => {
|
|
186
|
-
const columns = [];
|
|
187
|
-
if (this.entriesService.checkbox) {
|
|
188
|
-
columns.push('select');
|
|
189
|
-
}
|
|
190
|
-
columns.push('icon');
|
|
191
|
-
return columns.concat(visibleDataColumns.map((c) => c.name)).concat(['actions']);
|
|
192
|
-
}), shareReplay(1));
|
|
193
|
-
}
|
|
194
|
-
isSortable(column) {
|
|
195
|
-
return this.entriesService.sort?.columns?.some((c) => c.type === column.type && c.name === column.name);
|
|
196
|
-
}
|
|
197
|
-
toggleAll(checked) {
|
|
198
|
-
if (checked) {
|
|
199
|
-
this.entriesService.selection.select(...this.entriesService.dataSource.getData());
|
|
200
|
-
}
|
|
201
|
-
else {
|
|
202
|
-
this.entriesService.selection.clear();
|
|
203
|
-
}
|
|
204
|
-
}
|
|
205
|
-
registerSortChanges() {
|
|
206
|
-
this.sort.sortChange.subscribe((sort) => {
|
|
207
|
-
this.entriesService.sort.active = sort.active;
|
|
208
|
-
this.entriesService.sort.direction = sort.direction;
|
|
209
|
-
this.entriesService.sortChange.emit(this.entriesService.sort);
|
|
210
|
-
/*this.router.navigate(['.'], {
|
|
211
|
-
relativeTo: this.route,
|
|
212
|
-
queryParams: { sort: JSON.stringify(sort) },
|
|
213
|
-
queryParamsHandling: 'merge',
|
|
214
|
-
replaceUrl: true,
|
|
215
|
-
});*/
|
|
216
|
-
});
|
|
217
|
-
/*
|
|
218
|
-
this.paginator.page
|
|
219
|
-
.pipe(
|
|
220
|
-
// As a response to changes of other parameters, the pageIndex might be reset to 0 and a
|
|
221
|
-
// page event triggers. This change of other parameters is likely to cause a
|
|
222
|
-
// `router.navigate()` call elsewhere. When this happens just before our call, our
|
|
223
|
-
// updates are ignored. To shield against this, we wait a tick.
|
|
224
|
-
delay(0),
|
|
225
|
-
)
|
|
226
|
-
.subscribe(({ pageIndex, pageSize }: PageEvent) => {
|
|
227
|
-
this.router.navigate(['.'], {
|
|
228
|
-
relativeTo: this.route,
|
|
229
|
-
queryParams: { pageIndex, pageSize },
|
|
230
|
-
queryParamsHandling: 'merge',
|
|
231
|
-
replaceUrl: true,
|
|
232
|
-
});
|
|
233
|
-
});
|
|
234
|
-
*/
|
|
235
|
-
}
|
|
236
|
-
drop(dragData) {
|
|
237
|
-
this.entriesService.dragDrop.dropped(dragData.target, {
|
|
238
|
-
element: dragData.draggedNodes,
|
|
239
|
-
mode: dragData.action,
|
|
240
|
-
});
|
|
241
|
-
}
|
|
242
|
-
getDragData(node) {
|
|
243
|
-
const selection = this.entriesService.selection;
|
|
244
|
-
if (selection.isSelected(node)) {
|
|
245
|
-
return selection.selected;
|
|
246
|
-
}
|
|
247
|
-
else {
|
|
248
|
-
return [node];
|
|
249
|
-
}
|
|
250
|
-
}
|
|
251
|
-
onDragStarted(node) {
|
|
252
|
-
if (!this.entriesService.selection.isSelected(node)) {
|
|
253
|
-
this.entriesService.selection.clear();
|
|
254
|
-
this.entriesService.selection.select(node);
|
|
255
|
-
}
|
|
256
|
-
this.isDragging = true;
|
|
257
|
-
}
|
|
258
|
-
onDragEnded() {
|
|
259
|
-
this.isDragging = false;
|
|
260
|
-
}
|
|
261
|
-
loadData(source) {
|
|
262
|
-
// TODO: focus next item when triggered via button.
|
|
263
|
-
this.entriesService.loadMore(source);
|
|
264
|
-
}
|
|
265
|
-
async openMenu(node) {
|
|
266
|
-
this.entriesService.openDropdown(this.dropdown, node);
|
|
267
|
-
}
|
|
268
|
-
isBlocked(node) {
|
|
269
|
-
return (node.properties?.[RestConstants.CCM_PROP_IMPORT_BLOCKED]?.[0] === 'true' ||
|
|
270
|
-
this.nodeHelperService.isNodeRevoked(node));
|
|
271
|
-
}
|
|
272
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: NodeEntriesTableComponent, deps: [{ token: i1.NodeEntriesService }, { token: i2.NodeEntriesGlobalService }, { token: i0.ApplicationRef }, { token: i3.Toast }, { token: i4.TranslationsService }, { token: i5.NodeHelperService }, { token: i0.ChangeDetectorRef }, { token: i6.UIService }, { token: i0.NgZone }, { token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
273
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.12", type: NodeEntriesTableComponent, selector: "es-node-entries-table", viewQueries: [{ propertyName: "sort", first: true, predicate: MatSort, descendants: true }, { propertyName: "paginator", first: true, predicate: MatPaginator, descendants: true }, { propertyName: "columnChooserTrigger", first: true, predicate: ["columnChooserTrigger"], descendants: true }, { propertyName: "dropdown", first: true, predicate: DropdownComponent, descendants: true }, { propertyName: "menuTrigger", first: true, predicate: ["menuTrigger"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<es-dropdown #dropdown [options]=\"entriesService.options?.[Target.ListDropdown]\"></es-dropdown>\n<button\n #menuTrigger=\"matMenuTrigger\"\n mat-button\n class=\"dropdown-dummy cdk-visually-hidden\"\n [style.left.px]=\"dropdownLeft\"\n [style.top.px]=\"dropdownTop\"\n [matMenuTriggerFor]=\"dropdown.menu\"\n tabindex=\"-1\"\n aria-hidden=\"true\"\n></button>\n<es-node-entries-global-options\n *ngIf=\"(entriesService.globalOptionsSubject | async)?.length\"\n [displayType]=\"NodeEntriesDisplayType.Table\"\n>\n</es-node-entries-global-options>\n<mat-table\n [dataSource]=\"entriesService.dataSource\"\n matSort\n [matSortDisableClear]=\"true\"\n [matSortActive]=\"entriesService.sort?.active\"\n [matSortDirection]=\"entriesService.sort?.direction\"\n esInfiniteScroll\n (scrolled)=\"loadData('scroll')\"\n>\n <!-- Checkbox Column -->\n <ng-container matColumnDef=\"select\">\n <mat-header-cell *matHeaderCellDef>\n <mat-checkbox\n [ngModel]=\"entriesService.selection.selected.length > 0\"\n [indeterminate]=\"\n entriesService.selection.selected.length > 0 &&\n entriesService.selection.selected.length !== entriesService.dataSource.getData().length\n \"\n (ngModelChange)=\"toggleAll($event)\"\n color=\"primary\"\n aria-label=\"{{ 'LIST_TABLE.TOGGLE_ALL' | translate }}\"\n ></mat-checkbox>\n </mat-header-cell>\n <mat-cell *matCellDef=\"let node\">\n <mat-checkbox\n [checked]=\"entriesService.selection.isSelected(node)\"\n (change)=\"entriesService.onCheckboxChanged(node, $event.checked)\"\n aria-label=\"{{ 'SELECT' | translate : { element: (node | nodeTitle) } }}\"\n color=\"primary\"\n ></mat-checkbox>\n </mat-cell>\n </ng-container>\n <div matColumnDef=\"icon\">\n <mat-header-cell *matHeaderCellDef class=\"cell-icon cell-count\">\n ({{ entriesService.selection.selected.length\n }}<ng-container *ngIf=\"entriesService.dataSource?.getTotal() !== undefined\">\n / {{ entriesService.dataSource?.getTotal() }}</ng-container\n >)\n </mat-header-cell>\n <mat-cell *matCellDef=\"let node\" class=\"cell-icon\">\n <ng-container\n *ngIf=\"entriesService.elementInteractionType === InteractionType.DefaultActionLink\"\n >\n <ng-container *ngTemplateOutlet=\"icon; context: { node: this.node }\"></ng-container>\n </ng-container>\n <div\n *ngIf=\"entriesService.elementInteractionType !== InteractionType.DefaultActionLink\"\n (click)=\"\n entriesService.onClicked({ event: $event, element: node, source: ClickSource.Icon })\n \"\n (dblclick)=\"entriesService.dblClickItem.emit({ element: node, source: ClickSource.Icon })\"\n >\n <ng-container\n *ngTemplateOutlet=\"icon; context: { node: this.node }\"\n (click)=\"\n entriesService.onClicked({ event: $event, element: node, source: ClickSource.Icon })\n \"\n (dblclick)=\"entriesService.dblClickItem.emit({ element: node, source: ClickSource.Icon })\"\n ></ng-container>\n </div>\n </mat-cell>\n </div>\n <ng-container matColumnDef=\"actions\">\n <mat-header-cell *matHeaderCellDef>\n <button\n *ngIf=\"entriesService.configureColumns\"\n mat-icon-button\n (click)=\"columnChooserVisible = !columnChooserVisible\"\n cdkOverlayOrigin\n #columnChooserTrigger=\"cdkOverlayOrigin\"\n [matTooltip]=\"'LIST_TABLE.CONFIGURE_COLUMNS' | translate\"\n [attr.aria-label]=\"'LIST_TABLE.CONFIGURE_COLUMNS' | translate\"\n >\n <i esIcon=\"settings\"></i>\n </button>\n </mat-header-cell>\n <mat-cell *matCellDef=\"let node\">\n <button\n mat-icon-button\n *ngIf=\"entriesService.options?.[Target.List]?.length\"\n color=\"primary\"\n (click)=\"openMenu(node)\"\n [matMenuTriggerFor]=\"dropdown.menu\"\n >\n <i esIcon=\"more_vert\" [aria]=\"true\"></i>\n </button>\n </mat-cell>\n </ng-container>\n <!-- Data Columns -->\n <ng-container\n *ngFor=\"let column of visibleDataColumns$ | async; let first = first\"\n [matColumnDef]=\"column.name\"\n >\n <ng-container>\n <mat-header-cell\n *matHeaderCellDef\n mat-sort-header\n [disabled]=\"!(entriesService.sort?.allowed && isSortable(column))\"\n [class.mat-column-primary]=\"first\"\n >{{ column | esListItemLabel | async }}</mat-header-cell\n >\n </ng-container>\n <mat-cell\n *matCellDef=\"let node\"\n #cell\n [class.mat-column-primary]=\"first\"\n attr.data-test=\"table-cell-{{ column.name }}\"\n >\n <ng-container\n *ngIf=\"entriesService.elementInteractionType === InteractionType.DefaultActionLink\"\n >\n <es-node-url cdkMonitorSubtreeFocus [node]=\"node\" [mode]=\"first ? 'link' : 'wrapper'\">\n <es-list-base\n [forceText]=\"true\"\n [node]=\"node\"\n [item]=\"column\"\n esCheckTextOverflow\n #text=\"esCheckTextOverflow\"\n [matTooltip]=\"text.hasTextOverflow() ? cell.innerText : null\"\n matTooltipTouchGestures=\"off\"\n ></es-list-base>\n </es-node-url>\n </ng-container>\n <es-list-base\n *ngIf=\"entriesService.elementInteractionType !== InteractionType.DefaultActionLink\"\n [forceText]=\"true\"\n [node]=\"node\"\n [item]=\"column\"\n (click)=\"\n entriesService.onClicked({\n event: $event,\n element: node,\n source: ClickSource.Metadata,\n attribute: column,\n })\n \"\n (dblclick)=\"\n entriesService.dblClickItem.emit({\n element: node,\n source: ClickSource.Metadata,\n attribute: column,\n })\n \"\n ></es-list-base>\n <ng-container *ngIf=\"first\">\n <div class=\"childobjects\" *ngIf=\"node.properties?.['virtual:childobjectcount'] > 0\">\n <div\n class=\"childobject-count\"\n matTooltip=\"{{\n 'CHILDOBJECT_COUNT'\n | translate : { count: node.properties['virtual:childobjectcount'] * 1 + 1 }\n }}\"\n >\n <span>{{ node.properties['virtual:childobjectcount'] * 1 + 1 }}</span\n ><i esIcon=\"filter_none\"></i>\n </div>\n </div>\n </ng-container>\n </mat-cell>\n </ng-container>\n <mat-header-row mat-header-row *matHeaderRowDef=\"visibleColumnNames$ | async\"></mat-header-row>\n <mat-row\n mat-row\n matRipple\n cdkDrag\n esNodesDrag\n [cdkDragDisabled]=\"!entriesService.dragDrop?.dragAllowed || (ui.isTouchSubject | async)\"\n [cdkDragData]=\"getDragData(node)\"\n (cdkDragStarted)=\"onDragStarted(node)\"\n (cdkDragEnded)=\"onDragEnded()\"\n [esNodesDropTarget]=\"node\"\n [canDropNodes]=\"canDrop\"\n (nodeDropped)=\"drop($event)\"\n class=\"mat-row\"\n [class.mat-row-selected]=\"entriesService.selection.isSelected(node)\"\n [class.mat-row-import-blocked]=\"isBlocked(node)\"\n [class.selected-when-dragging]=\"isDragging && entriesService.selection.isSelected(node)\"\n [class.mat-row-virtual]=\"node.virtual\"\n [class.mat-row-virtual-first]=\"\n node.virtual && !$any(entriesService.dataSource.getData()[i - 1])?.virtual\n \"\n [class.mat-row-virtual-last]=\"\n node.virtual && !$any(entriesService.dataSource.getData()[i + 1])?.virtual\n \"\n [class.dynamic-single-click]=\"entriesService.singleClickHint === 'dynamic'\"\n *matRowDef=\"let node; let i = index; let last = last; columns: visibleColumnNames$ | async\"\n (contextmenu)=\"onRowContextMenu({ event: $event, node: node })\"\n (keydown.ContextMenu)=\"onRowContextMenu({ event: $event, node: node })\"\n >\n <es-drag-preview\n *cdkDragPreview\n [node]=\"node\"\n [selected]=\"entriesService.selection.selected\"\n [item]=\"(visibleDataColumns$ | async)[0]\"\n ></es-drag-preview>\n </mat-row>\n</mat-table>\n<ng-container\n *ngIf=\"\n (entriesService.dataSource.isLoadingSubject | async) === false &&\n entriesService.dataSource.hasMore() &&\n entriesService.paginationStrategy === 'infinite-scroll'\n \"\n>\n <div class=\"load-more\">\n <button mat-button color=\"primary\" (click)=\"loadData('button')\">\n <i esIcon=\"refresh\"></i>\n <span>{{ 'LOAD_MORE' | translate }}</span>\n </button>\n </div>\n</ng-container>\n<ng-container *ngIf=\"entriesService.dataSource.isLoadingSubject | async\">\n <ng-container *ngTemplateOutlet=\"loading\"> </ng-container>\n</ng-container>\n<!--\n<mat-paginator #paginator [pageSizeOptions]=\"pageSizeOptions\"></mat-paginator>\n-->\n\n<!-- Wait for ready state to avoid changed-after-checked error when `columnChooserTrigger` becomes\navailable. -->\n<es-column-chooser\n *ngIf=\"columnChooserTriggerReady\"\n [(columns)]=\"entriesService.columns\"\n [(columnChooserVisible)]=\"columnChooserVisible\"\n [origin]=\"columnChooserTrigger\"\n></es-column-chooser>\n<ng-template #loading>\n <es-spinner></es-spinner>\n</ng-template>\n<ng-template #icon let-node=\"node\">\n <div class=\"icon-bg\">\n <img\n *ngIf=\"node.iconURL\"\n [src]=\"node | esNodeIcon | async\"\n [alt]=\"\n node.mediatype\n ? ('NODE.mediatype' | translate) + ': ' + ('MEDIATYPE.' + node.mediatype | translate)\n : ''\n \"\n [matTooltip]=\"\n node.mediatype\n ? ('NODE.mediatype' | translate) + ': ' + ('MEDIATYPE.' + node.mediatype | translate)\n : ''\n \"\n matTooltipTouchGestures=\"off\"\n />\n <i\n *ngIf=\"!node.iconURL\"\n [esIcon]=\"node.authorityType ? (node.authorityType === 'GROUP' ? 'group' : 'person') : null\"\n ></i>\n </div>\n</ng-template>\n", styles: [":host{display:flex;flex-direction:column}:host ::ng-deep mat-header-cell{color:var(--textMediumLight)}:host ::ng-deep mat-cell,:host ::ng-deep mat-header-cell{margin:0!important}:host ::ng-deep mat-cell es-node-url{width:100%}:host ::ng-deep mat-cell es-node-url a{color:#000}:host ::ng-deep mat-cell es-node-url.cdk-keyboard-focused{outline:none;border:2px solid var(--palette-primary-300)}:host ::ng-deep es-list-base{white-space:nowrap;text-overflow:ellipsis;overflow:hidden;display:inline;width:100%;padding:20.3px 0;align-items:center}:host ::ng-deep es-list-base>div{display:inline}:host ::ng-deep es-list-base>div>div{display:inline}mat-header-cell,mat-cell{margin:0 3px}mat-header-cell:not(.mat-column-primary),mat-cell:not(.mat-column-primary){flex:0 145px}mat-header-cell.mat-column-primary,mat-cell.mat-column-primary{min-width:30%}mat-header-cell.mat-column-select,mat-cell.mat-column-select{flex:0 58px;min-width:58px;padding-left:14px}mat-header-cell.mat-column-icon,mat-cell.mat-column-icon{flex:0 85px;min-width:85px;justify-content:center}mat-header-cell.mat-column-actions,mat-cell.mat-column-actions{flex:0 58px;min-width:58px;display:flex;justify-content:flex-end;padding-right:5px}.mat-row{background:unset}.mat-row.dynamic-single-click{cursor:pointer}.mat-row.dynamic-single-click:hover{background-color:rgb(var(--palette-primary-50))}.mat-row.mat-row-import-blocked{opacity:.75;text-decoration:line-through}.mat-row.mat-row-selected{background:var(--listItemSelectedBackgroundEffect)}.mat-row.mat-row-selected .mat-mdc-cell{background:transparent}.mat-row.mat-row-virtual{background:linear-gradient(to right,var(--nodeVirtualColor) 5px,transparent 5px) no-repeat;border-right:2px dashed var(--nodeVirtualColorLight)}.mat-row.mat-row-virtual .mat-mdc-cell{background:transparent}.mat-row.mat-row-virtual.mat-row-selected{background:linear-gradient(to right,var(--nodeVirtualColor) 0,var(--nodeVirtualColor) 5px,var(--listItemSelectedBackground) 5px,var(--listItemSelectedBackground) 5px)}.mat-row.mat-row-virtual-first{border-top:2px dashed var(--nodeVirtualColorLight)}.mat-row.mat-row-virtual-last{border-bottom:2px dashed var(--nodeVirtualColorLight)}.mat-row.selected-when-dragging{opacity:.5}.dropdown-dummy{position:fixed}.childobjects{background-color:#0000000d;border-radius:15px;display:inline-flex;align-items:center;min-width:51px;min-height:26px;justify-content:center;cursor:default;-webkit-user-select:none;user-select:none;padding:2px 8px;margin-left:5px}.childobjects>.childobject-count{display:inline-flex;align-items:center}.childobjects>.childobject-count>i{font-size:13px;margin-left:4px}.cell-icon .icon-bg{width:36px;height:36px;padding:3px;margin:1px 0;background-color:#fff;border-radius:50%;display:flex;justify-content:center;align-items:center;box-shadow:0 0 3px #0000004d}.cell-icon .icon-bg>img{width:18px;height:auto}.cell-icon .icon-bg>i{color:#666;font-size:18px}.mat-column-link{flex:0 60px}.mat-column-link a,.load-more{display:flex;justify-content:center}es-node-entries-global-options{padding:20px 0}\n"], dependencies: [{ kind: "directive", type: i7.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i7.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i7.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i8.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i8.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i9.CdkMonitorFocus, selector: "[cdkMonitorElementFocus], [cdkMonitorSubtreeFocus]", outputs: ["cdkFocusChange"], exportAs: ["cdkMonitorFocus"] }, { kind: "directive", type: i10.CdkOverlayOrigin, selector: "[cdk-overlay-origin], [overlay-origin], [cdkOverlayOrigin]", exportAs: ["cdkOverlayOrigin"] }, { kind: "directive", type: i11.CdkDrag, selector: "[cdkDrag]", inputs: ["cdkDragData", "cdkDragLockAxis", "cdkDragRootElement", "cdkDragBoundary", "cdkDragStartDelay", "cdkDragFreeDragPosition", "cdkDragDisabled", "cdkDragConstrainPosition", "cdkDragPreviewClass", "cdkDragPreviewContainer", "cdkDragScale"], outputs: ["cdkDragStarted", "cdkDragReleased", "cdkDragEnded", "cdkDragEntered", "cdkDragExited", "cdkDragDropped", "cdkDragMoved"], exportAs: ["cdkDrag"] }, { kind: "directive", type: i11.CdkDragPreview, selector: "ng-template[cdkDragPreview]", inputs: ["data", "matchSize"] }, { kind: "directive", type: i12.CheckTextOverflowDirective, selector: "[esCheckTextOverflow]", inputs: ["esCheckTextOverflow"], exportAs: ["esCheckTextOverflow"] }, { kind: "component", type: i13.DropdownComponent, selector: "es-dropdown", inputs: ["position", "options", "callbackObjects", "showDisabled", "menuClass"] }, { kind: "directive", type: i14.IconDirective, selector: "i[esIcon], i.material-icons", inputs: ["altText", "aria", "esIcon"] }, { kind: "directive", type: i15.InfiniteScrollDirective, selector: "[esInfiniteScroll], [infinite-scroll], [data-infinite-scroll]", inputs: ["infiniteScrollDistance", "infiniteScrollThrottle", "scrollWindow"], outputs: ["scrolled"] }, { kind: "component", type: i16.NodeUrlComponent, selector: "es-node-url", inputs: ["node", "nodes", "target", "scope", "queryParams", "mode", "disabled", "alwaysRipple", "aria-describedby", "aria-label"], outputs: ["buttonClick"] }, { kind: "component", type: i17.SpinnerComponent, selector: "es-spinner" }, { kind: "component", type: i18.ListBaseComponent, selector: "es-list-base", inputs: ["forceText"] }, { kind: "component", type: i19.MatCheckbox, selector: "mat-checkbox", inputs: ["aria-label", "aria-labelledby", "aria-describedby", "id", "required", "labelPosition", "name", "value", "disableRipple", "tabIndex", "color", "disabledInteractive", "checked", "disabled", "indeterminate"], outputs: ["change", "indeterminateChange"], exportAs: ["matCheckbox"] }, { kind: "component", type: i20.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "component", type: i20.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "directive", type: i21.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", inputs: ["mat-menu-trigger-for", "matMenuTriggerFor", "matMenuTriggerData", "matMenuTriggerRestoreFocus"], outputs: ["menuOpened", "onMenuOpen", "menuClosed", "onMenuClose"], exportAs: ["matMenuTrigger"] }, { kind: "component", type: i22.MatTable, selector: "mat-table, table[mat-table]", exportAs: ["matTable"] }, { kind: "directive", type: i22.MatHeaderCellDef, selector: "[matHeaderCellDef]" }, { kind: "directive", type: i22.MatHeaderRowDef, selector: "[matHeaderRowDef]", inputs: ["matHeaderRowDef", "matHeaderRowDefSticky"] }, { kind: "directive", type: i22.MatColumnDef, selector: "[matColumnDef]", inputs: ["matColumnDef"] }, { kind: "directive", type: i22.MatCellDef, selector: "[matCellDef]" }, { kind: "directive", type: i22.MatRowDef, selector: "[matRowDef]", inputs: ["matRowDefColumns", "matRowDefWhen"] }, { kind: "directive", type: i22.MatHeaderCell, selector: "mat-header-cell, th[mat-header-cell]" }, { kind: "directive", type: i22.MatCell, selector: "mat-cell, td[mat-cell]" }, { kind: "component", type: i22.MatHeaderRow, selector: "mat-header-row, tr[mat-header-row]", exportAs: ["matHeaderRow"] }, { kind: "component", type: i22.MatRow, selector: "mat-row, tr[mat-row]", exportAs: ["matRow"] }, { kind: "directive", type: i23.MatRipple, selector: "[mat-ripple], [matRipple]", inputs: ["matRippleColor", "matRippleUnbounded", "matRippleCentered", "matRippleRadius", "matRippleAnimation", "matRippleDisabled", "matRippleTrigger"], exportAs: ["matRipple"] }, { kind: "directive", type: i24.MatSort, selector: "[matSort]", inputs: ["matSortActive", "matSortStart", "matSortDirection", "matSortDisableClear", "matSortDisabled"], outputs: ["matSortChange"], exportAs: ["matSort"] }, { kind: "component", type: i24.MatSortHeader, selector: "[mat-sort-header]", inputs: ["mat-sort-header", "arrowPosition", "start", "disabled", "sortActionDescription", "disableClear"], exportAs: ["matSortHeader"] }, { kind: "directive", type: i25.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "component", type: i26.ColumnChooserComponent, selector: "es-column-chooser", inputs: ["origin", "columnChooserVisible", "columns"], outputs: ["columnChooserVisibleChange", "columnsChange"] }, { kind: "component", type: i27.DragPreviewComponent, selector: "es-drag-preview", inputs: ["node", "selected", "item"] }, { kind: "directive", type: i28.NodesDragDirective, selector: "[esNodesDrag]" }, { kind: "directive", type: i29.NodesDropTargetDirective, selector: "[esNodesDropTarget]", inputs: ["esNodesDropTarget", "canDropNodes"], outputs: ["nodeDropped"], exportAs: ["esNodesDropTarget"] }, { kind: "component", type: i30.NodeEntriesGlobalOptionsComponent, selector: "es-node-entries-global-options", inputs: ["displayType"] }, { kind: "pipe", type: i7.AsyncPipe, name: "async" }, { kind: "pipe", type: i31.NodeIconPipe, name: "esNodeIcon" }, { kind: "pipe", type: i32.NodeTitlePipe, name: "nodeTitle" }, { kind: "pipe", type: i33.TranslatePipe, name: "translate" }, { kind: "pipe", type: i34.ListItemLabelPipe, name: "esListItemLabel" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
274
|
-
}
|
|
275
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: NodeEntriesTableComponent, decorators: [{
|
|
276
|
-
type: Component,
|
|
277
|
-
args: [{ selector: 'es-node-entries-table', changeDetection: ChangeDetectionStrategy.OnPush, template: "<es-dropdown #dropdown [options]=\"entriesService.options?.[Target.ListDropdown]\"></es-dropdown>\n<button\n #menuTrigger=\"matMenuTrigger\"\n mat-button\n class=\"dropdown-dummy cdk-visually-hidden\"\n [style.left.px]=\"dropdownLeft\"\n [style.top.px]=\"dropdownTop\"\n [matMenuTriggerFor]=\"dropdown.menu\"\n tabindex=\"-1\"\n aria-hidden=\"true\"\n></button>\n<es-node-entries-global-options\n *ngIf=\"(entriesService.globalOptionsSubject | async)?.length\"\n [displayType]=\"NodeEntriesDisplayType.Table\"\n>\n</es-node-entries-global-options>\n<mat-table\n [dataSource]=\"entriesService.dataSource\"\n matSort\n [matSortDisableClear]=\"true\"\n [matSortActive]=\"entriesService.sort?.active\"\n [matSortDirection]=\"entriesService.sort?.direction\"\n esInfiniteScroll\n (scrolled)=\"loadData('scroll')\"\n>\n <!-- Checkbox Column -->\n <ng-container matColumnDef=\"select\">\n <mat-header-cell *matHeaderCellDef>\n <mat-checkbox\n [ngModel]=\"entriesService.selection.selected.length > 0\"\n [indeterminate]=\"\n entriesService.selection.selected.length > 0 &&\n entriesService.selection.selected.length !== entriesService.dataSource.getData().length\n \"\n (ngModelChange)=\"toggleAll($event)\"\n color=\"primary\"\n aria-label=\"{{ 'LIST_TABLE.TOGGLE_ALL' | translate }}\"\n ></mat-checkbox>\n </mat-header-cell>\n <mat-cell *matCellDef=\"let node\">\n <mat-checkbox\n [checked]=\"entriesService.selection.isSelected(node)\"\n (change)=\"entriesService.onCheckboxChanged(node, $event.checked)\"\n aria-label=\"{{ 'SELECT' | translate : { element: (node | nodeTitle) } }}\"\n color=\"primary\"\n ></mat-checkbox>\n </mat-cell>\n </ng-container>\n <div matColumnDef=\"icon\">\n <mat-header-cell *matHeaderCellDef class=\"cell-icon cell-count\">\n ({{ entriesService.selection.selected.length\n }}<ng-container *ngIf=\"entriesService.dataSource?.getTotal() !== undefined\">\n / {{ entriesService.dataSource?.getTotal() }}</ng-container\n >)\n </mat-header-cell>\n <mat-cell *matCellDef=\"let node\" class=\"cell-icon\">\n <ng-container\n *ngIf=\"entriesService.elementInteractionType === InteractionType.DefaultActionLink\"\n >\n <ng-container *ngTemplateOutlet=\"icon; context: { node: this.node }\"></ng-container>\n </ng-container>\n <div\n *ngIf=\"entriesService.elementInteractionType !== InteractionType.DefaultActionLink\"\n (click)=\"\n entriesService.onClicked({ event: $event, element: node, source: ClickSource.Icon })\n \"\n (dblclick)=\"entriesService.dblClickItem.emit({ element: node, source: ClickSource.Icon })\"\n >\n <ng-container\n *ngTemplateOutlet=\"icon; context: { node: this.node }\"\n (click)=\"\n entriesService.onClicked({ event: $event, element: node, source: ClickSource.Icon })\n \"\n (dblclick)=\"entriesService.dblClickItem.emit({ element: node, source: ClickSource.Icon })\"\n ></ng-container>\n </div>\n </mat-cell>\n </div>\n <ng-container matColumnDef=\"actions\">\n <mat-header-cell *matHeaderCellDef>\n <button\n *ngIf=\"entriesService.configureColumns\"\n mat-icon-button\n (click)=\"columnChooserVisible = !columnChooserVisible\"\n cdkOverlayOrigin\n #columnChooserTrigger=\"cdkOverlayOrigin\"\n [matTooltip]=\"'LIST_TABLE.CONFIGURE_COLUMNS' | translate\"\n [attr.aria-label]=\"'LIST_TABLE.CONFIGURE_COLUMNS' | translate\"\n >\n <i esIcon=\"settings\"></i>\n </button>\n </mat-header-cell>\n <mat-cell *matCellDef=\"let node\">\n <button\n mat-icon-button\n *ngIf=\"entriesService.options?.[Target.List]?.length\"\n color=\"primary\"\n (click)=\"openMenu(node)\"\n [matMenuTriggerFor]=\"dropdown.menu\"\n >\n <i esIcon=\"more_vert\" [aria]=\"true\"></i>\n </button>\n </mat-cell>\n </ng-container>\n <!-- Data Columns -->\n <ng-container\n *ngFor=\"let column of visibleDataColumns$ | async; let first = first\"\n [matColumnDef]=\"column.name\"\n >\n <ng-container>\n <mat-header-cell\n *matHeaderCellDef\n mat-sort-header\n [disabled]=\"!(entriesService.sort?.allowed && isSortable(column))\"\n [class.mat-column-primary]=\"first\"\n >{{ column | esListItemLabel | async }}</mat-header-cell\n >\n </ng-container>\n <mat-cell\n *matCellDef=\"let node\"\n #cell\n [class.mat-column-primary]=\"first\"\n attr.data-test=\"table-cell-{{ column.name }}\"\n >\n <ng-container\n *ngIf=\"entriesService.elementInteractionType === InteractionType.DefaultActionLink\"\n >\n <es-node-url cdkMonitorSubtreeFocus [node]=\"node\" [mode]=\"first ? 'link' : 'wrapper'\">\n <es-list-base\n [forceText]=\"true\"\n [node]=\"node\"\n [item]=\"column\"\n esCheckTextOverflow\n #text=\"esCheckTextOverflow\"\n [matTooltip]=\"text.hasTextOverflow() ? cell.innerText : null\"\n matTooltipTouchGestures=\"off\"\n ></es-list-base>\n </es-node-url>\n </ng-container>\n <es-list-base\n *ngIf=\"entriesService.elementInteractionType !== InteractionType.DefaultActionLink\"\n [forceText]=\"true\"\n [node]=\"node\"\n [item]=\"column\"\n (click)=\"\n entriesService.onClicked({\n event: $event,\n element: node,\n source: ClickSource.Metadata,\n attribute: column,\n })\n \"\n (dblclick)=\"\n entriesService.dblClickItem.emit({\n element: node,\n source: ClickSource.Metadata,\n attribute: column,\n })\n \"\n ></es-list-base>\n <ng-container *ngIf=\"first\">\n <div class=\"childobjects\" *ngIf=\"node.properties?.['virtual:childobjectcount'] > 0\">\n <div\n class=\"childobject-count\"\n matTooltip=\"{{\n 'CHILDOBJECT_COUNT'\n | translate : { count: node.properties['virtual:childobjectcount'] * 1 + 1 }\n }}\"\n >\n <span>{{ node.properties['virtual:childobjectcount'] * 1 + 1 }}</span\n ><i esIcon=\"filter_none\"></i>\n </div>\n </div>\n </ng-container>\n </mat-cell>\n </ng-container>\n <mat-header-row mat-header-row *matHeaderRowDef=\"visibleColumnNames$ | async\"></mat-header-row>\n <mat-row\n mat-row\n matRipple\n cdkDrag\n esNodesDrag\n [cdkDragDisabled]=\"!entriesService.dragDrop?.dragAllowed || (ui.isTouchSubject | async)\"\n [cdkDragData]=\"getDragData(node)\"\n (cdkDragStarted)=\"onDragStarted(node)\"\n (cdkDragEnded)=\"onDragEnded()\"\n [esNodesDropTarget]=\"node\"\n [canDropNodes]=\"canDrop\"\n (nodeDropped)=\"drop($event)\"\n class=\"mat-row\"\n [class.mat-row-selected]=\"entriesService.selection.isSelected(node)\"\n [class.mat-row-import-blocked]=\"isBlocked(node)\"\n [class.selected-when-dragging]=\"isDragging && entriesService.selection.isSelected(node)\"\n [class.mat-row-virtual]=\"node.virtual\"\n [class.mat-row-virtual-first]=\"\n node.virtual && !$any(entriesService.dataSource.getData()[i - 1])?.virtual\n \"\n [class.mat-row-virtual-last]=\"\n node.virtual && !$any(entriesService.dataSource.getData()[i + 1])?.virtual\n \"\n [class.dynamic-single-click]=\"entriesService.singleClickHint === 'dynamic'\"\n *matRowDef=\"let node; let i = index; let last = last; columns: visibleColumnNames$ | async\"\n (contextmenu)=\"onRowContextMenu({ event: $event, node: node })\"\n (keydown.ContextMenu)=\"onRowContextMenu({ event: $event, node: node })\"\n >\n <es-drag-preview\n *cdkDragPreview\n [node]=\"node\"\n [selected]=\"entriesService.selection.selected\"\n [item]=\"(visibleDataColumns$ | async)[0]\"\n ></es-drag-preview>\n </mat-row>\n</mat-table>\n<ng-container\n *ngIf=\"\n (entriesService.dataSource.isLoadingSubject | async) === false &&\n entriesService.dataSource.hasMore() &&\n entriesService.paginationStrategy === 'infinite-scroll'\n \"\n>\n <div class=\"load-more\">\n <button mat-button color=\"primary\" (click)=\"loadData('button')\">\n <i esIcon=\"refresh\"></i>\n <span>{{ 'LOAD_MORE' | translate }}</span>\n </button>\n </div>\n</ng-container>\n<ng-container *ngIf=\"entriesService.dataSource.isLoadingSubject | async\">\n <ng-container *ngTemplateOutlet=\"loading\"> </ng-container>\n</ng-container>\n<!--\n<mat-paginator #paginator [pageSizeOptions]=\"pageSizeOptions\"></mat-paginator>\n-->\n\n<!-- Wait for ready state to avoid changed-after-checked error when `columnChooserTrigger` becomes\navailable. -->\n<es-column-chooser\n *ngIf=\"columnChooserTriggerReady\"\n [(columns)]=\"entriesService.columns\"\n [(columnChooserVisible)]=\"columnChooserVisible\"\n [origin]=\"columnChooserTrigger\"\n></es-column-chooser>\n<ng-template #loading>\n <es-spinner></es-spinner>\n</ng-template>\n<ng-template #icon let-node=\"node\">\n <div class=\"icon-bg\">\n <img\n *ngIf=\"node.iconURL\"\n [src]=\"node | esNodeIcon | async\"\n [alt]=\"\n node.mediatype\n ? ('NODE.mediatype' | translate) + ': ' + ('MEDIATYPE.' + node.mediatype | translate)\n : ''\n \"\n [matTooltip]=\"\n node.mediatype\n ? ('NODE.mediatype' | translate) + ': ' + ('MEDIATYPE.' + node.mediatype | translate)\n : ''\n \"\n matTooltipTouchGestures=\"off\"\n />\n <i\n *ngIf=\"!node.iconURL\"\n [esIcon]=\"node.authorityType ? (node.authorityType === 'GROUP' ? 'group' : 'person') : null\"\n ></i>\n </div>\n</ng-template>\n", styles: [":host{display:flex;flex-direction:column}:host ::ng-deep mat-header-cell{color:var(--textMediumLight)}:host ::ng-deep mat-cell,:host ::ng-deep mat-header-cell{margin:0!important}:host ::ng-deep mat-cell es-node-url{width:100%}:host ::ng-deep mat-cell es-node-url a{color:#000}:host ::ng-deep mat-cell es-node-url.cdk-keyboard-focused{outline:none;border:2px solid var(--palette-primary-300)}:host ::ng-deep es-list-base{white-space:nowrap;text-overflow:ellipsis;overflow:hidden;display:inline;width:100%;padding:20.3px 0;align-items:center}:host ::ng-deep es-list-base>div{display:inline}:host ::ng-deep es-list-base>div>div{display:inline}mat-header-cell,mat-cell{margin:0 3px}mat-header-cell:not(.mat-column-primary),mat-cell:not(.mat-column-primary){flex:0 145px}mat-header-cell.mat-column-primary,mat-cell.mat-column-primary{min-width:30%}mat-header-cell.mat-column-select,mat-cell.mat-column-select{flex:0 58px;min-width:58px;padding-left:14px}mat-header-cell.mat-column-icon,mat-cell.mat-column-icon{flex:0 85px;min-width:85px;justify-content:center}mat-header-cell.mat-column-actions,mat-cell.mat-column-actions{flex:0 58px;min-width:58px;display:flex;justify-content:flex-end;padding-right:5px}.mat-row{background:unset}.mat-row.dynamic-single-click{cursor:pointer}.mat-row.dynamic-single-click:hover{background-color:rgb(var(--palette-primary-50))}.mat-row.mat-row-import-blocked{opacity:.75;text-decoration:line-through}.mat-row.mat-row-selected{background:var(--listItemSelectedBackgroundEffect)}.mat-row.mat-row-selected .mat-mdc-cell{background:transparent}.mat-row.mat-row-virtual{background:linear-gradient(to right,var(--nodeVirtualColor) 5px,transparent 5px) no-repeat;border-right:2px dashed var(--nodeVirtualColorLight)}.mat-row.mat-row-virtual .mat-mdc-cell{background:transparent}.mat-row.mat-row-virtual.mat-row-selected{background:linear-gradient(to right,var(--nodeVirtualColor) 0,var(--nodeVirtualColor) 5px,var(--listItemSelectedBackground) 5px,var(--listItemSelectedBackground) 5px)}.mat-row.mat-row-virtual-first{border-top:2px dashed var(--nodeVirtualColorLight)}.mat-row.mat-row-virtual-last{border-bottom:2px dashed var(--nodeVirtualColorLight)}.mat-row.selected-when-dragging{opacity:.5}.dropdown-dummy{position:fixed}.childobjects{background-color:#0000000d;border-radius:15px;display:inline-flex;align-items:center;min-width:51px;min-height:26px;justify-content:center;cursor:default;-webkit-user-select:none;user-select:none;padding:2px 8px;margin-left:5px}.childobjects>.childobject-count{display:inline-flex;align-items:center}.childobjects>.childobject-count>i{font-size:13px;margin-left:4px}.cell-icon .icon-bg{width:36px;height:36px;padding:3px;margin:1px 0;background-color:#fff;border-radius:50%;display:flex;justify-content:center;align-items:center;box-shadow:0 0 3px #0000004d}.cell-icon .icon-bg>img{width:18px;height:auto}.cell-icon .icon-bg>i{color:#666;font-size:18px}.mat-column-link{flex:0 60px}.mat-column-link a,.load-more{display:flex;justify-content:center}es-node-entries-global-options{padding:20px 0}\n"] }]
|
|
278
|
-
}], ctorParameters: () => [{ type: i1.NodeEntriesService }, { type: i2.NodeEntriesGlobalService }, { type: i0.ApplicationRef }, { type: i3.Toast }, { type: i4.TranslationsService }, { type: i5.NodeHelperService }, { type: i0.ChangeDetectorRef }, { type: i6.UIService }, { type: i0.NgZone }, { type: i0.ElementRef }], propDecorators: { sort: [{
|
|
279
|
-
type: ViewChild,
|
|
280
|
-
args: [MatSort]
|
|
281
|
-
}], paginator: [{
|
|
282
|
-
type: ViewChild,
|
|
283
|
-
args: [MatPaginator]
|
|
284
|
-
}], columnChooserTrigger: [{
|
|
285
|
-
type: ViewChild,
|
|
286
|
-
args: ['columnChooserTrigger']
|
|
287
|
-
}], dropdown: [{
|
|
288
|
-
type: ViewChild,
|
|
289
|
-
args: [DropdownComponent]
|
|
290
|
-
}], menuTrigger: [{
|
|
291
|
-
type: ViewChild,
|
|
292
|
-
args: ['menuTrigger']
|
|
293
|
-
}] } });
|
|
294
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm9kZS1lbnRyaWVzLXRhYmxlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2VkdS1zaGFyaW5nLXVpL3NyYy9saWIvbm9kZS1lbnRyaWVzL25vZGUtZW50cmllcy10YWJsZS9ub2RlLWVudHJpZXMtdGFibGUuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZWR1LXNoYXJpbmctdWkvc3JjL2xpYi9ub2RlLWVudHJpZXMvbm9kZS1lbnRyaWVzLXRhYmxlL25vZGUtZW50cmllcy10YWJsZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBR0gsdUJBQXVCLEVBRXZCLFNBQVMsRUFNVCxTQUFTLEdBQ1osTUFBTSxlQUFlLENBQUM7QUFFdkIsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQzNELE9BQU8sRUFBRSxPQUFPLEVBQXVCLE1BQU0sd0JBQXdCLENBQUM7QUFDdEUsT0FBTyxLQUFLLElBQUksTUFBTSxNQUFNLENBQUM7QUFDN0IsT0FBTyxFQUFFLGVBQWUsRUFBYyxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDNUQsT0FBTyxFQUNILFlBQVksRUFDWixLQUFLLEVBQ0wsb0JBQW9CLEVBQ3BCLEtBQUssRUFDTCxHQUFHLEVBQ0gsV0FBVyxFQUNYLFNBQVMsRUFDVCxTQUFTLEdBQ1osTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QixPQUFPLEVBQ0gsV0FBVyxFQUNYLGVBQWUsRUFFZixzQkFBc0IsR0FDekIsTUFBTSxrQkFBa0IsQ0FBQztBQUkxQixPQUFPLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSxnREFBZ0QsQ0FBQztBQUc1RixPQUFPLEVBQVEsYUFBYSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDMUQsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBRWpELE9BQU8s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dUJBQUMsT0FBTztnQkFDTyxTQUFTO3NCQUFqQyxTQUFTO3VCQUFDLFlBQVk7Z0JBQ1ksb0JBQW9CO3NCQUF0RCxTQUFTO3VCQUFDLHNCQUFzQjtnQkFDSCxRQUFRO3NCQUFyQyxTQUFTO3VCQUFDLGlCQUFpQjtnQkFDRixXQUFXO3NCQUFwQyxTQUFTO3VCQUFDLGFBQWEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDZGtPdmVybGF5T3JpZ2luIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL292ZXJsYXknO1xuaW1wb3J0IHtcbiAgICBBZnRlclZpZXdJbml0LFxuICAgIEFwcGxpY2F0aW9uUmVmLFxuICAgIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICAgIENoYW5nZURldGVjdG9yUmVmLFxuICAgIENvbXBvbmVudCxcbiAgICBFbGVtZW50UmVmLFxuICAgIE5nWm9uZSxcbiAgICBPbkNoYW5nZXMsXG4gICAgT25EZXN0cm95LFxuICAgIFNpbXBsZUNoYW5nZXMsXG4gICAgVmlld0NoaWxkLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE1hdE1lbnVUcmlnZ2VyIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvbWVudSc7XG5pbXBvcnQgeyBNYXRQYWdpbmF0b3IgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9wYWdpbmF0b3InO1xuaW1wb3J0IHsgTWF0U29ydCwgTWF0U29ydEhlYWRlciwgU29ydCB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3NvcnQnO1xuaW1wb3J0ICogYXMgcnhqcyBmcm9tICdyeGpzJztcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgT2JzZXJ2YWJsZSwgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHtcbiAgICBkZWJvdW5jZVRpbWUsXG4gICAgZGVsYXksXG4gICAgZGlzdGluY3RVbnRpbENoYW5nZWQsXG4gICAgZmlyc3QsXG4gICAgbWFwLFxuICAgIHNoYXJlUmVwbGF5LFxuICAgIHN0YXJ0V2l0aCxcbiAgICB0YWtlVW50aWwsXG59IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7XG4gICAgQ2xpY2tTb3VyY2UsXG4gICAgSW50ZXJhY3Rpb25UeXBlLFxuICAgIE5vZGVFbnRyaWVzRGF0YVR5cGUsXG4gICAgTm9kZUVudHJpZXNEaXNwbGF5VHlwZSxcbn0gZnJvbSAnLi4vZW50cmllcy1tb2RlbCc7XG5pbXBvcnQgeyBOb2RlRW50cmllc0dsb2JhbFNlcnZpY2UgfSBmcm9tICcuLi9ub2RlLWVudHJpZXMtZ2xvYmFsLnNlcnZpY2UnO1xuaW1wb3J0IHsgTm9kZUVudHJpZXNTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvbm9kZS1lbnRyaWVzLnNlcnZpY2UnO1xuaW1wb3J0IHsgVUlTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvdWkuc2VydmljZSc7XG5pbXBvcnQgeyBCb3JkZXJCb3hPYnNlcnZlckRpcmVjdGl2ZSB9IGZyb20gJy4uLy4uL2RpcmVjdGl2ZXMvYm9yZGVyLWJveC1vYnNlcnZlci5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgTGlzdEl0ZW0gfSBmcm9tICcuLi8uLi90eXBlcy9saXN0LWl0ZW0nO1xuaW1wb3J0IHsgQ2FuRHJvcCwgRHJhZ0RhdGEgfSBmcm9tICcuLi8uLi90eXBlcy9kcmFnLWRyb3AnO1xuaW1wb3J0IHsgTm9kZSwgUmVzdENvbnN0YW50cyB9IGZyb20gJ25neC1lZHUtc2hhcmluZy1hcGknO1xuaW1wb3J0IHsgVGFyZ2V0IH0gZnJvbSAnLi4vLi4vdHlwZXMvb3B0aW9uLWl0ZW0nO1xuaW1wb3J0IHsgVG9hc3QgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9hYnN0cmFjdC90b2FzdC5zZXJ2aWNlJztcbmltcG9ydCB7IERyb3Bkb3duQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vZHJvcGRvd24vZHJvcGRvd24uY29tcG9uZW50JztcbmltcG9ydCB7IE5vZGVEYXRhU291cmNlUmVtb3RlIH0gZnJvbSAnLi4vbm9kZS1kYXRhLXNvdXJjZS1yZW1vdGUnO1xuaW1wb3J0IHsgVHJhbnNsYXRpb25zU2VydmljZSB9IGZyb20gJy4uLy4uL3RyYW5zbGF0aW9ucy90cmFuc2xhdGlvbnMuc2VydmljZSc7XG5pbXBvcnQgeyBOb2RlSGVscGVyU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL25vZGUtaGVscGVyLnNlcnZpY2UnO1xuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ2VzLW5vZGUtZW50cmllcy10YWJsZScsXG4gICAgdGVtcGxhdGVVcmw6ICcuL25vZGUtZW50cmllcy10YWJsZS5jb21wb25lbnQuaHRtbCcsXG4gICAgc3R5bGVVcmxzOiBbJy4vbm9kZS1lbnRyaWVzLXRhYmxlLmNvbXBvbmVudC5zY3NzJ10sXG4gICAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG59KVxuZXhwb3J0IGNsYXNzIE5vZGVFbnRyaWVzVGFibGVDb21wb25lbnQ8VCBleHRlbmRzIE5vZGVFbnRyaWVzRGF0YVR5cGU+XG4gICAgaW1wbGVtZW50cyBPbkNoYW5nZXMsIEFmdGVyVmlld0luaXQsIE9uRGVzdHJveVxue1xuICAgIHJlYWRvbmx5IEludGVyYWN0aW9uVHlwZSA9IEludGVyYWN0aW9uVHlwZTtcbiAgICByZWFkb25seSBDbGlja1NvdXJjZSA9IENsaWNrU291cmNlO1xuICAgIHJlYWRvbmx5IE5vZGVFbnRyaWVzRGlzcGxheVR5cGUgPSBOb2RlRW50cmllc0Rpc3BsYXlUeXBlO1xuICAgIHJlYWRvbmx5IFRhcmdldCA9IFRhcmdldDtcblxuICAgIEBWaWV3Q2hpbGQoTWF0U29ydCkgc29ydDogTWF0U29ydDtcbiAgICBAVmlld0NoaWxkKE1hdFBhZ2luYXRvcikgcGFnaW5hdG9yOiBNYXRQYWdpbmF0b3I7XG4gICAgQFZpZXdDaGlsZCgnY29sdW1uQ2hvb3NlclRyaWdnZXInKSBjb2x1bW5DaG9vc2VyVHJpZ2dlcjogQ2RrT3ZlcmxheU9yaWdpbjtcbiAgICBAVmlld0NoaWxkKERyb3Bkb3duQ29tcG9uZW50KSBkcm9wZG93bjogRHJvcGRvd25Db21wb25lbnQ7XG4gICAgQFZpZXdDaGlsZCgnbWVudVRyaWdnZXInKSBtZW51VHJpZ2dlcjogTWF0TWVudVRyaWdnZXI7XG5cbiAgICBkcm9wZG93bkxlZnQ6IG51bWJlcjtcbiAgICBkcm9wZG93blRvcDogbnVtYmVyO1xuXG4gICAgbG9hZGluZzogT2JzZXJ2YWJsZTxib29sZWFuPjtcbiAgICBpc1BhZ2VTZWxlY3RlZCA9IG5ldyBCZWhhdmlvclN1YmplY3QoZmFsc2UpO1xuICAgIGlzQWxsU2VsZWN0ZWQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0KGZhbHNlKTtcbiAgICBjb2x1bW5DaG9vc2VyVmlzaWJsZSA9IGZhbHNlO1xuICAgIGNvbHVtbkNob29zZXJUcmlnZ2VyUmVhZHkgPSBmYWxzZTtcbiAgICBlcnJvcjogT2JzZXJ2YWJsZTxhbnk+O1xuICAgIHBhZ2VTaXplT3B0aW9ucyA9IFsyNSwgNTAsIDEwMF07XG4gICAgaXNEcmFnZ2luZyA9IGZhbHNlO1xuXG4gICAgcHJpdmF0ZSByZWFkb25seSBtYXhpbXVtQ29sdW1uc051bWJlciQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0KDEpO1xuICAgIHJlYWRvbmx5IHZpc2libGVEYXRhQ29sdW1ucyQ7XG4gICAgcmVhZG9ubHkgdmlzaWJsZUNvbHVtbk5hbWVzJDtcblxuICAgIHByaXZhdGUgZGVzdHJveWVkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwdWJsaWMgZW50cmllc1NlcnZpY2U6IE5vZGVFbnRyaWVzU2VydmljZTxUPixcbiAgICAgICAgcHVibGljIGVudHJpZXNHbG9iYWxTZXJ2aWNlOiBOb2RlRW50cmllc0dsb2JhbFNlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgYXBwbGljYXRpb25SZWY6IEFwcGxpY2F0aW9uUmVmLFxuICAgICAgICBwcml2YXRlIHRvYXN0OiBUb2FzdCxcbiAgICAgICAgcHJpdmF0ZSB0cmFuc2xhdGlvbnM6IFRyYW5zbGF0aW9uc1NlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgbm9kZUhlbHBlclNlcnZpY2U6IE5vZGVIZWxwZXJTZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIGNoYW5nZURldGVjdG9yUmVmOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICAgICAgcHVibGljIHVpOiBVSVNlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgbmdab25lOiBOZ1pvbmUsXG4gICAgICAgIHByaXZhdGUgZWxlbWVudFJlZjogRWxlbWVudFJlZjxIVE1MRWxlbWVudD4sXG4gICAgKSB7XG4gICAgICAgIHRoaXMudmlzaWJsZURhdGFDb2x1bW5zJCA9IHRoaXMuZ2V0VmlzaWJsZURhdGFDb2x1bW5zKCk7XG4gICAgICAgIHRoaXMudmlzaWJsZUNvbHVtbk5hbWVzJCA9IHRoaXMuZ2V0VmlzaWJsZUNvbHVtbk5hbWVzKCk7XG4gICAgICAgIHRoaXMucmVnaXN0ZXJNYXhpbXVtQ29sdW1uc051bWJlcigpO1xuICAgICAgICB0aGlzLmVudHJpZXNTZXJ2aWNlLnNlbGVjdGlvbi5jaGFuZ2VkXG4gICAgICAgICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95ZWQpLCBkZWJvdW5jZVRpbWUoMCkpXG4gICAgICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHRoaXMuY2hhbmdlRGV0ZWN0b3JSZWYuZGV0ZWN0Q2hhbmdlcygpKTtcbiAgICB9XG5cbiAgICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XG4gICAgICAgIHZvaWQgUHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnJlZ2lzdGVyU29ydENoYW5nZXMoKTtcbiAgICAgICAgICAgIGlmICh0aGlzLmVudHJpZXNTZXJ2aWNlLmRhdGFTb3VyY2UgaW5zdGFuY2VvZiBOb2RlRGF0YVNvdXJjZVJlbW90ZSkge1xuICAgICAgICAgICAgICAgICh0aGlzLmVudHJpZXNTZXJ2aWNlLmRhdGFTb3VyY2UgYXMgTm9kZURhdGFTb3VyY2VSZW1vdGUpLnNvcnRQYW5lbCA9IHRoaXMuc29ydDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMudmlzaWJsZURhdGFDb2x1bW5zJFxuICAgICAgICAgICAgLnBpcGUoZmlyc3QoKSwgZGVsYXkoMCkpXG4gICAgICAgICAgICAuc3Vic2NyaWJlKCgpID0+ICh0aGlzLmNvbHVtbkNob29zZXJUcmlnZ2VyUmVhZHkgPSB0cnVlKSk7XG4gICAgICAgIHJ4anMuY29tYmluZUxhdGVzdChbXG4gICAgICAgICAgICB0aGlzLmVudHJpZXNTZXJ2aWNlLmRhdGFTb3VyY2UkLnBpcGUoc3RhcnRXaXRoKHZvaWQgMCBhcyB2b2lkKSksXG4gICAgICAgICAgICB0aGlzLmVudHJpZXNTZXJ2aWNlLm9wdGlvbnMkLnBpcGUoc3RhcnRXaXRoKHZvaWQgMCBhcyB2b2lkKSksXG4gICAgICAgICAgICB0aGlzLmVudHJpZXNTZXJ2aWNlLmRhdGFTb3VyY2UuaXNMb2FkaW5nU3ViamVjdC5waXBlKHN0YXJ0V2l0aCh2b2lkIDAgYXMgdm9pZCkpLFxuICAgICAgICAgICAgdGhpcy5lbnRyaWVzU2VydmljZS5zZWxlY3Rpb24uY2hhbmdlZC5waXBlKHN0YXJ0V2l0aCh2b2lkIDAgYXMgdm9pZCkpLFxuICAgICAgICAgICAgdGhpcy50cmFuc2xhdGlvbnMud2FpdEZvckluaXQoKS5waXBlKHN0YXJ0V2l0aCh2b2lkIDAgYXMgdm9pZCkpLFxuICAgICAgICBdKVxuICAgICAgICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveWVkKSlcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3JSZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgICAgICB0aGlzLnVwZGF0ZVNvcnQoKTtcbiAgICB9XG5cbiAgICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5kZXN0cm95ZWQubmV4dCgpO1xuICAgICAgICB0aGlzLmRlc3Ryb3llZC5jb21wbGV0ZSgpO1xuICAgIH1cblxuICAgIG9uUm93Q29udGV4dE1lbnUoeyBldmVudCwgbm9kZSB9OiB7IGV2ZW50OiBNb3VzZUV2ZW50IHwgRXZlbnQ7IG5vZGU6IFQgfSkge1xuICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgaWYgKCF0aGlzLmRyb3Bkb3duKSB7XG4gICAgICAgICAgICAvLyBDYWxsIGBwcmV2ZW50RGVmYXVsdCgpYCBldmVuIHdoZW4gdGhlcmUgaXMgbm8gbWVudSwgc28gd2UgY2FuIHVzZSBgY2RrRHJhZ2Agd2l0aCBhXG4gICAgICAgICAgICAvLyBzdGFydCBkZWxheSB3aXRob3V0IGJlaW5nIGludGVycnVwdGVkIGJ5IHRoZSBzdGFuZGFyZCBsb25nLXRhcCBhY3Rpb24uXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGV2ZW50IGluc3RhbmNlb2YgTW91c2VFdmVudCkge1xuICAgICAgICAgICAgKHsgY2xpZW50WDogdGhpcy5kcm9wZG93bkxlZnQsIGNsaWVudFk6IHRoaXMuZHJvcGRvd25Ub3AgfSA9IGV2ZW50KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICh7IHg6IHRoaXMuZHJvcGRvd25MZWZ0LCB5OiB0aGlzLmRyb3Bkb3duVG9wIH0gPSAoXG4gICAgICAgICAgICAgICAgZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50XG4gICAgICAgICAgICApLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmVudHJpZXNTZXJ2aWNlLm9wZW5Ecm9wZG93bih0aGlzLmRyb3Bkb3duLCBub2RlLCAoKSA9PiB0aGlzLm1lbnVUcmlnZ2VyLm9wZW5NZW51KCkpO1xuICAgIH1cblxuICAgIHByaXZhdGUgdXBkYXRlU29ydCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5zb3J0LnNvcnQoe1xuICAgICAgICAgICAgaWQ6IHRoaXMuZW50cmllc1NlcnZpY2Uuc29ydD8uYWN0aXZlLFxuICAgICAgICAgICAgc3RhcnQ6IHRoaXMuZW50cmllc1NlcnZpY2Uuc29ydD8uZGlyZWN0aW9uIGFzICdhc2MnIHwgJ2Rlc2MnLFxuICAgICAgICAgICAgZGlzYWJsZUNsZWFyOiBmYWxzZSxcbiAgICAgICAgfSk7XG4gICAgICAgIC8vIEZpeCBtaXNzaW5nIHNvcnRpbmcgaW5kaWNhdG9ycy4gU2VlXG4gICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL2NvbXBvbmVudHMvaXNzdWVzLzEwMjQyI2lzc3VlY29tbWVudC00NzA3MjY4MjkuIFNlZW1zXG4gICAgICAgIC8vIHRvIGJlIGZpeGVkIHVwc3RyZWFtIHdpdGggQW5ndWxhciAxMS5cbiAgICAgICAgKFxuICAgICAgICAgICAgdGhpcy5zb3J0LnNvcnRhYmxlcy5nZXQodGhpcy5lbnRyaWVzU2VydmljZS5zb3J0Py5hY3RpdmUpIGFzIE1hdFNvcnRIZWFkZXJcbiAgICAgICAgKS5fc2V0QW5pbWF0aW9uVHJhbnNpdGlvblN0YXRlKHtcbiAgICAgICAgICAgIHRvU3RhdGU6ICdhY3RpdmUnLFxuICAgICAgICB9KTtcbiAgICAgICAgLypcbiAgICAgICAgdGhpcy5yb3V0ZS5xdWVyeVBhcmFtcy5waXBlKGZpcnN0KCkpLnN1YnNjcmliZSgocXVlcnlQYXJhbXM6IFBhcmFtcykgPT4ge1xuICAgICAgICAgICAgY29uc3Qgc29ydDogU29ydCA9IHF1ZXJ5UGFyYW1zLnNvcnQgPyBKU09OLnBhcnNlKHF1ZXJ5UGFyYW1zLnNvcnQpIDogbnVsbDtcbiAgICAgICAgICAgIGlmIChzb3J0ICYmIHNvcnQuZGlyZWN0aW9uKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zb3J0LnNvcnQoeyBpZDogc29ydC5hY3RpdmUsIHN0YXJ0OiBzb3J0LmRpcmVjdGlvbiwgZGlzYWJsZUNsZWFyOiBmYWxzZSB9KTtcbiAgICAgICAgICAgICAgICAvLyBGaXggbWlzc2luZyBzb3J0aW5nIGluZGljYXRvcnMuIFNlZVxuICAgICAgICAgICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL2NvbXBvbmVudHMvaXNzdWVzLzEwMjQyI2lzc3VlY29tbWVudC00NzA3MjY4MjkuIFNlZW1zXG4gICAgICAgICAgICAgICAgLy8gdG8gYmUgZml4ZWQgdXBzdHJlYW0gd2l0aCBBbmd1bGFyIDExLlxuICAgICAgICAgICAgICAgIChcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zb3J0LnNvcnRhYmxlcy5nZXQoc29ydC5hY3RpdmUpIGFzIE1hdFNvcnRIZWFkZXJcbiAgICAgICAgICAgICAgICApLl9zZXRBbmltYXRpb25UcmFuc2l0aW9uU3RhdGUoe1xuICAgICAgICAgICAgICAgICAgICB0b1N0YXRlOiAnYWN0aXZlJyxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChxdWVyeVBhcmFtcy5wYWdlSW5kZXggJiYgcXVlcnlQYXJhbXMucGFnZVNpemUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnBhZ2luYXRvci5wYWdlSW5kZXggPSBxdWVyeVBhcmFtcy5wYWdlSW5kZXg7XG4gICAgICAgICAgICAgICAgdGhpcy5wYWdpbmF0b3IucGFnZVNpemUgPSBxdWVyeVBhcmFtcy5wYWdlU2l6ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgICAqL1xuICAgIH1cblxuICAgIHByaXZhdGUgcmVnaXN0ZXJNYXhpbXVtQ29sdW1uc051bWJlcigpIHtcbiAgICAgICAgQm9yZGVyQm94T2JzZXJ2ZXJEaXJlY3RpdmUub2JzZXJ2ZUVsZW1lbnQodGhpcy5lbGVtZW50UmVmKVxuICAgICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICAgICAgdGFrZVVudGlsKHRoaXMuZGVzdHJveWVkKSxcbiAgICAgICAgICAgICAgICBtYXAoKGJveCkgPT4gdGhpcy5nZXRNYXhpbXVtQ29sdW1uc051bWJlcihib3gud2lkdGgpKSxcbiAgICAgICAgICAgICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpLFxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgLnN1YnNjcmliZSgobWF4aW11bUNvbHVtbnNOdW1iZXIpID0+XG4gICAgICAgICAgICAgICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+IHRoaXMubWF4aW11bUNvbHVtbnNOdW1iZXIkLm5leHQobWF4aW11bUNvbHVtbnNOdW1iZXIpKSxcbiAgICAgICAgICAgICk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRNYXhpbXVtQ29sdW1uc051bWJlcih0YWJsZVdpZHRoOiBudW1iZXIpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gTWF0aC5tYXgoXG4gICAgICAgICAgICAxLFxuICAgICAgICAgICAgTWF0aC5mbG9vcihcbiAgICAgICAgICAgICAgICAvLyBTdWJ0cmFjdCB0b3RhbCB3aWR0aCBvZiBhbHdheXMgdmlzaWJsZSBjb2x1bW5zIGxpa2UgY2hlY2tib3hlcyBhbmQgaWNvbnMuXG4gICAgICAgICAgICAgICAgKHRhYmxlV2lkdGggLSAxODcpIC9cbiAgICAgICAgICAgICAgICAgICAgLy8gRGl2aWRlIGJ5IHdpdGggb2YgZGF0YSBjb2x1bW5zIChpbmNsdWRpbmcgbWFyZ2luKS5cbiAgICAgICAgICAgICAgICAgICAgMTI2LFxuICAgICAgICAgICAgKSxcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldFZpc2libGVEYXRhQ29sdW1ucygpOiBPYnNlcnZhYmxlPExpc3RJdGVtW10+IHtcbiAgICAgICAgcmV0dXJuIHJ4anNcbiAgICAgICAgICAgIC5jb21iaW5lTGF0ZXN0KFtcbiAgICAgICAgICAgICAgICB0aGlzLm1heGltdW1Db2x1bW5zTnVtYmVyJCxcbiAgICAgICAgICAgICAgICB0aGlzLmVudHJpZXNTZXJ2aWNlLmNvbHVtbnNTdWJqZWN0LnBpcGUobWFwKChjKSA9PiBjPy5jb2x1bW5zKSksXG4gICAgICAgICAgICBdKVxuICAgICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICAgICAgbWFwKChbbWF4aW11bUNvbHVtbnNOdW1iZXIsIGNvbHVtbnNdKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAoY29sdW1ucyA/PyBbXSlcbiAgICAgICAgICAgICAgICAgICAgICAgIC5maWx0ZXIoKGNvbHVtbikgPT4gY29sdW1uLnZpc2libGUpXG4gICAgICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKChfLCBpbmRleCkgPT4gaW5kZXggPCBtYXhpbXVtQ29sdW1uc051bWJlcik7XG4gICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgc2hhcmVSZXBsYXkoMSksXG4gICAgICAgICAgICApO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0VmlzaWJsZUNvbHVtbk5hbWVzKCk6IE9ic2VydmFibGU8c3RyaW5nW10+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMudmlzaWJsZURhdGFDb2x1bW5zJC5waXBlKFxuICAgICAgICAgICAgbWFwKCh2aXNpYmxlRGF0YUNvbHVtbnMpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBjb2x1bW5zID0gW107XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuZW50cmllc1NlcnZpY2UuY2hlY2tib3gpIHtcbiAgICAgICAgICAgICAgICAgICAgY29sdW1ucy5wdXNoKCdzZWxlY3QnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29sdW1ucy5wdXNoKCdpY29uJyk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNvbHVtbnMuY29uY2F0KHZpc2libGVEYXRhQ29sdW1ucy5tYXAoKGMpID0+IGMubmFtZSkpLmNvbmNhdChbJ2FjdGlvbnMnXSk7XG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIHNoYXJlUmVwbGF5KDEpLFxuICAgICAgICApO1xuICAgIH1cblxuICAgIGlzU29ydGFibGUoY29sdW1uOiBMaXN0SXRlbSkge1xuICAgICAgICByZXR1cm4gdGhpcy5lbnRyaWVzU2VydmljZS5zb3J0Py5jb2x1bW5zPy5zb21lKFxuICAgICAgICAgICAgKGMpID0+IGMudHlwZSA9PT0gY29sdW1uLnR5cGUgJiYgYy5uYW1lID09PSBjb2x1bW4ubmFtZSxcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICB0b2dnbGVBbGwoY2hlY2tlZDogYm9vbGVhbikge1xuICAgICAgICBpZiAoY2hlY2tlZCkge1xuICAgICAgICAgICAgdGhpcy5lbnRyaWVzU2VydmljZS5zZWxlY3Rpb24uc2VsZWN0KC4uLnRoaXMuZW50cmllc1NlcnZpY2UuZGF0YVNvdXJjZS5nZXREYXRhKCkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5lbnRyaWVzU2VydmljZS5zZWxlY3Rpb24uY2xlYXIoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgcmVnaXN0ZXJTb3J0Q2hhbmdlcygpIHtcbiAgICAgICAgdGhpcy5zb3J0LnNvcnRDaGFuZ2Uuc3Vic2NyaWJlKChzb3J0OiBTb3J0KSA9PiB7XG4gICAgICAgICAgICB0aGlzLmVudHJpZXNTZXJ2aWNlLnNvcnQuYWN0aXZlID0gc29ydC5hY3RpdmU7XG4gICAgICAgICAgICB0aGlzLmVudHJpZXNTZXJ2aWNlLnNvcnQuZGlyZWN0aW9uID0gc29ydC5kaXJlY3Rpb247XG4gICAgICAgICAgICB0aGlzLmVudHJpZXNTZXJ2aWNlLnNvcnRDaGFuZ2UuZW1pdCh0aGlzLmVudHJpZXNTZXJ2aWNlLnNvcnQpO1xuICAgICAgICAgICAgLyp0aGlzLnJvdXRlci5uYXZpZ2F0ZShbJy4nXSwge1xuICAgICAgICAgICAgICAgIHJlbGF0aXZlVG86IHRoaXMucm91dGUsXG4gICAgICAgICAgICAgICAgcXVlcnlQYXJhbXM6IHsgc29ydDogSlNPTi5zdHJpbmdpZnkoc29ydCkgfSxcbiAgICAgICAgICAgICAgICBxdWVyeVBhcmFtc0hhbmRsaW5nOiAnbWVyZ2UnLFxuICAgICAgICAgICAgICAgIHJlcGxhY2VVcmw6IHRydWUsXG4gICAgICAgICAgICB9KTsqL1xuICAgICAgICB9KTtcbiAgICAgICAgLypcbiAgICAgICAgdGhpcy5wYWdpbmF0b3IucGFnZVxuICAgICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICAgICAgLy8gQXMgYSByZXNwb25zZSB0byBjaGFuZ2VzIG9mIG90aGVyIHBhcmFtZXRlcnMsIHRoZSBwYWdlSW5kZXggbWlnaHQgYmUgcmVzZXQgdG8gMCBhbmQgYVxuICAgICAgICAgICAgICAgIC8vIHBhZ2UgZXZlbnQgdHJpZ2dlcnMuIFRoaXMgY2hhbmdlIG9mIG90aGVyIHBhcmFtZXRlcnMgaXMgbGlrZWx5IHRvIGNhdXNlIGFcbiAgICAgICAgICAgICAgICAvLyBgcm91dGVyLm5hdmlnYXRlKClgIGNhbGwgZWxzZXdoZXJlLiBXaGVuIHRoaXMgaGFwcGVucyBqdXN0IGJlZm9yZSBvdXIgY2FsbCwgb3VyXG4gICAgICAgICAgICAgICAgLy8gdXBkYXRlcyBhcmUgaWdub3JlZC4gVG8gc2hpZWxkIGFnYWluc3QgdGhpcywgd2Ugd2FpdCBhIHRpY2suXG4gICAgICAgICAgICAgICAgZGVsYXkoMCksXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAuc3Vic2NyaWJlKCh7IHBhZ2VJbmRleCwgcGFnZVNpemUgfTogUGFnZUV2ZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoWycuJ10sIHtcbiAgICAgICAgICAgICAgICAgICAgcmVsYXRpdmVUbzogdGhpcy5yb3V0ZSxcbiAgICAgICAgICAgICAgICAgICAgcXVlcnlQYXJhbXM6IHsgcGFnZUluZGV4LCBwYWdlU2l6ZSB9LFxuICAgICAgICAgICAgICAgICAgICBxdWVyeVBhcmFtc0hhbmRsaW5nOiAnbWVyZ2UnLFxuICAgICAgICAgICAgICAgICAgICByZXBsYWNlVXJsOiB0cnVlLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAqL1xuICAgIH1cblxuICAgIGNhbkRyb3AgPSAoZHJhZ0RhdGE6IERyYWdEYXRhPFQ+KTogQ2FuRHJvcCA9PiB7XG4gICAgICAgIHJldHVybiB0aGlzLmVudHJpZXNTZXJ2aWNlLmRyYWdEcm9wLmRyb3BBbGxvd2VkPy4oZHJhZ0RhdGEpO1xuICAgIH07XG5cbiAgICBkcm9wKGRyYWdEYXRhOiBEcmFnRGF0YTxOb2RlPikge1xuICAgICAgICB0aGlzLmVudHJpZXNTZXJ2aWNlLmRyYWdEcm9wLmRyb3BwZWQoZHJhZ0RhdGEudGFyZ2V0LCB7XG4gICAgICAgICAgICBlbGVtZW50OiBkcmFnRGF0YS5kcmFnZ2VkTm9kZXMsXG4gICAgICAgICAgICBtb2RlOiBkcmFnRGF0YS5hY3Rpb24sXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGdldERyYWdEYXRhKG5vZGU6IFQpOiBUW10ge1xuICAgICAgICBjb25zdCBzZWxlY3Rpb24gPSB0aGlzLmVudHJpZXNTZXJ2aWNlLnNlbGVjdGlvbjtcbiAgICAgICAgaWYgKHNlbGVjdGlvbi5pc1NlbGVjdGVkKG5vZGUpKSB7XG4gICAgICAgICAgICByZXR1cm4gc2VsZWN0aW9uLnNlbGVjdGVkO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFtub2RlXTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIG9uRHJhZ1N0YXJ0ZWQobm9kZTogVCkge1xuICAgICAgICBpZiAoIXRoaXMuZW50cmllc1NlcnZpY2Uuc2VsZWN0aW9uLmlzU2VsZWN0ZWQobm9kZSkpIHtcbiAgICAgICAgICAgIHRoaXMuZW50cmllc1NlcnZpY2Uuc2VsZWN0aW9uLmNsZWFyKCk7XG4gICAgICAgICAgICB0aGlzLmVudHJpZXNTZXJ2aWNlLnNlbGVjdGlvbi5zZWxlY3Qobm9kZSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5pc0RyYWdnaW5nID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBvbkRyYWdFbmRlZCgpIHtcbiAgICAgICAgdGhpcy5pc0RyYWdnaW5nID0gZmFsc2U7XG4gICAgfVxuXG4gICAgbG9hZERhdGEoc291cmNlOiAnc2Nyb2xsJyB8ICdidXR0b24nKSB7XG4gICAgICAgIC8vIFRPRE86IGZvY3VzIG5leHQgaXRlbSB3aGVuIHRyaWdnZXJlZCB2aWEgYnV0dG9uLlxuICAgICAgICB0aGlzLmVudHJpZXNTZXJ2aWNlLmxvYWRNb3JlKHNvdXJjZSk7XG4gICAgfVxuXG4gICAgYXN5bmMgb3Blbk1lbnUobm9kZTogVCkge1xuICAgICAgICB0aGlzLmVudHJpZXNTZXJ2aWNlLm9wZW5Ecm9wZG93bih0aGlzLmRyb3Bkb3duLCBub2RlKTtcbiAgICB9XG5cbiAgICBpc0Jsb2NrZWQobm9kZTogTm9kZSkge1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgbm9kZS5wcm9wZXJ0aWVzPy5bUmVzdENvbnN0YW50cy5DQ01fUFJPUF9JTVBPUlRfQkxPQ0tFRF0/LlswXSA9PT0gJ3RydWUnIHx8XG4gICAgICAgICAgICB0aGlzLm5vZGVIZWxwZXJTZXJ2aWNlLmlzTm9kZVJldm9rZWQobm9kZSlcbiAgICAgICAgKTtcbiAgICB9XG59XG4iLCI8ZXMtZHJvcGRvd24gI2Ryb3Bkb3duIFtvcHRpb25zXT1cImVudHJpZXNTZXJ2aWNlLm9wdGlvbnM/LltUYXJnZXQuTGlzdERyb3Bkb3duXVwiPjwvZXMtZHJvcGRvd24+XG48YnV0dG9uXG4gICNtZW51VHJpZ2dlcj1cIm1hdE1lbnVUcmlnZ2VyXCJcbiAgbWF0LWJ1dHRvblxuICBjbGFzcz1cImRyb3Bkb3duLWR1bW15IGNkay12aXN1YWxseS1oaWRkZW5cIlxuICBbc3R5bGUubGVmdC5weF09XCJkcm9wZG93bkxlZnRcIlxuICBbc3R5bGUudG9wLnB4XT1cImRyb3Bkb3duVG9wXCJcbiAgW21hdE1lbnVUcmlnZ2VyRm9yXT1cImRyb3Bkb3duLm1lbnVcIlxuICB0YWJpbmRleD1cIi0xXCJcbiAgYXJpYS1oaWRkZW49XCJ0cnVlXCJcbj48L2J1dHRvbj5cbjxlcy1ub2RlLWVudHJpZXMtZ2xvYmFsLW9wdGlvbnNcbiAgKm5nSWY9XCIoZW50cmllc1NlcnZpY2UuZ2xvYmFsT3B0aW9uc1N1YmplY3QgfCBhc3luYyk/Lmxlbmd0aFwiXG4gIFtkaXNwbGF5VHlwZV09XCJOb2RlRW50cmllc0Rpc3BsYXlUeXBlLlRhYmxlXCJcbj5cbjwvZXMtbm9kZS1lbnRyaWVzLWdsb2JhbC1vcHRpb25zPlxuPG1hdC10YWJsZVxuICBbZGF0YVNvdXJjZV09XCJlbnRyaWVzU2VydmljZS5kYXRhU291cmNlXCJcbiAgbWF0U29ydFxuICBbbWF0U29ydERpc2FibGVDbGVhcl09XCJ0cnVlXCJcbiAgW21hdFNvcnRBY3RpdmVdPVwiZW50cmllc1NlcnZpY2Uuc29ydD8uYWN0aXZlXCJcbiAgW21hdFNvcnREaXJlY3Rpb25dPVwiZW50cmllc1NlcnZpY2Uuc29ydD8uZGlyZWN0aW9uXCJcbiAgZXNJbmZpbml0ZVNjcm9sbFxuICAoc2Nyb2xsZWQpPVwibG9hZERhdGEoJ3Njcm9sbCcpXCJcbj5cbiAgPCEtLSBDaGVja2JveCBDb2x1bW4gLS0+XG4gIDxuZy1jb250YWluZXIgbWF0Q29sdW1uRGVmPVwic2VsZWN0XCI+XG4gICAgPG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZj5cbiAgICAgIDxtYXQtY2hlY2tib3hcbiAgICAgICAgW25nTW9kZWxdPVwiZW50cmllc1NlcnZpY2Uuc2VsZWN0aW9uLnNlbGVjdGVkLmxlbmd0aCA+IDBcIlxuICAgICAgICBbaW5kZXRlcm1pbmF0ZV09XCJcbiAgICAgICAgICBlbnRyaWVzU2VydmljZS5zZWxlY3Rpb24uc2VsZWN0ZWQubGVuZ3RoID4gMCAmJlxuICAgICAgICAgIGVudHJpZXNTZXJ2aWNlLnNlbGVjdGlvbi5zZWxlY3RlZC5sZW5ndGggIT09IGVudHJpZXNTZXJ2aWNlLmRhdGFTb3VyY2UuZ2V0RGF0YSgpLmxlbmd0aFxuICAgICAgICBcIlxuICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJ0b2dnbGVBbGwoJGV2ZW50KVwiXG4gICAgICAgIGNvbG9yPVwicHJpbWFyeVwiXG4gICAgICAgIGFyaWEtbGFiZWw9XCJ7eyAnTElTVF9UQUJMRS5UT0dHTEVfQUxMJyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICA+PC9tYXQtY2hlY2tib3g+XG4gICAgPC9tYXQtaGVhZGVyLWNlbGw+XG4gICAgPG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IG5vZGVcIj5cbiAgICAgIDxtYXQtY2hlY2tib3hcbiAgICAgICAgW2NoZWNrZWRdPVwiZW50cmllc1NlcnZpY2Uuc2VsZWN0aW9uLmlzU2VsZWN0ZWQobm9kZSlcIlxuICAgICAgICAoY2hhbmdlKT1cImVudHJpZXNTZXJ2aWNlLm9uQ2hlY2tib3hDaGFuZ2VkKG5vZGUsICRldmVudC5jaGVja2VkKVwiXG4gICAgICAgIGFyaWEtbGFiZWw9XCJ7eyAnU0VMRUNUJyB8IHRyYW5zbGF0ZSA6IHsgZWxlbWVudDogKG5vZGUgfCBub2RlVGl0bGUpIH0gfX1cIlxuICAgICAgICBjb2xvcj1cInByaW1hcnlcIlxuICAgICAgPjwvbWF0LWNoZWNrYm94PlxuICAgIDwvbWF0LWNlbGw+XG4gIDwvbmctY29udGFpbmVyPlxuICA8ZGl2IG1hdENvbHVtbkRlZj1cImljb25cIj5cbiAgICA8bWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmIGNsYXNzPVwiY2VsbC1pY29uIGNlbGwtY291bnRcIj5cbiAgICAgICh7eyBlbnRyaWVzU2VydmljZS5zZWxlY3Rpb24uc2VsZWN0ZWQubGVuZ3RoXG4gICAgICB9fTxuZy1jb250YWluZXIgKm5nSWY9XCJlbnRyaWVzU2VydmljZS5kYXRhU291cmNlPy5nZXRUb3RhbCgpICE9PSB1bmRlZmluZWRcIj5cbiAgICAgICAgLyB7eyBlbnRyaWVzU2VydmljZS5kYXRhU291cmNlPy5nZXRUb3RhbCgpIH19PC9uZy1jb250YWluZXJcbiAgICAgID4pXG4gICAgPC9tYXQtaGVhZGVyLWNlbGw+XG4gICAgPG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IG5vZGVcIiBjbGFzcz1cImNlbGwtaWNvblwiPlxuICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAqbmdJZj1cImVudHJpZXNTZXJ2aWNlLmVsZW1lbnRJbnRlcmFjdGlvblR5cGUgPT09IEludGVyYWN0aW9uVHlwZS5EZWZhdWx0QWN0aW9uTGlua1wiXG4gICAgICA+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJpY29uOyBjb250ZXh0OiB7IG5vZGU6IHRoaXMubm9kZSB9XCI+PC9uZy1jb250YWluZXI+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDxkaXZcbiAgICAgICAgKm5nSWY9XCJlbnRyaWVzU2VydmljZS5lbGVtZW50SW50ZXJhY3Rpb25UeXBlICE9PSBJbnRlcmFjdGlvblR5cGUuRGVmYXVsdEFjdGlvbkxpbmtcIlxuICAgICAgICAoY2xpY2spPVwiXG4gICAgICAgICAgZW50cmllc1NlcnZpY2Uub25DbGlja2VkKHsgZXZlbnQ6ICRldmVudCwgZWxlbWVudDogbm9kZSwgc291cmNlOiBDbGlja1NvdXJjZS5JY29uIH0pXG4gICAgICAgIFwiXG4gICAgICAgIChkYmxjbGljayk9XCJlbnRyaWVzU2VydmljZS5kYmxDbGlja0l0ZW0uZW1pdCh7IGVsZW1lbnQ6IG5vZGUsIHNvdXJjZTogQ2xpY2tTb3VyY2UuSWNvbiB9KVwiXG4gICAgICA+XG4gICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAqbmdUZW1wbGF0ZU91dGxldD1cImljb247IGNvbnRleHQ6IHsgbm9kZTogdGhpcy5ub2RlIH1cIlxuICAgICAgICAgIChjbGljayk9XCJcbiAgICAgICAgICAgIGVudHJpZXNTZXJ2aWNlLm9uQ2xpY2tlZCh7IGV2ZW50OiAkZXZlbnQsIGVsZW1lbnQ6IG5vZGUsIHNvdXJjZTogQ2xpY2tTb3VyY2UuSWNvbiB9KVxuICAgICAgICAgIFwiXG4gICAgICAgICAgKGRibGNsaWNrKT1cImVudHJpZXNTZXJ2aWNlLmRibENsaWNrSXRlbS5lbWl0KHsgZWxlbWVudDogbm9kZSwgc291cmNlOiBDbGlja1NvdXJjZS5JY29uIH0pXCJcbiAgICAgICAgPjwvbmctY29udGFpbmVyPlxuICAgICAgPC9kaXY+XG4gICAgPC9tYXQtY2VsbD5cbiAgPC9kaXY+XG4gIDxuZy1jb250YWluZXIgbWF0Q29sdW1uRGVmPVwiYWN0aW9uc1wiPlxuICAgIDxtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWY+XG4gICAgICA8YnV0dG9uXG4gICAgICAgICpuZ0lmPVwiZW50cmllc1NlcnZpY2UuY29uZmlndXJlQ29sdW1uc1wiXG4gICAgICAgIG1hdC1pY29uLWJ1dHRvblxuICAgICAgICAoY2xpY2spPVwiY29sdW1uQ2hvb3NlclZpc2libGUgPSAhY29sdW1uQ2hvb3NlclZpc2libGVcIlxuICAgICAgICBjZGtPdmVybGF5T3JpZ2luXG4gICAgICAgICNjb2x1bW5DaG9vc2VyVHJpZ2dlcj1cImNka092ZXJsYXlPcmlnaW5cIlxuICAgICAgICBbbWF0VG9vbHRpcF09XCInTElTVF9UQUJMRS5DT05GSUdVUkVfQ09MVU1OUycgfCB0cmFuc2xhdGVcIlxuICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidMSVNUX1RBQkxFLkNPTkZJR1VSRV9DT0xVTU5TJyB8IHRyYW5zbGF0ZVwiXG4gICAgICA+XG4gICAgICAgIDxpIGVzSWNvbj1cInNldHRpbmdzXCI+PC9pPlxuICAgICAgPC9idXR0b24+XG4gICAgPC9tYXQtaGVhZGVyLWNlbGw+XG4gICAgPG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IG5vZGVcIj5cbiAgICAgIDxidXR0b25cbiAgICAgICAgbWF0LWljb24tYnV0dG9uXG4gICAgICAgICpuZ0lmPVwiZW50cmllc1NlcnZpY2Uub3B0aW9ucz8uW1RhcmdldC5MaXN0XT8ubGVuZ3RoXCJcbiAgICAgICAgY29sb3I9XCJwcmltYXJ5XCJcbiAgICAgICAgKGNsaWNrKT1cIm9wZW5NZW51KG5vZGUpXCJcbiAgICAgICAgW21hdE1lbnVUcmlnZ2VyRm9yXT1cImRyb3Bkb3duLm1lbnVcIlxuICAgICAgPlxuICAgICAgICA8aSBlc0ljb249XCJtb3JlX3ZlcnRcIiBbYXJpYV09XCJ0cnVlXCI+PC9pPlxuICAgICAgPC9idXR0b24+XG4gICAgPC9tYXQtY2VsbD5cbiAgPC9uZy1jb250YWluZXI+XG4gIDwhLS0gRGF0YSBDb2x1bW5zIC0tPlxuICA8bmctY29udGFpbmVyXG4gICAgKm5nRm9yPVwibGV0IGNvbHVtbiBvZiB2aXNpYmxlRGF0YUNvbHVtbnMkIHwgYXN5bmM7IGxldCBmaXJzdCA9IGZpcnN0XCJcbiAgICBbbWF0Q29sdW1uRGVmXT1cImNvbHVtbi5uYW1lXCJcbiAgPlxuICAgIDxuZy1jb250YWluZXI+XG4gICAgICA8bWF0LWhlYWRlci1jZWxsXG4gICAgICAgICptYXRIZWFkZXJDZWxsRGVmXG4gICAgICAgIG1hdC1zb3J0LWhlYWRlclxuICAgICAgICBbZGlzYWJsZWRdPVwiIShlbnRyaWVzU2VydmljZS5zb3J0Py5hbGxvd2VkICYmIGlzU29ydGFibGUoY29sdW1uKSlcIlxuICAgICAgICBbY2xhc3MubWF0LWNvbHVtbi1wcmltYXJ5XT1cImZpcnN0XCJcbiAgICAgICAgPnt7IGNvbHVtbiB8IGVzTGlzdEl0ZW1MYWJlbCB8IGFzeW5jIH19PC9tYXQtaGVhZGVyLWNlbGxcbiAgICAgID5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8bWF0LWNlbGxcbiAgICAgICptYXRDZWxsRGVmPVwibGV0IG5vZGVcIlxuICAgICAgI2NlbGxcbiAgICAgIFtjbGFzcy5tYXQtY29sdW1uLXByaW1hcnldPVwiZmlyc3RcIlxuICAgICAgYXR0ci5kYXRhLXRlc3Q9XCJ0YWJsZS1jZWxsLXt7IGNvbHVtbi5uYW1lIH19XCJcbiAgICA+XG4gICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICpuZ0lmPVwiZW50cmllc1NlcnZpY2UuZWxlbWVudEludGVyYWN0aW9uVHlwZSA9PT0gSW50ZXJhY3Rpb25UeXBlLkRlZmF1bHRBY3Rpb25MaW5rXCJcbiAgICAgID5cbiAgICAgICAgPGVzLW5vZGUtdXJsIGNka01vbml0b3JTdWJ0cmVlRm9jdXMgW25vZGVdPVwibm9kZVwiIFttb2RlXT1cImZpcnN0ID8gJ2xpbmsnIDogJ3dyYXBwZXInXCI+XG4gICAgICAgICAgPGVzLWxpc3QtYmFzZVxuICAgICAgICAgICAgW2ZvcmNlVGV4dF09XCJ0cnVlXCJcbiAgICAgICAgICAgIFtub2RlXT1cIm5vZGVcIlxuICAgICAgICAgICAgW2l0ZW1dPVwiY29sdW1uXCJcbiAgICAgICAgICAgIGVzQ2hlY2tUZXh0T3ZlcmZsb3dcbiAgICAgICAgICAgICN0ZXh0PVwiZXNDaGVja1RleHRPdmVyZmxvd1wiXG4gICAgICAgICAgICBbbWF0VG9vbHRpcF09XCJ0ZXh0Lmhhc1RleHRPdmVyZmxvdygpID8gY2VsbC5pbm5lclRleHQgOiBudWxsXCJcbiAgICAgICAgICAgIG1hdFRvb2x0aXBUb3VjaEdlc3R1cmVzPVwib2ZmXCJcbiAgICAgICAgICA+PC9lcy1saXN0LWJhc2U+XG4gICAgICAgIDwvZXMtbm9kZS11cmw+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDxlcy1saXN0LWJhc2VcbiAgICAgICAgKm5nSWY9XCJlbnRyaWVzU2VydmljZS5lbGVtZW50SW50ZXJhY3Rpb25UeXBlICE9PSBJbnRlcmFjdGlvblR5cGUuRGVmYXVsdEFjdGlvbkxpbmtcIlxuICAgICAgICBbZm9yY2VUZXh0XT1cInRydWVcIlxuICAgICAgICBbbm9kZV09XCJub2RlXCJcbiAgICAgICAgW2l0ZW1dPVwiY29sdW1uXCJcbiAgICAgICAgKGNsaWNrKT1cIlxuICAgICAgICAgIGVudHJpZXNTZXJ2aWNlLm9uQ2xpY2tlZCh7XG4gICAgICAgICAgICBldmVudDogJGV2ZW50LFxuICAgICAgICAgICAgZWxlbWVudDogbm9kZSxcbiAgICAgICAgICAgIHNvdXJjZTogQ2xpY2tTb3VyY2UuTWV0YWRhdGEsXG4gICAgICAgICAgICBhdHRyaWJ1dGU6IGNvbHVtbixcbiAgICAgICAgICB9KVxuICAgICAgICBcIlxuICAgICAgICAoZGJsY2xpY2spPVwiXG4gICAgICAgICAgZW50cmllc1NlcnZpY2UuZGJsQ2xpY2tJdGVtLmVtaXQoe1xuICAgICAgICAgICAgZWxlbWVudDogbm9kZSxcbiAgICAgICAgICAgIHNvdXJjZTogQ2xpY2tTb3VyY2UuTWV0YWRhdGEsXG4gICAgICAgICAgICBhdHRyaWJ1dGU6IGNvbHVtbixcbiAgICAgICAgICB9KVxuICAgICAgICBcIlxuICAgICAgPjwvZXMtbGlzdC1iYXNlPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImZpcnN0XCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjaGlsZG9iamVjdHNcIiAqbmdJZj1cIm5vZGUucHJvcGVydGllcz8uWyd2aXJ0dWFsOmNoaWxkb2JqZWN0Y291bnQnXSA+IDBcIj5cbiAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICBjbGFzcz1cImNoaWxkb2JqZWN0LWNvdW50XCJcbiAgICAgICAgICAgIG1hdFRvb2x0aXA9XCJ7e1xuICAgICAgICAgICAgICAnQ0hJTERPQkpFQ1RfQ09VTlQnXG4gICAgICAgICAgICAgICAgfCB0cmFuc2xhdGUgOiB7IGNvdW50OiBub2RlLnByb3BlcnRpZXNbJ3ZpcnR1YWw6Y2hpbGRvYmplY3Rjb3VudCddICogMSArIDEgfVxuICAgICAgICAgICAgfX1cIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxzcGFuPnt7IG5vZGUucHJvcGVydGllc1sndmlydHVhbDpjaGlsZG9iamVjdGNvdW50J10gKiAxICsgMSB9fTwvc3BhblxuICAgICAgICAgICAgPjxpIGVzSWNvbj1cImZpbHRlcl9ub25lXCI+PC9pPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgIDwvbWF0LWNlbGw+XG4gIDwvbmctY29udGFpbmVyPlxuICA8bWF0LWhlYWRlci1yb3cgbWF0LWhlYWRlci1yb3cgKm1hdEhlYWRlclJvd0RlZj1cInZpc2libGVDb2x1bW5OYW1lcyQgfCBhc3luY1wiPjwvbWF0LWhlYWRlci1yb3c+XG4gIDxtYXQtcm93XG4gICAgbWF0LXJvd1xuICAgIG1hdFJpcHBsZVxuICAgIGNka0RyYWdcbiAgICBlc05vZGVzRHJhZ1xuICAgIFtjZGtEcmFnRGlzYWJsZWRdPVwiIWVudHJpZXNTZXJ2aWNlLmRyYWdEcm9wPy5kcmFnQWxsb3dlZCB8fCAodWkuaXNUb3VjaFN1YmplY3QgfCBhc3luYylcIlxuICAgIFtjZGtEcmFnRGF0YV09XCJnZXREcmFnRGF0YShub2RlKVwiXG4gICAgKGNka0RyYWdTdGFydGVkKT1cIm9uRHJhZ1N0YXJ0ZWQobm9kZSlcIlxuICAgIChjZGtEcmFnRW5kZWQpPVwib25EcmFnRW5kZWQoKVwiXG4gICAgW2VzTm9kZXNEcm9wVGFyZ2V0XT1cIm5vZGVcIlxuICAgIFtjYW5Ecm9wTm9kZXNdPVwiY2FuRHJvcFwiXG4gICAgKG5vZGVEcm9wcGVkKT1cImRyb3AoJGV2ZW50KVwiXG4gICAgY2xhc3M9XCJtYXQtcm93XCJcbiAgICBbY2xhc3MubWF0LXJvdy1zZWxlY3RlZF09XCJlbnRyaWVzU2VydmljZS5zZWxlY3Rpb24uaXNTZWxlY3RlZChub2RlKVwiXG4gICAgW2NsYXNzLm1hdC1yb3ctaW1wb3J0LWJsb2NrZWRdPVwiaXNCbG9ja2VkKG5vZGUpXCJcbiAgICBbY2xhc3Muc2VsZWN0ZWQtd2hlbi1kcmFnZ2luZ109XCJpc0RyYWdnaW5nICYmIGVudHJpZXNTZXJ2aWNlLnNlbGVjdGlvbi5pc1NlbGVjdGVkKG5vZGUpXCJcbiAgICBbY2xhc3MubWF0LXJvdy12aXJ0dWFsXT1cIm5vZGUudmlydHVhbFwiXG4gICAgW2NsYXNzLm1hdC1yb3ctdmlydHVhbC1maXJzdF09XCJcbiAgICAgIG5vZGUudmlydHVhbCAmJiAhJGFueShlbnRyaWVzU2VydmljZS5kYXRhU291cmNlLmdldERhdGEoKVtpIC0gMV0pPy52aXJ0dWFsXG4gICAgXCJcbiAgICBbY2xhc3MubWF0LXJvdy12aXJ0dWFsLWxhc3RdPVwiXG4gICAgICBub2RlLnZpcnR1YWwgJiYgISRhbnkoZW50cmllc1NlcnZpY2UuZGF0YVNvdXJjZS5nZXREYXRhKClbaSArIDFdKT8udmlydHVhbFxuICAgIFwiXG4gICAgW2NsYXNzLmR5bmFtaWMtc2luZ2xlLWNsaWNrXT1cImVudHJpZXNTZXJ2aWNlLnNpbmdsZUNsaWNrSGludCA9PT0gJ2R5bmFtaWMnXCJcbiAgICAqbWF0Um93RGVmPVwibGV0IG5vZGU7IGxldCBpID0gaW5kZXg7IGxldCBsYXN0ID0gbGFzdDsgY29sdW1uczogdmlzaWJsZUNvbHVtbk5hbWVzJCB8IGFzeW5jXCJcbiAgICAoY29udGV4dG1lbnUpPVwib25Sb3dDb250ZXh0TWVudSh7IGV2ZW50OiAkZXZlbnQsIG5vZGU6IG5vZGUgfSlcIlxuICAgIChrZXlkb3duLkNvbnRleHRNZW51KT1cIm9uUm93Q29udGV4dE1lbnUoeyBldmVudDogJGV2ZW50LCBub2RlOiBub2RlIH0pXCJcbiAgPlxuICAgIDxlcy1kcmFnLXByZXZpZXdcbiAgICAgICpjZGtEcmFnUHJldmlld1xuICAgICAgW25vZGVdPVwibm9kZVwiXG4gICAgICBbc2VsZWN0ZWRdPVwiZW50cmllc1NlcnZpY2Uuc2VsZWN0aW9uLnNlbGVjdGVkXCJcbiAgICAgIFtpdGVtXT1cIih2aXNpYmxlRGF0YUNvbHVtbnMkIHwgYXN5bmMpWzBdXCJcbiAgICA+PC9lcy1kcmFnLXByZXZpZXc+XG4gIDwvbWF0LXJvdz5cbjwvbWF0LXRhYmxlPlxuPG5nLWNvbnRhaW5lclxuICAqbmdJZj1cIlxuICAgIChlbnRyaWVzU2VydmljZS5kYXRhU291cmNlLmlzTG9hZGluZ1N1YmplY3QgfCBhc3luYykgPT09IGZhbHNlICYmXG4gICAgZW50cmllc1NlcnZpY2UuZGF0YVNvdXJjZS5oYXNNb3JlKCkgJiZcbiAgICBlbnRyaWVzU2VydmljZS5wYWdpbmF0aW9uU3RyYXRlZ3kgPT09ICdpbmZpbml0ZS1zY3JvbGwnXG4gIFwiXG4+XG4gIDxkaXYgY2xhc3M9XCJsb2FkLW1vcmVcIj5cbiAgICA8YnV0dG9uIG1hdC1idXR0b24gY29sb3I9XCJwcmltYXJ5XCIgKGNsaWNrKT1cImxvYWREYXRhKCdidXR0b24nKVwiPlxuICAgICAgPGkgZXNJY29uPVwicmVmcmVzaFwiPjwvaT5cbiAgICAgIDxzcGFuPnt7ICdMT0FEX01PUkUnIHwgdHJhbnNsYXRlIH19PC9zcGFuPlxuICAgIDwvYnV0dG9uPlxuICA8L2Rpdj5cbjwvbmctY29udGFpbmVyPlxuPG5nLWNvbnRhaW5lciAqbmdJZj1cImVudHJpZXNTZXJ2aWNlLmRhdGFTb3VyY2UuaXNMb2FkaW5nU3ViamVjdCB8IGFzeW5jXCI+XG4gIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJsb2FkaW5nXCI+IDwvbmctY29udGFpbmVyPlxuPC9uZy1jb250YWluZXI+XG48IS0tXG48bWF0LXBhZ2luYXRvciAjcGFnaW5hdG9yIFtwYWdlU2l6ZU9wdGlvbnNdPVwicGFnZVNpemVPcHRpb25zXCI+PC9tYXQtcGFnaW5hdG9yPlxuLS0+XG5cbjwhLS0gV2FpdCBmb3IgcmVhZHkgc3RhdGUgdG8gYXZvaWQgY2hhbmdlZC1hZnRlci1jaGVja2VkIGVycm9yIHdoZW4gYGNvbHVtbkNob29zZXJUcmlnZ2VyYCBiZWNvbWVzXG5hdmFpbGFibGUuIC0tPlxuPGVzLWNvbHVtbi1jaG9vc2VyXG4gICpuZ0lmPVwiY29sdW1uQ2hvb3NlclRyaWdnZXJSZWFkeVwiXG4gIFsoY29sdW1ucyldPVwiZW50cmllc1NlcnZpY2UuY29sdW1uc1wiXG4gIFsoY29sdW1uQ2hvb3NlclZpc2libGUpXT1cImNvbHVtbkNob29zZXJWaXNpYmxlXCJcbiAgW29yaWdpbl09XCJjb2x1bW5DaG9vc2VyVHJpZ2dlclwiXG4+PC9lcy1jb2x1bW4tY2hvb3Nlcj5cbjxuZy10ZW1wbGF0ZSAjbG9hZGluZz5cbiAgPGVzLXNwaW5uZXI+PC9lcy1zcGlubmVyPlxuPC9uZy10ZW1wbGF0ZT5cbjxuZy10ZW1wbGF0ZSAjaWNvbiBsZXQtbm9kZT1cIm5vZGVcIj5cbiAgPGRpdiBjbGFzcz1cImljb24tYmdcIj5cbiAgICA8aW1nXG4gICAgICAqbmdJZj1cIm5vZGUuaWNvblVSTFwiXG4gICAgICBbc3JjXT1cIm5vZGUgfCBlc05vZGVJY29uIHwgYXN5bmNcIlxuICAgICAgW2FsdF09XCJcbiAgICAgICAgbm9kZS5tZWRpYXR5cGVcbiAgICAgICAgICA/ICgnTk9ERS5tZWRpYXR5cGUnIHwgdHJhbnNsYXRlKSArICc6ICcgKyAoJ01FRElBVFlQRS4nICsgbm9kZS5tZWRpYXR5cGUgfCB0cmFuc2xhdGUpXG4gICAgICAgICAgOiAnJ1xuICAgICAgXCJcbiAgICAgIFttYXRUb29sdGlwXT1cIlxuICAgICAgICBub2RlLm1lZGlhdHlwZVxuICAgICAgICAgID8gKCdOT0RFLm1lZGlhdHlwZScgfCB0cmFuc2xhdGUpICsgJzogJyArICgnTUVESUFUWVBFLicgKyBub2RlLm1lZGlhdHlwZSB8IHRyYW5zbGF0ZSlcbiAgICAgICAgICA6ICcnXG4gICAgICBcIlxuICAgICAgbWF0VG9vbHRpcFRvdWNoR2VzdHVyZXM9XCJvZmZcIlxuICAgIC8+XG4gICAgPGlcbiAgICAgICpuZ0lmPVwiIW5vZGUuaWNvblVSTFwiXG4gICAgICBbZXNJY29uXT1cIm5vZGUuYXV0aG9yaXR5VHlwZSA/IChub2RlLmF1dGhvcml0eVR5cGUgPT09ICdHUk9VUCcgPyAnZ3JvdXAnIDogJ3BlcnNvbicpIDogbnVsbFwiXG4gICAgPjwvaT5cbiAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuIl19
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
import { Injectable } from '@angular/core';
|
|
2
|
-
import * as i0 from "@angular/core";
|
|
3
|
-
export class NodeEntriesTemplatesService {
|
|
4
|
-
constructor() { }
|
|
5
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: NodeEntriesTemplatesService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
6
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: NodeEntriesTemplatesService }); }
|
|
7
|
-
}
|
|
8
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: NodeEntriesTemplatesService, decorators: [{
|
|
9
|
-
type: Injectable
|
|
10
|
-
}], ctorParameters: () => [] });
|
|
11
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm9kZS1lbnRyaWVzLXRlbXBsYXRlcy5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZWR1LXNoYXJpbmctdWkvc3JjL2xpYi9ub2RlLWVudHJpZXMvbm9kZS1lbnRyaWVzLXRlbXBsYXRlcy5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQWUsTUFBTSxlQUFlLENBQUM7O0FBR3hELE1BQU0sT0FBTywyQkFBMkI7SUEwQnBDLGdCQUFlLENBQUM7K0dBMUJQLDJCQUEyQjttSEFBM0IsMkJBQTJCOzs0RkFBM0IsMkJBQTJCO2tCQUR2QyxVQUFVIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSwgVGVtcGxhdGVSZWYgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIE5vZGVFbnRyaWVzVGVtcGxhdGVzU2VydmljZSB7XG4gICAgLyoqXG4gICAgICogY3VzdG9tIGhlYWRpbmcvdGl0bGUgYWJvdmUgdGhlIGN1cnJlbnQgcmVzdWx0IHNldFxuICAgICAqL1xuICAgIHRpdGxlOiBUZW1wbGF0ZVJlZjxhbnk+O1xuXG4gICAgLyoqXG4gICAgICogQWRkaXRpb25hbCB0b3AgbWF0dGVyIHRoYXQgaXMgcHJvdmlkZWQgYnkgdGhlIHNlbGVjdGVkIG5vZGUtZW50cmllcyBjb21wb25lbnQuXG4gICAgICovXG4gICAgZW50cmllc1RvcE1hdHRlcjogVGVtcGxhdGVSZWY8dW5rbm93bj47XG5cbiAgICAvKipcbiAgICAgKiBjdXN0b20gY29udGFpbmVyIGluIGNhc2UgdGhlIGRhdGEgc291cmNlIGlzIGVtcHR5XG4gICAgICovXG4gICAgZW1wdHk6IFRlbXBsYXRlUmVmPGFueT47XG5cbiAgICAvKipcbiAgICAgKiBjdXN0b20gY29udGFpbmVyIGZvciB0aGUgYWN0aW9uIGFyZWEgb24gZWFjaCBlbGVtZW50XG4gICAgICogKHNtYWxsIGdyaWQgb25seSlcbiAgICAgKi9cbiAgICBhY3Rpb25BcmVhOiBUZW1wbGF0ZVJlZjxhbnk+O1xuICAgIC8qKlxuICAgICAqIGN1c3RvbSBjb250YWluZXIgZm9yIHNob3dpbmcgYW4gb3ZlcmxheSBhY3Jvc3MgZWFjaCBlbGVtZW50XG4gICAgICovXG4gICAgb3ZlcmxheTogVGVtcGxhdGVSZWY8YW55PjtcblxuICAgIGNvbnN0cnVjdG9yKCkge31cbn1cbiJdfQ==
|