UNPKG

cocori-ng

Version:

Cocori-ng is an Angular full of great components & utilites based on Material

143 lines 34.8 kB
import { moveItemInArray } from '@angular/cdk/drag-drop'; import { ChangeDetectionStrategy, Component, EventEmitter, Input, Output, ViewChild, ViewContainerRef, } from '@angular/core'; import { InjectComponentService } from 'cocori-ng/src/feature-core'; import { Subject } from 'rxjs'; import { takeUntil, tap } from 'rxjs/operators'; import { CocoringCmsSectionComponent } from '../cocoring-cms-section/cocoring-cms-section.component'; import * as i0 from "@angular/core"; import * as i1 from "@angular/flex-layout"; import * as i2 from "../../../core/service/cms.service"; import * as i3 from "cocori-ng/src/feature-core"; import * as i4 from "@angular/common"; import * as i5 from "@angular/cdk/drag-drop"; import * as i6 from "@angular/material/sidenav"; import * as i7 from "@angular/flex-layout/extended"; import * as i8 from "../cocoring-cms-blocks-catalog/cocoring-cms-blocks-catalog.component"; import * as i9 from "../cocoring-toolbar-cms/cocoring-toolbar-cms.component"; // import { CdkDragDrop, moveItemInArray } from '@angular/cdk/drag-drop'; // import { MediaChange, MediaObserver } from '@angular/flex-layout'; export class CocoringCmsComponent { constructor(mediaObserver, cdr, cmsService, injectComponentService) { this.mediaObserver = mediaObserver; this.cdr = cdr; this.cmsService = cmsService; this.injectComponentService = injectComponentService; this.catalog = []; this.orientation = 'column'; this._showSaveBtn = false; this.importSections = []; this.destroy$ = new Subject(); this.onSaveBtn = new EventEmitter(); this.responsive = 'computer'; this.activeMediaQuery = ''; this.sidenavMode = 'side'; this.isSidenavOpen = false; this.totalSections = 0; this.eventSizeScreen(); } set config(config) { if (!config) { throw new Error(`La config du composant CMS n'est pas correcte... config: ${config}`); } this.configCms = config; this.catalog = config.catalog; this.cmsService.init(); } set datas(sectionDatas) { this.importSections = sectionDatas; } set showSaveBtn(data) { this._showSaveBtn = data; if (data) { this.onPageSaved(); } } ngOnInit() { this.addSectionEvent(); this.onSectionMoved(); /** on dessine les sections chargées ! */ if (this.importSections.length) { this.importSections.forEach((section) => { this.cmsService.addSection(section); }); } } ngOnDestroy() { this.destroy$.next(undefined); this.destroy$.complete(); } onPageSaved() { this.cmsService.onSaveCmsContent$.pipe(takeUntil(this.destroy$)).subscribe((contentPage) => { this.onSaveBtn.emit(contentPage); }); } eventSizeScreen() { this.mediaObserver .asObservable() .pipe(takeUntil(this.destroy$)).subscribe((change) => { change.forEach((item) => { this.activeMediaQuery = item ? `'${item.mqAlias}' = (${item.mediaQuery})` : ''; if (item.mqAlias === 'xs') { this.sidenavMode = 'over'; } else { this.sidenavMode = 'side'; } }); }); } toggleSidenavBlocks() { this.sidenav.toggle(); this.isSidenavOpen = this.sidenav.opened; this.cmsService.catalogBlocksOpened$.next(this.isSidenavOpen); } getPageCMSDatas() { return this.cmsService.sectionsPageDatas(); } addSectionEvent() { this.cmsService.sectionAdded$.pipe(takeUntil(this.destroy$), tap(_ => this.refreshNumberSection()), tap((datas) => { this.injectComponentService.loadAndAddComponentToContainer(CocoringCmsSectionComponent, this.containerRef, { section: datas.section, apisConfig: this.configCms.wysiwygOptions }, { afterRemoveAnimation: (sectionIndexRemoved) => this.onSectionRemovedAfterAnimation(sectionIndexRemoved) }, datas.index); })).subscribe(); } onSectionRemovedAfterAnimation(indexSectionRemoved) { this.injectComponentService.removeComponentFromViewContainer(indexSectionRemoved, this.containerRef); this.refreshNumberSection(); } onSectionMoved() { this.cmsService.moveSection$.pipe(takeUntil(this.destroy$), tap((values) => { this.moveSectionContainer({ previousIndex: values.previousIndex, currentIndex: values.currentIndex }); })).subscribe(); } refreshNumberSection() { this.totalSections = this.cmsService.sections.length; this.cdr.detectChanges(); } dropSection(event) { this.moveSectionContainer({ previousIndex: event.previousIndex, currentIndex: event.currentIndex }); } moveSectionContainer(moveIndexes) { moveItemInArray(this.cmsService.sections, moveIndexes.previousIndex, moveIndexes.currentIndex); this.injectComponentService.moveComponentFromViewContainer(moveIndexes.currentIndex, moveIndexes.previousIndex, this.containerRef); } } CocoringCmsComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.1.1", ngImport: i0, type: CocoringCmsComponent, deps: [{ token: i1.MediaObserver }, { token: i0.ChangeDetectorRef }, { token: i2.CmsService }, { token: i3.InjectComponentService }], target: i0.ɵɵFactoryTarget.Component }); CocoringCmsComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.1.1", type: CocoringCmsComponent, selector: "cocoring-cms", inputs: { config: "config", datas: "datas", showSaveBtn: "showSaveBtn" }, outputs: { onSaveBtn: "onSaveBtn" }, providers: [InjectComponentService], viewQueries: [{ propertyName: "sidenav", first: true, predicate: ["sidenav"], descendants: true }, { propertyName: "containerRef", first: true, predicate: ["ContainerRef"], descendants: true, read: ViewContainerRef }], ngImport: i0, template: "<div class=\"page\">\r\n <cocoring-toolbar-cms [showSaveBtn]=\"_showSaveBtn\" (toggleSidenav)=\"toggleSidenavBlocks()\"></cocoring-toolbar-cms>\r\n\r\n <div class=\"sidenav-container\">\r\n <mat-sidenav-container class=\"layout-container\" [hasBackdrop]=\"false\" fullscreen>\r\n <mat-sidenav class=\"sidenav-blocks-catalog\" #sidenav [mode]=\"sidenavMode\" position=\"end\" opened=\"false\">\r\n <cocoring-cms-blocks-catalog [catalog]=\"catalog\"></cocoring-cms-blocks-catalog>\r\n </mat-sidenav>\r\n <mat-sidenav-content [ngClass]=\"{'no-margin-right': isSidenavOpen && totalSections}\">\r\n <div class=\"sidenav-content\" [ngClass]=\"{'sidenav-openned': isSidenavOpen}\">\r\n <div *ngIf=\"!totalSections && !isSidenavOpen\" class=\"no-section\" (click)=\"toggleSidenavBlocks()\">\r\n <div>\r\n <h1>Customisez votre page facilement \uD83D\uDC4C </h1>\r\n <p>(cliquez ici pour composer votre page)</p>\r\n </div>\r\n </div>\r\n <div *ngIf=\"isSidenavOpen && !totalSections\" class=\"col-elements\">\r\n <div class=\"texte-preview\">\r\n Aper\u00E7u de votre page\r\n </div>\r\n <div class=\"new-block\">\r\n <h1>Aucune section</h1>\r\n <p>cliquez sur un template pour l'ajouter</p>\r\n </div>\r\n </div>\r\n\r\n <div *ngIf=\"totalSections\" class=\"container-sections\" [ngClass]=\"{'col-elements': isSidenavOpen}\">\r\n <div class=\"blocks\" cdkDropList (cdkDropListDropped)=\"dropSection($event)\">\r\n <ng-template #ContainerRef></ng-template>\r\n </div>\r\n </div>\r\n </div>\r\n </mat-sidenav-content>\r\n </mat-sidenav-container>\r\n </div>\r\n</div>", styles: [":host{display:block;height:100%}.page{display:flex;flex-direction:column;height:100%}.page .sidenav-container{flex:1}.page .sidenav-container .layout-container{top:50px}.resolutions-group{border:0}.resolutions-group .mat-button-toggle-appearance-standard{background-color:transparent;color:#fff;border-left:0}.resolutions-group .mat-button-toggle-appearance-standard.mat-button-toggle-checked{color:#2196f3}.resolutions-group ::ng-deep .mat-button-toggle-label-content{line-height:35px;padding:0 10px}.resolutions-group .material-icons{font-size:20px}.mat-drawer-content{background-color:#ecebeb;transition-property:none!important}.sidenav-content{display:flex;flex-direction:column;height:100%;transition-duration:.4s;transition-timing-function:cubic-bezier(.25,.8,.25,1);transition-property:transform,margin-left,margin-right}.sidenav-blocks-catalog{width:calc(75% - 25px);padding:20px 20px 0}.no-section{align-items:center;display:flex;justify-content:center;height:100%;cursor:pointer;text-align:center}.no-margin-right{margin-right:0!important}.container-sections{height:100%;padding-top:20px}.col-elements{overflow:hidden;background-color:#ecebeb}.col-elements .blocks{height:380%;overflow-y:auto;-webkit-transform:scale(.25);-moz-transform:scale(.25);-ms-transform:scale(.25);-o-transform:scale(.25);transform-origin:25px 25px;transition:transform .25s linear}.col-elements .new-block{display:flex;flex-direction:column;margin:20px;padding:0 5px;height:150px;background:#fff;border:solid 3px #f5f5f5;text-align:center;justify-content:center;position:relative}.col-elements .new-block h1{text-transform:uppercase;font-size:15px;margin-bottom:5px}.col-elements .new-block h1:after{content:\"\";display:block;margin:0 auto;width:20%;border-bottom:1px solid black}.texte-preview{text-transform:uppercase;font-size:18px;text-align:center;padding:10px 5px;margin:30px 22px 0}\n"], dependencies: [{ kind: "directive", type: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i5.CdkDropList, selector: "[cdkDropList], cdk-drop-list", inputs: ["cdkDropListConnectedTo", "cdkDropListData", "cdkDropListOrientation", "id", "cdkDropListLockAxis", "cdkDropListDisabled", "cdkDropListSortingDisabled", "cdkDropListEnterPredicate", "cdkDropListSortPredicate", "cdkDropListAutoScrollDisabled", "cdkDropListAutoScrollStep"], outputs: ["cdkDropListDropped", "cdkDropListEntered", "cdkDropListExited", "cdkDropListSorted"], exportAs: ["cdkDropList"] }, { kind: "component", type: i6.MatSidenav, selector: "mat-sidenav", inputs: ["fixedInViewport", "fixedTopGap", "fixedBottomGap"], exportAs: ["matSidenav"] }, { kind: "component", type: i6.MatSidenavContainer, selector: "mat-sidenav-container", exportAs: ["matSidenavContainer"] }, { kind: "component", type: i6.MatSidenavContent, selector: "mat-sidenav-content" }, { kind: "directive", type: i7.DefaultClassDirective, selector: " [ngClass], [ngClass.xs], [ngClass.sm], [ngClass.md], [ngClass.lg], [ngClass.xl], [ngClass.lt-sm], [ngClass.lt-md], [ngClass.lt-lg], [ngClass.lt-xl], [ngClass.gt-xs], [ngClass.gt-sm], [ngClass.gt-md], [ngClass.gt-lg]", inputs: ["ngClass", "ngClass.xs", "ngClass.sm", "ngClass.md", "ngClass.lg", "ngClass.xl", "ngClass.lt-sm", "ngClass.lt-md", "ngClass.lt-lg", "ngClass.lt-xl", "ngClass.gt-xs", "ngClass.gt-sm", "ngClass.gt-md", "ngClass.gt-lg"] }, { kind: "component", type: i8.CocoringCmsBlocksCatalogComponent, selector: "cocoring-cms-blocks-catalog", inputs: ["catalog"] }, { kind: "component", type: i9.CocoringToolbarCmsComponent, selector: "cocoring-toolbar-cms", inputs: ["showSaveBtn"], outputs: ["toggleSidenav"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.1.1", ngImport: i0, type: CocoringCmsComponent, decorators: [{ type: Component, args: [{ changeDetection: ChangeDetectionStrategy.OnPush, selector: 'cocoring-cms', providers: [InjectComponentService], template: "<div class=\"page\">\r\n <cocoring-toolbar-cms [showSaveBtn]=\"_showSaveBtn\" (toggleSidenav)=\"toggleSidenavBlocks()\"></cocoring-toolbar-cms>\r\n\r\n <div class=\"sidenav-container\">\r\n <mat-sidenav-container class=\"layout-container\" [hasBackdrop]=\"false\" fullscreen>\r\n <mat-sidenav class=\"sidenav-blocks-catalog\" #sidenav [mode]=\"sidenavMode\" position=\"end\" opened=\"false\">\r\n <cocoring-cms-blocks-catalog [catalog]=\"catalog\"></cocoring-cms-blocks-catalog>\r\n </mat-sidenav>\r\n <mat-sidenav-content [ngClass]=\"{'no-margin-right': isSidenavOpen && totalSections}\">\r\n <div class=\"sidenav-content\" [ngClass]=\"{'sidenav-openned': isSidenavOpen}\">\r\n <div *ngIf=\"!totalSections && !isSidenavOpen\" class=\"no-section\" (click)=\"toggleSidenavBlocks()\">\r\n <div>\r\n <h1>Customisez votre page facilement \uD83D\uDC4C </h1>\r\n <p>(cliquez ici pour composer votre page)</p>\r\n </div>\r\n </div>\r\n <div *ngIf=\"isSidenavOpen && !totalSections\" class=\"col-elements\">\r\n <div class=\"texte-preview\">\r\n Aper\u00E7u de votre page\r\n </div>\r\n <div class=\"new-block\">\r\n <h1>Aucune section</h1>\r\n <p>cliquez sur un template pour l'ajouter</p>\r\n </div>\r\n </div>\r\n\r\n <div *ngIf=\"totalSections\" class=\"container-sections\" [ngClass]=\"{'col-elements': isSidenavOpen}\">\r\n <div class=\"blocks\" cdkDropList (cdkDropListDropped)=\"dropSection($event)\">\r\n <ng-template #ContainerRef></ng-template>\r\n </div>\r\n </div>\r\n </div>\r\n </mat-sidenav-content>\r\n </mat-sidenav-container>\r\n </div>\r\n</div>", styles: [":host{display:block;height:100%}.page{display:flex;flex-direction:column;height:100%}.page .sidenav-container{flex:1}.page .sidenav-container .layout-container{top:50px}.resolutions-group{border:0}.resolutions-group .mat-button-toggle-appearance-standard{background-color:transparent;color:#fff;border-left:0}.resolutions-group .mat-button-toggle-appearance-standard.mat-button-toggle-checked{color:#2196f3}.resolutions-group ::ng-deep .mat-button-toggle-label-content{line-height:35px;padding:0 10px}.resolutions-group .material-icons{font-size:20px}.mat-drawer-content{background-color:#ecebeb;transition-property:none!important}.sidenav-content{display:flex;flex-direction:column;height:100%;transition-duration:.4s;transition-timing-function:cubic-bezier(.25,.8,.25,1);transition-property:transform,margin-left,margin-right}.sidenav-blocks-catalog{width:calc(75% - 25px);padding:20px 20px 0}.no-section{align-items:center;display:flex;justify-content:center;height:100%;cursor:pointer;text-align:center}.no-margin-right{margin-right:0!important}.container-sections{height:100%;padding-top:20px}.col-elements{overflow:hidden;background-color:#ecebeb}.col-elements .blocks{height:380%;overflow-y:auto;-webkit-transform:scale(.25);-moz-transform:scale(.25);-ms-transform:scale(.25);-o-transform:scale(.25);transform-origin:25px 25px;transition:transform .25s linear}.col-elements .new-block{display:flex;flex-direction:column;margin:20px;padding:0 5px;height:150px;background:#fff;border:solid 3px #f5f5f5;text-align:center;justify-content:center;position:relative}.col-elements .new-block h1{text-transform:uppercase;font-size:15px;margin-bottom:5px}.col-elements .new-block h1:after{content:\"\";display:block;margin:0 auto;width:20%;border-bottom:1px solid black}.texte-preview{text-transform:uppercase;font-size:18px;text-align:center;padding:10px 5px;margin:30px 22px 0}\n"] }] }], ctorParameters: function () { return [{ type: i1.MediaObserver }, { type: i0.ChangeDetectorRef }, { type: i2.CmsService }, { type: i3.InjectComponentService }]; }, propDecorators: { sidenav: [{ type: ViewChild, args: ['sidenav'] }], containerRef: [{ type: ViewChild, args: ['ContainerRef', { static: false, read: ViewContainerRef }] }], config: [{ type: Input }], datas: [{ type: Input }], showSaveBtn: [{ type: Input }], onSaveBtn: [{ type: Output }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29jb3JpbmctY21zLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NvY29yaS1uZy9zcmMvZmVhdHVyZS1jbXMvc2hhcmVkL2NvbXBvbmVudC1jbXMtZWRpdG9yL2NvY29yaW5nLWNtcy9jb2NvcmluZy1jbXMuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY29jb3JpLW5nL3NyYy9mZWF0dXJlLWNtcy9zaGFyZWQvY29tcG9uZW50LWNtcy1lZGl0b3IvY29jb3JpbmctY21zL2NvY29yaW5nLWNtcy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQWUsZUFBZSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDdEUsT0FBTyxFQUNMLHVCQUF1QixFQUV2QixTQUFTLEVBQ1QsWUFBWSxFQUNaLEtBQUssRUFHTCxNQUFNLEVBQ04sU0FBUyxFQUNULGdCQUFnQixHQUNqQixNQUFNLGVBQWUsQ0FBQztBQUd2QixPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUNwRSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQy9CLE9BQU8sRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFXaEQsT0FBTyxFQUFFLDJCQUEyQixFQUFFLE1BQU0sd0RBQXdELENBQUM7Ozs7Ozs7Ozs7O0FBRXJHLHlFQUF5RTtBQUN6RSxxRUFBcUU7QUFRckUsTUFBTSxPQUFPLG9CQUFvQjtJQStDL0IsWUFDVSxhQUE0QixFQUM1QixHQUFzQixFQUN0QixVQUFzQixFQUN0QixzQkFBOEM7UUFIOUMsa0JBQWEsR0FBYixhQUFhLENBQWU7UUFDNUIsUUFBRyxHQUFILEdBQUcsQ0FBbUI7UUFDdEIsZUFBVSxHQUFWLFVBQVUsQ0FBWTtRQUN0QiwyQkFBc0IsR0FBdEIsc0JB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b0JBQW9CLHNKQUZwQixDQUFDLHNCQUFzQixDQUFDLHdNQUllLGdCQUFnQiw2QkN6Q3BFLG1sRUFtQ007MkZESU8sb0JBQW9CO2tCQVBoQyxTQUFTO3NDQUNTLHVCQUF1QixDQUFDLE1BQU0sWUFDckMsY0FBYyxhQUdiLENBQUMsc0JBQXNCLENBQUM7a01BR2IsT0FBTztzQkFBNUIsU0FBUzt1QkFBQyxTQUFTO2dCQUNrRCxZQUFZO3NCQUFqRixTQUFTO3VCQUFDLGNBQWMsRUFBRSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLGdCQUFnQixFQUFFO2dCQVdoRSxNQUFNO3NCQURULEtBQUs7Z0JBY0YsS0FBSztzQkFEUixLQUFLO2dCQU1GLFdBQVc7c0JBRGQsS0FBSztnQkFTSSxTQUFTO3NCQUFsQixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2RrRHJhZ0Ryb3AsIG1vdmVJdGVtSW5BcnJheSB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9kcmFnLWRyb3AnO1xyXG5pbXBvcnQge1xyXG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxyXG4gIENoYW5nZURldGVjdG9yUmVmLFxyXG4gIENvbXBvbmVudCxcclxuICBFdmVudEVtaXR0ZXIsXHJcbiAgSW5wdXQsXHJcbiAgT25EZXN0cm95LFxyXG4gIE9uSW5pdCxcclxuICBPdXRwdXQsXHJcbiAgVmlld0NoaWxkLFxyXG4gIFZpZXdDb250YWluZXJSZWYsXHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IE1lZGlhT2JzZXJ2ZXIgfSBmcm9tICdAYW5ndWxhci9mbGV4LWxheW91dCc7XHJcbmltcG9ydCB7IE1hdFNpZGVuYXYgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9zaWRlbmF2JztcclxuaW1wb3J0IHsgSW5qZWN0Q29tcG9uZW50U2VydmljZSB9IGZyb20gJ2NvY29yaS1uZy9zcmMvZmVhdHVyZS1jb3JlJztcclxuaW1wb3J0IHsgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyB0YWtlVW50aWwsIHRhcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcclxuXHJcbmltcG9ydCB7XHJcbiAgQ29uZmlnQ21zTW9kZWwsXHJcbiAgSW5zZXJ0U2VjdGlvbkF0LFxyXG4gIFNlY3Rpb25Nb2RlbCxcclxuICBTZWN0aW9uTW9kZWxDb21tYW5kLFxyXG4gIFNlY3Rpb25Nb3ZlSW5kZXhlcyxcclxufSBmcm9tICcuLi8uLi8uLi9jb3JlL21vZGVsL2Ntcy5tb2RlbCc7XHJcbmltcG9ydCB7IEJsb2NrIH0gZnJvbSAnLi4vLi4vLi4vY29yZS9zZXJ2aWNlL2Jsb2NrJztcclxuaW1wb3J0IHsgQ21zU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL2NvcmUvc2VydmljZS9jbXMuc2VydmljZSc7XHJcbmltcG9ydCB7IENvY29yaW5nQ21zU2VjdGlvbkNvbXBvbmVudCB9IGZyb20gJy4uL2NvY29yaW5nLWNtcy1zZWN0aW9uL2NvY29yaW5nLWNtcy1zZWN0aW9uLmNvbXBvbmVudCc7XHJcblxyXG4vLyBpbXBvcnQgeyBDZGtEcmFnRHJvcCwgbW92ZUl0ZW1JbkFycmF5IH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2RyYWctZHJvcCc7XHJcbi8vIGltcG9ydCB7IE1lZGlhQ2hhbmdlLCBNZWRpYU9ic2VydmVyIH0gZnJvbSAnQGFuZ3VsYXIvZmxleC1sYXlvdXQnO1xyXG5AQ29tcG9uZW50KHtcclxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcclxuICBzZWxlY3RvcjogJ2NvY29yaW5nLWNtcycsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL2NvY29yaW5nLWNtcy5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4vY29jb3JpbmctY21zLmNvbXBvbmVudC5zY3NzJ10sXHJcbiAgcHJvdmlkZXJzOiBbSW5qZWN0Q29tcG9uZW50U2VydmljZV1cclxufSlcclxuZXhwb3J0IGNsYXNzIENvY29yaW5nQ21zQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xyXG4gIEBWaWV3Q2hpbGQoJ3NpZGVuYXYnKSBzaWRlbmF2OiBNYXRTaWRlbmF2O1xyXG4gIEBWaWV3Q2hpbGQoJ0NvbnRhaW5lclJlZicsIHsgc3RhdGljOiBmYWxzZSwgcmVhZDogVmlld0NvbnRhaW5lclJlZiB9KSBjb250YWluZXJSZWY6IFZpZXdDb250YWluZXJSZWY7XHJcblxyXG4gIGNvbmZpZ0NtczogQ29uZmlnQ21zTW9kZWw7XHJcbiAgY2F0YWxvZzogQmxvY2tbXSA9IFtdXHJcbiAgb3JpZW50YXRpb24gPSAnY29sdW1uJ1xyXG4gIF9zaG93U2F2ZUJ0bjogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIGltcG9ydFNlY3Rpb25zOiBTZWN0aW9uTW9kZWxbXSA9IFtdO1xyXG5cclxuICBwcml2YXRlIHJlYWRvbmx5IGRlc3Ryb3kkID0gbmV3IFN1YmplY3QoKTtcclxuXHJcbiAgQElucHV0KClcclxuICBzZXQgY29uZmlnKGNvbmZpZzogQ29uZmlnQ21zTW9kZWwpIHtcclxuICAgIGlmICghY29uZmlnKSB7XHJcbiAgICAgIHRocm93IG5ldyBFcnJvcihgTGEgY29uZmlnIGR1IGNvbXBvc2FudCBDTVMgbidlc3QgcGFzIGNvcnJlY3RlLi4uIGNvbmZpZzogJHtjb25maWd9YCk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5jb25maWdDbXMgPSBjb25maWdcclxuXHJcbiAgICB0aGlzLmNhdGFsb2cgPSBjb25maWcuY2F0YWxvZ1xyXG5cclxuICAgIHRoaXMuY21zU2VydmljZS5pbml0KClcclxuICB9XHJcblxyXG4gIEBJbnB1dCgpXHJcbiAgc2V0IGRhdGFzKHNlY3Rpb25EYXRhczogU2VjdGlvbk1vZGVsW10pIHtcclxuICAgIHRoaXMuaW1wb3J0U2VjdGlvbnMgPSBzZWN0aW9uRGF0YXNcclxuICB9XHJcblxyXG4gIEBJbnB1dCgpXHJcbiAgc2V0IHNob3dTYXZlQnRuKGRhdGE6IGJvb2xlYW4pIHtcclxuICAgIHRoaXMuX3Nob3dTYXZlQnRuID0gZGF0YVxyXG5cclxuICAgIGlmIChkYXRhKSB7XHJcbiAgICAgIHRoaXMub25QYWdlU2F2ZWQoKVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgQE91dHB1dCgpIG9uU2F2ZUJ0bjogRXZlbnRFbWl0dGVyPFNlY3Rpb25Nb2RlbFtdPiA9IG5ldyBFdmVudEVtaXR0ZXI8U2VjdGlvbk1vZGVsW10+KCk7XHJcblxyXG4gIHJlc3BvbnNpdmU6IHN0cmluZyA9ICdjb21wdXRlcidcclxuICBhY3RpdmVNZWRpYVF1ZXJ5ID0gJyc7XHJcbiAgc2lkZW5hdk1vZGU6IHN0cmluZyA9ICdzaWRlJ1xyXG4gIGlzU2lkZW5hdk9wZW46IGJvb2xlYW4gPSBmYWxzZTtcclxuICB0b3RhbFNlY3Rpb25zOiBudW1iZXIgPSAwO1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByaXZhdGUgbWVkaWFPYnNlcnZlcjogTWVkaWFPYnNlcnZlcixcclxuICAgIHByaXZhdGUgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZixcclxuICAgIHByaXZhdGUgY21zU2VydmljZTogQ21zU2VydmljZSxcclxuICAgIHByaXZhdGUgaW5qZWN0Q29tcG9uZW50U2VydmljZTogSW5qZWN0Q29tcG9uZW50U2VydmljZSxcclxuICApIHtcclxuICAgIHRoaXMuZXZlbnRTaXplU2NyZWVuKCk7XHJcbiAgfVxyXG5cclxuICBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAgIHRoaXMuYWRkU2VjdGlvbkV2ZW50KClcclxuXHJcbiAgICB0aGlzLm9uU2VjdGlvbk1vdmVkKClcclxuXHJcbiAgICAvKiogb24gZGVzc2luZSBsZXMgc2VjdGlvbnMgY2hhcmfDqWVzICEgKi9cclxuICAgIGlmICh0aGlzLmltcG9ydFNlY3Rpb25zLmxlbmd0aCkge1xyXG4gICAgICB0aGlzLmltcG9ydFNlY3Rpb25zLmZvckVhY2goKHNlY3Rpb246IFNlY3Rpb25Nb2RlbCkgPT4ge1xyXG4gICAgICAgIHRoaXMuY21zU2VydmljZS5hZGRTZWN0aW9uKHNlY3Rpb24pXHJcbiAgICAgIH0pXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcclxuICAgIHRoaXMuZGVzdHJveSQubmV4dCh1bmRlZmluZWQpO1xyXG4gICAgdGhpcy5kZXN0cm95JC5jb21wbGV0ZSgpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBvblBhZ2VTYXZlZCgpIHtcclxuICAgIHRoaXMuY21zU2VydmljZS5vblNhdmVDbXNDb250ZW50JC5waXBlKFxyXG4gICAgICB0YWtlVW50aWwodGhpcy5kZXN0cm95JClcclxuICAgICkuc3Vic2NyaWJlKChjb250ZW50UGFnZTogU2VjdGlvbk1vZGVsW10pID0+IHtcclxuICAgICAgdGhpcy5vblNhdmVCdG4uZW1pdChjb250ZW50UGFnZSlcclxuICAgIH0pXHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGV2ZW50U2l6ZVNjcmVlbigpIHtcclxuICAgIHRoaXMubWVkaWFPYnNlcnZlclxyXG4gICAgICAuYXNPYnNlcnZhYmxlKClcclxuICAgICAgLnBpcGUoXHJcbiAgICAgICAgdGFrZVVudGlsKHRoaXMuZGVzdHJveSQpXHJcbiAgICAgICkuc3Vic2NyaWJlKChjaGFuZ2UpID0+IHtcclxuICAgICAgICBjaGFuZ2UuZm9yRWFjaCgoaXRlbSkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5hY3RpdmVNZWRpYVF1ZXJ5ID0gaXRlbSA/IGAnJHtpdGVtLm1xQWxpYXN9JyA9ICgke2l0ZW0ubWVkaWFRdWVyeX0pYCA6ICcnO1xyXG5cclxuICAgICAgICAgIGlmIChpdGVtLm1xQWxpYXMgPT09ICd4cycpIHtcclxuICAgICAgICAgICAgdGhpcy5zaWRlbmF2TW9kZSA9ICdvdmVyJztcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2lkZW5hdk1vZGUgPSAnc2lkZSc7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSlcclxuICAgICAgfSlcclxuICB9XHJcblxyXG4gIHRvZ2dsZVNpZGVuYXZCbG9ja3MoKSB7XHJcbiAgICB0aGlzLnNpZGVuYXYudG9nZ2xlKClcclxuXHJcbiAgICB0aGlzLmlzU2lkZW5hdk9wZW4gPSB0aGlzLnNpZGVuYXYub3BlbmVkXHJcblxyXG4gICAgdGhpcy5jbXNTZXJ2aWNlLmNhdGFsb2dCbG9ja3NPcGVuZWQkLm5leHQodGhpcy5pc1NpZGVuYXZPcGVuKVxyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldFBhZ2VDTVNEYXRhcygpOiBTZWN0aW9uTW9kZWxDb21tYW5kW10ge1xyXG4gICAgcmV0dXJuIHRoaXMuY21zU2VydmljZS5zZWN0aW9uc1BhZ2VEYXRhcygpXHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFkZFNlY3Rpb25FdmVudCgpIHtcclxuICAgIHRoaXMuY21zU2VydmljZS5zZWN0aW9uQWRkZWQkLnBpcGUoXHJcbiAgICAgIHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSxcclxuICAgICAgdGFwKF8gPT4gdGhpcy5yZWZyZXNoTnVtYmVyU2VjdGlvbigpKSxcclxuICAgICAgdGFwKChkYXRhczogSW5zZXJ0U2VjdGlvbkF0KSA9PiB7XHJcbiAgICAgICAgdGhpcy5pbmplY3RDb21wb25lbnRTZXJ2aWNlLmxvYWRBbmRBZGRDb21wb25lbnRUb0NvbnRhaW5lcihDb2NvcmluZ0Ntc1NlY3Rpb25Db21wb25lbnQsIHRoaXMuY29udGFpbmVyUmVmLFxyXG4gICAgICAgICAgeyBzZWN0aW9uOiBkYXRhcy5zZWN0aW9uLCBhcGlzQ29uZmlnOiB0aGlzLmNvbmZpZ0Ntcy53eXNpd3lnT3B0aW9ucyB9LFxyXG4gICAgICAgICAgeyBhZnRlclJlbW92ZUFuaW1hdGlvbjogKHNlY3Rpb25JbmRleFJlbW92ZWQ6IG51bWJlcikgPT4gdGhpcy5vblNlY3Rpb25SZW1vdmVkQWZ0ZXJBbmltYXRpb24oc2VjdGlvbkluZGV4UmVtb3ZlZCkgfSwgZGF0YXMuaW5kZXhcclxuICAgICAgICApXHJcbiAgICAgIH0pLFxyXG4gICAgKS5zdWJzY3JpYmUoKVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBvblNlY3Rpb25SZW1vdmVkQWZ0ZXJBbmltYXRpb24oaW5kZXhTZWN0aW9uUmVtb3ZlZDogbnVtYmVyKSB7XHJcbiAgICB0aGlzLmluamVjdENvbXBvbmVudFNlcnZpY2UucmVtb3ZlQ29tcG9uZW50RnJvbVZpZXdDb250YWluZXIoaW5kZXhTZWN0aW9uUmVtb3ZlZCwgdGhpcy5jb250YWluZXJSZWYpXHJcblxyXG4gICAgdGhpcy5yZWZyZXNoTnVtYmVyU2VjdGlvbigpXHJcbiAgfVxyXG5cclxuICBwcml2YXRlIG9uU2VjdGlvbk1vdmVkKCkge1xyXG4gICAgdGhpcy5jbXNTZXJ2aWNlLm1vdmVTZWN0aW9uJC5waXBlKFxyXG4gICAgICB0YWtlVW50aWwodGhpcy5kZXN0cm95JCksXHJcbiAgICAgIHRhcCgodmFsdWVzOiBhbnkpID0+IHtcclxuICAgICAgICB0aGlzLm1vdmVTZWN0aW9uQ29udGFpbmVyKHsgcHJldmlvdXNJbmRleDogdmFsdWVzLnByZXZpb3VzSW5kZXgsIGN1cnJlbnRJbmRleDogdmFsdWVzLmN1cnJlbnRJbmRleCB9KVxyXG4gICAgICB9KSxcclxuICAgICkuc3Vic2NyaWJlKClcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcmVmcmVzaE51bWJlclNlY3Rpb24oKSB7XHJcbiAgICB0aGlzLnRvdGFsU2VjdGlvbnMgPSB0aGlzLmNtc1NlcnZpY2Uuc2VjdGlvbnMubGVuZ3RoXHJcblxyXG4gICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpXHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZHJvcFNlY3Rpb24oZXZlbnQ6IENka0RyYWdEcm9wPGFueVtdPikge1xyXG4gICAgdGhpcy5tb3ZlU2VjdGlvbkNvbnRhaW5lcih7IHByZXZpb3VzSW5kZXg6IGV2ZW50LnByZXZpb3VzSW5kZXgsIGN1cnJlbnRJbmRleDogZXZlbnQuY3VycmVudEluZGV4IH0pXHJcbiAgfVxyXG5cclxuICBwcml2YXRlIG1vdmVTZWN0aW9uQ29udGFpbmVyKG1vdmVJbmRleGVzOiBTZWN0aW9uTW92ZUluZGV4ZXMpIHtcclxuICAgIG1vdmVJdGVtSW5BcnJheSh0aGlzLmNtc1NlcnZpY2Uuc2VjdGlvbnMsIG1vdmVJbmRleGVzLnByZXZpb3VzSW5kZXgsIG1vdmVJbmRleGVzLmN1cnJlbnRJbmRleCk7XHJcblxyXG4gICAgdGhpcy5pbmplY3RDb21wb25lbnRTZXJ2aWNlLm1vdmVDb21wb25lbnRGcm9tVmlld0NvbnRhaW5lcihtb3ZlSW5kZXhlcy5jdXJyZW50SW5kZXgsIG1vdmVJbmRleGVzLnByZXZpb3VzSW5kZXgsIHRoaXMuY29udGFpbmVyUmVmKVxyXG4gIH1cclxufVxyXG4iLCI8ZGl2IGNsYXNzPVwicGFnZVwiPlxyXG4gICAgPGNvY29yaW5nLXRvb2xiYXItY21zIFtzaG93U2F2ZUJ0bl09XCJfc2hvd1NhdmVCdG5cIiAodG9nZ2xlU2lkZW5hdik9XCJ0b2dnbGVTaWRlbmF2QmxvY2tzKClcIj48L2NvY29yaW5nLXRvb2xiYXItY21zPlxyXG5cclxuICAgIDxkaXYgY2xhc3M9XCJzaWRlbmF2LWNvbnRhaW5lclwiPlxyXG4gICAgICAgIDxtYXQtc2lkZW5hdi1jb250YWluZXIgY2xhc3M9XCJsYXlvdXQtY29udGFpbmVyXCIgW2hhc0JhY2tkcm9wXT1cImZhbHNlXCIgZnVsbHNjcmVlbj5cclxuICAgICAgICAgICAgPG1hdC1zaWRlbmF2IGNsYXNzPVwic2lkZW5hdi1ibG9ja3MtY2F0YWxvZ1wiICNzaWRlbmF2IFttb2RlXT1cInNpZGVuYXZNb2RlXCIgcG9zaXRpb249XCJlbmRcIiBvcGVuZWQ9XCJmYWxzZVwiPlxyXG4gICAgICAgICAgICAgICAgPGNvY29yaW5nLWNtcy1ibG9ja3MtY2F0YWxvZyBbY2F0YWxvZ109XCJjYXRhbG9nXCI+PC9jb2NvcmluZy1jbXMtYmxvY2tzLWNhdGFsb2c+XHJcbiAgICAgICAgICAgIDwvbWF0LXNpZGVuYXY+XHJcbiAgICAgICAgICAgIDxtYXQtc2lkZW5hdi1jb250ZW50IFtuZ0NsYXNzXT1cInsnbm8tbWFyZ2luLXJpZ2h0JzogaXNTaWRlbmF2T3BlbiAmJiB0b3RhbFNlY3Rpb25zfVwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNpZGVuYXYtY29udGVudFwiIFtuZ0NsYXNzXT1cInsnc2lkZW5hdi1vcGVubmVkJzogaXNTaWRlbmF2T3Blbn1cIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiIXRvdGFsU2VjdGlvbnMgJiYgIWlzU2lkZW5hdk9wZW5cIiBjbGFzcz1cIm5vLXNlY3Rpb25cIiAoY2xpY2spPVwidG9nZ2xlU2lkZW5hdkJsb2NrcygpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDE+Q3VzdG9taXNleiB2b3RyZSBwYWdlIGZhY2lsZW1lbnQg8J+RjCA8L2gxPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+KGNsaXF1ZXogaWNpIHBvdXIgY29tcG9zZXIgdm90cmUgcGFnZSk8L3A+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJpc1NpZGVuYXZPcGVuICYmICF0b3RhbFNlY3Rpb25zXCIgY2xhc3M9XCJjb2wtZWxlbWVudHNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHRlLXByZXZpZXdcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwZXLDp3UgZGUgdm90cmUgcGFnZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm5ldy1ibG9ja1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGgxPkF1Y3VuZSBzZWN0aW9uPC9oMT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPmNsaXF1ZXogc3VyIHVuIHRlbXBsYXRlIHBvdXIgbCdham91dGVyPC9wPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cInRvdGFsU2VjdGlvbnNcIiBjbGFzcz1cImNvbnRhaW5lci1zZWN0aW9uc1wiIFtuZ0NsYXNzXT1cInsnY29sLWVsZW1lbnRzJzogaXNTaWRlbmF2T3Blbn1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJsb2Nrc1wiIGNka0Ryb3BMaXN0IChjZGtEcm9wTGlzdERyb3BwZWQpPVwiZHJvcFNlY3Rpb24oJGV2ZW50KVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNDb250YWluZXJSZWY+PC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9tYXQtc2lkZW5hdi1jb250ZW50PlxyXG4gICAgICAgIDwvbWF0LXNpZGVuYXYtY29udGFpbmVyPlxyXG4gICAgPC9kaXY+XHJcbjwvZGl2PiJdfQ==