@catull/igniteui-angular
Version:
Ignite UI for Angular is a dependency-free Angular toolkit for building modern web apps
240 lines • 28.7 kB
JavaScript
import { __decorate } from "tslib";
import { Injectable } from '@angular/core';
import * as i0 from "@angular/core";
/** @hidden */
var IgxSelectionAPIService = /** @class */ (function () {
function IgxSelectionAPIService() {
/**
* If primaryKey is defined, then multiple selection is based on the primaryKey, and it is array of numbers, strings, etc.
* If the primaryKey is omitted, then selection is based on the item data
*/
this.selection = new Map();
}
/**
* Get current component selection.
* @param componentID ID of the component.
*/
IgxSelectionAPIService.prototype.get = function (componentID) {
return this.selection.get(componentID);
};
/**
* Set new component selection.
* @param componentID ID of the component.
* @param newSelection The new component selection to be set.
*/
IgxSelectionAPIService.prototype.set = function (componentID, newSelection) {
if (!componentID) {
throw Error('Invalid value for component id!');
}
this.selection.set(componentID, newSelection);
};
/**
* Clears selection for component.
* @param componentID ID of the component.
*/
IgxSelectionAPIService.prototype.clear = function (componentID) {
this.selection.set(componentID, this.get_empty());
};
/**
* Get current component selection length.
* @param componentID ID of the component.
*/
IgxSelectionAPIService.prototype.size = function (componentID) {
var sel = this.get(componentID);
return sel ? sel.size : 0;
};
/**
* Creates new selection that consist of the new item added to the current component selection.
* The returned collection is new Set,
* therefore if you want to update component selection you need to call in addition the set_selection() method
* or instead use the select_item() one.
* @param componentID ID of the component, which we add new item to.
* @param itemID ID of the item to add to component selection.
* @param sel Used internally only by the selection (add_items method) to accumulate selection for multiple items.
*
* @returns Selection after the new item is added.
*/
IgxSelectionAPIService.prototype.add_item = function (componentID, itemID, sel) {
if (!sel) {
sel = new Set(this.get(componentID));
}
if (sel === undefined) {
sel = this.get_empty();
}
if (!itemID && itemID !== 0) {
throw Error('Invalid value for item id!');
}
sel.add(itemID);
return sel;
};
/**
* Creates new selection that consist of the new items added to the current component selection.
* The returned collection is new Set,
* therefore if you want to update component selection you need to call in addition the set_selection() method
* or instead use the select_items() one.
* @param componentID ID of the component, which we add new items to.
* @param itemIDs Array of IDs of the items to add to component selection.
* @param clearSelection If true it will clear previous selection.
*
* @returns Selection after the new items are added.
*/
IgxSelectionAPIService.prototype.add_items = function (componentID, itemIDs, clearSelection) {
var _this = this;
var selection;
if (clearSelection) {
selection = this.get_empty();
}
else if (itemIDs && itemIDs.length === 0) {
selection = new Set(this.get(componentID));
}
itemIDs.forEach(function (item) { return selection = _this.add_item(componentID, item, selection); });
return selection;
};
/**
* Add item to the current component selection.
* @param componentID ID of the component, which we add new item to.
* @param itemID ID of the item to add to component selection.
* @param sel Used internally only by the selection (select_items method) to accumulate selection for multiple items.
*/
IgxSelectionAPIService.prototype.select_item = function (componentID, itemID, sel) {
this.set(componentID, this.add_item(componentID, itemID, sel));
};
/**
* Add items to the current component selection.
* @param componentID ID of the component, which we add new items to.
* @param itemIDs Array of IDs of the items to add to component selection.
* @param clearSelection If true it will clear previous selection.
*/
IgxSelectionAPIService.prototype.select_items = function (componentID, itemID, clearSelection) {
this.set(componentID, this.add_items(componentID, itemID, clearSelection));
};
/**
* Creates new selection that consist of the new items excluded from the current component selection.
* The returned collection is new Set,
* therefore if you want to update component selection you need to call in addition the set_selection() method
* or instead use the deselect_item() one.
* @param componentID ID of the component, which we remove items from.
* @param itemID ID of the item to remove from component selection.
* @param sel Used internally only by the selection (delete_items method) to accumulate deselected items.
*
* @returns Selection after the item is removed.
*/
IgxSelectionAPIService.prototype.delete_item = function (componentID, itemID, sel) {
if (!sel) {
sel = new Set(this.get(componentID));
}
if (sel === undefined) {
return;
}
sel.delete(itemID);
return sel;
};
/**
* Creates new selection that consist of the new items removed to the current component selection.
* The returned collection is new Set,
* therefore if you want to update component selection you need to call in addition the set_selection() method
* or instead use the deselect_items() one.
* @param componentID ID of the component, which we remove items from.
* @param itemID ID of the items to remove from component selection.
*
* @returns Selection after the items are removed.
*/
IgxSelectionAPIService.prototype.delete_items = function (componentID, itemIDs) {
var _this = this;
var selection;
itemIDs.forEach(function (deselectedItem) { return selection = _this.delete_item(componentID, deselectedItem, selection); });
return selection;
};
/**
* Remove item from the current component selection.
* @param componentID ID of the component, which we remove item from.
* @param itemID ID of the item to remove from component selection.
* @param sel Used internally only by the selection (deselect_items method) to accumulate selection for multiple items.
*/
IgxSelectionAPIService.prototype.deselect_item = function (componentID, itemID, sel) {
this.set(componentID, this.delete_item(componentID, itemID, sel));
};
/**
* Remove items to the current component selection.
* @param componentID ID of the component, which we add new items to.
* @param itemIDs Array of IDs of the items to add to component selection.
*/
IgxSelectionAPIService.prototype.deselect_items = function (componentID, itemID, clearSelection) {
this.set(componentID, this.delete_items(componentID, itemID));
};
/**
* Check if the item is selected in the component selection.
* @param componentID ID of the component.
* @param itemID ID of the item to search.
*
* @returns If item is selected.
*/
IgxSelectionAPIService.prototype.is_item_selected = function (componentID, itemID) {
var sel = this.get(componentID);
if (!sel) {
return false;
}
return sel.has(itemID);
};
/**
* Get first element in the selection.
* This is correct when we have only one item in the collection (for single selection purposes)
* and the method returns that item.
* @param componentID ID of the component.
*
* @returns First element in the set.
*/
IgxSelectionAPIService.prototype.first_item = function (componentID) {
var sel = this.get(componentID);
if (sel && sel.size > 0) {
return sel.values().next().value;
}
};
/**
* Returns whether all items are selected.
* @param componentID ID of the component.
* @param dataCount: number Number of items in the data.
*
* @returns If all items are selected.
*/
IgxSelectionAPIService.prototype.are_all_selected = function (componentID, dataCount) {
return dataCount > 0 && dataCount === this.size(componentID);
};
/**
* Returns whether any of the items is selected.
* @param componentID ID of the component.
* @param data Entire data array.
*
* @returns If there is any item selected.
*/
IgxSelectionAPIService.prototype.are_none_selected = function (componentID) {
return this.size(componentID) === 0;
};
/**
* Get all primary key values from a data array. If there isn't a primary key defined that the entire data is returned instead.
* @param data Entire data array.
* @param primaryKey Data primary key.
*
* @returns Array of identifiers, either primary key values or the entire data array.
*/
IgxSelectionAPIService.prototype.get_all_ids = function (data, primaryKey) {
// If primaryKey is 0, this should still map to the property
return primaryKey !== undefined && primaryKey !== null ? data.map(function (x) { return x[primaryKey]; }) : data;
};
/**
* Returns empty selection collection.
* @returns empty set.
*/
IgxSelectionAPIService.prototype.get_empty = function () {
return new Set();
};
IgxSelectionAPIService.ɵprov = i0.ɵɵdefineInjectable({ factory: function IgxSelectionAPIService_Factory() { return new IgxSelectionAPIService(); }, token: IgxSelectionAPIService, providedIn: "root" });
IgxSelectionAPIService = __decorate([
Injectable({
providedIn: 'root',
})
], IgxSelectionAPIService);
return IgxSelectionAPIService;
}());
export { IgxSelectionAPIService };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VsZWN0aW9uLmpzIiwic291cmNlUm9vdCI6Im5nOi8vaWduaXRldWktYW5ndWxhci8iLCJzb3VyY2VzIjpbImxpYi9jb3JlL3NlbGVjdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQzs7QUFFM0MsY0FBYztBQUlkO0lBQUE7UUFDSTs7O1dBR0c7UUFDTyxjQUFTLEdBQTJCLElBQUksR0FBRyxFQUFvQixDQUFDO0tBME83RTtJQXhPRzs7O09BR0c7SUFDSSxvQ0FBRyxHQUFWLFVBQVcsV0FBbUI7UUFDMUIsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUMzQyxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNJLG9DQUFHLEdBQVYsVUFBVyxXQUFtQixFQUFFLFlBQXNCO1FBQ2xELElBQUksQ0FBQyxXQUFXLEVBQUU7WUFDZCxNQUFNLEtBQUssQ0FBQyxpQ0FBaUMsQ0FBQyxDQUFDO1NBQ2xEO1FBQ0QsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsV0FBVyxFQUFFLFlBQVksQ0FBQyxDQUFDO0lBQ2xELENBQUM7SUFFRDs7O09BR0c7SUFDSSxzQ0FBSyxHQUFaLFVBQWEsV0FBbUI7UUFDNUIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDO0lBQ3RELENBQUM7SUFFRDs7O09BR0c7SUFDSSxxQ0FBSSxHQUFYLFVBQVksV0FBbUI7UUFDM0IsSUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUNsQyxPQUFPLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzlCLENBQUM7SUFFRDs7Ozs7Ozs7OztPQVVHO0lBQ0kseUNBQVEsR0FBZixVQUFnQixXQUFtQixF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QUFLLENBQUMsQ0FBQztJQUN4QyxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0ksNENBQVcsR0FBbEIsVUFBbUIsSUFBSSxFQUFFLFVBQVc7UUFDaEMsNERBQTREO1FBQzVELE9BQU8sVUFBVSxLQUFLLFNBQVMsSUFBSSxVQUFVLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFVBQUMsQ0FBQyxJQUFLLE9BQUEsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxFQUFiLENBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7SUFDbkcsQ0FBQztJQUVEOzs7TUFHRTtJQUNLLDBDQUFTLEdBQWhCO1FBQ0ksT0FBTyxJQUFJLEdBQUcsRUFBRSxDQUFDO0lBQ3JCLENBQUM7O0lBOU9RLHNCQUFzQjtRQUhsQyxVQUFVLENBQUM7WUFDUixVQUFVLEVBQUUsTUFBTTtTQUNyQixDQUFDO09BQ1csc0JBQXNCLENBK09sQztpQ0FyUEQ7Q0FxUEMsQUEvT0QsSUErT0M7U0EvT1ksc0JBQXNCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG4vKiogQGhpZGRlbiAqL1xuQEluamVjdGFibGUoe1xuICAgIHByb3ZpZGVkSW46ICdyb290Jyxcbn0pXG5leHBvcnQgY2xhc3MgSWd4U2VsZWN0aW9uQVBJU2VydmljZSB7XG4gICAgLyoqXG4gICAgICogSWYgcHJpbWFyeUtleSBpcyBkZWZpbmVkLCB0aGVuIG11bHRpcGxlIHNlbGVjdGlvbiBpcyBiYXNlZCBvbiB0aGUgcHJpbWFyeUtleSwgYW5kIGl0IGlzIGFycmF5IG9mIG51bWJlcnMsIHN0cmluZ3MsIGV0Yy5cbiAgICAgKiBJZiB0aGUgcHJpbWFyeUtleSBpcyBvbWl0dGVkLCB0aGVuIHNlbGVjdGlvbiBpcyBiYXNlZCBvbiB0aGUgaXRlbSBkYXRhXG4gICAgICovXG4gICAgcHJvdGVjdGVkIHNlbGVjdGlvbjogTWFwPHN0cmluZywgIFNldDxhbnk+PiA9IG5ldyBNYXA8c3RyaW5nLCBTZXQ8YW55Pj4oKTtcblxuICAgIC8qKlxuICAgICAqIEdldCBjdXJyZW50IGNvbXBvbmVudCBzZWxlY3Rpb24uXG4gICAgICogQHBhcmFtIGNvbXBvbmVudElEIElEIG9mIHRoZSBjb21wb25lbnQuXG4gICAgICovXG4gICAgcHVibGljIGdldChjb21wb25lbnRJRDogc3RyaW5nKTogU2V0PGFueT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5zZWxlY3Rpb24uZ2V0KGNvbXBvbmVudElEKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXQgbmV3IGNvbXBvbmVudCBzZWxlY3Rpb24uXG4gICAgICogQHBhcmFtIGNvbXBvbmVudElEIElEIG9mIHRoZSBjb21wb25lbnQuXG4gICAgICogQHBhcmFtIG5ld1NlbGVjdGlvbiBUaGUgbmV3IGNvbXBvbmVudCBzZWxlY3Rpb24gdG8gYmUgc2V0LlxuICAgICAqL1xuICAgIHB1YmxpYyBzZXQoY29tcG9uZW50SUQ6IHN0cmluZywgbmV3U2VsZWN0aW9uOiBTZXQ8YW55Pikge1xuICAgICAgICBpZiAoIWNvbXBvbmVudElEKSB7XG4gICAgICAgICAgICB0aHJvdyBFcnJvcignSW52YWxpZCB2YWx1ZSBmb3IgY29tcG9uZW50IGlkIScpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc2VsZWN0aW9uLnNldChjb21wb25lbnRJRCwgbmV3U2VsZWN0aW9uKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDbGVhcnMgc2VsZWN0aW9uIGZvciBjb21wb25lbnQuXG4gICAgICogQHBhcmFtIGNvbXBvbmVudElEIElEIG9mIHRoZSBjb21wb25lbnQuXG4gICAgICovXG4gICAgcHVibGljIGNsZWFyKGNvbXBvbmVudElEOiBzdHJpbmcpIHtcbiAgICAgICAgdGhpcy5zZWxlY3Rpb24uc2V0KGNvbXBvbmVudElELCB0aGlzLmdldF9lbXB0eSgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgY3VycmVudCBjb21wb25lbnQgc2VsZWN0aW9uIGxlbmd0aC5cbiAgICAgKiBAcGFyYW0gY29tcG9uZW50SUQgSUQgb2YgdGhlIGNvbXBvbmVudC5cbiAgICAgKi9cbiAgICBwdWJsaWMgc2l6ZShjb21wb25lbnRJRDogc3RyaW5nKTogbnVtYmVyIHtcbiAgICAgICAgY29uc3Qgc2VsID0gdGhpcy5nZXQoY29tcG9uZW50SUQpO1xuICAgICAgICByZXR1cm4gc2VsID8gc2VsLnNpemUgOiAwO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgbmV3IHNlbGVjdGlvbiB0aGF0IGNvbnNpc3Qgb2YgdGhlIG5ldyBpdGVtIGFkZGVkIHRvIHRoZSBjdXJyZW50IGNvbXBvbmVudCBzZWxlY3Rpb24uXG4gICAgICogVGhlIHJldHVybmVkIGNvbGxlY3Rpb24gaXMgbmV3IFNldCxcbiAgICAgKiB0aGVyZWZvcmUgaWYgeW91IHdhbnQgdG8gdXBkYXRlIGNvbXBvbmVudCBzZWxlY3Rpb24geW91IG5lZWQgdG8gY2FsbCBpbiBhZGRpdGlvbiB0aGUgc2V0X3NlbGVjdGlvbigpIG1ldGhvZFxuICAgICAqIG9yIGluc3RlYWQgdXNlIHRoZSBzZWxlY3RfaXRlbSgpIG9uZS5cbiAgICAgKiBAcGFyYW0gY29tcG9uZW50SUQgSUQgb2YgdGhlIGNvbXBvbmVudCwgd2hpY2ggd2UgYWRkIG5ldyBpdGVtIHRvLlxuICAgICAqIEBwYXJhbSBpdGVtSUQgSUQgb2YgdGhlIGl0ZW0gdG8gYWRkIHRvIGNvbXBvbmVudCBzZWxlY3Rpb24uXG4gICAgICogQHBhcmFtIHNlbCBVc2VkIGludGVybmFsbHkgb25seSBieSB0aGUgc2VsZWN0aW9uIChhZGRfaXRlbXMgbWV0aG9kKSB0byBhY2N1bXVsYXRlIHNlbGVjdGlvbiBmb3IgbXVsdGlwbGUgaXRlbXMuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBTZWxlY3Rpb24gYWZ0ZXIgdGhlIG5ldyBpdGVtIGlzIGFkZGVkLlxuICAgICAqL1xuICAgIHB1YmxpYyBhZGRfaXRlbShjb21wb25lbnRJRDogc3RyaW5nLCBpdGVtSUQsIHNlbD86IFNldDxhbnk+KTogU2V0PGFueT4ge1xuICAgICAgICBpZiAoIXNlbCkge1xuICAgICAgICAgICAgc2VsID0gbmV3IFNldCh0aGlzLmdldChjb21wb25lbnRJRCkpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzZWwgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgc2VsID0gdGhpcy5nZXRfZW1wdHkoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWl0ZW1JRCAmJiBpdGVtSUQgIT09IDApIHtcbiAgICAgICAgICAgIHRocm93IEVycm9yKCdJbnZhbGlkIHZhbHVlIGZvciBpdGVtIGlkIScpO1xuICAgICAgICB9XG4gICAgICAgIHNlbC5hZGQoaXRlbUlEKTtcbiAgICAgICAgcmV0dXJuIHNlbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIG5ldyBzZWxlY3Rpb24gdGhhdCBjb25zaXN0IG9mIHRoZSBuZXcgaXRlbXMgYWRkZWQgdG8gdGhlIGN1cnJlbnQgY29tcG9uZW50IHNlbGVjdGlvbi5cbiAgICAgKiBUaGUgcmV0dXJuZWQgY29sbGVjdGlvbiBpcyBuZXcgU2V0LFxuICAgICAqIHRoZXJlZm9yZSBpZiB5b3Ugd2FudCB0byB1cGRhdGUgY29tcG9uZW50IHNlbGVjdGlvbiB5b3UgbmVlZCB0byBjYWxsIGluIGFkZGl0aW9uIHRoZSBzZXRfc2VsZWN0aW9uKCkgbWV0aG9kXG4gICAgICogb3IgaW5zdGVhZCB1c2UgdGhlIHNlbGVjdF9pdGVtcygpIG9uZS5cbiAgICAgKiBAcGFyYW0gY29tcG9uZW50SUQgSUQgb2YgdGhlIGNvbXBvbmVudCwgd2hpY2ggd2UgYWRkIG5ldyBpdGVtcyB0by5cbiAgICAgKiBAcGFyYW0gaXRlbUlEcyBBcnJheSBvZiBJRHMgb2YgdGhlIGl0ZW1zIHRvIGFkZCB0byBjb21wb25lbnQgc2VsZWN0aW9uLlxuICAgICAqIEBwYXJhbSBjbGVhclNlbGVjdGlvbiBJZiB0cnVlIGl0IHdpbGwgY2xlYXIgcHJldmlvdXMgc2VsZWN0aW9uLlxuICAgICAqXG4gICAgICogQHJldHVybnMgU2VsZWN0aW9uIGFmdGVyIHRoZSBuZXcgaXRlbXMgYXJlIGFkZGVkLlxuICAgICAqL1xuICAgIHB1YmxpYyBhZGRfaXRlbXMoY29tcG9uZW50SUQ6IHN0cmluZywgaXRlbUlEczogYW55W10sIGNsZWFyU2VsZWN0aW9uPzogYm9vbGVhbik6IFNldDxhbnk+IHtcbiAgICAgICAgbGV0IHNlbGVjdGlvbjogU2V0PGFueT47XG4gICAgICAgIGlmIChjbGVhclNlbGVjdGlvbikge1xuICAgICAgICAgICAgc2VsZWN0aW9uID0gdGhpcy5nZXRfZW1wdHkoKTtcbiAgICAgICAgfSBlbHNlIGlmIChpdGVtSURzICYmIGl0ZW1JRHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICBzZWxlY3Rpb24gPSBuZXcgU2V0KHRoaXMuZ2V0KGNvbXBvbmVudElEKSk7XG4gICAgICAgIH1cbiAgICAgICAgaXRlbUlEcy5mb3JFYWNoKChpdGVtKSA9PiBzZWxlY3Rpb24gPSB0aGlzLmFkZF9pdGVtKGNvbXBvbmVudElELCBpdGVtLCBzZWxlY3Rpb24pKTtcbiAgICAgICAgcmV0dXJuIHNlbGVjdGlvbjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBZGQgaXRlbSB0byB0aGUgY3VycmVudCBjb21wb25lbnQgc2VsZWN0aW9uLlxuICAgICAqIEBwYXJhbSBjb21wb25lbnRJRCBJRCBvZiB0aGUgY29tcG9uZW50LCB3aGljaCB3ZSBhZGQgbmV3IGl0ZW0gdG8uXG4gICAgICogQHBhcmFtIGl0ZW1JRCBJRCBvZiB0aGUgaXRlbSB0byBhZGQgdG8gY29tcG9uZW50IHNlbGVjdGlvbi5cbiAgICAgKiBAcGFyYW0gc2VsIFVzZWQgaW50ZXJuYWxseSBvbmx5IGJ5IHRoZSBzZWxlY3Rpb24gKHNlbGVjdF9pdGVtcyBtZXRob2QpIHRvIGFjY3VtdWxhdGUgc2VsZWN0aW9uIGZvciBtdWx0aXBsZSBpdGVtcy5cbiAgICAgKi9cbiAgICBwdWJsaWMgc2VsZWN0X2l0ZW0oY29tcG9uZW50SUQ6IHN0cmluZywgaXRlbUlELCBzZWw/OiBTZXQ8YW55Pikge1xuICAgICAgICB0aGlzLnNldChjb21wb25lbnRJRCwgdGhpcy5hZGRfaXRlbShjb21wb25lbnRJRCwgaXRlbUlELCBzZWwpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBZGQgaXRlbXMgdG8gdGhlIGN1cnJlbnQgY29tcG9uZW50IHNlbGVjdGlvbi5cbiAgICAgKiBAcGFyYW0gY29tcG9uZW50SUQgSUQgb2YgdGhlIGNvbXBvbmVudCwgd2hpY2ggd2UgYWRkIG5ldyBpdGVtcyB0by5cbiAgICAgKiBAcGFyYW0gaXRlbUlEcyBBcnJheSBvZiBJRHMgb2YgdGhlIGl0ZW1zIHRvIGFkZCB0byBjb21wb25lbnQgc2VsZWN0aW9uLlxuICAgICAqIEBwYXJhbSBjbGVhclNlbGVjdGlvbiBJZiB0cnVlIGl0IHdpbGwgY2xlYXIgcHJldmlvdXMgc2VsZWN0aW9uLlxuICAgICAqL1xuICAgIHB1YmxpYyBzZWxlY3RfaXRlbXMoY29tcG9uZW50SUQ6IHN0cmluZywgaXRlbUlEOiBhbnlbXSwgY2xlYXJTZWxlY3Rpb24/OiBib29sZWFuKSB7XG4gICAgICAgIHRoaXMuc2V0KGNvbXBvbmVudElELCB0aGlzLmFkZF9pdGVtcyhjb21wb25lbnRJRCwgaXRlbUlELCBjbGVhclNlbGVjdGlvbikpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgbmV3IHNlbGVjdGlvbiB0aGF0IGNvbnNpc3Qgb2YgdGhlIG5ldyBpdGVtcyBleGNsdWRlZCBmcm9tIHRoZSBjdXJyZW50IGNvbXBvbmVudCBzZWxlY3Rpb24uXG4gICAgICogVGhlIHJldHVybmVkIGNvbGxlY3Rpb24gaXMgbmV3IFNldCxcbiAgICAgKiB0aGVyZWZvcmUgaWYgeW91IHdhbnQgdG8gdXBkYXRlIGNvbXBvbmVudCBzZWxlY3Rpb24geW91IG5lZWQgdG8gY2FsbCBpbiBhZGRpdGlvbiB0aGUgc2V0X3NlbGVjdGlvbigpIG1ldGhvZFxuICAgICAqIG9yIGluc3RlYWQgdXNlIHRoZSBkZXNlbGVjdF9pdGVtKCkgb25lLlxuICAgICAqIEBwYXJhbSBjb21wb25lbnRJRCBJRCBvZiB0aGUgY29tcG9uZW50LCB3aGljaCB3ZSByZW1vdmUgaXRlbXMgZnJvbS5cbiAgICAgKiBAcGFyYW0gaXRlbUlEIElEIG9mIHRoZSBpdGVtIHRvIHJlbW92ZSBmcm9tIGNvbXBvbmVudCBzZWxlY3Rpb24uXG4gICAgICogQHBhcmFtIHNlbCBVc2VkIGludGVybmFsbHkgb25seSBieSB0aGUgc2VsZWN0aW9uIChkZWxldGVfaXRlbXMgbWV0aG9kKSB0byBhY2N1bXVsYXRlIGRlc2VsZWN0ZWQgaXRlbXMuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBTZWxlY3Rpb24gYWZ0ZXIgdGhlIGl0ZW0gaXMgcmVtb3ZlZC5cbiAgICAgKi9cbiAgICBwdWJsaWMgZGVsZXRlX2l0ZW0oY29tcG9uZW50SUQ6IHN0cmluZywgaXRlbUlELCBzZWw/OiBTZXQ8YW55Pikge1xuICAgICAgICBpZiAoIXNlbCkge1xuICAgICAgICAgICAgc2VsID0gbmV3IFNldCh0aGlzLmdldChjb21wb25lbnRJRCkpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzZWwgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHNlbC5kZWxldGUoaXRlbUlEKTtcbiAgICAgICAgcmV0dXJuIHNlbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIG5ldyBzZWxlY3Rpb24gdGhhdCBjb25zaXN0IG9mIHRoZSBuZXcgaXRlbXMgcmVtb3ZlZCB0byB0aGUgY3VycmVudCBjb21wb25lbnQgc2VsZWN0aW9uLlxuICAgICAqIFRoZSByZXR1cm5lZCBjb2xsZWN0aW9uIGlzIG5ldyBTZXQsXG4gICAgICogdGhlcmVmb3JlIGlmIHlvdSB3YW50IHRvIHVwZGF0ZSBjb21wb25lbnQgc2VsZWN0aW9uIHlvdSBuZWVkIHRvIGNhbGwgaW4gYWRkaXRpb24gdGhlIHNldF9zZWxlY3Rpb24oKSBtZXRob2RcbiAgICAgKiBvciBpbnN0ZWFkIHVzZSB0aGUgZGVzZWxlY3RfaXRlbXMoKSBvbmUuXG4gICAgICogQHBhcmFtIGNvbXBvbmVudElEIElEIG9mIHRoZSBjb21wb25lbnQsIHdoaWNoIHdlIHJlbW92ZSBpdGVtcyBmcm9tLlxuICAgICAqIEBwYXJhbSBpdGVtSUQgSUQgb2YgdGhlIGl0ZW1zIHRvIHJlbW92ZSBmcm9tIGNvbXBvbmVudCBzZWxlY3Rpb24uXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBTZWxlY3Rpb24gYWZ0ZXIgdGhlIGl0ZW1zIGFyZSByZW1vdmVkLlxuICAgICAqL1xuICAgIHB1YmxpYyBkZWxldGVfaXRlbXMoY29tcG9uZW50SUQ6IHN0cmluZywgaXRlbUlEczogYW55W10pOiBTZXQ8YW55PiB7XG4gICAgICAgIGxldCBzZWxlY3Rpb246IFNldDxhbnk+O1xuICAgICAgICBpdGVtSURzLmZvckVhY2goKGRlc2VsZWN0ZWRJdGVtKSA9PiBzZWxlY3Rpb24gPSB0aGlzLmRlbGV0ZV9pdGVtKGNvbXBvbmVudElELCBkZXNlbGVjdGVkSXRlbSwgc2VsZWN0aW9uKSk7XG4gICAgICAgIHJldHVybiBzZWxlY3Rpb247XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlIGl0ZW0gZnJvbSB0aGUgY3VycmVudCBjb21wb25lbnQgc2VsZWN0aW9uLlxuICAgICAqIEBwYXJhbSBjb21wb25lbnRJRCBJRCBvZiB0aGUgY29tcG9uZW50LCB3aGljaCB3ZSByZW1vdmUgaXRlbSBmcm9tLlxuICAgICAqIEBwYXJhbSBpdGVtSUQgSUQgb2YgdGhlIGl0ZW0gdG8gcmVtb3ZlIGZyb20gY29tcG9uZW50IHNlbGVjdGlvbi5cbiAgICAgKiBAcGFyYW0gc2VsIFVzZWQgaW50ZXJuYWxseSBvbmx5IGJ5IHRoZSBzZWxlY3Rpb24gKGRlc2VsZWN0X2l0ZW1zIG1ldGhvZCkgdG8gYWNjdW11bGF0ZSBzZWxlY3Rpb24gZm9yIG11bHRpcGxlIGl0ZW1zLlxuICAgICAqL1xuICAgIHB1YmxpYyBkZXNlbGVjdF9pdGVtKGNvbXBvbmVudElEOiBzdHJpbmcsIGl0ZW1JRCwgc2VsPzogU2V0PGFueT4pIHtcbiAgICAgICAgdGhpcy5zZXQoY29tcG9uZW50SUQsIHRoaXMuZGVsZXRlX2l0ZW0oY29tcG9uZW50SUQsIGl0ZW1JRCwgc2VsKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlIGl0ZW1zIHRvIHRoZSBjdXJyZW50IGNvbXBvbmVudCBzZWxlY3Rpb24uXG4gICAgICogQHBhcmFtIGNvbXBvbmVudElEIElEIG9mIHRoZSBjb21wb25lbnQsIHdoaWNoIHdlIGFkZCBuZXcgaXRlbXMgdG8uXG4gICAgICogQHBhcmFtIGl0ZW1JRHMgQXJyYXkgb2YgSURzIG9mIHRoZSBpdGVtcyB0byBhZGQgdG8gY29tcG9uZW50IHNlbGVjdGlvbi5cbiAgICAgKi9cbiAgICBwdWJsaWMgZGVzZWxlY3RfaXRlbXMoY29tcG9uZW50SUQ6IHN0cmluZywgaXRlbUlEOiBhbnlbXSwgY2xlYXJTZWxlY3Rpb24/OiBib29sZWFuKSB7XG4gICAgICAgIHRoaXMuc2V0KGNvbXBvbmVudElELCB0aGlzLmRlbGV0ZV9pdGVtcyhjb21wb25lbnRJRCwgaXRlbUlEKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2sgaWYgdGhlIGl0ZW0gaXMgc2VsZWN0ZWQgaW4gdGhlIGNvbXBvbmVudCBzZWxlY3Rpb24uXG4gICAgICogQHBhcmFtIGNvbXBvbmVudElEIElEIG9mIHRoZSBjb21wb25lbnQuXG4gICAgICogQHBhcmFtIGl0ZW1JRCBJRCBvZiB0aGUgaXRlbSB0byBzZWFyY2guXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBJZiBpdGVtIGlzIHNlbGVjdGVkLlxuICAgICAqL1xuICAgIHB1YmxpYyBpc19pdGVtX3NlbGVjdGVkKGNvbXBvbmVudElEOiBzdHJpbmcsIGl0ZW1JRCk6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCBzZWwgPSB0aGlzLmdldChjb21wb25lbnRJRCk7XG4gICAgICAgIGlmICghc2VsKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHNlbC5oYXMoaXRlbUlEKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgZmlyc3QgZWxlbWVudCBpbiB0aGUgc2VsZWN0aW9uLlxuICAgICAqIFRoaXMgaXMgY29ycmVjdCB3aGVuIHdlIGhhdmUgb25seSBvbmUgaXRlbSBpbiB0aGUgY29sbGVjdGlvbiAoZm9yIHNpbmdsZSBzZWxlY3Rpb24gcHVycG9zZXMpXG4gICAgICogYW5kIHRoZSBtZXRob2QgcmV0dXJucyB0aGF0IGl0ZW0uXG4gICAgICogQHBhcmFtIGNvbXBvbmVudElEIElEIG9mIHRoZSBjb21wb25lbnQuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBGaXJzdCBlbGVtZW50IGluIHRoZSBzZXQuXG4gICAgICovXG4gICAgcHVibGljIGZpcnN0X2l0ZW0oY29tcG9uZW50SUQ6IHN0cmluZykge1xuICAgICAgICBjb25zdCBzZWwgPSB0aGlzLmdldChjb21wb25lbnRJRCk7XG4gICAgICAgIGlmIChzZWwgJiYgc2VsLnNpemUgPiAwKSB7XG4gICAgICAgICAgICByZXR1cm4gc2VsLnZhbHVlcygpLm5leHQoKS52YWx1ZTtcbiAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB3aGV0aGVyIGFsbCBpdGVtcyBhcmUgc2VsZWN0ZWQuXG4gICAgICogQHBhcmFtIGNvbXBvbmVudElEIElEIG9mIHRoZSBjb21wb25lbnQuXG4gICAgICogQHBhcmFtIGRhdGFDb3VudDogbnVtYmVyIE51bWJlciBvZiBpdGVtcyBpbiB0aGUgZGF0YS5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIElmIGFsbCBpdGVtcyBhcmUgc2VsZWN0ZWQuXG4gICAgICovXG4gICAgcHVibGljIGFyZV9hbGxfc2VsZWN0ZWQoY29tcG9uZW50SUQ6IHN0cmluZywgZGF0YUNvdW50OiBudW1iZXIpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIGRhdGFDb3VudCA+IDAgJiYgZGF0YUNvdW50ID09PSB0aGlzLnNpemUoY29tcG9uZW50SUQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgd2hldGhlciBhbnkgb2YgdGhlIGl0ZW1zIGlzIHNlbGVjdGVkLlxuICAgICAqIEBwYXJhbSBjb21wb25lbnRJRCBJRCBvZiB0aGUgY29tcG9uZW50LlxuICAgICAqIEBwYXJhbSBkYXRhIEVudGlyZSBkYXRhIGFycmF5LlxuICAgICAqXG4gICAgICogQHJldHVybnMgSWYgdGhlcmUgaXMgYW55IGl0ZW0gc2VsZWN0ZWQuXG4gICAgICovXG4gICAgcHVibGljIGFyZV9ub25lX3NlbGVjdGVkKGNvbXBvbmVudElEOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2l6ZShjb21wb25lbnRJRCkgPT09IDA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IGFsbCBwcmltYXJ5IGtleSB2YWx1ZXMgZnJvbSBhIGRhdGEgYXJyYXkuIElmIHRoZXJlIGlzbid0IGEgcHJpbWFyeSBrZXkgZGVmaW5lZCB0aGF0IHRoZSBlbnRpcmUgZGF0YSBpcyByZXR1cm5lZCBpbnN0ZWFkLlxuICAgICAqIEBwYXJhbSBkYXRhIEVudGlyZSBkYXRhIGFycmF5LlxuICAgICAqIEBwYXJhbSBwcmltYXJ5S2V5IERhdGEgcHJpbWFyeSBrZXkuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBBcnJheSBvZiBpZGVudGlmaWVycywgZWl0aGVyIHByaW1hcnkga2V5IHZhbHVlcyBvciB0aGUgZW50aXJlIGRhdGEgYXJyYXkuXG4gICAgICovXG4gICAgcHVibGljIGdldF9hbGxfaWRzKGRhdGEsIHByaW1hcnlLZXk/KSB7XG4gICAgICAgIC8vIElmIHByaW1hcnlLZXkgaXMgMCwgdGhpcyBzaG91bGQgc3RpbGwgbWFwIHRvIHRoZSBwcm9wZXJ0eVxuICAgICAgICByZXR1cm4gcHJpbWFyeUtleSAhPT0gdW5kZWZpbmVkICYmIHByaW1hcnlLZXkgIT09IG51bGwgPyBkYXRhLm1hcCgoeCkgPT4geFtwcmltYXJ5S2V5XSkgOiBkYXRhO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgZW1wdHkgc2VsZWN0aW9uIGNvbGxlY3Rpb24uXG4gICAgICogQHJldHVybnMgZW1wdHkgc2V0LlxuICAgICovXG4gICAgcHVibGljIGdldF9lbXB0eSgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBTZXQoKTtcbiAgICB9XG59XG4iXX0=