UNPKG

ngx-mat-cdk

Version:

Extra Components for Angular Material including Filters,Drag Drop File, MatSelect Mobile Version

184 lines 29 kB
import { Component, EventEmitter, Injector, Input, Output, ViewChild } from '@angular/core'; import { FilterTypes } from "./filters/filter-components/filters-base"; import { ActivatedRoute, Router } from "@angular/router"; import { MatDialog } from "@angular/material/dialog"; import { FiltersService } from "./filters/filters.service"; import { Subscription } from 'rxjs'; import { MediaTracker } from "../shared/media-tracker"; import { NgxMatCdkUtilityService } from "../shared/services/ngx-mat-cdk-utility.service"; export class NgxMatFiltersComponent extends MediaTracker { constructor(injector, filterService, router, route, dialog, utilityService) { super(injector); this.filterService = filterService; this.router = router; this.route = route; this.dialog = dialog; this.utilityService = utilityService; this.matColor = 'warn'; this.showInDialog = false; this.applyFilter = new EventEmitter(); this.filters = []; this.noFilterSelectedText = 'Please choose a filter'; this.useJalaliDate = false; this.filterLabel = 'Filters'; this.applyLabel = 'ApplyFilters'; this.cancelLabel = 'Cancel'; this.fragment = 'filters'; this.afterCloseSub = new Subscription(); this.filterCount = 0; this.innerFilters = []; this.dialogConfig = { width: '550px', maxWidth: '100%', height: 'auto', maxHeight: '100%', closeOnNavigation: true }; } getClone(outerFilters) { const filters = []; outerFilters.forEach(filter => { filters.push({ options: filter.options, hidden: filter.hidden, field: filter.field, conditionOperator: filter.conditionOperator, logicalOperator: filter.logicalOperator, label: filter.label, value: filter.value ? typeof (filter.value) === 'object' && filter.type !== FilterTypes.DateTime ? Object.assign({}, filter.value) : filter.value : null, type: filter.type, valueTo: filter.valueTo, values: filter.values ? [...filter.values] : null, valuesName: filter.valuesName, valueName: filter.valueName, valueToName: filter.valueToName, conditionName: filter.conditionName, hasFilter: filter.hasFilter, hiddenCondition: filter.hiddenCondition, }); }); return filters; } populateInnerFilter() { this.innerFilters = []; this.innerFilters = this.getClone(this.filters); } ngOnInit() { this.filterService.useJalaliDate = this.useJalaliDate; if (!this.isMobile) { this.populateInnerFilter(); } } onClear() { if (!this.showInDialog) this._applyFilter(); } _applyFilter() { this.filters = []; setTimeout(() => { var _a; this.filters = this.innerFilters.slice(); this.filters.map(filter => { filter.hasFilter = this.filterService.checkHasFilter(filter); }); this.filterCount = (_a = this.filters.filter(z => z.hasFilter && !z.hidden)) === null || _a === void 0 ? void 0 : _a.length; const filteredFilters = this.getClone(this.filters); filteredFilters.map(filter => { var _a, _b, _c, _d; if (filter.type == FilterTypes.TrueFalse && filter.value == false && ((_b = (_a = filter.options) === null || _a === void 0 ? void 0 : _a.trueFalseOptions) === null || _b === void 0 ? void 0 : _b.falseIsNull) == true) { filter.value = null; } if (filter.type == FilterTypes.SingleSelect || filter.type == FilterTypes.MultiSelect) { if (filter.type == FilterTypes.SingleSelect && filter.value) { filter.value = filter.value[(_d = (_c = filter === null || filter === void 0 ? void 0 : filter.options) === null || _c === void 0 ? void 0 : _c.selectBoxOptions) === null || _d === void 0 ? void 0 : _d.valueMember]; } else if (filter.values) { filter.values = filter.values.map(va => { var _a, _b; return va[(_b = (_a = filter === null || filter === void 0 ? void 0 : filter.options) === null || _a === void 0 ? void 0 : _a.selectBoxOptions) === null || _b === void 0 ? void 0 : _b.valueMember]; }); } } return filter; }); this.applyFilter.emit({ filters: this.filters, filteredFilters, filtersQueryString: this.filterService.getFiltersInQueryString(filteredFilters) }); }, 10); } onApply() { this._applyFilter(); } openFilterDialog() { this.populateInnerFilter(); if (this.fragment) { this.router.navigate([''], { relativeTo: this.activatedRoute, fragment: this.fragment }); } this.dialogConfig.disableClose = true; this.dialogConfig.scrollStrategy = this.utilityService.dialogScrollStrategy; let dialogConfig = Object.assign({}, this.dialogConfig); if (this.isXs) { dialogConfig.width = '100%'; dialogConfig.maxWidth = '100vw'; dialogConfig.height = '100%'; dialogConfig.maxHeight = '100vh'; } const dd = this.dialog.open(this.filtersRef, dialogConfig); dd.afterClosed().subscribe(() => { if (this.fragment) { this.router.navigate([''], { relativeTo: this.activatedRoute, fragment: null }); } }); } onRemoveFilter(filter) { const selectedFilter = this.innerFilters.find(w => w.field == filter.field); if (selectedFilter) { this.filterService.clearFilter(selectedFilter); this.filterCount -= 1; } this.onApply(); } } NgxMatFiltersComponent.decorators = [ { type: Component, args: [{ selector: 'ngx-mat-filters', template: "<ng-template #mobileRef>\r\n <div class=\"ngx-mat-filters-wrap ngx-mat-filters-mobile\">\r\n <button\r\n mat-flat-button\r\n type=\"button\"\r\n (click)=\"openFilterDialog()\">\r\n <i [matBadgeOverlap]=\"true\"\r\n matBadgeSize=\"small\"\r\n [matBadgeColor]=\"matColor\"\r\n matBadgeHidden=\"false\"\r\n matBadgePosition=\"berfore\"\r\n [matBadge]=\"filterCount?.toString()\"\r\n class=\"material-icons\">filter_list</i>\r\n <span class=\"ngx-mat-card-filter-text\">\r\n {{filterLabel}}\r\n </span>\r\n </button>\r\n <ng-container [ngTemplateOutlet]=\"chipsRef\"></ng-container>\r\n </div>\r\n <ng-template #filtersRef>\r\n <div class=\"ngx-mat-dialog-header\">\r\n <h2 mat-dialog-title>{{filterLabel}}</h2>\r\n <button [color]=\"matColor\" ngxAfterCloseMatDialog type=\"button\" mat-icon-button mat-dialog-close>\r\n <mat-icon>clear</mat-icon>\r\n </button>\r\n\r\n </div>\r\n <mat-dialog-content>\r\n <div class=\"mat-typography\">\r\n <ngx-mat-filters-list (clear)=\"onClear()\" [filters]=\"innerFilters\">\r\n\r\n </ngx-mat-filters-list>\r\n\r\n </div>\r\n </mat-dialog-content>\r\n <mat-dialog-actions>\r\n <button type=\"button\" [color]=\"matColor\" mat-raised-button ngxAfterCloseMatDialog mat-dialog-close\r\n (click)=\"onApply()\">{{applyLabel}}</button>\r\n\r\n <button ngxAfterCloseMatDialog [color]=\"matColor\" type=\"button\" mat-raised-button\r\n mat-dialog-close>{{cancelLabel}}</button>\r\n\r\n </mat-dialog-actions>\r\n </ng-template>\r\n</ng-template>\r\n<ng-template #noneMobileRef>\r\n <div class=\"ngx-mat-filters-right-wrap\">\r\n <ng-container [ngTemplateOutlet]=\"chipsRef\"></ng-container>\r\n\r\n <ngx-mat-filters-list [(filterCount)]=\"filterCount\" [filters]=\"innerFilters\">\r\n\r\n </ngx-mat-filters-list>\r\n\r\n <button type=\"button\" [color]=\"matColor\" mat-raised-button\r\n (click)=\"onApply()\">{{applyLabel}}</button>\r\n </div>\r\n\r\n</ng-template>\r\n<ng-template #chipsRef>\r\n <div class=\"ngx-mat-filters-container\" [class.ngx-mat-filters-mobile]=\"showInDialog\"\r\n [class.ngx-mat-filters-none-mobile]=\"!showInDialog\">\r\n <ng-container *ngIf=\"(!filterCount || filterCount == 0) && !showInDialog\">\r\n {{noFilterSelectedText}}\r\n </ng-container>\r\n <mat-chip-list>\r\n <ng-container *ngFor=\"let filter of filters\">\r\n <ng-container *ngIf=\"!filter.hidden\">\r\n <mat-chip [matTooltip]=\"(filter| displayLabelFilter:false)\"\r\n (removed)=\"onRemoveFilter(filter)\" selected [color]=\"matColor\" *ngIf=\"filter.hasFilter\">\r\n <div class=\"ngx-mat-filters-chip-text\">\r\n <span class=\"ngx-mat-filters-chip-label\">\r\n {{filter.label}}\r\n </span>\r\n <small class=\"ngx-mat-filters-chip-displayLabel\">{{filter| displayLabelFilter:false}}</small>\r\n <mat-icon class=\"ngx-mat-filters-chip-icon\" matChipRemove>cancel</mat-icon>\r\n\r\n </div>\r\n </mat-chip>\r\n\r\n </ng-container>\r\n\r\n </ng-container>\r\n </mat-chip-list>\r\n </div>\r\n\r\n</ng-template>\r\n\r\n\r\n<div class=\"ngx-mat-filters-main-container\"\r\n>\r\n <ng-container *ngIf=\"showInDialog\" [ngTemplateOutlet]=\"mobileRef\">\r\n\r\n </ng-container>\r\n <ng-container *ngIf=\"!showInDialog\" [ngTemplateOutlet]=\"noneMobileRef\"></ng-container>\r\n</div>\r\n", styles: [".ngx-mat-search-box-filter-container{display:flex;flex-direction:column;grid-gap:10px;padding:20px;position:relative}.ngx-mat-search-box-filter-items{margin:10px 0 20px}.ngx-mat-search-box-filter-container .ngx-mat-search-box:after{border-bottom:1px dashed #e0e0e0;content:\"\";left:0;margin-bottom:10px;position:absolute;right:0}.ngx-mat-search-box-filter-container>div{flex:1}.ngx-mat-search-box-filter-item{width:auto}.filter-text{white-space:nowrap}ngx-mat-filter-selector .mat-chip-list-wrapper{flex-wrap:nowrap!important}.ngx-mat-search-box-filter-first-row{align-items:center;display:flex;justify-content:flex-start}.ngx-mat-search-box-filter-first-row ngx-mat-search-box{flex:1 100%}.ngx-mat-search-box-filter-first-row>div{flex:1 1 auto}.ngx-mat-card-filter-text{border-bottom:1px dashed #000}.close.mat-icon-button{left:0;line-height:14px;min-width:auto;padding:5px;position:absolute;top:50%;transform:translateY(-50%)}.ngx-mat-filters-wrap{border:1px solid #e0e0e0;border-radius:4px;display:flex;grid-gap:8px;overflow:hidden;padding:8px 0}.ngx-mat-filters-mobile.ngx-mat-filters-wrap{border:0}.ngx-mat-filters-wrap>button{flex:0 0 auto}.ngx-mat-filters-chip-text{align-items:center;display:flex;grid-gap:5px;justify-content:center;max-width:100%}.ngx-mat-filters-right-wrap{display:flex;flex-direction:column;grid-gap:8px}.ngx-mat-filters-none-mobile.ngx-mat-filters-container{border:1px solid #e0e0e0;border-radius:4px;min-height:80px;padding:8px;text-align:center}.ngx-mat-filters-main-container{overflow:auto;width:100%}.ngx-mat-filters-main-container.mobile{overflow:hidden!important;padding:0!important;width:auto!important}"] },] } ]; NgxMatFiltersComponent.ctorParameters = () => [ { type: Injector }, { type: FiltersService }, { type: Router }, { type: ActivatedRoute }, { type: MatDialog }, { type: NgxMatCdkUtilityService } ]; NgxMatFiltersComponent.propDecorators = { matColor: [{ type: Input }], activatedRoute: [{ type: Input }], showInDialog: [{ type: Input }], filtersRef: [{ type: ViewChild, args: ['filtersRef',] }], applyFilter: [{ type: Output }], width: [{ type: Input }], filters: [{ type: Input }], noFilterSelectedText: [{ type: Input }], useJalaliDate: [{ type: Input }], filterLabel: [{ type: Input }], applyLabel: [{ type: Input }], cancelLabel: [{ type: Input }], conditionLabel: [{ type: Input }], fragment: [{ type: Input }], dialogConfig: [{ type: Input }] }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd4LW1hdC1maWx0ZXJzLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJDOi9Vc2Vycy9BbGlyZXphIE1vaGFtbWFkaS9zb3VyY2UvcmVwb3MvTXlMaWJyYXJ5L0FuZ3VsYXIuTGlicmFyeS9saWJzL3Byb2plY3RzL25neC1tYXQtY2RrL3NyYy8iLCJzb3VyY2VzIjpbImxpYi9uZ3gtbWF0LWZpbHRlcnMvbmd4LW1hdC1maWx0ZXJzLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsU0FBUyxFQUFFLFlBQVksRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFVLE1BQU0sRUFBZSxTQUFTLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDL0csT0FBTyxFQUFTLFdBQVcsRUFBdUIsTUFBTSwwQ0FBMEMsQ0FBQztBQUNuRyxPQUFPLEVBQUMsY0FBYyxFQUFFLE1BQU0sRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBQ3ZELE9BQU8sRUFBQyxTQUFTLEVBQWtCLE1BQU0sMEJBQTBCLENBQUM7QUFDcEUsT0FBTyxFQUFDLGNBQWMsRUFBQyxNQUFNLDJCQUEyQixDQUFDO0FBQ3pELE9BQU8sRUFBQyxZQUFZLEVBQUMsTUFBTSxNQUFNLENBQUM7QUFDbEMsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLHlCQUF5QixDQUFDO0FBQ3JELE9BQU8sRUFBQyx1QkFBdUIsRUFBQyxNQUFNLGdEQUFnRCxDQUFDO0FBU3ZGLE1BQU0sT0FBTyxzQkFBdUIsU0FBUSxZQUFZO0lBQ3RELFlBQ0UsUUFBa0IsRUFDVixhQUE2QixFQUM3QixNQUFjLEVBQ2QsS0FBcUIsRUFDdEIsTUFBaUIsRUFDaEIsY0FBdUM7UUFFL0MsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBTlIsa0JBQWEsR0FBYixhQUFhLENBQWdCO1FBQzdCLFdBQU0sR0FBTixNQUFNLENBQVE7UUFDZCxVQUFLLEdBQUwsS0FBSyxDQUFnQjtRQUN0QixXQUFNLEdBQU4sTUFBTSxDQUFXO1FBQ2hC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LElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUNqQixDQUFDOzs7WUExS0YsU0FBUyxTQUFDO2dCQUNULFFBQVEsRUFBRSxpQkFBaUI7Z0JBQzNCLHlnSEFBK0M7O2FBR2hEOzs7WUFmZ0MsUUFBUTtZQUlqQyxjQUFjO1lBRkUsTUFBTTtZQUF0QixjQUFjO1lBQ2QsU0FBUztZQUlULHVCQUF1Qjs7O3VCQXFCNUIsS0FBSzs2QkFDTCxLQUFLOzJCQUNMLEtBQUs7eUJBQ0wsU0FBUyxTQUFDLFlBQVk7MEJBQ3RCLE1BQU07b0JBQ04sS0FBSztzQkFDTCxLQUFLO21DQUNMLEtBQUs7NEJBQ0wsS0FBSzswQkFDTCxLQUFLO3lCQUNMLEtBQUs7MEJBQ0wsS0FBSzs2QkFDTCxLQUFLO3VCQUNMLEtBQUs7MkJBSUwsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7Q29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIEluamVjdG9yLCBJbnB1dCwgT25Jbml0LCBPdXRwdXQsIFRlbXBsYXRlUmVmLCBWaWV3Q2hpbGR9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQge0ZpbHRlciwgRmlsdGVyVHlwZXMsIE5neEFwcGx5RmlsdGVyUmVzdWx0fSBmcm9tIFwiLi9maWx0ZXJzL2ZpbHRlci1jb21wb25lbnRzL2ZpbHRlcnMtYmFzZVwiO1xyXG5pbXBvcnQge0FjdGl2YXRlZFJvdXRlLCBSb3V0ZXJ9IGZyb20gXCJAYW5ndWxhci9yb3V0ZXJcIjtcclxuaW1wb3J0IHtNYXREaWFsb2csIE1hdERpYWxvZ0NvbmZpZ30gZnJvbSBcIkBhbmd1bGFyL21hdGVyaWFsL2RpYWxvZ1wiO1xyXG5pbXBvcnQge0ZpbHRlcnNTZXJ2aWNlfSBmcm9tIFwiLi9maWx0ZXJzL2ZpbHRlcnMuc2VydmljZVwiO1xyXG5pbXBvcnQge1N1YnNjcmlwdGlvbn0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7TWVkaWFUcmFja2VyfSBmcm9tIFwiLi4vc2hhcmVkL21lZGlhLXRyYWNrZXJcIjtcclxuaW1wb3J0IHtOZ3hNYXRDZGtVdGlsaXR5U2VydmljZX0gZnJvbSBcIi4uL3NoYXJlZC9zZXJ2aWNlcy9uZ3gtbWF0LWNkay11dGlsaXR5LnNlcnZpY2VcIjtcclxuaW1wb3J0IHtUaGVtZVBhbGV0dGV9IGZyb20gXCJAYW5ndWxhci9tYXRlcmlhbC9jb3JlL2NvbW1vbi1iZWhhdmlvcnMvY29sb3JcIjtcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnbmd4LW1hdC1maWx0ZXJzJyxcclxuICB0ZW1wbGF0ZVVybDogJy4vbmd4LW1hdC1maWx0ZXJzLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi9uZ3gtbWF0LWZpbHRlcnMuY29tcG9uZW50LnNjc3MnXSxcclxuXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBOZ3hNYXRGaWx0ZXJzQ29tcG9uZW50IGV4dGVuZHMgTWVkaWFUcmFja2VyIGltcGxlbWVudHMgT25Jbml0IHtcclxuICBjb25zdHJ1Y3RvcihcclxuICAgIGluamVjdG9yOiBJbmplY3RvcixcclxuICAgIHByaXZhdGUgZmlsdGVyU2VydmljZTogRmlsdGVyc1NlcnZpY2UsXHJcbiAgICBwcml2YXRlIHJvdXRlcjogUm91dGVyLFxyXG4gICAgcHJpdmF0ZSByb3V0ZTogQWN0aXZhdGVkUm91dGUsXHJcbiAgICBwdWJsaWMgZGlhbG9nOiBNYXREaWFsb2csXHJcbiAgICBwcml2YXRlIHV0aWxpdHlTZXJ2aWNlOiBOZ3hNYXRDZGtVdGlsaXR5U2VydmljZVxyXG4gICkge1xyXG4gICAgc3VwZXIoaW5qZWN0b3IpO1xyXG4gIH1cclxuXHJcbiAgQElucHV0KCkgbWF0Q29sb3I6IFRoZW1lUGFsZXR0ZSA9ICd3YXJuJztcclxuICBASW5wdXQoKSBhY3RpdmF0ZWRSb3V0ZTogQWN0aXZhdGVkUm91dGU7XHJcbiAgQElucHV0KCkgc2hvd0luRGlhbG9nID0gZmFsc2U7XHJcbiAgQFZpZXdDaGlsZCgnZmlsdGVyc1JlZicpIGZpbHRlcnNSZWY6IFRlbXBsYXRlUmVmPGFueT47XHJcbiAgQE91dHB1dCgpIGFwcGx5RmlsdGVyID0gbmV3IEV2ZW50RW1pdHRlcjxOZ3hBcHBseUZpbHRlclJlc3VsdD4oKTtcclxuICBASW5wdXQoKSB3aWR0aDogbnVtYmVyO1xyXG4gIEBJbnB1dCgpIGZpbHRlcnM6IEZpbHRlcltdID0gW107XHJcbiAgQElucHV0KCkgbm9GaWx0ZXJTZWxlY3RlZFRleHQgPSAnUGxlYXNlIGNob29zZSBhIGZpbHRlcic7XHJcbiAgQElucHV0KCkgdXNlSmFsYWxpRGF0ZSA9IGZhbHNlO1xyXG4gIEBJbnB1dCgpIGZpbHRlckxhYmVsID0gJ0ZpbHRlcnMnO1xyXG4gIEBJbnB1dCgpIGFwcGx5TGFiZWwgPSAnQXBwbHlGaWx0ZXJzJztcclxuICBASW5wdXQoKSBjYW5jZWxMYWJlbCA9ICdDYW5jZWwnO1xyXG4gIEBJbnB1dCgpIGNvbmRpdGlvbkxhYmVsOiAnQ29uZGl0aW9uJztcclxuICBASW5wdXQoKSBmcmFnbWVudDogc3RyaW5nID0gJ2ZpbHRlcnMnO1xyXG4gIHByaXZhdGUgYWZ0ZXJDbG9zZVN1YiA9IG5ldyBTdWJzY3JpcHRpb24oKTtcclxuICBmaWx0ZXJDb3VudCA9IDA7XHJcbiAgaW5uZXJGaWx0ZXJzOiBGaWx0ZXJbXSA9IFtdO1xyXG4gIEBJbnB1dCgpIGRpYWxvZ0NvbmZpZzogTWF0RGlhbG9nQ29uZmlnID0ge1xyXG4gICAgd2lkdGg6ICc1NTBweCcsXHJcbiAgICBtYXhXaWR0aDogJzEwMCUnLFxyXG4gICAgaGVpZ2h0OiAnYXV0bycsXHJcbiAgICBtYXhIZWlnaHQ6ICcxMDAlJyxcclxuICAgIGNsb3NlT25OYXZpZ2F0aW9uOiB0cnVlXHJcbiAgfTtcclxuXHJcblxyXG4gIGdldENsb25lKG91dGVyRmlsdGVyczogRmlsdGVyW10pOiBGaWx0ZXJbXSB7XHJcbiAgICBjb25zdCBmaWx0ZXJzID0gW107XHJcbiAgICBvdXRlckZpbHRlcnMuZm9yRWFjaChmaWx0ZXIgPT4ge1xyXG4gICAgICBmaWx0ZXJzLnB1c2goXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgb3B0aW9uczogZmlsdGVyLm9wdGlvbnMsXHJcbiAgICAgICAgICBoaWRkZW46IGZpbHRlci5oaWRkZW4sXHJcbiAgICAgICAgICBmaWVsZDogZmlsdGVyLmZpZWxkLFxyXG4gICAgICAgICAgY29uZGl0aW9uT3BlcmF0b3I6IGZpbHRlci5jb25kaXRpb25PcGVyYXRvcixcclxuICAgICAgICAgIGxvZ2ljYWxPcGVyYXRvcjogZmlsdGVyLmxvZ2ljYWxPcGVyYXRvcixcclxuICAgICAgICAgIGxhYmVsOiBmaWx0ZXIubGFiZWwsXHJcbiAgICAgICAgICB2YWx1ZTogZmlsdGVyLnZhbHVlID8gdHlwZW9mIChmaWx0ZXIudmFsdWUpID09PSAnb2JqZWN0JyAmJiBmaWx0ZXIudHlwZSAhPT0gRmlsdGVyVHlwZXMuRGF0ZVRpbWUgPyB7Li4uZmlsdGVyLnZhbHVlfSA6IGZpbHRlci52YWx1ZSA6IG51bGwsXHJcbiAgICAgICAgICB0eXBlOiBmaWx0ZXIudHlwZSxcclxuICAgICAgICAgIHZhbHVlVG86IGZpbHRlci52YWx1ZVRvLFxyXG4gICAgICAgICAgdmFsdWVzOiBmaWx0ZXIudmFsdWVzID8gWy4uLmZpbHRlci52YWx1ZXNdIDogbnVsbCxcclxuICAgICAgICAgIHZhbHVlc05hbWU6IGZpbHRlci52YWx1ZXNOYW1lLFxyXG4gICAgICAgICAgdmFsdWVOYW1lOiBmaWx0ZXIudmFsdWVOYW1lLFxyXG4gICAgICAgICAgdmFsdWVUb05hbWU6IGZpbHRlci52YWx1ZVRvTmFtZSxcclxuICAgICAgICAgIGNvbmRpdGlvbk5hbWU6IGZpbHRlci5jb25kaXRpb25OYW1lLFxyXG4gICAgICAgICAgaGFzRmlsdGVyOiBmaWx0ZXIuaGFzRmlsdGVyLFxyXG4gICAgICAgICAgaGlkZGVuQ29uZGl0aW9uOiBmaWx0ZXIuaGlkZGVuQ29uZGl0aW9uLFxyXG4gICAgICAgIH1cclxuICAgICAgKTtcclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIGZpbHRlcnM7XHJcbiAgfVxyXG5cclxuICBwb3B1bGF0ZUlubmVyRmlsdGVyKCk6IHZvaWQge1xyXG4gICAgdGhpcy5pbm5lckZpbHRlcnMgPSBbXTtcclxuICAgIHRoaXMuaW5uZXJGaWx0ZXJzID0gdGhpcy5nZXRDbG9uZSh0aGlzLmZpbHRlcnMpO1xyXG4gIH1cclxuXHJcbiAgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICB0aGlzLmZpbHRlclNlcnZpY2UudXNlSmFsYWxpRGF0ZSA9IHRoaXMudXNlSmFsYWxpRGF0ZTtcclxuICAgIGlmICghdGhpcy5pc01vYmlsZSkge1xyXG4gICAgICB0aGlzLnBvcHVsYXRlSW5uZXJGaWx0ZXIoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG9uQ2xlYXIoKTogdm9pZCB7XHJcbiAgICBpZiAoIXRoaXMuc2hvd0luRGlhbG9nKVxyXG4gICAgICB0aGlzLl9hcHBseUZpbHRlcigpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfYXBwbHlGaWx0ZXIoKTogdm9pZCB7XHJcbiAgICB0aGlzLmZpbHRlcnMgPSBbXTtcclxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICB0aGlzLmZpbHRlcnMgPSB0aGlzLmlubmVyRmlsdGVycy5zbGljZSgpO1xyXG5cclxuICAgICAgdGhpcy5maWx0ZXJzLm1hcChmaWx0ZXIgPT4ge1xyXG4gICAgICAgIGZpbHRlci5oYXNGaWx0ZXIgPSB0aGlzLmZpbHRlclNlcnZpY2UuY2hlY2tIYXNGaWx0ZXIoZmlsdGVyKTtcclxuICAgICAgfSk7XHJcblxyXG4gICAgICB0aGlzLmZpbHRlckNvdW50ID0gdGhpcy5maWx0ZXJzLmZpbHRlcih6ID0+IHouaGFzRmlsdGVyICYmICF6LmhpZGRlbik/Lmxlbmd0aDtcclxuXHJcbiAgICAgIGNvbnN0IGZpbHRlcmVkRmlsdGVycyA9IHRoaXMuZ2V0Q2xvbmUodGhpcy5maWx0ZXJzKTtcclxuXHJcbiAgICAgIGZpbHRlcmVkRmlsdGVycy5tYXAoZmlsdGVyID0+IHtcclxuICAgICAgICBpZiAoZmlsdGVyLnR5cGUgPT0gRmlsdGVyVHlwZXMuVHJ1ZUZhbHNlICYmXHJcbiAgICAgICAgICBmaWx0ZXIudmFsdWUgPT0gZmFsc2VcclxuICAgICAgICAgICYmIGZpbHRlci5vcHRpb25zPy50cnVlRmFsc2VPcHRpb25zPy5mYWxzZUlzTnVsbCA9PSB0cnVlKSB7XHJcbiAgICAgICAgICBmaWx0ZXIudmFsdWUgPSBudWxsO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoZmlsdGVyLnR5cGUgPT0gRmlsdGVyVHlwZXMuU2luZ2xlU2VsZWN0IHx8IGZpbHRlci50eXBlID09IEZpbHRlclR5cGVzLk11bHRpU2VsZWN0KSB7XHJcbiAgICAgICAgICBpZiAoZmlsdGVyLnR5cGUgPT0gRmlsdGVyVHlwZXMuU2luZ2xlU2VsZWN0ICYmIGZpbHRlci52YWx1ZSkge1xyXG4gICAgICAgICAgICBmaWx0ZXIudmFsdWUgPSBmaWx0ZXIudmFsdWVbZmlsdGVyPy5vcHRpb25zPy5zZWxlY3RCb3hPcHRpb25zPy52YWx1ZU1lbWJlcl07XHJcbiAgICAgICAgICB9IGVsc2UgaWYgKGZpbHRlci52YWx1ZXMpIHtcclxuICAgICAgICAgICAgZmlsdGVyLnZhbHVlcyA9IGZpbHRlci52YWx1ZXMubWFwKHZhID0+IHtcclxuICAgICAgICAgICAgICByZXR1cm4gdmFbZmlsdGVyPy5vcHRpb25zPy5zZWxlY3RCb3hPcHRpb25zPy52YWx1ZU1lbWJlcl07XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gZmlsdGVyO1xyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIHRoaXMuYXBwbHlGaWx0ZXIuZW1pdCh7XHJcbiAgICAgICAgZmlsdGVyczogdGhpcy5maWx0ZXJzLFxyXG4gICAgICAgIGZpbHRlcmVkRmlsdGVycyxcclxuICAgICAgICBmaWx0ZXJzUXVlcnlTdHJpbmc6IHRoaXMuZmlsdGVyU2VydmljZS5nZXRGaWx0ZXJzSW5RdWVyeVN0cmluZyhmaWx0ZXJlZEZpbHRlcnMpXHJcbiAgICAgIH0pO1xyXG4gICAgfSwgMTApXHJcblxyXG4gIH1cclxuXHJcbiAgb25BcHBseSgpOiB2b2lkIHtcclxuICAgIHRoaXMuX2FwcGx5RmlsdGVyKCk7XHJcbiAgfVxyXG5cclxuICBvcGVuRmlsdGVyRGlhbG9nKCk6IHZvaWQge1xyXG4gICAgdGhpcy5wb3B1bGF0ZUlubmVyRmlsdGVyKCk7XHJcbiAgICBpZiAodGhpcy5mcmFnbWVudCkge1xyXG4gICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbJyddLCB7XHJcbiAgICAgICAgcmVsYXRpdmVUbzogdGhpcy5hY3RpdmF0ZWRSb3V0ZSxcclxuICAgICAgICBmcmFnbWVudDogdGhpcy5mcmFnbWVudFxyXG4gICAgICB9KTtcclxuXHJcbiAgICB9XHJcbiAgICB0aGlzLmRpYWxvZ0NvbmZpZy5kaXNhYmxlQ2xvc2UgPSB0cnVlO1xyXG4gICAgdGhpcy5kaWFsb2dDb25maWcuc2Nyb2xsU3RyYXRlZ3kgPSB0aGlzLnV0aWxpdHlTZXJ2aWNlLmRpYWxvZ1Njcm9sbFN0cmF0ZWd5O1xyXG4gICAgbGV0IGRpYWxvZ0NvbmZpZzogTWF0RGlhbG9nQ29uZmlnID0gey4uLnRoaXMuZGlhbG9nQ29uZmlnfTtcclxuXHJcbiAgICBpZiAodGhpcy5pc1hzKSB7XHJcbiAgICAgIGRpYWxvZ0NvbmZpZy53aWR0aCA9ICcxMDAlJztcclxuICAgICAgZGlhbG9nQ29uZmlnLm1heFdpZHRoID0gJzEwMHZ3JztcclxuICAgICAgZGlhbG9nQ29uZmlnLmhlaWdodCA9ICcxMDAlJztcclxuICAgICAgZGlhbG9nQ29uZmlnLm1heEhlaWdodCA9ICcxMDB2aCc7XHJcblxyXG4gICAgfVxyXG4gICAgY29uc3QgZGQgPSB0aGlzLmRpYWxvZy5vcGVuKHRoaXMuZmlsdGVyc1JlZiwgZGlhbG9nQ29uZmlnKTtcclxuICAgIGRkLmFmdGVyQ2xvc2VkKCkuc3Vic2NyaWJlKCgpID0+IHtcclxuICAgICAgaWYgKHRoaXMuZnJhZ21lbnQpIHtcclxuICAgICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbJyddLCB7XHJcbiAgICAgICAgICByZWxhdGl2ZVRvOiB0aGlzLmFjdGl2YXRlZFJvdXRlLFxyXG4gICAgICAgICAgZnJhZ21lbnQ6IG51bGxcclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgfSlcclxuICB9XHJcblxyXG4gIG9uUmVtb3ZlRmlsdGVyKGZpbHRlcjogRmlsdGVyKTogdm9pZCB7XHJcbiAgICBjb25zdCBzZWxlY3RlZEZpbHRlciA9IHRoaXMuaW5uZXJGaWx0ZXJzLmZpbmQodyA9PiB3LmZpZWxkID09IGZpbHRlci5maWVsZCk7XHJcbiAgICBpZiAoc2VsZWN0ZWRGaWx0ZXIpIHtcclxuICAgICAgdGhpcy5maWx0ZXJTZXJ2aWNlLmNsZWFyRmlsdGVyKHNlbGVjdGVkRmlsdGVyKTtcclxuICAgICAgdGhpcy5maWx0ZXJDb3VudCAtPSAxO1xyXG4gICAgfVxyXG4gICAgdGhpcy5vbkFwcGx5KCk7XHJcbiAgfVxyXG59XHJcbiJdfQ==