@alfresco/adf-content-services
Version:
Alfresco ADF content services
170 lines • 23.4 kB
JavaScript
/*!
* @license
* Copyright © 2005-2025 Hyland Software, Inc. and its affiliates. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/* eslint-disable @angular-eslint/no-input-rename */
import { Directive, EventEmitter, HostListener, Input, Output } from '@angular/core';
import { FavoritesApi } from '@alfresco/js-api';
import { from, forkJoin, of } from 'rxjs';
import { catchError, map } from 'rxjs/operators';
import { AlfrescoApiService } from '../services/alfresco-api.service';
import * as i0 from "@angular/core";
import * as i1 from "../services/alfresco-api.service";
export class NodeFavoriteDirective {
get favoritesApi() {
this._favoritesApi = this._favoritesApi ?? new FavoritesApi(this.alfrescoApiService.getInstance());
return this._favoritesApi;
}
onClick() {
this.toggleFavorite();
}
constructor(alfrescoApiService) {
this.alfrescoApiService = alfrescoApiService;
this.favorites = [];
/** Array of nodes to toggle as favorites. */
this.selection = [];
/** Emitted when the favorite setting is complete. */
this.toggle = new EventEmitter();
/** Emitted when the favorite setting fails. */
this.error = new EventEmitter();
}
ngOnChanges(changes) {
if (!changes.selection.currentValue.length) {
this.favorites = [];
return;
}
this.markFavoritesNodes(changes.selection.currentValue);
}
toggleFavorite() {
if (!this.favorites.length) {
return;
}
const every = this.favorites.every((selected) => selected.entry.isFavorite);
if (every) {
const batch = this.favorites.map((selected) => {
// shared files have nodeId
const id = selected.entry.nodeId || selected.entry.id;
return from(this.favoritesApi.deleteFavorite('-me-', id));
});
forkJoin(batch).subscribe(() => {
this.favorites.forEach((selected) => (selected.entry.isFavorite = false));
this.toggle.emit();
}, (error) => this.error.emit(error));
}
if (!every) {
const notFavorite = this.favorites.filter((node) => !node.entry.isFavorite);
const body = notFavorite.map((node) => this.createFavoriteBody(node));
from(this.favoritesApi.createFavorite('-me-', body)).subscribe(() => {
notFavorite.forEach((selected) => (selected.entry.isFavorite = true));
this.toggle.emit();
}, (error) => this.error.emit(error));
}
}
markFavoritesNodes(selection) {
if (selection.length <= this.favorites.length) {
this.favorites = this.reduce(this.favorites, selection);
}
const result = this.diff(selection, this.favorites);
const batch = this.getProcessBatch(result);
forkJoin(batch).subscribe((data) => {
this.favorites.push(...data);
});
}
hasFavorites() {
if (this.favorites && !this.favorites.length) {
return false;
}
return this.favorites.every((selected) => selected.entry.isFavorite);
}
getProcessBatch(selection) {
return selection.map((selected) => this.getFavorite(selected));
}
getFavorite(selected) {
const node = selected.entry;
// ACS 6.x with 'isFavorite' include
if (node && Object.prototype.hasOwnProperty.call(node, 'isFavorite')) {
return of(selected);
}
// ACS 5.x and 6.x without 'isFavorite' include
const { name, isFile, isFolder } = node;
const id = node.nodeId || node.id;
const promise = this.favoritesApi.getFavorite('-me-', id);
return from(promise).pipe(map(() => ({
entry: {
id,
isFolder,
isFile,
name,
isFavorite: true
}
})), catchError(() => of({
entry: {
id,
isFolder,
isFile,
name,
isFavorite: false
}
})));
}
createFavoriteBody(node) {
const type = this.getNodeType(node);
// shared files have nodeId
const id = node.entry['nodeId'] || node.entry.id;
return {
target: {
[type]: {
guid: id
}
}
};
}
getNodeType(node) {
// shared could only be files
if (!node.entry.isFile && !node.entry.isFolder) {
return 'file';
}
return node.entry.isFile ? 'file' : 'folder';
}
diff(list, patch) {
const ids = patch.map((item) => item.entry.id);
return list.filter((item) => (ids.includes(item.entry.id) ? null : item));
}
reduce(patch, comparator) {
const ids = comparator.map((item) => item.entry.id);
return patch.filter((item) => (ids.includes(item.entry.id) ? item : null));
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.1.3", ngImport: i0, type: NodeFavoriteDirective, deps: [{ token: i1.AlfrescoApiService }], target: i0.ɵɵFactoryTarget.Directive }); }
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "17.1.3", type: NodeFavoriteDirective, isStandalone: true, selector: "[adf-node-favorite]", inputs: { selection: ["adf-node-favorite", "selection"] }, outputs: { toggle: "toggle", error: "error" }, host: { listeners: { "click": "onClick()" } }, exportAs: ["adfFavorite"], usesOnChanges: true, ngImport: i0 }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.1.3", ngImport: i0, type: NodeFavoriteDirective, decorators: [{
type: Directive,
args: [{
standalone: true,
selector: '[adf-node-favorite]',
exportAs: 'adfFavorite'
}]
}], ctorParameters: () => [{ type: i1.AlfrescoApiService }], propDecorators: { selection: [{
type: Input,
args: ['adf-node-favorite']
}], toggle: [{
type: Output
}], error: [{
type: Output
}], onClick: [{
type: HostListener,
args: ['click']
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm9kZS1mYXZvcml0ZS5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9saWIvY29udGVudC1zZXJ2aWNlcy9zcmMvbGliL2RpcmVjdGl2ZXMvbm9kZS1mYXZvcml0ZS5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsb0RBQW9EO0FBRXBELE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQWEsTUFBTSxFQUFpQixNQUFNLGVBQWUsQ0FBQztBQUMvRyxPQUFPLEVBQW9FLFlBQVksRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ2xILE9BQU8sRUFBYyxJQUFJLEVBQUUsUUFBUSxFQUFFLEVBQUUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUN0RCxPQUFPLEVBQUUsVUFBVSxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ2pELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGtDQUFrQyxDQUFDOzs7QUFPdEUsTUFBTSxPQUFPLHFCQUFxQjtJQUk5QixJQUFJLFlBQVk7UUFDWixJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQyxhQUFhLElBQUksSUFBSSxZQUFZLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUM7UUFDbkcsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDO0lBQzlCLENBQUM7SUFhRCxPQUFPO1FBQ0gsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO0lBQzFCLENBQUM7SUFFRCxZQUFvQixrQkFBc0M7UUFBdEMsdUJBQWtCLEdBQWxCLGtCQUFrQixDQUFvQjtRQXZCMUQsY0FBUyxHQUFVLEVBQUUsQ0FBQztRQVF0Qiw2Q0FBNkM7UUFFN0MsY0FBUyxHQUFnQixFQUFFLENBQUM7UUFFNUIscURBQXFEO1FBQzNDLFdBQU0sR0FBRyxJQUFJLFlBQVks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USxFQUFFLHFCQUFxQjtvQkFDL0IsUUFBUSxFQUFFLGFBQWE7aUJBQzFCO3VGQVlHLFNBQVM7c0JBRFIsS0FBSzt1QkFBQyxtQkFBbUI7Z0JBSWhCLE1BQU07c0JBQWYsTUFBTTtnQkFHRyxLQUFLO3NCQUFkLE1BQU07Z0JBR1AsT0FBTztzQkFETixZQUFZO3VCQUFDLE9BQU8iLCJzb3VyY2VzQ29udGVudCI6WyIvKiFcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgwqkgMjAwNS0yMDI1IEh5bGFuZCBTb2Z0d2FyZSwgSW5jLiBhbmQgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbi8qIGVzbGludC1kaXNhYmxlIEBhbmd1bGFyLWVzbGludC9uby1pbnB1dC1yZW5hbWUgKi9cblxuaW1wb3J0IHsgRGlyZWN0aXZlLCBFdmVudEVtaXR0ZXIsIEhvc3RMaXN0ZW5lciwgSW5wdXQsIE9uQ2hhbmdlcywgT3V0cHV0LCBTaW1wbGVDaGFuZ2VzIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBGYXZvcml0ZUJvZHlDcmVhdGUsIE5vZGVFbnRyeSwgU2hhcmVkTGlua0VudHJ5LCBOb2RlLCBTaGFyZWRMaW5rLCBGYXZvcml0ZXNBcGkgfSBmcm9tICdAYWxmcmVzY28vanMtYXBpJztcbmltcG9ydCB7IE9ic2VydmFibGUsIGZyb20sIGZvcmtKb2luLCBvZiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgY2F0Y2hFcnJvciwgbWFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgQWxmcmVzY29BcGlTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvYWxmcmVzY28tYXBpLnNlcnZpY2UnO1xuXG5ARGlyZWN0aXZlKHtcbiAgICBzdGFuZGFsb25lOiB0cnVlLFxuICAgIHNlbGVjdG9yOiAnW2FkZi1ub2RlLWZhdm9yaXRlXScsXG4gICAgZXhwb3J0QXM6ICdhZGZGYXZvcml0ZSdcbn0pXG5leHBvcnQgY2xhc3MgTm9kZUZhdm9yaXRlRGlyZWN0aXZlIGltcGxlbWVudHMgT25DaGFuZ2VzIHtcbiAgICBmYXZvcml0ZXM6IGFueVtdID0gW107XG5cbiAgICBwcml2YXRlIF9mYXZvcml0ZXNBcGk6IEZhdm9yaXRlc0FwaTtcbiAgICBnZXQgZmF2b3JpdGVzQXBpKCk6IEZhdm9yaXRlc0FwaSB7XG4gICAgICAgIHRoaXMuX2Zhdm9yaXRlc0FwaSA9IHRoaXMuX2Zhdm9yaXRlc0FwaSA/PyBuZXcgRmF2b3JpdGVzQXBpKHRoaXMuYWxmcmVzY29BcGlTZXJ2aWNlLmdldEluc3RhbmNlKCkpO1xuICAgICAgICByZXR1cm4gdGhpcy5fZmF2b3JpdGVzQXBpO1xuICAgIH1cblxuICAgIC8qKiBBcnJheSBvZiBub2RlcyB0byB0b2dnbGUgYXMgZmF2b3JpdGVzLiAqL1xuICAgIEBJbnB1dCgnYWRmLW5vZGUtZmF2b3JpdGUnKVxuICAgIHNlbGVjdGlvbjogTm9kZUVudHJ5W10gPSBbXTtcblxuICAgIC8qKiBFbWl0dGVkIHdoZW4gdGhlIGZhdm9yaXRlIHNldHRpbmcgaXMgY29tcGxldGUuICovXG4gICAgQE91dHB1dCgpIHRvZ2dsZSA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuXG4gICAgLyoqIEVtaXR0ZWQgd2hlbiB0aGUgZmF2b3JpdGUgc2V0dGluZyBmYWlscy4gKi9cbiAgICBAT3V0cHV0KCkgZXJyb3IgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcblxuICAgIEBIb3N0TGlzdGVuZXIoJ2NsaWNrJylcbiAgICBvbkNsaWNrKCkge1xuICAgICAgICB0aGlzLnRvZ2dsZUZhdm9yaXRlKCk7XG4gICAgfVxuXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSBhbGZyZXNjb0FwaVNlcnZpY2U6IEFsZnJlc2NvQXBpU2VydmljZSkge31cblxuICAgIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpIHtcbiAgICAgICAgaWYgKCFjaGFuZ2VzLnNlbGVjdGlvbi5jdXJyZW50VmFsdWUubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aGlzLmZhdm9yaXRlcyA9IFtdO1xuXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLm1hcmtGYXZvcml0ZXNOb2RlcyhjaGFuZ2VzLnNlbGVjdGlvbi5jdXJyZW50VmFsdWUpO1xuICAgIH1cblxuICAgIHRvZ2dsZUZhdm9yaXRlKCkge1xuICAgICAgICBpZiAoIXRoaXMuZmF2b3JpdGVzLmxlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZXZlcnkgPSB0aGlzLmZhdm9yaXRlcy5ldmVyeSgoc2VsZWN0ZWQpID0+IHNlbGVjdGVkLmVudHJ5LmlzRmF2b3JpdGUpO1xuXG4gICAgICAgIGlmIChldmVyeSkge1xuICAgICAgICAgICAgY29uc3QgYmF0Y2ggPSB0aGlzLmZhdm9yaXRlcy5tYXAoKHNlbGVjdGVkOiBOb2RlRW50cnkgfCBTaGFyZWRMaW5rRW50cnkpID0+IHtcbiAgICAgICAgICAgICAgICAvLyBzaGFyZWQgZmlsZXMgaGF2ZSBub2RlSWRcbiAgICAgICAgICAgICAgICBjb25zdCBpZCA9IChzZWxlY3RlZCBhcyBTaGFyZWRMaW5rRW50cnkpLmVudHJ5Lm5vZGVJZCB8fCBzZWxlY3RlZC5lbnRyeS5pZDtcblxuICAgICAgICAgICAgICAgIHJldHVybiBmcm9tKHRoaXMuZmF2b3JpdGVzQXBpLmRlbGV0ZUZhdm9yaXRlKCctbWUtJywgaWQpKTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBmb3JrSm9pbihiYXRjaCkuc3Vic2NyaWJlKFxuICAgICAgICAgICAgICAgICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5mYXZvcml0ZXMuZm9yRWFjaCgoc2VsZWN0ZWQpID0+IChzZWxlY3RlZC5lbnRyeS5pc0Zhdm9yaXRlID0gZmFsc2UpKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50b2dnbGUuZW1pdCgpO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgKGVycm9yKSA9PiB0aGlzLmVycm9yLmVtaXQoZXJyb3IpXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFldmVyeSkge1xuICAgICAgICAgICAgY29uc3Qgbm90RmF2b3JpdGUgPSB0aGlzLmZhdm9yaXRlcy5maWx0ZXIoKG5vZGUpID0+ICFub2RlLmVudHJ5LmlzRmF2b3JpdGUpO1xuICAgICAgICAgICAgY29uc3QgYm9keSA9IG5vdEZhdm9yaXRlLm1hcCgobm9kZSkgPT4gdGhpcy5jcmVhdGVGYXZvcml0ZUJvZHkobm9kZSkpO1xuXG4gICAgICAgICAgICBmcm9tKHRoaXMuZmF2b3JpdGVzQXBpLmNyZWF0ZUZhdm9yaXRlKCctbWUtJywgYm9keSBhcyBhbnkpKS5zdWJzY3JpYmUoXG4gICAgICAgICAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBub3RGYXZvcml0ZS5mb3JFYWNoKChzZWxlY3RlZCkgPT4gKHNlbGVjdGVkLmVudHJ5LmlzRmF2b3JpdGUgPSB0cnVlKSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudG9nZ2xlLmVtaXQoKTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIChlcnJvcikgPT4gdGhpcy5lcnJvci5lbWl0KGVycm9yKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIG1hcmtGYXZvcml0ZXNOb2RlcyhzZWxlY3Rpb246IE5vZGVFbnRyeVtdKSB7XG4gICAgICAgIGlmIChzZWxlY3Rpb24ubGVuZ3RoIDw9IHRoaXMuZmF2b3JpdGVzLmxlbmd0aCkge1xuICAgICAgICAgICAgdGhpcy5mYXZvcml0ZXMgPSB0aGlzLnJlZHVjZSh0aGlzLmZhdm9yaXRlcywgc2VsZWN0aW9uKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuZGlmZihzZWxlY3Rpb24sIHRoaXMuZmF2b3JpdGVzKTtcbiAgICAgICAgY29uc3QgYmF0Y2ggPSB0aGlzLmdldFByb2Nlc3NCYXRjaChyZXN1bHQpO1xuXG4gICAgICAgIGZvcmtKb2luKGJhdGNoKS5zdWJzY3JpYmUoKGRhdGEpID0+IHtcbiAgICAgICAgICAgIHRoaXMuZmF2b3JpdGVzLnB1c2goLi4uZGF0YSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGhhc0Zhdm9yaXRlcygpOiBib29sZWFuIHtcbiAgICAgICAgaWYgKHRoaXMuZmF2b3JpdGVzICYmICF0aGlzLmZhdm9yaXRlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLmZhdm9yaXRlcy5ldmVyeSgoc2VsZWN0ZWQpID0+IHNlbGVjdGVkLmVudHJ5LmlzRmF2b3JpdGUpO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0UHJvY2Vzc0JhdGNoKHNlbGVjdGlvbjogTm9kZUVudHJ5W10pOiBPYnNlcnZhYmxlPGFueT5bXSB7XG4gICAgICAgIHJldHVybiBzZWxlY3Rpb24ubWFwKChzZWxlY3RlZCkgPT4gdGhpcy5nZXRGYXZvcml0ZShzZWxlY3RlZCkpO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0RmF2b3JpdGUoc2VsZWN0ZWQ6IE5vZGVFbnRyeSB8IFNoYXJlZExpbmtFbnRyeSk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgICAgIGNvbnN0IG5vZGU6IE5vZGUgfCBTaGFyZWRMaW5rID0gc2VsZWN0ZWQuZW50cnk7XG5cbiAgICAgICAgLy8gQUNTIDYueCB3aXRoICdpc0Zhdm9yaXRlJyBpbmNsdWRlXG4gICAgICAgIGlmIChub2RlICYmIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChub2RlLCAnaXNGYXZvcml0ZScpKSB7XG4gICAgICAgICAgICByZXR1cm4gb2Yoc2VsZWN0ZWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQUNTIDUueCBhbmQgNi54IHdpdGhvdXQgJ2lzRmF2b3JpdGUnIGluY2x1ZGVcbiAgICAgICAgY29uc3QgeyBuYW1lLCBpc0ZpbGUsIGlzRm9sZGVyIH0gPSBub2RlIGFzIE5vZGU7XG4gICAgICAgIGNvbnN0IGlkID0gKG5vZGUgYXMgU2hhcmVkTGluaykubm9kZUlkIHx8IG5vZGUuaWQ7XG5cbiAgICAgICAgY29uc3QgcHJvbWlzZSA9IHRoaXMuZmF2b3JpdGVzQXBpLmdldEZhdm9yaXRlKCctbWUtJywgaWQpO1xuXG4gICAgICAgIHJldHVybiBmcm9tKHByb21pc2UpLnBpcGUoXG4gICAgICAgICAgICBtYXAoKCkgPT4gKHtcbiAgICAgICAgICAgICAgICBlbnRyeToge1xuICAgICAgICAgICAgICAgICAgICBpZCxcbiAgICAgICAgICAgICAgICAgICAgaXNGb2xkZXIsXG4gICAgICAgICAgICAgICAgICAgIGlzRmlsZSxcbiAgICAgICAgICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgICAgICAgICAgaXNGYXZvcml0ZTogdHJ1ZVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pKSxcbiAgICAgICAgICAgIGNhdGNoRXJyb3IoKCkgPT5cbiAgICAgICAgICAgICAgICBvZih7XG4gICAgICAgICAgICAgICAgICAgIGVudHJ5OiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGlzRm9sZGVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgaXNGaWxlLFxuICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGlzRmF2b3JpdGU6IGZhbHNlXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKVxuICAgICAgICApO1xuICAgIH1cblxuICAgIHByaXZhdGUgY3JlYXRlRmF2b3JpdGVCb2R5KG5vZGU6IE5vZGVFbnRyeSk6IEZhdm9yaXRlQm9keUNyZWF0ZSB7XG4gICAgICAgIGNvbnN0IHR5cGUgPSB0aGlzLmdldE5vZGVUeXBlKG5vZGUpO1xuICAgICAgICAvLyBzaGFyZWQgZmlsZXMgaGF2ZSBub2RlSWRcbiAgICAgICAgY29uc3QgaWQgPSBub2RlLmVudHJ5Wydub2RlSWQnXSB8fCBub2RlLmVudHJ5LmlkO1xuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB0YXJnZXQ6IHtcbiAgICAgICAgICAgICAgICBbdHlwZV06IHtcbiAgICAgICAgICAgICAgICAgICAgZ3VpZDogaWRcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXROb2RlVHlwZShub2RlOiBOb2RlRW50cnkpOiBzdHJpbmcge1xuICAgICAgICAvLyBzaGFyZWQgY291bGQgb25seSBiZSBmaWxlc1xuICAgICAgICBpZiAoIW5vZGUuZW50cnkuaXNGaWxlICYmICFub2RlLmVudHJ5LmlzRm9sZGVyKSB7XG4gICAgICAgICAgICByZXR1cm4gJ2ZpbGUnO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG5vZGUuZW50cnkuaXNGaWxlID8gJ2ZpbGUnIDogJ2ZvbGRlcic7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBkaWZmKGxpc3Q6IE5vZGVFbnRyeVtdLCBwYXRjaDogYW55W10pOiBOb2RlRW50cnlbXSB7XG4gICAgICAgIGNvbnN0IGlkcyA9IHBhdGNoLm1hcCgoaXRlbSkgPT4gaXRlbS5lbnRyeS5pZCk7XG5cbiAgICAgICAgcmV0dXJuIGxpc3QuZmlsdGVyKChpdGVtKSA9PiAoaWRzLmluY2x1ZGVzKGl0ZW0uZW50cnkuaWQpID8gbnVsbCA6IGl0ZW0pKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHJlZHVjZShwYXRjaDogYW55W10sIGNvbXBhcmF0b3I6IE5vZGVFbnRyeVtdKTogYW55W10ge1xuICAgICAgICBjb25zdCBpZHMgPSBjb21wYXJhdG9yLm1hcCgoaXRlbSkgPT4gaXRlbS5lbnRyeS5pZCk7XG5cbiAgICAgICAgcmV0dXJuIHBhdGNoLmZpbHRlcigoaXRlbSkgPT4gKGlkcy5pbmNsdWRlcyhpdGVtLmVudHJ5LmlkKSA/IGl0ZW0gOiBudWxsKSk7XG4gICAgfVxufVxuIl19