UNPKG

@firestitch/filter

Version:
578 lines 46.7 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import * as tslib_1 from "tslib"; import { isEmpty, list as arrayList } from '@firestitch/common'; import { simpleFormat } from '@firestitch/date'; import { Alias, Model } from 'tsmodels'; import { Subject } from 'rxjs'; import { format, isDate, isValid } from 'date-fns'; import { clone, isObject } from 'lodash-es'; import { FsFilterConfigItem, ItemType } from './filter-item'; /** @type {?} */ export var SORT_BY_FIELD = 'system_sort_by'; /** @type {?} */ export var SORT_DIRECTION_FIELD = 'system_sort_direction'; var FsFilterConfig = /** @class */ (function (_super) { tslib_1.__extends(FsFilterConfig, _super); function FsFilterConfig(data) { if (data === void 0) { data = {}; } var _this = _super.call(this) || this; _this.load = true; _this.persist = false; _this.inline = false; _this.autofocus = false; _this.chips = false; _this.sortValues = null; _this.sort = null; _this.sortDirection = null; _this.queryParam = false; _this.namespace = 'filter'; _this.items = []; _this.sortByItem = null; _this.sortDirectionItem = null; _this.searchInput = null; _this.singleTextFilter = false; _this._filtersNames = []; _this._destroy$ = new Subject(); _this._fromJSON(data); return _this; } Object.defineProperty(FsFilterConfig.prototype, "destroy$", { get: /** * @return {?} */ function () { return this._destroy$.asObservable(); }, enumerable: true, configurable: true }); /** * @param {?} items * @param {?} route * @param {?} persists * @return {?} */ FsFilterConfig.prototype.initItems = /** * @param {?} items * @param {?} route * @param {?} persists * @return {?} */ function (items, route, persists) { var _this = this; if (items && Array.isArray(items)) { this.items = items.map((/** * @param {?} item * @return {?} */ function (item) { if (item && item.name && _this._filtersNames.indexOf(item.name) === -1) { _this._filtersNames.push(item.name); return new FsFilterConfigItem(item, _this, route, persists); } else { throw Error('Filter init error. Items name must be unique.'); } })); // After all the items have been created and added to this.items initalize the values // This is important if some item default values are dependent on others this.items.map((/** * @param {?} item * @return {?} */ function (item) { item.initValues(); return item; })); } this.initSorting(route, persists); this.searchInput = this.items.find((/** * @param {?} item * @return {?} */ function (item) { return item.type === ItemType.Text; })); if (this.items.length === 1 && this.items[0].type === ItemType.Text) { this.singleTextFilter = true; } }; /** * @param {?} name * @return {?} */ FsFilterConfig.prototype.getItem = /** * @param {?} name * @return {?} */ function (name) { return this.items.find((/** * @param {?} item * @return {?} */ function (item) { return item.name === name; })); }; /** * @param {?} route * @param {?} persists * @return {?} */ FsFilterConfig.prototype.initSorting = /** * @param {?} route * @param {?} persists * @return {?} */ function (route, persists) { if (this.sortValues) { /** @type {?} */ var sortByItem = { name: SORT_BY_FIELD, type: ItemType.Select, label: 'Sort By', values: this.sortValues }; if (this.sort && this.sort.value) { sortByItem['default'] = this.sort.value; } this.sortByItem = new FsFilterConfigItem(sortByItem, this, route, persists); /** @type {?} */ var sortDirectionItem = { name: SORT_DIRECTION_FIELD, type: ItemType.Select, label: 'Sort Direction', values: [ { name: 'Ascending', value: 'asc' }, { name: 'Descending', value: 'desc' } ] }; if (this.sort && this.sort.direction) { sortDirectionItem['default'] = this.sort.direction; } this.sortDirectionItem = new FsFilterConfigItem(sortDirectionItem, this, route, persists); } }; /** * @return {?} */ FsFilterConfig.prototype.updateModelValues = /** * @return {?} */ function () { this.items.forEach((/** * @param {?} filter * @return {?} */ function (filter) { filter.model = clone(filter.tmpModel); })); if (this.sortByItem) { this.sortByItem.model = clone(this.sortByItem.tmpModel); } if (this.sortDirectionItem) { this.sortDirectionItem.model = clone(this.sortDirectionItem.tmpModel); } }; /** * @param {?=} opts * @return {?} */ FsFilterConfig.prototype.gets = /** * @param {?=} opts * @return {?} */ function (opts) { if (opts === void 0) { opts = {}; } var e_1, _a; /** @type {?} */ var query = {}; try { for (var _b = tslib_1.__values(this.items), _c = _b.next(); !_c.done; _c = _b.next()) { var filter = _c.value; /** @type {?} */ var value = clone(filter.model); if (filter.type == ItemType.Select) { if (filter.multiple) { if (filter.isolate) { if (!Array.isArray(filter.model) || !filter.model.length) { value = arrayList(filter.values, 'value'); } } if (filter.model && filter.model.indexOf('__all') > -1) { value = null; } } else { if (filter.isolate) { if (filter.model == '__all') { value = arrayList(filter.values, 'value'); } } else { if (filter.model == '__all') { value = null; } } } } else if (filter.type == ItemType.AutoCompleteChips || filter.type === ItemType.Chips) { if (Array.isArray(filter.model) && filter.model.length && !opts.expand) { value = arrayList(filter.model, 'value'); } } else if (filter.type == ItemType.Checkbox) { value = filter.model ? filter.checked : filter.unchecked; } // @TODO if (isEmpty(value, { zero: true })) { continue; } if (filter.type == ItemType.Date || filter.type == ItemType.DateTime) { if (value && isValid(value) && isDate(value)) { value = simpleFormat(value); } } else if (filter.type == ItemType.DateRange || filter.type == ItemType.DateTimeRange) { /** @type {?} */ var from = value.from; /** @type {?} */ var to = value.to; value = {}; if (from) { value.from = format(from, 'yyyy-MM-dd\THH:mm:ssxxxxx'); } if (to) { value.to = format(to, 'yyyy-MM-dd\THH:mm:ssxxxxx'); } } else if (filter.type == ItemType.AutoComplete) { if (isEmpty(filter.model.value, { zero: true })) { continue; } value = opts.expand ? filter.model : filter.model.value; } if (isObject(filter.names) && opts.names !== false) { for (var key in filter.names) { if (value[filter.names[key]]) { query[key] = value[filter.names[key]]; } } } else { query[filter.name] = value; } } } catch (e_1_1) { e_1 = { error: e_1_1 }; } finally { try { if (_c && !_c.done && (_a = _b.return)) _a.call(_b); } finally { if (e_1) throw e_1.error; } } if (opts.flatten) { for (var name_1 in query) { if (Array.isArray(query[name_1])) { query[name_1] = query[name_1].join(','); } } } return query; }; /** * @return {?} */ FsFilterConfig.prototype.getSort = /** * @return {?} */ function () { /** @type {?} */ var sortBy = this.getSortByValue(); sortBy = sortBy === '__all' ? null : sortBy; /** @type {?} */ var sortDirection = this.getSortDirectionValue(); sortDirection = sortDirection === '__all' ? null : sortDirection; return { value: sortBy, direction: sortDirection, }; }; /** * @return {?} */ FsFilterConfig.prototype.getSortByValue = /** * @return {?} */ function () { return this.sortByItem ? this.sortByItem.model : null; }; /** * @return {?} */ FsFilterConfig.prototype.getSortDirectionValue = /** * @return {?} */ function () { return this.sortDirectionItem ? this.sortDirectionItem.model : null; }; /** * @param {?} sort * @return {?} */ FsFilterConfig.prototype.updateSort = /** * @param {?} sort * @return {?} */ function (sort) { if (sort.sortBy) { this.sortByItem.model = sort.sortBy; } if (sort.sortDirection) { this.sortDirectionItem.model = sort.sortDirection; } }; /** * @return {?} */ FsFilterConfig.prototype.getFilledItems = /** * @return {?} */ function () { var _this = this; return this.items.reduce((/** * @param {?} acc * @param {?} filter * @return {?} */ function (acc, filter) { switch (filter.type) { case ItemType.Select: { /** @type {?} */ var multipleIsoldated = filter.multiple && filter.isolate && Array.isArray(filter.model) && !!filter.model.length && filter.model.indexOf('__all') === -1; /** @type {?} */ var multipleHasSelectedValues = filter.multiple && Array.isArray(filter.model) && filter.model.length && filter.model.indexOf('__all') === -1; /** @type {?} */ var selectedValues = !filter.multiple && filter.model && filter.model !== '__all'; if (multipleIsoldated || multipleHasSelectedValues || selectedValues) { acc.push(filter); } } break; case ItemType.AutoCompleteChips: { if (Array.isArray(filter.model) && filter.model.length) { acc.push(filter); } } break; case ItemType.Checkbox: { if (filter.model) { acc.push(filter); } } break; case ItemType.DateRange: case ItemType.DateTimeRange: { if (filter.model.from || filter.model.to) { acc.push(filter); } } break; default: { if (filter.model && filter !== _this.searchInput && (!isEmpty(filter.model, { zero: true }) || !isEmpty(filter.model.value, { zero: true }))) { acc.push(filter); } } } return acc; }), []); }; /** * @return {?} */ FsFilterConfig.prototype.filtersClear = /** * @return {?} */ function () { var e_2, _a; try { for (var _b = tslib_1.__values(this.items), _c = _b.next(); !_c.done; _c = _b.next()) { var filter = _c.value; filter.clear(); } } catch (e_2_1) { e_2 = { error: e_2_1 }; } finally { try { if (_c && !_c.done && (_a = _b.return)) _a.call(_b); } finally { if (e_2) throw e_2.error; } } if (this.sortByItem) { if (this.sort) { this.sortByItem.model = this.sort.value; } else { this.sortByItem.clear(); } } if (this.sortDirectionItem) { if (this.sort) { this.sortDirectionItem.model = this.sort.direction; } else { this.sortDirectionItem.clear(); } } }; /** * @return {?} */ FsFilterConfig.prototype.loadValuesForPendingItems = /** * @return {?} */ function () { this.items .filter((/** * @param {?} item * @return {?} */ function (item) { return item.hasPendingValues; })) .forEach((/** * @param {?} item * @return {?} */ function (item) { return item.loadValues(false); })); }; /** * @return {?} */ FsFilterConfig.prototype.destroy = /** * @return {?} */ function () { this._destroy$.next(); this._destroy$.complete(); }; tslib_1.__decorate([ Alias(), tslib_1.__metadata("design:type", Object) ], FsFilterConfig.prototype, "load", void 0); tslib_1.__decorate([ Alias(), tslib_1.__metadata("design:type", Object) ], FsFilterConfig.prototype, "persist", void 0); tslib_1.__decorate([ Alias(), tslib_1.__metadata("design:type", Object) ], FsFilterConfig.prototype, "inline", void 0); tslib_1.__decorate([ Alias(), tslib_1.__metadata("design:type", Object) ], FsFilterConfig.prototype, "autofocus", void 0); tslib_1.__decorate([ Alias(), tslib_1.__metadata("design:type", Object) ], FsFilterConfig.prototype, "chips", void 0); tslib_1.__decorate([ Alias('sorts'), tslib_1.__metadata("design:type", Array) ], FsFilterConfig.prototype, "sortValues", void 0); tslib_1.__decorate([ Alias(), tslib_1.__metadata("design:type", Object) ], FsFilterConfig.prototype, "sort", void 0); tslib_1.__decorate([ Alias(), tslib_1.__metadata("design:type", Object) ], FsFilterConfig.prototype, "sortDirection", void 0); tslib_1.__decorate([ Alias(), tslib_1.__metadata("design:type", Object) ], FsFilterConfig.prototype, "queryParam", void 0); tslib_1.__decorate([ Alias(), tslib_1.__metadata("design:type", Object) ], FsFilterConfig.prototype, "namespace", void 0); tslib_1.__decorate([ Alias(), tslib_1.__metadata("design:type", Function) ], FsFilterConfig.prototype, "init", void 0); tslib_1.__decorate([ Alias(), tslib_1.__metadata("design:type", Function) ], FsFilterConfig.prototype, "change", void 0); tslib_1.__decorate([ Alias(), tslib_1.__metadata("design:type", Function) ], FsFilterConfig.prototype, "reload", void 0); tslib_1.__decorate([ Alias(), tslib_1.__metadata("design:type", Function) ], FsFilterConfig.prototype, "sortChange", void 0); return FsFilterConfig; }(Model)); export { FsFilterConfig }; if (false) { /** @type {?} */ FsFilterConfig.prototype.load; /** @type {?} */ FsFilterConfig.prototype.persist; /** @type {?} */ FsFilterConfig.prototype.inline; /** @type {?} */ FsFilterConfig.prototype.autofocus; /** @type {?} */ FsFilterConfig.prototype.chips; /** @type {?} */ FsFilterConfig.prototype.sortValues; /** @type {?} */ FsFilterConfig.prototype.sort; /** @type {?} */ FsFilterConfig.prototype.sortDirection; /** @type {?} */ FsFilterConfig.prototype.queryParam; /** @type {?} */ FsFilterConfig.prototype.namespace; /** @type {?} */ FsFilterConfig.prototype.init; /** @type {?} */ FsFilterConfig.prototype.change; /** @type {?} */ FsFilterConfig.prototype.reload; /** @type {?} */ FsFilterConfig.prototype.sortChange; /** @type {?} */ FsFilterConfig.prototype.items; /** @type {?} */ FsFilterConfig.prototype.sortByItem; /** @type {?} */ FsFilterConfig.prototype.sortDirectionItem; /** @type {?} */ FsFilterConfig.prototype.searchInput; /** @type {?} */ FsFilterConfig.prototype.singleTextFilter; /** * @type {?} * @private */ FsFilterConfig.prototype._filtersNames; /** * @type {?} * @private */ FsFilterConfig.prototype._destroy$; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsdGVyLWNvbmZpZy5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0BmaXJlc3RpdGNoL2ZpbHRlci8iLCJzb3VyY2VzIjpbImFwcC9tb2RlbHMvZmlsdGVyLWNvbmZpZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLE9BQU8sRUFBRSxPQUFPLEVBQUUsSUFBSSxJQUFJLFNBQVMsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ2hFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNoRCxPQUFPLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUV4QyxPQUFPLEVBQWMsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRTNDLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUNuRCxPQUFPLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUU1QyxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDOztBQUc3RCxNQUFNLEtBQU8sYUFBYSxHQUFHLGdCQUFnQjs7QUFDN0MsTUFBTSxLQUFPLG9CQUFvQixHQUFHLHVCQUF1QjtBQUUzRDtJQUFvQywwQ0FBSztJQTBCdkMsd0JBQVksSUFBYztRQUFkLHFCQUFBLEVBQUEsU0FBYztRQUExQixZQUNFLGlCQUFPLFNBR1I7UUE1QmUsVUFBSSxHQUFHLElBQUksQ0FBQztRQUNaLGFBQU8sR0FBUSxLQUFLLENBQUM7UUFDckIsWUFBTSxHQUFHLEtBQUssQ0FBQztRQUNmLGVBQVMsR0FBRyxLQUFLLENBQUM7UUFDbEIsV0FBSyxHQUFHLEtBQUssQ0FBQztRQUNQLGdCQUFVLEdBQVUsSUFBSSxDQUFDO1FBQ2hDLFVBQUksR0FBUyxJQUFJLENBQUM7UUFDbEIsbUJBQWEsR0FBRyxJQUFJLENBQUM7UUFDckIsZ0JBQVUsR0FBRyxLQUFLLENBQUM7UUFDbkIs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QUFDLFFBQVEsRUFBRSxDQUFDO0lBQzVCLENBQUM7SUE3VVE7UUFBUixLQUFLLEVBQUU7O2dEQUFvQjtJQUNuQjtRQUFSLEtBQUssRUFBRTs7bURBQTZCO0lBQzVCO1FBQVIsS0FBSyxFQUFFOztrREFBdUI7SUFDdEI7UUFBUixLQUFLLEVBQUU7O3FEQUEwQjtJQUN6QjtRQUFSLEtBQUssRUFBRTs7aURBQXNCO0lBQ2Q7UUFBZixLQUFLLENBQUMsT0FBTyxDQUFDOztzREFBaUM7SUFDdkM7UUFBUixLQUFLLEVBQUU7O2dEQUEwQjtJQUN6QjtRQUFSLEtBQUssRUFBRTs7eURBQTZCO0lBQzVCO1FBQVIsS0FBSyxFQUFFOztzREFBMkI7SUFDMUI7UUFBUixLQUFLLEVBQUU7O3FEQUE2QjtJQUM1QjtRQUFSLEtBQUssRUFBRTs7Z0RBQXVCO0lBQ3RCO1FBQVIsS0FBSyxFQUFFOztrREFBeUI7SUFDeEI7UUFBUixLQUFLLEVBQUU7O2tEQUF5QjtJQUN4QjtRQUFSLEtBQUssRUFBRTs7c0RBQTZCO0lBaVV2QyxxQkFBQztDQUFBLEFBaFZELENBQW9DLEtBQUssR0FnVnhDO1NBaFZZLGNBQWM7OztJQUV6Qiw4QkFBNEI7O0lBQzVCLGlDQUFxQzs7SUFDckMsZ0NBQStCOztJQUMvQixtQ0FBa0M7O0lBQ2xDLCtCQUE4Qjs7SUFDOUIsb0NBQWdEOztJQUNoRCw4QkFBa0M7O0lBQ2xDLHVDQUFxQzs7SUFDckMsb0NBQW1DOztJQUNuQyxtQ0FBcUM7O0lBQ3JDLDhCQUErQjs7SUFDL0IsZ0NBQWlDOztJQUNqQyxnQ0FBaUM7O0lBQ2pDLG9DQUFxQzs7SUFFckMsK0JBQXdDOztJQUN4QyxvQ0FBNkM7O0lBQzdDLDJDQUFvRDs7SUFDcEQscUNBQTBCOztJQUMxQiwwQ0FBZ0M7Ozs7O0lBRWhDLHVDQUEyQjs7Ozs7SUFDM0IsbUNBQXdDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgaXNFbXB0eSwgbGlzdCBhcyBhcnJheUxpc3QgfSBmcm9tICdAZmlyZXN0aXRjaC9jb21tb24nO1xuaW1wb3J0IHsgc2ltcGxlRm9ybWF0IH0gZnJvbSAnQGZpcmVzdGl0Y2gvZGF0ZSc7XG5pbXBvcnQgeyBBbGlhcywgTW9kZWwgfSBmcm9tICd0c21vZGVscyc7XG5cbmltcG9ydCB7IE9ic2VydmFibGUsIFN1YmplY3QgfSBmcm9tICdyeGpzJztcblxuaW1wb3J0IHsgZm9ybWF0LCBpc0RhdGUsIGlzVmFsaWQgfSBmcm9tICdkYXRlLWZucyc7XG5pbXBvcnQgeyBjbG9uZSwgaXNPYmplY3QgfSBmcm9tICdsb2Rhc2gtZXMnO1xuXG5pbXBvcnQgeyBGc0ZpbHRlckNvbmZpZ0l0ZW0sIEl0ZW1UeXBlIH0gZnJvbSAnLi9maWx0ZXItaXRlbSc7XG5pbXBvcnQgeyBDaGFuZ2VGbiwgRmlsdGVyU29ydCwgU29ydCB9IGZyb20gJy4uL2ludGVyZmFjZXMvY29uZmlnLmludGVyZmFjZSc7XG5cbmV4cG9ydCBjb25zdCBTT1JUX0JZX0ZJRUxEID0gJ3N5c3RlbV9zb3J0X2J5JztcbmV4cG9ydCBjb25zdCBTT1JUX0RJUkVDVElPTl9GSUVMRCA9ICdzeXN0ZW1fc29ydF9kaXJlY3Rpb24nO1xuXG5leHBvcnQgY2xhc3MgRnNGaWx0ZXJDb25maWcgZXh0ZW5kcyBNb2RlbCB7XG5cbiAgQEFsaWFzKCkgcHVibGljIGxvYWQgPSB0cnVlO1xuICBAQWxpYXMoKSBwdWJsaWMgcGVyc2lzdDogYW55ID0gZmFsc2U7XG4gIEBBbGlhcygpIHB1YmxpYyBpbmxpbmUgPSBmYWxzZTtcbiAgQEFsaWFzKCkgcHVibGljIGF1dG9mb2N1cyA9IGZhbHNlO1xuICBAQWxpYXMoKSBwdWJsaWMgY2hpcHMgPSBmYWxzZTtcbiAgQEFsaWFzKCdzb3J0cycpIHB1YmxpYyBzb3J0VmFsdWVzOiBhbnlbXSA9IG51bGw7XG4gIEBBbGlhcygpIHB1YmxpYyBzb3J0OiBTb3J0ID0gbnVsbDtcbiAgQEFsaWFzKCkgcHVibGljIHNvcnREaXJlY3Rpb24gPSBudWxsO1xuICBAQWxpYXMoKSBwdWJsaWMgcXVlcnlQYXJhbSA9IGZhbHNlO1xuICBAQWxpYXMoKSBwdWJsaWMgbmFtZXNwYWNlID0gJ2ZpbHRlcic7XG4gIEBBbGlhcygpIHB1YmxpYyBpbml0OiBDaGFuZ2VGbjtcbiAgQEFsaWFzKCkgcHVibGljIGNoYW5nZTogQ2hhbmdlRm47XG4gIEBBbGlhcygpIHB1YmxpYyByZWxvYWQ6IENoYW5nZUZuO1xuICBAQWxpYXMoKSBwdWJsaWMgc29ydENoYW5nZTogQ2hhbmdlRm47XG5cbiAgcHVibGljIGl0ZW1zOiBGc0ZpbHRlckNvbmZpZ0l0ZW1bXSA9IFtdO1xuICBwdWJsaWMgc29ydEJ5SXRlbTogRnNGaWx0ZXJDb25maWdJdGVtID0gbnVsbDtcbiAgcHVibGljIHNvcnREaXJlY3Rpb25JdGVtOiBGc0ZpbHRlckNvbmZpZ0l0ZW0gPSBudWxsO1xuICBwdWJsaWMgc2VhcmNoSW5wdXQgPSBudWxsO1xuICBwdWJsaWMgc2luZ2xlVGV4dEZpbHRlciA9IGZhbHNlO1xuXG4gIHByaXZhdGUgX2ZpbHRlcnNOYW1lcyA9IFtdO1xuICBwcml2YXRlIF9kZXN0cm95JCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG5cbiAgY29uc3RydWN0b3IoZGF0YTogYW55ID0ge30pIHtcbiAgICBzdXBlcigpO1xuXG4gICAgdGhpcy5fZnJvbUpTT04oZGF0YSk7XG4gIH1cblxuICBnZXQgZGVzdHJveSQoKTogT2JzZXJ2YWJsZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuX2Rlc3Ryb3kkLmFzT2JzZXJ2YWJsZSgpO1xuICB9XG5cbiAgcHVibGljIGluaXRJdGVtcyhpdGVtcywgcm91dGUsIHBlcnNpc3RzKSB7XG4gICAgaWYgKGl0ZW1zICYmIEFycmF5LmlzQXJyYXkoaXRlbXMpKSB7XG5cbiAgICAgIHRoaXMuaXRlbXMgPSBpdGVtcy5tYXAoKGl0ZW0pID0+IHtcblxuICAgICAgICBpZiAoaXRlbSAmJiBpdGVtLm5hbWUgJiYgdGhpcy5fZmlsdGVyc05hbWVzLmluZGV4T2YoaXRlbS5uYW1lKSA9PT0gLTEpIHtcbiAgICAgICAgICB0aGlzLl9maWx0ZXJzTmFtZXMucHVzaChpdGVtLm5hbWUpO1xuXG4gICAgICAgICAgcmV0dXJuIG5ldyBGc0ZpbHRlckNvbmZpZ0l0ZW0oaXRlbSwgdGhpcywgcm91dGUsIHBlcnNpc3RzKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRocm93IEVycm9yKCdGaWx0ZXIgaW5pdCBlcnJvci4gSXRlbXMgbmFtZSBtdXN0IGJlIHVuaXF1ZS4nKVxuICAgICAgICB9XG4gICAgICB9KTtcblxuXG4gICAgICAvLyBBZnRlciBhbGwgdGhlIGl0ZW1zIGhhdmUgYmVlbiBjcmVhdGVkIGFuZCBhZGRlZCB0byB0aGlzLml0ZW1zIGluaXRhbGl6ZSB0aGUgdmFsdWVzXG4gICAgICAvLyBUaGlzIGlzIGltcG9ydGFudCBpZiBzb21lIGl0ZW0gZGVmYXVsdCB2YWx1ZXMgYXJlIGRlcGVuZGVudCBvbiBvdGhlcnNcbiAgICAgIHRoaXMuaXRlbXMubWFwKChpdGVtKSA9PiB7XG4gICAgICAgIGl0ZW0uaW5pdFZhbHVlcygpO1xuICAgICAgICByZXR1cm4gaXRlbTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHRoaXMuaW5pdFNvcnRpbmcocm91dGUsIHBlcnNpc3RzKTtcblxuICAgIHRoaXMuc2VhcmNoSW5wdXQgPSB0aGlzLml0ZW1zLmZpbmQoKGl0ZW0pID0+IGl0ZW0udHlwZSA9PT0gSXRlbVR5cGUuVGV4dCk7XG5cbiAgICBpZiAodGhpcy5pdGVtcy5sZW5ndGggPT09IDEgJiYgdGhpcy5pdGVtc1swXS50eXBlID09PSBJdGVtVHlwZS5UZXh0KSB7XG4gICAgICB0aGlzLnNpbmdsZVRleHRGaWx0ZXIgPSB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBnZXRJdGVtKG5hbWUpIHtcbiAgICByZXR1cm4gdGhpcy5pdGVtcy5maW5kKChpdGVtKSA9PiBpdGVtLm5hbWUgPT09IG5hbWUpO1xuICB9XG5cbiAgcHVibGljIGluaXRTb3J0aW5nKHJvdXRlLCBwZXJzaXN0cykge1xuICAgIGlmICh0aGlzLnNvcnRWYWx1ZXMpIHtcbiAgICAgIGNvbnN0IHNvcnRCeUl0ZW0gPSB7XG4gICAgICAgIG5hbWU6IFNPUlRfQllfRklFTEQsXG4gICAgICAgIHR5cGU6IEl0ZW1UeXBlLlNlbGVjdCxcbiAgICAgICAgbGFiZWw6ICdTb3J0IEJ5JyxcbiAgICAgICAgdmFsdWVzOiB0aGlzLnNvcnRWYWx1ZXNcbiAgICAgIH07XG5cblxuICAgICAgaWYgKHRoaXMuc29ydCAmJiB0aGlzLnNvcnQudmFsdWUpIHtcbiAgICAgICAgc29ydEJ5SXRlbVsnZGVmYXVsdCddID0gdGhpcy5zb3J0LnZhbHVlO1xuICAgICAgfVxuXG4gICAgICB0aGlzLnNvcnRCeUl0ZW0gPSBuZXcgRnNGaWx0ZXJDb25maWdJdGVtKHNvcnRCeUl0ZW0sIHRoaXMsIHJvdXRlLCBwZXJzaXN0cyk7XG5cbiAgICAgIGNvbnN0IHNvcnREaXJlY3Rpb25JdGVtID0ge1xuICAgICAgICBuYW1lOiBTT1JUX0RJUkVDVElPTl9GSUVMRCxcbiAgICAgICAgdHlwZTogSXRlbVR5cGUuU2VsZWN0LFxuICAgICAgICBsYWJlbDogJ1NvcnQgRGlyZWN0aW9uJyxcbiAgICAgICAgdmFsdWVzOiBbXG4gICAgICAgICAgeyBuYW1lOiAnQXNjZW5kaW5nJywgdmFsdWU6ICdhc2MnIH0sXG4gICAgICAgICAgeyBuYW1lOiAnRGVzY2VuZGluZycsIHZhbHVlOiAnZGVzYycgfVxuICAgICAgICBdXG4gICAgICB9O1xuXG4gICAgICBpZiAodGhpcy5zb3J0ICYmIHRoaXMuc29ydC5kaXJlY3Rpb24pIHtcbiAgICAgICAgc29ydERpcmVjdGlvbkl0ZW1bJ2RlZmF1bHQnXSA9IHRoaXMuc29ydC5kaXJlY3Rpb247XG4gICAgICB9XG5cbiAgICAgIHRoaXMuc29ydERpcmVjdGlvbkl0ZW0gPSBuZXcgRnNGaWx0ZXJDb25maWdJdGVtKHNvcnREaXJlY3Rpb25JdGVtLCB0aGlzLCByb3V0ZSwgcGVyc2lzdHMpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyB1cGRhdGVNb2RlbFZhbHVlcygpIHtcbiAgICB0aGlzLml0ZW1zLmZvckVhY2goKGZpbHRlcikgPT4ge1xuICAgICAgZmlsdGVyLm1vZGVsID0gY2xvbmUoZmlsdGVyLnRtcE1vZGVsKTtcbiAgICB9KTtcblxuICAgIGlmICh0aGlzLnNvcnRCeUl0ZW0pIHtcbiAgICAgIHRoaXMuc29ydEJ5SXRlbS5tb2RlbCA9IGNsb25lKHRoaXMuc29ydEJ5SXRlbS50bXBNb2RlbCk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuc29ydERpcmVjdGlvbkl0ZW0pIHtcbiAgICAgIHRoaXMuc29ydERpcmVjdGlvbkl0ZW0ubW9kZWwgPSBjbG9uZSh0aGlzLnNvcnREaXJlY3Rpb25JdGVtLnRtcE1vZGVsKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgZ2V0cyhvcHRzOiBhbnkgPSB7fSkge1xuXG4gICAgY29uc3QgcXVlcnkgPSB7fTtcblxuICAgIGZvciAoY29uc3QgZmlsdGVyIG9mIHRoaXMuaXRlbXMpIHtcbiAgICAgIGxldCB2YWx1ZSA9IGNsb25lKGZpbHRlci5tb2RlbCk7XG5cbiAgICAgIGlmIChmaWx0ZXIudHlwZSA9PSBJdGVtVHlwZS5TZWxlY3QpIHtcblxuICAgICAgICBpZiAoZmlsdGVyLm11bHRpcGxlKSB7XG5cbiAgICAgICAgICBpZiAoZmlsdGVyLmlzb2xhdGUpIHtcbiAgICAgICAgICAgIGlmICghQXJyYXkuaXNBcnJheShmaWx0ZXIubW9kZWwpIHx8ICFmaWx0ZXIubW9kZWwubGVuZ3RoKSB7XG4gICAgICAgICAgICAgIHZhbHVlID0gYXJyYXlMaXN0KGZpbHRlci52YWx1ZXMsICd2YWx1ZScpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChmaWx0ZXIubW9kZWwgJiYgZmlsdGVyLm1vZGVsLmluZGV4T2YoJ19fYWxsJykgPiAtMSkge1xuICAgICAgICAgICAgdmFsdWUgPSBudWxsO1xuICAgICAgICAgIH1cblxuICAgICAgICB9IGVsc2Uge1xuXG4gICAgICAgICAgaWYgKGZpbHRlci5pc29sYXRlKSB7XG4gICAgICAgICAgICBpZiAoZmlsdGVyLm1vZGVsID09ICdfX2FsbCcpIHtcbiAgICAgICAgICAgICAgdmFsdWUgPSBhcnJheUxpc3QoZmlsdGVyLnZhbHVlcywgJ3ZhbHVlJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmIChmaWx0ZXIubW9kZWwgPT0gJ19fYWxsJykge1xuICAgICAgICAgICAgICB2YWx1ZSA9IG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGZpbHRlci50eXBlID09IEl0ZW1UeXBlLkF1dG9Db21wbGV0ZUNoaXBzIHx8IGZpbHRlci50eXBlID09PSBJdGVtVHlwZS5DaGlwcykge1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShmaWx0ZXIubW9kZWwpICYmIGZpbHRlci5tb2RlbC5sZW5ndGggJiYgIW9wdHMuZXhwYW5kKSB7XG4gICAgICAgICAgdmFsdWUgPSBhcnJheUxpc3QoZmlsdGVyLm1vZGVsLCAndmFsdWUnKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChmaWx0ZXIudHlwZSA9PSBJdGVtVHlwZS5DaGVja2JveCkge1xuICAgICAgICB2YWx1ZSA9IGZpbHRlci5tb2RlbCA/IGZpbHRlci5jaGVja2VkIDogZmlsdGVyLnVuY2hlY2tlZDtcbiAgICAgIH1cblxuICAgICAgLy8gQFRPRE9cbiAgICAgIGlmIChpc0VtcHR5KHZhbHVlLCB7IHplcm86IHRydWUgfSkpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChmaWx0ZXIudHlwZSA9PSBJdGVtVHlwZS5EYXRlIHx8IGZpbHRlci50eXBlID09IEl0ZW1UeXBlLkRhdGVUaW1lKSB7XG5cbiAgICAgICAgaWYgKHZhbHVlICYmIGlzVmFsaWQodmFsdWUpICYmIGlzRGF0ZSh2YWx1ZSkpIHtcbiAgICAgICAgICB2YWx1ZSA9IHNpbXBsZUZvcm1hdCh2YWx1ZSk7XG4gICAgICAgIH1cblxuICAgICAgfSBlbHNlIGlmIChmaWx0ZXIudHlwZSA9PSBJdGVtVHlwZS5EYXRlUmFuZ2UgfHwgZmlsdGVyLnR5cGUgPT0gSXRlbVR5cGUuRGF0ZVRpbWVSYW5nZSkge1xuXG4gICAgICAgIGNvbnN0IGZyb20gPSB2YWx1ZS5mcm9tO1xuICAgICAgICBjb25zdCB0byA9IHZhbHVlLnRvO1xuXG4gICAgICAgIHZhbHVlID0ge307XG4gICAgICAgIGlmIChmcm9tKSB7XG4gICAgICAgICAgdmFsdWUuZnJvbSA9IGZvcm1hdChmcm9tLCAneXl5eS1NTS1kZFxcVEhIOm1tOnNzeHh4eHgnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0bykge1xuICAgICAgICAgIHZhbHVlLnRvID0gZm9ybWF0KHRvLCAneXl5eS1NTS1kZFxcVEhIOm1tOnNzeHh4eHgnKTtcbiAgICAgICAgfVxuXG4gICAgICB9IGVsc2UgaWYgKGZpbHRlci50eXBlID09IEl0ZW1UeXBlLkF1dG9Db21wbGV0ZSkge1xuXG4gICAgICAgIGlmIChpc0VtcHR5KGZpbHRlci5tb2RlbC52YWx1ZSwge3plcm86IHRydWV9KSkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFsdWUgPSBvcHRzLmV4cGFuZCA/IGZpbHRlci5tb2RlbCA6IGZpbHRlci5tb2RlbC52YWx1ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKGlzT2JqZWN0KGZpbHRlci5uYW1lcykgJiYgb3B0cy5uYW1lcyAhPT0gZmFsc2UpIHtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gZmlsdGVyLm5hbWVzKSB7XG4gICAgICAgICAgaWYgKHZhbHVlW2ZpbHRlci5uYW1lc1trZXldXSkge1xuICAgICAgICAgICAgcXVlcnlba2V5XSA9IHZhbHVlW2ZpbHRlci5uYW1lc1trZXldXTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHF1ZXJ5W2ZpbHRlci5uYW1lXSA9IHZhbHVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChvcHRzLmZsYXR0ZW4pIHtcbiAgICAgIGZvciAoY29uc3QgbmFtZSBpbiBxdWVyeSkge1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShxdWVyeVtuYW1lXSkpIHtcbiAgICAgICAgICBxdWVyeVtuYW1lXSA9IHF1ZXJ5W25hbWVdLmpvaW4oJywnKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBxdWVyeTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRTb3J0KCk6IEZpbHRlclNvcnQgfCBudWxsIHtcbiAgICBsZXQgc29ydEJ5ID0gdGhpcy5nZXRTb3J0QnlWYWx1ZSgpO1xuICAgIHNvcnRCeSA9IHNvcnRCeSA9PT0gJ19fYWxsJyA/IG51bGwgOiBzb3J0Qnk7XG5cbiAgICBsZXQgc29ydERpcmVjdGlvbiA9IHRoaXMuZ2V0U29ydERpcmVjdGlvblZhbHVlKCk7XG4gICAgc29ydERpcmVjdGlvbiA9IHNvcnREaXJlY3Rpb24gPT09ICdfX2FsbCcgPyBudWxsIDogc29ydERpcmVjdGlvbjtcblxuICAgIHJldHVybiB7XG4gICAgICB2YWx1ZTogc29ydEJ5LFxuICAgICAgZGlyZWN0aW9uOiBzb3J0RGlyZWN0aW9uLFxuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBnZXRTb3J0QnlWYWx1ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5zb3J0QnlJdGVtID8gdGhpcy5zb3J0QnlJdGVtLm1vZGVsIDogbnVsbDtcbiAgfVxuXG4gIHB1YmxpYyBnZXRTb3J0RGlyZWN0aW9uVmFsdWUoKSB7XG4gICAgcmV0dXJuIHRoaXMuc29ydERpcmVjdGlvbkl0ZW0gPyB0aGlzLnNvcnREaXJlY3Rpb25JdGVtLm1vZGVsIDogbnVsbDtcbiAgfVxuXG4gIHB1YmxpYyB1cGRhdGVTb3J0KHNvcnQpIHtcbiAgICBpZiAoc29ydC5zb3J0QnkpIHtcbiAgICAgIHRoaXMuc29ydEJ5SXRlbS5tb2RlbCA9IHNvcnQuc29ydEJ5O1xuICAgIH1cblxuICAgIGlmIChzb3J0LnNvcnREaXJlY3Rpb24pIHtcbiAgICAgIHRoaXMuc29ydERpcmVjdGlvbkl0ZW0ubW9kZWwgPSBzb3J0LnNvcnREaXJlY3Rpb247XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGdldEZpbGxlZEl0ZW1zKCkge1xuICAgIHJldHVybiB0aGlzLml0ZW1zLnJlZHVjZSgoYWNjLCBmaWx0ZXIpID0+IHtcblxuICAgICAgc3dpdGNoIChmaWx0ZXIudHlwZSkge1xuICAgICAgICBjYXNlIEl0ZW1UeXBlLlNlbGVjdDoge1xuICAgICAgICAgIGNvbnN0IG11bHRpcGxlSXNvbGRhdGVkID0gZmlsdGVyLm11bHRpcGxlXG4gICAgICAgICAgICAmJiBmaWx0ZXIuaXNvbGF0ZVxuICAgICAgICAgICAgJiYgQXJyYXkuaXNBcnJheShmaWx0ZXIubW9kZWwpXG4gICAgICAgICAgICAmJiAhIWZpbHRlci5tb2RlbC5sZW5ndGhcbiAgICAgICAgICAgICYmIGZpbHRlci5tb2RlbC5pbmRleE9mKCdfX2FsbCcpID09PSAtMTtcblxuICAgICAgICAgIGNvbnN0IG11bHRpcGxlSGFzU2VsZWN0ZWRWYWx1ZXMgPSBmaWx0ZXIubXVsdGlwbGVcbiAgICAgICAgICAgICYmIEFycmF5LmlzQXJyYXkoZmlsdGVyLm1vZGVsKVxuICAgICAgICAgICAgJiYgZmlsdGVyLm1vZGVsLmxlbmd0aFxuICAgICAgICAgICAgJiYgZmlsdGVyLm1vZGVsLmluZGV4T2YoJ19fYWxsJykgPT09IC0xO1xuXG4gICAgICAgICAgY29uc3Qgc2VsZWN0ZWRWYWx1ZXMgPSAhZmlsdGVyLm11bHRpcGxlICYmIGZpbHRlci5tb2RlbCAmJiBmaWx0ZXIubW9kZWwgIT09ICdfX2FsbCc7XG5cbiAgICAgICAgICBpZiAobXVsdGlwbGVJc29sZGF0ZWQgfHwgbXVsdGlwbGVIYXNTZWxlY3RlZFZhbHVlcyB8fCBzZWxlY3RlZFZhbHVlcykge1xuICAgICAgICAgICAgYWNjLnB1c2goZmlsdGVyKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gYnJlYWs7XG5cbiAgICAgICAgY2FzZSBJdGVtVHlwZS5BdXRvQ29tcGxldGVDaGlwczoge1xuICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGZpbHRlci5tb2RlbCkgJiYgZmlsdGVyLm1vZGVsLmxlbmd0aCkge1xuICAgICAgICAgICAgYWNjLnB1c2goZmlsdGVyKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gYnJlYWs7XG5cbiAgICAgICAgY2FzZSBJdGVtVHlwZS5DaGVja2JveDoge1xuICAgICAgICAgIGlmIChmaWx0ZXIubW9kZWwpIHtcbiAgICAgICAgICAgIGFjYy5wdXNoKGZpbHRlcik7XG4gICAgICAgICAgfVxuICAgICAgICB9IGJyZWFrO1xuXG4gICAgICAgIGNhc2UgSXRlbVR5cGUuRGF0ZVJhbmdlOiBjYXNlIEl0ZW1UeXBlLkRhdGVUaW1lUmFuZ2U6IHtcbiAgICAgICAgICBpZiAoZmlsdGVyLm1vZGVsLmZyb20gfHwgZmlsdGVyLm1vZGVsLnRvKSB7XG4gICAgICAgICAgICBhY2MucHVzaChmaWx0ZXIpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBicmVhaztcblxuICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgaWYgKGZpbHRlci5tb2RlbCAmJlxuICAgICAgICAgICAgZmlsdGVyICE9PSB0aGlzLnNlYXJjaElucHV0ICYmXG4gICAgICAgICAgICAoIWlzRW1wdHkoZmlsdGVyLm1vZGVsLCB7emVybzogdHJ1ZX0pIHx8ICFpc0VtcHR5KGZpbHRlci5tb2RlbC52YWx1ZSwge3plcm86IHRydWV9KSlcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIGFjYy5wdXNoKGZpbHRlcik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGFjYztcbiAgICB9LCBbXSk7XG4gIH1cblxuICBwdWJsaWMgZmlsdGVyc0NsZWFyKCkge1xuICAgIGZvciAoY29uc3QgZmlsdGVyIG9mIHRoaXMuaXRlbXMpIHtcbiAgICAgIGZpbHRlci5jbGVhcigpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnNvcnRCeUl0ZW0pIHtcbiAgICAgIGlmICh0aGlzLnNvcnQpIHtcbiAgICAgICAgdGhpcy5zb3J0QnlJdGVtLm1vZGVsID0gdGhpcy5zb3J0LnZhbHVlXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnNvcnRCeUl0ZW0uY2xlYXIoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodGhpcy5zb3J0RGlyZWN0aW9uSXRlbSkge1xuICAgICAgaWYgKHRoaXMuc29ydCkge1xuICAgICAgICB0aGlzLnNvcnREaXJlY3Rpb25JdGVtLm1vZGVsID0gdGhpcy5zb3J0LmRpcmVjdGlvblxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5zb3J0RGlyZWN0aW9uSXRlbS5jbGVhcigpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBsb2FkVmFsdWVzRm9yUGVuZGluZ0l0ZW1zKCkge1xuICAgIHRoaXMuaXRlbXNcbiAgICAgIC5maWx0ZXIoKGl0ZW0pID0+IGl0ZW0uaGFzUGVuZGluZ1ZhbHVlcylcbiAgICAgIC5mb3JFYWNoKChpdGVtKSA9PiBpdGVtLmxvYWRWYWx1ZXMoZmFsc2UpKTtcbiAgfVxuXG4gIHB1YmxpYyBkZXN0cm95KCkge1xuICAgIHRoaXMuX2Rlc3Ryb3kkLm5leHQoKTtcbiAgICB0aGlzLl9kZXN0cm95JC5jb21wbGV0ZSgpO1xuICB9XG59XG4iXX0=