cocori-ng
Version:
Cocori-ng is an Angular full of great components & utilites based on Material
160 lines • 28.8 kB
JavaScript
import { ChangeDetectionStrategy, ChangeDetectorRef, Component, Input, } from '@angular/core';
import { UntypedFormBuilder, UntypedFormControl } from '@angular/forms';
import { MatBottomSheet } from '@angular/material/bottom-sheet';
import { FormHelperService, InjectComponentService, } from 'cocori-ng/src/feature-core';
import { CocoringWysiwygComponent } from 'cocori-ng/src/feature-form';
import { debounceTime, filter, takeUntil, tap } from 'rxjs/operators';
import { CmsService } from '../../../core/service/cms.service';
import { ExtendPreviewActionsComponent } from '../../extend-preview-actions.component';
import { CocoringCmsImageUploadComponent } from '../cocoring-cms-image-upload/cocoring-cms-image-upload.component';
import { CocoringCmsSectionActionsComponent } from '../cocoring-cms-section-actions/cocoring-cms-section-actions.component';
import * as i0 from "@angular/core";
export class ExtendSectionTplComponent extends ExtendPreviewActionsComponent {
constructor(injector) {
super(injector);
this.nameControl = 'editor';
this.backgroundImageControl = 'backgroundImage';
this.isUploading = false;
this.readOnly = false;
this.injectComponentService = injector.get(InjectComponentService);
this.fb = injector.get(UntypedFormBuilder);
this._bottomSheet = injector.get(MatBottomSheet);
this.cdr = injector.get(ChangeDetectorRef);
this.cmsService = injector.get(CmsService);
this.formHelper = injector.get(FormHelperService);
}
init(nbEditorView, nbBackgroundImage = 0) {
this.nbEditorView = nbEditorView;
this.nbBackgroundImage = nbBackgroundImage;
this.buildForm();
this.catalogBlocksOpenedEvent();
this.onBackgroundColorEvent();
}
buildForm() {
this.formulaire = this.fb.group({});
this.configsWysiwyg = [];
for (let i = 1; i <= this.nbEditorView; i++) {
const nameControl = `${this.nameControl}${i}`;
this.formulaire.addControl(nameControl, new UntypedFormControl(this.initSectionValue(nameControl)));
this.configsWysiwyg[nameControl] = this.configComponent(nameControl);
}
for (let i = 1; i <= this.nbBackgroundImage; i++) {
const nameControl = `${this.backgroundImageControl}${i}`;
this.formulaire.addControl(nameControl, new UntypedFormControl(this.initSectionValue(nameControl)));
}
this.saveSectionValues();
this.onSectionValuesChanged();
}
onBackgroundFileUploadedCallback(nameControl, apiFileUploaded) {
this.formulaire.get(nameControl).setValue(apiFileUploaded);
}
removeBackgroundFileCallback(nameControl) {
this.formulaire.get(nameControl).reset();
this.saveSectionValues();
this.cdr.detectChanges();
}
/** ex valeur du formulaire : {editor1: "<h1>coucou</h1>", editor2: "<h1>hello</h1>"} */
onSectionValuesChanged() {
this.formulaire.valueChanges.pipe(takeUntil(this.destroy$), debounceTime(500), tap((values) => {
this.section.values = values;
this.cdr.detectChanges();
})).subscribe();
}
saveSectionValues() {
this.section.values = this.formulaire.value;
}
initSectionValue(nameControl) {
const blockContent = this.section.values;
const blockValue = blockContent?.hasOwnProperty(nameControl) ? blockContent[nameControl] : null;
const sectionValue = this.section.values?.hasOwnProperty(nameControl) ? this.section.values[nameControl] : null;
return sectionValue || blockValue;
}
configComponent(nameControl) {
let config = {
apiFile: this.apisConfig.apiFile,
apiFileDownload: this.apisConfig.apiFileDownload,
apiKey: this.apisConfig.apiKey,
params: {
inline: true
},
nameLabel: '',
formGroup: this.formulaire,
nameControl: nameControl,
validators: []
};
return config;
}
catalogBlocksOpenedEvent() {
this.cmsService.catalogBlocksOpened$.pipe(takeUntil(this.destroy$), tap((isOpened) => {
this.readOnly = isOpened;
if (isOpened && this.formHelper.countControlsForm(this.formulaire) > 0) {
this.value = this.formulaire.value;
}
}), tap(_ => this.cdr.detectChanges())).subscribe();
}
/** @param : tableau des références où seront ajouter le composant Wysiwyg */
addWysiwygComponentToViewEvent(refs) {
for (let i = 1; i <= refs.length; i++) {
const nameControl = `${this.nameControl}${i}`;
this.injectComponentService.loadAndAddComponentToContainer(CocoringWysiwygComponent, refs[i - 1], { config: this.configsWysiwyg[nameControl] }, null);
}
}
addImageUploadComponentToViewEvent(refs) {
for (let i = 1; i <= refs.length; i++) {
const nameControl = `${this.backgroundImageControl}${i}`;
this.injectComponentService.loadAndAddComponentToContainer(CocoringCmsImageUploadComponent, refs[i - 1], { section: this.section, apisConfig: this.apisConfig, nameBackgroundImage: nameControl }, {
apiFileUploaded: (apiFile) => this.onBackgroundFileUploadedCallback(nameControl, apiFile),
removeBackgroundImage: () => this.removeBackgroundFileCallback(nameControl)
});
}
}
onBackgroundColorEvent() {
this.cmsService.backgroundColor$.pipe(takeUntil(this.destroy$), filter((idSection) => idSection === this.section.id), tap(_ => this.cdr.detectChanges())).subscribe();
}
openBottomSheet() {
if (!this.readOnly)
return;
const bottomSheet = this._bottomSheet.open(CocoringCmsSectionActionsComponent, {
panelClass: 'bottom-sheet-container',
data: {
section: this.section,
}
});
bottomSheet.afterDismissed().pipe(takeUntil(this.destroy$)).subscribe((datas) => {
if (!datas)
return;
switch (datas.action) {
case 'remove':
this.cmsService.removeSection(this.section.id);
break;
case 'duplicate':
this.cmsService.duplicateSection(this.section);
break;
case 'backgroundColor':
this.saveSectionBackgroundColor(datas.value);
break;
default:
break;
}
});
}
saveSectionBackgroundColor(color) {
this.section.backgroundColor = color;
}
}
ExtendSectionTplComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.1.1", ngImport: i0, type: ExtendSectionTplComponent, deps: [{ token: i0.Injector }], target: i0.ɵɵFactoryTarget.Component });
ExtendSectionTplComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.1.1", type: ExtendSectionTplComponent, selector: "extend-section-tpl", inputs: { section: "section", apisConfig: "apisConfig" }, host: { classAttribute: "input-form" }, usesInheritance: true, ngImport: i0, template: '', isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.1.1", ngImport: i0, type: ExtendSectionTplComponent, decorators: [{
type: Component,
args: [{
changeDetection: ChangeDetectionStrategy.OnPush,
selector: 'extend-section-tpl',
template: '',
host: { 'class': 'input-form' },
}]
}], ctorParameters: function () { return [{ type: i0.Injector }]; }, propDecorators: { section: [{
type: Input
}], apisConfig: [{
type: Input
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXh0ZW5kLXNlY3Rpb24tdHBsLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NvY29yaS1uZy9zcmMvZmVhdHVyZS1jbXMvc2hhcmVkL2NvbXBvbmVudC1jbXMtZWRpdG9yL2NvY29yaW5nLWNtcy1zZWN0aW9uL2V4dGVuZC1zZWN0aW9uLXRwbC5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNILHVCQUF1QixFQUN2QixpQkFBaUIsRUFDakIsU0FBUyxFQUVULEtBQUssR0FHUixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsa0JBQWtCLEVBQUUsa0JBQWtCLEVBQW9CLE1BQU0sZ0JBQWdCLENBQUM7QUFDMUYsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ2hFLE9BQU8sRUFFSCxpQkFBaUIsRUFFakIsc0JBQXNCLEdBRXpCLE1BQU0sNEJBQTRCLENBQUM7QUFDcEMsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDdEUsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBUXRFLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUMvRCxPQUFPLEVBQUUsNkJBQTZCLEVBQUUsTUFBTSx3Q0FBd0MsQ0FBQztBQUN2RixPQUFPLEVBQUUsK0JBQStCLEVBQUUsTUFBTSxrRUFBa0UsQ0FBQztBQUNuSCxPQUFPLEVBQUUsa0NBQWtDLEVBQUUsTUFBTSx3RUFBd0UsQ0FBQzs7QUFTNUgsTUFBTSxPQUFnQix5QkFBMEIsU0FBUSw2QkFBNkI7SUF5QmpGLFlBQVksUUFBa0I7UUFDMUIsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBYnBCLGdCQUFXLEdBQVcsUUFBUSxDQUFBO1FBQzlCLDJC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QUFRLEVBQUUsRUFBRTtvQkFDWixJQUFJLEVBQUUsRUFBRSxPQUFPLEVBQUUsWUFBWSxFQUFFO2lCQUNsQzsrRkFHWSxPQUFPO3NCQUFmLEtBQUs7Z0JBQ0csVUFBVTtzQkFBbEIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XHJcbiAgICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcclxuICAgIENoYW5nZURldGVjdG9yUmVmLFxyXG4gICAgQ29tcG9uZW50LFxyXG4gICAgSW5qZWN0b3IsXHJcbiAgICBJbnB1dCxcclxuICAgIE9uRGVzdHJveSxcclxuICAgIFZpZXdDb250YWluZXJSZWYsXHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IFVudHlwZWRGb3JtQnVpbGRlciwgVW50eXBlZEZvcm1Db250cm9sLCBVbnR5cGVkRm9ybUdyb3VwIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQgeyBNYXRCb3R0b21TaGVldCB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2JvdHRvbS1zaGVldCc7XHJcbmltcG9ydCB7XHJcbiAgICBGaWxlTW9kZWwsXHJcbiAgICBGb3JtSGVscGVyU2VydmljZSxcclxuICAgIEluaXRXeXNpd3lnLFxyXG4gICAgSW5qZWN0Q29tcG9uZW50U2VydmljZSxcclxuICAgIFd5c2l3eWdDb25maWdTZWN0aW9uLFxyXG59IGZyb20gJ2NvY29yaS1uZy9zcmMvZmVhdHVyZS1jb3JlJztcclxuaW1wb3J0IHsgQ29jb3JpbmdXeXNpd3lnQ29tcG9uZW50IH0gZnJvbSAnY29jb3JpLW5nL3NyYy9mZWF0dXJlLWZvcm0nO1xyXG5pbXBvcnQgeyBkZWJvdW5jZVRpbWUsIGZpbHRlciwgdGFrZVVudGlsLCB0YXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcblxyXG5pbXBvcnQge1xyXG4gICAgQXBpc0NvbmZpZ0Ntc01vZGVsLFxyXG4gICAgQm90dG9tU2hlZXRTZWN0aW9uUmV0dXJuQWN0aW9uLFxyXG4gICAgRWRpdG9yVmFsdWVzLFxyXG4gICAgU2VjdGlvbk1vZGVsLFxyXG59IGZyb20gJy4uLy4uLy4uL2NvcmUvbW9kZWwvY21zLm1vZGVsJztcclxuaW1wb3J0IHsgQ21zU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL2NvcmUvc2VydmljZS9jbXMuc2VydmljZSc7XHJcbmltcG9ydCB7IEV4dGVuZFByZXZpZXdBY3Rpb25zQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vZXh0ZW5kLXByZXZpZXctYWN0aW9ucy5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBDb2NvcmluZ0Ntc0ltYWdlVXBsb2FkQ29tcG9uZW50IH0gZnJvbSAnLi4vY29jb3JpbmctY21zLWltYWdlLXVwbG9hZC9jb2NvcmluZy1jbXMtaW1hZ2UtdXBsb2FkLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IENvY29yaW5nQ21zU2VjdGlvbkFjdGlvbnNDb21wb25lbnQgfSBmcm9tICcuLi9jb2NvcmluZy1jbXMtc2VjdGlvbi1hY3Rpb25zL2NvY29yaW5nLWNtcy1zZWN0aW9uLWFjdGlvbnMuY29tcG9uZW50JztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gICAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXHJcbiAgICBzZWxlY3RvcjogJ2V4dGVuZC1zZWN0aW9uLXRwbCcsXHJcbiAgICB0ZW1wbGF0ZTogJycsXHJcbiAgICBob3N0OiB7ICdjbGFzcyc6ICdpbnB1dC1mb3JtJyB9LFxyXG59KVxyXG5cclxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEV4dGVuZFNlY3Rpb25UcGxDb21wb25lbnQgZXh0ZW5kcyBFeHRlbmRQcmV2aWV3QWN0aW9uc0NvbXBvbmVudCBpbXBsZW1lbnRzIE9uRGVzdHJveSB7XHJcbiAgICBASW5wdXQoKSBzZWN0aW9uOiBTZWN0aW9uTW9kZWxcclxuICAgIEBJbnB1dCgpIGFwaXNDb25maWc6IEFwaXNDb25maWdDbXNNb2RlbFxyXG5cclxuICAgIHByaXZhdGUgZmI6IFVudHlwZWRGb3JtQnVpbGRlcjtcclxuICAgIHByaXZhdGUgX2JvdHRvbVNoZWV0OiBNYXRCb3R0b21TaGVldDtcclxuICAgIHB1YmxpYyBjZHI6IGFueTtcclxuICAgIHB1YmxpYyBjbXNTZXJ2aWNlOiBDbXNTZXJ2aWNlO1xyXG5cclxuICAgIGZvcm11bGFpcmU6IFVudHlwZWRGb3JtR3JvdXBcclxuICAgIG5iRWRpdG9yVmlldzogbnVtYmVyXHJcbiAgICBuYkJhY2tncm91bmRJbWFnZTogbnVtYmVyO1xyXG5cclxuICAgIG5hbWVDb250cm9sOiBzdHJpbmcgPSAnZWRpdG9yJ1xyXG4gICAgYmFja2dyb3VuZEltYWdlQ29udHJvbDogc3RyaW5nID0gJ2JhY2tncm91bmRJbWFnZSdcclxuICAgIGJhY2tncm91bmRJbWFnZVVwbG9hZDogRmlsZU1vZGVsXHJcbiAgICB1cGxvYWRQcm9ncmVzczogbnVtYmVyO1xyXG4gICAgaXNVcGxvYWRpbmc6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICBjb25maWdzV3lzaXd5ZzogV3lzaXd5Z0NvbmZpZ1NlY3Rpb25bXTtcclxuICAgIHJlYWRPbmx5OiBib29sZWFuID0gZmFsc2U7XHJcbiAgICB2YWx1ZTogYW55O1xyXG4gICAgZm9ybUhlbHBlcjogRm9ybUhlbHBlclNlcnZpY2U7XHJcbiAgICBpbmplY3RDb21wb25lbnRTZXJ2aWNlOiBJbmplY3RDb21wb25lbnRTZXJ2aWNlO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKGluamVjdG9yOiBJbmplY3Rvcikge1xyXG4gICAgICAgIHN1cGVyKGluamVjdG9yKTtcclxuXHJcbiAgICAgICAgdGhpcy5pbmplY3RDb21wb25lbnRTZXJ2aWNlID0gaW5qZWN0b3IuZ2V0KEluamVjdENvbXBvbmVudFNlcnZpY2UpO1xyXG4gICAgICAgIHRoaXMuZmIgPSBpbmplY3Rvci5nZXQoVW50eXBlZEZvcm1CdWlsZGVyKTtcclxuICAgICAgICB0aGlzLl9ib3R0b21TaGVldCA9IGluamVjdG9yLmdldChNYXRCb3R0b21TaGVldCk7XHJcbiAgICAgICAgdGhpcy5jZHIgPSBpbmplY3Rvci5nZXQoQ2hhbmdlRGV0ZWN0b3JSZWYpO1xyXG4gICAgICAgIHRoaXMuY21zU2VydmljZSA9IGluamVjdG9yLmdldChDbXNTZXJ2aWNlKTtcclxuICAgICAgICB0aGlzLmZvcm1IZWxwZXIgPSBpbmplY3Rvci5nZXQoRm9ybUhlbHBlclNlcnZpY2UpO1xyXG4gICAgfVxyXG5cclxuICAgIGluaXQobmJFZGl0b3JWaWV3OiBudW1iZXIsIG5iQmFja2dyb3VuZEltYWdlOiBudW1iZXIgPSAwKSB7XHJcbiAgICAgICAgdGhpcy5uYkVkaXRvclZpZXcgPSBuYkVkaXRvclZpZXdcclxuICAgICAgICB0aGlzLm5iQmFja2dyb3VuZEltYWdlID0gbmJCYWNrZ3JvdW5kSW1hZ2VcclxuXHJcbiAgICAgICAgdGhpcy5idWlsZEZvcm0oKTtcclxuXHJcbiAgICAgICAgdGhpcy5jYXRhbG9nQmxvY2tzT3BlbmVkRXZlbnQoKVxyXG5cclxuICAgICAgICB0aGlzLm9uQmFja2dyb3VuZENvbG9yRXZlbnQoKVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgYnVpbGRGb3JtKCkge1xyXG4gICAgICAgIHRoaXMuZm9ybXVsYWlyZSA9IHRoaXMuZmIuZ3JvdXAoe30pO1xyXG4gICAgICAgIHRoaXMuY29uZmlnc1d5c2l3eWcgPSBbXVxyXG5cclxuICAgICAgICBmb3IgKGxldCBpID0gMTsgaSA8PSB0aGlzLm5iRWRpdG9yVmlldzsgaSsrKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IG5hbWVDb250cm9sOiBzdHJpbmcgPSBgJHt0aGlzLm5hbWVDb250cm9sfSR7aX1gXHJcblxyXG4gICAgICAgICAgICB0aGlzLmZvcm11bGFpcmUuYWRkQ29udHJvbChuYW1lQ29udHJvbCwgbmV3IFVudHlwZWRGb3JtQ29udHJvbCh0aGlzLmluaXRTZWN0aW9uVmFsdWUobmFtZUNvbnRyb2wpKSlcclxuXHJcbiAgICAgICAgICAgIHRoaXMuY29uZmlnc1d5c2l3eWdbbmFtZUNvbnRyb2xdID0gdGhpcy5jb25maWdDb21wb25lbnQobmFtZUNvbnRyb2wpXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBmb3IgKGxldCBpID0gMTsgaSA8PSB0aGlzLm5iQmFja2dyb3VuZEltYWdlOyBpKyspIHtcclxuICAgICAgICAgICAgY29uc3QgbmFtZUNvbnRyb2w6IHN0cmluZyA9IGAke3RoaXMuYmFja2dyb3VuZEltYWdlQ29udHJvbH0ke2l9YFxyXG5cclxuICAgICAgICAgICAgdGhpcy5mb3JtdWxhaXJlLmFkZENvbnRyb2wobmFtZUNvbnRyb2wsIG5ldyBVbnR5cGVkRm9ybUNvbnRyb2wodGhpcy5pbml0U2VjdGlvblZhbHVlKG5hbWVDb250cm9sKSkpXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLnNhdmVTZWN0aW9uVmFsdWVzKClcclxuXHJcbiAgICAgICAgdGhpcy5vblNlY3Rpb25WYWx1ZXNDaGFuZ2VkKClcclxuICAgIH1cclxuXHJcbiAgICBvbkJhY2tncm91bmRGaWxlVXBsb2FkZWRDYWxsYmFjayhuYW1lQ29udHJvbDogc3RyaW5nLCBhcGlGaWxlVXBsb2FkZWQ6IHN0cmluZywpIHtcclxuICAgICAgICB0aGlzLmZvcm11bGFpcmUuZ2V0KG5hbWVDb250cm9sKS5zZXRWYWx1ZShhcGlGaWxlVXBsb2FkZWQpXHJcbiAgICB9XHJcblxyXG4gICAgcmVtb3ZlQmFja2dyb3VuZEZpbGVDYWxsYmFjayhuYW1lQ29udHJvbDogc3RyaW5nKSB7XHJcbiAgICAgICAgdGhpcy5mb3JtdWxhaXJlLmdldChuYW1lQ29udHJvbCkucmVzZXQoKVxyXG5cclxuICAgICAgICB0aGlzLnNhdmVTZWN0aW9uVmFsdWVzKClcclxuXHJcbiAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpXHJcbiAgICB9XHJcblxyXG4gICAgLyoqIGV4IHZhbGV1ciBkdSBmb3JtdWxhaXJlIDoge2VkaXRvcjE6IFwiPGgxPmNvdWNvdTwvaDE+XCIsIGVkaXRvcjI6IFwiPGgxPmhlbGxvPC9oMT5cIn0gKi9cclxuICAgIHByaXZhdGUgb25TZWN0aW9uVmFsdWVzQ2hhbmdlZCgpIHtcclxuICAgICAgICB0aGlzLmZvcm11bGFpcmUudmFsdWVDaGFuZ2VzLnBpcGUoXHJcbiAgICAgICAgICAgIHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSxcclxuICAgICAgICAgICAgZGVib3VuY2VUaW1lKDUwMCksXHJcbiAgICAgICAgICAgIHRhcCgodmFsdWVzOiBhbnkpID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2VjdGlvbi52YWx1ZXMgPSB2YWx1ZXNcclxuXHJcbiAgICAgICAgICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKClcclxuICAgICAgICAgICAgfSlcclxuICAgICAgICApLnN1YnNjcmliZSgpXHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBzYXZlU2VjdGlvblZhbHVlcygpIHtcclxuICAgICAgICB0aGlzLnNlY3Rpb24udmFsdWVzID0gdGhpcy5mb3JtdWxhaXJlLnZhbHVlXHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBpbml0U2VjdGlvblZhbHVlKG5hbWVDb250cm9sOiBzdHJpbmcpIHtcclxuICAgICAgICBjb25zdCBibG9ja0NvbnRlbnQ6IEVkaXRvclZhbHVlcyA9IHRoaXMuc2VjdGlvbi52YWx1ZXNcclxuXHJcbiAgICAgICAgY29uc3QgYmxvY2tWYWx1ZTogc3RyaW5nID0gYmxvY2tDb250ZW50Py5oYXNPd25Qcm9wZXJ0eShuYW1lQ29udHJvbCkgPyBibG9ja0NvbnRlbnRbbmFtZUNvbnRyb2xdIDogbnVsbFxyXG4gICAgICAgIGNvbnN0IHNlY3Rpb25WYWx1ZTogc3RyaW5nID0gdGhpcy5zZWN0aW9uLnZhbHVlcz8uaGFzT3duUHJvcGVydHkobmFtZUNvbnRyb2wpID8gdGhpcy5zZWN0aW9uLnZhbHVlc1tuYW1lQ29udHJvbF0gOiBudWxsXHJcblxyXG4gICAgICAgIHJldHVybiBzZWN0aW9uVmFsdWUgfHwgYmxvY2tWYWx1ZVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgY29uZmlnQ29tcG9uZW50KG5hbWVDb250cm9sOiBzdHJpbmcpIHtcclxuICAgICAgICBsZXQgY29uZmlnID0ge1xyXG4gICAgICAgICAgICBhcGlGaWxlOiB0aGlzLmFwaXNDb25maWcuYXBpRmlsZSxcclxuICAgICAgICAgICAgYXBpRmlsZURvd25sb2FkOiB0aGlzLmFwaXNDb25maWcuYXBpRmlsZURvd25sb2FkLFxyXG4gICAgICAgICAgICBhcGlLZXk6IHRoaXMuYXBpc0NvbmZpZy5hcGlLZXksXHJcbiAgICAgICAgICAgIHBhcmFtczogPEluaXRXeXNpd3lnPntcclxuICAgICAgICAgICAgICAgIGlubGluZTogdHJ1ZVxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBuYW1lTGFiZWw6ICcnLFxyXG4gICAgICAgICAgICBmb3JtR3JvdXA6IHRoaXMuZm9ybXVsYWlyZSxcclxuICAgICAgICAgICAgbmFtZUNvbnRyb2w6IG5hbWVDb250cm9sLFxyXG4gICAgICAgICAgICB2YWxpZGF0b3JzOiBbXVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIGNvbmZpZ1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgY2F0YWxvZ0Jsb2Nrc09wZW5lZEV2ZW50KCkge1xyXG4gICAgICAgIHRoaXMuY21zU2VydmljZS5jYXRhbG9nQmxvY2tzT3BlbmVkJC5waXBlKFxyXG4gICAgICAgICAgICB0YWtlVW50aWwodGhpcy5kZXN0cm95JCksXHJcbiAgICAgICAgICAgIHRhcCgoaXNPcGVuZWQ6IGJvb2xlYW4pID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMucmVhZE9ubHkgPSBpc09wZW5lZFxyXG5cclxuICAgICAgICAgICAgICAgIGlmIChpc09wZW5lZCAmJiB0aGlzLmZvcm1IZWxwZXIuY291bnRDb250cm9sc0Zvcm0odGhpcy5mb3JtdWxhaXJlKSA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnZhbHVlID0gdGhpcy5mb3JtdWxhaXJlLnZhbHVlXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pLFxyXG4gICAgICAgICAgICB0YXAoXyA9PiB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCkpXHJcbiAgICAgICAgKS5zdWJzY3JpYmUoKVxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAcGFyYW0gOiB0YWJsZWF1IGRlcyByw6lmw6lyZW5jZXMgb8O5IHNlcm9udCBham91dGVyIGxlIGNvbXBvc2FudCBXeXNpd3lnICovXHJcbiAgICBwdWJsaWMgYWRkV3lzaXd5Z0NvbXBvbmVudFRvVmlld0V2ZW50KHJlZnM6IFZpZXdDb250YWluZXJSZWZbXSkge1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAxOyBpIDw9IHJlZnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgY29uc3QgbmFtZUNvbnRyb2w6IHN0cmluZyA9IGAke3RoaXMubmFtZUNvbnRyb2x9JHtpfWBcclxuXHJcbiAgICAgICAgICAgIHRoaXMuaW5qZWN0Q29tcG9uZW50U2VydmljZS5sb2FkQW5kQWRkQ29tcG9uZW50VG9Db250YWluZXIoQ29jb3JpbmdXeXNpd3lnQ29tcG9uZW50LCByZWZzW2kgLSAxXSxcclxuICAgICAgICAgICAgICAgIHsgY29uZmlnOiB0aGlzLmNvbmZpZ3NXeXNpd3lnW25hbWVDb250cm9sXSB9LCBudWxsKVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgYWRkSW1hZ2VVcGxvYWRDb21wb25lbnRUb1ZpZXdFdmVudChyZWZzOiBWaWV3Q29udGFpbmVyUmVmW10pIHtcclxuICAgICAgICBmb3IgKGxldCBpID0gMTsgaSA8PSByZWZzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IG5hbWVDb250cm9sOiBzdHJpbmcgPSBgJHt0aGlzLmJhY2tncm91bmRJbWFnZUNvbnRyb2x9JHtpfWBcclxuXHJcbiAgICAgICAgICAgIHRoaXMuaW5qZWN0Q29tcG9uZW50U2VydmljZS5sb2FkQW5kQWRkQ29tcG9uZW50VG9Db250YWluZXIoQ29jb3JpbmdDbXNJbWFnZVVwbG9hZENvbXBvbmVudCwgcmVmc1tpIC0gMV0sXHJcbiAgICAgICAgICAgICAgICB7IHNlY3Rpb246IHRoaXMuc2VjdGlvbiwgYXBpc0NvbmZpZzogdGhpcy5hcGlzQ29uZmlnLCBuYW1lQmFja2dyb3VuZEltYWdlOiBuYW1lQ29udHJvbCB9LFxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIGFwaUZpbGVVcGxvYWRlZDogKGFwaUZpbGU6IHN0cmluZykgPT4gdGhpcy5vbkJhY2tncm91bmRGaWxlVXBsb2FkZWRDYWxsYmFjayhuYW1lQ29udHJvbCwgYXBpRmlsZSksXHJcbiAgICAgICAgICAgICAgICAgICAgcmVtb3ZlQmFja2dyb3VuZEltYWdlOiAoKSA9PiB0aGlzLnJlbW92ZUJhY2tncm91bmRGaWxlQ2FsbGJhY2sobmFtZUNvbnRyb2wpXHJcbiAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIG9uQmFja2dyb3VuZENvbG9yRXZlbnQoKSB7XHJcbiAgICAgICAgdGhpcy5jbXNTZXJ2aWNlLmJhY2tncm91bmRDb2xvciQucGlwZShcclxuICAgICAgICAgICAgdGFrZVVudGlsKHRoaXMuZGVzdHJveSQpLFxyXG4gICAgICAgICAgICBmaWx0ZXIoKGlkU2VjdGlvbjogc3RyaW5nKSA9PiBpZFNlY3Rpb24gPT09IHRoaXMuc2VjdGlvbi5pZCksXHJcbiAgICAgICAgICAgIHRhcChfID0+IHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKSksXHJcbiAgICAgICAgKS5zdWJzY3JpYmUoKVxyXG4gICAgfVxyXG5cclxuICAgIG9wZW5Cb3R0b21TaGVldCgpIHtcclxuICAgICAgICBpZiAoIXRoaXMucmVhZE9ubHkpIHJldHVybjtcclxuXHJcbiAgICAgICAgY29uc3QgYm90dG9tU2hlZXQgPSB0aGlzLl9ib3R0b21TaGVldC5vcGVuKENvY29yaW5nQ21zU2VjdGlvbkFjdGlvbnNDb21wb25lbnQsIHtcclxuICAgICAgICAgICAgcGFuZWxDbGFzczogJ2JvdHRvbS1zaGVldC1jb250YWluZXInLFxyXG4gICAgICAgICAgICBkYXRhOiA8YW55PntcclxuICAgICAgICAgICAgICAgIHNlY3Rpb246IHRoaXMuc2VjdGlvbixcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBib3R0b21TaGVldC5hZnRlckRpc21pc3NlZCgpLnBpcGUoXHJcbiAgICAgICAgICAgIHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKVxyXG4gICAgICAgICkuc3Vic2NyaWJlKChkYXRhczogQm90dG9tU2hlZXRTZWN0aW9uUmV0dXJuQWN0aW9uKSA9PiB7XHJcbiAgICAgICAgICAgIGlmICghZGF0YXMpIHJldHVybjtcclxuXHJcbiAgICAgICAgICAgIHN3aXRjaCAoZGF0YXMuYWN0aW9uKSB7XHJcbiAgICAgICAgICAgICAgICBjYXNlICdyZW1vdmUnOlxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY21zU2VydmljZS5yZW1vdmVTZWN0aW9uKHRoaXMuc2VjdGlvbi5pZClcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgICAgICAgY2FzZSAnZHVwbGljYXRlJzpcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNtc1NlcnZpY2UuZHVwbGljYXRlU2VjdGlvbih0aGlzLnNlY3Rpb24pXHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgICAgICAgIGNhc2UgJ2JhY2tncm91bmRDb2xvcic6XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zYXZlU2VjdGlvbkJhY2tncm91bmRDb2xvcihkYXRhcy52YWx1ZSlcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pXHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBzYXZlU2VjdGlvbkJhY2tncm91bmRDb2xvcihjb2xvcjogc3RyaW5nKSB7XHJcbiAgICAgICAgdGhpcy5zZWN0aW9uLmJhY2tncm91bmRDb2xvciA9IGNvbG9yXHJcbiAgICB9XHJcbn1cclxuIl19