UNPKG

@firestitch/filter

Version:
730 lines 59.9 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import * as tslib_1 from "tslib"; import { toUTC } from '@firestitch/date'; import { Alias, Model } from 'tsmodels'; import { take, takeUntil } from 'rxjs/operators'; import { isObservable } from 'rxjs/internal/util/isObservable'; import { isFunction, isObject, toString, clone } from 'lodash-es'; import { isDate, isValid, parse } from 'date-fns'; /** @enum {string} */ const ItemType = { Text: 'text', Select: 'select', Range: 'range', Date: 'date', DateTime: 'datetime', DateRange: 'daterange', DateTimeRange: 'datetimerange', AutoComplete: 'autocomplete', AutoCompleteChips: 'autocompletechips', Checkbox: 'checkbox', Chips: 'chips', }; export { ItemType }; export class FsFilterConfigItem extends Model { /** * @param {?=} data * @param {?=} _config * @param {?=} _route * @param {?=} _persists */ constructor(data = {}, _config, _route, _persists) { super(); this._config = _config; this._route = _route; this._persists = _persists; this.initialLoading = false; this.valueChanged = false; this._pendingValues = false; this._fromJSON(data); } /** * @return {?} */ get hasPendingValues() { return this._pendingValues; } /** * @return {?} */ get model() { return this._model; } /** * @param {?} val * @return {?} */ set model(val) { this._model = val; this._tmpModel = val; this.checkIfValueChanged(); } /** * @return {?} */ get tmpModel() { return this._tmpModel; } /** * @param {?} val * @return {?} */ set tmpModel(val) { this._tmpModel = val; } /** * @param {?} data * @return {?} */ _fromJSON(data) { super._fromJSON(data); if (this.name && isObject(this.name)) { this.names = this.name; this.name = Object.keys(this.names).join('-'); } if (this._config.persist) { /** @type {?} */ const persisted = this._persists[this._config.persist.name].data; if (persisted[this.name]) { /** @type {?} */ let value = persisted[this.name]; if (value) { if (this.type === ItemType.DateRange || this.type === ItemType.DateTimeRange) { value.from = value.from ? toUTC(value.from) : null; value.to = value.to ? toUTC(value.to) : null; } else if (this.type === ItemType.Date || this.type === ItemType.DateTime) { if (!isDate(value) || !isValid(value)) { value = parse(value, 'yyyy-MM-dd\'T\'HH:mm:ssxxxxx', new Date()); } } else if (this.type === ItemType.Checkbox && this.checked !== undefined) { value = value == this.checked; } else if (this.type === ItemType.Select && this.multiple) { value = clone(value); } } this.model = value; } } this.applyDataFromQuery(); if (isFunction(data.values) && this.type !== ItemType.AutoComplete && this.type !== ItemType.AutoCompleteChips) { this.values = data.values(); if (isObservable(this.values)) { this._pendingValues = true; } else { /** @type {?} */ const values = Array.isArray(this.values) ? ((/** @type {?} */ (this.values))).slice() : this.values; this.sanitizeItem(values); } } else { /** @type {?} */ const values = Array.isArray(data.values) ? data.values.slice() : data.values; this.sanitizeItem(values); } } /** * @param {?} values * @return {?} */ sanitizeItem(values) { switch (this.type) { case ItemType.Text: { //????? } break; case ItemType.Select: { this.sanitizeSelectItem(values); } break; case ItemType.Chips: { this.sanitizeChipsItem(values); } break; case ItemType.Range: { this.sanitizeRange(); } break; case ItemType.Checkbox: { this.sanitizeCheckbox(); } break; } if (this.model === undefined) { if (this.type == 'checkbox') { this.model = this.checked == this.defaultValue; } else { this.model = this.defaultValue; } } if (this.model === undefined) { if (this.type == 'checkbox') { this.model = false; } else if (this.type == 'select') { if (this.multiple) { if (!Array.isArray(this.defaultValue)) { this.model = []; } } else { if (this.defaultValue === undefined) { this.model = '__all'; } } } else if (this.type == ItemType.AutoCompleteChips || this.type == ItemType.Chips) { this.model = []; } } } /** * @param {?} values * @return {?} */ sanitizeSelectItem(values) { this.values = values; this.groups = null; // let data = []; // if (this.nested) { // // generate a list of values from objects that have not been nested. // if (!this.multiple) { // data.push({value: '__all', name: 'All', depth: 0}); // } // // Array.prototype.push.apply(data, this.walkSelectNestedValues(filter, null, this.values)); // } else { // // data = this.walkSelectValues(filter, this.values); // } // this.values = data; if (this.isolate) { for (const index in this.values) { if (this.values.hasOwnProperty(index)) { if (!this.values[index]) { continue; } if (this.values[index].value == this.isolate.value) { this.values.splice(index, 1); } } } if (Array.isArray(this.model)) { if (this.model.length == this.values.length) { this.model = null; this.isolate.enabled = false; } else if (this.model[0] == this.isolate.value) { this.isolate.enabled = true; } } } } /** * @param {?} values * @return {?} */ sanitizeChipsItem(values) { this.values = values; this.groups = null; // if (this.isolate) { // for (const index in this.values) { // if (this.values.hasOwnProperty(index)) { // if (!this.values[index]) { // continue; // } // // if (this.values[index].value == this.isolate.value) { // this.values.splice(index, 1); // } // } // } // // if (Array.isArray(this.model)) { // if (this.model.length == this.values.length) { // this.model = null; // this.isolate.enabled = false; // } else if (this.model[0] == this.isolate.value) { // this.isolate.enabled = true; // } // } // } // // for (const value of this.values) { // // if (value.group) { // // if (!this.groups) { // this.groups = {}; // } // // if (!this.groups[value.group]) { // this.groups[value.group] = []; // } // // this.groups[value.group].push(value); // } // } } /** * @return {?} */ sanitizeCheckbox() { this.checked = this.checked ? toString(this.checked) : true; this.unchecked = this.unchecked ? toString(this.unchecked) : false; this.defaultValue = this.defaultValue === undefined ? this.unchecked : toString(this.defaultValue); } /** * @return {?} */ applyDataFromQuery() { if (this.query) { /** @type {?} */ let query = this._route.snapshot.queryParams[this.query]; if (query !== undefined) { query += ''; this.model = query; if (!query.length) { this.model = undefined; } else if (this.type == 'select' && this.multiple) { this.model = this.model.split(','); } else if (this.type == 'daterange' || this.type == 'datetimerange') { /** @type {?} */ const parts = this.model.split(','); this.model = { from: parts[0], to: parts[1] }; } else if (this.type == 'range') { /** @type {?} */ const parts = this.model.split(','); this.model = { min: parts[0], max: parts[1] }; } } } } /** * @param {?} value * @return {?} */ updateValue(value) { switch (this.type) { case ItemType.Select: { if (value === '__all' || value === null) { this.model = value; return; } /** @type {?} */ let valueExists = null; /** @type {?} */ let isolated = null; if (this.multiple) { isolated = this.isolate && Array.isArray(value) && value[0] === this.isolate.value; valueExists = Array.isArray(this.values) ? value.every((/** * @param {?} val * @return {?} */ (val) => { return this.values.find((/** * @param {?} valueItem * @return {?} */ (valueItem) => valueItem.value === val)); })) || isolated : false; } else { valueExists = Array.isArray(this.values) ? this.values.some((/** * @param {?} valueItem * @return {?} */ (valueItem) => valueItem.value === value)) : false; } if (valueExists) { this.model = value; if (this.isolate) { this.isolate.enabled = isolated; } return; } } break; case ItemType.Range: { this.model = isObject(value) ? Object.assign({}, this.model, value) : {}; } break; case ItemType.Chips: { this.model = []; } break; case ItemType.Date: case ItemType.DateTime: { this.model = value; } break; case ItemType.AutoCompleteChips: { if (Array.isArray(value)) { this.model.push(...value); } else if (isObject(value)) { this.model.push(value); } else { this.model = []; } } break; default: { this.model = value; } } } /** * @return {?} */ loadRemoteValues() { if (!this.initialLoading && this._pendingValues) { this.initialLoading = true; this.values .pipe(take(1), takeUntil(this._config.destroy$)) .subscribe((/** * @param {?} values * @return {?} */ (values) => { this._pendingValues = false; this.sanitizeItem(values); this.initialLoading = false; })); } } /** * @return {?} */ clear() { this.valueChanged = false; this.model = undefined; switch (this.type) { case ItemType.AutoComplete: { this.model = null; this.tmpModel = null; this.search = ''; } break; case ItemType.AutoCompleteChips: case ItemType.Chips: { this.model = []; this.tmpModel = []; this.search = ''; } break; case ItemType.Checkbox: { this.model = false; this.tmpModel = false; } break; case ItemType.Select: { if (this.multiple) { this.model = []; this.tmpModel = []; } else { this.model = Array.isArray(this.values) && this.values.some((/** * @param {?} val * @return {?} */ (val) => val.value === '__all')) ? '__all' : null; this.tmpModel = this.model; } if (this.isolate) { this.isolate.enabled = false; } } break; case ItemType.Range: { this.model = {}; this.tmpModel = {}; } break; case ItemType.Text: { this.model = ''; this.tmpModel = ''; } break; case ItemType.Date: case ItemType.DateTime: { this.model = null; this.tmpModel = null; } break; } } /** * @return {?} */ checkIfValueChanged() { switch (this.type) { case ItemType.AutoCompleteChips: { this.valueChanged = this.model && this.model.length; } break; case ItemType.Checkbox: { this.valueChanged = this.model && this.model !== false; } break; case ItemType.Select: { if (this.multiple) { this.valueChanged = this.model && this.model.length; } else { /** @type {?} */ const hasAllOption = Array.isArray(this.values) && this.values.some((/** * @param {?} val * @return {?} */ (val) => val.value === '__all')); if (hasAllOption && this.model && this.model !== '__all') { this.valueChanged = true; } else { this.valueChanged = !!this.model; } } } break; case ItemType.Range: { if (this.model && Object.keys(this.model).length > 0) { this.valueChanged = true; } } break; case ItemType.Text: { this.valueChanged = this.model && this.model !== ''; } break; case ItemType.AutoComplete: case ItemType.Date: case ItemType.DateTime: { this.valueChanged = !!this.model; } break; default: { this.valueChanged = false; } } } /** * @private * @return {?} */ sanitizeRange() { if (!this.placeholder) { this.placeholder = ['Min', 'Max']; } if (!this.model) { this.model = {}; } } } tslib_1.__decorate([ Alias(), tslib_1.__metadata("design:type", String) ], FsFilterConfigItem.prototype, "name", void 0); tslib_1.__decorate([ Alias(), tslib_1.__metadata("design:type", String) ], FsFilterConfigItem.prototype, "type", void 0); tslib_1.__decorate([ Alias(), tslib_1.__metadata("design:type", String) ], FsFilterConfigItem.prototype, "label", void 0); tslib_1.__decorate([ Alias(), tslib_1.__metadata("design:type", String) ], FsFilterConfigItem.prototype, "chipLabel", void 0); tslib_1.__decorate([ Alias(), tslib_1.__metadata("design:type", String) ], FsFilterConfigItem.prototype, "children", void 0); tslib_1.__decorate([ Alias(), tslib_1.__metadata("design:type", Boolean) ], FsFilterConfigItem.prototype, "multiple", void 0); tslib_1.__decorate([ Alias(), tslib_1.__metadata("design:type", Object) ], FsFilterConfigItem.prototype, "groups", void 0); tslib_1.__decorate([ Alias(), tslib_1.__metadata("design:type", Boolean) ], FsFilterConfigItem.prototype, "wait", void 0); tslib_1.__decorate([ Alias(), tslib_1.__metadata("design:type", String) ], FsFilterConfigItem.prototype, "query", void 0); tslib_1.__decorate([ Alias(), tslib_1.__metadata("design:type", Object) ], FsFilterConfigItem.prototype, "values", void 0); tslib_1.__decorate([ Alias(), tslib_1.__metadata("design:type", Object) ], FsFilterConfigItem.prototype, "values$", void 0); tslib_1.__decorate([ Alias(), tslib_1.__metadata("design:type", Object) ], FsFilterConfigItem.prototype, "selectedValue", void 0); tslib_1.__decorate([ Alias(), tslib_1.__metadata("design:type", Object) ], FsFilterConfigItem.prototype, "isolate", void 0); tslib_1.__decorate([ Alias(), tslib_1.__metadata("design:type", Object) ], FsFilterConfigItem.prototype, "names", void 0); tslib_1.__decorate([ Alias(), tslib_1.__metadata("design:type", Boolean) ], FsFilterConfigItem.prototype, "primary", void 0); tslib_1.__decorate([ Alias(), tslib_1.__metadata("design:type", Object) ], FsFilterConfigItem.prototype, "search", void 0); tslib_1.__decorate([ Alias(), tslib_1.__metadata("design:type", Object) ], FsFilterConfigItem.prototype, "unchecked", void 0); tslib_1.__decorate([ Alias(), tslib_1.__metadata("design:type", Object) ], FsFilterConfigItem.prototype, "checked", void 0); tslib_1.__decorate([ Alias(), tslib_1.__metadata("design:type", Object) ], FsFilterConfigItem.prototype, "alias", void 0); tslib_1.__decorate([ Alias(), tslib_1.__metadata("design:type", Object) ], FsFilterConfigItem.prototype, "placeholder", void 0); tslib_1.__decorate([ Alias('default'), tslib_1.__metadata("design:type", Object) ], FsFilterConfigItem.prototype, "defaultValue", void 0); if (false) { /** @type {?} */ FsFilterConfigItem.prototype.name; /** @type {?} */ FsFilterConfigItem.prototype.type; /** @type {?} */ FsFilterConfigItem.prototype.label; /** @type {?} */ FsFilterConfigItem.prototype.chipLabel; /** @type {?} */ FsFilterConfigItem.prototype.children; /** @type {?} */ FsFilterConfigItem.prototype.multiple; /** @type {?} */ FsFilterConfigItem.prototype.groups; /** @type {?} */ FsFilterConfigItem.prototype.wait; /** @type {?} */ FsFilterConfigItem.prototype.query; /** @type {?} */ FsFilterConfigItem.prototype.values; /** @type {?} */ FsFilterConfigItem.prototype.values$; /** @type {?} */ FsFilterConfigItem.prototype.selectedValue; /** @type {?} */ FsFilterConfigItem.prototype.isolate; /** @type {?} */ FsFilterConfigItem.prototype.names; /** @type {?} */ FsFilterConfigItem.prototype.primary; /** @type {?} */ FsFilterConfigItem.prototype.search; /** @type {?} */ FsFilterConfigItem.prototype.unchecked; /** @type {?} */ FsFilterConfigItem.prototype.checked; /** @type {?} */ FsFilterConfigItem.prototype.alias; /** @type {?} */ FsFilterConfigItem.prototype.placeholder; /** @type {?} */ FsFilterConfigItem.prototype.defaultValue; /** @type {?} */ FsFilterConfigItem.prototype.initialLoading; /** @type {?} */ FsFilterConfigItem.prototype.valueChanged; /** * @type {?} * @private */ FsFilterConfigItem.prototype._model; /** * @type {?} * @private */ FsFilterConfigItem.prototype._tmpModel; /** * @type {?} * @private */ FsFilterConfigItem.prototype._pendingValues; /** * @type {?} * @private */ FsFilterConfigItem.prototype._config; /** * @type {?} * @private */ FsFilterConfigItem.prototype._route; /** * @type {?} * @private */ FsFilterConfigItem.prototype._persists; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsdGVyLWl0ZW0uanMiLCJzb3VyY2VSb290Ijoibmc6Ly9AZmlyZXN0aXRjaC9maWx0ZXIvIiwic291cmNlcyI6WyJhcHAvbW9kZWxzL2ZpbHRlci1pdGVtLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQ0EsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBRXpDLE9BQU8sRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBRXhDLE9BQU8sRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDakQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBRS9ELE9BQU8sRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDbEUsT0FBTyxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sVUFBVSxDQUFDOzs7SUFPaEQsTUFBa0IsTUFBTTtJQUN4QixRQUFrQixRQUFRO0lBQzFCLE9BQWtCLE9BQU87SUFDekIsTUFBa0IsTUFBTTtJQUN4QixVQUFrQixVQUFVO0lBQzVCLFdBQWtCLFdBQVc7SUFDN0IsZUFBa0IsZUFBZTtJQUNqQyxjQUFrQixjQUFjO0lBQ2hDLG1CQUFvQixtQkFBbUI7SUFDdkMsVUFBa0IsVUFBVTtJQUM1QixPQUFrQixPQUFPOzs7QUFHM0IsTUFBTSxPQUFPLGtCQUFtQixTQUFRLEtBQUs7Ozs7Ozs7SUErQjNDLFlBQVksT0FBZ0MsRUFBRSxFQUMxQixPQUF1QixFQUN2QixNQUFzQixFQUN0QixTQUFjO1FBQ2hDLEtBQUssRUFBRSxDQUFDO1FBSFUsWUFBTyxHQUFQLE9BQU8sQ0FBZ0I7UUFDdkIsV0FBTSxHQUFOLE1BQU0sQ0FBZ0I7UUFDdEIsY0FBUyxHQUFULFNBQVMsQ0FBSztRQVYzQixtQkFBYyxHQUFHLEtBQUssQ0FBQztRQUN2QixpQkFBWSxHQUFH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d0RBQTBCOzs7SUFwQjNDLGtDQUE2Qjs7SUFDN0Isa0NBQStCOztJQUMvQixtQ0FBOEI7O0lBQzlCLHVDQUFrQzs7SUFDbEMsc0NBQWlDOztJQUNqQyxzQ0FBa0M7O0lBQ2xDLG9DQUE0Qjs7SUFDNUIsa0NBQThCOztJQUM5QixtQ0FBOEI7O0lBQzlCLG9DQUE0Qjs7SUFDNUIscUNBQTZCOztJQUM3QiwyQ0FBbUM7O0lBQ25DLHFDQUE2Qjs7SUFDN0IsbUNBQTJCOztJQUMzQixxQ0FBaUM7O0lBQ2pDLG9DQUE0Qjs7SUFDNUIsdUNBQStCOztJQUMvQixxQ0FBNkI7O0lBQzdCLG1DQUEyQjs7SUFDM0IseUNBQWlDOztJQUNqQywwQ0FBMkM7O0lBRTNDLDRDQUE4Qjs7SUFDOUIsMENBQTRCOzs7OztJQUU1QixvQ0FBb0I7Ozs7O0lBQ3BCLHVDQUF1Qjs7Ozs7SUFDdkIsNENBQStCOzs7OztJQUduQixxQ0FBK0I7Ozs7O0lBQy9CLG9DQUE4Qjs7Ozs7SUFDOUIsdUNBQXNCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQWN0aXZhdGVkUm91dGUgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHsgdG9VVEMgfSBmcm9tICdAZmlyZXN0aXRjaC9kYXRlJztcblxuaW1wb3J0IHsgQWxpYXMsIE1vZGVsIH0gZnJvbSAndHNtb2RlbHMnO1xuXG5pbXBvcnQgeyB0YWtlLCB0YWtlVW50aWwgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBpc09ic2VydmFibGUgfSBmcm9tICdyeGpzL2ludGVybmFsL3V0aWwvaXNPYnNlcnZhYmxlJztcblxuaW1wb3J0IHsgaXNGdW5jdGlvbiwgaXNPYmplY3QsIHRvU3RyaW5nLCBjbG9uZSB9IGZyb20gJ2xvZGFzaC1lcyc7XG5pbXBvcnQgeyBpc0RhdGUsIGlzVmFsaWQsIHBhcnNlIH0gZnJvbSAnZGF0ZS1mbnMnO1xuXG5pbXBvcnQgeyBGc0ZpbHRlckNvbmZpZyB9IGZyb20gJy4vZmlsdGVyLWNvbmZpZyc7XG5pbXBvcnQgeyBJRmlsdGVyQ29uZmlnSXRlbSB9IGZyb20gJy4uL2ludGVyZmFjZXMvaXRlbS1jb25maWcuaW50ZXJmYWNlJztcblxuXG5leHBvcnQgZW51bSBJdGVtVHlwZSB7XG4gIFRleHQgICAgICAgICAgICA9ICd0ZXh0JyxcbiAgU2VsZWN0ICAgICAgICAgID0gJ3NlbGVjdCcsXG4gIFJhbmdlICAgICAgICAgICA9ICdyYW5nZScsXG4gIERhdGUgICAgICAgICAgICA9ICdkYXRlJyxcbiAgRGF0ZVRpbWUgICAgICAgID0gJ2RhdGV0aW1lJyxcbiAgRGF0ZVJhbmdlICAgICAgID0gJ2RhdGVyYW5nZScsXG4gIERhdGVUaW1lUmFuZ2UgICA9ICdkYXRldGltZXJhbmdlJyxcbiAgQXV0b0NvbXBsZXRlICAgID0gJ2F1dG9jb21wbGV0ZScsXG4gIEF1dG9Db21wbGV0ZUNoaXBzID0gJ2F1dG9jb21wbGV0ZWNoaXBzJyxcbiAgQ2hlY2tib3ggICAgICAgID0gJ2NoZWNrYm94JyxcbiAgQ2hpcHMgICAgICAgICAgID0gJ2NoaXBzJyxcbn1cblxuZXhwb3J0IGNsYXNzIEZzRmlsdGVyQ29uZmlnSXRlbSBleHRlbmRzIE1vZGVsIHtcblxuICBAQWxpYXMoKSBwdWJsaWMgbmFtZTogc3RyaW5nO1xuICBAQWxpYXMoKSBwdWJsaWMgdHlwZTogSXRlbVR5cGU7XG4gIEBBbGlhcygpIHB1YmxpYyBsYWJlbDogc3RyaW5nO1xuICBAQWxpYXMoKSBwdWJsaWMgY2hpcExhYmVsOiBzdHJpbmc7XG4gIEBBbGlhcygpIHB1YmxpYyBjaGlsZHJlbjogc3RyaW5nO1xuICBAQWxpYXMoKSBwdWJsaWMgbXVsdGlwbGU6IGJvb2xlYW47XG4gIEBBbGlhcygpIHB1YmxpYyBncm91cHM6IGFueTtcbiAgQEFsaWFzKCkgcHVibGljIHdhaXQ6IGJvb2xlYW47XG4gIEBBbGlhcygpIHB1YmxpYyBxdWVyeTogc3RyaW5nO1xuICBAQWxpYXMoKSBwdWJsaWMgdmFsdWVzOiBhbnk7XG4gIEBBbGlhcygpIHB1YmxpYyB2YWx1ZXMkOiBhbnk7XG4gIEBBbGlhcygpIHB1YmxpYyBzZWxlY3RlZFZhbHVlOiBhbnk7XG4gIEBBbGlhcygpIHB1YmxpYyBpc29sYXRlOiBhbnk7XG4gIEBBbGlhcygpIHB1YmxpYyBuYW1lczogYW55O1xuICBAQWxpYXMoKSBwdWJsaWMgcHJpbWFyeTogYm9vbGVhbjtcbiAgQEFsaWFzKCkgcHVibGljIHNlYXJjaDogYW55O1xuICBAQWxpYXMoKSBwdWJsaWMgdW5jaGVja2VkOiBhbnk7XG4gIEBBbGlhcygpIHB1YmxpYyBjaGVja2VkOiBhbnk7XG4gIEBBbGlhcygpIHB1YmxpYyBhbGlhczogYW55O1xuICBAQWxpYXMoKSBwdWJsaWMgcGxhY2Vob2xkZXI6IGFueTtcbiAgQEFsaWFzKCdkZWZhdWx0JykgcHVibGljIGRlZmF1bHRWYWx1ZTogYW55O1xuXG4gIHB1YmxpYyBpbml0aWFsTG9hZGluZyA9IGZhbHNlO1xuICBwdWJsaWMgdmFsdWVDaGFuZ2VkID0gZmFsc2U7XG5cbiAgcHJpdmF0ZSBfbW9kZWw6IGFueTtcbiAgcHJpdmF0ZSBfdG1wTW9kZWw6IGFueTtcbiAgcHJpdmF0ZSBfcGVuZGluZ1ZhbHVlcyA9IGZhbHNlO1xuXG4gIGNvbnN0cnVjdG9yKGRhdGE6IElGaWx0ZXJDb25maWdJdGVtIHwgYW55ID0ge30sXG4gICAgICAgICAgICAgIHByaXZhdGUgX2NvbmZpZzogRnNGaWx0ZXJDb25maWcsXG4gICAgICAgICAgICAgIHByaXZhdGUgX3JvdXRlOiBBY3RpdmF0ZWRSb3V0ZSxcbiAgICAgICAgICAgICAgcHJpdmF0ZSBfcGVyc2lzdHM6IGFueSkge1xuICAgIHN1cGVyKCk7XG5cbiAgICB0aGlzLl9mcm9tSlNPTihkYXRhKTtcbiAgfVxuXG4gIGdldCBoYXNQZW5kaW5nVmFsdWVzKCkge1xuICAgIHJldHVybiB0aGlzLl9wZW5kaW5nVmFsdWVzO1xuICB9XG5cbiAgZ2V0IG1vZGVsKCkge1xuICAgIHJldHVybiB0aGlzLl9tb2RlbDtcbiAgfVxuXG4gIHNldCBtb2RlbCh2YWwpIHtcbiAgICB0aGlzLl9tb2RlbCA9IHZhbDtcbiAgICB0aGlzLl90bXBNb2RlbCA9IHZhbDtcbiAgICB0aGlzLmNoZWNrSWZWYWx1ZUNoYW5nZWQoKTtcbiAgfVxuXG4gIGdldCB0bXBNb2RlbCgpIHtcbiAgICByZXR1cm4gdGhpcy5fdG1wTW9kZWw7XG4gIH1cblxuICBzZXQgdG1wTW9kZWwodmFsKSB7XG4gICAgdGhpcy5fdG1wTW9kZWwgPSB2YWw7XG4gIH1cblxuICBwdWJsaWMgX2Zyb21KU09OKGRhdGEpIHtcbiAgICBzdXBlci5fZnJvbUpTT04oZGF0YSk7XG5cbiAgICBpZiAodGhpcy5uYW1lICYmIGlzT2JqZWN0KHRoaXMubmFtZSkpIHtcbiAgICAgIHRoaXMubmFtZXMgPSB0aGlzLm5hbWU7XG4gICAgICB0aGlzLm5hbWUgPSBPYmplY3Qua2V5cyh0aGlzLm5hbWVzKS5qb2luKCctJyk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX2NvbmZpZy5wZXJzaXN0KSB7XG4gICAgICBjb25zdCBwZXJzaXN0ZWQgPSB0aGlzLl9wZXJzaXN0c1t0aGlzLl9jb25maWcucGVyc2lzdC5uYW1lXS5kYXRhO1xuXG4gICAgICBpZiAocGVyc2lzdGVkW3RoaXMubmFtZV0pIHtcblxuICAgICAgICBsZXQgdmFsdWUgPSBwZXJzaXN0ZWRbdGhpcy5uYW1lXTtcblxuICAgICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgICBpZiAodGhpcy50eXBlID09PSBJdGVtVHlwZS5EYXRlUmFuZ2UgfHwgdGhpcy50eXBlID09PSBJdGVtVHlwZS5EYXRlVGltZVJhbmdlKSB7XG4gICAgICAgICAgICB2YWx1ZS5mcm9tID0gdmFsdWUuZnJvbSA/IHRvVVRDKHZhbHVlLmZyb20pIDogbnVsbDtcbiAgICAgICAgICAgIHZhbHVlLnRvID0gdmFsdWUudG8gPyB0b1VUQyh2YWx1ZS50bykgOiBudWxsO1xuXG4gICAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICAgIHRoaXMudHlwZSA9PT0gSXRlbVR5cGUuRGF0ZSB8fFxuICAgICAgICAgICAgdGhpcy50eXBlID09PSBJdGVtVHlwZS5EYXRlVGltZVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgaWYgKCFpc0RhdGUodmFsdWUpIHx8ICFpc1ZhbGlkKHZhbHVlKSkge1xuICAgICAgICAgICAgICB2YWx1ZSA9IHBhcnNlKHZhbHVlLCAneXl5eS1NTS1kZFxcJ1RcXCdISDptbTpzc3h4eHh4JywgbmV3IERhdGUoKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICAgIHRoaXMudHlwZSA9PT0gSXRlbVR5cGUuQ2hlY2tib3ggJiYgdGhpcy5jaGVja2VkICE9PSB1bmRlZmluZWRcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIHZhbHVlID0gdmFsdWUgPT0gdGhpcy5jaGVja2VkO1xuICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy50eXBlID09PSBJdGVtVHlwZS5TZWxlY3QgJiYgdGhpcy5tdWx0aXBsZSkge1xuICAgICAgICAgICAgdmFsdWUgPSBjbG9uZSh2YWx1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5tb2RlbCA9IHZhbHVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuYXBwbHlEYXRhRnJvbVF1ZXJ5KCk7XG5cbiAgICBpZiAoaXNGdW5jdGlvbihkYXRhLnZhbHVlcykgJiZcbiAgICAgIHRoaXMudHlwZSAhPT0gSXRlbVR5cGUuQXV0b0NvbXBsZXRlICYmXG4gICAgICB0aGlzLnR5cGUgIT09IEl0ZW1UeXBlLkF1dG9Db21wbGV0ZUNoaXBzKSB7XG4gICAgICB0aGlzLnZhbHVlcyA9IGRhdGEudmFsdWVzKCk7XG5cbiAgICAgIGlmIChpc09ic2VydmFibGUodGhpcy52YWx1ZXMpKSB7XG4gICAgICAgIHRoaXMuX3BlbmRpbmdWYWx1ZXMgPSB0cnVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgdmFsdWVzID0gQXJyYXkuaXNBcnJheSh0aGlzLnZhbHVlcykgPyAodGhpcy52YWx1ZXMgYXMgYW55KS5zbGljZSgpIDogdGhpcy52YWx1ZXM7XG4gICAgICAgIHRoaXMuc2FuaXRpemVJdGVtKHZhbHVlcyk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHZhbHVlcyA9IEFycmF5LmlzQXJyYXkoZGF0YS52YWx1ZXMpID8gZGF0YS52YWx1ZXMuc2xpY2UoKSA6IGRhdGEudmFsdWVzO1xuICAgICAgdGhpcy5zYW5pdGl6ZUl0ZW0odmFsdWVzKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgc2FuaXRpemVJdGVtKHZhbHVlcykge1xuICAgIHN3aXRjaCAodGhpcy50eXBlKSB7XG4gICAgICBjYXNlIEl0ZW1UeXBlLlRleHQ6IHtcbiAgICAgICAgLy8/Pz8/P1xuICAgICAgfWJyZWFrO1xuICAgICAgY2FzZSBJdGVtVHlwZS5TZWxlY3Q6IHtcbiAgICAgICAgdGhpcy5zYW5pdGl6ZVNlbGVjdEl0ZW0odmFsdWVzKVxuICAgICAgfSBicmVhaztcbiAgICAgIGNhc2UgSXRlbVR5cGUuQ2hpcHM6IHtcbiAgICAgICAgdGhpcy5zYW5pdGl6ZUNoaXBzSXRlbSh2YWx1ZXMpXG4gICAgICB9IGJyZWFrO1xuICAgICAgY2FzZSBJdGVtVHlwZS5SYW5nZToge1xuICAgICAgICB0aGlzLnNhbml0aXplUmFuZ2UoKTtcbiAgICAgIH0gYnJlYWs7XG4gICAgICBjYXNlIEl0ZW1UeXBlLkNoZWNrYm94OiB7XG4gICAgICAgIHRoaXMuc2FuaXRpemVDaGVja2JveCgpO1xuICAgICAgfSBicmVhaztcbiAgICB9XG5cbiAgICBpZiAodGhpcy5tb2RlbCA9PT0gdW5kZWZpbmVkKSB7XG5cbiAgICAgIGlmICh0aGlzLnR5cGUgPT0gJ2NoZWNrYm94Jykge1xuICAgICAgICB0aGlzLm1vZGVsID0gdGhpcy5jaGVja2VkID09IHRoaXMuZGVmYXVsdFZhbHVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5tb2RlbCA9IHRoaXMuZGVmYXVsdFZhbHVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0aGlzLm1vZGVsID09PSB1bmRlZmluZWQpIHtcblxuICAgICAgaWYgKHRoaXMudHlwZSA9PSAnY2hlY2tib3gnKSB7XG4gICAgICAgIHRoaXMubW9kZWwgPSBmYWxzZTtcblxuICAgICAgfSBlbHNlIGlmICh0aGlzLnR5cGUgPT0gJ3NlbGVjdCcpIHtcblxuICAgICAgICBpZiAodGhpcy5tdWx0aXBsZSkge1xuICAgICAgICAgIGlmICghQXJyYXkuaXNBcnJheSh0aGlzLmRlZmF1bHRWYWx1ZSkpIHtcbiAgICAgICAgICAgIHRoaXMubW9kZWwgPSBbXTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKHRoaXMuZGVmYXVsdFZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRoaXMubW9kZWwgPSAnX19hbGwnO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmICh0aGlzLnR5cGUgPT0gSXRlbVR5cGUuQXV0b0NvbXBsZXRlQ2hpcHMgfHwgdGhpcy50eXBlID09IEl0ZW1UeXBlLkNoaXBzKSB7XG4gICAgICAgIHRoaXMubW9kZWwgPSBbXTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwdWJsaWMgc2FuaXRpemVTZWxlY3RJdGVtKHZhbHVlcykge1xuICAgIHRoaXMudmFsdWVzID0gdmFsdWVzO1xuICAgIHRoaXMuZ3JvdXBzID0gbnVsbDtcblxuICAgIC8vIGxldCBkYXRhID0gW107XG5cbiAgICAvLyBpZiAodGhpcy5uZXN0ZWQpIHtcbiAgICAvLyAgIC8vIGdlbmVyYXRlIGEgbGlzdCBvZiB2YWx1ZXMgZnJvbSBvYmplY3RzIHRoYXQgaGF2ZSBub3QgYmVlbiBuZXN0ZWQuXG4gICAgLy8gICBpZiAoIXRoaXMubXVsdGlwbGUpIHtcbiAgICAvLyAgICAgZGF0YS5wdXNoKHt2YWx1ZTogJ19fYWxsJywgbmFtZTogJ0FsbCcsIGRlcHRoOiAwfSk7XG4gICAgLy8gICB9XG4gICAgLy9cbiAgICAvLyAgIEFycmF5LnByb3RvdHlwZS5wdXNoLmFwcGx5KGRhdGEsIHRoaXMud2Fsa1NlbGVjdE5lc3RlZFZhbHVlcyhmaWx0ZXIsIG51bGwsIHRoaXMudmFsdWVzKSk7XG4gICAgLy8gfSBlbHNlIHtcbiAgICAvL1xuICAgIC8vICAgZGF0YSA9IHRoaXMud2Fsa1NlbGVjdFZhbHVlcyhmaWx0ZXIsIHRoaXMudmFsdWVzKTtcbiAgICAvLyB9XG5cbiAgICAvLyB0aGlzLnZhbHVlcyA9IGRhdGE7XG5cbiAgICBpZiAodGhpcy5pc29sYXRlKSB7XG4gICAgICBmb3IgKGNvbnN0IGluZGV4IGluIHRoaXMudmFsdWVzKSB7XG4gICAgICAgIGlmICh0aGlzLnZhbHVlcy5oYXNPd25Qcm9wZXJ0eShpbmRleCkpIHtcbiAgICAgICAgICBpZiAoIXRoaXMudmFsdWVzW2luZGV4XSkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHRoaXMudmFsdWVzW2luZGV4XS52YWx1ZSA9P