@alfresco/adf-content-services
Version:
Alfresco ADF content services
115 lines • 24.3 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.
*/
import { TranslationService } from '@alfresco/adf-core';
import { Component, DestroyRef, EventEmitter, inject, Input, Output, ViewEncapsulation } from '@angular/core';
import { TagService } from '../services/tag.service';
import { CommonModule } from '@angular/common';
import { MatListModule } from '@angular/material/list';
import { MatIconModule } from '@angular/material/icon';
import { MatFormFieldModule } from '@angular/material/form-field';
import { MatInputModule } from '@angular/material/input';
import { TranslateModule } from '@ngx-translate/core';
import { FormsModule } from '@angular/forms';
import { MatButtonModule } from '@angular/material/button';
import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
import * as i0 from "@angular/core";
import * as i1 from "../services/tag.service";
import * as i2 from "@alfresco/adf-core";
import * as i3 from "@angular/common";
import * as i4 from "@angular/material/list";
import * as i5 from "@angular/material/icon";
import * as i6 from "@angular/material/form-field";
import * as i7 from "@angular/material/input";
import * as i8 from "@ngx-translate/core";
import * as i9 from "@angular/forms";
import * as i10 from "@angular/material/button";
/**
*
* This component, provide a list of the tags relative a node with actions button to add or remove new tag
*/
export class TagActionsComponent {
constructor(tagService, translateService) {
this.tagService = tagService;
this.translateService = translateService;
/** Emitted when a tag is added successfully. */
this.successAdd = new EventEmitter();
/** Emitted when an error occurs. */
this.error = new EventEmitter();
/** Emitted when an action is chosen. */
this.result = new EventEmitter();
this.disableAddTag = true;
this.destroyRef = inject(DestroyRef);
}
ngOnInit() {
this.tagService.refresh.pipe(takeUntilDestroyed(this.destroyRef)).subscribe(() => this.refreshTag());
}
ngOnChanges() {
return this.refreshTag();
}
refreshTag() {
if (this.nodeId) {
this.tagService.getTagsByNodeId(this.nodeId).subscribe((tagPaging) => {
this.tagsEntries = tagPaging.list.entries;
this.disableAddTag = false;
this.result.emit(this.tagsEntries);
}, () => {
this.tagsEntries = null;
this.disableAddTag = true;
this.result.emit(this.tagsEntries);
});
}
}
addTag() {
if (this.searchTag(this.newTagName)) {
this.errorMsg = this.translateService.instant('TAG.MESSAGES.EXIST');
this.error.emit(this.errorMsg);
}
else {
this.tagService.addTag(this.nodeId, this.newTagName).subscribe(() => {
this.newTagName = '';
this.successAdd.emit(this.nodeId);
});
}
}
searchTag(searchTagName) {
if (this.tagsEntries) {
return this.tagsEntries.find((currentTag) => searchTagName === currentTag.entry.tag);
}
}
cleanErrorMsg() {
this.errorMsg = '';
}
removeTag(tag) {
this.tagService.removeTag(this.nodeId, tag);
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.1.3", ngImport: i0, type: TagActionsComponent, deps: [{ token: i1.TagService }, { token: i2.TranslationService }], target: i0.ɵɵFactoryTarget.Component }); }
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.1.3", type: TagActionsComponent, isStandalone: true, selector: "adf-tag-node-actions-list", inputs: { nodeId: "nodeId" }, outputs: { successAdd: "successAdd", error: "error", result: "result" }, host: { classAttribute: "adf-tag-node-actions-list" }, usesOnChanges: true, ngImport: i0, template: "<mat-list>\n <mat-list-item *ngFor=\"let currentEntry of tagsEntries; let idx = index\">\n <div\n class=\"adf-tag-actions-container\"\n id=\"tag_delete_{{ currentEntry.entry.tag }}\"\n tabindex=\"0\"\n role=\"button\"\n (keyup.enter)=\"removeTag(currentEntry.entry.id)\"\n (click)=\"removeTag(currentEntry.entry.id)\"\n >\n <div class=\"adf-tag-actions-delete-text\" id=\"tag_name_{{ currentEntry.entry.tag }}\">{{ currentEntry.entry.tag }}</div>\n <mat-icon class=\"adf-tag-actions-delete-icon\">delete</mat-icon>\n </div>\n </mat-list-item>\n</mat-list>\n<table class=\"adf-full-width\" cellspacing=\"0\">\n <tr>\n <td>\n <mat-form-field class=\"adf-full-width\">\n <input\n id=\"new-tag-text\"\n matInput\n placeholder=\"{{ 'TAG.LABEL.NEWTAG' | translate }}\"\n type=\"text\"\n (keypress)=\"cleanErrorMsg()\"\n [(ngModel)]=\"newTagName\"\n />\n <mat-hint data-automation-id=\"errorMessage\" *ngIf=\"error\" [ngStyle]=\"{ color: 'red' }\" align=\"start\">{{ errorMsg }} </mat-hint>\n </mat-form-field>\n </td>\n <td>\n <button id=\"add-tag\" class=\"adf-full-width\" color=\"primary\" (click)=\"addTag()\" [disabled]=\"disableAddTag\" mat-raised-button>\n {{ 'TAG.BUTTON.ADD' | translate }}\n </button>\n </td>\n </tr>\n</table>\n", styles: [".adf-tag-node-actions-list .adf-full-width{width:100%}.adf-tag-node-actions-list .adf-tag-actions-delete-icon{float:right;cursor:pointer}.adf-tag-node-actions-list .adf-tag-actions-delete-text{font-size:var(--theme-subheading-2-font-size);float:left}.adf-tag-node-actions-list .adf-tag-actions-container{padding:8px 0;height:20px}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "ngmodule", type: MatListModule }, { kind: "component", type: i4.MatList, selector: "mat-list", exportAs: ["matList"] }, { kind: "component", type: i4.MatListItem, selector: "mat-list-item, a[mat-list-item], button[mat-list-item]", inputs: ["activated"], exportAs: ["matListItem"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i5.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i6.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i6.MatHint, selector: "mat-hint", inputs: ["align", "id"] }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i7.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i8.TranslatePipe, name: "translate" }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i9.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i9.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i9.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i10.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }], encapsulation: i0.ViewEncapsulation.None }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.1.3", ngImport: i0, type: TagActionsComponent, decorators: [{
type: Component,
args: [{ selector: 'adf-tag-node-actions-list', standalone: true, imports: [CommonModule, MatListModule, MatIconModule, MatFormFieldModule, MatInputModule, TranslateModule, FormsModule, MatButtonModule], encapsulation: ViewEncapsulation.None, host: { class: 'adf-tag-node-actions-list' }, template: "<mat-list>\n <mat-list-item *ngFor=\"let currentEntry of tagsEntries; let idx = index\">\n <div\n class=\"adf-tag-actions-container\"\n id=\"tag_delete_{{ currentEntry.entry.tag }}\"\n tabindex=\"0\"\n role=\"button\"\n (keyup.enter)=\"removeTag(currentEntry.entry.id)\"\n (click)=\"removeTag(currentEntry.entry.id)\"\n >\n <div class=\"adf-tag-actions-delete-text\" id=\"tag_name_{{ currentEntry.entry.tag }}\">{{ currentEntry.entry.tag }}</div>\n <mat-icon class=\"adf-tag-actions-delete-icon\">delete</mat-icon>\n </div>\n </mat-list-item>\n</mat-list>\n<table class=\"adf-full-width\" cellspacing=\"0\">\n <tr>\n <td>\n <mat-form-field class=\"adf-full-width\">\n <input\n id=\"new-tag-text\"\n matInput\n placeholder=\"{{ 'TAG.LABEL.NEWTAG' | translate }}\"\n type=\"text\"\n (keypress)=\"cleanErrorMsg()\"\n [(ngModel)]=\"newTagName\"\n />\n <mat-hint data-automation-id=\"errorMessage\" *ngIf=\"error\" [ngStyle]=\"{ color: 'red' }\" align=\"start\">{{ errorMsg }} </mat-hint>\n </mat-form-field>\n </td>\n <td>\n <button id=\"add-tag\" class=\"adf-full-width\" color=\"primary\" (click)=\"addTag()\" [disabled]=\"disableAddTag\" mat-raised-button>\n {{ 'TAG.BUTTON.ADD' | translate }}\n </button>\n </td>\n </tr>\n</table>\n", styles: [".adf-tag-node-actions-list .adf-full-width{width:100%}.adf-tag-node-actions-list .adf-tag-actions-delete-icon{float:right;cursor:pointer}.adf-tag-node-actions-list .adf-tag-actions-delete-text{font-size:var(--theme-subheading-2-font-size);float:left}.adf-tag-node-actions-list .adf-tag-actions-container{padding:8px 0;height:20px}\n"] }]
}], ctorParameters: () => [{ type: i1.TagService }, { type: i2.TranslationService }], propDecorators: { nodeId: [{
type: Input,
args: [{ required: true }]
}], successAdd: [{
type: Output
}], error: [{
type: Output
}], result: [{
type: Output
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFnLWFjdGlvbnMuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGliL2NvbnRlbnQtc2VydmljZXMvc3JjL2xpYi90YWcvdGFnLWFjdGlvbnMvdGFnLWFjdGlvbnMuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGliL2NvbnRlbnQtc2VydmljZXMvc3JjL2xpYi90YWcvdGFnLWFjdGlvbnMvdGFnLWFjdGlvbnMuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDeEQsT0FBTyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQXFCLE1BQU0sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNqSSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFFckQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN2RCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDdkQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDbEUsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ3pELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUN0RCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDN0MsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzNELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDRCQUE0QixDQUFDOzs7Ozs7Ozs7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O1FBQ2pCLElBQUksQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDaEQsQ0FBQzs4R0EzRVEsbUJBQW1CO2tHQUFuQixtQkFBbUIsd1FDN0NoQyxpa0RBcUNBLHFZREVjLFlBQVksb1ZBQUUsYUFBYSx1UkFBRSxhQUFhLG1MQUFFLGtCQUFrQixpVUFBRSxjQUFjLDBXQUFFLGVBQWUsMkZBQUUsV0FBVyw4bUJBQUUsZUFBZTs7MkZBTTlILG1CQUFtQjtrQkFUL0IsU0FBUzsrQkFDSSwyQkFBMkIsY0FDekIsSUFBSSxXQUNQLENBQUMsWUFBWSxFQUFFLGFBQWEsRUFBRSxhQUFhLEVBQUUsa0JBQWtCLEVBQUUsY0FBYyxFQUFFLGVBQWUsRUFBRSxXQUFXLEVBQUUsZUFBZSxDQUFDLGlCQUd6SCxpQkFBaUIsQ0FBQyxJQUFJLFFBQy9CLEVBQUUsS0FBSyxFQUFFLDJCQUEyQixFQUFFO2dIQUs1QyxNQUFNO3NCQURMLEtBQUs7dUJBQUMsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFO2dCQUt6QixVQUFVO3NCQURULE1BQU07Z0JBS1AsS0FBSztzQkFESixNQUFNO2dCQUtQLE1BQU07c0JBREwsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbIi8qIVxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCDCqSAyMDA1LTIwMjUgSHlsYW5kIFNvZnR3YXJlLCBJbmMuIGFuZCBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuaW1wb3J0IHsgVHJhbnNsYXRpb25TZXJ2aWNlIH0gZnJvbSAnQGFsZnJlc2NvL2FkZi1jb3JlJztcbmltcG9ydCB7IENvbXBvbmVudCwgRGVzdHJveVJlZiwgRXZlbnRFbWl0dGVyLCBpbmplY3QsIElucHV0LCBPbkNoYW5nZXMsIE9uSW5pdCwgT3V0cHV0LCBWaWV3RW5jYXBzdWxhdGlvbiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgVGFnU2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL3RhZy5zZXJ2aWNlJztcbmltcG9ydCB7IFRhZ1BhZ2luZyB9IGZyb20gJ0BhbGZyZXNjby9qcy1hcGknO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IE1hdExpc3RNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9saXN0JztcbmltcG9ydCB7IE1hdEljb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9pY29uJztcbmltcG9ydCB7IE1hdEZvcm1GaWVsZE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2Zvcm0tZmllbGQnO1xuaW1wb3J0IHsgTWF0SW5wdXRNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9pbnB1dCc7XG5pbXBvcnQgeyBUcmFuc2xhdGVNb2R1bGUgfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcbmltcG9ydCB7IEZvcm1zTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgTWF0QnV0dG9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvYnV0dG9uJztcbmltcG9ydCB7IHRha2VVbnRpbERlc3Ryb3llZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUvcnhqcy1pbnRlcm9wJztcblxuLyoqXG4gKlxuICogVGhpcyBjb21wb25lbnQsIHByb3ZpZGUgYSBsaXN0IG9mIHRoZSB0YWdzIHJlbGF0aXZlIGEgbm9kZSB3aXRoIGFjdGlvbnMgYnV0dG9uIHRvIGFkZCBvciByZW1vdmUgbmV3IHRhZ1xuICovXG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAnYWRmLXRhZy1ub2RlLWFjdGlvbnMtbGlzdCcsXG4gICAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlLCBNYXRMaXN0TW9kdWxlLCBNYXRJY29uTW9kdWxlLCBNYXRGb3JtRmllbGRNb2R1bGUsIE1hdElucHV0TW9kdWxlLCBUcmFuc2xhdGVNb2R1bGUsIEZvcm1zTW9kdWxlLCBNYXRCdXR0b25Nb2R1bGVdLFxuICAgIHRlbXBsYXRlVXJsOiAnLi90YWctYWN0aW9ucy5jb21wb25lbnQuaHRtbCcsXG4gICAgc3R5bGVVcmxzOiBbJy4vdGFnLWFjdGlvbnMuY29tcG9uZW50LnNjc3MnXSxcbiAgICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxuICAgIGhvc3Q6IHsgY2xhc3M6ICdhZGYtdGFnLW5vZGUtYWN0aW9ucy1saXN0JyB9XG59KVxuZXhwb3J0IGNsYXNzIFRhZ0FjdGlvbnNDb21wb25lbnQgaW1wbGVtZW50cyBPbkNoYW5nZXMsIE9uSW5pdCB7XG4gICAgLyoqIFRoZSBpZGVudGlmaWVyIG9mIGEgbm9kZS4gKi9cbiAgICBASW5wdXQoeyByZXF1aXJlZDogdHJ1ZSB9KVxuICAgIG5vZGVJZDogc3RyaW5nO1xuXG4gICAgLyoqIEVtaXR0ZWQgd2hlbiBhIHRhZyBpcyBhZGRlZCBzdWNjZXNzZnVsbHkuICovXG4gICAgQE91dHB1dCgpXG4gICAgc3VjY2Vzc0FkZDogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgICAvKiogRW1pdHRlZCB3aGVuIGFuIGVycm9yIG9jY3Vycy4gKi9cbiAgICBAT3V0cHV0KClcbiAgICBlcnJvcjogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgICAvKiogRW1pdHRlZCB3aGVuIGFuIGFjdGlvbiBpcyBjaG9zZW4uICovXG4gICAgQE91dHB1dCgpXG4gICAgcmVzdWx0ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gICAgbmV3VGFnTmFtZTogc3RyaW5nO1xuICAgIHRhZ3NFbnRyaWVzOiBhbnk7XG4gICAgZXJyb3JNc2c6IHN0cmluZztcbiAgICBkaXNhYmxlQWRkVGFnOiBib29sZWFuID0gdHJ1ZTtcblxuICAgIHByaXZhdGUgcmVhZG9ubHkgZGVzdHJveVJlZiA9IGluamVjdChEZXN0cm95UmVmKTtcblxuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgdGFnU2VydmljZTogVGFnU2VydmljZSwgcHJpdmF0ZSB0cmFuc2xhdGVTZXJ2aWNlOiBUcmFuc2xhdGlvblNlcnZpY2UpIHt9XG5cbiAgICBuZ09uSW5pdCgpIHtcbiAgICAgICAgdGhpcy50YWdTZXJ2aWNlLnJlZnJlc2gucGlwZSh0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5kZXN0cm95UmVmKSkuc3Vic2NyaWJlKCgpID0+IHRoaXMucmVmcmVzaFRhZygpKTtcbiAgICB9XG5cbiAgICBuZ09uQ2hhbmdlcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVmcmVzaFRhZygpO1xuICAgIH1cblxuICAgIHJlZnJlc2hUYWcoKSB7XG4gICAgICAgIGlmICh0aGlzLm5vZGVJZCkge1xuICAgICAgICAgICAgdGhpcy50YWdTZXJ2aWNlLmdldFRhZ3NCeU5vZGVJZCh0aGlzLm5vZGVJZCkuc3Vic2NyaWJlKFxuICAgICAgICAgICAgICAgICh0YWdQYWdpbmc6IFRhZ1BhZ2luZykgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnRhZ3NFbnRyaWVzID0gdGFnUGFnaW5nLmxpc3QuZW50cmllcztcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kaXNhYmxlQWRkVGFnID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVzdWx0LmVtaXQodGhpcy50YWdzRW50cmllcyk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudGFnc0VudHJpZXMgPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRpc2FibGVBZGRUYWcgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlc3VsdC5lbWl0KHRoaXMudGFnc0VudHJpZXMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBhZGRUYWcoKSB7XG4gICAgICAgIGlmICh0aGlzLnNlYXJjaFRhZyh0aGlzLm5ld1RhZ05hbWUpKSB7XG4gICAgICAgICAgICB0aGlzLmVycm9yTXNnID0gdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoJ1RBRy5NRVNTQUdFUy5FWElTVCcpO1xuICAgICAgICAgICAgdGhpcy5lcnJvci5lbWl0KHRoaXMuZXJyb3JNc2cpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy50YWdTZXJ2aWNlLmFkZFRhZyh0aGlzLm5vZGVJZCwgdGhpcy5uZXdUYWdOYW1lKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMubmV3VGFnTmFtZSA9ICcnO1xuICAgICAgICAgICAgICAgIHRoaXMuc3VjY2Vzc0FkZC5lbWl0KHRoaXMubm9kZUlkKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgc2VhcmNoVGFnKHNlYXJjaFRhZ05hbWU6IHN0cmluZykge1xuICAgICAgICBpZiAodGhpcy50YWdzRW50cmllcykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudGFnc0VudHJpZXMuZmluZCgoY3VycmVudFRhZykgPT4gc2VhcmNoVGFnTmFtZSA9PT0gY3VycmVudFRhZy5lbnRyeS50YWcpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgY2xlYW5FcnJvck1zZygpIHtcbiAgICAgICAgdGhpcy5lcnJvck1zZyA9ICcnO1xuICAgIH1cblxuICAgIHJlbW92ZVRhZyh0YWc6IHN0cmluZykge1xuICAgICAgICB0aGlzLnRhZ1NlcnZpY2UucmVtb3ZlVGFnKHRoaXMubm9kZUlkLCB0YWcpO1xuICAgIH1cbn1cbiIsIjxtYXQtbGlzdD5cbiAgICA8bWF0LWxpc3QtaXRlbSAqbmdGb3I9XCJsZXQgY3VycmVudEVudHJ5IG9mIHRhZ3NFbnRyaWVzOyBsZXQgaWR4ID0gaW5kZXhcIj5cbiAgICAgICAgPGRpdlxuICAgICAgICAgICAgY2xhc3M9XCJhZGYtdGFnLWFjdGlvbnMtY29udGFpbmVyXCJcbiAgICAgICAgICAgIGlkPVwidGFnX2RlbGV0ZV97eyBjdXJyZW50RW50cnkuZW50cnkudGFnIH19XCJcbiAgICAgICAgICAgIHRhYmluZGV4PVwiMFwiXG4gICAgICAgICAgICByb2xlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgIChrZXl1cC5lbnRlcik9XCJyZW1vdmVUYWcoY3VycmVudEVudHJ5LmVudHJ5LmlkKVwiXG4gICAgICAgICAgICAoY2xpY2spPVwicmVtb3ZlVGFnKGN1cnJlbnRFbnRyeS5lbnRyeS5pZClcIlxuICAgICAgICA+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWRmLXRhZy1hY3Rpb25zLWRlbGV0ZS10ZXh0XCIgaWQ9XCJ0YWdfbmFtZV97eyBjdXJyZW50RW50cnkuZW50cnkudGFnIH19XCI+e3sgY3VycmVudEVudHJ5LmVudHJ5LnRhZyB9fTwvZGl2PlxuICAgICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwiYWRmLXRhZy1hY3Rpb25zLWRlbGV0ZS1pY29uXCI+ZGVsZXRlPC9tYXQtaWNvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9tYXQtbGlzdC1pdGVtPlxuPC9tYXQtbGlzdD5cbjx0YWJsZSBjbGFzcz1cImFkZi1mdWxsLXdpZHRoXCIgY2VsbHNwYWNpbmc9XCIwXCI+XG4gICAgPHRyPlxuICAgICAgICA8dGQ+XG4gICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJhZGYtZnVsbC13aWR0aFwiPlxuICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgICBpZD1cIm5ldy10YWctdGV4dFwiXG4gICAgICAgICAgICAgICAgICAgIG1hdElucHV0XG4gICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwie3sgJ1RBRy5MQUJFTC5ORVdUQUcnIHwgdHJhbnNsYXRlIH19XCJcbiAgICAgICAgICAgICAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAgICAgICAgICAoa2V5cHJlc3MpPVwiY2xlYW5FcnJvck1zZygpXCJcbiAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJuZXdUYWdOYW1lXCJcbiAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgIDxtYXQtaGludCBkYXRhLWF1dG9tYXRpb24taWQ9XCJlcnJvck1lc3NhZ2VcIiAqbmdJZj1cImVycm9yXCIgW25nU3R5bGVdPVwieyBjb2xvcjogJ3JlZCcgfVwiIGFsaWduPVwic3RhcnRcIj57eyBlcnJvck1zZyB9fSA8L21hdC1oaW50PlxuICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgICAgPC90ZD5cbiAgICAgICAgPHRkPlxuICAgICAgICAgICAgPGJ1dHRvbiBpZD1cImFkZC10YWdcIiBjbGFzcz1cImFkZi1mdWxsLXdpZHRoXCIgY29sb3I9XCJwcmltYXJ5XCIgKGNsaWNrKT1cImFkZFRhZygpXCIgW2Rpc2FibGVkXT1cImRpc2FibGVBZGRUYWdcIiBtYXQtcmFpc2VkLWJ1dHRvbj5cbiAgICAgICAgICAgICAgICB7eyAnVEFHLkJVVFRPTi5BREQnIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPC90ZD5cbiAgICA8L3RyPlxuPC90YWJsZT5cbiJdfQ==