ngx-mat-cdk
Version:
Extra Components for Angular Material including Filters,Drag Drop File, MatSelect Mobile Version
294 lines • 44.4 kB
JavaScript
import { Injectable } from '@angular/core';
import * as moment from 'jalali-moment';
import { ConditionOperator, FilterTypes, PageFilter } from './filter-components/filters-base';
import { SeparateThreeCommaPipe } from "../../shared/pipes/separate-three-comma.pipe";
import * as i0 from "@angular/core";
import * as i1 from "../../shared/pipes/separate-three-comma.pipe";
export class FiltersService {
constructor(moneyPipe) {
this.moneyPipe = moneyPipe;
this.conditionSource = [];
this.useJalaliDate = false;
}
checkHasFilter(filter) {
return ((this.noValueConditions.includes(filter.conditionOperator))
||
(filter.type == FilterTypes.MultiSelect ? filter.values && filter.values.length > 0 : !!filter.value));
}
getConditionSource() {
const conditions = [];
for (let enumMember in ConditionOperator) {
const condition = ConditionOperator[enumMember];
const gcplat = this.getCondition(condition, null);
if (gcplat) {
conditions.push({
key: ConditionOperator[enumMember],
label: gcplat.label,
types: gcplat.types
});
}
}
return conditions;
}
getDefaultCondition(filterType) {
switch (filterType) {
case FilterTypes.MultiSelect:
case FilterTypes.ListCheck: {
return ConditionOperator.InRange;
}
case FilterTypes.TrueFalse:
case FilterTypes.SingleSelect:
case FilterTypes.Number: {
return ConditionOperator.Equal;
}
case FilterTypes.TextBox: {
return ConditionOperator.Contains;
}
case FilterTypes.DateTime: {
return ConditionOperator.Between;
}
}
}
getConditionLabel(condition, filter) {
var _a, _b;
if (condition) {
const conditionKey = condition[0].toLowerCase() + condition.substring(1);
if ((_a = filter === null || filter === void 0 ? void 0 : filter.options) === null || _a === void 0 ? void 0 : _a.conditionOptions) {
return (_b = filter === null || filter === void 0 ? void 0 : filter.options) === null || _b === void 0 ? void 0 : _b.conditionOptions[conditionKey];
}
else {
return condition;
}
}
return "";
}
getCondition(condition, filter) {
condition = condition || filter.conditionOperator;
const label = this.getConditionLabel(condition, filter);
switch (condition) {
case ConditionOperator.Between:
return { label, types: [FilterTypes.Number, FilterTypes.DateTime], hasValue: true };
case ConditionOperator.Contains:
return { label, types: [FilterTypes.TextBox], hasValue: true };
case ConditionOperator.EndWith:
return { label, types: [FilterTypes.TextBox], hasValue: true };
case ConditionOperator.Equal:
return { label, types: [FilterTypes.Number], hasValue: true };
case ConditionOperator.Exact:
return { label, types: [FilterTypes.DateTime, FilterTypes.TextBox], hasValue: true };
case ConditionOperator.GreaterThan:
return { label, types: [FilterTypes.Number, FilterTypes.DateTime], hasValue: true };
case ConditionOperator.GreaterThanOrEqual:
return { label, types: [FilterTypes.Number, FilterTypes.DateTime], hasValue: true };
case ConditionOperator.LessThan:
return { label, types: [FilterTypes.Number, FilterTypes.DateTime], hasValue: true };
case ConditionOperator.LessThanOrEqual:
return { label, types: [FilterTypes.Number, FilterTypes.DateTime], hasValue: true };
case ConditionOperator.NotEqual:
return { label, types: [FilterTypes.Number, FilterTypes.TextBox], hasValue: true };
case ConditionOperator.StartWith:
return { label, types: [FilterTypes.TextBox], hasValue: true };
case ConditionOperator.InRange:
return { label, types: [FilterTypes.ListCheck], hasValue: true };
case ConditionOperator.LastMonth:
return { label, types: [FilterTypes.DateTime], hasValue: false };
case ConditionOperator.LastWeek:
return { label, types: [FilterTypes.DateTime], hasValue: false };
case ConditionOperator.CurrentMonth:
return { label, types: [FilterTypes.DateTime], hasValue: false };
case ConditionOperator.CurrentWeek:
return { label, types: [FilterTypes.DateTime], hasValue: false };
case ConditionOperator.CurrentYear:
return { label, types: [FilterTypes.DateTime], hasValue: false };
}
}
get noValueConditions() {
return [
ConditionOperator.LastWeek,
ConditionOperator.LastMonth,
ConditionOperator.CurrentYear,
ConditionOperator.CurrentWeek,
ConditionOperator.CurrentMonth
];
}
clearFilter(filter) {
filter.hasFilter = false;
if (filter.type === FilterTypes.DateTime) {
filter.conditionOperator = this.getDefaultCondition(filter.type);
}
switch (filter.type) {
case FilterTypes.DateTime:
case FilterTypes.Number:
case FilterTypes.TextBox:
case FilterTypes.SingleSelect:
case FilterTypes.TrueFalse:
{
filter.value = null;
filter.valueTo = null;
}
break;
case FilterTypes.MultiSelect:
case FilterTypes.ListCheck: {
filter.values = null;
}
}
}
getDisplayLabel(filter, hasConditionName = true) {
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r;
const condition = this.getCondition(null, filter);
if (!condition) {
return ' ';
}
filter.conditionName = condition.label;
if (this.noValueConditions.includes(filter.conditionOperator)) {
return filter.conditionName;
}
let conditionName = hasConditionName ? filter.conditionName : '';
if (!condition.hasValue) {
return conditionName;
}
if (filter.type == FilterTypes.MultiSelect) {
if (!filter.values) {
return '';
}
return filter.values.map(z => { var _a, _b; return z[(_b = (_a = filter.options) === null || _a === void 0 ? void 0 : _a.selectBoxOptions) === null || _b === void 0 ? void 0 : _b.displayMember]; }).join(' ,');
}
else if (filter.type == FilterTypes.SingleSelect) {
if (!filter.value) {
return '';
}
return filter.value[(_b = (_a = filter.options) === null || _a === void 0 ? void 0 : _a.selectBoxOptions) === null || _b === void 0 ? void 0 : _b.displayMember];
}
else {
if (!filter.value) {
return '';
}
if (filter.type == FilterTypes.TrueFalse) {
if (filter.value == true) {
filter.valueName = ((_d = (_c = filter === null || filter === void 0 ? void 0 : filter.options) === null || _c === void 0 ? void 0 : _c.trueFalseOptions) === null || _d === void 0 ? void 0 : _d.trueLabel) ? filter.options.trueFalseOptions.trueLabel : 'Yes';
}
else {
filter.valueName = ((_f = (_e = filter === null || filter === void 0 ? void 0 : filter.options) === null || _e === void 0 ? void 0 : _e.trueFalseOptions) === null || _f === void 0 ? void 0 : _f.falseLabel) ? filter.options.trueFalseOptions.falseLabel : 'No';
}
return `${filter.valueName}`;
}
if (filter.type == FilterTypes.DateTime) {
if (!this.useJalaliDate) {
filter.valueName = moment(filter.value).format('YYYY/MM/DD');
}
else {
filter.valueName = moment(filter.value).format('jYYYY/jMM/jDD');
}
if (filter.conditionOperator == ConditionOperator.Between) {
const fromLabel = ((_h = (_g = filter === null || filter === void 0 ? void 0 : filter.options) === null || _g === void 0 ? void 0 : _g.dateTimeOptions) === null || _h === void 0 ? void 0 : _h.fromLabel) ? filter.options.dateTimeOptions.fromLabel : 'from';
const toLabel = ((_k = (_j = filter === null || filter === void 0 ? void 0 : filter.options) === null || _j === void 0 ? void 0 : _j.dateTimeOptions) === null || _k === void 0 ? void 0 : _k.toLabel) ? filter.options.dateTimeOptions.toLabel : 'to';
if (filter.valueTo) {
if (!this.useJalaliDate) {
filter.valueToName = moment(filter.valueTo).format('YYYY/MM/DD');
}
else {
filter.valueToName = moment(filter.valueTo).format('jYYYY/jMM/jDD');
}
}
else {
filter.valueToName = '...';
}
// filter.valueName = moment(filter.value).format('jYYYY/jMM/jDD');
return `${conditionName} ${fromLabel} ${filter.valueName} ${toLabel} ${filter.valueToName}`;
}
return `${conditionName} ${filter.valueName}`;
}
else {
if (((_m = (_l = filter.options) === null || _l === void 0 ? void 0 : _l.numberBoxOptions) === null || _m === void 0 ? void 0 : _m.isMoney) && filter.type == FilterTypes.Number) {
filter.valueName = this.moneyPipe.transform(filter.value);
filter.valueTo ? filter.valueToName = this.moneyPipe.transform(filter.valueTo) : '...';
}
else {
filter.valueName = filter.value;
filter.valueToName = filter.valueTo;
}
if (filter.conditionOperator == ConditionOperator.Between) {
const fromLabel = ((_p = (_o = filter === null || filter === void 0 ? void 0 : filter.options) === null || _o === void 0 ? void 0 : _o.numberBoxOptions) === null || _p === void 0 ? void 0 : _p.fromLabel) ? filter.options.numberBoxOptions.fromLabel : 'from';
const toLabel = ((_r = (_q = filter === null || filter === void 0 ? void 0 : filter.options) === null || _q === void 0 ? void 0 : _q.numberBoxOptions) === null || _r === void 0 ? void 0 : _r.toLabel) ? filter.options.numberBoxOptions.toLabel : 'to';
return `${conditionName} ${fromLabel} ${filter.valueName} ${toLabel} ${filter.valueToName ? filter.valueToName : '...'}`;
}
else {
return `${conditionName} ${filter.valueName}`;
}
}
}
}
toQueryString(queryObject) {
const parts = [];
Object.keys(queryObject).forEach((property) => {
const value = queryObject[property];
if (value !== undefined && value !== undefined) {
parts.push(encodeURIComponent(property) + '=' + encodeURIComponent(value));
}
});
return parts.join('&');
}
getFiltersInQueryString(filterBy) {
let obj = '';
filterBy.forEach((f, i) => {
Object.keys(f).forEach((prop) => {
const value = filterBy[i][prop];
if (Array.isArray(value)) {
const values = value;
let bb = 0;
values.forEach((b) => {
if (b !== undefined && b !== null) {
obj =
obj +
'&' +
encodeURIComponent('filters') +
`[${i}]` +
'.' +
`${encodeURIComponent(prop)}[${bb}]` +
'=' +
encodeURIComponent(b);
bb++;
}
});
}
else if (value !== undefined && value !== null) {
obj =
obj +
'&' +
encodeURIComponent('filters') +
`[${i}]` +
'.' +
encodeURIComponent(prop) +
'=' +
encodeURIComponent(value);
}
});
});
return obj;
}
getPageFilterInQueryString(queryObject) {
let obj;
if (queryObject && queryObject.filters) {
const filterBy = queryObject.filters.slice();
const query = new PageFilter();
Object.keys(queryObject).forEach((o) => {
// copy(slice) from queryObject
query[o] = queryObject[o];
});
delete query.filters;
obj = this.toQueryString(query);
obj += this.getFiltersInQueryString(filterBy);
}
return obj;
}
}
FiltersService.ɵprov = i0.ɵɵdefineInjectable({ factory: function FiltersService_Factory() { return new FiltersService(i0.ɵɵinject(i1.SeparateThreeCommaPipe)); }, token: FiltersService, providedIn: "root" });
FiltersService.decorators = [
{ type: Injectable, args: [{
providedIn: 'root'
},] }
];
FiltersService.ctorParameters = () => [
{ type: SeparateThreeCommaPipe }
];
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsdGVycy5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IkM6L1VzZXJzL0FsaXJlemEgTW9oYW1tYWRpL3NvdXJjZS9yZXBvcy9NeUxpYnJhcnkvQW5ndWxhci5MaWJyYXJ5L2xpYnMvcHJvamVjdHMvbmd4LW1hdC1jZGsvc3JjLyIsInNvdXJjZXMiOlsibGliL25neC1tYXQtZmlsdGVycy9maWx0ZXJzL2ZpbHRlcnMuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQ3pDLE9BQU8sS0FBSyxNQUFNLE1BQU0sZUFBZSxDQUFDO0FBQ3hDLE9BQU8sRUFBQyxpQkFBaUIsRUFBVSxXQUFXLEVBQUUsVUFBVSxFQUFDLE1BQU0sa0NBQWtDLENBQUM7QUFDcEcsT0FBTyxFQUFDLHNCQUFzQixFQUFDLE1BQU0sOENBQThDLENBQUM7OztBQUtwRixNQUFNLE9BQU8sY0FBYztJQUd6QixZQUFvQixTQUFpQztRQUFqQyxjQUFTLEdBQVQsU0FBUyxDQUF3QjtRQUZyRCxvQkFBZSxHQUFVLEVBQUUsQ0FBQztRQUtyQixrQkFBYSxHQUFHLEtBQUssQ0FBQztJQUY3QixDQUFDO0lBSUQsY0FBYyxDQUFDLE1BQWM7UUFDM0IsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsaUJBQWlCLENBQUMsQ0FBQzs7Z0JBRWpFLENBQUMsTUFBTSxDQUFDLElBQUksSUFBSSxXQUFXLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxJQUFJLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO0lBRTNHLENBQUM7SUFFTSxrQkFBa0I7UUFDdkIsTUFBTSxVQUFVLEdBQVUsRUFBRSxDQUFDO1FBQzdCLEtBQUssSUFBSSxV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QVUsU0FBQztnQkFDVixVQUFVLEVBQUUsTUFBTTthQUNuQjs7O1lBSk8sc0JBQXNCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtJbmplY3RhYmxlfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0ICogYXMgbW9tZW50IGZyb20gJ2phbGFsaS1tb21lbnQnO1xyXG5pbXBvcnQge0NvbmRpdGlvbk9wZXJhdG9yLCBGaWx0ZXIsIEZpbHRlclR5cGVzLCBQYWdlRmlsdGVyfSBmcm9tICcuL2ZpbHRlci1jb21wb25lbnRzL2ZpbHRlcnMtYmFzZSc7XHJcbmltcG9ydCB7U2VwYXJhdGVUaHJlZUNvbW1hUGlwZX0gZnJvbSBcIi4uLy4uL3NoYXJlZC9waXBlcy9zZXBhcmF0ZS10aHJlZS1jb21tYS5waXBlXCI7XHJcblxyXG5ASW5qZWN0YWJsZSh7XHJcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBGaWx0ZXJzU2VydmljZSB7XHJcbiAgY29uZGl0aW9uU291cmNlOiBhbnlbXSA9IFtdO1xyXG5cclxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIG1vbmV5UGlwZTogU2VwYXJhdGVUaHJlZUNvbW1hUGlwZSkge1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHVzZUphbGFsaURhdGUgPSBmYWxzZTtcclxuXHJcbiAgY2hlY2tIYXNGaWx0ZXIoZmlsdGVyOiBGaWx0ZXIpOiBib29sZWFuIHtcclxuICAgIHJldHVybiAoKHRoaXMubm9WYWx1ZUNvbmRpdGlvbnMuaW5jbHVkZXMoZmlsdGVyLmNvbmRpdGlvbk9wZXJhdG9yKSlcclxuICAgICAgfHxcclxuICAgICAgKGZpbHRlci50eXBlID09IEZpbHRlclR5cGVzLk11bHRpU2VsZWN0ID8gZmlsdGVyLnZhbHVlcyAmJiBmaWx0ZXIudmFsdWVzLmxlbmd0aCA+IDAgOiAhIWZpbHRlci52YWx1ZSkpO1xyXG5cclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXRDb25kaXRpb25Tb3VyY2UoKSB7XHJcbiAgICBjb25zdCBjb25kaXRpb25zOiBhbnlbXSA9IFtdO1xyXG4gICAgZm9yIChsZXQgZW51bU1lbWJlciBpbiBDb25kaXRpb25PcGVyYXRvcikge1xyXG4gICAgICBjb25zdCBjb25kaXRpb24gPSBDb25kaXRpb25PcGVyYXRvcltlbnVtTWVtYmVyXTtcclxuICAgICAgY29uc3QgZ2NwbGF0ID0gdGhpcy5nZXRDb25kaXRpb24oY29uZGl0aW9uLCBudWxsKTtcclxuICAgICAgaWYgKGdjcGxhdCkge1xyXG4gICAgICAgIGNvbmRpdGlvbnMucHVzaCh7XHJcbiAgICAgICAgICBrZXk6IENvbmRpdGlvbk9wZXJhdG9yW2VudW1NZW1iZXJdLFxyXG4gICAgICAgICAgbGFiZWw6IGdjcGxhdC5sYWJlbCxcclxuICAgICAgICAgIHR5cGVzOiBnY3BsYXQudHlwZXNcclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGNvbmRpdGlvbnM7XHJcbiAgfVxyXG5cclxuICBnZXREZWZhdWx0Q29uZGl0aW9uKGZpbHRlclR5cGU6IEZpbHRlclR5cGVzKTogQ29uZGl0aW9uT3BlcmF0b3Ige1xyXG4gICAgc3dpdGNoIChmaWx0ZXJUeXBlKSB7XHJcbiAgICAgIGNhc2UgRmlsdGVyVHlwZXMuTXVsdGlTZWxlY3Q6XHJcbiAgICAgIGNhc2UgRmlsdGVyVHlwZXMuTGlzdENoZWNrOiB7XHJcbiAgICAgICAgcmV0dXJuIENvbmRpdGlvbk9wZXJhdG9yLkluUmFuZ2U7XHJcbiAgICAgIH1cclxuICAgICAgY2FzZSBGaWx0ZXJUeXBlcy5UcnVlRmFsc2U6XHJcbiAgICAgIGNhc2UgRmlsdGVyVHlwZXMuU2luZ2xlU2VsZWN0OlxyXG4gICAgICBjYXNlIEZpbHRlclR5cGVzLk51bWJlcjoge1xyXG4gICAgICAgIHJldHVybiBDb25kaXRpb25PcGVyYXRvci5FcXVhbDtcclxuICAgICAgfVxyXG4gICAgICBjYXNlIEZpbHRlclR5cGVzLlRleHRCb3g6IHtcclxuICAgICAgICByZXR1cm4gQ29uZGl0aW9uT3BlcmF0b3IuQ29udGFpbnM7XHJcbiAgICAgIH1cclxuICAgICAgY2FzZSBGaWx0ZXJUeXBlcy5EYXRlVGltZToge1xyXG4gICAgICAgIHJldHVybiBDb25kaXRpb25PcGVyYXRvci5CZXR3ZWVuO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldENvbmRpdGlvbkxhYmVsKGNvbmRpdGlvbjogQ29uZGl0aW9uT3BlcmF0b3IsIGZpbHRlcjogRmlsdGVyKTogc3RyaW5nIHtcclxuICAgIGlmIChjb25kaXRpb24pIHtcclxuICAgICAgY29uc3QgY29uZGl0aW9uS2V5ID0gY29uZGl0aW9uWzBdLnRvTG93ZXJDYXNlKCkgKyBjb25kaXRpb24uc3Vic3RyaW5nKDEpO1xyXG4gICAgICBpZiAoZmlsdGVyPy5vcHRpb25zPy5jb25kaXRpb25PcHRpb25zKSB7XHJcbiAgICAgICAgcmV0dXJuIGZpbHRlcj8ub3B0aW9ucz8uY29uZGl0aW9uT3B0aW9uc1tjb25kaXRpb25LZXldXHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgcmV0dXJuIGNvbmRpdGlvbjtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIFwiXCI7XHJcblxyXG4gIH1cclxuXHJcblxyXG4gIHB1YmxpYyBnZXRDb25kaXRpb24oY29uZGl0aW9uOiBDb25kaXRpb25PcGVyYXRvciwgZmlsdGVyOiBGaWx0ZXIpOiB7IGxhYmVsOiBzdHJpbmcsIHR5cGVzOiBGaWx0ZXJUeXBlc1tdLCBoYXNWYWx1ZTogYm9vbGVhbiB9IHtcclxuICAgIGNvbmRpdGlvbiA9IGNvbmRpdGlvbiB8fCBmaWx0ZXIuY29uZGl0aW9uT3BlcmF0b3I7XHJcbiAgICBjb25zdCBsYWJlbCA9IHRoaXMuZ2V0Q29uZGl0aW9uTGFiZWwoY29uZGl0aW9uLCBmaWx0ZXIpO1xyXG4gICAgc3dpdGNoIChjb25kaXRpb24pIHtcclxuICAgICAgY2FzZSBDb25kaXRpb25PcGVyYXRvci5CZXR3ZWVuOlxyXG4gICAgICAgIHJldHVybiB7bGFiZWwsIHR5cGVzOiBbRmlsdGVyVHlwZXMuTnVtYmVyLCBGaWx0ZXJUeXBlcy5EYXRlVGltZV0sIGhhc1ZhbHVlOiB0cnVlfTtcclxuICAgICAgY2FzZSBDb25kaXRpb25PcGVyYXRvci5Db250YWluczpcclxuICAgICAgICByZXR1cm4ge2xhYmVsLCB0eXBlczogW0ZpbHRlclR5cGVzLlRleHRCb3hdLCBoYXNWYWx1ZTogdHJ1ZX07XHJcbiAgICAgIGNhc2UgQ29uZGl0aW9uT3BlcmF0b3IuRW5kV2l0aDpcclxuICAgICAgICByZXR1cm4ge2xhYmVsLCB0eXBlczogW0ZpbHRlclR5cGVzLlRleHRCb3hdLCBoYXNWYWx1ZTogdHJ1ZX07XHJcbiAgICAgIGNhc2UgQ29uZGl0aW9uT3BlcmF0b3IuRXF1YWw6XHJcbiAgICAgICAgcmV0dXJuIHtsYWJlbCwgdHlwZXM6IFtGaWx0ZXJUeXBlcy5OdW1iZXJdLCBoYXNWYWx1ZTogdHJ1ZX07XHJcbiAgICAgIGNhc2UgQ29uZGl0aW9uT3BlcmF0b3IuRXhhY3Q6XHJcbiAgICAgICAgcmV0dXJuIHtsYWJlbCwgdHlwZXM6IFtGaWx0ZXJUeXBlcy5EYXRlVGltZSwgRmlsdGVyVHlwZXMuVGV4dEJveF0sIGhhc1ZhbHVlOiB0cnVlfTtcclxuICAgICAgY2FzZSBDb25kaXRpb25PcGVyYXRvci5HcmVhdGVyVGhhbjpcclxuICAgICAgICByZXR1cm4ge2xhYmVsLCB0eXBlczogW0ZpbHRlclR5cGVzLk51bWJlciwgRmlsdGVyVHlwZXMuRGF0ZVRpbWVdLCBoYXNWYWx1ZTogdHJ1ZX07XHJcbiAgICAgIGNhc2UgQ29uZGl0aW9uT3BlcmF0b3IuR3JlYXRlclRoYW5PckVxdWFsOlxyXG4gICAgICAgIHJldHVybiB7bGFiZWwsIHR5cGVzOiBbRmlsdGVyVHlwZXMuTnVtYmVyLCBGaWx0ZXJUeXBlcy5EYXRlVGltZV0sIGhhc1ZhbHVlOiB0cnVlfTtcclxuICAgICAgY2FzZSBDb25kaXRpb25PcGVyYXRvci5MZXNzVGhhbjpcclxuICAgICAgICByZXR1cm4ge2xhYmVsLCB0eXBlczogW0ZpbHRlclR5cGVzLk51bWJlciwgRmlsdGVyVHlwZXMuRGF0ZVRpbWVdLCBoYXNWYWx1ZTogdHJ1ZX07XHJcbiAgICAgIGNhc2UgQ29uZGl0aW9uT3BlcmF0b3IuTGVzc1RoYW5PckVxdWFsOlxyXG4gICAgICAgIHJldHVybiB7bGFiZWwsIHR5cGVzOiBbRmlsdGVyVHlwZXMuTnVtYmVyLCBGaWx0ZXJUeXBlcy5EYXRlVGltZV0sIGhhc1ZhbHVlOiB0cnVlfTtcclxuICAgICAgY2FzZSBDb25kaXRpb25PcGVyYXRvci5Ob3RFcXVhbDpcclxuICAgICAgICByZXR1cm4ge2xhYmVsLCB0eXBlczogW0ZpbHRlclR5cGVzLk51bWJlciwgRmlsdGVyVHlwZXMuVGV4dEJveF0sIGhhc1ZhbHVlOiB0cnVlfTtcclxuICAgICAgY2FzZSBDb25kaXRpb25PcGVyYXRvci5TdGFydFdpdGg6XHJcbiAgICAgICAgcmV0dXJuIHtsYWJlbCwgdHlwZXM6IFtGaWx0ZXJUeXBlcy5UZXh0Qm94XSwgaGFzVmFsdWU6IHRydWV9O1xyXG4gICAgICBjYXNlIENvbmRpdGlvbk9wZXJhdG9yLkluUmFuZ2U6XHJcbiAgICAgICAgcmV0dXJuIHtsYWJlbCwgdHlwZXM6IFtGaWx0ZXJUeXBlcy5MaXN0Q2hlY2tdLCBoYXNWYWx1ZTogdHJ1ZX07XHJcbiAgICAgIGNhc2UgQ29uZGl0aW9uT3BlcmF0b3IuTGFzdE1vbnRoOlxyXG4gICAgICAgIHJldHVybiB7bGFiZWwsIHR5cGVzOiBbRmlsdGVyVHlwZXMuRGF0ZVRpbWVdLCBoYXNWYWx1ZTogZmFsc2V9O1xyXG4gICAgICBjYXNlIENvbmRpdGlvbk9wZXJhdG9yLkxhc3RXZWVrOlxyXG4gICAgICAgIHJldHVybiB7bGFiZWwsIHR5cGVzOiBbRmlsdGVyVHlwZXMuRGF0ZVRpbWVdLCBoYXNWYWx1ZTogZmFsc2V9O1xyXG4gICAgICBjYXNlIENvbmRpdGlvbk9wZXJhdG9yLkN1cnJlbnRNb250aDpcclxuICAgICAgICByZXR1cm4ge2xhYmVsLCB0eXBlczogW0ZpbHRlclR5cGVzLkRhdGVUaW1lXSwgaGFzVmFsdWU6IGZhbHNlfTtcclxuICAgICAgY2FzZSBDb25kaXRpb25PcGVyYXRvci5DdXJyZW50V2VlazpcclxuICAgICAgICByZXR1cm4ge2xhYmVsLCB0eXBlczogW0ZpbHRlclR5cGVzLkRhdGVUaW1lXSwgaGFzVmFsdWU6IGZhbHNlfTtcclxuICAgICAgY2FzZSBDb25kaXRpb25PcGVyYXRvci5DdXJyZW50WWVhcjpcclxuICAgICAgICByZXR1cm4ge2xhYmVsLCB0eXBlczogW0ZpbHRlclR5cGVzLkRhdGVUaW1lXSwgaGFzVmFsdWU6IGZhbHNlfTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldCBub1ZhbHVlQ29uZGl0aW9ucygpOiBDb25kaXRpb25PcGVyYXRvcltdIHtcclxuICAgIHJldHVybiBbXHJcbiAgICAgIENvbmRpdGlvbk9wZXJhdG9yLkxhc3RXZWVrLFxyXG4gICAgICBDb25kaXRpb25PcGVyYXRvci5MYXN0TW9udGgsXHJcbiAgICAgIENvbmRpdGlvbk9wZXJhdG9yLkN1cnJlbnRZZWFyLFxyXG4gICAgICBDb25kaXRpb25PcGVyYXRvci5DdXJyZW50V2VlayxcclxuICAgICAgQ29uZGl0aW9uT3BlcmF0b3IuQ3VycmVudE1vbnRoXHJcbiAgICBdO1xyXG4gIH1cclxuXHJcbiAgY2xlYXJGaWx0ZXIoZmlsdGVyOiBGaWx0ZXIpOiB2b2lkIHtcclxuICAgIGZpbHRlci5oYXNGaWx0ZXIgPSBmYWxzZTtcclxuICAgIGlmIChmaWx0ZXIudHlwZSA9PT0gRmlsdGVyVHlwZXMuRGF0ZVRpbWUpIHtcclxuICAgICAgZmlsdGVyLmNvbmRpdGlvbk9wZXJhdG9yID0gdGhpcy5nZXREZWZhdWx0Q29uZGl0aW9uKGZpbHRlci50eXBlKTtcclxuICAgIH1cclxuICAgIHN3aXRjaCAoZmlsdGVyLnR5cGUpIHtcclxuICAgICAgY2FzZSBGaWx0ZXJUeXBlcy5EYXRlVGltZTpcclxuICAgICAgY2FzZSBGaWx0ZXJUeXBlcy5OdW1iZXI6XHJcbiAgICAgIGNhc2UgRmlsdGVyVHlwZXMuVGV4dEJveDpcclxuICAgICAgY2FzZSBGaWx0ZXJUeXBlcy5TaW5nbGVTZWxlY3Q6XHJcbiAgICAgIGNhc2UgRmlsdGVyVHlwZXMuVHJ1ZUZhbHNlOiB7XHJcbiAgICAgICAgZmlsdGVyLnZhbHVlID0gbnVsbDtcclxuICAgICAgICBmaWx0ZXIudmFsdWVUbyA9IG51bGw7XHJcbiAgICAgIH1cclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSBGaWx0ZXJUeXBlcy5NdWx0aVNlbGVjdDpcclxuICAgICAgY2FzZSBGaWx0ZXJUeXBlcy5MaXN0Q2hlY2s6IHtcclxuICAgICAgICBmaWx0ZXIudmFsdWVzID0gbnVsbDtcclxuICAgICAgfVxyXG5cclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldERpc3BsYXlMYWJlbChmaWx0ZXI6IEZpbHRlciwgaGFzQ29uZGl0aW9uTmFtZTogYm9vbGVhbiA9IHRydWUpOiBzdHJpbmcge1xyXG4gICAgY29uc3QgY29uZGl0aW9uID0gdGhpcy5nZXRDb25kaXRpb24obnVsbCwgZmlsdGVyKTtcclxuICAgIGlmICghY29uZGl0aW9uKSB7XHJcbiAgICAgIHJldHVybiAnICc7XHJcbiAgICB9XHJcblxyXG4gICAgZmlsdGVyLmNvbmRpdGlvbk5hbWUgPSBjb25kaXRpb24ubGFiZWw7XHJcbiAgICBpZiAodGhpcy5ub1ZhbHVlQ29uZGl0aW9ucy5pbmNsdWRlcyhmaWx0ZXIuY29uZGl0aW9uT3BlcmF0b3IpKSB7XHJcbiAgICAgIHJldHVybiBmaWx0ZXIuY29uZGl0aW9uTmFtZTtcclxuICAgIH1cclxuXHJcbiAgICBsZXQgY29uZGl0aW9uTmFtZSA9IGhhc0NvbmRpdGlvbk5hbWUgPyBmaWx0ZXIuY29uZGl0aW9uTmFtZSA6ICcnO1xyXG5cclxuICAgIGlmICghY29uZGl0aW9uLmhhc1ZhbHVlKSB7XHJcbiAgICAgIHJldHVybiBjb25kaXRpb25OYW1lO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChmaWx0ZXIudHlwZSA9PSBGaWx0ZXJUeXBlcy5NdWx0aVNlbGVjdCkge1xyXG4gICAgICBpZiAoIWZpbHRlci52YWx1ZXMpIHtcclxuICAgICAgICByZXR1cm4gJyc7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIGZpbHRlci52YWx1ZXMubWFwKHogPT4geltmaWx0ZXIub3B0aW9ucz8uc2VsZWN0Qm94T3B0aW9ucz8uZGlzcGxheU1lbWJlcl0pLmpvaW4oJyAsJyk7XHJcbiAgICB9IGVsc2UgaWYgKGZpbHRlci50eXBlID09IEZpbHRlclR5cGVzLlNpbmdsZVNlbGVjdCkge1xyXG4gICAgICBpZiAoIWZpbHRlci52YWx1ZSkge1xyXG4gICAgICAgIHJldHVybiAnJztcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gZmlsdGVyLnZhbHVlW2ZpbHRlci5vcHRpb25zPy5zZWxlY3RCb3hPcHRpb25zPy5kaXNwbGF5TWVtYmVyXTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGlmICghZmlsdGVyLnZhbHVlKSB7XHJcbiAgICAgICAgcmV0dXJuICcnO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChmaWx0ZXIudHlwZSA9PSBGaWx0ZXJUeXBlcy5UcnVlRmFsc2UpIHtcclxuICAgICAgICBpZiAoZmlsdGVyLnZhbHVlID09IHRydWUpIHtcclxuICAgICAgICAgIGZpbHRlci52YWx1ZU5hbWUgPSBmaWx0ZXI/Lm9wdGlvbnM/LnRydWVGYWxzZU9wdGlvbnM/LnRydWVMYWJlbCA/IGZpbHRlci5vcHRpb25zLnRydWVGYWxzZU9wdGlvbnMudHJ1ZUxhYmVsIDogJ1llcyc7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGZpbHRlci52YWx1ZU5hbWUgPSBmaWx0ZXI/Lm9wdGlvbnM/LnRydWVGYWxzZU9wdGlvbnM/LmZhbHNlTGFiZWwgPyBmaWx0ZXIub3B0aW9ucy50cnVlRmFsc2VPcHRpb25zLmZhbHNlTGFiZWwgOiAnTm8nO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gYCR7ZmlsdGVyLnZhbHVlTmFtZX1gO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAoZmlsdGVyLnR5cGUgPT0gRmlsdGVyVHlwZXMuRGF0ZVRpbWUpIHtcclxuICAgICAgICBpZiAoIXRoaXMudXNlSmFsYWxpRGF0ZSkge1xyXG4gICAgICAgICAgZmlsdGVyLnZhbHVlTmFtZSA9IG1vbWVudChmaWx0ZXIudmFsdWUpLmZvcm1hdCgnWVlZWS9NTS9ERCcpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBmaWx0ZXIudmFsdWVOYW1lID0gbW9tZW50KGZpbHRlci52YWx1ZSkuZm9ybWF0KCdqWVlZWS9qTU0vakREJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChmaWx0ZXIuY29uZGl0aW9uT3BlcmF0b3IgPT0gQ29uZGl0aW9uT3BlcmF0b3IuQmV0d2Vlbikge1xyXG4gICAgICAgICAgY29uc3QgZnJvbUxhYmVsID0gKGZpbHRlcj8ub3B0aW9ucz8uZGF0ZVRpbWVPcHRpb25zPy5mcm9tTGFiZWwpID8gZmlsdGVyLm9wdGlvbnMuZGF0ZVRpbWVPcHRpb25zLmZyb21MYWJlbCA6ICdmcm9tJztcclxuICAgICAgICAgIGNvbnN0IHRvTGFiZWwgPSAoZmlsdGVyPy5vcHRpb25zPy5kYXRlVGltZU9wdGlvbnM/LnRvTGFiZWwpID8gZmlsdGVyLm9wdGlvbnMuZGF0ZVRpbWVPcHRpb25zLnRvTGFiZWwgOiAndG8nO1xyXG4gICAgICAgICAgaWYgKGZpbHRlci52YWx1ZVRvKSB7XHJcbiAgICAgICAgICAgIGlmICghdGhpcy51c2VKYWxhbGlEYXRlKSB7XHJcbiAgICAgICAgICAgICAgZmlsdGVyLnZhbHVlVG9OYW1lID0gbW9tZW50KGZpbHRlci52YWx1ZVRvKS5mb3JtYXQoJ1lZWVkvTU0vREQnKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICBmaWx0ZXIudmFsdWVUb05hbWUgPSBtb21lbnQoZmlsdGVyLnZhbHVlVG8pLmZvcm1hdCgnallZWVkvak1NL2pERCcpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBmaWx0ZXIudmFsdWVUb05hbWUgPSAnLi4uJztcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIC8vIGZpbHRlci52YWx1ZU5hbWUgPSBtb21lbnQoZmlsdGVyLnZhbHVlKS5mb3JtYXQoJ2pZWVlZL2pNTS9qREQnKTtcclxuICAgICAgICAgIHJldHVybiBgJHtjb25kaXRpb25OYW1lfSAke2Zyb21MYWJlbH0gJHtmaWx0ZXIudmFsdWVOYW1lfSAke3RvTGFiZWx9ICR7ZmlsdGVyLnZhbHVlVG9OYW1lfWA7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBgJHtjb25kaXRpb25OYW1lfSAke2ZpbHRlci52YWx1ZU5hbWV9YDtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBpZiAoZmlsdGVyLm9wdGlvbnM/Lm51bWJlckJveE9wdGlvbnM/LmlzTW9uZXkgJiYgZmlsdGVyLnR5cGUgPT0gRmlsdGVyVHlwZXMuTnVtYmVyKSB7XHJcbiAgICAgICAgICBmaWx0ZXIudmFsdWVOYW1lID0gdGhpcy5tb25leVBpcGUudHJhbnNmb3JtKGZpbHRlci52YWx1ZSk7XHJcbiAgICAgICAgICBmaWx0ZXIudmFsdWVUbyA/IGZpbHRlci52YWx1ZVRvTmFtZSA9IHRoaXMubW9uZXlQaXBlLnRyYW5zZm9ybShmaWx0ZXIudmFsdWVUbykgOiAnLi4uJztcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgZmlsdGVyLnZhbHVlTmFtZSA9IGZpbHRlci52YWx1ZTtcclxuICAgICAgICAgIGZpbHRlci52YWx1ZVRvTmFtZSA9IGZpbHRlci52YWx1ZVRvO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoZmlsdGVyLmNvbmRpdGlvbk9wZXJhdG9yID09IENvbmRpdGlvbk9wZXJhdG9yLkJldHdlZW4pIHtcclxuICAgICAgICAgIGNvbnN0IGZyb21MYWJlbCA9IChmaWx0ZXI/Lm9wdGlvbnM/Lm51bWJlckJveE9wdGlvbnM/LmZyb21MYWJlbCkgPyBmaWx0ZXIub3B0aW9ucy5udW1iZXJCb3hPcHRpb25zLmZyb21MYWJlbCA6ICdmcm9tJztcclxuICAgICAgICAgIGNvbnN0IHRvTGFiZWwgPSAoZmlsdGVyPy5vcHRpb25zPy5udW1iZXJCb3hPcHRpb25zPy50b0xhYmVsKSA/IGZpbHRlci5vcHRpb25zLm51bWJlckJveE9wdGlvbnMudG9MYWJlbCA6ICd0byc7XHJcblxyXG4gICAgICAgICAgcmV0dXJuIGAke2NvbmRpdGlvbk5hbWV9ICR7ZnJvbUxhYmVsfSAke2ZpbHRlci52YWx1ZU5hbWV9ICR7dG9MYWJlbH0gJHtmaWx0ZXIudmFsdWVUb05hbWUgPyBmaWx0ZXIudmFsdWVUb05hbWUgOiAnLi4uJ31gO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICByZXR1cm4gYCR7Y29uZGl0aW9uTmFtZX0gJHtmaWx0ZXIudmFsdWVOYW1lfWA7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHRvUXVlcnlTdHJpbmcocXVlcnlPYmplY3Q6IFBhZ2VGaWx0ZXIpOiBzdHJpbmcge1xyXG4gICAgY29uc3QgcGFydHMgPSBbXTtcclxuICAgIE9iamVjdC5rZXlzKHF1ZXJ5T2JqZWN0KS5mb3JFYWNoKChwcm9wZXJ0eSkgPT4ge1xyXG4gICAgICBjb25zdCB2YWx1ZSA9IHF1ZXJ5T2JqZWN0W3Byb3BlcnR5XTtcclxuICAgICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQgJiYgdmFsdWUgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgIHBhcnRzLnB1c2goXHJcbiAgICAgICAgICBlbmNvZGVVUklDb21wb25lbnQocHJvcGVydHkpICsgJz0nICsgZW5jb2RlVVJJQ29tcG9uZW50KHZhbHVlKVxyXG4gICAgICAgICk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIHBhcnRzLmpvaW4oJyYnKTtcclxuICB9XHJcblxyXG4gIGdldEZpbHRlcnNJblF1ZXJ5U3RyaW5nKGZpbHRlckJ5OiBGaWx0ZXJbXSk6IHN0cmluZyB7XHJcbiAgICBsZXQgb2JqID0gJyc7XHJcbiAgICBmaWx0ZXJCeS5mb3JFYWNoKChmLCBpKSA9PiB7XHJcbiAgICAgIE9iamVjdC5rZXlzKGYpLmZvckVhY2goKHByb3ApID0+IHtcclxuICAgICAgICBjb25zdCB2YWx1ZSA9IGZpbHRlckJ5W2ldW3Byb3BdO1xyXG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xyXG4gICAgICAgICAgY29uc3QgdmFsdWVzID0gdmFsdWUgYXMgc3RyaW5nW107XHJcbiAgICAgICAgICBsZXQgYmIgPSAwO1xyXG4gICAgICAgICAgdmFsdWVzLmZvckVhY2goKGIpID0+IHtcclxuICAgICAgICAgICAgaWYgKGIgIT09IHVuZGVmaW5lZCAmJiBiICE9PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgb2JqID1cclxuICAgICAgICAgICAgICAgIG9iaiArXHJcbiAgICAgICAgICAgICAgICAnJicgK1xyXG4gICAgICAgICAgICAgICAgZW5jb2RlVVJJQ29tcG9uZW50KCdmaWx0ZXJzJykgK1xyXG4gICAgICAgICAgICAgICAgYFske2l9XWAgK1xyXG4gICAgICAgICAgICAgICAgJy4nICtcclxuICAgICAgICAgICAgICAgIGAke2VuY29kZVVSSUNvbXBvbmVudChwcm9wKX1bJHtiYn1dYCArXHJcbiAgICAgICAgICAgICAgICAnPScgK1xyXG4gICAgICAgICAgICAgICAgZW5jb2RlVVJJQ29tcG9uZW50KGIpO1xyXG4gICAgICAgICAgICAgIGJiKys7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0gZWxzZSBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCAmJiB2YWx1ZSAhPT0gbnVsbCkge1xyXG4gICAgICAgICAgb2JqID1cclxuICAgICAgICAgICAgb2JqICtcclxuICAgICAgICAgICAgJyYnICtcclxuICAgICAgICAgICAgZW5jb2RlVVJJQ29tcG9uZW50KCdmaWx0ZXJzJykgK1xyXG4gICAgICAgICAgICBgWyR7aX1dYCArXHJcbiAgICAgICAgICAgICcuJyArXHJcbiAgICAgICAgICAgIGVuY29kZVVSSUNvbXBvbmVudChwcm9wKSArXHJcbiAgICAgICAgICAgICc9JyArXHJcbiAgICAgICAgICAgIGVuY29kZVVSSUNvbXBvbmVudCh2YWx1ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIG9iajtcclxuICB9XHJcblxyXG4gIGdldFBhZ2VGaWx0ZXJJblF1ZXJ5U3RyaW5nKHF1ZXJ5T2JqZWN0OiBQYWdlRmlsdGVyKTogc3RyaW5nIHtcclxuICAgIGxldCBvYmo6IHN0cmluZztcclxuICAgIGlmIChxdWVyeU9iamVjdCAmJiBxdWVyeU9iamVjdC5maWx0ZXJzKSB7XHJcbiAgICAgIGNvbnN0IGZpbHRlckJ5ID0gcXVlcnlPYmplY3QuZmlsdGVycy5zbGljZSgpO1xyXG4gICAgICBjb25zdCBxdWVyeSA9IG5ldyBQYWdlRmlsdGVyKCk7XHJcbiAgICAgIE9iamVjdC5rZXlzKHF1ZXJ5T2JqZWN0KS5mb3JFYWNoKChvKSA9PiB7XHJcbiAgICAgICAgLy8gY29weShzbGljZSkgZnJvbSBxdWVyeU9iamVjdFxyXG4gICAgICAgIHF1ZXJ5W29dID0gcXVlcnlPYmplY3Rbb107XHJcbiAgICAgIH0pO1xyXG4gICAgICBkZWxldGUgcXVlcnkuZmlsdGVycztcclxuICAgICAgb2JqID0gdGhpcy50b1F1ZXJ5U3RyaW5nKHF1ZXJ5KTtcclxuICAgICAgb2JqICs9IHRoaXMuZ2V0RmlsdGVyc0luUXVlcnlTdHJpbmcoZmlsdGVyQnkpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIG9iajtcclxuICB9XHJcbn1cclxuIl19